diff --git a/src/linker.cpp b/src/linker.cpp index b462970b..dc92ecb6 100644 --- a/src/linker.cpp +++ b/src/linker.cpp @@ -464,8 +464,17 @@ void ElfLinker::preprocessRelocations(char *start, const char *end) unsigned add = 0; if (char *p = strstr(symbol, "+0x")) { - *p = 0; - sscanf(p + 3, "%x", &add); +// Beware: sscanf("0xfffffffffffffffc", "%x", &add) ==> -1 == add +// because conversion stops after 32 bits for a non-long. +// Also, glibc-2.3.5 has a bug: even using "%lx" still gives -1 instead of -4. + long addend; + *p = 0; // terminate the symbol name + p+=3; + if ('f'==p[0] && 0==strncmp(p, "ffffffff", 8)) { + p+=8; // workaround a bug in glibc-2.3.5 + } + sscanf(p, "%lx", &addend); + add = (unsigned)addend; } addRelocation(section->name, offset, t, symbol, add); diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index eca8081f..1b412cbb 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -160,6 +160,32 @@ Linker *PackLinuxElf::newLinker() const return new ElfLinker; } +void PackLinuxElf::pack3(OutputFile *fo, Filter &ft) +{ + unsigned disp; + unsigned const zero = 0; + unsigned len = fo->getBytesWritten(); + fo->write(&zero, 3& -len); // ALIGN_UP + len += (3& -len); + set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info)) + fo->write(&disp, sizeof(disp)); + sz_pack2 = 4+ len; + + super::pack3(fo, ft); +} + +void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft) +{ + super::pack3(fo, ft); + set_native32(&elfout.phdr[0].p_filesz, sz_pack2); +} + +void PackLinuxElf64::pack3(OutputFile *fo, Filter &ft) +{ + super::pack3(fo, ft); + set_native64(&elfout.phdr[0].p_filesz, sz_pack2); +} + void PackLinuxElf::addStubEntrySections( upx_byte const *const proto, @@ -170,6 +196,12 @@ PackLinuxElf::addStubEntrySections( addLoader("ELFMAINX", NULL); } +void +PackLinuxElf::addLinkerSymbols() +{ + // empty +} + PackLinuxElf32::PackLinuxElf32(InputFile *f) : super(f), phdri(NULL), dynseg(NULL), hashtab(NULL), dynsym(NULL) @@ -580,19 +612,78 @@ PackLinuxElf64::buildLinuxLoader( linker->addSection("FOLDEXEC", cprLoader, sizeof(h) + sz_cpr); delete [] cprLoader; + addLoader("ELFMAINX", NULL); + addLoader("NRV2E", NULL); //addLoader(getDecompressorSections(), NULL); + addLoader("ELFMAINY", NULL); + addLoader("IDENTSTR", NULL); + addLoader("ELFMAINZ", NULL); addLoader("FOLDEXEC", NULL); + freezeLoader(); + addLinkerSymbols(); linker->relocate(); return getLoaderSize(); } void -PackLinuxElf64amd::addStubEntrySections( - upx_byte const *const /*proto*/, - unsigned const /*szproto*/ -) +PackLinuxElf64amd::addLinkerSymbols() { - // FIXME + unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info); + unsigned len = sz_pack2; + +#define PAGE_MASK (~0u<<12) +#define PAGE_SIZE (-PAGE_MASK) + lsize = /*getLoaderSize()*/ 64 * 1024; // upper bound; avoid circularity + acc_uint64l_t const lo_va_user = 0x400000; // XXX + acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr; + acc_uint64l_t adrc; + acc_uint64l_t adrm; + acc_uint64l_t adru; + acc_uint64l_t 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_native64( &elfout.ehdr.e_entry, + get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); + set_native64(&elfout.phdr[0].p_vaddr, lo_va_user); + set_native64(&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; + } + 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 + + //avoid circularity linker->defineSymbol("LENX", sz_pack2 - hlen); + linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion + + 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 + linker->defineSymbol("JMPU", 12 + lo_va_user); // trampoline for unmap + linker->defineSymbol("LENM", lenm); // len for map + linker->defineSymbol("ADRM", adrm); // addr for map +#undef PAGE_SIZE +#undef PAGE_MASK + } static const @@ -1346,7 +1437,6 @@ void PackLinuxElf32::pack2(OutputFile *fo, Filter &ft) if ((off_t)total_in != file_size) throwEOFException(); - set_native32(&elfout.phdr[0].p_filesz, fo->getBytesWritten()); } // Determine length of gap between PT_LOAD phdr[k] and closest PT_LOAD @@ -1448,87 +1538,6 @@ void PackLinuxElf64::pack2(OutputFile *fo, Filter &ft) if ((off_t)total_in != file_size) throwEOFException(); - set_native64(&elfout.phdr[0].p_filesz, fo->getBytesWritten()); -} - -void PackLinuxElf32::pack3(OutputFile *fo, Filter &ft) -{ - unsigned disp; - unsigned const zero = 0; - unsigned len = fo->getBytesWritten(); - fo->write(&zero, 3& -len); // align to 0 mod 4 - len += (3& -len); - set_native32(&disp, len); // FIXME? -(sz_elf_hdrs+sizeof(l_info)+sizeof(p_info)) - fo->write(&disp, sizeof(disp)); - - super::pack3(fo, ft); -} - -void PackLinuxElf64amd::pack3(OutputFile *fo, Filter &ft) -{ - char zero[8]; - unsigned const hlen = sz_elf_hdrs + sizeof(l_info) + sizeof(p_info); - unsigned const len0 = fo->getBytesWritten(); - unsigned len = len0; - unsigned const frag = 7 & -len; // align to 0 mod 8 - memset(zero, 0, sizeof(zero)); - fo->write(&zero, frag); - len += frag; - -#define PAGE_MASK (~0u<<12) -#define PAGE_SIZE (-PAGE_MASK) - lsize = getLoaderSize(); - acc_uint64l_t const lo_va_user = 0x400000; // XXX - acc_uint64l_t lo_va_stub = elfout.phdr[0].p_vaddr; - acc_uint64l_t adrc; - acc_uint64l_t adrm; - acc_uint64l_t adru; - acc_uint64l_t 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_native64( &elfout.ehdr.e_entry, - get_native64(&elfout.ehdr.e_entry) + lo_va_user - lo_va_stub); - set_native64(&elfout.phdr[0].p_vaddr, lo_va_user); - set_native64(&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; - } - 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("LENX", len0 - hlen); - linker->defineSymbol("ADRX", adrx); // compressed input for eXpansion - - 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 - linker->defineSymbol("JMPU", 12 + lo_va_user); // trampoline for unmap - linker->defineSymbol("LENM", lenm); // len for map - linker->defineSymbol("ADRM", adrm); // addr for map -#undef PAGE_SIZE -#undef PAGE_MASK - - super::pack3(fo, ft); } #include "bele.h" @@ -1703,11 +1712,6 @@ void PackLinuxElf32armBe::pack3(OutputFile *fo, Filter &ft) ARM_pack3(fo, ft, true); } -void PackLinuxElf::pack4(OutputFile *fo, Filter &ft) -{ - super::pack4(fo, ft); -} - void PackLinuxElf32::pack4(OutputFile *fo, Filter &ft) { overlay_offset = sz_elf_hdrs + sizeof(linfo); diff --git a/src/p_lx_elf.h b/src/p_lx_elf.h index 95a013fe..8abe3649 100644 --- a/src/p_lx_elf.h +++ b/src/p_lx_elf.h @@ -51,8 +51,8 @@ protected: virtual void pack1(OutputFile *, Filter &) = 0; // generate executable header virtual void pack2(OutputFile *, Filter &) = 0; // append compressed data - //virtual void pack3(OutputFile *, Filter &) = 0; // append loader - virtual void pack4(OutputFile *, Filter &) = 0; // append pack header + virtual void pack3(OutputFile *, Filter &) = 0; // append loader + //virtual void pack4(OutputFile *, Filter &) = 0; // append pack header virtual Linker* newLinker() const; virtual void generateElfHdr( @@ -60,6 +60,7 @@ protected: void const *proto, unsigned const brka ) = 0; + virtual void addLinkerSymbols(); virtual void addStubEntrySections(upx_byte const *, unsigned); virtual void unpack(OutputFile *fo) = 0; @@ -69,6 +70,7 @@ protected: unsigned sz_phdrs; // sizeof Phdr[] unsigned sz_elf_hdrs; // all Elf headers + unsigned sz_pack2; // after pack2(), before loader unsigned short e_machine; unsigned char ei_class; @@ -176,7 +178,7 @@ protected: virtual void pack1(OutputFile *, Filter &); // generate executable header virtual void pack2(OutputFile *, Filter &); // append compressed data - //virtual void pack3(OutputFile *, Filter &); // append loader + virtual void pack3(OutputFile *, Filter &); // append loader virtual void pack4(OutputFile *, Filter &); // append pack header virtual void unpack(OutputFile *fo); @@ -284,11 +286,11 @@ public: virtual bool canPack(); protected: virtual void pack1(OutputFile *, Filter &); // generate executable header - virtual void pack3(OutputFile *, Filter &); // append loader + //virtual void pack3(OutputFile *, Filter &); // append loader virtual const int *getCompressionMethods(int method, int level) const; virtual int buildLoader(const Filter *); virtual Linker* newLinker() const; - virtual void addStubEntrySections(upx_byte const *, unsigned); + virtual void addLinkerSymbols(); }; /************************************************************************* diff --git a/src/stub/amd64-linux.elf-entry.h b/src/stub/amd64-linux.elf-entry.h index cd99eb21..c657ca18 100644 --- a/src/stub/amd64-linux.elf-entry.h +++ b/src/stub/amd64-linux.elf-entry.h @@ -1,4 +1,4 @@ -/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 4969 (0x1369) bytes +/* amd64-linux.elf-entry.h -- created from amd64-linux.elf-entry.bin, 5104 (0x13f0) bytes This file is part of the UPX executable compressor. @@ -27,320 +27,328 @@ */ -#define LINUX_ELF64AMD_LOADER_SIZE 4969 -#define LINUX_ELF64AMD_LOADER_ADLER32 0x68fb7b22 -#define LINUX_ELF64AMD_LOADER_CRC32 0xae9a2117 +#define LINUX_ELF64AMD_LOADER_SIZE 5104 +#define LINUX_ELF64AMD_LOADER_ADLER32 0x90589c96 +#define LINUX_ELF64AMD_LOADER_CRC32 0x1ce3757b -unsigned char linux_elf64amd_loader[4969] = { +unsigned char linux_elf64amd_loader[5104] = { 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 0 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 10 */ - 0, 0, 0, 0, 0, 0, 0, 0, 80, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */ - 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 12, 0, 9, 0, /* 0x 30 */ + 0, 0, 0, 0, 0, 0, 0, 0, 48, 3, 0, 0, 0, 0, 0, 0, /* 0x 20 */ + 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 14, 0, 11, 0, /* 0x 30 */ 232, 0, 0, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72,137,254, /* 0x 40 */ - 72,137,215, 49,219, 49,201, 72,131,205,255,232, 0, 0, 0, 0, /* 0x 50 */ + 72,137,215, 49,219, 49,201, 72,131,205,255,232, 80, 0, 0, 0, /* 0x 50 */ 1,219,116, 2,243,195,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 60 */ 243,195, 72,141, 4, 47,131,249, 5,138, 16,118, 33, 72,131,253, /* 0x 70 */ 252,119, 27,131,233, 4,139, 16, 72,131,192, 4,131,233, 4,137, /* 0x 80 */ 23, 72,141,127, 4,115,239,131,193, 4,138, 16,116, 16, 72,255, /* 0x 90 */ 192,136, 23,131,233, 1,138, 16, 72,141,127, 1,117,240,243,195, /* 0x a0 */ - 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x b0 */ - 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255, /* 0x c0 */ -200, 65,255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, /* 0x d0 */ - 30, 72,131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 29, /* 0x e0 */ -193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, /* 0x f0 */ - 0, 0, 0, 0,209,248, 72, 99,232,114, 56,235, 14, 1,219,117, /* 0x 100 */ - 8,139, 30, 72,131,238,252, 17,219,114, 40,255,193, 1,219,117, /* 0x 110 */ - 8,139, 30, 72,131,238,252, 17,219,114, 24, 65,255,211, 17,201, /* 0x 120 */ - 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115,237,131,193, /* 0x 130 */ - 2,235, 5, 65,255,211, 17,201, 72,129,253, 0,251,255,255,131, /* 0x 140 */ -209, 2,232, 0, 0, 0, 0,233, 92,255,255,255, 0, 0, 0, 0, /* 0x 150 */ - 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, /* 0x 160 */ - 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, /* 0x 170 */ - 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 180 */ -115,235,131,232, 3,114, 23,193,224, 8, 15,182,210, 9,208, 72, /* 0x 190 */ -255,198,131,240,255, 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, /* 0x 1a0 */ - 1, 65,255,211, 17,201, 65,255,211, 17,201,117, 24,137,193,131, /* 0x 1b0 */ -192, 2, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238, /* 0x 1c0 */ -252, 17,219,115,237, 72,129,253, 0,243,255,255, 17,193,232, 0, /* 0x 1d0 */ - 0, 0, 0,235,131,252, 65, 91, 65,131,248, 8, 15,132, 0, 0, /* 0x 1e0 */ - 0, 0, 65,131,248, 2, 15,132, 0, 0, 0, 0, 89, 72,137,240, /* 0x 1f0 */ - 72, 41,200, 90, 72, 41,215, 89,137, 57, 91, 93,195, 10, 36, 73, /* 0x 200 */ -100, 58, 32, 85, 80, 88, 32, 40, 67, 41, 32, 49, 57, 57, 54, 45, /* 0x 210 */ - 50, 48, 48, 54, 32,116,104,101, 32, 85, 80, 88, 32, 84,101, 97, /* 0x 220 */ -109, 46, 32, 65,108,108, 32, 82,105,103,104,116,115, 32, 82,101, /* 0x 230 */ -115,101,114,118,101,100, 46, 32,104,116,116,112, 58, 47, 47,117, /* 0x 240 */ -112,120, 46,115,102, 46,110,101,116, 32, 36, 10, 0,104, 30, 0, /* 0x 250 */ - 0, 0, 90,232, 30, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, 69, /* 0x 260 */ - 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105, /* 0x 270 */ -108,101,100, 46, 10, 0, 94,106, 2, 95,106, 1, 88, 15, 5,106, /* 0x 280 */ -127, 95,106, 60, 88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, 90, /* 0x 290 */ -190, 0, 0, 0, 0,106, 50, 65, 90, 69, 41,192,106, 9, 88, 15, /* 0x 2a0 */ - 5, 57,199,117,168,104, 0, 0, 0, 0,104, 0, 0, 0, 0,190, /* 0x 2b0 */ - 0, 0, 0, 0,104, 0, 0, 0, 0,185, 0, 0, 0, 0,104, 0, /* 0x 2c0 */ - 0, 0, 0,104, 0, 0, 0, 0,137,250, 41,242, 1,213, 1,211, /* 0x 2d0 */ -252,243, 72,165,151,137,222, 80,146,173, 80, 72,137,225,173,151, /* 0x 2e0 */ -173, 68, 15,182,192,135,254,255,213, 89,195,204, 93,232,149,255, /* 0x 2f0 */ -255,255, 0, 46,115,121,109,116, 97, 98, 0, 46,115,116,114,116, /* 0x 300 */ - 97, 98, 0, 46,115,104,115,116,114,116, 97, 98, 0, 46,114,101, /* 0x 310 */ -108, 97, 76, 69, 88, 69, 67, 48, 48, 48, 0, 46,114,101,108, 97, /* 0x 320 */ - 78, 82, 86, 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, 66, /* 0x 330 */ - 0, 46,114,101,108, 97, 76, 69, 88, 69, 67, 48, 53, 48, 0, 0, /* 0x 340 */ +252, 65, 91, 0, 0, 0, 0, 0, 65,128,248, 8,116, 18,233,177, /* 0x b0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 72,255,198,136, 23, 72,255,199, /* 0x c0 */ +138, 22, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x d0 */ +114,230,141, 65, 1,235, 7,255,200, 65,255,211, 17,192, 65,255, /* 0x e0 */ +211, 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, /* 0x f0 */ + 22,115,228,131,232, 3,114, 29,193,224, 8, 15,182,210, 9,208, /* 0x 100 */ + 72,255,198,131,240,255, 15,132, 0, 0, 0, 0,209,248, 72, 99, /* 0x 110 */ +232,114, 56,235, 14, 1,219,117, 8,139, 30, 72,131,238,252, 17, /* 0x 120 */ +219,114, 40,255,193, 1,219,117, 8,139, 30, 72,131,238,252, 17, /* 0x 130 */ +219,114, 24, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131, /* 0x 140 */ +238,252, 17,219,115,237,131,193, 2,235, 5, 65,255,211, 17,201, /* 0x 150 */ + 72,129,253, 0,251,255,255,131,209, 2,232, 0, 0, 0, 0,233, /* 0x 160 */ + 92,255,255,255, 0, 0, 0, 0, 65,128,248, 2,116, 18,233,138, /* 0x 170 */ + 0, 0, 0, 0, 0, 0, 0, 0, 72,255,198,136, 23, 72,255,199, /* 0x 180 */ +138, 22, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, /* 0x 190 */ +114,230,141, 65, 1, 65,255,211, 17,192, 1,219,117, 10,139, 30, /* 0x 1a0 */ + 72,131,238,252, 17,219,138, 22,115,235,131,232, 3,114, 23,193, /* 0x 1b0 */ +224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, 0, /* 0x 1c0 */ + 0, 0, 0, 72, 99,232,141, 65, 1, 65,255,211, 17,201, 65,255, /* 0x 1d0 */ +211, 17,201,117, 24,137,193,131,192, 2, 65,255,211, 17,201, 1, /* 0x 1e0 */ +219,117, 8,139, 30, 72,131,238,252, 17,219,115,237, 72,129,253, /* 0x 1f0 */ + 0,243,255,255, 17,193,232, 0, 0, 0, 0,235,131, 89, 72,137, /* 0x 200 */ +240, 72, 41,200, 90, 72, 41,215, 89,137, 57, 91, 93,195,104, 30, /* 0x 210 */ + 0, 0, 0, 90,232, 0, 0, 0, 0, 80, 82, 79, 84, 95, 69, 88, /* 0x 220 */ + 69, 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97, /* 0x 230 */ +105,108,101,100, 46, 10, 0, 94,106, 2, 95,106, 1, 88, 15, 5, /* 0x 240 */ +106,127, 95,106, 60, 88, 15, 5, 91,191, 0, 0, 0, 0,106, 7, /* 0x 250 */ + 90,190, 0, 0, 0, 0,106, 50, 65, 90, 69, 41,192,106, 9, 88, /* 0x 260 */ + 15, 5, 57,199, 15,133, 0, 0, 0, 0,104, 0, 0, 0, 0,104, /* 0x 270 */ + 0, 0, 0, 0,190, 0, 0, 0, 0,104, 0, 0, 0, 0,185, 0, /* 0x 280 */ + 0, 0, 0,104, 0, 0, 0, 0, 65, 87,137,250, 41,242, 1,213, /* 0x 290 */ + 1,211,252,243, 72,165,151,137,222, 80,146,173, 80, 72,137,225, /* 0x 2a0 */ +173,151,173, 68, 15,182,192,135,254,255,213, 89,195,204, 93, 68, /* 0x 2b0 */ +139,125,247, 65,129,239,200, 0, 0, 0,232,137,255,255,255, 0, /* 0x 2c0 */ + 46,115,121,109,116, 97, 98, 0, 46,115,116,114,116, 97, 98, 0, /* 0x 2d0 */ + 46,115,104,115,116,114,116, 97, 98, 0, 46,114,101,108, 97, 69, /* 0x 2e0 */ + 76, 70, 77, 65, 73, 78, 88, 0, 46,114,101,108, 97, 78, 82, 86, /* 0x 2f0 */ + 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, 66, 0, 46,114, /* 0x 300 */ +101,108, 97, 69, 76, 70, 77, 65, 73, 78, 89, 0, 46,114,101,108, /* 0x 310 */ + 97, 69, 76, 70, 77, 65, 73, 78, 90, 0, 0, 0, 0, 0, 0, 0, /* 0x 320 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 330 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 340 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 350 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 360 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 370 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 380 */ - 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */ - 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, /* 0x 3a0 */ -112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */ - 27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3d0 */ - 0, 0, 0, 0, 0, 0, 0, 0,240, 7, 0, 0, 0, 0, 0, 0, /* 0x 3e0 */ - 48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, /* 0x 3f0 */ - 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */ - 46, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */ - 0, 0, 0, 0, 0, 0, 0, 0,176, 0, 0, 0, 0, 0, 0, 0, /* 0x 420 */ -172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 440 */ - 41, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 450 */ - 0, 0, 0, 0, 0, 0, 0, 0, 32, 8, 0, 0, 0, 0, 0, 0, /* 0x 460 */ - 48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 3, 0, 0, 0, /* 0x 470 */ - 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 480 */ - 57, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */ - 0, 0, 0, 0, 0, 0, 0, 0, 96, 1, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */ -133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */ - 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */ - 52, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4d0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 80, 8, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */ - 48, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 5, 0, 0, 0, /* 0x 4f0 */ - 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 500 */ - 68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */ - 0, 0, 0, 0, 0, 0, 0, 0,229, 1, 0, 0, 0, 0, 0, 0, /* 0x 520 */ - 29, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 530 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 540 */ - 63, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 550 */ - 0, 0, 0, 0, 0, 0, 0, 0,128, 8, 0, 0, 0, 0, 0, 0, /* 0x 560 */ - 8, 1, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 7, 0, 0, 0, /* 0x 570 */ - 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 580 */ - 17, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 590 */ - 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */ - 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5c0 */ - 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5d0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 80, 6, 0, 0, 0, 0, 0, 0, /* 0x 5e0 */ -104, 1, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 5, 0, 0, 0, /* 0x 5f0 */ - 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 600 */ - 9, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 610 */ - 0, 0, 0, 0, 0, 0, 0, 0,184, 7, 0, 0, 0, 0, 0, 0, /* 0x 620 */ - 53, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 630 */ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 640 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 650 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, /* 0x 660 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 670 */ - 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 680 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, /* 0x 690 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */ - 0, 0, 0, 0, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 1, 0, /* 0x 6c0 */ + 32, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 370 */ + 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, /* 0x 380 */ +115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 390 */ + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3a0 */ + 27, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3b0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 72, 8, 0, 0, 0, 0, 0, 0, /* 0x 3c0 */ + 24, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 1, 0, 0, 0, /* 0x 3d0 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 3e0 */ + 46, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 3f0 */ + 0, 0, 0, 0, 0, 0, 0, 0,184, 0, 0, 0, 0, 0, 0, 0, /* 0x 400 */ +188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 410 */ + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 420 */ + 41, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 430 */ + 0, 0, 0, 0, 0, 0, 0, 0, 96, 8, 0, 0, 0, 0, 0, 0, /* 0x 440 */ + 48, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 3, 0, 0, 0, /* 0x 450 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 460 */ + 57, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 470 */ + 0, 0, 0, 0, 0, 0, 0, 0,120, 1, 0, 0, 0, 0, 0, 0, /* 0x 480 */ +149, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 490 */ + 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4a0 */ + 52, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4b0 */ + 0, 0, 0, 0, 0, 0, 0, 0,144, 8, 0, 0, 0, 0, 0, 0, /* 0x 4c0 */ + 48, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 5, 0, 0, 0, /* 0x 4d0 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 4e0 */ + 68, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 4f0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 13, 2, 0, 0, 0, 0, 0, 0, /* 0x 500 */ + 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 510 */ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 520 */ + 63, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 530 */ + 0, 0, 0, 0, 0, 0, 0, 0,192, 8, 0, 0, 0, 0, 0, 0, /* 0x 540 */ + 24, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 7, 0, 0, 0, /* 0x 550 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 560 */ + 82, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 570 */ + 0, 0, 0, 0, 0, 0, 0, 0, 71, 2, 0, 0, 0, 0, 0, 0, /* 0x 580 */ +136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 590 */ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5a0 */ + 77, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5b0 */ + 0, 0, 0, 0, 0, 0, 0, 0,216, 8, 0, 0, 0, 0, 0, 0, /* 0x 5c0 */ +216, 0, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 9, 0, 0, 0, /* 0x 5d0 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 5e0 */ + 17, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 5f0 */ + 0, 0, 0, 0, 0, 0, 0, 0,207, 2, 0, 0, 0, 0, 0, 0, /* 0x 600 */ + 91, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 610 */ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 620 */ + 1, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 630 */ + 0, 0, 0, 0, 0, 0, 0, 0,176, 6, 0, 0, 0, 0, 0, 0, /* 0x 640 */ +104, 1, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 6, 0, 0, 0, /* 0x 650 */ + 8, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, /* 0x 660 */ + 9, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 670 */ + 0, 0, 0, 0, 0, 0, 0, 0, 24, 8, 0, 0, 0, 0, 0, 0, /* 0x 680 */ + 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 690 */ + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6a0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6b0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 1, 0, /* 0x 6c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6d0 */ - 8, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6e0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 16, 0, 0, 0, /* 0x 6f0 */ + 0, 0, 0, 0, 3, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 6e0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 9, 0, /* 0x 6f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 700 */ - 18, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 710 */ - 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 0, 16, 0, 0, 0, /* 0x 720 */ + 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 710 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 5, 0, /* 0x 720 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 730 */ - 28, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 740 */ - 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, 0, 16, 0, 0, 0, /* 0x 750 */ + 1, 0, 0, 0, 16, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 740 */ + 0, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 16, 0, 0, 0, /* 0x 750 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 760 */ - 38, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 770 */ - 0, 0, 0, 0, 0, 0, 0, 0, 43, 0, 0, 0, 16, 0, 0, 0, /* 0x 780 */ + 13, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 770 */ + 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, 0, 16, 0, 0, 0, /* 0x 780 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 790 */ - 48, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7a0 */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 7b0 */ - 65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 7c0 */ - 68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 7d0 */ - 84, 67, 0, 65, 68, 82, 88, 0, 76, 69, 78, 88, 0, 0, 0, 0, /* 0x 7e0 */ - 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, /* 0x 7f0 */ - 18, 1, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, /* 0x 800 */ - 2, 0, 0, 0, 4, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x 810 */ -163, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 820 */ - 46, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 0, 0, 0, 0, /* 0x 830 */ - 2, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, /* 0x 840 */ -127, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 850 */ - 46, 0, 0, 0, 0, 0, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, /* 0x 860 */ - 2, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, /* 0x 870 */ -180, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 6, 0, 0, 0, /* 0x 880 */ - 0, 0, 0, 0, 0, 0, 0, 0,188, 0, 0, 0, 0, 0, 0, 0, /* 0x 890 */ - 10, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 8a0 */ -209, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, /* 0x 8b0 */ - 0, 0, 0, 0, 0, 0, 0, 0,214, 0, 0, 0, 0, 0, 0, 0, /* 0x 8c0 */ - 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 8d0 */ -219, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, /* 0x 8e0 */ - 0, 0, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, /* 0x 8f0 */ - 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 900 */ -229, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, /* 0x 910 */ - 0, 0, 0, 0, 0, 0, 0, 0,234, 0, 0, 0, 0, 0, 0, 0, /* 0x 920 */ - 10, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 930 */ -239, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, /* 0x 940 */ - 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, /* 0x 950 */ - 2, 0, 0, 0, 2, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, /* 0x 960 */ - 19, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, /* 0x 970 */ - 4, 0, 0, 0, 0, 0, 0, 0, 10,116,109,112, 47, 97,109,100, /* 0x 980 */ - 54, 52, 45,108,105,110,117,120, 46,101,108,102, 45,101,110,116, /* 0x 990 */ -114,121, 46, 98,105,110, 58, 32, 32, 32, 32, 32,102,105,108,101, /* 0x 9a0 */ - 32,102,111,114,109, 97,116, 32,101,108,102, 54, 52, 45,120, 56, /* 0x 9b0 */ - 54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, /* 0x 9c0 */ - 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x 9d0 */ - 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, /* 0x 9e0 */ - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, /* 0x 9f0 */ - 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x a00 */ - 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, /* 0x a10 */ - 70,108, 97,103,115, 10, 32, 32, 48, 32, 76, 69, 88, 69, 67, 48, /* 0x a20 */ - 48, 48, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 55, 48, /* 0x a30 */ - 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x a40 */ - 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x a50 */ - 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, /* 0x a60 */ - 50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x a70 */ - 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x a80 */ - 32, 32, 49, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, /* 0x a90 */ - 32, 32, 48, 48, 48, 48, 48, 48, 97, 99, 32, 32, 48, 48, 48, 48, /* 0x aa0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x ab0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x ac0 */ - 48, 48, 48, 48, 48, 48, 98, 48, 32, 32, 50, 42, 42, 51, 32, 32, /* 0x ad0 */ - 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, /* 0x ae0 */ - 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, /* 0x af0 */ - 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, /* 0x b00 */ - 48, 48, 56, 53, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b10 */ - 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b20 */ - 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, /* 0x b30 */ - 54, 48, 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, /* 0x b40 */ - 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, /* 0x b50 */ - 78, 76, 89, 10, 32, 32, 51, 32, 76, 69, 88, 69, 67, 48, 53, 48, /* 0x b60 */ - 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 49,100, 32, 32, /* 0x b70 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b80 */ - 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b90 */ - 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,101, 53, 32, 32, 50, 42, /* 0x ba0 */ - 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, /* 0x bb0 */ - 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89, /* 0x bc0 */ - 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, /* 0x bd0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, /* 0x be0 */ - 32, 32,100, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 9, 48, 48, /* 0x bf0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x c00 */ - 69, 88, 69, 67, 48, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c10 */ - 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x c20 */ - 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c30 */ - 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, /* 0x c40 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x c50 */ - 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, /* 0x c60 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, /* 0x c70 */ - 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c80 */ - 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 69, 88, /* 0x c90 */ - 69, 67, 48, 53, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ca0 */ - 48, 48, 48, 48, 48, 48, 32, 76, 69, 88, 69, 67, 48, 53, 48, 10, /* 0x cb0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x cc0 */ - 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 48, /* 0x cd0 */ - 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ce0 */ - 48, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, /* 0x cf0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, /* 0x d00 */ - 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, /* 0x d10 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 77, 10, 48, /* 0x d20 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, /* 0x d30 */ - 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, /* 0x d40 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, /* 0x d50 */ - 69, 78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d60 */ - 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, /* 0x d70 */ - 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d80 */ - 48, 48, 48, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x d90 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, /* 0x da0 */ - 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x db0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 85, 10, 48, 48, /* 0x dc0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x dd0 */ - 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, /* 0x de0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, /* 0x df0 */ - 82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e00 */ - 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, /* 0x e10 */ - 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e20 */ - 48, 48, 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e30 */ - 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x e40 */ - 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e50 */ - 48, 48, 48, 48, 48, 48, 48, 32, 67, 78, 84, 67, 10, 48, 48, 48, /* 0x e60 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x e70 */ - 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x e80 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, /* 0x e90 */ - 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ea0 */ - 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x eb0 */ - 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ec0 */ - 48, 32, 76, 69, 78, 88, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, /* 0x ed0 */ - 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, /* 0x ee0 */ - 91, 76, 69, 88, 69, 67, 48, 48, 48, 93, 58, 10, 79, 70, 70, 83, /* 0x ef0 */ - 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, /* 0x f00 */ - 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, /* 0x f10 */ - 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f20 */ - 48, 48, 48, 48, 48, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, /* 0x f30 */ - 80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 53, /* 0x f40 */ - 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f50 */ - 48, 49, 49, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f60 */ - 48, 48, 48, 49, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, /* 0x f70 */ - 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, 67, 48, 53, 48, /* 0x f80 */ - 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x f90 */ -102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, /* 0x fa0 */ - 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, /* 0x fb0 */ - 86, 50, 69, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, /* 0x fc0 */ - 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, /* 0x fd0 */ - 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, /* 0x fe0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 97, 51, /* 0x ff0 */ - 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, /* 0x1000 */ - 32, 32, 32, 76, 69, 88, 69, 67, 48, 48, 48, 43, 48,120, 48, 48, /* 0x1010 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,101, 10, 48, /* 0x1020 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 48, 32, /* 0x1030 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1040 */ - 32, 32, 76, 69, 88, 69, 67, 48, 53, 48, 43, 48,120, 48, 48, 48, /* 0x1050 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 10, 10, 10, /* 0x1060 */ - 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1070 */ - 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, /* 0x1080 */ - 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1090 */ - 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x10a0 */ - 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, /* 0x10b0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 55,102, 32, 82, 95, 88, 56, 54, /* 0x10c0 */ - 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, /* 0x10d0 */ - 69, 67, 48, 48, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x10e0 */ - 48, 48, 48, 48, 48, 48, 50,101, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x10f0 */ - 48, 48, 48, 48, 48, 48, 48, 52, 55, 32, 82, 95, 88, 56, 54, 95, /* 0x1100 */ - 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 76, 69, 88, 69, /* 0x1110 */ - 67, 48, 53, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1120 */ - 48, 48, 48, 48, 48, 49, 51, 10, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x1130 */ - 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x1140 */ - 32, 91, 76, 69, 88, 69, 67, 48, 53, 48, 93, 58, 10, 79, 70, 70, /* 0x1150 */ - 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, /* 0x1160 */ - 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1170 */ - 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1180 */ - 48, 48, 48, 48, 48, 98, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1190 */ - 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 77, 10, 48, /* 0x11a0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 98, 99, 32, /* 0x11b0 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x11c0 */ - 32, 32, 76, 69, 78, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x11d0 */ - 48, 48, 48, 48, 48,100, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x11e0 */ - 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 74, 77, 80, 85, 10, 48, /* 0x11f0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,100, 54, 32, /* 0x1200 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1210 */ - 32, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1220 */ - 48, 48, 48, 48, 48,100, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1230 */ - 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 67, 10, 48, /* 0x1240 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,101, 48, 32, /* 0x1250 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1260 */ - 32, 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1270 */ - 48, 48, 48, 48, 48,101, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1280 */ - 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 67, 78, 84, 67, 10, 48, /* 0x1290 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,101, 97, 32, /* 0x12a0 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x12b0 */ - 32, 32, 65, 68, 82, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x12c0 */ - 48, 48, 48, 48, 48,101,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x12d0 */ - 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 88, 10, 48, /* 0x12e0 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57, 32, /* 0x12f0 */ - 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x1300 */ - 32, 32, 78, 82, 86, 50, 69, 43, 48,120, 48, 48, 48, 48, 48, 48, /* 0x1310 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 10, 48, 48, 48, 48, 48, /* 0x1320 */ - 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 32, 82, 95, 88, 56, /* 0x1330 */ - 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, /* 0x1340 */ - 86, 50, 66, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1350 */ - 48, 48, 48, 48, 48, 52, 10, 10, 10 /* 0x1360 */ + 23, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7a0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 28, 0, 0, 0, 16, 0, 0, 0, /* 0x 7b0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7c0 */ + 33, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7d0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 16, 0, 0, 0, /* 0x 7e0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 7f0 */ + 43, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 800 */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95,115,116, 97,114,116, 0, /* 0x 810 */ + 65, 68, 82, 77, 0, 76, 69, 78, 77, 0, 74, 77, 80, 85, 0, 65, /* 0x 820 */ + 68, 82, 85, 0, 65, 68, 82, 67, 0, 76, 69, 78, 85, 0, 67, 78, /* 0x 830 */ + 84, 67, 0, 65, 68, 82, 88, 0, 1, 0, 0, 0, 0, 0, 0, 0, /* 0x 840 */ + 2, 0, 0, 0, 3, 0, 0, 0,114, 0, 0, 0, 0, 0, 0, 0, /* 0x 850 */ +179, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 860 */ + 46, 0, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, /* 0x 870 */ + 2, 0, 0, 0, 2, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x 880 */ +143, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, /* 0x 890 */ + 46, 0, 0, 0, 0, 0, 0, 0, 87, 0, 0, 0, 0, 0, 0, 0, /* 0x 8a0 */ + 2, 0, 0, 0, 2, 0, 0, 0,252,255,255,255,255,255,255,255, /* 0x 8b0 */ + 24, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 3, 0, 0, 0, /* 0x 8c0 */ +252,255,255,255,255,255,255,255, 19, 0, 0, 0, 0, 0, 0, 0, /* 0x 8d0 */ + 10, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 8e0 */ + 27, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, /* 0x 8f0 */ + 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 0, 0, 0, 0, /* 0x 900 */ + 10, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 910 */ + 57, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, /* 0x 920 */ + 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, /* 0x 930 */ + 10, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 940 */ + 67, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 12, 0, 0, 0, /* 0x 950 */ + 0, 0, 0, 0, 0, 0, 0, 0, 72, 0, 0, 0, 0, 0, 0, 0, /* 0x 960 */ + 10, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x 970 */ + 77, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 14, 0, 0, 0, /* 0x 980 */ + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, /* 0x 990 */ + 2, 0, 0, 0, 2, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, /* 0x 9a0 */ + 10,116,109,112, 47, 97,109,100, 54, 52, 45,108,105,110,117,120, /* 0x 9b0 */ + 46,101,108,102, 45,101,110,116,114,121, 46, 98,105,110, 58, 32, /* 0x 9c0 */ + 32, 32, 32, 32,102,105,108,101, 32,102,111,114,109, 97,116, 32, /* 0x 9d0 */ +101,108,102, 54, 52, 45,120, 56, 54, 45, 54, 52, 10, 10, 83,101, /* 0x 9e0 */ + 99,116,105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, /* 0x 9f0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, /* 0x a00 */ + 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x a10 */ + 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, /* 0x a20 */ + 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, /* 0x a30 */ + 32, 32, 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, /* 0x a40 */ + 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, /* 0x a50 */ + 48, 48, 48, 48, 48, 48, 55, 51, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x a60 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x a70 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, /* 0x a80 */ + 48, 48, 48, 48, 52, 48, 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, /* 0x a90 */ + 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, /* 0x aa0 */ + 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49, 32, 78, 82, 86, 50, /* 0x ab0 */ + 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x ac0 */ + 98, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ad0 */ + 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ae0 */ + 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 98, 56, /* 0x af0 */ + 32, 32, 50, 42, 42, 51, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, /* 0x b00 */ + 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, /* 0x b10 */ + 89, 10, 32, 32, 50, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, /* 0x b20 */ + 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 57, 53, 32, 32, 48, 48, /* 0x b30 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, /* 0x b40 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x b50 */ + 32, 32, 48, 48, 48, 48, 48, 49, 55, 56, 32, 32, 50, 42, 42, 51, /* 0x b60 */ + 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, /* 0x b70 */ + 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, /* 0x b80 */ + 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, 32, 48, 48, /* 0x b90 */ + 48, 48, 48, 48, 51, 97, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ba0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, /* 0x bb0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, /* 0x bc0 */ + 48, 50, 48,100, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, /* 0x bd0 */ + 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, /* 0x be0 */ + 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 69, 76, 70, 77, 65, 73, /* 0x bf0 */ + 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 56, 56, /* 0x c00 */ + 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c10 */ + 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c20 */ + 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 52, 55, 32, 32, /* 0x c30 */ + 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, /* 0x c40 */ + 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, /* 0x c50 */ + 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, /* 0x c60 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, /* 0x c70 */ + 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, /* 0x c80 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x c90 */ + 32, 69, 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, /* 0x ca0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32, /* 0x cb0 */ +100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, /* 0x cc0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, /* 0x cd0 */ + 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ce0 */ + 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, /* 0x cf0 */ + 76, 70, 77, 65, 73, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d00 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, /* 0x d10 */ + 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d20 */ + 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, /* 0x d30 */ + 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d40 */ + 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d50 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, /* 0x d60 */ + 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x d70 */ + 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, /* 0x d80 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, /* 0x d90 */ + 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, /* 0x da0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x db0 */ + 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x dc0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x dd0 */ + 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x de0 */ + 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 77, 10, 48, 48, 48, /* 0x df0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, /* 0x e00 */ + 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, /* 0x e10 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 76, 69, 78, /* 0x e20 */ + 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e30 */ + 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, /* 0x e40 */ + 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e50 */ + 48, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e60 */ + 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x e70 */ + 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x e80 */ + 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 85, 10, 48, 48, 48, 48, /* 0x e90 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, /* 0x ea0 */ + 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, /* 0x eb0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 67, /* 0x ec0 */ + 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ed0 */ + 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, /* 0x ee0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x ef0 */ + 32, 76, 69, 78, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f00 */ + 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, /* 0x f10 */ + 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x f20 */ + 48, 48, 48, 48, 48, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, /* 0x f30 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, /* 0x f40 */ + 32, 32, 32, 32, 42, 85, 78, 68, 42, 9, 48, 48, 48, 48, 48, 48, /* 0x f50 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 68, 82, 88, 10, /* 0x f60 */ + 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, /* 0x f70 */ + 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, /* 0x f80 */ + 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, /* 0x f90 */ + 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x fa0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, /* 0x fb0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 32, /* 0x fc0 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x fd0 */ + 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, /* 0x fe0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, 10, 10, 10, /* 0x ff0 */ + 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, /* 0x1000 */ + 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, /* 0x1010 */ + 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1020 */ + 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, /* 0x1030 */ + 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, /* 0x1040 */ + 48, 48, 48, 48, 48, 48, 48, 48, 98, 51, 32, 82, 95, 88, 56, 54, /* 0x1050 */ + 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, /* 0x1060 */ + 77, 65, 73, 78, 88, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1070 */ + 48, 48, 48, 48, 48, 48, 50,101, 10, 48, 48, 48, 48, 48, 48, 48, /* 0x1080 */ + 48, 48, 48, 48, 48, 48, 48, 54, 48, 32, 82, 95, 88, 56, 54, 95, /* 0x1090 */ + 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, /* 0x10a0 */ + 65, 73, 78, 89, 43, 48,120,102,102,102,102,102,102,102,102,102, /* 0x10b0 */ +102,102,102,102,102,102, 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, /* 0x10c0 */ + 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, /* 0x10d0 */ + 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, 70, 83, 69, 84, /* 0x10e0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, /* 0x10f0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, /* 0x1100 */ + 85, 69, 32, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1110 */ + 48, 48, 56,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, /* 0x1120 */ + 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 43, /* 0x1130 */ + 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1140 */ + 50,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1150 */ + 48, 53, 55, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, /* 0x1160 */ + 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 43, 48, /* 0x1170 */ +120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, /* 0x1180 */ + 99, 10, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, /* 0x1190 */ + 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, /* 0x11a0 */ + 65, 73, 78, 89, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, /* 0x11b0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, /* 0x11c0 */ + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, /* 0x11d0 */ + 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, /* 0x11e0 */ + 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, /* 0x11f0 */ + 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120,102, /* 0x1200 */ +102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, /* 0x1210 */ + 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, /* 0x1220 */ + 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, /* 0x1230 */ + 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, /* 0x1240 */ + 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, /* 0x1250 */ + 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 32, 10, 48, /* 0x1260 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 51, 32, /* 0x1270 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1280 */ + 32, 32, 65, 68, 82, 77, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1290 */ + 48, 48, 48, 48, 48, 49, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x12a0 */ + 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 77, 10, 48, /* 0x12b0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 52, 32, /* 0x12c0 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x12d0 */ + 32, 32, 74, 77, 80, 85, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x12e0 */ + 48, 48, 48, 48, 48, 51, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x12f0 */ + 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 85, 10, 48, /* 0x1300 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51,101, 32, /* 0x1310 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1320 */ + 32, 32, 65, 68, 82, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1330 */ + 48, 48, 48, 48, 48, 52, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1340 */ + 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 76, 69, 78, 85, 10, 48, /* 0x1350 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 56, 32, /* 0x1360 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, 32, 32, 32, /* 0x1370 */ + 32, 32, 67, 78, 84, 67, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, /* 0x1380 */ + 48, 48, 48, 48, 48, 52,100, 32, 82, 95, 88, 56, 54, 95, 54, 52, /* 0x1390 */ + 95, 51, 50, 32, 32, 32, 32, 32, 32, 32, 65, 68, 82, 88, 10, 48, /* 0x13a0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,102, 32, /* 0x13b0 */ + 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, /* 0x13c0 */ + 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 43, 48,120, 48, 48, 48, /* 0x13d0 */ + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,100, 10, 10, 10 /* 0x13e0 */ }; diff --git a/src/stub/src/amd64-linux.elf-entry.asm b/src/stub/src/amd64-linux.elf-entry.asm index b0a6edf8..64e9b3f1 100644 --- a/src/stub/src/amd64-linux.elf-entry.asm +++ b/src/stub/src/amd64-linux.elf-entry.asm @@ -33,6 +33,9 @@ #include "arch/amd64/regs.h" +sz_Ehdr= 64 +sz_Phdr= 56 + sz_l_info= 12 l_lsize= 8 @@ -61,9 +64,10 @@ M_NRV2B_LE32=2 // ../conf.h M_NRV2E_LE32=8 -.section LEXEC000 +.section ELFMAINX _start: .globl _start call main // push &decompress +ret_main: /* Returns 0 on success; non-zero on failure. */ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint method) @@ -74,6 +78,7 @@ decompress: // (uchar const *src, size_t lsrc, uchar *dst, u32 &ldst, uint meth #define dst %arg3 #define ldst %arg4 /* Out: actually a reference: &len_dst */ #define meth %arg5l +#define methb %arg5b /* Working registers */ #define off %eax /* XXX: 2GB */ @@ -154,20 +159,21 @@ copy1: copy0: rep; ret +setup: + cld + pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit + .section NRV2E #include "arch/amd64/nrv2e_d.S" .section NRV2B #include "arch/amd64/nrv2b_d.S" +// Bug in assembler: next line looks like ". .section LZMA" +// which is a syntax error because of the extra dot ". " at the beginning. //.section LZMA //#include "arch/amd64/lzma_d.S" -.section LEXEC050 -setup: - cld - pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit - cmpl $ M_NRV2E_LE32,meth; je top_n2e - cmpl $ M_NRV2B_LE32,meth; je top_n2b +.section ELFMAINY eof: pop %rcx // &input_eof movq %rsi,%rax; subq %rcx,%rax // src -= eof; // return 0: good; else: bad @@ -176,20 +182,20 @@ eof: pop %rbx; pop %rbp ret -/* Temporary until we get the buildLoader stuff working ... */ - .ascii "\n$Id: UPX (C) 1996-2006 the UPX Team. " - .asciz "All Rights Reserved. http://upx.sf.net $\n" - /* These from /usr/include/asm-x86_64/unistd.h */ __NR_write = 1 __NR_exit = 60 msg_SELinux: push $ L71 - L70; pop %arg3 // length - call L71 + call L72 L70: .asciz "PROT_EXEC|PROT_WRITE failed.\n" L71: + // IDENTSTR goes here + +.section ELFMAINZ +L72: pop %arg2 // message text push $2; pop %arg1 // fd stderr push $ __NR_write; pop %rax @@ -238,7 +244,7 @@ unfold: push $ LENU // for unmap in fold movl $ CNTC,%ecx push $ ADRX //# for upx_main - push $ LENX // for upx_main + push %r15 // LENX for upx_main /* Move and relocate if compressed overlaps uncompressed. Move by 0 when total compressed executable is < 3MB. @@ -268,12 +274,14 @@ unfold: main: int3 # uncomment for debugging pop %rbp // &decompress + movl -4-(ret_main - _start)(%rbp),%r15d // length which precedes stub + subl $ sz_Ehdr + 2*sz_Phdr + sz_l_info + sz_p_info,%r15d call unfold // push &b_info - /* { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} */ + // { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} /*__XTHEENDX__*/ /* vi:ts=8:et:nowrap -*/ + */ diff --git a/src/stub/src/arch/amd64/nrv2b_d.S b/src/stub/src/arch/amd64/nrv2b_d.S index 2283fc49..00cdf853 100644 --- a/src/stub/src/arch/amd64/nrv2b_d.S +++ b/src/stub/src/arch/amd64/nrv2b_d.S @@ -29,6 +29,7 @@ */ + cmpb $ M_NRV2B_LE32,methb; je top_n2b; jmp not_n2b .p2align 3 lit_n2b: incq %rsi; movb %dl,(%rdi) @@ -62,6 +63,7 @@ gotlen_n2b: bot_n2b: # In: 0==len jmp top_n2b +not_n2b: /* vi:ts=8:et:nowrap */ diff --git a/src/stub/src/arch/amd64/nrv2e_d.S b/src/stub/src/arch/amd64/nrv2e_d.S index 5c08398c..dd6397c8 100644 --- a/src/stub/src/arch/amd64/nrv2e_d.S +++ b/src/stub/src/arch/amd64/nrv2e_d.S @@ -29,6 +29,7 @@ */ + cmpb $ M_NRV2E_LE32,methb; je top_n2e; jmp not_n2e .p2align 3 lit_n2e: incq %rsi; movb %dl,(%rdi) @@ -75,6 +76,8 @@ gotlen_n2e: bot_n2e: # In: 0==len jmp top_n2e +not_n2e: + /* vi:ts=8:et:nowrap */ diff --git a/src/stub/src/arch/amd64/regs.h b/src/stub/src/arch/amd64/regs.h index d761dd07..a99ce818 100644 --- a/src/stub/src/arch/amd64/regs.h +++ b/src/stub/src/arch/amd64/regs.h @@ -11,5 +11,6 @@ #define sys4l r10d #define arg5 r8 #define arg5l r8d +#define arg5b r8b #define arg6 r9 #define arg6l r9d