de-compression of arm64 --android-shlib

modified:   src/p_lx_elf.cpp
	modified:   src/p_lx_elf.h
	modified:   src/stub/src/arm64-linux.shlib-init.S
This commit is contained in:
John Reiser 2018-01-24 15:39:46 -08:00
parent 5d13c6cd01
commit 85f53b210d
5 changed files with 365 additions and 264 deletions

View File

@ -328,7 +328,8 @@ off_t PackLinuxElf::pack3(OutputFile *fo, Filter &ft) // return length of output
: elf_unsigned_dynamic(Elf32_Dyn::DT_INIT) );
set_te32(&disp, firstpc_va - load_va);
if (opt->o_unix.android_shlib) { // the extra page
set_te32(&disp, asl_delta + firstpc_va - load_va);
// Hacked in *-linux.shlib-init.S
//set_te32(&disp, asl_delta + firstpc_va - load_va);
}
fo->write(&disp, sizeof(disp)); // DT_INIT.d_val
len += sizeof(disp);
@ -2953,8 +2954,13 @@ void PackLinuxElf64::pack1(OutputFile *fo, Filter & /*ft*/)
// .p_filesz,.p_memsz are updated in ::pack3
}
Elf64_Ehdr *const ehdr = (Elf64_Ehdr *)&lowmem[0];
upx_uint64_t e_entry = get_te64(&ehdr->e_entry);
if (xct_off < e_entry) {
set_te64(&ehdr->e_entry, asl_delta + e_entry);
}
// Relocate Shdr; and Rela, Rel (below xct_off)
set_te64(&((Elf64_Ehdr *)&lowmem[0])->e_shoff, xct_off);
set_te64(&ehdr->e_shoff, xct_off);
memcpy(&lowmem[xct_off], shdri, e_shnum * sizeof(Elf64_Ehdr));
Elf64_Shdr *const shdro = (Elf64_Shdr *)&lowmem[xct_off];
Elf64_Shdr *shdr = shdro;
@ -3574,6 +3580,49 @@ void PackLinuxElf64::pack4(OutputFile *fo, Filter &ft)
}
}
void
PackLinuxElf64::unRela64(
upx_uint64_t dt_rela,
Elf64_Rela *rela0,
unsigned relasz,
MemBuffer &ptload1,
upx_uint64_t const load_off,
OutputFile *fo
)
{
Elf64_Rela *rela = rela0;
for (int k = relasz / sizeof(Elf64_Rela); --k >= 0; ++rela) {
upx_uint64_t r_addend = get_te64(&rela->r_addend);
upx_uint64_t r_offset = get_te64(&rela->r_offset);
upx_uint64_t r_info = get_te64(&rela->r_info);
unsigned r_type = ELF64_R_TYPE(r_info);
if (xct_off <= r_offset) {
set_te64(&rela->r_offset, r_offset - asl_delta);
}
if (Elf64_Ehdr::EM_AARCH64 == e_machine) {
if (R_AARCH64_RELATIVE == r_type) {
if (xct_off <= r_addend) {
set_te64(&rela->r_addend, r_addend - asl_delta);
}
}
if (R_AARCH64_JUMP_SLOT == r_type) {
++n_jmp_slot;
// .rela.plt contains offset of the "first time" target
upx_uint64_t d = r_offset - load_off - asl_delta;
if (plt_off > d) {
plt_off = d;
}
upx_uint64_t w = get_te64(&ptload1[d]);
if (xct_off <= w) {
set_te64(&ptload1[d], w - asl_delta);
}
}
}
}
fo->seek(dt_rela, SEEK_SET);
fo->rewrite(rela0, relasz);
}
void PackLinuxElf64::unpack(OutputFile *fo)
{
if (e_phoff != sizeof(Elf64_Ehdr)) {// Phdrs not contiguous with Ehdr
@ -3613,7 +3662,6 @@ void PackLinuxElf64::unpack(OutputFile *fo)
throwCantUnpack("b_info corrupted");
ph.filter_cto = bhdr.b_cto8;
#define MAX_ELF_HDR 1024
MemBuffer u(ph.u_len);
Elf64_Ehdr *const ehdr = (Elf64_Ehdr *)&u[0];
Elf64_Phdr const *phdr = 0;
@ -3641,9 +3689,11 @@ void PackLinuxElf64::unpack(OutputFile *fo)
unsigned total_out = 0;
unsigned c_adler = upx_adler32(NULL, 0);
unsigned u_adler = upx_adler32(NULL, 0);
#define MAX_ELF_HDR 1024
if ((MAX_ELF_HDR - sizeof(Elf64_Ehdr))/sizeof(Elf64_Phdr) < u_phnum) {
throwCantUnpack("bad compressed e_phnum");
}
#undef MAX_ELF_HDR
// Packed ET_EXE has no PT_DYNAMIC.
// Packed ET_DYN has original PT_DYNAMIC for info needed by rtld.
@ -3781,6 +3831,7 @@ void PackLinuxElf64::unpack(OutputFile *fo)
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
if (PT_LOAD64==get_te32(&phdr->p_type) && 0!=n_ptload++) {
load_off = get_te64(&phdr->p_offset);
load_va = get_te64(&phdr->p_vaddr);
fi->seek(old_data_off, SEEK_SET);
fi->readx(ibuf, old_data_len);
total_in += old_data_len;
@ -3793,24 +3844,68 @@ void PackLinuxElf64::unpack(OutputFile *fo)
}
// Restore DT_INIT.d_val
phdr = (Elf64_Phdr *)&u[sizeof(*ehdr)];
if (fo)
for (unsigned j= 0; j < u_phnum; ++j, ++phdr) {
if (phdr->PT_DYNAMIC==get_te32(&phdr->p_type)) {
upx_uint64_t dt_pltrelsz(0), dt_jmprel(0);
upx_uint64_t dt_relasz(0), dt_rela(0);
unsigned const dyn_off = get_te64(&phdr->p_offset);
unsigned const dyn_len = get_te64(&phdr->p_filesz);
Elf64_Dyn *dyn = (Elf64_Dyn *)((unsigned char *)ibuf +
(dyn_off - load_off));
for (unsigned j2= 0; j2 < dyn_len; ++dyn, j2 += sizeof(*dyn)) {
if (dyn->DT_INIT==get_te32(&dyn->d_tag)) {
if (fo) {
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
fo->seek(0, SEEK_END);
}
break;
upx_uint64_t const tag = get_te64(&dyn->d_tag);
upx_uint64_t val = get_te64(&dyn->d_val);
switch (tag) {
case dyn->DT_INIT: {
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
fo->rewrite(&old_dtinit, sizeof(old_dtinit));
} break;
case dyn->DT_PREINIT_ARRAY:
case dyn->DT_INIT_ARRAY:
case dyn->DT_FINI_ARRAY:
case dyn->DT_FINI:
case dyn->DT_PLTGOT: {
fo->seek(sizeof(upx_uint64_t) + j2 + dyn_off, SEEK_SET);
val -= asl_delta;
fo->rewrite(&val, sizeof(val));
} break;
case dyn->DT_PLTRELSZ: { // Size in bytes of PLT relocs
dt_pltrelsz = val; (void)dt_pltrelsz;
} break;
case dyn->DT_JMPREL: { // Address of PLT relocs
dt_jmprel = val; (void)dt_jmprel;
} break;
case dyn->DT_RELASZ: { // Total size of Rela relocs
dt_relasz = val;
} break;
case dyn->DT_RELA: { // Address of Rela relocs
dt_rela = val;
} break;
} // end switch()
}
lowmem.alloc(xct_off);
fi->seek(0, SEEK_SET);
fi->read(lowmem, xct_off); // contains relocation tables
if (dt_relasz) {
Elf64_Rela *const rela0 = (Elf64_Rela *)lowmem.subref(
"bad Rela offset", dt_rela, dt_relasz);
unRela64(dt_rela, rela0, dt_relasz, ibuf, load_va, fo);
}
if (dt_pltrelsz) {
Elf64_Rela *const jmp0 = (Elf64_Rela *)lowmem.subref(
"bad Jmprel offset", dt_jmprel, dt_pltrelsz);
plt_off = ~0ull; n_jmp_slot = 0;
unRela64(dt_jmprel, jmp0, dt_pltrelsz, ibuf, load_va, fo);
if (~0ull != plt_off) {
fo->seek(plt_off + load_off, SEEK_SET);
fo->rewrite(&ibuf[plt_off], n_jmp_slot * sizeof(void *));
}
}
}
}
if (fo) fo->seek(0, SEEK_END);
}
// update header with totals
@ -3824,7 +3919,6 @@ void PackLinuxElf64::unpack(OutputFile *fo)
// finally test the checksums
if (ph.c_adler != c_adler || ph.u_adler != u_adler)
throwChecksumError();
#undef MAX_ELF_HDR
}

View File

@ -250,6 +250,8 @@ protected:
virtual off_t pack3(OutputFile *, Filter &); // append loader
virtual void pack4(OutputFile *, Filter &); // append pack header
virtual void unpack(OutputFile *fo);
virtual void unRela64(upx_uint64_t dt_rela, Elf64_Rela *rela0, unsigned relasz,
MemBuffer &membuf, upx_uint64_t const load_off, OutputFile *fo);
virtual void generateElfHdr(
OutputFile *,

View File

@ -1,5 +1,5 @@
/* arm64-linux.shlib-init.h
created from arm64-linux.shlib-init.bin, 8654 (0x21ce) bytes
created from arm64-linux.shlib-init.bin, 8666 (0x21da) bytes
This file is part of the UPX executable compressor.
@ -31,14 +31,14 @@
*/
#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8654
#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x8c2f89f3
#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0x0cefe3fe
#define STUB_ARM64_LINUX_SHLIB_INIT_SIZE 8666
#define STUB_ARM64_LINUX_SHLIB_INIT_ADLER32 0x4e8c8dcb
#define STUB_ARM64_LINUX_SHLIB_INIT_CRC32 0x8ca5386d
unsigned char stub_arm64_linux_shlib_init[8654] = {
unsigned char stub_arm64_linux_shlib_init[8666] = {
/* 0x0000 */ 127, 69, 76, 70, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0010 */ 1, 0,183, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,184, 24, 0, 0, 0, 0, 0, 0,
/* 0x0020 */ 0, 0, 0, 0, 0, 0, 0, 0,192, 24, 0, 0, 0, 0, 0, 0,
/* 0x0030 */ 0, 0, 0, 0, 64, 0, 0, 0, 0, 0, 64, 0, 0, 0, 0, 0,
/* 0x0040 */ 224, 7,180,169,226, 3, 1,169,254, 23, 0,249, 0, 0, 0,148,
/* 0x0050 */ 254, 15, 31,248,226, 15,191,169, 7, 64, 33,139, 5, 0,128, 18,
@ -335,246 +335,247 @@ unsigned char stub_arm64_linux_shlib_init[8654] = {
/* 0x1280 */ 67,124, 80, 82, 79, 84, 95, 87, 82, 73, 84, 69, 32,102, 97,105,
/* 0x1290 */ 108,101,100, 46, 10, 0, 67,132, 64,248,227,255,255,181, 3, 0,
/* 0x12a0 */ 130,210, 64, 4,193,168, 96, 0, 0,180, 31, 24, 0,241,161,255,
/* 0x12b0 */ 255, 84, 33, 0,131,154,225, 3, 1,203,225,255,129,146,225, 19,
/* 0x12c0 */ 0,249,226, 3, 30,170, 65,144, 0,209, 36, 68, 64,184,227, 3,
/* 0x12d0 */ 4, 42,229, 3, 1,170, 36, 68, 64,184,165, 0, 4,203, 36, 68,
/* 0x12e0 */ 64,184,132, 0, 5,139,228, 15, 0,249, 36, 68, 64,184,132, 0,
/* 0x12f0 */ 5,139,228, 27, 0,249, 36, 68, 64,184,128, 0, 5,139, 97, 0,
/* 0x1300 */ 5,139, 36, 4, 64,185, 33, 48, 0,145, 33, 0, 4,139,229, 35,
/* 0x1310 */ 64,185, 36, 68, 64,184, 5, 0, 37, 10,165, 12, 0, 17,165,116,
/* 0x1320 */ 30, 18,132, 0, 5, 11, 0, 64, 37,203,224,147, 4,169, 0, 64,
/* 0x1330 */ 37,139,132, 0, 5, 75, 16, 0, 0,148, 99, 28, 0, 18,127, 72,
/* 0x1340 */ 1,113,129, 1, 0, 84, 33,252, 66,211, 65, 1, 0,180, 33, 4,
/* 0x1350 */ 0,209, 2,120, 97,184, 67,120, 26, 83,127, 20, 0,113,129, 0,
/* 0x1360 */ 0, 84, 67, 0, 1, 75, 98,100, 0, 51, 2,120, 33,184, 1,255,
/* 0x1370 */ 255,181,192, 3, 95,214,165,124, 2, 83,254,151, 5,169, 35, 20,
/* 0x1380 */ 64, 57, 38, 24, 64, 57,224,147, 6,169,230,143, 7,169, 36, 68,
/* 0x1390 */ 64,184,229, 3, 4, 42, 36, 68, 64,184,226,147, 8,169,227,195,
/* 0x13a0 */ 1,145,225,151, 9,169,224,143, 10,169,165, 12, 0,145,227, 99,
/* 0x13b0 */ 64,185, 98, 8, 69,139,227, 71, 64,249, 99, 0, 0,148,227, 47,
/* 0x13c0 */ 64,249, 97, 0, 0,148, 53, 0, 0,148, 5, 0,128,210, 4, 0,
/* 0x13d0 */ 128,146, 67, 6,128,210, 98, 0,128,210,224,135, 68,169,230, 3,
/* 0x13e0 */ 0,170,200, 27,128, 82, 1, 0, 0,212, 31, 0, 6,235, 64, 0,
/* 0x13f0 */ 0, 84, 0, 0, 32,212,229, 99, 64,185,225, 31, 64,249, 29, 0,
/* 0x1400 */ 0,148,228, 71, 64,249,224,135, 73,169,226,143, 74,169,128, 0,
/* 0x1410 */ 63,214, 4, 0, 0,148, 1, 0, 0,212,224, 7,204,168, 96, 0,
/* 0x1420 */ 31,214,228, 27, 64,249,192, 7, 64,169,128, 0, 0,249,129, 8,
/* 0x1430 */ 0,185,228, 47, 64,249,226,143, 71,169,224,135, 70,169, 67, 0,
/* 0x1440 */ 0,180,128, 0, 63,214,224,135, 68,169,162, 0,128,210, 72, 28,
/* 0x1450 */ 128, 82, 1, 0, 0,212,254,147, 66,169,224,135, 67,169,232, 26,
/* 0x1460 */ 128, 82,226, 15, 65,169,128, 0, 31,214, 37,192, 95,184,165, 92,
/* 0x1470 */ 0, 18,133, 0, 0, 54, 35, 68, 64,184,165, 4, 0, 81, 3, 68,
/* 0x1480 */ 0,184,165, 0, 0, 52, 34, 12,193, 40,165, 8, 0, 81, 2, 12,
/* 0x1490 */ 129, 40,165,255,255, 53,192, 3, 95,214,254, 95, 0,249,227, 3,
/* 0x14a0 */ 30,170, 41, 0, 0,148, 65,244,126,211, 5, 0,128,210, 4, 0,
/* 0x14b0 */ 128,146, 67, 4,128,210, 98, 0,128,210,225, 35, 0,249, 0, 0,
/* 0x14c0 */ 128,210,200, 27,128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0,
/* 0x14d0 */ 0, 84, 0, 0, 32,212,224, 31, 0,249,225, 39, 64,249,229, 99,
/* 0x14e0 */ 64,185,228,255,255,151,225,151, 73,169,224, 79, 0,249,165, 12,
/* 0x14f0 */ 0, 17,165,124, 2, 83,223,255,255,151,226, 3, 0,170,225, 71,
/* 0x1500 */ 64,249,224, 71, 0,249,217,255,255,151,225, 47, 64,249,224, 47,
/* 0x1510 */ 0,249,214,255,255,151,225, 95, 64,249,224, 95, 0,249,211,255,
/* 0x1520 */ 255,151,224,135, 67,169,162, 0,128,210, 72, 28,128, 82, 1, 0,
/* 0x1530 */ 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0, 32,212,254, 95,
/* 0x1540 */ 64,249,192, 3, 31,214, 99,192, 95,184, 99, 92, 0, 18, 66, 0,
/* 0x1550 */ 3,139,192, 3, 95,214,102,105,108,101, 32,102,111,114,109, 97,
/* 0x1560 */ 116, 32,101,108,102, 54, 52, 45,108,105,116,116,108,101, 97, 97,
/* 0x1570 */ 114, 99,104, 54, 52, 10, 10, 83,101, 99,116,105,111,110,115, 58,
/* 0x1580 */ 10, 73,100,120, 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32,
/* 0x1590 */ 32, 32, 32, 83,105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65,
/* 0x15a0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76,
/* 0x15b0 */ 77, 65, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x15c0 */ 32, 70,105,108,101, 32,111,102,102, 32, 32, 65,108,103,110, 32,
/* 0x15d0 */ 32, 70,108, 97,103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65,
/* 0x15e0 */ 73, 78, 88, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49,
/* 0x15f0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1600 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1610 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32,
/* 0x1620 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1630 */ 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89,
/* 0x1640 */ 10, 32, 32, 49, 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32,
/* 0x1650 */ 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1680 */ 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32,
/* 0x1690 */ 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79,
/* 0x16a0 */ 78, 76, 89, 10, 32, 32, 50, 32, 78, 82, 86, 95, 84, 65, 73, 76,
/* 0x16b0 */ 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x16c0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16d0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x16e0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42,
/* 0x16f0 */ 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69,
/* 0x1700 */ 65, 68, 79, 78, 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 69,
/* 0x1710 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50,
/* 0x1720 */ 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1730 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1740 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32,
/* 0x1750 */ 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44,
/* 0x1760 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82,
/* 0x1770 */ 86, 50, 68, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x1780 */ 48, 49, 49, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1790 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49,
/* 0x17b0 */ 55, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x17c0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53,
/* 0x17d0 */ 32, 78, 82, 86, 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48,
/* 0x17e0 */ 48, 48, 48, 48, 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x17f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x1800 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1810 */ 48, 48, 50, 57, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x1820 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1830 */ 32, 32, 54, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32,
/* 0x1840 */ 32, 32, 48, 48, 48, 48, 48, 48,100, 48, 32, 32, 48, 48, 48, 48,
/* 0x1850 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1870 */ 48, 48, 48, 48, 48, 51, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x1880 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44,
/* 0x1890 */ 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90,
/* 0x18a0 */ 77, 65, 95, 68, 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48,
/* 0x18b0 */ 48, 57, 54, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18c0 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52,
/* 0x18e0 */ 53, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78,
/* 0x18f0 */ 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56,
/* 0x1900 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48,
/* 0x1910 */ 48, 48, 48, 48, 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x1920 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x1930 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1940 */ 48, 48,100, 98, 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x1950 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x1960 */ 32, 32, 57, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32,
/* 0x1970 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x19a0 */ 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x19b0 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x19c0 */ 76, 89, 10, 32, 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32,
/* 0x19d0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 51,101, 32, 32, 48,
/* 0x19e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x19f0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a00 */ 48, 32, 32, 48, 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42,
/* 0x1a10 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x1a20 */ 68, 79, 78, 76, 89, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73,
/* 0x1a30 */ 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a40 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a50 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a60 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32,
/* 0x1a70 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1a80 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 50, 32, 69, 76, 70,
/* 0x1a90 */ 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1aa0 */ 48, 50, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ab0 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ac0 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57,
/* 0x1ad0 */ 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x1ae0 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 51, 32,
/* 0x1af0 */ 65, 78, 68, 77, 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48,
/* 0x1b00 */ 48, 48, 48, 48, 48, 52, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1b20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1b30 */ 49, 50, 98, 97, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1b40 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32,
/* 0x1b50 */ 49, 52, 32, 69, 76, 70, 77, 65, 75, 78, 90, 32, 32, 32, 32, 32,
/* 0x1b60 */ 32, 48, 48, 48, 48, 48, 50, 57, 56, 32, 32, 48, 48, 48, 48, 48,
/* 0x1b70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1b80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1b90 */ 48, 48, 48, 49, 50, 98,101, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1ba0 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76,
/* 0x1bb0 */ 89, 10, 83, 89, 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10,
/* 0x1bc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1bd0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x1be0 */ 67, 51, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1bf0 */ 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10,
/* 0x1c00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c10 */ 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x1c20 */ 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c30 */ 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48,
/* 0x1c40 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1c50 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48,
/* 0x1c60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69,
/* 0x1c70 */ 76, 70, 77, 65, 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c80 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1c90 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48,
/* 0x1ca0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72,
/* 0x1cb0 */ 69, 65, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cc0 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86,
/* 0x1cd0 */ 95, 84, 65, 73, 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ce0 */ 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10,
/* 0x1cf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d00 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48,
/* 0x1d10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1d20 */ 78, 82, 86, 50, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d30 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78,
/* 0x1d40 */ 82, 86, 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d50 */ 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48,
/* 0x1d60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1d70 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48,
/* 0x1d80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50,
/* 0x1d90 */ 66, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1da0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1db0 */ 69, 76, 70, 48, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1dc0 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48,
/* 0x1dd0 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1de0 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1df0 */ 68, 69, 67, 50, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e00 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50,
/* 0x1e10 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e20 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95,
/* 0x1e30 */ 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e40 */ 48, 48, 48, 48, 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49,
/* 0x1e50 */ 48, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e60 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65,
/* 0x1e70 */ 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e80 */ 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48,
/* 0x1e90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1ea0 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 74, 78, 90, 9,
/* 0x1eb0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ec0 */ 32, 69, 76, 70, 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48,
/* 0x1ed0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1ee0 */ 100, 32, 32, 65, 78, 68, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48,
/* 0x1ef0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 78, 68,
/* 0x1f00 */ 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f10 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69,
/* 0x1f20 */ 76, 70, 77, 65, 75, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f30 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 75, 78,
/* 0x1f40 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f50 */ 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65,
/* 0x1f60 */ 73, 78, 88, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f70 */ 48, 48, 48, 48, 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48,
/* 0x1f80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x1f90 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48,
/* 0x1fa0 */ 48, 48, 48, 48, 48, 48, 48, 48, 49, 50, 56, 32,117, 99,108, 95,
/* 0x1fb0 */ 110,114,118, 50,101, 95,100,101, 99,111,109,112,114,101,115,115,
/* 0x1fc0 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fd0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86,
/* 0x1fe0 */ 50, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ff0 */ 49, 49, 99, 32,117, 99,108, 95,110,114,118, 50,100, 95,100,101,
/* 0x2000 */ 99,111,109,112,114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48,
/* 0x2010 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32,
/* 0x2020 */ 32, 32, 32, 70, 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48,
/* 0x2030 */ 48, 48, 48, 48, 48, 48, 48, 48, 48,102, 48, 32,117, 99,108, 95,
/* 0x2040 */ 110,114,118, 50, 98, 95,100,101, 99,111,109,112,114,101,115,115,
/* 0x2050 */ 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2060 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77,
/* 0x2070 */ 65, 95, 68, 69, 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2080 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99,
/* 0x2090 */ 111,100,101, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20a0 */ 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70,
/* 0x20b0 */ 77, 65, 73, 78, 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20c0 */ 48, 48, 48, 48, 48, 48, 32,101,110,100, 95,100,101, 99,111,109,
/* 0x20d0 */ 112,114,101,115,115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79,
/* 0x20e0 */ 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69,
/* 0x20f0 */ 76, 70, 77, 65, 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84,
/* 0x2100 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32,
/* 0x2110 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76,
/* 0x2120 */ 85, 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2130 */ 48, 48, 99, 32, 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65,
/* 0x2140 */ 76, 76, 50, 54, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10,
/* 0x2150 */ 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82,
/* 0x2160 */ 68, 83, 32, 70, 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70,
/* 0x2170 */ 48, 48, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32,
/* 0x2180 */ 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32,
/* 0x2190 */ 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48,
/* 0x21a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82,
/* 0x21b0 */ 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49,
/* 0x21c0 */ 57, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10
/* 0x12b0 */ 255, 84, 33, 0,131,154,225, 3, 1,203, 6, 0,128,210,225,255,
/* 0x12c0 */ 129,146, 6, 0,130,210,225, 19, 0,249,226, 3, 30,170, 65,144,
/* 0x12d0 */ 0,209, 36, 68, 64,184,227, 3, 4, 42,229, 3, 1,170, 36, 68,
/* 0x12e0 */ 64,184,165, 0, 4,203, 36, 68, 64,184,132, 0, 6,139,132, 0,
/* 0x12f0 */ 5,139,228, 15, 0,249, 36, 68, 64,184,132, 0, 5,139,228, 27,
/* 0x1300 */ 0,249, 36, 68, 64,184,128, 0, 5,139, 97, 0, 5,139, 36, 4,
/* 0x1310 */ 64,185, 33, 48, 0,145, 33, 0, 4,139,229, 35, 64,185, 36, 68,
/* 0x1320 */ 64,184, 5, 0, 37, 10,165, 12, 0, 17,165,116, 30, 18,132, 0,
/* 0x1330 */ 5, 11, 0, 64, 37,203,224,147, 4,169, 0, 64, 37,139,132, 0,
/* 0x1340 */ 5, 75, 16, 0, 0,148, 99, 28, 0, 18,127, 72, 1,113,129, 1,
/* 0x1350 */ 0, 84, 33,252, 66,211, 65, 1, 0,180, 33, 4, 0,209, 2,120,
/* 0x1360 */ 97,184, 67,120, 26, 83,127, 20, 0,113,129, 0, 0, 84, 67, 0,
/* 0x1370 */ 1, 75, 98,100, 0, 51, 2,120, 33,184, 1,255,255,181,192, 3,
/* 0x1380 */ 95,214,165,124, 2, 83,254,151, 5,169, 35, 20, 64, 57, 38, 24,
/* 0x1390 */ 64, 57,224,147, 6,169,230,143, 7,169, 36, 68, 64,184,229, 3,
/* 0x13a0 */ 4, 42, 36, 68, 64,184,226,147, 8,169,227,195, 1,145,225,151,
/* 0x13b0 */ 9,169,224,143, 10,169,165, 12, 0,145,227, 99, 64,185, 98, 8,
/* 0x13c0 */ 69,139,227, 71, 64,249, 99, 0, 0,148,227, 47, 64,249, 97, 0,
/* 0x13d0 */ 0,148, 53, 0, 0,148, 5, 0,128,210, 4, 0,128,146, 67, 6,
/* 0x13e0 */ 128,210, 98, 0,128,210,224,135, 68,169,230, 3, 0,170,200, 27,
/* 0x13f0 */ 128, 82, 1, 0, 0,212, 31, 0, 6,235, 64, 0, 0, 84, 0, 0,
/* 0x1400 */ 32,212,229, 99, 64,185,225, 31, 64,249, 29, 0, 0,148,228, 71,
/* 0x1410 */ 64,249,224,135, 73,169,226,143, 74,169,128, 0, 63,214, 4, 0,
/* 0x1420 */ 0,148, 1, 0, 0,212,224, 7,204,168, 96, 0, 31,214,228, 27,
/* 0x1430 */ 64,249,192, 7, 64,169,128, 0, 0,249,129, 8, 0,185,228, 47,
/* 0x1440 */ 64,249,226,143, 71,169,224,135, 70,169, 67, 0, 0,180,128, 0,
/* 0x1450 */ 63,214,224,135, 68,169,162, 0,128,210, 72, 28,128, 82, 1, 0,
/* 0x1460 */ 0,212,254,147, 66,169,224,135, 67,169,232, 26,128, 82,226, 15,
/* 0x1470 */ 65,169,128, 0, 31,214, 37,192, 95,184,165, 92, 0, 18,133, 0,
/* 0x1480 */ 0, 54, 35, 68, 64,184,165, 4, 0, 81, 3, 68, 0,184,165, 0,
/* 0x1490 */ 0, 52, 34, 12,193, 40,165, 8, 0, 81, 2, 12,129, 40,165,255,
/* 0x14a0 */ 255, 53,192, 3, 95,214,254, 95, 0,249,227, 3, 30,170, 41, 0,
/* 0x14b0 */ 0,148, 65,244,126,211, 5, 0,128,210, 4, 0,128,146, 67, 4,
/* 0x14c0 */ 128,210, 98, 0,128,210,225, 35, 0,249, 0, 0,128,210,200, 27,
/* 0x14d0 */ 128, 82, 1, 0, 0,212, 31, 4, 64,177, 67, 0, 0, 84, 0, 0,
/* 0x14e0 */ 32,212,224, 31, 0,249,225, 39, 64,249,229, 99, 64,185,228,255,
/* 0x14f0 */ 255,151,225,151, 73,169,224, 79, 0,249,165, 12, 0, 17,165,124,
/* 0x1500 */ 2, 83,223,255,255,151,226, 3, 0,170,225, 71, 64,249,224, 71,
/* 0x1510 */ 0,249,217,255,255,151,225, 47, 64,249,224, 47, 0,249,214,255,
/* 0x1520 */ 255,151,225, 95, 64,249,224, 95, 0,249,211,255,255,151,224,135,
/* 0x1530 */ 67,169,162, 0,128,210, 72, 28,128, 82, 1, 0, 0,212, 31, 4,
/* 0x1540 */ 64,177, 67, 0, 0, 84, 0, 0, 32,212,254, 95, 64,249,192, 3,
/* 0x1550 */ 31,214, 99,192, 95,184, 99, 92, 0, 18, 66, 0, 3,139,192, 3,
/* 0x1560 */ 95,214,102,105,108,101, 32,102,111,114,109, 97,116, 32,101,108,
/* 0x1570 */ 102, 54, 52, 45,108,105,116,116,108,101, 97, 97,114, 99,104, 54,
/* 0x1580 */ 52, 10, 10, 83,101, 99,116,105,111,110,115, 58, 10, 73,100,120,
/* 0x1590 */ 32, 78, 97,109,101, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 83,
/* 0x15a0 */ 105,122,101, 32, 32, 32, 32, 32, 32, 86, 77, 65, 32, 32, 32, 32,
/* 0x15b0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 76, 77, 65, 32, 32,
/* 0x15c0 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 70,105,108,
/* 0x15d0 */ 101, 32,111,102,102, 32, 32, 65,108,103,110, 32, 32, 70,108, 97,
/* 0x15e0 */ 103,115, 10, 32, 32, 48, 32, 69, 76, 70, 77, 65, 73, 78, 88, 32,
/* 0x15f0 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 49, 48, 32, 32, 48,
/* 0x1600 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1610 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1620 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 52, 48, 32, 32, 50, 42, 42,
/* 0x1630 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 76,
/* 0x1640 */ 79, 67, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 49,
/* 0x1650 */ 32, 78, 82, 86, 95, 72, 69, 65, 68, 32, 32, 32, 32, 32, 32, 48,
/* 0x1660 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x1670 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,
/* 0x1680 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1690 */ 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78,
/* 0x16a0 */ 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10,
/* 0x16b0 */ 32, 32, 50, 32, 78, 82, 86, 95, 84, 65, 73, 76, 32, 32, 32, 32,
/* 0x16c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x16d0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x16e0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x16f0 */ 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42, 48, 32, 32,
/* 0x1700 */ 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78,
/* 0x1710 */ 76, 89, 10, 32, 32, 51, 32, 78, 82, 86, 50, 69, 32, 32, 32, 32,
/* 0x1720 */ 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 50, 56, 32, 32, 48,
/* 0x1730 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,
/* 0x1740 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1750 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 53, 48, 32, 32, 50, 42, 42,
/* 0x1760 */ 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65,
/* 0x1770 */ 68, 79, 78, 76, 89, 10, 32, 32, 52, 32, 78, 82, 86, 50, 68, 32,
/* 0x1780 */ 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 49, 49, 99,
/* 0x1790 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17a0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x17b0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 49, 55, 56, 32, 32,
/* 0x17c0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x17d0 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 53, 32, 78, 82, 86,
/* 0x17e0 */ 50, 66, 32, 32, 32, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x17f0 */ 48,102, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1800 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1810 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 50, 57,
/* 0x1820 */ 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x1830 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 54, 32,
/* 0x1840 */ 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 32, 32, 32, 32, 48, 48,
/* 0x1850 */ 48, 48, 48, 48,100, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1860 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1870 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x1880 */ 48, 51, 56, 52, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x1890 */ 69, 78, 84, 83, 44, 32, 82, 69, 76, 79, 67, 44, 32, 82, 69, 65,
/* 0x18a0 */ 68, 79, 78, 76, 89, 10, 32, 32, 55, 32, 76, 90, 77, 65, 95, 68,
/* 0x18b0 */ 69, 67, 50, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48, 57, 54, 56,
/* 0x18c0 */ 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18d0 */ 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x18e0 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 52, 53, 52, 32, 32,
/* 0x18f0 */ 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32,
/* 0x1900 */ 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 56, 32, 76, 90, 77,
/* 0x1910 */ 65, 95, 68, 69, 67, 49, 48, 32, 32, 32, 32, 48, 48, 48, 48, 48,
/* 0x1920 */ 52, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1930 */ 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1940 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48,100, 98,
/* 0x1950 */ 99, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84,
/* 0x1960 */ 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 32, 57, 32,
/* 0x1970 */ 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 32, 32, 32, 32, 48, 48,
/* 0x1980 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1990 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x19a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48,
/* 0x19b0 */ 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84,
/* 0x19c0 */ 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32,
/* 0x19d0 */ 49, 48, 32, 69, 76, 70, 77, 65, 73, 78, 89, 32, 32, 32, 32, 32,
/* 0x19e0 */ 32, 48, 48, 48, 48, 48, 48, 51,101, 32, 32, 48, 48, 48, 48, 48,
/* 0x19f0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48,
/* 0x1a00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48,
/* 0x1a10 */ 48, 48, 48, 49, 50, 53, 56, 32, 32, 50, 42, 42, 48, 32, 32, 67,
/* 0x1a20 */ 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76,
/* 0x1a30 */ 89, 10, 32, 49, 49, 32, 69, 76, 70, 77, 65, 73, 78, 90, 32, 32,
/* 0x1a40 */ 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48,
/* 0x1a50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32,
/* 0x1a60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1a70 */ 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, 50, 42, 42, 48,
/* 0x1a80 */ 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82, 69, 65, 68,
/* 0x1a90 */ 79, 78, 76, 89, 10, 32, 49, 50, 32, 69, 76, 70, 77, 65, 74, 78,
/* 0x1aa0 */ 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48, 50, 56, 32,
/* 0x1ab0 */ 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ac0 */ 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ad0 */ 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 57, 54, 32, 32, 50,
/* 0x1ae0 */ 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83, 44, 32, 82,
/* 0x1af0 */ 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 51, 32, 65, 78, 68, 77,
/* 0x1b00 */ 65, 74, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48, 48, 48, 48,
/* 0x1b10 */ 48, 56, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b20 */ 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b30 */ 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49, 50, 98,101,
/* 0x1b40 */ 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69, 78, 84, 83,
/* 0x1b50 */ 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 32, 49, 52, 32, 69,
/* 0x1b60 */ 76, 70, 77, 65, 75, 78, 90, 32, 32, 32, 32, 32, 32, 48, 48, 48,
/* 0x1b70 */ 48, 48, 50, 57, 99, 32, 32, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b80 */ 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 48, 48, 48,
/* 0x1b90 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 32, 48, 48, 48, 48, 49,
/* 0x1ba0 */ 50, 99, 54, 32, 32, 50, 42, 42, 48, 32, 32, 67, 79, 78, 84, 69,
/* 0x1bb0 */ 78, 84, 83, 44, 32, 82, 69, 65, 68, 79, 78, 76, 89, 10, 83, 89,
/* 0x1bc0 */ 77, 66, 79, 76, 32, 84, 65, 66, 76, 69, 58, 10, 48, 48, 48, 48,
/* 0x1bd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1be0 */ 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 9,
/* 0x1bf0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c00 */ 32, 76, 90, 77, 65, 95, 68, 69, 67, 51, 48, 10, 48, 48, 48, 48,
/* 0x1c10 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1c20 */ 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 9, 48, 48,
/* 0x1c30 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69,
/* 0x1c40 */ 76, 70, 77, 65, 73, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c50 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1c60 */ 32, 69, 76, 70, 77, 65, 73, 78, 88, 9, 48, 48, 48, 48, 48, 48,
/* 0x1c70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70, 77, 65,
/* 0x1c80 */ 73, 78, 88, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1c90 */ 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86,
/* 0x1ca0 */ 95, 72, 69, 65, 68, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cb0 */ 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 95, 72, 69, 65, 68, 10,
/* 0x1cc0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cd0 */ 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 95, 84, 65, 73,
/* 0x1ce0 */ 76, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1cf0 */ 48, 48, 32, 78, 82, 86, 95, 84, 65, 73, 76, 10, 48, 48, 48, 48,
/* 0x1d00 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32,
/* 0x1d10 */ 32, 32,100, 32, 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48,
/* 0x1d20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50,
/* 0x1d30 */ 69, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d40 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 78, 82, 86, 50, 68,
/* 0x1d50 */ 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d60 */ 48, 32, 78, 82, 86, 50, 68, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d70 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32,
/* 0x1d80 */ 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1d90 */ 48, 48, 48, 48, 48, 48, 48, 32, 78, 82, 86, 50, 66, 10, 48, 48,
/* 0x1da0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1db0 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48,
/* 0x1dc0 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1dd0 */ 48, 48, 32, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 10, 48, 48,
/* 0x1de0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1df0 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50,
/* 0x1e00 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e10 */ 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 50, 48, 10, 48, 48,
/* 0x1e20 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1e30 */ 32, 32, 32, 32,100, 32, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49,
/* 0x1e40 */ 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e50 */ 48, 48, 32, 76, 90, 77, 65, 95, 68, 69, 67, 49, 48, 10, 48, 48,
/* 0x1e60 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108,
/* 0x1e70 */ 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65, 73, 78, 89, 9,
/* 0x1e80 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1e90 */ 32, 69, 76, 70, 77, 65, 73, 78, 89, 10, 48, 48, 48, 48, 48, 48,
/* 0x1ea0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,
/* 0x1eb0 */ 100, 32, 32, 69, 76, 70, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48,
/* 0x1ec0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32, 69, 76, 70,
/* 0x1ed0 */ 77, 65, 74, 78, 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1ee0 */ 48, 48, 48, 48, 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 65,
/* 0x1ef0 */ 78, 68, 77, 65, 74, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f00 */ 48, 48, 48, 48, 48, 48, 48, 48, 32, 65, 78, 68, 77, 65, 74, 78,
/* 0x1f10 */ 90, 10, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f20 */ 48, 48, 32,108, 32, 32, 32, 32,100, 32, 32, 69, 76, 70, 77, 65,
/* 0x1f30 */ 75, 78, 90, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f40 */ 48, 48, 48, 48, 32, 69, 76, 70, 77, 65, 75, 78, 90, 10, 48, 48,
/* 0x1f50 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 32,103,
/* 0x1f60 */ 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78, 88, 9,
/* 0x1f70 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f80 */ 32, 95,115,116, 97,114,116, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1f90 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70,
/* 0x1fa0 */ 32, 78, 82, 86, 50, 69, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fb0 */ 48, 48, 48, 48, 49, 50, 56, 32,117, 99,108, 95,110,114,118, 50,
/* 0x1fc0 */ 101, 95,100,101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10,
/* 0x1fd0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x1fe0 */ 32,103, 32, 32, 32, 32, 32, 70, 32, 78, 82, 86, 50, 68, 9, 48,
/* 0x1ff0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 99, 32,
/* 0x2000 */ 117, 99,108, 95,110,114,118, 50,100, 95,100,101, 99,111,109,112,
/* 0x2010 */ 114,101,115,115, 95, 51, 50, 10, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2020 */ 48, 48, 48, 48, 48, 48, 48, 48, 32,103, 32, 32, 32, 32, 32, 70,
/* 0x2030 */ 32, 78, 82, 86, 50, 66, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2040 */ 48, 48, 48, 48, 48,102, 48, 32,117, 99,108, 95,110,114,118, 50,
/* 0x2050 */ 98, 95,100,101, 99,111,109,112,114,101,115,115, 95, 51, 50, 10,
/* 0x2060 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2070 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 76, 90, 77, 65, 95, 68, 69,
/* 0x2080 */ 67, 49, 48, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x2090 */ 48, 48, 48, 48, 32, 76,122,109, 97, 68,101, 99,111,100,101, 10,
/* 0x20a0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20b0 */ 32,103, 32, 32, 32, 32, 32, 32, 32, 69, 76, 70, 77, 65, 73, 78,
/* 0x20c0 */ 89, 9, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48,
/* 0x20d0 */ 48, 48, 32,101,110,100, 95,100,101, 99,111,109,112,114,101,115,
/* 0x20e0 */ 115, 10, 10, 82, 69, 76, 79, 67, 65, 84, 73, 79, 78, 32, 82, 69,
/* 0x20f0 */ 67, 79, 82, 68, 83, 32, 70, 79, 82, 32, 91, 69, 76, 70, 77, 65,
/* 0x2100 */ 73, 78, 88, 93, 58, 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32,
/* 0x2110 */ 32, 32, 32, 32, 32, 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32,
/* 0x2120 */ 32, 32, 32, 32, 32, 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48,
/* 0x2130 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 99, 32,
/* 0x2140 */ 82, 95, 65, 65, 82, 67, 72, 54, 52, 95, 67, 65, 76, 76, 50, 54,
/* 0x2150 */ 32, 32, 69, 76, 70, 77, 65, 73, 78, 90, 10, 10, 82, 69, 76, 79,
/* 0x2160 */ 67, 65, 84, 73, 79, 78, 32, 82, 69, 67, 79, 82, 68, 83, 32, 70,
/* 0x2170 */ 79, 82, 32, 91, 76, 90, 77, 65, 95, 69, 76, 70, 48, 48, 93, 58,
/* 0x2180 */ 10, 79, 70, 70, 83, 69, 84, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x2190 */ 32, 32, 84, 89, 80, 69, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32,
/* 0x21a0 */ 32, 32, 32, 32, 86, 65, 76, 85, 69, 10, 48, 48, 48, 48, 48, 48,
/* 0x21b0 */ 48, 48, 48, 48, 48, 48, 48, 48, 48, 52, 32, 82, 95, 65, 65, 82,
/* 0x21c0 */ 67, 72, 54, 52, 95, 67, 79, 78, 68, 66, 82, 49, 57, 32, 32, 76,
/* 0x21d0 */ 90, 77, 65, 95, 68, 69, 67, 51, 48, 10
};

View File

@ -126,7 +126,7 @@ sp_frame = 24 * NBPW
// .long offset(escape_hatch)
// .long offset(xct_off) dst of f_exp
_start: .globl _start
// brk #0 // debugging
// brk #0 // debugging
slot f_argc // 0
slot f_argv // 1
@ -191,9 +191,12 @@ main:
5: // auxp cannot be empty (must have AT_UID), so 'cmp' above sets nzvc
csel x1,x1,x3,eq // x1 if found, else x3
neg x1,x1
mov tmp2x,#0
section ANDMAJNZ // Android passes junk args to DT_INIT?
mov x1,#~0<<12 // -4096
asl_delta= 1<<12
mov tmp2x,#asl_delta
section ELFMAKNZ
str x1,[sp,#f_PMASK]
@ -222,7 +225,8 @@ main:
lodsl; mov tmp,eax // offset(b_info)
mov rcx,rsi
lodsl; sub rcx,rcx,rax; //str ecx,[sp,#o_reloc]
lodsl; add rax,rax,rcx; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12
lodsl; add rax,rax,tmp2x // +asl_delta
add rax,rax,rcx; str rax,[sp,#f_uinit] // reloc DT_INIT for step 12
slot o_hatch // 6
lodsl; add rax,rax,rcx; str rax,[sp,#o_hatch] // reloc &hatch for step 10
lodsl; add rdi,rax,rcx // destination for decompress

View File

@ -14,9 +14,9 @@ Idx Name Size VMA LMA File off Algn
9 LZMA_DEC30 00000000 0000000000000000 0000000000000000 00001258 2**0 CONTENTS, READONLY
10 ELFMAINY 0000003e 0000000000000000 0000000000000000 00001258 2**0 CONTENTS, READONLY
11 ELFMAINZ 00000000 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY
12 ELFMAJNZ 00000024 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY
13 ANDMAJNZ 00000004 0000000000000000 0000000000000000 000012ba 2**0 CONTENTS, READONLY
14 ELFMAKNZ 00000298 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY
12 ELFMAJNZ 00000028 0000000000000000 0000000000000000 00001296 2**0 CONTENTS, READONLY
13 ANDMAJNZ 00000008 0000000000000000 0000000000000000 000012be 2**0 CONTENTS, READONLY
14 ELFMAKNZ 0000029c 0000000000000000 0000000000000000 000012c6 2**0 CONTENTS, READONLY
SYMBOL TABLE:
0000000000000000 l d LZMA_DEC30 0000000000000000 LZMA_DEC30
0000000000000000 l d ELFMAINZ 0000000000000000 ELFMAINZ