diff --git a/src/p_mach.cpp b/src/p_mach.cpp index 59a32622..9397ec65 100644 --- a/src/p_mach.cpp +++ b/src/p_mach.cpp @@ -67,6 +67,8 @@ static const static const #include "stub/powerpc-darwin.macho-fold.h" static const +#include "stub/powerpc-darwin.macho-upxmain.h" +static const #include "stub/powerpc-darwin.dylib-entry.h" static const @@ -110,6 +112,7 @@ PackMachBase::PackMachBase(InputFile *f, unsigned cputype, unsigned filetype, memset(&cmdUUID, 0, sizeof(cmdUUID)); memset(&cmdSRCVER, 0, sizeof(cmdSRCVER)); memset(&cmdVERMIN, 0, sizeof(cmdVERMIN)); + memset(&linkitem, 0, sizeof(linkitem)); } template @@ -498,6 +501,7 @@ PackMachBase::compare_segment_command(void const *const aa, void const *const unsigned const xb = b->cmd - lc_seg; if (xa < xb) return -1; // LC_SEGMENT first if (xa > xb) return 1; + if (0 != xa) return 0; // not LC_SEGMENT // Beware 0==.vmsize (some MacOSX __DWARF debug info: a "comment") if (a->vmsize!=0 && b->vmsize!=0) { if (a->vmaddr < b->vmaddr) return -1; // ascending by .vmaddr @@ -608,6 +612,7 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader //unsigned cmdsize = mhdro.sizeofcmds; unsigned delta = 0; + unsigned va_next = 0; for (unsigned j = 0; j < ncmds; ++j) { unsigned skip = 0; unsigned sz_cmd = lcp->cmdsize; @@ -624,14 +629,17 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader unsigned off_hi = sectxt->size + sectxt->offset; Mach_section_command const *scpk = 1+ sectxt; for (unsigned k = 1; k < segptr->nsects; ++scpk, ++k) { - if (off_hi == scpk->offset) { + if (off_hi == scpk->offset || scpk->size==0) { off_hi += scpk->size; sectxt->size += scpk->size; } else { - printWarn(fi->getName(), "Unexpected .text section %s\n", (char const *)&scpk->sectname); + printWarn(fi->getName(), "Unexpected .text section %s size=%u\n", + (char const *)&scpk->sectname, (unsigned)scpk->size); // Assume the maximum size: to end of the page. sectxt->size = (segptr->vmsize + segptr->vmaddr) - sectxt->addr; + // Try to stop the cascade of errors. + off_hi = scpk->size + scpk->offset; break; } } @@ -650,10 +658,12 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader } memcpy(&segTEXT, segptr, sizeof(segTEXT)); memcpy(&secTEXT, sectxt, sizeof(secTEXT)); + va_next = segTEXT.vmsize + segTEXT.vmaddr; break; } if (!strcmp("__DATA", segptr->segname) && !segptr->vmsize) { - // Mach_segment_command for new segXHDR + // __DATA with no pages. + // Use the space as Mach_segment_command for new segXHDR, or elide. segXHDR.cmdsize = sizeof(segXHDR); // no need for sections segXHDR.vmaddr = segTEXT.vmsize + segTEXT.vmaddr; // XXX FIXME segXHDR.vmsize = offLINK - segTEXT.vmsize; @@ -662,6 +672,7 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader segXHDR.maxprot = Mach_segment_command::VM_PROT_READ; segXHDR.nsects = 0; if (!segtxt) { // replace __DATA with segXHDR + va_next = segXHDR.vmsize + segXHDR.vmaddr; memcpy(tail, &segXHDR, sizeof(segXHDR)); tail += sizeof(segXHDR); goto next; @@ -670,6 +681,7 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader segtxt->vmsize = offLINK; segtxt->filesize = offLINK; sectxt->size = offLINK - (~PAGE_MASK & sectxt->offset); + va_next = segtxt->vmsize + segtxt->vmaddr; skip = 1; } } @@ -681,8 +693,10 @@ void PackMachBase::pack4(OutputFile *fo, Filter &ft) // append PackHeader // Update the __LINKEDIT header segLINK.filesize = eofcmpr - offLINK; segLINK.vmsize = PAGE_MASK64 & (~PAGE_MASK64 + eofcmpr - offLINK); - segLINK.fileoff = segXHDR.filesize + segXHDR.fileoff; - segLINK.vmaddr = segXHDR.vmsize + segXHDR.vmaddr; + if (Mach_header::CPU_TYPE_I386 == my_cputype) { + segLINK.fileoff = offLINK; // otherwise written by ::pack3 + } + segLINK.vmaddr = va_next; memcpy(tail, &segLINK, sizeof(segLINK)); tail += sizeof(segLINK); goto next; @@ -799,6 +813,58 @@ next: } } +// At 2013-02-03 part of the source for codesign was +// http://opensource.apple.com/source/cctools/cctools-836/libstuff/ofile.c + +// 2017-11-06 Apple no longer supports PowerPC, and in particular +// MacOS 10.12 ("Sierra") was not released for PowerPC. +// Making the template PackMachBase::pack4 work +// (especially stub_powerpc_darwin_macho_upxmain_exe) +// was too tricky. So just use the previous specialization. +void PackMachPPC32::pack4(OutputFile *fo, Filter &ft) // append PackHeader +{ + // offset of p_info in compressed file + overlay_offset = sizeof(mhdro) + sizeof(segZERO) + + sizeof(segXHDR) + sizeof(secXHDR) + + sizeof(segTEXT) + sizeof(secTEXT) + + sizeof(segLINK) + sizeof(threado) + sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + overlay_offset += sizeof(cmdUUID) + sizeof(linkitem); + } + + PackUnix::pack4(fo, ft); // deliberately skip PackMachBase::pack4 + unsigned const t = fo->getBytesWritten(); + segTEXT.filesize = t; + segTEXT.vmsize += t; // utilize GAP + NO_LAP + sz_unc - sz_cpr + secTEXT.offset = overlay_offset - sizeof(linfo); + secTEXT.addr = segTEXT.vmaddr + secTEXT.offset; + secTEXT.size = segTEXT.filesize - secTEXT.offset; + secXHDR.offset = overlay_offset - sizeof(linfo); + if (my_filetype==Mach_header::MH_EXECUTE) { + secXHDR.offset -= sizeof(cmdUUID) + sizeof(linkitem); + } + secXHDR.addr += secXHDR.offset; + unsigned foff1 = (PAGE_MASK & (~PAGE_MASK + segTEXT.filesize)); + if (foff1 < segTEXT.vmsize) + foff1 += PAGE_SIZE; // codesign disallows overhang + segLINK.fileoff = foff1; + segLINK.vmaddr = segTEXT.vmaddr + foff1; + fo->seek(foff1 - 1, SEEK_SET); fo->write("", 1); + fo->seek(sizeof(mhdro), SEEK_SET); + fo->rewrite(&segZERO, sizeof(segZERO)); + fo->rewrite(&segXHDR, sizeof(segXHDR)); + fo->rewrite(&secXHDR, sizeof(secXHDR)); + fo->rewrite(&segTEXT, sizeof(segTEXT)); + fo->rewrite(&secTEXT, sizeof(secTEXT)); + fo->rewrite(&segLINK, sizeof(segLINK)); + fo->rewrite(&threado, sizeof(threado)); + if (my_filetype==Mach_header::MH_EXECUTE) { + fo->rewrite(&cmdUUID, sizeof(cmdUUID)); + fo->rewrite(&linkitem, sizeof(linkitem)); + } + fo->rewrite(&linfo, sizeof(linfo)); +} + template void PackMachBase::pack4dylib( // append PackHeader OutputFile *const fo, @@ -1026,6 +1092,20 @@ void PackMachBase::pack3(OutputFile *fo, Filter &ft) // append loader fo->write(&zero, 7& (0u-len)); } +void PackMachPPC32::pack3(OutputFile *fo, Filter &ft) // append loader +{ + TE32 disp; + unsigned const zero = 0; + unsigned len = fo->getBytesWritten(); + fo->write(&zero, 3& (0u-len)); + len += (3& (0u-len)) + sizeof(disp); + disp = 4+ len - sz_mach_headers; // 4: sizeof(instruction) + fo->write(&disp, sizeof(disp)); + + threado_setPC(len + segTEXT.vmaddr); /* entry address */ + PackUnix::pack3(fo, ft); // deliberately skip PackMachBase::pack3 +} + void PackDylibI386::pack3(OutputFile *fo, Filter &ft) // append loader { TE32 disp; @@ -1401,13 +1481,21 @@ void PackMachBase::pack1(OutputFile *const fo, Filter &/*ft*/) // generate e // Mach_command before __LINKEDIT fo->write((1+ ptr0), (char const *)ptr1 - (char const *)(1+ ptr0)); // LC_SEGMENT_64 for UPX_DATA; steal space from -Wl,-headerpadsize - segXHDR.cmdsize = sizeof(segXHDR); - segXHDR.vmaddr = 0; - segXHDR.fileoff = 0; - segXHDR.maxprot = Mach_segment_command::VM_PROT_READ; - segXHDR.initprot = Mach_segment_command::VM_PROT_READ; - segXHDR.nsects = 0; + if (Mach_header::CPU_TYPE_POWERPC != my_cputype) { + segXHDR.cmdsize = sizeof(segXHDR); + segXHDR.vmaddr = 0; + segXHDR.fileoff = 0; + segXHDR.maxprot = Mach_segment_command::VM_PROT_READ; + segXHDR.initprot = Mach_segment_command::VM_PROT_READ; + segXHDR.nsects = 0; + } fo->write(&segXHDR, sizeof(segXHDR)); + if (Mach_header::CPU_TYPE_POWERPC == my_cputype) { + // First LC_SEGMENT must have a section because + // its .offset is the limit for adding new headers + // for UUID or code signing (by Apple tools). + fo->write(&secXHDR, sizeof(secXHDR)); + } // Mach_command __LINKEDIT and after fo->write((char const *)ptr1, cmdsize); // Contents before __LINKEDIT; put non-headers at same offset in file @@ -1594,12 +1682,15 @@ int PackMachBase::canUnpack() upx_uint64_t rip = 0; unsigned style = 0; off_t offLINK = 0; + unsigned pos_next = 0; + unsigned nseg = 0; unsigned const ncmds = mhdri.ncmds; Mach_command const *ptr = (Mach_command const *)rawmseg; for (unsigned j= 0; j < ncmds; ptr = (Mach_command const *)(ptr->cmdsize + (char const *)ptr), ++j) { Mach_segment_command const *const segptr = (Mach_segment_command const *)ptr; if (lc_seg == ptr->cmd) { + ++nseg; if (!strcmp("__XHDR", segptr->segname)) { // PackHeader precedes __LINKEDIT (pre-Sierra MacOS 10.12) style = 391; // UPX 3.91 @@ -1614,12 +1705,19 @@ int PackMachBase::canUnpack() } if (!strcmp("__LINKEDIT", segptr->segname)) { offLINK = segptr->fileoff; + if (offLINK < pos_next) { + offLINK = pos_next; + } } + pos_next = segptr->filesize + segptr->fileoff; } else if (Mach_segment_command::LC_UNIXTHREAD==ptr->cmd) { rip = entryVMA = threadc_getPC(ptr); } } + if (3==nseg) { // __PAGEZERO, __TEXT, __LINKEDIT; no __XHDR, no UPX_DATA + style = 392; + } if (391==style && 0==offLINK && 2==ncmds) { // pre-3.91 ? offLINK = ptrTEXT->fileoff + ptrTEXT->filesize; // fake __LINKEDIT at EOF } @@ -1882,10 +1980,10 @@ bool PackMachBase::canPack() {CPU_TYPE_POWERPC, MH_EXECUTE, sizeof(stub_powerpc_darwin_macho_entry), sizeof(stub_powerpc_darwin_macho_fold), - 0, + sizeof(stub_powerpc_darwin_macho_upxmain_exe), stub_powerpc_darwin_macho_entry, stub_powerpc_darwin_macho_fold, - 0 + stub_powerpc_darwin_macho_upxmain_exe }, {CPU_TYPE_POWERPC, MH_DYLIB, sizeof(stub_powerpc_darwin_dylib_entry), 0, 0, diff --git a/src/p_mach.h b/src/p_mach.h index 921d705a..79a4343f 100644 --- a/src/p_mach.h +++ b/src/p_mach.h @@ -915,13 +915,15 @@ protected: virtual const int *getFilters() const; virtual void pack1_setup_threado(OutputFile *const fo); + virtual void pack3(OutputFile *, Filter &); // append loader + virtual void pack4(OutputFile *, Filter &); // append PackHeader virtual Linker* newLinker() const; __packed_struct(Mach_thread_command) - BE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */ - BE32 cmdsize; /* total size of this command */ - BE32 flavor; - BE32 count; /* sizeof(following_thread_state)/4 */ + TE32 cmd; /* LC_THREAD or LC_UNIXTHREAD */ + TE32 cmdsize; /* total size of this command */ + TE32 flavor; + TE32 count; /* sizeof(following_thread_state)/4 */ Mach_ppc_thread_state state; #define WANT_MACH_THREAD_ENUM 1 #include "p_mach_enum.h" diff --git a/src/stub/Makefile b/src/stub/Makefile index ee500468..ce438739 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -120,6 +120,7 @@ STUBS += mipsel.r3000-ps1.h STUBS += powerpc-darwin.dylib-entry.h STUBS += powerpc-darwin.macho-entry.h STUBS += powerpc-darwin.macho-fold.h +STUBS += powerpc-darwin.macho-upxmain.h STUBS += powerpc-linux.elf-entry.h STUBS += powerpc-linux.elf-fold.h STUBS += powerpc-linux.kernel.vmlinux-head.h @@ -1216,6 +1217,9 @@ powerpc-darwin.macho-fold.h : tmp/$$T.o tmp/powerpc-darwin.macho-main.o chmod a-x tmp/$T.bin $(call tc,bin2h) tmp/$T.bin $@ +powerpc-darwin.macho-upxmain.h: powerpc-darwin.macho-upxmain.exe + $(call tc,bin2h) $< $@ + tmp/powerpc-darwin.macho-fold.o : $(srcdir)/src/$$T.S $(call tc,gcc) -c $< -o $@ $(call tc,f-objstrip,$@) diff --git a/src/stub/powerpc-darwin.macho-upxmain.exe b/src/stub/powerpc-darwin.macho-upxmain.exe new file mode 100644 index 00000000..0d9cb83d Binary files /dev/null and b/src/stub/powerpc-darwin.macho-upxmain.exe differ diff --git a/src/stub/powerpc-darwin.macho-upxmain.h b/src/stub/powerpc-darwin.macho-upxmain.h new file mode 100644 index 00000000..cece53a6 --- /dev/null +++ b/src/stub/powerpc-darwin.macho-upxmain.h @@ -0,0 +1,551 @@ +/* powerpc-darwin.macho-upxmain.h + created from powerpc-darwin.macho-upxmain.exe, 8192 (0x2000) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2016 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2016 Laszlo Molnar + Copyright (C) 2000-2016 John F. Reiser + All Rights Reserved. + + UPX and the UCL library are free software; you can redistribute them + and/or modify them 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; see the file COPYING. + If not, write to the Free Software Foundation, Inc., + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Markus F.X.J. Oberhumer Laszlo Molnar + + + John F. Reiser + + */ + + +#define STUB_POWERPC_DARWIN_MACHO_UPXMAIN_EXE_SIZE 8192 +#define STUB_POWERPC_DARWIN_MACHO_UPXMAIN_EXE_ADLER32 0x7b0d2d35 +#define STUB_POWERPC_DARWIN_MACHO_UPXMAIN_EXE_CRC32 0x79bc06b7 + +unsigned char stub_powerpc_darwin_macho_upxmain_exe[8192] = { +/* 0x0000 */ 254,237,250,206, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, 2, +/* 0x0010 */ 0, 0, 0, 6, 0, 0, 2,184, 0, 0, 0, 1, 0, 0, 0, 1, +/* 0x0020 */ 0, 0, 0, 56, 95, 95, 80, 65, 71, 69, 90, 69, 82, 79, 0, 0, +/* 0x0030 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, +/* 0x0040 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0050 */ 0, 0, 0, 4, 0, 0, 0, 1, 0, 0, 1, 4, 95, 95, 84, 69, +/* 0x0060 */ 88, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, +/* 0x0070 */ 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 7, +/* 0x0080 */ 0, 0, 0, 5, 0, 0, 0, 3, 0, 0, 0, 0, 95, 95,116,101, +/* 0x0090 */ 120,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, 95, 84, 69, +/* 0x00a0 */ 88, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 52, +/* 0x00b0 */ 0, 0, 13,152, 0, 0, 18, 52, 0, 0, 0, 2, 0, 0, 0, 0, +/* 0x00c0 */ 0, 0, 0, 0,128, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x00d0 */ 95, 95,112,105, 99,115,121,109, 98,111,108,115,116,117, 98, 49, +/* 0x00e0 */ 95, 95, 84, 69, 88, 84, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x00f0 */ 0, 0, 47,224, 0, 0, 0, 0, 0, 0, 31,224, 0, 0, 0, 5, +/* 0x0100 */ 0, 0, 0, 0, 0, 0, 0, 0,128, 0, 4, 8, 0, 0, 0, 0, +/* 0x0110 */ 0, 0, 0, 32, 95, 95, 99,115,116,114,105,110,103, 0, 0, 0, +/* 0x0120 */ 0, 0, 0, 0, 95, 95, 84, 69, 88, 84, 0, 0, 0, 0, 0, 0, +/* 0x0130 */ 0, 0, 0, 0, 0, 0, 47,224, 0, 0, 0, 12, 0, 0, 31,224, +/* 0x0140 */ 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, +/* 0x0150 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0,124, +/* 0x0160 */ 95, 95, 68, 65, 84, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0170 */ 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0180 */ 0, 0, 0, 7, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 0, +/* 0x0190 */ 95, 95,108, 97, 95,115,121,109, 98,111,108, 95,112,116,114, 0, +/* 0x01a0 */ 95, 95, 68, 65, 84, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x01b0 */ 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 2, +/* 0x01c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, +/* 0x01d0 */ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 56, 95, 95, 76, 73, +/* 0x01e0 */ 78, 75, 69, 68, 73, 84, 0, 0, 0, 0, 0, 0, 0, 0, 48, 0, +/* 0x01f0 */ 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 7, +/* 0x0200 */ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 2, +/* 0x0210 */ 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0220 */ 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0,176, 0, 0, 0, 1, +/* 0x0230 */ 0, 0, 0, 40, 0, 0, 34, 52, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0240 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0250 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0260 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0270 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0280 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0290 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x02f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0300 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0310 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0320 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0330 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0340 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0350 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0360 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0370 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0380 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0390 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x03f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0400 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0410 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0420 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0430 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0440 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0450 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0460 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0470 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0480 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0490 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x04f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0500 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0510 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0520 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0530 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0540 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0550 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0560 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0570 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0580 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0590 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x05f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0600 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0610 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0620 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0630 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0640 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0650 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0660 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0670 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0680 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0690 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x06f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0700 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0710 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0720 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0730 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0740 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0750 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0760 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0770 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0780 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0790 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x07f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0800 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0810 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0820 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0830 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0840 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0850 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0860 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0870 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0880 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0890 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x08f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0900 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0910 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0920 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0930 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0940 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0950 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0960 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0970 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0980 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0990 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x09f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0a90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0aa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ab0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ac0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ad0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ae0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0af0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0b90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ba0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0bb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0bc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0bd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0be0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0bf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0c90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ca0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0cb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0cc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0cd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ce0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0cf0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0d90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0da0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0db0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0dc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0dd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0de0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0df0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0e90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ea0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0eb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ec0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ed0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ee0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ef0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f00 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f10 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f20 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f30 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f40 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f50 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f60 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f70 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0f90 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0fa0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0fb0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0fc0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0fd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0fe0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0ff0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1000 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1010 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1020 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1030 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1040 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1050 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1060 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1070 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1080 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x10f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1100 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1110 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1120 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1130 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1140 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1150 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1160 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1170 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1180 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1190 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x11f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1200 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1210 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1220 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1230 */ 0, 0, 0, 0, 72, 0, 11,144,124,199, 51,120, 56,192, 0, 0, +/* 0x1240 */ 56, 0, 0,153, 72, 0, 0, 16,125, 9, 67,120, 57, 0, 0, 0, +/* 0x1250 */ 56, 0, 0,197, 68, 0, 0, 2, 56, 96,255,255, 78,128, 0, 32, +/* 0x1260 */ 56, 0, 0, 1, 75,255,255,240, 56, 0, 0, 3, 75,255,255,232, +/* 0x1270 */ 56, 0, 0, 5, 75,255,255,224, 56, 0, 0, 6, 75,255,255,216, +/* 0x1280 */ 56, 0, 0, 74, 75,255,255,208, 56, 0, 0, 73, 75,255,255,200, +/* 0x1290 */ 72, 0, 0, 0,124, 8, 2,166,191,193,255,248,144, 1, 0, 8, +/* 0x12a0 */ 148, 33,255,160,124, 62, 11,120,144,126, 0,120,144,158, 0,124, +/* 0x12b0 */ 144,190, 0,128,128, 94, 0,120,128, 2, 0, 4,144, 30, 0, 64, +/* 0x12c0 */ 128, 30, 0,124,144, 30, 0, 60,128, 94, 0,120,128, 66, 0, 0, +/* 0x12d0 */ 128, 30, 0,128,127,130, 0, 64, 64,156, 0, 12, 56, 96, 0,127, +/* 0x12e0 */ 75,255,255,129,128, 30, 0,128,144, 30, 0, 56, 72, 0, 0, 48, +/* 0x12f0 */ 128, 94, 0, 64,136, 2, 0, 0, 84, 0, 6, 62,128, 94, 0, 60, +/* 0x1300 */ 152, 2, 0, 0,128, 94, 0, 64, 56, 2, 0, 1,144, 30, 0, 64, +/* 0x1310 */ 128, 94, 0, 60, 56, 2, 0, 1,144, 30, 0, 60,128, 94, 0, 56, +/* 0x1320 */ 56, 2,255,255,144, 30, 0, 56,128, 94, 0, 56, 56, 0,255,255, +/* 0x1330 */ 127,130, 0, 0, 64,158,255,188,128, 94, 0,120,128, 66, 0, 4, +/* 0x1340 */ 128, 30, 0,128,124, 2, 2, 20,128, 94, 0,120,144, 2, 0, 4, +/* 0x1350 */ 128, 94, 0,120,128, 66, 0, 0,128, 30, 0,128,124, 0, 16, 80, +/* 0x1360 */ 128, 94, 0,120,144, 2, 0, 0,128, 33, 0, 0,128, 1, 0, 8, +/* 0x1370 */ 124, 8, 3,166,187,193,255,248, 78,128, 0, 32,124, 8, 2,166, +/* 0x1380 */ 191,193,255,248,144, 1, 0, 8,148, 33,255,144,124, 62, 11,120, +/* 0x1390 */ 144,126, 0,136,144,158, 0,140,144,190, 0,144,144,222, 0,148, +/* 0x13a0 */ 72, 0, 1,240, 56, 30, 0, 60,128,126, 0,136,124, 4, 3,120, +/* 0x13b0 */ 56,160, 0, 12, 75,255,254,225,128, 30, 0, 60, 47,128, 0, 0, +/* 0x13c0 */ 64,158, 0, 44,128, 30, 0, 64, 60, 64, 33, 88, 96, 66, 80, 85, +/* 0x13d0 */ 127,128, 16, 0, 64,158, 0, 36,128, 94, 0,136,128, 2, 0, 0, +/* 0x13e0 */ 47,128, 0, 0, 64,158, 0, 20, 72, 0, 1,184,128, 30, 0, 64, +/* 0x13f0 */ 47,128, 0, 0, 64,158, 0, 12, 56, 96, 0,127, 75,255,254,101, +/* 0x1400 */ 128, 30, 0, 64,128, 94, 0, 60,127,128, 16, 64, 65,157,255,236, +/* 0x1410 */ 129, 62, 0, 60,128, 94, 0,140,128, 2, 0, 0,127,137, 0, 64, +/* 0x1420 */ 65,157,255,216,128, 30, 0, 64,128, 94, 0, 60,127,128, 16, 64, +/* 0x1430 */ 64,156, 1, 20,128, 30, 0, 60,144, 30, 0, 72,128, 94, 0,136, +/* 0x1440 */ 128, 2, 0, 4,124, 9, 3,120,129,126, 0, 64,128, 94, 0,140, +/* 0x1450 */ 128, 2, 0, 4,124, 2, 3,120,136, 30, 0, 68, 84, 0, 6, 62, +/* 0x1460 */ 124, 10, 3,120, 56, 30, 0, 72,129, 30, 0,144,125, 35, 75,120, +/* 0x1470 */ 125,100, 91,120,124, 69, 19,120,124, 6, 3,120,125, 71, 83,120, +/* 0x1480 */ 125, 12, 67,120,125,137, 3,166, 78,128, 4, 33,124, 96, 27,120, +/* 0x1490 */ 144, 30, 0, 56,128, 30, 0, 56, 47,128, 0, 0, 64,158,255, 92, +/* 0x14a0 */ 128, 30, 0, 60,128, 94, 0, 72,127,128, 16, 0, 64,158,255, 76, +/* 0x14b0 */ 136, 30, 0, 69, 84, 0, 6, 62, 47,128, 0, 0, 65,158, 0, 84, +/* 0x14c0 */ 128, 30, 0,148, 47,128, 0, 0, 65,158, 0, 72,128, 94, 0,140, +/* 0x14d0 */ 128, 2, 0, 4,124, 9, 3,120,129,126, 0, 72,136, 30, 0, 70, +/* 0x14e0 */ 84, 0, 6, 62,124, 10, 3,120,136, 30, 0, 69, 84, 0, 6, 62, +/* 0x14f0 */ 128, 94, 0,148,125, 35, 75,120,125,100, 91,120,125, 69, 83,120, +/* 0x1500 */ 124, 6, 3,120,124, 76, 19,120,125,137, 3,166, 78,128, 4, 33, +/* 0x1510 */ 128, 94, 0,136,128, 66, 0, 4,128, 30, 0, 64,124, 2, 2, 20, +/* 0x1520 */ 128, 94, 0,136,144, 2, 0, 4,128, 94, 0,136,128, 66, 0, 0, +/* 0x1530 */ 128, 30, 0, 64,124, 0, 16, 80,128, 94, 0,136,144, 2, 0, 0, +/* 0x1540 */ 72, 0, 0, 32,128, 94, 0,140,128, 2, 0, 4,128, 94, 0, 64, +/* 0x1550 */ 128,126, 0,136,124, 4, 3,120,124, 69, 19,120, 75,255,253, 57, +/* 0x1560 */ 128, 94, 0,140,128, 66, 0, 4,128, 30, 0, 60,124, 2, 2, 20, +/* 0x1570 */ 128, 94, 0,140,144, 2, 0, 4,128, 94, 0,140,128, 66, 0, 0, +/* 0x1580 */ 128, 30, 0, 60,124, 0, 16, 80,128, 94, 0,140,144, 2, 0, 0, +/* 0x1590 */ 128, 94, 0,140,128, 2, 0, 0, 47,128, 0, 0, 64,158,254, 8, +/* 0x15a0 */ 128, 33, 0, 0,128, 1, 0, 8,124, 8, 3,166,187,193,255,248, +/* 0x15b0 */ 78,128, 0, 32,191,193,255,248,148, 33,255,208,124, 62, 11,120, +/* 0x15c0 */ 144,126, 0, 72,144,158, 0, 76,128, 30, 0, 76, 47,128, 0, 0, +/* 0x15d0 */ 65,158, 0, 52,128, 94, 0, 72, 56, 0, 0, 0,152, 2, 0, 0, +/* 0x15e0 */ 128, 94, 0, 72, 56, 2, 0, 1,144, 30, 0, 72,128, 94, 0, 76, +/* 0x15f0 */ 56, 2,255,255,144, 30, 0, 76,128, 30, 0, 76, 47,128, 0, 0, +/* 0x1600 */ 64,158,255,212,128, 33, 0, 0,187,193,255,248, 78,128, 0, 32, +/* 0x1610 */ 124, 8, 2,166,191,193,255,248,144, 1, 0, 8,148, 33,255, 80, +/* 0x1620 */ 124, 62, 11,120,144,126, 0,200,144,158, 0,204,144,190, 0,208, +/* 0x1630 */ 144,222, 0,212,144,254, 0,216,145, 30, 0,220,145, 62, 0,224, +/* 0x1640 */ 128, 94, 0,200, 56, 2, 0, 28,144, 30, 0,116, 56, 0, 0, 0, +/* 0x1650 */ 144, 30, 0,112, 56, 0, 0, 0,144, 30, 0,108, 56, 0, 0, 0, +/* 0x1660 */ 144, 30, 0,104, 56, 0, 0, 0,144, 30, 0,100, 72, 0, 4, 44, +/* 0x1670 */ 128, 94, 0,116,128, 2, 0, 0, 47,128, 0, 1, 64,158, 3, 52, +/* 0x1680 */ 128, 94, 0,116,128, 2, 0, 28, 47,128, 0, 0, 65,158, 3, 36, +/* 0x1690 */ 128, 94, 0,116,128, 2, 0, 36,144, 30, 0,120,128, 30, 0,120, +/* 0x16a0 */ 144, 30, 0, 96,128, 94, 0,116,128, 2, 0, 24,124, 2, 3,120, +/* 0x16b0 */ 128, 30, 0,104,124, 2, 2, 20,144, 30, 0,124,128, 30, 0,124, +/* 0x16c0 */ 144, 30, 0, 92,128, 94, 0,116,128, 2, 0, 28,124, 2, 3,120, +/* 0x16d0 */ 128, 30, 0, 92,124, 2, 2, 20,144, 30, 0, 88,128, 30, 0, 92, +/* 0x16e0 */ 84, 0, 5, 62,144, 30, 0, 84,128, 94, 0, 84,128, 30, 0, 92, +/* 0x16f0 */ 124, 2, 0, 80,144, 30, 0, 92,128, 94, 0, 96,128, 30, 0, 84, +/* 0x1700 */ 124, 2, 2, 20,144, 30, 0, 96,128, 30, 0, 96, 47,128, 0, 0, +/* 0x1710 */ 65,158, 1, 44,128, 30, 0,208, 47,128, 0, 0, 65,158, 0, 16, +/* 0x1720 */ 56, 0, 0, 3,144, 30, 0,148, 72, 0, 0, 12, 56, 64, 0, 0, +/* 0x1730 */ 144, 94, 0,148,128, 30, 0, 96,129, 62, 0,148,124, 9, 2, 20, +/* 0x1740 */ 144, 30, 0, 80, 56, 0, 0, 3,144, 30, 0, 76,128, 30, 0, 92, +/* 0x1750 */ 47,128, 0, 0, 65,158, 0, 16, 56, 0, 0, 18,144, 30, 0,144, +/* 0x1760 */ 72, 0, 0, 12, 56, 64, 0, 2,144, 94, 0,144,128, 30, 0,208, +/* 0x1770 */ 47,128, 0, 0, 64,158, 0, 20,128, 94, 0,116,128, 2, 0, 36, +/* 0x1780 */ 47,128, 0, 0, 64,158, 0, 16, 57, 32, 16, 0,145, 62, 0,140, +/* 0x1790 */ 72, 0, 0, 12, 56, 0, 0, 0,144, 30, 0,140,128, 94, 0,144, +/* 0x17a0 */ 129, 62, 0,140,124, 64, 75,120,144, 30, 0, 72,128, 94, 0,116, +/* 0x17b0 */ 128, 2, 0, 36, 47,128, 0, 0, 65,158, 0, 16,128, 30, 0,212, +/* 0x17c0 */ 144, 30, 0,136, 72, 0, 0, 12, 56, 64,255,255,144, 94, 0,136, +/* 0x17d0 */ 129, 62, 0,136,145, 62, 0, 68,128, 94, 0,116,128, 66, 0, 32, +/* 0x17e0 */ 128, 30, 0,204,124, 2, 2, 20,144, 30, 0, 64,128,126, 0, 92, +/* 0x17f0 */ 128,158, 0, 80,128,190, 0, 76,128,222, 0, 72,128,254, 0, 68, +/* 0x1800 */ 129, 30, 0, 64, 75,255,250, 69,124, 96, 27,120,144, 30, 0, 60, +/* 0x1810 */ 128, 94, 0, 60, 56, 0,255,255,127,130, 0, 0, 65,158, 0,208, +/* 0x1820 */ 128, 30, 0, 92, 47,128, 0, 0, 64,158, 0, 12,128, 30, 0, 60, +/* 0x1830 */ 144, 30, 0,104,128, 30, 0, 60,144, 30, 0, 92,128, 30, 0,208, +/* 0x1840 */ 47,128, 0, 0, 65,158, 0, 80,128, 94, 0,116,128, 2, 0, 36, +/* 0x1850 */ 47,128, 0, 0, 65,158, 0, 64,128, 94, 0,116,128, 2, 0, 32, +/* 0x1860 */ 47,128, 0, 0, 64,158, 0, 24,128, 30, 0,116,144, 30, 0,112, +/* 0x1870 */ 128, 30, 0, 92,128, 94, 0,216,144, 2, 0, 0, 56, 30, 0,120, +/* 0x1880 */ 128,126, 0,208,124, 4, 3,120,128,190, 0,220,128,222, 0,224, +/* 0x1890 */ 75,255,250,237,128, 30, 0, 96,124, 0, 0,208, 84, 0, 5, 62, +/* 0x18a0 */ 144, 30, 0, 84,128, 94, 0, 96,128, 30, 0, 92,124, 2, 2, 20, +/* 0x18b0 */ 124, 3, 3,120,128,158, 0, 84, 75,255,252,253,128, 30, 0, 96, +/* 0x18c0 */ 47,128, 0, 0, 65,158, 0, 48,128, 94, 0,116,128, 2, 0, 44, +/* 0x18d0 */ 128,126, 0, 92,128,158, 0, 96,124, 5, 3,120, 75,255,249,165, +/* 0x18e0 */ 124, 96, 27,120, 47,128, 0, 0, 65,158, 0, 12, 56, 96, 0,127, +/* 0x18f0 */ 75,255,249,113,128, 94, 0, 96,128, 30, 0, 84,124, 2, 2, 20, +/* 0x1900 */ 124, 2, 3,120,128, 30, 0, 92,124, 0, 18, 20,144, 30, 0, 92, +/* 0x1910 */ 128, 94, 0, 92,128, 30, 0, 88,127,130, 0, 64, 64,156, 0, 88, +/* 0x1920 */ 128, 30, 0, 92, 47,128, 0, 0, 65,158, 1, 76,128, 94, 0, 88, +/* 0x1930 */ 128, 30, 0, 92,124, 0, 16, 80,124, 9, 3,120,128, 94, 0,116, +/* 0x1940 */ 128, 2, 0, 44,128,126, 0, 92,125, 36, 75,120,124, 5, 3,120, +/* 0x1950 */ 56,192, 16, 18, 56,224,255,255, 57, 0, 0, 0, 75,255,248,237, +/* 0x1960 */ 124, 98, 27,120,128, 30, 0, 92,127,130, 0, 0, 64,158,255,128, +/* 0x1970 */ 72, 0, 1, 4,128, 30, 0,208, 47,128, 0, 0, 65,158, 0,248, +/* 0x1980 */ 128, 94, 0, 96, 56, 2, 0, 3, 84, 0, 5, 62,144, 30, 0, 96, +/* 0x1990 */ 128, 30, 0, 96, 43,128, 0, 3, 65,157, 0,220,128, 30, 0, 92, +/* 0x19a0 */ 124, 3, 3,120,128,158, 0, 96, 75,255,248,225, 72, 0, 0,200, +/* 0x19b0 */ 128, 94, 0,116,128, 2, 0, 0, 47,128, 0, 5, 65,158, 0, 20, +/* 0x19c0 */ 128, 94, 0,116,128, 2, 0, 0, 47,128, 0, 4, 64,158, 0, 68, +/* 0x19d0 */ 128, 30, 0,116,144, 30, 0, 56,128, 94, 0, 56,128, 2, 0, 8, +/* 0x19e0 */ 47,128, 0, 1, 64,158, 0,144,128, 94, 0, 56,128, 2, 0, 12, +/* 0x19f0 */ 47,128, 0, 40, 64,158, 0,128,128, 94, 0, 56,128, 66, 0, 16, +/* 0x1a00 */ 128, 30, 0,104,124, 2, 2, 20,144, 30, 0,108, 72, 0, 0,104, +/* 0x1a10 */ 128, 94, 0,116,128, 66, 0, 0, 60, 0,128, 0, 96, 0, 0, 40, +/* 0x1a20 */ 127,130, 0, 0, 64,158, 0, 80,128, 94, 0,116,128, 98, 0, 12, +/* 0x1a30 */ 128, 66, 0, 8,144,126, 0,108,128, 94, 0,112,128, 66, 0, 32, +/* 0x1a40 */ 128, 30, 0,108,127,130, 0, 64, 65,157, 0, 44,128, 94, 0,112, +/* 0x1a50 */ 128, 66, 0, 36,128, 30, 0,108,127,130, 0, 64, 64,157, 0, 24, +/* 0x1a60 */ 128, 94, 0,112,128, 66, 0, 24,128, 30, 0,108,124, 0, 18, 20, +/* 0x1a70 */ 144, 30, 0,108,128, 94, 0,100, 56, 2, 0, 1,144, 30, 0,100, +/* 0x1a80 */ 128, 94, 0,116,128, 2, 0, 4,124, 2, 3,120,128, 30, 0,116, +/* 0x1a90 */ 124, 2, 2, 20,144, 30, 0,116,128, 94, 0,200,128, 66, 0, 16, +/* 0x1aa0 */ 128, 30, 0,100,127,130, 0, 64, 65,157,251,200,128, 30, 0,108, +/* 0x1ab0 */ 124, 3, 3,120,128, 33, 0, 0,128, 1, 0, 8,124, 8, 3,166, +/* 0x1ac0 */ 187,193,255,248, 78,128, 0, 32,191,193,255,248,148, 33,255,192, +/* 0x1ad0 */ 124, 62, 11,120,144,126, 0, 88,128, 94, 0, 88, 56, 2, 0, 8, +/* 0x1ae0 */ 144, 30, 0, 28, 56, 0, 0, 0,144, 30, 0, 24, 72, 0, 0, 60, +/* 0x1af0 */ 128, 94, 0, 28,128, 2, 0, 0, 47,128, 0, 18, 64,158, 0, 20, +/* 0x1b00 */ 128, 94, 0, 28,128, 66, 0, 8,144, 94, 0, 40, 72, 0, 0, 56, +/* 0x1b10 */ 128, 94, 0, 24, 56, 2, 0, 1,144, 30, 0, 24,128, 94, 0, 28, +/* 0x1b20 */ 56, 2, 0, 20,144, 30, 0, 28,128, 94, 0, 88,128, 66, 0, 4, +/* 0x1b30 */ 128, 30, 0, 24,127,130, 0, 64, 65,157,255,184, 56, 0, 0, 0, +/* 0x1b40 */ 144, 30, 0, 40,128, 30, 0, 40,124, 3, 3,120,128, 33, 0, 0, +/* 0x1b50 */ 187,193,255,248, 78,128, 0, 32,124, 8, 2,166,191,193,255,248, +/* 0x1b60 */ 144, 1, 0, 8,148, 33,255,128,124, 62, 11,120,144,126, 0,152, +/* 0x1b70 */ 144,158, 0,156,144,190, 0,160,144,222, 0,164,144,254, 0,168, +/* 0x1b80 */ 145, 30, 0,172,145, 62, 0,176, 56, 0, 0, 0,144, 30, 0, 72, +/* 0x1b90 */ 128, 94, 0,152, 56, 2, 0, 24,144, 30, 0, 84,128, 94, 0,156, +/* 0x1ba0 */ 56, 2,255,232,144, 30, 0, 80,128, 30, 0,160,144, 30, 0, 92, +/* 0x1bb0 */ 128, 30, 0, 84,124, 2, 3,120,128, 2, 0, 0,144, 30, 0, 88, +/* 0x1bc0 */ 128, 30, 0, 80,128, 94, 0, 84,144, 30, 0, 96,144, 94, 0,100, +/* 0x1bd0 */ 56, 30, 0, 80, 56, 94, 0, 88,124, 3, 3,120,124, 68, 19,120, +/* 0x1be0 */ 128,190, 0,168, 56,192, 0, 0, 75,255,247,149, 56, 30, 0, 96, +/* 0x1bf0 */ 128,126, 0,160,128,158, 0, 72,124, 5, 3,120, 56,192,255,255, +/* 0x1c00 */ 128,254, 0,176,129, 30, 0,168,129, 62, 0,172, 75,255,250, 5, +/* 0x1c10 */ 124, 96, 27,120,144, 30, 0, 76,128, 94, 0,160, 56, 2, 0, 28, +/* 0x1c20 */ 144, 30, 0, 68, 56, 0, 0, 0,144, 30, 0, 64, 72, 0, 1,104, +/* 0x1c30 */ 128, 94, 0, 68,128, 2, 0, 0, 47,128, 0, 14, 64,158, 1, 52, +/* 0x1c40 */ 128, 94, 0, 68, 56, 2, 0, 8,124, 2, 3,120,128, 2, 0, 0, +/* 0x1c50 */ 124, 2, 3,120,128, 30, 0, 68,124, 2, 2, 20,144, 30, 0, 60, +/* 0x1c60 */ 128,126, 0, 60, 56,128, 0, 0, 56,160, 0, 0, 75,255,246, 5, +/* 0x1c70 */ 124, 96, 27,120,144, 30, 0, 56,128, 30, 0, 56, 47,128, 0, 0, +/* 0x1c80 */ 65,156, 0, 44,128,126, 0, 56,128,158, 0,160,128,190, 0,164, +/* 0x1c90 */ 128,222, 0, 72, 75,255,245,165,124, 96, 27,120,124, 2, 3,120, +/* 0x1ca0 */ 128, 30, 0,164,127,130, 0, 0, 65,158, 0, 12, 56, 96, 0,127, +/* 0x1cb0 */ 75,255,245,177,128, 94, 0,160,128, 66, 0, 0,144, 94, 0,104, +/* 0x1cc0 */ 60, 0,202,254, 96, 0,186,190,128, 94, 0,104,127,130, 0, 0, +/* 0x1cd0 */ 65,158, 0, 72, 60, 0,202,254, 96, 0,186,190,128, 94, 0,104, +/* 0x1ce0 */ 127,130, 0, 64, 65,157, 0, 28, 60, 0,190,186, 96, 0,254,202, +/* 0x1cf0 */ 128, 94, 0,104,127,130, 0, 0, 65,158, 0, 32, 72, 0, 0, 64, +/* 0x1d00 */ 60, 0,254,237, 96, 0,250,206,128, 94, 0,104,127,130, 0, 0, +/* 0x1d10 */ 65,158, 0, 44, 72, 0, 0, 40,128, 30, 0,160,124, 3, 3,120, +/* 0x1d20 */ 75,255,253,169,124, 96, 27,120,144, 30, 0, 72,128, 30, 0, 72, +/* 0x1d30 */ 47,128, 0, 0, 64,158,255, 80, 75,255,255,116,128,126, 0,160, +/* 0x1d40 */ 128,158, 0, 72, 56,160, 0, 0,128,222, 0, 56, 56,224, 0, 0, +/* 0x1d50 */ 57, 0, 0, 0, 57, 32, 0, 0, 75,255,248,185,124, 96, 27,120, +/* 0x1d60 */ 144, 30, 0, 76,128,126, 0, 56, 75,255,245, 17, 72, 0, 0, 60, +/* 0x1d70 */ 128, 94, 0, 64, 56, 2, 0, 1,144, 30, 0, 64,128, 94, 0, 68, +/* 0x1d80 */ 128, 2, 0, 4,124, 2, 3,120,128, 30, 0, 68,124, 2, 2, 20, +/* 0x1d90 */ 144, 30, 0, 68,128, 94, 0,160,128, 66, 0, 16,128, 30, 0, 64, +/* 0x1da0 */ 127,130, 0, 64, 65,157,254,140,128, 30, 0, 76,124, 3, 3,120, +/* 0x1db0 */ 128, 33, 0, 0,128, 1, 0, 8,124, 8, 3,166,187,193,255,248, +/* 0x1dc0 */ 78,128, 0, 32,124, 8, 2,166,191,193,255,248,144, 1, 0, 8, +/* 0x1dd0 */ 148, 33,191,112,124, 62, 11,120, 66,159, 0, 5,127,232, 2,166, +/* 0x1de0 */ 144,126, 64,168,144,158, 64,172,128, 1, 0, 4,144, 30, 64,168, +/* 0x1df0 */ 144, 94, 64,172, 60, 95, 0, 0, 56, 2,255,232, 84, 0, 0, 38, +/* 0x1e00 */ 144, 30, 0, 92,128, 94, 0, 92, 56, 2, 0, 28,144, 30, 0, 88, +/* 0x1e10 */ 56, 0, 0, 0,144, 30, 0, 68, 72, 0, 1, 36,128, 94, 0, 88, +/* 0x1e20 */ 128, 2, 0, 0, 47,128, 0, 1, 64,158, 0,240,128, 30, 0, 88, +/* 0x1e30 */ 144, 30, 0, 60, 60, 95, 0, 0, 56, 66, 2, 4, 56, 2, 0, 2, +/* 0x1e40 */ 124, 2, 3,120,129, 34, 0, 0,129, 66, 0, 4,145, 62, 64,112, +/* 0x1e50 */ 145, 94, 64,116,128, 94, 0, 60, 56, 66, 0, 8, 56, 2, 0, 2, +/* 0x1e60 */ 124, 2, 3,120,129, 34, 0, 0,129, 66, 0, 4,145, 62, 64,104, +/* 0x1e70 */ 145, 94, 64,108,129, 94, 64,112,128, 30, 64,104,127,138, 0, 0, +/* 0x1e80 */ 64,158, 0,152,128, 94, 64,116,129, 62, 64,108,127,130, 72, 0, +/* 0x1e90 */ 64,158, 0,136,128, 94, 0, 60,128, 66, 0, 24, 56, 2, 0, 2, +/* 0x1ea0 */ 144, 30, 0, 84,128, 94, 0, 60,128, 2, 0, 24,124, 2, 3,120, +/* 0x1eb0 */ 160, 2, 0, 0, 84, 0, 4, 62,124, 9, 3,120,128, 94, 0, 60, +/* 0x1ec0 */ 128, 2, 0, 24,124, 9, 2, 20,144, 30, 0, 80,128, 94, 0, 60, +/* 0x1ed0 */ 128, 2, 0, 24,144, 30, 0, 56,128, 94, 0, 56, 56, 2,255,252, +/* 0x1ee0 */ 144, 30, 0, 56,128, 94, 0, 56,128, 2, 0, 0,144, 30, 0, 72, +/* 0x1ef0 */ 128, 30, 0, 72, 47,128, 0, 0, 65,158,255,224,128, 30, 0, 72, +/* 0x1f00 */ 124, 0, 0,208,124, 2, 3,120,128, 30, 0, 56,124, 2, 2, 20, +/* 0x1f10 */ 144, 30, 0, 76, 72, 0, 0, 60,128, 94, 0, 68, 56, 2, 0, 1, +/* 0x1f20 */ 144, 30, 0, 68,128, 94, 0, 88,128, 2, 0, 4,124, 2, 3,120, +/* 0x1f30 */ 128, 30, 0, 88,124, 2, 2, 20,144, 30, 0, 88,128, 94, 0, 92, +/* 0x1f40 */ 128, 66, 0, 16,128, 30, 0, 68,127,130, 0, 64, 65,157,254,208, +/* 0x1f50 */ 129, 62, 0, 76, 57,126, 0, 96,128, 94, 64,172, 56, 2,255,248, +/* 0x1f60 */ 125, 35, 75,120,128,158, 0, 72,125,101, 91,120, 56,192, 64, 0, +/* 0x1f70 */ 128,254, 0, 80,129, 30, 0, 84,124, 9, 3,120, 75,255,251,221, +/* 0x1f80 */ 124, 96, 27,120,144, 30, 0, 64,128,126, 0, 76,128,158, 0, 72, +/* 0x1f90 */ 75,255,242,249,128, 94, 64,172, 56, 66,255,252,128, 30, 64,168, +/* 0x1fa0 */ 144, 2, 0, 0,128, 94, 0, 64,128, 30, 64,172,124, 79,241, 32, +/* 0x1fb0 */ 56, 0, 0, 0,124, 3, 3,120,128, 33, 0, 0,128, 1, 0, 8, +/* 0x1fc0 */ 124, 8, 3,166,187,193,255,248, 78,128, 0, 32, 0, 0, 0, 0, +/* 0x1fd0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x1fe0 */ 95, 95, 76, 73, 78, 75, 69, 68, 73, 84, 0, 0, 0, 0, 0, 0, +/* 0x1ff0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 +}; diff --git a/src/stub/src/powerpc-darwin.macho-upxsubr.S b/src/stub/src/powerpc-darwin.macho-upxsubr.S new file mode 100644 index 00000000..60bcd595 --- /dev/null +++ b/src/stub/src/powerpc-darwin.macho-upxsubr.S @@ -0,0 +1,87 @@ +/* +; powerpc-darwin.macho-upxsubr.S -- system calls +; +; This file is part of the UPX executable compressor. +; +; Copyright (C) 1996-2015 Markus Franz Xaver Johannes Oberhumer +; Copyright (C) 1996-2015 Laszlo Molnar +; Copyright (C) 2000-2015 John F. Reiser +; All Rights Reserved. +; +; UPX and the UCL library are free software; you can redistribute them +; and/or modify them 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; see the file COPYING. +; If not, write to the Free Software Foundation, Inc., +; 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +; +; Markus F.X.J. Oberhumer Laszlo Molnar +; +; +; John F. Reiser +; +; +*/ + +SYS_exit =1 +SYS_fork =2 +SYS_read =3 +SYS_write =4 +SYS_open =5 +SYS_close =6 + +SYS_pread =153 +SYS_mmap =197 +SYS_munmap= 73 +SYS_mprotect= 74 + +_start: .globl _start + b _main + +/* SYS_mmap takes a 64-bit off_t, but gcc-3.4.1-20040827 passes long long + in wrong registers. So change C interface to use size_t (32-bits) instead + of off_t (64 bits), and convert here. +*/ +_pread: .globl _pread + mr r7,r6 + li r6,0 + li r0,153 + b sysgo +_mmap: .globl _mmap + mr r9,r8 + li r8,0 + li r0,197 +sysgo: + sc + li r3,-1 + blr + +_exit: .globl _exit + li r0,SYS_exit + b sysgo +_read: .globl _read + li r0,SYS_read + b sysgo +_open: .globl _open + li r0,SYS_open + b sysgo +_close: .globl _close + li r0,SYS_close + b sysgo +_mprotect: .globl _mprotect + li r0,SYS_mprotect + b sysgo +_munmap: .globl _munmap + li r0, SYS_munmap + b sysgo + +dyld_stub_binding_helper: .globl dyld_stub_binding_helper + b dyld_stub_binding_helper