(Z3解密, 数据长度, Z3表达式问题)
查壳
无壳, 为Linux上的程序
运行
前面是一堆的数据组成了一个猫头鹰(?)和一只猫的形状, 其实到了后面, 这些数据就变成了两个加密用的box.
其实在记事本上看图案更清晰一点
使用IDA进行分析
主函数
跟进加密函数
分析加密函数
大概就是用data里的一些元素乘以每个输入的元素, 然后叠加, 最后变成新的input
用python复现一下就是
#准备data
data = [0]
midput = [0]
output = [0]
for i in range(64):
for j in range(64):
data[(64 * i) + j] = data[(i * 64) + j] / 10
#开始加密
for k in range(64):
num = 0
for m in range(64):
num += midput[m] * data[(64 * m) + k]
output[k] = num
for n in range(64):
midput[n] = output[n]
解题步骤
- 提取data1(owl) 和 data2(cat)中准备后的数据, 以及output的数据(以为是32位的, 所以要注意小端的问题)
- 使用z3
提取数据
提取data1和data2都比较直接
而output的数据要反过来
output = [0xD4, 0x15, 0x5D, 0x02, 0xB4, 0x73, 0x4C, 0x02, 0x71, 0xCF,
0x43, 0x02, 0x4C, 0x13, 0x30, 0x02, 0xFE, 0x2C, 0x13, 0x02,
0xCA, 0x2F, 0xBE, 0x01, 0x26, 0xCA, 0x42, 0x01, 0x55, 0x19,
0xD6, 0x00, 0xA8, 0x27, 0x94, 0x00, 0x74, 0x86, 0x9B, 0x00,
0x32, 0xC8, 0x90, 0x00, 0xC7, 0x12, 0x88, 0x00, 0x58, 0xBA,
0x80, 0x00, 0xE1, 0x81, 0x79, 0x00, 0x68, 0xAB, 0x72, 0x00,
0x4B, 0xCB, 0x74, 0x00, 0x3F, 0x3F, 0x72, 0x00, 0x58, 0xC2,
0x7C, 0x00, 0x5C, 0xCD, 0x89, 0x00, 0xA2, 0xE2, 0x88, 0x00,
0x06, 0x89, 0x8E, 0x00, 0xA0, 0x88, 0x8B, 0x00, 0x8D, 0xEC,
0x8E, 0x00, 0x73, 0x35, 0x8F, 0x00, 0x6F, 0x74, 0x8B, 0x00,
0x82, 0x2C, 0x91, 0x00, 0xF2, 0x7C, 0x8D, 0x00, 0x99, 0x20,
0x83, 0x00, 0xA5, 0x45, 0x7F, 0x00, 0xFF, 0x5A, 0x68, 0x00,
0xD2, 0xA4, 0x50, 0x00, 0xE2, 0x6F, 0x52, 0x00, 0x3B, 0x92,
0x58, 0x00, 0xC1, 0x9E, 0x52, 0x00, 0x1A, 0x6D, 0x51, 0x00,
0x53, 0x74, 0x5B, 0x00, 0xE6, 0x28, 0x70, 0x00, 0xFA, 0xC6,
0x89, 0x00, 0xAE, 0xD6, 0xA5, 0x00, 0x14, 0x7A, 0xD3, 0x00,
0xAA, 0xCF, 0xB8, 0x00, 0x4B, 0xBB, 0xB0, 0x00, 0xA4, 0x69,
0xAE, 0x00, 0x4B, 0x15, 0xA1, 0x00, 0xE7, 0xCB, 0x9D, 0x00,
0x20, 0xDC, 0xA1, 0x00, 0xE3, 0x07, 0xAA, 0x00, 0xB1, 0x5C,
0xB2, 0x00, 0x98, 0xFD, 0xB2, 0x00, 0x29, 0x2F, 0xB1, 0x00,
0xA0, 0x28, 0xE4, 0x00, 0x84, 0x21, 0x1B, 0x01, 0x22, 0x57,
0x61, 0x01, 0xF3, 0x02, 0xA5, 0x01, 0x9D, 0xAA, 0xC0, 0x01,
0x9F, 0x16, 0xD4, 0x01, 0x76, 0x8B, 0xEF, 0x01, 0xBB, 0xE5,
0x33, 0x02, 0xF0, 0xA6, 0x75, 0x02, 0x35, 0xCA, 0xA9, 0x02,
0x4C, 0x90, 0xA8, 0x02, 0xEF, 0x94, 0xA1, 0x02, 0x39, 0x6F,
0x92, 0x02, 0xC3, 0x92, 0x8E, 0x02]
for i in range(0, len(output), 4):
print('0x', end = '')
print('%02X' % output[i + 3], end = '')
print('%02X' % output[i + 2], end='')
print('%02X' % output[i + 1], end='')
print('%02X' % output[i], end='')
print(', ', end = '')
获得output = [0x025D15D4, 0x024C73B4, 0x0243CF71, 0x0230134C, 0x02132CFE, 0x01BE2FCA, 0x0142CA26, 0x00D61955, 0x009427A8, 0x009B8674, 0x0090C832, 0x008812C7, 0x0080BA58, 0x007981E1, 0x0072AB68, 0x0074CB4B, 0x00723F3F, 0x007CC258, 0x0089CD5C, 0x0088E2A2, 0x008E8906, 0x008B88A0, 0x008EEC8D, 0x008F3573, 0x008B746F, 0x00912C82, 0x008D7CF2, 0x00832099, 0x007F45A5, 0x00685AFF, 0x0050A4D2, 0x00526FE2, 0x0058923B, 0x00529EC1, 0x00516D1A, 0x005B7453, 0x007028E6, 0x0089C6FA, 0x00A5D6AE, 0x00D37A14, 0x00B8CFAA, 0x00B0BB4B, 0x00AE69A4, 0x00A1154B, 0x009DCBE7, 0x00A1DC20, 0x00AA07E3, 0x00B25CB1, 0x00B2FD98, 0x00B12F29, 0x00E428A0, 0x011B2184, 0x01615722, 0x01A502F3, 0x01C0AA9D, 0x01D4169F, 0x01EF8B76, 0x0233E5BB, 0x0275A6F0, 0x02A9CA35, 0x02A8904C, 0x02A194EF, 0x02926F39, 0x028E92C3]
z3解出答案
from z3 import *
data1 = [0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x12, 0x13, 0x11, 0x11,
0x11, 0x11, 0x10, 0xf, 0x12, 0x14, 0x14, 0x12, 0x10, 0x13,
0x13, 0x12, 0x14, 0x14, 0x13, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x12, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xf,
0xf, 0x10, 0xf, 0xe, 0xd, 0xb, 0xb, 0xd, 0xd, 0xf,
0x11, 0x12, 0xc, 0xc, 0xe, 0xc, 0x10, 0x11, 0xe, 0xe,
0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x10, 0x10, 0x10,
0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0x10, 0x10, 0xe, 0xe, 0xd, 0x9, 0xa, 0xb, 0xa,
0xb, 0x11, 0x9, 0xb, 0xd, 0xf, 0xa, 0x9, 0x9, 0xa,
0xd, 0xf, 0xd, 0x11, 0x11, 0x13, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x12, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0x10, 0x10, 0xe, 0xe, 0xd, 0xe, 0xd,
0xf, 0x14, 0x10, 0xe, 0xe, 0x12, 0x10, 0x9, 0xe, 0xe,
0xb, 0xb, 0x7, 0x7, 0xa, 0xc, 0xf, 0x12, 0x14, 0x13,
0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x12, 0x10, 0x10, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x11, 0xf, 0xd,
0xd, 0xd, 0x10, 0xe, 0x11, 0x12, 0x10, 0xe, 0x11, 0xe,
0x11, 0xc, 0xa, 0xe, 0xe, 0xa, 0xb, 0x7, 0x8, 0xc,
0x11, 0x15, 0x14, 0x15, 0x15, 0x11, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10,
0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x12, 0x11, 0xd, 0xc, 0x9, 0x9, 0x8, 0x7, 0xd, 0x11,
0x12, 0xf, 0xe, 0xf, 0x11, 0xf, 0xa, 0xd, 0xc, 0x9,
0xa, 0x9, 0xc, 0xe, 0x11, 0x14, 0x14, 0x15, 0x14, 0x11,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0x10, 0x13, 0x13, 0x11, 0xc, 0xb, 0xa, 0xb,
0x7, 0x7, 0x7, 0x9, 0xe, 0xf, 0xb, 0x9, 0xe, 0x11,
0xd, 0xa, 0xd, 0xc, 0xc, 0xf, 0x11, 0xf, 0x10, 0x11,
0x12, 0x12, 0x12, 0x12, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x13, 0x10, 0x10,
0xb, 0x7, 0xf, 0xd, 0xb, 0x9, 0x7, 0x7, 0x8, 0x8,
0x8, 0x9, 0xa, 0xd, 0x11, 0xf, 0xf, 0xd, 0x10, 0x13,
0x11, 0xe, 0xf, 0xf, 0x10, 0xe, 0x10, 0x11, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x11, 0x13, 0x10, 0xe, 0x9, 0x8, 0x7, 0x6, 0xb, 0xb,
0xa, 0x6, 0x4, 0x1, 0x2, 0x2, 0x2, 0x7, 0xe, 0x11,
0x10, 0xf, 0x10, 0x13, 0x11, 0x9, 0x5, 0x9, 0xd, 0xd,
0x12, 0x14, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0x10, 0x10, 0xe, 0xb, 0xb, 0x9, 0x7,
0x8, 0x8, 0x7, 0x9, 0xb, 0x6, 0x2, 0x5, 0x8, 0x9,
0x6, 0x1, 0x8, 0xe, 0x11, 0xf, 0xe, 0x12, 0x8, 0x8,
0xa, 0x5, 0xb, 0xe, 0x11, 0x14, 0x11, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11,
0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0x10,
0xc, 0xd, 0x8, 0xa, 0x9, 0x8, 0x9, 0xb, 0x9, 0x6,
0x6, 0x0, 0x3, 0x8, 0x5, 0x6, 0x4, 0xc, 0x11, 0x12,
0x11, 0xf, 0x7, 0x8, 0x7, 0xf, 0xe, 0x10, 0x12, 0x12,
0x12, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10,
0x11, 0x11, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0x10, 0xc, 0xe, 0xe, 0xd, 0xa, 0x9, 0xa, 0xa,
0xb, 0xb, 0xa, 0x4, 0x6, 0x0, 0x0, 0x0, 0x0, 0x9,
0x4, 0xa, 0x10, 0x13, 0x12, 0xc, 0x4, 0x0, 0x0, 0x9,
0xf, 0x11, 0x11, 0x12, 0x12, 0x11, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x12, 0x15, 0x15, 0x17, 0x13, 0x11, 0x11,
0x11, 0x11, 0x11, 0x10, 0x11, 0x11, 0x11, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x10, 0xe, 0xf, 0x10, 0xb, 0x9,
0xa, 0xa, 0xa, 0xa, 0xa, 0xc, 0xc, 0x6, 0x7, 0x0,
0x0, 0x0, 0x2, 0xa, 0x4, 0xc, 0x10, 0x10, 0x12, 0x11,
0x7, 0x0, 0x0, 0xa, 0x10, 0x12, 0x12, 0x15, 0x14, 0x12,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x15, 0x14, 0x11, 0x10,
0x12, 0x13, 0x15, 0x11, 0x10, 0x10, 0x10, 0x10, 0x11, 0x10,
0x11, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0x10,
0x11, 0xf, 0xd, 0xb, 0xb, 0xb, 0x8, 0x9, 0xc, 0xe,
0xe, 0xc, 0x6, 0x7, 0x2, 0x4, 0xb, 0x6, 0x5, 0xd,
0xf, 0x11, 0x12, 0x12, 0xe, 0x6, 0x7, 0xd, 0x12, 0x11,
0xe, 0x10, 0x14, 0x10, 0x10, 0x10, 0xf, 0x10, 0x10, 0x12,
0x14, 0x10, 0x10, 0x10, 0x10, 0x10, 0x15, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xd, 0xf, 0xe, 0xd, 0xb, 0xa, 0xa, 0xa,
0xb, 0x9, 0xb, 0xd, 0xd, 0xf, 0xc, 0x6, 0xa, 0xa,
0x5, 0x9, 0xa, 0xd, 0xe, 0xc, 0x13, 0x11, 0xe, 0xc,
0xb, 0xe, 0x15, 0x12, 0x11, 0x12, 0x13, 0x12, 0x10, 0xf,
0xf, 0x10, 0x10, 0x14, 0x11, 0x10, 0x10, 0x10, 0x10, 0x10,
0x15, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xd, 0xc, 0xb, 0xa,
0x9, 0xa, 0x9, 0xa, 0x8, 0x7, 0x8, 0xb, 0xd, 0xf,
0x10, 0xe, 0xb, 0xb, 0xc, 0xa, 0xa, 0xc, 0xc, 0xa,
0x12, 0x10, 0x13, 0x10, 0x10, 0x11, 0x14, 0x11, 0x10, 0xe,
0x12, 0x12, 0x10, 0xf, 0xf, 0xf, 0x10, 0x16, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x15, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10,
0xe, 0xa, 0x8, 0x8, 0x8, 0x8, 0x7, 0xa, 0x8, 0x5,
0x6, 0x7, 0xc, 0x10, 0xf, 0xf, 0xd, 0xb, 0xa, 0x5,
0x6, 0xa, 0xb, 0x7, 0xf, 0xf, 0xe, 0xb, 0x11, 0x11,
0x11, 0x11, 0x10, 0x10, 0xf, 0x10, 0xf, 0xf, 0xf, 0xf,
0x10, 0x15, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x15, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xe, 0x9, 0x7, 0x7, 0xa, 0x9,
0x6, 0xa, 0xc, 0x6, 0x3, 0x7, 0xa, 0xd, 0x10, 0xa,
0x6, 0x6, 0x8, 0x6, 0x3, 0x2, 0x5, 0x3, 0x9, 0xf,
0xb, 0x7, 0x8, 0xd, 0x12, 0xe, 0xf, 0x10, 0x10, 0x10,
0xf, 0xf, 0xf, 0xf, 0x10, 0x15, 0x10, 0x10, 0x10, 0x10,
0x10, 0x11, 0x15, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x11, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xd, 0x9,
0xa, 0xb, 0xa, 0x8, 0x4, 0x8, 0xc, 0x9, 0x7, 0x6,
0x6, 0xc, 0xd, 0x7, 0x7, 0x7, 0x9, 0x9, 0x6, 0x4,
0x1, 0x1, 0x4, 0xd, 0xc, 0x9, 0x5, 0x5, 0xa, 0xd,
0xd, 0x10, 0x12, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0x11,
0x16, 0x14, 0x13, 0x13, 0x14, 0x16, 0x11, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x10, 0xc, 0xa, 0xf, 0xd, 0xa, 0xa, 0x6, 0x3,
0x7, 0xc, 0x9, 0x5, 0x5, 0xb, 0xb, 0x9, 0xb, 0xd,
0xd, 0xa, 0x7, 0x5, 0x1, 0x1, 0x2, 0xe, 0x12, 0x11,
0x9, 0x6, 0x8, 0xa, 0xe, 0xf, 0x12, 0x10, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x10, 0x11, 0x12, 0x12, 0x12, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xc, 0xd, 0xd, 0xf,
0xa, 0xb, 0x9, 0x4, 0x7, 0xb, 0xa, 0x9, 0x5, 0xa,
0xb, 0xe, 0xd, 0xe, 0xd, 0xa, 0x9, 0x8, 0x7, 0x5,
0x3, 0x9, 0xf, 0x13, 0x14, 0xd, 0x9, 0x9, 0xa, 0xd,
0x13, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x11, 0x11, 0xb, 0xe, 0xa, 0xa, 0x7, 0x6, 0x3, 0x6,
0xa, 0xc, 0x6, 0x7, 0xe, 0xd, 0xe, 0xc, 0x10, 0xe,
0xc, 0x8, 0x6, 0x5, 0x4, 0x6, 0x9, 0x11, 0x14, 0x14,
0xb, 0x6, 0x9, 0xc, 0x15, 0x10, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x13, 0x11, 0x9, 0xb, 0x8, 0x6,
0x8, 0x9, 0x5, 0x5, 0x6, 0x8, 0x9, 0xb, 0xa, 0xd,
0xb, 0xc, 0xd, 0x11, 0xf, 0x9, 0x6, 0x3, 0x4, 0x6,
0x10, 0x12, 0x13, 0x14, 0xf, 0x7, 0x8, 0xd, 0x13, 0x11,
0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x12, 0xd,
0xb, 0x9, 0x7, 0x6, 0x9, 0xa, 0xa, 0xb, 0xe, 0x9,
0x9, 0xe, 0xa, 0xc, 0x8, 0x8, 0xd, 0xc, 0xf, 0xb,
0x6, 0x9, 0x7, 0x8, 0x11, 0x15, 0x15, 0x15, 0x10, 0xc,
0xf, 0xf, 0x12, 0x13, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xe, 0xe, 0xe, 0x9, 0x6, 0x7, 0xa, 0xe,
0xc, 0x9, 0xb, 0xb, 0xd, 0xc, 0x8, 0x6, 0x7, 0x8,
0xc, 0xa, 0x9, 0xb, 0xe, 0xc, 0x8, 0x6, 0xa, 0xb,
0xb, 0x11, 0x13, 0xe, 0xe, 0x10, 0x12, 0x12, 0x12, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0x11, 0xe, 0xf, 0xb,
0x7, 0x6, 0xb, 0xa, 0x7, 0x4, 0x7, 0xa, 0xe, 0xe,
0xc, 0x8, 0x6, 0x3, 0x4, 0x3, 0x2, 0x6, 0x8, 0x5,
0x5, 0x2, 0x6, 0x6, 0x7, 0xd, 0x11, 0xe, 0xa, 0xd,
0xf, 0xf, 0x11, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10,
0x10, 0x10, 0x10, 0xf, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf,
0x10, 0xb, 0xe, 0xd, 0xa, 0x8, 0x5, 0x7, 0x5, 0x3,
0x4, 0x8, 0xe, 0x10, 0x9, 0x5, 0x7, 0x8, 0x8, 0x5,
0x2, 0x6, 0x8, 0x6, 0x5, 0x7, 0xa, 0x5, 0x5, 0xc,
0xc, 0x8, 0x8, 0x8, 0xd, 0x10, 0x11, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0xf, 0xe, 0xe,
0xe, 0xe, 0xe, 0xf, 0xa, 0x8, 0xc, 0xb, 0x10, 0x7,
0x5, 0x3, 0x4, 0x2, 0x2, 0x5, 0x9, 0xd, 0xa, 0x3,
0x4, 0xa, 0xd, 0xa, 0x5, 0x6, 0x9, 0x6, 0x5, 0xc,
0x8, 0x5, 0x6, 0xc, 0x9, 0x6, 0x6, 0x5, 0xa, 0xf,
0x10, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0x10, 0x10,
0x10, 0xf, 0xe, 0xe, 0xe, 0xe, 0xe, 0xc, 0x8, 0x6,
0x8, 0xd, 0xf, 0x4, 0x4, 0x3, 0x2, 0x0, 0x1, 0x2,
0x4, 0x8, 0x8, 0x2, 0x3, 0x7, 0xd, 0xb, 0xa, 0x7,
0x9, 0x5, 0x9, 0xb, 0x6, 0x4, 0xa, 0xa, 0x8, 0x4,
0x7, 0x4, 0x9, 0xd, 0x10, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0x10, 0x10, 0x10, 0x10, 0xe, 0xe, 0xe, 0xe, 0xf,
0xc, 0x9, 0x6, 0x5, 0x7, 0xd, 0xc, 0x2, 0x2, 0x4,
0x1, 0x0, 0x0, 0x1, 0x4, 0x8, 0x7, 0x2, 0x3, 0x5,
0x7, 0xc, 0xf, 0xa, 0x9, 0x6, 0xa, 0x8, 0x3, 0x3,
0xc, 0x8, 0x4, 0x5, 0x8, 0x4, 0x7, 0xd, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0x10, 0x10, 0xe,
0xe, 0xe, 0xe, 0xd, 0xa, 0x6, 0x5, 0x6, 0x7, 0xf,
0x8, 0x1, 0x2, 0x4, 0x2, 0x2, 0x1, 0x1, 0x4, 0x5,
0x5, 0x5, 0x8, 0x5, 0x5, 0xc, 0x10, 0xb, 0xc, 0xb,
0xa, 0x7, 0x5, 0x5, 0xb, 0x5, 0x5, 0x5, 0x9, 0x8,
0xb, 0xb, 0xf, 0xf, 0xe, 0xf, 0x10, 0x15, 0x10, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x14, 0xf, 0xf, 0xf,
0xf, 0xf, 0x10, 0xe, 0xe, 0xe, 0xf, 0xb, 0x8, 0x5,
0x6, 0x6, 0x9, 0xf, 0x4, 0x2, 0x5, 0x4, 0x1, 0x5,
0x3, 0x1, 0x5, 0x4, 0x4, 0x7, 0x8, 0x6, 0x7, 0xb,
0x10, 0xd, 0xf, 0xc, 0x9, 0x7, 0x8, 0xb, 0x8, 0x7,
0x7, 0x5, 0x9, 0xc, 0xc, 0xa, 0x12, 0xf, 0xe, 0xf,
0x15, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0x15, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xe, 0xe, 0xe,
0xd, 0x8, 0x7, 0x5, 0x5, 0x8, 0xe, 0xb, 0x5, 0xb,
0x9, 0x2, 0x4, 0x7, 0x3, 0x2, 0x4, 0x2, 0x3, 0x6,
0x8, 0x7, 0x8, 0xb, 0xc, 0x10, 0x10, 0xd, 0xb, 0x8,
0x9, 0xc, 0xa, 0x7, 0xc, 0x4, 0x9, 0x10, 0xa, 0x8,
0x12, 0xf, 0xe, 0x12, 0x12, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0x15, 0x10, 0xf, 0xf, 0xf, 0xf,
0x10, 0xe, 0xe, 0xe, 0x9, 0x7, 0x5, 0x4, 0x7, 0xf,
0xf, 0x8, 0xc, 0xd, 0x3, 0x2, 0x5, 0x7, 0x2, 0x4,
0x6, 0x2, 0x2, 0x5, 0x9, 0xb, 0xb, 0xc, 0xd, 0xe,
0x11, 0x10, 0xc, 0xb, 0xc, 0xd, 0xa, 0x9, 0xf, 0x3,
0x7, 0x10, 0xd, 0x8, 0x11, 0x10, 0xf, 0x16, 0xe, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x15, 0x10,
0xf, 0xf, 0xf, 0xf, 0x10, 0xe, 0xe, 0xb, 0x9, 0x4,
0x3, 0x9, 0xe, 0xb, 0x8, 0x6, 0xe, 0x8, 0x2, 0x2,
0x6, 0x4, 0x2, 0x6, 0x7, 0x3, 0x4, 0x4, 0x9, 0xd,
0xd, 0xd, 0xc, 0xc, 0x10, 0x11, 0xb, 0xd, 0xe, 0xc,
0xb, 0x9, 0xf, 0x3, 0x4, 0xc, 0x11, 0x9, 0xf, 0x11,
0x11, 0x13, 0xe, 0xf, 0xf, 0xf, 0x13, 0xf, 0xf, 0xf,
0xf, 0xf, 0x15, 0x10, 0xf, 0xf, 0xf, 0xf, 0x10, 0xe,
0xe, 0xa, 0xb, 0x4, 0x2, 0xc, 0x7, 0xe, 0x4, 0x6,
0xe, 0xc, 0x4, 0x1, 0x4, 0x3, 0x4, 0x5, 0x7, 0x5,
0x6, 0x3, 0x6, 0xc, 0xc, 0xb, 0xa, 0xc, 0xc, 0x11,
0xb, 0xe, 0x10, 0x8, 0x9, 0xa, 0x11, 0x7, 0x5, 0x7,
0x11, 0xa, 0x10, 0x12, 0x12, 0x12, 0xe, 0xe, 0xf, 0xf,
0x18, 0x11, 0xf, 0xf, 0xf, 0xf, 0x15, 0xf, 0xf, 0xf,
0xf, 0xf, 0x10, 0xe, 0xd, 0xc, 0x7, 0x5, 0x5, 0x7,
0xa, 0xe, 0x5, 0x5, 0xa, 0xe, 0x3, 0x1, 0x4, 0x6,
0x4, 0x2, 0x8, 0x8, 0x7, 0x2, 0x5, 0x8, 0xa, 0xa,
0x9, 0xc, 0xa, 0x10, 0xb, 0xd, 0xd, 0x6, 0x7, 0xa,
0x11, 0xe, 0x7, 0x5, 0xd, 0x9, 0x10, 0x12, 0xf, 0x16,
0x12, 0x10, 0x11, 0x13, 0x15, 0x14, 0xf, 0xf, 0xf, 0xf,
0x16, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xe, 0xd, 0xf,
0x5, 0x1, 0x7, 0x5, 0xa, 0x7, 0x6, 0x6, 0xd, 0xa,
0x1, 0x1, 0x6, 0x8, 0x3, 0x2, 0x8, 0x9, 0x8, 0x3,
0x3, 0x7, 0x9, 0x8, 0x8, 0xa, 0x9, 0xc, 0xc, 0xa,
0xa, 0x5, 0x5, 0x8, 0xf, 0x12, 0x5, 0x8, 0xb, 0xb,
0x11, 0x10, 0xe, 0xf, 0x12, 0x13, 0x13, 0x12, 0xf, 0x14,
0x15, 0x13, 0x14, 0x16, 0x12, 0xf, 0xf, 0xf, 0xf, 0xf,
0x10, 0xe, 0xd, 0xc, 0x4, 0x9, 0x2, 0x5, 0x9, 0x9,
0x6, 0x8, 0xa, 0x8, 0x2, 0x5, 0x7, 0x6, 0x1, 0x2,
0x6, 0x7, 0x9, 0x5, 0x1, 0x5, 0x9, 0x5, 0x4, 0x8,
0x9, 0xf, 0xa, 0x7, 0x5, 0x3, 0x4, 0x6, 0xd, 0x10,
0x9, 0xb, 0xf, 0xf, 0x13, 0x10, 0xe, 0xe, 0xe, 0xe,
0xe, 0xf, 0xf, 0xf, 0x10, 0x11, 0x11, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xe, 0xd, 0xa, 0x5, 0x9,
0x3, 0x5, 0x8, 0xd, 0x9, 0xb, 0xb, 0xa, 0x6, 0x5,
0x6, 0x4, 0x2, 0x3, 0x4, 0x4, 0xa, 0x8, 0x1, 0x3,
0xa, 0x7, 0x3, 0x8, 0xa, 0xa, 0xa, 0x3, 0x3, 0x4,
0x3, 0x7, 0xb, 0xd, 0xa, 0xe, 0xf, 0x13, 0x12, 0x10,
0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0x10, 0xd,
0xd, 0xe, 0xc, 0xc, 0x5, 0x6, 0xd, 0xe, 0xb, 0xb,
0xa, 0x8, 0x4, 0x5, 0x4, 0x3, 0x2, 0x6, 0x3, 0x1,
0x8, 0xb, 0x3, 0x2, 0x7, 0x9, 0x6, 0x8, 0xc, 0x8,
0x9, 0x2, 0x5, 0x5, 0x3, 0x9, 0x9, 0xb, 0xc, 0x10,
0xf, 0x12, 0x10, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xd, 0xd, 0x10, 0x11, 0xb, 0x7, 0xa,
0xf, 0xd, 0xb, 0x8, 0x7, 0x9, 0x6, 0x4, 0x6, 0x3,
0x2, 0x7, 0x7, 0x1, 0x4, 0xb, 0x6, 0x1, 0x3, 0x8,
0x8, 0x8, 0xa, 0x8, 0x3, 0x2, 0x4, 0x7, 0x6, 0xa,
0x5, 0xa, 0x10, 0x15, 0x14, 0x11, 0xe, 0xe, 0xe, 0xe,
0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xd, 0xd, 0x11,
0x12, 0x10, 0xb, 0x12, 0x12, 0x10, 0xd, 0x9, 0x7, 0x7,
0x2, 0x5, 0x7, 0x4, 0x2, 0x5, 0xa, 0x7, 0x1, 0xa,
0x9, 0x2, 0x1, 0x5, 0x8, 0x8, 0xa, 0x7, 0x2, 0x2,
0x4, 0x9, 0x6, 0x9, 0x6, 0x9, 0x12, 0x17, 0x15, 0xe,
0xd, 0xd, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xd, 0xd, 0x11, 0x12, 0x10, 0xe, 0x16, 0x13, 0x10,
0xa, 0x8, 0x8, 0x4, 0x2, 0x5, 0x7, 0x7, 0x4, 0x3,
0x9, 0xd, 0xa, 0x6, 0xb, 0x5, 0x0, 0x3, 0x8, 0xa,
0xa, 0x4, 0x1, 0x1, 0x6, 0x5, 0x6, 0x9, 0xb, 0xa,
0x11, 0x16, 0x11, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0xe,
0xe, 0x14, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xf, 0xf, 0xd, 0xd, 0x12, 0x13, 0x11,
0xe, 0x13, 0xc, 0xc, 0xa, 0xa, 0x6, 0x4, 0x4, 0x7,
0x8, 0x8, 0x5, 0x2, 0x8, 0xb, 0xb, 0x9, 0xc, 0x9,
0x3, 0x3, 0x8, 0xa, 0x6, 0x3, 0x1, 0x3, 0x5, 0x2,
0x8, 0xb, 0xa, 0xd, 0xe, 0x12, 0xf, 0xd, 0xd, 0xd,
0xd, 0xd, 0xe, 0xe, 0xe, 0x14, 0xe, 0xe, 0xe, 0xe,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xd,
0xd, 0x10, 0x13, 0x12, 0x10, 0x11, 0x9, 0xb, 0xb, 0x9,
0x6, 0x7, 0x7, 0x8, 0x8, 0x6, 0x5, 0x1, 0x5, 0xa,
0xa, 0x8, 0x6, 0x7, 0x5, 0x4, 0x8, 0x7, 0x2, 0x3,
0x3, 0x3, 0x3, 0x4, 0x7, 0xa, 0xa, 0xd, 0xd, 0xe,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0x11, 0x12,
0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xf, 0xf, 0xd, 0xd, 0xf, 0x14, 0x13, 0xf, 0x12,
0xb, 0xc, 0xa, 0x9, 0x4, 0x7, 0x6, 0x7, 0x7, 0x6,
0x4, 0x2, 0x3, 0x7, 0xa, 0xa, 0x7, 0x7, 0x4, 0x7,
0x7, 0x3, 0x3, 0x3, 0x3, 0x3, 0x5, 0x6, 0x9, 0x9,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xe, 0xe, 0x13, 0xf, 0xe, 0xe, 0xe, 0xe, 0xf, 0xe,
0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xf, 0xd, 0xd, 0xd,
0x13, 0x14, 0xe, 0x11, 0xe, 0xd, 0xb, 0xa, 0x4, 0x7,
0x4, 0x6, 0x6, 0x7, 0x5, 0x3, 0x4, 0x5, 0x8, 0xa,
0xa, 0x5, 0x1, 0x5, 0x2, 0x1, 0x3, 0x4, 0x2, 0x4,
0x7, 0x9, 0x8, 0xd, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xe, 0xd, 0x15, 0xe, 0xe, 0xe,
0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf, 0xf, 0xf, 0xf,
0xf, 0xd, 0xd, 0xd, 0xe, 0xf, 0xd, 0x11, 0x11, 0xd,
0xd, 0xa, 0x3, 0x6, 0x5, 0x7, 0x6, 0x5, 0x4, 0x4,
0x3, 0x5, 0x5, 0x7, 0xa, 0x9, 0x5, 0x4, 0x3, 0x4,
0x3, 0x1, 0x3, 0x8, 0xd, 0x9, 0x8, 0xf, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xf,
0x15, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xf,
0xf, 0xe, 0xe, 0xe, 0xf, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xe, 0x12, 0xc, 0x8, 0x9, 0x3, 0x6, 0x6, 0x8,
0x8, 0x5, 0x2, 0x3, 0x2, 0x2, 0x6, 0x8, 0x7, 0x6,
0x6, 0x5, 0x3, 0x1, 0x2, 0x3, 0x8, 0xd, 0xb, 0x7,
0x10, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0x11, 0x12, 0xe, 0xe, 0xe, 0xe, 0xe,
0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xf, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0x10, 0xb, 0x5, 0x7,
0x5, 0x6, 0x6, 0x7, 0x7, 0x8, 0x3, 0x1, 0x4, 0x4,
0x4, 0x6, 0x9, 0x8, 0x6, 0x6, 0x4, 0x1, 0x3, 0x8,
0xa, 0x7, 0x8, 0xe, 0xe, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0x13, 0x10, 0xe,
0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe, 0xe,
0xe, 0xf, 0x12, 0xd, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd,
0xd, 0xc, 0x8, 0x7, 0x9, 0x6, 0x3, 0x4, 0x6, 0x8,
0x7, 0x2, 0x2, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0x5,
0x3, 0x0, 0x4, 0x6, 0x3, 0x6, 0xe, 0xe, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0x15, 0xe, 0xe, 0xe, 0x10, 0xe, 0xe, 0xe, 0xe,
0xe, 0xe, 0xe, 0xe, 0xf, 0x13, 0x14, 0xd, 0xc, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xc, 0xb, 0xa, 0x9, 0xa,
0x5, 0x1, 0x2, 0x3, 0x7, 0x5, 0x2, 0x3, 0x6, 0x6,
0x6, 0x6, 0x5, 0x3, 0x1, 0x2, 0x3, 0x3, 0x5, 0x9,
0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0x15, 0xe, 0xe, 0xe, 0x15,
0xe, 0xe, 0xe, 0x10, 0x12, 0x14, 0x12, 0xf, 0x12, 0x15,
0x15, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xc, 0xe, 0xe, 0xc, 0xa, 0x2, 0x3, 0x2, 0x2, 0x3,
0x4, 0x4, 0x4, 0x5, 0x5, 0x4, 0x3, 0x2, 0x2, 0x1,
0x1, 0x2, 0x6, 0xa, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0x15,
0xe, 0xe, 0x10, 0x14, 0x10, 0x16, 0x17, 0x16, 0x17, 0x17,
0x18, 0x17, 0x14, 0x18, 0x16, 0xd, 0xc, 0xd, 0xc, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0xe, 0xb, 0x9,
0x8, 0x5, 0x4, 0x2, 0x4, 0x5, 0x7, 0x8, 0x9, 0x8,
0x8, 0x5, 0x3, 0x2, 0x2, 0x6, 0x4, 0xb, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0x14, 0xf, 0xd, 0x15, 0xf, 0xe, 0x13,
0x16, 0x17, 0x17, 0x18, 0x18, 0x18, 0x18, 0x18, 0x15, 0xd,
0xc, 0xc, 0xd, 0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd,
0xf, 0xf, 0xe, 0x9, 0x7, 0x6, 0x2, 0x3, 0x7, 0x9,
0xa, 0xb, 0xb, 0xa, 0xa, 0x8, 0x4, 0x3, 0x2, 0x4,
0x5, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xf, 0x14, 0x11,
0x13, 0xd, 0xf, 0x14, 0x15, 0x16, 0x16, 0x16, 0x13, 0x17,
0x18, 0x18, 0x18, 0xd, 0xd, 0xc, 0xd, 0xd, 0xc, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xa, 0x6, 0x3,
0x2, 0x7, 0x8, 0xa, 0xb, 0xc, 0xc, 0xc, 0xd, 0xd,
0x5, 0x3, 0x2, 0x3, 0x8, 0xc, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0x11, 0x14, 0xe, 0xd, 0xe, 0x12, 0x13, 0x14,
0x14, 0x15, 0x14, 0x14, 0x15, 0x16, 0x14, 0xd, 0xd, 0xc,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xa, 0x6, 0x6, 0x6, 0xa, 0xb, 0xb, 0xc, 0xd,
0xe, 0xf, 0x10, 0x10, 0x8, 0x6, 0x4, 0x5, 0x9, 0xb,
0xe, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0xf, 0xe, 0xd, 0xe, 0xf, 0xe, 0xf,
0xf, 0x11, 0x12, 0x13, 0x13, 0x13, 0x13, 0x13, 0x14, 0x14,
0x13, 0xd, 0xc, 0xd, 0xd, 0xd, 0xc, 0xc, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xe, 0xc, 0x9, 0x8, 0xa, 0xa,
0xc, 0xe, 0xe, 0x10, 0x12, 0x13, 0x13, 0x12, 0xd, 0xa,
0xa, 0x7, 0x9, 0xf, 0x13, 0x11, 0xe, 0xe, 0xd, 0xd,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xe, 0xe, 0x12, 0x11,
0x13, 0x13, 0x13, 0x13, 0xf, 0x10, 0xe, 0xd, 0x13, 0x12,
0x12, 0x12, 0xd, 0x10, 0x11, 0xd, 0xc, 0xd, 0xd, 0xd,
0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0x12,
0x10, 0xc, 0xb, 0x10, 0x10, 0x11, 0x12, 0x14, 0x14, 0x16,
0x14, 0x12, 0x10, 0xd, 0xd, 0xc, 0x8, 0x9, 0xe, 0x13,
0x12, 0x11, 0x13, 0x12, 0xe, 0xd, 0xe, 0xf, 0xe, 0xe,
0x12, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11, 0x10, 0x10, 0xd,
0xd, 0xd, 0xc, 0xe, 0xf, 0x10, 0x11, 0x11, 0x12, 0xc,
0xc, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xd, 0xd, 0xd, 0x15, 0x12, 0xd, 0xb, 0x11, 0x13, 0x14,
0x15, 0x14, 0x12, 0x13, 0x12, 0xe, 0xe, 0xd, 0xd, 0xd,
0x9, 0x7, 0xc, 0x12, 0x12, 0x10, 0x10, 0x13, 0x14, 0x11,
0x10, 0x10, 0x12, 0x11, 0xf, 0xe, 0xd, 0xc, 0xd, 0xe,
0xd, 0xc, 0xa, 0xa, 0x9, 0xc, 0x10, 0x10, 0x12, 0x13,
0x12, 0x12, 0x13, 0xc, 0xc, 0xc, 0xc, 0xd, 0xc, 0xc,
0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0x11, 0x15, 0x14, 0x10,
0xd, 0xe, 0xe, 0x10, 0x10, 0x10, 0x10, 0xe, 0xf, 0xd,
0xd, 0xd, 0xd, 0xd, 0xc, 0x7, 0xa, 0xe, 0x14, 0xd,
0xe, 0x10, 0x14, 0x14, 0x11, 0x10, 0xc, 0xe, 0xb, 0xe,
0xf, 0xa, 0xb, 0xd, 0xa, 0x8, 0x9, 0x9, 0x8, 0xe,
0x13, 0x13, 0x12, 0x12, 0x12, 0x12, 0x13, 0xc, 0xc, 0xc,
0xd, 0xc, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xf,
0x16, 0x16, 0x14, 0xf, 0xd, 0xd, 0xa, 0x9, 0x9, 0xa,
0xb, 0xb, 0x9, 0xa, 0xd, 0xc, 0xb, 0xa, 0xa, 0x9,
0xa, 0x9, 0x13, 0x11, 0x8, 0x8, 0xf, 0x15, 0x10, 0xb,
0xa, 0xa, 0xc, 0xa, 0x9, 0x8, 0xb, 0x8, 0x8, 0x6,
0x9, 0xd, 0x9, 0x9, 0xc, 0x10, 0x12, 0x11, 0x10, 0x12,
0x14, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd, 0xd,
0xe, 0xf, 0x14, 0x16, 0x16, 0x16, 0x16, 0x10, 0xc, 0x8,
0x8, 0x6, 0x6, 0x8, 0x7, 0x7, 0x6, 0x7, 0xa, 0x8,
0x9, 0x8, 0xb, 0x9, 0x8, 0x6, 0xc, 0x10, 0xa, 0x6,
0xb, 0xf, 0xe, 0xa, 0xc, 0xb, 0xb, 0xb, 0x9, 0x7,
0x9, 0x8, 0xb, 0xa, 0x8, 0x7, 0x8, 0x9, 0x12, 0x14,
0x14, 0x13, 0x13, 0x11, 0x13]
data2 = [0xf, 0xe, 0xe, 0xd, 0xd, 0xe, 0xe, 0xd, 0xc, 0xa, 0xd,
0x15, 0x11, 0xe, 0xb, 0xa, 0xb, 0x10, 0x11, 0x8, 0x8,
0x7, 0xa, 0xc, 0xd, 0xc, 0x10, 0x12, 0x9, 0x6, 0x7,
0x8, 0x7, 0x8, 0x9, 0x8, 0x9, 0xa, 0xc, 0xc, 0xe,
0x10, 0x10, 0xe, 0x9, 0x4, 0x3, 0x5, 0x6, 0x6, 0x6,
0x3, 0x4, 0x6, 0x6, 0x5, 0x5, 0x5, 0x5, 0x4, 0x5,
0x7, 0x5, 0x4, 0xf, 0xf, 0xe, 0xd, 0xd, 0xe, 0xe,
0xd, 0xc, 0xb, 0x15, 0xf, 0xf, 0xe, 0xb, 0xa, 0x8,
0x8, 0xa, 0x8, 0x8, 0x7, 0x9, 0xb, 0xb, 0xb, 0x13,
0xd, 0xc, 0x5, 0x6, 0x7, 0x7, 0x8, 0x9, 0x9, 0xa,
0xc, 0xf, 0x11, 0x11, 0x11, 0x10, 0xa, 0x4, 0x4, 0x5,
0x6, 0x7, 0x7, 0x6, 0x4, 0x5, 0x7, 0x6, 0x6, 0x5,
0x5, 0x4, 0x3, 0x5, 0x6, 0x4, 0x3, 0xf, 0xf, 0xe,
0xd, 0xd, 0xe, 0xe, 0xd, 0xc, 0x13, 0xf, 0xd, 0xf,
0xe, 0xc, 0xa, 0x8, 0x8, 0x9, 0x8, 0x8, 0x7, 0x9,
0xa, 0x9, 0x10, 0xe, 0x8, 0x11, 0x5, 0x6, 0x9, 0x10,
0x11, 0x11, 0x12, 0x12, 0x13, 0x15, 0x16, 0x16, 0x15, 0x13,
0xa, 0x4, 0x5, 0x6, 0x7, 0x9, 0x9, 0x6, 0x5, 0x8,
0x8, 0x6, 0x6, 0x5, 0x4, 0x4, 0x3, 0x3, 0x4, 0x3,
0x3, 0xf, 0xf, 0xe, 0xe, 0xd, 0xe, 0xe, 0xe, 0xe,
0x13, 0xc, 0xd, 0xe, 0xe, 0xd, 0xc, 0xa, 0x9, 0x9,
0x9, 0x8, 0x7, 0x9, 0xa, 0xc, 0x12, 0xa, 0x8, 0x12,
0x6, 0x6, 0x7, 0x7, 0x6, 0x7, 0x8, 0x9, 0xc, 0xf,
0x14, 0xe, 0xa, 0x5, 0x4, 0x5, 0x6, 0x7, 0x9, 0xa,
0xa, 0x7, 0x7, 0x9, 0x9, 0x7, 0x6, 0x6, 0x5, 0x6,
0x6, 0x6, 0x6, 0x5, 0x5, 0xf, 0xe, 0xe, 0xd, 0xd,
0xe, 0xe, 0xe, 0xf, 0x12, 0xb, 0xc, 0xd, 0xe, 0xe,
0xe, 0xc, 0xb, 0xb, 0xb, 0xa, 0xa, 0xb, 0xe, 0x17,
0x12, 0x12, 0x12, 0x14, 0xc, 0x7, 0x7, 0x7, 0x6, 0x6,
0x8, 0xa, 0xd, 0xe, 0x14, 0xb, 0x6, 0x4, 0x5, 0x6,
0x7, 0x9, 0xa, 0xb, 0xa, 0x7, 0x9, 0xb, 0x9, 0x7,
0x6, 0x6, 0x6, 0x7, 0x7, 0x7, 0x7, 0x7, 0x6, 0xf,
0xf, 0xe, 0xe, 0xd, 0xe, 0xf, 0xe, 0xc, 0x14, 0x8,
0x8, 0xb, 0xe, 0xe, 0xe, 0xd, 0x11, 0x16, 0xf, 0xc,
0xc, 0xe, 0x16, 0xe, 0xd, 0xc, 0x9, 0x8, 0x13, 0x7,
0x7, 0x7, 0x6, 0x6, 0x7, 0x9, 0xc, 0xd, 0x14, 0xa,
0x7, 0x6, 0x6, 0x8, 0x9, 0xa, 0xc, 0xc, 0xa, 0x9,
0xb, 0xb, 0xa, 0x8, 0x7, 0x7, 0x7, 0x7, 0x8, 0x7,
0x7, 0x7, 0x6, 0xf, 0xe, 0xe, 0xe, 0xd, 0xe, 0xf,
0xd, 0x7, 0xa, 0x10, 0x4, 0x5, 0xc, 0xf, 0x13, 0x16,
0x13, 0xd, 0xc, 0xc, 0xd, 0x16, 0xf, 0xd, 0xd, 0xc,
0x9, 0x7, 0x11, 0xb, 0x8, 0x7, 0x6, 0x5, 0x6, 0x9,
0xc, 0xd, 0x14, 0xb, 0xa, 0x8, 0x8, 0x9, 0xb, 0xb,
0xd, 0xc, 0xa, 0xb, 0xc, 0xb, 0xb, 0x9, 0x8, 0x7,
0x7, 0x8, 0x8, 0x8, 0x7, 0x7, 0x6, 0xe, 0xe, 0xe,
0xe, 0xd, 0xd, 0xe, 0xb, 0x3, 0x2, 0x9, 0x11, 0x12,
0x13, 0x13, 0x12, 0xd, 0xc, 0xc, 0xc, 0xc, 0x10, 0x12,
0xd, 0xd, 0xd, 0xb, 0x9, 0x8, 0xe, 0xd, 0x7, 0x8,
0x6, 0x5, 0x6, 0x9, 0xb, 0xc, 0x14, 0xc, 0xb, 0xa,
0xa, 0xb, 0xc, 0xc, 0xd, 0xc, 0xb, 0xc, 0xd, 0xc,
0xb, 0xa, 0x8, 0x8, 0x8, 0x8, 0x8, 0x8, 0x7, 0x7,
0x6, 0xe, 0xe, 0xe, 0xe, 0xd, 0xd, 0xe, 0x7, 0x2,
0x4, 0x4, 0x4, 0x4, 0x3, 0x3, 0x9, 0xa, 0xa, 0xb,
0xb, 0xc, 0xc, 0xc, 0xc, 0xc, 0xc, 0xb, 0x8, 0x7,
0x5, 0x4, 0x6, 0x7, 0x6, 0x5, 0x5, 0x8, 0xa, 0xb,
0x14, 0xd, 0xc, 0xb, 0xb, 0xc, 0xd, 0xd, 0xd, 0xd,
0xc, 0xd, 0xd, 0xd, 0xc, 0xa, 0x9, 0x8, 0x8, 0x8,
0x8, 0x8, 0x7, 0x7, 0x6, 0xf, 0xe, 0xe, 0xe, 0xd,
0xd, 0xd, 0x3, 0x4, 0x5, 0x5, 0x5, 0x4, 0x3, 0x3,
0x3, 0x7, 0x9, 0xb, 0xc, 0xd, 0xc, 0xd, 0xc, 0xc,
0xb, 0x9, 0x7, 0x5, 0x5, 0x5, 0x5, 0x4, 0x3, 0x3,
0x3, 0x3, 0x4, 0x7, 0xb, 0xb, 0xc, 0xc, 0xc, 0xd,
0xd, 0xe, 0xd, 0xd, 0xd, 0xd, 0xe, 0xd, 0xc, 0xb,
0x9, 0x8, 0x8, 0x8, 0x8, 0x8, 0x7, 0x6, 0x5, 0xf,
0xf, 0xe, 0xe, 0xd, 0xd, 0xb, 0x3, 0x5, 0x6, 0x6,
0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x9, 0xd, 0xd, 0xd,
0xc, 0xa, 0xb, 0x9, 0x8, 0x7, 0x5, 0x4, 0x3, 0x3,
0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x4, 0x7,
0xa, 0xb, 0xd, 0xe, 0xd, 0xe, 0xe, 0xd, 0xe, 0xe,
0xd, 0xd, 0xc, 0xb, 0xa, 0x9, 0x8, 0x8, 0x8, 0x8,
0x7, 0x6, 0x5, 0xf, 0xf, 0xe, 0xe, 0xd, 0xd, 0x9,
0x3, 0x5, 0x6, 0x5, 0x5, 0x4, 0x4, 0x3, 0x2, 0x2,
0x4, 0xb, 0xc, 0xa, 0x8, 0x7, 0x5, 0x4, 0x4, 0x4,
0x3, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1,
0x2, 0x2, 0x3, 0x4, 0x4, 0x5, 0x9, 0xd, 0xd, 0xe,
0xd, 0xe, 0xd, 0xd, 0xd, 0xd, 0xc, 0xb, 0x9, 0x9,
0x8, 0x8, 0x8, 0x8, 0x7, 0x5, 0x6, 0xf, 0xe, 0xe,
0xe, 0xd, 0xd, 0x7, 0x4, 0x6, 0x6, 0x5, 0x4, 0x4,
0x3, 0x3, 0x2, 0x2, 0x2, 0x4, 0x9, 0x9, 0x5, 0x3,
0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x2, 0x2, 0x1,
0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x5, 0x5, 0x3, 0x2,
0x2, 0x6, 0xc, 0xd, 0xd, 0xd, 0xe, 0xe, 0xd, 0xc,
0xb, 0x9, 0x8, 0x7, 0x7, 0x7, 0x7, 0x8, 0x7, 0x5,
0x6, 0xf, 0xe, 0xe, 0xe, 0xd, 0xc, 0x4, 0x5, 0x7,
0x6, 0x5, 0x4, 0x4, 0x3, 0x3, 0x2, 0x2, 0x2, 0x3,
0x4, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x2, 0x3,
0x3, 0x3, 0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x2, 0x4,
0x6, 0x6, 0x3, 0x2, 0x2, 0x2, 0x5, 0x9, 0xc, 0xe,
0xe, 0xc, 0x8, 0x6, 0x5, 0x5, 0x6, 0x7, 0x6, 0x6,
0x6, 0x7, 0x6, 0x5, 0x6, 0xf, 0xe, 0xe, 0xe, 0xd,
0xb, 0x4, 0x5, 0x7, 0x6, 0x5, 0x5, 0x4, 0x4, 0x3,
0x3, 0x3, 0x2, 0x2, 0x2, 0x2, 0x4, 0x7, 0x9, 0xa,
0x9, 0x7, 0x4, 0x2, 0x4, 0x4, 0x4, 0x4, 0x3, 0x2,
0x2, 0x2, 0x2, 0x4, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3,
0x4, 0x5, 0x9, 0xc, 0xa, 0x4, 0x3, 0x4, 0x3, 0x3,
0x4, 0x6, 0x6, 0x7, 0x8, 0x7, 0x5, 0x4, 0x6, 0xf,
0xe, 0xe, 0xe, 0xd, 0xa, 0x3, 0x5, 0x7, 0x6, 0x5,
0x4, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x2, 0x2, 0x7,
0xd, 0xd, 0xc, 0xd, 0x12, 0xe, 0xa, 0x5, 0x1, 0x4,
0x4, 0x4, 0x5, 0x5, 0x4, 0x3, 0x2, 0x4, 0x4, 0x3,
0x4, 0x5, 0x6, 0x5, 0x6, 0x6, 0x5, 0x6, 0x5, 0x4,
0x4, 0x5, 0x4, 0x4, 0x3, 0x5, 0x7, 0x8, 0x9, 0x6,
0x3, 0x2, 0x3, 0xe, 0xe, 0xe, 0xe, 0xd, 0x9, 0x4,
0x6, 0x7, 0x7, 0x5, 0x5, 0x4, 0x3, 0x3, 0x3, 0x3,
0x3, 0x2, 0x8, 0x10, 0x11, 0xf, 0xa, 0x7, 0x9, 0xf,
0xd, 0xb, 0x5, 0x2, 0x3, 0x6, 0x6, 0x7, 0x4, 0x2,
0x2, 0x3, 0x1, 0x0, 0x1, 0x4, 0x3, 0x5, 0x4, 0x5,
0x6, 0x4, 0x3, 0x4, 0x4, 0x4, 0x5, 0x4, 0x3, 0x5,
0x9, 0xa, 0xa, 0x6, 0x3, 0x2, 0x2, 0xe, 0xe, 0xe,
0xd, 0xd, 0x7, 0x4, 0x5, 0x7, 0x7, 0x6, 0x5, 0x4,
0x4, 0x4, 0x4, 0x3, 0x3, 0x6, 0x10, 0x12, 0x11, 0x6,
0x4, 0x2, 0x3, 0x3, 0xd, 0xe, 0x9, 0x3, 0x3, 0x3,
0x5, 0x4, 0x2, 0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x3,
0x2, 0x4, 0x1, 0x1, 0x3, 0x2, 0x2, 0x4, 0x5, 0x6,
0x5, 0x5, 0x4, 0x4, 0x9, 0xa, 0x8, 0x5, 0x2, 0x2,
0x3, 0xe, 0xe, 0xe, 0xd, 0xd, 0x6, 0x6, 0x5, 0x7,
0x7, 0x7, 0x6, 0x5, 0x4, 0x4, 0x4, 0x4, 0x5, 0x9,
0x11, 0x13, 0x10, 0x5, 0x3, 0x2, 0x2, 0x2, 0xa, 0xd,
0xb, 0x4, 0x3, 0x3, 0x1, 0x2, 0x2, 0x1, 0x0, 0x0,
0x0, 0x0, 0x1, 0x3, 0x1, 0x3, 0x0, 0x1, 0x3, 0x6,
0x7, 0x5, 0x4, 0x4, 0x5, 0x5, 0x5, 0x4, 0xb, 0xa,
0x7, 0x4, 0x3, 0x3, 0x5, 0xe, 0xe, 0xd, 0xd, 0xd,
0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x6, 0x5, 0x4, 0x3,
0x3, 0x3, 0x4, 0x6, 0x8, 0xc, 0xb, 0x6, 0x2, 0x2,
0x2, 0x2, 0x2, 0x4, 0x3, 0x1, 0x1, 0x2, 0x3, 0x2,
0x3, 0x2, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x1, 0x2,
0x1, 0x0, 0x3, 0xc, 0x10, 0xf, 0xa, 0x6, 0x4, 0x5,
0x5, 0x4, 0xc, 0xc, 0xa, 0x8, 0x6, 0x6, 0x8, 0xe,
0xd, 0xd, 0xd, 0xc, 0x6, 0x6, 0x7, 0x6, 0x6, 0x6,
0x5, 0x4, 0x3, 0x3, 0x3, 0x3, 0x3, 0x4, 0x3, 0x2,
0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2,
0x3, 0x3, 0x3, 0x2, 0x3, 0x2, 0x2, 0x2, 0x2, 0x3,
0x2, 0x2, 0x2, 0x2, 0x4, 0x1, 0x2, 0x6, 0xb, 0x11,
0x11, 0xb, 0x8, 0x5, 0x5, 0x4, 0xb, 0xd, 0xb, 0xb,
0x9, 0x8, 0x9, 0xe, 0xd, 0xd, 0xd, 0xc, 0x5, 0x4,
0x7, 0x6, 0x6, 0x5, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x2, 0x2, 0x3, 0x3, 0x2, 0x3, 0x3, 0x3, 0x3,
0x2, 0x1, 0x1, 0x2, 0x3, 0x3, 0x2, 0x3, 0x3, 0x3,
0x4, 0x4, 0x4, 0x4, 0xb, 0x10, 0xe, 0x8, 0x5, 0x4,
0xa, 0xb, 0xb, 0xc, 0xb, 0x9, 0x8, 0xd, 0xd, 0xd,
0xd, 0xa, 0x2, 0x3, 0x5, 0x6, 0x6, 0x4, 0x3, 0x2,
0x2, 0x2, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1,
0x2, 0x1, 0x1, 0x1, 0x2, 0x2, 0x3, 0x2, 0x3, 0x3,
0x3, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x3,
0x2, 0x3, 0x2, 0x3, 0x4, 0x5, 0x5, 0x4, 0x2, 0xe,
0x11, 0xe, 0x5, 0x4, 0x9, 0xa, 0xa, 0xb, 0xb, 0x9,
0x9, 0xc, 0xc, 0xc, 0xc, 0xa, 0x4, 0x3, 0x3, 0x5,
0x5, 0x3, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x3, 0x2,
0x2, 0x3, 0x5, 0x3, 0x2, 0x3, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x2, 0x3,
0x5, 0x5, 0x5, 0xb, 0x13, 0x11, 0x6, 0x5, 0xb, 0xc,
0xb, 0xb, 0xb, 0xa, 0xa, 0xc, 0xc, 0xc, 0xc, 0x9,
0x5, 0x4, 0x2, 0x4, 0x4, 0x2, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
0x1, 0x2, 0x2, 0x2, 0x4, 0x3, 0x2, 0x2, 0x3, 0x2,
0x2, 0x2, 0x2, 0x3, 0x2, 0x2, 0x3, 0x1, 0x1, 0x2,
0x3, 0x3, 0x2, 0x3, 0x4, 0x5, 0x6, 0x8, 0x11, 0x13,
0x7, 0x5, 0xc, 0xc, 0xc, 0xb, 0xb, 0xb, 0xb, 0xb,
0xb, 0xb, 0xb, 0x9, 0x3, 0x3, 0x4, 0x3, 0x2, 0x2,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x2, 0x3, 0x3, 0x2, 0x2, 0x2,
0x1, 0x0, 0x1, 0x2, 0x3, 0x4, 0x3, 0x3, 0x3, 0x4,
0x5, 0x5, 0x7, 0xc, 0x6, 0x5, 0xb, 0xb, 0xb, 0xb,
0xb, 0xb, 0xb, 0xc, 0xc, 0xd, 0xc, 0x9, 0x2, 0x2,
0x3, 0x3, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x2, 0x2,
0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x3, 0x3,
0x2, 0x2, 0x1, 0x2, 0x2, 0x1, 0x1, 0x1, 0x2, 0x2,
0x3, 0x3, 0x3, 0x3, 0x4, 0x4, 0x4, 0x4, 0x3, 0x3,
0x5, 0xa, 0xb, 0xb, 0xb, 0xc, 0xc, 0xd, 0xd, 0xd,
0xe, 0xc, 0x3, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x0, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2,
0x2, 0x1, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2,
0x2, 0x2, 0x2, 0x2, 0x4, 0x5, 0x8, 0xa, 0xb, 0xc,
0x8, 0x5, 0x3, 0x2, 0x2, 0x3, 0x2, 0x2, 0x3, 0x4,
0x4, 0x3, 0x2, 0x2, 0x2, 0x4, 0xb, 0xc, 0xc, 0xc,
0xd, 0xe, 0xe, 0xe, 0xe, 0xe, 0xd, 0x3, 0x2, 0x2,
0x1, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1,
0x0, 0x1, 0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1,
0x1, 0x1, 0x1, 0x2, 0x2, 0x1, 0x3, 0xa, 0xd, 0xe,
0xe, 0xf, 0xf, 0x11, 0x10, 0xe, 0xc, 0xb, 0x8, 0x3,
0x2, 0x2, 0x2, 0x3, 0x3, 0x3, 0x2, 0x2, 0x2, 0x3,
0xa, 0xc, 0xc, 0xd, 0xd, 0xe, 0xe, 0xf, 0xf, 0xe,
0xd, 0x4, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x1,
0x1, 0x1, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2, 0x2,
0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x2,
0x9, 0xc, 0x11, 0x12, 0x11, 0x10, 0xf, 0x11, 0x11, 0x10,
0x10, 0xf, 0x10, 0xf, 0x4, 0x2, 0x2, 0x2, 0x3, 0x3,
0x3, 0x2, 0x2, 0x3, 0xa, 0xd, 0xd, 0xd, 0xe, 0xf,
0xf, 0xf, 0xf, 0xf, 0xd, 0x4, 0x2, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x2,
0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x0, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x2, 0x8, 0xc, 0x12, 0x13, 0x11,
0xf, 0x11, 0x12, 0x12, 0x12, 0x12, 0x11, 0xf, 0x4, 0x2,
0x2, 0x2, 0x2, 0x3, 0x2, 0x2, 0x2, 0x3, 0xa, 0xe,
0xe, 0xe, 0xe, 0x10, 0xf, 0xf, 0xf, 0xe, 0xb, 0x2,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0,
0x0, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x2,
0x9, 0xc, 0xe, 0x10, 0xe, 0x11, 0x10, 0x10, 0x11, 0xf,
0xd, 0xa, 0x1, 0x2, 0x1, 0x2, 0x2, 0x2, 0x3, 0x2,
0x1, 0x3, 0xb, 0xd, 0xd, 0xe, 0xf, 0x10, 0xf, 0xf,
0xf, 0xe, 0x7, 0x2, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1,
0x0, 0x0, 0x0, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x0, 0x0, 0x1, 0x3, 0x9, 0xb, 0xc, 0xd, 0xd,
0xc, 0xc, 0xc, 0xc, 0xa, 0x3, 0x2, 0x1, 0x1, 0x1,
0x1, 0x1, 0x2, 0x2, 0x2, 0x4, 0xd, 0xf, 0xe, 0xe,
0xf, 0x10, 0xf, 0xf, 0xf, 0xc, 0x4, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x2, 0x2,
0x6, 0x9, 0xb, 0xa, 0xb, 0xb, 0xa, 0x9, 0x4, 0x1,
0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2, 0x4,
0xc, 0xe, 0xf, 0xf, 0x10, 0x11, 0x10, 0xf, 0x10, 0x10,
0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2,
0x1, 0x0, 0x2, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x2, 0x1, 0x2, 0x1, 0x2, 0x4, 0x6, 0x6, 0x5,
0x3, 0x1, 0x0, 0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1,
0x2, 0x2, 0x1, 0x4, 0xd, 0xe, 0xd, 0xf, 0x10, 0x10,
0x12, 0x13, 0x13, 0x12, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x2, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x1, 0x2, 0x1, 0x2, 0x2, 0x2, 0x2,
0x2, 0x2, 0x2, 0x2, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0xe, 0xf,
0xf, 0xf, 0xf, 0x13, 0x13, 0x13, 0x13, 0x13, 0xc, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x2,
0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x2, 0x2, 0x1,
0x1, 0x1, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x2, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x6, 0xc, 0x10, 0x10, 0x10, 0x10, 0x13, 0x13, 0x13,
0x13, 0x13, 0x10, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x0,
0x1, 0x1, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0,
0x1, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x1, 0x2,
0x2, 0x1, 0x1, 0x2, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x8, 0x11, 0xf, 0x10, 0x12,
0x12, 0x13, 0x14, 0x14, 0x14, 0x14, 0x10, 0x3, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1,
0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x0, 0x0,
0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0xc,
0x12, 0x14, 0x12, 0x11, 0x14, 0x13, 0x14, 0x14, 0x14, 0x13,
0x11, 0x6, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x2, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0,
0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x2, 0xc, 0x14, 0x14, 0x14, 0x14, 0x12, 0x13,
0x13, 0x14, 0x13, 0x13, 0x12, 0xa, 0x1, 0x1, 0x1, 0x1,
0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0x0,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x2, 0x5, 0x10, 0x11, 0x14,
0x14, 0x15, 0x15, 0x12, 0x12, 0x12, 0x13, 0x13, 0x12, 0xc,
0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1,
0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1,
0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x9, 0x12, 0x13, 0x12, 0x15, 0x14, 0x15, 0xd, 0xe, 0xf,
0xf, 0x11, 0x12, 0xf, 0x4, 0x1, 0x1, 0x0, 0x1, 0x1,
0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0,
0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1,
0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x2, 0xe, 0x14, 0x13, 0x14, 0x13, 0x15,
0x14, 0x9, 0xc, 0xc, 0x9, 0xb, 0x10, 0xe, 0x6, 0x1,
0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0, 0x0,
0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1,
0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x3, 0x10, 0x15,
0x15, 0x13, 0x14, 0x12, 0x15, 0xa, 0xa, 0xa, 0xa, 0xc,
0xd, 0xd, 0x7, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0,
0x0, 0x1, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1,
0x1, 0xa, 0x11, 0x14, 0x15, 0x14, 0x13, 0x14, 0x13, 0xb,
0xc, 0xe, 0xe, 0x10, 0x11, 0xd, 0x8, 0x2, 0x1, 0x1,
0x1, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x2, 0xf, 0x14, 0x13, 0x14, 0x15,
0x14, 0x14, 0x14, 0x11, 0x12, 0x11, 0x13, 0x14, 0x13, 0x12,
0xc, 0x2, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x0,
0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x6, 0x13,
0x14, 0x13, 0x14, 0x14, 0x15, 0x14, 0x15, 0x13, 0x12, 0x14,
0x14, 0x14, 0x14, 0x13, 0xd, 0x3, 0x1, 0x2, 0x1, 0x1,
0x1, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1,
0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x2, 0xf, 0x14, 0x15, 0x14, 0x13, 0x15, 0x15, 0x16,
0x14, 0x13, 0x13, 0x14, 0x14, 0x14, 0x13, 0x12, 0xe, 0x3,
0x2, 0x1, 0x1, 0x1, 0x1, 0x0, 0x1, 0x1, 0x1, 0x0,
0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x1, 0x0,
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x0, 0x1, 0x5, 0x14, 0x15, 0x15, 0x15,
0x13, 0x15, 0x16, 0x16, 0x15, 0x14, 0x14, 0x14, 0x14, 0x13,
0x13, 0x12, 0xd, 0x3, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x9,
0x15, 0x15, 0x15, 0x15, 0x15, 0x13, 0x16, 0x16, 0x16, 0x14,
0x14, 0x14, 0x14, 0x13, 0x13, 0x11, 0x9, 0x2, 0x1, 0x1,
0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x1, 0x1,
0x0, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0xe, 0x16, 0x16, 0x16, 0x16, 0x15, 0x14,
0x16, 0x16, 0x16, 0x13, 0x14, 0x14, 0x14, 0x14, 0x12, 0xd,
0x4, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x1,
0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x1, 0x0, 0x0, 0x1, 0x1, 0x1, 0x1,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x5, 0x12, 0x16, 0x16,
0x16, 0x15, 0x15, 0x15, 0x14, 0x16, 0x16, 0xf, 0x10, 0x11,
0x11, 0x11, 0xe, 0x7, 0x2, 0x1, 0x1, 0x1, 0x1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1,
0xc, 0x16, 0x18, 0x17, 0x16, 0x17, 0x17, 0x15, 0x14, 0x16,
0x16, 0xd, 0xc, 0xc, 0xb, 0xb, 0x8, 0x3, 0x1, 0x1,
0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x1,
0x1, 0x1, 0x1, 0x2, 0x15, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x15, 0x14, 0x14, 0x15, 0xd, 0xc, 0xc, 0xa, 0x7,
0x3, 0x1, 0x1, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x1, 0x0, 0x1, 0x1, 0x1, 0x5, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x15, 0x14, 0x11, 0x12, 0xc,
0xc, 0xb, 0x8, 0x5, 0x1, 0x1, 0x1, 0x1, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0xb, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x18, 0x13,
0x14, 0xd, 0xc, 0xc, 0xb, 0x9, 0x5, 0x2, 0x1, 0x1,
0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x2, 0x13, 0x19, 0x19, 0x19, 0x19,
0x19, 0x19, 0x17, 0x19, 0x19, 0x18, 0xf, 0xb, 0x9, 0x6,
0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x7, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0xa, 0x6, 0x3, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0xc, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x7, 0x3, 0x2, 0x1, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x16, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x5,
0x2, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x3, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x15, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x2, 0x2, 0x1,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x2, 0x1, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0,
0xd, 0x19, 0x19, 0x18, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
0x19, 0x19, 0x19, 0x19, 0x19]
input = [Int('input%d' % i) for i in range(64)]
s = Solver()
iiput = [0] * 64
for i in range(64):
iiput[i] = input[i]
output = [0x025D15D4, 0x024C73B4, 0x0243CF71, 0x0230134C, 0x02132CFE, 0x01BE2FCA,
0x0142CA26, 0x00D61955, 0x009427A8, 0x009B8674, 0x0090C832, 0x008812C7,
0x0080BA58, 0x007981E1, 0x0072AB68, 0x0074CB4B, 0x00723F3F, 0x007CC258,
0x0089CD5C, 0x0088E2A2, 0x008E8906, 0x008B88A0, 0x008EEC8D, 0x008F3573,
0x008B746F, 0x00912C82, 0x008D7CF2, 0x00832099, 0x007F45A5, 0x00685AFF,
0x0050A4D2, 0x00526FE2, 0x0058923B, 0x00529EC1, 0x00516D1A, 0x005B7453,
0x007028E6, 0x0089C6FA, 0x00A5D6AE, 0x00D37A14, 0x00B8CFAA, 0x00B0BB4B,
0x00AE69A4, 0x00A1154B, 0x009DCBE7, 0x00A1DC20, 0x00AA07E3, 0x00B25CB1,
0x00B2FD98, 0x00B12F29, 0x00E428A0, 0x011B2184, 0x01615722, 0x01A502F3,
0x01C0AA9D, 0x01D4169F, 0x01EF8B76, 0x0233E5BB, 0x0275A6F0, 0x02A9CA35,
0x02A8904C, 0x02A194EF, 0x02926F39, 0x028E92C3]
v9 = [0] * 64
for k in range(64):
num = 0
for m in range(64):
num += iiput[m] * data1[(64 * m) + k]
v9[k] = num
for n in range(64):
iiput[n] = v9[n]
#************************************************************************
for k in range(64):
num = 0
for m in range(64):
num += iiput[m] * data2[(64 * m) + k]
v9[k] = num
for n in range(64):
iiput[n] = v9[n]
for n in range(64):
s.add(iiput[n] == output[n])
if s.check() == sat:
m = s.model()
an = ''
for i in range(64):
an += chr(m[input[i]].as_long().real)
for i in range(len(iiput)):
print(an[i], end='')
# for i in range(64):
# print(chr("%s" % (m[input[i]])),end='')
else:
print("failed to solve")
得到flag
Z3复合表达式问题
中间遇到了z3无法求解的问题, 其实之前也遇到过, 但是因为没做笔记所以忘了, 这里补一下
一开始我的代码时这样的
#前面的data1和data2太长了, 省略
input = [Int('input%d' % i) for i in range(64)]
s = Solver()
for i in range(64):
output = [0x025D15D4, 0x024C73B4, 0x0243CF71, 0x0230134C, 0x02132CFE, 0x01BE2FCA,
0x0142CA26, 0x00D61955, 0x009427A8, 0x009B8674, 0x0090C832, 0x008812C7,
0x0080BA58, 0x007981E1, 0x0072AB68, 0x0074CB4B, 0x00723F3F, 0x007CC258,
0x0089CD5C, 0x0088E2A2, 0x008E8906, 0x008B88A0, 0x008EEC8D, 0x008F3573,
0x008B746F, 0x00912C82, 0x008D7CF2, 0x00832099, 0x007F45A5, 0x00685AFF,
0x0050A4D2, 0x00526FE2, 0x0058923B, 0x00529EC1, 0x00516D1A, 0x005B7453,
0x007028E6, 0x0089C6FA, 0x00A5D6AE, 0x00D37A14, 0x00B8CFAA, 0x00B0BB4B,
0x00AE69A4, 0x00A1154B, 0x009DCBE7, 0x00A1DC20, 0x00AA07E3, 0x00B25CB1,
0x00B2FD98, 0x00B12F29, 0x00E428A0, 0x011B2184, 0x01615722, 0x01A502F3,
0x01C0AA9D, 0x01D4169F, 0x01EF8B76, 0x0233E5BB, 0x0275A6F0, 0x02A9CA35,
0x02A8904C, 0x02A194EF, 0x02926F39, 0x028E92C3]
v9 = [0] * 64
for k in range(64):
num = 0
for m in range(64):
num += input[m] * data1[(64 * m) + k]
v9[k] = num
for n in range(64):
input[n] = v9[n]
#************************************************************************
for k in range(64):
num = 0
for m in range(64):
num += input[m] * data2[(64 * m) + k]
v9[k] = num
for n in range(64):
input[n] = v9[n]
for n in range(64):
s.add(input[n] == output[n])
if s.check() == sat:
m = s.model()
for i in range(64):
print(chr("%s" % (m[input[i]])),end='')
else:
print("failed to solve")
发生了这样的错误提示
z3.z3types.Z3Exception: Integer, Z3 declaration, or Z3 constant expected
原因在于input在上面的语句中已经变成了符号表达式了
num += input[m] * data2[(64 * m) + k]
v9[k] = num
input[n] = v9[n]
s.add(input[n] == output[n])
也就是input[i] = input[XX] * data2[XXXXX] + input[XX] * data2[XXXXX] + .............
这样时无法求解的
所以要用一个中间的变量
也就是我们的脚本代码中的
iiput[i] = input[i]
用iiput代替input进行约束, 最后的得出结果的时候在用回input就行了
用一个GitHub上的例子非常直观
#修改前
#!/usr/bin/python
from z3 import *
eax=BitVec("eax", 32)
ecx=eax+0x1a
eax=eax+5
ecx=eax*ecx
edx=ecx
edx=edx >> 8
eax=edx ^ ecx
eax=eax >> 16
eax=eax ^ edx ^ ecx
s = Solver()
s.add(eax == 0x1c966f8d)
s.check()
m = s.model()
print (m)
print (m[eax].as_long()) # error
#修改后
from z3 import *
eax0=BitVec("eax", 32)
eax=eax0 #使用了eax代替eax0
ecx=eax+0x1a
............
s.add(eax == 0x1c966f8d)
s.check()
m = s.model()
print (m)
print (m[eax0].as_long()) #最后用回eax0