diff --git a/src/conf.h b/src/conf.h index 2f33e8c5..403c2cca 100644 --- a/src/conf.h +++ b/src/conf.h @@ -456,6 +456,7 @@ private: #define UPX_F_VMLINUX_AMD64 27 #define UPX_F_VMLINUX_ARMEL 28 #define UPX_F_MACH_i386 29 +#define UPX_F_LINUX_ELF32_MIPSEL 30 #define UPX_F_PLAIN_TEXT 127 diff --git a/src/p_elf_enum.h b/src/p_elf_enum.h index f38c885b..263b4053 100644 --- a/src/p_elf_enum.h +++ b/src/p_elf_enum.h @@ -68,10 +68,13 @@ }; enum { // e_machine EM_386 = 3, + EM_MIPS = 8, + EM_MIPS_RS3_LE = 10, /* MIPS R3000 little-endian */ EM_PPC = 20, EM_PPC64 = 21, EM_ARM = 40, EM_X86_64 = 62 + }; enum { // e_version EV_CURRENT = 1 diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index 77e66b33..6b38dc75 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -141,6 +141,7 @@ PackLinuxElf64::checkEhdr(Elf64_Ehdr const *ehdr) const PackLinuxElf::PackLinuxElf(InputFile *f) : super(f), file_image(NULL), dynstr(NULL), sz_phdrs(0), sz_elf_hdrs(0), sz_pack2(0), + lg2_page(12), page_size(1u<getBytesWritten() + @@ -560,8 +572,6 @@ PackLinuxElf64amd::defineSymbols(Filter const *) } } } -#define PAGE_MASK (~0u<<12) -#define PAGE_SIZE (-PAGE_MASK) lsize = /*getLoaderSize()*/ 64 * 1024; // upper bound; avoid circularity acc_uint64l_t lo_va_stub = get_native64(&elfout.phdr[0].p_vaddr); acc_uint64l_t adrc; @@ -572,7 +582,7 @@ PackLinuxElf64amd::defineSymbols(Filter const *) unsigned lenm; unsigned lenu; len += (7&-lsize) + lsize; - bool const is_big = (lo_va_user < (lo_va_stub + len + 2*PAGE_SIZE)); + bool const is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); if (is_big) { set_native64( &elfout.ehdr.e_entry, get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); @@ -581,10 +591,10 @@ PackLinuxElf64amd::defineSymbols(Filter const *) lo_va_stub = lo_va_user; adrc = lo_va_stub; adrm = getbrk(phdri, get_native16(&ehdri.e_phnum)); - adru = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary + adru = page_mask & (~page_mask + adrm); // round up to page boundary adrx = adru + hlen; - lenm = PAGE_SIZE + len; - lenu = PAGE_SIZE + len; + lenm = page_size + len; + lenu = page_size + len; cntc = len >> 3; // over-estimate; corrected at runtime } else { @@ -592,12 +602,12 @@ PackLinuxElf64amd::defineSymbols(Filter const *) adrc = adrm; adru = lo_va_stub; adrx = lo_va_stub + hlen; - lenm = PAGE_SIZE; - lenu = PAGE_SIZE + len; + lenm = page_size; + lenu = page_size + len; cntc = 0; } - adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary - adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary + adrm = page_mask & (~page_mask + adrm); // round up to page boundary + adrc = page_mask & (~page_mask + adrc); // round up to page boundary linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion @@ -614,8 +624,6 @@ PackLinuxElf64amd::defineSymbols(Filter const *) #undef EI_NIDENT linker->defineSymbol("LENM", lenm); // len for map linker->defineSymbol("ADRM", adrm); // addr for map -#undef PAGE_SIZE -#undef PAGE_MASK //linker->dumpSymbols(); // debug } @@ -734,6 +742,19 @@ PackLinuxElf32armLe::buildLoader(Filter const *ft) stub_arm_linux_elf_fold, sizeof(stub_arm_linux_elf_fold), ft); } +static const +#include "stub/mipsel.r3000-linux.elf-entry.h" +static const +#include "stub/mipsel.r3000-linux.elf-fold.h" + +void +PackLinuxElf32mipsel::buildLoader(Filter const *ft) +{ + buildLinuxLoader( + stub_mipsel_r3000_linux_elf_entry, sizeof(stub_mipsel_r3000_linux_elf_entry), + stub_mipsel_r3000_linux_elf_fold, sizeof(stub_mipsel_r3000_linux_elf_fold), ft); +} + static const #include "stub/powerpc-linux.elf-entry.h" static const @@ -993,6 +1014,10 @@ PackLinuxElf32::generateElfHdr( cprElfHdr3 *const h3 = (cprElfHdr3 *)&elfout; memcpy(h3, proto, sizeof(*h3)); // reads beyond, but OK h3->ehdr.e_ident[Elf32_Ehdr::EI_OSABI] = ei_osabi; + if (Elf32_Ehdr::EM_MIPS==e_machine) { // MIPS R3000 FIXME + h3->ehdr.e_ident[Elf32_Ehdr::EI_OSABI] = Elf32_Ehdr::ELFOSABI_NONE; + h3->ehdr.e_flags = ehdri.e_flags; + } assert(get_native32(&h2->ehdr.e_phoff) == sizeof(Elf32_Ehdr)); h2->ehdr.e_shoff = 0; @@ -1006,19 +1031,33 @@ PackLinuxElf32::generateElfHdr( set_native32(&h2->phdr[0].p_filesz, sizeof(*h2)); // + identsize; h2->phdr[0].p_memsz = h2->phdr[0].p_filesz; + unsigned const e_phnum = get_native16(&ehdri.e_phnum); + Elf32_Phdr const *phdr = phdri; + for (unsigned j=0; j < e_phnum; ++phdr, ++j) { + if (phdr->PT_LOAD32 == get_native32(&phdr->p_type)) { + unsigned x = phdr->p_align >> lg2_page; + while (x>>=1) { + ++lg2_page; + } + } + } + page_size = 1u<phdr[j].p_align, page_size); + } + // Info for OS kernel to set the brk() if (brka) { -#define PAGE_MASK (~0u<<12) // linux-2.6.14 binfmt_elf.c: SIGKILL if (0==.p_memsz) on a page boundary - unsigned const brkb = brka | ((0==(~PAGE_MASK & brka)) ? 0x20 : 0); + unsigned const brkb = brka | ((0==(~page_mask & brka)) ? 0x20 : 0); set_native32(&h2->phdr[1].p_type, PT_LOAD32); // be sure - set_native32(&h2->phdr[1].p_offset, ~PAGE_MASK & brkb); + set_native32(&h2->phdr[1].p_offset, ~page_mask & brkb); set_native32(&h2->phdr[1].p_vaddr, brkb); set_native32(&h2->phdr[1].p_paddr, brkb); h2->phdr[1].p_filesz = 0; h2->phdr[1].p_memsz = 0; set_native32(&h2->phdr[1].p_flags, Elf32_Phdr::PF_R | Elf32_Phdr::PF_W); -#undef PAGE_MASK } if (ph.format==getFormat()) { assert(2==get_native16(&h2->ehdr.e_phnum)); @@ -1057,16 +1096,14 @@ PackOpenBSDElf32x86::generateElfHdr( set_native32(&h3->phdr[0].p_filesz, sizeof(*h3)+sizeof(elfnote)); // + identsize; h3->phdr[0].p_memsz = h3->phdr[0].p_filesz; -#define PAGE_MASK (~0u<<12) - unsigned const brkb = brka | ((0==(~PAGE_MASK & brka)) ? 0x20 : 0); + unsigned const brkb = brka | ((0==(~page_mask & brka)) ? 0x20 : 0); set_native32(&h3->phdr[1].p_type, PT_LOAD32); // be sure - set_native32(&h3->phdr[1].p_offset, ~PAGE_MASK & brkb); + set_native32(&h3->phdr[1].p_offset, ~page_mask & brkb); set_native32(&h3->phdr[1].p_vaddr, brkb); set_native32(&h3->phdr[1].p_paddr, brkb); h3->phdr[1].p_filesz = 0; h3->phdr[1].p_memsz = 0; set_native32(&h3->phdr[1].p_flags, Elf32_Phdr::PF_R | Elf32_Phdr::PF_W); -#undef PAGE_MASK set_native32(&h3->phdr[2].p_type, Elf32_Phdr::PT_NOTE); set_native32(&h3->phdr[2].p_offset, note_offset); @@ -1118,19 +1155,33 @@ PackLinuxElf64::generateElfHdr( set_native64(&h2->phdr[0].p_filesz, sizeof(*h2)); // + identsize; h2->phdr[0].p_memsz = h2->phdr[0].p_filesz; + unsigned const e_phnum = get_native16(&ehdri.e_phnum); + Elf64_Phdr const *phdr = phdri; + for (unsigned j=0; j < e_phnum; ++phdr, ++j) { + if (phdr->PT_LOAD64 == get_native64(&phdr->p_type)) { + unsigned x = phdr->p_align >> lg2_page; + while (x>>=1) { + ++lg2_page; + } + } + } + page_size = 1u <phdr[j].p_align, page_size); + } + // Info for OS kernel to set the brk() if (brka) { -#define PAGE_MASK (~0ul<<12) // linux-2.6.14 binfmt_elf.c: SIGKILL if (0==.p_memsz) on a page boundary - unsigned const brkb = brka | ((0==(~PAGE_MASK & brka)) ? 0x20 : 0); + unsigned const brkb = brka | ((0==(~page_mask & brka)) ? 0x20 : 0); set_native32(&h2->phdr[1].p_type, PT_LOAD32); // be sure - set_native64(&h2->phdr[1].p_offset, ~PAGE_MASK & brkb); + set_native64(&h2->phdr[1].p_offset, ~page_mask & brkb); set_native64(&h2->phdr[1].p_vaddr, brkb); set_native64(&h2->phdr[1].p_paddr, brkb); h2->phdr[1].p_filesz = 0; h2->phdr[1].p_memsz = 0; set_native32(&h2->phdr[1].p_flags, Elf64_Phdr::PF_R | Elf64_Phdr::PF_W); -#undef PAGE_MASK } if (ph.format==getFormat()) { assert(2==get_native16(&h2->ehdr.e_phnum)); @@ -1187,6 +1238,14 @@ void PackLinuxElf32armBe::pack1(OutputFile *fo, Filter &ft) generateElfHdr(fo, &h3, getbrk(phdri, get_native16(&ehdri.e_phnum)) ); } +void PackLinuxElf32mipsel::pack1(OutputFile *fo, Filter &ft) +{ + super::pack1(fo, ft); + cprElfHdr3 h3; + memcpy(&h3, stub_mipsel_r3000_linux_elf_fold, sizeof(Elf32_Ehdr) + 2*sizeof(Elf32_Phdr)); + generateElfHdr(fo, &h3, getbrk(phdri, get_native16(&ehdri.e_phnum)) ); +} + void PackLinuxElf32ppc::pack1(OutputFile *fo, Filter &ft) { super::pack1(fo, ft); @@ -1443,12 +1502,17 @@ PackLinuxElf32armLe::getFilters() const return ARM_getFilters(false); } +const int * +PackLinuxElf32mipsel::getFilters() const +{ + static const int f_none[] = { FT_END }; + return f_none; +} + void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/) { unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info); -#define PAGE_MASK (~0u<<12) -#define PAGE_SIZE (-PAGE_MASK) lsize = /*getLoaderSize()*/ 4 * 1024; // upper bound; avoid circularity unsigned const lo_va_user = 0x8000; // XXX unsigned lo_va_stub = get_native32(&elfout.phdr[0].p_vaddr); @@ -1465,17 +1529,15 @@ void PackLinuxElf32::ARM_defineSymbols(Filter const * /*ft*/) lo_va_stub = lo_va_user; adrc = lo_va_stub; adrm = getbrk(phdri, get_native16(&ehdri.e_phnum)); - adrx = hlen + (PAGE_MASK & (~PAGE_MASK + adrm)); // round up to page boundary + adrx = hlen + (page_mask & (~page_mask + adrm)); // round up to page boundary } - adrm = PAGE_MASK & (~PAGE_MASK + adrm); // round up to page boundary - adrc = PAGE_MASK & (~PAGE_MASK + adrc); // round up to page boundary + adrm = page_mask & (~page_mask + adrm); // round up to page boundary + adrc = page_mask & (~page_mask + adrc); // round up to page boundary linker->defineSymbol("CPR0", 4+ linker->getSymbolOffset("cpr0")); linker->defineSymbol("LENF", 4+ linker->getSymbolOffset("end_decompress")); linker->defineSymbol("ADRM", adrm); // addr for map -#undef PAGE_SIZE -#undef PAGE_MASK } void PackLinuxElf32armLe::defineSymbols(Filter const *ft) @@ -1488,6 +1550,82 @@ void PackLinuxElf32armBe::defineSymbols(Filter const *ft) ARM_defineSymbols(ft); } +void PackLinuxElf32mipsel::defineSymbols(Filter const * /*ft*/) +{ + unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info); + + // We want to know if compressed data, plus stub, plus a couple pages, + // will fit below the uncompressed program in memory. But we don't + // know the final total compressed size yet, so use the uncompressed + // size (total over all PT_LOAD32) as an upper bound. + unsigned len = 0; + unsigned lo_va_user = ~0u; // infinity + for (int j= get_native16(&ehdri.e_phnum); --j>=0; ) { + if (PT_LOAD32 == get_native32(&phdri[j].p_type)) { + len += (unsigned)get_native32(&phdri[j].p_filesz); + unsigned const va = get_native32(&phdri[j].p_vaddr); + if (va < lo_va_user) { + lo_va_user = va; + } + } + } + lsize = /*getLoaderSize()*/ 64 * 1024; // upper bound; avoid circularity + unsigned lo_va_stub = get_native64(&elfout.phdr[0].p_vaddr); + unsigned adrc; + unsigned adrm; + unsigned adru; + unsigned adrx; + unsigned cntc; + unsigned lenm; + unsigned lenu; + len += (7&-lsize) + lsize; + bool const is_big = (lo_va_user < (lo_va_stub + len + 2*page_size)); + if (is_big) { + set_native32( &elfout.ehdr.e_entry, + get_native32(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); + set_native32(&elfout.phdr[0].p_vaddr, lo_va_user); + set_native32(&elfout.phdr[0].p_paddr, lo_va_user); + lo_va_stub = lo_va_user; + adrc = lo_va_stub; + adrm = getbrk(phdri, get_native16(&ehdri.e_phnum)); + adru = page_mask & (~page_mask + adrm); // round up to page boundary + adrx = adru + hlen; + lenm = page_size + len; + lenu = page_size + len; + cntc = len >> 3; // over-estimate; corrected at runtime + } + else { + adrm = lo_va_stub + len; + adrc = adrm; + adru = lo_va_stub; + adrx = lo_va_stub + hlen; + lenm = page_size; + lenu = page_size + len; + cntc = 0; + } + adrm = page_mask & (~page_mask + adrm); // round up to page boundary + adrc = page_mask & (~page_mask + adrc); // round up to page boundary + + linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion + linker->defineSymbol("LENX", 0x2345); // FIXME + + // For actual moving, we need the true count, which depends on sz_pack2 + // and is not yet known. So the runtime stub detects "no move" + // if adrm==adrc, and otherwise uses actual sz_pack2 to compute cntc. + //linker->defineSymbol("CNTC", cntc); // count for copy + + linker->defineSymbol("LENU", lenu); // len for unmap + linker->defineSymbol("ADRC", adrc); // addr for copy + linker->defineSymbol("ADRU", adru); // addr for unmap +#define EI_NIDENT 16 /* */ + linker->defineSymbol("JMPU", EI_NIDENT -4 + lo_va_user); // unmap trampoline +#undef EI_NIDENT + linker->defineSymbol("LENM", lenm); // len for map + linker->defineSymbol("ADRM", adrm); // addr for map + + //linker->dumpSymbols(); // debug +} + void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft) { overlay_offset = sz_elf_hdrs + sizeof(linfo); @@ -1502,10 +1640,8 @@ void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft) // tries to make .bss, which requires PF_W. // But strict SELinux (or PaX, grSecurity) disallows PF_W with PF_X. #if 0 /*{*/ -#define PAGE_MASK (~0u<<12) // pre-calculate for benefit of runtime disappearing act via munmap() - set_native32(&elfout.phdr[0].p_memsz, PAGE_MASK & (~PAGE_MASK + len)); -#undef PAGE_MASK + set_native32(&elfout.phdr[0].p_memsz, page_mask & (~page_mask + len)); #else /*}{*/ set_native32(&elfout.phdr[0].p_memsz, len); #endif /*}*/ @@ -1552,10 +1688,8 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft) // tries to make .bss, which requires PF_W. // But strict SELinux (or PaX, grSecurity) disallows PF_W with PF_X. #if 0 /*{*/ -#define PAGE_MASK (~0u<<12) // pre-calculate for benefit of runtime disappearing act via munmap() - set_native64(&elfout.phdr[0].p_memsz, PAGE_MASK & (~PAGE_MASK + len)); -#undef PAGE_MASK + set_native64(&elfout.phdr[0].p_memsz, page_mask & (~page_mask + len)); #else /*}{*/ set_native64(&elfout.phdr[0].p_memsz, len); #endif /*}*/ @@ -1873,11 +2007,28 @@ PackLinuxElf32armLe::~PackLinuxElf32armLe() { } +PackLinuxElf32mipsel::PackLinuxElf32mipsel(InputFile *f) : super(f) +{ + e_machine = Elf32_Ehdr::EM_MIPS; + ei_class = Elf32_Ehdr::ELFCLASS32; + ei_data = Elf32_Ehdr::ELFDATA2LSB; + ei_osabi = Elf32_Ehdr::ELFOSABI_LINUX; +} + +PackLinuxElf32mipsel::~PackLinuxElf32mipsel() +{ +} + Linker* PackLinuxElf32armLe::newLinker() const { return new ElfLinkerArmLE(); } +Linker* PackLinuxElf32mipsel::newLinker() const +{ + return new ElfLinkerMipsLE(); +} + PackLinuxElf32armBe::PackLinuxElf32armBe(InputFile *f) : super(f) { e_machine = Elf32_Ehdr::EM_ARM; diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index a530e8a4..2f086c71 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -70,6 +70,8 @@ protected: unsigned sz_phdrs; // sizeof Phdr[] unsigned sz_elf_hdrs; // all Elf headers unsigned sz_pack2; // after pack2(), before loader + unsigned lg2_page; // log2(PAGE_SIZE) + unsigned page_size; // 1u<::pack(OutputFile *fo) f_len = shdr->sh_size; ++shdr; for (int j= -2+ ehdri.e_shnum; --j>=0; ++shdr) { + unsigned prev_end = shdr[-1].sh_size + shdr[-1].sh_offset; + prev_end += ~(-shdr[0].sh_addralign) & -prev_end; // align_up if ((Shdr::SHF_ALLOC & shdr->sh_flags) && (Shdr::SHF_EXECINSTR & shdr->sh_flags) - && shdr[0].sh_offset==(shdr[-1].sh_size + shdr[-1].sh_offset)) { + && shdr[0].sh_offset==prev_end) { f_len += shdr->sh_size; } else { @@ -347,7 +349,7 @@ void PackVmlinuxBase::pack(OutputFile *fo) } } } - else { // ft.buf_len already specified, or shdr[1] not instructions + else { // ft.buf_len already specified, or Shdr[1] not instructions f_ptr = ibuf; f_len = ph.u_len; } diff --git a/src/packmast.cpp b/src/packmast.cpp index 338a93bb..0cd26e14 100644 --- a/src/packmast.cpp +++ b/src/packmast.cpp @@ -243,6 +243,8 @@ Packer* PackMaster::visitAllPackers(visit_func_t func, InputFile *f, const optio return p; if ((p = func(new PackLinuxElf32ppc(f), user)) != NULL) return p; + if ((p = func(new PackLinuxElf32mipsel(f), user)) != NULL) + return p; if ((p = func(new PackLinuxI386sh(f), user)) != NULL) return p; } diff --git a/src/stub/Makefile b/src/stub/Makefile index 46f19cb9..d096d28e 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -88,6 +88,8 @@ STUBS += i386-linux.kernel.vmlinuz.h STUBS += i386-win32.pe.h STUBS += m68k-atari.tos.h STUBS += mipsel.r3000-ps1.h +STUBS += mipsel.r3000-linux.elf-entry.h +STUBS += mipsel.r3000-linux.elf-fold.h STUBS += powerpc-darwin.macho-entry.h STUBS += powerpc-darwin.macho-fold.h STUBS += powerpc-linux.elf-entry.h @@ -825,6 +827,42 @@ endif $(call tc,bin2h-c) tmp/$T.bin $@ +# /*********************************************************************** +# // mipsel.r3000-linux.elf +# ************************************************************************/ + +mipsel.r3000-linux.elf%.h : tc_list = mipsel.r3000-ps1 default +mipsel.r3000-linux.elf%.h : tc_bfdname = elf32-littlemips + +mipsel.r3000-linux.elf-entry.h : $(srcdir)/src/$$T.S +ifeq (1,1) + # info: we really need as-2.17 here + $(call tc,pp-as) -DPS1 $< -o - | $(RTRIM) > tmp/$T.i + $(call tc,as) tmp/$T.i -o tmp/$T.bin + $(call tc,gpp_mkdep) --mode=c --MMD=$@ $< --MF=tmp/$T.d +else + # info: as-2.16.1 as used by gcc-4.1.1 does _not_ work + $(call tc,gcc) -c -DPS1 -Wa,-O,-mno-pdr $< -o tmp/$T.bin +endif + $(call tc,f-embed_objinfo,tmp/$T.bin) + $(call tc,bin2h-c) tmp/$T.bin $@ + +mipsel.r3000-linux.elf-fold.h : tmp/$$T.o tmp/mipsel.r3000-linux.elf-main.o $(srcdir)/src/$$T.lds + $(call tc,ld) --strip-all -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin + $(call tc,f-objstrip,tmp/$T.bin) + $(call tc,sstrip) tmp/$T.bin + $(call tc,bin2h) tmp/$T.bin $@ + +tmp/mipsel.r3000-linux.elf-fold.o : $(srcdir)/src/$$T.S + $(call tc,gcc) -c $< -o $@ + $(call tc,f-objstrip,$@) + +tmp/mipsel.r3000-linux.elf-main.o : $(srcdir)/src/$$T.c + $(call tc,gcc) -c -Os $< -o $@ + $(call tc,f-objstrip,$@) + $(call tc,objdump) -dr $(tc_objdump_disasm_options) $@ | $(RTRIM) > $@.disasm + + # /*********************************************************************** # // powerpc-darwin.macho # ************************************************************************/ diff --git a/src/stub/mipsel.r3000-linux.elf-entry.h b/src/stub/mipsel.r3000-linux.elf-entry.h new file mode 100644 index 00000000..83be32f4 --- /dev/null +++ b/src/stub/mipsel.r3000-linux.elf-entry.h @@ -0,0 +1,675 @@ +/* mipsel.r3000-linux.elf-entry.h + created from mipsel.r3000-linux.elf-entry.bin, 10216 (0x27e8) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2007 Laszlo Molnar + Copyright (C) 2000-2007 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 + + */ + + +#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_SIZE 10216 +#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_ADLER32 0x3e427e50 +#define STUB_MIPSEL_R3000_LINUX_ELF_ENTRY_CRC32 0xc169b462 + +unsigned char stub_mipsel_r3000_linux_elf_entry[10216] = { +127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ + 1, 0, 8, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */ +232, 29, 0, 0, 1, 0, 0, 0, 52, 0, 0, 0, 0, 0, 40, 0, /* 0x 20 */ + 20, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 30 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 40 */ + 0, 0, 0, 0, 44, 0, 17, 4, 0, 0,247, 39, 0,128, 13, 60, /* 0x 50 */ + 33, 72,160, 1, 1, 0, 11, 36,194,119, 9, 0, 7, 0,169, 21, /* 0x 60 */ + 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36, /* 0x 70 */ +194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, 1, 0, 15, 36, /* 0x 80 */ + 5, 0,192, 17, 0, 0,174,144, 1, 0,165, 36, 0, 0, 14,161, /* 0x 90 */ +241,255, 0, 16, 1, 0, 8, 37,194,119, 9, 0, 7, 0,169, 21, /* 0x a0 */ + 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36, /* 0x b0 */ +194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, 64,120, 15, 0, /* 0x c0 */ + 33,120,238, 1,194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, /* 0x d0 */ + 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, /* 0x e0 */ + 64, 72, 9, 0, 1, 0, 41, 37, 13, 0,192, 21,254,255,238, 37, /* 0x f0 */ + 33,120,238, 1,194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, /* 0x 100 */ + 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, /* 0x 110 */ + 64, 72, 9, 0, 1, 0, 41, 37,223,255, 0, 16, 33,120,238, 1, /* 0x 120 */ + 13, 0,192, 21,253,255,239, 37,194,119, 9, 0, 7, 0,169, 21, /* 0x 130 */ + 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36, /* 0x 140 */ +194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, 33,120, 96, 1, /* 0x 150 */ + 11, 0, 0, 16, 1, 0,204, 49, 0, 0,174,144, 0,122, 15, 0, /* 0x 160 */ + 33,120,238, 1, 1, 0,238, 37,255,255,192, 17, 1, 0,165, 36, /* 0x 170 */ + 66,120, 15, 0, 1, 0,239, 37, 33, 88,224, 1, 1, 0,204, 49, /* 0x 180 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 190 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 1a0 */ + 1, 0, 41, 37, 35, 0,128, 21,254,255,204, 37, 12, 0,192, 17, /* 0x 1b0 */ + 1, 0, 12, 36,194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, /* 0x 1c0 */ + 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, /* 0x 1d0 */ + 64, 72, 9, 0, 1, 0, 41, 37, 22, 0, 0, 16, 33, 96,192, 1, /* 0x 1e0 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 1f0 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 200 */ + 1, 0, 41, 37, 64, 96, 12, 0, 33, 96,142, 1,194,119, 9, 0, /* 0x 210 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 220 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 230 */ +235,255,192, 17, 1, 5,238, 45, 5, 0,140, 37, 35, 96,142, 1, /* 0x 240 */ + 35,120, 15, 1, 0, 0,238,145,255,255,140, 37, 1, 0,239, 37, /* 0x 250 */ + 1, 0, 8, 37,251,255,128, 21,255,255, 14,161,127,255, 0, 16, /* 0x 260 */ +194,119, 9, 0, 0,128, 13, 60, 33, 72,160, 1, 1, 0, 11, 36, /* 0x 270 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 280 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 290 */ + 1, 0, 41, 37, 1, 0, 15, 36, 5, 0,192, 17, 0, 0,174,144, /* 0x 2a0 */ + 1, 0,165, 36, 0, 0, 14,161,241,255, 0, 16, 1, 0, 8, 37, /* 0x 2b0 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 2c0 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 2d0 */ + 1, 0, 41, 37, 64,120, 15, 0, 33,120,238, 1,194,119, 9, 0, /* 0x 2e0 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 2f0 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 300 */ + 13, 0,192, 21,254,255,238, 37, 33,120,207, 1,194,119, 9, 0, /* 0x 310 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 320 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 330 */ +223,255, 0, 16, 33,120,238, 1, 13, 0,192, 21,253,255,239, 37, /* 0x 340 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 350 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 360 */ + 1, 0, 41, 37, 33,120, 96, 1, 11, 0, 0, 16, 1, 0,204, 49, /* 0x 370 */ + 0, 0,174,144, 0,122, 15, 0, 33,120,238, 1, 1, 0,238, 37, /* 0x 380 */ +255,255,192, 17, 1, 0,165, 36, 66,120, 15, 0, 1, 0,239, 37, /* 0x 390 */ + 33, 88,224, 1, 1, 0,204, 49,194,119, 9, 0, 7, 0,169, 21, /* 0x 3a0 */ + 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36, /* 0x 3b0 */ +194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, 64, 96, 12, 0, /* 0x 3c0 */ + 33, 96,142, 1, 23, 0,128, 21,254,255,140, 37, 1, 0, 12, 36, /* 0x 3d0 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 3e0 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 3f0 */ + 1, 0, 41, 37, 64, 96, 12, 0, 33, 96,142, 1,194,119, 9, 0, /* 0x 400 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 410 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 420 */ +235,255,192, 17, 1, 5,238, 45, 4, 0,140, 37, 35, 96,142, 1, /* 0x 430 */ + 35,120, 15, 1, 0, 0,238,145,255,255,140, 37, 1, 0,239, 37, /* 0x 440 */ + 1, 0, 8, 37,251,255,128, 21,255,255, 14,161,137,255, 0, 16, /* 0x 450 */ +194,119, 9, 0, 0,128, 13, 60, 33, 72,160, 1, 1, 0, 11, 36, /* 0x 460 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 470 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 480 */ + 1, 0, 41, 37, 1, 0, 15, 36, 5, 0,192, 17, 0, 0,174,144, /* 0x 490 */ + 1, 0,165, 36, 0, 0, 14,161,241,255, 0, 16, 1, 0, 8, 37, /* 0x 4a0 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 4b0 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 4c0 */ + 1, 0, 41, 37, 64,120, 15, 0, 33,120,238, 1,194,119, 9, 0, /* 0x 4d0 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 4e0 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 4f0 */ +235,255,192, 17, 2, 0, 14, 36, 3, 0,238, 21,253,255,239, 37, /* 0x 500 */ + 8, 0, 0, 16, 33,120, 96, 1, 0, 0,174,144, 0,122, 15, 0, /* 0x 510 */ + 33,120,238, 1, 1, 0,239, 37,255,255,224, 17, 1, 0,165, 36, /* 0x 520 */ + 33, 88,224, 1,194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, /* 0x 530 */ + 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, /* 0x 540 */ + 64, 72, 9, 0, 1, 0, 41, 37, 33, 96,192, 1,194,119, 9, 0, /* 0x 550 */ + 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, 3, 0,169,136, /* 0x 560 */ + 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, 1, 0, 41, 37, /* 0x 570 */ + 64, 96, 12, 0, 33, 96,142, 1, 23, 0,128, 21,254,255,140, 37, /* 0x 580 */ + 1, 0, 12, 36,194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, /* 0x 590 */ + 0, 0,169,152, 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, /* 0x 5a0 */ + 64, 72, 9, 0, 1, 0, 41, 37, 64, 96, 12, 0, 33, 96,142, 1, /* 0x 5b0 */ +194,119, 9, 0, 7, 0,169, 21, 64, 72, 9, 0, 0, 0,169,152, /* 0x 5c0 */ + 3, 0,169,136, 4, 0,165, 36,194,119, 9, 0, 64, 72, 9, 0, /* 0x 5d0 */ + 1, 0, 41, 37,235,255,192, 17, 1, 13,238, 45, 4, 0,140, 37, /* 0x 5e0 */ + 35, 96,142, 1, 35,120, 15, 1, 0, 0,238,145,255,255,140, 37, /* 0x 5f0 */ + 1, 0,239, 37, 1, 0, 8, 37,251,255,128, 21,255,255, 14,161, /* 0x 600 */ +152,255, 0, 16,194,119, 9, 0, 0, 0,136,144, 1, 0,137,144, /* 0x 610 */ + 7, 0, 2, 49,194, 64, 8, 0, 0,250, 1, 36, 4, 8, 1, 1, /* 0x 620 */ + 96,241, 33, 36, 33,232,161, 3, 44, 0,161,175, 32, 0,161, 39, /* 0x 630 */ + 24, 0,161,175, 20, 0,167,175, 16, 0,166,175, 28, 0,167, 39, /* 0x 640 */ + 33, 48,160, 0, 2, 0,133, 36, 48, 0,164, 39, 2, 0,130,160, /* 0x 650 */ + 15, 0, 33, 49, 0, 0,129,160, 2, 73, 9, 0, 1, 0,137,160, /* 0x 660 */ + 9,248,224, 2, 44, 0,161,143, 40, 0,166,143, 32, 0,167,143, /* 0x 670 */ + 35,232,161, 3,200,255,189, 39, 52, 0,183,175, 48, 0,182,175, /* 0x 680 */ + 44, 0,181,175, 40, 0,180,175, 36, 0,179,175, 32, 0,178,175, /* 0x 690 */ + 28, 0,177,175, 24, 0,176,175, 33,168,160, 0, 12, 0,167,175, /* 0x 6a0 */ + 33,152, 0, 1, 16, 0,169,175, 20, 0,170,175, 4, 0,144, 36, /* 0x 6b0 */ + 2, 0,130,144, 1, 0, 3, 36, 4, 16, 67, 0,255,255, 66, 36, /* 0x 6c0 */ + 8, 0,162,175, 1, 0,130,144, 0, 0, 0, 0, 4, 16, 67, 0, /* 0x 6d0 */ +255,255, 66, 36, 4, 0,162,175, 0, 0,150,144, 0, 0,224,172, /* 0x 6e0 */ + 0, 0, 64,173, 1, 0,132,144, 0, 0, 0, 0, 33, 32,196, 2, /* 0x 6f0 */ + 0, 3, 2, 36, 4, 32,130, 0, 54, 7,132, 36, 33, 16, 0, 2, /* 0x 700 */ + 4, 0, 0, 16, 33, 88, 0, 0, 0, 4, 3, 36,254,255, 67,164, /* 0x 710 */ + 1, 0,107, 37,252,255,100, 21, 2, 0, 66, 36, 33, 56,166, 2, /* 0x 720 */ + 33,104,160, 2, 33,192, 0, 0, 33, 32, 0, 0, 35, 16,245, 0, /* 0x 730 */ +123, 2,130, 16, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x 740 */ + 37,192, 98, 0, 1, 0,132, 36, 5, 0, 2, 36,247,255,130, 20, /* 0x 750 */ + 1, 0,173, 37, 33, 80, 0, 0, 33,112, 0, 0, 33,144, 0, 0, /* 0x 760 */ + 1, 0, 17, 36, 1, 0, 20, 36, 1, 0, 23, 36, 0, 0,183,175, /* 0x 770 */ + 87, 2, 0, 16,255,255, 15, 36,255,255, 70, 52, 43, 16,207, 0, /* 0x 780 */ + 8, 0, 64, 20, 0, 0, 0, 0,101, 2,167, 17, 0,122, 15, 0, /* 0x 790 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x 7a0 */ + 1, 0,173, 37, 8, 0,163,143, 0, 0, 0, 0, 36, 40, 67, 1, /* 0x 7b0 */ + 0,201, 18, 0, 33, 16,185, 0, 64, 16, 2, 0, 33, 88, 2, 2, /* 0x 7c0 */ + 0, 0, 99,149,194, 18, 15, 0, 24, 0, 67, 0, 18, 96, 0, 0, /* 0x 7d0 */ + 43, 16, 12, 3,125, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x 7e0 */ + 67, 17, 2, 0, 33, 16, 98, 0, 0, 0, 98,165, 4, 0,163,143, /* 0x 7f0 */ + 0, 0, 0, 0, 36, 16, 67, 1, 4, 24,194, 2, 8, 0, 2, 36, /* 0x 800 */ + 35, 16, 86, 0, 7, 16, 78, 0, 33, 16, 98, 0, 64, 26, 2, 0, /* 0x 810 */ +192, 18, 2, 0, 35, 16, 67, 0, 33, 16, 2, 2,108, 14, 70, 36, /* 0x 820 */ + 7, 0, 66, 42, 3, 0, 64, 16, 33,120,128, 1, 85, 0, 0, 16, /* 0x 830 */ + 1, 0, 5, 36, 35, 16, 81, 1, 33, 16, 98, 2, 0, 0, 89,144, /* 0x 840 */ + 1, 0, 5, 36,255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, /* 0x 850 */ + 8, 0, 64, 20, 0, 0, 0, 0, 49, 2,167, 17, 0,122, 15, 0, /* 0x 860 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x 870 */ + 1, 0,173, 37, 64,200, 25, 0, 0, 1, 44, 51, 64, 16, 12, 0, /* 0x 880 */ + 33, 16,194, 0, 64,112, 5, 0, 33, 88, 78, 0, 0, 2, 99,149, /* 0x 890 */ +194, 18, 15, 0, 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, /* 0x 8a0 */ + 9, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x 8b0 */ + 33, 16, 98, 0, 0, 2, 98,165, 41, 0,128, 21, 33, 40,192, 1, /* 0x 8c0 */ + 9, 0, 0, 16, 33,120,128, 0, 35,120,228, 1, 35,192, 4, 3, /* 0x 8d0 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 2, 98,165, 1, 0,162, 36, /* 0x 8e0 */ + 40, 0,128, 17, 33, 40,162, 0, 0, 1,162, 40, 37, 0, 64, 16, /* 0x 8f0 */ +255, 0, 2, 60,213,255, 0, 16,255,255, 66, 52,255,255, 66, 52, /* 0x 900 */ + 43, 16, 79, 0, 9, 0, 64, 20, 64, 96, 5, 0, 4, 2,167, 17, /* 0x 910 */ + 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x 920 */ + 37,192, 98, 0, 1, 0,173, 37, 64, 96, 5, 0, 33, 88,204, 0, /* 0x 930 */ + 0, 0, 99,149,194, 18, 15, 0, 24, 0, 67, 0, 18, 32, 0, 0, /* 0x 940 */ + 43, 16, 4, 3, 8, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x 950 */ + 67, 17, 2, 0, 33, 16, 98, 0, 0, 0, 98,165, 33, 40,128, 1, /* 0x 960 */ + 8, 0, 0, 16, 33,120,128, 0, 35,120,228, 1, 35,192, 4, 3, /* 0x 970 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 0, 98,165, 1, 0,162, 36, /* 0x 980 */ + 33, 40,162, 0, 0, 1,162, 40,220,255, 64, 20,255, 0, 2, 60, /* 0x 990 */ +255, 0,174, 48, 33, 16,106, 2, 0, 0, 78,160, 4, 0, 66, 42, /* 0x 9a0 */ + 3, 0, 64, 16, 1, 0, 67, 37,200, 1, 0, 16, 33,144, 0, 0, /* 0x 9b0 */ + 10, 0, 66, 42, 3, 0, 64, 16, 0, 0, 0, 0,195, 1, 0, 16, /* 0x 9c0 */ +253,255, 82, 38,193, 1, 0, 16,250,255, 82, 38, 35, 32,236, 1, /* 0x 9d0 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 0, 98,165, 43, 16,196, 0, /* 0x 9e0 */ + 8, 0, 64, 20, 35,192, 12, 3,205, 1,167, 17, 0, 34, 4, 0, /* 0x 9f0 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x a00 */ + 1, 0,173, 37, 64, 16, 18, 0, 33,112, 2, 2,128, 1,195,149, /* 0x a10 */ +194, 18, 4, 0, 24, 0, 67, 0, 18, 96, 0, 0, 43, 16, 12, 3, /* 0x a20 */ + 15, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x a30 */ + 33, 16, 98, 0,128, 1,194,165, 7, 0, 66, 42, 2, 0, 64, 20, /* 0x a40 */ + 33,144, 0, 0, 3, 0, 18, 36,100, 6, 14, 38, 0, 0,183,175, /* 0x a50 */ + 33,184,128, 2, 33,160, 32, 2,144, 0, 0, 16, 33, 88,128, 1, /* 0x a60 */ + 35, 88,140, 0, 66, 17, 3, 0, 35, 16, 98, 0,128, 1,194,165, /* 0x a70 */ + 43, 16,203, 0, 8, 0, 64, 20, 35,192, 12, 3,168, 1,167, 17, /* 0x a80 */ + 0, 90, 11, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x a90 */ + 37,192, 98, 0, 1, 0,173, 37,152, 1,195,149,194, 18, 11, 0, /* 0x aa0 */ + 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, 50, 0, 64, 16, /* 0x ab0 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x ac0 */ +152, 1,194,165, 0, 1, 2, 60, 43, 16,130, 0, 8, 0, 64, 16, /* 0x ad0 */ + 33, 88,128, 0,146, 1,167, 17, 0, 90, 4, 0, 0, 26, 24, 0, /* 0x ae0 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x af0 */ + 64, 16, 25, 0, 33, 24, 2, 2, 64, 16, 5, 0, 33, 32, 98, 0, /* 0x b00 */ +224, 1,131,148,194, 18, 11, 0, 24, 0, 67, 0, 18, 96, 0, 0, /* 0x b10 */ + 43, 16, 12, 3, 18, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x b20 */ + 67, 17, 2, 0, 33, 16, 98, 0,125, 1, 64, 17,224, 1,130,164, /* 0x b30 */ + 7, 0, 66, 42, 2, 0, 64, 20, 9, 0, 18, 36, 11, 0, 18, 36, /* 0x b40 */ + 35, 16, 81, 1, 33, 16, 98, 2, 0, 0, 78,144, 33, 16,106, 2, /* 0x b50 */ + 0, 0, 78,160, 1, 0, 67, 37, 92, 1, 0, 16, 33,120,128, 1, /* 0x b60 */ + 35, 88,108, 1, 35,192, 12, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x b70 */ + 69, 0, 0, 16,224, 1,130,164, 35, 88,100, 1, 66, 17, 3, 0, /* 0x b80 */ + 35, 16, 98, 0,152, 1,194,165, 43, 16,203, 0, 8, 0, 64, 20, /* 0x b90 */ + 35,192, 4, 3, 98, 1,167, 17, 0, 90, 11, 0, 0, 26, 24, 0, /* 0x ba0 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x bb0 */ +176, 1,195,149,194, 18, 11, 0, 24, 0, 67, 0, 18, 32, 0, 0, /* 0x bc0 */ + 43, 16, 4, 3, 7, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x bd0 */ + 67, 17, 2, 0, 33, 16, 98, 0,176, 1,194,165, 28, 0, 0, 16, /* 0x be0 */ + 33, 16,128, 2, 35, 88,100, 1, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x bf0 */ +176, 1,194,165, 43, 16,203, 0, 8, 0, 64, 20, 35,192, 4, 3, /* 0x c00 */ + 71, 1,167, 17, 0, 90, 11, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x c10 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37,200, 1,195,149, /* 0x c20 */ +194, 18, 11, 0, 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, /* 0x c30 */ + 11, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x c40 */ + 33, 16, 98, 0,200, 1,194,165, 33, 16,224, 2, 33,184,128, 2, /* 0x c50 */ + 33,160, 32, 2, 33,136, 64, 0, 11, 0, 0, 16, 33, 88,128, 0, /* 0x c60 */ + 35, 88,100, 1, 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x c70 */ +200, 1,194,165, 0, 0,162,143, 0, 0,183,175, 33,184,128, 2, /* 0x c80 */ + 33,160, 32, 2, 33,136, 64, 0, 7, 0, 66, 42, 2, 0, 64, 20, /* 0x c90 */ + 8, 0, 18, 36, 11, 0, 18, 36,104, 10, 14, 38,255, 0, 2, 60, /* 0x ca0 */ +255,255, 76, 52, 43, 16,139, 1, 8, 0, 64, 20, 0, 0, 0, 0, /* 0x cb0 */ + 27, 1,167, 17, 0, 90, 11, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x cc0 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 0, 0,195,149, /* 0x cd0 */ +194, 18, 11, 0, 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, /* 0x ce0 */ + 12, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x cf0 */ + 33, 16, 98, 0, 0, 0,194,165, 0, 17, 5, 0, 33, 16,194, 1, /* 0x d00 */ + 4, 0, 69, 36, 33,120,128, 0, 3, 0, 8, 36, 41, 0, 0, 16, /* 0x d10 */ + 33, 48, 0, 0, 35, 88,100, 1, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x d20 */ + 0, 0,194,165, 43, 16,139, 1, 8, 0, 64, 20, 35,192, 4, 3, /* 0x d30 */ +251, 0,167, 17, 0, 90, 11, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x d40 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 2, 0,195,149, /* 0x d50 */ +194, 18, 11, 0, 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, /* 0x d60 */ + 12, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x d70 */ + 33, 16, 98, 0, 2, 0,194,165, 0, 17, 5, 0, 33, 16,194, 1, /* 0x d80 */ + 4, 1, 69, 36, 33,120,128, 0, 3, 0, 8, 36, 9, 0, 0, 16, /* 0x d90 */ + 8, 0, 6, 36, 35,120,100, 1, 35,192, 4, 3, 66, 17, 3, 0, /* 0x da0 */ + 35, 16, 98, 0, 2, 0,194,165, 4, 2,197, 37, 8, 0, 8, 36, /* 0x db0 */ + 16, 0, 6, 36, 33,112, 0, 1, 1, 0, 25, 36,255, 0, 2, 60, /* 0x dc0 */ +255,255, 66, 52, 43, 16, 79, 0, 9, 0, 64, 20, 64, 96, 25, 0, /* 0x dd0 */ +211, 0,167, 17, 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x de0 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 64, 96, 25, 0, /* 0x df0 */ + 33, 88,172, 0, 0, 0, 99,149,194, 18, 15, 0, 24, 0, 67, 0, /* 0x e00 */ + 18, 32, 0, 0, 43, 16, 4, 3, 8, 0, 64, 16, 0, 8, 2, 36, /* 0x e10 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, 0, 0, 98,165, /* 0x e20 */ + 33,200,128, 1, 8, 0, 0, 16, 33,120,128, 0, 35,120,228, 1, /* 0x e30 */ + 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, 0, 0, 98,165, /* 0x e40 */ + 1, 0, 34, 39, 33,200, 34, 3,255,255,206, 37,220,255,192, 21, /* 0x e50 */ +255, 0, 2, 60, 1, 0, 2, 36, 4, 16, 2, 1, 35, 16, 34, 3, /* 0x e60 */ + 33, 72, 70, 0, 4, 0, 66, 42,134, 0, 64, 16, 4, 0, 34, 41, /* 0x e70 */ + 2, 0, 64, 20, 33, 24, 32, 1, 3, 0, 3, 36,192, 17, 3, 0, /* 0x e80 */ + 33, 16, 2, 2, 96, 3, 70, 36, 1, 0, 14, 36, 6, 0, 25, 36, /* 0x e90 */ +255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, 9, 0, 64, 20, /* 0x ea0 */ + 64, 96, 14, 0,158, 0,167, 17, 0,122, 15, 0, 0, 26, 24, 0, /* 0x eb0 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x ec0 */ + 64, 96, 14, 0, 33, 88,204, 0, 0, 0, 99,149,194, 18, 15, 0, /* 0x ed0 */ + 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, 8, 0, 64, 16, /* 0x ee0 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x ef0 */ + 0, 0, 98,165, 33,112,128, 1, 8, 0, 0, 16, 33,120,128, 0, /* 0x f00 */ + 35,120,228, 1, 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x f10 */ + 0, 0, 98,165, 1, 0,194, 37, 33,112,194, 1,255,255, 57, 39, /* 0x f20 */ +220,255, 32, 23,255, 0, 2, 60,192,255,195, 37, 4, 0, 98, 40, /* 0x f30 */ + 80, 0, 64, 20, 33,112, 96, 0, 67, 32, 3, 0, 1, 0, 98, 48, /* 0x f40 */ + 2, 0, 75, 52, 14, 0, 98, 40, 8, 0, 64, 16,255,255,153, 36, /* 0x f50 */ + 4,112, 43, 3, 64, 16, 14, 0, 33, 32, 2, 2, 64, 16, 3, 0, /* 0x f60 */ + 35, 16,130, 0, 26, 0, 0, 16, 94, 5, 72, 36,251,255,132, 36, /* 0x f70 */ +255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, 8, 0, 64, 20, /* 0x f80 */ + 0, 0, 0, 0,102, 0,167, 17, 0,122, 15, 0, 0, 26, 24, 0, /* 0x f90 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x fa0 */ + 66,120, 15, 0, 43, 16, 15, 3, 3, 0, 64, 20, 64, 88, 11, 0, /* 0x fb0 */ + 35,192, 15, 3, 1, 0,107, 53,255,255,132, 36,237,255,128, 20, /* 0x fc0 */ +255, 0, 2, 60, 68, 6, 8, 38, 0,113, 11, 0, 4, 0, 25, 36, /* 0x fd0 */ + 1, 0, 6, 36, 1, 0, 5, 36,255, 0, 2, 60,255,255, 66, 52, /* 0x fe0 */ + 43, 16, 79, 0, 9, 0, 64, 20, 64, 96, 5, 0, 76, 0,167, 17, /* 0x ff0 */ + 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x1000 */ + 37,192, 98, 0, 1, 0,173, 37, 64, 96, 5, 0, 33, 88, 12, 1, /* 0x1010 */ + 0, 0, 99,149,194, 18, 15, 0, 24, 0, 67, 0, 18, 32, 0, 0, /* 0x1020 */ + 43, 16, 4, 3, 8, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x1030 */ + 67, 17, 2, 0, 33, 16, 98, 0, 0, 0, 98,165, 33, 40,128, 1, /* 0x1040 */ + 9, 0, 0, 16, 33,120,128, 0, 35,120,228, 1, 35,192, 4, 3, /* 0x1050 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 0, 98,165, 1, 0,162, 36, /* 0x1060 */ + 33, 40,162, 0, 37,112,198, 1,255,255, 57, 39,218,255, 32, 23, /* 0x1070 */ + 64, 48, 6, 0, 1, 0,209, 37, 26, 0, 32, 18,255, 0, 2, 60, /* 0x1080 */ + 7, 0, 82, 38, 43, 16, 81, 1, 38, 0, 64, 20, 1, 0, 2, 36, /* 0x1090 */ + 35, 16, 81, 1, 33, 88, 98, 2, 33, 32,106, 2, 33, 24, 64, 1, /* 0x10a0 */ + 0, 0,110,145, 1, 0, 99, 36, 33, 16, 73, 1, 2, 0, 66, 36, /* 0x10b0 */ + 6, 0, 98, 16, 0, 0,142,160, 1, 0,107, 37, 16, 0,162,143, /* 0x10c0 */ + 0, 0, 0, 0,246,255, 98, 20, 1, 0,132, 36, 33, 80, 96, 0, /* 0x10d0 */ + 16, 0,163,143, 0, 0, 0, 0, 43, 16, 67, 1,166,253, 64, 20, /* 0x10e0 */ +255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, 4, 0, 64, 20, /* 0x10f0 */ + 35, 40,181, 1, 10, 0,167, 17, 1, 0,173, 37, 35, 40,181, 1, /* 0x1100 */ + 12, 0,162,143, 0, 0, 0, 0, 0, 0, 69,172, 20, 0,163,143, /* 0x1110 */ + 0, 0, 0, 0, 0, 0,106,172, 2, 0, 0, 16, 33, 16, 0, 0, /* 0x1120 */ + 1, 0, 2, 36, 52, 0,183,143, 48, 0,182,143, 44, 0,181,143, /* 0x1130 */ + 40, 0,180,143, 36, 0,179,143, 32, 0,178,143, 28, 0,177,143, /* 0x1140 */ + 24, 0,176,143, 8, 0,224, 3, 56, 0,189, 39,200,255,189, 39, /* 0x1150 */ + 52, 0,183,175, 48, 0,182,175, 44, 0,181,175, 40, 0,180,175, /* 0x1160 */ + 36, 0,179,175, 32, 0,178,175, 28, 0,177,175, 24, 0,176,175, /* 0x1170 */ + 33,168,160, 0, 12, 0,167,175, 33,152, 0, 1, 16, 0,169,175, /* 0x1180 */ + 20, 0,170,175, 4, 0,144, 36, 2, 0,130,144, 1, 0, 3, 36, /* 0x1190 */ + 4, 16, 67, 0,255,255, 66, 36, 8, 0,162,175, 1, 0,130,144, /* 0x11a0 */ + 0, 0, 0, 0, 4, 16, 67, 0,255,255, 66, 36, 4, 0,162,175, /* 0x11b0 */ + 0, 0,150,144, 0, 0,224,172, 0, 0, 64,173, 1, 0,132,144, /* 0x11c0 */ + 0, 0, 0, 0, 33, 32,196, 2, 0, 3, 2, 36, 4, 32,130, 0, /* 0x11d0 */ + 54, 7,132, 36, 33, 16, 0, 2, 4, 0, 0, 16, 33, 88, 0, 0, /* 0x11e0 */ + 0, 4, 3, 36,254,255, 67,164, 1, 0,107, 37,252,255,100, 21, /* 0x11f0 */ + 2, 0, 66, 36, 33, 56,166, 2, 33,104,160, 2, 33,192, 0, 0, /* 0x1200 */ + 33, 32, 0, 0, 35, 16,245, 0,123, 2,130, 16, 0, 26, 24, 0, /* 0x1210 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,132, 36, /* 0x1220 */ + 5, 0, 2, 36,247,255,130, 20, 1, 0,173, 37, 33, 80, 0, 0, /* 0x1230 */ + 33,112, 0, 0, 33,144, 0, 0, 1, 0, 17, 36, 1, 0, 20, 36, /* 0x1240 */ + 1, 0, 23, 36, 0, 0,183,175, 87, 2, 0, 16,255,255, 15, 36, /* 0x1250 */ +255,255, 70, 52, 43, 16,207, 0, 8, 0, 64, 20, 0, 0, 0, 0, /* 0x1260 */ +101, 2,167, 17, 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x1270 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 8, 0,163,143, /* 0x1280 */ + 0, 0, 0, 0, 36, 40, 67, 1, 0,201, 18, 0, 33, 16,185, 0, /* 0x1290 */ + 64, 16, 2, 0, 33, 88, 2, 2, 0, 0, 99,149,194, 18, 15, 0, /* 0x12a0 */ + 24, 0, 67, 0, 18, 96, 0, 0, 43, 16, 12, 3,125, 0, 64, 16, /* 0x12b0 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x12c0 */ + 0, 0, 98,165, 4, 0,163,143, 0, 0, 0, 0, 36, 16, 67, 1, /* 0x12d0 */ + 4, 24,194, 2, 8, 0, 2, 36, 35, 16, 86, 0, 7, 16, 78, 0, /* 0x12e0 */ + 33, 16, 98, 0, 64, 26, 2, 0,192, 18, 2, 0, 35, 16, 67, 0, /* 0x12f0 */ + 33, 16, 2, 2,108, 14, 70, 36, 7, 0, 66, 42, 3, 0, 64, 16, /* 0x1300 */ + 33,120,128, 1, 85, 0, 0, 16, 1, 0, 5, 36, 35, 16, 81, 1, /* 0x1310 */ + 33, 16, 98, 2, 0, 0, 89,144, 1, 0, 5, 36,255, 0, 2, 60, /* 0x1320 */ +255,255, 66, 52, 43, 16, 79, 0, 8, 0, 64, 20, 0, 0, 0, 0, /* 0x1330 */ + 49, 2,167, 17, 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x1340 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 64,200, 25, 0, /* 0x1350 */ + 0, 1, 44, 51, 64, 16, 12, 0, 33, 16,194, 0, 64,112, 5, 0, /* 0x1360 */ + 33, 88, 78, 0, 0, 2, 99,149,194, 18, 15, 0, 24, 0, 67, 0, /* 0x1370 */ + 18, 32, 0, 0, 43, 16, 4, 3, 9, 0, 64, 16, 0, 8, 2, 36, /* 0x1380 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, 0, 2, 98,165, /* 0x1390 */ + 41, 0,128, 21, 33, 40,192, 1, 9, 0, 0, 16, 33,120,128, 0, /* 0x13a0 */ + 35,120,228, 1, 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x13b0 */ + 0, 2, 98,165, 1, 0,162, 36, 40, 0,128, 17, 33, 40,162, 0, /* 0x13c0 */ + 0, 1,162, 40, 37, 0, 64, 16,255, 0, 2, 60,213,255, 0, 16, /* 0x13d0 */ +255,255, 66, 52,255,255, 66, 52, 43, 16, 79, 0, 9, 0, 64, 20, /* 0x13e0 */ + 64, 96, 5, 0, 4, 2,167, 17, 0,122, 15, 0, 0, 26, 24, 0, /* 0x13f0 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x1400 */ + 64, 96, 5, 0, 33, 88,204, 0, 0, 0, 99,149,194, 18, 15, 0, /* 0x1410 */ + 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, 8, 0, 64, 16, /* 0x1420 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x1430 */ + 0, 0, 98,165, 33, 40,128, 1, 8, 0, 0, 16, 33,120,128, 0, /* 0x1440 */ + 35,120,228, 1, 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x1450 */ + 0, 0, 98,165, 1, 0,162, 36, 33, 40,162, 0, 0, 1,162, 40, /* 0x1460 */ +220,255, 64, 20,255, 0, 2, 60,255, 0,174, 48, 33, 16,106, 2, /* 0x1470 */ + 0, 0, 78,160, 4, 0, 66, 42, 3, 0, 64, 16, 1, 0, 67, 37, /* 0x1480 */ +200, 1, 0, 16, 33,144, 0, 0, 10, 0, 66, 42, 3, 0, 64, 16, /* 0x1490 */ + 0, 0, 0, 0,195, 1, 0, 16,253,255, 82, 38,193, 1, 0, 16, /* 0x14a0 */ +250,255, 82, 38, 35, 32,236, 1, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x14b0 */ + 0, 0, 98,165, 43, 16,196, 0, 8, 0, 64, 20, 35,192, 12, 3, /* 0x14c0 */ +205, 1,167, 17, 0, 34, 4, 0, 0, 26, 24, 0, 0, 0,162,145, /* 0x14d0 */ + 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, 64, 16, 18, 0, /* 0x14e0 */ + 33,112, 2, 2,128, 1,195,149,194, 18, 4, 0, 24, 0, 67, 0, /* 0x14f0 */ + 18, 96, 0, 0, 43, 16, 12, 3, 15, 0, 64, 16, 0, 8, 2, 36, /* 0x1500 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0,128, 1,194,165, /* 0x1510 */ + 7, 0, 66, 42, 2, 0, 64, 20, 33,144, 0, 0, 3, 0, 18, 36, /* 0x1520 */ +100, 6, 14, 38, 0, 0,183,175, 33,184,128, 2, 33,160, 32, 2, /* 0x1530 */ +144, 0, 0, 16, 33, 88,128, 1, 35, 88,140, 0, 66, 17, 3, 0, /* 0x1540 */ + 35, 16, 98, 0,128, 1,194,165, 43, 16,203, 0, 8, 0, 64, 20, /* 0x1550 */ + 35,192, 12, 3,168, 1,167, 17, 0, 90, 11, 0, 0, 26, 24, 0, /* 0x1560 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x1570 */ +152, 1,195,149,194, 18, 11, 0, 24, 0, 67, 0, 18, 32, 0, 0, /* 0x1580 */ + 43, 16, 4, 3, 50, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x1590 */ + 67, 17, 2, 0, 33, 16, 98, 0,152, 1,194,165, 0, 1, 2, 60, /* 0x15a0 */ + 43, 16,130, 0, 8, 0, 64, 16, 33, 88,128, 0,146, 1,167, 17, /* 0x15b0 */ + 0, 90, 4, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x15c0 */ + 37,192, 98, 0, 1, 0,173, 37, 64, 16, 25, 0, 33, 24, 2, 2, /* 0x15d0 */ + 64, 16, 5, 0, 33, 32, 98, 0,224, 1,131,148,194, 18, 11, 0, /* 0x15e0 */ + 24, 0, 67, 0, 18, 96, 0, 0, 43, 16, 12, 3, 18, 0, 64, 16, /* 0x15f0 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x1600 */ +125, 1, 64, 17,224, 1,130,164, 7, 0, 66, 42, 2, 0, 64, 20, /* 0x1610 */ + 9, 0, 18, 36, 11, 0, 18, 36, 35, 16, 81, 1, 33, 16, 98, 2, /* 0x1620 */ + 0, 0, 78,144, 33, 16,106, 2, 0, 0, 78,160, 1, 0, 67, 37, /* 0x1630 */ + 92, 1, 0, 16, 33,120,128, 1, 35, 88,108, 1, 35,192, 12, 3, /* 0x1640 */ + 66, 17, 3, 0, 35, 16, 98, 0, 69, 0, 0, 16,224, 1,130,164, /* 0x1650 */ + 35, 88,100, 1, 66, 17, 3, 0, 35, 16, 98, 0,152, 1,194,165, /* 0x1660 */ + 43, 16,203, 0, 8, 0, 64, 20, 35,192, 4, 3, 98, 1,167, 17, /* 0x1670 */ + 0, 90, 11, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x1680 */ + 37,192, 98, 0, 1, 0,173, 37,176, 1,195,149,194, 18, 11, 0, /* 0x1690 */ + 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, 7, 0, 64, 16, /* 0x16a0 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x16b0 */ +176, 1,194,165, 28, 0, 0, 16, 33, 16,128, 2, 35, 88,100, 1, /* 0x16c0 */ + 66, 17, 3, 0, 35, 16, 98, 0,176, 1,194,165, 43, 16,203, 0, /* 0x16d0 */ + 8, 0, 64, 20, 35,192, 4, 3, 71, 1,167, 17, 0, 90, 11, 0, /* 0x16e0 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x16f0 */ + 1, 0,173, 37,200, 1,195,149,194, 18, 11, 0, 24, 0, 67, 0, /* 0x1700 */ + 18, 32, 0, 0, 43, 16, 4, 3, 11, 0, 64, 16, 0, 8, 2, 36, /* 0x1710 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0,200, 1,194,165, /* 0x1720 */ + 33, 16,224, 2, 33,184,128, 2, 33,160, 32, 2, 33,136, 64, 0, /* 0x1730 */ + 11, 0, 0, 16, 33, 88,128, 0, 35, 88,100, 1, 35,192, 4, 3, /* 0x1740 */ + 66, 17, 3, 0, 35, 16, 98, 0,200, 1,194,165, 0, 0,162,143, /* 0x1750 */ + 0, 0,183,175, 33,184,128, 2, 33,160, 32, 2, 33,136, 64, 0, /* 0x1760 */ + 7, 0, 66, 42, 2, 0, 64, 20, 8, 0, 18, 36, 11, 0, 18, 36, /* 0x1770 */ +104, 10, 14, 38,255, 0, 2, 60,255,255, 76, 52, 43, 16,139, 1, /* 0x1780 */ + 8, 0, 64, 20, 0, 0, 0, 0, 27, 1,167, 17, 0, 90, 11, 0, /* 0x1790 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x17a0 */ + 1, 0,173, 37, 0, 0,195,149,194, 18, 11, 0, 24, 0, 67, 0, /* 0x17b0 */ + 18, 32, 0, 0, 43, 16, 4, 3, 12, 0, 64, 16, 0, 8, 2, 36, /* 0x17c0 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, 0, 0,194,165, /* 0x17d0 */ + 0, 17, 5, 0, 33, 16,194, 1, 4, 0, 69, 36, 33,120,128, 0, /* 0x17e0 */ + 3, 0, 8, 36, 41, 0, 0, 16, 33, 48, 0, 0, 35, 88,100, 1, /* 0x17f0 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 0,194,165, 43, 16,139, 1, /* 0x1800 */ + 8, 0, 64, 20, 35,192, 4, 3,251, 0,167, 17, 0, 90, 11, 0, /* 0x1810 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x1820 */ + 1, 0,173, 37, 2, 0,195,149,194, 18, 11, 0, 24, 0, 67, 0, /* 0x1830 */ + 18, 32, 0, 0, 43, 16, 4, 3, 12, 0, 64, 16, 0, 8, 2, 36, /* 0x1840 */ + 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, 2, 0,194,165, /* 0x1850 */ + 0, 17, 5, 0, 33, 16,194, 1, 4, 1, 69, 36, 33,120,128, 0, /* 0x1860 */ + 3, 0, 8, 36, 9, 0, 0, 16, 8, 0, 6, 36, 35,120,100, 1, /* 0x1870 */ + 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, 2, 0,194,165, /* 0x1880 */ + 4, 2,197, 37, 8, 0, 8, 36, 16, 0, 6, 36, 33,112, 0, 1, /* 0x1890 */ + 1, 0, 25, 36,255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, /* 0x18a0 */ + 9, 0, 64, 20, 64, 96, 25, 0,211, 0,167, 17, 0,122, 15, 0, /* 0x18b0 */ + 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, /* 0x18c0 */ + 1, 0,173, 37, 64, 96, 25, 0, 33, 88,172, 0, 0, 0, 99,149, /* 0x18d0 */ +194, 18, 15, 0, 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, /* 0x18e0 */ + 8, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, /* 0x18f0 */ + 33, 16, 98, 0, 0, 0, 98,165, 33,200,128, 1, 8, 0, 0, 16, /* 0x1900 */ + 33,120,128, 0, 35,120,228, 1, 35,192, 4, 3, 66, 17, 3, 0, /* 0x1910 */ + 35, 16, 98, 0, 0, 0, 98,165, 1, 0, 34, 39, 33,200, 34, 3, /* 0x1920 */ +255,255,206, 37,220,255,192, 21,255, 0, 2, 60, 1, 0, 2, 36, /* 0x1930 */ + 4, 16, 2, 1, 35, 16, 34, 3, 33, 72, 70, 0, 4, 0, 66, 42, /* 0x1940 */ +134, 0, 64, 16, 4, 0, 34, 41, 2, 0, 64, 20, 33, 24, 32, 1, /* 0x1950 */ + 3, 0, 3, 36,192, 17, 3, 0, 33, 16, 2, 2, 96, 3, 70, 36, /* 0x1960 */ + 1, 0, 14, 36, 6, 0, 25, 36,255, 0, 2, 60,255,255, 66, 52, /* 0x1970 */ + 43, 16, 79, 0, 9, 0, 64, 20, 64, 96, 14, 0,158, 0,167, 17, /* 0x1980 */ + 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x1990 */ + 37,192, 98, 0, 1, 0,173, 37, 64, 96, 14, 0, 33, 88,204, 0, /* 0x19a0 */ + 0, 0, 99,149,194, 18, 15, 0, 24, 0, 67, 0, 18, 32, 0, 0, /* 0x19b0 */ + 43, 16, 4, 3, 8, 0, 64, 16, 0, 8, 2, 36, 35, 16, 67, 0, /* 0x19c0 */ + 67, 17, 2, 0, 33, 16, 98, 0, 0, 0, 98,165, 33,112,128, 1, /* 0x19d0 */ + 8, 0, 0, 16, 33,120,128, 0, 35,120,228, 1, 35,192, 4, 3, /* 0x19e0 */ + 66, 17, 3, 0, 35, 16, 98, 0, 0, 0, 98,165, 1, 0,194, 37, /* 0x19f0 */ + 33,112,194, 1,255,255, 57, 39,220,255, 32, 23,255, 0, 2, 60, /* 0x1a00 */ +192,255,195, 37, 4, 0, 98, 40, 80, 0, 64, 20, 33,112, 96, 0, /* 0x1a10 */ + 67, 32, 3, 0, 1, 0, 98, 48, 2, 0, 75, 52, 14, 0, 98, 40, /* 0x1a20 */ + 8, 0, 64, 16,255,255,153, 36, 4,112, 43, 3, 64, 16, 14, 0, /* 0x1a30 */ + 33, 32, 2, 2, 64, 16, 3, 0, 35, 16,130, 0, 26, 0, 0, 16, /* 0x1a40 */ + 94, 5, 72, 36,251,255,132, 36,255, 0, 2, 60,255,255, 66, 52, /* 0x1a50 */ + 43, 16, 79, 0, 8, 0, 64, 20, 0, 0, 0, 0,102, 0,167, 17, /* 0x1a60 */ + 0,122, 15, 0, 0, 26, 24, 0, 0, 0,162,145, 0, 0, 0, 0, /* 0x1a70 */ + 37,192, 98, 0, 1, 0,173, 37, 66,120, 15, 0, 43, 16, 15, 3, /* 0x1a80 */ + 3, 0, 64, 20, 64, 88, 11, 0, 35,192, 15, 3, 1, 0,107, 53, /* 0x1a90 */ +255,255,132, 36,237,255,128, 20,255, 0, 2, 60, 68, 6, 8, 38, /* 0x1aa0 */ + 0,113, 11, 0, 4, 0, 25, 36, 1, 0, 6, 36, 1, 0, 5, 36, /* 0x1ab0 */ +255, 0, 2, 60,255,255, 66, 52, 43, 16, 79, 0, 9, 0, 64, 20, /* 0x1ac0 */ + 64, 96, 5, 0, 76, 0,167, 17, 0,122, 15, 0, 0, 26, 24, 0, /* 0x1ad0 */ + 0, 0,162,145, 0, 0, 0, 0, 37,192, 98, 0, 1, 0,173, 37, /* 0x1ae0 */ + 64, 96, 5, 0, 33, 88, 12, 1, 0, 0, 99,149,194, 18, 15, 0, /* 0x1af0 */ + 24, 0, 67, 0, 18, 32, 0, 0, 43, 16, 4, 3, 8, 0, 64, 16, /* 0x1b00 */ + 0, 8, 2, 36, 35, 16, 67, 0, 67, 17, 2, 0, 33, 16, 98, 0, /* 0x1b10 */ + 0, 0, 98,165, 33, 40,128, 1, 9, 0, 0, 16, 33,120,128, 0, /* 0x1b20 */ + 35,120,228, 1, 35,192, 4, 3, 66, 17, 3, 0, 35, 16, 98, 0, /* 0x1b30 */ + 0, 0, 98,165, 1, 0,162, 36, 33, 40,162, 0, 37,112,198, 1, /* 0x1b40 */ +255,255, 57, 39,218,255, 32, 23, 64, 48, 6, 0, 1, 0,209, 37, /* 0x1b50 */ + 26, 0, 32, 18,255, 0, 2, 60, 7, 0, 82, 38, 43, 16, 81, 1, /* 0x1b60 */ + 38, 0, 64, 20, 1, 0, 2, 36, 35, 16, 81, 1, 33, 88, 98, 2, /* 0x1b70 */ + 33, 32,106, 2, 33, 24, 64, 1, 0, 0,110,145, 1, 0, 99, 36, /* 0x1b80 */ + 33, 16, 73, 1, 2, 0, 66, 36, 6, 0, 98, 16, 0, 0,142,160, /* 0x1b90 */ + 1, 0,107, 37, 16, 0,162,143, 0, 0, 0, 0,246,255, 98, 20, /* 0x1ba0 */ + 1, 0,132, 36, 33, 80, 96, 0, 16, 0,163,143, 0, 0, 0, 0, /* 0x1bb0 */ + 43, 16, 67, 1,166,253, 64, 20,255, 0, 2, 60,255,255, 66, 52, /* 0x1bc0 */ + 43, 16, 79, 0, 4, 0, 64, 20, 35, 40,181, 1, 10, 0,167, 17, /* 0x1bd0 */ + 1, 0,173, 37, 35, 40,181, 1, 12, 0,162,143, 0, 0, 0, 0, /* 0x1be0 */ + 0, 0, 69,172, 20, 0,163,143, 0, 0, 0, 0, 0, 0,106,172, /* 0x1bf0 */ + 2, 0, 0, 16, 33, 16, 0, 0, 1, 0, 2, 36, 52, 0,183,143, /* 0x1c00 */ + 48, 0,182,143, 44, 0,181,143, 40, 0,180,143, 36, 0,179,143, /* 0x1c10 */ + 32, 0,178,143, 28, 0,177,143, 24, 0,176,143, 8, 0,224, 3, /* 0x1c20 */ + 56, 0,189, 39, 13, 0, 0, 0, 0, 0,168,143, 4, 0,189, 39, /* 0x1c30 */ + 34, 16, 72, 0, 0, 0,168,143, 4, 0,189, 39, 34,128, 8, 2, /* 0x1c40 */ + 0, 0,168,143, 4, 0,189, 39, 0, 0, 16,173, 0, 0,168,143, /* 0x1c50 */ + 4, 0,189, 39, 8, 0, 0, 1, 0, 0, 0, 0, 30, 0, 6, 36, /* 0x1c60 */ +255,255, 17, 4, 33, 40,224, 3, 80, 82, 79, 84, 95, 69, 88, 69, /* 0x1c70 */ + 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x1c80 */ +108,101,100, 46, 10, 0, 2, 0, 4, 36, 4, 0, 2, 36, 12, 0, /* 0x1c90 */ + 0, 0,127, 0, 4, 36, 1, 0, 2, 36, 12, 0, 0, 0,160,255, /* 0x1ca0 */ +181, 38,216,255,230,142,224,255,189, 39,220,255,231,142, 7, 0, /* 0x1cb0 */ + 8, 36, 16, 0,168,175, 18, 16, 8, 36, 20, 0,168,175, 0, 0, /* 0x1cc0 */ + 5, 36, 24, 0,160,175,197, 0, 4, 36,198, 0, 2, 36, 12, 0, /* 0x1cd0 */ + 0, 0, 33, 32, 64, 0,232,255,229,142,224,255,244,142,228,255, /* 0x1ce0 */ +243,142,236,255,242,142,240,255,241,142, 11, 0,133, 16, 35, 64, /* 0x1cf0 */ +133, 0, 33,184,232, 2, 33, 48,160, 2, 0, 0,168,140, 8, 0, /* 0x1d00 */ +132, 36, 4, 0,169,140,248,255,198, 36,248,255,136,172, 8, 0, /* 0x1d10 */ +165, 36,249,255,192, 28,252,255,137,172, 0, 0,200,142, 33, 56, /* 0x1d20 */ +160, 3, 0, 0,168,175, 33, 48, 64, 0, 4, 0,197,142, 33, 32, /* 0x1d30 */ +192, 2, 8, 0,224, 2, 33,248,192, 0,212,255,245,142,215,255, /* 0x1d40 */ + 17, 4, 33,176,224, 3,116,109,112, 47,109,105,112,115,101,108, /* 0x1d50 */ + 46,114, 51, 48, 48, 48, 45,108,105,110,117,120, 46,101,108,102, /* 0x1d60 */ + 45,101,110,116,114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32, /* 0x1d70 */ +102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 51, /* 0x1d80 */ + 50, 45,108,105,116,116,108,101,109,105,112,115, 10, 10, 83,101, /* 0x1d90 */ + 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, /* 0x1da0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, /* 0x1db0 */ + 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x1dc0 */ + 65, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, /* 0x1dd0 */ + 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, /* 0x1de0 */ + 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, /* 0x1df0 */ + 48, 48, 48, 48, 48, 48, 50, 56, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x1e00 */ + 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1e10 */ + 48, 48, 48, 48, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, /* 0x1e20 */ + 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, /* 0x1e30 */ + 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, 82, 86, 50, /* 0x1e40 */ + 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 50, /* 0x1e50 */ + 49, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x1e60 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 99, /* 0x1e70 */ + 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x1e80 */ + 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x1e90 */ + 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, /* 0x1ea0 */ + 32, 32, 32, 32, 48, 48, 48, 48, 48, 49,102, 48, 32, 32, 48, 48, /* 0x1eb0 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1ec0 */ + 32, 32, 48, 48, 48, 48, 48, 50, 55, 52, 32, 32, 50, 42, 42, 48, /* 0x1ed0 */ + 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, /* 0x1ee0 */ + 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, /* 0x1ef0 */ + 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, /* 0x1f00 */ + 48, 48, 48, 49, 98, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1f10 */ + 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1f20 */ + 48, 52, 54, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x1f30 */ + 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, /* 0x1f40 */ + 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 76, 90, 77, 65, 95, 69, /* 0x1f50 */ + 76, 70, 48, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 54, 99, /* 0x1f60 */ + 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x1f70 */ + 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 54, 49, 56, 32, 32, /* 0x1f80 */ + 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x1f90 */ + 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, 76, 90, 77, /* 0x1fa0 */ + 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, /* 0x1fb0 */ + 97,100, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x1fc0 */ + 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 54, 56, /* 0x1fd0 */ + 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, /* 0x1fe0 */ + 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32, /* 0x1ff0 */ + 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, /* 0x2000 */ + 48, 48, 48, 97,100, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2010 */ + 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x2020 */ + 49, 49, 53, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x2030 */ + 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x2040 */ + 32, 55, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, /* 0x2050 */ + 32, 48, 48, 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48, 48, /* 0x2060 */ + 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x2070 */ + 48, 48, 48, 49, 99, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x2080 */ + 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x2090 */ + 89, 10, 32, 32, 56, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, /* 0x20a0 */ + 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x20b0 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x20c0 */ + 32, 32, 48, 48, 48, 48, 49, 99, 51, 56, 32, 32, 50, 42, 42, 48, /* 0x20d0 */ + 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, /* 0x20e0 */ + 79, 78, 76, 89, 10, 32, 32, 57, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x20f0 */ + 89, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 53,101, 32, /* 0x2100 */ + 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x2110 */ + 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 99, 51, 56, 32, 32, 50, /* 0x2120 */ + 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, /* 0x2130 */ + 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, /* 0x2140 */ + 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, /* 0x2150 */ + 32, 48, 48, 48, 48, 48, 48, 99, 48, 32, 32, 48, 48, 48, 48, 48, /* 0x2160 */ + 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, /* 0x2170 */ + 48, 48, 48, 49, 99, 57, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, /* 0x2180 */ + 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x2190 */ + 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, /* 0x21a0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x21b0 */ + 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, /* 0x21c0 */ + 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, /* 0x21d0 */ + 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, /* 0x21e0 */ + 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, /* 0x21f0 */ + 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2200 */ + 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x2210 */ + 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, /* 0x2220 */ + 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x2230 */ + 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, /* 0x2240 */ + 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, /* 0x2250 */ + 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, /* 0x2260 */ + 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 68, 10, /* 0x2270 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x2280 */ + 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2290 */ + 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x22a0 */ + 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, /* 0x22b0 */ + 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x22c0 */ + 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x22d0 */ + 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, /* 0x22e0 */ + 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x22f0 */ + 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x2300 */ + 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, /* 0x2310 */ + 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x2320 */ + 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x2330 */ + 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, /* 0x2340 */ + 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, /* 0x2350 */ + 68, 69, 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x2360 */ + 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, 76, 9, /* 0x2370 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, /* 0x2380 */ + 76, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x2390 */ + 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x23a0 */ + 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x23b0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x23c0 */ + 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 77, 10, 48, 48, 48, 48, /* 0x23d0 */ + 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x23e0 */ + 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 74, 77, 80, 85, /* 0x23f0 */ + 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x2400 */ + 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x2410 */ + 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x2420 */ + 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x2430 */ + 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, /* 0x2440 */ + 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x2450 */ + 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, 85, 10, /* 0x2460 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2470 */ + 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x2480 */ + 65, 68, 82, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x2490 */ + 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x24a0 */ + 48, 48, 48, 48, 32, 76, 69, 78, 88, 10, 48, 48, 48, 48, 48, 48, /* 0x24b0 */ + 50, 48, 32,103, 32, 32, 32, 32, 32, 79, 32, 69, 76, 70, 77, 65, /* 0x24c0 */ + 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 32, 95,115,116, /* 0x24d0 */ + 97,114,116, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, /* 0x24e0 */ + 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, /* 0x24f0 */ + 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, /* 0x2500 */ + 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2510 */ + 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2520 */ + 48, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x2530 */ + 32, 32, 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2540 */ + 52, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x2550 */ + 32, 32, 32, 32, 76, 69, 78, 77, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2560 */ + 56, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x2570 */ + 32, 32, 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x2580 */ + 99, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x2590 */ + 32, 32, 32, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 49, /* 0x25a0 */ + 48, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x25b0 */ + 32, 32, 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, 48, 49, /* 0x25c0 */ + 52, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x25d0 */ + 32, 32, 32, 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 49, /* 0x25e0 */ + 56, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x25f0 */ + 32, 32, 32, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, 48, 48, 49, /* 0x2600 */ + 99, 32, 82, 95, 77, 73, 80, 83, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x2610 */ + 32, 32, 32, 32, 76, 69, 78, 88, 10, 48, 48, 48, 48, 48, 48, 50, /* 0x2620 */ + 48, 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, /* 0x2630 */ + 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, /* 0x2640 */ + 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, /* 0x2650 */ + 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, /* 0x2660 */ + 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x2670 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, /* 0x2680 */ + 48, 48, 48, 48, 49, 49, 99, 32, 82, 95, 77, 73, 80, 83, 95, 80, /* 0x2690 */ + 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, /* 0x26a0 */ + 78, 89, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, /* 0x26b0 */ + 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, /* 0x26c0 */ + 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, /* 0x26d0 */ + 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, /* 0x26e0 */ + 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 49, 49, 99, 32, 82, 95, /* 0x26f0 */ + 77, 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, /* 0x2700 */ + 69, 76, 70, 77, 65, 73, 78, 89, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x2710 */ + 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x2720 */ + 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, 70, 83, 69, 84, /* 0x2730 */ + 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x2740 */ + 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, /* 0x2750 */ + 48, 99, 52, 32, 82, 95, 77, 73, 80, 83, 95, 80, 67, 49, 54, 32, /* 0x2760 */ + 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 10, /* 0x2770 */ + 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x2780 */ + 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, 78, 89, /* 0x2790 */ + 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 84, 89, 80, 69, /* 0x27a0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, /* 0x27b0 */ + 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 51, 56, 32, 82, 95, 77, /* 0x27c0 */ + 73, 80, 83, 95, 80, 67, 49, 54, 32, 32, 32, 32, 32, 32, 32, 69, /* 0x27d0 */ + 76, 70, 77, 65, 73, 78, 90, 10 /* 0x27e0 */ +}; diff --git a/src/stub/mipsel.r3000-linux.elf-fold.h b/src/stub/mipsel.r3000-linux.elf-fold.h new file mode 100644 index 00000000..4977a05c --- /dev/null +++ b/src/stub/mipsel.r3000-linux.elf-fold.h @@ -0,0 +1,161 @@ +/* mipsel.r3000-linux.elf-fold.h + created from mipsel.r3000-linux.elf-fold.bin, 1996 (0x7cc) bytes + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2007 Laszlo Molnar + Copyright (C) 2000-2007 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 + + */ + + +#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_SIZE 1996 +#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_ADLER32 0x2a4992e0 +#define STUB_MIPSEL_R3000_LINUX_ELF_FOLD_CRC32 0x96679e92 + +unsigned char stub_mipsel_r3000_linux_elf_fold[1996] = { +127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ + 2, 0, 8, 0, 1, 0, 0, 0,128, 0, 16, 0, 52, 0, 0, 0, /* 0x 10 */ + 0, 0, 0, 0, 1, 48, 0, 0, 52, 0, 32, 0, 2, 0, 0, 0, /* 0x 20 */ + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, /* 0x 30 */ + 0, 0, 16, 0,204, 7, 0, 0,208, 7, 0, 0, 5, 0, 0, 0, /* 0x 40 */ + 0, 16, 0, 0, 1, 0, 0, 0,204, 7, 0, 0, 0, 0, 0, 0, /* 0x 50 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 60 */ + 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 70 */ + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, /* 0x 80 */ + 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, 13, 0, 0, 0, /* 0x 90 */ + 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x a0 */ + 14, 0,128, 16, 1, 0, 3, 36, 0, 0,130,140, 0, 0, 0, 0, /* 0x b0 */ + 5, 0, 69, 16, 0, 0, 0, 0, 6, 0, 67, 20, 0, 0, 0, 0, /* 0x c0 */ + 4, 0,160, 16, 0, 0, 0, 0, 4, 0,134,172, 8, 0,224, 3, /* 0x d0 */ + 0, 0,133,172, 46, 0, 4, 8, 8, 0,132, 36, 8, 0,224, 3, /* 0x e0 */ + 0, 0, 0, 0,248,255,189, 39, 0, 0,191,175, 0, 0,130,140, /* 0x f0 */ + 4, 0,135,140, 43, 16, 70, 0, 7, 0, 64, 16, 33, 24,192, 0, /* 0x 100 */ + 40, 0, 4, 12,127, 0, 4, 36, 0, 0,226,144, 1, 0,231, 36, /* 0x 110 */ + 0, 0,162,160, 1, 0,165, 36,255,255, 99, 36,255,255, 2, 36, /* 0x 120 */ +249,255, 98, 20, 0, 0, 0, 0, 4, 0,131,140, 0, 0,130,140, /* 0x 130 */ + 33, 24,102, 0, 35, 16, 70, 0, 0, 0,130,172, 4, 0,131,172, /* 0x 140 */ + 0, 0,191,143, 0, 0, 0, 0, 8, 0,224, 3, 8, 0,189, 39, /* 0x 150 */ +216,255,189, 39, 28, 0,179,175, 24, 0,178,175, 20, 0,177,175, /* 0x 160 */ + 16, 0,176,175, 33,136,128, 0, 33,128,160, 0, 33,152,192, 0, /* 0x 170 */ + 33,144,224, 0,176, 0, 4, 8, 32, 0,191,175, 33, 32, 32, 2, /* 0x 180 */ + 61, 0, 4, 12, 4, 0,165, 39, 4, 0,163,143, 8, 0,166,143, /* 0x 190 */ + 10, 0, 96, 20, 88, 33, 2, 60, 85, 80, 66, 52, 9, 0,194, 20, /* 0x 1a0 */ + 0, 0, 0, 0, 0, 0, 34,142, 0, 0, 0, 0, 5, 0, 64, 20, /* 0x 1b0 */ + 0, 0, 0, 0,180, 0, 4, 8, 0, 0, 0, 0, 3, 0,192, 20, /* 0x 1c0 */ + 43, 16,102, 0, 40, 0, 4, 12,127, 0, 4, 36,253,255, 64, 20, /* 0x 1d0 */ + 0, 0, 0, 0, 0, 0, 2,142, 0, 0, 0, 0, 43, 16, 67, 0, /* 0x 1e0 */ +248,255, 64, 20, 43, 16,195, 0, 4, 0, 7,142, 39, 0, 64, 16, /* 0x 1f0 */ + 33, 40,224, 0, 4, 0, 36,142, 12, 0,168,143, 33, 40,192, 0, /* 0x 200 */ + 0, 0,163,175, 33, 48,224, 0, 9,248, 96, 2, 33, 56,160, 3, /* 0x 210 */ +236,255, 64, 20, 0, 0, 0, 0, 0, 0,165,143, 4, 0,162,143, /* 0x 220 */ + 0, 0, 0, 0,231,255,162, 20, 0, 0, 0, 0, 13, 0,167,147, /* 0x 230 */ + 0, 0, 0, 0, 13, 0,224, 16, 0, 0, 0, 0, 11, 0, 64, 18, /* 0x 240 */ + 1, 2,162, 44, 5, 0, 64, 16, 0, 0, 0, 0, 0, 0, 2,142, /* 0x 250 */ + 0, 0, 0, 0, 5, 0, 69, 20, 0, 0, 0, 0, 4, 0, 4,142, /* 0x 260 */ + 14, 0,166,147, 9,248, 64, 2, 0, 0, 0, 0, 8, 0,162,143, /* 0x 270 */ + 4, 0, 35,142, 0, 0, 36,142, 33, 24, 98, 0, 35, 32,130, 0, /* 0x 280 */ + 4, 0, 35,174,169, 0, 4, 8, 0, 0, 36,174, 61, 0, 4, 12, /* 0x 290 */ + 33, 32, 32, 2, 4, 0,162,143, 4, 0, 3,142, 0, 0, 4,142, /* 0x 2a0 */ + 33, 24, 98, 0, 35, 32,130, 0, 4, 0, 3,174, 0, 0, 4,174, /* 0x 2b0 */ + 0, 0, 2,142, 0, 0, 0, 0,176,255, 64, 20, 12, 0, 6, 36, /* 0x 2c0 */ + 32, 0,191,143, 28, 0,179,143, 24, 0,178,143, 20, 0,177,143, /* 0x 2d0 */ + 16, 0,176,143, 8, 0,224, 3, 40, 0,189, 39,176,255,189, 39, /* 0x 2e0 */ + 72, 0,190,175, 64, 0,182,175, 44, 0,177,175, 40, 0,176,175, /* 0x 2f0 */ + 76, 0,191,175, 68, 0,183,175, 60, 0,181,175, 56, 0,180,175, /* 0x 300 */ + 52, 0,179,175, 48, 0,178,175, 16, 0,162,148, 28, 0,163,140, /* 0x 310 */ + 33,176,160, 0, 2, 0, 66, 56, 44, 0,165,148, 33,136,195, 2, /* 0x 320 */ + 1, 0, 66, 44, 24, 0,164,175, 33,240,192, 0, 28, 0,167,175, /* 0x 330 */ + 32, 0,168,175, 0, 57, 2, 0,255,255,165, 36, 33, 32, 32, 2, /* 0x 340 */ +255,255, 16, 36, 33, 48, 0, 0, 1, 0, 8, 36,236, 0, 4, 8, /* 0x 350 */ + 36, 0,169,175, 0, 0,130,140, 0, 0, 0, 0, 14, 0, 72, 20, /* 0x 360 */ + 0, 0, 0, 0, 8, 0,131,140, 0, 0, 0, 0, 43, 16,112, 0, /* 0x 370 */ + 2, 0, 64, 16, 0, 0, 0, 0, 33,128, 96, 0, 20, 0,130,140, /* 0x 380 */ + 0, 0, 0, 0, 33, 24, 98, 0, 43, 16,195, 0, 2, 0, 64, 16, /* 0x 390 */ + 0, 0, 0, 0, 33, 48, 96, 0, 32, 0,132, 36,255,255,165, 36, /* 0x 3a0 */ +236,255,161, 4,255,255, 3, 52,255,255, 4, 60, 36,128, 4, 2, /* 0x 3b0 */ + 35, 16,208, 0, 33, 16, 67, 0, 36, 16, 68, 0, 34, 0,231, 36, /* 0x 3c0 */ + 33, 32, 0, 2, 33, 40, 64, 0, 33, 48, 0, 0,255,255, 8, 36, /* 0x 3d0 */ + 33, 72, 0, 0, 36, 0, 4, 12, 8, 0,162,175, 35,184, 80, 0, /* 0x 3e0 */ + 12, 0,162,175, 90, 1, 4, 8, 16, 0,160,175, 0, 0, 35,142, /* 0x 3f0 */ + 0, 0, 0, 0, 8, 0, 98, 20, 1, 0, 2, 36, 8, 0, 38,142, /* 0x 400 */ + 28, 0,164,143, 33, 48,230, 2, 44, 0, 4, 12, 3, 0, 5, 36, /* 0x 410 */ + 86, 1, 4, 8, 0, 0, 0, 0, 75, 0, 98, 20, 0, 0, 0, 0, /* 0x 420 */ + 8, 0, 34,142, 24, 0, 35,142, 33,168,226, 2, 81,115, 2, 60, /* 0x 430 */ +128, 24, 3, 0, 64, 98, 66, 52, 6, 16, 98, 0, 16, 0, 42,142, /* 0x 440 */ + 7, 0, 82, 48, 20, 0, 34,142,255,255,163, 50, 20, 0,162,175, /* 0x 450 */ + 33,152, 67, 1, 93, 0,192, 19, 35,160,163, 2, 2, 0, 70, 54, /* 0x 460 */ +255,255, 8, 36, 50, 0, 7, 36, 4, 0, 41,142, 33, 32,128, 2, /* 0x 470 */ + 35, 72, 35, 1, 33, 40, 96, 2, 0, 0,170,175, 36, 0, 4, 12, /* 0x 480 */ + 4, 0,181,175, 31, 0,130, 22, 0, 0, 0, 0, 11, 0,192, 19, /* 0x 490 */ + 4, 0, 66, 50, 4, 0, 64, 16, 0, 0, 0, 0, 36, 0,167,143, /* 0x 4a0 */ + 47, 1, 4, 8, 0, 0, 0, 0, 33, 56, 0, 0, 24, 0,166,143, /* 0x 4b0 */ + 33, 32,192, 3, 88, 0, 4, 12, 33, 40,160, 3, 35, 16, 19, 0, /* 0x 4c0 */ + 2, 0, 67, 50, 8, 0, 96, 16,255,255, 80, 48, 6, 0, 0, 18, /* 0x 4d0 */ + 33, 24,147, 2, 33, 16, 0, 2,255,255, 66, 36, 0, 0, 96,160, /* 0x 4e0 */ +253,255, 64, 20, 1, 0, 99, 36, 8, 0,192, 19, 33, 32,128, 2, /* 0x 4f0 */ + 33, 40, 96, 2, 34, 0, 4, 12, 33, 48, 64, 2, 3, 0, 64, 16, /* 0x 500 */ + 0, 0, 0, 0, 40, 0, 4, 12,127, 0, 4, 36, 20, 0,163,143, /* 0x 510 */ + 33, 16,112, 2, 33, 40,163, 2, 33,128,130, 2, 43, 16, 5, 2, /* 0x 520 */ + 9, 0, 64, 16, 35, 40,176, 0, 33, 48, 64, 2, 33, 32, 0, 2, /* 0x 530 */ + 50, 0, 7, 36,255,255, 8, 36, 36, 0, 4, 12, 33, 72, 0, 0, /* 0x 540 */ +240,255, 2, 22, 0, 0, 0, 0, 16, 0,162,143, 32, 0, 49, 38, /* 0x 550 */ + 1, 0, 66, 36, 16, 0,162,175, 44, 0,194,150, 16, 0,163,143, /* 0x 560 */ + 0, 0, 0, 0, 42, 16, 98, 0,160,255, 64, 20, 6, 0, 2, 36, /* 0x 570 */ + 8, 0,192, 23, 3, 0, 2, 36, 24, 0,164,143, 39, 0, 4, 12, /* 0x 580 */ + 0, 0, 0, 0,223,255, 64, 20, 0, 0, 0, 0,113, 1, 4, 8, /* 0x 590 */ + 0, 0, 0, 0, 16, 0,195,150, 0, 0, 0, 0, 5, 0, 98, 16, /* 0x 5a0 */ + 0, 0, 0, 0, 12, 0,162,143, 8, 0,163,143, 35, 0, 4, 12, /* 0x 5b0 */ + 33, 32, 67, 0, 32, 0,162,143, 0, 0, 0, 0, 7, 0, 64, 16, /* 0x 5c0 */ + 0, 0, 0, 0,123, 1, 4, 8, 0, 0, 87,172, 24, 0,168,143, /* 0x 5d0 */ + 33, 48, 64, 2, 30, 1, 4, 8, 18, 0, 7, 36, 24, 0,194,142, /* 0x 5e0 */ + 76, 0,191,143, 33, 16,226, 2, 72, 0,190,143, 68, 0,183,143, /* 0x 5f0 */ + 64, 0,182,143, 60, 0,181,143, 56, 0,180,143, 52, 0,179,143, /* 0x 600 */ + 48, 0,178,143, 44, 0,177,143, 40, 0,176,143, 8, 0,224, 3, /* 0x 610 */ + 80, 0,189, 39,192,255,189, 39, 60, 0,191,175, 52, 0,181,175, /* 0x 620 */ + 48, 0,180,175, 44, 0,179,175, 40, 0,178,175, 32, 0,176,175, /* 0x 630 */ + 56, 0,182,175, 36, 0,177,175, 4, 0, 22,141, 0, 0, 49,141, /* 0x 640 */ + 0, 0, 3,141, 4, 0, 34,141, 4, 0,180, 39, 33,128,128, 0, /* 0x 650 */ + 33,144,160, 0, 33,168,224, 0, 33, 32,128, 2, 33, 56, 0, 0, /* 0x 660 */ + 12, 0,165, 39, 24, 0,170,175, 12, 0,163,175, 33,152,192, 0, /* 0x 670 */ + 8, 0,162,175, 4, 0,177,175, 88, 0, 4, 12, 16, 0,182,175, /* 0x 680 */ + 8, 0,162,143, 44, 0,198,150, 35, 16, 81, 0, 5, 0, 5, 36, /* 0x 690 */ + 33, 32, 0, 2, 8, 0,162,175, 44, 0, 4, 12, 4, 0,178,175, /* 0x 6a0 */ + 42, 0,198,150, 33, 32, 0, 2, 44, 0, 4, 12, 4, 0, 5, 36, /* 0x 6b0 */ + 52, 0,210, 38, 24, 0,166,143, 8, 0, 66,142, 52, 0,198, 36, /* 0x 6c0 */ + 33, 48,194, 0, 33, 32, 0, 2, 44, 0, 4, 12, 3, 0, 5, 36, /* 0x 6d0 */ + 33, 32, 96, 2, 33, 40,192, 2, 33, 48,128, 2, 33, 56, 0, 2, /* 0x 6e0 */ + 33, 64,160, 3,187, 0, 4, 12, 33, 72,160, 2, 33, 48, 64, 0, /* 0x 6f0 */ + 33, 32, 0, 2, 9, 0, 5, 36, 44, 0, 4, 12, 33,136, 64, 0, /* 0x 700 */ + 44, 0,197,150,229, 1, 4, 8, 33, 32, 0, 0, 0, 0, 67,142, /* 0x 710 */ + 0, 0, 0, 0, 26, 0, 98, 20, 1, 0,132, 36, 8, 0, 66,142, /* 0x 720 */ + 0, 0,164,143, 33, 40, 0, 0, 33, 32, 68, 0, 38, 0, 4, 12, /* 0x 730 */ + 33, 48, 0, 0, 8, 0, 64, 4, 33,128, 64, 0, 33, 32, 64, 0, /* 0x 740 */ + 33, 40,192, 2, 37, 0, 4, 12, 0, 2, 6, 36, 0, 2, 3, 36, /* 0x 750 */ + 3, 0, 67, 16, 33, 48, 0, 0, 40, 0, 4, 12,127, 0, 4, 36, /* 0x 760 */ + 33, 32, 0, 2, 33, 40,192, 2, 33, 56, 0, 0, 33, 64, 0, 0, /* 0x 770 */ +187, 0, 4, 12, 33, 72, 0, 0,232, 1, 4, 8, 33,136, 64, 0, /* 0x 780 */ + 32, 0, 82, 38, 42, 16,133, 0,224,255, 64, 20, 3, 0, 2, 36, /* 0x 790 */ + 33, 16, 32, 2, 60, 0,191,143, 56, 0,182,143, 52, 0,181,143, /* 0x 7a0 */ + 48, 0,180,143, 44, 0,179,143, 40, 0,178,143, 36, 0,177,143, /* 0x 7b0 */ + 32, 0,176,143, 8, 0,224, 3, 64, 0,189, 39 /* 0x 7c0 */ +}; diff --git a/src/stub/src/arch/mips/mipsel.r3000/lzma_d.S b/src/stub/src/arch/mips/mipsel.r3000/lzma_d.S index fcaf691f..7c3c65fb 100644 --- a/src/stub/src/arch/mips/mipsel.r3000/lzma_d.S +++ b/src/stub/src/arch/mips/mipsel.r3000/lzma_d.S @@ -30,41 +30,11 @@ */ -section lzma.init - li tmp,%lo(lzma_stack_adjust-lzma_args_sz) - addu sp,tmp -/* - move var,sp -1: - sw zero,0(var) - addiu tmp,4 - bnez tmp,1b - addiu var,4 -*/ - addiu src,2 - la inSize,lzma_c_len - la outSize,lzma_u_len - - addu poutSizeProcessed,sp,outSizeProcessed - addiu pinSizeprocessed,sp,inSizeProcessed - - la tmp,lzma_properties - sw dst,dst_save(sp) - addiu CLzmaDecoderState,sp,lzma_args_sz - bal decompressor - sw tmp,0(CLzmaDecoderState) - lw dst,dst_save(sp) - lw outSize,outSizeProcessed(sp) - li tmp,%lo(lzma_stack_adjust-lzma_args_sz) - addu dst,outSize - subu sp,tmp - section LZMA_DEC10 #include "lzma_d_cs.S" section LZMA_DEC20 #include "lzma_d_cf.S" - // vi:ts=8:et diff --git a/src/stub/src/include/linux.h b/src/stub/src/include/linux.h index 95c41bd8..9b360b7b 100644 --- a/src/stub/src/include/linux.h +++ b/src/stub/src/include/linux.h @@ -96,6 +96,9 @@ struct timespec { #elif defined(__i386__) || defined(__powerpc__) || defined(__arm__) #define PAGE_MASK (~0ul<<12) // discards the offset, keeps the page #define PAGE_SIZE ( 1ul<<12) +#elif defined(__mips__) +#define PAGE_MASK (~0ul<<16) // discards the offset, keeps the page +#define PAGE_SIZE ( 1ul<<16) #endif #define SEEK_SET 0 diff --git a/src/stub/src/mipsel.r3000-linux.elf-entry.S b/src/stub/src/mipsel.r3000-linux.elf-entry.S new file mode 100644 index 00000000..b4ef85cb --- /dev/null +++ b/src/stub/src/mipsel.r3000-linux.elf-entry.S @@ -0,0 +1,286 @@ +/* mipsel-linux.elf-entry.S -- Linux program entry point & decompressor (Elf binary) +* +* This file is part of the UPX executable compressor. +* +* Copyright (C) 1996-2007 Markus Franz Xaver Johannes Oberhumer +* Copyright (C) 1996-2007 Laszlo Molnar +* Copyright (C) 2000-2007 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 +* +*/ + +#include "arch/mips/mipsel.r3000/macros.ash" +#include "arch/mips/mipsel.r3000/bits.ash" + + .set mips1 + .set noreorder + .set noat + .altmacro + +sz_Ehdr= 52 +sz_Phdr= 32 + +sz_l_info= 12 + l_lsize= 8 + +sz_p_info= 12 + +sz_b_info= 12 + sz_unc= 0 + sz_cpr= 4 + b_method= 8 + b_ftid= 9 + b_cto8= 10 + b_unused=11 + +PROT_READ= 1 +PROT_WRITE= 2 +PROT_EXEC= 4 + +MAP_PRIVATE= 2 +MAP_FIXED= 0x10 +MAP_ANONYMOUS= 0x1000 + +PAGE_SHIFT= 12 +PAGE_MASK= (~0<=3MB uncompressed), then enough + to duplicate the entire compressed PT_LOAD, plus 1 page, located just after + the brk() of the _un_compressed program. The address and length are pre- + calculated by PackLinuxElf64amd::defineSymbols(). +*/ +#define a0_mmap a2 +#define a1_mmap a3 +#define a2_mmap 0x10 +#define a3_mmap 0x14 +#define a4_mmap 0x18 +#define a5_mmap 0x1c +#define sp_frame 0x20 + + lw a0_mmap,adrm - decompressor(s7) + addiu sp,sp,-sp_frame + lw a1_mmap,lenm - decompressor(s7) + li t0, PROT_READ | PROT_WRITE | PROT_EXEC + sw t0,a2_mmap(sp) + li t0, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS + sw t0,a3_mmap(sp) + li a1,0 + sw zero,a4_mmap(sp) //; sw zero,a5_mmap(sp) // MAP_ANON ==> ignore offset + li a0,SYS_mmap + li v0,SYS___syscall + syscall // FIXME: check for error + move a0,v0 // &new page(s) + + lw a1,adrc - decompressor(s7) + lw s4,jmpu - decompressor(s7) // for unmap in fold + lw s3,adru - decompressor(s7) // for unmap in fold + lw s2,lenu - decompressor(s7) // for unmap in fold + lw s1,adrx - decompressor(s7) // for upx_main + + beq a0,a1,L80 // no copy + subu t0,a0,a1 // (ADRM - ADRC) == relocation amount + addu s7,s7,t0 // update &decompress + move a2,s5 // length +move_up: // memcpy(dst=a0, src=a1, len=round_up(a2, 8)) + lw t0, 0(a1); addiu a0,a0, 8 + lw t1, 4(a1); addiu a2,a2,-8 + sw t0,-8(a0); addiu a1,a1, 8 + bgtz a2,move_up + sw t1,-4(a0) +L80: +// Decompress the folded part of this stub, then execute it. + lw t0,sz_unc(s6); move a3,sp; sw t0,0(sp) // &dst_len + move a2,v0 // &dst + lw a1,sz_cpr(s6) // src_len + move a0,s6 // &b_info(fold) + jr s7 // decompress(src, srclen, dst, &dstlen /*, method*/) + move ra,a2 // return to decompressed code +main: + lw s5,sz_pack2 - decompressor(s7) // length before stub + bal unfold + move s6,ra + // { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} + +/*__XTHEENDX__*/ + +/* +vi:ts=8:et:nowrap + */ + diff --git a/src/stub/src/mipsel.r3000-linux.elf-fold.S b/src/stub/src/mipsel.r3000-linux.elf-fold.S new file mode 100644 index 00000000..dc51c4ce --- /dev/null +++ b/src/stub/src/mipsel.r3000-linux.elf-fold.S @@ -0,0 +1,162 @@ +/* mipsel-linux.elf-fold.S -- linkage to C code to process Elf binary +* +* This file is part of the UPX executable compressor. +* +* Copyright (C) 2000-2007 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 +* +*/ + +#include "arch/mips/mipsel.r3000/macros.ash" +#include "arch/mips/mipsel.r3000/bits.ash" + +PAGE_SHIFT= 12 +PAGE_MASK= 0xffffffffffffffff< + + John F. Reiser + + */ + + +OUTPUT_FORMAT("elf32-littlemips", "elf32-bigmips", "elf32-littlemips") +OUTPUT_ARCH(mips) +/*ENTRY(_start)*/ +PHDRS +{ + text PT_LOAD FILEHDR PHDRS ; + data PT_LOAD ; /* for setting brk(0) */ +} +SECTIONS +{ + . = 0x00100000 + SIZEOF_HEADERS + 12; /* 12==sizeof(l_info) */ + .text : { + *(.text) + *(.data) + } : text + .data : { + } : data +} diff --git a/src/stub/src/mipsel.r3000-linux.elf-main.c b/src/stub/src/mipsel.r3000-linux.elf-main.c new file mode 100644 index 00000000..102abf87 --- /dev/null +++ b/src/stub/src/mipsel.r3000-linux.elf-main.c @@ -0,0 +1,2 @@ +#include "i386-linux.elf-main.c" + diff --git a/src/stub/src/mipsel.r3000-ps1.S b/src/stub/src/mipsel.r3000-ps1.S index b25e2d20..7cb8160c 100644 --- a/src/stub/src/mipsel.r3000-ps1.S +++ b/src/stub/src/mipsel.r3000-ps1.S @@ -333,6 +333,35 @@ decomp_done: section decompressor.start decompressor: +section lzma.init + li tmp,%lo(lzma_stack_adjust-lzma_args_sz) + addu sp,tmp +/* + move var,sp +1: + sw zero,0(var) + addiu tmp,4 + bnez tmp,1b + addiu var,4 +*/ + addiu src,2 + la inSize,lzma_c_len + la outSize,lzma_u_len + + addu poutSizeProcessed,sp,outSizeProcessed + addiu pinSizeprocessed,sp,inSizeProcessed + + la tmp,lzma_properties + sw dst,dst_save(sp) + addiu CLzmaDecoderState,sp,lzma_args_sz + bal decompressor + sw tmp,0(CLzmaDecoderState) + lw dst,dst_save(sp) + lw outSize,outSizeProcessed(sp) + li tmp,%lo(lzma_stack_adjust-lzma_args_sz) + addu dst,outSize + subu sp,tmp + #include "arch/mips/mipsel.r3000/lzma_d.S" #include "include/header.S" diff --git a/src/stub/tmp/mipsel.r3000-linux.elf-entry.bin.dump b/src/stub/tmp/mipsel.r3000-linux.elf-entry.bin.dump new file mode 100644 index 00000000..bb4087ad --- /dev/null +++ b/src/stub/tmp/mipsel.r3000-linux.elf-entry.bin.dump @@ -0,0 +1,64 @@ +tmp/mipsel.r3000-linux.elf-entry.bin: file format elf32-littlemips + +Sections: +Idx Name Size VMA LMA File off Algn Flags + 0 ELFMAINX 00000028 00000000 00000000 00000034 2**0 CONTENTS, RELOC, READONLY + 1 NRV2E 00000218 00000000 00000000 0000005c 2**0 CONTENTS, RELOC, READONLY + 2 NRV2D 000001f0 00000000 00000000 00000274 2**0 CONTENTS, RELOC, READONLY + 3 NRV2B 000001b4 00000000 00000000 00000464 2**0 CONTENTS, RELOC, READONLY + 4 LZMA_ELF00 0000006c 00000000 00000000 00000618 2**0 CONTENTS, READONLY + 5 LZMA_DEC10 00000ad8 00000000 00000000 00000684 2**0 CONTENTS, READONLY + 6 LZMA_DEC20 00000ad8 00000000 00000000 0000115c 2**0 CONTENTS, READONLY + 7 LZMA_DEC30 00000004 00000000 00000000 00001c34 2**0 CONTENTS, READONLY + 8 NRV_TAIL 00000000 00000000 00000000 00001c38 2**0 CONTENTS, READONLY + 9 ELFMAINY 0000005e 00000000 00000000 00001c38 2**0 CONTENTS, RELOC, READONLY + 10 ELFMAINZ 000000c0 00000000 00000000 00001c96 2**0 CONTENTS, READONLY +SYMBOL TABLE: +00000000 l d ELFMAINY 00000000 ELFMAINY +00000000 l d ELFMAINZ 00000000 ELFMAINZ +00000000 l d ELFMAINX 00000000 ELFMAINX +00000000 l d NRV2E 00000000 NRV2E +00000000 l d NRV2D 00000000 NRV2D +00000000 l d NRV2B 00000000 NRV2B +00000000 l d LZMA_ELF00 00000000 LZMA_ELF00 +00000000 l d LZMA_DEC10 00000000 LZMA_DEC10 +00000000 l d LZMA_DEC20 00000000 LZMA_DEC20 +00000000 l d LZMA_DEC30 00000000 LZMA_DEC30 +00000000 l d NRV_TAIL 00000000 NRV_TAIL +00000000 *UND* 00000000 ADRM +00000000 *UND* 00000000 LENM +00000000 *UND* 00000000 JMPU +00000000 *UND* 00000000 ADRU +00000000 *UND* 00000000 ADRC +00000000 *UND* 00000000 LENU +00000000 *UND* 00000000 ADRX +00000000 *UND* 00000000 LENX +00000020 g O ELFMAINX 00000000 _start + +RELOCATION RECORDS FOR [ELFMAINX]: +OFFSET TYPE VALUE +00000000 R_MIPS_32 ADRM +00000004 R_MIPS_32 LENM +00000008 R_MIPS_32 JMPU +0000000c R_MIPS_32 ADRU +00000010 R_MIPS_32 ADRC +00000014 R_MIPS_32 LENU +00000018 R_MIPS_32 ADRX +0000001c R_MIPS_32 LENX +00000020 R_MIPS_PC16 ELFMAINZ + +RELOCATION RECORDS FOR [NRV2E]: +OFFSET TYPE VALUE +0000011c R_MIPS_PC16 ELFMAINY + +RELOCATION RECORDS FOR [NRV2D]: +OFFSET TYPE VALUE +0000011c R_MIPS_PC16 ELFMAINY + +RELOCATION RECORDS FOR [NRV2B]: +OFFSET TYPE VALUE +000000c4 R_MIPS_PC16 ELFMAINY + +RELOCATION RECORDS FOR [ELFMAINY]: +OFFSET TYPE VALUE +00000038 R_MIPS_PC16 ELFMAINZ