From c36977f0b10c33ad3feba9830188fe4cb40c9fa3 Mon Sep 17 00:00:00 2001 From: John Reiser Date: Fri, 21 Jun 2024 10:43:47 -0700 Subject: [PATCH] ELF: amd64-linux main programs use 2-step de-compressor The first $ARCH to move to 2-step de-compressor for ELF main programs. De-compressor uses memfd_create to comply with strictest SELinux settings (no PROT_WRITE on any PROT_EXEC page). First step de-compressor always uses NRV2B to de-compress the second step, and the second step can use a different de-compressor for each PT_LOAD. modified: p_lx_elf.cpp modified: stub/Makefile modified: stub/src/amd64-linux.elf-fold.lds modified: stub/src/amd64-linux.elf-entry.S modified: stub/src/amd64-linux.elf-fold.S new file: stub/src/amd64-linux.elf-main2.c modified: stub/amd64-linux.elf-entry.h modified: stub/amd64-linux.elf-fold.h modified: stub/tmp/amd64-linux.elf-entry.bin.dump modified: stub/tmp/amd64-linux.elf-fold.map --- src/p_lx_elf.cpp | 173 ++- src/stub/Makefile | 48 +- src/stub/amd64-linux.elf-entry.h | 602 +-------- src/stub/amd64-linux.elf-fold.h | 1316 ++++++++++++++++--- src/stub/src/amd64-linux.elf-entry.S | 384 +++--- src/stub/src/amd64-linux.elf-fold.S | 187 +-- src/stub/src/amd64-linux.elf-fold.lds | 12 +- src/stub/src/amd64-linux.elf-main2.c | 818 ++++++++++++ src/stub/tmp/amd64-linux.elf-entry.bin.dump | 47 +- src/stub/tmp/amd64-linux.elf-fold.map | 113 +- 10 files changed, 2547 insertions(+), 1153 deletions(-) create mode 100644 src/stub/src/amd64-linux.elf-main2.c diff --git a/src/p_lx_elf.cpp b/src/p_lx_elf.cpp index b5773871..2330f9c8 100644 --- a/src/p_lx_elf.cpp +++ b/src/p_lx_elf.cpp @@ -1466,7 +1466,7 @@ PackLinuxElf32::buildLinuxLoader( // EXP_TAIL FIXME: unfilter // SO_TAIL // SO_MAIN C-language supervision based on PT_LOADs - char sec[120]; + char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience int len = 0; unsigned m_decompr = (methods_used ? methods_used : (1u << ph_forced_method(ph.method))); len += snprintf(sec, sizeof(sec), "%s", "SO_HEAD,ptr_NEXT,EXP_HEAD"); @@ -1494,8 +1494,44 @@ PackLinuxElf32::buildLinuxLoader( method = M_NRV2B_LE32; // requires unaligned fetch if (this->e_machine==Elf32_Ehdr::EM_ARM) method = M_NRV2B_8; //only ARM v6 and above has unaligned fetch + } // end shlib + else if (0 +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_386 +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_ARM + ) { // main program with ELF2 de-compressor + initLoader(fold, szfold); + char sec[120]; + int len = 0; + unsigned m_decompr = (methods_used ? methods_used : (1u << ph_forced_method(ph.method))); + len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD"); + if (((1u<getLoader(&sz_unc_int); + sz_unc = sz_unc_int; + } + method = M_NRV2B_LE32; // requires unaligned fetch + if (this->e_machine==Elf32_Ehdr::EM_ARM) + method = M_NRV2B_8; //only ARM v6 and above has unaligned fetch } - else { + else { // main program with ELF1 de-compressor cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold; unsigned fold_hdrlen = upx::umax(0x80u, usizeof(hf->ehdr) + get_te16(&hf->ehdr.e_phentsize) * get_te16(&hf->ehdr.e_phnum) + @@ -1529,16 +1565,28 @@ PackLinuxElf32::buildLinuxLoader( initLoader(proto, szproto, -1, sz_cpr); NO_printf("FOLDEXEC unc=%#x cpr=%#x\n", sz_unc, sz_cpr); linker->addSection("FOLDEXEC", mb_cprLoader, sizeof(b_info) + sz_cpr, 0); - if (xct_off - && ( this->e_machine==Elf32_Ehdr::EM_ARM + if (xct_off // shlib + && (0 + || this->e_machine==Elf32_Ehdr::EM_ARM +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC || this->e_machine==Elf32_Ehdr::EM_386) - ) { + ) { // shlib with ELF2 de-compressor addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR"); } - else { + else if (0 +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_ARM +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_MIPS +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_PPC +//ELF2 NYI || this->e_machine==Elf32_Ehdr::EM_386 + ) { // main program with ELF2 de-compressor + addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR"); + defineSymbols(ft); + } + else { // ELF1 de-compressor addStubEntrySections(ft, (methods_used ? methods_used : (1u << ph_forced_method(ph.method))) ); - if (!xct_off) { + if (!xct_off) { // main program defineSymbols(ft); } } @@ -1601,7 +1649,40 @@ PackLinuxElf64::buildLinuxLoader( } method = M_NRV2B_LE32; // requires unaligned fetch } - else { + else if (0 + || this->e_machine==Elf64_Ehdr::EM_X86_64 +//ELF2 NYI || this->e_machine==Elf64_Ehdr::EM_PPC64 +//ELF2 NYI || this->e_machine==Elf64_Ehdr::EM_AARCH64 + ) { // main program with ELF2 de-compressor + initLoader(fold, szfold); + char sec[120]; memset(sec, 0, sizeof(sec)); // debug convenience + int len = 0; + unsigned m_decompr = (methods_used ? methods_used : (1u << ph_forced_method(ph.method))); + len += snprintf(sec, sizeof(sec), "%s", ".text,EXP_HEAD"); + if (((1u<getLoader(&sz_unc_int); + sz_unc = sz_unc_int; + } + method = M_NRV2B_LE32; // requires unaligned fetch + } + else { // not shlib: main program with ELF1 de-compressor cprElfHdr1 const *const hf = (cprElfHdr1 const *)fold; unsigned fold_hdrlen = upx::umax(0x80u, usizeof(hf->ehdr) + get_te16(&hf->ehdr.e_phentsize) * get_te16(&hf->ehdr.e_phnum) + @@ -1630,18 +1711,34 @@ PackLinuxElf64::buildLinuxLoader( set_te32(&h.sz_cpr, h.sz_cpr); set_te32(&h.sz_unc, h.sz_unc); memcpy(cprLoader, &h, sizeof(h)); // cprLoader will become FOLDEXEC - } + } // end (0 < szfold) initLoader(proto, szproto, -1, sz_cpr); NO_printf("FOLDEXEC unc=%#x cpr=%#x\n", sz_unc, sz_cpr); linker->addSection("FOLDEXEC", mb_cprLoader, sizeof(b_info) + sz_cpr, 0); if (xct_off - && ( this->e_machine==Elf64_Ehdr::EM_X86_64 + && (0 + || this->e_machine==Elf64_Ehdr::EM_X86_64 +//ELF2 NYI || this->e_machine==Elf64_Ehdr::EM_PPC64 || this->e_machine==Elf64_Ehdr::EM_AARCH64) ) { addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR"); + } // shlib + else if (0 + || this->e_machine==Elf64_Ehdr::EM_X86_64 +//ELF2 NYI || this->e_machine==Elf64_Ehdr::EM_PPC64 +//ELF2 NYI || this->e_machine==Elf64_Ehdr::EM_AARCH64 + ) { // main program with ELF2 de-compressor + addLoader("ELFMAINX,ELFMAINZ,FOLDEXEC,IDENTSTR"); + if (this->e_machine==Elf64_Ehdr::EM_PPC64 + && elfout.ehdr.e_ident[Elf64_Ehdr::EI_DATA]==Elf64_Ehdr::ELFDATA2MSB) { + addLoader("ELFMAINZe"); + } + if (!xct_off) { + defineSymbols(ft); + } } - else { + else { // main program with ELF1 de-compressor addStubEntrySections(ft, (methods_used ? methods_used : (1u << ph_forced_method(ph.method))) ); if (!xct_off) { @@ -3460,10 +3557,24 @@ PackLinuxElf32::generateElfHdr( cprElfHdr2 *const h2 = (cprElfHdr2 *)(void *)&elfout; cprElfHdr3 *const h3 = (cprElfHdr3 *)(void *)&elfout; h3->ehdr = ((cprElfHdr3 const *)proto)->ehdr; - h3->phdr[C_BASE] = ((cprElfHdr3 const *)proto)->phdr[1]; // .data; .p_align - h3->phdr[C_TEXT] = ((cprElfHdr3 const *)proto)->phdr[0]; // .text - + if (Elf32_Ehdr::ET_REL == get_te16(&h3->ehdr.e_type)) { + set_te32(&h3->ehdr.e_phoff, sizeof(Elf32_Ehdr)); + set_te16(&h3->ehdr.e_ehsize,sizeof(Elf32_Ehdr)); + set_te16(&h3->ehdr.e_phentsize, sizeof(Elf32_Phdr)); + set_te16(&h3->ehdr.e_phnum, 2); + memset(&h3->phdr[C_BASE], 0, sizeof(h3->phdr[C_BASE])); + memset(&h3->phdr[C_TEXT], 0, sizeof(h3->phdr[C_TEXT])); + memset(&h3->phdr[2 ], 0, sizeof(h3->phdr[2 ])); + set_te32(&h3->phdr[C_BASE].p_flags, 0); + set_te32(&h3->phdr[C_TEXT].p_flags, Elf32_Phdr::PF_X| Elf32_Phdr::PF_R); + } + else { + h3->phdr[C_BASE] = ((cprElfHdr3 const *)proto)->phdr[1]; // .data; .p_align + h3->phdr[C_TEXT] = ((cprElfHdr3 const *)proto)->phdr[0]; // .text + } h3->ehdr.e_type = ehdri.e_type; // ET_EXEC vs ET_DYN (gcc -pie -fPIC) + memset(&h3->linfo, 0, sizeof(h3->linfo)); + 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; @@ -3749,8 +3860,22 @@ PackLinuxElf64::generateElfHdr( cprElfHdr2 *const h2 = (cprElfHdr2 *)(void *)&elfout; cprElfHdr3 *const h3 = (cprElfHdr3 *)(void *)&elfout; h3->ehdr = ((cprElfHdr3 const *)proto)->ehdr; - h3->phdr[C_BASE] = ((cprElfHdr3 const *)proto)->phdr[1]; // .data; .p_align - h3->phdr[C_TEXT] = ((cprElfHdr3 const *)proto)->phdr[0]; // .text + if (Elf64_Ehdr::ET_REL == get_te16(&h3->ehdr.e_type)) { + set_te64(&h3->ehdr.e_phoff, sizeof(Elf64_Ehdr)); + set_te16(&h3->ehdr.e_ehsize,sizeof(Elf64_Ehdr)); + set_te16(&h3->ehdr.e_phentsize, sizeof(Elf64_Phdr)); + set_te16(&h3->ehdr.e_phnum, 2); + memset(&h3->phdr[C_BASE], 0, sizeof(h3->phdr[C_BASE])); + memset(&h3->phdr[C_TEXT], 0, sizeof(h3->phdr[C_TEXT])); + memset(&h3->phdr[2 ], 0, sizeof(h3->phdr[2 ])); + set_te32(&h3->phdr[C_BASE].p_flags, 0); + set_te32(&h3->phdr[C_TEXT].p_flags, Elf64_Phdr::PF_X| Elf64_Phdr::PF_R); + } + else { + h3->phdr[C_BASE] = ((cprElfHdr3 const *)proto)->phdr[1]; // .data; .p_align + h3->phdr[C_TEXT] = ((cprElfHdr3 const *)proto)->phdr[0]; // .text + } + memset(&h3->linfo, 0, sizeof(h3->linfo)); h3->ehdr.e_type = ehdri.e_type; // ET_EXEC vs ET_DYN (gcc -pie -fPIC) h3->ehdr.e_ident[Elf64_Ehdr::EI_OSABI] = ei_osabi; @@ -3774,13 +3899,27 @@ PackLinuxElf64::generateElfHdr( h2->ehdr.e_shstrndx = o_elf_shnum - 1; } else { + // https://bugzilla.redhat.com/show_bug.cgi?id=2131609 + // 0==.e_shnum is a special case for libbfd + // that requires 0==.e_shentsize in order to force "no Shdrs" h2->ehdr.e_shentsize = 0; h2->ehdr.e_shnum = 0; h2->ehdr.e_shstrndx = 0; } - unsigned phnum_o = 2 + n_phdrx; // C_BASE, C_TEXT + unsigned const phnum_i = get_te16(&h2->ehdr.e_phnum); + unsigned phnum_o = 2 + n_phdrx; // C_BASE, C_TEXT set_te16(&h2->ehdr.e_phnum, phnum_o); + o_binfo = sizeof(Elf64_Ehdr) + sizeof(Elf64_Phdr)*phnum_o + sizeof(l_info) + sizeof(p_info); + set_te64(&h2->phdr[C_TEXT].p_filesz, sizeof(*h2)); // + identsize; + h2->phdr[C_TEXT].p_memsz = h2->phdr[C_TEXT].p_filesz; + set_te32(&h2->phdr[C_TEXT].p_type, PT_LOAD64); // be sure + + for (unsigned j=0; j < phnum_i; ++j) { + if (is_LOAD64(&h3->phdr[j])) { + set_te64( &h3->phdr[j].p_align, page_size); + } + } // Info for OS kernel to set the brk() if (brka) { diff --git a/src/stub/Makefile b/src/stub/Makefile index fee4fdf0..c967ea66 100644 --- a/src/stub/Makefile +++ b/src/stub/Makefile @@ -313,6 +313,37 @@ define tc.default.f-embed_objinfo_without_xstrip cat $1.dump >> $1 endef +define tc.default.f-embed_objinfo_without_xstrip_keep_dot_text + chmod a-x $1 + $(call tc,objcopy) -R .data -R .bss $1 + $(call tc,objcopy) -R .comment -R .note -R .note.GNU-stack -R .reginfo $1 + $(call tc,objcopy) --strip-unneeded --keep-symbol=_start --keep-symbol=upx_so_main $1 +# +# Disassemble for human readability +# objdump +# -Dr disassemble-all, with interspersed relocations + $(call tc,objdump) -Dr $(tc_objdump_disasm_options) $1 | $(RTRIM) > $1.disasm +# +# Disassemble for post-processing by buildLinuxLoader() +# objdump +# -r reloc +# -h section-headers +# -t syms +# -w (wide) do not truncate symbol names +# sed +# remove filename from first line +# change tab to space +# collapse multiple leading zeroes +# remove everything after "CONTENTS" + $(call tc,objdump) -htr -w $1 | $(BLSQUEEZE) | sed \ + -e '1s/^.*: *file format/file format/' \ + -e 's/$(tab)/ /g' \ + -e 's/ 00*/ 0/g' \ + -e 's/CONTENTS.*/CONTENTS/' \ + > $1.dump + cat $1.dump >> $1 +endef + tc.default.f-objstrip-disasm.bin = @true tc.default.f-objstrip-disasm.o = $(call tc,objdump) -dr $(tc_objdump_disasm_options) $1 | $(RTRIM) > $1.disasm tc.default.f-objstrip-disasm.obj = $(call tc,objdump) -dr $(tc_objdump_disasm_options) $1 | $(RTRIM) > $1.disasm @@ -395,12 +426,13 @@ amd64-linux.elf-so_entry.h: $(srcdir)/src/$$T.S $(call tc,f-embed_objinfo,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ -amd64-linux.elf-fold.h : tmp/$$T.o tmp/amd64-linux.elf-main.o $(srcdir)/src/$$T.lds tmp/amd64-expand.o -# # FIXME: multiarch-ld-2.18 creates a huge file here, so use 2.17 -# ####$(call tc,ld) --strip-all -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin - multiarch-ld-2.17 --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 +amd64-linux.elf-fold.h : $(srcdir)/src/$$T.lds \ + tmp/$$T.o \ + tmp/amd64-expand.o \ + tmp/amd64-linux.elf-main2.o +# FIXME: multiarch-ld-2.18 creates a huge file here, so use 2.17 + multiarch-ld-2.17 -r -T $(srcdir)/src/$T.lds -Map tmp/$T.map $(filter %.o,$^) -o tmp/$T.bin + $(call tc,f-embed_objinfo_without_xstrip_keep_dot_text,tmp/$T.bin) $(call tc,bin2h) tmp/$T.bin $@ amd64-linux.elf-so_fold.h : tmp/$$T.o tmp/amd64-linux.elf-so_main.o $(srcdir)/src/$$T.lds tmp/amd64-expand.o @@ -424,6 +456,10 @@ tmp/amd64-linux.elf-main.o : $(srcdir)/src/$$T.c $(call tc,gcc) -c -Os $< -o $@ $(call tc,f-objstrip,$@) +tmp/amd64-linux.elf-main2.o : $(srcdir)/src/$$T.c + $(call tc,gcc) -c -Os $< -o $@ + $(call tc,f-objstrip,$@) + tmp/amd64-linux.elf-so_main.o : $(srcdir)/src/$$T.c $(call tc,gcc) -c -O $< -o $@ $(call tc,objcopy) --rename-section .text=SO_MAIN -R .comment -R .note -R .note.GNU-stack -R .reginfo $@ diff --git a/src/stub/amd64-linux.elf-entry.h b/src/stub/amd64-linux.elf-entry.h index e34ee34c..4a5ca581 100644 --- a/src/stub/amd64-linux.elf-entry.h +++ b/src/stub/amd64-linux.elf-entry.h @@ -1,5 +1,5 @@ /* amd64-linux.elf-entry.h - created from amd64-linux.elf-entry.bin, 8461 (0x210d) bytes + created from amd64-linux.elf-entry.bin, 1101 (0x44d) bytes This file is part of the UPX executable compressor. @@ -32,538 +32,78 @@ /* clang-format off */ -#define STUB_AMD64_LINUX_ELF_ENTRY_SIZE 8461 -#define STUB_AMD64_LINUX_ELF_ENTRY_ADLER32 0x9242c38c -#define STUB_AMD64_LINUX_ELF_ENTRY_CRC32 0x7b043db7 +#define STUB_AMD64_LINUX_ELF_ENTRY_SIZE 1101 +#define STUB_AMD64_LINUX_ELF_ENTRY_ADLER32 0x64b93a03 +#define STUB_AMD64_LINUX_ELF_ENTRY_CRC32 0x33613c50 -unsigned char stub_amd64_linux_elf_entry[8461] = { +unsigned char stub_amd64_linux_elf_entry[1101] = { /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,120, 24, 0, 0, 0, 0, 0, 0, +/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,232, 1, 0, 0, 0, 0, 0, 0, /* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, -/* 0x0040 */ 80, 82,232, 0, 0, 0, 0, 85, 83, 81, 82, 72, 1,254, 86, 72, -/* 0x0050 */ 41,254, 72,137,254, 72,137,215, 49,219, 49,201, 72,131,205,255, -/* 0x0060 */ 232, 80, 0, 0, 0, 1,219,116, 2,243,195,139, 30, 72,131,238, -/* 0x0070 */ 252, 17,219,138, 22,243,195, 72,141, 4, 47,131,249, 5,138, 16, -/* 0x0080 */ 118, 33, 72,131,253,252,119, 27,131,233, 4,139, 16, 72,131,192, -/* 0x0090 */ 4,131,233, 4,137, 23, 72,141,127, 4,115,239,131,193, 4,138, -/* 0x00a0 */ 16,116, 16, 72,255,192,136, 23,131,233, 1,138, 16, 72,141,127, -/* 0x00b0 */ 1,117,240,243,195,252, 65, 91, 65,128,248, 8, 15,133,174, 0, -/* 0x00c0 */ 0, 0,235, 8, 72,255,198,136, 23, 72,255,199,138, 22, 1,219, -/* 0x00d0 */ 117, 10,139, 30, 72,131,238,252, 17,219,138, 22,114,230,141, 65, -/* 0x00e0 */ 1,235, 7,255,200, 65,255,211, 17,192, 65,255,211, 17,192, 1, -/* 0x00f0 */ 219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22,115,228,131, -/* 0x0100 */ 232, 3,114, 29,193,224, 8, 15,182,210, 9,208, 72,255,198,131, -/* 0x0110 */ 240,255, 15,132, 0, 0, 0, 0,209,248, 72, 99,232,114, 56,235, -/* 0x0120 */ 14, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,114, 40,255, -/* 0x0130 */ 193, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,114, 24, 65, -/* 0x0140 */ 255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17,219, -/* 0x0150 */ 115,237,131,193, 2,235, 5, 65,255,211, 17,201, 72,129,253, 0, -/* 0x0160 */ 251,255,255,131,209, 2,232, 0, 0, 0, 0,233, 92,255,255,255, -/* 0x0170 */ 87, 94, 65,128,248, 5, 15,133,149, 0, 0, 0,235, 8, 72,255, -/* 0x0180 */ 198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, 72,131, -/* 0x0190 */ 238,252, 17,219,138, 22,114,230,141, 65, 1,235, 7,255,200, 65, -/* 0x01a0 */ 255,211, 17,192, 65,255,211, 17,192, 1,219,117, 10,139, 30, 72, -/* 0x01b0 */ 131,238,252, 17,219,138, 22,115,228,131,232, 3,114, 27,193,224, -/* 0x01c0 */ 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, 0, 0, -/* 0x01d0 */ 0, 0,209,248, 72, 99,232,235, 3, 65,255,211, 17,201, 65,255, -/* 0x01e0 */ 211, 17,201,117, 24,255,193, 65,255,211, 17,201, 1,219,117, 8, -/* 0x01f0 */ 139, 30, 72,131,238,252, 17,219,115,237,131,193, 2, 72,129,253, -/* 0x0200 */ 0,251,255,255,131,209, 1,232, 0, 0, 0, 0,233,117,255,255, -/* 0x0210 */ 255, 87, 94, 65,128,248, 2, 15,133,135, 0, 0, 0,235, 8, 72, -/* 0x0220 */ 255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, 72, -/* 0x0230 */ 131,238,252, 17,219,138, 22,114,230,141, 65, 1, 65,255,211, 17, -/* 0x0240 */ 192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22,115, -/* 0x0250 */ 235,131,232, 3,114, 23,193,224, 8, 15,182,210, 9,208, 72,255, -/* 0x0260 */ 198,131,240,255, 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, 1, -/* 0x0270 */ 65,255,211, 17,201, 65,255,211, 17,201,117, 24,137,193,131,192, -/* 0x0280 */ 2, 65,255,211, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, -/* 0x0290 */ 17,219,115,237, 72,129,253, 0,243,255,255, 17,193,232, 0, 0, -/* 0x02a0 */ 0, 0,235,131, 87, 94, 65,128,248, 14, 15,133, 0, 0, 0, 0, -/* 0x02b0 */ 85, 72,137,229, 68,139, 9, 73,137,208, 72,137,242, 72,141,119, -/* 0x02c0 */ 2, 86,138, 7,255,202,136,193, 36, 7,192,233, 3, 72,199,195, -/* 0x02d0 */ 0,253,255,255, 72,211,227,136,193, 72,141,156, 92,136,241,255, -/* 0x02e0 */ 255, 72,131,227,192,106, 0, 72, 57,220,117,249, 83, 72,141,123, -/* 0x02f0 */ 8,138, 78,255,255,202,136, 71, 2,136,200,192,233, 4,136, 79, -/* 0x0300 */ 1, 36, 15,136, 7, 72,141, 79,252, 80, 65, 87, 72,141, 71, 4, -/* 0x0310 */ 69, 49,255, 65, 86, 65,190, 1, 0, 0, 0, 65, 85, 69, 49,237, -/* 0x0320 */ 65, 84, 85, 83, 72,137, 76, 36,240, 72,137, 68, 36,216,184, 1, -/* 0x0330 */ 0, 0, 0, 72,137,116, 36,248, 76,137, 68, 36,232,137,195, 68, -/* 0x0340 */ 137, 76, 36,228, 15,182, 79, 2,211,227,137,217, 72,139, 92, 36, -/* 0x0350 */ 56,255,201,137, 76, 36,212, 15,182, 79, 1,211,224, 72,139, 76, -/* 0x0360 */ 36,240,255,200,137, 68, 36,208, 15,182, 7,199, 1, 0, 0, 0, -/* 0x0370 */ 0,199, 68, 36,200, 0, 0, 0, 0,199, 68, 36,196, 1, 0, 0, -/* 0x0380 */ 0,199, 68, 36,192, 1, 0, 0, 0,199, 68, 36,188, 1, 0, 0, -/* 0x0390 */ 0,199, 3, 0, 0, 0, 0,137, 68, 36,204, 15,182, 79, 1, 1, -/* 0x03a0 */ 193,184, 0, 3, 0, 0,211,224, 49,201,141,184, 54, 7, 0, 0, -/* 0x03b0 */ 65, 57,255,115, 19, 72,139, 92, 36,216,137,200,255,193, 57,249, -/* 0x03c0 */ 102,199, 4, 67, 0, 4,235,235, 72,139,124, 36,248,137,208, 69, -/* 0x03d0 */ 49,210, 65,131,203,255, 49,210, 73,137,252, 73, 1,196, 76, 57, -/* 0x03e0 */ 231, 15,132,239, 8, 0, 0, 15,182, 7, 65,193,226, 8,255,194, -/* 0x03f0 */ 72,255,199, 65, 9,194,131,250, 4,126,227, 68, 59,124, 36,228, -/* 0x0400 */ 15,131,218, 8, 0, 0,139, 68, 36,212, 72, 99, 92, 36,200, 72, -/* 0x0410 */ 139, 84, 36,216, 68, 33,248,137, 68, 36,184, 72, 99,108, 36,184, -/* 0x0420 */ 72,137,216, 72,193,224, 4, 72, 1,232, 65,129,251,255,255,255, -/* 0x0430 */ 0, 76,141, 12, 66,119, 26, 76, 57,231, 15,132,150, 8, 0, 0, -/* 0x0440 */ 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, -/* 0x0450 */ 194, 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175, -/* 0x0460 */ 193, 65, 57,194, 15,131,197, 1, 0, 0, 65,137,195,184, 0, 8, -/* 0x0470 */ 0, 0, 72,139, 92, 36,216, 41,200, 15,182, 76, 36,204,190, 1, -/* 0x0480 */ 0, 0, 0,193,248, 5,141, 4, 2, 65, 15,182,213,102, 65,137, -/* 0x0490 */ 1,139, 68, 36,208, 68, 33,248,211,224,185, 8, 0, 0, 0, 43, -/* 0x04a0 */ 76, 36,204,211,250, 1,208,105,192, 0, 3, 0, 0,131,124, 36, -/* 0x04b0 */ 200, 6,137,192, 76,141,140, 67,108, 14, 0, 0, 15,142,184, 0, -/* 0x04c0 */ 0, 0, 72,139, 84, 36,232, 68,137,248, 68, 41,240, 15,182, 44, -/* 0x04d0 */ 2, 1,237, 72, 99,214,137,235,129,227, 0, 1, 0, 0, 65,129, -/* 0x04e0 */ 251,255,255,255, 0, 72, 99,195, 73,141, 4, 65, 76,141, 4, 80, -/* 0x04f0 */ 119, 26, 76, 57,231, 15,132,219, 7, 0, 0, 15,182, 7, 65,193, -/* 0x0500 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183,144, -/* 0x0510 */ 0, 2, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, -/* 0x0520 */ 65, 57,194,115, 32, 65,137,195,184, 0, 8, 0, 0, 1,246, 41, -/* 0x0530 */ 200,193,248, 5,133,219,141, 4, 2,102, 65,137,128, 0, 2, 0, -/* 0x0540 */ 0,116, 33,235, 45, 65, 41,195, 65, 41,194,137,208,102,193,232, -/* 0x0550 */ 5,141,116, 54, 1,102, 41,194,133,219,102, 65,137,144, 0, 2, -/* 0x0560 */ 0, 0,116, 14,129,254,255, 0, 0, 0, 15,142, 97,255,255,255, -/* 0x0570 */ 235,120,129,254,255, 0, 0, 0,127,112, 72, 99,198, 65,129,251, -/* 0x0580 */ 255,255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132, 67, -/* 0x0590 */ 7, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, -/* 0x05a0 */ 199, 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183, -/* 0x05b0 */ 202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, -/* 0x05c0 */ 0, 1,246, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235, -/* 0x05d0 */ 161, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141,116, 54, -/* 0x05e0 */ 1,102, 41,194,102, 65,137, 16,235,136, 72,139, 76, 36,232, 68, -/* 0x05f0 */ 137,248, 65,255,199, 65,137,245, 64,136, 52, 1,131,124, 36,200, -/* 0x0600 */ 3,127, 13,199, 68, 36,200, 0, 0, 0, 0,233,166, 6, 0, 0, -/* 0x0610 */ 139, 84, 36,200,139, 68, 36,200,131,234, 3,131,232, 6,131,124, -/* 0x0620 */ 36,200, 9, 15, 79,208,137, 84, 36,200,233,135, 6, 0, 0, 65, -/* 0x0630 */ 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 72,139, -/* 0x0640 */ 68, 36,216, 65,129,251,255,255,255, 0,102, 65,137, 17, 72,141, -/* 0x0650 */ 52, 88,119, 26, 76, 57,231, 15,132,121, 6, 0, 0, 15,182, 7, -/* 0x0660 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, -/* 0x0670 */ 150,128, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175, -/* 0x0680 */ 193, 65, 57,194,115, 78, 65,137,195,184, 0, 8, 0, 0, 76,139, -/* 0x0690 */ 76, 36,216, 41,200,139, 76, 36,196, 68,137,116, 36,196,193,248, -/* 0x06a0 */ 5,141, 4, 2,139, 84, 36,192,137, 76, 36,192,102,137,134,128, -/* 0x06b0 */ 1, 0, 0, 49,192,131,124, 36,200, 6,137, 84, 36,188, 15,159, -/* 0x06c0 */ 192, 73,129,193,100, 6, 0, 0,141, 4, 64,137, 68, 36,200,233, -/* 0x06d0 */ 84, 2, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, -/* 0x06e0 */ 102, 41,194, 65,129,251,255,255,255, 0,102,137,150,128, 1, 0, -/* 0x06f0 */ 0,119, 26, 76, 57,231, 15,132,218, 5, 0, 0, 15,182, 7, 65, -/* 0x0700 */ 193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150, -/* 0x0710 */ 152, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, -/* 0x0720 */ 65, 57,194, 15,131,208, 0, 0, 0, 65,184, 0, 8, 0, 0, 65, -/* 0x0730 */ 137,195, 72,193,227, 5, 68,137,192, 41,200,193,248, 5,141, 4, -/* 0x0740 */ 2,102,137,134,152, 1, 0, 0, 72,139, 68, 36,216, 72, 1,216, -/* 0x0750 */ 65,129,251,255,255,255, 0, 72,141, 52,104,119, 26, 76, 57,231, -/* 0x0760 */ 15,132,112, 5, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, -/* 0x0770 */ 8, 72,255,199, 65, 9,194, 15,183,150,224, 1, 0, 0, 68,137, -/* 0x0780 */ 216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 79, 65, -/* 0x0790 */ 41,200, 65,137,195, 65,193,248, 5, 69,133,255, 66,141, 4, 2, -/* 0x07a0 */ 102,137,134,224, 1, 0, 0, 15,132, 41, 5, 0, 0, 49,192,131, -/* 0x07b0 */ 124, 36,200, 6, 72,139, 92, 36,232, 15,159,192,141, 68, 0, 9, -/* 0x07c0 */ 137, 68, 36,200, 68,137,248, 68, 41,240, 68, 15,182, 44, 3, 68, -/* 0x07d0 */ 137,248, 65,255,199, 68,136, 44, 3,233,216, 4, 0, 0, 65, 41, -/* 0x07e0 */ 195, 65, 41,194,137,208,102,193,232, 5,102, 41,194,102,137,150, -/* 0x07f0 */ 224, 1, 0, 0,233, 17, 1, 0, 0, 65, 41,195, 65, 41,194,137, -/* 0x0800 */ 208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, -/* 0x0810 */ 137,150,152, 1, 0, 0,119, 26, 76, 57,231, 15,132,181, 4, 0, -/* 0x0820 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, -/* 0x0830 */ 9,194, 15,183,150,176, 1, 0, 0, 68,137,216,193,232, 11, 15, -/* 0x0840 */ 183,202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, 8, -/* 0x0850 */ 0, 0, 41,200,193,248, 5,141, 4, 2,102,137,134,176, 1, 0, -/* 0x0860 */ 0,139, 68, 36,196,233,152, 0, 0, 0, 65, 41,195, 65, 41,194, -/* 0x0870 */ 137,208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0, -/* 0x0880 */ 102,137,150,176, 1, 0, 0,119, 26, 76, 57,231, 15,132, 68, 4, -/* 0x0890 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, -/* 0x08a0 */ 65, 9,194, 15,183,150,200, 1, 0, 0, 68,137,216,193,232, 11, -/* 0x08b0 */ 15,183,202, 15,175,193, 65, 57,194,115, 29, 65,137,195,184, 0, -/* 0x08c0 */ 8, 0, 0, 41,200,193,248, 5,141, 4, 2,102,137,134,200, 1, -/* 0x08d0 */ 0, 0,139, 68, 36,192,235, 34, 65, 41,195, 65, 41,194,137,208, -/* 0x08e0 */ 102,193,232, 5,102, 41,194,139, 68, 36,188,102,137,150,200, 1, -/* 0x08f0 */ 0, 0,139, 84, 36,192,137, 84, 36,188,139, 76, 36,196,137, 76, -/* 0x0900 */ 36,192, 68,137,116, 36,196, 65,137,198, 49,192,131,124, 36,200, -/* 0x0910 */ 6, 76,139, 76, 36,216, 15,159,192, 73,129,193,104, 10, 0, 0, -/* 0x0920 */ 141, 68, 64, 8,137, 68, 36,200, 65,129,251,255,255,255, 0,119, -/* 0x0930 */ 26, 76, 57,231, 15,132,156, 3, 0, 0, 15,182, 7, 65,193,226, -/* 0x0940 */ 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68, -/* 0x0950 */ 137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 39, -/* 0x0960 */ 65,137,195,184, 0, 8, 0, 0, 69, 49,237, 41,200,193,248, 5, -/* 0x0970 */ 141, 4, 2,102, 65,137, 1, 72, 99, 68, 36,184, 72,193,224, 4, -/* 0x0980 */ 77,141, 68, 1, 4,235,120, 65, 41,195, 65, 41,194,137,208,102, -/* 0x0990 */ 193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, 65,137, -/* 0x09a0 */ 17,119, 26, 76, 57,231, 15,132, 42, 3, 0, 0, 15,182, 7, 65, -/* 0x09b0 */ 193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, -/* 0x09c0 */ 81, 2, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57, -/* 0x09d0 */ 194,115, 52, 65,137,195,184, 0, 8, 0, 0, 65,189, 8, 0, 0, -/* 0x09e0 */ 0, 41,200,193,248, 5,141, 4, 2,102, 65,137, 65, 2, 72, 99, -/* 0x09f0 */ 68, 36,184, 72,193,224, 4, 77,141,132, 1, 4, 1, 0, 0, 65, -/* 0x0a00 */ 185, 3, 0, 0, 0,235, 39, 65, 41,195, 65, 41,194,137,208,102, -/* 0x0a10 */ 193,232, 5, 77,141,129, 4, 2, 0, 0, 65,189, 16, 0, 0, 0, -/* 0x0a20 */ 102, 41,194,102, 65,137, 81, 2, 65,185, 8, 0, 0, 0, 68,137, -/* 0x0a30 */ 203,189, 1, 0, 0, 0, 72, 99,197, 65,129,251,255,255,255, 0, -/* 0x0a40 */ 73,141, 52, 64,119, 26, 76, 57,231, 15,132,135, 2, 0, 0, 15, -/* 0x0a50 */ 182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, -/* 0x0a60 */ 15,183, 14, 68,137,216,193,232, 11, 15,183,209, 15,175,194, 65, -/* 0x0a70 */ 57,194,115, 23, 65,137,195,184, 0, 8, 0, 0, 1,237, 41,208, -/* 0x0a80 */ 193,248, 5,141, 4, 1,102,137, 6,235, 22, 65, 41,195, 65, 41, -/* 0x0a90 */ 194,137,200,102,193,232, 5,141,108, 45, 1,102, 41,193,102,137, -/* 0x0aa0 */ 14,255,203,117,145,184, 1, 0, 0, 0, 68,137,201,211,224, 41, -/* 0x0ab0 */ 197, 68, 1,237,131,124, 36,200, 3, 15,143,194, 1, 0, 0,131, -/* 0x0ac0 */ 68, 36,200, 7,184, 3, 0, 0, 0,131,253, 4, 15, 76,197, 72, -/* 0x0ad0 */ 139, 92, 36,216, 65,184, 1, 0, 0, 0, 72,152, 72,193,224, 7, -/* 0x0ae0 */ 76,141,140, 3, 96, 3, 0, 0,187, 6, 0, 0, 0, 73, 99,192, -/* 0x0af0 */ 65,129,251,255,255,255, 0, 73,141, 52, 65,119, 26, 76, 57,231, -/* 0x0b00 */ 15,132,208, 1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, -/* 0x0b10 */ 8, 72,255,199, 65, 9,194, 15,183, 22, 68,137,216,193,232, 11, -/* 0x0b20 */ 15,183,202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, -/* 0x0b30 */ 8, 0, 0, 69, 1,192, 41,200,193,248, 5,141, 4, 2,102,137, -/* 0x0b40 */ 6,235, 23, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, 71, -/* 0x0b50 */ 141, 68, 0, 1,102, 41,194,102,137, 22,255,203,117,143, 65,131, -/* 0x0b60 */ 232, 64, 65,131,248, 3, 69,137,198, 15,142, 13, 1, 0, 0, 65, -/* 0x0b70 */ 131,230, 1, 68,137,192,209,248, 65,131,206, 2, 65,131,248, 13, -/* 0x0b80 */ 141,112,255,127, 35,137,241, 72,139, 92, 36,216, 73, 99,192, 65, -/* 0x0b90 */ 211,230, 72, 1,192, 68,137,242, 72,141, 20, 83, 72, 41,194, 76, -/* 0x0ba0 */ 141,138, 94, 5, 0, 0,235, 81,141,112,251, 65,129,251,255,255, -/* 0x0bb0 */ 255, 0,119, 26, 76, 57,231, 15,132, 25, 1, 0, 0, 15,182, 7, -/* 0x0bc0 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65,209, -/* 0x0bd0 */ 235, 69, 1,246, 69, 57,218,114, 7, 69, 41,218, 65,131,206, 1, -/* 0x0be0 */ 255,206,117,199, 76,139, 76, 36,216, 65,193,230, 4,190, 4, 0, -/* 0x0bf0 */ 0, 0, 73,129,193, 68, 6, 0, 0, 65,189, 1, 0, 0, 0,187, -/* 0x0c00 */ 1, 0, 0, 0, 72, 99,195, 65,129,251,255,255,255, 0, 77,141, -/* 0x0c10 */ 4, 65,119, 26, 76, 57,231, 15,132,185, 0, 0, 0, 15,182, 7, -/* 0x0c20 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15, -/* 0x0c30 */ 183, 16, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57, -/* 0x0c40 */ 194,115, 24, 65,137,195,184, 0, 8, 0, 0, 1,219, 41,200,193, -/* 0x0c50 */ 248, 5,141, 4, 2,102, 65,137, 0,235, 26, 65, 41,195, 65, 41, -/* 0x0c60 */ 194,137,208,102,193,232, 5,141, 92, 27, 1, 69, 9,238,102, 41, -/* 0x0c70 */ 194,102, 65,137, 16, 69, 1,237,255,206,117,136, 65,255,198,116, -/* 0x0c80 */ 64,131,197, 2, 69, 57,254,119, 77, 72,139, 84, 36,232, 68,137, -/* 0x0c90 */ 248, 68, 41,240, 68, 15,182, 44, 2, 68,137,248, 65,255,199,255, -/* 0x0ca0 */ 205, 68,136, 44, 2, 15,149,194, 49,192, 68, 59,124, 36,228, 15, -/* 0x0cb0 */ 146,192,133,194,117,211, 68, 59,124, 36,228, 15,130, 69,247,255, -/* 0x0cc0 */ 255, 65,129,251,255,255,255, 0,119, 22, 76, 57,231,184, 1, 0, -/* 0x0cd0 */ 0, 0,116, 35,235, 7,184, 1, 0, 0, 0,235, 26, 72,255,199, -/* 0x0ce0 */ 137,248, 43, 68, 36,248, 72,139, 76, 36,240, 72,139, 92, 36, 56, -/* 0x0cf0 */ 137, 1, 68,137, 59, 49,192, 91, 93, 65, 92, 65, 93, 65, 94, 65, -/* 0x0d00 */ 95, 65, 87, 72,141, 71, 4, 69, 49,255, 65, 86, 65,190, 1, 0, -/* 0x0d10 */ 0, 0, 65, 85, 69, 49,237, 65, 84, 85, 83, 72,137, 76, 36,240, -/* 0x0d20 */ 72,137, 68, 36,216,184, 1, 0, 0, 0, 72,137,116, 36,248, 76, -/* 0x0d30 */ 137, 68, 36,232,137,195, 68,137, 76, 36,228, 15,182, 79, 2,211, -/* 0x0d40 */ 227,137,217, 72,139, 92, 36, 56,255,201,137, 76, 36,212, 15,182, -/* 0x0d50 */ 79, 1,211,224, 72,139, 76, 36,240,255,200,137, 68, 36,208, 15, -/* 0x0d60 */ 182, 7,199, 1, 0, 0, 0, 0,199, 68, 36,200, 0, 0, 0, 0, -/* 0x0d70 */ 199, 68, 36,196, 1, 0, 0, 0,199, 68, 36,192, 1, 0, 0, 0, -/* 0x0d80 */ 199, 68, 36,188, 1, 0, 0, 0,199, 3, 0, 0, 0, 0,137, 68, -/* 0x0d90 */ 36,204, 15,182, 79, 1, 1,193,184, 0, 3, 0, 0,211,224, 49, -/* 0x0da0 */ 201,141,184, 54, 7, 0, 0, 65, 57,255,115, 19, 72,139, 92, 36, -/* 0x0db0 */ 216,137,200,255,193, 57,249,102,199, 4, 67, 0, 4,235,235, 72, -/* 0x0dc0 */ 139,124, 36,248,137,208, 69, 49,210, 65,131,203,255, 49,210, 73, -/* 0x0dd0 */ 137,252, 73, 1,196, 76, 57,231, 15,132,239, 8, 0, 0, 15,182, -/* 0x0de0 */ 7, 65,193,226, 8,255,194, 72,255,199, 65, 9,194,131,250, 4, -/* 0x0df0 */ 126,227, 68, 59,124, 36,228, 15,131,218, 8, 0, 0,139, 68, 36, -/* 0x0e00 */ 212, 72, 99, 92, 36,200, 72,139, 84, 36,216, 68, 33,248,137, 68, -/* 0x0e10 */ 36,184, 72, 99,108, 36,184, 72,137,216, 72,193,224, 4, 72, 1, -/* 0x0e20 */ 232, 65,129,251,255,255,255, 0, 76,141, 12, 66,119, 26, 76, 57, -/* 0x0e30 */ 231, 15,132,150, 8, 0, 0, 15,182, 7, 65,193,226, 8, 65,193, -/* 0x0e40 */ 227, 8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137,216,193, -/* 0x0e50 */ 232, 11, 15,183,202, 15,175,193, 65, 57,194, 15,131,197, 1, 0, -/* 0x0e60 */ 0, 65,137,195,184, 0, 8, 0, 0, 72,139, 92, 36,216, 41,200, -/* 0x0e70 */ 15,182, 76, 36,204,190, 1, 0, 0, 0,193,248, 5,141, 4, 2, -/* 0x0e80 */ 65, 15,182,213,102, 65,137, 1,139, 68, 36,208, 68, 33,248,211, -/* 0x0e90 */ 224,185, 8, 0, 0, 0, 43, 76, 36,204,211,250, 1,208,105,192, -/* 0x0ea0 */ 0, 3, 0, 0,131,124, 36,200, 6,137,192, 76,141,140, 67,108, -/* 0x0eb0 */ 14, 0, 0, 15,142,184, 0, 0, 0, 72,139, 84, 36,232, 68,137, -/* 0x0ec0 */ 248, 68, 41,240, 15,182, 44, 2, 1,237, 72, 99,214,137,235,129, -/* 0x0ed0 */ 227, 0, 1, 0, 0, 65,129,251,255,255,255, 0, 72, 99,195, 73, -/* 0x0ee0 */ 141, 4, 65, 76,141, 4, 80,119, 26, 76, 57,231, 15,132,219, 7, -/* 0x0ef0 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, -/* 0x0f00 */ 65, 9,194, 65, 15,183,144, 0, 2, 0, 0, 68,137,216,193,232, -/* 0x0f10 */ 11, 15,183,202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, -/* 0x0f20 */ 0, 8, 0, 0, 1,246, 41,200,193,248, 5,133,219,141, 4, 2, -/* 0x0f30 */ 102, 65,137,128, 0, 2, 0, 0,116, 33,235, 45, 65, 41,195, 65, -/* 0x0f40 */ 41,194,137,208,102,193,232, 5,141,116, 54, 1,102, 41,194,133, -/* 0x0f50 */ 219,102, 65,137,144, 0, 2, 0, 0,116, 14,129,254,255, 0, 0, -/* 0x0f60 */ 0, 15,142, 97,255,255,255,235,120,129,254,255, 0, 0, 0,127, -/* 0x0f70 */ 112, 72, 99,198, 65,129,251,255,255,255, 0, 77,141, 4, 65,119, -/* 0x0f80 */ 26, 76, 57,231, 15,132, 67, 7, 0, 0, 15,182, 7, 65,193,226, -/* 0x0f90 */ 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 16, 68, -/* 0x0fa0 */ 137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 24, -/* 0x0fb0 */ 65,137,195,184, 0, 8, 0, 0, 1,246, 41,200,193,248, 5,141, -/* 0x0fc0 */ 4, 2,102, 65,137, 0,235,161, 65, 41,195, 65, 41,194,137,208, -/* 0x0fd0 */ 102,193,232, 5,141,116, 54, 1,102, 41,194,102, 65,137, 16,235, -/* 0x0fe0 */ 136, 72,139, 76, 36,232, 68,137,248, 65,255,199, 65,137,245, 64, -/* 0x0ff0 */ 136, 52, 1,131,124, 36,200, 3,127, 13,199, 68, 36,200, 0, 0, -/* 0x1000 */ 0, 0,233,166, 6, 0, 0,139, 84, 36,200,139, 68, 36,200,131, -/* 0x1010 */ 234, 3,131,232, 6,131,124, 36,200, 9, 15, 79,208,137, 84, 36, -/* 0x1020 */ 200,233,135, 6, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193, -/* 0x1030 */ 232, 5,102, 41,194, 72,139, 68, 36,216, 65,129,251,255,255,255, -/* 0x1040 */ 0,102, 65,137, 17, 72,141, 52, 88,119, 26, 76, 57,231, 15,132, -/* 0x1050 */ 121, 6, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, -/* 0x1060 */ 255,199, 65, 9,194, 15,183,150,128, 1, 0, 0, 68,137,216,193, -/* 0x1070 */ 232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 78, 65,137,195, -/* 0x1080 */ 184, 0, 8, 0, 0, 76,139, 76, 36,216, 41,200,139, 76, 36,196, -/* 0x1090 */ 68,137,116, 36,196,193,248, 5,141, 4, 2,139, 84, 36,192,137, -/* 0x10a0 */ 76, 36,192,102,137,134,128, 1, 0, 0, 49,192,131,124, 36,200, -/* 0x10b0 */ 6,137, 84, 36,188, 15,159,192, 73,129,193,100, 6, 0, 0,141, -/* 0x10c0 */ 4, 64,137, 68, 36,200,233, 84, 2, 0, 0, 65, 41,195, 65, 41, -/* 0x10d0 */ 194,137,208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, -/* 0x10e0 */ 0,102,137,150,128, 1, 0, 0,119, 26, 76, 57,231, 15,132,218, -/* 0x10f0 */ 5, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, -/* 0x1100 */ 199, 65, 9,194, 15,183,150,152, 1, 0, 0, 68,137,216,193,232, -/* 0x1110 */ 11, 15,183,202, 15,175,193, 65, 57,194, 15,131,208, 0, 0, 0, -/* 0x1120 */ 65,184, 0, 8, 0, 0, 65,137,195, 72,193,227, 5, 68,137,192, -/* 0x1130 */ 41,200,193,248, 5,141, 4, 2,102,137,134,152, 1, 0, 0, 72, -/* 0x1140 */ 139, 68, 36,216, 72, 1,216, 65,129,251,255,255,255, 0, 72,141, -/* 0x1150 */ 52,104,119, 26, 76, 57,231, 15,132,112, 5, 0, 0, 15,182, 7, -/* 0x1160 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, -/* 0x1170 */ 150,224, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175, -/* 0x1180 */ 193, 65, 57,194,115, 79, 65, 41,200, 65,137,195, 65,193,248, 5, -/* 0x1190 */ 69,133,255, 66,141, 4, 2,102,137,134,224, 1, 0, 0, 15,132, -/* 0x11a0 */ 41, 5, 0, 0, 49,192,131,124, 36,200, 6, 72,139, 92, 36,232, -/* 0x11b0 */ 15,159,192,141, 68, 0, 9,137, 68, 36,200, 68,137,248, 68, 41, -/* 0x11c0 */ 240, 68, 15,182, 44, 3, 68,137,248, 65,255,199, 68,136, 44, 3, -/* 0x11d0 */ 233,216, 4, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, -/* 0x11e0 */ 5,102, 41,194,102,137,150,224, 1, 0, 0,233, 17, 1, 0, 0, -/* 0x11f0 */ 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65, -/* 0x1200 */ 129,251,255,255,255, 0,102,137,150,152, 1, 0, 0,119, 26, 76, -/* 0x1210 */ 57,231, 15,132,181, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65, -/* 0x1220 */ 193,227, 8, 72,255,199, 65, 9,194, 15,183,150,176, 1, 0, 0, -/* 0x1230 */ 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, -/* 0x1240 */ 32, 65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, -/* 0x1250 */ 2,102,137,134,176, 1, 0, 0,139, 68, 36,196,233,152, 0, 0, -/* 0x1260 */ 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, -/* 0x1270 */ 65,129,251,255,255,255, 0,102,137,150,176, 1, 0, 0,119, 26, -/* 0x1280 */ 76, 57,231, 15,132, 68, 4, 0, 0, 15,182, 7, 65,193,226, 8, -/* 0x1290 */ 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,200, 1, 0, -/* 0x12a0 */ 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, -/* 0x12b0 */ 115, 29, 65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, -/* 0x12c0 */ 4, 2,102,137,134,200, 1, 0, 0,139, 68, 36,192,235, 34, 65, -/* 0x12d0 */ 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194,139, 68, -/* 0x12e0 */ 36,188,102,137,150,200, 1, 0, 0,139, 84, 36,192,137, 84, 36, -/* 0x12f0 */ 188,139, 76, 36,196,137, 76, 36,192, 68,137,116, 36,196, 65,137, -/* 0x1300 */ 198, 49,192,131,124, 36,200, 6, 76,139, 76, 36,216, 15,159,192, -/* 0x1310 */ 73,129,193,104, 10, 0, 0,141, 68, 64, 8,137, 68, 36,200, 65, -/* 0x1320 */ 129,251,255,255,255, 0,119, 26, 76, 57,231, 15,132,156, 3, 0, -/* 0x1330 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, -/* 0x1340 */ 9,194, 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15, -/* 0x1350 */ 175,193, 65, 57,194,115, 39, 65,137,195,184, 0, 8, 0, 0, 69, -/* 0x1360 */ 49,237, 41,200,193,248, 5,141, 4, 2,102, 65,137, 1, 72, 99, -/* 0x1370 */ 68, 36,184, 72,193,224, 4, 77,141, 68, 1, 4,235,120, 65, 41, -/* 0x1380 */ 195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129,251, -/* 0x1390 */ 255,255,255, 0,102, 65,137, 17,119, 26, 76, 57,231, 15,132, 42, -/* 0x13a0 */ 3, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255, -/* 0x13b0 */ 199, 65, 9,194, 65, 15,183, 81, 2, 68,137,216,193,232, 11, 15, -/* 0x13c0 */ 183,202, 15,175,193, 65, 57,194,115, 52, 65,137,195,184, 0, 8, -/* 0x13d0 */ 0, 0, 65,189, 8, 0, 0, 0, 41,200,193,248, 5,141, 4, 2, -/* 0x13e0 */ 102, 65,137, 65, 2, 72, 99, 68, 36,184, 72,193,224, 4, 77,141, -/* 0x13f0 */ 132, 1, 4, 1, 0, 0, 65,185, 3, 0, 0, 0,235, 39, 65, 41, -/* 0x1400 */ 195, 65, 41,194,137,208,102,193,232, 5, 77,141,129, 4, 2, 0, -/* 0x1410 */ 0, 65,189, 16, 0, 0, 0,102, 41,194,102, 65,137, 81, 2, 65, -/* 0x1420 */ 185, 8, 0, 0, 0, 68,137,203,189, 1, 0, 0, 0, 72, 99,197, -/* 0x1430 */ 65,129,251,255,255,255, 0, 73,141, 52, 64,119, 26, 76, 57,231, -/* 0x1440 */ 15,132,135, 2, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, -/* 0x1450 */ 8, 72,255,199, 65, 9,194, 15,183, 14, 68,137,216,193,232, 11, -/* 0x1460 */ 15,183,209, 15,175,194, 65, 57,194,115, 23, 65,137,195,184, 0, -/* 0x1470 */ 8, 0, 0, 1,237, 41,208,193,248, 5,141, 4, 1,102,137, 6, -/* 0x1480 */ 235, 22, 65, 41,195, 65, 41,194,137,200,102,193,232, 5,141,108, -/* 0x1490 */ 45, 1,102, 41,193,102,137, 14,255,203,117,145,184, 1, 0, 0, -/* 0x14a0 */ 0, 68,137,201,211,224, 41,197, 68, 1,237,131,124, 36,200, 3, -/* 0x14b0 */ 15,143,194, 1, 0, 0,131, 68, 36,200, 7,184, 3, 0, 0, 0, -/* 0x14c0 */ 131,253, 4, 15, 76,197, 72,139, 92, 36,216, 65,184, 1, 0, 0, -/* 0x14d0 */ 0, 72,152, 72,193,224, 7, 76,141,140, 3, 96, 3, 0, 0,187, -/* 0x14e0 */ 6, 0, 0, 0, 73, 99,192, 65,129,251,255,255,255, 0, 73,141, -/* 0x14f0 */ 52, 65,119, 26, 76, 57,231, 15,132,208, 1, 0, 0, 15,182, 7, -/* 0x1500 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, -/* 0x1510 */ 22, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194, -/* 0x1520 */ 115, 24, 65,137,195,184, 0, 8, 0, 0, 69, 1,192, 41,200,193, -/* 0x1530 */ 248, 5,141, 4, 2,102,137, 6,235, 23, 65, 41,195, 65, 41,194, -/* 0x1540 */ 137,208,102,193,232, 5, 71,141, 68, 0, 1,102, 41,194,102,137, -/* 0x1550 */ 22,255,203,117,143, 65,131,232, 64, 65,131,248, 3, 69,137,198, -/* 0x1560 */ 15,142, 13, 1, 0, 0, 65,131,230, 1, 68,137,192,209,248, 65, -/* 0x1570 */ 131,206, 2, 65,131,248, 13,141,112,255,127, 35,137,241, 72,139, -/* 0x1580 */ 92, 36,216, 73, 99,192, 65,211,230, 72, 1,192, 68,137,242, 72, -/* 0x1590 */ 141, 20, 83, 72, 41,194, 76,141,138, 94, 5, 0, 0,235, 81,141, -/* 0x15a0 */ 112,251, 65,129,251,255,255,255, 0,119, 26, 76, 57,231, 15,132, -/* 0x15b0 */ 25, 1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, -/* 0x15c0 */ 255,199, 65, 9,194, 65,209,235, 69, 1,246, 69, 57,218,114, 7, -/* 0x15d0 */ 69, 41,218, 65,131,206, 1,255,206,117,199, 76,139, 76, 36,216, -/* 0x15e0 */ 65,193,230, 4,190, 4, 0, 0, 0, 73,129,193, 68, 6, 0, 0, -/* 0x15f0 */ 65,189, 1, 0, 0, 0,187, 1, 0, 0, 0, 72, 99,195, 65,129, -/* 0x1600 */ 251,255,255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132, -/* 0x1610 */ 185, 0, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, -/* 0x1620 */ 255,199, 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15, -/* 0x1630 */ 183,202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, -/* 0x1640 */ 0, 0, 1,219, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0, -/* 0x1650 */ 235, 26, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141, 92, -/* 0x1660 */ 27, 1, 69, 9,238,102, 41,194,102, 65,137, 16, 69, 1,237,255, -/* 0x1670 */ 206,117,136, 65,255,198,116, 64,131,197, 2, 69, 57,254,119, 77, -/* 0x1680 */ 72,139, 84, 36,232, 68,137,248, 68, 41,240, 68, 15,182, 44, 2, -/* 0x1690 */ 68,137,248, 65,255,199,255,205, 68,136, 44, 2, 15,149,194, 49, -/* 0x16a0 */ 192, 68, 59,124, 36,228, 15,146,192,133,194,117,211, 68, 59,124, -/* 0x16b0 */ 36,228, 15,130, 69,247,255,255, 65,129,251,255,255,255, 0,119, -/* 0x16c0 */ 22, 76, 57,231,184, 1, 0, 0, 0,116, 35,235, 7,184, 1, 0, -/* 0x16d0 */ 0, 0,235, 26, 72,255,199,137,248, 43, 68, 36,248, 72,139, 76, -/* 0x16e0 */ 36,240, 72,139, 92, 36, 56,137, 1, 68,137, 59, 49,192, 91, 93, -/* 0x16f0 */ 65, 92, 65, 93, 65, 94, 65, 95, 72,139,117,248, 72,139,125, 16, -/* 0x1700 */ 139, 75, 4, 72, 1,206,139, 19, 72, 1,215,201,235, 2, 87, 94, -/* 0x1710 */ 89, 72,137,240, 72, 41,200, 90, 72, 41,215, 89,137, 57, 91, 93, -/* 0x1720 */ 195,104, 30, 0, 0, 0, 90,232, 30, 0, 0, 0, 80, 82, 79, 84, -/* 0x1730 */ 95, 69, 88, 69, 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, -/* 0x1740 */ 32,102, 97,105,108,101,100, 46, 10, 0, 94,106, 2, 95,106, 1, -/* 0x1750 */ 88, 15, 5,106,127, 95,106, 60, 88, 15, 5, 94,173,131,224,252, -/* 0x1760 */ 65,137,198, 86, 91,139, 22, 72,141,141,245,255,255,255, 68,139, -/* 0x1770 */ 57, 76, 41,249, 69, 41,247, 73, 1,206, 82, 80,106,255, 81, 77, -/* 0x1780 */ 41,201, 65,131,200,255,106, 34, 65, 90, 82, 94,106, 3, 90, 41, -/* 0x1790 */ 255,106, 9, 88, 15, 5, 72,137, 68, 36, 16, 80, 90, 83, 94,173, -/* 0x17a0 */ 80, 72,137,225, 73,137,213,173, 80,173, 65,144, 72,137,247, 94, -/* 0x17b0 */ 255,213, 89, 72,139,116, 36, 24, 72,139,124, 36, 16,106, 5, 90, -/* 0x17c0 */ 106, 10, 88, 15, 5, 65,255,229, 93,232,141,255,255,255, 0, 0, -/* 0x17d0 */ 0, 0,102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108, -/* 0x17e0 */ 102, 54, 52, 45,120, 56, 54, 45, 54, 52, 10, 10, 83,101, 99,116, -/* 0x17f0 */ 105,111,110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, -/* 0x1800 */ 32, 32, 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, -/* 0x1810 */ 32, 32, 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1820 */ 32, 32, 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1830 */ 32, 32, 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, -/* 0x1840 */ 65,108,103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, -/* 0x1850 */ 69, 76, 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, -/* 0x1860 */ 50, 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, -/* 0x1870 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, -/* 0x1880 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48, -/* 0x1890 */ 54, 54, 32, 32, 48, 32, 32, 48, 32, 32, 48, 53, 50, 32, 32, 50, -/* 0x18a0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, -/* 0x18b0 */ 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x18c0 */ 48, 98, 97, 32, 32, 48, 32, 32, 48, 32, 32, 48, 98, 56, 32, 32, -/* 0x18d0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, -/* 0x18e0 */ 32, 51, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x18f0 */ 32, 48, 97, 49, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 50, -/* 0x1900 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, -/* 0x1910 */ 10, 32, 32, 52, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, -/* 0x1920 */ 32, 32, 32, 48, 57, 51, 32, 32, 48, 32, 32, 48, 32, 32, 48, 50, -/* 0x1930 */ 49, 51, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, -/* 0x1940 */ 84, 83, 10, 32, 32, 53, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, -/* 0x1950 */ 48, 32, 32, 32, 32, 48, 54, 52, 32, 32, 48, 32, 32, 48, 32, 32, -/* 0x1960 */ 48, 50, 97, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, -/* 0x1970 */ 69, 78, 84, 83, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 68, 69, -/* 0x1980 */ 67, 49, 48, 32, 32, 32, 32, 48, 57,102, 55, 32, 32, 48, 32, 32, -/* 0x1990 */ 48, 32, 32, 48, 51, 48, 97, 32, 32, 50, 42, 42, 48, 32, 32, 67, -/* 0x19a0 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 55, 32, 76, 90, 77, 65, -/* 0x19b0 */ 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 57,102, 55, 32, 32, -/* 0x19c0 */ 48, 32, 32, 48, 32, 32, 48,100, 48, 49, 32, 32, 50, 42, 42, 48, -/* 0x19d0 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 56, 32, 76, -/* 0x19e0 */ 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 49, 56, -/* 0x19f0 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 54,102, 56, 32, 32, 50, -/* 0x1a00 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, -/* 0x1a10 */ 57, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32, 32, 32, -/* 0x1a20 */ 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 49, 48, 32, 32, -/* 0x1a30 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, -/* 0x1a40 */ 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32, -/* 0x1a50 */ 32, 48, 52, 98, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 49, -/* 0x1a60 */ 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, -/* 0x1a70 */ 83, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, -/* 0x1a80 */ 32, 32, 32, 32, 48, 55, 55, 32, 32, 48, 32, 32, 48, 32, 32, 48, -/* 0x1a90 */ 49, 55, 53, 98, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, -/* 0x1aa0 */ 69, 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, -/* 0x1ab0 */ 69, 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ac0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, -/* 0x1ad0 */ 72, 69, 65, 68, 32, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10, -/* 0x1ae0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1af0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, -/* 0x1b00 */ 67, 51, 48, 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, -/* 0x1b10 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1b20 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, -/* 0x1b30 */ 78, 89, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, -/* 0x1b40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, -/* 0x1b50 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, -/* 0x1b60 */ 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, -/* 0x1b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, -/* 0x1b80 */ 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, -/* 0x1b90 */ 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1ba0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, -/* 0x1bb0 */ 32, 78, 82, 86, 50, 69, 32, 48, 32, 78, 82, 86, 50, 69, 10, 48, -/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1bd0 */ 108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68, 32, 48, 32, -/* 0x1be0 */ 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, -/* 0x1c00 */ 82, 86, 50, 66, 32, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48, 48, -/* 0x1c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, -/* 0x1c20 */ 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, -/* 0x1c30 */ 32, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48, -/* 0x1c40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, -/* 0x1c50 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, -/* 0x1c60 */ 48, 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, -/* 0x1c70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, -/* 0x1c80 */ 108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, -/* 0x1c90 */ 50, 48, 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, -/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1cb0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73, -/* 0x1cc0 */ 76, 32, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, -/* 0x1cd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, -/* 0x1ce0 */ 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, -/* 0x1cf0 */ 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1d00 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1d10 */ 32, 42, 85, 78, 68, 42, 32, 48, 32, 79, 95, 66, 73, 78, 70, 79, -/* 0x1d20 */ 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, -/* 0x1d30 */ 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65, 73, -/* 0x1d40 */ 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, -/* 0x1d50 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, -/* 0x1d60 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, -/* 0x1d70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, 32, 82, -/* 0x1d80 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, -/* 0x1d90 */ 32, 69, 76, 70, 77, 65, 73, 78, 90, 43, 48,120, 48, 48, 48, 48, -/* 0x1da0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 57, 10, 10, 82, 69, -/* 0x1db0 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, -/* 0x1dc0 */ 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, 70, -/* 0x1dd0 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, -/* 0x1de0 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1df0 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e00 */ 48, 48, 48, 48, 48, 97,102, 32, 82, 95, 88, 56, 54, 95, 54, 52, -/* 0x1e10 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 72, 69, -/* 0x1e20 */ 65, 68, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e30 */ 48, 48, 48, 50, 49, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1e40 */ 48, 48, 48, 48, 53, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, -/* 0x1e50 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, -/* 0x1e60 */ 89, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, -/* 0x1e70 */ 102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, -/* 0x1e80 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, 82, -/* 0x1e90 */ 86, 50, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, -/* 0x1ea0 */ 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, -/* 0x1eb0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, -/* 0x1ec0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57, 54, 32, -/* 0x1ed0 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, -/* 0x1ee0 */ 32, 32, 78, 82, 86, 95, 72, 69, 65, 68, 43, 48,120, 48, 48, 48, -/* 0x1ef0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50, 49, 10, 48, 48, -/* 0x1f00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 99, 32, 82, -/* 0x1f10 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, -/* 0x1f20 */ 32, 69, 76, 70, 77, 65, 73, 78, 89, 43, 48,120,102,102,102,102, -/* 0x1f30 */ 102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, 69, -/* 0x1f40 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, -/* 0x1f50 */ 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, 70, -/* 0x1f60 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, -/* 0x1f70 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, -/* 0x1f80 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1f90 */ 48, 48, 48, 48, 48, 56, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, -/* 0x1fa0 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 78, 82, 86, 95, 72, 69, -/* 0x1fb0 */ 65, 68, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1fc0 */ 48, 48, 48, 50, 49, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x1fd0 */ 48, 48, 48, 48, 53, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, -/* 0x1fe0 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, -/* 0x1ff0 */ 89, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, -/* 0x2000 */ 102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, -/* 0x2010 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, -/* 0x2020 */ 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, -/* 0x2030 */ 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, -/* 0x2040 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, -/* 0x2050 */ 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x2060 */ 48, 48, 48, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, -/* 0x2070 */ 51, 50, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, -/* 0x2080 */ 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x2090 */ 48, 48, 49, 50, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, -/* 0x20a0 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, -/* 0x20b0 */ 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, -/* 0x20c0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, -/* 0x20d0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, -/* 0x20e0 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, -/* 0x20f0 */ 55, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, -/* 0x2100 */ 32, 32, 32, 32, 32, 79, 95, 66, 73, 78, 70, 79, 10 +/* 0x0040 */ 89, 84, 95, 81,232, 47, 1, 0, 0,232, 42, 1, 0, 0, 72,139, +/* 0x0050 */ 7, 72,139, 79, 8, 72,131,199, 16, 72,131,248, 6,116, 12, 72, +/* 0x0060 */ 199,193, 0, 16, 0, 0, 72,133,192,117,227, 72,247,217, 81, 82, +/* 0x0070 */ 104,117,112,120, 0, 84, 95, 41,246,184, 63, 1, 0, 0,232, 2, +/* 0x0080 */ 1, 0, 0, 73,137,196, 89, 72,141, 61,174,255,255,255,139, 15, +/* 0x0090 */ 72, 41,207, 72,141, 53, 0, 0, 0, 0,173,147, 65,137,221,173, +/* 0x00a0 */ 146,131,194, 16, 82,106,255, 87, 72, 41,217, 81, 72, 1,251, 83, +/* 0x00b0 */ 84, 93, 72, 41,212, 72,131,228,192, 84, 95,173, 80,173,102,131, +/* 0x00c0 */ 248, 2,116, 1,244, 88, 72, 1,240, 80, 85, 49,219, 49,201, 72, +/* 0x00d0 */ 141, 21,196, 0, 0, 0,106,255, 93,252,168,164,255,210,114,251, +/* 0x00e0 */ 141, 65, 1,255,210, 17,192,255,210,115,248,131,232, 3,114, 12, +/* 0x00f0 */ 193,224, 8,172,131,240,255,116, 47, 72, 99,232,141, 65, 1,255, +/* 0x0100 */ 210, 17,201,255,210, 17,201,117, 13,137,193,131,192, 2,255,210, +/* 0x0110 */ 17,201,255,210,115,248,129,253, 0,243,255,255, 17,193, 86, 72, +/* 0x0120 */ 141, 52, 47,243,164, 94,235,180, 93, 89, 72, 57,206,116, 1,244, +/* 0x0130 */ 72,139, 69, 48, 72,137, 4, 36, 72,139, 85, 32, 84, 94, 76,137, +/* 0x0140 */ 231,106, 1, 88,232, 60, 0, 0, 0, 85, 92, 69, 41,201, 77,137, +/* 0x0150 */ 224,106, 1, 65, 90, 82, 94,106, 5, 90, 41,255,106, 9, 88,232, +/* 0x0160 */ 33, 0, 0, 0, 80, 72,137, 69, 24, 65, 80, 95,106, 3, 88, 15, +/* 0x0170 */ 5, 88, 72,131,192, 8,255,224, 72,139, 7, 72,131,199, 8, 72, +/* 0x0180 */ 133,192,117,244,195, 80, 15, 5, 89, 72, 61, 0,240,255,255,114, +/* 0x0190 */ 1,244,195, 72,139, 60, 36,102,175,195, 1,219,116, 2,243,195, +/* 0x01a0 */ 139, 30, 72,131,238,252, 17,219,243,195, 0, 0, 0, 0, 0, 0, +/* 0x01b0 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 54, +/* 0x01c0 */ 52, 45,120, 56, 54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111, +/* 0x01d0 */ 110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, +/* 0x01e0 */ 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, +/* 0x01f0 */ 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x0200 */ 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x0210 */ 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108, +/* 0x0220 */ 103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, +/* 0x0230 */ 70, 77, 65, 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 49, 54, 97, +/* 0x0240 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, +/* 0x0250 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, +/* 0x0260 */ 69, 76, 70, 77, 65, 73, 78, 90, 32, 32, 32, 32, 32, 32, 48, 52, +/* 0x0270 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 97, 99, 32, 32, 50, 42, +/* 0x0280 */ 42, 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 83, 89, 77, +/* 0x0290 */ 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48, 48, +/* 0x02a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, +/* 0x02b0 */ 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 48, 32, 69, +/* 0x02c0 */ 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x02d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x02e0 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 32, 48, 32, 69, 76, 70, 77, +/* 0x02f0 */ 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0300 */ 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, +/* 0x0310 */ 70, 77, 65, 73, 78, 88, 32, 48, 32, 95,115,116, 97,114,116, 10, +/* 0x0320 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0330 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 42, 85, 78, 68, 42, 32, 48, +/* 0x0340 */ 32, 79, 95, 66, 73, 78, 70, 79, 10, 10, 82, 69, 76, 79, 67, 65, +/* 0x0350 */ 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, +/* 0x0360 */ 32, 91, 69, 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, +/* 0x0370 */ 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, +/* 0x0380 */ 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x0390 */ 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x03a0 */ 48, 48, 48, 48, 53, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, +/* 0x03b0 */ 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, +/* 0x03c0 */ 90, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x03d0 */ 102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, +/* 0x03e0 */ 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, +/* 0x03f0 */ 70, 77, 65, 73, 78, 90, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, +/* 0x0400 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, +/* 0x0410 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, +/* 0x0420 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x0430 */ 48, 48, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 51, 50, 32, 32, +/* 0x0440 */ 32, 32, 32, 32, 32, 79, 95, 66, 73, 78, 70, 79, 10 }; diff --git a/src/stub/amd64-linux.elf-fold.h b/src/stub/amd64-linux.elf-fold.h index b6d4db72..84a215b9 100644 --- a/src/stub/amd64-linux.elf-fold.h +++ b/src/stub/amd64-linux.elf-fold.h @@ -1,5 +1,5 @@ /* amd64-linux.elf-fold.h - created from amd64-linux.elf-fold.bin, 3357 (0xd1d) bytes + created from amd64-linux.elf-fold.bin, 17558 (0x4496) bytes This file is part of the UPX executable compressor. @@ -32,219 +32,1107 @@ /* clang-format off */ -#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 3357 -#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0x15894e73 -#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0xcd34bb71 +#define STUB_AMD64_LINUX_ELF_FOLD_SIZE 17558 +#define STUB_AMD64_LINUX_ELF_FOLD_ADLER32 0xe1a9ce94 +#define STUB_AMD64_LINUX_ELF_FOLD_CRC32 0x9ea5531a -unsigned char stub_amd64_linux_elf_fold[3357] = { +unsigned char stub_amd64_linux_elf_fold[17558] = { /* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0010 */ 2, 0, 62, 0, 1, 0, 0, 0,188, 0, 16, 0, 0, 0, 0, 0, -/* 0x0020 */ 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0030 */ 0, 0, 0, 0, 64, 0, 56, 0, 2, 0, 0, 0, 0, 0, 0, 0, -/* 0x0040 */ 1, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0050 */ 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, -/* 0x0060 */ 29, 13, 0, 0, 0, 0, 0, 0, 29, 13, 0, 0, 0, 0, 0, 0, -/* 0x0070 */ 0, 0, 16, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, -/* 0x0080 */ 29, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x0090 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -/* 0x00a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, -/* 0x00b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,232, 90, 0, 0, -/* 0x00c0 */ 0, 47,112,114,111, 99, 47,115,101,108,102, 47,101,120,101, 0, -/* 0x00d0 */ 0,131,249, 73,117, 68, 83, 87, 72,141, 76, 55,253, 94, 86, 91, -/* 0x00e0 */ 235, 47, 72, 57,206,115, 50, 86, 94,172, 60,128,114, 10, 60,143, -/* 0x00f0 */ 119, 6,128,126,254, 15,116, 6, 44,232, 60, 1,119,228, 72, 57, -/* 0x0100 */ 206,115, 22, 86,173, 40,208,117,223, 95, 15,200, 41,248, 1,216, -/* 0x0110 */ 171, 72, 57,206,115, 3,172,235,223, 91,195, 90, 65, 86, 65, 87, -/* 0x0120 */ 72,141, 66, 16, 80, 84, 94,246, 67,252, 2,117, 7, 72,129,236, -/* 0x0130 */ 0, 16, 0, 0, 84, 95,106, 10, 89,243, 72,165, 49,192, 72, 57, -/* 0x0140 */ 6, 72,165,117,249, 73,137,254,246, 67,252, 2,117, 2, 72,171, -/* 0x0150 */ 72, 57, 6, 72,165,117,249, 73,137,252, 86, 89, 72, 57, 6, 72, -/* 0x0160 */ 165, 72,165,117,247, 73,137,255, 73,137,245, 77, 41,252,246, 67, -/* 0x0170 */ 252, 2,116, 5, 73,137,254,235,116, 82, 95,106, 0, 94,232, 19, -/* 0x0180 */ 1, 0, 0, 72,137, 68, 36, 32,186,255, 15, 0, 0, 76,137,254, -/* 0x0190 */ 106, 89, 88, 15, 5,133,192,121, 5, 87, 94,106, 15, 88,145,253, -/* 0x01a0 */ 73,141,125,255,176, 0,170, 72,141,116, 14,255,243,164, 72,131, -/* 0x01b0 */ 239, 3,199, 7, 32, 32, 32, 61, 73,137, 62, 72,131,231,248, 76, -/* 0x01c0 */ 137,249, 72, 41,225,137,200, 49,248,131,240, 8,131,224, 8, 72, -/* 0x01d0 */ 41,199, 73,137,254, 72,131,239, 8, 73,141,119,248, 72,193,233, -/* 0x01e0 */ 3,243, 72,165, 72,141,103, 8,252, 75,141, 12, 38,139, 67,252, -/* 0x01f0 */ 131,224, 1, 72, 1,193, 65, 89, 94, 95, 88, 72,129,236, 0, 8, -/* 0x0200 */ 0, 0, 72,137,226, 80, 73,137,197, 73,137,232,232,103, 6, 0, -/* 0x0210 */ 0, 72,129,196, 8, 8, 0, 0, 72,137, 68, 36, 32, 91, 73,139, -/* 0x0220 */ 181,160, 0, 0, 0, 76,137,239,232, 97, 0, 0, 0, 76,137,239, -/* 0x0230 */ 232,101, 0, 0, 0,133,219,120, 31, 77, 41,201, 65,137,216,106, -/* 0x0240 */ 2, 89,106, 1, 90,190, 0, 16, 0, 0, 41,255,232, 16, 0, 0, -/* 0x0250 */ 0,137,223,232, 58, 0, 0, 0, 95, 94,106, 11, 88, 65,255,102, -/* 0x0260 */ 248,176, 9, 73,137,202, 15,182,192, 15, 5, 72, 61, 0,240,255, -/* 0x0270 */ 255,114, 4, 72,131,200,255,195,185,255, 15, 0, 0, 33,249, 72, -/* 0x0280 */ 41,207, 72, 1,206,233, 20, 0, 0, 0,176, 60,235, 2,176, 12, -/* 0x0290 */ 235, 2,176, 3,235, 2,176, 2,235, 2,176, 11,235, 2,176, 10, -/* 0x02a0 */ 235, 2,176, 1,235, 2,176, 0,235,188,204,195, 81, 72, 57, 23, -/* 0x02b0 */ 76,139, 71, 8, 72,141, 74,255,115, 10,191,127, 0, 0, 0,232, -/* 0x02c0 */ 198,255,255,255, 72,131,249,255,116, 17, 65, 15,182, 0, 72,255, -/* 0x02d0 */ 201, 73,255,192,136, 6, 72,255,198,235,233, 72, 1, 87, 8, 72, -/* 0x02e0 */ 41, 23, 88,195, 65, 85, 73,137,213, 65, 84, 73,137,204, 85, 72, -/* 0x02f0 */ 137,253, 83, 72,137,243, 72,131,236, 40, 72,131, 62, 0, 15,132, -/* 0x0300 */ 230, 0, 0, 0, 72,141,116, 36, 16,186, 12, 0, 0, 0, 72,137, -/* 0x0310 */ 239,232,150,255,255,255,139, 68, 36, 16,139,116, 36, 20,133,192, -/* 0x0320 */ 117, 21,129,254, 85, 80, 88, 33,117, 17, 72,131,125, 0, 0, 15, -/* 0x0330 */ 132,181, 0, 0, 0,235, 4,133,246,117, 10,191,127, 0, 0, 0, -/* 0x0340 */ 232, 69,255,255,255, 57,198,119,242,137,194, 72, 59, 19,119,235, -/* 0x0350 */ 57,198, 72,139, 67, 8,115,108, 72,137, 84, 36, 8, 72,139,125, -/* 0x0360 */ 8, 72,141, 76, 36, 8, 68,139, 68, 36, 24, 72,137,194, 65,255, -/* 0x0370 */ 213,133,192,117,198,139, 68, 36, 16, 72,139,116, 36, 8, 72, 57, -/* 0x0380 */ 198,117,184, 15,182, 76, 36, 25,132,201, 15,149,194, 49,192, 77, -/* 0x0390 */ 133,228, 15,149,192,133,194,116, 29, 72,129,254, 0, 2, 0, 0, -/* 0x03a0 */ 119, 5, 72, 57, 51,117, 15, 15,182, 84, 36, 26, 15,182,201, 72, -/* 0x03b0 */ 139,123, 8, 65,255,212,139, 68, 36, 20, 72, 1, 69, 8, 72, 41, -/* 0x03c0 */ 69, 0,235, 13,137,242, 72,137,239, 72,137,198,232,219,254,255, -/* 0x03d0 */ 255,139, 84, 36, 16, 72,139, 3, 72, 1, 83, 8, 72, 41,208, 72, -/* 0x03e0 */ 133,192, 72,137, 3,233, 20,255,255,255, 72,131,196, 40, 91, 93, -/* 0x03f0 */ 65, 92, 65, 93,195, 72,133,255, 65, 80,116, 80, 64,246,199, 1, -/* 0x0400 */ 117, 74, 69, 49,192, 49,201, 72,139, 7, 65,137,241, 76, 57,200, -/* 0x0410 */ 117, 8,255,193, 72,137, 87, 8,235, 11, 72,131,248, 1,117, 5, -/* 0x0420 */ 73,137,248,235, 33, 72,133,192,117, 28,133,201,117, 30, 77,133, -/* 0x0430 */ 192,116, 9, 77,137, 8, 73,137, 80, 8,235, 16,191,127, 0, 0, -/* 0x0440 */ 0,232, 68,254,255,255, 72,131,199, 16,235,187, 94,195, 65, 87, -/* 0x0450 */ 73,137,255, 65, 86, 65, 85, 65, 84, 73,137,252, 85, 83, 72,131, -/* 0x0460 */ 236,104, 76, 3,103, 32, 72,133,246, 72,139,132, 36,160, 0, 0, -/* 0x0470 */ 0,137, 84, 36, 60, 72,137,116, 36, 64, 72,137, 76, 36, 48, 76, -/* 0x0480 */ 137, 68, 36, 40, 76,137, 76, 36, 32, 72,139, 56, 65, 15,183, 87, -/* 0x0490 */ 16,116, 76, 72,139, 71, 32, 72, 1,248, 72, 43,120, 72,102,131, -/* 0x04a0 */ 250, 2,117, 4, 72,139,120, 16, 72,139,112, 40, 69, 49,201, 65, -/* 0x04b0 */ 131,200,255, 49,210,185, 50, 0, 0, 0, 72,141, 4, 62, 72,137, -/* 0x04c0 */ 68, 36, 72,232,153,253,255,255,102, 65,131,127, 16, 2, 73,137, -/* 0x04d0 */ 198, 15,133,172, 0, 0, 0, 69, 49,246,233,164, 0, 0, 0,102, -/* 0x04e0 */ 131,250, 3, 65, 15,183, 87, 56,185, 16, 0, 0, 0,184, 0, 0, -/* 0x04f0 */ 0, 0, 73,137,248, 76,137,230, 15, 68,200, 72,131,205,255, 49, -/* 0x0500 */ 219, 49,255,131,193, 34,255,202,120, 33,131, 62, 1,117, 22, 72, -/* 0x0510 */ 139, 70, 16, 72, 57,232, 72, 15, 66,232, 72, 3, 70, 40, 72, 57, -/* 0x0520 */ 195, 72, 15, 66,216, 72,131,198, 56,235,219, 72,129,229, 0,240, -/* 0x0530 */ 255,255, 72, 41,235, 72,129,195,255, 15, 0, 0, 72,129,227, 0, -/* 0x0540 */ 240,255,255,246,193, 16,116, 5, 72,137,239,235, 19, 72,133,237, -/* 0x0550 */ 117, 14,137,200, 76,137,199,131,200, 16, 77,133,192, 15, 69,200, -/* 0x0560 */ 69, 49,201, 65,131,200,255, 49,210, 72,137,222,232,240,252,255, -/* 0x0570 */ 255, 72,137,199, 72,141, 4, 3, 73,137,254, 72,137, 68, 36, 72, -/* 0x0580 */ 73, 41,238,102, 65,131,127, 56, 0,199, 68, 36, 28, 0, 0, 0, -/* 0x0590 */ 0, 15,132,192, 2, 0, 0, 72,131,124, 36, 64, 0,116, 35, 65, -/* 0x05a0 */ 131, 60, 36, 6,117, 28, 73,139, 84, 36, 16, 72,139,124, 36, 48, -/* 0x05b0 */ 190, 3, 0, 0, 0, 76, 1,242,232, 56,254,255,255,233,126, 2, -/* 0x05c0 */ 0, 0, 65,131, 60, 36, 1, 15,133,115, 2, 0, 0, 73,131,124, -/* 0x05d0 */ 36, 40, 0, 15,132,103, 2, 0, 0, 65,139, 76, 36, 4,199, 68, -/* 0x05e0 */ 36, 24, 64, 98, 81,115,131,225, 7,193,225, 2,211,108, 36, 24, -/* 0x05f0 */ 131,100, 36, 24, 7, 72,131,124, 36, 64, 0,116, 75, 73,131,124, -/* 0x0600 */ 36, 8, 0,117, 67, 73,139, 84, 36, 16, 72,139,124, 36, 48,190, -/* 0x0610 */ 3, 0, 0, 0, 76, 1,242, 73, 3, 87, 32,232,213,253,255,255, -/* 0x0620 */ 73, 15,183, 87, 56, 72,139,124, 36, 48,190, 5, 0, 0, 0,232, -/* 0x0630 */ 193,253,255,255, 73, 15,183, 87, 54, 72,139,124, 36, 48,190, 4, -/* 0x0640 */ 0, 0, 0,232,173,253,255,255, 73,139,124, 36, 16, 73,139, 68, -/* 0x0650 */ 36, 40,185, 50, 0, 0, 0, 73,139,116, 36, 32, 76, 1,247, 72, -/* 0x0660 */ 1,248, 72,137,250, 72,137,253,129,226,255, 15, 0, 0, 72,137, -/* 0x0670 */ 68, 36, 8, 72,137,240, 72, 1,208, 72, 41,213, 72,137,116, 36, -/* 0x0680 */ 80, 72,137, 68, 36, 16,139, 68, 36, 24, 76,141, 44, 55,139,116, -/* 0x0690 */ 36, 24, 72,137,124, 36, 88,131,200, 2, 72,131,124, 36, 64, 0, -/* 0x06a0 */ 15, 69,240,137,240,131,224,251, 72,131,124, 36, 64, 0, 15, 69, -/* 0x06b0 */ 240, 73,139, 68, 36, 8, 72, 41,208,131,202,255, 72,131,124, 36, -/* 0x06c0 */ 64, 0,117, 6,139, 84, 36, 60,177, 18, 65,137,208,137,242, 72, -/* 0x06d0 */ 139,116, 36, 16, 73,137,193, 72,137,239,232,130,251,255,255, 72, -/* 0x06e0 */ 57,197, 15,133, 32, 1, 0, 0, 72,131,124, 36, 64, 0,116, 25, -/* 0x06f0 */ 72,139, 76, 36, 32, 72,139, 84, 36, 40, 72,141,116, 36, 80, 72, -/* 0x0700 */ 139,124, 36, 64,232,219,251,255,255,246, 68, 36, 24, 2,116, 22, -/* 0x0710 */ 68,137,233, 76,137,239, 49,192,247,217,252,129,225,255, 15, 0, -/* 0x0720 */ 0,243,170, 73,137,253, 72,131,124, 36, 64, 0, 15,132,224, 0, -/* 0x0730 */ 0, 0,199, 68, 36, 4, 0, 0, 0, 0, 72,184,255,255,255,255, -/* 0x0740 */ 1, 0, 0, 0, 73, 35, 4, 36, 72,186, 1, 0, 0, 0, 1, 0, -/* 0x0750 */ 0, 0, 72, 57,208, 15,133,152, 0, 0, 0, 73,139, 84, 36, 40, -/* 0x0760 */ 73,139, 76, 36, 16, 73, 59, 84, 36, 32, 72,141, 4, 10, 74,141, -/* 0x0770 */ 28, 48,117, 14,137,216,247,216, 37,255, 15, 0, 0,131,248, 3, -/* 0x0780 */ 119, 58, 73,131,124, 36, 8, 0, 74,141, 92, 49, 12,116, 45, 69, -/* 0x0790 */ 49,201, 65,131,200,255, 49,255,185, 34, 0, 0, 0,186, 3, 0, -/* 0x07a0 */ 0, 0,190, 0, 16, 0, 0,199, 68, 36, 4, 1, 0, 0, 0,232, -/* 0x07b0 */ 173,250,255,255, 72,133,192, 72,137,195,116, 55,131,124, 36, 4, -/* 0x07c0 */ 0,199, 3, 15, 5, 90,195,116, 18,186, 5, 0, 0, 0,190, 4, -/* 0x07d0 */ 0, 0, 0, 72,137,223,232,157,250,255,255, 72,133,219,116, 19, -/* 0x07e0 */ 72,139,124, 36, 48, 72,137,218, 49,246, 72,131,231,254,232, 2, -/* 0x07f0 */ 252,255,255,139, 84, 36, 24, 72,139,116, 36, 16, 72,137,239,232, -/* 0x0800 */ 116,250,255,255,133,192,116, 10,191,127, 0, 0, 0,232,120,250, -/* 0x0810 */ 255,255, 76, 59,108, 36, 8,115, 39, 76, 41,108, 36, 8,139, 84, -/* 0x0820 */ 36, 24, 69, 49,201, 72,139,116, 36, 8, 65,131,200,255,185, 50, -/* 0x0830 */ 0, 0, 0, 76,137,239,232, 38,250,255,255, 73, 57,197,117,200, -/* 0x0840 */ 255, 68, 36, 28, 65, 15,183, 71, 56, 73,131,196, 56, 57, 68, 36, -/* 0x0850 */ 28, 15,140, 64,253,255,255, 72,139,132, 36,160, 0, 0, 0, 76, -/* 0x0860 */ 137, 48, 77, 3,119, 24, 72,131,196,104, 91, 93, 65, 92, 65, 93, -/* 0x0870 */ 76,137,240, 65, 94, 65, 95,195, 65, 87, 65, 86, 73,137,206, 49, -/* 0x0880 */ 201, 65, 85, 65, 84, 77,137,204, 85, 72,137,213, 76,141,109, 64, -/* 0x0890 */ 83, 76,137,195, 72,131,236, 72,139, 7, 72,137,124, 36, 24, 72, -/* 0x08a0 */ 137,124, 36, 40, 76,141,188, 36,128, 0, 0, 0, 72,137,116, 36, -/* 0x08b0 */ 32, 72,141,116, 36, 48, 72,137, 84, 36, 56, 76,137,194, 72,137, -/* 0x08c0 */ 68, 36, 48,139, 71, 4, 72,141,124, 36, 16, 72,131,192, 12, 72, -/* 0x08d0 */ 137, 68, 36, 16,232, 11,250,255,255, 80, 77,137,225, 73,137,216, -/* 0x08e0 */ 49,210, 76,137,241, 72,137,239, 72,141,116, 36, 40, 65, 87,232, -/* 0x08f0 */ 90,251,255,255,190, 9, 0, 0, 0, 72,137,194, 76,137,247, 73, -/* 0x0900 */ 137,196,232,238,250,255,255, 91, 88,102,131,125, 56, 0,199, 68, -/* 0x0910 */ 36, 12, 0, 0, 0, 0, 15,132,145, 0, 0, 0, 65,131,125, 0, -/* 0x0920 */ 3,117,116, 73,139, 63, 73, 3,125, 16, 49,210, 49,246,232, 99, -/* 0x0930 */ 249,255,255,133,192,137,195,120, 23,186, 0, 4, 0, 0, 72,137, -/* 0x0940 */ 238,137,199,232, 94,249,255,255, 72, 61, 0, 4, 0, 0,116, 10, -/* 0x0950 */ 191,127, 0, 0, 0,232, 48,249,255,255, 73,199, 7, 0, 0, 0, -/* 0x0960 */ 0, 65, 83, 69, 49,201, 69, 49,192, 49,201, 65, 87,137,218, 49, -/* 0x0970 */ 246, 72,137,239,232,213,250,255,255, 73,139, 23,190, 7, 0, 0, -/* 0x0980 */ 0, 76,137,247, 73,137,196,232,105,250,255,255,137,223,232,255, -/* 0x0990 */ 248,255,255, 65, 89, 65, 90,255, 68, 36, 12, 15,183, 69, 56, 73, -/* 0x09a0 */ 131,197, 56, 57, 68, 36, 12, 15,130,111,255,255,255, 72,131,196, -/* 0x09b0 */ 72, 76,137,224, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95,195, 0, -/* 0x09c0 */ 85, 72,137,229, 83, 82, 86, 87,232,101, 0, 0, 0, 91, 95, 94, -/* 0x09d0 */ 80, 15,182, 75, 9,133,201,116, 11, 15,182, 83, 10,139, 54,232, -/* 0x09e0 */ 4, 0, 0, 0, 88, 91, 93,195,131,249, 73,117, 68, 83, 87, 72, -/* 0x09f0 */ 141, 76, 55,253, 94, 86, 91,235, 47, 72, 57,206,115, 50, 86, 94, -/* 0x0a00 */ 172, 60,128,114, 10, 60,143,119, 6,128,126,254, 15,116, 6, 44, -/* 0x0a10 */ 232, 60, 1,119,228, 72, 57,206,115, 22, 86,173, 40,208,117,223, -/* 0x0a20 */ 95, 15,200, 41,248, 1,216,171, 72, 57,206,115, 3,172,235,223, -/* 0x0a30 */ 91,195, 82, 15,182, 87, 8, 87, 86, 95, 94,139, 70, 4, 72,131, -/* 0x0a40 */ 198, 12, 72, 1,240, 80, 87, 49,219, 49,201, 72,131,205,255,235, -/* 0x0a50 */ 78,139, 30, 72,131,238,252, 17,219,138, 22,243,195, 1,219,116, -/* 0x0a60 */ 240,243,195, 72,141, 4, 47,131,249, 5,138, 16,118, 32,131,253, -/* 0x0a70 */ 252,119, 27,131,233, 4,139, 16, 72,131,192, 4,131,233, 4,137, -/* 0x0a80 */ 23, 72,141,127, 4,115,239,131,193, 4,138, 16,116, 15, 72,255, -/* 0x0a90 */ 192,136, 23,255,201,138, 16, 72,141,127, 1,117,241,243,195,252, -/* 0x0aa0 */ 128,250, 8, 15,133,218, 0, 0, 0,235, 8, 72,255,198,136, 23, -/* 0x0ab0 */ 72,255,199,138, 22, 1,219,117, 10,139, 30, 72,131,238,252, 17, -/* 0x0ac0 */ 219,138, 22,114,230,141, 65, 1,235, 18,255,200, 1,219,117, 10, -/* 0x0ad0 */ 139, 30, 72,131,238,252, 17,219,138, 22, 17,192, 1,219,117, 10, -/* 0x0ae0 */ 139, 30, 72,131,238,252, 17,219,138, 22, 17,192, 1,219,117, 10, -/* 0x0af0 */ 139, 30, 72,131,238,252, 17,219,138, 22,115,206,131,232, 3,114, -/* 0x0b00 */ 29,193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15, -/* 0x0b10 */ 132,235,244,239,255,209,248, 72, 99,232,114, 67,235, 14, 1,219, -/* 0x0b20 */ 117, 8,139, 30, 72,131,238,252, 17,219,114, 51,255,193, 1,219, -/* 0x0b30 */ 117, 8,139, 30, 72,131,238,252, 17,219,114, 35, 1,219,117, 10, -/* 0x0b40 */ 139, 30, 72,131,238,252, 17,219,138, 22, 17,201, 1,219,117, 8, -/* 0x0b50 */ 139, 30, 72,131,238,252, 17,219,115,226,131,193, 2,235, 16, 1, -/* 0x0b60 */ 219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17,201, 72, -/* 0x0b70 */ 129,253, 0,251,255,255,131,209, 2,232,229,254,255,255,233, 48, -/* 0x0b80 */ 255,255,255, 87, 94,128,250, 5, 15,133,204, 0, 0, 0,235, 8, -/* 0x0b90 */ 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, -/* 0x0ba0 */ 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1,235, 18,255, -/* 0x0bb0 */ 200, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17, -/* 0x0bc0 */ 192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17, -/* 0x0bd0 */ 192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22,115, -/* 0x0be0 */ 206,131,232, 3,114, 27,193,224, 8, 15,182,210, 9,208, 72,255, -/* 0x0bf0 */ 198,131,240,255, 15,132, 6,244,239,255,209,248, 72, 99,232,235, -/* 0x0c00 */ 14, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17, -/* 0x0c10 */ 201, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17, -/* 0x0c20 */ 201,117, 35,255,193, 1,219,117, 10,139, 30, 72,131,238,252, 17, -/* 0x0c30 */ 219,138, 22, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17, -/* 0x0c40 */ 219,115,226,131,193, 2, 72,129,253, 0,251,255,255,131,209, 1, -/* 0x0c50 */ 232, 14,254,255,255,233, 62,255,255,255, 87, 94,128,250, 2, 15, -/* 0x0c60 */ 133,182, 0, 0, 0,235, 8, 72,255,198,136, 23, 72,255,199,138, -/* 0x0c70 */ 22, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, 22,114, -/* 0x0c80 */ 230,141, 65, 1, 1,219,117, 10,139, 30, 72,131,238,252, 17,219, -/* 0x0c90 */ 138, 22, 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17,219, -/* 0x0ca0 */ 138, 22,115,224,131,232, 3,114, 23,193,224, 8, 15,182,210, 9, -/* 0x0cb0 */ 208, 72,255,198,131,240,255, 15,132, 67,243,239,255, 72, 99,232, -/* 0x0cc0 */ 141, 65, 1, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, -/* 0x0cd0 */ 22, 17,201, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, -/* 0x0ce0 */ 22, 17,201,117, 35,137,193,131,192, 2, 1,219,117, 10,139, 30, -/* 0x0cf0 */ 72,131,238,252, 17,219,138, 22, 17,201, 1,219,117, 8,139, 30, -/* 0x0d00 */ 72,131,238,252, 17,219,115,226, 72,129,253, 0,243,255,255, 17, -/* 0x0d10 */ 193,232, 77,253,255,255,233, 84,255,255,255, 87, 94 +/* 0x0010 */ 1, 0, 62, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0, 72, 34, 0, 0, 0, 0, 0, 0, +/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 21, 0, 18, 0, +/* 0x0040 */ 0,240,255,255,255,255,255,255, 76,137,109, 48, 76,137,232,131, +/* 0x0050 */ 224, 1, 9, 69, 16, 72,137,230,246, 69, 48, 2,117, 7, 72,129, +/* 0x0060 */ 236, 0, 16, 0, 0, 72,137,231,106, 8, 89,243, 72,165, 72,131, +/* 0x0070 */ 62, 0, 72,165,117,248, 73,137,254,246, 69, 48, 2,117, 2, 72, +/* 0x0080 */ 171, 72,131, 62, 0, 72,165,117,248, 73,137,252, 72,137,249, 72, +/* 0x0090 */ 131, 62, 0, 72,165, 72,165,117,246, 73,137,255, 73,137,245, 73, +/* 0x00a0 */ 41,252,246, 69, 48, 2,116, 8,131,205,255, 73,137,254,235,113, +/* 0x00b0 */ 87, 72,141, 61, 0, 0, 0, 0, 41,246,232, 0, 0, 0, 0,137, +/* 0x00c0 */ 197, 94,186,255, 15, 0, 0,106, 89, 88, 15, 5,133,192,121, 5, +/* 0x00d0 */ 87, 94,106, 15, 88,145,253, 73,141,125,255,176, 0,170, 72,141, +/* 0x00e0 */ 116, 14,255,243,164, 72,131,239, 3,199, 7, 32, 32, 32, 61, 73, +/* 0x00f0 */ 137, 62, 72,131,231,248, 76,137,249, 72, 41,225, 73,137,254, 72, +/* 0x0100 */ 131,239, 8, 73,141,119,248,137,248, 49,240,131,224, 8, 72, 41, +/* 0x0110 */ 199, 72,193,233, 3,243, 72,165, 72,141,103, 8,252, 75,141, 12, +/* 0x0120 */ 38, 95, 94, 72,131,231,252, 65, 88, 68,137,192,131,224, 1, 72, +/* 0x0130 */ 9,193, 73, 41,192, 77,137,197, 72,129,236, 0, 8, 0, 0, 72, +/* 0x0140 */ 137,226,232, 0, 0, 0, 0, 72,129,196, 0, 8, 0, 0,137,235, +/* 0x0150 */ 72,137, 68, 36, 24, 73,139,181,160, 0, 0, 0, 76,137,239,232, +/* 0x0160 */ 0, 0, 0, 0, 76,137,239,232, 0, 0, 0, 0,133,219,120, 31, +/* 0x0170 */ 77, 41,201, 65,137,216,106, 2, 89,106, 1, 90,190, 0, 16, 0, +/* 0x0180 */ 0, 41,255,232, 0, 0, 0, 0,137,223,232, 0, 0, 0, 0, 95, +/* 0x0190 */ 94,106, 11, 88, 65,255,102,248, 72,139, 5,161,254,255,255,195, +/* 0x01a0 */ 81, 72, 57, 23, 76,139, 71, 8, 72,141, 74,255,115, 10,191,127, +/* 0x01b0 */ 0, 0, 0,232, 0, 0, 0, 0, 72,131,249,255,116, 17, 65, 15, +/* 0x01c0 */ 182, 0, 72,255,201, 73,255,192,136, 6, 72,255,198,235,233, 72, +/* 0x01d0 */ 1, 87, 8, 72, 41, 23, 88,195, 85, 72,137,245, 83, 72,137,251, +/* 0x01e0 */ 72,131,236, 40, 72,131, 62, 0, 15,132,167, 0, 0, 0, 72,141, +/* 0x01f0 */ 116, 36, 16,186, 12, 0, 0, 0, 72,137,223,232,160,255,255,255, +/* 0x0200 */ 139, 84, 36, 16,139, 68, 36, 20,133,210,117, 15, 61, 85, 80, 88, +/* 0x0210 */ 33,117, 12, 72,131, 59, 0,116,124,235, 4,133,192,117, 10,191, +/* 0x0220 */ 127, 0, 0, 0,232, 0, 0, 0, 0, 57,208,119,242,137,209, 72, +/* 0x0230 */ 59, 77, 0,119,234, 57,208, 72,139,117, 8,115, 51, 72,139,123, +/* 0x0240 */ 8, 72,141, 84, 36, 8, 72,137, 76, 36, 8, 72,131,239, 12,232, +/* 0x0250 */ 0, 0, 0, 0,133,192,117,199,139, 68, 36, 16, 72, 57, 68, 36, +/* 0x0260 */ 8,117,188,139, 68, 36, 20, 72, 1, 67, 8, 72, 41, 3,235, 10, +/* 0x0270 */ 137,194, 72,137,223,232, 38,255,255,255,139, 84, 36, 16, 72,139, +/* 0x0280 */ 69, 0, 72, 1, 85, 8, 72, 41,208, 72,133,192, 72,137, 69, 0, +/* 0x0290 */ 233, 83,255,255,255, 72,131,196, 40, 91, 93,195, 72,133,255, 65, +/* 0x02a0 */ 80,116, 80, 64,246,199, 1,117, 74, 69, 49,192, 49,201, 72,139, +/* 0x02b0 */ 7, 65,137,241, 76, 57,200,117, 8,255,193, 72,137, 87, 8,235, +/* 0x02c0 */ 11, 72,131,248, 1,117, 5, 73,137,248,235, 33, 72,133,192,117, +/* 0x02d0 */ 28,133,201,117, 30, 77,133,192,116, 9, 77,137, 8, 73,137, 80, +/* 0x02e0 */ 8,235, 16,191,127, 0, 0, 0,232, 0, 0, 0, 0, 72,131,199, +/* 0x02f0 */ 16,235,187, 94,195, 65, 84, 65,137,248, 73,137,244,252, 83,137, +/* 0x0300 */ 211, 69, 49,201, 72,137,217,186, 3, 0, 0, 0, 72,129,236, 8, +/* 0x0310 */ 16, 0, 0, 72,137,231,243,164, 68,137,198, 76,137,231, 65,131, +/* 0x0320 */ 200,255,177, 50,232, 0, 0, 0, 0, 72,137,230, 76,137,231, 72, +/* 0x0330 */ 137,217,252,243,164, 72,129,196, 8, 16, 0, 0, 91, 65, 92,195, +/* 0x0340 */ 65, 87, 65, 86, 73,137,254, 65, 85, 65, 84, 85, 83, 72,131,236, +/* 0x0350 */ 120, 76, 3,119, 32, 72,133,246,137, 84, 36, 68, 72,137, 76, 36, +/* 0x0360 */ 56, 72,199, 68, 36, 88, 0, 0, 0, 0, 72,137,124, 36, 80, 72, +/* 0x0370 */ 137,116, 36, 72, 76,137, 68, 36, 48, 72,199, 68, 36, 40, 0, 0, +/* 0x0380 */ 0, 0, 73,139, 16, 15,183, 79, 16,116, 54, 72,137,215, 72, 43, +/* 0x0390 */ 186,136, 0, 0, 0,102,131,249, 2, 72,141, 66, 64,117, 6, 72, +/* 0x03a0 */ 139,120, 16,235, 5, 72,137,124, 36, 40, 72,139,112, 40, 72,141, +/* 0x03b0 */ 4, 62, 72,137, 68, 36, 88,232, 0, 0, 0, 0,233,177, 0, 0, +/* 0x03c0 */ 0,102,131,249, 3,184, 0, 0, 0, 0,189, 16, 0, 0, 0, 15, +/* 0x03d0 */ 68,232, 72,139, 68, 36, 80, 76,137,246, 73,137,215, 73,131,204, +/* 0x03e0 */ 255, 49,219, 69, 49,237,131,197, 34, 15,183, 72, 56,255,201,120, +/* 0x03f0 */ 33,131, 62, 1,117, 22, 72,139, 70, 16, 76, 57,224, 76, 15, 66, +/* 0x0400 */ 224, 72, 3, 70, 40, 72, 57,195, 72, 15, 66,216, 72,131,198, 56, +/* 0x0410 */ 235,219,232, 0, 0, 0, 0, 73, 33,196, 76, 41,227, 72, 41,195, +/* 0x0420 */ 72,141, 83,255, 72,137,195, 72, 33,211, 64,246,197, 16,116, 5, +/* 0x0430 */ 77,137,229,235, 19, 77,133,228,117, 14,137,232, 77,137,253,131, +/* 0x0440 */ 200, 16, 77,133,255, 15, 69,232, 76,137,239, 69, 49,201, 65,131, +/* 0x0450 */ 200,255,137,233, 49,210, 72,137,222,232, 0, 0, 0, 0, 73,137, +/* 0x0460 */ 197, 72,141, 4, 3, 77, 41,229, 72,137, 68, 36, 88, 76,137,108, +/* 0x0470 */ 36, 40,232, 0, 0, 0, 0, 72,139, 84, 36, 80, 72,137, 68, 36, +/* 0x0480 */ 32,199, 68, 36, 28, 0, 0, 0, 0,102,131,122, 56, 0, 15,132, +/* 0x0490 */ 85, 3, 0, 0, 72,131,124, 36, 72, 0,116, 35, 65,131, 62, 6, +/* 0x04a0 */ 117, 29, 72,139, 84, 36, 40, 73, 3, 86, 16,190, 3, 0, 0, 0, +/* 0x04b0 */ 72,139,124, 36, 56,232,226,253,255,255,233, 15, 3, 0, 0, 65, +/* 0x04c0 */ 131, 62, 1, 15,133, 5, 3, 0, 0, 73,131,126, 40, 0, 15,132, +/* 0x04d0 */ 250, 2, 0, 0, 65,139, 78, 4,199, 68, 36, 24, 64, 98, 81,115, +/* 0x04e0 */ 131,225, 7,193,225, 2,211,108, 36, 24,131,100, 36, 24, 7, 72, +/* 0x04f0 */ 131,124, 36, 72, 0,116, 90, 73,131,126, 8, 0,117, 83, 72,139, +/* 0x0500 */ 68, 36, 80, 72,139, 84, 36, 40,190, 3, 0, 0, 0, 73, 3, 86, +/* 0x0510 */ 16, 72,139,124, 36, 56, 72, 3, 80, 32,232,125,253,255,255, 72, +/* 0x0520 */ 139, 68, 36, 80, 72,139,124, 36, 56,190, 5, 0, 0, 0, 72, 15, +/* 0x0530 */ 183, 80, 56,232,100,253,255,255, 72,139, 68, 36, 80, 72,139,124, +/* 0x0540 */ 36, 56,190, 4, 0, 0, 0, 72, 15,183, 80, 54,232, 75,253,255, +/* 0x0550 */ 255, 72,139,124, 36, 40, 72,139, 92, 36, 32, 73, 3,126, 16, 73, +/* 0x0560 */ 139,118, 32, 73,139, 86, 40,199, 68, 36, 12, 0, 0, 0, 0, 72, +/* 0x0570 */ 247,211, 73,137,245, 72,137,116, 36, 96, 72, 33,251, 73,137,252, +/* 0x0580 */ 72, 1,250, 73, 1,221, 73, 41,220, 72,131,124, 36, 72, 0, 72, +/* 0x0590 */ 137,124, 36,104, 72,137, 84, 36, 16, 76,141, 60, 55, 15,132,129, +/* 0x05a0 */ 0, 0, 0, 65,246, 70, 4, 1,116, 71, 49,246,232, 4, 0, 0, +/* 0x05b0 */ 0,117,112,120, 0, 95,232, 0, 0, 0, 0, 76,137,238,137,199, +/* 0x05c0 */ 137, 68, 36, 12,232, 0, 0, 0, 0, 72,133,219,116, 15,139,124, +/* 0x05d0 */ 36, 12, 72,137,218, 76,137,230,232, 0, 0, 0, 0, 68,139, 68, +/* 0x05e0 */ 36, 12, 69, 49,201,185, 17, 0, 0, 0,186, 3, 0, 0, 0,235, +/* 0x05f0 */ 30, 72,131,124, 36, 72, 0,116, 43,139, 84, 36, 24, 69, 49,201, +/* 0x0600 */ 65,131,200,255,185, 50, 0, 0, 0,131,202, 2,131,226,251, 76, +/* 0x0610 */ 137,238, 76,137,231,232, 0, 0, 0, 0, 73, 57,196,116, 48,233, +/* 0x0620 */ 114, 1, 0, 0, 77,139, 78, 8, 68,139, 68, 36, 68,185, 18, 0, +/* 0x0630 */ 0, 0,139, 84, 36, 24, 76,137,238, 76,137,231, 73, 41,217,232, +/* 0x0640 */ 0, 0, 0, 0, 73, 57,196, 15,133, 73, 1, 0, 0,235, 23, 72, +/* 0x0650 */ 131,124, 36, 72, 0,116, 15, 72,139,124, 36, 72, 72,141,116, 36, +/* 0x0660 */ 96,232,114,251,255,255,246, 68, 36, 24, 2,116, 24,139, 68, 36, +/* 0x0670 */ 32, 68,137,249, 76,137,255,247,217,252,247,208, 33,193, 49,192, +/* 0x0680 */ 243,170, 73,137,255, 72,131,124, 36, 72, 0, 15,132,235, 0, 0, +/* 0x0690 */ 0, 65,246, 70, 4, 1, 15,132,224, 0, 0, 0, 72,184,255,255, +/* 0x06a0 */ 255,255, 1, 0, 0, 0, 73, 35, 6,139, 76, 36, 32, 72,186, 1, +/* 0x06b0 */ 0, 0, 0, 1, 0, 0, 0, 72,139,108, 36,104,247,209, 72, 57, +/* 0x06c0 */ 208,117,106, 72,137,232, 72,247,216, 33,200, 72,131,248, 3,126, +/* 0x06d0 */ 12, 65,185, 15, 5, 90,195, 76,137, 77, 0,235, 80, 49,246,232, +/* 0x06e0 */ 4, 0, 0, 0,117,112,120, 0, 95,232, 0, 0, 0, 0,186, 4, +/* 0x06f0 */ 0, 0, 0,137,195,137,199,232, 5, 0, 0, 0, 15, 5, 90,195, +/* 0x0700 */ 0, 94,232, 0, 0, 0, 0, 49,255, 69, 49,201, 65,137,216,185, +/* 0x0710 */ 1, 0, 0, 0,186, 5, 0, 0, 0,190, 4, 0, 0, 0,232, 0, +/* 0x0720 */ 0, 0, 0,137,223, 72,137,197,232, 0, 0, 0, 0, 72,133,237, +/* 0x0730 */ 116, 19, 72,139,124, 36, 56, 72,137,234, 49,246, 72,131,231,254, +/* 0x0740 */ 232, 87,251,255,255, 76,137,238, 76,137,231,232, 0, 0, 0, 0, +/* 0x0750 */ 68,139, 68, 36, 12,139, 84, 36, 24, 69, 49,201,185, 17, 0, 0, +/* 0x0760 */ 0, 76,137,238, 76,137,231,232, 0, 0, 0, 0, 73, 57,196,117, +/* 0x0770 */ 37,139,124, 36, 12,232, 0, 0, 0, 0,235, 36,131,124, 36, 24, +/* 0x0780 */ 3,116, 29,139, 84, 36, 24, 76,137,238, 76,137,231,232, 0, 0, +/* 0x0790 */ 0, 0,133,192,116, 10,191,127, 0, 0, 0,232, 0, 0, 0, 0, +/* 0x07a0 */ 76, 59,124, 36, 16,115, 39, 76, 41,124, 36, 16,139, 84, 36, 24, +/* 0x07b0 */ 69, 49,201, 72,139,116, 36, 16, 65,131,200,255,185, 50, 0, 0, +/* 0x07c0 */ 0, 76,137,255,232, 0, 0, 0, 0, 73, 57,199,117,200, 72,139, +/* 0x07d0 */ 84, 36, 80,255, 68, 36, 28, 73,131,198, 56, 15,183, 66, 56, 57, +/* 0x07e0 */ 68, 36, 28, 15,140,171,252,255,255, 72,139, 84, 36, 40, 72,139, +/* 0x07f0 */ 68, 36, 48, 72,137, 16, 72,139, 68, 36, 80, 72,139, 64, 24, 72, +/* 0x0800 */ 131,196,120, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95, 72, 1,194, +/* 0x0810 */ 72,137,208,195, 65, 87, 65, 86, 73,137,206, 65, 85, 65, 84, 73, +/* 0x0820 */ 137,212, 77,141,108, 36, 64, 85, 83, 72,131,236, 72,139, 7, 72, +/* 0x0830 */ 137,124, 36, 24, 72,137,124, 36, 40, 76,141,124, 36, 8, 72,137, +/* 0x0840 */ 116, 36, 32, 72,141,116, 36, 48, 76,137, 68, 36, 8, 72,137, 84, +/* 0x0850 */ 36, 56, 72,137, 68, 36, 48,139, 71, 4, 72,141,124, 36, 16, 72, +/* 0x0860 */ 131,192, 12, 72,137, 68, 36, 16,232,107,249,255,255,232, 0, 0, +/* 0x0870 */ 0, 0, 72,141,116, 36, 32, 49,210, 77,137,248, 76,137,241, 76, +/* 0x0880 */ 137,231,232,185,250,255,255,190, 9, 0, 0, 0, 72,137,194, 76, +/* 0x0890 */ 137,247, 72,137,197,232, 2,250,255,255,102, 65,131,124, 36, 56, +/* 0x08a0 */ 0,199, 68, 36, 4, 0, 0, 0, 0, 15,132,136, 0, 0, 0, 65, +/* 0x08b0 */ 131,125, 0, 3,117,105, 73,139, 63, 73, 3,125, 16, 49,210, 49, +/* 0x08c0 */ 246,232, 0, 0, 0, 0,133,192,137,195,120, 23,186, 0, 4, 0, +/* 0x08d0 */ 0, 76,137,230,137,199,232, 0, 0, 0, 0, 72, 61, 0, 4, 0, +/* 0x08e0 */ 0,116, 10,191,127, 0, 0, 0,232, 0, 0, 0, 0, 77,137,248, +/* 0x08f0 */ 49,201,137,218, 49,246, 76,137,231, 73,199, 7, 0, 0, 0, 0, +/* 0x0900 */ 232, 59,250,255,255, 73,139, 23, 76,137,247,190, 7, 0, 0, 0, +/* 0x0910 */ 72,137,197,232,132,249,255,255,137,223,232, 0, 0, 0, 0,255, +/* 0x0920 */ 68, 36, 4, 65, 15,183, 68, 36, 56, 73,131,197, 56, 57, 68, 36, +/* 0x0930 */ 4, 15,130,120,255,255,255, 72,131,196, 72, 72,137,232, 91, 93, +/* 0x0940 */ 65, 92, 65, 93, 65, 94, 65, 95,195, 85, 72,137,229, 83, 82, 86, +/* 0x0950 */ 87,232,101, 0, 0, 0, 91, 95, 94, 80, 15,182, 75, 9,133,201, +/* 0x0960 */ 116, 11, 15,182, 83, 10,139, 54,232, 4, 0, 0, 0, 88, 91, 93, +/* 0x0970 */ 195,131,249, 73,117, 68, 83, 87, 72,141, 76, 55,253, 94, 86, 91, +/* 0x0980 */ 235, 47, 72, 57,206,115, 50, 86, 94,172, 60,128,114, 10, 60,143, +/* 0x0990 */ 119, 6,128,126,254, 15,116, 6, 44,232, 60, 1,119,228, 72, 57, +/* 0x09a0 */ 206,115, 22, 86,173, 40,208,117,223, 95, 15,200, 41,248, 1,216, +/* 0x09b0 */ 171, 72, 57,206,115, 3,172,235,223, 91,195, 82, 15,182, 87, 8, +/* 0x09c0 */ 87, 86, 95, 94,139, 70, 4, 72,131,198, 12, 72, 1,240, 80, 87, +/* 0x09d0 */ 49,219, 49,201, 72,131,205,255,235, 78,139, 30, 72,131,238,252, +/* 0x09e0 */ 17,219,138, 22,243,195, 1,219,116,240,243,195, 72,141, 4, 47, +/* 0x09f0 */ 131,249, 5,138, 16,118, 32,131,253,252,119, 27,131,233, 4,139, +/* 0x0a00 */ 16, 72,131,192, 4,131,233, 4,137, 23, 72,141,127, 4,115,239, +/* 0x0a10 */ 131,193, 4,138, 16,116, 15, 72,255,192,136, 23,255,201,138, 16, +/* 0x0a20 */ 72,141,127, 1,117,241,243,195,252,128,250, 8, 15,133,218, 0, +/* 0x0a30 */ 0, 0,235, 8, 72,255,198,136, 23, 72,255,199,138, 22, 1,219, +/* 0x0a40 */ 117, 10,139, 30, 72,131,238,252, 17,219,138, 22,114,230,141, 65, +/* 0x0a50 */ 1,235, 18,255,200, 1,219,117, 10,139, 30, 72,131,238,252, 17, +/* 0x0a60 */ 219,138, 22, 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17, +/* 0x0a70 */ 219,138, 22, 17,192, 1,219,117, 10,139, 30, 72,131,238,252, 17, +/* 0x0a80 */ 219,138, 22,115,206,131,232, 3,114, 29,193,224, 8, 15,182,210, +/* 0x0a90 */ 9,208, 72,255,198,131,240,255, 15,132, 0, 0, 0, 0,209,248, +/* 0x0aa0 */ 72, 99,232,114, 67,235, 14, 1,219,117, 8,139, 30, 72,131,238, +/* 0x0ab0 */ 252, 17,219,114, 51,255,193, 1,219,117, 8,139, 30, 72,131,238, +/* 0x0ac0 */ 252, 17,219,114, 35, 1,219,117, 10,139, 30, 72,131,238,252, 17, +/* 0x0ad0 */ 219,138, 22, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17, +/* 0x0ae0 */ 219,115,226,131,193, 2,235, 16, 1,219,117, 10,139, 30, 72,131, +/* 0x0af0 */ 238,252, 17,219,138, 22, 17,201, 72,129,253, 0,251,255,255,131, +/* 0x0b00 */ 209, 2,232, 0, 0, 0, 0,233, 48,255,255,255, 87, 94,128,250, +/* 0x0b10 */ 5, 15,133,204, 0, 0, 0,235, 8, 72,255,198,136, 23, 72,255, +/* 0x0b20 */ 199,138, 22, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, +/* 0x0b30 */ 22,114,230,141, 65, 1,235, 18,255,200, 1,219,117, 10,139, 30, +/* 0x0b40 */ 72,131,238,252, 17,219,138, 22, 17,192, 1,219,117, 10,139, 30, +/* 0x0b50 */ 72,131,238,252, 17,219,138, 22, 17,192, 1,219,117, 10,139, 30, +/* 0x0b60 */ 72,131,238,252, 17,219,138, 22,115,206,131,232, 3,114, 27,193, +/* 0x0b70 */ 224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, 15,132, 0, +/* 0x0b80 */ 0, 0, 0,209,248, 72, 99,232,235, 14, 1,219,117, 10,139, 30, +/* 0x0b90 */ 72,131,238,252, 17,219,138, 22, 17,201, 1,219,117, 10,139, 30, +/* 0x0ba0 */ 72,131,238,252, 17,219,138, 22, 17,201,117, 35,255,193, 1,219, +/* 0x0bb0 */ 117, 10,139, 30, 72,131,238,252, 17,219,138, 22, 17,201, 1,219, +/* 0x0bc0 */ 117, 8,139, 30, 72,131,238,252, 17,219,115,226,131,193, 2, 72, +/* 0x0bd0 */ 129,253, 0,251,255,255,131,209, 1,232, 0, 0, 0, 0,233, 62, +/* 0x0be0 */ 255,255,255, 87, 94,128,250, 2, 15,133,182, 0, 0, 0,235, 8, +/* 0x0bf0 */ 72,255,198,136, 23, 72,255,199,138, 22, 1,219,117, 10,139, 30, +/* 0x0c00 */ 72,131,238,252, 17,219,138, 22,114,230,141, 65, 1, 1,219,117, +/* 0x0c10 */ 10,139, 30, 72,131,238,252, 17,219,138, 22, 17,192, 1,219,117, +/* 0x0c20 */ 10,139, 30, 72,131,238,252, 17,219,138, 22,115,224,131,232, 3, +/* 0x0c30 */ 114, 23,193,224, 8, 15,182,210, 9,208, 72,255,198,131,240,255, +/* 0x0c40 */ 15,132, 0, 0, 0, 0, 72, 99,232,141, 65, 1, 1,219,117, 10, +/* 0x0c50 */ 139, 30, 72,131,238,252, 17,219,138, 22, 17,201, 1,219,117, 10, +/* 0x0c60 */ 139, 30, 72,131,238,252, 17,219,138, 22, 17,201,117, 35,137,193, +/* 0x0c70 */ 131,192, 2, 1,219,117, 10,139, 30, 72,131,238,252, 17,219,138, +/* 0x0c80 */ 22, 17,201, 1,219,117, 8,139, 30, 72,131,238,252, 17,219,115, +/* 0x0c90 */ 226, 72,129,253, 0,243,255,255, 17,193,232, 0, 0, 0, 0,233, +/* 0x0ca0 */ 84,255,255,255, 87, 94,204,195, 47,112,114,111, 99, 47,115,101, +/* 0x0cb0 */ 108,102, 47,101,120,101, 0,184, 63, 1, 0, 0,235, 26, 72,139, +/* 0x0cc0 */ 5, 0, 0, 0, 0, 72,247,208, 33,248, 72, 41,199, 72, 1,198, +/* 0x0cd0 */ 176, 9, 73,137,202, 15,182,192, 80, 15, 5, 89, 72, 61, 0,240, +/* 0x0ce0 */ 255,255,114, 6,131,249, 2,116, 1,204,195,139, 5, 0, 0, 0, +/* 0x0cf0 */ 0,247,208, 33,248, 72, 41,199, 72, 1,198,233, 0, 0, 0, 0, +/* 0x0d00 */ 139, 5, 0, 0, 0, 0,247,208, 33,248, 72, 41,199, 72, 1,198, +/* 0x0d10 */ 176, 11,235, 2,176, 60,235, 2,176, 12,235, 2,176, 3,235, 2, +/* 0x0d20 */ 176, 77,235, 2,176, 2,235, 2,176, 10,235, 2,176, 1,235, 2, +/* 0x0d30 */ 176, 0,235,161, 65,128,248, 14, 15,133, 0, 0, 0, 0, 85, 72, +/* 0x0d40 */ 137,229, 68,139, 9, 73,137,208, 72,137,242, 72,141,119, 2, 86, +/* 0x0d50 */ 138, 7,255,202,136,193, 36, 7,192,233, 3, 72,199,195, 0,253, +/* 0x0d60 */ 255,255, 72,211,227,136,193, 72,141,156, 92,136,241,255,255, 72, +/* 0x0d70 */ 131,227,192,106, 0, 72, 57,220,117,249, 83, 72,141,123, 8,138, +/* 0x0d80 */ 78,255,255,202,136, 71, 2,136,200,192,233, 4,136, 79, 1, 36, +/* 0x0d90 */ 15,136, 7, 72,141, 79,252, 80, 65, 87, 72,141, 71, 4, 69, 49, +/* 0x0da0 */ 255, 65, 86, 65,190, 1, 0, 0, 0, 65, 85, 69, 49,237, 65, 84, +/* 0x0db0 */ 85, 83, 72,137, 76, 36,240, 72,137, 68, 36,216,184, 1, 0, 0, +/* 0x0dc0 */ 0, 72,137,116, 36,248, 76,137, 68, 36,232,137,195, 68,137, 76, +/* 0x0dd0 */ 36,228, 15,182, 79, 2,211,227,137,217, 72,139, 92, 36, 56,255, +/* 0x0de0 */ 201,137, 76, 36,212, 15,182, 79, 1,211,224, 72,139, 76, 36,240, +/* 0x0df0 */ 255,200,137, 68, 36,208, 15,182, 7,199, 1, 0, 0, 0, 0,199, +/* 0x0e00 */ 68, 36,200, 0, 0, 0, 0,199, 68, 36,196, 1, 0, 0, 0,199, +/* 0x0e10 */ 68, 36,192, 1, 0, 0, 0,199, 68, 36,188, 1, 0, 0, 0,199, +/* 0x0e20 */ 3, 0, 0, 0, 0,137, 68, 36,204, 15,182, 79, 1, 1,193,184, +/* 0x0e30 */ 0, 3, 0, 0,211,224, 49,201,141,184, 54, 7, 0, 0, 65, 57, +/* 0x0e40 */ 255,115, 19, 72,139, 92, 36,216,137,200,255,193, 57,249,102,199, +/* 0x0e50 */ 4, 67, 0, 4,235,235, 72,139,124, 36,248,137,208, 69, 49,210, +/* 0x0e60 */ 65,131,203,255, 49,210, 73,137,252, 73, 1,196, 76, 57,231, 15, +/* 0x0e70 */ 132,239, 8, 0, 0, 15,182, 7, 65,193,226, 8,255,194, 72,255, +/* 0x0e80 */ 199, 65, 9,194,131,250, 4,126,227, 68, 59,124, 36,228, 15,131, +/* 0x0e90 */ 218, 8, 0, 0,139, 68, 36,212, 72, 99, 92, 36,200, 72,139, 84, +/* 0x0ea0 */ 36,216, 68, 33,248,137, 68, 36,184, 72, 99,108, 36,184, 72,137, +/* 0x0eb0 */ 216, 72,193,224, 4, 72, 1,232, 65,129,251,255,255,255, 0, 76, +/* 0x0ec0 */ 141, 12, 66,119, 26, 76, 57,231, 15,132,150, 8, 0, 0, 15,182, +/* 0x0ed0 */ 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, +/* 0x0ee0 */ 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, +/* 0x0ef0 */ 57,194, 15,131,197, 1, 0, 0, 65,137,195,184, 0, 8, 0, 0, +/* 0x0f00 */ 72,139, 92, 36,216, 41,200, 15,182, 76, 36,204,190, 1, 0, 0, +/* 0x0f10 */ 0,193,248, 5,141, 4, 2, 65, 15,182,213,102, 65,137, 1,139, +/* 0x0f20 */ 68, 36,208, 68, 33,248,211,224,185, 8, 0, 0, 0, 43, 76, 36, +/* 0x0f30 */ 204,211,250, 1,208,105,192, 0, 3, 0, 0,131,124, 36,200, 6, +/* 0x0f40 */ 137,192, 76,141,140, 67,108, 14, 0, 0, 15,142,184, 0, 0, 0, +/* 0x0f50 */ 72,139, 84, 36,232, 68,137,248, 68, 41,240, 15,182, 44, 2, 1, +/* 0x0f60 */ 237, 72, 99,214,137,235,129,227, 0, 1, 0, 0, 65,129,251,255, +/* 0x0f70 */ 255,255, 0, 72, 99,195, 73,141, 4, 65, 76,141, 4, 80,119, 26, +/* 0x0f80 */ 76, 57,231, 15,132,219, 7, 0, 0, 15,182, 7, 65,193,226, 8, +/* 0x0f90 */ 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183,144, 0, 2, +/* 0x0fa0 */ 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57, +/* 0x0fb0 */ 194,115, 32, 65,137,195,184, 0, 8, 0, 0, 1,246, 41,200,193, +/* 0x0fc0 */ 248, 5,133,219,141, 4, 2,102, 65,137,128, 0, 2, 0, 0,116, +/* 0x0fd0 */ 33,235, 45, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141, +/* 0x0fe0 */ 116, 54, 1,102, 41,194,133,219,102, 65,137,144, 0, 2, 0, 0, +/* 0x0ff0 */ 116, 14,129,254,255, 0, 0, 0, 15,142, 97,255,255,255,235,120, +/* 0x1000 */ 129,254,255, 0, 0, 0,127,112, 72, 99,198, 65,129,251,255,255, +/* 0x1010 */ 255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132, 67, 7, 0, +/* 0x1020 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, +/* 0x1030 */ 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183,202, 15, +/* 0x1040 */ 175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, 0, 1, +/* 0x1050 */ 246, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235,161, 65, +/* 0x1060 */ 41,195, 65, 41,194,137,208,102,193,232, 5,141,116, 54, 1,102, +/* 0x1070 */ 41,194,102, 65,137, 16,235,136, 72,139, 76, 36,232, 68,137,248, +/* 0x1080 */ 65,255,199, 65,137,245, 64,136, 52, 1,131,124, 36,200, 3,127, +/* 0x1090 */ 13,199, 68, 36,200, 0, 0, 0, 0,233,166, 6, 0, 0,139, 84, +/* 0x10a0 */ 36,200,139, 68, 36,200,131,234, 3,131,232, 6,131,124, 36,200, +/* 0x10b0 */ 9, 15, 79,208,137, 84, 36,200,233,135, 6, 0, 0, 65, 41,195, +/* 0x10c0 */ 65, 41,194,137,208,102,193,232, 5,102, 41,194, 72,139, 68, 36, +/* 0x10d0 */ 216, 65,129,251,255,255,255, 0,102, 65,137, 17, 72,141, 52, 88, +/* 0x10e0 */ 119, 26, 76, 57,231, 15,132,121, 6, 0, 0, 15,182, 7, 65,193, +/* 0x10f0 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,128, +/* 0x1100 */ 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, +/* 0x1110 */ 57,194,115, 78, 65,137,195,184, 0, 8, 0, 0, 76,139, 76, 36, +/* 0x1120 */ 216, 41,200,139, 76, 36,196, 68,137,116, 36,196,193,248, 5,141, +/* 0x1130 */ 4, 2,139, 84, 36,192,137, 76, 36,192,102,137,134,128, 1, 0, +/* 0x1140 */ 0, 49,192,131,124, 36,200, 6,137, 84, 36,188, 15,159,192, 73, +/* 0x1150 */ 129,193,100, 6, 0, 0,141, 4, 64,137, 68, 36,200,233, 84, 2, +/* 0x1160 */ 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41, +/* 0x1170 */ 194, 65,129,251,255,255,255, 0,102,137,150,128, 1, 0, 0,119, +/* 0x1180 */ 26, 76, 57,231, 15,132,218, 5, 0, 0, 15,182, 7, 65,193,226, +/* 0x1190 */ 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,152, 1, +/* 0x11a0 */ 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57, +/* 0x11b0 */ 194, 15,131,208, 0, 0, 0, 65,184, 0, 8, 0, 0, 65,137,195, +/* 0x11c0 */ 72,193,227, 5, 68,137,192, 41,200,193,248, 5,141, 4, 2,102, +/* 0x11d0 */ 137,134,152, 1, 0, 0, 72,139, 68, 36,216, 72, 1,216, 65,129, +/* 0x11e0 */ 251,255,255,255, 0, 72,141, 52,104,119, 26, 76, 57,231, 15,132, +/* 0x11f0 */ 112, 5, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, +/* 0x1200 */ 255,199, 65, 9,194, 15,183,150,224, 1, 0, 0, 68,137,216,193, +/* 0x1210 */ 232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 79, 65, 41,200, +/* 0x1220 */ 65,137,195, 65,193,248, 5, 69,133,255, 66,141, 4, 2,102,137, +/* 0x1230 */ 134,224, 1, 0, 0, 15,132, 41, 5, 0, 0, 49,192,131,124, 36, +/* 0x1240 */ 200, 6, 72,139, 92, 36,232, 15,159,192,141, 68, 0, 9,137, 68, +/* 0x1250 */ 36,200, 68,137,248, 68, 41,240, 68, 15,182, 44, 3, 68,137,248, +/* 0x1260 */ 65,255,199, 68,136, 44, 3,233,216, 4, 0, 0, 65, 41,195, 65, +/* 0x1270 */ 41,194,137,208,102,193,232, 5,102, 41,194,102,137,150,224, 1, +/* 0x1280 */ 0, 0,233, 17, 1, 0, 0, 65, 41,195, 65, 41,194,137,208,102, +/* 0x1290 */ 193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102,137,150, +/* 0x12a0 */ 152, 1, 0, 0,119, 26, 76, 57,231, 15,132,181, 4, 0, 0, 15, +/* 0x12b0 */ 182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, +/* 0x12c0 */ 15,183,150,176, 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, +/* 0x12d0 */ 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, 8, 0, 0, +/* 0x12e0 */ 41,200,193,248, 5,141, 4, 2,102,137,134,176, 1, 0, 0,139, +/* 0x12f0 */ 68, 36,196,233,152, 0, 0, 0, 65, 41,195, 65, 41,194,137,208, +/* 0x1300 */ 102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102,137, +/* 0x1310 */ 150,176, 1, 0, 0,119, 26, 76, 57,231, 15,132, 68, 4, 0, 0, +/* 0x1320 */ 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, +/* 0x1330 */ 194, 15,183,150,200, 1, 0, 0, 68,137,216,193,232, 11, 15,183, +/* 0x1340 */ 202, 15,175,193, 65, 57,194,115, 29, 65,137,195,184, 0, 8, 0, +/* 0x1350 */ 0, 41,200,193,248, 5,141, 4, 2,102,137,134,200, 1, 0, 0, +/* 0x1360 */ 139, 68, 36,192,235, 34, 65, 41,195, 65, 41,194,137,208,102,193, +/* 0x1370 */ 232, 5,102, 41,194,139, 68, 36,188,102,137,150,200, 1, 0, 0, +/* 0x1380 */ 139, 84, 36,192,137, 84, 36,188,139, 76, 36,196,137, 76, 36,192, +/* 0x1390 */ 68,137,116, 36,196, 65,137,198, 49,192,131,124, 36,200, 6, 76, +/* 0x13a0 */ 139, 76, 36,216, 15,159,192, 73,129,193,104, 10, 0, 0,141, 68, +/* 0x13b0 */ 64, 8,137, 68, 36,200, 65,129,251,255,255,255, 0,119, 26, 76, +/* 0x13c0 */ 57,231, 15,132,156, 3, 0, 0, 15,182, 7, 65,193,226, 8, 65, +/* 0x13d0 */ 193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137,216, +/* 0x13e0 */ 193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 39, 65,137, +/* 0x13f0 */ 195,184, 0, 8, 0, 0, 69, 49,237, 41,200,193,248, 5,141, 4, +/* 0x1400 */ 2,102, 65,137, 1, 72, 99, 68, 36,184, 72,193,224, 4, 77,141, +/* 0x1410 */ 68, 1, 4,235,120, 65, 41,195, 65, 41,194,137,208,102,193,232, +/* 0x1420 */ 5,102, 41,194, 65,129,251,255,255,255, 0,102, 65,137, 17,119, +/* 0x1430 */ 26, 76, 57,231, 15,132, 42, 3, 0, 0, 15,182, 7, 65,193,226, +/* 0x1440 */ 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 81, 2, +/* 0x1450 */ 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, +/* 0x1460 */ 52, 65,137,195,184, 0, 8, 0, 0, 65,189, 8, 0, 0, 0, 41, +/* 0x1470 */ 200,193,248, 5,141, 4, 2,102, 65,137, 65, 2, 72, 99, 68, 36, +/* 0x1480 */ 184, 72,193,224, 4, 77,141,132, 1, 4, 1, 0, 0, 65,185, 3, +/* 0x1490 */ 0, 0, 0,235, 39, 65, 41,195, 65, 41,194,137,208,102,193,232, +/* 0x14a0 */ 5, 77,141,129, 4, 2, 0, 0, 65,189, 16, 0, 0, 0,102, 41, +/* 0x14b0 */ 194,102, 65,137, 81, 2, 65,185, 8, 0, 0, 0, 68,137,203,189, +/* 0x14c0 */ 1, 0, 0, 0, 72, 99,197, 65,129,251,255,255,255, 0, 73,141, +/* 0x14d0 */ 52, 64,119, 26, 76, 57,231, 15,132,135, 2, 0, 0, 15,182, 7, +/* 0x14e0 */ 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, +/* 0x14f0 */ 14, 68,137,216,193,232, 11, 15,183,209, 15,175,194, 65, 57,194, +/* 0x1500 */ 115, 23, 65,137,195,184, 0, 8, 0, 0, 1,237, 41,208,193,248, +/* 0x1510 */ 5,141, 4, 1,102,137, 6,235, 22, 65, 41,195, 65, 41,194,137, +/* 0x1520 */ 200,102,193,232, 5,141,108, 45, 1,102, 41,193,102,137, 14,255, +/* 0x1530 */ 203,117,145,184, 1, 0, 0, 0, 68,137,201,211,224, 41,197, 68, +/* 0x1540 */ 1,237,131,124, 36,200, 3, 15,143,194, 1, 0, 0,131, 68, 36, +/* 0x1550 */ 200, 7,184, 3, 0, 0, 0,131,253, 4, 15, 76,197, 72,139, 92, +/* 0x1560 */ 36,216, 65,184, 1, 0, 0, 0, 72,152, 72,193,224, 7, 76,141, +/* 0x1570 */ 140, 3, 96, 3, 0, 0,187, 6, 0, 0, 0, 73, 99,192, 65,129, +/* 0x1580 */ 251,255,255,255, 0, 73,141, 52, 65,119, 26, 76, 57,231, 15,132, +/* 0x1590 */ 208, 1, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, +/* 0x15a0 */ 255,199, 65, 9,194, 15,183, 22, 68,137,216,193,232, 11, 15,183, +/* 0x15b0 */ 202, 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, +/* 0x15c0 */ 0, 69, 1,192, 41,200,193,248, 5,141, 4, 2,102,137, 6,235, +/* 0x15d0 */ 23, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, 71,141, 68, +/* 0x15e0 */ 0, 1,102, 41,194,102,137, 22,255,203,117,143, 65,131,232, 64, +/* 0x15f0 */ 65,131,248, 3, 69,137,198, 15,142, 13, 1, 0, 0, 65,131,230, +/* 0x1600 */ 1, 68,137,192,209,248, 65,131,206, 2, 65,131,248, 13,141,112, +/* 0x1610 */ 255,127, 35,137,241, 72,139, 92, 36,216, 73, 99,192, 65,211,230, +/* 0x1620 */ 72, 1,192, 68,137,242, 72,141, 20, 83, 72, 41,194, 76,141,138, +/* 0x1630 */ 94, 5, 0, 0,235, 81,141,112,251, 65,129,251,255,255,255, 0, +/* 0x1640 */ 119, 26, 76, 57,231, 15,132, 25, 1, 0, 0, 15,182, 7, 65,193, +/* 0x1650 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65,209,235, 69, +/* 0x1660 */ 1,246, 69, 57,218,114, 7, 69, 41,218, 65,131,206, 1,255,206, +/* 0x1670 */ 117,199, 76,139, 76, 36,216, 65,193,230, 4,190, 4, 0, 0, 0, +/* 0x1680 */ 73,129,193, 68, 6, 0, 0, 65,189, 1, 0, 0, 0,187, 1, 0, +/* 0x1690 */ 0, 0, 72, 99,195, 65,129,251,255,255,255, 0, 77,141, 4, 65, +/* 0x16a0 */ 119, 26, 76, 57,231, 15,132,185, 0, 0, 0, 15,182, 7, 65,193, +/* 0x16b0 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 16, +/* 0x16c0 */ 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, +/* 0x16d0 */ 24, 65,137,195,184, 0, 8, 0, 0, 1,219, 41,200,193,248, 5, +/* 0x16e0 */ 141, 4, 2,102, 65,137, 0,235, 26, 65, 41,195, 65, 41,194,137, +/* 0x16f0 */ 208,102,193,232, 5,141, 92, 27, 1, 69, 9,238,102, 41,194,102, +/* 0x1700 */ 65,137, 16, 69, 1,237,255,206,117,136, 65,255,198,116, 64,131, +/* 0x1710 */ 197, 2, 69, 57,254,119, 77, 72,139, 84, 36,232, 68,137,248, 68, +/* 0x1720 */ 41,240, 68, 15,182, 44, 2, 68,137,248, 65,255,199,255,205, 68, +/* 0x1730 */ 136, 44, 2, 15,149,194, 49,192, 68, 59,124, 36,228, 15,146,192, +/* 0x1740 */ 133,194,117,211, 68, 59,124, 36,228, 15,130, 69,247,255,255, 65, +/* 0x1750 */ 129,251,255,255,255, 0,119, 22, 76, 57,231,184, 1, 0, 0, 0, +/* 0x1760 */ 116, 35,235, 7,184, 1, 0, 0, 0,235, 26, 72,255,199,137,248, +/* 0x1770 */ 43, 68, 36,248, 72,139, 76, 36,240, 72,139, 92, 36, 56,137, 1, +/* 0x1780 */ 68,137, 59, 49,192, 91, 93, 65, 92, 65, 93, 65, 94, 65, 95, 65, +/* 0x1790 */ 87, 72,141, 71, 4, 69, 49,255, 65, 86, 65,190, 1, 0, 0, 0, +/* 0x17a0 */ 65, 85, 69, 49,237, 65, 84, 85, 83, 72,137, 76, 36,240, 72,137, +/* 0x17b0 */ 68, 36,216,184, 1, 0, 0, 0, 72,137,116, 36,248, 76,137, 68, +/* 0x17c0 */ 36,232,137,195, 68,137, 76, 36,228, 15,182, 79, 2,211,227,137, +/* 0x17d0 */ 217, 72,139, 92, 36, 56,255,201,137, 76, 36,212, 15,182, 79, 1, +/* 0x17e0 */ 211,224, 72,139, 76, 36,240,255,200,137, 68, 36,208, 15,182, 7, +/* 0x17f0 */ 199, 1, 0, 0, 0, 0,199, 68, 36,200, 0, 0, 0, 0,199, 68, +/* 0x1800 */ 36,196, 1, 0, 0, 0,199, 68, 36,192, 1, 0, 0, 0,199, 68, +/* 0x1810 */ 36,188, 1, 0, 0, 0,199, 3, 0, 0, 0, 0,137, 68, 36,204, +/* 0x1820 */ 15,182, 79, 1, 1,193,184, 0, 3, 0, 0,211,224, 49,201,141, +/* 0x1830 */ 184, 54, 7, 0, 0, 65, 57,255,115, 19, 72,139, 92, 36,216,137, +/* 0x1840 */ 200,255,193, 57,249,102,199, 4, 67, 0, 4,235,235, 72,139,124, +/* 0x1850 */ 36,248,137,208, 69, 49,210, 65,131,203,255, 49,210, 73,137,252, +/* 0x1860 */ 73, 1,196, 76, 57,231, 15,132,239, 8, 0, 0, 15,182, 7, 65, +/* 0x1870 */ 193,226, 8,255,194, 72,255,199, 65, 9,194,131,250, 4,126,227, +/* 0x1880 */ 68, 59,124, 36,228, 15,131,218, 8, 0, 0,139, 68, 36,212, 72, +/* 0x1890 */ 99, 92, 36,200, 72,139, 84, 36,216, 68, 33,248,137, 68, 36,184, +/* 0x18a0 */ 72, 99,108, 36,184, 72,137,216, 72,193,224, 4, 72, 1,232, 65, +/* 0x18b0 */ 129,251,255,255,255, 0, 76,141, 12, 66,119, 26, 76, 57,231, 15, +/* 0x18c0 */ 132,150, 8, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, +/* 0x18d0 */ 72,255,199, 65, 9,194, 65, 15,183, 17, 68,137,216,193,232, 11, +/* 0x18e0 */ 15,183,202, 15,175,193, 65, 57,194, 15,131,197, 1, 0, 0, 65, +/* 0x18f0 */ 137,195,184, 0, 8, 0, 0, 72,139, 92, 36,216, 41,200, 15,182, +/* 0x1900 */ 76, 36,204,190, 1, 0, 0, 0,193,248, 5,141, 4, 2, 65, 15, +/* 0x1910 */ 182,213,102, 65,137, 1,139, 68, 36,208, 68, 33,248,211,224,185, +/* 0x1920 */ 8, 0, 0, 0, 43, 76, 36,204,211,250, 1,208,105,192, 0, 3, +/* 0x1930 */ 0, 0,131,124, 36,200, 6,137,192, 76,141,140, 67,108, 14, 0, +/* 0x1940 */ 0, 15,142,184, 0, 0, 0, 72,139, 84, 36,232, 68,137,248, 68, +/* 0x1950 */ 41,240, 15,182, 44, 2, 1,237, 72, 99,214,137,235,129,227, 0, +/* 0x1960 */ 1, 0, 0, 65,129,251,255,255,255, 0, 72, 99,195, 73,141, 4, +/* 0x1970 */ 65, 76,141, 4, 80,119, 26, 76, 57,231, 15,132,219, 7, 0, 0, +/* 0x1980 */ 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9, +/* 0x1990 */ 194, 65, 15,183,144, 0, 2, 0, 0, 68,137,216,193,232, 11, 15, +/* 0x19a0 */ 183,202, 15,175,193, 65, 57,194,115, 32, 65,137,195,184, 0, 8, +/* 0x19b0 */ 0, 0, 1,246, 41,200,193,248, 5,133,219,141, 4, 2,102, 65, +/* 0x19c0 */ 137,128, 0, 2, 0, 0,116, 33,235, 45, 65, 41,195, 65, 41,194, +/* 0x19d0 */ 137,208,102,193,232, 5,141,116, 54, 1,102, 41,194,133,219,102, +/* 0x19e0 */ 65,137,144, 0, 2, 0, 0,116, 14,129,254,255, 0, 0, 0, 15, +/* 0x19f0 */ 142, 97,255,255,255,235,120,129,254,255, 0, 0, 0,127,112, 72, +/* 0x1a00 */ 99,198, 65,129,251,255,255,255, 0, 77,141, 4, 65,119, 26, 76, +/* 0x1a10 */ 57,231, 15,132, 67, 7, 0, 0, 15,182, 7, 65,193,226, 8, 65, +/* 0x1a20 */ 193,227, 8, 72,255,199, 65, 9,194, 65, 15,183, 16, 68,137,216, +/* 0x1a30 */ 193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 24, 65,137, +/* 0x1a40 */ 195,184, 0, 8, 0, 0, 1,246, 41,200,193,248, 5,141, 4, 2, +/* 0x1a50 */ 102, 65,137, 0,235,161, 65, 41,195, 65, 41,194,137,208,102,193, +/* 0x1a60 */ 232, 5,141,116, 54, 1,102, 41,194,102, 65,137, 16,235,136, 72, +/* 0x1a70 */ 139, 76, 36,232, 68,137,248, 65,255,199, 65,137,245, 64,136, 52, +/* 0x1a80 */ 1,131,124, 36,200, 3,127, 13,199, 68, 36,200, 0, 0, 0, 0, +/* 0x1a90 */ 233,166, 6, 0, 0,139, 84, 36,200,139, 68, 36,200,131,234, 3, +/* 0x1aa0 */ 131,232, 6,131,124, 36,200, 9, 15, 79,208,137, 84, 36,200,233, +/* 0x1ab0 */ 135, 6, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5, +/* 0x1ac0 */ 102, 41,194, 72,139, 68, 36,216, 65,129,251,255,255,255, 0,102, +/* 0x1ad0 */ 65,137, 17, 72,141, 52, 88,119, 26, 76, 57,231, 15,132,121, 6, +/* 0x1ae0 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, +/* 0x1af0 */ 65, 9,194, 15,183,150,128, 1, 0, 0, 68,137,216,193,232, 11, +/* 0x1b00 */ 15,183,202, 15,175,193, 65, 57,194,115, 78, 65,137,195,184, 0, +/* 0x1b10 */ 8, 0, 0, 76,139, 76, 36,216, 41,200,139, 76, 36,196, 68,137, +/* 0x1b20 */ 116, 36,196,193,248, 5,141, 4, 2,139, 84, 36,192,137, 76, 36, +/* 0x1b30 */ 192,102,137,134,128, 1, 0, 0, 49,192,131,124, 36,200, 6,137, +/* 0x1b40 */ 84, 36,188, 15,159,192, 73,129,193,100, 6, 0, 0,141, 4, 64, +/* 0x1b50 */ 137, 68, 36,200,233, 84, 2, 0, 0, 65, 41,195, 65, 41,194,137, +/* 0x1b60 */ 208,102,193,232, 5,102, 41,194, 65,129,251,255,255,255, 0,102, +/* 0x1b70 */ 137,150,128, 1, 0, 0,119, 26, 76, 57,231, 15,132,218, 5, 0, +/* 0x1b80 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, +/* 0x1b90 */ 9,194, 15,183,150,152, 1, 0, 0, 68,137,216,193,232, 11, 15, +/* 0x1ba0 */ 183,202, 15,175,193, 65, 57,194, 15,131,208, 0, 0, 0, 65,184, +/* 0x1bb0 */ 0, 8, 0, 0, 65,137,195, 72,193,227, 5, 68,137,192, 41,200, +/* 0x1bc0 */ 193,248, 5,141, 4, 2,102,137,134,152, 1, 0, 0, 72,139, 68, +/* 0x1bd0 */ 36,216, 72, 1,216, 65,129,251,255,255,255, 0, 72,141, 52,104, +/* 0x1be0 */ 119, 26, 76, 57,231, 15,132,112, 5, 0, 0, 15,182, 7, 65,193, +/* 0x1bf0 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183,150,224, +/* 0x1c00 */ 1, 0, 0, 68,137,216,193,232, 11, 15,183,202, 15,175,193, 65, +/* 0x1c10 */ 57,194,115, 79, 65, 41,200, 65,137,195, 65,193,248, 5, 69,133, +/* 0x1c20 */ 255, 66,141, 4, 2,102,137,134,224, 1, 0, 0, 15,132, 41, 5, +/* 0x1c30 */ 0, 0, 49,192,131,124, 36,200, 6, 72,139, 92, 36,232, 15,159, +/* 0x1c40 */ 192,141, 68, 0, 9,137, 68, 36,200, 68,137,248, 68, 41,240, 68, +/* 0x1c50 */ 15,182, 44, 3, 68,137,248, 65,255,199, 68,136, 44, 3,233,216, +/* 0x1c60 */ 4, 0, 0, 65, 41,195, 65, 41,194,137,208,102,193,232, 5,102, +/* 0x1c70 */ 41,194,102,137,150,224, 1, 0, 0,233, 17, 1, 0, 0, 65, 41, +/* 0x1c80 */ 195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129,251, +/* 0x1c90 */ 255,255,255, 0,102,137,150,152, 1, 0, 0,119, 26, 76, 57,231, +/* 0x1ca0 */ 15,132,181, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, +/* 0x1cb0 */ 8, 72,255,199, 65, 9,194, 15,183,150,176, 1, 0, 0, 68,137, +/* 0x1cc0 */ 216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 32, 65, +/* 0x1cd0 */ 137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, 2,102, +/* 0x1ce0 */ 137,134,176, 1, 0, 0,139, 68, 36,196,233,152, 0, 0, 0, 65, +/* 0x1cf0 */ 41,195, 65, 41,194,137,208,102,193,232, 5,102, 41,194, 65,129, +/* 0x1d00 */ 251,255,255,255, 0,102,137,150,176, 1, 0, 0,119, 26, 76, 57, +/* 0x1d10 */ 231, 15,132, 68, 4, 0, 0, 15,182, 7, 65,193,226, 8, 65,193, +/* 0x1d20 */ 227, 8, 72,255,199, 65, 9,194, 15,183,150,200, 1, 0, 0, 68, +/* 0x1d30 */ 137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 29, +/* 0x1d40 */ 65,137,195,184, 0, 8, 0, 0, 41,200,193,248, 5,141, 4, 2, +/* 0x1d50 */ 102,137,134,200, 1, 0, 0,139, 68, 36,192,235, 34, 65, 41,195, +/* 0x1d60 */ 65, 41,194,137,208,102,193,232, 5,102, 41,194,139, 68, 36,188, +/* 0x1d70 */ 102,137,150,200, 1, 0, 0,139, 84, 36,192,137, 84, 36,188,139, +/* 0x1d80 */ 76, 36,196,137, 76, 36,192, 68,137,116, 36,196, 65,137,198, 49, +/* 0x1d90 */ 192,131,124, 36,200, 6, 76,139, 76, 36,216, 15,159,192, 73,129, +/* 0x1da0 */ 193,104, 10, 0, 0,141, 68, 64, 8,137, 68, 36,200, 65,129,251, +/* 0x1db0 */ 255,255,255, 0,119, 26, 76, 57,231, 15,132,156, 3, 0, 0, 15, +/* 0x1dc0 */ 182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, +/* 0x1dd0 */ 65, 15,183, 17, 68,137,216,193,232, 11, 15,183,202, 15,175,193, +/* 0x1de0 */ 65, 57,194,115, 39, 65,137,195,184, 0, 8, 0, 0, 69, 49,237, +/* 0x1df0 */ 41,200,193,248, 5,141, 4, 2,102, 65,137, 1, 72, 99, 68, 36, +/* 0x1e00 */ 184, 72,193,224, 4, 77,141, 68, 1, 4,235,120, 65, 41,195, 65, +/* 0x1e10 */ 41,194,137,208,102,193,232, 5,102, 41,194, 65,129,251,255,255, +/* 0x1e20 */ 255, 0,102, 65,137, 17,119, 26, 76, 57,231, 15,132, 42, 3, 0, +/* 0x1e30 */ 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, 65, +/* 0x1e40 */ 9,194, 65, 15,183, 81, 2, 68,137,216,193,232, 11, 15,183,202, +/* 0x1e50 */ 15,175,193, 65, 57,194,115, 52, 65,137,195,184, 0, 8, 0, 0, +/* 0x1e60 */ 65,189, 8, 0, 0, 0, 41,200,193,248, 5,141, 4, 2,102, 65, +/* 0x1e70 */ 137, 65, 2, 72, 99, 68, 36,184, 72,193,224, 4, 77,141,132, 1, +/* 0x1e80 */ 4, 1, 0, 0, 65,185, 3, 0, 0, 0,235, 39, 65, 41,195, 65, +/* 0x1e90 */ 41,194,137,208,102,193,232, 5, 77,141,129, 4, 2, 0, 0, 65, +/* 0x1ea0 */ 189, 16, 0, 0, 0,102, 41,194,102, 65,137, 81, 2, 65,185, 8, +/* 0x1eb0 */ 0, 0, 0, 68,137,203,189, 1, 0, 0, 0, 72, 99,197, 65,129, +/* 0x1ec0 */ 251,255,255,255, 0, 73,141, 52, 64,119, 26, 76, 57,231, 15,132, +/* 0x1ed0 */ 135, 2, 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72, +/* 0x1ee0 */ 255,199, 65, 9,194, 15,183, 14, 68,137,216,193,232, 11, 15,183, +/* 0x1ef0 */ 209, 15,175,194, 65, 57,194,115, 23, 65,137,195,184, 0, 8, 0, +/* 0x1f00 */ 0, 1,237, 41,208,193,248, 5,141, 4, 1,102,137, 6,235, 22, +/* 0x1f10 */ 65, 41,195, 65, 41,194,137,200,102,193,232, 5,141,108, 45, 1, +/* 0x1f20 */ 102, 41,193,102,137, 14,255,203,117,145,184, 1, 0, 0, 0, 68, +/* 0x1f30 */ 137,201,211,224, 41,197, 68, 1,237,131,124, 36,200, 3, 15,143, +/* 0x1f40 */ 194, 1, 0, 0,131, 68, 36,200, 7,184, 3, 0, 0, 0,131,253, +/* 0x1f50 */ 4, 15, 76,197, 72,139, 92, 36,216, 65,184, 1, 0, 0, 0, 72, +/* 0x1f60 */ 152, 72,193,224, 7, 76,141,140, 3, 96, 3, 0, 0,187, 6, 0, +/* 0x1f70 */ 0, 0, 73, 99,192, 65,129,251,255,255,255, 0, 73,141, 52, 65, +/* 0x1f80 */ 119, 26, 76, 57,231, 15,132,208, 1, 0, 0, 15,182, 7, 65,193, +/* 0x1f90 */ 226, 8, 65,193,227, 8, 72,255,199, 65, 9,194, 15,183, 22, 68, +/* 0x1fa0 */ 137,216,193,232, 11, 15,183,202, 15,175,193, 65, 57,194,115, 24, +/* 0x1fb0 */ 65,137,195,184, 0, 8, 0, 0, 69, 1,192, 41,200,193,248, 5, +/* 0x1fc0 */ 141, 4, 2,102,137, 6,235, 23, 65, 41,195, 65, 41,194,137,208, +/* 0x1fd0 */ 102,193,232, 5, 71,141, 68, 0, 1,102, 41,194,102,137, 22,255, +/* 0x1fe0 */ 203,117,143, 65,131,232, 64, 65,131,248, 3, 69,137,198, 15,142, +/* 0x1ff0 */ 13, 1, 0, 0, 65,131,230, 1, 68,137,192,209,248, 65,131,206, +/* 0x2000 */ 2, 65,131,248, 13,141,112,255,127, 35,137,241, 72,139, 92, 36, +/* 0x2010 */ 216, 73, 99,192, 65,211,230, 72, 1,192, 68,137,242, 72,141, 20, +/* 0x2020 */ 83, 72, 41,194, 76,141,138, 94, 5, 0, 0,235, 81,141,112,251, +/* 0x2030 */ 65,129,251,255,255,255, 0,119, 26, 76, 57,231, 15,132, 25, 1, +/* 0x2040 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, +/* 0x2050 */ 65, 9,194, 65,209,235, 69, 1,246, 69, 57,218,114, 7, 69, 41, +/* 0x2060 */ 218, 65,131,206, 1,255,206,117,199, 76,139, 76, 36,216, 65,193, +/* 0x2070 */ 230, 4,190, 4, 0, 0, 0, 73,129,193, 68, 6, 0, 0, 65,189, +/* 0x2080 */ 1, 0, 0, 0,187, 1, 0, 0, 0, 72, 99,195, 65,129,251,255, +/* 0x2090 */ 255,255, 0, 77,141, 4, 65,119, 26, 76, 57,231, 15,132,185, 0, +/* 0x20a0 */ 0, 0, 15,182, 7, 65,193,226, 8, 65,193,227, 8, 72,255,199, +/* 0x20b0 */ 65, 9,194, 65, 15,183, 16, 68,137,216,193,232, 11, 15,183,202, +/* 0x20c0 */ 15,175,193, 65, 57,194,115, 24, 65,137,195,184, 0, 8, 0, 0, +/* 0x20d0 */ 1,219, 41,200,193,248, 5,141, 4, 2,102, 65,137, 0,235, 26, +/* 0x20e0 */ 65, 41,195, 65, 41,194,137,208,102,193,232, 5,141, 92, 27, 1, +/* 0x20f0 */ 69, 9,238,102, 41,194,102, 65,137, 16, 69, 1,237,255,206,117, +/* 0x2100 */ 136, 65,255,198,116, 64,131,197, 2, 69, 57,254,119, 77, 72,139, +/* 0x2110 */ 84, 36,232, 68,137,248, 68, 41,240, 68, 15,182, 44, 2, 68,137, +/* 0x2120 */ 248, 65,255,199,255,205, 68,136, 44, 2, 15,149,194, 49,192, 68, +/* 0x2130 */ 59,124, 36,228, 15,146,192,133,194,117,211, 68, 59,124, 36,228, +/* 0x2140 */ 15,130, 69,247,255,255, 65,129,251,255,255,255, 0,119, 22, 76, +/* 0x2150 */ 57,231,184, 1, 0, 0, 0,116, 35,235, 7,184, 1, 0, 0, 0, +/* 0x2160 */ 235, 26, 72,255,199,137,248, 43, 68, 36,248, 72,139, 76, 36,240, +/* 0x2170 */ 72,139, 92, 36, 56,137, 1, 68,137, 59, 49,192, 91, 93, 65, 92, +/* 0x2180 */ 65, 93, 65, 94, 65, 95, 72,139,117,248, 72,139,125, 16,139, 75, +/* 0x2190 */ 4, 72, 1,206,139, 19, 72, 1,215,201,235, 2, 87, 94, 88, 72, +/* 0x21a0 */ 41,199, 88, 89,137, 57, 72, 41,240,195, 0, 46,115,121,109,116, +/* 0x21b0 */ 97, 98, 0, 46,115,116,114,116, 97, 98, 0, 46,115,104,115,116, +/* 0x21c0 */ 114,116, 97, 98, 0, 46,114,101,108, 97, 46,116,101,120,116, 0, +/* 0x21d0 */ 69, 88, 80, 95, 72, 69, 65, 68, 0, 46,114,101,108, 97, 78, 82, +/* 0x21e0 */ 86, 50, 69, 0, 46,114,101,108, 97, 78, 82, 86, 50, 68, 0, 46, +/* 0x21f0 */ 114,101,108, 97, 78, 82, 86, 50, 66, 0, 46,114,101,108, 97, 83, +/* 0x2200 */ 89, 83, 67, 65, 76, 76, 83, 0, 46,114,101,108, 97, 76, 90, 77, +/* 0x2210 */ 65, 95, 69, 76, 70, 48, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, +/* 0x2220 */ 49, 48, 0, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 0, 76, 90, +/* 0x2230 */ 77, 65, 95, 68, 69, 67, 51, 48, 0, 69, 88, 80, 95, 84, 65, 73, +/* 0x2240 */ 76, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2250 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2260 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2270 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2280 */ 0, 0, 0, 0, 0, 0, 0, 0, 32, 0, 0, 0, 1, 0, 0, 0, +/* 0x2290 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x22a0 */ 64, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 0, +/* 0x22b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, +/* 0x22c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 27, 0, 0, 0, 4, 0, 0, 0, +/* 0x22d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x22e0 */ 40, 43, 0, 0, 0, 0, 0, 0, 96, 3, 0, 0, 0, 0, 0, 0, +/* 0x22f0 */ 19, 0, 0, 0, 1, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x2300 */ 24, 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 1, 0, 0, 0, +/* 0x2310 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2320 */ 73, 9, 0, 0, 0, 0, 0, 0,224, 0, 0, 0, 0, 0, 0, 0, +/* 0x2330 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2340 */ 0, 0, 0, 0, 0, 0, 0, 0, 52, 0, 0, 0, 1, 0, 0, 0, +/* 0x2350 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2360 */ 41, 10, 0, 0, 0, 0, 0, 0,229, 0, 0, 0, 0, 0, 0, 0, +/* 0x2370 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2380 */ 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 4, 0, 0, 0, +/* 0x2390 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x23a0 */ 136, 46, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, +/* 0x23b0 */ 19, 0, 0, 0, 4, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x23c0 */ 24, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, 0, 1, 0, 0, 0, +/* 0x23d0 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x23e0 */ 14, 11, 0, 0, 0, 0, 0, 0,215, 0, 0, 0, 0, 0, 0, 0, +/* 0x23f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2400 */ 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 0, 0, 4, 0, 0, 0, +/* 0x2410 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2420 */ 184, 46, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, +/* 0x2430 */ 19, 0, 0, 0, 6, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x2440 */ 24, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, 1, 0, 0, 0, +/* 0x2450 */ 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2460 */ 229, 11, 0, 0, 0, 0, 0, 0,193, 0, 0, 0, 0, 0, 0, 0, +/* 0x2470 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2480 */ 0, 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 4, 0, 0, 0, +/* 0x2490 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x24a0 */ 232, 46, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, +/* 0x24b0 */ 19, 0, 0, 0, 8, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x24c0 */ 24, 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 1, 0, 0, 0, +/* 0x24d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x24e0 */ 166, 12, 0, 0, 0, 0, 0, 0,142, 0, 0, 0, 0, 0, 0, 0, +/* 0x24f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2500 */ 0, 0, 0, 0, 0, 0, 0, 0, 80, 0, 0, 0, 4, 0, 0, 0, +/* 0x2510 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2520 */ 24, 47, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, +/* 0x2530 */ 19, 0, 0, 0, 10, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x2540 */ 24, 0, 0, 0, 0, 0, 0, 0, 99, 0, 0, 0, 1, 0, 0, 0, +/* 0x2550 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2560 */ 52, 13, 0, 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0, 0, 0, +/* 0x2570 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2580 */ 0, 0, 0, 0, 0, 0, 0, 0, 94, 0, 0, 0, 4, 0, 0, 0, +/* 0x2590 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x25a0 */ 120, 47, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, +/* 0x25b0 */ 19, 0, 0, 0, 12, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x25c0 */ 24, 0, 0, 0, 0, 0, 0, 0,110, 0, 0, 0, 1, 0, 0, 0, +/* 0x25d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x25e0 */ 152, 13, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, +/* 0x25f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2600 */ 0, 0, 0, 0, 0, 0, 0, 0,121, 0, 0, 0, 1, 0, 0, 0, +/* 0x2610 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2620 */ 143, 23, 0, 0, 0, 0, 0, 0,247, 9, 0, 0, 0, 0, 0, 0, +/* 0x2630 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2640 */ 0, 0, 0, 0, 0, 0, 0, 0,132, 0, 0, 0, 1, 0, 0, 0, +/* 0x2650 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2660 */ 134, 33, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0, +/* 0x2670 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2680 */ 0, 0, 0, 0, 0, 0, 0, 0,143, 0, 0, 0, 1, 0, 0, 0, +/* 0x2690 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x26a0 */ 158, 33, 0, 0, 0, 0, 0, 0, 12, 0, 0, 0, 0, 0, 0, 0, +/* 0x26b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x26c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 3, 0, 0, 0, +/* 0x26d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x26e0 */ 170, 33, 0, 0, 0, 0, 0, 0,152, 0, 0, 0, 0, 0, 0, 0, +/* 0x26f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2700 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, +/* 0x2710 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2720 */ 136, 39, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, +/* 0x2730 */ 20, 0, 0, 0, 12, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, +/* 0x2740 */ 24, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 3, 0, 0, 0, +/* 0x2750 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2760 */ 136, 42, 0, 0, 0, 0, 0, 0,153, 0, 0, 0, 0, 0, 0, 0, +/* 0x2770 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, +/* 0x2780 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2790 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x27a0 */ 0, 0, 0, 0, 3, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x27b0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, +/* 0x27c0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x27d0 */ 0, 0, 0, 0, 3, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x27e0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 16, 0, +/* 0x27f0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2800 */ 0, 0, 0, 0, 3, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2810 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 4, 0, +/* 0x2820 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2830 */ 0, 0, 0, 0, 3, 0, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2840 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 8, 0, +/* 0x2850 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2860 */ 0, 0, 0, 0, 3, 0, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2870 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 14, 0, +/* 0x2880 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2890 */ 0, 0, 0, 0, 3, 0, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x28a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 16, 0, 10, 0, +/* 0x28b0 */ 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x28c0 */ 6, 0, 0, 0, 16, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x28d0 */ 0, 0, 0, 0, 0, 0, 0, 0, 15, 0, 0, 0, 16, 0, 1, 0, +/* 0x28e0 */ 88, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x28f0 */ 29, 0, 0, 0, 16, 0, 10, 0,106, 0, 0, 0, 0, 0, 0, 0, +/* 0x2900 */ 0, 0, 0, 0, 0, 0, 0, 0, 36, 0, 0, 0, 16, 0, 10, 0, +/* 0x2910 */ 122, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2920 */ 46, 0, 0, 0, 16, 0, 10, 0, 42, 0, 0, 0, 0, 0, 0, 0, +/* 0x2930 */ 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 16, 0, 10, 0, +/* 0x2940 */ 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2950 */ 57, 0, 0, 0, 16, 0, 10, 0, 17, 0, 0, 0, 0, 0, 0, 0, +/* 0x2960 */ 0, 0, 0, 0, 0, 0, 0, 0, 70, 0, 0, 0, 16, 0, 10, 0, +/* 0x2970 */ 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2980 */ 75, 0, 0, 0, 18, 0, 1, 0,181, 2, 0, 0, 0, 0, 0, 0, +/* 0x2990 */ 75, 0, 0, 0, 0, 0, 0, 0, 84, 0, 0, 0, 16, 0, 10, 0, +/* 0x29a0 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x29b0 */ 92, 0, 0, 0, 16, 0, 10, 0, 69, 0, 0, 0, 0, 0, 0, 0, +/* 0x29c0 */ 0, 0, 0, 0, 0, 0, 0, 0,101, 0, 0, 0, 16, 0, 10, 0, +/* 0x29d0 */ 134, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x29e0 */ 108, 0, 0, 0, 16, 0, 10, 0, 90, 0, 0, 0, 0, 0, 0, 0, +/* 0x29f0 */ 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 16, 0, 10, 0, +/* 0x2a00 */ 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2a10 */ 120, 0, 0, 0, 18, 0, 1, 0,212, 7, 0, 0, 0, 0, 0, 0, +/* 0x2a20 */ 53, 1, 0, 0, 0, 0, 0, 0,129, 0, 0, 0, 16, 0, 10, 0, +/* 0x2a30 */ 114, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2a40 */ 133, 0, 0, 0, 16, 0, 10, 0,126, 0, 0, 0, 0, 0, 0, 0, +/* 0x2a50 */ 0, 0, 0, 0, 0, 0, 0, 0,138, 0, 0, 0, 16, 0, 10, 0, +/* 0x2a60 */ 130, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +/* 0x2a70 */ 147, 0, 0, 0, 16, 0, 10, 0,118, 0, 0, 0, 0, 0, 0, 0, +/* 0x2a80 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 80,109, 97,112, 0,102, 95, +/* 0x2a90 */ 101,120,112, 97,110,100, 0,103,101,116, 95,112, 97,103,101, 95, +/* 0x2aa0 */ 109, 97,115,107, 0,109,117,110,109, 97,112, 0,102,116,114,117, +/* 0x2ab0 */ 110, 99, 97,116,101, 0,109,109, 97,112, 0,119,114,105,116,101, +/* 0x2ac0 */ 0,109,101,109,102,100, 95, 99,114,101, 97,116,101, 0,114,101, +/* 0x2ad0 */ 97,100, 0,117,110,100,101,114,108, 97,121, 0,109,121, 95, 98, +/* 0x2ae0 */ 107,112,116, 0, 80,112,114,111,116,101, 99,116, 0, 80,119,114, +/* 0x2af0 */ 105,116,101, 0, 80,117,110,109, 97,112, 0,101,120,105,116, 0, +/* 0x2b00 */ 117,112,120, 95,109, 97,105,110, 0, 98,114,107, 0,111,112,101, +/* 0x2b10 */ 110, 0,109,112,114,111,116,101, 99,116, 0, 99,108,111,115,101, +/* 0x2b20 */ 0, 0, 0, 0, 0, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, +/* 0x2b30 */ 2, 0, 0, 0, 3, 0, 0, 0,254,255,255,255,255,255,255,255, +/* 0x2b40 */ 123, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 29, 0, 0, 0, +/* 0x2b50 */ 252,255,255,255,255,255,255,255, 3, 1, 0, 0, 0, 0, 0, 0, +/* 0x2b60 */ 2, 0, 0, 0, 27, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2b70 */ 32, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 28, 0, 0, 0, +/* 0x2b80 */ 252,255,255,255,255,255,255,255, 40, 1, 0, 0, 0, 0, 0, 0, +/* 0x2b90 */ 2, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2ba0 */ 68, 1, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 17, 0, 0, 0, +/* 0x2bb0 */ 252,255,255,255,255,255,255,255, 75, 1, 0, 0, 0, 0, 0, 0, +/* 0x2bc0 */ 2, 0, 0, 0, 31, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2bd0 */ 116, 1, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, +/* 0x2be0 */ 252,255,255,255,255,255,255,255,229, 1, 0, 0, 0, 0, 0, 0, +/* 0x2bf0 */ 4, 0, 0, 0, 26, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2c00 */ 16, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 13, 0, 0, 0, +/* 0x2c10 */ 252,255,255,255,255,255,255,255,169, 2, 0, 0, 0, 0, 0, 0, +/* 0x2c20 */ 4, 0, 0, 0, 26, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2c30 */ 229, 2, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, +/* 0x2c40 */ 252,255,255,255,255,255,255,255,120, 3, 0, 0, 0, 0, 0, 0, +/* 0x2c50 */ 4, 0, 0, 0, 15, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2c60 */ 211, 3, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, +/* 0x2c70 */ 252,255,255,255,255,255,255,255, 26, 4, 0, 0, 0, 0, 0, 0, +/* 0x2c80 */ 4, 0, 0, 0, 17, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2c90 */ 51, 4, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, +/* 0x2ca0 */ 252,255,255,255,255,255,255,255,119, 5, 0, 0, 0, 0, 0, 0, +/* 0x2cb0 */ 4, 0, 0, 0, 19, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2cc0 */ 133, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 16, 0, 0, 0, +/* 0x2cd0 */ 252,255,255,255,255,255,255,255,153, 5, 0, 0, 0, 0, 0, 0, +/* 0x2ce0 */ 4, 0, 0, 0, 18, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2cf0 */ 214, 5, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, +/* 0x2d00 */ 252,255,255,255,255,255,255,255, 0, 6, 0, 0, 0, 0, 0, 0, +/* 0x2d10 */ 4, 0, 0, 0, 17, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2d20 */ 170, 6, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 19, 0, 0, 0, +/* 0x2d30 */ 252,255,255,255,255,255,255,255,195, 6, 0, 0, 0, 0, 0, 0, +/* 0x2d40 */ 4, 0, 0, 0, 18, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2d50 */ 223, 6, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 17, 0, 0, 0, +/* 0x2d60 */ 252,255,255,255,255,255,255,255,233, 6, 0, 0, 0, 0, 0, 0, +/* 0x2d70 */ 4, 0, 0, 0, 31, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2d80 */ 12, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 15, 0, 0, 0, +/* 0x2d90 */ 252,255,255,255,255,255,255,255, 40, 7, 0, 0, 0, 0, 0, 0, +/* 0x2da0 */ 4, 0, 0, 0, 17, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2db0 */ 54, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 31, 0, 0, 0, +/* 0x2dc0 */ 252,255,255,255,255,255,255,255, 78, 7, 0, 0, 0, 0, 0, 0, +/* 0x2dd0 */ 4, 0, 0, 0, 23, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2de0 */ 92, 7, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 26, 0, 0, 0, +/* 0x2df0 */ 252,255,255,255,255,255,255,255,133, 7, 0, 0, 0, 0, 0, 0, +/* 0x2e00 */ 4, 0, 0, 0, 17, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2e10 */ 46, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 14, 0, 0, 0, +/* 0x2e20 */ 252,255,255,255,255,255,255,255,130, 8, 0, 0, 0, 0, 0, 0, +/* 0x2e30 */ 4, 0, 0, 0, 29, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2e40 */ 151, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 20, 0, 0, 0, +/* 0x2e50 */ 252,255,255,255,255,255,255,255,169, 8, 0, 0, 0, 0, 0, 0, +/* 0x2e60 */ 4, 0, 0, 0, 26, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2e70 */ 219, 8, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 31, 0, 0, 0, +/* 0x2e80 */ 252,255,255,255,255,255,255,255,218, 0, 0, 0, 0, 0, 0, 0, +/* 0x2e90 */ 2, 0, 0, 0, 2, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, +/* 0x2ea0 */ 113, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, +/* 0x2eb0 */ 252,255,255,255,255,255,255,255,204, 0, 0, 0, 0, 0, 0, 0, +/* 0x2ec0 */ 2, 0, 0, 0, 2, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, +/* 0x2ed0 */ 113, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, +/* 0x2ee0 */ 252,255,255,255,255,255,255,255,182, 0, 0, 0, 0, 0, 0, 0, +/* 0x2ef0 */ 2, 0, 0, 0, 2, 0, 0, 0,159, 0, 0, 0, 0, 0, 0, 0, +/* 0x2f00 */ 93, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 5, 0, 0, 0, +/* 0x2f10 */ 252,255,255,255,255,255,255,255, 27, 0, 0, 0, 0, 0, 0, 0, +/* 0x2f20 */ 2, 0, 0, 0, 1, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2f30 */ 71, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, +/* 0x2f40 */ 252,255,255,255,255,255,255,255, 92, 0, 0, 0, 0, 0, 0, 0, +/* 0x2f50 */ 2, 0, 0, 0, 1, 0, 0, 0,252,255,255,255,255,255,255,255, +/* 0x2f60 */ 86, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 30, 0, 0, 0, +/* 0x2f70 */ 252,255,255,255,255,255,255,255, 6, 0, 0, 0, 0, 0, 0, 0, +/* 0x2f80 */ 2, 0, 0, 0, 4, 0, 0, 0, 18, 0, 0, 0, 0, 0, 0, 0, +/* 0x2f90 */ 102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,102, 54, +/* 0x2fa0 */ 52, 45,120, 56, 54, 45, 54, 52, 10, 10, 83,101, 99,116,105,111, +/* 0x2fb0 */ 110,115, 58, 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, +/* 0x2fc0 */ 32, 32, 32, 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, +/* 0x2fd0 */ 86, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x2fe0 */ 32, 32, 76, 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x2ff0 */ 32, 32, 32, 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108, +/* 0x3000 */ 103,110, 32, 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 46,116, +/* 0x3010 */ 101,120,116, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 57, 48, 57, +/* 0x3020 */ 32, 32, 48, 32, 32, 48, 32, 32, 48, 52, 48, 32, 32, 50, 42, 42, +/* 0x3030 */ 50, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 49, 32, +/* 0x3040 */ 69, 88, 80, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48,101, +/* 0x3050 */ 48, 32, 32, 48, 32, 32, 48, 32, 32, 48, 57, 52, 57, 32, 32, 50, +/* 0x3060 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, +/* 0x3070 */ 50, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x3080 */ 48,101, 53, 32, 32, 48, 32, 32, 48, 32, 32, 48, 97, 50, 57, 32, +/* 0x3090 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, +/* 0x30a0 */ 32, 32, 51, 32, 78, 82, 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, +/* 0x30b0 */ 32, 32, 48,100, 55, 32, 32, 48, 32, 32, 48, 32, 32, 48, 98, 48, +/* 0x30c0 */ 101, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, +/* 0x30d0 */ 83, 10, 32, 32, 52, 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, +/* 0x30e0 */ 32, 32, 32, 32, 48, 99, 49, 32, 32, 48, 32, 32, 48, 32, 32, 48, +/* 0x30f0 */ 98,101, 53, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, +/* 0x3100 */ 78, 84, 83, 10, 32, 32, 53, 32, 83, 89, 83, 67, 65, 76, 76, 83, +/* 0x3110 */ 32, 32, 32, 32, 32, 32, 48, 56,101, 32, 32, 48, 32, 32, 48, 32, +/* 0x3120 */ 32, 48, 99, 97, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, +/* 0x3130 */ 84, 69, 78, 84, 83, 10, 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, +/* 0x3140 */ 76, 70, 48, 48, 32, 32, 32, 32, 48, 54, 52, 32, 32, 48, 32, 32, +/* 0x3150 */ 48, 32, 32, 48,100, 51, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, +/* 0x3160 */ 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 55, 32, 76, 90, 77, 65, +/* 0x3170 */ 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 57,102, 55, 32, 32, +/* 0x3180 */ 48, 32, 32, 48, 32, 32, 48,100, 57, 56, 32, 32, 50, 42, 42, 48, +/* 0x3190 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, 32, 56, 32, 76, +/* 0x31a0 */ 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 57,102, +/* 0x31b0 */ 55, 32, 32, 48, 32, 32, 48, 32, 32, 48, 49, 55, 56,102, 32, 32, +/* 0x31c0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 10, 32, +/* 0x31d0 */ 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, +/* 0x31e0 */ 32, 48, 49, 56, 32, 32, 48, 32, 32, 48, 32, 32, 48, 50, 49, 56, +/* 0x31f0 */ 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, +/* 0x3200 */ 83, 10, 32, 49, 48, 32, 69, 88, 80, 95, 84, 65, 73, 76, 32, 32, +/* 0x3210 */ 32, 32, 32, 32, 48, 99, 32, 32, 48, 32, 32, 48, 32, 32, 48, 50, +/* 0x3220 */ 49, 57,101, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, +/* 0x3230 */ 78, 84, 83, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, +/* 0x3240 */ 58, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3250 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 46,116,101,120,116, +/* 0x3260 */ 32, 48, 32, 46,116,101,120,116, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x3270 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, +/* 0x3280 */ 32, 32, 69, 88, 80, 95, 72, 69, 65, 68, 32, 48, 32, 69, 88, 80, +/* 0x3290 */ 95, 72, 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x32a0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 83, +/* 0x32b0 */ 89, 83, 67, 65, 76, 76, 83, 32, 48, 32, 83, 89, 83, 67, 65, 76, +/* 0x32c0 */ 76, 83, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x32d0 */ 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, +/* 0x32e0 */ 95, 68, 69, 67, 51, 48, 32, 48, 32, 76, 90, 77, 65, 95, 68, 69, +/* 0x32f0 */ 67, 51, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3300 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 88, 80, +/* 0x3310 */ 95, 84, 65, 73, 76, 32, 48, 32, 69, 88, 80, 95, 84, 65, 73, 76, +/* 0x3320 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3330 */ 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 32, +/* 0x3340 */ 48, 32, 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3350 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x3360 */ 32, 78, 82, 86, 50, 68, 32, 48, 32, 78, 82, 86, 50, 68, 10, 48, +/* 0x3370 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, +/* 0x3380 */ 108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 32, 48, 32, +/* 0x3390 */ 78, 82, 86, 50, 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x33a0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, +/* 0x33b0 */ 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 48, 32, 76, 90, 77, 65, +/* 0x33c0 */ 95, 69, 76, 70, 48, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x33d0 */ 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, +/* 0x33e0 */ 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 48, 32, 76, 90, 77, +/* 0x33f0 */ 65, 95, 68, 69, 67, 49, 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3400 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, +/* 0x3410 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 32, 48, 32, 76, 90, +/* 0x3420 */ 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x3430 */ 48, 48, 48, 48, 48, 48, 48, 49, 56, 32,103, 32, 32, 32, 32, 32, +/* 0x3440 */ 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32, 80,109, 97, +/* 0x3450 */ 112, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3460 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 88, 80, 95, 72, +/* 0x3470 */ 69, 65, 68, 32, 48, 32,102, 95,101,120,112, 97,110,100, 10, 48, +/* 0x3480 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 53, 56, 32, +/* 0x3490 */ 103, 32, 32, 32, 32, 32, 32, 32, 46,116,101,120,116, 32, 48, 32, +/* 0x34a0 */ 103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 10, 48, 48, +/* 0x34b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 97, 32,103, +/* 0x34c0 */ 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, +/* 0x34d0 */ 48, 32,109,117,110,109, 97,112, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x34e0 */ 48, 48, 48, 48, 48, 48, 48, 55, 97, 32,103, 32, 32, 32, 32, 32, +/* 0x34f0 */ 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32,102,116,114, +/* 0x3500 */ 117,110, 99, 97,116,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3510 */ 48, 48, 48, 48, 48, 50, 97, 32,103, 32, 32, 32, 32, 32, 32, 32, +/* 0x3520 */ 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32,109,109, 97,112, 10, +/* 0x3530 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 54, +/* 0x3540 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, +/* 0x3550 */ 83, 32, 48, 32,119,114,105,116,101, 10, 48, 48, 48, 48, 48, 48, +/* 0x3560 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 32,103, 32, 32, 32, 32, +/* 0x3570 */ 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32,109,101, +/* 0x3580 */ 109,102,100, 95, 99,114,101, 97,116,101, 10, 48, 48, 48, 48, 48, +/* 0x3590 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 97, 32,103, 32, 32, 32, +/* 0x35a0 */ 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32,114, +/* 0x35b0 */ 101, 97,100, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x35c0 */ 48, 50, 98, 53, 32,103, 32, 32, 32, 32, 32, 70, 32, 46,116,101, +/* 0x35d0 */ 120,116, 32, 48, 52, 98, 32,117,110,100,101,114,108, 97,121, 10, +/* 0x35e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x35f0 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, +/* 0x3600 */ 83, 32, 48, 32,109,121, 95, 98,107,112,116, 10, 48, 48, 48, 48, +/* 0x3610 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 53, 32,103, 32, 32, +/* 0x3620 */ 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32, +/* 0x3630 */ 80,112,114,111,116,101, 99,116, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x3640 */ 48, 48, 48, 48, 48, 48, 48, 56, 54, 32,103, 32, 32, 32, 32, 32, +/* 0x3650 */ 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, 32, 80,119,114, +/* 0x3660 */ 105,116,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3670 */ 48, 48, 53, 97, 32,103, 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, +/* 0x3680 */ 67, 65, 76, 76, 83, 32, 48, 32, 80,117,110,109, 97,112, 10, 48, +/* 0x3690 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54,101, 32, +/* 0x36a0 */ 103, 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, +/* 0x36b0 */ 32, 48, 32,101,120,105,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x36c0 */ 48, 48, 48, 48, 48, 55,100, 52, 32,103, 32, 32, 32, 32, 32, 70, +/* 0x36d0 */ 32, 46,116,101,120,116, 32, 48, 49, 51, 53, 32,117,112,120, 95, +/* 0x36e0 */ 109, 97,105,110, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x36f0 */ 48, 48, 48, 55, 50, 32,103, 32, 32, 32, 32, 32, 32, 32, 83, 89, +/* 0x3700 */ 83, 67, 65, 76, 76, 83, 32, 48, 32, 98,114,107, 10, 48, 48, 48, +/* 0x3710 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55,101, 32,103, 32, +/* 0x3720 */ 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, 76, 83, 32, 48, +/* 0x3730 */ 32,111,112,101,110, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3740 */ 48, 48, 48, 48, 56, 50, 32,103, 32, 32, 32, 32, 32, 32, 32, 83, +/* 0x3750 */ 89, 83, 67, 65, 76, 76, 83, 32, 48, 32,109,112,114,111,116,101, +/* 0x3760 */ 99,116, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3770 */ 48, 55, 54, 32,103, 32, 32, 32, 32, 32, 32, 32, 83, 89, 83, 67, +/* 0x3780 */ 65, 76, 76, 83, 32, 48, 32, 99,108,111,115,101, 10, 10, 82, 69, +/* 0x3790 */ 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, +/* 0x37a0 */ 32, 70, 79, 82, 32, 91, 46,116,101,120,116, 93, 58, 10, 79, 70, +/* 0x37b0 */ 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, +/* 0x37c0 */ 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x37d0 */ 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x37e0 */ 48, 48, 48, 48, 48, 55, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x37f0 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 83, 89, 83, 67, 65, 76, +/* 0x3800 */ 76, 83, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3810 */ 102,102,102,102,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3820 */ 48, 48, 48, 48, 55, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, +/* 0x3830 */ 80, 67, 51, 50, 32, 32, 32, 32, 32,111,112,101,110, 43, 48,120, +/* 0x3840 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, +/* 0x3850 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 48, +/* 0x3860 */ 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, +/* 0x3870 */ 32, 32, 32, 32,117,112,120, 95,109, 97,105,110, 43, 48,120,102, +/* 0x3880 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, +/* 0x3890 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 48, +/* 0x38a0 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, +/* 0x38b0 */ 32, 32, 32, 98,114,107, 43, 48,120,102,102,102,102,102,102,102, +/* 0x38c0 */ 102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, +/* 0x38d0 */ 48, 48, 48, 48, 48, 48, 48, 49, 50, 56, 32, 82, 95, 88, 56, 54, +/* 0x38e0 */ 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,109,117,110, +/* 0x38f0 */ 109, 97,112, 43, 48,120,102,102,102,102,102,102,102,102,102,102, +/* 0x3900 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3910 */ 48, 48, 48, 48, 49, 52, 52, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x3920 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,109,109, 97,112, 43, 48, +/* 0x3930 */ 120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3940 */ 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, +/* 0x3950 */ 52, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, +/* 0x3960 */ 32, 32, 32, 32, 32, 99,108,111,115,101, 43, 48,120,102,102,102, +/* 0x3970 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, +/* 0x3980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 55, 52, 32, 82, +/* 0x3990 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, +/* 0x39a0 */ 32,101,120,105,116, 43, 48,120,102,102,102,102,102,102,102,102, +/* 0x39b0 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x39c0 */ 48, 48, 48, 48, 48, 48, 49,101, 53, 32, 82, 95, 88, 56, 54, 95, +/* 0x39d0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,101,120,105,116, +/* 0x39e0 */ 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x39f0 */ 102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3a00 */ 48, 50, 49, 48, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, +/* 0x3a10 */ 84, 51, 50, 32, 32, 32, 32,102, 95,101,120,112, 97,110,100, 43, +/* 0x3a20 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3a30 */ 102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3a40 */ 50, 97, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, +/* 0x3a50 */ 51, 50, 32, 32, 32, 32,101,120,105,116, 43, 48,120,102,102,102, +/* 0x3a60 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, +/* 0x3a70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 50,101, 53, 32, 82, +/* 0x3a80 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, +/* 0x3a90 */ 32,109,109, 97,112, 43, 48,120,102,102,102,102,102,102,102,102, +/* 0x3aa0 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x3ab0 */ 48, 48, 48, 48, 48, 48, 51, 55, 56, 32, 82, 95, 88, 56, 54, 95, +/* 0x3ac0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,117,110,109, +/* 0x3ad0 */ 97,112, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3ae0 */ 102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3af0 */ 48, 48, 48, 51,100, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, +/* 0x3b00 */ 80, 76, 84, 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103, +/* 0x3b10 */ 101, 95,109, 97,115,107, 43, 48,120,102,102,102,102,102,102,102, +/* 0x3b20 */ 102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, +/* 0x3b30 */ 48, 48, 48, 48, 48, 48, 48, 52, 49, 97, 32, 82, 95, 88, 56, 54, +/* 0x3b40 */ 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,109, 97, +/* 0x3b50 */ 112, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3b60 */ 102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3b70 */ 48, 48, 52, 51, 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, +/* 0x3b80 */ 76, 84, 51, 50, 32, 32, 32, 32,103,101,116, 95,112, 97,103,101, +/* 0x3b90 */ 95,109, 97,115,107, 43, 48,120,102,102,102,102,102,102,102,102, +/* 0x3ba0 */ 102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, +/* 0x3bb0 */ 48, 48, 48, 48, 48, 48, 53, 55, 55, 32, 82, 95, 88, 56, 54, 95, +/* 0x3bc0 */ 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,101,109,102, +/* 0x3bd0 */ 100, 95, 99,114,101, 97,116,101, 43, 48,120,102,102,102,102,102, +/* 0x3be0 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, +/* 0x3bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 56, 53, 32, 82, 95, 88, +/* 0x3c00 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,102, +/* 0x3c10 */ 116,114,117,110, 99, 97,116,101, 43, 48,120,102,102,102,102,102, +/* 0x3c20 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, +/* 0x3c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 57, 57, 32, 82, 95, 88, +/* 0x3c40 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,119, +/* 0x3c50 */ 114,105,116,101, 43, 48,120,102,102,102,102,102,102,102,102,102, +/* 0x3c60 */ 102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3c70 */ 48, 48, 48, 48, 48, 53,100, 54, 32, 82, 95, 88, 56, 54, 95, 54, +/* 0x3c80 */ 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,109,109, 97,112, 43, +/* 0x3c90 */ 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3ca0 */ 102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3cb0 */ 54, 48, 48, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, +/* 0x3cc0 */ 51, 50, 32, 32, 32, 32,109,109, 97,112, 43, 48,120,102,102,102, +/* 0x3cd0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, +/* 0x3ce0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 97, 97, 32, 82, +/* 0x3cf0 */ 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, +/* 0x3d00 */ 32,109,101,109,102,100, 95, 99,114,101, 97,116,101, 43, 48,120, +/* 0x3d10 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, +/* 0x3d20 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54, 99, +/* 0x3d30 */ 51, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, +/* 0x3d40 */ 32, 32, 32, 32,119,114,105,116,101, 43, 48,120,102,102,102,102, +/* 0x3d50 */ 102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, +/* 0x3d60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 54,100,102, 32, 82, 95, +/* 0x3d70 */ 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32, +/* 0x3d80 */ 109,109, 97,112, 43, 48,120,102,102,102,102,102,102,102,102,102, +/* 0x3d90 */ 102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3da0 */ 48, 48, 48, 48, 48, 54,101, 57, 32, 82, 95, 88, 56, 54, 95, 54, +/* 0x3db0 */ 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32, 99,108,111,115,101, +/* 0x3dc0 */ 43, 48,120,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3dd0 */ 102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3de0 */ 48, 55, 48, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, +/* 0x3df0 */ 84, 51, 50, 32, 32, 32, 32,109,117,110,109, 97,112, 43, 48,120, +/* 0x3e00 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, +/* 0x3e10 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 50, +/* 0x3e20 */ 56, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, +/* 0x3e30 */ 32, 32, 32, 32,109,109, 97,112, 43, 48,120,102,102,102,102,102, +/* 0x3e40 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, +/* 0x3e50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 51, 54, 32, 82, 95, 88, +/* 0x3e60 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32, 99, +/* 0x3e70 */ 108,111,115,101, 43, 48,120,102,102,102,102,102,102,102,102,102, +/* 0x3e80 */ 102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3e90 */ 48, 48, 48, 48, 48, 55, 52,101, 32, 82, 95, 88, 56, 54, 95, 54, +/* 0x3ea0 */ 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32, 80,112,114,111,116, +/* 0x3eb0 */ 101, 99,116, 43, 48,120,102,102,102,102,102,102,102,102,102,102, +/* 0x3ec0 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x3ed0 */ 48, 48, 48, 48, 55, 53, 99, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x3ee0 */ 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,101,120,105,116, 43, 48, +/* 0x3ef0 */ 120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x3f00 */ 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, +/* 0x3f10 */ 56, 53, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, +/* 0x3f20 */ 50, 32, 32, 32, 32,109,109, 97,112, 43, 48,120,102,102,102,102, +/* 0x3f30 */ 102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, +/* 0x3f40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 50,101, 32, 82, 95, +/* 0x3f50 */ 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32, +/* 0x3f60 */ 103,101,116, 95,112, 97,103,101, 95,109, 97,115,107, 43, 48,120, +/* 0x3f70 */ 102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, 99, +/* 0x3f80 */ 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 56, +/* 0x3f90 */ 50, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, +/* 0x3fa0 */ 32, 32, 32, 32,111,112,101,110, 43, 48,120,102,102,102,102,102, +/* 0x3fb0 */ 102,102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, +/* 0x3fc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 57, 55, 32, 82, 95, 88, +/* 0x3fd0 */ 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,114, +/* 0x3fe0 */ 101, 97,100, 43, 48,120,102,102,102,102,102,102,102,102,102,102, +/* 0x3ff0 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4000 */ 48, 48, 48, 48, 56, 97, 57, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x4010 */ 95, 80, 76, 84, 51, 50, 32, 32, 32, 32,101,120,105,116, 43, 48, +/* 0x4020 */ 120,102,102,102,102,102,102,102,102,102,102,102,102,102,102,102, +/* 0x4030 */ 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, +/* 0x4040 */ 100, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 76, 84, 51, +/* 0x4050 */ 50, 32, 32, 32, 32, 99,108,111,115,101, 43, 48,120,102,102,102, +/* 0x4060 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, +/* 0x4070 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, +/* 0x4080 */ 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 69, 93, 58, 10, 79, +/* 0x4090 */ 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x40a0 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x40b0 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x40c0 */ 48, 48, 48, 48, 48, 48,100, 97, 32, 82, 95, 88, 56, 54, 95, 54, +/* 0x40d0 */ 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 88, 80, 95, 72, +/* 0x40e0 */ 69, 65, 68, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x40f0 */ 48, 48, 48, 48, 57,102, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4100 */ 48, 48, 48, 48, 48, 55, 49, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x4110 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 88, 80, 95, 84, 65, +/* 0x4120 */ 73, 76, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, +/* 0x4130 */ 102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, +/* 0x4140 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 78, +/* 0x4150 */ 82, 86, 50, 68, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, +/* 0x4160 */ 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, +/* 0x4170 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, +/* 0x4180 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 99, +/* 0x4190 */ 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, +/* 0x41a0 */ 32, 32, 32, 69, 88, 80, 95, 72, 69, 65, 68, 43, 48,120, 48, 48, +/* 0x41b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 57,102, 10, 48, +/* 0x41c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 55, 49, 32, +/* 0x41d0 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, +/* 0x41e0 */ 32, 32, 69, 88, 80, 95, 84, 65, 73, 76, 43, 48,120,102,102,102, +/* 0x41f0 */ 102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 10, 82, +/* 0x4200 */ 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, +/* 0x4210 */ 83, 32, 70, 79, 82, 32, 91, 78, 82, 86, 50, 66, 93, 58, 10, 79, +/* 0x4220 */ 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x4230 */ 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, +/* 0x4240 */ 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4250 */ 48, 48, 48, 48, 48, 48, 98, 54, 32, 82, 95, 88, 56, 54, 95, 54, +/* 0x4260 */ 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 88, 80, 95, 72, +/* 0x4270 */ 69, 65, 68, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4280 */ 48, 48, 48, 48, 57,102, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4290 */ 48, 48, 48, 48, 48, 53,100, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x42a0 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 69, 88, 80, 95, 84, 65, +/* 0x42b0 */ 73, 76, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, +/* 0x42c0 */ 102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, +/* 0x42d0 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 83, +/* 0x42e0 */ 89, 83, 67, 65, 76, 76, 83, 93, 58, 10, 79, 70, 70, 83, 69, 84, +/* 0x42f0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, +/* 0x4300 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, +/* 0x4310 */ 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4320 */ 48, 49, 98, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, +/* 0x4330 */ 50, 32, 32, 32, 32, 32, 46,116,101,120,116, 43, 48,120,102,102, +/* 0x4340 */ 102,102,102,102,102,102,102,102,102,102,102,102,102, 99, 10, 48, +/* 0x4350 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 55, 32, +/* 0x4360 */ 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, +/* 0x4370 */ 32, 32, 46,116,101,120,116, 43, 48,120,102,102,102,102,102,102, +/* 0x4380 */ 102,102,102,102,102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, +/* 0x4390 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 53, 99, 32, 82, 95, 88, 56, +/* 0x43a0 */ 54, 95, 54, 52, 95, 80, 67, 51, 50, 32, 32, 32, 32, 32, 46,116, +/* 0x43b0 */ 101,120,116, 43, 48,120,102,102,102,102,102,102,102,102,102,102, +/* 0x43c0 */ 102,102,102,102,102, 99, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x43d0 */ 48, 48, 48, 48, 48, 53, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, +/* 0x43e0 */ 95, 80, 67, 51, 50, 32, 32, 32, 32, 32,109,112,114,111,116,101, +/* 0x43f0 */ 99,116, 43, 48,120,102,102,102,102,102,102,102,102,102,102,102, +/* 0x4400 */ 102,102,102,102, 99, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, +/* 0x4410 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 76, +/* 0x4420 */ 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58, 10, 79, 70, 70, 83, +/* 0x4430 */ 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, +/* 0x4440 */ 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, +/* 0x4450 */ 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4460 */ 48, 48, 48, 48, 54, 32, 82, 95, 88, 56, 54, 95, 54, 52, 95, 80, +/* 0x4470 */ 67, 51, 50, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, +/* 0x4480 */ 51, 48, 43, 48,120, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, +/* 0x4490 */ 48, 48, 48, 49, 50, 10 }; diff --git a/src/stub/src/amd64-linux.elf-entry.S b/src/stub/src/amd64-linux.elf-entry.S index 5cfbaadf..d7e73e39 100644 --- a/src/stub/src/amd64-linux.elf-entry.S +++ b/src/stub/src/amd64-linux.elf-entry.S @@ -31,6 +31,20 @@ #include "arch/amd64/macros.S" #include "arch/amd64/regs.h" +NBPW= 8 +.macro jmps target + .byte 0xeb, \target - . - 1 +.endm + +/* These from /usr/include/unistd_64.h */ +__NR_memfd_create= 319 // 0x13f +__NR_ftruncate= 77 +__NR_exit= 60 +__NR_mprotect= 10 +__NR_mmap= 9 +__NR_close= 3 +__NR_open= 2 +__NR_write= 1 sz_Ehdr= 64 e_phnum= 56 @@ -46,10 +60,13 @@ sz_b_info= 12 sz_cpr= 4 b_method= 8 +AT_PAGESZ= 6 + PROT_READ= 1 PROT_WRITE= 2 PROT_EXEC= 4 +MAP_SHARED= 1 MAP_PRIVATE= 2 MAP_FIXED= 0x10 MAP_ANONYMOUS= 0x20 @@ -58,96 +75,207 @@ SYS_mmap= 9 // 64-bit mode only! FD_stderr= 2 -PAGE_SHIFT= 12 -PAGE_MASK= (~0<likely, n==>unlikely} */ -/* Prediction omitted for now. */ -/* On refill: prefetch next byte, for latency reduction on literals and offsets. */ -#define jnextb0np jnextb0yp -#define jnextb0yp GETBITp; jnc -#define jnextb1np jnextb1yp -#define jnextb1yp GETBITp; jc -#define GETBITp \ - addl bits,bits; jnz 0f; \ - movl (%rsi),bits; subq $-4,%rsi; \ - adcl bits,bits; movb (%rsi),%dl; \ -0: -/* Same, but without prefetch (not useful for length of match.) */ -#define jnextb0n jnextb0y -#define jnextb0y GETBIT; jnc -#define jnextb1n jnextb1y -#define jnextb1y GETBIT; jc -#define GETBIT \ - addl bits,bits; jnz 0f; \ - movl (%rsi),bits; subq $-4,%rsi; \ - adcl bits,bits; \ -0: +#define GETBIT call *%rdx +#define jnextb0 GETBIT; jnc +#define jnextb1 GETBIT; jc /* rotate next bit into bottom bit of reg */ -#define getnextbp(reg) call *%r11; adcl reg,reg -#define getnextb(reg) getnextbp(reg) +#define getnextb(reg) GETBIT; adcl reg,reg + xor bits,bits // empty; force refill + xor len,len // create loop invariant + lea getbit(%rip),%rdx + push $-1; pop dispq // initial displacement + cld // paranoia + .byte 0xa8 // "testb $... ,%al" ==> "jmp top_n2b" +lit_n2b: + movsb // *dst++ = *src++; +top_n2b: + jnextb1 lit_n2b + lea 1(lenq),off # [len= 0] off= 1 +offmore_n2b: + getnextb(off) + jnextb0 offmore_n2b + + subl $ 3,off; jc len_n2b # use previous offset + shll $ 8,off; lodsb # off is %eax, so 'lodsb' is "off |= *src++;" + xorl $~0,off; jz eof_n2b + movslq off,dispq # XXX: 2GB; (note propagation of negative sign!) +// for 4GB, replace the 'movslq' with: +// pushq $~0 # 64 bits all '1' +// movl off,(%rsp) # replace lo-order 32 bits +// popq dispq +len_n2b: + lea 1(lenq),off # [len= 0] off= 1 + getnextb(len); getnextb(len) # two bits; cc set on result + jnz gotlen_n2b # raw 1,2,3 ==> 2,3,4 + movl off,len # len= 1, the msb + addl $3-1,off # raw 2.. ==> 5.. +lenmore_n2b: + getnextb(len) + jnextb0 lenmore_n2b +gotlen_n2b: + cmpl $-0xd00,displ # XXX: 2GB; for 4GB: use 'cmpq' + adcl off,len # len += off + (disp < -0xd00) + + push %rsi // MATCH_06 + lea (%rdi,dispq),%rsi + rep; movsb + pop %rsi // MATCH_06 + + jmp top_n2b + +eof_n2b: + pop old_sp // MATCH_10 + pop %rcx // MATCH_11 &input_eof + cmp %rcx,%rsi; je 0f; hlt; 0: // test for ending in correct place + //FIXME: check dst, too + +// Write de-compressed 'fold' to file + mov F_PMASK(old_sp),%rax; mov %rax,(%rsp) // propagate PAGE_MASK + mov F_LENU(old_sp),%arg3 // LENU + push %rsp; pop %arg2 // buffer + mov %r12,%arg1 // mfd + push $__NR_write; pop %rax; call sys_check +// de-alloca() + push old_sp; pop %rsp + +// Map unfolded code the SELinux way + sub %arg6l,%arg6l // 0 offset + mov %r12,%arg5 // mfd + push $MAP_SHARED; pop %sys4 + push %arg3; pop %arg2 // LENU + push $PROT_READ|PROT_EXEC; pop %arg3 // FIXME: add PROT_WRITE for DEBUG only + subl %edi,%edi // (%arg1)dst = 0; // kernel chooses addr + push $__NR_mmap; pop %rax; call sys_check + push %rax // MATCH_12 + mov %rax,F_ADRU(old_sp) + + push %arg5; pop %arg1 // mfd + push $__NR_close; pop %rax; syscall + +// Use the copy. + pop %rax // MATCH_12 ADRU + add $D_FOLD,%rax // beyond .data + jmp *%rax // goto unfolded stub + +zfind: + mov (%rdi),%rax; add $NBPW,%rdi + test %rax,%rax; jne zfind + ret + +sys_check: + push %rax // save __NR_ for debug + syscall + pop %rcx // recover __NR_ for debug + cmp $-1<<12,%rax; jb 0f; hlt; 0: + ret + +here: // OUT: %rdi= (2+ retaddrj) without disturbing shadow stack + mov (%rsp),%rdi + scasw // over jmp.s + ret getbit: addl bits,bits; jz refill // Carry= next bit @@ -155,133 +283,15 @@ getbit: refill: movl (%rsi),bits; subq $-4,%rsi // next 32 bits; set Carry adcl bits,bits // LSB= 1 (CarryIn); CarryOut= next bit - movb (%rsi),%dl // speculate: literal, or bottom 8 bits of offset rep; ret -copy: // In: len, %rdi, dispq; Out: 0==len, %rdi, dispq; trashes %rax, %rdx - leaq (%rdi,dispq),%rax; cmpl $5,len // <=3 is forced - movb (%rax),%dl; jbe copy1 // <=5 for better branch predict - cmpq $-4,dispq; ja copy1 // 4-byte chunks would overlap - subl $4,len // adjust for termination cases -copy4: - movl (%rax),%edx; addq $4, %rax; subl $4,len - movl %edx,(%rdi); leaq 4(%rdi),%rdi; jnc copy4 - addl $4,len; movb (%rax),%dl; jz copy0 -copy1: - incq %rax; movb %dl,(%rdi); subl $1,len - movb (%rax),%dl - leaq 1(%rdi),%rdi; jnz copy1 -copy0: - rep; ret - -setup: - cld - pop %r11 // addq $ getbit - ra_setup,%r11 # &getbit - - section NRV2E -#include "arch/amd64/nrv2e_d.S" - - section NRV2D -#include "arch/amd64/nrv2d_d.S" - - section NRV2B -#include "arch/amd64/nrv2b_d.S" - -#include "arch/amd64/lzma_d.S" - - section NRV_TAIL - // empty - - section ELFMAINY -eof: - pop %rcx // &input_eof - movq %rsi,%rax; subq %rcx,%rax // src -= eof; // return 0: good; else: bad - pop %rdx; subq %rdx,%rdi // dst -= original dst - pop %rcx; movl %edi,(%rcx) // actual length used at dst XXX: 4GB - pop %rbx; pop %rbp - ret - -/* These from /usr/include/asm-x86_64/unistd.h */ -__NR_exit= 60 -__NR_mmap= 9 -__NR_mprotect= 10 -__NR_open= 2 -__NR_write= 1 - -msg_SELinux: - push $ L71 - L70; pop %arg3 // length - call L72 -L70: - .asciz "PROT_EXEC|PROT_WRITE failed.\n" -L71: -L72: - pop %arg2 // message text -L75: - push $FD_stderr; pop %arg1 - push $ __NR_write; pop %rax - syscall -die: - push $127; pop %arg1 - push $ __NR_exit; pop %rax - syscall - // IDENTSTR goes here section ELFMAINZ -// Decompress the rest of this loader, and jump to it. -unfold: // IN: rbp= &f_exp; rsp/ &O_BINFO,%entry - pop %rsi // &(O_BINFO | is_ptinterp | unmap_all_pages) - lodsl; and $~(is_ptinterp|unmap_all_pages),%eax; movl %eax,%r14d // O_BINFO - push %rsi; pop %rbx // &b_info of folded decompressor - movl (%rsi),%edx // .sz_unc - - lea sz_pack2 - f_exp(%rbp),%rcx // &sz_pack2 - movl (%rcx),%r15d // sz_pack2: length before stub - subq %r15,%rcx // elfaddr= &Elf64_Ehdr of this stub - subl %r14d,%r15d // LENX= sz_pack2 - O_BINFO - addq %rcx,%r14 // ADRX= elfaddr + O_BINFO - push %rdx // LENU - push %rax // %ADRU - push $-1 // space for %fd - push %rcx // elfaddr - -// Reserve space for unfolded stub. - subq %arg6,%arg6 // 0 offset - orl $-1,%arg5l // fd - push $MAP_PRIVATE|MAP_ANONYMOUS; pop %sys4 - push %rdx; pop %arg2 // len - push $PROT_READ|PROT_WRITE; pop %arg3 - subl %arg1l,%arg1l // 0; kernel chooses addr - push $__NR_mmap; pop %rax; syscall - movq %rax,2*8(%rsp) // ADRU - -// Unfold - push %rax; pop %arg3 // dst= new unfold - push %rbx; pop %rsi - lodsl; push %rax; movq %rsp,%arg4 // P_13 .sz_unc; &dstlen - movq %arg3,%r13 // execute here - lodsl; push %rax // P_14 tmp= .sz_cpr - lodsl; xchg %eax,%arg5l // .b_method - movq %rsi,%arg1 // src - pop %arg2 // P_14 srclen - call *%rbp // f_exp - pop %rcx // P_13 toss .sz_unc - -// PROT_EXEC - movq 3*8(%rsp),%arg2 // LENU - movq 2*8(%rsp),%arg1 // ADRU - push $PROT_READ|PROT_EXEC; pop %arg3 - push $__NR_mprotect; pop %rax; syscall - -// Use the copy. -// %r14= ADRX; %r15= LENX; -// rsp/ elfaddr,fd,ADRU,LENU,%entry - jmp *%r13 - -main: - pop %rbp // &f_exp - call unfold + .balign 4 +o_binfo: .long O_BINFO // offset of b_info for .text | is_ptinerp | unmap_all_pages +FOLD: // { b_info={sz_unc, sz_cpr, {4 char}}, folded_loader...} /*__XTHEENDX__*/ diff --git a/src/stub/src/amd64-linux.elf-fold.S b/src/stub/src/amd64-linux.elf-fold.S index 0d326589..7d3369a2 100644 --- a/src/stub/src/amd64-linux.elf-fold.S +++ b/src/stub/src/amd64-linux.elf-fold.S @@ -32,9 +32,6 @@ NBPW= 8 #include "arch/amd64/regs.h" PATH_MAX= 4096 // /usr/include/linux/limits.h -PAGE_SHIFT= 12 // /usr/include/sys/user.h -PAGE_SIZE= 1 << PAGE_SHIFT -PAGE_MASK= ~0 << PAGE_SHIFT sz_b_info= 12 sz_unc= 0 @@ -62,61 +59,66 @@ __NR_mmap= 9 __NR_mprotect= 10 __NR_munmap= 11 __NR_brk= 12 +__NR_memfd_create= 0x13f // 319 +__NR_ftruncate= 0x4d // 77 __NR_exit= 60 __NR_readlink= 89 -// IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main) -// %rbx= 4+ &O_BINFO; %rbp= f_exp; %r14= ADRX; %r15= LENX; -// rsp/ elfaddr,%fd,ADRU,LENU,rdx,%entry, argc,argv,0,envp,0,auxv,0,strings - -fold_begin: -//// int3 // DEBUG only - call L90 - .asciz "/proc/self/exe"; .byte 0 // 16 bytes in all -#include "arch/amd64/bxx.S" -L90: - pop %rdx // "/proc/self/eax" - push %r14 // ADRX - push %r15 // LENX - lea 16(%rdx),%rax; push %rax # &amdbxx: f_unf +F_FRAME= 7*NBPW +F_ENTR= 6*NBPW; F_UNMAPA= F_ENTR +F_RDX= 5*NBPW +F_LENU= 4*NBPW +F_ADRU= 3*NBPW +F_ELFA= 2*NBPW +F_LENX= 1*NBPW +F_ADRX= 0*NBPW unmap_all_pages= (1<<1) is_ptinterp= (1<<0) - push %rsp; pop %rsi - testb $unmap_all_pages,-4(%rbx); jnz 0f; sub $PATH_MAX,%rsp; 0: - push %rsp; pop %rdi - push $10; pop %rcx; rep movsq # f_unf,LENX,ADRX,elfaddr,%fd,ADRU,LENU,rdx,%entry,argc - xor %eax,%eax + .balign 4 +PAGE_MASK: .quad -1<<12 // default + +// IN: [ADRX,+LENX): compressed data; [ADRU,+LENU): expanded fold (w/ upx_main) +// %rsp= %rbp= &F_ADRX; %r13= O_BINFO | is_ptinterp | unmap_all_pages + +// no 'section', thus '.text'; also loaded first in amd64-linux.elf-fold.bin. +// Code from amd64-linux.elf-main.c is also .text, and is next. +fold_begin: +//// int3 # DEBUG + mov %r13,F_UNMAPA(%rbp) + mov %r13,%rax; and $is_ptinterp,%eax; or %eax,F_ELFA(%rbp) + mov %rsp,%rsi + testb $unmap_all_pages,F_UNMAPA(%rbp); jnz 0f; sub $PATH_MAX,%rsp; 0: + mov %rsp,%rdi + push $8; pop %rcx; rep movsq # ADRX,LDRX,ELFA,ADRU,LENU,rdx,%entry,argc 0: - cmpq %rax,(%rsi); movsq; jne 0b # move past argv + cmpq $0,(%rsi); movsq; jne 0b # move past argv movq %rdi,%r14 # remember &new_env[0] - testb $unmap_all_pages,-4(%rbx); jnz 0f; stosq; 0: # space for new_env[0] - + testb $unmap_all_pages,F_UNMAPA(%rbp); jnz 0f; stosq; 0: # space for new_env[0] 0: - cmpq %rax,(%rsi); movsq; jne 0b # move past env - mov %rdi,%r12 # &new Elf64_auxv - - push %rsi; pop %arg4 # &old_auxv in case no_env_pse + cmpq $0,(%rsi); movsq; jne 0b # move past env + mov %rdi,%r12 # &old Elf64_auxv + mov %rdi,%arg4 # &auxv in case no_pse_env 0: - cmpq %rax,(%rsi); movsq; movsq; jne 0b # move past auxv + cmpq $0,(%rsi); movsq; movsq; jne 0b # move past auxv mov %rdi,%r15 # beyond auxv mov %rsi,%r13 # beginning of strings - sub %r15,%r12 # -length of auxv + sub %rdi,%r12 # -length of auxv - testb $unmap_all_pages,-4(%rbx); jz env_pse - mov %rdi,%r14; jmp no_env_pse # beyond auxv + testb $unmap_all_pages,F_UNMAPA(%rbp); jz env_pse + or $~0,%ebp; mov %rdi,%r14; jmp no_env_pse # no fd; beyond auxv env_pse: - push %rdx; pop %arg1 # "/proc/self/exe" - push $O_RDONLY; pop %arg2 - call open; mov %rax,4*NBPW(%rsp) # fd + push %rdi # buffer + lea proc_self_exe(%rip),%arg1; sub %arg2l,%arg2l # O_RDONLY + call open; mov %eax,%ebp # fd + pop %arg2 #buffer + movl $-1+ PATH_MAX,%arg3l # buflen - mov %r15,%arg2 # buffer (beyond auxv) - // %arg1 persists from open() push $ __NR_readlink; pop %rax; syscall; testl %eax,%eax; jns 0f // readlink() failed. Set the result equal to the argument. - push %arg1; pop %arg2 # result= "/proc/self/exe" + push %arg1; pop %arg2 # failure result= "/proc/self/exe" push $15; pop %rax # 1+ strlen( ) 0: xchg %eax,%ecx # %ecx= byte count @@ -127,45 +129,50 @@ env_pse: rep movsb # slide up sub $3,%rdi; movl $('='<<24)|(' '<<16)|(' '<<8)|(' '<<0),(%rdi) # env var name mov %rdi,(%r14) # new_env[0] - and $~0<<3,%rdi # align + and $-NBPW,%rdi # align mov %r15,%rcx sub %rsp,%rcx # byte count - mov %ecx,%eax - xor %edi,%eax - xor $NBPW,%eax - and $NBPW,%eax - sub %rax,%rdi # keep 16-byte alignment of %rsp - mov %rdi,%r14 # end of new auxv sub $NBPW,%rdi # &last qword of new auxv lea -NBPW(%r15),%rsi # &last qword of old auxv + + // end of auxv must move by even number of NBPW + mov %edi,%eax + xor %esi,%eax + and $NBPW,%eax + sub %rax,%rdi + shr $3,%rcx; rep movsq lea NBPW(%rdi),%rsp cld - lea (%r14,%r12),%arg4 # &new Elf64_auxv + lea (%r14,%r12),%arg4 # &new Elf64_auxv %r12 dead no_env_pse: - movl -4(%rbx),%eax; and $is_ptinterp,%eax; add %rax,%arg4 - pop %arg6 # f_unf + pop %arg1 # ADRX with lo bits pop %arg2 # LENX - pop %arg1 # ADRX + and $~(is_ptinterp | unmap_all_pages),%arg1 - pop %rax # elfaddr + pop %arg5 # ELFA | is_ptinterp + mov %arg5l,%eax; and $1,%eax # is_ptinterp + or %rax,%arg4 # transfer is_ptinterp to &new_ELF64_auxv + sub %rax,%arg5 # and clear from ELFA + mov %arg5,%r13 # save ELFA subq $ OVERHEAD,%rsp movq %rsp,%arg3 # &ELf64_Ehdr temporary space - push %rax; mov %rax,%r13 # elfaddr 7th arg - - movq %rbp,%arg5 # &decompress: f_expand call upx_main # Out: %rax= entry -/* entry= upx_main(b_info *arg1, total_size arg2, Elf64_Ehdr *arg3, - Elf32_Auxv_t *arg4, f_decompr arg5, f_unf arg6, - Elf64_Addr elfaddr ) +/* entry= upx_main( + b_info *arg1, {%rdi} + total_size arg2, {%rsi} + Elf64_Ehdr *arg3, {%rdx} + Elf32_Auxv_t *arg4, {%rcx} + Elf64_Addr elfaddr {%r8} + ) */ -// rsp/ elfaddr,{OVERHEAD},fd,ADRU,LENU,rdx,%entry, argc,argv,0,envp,0,auxv,0,strings - addq $1*NBPW+OVERHEAD,%rsp # also discard elfaddr - movq %rax,4*NBPW(%rsp) # entry - pop %rbx # fd +// rsp/ {OVERHEAD},ADRU,LENU,rdx,%entry, argc,argv,0,envp,0,auxv,0,strings + addq $OVERHEAD,%rsp # Elf64_Ehdr temporary space + mov %ebp,%ebx # fd + movq %rax,3*NBPW(%rsp) # entry sz_Ehdr= 8*NBPW e_type= 16 @@ -185,7 +192,7 @@ p_memsz= 5*NBPW mov %ebx,%arg5l # fd push $MAP_PRIVATE; pop %arg4 push $PROT_READ; pop %arg3 - mov $PAGE_SIZE,%arg2l + mov $1<<12,%arg2l subl %arg1l,%arg1l # 0 call mmap @@ -197,43 +204,71 @@ no_pse_map: push $__NR_munmap; pop %rax jmp *-NBPW(%r14) # goto: syscall; pop %rdx; ret +get_page_mask: .globl get_page_mask + mov PAGE_MASK(%rip),%rax + ret + + section SYSCALLS +my_bkpt: .globl my_bkpt + int3 // my_bkpt + ret + +proc_self_exe: + .asciz "/proc/self/exe" + +memfd_create: .globl memfd_create + mov $__NR_memfd_create,%eax; jmp sysgo2 + +Pmap: .globl Pmap // page-align the lo end + mov PAGE_MASK(%rip),%rax; not %rax // frag mask + and %arg1l,%eax // frag + sub %rax,%arg1 + add %rax,%arg2 mmap: .globl mmap movb $ __NR_mmap,%al movq %arg4,%sys4 sysgo: # NOTE: kernel demands 4th arg in %sys4, NOT %arg4 movzbl %al,%eax - syscall - cmpq $ PAGE_MASK,%rax; jc no_fail - orq $~0,%rax # failure; IGNORE errno -no_fail: +sysgo2: + push %rax // save __NR_ + syscall // %rax= -errno + pop %rcx // recover __NR_ + cmp $-1<<12,%rax; jb sysOK + cmp $__NR_open,%ecx; je sysOK # ENOENT etc + int3 // %rax= errno; %rcx= __NR_ +sysOK: ret Pprotect: .globl Pprotect - movl $~PAGE_MASK,%ecx // frag mask - and %edi,%ecx // frag - sub %rcx,%rdi - add %rcx,%rsi + mov PAGE_MASK(%rip),%eax; not %eax // frag mask + and %arg1l,%eax // frag + sub %rax,%rdi + add %rax,%rsi jmp mprotect +Punmap: .globl Punmap // page-align the lo end + mov PAGE_MASK(%rip),%eax; not %eax // frag mask + and %arg1l,%eax // frag + sub %rax,%arg1 + add %rax,%arg2 +munmap: .globl munmap + movb $ __NR_munmap,%al; 5: jmp 5f exit: .globl exit movb $ __NR_exit,%al; 5: jmp 5f brk: .globl brk movb $ __NR_brk,%al; 5: jmp 5f close: .globl close movb $ __NR_close,%al; 5: jmp 5f +ftruncate: .globl ftruncate + movb $__NR_ftruncate,%al; 5: jmp 5f open: .globl open movb $ __NR_open,%al; 5: jmp 5f -munmap: .globl munmap - movb $ __NR_munmap,%al; 5: jmp 5f mprotect: .globl mprotect movb $ __NR_mprotect,%al; 5: jmp 5f +Pwrite: .globl Pwrite write: .globl write mov $__NR_write,%al; 5: jmp 5f read: .globl read movb $ __NR_read,%al; 5: jmp sysgo -my_bkpt: .globl my_bkpt - int3 // my_bkpt - ret - /* vim:set ts=8 sw=8 et: */ diff --git a/src/stub/src/amd64-linux.elf-fold.lds b/src/stub/src/amd64-linux.elf-fold.lds index 7a129e83..d5810166 100644 --- a/src/stub/src/amd64-linux.elf-fold.lds +++ b/src/stub/src/amd64-linux.elf-fold.lds @@ -31,18 +31,8 @@ OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") OUTPUT_ARCH(i386:x86-64) /*ENTRY(_start)*/ -PHDRS -{ - text PT_LOAD FILEHDR PHDRS FLAGS ( 5 ) ; /* r-x (no -w-) */ - 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/amd64-linux.elf-main2.c b/src/stub/src/amd64-linux.elf-main2.c new file mode 100644 index 00000000..4369d8ec --- /dev/null +++ b/src/stub/src/amd64-linux.elf-main2.c @@ -0,0 +1,818 @@ +/* amd64-linux.elf-main.c -- stub loader for Linux 64-bit ELF executable + + This file is part of the UPX executable compressor. + + Copyright (C) 1996-2024 Markus Franz Xaver Johannes Oberhumer + Copyright (C) 1996-2024 Laszlo Molnar + Copyright (C) 2000-2024 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 + + */ + +#ifndef DEBUG //{ +#define DEBUG 0 +#endif //} + +#include "include/linux.h" +extern void *memcpy(void *dst, void const *src, size_t n); +// Pprotect is mprotect but uses page-aligned address (Linux requirement) +extern unsigned Pprotect(void *, size_t, unsigned); +//extern void *Pmap(void *, size_t, unsigned, unsigned, int, size_t); +//extern int Punmap(void *, size_t); +extern size_t Pwrite(unsigned, void const *, size_t); +# define mmap_privanon(addr,len,prot,flgs) mmap((addr),(len),(prot), \ + MAP_PRIVATE|MAP_ANONYMOUS|(flgs),-1,0) + +extern void my_bkpt(void *, ...); + +#if defined(__powerpc64__) //}{ +#define addr_string(string) ({ \ + char const *str; \ + asm("bl 0f; .string \"" string "\"; .balign 4; 0: mflr %0" \ +/*out*/ : "=r"(str) \ +/* in*/ : \ +/*und*/ : "lr"); \ + str; \ +}) +#elif defined(__x86_64) //}{ +#define addr_string(string) ({ \ + char const *str; \ + asm("call 0f; .asciz \"" string "\"; 0: pop %0" \ +/*out*/ : "=r"(str) ); \ + str; \ +}) +#elif defined(__aarch64__) //}{ +#define addr_string(string) ({ \ + char const *str; \ + asm("bl 0f; .string \"" string "\"; .balign 4; 0: mov %0,x30" \ +/*out*/ : "=r"(str) \ +/* in*/ : \ +/*und*/ : "x30"); \ + str; \ +}) +#else //}{ +#error; +#endif //} +#if !DEBUG //{ +#define DPRINTF(fmt, args...) /*empty*/ +#else //}{ +// DPRINTF is defined as an expression using "({ ... })" +// so that DPRINTF can be invoked inside an expression, +// and then followed by a comma to ignore the return value. +// The only complication is that percent and backslash +// must be doubled in the format string, because the format +// string is processd twice: once at compile-time by 'asm' +// to produce the assembled value, and once at runtime to use it. +#if defined(__powerpc64__) //{ +#define DPRINTF(fmt, args...) ({ \ + char const *r_fmt; \ + asm("bl 0f; .string \"" fmt "\"; .balign 4; 0: mflr %0" \ +/*out*/ : "=r"(r_fmt) \ +/* in*/ : \ +/*und*/ : "lr"); \ + dprintf(r_fmt, args); \ +}) +#elif defined(__x86_64) //}{ +#define DPRINTF(fmt, args...) ({ \ + char const *r_fmt; \ + asm("call 0f; .asciz \"" fmt "\"; 0: pop %0" \ +/*out*/ : "=r"(r_fmt) ); \ + dprintf(r_fmt, args); \ +}) +#elif defined(__aarch64__) //}{ +#define DPRINTF(fmt, args...) ({ \ + char const *r_fmt; \ + asm("bl 0f; .string \"" fmt "\"; .balign 4; 0: mov %0,x30" \ +/*out*/ : "=r"(r_fmt) \ +/* in*/ : \ +/*und*/ : "x30"); \ + dprintf(r_fmt, args); \ +}) + +#endif //} + +static int dprintf(char const *fmt, ...); // forward +#endif /*}*/ + +extern void my_bkpt(void *, ...); + +/************************************************************************* +// configuration section +**************************************************************************/ + +// In order to make it much easier to move this code at runtime and execute +// it at an address different from it load address: there must be no +// static data, and no string constants. + +#define ElfW(sym) Elf64_ ## sym + +#include "MAX_ELF_HDR.c" + +/************************************************************************* +// "file" util +**************************************************************************/ + +typedef struct { + size_t size; // must be first to match size[0] uncompressed size + char *buf; +} Extent; + + +static void +xread(Extent *x, char *buf, size_t count) +{ + DPRINTF("xread x.size=%%x x.buf=%%p buf=%%p count=%%x\\n", + x->size, x->buf, buf, count); + char *p=x->buf, *q=buf; + size_t j; + if (x->size < count) { + exit(127); + } + for (j = count; 0!=j--; ++p, ++q) { + *q = *p; + } + x->buf += count; + x->size -= count; + DPRINTF("xread done count=%%x\\n", count); +} + + +/************************************************************************* +// util +**************************************************************************/ + +#if !DEBUG //{ save space +#define ERR_LAB error: exit(127); +#define err_exit(a) goto error +#else //}{ save debugging time +#define ERR_LAB /*empty*/ +static void +err_exit(int a) +{ + (void)a; // debugging convenience + DPRINTF("err_exit %%d\\n", a); + exit(127); +} +#endif //} + +/************************************************************************* +// UPX & NRV stuff +**************************************************************************/ + +extern size_t get_page_mask(void); // variable page size AT_PAGESZ; see *-fold.S + +int f_expand( // .globl in $(ARCH)-expand.S + nrv_byte const *binfo, nrv_byte *dst, size_t *dstlen); + +static void +unpackExtent( + Extent *const xi, // input includes struct b_info + Extent *const xo // output +) +{ + while (xo->size) { + DPRINTF("unpackExtent xi=(%%p %%p) xo=(%%p %%p)\\n", + xi->size, xi->buf, xo->size, xo->buf); + struct b_info h; + // Note: if h.sz_unc == h.sz_cpr then the block was not + // compressible and is stored in its uncompressed form. + + // Read and check block sizes. + xread(xi, (char *)&h, sizeof(h)); + DPRINTF("h.sz_unc=%%x h.sz_cpr=%%x h.b_method=%%x\\n", + h.sz_unc, h.sz_cpr, h.b_method); + if (h.sz_unc == 0) { // uncompressed size 0 -> EOF + if (h.sz_cpr != UPX_MAGIC_LE32) // h.sz_cpr must be h->magic + err_exit(2); + if (xi->size != 0) // all bytes must be written + err_exit(3); + break; + } + if (h.sz_cpr <= 0) { + err_exit(4); +ERR_LAB + } + if (h.sz_cpr > h.sz_unc + || h.sz_unc > xo->size ) { + err_exit(5); + } + // Now we have: + // assert(h.sz_cpr <= h.sz_unc); + // assert(h.sz_unc > 0 && h.sz_unc <= blocksize); + // assert(h.sz_cpr > 0 && h.sz_cpr <= blocksize); + + if (h.sz_cpr < h.sz_unc) { // Decompress block + size_t out_len = h.sz_unc; // EOF for lzma + int const j = f_expand((unsigned char *)xi->buf - sizeof(h), + (unsigned char *)xo->buf, &out_len); + if (j != 0 || out_len != (nrv_uint)h.sz_unc) { + DPRINTF(" j=%%x out_len=%%x &h=%%p\\n", j, out_len, &h); + err_exit(6); + } + xi->buf += h.sz_cpr; + xi->size -= h.sz_cpr; + } + else { // copy literal block + DPRINTF(" copy %%p %%p %%p\\n", xi->buf, xo->buf, h.sz_cpr); + xread(xi, xo->buf, h.sz_cpr); + } + xo->buf += h.sz_unc; + xo->size -= h.sz_unc; + } +} + +#if defined(__x86_64__) //{ +static void * +make_hatch_x86_64( + ElfW(Phdr) const *const phdr, + char *next_unc, + unsigned const frag_mask +) +{ + char *hatch = next_unc; + unsigned const sz_code = 4; + DPRINTF("make_hatch %%p %%p %%x\\n", phdr, next_unc, frag_mask); + if (phdr->p_type==PT_LOAD && phdr->p_flags & PF_X) { + if (sz_code <= (frag_mask & -(long)hatch)) { + ((long *)hatch)[0] = 0xc35a050f; // syscall; pop %arg3{%rdx); ret + } + else { // Does not fit at hi end of .text, so must use a new page "permanently" + int mfd = memfd_create(addr_string("upx"), 0); // the directory entry + write(mfd, addr_string("\x0f\x05\x5a\xc3"), sz_code); + hatch = mmap(0, sz_code, PROT_READ|PROT_EXEC, MAP_SHARED, mfd, 0); + close(mfd); + } + } + DPRINTF("hatch=%%p\\n", hatch); + return hatch; +} +#elif defined(__powerpc64__) //}{ +static void * +make_hatch_ppc64( + ElfW(Phdr) const *const phdr, + char *next_unc, + unsigned const frag_mask +) +{ + unsigned *hatch = (unsigned *)(~3& (3+ (long)next_unc)); + unsigned const *code; + unsigned const sz_code = 4*4; + asm("bl 0f; \ + sc; \ + mr 12,31; \ + li 4,0; \ + blr; \ + 0: mflr %0 " +/*out*/ : "=r"(code) +/* in*/ : +/*und*/ : "lr"); + DPRINTF("make_hatch %%p %%p %%x\\n",phdr,next_unc,frag_mask); + if (phdr->p_type==PT_LOAD && phdr->p_flags & PF_X) { + if (sz_code <= (frag_mask & -(long)hatch)) { + memcpy(hatch, code, sz_code); + } + else { // Does not fit at hi end of .text, so must use a new page "permanently" + int mfd = memfd_create(addr_string("upx"), 0); // the directory entry + write(mfd, code, sz_code); + hatch = mmap(0, sz_code, PROT_READ|PROT_EXEC, MAP_SHARED, mfd, 0); + close(mfd); + } + } + DPRINTF("hatch=%%p\\n", hatch); + return hatch; +} +#elif defined(__aarch64__) //{ +#define NBPI 4 +#define NINSTR 3 +static void * +make_hatch_arm64( + ElfW(Phdr) const *const phdr, + char *next_unc, + unsigned const frag_mask +) +{ + unsigned *hatch = (unsigned *)(~3& (3+ (long)next_unc)); + unsigned const *code; + unsigned const sz_code = 2*4; + asm ("bl 0f; \ + svc #0; \ + br x30; \ + 0: mov %0,x30" +/*out*/ : "=r"(code) +/* in*/ : +/*und*/ : ); + DPRINTF("make_hatch %%p %%p %%x\\n",phdr,next_unc,frag_mask); + if (phdr->p_type==PT_LOAD && phdr->p_flags & PF_X) { + if (sz_code <= (frag_mask & -(long)hatch)) { + memcpy(hatch, code, sz_code); + } + else { // Does not fit at hi end of .text, so must use a new page "permanently" + int mfd = memfd_create(addr_string("upx"), 0); // the directory entry + write(mfd, code, sz_code); + hatch = mmap(0, sz_code, PROT_READ|PROT_EXEC, MAP_SHARED, mfd, 0); + close(mfd); + } + } + DPRINTF("hatch=%%p\\n", hatch); + return hatch; +} +#undef NBPI +#undef NINSTR +#endif //} + +#if defined(__powerpc64__) || defined(__aarch64__) //{ bzero +static void +upx_bzero(char *p, size_t len) +{ + DPRINTF("bzero %%x %%x\\n", p, len); + if (len) do { + *p++= 0; + } while (--len); +} +#define bzero upx_bzero +#else //}{ +#define bzero(a,b) __builtin_memset(a,0,b) +#endif //} + +static void +auxv_up(ElfW(auxv_t) *av, unsigned const type, uint64_t const value) +{ + if (!av || (1& (size_t)av)) { // none, or inhibited for PT_INTERP + return; + } + DPRINTF("\\nauxv_up %%d %%p\\n", type, value); + // Multiple slots can have 'type' which wastes space but is legal. + // rtld (ld-linux) uses the last one, so we must scan the whole table. + Elf64_auxv_t *ignore_slot = 0; + int found = 0; + for (;; ++av) { + DPRINTF(" %%d %%p\\n", av->a_type, av->a_un.a_val); + if (av->a_type == type) { + av->a_un.a_val = value; + ++found; + } + else if (av->a_type == AT_IGNORE) { + ignore_slot = av; + } + if (av->a_type==AT_NULL) { // done scanning + if (found) { + return; + } + if (ignore_slot) { + ignore_slot->a_type = type; + ignore_slot->a_un.a_val = value; + return; + } + err_exit(20); +ERR_LAB + return; + } + } +} + +// Segregate large local array, to avoid code bloat due to large displacements. +// Not 'static' to disaable inlining, to control sizeof stack frame in callers. +/*static*/ void +underlay(unsigned size, char *ptr, unsigned len) // len <= PAGE_SIZE +{ + DPRINTF("underlay size=%%u ptr=%%p len=%%u\\n", size, ptr, len); + unsigned saved[4096/sizeof(unsigned)]; + memcpy(saved, ptr, len); + mmap(ptr, size, PROT_WRITE|PROT_READ, + MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); + memcpy(ptr, saved, len); +} + +#if 0 //{ +// Exchange the bits with values 4 (PF_R, PROT_EXEC) and 1 (PF_X, PROT_READ) +// Use table lookup into a PIC-string that pre-computes the result. +unsigned PF_TO_PROT(unsigned flags) +{ + char const *table = addr_string("\x80\x04\x02\x06\x01\x05\x03\x07"); + return 7& table[flags & (PF_R|PF_W|PF_X)]; +} +#else //}{ +// The PF_* and PROT_* bits are {1,2,4}; the conversion table fits in 32 bits. +#define REP8(x) \ + ((x)|((x)<<4)|((x)<<8)|((x)<<12)|((x)<<16)|((x)<<20)|((x)<<24)|((x)<<28)) +#define EXP8(y) \ + ((1&(y)) ? 0xf0f0f0f0 : (2&(y)) ? 0xff00ff00 : (4&(y)) ? 0xffff0000 : 0) +#define PF_TO_PROT(pf) \ + ((PROT_READ|PROT_WRITE|PROT_EXEC) & ( \ + ( (REP8(PROT_EXEC ) & EXP8(PF_X)) \ + |(REP8(PROT_READ ) & EXP8(PF_R)) \ + |(REP8(PROT_WRITE) & EXP8(PF_W)) \ + ) >> ((pf & (PF_R|PF_W|PF_X))<<2) )) +#endif //} + +// Find convex hull of PT_LOAD (the minimal interval which covers all PT_LOAD), +// and mmap that much, to be sure that a kernel using exec-shield-randomize +// won't place the first piece in a way that leaves no room for the rest. +static ElfW(Addr) // returns relocation constant +xfind_pages(unsigned mflags, ElfW(Phdr) const *phdr, int phnum, + ElfW(Addr) *const p_brk + , ElfW(Addr) const elfaddr +) +{ + ElfW(Addr) lo= ~0, hi= 0, addr= 0; + mflags += MAP_PRIVATE | MAP_ANONYMOUS; // '+' can optimize better than '|' + DPRINTF("xfind_pages %%x %%p %%d %%p %%p\\n", mflags, phdr, phnum, elfaddr, p_brk); + for (; --phnum>=0; ++phdr) if (PT_LOAD==phdr->p_type) { + DPRINTF(" p_vaddr=%%p p_memsz=%%p\\n", phdr->p_vaddr, phdr->p_memsz); + if (phdr->p_vaddr < lo) { + lo = phdr->p_vaddr; + } + if (hi < (phdr->p_memsz + phdr->p_vaddr)) { + hi = phdr->p_memsz + phdr->p_vaddr; + } + } + size_t PMASK = get_page_mask(); + lo -= ~PMASK & lo; // round down to page boundary + hi = PMASK & (hi - lo - PMASK -1); // page length + if (MAP_FIXED & mflags) { + addr = lo; + } + else if (0==lo) { // -pie ET_DYN + addr = elfaddr; + if (addr) { + mflags |= MAP_FIXED; + } + } + DPRINTF(" addr=%%p lo=%%p hi=%%p\\n", addr, lo, hi); + // PROT_WRITE allows testing of 64k pages on 4k Linux + addr = (ElfW(Addr))mmap((void *)addr, hi, (DEBUG ? PROT_WRITE : PROT_NONE), // FIXME XXX EVIL + mflags, -1, 0); + DPRINTF(" addr=%%p\\n", addr); + *p_brk = hi + addr; // the logical value of brk(0) + return (ElfW(Addr))(addr - lo); +} + +static ElfW(Addr) // entry address +do_xmap( + ElfW(Ehdr) const *const ehdr, + Extent *const xi, + int const fdi, + ElfW(auxv_t) *const av, + ElfW(Addr) *const p_reloc +) +{ + ElfW(Phdr) const *phdr = (ElfW(Phdr) const *)(void const *)(ehdr->e_phoff + + (char const *)ehdr); + ElfW(Addr) v_brk = 0; + ElfW(Addr) reloc = 0; + if (xi) { // compressed main program: + // C_BASE space reservation, C_TEXT compressed data and stub + ElfW(Addr) ehdr0 = *p_reloc; // the 'hi' copy! + ElfW(Phdr) *phdr0 = (ElfW(Phdr) *)(1+ (ElfW(Ehdr) *)ehdr0); // cheats .e_phoff + // Clear the 'lo' space reservation for use by PT_LOADs + ehdr0 -= phdr0[1].p_vaddr; // the 'lo' copy + if (ET_EXEC == ehdr->e_type) { + ehdr0 = phdr0[0].p_vaddr; + } + else { + reloc = ehdr0; + } + v_brk = phdr0->p_memsz + ehdr0; + munmap((void *)ehdr0, phdr0->p_memsz); + } + else { // PT_INTERP + DPRINTF("INTERP\\n", 0); + reloc = xfind_pages( + ((ET_DYN!=ehdr->e_type) ? MAP_FIXED : 0), phdr, ehdr->e_phnum, &v_brk, *p_reloc + ); + } + DPRINTF("do_xmap ehdr=%%p xi=%%p(%%x %%p) fdi=%%x\\n" + " av=%%p reloc=%%p p_reloc=%%p/%%p\\n", + ehdr, xi, (xi? xi->size: 0), (xi? xi->buf: 0), fdi, + av, reloc, p_reloc, *p_reloc); + + size_t const page_mask = get_page_mask(); + int j; + for (j=0; j < ehdr->e_phnum; ++phdr, ++j) + if (xi && PT_PHDR==phdr->p_type) { + auxv_up(av, AT_PHDR, phdr->p_vaddr + reloc); + } else + if (PT_LOAD==phdr->p_type && phdr->p_memsz != 0) { + unsigned const prot = PF_TO_PROT(phdr->p_flags); + DPRINTF("\\n\\nLOAD@%%p p_offset=%%p p_vaddr=%%p p_filesz=%%p" + " p_memsz=%%p p_flags=%%x prot=%%x\\n", + phdr, phdr->p_offset, phdr->p_vaddr, phdr->p_filesz, + phdr->p_memsz, phdr->p_flags, prot); + if (xi && !phdr->p_offset /*&& ET_EXEC==ehdr->e_type*/) { // 1st PT_LOAD + // ? Compressed PT_INTERP must not overwrite values from compressed a.out? + auxv_up(av, AT_PHDR, phdr->p_vaddr + reloc + ehdr->e_phoff); + auxv_up(av, AT_PHNUM, ehdr->e_phnum); + auxv_up(av, AT_PHENT, ehdr->e_phentsize); /* ancient kernels might omit! */ + //auxv_up(av, AT_PAGESZ, PAGE_SIZE); /* ld-linux.so.2 does not need this */ + } + Extent xo; + size_t mlen = xo.size = phdr->p_filesz; + char * addr = xo.buf = reloc + (char *)phdr->p_vaddr; + // xo.size, xo.buf are not changed except by unpackExtent() + char *const hi_addr = phdr->p_memsz + addr; // end of local .bss + char *addr2 = mlen + addr; // end of local .data + size_t frag = ~page_mask & (ElfW(Addr))addr; + mlen += frag; + addr -= frag; + +#if defined(__powerpc64__) || defined(__aarch64__) + // Round up to hardware PAGE_SIZE; allows emulator with smaller. + // But (later) still need bzero when .p_filesz < .p_memsz . + mlen += -(mlen + (size_t)addr) &~ page_mask; + DPRINTF(" mlen=%%p\\n", mlen); +#endif + + DPRINTF("mmap addr=%%p mlen=%%p offset=%%p frag=%%p prot=%%x\\n", + addr, mlen, phdr->p_offset - frag, frag, prot); + int mfd = 0; + if (xi && phdr->p_flags & PF_X) { // SELinux + // Cannot set PROT_EXEC except via mmap() into a region (Linux "vma") + // that has never had PROT_WRITE. So use a Linux-only "memory file" + // to hold the contents. + mfd = memfd_create(addr_string("upx"), 0); // the directory entry + ftruncate(mfd, mlen); // Allocate the pages in the file. + if (frag) { + write(mfd, addr, frag); // Save lo fragment of contents on first page. + } + if (addr != mmap(addr, mlen, PROT_READ|PROT_WRITE, MAP_FIXED|MAP_SHARED, mfd, 0)) { + err_exit(7); + } + } + else { + unsigned tprot = prot; + // Notice that first 4 args are same: mmap vs mmap_privanon + if (xi) { + tprot |= PROT_WRITE; // De-compression needs Write + tprot &= ~PROT_EXEC; // Avoid simultaneous Write and eXecute + if (addr != mmap_privanon(addr, mlen, tprot, MAP_FIXED|MAP_PRIVATE)) { + err_exit(11); + } + } + else if (addr != mmap(addr, mlen, tprot, MAP_FIXED|MAP_PRIVATE, + fdi, phdr->p_offset - frag)) { + err_exit(8); + } + } + DPRINTF("addr= %%p\\n", addr); + + if (xi) { + DPRINTF("before unpack xi=(%%p %%p xo=(%%p %%p)\\n", xi->size, xi->buf, xo.size, xo.buf); + unpackExtent(xi, &xo); // updates xi and xo + DPRINTF(" after unpack xi=(%%p %%p xo=(%%p %%p)\\n", xi->size, xi->buf, xo.size, xo.buf); + } + if (PROT_WRITE & prot) { // note: read-only .bss not supported here + // Clear to end-of-page (first part of .bss or &_end) + unsigned hi_frag = -(long)addr2 &~ page_mask; + bzero(addr2, hi_frag); + addr2 += hi_frag; // will be page aligned + } + + if (xi && phdr->p_flags & PF_X) { +#if defined(__x86_64) //{ + void *const hatch = make_hatch_x86_64(phdr, xo.buf, ~page_mask); +#elif defined(__powerpc64__) //}{ + void *const hatch = make_hatch_ppc64(phdr, xo.buf, ~page_mask); +#elif defined(__aarch64__) //}{ + void *const hatch = make_hatch_arm64(phdr, xo.buf, ~page_mask); +#endif //} + if (0!=hatch) { + // Always update AT_NULL, especially for compressed PT_INTERP. + // Clearing lo bit of av is for i386 only; else is superfluous. + auxv_up((ElfW(auxv_t) *)(~1 & (size_t)av), AT_NULL, (size_t)hatch); + } + + // SELinux: Map the contents of mfd as per *phdr. + DPRINTF("hatch protect addr=%%p mlen=%%p\\n", addr, mlen); + munmap(addr, mlen); // toss the VMA that has PROT_WRITE + if (addr != mmap(addr, mlen, prot, MAP_FIXED|MAP_SHARED, mfd, 0)) { + err_exit(9); + } + close(mfd); + } + else if ((PROT_WRITE|PROT_READ) != prot + && 0!=Pprotect(addr, mlen, prot)) { + err_exit(10); +ERR_LAB + } + if (addr2 < hi_addr) { // pages for .bss beyond last page for p_filesz + DPRINTF("zmap addr2=%%p len=%%p\\n", addr2, hi_addr - addr2); + if (addr2 != mmap_privanon(addr2, hi_addr - addr2, prot, MAP_FIXED)) { + err_exit(10); + } + } + } + if (xi && ET_DYN!=ehdr->e_type) { + // Needed only if compressed shell script invokes compressed shell. + // Besides, fold.S needs _Ehdr that is tossed + // do_brk((void *)v_brk); + } + if (p_reloc) { + *p_reloc = reloc; + } + return ehdr->e_entry + reloc; +} + + +/************************************************************************* +// upx_main - called by our entry code +// +// This function is optimized for size. +**************************************************************************/ + +void * +upx_main( // returns entry address +/*arg1*/ struct b_info const *const bi, // 1st block header +/*arg2*/ size_t const sz_compressed, // total length +/*arg3*/ ElfW(Ehdr) *const ehdr, // temp char[sz_ehdr] for decompressing +/*arg4*/ ElfW(auxv_t) *const av +#if defined(__x86_64) //{ +/*arg5*/ , ElfW(Addr) elfaddr // In: &ElfW(Ehdr) for stub +#elif defined(__powerpc64__) //}{ +/*arg5*/ , ElfW(Addr) *p_reloc // In: &ElfW(Ehdr) for stub; Out: 'slide' for PT_INTERP +#elif defined(__aarch64__) //}{ +/*arg5*/ , ElfW(Addr) elfaddr +#endif //} +) +{ + DPRINTF("upx_main b_info=%%p sz_compressed=%%p ehdr=%%p av=%%p\\n", + bi, sz_compressed, ehdr, av); +#if defined(__powerpc64__) + DPRINTF(" p_reloc=%%p\\n", p_reloc); +#endif + Extent xo, xi1, xi2; + xo.buf = (char *)ehdr; + xo.size = bi->sz_unc; // can require bi aligned(4) + xi2.buf = CONST_CAST(char *, bi); xi2.size = bi->sz_cpr + sizeof(*bi); + xi1.buf = CONST_CAST(char *, bi); xi1.size = sz_compressed; + + // ehdr = Uncompress Ehdr and Phdrs + unpackExtent(&xi2, &xo); // never filtered? + +#if defined(__x86_64) || defined(__aarch64__) //{ + ElfW(Addr) *const p_reloc = &elfaddr; +#endif //} + ElfW(Addr) page_mask = get_page_mask(); (void)page_mask; + DPRINTF("upx_main1 .e_entry=%%p p_reloc=%%p *p_reloc=%%p page_mask=%%p\\n", + ehdr->e_entry, p_reloc, *p_reloc, page_mask); + ElfW(Phdr) *phdr = (ElfW(Phdr) *)(1+ ehdr); + + // De-compress Ehdr again into actual position, then de-compress the rest. + ElfW(Addr) entry = do_xmap(ehdr, &xi1, 0, av, p_reloc); + DPRINTF("upx_main2 entry=%%p *p_reloc=%%p\\n", entry, *p_reloc); + auxv_up(av, AT_ENTRY , entry); + + { // Map PT_INTERP program interpreter + phdr = (ElfW(Phdr) *)(1+ ehdr); + unsigned j; + for (j=0; j < ehdr->e_phnum; ++phdr, ++j) if (PT_INTERP==phdr->p_type) { + char const *const iname = *p_reloc + (char const *)phdr->p_vaddr; + int const fdi = open(iname, O_RDONLY, 0); + if (0 > fdi) { + err_exit(18); + } + if (MAX_ELF_HDR_64!=read(fdi, (void *)ehdr, MAX_ELF_HDR_64)) { +ERR_LAB + err_exit(19); + } + // We expect PT_INTERP to be ET_DYN at 0. + // Thus do_xmap will set *p_reloc = slide. + *p_reloc = 0; // kernel picks where PT_INTERP goes + entry = do_xmap(ehdr, 0, fdi, 0, p_reloc); + DPRINTF("interp p_reloc=%%p reloc=%%p\\n", p_reloc, *p_reloc); + auxv_up(av, AT_BASE, *p_reloc); // musl + close(fdi); + } + } + + return (void *)entry; +} + +#if DEBUG //{ + +static int +unsimal(unsigned x, char *ptr, int n) +{ + unsigned m = 10; + while (10 <= (x / m)) m *= 10; + while (10 <= x) { + unsigned d = x / m; + x -= m * d; + m /= 10; + ptr[n++] = '0' + d; + } + ptr[n++] = '0' + x; + return n; +} + +static int +decimal(int x, char *ptr, int n) +{ + if (x < 0) { + x = -x; + ptr[n++] = '-'; + } + return unsimal(x, ptr, n); +} + +static int +heximal(unsigned long x, char *ptr, int n) +{ + unsigned j = -1+ 2*sizeof(unsigned long); + unsigned long m = 0xful << (4 * j); + for (; j; --j, m >>= 4) { // omit leading 0 digits + if (m & x) break; + } + for (; m; --j, m >>= 4) { + unsigned d = 0xf & (x >> (4 * j)); + ptr[n++] = ((10<=d) ? ('a' - 10) : '0') + d; + } + return n; +} + +#define va_arg __builtin_va_arg +#define va_end __builtin_va_end +#define va_list __builtin_va_list +#define va_start __builtin_va_start + +static int +dprintf(char const *fmt, ...) +{ + int n= 0; + char const *literal = 0; // NULL + char buf[24]; // ~0ull == 18446744073709551615 ==> 20 chars + va_list va; va_start(va, fmt); + for (;;) { + char c = *fmt++; + if (!c) { // end of fmt + if (literal) { + goto finish; + } + break; // goto done + } + if ('%'!=c) { + if (!literal) { + literal = fmt; // 1 beyond start of literal + } + continue; + } + // '%' == c + if (literal) { +finish: + n += write(2, -1+ literal, fmt - literal); + literal = 0; // NULL + if (!c) { // fmt already ended + break; // goto done + } + } + switch (c= *fmt++) { // deficiency: does not handle _long_ + default: { // un-implemented conversion + n+= write(2, -1+ fmt, 1); + } break; + case 0: { // fmt ends with "%\0" ==> ignore + goto done; + } break; + case 'u': { + n+= write(2, buf, unsimal(va_arg(va, unsigned), buf, 0)); + } break; + case 'd': { + n+= write(2, buf, decimal(va_arg(va, int), buf, 0)); + } break; + case 'p': { + buf[0] = '0'; + buf[1] = 'x'; + n+= write(2, buf, heximal((unsigned long)va_arg(va, void *), buf, 2)); + } break; + case 'x': { + buf[0] = '0'; + buf[1] = 'x'; + n+= write(2, buf, heximal(va_arg(va, int), buf, 2)); + } break; + } // 'switch' + } +done: + va_end(va); + return n; + } +#endif //} + +/* vim:set ts=4 sw=4 et: */ diff --git a/src/stub/tmp/amd64-linux.elf-entry.bin.dump b/src/stub/tmp/amd64-linux.elf-entry.bin.dump index 24a84185..5b1c0460 100644 --- a/src/stub/tmp/amd64-linux.elf-entry.bin.dump +++ b/src/stub/tmp/amd64-linux.elf-entry.bin.dump @@ -2,57 +2,18 @@ file format elf64-x86-64 Sections: Idx Name Size VMA LMA File off Algn Flags - 0 ELFMAINX 012 0 0 040 2**0 CONTENTS - 1 NRV_HEAD 066 0 0 052 2**0 CONTENTS - 2 NRV2E 0ba 0 0 0b8 2**0 CONTENTS - 3 NRV2D 0a1 0 0 0172 2**0 CONTENTS - 4 NRV2B 093 0 0 0213 2**0 CONTENTS - 5 LZMA_ELF00 064 0 0 02a6 2**0 CONTENTS - 6 LZMA_DEC10 09f7 0 0 030a 2**0 CONTENTS - 7 LZMA_DEC20 09f7 0 0 0d01 2**0 CONTENTS - 8 LZMA_DEC30 018 0 0 016f8 2**0 CONTENTS - 9 NRV_TAIL 0 0 0 01710 2**0 CONTENTS - 10 ELFMAINY 04b 0 0 01710 2**0 CONTENTS - 11 ELFMAINZ 077 0 0 0175b 2**0 CONTENTS + 0 ELFMAINX 016a 0 0 040 2**0 CONTENTS + 1 ELFMAINZ 04 0 0 01ac 2**2 CONTENTS SYMBOL TABLE: -0000000000000000 l d NRV_HEAD 0 NRV_HEAD -0000000000000000 l d LZMA_DEC30 0 LZMA_DEC30 -0000000000000000 l d ELFMAINY 0 ELFMAINY 0000000000000000 l d ELFMAINZ 0 ELFMAINZ 0000000000000000 l d ELFMAINX 0 ELFMAINX -0000000000000000 l d NRV2E 0 NRV2E -0000000000000000 l d NRV2D 0 NRV2D -0000000000000000 l d NRV2B 0 NRV2B -0000000000000000 l d LZMA_ELF00 0 LZMA_ELF00 -0000000000000000 l d LZMA_DEC10 0 LZMA_DEC10 -0000000000000000 l d LZMA_DEC20 0 LZMA_DEC20 -0000000000000000 l d NRV_TAIL 0 NRV_TAIL 0000000000000000 g ELFMAINX 0 _start 0000000000000000 *UND* 0 O_BINFO RELOCATION RECORDS FOR [ELFMAINX]: OFFSET TYPE VALUE -0000000000000003 R_X86_64_PC32 ELFMAINZ+0x0000000000000069 - -RELOCATION RECORDS FOR [NRV2E]: -OFFSET TYPE VALUE -00000000000000af R_X86_64_PC32 NRV_HEAD+0x0000000000000021 -000000000000005c R_X86_64_PC32 ELFMAINY+0xfffffffffffffffc - -RELOCATION RECORDS FOR [NRV2D]: -OFFSET TYPE VALUE -0000000000000096 R_X86_64_PC32 NRV_HEAD+0x0000000000000021 -000000000000005c R_X86_64_PC32 ELFMAINY+0xfffffffffffffffc - -RELOCATION RECORDS FOR [NRV2B]: -OFFSET TYPE VALUE -000000000000008b R_X86_64_PC32 NRV_HEAD+0x0000000000000021 -0000000000000053 R_X86_64_PC32 ELFMAINY+0xfffffffffffffffc - -RELOCATION RECORDS FOR [LZMA_ELF00]: -OFFSET TYPE VALUE -0000000000000006 R_X86_64_PC32 LZMA_DEC30+0x0000000000000012 +0000000000000056 R_X86_64_PC32 ELFMAINZ+0xfffffffffffffffc RELOCATION RECORDS FOR [ELFMAINZ]: OFFSET TYPE VALUE -0000000000000073 R_X86_64_32 O_BINFO +0000000000000000 R_X86_64_32 O_BINFO diff --git a/src/stub/tmp/amd64-linux.elf-fold.map b/src/stub/tmp/amd64-linux.elf-fold.map index 742f847b..75842876 100644 --- a/src/stub/tmp/amd64-linux.elf-fold.map +++ b/src/stub/tmp/amd64-linux.elf-fold.map @@ -6,96 +6,73 @@ Name Origin Length Attributes Linker script and memory map - 0x00000000001000bc . = ((0x100000 + SIZEOF_HEADERS) + 0xc) + 0x000000000010004c . = ((0x100000 + SIZEOF_HEADERS) + 0xc) -.text 0x00000000001000bc 0x904 - *(.text) - .text 0x00000000001000bc 0x1f0 tmp/amd64-linux.elf-fold.o - 0x000000000010029a munmap - 0x0000000000100261 mmap - 0x00000000001002a2 write - 0x00000000001002a6 read - 0x00000000001002aa my_bkpt - 0x0000000000100278 Pprotect - 0x000000000010028a exit - 0x000000000010028e brk - 0x0000000000100296 open - 0x000000000010029e mprotect - 0x0000000000100292 close - .text 0x00000000001002ac 0x713 tmp/amd64-linux.elf-main.o - 0x0000000000100878 upx_main - *fill* 0x00000000001009bf 0x1 00 - .text 0x00000000001009c0 0x0 tmp/amd64-expand.o - *(.data) - .data 0x00000000001009c0 0x0 tmp/amd64-linux.elf-fold.o - .data 0x00000000001009c0 0x0 tmp/amd64-linux.elf-main.o - .data 0x00000000001009c0 0x0 tmp/amd64-expand.o - 0x00000000001009c0 . = ALIGN (0x1) - 0x00000000001009c0 __start_EXP_HEAD = . +.text 0x0000000000000000 0x909 + .text 0x0000000000000000 0x160 tmp/amd64-linux.elf-fold.o + 0x0000000000000158 get_page_mask + .text 0x0000000000000160 0x0 tmp/amd64-expand.o + .text 0x0000000000000160 0x7a9 tmp/amd64-linux.elf-main2.o + 0x00000000000002b5 underlay + 0x00000000000007d4 upx_main -EXP_HEAD 0x00000000001009c0 0xe0 - EXP_HEAD 0x00000000001009c0 0xe0 tmp/amd64-expand.o - 0x00000000001009c0 f_expand - 0x0000000000100aa0 __stop_EXP_HEAD = . - 0x0000000000100aa0 . = ALIGN (0x1) - 0x0000000000100aa0 __start_NRV2E = . +EXP_HEAD 0x0000000000000000 0xe0 + EXP_HEAD 0x0000000000000000 0xe0 tmp/amd64-expand.o + 0x0000000000000000 f_expand -NRV2E 0x0000000000100aa0 0xe5 - NRV2E 0x0000000000100aa0 0xe5 tmp/amd64-expand.o - 0x0000000000100b85 __stop_NRV2E = . - 0x0000000000100b85 . = ALIGN (0x1) - 0x0000000000100b85 __start_NRV2D = . +NRV2E 0x0000000000000000 0xe5 + NRV2E 0x0000000000000000 0xe5 tmp/amd64-expand.o -NRV2D 0x0000000000100b85 0xd7 - NRV2D 0x0000000000100b85 0xd7 tmp/amd64-expand.o - 0x0000000000100c5c __stop_NRV2D = . - 0x0000000000100c5c . = ALIGN (0x1) - 0x0000000000100c5c __start_NRV2B = . +NRV2D 0x0000000000000000 0xd7 + NRV2D 0x0000000000000000 0xd7 tmp/amd64-expand.o -NRV2B 0x0000000000100c5c 0xc1 - NRV2B 0x0000000000100c5c 0xc1 tmp/amd64-expand.o - 0x0000000000100d1d __stop_NRV2B = . +NRV2B 0x0000000000000000 0xc1 + NRV2B 0x0000000000000000 0xc1 tmp/amd64-expand.o -.data +.data 0x0000000000000000 0x0 + .data 0x0000000000000000 0x0 tmp/amd64-linux.elf-fold.o + .data 0x0000000000000000 0x0 tmp/amd64-expand.o + .data 0x0000000000000000 0x0 tmp/amd64-linux.elf-main2.o -.bss 0x0000000000100d20 0x0 - .bss 0x0000000000100d20 0x0 tmp/amd64-linux.elf-fold.o - .bss 0x0000000000100d20 0x0 tmp/amd64-linux.elf-main.o - .bss 0x0000000000100d20 0x0 tmp/amd64-expand.o - -.rela.dyn 0x0000000000100d20 0x0 - .rela.text 0x0000000000000000 0x0 tmp/amd64-linux.elf-fold.o +.bss 0x0000000000000000 0x0 + .bss 0x0000000000000000 0x0 tmp/amd64-linux.elf-fold.o + .bss 0x0000000000000000 0x0 tmp/amd64-expand.o + .bss 0x0000000000000000 0x0 tmp/amd64-linux.elf-main2.o LOAD tmp/amd64-linux.elf-fold.o -LOAD tmp/amd64-linux.elf-main.o LOAD tmp/amd64-expand.o +LOAD tmp/amd64-linux.elf-main2.o OUTPUT(tmp/amd64-linux.elf-fold.bin elf64-x86-64) - 0x0000000000000000 . = ALIGN (0x1) - 0x0000000000000000 __start_LZMA_ELF00 = . + +SYSCALLS 0x0000000000000000 0x8e + SYSCALLS 0x0000000000000000 0x8e tmp/amd64-linux.elf-fold.o + 0x0000000000000018 Pmap + 0x000000000000006a munmap + 0x000000000000007a ftruncate + 0x000000000000002a mmap + 0x0000000000000086 write + 0x0000000000000011 memfd_create + 0x000000000000008a read + 0x0000000000000000 my_bkpt + 0x0000000000000045 Pprotect + 0x0000000000000086 Pwrite + 0x000000000000005a Punmap + 0x000000000000006e exit + 0x0000000000000072 brk + 0x000000000000007e open + 0x0000000000000082 mprotect + 0x0000000000000076 close LZMA_ELF00 0x0000000000000000 0x64 LZMA_ELF00 0x0000000000000000 0x64 tmp/amd64-expand.o - 0x0000000000000064 __stop_LZMA_ELF00 = . - 0x0000000000000064 . = ALIGN (0x1) - 0x0000000000000064 __start_LZMA_DEC10 = . LZMA_DEC10 0x0000000000000000 0x9f7 LZMA_DEC10 0x0000000000000000 0x9f7 tmp/amd64-expand.o - 0x00000000000009f7 __stop_LZMA_DEC10 = . - 0x00000000000009f7 . = ALIGN (0x1) - 0x00000000000009f7 __start_LZMA_DEC20 = . LZMA_DEC20 0x0000000000000000 0x9f7 LZMA_DEC20 0x0000000000000000 0x9f7 tmp/amd64-expand.o - 0x00000000000009f7 __stop_LZMA_DEC20 = . - 0x00000000000009f7 . = ALIGN (0x1) - 0x00000000000009f7 __start_LZMA_DEC30 = . LZMA_DEC30 0x0000000000000000 0x18 LZMA_DEC30 0x0000000000000000 0x18 tmp/amd64-expand.o - 0x0000000000000018 __stop_LZMA_DEC30 = . - 0x0000000000000018 . = ALIGN (0x1) - 0x0000000000000018 __start_EXP_TAIL = . EXP_TAIL 0x0000000000000000 0xc EXP_TAIL 0x0000000000000000 0xc tmp/amd64-expand.o - 0x000000000000000c __stop_EXP_TAIL = .