aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/char/ip2
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
committerLinus Torvalds <torvalds@ppc970.osdl.org>2005-04-16 18:20:36 -0400
commit1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch)
tree0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/char/ip2
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history, even though we have it. We can create a separate "historical" git archive of that later if we want to, and in the meantime it's about 3.2GB when imported into git - space that would just make the early git days unnecessarily complicated, when we don't have a lot of good infrastructure for it. Let it rip!
Diffstat (limited to 'drivers/char/ip2')
-rw-r--r--drivers/char/ip2/fip_firm.h2149
-rw-r--r--drivers/char/ip2/i2cmd.c209
-rw-r--r--drivers/char/ip2/i2cmd.h643
-rw-r--r--drivers/char/ip2/i2ellis.c1487
-rw-r--r--drivers/char/ip2/i2ellis.h615
-rw-r--r--drivers/char/ip2/i2hw.h648
-rw-r--r--drivers/char/ip2/i2lib.c2219
-rw-r--r--drivers/char/ip2/i2lib.h351
-rw-r--r--drivers/char/ip2/i2os.h127
-rw-r--r--drivers/char/ip2/i2pack.h364
-rw-r--r--drivers/char/ip2/ip2.h107
-rw-r--r--drivers/char/ip2/ip2ioctl.h35
-rw-r--r--drivers/char/ip2/ip2trace.h42
-rw-r--r--drivers/char/ip2/ip2types.h57
14 files changed, 9053 insertions, 0 deletions
diff --git a/drivers/char/ip2/fip_firm.h b/drivers/char/ip2/fip_firm.h
new file mode 100644
index 000000000000..4c525fa4929f
--- /dev/null
+++ b/drivers/char/ip2/fip_firm.h
@@ -0,0 +1,2149 @@
1/* fip_firm.h - Intelliport II loadware */
2/* -31232 bytes read from ff.lod */
3
4static unsigned char fip_firm[] __initdata = {
50x3C,0x42,0x37,0x18,0x02,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
60x57,0x65,0x64,0x20,0x44,0x65,0x63,0x20,0x30,0x31,0x20,0x31,0x32,0x3A,0x32,0x34,
70x3A,0x33,0x30,0x20,0x31,0x39,0x39,0x39,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
80xE9,0x6C,0x0F,0x42,0x65,0x47,0x69,0x4E,0x6E,0x49,0x6E,0x47,0x20,0x6F,0x46,0x20,
90x63,0x4F,0x64,0x45,0xCC,0x13,0x5A,0x15,0xE8,0x16,0x76,0x18,0x04,0x1A,0x92,0x1B,
100x20,0x1D,0xAE,0x1E,0x3C,0x20,0xCA,0x21,0x58,0x23,0xE6,0x24,0x74,0x26,0x02,0x28,
110x90,0x29,0x1E,0x2B,0xAC,0x2C,0x3A,0x2E,0xC8,0x2F,0x56,0x31,0xE4,0x32,0x72,0x34,
120x00,0x36,0x8E,0x37,0x1C,0x39,0xAA,0x3A,0x38,0x3C,0xC6,0x3D,0x54,0x3F,0xE2,0x40,
130x70,0x42,0xFE,0x43,0x8C,0x45,0x1A,0x47,0xA8,0x48,0x36,0x4A,0xC4,0x4B,0x52,0x4D,
140xE0,0x4E,0x6E,0x50,0xFC,0x51,0x8A,0x53,0x18,0x55,0xA6,0x56,0x34,0x58,0xC2,0x59,
150x50,0x5B,0xDE,0x5C,0x6C,0x5E,0xFA,0x5F,0x88,0x61,0x16,0x63,0xA4,0x64,0x32,0x66,
160xC0,0x67,0x4E,0x69,0xDC,0x6A,0x6A,0x6C,0xF8,0x6D,0x86,0x6F,0x14,0x71,0xA2,0x72,
170x30,0x74,0xBE,0x75,0x4C,0x77,0x6C,0x77,0x8C,0x77,0xAC,0x77,0x33,0xDB,0x8A,0xDC,
180x53,0x33,0xDB,0x25,0x07,0x00,0x75,0x0A,0x8A,0x1E,0x08,0x01,0x83,0xE3,0x0C,0xEB,
190x20,0x90,0x3C,0x01,0x75,0x0A,0x8A,0x1E,0x08,0x01,0x80,0xE3,0xC0,0xEB,0x12,0x90,
200x8A,0x1E,0x0D,0x01,0x3C,0x02,0x75,0x06,0x80,0xE3,0x0C,0xEB,0x04,0x90,0x80,0xE3,
210xC0,0x53,0x50,0x8B,0x1E,0xBA,0x13,0x8E,0xDB,0xE8,0x6A,0x65,0x55,0x8B,0xEC,0x53,
220x1E,0x2B,0xC0,0x8E,0xD8,0x8B,0x5E,0x04,0xC1,0xE3,0x04,0x03,0x5E,0x06,0xD1,0xE3,
230x2E,0x8B,0x9F,0x44,0x00,0x8D,0x47,0x2A,0x1E,0x5A,0x1F,0x5B,0x5D,0xC3,0x55,0x8B,
240xEC,0x53,0x1E,0x2B,0xC0,0x8E,0xD8,0x8B,0x5E,0x04,0xC1,0xE3,0x04,0x03,0x5E,0x06,
250xD1,0xE3,0x2E,0x8B,0x9F,0x44,0x00,0x8D,0x47,0x34,0x1E,0x5A,0x1F,0x5B,0x5D,0xC3,
260xFB,0x55,0x8B,0xEC,0x53,0x51,0x52,0x56,0x57,0x1E,0x06,0x1E,0x07,0x33,0xC0,0x8E,
270xD8,0x8B,0x5E,0x04,0x26,0x8A,0x47,0x59,0x25,0x03,0x00,0x8B,0xF0,0xD1,0xE6,0x2E,
280x8B,0xB4,0xC4,0x00,0xC1,0xE0,0x04,0x26,0x02,0x47,0x1A,0xD1,0xE0,0x8B,0xE8,0x2E,
290x8B,0xAE,0x44,0x00,0x89,0x2C,0x26,0x8A,0x47,0x1C,0x88,0x44,0x0F,0x26,0x8A,0x47,
300x1D,0x88,0x44,0x10,0x26,0x8A,0x47,0x1E,0x88,0x44,0x11,0x26,0x8A,0x47,0x1F,0x88,
310x44,0x12,0x26,0x8A,0x47,0x20,0x88,0x44,0x13,0x26,0x8A,0x47,0x23,0x88,0x44,0x14,
320x26,0x8A,0x47,0x24,0x88,0x44,0x15,0x26,0x8A,0x47,0x5A,0x88,0x44,0x0E,0x33,0xC0,
330x89,0x44,0x06,0x89,0x44,0x08,0x88,0x44,0x0B,0x88,0x44,0x0A,0xB0,0x21,0xB4,0x64,
340x89,0x44,0x04,0x89,0x44,0x02,0xB0,0x55,0x88,0x44,0x0D,0x88,0x44,0x0C,0xE8,0x6A,
350x00,0x72,0x5B,0xE8,0xC9,0x00,0xE8,0xC1,0x10,0x89,0x44,0x08,0x80,0x7C,0x0F,0x01,
360x74,0x29,0xE8,0x2B,0x02,0xE8,0x7F,0x02,0x80,0x7C,0x0F,0x03,0x74,0x1D,0xE8,0xA9,
370x10,0x8B,0xF8,0x2B,0x44,0x08,0x3D,0xA0,0x0F,0x72,0x10,0x89,0x7C,0x08,0x33,0xC0,
380x87,0x44,0x06,0x85,0xC0,0x75,0x04,0xC6,0x44,0x0A,0xFF,0x8A,0x44,0x0A,0x84,0xC0,
390x75,0x0B,0xB8,0x08,0x00,0xE8,0x6A,0x4A,0xE8,0xA9,0x01,0x73,0xBF,0xE8,0x4F,0x01,
400x81,0x66,0x48,0x7F,0xFF,0x83,0x66,0x7A,0xBF,0xB0,0x02,0xE8,0x04,0x0E,0x8A,0x44,
410x0A,0x98,0x07,0x1F,0x5F,0x5E,0x5A,0x59,0x5B,0x5D,0xC3,0x81,0x4E,0x48,0x80,0x00,
420xB0,0x40,0xE8,0x3D,0x4A,0xE8,0x89,0x40,0x73,0x2A,0xE8,0x4D,0x10,0x8B,0xD8,0xB0,
430x05,0xE8,0x2E,0x4A,0xF6,0x46,0x27,0x02,0x75,0x1A,0xE8,0x3D,0x10,0x2B,0xC3,0x3D,
440x58,0x1B,0x72,0xEB,0x81,0x66,0x48,0x7F,0xFF,0xB0,0x02,0xE8,0xC4,0x0D,0xC6,0x44,
450x0A,0x01,0xF9,0xC3,0x83,0x4E,0x7A,0x40,0xF8,0xC3,0xFB,0xB0,0x01,0xE8,0x02,0x4A,
460xFA,0xE8,0x99,0x1E,0xE4,0x0A,0x84,0xC0,0x75,0xF0,0xB0,0x4E,0xE6,0x0A,0xFB,0xB0,
470x01,0xE8,0xEE,0x49,0xFA,0xE8,0x85,0x1E,0xE4,0x0A,0x84,0xC0,0x75,0xF0,0xC3,0xFA,
480xE8,0x7A,0x1E,0xE4,0xEC,0x88,0x44,0x16,0xE4,0xE4,0x88,0x44,0x17,0xE4,0xF8,0x88,
490x44,0x18,0xE4,0xF0,0x88,0x44,0x19,0xE4,0x10,0x88,0x44,0x1A,0xE4,0x12,0x88,0x44,
500x1B,0xE4,0x14,0x88,0x44,0x1C,0xE4,0x34,0x88,0x44,0x1D,0xE4,0x36,0x88,0x44,0x1E,
510xE4,0xD8,0x24,0x01,0x8A,0xE0,0xE4,0xDA,0x24,0x02,0x0A,0xC4,0x88,0x44,0x1F,0x8A,
520x44,0x10,0xE8,0xCD,0x1F,0x8A,0x44,0x11,0xE8,0x35,0x21,0x8A,0x44,0x12,0xE8,0x89,
530x21,0x8A,0x44,0x13,0xE8,0x43,0x21,0xC6,0x86,0xA1,0x00,0x00,0xE4,0x14,0x24,0x10,
540xE6,0x14,0xE4,0x12,0x24,0x3D,0xE6,0x12,0x8A,0x44,0x15,0x3C,0x01,0x72,0x1E,0x77,
550x16,0xB0,0x11,0xE6,0x34,0xB0,0x13,0xE6,0x36,0xE4,0x14,0x0C,0x10,0xE6,0x14,0xE4,
560x12,0x0C,0x40,0xE6,0x12,0xEB,0x06,0xE4,0x12,0x0C,0x02,0xE6,0x12,0x8A,0x44,0x0F,
570x3C,0x01,0x74,0x06,0x3C,0x02,0x74,0x0A,0xEB,0x0E,0xE4,0x12,0x0C,0x08,0xE6,0x12,
580xEB,0x06,0xE4,0x12,0x0C,0x10,0xE6,0x12,0xE8,0x2F,0xFF,0x8A,0x44,0x14,0x3C,0x02,
590x75,0x08,0xB0,0x55,0x88,0x44,0x0C,0x88,0x44,0x0D,0xB0,0x21,0xB4,0x64,0x89,0x44,
600x04,0x89,0x44,0x02,0xE4,0x0C,0x0C,0x10,0xE6,0x0C,0xE8,0xED,0x39,0xFB,0xC3,0xE8,
610x5F,0x3F,0x73,0x08,0xFB,0xB0,0x0A,0xE8,0x08,0x49,0xEB,0xF3,0xFA,0xE8,0x9D,0x1D,
620x8A,0x64,0x16,0x8A,0x44,0x17,0x89,0x86,0x94,0x00,0xE6,0xE4,0x8A,0xC4,0xE6,0xEC,
630x8A,0x64,0x18,0x8A,0x44,0x19,0x89,0x86,0x96,0x00,0xE6,0xF0,0x8A,0xC4,0xE6,0xF8,
640x8A,0x44,0x1A,0xE6,0x10,0x8A,0x44,0x1B,0xE6,0x12,0x8A,0x44,0x1C,0xE6,0x14,0x8A,
650x44,0x1D,0xE6,0x34,0x8A,0x44,0x1E,0xE6,0x36,0x8A,0x44,0x1F,0xE6,0xD8,0xE6,0xDA,
660xE9,0xB7,0xFE,0x90,0xFA,0x8A,0x44,0x0E,0xE6,0xFE,0xE4,0x02,0xA8,0x01,0x75,0x05,
670x33,0xC0,0xFB,0xF8,0xC3,0x33,0xC0,0xE4,0x00,0xFB,0xF9,0xC3,0x8A,0x64,0x14,0x80,
680xFC,0x02,0x74,0x2B,0xFE,0xC0,0xFE,0xC7,0x80,0xFF,0x4E,0x72,0x1C,0x74,0x09,0x80,
690xFF,0x50,0x73,0x08,0xB0,0x0A,0xEB,0x17,0xB0,0x0D,0xEB,0x13,0x02,0xDC,0x32,0xFF,
700x80,0xFB,0x7F,0x7C,0x02,0xB3,0x21,0x8A,0xC3,0x3C,0x7F,0x7C,0x02,0xB0,0x21,0xC3,
710xFA,0x80,0x7C,0x0B,0x04,0x76,0x02,0xFB,0xC3,0x8B,0x46,0x24,0x3D,0x08,0x00,0x72,
720xF6,0x8E,0x46,0x02,0x8B,0x7E,0x22,0x8A,0x44,0x0C,0x8B,0x5C,0x02,0xAA,0xE8,0xAB,
730xFF,0xAA,0xE8,0xA7,0xFF,0xAA,0xE8,0xA3,0xFF,0xAA,0xE8,0x9F,0xFF,0x88,0x44,0x0C,
740x89,0x5C,0x02,0x80,0x44,0x0B,0x04,0x89,0x7E,0x22,0x83,0x6E,0x24,0x04,0x83,0x46,
750x1A,0x04,0x80,0x7E,0x26,0x02,0x74,0x06,0x80,0x66,0x26,0xFD,0xFB,0xC3,0x60,0xB0,
760xFD,0xE8,0x02,0x3F,0x61,0xFB,0xC3,0xFA,0x80,0x7C,0x0F,0x03,0x75,0x09,0xC6,0x44,
770x0B,0x00,0xE8,0xE5,0x38,0xFB,0xC3,0xC4,0x7E,0x14,0x8B,0x4E,0x3A,0x85,0xC9,0x75,
780x35,0x26,0x8B,0x0D,0x47,0x47,0xE3,0xEA,0x3B,0x7E,0x04,0x76,0x22,0xB8,0x02,0x00,
790x39,0x46,0x2E,0x77,0x07,0xC7,0x46,0x2E,0x00,0x00,0xEB,0x13,0x8B,0x5E,0x2C,0x89,
800x5E,0x04,0x26,0xC7,0x07,0x00,0x00,0x43,0x43,0x89,0x5E,0x2C,0x29,0x46,0x2E,0x85,
810xC9,0x78,0xCE,0x89,0x4E,0x3A,0x8A,0x44,0x0D,0x8B,0x5C,0x04,0x26,0x8A,0x25,0x47,
820x3A,0xC4,0x75,0x16,0xFE,0x4C,0x0B,0xFF,0x44,0x06,0xE8,0x0F,0xFF,0xE2,0xED,0x88,
830x44,0x0D,0x89,0x5C,0x04,0x89,0x4E,0x3A,0xEB,0xA7,0xC6,0x44,0x0A,0xFE,0xE8,0x79,
840x38,0xFB,0xC3,0x90,0xE8,0xB3,0x0D,0x8A,0xE8,0x8A,0x0E,0xCB,0x13,0xB3,0x07,0x8A,
850xC1,0xEE,0xEB,0x00,0xEC,0x3A,0xC1,0x75,0x09,0x02,0xCD,0xFE,0xCB,0x75,0xF0,0xEB,
860x0C,0x90,0x88,0x0E,0xCB,0x13,0x8A,0xE8,0xBB,0xFF,0xFF,0xF9,0xC3,0x88,0x0E,0xCB,
870x13,0xF8,0xC3,0x90,0xBB,0x3F,0x3F,0x8A,0x8E,0x9E,0x00,0xBA,0xFE,0x00,0xEC,0x8A,
880xE8,0x32,0xC1,0x22,0xC3,0x75,0x02,0xF8,0xC3,0xF9,0xC3,0x90,0xE8,0xE5,0xFF,0x73,
890x01,0xC3,0xBA,0xD0,0x00,0xBB,0x03,0x03,0x8A,0x8E,0x9F,0x00,0xEC,0x8A,0xE8,0x32,
900xC1,0x22,0xC3,0x75,0x02,0xF8,0xC3,0xF9,0xC3,0x90,0x33,0xC0,0x8E,0xD8,0x8E,0xC0,
910x80,0x3E,0xC8,0x13,0x00,0x75,0x07,0xB0,0x0A,0xE8,0x26,0x47,0xEB,0xF2,0xFB,0x33,
920xDB,0x8A,0x1E,0xC9,0x13,0x43,0x43,0x83,0xFB,0x7E,0x76,0x07,0x33,0xDB,0xB0,0x02,
930xE8,0x0F,0x47,0x2E,0x8B,0xAF,0x44,0x00,0x83,0x7E,0x08,0x00,0x74,0xE7,0x88,0x1E,
940xC9,0x13,0xB0,0x02,0xE8,0xFB,0x46,0xFA,0xF7,0x46,0x38,0x40,0x00,0x74,0x14,0xE8,
950x96,0x1B,0xE8,0x7F,0xFF,0x72,0x1C,0x33,0xD2,0x8A,0x96,0x9F,0x00,0x83,0xC2,0x0E,
960xEB,0x0C,0x90,0xE8,0x77,0x1B,0xE8,0x83,0xFF,0x72,0x08,0xBA,0x48,0x00,0xE8,0x33,
970xFF,0x73,0xAB,0x23,0xCB,0x89,0x8E,0x9A,0x00,0x89,0x96,0x9C,0x00,0xFE,0x86,0xB5,
980x00,0xC6,0x06,0xC8,0x13,0x00,0xB0,0x0A,0xE8,0x67,0x0A,0xFB,0xEB,0x89,0x10,0x18,
990x08,0x28,0x33,0xC0,0xA0,0x05,0x01,0x8A,0xC8,0x24,0x40,0x75,0x24,0xC7,0x06,0x7C,
1000x12,0x8E,0x45,0xC7,0x06,0x42,0x12,0x01,0x00,0xC6,0x06,0x54,0x12,0x02,0xB0,0x08,
1010xF6,0xC1,0x01,0x74,0x02,0xB0,0x04,0xA3,0x46,0x12,0xA2,0x4C,0x12,0xA2,0x94,0x12,
1020xC3,0xC7,0x06,0x7C,0x12,0xB6,0x45,0xA0,0x0F,0x01,0x84,0xC0,0x75,0x0E,0x6A,0x00,
1030x1F,0xC6,0x06,0x93,0x12,0x1E,0x9C,0x0E,0xE8,0xB1,0x0C,0x90,0xC7,0x06,0x44,0x12,
1040x01,0x00,0xA3,0x42,0x12,0x8B,0xD8,0xC1,0xE3,0x04,0x88,0x1E,0x94,0x12,0xBE,0xE2,
1050x05,0x2B,0xF0,0x8B,0xC8,0x33,0xDB,0x8B,0xFB,0x2E,0xAC,0x88,0x85,0x48,0x12,0x8A,
1060xD8,0x0C,0x05,0xE6,0xFE,0x8A,0xE0,0xEB,0x00,0xE4,0xFE,0x32,0xC4,0xA8,0x3F,0x74,
1070x03,0xE9,0x9E,0x00,0xE4,0x00,0x88,0x85,0x50,0x12,0x8A,0xE0,0x24,0x30,0xBA,0x10,
1080xFF,0x3C,0x30,0x74,0x12,0x80,0xFC,0x04,0x74,0x0A,0xBA,0x04,0x03,0xF6,0x06,0x08,
1090x01,0xFE,0x74,0x03,0xBA,0x08,0x0F,0x88,0x95,0x4C,0x12,0x02,0xFA,0x32,0xC0,0xF6,
1100xC4,0x08,0x74,0x02,0xB0,0x01,0x88,0x85,0x58,0x12,0x8A,0xC4,0x3C,0x35,0x74,0x5B,
1110x3C,0x36,0x74,0x57,0x3C,0x34,0x74,0x53,0x3C,0x04,0x74,0x4F,0x3C,0x14,0x74,0x4B,
1120x3C,0x15,0x74,0x47,0xA8,0x40,0x74,0x25,0xC6,0x85,0x54,0x12,0x04,0xD1,0xE7,0xB4,
1130x03,0x8A,0xC3,0x89,0x85,0x5C,0x12,0x8A,0xC3,0x8A,0xE3,0x80,0xCC,0x01,0x89,0x85,
1140x64,0x12,0xD1,0xEF,0x47,0xE2,0x03,0xEB,0x1A,0x90,0xE9,0x6C,0xFF,0xC6,0x85,0x54,
1150x12,0x02,0xD1,0xE7,0x8A,0xE6,0x8A,0xC3,0x0C,0x04,0x89,0x85,0x5C,0x12,0xD1,0xEF,
1160x47,0xE2,0xE7,0x33,0xC0,0x8A,0xC7,0xA3,0x46,0x12,0xC3,0xC6,0x85,0x54,0x12,0x06,
1170xEB,0xBB,0xC6,0x85,0x54,0x12,0x00,0x33,0xC0,0x88,0x85,0x50,0x12,0x88,0x85,0x4C,
1180x12,0x88,0x85,0x58,0x12,0xEB,0xA6,0xC7,0x46,0x26,0x02,0x12,0x8B,0x46,0x1E,0x89,
1190x46,0x00,0x89,0x46,0x22,0x8B,0x46,0x20,0x89,0x46,0x24,0xC7,0x46,0x1A,0x00,0x00,
1200xC3,0xC7,0x46,0x3C,0x80,0x00,0xC7,0x46,0x38,0x01,0x00,0x1E,0x56,0x8B,0x76,0x30,
1210x89,0x76,0x04,0x89,0x76,0x14,0x8E,0x5E,0x06,0x33,0xC0,0x89,0x04,0x46,0x46,0x89,
1220x76,0x2C,0x89,0x46,0x3A,0x8B,0x46,0x32,0x48,0x48,0x89,0x46,0x2E,0x5E,0x1F,0xC3,
1230x33,0xC0,0x89,0x46,0x48,0x89,0x46,0x4A,0xC7,0x46,0x46,0xAE,0x01,0x89,0x46,0x4E,
1240x8B,0x46,0x44,0x89,0x46,0x50,0x8B,0x46,0x42,0x89,0x46,0x40,0x89,0x46,0x08,0xC3,
1250x33,0xC0,0x89,0x46,0x76,0x89,0x46,0x78,0xC7,0x46,0x7A,0x10,0x00,0x56,0x1E,0x8B,
1260x76,0x70,0x89,0x76,0x10,0x89,0x76,0x0C,0x8E,0x5E,0x12,0xC7,0x04,0x00,0x00,0x8B,
1270x46,0x72,0x89,0x46,0x74,0x1F,0x5E,0xC3,0x89,0x56,0x18,0x89,0x56,0x02,0x89,0x56,
1280x06,0x89,0x56,0x0A,0x89,0x56,0x0E,0x89,0x56,0x12,0x89,0x56,0x16,0x8B,0xD8,0x4B,
1290x4B,0xC1,0xE3,0x02,0xBF,0x02,0x00,0x89,0x7E,0x1E,0x03,0xFB,0x89,0x7E,0x30,0x03,
1300xFB,0x89,0x7E,0x42,0x03,0xFB,0x89,0x7E,0x70,0x83,0xEB,0x08,0x89,0x5E,0x20,0x89,
1310x5E,0x32,0x89,0x5E,0x44,0x89,0x5E,0x72,0x50,0xE8,0x2B,0xFF,0xE8,0x71,0xFF,0xE8,
1320x3F,0xFF,0xE8,0x8B,0xFF,0x58,0xC3,0xB8,0x30,0x75,0xC1,0xE8,0x04,0x0E,0x5B,0x03,
1330xC3,0xA3,0xBA,0x13,0x83,0x3E,0x42,0x12,0x00,0x74,0x07,0x80,0x3E,0x94,0x12,0x00,
1340x75,0x0E,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x1E,0x9C,0x0E,0xE8,0xBD,0x0A,0x90,
1350xB8,0x30,0x7A,0xC1,0xE8,0x04,0x40,0xA3,0xC0,0x13,0x2B,0x06,0x12,0x01,0xF7,0xD8,
1360x33,0xD2,0x8B,0xCA,0x8A,0x0E,0x94,0x12,0xF7,0xF1,0x3D,0x80,0x00,0x77,0x0E,0x6A,
1370x00,0x1F,0xC6,0x06,0x93,0x12,0x25,0x9C,0x0E,0xE8,0x90,0x0A,0x90,0x48,0x3D,0xFF,
1380x07,0x72,0x03,0xB8,0xFF,0x07,0xA3,0xC2,0x13,0x33,0xC9,0x8A,0x0E,0x94,0x12,0x33,
1390xF6,0xB8,0x00,0x09,0x2E,0x8B,0xAC,0x44,0x00,0x89,0x46,0x4C,0x40,0x46,0x46,0xE2,
1400xF3,0x8A,0x0E,0x94,0x12,0x33,0xF6,0x8B,0x16,0xC0,0x13,0xA1,0xC2,0x13,0x2E,0x8B,
1410xAC,0x44,0x00,0xE8,0x22,0xFF,0x03,0xD0,0x46,0x46,0xE2,0xF2,0xC3,0x33,0xC0,0x2E,
1420x8B,0xAD,0x44,0x00,0x89,0x46,0x08,0x47,0x47,0xE2,0xF4,0xC3,0x51,0x33,0xC0,0x0A,
1430xC2,0x2E,0x8B,0xAD,0x44,0x00,0x89,0x86,0x9E,0x00,0x81,0x4E,0x38,0x00,0x20,0x47,
1440x47,0xFE,0xC4,0x80,0xFC,0x04,0x72,0x04,0x32,0xE4,0xFE,0xC0,0xE2,0xE3,0x59,0x83,
1450xE9,0x10,0x74,0x05,0xF7,0xD9,0xE8,0xC4,0xFF,0xC3,0x51,0x33,0xC0,0x0A,0xC2,0x2E,
1460x8B,0xAD,0x44,0x00,0x89,0x86,0x9E,0x00,0x83,0x4E,0x38,0x40,0x47,0x47,0x80,0xC4,
1470x10,0x79,0x04,0x32,0xE4,0xFE,0xC0,0xE2,0xE6,0x59,0x83,0xE9,0x10,0x74,0x05,0xF7,
1480xD9,0xE8,0x99,0xFF,0xC3,0xE8,0xD2,0xFF,0xC3,0x8D,0x08,0x9C,0x08,0xCA,0x08,0xF5,
1490x08,0x8B,0x0E,0x42,0x12,0x33,0xF6,0x51,0x56,0x33,0xDB,0x8B,0xCB,0x8A,0x94,0x48,
1500x12,0x8A,0x8C,0x4C,0x12,0x8A,0x9C,0x54,0x12,0x8B,0xFE,0xC1,0xE7,0x05,0x85,0xDB,
1510x75,0x02,0xB1,0x10,0x2E,0xFF,0x97,0xF9,0x08,0x5E,0x59,0x46,0xE2,0xD9,0xC3,0x01,
1520xCC,0x03,0xD0,0x00,0xE8,0x02,0xD0,0x00,0xE8,0x01,0xD0,0x00,0xE8,0x00,0xD0,0x00,
1530xE8,0x04,0xD0,0xA8,0xDA,0x00,0xDC,0x00,0xDE,0x01,0xD8,0x03,0xCC,0x03,0xCC,0x03,
1540xCC,0x04,0xD0,0xA8,0xDA,0x20,0xDC,0x00,0xDE,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x00,
1550xD8,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,
1560xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,0xCC,0x03,
1570xCC,0x04,0xD0,0x00,0xDA,0x20,0xDC,0x03,0xDE,0x01,0xD8,0x03,0xCC,0x03,0xCC,0x03,
1580xCC,0x03,0xCC,0x00,0xD8,0x00,0xCC,0x00,0xD0,0x00,0x00,0x56,0x52,0x1E,0x0E,0x1F,
1590xBE,0x2F,0x09,0x33,0xD2,0xFC,0xAD,0x85,0xC0,0x74,0x0D,0x8A,0xD4,0xEE,0xAD,0x85,
1600xC0,0x74,0x05,0x8A,0xD4,0xEE,0xEB,0xEE,0x1F,0x5A,0x5E,0xC3,0xE4,0x80,0x84,0xC0,
1610x74,0x16,0x78,0x14,0xB0,0x27,0xE6,0xFC,0xB0,0x11,0xE6,0x34,0xE4,0xFC,0x3C,0x27,
1620x75,0x06,0xE4,0x11,0x75,0x02,0xF8,0xC3,0xF9,0xC3,0x83,0xC2,0x06,0xB0,0xBF,0xEE,
1630x83,0xEA,0x02,0xB0,0x10,0xEE,0x88,0x86,0xAF,0x00,0xB0,0x11,0x83,0xC2,0x04,0xEE,
1640x83,0xC2,0x02,0xEE,0xB0,0x13,0x83,0xC2,0x02,0xEE,0x83,0xC2,0x02,0xEE,0x2E,0xA1,
1650x4C,0x2D,0x89,0x86,0x94,0x00,0x83,0xEA,0x0E,0xEE,0x83,0xC2,0x02,0x8A,0xC4,0xEE,
1660x83,0xC2,0x04,0xB0,0x03,0xEE,0x88,0x86,0xA8,0x00,0x83,0xEA,0x04,0x32,0xC0,0xEE,
1670x83,0xC2,0x02,0xB0,0x89,0xEE,0x88,0x86,0xA6,0x00,0x0C,0x06,0xEE,0xB0,0x40,0xB4,
1680x38,0x89,0x46,0x1C,0xC7,0x46,0x36,0x38,0x00,0x83,0xC2,0x04,0x32,0xC0,0xEE,0x88,
1690x86,0xA7,0x00,0xC3,0x83,0xC2,0x06,0xB0,0xBF,0xEE,0x83,0xEA,0x02,0xEC,0x3A,0x86,
1700xAF,0x00,0x75,0x24,0x83,0xC2,0x04,0xEC,0x3C,0x11,0x75,0x1C,0x83,0xC2,0x06,0xEC,
1710x3C,0x13,0x75,0x14,0x83,0xEA,0x08,0x8A,0x86,0xA8,0x00,0xEE,0x83,0xEA,0x02,0xEC,
1720x24,0xC0,0x3C,0xC0,0x75,0x02,0xF8,0xC3,0xF9,0xC3,0x33,0xC9,0x8B,0xD1,0x8B,0xF1,
1730x8A,0x0E,0x94,0x12,0xC1,0xE9,0x02,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,0x00,
1740x20,0x74,0x0E,0x8A,0x86,0x9E,0x00,0xE6,0xFE,0x32,0xC0,0xE6,0x80,0x42,0xE8,0xFA,
1750xFE,0x83,0xC6,0x08,0xE2,0xE1,0x85,0xD2,0x74,0x03,0xE8,0x05,0x08,0xC3,0x33,0xC9,
1760x8B,0xF1,0x8A,0x0E,0x94,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,0x40,0x00,
1770x74,0x06,0xE8,0x73,0x16,0xE8,0x12,0xFF,0x46,0x46,0xE2,0xEA,0xC3,0x33,0xC9,0x8B,
1780xF1,0x8A,0x0E,0x94,0x12,0xC1,0xE9,0x02,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,
1790x00,0x20,0x74,0x16,0xE8,0x46,0x16,0xE8,0xD2,0xFE,0x73,0x0E,0x6A,0x00,0x1F,0xC6,
1800x06,0x93,0x12,0x1C,0x9C,0x0E,0xE8,0xE3,0x07,0x90,0x83,0xC6,0x08,0xE2,0xD9,0xC3,
1810x33,0xC9,0x8B,0xF1,0x8A,0x0E,0x94,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,
1820x40,0x00,0x74,0x16,0xE8,0x21,0x16,0xE8,0x2A,0xFF,0x73,0x0E,0x6A,0x00,0x1F,0xC6,
1830x06,0x93,0x12,0x1C,0x9C,0x0E,0xE8,0xB3,0x07,0x90,0x46,0x46,0xE2,0xDA,0xC3,0x0C,
1840x00,0x00,0x10,0x00,0x13,0x12,0x00,0x00,0x14,0x00,0x28,0x3C,0x00,0x1B,0x3E,0x00,
1850x00,0x2A,0x00,0x00,0x2C,0x00,0x00,0x42,0x00,0x14,0xD8,0x00,0x00,0xDA,0x00,0x00,
1860x34,0x00,0x11,0x36,0x00,0x13,0x38,0x00,0x11,0x3A,0x00,0x13,0x00,0x00,0x56,0x50,
1870x52,0xBE,0x2F,0x0B,0x2E,0xAD,0x85,0xC0,0x74,0x06,0x92,0x2E,0xAC,0xEE,0xEB,0xF4,
1880x5A,0x58,0x5E,0xC3,0x53,0x2E,0xA1,0x60,0x22,0xE6,0xE4,0xE6,0xF0,0x8A,0xC4,0xE6,
1890xEC,0xE6,0xF8,0xE8,0xD8,0xFF,0xB0,0x4B,0xE6,0x10,0xB0,0x50,0xE6,0x12,0xB0,0x38,
1900xE6,0x14,0xE8,0xAE,0x15,0xB0,0x46,0xE6,0x0A,0xE8,0xA7,0x15,0xB0,0x1A,0xE6,0x0A,
1910xE8,0xA0,0x15,0xB0,0x22,0xE6,0x0A,0xE8,0x99,0x15,0xE8,0xFD,0x06,0x8B,0xD8,0xE4,
1920x16,0xA8,0x04,0x75,0x18,0xE8,0xF2,0x06,0x2B,0xC3,0x3D,0x32,0x00,0x72,0xF0,0x6A,
1930x00,0x1F,0xC6,0x06,0x93,0x12,0x23,0x9C,0x0E,0xE8,0x10,0x07,0x90,0xE8,0xDA,0x06,
1940x2B,0xC3,0x3D,0x24,0x00,0x77,0x1B,0xB0,0x31,0xE6,0xFC,0x56,0x51,0x55,0xB9,0x10,
1950x00,0x2E,0x8B,0xAC,0x44,0x00,0x81,0x4E,0x38,0x80,0x00,0x46,0x46,0xE2,0xF2,0x5D,
1960x59,0x5E,0xE8,0x69,0xFF,0xE8,0x4B,0x15,0xB0,0x46,0xE6,0x0A,0xE8,0x44,0x15,0x5B,
1970xC3,0x33,0xF6,0x8B,0x0E,0x42,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,0x00,
1980x20,0x74,0x06,0xE8,0x17,0x15,0xE8,0x5B,0xFF,0x83,0xC6,0x20,0xE2,0xE9,0xC3,0x8B,
1990xC2,0x05,0x04,0x00,0x89,0x46,0x28,0x2E,0xA1,0x4C,0x2D,0x89,0x86,0x8E,0x00,0x89,
2000x86,0x90,0x00,0x89,0x86,0x92,0x00,0xC6,0x86,0xA3,0x00,0x0A,0xC6,0x86,0xC3,0x00,
2010x03,0x52,0x83,0xC2,0x04,0x8A,0x86,0xA6,0x00,0x0C,0x06,0xEE,0x5A,0x83,0xC2,0x02,
2020xB0,0x05,0xEE,0x88,0x86,0xA5,0x00,0xC3,0xE8,0x03,0xFF,0xE8,0xE5,0x14,0xB0,0x42,
2030xE6,0x0A,0xF7,0x46,0x38,0x80,0x00,0x74,0x06,0x2E,0xA1,0x9C,0x22,0xEB,0x04,0x2E,
2040xA1,0x6C,0x22,0xC7,0x46,0x1C,0x0C,0x00,0x89,0x86,0x94,0x00,0x89,0x86,0x96,0x00,
2050x89,0x86,0x8E,0x00,0x89,0x86,0x90,0x00,0x89,0x86,0x92,0x00,0xE6,0xF0,0xE6,0xE4,
2060x8A,0xC4,0xE6,0xF8,0xE6,0xEC,0xC6,0x86,0xC3,0x00,0x03,0xE8,0xA5,0x14,0xB0,0x1A,
2070xE6,0x0A,0xB0,0x10,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xC3,0x33,0xC9,0x8B,0xF1,0x8A,
2080x0E,0x94,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,0x40,0x00,0x74,0x06,0xE8,
2090x76,0x14,0xE8,0x5A,0xFF,0x46,0x46,0xE2,0xEA,0xC3,0x33,0xC9,0x8B,0xF1,0x8A,0x0E,
2100x94,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xF7,0x46,0x38,0x00,0x20,0x74,0x06,0xE8,0x4C,
2110x14,0xE8,0x74,0xFF,0x46,0x46,0xE2,0xEA,0xC3,0x90,0x83,0x3E,0x44,0x12,0x00,0x75,
2120x14,0xB0,0x01,0xBA,0x06,0x01,0xEE,0x2A,0xC0,0xEE,0xB0,0x02,0xEE,0xB0,0x04,0xEE,
2130xB8,0x00,0x02,0xEB,0x0F,0xBA,0x06,0x01,0xB0,0x40,0xEE,0xB8,0x01,0x00,0x8A,0x0E,
2140x0E,0x01,0xD3,0xE0,0xA3,0x88,0x12,0xC3,0xA1,0x88,0x12,0xA3,0x84,0x12,0x2D,0x20,
2150x00,0xA3,0x8A,0x12,0x2D,0x20,0x00,0xA3,0x82,0x12,0xC7,0x06,0x86,0x12,0x20,0x00,
2160xC7,0x06,0x80,0x12,0x32,0x00,0xC3,0x83,0x3E,0x44,0x12,0x00,0x74,0x76,0x8B,0x0E,
2170x42,0x12,0x33,0xF6,0x8A,0xA4,0x54,0x12,0x84,0xE4,0x74,0x5F,0x8A,0x84,0x48,0x12,
2180x0C,0x04,0xE6,0xFE,0xF6,0xC4,0x04,0x74,0x25,0xB0,0x1B,0xBA,0x00,0x00,0xEE,0xEB,
2190x00,0x2A,0xC0,0xBA,0x02,0x00,0xEE,0xEB,0x00,0xB0,0x03,0xEE,0xEB,0x00,0x32,0xC0,
2200xBA,0x02,0x00,0xEE,0xEB,0x00,0xBA,0x00,0x00,0xB0,0x00,0xEE,0xEB,0x2D,0xB0,0x1F,
2210xBA,0x00,0x00,0xEE,0xEB,0x00,0x2A,0xC0,0xBA,0x02,0x00,0xEE,0xEB,0x00,0xB0,0x03,
2220xEE,0xEB,0x00,0xD1,0xE6,0x8A,0x84,0x5D,0x12,0xD1,0xEE,0xF6,0xD0,0xBA,0x02,0x00,
2230xEE,0xEB,0x00,0xBA,0x00,0x00,0xB0,0x0A,0xEE,0xEB,0x00,0xE4,0x04,0xEB,0x00,0xE4,
2240x04,0x46,0xE2,0x90,0xC3,0x90,0xB8,0x14,0x00,0xBA,0x3E,0xFF,0xEF,0xB8,0x06,0x00,
2250xBA,0x32,0xFF,0xEF,0xB8,0x0F,0x00,0xBA,0x34,0xFF,0xEF,0xBA,0x36,0xFF,0xEF,0x83,
2260x3E,0x44,0x12,0x00,0x75,0x16,0xB8,0x11,0x00,0xBA,0x38,0xFF,0xEF,0xB8,0x12,0x00,
2270xBA,0x3A,0xFF,0xEF,0xB8,0x1B,0x00,0xBA,0x3C,0xFF,0xEF,0xC3,0xB8,0x11,0x00,0xBA,
2280x38,0xFF,0xEF,0xB8,0x12,0x00,0xBA,0x3A,0xFF,0xEF,0xB8,0x1B,0x00,0xBA,0x3C,0xFF,
2290xEF,0xC3,0xB8,0xFC,0x00,0xBA,0x28,0xFF,0xEF,0xFB,0x83,0x3E,0x44,0x12,0x00,0x74,
2300x07,0xB8,0xCC,0x00,0xBA,0x28,0xFF,0xEF,0xC3,0x00,0xFF,0xFF,0x20,0x24,0x28,0xFF,
2310x2C,0xFF,0xFF,0x30,0x34,0x38,0xFF,0xFF,0x3C,0x90,0x3C,0x0F,0x77,0x0E,0xBB,0x19,
2320x0E,0x2E,0xD7,0x3C,0xFF,0x74,0x05,0x8A,0xD8,0xF8,0xC3,0x90,0x2A,0xDB,0xF9,0xC3,
2330x83,0x3E,0x44,0x12,0x00,0x74,0x27,0xA0,0x06,0x01,0x80,0x26,0x06,0x01,0x30,0x80,
2340x3E,0x06,0x01,0x30,0x75,0x18,0xB9,0x02,0x00,0xBF,0xC4,0x13,0xBA,0x06,0x01,0xEC,
2350xA8,0x20,0x75,0xF8,0xBA,0x04,0x01,0xED,0xAB,0xE2,0xF1,0xEB,0x16,0x90,0xB9,0x04,
2360x00,0xBF,0xC4,0x13,0xBA,0x06,0x01,0xEC,0xA8,0x20,0x75,0xF8,0xBA,0x04,0x01,0xEC,
2370xAA,0xE2,0xF1,0xFA,0x90,0xBE,0xC4,0x13,0xAD,0x80,0xE4,0x3F,0x80,0xFC,0x02,0x74,
2380x0E,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x0A,0x9C,0x0E,0xE8,0x3E,0x04,0x90,0xAD,
2390x3C,0x0F,0x75,0xED,0x8A,0xC4,0xE8,0x81,0xFF,0x72,0xE6,0x88,0x1E,0x1A,0x01,0xC6,
2400x06,0x8E,0x12,0x00,0xB0,0x00,0x0A,0x06,0x1A,0x01,0xBA,0x00,0x01,0xEE,0xC6,0x06,
2410x8F,0x12,0x40,0x83,0x3E,0x44,0x12,0x00,0x75,0x06,0xB8,0x0C,0x00,0xEB,0x04,0x90,
2420xB8,0x4C,0x00,0xBA,0x28,0xFF,0xEF,0xC3,0x83,0x3E,0x44,0x12,0x00,0x75,0x01,0xC3,
2430xA1,0x50,0x12,0x0B,0x06,0x52,0x12,0x0A,0xC4,0xA8,0x08,0x74,0xF2,0xA0,0x0F,0x01,
2440x2A,0xE4,0x50,0xFF,0x36,0xBA,0x13,0x1F,0xE8,0x50,0x56,0x83,0xC4,0x02,0x6A,0x00,
2450x1F,0x33,0xC0,0xA3,0xBC,0x13,0xA0,0x0F,0x01,0xA3,0xBE,0x13,0x8B,0x1E,0xBC,0x13,
2460x8A,0x87,0x50,0x12,0xF6,0x87,0x50,0x12,0x08,0x74,0x0D,0x24,0x07,0x8A,0xE0,0xBE,
2470xCC,0x00,0xA0,0xBC,0x13,0xE8,0x94,0x3D,0xFF,0x06,0xBC,0x13,0xFF,0x0E,0xBE,0x13,
2480x75,0xDA,0xC3,0x90,0x1E,0x33,0xC0,0x8E,0xD8,0xB0,0x01,0xE8,0x54,0x3D,0x1F,0xC3,
2490x33,0xC9,0x8B,0xF1,0x8A,0x0E,0x94,0x12,0x2E,0x8B,0xAC,0x44,0x00,0xC7,0x46,0x62,
2500x38,0x44,0xC7,0x46,0x7C,0xFC,0x3B,0xC7,0x46,0x7E,0xE2,0x3B,0xC7,0x86,0x80,0x00,
2510xEC,0x3C,0xE8,0xAB,0x16,0xC6,0x86,0xC0,0x00,0x11,0x83,0x7E,0x08,0x00,0x74,0x07,
2520x51,0x56,0xE8,0x33,0x33,0x5E,0x59,0x46,0x46,0xE2,0xCD,0xC3,0x33,0xC9,0x8B,0xF1,
2530x8B,0xF9,0x8A,0x0E,0x94,0x12,0xC1,0xE9,0x02,0xE3,0x13,0x2E,0x8B,0xAC,0x44,0x00,
2540x8A,0x86,0x9E,0x00,0x88,0x85,0x6C,0x12,0x83,0xC6,0x08,0x47,0xE2,0xED,0xC3,0xFA,
2550xFC,0xB0,0xC0,0xBA,0x00,0x01,0xEE,0x33,0xC0,0x8E,0xD8,0x8E,0xC0,0x8E,0xD0,0xBF,
2560x16,0x01,0xB9,0xCC,0x77,0x2B,0xCF,0xD1,0xE9,0xF3,0xAB,0xBC,0x40,0x12,0xE8,0xD9,
2570x02,0xE8,0x70,0x3C,0xBE,0xCC,0x0F,0xE8,0xF2,0x3C,0xF4,0x90,0x33,0xC0,0x8E,0xD8,
2580x8E,0xC0,0x8E,0xD0,0xF6,0x06,0x0A,0x01,0x80,0x74,0x0B,0xBE,0x35,0x55,0xE8,0xDB,
2590x3C,0xB0,0x01,0xE8,0xAC,0x3C,0xE8,0xB3,0x00,0xE8,0xF6,0xF5,0xE8,0x08,0xF8,0xE8,
2600x0F,0xF9,0xE8,0x85,0xFA,0xE8,0xB6,0xFA,0xE8,0xEF,0xFC,0xE8,0xC2,0x10,0xE8,0x03,
2610x3C,0xE8,0xB2,0xFD,0xE8,0x30,0xFD,0xE8,0x54,0x02,0xC6,0x06,0x8F,0x12,0xC0,0xE8,
2620xBB,0xFA,0xE8,0xEB,0xFA,0xE8,0xE9,0xFB,0xE8,0xAF,0xFC,0xE8,0x8D,0xFC,0xE8,0x1F,
2630xFF,0xE8,0x58,0xFF,0xE8,0xDB,0xFD,0xE8,0x16,0xFE,0x33,0xC0,0xBE,0x5A,0x05,0xE8,
2640x8A,0x3C,0xE8,0xA3,0xFE,0xE8,0xE0,0xFC,0xFB,0xBE,0xA4,0x44,0xE8,0x7D,0x3C,0xE9,
2650xCA,0x2D,0x56,0x98,0x8B,0xF0,0x8B,0x42,0x52,0x85,0xC0,0x75,0x27,0xC7,0x42,0x52,
2660x01,0x00,0x53,0x36,0x8B,0x9C,0x2C,0x01,0xF6,0xC3,0x01,0x75,0x0C,0x36,0x89,0x68,
2670x52,0x36,0x89,0xAC,0x2C,0x01,0x5B,0x5E,0xC3,0x36,0x89,0xAC,0x2C,0x01,0x36,0x89,
2680xAC,0x1C,0x01,0x5B,0x5E,0xC3,0x56,0x98,0x8B,0xF0,0x33,0xED,0x36,0x8B,0x84,0x1C,
2690x01,0xA8,0x01,0x75,0x15,0x8B,0xE8,0x33,0xC0,0x87,0x42,0x52,0x36,0x89,0x84,0x1C,
2700x01,0xA8,0x01,0x74,0x05,0x36,0x89,0x84,0x2C,0x01,0x5E,0xC3,0x56,0x51,0x33,0xF6,
2710xB8,0x01,0x00,0xB9,0x08,0x00,0x89,0x84,0x1C,0x01,0x89,0x84,0x2C,0x01,0x46,0x46,
2720xE2,0xF4,0x59,0x5E,0xC3,0x90,0xBB,0x01,0x00,0x8B,0xE8,0xFF,0x4E,0x6E,0x74,0x0A,
2730x8B,0xDD,0x8B,0x46,0x58,0xA8,0x01,0x74,0xF0,0xC3,0x8B,0x46,0x48,0xA9,0x08,0x00,
2740x74,0x45,0xF7,0x46,0x38,0x40,0x00,0x74,0x27,0xE8,0x5C,0x10,0x80,0xC2,0x06,0x8A,
2750x86,0xA8,0x00,0x24,0xBF,0x88,0x86,0xA8,0x00,0xEE,0x60,0xB0,0xFE,0xE8,0x86,0x32,
2760x61,0xB0,0x02,0xE8,0x4C,0xFF,0x8B,0x46,0x48,0x24,0xF7,0x89,0x46,0x48,0xEB,0x17,
2770xE8,0x2A,0x10,0x81,0x4E,0x26,0x00,0x40,0x8A,0x86,0xA5,0x00,0x0C,0x02,0x88,0x86,
2780xA5,0x00,0xE6,0x0C,0x8B,0x46,0x48,0xA9,0x04,0x00,0x74,0x14,0xB0,0x02,0xE8,0x21,
2790xFF,0x8B,0x46,0x48,0x24,0xFB,0x89,0x46,0x48,0x60,0xB0,0xDF,0xE8,0x47,0x32,0x61,
2800x33,0xC0,0x87,0x46,0x58,0xF6,0xC3,0x01,0x75,0x0B,0x36,0x89,0x47,0x58,0xA8,0x01,
2810x75,0x0D,0xE9,0x74,0xFF,0xA3,0x22,0x01,0xA8,0x01,0x75,0x03,0xE9,0x6A,0xFF,0x89,
2820x1E,0x32,0x01,0xC3,0xBB,0x01,0x00,0x8B,0xE8,0xF7,0x46,0x38,0x40,0x00,0x74,0x15,
2830xE8,0xD5,0x0F,0x80,0xC2,0x0A,0xEC,0xA8,0x40,0x75,0x0A,0x8B,0xDD,0x8B,0x46,0x56,
2840xA8,0x01,0x74,0xE3,0xC3,0x8B,0x46,0x26,0x80,0xE4,0xFE,0x80,0xCC,0x02,0x89,0x46,
2850x26,0xB0,0x02,0xE8,0xBC,0xFE,0x33,0xC0,0x87,0x46,0x56,0xF6,0xC3,0x01,0x75,0x0A,
2860x36,0x89,0x47,0x56,0xA8,0x01,0x75,0x0B,0xEB,0xBD,0xA3,0x20,0x01,0xA8,0x01,0x75,
2870x02,0xEB,0xB4,0x89,0x1E,0x30,0x01,0xC3,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA0,
2880x90,0x12,0x84,0xC0,0x75,0x49,0xA1,0x22,0x01,0xA8,0x01,0x75,0x03,0xE8,0xF6,0xFE,
2890xA1,0x20,0x01,0xA8,0x01,0x75,0x03,0xE8,0x8A,0xFF,0xA1,0xAC,0x13,0x48,0x78,0x05,
2900x74,0x45,0xA3,0xAC,0x13,0xA1,0xAE,0x13,0x48,0x78,0x05,0x74,0x51,0xA3,0xAE,0x13,
2910xA1,0xB0,0x13,0x48,0x78,0x05,0x74,0x63,0xA3,0xB0,0x13,0xA1,0x7E,0x12,0x40,0x78,
2920x03,0xA3,0x7E,0x12,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0xA0,
2930x91,0x12,0x40,0x3C,0x02,0x72,0x0B,0x33,0xC0,0xA2,0x91,0x12,0xFF,0x16,0x7C,0x12,
2940xEB,0xA4,0xA2,0x91,0x12,0xEB,0x9F,0xA0,0x8E,0x12,0x32,0x06,0x8F,0x12,0xA2,0x8E,
2950x12,0x0A,0x06,0x1A,0x01,0xBA,0x00,0x01,0xEE,0xB8,0x2C,0x01,0xEB,0xA4,0x83,0x3E,
2960x84,0x12,0x10,0x72,0x11,0xBA,0x28,0xFF,0xED,0x0C,0x81,0xEF,0xE8,0x53,0x37,0xBA,
2970x28,0xFF,0xED,0x24,0x7E,0xEF,0xB8,0x04,0x00,0xEB,0x92,0xC6,0x06,0x8D,0x12,0x01,
2980xE8,0x3F,0x37,0xC6,0x06,0x8D,0x12,0x00,0xA1,0xB2,0x13,0xEB,0x8B,0x90,0x8A,0x1E,
2990x0B,0x01,0x2A,0xFF,0x6B,0xC3,0x19,0xBA,0x62,0xFF,0xEF,0xB8,0x0A,0x00,0xBA,0x60,
3000xFF,0xEF,0xB8,0x01,0xE0,0xBA,0x66,0xFF,0xEF,0xB8,0xFF,0xFF,0xBA,0x52,0xFF,0xEF,
3010xB8,0x09,0xC0,0xBA,0x56,0xFF,0xEF,0xC7,0x06,0xAC,0x13,0x2C,0x01,0xC7,0x06,0xAE,
3020x13,0x04,0x00,0xC6,0x06,0x91,0x12,0x00,0xC3,0x90,0x8A,0x1E,0x0B,0x01,0x2A,0xFF,
3030x6B,0xC3,0x05,0xD1,0xE8,0xA3,0x18,0x01,0xC3,0x90,0x52,0xBA,0x50,0xFF,0xED,0x5A,
3040xC3,0x90,0x53,0x51,0x8B,0x1E,0x18,0x01,0xB9,0x32,0x05,0x90,0xE2,0xFE,0x4B,0x75,
3050xF7,0x59,0x5B,0xC3,0xB0,0x80,0xBA,0x00,0x01,0x0A,0x06,0x1A,0x01,0xEE,0xC3,0x90,
3060xB0,0x40,0xEB,0xF2,0xB0,0xC0,0xEB,0xEE,0xB0,0x00,0xEB,0xEA,0xFA,0x60,0x06,0x1E,
3070x16,0x2B,0xDB,0x8E,0xDB,0x2E,0xA1,0xBA,0x4C,0x2E,0xA3,0x92,0x4C,0xA0,0x93,0x12,
3080x98,0x8B,0xE8,0x89,0x26,0x2D,0x7A,0x80,0x3E,0xCA,0x13,0x00,0x74,0x03,0xE9,0x6B,
3090x42,0xE8,0xC0,0xFF,0xE8,0xAB,0xFF,0xE8,0xA8,0xFF,0xB0,0x20,0xC6,0x06,0x90,0x12,
3100x00,0xFF,0x16,0x7C,0x12,0x8B,0xFD,0x83,0xFF,0x0A,0x72,0x11,0xE8,0xB9,0xFF,0xE8,
3110x90,0xFF,0xE8,0xAB,0xFF,0xE8,0x8A,0xFF,0x83,0xEF,0x0A,0xEB,0xEA,0x0B,0xFF,0x74,
3120x0F,0xE8,0xA4,0xFF,0xE8,0x7B,0xFF,0xE8,0x9A,0xFF,0xE8,0x75,0xFF,0x4F,0x75,0xF1,
3130xE8,0x95,0xFF,0xE8,0x6C,0xFF,0xEB,0xB9,0x8A,0x86,0xA5,0x00,0x24,0xFD,0xEE,0x88,
3140x86,0xA5,0x00,0xC3,0x8A,0x86,0xA6,0x00,0x0C,0x02,0xEE,0xC3,0x8B,0x76,0x38,0xF7,
3150xC6,0x01,0x00,0x74,0xEF,0x8B,0x4E,0x36,0x8B,0x46,0x2E,0x3B,0xC1,0x73,0x02,0x8B,
3160xC8,0x2B,0xC1,0x89,0x46,0x2E,0x01,0x4E,0x34,0xC4,0x7E,0x04,0x26,0x01,0x0D,0x8B,
3170x7E,0x2C,0x83,0xEA,0x04,0xF3,0x6C,0x8E,0xC1,0x89,0x7E,0x2C,0x3B,0x46,0x3C,0x72,
3180x12,0xF7,0xC6,0x20,0x00,0x75,0x0B,0x83,0xCE,0x20,0x89,0x76,0x38,0xB0,0x00,0xE8,
3190xA0,0xFC,0xC3,0xF7,0xC6,0x04,0x00,0x74,0x1B,0x8B,0xD8,0x83,0xCE,0x10,0x89,0x76,
3200x38,0x8A,0x86,0xA7,0x00,0x24,0xFE,0x88,0x86,0xA7,0x00,0x83,0xC2,0x08,0xEE,0x83,
3210xEA,0x08,0x8B,0xC3,0x3D,0x40,0x00,0x72,0x01,0xC3,0x81,0x4E,0x38,0x00,0x04,0x83,
3220xC2,0x02,0x8A,0x86,0xA5,0x00,0x24,0xFA,0x88,0x86,0xA5,0x00,0xEE,0xC3,0x8A,0x86,
3230xA6,0x00,0x0C,0x02,0xEE,0xC3,0xF7,0x46,0x38,0x01,0x00,0x74,0xF1,0x8B,0x4E,0x2E,
3240x32,0xDB,0x8A,0xBE,0xA3,0x00,0x83,0xC2,0x06,0xC4,0x76,0x04,0x8B,0x7E,0x2C,0x83,
3250xF9,0x08,0x72,0x2C,0xEC,0xA8,0x01,0x74,0x16,0x8A,0xE0,0x83,0xEA,0x0A,0xEC,0x83,
3260xC2,0x0A,0x84,0xE7,0x75,0x51,0xAA,0xFE,0xC3,0x49,0x83,0xF9,0x08,0x73,0xE5,0x32,
3270xFF,0x26,0x01,0x1C,0x01,0x5E,0x34,0x89,0x76,0x04,0x89,0x4E,0x2E,0x89,0x7E,0x2C,
3280x3B,0x4E,0x3C,0x72,0x11,0xF6,0x46,0x38,0x20,0x74,0x01,0xC3,0x83,0x4E,0x38,0x20,
3290xB0,0x00,0xE8,0xFD,0xFB,0xC3,0xF6,0x46,0x38,0x04,0x74,0x15,0x83,0x4E,0x38,0x10,
3300x8A,0x86,0xA7,0x00,0x24,0xFE,0x88,0x86,0xA7,0x00,0x83,0xEA,0x02,0xEE,0x83,0xC2,
3310x02,0x3D,0x40,0x00,0x72,0x5D,0xC3,0x32,0xFF,0x26,0x03,0x1C,0x85,0xDB,0x74,0x09,
3320x26,0x89,0x1C,0x8B,0xF7,0x47,0x47,0x49,0x49,0x80,0xE4,0x1E,0x80,0xCC,0xC0,0x26,
3330x89,0x04,0xF6,0xC4,0x10,0x74,0x27,0x8B,0x76,0x38,0xF7,0xC6,0x00,0x10,0x74,0x0B,
3340x50,0xFE,0x86,0xB2,0x00,0xB0,0x0A,0xE8,0xA8,0xFB,0x58,0xF7,0xC6,0x00,0x01,0x74,
3350x0D,0xE8,0x82,0x26,0x8B,0x76,0x38,0x8B,0x4E,0x2E,0x8B,0x7E,0x04,0xAB,0x8B,0xF7,
3360x33,0xC0,0xAB,0x32,0xDB,0x8A,0xBE,0xA3,0x00,0x49,0x49,0x83,0xF9,0x08,0x72,0x17,
3370xE9,0x41,0xFF,0x81,0x4E,0x38,0x00,0x04,0x83,0xC2,0xF8,0x8A,0x86,0xA5,0x00,0x24,
3380xFA,0x88,0x86,0xA5,0x00,0xEE,0xC3,0xE9,0x45,0xFF,0x83,0xC2,0x08,0xEC,0x88,0x86,
3390xAA,0x00,0xC0,0xE8,0x04,0x8A,0xE0,0x8A,0xC8,0x86,0x86,0xA9,0x00,0x32,0xE0,0x8B,
3400x5E,0x3E,0x84,0xE3,0x74,0x4F,0x8A,0xC1,0x8B,0x4E,0x26,0xF6,0xC5,0x04,0x74,0x0C,
3410xA8,0x08,0x74,0x05,0x80,0xE1,0xBF,0xEB,0x03,0x80,0xC9,0x40,0xF6,0xC5,0x08,0x74,
3420x0C,0xA8,0x02,0x74,0x05,0x80,0xE1,0x7F,0xEB,0x03,0x80,0xC9,0x80,0x88,0x4E,0x26,
3430x8B,0xF0,0x8A,0x86,0xA5,0x00,0x84,0xC9,0x74,0x08,0xA8,0x02,0x74,0x15,0x24,0xFD,
3440xEB,0x06,0xA8,0x02,0x75,0x0D,0x0C,0x02,0x88,0x86,0xA5,0x00,0x83,0xEA,0x0A,0xEE,
3450x83,0xC2,0x0A,0x8B,0xC6,0x84,0xE7,0x75,0x01,0xC3,0xC6,0x86,0xBA,0x00,0x01,0xB0,
3460x0E,0xE8,0xEE,0xFA,0xF7,0x46,0x38,0x00,0x02,0x74,0xEE,0x83,0x7E,0x2E,0x06,0x72,
3470xE8,0x8A,0xA6,0xAA,0x00,0xC4,0x5E,0x04,0x8B,0x7E,0x2C,0xB0,0xFF,0xAA,0xB0,0x02,
3480xAB,0x26,0x83,0x07,0x03,0x83,0x6E,0x2E,0x03,0x89,0x7E,0x2C,0xF6,0x46,0x38,0x20,
3490x74,0x01,0xC3,0x83,0x4E,0x38,0x20,0xB0,0x00,0xE8,0xB6,0xFA,0xC3,0x90,0x83,0xEA,
3500x08,0xE9,0xB4,0xFD,0x83,0xC2,0x06,0x8B,0x5E,0x26,0xF6,0xC3,0xC0,0x75,0xEF,0x8B,
3510x4E,0x1C,0xEC,0x88,0x86,0xA4,0x00,0x83,0xEA,0x0A,0xA8,0x20,0x75,0x02,0x8A,0xCD,
3520x32,0xED,0x8B,0x46,0x1A,0x3B,0xC8,0x73,0x18,0x01,0x4E,0x2A,0x2B,0xC1,0x89,0x46,
3530x1A,0xC5,0x76,0x00,0xF3,0x6E,0x8E,0xD9,0x89,0x76,0x00,0x3D,0x20,0x00,0x72,0x30,
3540xC3,0x85,0xC0,0x74,0x31,0x8B,0xC8,0x01,0x46,0x2A,0xC5,0x76,0x00,0xF3,0x6E,0x8E,
3550xD9,0x80,0xCB,0x02,0x89,0x5E,0x26,0xE8,0x32,0xF1,0xF6,0xC7,0x01,0x75,0x16,0x83,
3560xC2,0x02,0xE8,0x53,0xFD,0xF6,0xC7,0x10,0x75,0x0B,0xB0,0x02,0xE8,0x43,0xFA,0xC3,
3570xF6,0xC7,0x01,0x74,0xF0,0xC3,0x80,0xCB,0x02,0x89,0x5E,0x26,0xF6,0xC7,0x01,0x74,
3580xDE,0x83,0xC2,0x02,0xE8,0x31,0xFD,0xF6,0x86,0xA4,0x00,0x40,0x74,0x0B,0x80,0xE7,
3590xFE,0x80,0xCF,0x02,0x89,0x5E,0x26,0xEB,0xCC,0xB0,0x04,0xE8,0x14,0xFA,0xC3,0xC0,
3600xC2,0xC8,0xCA,0xC4,0xC6,0xCC,0xCE,0xD0,0xD2,0xD8,0xDA,0xD4,0xD6,0xDC,0xDE,0x90,
3610xE9,0x0E,0x01,0xE4,0xC4,0x8A,0xE0,0xE4,0xC4,0x8B,0xD0,0x83,0xF9,0x08,0x72,0xF0,
3620x26,0x83,0x3F,0x00,0x74,0x04,0x8B,0xDF,0x49,0x49,0x8B,0xFB,0x8A,0xDE,0x83,0xE3,
3630x0F,0x2E,0x8A,0xA7,0x2F,0x16,0xAB,0xF6,0xC4,0x10,0x74,0x24,0xF7,0xC6,0x00,0x10,
3640x74,0x0B,0x50,0xFE,0x86,0xB2,0x00,0xB0,0x0A,0xE8,0xC6,0xF9,0x58,0xF7,0xC6,0x00,
3650x01,0x74,0x0D,0xE8,0xA0,0x24,0x8B,0x76,0x38,0x8B,0x4E,0x2E,0x8B,0x7E,0x04,0xAB,
3660x89,0x7E,0x04,0x33,0xC0,0xAB,0x49,0x49,0x89,0x4E,0x2E,0x89,0x7E,0x2C,0x8B,0xC1,
3670xEB,0x4E,0x90,0xEB,0x9E,0x90,0xE4,0xD6,0x84,0xC0,0x79,0x63,0xE6,0xD0,0x8A,0xC8,
3680x25,0x03,0x00,0x03,0xD8,0xD1,0xE3,0x2E,0x8B,0xAF,0x44,0x00,0x88,0x8E,0xAE,0x00,
3690x8B,0x4E,0x2E,0xC4,0x5E,0x04,0x8B,0x7E,0x2C,0x8B,0x76,0x38,0xE4,0x86,0x24,0x07,
3700x3C,0x03,0x75,0xCF,0xE4,0x1C,0x91,0x3B,0xC1,0x73,0x02,0x8B,0xC8,0x2B,0xC1,0x89,
3710x46,0x2E,0x01,0x4E,0x34,0x26,0x01,0x0F,0xBA,0xC4,0x00,0xF3,0x6C,0x89,0x7E,0x2C,
3720x3B,0x46,0x3C,0x72,0x1C,0xF7,0xC6,0x20,0x00,0x75,0x0B,0x83,0xCE,0x20,0x89,0x76,
3730x38,0xB0,0x00,0xE8,0x3C,0xF9,0x8A,0x86,0xAE,0x00,0x24,0x3F,0xE6,0xD6,0xC3,0xF9,
3740xC3,0xF7,0xC6,0x0A,0x00,0x74,0x35,0xF7,0xC6,0x10,0x00,0x75,0x2F,0x83,0xCE,0x10,
3750x89,0x76,0x38,0xF7,0xC6,0x02,0x00,0x74,0x0E,0x50,0xE4,0xD8,0x24,0xFE,0xE6,0xD8,
3760x58,0xF7,0xC6,0x08,0x00,0x74,0x15,0x50,0x51,0xB9,0xE8,0x03,0xE4,0x0A,0x84,0xC0,
3770xE0,0xFA,0x84,0xC0,0x75,0x04,0xB0,0x24,0xE6,0x0A,0x59,0x58,0x3D,0x40,0x00,0x73,
3780xB5,0x8A,0x86,0xA5,0x00,0x24,0xEF,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x81,0xCE,0x10,
3790x04,0x89,0x76,0x38,0xEB,0xA0,0x00,0x08,0x04,0x0C,0x01,0x09,0x05,0x0D,0x02,0x0A,
3800x06,0x0E,0x03,0x0B,0x07,0x0F,0x00,0x40,0x80,0xC0,0x20,0x60,0xA0,0xE0,0x10,0x50,
3810x90,0xD0,0x30,0x70,0xB0,0xF0,0xE4,0xD2,0xE6,0xD0,0x8A,0xC8,0x25,0x03,0x00,0x03,
3820xD8,0xD1,0xE3,0x2E,0x8B,0xAF,0x44,0x00,0x88,0x8E,0xAE,0x00,0xE4,0xD8,0xC0,0xE8,
3830x04,0x8B,0xD8,0x2E,0x8A,0x87,0x66,0x17,0x8A,0xE0,0x8A,0xC8,0x86,0x86,0xA9,0x00,
3840x32,0xE0,0xE4,0x98,0x8B,0x5E,0x3E,0x84,0xE3,0x74,0x54,0x8A,0xC1,0x8B,0x4E,0x26,
3850xF6,0xC5,0x04,0x74,0x0C,0xA8,0x08,0x74,0x05,0x80,0xE1,0xBF,0xEB,0x03,0x80,0xC9,
3860x40,0xF6,0xC5,0x08,0x74,0x0C,0xA8,0x02,0x74,0x05,0x80,0xE1,0x7F,0xEB,0x03,0x80,
3870xC9,0x80,0x88,0x4E,0x26,0x8B,0xF0,0x8A,0x86,0xA5,0x00,0xF6,0xC1,0xFD,0x74,0x08,
3880xA8,0x06,0x74,0x19,0x24,0xF9,0xEB,0x0F,0xA8,0x06,0x75,0x11,0xF6,0xC5,0x01,0x75,
3890x04,0x0C,0x04,0xEB,0x02,0x0C,0x02,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x8B,0xC6,0x84,
3900xE7,0x75,0x09,0x8A,0x86,0xAE,0x00,0x24,0x3F,0xE6,0xD2,0xC3,0xC6,0x86,0xBA,0x00,
3910x01,0xB0,0x0E,0xE8,0x1C,0xF8,0xF7,0x46,0x38,0x00,0x02,0x74,0xE6,0x83,0x7E,0x2E,
3920x06,0x72,0xE0,0x8A,0x86,0xA9,0x00,0x8A,0xE0,0x86,0x86,0xAA,0x00,0x8A,0xC8,0x32,
3930xC4,0x80,0xC9,0x0B,0x22,0xC1,0xC0,0xE4,0x04,0x0A,0xE0,0xC4,0x5E,0x04,0x8B,0x7E,
3940x2C,0xB0,0xFF,0xAA,0xB0,0x02,0xAB,0x26,0x83,0x07,0x03,0x83,0x6E,0x2E,0x03,0x89,
3950x7E,0x2C,0xF6,0x46,0x38,0x20,0x75,0xAB,0x83,0x4E,0x38,0x20,0xB0,0x00,0xE8,0xD1,
3960xF7,0xEB,0xA0,0x90,0xE4,0x12,0x24,0xDF,0xE6,0x12,0x81,0xE3,0xFE,0x9F,0x89,0x5E,
3970x26,0x83,0x66,0x48,0xF7,0xEB,0x73,0x90,0xF6,0xC7,0x20,0x75,0xE7,0xE4,0x12,0x0C,
3980x20,0xE6,0x12,0x32,0xC0,0xE6,0xC6,0xB0,0x83,0xE6,0xC6,0x80,0xCF,0x20,0x89,0x5E,
3990x26,0x8A,0x86,0xA5,0x00,0x0C,0x02,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xEB,0x74,0x90,
4000xF6,0xC7,0x40,0x75,0xD3,0xE4,0x12,0x0C,0x20,0xE6,0x12,0x32,0xC0,0xE6,0xC6,0xB0,
4010x81,0xE6,0xC6,0x80,0xE7,0xDF,0x80,0xCB,0x01,0x89,0x5E,0x26,0xB0,0x06,0xE8,0x71,
4020xF7,0x90,0x8A,0x86,0xA5,0x00,0x24,0xF9,0xE6,0x0C,0x88,0x86,0xA5,0x00,0xEB,0x43,
4030xE4,0xD4,0xE6,0xD0,0x8B,0xF8,0x25,0x03,0x00,0x03,0xD8,0xD1,0xE3,0x2E,0x8B,0xAF,
4040x44,0x00,0x8B,0x5E,0x26,0xF6,0xC7,0x60,0x75,0xB6,0xF6,0xC3,0xC0,0x75,0xD3,0xBA,
4050xC6,0x00,0x8B,0x4E,0x1C,0x8B,0x46,0x1A,0x3B,0xC8,0x73,0x1E,0x01,0x4E,0x2A,0x2B,
4060xC1,0x89,0x46,0x1A,0xC5,0x76,0x00,0xF3,0x6E,0x8E,0xD9,0x89,0x76,0x00,0x3D,0x20,
4070x00,0x72,0x3D,0x8B,0xC7,0x24,0x3F,0xE6,0xD4,0xC3,0x85,0xC0,0x74,0x39,0x8B,0xC8,
4080x01,0x46,0x2A,0xC5,0x76,0x00,0xF3,0x6E,0x8E,0xD9,0x83,0xCB,0x02,0x89,0x5E,0x26,
4090xE8,0xD9,0xED,0xF6,0xC7,0x01,0x75,0x39,0x8A,0x86,0xA5,0x00,0x24,0xF9,0xE6,0x0C,
4100x88,0x86,0xA5,0x00,0xF6,0xC7,0x10,0x75,0xCA,0xB0,0x02,0xE8,0xE4,0xF6,0xEB,0xC3,
4110xF6,0xC7,0x01,0x74,0xEF,0xEB,0xBC,0xF6,0xC7,0x01,0x74,0xDC,0x8A,0x86,0xA5,0x00,
4120xA8,0x02,0x74,0x11,0x81,0xE3,0xFF,0xFE,0x81,0xCB,0x00,0x02,0x89,0x5E,0x26,0xEB,
4130xC7,0x8A,0x86,0xA5,0x00,0x24,0xFB,0x0C,0x02,0xE6,0x0C,0x88,0x86,0xA5,0x00,0xEB,
4140x92,0x90,0xFD,0xF7,0xDF,0x7F,0xFE,0xFB,0xEF,0xBF,0x00,0x04,0x00,0x04,0x05,0x04,
4150x05,0x04,0x01,0x04,0x00,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4160x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x02,0x04,0x00,0x04,0x05,0x04,
4170x05,0x04,0x01,0x04,0x00,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4180x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,
4190x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4200x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,
4210x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4220x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x03,0x04,0x00,0x04,0x05,0x04,
4230x05,0x04,0x01,0x04,0x00,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4240x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x02,0x04,0x00,0x04,0x05,0x04,
4250x05,0x04,0x01,0x04,0x00,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4260x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,
4270x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4280x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,
4290x05,0x04,0x07,0x04,0x07,0x04,0x05,0x04,0x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,
4300x05,0x04,0x06,0x04,0x06,0x04,0x05,0x04,0x05,0x04,0x33,0xDB,0x8A,0xD8,0x8A,0x87,
4310x6C,0x12,0xE6,0xFE,0xC1,0xE3,0x02,0xE4,0xCE,0xA8,0x04,0x75,0x09,0xA8,0x02,0x74,
4320x03,0xE9,0x2C,0xFE,0xF9,0xC3,0x50,0x53,0xE8,0xCB,0xFC,0x5B,0x58,0xA8,0x02,0x74,
4330x03,0xE9,0x1C,0xFE,0xF8,0xC3,0x33,0xDB,0x8A,0xD8,0x8A,0x87,0x6C,0x12,0xE6,0xFE,
4340xC1,0xE3,0x02,0xE9,0xD0,0xFB,0x9A,0x1A,0xC6,0x1A,0x00,0x00,0x02,0x00,0x04,0x00,
4350x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4360x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,
4370x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4380x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0C,0x00,0x02,0x00,0x04,0x00,
4390x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4400x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,
4410x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4420x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0E,0x00,0x02,0x00,0x04,0x00,
4430x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4440x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,
4450x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4460x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0C,0x00,0x02,0x00,0x04,0x00,
4470x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4480x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x0A,0x00,0x02,0x00,0x04,0x00,
4490x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0x08,0x00,0x02,0x00,0x04,0x00,
4500x02,0x00,0x06,0x00,0x02,0x00,0x04,0x00,0x02,0x00,0xC3,0x90,0xDA,0x14,0x94,0x15,
4510x5C,0x13,0xE6,0x13,0xDA,0x1B,0xDA,0x1B,0xE6,0x13,0xDA,0x1B,0x8B,0x94,0x64,0x12,
4520xC1,0xE6,0x04,0xA8,0x01,0x74,0x35,0x50,0x33,0xC0,0x8A,0xC2,0xE6,0xFE,0xE4,0xA0,
4530x85,0xC0,0x74,0x27,0x8B,0xD8,0x2E,0x8A,0x9F,0xDA,0x1A,0x52,0x56,0x2E,0x8B,0xA8,
4540x44,0x00,0x8B,0x56,0x28,0xEC,0xA8,0x01,0x75,0x0D,0x88,0x86,0xAD,0x00,0x24,0x0E,
4550x8A,0xD8,0x2E,0xFF,0x97,0xDC,0x1B,0x5E,0x5A,0xEB,0xCD,0x58,0xA8,0x02,0x74,0x36,
4560x83,0xC6,0x10,0x33,0xC0,0x8A,0xC6,0xE6,0xFE,0xE4,0xA0,0x85,0xC0,0x74,0x27,0x8B,
4570xD8,0x2E,0x8A,0x9F,0xDA,0x1A,0x52,0x56,0x2E,0x8B,0xA8,0x44,0x00,0x8B,0x56,0x28,
4580xEC,0xA8,0x01,0x75,0x0D,0x88,0x86,0xAD,0x00,0x24,0x0E,0x8A,0xD8,0x2E,0xFF,0x97,
4590xDC,0x1B,0x5E,0x5A,0xEB,0xCD,0xC3,0x90,0x32,0xE4,0x8B,0xD8,0x8B,0xD0,0x2E,0x8A,
4600x9F,0x9A,0x19,0x2E,0x22,0x97,0x92,0x19,0x56,0x52,0x8A,0xC3,0x24,0x03,0x03,0xC6,
4610x80,0xE3,0x04,0xD0,0xEB,0x2E,0xFF,0x97,0xD6,0x1A,0x58,0x5E,0xA9,0x55,0x00,0x75,
4620xD9,0xC3,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5C,0x12,0xE6,0xFE,0xE4,0x00,
4630x22,0xC4,0x74,0x08,0x33,0xF6,0xE8,0xBF,0xFF,0xEB,0xEE,0x90,0xE4,0x04,0x07,0xE4,
4640x04,0x1F,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,
4650xC0,0x8E,0xD8,0xA1,0x5E,0x12,0xE6,0xFE,0xE4,0x00,0x22,0xC4,0x74,0x08,0xBE,0x04,
4660x00,0xE8,0x94,0xFF,0xEB,0xED,0xE4,0x04,0x07,0xE4,0x04,0x1F,0xB8,0x00,0x80,0xBA,
4670x22,0xFF,0xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5C,0x12,
4680xE6,0xFE,0xE4,0x00,0x22,0xC4,0x74,0x18,0x33,0xF6,0xE8,0x6B,0xFF,0xA1,0x60,0x12,
4690xE6,0xFE,0xE4,0x00,0x22,0xC4,0x74,0xE5,0xBE,0x08,0x00,0xE8,0x5A,0xFF,0xEB,0xDD,
4700xA1,0x60,0x12,0xE6,0xFE,0xE4,0x00,0x22,0xC4,0x75,0xED,0xE4,0x04,0x07,0xE4,0x04,
4710xA1,0x5C,0x12,0xE6,0xFE,0xE4,0x04,0x1F,0xE4,0x04,0xB8,0x00,0x80,0xBA,0x22,0xFF,
4720xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5E,0x12,0xE6,0xFE,
4730xE4,0x00,0x22,0xC4,0x74,0x19,0xBE,0x04,0x00,0xE8,0x1C,0xFF,0xA1,0x62,0x12,0xE6,
4740xFE,0xE4,0x00,0x22,0xC4,0x74,0xE4,0xBE,0x0C,0x00,0xE8,0x0B,0xFF,0xEB,0xDC,0xA1,
4750x62,0x12,0xE6,0xFE,0xE4,0x00,0x22,0xC4,0x75,0xED,0xE4,0x04,0x07,0xE4,0x04,0xA1,
4760x5E,0x12,0xE6,0xFE,0xE4,0x04,0x1F,0xE4,0x04,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,
4770x61,0xCF,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5C,0x12,0xE6,0xFE,0xE4,0x80,
4780x84,0xC4,0x74,0x08,0x33,0xF6,0xE8,0x53,0xFE,0xEB,0xEE,0x90,0xB8,0x00,0x80,0xBA,
4790x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,
4800x5E,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0x08,0xBE,0x02,0x00,0xE8,0x2C,0xFE,
4810xEB,0xED,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,0x60,0x1E,
4820x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0x08,
4830xBE,0x04,0x00,0xE8,0x06,0xFE,0xEB,0xED,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x07,
4840x1F,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x62,0x12,0xE6,0xFE,
4850xE4,0x80,0x84,0xC4,0x74,0x08,0xBE,0x06,0x00,0xE8,0xE0,0xFD,0xEB,0xED,0xB8,0x00,
4860x80,0xBA,0x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,
4870xD8,0xA1,0x5C,0x12,0xE6,0xFE,0xE4,0x00,0x22,0xC4,0x74,0x18,0x33,0xF6,0xE8,0x37,
4880xFE,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0xE5,0xBE,0x04,0x00,0xE8,
4890xAA,0xFD,0xEB,0xDD,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x75,0xED,0xA1,
4900x5C,0x12,0xE6,0xFE,0xE4,0x04,0x07,0xE4,0x04,0x1F,0xB8,0x00,0x80,0xBA,0x22,0xFF,
4910xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5E,0x12,0xE6,0xFE,
4920xE4,0x00,0x22,0xC4,0x74,0x19,0xBE,0x04,0x00,0xE8,0xEC,0xFD,0xA1,0x62,0x12,0xE6,
4930xFE,0xE4,0x80,0x84,0xC4,0x74,0xE4,0xBE,0x06,0x00,0xE8,0x5F,0xFD,0xEB,0xDC,0xA1,
4940x62,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x75,0xED,0xA1,0x5E,0x12,0xE6,0xFE,0xE4,
4950x04,0x07,0xE4,0x04,0x1F,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x61,0xCF,0x60,0x1E,
4960x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5C,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0x18,
4970x33,0xF6,0xE8,0x27,0xFD,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x00,0x22,0xC4,0x74,0xE5,
4980xBE,0x08,0x00,0xE8,0x92,0xFD,0xEB,0xDD,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x00,0x22,
4990xC4,0x75,0xED,0xE4,0x04,0x07,0xE4,0x04,0x1F,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,
5000x61,0xCF,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,0x5E,0x12,0xE6,0xFE,0xE4,0x80,
5010x84,0xC4,0x74,0x19,0xBE,0x02,0x00,0xE8,0xE2,0xFC,0xA1,0x62,0x12,0xE6,0xFE,0xE4,
5020x00,0x22,0xC4,0x74,0xE4,0xBE,0x0C,0x00,0xE8,0x4D,0xFD,0xEB,0xDC,0xA1,0x62,0x12,
5030xE6,0xFE,0xE4,0x00,0x22,0xC4,0x75,0xED,0xE4,0x04,0x07,0xE4,0x04,0x1F,0xB8,0x00,
5040x80,0xBA,0x22,0xFF,0xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,
5050x5C,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0x18,0x33,0xF6,0xE8,0x9D,0xFC,0xA1,
5060x60,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0xE5,0xBE,0x04,0x00,0xE8,0x8C,0xFC,
5070xEB,0xDD,0xA1,0x60,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x75,0xED,0x07,0x1F,0xB8,
5080x00,0x80,0xBA,0x22,0xFF,0xEF,0x61,0xCF,0x60,0x1E,0x06,0x2B,0xC0,0x8E,0xD8,0xA1,
5090x5E,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0x19,0xBE,0x02,0x00,0xE8,0x5C,0xFC,
5100xA1,0x62,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x74,0xE4,0xBE,0x06,0x00,0xE8,0x4B,
5110xFC,0xEB,0xDC,0xA1,0x62,0x12,0xE6,0xFE,0xE4,0x80,0x84,0xC4,0x75,0xED,0x07,0x1F,
5120xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x61,0xCF,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,
5130xD8,0x90,0x2A,0xC0,0xE6,0xFE,0xE4,0xCE,0xA8,0x01,0x74,0x14,0x33,0xDB,0xE8,0xD5,
5140xF6,0xEB,0xEF,0x90,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,
5150xF6,0x06,0x05,0x01,0x01,0x75,0xED,0xB0,0x01,0xE6,0xFE,0xE4,0xCE,0xA8,0x01,0x74,
5160xE3,0xBB,0x04,0x00,0xE8,0xAF,0xF6,0xEB,0xC9,0x90,0x60,0x1E,0x06,0x2B,0xC0,0x8E,
5170xD8,0x90,0xFB,0x90,0xFA,0x2A,0xC0,0xE6,0xFE,0xE4,0xCE,0xA8,0x02,0x74,0x13,0x33,
5180xDB,0xE8,0xCC,0xF8,0xEB,0xEC,0xB8,0x00,0x80,0xBA,0x22,0xFF,0xEF,0x07,0x1F,0x61,
5190xCF,0x90,0xA8,0x04,0x74,0xF0,0x33,0xDB,0xE8,0x5B,0xF7,0xEB,0xD5,0x90,0x60,0x1E,
5200x06,0x2B,0xC0,0x8E,0xD8,0x90,0xFB,0x90,0xFA,0xB0,0x01,0xE6,0xFE,0xE4,0xCE,0xA8,
5210x02,0x74,0x15,0xBB,0x04,0x00,0xE8,0x97,0xF8,0xEB,0xEB,0x90,0xB8,0x00,0x80,0xBA,
5220x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,0xA8,0x04,0x74,0xF0,0xBB,0x04,0x00,0xE8,
5230x24,0xF7,0xEB,0xD2,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x09,0x9C,0x0E,0xE8,0x6B,
5240xF2,0x90,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x29,0x9C,0x0E,0xE8,0x5D,0xF2,0x90,
5250x72,0x20,0x72,0x20,0x72,0x20,0xCE,0x1D,0x92,0x1C,0xE6,0x1C,0x1A,0x1E,0x72,0x20,
5260x82,0x1D,0xAE,0x1E,0x38,0x1F,0x72,0x20,0x82,0x1D,0x72,0x20,0x72,0x20,0x38,0x1F,
5270x72,0x20,0x72,0x20,0x72,0x20,0xF4,0x1D,0xBC,0x1C,0x34,0x1D,0x64,0x1E,0x72,0x20,
5280xA8,0x1D,0xF2,0x1E,0x78,0x1F,0x72,0x20,0xA8,0x1D,0x72,0x20,0x72,0x20,0x78,0x1F,
5290xFC,0xB9,0x40,0x00,0x8C,0xCB,0xB8,0x64,0x20,0x2B,0xFF,0xAB,0x93,0xAB,0x93,0xE2,
5300xFA,0xC7,0x06,0x4C,0x00,0xA8,0x11,0x83,0x3E,0x44,0x12,0x00,0x75,0x20,0xC7,0x06,
5310x3C,0x00,0x08,0x4B,0xC7,0x06,0x30,0x00,0xBA,0x1F,0xC7,0x06,0x34,0x00,0xFA,0x1F,
5320xF6,0x06,0x05,0x01,0x01,0x75,0x06,0xC7,0x06,0x38,0x00,0x2E,0x20,0xC3,0xC7,0x06,
5330x3C,0x00,0x56,0x4B,0x33,0xDB,0x8A,0x1E,0x54,0x12,0xC1,0xE3,0x02,0x02,0x1E,0x56,
5340x12,0x2E,0x8B,0x87,0x80,0x20,0xA3,0x30,0x00,0x8A,0x1E,0x55,0x12,0xC1,0xE3,0x02,
5350x02,0x1E,0x57,0x12,0x2E,0x8B,0x87,0xA0,0x20,0xA3,0x34,0x00,0xC3,0x8B,0x86,0x9E,
5360x00,0xE6,0xFE,0x86,0xC4,0xE6,0xD0,0xC3,0x8B,0x86,0x9E,0x00,0xE6,0xFE,0x33,0xD2,
5370x8A,0xD4,0xC3,0x51,0xB9,0x10,0x27,0xE4,0x0A,0x90,0x90,0x84,0xC0,0x74,0x05,0xE2,
5380xF6,0x59,0xF9,0xC3,0x59,0xF8,0xC3,0x84,0xC0,0x78,0x1E,0x51,0x8A,0xE8,0x8A,0xC8,
5390xB8,0x01,0x00,0xD3,0xE0,0x09,0x86,0x98,0x00,0x3A,0xAE,0xA0,0x00,0x59,0x75,0x10,
5400xE8,0xA9,0xE5,0x83,0x4E,0x26,0x02,0xF9,0xC3,0x98,0x89,0x86,0x98,0x00,0xEB,0xF0,
5410xF8,0xC3,0x84,0xC0,0x78,0x12,0x51,0x8A,0xE0,0x8A,0xC8,0xB8,0x01,0x00,0xD3,0xE0,
5420x59,0xF7,0xD0,0x21,0x86,0x98,0x00,0xC3,0xC7,0x86,0x98,0x00,0x00,0x00,0xC3,0x83,
5430xC2,0x04,0x8A,0x86,0xA6,0x00,0x0C,0x04,0xEE,0x83,0xEA,0x04,0xC3,0xE8,0x93,0xFF,
5440x72,0x04,0xB0,0x82,0xE6,0x0A,0xC3,0x8B,0x46,0x26,0xA8,0xFD,0x74,0x11,0x8A,0x86,
5450xA5,0x00,0xA8,0x06,0x74,0x08,0x24,0xF9,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xC3,0xF6,
5460xC4,0x01,0x74,0x0A,0x8A,0x86,0xA5,0x00,0x24,0xFB,0x0C,0x02,0xEB,0x0C,0xA8,0x02,
5470x75,0x0F,0x8A,0x86,0xA5,0x00,0x24,0xFD,0x0C,0x04,0x3A,0x86,0xA5,0x00,0x75,0xD8,
5480xC3,0x8A,0x86,0xA5,0x00,0xEB,0xCF,0xE4,0xD8,0x33,0xDB,0x8A,0xD8,0xC0,0xEB,0x04,
5490x2E,0x8A,0x9F,0x66,0x17,0x88,0x9E,0xA9,0x00,0x8B,0x5E,0x26,0x80,0xE3,0x3F,0xF6,
5500xC7,0x04,0x74,0x07,0xA8,0x10,0x75,0x03,0x80,0xCB,0x40,0xF6,0xC7,0x08,0x74,0x07,
5510xA8,0x80,0x75,0x03,0x80,0xCB,0x40,0x88,0x5E,0x26,0x8A,0x86,0xA5,0x00,0xF6,0xC3,
5520xFD,0x74,0x0D,0xA8,0x06,0x74,0x08,0x24,0xF9,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xC3,
5530xF6,0xC7,0x01,0x74,0x04,0x0C,0x02,0xEB,0xF0,0xF6,0xC3,0x02,0x75,0xE9,0x0C,0x04,
5540xEB,0xE7,0xC4,0x04,0xC4,0x04,0x85,0x04,0x59,0x04,0x48,0x04,0x41,0x04,0xC3,0x03,
5550x82,0x03,0x41,0x03,0x82,0x02,0x57,0x02,0x41,0x02,0x82,0x01,0x41,0x01,0x82,0x00,
5560x41,0x00,0x4E,0x02,0xAD,0x01,0x57,0x01,0x2D,0x00,0x2B,0x00,0x27,0x00,0x21,0x00,
5570x16,0x00,0xF4,0x04,0xF4,0x04,0xA3,0x04,0x6F,0x04,0x5B,0x04,0x51,0x04,0xF4,0x03,
5580xA3,0x03,0x51,0x03,0xA3,0x02,0x6D,0x02,0x51,0x02,0xA3,0x01,0x51,0x01,0xA3,0x00,
5590x51,0x00,0x62,0x02,0xD9,0x01,0x6D,0x01,0x38,0x00,0x36,0x00,0x31,0x00,0x29,0x00,
5600x1B,0x00,0x51,0x57,0xBF,0x02,0x00,0xEB,0x0F,0x90,0x51,0x56,0xBF,0x01,0x00,0xEB,
5610x07,0x90,0x51,0x56,0xBF,0x03,0x00,0x90,0x3C,0x19,0x76,0x02,0xB0,0x17,0x98,0x8B,
5620xF0,0x8A,0x82,0xC4,0x00,0x2A,0xE4,0x8B,0xF0,0x83,0xFE,0x18,0x73,0x46,0xD1,0xE6,
5630x2E,0x8B,0x8C,0x52,0x22,0xF7,0x46,0x38,0x80,0x00,0x74,0x05,0x2E,0x8B,0x8C,0x82,
5640x22,0xF7,0xC7,0x02,0x00,0x74,0x12,0x3B,0x8E,0x94,0x00,0x74,0x0C,0x89,0x8E,0x94,
5650x00,0x8A,0xC5,0xE6,0xEC,0x8A,0xC1,0xE6,0xE4,0xF7,0xC7,0x01,0x00,0x74,0x12,0x3B,
5660x8E,0x96,0x00,0x74,0x0C,0x89,0x8E,0x96,0x00,0x8A,0xC5,0xE6,0xF8,0x8A,0xC1,0xE6,
5670xF0,0x5E,0x59,0xC3,0x77,0x06,0x8B,0x8E,0x8E,0x00,0xEB,0xC5,0x8B,0x8E,0x90,0x00,
5680xEB,0xBF,0xD5,0x03,0xF6,0x00,0x3E,0x00,0x10,0x00,0x04,0x00,0xCA,0x04,0x33,0x01,
5690x4D,0x00,0x14,0x00,0x05,0x00,0x01,0x03,0x05,0x07,0x09,0x00,0x01,0x02,0x03,0x04,
5700x80,0x84,0x1E,0x00,0xA0,0x25,0x26,0x00,0x00,0x00,0x60,0x8B,0xF0,0x33,0xFF,0x2E,
5710xA1,0x50,0x23,0x2E,0x8B,0x16,0x52,0x23,0xBB,0x32,0x23,0xF7,0x46,0x38,0x80,0x00,
5720x74,0x0C,0x2E,0xA1,0x54,0x23,0x2E,0x8B,0x16,0x56,0x23,0xBB,0x3C,0x23,0xB9,0x05,
5730x00,0x2E,0x3B,0x31,0x73,0x0A,0x47,0x47,0xE2,0xF7,0xB8,0xFF,0xFF,0xEB,0x1D,0x90,
5740xD1,0xEF,0x2E,0x8A,0x8D,0x46,0x23,0x2A,0xED,0xD1,0xEA,0xD1,0xD8,0xE2,0xFA,0xF7,
5750xF6,0x05,0x02,0x00,0xC1,0xE8,0x02,0x2E,0x8A,0xA5,0x4B,0x23,0x2E,0xA3,0x58,0x23,
5760x61,0x2E,0xA1,0x58,0x23,0xC3,0x08,0x00,0x20,0x00,0x80,0x00,0x00,0x02,0x60,0x09,
5770x08,0x00,0x20,0x00,0x80,0x00,0x00,0x02,0x00,0x08,0x00,0x00,0x01,0x00,0x02,0x00,
5780x03,0x00,0x04,0x00,0x52,0x56,0x57,0x85,0xC0,0x74,0x05,0x3D,0x01,0x09,0x76,0x03,
5790xB8,0x01,0x09,0xBF,0x5B,0x01,0xF7,0x46,0x38,0x80,0x00,0x74,0x03,0xBF,0xB2,0x01,
5800x33,0xF6,0x2E,0x3B,0x84,0xB6,0x23,0x76,0x04,0x46,0x46,0xEB,0xF5,0xF7,0xE7,0x2E,
5810x8B,0xBC,0xC0,0x23,0x03,0xC7,0x83,0xD2,0x00,0xD1,0xE7,0xF7,0xF7,0x2E,0x8A,0xA4,
5820xCA,0x23,0x5F,0x5E,0x5A,0xC3,0xE4,0x3E,0x80,0xBE,0xC3,0x00,0x03,0x75,0x0C,0xF7,
5830x46,0x7A,0x20,0x00,0x74,0x05,0x0C,0x80,0xE6,0x3E,0xC3,0x24,0x7F,0xE6,0x3E,0xC3,
5840x24,0x03,0x88,0x86,0xC3,0x00,0x8A,0xE0,0xE4,0x10,0x24,0xFC,0x0A,0xC4,0xE6,0x10,
5850x80,0x8E,0xA1,0x00,0x42,0xE8,0xCE,0xFF,0xC3,0x90,0x56,0x8B,0xF0,0x83,0xE6,0x07,
5860xD1,0xE6,0x2E,0xFF,0xA4,0x58,0x24,0x90,0x68,0x24,0x6C,0x24,0x70,0x24,0x74,0x24,
5870x78,0x24,0x87,0x24,0x87,0x24,0x87,0x24,0xB4,0x00,0xEB,0x0E,0xB4,0xC0,0xEB,0x0A,
5880xB4,0x40,0xEB,0x06,0xB4,0x20,0xEB,0x02,0xB4,0xA0,0xE4,0x10,0x24,0x1F,0x0A,0xC4,
5890xE6,0x10,0x80,0x8E,0xA1,0x00,0x42,0x5E,0xC3,0x90,0x3C,0x02,0x77,0x12,0x8A,0xE0,
5900xE4,0x10,0x24,0xF3,0xC0,0xE4,0x02,0x0A,0xC4,0xE6,0x10,0x80,0x8E,0xA1,0x00,0x42,
5910xC3,0x90,0x8B,0x5E,0x38,0x84,0xC0,0x74,0x1F,0x3C,0x02,0x74,0x20,0x83,0xCB,0x08,
5920x8B,0x46,0x2E,0x3B,0x46,0x3C,0x77,0x0C,0xE8,0x88,0xFC,0x72,0x07,0xB0,0x24,0xE6,
5930x0A,0x83,0xCB,0x10,0x89,0x5E,0x38,0xC3,0x83,0xE3,0xF7,0xEB,0xF7,0xF7,0xC3,0x10,
5940x00,0x74,0xF5,0xE8,0x6D,0xFC,0x72,0xEC,0x8A,0x86,0xC0,0x00,0xE6,0x38,0xB0,0x23,
5950xE6,0x0A,0xEB,0xE0,0x8B,0x5E,0x38,0x8B,0x46,0x2E,0x3B,0x46,0x3C,0xE4,0xD8,0x77,
5960x0B,0x24,0xFE,0x80,0xCB,0x12,0xE6,0xD8,0x89,0x5E,0x38,0xC3,0x0C,0x01,0x80,0xCB,
5970x02,0xEB,0xF3,0x50,0x33,0xDB,0xC1,0xE8,0x04,0x25,0x0F,0x0F,0x8A,0xD8,0x2E,0x8A,
5980x87,0x66,0x17,0x8A,0xDC,0x2E,0x8A,0xA7,0x66,0x17,0x09,0x46,0x3E,0x58,0xC3,0x50,
5990x33,0xDB,0xC1,0xE8,0x04,0x25,0x0F,0x0F,0x8A,0xD8,0x2E,0x8A,0x87,0x66,0x17,0x8A,
6000xDC,0x2E,0x8A,0xA7,0x66,0x17,0xF7,0xD0,0x21,0x46,0x3E,0x58,0xC3,0x8B,0x46,0x3E,
6010x33,0xDB,0x8A,0xD8,0x0A,0xDC,0x2E,0x8A,0x87,0x76,0x17,0xE6,0x2C,0x8A,0xE0,0xE4,
6020x2A,0x24,0x0F,0x0A,0xC4,0xE6,0x2A,0x8A,0x86,0xA5,0x00,0x84,0xE4,0x75,0x0D,0xA8,
6030x80,0x74,0x11,0x24,0x7F,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xC3,0xA8,0x80,0x75,0x04,
6040x0C,0x80,0xEB,0xF1,0xC3,0x1E,0x60,0x33,0xC9,0x33,0xD2,0x33,0xF6,0x8E,0xD9,0x8D,
6050xBE,0xFD,0x00,0x57,0x8B,0x05,0x84,0xC0,0x74,0x16,0x8B,0xD1,0x42,0x8B,0xFE,0x4F,
6060x78,0x09,0x38,0xA3,0xE4,0x00,0x74,0x08,0x4F,0x79,0xF7,0x88,0xA2,0xE4,0x00,0x46,
6070x5F,0x83,0xC7,0x09,0x41,0x83,0xF9,0x10,0x72,0xD9,0x89,0xB6,0x86,0x00,0x89,0x96,
6080x84,0x00,0x61,0x1F,0xC3,0x53,0xC7,0x46,0x66,0x00,0x00,0x8B,0x46,0x64,0xA9,0x40,
6090x00,0x74,0x0D,0xB3,0x00,0xA9,0x80,0x00,0x74,0x02,0xB3,0x7F,0x88,0x9E,0xC1,0x00,
6100x32,0xDB,0xA9,0x02,0x00,0x74,0x03,0x80,0xCB,0x40,0xA9,0x00,0x40,0x74,0x03,0x80,
6110xCB,0x02,0xA9,0x00,0x80,0x74,0x03,0x80,0xCB,0x01,0xA9,0x30,0x1E,0x74,0x03,0x80,
6120xCB,0xBC,0xA9,0x00,0x20,0x74,0x03,0x80,0xCB,0x08,0xA9,0x04,0x01,0x74,0x03,0x80,
6130xCB,0x10,0xA9,0x08,0x00,0x74,0x03,0x80,0xCB,0x20,0x88,0x9E,0xC2,0x00,0x5B,0xC3,
6140x06,0x51,0x57,0x50,0x16,0x07,0x8D,0xBE,0xC4,0x00,0xB9,0x1F,0x00,0x33,0xC0,0xAA,
6150x40,0xE2,0xFC,0x8B,0x86,0x92,0x00,0x89,0x86,0x8E,0x00,0x89,0x86,0x90,0x00,0x58,
6160x5F,0x59,0x07,0xC3,0xE4,0xD8,0xC0,0xE8,0x04,0x53,0x25,0x0F,0x00,0x8B,0xD8,0x2E,
6170x8A,0x87,0x66,0x17,0x88,0x86,0xA9,0x00,0x5A,0xC3,0x08,0x86,0xAC,0x00,0xC6,0x86,
6180xBA,0x00,0x01,0xB0,0x0E,0xE8,0xEA,0xE9,0xC3,0xAD,0x36,0xA3,0xB4,0x13,0xAD,0x36,
6190xA3,0xB6,0x13,0xAD,0x36,0xA3,0xB8,0x13,0x83,0xE9,0x06,0x36,0xF7,0x06,0xB6,0x13,
6200x0F,0x00,0xC3,0x8A,0x46,0x26,0xF7,0x46,0x48,0x80,0x00,0x74,0x02,0x0C,0x10,0x88,
6210x86,0xBD,0x00,0x32,0xC0,0x83,0x7E,0x1A,0x00,0x75,0x0E,0x8B,0x5E,0x40,0x43,0x80,
6220xE3,0xFE,0x3B,0x5E,0x08,0x75,0x02,0x0C,0x01,0x83,0x7E,0x3A,0x00,0x75,0x0D,0x1E,
6230xC5,0x5E,0x14,0x8B,0x1F,0x1F,0x85,0xDB,0x75,0x02,0x0C,0x02,0xF7,0x46,0x38,0x10,
6240x00,0x74,0x02,0x0C,0x04,0x8B,0x5E,0x7A,0xF7,0xC3,0x02,0x00,0x74,0x02,0x0C,0x08,
6250xF7,0xC3,0x04,0x00,0x74,0x02,0x0C,0x10,0xF7,0xC3,0x08,0x00,0x74,0x02,0x0C,0x20,
6260xF7,0xC3,0x40,0x00,0x74,0x02,0x0C,0x40,0x88,0x86,0xBF,0x00,0xC3,0x90,0x6A,0x00,
6270x1F,0xC6,0x06,0x93,0x12,0x0D,0x9C,0x0E,0xE8,0xF1,0xEB,0x90,0xB0,0x02,0xE6,0xDA,
6280xF8,0xC3,0x33,0xC0,0xE6,0xDA,0xF8,0xC3,0xB0,0x01,0xE6,0xD8,0xF8,0xC3,0x33,0xC0,
6290xE6,0xD8,0xF8,0xC3,0xB0,0xFF,0xE8,0x4E,0xFA,0xE8,0xA1,0xFA,0xF8,0xC3,0xAC,0x49,
6300xE8,0xAF,0xFB,0xF8,0xC3,0x90,0xAC,0x49,0xE8,0x15,0xFD,0xF8,0xC3,0x90,0xAC,0x49,
6310xE8,0x67,0xFD,0xF8,0xC3,0x90,0xAC,0x49,0xE8,0x1F,0xFD,0xF8,0xC3,0x90,0xAC,0x49,
6320xE6,0x34,0xF8,0xC3,0xAC,0x49,0xE6,0x36,0xF8,0xC3,0xAC,0x49,0x3C,0x02,0x77,0x1F,
6330x84,0xC0,0x75,0x1D,0xE4,0x14,0x24,0xEF,0xE6,0x14,0xE4,0x12,0x24,0x3F,0xE6,0x12,
6340xE4,0x16,0xA8,0x04,0x74,0x09,0xE8,0xEA,0xF9,0x72,0x04,0xB0,0x18,0xE6,0x0A,0xF8,
6350xC3,0x8A,0xE0,0xE4,0x14,0x0C,0x10,0xE6,0x14,0xE4,0x12,0x0C,0xC0,0xF6,0xC4,0x01,
6360x74,0x02,0x24,0x7F,0xE6,0x12,0xF8,0xC3,0xAC,0x49,0xE8,0x25,0xFD,0xF8,0xC3,0x90,
6370xB8,0x00,0x40,0xE8,0x7D,0xFD,0xE8,0xB4,0xFD,0xE8,0xA8,0xFE,0xB0,0x01,0xE8,0xB9,
6380xFE,0xF8,0xC3,0x90,0xB8,0x00,0x40,0xE8,0x85,0xFD,0xE8,0xA0,0xFD,0xF8,0xC3,0x90,
6390xB8,0x00,0x10,0xE8,0x5D,0xFD,0xE8,0x94,0xFD,0xE8,0x88,0xFE,0xB0,0x08,0xE8,0x99,
6400xFE,0xF8,0xC3,0x90,0xB8,0x00,0x10,0xE8,0x65,0xFD,0xE8,0x80,0xFD,0xF8,0xC3,0x90,
6410xB8,0x00,0x80,0xE8,0x3D,0xFD,0xE8,0x74,0xFD,0xE8,0x68,0xFE,0xB0,0x02,0xE8,0x79,
6420xFE,0xF8,0xC3,0x90,0xB8,0x00,0x80,0xE8,0x45,0xFD,0xE8,0x60,0xFD,0xF8,0xC3,0x90,
6430xB8,0x00,0x20,0xE8,0x1D,0xFD,0xE8,0x54,0xFD,0xE8,0x48,0xFE,0xB0,0x04,0xE8,0x59,
6440xFE,0xF8,0xC3,0x90,0xB8,0x00,0x20,0xE8,0x25,0xFD,0xE8,0x40,0xFD,0xF8,0xC3,0x90,
6450xAC,0x49,0xE8,0x48,0x14,0xE4,0x3C,0x24,0xE7,0x0A,0xC4,0xE6,0x3C,0xF8,0xC3,0x90,
6460xB8,0xFC,0x3B,0x89,0x46,0x7C,0xE4,0x3C,0x0C,0x18,0xE6,0x3C,0xF8,0xC3,0xE4,0x12,
6470x0C,0x02,0xE6,0x12,0xF8,0xC3,0xE4,0x12,0x24,0xFD,0xEB,0xF6,0xE8,0xB5,0xFC,0xF8,
6480xC3,0x90,0x83,0x66,0x38,0xFD,0xF8,0xC3,0xAC,0x49,0xA8,0x01,0x74,0x06,0x83,0x4E,
6490x7A,0x20,0xEB,0x04,0x83,0x66,0x7A,0xDF,0xE8,0xCB,0xFB,0xF8,0xC3,0x90,0x8A,0x86,
6500xA5,0x00,0x0C,0x02,0x24,0xFB,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x81,0x4E,0x26,0x01,
6510x20,0xAC,0x49,0x32,0xE4,0x89,0x46,0x6E,0x83,0x4E,0x48,0x08,0x49,0x46,0xF9,0xC3,
6520x8A,0x86,0xA5,0x00,0x0C,0x02,0x24,0xFB,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x81,0x4E,
6530x26,0x01,0x20,0xAC,0xB4,0x0A,0xF6,0xE4,0xEB,0xD8,0xE8,0xFA,0x13,0xE4,0x3C,0x24,
6540xF8,0x0A,0xC4,0xE6,0x3C,0xF8,0xC3,0x90,0xAD,0x49,0x49,0x89,0x46,0x64,0xA9,0x01,
6550x00,0x74,0x1B,0x8B,0xD8,0x83,0xE3,0xFA,0x75,0x1A,0xA9,0x04,0x00,0x74,0x0F,0xE4,
6560x3E,0x0C,0x02,0xE6,0x3E,0xB8,0x38,0x44,0x89,0x46,0x62,0xF8,0xC3,0x90,0xE4,0x3E,
6570x24,0xFC,0xEB,0xEF,0xE4,0x3E,0x24,0xFC,0xE6,0x3E,0xE8,0xE8,0xFC,0xB8,0xAA,0x40,
6580xEB,0xE6,0xE8,0x6E,0xF8,0x72,0x05,0xB0,0x18,0xE6,0x0A,0xF8,0xC3,0x90,0xAC,0x49,
6590xE8,0xCF,0xF9,0xF8,0xC3,0x90,0xAC,0x49,0xE8,0xCF,0xF9,0xF8,0xC3,0x90,0xE8,0x68,
6600xFD,0x75,0x06,0x32,0xC0,0xE6,0xDA,0xF8,0xC3,0xB0,0x02,0xE6,0xDA,0x36,0xA0,0xB4,
6610x13,0x24,0x10,0x34,0x10,0xE8,0x16,0x01,0x36,0xA1,0xB4,0x13,0xA9,0x01,0x00,0x74,
6620x05,0xE8,0xFC,0xFE,0xEB,0x0E,0xA9,0x02,0x00,0x74,0x04,0x32,0xC0,0xEB,0x02,0xB0,
6630x01,0xE8,0xDE,0xFE,0x36,0xA1,0xB4,0x13,0xE8,0xB5,0x13,0xE4,0x3C,0x24,0xF8,0x0A,
6640xC4,0xE6,0x3C,0x36,0xA1,0xB4,0x13,0xC1,0xE8,0x05,0x25,0x01,0x00,0xE8,0xFA,0xFE,
6650x36,0xA0,0xB5,0x13,0x24,0x10,0xE8,0x59,0xFB,0x32,0xC0,0x36,0x8A,0x26,0xB5,0x13,
6660xF6,0xC4,0x04,0x74,0x09,0xFE,0xC0,0xF6,0xC4,0x08,0x74,0x02,0xFE,0xC0,0xE8,0xDB,
6670xFD,0x36,0xA1,0xB6,0x13,0x25,0x0F,0x00,0xE8,0x57,0xF9,0x36,0xA1,0xB6,0x13,0xC1,
6680xE8,0x04,0x25,0x03,0x00,0xE8,0xB8,0xFA,0x36,0xA1,0xB6,0x13,0xC1,0xE8,0x05,0x25,
6690x02,0x00,0xE8,0x05,0xFB,0x36,0xA1,0xB6,0x13,0xF6,0xC4,0x01,0x75,0x04,0x32,0xC0,
6700xEB,0x09,0x80,0xE4,0x02,0xD0,0xEC,0xB0,0x02,0x2A,0xC4,0xE8,0xAC,0xFA,0x36,0xF6,
6710x06,0xB7,0x13,0x40,0x74,0x05,0xE8,0x83,0xFE,0xEB,0x03,0xE8,0x84,0xFE,0x36,0xF6,
6720x06,0xB7,0x13,0x20,0x74,0x05,0xE8,0x65,0xFE,0xEB,0x03,0xE8,0x68,0xFE,0xF8,0xC3,
6730xE4,0x12,0x0C,0x01,0xE6,0x12,0xF8,0xC3,0xE4,0x12,0x24,0xFE,0xEB,0xF6,0xE4,0x14,
6740x24,0xF0,0x0C,0x05,0xE6,0x14,0xE4,0x2A,0x24,0xF0,0x0C,0x06,0xE6,0x2A,0xF8,0xC3,
6750xE4,0x2A,0x24,0xF0,0xE6,0x2A,0xE4,0x14,0x24,0xF0,0x0C,0x07,0xE6,0x14,0xF8,0xC3,
6760xAD,0x49,0x49,0xE8,0x64,0xF9,0x89,0x86,0x8E,0x00,0xF8,0xC3,0xAD,0x49,0x49,0xE8,
6770x58,0xF9,0x89,0x86,0x90,0x00,0xF8,0xC3,0x83,0x4E,0x26,0x04,0xE8,0xA8,0xF7,0xF8,
6780xC3,0x90,0x83,0x66,0x26,0xFB,0xE8,0x9E,0xF7,0xF8,0xC3,0x90,0xAC,0x49,0x84,0xC0,
6790x75,0x0D,0xE4,0x10,0x24,0xEF,0xE6,0x10,0x80,0x8E,0xA1,0x00,0x42,0xF8,0xC3,0xE4,
6800x10,0x0C,0x10,0xEB,0xF1,0x90,0xAC,0x49,0x3C,0x02,0x76,0x02,0x32,0xC0,0xC0,0xE0,
6810x04,0xA8,0x20,0x74,0x02,0x0C,0x08,0x24,0x18,0x8A,0xE0,0xE4,0x12,0x24,0xE7,0x0A,
6820xC4,0xE6,0x12,0x80,0x8E,0xA1,0x00,0x44,0xF8,0xC3,0xAC,0x49,0x88,0x86,0xC0,0x00,
6830xF8,0xC3,0xAC,0x49,0xE6,0x3A,0xF8,0xC3,0xAC,0x49,0x84,0xC0,0x74,0x08,0xE4,0x12,
6840x0C,0x04,0xE6,0x12,0xF8,0xC3,0xE4,0x12,0x24,0xFB,0xEB,0xF6,0xAC,0x49,0xE8,0xD6,
6850xF6,0x73,0x03,0xE8,0x27,0xF7,0xF8,0xC3,0xE4,0x12,0xA8,0x02,0x74,0x04,0x24,0xFD,
6860xE6,0x12,0xB8,0xF0,0x00,0xE8,0x87,0xFA,0x81,0x66,0x26,0xFF,0xF3,0xE8,0x57,0xF7,
6870xE8,0x9A,0xFA,0xF8,0xC3,0x90,0xB8,0x80,0x00,0xE8,0x57,0xFA,0x80,0x4E,0x27,0x08,
6880xE8,0x44,0xF7,0xE8,0x87,0xFA,0xF8,0xC3,0xB8,0x80,0x00,0xE8,0x61,0xFA,0x81,0x66,
6890x26,0xFF,0xF7,0xE8,0x31,0xF7,0xE8,0x74,0xFA,0xF8,0xC3,0x90,0xB8,0x10,0x00,0xE8,
6900x31,0xFA,0x80,0x4E,0x27,0x04,0xE8,0x1E,0xF7,0xE8,0x61,0xFA,0xF8,0xC3,0xB8,0x10,
6910x00,0xE8,0x3B,0xFA,0x81,0x66,0x26,0xFF,0xFB,0xE8,0x0B,0xF7,0xE8,0x4E,0xFA,0xF8,
6920xC3,0x90,0x33,0xC0,0xAC,0x49,0x3C,0x01,0x73,0x04,0xB0,0x01,0xEB,0x06,0x3C,0x0C,
6930x76,0x02,0xB0,0x0C,0x89,0x46,0x1C,0xF8,0xC3,0x90,0x81,0x4E,0x26,0x00,0x20,0x8A,
6940x86,0xA5,0x00,0x0C,0x02,0x24,0xFB,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x83,0x4E,0x26,
6950x01,0xF8,0xC3,0x90,0x81,0x4E,0x26,0x00,0x40,0x8A,0x86,0xA5,0x00,0x0C,0x02,0x88,
6960x86,0xA5,0x00,0xE6,0x0C,0xF8,0xC3,0x90,0xAC,0x49,0x50,0xE8,0x05,0xF6,0x58,0x72,
6970x08,0xE6,0x38,0xB0,0x23,0xE6,0x0A,0xF8,0xC3,0xF9,0xC3,0x90,0xAC,0x50,0xAD,0xE8,
6980x82,0xF8,0x5A,0xF6,0xC2,0x01,0x74,0x12,0x39,0x86,0x96,0x00,0x74,0x0C,0x89,0x86,
6990x96,0x00,0xE6,0xF0,0x86,0xE0,0xE6,0xF8,0x86,0xE0,0xF6,0xC2,0x02,0x74,0x10,0x39,
7000x86,0x94,0x00,0x74,0x0A,0x89,0x86,0x94,0x00,0xE6,0xE4,0x86,0xE0,0xE6,0xEC,0x83,
7010xE9,0x03,0xC3,0x90,0xE4,0x16,0x88,0x86,0xBC,0x00,0xE8,0xE6,0xFA,0x33,0xDB,0xE4,
7020x0C,0xA8,0x06,0x74,0x03,0x80,0xCB,0x01,0xA8,0x10,0x74,0x03,0x80,0xCB,0x02,0xA8,
7030x80,0x74,0x03,0x80,0xCB,0x04,0xE4,0x12,0x8A,0xE0,0x24,0x18,0x0A,0xD8,0xE4,0xDA,
7040xF6,0xC4,0x02,0x74,0x07,0xA8,0x40,0x75,0x03,0x80,0xCB,0x20,0xA8,0x02,0x75,0x09,
7050xE4,0x2A,0xA8,0x0F,0x74,0x03,0x80,0xCB,0x40,0xF7,0x46,0x38,0x02,0x00,0x74,0x09,
7060xE4,0xD8,0xA8,0x01,0x75,0x03,0x80,0xCB,0x80,0x88,0x9E,0xBE,0x00,0xFE,0x86,0xB4,
7070x00,0xB0,0x0A,0xE8,0x5C,0xE4,0xF8,0xC3,0xAC,0x49,0x3C,0x02,0x74,0x41,0x77,0x1F,
7080x50,0xE8,0x4F,0xF5,0x58,0x72,0x0C,0x84,0xC0,0x74,0x0A,0xB0,0x12,0xE6,0x0A,0x80,
7090x4E,0x38,0x01,0xF8,0xC3,0xB0,0x11,0xE6,0x0A,0x80,0x66,0x38,0xFE,0xF8,0xC3,0x8B,
7100x46,0x38,0x25,0xFF,0xF7,0x89,0x46,0x38,0xA9,0x00,0x04,0x75,0xE6,0x8A,0x86,0xA5,
7110x00,0xA8,0x10,0x75,0xDE,0x0C,0x10,0x88,0x86,0xA5,0x00,0xE6,0x0C,0xF8,0xC3,0x81,
7120x4E,0x38,0x00,0x08,0x8A,0x86,0xA5,0x00,0xA8,0x10,0x74,0xC7,0x24,0xEF,0xEB,0xE7,
7130xAD,0x49,0x49,0x3C,0x01,0x72,0x11,0x3C,0x0C,0x77,0x0D,0x50,0x8A,0xE0,0xE4,0x14,
7140x25,0xF0,0x0F,0x0A,0xC4,0xE6,0x14,0x58,0x8A,0xC4,0x84,0xC0,0x74,0x02,0xE6,0x42,
7150xF8,0xC3,0xE8,0xCF,0xF9,0xFE,0x86,0xB9,0x00,0xB0,0x0E,0xE8,0xD4,0xE3,0xF8,0xC3,
7160x3A,0x86,0xAF,0x00,0x74,0x1F,0x88,0x86,0xAF,0x00,0x8A,0xE0,0x80,0xC2,0x06,0xB0,
7170xBF,0xEE,0x80,0xEA,0x02,0x8A,0xC4,0xEE,0x8A,0x86,0xA8,0x00,0x80,0xC2,0x02,0xEE,
7180x80,0xEA,0x06,0x8A,0xC4,0xC3,0x8B,0x46,0x3E,0x85,0xC0,0x8A,0x86,0xA5,0x00,0x74,
7190x12,0xA8,0x08,0x75,0x0D,0x0C,0x08,0x88,0x86,0xA5,0x00,0x80,0xC2,0x02,0xEE,0x80,
7200xEA,0x02,0xC3,0xA8,0x08,0x74,0xFB,0x24,0xF7,0xEB,0xEC,0x8B,0x46,0x26,0x84,0xC0,
7210x74,0x16,0x8A,0x86,0xA5,0x00,0xA8,0x02,0x74,0x0D,0x24,0xFD,0x88,0x86,0xA5,0x00,
7220x83,0xC2,0x02,0xEE,0x83,0xEA,0x02,0xC3,0x8A,0x86,0xA5,0x00,0xA8,0x02,0x75,0xF7,
7230x0C,0x02,0xEB,0xE8,0x52,0x83,0xC2,0x0C,0xEC,0xC0,0xE8,0x04,0x88,0x86,0xA9,0x00,
7240x8B,0x5E,0x26,0x80,0xE3,0x3F,0xF6,0xC7,0x04,0x74,0x07,0xA8,0x08,0x75,0x03,0x80,
7250xCB,0x40,0xF6,0xC7,0x08,0x74,0x07,0xA8,0x02,0x75,0x03,0x80,0xCB,0x80,0x88,0x5E,
7260x26,0x8A,0x86,0xA5,0x00,0x84,0xDB,0x74,0x10,0xA8,0x02,0x74,0x0A,0x24,0xFD,0x88,
7270x86,0xA5,0x00,0x83,0xEA,0x0A,0xEE,0x5A,0xC3,0xA8,0x02,0x75,0xFA,0x0C,0x02,0xEB,
7280xEE,0x90,0xFF,0xFF,0x00,0x48,0x00,0x30,0xBA,0x20,0xC4,0x1A,0x00,0x18,0x00,0x12,
7290x00,0x0C,0x00,0x06,0x00,0x03,0x00,0x02,0x80,0x01,0xC0,0x00,0x60,0x00,0x30,0x00,
7300x18,0x00,0xCD,0x01,0x00,0x01,0x80,0x00,0x10,0x00,0x10,0x00,0x0E,0x00,0x0C,0x00,
7310x08,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x04,0x00,0x03,0x00,0x02,0x00,0x01,0x00,
7320x52,0x51,0x56,0x3C,0x1E,0x77,0x47,0x98,0x8B,0xF0,0x8A,0x82,0xC4,0x00,0x32,0xE4,
7330x83,0xFE,0x18,0x74,0x3D,0x83,0xFE,0x19,0x74,0x3E,0x83,0xFE,0x1E,0x77,0x2F,0xD1,
7340xE6,0x2E,0x8B,0x8C,0x32,0x2D,0x3B,0x8E,0x94,0x00,0x74,0x22,0x89,0x8E,0x94,0x00,
7350x83,0xC2,0x06,0x8A,0x86,0xA8,0x00,0x8A,0xE0,0x0C,0x80,0xEE,0x83,0xEA,0x06,0x8A,
7360xC1,0xEE,0x83,0xC2,0x02,0x8A,0xC5,0xEE,0x83,0xC2,0x04,0x8A,0xC4,0xEE,0x5E,0x59,
7370x5A,0xC3,0x8B,0x8E,0x8E,0x00,0xEB,0xCE,0x8B,0x8E,0x90,0x00,0xEB,0xC8,0x52,0x51,
7380x3D,0x05,0x00,0x77,0x03,0xB8,0x05,0x00,0x8B,0xC8,0xBA,0x02,0x00,0xB8,0x00,0xD0,
7390xF7,0xF1,0x05,0x01,0x00,0xD1,0xE8,0x59,0x5A,0xC3,0x8B,0x46,0x7A,0xA8,0x20,0x74,
7400x0B,0x80,0xBE,0xC3,0x00,0x03,0x75,0x04,0x0C,0x01,0xEB,0x02,0x24,0xFE,0x89,0x46,
7410x7A,0xC3,0x24,0x03,0x88,0x86,0xC3,0x00,0x8A,0xA6,0xA8,0x00,0x8A,0xDC,0x80,0xE4,
7420xFC,0x0A,0xC4,0x3A,0xC3,0x74,0x0B,0x88,0x86,0xA8,0x00,0x83,0xC2,0x06,0xEE,0x83,
7430xEA,0x06,0xE8,0xC5,0xFF,0xC3,0x00,0x08,0x18,0x38,0x28,0x90,0x3C,0x04,0x77,0x23,
7440x32,0xE4,0x8B,0xD8,0x2E,0x8A,0x87,0x26,0x2E,0x8A,0xA6,0xA8,0x00,0x8A,0xDC,0x80,
7450xE4,0xC7,0x0A,0xC4,0x3A,0xC3,0x74,0x0B,0x88,0x86,0xA8,0x00,0x83,0xC2,0x06,0xEE,
7460x83,0xEA,0x06,0xC3,0x84,0xC0,0x74,0x02,0xB0,0x04,0x8A,0xA6,0xA8,0x00,0x8A,0xDC,
7470x80,0xE4,0xFB,0x0A,0xC4,0x3A,0xC3,0x74,0x0B,0x88,0x86,0xA8,0x00,0x83,0xC2,0x06,
7480xEE,0x83,0xEA,0x06,0xC3,0x90,0x8B,0x5E,0x38,0x84,0xC0,0x74,0x34,0x3C,0x02,0x74,
7490x3B,0x8A,0x86,0xAF,0x00,0x0C,0x04,0xE8,0xE6,0xFD,0x8B,0x46,0x2E,0x3B,0x46,0x3C,
7500x77,0x1B,0xF7,0xC3,0x00,0x04,0x75,0x15,0x81,0xCB,0x00,0x04,0x83,0xC2,0x02,0x8A,
7510x86,0xA5,0x00,0x24,0xFA,0x88,0x86,0xA5,0x00,0xEE,0x83,0xEA,0x02,0x89,0x5E,0x38,
7520xC3,0x8A,0x86,0xAF,0x00,0x24,0xFB,0xE8,0xB6,0xFD,0xEB,0xF1,0xF7,0xC3,0x10,0x00,
7530x74,0xEF,0xEB,0xED,0x83,0xC2,0x0C,0xEC,0x83,0xEA,0x0C,0xC0,0xE8,0x04,0x88,0x86,
7540xA9,0x00,0xC3,0x90,0x8A,0x86,0xA7,0x00,0x0C,0x01,0x88,0x86,0xA7,0x00,0x8B,0xDA,
7550x80,0xC2,0x08,0xEE,0x8B,0xD3,0xF8,0xC3,0x8A,0x86,0xA7,0x00,0x24,0xFE,0xEB,0xEA,
7560x8A,0x86,0xA7,0x00,0x0C,0x02,0xEB,0xE2,0x8A,0x86,0xA7,0x00,0x24,0xFD,0xEB,0xDA,
7570xB0,0xFF,0xE8,0x52,0xF2,0xE8,0x97,0xF2,0xF8,0xC3,0xAC,0x49,0xE8,0x61,0xFE,0xF8,
7580xC3,0x90,0xAC,0x49,0xE8,0xEB,0xFE,0xF8,0xC3,0x90,0xAC,0x49,0xE8,0x35,0xFF,0xF8,
7590xC3,0x90,0xAC,0x49,0xE8,0x05,0xFF,0xF8,0xC3,0x90,0x52,0x83,0xC2,0x06,0xB0,0xBF,
7600xEE,0x52,0x83,0xC2,0x02,0xAC,0x49,0xEE,0x5A,0x8A,0x86,0xA8,0x00,0xEE,0x5A,0xF8,
7610xC3,0x90,0x52,0x83,0xC2,0x06,0xB0,0xBF,0xEE,0x52,0x83,0xC2,0x06,0xEB,0xE6,0x90,
7620xAC,0x49,0x3C,0x02,0x77,0x0D,0x84,0xC0,0x75,0x0B,0x8A,0x86,0xAF,0x00,0x24,0xFD,
7630xE8,0x0D,0xFD,0xF8,0xC3,0x50,0x8A,0x86,0xAF,0x00,0x0C,0x02,0xE8,0x01,0xFD,0x5B,
7640x83,0xC2,0x08,0x8A,0x86,0xA7,0x00,0xF6,0xC3,0x01,0x74,0x0C,0x24,0xDF,0x88,0x86,
7650xA7,0x00,0xEE,0x83,0xEA,0x08,0xF8,0xC3,0x0C,0x20,0xEB,0xF2,0xAC,0x49,0xE8,0xE5,
7660xFE,0xF8,0xC3,0x90,0xB8,0x00,0x40,0xE8,0x69,0xF5,0xE8,0xF9,0xFC,0xE8,0x24,0xFF,
7670xB0,0x01,0xE8,0xA5,0xF6,0xF8,0xC3,0x90,0xB8,0x00,0x40,0xE8,0x71,0xF5,0xE8,0xE5,
7680xFC,0xF8,0xC3,0x90,0xB8,0x00,0x10,0xE8,0x49,0xF5,0xE8,0xD9,0xFC,0xE8,0x04,0xFF,
7690xB0,0x08,0xE8,0x85,0xF6,0xF8,0xC3,0x90,0xB8,0x00,0x10,0xE8,0x51,0xF5,0xE8,0xC5,
7700xFC,0xF8,0xC3,0x90,0xB8,0x00,0x80,0xE8,0x29,0xF5,0xE8,0xB9,0xFC,0xE8,0xE4,0xFE,
7710xB0,0x02,0xE8,0x65,0xF6,0xF8,0xC3,0x90,0xB8,0x00,0x80,0xE8,0x31,0xF5,0xE8,0xA5,
7720xFC,0xF8,0xC3,0x90,0xB8,0x00,0x20,0xE8,0x09,0xF5,0xE8,0x99,0xFC,0xE8,0xC4,0xFE,
7730xB0,0x04,0xE8,0x45,0xF6,0xF8,0xC3,0x90,0xB8,0x00,0x20,0xE8,0x11,0xF5,0xE8,0x85,
7740xFC,0xF8,0xC3,0x90,0xAC,0x49,0xE8,0x34,0x0C,0xF8,0xC3,0x90,0xB8,0xFC,0x3B,0x89,
7750x46,0x7C,0xF8,0xC3,0x8A,0x86,0xAF,0x00,0x0C,0x80,0xE8,0x43,0xFC,0xF8,0xC3,0x90,
7760x8A,0x86,0xAF,0x00,0x24,0x7F,0xEB,0xF2,0x8A,0x86,0xAF,0x00,0x0C,0x40,0xE8,0x2F,
7770xFC,0xF8,0xC3,0x90,0x8A,0x86,0xAF,0x00,0x24,0xBF,0xEB,0xF2,0xAC,0x49,0xA8,0x01,
7780x74,0x07,0x83,0x4E,0x7A,0x20,0xEB,0x05,0x90,0x83,0x66,0x7A,0xDF,0xE8,0x8A,0xFD,
7790xF8,0xC3,0x83,0xC2,0x06,0x8A,0x86,0xA8,0x00,0x0C,0x40,0x88,0x86,0xA8,0x00,0xEE,
7800x83,0xEA,0x06,0xAC,0x49,0x32,0xE4,0x89,0x46,0x6E,0x83,0x4E,0x26,0x01,0x83,0x4E,
7810x48,0x08,0xB0,0x06,0xE8,0xBB,0xDF,0x49,0x46,0xF9,0xC3,0x90,0x83,0xC2,0x06,0x8A,
7820x86,0xA8,0x00,0x0C,0x40,0x88,0x86,0xA8,0x00,0xEE,0x83,0xEA,0x06,0xAC,0xB4,0x0A,
7830xF6,0xE4,0xEB,0xD0,0xE8,0xE0,0x0B,0xF8,0xC3,0x90,0xAD,0x49,0x49,0x89,0x46,0x64,
7840xA9,0x01,0x00,0x74,0x19,0x8B,0xD8,0x83,0xE3,0xFA,0x75,0x0A,0xA9,0x04,0x00,0x74,
7850x0D,0xB8,0xE2,0x3F,0xEB,0x0B,0xE8,0xEC,0xF4,0xB8,0xAA,0x40,0xEB,0x03,0xB8,0x38,
7860x44,0x89,0x46,0x62,0xF8,0xC3,0x8A,0x86,0xAF,0x00,0xA8,0x02,0x74,0x0A,0x24,0xFD,
7870xE8,0x8D,0xFB,0x0C,0x02,0xE8,0x88,0xFB,0xF8,0xC3,0xAC,0x49,0xE8,0x81,0xFC,0xF8,
7880xC3,0x90,0xAC,0x49,0xE8,0x79,0xFC,0xF8,0xC3,0x90,0xE8,0x5C,0xF5,0x75,0x05,0xE8,
7890xE6,0xFD,0xF8,0xC3,0xE8,0xCD,0xFD,0x36,0xA0,0xB4,0x13,0x24,0x10,0x34,0x10,0xE8,
7900x26,0x01,0x36,0xA1,0xB4,0x13,0xA9,0x01,0x00,0x74,0x05,0xE8,0xFE,0xFE,0xEB,0x0E,
7910xA9,0x02,0x00,0x74,0x04,0x32,0xC0,0xEB,0x02,0xB0,0x01,0xE8,0xE8,0xFE,0x36,0xA1,
7920xB4,0x13,0xE8,0xAB,0x0B,0x36,0xA1,0xB4,0x13,0xC1,0xE8,0x05,0x25,0x01,0x00,0xE8,
7930x0C,0xFF,0x36,0xA0,0xB5,0x13,0x24,0x10,0xE8,0x2B,0xFD,0x32,0xC0,0x36,0x8A,0x26,
7940xB5,0x13,0xF6,0xC4,0x04,0x74,0x09,0xFE,0xC0,0xF6,0xC4,0x08,0x74,0x02,0xFE,0xC0,
7950xE8,0xEF,0xFD,0x36,0xA1,0xB6,0x13,0x25,0x0F,0x00,0xE8,0x03,0xFC,0x36,0xA1,0xB6,
7960x13,0xC1,0xE8,0x04,0x25,0x03,0x00,0xE8,0x88,0xFC,0x36,0xA1,0xB6,0x13,0xC1,0xE8,
7970x05,0x25,0x02,0x00,0xE8,0xCD,0xFC,0x36,0xA1,0xB6,0x13,0xF6,0xC4,0x01,0x75,0x04,
7980x32,0xC0,0xEB,0x09,0x80,0xE4,0x02,0xD0,0xEC,0xB0,0x02,0x2A,0xC4,0xE8,0x8C,0xFC,
7990x36,0xF6,0x06,0xB7,0x13,0x40,0x74,0x05,0xE8,0x8D,0xFE,0xEB,0x03,0xE8,0x94,0xFE,
8000x36,0xF6,0x06,0xB7,0x13,0x20,0x74,0x05,0xE8,0x69,0xFE,0xEB,0x03,0xE8,0x70,0xFE,
8010xF8,0xC3,0xF8,0xC3,0x8B,0x46,0x38,0xA9,0x04,0x00,0x75,0x23,0x0D,0x04,0x00,0x89,
8020x46,0x38,0x83,0xC2,0x08,0x8B,0x46,0x2E,0x3B,0x46,0x3C,0x73,0x14,0x83,0x4E,0x38,
8030x10,0x8A,0x86,0xA7,0x00,0x24,0xFE,0x88,0x86,0xA7,0x00,0xEE,0x83,0xEA,0x08,0xF8,
8040xC3,0x8A,0x86,0xA7,0x00,0x0C,0x01,0xEB,0xEE,0x90,0x8B,0x46,0x38,0xA9,0x04,0x00,
8050x74,0x06,0x25,0xFB,0xFF,0x89,0x46,0x38,0xF8,0xC3,0xAD,0x49,0x49,0xE8,0xBE,0xFB,
8060x89,0x86,0x8E,0x00,0xF8,0xC3,0xAD,0x49,0x49,0xE8,0xB2,0xFB,0x89,0x86,0x90,0x00,
8070xF8,0xC3,0x83,0x4E,0x26,0x04,0xE8,0x92,0xFA,0xF8,0xC3,0x90,0x83,0x66,0x26,0xFB,
8080xE8,0x88,0xFA,0xF8,0xC3,0x90,0xAC,0x49,0x84,0xC0,0x75,0x07,0x80,0x8E,0xA3,0x00,
8090x04,0xF8,0xC3,0x80,0xA6,0xA3,0x00,0xFB,0xF8,0xC3,0xAC,0x49,0x83,0xC2,0x08,0x3C,
8100x02,0x76,0x02,0x32,0xC0,0x3C,0x01,0x74,0x12,0x77,0x0B,0x8A,0x86,0xA7,0x00,0x24,
8110xEF,0x88,0x86,0xA7,0x00,0xEE,0x83,0xEA,0x08,0xF8,0xC3,0x8A,0x86,0xA7,0x00,0x0C,
8120x10,0xEB,0xEE,0x90,0x52,0x83,0xC2,0x06,0xB0,0xBF,0xEE,0x52,0x83,0xC2,0x04,0xAC,
8130x49,0xEE,0x5A,0x8A,0x86,0xA8,0x00,0xEE,0x5A,0xF8,0xC3,0x90,0x52,0x83,0xC2,0x06,
8140xB0,0xBF,0xEE,0x52,0x83,0xC2,0x08,0xEB,0xE6,0x90,0xAC,0x49,0xF8,0xC3,0xAC,0x49,
8150xE8,0xB4,0xEE,0x73,0x03,0xE8,0xF7,0xEE,0xF8,0xC3,0x8A,0x86,0xAF,0x00,0x24,0x7F,
8160xE8,0xBD,0xF9,0xB8,0xF0,0x00,0xE8,0x66,0xF2,0x81,0x66,0x26,0xFF,0xF3,0xE8,0x23,
8170xFA,0xE8,0xD2,0xF9,0xF8,0xC3,0xB8,0x80,0x00,0xE8,0x37,0xF2,0x80,0x4E,0x27,0x08,
8180xE8,0x11,0xFA,0xE8,0xC0,0xF9,0xF8,0xC3,0xB8,0x80,0x00,0xE8,0x41,0xF2,0x81,0x66,
8190x26,0xFF,0xF7,0xE8,0xFE,0xF9,0xE8,0xAD,0xF9,0xF8,0xC3,0x90,0xB8,0x10,0x00,0xE8,
8200x11,0xF2,0x80,0x4E,0x27,0x04,0xE8,0xEB,0xF9,0xE8,0x9A,0xF9,0xF8,0xC3,0xB8,0x10,
8210x00,0xE8,0xFF,0xF1,0x81,0x66,0x26,0xFF,0xFB,0xE8,0xD8,0xF9,0xF8,0xC3,0xAC,0x49,
8220xF8,0xC3,0x83,0xC2,0x06,0x8A,0x86,0xA8,0x00,0x0C,0x40,0x88,0x86,0xA8,0x00,0xEE,
8230x83,0xEA,0x06,0xF8,0xC3,0x90,0x83,0xC2,0x06,0x8A,0x86,0xA8,0x00,0x24,0xBF,0xEB,
8240xEA,0x90,0xAC,0x49,0x8A,0xE0,0x80,0xC2,0x0A,0xEC,0x80,0xEA,0x0A,0xA8,0x20,0x74,
8250x05,0x8A,0xC4,0xEE,0xF8,0xC3,0x06,0x51,0x57,0x8B,0x4E,0x24,0xE3,0x34,0x49,0x89,
8260x4E,0x24,0xFF,0x46,0x1A,0x8E,0x46,0x02,0x8B,0x7E,0x22,0x8A,0xC4,0xAA,0x89,0x7E,
8270x22,0x8B,0x46,0x26,0x24,0xFD,0x89,0x46,0x26,0x75,0x29,0x8A,0x86,0xA5,0x00,0xA8,
8280x02,0x75,0x21,0x80,0xC2,0x02,0x0C,0x02,0x88,0x86,0xA5,0x00,0xEE,0x80,0xEA,0x02,
8290xEB,0x12,0xC4,0x7E,0x00,0x3B,0x7E,0x1E,0x76,0x0A,0x4F,0x26,0x88,0x25,0x89,0x7E,
8300x00,0xFF,0x46,0x1A,0x5F,0x59,0x07,0xF8,0xC3,0x90,0xAC,0xAD,0x83,0xE9,0x03,0x85,
8310xC0,0x74,0x05,0x3D,0x00,0x20,0x72,0x05,0xB8,0xFF,0xFF,0xEB,0x03,0xC1,0xE0,0x03,
8320x3B,0x86,0x94,0x00,0x74,0x26,0x89,0x86,0x94,0x00,0x8B,0xD8,0x52,0x83,0xC2,0x06,
8330x8A,0x86,0xA8,0x00,0x8A,0xE0,0x0C,0x80,0xEE,0x83,0xEA,0x06,0x8A,0xC3,0xEE,0x83,
8340xC2,0x02,0x8A,0xC7,0xEE,0x83,0xC2,0x04,0x8A,0xC4,0xEE,0x5A,0xF8,0xC3,0xB0,0x88,
8350x88,0x86,0xBC,0x00,0xE8,0x8C,0xF2,0x33,0xDB,0x8A,0x86,0xA5,0x00,0xA8,0x02,0x74,
8360x03,0x80,0xCB,0x01,0xA8,0x05,0x74,0x03,0x80,0xCB,0x02,0xA8,0x08,0x74,0x03,0x80,
8370xCB,0x04,0xF6,0x86,0xA7,0x00,0x10,0x74,0x03,0x80,0xCB,0x10,0x8A,0x86,0xA9,0x00,
8380xF6,0xC3,0x04,0x75,0x0A,0x83,0xC2,0x0C,0xEC,0x83,0xEA,0x0C,0xC0,0xE8,0x04,0x8A,
8390xE0,0x8A,0x86,0xAF,0x00,0xA8,0x80,0x74,0x08,0xF6,0xC4,0x01,0x75,0x03,0x80,0xCB,
8400x20,0xF6,0x86,0xA7,0x00,0x02,0x75,0x0A,0xF7,0x46,0x38,0x04,0x00,0x74,0x03,0x80,
8410xCB,0x40,0x88,0x9E,0xBE,0x00,0xFE,0x86,0xB4,0x00,0xB0,0x0A,0xE8,0xF3,0xDB,0xF8,
8420xC3,0xFE,0x86,0xB4,0x00,0xB0,0x0A,0xE8,0xE8,0xDB,0xF8,0xC3,0xAC,0x49,0x3C,0x02,
8430x74,0x37,0x77,0x10,0x84,0xC0,0x74,0x06,0x80,0x4E,0x38,0x01,0xF8,0xC3,0x80,0x66,
8440x38,0xFE,0xF8,0xC3,0x8B,0x46,0x38,0x25,0xFF,0xF7,0x89,0x46,0x38,0xA9,0x00,0x04,
8450x75,0xEA,0x8A,0x86,0xA5,0x00,0xA8,0x01,0x75,0xE2,0x0C,0x05,0x83,0xC2,0x02,0x88,
8460x86,0xA5,0x00,0xEE,0x83,0xEA,0x02,0xF8,0xC3,0x81,0x4E,0x38,0x00,0x08,0x8A,0x86,
8470xA5,0x00,0xA8,0x01,0x74,0xC6,0x24,0xFA,0xEB,0xE2,0xAD,0x49,0x49,0xF8,0xC3,0x90,
8480xE8,0x11,0xFA,0xFE,0x86,0xB9,0x00,0xB0,0x0E,0xE8,0x86,0xDB,0xF8,0xC3,0xB0,0xFF,
8490xE8,0xBF,0xEC,0xF8,0xC3,0x90,0x83,0x66,0x7A,0xFB,0xB0,0x00,0xE8,0x73,0xDB,0xF8,
8500xC3,0x90,0xAC,0x49,0xE8,0x53,0xD9,0x72,0x11,0x36,0x88,0x1E,0x1A,0x01,0x36,0xA0,
8510x8E,0x12,0x0A,0xC3,0x52,0xBA,0x00,0x01,0xEE,0x5A,0xF8,0xC3,0xAC,0x49,0x32,0xE4,
8520x36,0xA3,0x86,0x12,0x05,0x06,0x00,0x36,0x8B,0x1E,0x88,0x12,0x2B,0xD8,0x36,0x89,
8530x1E,0x8A,0x12,0xF8,0xC3,0x90,0xAD,0x8B,0xD8,0xAD,0x83,0xE9,0x04,0x03,0xC3,0x2B,
8540x46,0x76,0x89,0x46,0x78,0xF7,0x46,0x7A,0x02,0x00,0x74,0x0A,0x83,0x66,0x7A,0xFD,
8550xB8,0x00,0x00,0xE8,0x1C,0xDB,0xF8,0xC3,0x06,0x16,0x07,0xAC,0x49,0x25,0x0F,0x00,
8560x6B,0xC0,0x09,0x8D,0xBE,0xFD,0x00,0x03,0xF8,0xAC,0x49,0x25,0x0F,0x00,0xAA,0x85,
8570xC0,0x74,0x08,0x2B,0xC8,0x51,0x8B,0xC8,0xF3,0xA4,0x59,0xE8,0x27,0xF0,0xE8,0x44,
8580x03,0x07,0xF8,0xC3,0x33,0xC0,0xAC,0x49,0x36,0xA3,0xB2,0x13,0x36,0xA3,0xB0,0x13,
8590xF8,0xC3,0x83,0x66,0x7A,0xEF,0xE8,0x2C,0x03,0xF8,0xC3,0x90,0x83,0x4E,0x7A,0x10,
8600xEB,0xF4,0xE8,0x9B,0xF0,0xF8,0xC3,0x90,0xAD,0x3C,0x19,0x77,0x0E,0x3C,0x19,0x77,
8610x0A,0x8B,0xF8,0x81,0xE7,0xFF,0x00,0x88,0xA6,0xC4,0x00,0xF8,0xC3,0x90,0x83,0x4E,
8620x26,0x20,0xAC,0x49,0x32,0xE4,0xD1,0xE0,0x8B,0xD8,0xC1,0xE3,0x02,0x03,0xC3,0x89,
8630x46,0x6E,0x83,0x4E,0x48,0x04,0xB0,0x06,0xE8,0x97,0xDA,0x49,0x46,0xF9,0xC3,0x90,
8640xFE,0x86,0xB3,0x00,0xB0,0x0A,0xE8,0x89,0xDA,0xF8,0xC3,0x90,0x33,0xC0,0xAC,0x49,
8650x6B,0xC0,0x0A,0x89,0x86,0x8A,0x00,0xF8,0xC3,0x90,0xAC,0x49,0x32,0xE4,0x3D,0x0A,
8660x00,0x77,0x05,0xB8,0x0A,0x00,0xEB,0x08,0x3D,0x5A,0x00,0x72,0x03,0xB8,0x5A,0x00,
8670x51,0xF7,0xD8,0x05,0x64,0x00,0x8B,0xC8,0x8B,0x46,0x44,0xF7,0xE1,0xB9,0x64,0x00,
8680xF7,0xF1,0x89,0x46,0x46,0x59,0xF8,0xC3,0xAC,0x49,0xE8,0x85,0xEB,0xF8,0xC3,0x90,
8690xAC,0x49,0x84,0xC0,0x75,0x07,0x81,0x66,0x38,0xFF,0xFD,0xF8,0xC3,0x81,0x4E,0x38,
8700x00,0x02,0xF7,0x46,0x38,0x40,0x00,0x75,0x08,0x8A,0x86,0xA9,0x00,0x88,0x86,0xAA,
8710x00,0xF8,0xC3,0x90,0x51,0x56,0xE8,0x7F,0x0C,0x5E,0x59,0xF8,0xC3,0x90,0xFE,0x86,
8720xB6,0x00,0xB0,0x0A,0xE8,0x0B,0xDA,0xF8,0xC3,0x90,0xFE,0x86,0xB7,0x00,0xB0,0x0A,
8730xE8,0xFF,0xD9,0xF8,0xC3,0x90,0xFE,0x86,0xB8,0x00,0xB0,0x0A,0xE8,0xF3,0xD9,0xF8,
8740xC3,0x90,0x00,0x90,0x51,0x55,0xAC,0x2E,0xA2,0x52,0x36,0x33,0xC9,0xAD,0x8B,0xF9,
8750xC1,0xE7,0x05,0xA9,0x01,0x00,0x74,0x23,0x2E,0x8B,0xAD,0x44,0x00,0x83,0x7E,0x08,
8760x00,0x74,0x18,0x2E,0x80,0x3E,0x52,0x36,0x01,0x74,0x09,0x60,0xB0,0x04,0xE8,0xBB,
8770x0C,0x61,0xEB,0x07,0x60,0xB0,0xFB,0xE8,0xEC,0x0C,0x61,0x47,0x47,0xD1,0xE8,0x75,
8780xD2,0x41,0x83,0xF9,0x04,0x72,0xC6,0x5D,0x59,0x83,0xE9,0x05,0xF7,0x46,0x38,0x40,
8790x00,0x74,0x05,0xE8,0x87,0xEA,0xF8,0xC3,0xE8,0x8D,0xEA,0xF8,0xC3,0x90,0x36,0xC6,
8800x06,0xC8,0x13,0x01,0xF8,0xC3,0x33,0xC0,0xAC,0x49,0x36,0xA3,0x80,0x12,0xAC,0x49,
8810x36,0x2B,0x06,0x88,0x12,0xF7,0xD8,0x36,0xA3,0x82,0x12,0xF8,0xC3,0x90,0xDE,0x26,
8820xDE,0x26,0xEC,0x26,0xF2,0x26,0xF8,0x26,0xFE,0x26,0x04,0x27,0x0E,0x27,0x16,0x27,
8830x1E,0x27,0x26,0x27,0x2E,0x27,0x34,0x27,0xBE,0x34,0xC6,0x34,0xD2,0x34,0x3A,0x27,
8840x78,0x27,0x80,0x27,0x94,0x27,0xA0,0x27,0xB4,0x27,0xC0,0x27,0xD4,0x27,0xE0,0x27,
8850xF4,0x27,0x00,0x28,0x10,0x28,0xEC,0x34,0xDE,0x26,0x1E,0x28,0x26,0x28,0x2C,0x28,
8860x32,0x28,0x38,0x28,0x4E,0x28,0x8A,0x28,0x06,0x35,0x28,0x35,0x98,0x28,0xBE,0x28,
8870xD2,0x28,0xDE,0x28,0xE6,0x28,0x54,0x35,0x62,0x35,0x6C,0x35,0xEE,0x28,0xC0,0x29,
8880xC8,0x29,0xCE,0x29,0xE0,0x29,0x72,0x35,0x78,0x35,0xF0,0x29,0xFC,0x29,0x8E,0x35,
8890x08,0x2A,0x12,0x2A,0x1C,0x2A,0xB0,0x35,0x36,0x2A,0xBC,0x35,0x5A,0x2A,0x62,0x2A,
8900x68,0x2A,0xCA,0x35,0x7C,0x2A,0xF8,0x35,0x88,0x2A,0xA6,0x2A,0xB8,0x2A,0xCC,0x2A,
8910xDE,0x2A,0xF2,0x2A,0x00,0x36,0x0A,0x2B,0x24,0x2B,0x24,0x36,0x38,0x2B,0x4C,0x2B,
8920x84,0x2B,0x2E,0x36,0x3A,0x36,0x46,0x36,0x54,0x36,0xE8,0x2B,0xAE,0x36,0x40,0x2C,
8930x62,0x2C,0xB6,0x36,0x70,0x28,0xDE,0x26,0xDE,0x26,0xD4,0x2E,0xE8,0x2E,0xF0,0x2E,
8940xF8,0x2E,0x00,0x2F,0x0A,0x2F,0x12,0x2F,0x1A,0x2F,0x22,0x2F,0x2A,0x2F,0x42,0x2F,
8950xBE,0x34,0xC6,0x34,0xD2,0x34,0x50,0x2F,0x8C,0x2F,0x94,0x2F,0xA8,0x2F,0xB4,0x2F,
8960xC8,0x2F,0xD4,0x2F,0xE8,0x2F,0xF4,0x2F,0x08,0x30,0x14,0x30,0x1C,0x30,0xEC,0x34,
8970xDE,0x26,0x24,0x30,0x30,0x30,0x38,0x30,0x44,0x30,0x4C,0x30,0x62,0x30,0xA4,0x30,
8980x06,0x35,0x28,0x35,0xAA,0x30,0xCE,0x30,0xD6,0x30,0xEA,0x30,0xF2,0x30,0x54,0x35,
8990x62,0x35,0x6C,0x35,0xFA,0x30,0xC2,0x31,0xC2,0x31,0xC4,0x31,0xFA,0x31,0x72,0x35,
9000x78,0x35,0x0A,0x32,0x16,0x32,0x8E,0x35,0x22,0x32,0x2C,0x32,0x36,0x32,0xB0,0x35,
9010x4A,0x32,0xBC,0x35,0x74,0x32,0x8C,0x32,0x9A,0x32,0xCA,0x35,0x9E,0x32,0xF8,0x35,
9020xAA,0x32,0xC6,0x32,0xD8,0x32,0xEC,0x32,0xFE,0x32,0x0E,0x33,0x00,0x36,0x12,0x33,
9030x26,0x33,0x24,0x36,0x32,0x33,0x9A,0x33,0xDE,0x33,0x2E,0x36,0x3A,0x36,0x46,0x36,
9040x54,0x36,0x5C,0x34,0xAE,0x36,0xAA,0x34,0xB0,0x34,0xB6,0x36,0x8C,0x30,0xE3,0x28,
9050xF7,0x46,0x38,0x40,0x00,0x75,0x32,0xE8,0xE3,0xE8,0x33,0xC0,0xAC,0x49,0x3D,0x5B,
9060x00,0x77,0x19,0x8B,0xD8,0xD1,0xE3,0x2E,0xFF,0x97,0xCE,0x36,0x72,0x0B,0x85,0xC9,
9070x75,0xE8,0x8B,0x46,0x48,0xE8,0x1A,0x0C,0xC3,0x4E,0x41,0xC3,0x6A,0x00,0x1F,0xC6,
9080x06,0x93,0x12,0x0C,0x9C,0x0E,0xE8,0x63,0xDA,0xE8,0xBC,0xE8,0x33,0xC0,0xAC,0x49,
9090x3D,0x5B,0x00,0x77,0xE7,0x8B,0xD8,0xD1,0xE3,0x2E,0xFF,0x97,0x86,0x37,0x72,0xD9,
9100x85,0xC9,0x75,0xE8,0xC3,0xF7,0x46,0x7A,0x10,0x00,0x75,0x0F,0x83,0xBE,0x84,0x00,
9110x00,0x74,0x08,0xB8,0x48,0x3A,0x89,0x86,0x80,0x00,0xC3,0x81,0xBE,0x80,0x00,0xEC,
9120x3C,0x74,0xF7,0x83,0xBE,0x88,0x00,0x00,0x75,0x05,0xB8,0xEC,0x3C,0xEB,0xE7,0xF7,
9130x46,0x7A,0x08,0x00,0x75,0x40,0x1E,0x60,0x8B,0x8E,0x88,0x00,0x3B,0x4E,0x74,0x77,
9140x33,0x3B,0x4E,0x78,0x77,0x2E,0xC4,0x7E,0x10,0x8B,0xDF,0x26,0x03,0x3D,0x47,0x47,
9150x33,0xC0,0x8E,0xD8,0x8D,0xB6,0xF4,0x00,0x8B,0xC1,0xF7,0x46,0x7A,0x01,0x00,0x75,
9160x1D,0xF3,0xA4,0x26,0x01,0x07,0x29,0x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0xB0,
9170x0C,0xE8,0x3E,0xD7,0x61,0x1F,0xC7,0x86,0x88,0x00,0x00,0x00,0xEB,0xAC,0xE3,0xE3,
9180x50,0x90,0xAC,0x24,0x7F,0xAA,0xE2,0xFA,0x58,0xEB,0xD8,0x90,0x8B,0x8E,0x88,0x00,
9190xE3,0x46,0x8B,0x9E,0x8A,0x00,0x85,0xDB,0x74,0x3E,0xBA,0x50,0xFF,0xED,0x2B,0x86,
9200x82,0x00,0x3B,0xC3,0x72,0x37,0x8D,0xB6,0xF4,0x00,0xC4,0x7E,0x10,0x8B,0xDF,0x26,
9210x03,0x3D,0x47,0x47,0x8B,0xC1,0x16,0x1F,0xF7,0x46,0x7A,0x01,0x00,0x75,0x24,0xF3,
9220xA4,0x26,0x01,0x07,0x29,0x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0xC7,0x86,0x88,
9230x00,0x00,0x00,0xB0,0x0C,0xE8,0xDA,0xD6,0x83,0x66,0x7A,0xF7,0xC3,0xB0,0x00,0xE8,
9240xD0,0xD6,0xC3,0xE3,0xDC,0x50,0xAC,0x24,0x7F,0xAA,0xE2,0xFA,0x58,0xEB,0xD2,0x90,
9250x1E,0x60,0x33,0xC0,0x8E,0xD8,0x8D,0xB6,0xFD,0x00,0x8B,0x86,0x88,0x00,0x8B,0x96,
9260x84,0x00,0x3A,0x04,0x75,0x10,0x8B,0xDE,0x46,0x8B,0xC8,0x8D,0xBE,0xF4,0x00,0xF3,
9270xA6,0x74,0x66,0x8B,0xF3,0x90,0x83,0xC6,0x09,0x4A,0x75,0xE6,0x8D,0xB6,0xFD,0x00,
9280x8B,0x96,0x84,0x00,0x3A,0x04,0x73,0x10,0x8B,0xDE,0x46,0x8B,0xC8,0x8D,0xBE,0xF4,
9290x00,0xF3,0xA6,0x74,0x76,0x8B,0xF3,0x90,0x83,0xC6,0x09,0x4A,0x75,0xE6,0x8D,0xB6,
9300xF4,0x00,0xAC,0xF7,0x46,0x7A,0x01,0x00,0x74,0x02,0x24,0x7F,0x1E,0xC5,0x5E,0x10,
9310x8B,0x37,0x88,0x40,0x02,0x46,0x89,0x37,0xFF,0x4E,0x78,0xFF,0x46,0x76,0xFF,0x4E,
9320x74,0x1F,0x8B,0x8E,0x88,0x00,0x49,0x89,0x8E,0x88,0x00,0xE3,0x43,0x8D,0xB6,0xF4,
9330x00,0x8B,0xFE,0x46,0xF3,0xA4,0xE9,0x7D,0xFF,0xC5,0x76,0x10,0x8B,0x1C,0x85,0xDB,
9340x74,0x08,0x03,0xF3,0x83,0xC6,0x03,0x83,0xE6,0xFE,0x8B,0x86,0x84,0x00,0x2B,0xC2,
9350xB4,0x80,0x89,0x04,0x46,0x46,0xC7,0x04,0x00,0x00,0x89,0x76,0x10,0x83,0x4E,0x7A,
9360x04,0xC7,0x86,0x88,0x00,0x00,0x00,0x61,0x1F,0xF9,0xC3,0x33,0xC0,0x61,0x1F,0xC3,
9370xB0,0x80,0x84,0xC0,0x61,0x1F,0xC3,0x90,0x8B,0x4E,0x78,0x2B,0x8E,0x88,0x00,0x76,
9380x27,0x89,0xB6,0x8C,0x00,0x8B,0x5E,0x74,0x3B,0xCB,0x72,0x02,0x8B,0xCB,0x3B,0xC8,
9390x72,0x02,0x8B,0xC8,0x8B,0xC1,0xE3,0x44,0x33,0xD2,0x8E,0xC2,0x8B,0xD1,0x83,0xBE,
9400x88,0x00,0x00,0x74,0x06,0xE9,0x8E,0x00,0x33,0xC0,0xC3,0x8B,0x5E,0x10,0x03,0x1F,
9410x43,0x43,0x52,0xF7,0x46,0x7A,0x01,0x00,0x75,0x2A,0xAC,0x8D,0xBE,0xE4,0x00,0x8B,
9420x8E,0x86,0x00,0xF2,0xAE,0x74,0x34,0x88,0x07,0x43,0x4A,0x75,0xED,0x58,0x8B,0x5E,
9430x10,0x01,0x07,0x29,0x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0x8B,0xC6,0x2B,0x86,
9440x8C,0x00,0xC3,0x90,0xAC,0x8D,0xBE,0xE4,0x00,0x8B,0x8E,0x86,0x00,0xF2,0xAE,0x74,
9450x0A,0x24,0x7F,0x88,0x07,0x43,0x4A,0x75,0xEB,0xEB,0xD2,0x88,0x86,0xF4,0x00,0xC7,
9460x86,0x88,0x00,0x01,0x00,0x58,0x2B,0xC2,0x74,0x0E,0x8B,0x5E,0x10,0x01,0x07,0x29,
9470x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0x40,0xE8,0x94,0xFE,0x72,0xBE,0x4A,0x75,
9480x15,0x83,0xBE,0x8A,0x00,0x00,0x74,0xB4,0xBA,0x50,0xFF,0xED,0x89,0x86,0x82,0x00,
9490x83,0x4E,0x7A,0x08,0xEB,0xA6,0x8D,0xBE,0xF4,0x00,0x03,0xBE,0x88,0x00,0xA4,0xFF,
9500x86,0x88,0x00,0xE8,0x6A,0xFE,0x72,0x94,0x79,0x06,0x4A,0x74,0x8F,0xE9,0x5B,0xFF,
9510x4A,0x74,0xCE,0xEB,0xE1,0x90,0x50,0xE8,0x11,0xCC,0x8B,0x46,0x74,0x39,0x46,0x72,
9520x74,0x27,0x1E,0x56,0x51,0x33,0xC9,0xC5,0x76,0x0C,0xAD,0x74,0x10,0x78,0x09,0x03,
9530xC8,0x05,0x01,0x00,0x24,0xFE,0x03,0xF0,0x3B,0x76,0x10,0x76,0xED,0x29,0x4E,0x76,
9540x01,0x4E,0x78,0xE8,0x37,0xCC,0x59,0x5E,0x1F,0x58,0xC3,0x90,0xC4,0x7E,0x10,0x26,
9550x8B,0x1D,0x83,0xC3,0x03,0x26,0x89,0x1D,0x4B,0x03,0xFB,0xAB,0x91,0xAA,0xB8,0x03,
9560x00,0x29,0x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0xC3,0x90,0xC4,0x7E,0x10,0x26,
9570x8B,0x1D,0x43,0x26,0x89,0x1D,0x43,0x03,0xFB,0xAA,0xFF,0x4E,0x78,0xFF,0x46,0x76,
9580xFF,0x4E,0x74,0xC3,0xE8,0xE5,0xFF,0xC3,0x80,0x81,0x84,0x85,0x82,0x83,0x86,0x87,
9590x50,0x53,0x8A,0xDC,0x83,0xE3,0x0E,0xD1,0xEB,0x2E,0x8A,0x87,0x98,0x3B,0x08,0x86,
9600xB0,0x00,0xFE,0x86,0xB1,0x00,0xB0,0x0A,0xE8,0x87,0xD4,0x5B,0x58,0xC3,0x50,0x8A,
9610xC8,0xB8,0xFF,0x00,0xE8,0x95,0xFF,0x58,0xC3,0x90,0x8A,0x86,0xBB,0x00,0xE8,0xAB,
9620xFF,0xC3,0xE8,0xCB,0xFF,0xE8,0xF2,0xFF,0xC3,0x90,0xE8,0xC3,0xFF,0xE8,0xB4,0xFF,
9630xC3,0x90,0x33,0xC0,0xE8,0x95,0xFF,0xC3,0xB8,0xFF,0x00,0x33,0xC9,0xE8,0x6C,0xFF,
9640xC3,0x90,0xB8,0xFF,0x01,0xB1,0x10,0xE8,0x62,0xFF,0xC3,0x90,0xC3,0xFC,0x3B,0xE2,
9650x3B,0xF2,0x3B,0xF2,0x3B,0xFC,0x3B,0xE2,0x3B,0xE8,0x3B,0xE8,0x3B,0xFC,0x3B,0xE2,
9660x3B,0xE8,0x3B,0xE8,0x3B,0xFC,0x3B,0xE2,0x3B,0xE2,0x3B,0xE2,0x3B,0x00,0x10,0x00,
9670x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,
9680x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x08,0x00,
9690x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x08,0x00,0x00,0x51,0x53,0x8B,
9700x4E,0x38,0x81,0xE1,0xFF,0xEE,0xA8,0x04,0x74,0x04,0x81,0xC9,0x00,0x01,0x8A,0xE0,
9710x80,0xE4,0x03,0x24,0x18,0xD0,0xE4,0x0A,0xC4,0x33,0xDB,0x8A,0xD8,0x2E,0x8B,0x87,
9720xFD,0x3B,0x89,0x46,0x7C,0x2E,0x0B,0x8F,0x1D,0x3C,0x89,0x4E,0x38,0xD1,0xEB,0x2E,
9730x8A,0xA7,0x3D,0x3C,0x5B,0x59,0xC3,0xAC,0x49,0x3C,0x01,0x72,0x1D,0x74,0x20,0x3C,
9740x03,0x72,0x23,0x74,0x28,0x3C,0x08,0x72,0x2B,0x74,0x30,0x3C,0x20,0x72,0x37,0x74,
9750x3A,0xBB,0xDA,0x3B,0x32,0xE4,0x89,0x5E,0x7E,0xC3,0xBB,0xA0,0x3B,0xEB,0xF5,0xBB,
9760x94,0x3B,0xB4,0x01,0xEB,0xF0,0xBB,0xFC,0x3B,0xB4,0x02,0xEB,0xE9,0xBB,0xE2,0x3B,
9770xB4,0x03,0xEB,0xE2,0xBB,0xBE,0x3B,0xB4,0x04,0xEB,0xDB,0xBB,0xCA,0x3B,0xAC,0x49,
9780x88,0x86,0xBB,0x00,0xEB,0xCE,0xBB,0xD2,0x3B,0xEB,0xF3,0xBB,0xFC,0x3B,0xEB,0xC4,
9790xA9,0x04,0x00,0x75,0xD1,0xA9,0x08,0x00,0x75,0xDA,0xEB,0xD1,0x8B,0x5E,0x74,0x8B,
9800x4E,0x78,0x3B,0xCB,0x72,0x02,0x8B,0xCB,0x3B,0xC8,0x72,0x02,0x8B,0xC8,0x8B,0xC1,
9810xE3,0x2C,0xC4,0x7E,0x10,0x8B,0xDF,0x26,0x03,0x3D,0x47,0x47,0xF7,0x46,0x7A,0x01,
9820x00,0x75,0x1C,0xF7,0xC7,0x01,0x00,0x74,0x02,0x49,0xA4,0xD1,0xE9,0xF3,0xA5,0x73,
9830x01,0xA4,0x26,0x01,0x07,0x29,0x46,0x78,0x01,0x46,0x76,0x29,0x46,0x74,0xC3,0x50,
9840x53,0xBB,0x7F,0x7F,0xF7,0xC7,0x01,0x00,0x74,0x05,0x49,0xAC,0x22,0xC3,0xAA,0xD1,
9850xE9,0xE3,0x1D,0x9C,0xAD,0x23,0xC3,0xAB,0x49,0x74,0x14,0xAD,0x23,0xC3,0xAB,0x49,
9860x74,0x0D,0xAD,0x23,0xC3,0xAB,0x49,0x74,0x06,0xAD,0x23,0xC3,0xAB,0xE2,0xE5,0x9D,
9870x73,0x04,0xAC,0x22,0xC3,0xAB,0x5B,0x58,0xEB,0xB8,0xE8,0xCE,0xC9,0x8B,0x5E,0x38,
9880xF7,0xC3,0x10,0x04,0x75,0x01,0xC3,0xF7,0xC3,0x40,0x00,0x74,0x05,0xE8,0xB8,0xE3,
9890xEB,0x03,0xE8,0xA8,0xE3,0x81,0x66,0x38,0xEF,0xFB,0xF6,0xC3,0x10,0x74,0x3C,0xF6,
9900xC3,0x02,0x74,0x06,0xE4,0xD8,0x0C,0x01,0xE6,0xD8,0xF6,0xC3,0x04,0x74,0x11,0x83,
9910xC2,0x08,0x8A,0x86,0xA7,0x00,0x0C,0x01,0xEE,0x88,0x86,0xA7,0x00,0x83,0xEA,0x08,
9920xF6,0xC3,0x08,0x74,0x0F,0xE8,0x8B,0xE3,0x72,0x0A,0x8A,0x86,0xC0,0x00,0xE6,0x38,
9930xB0,0x23,0xE6,0x0A,0xF7,0xC3,0x00,0x04,0x75,0x01,0xC3,0xF7,0xC3,0x00,0x08,0x75,
9940xF9,0x8A,0x86,0xA5,0x00,0xF6,0xC3,0x40,0x75,0x0D,0xA8,0x10,0x75,0xEC,0x0C,0x10,
9950x88,0x86,0xA5,0x00,0xE6,0x0C,0xC3,0xA8,0x01,0x75,0xDF,0x83,0xC2,0x02,0x0C,0x05,
9960xEE,0x88,0x86,0xA5,0x00,0xC3,0xB0,0x00,0xE8,0x47,0xD2,0xEB,0x0F,0xB0,0x02,0xE8,
9970x90,0x0E,0xEB,0x08,0x83,0x66,0x38,0xDF,0x83,0x4E,0x7A,0x02,0x33,0xC0,0x8E,0xD8,
9980xFA,0xA0,0x92,0x12,0x40,0xA2,0x92,0x12,0x3C,0x05,0x72,0x1E,0xC6,0x06,0x92,0x12,
9990x00,0xFB,0xB0,0x01,0xE8,0x6B,0x0E,0xFA,0xA1,0x26,0x01,0x23,0x06,0x2A,0x01,0xA8,
10000x01,0x75,0x07,0xE8,0xE2,0x07,0xE8,0x61,0x09,0x90,0xB0,0x00,0xE8,0x37,0xD2,0xFB,
10010x85,0xED,0x74,0xB9,0xFA,0xF7,0x46,0x7A,0x46,0x00,0x75,0xC0,0x8B,0x46,0x78,0x3D,
10020x0A,0x00,0x72,0xB0,0x8B,0x4E,0x74,0x83,0xF9,0x50,0x72,0x9A,0x83,0x66,0x38,0xDF,
10030xC5,0x76,0x14,0x8B,0x46,0x3A,0x85,0xC0,0x75,0x58,0xAD,0x85,0xC0,0x75,0x0F,0xE8,
10040xF8,0xFE,0xF7,0x46,0x7A,0x08,0x00,0x74,0x93,0xE8,0xA0,0xFA,0xEB,0x8E,0x3B,0x76,
10050x04,0x76,0x21,0xB9,0x02,0x00,0x39,0x4E,0x2E,0x77,0x05,0xC7,0x46,0x2E,0x00,0x00,
10060x56,0x8B,0x76,0x2C,0x89,0x76,0x04,0xC7,0x04,0x00,0x00,0x46,0x46,0x89,0x76,0x2C,
10070x29,0x4E,0x2E,0x5E,0x85,0xC0,0x79,0x17,0xF6,0xC4,0x10,0x74,0x05,0xFF,0x56,0x7C,
10080xEB,0x03,0xFF,0x56,0x7E,0x89,0x76,0x14,0xB0,0x0C,0xE8,0x85,0xD1,0xEB,0x86,0x89,
10090x46,0x3A,0xFF,0x96,0x80,0x00,0x29,0x46,0x3A,0x89,0x76,0x14,0xB0,0x0C,0xE8,0x71,
10100xD1,0xE9,0x71,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x04,0x10,0x02,
10110x01,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
10120x00,0x00,0x00,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10130x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10140x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10150x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10160x80,0x80,0x80,0x80,0x80,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,
10170xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x80,
10180x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10190x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10200x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10210x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10220x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10230x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10240x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10250x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
10260x80,0x80,0x80,0x80,0x4E,0x41,0x78,0x41,0xD0,0x41,0xF4,0x41,0x06,0x42,0x18,0x42,
10270xC3,0x90,0x8E,0x46,0x02,0x8B,0x7E,0x22,0x89,0x7E,0x6C,0x80,0x66,0x27,0xFD,0x8B,
10280x56,0x24,0x83,0xFA,0x04,0x72,0xE9,0x83,0xEA,0x02,0x8B,0xD9,0x3B,0xCA,0x76,0x02,
10290x8B,0xCA,0xB0,0x0A,0x57,0x51,0x8B,0xFE,0xF2,0xAE,0x8B,0xC1,0x59,0x5F,0x75,0x1E,
10300x50,0x40,0x2B,0xC8,0x74,0x06,0x2B,0xD1,0x2B,0xD9,0xF3,0xA4,0x59,0x4B,0x4A,0x4A,
10310xB0,0x0D,0xAA,0xA4,0x3B,0xCA,0x76,0x02,0x8B,0xCA,0xE3,0x13,0xEB,0xD4,0x2B,0xD9,
10320xF7,0xC6,0x01,0x00,0x74,0x02,0xA4,0x49,0xD1,0xE9,0xF3,0xA5,0x73,0x01,0xA4,0x89,
10330x7E,0x22,0x2B,0x7E,0x6C,0x29,0x7E,0x24,0x01,0x7E,0x1A,0x8B,0xCB,0x80,0x7E,0x26,
10340x02,0x74,0x05,0x80,0x66,0x26,0xFD,0xC3,0x60,0xB0,0xFD,0xE8,0x18,0x03,0x61,0xC3,
10350xC3,0x90,0xE8,0x7C,0x02,0x72,0xF9,0x90,0x83,0x4E,0x26,0x20,0x8B,0x46,0x6A,0x89,
10360x46,0x6E,0x8B,0x46,0x48,0x0D,0x04,0x00,0x25,0xBF,0xFF,0x89,0x46,0x48,0xB0,0x06,
10370xE8,0xBF,0xCF,0xC3,0x89,0x7E,0x22,0x2B,0x7E,0x6C,0x01,0x7E,0x1A,0x29,0x7E,0x24,
10380x80,0x7E,0x26,0x02,0x74,0x05,0x83,0x66,0x26,0xFD,0xC3,0x60,0xB0,0xFD,0xE8,0xD5,
10390x02,0x61,0xC3,0x90,0x8A,0xBE,0xC2,0x00,0xEB,0x24,0xF7,0x46,0x48,0x40,0x00,0x75,
10400xB1,0x8E,0x46,0x02,0x8B,0x7E,0x22,0x89,0x7E,0x6C,0x8B,0x56,0x24,0x83,0xEA,0x0A,
10410x78,0x9E,0x03,0xD7,0x80,0x66,0x27,0xFD,0x33,0xC0,0x8A,0xBE,0xC2,0x00,0xE3,0xB4,
10420x3B,0xFA,0x77,0xB0,0xAC,0x49,0x93,0x2E,0x8A,0x87,0xD4,0x3E,0x93,0x22,0xDF,0x75,
10430x17,0xAA,0xE3,0xA0,0x3B,0xFA,0x77,0x9C,0xAC,0x49,0x93,0x2E,0x8A,0x87,0xD4,0x3E,
10440x93,0x22,0xDF,0x75,0x03,0xAA,0xEB,0xD6,0xF6,0xC3,0x7F,0x75,0x05,0xFF,0x46,0x66,
10450xEB,0xDF,0xF6,0xC3,0x40,0x75,0x0C,0x8B,0xD8,0x83,0xEB,0x08,0xD1,0xE3,0x2E,0xFF,
10460xA7,0xD4,0x3F,0xFF,0x46,0x66,0x2C,0x20,0xEB,0xC7,0x85,0xC0,0x74,0x2C,0x89,0x46,
10470x6A,0x83,0x4E,0x48,0x40,0x89,0x7E,0x22,0x2B,0x7E,0x6C,0x01,0x7E,0x1A,0x29,0x7E,
10480x24,0x80,0x7E,0x26,0x02,0x74,0x08,0x83,0x66,0x26,0xFD,0xE8,0xA3,0x01,0xC3,0x60,
10490xB0,0xFD,0xE8,0x31,0x02,0x61,0xE8,0x98,0x01,0xC3,0xE9,0x57,0xFF,0x90,0x8B,0x5E,
10500x66,0x4B,0x78,0x03,0x89,0x5E,0x66,0xAA,0x8B,0x5E,0x64,0xF7,0xC3,0x00,0x20,0x75,
10510x03,0xE9,0x40,0xFF,0xF7,0xC3,0x40,0x00,0x74,0x08,0x8A,0x86,0xC1,0x00,0xAA,0xE9,
10520x32,0xFF,0xB8,0x32,0x00,0xEB,0xA3,0x90,0x8B,0x5E,0x66,0x89,0x5E,0x68,0x83,0xC3,
10530x08,0x80,0xE3,0xF8,0x89,0x5E,0x66,0x8B,0x5E,0x64,0x81,0xE3,0x00,0x18,0x81,0xFB,
10540x00,0x18,0x74,0x2D,0xAA,0x85,0xDB,0x74,0x25,0xF7,0x46,0x64,0x40,0x00,0x75,0x18,
10550x81,0xFB,0x00,0x10,0x74,0x0C,0x8B,0x46,0x66,0x2B,0x46,0x68,0xC1,0xE0,0x04,0xE9,
10560x68,0xFF,0xB8,0x64,0x00,0xE9,0x62,0xFF,0x8A,0x86,0xC1,0x00,0xAA,0xAA,0xE9,0xE3,
10570xFE,0x51,0x8B,0x4E,0x66,0x2B,0x4E,0x68,0xB0,0x20,0xF3,0xAA,0x59,0xE9,0xD4,0xFE,
10580x8B,0x5E,0x66,0x89,0x5E,0x68,0x8B,0x5E,0x64,0xF7,0xC3,0x24,0x00,0x74,0x10,0xC7,
10590x46,0x66,0x00,0x00,0xF7,0xC3,0x04,0x00,0x74,0x05,0xB0,0x0D,0xAA,0xB0,0x0A,0xAA,
10600xEB,0x48,0x90,0x90,0xAA,0xF7,0x46,0x64,0x00,0x40,0x74,0x06,0xB8,0xD0,0x07,0xE9,
10610x18,0xFF,0xE9,0x9F,0xFE,0x90,0xAA,0xF7,0x46,0x64,0x00,0x80,0x74,0x06,0xB8,0xD0,
10620x07,0xE9,0x06,0xFF,0xE9,0x8D,0xFE,0x90,0x8B,0x5E,0x66,0x89,0x5E,0x68,0x85,0xDB,
10630x75,0x0C,0x8B,0x5E,0x64,0xF7,0xC3,0x10,0x00,0x74,0x06,0xE9,0x76,0xFE,0x8B,0x5E,
10640x64,0xF7,0xC3,0x08,0x00,0x74,0x27,0xB0,0x0A,0xAA,0xF7,0xC3,0x20,0x00,0x75,0x1F,
10650xF7,0xC3,0x00,0x01,0x75,0x03,0xE9,0x5B,0xFE,0xF7,0xC3,0x40,0x00,0x75,0x06,0xB8,
10660x64,0x00,0xE9,0xC5,0xFE,0x8A,0x86,0xC1,0x00,0xAA,0xAA,0xE9,0x46,0xFE,0xAA,0xC7,
10670x46,0x66,0x00,0x00,0xF7,0xC3,0x00,0x06,0x74,0xF1,0xF7,0xC3,0x40,0x00,0x74,0x19,
10680x8A,0x86,0xC1,0x00,0x81,0xE3,0x00,0x06,0x81,0xFB,0x00,0x04,0x72,0x06,0x76,0x02,
10690xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xE9,0x1B,0xFE,0x81,0xE3,0x00,0x06,0x81,0xFB,0x00,
10700x04,0x72,0x0E,0x76,0x06,0xB8,0x96,0x00,0xE9,0x7F,0xFE,0xB8,0x64,0x00,0xE9,0x79,
10710xFE,0x8B,0x46,0x68,0xE9,0x73,0xFE,0x90,0x36,0x8B,0x0E,0xDA,0x12,0x83,0xF9,0x32,
10720x73,0x1D,0x1E,0x06,0x33,0xC0,0x8E,0xD8,0x8E,0xC0,0x8D,0x76,0x4C,0xBF,0xDC,0x12,
10730x03,0xF9,0xA5,0xA5,0xA5,0x83,0xC1,0x06,0x89,0x0E,0xDA,0x12,0x07,0x1F,0xC3,0xB0,
10740x08,0xE8,0x6E,0xCD,0xC3,0x90,0x83,0x66,0x48,0xFE,0xE8,0x93,0xC4,0xE8,0xC8,0xFF,
10750xC3,0xF6,0x46,0x27,0x02,0x75,0x0F,0x9C,0xFA,0x83,0x7E,0x1A,0x00,0x74,0x09,0x80,
10760x4E,0x27,0x01,0x9D,0xF9,0xC3,0xF8,0xC3,0x50,0x52,0xF7,0x46,0x38,0x40,0x00,0x74,
10770x1D,0xE8,0x34,0xDE,0x83,0xC2,0x0A,0xEC,0xA8,0x40,0x75,0x27,0x83,0xEA,0x08,0x8A,
10780x86,0xA5,0x00,0x0C,0x02,0x88,0x86,0xA5,0x00,0xEE,0x5A,0x58,0xEB,0xD1,0xE8,0x0C,
10790xDE,0x8A,0x86,0xA5,0x00,0x24,0xFB,0x0C,0x02,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x5A,
10800x58,0xEB,0xBC,0x80,0x4E,0x27,0x02,0x5A,0x58,0x9D,0xF8,0xC3,0x08,0x46,0x26,0x9C,
10810xFA,0x8A,0x8E,0xA5,0x00,0xF7,0x46,0x38,0x40,0x00,0x75,0x14,0xF6,0xC1,0x06,0x74,
10820x23,0xE8,0xD9,0xDD,0x8A,0xC1,0x24,0xF9,0x88,0x86,0xA5,0x00,0xE6,0x0C,0x9D,0xC3,
10830xF6,0xC1,0x02,0x74,0x0F,0xE8,0xD0,0xDD,0x83,0xC2,0x02,0x8A,0xC1,0x24,0xFD,0x88,
10840x86,0xA5,0x00,0xEE,0x9D,0xC3,0x8B,0x5E,0x26,0x22,0xC3,0x88,0x46,0x26,0x74,0x01,
10850xC3,0x80,0x66,0x27,0xFD,0x9C,0xFA,0x8A,0x8E,0xA5,0x00,0xF7,0x46,0x38,0x40,0x00,
10860x75,0x16,0xF6,0xC1,0x04,0x75,0x0F,0xE8,0x93,0xDD,0x8A,0xC1,0x24,0xFD,0x0C,0x04,
10870x88,0x86,0xA5,0x00,0xE6,0x0C,0x9D,0xC3,0xF6,0xC1,0x02,0x75,0xF9,0xE8,0x88,0xDD,
10880x83,0xC2,0x0A,0xEC,0xA8,0x20,0x75,0x0E,0x83,0xEA,0x08,0x8A,0xC1,0x0C,0x02,0x88,
10890x86,0xA5,0x00,0xEE,0x9D,0xC3,0x83,0xEA,0x0A,0x33,0xC9,0x8A,0x4E,0x1C,0x8B,0x46,
10900x1A,0x3B,0xC8,0x73,0x1B,0x01,0x4E,0x2A,0x2B,0xC1,0x89,0x46,0x1A,0x1E,0xC5,0x76,
10910x00,0xF3,0x6E,0x1F,0x89,0x76,0x00,0x83,0xC2,0x02,0x8A,0x86,0xA5,0x00,0xEB,0xCD,
10920x85,0xC0,0x74,0x12,0x01,0x46,0x2A,0x8B,0xC8,0x1E,0xC5,0x76,0x00,0xF3,0x6E,0x1F,
10930x89,0x76,0x00,0x89,0x4E,0x1A,0xF6,0xC7,0x01,0x75,0x23,0x80,0xCB,0x02,0x89,0x5E,
10940x26,0xE8,0x08,0xC3,0x83,0xC2,0x02,0x8A,0x86,0xA5,0x00,0x24,0xFD,0xEE,0x88,0x86,
10950xA5,0x00,0xF6,0xC7,0x10,0x75,0x05,0xB0,0x02,0xE8,0x16,0xCC,0x9D,0xC3,0x83,0xC2,
10960x02,0x8A,0x86,0xA5,0x00,0xEB,0x86,0x90,0x8B,0xD1,0x8B,0x46,0x24,0x3B,0xC8,0x76,
10970x02,0x8B,0xC8,0x2B,0xD1,0x2B,0xC1,0x8B,0xD9,0xE3,0x22,0x80,0x66,0x27,0xFD,0x8E,
10980x46,0x02,0x8B,0x7E,0x22,0xF7,0xC6,0x01,0x00,0x74,0x02,0xA4,0x49,0xD1,0xE9,0xF3,
10990xA5,0x73,0x01,0xA4,0x89,0x7E,0x22,0x89,0x46,0x24,0x01,0x5E,0x1A,0x8B,0xCA,0x80,
11000x7E,0x26,0x02,0x74,0x05,0x80,0x66,0x26,0xFD,0xC3,0x60,0xB0,0xFD,0xE8,0xF6,0xFE,
11010x61,0xC3,0x50,0xE4,0x0A,0x84,0xC0,0x75,0x0A,0x86,0x86,0xA1,0x00,0x84,0xC0,0x74,
11020x0A,0xE6,0x0A,0x58,0x0C,0x20,0x89,0x46,0x48,0xF9,0xC3,0x58,0x24,0xDF,0x89,0x46,
11030x48,0xF8,0xC3,0x90,0xFB,0xB0,0x02,0xE8,0xE8,0x07,0xFA,0xE8,0x2E,0x01,0xFB,0xB0,
11040x01,0xE8,0xDE,0x07,0xFA,0xB0,0x02,0xE8,0xBC,0xCB,0xFB,0x85,0xED,0x74,0xE5,0xFA,
11050x8E,0x5E,0x0A,0xFB,0x90,0xFA,0x8B,0x46,0x48,0x8B,0x76,0x40,0xA8,0x8C,0x75,0xDE,
11060xA8,0x20,0x74,0x1A,0x50,0xE8,0x55,0xDC,0x58,0xE8,0xA6,0xFF,0x73,0x10,0xB0,0x02,
11070xE8,0x5F,0xCB,0xEB,0xC9,0x90,0x25,0xFF,0x00,0x8B,0xC8,0xEB,0x36,0x90,0xA8,0x01,
11080x75,0x22,0x46,0x83,0xE6,0xFE,0x3B,0x76,0x08,0x74,0x79,0xAD,0x8A,0xFC,0xB3,0xF0,
11090x22,0xFB,0x3A,0xFB,0x74,0xE0,0x3A,0xBE,0xA0,0x00,0x74,0x2E,0xE8,0xD2,0xFD,0x73,
11100x77,0xEB,0x9B,0x90,0x8A,0xE0,0x24,0xFC,0x88,0x46,0x48,0x8B,0x4E,0x4A,0xF6,0xC4,
11110x02,0x74,0x1D,0xE8,0xBB,0xFD,0x72,0x86,0xE8,0x13,0xF3,0x89,0x76,0x40,0xE3,0x93,
11120x83,0x4E,0x48,0x03,0x89,0x4E,0x4A,0xE9,0x74,0xFF,0x25,0xFF,0x0F,0x8B,0xC8,0x90,
11130x8B,0x86,0x98,0x00,0x85,0xC0,0x74,0x1A,0x51,0x8A,0x8E,0xA0,0x00,0xC0,0xE9,0x04,
11140xBA,0x01,0x00,0xD3,0xE2,0x59,0x23,0xC2,0x74,0x08,0x03,0xF1,0x89,0x76,0x40,0xE9,
11150x61,0xFF,0xFF,0x56,0x62,0xE3,0xF5,0x83,0x4E,0x48,0x01,0x89,0x4E,0x4A,0x89,0x76,
11160x40,0xE9,0x3A,0xFF,0x81,0x4E,0x26,0x00,0x10,0x8B,0x46,0x50,0x3B,0x46,0x46,0x77,
11170x03,0xE8,0x52,0xFD,0xE9,0x27,0xFF,0x90,0x88,0xBE,0xA0,0x00,0xEB,0xAC,0x0A,0x06,
11180x90,0x12,0x8A,0xE0,0xBA,0x06,0x01,0xB0,0x04,0xEE,0xEC,0x84,0xC0,0x75,0x12,0xB0,
11190x04,0xEE,0x8A,0xC4,0xEE,0x32,0xE4,0xA8,0x80,0x74,0x06,0xC7,0x06,0x84,0x12,0x00,
11200x00,0x88,0x26,0x90,0x12,0xC3,0x0A,0x06,0x90,0x12,0x8A,0xE0,0xBA,0x06,0x01,0xEC,
11210xA8,0x01,0x75,0xED,0xBA,0x08,0x01,0x8A,0xC4,0xEE,0x32,0xE4,0xA8,0x80,0x74,0xE1,
11220xC7,0x06,0x84,0x12,0x00,0x00,0x88,0x26,0x90,0x12,0xC3,0x90,0x36,0xF7,0x06,0x24,
11230x01,0x01,0x00,0x75,0x30,0x36,0x8B,0x0E,0xDA,0x12,0x80,0xF9,0x36,0x73,0x26,0x33,
11240xC0,0x8E,0xC0,0x8E,0xD8,0xBF,0xDC,0x12,0x03,0xF9,0xB0,0x08,0xE8,0x77,0xCA,0x85,
11250xED,0x74,0x0E,0x8D,0x76,0x4C,0xA5,0xA5,0xA5,0x80,0xC1,0x06,0x80,0xF9,0x36,0x72,
11260xE9,0x89,0x0E,0xDA,0x12,0xC3,0xC3,0x90,0xF7,0x06,0x26,0x01,0x01,0x00,0x75,0xF6,
11270x8B,0x0E,0x20,0x13,0x85,0xC9,0x75,0xEE,0x33,0xC0,0x8E,0xC0,0x8E,0xD8,0xBF,0x24,
11280x13,0xB9,0x36,0x00,0xB0,0x0A,0xE8,0x3D,0xCA,0x85,0xED,0x75,0x06,0xE9,0x12,0x01,
11290xE9,0x0A,0x01,0x33,0xDB,0x8A,0x46,0x4C,0x8A,0xA6,0xB3,0x00,0xFE,0xCC,0x78,0x0E,
11300x88,0xA6,0xB3,0x00,0x0A,0xDC,0xB4,0x0A,0xAB,0x83,0xE9,0x02,0x76,0xE2,0x8A,0xA6,
11310xB2,0x00,0xFE,0xCC,0x78,0x0E,0x88,0xA6,0xB2,0x00,0x0A,0xDC,0xB4,0x08,0xAB,0x83,
11320xE9,0x02,0x76,0xCC,0x8A,0xA6,0xB1,0x00,0xFE,0xCC,0x78,0x18,0x8A,0xBE,0xB0,0x00,
11330x75,0x04,0x88,0xA6,0xB0,0x00,0x88,0xA6,0xB1,0x00,0x0A,0xDC,0x8A,0xE7,0xAB,0x83,
11340xE9,0x02,0x76,0xAC,0x8A,0xA6,0xB4,0x00,0xFE,0xCC,0x78,0x1F,0x88,0xA6,0xB4,0x00,
11350x0A,0xDC,0xB4,0x0B,0xAB,0x8A,0x86,0xBC,0x00,0x8A,0xA6,0xBD,0x00,0xAB,0x8B,0x86,
11360xBE,0x00,0xAB,0x83,0xE9,0x06,0x76,0x88,0x8A,0x46,0x4C,0x8A,0xA6,0xB6,0x00,0xFE,
11370xCC,0x78,0x19,0x88,0xA6,0xB6,0x00,0x0A,0xDC,0xB4,0x0C,0xAB,0xE8,0xDB,0xCB,0xAB,
11380x8B,0x46,0x2A,0xAB,0x83,0xE9,0x06,0x76,0x74,0x8A,0x46,0x4C,0x8A,0xA6,0xB7,0x00,
11390xFE,0xCC,0x78,0x19,0x88,0xA6,0xB7,0x00,0x0A,0xDC,0xB4,0x0D,0xAB,0xE8,0xBA,0xCB,
11400xAB,0x8B,0x46,0x34,0xAB,0x83,0xE9,0x06,0x76,0x53,0x8A,0x46,0x4C,0x8A,0xA6,0xB8,
11410x00,0xFE,0xCC,0x78,0x19,0x88,0xA6,0xB8,0x00,0x0A,0xDC,0xB4,0x0E,0xAB,0xA1,0x50,
11420x12,0xAB,0xA1,0x52,0x12,0xAB,0x83,0xE9,0x06,0x76,0x32,0x8A,0x46,0x4C,0x8A,0xA6,
11430xB5,0x00,0xFE,0xCC,0x78,0x18,0x88,0xA6,0xB5,0x00,0x0A,0xDC,0xB4,0x0F,0xAB,0x8B,
11440x86,0x9A,0x00,0xAB,0x8B,0x86,0x9C,0x00,0xAB,0x83,0xE9,0x06,0x76,0x0F,0x84,0xDB,
11450x75,0x03,0xE9,0xEF,0xFE,0xB0,0x0A,0xE8,0xF8,0xC8,0xE9,0xE7,0xFE,0xB0,0x0A,0xE8,
11460xF0,0xC8,0xF7,0xD9,0x83,0xC1,0x36,0x8B,0xC1,0x0D,0x80,0x00,0x86,0xC4,0xA3,0x22,
11470x13,0x41,0x41,0x89,0x0E,0x20,0x13,0xC3,0xA1,0x84,0x12,0x2B,0xC1,0x72,0x11,0xA3,
11480x84,0x12,0xBE,0x22,0x13,0xD1,0xE9,0xF3,0x6F,0x90,0x89,0x0E,0x20,0x13,0xF8,0xC3,
11490xF9,0xC3,0xC3,0x81,0xEF,0x6A,0x13,0x74,0xF9,0x8B,0xC7,0x0D,0x80,0x00,0x86,0xC4,
11500xA3,0x68,0x13,0x47,0x47,0x89,0x3E,0x66,0x13,0xC3,0xF7,0x06,0x2A,0x01,0x01,0x00,
11510x75,0xE0,0x8B,0x0E,0x66,0x13,0xE3,0x07,0x80,0xF9,0x20,0x77,0xD5,0x49,0x49,0x33,
11520xC0,0x8E,0xC0,0x8E,0xD8,0xBF,0x6A,0x13,0x8B,0xF7,0x03,0xF9,0x83,0xC6,0x34,0x3B,
11530xFE,0x77,0xC0,0xB0,0x0E,0xE8,0xAE,0xC8,0x85,0xED,0x74,0xB7,0x8A,0x46,0x4C,0x8A,
11540xB6,0xB9,0x00,0xFE,0xCE,0x78,0x15,0x88,0xB6,0xB9,0x00,0x8A,0xA6,0xA9,0x00,0x80,
11550xCC,0xC0,0xAB,0x84,0xF6,0x74,0x05,0xB0,0x0E,0xE8,0x56,0xC8,0x8A,0xB6,0xBA,0x00,
11560xFE,0xCE,0x78,0xCB,0x8A,0x9E,0xA9,0x00,0x8A,0xBE,0xAB,0x00,0x8A,0x56,0x3F,0x8A,
11570xF3,0x32,0xF7,0x0A,0xB6,0xAC,0x00,0xC6,0x86,0xAC,0x00,0x00,0x22,0xF2,0x74,0x4B,
11580xF6,0xC6,0x08,0x74,0x0F,0xB4,0x02,0xF6,0xC3,0x08,0x75,0x02,0xB4,0x03,0xAB,0x80,
11590xE6,0xF7,0x74,0x37,0xF6,0xC6,0x01,0x74,0x0F,0xB4,0x00,0xF6,0xC3,0x01,0x75,0x02,
11600xB4,0x01,0xAB,0x80,0xE6,0xFE,0x74,0x23,0xF6,0xC6,0x02,0x74,0x0F,0xB4,0x04,0xF6,
11610xC3,0x02,0x75,0x02,0xB4,0x05,0xAB,0x80,0xE6,0xFD,0x74,0x0F,0xF6,0xC6,0x04,0x74,
11620x0A,0xB4,0x06,0xF6,0xC3,0x04,0x75,0x02,0xB4,0x07,0xAB,0xC6,0x86,0xBA,0x00,0x00,
11630x88,0x9E,0xAB,0x00,0xE9,0x58,0xFF,0x90,0xA1,0x84,0x12,0x2B,0xC1,0x72,0x11,0xA3,
11640x84,0x12,0xBE,0x68,0x13,0xD1,0xE9,0xF3,0x6F,0x90,0x89,0x0E,0x66,0x13,0xF8,0xC3,
11650xF9,0xC3,0xA1,0x84,0x12,0x41,0x41,0x2B,0xC1,0x72,0x23,0xA3,0x84,0x12,0x8B,0xC1,
11660x48,0x48,0x32,0xE4,0x0C,0x80,0x86,0xC4,0xEF,0x90,0x90,0x90,0x90,0x90,0xBE,0xDC,
11670x12,0x49,0x49,0xD1,0xE9,0xF3,0x6F,0x90,0x89,0x0E,0xDA,0x12,0xF8,0xC3,0xF9,0xC3,
11680x8A,0xC8,0x8A,0x46,0x4C,0xB4,0x01,0x83,0xEB,0x06,0xEF,0x90,0x90,0x90,0x90,0x90,
11690xB8,0x01,0x00,0xEF,0x90,0x90,0x90,0x90,0x90,0x8A,0xC1,0xEF,0x90,0x90,0x90,0x90,
11700x90,0xE9,0x97,0x00,0xE9,0xAC,0x00,0x33,0xC0,0x8E,0xD8,0x89,0x1E,0x84,0x12,0xC3,
11710x36,0x8B,0x1E,0x84,0x12,0xFB,0x90,0xFA,0xB0,0x0C,0xE8,0x89,0xC7,0x85,0xED,0x74,
11720xE6,0xC5,0x76,0x0C,0x83,0xFB,0x14,0x72,0xDB,0xFB,0x90,0xFA,0xAD,0x85,0xC0,0x78,
11730xAF,0x74,0xE2,0x8B,0xFE,0x03,0xF8,0x36,0x8B,0x0E,0x86,0x12,0x3B,0xC1,0x77,0x02,
11740x8B,0xC8,0x83,0xEB,0x04,0x3B,0xD9,0x77,0x02,0x8B,0xCB,0x33,0xC0,0x8A,0x46,0x4C,
11750xEF,0x90,0x90,0x90,0x90,0x90,0x8B,0xC1,0xEF,0x90,0x90,0x90,0x90,0x90,0x41,0x80,
11760xE1,0xFE,0x2B,0xD9,0x51,0xD1,0xE9,0xF3,0x6F,0x90,0x59,0x8B,0xC7,0x40,0x24,0xFE,
11770x3B,0xC6,0x74,0x27,0x2B,0xFE,0x4E,0x4E,0x53,0x8B,0x5E,0x10,0x3B,0xF3,0x72,0x13,
11780x03,0x1F,0x83,0xC3,0x03,0x80,0xE3,0xFE,0xC7,0x07,0x00,0x00,0x83,0x6E,0x74,0x02,
11790x89,0x5E,0x10,0x5B,0x89,0x3C,0x89,0x76,0x0C,0xEB,0x89,0x89,0x76,0x0C,0x39,0x76,
11800x10,0x77,0x81,0x72,0x08,0x83,0x3C,0x00,0x74,0x03,0xE9,0x77,0xFF,0xE8,0x0D,0xBE,
11810xE9,0x62,0xFF,0x36,0x89,0x1E,0x84,0x12,0xB0,0x0C,0xE8,0xB5,0xC6,0x33,0xC0,0x8E,
11820xD8,0xC3,0xA1,0x84,0x12,0x3D,0x10,0x00,0x72,0x77,0xBA,0x04,0x01,0x3B,0x06,0x88,
11830x12,0x75,0x06,0xC7,0x06,0x7E,0x12,0x00,0x00,0x8B,0x0E,0xDA,0x12,0xE3,0x0B,0xE8,
11840xD0,0xFE,0x72,0x57,0xC7,0x06,0x7E,0x12,0xFF,0x7F,0x8B,0x0E,0x20,0x13,0xE3,0x0B,
11850xE8,0xA5,0xFD,0x72,0x46,0xC7,0x06,0x7E,0x12,0xFF,0x7F,0x8B,0x0E,0x66,0x13,0xE3,
11860x0B,0xE8,0x94,0xFE,0x72,0x35,0xC7,0x06,0x7E,0x12,0xFF,0x7F,0xA1,0x28,0x01,0xA9,
11870x01,0x00,0x75,0x03,0xE8,0xF9,0xFE,0x80,0x3E,0x8D,0x12,0x00,0x75,0x1D,0xA1,0x84,
11880x12,0x3D,0x20,0x00,0x76,0x15,0x3B,0x06,0x82,0x12,0x76,0x09,0xA1,0x7E,0x12,0x3B,
11890x06,0x80,0x12,0x72,0x0C,0x80,0x0E,0x90,0x12,0x80,0xC3,0xB0,0x80,0xFF,0x16,0x7C,
11900x12,0xC3,0x80,0x0E,0x90,0x12,0x40,0xC3,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x17,
11910x9C,0x0E,0xE8,0xB7,0xC8,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x20,0x9C,0x0E,0xE8,
11920xAA,0xC8,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x16,0x9C,0x0E,0xE8,0x9D,0xC8,0x90,
11930xBA,0x06,0x01,0xEC,0xA8,0x20,0x75,0xCA,0xFB,0x90,0xFA,0xBA,0x04,0x01,0xED,0x90,
11940x90,0x90,0x90,0x90,0x3A,0x06,0x94,0x12,0x77,0xBE,0x33,0xDB,0x8A,0xD8,0xD1,0xE3,
11950x2E,0x8B,0xAF,0x44,0x00,0xC4,0x7E,0x08,0x85,0xFF,0x74,0xB9,0xF6,0xC4,0xC0,0x75,
11960x55,0x32,0xC0,0xC1,0xE0,0x02,0x80,0xE4,0xF0,0x8B,0xF0,0xED,0x90,0x90,0x90,0x90,
11970x90,0x85,0xC0,0x74,0xBB,0x8B,0xC8,0x41,0x80,0xE1,0xFE,0x0B,0xC6,0x8B,0x5E,0x50,
11980x4B,0x4B,0x2B,0xD9,0x78,0x9C,0xAB,0x8B,0xC1,0x40,0x40,0x01,0x46,0x4E,0xD1,0xE9,
11990xF3,0x6D,0x90,0x89,0x5E,0x50,0x89,0x7E,0x08,0x8B,0x46,0x26,0x80,0xE4,0xEF,0x89,
12000x46,0x26,0xF6,0xC4,0x01,0x75,0x0C,0xF7,0x46,0x48,0x0C,0x00,0x75,0x05,0xB0,0x02,
12010xE8,0x7F,0xC5,0xE9,0x7A,0xFF,0x86,0xC4,0x8B,0xC8,0x83,0xE1,0x3F,0x41,0x80,0xE1,
12020xFE,0xE3,0x0A,0x3C,0x80,0x72,0x09,0x24,0x3F,0xB4,0xF0,0xEB,0xB0,0xE9,0x60,0xFF,
12030x25,0x3F,0x00,0x33,0xFF,0x8E,0xC7,0xBF,0x96,0x12,0x8B,0xF7,0xD1,0xE9,0xF3,0x6D,
12040x90,0x8B,0xC8,0xE8,0x48,0xED,0xE9,0x47,0xFF,0x90,0x6A,0x00,0x1F,0xC6,0x06,0x93,
12050x12,0x1B,0x9C,0x0E,0xE8,0xD5,0xC7,0x90,0x60,0x1E,0x06,0x33,0xC0,0x8E,0xD8,0x8E,
12060xC0,0xBA,0x06,0x01,0xEC,0xA8,0x04,0x74,0xE1,0xB0,0x06,0xEE,0xEC,0xA2,0x8C,0x12,
12070xA8,0x40,0x74,0x11,0xA1,0x88,0x12,0xA3,0x84,0x12,0xC6,0x06,0x8D,0x12,0x00,0xE8,
12080x60,0xFE,0xA0,0x8C,0x12,0xA8,0x80,0x74,0x03,0xE8,0x04,0xFF,0xB8,0x00,0x80,0xBA,
12090x22,0xFF,0xEF,0x07,0x1F,0x61,0xCF,0x90,0x6A,0x00,0x1F,0xC6,0x06,0x93,0x12,0x1B,
12100x9C,0x0E,0xE8,0x87,0xC7,0x90,0x60,0x1E,0x06,0x33,0xC0,0x8E,0xD8,0x8E,0xC0,0xBA,
12110x06,0x01,0xEC,0xA8,0x04,0x74,0xE1,0xBA,0x08,0x01,0xEC,0xA2,0x8C,0x12,0xA8,0x40,
12120x74,0x11,0xA1,0x88,0x12,0xA3,0x84,0x12,0xC6,0x06,0x8D,0x12,0x00,0xE8,0x12,0xFE,
12130xA0,0x8C,0x12,0xA8,0x80,0x74,0x03,0xE8,0xB6,0xFE,0xB8,0x00,0x80,0xBA,0x22,0xFF,
12140xEF,0x07,0x1F,0x61,0xCF,0x90,0xEE,0x86,0xE0,0xEE,0x86,0xE0,0xEC,0x86,0xE0,0xEC,
12150x86,0xE0,0x80,0xE1,0xFE,0xF3,0x6C,0x90,0x80,0xE1,0xFE,0xF3,0x6E,0x90,0x05,0x00,
12160x75,0x47,0xA8,0x4B,0x05,0x00,0x75,0x48,0xA8,0x4B,0x05,0x00,0xA3,0x48,0xA8,0x4B,
12170x05,0x00,0x35,0x49,0xA8,0x4B,0x06,0x00,0x98,0x48,0x96,0x4B,0x06,0x00,0xBA,0x48,
12180x96,0x4B,0x06,0x00,0xC3,0x48,0x96,0x4B,0x06,0x00,0xCB,0x48,0x96,0x4B,0x06,0x00,
12190x20,0x49,0x96,0x4B,0x06,0x00,0x28,0x49,0x96,0x4B,0x06,0x00,0x4E,0x4A,0x9C,0x4B,
12200x06,0x00,0x7B,0x4A,0x9C,0x4B,0x05,0x00,0x9E,0x4A,0xA2,0x4B,0x05,0x00,0xEC,0x4A,
12210xA2,0x4B,0x00,0x00,0x1E,0x06,0x83,0x3E,0x44,0x12,0x00,0x74,0x09,0xA0,0x06,0x01,
12220x24,0x30,0x3C,0x30,0x74,0x1A,0x8C,0xC8,0x8E,0xD8,0x8E,0xC0,0xBB,0xAE,0x4B,0x8B,
12230x0F,0xE3,0x0D,0x8B,0x7F,0x02,0x8B,0x77,0x04,0xF3,0xA4,0x83,0xC3,0x06,0xEB,0xEF,
12240x07,0x1F,0xC3,0x90,0x33,0xC0,0xA3,0x3E,0x01,0xB9,0x0C,0x01,0xBE,0x40,0x01,0x8B,
12250xFE,0x81,0xC6,0xB4,0x0F,0x89,0x04,0x8B,0xC6,0x2B,0xF1,0x3B,0xC7,0x77,0xF6,0xA3,
12260x3C,0x01,0xC3,0x90,0x1E,0x06,0x60,0x36,0x8B,0x2E,0x3E,0x01,0x8B,0x5E,0x00,0x3B,
12270xEB,0x74,0x2B,0x8B,0x76,0x02,0x89,0x1C,0x89,0x77,0x02,0x36,0xA1,0x3C,0x01,0x89,
12280x46,0x00,0x36,0x89,0x2E,0x3C,0x01,0x8B,0xEB,0xFF,0x4E,0x06,0x74,0x08,0x8B,0x6E,
12290x00,0xFF,0x4E,0x06,0x75,0xF8,0x36,0x89,0x2E,0x3E,0x01,0x8B,0x66,0x04,0x61,0x07,
12300x1F,0xC3,0x1E,0x06,0x60,0x36,0x8B,0x2E,0x3E,0x01,0x98,0x89,0x46,0x06,0x89,0x66,
12310x04,0x3B,0x6E,0x00,0x74,0x10,0x8B,0x6E,0x00,0xFF,0x4E,0x06,0x75,0xF8,0x36,0x89,
12320x2E,0x3E,0x01,0x8B,0x66,0x04,0x61,0x07,0x1F,0xC3,0xC3,0x90,0x1E,0x06,0x60,0x9C,
12330xFA,0x33,0xED,0x8E,0xDD,0x8B,0x2E,0x3C,0x01,0x85,0xED,0x74,0x3D,0x8B,0x4E,0x00,
12340x89,0x0E,0x3C,0x01,0x8B,0xCC,0x8D,0xA6,0x0A,0x01,0x56,0x1E,0x06,0x60,0x89,0x66,
12350x04,0xC7,0x46,0x08,0x0F,0x1A,0xC7,0x46,0x06,0x01,0x00,0x8B,0x1E,0x3E,0x01,0x85,
12360xDB,0x74,0x1D,0x8B,0xC5,0x87,0x07,0x89,0x46,0x00,0x89,0x5E,0x02,0x8B,0xD8,0x89,
12370x6F,0x02,0x8B,0xE1,0x9D,0x61,0x07,0x1F,0xF8,0xC3,0x9D,0x61,0x07,0x1F,0xF9,0xC3,
12380x89,0x2E,0x3E,0x01,0x89,0x6E,0x00,0x89,0x6E,0x02,0x87,0xE1,0x9D,0x8B,0xE1,0xEB,
12390xE4,0x00,0x0D,0x0A,0x54,0x65,0x72,0x6D,0x69,0x6E,0x61,0x6C,0x73,0x20,0x73,0x75,
12400x70,0x70,0x6F,0x72,0x74,0x65,0x64,0x3A,0x0D,0x0A,0x31,0x29,0x20,0x41,0x4E,0x53,
12410x49,0x20,0x63,0x6F,0x6D,0x70,0x61,0x74,0x69,0x62,0x6C,0x65,0x0D,0x0A,0x32,0x29,
12420x20,0x57,0x79,0x73,0x65,0x20,0x33,0x30,0x0D,0x0A,0x50,0x6C,0x65,0x61,0x73,0x65,
12430x20,0x73,0x65,0x6C,0x65,0x63,0x74,0x3A,0x20,0x00,0x0D,0x0A,0x63,0x6F,0x64,0x65,
12440x20,0x73,0x65,0x67,0x6D,0x65,0x6E,0x74,0x3D,0x00,0x0D,0x0A,0x4D,0x6F,0x6E,0x69,
12450x74,0x6F,0x72,0x20,0x76,0x32,0x2E,0x35,0x0A,0x0D,0x0A,0x3E,0x00,0x0D,0x0A,0x50,
12460x61,0x72,0x64,0x6F,0x6E,0x3F,0x00,0x0D,0x0A,0x4E,0x6F,0x20,0x61,0x64,0x64,0x72,
12470x65,0x73,0x73,0x20,0x73,0x70,0x65,0x63,0x69,0x66,0x69,0x65,0x64,0x00,0x0D,0x0A,
12480x3A,0x00,0x0D,0x0A,0x00,0x4C,0x6F,0x63,0x3D,0x00,0x0D,0x0A,0x46,0x41,0x54,0x41,
12490x4C,0x20,0x45,0x52,0x52,0x4F,0x52,0x3D,0x00,0x0D,0x0A,0x4D,0x6F,0x6E,0x69,0x74,
12500x6F,0x72,0x20,0x63,0x6F,0x6D,0x6D,0x61,0x6E,0x64,0x73,0x3A,0x2D,0x0D,0x0A,0x20,
12510x20,0x20,0x44,0x2C,0x64,0x5B,0x5B,0x78,0x78,0x78,0x78,0x3A,0x5D,0x78,0x78,0x78,
12520x78,0x5D,0x20,0x2D,0x20,0x64,0x75,0x6D,0x70,0x20,0x6D,0x65,0x6D,0x6F,0x72,0x79,
12530x0D,0x0A,0x20,0x20,0x20,0x4C,0x2C,0x6C,0x5B,0x5B,0x78,0x78,0x78,0x78,0x3A,0x5D,
12540x78,0x78,0x78,0x78,0x5D,0x20,0x2D,0x20,0x64,0x75,0x6D,0x70,0x20,0x73,0x69,0x6E,
12550x67,0x6C,0x65,0x20,0x6C,0x69,0x6E,0x65,0x0D,0x0A,0x20,0x20,0x20,0x45,0x2C,0x65,
12560x5B,0x5B,0x78,0x78,0x78,0x78,0x3A,0x5D,0x78,0x78,0x78,0x78,0x5D,0x20,0x2D,0x20,
12570x65,0x64,0x69,0x74,0x20,0x6D,0x65,0x6D,0x6F,0x72,0x79,0x0D,0x0A,0x20,0x20,0x20,
12580x46,0x2C,0x66,0x5B,0x5B,0x78,0x78,0x78,0x78,0x20,0x5D,0x78,0x78,0x78,0x78,0x5D,
12590x20,0x2D,0x20,0x66,0x69,0x6C,0x6C,0x20,0x6D,0x65,0x6D,0x6F,0x72,0x79,0x20,0x70,
12600x61,0x72,0x61,0x67,0x72,0x61,0x70,0x68,0x73,0x0D,0x0A,0x20,0x20,0x20,0x49,0x5B,
12610x78,0x78,0x78,0x78,0x5D,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,
12620x20,0x77,0x6F,0x72,0x64,0x20,0x69,0x6E,0x70,0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,
12630x20,0x70,0x6F,0x72,0x74,0x0D,0x0A,0x20,0x20,0x20,0x69,0x5B,0x78,0x78,0x78,0x78,
12640x5D,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x62,0x79,0x74,
12650x65,0x20,0x69,0x6E,0x70,0x75,0x74,0x20,0x66,0x72,0x6F,0x6D,0x20,0x70,0x6F,0x72,
12660x74,0x0D,0x0A,0x20,0x20,0x20,0x4F,0x78,0x78,0x78,0x78,0x20,0x78,0x78,0x20,0x20,
12670x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x6F,0x75,0x74,0x70,0x75,0x74,0x20,
12680x77,0x6F,0x72,0x64,0x20,0x74,0x6F,0x20,0x70,0x6F,0x72,0x74,0x0D,0x0A,0x20,0x20,
12690x20,0x6F,0x78,0x78,0x78,0x78,0x20,0x78,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12700x20,0x20,0x2D,0x20,0x6F,0x75,0x74,0x70,0x75,0x74,0x20,0x62,0x79,0x74,0x65,0x20,
12710x74,0x6F,0x20,0x70,0x6F,0x72,0x74,0x0D,0x0A,0x20,0x20,0x20,0x47,0x5B,0x5B,0x78,
12720x78,0x78,0x78,0x3A,0x5D,0x78,0x78,0x78,0x78,0x5D,0x20,0x20,0x20,0x2D,0x20,0x67,
12730x6F,0x74,0x6F,0x20,0x61,0x64,0x64,0x72,0x65,0x73,0x73,0x0D,0x0A,0x20,0x20,0x20,
12740x57,0x5B,0x5B,0x78,0x78,0x78,0x78,0x3A,0x5D,0x78,0x78,0x78,0x78,0x5D,0x20,0x20,
12750x20,0x2D,0x20,0x77,0x61,0x74,0x63,0x68,0x20,0x61,0x20,0x77,0x6F,0x72,0x64,0x0D,
12760x0A,0x20,0x20,0x20,0x43,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12770x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x69,0x6E,0x74,0x65,0x72,0x72,0x75,0x70,0x74,
12780x73,0x20,0x6F,0x66,0x66,0x0D,0x0A,0x20,0x20,0x20,0x53,0x20,0x20,0x20,0x20,0x20,
12790x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x69,0x6E,0x74,
12800x65,0x72,0x72,0x75,0x70,0x74,0x73,0x20,0x6F,0x6E,0x0D,0x0A,0x20,0x20,0x20,0x73,
12810x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12820x2D,0x20,0x73,0x69,0x6E,0x67,0x6C,0x65,0x20,0x73,0x74,0x65,0x70,0x0D,0x0A,0x20,
12830x20,0x20,0x42,0x78,0x78,0x78,0x78,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12840x20,0x20,0x20,0x2D,0x20,0x62,0x72,0x65,0x61,0x6B,0x70,0x6F,0x69,0x6E,0x74,0x20,
12850x73,0x65,0x74,0x0D,0x0A,0x20,0x20,0x20,0x62,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12860x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x62,0x72,0x65,0x61,0x6B,
12870x70,0x6F,0x69,0x6E,0x74,0x20,0x63,0x6C,0x65,0x61,0x72,0x0D,0x0A,0x20,0x20,0x20,
12880x52,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12890x20,0x2D,0x20,0x72,0x65,0x73,0x74,0x61,0x72,0x74,0x20,0x62,0x72,0x65,0x61,0x6B,
12900x70,0x6F,0x69,0x6E,0x74,0x0D,0x0A,0x20,0x20,0x20,0x72,0x20,0x20,0x20,0x20,0x20,
12910x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x72,0x65,0x67,
12920x69,0x73,0x74,0x65,0x72,0x73,0x20,0x61,0x74,0x20,0x62,0x72,0x6B,0x70,0x74,0x0D,
12930x0A,0x20,0x20,0x20,0x58,0x2C,0x78,0x20,0x6E,0x20,0x20,0x20,0x20,0x20,0x20,0x20,
12940x20,0x20,0x20,0x20,0x20,0x2D,0x20,0x65,0x78,0x61,0x6D,0x69,0x6E,0x65,0x20,0x63,
12950x68,0x61,0x6E,0x6E,0x65,0x6C,0x20,0x6E,0x0D,0x0A,0x20,0x20,0x20,0x48,0x2C,0x3F,
12960x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x2D,0x20,
12970x74,0x68,0x69,0x73,0x20,0x6D,0x65,0x73,0x73,0x61,0x67,0x65,0x00,0x1B,0x5B,0x32,
12980x4A,0x1B,0x5B,0x31,0x3B,0x31,0x48,0x41,0x4E,0x53,0x49,0x20,0x54,0x65,0x72,0x6D,
12990x69,0x6E,0x61,0x6C,0x0D,0x0A,0x0A,0x00,0x1B,0x5B,0x4B,0x00,0x1B,0x5B,0x4A,0x00,
13000x1B,0x5B,0x32,0x4A,0x1B,0x5B,0x31,0x3B,0x31,0x48,0x00,0x1B,0x5B,0x44,0x20,0x1B,
13010x5B,0x44,0x00,0x1B,0x5B,0x31,0x3B,0x37,0x32,0x48,0x00,0x1B,0x5B,0x00,0x3B,0x00,
13020x48,0x00,0x1B,0x5B,0x73,0x00,0x1B,0x5B,0x75,0x00,0x1B,0x7A,0x2B,0x0B,0x7F,0x1B,
13030x7A,0x2E,0x0C,0x7F,0x1B,0x7A,0x2D,0x08,0x7F,0x1B,0x7A,0x2C,0x0A,0x7F,0x1B,0x7A,
13040x22,0x08,0x7F,0x1A,0x57,0x79,0x73,0x65,0x20,0x33,0x30,0x20,0x54,0x65,0x72,0x6D,
13050x69,0x6E,0x61,0x6C,0x0D,0x0A,0x00,0x1B,0x54,0x00,0x1B,0x59,0x00,0x1A,0x00,0x1E,
13060x00,0x08,0x20,0x08,0x00,0x00,0x1B,0x3D,0x00,0x00,0x00,0x1B,0x46,0x00,0x0D,0x00,
13070x3F,0x44,0x64,0x45,0x65,0x46,0x66,0x47,0x67,0x48,0x68,0x49,0x69,0x4F,0x6F,0x43,
13080x63,0x53,0x73,0x42,0x62,0x52,0x72,0x57,0x77,0x58,0x78,0x4C,0x6C,0x3C,0x60,0xD4,
13090x57,0xD4,0x57,0x50,0x58,0x50,0x58,0xD6,0x59,0xD6,0x59,0xB4,0x59,0xB4,0x59,0x3C,
13100x60,0x3C,0x60,0x6C,0x57,0x48,0x57,0x26,0x57,0x06,0x57,0x90,0x57,0x90,0x57,0x98,
13110x57,0x48,0x5F,0x0C,0x5F,0x58,0x5F,0x33,0x5F,0x40,0x5F,0xA0,0x57,0xA0,0x57,0xFE,
13120x59,0xFE,0x59,0xDC,0x57,0xDC,0x57,0x88,0x61,0x98,0x61,0xC0,0x61,0xCC,0x61,0xD8,
13130x61,0xF6,0x61,0x02,0x62,0x22,0x62,0xF8,0x56,0x4A,0x62,0x58,0x62,0x60,0x59,0x20,
13140x20,0x66,0x6C,0x61,0x67,0x73,0x3D,0x00,0x20,0x20,0x61,0x78,0x3D,0x00,0x20,0x20,
13150x62,0x78,0x3D,0x00,0x20,0x20,0x63,0x78,0x3D,0x00,0x20,0x20,0x64,0x78,0x3D,0x00,
13160x20,0x20,0x63,0x73,0x3D,0x00,0x20,0x20,0x64,0x73,0x3D,0x00,0x20,0x20,0x65,0x73,
13170x3D,0x00,0x20,0x20,0x73,0x73,0x3D,0x00,0x20,0x20,0x64,0x69,0x3D,0x00,0x20,0x20,
13180x73,0x69,0x3D,0x00,0x20,0x20,0x62,0x70,0x3D,0x00,0x20,0x20,0x73,0x70,0x3D,0x00,
13190x20,0x20,0x69,0x70,0x3D,0x00,0x20,0x63,0x68,0x61,0x6E,0x65,0x6C,0x3D,0x00,0x20,
13200x20,0x20,0x20,0x73,0x65,0x67,0x3D,0x00,0x20,0x74,0x69,0x5F,0x73,0x74,0x72,0x3D,
13210x00,0x20,0x74,0x69,0x5F,0x74,0x6F,0x73,0x3D,0x00,0x20,0x74,0x69,0x5F,0x6D,0x61,
13220x78,0x3D,0x00,0x20,0x74,0x69,0x5F,0x62,0x61,0x73,0x3D,0x00,0x20,0x74,0x69,0x5F,
13230x73,0x69,0x7A,0x3D,0x00,0x20,0x74,0x69,0x5F,0x73,0x74,0x66,0x3D,0x00,0x20,0x74,
13240x69,0x5F,0x72,0x6F,0x6F,0x3D,0x00,0x20,0x74,0x69,0x5F,0x66,0x6C,0x67,0x3D,0x00,
13250x20,0x74,0x69,0x5F,0x74,0x6F,0x74,0x3D,0x00,0x20,0x72,0x69,0x5F,0x70,0x63,0x6E,
13260x3D,0x00,0x20,0x72,0x69,0x5F,0x73,0x74,0x72,0x3D,0x00,0x20,0x72,0x69,0x5F,0x73,
13270x74,0x66,0x3D,0x00,0x20,0x72,0x69,0x5F,0x72,0x6F,0x6F,0x3D,0x00,0x20,0x72,0x69,
13280x5F,0x62,0x61,0x73,0x3D,0x00,0x20,0x72,0x69,0x5F,0x73,0x69,0x7A,0x3D,0x00,0x20,
13290x72,0x69,0x5F,0x74,0x6F,0x74,0x3D,0x00,0x20,0x72,0x69,0x5F,0x6D,0x69,0x6E,0x3D,
13300x00,0x20,0x72,0x69,0x5F,0x66,0x6C,0x67,0x3D,0x00,0x20,0x72,0x69,0x5F,0x74,0x6F,
13310x73,0x3D,0x00,0x20,0x72,0x69,0x5F,0x74,0x68,0x72,0x3D,0x00,0x20,0x74,0x68,0x5F,
13320x73,0x74,0x66,0x3D,0x00,0x20,0x74,0x68,0x5F,0x73,0x74,0x72,0x3D,0x00,0x20,0x74,
13330x68,0x5F,0x62,0x61,0x73,0x3D,0x00,0x20,0x74,0x68,0x5F,0x73,0x69,0x7A,0x3D,0x00,
13340x20,0x74,0x68,0x5F,0x74,0x72,0x67,0x3D,0x00,0x20,0x74,0x68,0x5F,0x66,0x6C,0x67,
13350x3D,0x00,0x20,0x74,0x68,0x5F,0x63,0x6E,0x74,0x3D,0x00,0x20,0x72,0x68,0x5F,0x73,
13360x74,0x72,0x3D,0x00,0x20,0x72,0x68,0x5F,0x73,0x74,0x66,0x3D,0x00,0x20,0x72,0x68,
13370x5F,0x62,0x61,0x73,0x3D,0x00,0x20,0x72,0x68,0x5F,0x73,0x69,0x7A,0x3D,0x00,0x20,
13380x72,0x68,0x5F,0x73,0x70,0x61,0x3D,0x00,0x20,0x72,0x68,0x5F,0x61,0x73,0x6F,0x3D,
13390x00,0x20,0x72,0x68,0x5F,0x72,0x6F,0x6F,0x3D,0x00,0x20,0x72,0x68,0x5F,0x66,0x6C,
13400x67,0x3D,0x00,0x20,0x6D,0x5F,0x63,0x61,0x72,0x65,0x3D,0x00,0x20,0x70,0x74,0x5F,
13410x66,0x6C,0x6F,0x3D,0x00,0x20,0x61,0x73,0x5F,0x66,0x6C,0x6F,0x3D,0x00,0x20,0x72,
13420x6D,0x5F,0x66,0x6C,0x6F,0x3D,0x00,0x20,0x20,0x20,0x71,0x5F,0x69,0x6E,0x3D,0x00,
13430x20,0x20,0x71,0x5F,0x6F,0x75,0x74,0x3D,0x00,0x20,0x71,0x5F,0x64,0x72,0x61,0x6E,
13440x3D,0x00,0x20,0x20,0x71,0x5F,0x74,0x69,0x6D,0x3D,0x00,0x20,0x20,0x20,0x71,0x5F,
13450x66,0x63,0x3D,0x00,0x20,0x71,0x5F,0x73,0x74,0x61,0x74,0x3D,0x00,0x20,0x71,0x5F,
13460x64,0x61,0x74,0x61,0x3D,0x00,0x20,0x71,0x5F,0x6D,0x6F,0x64,0x6D,0x3D,0x00,0x20,
13470x68,0x61,0x6E,0x64,0x5F,0x6F,0x3D,0x00,0x20,0x68,0x61,0x6E,0x64,0x5F,0x62,0x3D,
13480x00,0x20,0x68,0x61,0x6E,0x64,0x5F,0x65,0x3D,0x00,0x20,0x68,0x61,0x6E,0x64,0x5F,
13490x69,0x3D,0x00,0x20,0x20,0x6F,0x70,0x6F,0x73,0x74,0x3D,0x00,0x20,0x20,0x74,0x69,
13500x6D,0x65,0x6F,0x3D,0x00,0x20,0x63,0x75,0x73,0x74,0x6D,0x31,0x3D,0x00,0x20,0x63,
13510x75,0x73,0x74,0x6D,0x32,0x3D,0x00,0x20,0x63,0x75,0x73,0x74,0x6D,0x64,0x3D,0x00,
13520x20,0x74,0x78,0x72,0x61,0x74,0x65,0x3D,0x00,0x20,0x72,0x78,0x72,0x61,0x74,0x65,
13530x3D,0x00,0x20,0x20,0x63,0x5F,0x6D,0x61,0x70,0x3D,0x00,0x20,0x63,0x5F,0x61,0x64,
13540x64,0x72,0x3D,0x00,0x20,0x63,0x5F,0x61,0x69,0x73,0x72,0x3D,0x00,0x20,0x63,0x5F,
13550x78,0x74,0x61,0x67,0x3D,0x00,0x20,0x63,0x5F,0x64,0x65,0x66,0x72,0x3D,0x00,0x20,
13560x63,0x5F,0x66,0x6C,0x73,0x68,0x3D,0x00,0x20,0x74,0x78,0x6D,0x61,0x78,0x73,0x3D,
13570x00,0x20,0x72,0x69,0x5F,0x65,0x6D,0x73,0x3D,0x00,0x20,0x20,0x63,0x5F,0x6C,0x73,
13580x72,0x3D,0x00,0x20,0x20,0x63,0x5F,0x69,0x65,0x72,0x3D,0x00,0x20,0x20,0x63,0x5F,
13590x66,0x63,0x72,0x3D,0x00,0x20,0x20,0x63,0x5F,0x6D,0x63,0x72,0x3D,0x00,0x20,0x20,
13600x63,0x5F,0x6C,0x63,0x72,0x3D,0x00,0x20,0x20,0x63,0x5F,0x64,0x73,0x73,0x3D,0x00,
13610x20,0x63,0x5F,0x64,0x73,0x73,0x69,0x3D,0x00,0x20,0x63,0x5F,0x64,0x73,0x73,0x72,
13620x3D,0x00,0x20,0x20,0x63,0x5F,0x69,0x73,0x72,0x3D,0x00,0x20,0x20,0x63,0x5F,0x63,
13630x61,0x72,0x3D,0x00,0x20,0x20,0x63,0x5F,0x65,0x66,0x72,0x3D,0x00,0x20,0x63,0x5F,
13640x65,0x72,0x73,0x74,0x3D,0x00,0x20,0x63,0x5F,0x65,0x63,0x6E,0x74,0x3D,0x00,0x20,
13650x63,0x5F,0x62,0x72,0x6B,0x63,0x3D,0x00,0x20,0x63,0x5F,0x62,0x6F,0x6B,0x63,0x3D,
13660x00,0x20,0x63,0x5F,0x72,0x65,0x70,0x6C,0x3D,0x00,0x20,0x63,0x5F,0x63,0x63,0x73,
13670x72,0x3D,0x00,0x20,0x63,0x5F,0x73,0x74,0x74,0x31,0x3D,0x00,0x20,0x63,0x5F,0x73,
13680x74,0x74,0x32,0x3D,0x00,0x2B,0xC0,0x8E,0xD8,0x8E,0xC0,0xE8,0xC2,0x00,0xE8,0xE5,
13690x00,0xFA,0xBF,0x84,0x00,0xC7,0x05,0xDC,0x56,0x8C,0x4D,0x02,0xBF,0x0C,0x00,0xC7,
13700x05,0x6E,0x5E,0x8C,0x4D,0x02,0xBF,0x04,0x00,0xC7,0x05,0xBA,0x5E,0x8C,0x4D,0x02,
13710xE8,0xF1,0x00,0x90,0xE8,0x49,0x01,0xE8,0x16,0x00,0xF4,0x90,0xE8,0xE5,0x00,0xBE,
13720xBA,0x4D,0xE8,0x09,0x0C,0xA0,0x93,0x12,0xE8,0x5D,0x0C,0xE8,0xC2,0x09,0xEB,0xE4,
13730xE8,0xD5,0x0C,0xE8,0xC4,0x0C,0x0A,0xC0,0x74,0xF6,0x8B,0x1E,0xF8,0x79,0x3C,0x0D,
13740x74,0x2E,0x3C,0x08,0x74,0x17,0x3C,0x7F,0x74,0x13,0x83,0xFB,0x20,0x7F,0xE1,0x88,
13750x87,0xD6,0x79,0x43,0x89,0x1E,0xF8,0x79,0xE8,0x77,0x0C,0xEB,0xD3,0x0B,0xDB,0x74,
13760xCF,0x4B,0x89,0x1E,0xF8,0x79,0x8B,0x36,0x16,0x7A,0xE8,0xC1,0x0B,0xEB,0xC1,0x90,
13770xE8,0x02,0x00,0xEB,0xBB,0xC6,0x87,0xD6,0x79,0x00,0x0B,0xDB,0x74,0x1E,0xA0,0xD6,
13780x79,0xBF,0x60,0x51,0xB9,0x1D,0x00,0x8B,0xD9,0x06,0x0E,0x07,0xF2,0xAE,0x07,0x75,
13790x17,0x41,0x2B,0xD9,0xD1,0xE3,0x2E,0xFF,0x97,0x7D,0x51,0x90,0x33,0xC0,0xA3,0xF8,
13800x79,0xBE,0x89,0x4D,0xE8,0x87,0x0B,0xC3,0xBE,0x8D,0x4D,0xE8,0x80,0x0B,0xEB,0xEC,
13810xBA,0x00,0x02,0xB0,0x93,0xEE,0xB0,0x55,0xEE,0xBA,0x10,0x02,0xB0,0x93,0xEE,0xB0,
13820xAA,0xEE,0xBA,0x00,0x02,0xEC,0x3C,0x55,0x75,0x08,0xBA,0x10,0x02,0xEC,0x3C,0xAA,
13830x74,0x03,0xE8,0x2F,0xF6,0xC3,0xBA,0x04,0x02,0xB0,0x1A,0xEE,0xB0,0x20,0xEE,0xB0,
13840x30,0xEE,0xB0,0x40,0xEE,0xB0,0x80,0xEE,0xBA,0x00,0x02,0xB0,0x13,0xEE,0xB0,0x07,
13850xEE,0xBA,0x08,0x02,0xB0,0x80,0xEE,0xBA,0x02,0x02,0xB0,0xBB,0xEE,0xBA,0x04,0x02,
13860xB0,0x05,0xEE,0xC3,0xC6,0x06,0xCA,0x13,0x01,0xC7,0x06,0xF8,0x79,0x00,0x00,0xC6,
13870x06,0xF6,0x79,0x01,0xC7,0x06,0xD0,0x79,0x00,0x00,0xC7,0x06,0xD2,0x79,0x00,0x00,
13880xC7,0x06,0xD4,0x79,0x00,0x00,0xC7,0x06,0xFA,0x79,0x00,0x00,0xC7,0x06,0xFC,0x79,
13890x00,0x00,0xC7,0x06,0xFE,0x79,0x00,0x00,0xC7,0x06,0x00,0x7A,0x00,0x00,0xC7,0x06,
13900x02,0x7A,0xCE,0x59,0x8C,0x0E,0x04,0x7A,0xC7,0x06,0x06,0x7A,0x00,0x00,0xC7,0x06,
13910x27,0x7A,0x00,0x00,0xC6,0x06,0x29,0x7A,0x00,0xC6,0x06,0x2A,0x7A,0x00,0xC3,0x90,
13920xBE,0x22,0x4D,0xE8,0xC8,0x0A,0xE8,0x3F,0x00,0x2C,0x31,0x3C,0x01,0x77,0xF7,0xE8,
13930x81,0x09,0x8B,0x36,0x0C,0x7A,0xE8,0xB5,0x0A,0xBE,0x6A,0x4D,0xE8,0xAF,0x0A,0x0E,
13940x58,0xE8,0xF8,0x0A,0xBE,0x7A,0x4D,0xE8,0xA4,0x0A,0xC3,0x90,0x60,0xD1,0xE3,0x83,
13950xFB,0x18,0x73,0x11,0x1E,0xBA,0x00,0x00,0x8E,0xDA,0x2E,0xFF,0x97,0xB7,0x51,0x8B,
13960xEC,0x89,0x46,0x10,0x1F,0x61,0xCF,0x90,0xE8,0x4F,0x0B,0x0A,0xC0,0x75,0x05,0xE8,
13970x56,0x0B,0xEB,0xF4,0xC3,0x90,0x83,0x3E,0xF8,0x79,0x01,0x74,0x16,0xBE,0xD7,0x79,
13980xE8,0x31,0x0A,0x8B,0xD0,0xAC,0x3C,0x2C,0x74,0x04,0x3C,0x20,0x75,0x05,0xE8,0x23,
13990x0A,0xEE,0xC3,0xE9,0xD2,0xFE,0x83,0x3E,0xF8,0x79,0x01,0x74,0xF6,0xBE,0xD7,0x79,
14000xE8,0x11,0x0A,0x8B,0xD0,0xAC,0x3C,0x2C,0x74,0x08,0x3C,0x20,0x74,0x04,0xE9,0xB7,
14010xFE,0x90,0xE8,0xFF,0x09,0xEF,0xC3,0x90,0x8B,0x16,0x06,0x7A,0x83,0x3E,0xF8,0x79,
14020x01,0x74,0x0B,0xBE,0xD7,0x79,0xE8,0xEB,0x09,0x8B,0xD0,0xA3,0x06,0x7A,0xB0,0x20,
14030xE8,0x57,0x0B,0x8B,0x16,0x06,0x7A,0xEC,0xE8,0x6F,0x0B,0xC3,0x8B,0x16,0x06,0x7A,
14040x83,0x3E,0xF8,0x79,0x01,0x74,0x0B,0xBE,0xD7,0x79,0xE8,0xC7,0x09,0x8B,0xD0,0xA3,
14050x06,0x7A,0xB0,0x20,0xE8,0x33,0x0B,0x8B,0x16,0x06,0x7A,0xED,0xE8,0x67,0x0B,0xC3,
14060xFA,0xC6,0x06,0xF6,0x79,0x00,0xC3,0x90,0xC6,0x06,0xF6,0x79,0x01,0xFB,0xC3,0x90,
14070x06,0xE8,0x58,0x09,0xB0,0x20,0xE8,0x11,0x0B,0x26,0x8B,0x05,0xE8,0x47,0x0B,0xB0,
14080x08,0xE8,0x06,0x0B,0xE8,0x03,0x0B,0xE8,0x00,0x0B,0xE8,0xFD,0x0A,0xB8,0x01,0x00,
14090xE8,0xCF,0xF4,0xBA,0x02,0x02,0xEC,0x24,0x01,0x75,0x02,0xEB,0xDC,0xBA,0x06,0x02,
14100xEC,0x07,0xC3,0x90,0xC7,0x06,0x08,0x7A,0x10,0x00,0xEB,0x06,0xC7,0x06,0x08,0x7A,
14110x01,0x00,0x06,0x8E,0x06,0xFC,0x79,0x8B,0x3E,0xFA,0x79,0xE8,0x0E,0x09,0xE8,0x0B,
14120x00,0x89,0x3E,0xFA,0x79,0x8C,0x06,0xFC,0x79,0x07,0xC3,0x90,0xBE,0xB2,0x4D,0xE8,
14130x7C,0x09,0x8B,0x16,0x08,0x7A,0x52,0xE8,0x2A,0x09,0xE8,0x0F,0x0A,0xE8,0x0C,0x0A,
14140x33,0xDB,0xB9,0x10,0x00,0x90,0x26,0x8A,0x01,0xE8,0xBC,0x09,0xE8,0xFD,0x09,0x43,
14150xE2,0xF4,0xE8,0xF7,0x09,0xE8,0xF4,0x09,0x33,0xDB,0xB9,0x10,0x00,0x90,0x26,0x8A,
14160x01,0x3C,0x20,0x72,0x05,0x3C,0x7E,0x76,0x03,0x90,0xB0,0x2E,0xE8,0xE3,0x09,0x43,
14170xE2,0xEC,0xBE,0xB2,0x4D,0xE8,0x36,0x09,0x83,0xC7,0x10,0x5A,0x4A,0x75,0xB7,0xC3,
14180x06,0x8E,0x06,0x00,0x7A,0x8B,0x3E,0xFE,0x79,0xE8,0xA0,0x08,0x89,0x3E,0xFE,0x79,
14190x8C,0x06,0x00,0x7A,0x57,0x8B,0x36,0x0E,0x7A,0xE8,0x12,0x09,0xC7,0x06,0x08,0x7A,
14200x10,0x00,0xBA,0x00,0x02,0xE8,0xE8,0x00,0xE8,0x81,0xFF,0x5F,0xBA,0x00,0x00,0xE8,
14210xDE,0x00,0xBE,0xB5,0x4D,0xE8,0xF6,0x08,0x8C,0xC0,0xE8,0x3F,0x09,0xB0,0x3A,0xE8,
14220x90,0x09,0x8B,0xC7,0xE8,0x35,0x09,0xE8,0x7E,0x08,0xE8,0xC3,0x00,0x90,0xE8,0xB7,
14230x09,0xE8,0xA6,0x09,0x0A,0xC0,0x74,0xF6,0x3C,0x0B,0x75,0x06,0x83,0xEF,0x10,0xEB,
14240x19,0x90,0x3C,0x0A,0x75,0x06,0x83,0xC7,0x10,0xEB,0x0F,0x90,0x3C,0x0C,0x75,0x04,
14250x47,0xEB,0x07,0x90,0x3C,0x08,0x75,0x24,0x4F,0x90,0x8B,0x36,0xFE,0x79,0x8B,0xC7,
14260x2B,0xC6,0x3D,0x00,0x01,0x72,0xA5,0x3D,0x10,0x01,0x72,0x04,0x83,0xEE,0x20,0x90,
14270x83,0xC6,0x10,0x89,0x36,0xFE,0x79,0x57,0x8B,0xFE,0xEB,0x80,0x3C,0x2E,0x75,0x08,
14280xBA,0x01,0x13,0xE8,0x6A,0x00,0x07,0xC3,0xC6,0x06,0x0A,0x7A,0x02,0x32,0xC9,0x90,
14290x3C,0x30,0x72,0x4C,0x3C,0x39,0x76,0x0C,0x24,0x5F,0x3C,0x41,0x72,0x42,0x3C,0x46,
14300x77,0x3E,0x2C,0x07,0x2C,0x30,0x50,0xE8,0xCC,0x08,0x58,0x02,0xC8,0xFE,0x0E,0x0A,
14310x7A,0x74,0x0F,0xC0,0xE1,0x04,0xE8,0x2F,0x09,0xE8,0x1E,0x09,0x0A,0xC0,0x74,0xF6,
14320xEB,0xCE,0x26,0x88,0x0D,0xE8,0xE0,0x07,0x8A,0xD0,0xE8,0x23,0x00,0x8A,0xC1,0x3C,
14330x20,0x72,0x05,0x3C,0x7E,0x76,0x03,0x90,0xB0,0x2E,0xE8,0xD5,0x08,0xE9,0x70,0xFF,
14340xE8,0xC5,0x07,0xE8,0x0A,0x00,0x26,0x8A,0x05,0xE8,0x7C,0x08,0xE9,0x1D,0xFF,0x90,
14350xF6,0x06,0x26,0x7A,0x02,0x75,0x02,0x86,0xF2,0x52,0x8B,0x36,0x1A,0x7A,0xE8,0x0D,
14360x08,0x5A,0x52,0x8A,0xC6,0x02,0x06,0x24,0x7A,0xF6,0x06,0x26,0x7A,0x01,0x75,0x06,
14370xE8,0x9F,0x08,0xEB,0x0D,0x90,0x32,0xE4,0xE8,0x0D,0x08,0x8B,0x36,0x1C,0x7A,0xE8,
14380xEC,0x07,0x5A,0x8A,0xC2,0x02,0x06,0x25,0x7A,0xF6,0x06,0x26,0x7A,0x01,0x75,0x06,
14390xE8,0x7F,0x08,0xEB,0x06,0x90,0x32,0xE4,0xE8,0xED,0x07,0x8B,0x36,0x1E,0x7A,0xE8,
14400xCC,0x07,0xC3,0x90,0x06,0x8E,0x06,0x04,0x7A,0x8B,0x3E,0x02,0x7A,0xE8,0x3C,0x07,
14410x89,0x3E,0x02,0x7A,0x8C,0x06,0x04,0x7A,0x07,0xFF,0x1E,0x02,0x7A,0xC3,0xBE,0x97,
14420x4D,0xE8,0xAA,0x07,0xCB,0x90,0x06,0x57,0xBE,0xD7,0x79,0xE8,0x66,0x07,0x8B,0xD8,
14430xE8,0x61,0x07,0x8B,0xC8,0x2B,0xCB,0x78,0x11,0x8E,0xC3,0xBF,0x00,0x00,0xB8,0xFF,
14440xFF,0x51,0xB9,0x08,0x00,0xF3,0xAB,0x59,0xE2,0xF7,0x5F,0x07,0xC3,0x90,0x06,0xBE,
14450xD7,0x79,0xE8,0x3F,0x07,0x8B,0xD8,0xD1,0xE3,0x2E,0x8B,0x9F,0x44,0x00,0xBE,0x26,
14460x52,0xE8,0xF1,0x08,0x8B,0xC3,0xE8,0xDD,0x08,0xB8,0x01,0x00,0xE8,0x73,0xF2,0xE8,
14470xE0,0x08,0xBE,0x2F,0x52,0xE8,0xDD,0x08,0x8B,0x47,0x18,0xE8,0xC8,0x08,0xBE,0x77,
14480x52,0xE8,0xD1,0x08,0x8B,0x47,0x26,0xE8,0xBC,0x08,0xBE,0x53,0x52,0xE8,0xC5,0x08,
14490x8B,0x47,0x1E,0xE8,0xB0,0x08,0xBE,0x5C,0x52,0xE8,0xB9,0x08,0x8B,0x47,0x20,0xE8,
14500xA4,0x08,0xBE,0x6E,0x52,0xE8,0xAD,0x08,0x8B,0x47,0x24,0xE8,0x98,0x08,0xBE,0x80,
14510x52,0xE8,0xA1,0x08,0x8B,0x47,0x2A,0xE8,0x8C,0x08,0xE8,0x95,0x08,0xBE,0x38,0x52,
14520xE8,0x92,0x08,0x8B,0x07,0xE8,0x7E,0x08,0xBE,0x41,0x52,0xE8,0x87,0x08,0x8B,0x47,
14530x1A,0xE8,0x72,0x08,0xBE,0x4A,0x52,0xE8,0x7B,0x08,0x8B,0x47,0x1C,0xE8,0x66,0x08,
14540xBE,0x65,0x52,0xE8,0x6F,0x08,0x8B,0x47,0x22,0xE8,0x5A,0x08,0xE8,0x63,0x08,0xBE,
14550xD1,0x52,0xE8,0x60,0x08,0x8B,0x47,0x38,0xE8,0x4B,0x08,0xBE,0xAD,0x52,0xE8,0x54,
14560x08,0x8B,0x47,0x30,0xE8,0x3F,0x08,0xBE,0xB6,0x52,0xE8,0x48,0x08,0x8B,0x47,0x32,
14570xE8,0x33,0x08,0xBE,0xA4,0x52,0xE8,0x3C,0x08,0x8B,0x47,0x2E,0xE8,0x27,0x08,0xBE,
14580xBF,0x52,0xE8,0x30,0x08,0x8B,0x47,0x34,0xE8,0x1B,0x08,0xE8,0x24,0x08,0xBE,0x89,
14590x52,0xE8,0x21,0x08,0x8B,0x47,0x04,0xE8,0x0C,0x08,0xBE,0x92,0x52,0xE8,0x15,0x08,
14600x8B,0x47,0x14,0xE8,0x00,0x08,0xBE,0x9B,0x52,0xE8,0x09,0x08,0x8B,0x47,0x2C,0xE8,
14610xF4,0x07,0xBE,0xC8,0x52,0xE8,0xFD,0x07,0x8B,0x47,0x36,0xE8,0xE8,0x07,0xBE,0xDA,
14620x52,0xE8,0xF1,0x07,0x8B,0x47,0x3A,0xE8,0xDC,0x07,0xBE,0xE3,0x52,0xE8,0xE5,0x07,
14630x8B,0x47,0x3C,0xE8,0xD0,0x07,0xE8,0xD9,0x07,0xBE,0x19,0x53,0xE8,0xD6,0x07,0x8B,
14640x47,0x48,0xE8,0xC1,0x07,0xBE,0xFE,0x52,0xE8,0xCA,0x07,0x8B,0x47,0x42,0xE8,0xB5,
14650x07,0xBE,0x07,0x53,0xE8,0xBE,0x07,0x8B,0x47,0x44,0xE8,0xA9,0x07,0xBE,0x7C,0x53,
14660xE8,0xB2,0x07,0x8B,0x47,0x4C,0xE8,0x9D,0x07,0xBE,0x85,0x53,0xE8,0xA6,0x07,0x8B,
14670x47,0x4E,0xE8,0x91,0x07,0xBE,0x8E,0x53,0xE8,0x9A,0x07,0x8B,0x47,0x50,0xE8,0x85,
14680x07,0xE8,0x8E,0x07,0xBE,0x22,0x53,0xE8,0x8B,0x07,0x8B,0x47,0x4A,0xE8,0x76,0x07,
14690xBE,0xEC,0x52,0xE8,0x7F,0x07,0x8B,0x47,0x08,0xE8,0x6A,0x07,0xBE,0xF5,0x52,0xE8,
14700x73,0x07,0x8B,0x47,0x40,0xE8,0x5E,0x07,0xBE,0x10,0x53,0xE8,0x67,0x07,0x8B,0x47,
14710x46,0xE8,0x52,0x07,0xE8,0x5B,0x07,0xBE,0x6A,0x53,0xE8,0x58,0x07,0x8B,0x47,0x7A,
14720xE8,0x43,0x07,0xBE,0x3D,0x53,0xE8,0x4C,0x07,0x8B,0x47,0x70,0xE8,0x37,0x07,0xBE,
14730x46,0x53,0xE8,0x40,0x07,0x8B,0x47,0x72,0xE8,0x2B,0x07,0xBE,0x4F,0x53,0xE8,0x34,
14740x07,0x8B,0x47,0x74,0xE8,0x1F,0x07,0xE8,0x28,0x07,0xBE,0x2B,0x53,0xE8,0x25,0x07,
14750x8B,0x47,0x0C,0xE8,0x10,0x07,0xBE,0x34,0x53,0xE8,0x19,0x07,0x8B,0x47,0x10,0xE8,
14760x04,0x07,0xBE,0x58,0x53,0xE8,0x0D,0x07,0x8B,0x47,0x76,0xE8,0xF8,0x06,0xBE,0x61,
14770x53,0xE8,0x01,0x07,0x8B,0x47,0x78,0xE8,0xEC,0x06,0xBE,0x73,0x53,0xE8,0xF5,0x06,
14780x8B,0x47,0x3E,0xE8,0xE0,0x06,0xE8,0xE9,0x06,0xBE,0x97,0x53,0xE8,0xE6,0x06,0x8B,
14790x47,0x52,0xE8,0xD1,0x06,0xBE,0xA0,0x53,0xE8,0xDA,0x06,0x8B,0x47,0x54,0xE8,0xC5,
14800x06,0xBE,0xA9,0x53,0xE8,0xCE,0x06,0x8B,0x47,0x56,0xE8,0xB9,0x06,0xBE,0xB2,0x53,
14810xE8,0xC2,0x06,0x8B,0x47,0x58,0xE8,0xAD,0x06,0xBE,0xBB,0x53,0xE8,0xB6,0x06,0x8B,
14820x47,0x5A,0xE8,0xA1,0x06,0xBE,0xC4,0x53,0xE8,0xAA,0x06,0x8B,0x47,0x5C,0xE8,0x95,
14830x06,0xE8,0x9E,0x06,0xBE,0xCD,0x53,0xE8,0x9B,0x06,0x8B,0x47,0x5E,0xE8,0x86,0x06,
14840xBE,0xD6,0x53,0xE8,0x8F,0x06,0x8B,0x47,0x60,0xE8,0x7A,0x06,0xBE,0xDF,0x53,0xE8,
14850x83,0x06,0x8B,0x47,0x62,0xE8,0x6E,0x06,0xBE,0xE8,0x53,0xE8,0x77,0x06,0x8B,0x47,
14860x7C,0xE8,0x62,0x06,0xBE,0xF1,0x53,0xE8,0x6B,0x06,0x8B,0x47,0x7E,0xE8,0x56,0x06,
14870xBE,0xFA,0x53,0xE8,0x5F,0x06,0x8B,0x87,0x80,0x00,0xE8,0x49,0x06,0xE8,0x52,0x06,
14880xBE,0x42,0x54,0xE8,0x4F,0x06,0x8B,0x87,0x9E,0x00,0xE8,0x39,0x06,0xBE,0x03,0x54,
14890xE8,0x42,0x06,0x8B,0x47,0x64,0xE8,0x2D,0x06,0xBE,0x0C,0x54,0xE8,0x36,0x06,0x8B,
14900x47,0x6E,0xE8,0x21,0x06,0xBE,0x15,0x54,0xE8,0x2A,0x06,0x8B,0x87,0x8E,0x00,0xE8,
14910x14,0x06,0xBE,0x1E,0x54,0xE8,0x1D,0x06,0x8B,0x87,0x90,0x00,0xE8,0x07,0x06,0xBE,
14920x27,0x54,0xE8,0x10,0x06,0x8B,0x87,0x92,0x00,0xE8,0xFA,0x05,0xE8,0x03,0x06,0xBE,
14930x30,0x54,0xE8,0x00,0x06,0x8B,0x87,0x94,0x00,0xE8,0xEA,0x05,0xBE,0x39,0x54,0xE8,
14940xF3,0x05,0x8B,0x87,0x96,0x00,0xE8,0xDD,0x05,0xBE,0x6F,0x54,0xE8,0xE6,0x05,0x8B,
14950x87,0x98,0x00,0xE8,0xD0,0x05,0xBE,0x5D,0x54,0xE8,0xD9,0x05,0x8A,0x87,0xA0,0x00,
14960xE8,0xA7,0x05,0xBE,0x54,0x54,0xE8,0xCC,0x05,0x8A,0x47,0x28,0xE8,0x9B,0x05,0xBE,
14970x66,0x54,0xE8,0xC0,0x05,0x8A,0x87,0xA1,0x00,0xE8,0x8E,0x05,0xE8,0xB3,0x05,0xBE,
14980x78,0x54,0xE8,0xB0,0x05,0x8A,0x87,0xA2,0x00,0xE8,0x7E,0x05,0xBE,0x81,0x54,0xE8,
14990xA3,0x05,0x8A,0x87,0xA3,0x00,0xE8,0x71,0x05,0xBE,0x8A,0x54,0xE8,0x96,0x05,0x8A,
15000x87,0xA4,0x00,0xE8,0x64,0x05,0xBE,0x93,0x54,0xE8,0x89,0x05,0x8A,0x87,0xA5,0x00,
15010xE8,0x57,0x05,0xBE,0x9C,0x54,0xE8,0x7C,0x05,0x8A,0x87,0xA6,0x00,0xE8,0x4A,0x05,
15020xBE,0xA5,0x54,0xE8,0x6F,0x05,0x8A,0x87,0xA7,0x00,0xE8,0x3D,0x05,0xBE,0xAE,0x54,
15030xE8,0x62,0x05,0x8A,0x87,0xA8,0x00,0xE8,0x30,0x05,0xE8,0x55,0x05,0xBE,0xB7,0x54,
15040xE8,0x52,0x05,0x8A,0x87,0xA9,0x00,0xE8,0x20,0x05,0xBE,0xC0,0x54,0xE8,0x45,0x05,
15050x8A,0x87,0xAA,0x00,0xE8,0x13,0x05,0xBE,0xC9,0x54,0xE8,0x38,0x05,0x8A,0x87,0xAB,
15060x00,0xE8,0x06,0x05,0xBE,0xD2,0x54,0xE8,0x2B,0x05,0x8A,0x87,0xAD,0x00,0xE8,0xF9,
15070x04,0xBE,0xDB,0x54,0xE8,0x1E,0x05,0x8A,0x87,0xAE,0x00,0xE8,0xEC,0x04,0xBE,0xE4,
15080x54,0xE8,0x11,0x05,0x8A,0x87,0xAF,0x00,0xE8,0xDF,0x04,0xBE,0xED,0x54,0xE8,0x04,
15090x05,0x8A,0x87,0xB0,0x00,0xE8,0xD2,0x04,0xE8,0xF7,0x04,0xBE,0xF6,0x54,0xE8,0xF4,
15100x04,0x8A,0x87,0xB1,0x00,0xE8,0xC2,0x04,0xBE,0xFF,0x54,0xE8,0xE7,0x04,0x8A,0x87,
15110xB2,0x00,0xE8,0xB5,0x04,0xBE,0x08,0x55,0xE8,0xDA,0x04,0x8A,0x87,0xB3,0x00,0xE8,
15120xA8,0x04,0xBE,0x11,0x55,0xE8,0xCD,0x04,0x8A,0x87,0xBB,0x00,0xE8,0x9B,0x04,0xE8,
15130xC0,0x04,0xBE,0x1A,0x55,0xE8,0xBD,0x04,0x8A,0x87,0xBC,0x00,0xE8,0x8B,0x04,0xBE,
15140x23,0x55,0xE8,0xB0,0x04,0x8A,0x87,0xBE,0x00,0xE8,0x7E,0x04,0xBE,0x2C,0x55,0xE8,
15150xA3,0x04,0x8A,0x87,0xBF,0x00,0xE8,0x71,0x04,0xE8,0x96,0x04,0x07,0xC3,0x60,0x06,
15160x1E,0x16,0x8B,0xEC,0xFF,0x4E,0x16,0xF7,0x46,0x1A,0x00,0x02,0x74,0x01,0xFB,0xB8,
15170x00,0x00,0x8E,0xD8,0x8E,0xC0,0x89,0x2E,0x2D,0x7A,0xE8,0xCB,0x00,0x81,0x66,0x1A,
15180xFF,0xFE,0xC6,0x06,0x2A,0x7A,0x00,0xE8,0xD8,0x00,0xB8,0x00,0x5F,0xA3,0x2B,0x7A,
15190xE8,0x5D,0x00,0x80,0x3E,0x2A,0x7A,0x00,0x74,0x0A,0x81,0x4E,0x1A,0x00,0x01,0xC6,
15200x06,0x2A,0x7A,0x00,0x17,0x1F,0x07,0x61,0xCF,0x90,0x60,0x06,0x1E,0x16,0x8B,0xEC,
15210xF7,0x46,0x1A,0x00,0x02,0x74,0x01,0xFB,0xB8,0x00,0x00,0x8E,0xD8,0x8E,0xC0,0x89,
15220x2E,0x2D,0x7A,0x81,0x66,0x1A,0xFF,0xFE,0xC6,0x06,0x2A,0x7A,0x00,0xE8,0x92,0x00,
15230xB8,0x00,0x5F,0xA3,0x2B,0x7A,0xE8,0x17,0x00,0x80,0x3E,0x2A,0x7A,0x00,0x74,0x0A,
15240x81,0x4E,0x1A,0x00,0x01,0xC6,0x06,0x2A,0x7A,0x00,0x17,0x1F,0x07,0x61,0xCF,0x90,
15250xB8,0xF0,0x00,0xE8,0x8C,0xED,0xFF,0x26,0x2B,0x7A,0xC3,0x90,0x06,0x53,0x56,0x80,
15260x3E,0x29,0x7A,0x00,0x74,0x03,0xE8,0x3F,0x00,0xBE,0xD7,0x79,0xE8,0x25,0x02,0x8B,
15270xD8,0xA3,0x27,0x7A,0x2E,0x8A,0x07,0xA2,0x29,0x7A,0xB0,0xCC,0x2E,0x88,0x07,0x5E,
15280x5B,0x07,0xC3,0xC6,0x06,0x2A,0x7A,0x00,0xB8,0x0A,0x5F,0xA3,0x2B,0x7A,0xC3,0x90,
15290x8B,0x2E,0x2D,0x7A,0xE8,0x2B,0x00,0xC3,0xC6,0x06,0x2A,0x7A,0x01,0xE8,0x08,0x00,
15300xB8,0x0A,0x5F,0xA3,0x2B,0x7A,0xC3,0x90,0x57,0x80,0x3E,0x29,0x7A,0x00,0x74,0x0F,
15310x8B,0x3E,0x27,0x7A,0xA0,0x29,0x7A,0x2E,0x88,0x05,0xC6,0x06,0x29,0x7A,0x00,0x5F,
15320xC3,0x90,0xBE,0xB2,0x4D,0xE8,0x06,0x02,0xBE,0xD8,0x51,0xE8,0x00,0x02,0xFF,0x76,
15330x14,0x58,0xE8,0x47,0x02,0xBE,0xDE,0x51,0xE8,0xF3,0x01,0xFF,0x76,0x0E,0x58,0xE8,
15340x3A,0x02,0xBE,0xE4,0x51,0xE8,0xE6,0x01,0xFF,0x76,0x12,0x58,0xE8,0x2D,0x02,0xBE,
15350xEA,0x51,0xE8,0xD9,0x01,0xFF,0x76,0x10,0x58,0xE8,0x20,0x02,0xBE,0x14,0x52,0xE8,
15360xCC,0x01,0xFF,0x76,0x0A,0x58,0xE8,0x13,0x02,0xBE,0x1A,0x52,0xE8,0xBF,0x01,0xFF,
15370x76,0x0C,0x58,0xE8,0x06,0x02,0xBE,0xCF,0x51,0xE8,0xB2,0x01,0xFF,0x76,0x1A,0x58,
15380xE8,0xF9,0x01,0xBE,0xB2,0x4D,0xE8,0xA5,0x01,0xBE,0xF0,0x51,0xE8,0x9F,0x01,0xFF,
15390x76,0x18,0x58,0xE8,0xE6,0x01,0xBE,0xF6,0x51,0xE8,0x92,0x01,0xFF,0x76,0x02,0x58,
15400xE8,0xD9,0x01,0xBE,0xFC,0x51,0xE8,0x85,0x01,0xFF,0x76,0x04,0x58,0xE8,0xCC,0x01,
15410xBE,0x02,0x52,0xE8,0x78,0x01,0xFF,0x76,0x00,0x58,0xE8,0xBF,0x01,0xBE,0x08,0x52,
15420xE8,0x6B,0x01,0xFF,0x76,0x06,0x58,0xE8,0xB2,0x01,0xBE,0x0E,0x52,0xE8,0x5E,0x01,
15430xFF,0x76,0x08,0x58,0xE8,0xA5,0x01,0xBE,0x20,0x52,0xE8,0x51,0x01,0xFF,0x76,0x16,
15440x58,0xE8,0x98,0x01,0xBE,0x89,0x4D,0xE8,0x44,0x01,0xC3,0x90,0xBE,0xC9,0x4D,0xE8,
15450x3C,0x01,0xC3,0x3C,0x00,0x74,0x05,0x3C,0x01,0x74,0x59,0xC3,0xC7,0x06,0x0C,0x7A,
15460xCD,0x50,0xC7,0x06,0x0E,0x7A,0xF0,0x50,0xC7,0x06,0x10,0x7A,0xE8,0x50,0xC7,0x06,
15470x12,0x7A,0xEC,0x50,0xC7,0x06,0x14,0x7A,0xF4,0x50,0xC7,0x06,0x16,0x7A,0xFB,0x50,
15480xC7,0x06,0x18,0x7A,0x03,0x51,0xC7,0x06,0x1A,0x7A,0x0B,0x51,0xC7,0x06,0x1C,0x7A,
15490x0E,0x51,0xC7,0x06,0x1E,0x7A,0x10,0x51,0xC7,0x06,0x20,0x7A,0x12,0x51,0xC7,0x06,
15500x22,0x7A,0x16,0x51,0xC6,0x06,0x24,0x7A,0x01,0xC6,0x06,0x25,0x7A,0x01,0xC6,0x06,
15510x26,0x7A,0x03,0xC3,0xC7,0x06,0x0C,0x7A,0x1A,0x51,0xC7,0x06,0x0E,0x7A,0x4D,0x51,
15520xC7,0x06,0x10,0x7A,0x47,0x51,0xC7,0x06,0x12,0x7A,0x4A,0x51,0xC7,0x06,0x14,0x7A,
15530x4F,0x51,0xC7,0x06,0x16,0x7A,0x51,0x51,0xC7,0x06,0x18,0x7A,0x55,0x51,0xC7,0x06,
15540x1A,0x7A,0x56,0x51,0xC7,0x06,0x1C,0x7A,0x59,0x51,0xC7,0x06,0x1E,0x7A,0x5A,0x51,
15550xC7,0x06,0x20,0x7A,0x5B,0x51,0xC7,0x06,0x22,0x7A,0x5E,0x51,0xC6,0x06,0x24,0x7A,
15560x20,0xC6,0x06,0x25,0x7A,0x20,0xC6,0x06,0x26,0x7A,0x02,0xC3,0xA1,0xF8,0x79,0x48,
15570x74,0x14,0xBE,0xD7,0x79,0xE8,0x3C,0x00,0x8B,0xF8,0xAC,0x3C,0x3A,0x75,0x07,0x8E,
15580xC7,0xE8,0x30,0x00,0x8B,0xF8,0xC3,0x90,0x8B,0xC7,0x2B,0x06,0xFE,0x79,0x8A,0xF0,
15590x24,0x0F,0x8A,0xD0,0x02,0xD0,0x02,0xD0,0x80,0xC2,0x0B,0xC0,0xEE,0x04,0x80,0xC6,
15600x03,0x04,0x3D,0xC3,0x8C,0xC0,0xE8,0x93,0x00,0xB0,0x3A,0xE8,0xE4,0x00,0x8B,0xC7,
15610xE8,0x89,0x00,0xC3,0x51,0x33,0xC9,0x90,0xAC,0x3C,0x20,0x74,0xFB,0x90,0x0A,0xC0,
15620x74,0x26,0x2C,0x30,0x72,0x22,0x3C,0x09,0x76,0x14,0x3C,0x11,0x72,0x1A,0x2C,0x07,
15630x3C,0x0F,0x76,0x0A,0x3C,0x2A,0x72,0x10,0x2C,0x20,0x3C,0x0F,0x77,0x0A,0x98,0xC1,
15640xE1,0x04,0x03,0xC8,0xAC,0xEB,0xD7,0x90,0x4E,0x8B,0xC1,0x59,0xC3,0x90,0x06,0x8C,
15650xC8,0x8E,0xC0,0xE8,0x02,0x00,0x07,0xC3,0x26,0x8A,0x04,0x46,0x0A,0xC0,0x74,0x06,
15660xE8,0x8F,0x00,0xEB,0xF3,0x90,0xC3,0x90,0x0B,0xC0,0x74,0x7A,0x51,0x33,0xD2,0xB9,
15670xE8,0x03,0xF7,0xF1,0x8B,0xCA,0xE8,0x03,0x00,0x8B,0xC1,0x59,0xBA,0x64,0x00,0xF6,
15680xF2,0xE8,0x0C,0x00,0x8A,0xC4,0x98,0xB2,0x0A,0xF6,0xF2,0xE8,0x02,0x00,0x8A,0xC4,
15690x50,0x0A,0xF0,0x74,0x05,0x04,0x30,0xE8,0x58,0x00,0x58,0xC3,0x86,0xC4,0xE8,0x07,
15700x00,0x86,0xC4,0xE8,0x02,0x00,0xC3,0x90,0xC1,0xC8,0x04,0xE8,0x08,0x00,0xC1,0xC0,
15710x04,0xE8,0x02,0x00,0xC3,0x90,0x53,0x50,0x24,0x0F,0xBB,0xCA,0x62,0x2E,0xD7,0xE8,
15720x30,0x00,0x58,0x5B,0xC3,0x90,0x86,0xC4,0xE8,0x07,0x00,0x86,0xC4,0xE8,0x02,0x00,
15730xC3,0x90,0x50,0xB9,0x08,0x00,0x8A,0xE0,0x32,0xC0,0xD1,0xC0,0x04,0x30,0xE8,0x11,
15740x00,0xE2,0xF5,0x58,0xC3,0x90,0xB0,0x30,0xE8,0x07,0x00,0xC3,0xB0,0x20,0xE8,0x01,
15750x00,0xC3,0x56,0x8B,0x36,0xD0,0x79,0x88,0x84,0xD0,0x77,0x46,0x81,0xE6,0xFF,0x01,
15760xFF,0x06,0xD4,0x79,0x89,0x36,0xD0,0x79,0x81,0x3E,0xD4,0x79,0xFE,0x01,0x75,0x08,
15770x56,0xE8,0x14,0x00,0x5E,0xEB,0xF1,0x90,0x5E,0xC3,0xBA,0x02,0x02,0xEC,0x24,0x01,
15780x74,0x04,0xBA,0x06,0x02,0xEC,0xC3,0x90,0x80,0x3E,0xF6,0x79,0x00,0x74,0x09,0x60,
15790xB8,0x01,0x00,0xE8,0x2C,0xEA,0x61,0x90,0xBA,0x02,0x02,0xEC,0xA8,0x04,0x74,0x28,
15800x8B,0x36,0xD2,0x79,0x83,0x3E,0xD4,0x79,0x00,0x74,0x1D,0x8A,0x84,0xD0,0x77,0x46,
15810x81,0xE6,0xFF,0x01,0x89,0x36,0xD2,0x79,0xFF,0x0E,0xD4,0x79,0xBA,0x06,0x02,0xEE,
15820xBA,0x02,0x02,0xEC,0xA8,0x04,0x75,0xDC,0xA1,0xD4,0x79,0xC3,0x52,0xBA,0x06,0x02,
15830xEE,0x5A,0xC3,0x90,0x52,0x50,0xBA,0x02,0x02,0xEC,0xA8,0x04,0x74,0x08,0x58,0x5A,
15840xE8,0xE9,0xFF,0xF9,0xC3,0x90,0x58,0x5A,0xF8,0xC3,0x52,0x50,0xBA,0x02,0x02,0xEC,
15850xA8,0x04,0x74,0xFB,0x58,0x5A,0xE8,0xD3,0xFF,0xC3,0x30,0x31,0x32,0x33,0x34,0x35,
15860x36,0x37,0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46,0x53,0x50,0x8A,0xE0,0x80,0xE4,
15870x0F,0xBB,0xCA,0x62,0xC0,0xE8,0x04,0x2E,0xD7,0xE8,0xCE,0xFF,0x8A,0xC4,0x2E,0xD7,
15880xE8,0xC7,0xFF,0x58,0x5B,0xC3,0x86,0xE0,0xE8,0xDF,0xFF,0x86,0xE0,0xE8,0xDA,0xFF,
15890xC3,0x90,0xBE,0xB2,0x4D,0x50,0x2E,0xAC,0x3C,0x00,0x74,0x05,0xE8,0xAB,0xFF,0xEB,
15900xF5,0x58,0xC3,0x90,0xC8,0x08,0x00,0x00,0x56,0x57,0x8B,0x76,0x04,0xBF,0x04,0x00,
15910xC7,0x46,0xFC,0x00,0x00,0xC7,0x46,0xFA,0x00,0x00,0xC7,0x46,0xF8,0x00,0x00,0x83,
15920x7E,0x06,0x00,0x75,0x0E,0x56,0xE8,0xB6,0x0E,0x59,0x0B,0xC0,0x75,0x05,0x8B,0xC7,
15930xE9,0x5B,0x01,0x8B,0x46,0xFC,0x89,0x46,0xFE,0x0B,0xFF,0x75,0x05,0xB8,0x01,0x00,
15940xEB,0x02,0x33,0xC0,0x50,0x56,0xE8,0xA4,0x0D,0x59,0x59,0xB4,0x00,0x89,0x46,0xFC,
15950x8B,0x5E,0xFC,0x83,0xFB,0x08,0x76,0x03,0xE9,0x2B,0x01,0xD1,0xE3,0x2E,0xFF,0xA7,
15960xB2,0x64,0xB8,0x03,0x00,0xE9,0x26,0x01,0x83,0x7E,0xFA,0x00,0x74,0x14,0xC7,0x46,
15970xFA,0x00,0x00,0x8A,0x44,0x58,0x98,0x50,0x8A,0x44,0x59,0x98,0x50,0xE8,0xC2,0x0F,
15980x59,0x59,0x83,0x7E,0xF8,0x00,0x74,0x0A,0xC7,0x46,0xF8,0x00,0x00,0x56,0xE8,0x9B,
15990x08,0x59,0x83,0x7E,0x06,0x00,0x75,0x05,0x8B,0xC7,0xE9,0xF1,0x00,0x83,0xFF,0x04,
16000x75,0x03,0xE9,0xE6,0x00,0x8B,0xC7,0xE9,0xE4,0x00,0x83,0x7E,0xFE,0x00,0x75,0x03,
16010xBF,0x02,0x00,0xE9,0xD5,0x00,0x83,0x7E,0xFE,0x00,0x75,0x03,0xBF,0x01,0x00,0xE9,
16020xC9,0x00,0x8B,0x5E,0xFE,0x83,0xFB,0x07,0x76,0x03,0xE9,0x86,0x00,0xD1,0xE3,0x2E,
16030xFF,0xA7,0xA2,0x64,0x33,0xFF,0xE9,0x7F,0x00,0xBF,0x04,0x00,0x80,0x7C,0x58,0x0F,
16040x74,0x22,0x83,0x7E,0xF8,0x00,0x75,0x1C,0xFE,0x44,0x58,0x6A,0x08,0x56,0xE8,0x7E,
16050x0C,0x59,0x59,0x8A,0x44,0x58,0x04,0x80,0x50,0x56,0xE8,0x72,0x0C,0x59,0x59,0xC7,
16060x46,0xFA,0x01,0x00,0x83,0x7E,0xF8,0x00,0x74,0x0A,0xC7,0x46,0xF8,0x00,0x00,0x56,
16070xE8,0x19,0x08,0x59,0xEB,0x42,0xBF,0x04,0x00,0x80,0x7C,0x58,0x00,0x74,0x22,0x83,
16080x7E,0xF8,0x00,0x75,0x1C,0xFE,0x4C,0x58,0x6A,0x08,0x56,0xE8,0x41,0x0C,0x59,0x59,
16090x8A,0x44,0x58,0x04,0x80,0x50,0x56,0xE8,0x35,0x0C,0x59,0x59,0xC7,0x46,0xFA,0x01,
16100x00,0x83,0x7E,0xF8,0x00,0x74,0x0A,0xC7,0x46,0xF8,0x00,0x00,0x56,0xE8,0xDC,0x07,
16110x59,0xEB,0x05,0xBF,0x04,0x00,0xEB,0x00,0xEB,0x31,0xBF,0x04,0x00,0xEB,0x2C,0xC7,
16120x46,0xF8,0x01,0x00,0x6A,0x08,0x56,0xE8,0x05,0x0C,0x59,0x59,0x80,0x7C,0x58,0x09,
16130x7D,0x04,0xB0,0x0F,0xEB,0x02,0xB0,0x00,0x04,0x80,0x50,0x56,0xE8,0xF0,0x0B,0x59,
16140x59,0xBF,0x04,0x00,0xEB,0x05,0xBF,0x04,0x00,0xEB,0x00,0xE9,0xA5,0xFE,0x5F,0x5E,
16150xC9,0xC3,0xE4,0x63,0x63,0x64,0x63,0x64,0x63,0x64,0x63,0x64,0xE9,0x63,0x26,0x64,
16160x51,0x64,0x78,0x63,0xBA,0x63,0xC6,0x63,0x96,0x64,0xD2,0x63,0x6A,0x64,0x6A,0x64,
16170x6F,0x64,0x72,0x63,0xC8,0x08,0x00,0x00,0x56,0x57,0x8B,0x76,0x04,0x8B,0x7E,0x08,
16180x6A,0x01,0x56,0xE8,0xA9,0x0B,0x59,0x59,0x8A,0x46,0x06,0xC0,0xE0,0x06,0x04,0x80,
16190x50,0x56,0xE8,0x9A,0x0B,0x59,0x59,0xC7,0x46,0xFE,0x00,0x00,0x89,0x7E,0xF8,0xEB,
16200x03,0xFF,0x46,0xFE,0x8B,0x5E,0xF8,0xFF,0x46,0xF8,0x80,0x3F,0x00,0x75,0xF2,0x83,
16210x7E,0xFE,0x10,0x7D,0x25,0xB8,0x10,0x00,0x2B,0x46,0xFE,0xD1,0xF8,0x89,0x46,0xFC,
16220xC7,0x46,0xFA,0x00,0x00,0xEB,0x0B,0x6A,0x20,0x56,0xE8,0x62,0x0B,0x59,0x59,0xFF,
16230x46,0xFA,0x8B,0x46,0xFA,0x3B,0x46,0xFC,0x7C,0xED,0xEB,0x0C,0x8B,0xDF,0x47,0x8A,
16240x07,0x50,0x56,0xE8,0x49,0x0B,0x59,0x59,0x80,0x3D,0x00,0x75,0xEF,0x6A,0x02,0x56,
16250xE8,0x3C,0x0B,0x59,0x59,0xEB,0x00,0x5F,0x5E,0xC9,0xC3,0xC8,0x04,0x00,0x00,0x56,
16260x57,0x8B,0x7E,0x04,0xC7,0x46,0xFE,0x00,0x00,0xBE,0x14,0x00,0xE9,0x09,0x01,0x8B,
16270x5E,0xFE,0x83,0xC3,0x04,0x2B,0xDF,0x8A,0x87,0xAC,0x0B,0x88,0x44,0x5A,0xC6,0x44,
16280x58,0x08,0x8A,0x46,0xFE,0x88,0x44,0x59,0xC7,0x44,0x06,0x00,0x00,0xC6,0x44,0x19,
16290x00,0xC6,0x44,0x1A,0x00,0xC6,0x44,0x1B,0x00,0xC6,0x44,0x1D,0x0D,0xC6,0x44,0x1E,
16300x03,0xC6,0x44,0x1F,0x00,0xC6,0x44,0x20,0x00,0xC6,0x44,0x21,0x00,0xC6,0x44,0x5B,
16310x00,0xC6,0x44,0x5D,0x00,0xC6,0x44,0x5E,0x00,0xC6,0x44,0x5F,0x00,0xC6,0x44,0x60,
16320x00,0xC7,0x46,0xFC,0x00,0x00,0xEB,0x0D,0x8B,0x5E,0xFC,0xD1,0xE3,0xC7,0x40,0x30,
16330x00,0x00,0xFF,0x46,0xFC,0x83,0x7E,0xFC,0x10,0x7C,0xED,0xC7,0x46,0xFC,0x00,0x00,
16340xEB,0x0A,0x8B,0x5E,0xFC,0xC6,0x40,0x50,0x00,0xFF,0x46,0xFC,0x83,0x7E,0xFC,0x04,
16350x7C,0xF0,0xC7,0x44,0x54,0x00,0x00,0xC7,0x44,0x56,0x00,0x00,0x8A,0x44,0x5A,0x98,
16360xBA,0xF8,0x00,0x23,0xD0,0xB8,0x05,0x00,0x0B,0xC2,0x89,0x46,0xFC,0x9C,0xFA,0x8A,
16370x46,0xFC,0xBA,0xFE,0x00,0xEE,0xBA,0x00,0x00,0xEC,0x9D,0x24,0x08,0x88,0x46,0xFC,
16380x83,0x7E,0xFC,0x00,0x75,0x02,0xEB,0x4A,0xFF,0x76,0xFE,0xE8,0x7A,0x0C,0x59,0x68,
16390x35,0x02,0x56,0xE8,0x32,0x0A,0x59,0x59,0x0B,0xC0,0x75,0x34,0x68,0x38,0x02,0x56,
16400xE8,0x25,0x0A,0x59,0x59,0x0B,0xC0,0x75,0x27,0x68,0x42,0x02,0x56,0xE8,0x18,0x0A,
16410x59,0x59,0x0B,0xC0,0x75,0x1A,0x68,0x4C,0x02,0x56,0xE8,0x0B,0x0A,0x59,0x59,0x0B,
16420xC0,0x75,0x0D,0x68,0x56,0x02,0x56,0xE8,0xFE,0x09,0x59,0x59,0x0B,0xC0,0x74,0x02,
16430xEB,0x00,0xFF,0x46,0xFE,0x83,0xC6,0x62,0x39,0x7E,0xFE,0x7D,0x03,0xE9,0xEF,0xFE,
16440xEB,0x00,0x5F,0x5E,0xC9,0xC3,0xC8,0x08,0x00,0x00,0x56,0x57,0x8B,0x46,0x04,0xBA,
16450x62,0x00,0xF7,0xEA,0x05,0x14,0x00,0x8B,0xF0,0x83,0x7E,0x06,0x00,0x74,0x05,0xB8,
16460x10,0x00,0xEB,0x03,0xB8,0x08,0x00,0x89,0x44,0x04,0x8A,0x46,0x08,0x88,0x44,0x5C,
16470x56,0xE8,0x59,0x04,0x59,0x8B,0xF8,0x8B,0xC7,0x89,0x44,0x56,0x89,0x44,0x54,0x8A,
16480x44,0x5D,0x88,0x44,0x2F,0x0B,0xFF,0x75,0x1D,0x68,0xC2,0x0F,0x6A,0x01,0x56,0xE8,
16490x02,0xFE,0x83,0xC4,0x06,0xEB,0x00,0x6A,0x01,0x56,0xE8,0x47,0xFC,0x59,0x59,0x0B,
16500xC0,0x75,0xF4,0xBF,0x01,0x00,0x89,0x7E,0xFA,0xB9,0x05,0x00,0xBB,0xE9,0x6A,0x2E,
16510x8B,0x07,0x3B,0x46,0xFA,0x74,0x07,0x43,0x43,0xE2,0xF4,0xE9,0xA4,0x03,0x2E,0xFF,
16520x67,0x0A,0xC7,0x44,0x06,0x02,0x00,0xC7,0x44,0x08,0xF4,0x08,0x8B,0x5E,0x04,0xD1,
16530xE3,0x8B,0x87,0xFC,0x08,0x89,0x44,0x0A,0x33,0xC0,0x8B,0xF8,0x89,0x44,0x54,0xE9,
16540x80,0x03,0x56,0xE8,0xBB,0x05,0x59,0xBF,0x01,0x00,0x8A,0x44,0x5D,0x88,0x44,0x60,
16550xE9,0x6F,0x03,0x83,0x7C,0x04,0x08,0x75,0x30,0x80,0x7C,0x5C,0x01,0x75,0x15,0x8A,
16560x44,0x5D,0xB4,0x00,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0xE4,0x08,0x56,0xE8,0xF7,0x08,
16570x59,0x59,0xEB,0x13,0x8A,0x44,0x5D,0xB4,0x00,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0xC4,
16580x08,0x56,0xE8,0xE2,0x08,0x59,0x59,0xEB,0x2E,0x80,0x7C,0x5C,0x01,0x75,0x15,0x8A,
16590x44,0x5D,0xB4,0x00,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0xD4,0x08,0x56,0xE8,0xC7,0x08,
16600x59,0x59,0xEB,0x13,0x8A,0x44,0x5D,0xB4,0x00,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0xB4,
16610x08,0x56,0xE8,0xB2,0x08,0x59,0x59,0x6A,0x01,0x56,0xE8,0x87,0xFB,0x59,0x59,0x8B,
16620xD8,0x83,0xFB,0x03,0x77,0x2A,0xD1,0xE3,0x2E,0xFF,0xA7,0xE1,0x6A,0xBF,0x01,0x00,
16630x8A,0x44,0x5D,0x88,0x44,0x5E,0xEB,0x18,0x8A,0x44,0x5D,0x04,0xFF,0x24,0x07,0x88,
16640x44,0x5D,0xEB,0x0C,0x8A,0x44,0x5D,0xFE,0xC0,0x24,0x07,0x88,0x44,0x5D,0xEB,0x00,
16650xE9,0xCF,0x02,0x8A,0x44,0x5D,0xB4,0x00,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0xFD,0x02,
16660x56,0xE8,0x63,0x08,0x59,0x59,0x68,0x1D,0x03,0x56,0xE8,0x5A,0x08,0x59,0x59,0x6A,
16670x01,0x56,0xE8,0x2F,0xFB,0x59,0x59,0x8B,0xD8,0x83,0xFB,0x03,0x77,0x36,0xD1,0xE3,
16680x2E,0xFF,0xA7,0xD9,0x6A,0xBF,0x01,0x00,0x8A,0x44,0x5D,0x88,0x44,0x5F,0xEB,0x24,
16690x8A,0x44,0x5D,0x04,0xFF,0x8A,0x54,0x04,0x80,0xC2,0xFF,0x22,0xC2,0x88,0x44,0x5D,
16700xEB,0x12,0x8A,0x44,0x5D,0xFE,0xC0,0x8A,0x54,0x04,0x80,0xC2,0xFF,0x22,0xC2,0x88,
16710x44,0x5D,0xEB,0x00,0xE9,0x6B,0x02,0x8B,0x5C,0x06,0x83,0xC3,0xFE,0xD1,0xE3,0x8B,
16720x40,0x08,0x89,0x04,0x8B,0x1C,0xFF,0x77,0x06,0x6A,0x00,0x56,0xE8,0x85,0xFC,0x83,
16730xC4,0x06,0x8B,0x5C,0x06,0x4B,0xD1,0xE3,0x8B,0x40,0x08,0x89,0x44,0x02,0x8B,0x5C,
16740x02,0xFF,0x77,0x06,0x6A,0x01,0x56,0xE8,0x6A,0xFC,0x83,0xC4,0x06,0x6A,0x01,0x56,
16750xE8,0xB1,0xFA,0x59,0x59,0x8B,0xD8,0x83,0xFB,0x03,0x76,0x03,0xE9,0x1F,0x02,0xD1,
16760xE3,0x2E,0xFF,0xA7,0xD1,0x6A,0x8B,0x5C,0x02,0x8B,0x47,0x04,0x89,0x44,0x02,0x8B,
16770x5C,0x02,0x80,0x3F,0x44,0x75,0x0D,0x8B,0x5C,0x02,0x8A,0x47,0x01,0xB4,0x00,0x3B,
16780x44,0x04,0x7D,0xE2,0x8B,0x46,0x04,0xD1,0xE0,0x8B,0x1C,0x03,0xD8,0x8B,0x44,0x02,
16790x89,0x47,0x08,0x8B,0x5C,0x06,0x4B,0xD1,0xE3,0x8B,0x44,0x02,0x89,0x40,0x08,0xE9,
16800xDE,0x01,0x8B,0x5C,0x02,0x8B,0x47,0x02,0x89,0x44,0x02,0x8B,0x5C,0x02,0x80,0x3F,
16810x44,0x75,0x0D,0x8B,0x5C,0x02,0x8A,0x47,0x01,0xB4,0x00,0x3B,0x44,0x04,0x7D,0xE2,
16820x8B,0x46,0x04,0xD1,0xE0,0x8B,0x1C,0x03,0xD8,0x8B,0x44,0x02,0x89,0x47,0x08,0x8B,
16830x5C,0x06,0x4B,0xD1,0xE3,0x8B,0x44,0x02,0x89,0x40,0x08,0xE9,0xA2,0x01,0xBF,0x01,
16840x00,0xE9,0x9C,0x01,0x8B,0x5C,0x02,0x8A,0x07,0xB4,0x00,0x89,0x46,0xF8,0xB9,0x0C,
16850x00,0xBB,0xA1,0x6A,0x2E,0x8B,0x07,0x3B,0x46,0xF8,0x74,0x07,0x43,0x43,0xE2,0xF4,
16860xE9,0x77,0x01,0x2E,0xFF,0x67,0x18,0x8B,0x46,0x04,0xD1,0xE0,0x8B,0x5C,0x02,0x03,
16870xD8,0x8B,0x47,0x08,0x8B,0x5C,0x06,0xFF,0x44,0x06,0xD1,0xE3,0x89,0x40,0x08,0x8B,
16880x1C,0x80,0x7F,0x01,0x00,0x74,0x12,0x8B,0x5C,0x02,0x8A,0x47,0x01,0x8B,0x1C,0x8A,
16890x57,0x01,0xB6,0x00,0x8B,0xDA,0x88,0x40,0x18,0xE9,0x40,0x01,0xFF,0x4C,0x06,0xE9,
16900x3A,0x01,0x8B,0x5C,0x02,0x8A,0x47,0x01,0x8B,0x1C,0x8A,0x57,0x01,0xB6,0x00,0x8B,
16910xDA,0x88,0x40,0x18,0xE9,0x25,0x01,0x8B,0x5C,0x02,0x8A,0x47,0x01,0x8B,0x1C,0x8A,
16920x57,0x01,0xB6,0x00,0x8B,0xDA,0x88,0x40,0x18,0xFF,0x4C,0x06,0xE9,0x0D,0x01,0x8B,
16930x5C,0x02,0x8A,0x47,0x01,0x8B,0x1C,0x8A,0x57,0x01,0xB6,0x00,0x8B,0xDA,0x30,0x40,
16940x18,0xE9,0xF8,0x00,0xB8,0xF0,0x10,0x8B,0xF8,0x89,0x44,0x54,0x8A,0x44,0x5F,0x88,
16950x44,0x5D,0xE9,0xE7,0x00,0x8A,0x44,0x1C,0x98,0x3D,0x02,0x00,0x74,0x07,0x3D,0x03,
16960x00,0x74,0x02,0xEB,0x07,0xC7,0x46,0xFE,0x00,0x00,0xEB,0x2B,0x8A,0x44,0x1C,0x98,
16970xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0x69,0x02,0x56,0xE8,0x6B,0x06,0x59,0x59,0x6A,0x01,
16980x56,0xE8,0x40,0xF9,0x59,0x59,0x89,0x46,0xFE,0x83,0x7E,0xFE,0x00,0x74,0x06,0x83,
16990x7E,0xFE,0x03,0x75,0xE9,0xEB,0x00,0x83,0x7E,0xFE,0x03,0x74,0x62,0x8A,0x44,0x1C,
17000x98,0xD1,0xE0,0x8B,0xD8,0xFF,0xB7,0x6D,0x02,0x56,0xE8,0x3A,0x06,0x59,0x59,0x56,
17010xE8,0x4D,0x97,0x59,0x89,0x46,0xFC,0x8B,0x5E,0xFC,0x83,0xEB,0xFE,0x83,0xFB,0x03,
17020x77,0x33,0xD1,0xE3,0x2E,0xFF,0xA7,0x99,0x6A,0x68,0xAC,0x02,0x56,0xE8,0x17,0x06,
17030x59,0x59,0xEB,0x23,0x68,0x8F,0x02,0x56,0xE8,0x0C,0x06,0x59,0x59,0xEB,0x18,0x68,
17040x75,0x02,0x56,0xE8,0x01,0x06,0x59,0x59,0xEB,0x0D,0x68,0xC6,0x02,0x56,0xE8,0xF6,
17050x05,0x59,0x59,0xEB,0x02,0xEB,0x00,0x6A,0x01,0x56,0xE8,0xC7,0xF8,0x59,0x59,0xBF,
17060x01,0x00,0xEB,0x38,0x68,0xDD,0x02,0x56,0xE8,0xDC,0x05,0x59,0x59,0x6A,0x01,0x56,
17070xE8,0xB1,0xF8,0x59,0x59,0xBF,0x01,0x00,0xEB,0x22,0xB8,0xD0,0x30,0x8B,0xF8,0x89,
17080x44,0x54,0x8A,0x44,0x60,0x88,0x44,0x5D,0xEB,0x12,0xB8,0xE0,0x20,0x8B,0xF8,0x89,
17090x44,0x54,0x8A,0x44,0x5E,0x88,0x44,0x5D,0xEB,0x02,0xEB,0x00,0xEB,0x02,0xEB,0x00,
17100xEB,0x00,0xE9,0x41,0xFC,0x5F,0x5E,0xC9,0xC3,0x19,0x6A,0x24,0x6A,0x2F,0x6A,0x3A,
17110x6A,0x00,0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x41,0x00,0x42,0x00,0x43,0x00,0x44,
17120x00,0x80,0x00,0x81,0x00,0x82,0x00,0xFF,0x00,0x17,0x69,0x54,0x6A,0x7A,0x6A,0xA5,
17130x69,0x52,0x69,0x94,0x69,0x6A,0x6A,0x67,0x69,0x52,0x69,0x7F,0x69,0x67,0x69,0x4C,
17140x69,0xF4,0x68,0x76,0x68,0xB2,0x68,0xEE,0x68,0xF5,0x67,0x00,0x68,0x12,0x68,0xF5,
17150x67,0x9D,0x67,0xA8,0x67,0xB4,0x67,0x9D,0x67,0x00,0x00,0x01,0x00,0xF0,0x10,0xE0,
17160x20,0xD0,0x30,0x27,0x68,0xF2,0x66,0xC3,0x67,0x23,0x67,0x12,0x67,0xC8,0x04,0x00,
17170x00,0x56,0x57,0x8B,0x76,0x04,0x8A,0x44,0x59,0x98,0x89,0x46,0xFC,0x6A,0x09,0x8B,
17180x46,0xFC,0x05,0x84,0x01,0x50,0xE8,0x93,0x08,0x59,0x59,0x8B,0xF8,0x8B,0xC7,0x25,
17190x00,0xF0,0x3D,0x00,0x10,0x75,0x55,0x8B,0xC7,0x25,0xF0,0x00,0x3D,0xF0,0x00,0x75,
17200x4B,0x8B,0xC7,0x25,0x00,0x0F,0xC1,0xF8,0x08,0x89,0x46,0xFE,0x8B,0x44,0x04,0x3B,
17210x46,0xFE,0x7D,0x05,0x33,0xC0,0xE9,0xEF,0x00,0x8B,0xC7,0x25,0x0F,0x00,0xBA,0x0F,
17220x00,0x2B,0xD0,0x3B,0x56,0xFE,0x74,0x05,0x33,0xC0,0xE9,0xDB,0x00,0xC7,0x44,0x02,
17230x04,0x09,0x8A,0x46,0xFE,0x88,0x44,0x5F,0x88,0x44,0x5D,0x8B,0x5E,0xFC,0xD1,0xE3,
17240xC7,0x87,0xFC,0x08,0x04,0x09,0xB8,0xF0,0x10,0xE9,0xBC,0x00,0x8B,0xC7,0x25,0x00,
17250xF0,0x3D,0x00,0x20,0x75,0x52,0x8B,0xC7,0x25,0xF0,0x00,0x3D,0xE0,0x00,0x75,0x48,
17260x8B,0xC7,0x25,0x00,0x0F,0xC1,0xF8,0x08,0x89,0x46,0xFE,0x83,0x7E,0xFE,0x08,0x7E,
17270x05,0x33,0xC0,0xE9,0x92,0x00,0x8B,0xC7,0x25,0x0F,0x00,0xBA,0x0F,0x00,0x2B,0xD0,
17280x3B,0x56,0xFE,0x74,0x05,0x33,0xC0,0xEB,0x7F,0x90,0xC7,0x44,0x02,0x0C,0x09,0x8A,
17290x46,0xFE,0x88,0x44,0x5E,0x88,0x44,0x5D,0x8B,0x5E,0xFC,0xD1,0xE3,0xC7,0x87,0xFC,
17300x08,0x0C,0x09,0xB8,0xE0,0x20,0xEB,0x60,0x8B,0xC7,0x25,0x00,0xF0,0x3D,0x00,0x30,
17310x75,0x52,0x8B,0xC7,0x25,0xF0,0x00,0x3D,0xD0,0x00,0x75,0x48,0x8B,0xC7,0x25,0x00,
17320x0F,0xC1,0xF8,0x08,0x89,0x46,0xFE,0x8B,0x44,0x04,0x3B,0x46,0xFE,0x7D,0x04,0x33,
17330xC0,0xEB,0x35,0x8B,0xC7,0x25,0x0F,0x00,0xBA,0x0F,0x00,0x2B,0xD0,0x3B,0x56,0xFE,
17340x74,0x04,0x33,0xC0,0xEB,0x22,0xC7,0x44,0x02,0x14,0x09,0x8A,0x46,0xFE,0x88,0x44,
17350x60,0x88,0x44,0x5D,0x8B,0x5E,0xFC,0xD1,0xE3,0xC7,0x87,0xFC,0x08,0x14,0x09,0xB8,
17360xD0,0x30,0xEB,0x04,0x33,0xC0,0xEB,0x00,0x5F,0x5E,0xC9,0xC3,0xC8,0x06,0x00,0x00,
17370x56,0x8B,0x76,0x04,0x6A,0x08,0x56,0xE8,0x35,0x04,0x59,0x59,0x8A,0x44,0x58,0x04,
17380x80,0x50,0x56,0xE8,0x29,0x04,0x59,0x59,0x8B,0x44,0x54,0x3B,0x44,0x56,0x75,0x0A,
17390x8A,0x44,0x5D,0x3A,0x44,0x2F,0x75,0x02,0xEB,0x64,0x8B,0x44,0x54,0x89,0x44,0x56,
17400x8B,0x5C,0x02,0x8A,0x47,0x01,0x88,0x44,0x2F,0x8A,0x44,0x5D,0xB4,0x00,0xC1,0xE0,
17410x08,0x8B,0x54,0x54,0x0B,0xD0,0x8A,0x44,0x5D,0xB4,0x00,0xBB,0x0F,0x00,0x2B,0xD8,
17420x0B,0xD3,0x89,0x56,0xFE,0x6A,0x10,0x8A,0x44,0x59,0x98,0x05,0x04,0x00,0x99,0x05,
17430x40,0x01,0x83,0xD2,0x00,0x52,0x50,0xE8,0x54,0x08,0x83,0xC4,0x06,0x89,0x56,0xFC,
17440x89,0x46,0xFA,0x8B,0x46,0xFE,0x09,0x46,0xFA,0x83,0x4E,0xFC,0x00,0x6A,0x19,0xFF,
17450x76,0xFC,0xFF,0x76,0xFA,0xE8,0x73,0x07,0x83,0xC4,0x06,0xE8,0xFE,0x07,0x5E,0xC9,
17460xC3,0xC8,0x1C,0x00,0x00,0x56,0x57,0x8B,0x5E,0x04,0x8A,0x47,0x59,0x98,0x8B,0xF0,
17470x8B,0x5E,0x04,0x8A,0x47,0x5D,0xB4,0x00,0x89,0x46,0xE6,0x83,0x7E,0xE6,0x00,0x7D,
17480x0A,0x8B,0x5E,0x04,0x8B,0x47,0x04,0x48,0x89,0x46,0xE6,0x8B,0x5E,0x04,0x8B,0x47,
17490x04,0x3B,0x46,0xE6,0x7F,0x05,0xC7,0x46,0xE6,0x00,0x00,0x8B,0x5E,0x04,0x8A,0x46,
17500xE6,0x88,0x47,0x5D,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x59,0x02,0xC6,0x47,0x02,0x20,
17510x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x59,0x02,0xC6,0x47,0x03,0x30,0x8B,0xDE,0xD1,0xE3,
17520x8B,0x9F,0x61,0x02,0xC6,0x47,0x02,0x20,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x61,0x02,
17530xC6,0x47,0x03,0x30,0x8B,0x46,0xE6,0x89,0x46,0xFA,0x83,0x7E,0xFA,0x00,0x74,0x18,
17540x8B,0x46,0xFA,0xBB,0x0A,0x00,0x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,
17550xE3,0x8B,0x9F,0x59,0x02,0x88,0x57,0x03,0xBB,0x0A,0x00,0x8B,0x46,0xFA,0x33,0xD2,
17560xF7,0xF3,0x89,0x46,0xFA,0x83,0x7E,0xFA,0x00,0x74,0x18,0x8B,0x46,0xFA,0xBB,0x0A,
17570x00,0x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x59,0x02,
17580x88,0x57,0x02,0x8B,0x46,0xE6,0x89,0x46,0xFA,0x83,0x7E,0xFA,0x00,0x74,0x18,0x8B,
17590x46,0xFA,0xBB,0x0A,0x00,0x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,0xE3,
17600x8B,0x9F,0x61,0x02,0x88,0x57,0x03,0xBB,0x0A,0x00,0x8B,0x46,0xFA,0x33,0xD2,0xF7,
17610xF3,0x89,0x46,0xFA,0x83,0x7E,0xFA,0x00,0x74,0x18,0x8B,0x46,0xFA,0xBB,0x0A,0x00,
17620x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x61,0x02,0x88,
17630x57,0x02,0x8B,0x5E,0xE6,0xD1,0xE3,0xFF,0xB7,0x12,0x02,0x6A,0x00,0xFF,0x76,0x04,
17640xE8,0xD1,0xF6,0x83,0xC4,0x06,0x68,0xD3,0x0F,0x6A,0x01,0xFF,0x76,0x04,0xE8,0xC3,
17650xF6,0x83,0xC4,0x06,0xFF,0x76,0xE6,0x56,0xE8,0x01,0x93,0x59,0x59,0x89,0x56,0xF2,
17660x89,0x46,0xF0,0xFF,0x76,0xE6,0x56,0xE8,0x14,0x93,0x59,0x59,0x89,0x56,0xEE,0x89,
17670x46,0xEC,0x9C,0xFA,0xC4,0x5E,0xF0,0x26,0x8B,0x07,0x89,0x46,0xEA,0xC4,0x5E,0xEC,
17680x26,0x8B,0x07,0x89,0x46,0xE8,0xBA,0x50,0xFF,0xED,0x89,0x46,0xFE,0x9D,0xC7,0x46,
17690xE4,0x01,0x00,0xE8,0xEE,0xA0,0xBA,0x50,0xFF,0xED,0x89,0x46,0xFC,0x8B,0x46,0xFC,
17700x2B,0x46,0xFE,0x3D,0xE8,0x03,0x73,0x03,0xE9,0x80,0x01,0x9C,0xFA,0xBA,0x50,0xFF,
17710xED,0x89,0x46,0xFC,0x8B,0x46,0xFC,0x2B,0x46,0xFE,0x89,0x46,0xF8,0xC4,0x5E,0xF0,
17720x26,0x8B,0x07,0x2B,0x46,0xEA,0x89,0x46,0xF6,0xC4,0x5E,0xF0,0x26,0x8B,0x07,0x89,
17730x46,0xEA,0xC4,0x5E,0xEC,0x26,0x8B,0x07,0x2B,0x46,0xE8,0x89,0x46,0xF4,0xC4,0x5E,
17740xEC,0x26,0x8B,0x07,0x89,0x46,0xE8,0xBA,0x50,0xFF,0xED,0x89,0x46,0xFE,0x9D,0x81,
17750x7E,0xF8,0xE8,0x03,0x76,0x1C,0xFF,0x76,0xF8,0xFF,0x76,0xF6,0xE8,0x76,0x01,0x59,
17760x59,0x89,0x46,0xF6,0xFF,0x76,0xF8,0xFF,0x76,0xF4,0xE8,0x68,0x01,0x59,0x59,0x89,
17770x46,0xF4,0xBF,0x0E,0x00,0xEB,0x17,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x59,0x02,0xC6,
17780x01,0x20,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x61,0x02,0xC6,0x01,0x20,0x47,0x83,0xFF,
17790x11,0x76,0xE4,0x8B,0xDE,0xD1,0xE3,0x8B,0x9F,0x59,0x02,0xC6,0x47,0x0D,0x30,0x8B,
17800xDE,0xD1,0xE3,0x8B,0x9F,0x61,0x02,0xC6,0x47,0x0D,0x30,0x83,0x7E,0xF6,0x09,0x77,
17810x05,0xB8,0x0D,0x00,0xEB,0x26,0x83,0x7E,0xF6,0x63,0x77,0x05,0xB8,0x0E,0x00,0xEB,
17820x1B,0x81,0x7E,0xF6,0xE7,0x03,0x77,0x05,0xB8,0x0F,0x00,0xEB,0x0F,0x81,0x7E,0xF6,
17830x0F,0x27,0x77,0x05,0xB8,0x10,0x00,0xEB,0x03,0xB8,0x11,0x00,0x8B,0xF8,0xEB,0x25,
17840x8B,0x46,0xF6,0xBB,0x0A,0x00,0x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,
17850xE3,0x8B,0x9F,0x59,0x02,0x88,0x11,0x4F,0xBB,0x0A,0x00,0x8B,0x46,0xF6,0x33,0xD2,
17860xF7,0xF3,0x89,0x46,0xF6,0x83,0x7E,0xF6,0x00,0x75,0xD5,0x83,0x7E,0xF4,0x09,0x77,
17870x05,0xB8,0x0D,0x00,0xEB,0x26,0x83,0x7E,0xF4,0x63,0x77,0x05,0xB8,0x0E,0x00,0xEB,
17880x1B,0x81,0x7E,0xF4,0xE7,0x03,0x77,0x05,0xB8,0x0F,0x00,0xEB,0x0F,0x81,0x7E,0xF4,
17890x0F,0x27,0x77,0x05,0xB8,0x10,0x00,0xEB,0x03,0xB8,0x11,0x00,0x8B,0xF8,0xEB,0x25,
17900x8B,0x46,0xF4,0xBB,0x0A,0x00,0x33,0xD2,0xF7,0xF3,0x80,0xC2,0x30,0x8B,0xDE,0xD1,
17910xE3,0x8B,0x9F,0x61,0x02,0x88,0x11,0x4F,0xBB,0x0A,0x00,0x8B,0x46,0xF4,0x33,0xD2,
17920xF7,0xF3,0x89,0x46,0xF4,0x83,0x7E,0xF4,0x00,0x75,0xD5,0x8B,0xDE,0xD1,0xE3,0xFF,
17930xB7,0x59,0x02,0xFF,0x76,0x04,0xE8,0x6E,0x00,0x59,0x59,0x8B,0xDE,0xD1,0xE3,0xFF,
17940xB7,0x61,0x02,0xFF,0x76,0x04,0xE8,0x5E,0x00,0x59,0x59,0x6A,0x00,0xFF,0x76,0x04,
17950xE8,0x31,0xF3,0x59,0x59,0x8B,0xD8,0x83,0xFB,0x04,0x77,0x1F,0xD1,0xE3,0x2E,0xFF,
17960xA7,0x1B,0x70,0xEB,0x22,0xC7,0x46,0xE4,0x00,0x00,0xFF,0x4E,0xE6,0xEB,0x0C,0xC7,
17970x46,0xE4,0x00,0x00,0xFF,0x46,0xE6,0xEB,0x02,0xEB,0x00,0x83,0x7E,0xE4,0x00,0x74,
17980x03,0xE9,0x2A,0xFE,0xE9,0xD4,0xFC,0x5F,0x5E,0xC9,0xC3,0xF3,0x6F,0xF5,0x6F,0xFF,
17990x6F,0xF3,0x6F,0x09,0x70,0x55,0x8B,0xEC,0x8B,0x46,0x04,0xB9,0xE8,0x03,0xF7,0xE1,
18000x8B,0x4E,0x06,0xF7,0xF1,0x5D,0xC3,0x55,0x8B,0xEC,0x56,0x8B,0x76,0x06,0xEB,0x0E,
18010x8B,0xDE,0x46,0x8A,0x07,0x50,0xFF,0x76,0x04,0xE8,0x33,0x00,0x59,0x59,0x80,0x3C,
18020x00,0x75,0xED,0xEB,0x00,0x5E,0x5D,0xC3,0x55,0x8B,0xEC,0x56,0x8B,0x76,0x06,0xEB,
18030x14,0x8B,0xDE,0x46,0x8A,0x07,0x50,0xFF,0x76,0x04,0xE8,0x45,0x00,0x59,0x59,0x0B,
18040xC0,0x74,0x02,0xEB,0x07,0x80,0x3C,0x00,0x75,0xE7,0xEB,0x00,0x5E,0x5D,0xC3,0xC8,
18050x02,0x00,0x00,0x56,0x8B,0x76,0x04,0x8A,0x44,0x5A,0x98,0x89,0x46,0xFE,0x9C,0xFA,
18060x8A,0x46,0xFE,0xBA,0xFE,0x00,0xEE,0xBA,0x02,0x00,0xEC,0xA8,0x02,0x74,0x06,0x9D,
18070xE8,0x91,0x9E,0xEB,0xE9,0xBA,0x00,0x00,0x8A,0x46,0x06,0xEE,0x9D,0xEB,0x00,0x5E,
18080xC9,0xC3,0xC8,0x04,0x00,0x00,0x56,0x8B,0x76,0x04,0x8A,0x44,0x5A,0x98,0x89,0x46,
18090xFE,0xE8,0xE6,0xA1,0x89,0x46,0xFC,0xE8,0xE0,0xA1,0x2B,0x46,0xFC,0x3D,0xB8,0x0B,
18100x76,0x05,0xB8,0x01,0x00,0xEB,0x23,0x9C,0xFA,0x8A,0x46,0xFE,0xBA,0xFE,0x00,0xEE,
18110xBA,0x02,0x00,0xEC,0xA8,0x02,0x74,0x06,0x9D,0xE8,0x48,0x9E,0xEB,0xD9,0xBA,0x00,
18120x00,0x8A,0x46,0x06,0xEE,0x9D,0x33,0xC0,0xEB,0x00,0x5E,0xC9,0xC3,0xC8,0x04,0x00,
18130x00,0x56,0x57,0x8B,0x76,0x04,0x83,0x7E,0x06,0x00,0x74,0x07,0x56,0xE8,0x03,0x01,
18140x59,0xEB,0x05,0x56,0xE8,0xA2,0x00,0x59,0x88,0x46,0xFF,0x80,0x7E,0xFF,0x08,0x77,
18150x06,0x8A,0x46,0xFF,0xE9,0x84,0x00,0x80,0x7E,0xFF,0x0F,0x76,0x03,0xEB,0x79,0x90,
18160x8A,0x46,0xFF,0xB4,0x00,0x2D,0x0A,0x00,0x8B,0xD8,0x83,0xFB,0x04,0x77,0x67,0xD1,
18170xE3,0x2E,0xFF,0xA7,0xAF,0x71,0xB0,0x00,0xEB,0x61,0x56,0xE8,0x6B,0x00,0x59,0xB4,
18180x00,0x25,0x0F,0x00,0x89,0x46,0xFC,0x56,0xE8,0x5E,0x00,0x59,0xB4,0x00,0x8B,0xF8,
18190x56,0xE8,0x55,0x00,0x59,0xB4,0x00,0xC1,0xE0,0x08,0x8B,0xD7,0x03,0xD0,0x8B,0xFA,
18200x8B,0x5E,0xFC,0xD1,0xE3,0x89,0x78,0x30,0xEB,0x2E,0x56,0xE8,0x3B,0x00,0x59,0x88,
18210x44,0x5B,0xEB,0x24,0x56,0xE8,0x31,0x00,0x59,0x88,0x44,0x50,0x56,0xE8,0x29,0x00,
18220x59,0x88,0x44,0x51,0x56,0xE8,0x21,0x00,0x59,0x88,0x44,0x52,0x56,0xE8,0x19,0x00,
18230x59,0x88,0x44,0x53,0xEB,0x02,0xEB,0x00,0xE9,0x5B,0xFF,0x5F,0x5E,0xC9,0xC3,0x46,
18240x71,0xA6,0x71,0x4A,0x71,0x7A,0x71,0x84,0x71,0xC8,0x04,0x00,0x00,0x56,0x8B,0x76,
18250x04,0x8A,0x44,0x5A,0x98,0x89,0x46,0xFE,0x9C,0xFA,0x8A,0x46,0xFE,0xBA,0xFE,0x00,
18260xEE,0xBA,0x02,0x00,0xEC,0xA8,0x01,0x75,0x06,0x9D,0xE8,0x57,0x9D,0xEB,0xE9,0xBA,
18270x00,0x00,0xEC,0x88,0x46,0xFD,0x9D,0x8A,0x46,0xFD,0xEB,0x00,0x5E,0xC9,0xC3,0xC8,
18280x02,0x00,0x00,0x56,0x8B,0x76,0x04,0x8A,0x44,0x5A,0x98,0x89,0x46,0xFE,0x9C,0xFA,
18290x8A,0x46,0xFE,0xBA,0xFE,0x00,0xEE,0xBA,0x02,0x00,0xEC,0x32,0xE4,0x24,0x01,0x9D,
18300x5E,0xC9,0xC3,0xC8,0x06,0x00,0x00,0x56,0x8B,0x76,0x04,0x8A,0x44,0x5A,0x98,0x89,
18310x46,0xFE,0xE8,0x85,0xA0,0x89,0x46,0xFA,0xE8,0x7F,0xA0,0x2B,0x46,0xFA,0x3D,0xB8,
18320x0B,0x76,0x04,0xB0,0x08,0xEB,0x24,0x9C,0xFA,0x8A,0x46,0xFE,0xBA,0xFE,0x00,0xEE,
18330xBA,0x02,0x00,0xEC,0xA8,0x01,0x75,0x06,0x9D,0xE8,0xE8,0x9C,0xEB,0xDA,0xBA,0x00,
18340x00,0xEC,0x88,0x46,0xFD,0x9D,0x8A,0x46,0xFD,0xEB,0x00,0x5E,0xC9,0xC3,0x55,0x8B,
18350xEC,0x56,0x8B,0x56,0x04,0x8A,0x46,0x06,0xEE,0x33,0xF6,0xEB,0x03,0x50,0x58,0x46,
18360x83,0xFE,0x14,0x7C,0xF8,0x5E,0x5D,0xC3,0xC8,0x02,0x00,0x00,0x56,0x8B,0x56,0x04,
18370xEC,0x88,0x46,0xFF,0x33,0xF6,0xEB,0x03,0x50,0x58,0x46,0x83,0xFE,0x14,0x7C,0xF8,
18380x8A,0x46,0xFF,0xEB,0x00,0x5E,0xC9,0xC3,0xC8,0x02,0x00,0x00,0x56,0x57,0x8B,0x76,
18390x04,0x83,0x3E,0xB0,0x0B,0x00,0x75,0x1F,0xBA,0x88,0x01,0xB0,0x00,0xEE,0xBA,0x86,
18400x01,0xB0,0x00,0xEE,0x6A,0x09,0x6A,0x00,0x68,0x30,0x01,0xE8,0x7D,0x01,0x83,0xC4,
18410x06,0xC7,0x06,0xB0,0x0B,0x01,0x00,0x6A,0x09,0x8B,0xC6,0x05,0x80,0x01,0x50,0xE8,
18420xDA,0x00,0x59,0x59,0x8B,0xF8,0x8B,0xC7,0xC1,0xE8,0x0C,0x25,0x0F,0x00,0x89,0x46,
18430xFE,0x8B,0xC7,0xC1,0xE8,0x08,0x25,0x0F,0x00,0x8B,0x56,0xFE,0x83,0xF2,0x0C,0x3B,
18440xC2,0x75,0x21,0x8B,0xC7,0xC1,0xE8,0x04,0x25,0x0F,0x00,0x8B,0x56,0xFE,0x83,0xF2,
18450x06,0x3B,0xC2,0x75,0x0F,0x8B,0xC7,0x25,0x0F,0x00,0x8B,0x56,0xFE,0x83,0xF2,0x09,
18460x3B,0xC2,0x74,0x0D,0x6A,0x07,0x56,0xE8,0x38,0x00,0x59,0x59,0xC7,0x46,0xFE,0x07,
18470x00,0x8A,0x46,0xFE,0x04,0x80,0xA2,0x33,0x02,0x8B,0xC6,0xBA,0x62,0x00,0xF7,0xEA,
18480x8A,0x56,0xFE,0x8B,0xD8,0x88,0x97,0x6C,0x00,0x68,0x32,0x02,0x8B,0xC6,0xBA,0x62,
18490x00,0xF7,0xEA,0x05,0x14,0x00,0x50,0xE8,0x0E,0xFD,0x59,0x59,0xEB,0x00,0x5F,0x5E,
18500xC9,0xC3,0xC8,0x02,0x00,0x00,0x56,0x8B,0x76,0x06,0x83,0xE6,0x0F,0x8B,0xC6,0xC1,
18510xE0,0x0C,0x8B,0xD6,0x83,0xF2,0x0C,0xC1,0xE2,0x08,0x0B,0xC2,0x8B,0xD6,0x83,0xF2,
18520x06,0xC1,0xE2,0x04,0x0B,0xC2,0x8B,0xD6,0x83,0xF2,0x09,0x0B,0xC2,0x89,0x46,0xFE,
18530x6A,0x19,0x6A,0x10,0x8B,0x46,0x04,0x99,0x05,0x40,0x01,0x83,0xD2,0x00,0x52,0x50,
18540xE8,0x6B,0x01,0x83,0xC4,0x06,0x0B,0x46,0xFE,0x83,0xCA,0x00,0x52,0x50,0xE8,0x9A,
18550x00,0x83,0xC4,0x06,0xE8,0x25,0x01,0xEB,0x00,0x5E,0xC9,0xC3,0x55,0x8B,0xEC,0x56,
18560x57,0x33,0xFF,0x6A,0x01,0x68,0x86,0x01,0xE8,0xA3,0xFE,0x59,0x59,0xB1,0x10,0x2A,
18570x4E,0x06,0xD3,0x66,0x04,0x33,0xF6,0xEB,0x2E,0x81,0x7E,0x04,0x00,0x80,0x72,0x04,
18580xB0,0x01,0xEB,0x02,0xB0,0x00,0x50,0x68,0x88,0x01,0xE8,0x81,0xFE,0x59,0x59,0x6A,
18590x03,0x68,0x86,0x01,0xE8,0x77,0xFE,0x59,0x59,0x6A,0x01,0x68,0x86,0x01,0xE8,0x6D,
18600xFE,0x59,0x59,0xD1,0x66,0x04,0x46,0x3B,0x76,0x06,0x7C,0xCD,0x33,0xF6,0xEB,0x24,
18610xD1,0xE7,0x6A,0x03,0x68,0x86,0x01,0xE8,0x54,0xFE,0x59,0x59,0x6A,0x01,0x68,0x86,
18620x01,0xE8,0x4A,0xFE,0x59,0x59,0x68,0x88,0x01,0xE8,0x5C,0xFE,0x59,0x98,0x25,0x01,
18630x00,0x0B,0xF8,0x46,0x83,0xFE,0x10,0x7C,0xD7,0x6A,0x00,0x68,0x86,0x01,0xE8,0x2D,
18640xFE,0x59,0x59,0x8B,0xC7,0xEB,0x00,0x5F,0x5E,0x5D,0xC3,0x55,0x8B,0xEC,0x56,0x57,
18650x8B,0x7E,0x08,0x6A,0x01,0x68,0x86,0x01,0xE8,0x13,0xFE,0x59,0x59,0xB8,0x20,0x00,
18660x2B,0xC7,0x50,0xFF,0x76,0x06,0xFF,0x76,0x04,0xE8,0xA2,0x00,0x83,0xC4,0x06,0x89,
18670x56,0x06,0x89,0x46,0x04,0x33,0xF6,0xEB,0x47,0x81,0x7E,0x06,0x00,0x80,0x72,0x0C,
18680x75,0x06,0x83,0x7E,0x04,0x00,0x72,0x04,0xB0,0x01,0xEB,0x02,0xB0,0x00,0x50,0x68,
18690x88,0x01,0xE8,0xD9,0xFD,0x59,0x59,0x6A,0x03,0x68,0x86,0x01,0xE8,0xCF,0xFD,0x59,
18700x59,0x6A,0x01,0x68,0x86,0x01,0xE8,0xC5,0xFD,0x59,0x59,0x6A,0x01,0xFF,0x76,0x06,
18710xFF,0x76,0x04,0xE8,0x58,0x00,0x83,0xC4,0x06,0x89,0x56,0x06,0x89,0x46,0x04,0x46,
18720x3B,0xF7,0x7C,0xB5,0x6A,0x00,0x68,0x86,0x01,0xE8,0xA2,0xFD,0x59,0x59,0x6A,0x00,
18730x68,0x86,0x01,0xE8,0x98,0xFD,0x59,0x59,0x5F,0x5E,0x5D,0xC3,0x55,0x8B,0xEC,0x56,
18740x6A,0x01,0x68,0x86,0x01,0xE8,0x86,0xFD,0x59,0x59,0x33,0xF6,0xEB,0x00,0x68,0x88,
18750x01,0xE8,0x94,0xFD,0x59,0xA8,0x01,0x75,0x08,0x8B,0xC6,0x46,0x3D,0x64,0x00,0x7C,
18760xED,0x6A,0x00,0x68,0x86,0x01,0xE8,0x65,0xFD,0x59,0x59,0x5E,0x5D,0xC3,0xC8,0x04,
18770x00,0x00,0x8B,0x46,0x04,0x8B,0x56,0x06,0x8B,0x4E,0x08,0xE3,0x06,0xD1,0xE0,0xD1,
18780xD2,0xE2,0xFA,0x89,0x46,0xFC,0x89,0x56,0xFE,0x8B,0x56,0xFE,0x8B,0x46,0xFC,0xEB,
18790x00,0xC9,0xC3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18800x50,0x72,0x65,0x76,0x69,0x6F,0x75,0x73,0x20,0x4D,0x65,0x6E,0x75,0x00,0x42,0x65,
18810x67,0x69,0x6E,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18820x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18830x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18840x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18850x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18860x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18870x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18880x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18890x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18900x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18910x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18920x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18930x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18940x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18950x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18960x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18970x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18980x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
18990x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19000x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19010x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19020x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19030x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19040x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
19050x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x50,0x6F,0x72,0x74,
19060x20,0x30,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,0x00,0x50,0x6F,0x72,0x74,0x20,0x32,
19070x00,0x50,0x6F,0x72,0x74,0x20,0x33,0x00,0x50,0x6F,0x72,0x74,0x20,0x34,0x00,0x50,
19080x6F,0x72,0x74,0x20,0x35,0x00,0x50,0x6F,0x72,0x74,0x20,0x36,0x00,0x50,0x6F,0x72,
19090x74,0x20,0x37,0x00,0x50,0x6F,0x72,0x74,0x20,0x38,0x00,0x50,0x6F,0x72,0x74,0x20,
19100x39,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,0x30,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,
19110x31,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,0x32,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,
19120x33,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,0x34,0x00,0x50,0x6F,0x72,0x74,0x20,0x31,
19130x35,0x00,0x9C,0x01,0xA3,0x01,0xAA,0x01,0xB1,0x01,0xB8,0x01,0xBF,0x01,0xC6,0x01,
19140xCD,0x01,0xD4,0x01,0xDB,0x01,0xE2,0x01,0xEA,0x01,0xF2,0x01,0xFA,0x01,0x02,0x02,
19150x0A,0x02,0x08,0x00,0x00,0x07,0x81,0x00,0x03,0x80,0x80,0x80,0x9F,0x91,0x95,0x91,
19160x9F,0x00,0x03,0x81,0x84,0x8E,0x95,0x84,0x84,0x84,0x84,0x00,0x03,0x82,0x84,0x84,
19170x84,0x84,0x95,0x8E,0x84,0x00,0x04,0x88,0x00,0xB2,0x0B,0xC6,0x0B,0xDA,0x0B,0xEE,
19180x0B,0x02,0x0C,0x16,0x0C,0x2A,0x0C,0x3E,0x0C,0x52,0x0C,0x77,0x0C,0x9C,0x0C,0xBE,
19190x0C,0xE0,0x0C,0x02,0x0D,0x01,0x80,0x20,0x54,0x65,0x73,0x74,0x20,0x50,0x61,0x73,
19200x73,0x65,0x64,0x20,0x1F,0x20,0x50,0x72,0x65,0x73,0x73,0x20,0x80,0x02,0x00,0x01,
19210x80,0x20,0x4D,0x69,0x73,0x73,0x69,0x6E,0x67,0x20,0x52,0x78,0x20,0x44,0x61,0x74,
19220x61,0x1F,0x20,0x50,0x72,0x65,0x73,0x73,0x20,0x80,0x02,0x00,0x01,0x80,0x20,0x42,
19230x61,0x64,0x20,0x52,0x78,0x20,0x44,0x61,0x74,0x61,0x20,0x1F,0x20,0x50,0x72,0x65,
19240x73,0x73,0x20,0x80,0x02,0x00,0x01,0x80,0x20,0x58,0x6D,0x74,0x72,0x20,0x42,0x75,
19250x73,0x79,0x1F,0x20,0x50,0x72,0x65,0x73,0x73,0x20,0x80,0x02,0x00,0x01,0x80,0x20,
19260x6E,0x6F,0x74,0x20,0x63,0x75,0x72,0x72,0x65,0x6E,0x74,0x6C,0x79,0x1F,0x20,0x20,
19270x69,0x6D,0x70,0x6C,0x65,0x6D,0x65,0x6E,0x74,0x65,0x64,0x02,0x00,0x24,0x0D,0x2F,
19280x0D,0x3A,0x0D,0x45,0x0D,0x50,0x0D,0x5B,0x0D,0x66,0x0D,0x71,0x0D,0x7C,0x0D,0x87,
19290x0D,0x92,0x0D,0x9D,0x0D,0xA8,0x0D,0xB3,0x0D,0xBE,0x0D,0xC9,0x0D,0x53,0x80,0x2C,
19300x32,0x54,0x44,0x20,0x53,0x86,0x2C,0x33,0x44,0x54,0x52,0x20,0x53,0x82,0x2C,0x33,
19310x52,0x54,0x53,0x20,0x1F,0x53,0x81,0x2C,0x32,0x52,0x44,0x20,0x53,0x85,0x2C,0x32,
19320x43,0x44,0x20,0x53,0x83,0x2C,0x33,0x43,0x54,0x53,0x20,0x53,0x84,0x2C,0x33,0x44,
19330x53,0x52,0x20,0x53,0x87,0x2C,0x32,0x52,0x49,0x27,0x02,0x00,0x01,0x80,0x20,0x20,
19340x44,0x43,0x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x32,0x30,0x1F,0x27,0x53,0x85,
19350x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,
19360x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x53,0x52,
19370x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x31,0x31,0x1F,0x27,0x53,0x84,0x2E,0x31,0x81,
19380x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,
19390x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x43,0x54,0x53,0x20,0x2D,0x20,
19400x70,0x69,0x6E,0x20,0x34,0x1F,0x27,0x53,0x83,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,
19410x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,
19420x02,0x00,0x01,0x80,0x20,0x20,0x52,0x49,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x32,
19430x32,0x1F,0x27,0x53,0x87,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,
19440x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,
19450x20,0x20,0x44,0x54,0x52,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x36,0x2F,0x38,0x1F,
19460x27,0x53,0x86,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,
19470x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,
19480x52,0x54,0x53,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x35,0x1F,0x27,0x53,0x82,0x2E,
19490x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,
19500x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x52,0x78,0x44,0x20,
19510x2D,0x20,0x70,0x69,0x6E,0x20,0x32,0x1F,0x27,0x53,0x81,0x2E,0x30,0x53,0x4D,0x81,
19520x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,
19530x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x54,0x78,0x44,0x20,0x2D,0x20,
19540x70,0x69,0x6E,0x20,0x33,0x1F,0x27,0x53,0x80,0x2E,0x30,0x53,0x4D,0x81,0x82,0x63,
19550x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,
19560x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x43,0x44,0x20,0x2D,0x20,0x70,0x69,
19570x6E,0x20,0x35,0x1F,0x27,0x53,0x85,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,
19580x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,
19590x01,0x80,0x20,0x20,0x44,0x53,0x52,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x35,0x1F,
19600x27,0x53,0x84,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,
19610x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,
19620x43,0x54,0x53,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x31,0x1F,0x27,0x53,0x83,0x2E,
19630x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,
19640x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x52,0x49,0x20,0x2D,
19650x20,0x28,0x6E,0x2E,0x63,0x2E,0x29,0x1F,0x27,0x53,0x87,0x2E,0x31,0x81,0x82,0x63,
19660x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,
19670x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x54,0x52,0x20,0x2D,0x20,0x70,0x69,
19680x6E,0x20,0x32,0x1F,0x27,0x53,0x86,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,
19690x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,
19700x01,0x80,0x20,0x20,0x52,0x54,0x53,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x37,0x1F,
19710x27,0x53,0x82,0x2E,0x31,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,
19720x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,
19730x52,0x78,0x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x36,0x1F,0x27,0x53,0x81,0x2E,
19740x30,0x53,0x4D,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,
19750x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x54,0x78,
19760x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x33,0x1F,0x27,0x53,0x80,0x2E,0x30,0x53,
19770x4D,0x81,0x82,0x63,0x90,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,
19780x8B,0x8C,0x8D,0x8E,0x8F,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x43,0x44,0x20,
19790x2D,0x20,0x70,0x69,0x6E,0x20,0x35,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x85,0x2E,
19800x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,
19810x01,0x80,0x20,0x20,0x44,0x53,0x52,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x35,0x1F,
19820x20,0x20,0x20,0x20,0x27,0x53,0x84,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,
19830x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x43,0x54,0x53,0x20,
19840x2D,0x20,0x70,0x69,0x6E,0x20,0x31,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x83,0x2E,
19850x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,
19860x01,0x80,0x20,0x20,0x52,0x49,0x20,0x2D,0x20,0x28,0x6E,0x2E,0x63,0x2E,0x29,0x1F,
19870x20,0x20,0x20,0x20,0x27,0x53,0x87,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,
19880x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x54,0x52,0x20,
19890x2D,0x20,0x70,0x69,0x6E,0x20,0x32,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x86,0x2E,
19900x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,
19910x01,0x80,0x20,0x20,0x52,0x54,0x53,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x37,0x1F,
19920x20,0x20,0x20,0x20,0x27,0x53,0x82,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,
19930x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x52,0x78,0x44,0x20,
19940x2D,0x20,0x70,0x69,0x6E,0x20,0x36,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x81,0x2E,
19950x30,0x53,0x4D,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,
19960x02,0x00,0x01,0x80,0x20,0x20,0x54,0x78,0x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,
19970x33,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x80,0x2E,0x30,0x53,0x4D,0x81,0x82,0x63,
19980x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,
19990x44,0x43,0x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x32,0x30,0x1F,0x20,0x20,0x20,
20000x20,0x27,0x53,0x85,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,
20010x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x44,0x53,0x52,0x20,0x2D,0x20,0x70,
20020x69,0x6E,0x20,0x31,0x31,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x84,0x2E,0x31,0x81,
20030x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,
20040x20,0x20,0x43,0x54,0x53,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x34,0x1F,0x20,0x20,
20050x20,0x20,0x27,0x53,0x83,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,
20060x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x52,0x49,0x20,0x2D,0x20,0x70,
20070x69,0x6E,0x20,0x32,0x32,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x87,0x2E,0x31,0x81,
20080x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,
20090x20,0x20,0x44,0x54,0x52,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x36,0x2F,0x38,0x1F,
20100x20,0x20,0x20,0x20,0x27,0x53,0x86,0x2E,0x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,
20110x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x52,0x54,0x53,0x20,
20120x2D,0x20,0x70,0x69,0x6E,0x20,0x35,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,0x82,0x2E,
20130x31,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,
20140x01,0x80,0x20,0x20,0x52,0x78,0x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x32,0x1F,
20150x20,0x20,0x20,0x20,0x27,0x53,0x81,0x2E,0x30,0x53,0x4D,0x81,0x82,0x63,0x88,0x80,
20160x81,0x82,0x83,0x84,0x85,0x86,0x87,0x27,0x02,0x00,0x01,0x80,0x20,0x20,0x54,0x78,
20170x44,0x20,0x2D,0x20,0x70,0x69,0x6E,0x20,0x33,0x1F,0x20,0x20,0x20,0x20,0x27,0x53,
20180x80,0x2E,0x30,0x53,0x4D,0x81,0x82,0x63,0x88,0x80,0x81,0x82,0x83,0x84,0x85,0x86,
20190x87,0x27,0x02,0x00,0x68,0x04,0x96,0x04,0xB6,0x03,0x3C,0x04,0x0E,0x04,0x89,0x03,
20200x5C,0x03,0xE2,0x03,0x60,0x08,0x8A,0x08,0xBE,0x07,0x38,0x08,0x0E,0x08,0x95,0x07,
20210x6C,0x07,0xE6,0x07,0x1C,0x05,0x74,0x05,0xFA,0x05,0xC4,0x04,0xF0,0x04,0xCC,0x05,
20220xA0,0x05,0x48,0x05,0x78,0x06,0xC8,0x06,0x42,0x07,0x28,0x06,0x50,0x06,0x18,0x07,
20230xF0,0x06,0xA0,0x06,0x00,0x00,0xF4,0x08,0xF4,0x08,0xD4,0x0D,0x04,0x09,0x04,0x09,
20240x04,0x09,0x04,0x09,0x42,0x00,0x0C,0x09,0x1C,0x09,0xE5,0x0D,0x02,0x00,0x14,0x09,
20250x04,0x09,0xF4,0x0D,0x43,0x00,0x1C,0x09,0x0C,0x09,0x05,0x0E,0x00,0x04,0x04,0x09,
20260x14,0x09,0x12,0x0E,0x2C,0x09,0x2C,0x09,0x2C,0x09,0x2C,0x09,0x00,0x00,0x3C,0x09,
20270x6C,0x09,0x1E,0x0E,0x74,0x09,0x74,0x09,0x74,0x09,0x74,0x09,0x00,0x01,0x4C,0x09,
20280x2C,0x09,0x2D,0x0E,0x74,0x09,0x74,0x09,0x74,0x09,0x74,0x09,0x00,0x02,0x5C,0x09,
20290x3C,0x09,0x3D,0x0E,0x74,0x09,0x74,0x09,0x74,0x09,0x74,0x09,0x00,0x03,0x6C,0x09,
20300x4C,0x09,0x4D,0x0E,0x74,0x09,0x74,0x09,0x74,0x09,0x74,0x09,0xFF,0x00,0x2C,0x09,
20310x5C,0x09,0x00,0x00,0x00,0x05,0x84,0x09,0xEC,0x09,0x5E,0x0E,0xF4,0x09,0xF4,0x09,
20320xF4,0x09,0xF4,0x09,0x00,0x06,0x94,0x09,0x74,0x09,0x68,0x0E,0xAC,0x0A,0xAC,0x0A,
20330xAC,0x0A,0xAC,0x0A,0x00,0x07,0xA4,0x09,0x84,0x09,0x72,0x0E,0xBC,0x0A,0xBC,0x0A,
20340xBC,0x0A,0xBC,0x0A,0x00,0x08,0xB4,0x09,0x94,0x09,0x7C,0x0E,0xD4,0x0A,0xD4,0x0A,
20350xD4,0x0A,0xD4,0x0A,0x00,0x0B,0xC4,0x09,0xA4,0x09,0x83,0x0E,0xFC,0x0A,0xFC,0x0A,
20360xFC,0x0A,0xFC,0x0A,0x00,0x0C,0xD4,0x09,0xB4,0x09,0x90,0x0E,0x14,0x0B,0x14,0x0B,
20370x14,0x0B,0x14,0x0B,0x00,0x02,0xE4,0x09,0xC4,0x09,0xA0,0x0E,0x2C,0x0B,0x2C,0x0B,
20380x2C,0x0B,0x2C,0x0B,0x04,0x00,0xEC,0x09,0xD4,0x09,0x0E,0x00,0xFF,0x00,0x74,0x09,
20390xE4,0x09,0x00,0x00,0x82,0x01,0xFC,0x09,0xA4,0x0A,0xAC,0x0E,0x82,0x02,0x04,0x0A,
20400xF4,0x09,0xAF,0x0E,0x82,0x03,0x0C,0x0A,0xFC,0x09,0xB2,0x0E,0x82,0x04,0x14,0x0A,
20410x04,0x0A,0xB6,0x0E,0x82,0x05,0x1C,0x0A,0x0C,0x0A,0xBC,0x0E,0x82,0x06,0x24,0x0A,
20420x14,0x0A,0xC0,0x0E,0x82,0x07,0x2C,0x0A,0x1C,0x0A,0xC4,0x0E,0x82,0x08,0x34,0x0A,
20430x24,0x0A,0xC8,0x0E,0x82,0x09,0x3C,0x0A,0x2C,0x0A,0xCC,0x0E,0x82,0x0A,0x44,0x0A,
20440x34,0x0A,0xD1,0x0E,0x82,0x10,0x4C,0x0A,0x3C,0x0A,0xD6,0x0E,0x82,0x0B,0x54,0x0A,
20450x44,0x0A,0xDB,0x0E,0x82,0x11,0x5C,0x0A,0x4C,0x0A,0xE0,0x0E,0x82,0x0C,0x64,0x0A,
20460x54,0x0A,0xE5,0x0E,0x82,0x12,0x6C,0x0A,0x5C,0x0A,0xEA,0x0E,0x82,0x0D,0x74,0x0A,
20470x64,0x0A,0xEF,0x0E,0x82,0x0E,0x7C,0x0A,0x6C,0x0A,0xF4,0x0E,0x82,0x0F,0x84,0x0A,
20480x74,0x0A,0xFB,0x0E,0x82,0x13,0x8C,0x0A,0x7C,0x0A,0x02,0x0F,0x82,0x14,0x94,0x0A,
20490x84,0x0A,0x09,0x0F,0x82,0x15,0x9C,0x0A,0x8C,0x0A,0x10,0x0F,0x82,0x16,0xA4,0x0A,
20500x94,0x0A,0x17,0x0F,0x82,0x17,0xF4,0x09,0x9C,0x0A,0x1E,0x0F,0x82,0x02,0xB4,0x0A,
20510xB4,0x0A,0x26,0x0F,0x82,0x03,0xAC,0x0A,0xAC,0x0A,0x2D,0x0F,0x82,0x00,0xC4,0x0A,
20520xCC,0x0A,0x34,0x0F,0x82,0x01,0xCC,0x0A,0xBC,0x0A,0x3F,0x0F,0x82,0x02,0xBC,0x0A,
20530xC4,0x0A,0x4D,0x0F,0x82,0x00,0xDC,0x0A,0xF4,0x0A,0x59,0x0F,0x82,0x01,0xE4,0x0A,
20540xD4,0x0A,0x63,0x0F,0x82,0x02,0xEC,0x0A,0xDC,0x0A,0x6E,0x0F,0x82,0x03,0xF4,0x0A,
20550xE4,0x0A,0x7A,0x0F,0x82,0x04,0xD4,0x0A,0xEC,0x0A,0x87,0x0F,0x82,0x00,0x04,0x0B,
20560x0C,0x0B,0x93,0x0F,0x82,0x01,0x0C,0x0B,0xFC,0x0A,0x9B,0x0F,0x82,0x02,0xFC,0x0A,
20570x04,0x0B,0xA7,0x0F,0x82,0x00,0x1C,0x0B,0x24,0x0B,0xB0,0x0F,0x82,0x01,0x24,0x0B,
20580x14,0x0B,0xB5,0x0F,0x82,0x02,0x14,0x0B,0x1C,0x0B,0xBE,0x0F,0x44,0x00,0x34,0x0B,
20590xA4,0x0B,0x9C,0x01,0x44,0x01,0x3C,0x0B,0x2C,0x0B,0xA3,0x01,0x44,0x02,0x44,0x0B,
20600x34,0x0B,0xAA,0x01,0x44,0x03,0x4C,0x0B,0x3C,0x0B,0xB1,0x01,0x44,0x04,0x54,0x0B,
20610x44,0x0B,0xB8,0x01,0x44,0x05,0x5C,0x0B,0x4C,0x0B,0xBF,0x01,0x44,0x06,0x64,0x0B,
20620x54,0x0B,0xC6,0x01,0x44,0x07,0x6C,0x0B,0x5C,0x0B,0xCD,0x01,0x44,0x08,0x74,0x0B,
20630x64,0x0B,0xD4,0x01,0x44,0x09,0x7C,0x0B,0x6C,0x0B,0xDB,0x01,0x44,0x0A,0x84,0x0B,
20640x74,0x0B,0xE2,0x01,0x44,0x0B,0x8C,0x0B,0x7C,0x0B,0xEA,0x01,0x44,0x0C,0x94,0x0B,
20650x84,0x0B,0xF2,0x01,0x44,0x0D,0x9C,0x0B,0x8C,0x0B,0xFA,0x01,0x44,0x0E,0xA4,0x0B,
20660x94,0x0B,0x02,0x02,0x44,0x0F,0x2C,0x0B,0x9C,0x0B,0x0A,0x02,0x17,0x1F,0x0F,0x2F,
20670x00,0x00,0x01,0x80,0x78,0x78,0x3A,0x20,0x74,0x78,0x20,0x63,0x70,0x73,0x20,0x2A,
20680x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0x80,0x78,0x78,0x3A,0x20,0x74,0x78,0x20,0x63,
20690x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0x80,0x78,0x78,0x3A,0x20,
20700x74,0x78,0x20,0x63,0x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0x80,
20710x78,0x78,0x3A,0x20,0x74,0x78,0x20,0x63,0x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,
20720x02,0x00,0x01,0xC0,0x78,0x78,0x3A,0x20,0x72,0x63,0x20,0x63,0x70,0x73,0x20,0x2A,
20730x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0xC0,0x78,0x78,0x3A,0x20,0x72,0x63,0x20,0x63,
20740x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0xC0,0x78,0x78,0x3A,0x20,
20750x72,0x63,0x20,0x63,0x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,0x02,0x00,0x01,0xC0,
20760x78,0x78,0x3A,0x20,0x72,0x63,0x20,0x63,0x70,0x73,0x20,0x2A,0x2A,0x2A,0x2A,0x2A,
20770x02,0x00,0x01,0x80,0x49,0x6E,0x73,0x74,0x61,0x6C,0x6C,0x20,0x4C,0x6F,0x6F,0x70,
20780x62,0x61,0x63,0x6B,0x1F,0x50,0x72,0x65,0x73,0x73,0x20,0x80,0x20,0x74,0x6F,0x20,
20790x73,0x74,0x61,0x72,0x74,0x02,0x00,0x01,0x80,0x20,0x43,0x61,0x62,0x6C,0x65,0x20,
20800x74,0x6F,0x20,0x52,0x65,0x6D,0x6F,0x74,0x65,0x1F,0x50,0x72,0x65,0x73,0x73,0x20,
20810x80,0x20,0x74,0x6F,0x20,0x73,0x74,0x61,0x72,0x74,0x02,0x00,0x01,0x80,0x20,0x4C,
20820x6F,0x63,0x61,0x6C,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,0x63,0x6B,0x20,0x1F,0x20,
20830x20,0x52,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x2E,0x2E,0x2E,0x02,0x00,0x01,0x80,
20840x52,0x65,0x6D,0x6F,0x74,0x65,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,0x63,0x6B,0x20,
20850x1F,0x20,0x20,0x52,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x2E,0x2E,0x2E,0x02,0x00,
20860x01,0x80,0x20,0x49,0x6E,0x74,0x72,0x6E,0x6C,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,
20870x63,0x6B,0x1F,0x20,0x20,0x52,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x2E,0x2E,0x2E,
20880x02,0x00,0x01,0x80,0x54,0x72,0x61,0x6E,0x73,0x6D,0x69,0x74,0x20,0x50,0x61,0x74,
20890x74,0x65,0x72,0x6E,0x1F,0x20,0x20,0x52,0x75,0x6E,0x6E,0x69,0x6E,0x67,0x20,0x2E,
20900x2E,0x2E,0x02,0x00,0x01,0x80,0x20,0x20,0x30,0x3A,0x20,0x27,0x43,0x80,0x00,0x01,
20910x80,0x20,0x20,0x31,0x3A,0x20,0x27,0x43,0x81,0x00,0x01,0x80,0x20,0x20,0x32,0x3A,
20920x20,0x27,0x43,0x82,0x00,0x01,0x80,0x20,0x20,0x33,0x3A,0x20,0x27,0x43,0x83,0x00,
20930x01,0x80,0x20,0x20,0x34,0x3A,0x20,0x27,0x43,0x84,0x00,0x01,0x80,0x20,0x20,0x35,
20940x3A,0x20,0x27,0x43,0x85,0x00,0x01,0x80,0x20,0x20,0x36,0x3A,0x20,0x27,0x43,0x86,
20950x00,0x01,0x80,0x20,0x20,0x37,0x3A,0x20,0x27,0x43,0x87,0x00,0x01,0x80,0x20,0x20,
20960x38,0x3A,0x20,0x27,0x43,0x88,0x00,0x01,0x80,0x20,0x20,0x39,0x3A,0x20,0x27,0x43,
20970x89,0x00,0x01,0x80,0x20,0x31,0x30,0x3A,0x20,0x27,0x43,0x8A,0x00,0x01,0x80,0x20,
20980x31,0x31,0x3A,0x20,0x27,0x43,0x8B,0x00,0x01,0x80,0x20,0x31,0x32,0x3A,0x20,0x27,
20990x43,0x8C,0x00,0x01,0x80,0x20,0x31,0x33,0x3A,0x20,0x27,0x43,0x8D,0x00,0x01,0x80,
21000x20,0x31,0x34,0x3A,0x20,0x27,0x43,0x8E,0x00,0x01,0x80,0x20,0x31,0x35,0x3A,0x20,
21010x27,0x43,0x8F,0x00,0x2A,0x2A,0x20,0x4D,0x61,0x69,0x6E,0x20,0x20,0x4D,0x65,0x6E,
21020x75,0x20,0x2A,0x2A,0x00,0x4D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61,0x20,0x50,
21030x6F,0x72,0x74,0x00,0x4D,0x6F,0x6E,0x69,0x74,0x6F,0x72,0x20,0x61,0x20,0x53,0x69,
21040x67,0x6E,0x61,0x6C,0x00,0x45,0x73,0x74,0x69,0x6D,0x61,0x74,0x65,0x20,0x43,0x50,
21050x53,0x00,0x44,0x69,0x61,0x67,0x6E,0x6F,0x73,0x74,0x69,0x63,0x73,0x00,0x4C,0x6F,
21060x63,0x61,0x6C,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,0x63,0x6B,0x00,0x52,0x65,0x6D,
21070x6F,0x74,0x65,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,0x63,0x6B,0x00,0x49,0x6E,0x74,
21080x72,0x6E,0x6C,0x20,0x4C,0x6F,0x6F,0x70,0x62,0x61,0x63,0x6B,0x00,0x54,0x72,0x61,
21090x6E,0x73,0x6D,0x69,0x74,0x20,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x00,0x42,0x61,
21100x75,0x64,0x20,0x52,0x61,0x74,0x65,0x00,0x44,0x61,0x74,0x61,0x20,0x42,0x69,0x74,
21110x73,0x00,0x53,0x74,0x6F,0x70,0x20,0x42,0x69,0x74,0x73,0x00,0x50,0x61,0x72,0x69,
21120x74,0x79,0x00,0x44,0x61,0x74,0x61,0x20,0x50,0x61,0x74,0x74,0x65,0x72,0x6E,0x00,
21130x54,0x78,0x20,0x46,0x6C,0x6F,0x77,0x20,0x43,0x6F,0x6E,0x74,0x72,0x6F,0x6C,0x00,
21140x50,0x6F,0x72,0x74,0x20,0x4E,0x75,0x6D,0x62,0x65,0x72,0x00,0x35,0x30,0x00,0x37,
21150x35,0x00,0x31,0x31,0x30,0x00,0x31,0x33,0x34,0x2E,0x35,0x00,0x31,0x35,0x30,0x00,
21160x32,0x30,0x30,0x00,0x33,0x30,0x30,0x00,0x36,0x30,0x30,0x00,0x31,0x32,0x30,0x30,
21170x00,0x31,0x38,0x30,0x30,0x00,0x32,0x30,0x30,0x30,0x00,0x32,0x34,0x30,0x30,0x00,
21180x33,0x36,0x30,0x30,0x00,0x34,0x38,0x30,0x30,0x00,0x37,0x32,0x30,0x30,0x00,0x39,
21190x36,0x30,0x30,0x00,0x31,0x39,0x2C,0x32,0x30,0x30,0x00,0x33,0x38,0x2C,0x34,0x30,
21200x30,0x00,0x35,0x36,0x2C,0x30,0x30,0x30,0x00,0x35,0x37,0x2C,0x36,0x30,0x30,0x00,
21210x36,0x34,0x2C,0x30,0x30,0x30,0x00,0x37,0x36,0x2C,0x38,0x30,0x30,0x00,0x31,0x31,
21220x35,0x2C,0x32,0x30,0x30,0x00,0x37,0x20,0x62,0x69,0x74,0x73,0x00,0x38,0x20,0x62,
21230x69,0x74,0x73,0x00,0x31,0x20,0x73,0x74,0x6F,0x70,0x20,0x62,0x69,0x74,0x00,0x31,
21240x2E,0x35,0x20,0x73,0x74,0x6F,0x70,0x20,0x62,0x69,0x74,0x73,0x00,0x32,0x20,0x73,
21250x74,0x6F,0x70,0x20,0x62,0x69,0x74,0x73,0x00,0x6E,0x6F,0x20,0x70,0x61,0x72,0x69,
21260x74,0x79,0x00,0x6F,0x64,0x64,0x20,0x70,0x61,0x72,0x69,0x74,0x79,0x00,0x65,0x76,
21270x65,0x6E,0x20,0x70,0x61,0x72,0x69,0x74,0x79,0x00,0x73,0x70,0x61,0x63,0x65,0x20,
21280x70,0x61,0x72,0x69,0x74,0x79,0x00,0x6D,0x61,0x72,0x6B,0x20,0x70,0x61,0x72,0x69,
21290x74,0x79,0x00,0x43,0x6F,0x6C,0x75,0x6D,0x6E,0x73,0x00,0x42,0x61,0x72,0x62,0x65,
21300x72,0x20,0x50,0x6F,0x6C,0x65,0x00,0x55,0x55,0x55,0x55,0x55,0x2E,0x2E,0x2E,0x00,
21310x4E,0x6F,0x6E,0x65,0x00,0x58,0x6F,0x6E,0x2F,0x58,0x6F,0x66,0x66,0x00,0x43,0x54,
21320x53,0x00,0x50,0x72,0x65,0x73,0x73,0x20,0x80,0x20,0x66,0x6F,0x72,0x20,0x6D,0x65,
21330x6E,0x75,0x00,0x28,0x63,0x6F,0x75,0x6E,0x74,0x69,0x6E,0x67,0x2E,0x2E,0x2E,0x29,
21340x00,0x00,0x65,0x4E,0x64,0x20,0x4F,0x66,0x20,0x43,0x6F,0x44,0x65,0x00,0x00,0x00,
21350x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21360x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21370x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21380x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21390x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21400x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21410x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21420x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21430x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21440x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21450x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21460x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21470x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
21480x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
2149};
diff --git a/drivers/char/ip2/i2cmd.c b/drivers/char/ip2/i2cmd.c
new file mode 100644
index 000000000000..fd299d6c42ac
--- /dev/null
+++ b/drivers/char/ip2/i2cmd.c
@@ -0,0 +1,209 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Definition table for In-line and Bypass commands. Applicable
12* only when the standard loadware is active. (This is included
13* source code, not a separate compilation module.)
14*
15*******************************************************************************/
16
17//------------------------------------------------------------------------------
18//
19// Revision History:
20//
21// 10 October 1991 MAG First Draft
22// 7 November 1991 MAG Reflects additional commands.
23// 24 February 1992 MAG Additional commands for 1.4.x loadware
24// 11 March 1992 MAG Additional commands
25// 30 March 1992 MAG Additional command: CMD_DSS_NOW
26// 18 May 1992 MAG Discovered commands 39 & 40 must be at the end of a
27// packet: affects implementation.
28//------------------------------------------------------------------------------
29
30//************
31//* Includes *
32//************
33
34#include "i2cmd.h" /* To get some bit-defines */
35
36//------------------------------------------------------------------------------
37// Here is the table of global arrays which represent each type of command
38// supported in the IntelliPort standard loadware. See also i2cmd.h
39// for a more complete explanation of what is going on.
40//------------------------------------------------------------------------------
41
42// Here are the various globals: note that the names are not used except through
43// the macros defined in i2cmd.h. Also note that although they are character
44// arrays here (for extendability) they are cast to structure pointers in the
45// i2cmd.h macros. See i2cmd.h for flags definitions.
46
47// Length Flags Command
48static UCHAR ct02[] = { 1, BTH, 0x02 }; // DTR UP
49static UCHAR ct03[] = { 1, BTH, 0x03 }; // DTR DN
50static UCHAR ct04[] = { 1, BTH, 0x04 }; // RTS UP
51static UCHAR ct05[] = { 1, BTH, 0x05 }; // RTS DN
52static UCHAR ct06[] = { 1, BYP, 0x06 }; // START FL
53static UCHAR ct07[] = { 2, BTH, 0x07,0 }; // BAUD
54static UCHAR ct08[] = { 2, BTH, 0x08,0 }; // BITS
55static UCHAR ct09[] = { 2, BTH, 0x09,0 }; // STOP
56static UCHAR ct10[] = { 2, BTH, 0x0A,0 }; // PARITY
57static UCHAR ct11[] = { 2, BTH, 0x0B,0 }; // XON
58static UCHAR ct12[] = { 2, BTH, 0x0C,0 }; // XOFF
59static UCHAR ct13[] = { 1, BTH, 0x0D }; // STOP FL
60static UCHAR ct14[] = { 1, BYP|VIP, 0x0E }; // ACK HOTK
61//static UCHAR ct15[]={ 2, BTH|VIP, 0x0F,0 }; // IRQ SET
62static UCHAR ct16[] = { 2, INL, 0x10,0 }; // IXONOPTS
63static UCHAR ct17[] = { 2, INL, 0x11,0 }; // OXONOPTS
64static UCHAR ct18[] = { 1, INL, 0x12 }; // CTSENAB
65static UCHAR ct19[] = { 1, BTH, 0x13 }; // CTSDSAB
66static UCHAR ct20[] = { 1, INL, 0x14 }; // DCDENAB
67static UCHAR ct21[] = { 1, BTH, 0x15 }; // DCDDSAB
68static UCHAR ct22[] = { 1, BTH, 0x16 }; // DSRENAB
69static UCHAR ct23[] = { 1, BTH, 0x17 }; // DSRDSAB
70static UCHAR ct24[] = { 1, BTH, 0x18 }; // RIENAB
71static UCHAR ct25[] = { 1, BTH, 0x19 }; // RIDSAB
72static UCHAR ct26[] = { 2, BTH, 0x1A,0 }; // BRKENAB
73static UCHAR ct27[] = { 1, BTH, 0x1B }; // BRKDSAB
74//static UCHAR ct28[]={ 2, BTH, 0x1C,0 }; // MAXBLOKSIZE
75//static UCHAR ct29[]={ 2, 0, 0x1D,0 }; // reserved
76static UCHAR ct30[] = { 1, INL, 0x1E }; // CTSFLOWENAB
77static UCHAR ct31[] = { 1, INL, 0x1F }; // CTSFLOWDSAB
78static UCHAR ct32[] = { 1, INL, 0x20 }; // RTSFLOWENAB
79static UCHAR ct33[] = { 1, INL, 0x21 }; // RTSFLOWDSAB
80static UCHAR ct34[] = { 2, BTH, 0x22,0 }; // ISTRIPMODE
81static UCHAR ct35[] = { 2, BTH|END, 0x23,0 }; // SENDBREAK
82static UCHAR ct36[] = { 2, BTH, 0x24,0 }; // SETERRMODE
83//static UCHAR ct36a[]={ 3, INL, 0x24,0,0 }; // SET_REPLACE
84
85// The following is listed for completeness, but should never be sent directly
86// by user-level code. It is sent only by library routines in response to data
87// movement.
88//static UCHAR ct37[]={ 5, BYP|VIP, 0x25,0,0,0,0 }; // FLOW PACKET
89
90// Back to normal
91//static UCHAR ct38[] = {11, BTH|VAR, 0x26,0,0,0,0,0,0,0,0,0,0 }; // DEF KEY SEQ
92//static UCHAR ct39[]={ 3, BTH|END, 0x27,0,0 }; // OPOSTON
93//static UCHAR ct40[]={ 1, BTH|END, 0x28 }; // OPOSTOFF
94static UCHAR ct41[] = { 1, BYP, 0x29 }; // RESUME
95//static UCHAR ct42[]={ 2, BTH, 0x2A,0 }; // TXBAUD
96//static UCHAR ct43[]={ 2, BTH, 0x2B,0 }; // RXBAUD
97//static UCHAR ct44[]={ 2, BTH, 0x2C,0 }; // MS PING
98//static UCHAR ct45[]={ 1, BTH, 0x2D }; // HOTENAB
99//static UCHAR ct46[]={ 1, BTH, 0x2E }; // HOTDSAB
100static UCHAR ct47[] = { 7, BTH, 0x2F,0,0,0,0,0,0 }; // UNIX FLAGS
101//static UCHAR ct48[]={ 1, BTH, 0x30 }; // DSRFLOWENAB
102//static UCHAR ct49[]={ 1, BTH, 0x31 }; // DSRFLOWDSAB
103//static UCHAR ct50[]={ 1, BTH, 0x32 }; // DTRFLOWENAB
104//static UCHAR ct51[]={ 1, BTH, 0x33 }; // DTRFLOWDSAB
105//static UCHAR ct52[]={ 1, BTH, 0x34 }; // BAUDTABRESET
106//static UCHAR ct53[] = { 3, BTH, 0x35,0,0 }; // BAUDREMAP
107static UCHAR ct54[] = { 3, BTH, 0x36,0,0 }; // CUSTOMBAUD1
108static UCHAR ct55[] = { 3, BTH, 0x37,0,0 }; // CUSTOMBAUD2
109static UCHAR ct56[] = { 2, BTH|END, 0x38,0 }; // PAUSE
110static UCHAR ct57[] = { 1, BYP, 0x39 }; // SUSPEND
111static UCHAR ct58[] = { 1, BYP, 0x3A }; // UNSUSPEND
112static UCHAR ct59[] = { 2, BTH, 0x3B,0 }; // PARITYCHK
113static UCHAR ct60[] = { 1, INL|VIP, 0x3C }; // BOOKMARKREQ
114//static UCHAR ct61[]={ 2, BTH, 0x3D,0 }; // INTERNALLOOP
115//static UCHAR ct62[]={ 2, BTH, 0x3E,0 }; // HOTKTIMEOUT
116static UCHAR ct63[] = { 2, INL, 0x3F,0 }; // SETTXON
117static UCHAR ct64[] = { 2, INL, 0x40,0 }; // SETTXOFF
118//static UCHAR ct65[]={ 2, BTH, 0x41,0 }; // SETAUTORTS
119//static UCHAR ct66[]={ 2, BTH, 0x42,0 }; // SETHIGHWAT
120//static UCHAR ct67[]={ 2, BYP, 0x43,0 }; // STARTSELFL
121//static UCHAR ct68[]={ 2, INL, 0x44,0 }; // ENDSELFL
122//static UCHAR ct69[]={ 1, BYP, 0x45 }; // HWFLOW_OFF
123//static UCHAR ct70[]={ 1, BTH, 0x46 }; // ODSRFL_ENAB
124//static UCHAR ct71[]={ 1, BTH, 0x47 }; // ODSRFL_DSAB
125//static UCHAR ct72[]={ 1, BTH, 0x48 }; // ODCDFL_ENAB
126//static UCHAR ct73[]={ 1, BTH, 0x49 }; // ODCDFL_DSAB
127//static UCHAR ct74[]={ 2, BTH, 0x4A,0 }; // LOADLEVEL
128//static UCHAR ct75[]={ 2, BTH, 0x4B,0 }; // STATDATA
129//static UCHAR ct76[]={ 1, BYP, 0x4C }; // BREAK_ON
130//static UCHAR ct77[]={ 1, BYP, 0x4D }; // BREAK_OFF
131//static UCHAR ct78[]={ 1, BYP, 0x4E }; // GETFC
132static UCHAR ct79[] = { 2, BYP, 0x4F,0 }; // XMIT_NOW
133//static UCHAR ct80[]={ 4, BTH, 0x50,0,0,0 }; // DIVISOR_LATCH
134//static UCHAR ct81[]={ 1, BYP, 0x51 }; // GET_STATUS
135//static UCHAR ct82[]={ 1, BYP, 0x52 }; // GET_TXCNT
136//static UCHAR ct83[]={ 1, BYP, 0x53 }; // GET_RXCNT
137//static UCHAR ct84[]={ 1, BYP, 0x54 }; // GET_BOXIDS
138//static UCHAR ct85[]={10, BYP, 0x55,0,0,0,0,0,0,0,0,0 }; // ENAB_MULT
139//static UCHAR ct86[]={ 2, BTH, 0x56,0 }; // RCV_ENABLE
140static UCHAR ct87[] = { 1, BYP, 0x57 }; // HW_TEST
141//static UCHAR ct88[]={ 3, BTH, 0x58,0,0 }; // RCV_THRESHOLD
142static UCHAR ct89[]={ 1, BYP, 0x59 }; // DSS_NOW
143//static UCHAR ct90[]={ 3, BYP, 0x5A,0,0 }; // Set SILO
144//static UCHAR ct91[]={ 2, BYP, 0x5B,0 }; // timed break
145
146// Some composite commands as well
147//static UCHAR cc01[]={ 2, BTH, 0x02,0x04 }; // DTR & RTS UP
148//static UCHAR cc02[]={ 2, BTH, 0x03,0x05 }; // DTR & RTS DN
149
150//********
151//* Code *
152//********
153
154//******************************************************************************
155// Function: i2cmdUnixFlags(iflag, cflag, lflag)
156// Parameters: Unix tty flags
157//
158// Returns: Pointer to command structure
159//
160// Description:
161//
162// This routine sets the parameters of command 47 and returns a pointer to the
163// appropriate structure.
164//******************************************************************************
165cmdSyntaxPtr
166i2cmdUnixFlags(unsigned short iflag,unsigned short cflag,unsigned short lflag)
167{
168 cmdSyntaxPtr pCM = (cmdSyntaxPtr) ct47;
169
170 pCM->cmd[1] = (unsigned char) iflag;
171 pCM->cmd[2] = (unsigned char) (iflag >> 8);
172 pCM->cmd[3] = (unsigned char) cflag;
173 pCM->cmd[4] = (unsigned char) (cflag >> 8);
174 pCM->cmd[5] = (unsigned char) lflag;
175 pCM->cmd[6] = (unsigned char) (lflag >> 8);
176 return pCM;
177}
178
179//******************************************************************************
180// Function: i2cmdBaudDef(which, rate)
181// Parameters: ?
182//
183// Returns: Pointer to command structure
184//
185// Description:
186//
187// This routine sets the parameters of commands 54 or 55 (according to the
188// argument which), and returns a pointer to the appropriate structure.
189//******************************************************************************
190cmdSyntaxPtr
191i2cmdBaudDef(int which, unsigned short rate)
192{
193 cmdSyntaxPtr pCM;
194
195 switch(which)
196 {
197 case 1:
198 pCM = (cmdSyntaxPtr) ct54;
199 break;
200 default:
201 case 2:
202 pCM = (cmdSyntaxPtr) ct55;
203 break;
204 }
205 pCM->cmd[1] = (unsigned char) rate;
206 pCM->cmd[2] = (unsigned char) (rate >> 8);
207 return pCM;
208}
209
diff --git a/drivers/char/ip2/i2cmd.h b/drivers/char/ip2/i2cmd.h
new file mode 100644
index 000000000000..c41728a85710
--- /dev/null
+++ b/drivers/char/ip2/i2cmd.h
@@ -0,0 +1,643 @@
1/*******************************************************************************
2*
3* (c) 1999 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Definitions and support for In-line and Bypass commands.
12* Applicable only when the standard loadware is active.
13*
14*******************************************************************************/
15//------------------------------------------------------------------------------
16// Revision History:
17//
18// 10 October 1991 MAG First Draft
19// 7 November 1991 MAG Reflects some new commands
20// 20 February 1992 MAG CMD_HOTACK corrected: no argument.
21// 24 February 1992 MAG Support added for new commands for 1.4.x loadware.
22// 11 March 1992 MAG Additional commands.
23// 16 March 1992 MAG Additional commands.
24// 30 March 1992 MAG Additional command: CMD_DSS_NOW
25// 18 May 1992 MAG Changed CMD_OPOST
26//
27//------------------------------------------------------------------------------
28#ifndef I2CMD_H // To prevent multiple includes
29#define I2CMD_H 1
30
31#include "ip2types.h"
32
33// This module is designed to provide a uniform method of sending commands to
34// the board through command packets. The difficulty is, some commands take
35// parameters, others do not. Furthermore, it is often useful to send several
36// commands to the same channel as part of the same packet. (See also i2pack.h.)
37//
38// This module is designed so that the caller should not be responsible for
39// remembering the exact syntax of each command, or at least so that the
40// compiler could check things somewhat. I'll explain as we go...
41//
42// First, a structure which can embody the syntax of each type of command.
43//
44typedef struct _cmdSyntax
45{
46 UCHAR length; // Number of bytes in the command
47 UCHAR flags; // Information about the command (see below)
48
49 // The command and its parameters, which may be of arbitrary length. Don't
50 // worry yet how the parameters will be initialized; macros later take care
51 // of it. Also, don't worry about the arbitrary length issue; this structure
52 // is never used to allocate space (see i2cmd.c).
53 UCHAR cmd[2];
54} cmdSyntax, *cmdSyntaxPtr;
55
56// Bit assignments for flags
57
58#define INL 1 // Set if suitable for inline commands
59#define BYP 2 // Set if suitable for bypass commands
60#define BTH (INL|BYP) // suitable for either!
61#define END 4 // Set if this must be the last command in a block
62#define VIP 8 // Set if this command is special in some way and really
63 // should only be sent from the library-level and not
64 // directly from user-level
65#define VAR 0x10 // This command is of variable length!
66
67//-----------------------------------
68// External declarations for i2cmd.c
69//-----------------------------------
70// Routine to set up parameters for the "define hot-key sequence" command. Since
71// there is more than one parameter to assign, we must use a function rather
72// than a macro (used usually).
73//
74extern cmdSyntaxPtr i2cmdUnixFlags(USHORT iflag,USHORT cflag,USHORT lflag);
75extern cmdSyntaxPtr i2cmdBaudDef(int which, USHORT rate);
76
77// Declarations for the global arrays used to bear the commands and their
78// arguments.
79//
80// Note: Since these are globals and the arguments might change, it is important
81// that the library routine COPY these into buffers from whence they would be
82// sent, rather than merely storing the pointers. In multi-threaded
83// environments, important that the copy should obtain before any context switch
84// is allowed. Also, for parameterized commands, DO NOT ISSUE THE SAME COMMAND
85// MORE THAN ONCE WITH THE SAME PARAMETERS in the same call.
86//
87static UCHAR ct02[];
88static UCHAR ct03[];
89static UCHAR ct04[];
90static UCHAR ct05[];
91static UCHAR ct06[];
92static UCHAR ct07[];
93static UCHAR ct08[];
94static UCHAR ct09[];
95static UCHAR ct10[];
96static UCHAR ct11[];
97static UCHAR ct12[];
98static UCHAR ct13[];
99static UCHAR ct14[];
100static UCHAR ct15[];
101static UCHAR ct16[];
102static UCHAR ct17[];
103static UCHAR ct18[];
104static UCHAR ct19[];
105static UCHAR ct20[];
106static UCHAR ct21[];
107static UCHAR ct22[];
108static UCHAR ct23[];
109static UCHAR ct24[];
110static UCHAR ct25[];
111static UCHAR ct26[];
112static UCHAR ct27[];
113static UCHAR ct28[];
114static UCHAR ct29[];
115static UCHAR ct30[];
116static UCHAR ct31[];
117static UCHAR ct32[];
118static UCHAR ct33[];
119static UCHAR ct34[];
120static UCHAR ct35[];
121static UCHAR ct36[];
122static UCHAR ct36a[];
123static UCHAR ct41[];
124static UCHAR ct42[];
125static UCHAR ct43[];
126static UCHAR ct44[];
127static UCHAR ct45[];
128static UCHAR ct46[];
129static UCHAR ct48[];
130static UCHAR ct49[];
131static UCHAR ct50[];
132static UCHAR ct51[];
133static UCHAR ct52[];
134static UCHAR ct56[];
135static UCHAR ct57[];
136static UCHAR ct58[];
137static UCHAR ct59[];
138static UCHAR ct60[];
139static UCHAR ct61[];
140static UCHAR ct62[];
141static UCHAR ct63[];
142static UCHAR ct64[];
143static UCHAR ct65[];
144static UCHAR ct66[];
145static UCHAR ct67[];
146static UCHAR ct68[];
147static UCHAR ct69[];
148static UCHAR ct70[];
149static UCHAR ct71[];
150static UCHAR ct72[];
151static UCHAR ct73[];
152static UCHAR ct74[];
153static UCHAR ct75[];
154static UCHAR ct76[];
155static UCHAR ct77[];
156static UCHAR ct78[];
157static UCHAR ct79[];
158static UCHAR ct80[];
159static UCHAR ct81[];
160static UCHAR ct82[];
161static UCHAR ct83[];
162static UCHAR ct84[];
163static UCHAR ct85[];
164static UCHAR ct86[];
165static UCHAR ct87[];
166static UCHAR ct88[];
167static UCHAR ct89[];
168static UCHAR ct90[];
169static UCHAR ct91[];
170static UCHAR cc01[];
171static UCHAR cc02[];
172
173// Now, refer to i2cmd.c, and see the character arrays defined there. They are
174// cast here to cmdSyntaxPtr.
175//
176// There are library functions for issuing bypass or inline commands. These
177// functions take one or more arguments of the type cmdSyntaxPtr. The routine
178// then can figure out how long each command is supposed to be and easily add it
179// to the list.
180//
181// For ease of use, we define manifests which return pointers to appropriate
182// cmdSyntaxPtr things. But some commands also take arguments. If a single
183// argument is used, we define a macro which performs the single assignment and
184// (through the expedient of a comma expression) references the appropriate
185// pointer. For commands requiring several arguments, we actually define a
186// function to perform the assignments.
187
188#define CMD_DTRUP (cmdSyntaxPtr)(ct02) // Raise DTR
189#define CMD_DTRDN (cmdSyntaxPtr)(ct03) // Lower DTR
190#define CMD_RTSUP (cmdSyntaxPtr)(ct04) // Raise RTS
191#define CMD_RTSDN (cmdSyntaxPtr)(ct05) // Lower RTS
192#define CMD_STARTFL (cmdSyntaxPtr)(ct06) // Start Flushing Data
193
194#define CMD_DTRRTS_UP (cmdSyntaxPtr)(cc01) // Raise DTR and RTS
195#define CMD_DTRRTS_DN (cmdSyntaxPtr)(cc02) // Lower DTR and RTS
196
197// Set Baud Rate for transmit and receive
198#define CMD_SETBAUD(arg) \
199 (((cmdSyntaxPtr)(ct07))->cmd[1] = (arg),(cmdSyntaxPtr)(ct07))
200
201#define CBR_50 1
202#define CBR_75 2
203#define CBR_110 3
204#define CBR_134 4
205#define CBR_150 5
206#define CBR_200 6
207#define CBR_300 7
208#define CBR_600 8
209#define CBR_1200 9
210#define CBR_1800 10
211#define CBR_2400 11
212#define CBR_4800 12
213#define CBR_9600 13
214#define CBR_19200 14
215#define CBR_38400 15
216#define CBR_2000 16
217#define CBR_3600 17
218#define CBR_7200 18
219#define CBR_56000 19
220#define CBR_57600 20
221#define CBR_64000 21
222#define CBR_76800 22
223#define CBR_115200 23
224#define CBR_C1 24 // Custom baud rate 1
225#define CBR_C2 25 // Custom baud rate 2
226#define CBR_153600 26
227#define CBR_230400 27
228#define CBR_307200 28
229#define CBR_460800 29
230#define CBR_921600 30
231
232// Set Character size
233//
234#define CMD_SETBITS(arg) \
235 (((cmdSyntaxPtr)(ct08))->cmd[1] = (arg),(cmdSyntaxPtr)(ct08))
236
237#define CSZ_5 0
238#define CSZ_6 1
239#define CSZ_7 2
240#define CSZ_8 3
241
242// Set number of stop bits
243//
244#define CMD_SETSTOP(arg) \
245 (((cmdSyntaxPtr)(ct09))->cmd[1] = (arg),(cmdSyntaxPtr)(ct09))
246
247#define CST_1 0
248#define CST_15 1 // 1.5 stop bits
249#define CST_2 2
250
251// Set parity option
252//
253#define CMD_SETPAR(arg) \
254 (((cmdSyntaxPtr)(ct10))->cmd[1] = (arg),(cmdSyntaxPtr)(ct10))
255
256#define CSP_NP 0 // no parity
257#define CSP_OD 1 // odd parity
258#define CSP_EV 2 // Even parity
259#define CSP_SP 3 // Space parity
260#define CSP_MK 4 // Mark parity
261
262// Define xon char for transmitter flow control
263//
264#define CMD_DEF_IXON(arg) \
265 (((cmdSyntaxPtr)(ct11))->cmd[1] = (arg),(cmdSyntaxPtr)(ct11))
266
267// Define xoff char for transmitter flow control
268//
269#define CMD_DEF_IXOFF(arg) \
270 (((cmdSyntaxPtr)(ct12))->cmd[1] = (arg),(cmdSyntaxPtr)(ct12))
271
272#define CMD_STOPFL (cmdSyntaxPtr)(ct13) // Stop Flushing data
273
274// Acknowledge receipt of hotkey signal
275//
276#define CMD_HOTACK (cmdSyntaxPtr)(ct14)
277
278// Define irq level to use. Should actually be sent by library-level code, not
279// directly from user...
280//
281#define CMDVALUE_IRQ 15 // For library use at initialization. Until this command
282 // is sent, board processing doesn't really start.
283#define CMD_SET_IRQ(arg) \
284 (((cmdSyntaxPtr)(ct15))->cmd[1] = (arg),(cmdSyntaxPtr)(ct15))
285
286#define CIR_POLL 0 // No IRQ - Poll
287#define CIR_3 3 // IRQ 3
288#define CIR_4 4 // IRQ 4
289#define CIR_5 5 // IRQ 5
290#define CIR_7 7 // IRQ 7
291#define CIR_10 10 // IRQ 10
292#define CIR_11 11 // IRQ 11
293#define CIR_12 12 // IRQ 12
294#define CIR_15 15 // IRQ 15
295
296// Select transmit flow xon/xoff options
297//
298#define CMD_IXON_OPT(arg) \
299 (((cmdSyntaxPtr)(ct16))->cmd[1] = (arg),(cmdSyntaxPtr)(ct16))
300
301#define CIX_NONE 0 // Incoming Xon/Xoff characters not special
302#define CIX_XON 1 // Xoff disable, Xon enable
303#define CIX_XANY 2 // Xoff disable, any key enable
304
305// Select receive flow xon/xoff options
306//
307#define CMD_OXON_OPT(arg) \
308 (((cmdSyntaxPtr)(ct17))->cmd[1] = (arg),(cmdSyntaxPtr)(ct17))
309
310#define COX_NONE 0 // Don't send Xon/Xoff
311#define COX_XON 1 // Send xon/xoff to start/stop incoming data
312
313
314#define CMD_CTS_REP (cmdSyntaxPtr)(ct18) // Enable CTS reporting
315#define CMD_CTS_NREP (cmdSyntaxPtr)(ct19) // Disable CTS reporting
316
317#define CMD_DCD_REP (cmdSyntaxPtr)(ct20) // Enable DCD reporting
318#define CMD_DCD_NREP (cmdSyntaxPtr)(ct21) // Disable DCD reporting
319
320#define CMD_DSR_REP (cmdSyntaxPtr)(ct22) // Enable DSR reporting
321#define CMD_DSR_NREP (cmdSyntaxPtr)(ct23) // Disable DSR reporting
322
323#define CMD_RI_REP (cmdSyntaxPtr)(ct24) // Enable RI reporting
324#define CMD_RI_NREP (cmdSyntaxPtr)(ct25) // Disable RI reporting
325
326// Enable break reporting and select style
327//
328#define CMD_BRK_REP(arg) \
329 (((cmdSyntaxPtr)(ct26))->cmd[1] = (arg),(cmdSyntaxPtr)(ct26))
330
331#define CBK_STAT 0x00 // Report breaks as a status (exception,irq)
332#define CBK_NULL 0x01 // Report breaks as a good null
333#define CBK_STAT_SEQ 0x02 // Report breaks as a status AND as in-band character
334 // sequence FFh, 01h, 10h
335#define CBK_SEQ 0x03 // Report breaks as the in-band
336 //sequence FFh, 01h, 10h ONLY.
337#define CBK_FLSH 0x04 // if this bit set also flush input data
338#define CBK_POSIX 0x08 // if this bit set report as FF,0,0 sequence
339#define CBK_SINGLE 0x10 // if this bit set with CBK_SEQ or CBK_STAT_SEQ
340 //then reports single null instead of triple
341
342#define CMD_BRK_NREP (cmdSyntaxPtr)(ct27) // Disable break reporting
343
344// Specify maximum block size for received data
345//
346#define CMD_MAX_BLOCK(arg) \
347 (((cmdSyntaxPtr)(ct28))->cmd[1] = (arg),(cmdSyntaxPtr)(ct28))
348
349// -- COMMAND 29 is reserved --
350
351#define CMD_CTSFL_ENAB (cmdSyntaxPtr)(ct30) // Enable CTS flow control
352#define CMD_CTSFL_DSAB (cmdSyntaxPtr)(ct31) // Disable CTS flow control
353#define CMD_RTSFL_ENAB (cmdSyntaxPtr)(ct32) // Enable RTS flow control
354#define CMD_RTSFL_DSAB (cmdSyntaxPtr)(ct33) // Disable RTS flow control
355
356// Specify istrip option
357//
358#define CMD_ISTRIP_OPT(arg) \
359 (((cmdSyntaxPtr)(ct34))->cmd[1] = (arg),(cmdSyntaxPtr)(ct34))
360
361#define CIS_NOSTRIP 0 // Strip characters to character size
362#define CIS_STRIP 1 // Strip any 8-bit characters to 7 bits
363
364// Send a break of arg milliseconds
365//
366#define CMD_SEND_BRK(arg) \
367 (((cmdSyntaxPtr)(ct35))->cmd[1] = (arg),(cmdSyntaxPtr)(ct35))
368
369// Set error reporting mode
370//
371#define CMD_SET_ERROR(arg) \
372 (((cmdSyntaxPtr)(ct36))->cmd[1] = (arg),(cmdSyntaxPtr)(ct36))
373
374#define CSE_ESTAT 0 // Report error in a status packet
375#define CSE_NOREP 1 // Treat character as though it were good
376#define CSE_DROP 2 // Discard the character
377#define CSE_NULL 3 // Replace with a null
378#define CSE_MARK 4 // Replace with a 3-character sequence (as Unix)
379
380#define CMD_SET_REPLACEMENT(arg,ch) \
381 (((cmdSyntaxPtr)(ct36a))->cmd[1] = (arg), \
382 (((cmdSyntaxPtr)(ct36a))->cmd[2] = (ch), \
383 (cmdSyntaxPtr)(ct36a))
384
385#define CSE_REPLACE 0x8 // Replace the errored character with the
386 // replacement character defined here
387
388#define CSE_STAT_REPLACE 0x18 // Replace the errored character with the
389 // replacement character defined here AND
390 // report the error as a status packet (as in
391 // CSE_ESTAT).
392
393
394// COMMAND 37, to send flow control packets, is handled only by low-level
395// library code in response to data movement and shouldn't ever be sent by the
396// user code. See i2pack.h and the body of i2lib.c for details.
397
398// Enable on-board post-processing, using options given in oflag argument.
399// Formerly, this command was automatically preceded by a CMD_OPOST_OFF command
400// because the loadware does not permit sending back-to-back CMD_OPOST_ON
401// commands without an intervening CMD_OPOST_OFF. BUT, WE LEARN 18 MAY 92, that
402// CMD_OPOST_ON and CMD_OPOST_OFF must each be at the end of a packet (or in a
403// solo packet). This means the caller must specify separately CMD_OPOST_OFF,
404// CMD_OPOST_ON(parm) when he calls i2QueueCommands(). That function will ensure
405// each gets a separate packet. Extra CMD_OPOST_OFF's are always ok.
406//
407#define CMD_OPOST_ON(oflag) \
408 (*(USHORT *)(((cmdSyntaxPtr)(ct39))->cmd[1]) = (oflag), \
409 (cmdSyntaxPtr)(ct39))
410
411#define CMD_OPOST_OFF (cmdSyntaxPtr)(ct40) // Disable on-board post-proc
412
413#define CMD_RESUME (cmdSyntaxPtr)(ct41) // Resume: behave as though an XON
414 // were received;
415
416// Set Transmit baud rate (see command 7 for arguments)
417//
418#define CMD_SETBAUD_TX(arg) \
419 (((cmdSyntaxPtr)(ct42))->cmd[1] = (arg),(cmdSyntaxPtr)(ct42))
420
421// Set Receive baud rate (see command 7 for arguments)
422//
423#define CMD_SETBAUD_RX(arg) \
424 (((cmdSyntaxPtr)(ct43))->cmd[1] = (arg),(cmdSyntaxPtr)(ct43))
425
426// Request interrupt from board each arg milliseconds. Interrupt will specify
427// "received data", even though there may be no data present. If arg == 0,
428// disables any such interrupts.
429//
430#define CMD_PING_REQ(arg) \
431 (((cmdSyntaxPtr)(ct44))->cmd[1] = (arg),(cmdSyntaxPtr)(ct44))
432
433#define CMD_HOT_ENAB (cmdSyntaxPtr)(ct45) // Enable Hot-key checking
434#define CMD_HOT_DSAB (cmdSyntaxPtr)(ct46) // Disable Hot-key checking
435
436// COMMAND 47: Send Protocol info via Unix flags:
437// iflag = Unix tty t_iflag
438// cflag = Unix tty t_cflag
439// lflag = Unix tty t_lflag
440// See System V Unix/Xenix documentation for the meanings of the bit fields
441// within these flags
442//
443#define CMD_UNIX_FLAGS(iflag,cflag,lflag) i2cmdUnixFlags(iflag,cflag,lflag)
444
445#define CMD_DSRFL_ENAB (cmdSyntaxPtr)(ct48) // Enable DSR receiver ctrl
446#define CMD_DSRFL_DSAB (cmdSyntaxPtr)(ct49) // Disable DSR receiver ctrl
447#define CMD_DTRFL_ENAB (cmdSyntaxPtr)(ct50) // Enable DTR flow control
448#define CMD_DTRFL_DSAB (cmdSyntaxPtr)(ct51) // Disable DTR flow control
449#define CMD_BAUD_RESET (cmdSyntaxPtr)(ct52) // Reset baudrate table
450
451// COMMAND 54: Define custom rate #1
452// rate = (short) 1/10 of the desired baud rate
453//
454#define CMD_BAUD_DEF1(rate) i2cmdBaudDef(1,rate)
455
456// COMMAND 55: Define custom rate #2
457// rate = (short) 1/10 of the desired baud rate
458//
459#define CMD_BAUD_DEF2(rate) i2cmdBaudDef(2,rate)
460
461// Pause arg hundredths of seconds. (Note, this is NOT milliseconds.)
462//
463#define CMD_PAUSE(arg) \
464 (((cmdSyntaxPtr)(ct56))->cmd[1] = (arg),(cmdSyntaxPtr)(ct56))
465
466#define CMD_SUSPEND (cmdSyntaxPtr)(ct57) // Suspend output
467#define CMD_UNSUSPEND (cmdSyntaxPtr)(ct58) // Un-Suspend output
468
469// Set parity-checking options
470//
471#define CMD_PARCHK(arg) \
472 (((cmdSyntaxPtr)(ct59))->cmd[1] = (arg),(cmdSyntaxPtr)(ct59))
473
474#define CPK_ENAB 0 // Enable parity checking on input
475#define CPK_DSAB 1 // Disable parity checking on input
476
477#define CMD_BMARK_REQ (cmdSyntaxPtr)(ct60) // Bookmark request
478
479
480// Enable/Disable internal loopback mode
481//
482#define CMD_INLOOP(arg) \
483 (((cmdSyntaxPtr)(ct61))->cmd[1] = (arg),(cmdSyntaxPtr)(ct61))
484
485#define CIN_DISABLE 0 // Normal operation (default)
486#define CIN_ENABLE 1 // Internal (local) loopback
487#define CIN_REMOTE 2 // Remote loopback
488
489// Specify timeout for hotkeys: Delay will be (arg x 10) milliseconds, arg == 0
490// --> no timeout: wait forever.
491//
492#define CMD_HOT_TIME(arg) \
493 (((cmdSyntaxPtr)(ct62))->cmd[1] = (arg),(cmdSyntaxPtr)(ct62))
494
495
496// Define (outgoing) xon for receive flow control
497//
498#define CMD_DEF_OXON(arg) \
499 (((cmdSyntaxPtr)(ct63))->cmd[1] = (arg),(cmdSyntaxPtr)(ct63))
500
501// Define (outgoing) xoff for receiver flow control
502//
503#define CMD_DEF_OXOFF(arg) \
504 (((cmdSyntaxPtr)(ct64))->cmd[1] = (arg),(cmdSyntaxPtr)(ct64))
505
506// Enable/Disable RTS on transmit (1/2 duplex-style)
507//
508#define CMD_RTS_XMIT(arg) \
509 (((cmdSyntaxPtr)(ct65))->cmd[1] = (arg),(cmdSyntaxPtr)(ct65))
510
511#define CHD_DISABLE 0
512#define CHD_ENABLE 1
513
514// Set high-water-mark level (debugging use only)
515//
516#define CMD_SETHIGHWAT(arg) \
517 (((cmdSyntaxPtr)(ct66))->cmd[1] = (arg),(cmdSyntaxPtr)(ct66))
518
519// Start flushing tagged data (tag = 0-14)
520//
521#define CMD_START_SELFL(tag) \
522 (((cmdSyntaxPtr)(ct67))->cmd[1] = (tag),(cmdSyntaxPtr)(ct67))
523
524// End flushing tagged data (tag = 0-14)
525//
526#define CMD_END_SELFL(tag) \
527 (((cmdSyntaxPtr)(ct68))->cmd[1] = (tag),(cmdSyntaxPtr)(ct68))
528
529#define CMD_HWFLOW_OFF (cmdSyntaxPtr)(ct69) // Disable HW TX flow control
530#define CMD_ODSRFL_ENAB (cmdSyntaxPtr)(ct70) // Enable DSR output f/c
531#define CMD_ODSRFL_DSAB (cmdSyntaxPtr)(ct71) // Disable DSR output f/c
532#define CMD_ODCDFL_ENAB (cmdSyntaxPtr)(ct72) // Enable DCD output f/c
533#define CMD_ODCDFL_DSAB (cmdSyntaxPtr)(ct73) // Disable DCD output f/c
534
535// Set transmit interrupt load level. Count should be an even value 2-12
536//
537#define CMD_LOADLEVEL(count) \
538 (((cmdSyntaxPtr)(ct74))->cmd[1] = (count),(cmdSyntaxPtr)(ct74))
539
540// If reporting DSS changes, map to character sequence FFh, 2, MSR
541//
542#define CMD_STATDATA(arg) \
543 (((cmdSyntaxPtr)(ct75))->cmd[1] = (arg),(cmdSyntaxPtr)(ct75))
544
545#define CSTD_DISABLE// Report DSS changes as status packets only (default)
546#define CSTD_ENABLE // Report DSS changes as in-band data sequence as well as
547 // by status packet.
548
549#define CMD_BREAK_ON (cmdSyntaxPtr)(ct76)// Set break and stop xmit
550#define CMD_BREAK_OFF (cmdSyntaxPtr)(ct77)// End break and restart xmit
551#define CMD_GETFC (cmdSyntaxPtr)(ct78)// Request for flow control packet
552 // from board.
553
554// Transmit this character immediately
555//
556#define CMD_XMIT_NOW(ch) \
557 (((cmdSyntaxPtr)(ct79))->cmd[1] = (ch),(cmdSyntaxPtr)(ct79))
558
559// Set baud rate via "divisor latch"
560//
561#define CMD_DIVISOR_LATCH(which,value) \
562 (((cmdSyntaxPtr)(ct80))->cmd[1] = (which), \
563 *(USHORT *)(((cmdSyntaxPtr)(ct80))->cmd[2]) = (value), \
564 (cmdSyntaxPtr)(ct80))
565
566#define CDL_RX 1 // Set receiver rate
567#define CDL_TX 2 // Set transmit rate
568 // (CDL_TX | CDL_RX) Set both rates
569
570// Request for special diagnostic status pkt from the board.
571//
572#define CMD_GET_STATUS (cmdSyntaxPtr)(ct81)
573
574// Request time-stamped transmit character count packet.
575//
576#define CMD_GET_TXCNT (cmdSyntaxPtr)(ct82)
577
578// Request time-stamped receive character count packet.
579//
580#define CMD_GET_RXCNT (cmdSyntaxPtr)(ct83)
581
582// Request for box/board I.D. packet.
583#define CMD_GET_BOXIDS (cmdSyntaxPtr)(ct84)
584
585// Enable or disable multiple channels according to bit-mapped ushorts box 1-4
586//
587#define CMD_ENAB_MULT(enable, box1, box2, box3, box4) \
588 (((cmdSytaxPtr)(ct85))->cmd[1] = (enable), \
589 *(USHORT *)(((cmdSyntaxPtr)(ct85))->cmd[2]) = (box1), \
590 *(USHORT *)(((cmdSyntaxPtr)(ct85))->cmd[4]) = (box2), \
591 *(USHORT *)(((cmdSyntaxPtr)(ct85))->cmd[6]) = (box3), \
592 *(USHORT *)(((cmdSyntaxPtr)(ct85))->cmd[8]) = (box4), \
593 (cmdSyntaxPtr)(ct85))
594
595#define CEM_DISABLE 0
596#define CEM_ENABLE 1
597
598// Enable or disable receiver or receiver interrupts (default both enabled)
599//
600#define CMD_RCV_ENABLE(ch) \
601 (((cmdSyntaxPtr)(ct86))->cmd[1] = (ch),(cmdSyntaxPtr)(ct86))
602
603#define CRE_OFF 0 // Disable the receiver
604#define CRE_ON 1 // Enable the receiver
605#define CRE_INTOFF 2 // Disable receiver interrupts (to loadware)
606#define CRE_INTON 3 // Enable receiver interrupts (to loadware)
607
608// Starts up a hardware test process, which runs transparently, and sends a
609// STAT_HWFAIL packet in case a hardware failure is detected.
610//
611#define CMD_HW_TEST (cmdSyntaxPtr)(ct87)
612
613// Change receiver threshold and timeout value:
614// Defaults: timeout = 20mS
615// threshold count = 8 when DTRflow not in use,
616// threshold count = 5 when DTRflow in use.
617//
618#define CMD_RCV_THRESHOLD(count,ms) \
619 (((cmdSyntaxPtr)(ct88))->cmd[1] = (count), \
620 ((cmdSyntaxPtr)(ct88))->cmd[2] = (ms), \
621 (cmdSyntaxPtr)(ct88))
622
623// Makes the loadware report DSS signals for this channel immediately.
624//
625#define CMD_DSS_NOW (cmdSyntaxPtr)(ct89)
626
627// Set the receive silo parameters
628// timeout is ms idle wait until delivery (~VTIME)
629// threshold is max characters cause interrupt (~VMIN)
630//
631#define CMD_SET_SILO(timeout,threshold) \
632 (((cmdSyntaxPtr)(ct90))->cmd[1] = (timeout), \
633 ((cmdSyntaxPtr)(ct90))->cmd[2] = (threshold), \
634 (cmdSyntaxPtr)(ct90))
635
636// Set timed break in decisecond (1/10s)
637//
638#define CMD_LBREAK(ds) \
639 (((cmdSyntaxPtr)(ct91))->cmd[1] = (ds),(cmdSyntaxPtr)(ct66))
640
641
642
643#endif // I2CMD_H
diff --git a/drivers/char/ip2/i2ellis.c b/drivers/char/ip2/i2ellis.c
new file mode 100644
index 000000000000..f834d05ccc97
--- /dev/null
+++ b/drivers/char/ip2/i2ellis.c
@@ -0,0 +1,1487 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Low-level interface code for the device driver
12* (This is included source code, not a separate compilation
13* module.)
14*
15*******************************************************************************/
16//---------------------------------------------
17// Function declarations private to this module
18//---------------------------------------------
19// Functions called only indirectly through i2eBordStr entries.
20
21static int iiWriteBuf16(i2eBordStrPtr, unsigned char *, int);
22static int iiWriteBuf8(i2eBordStrPtr, unsigned char *, int);
23static int iiReadBuf16(i2eBordStrPtr, unsigned char *, int);
24static int iiReadBuf8(i2eBordStrPtr, unsigned char *, int);
25
26static unsigned short iiReadWord16(i2eBordStrPtr);
27static unsigned short iiReadWord8(i2eBordStrPtr);
28static void iiWriteWord16(i2eBordStrPtr, unsigned short);
29static void iiWriteWord8(i2eBordStrPtr, unsigned short);
30
31static int iiWaitForTxEmptyII(i2eBordStrPtr, int);
32static int iiWaitForTxEmptyIIEX(i2eBordStrPtr, int);
33static int iiTxMailEmptyII(i2eBordStrPtr);
34static int iiTxMailEmptyIIEX(i2eBordStrPtr);
35static int iiTrySendMailII(i2eBordStrPtr, unsigned char);
36static int iiTrySendMailIIEX(i2eBordStrPtr, unsigned char);
37
38static unsigned short iiGetMailII(i2eBordStrPtr);
39static unsigned short iiGetMailIIEX(i2eBordStrPtr);
40
41static void iiEnableMailIrqII(i2eBordStrPtr);
42static void iiEnableMailIrqIIEX(i2eBordStrPtr);
43static void iiWriteMaskII(i2eBordStrPtr, unsigned char);
44static void iiWriteMaskIIEX(i2eBordStrPtr, unsigned char);
45
46static void ii2DelayTimer(unsigned int);
47static void ii2DelayWakeup(unsigned long id);
48static void ii2Nop(void);
49
50//***************
51//* Static Data *
52//***************
53
54static int ii2Safe; // Safe I/O address for delay routine
55
56static int iiDelayed; // Set when the iiResetDelay function is
57 // called. Cleared when ANY board is reset.
58static struct timer_list * pDelayTimer; // Used by iiDelayTimer
59static wait_queue_head_t pDelayWait; // Used by iiDelayTimer
60static rwlock_t Dl_spinlock;
61
62//********
63//* Code *
64//********
65
66//=======================================================
67// Initialization Routines
68//
69// iiSetAddress
70// iiReset
71// iiResetDelay
72// iiInitialize
73//=======================================================
74
75//******************************************************************************
76// Function: iiEllisInit()
77// Parameters: None
78//
79// Returns: Nothing
80//
81// Description:
82//
83// This routine performs any required initialization of the iiEllis subsystem.
84//
85//******************************************************************************
86static void
87iiEllisInit(void)
88{
89 pDelayTimer = kmalloc ( sizeof (struct timer_list), GFP_KERNEL );
90 init_timer(pDelayTimer);
91 init_waitqueue_head(&pDelayWait);
92 LOCK_INIT(&Dl_spinlock);
93}
94
95//******************************************************************************
96// Function: iiEllisCleanup()
97// Parameters: None
98//
99// Returns: Nothing
100//
101// Description:
102//
103// This routine performs any required cleanup of the iiEllis subsystem.
104//
105//******************************************************************************
106static void
107iiEllisCleanup(void)
108{
109 if ( pDelayTimer != NULL ) {
110 kfree ( pDelayTimer );
111 }
112}
113
114//******************************************************************************
115// Function: iiSetAddress(pB, address, delay)
116// Parameters: pB - pointer to the board structure
117// address - the purported I/O address of the board
118// delay - pointer to the 1-ms delay function to use
119// in this and any future operations to this board
120//
121// Returns: True if everything appears copacetic.
122// False if there is any error: the pB->i2eError field has the error
123//
124// Description:
125//
126// This routine (roughly) checks for address validity, sets the i2eValid OK and
127// sets the state to II_STATE_COLD which means that we haven't even sent a reset
128// yet.
129//
130//******************************************************************************
131static int
132iiSetAddress( i2eBordStrPtr pB, int address, delayFunc_t delay )
133{
134 // Should any failure occur before init is finished...
135 pB->i2eValid = I2E_INCOMPLETE;
136
137 // Cannot check upper limit except extremely: Might be microchannel
138 // Address must be on an 8-byte boundary
139
140 if ((unsigned int)address <= 0x100
141 || (unsigned int)address >= 0xfff8
142 || (address & 0x7)
143 )
144 {
145 COMPLETE(pB,I2EE_BADADDR);
146 }
147
148 // Initialize accelerators
149 pB->i2eBase = address;
150 pB->i2eData = address + FIFO_DATA;
151 pB->i2eStatus = address + FIFO_STATUS;
152 pB->i2ePointer = address + FIFO_PTR;
153 pB->i2eXMail = address + FIFO_MAIL;
154 pB->i2eXMask = address + FIFO_MASK;
155
156 // Initialize i/o address for ii2DelayIO
157 ii2Safe = address + FIFO_NOP;
158
159 // Initialize the delay routine
160 pB->i2eDelay = ((delay != (delayFunc_t)NULL) ? delay : (delayFunc_t)ii2Nop);
161
162 pB->i2eValid = I2E_MAGIC;
163 pB->i2eState = II_STATE_COLD;
164
165 COMPLETE(pB, I2EE_GOOD);
166}
167
168//******************************************************************************
169// Function: iiReset(pB)
170// Parameters: pB - pointer to the board structure
171//
172// Returns: True if everything appears copacetic.
173// False if there is any error: the pB->i2eError field has the error
174//
175// Description:
176//
177// Attempts to reset the board (see also i2hw.h). Normally, we would use this to
178// reset a board immediately after iiSetAddress(), but it is valid to reset a
179// board from any state, say, in order to change or re-load loadware. (Under
180// such circumstances, no reason to re-run iiSetAddress(), which is why it is a
181// separate routine and not included in this routine.
182//
183//******************************************************************************
184static int
185iiReset(i2eBordStrPtr pB)
186{
187 // Magic number should be set, else even the address is suspect
188 if (pB->i2eValid != I2E_MAGIC)
189 {
190 COMPLETE(pB, I2EE_BADMAGIC);
191 }
192
193 OUTB(pB->i2eBase + FIFO_RESET, 0); // Any data will do
194 iiDelay(pB, 50); // Pause between resets
195 OUTB(pB->i2eBase + FIFO_RESET, 0); // Second reset
196
197 // We must wait before even attempting to read anything from the FIFO: the
198 // board's P.O.S.T may actually attempt to read and write its end of the
199 // FIFO in order to check flags, loop back (where supported), etc. On
200 // completion of this testing it would reset the FIFO, and on completion
201 // of all // P.O.S.T., write the message. We must not mistake data which
202 // might have been sent for testing as part of the reset message. To
203 // better utilize time, say, when resetting several boards, we allow the
204 // delay to be performed externally; in this way the caller can reset
205 // several boards, delay a single time, then call the initialization
206 // routine for all.
207
208 pB->i2eState = II_STATE_RESET;
209
210 iiDelayed = 0; // i.e., the delay routine hasn't been called since the most
211 // recent reset.
212
213 // Ensure anything which would have been of use to standard loadware is
214 // blanked out, since board has now forgotten everything!.
215
216 pB->i2eUsingIrq = IRQ_UNDEFINED; // Not set up to use an interrupt yet
217 pB->i2eWaitingForEmptyFifo = 0;
218 pB->i2eOutMailWaiting = 0;
219 pB->i2eChannelPtr = NULL;
220 pB->i2eChannelCnt = 0;
221
222 pB->i2eLeadoffWord[0] = 0;
223 pB->i2eFifoInInts = 0;
224 pB->i2eFifoOutInts = 0;
225 pB->i2eFatalTrap = NULL;
226 pB->i2eFatal = 0;
227
228 COMPLETE(pB, I2EE_GOOD);
229}
230
231//******************************************************************************
232// Function: iiResetDelay(pB)
233// Parameters: pB - pointer to the board structure
234//
235// Returns: True if everything appears copacetic.
236// False if there is any error: the pB->i2eError field has the error
237//
238// Description:
239//
240// Using the delay defined in board structure, waits two seconds (for board to
241// reset).
242//
243//******************************************************************************
244static int
245iiResetDelay(i2eBordStrPtr pB)
246{
247 if (pB->i2eValid != I2E_MAGIC) {
248 COMPLETE(pB, I2EE_BADMAGIC);
249 }
250 if (pB->i2eState != II_STATE_RESET) {
251 COMPLETE(pB, I2EE_BADSTATE);
252 }
253 iiDelay(pB,2000); /* Now we wait for two seconds. */
254 iiDelayed = 1; /* Delay has been called: ok to initialize */
255 COMPLETE(pB, I2EE_GOOD);
256}
257
258//******************************************************************************
259// Function: iiInitialize(pB)
260// Parameters: pB - pointer to the board structure
261//
262// Returns: True if everything appears copacetic.
263// False if there is any error: the pB->i2eError field has the error
264//
265// Description:
266//
267// Attempts to read the Power-on reset message. Initializes any remaining fields
268// in the pB structure.
269//
270// This should be called as the third step of a process beginning with
271// iiReset(), then iiResetDelay(). This routine checks to see that the structure
272// is "valid" and in the reset state, also confirms that the delay routine has
273// been called since the latest reset (to any board! overly strong!).
274//
275//******************************************************************************
276static int
277iiInitialize(i2eBordStrPtr pB)
278{
279 int itemp;
280 unsigned char c;
281 unsigned short utemp;
282 unsigned int ilimit;
283
284 if (pB->i2eValid != I2E_MAGIC)
285 {
286 COMPLETE(pB, I2EE_BADMAGIC);
287 }
288
289 if (pB->i2eState != II_STATE_RESET || !iiDelayed)
290 {
291 COMPLETE(pB, I2EE_BADSTATE);
292 }
293
294 // In case there is a failure short of our completely reading the power-up
295 // message.
296 pB->i2eValid = I2E_INCOMPLETE;
297
298
299 // Now attempt to read the message.
300
301 for (itemp = 0; itemp < sizeof(porStr); itemp++)
302 {
303 // We expect the entire message is ready.
304 if (HAS_NO_INPUT(pB))
305 {
306 pB->i2ePomSize = itemp;
307 COMPLETE(pB, I2EE_PORM_SHORT);
308 }
309
310 pB->i2ePom.c[itemp] = c = BYTE_FROM(pB);
311
312 // We check the magic numbers as soon as they are supposed to be read
313 // (rather than after) to minimize effect of reading something we
314 // already suspect can't be "us".
315 if ( (itemp == POR_1_INDEX && c != POR_MAGIC_1) ||
316 (itemp == POR_2_INDEX && c != POR_MAGIC_2))
317 {
318 pB->i2ePomSize = itemp+1;
319 COMPLETE(pB, I2EE_BADMAGIC);
320 }
321 }
322
323 pB->i2ePomSize = itemp;
324
325 // Ensure that this was all the data...
326 if (HAS_INPUT(pB))
327 COMPLETE(pB, I2EE_PORM_LONG);
328
329 // For now, we'll fail to initialize if P.O.S.T reports bad chip mapper:
330 // Implying we will not be able to download any code either: That's ok: the
331 // condition is pretty explicit.
332 if (pB->i2ePom.e.porDiag1 & POR_BAD_MAPPER)
333 {
334 COMPLETE(pB, I2EE_POSTERR);
335 }
336
337 // Determine anything which must be done differently depending on the family
338 // of boards!
339 switch (pB->i2ePom.e.porID & POR_ID_FAMILY)
340 {
341 case POR_ID_FII: // IntelliPort-II
342
343 pB->i2eFifoStyle = FIFO_II;
344 pB->i2eFifoSize = 512; // 512 bytes, always
345 pB->i2eDataWidth16 = NO;
346
347 pB->i2eMaxIrq = 15; // Because board cannot tell us it is in an 8-bit
348 // slot, we do allow it to be done (documentation!)
349
350 pB->i2eGoodMap[1] =
351 pB->i2eGoodMap[2] =
352 pB->i2eGoodMap[3] =
353 pB->i2eChannelMap[1] =
354 pB->i2eChannelMap[2] =
355 pB->i2eChannelMap[3] = 0;
356
357 switch (pB->i2ePom.e.porID & POR_ID_SIZE)
358 {
359 case POR_ID_II_4:
360 pB->i2eGoodMap[0] =
361 pB->i2eChannelMap[0] = 0x0f; // four-port
362
363 // Since porPorts1 is based on the Hardware ID register, the numbers
364 // should always be consistent for IntelliPort-II. Ditto below...
365 if (pB->i2ePom.e.porPorts1 != 4)
366 {
367 COMPLETE(pB, I2EE_INCONSIST);
368 }
369 break;
370
371 case POR_ID_II_8:
372 case POR_ID_II_8R:
373 pB->i2eGoodMap[0] =
374 pB->i2eChannelMap[0] = 0xff; // Eight port
375 if (pB->i2ePom.e.porPorts1 != 8)
376 {
377 COMPLETE(pB, I2EE_INCONSIST);
378 }
379 break;
380
381 case POR_ID_II_6:
382 pB->i2eGoodMap[0] =
383 pB->i2eChannelMap[0] = 0x3f; // Six Port
384 if (pB->i2ePom.e.porPorts1 != 6)
385 {
386 COMPLETE(pB, I2EE_INCONSIST);
387 }
388 break;
389 }
390
391 // Fix up the "good channel list based on any errors reported.
392 if (pB->i2ePom.e.porDiag1 & POR_BAD_UART1)
393 {
394 pB->i2eGoodMap[0] &= ~0x0f;
395 }
396
397 if (pB->i2ePom.e.porDiag1 & POR_BAD_UART2)
398 {
399 pB->i2eGoodMap[0] &= ~0xf0;
400 }
401
402 break; // POR_ID_FII case
403
404 case POR_ID_FIIEX: // IntelliPort-IIEX
405
406 pB->i2eFifoStyle = FIFO_IIEX;
407
408 itemp = pB->i2ePom.e.porFifoSize;
409
410 // Implicit assumption that fifo would not grow beyond 32k,
411 // nor would ever be less than 256.
412
413 if (itemp < 8 || itemp > 15)
414 {
415 COMPLETE(pB, I2EE_INCONSIST);
416 }
417 pB->i2eFifoSize = (1 << itemp);
418
419 // These are based on what P.O.S.T thinks should be there, based on
420 // box ID registers
421 ilimit = pB->i2ePom.e.porNumBoxes;
422 if (ilimit > ABS_MAX_BOXES)
423 {
424 ilimit = ABS_MAX_BOXES;
425 }
426
427 // For as many boxes as EXIST, gives the type of box.
428 // Added 8/6/93: check for the ISA-4 (asic) which looks like an
429 // expandable but for whom "8 or 16?" is not the right question.
430
431 utemp = pB->i2ePom.e.porFlags;
432 if (utemp & POR_CEX4)
433 {
434 pB->i2eChannelMap[0] = 0x000f;
435 } else {
436 utemp &= POR_BOXES;
437 for (itemp = 0; itemp < ilimit; itemp++)
438 {
439 pB->i2eChannelMap[itemp] =
440 ((utemp & POR_BOX_16) ? 0xffff : 0x00ff);
441 utemp >>= 1;
442 }
443 }
444
445 // These are based on what P.O.S.T actually found.
446
447 utemp = (pB->i2ePom.e.porPorts2 << 8) + pB->i2ePom.e.porPorts1;
448
449 for (itemp = 0; itemp < ilimit; itemp++)
450 {
451 pB->i2eGoodMap[itemp] = 0;
452 if (utemp & 1) pB->i2eGoodMap[itemp] |= 0x000f;
453 if (utemp & 2) pB->i2eGoodMap[itemp] |= 0x00f0;
454 if (utemp & 4) pB->i2eGoodMap[itemp] |= 0x0f00;
455 if (utemp & 8) pB->i2eGoodMap[itemp] |= 0xf000;
456 utemp >>= 4;
457 }
458
459 // Now determine whether we should transfer in 8 or 16-bit mode.
460 switch (pB->i2ePom.e.porBus & (POR_BUS_SLOT16 | POR_BUS_DIP16) )
461 {
462 case POR_BUS_SLOT16 | POR_BUS_DIP16:
463 pB->i2eDataWidth16 = YES;
464 pB->i2eMaxIrq = 15;
465 break;
466
467 case POR_BUS_SLOT16:
468 pB->i2eDataWidth16 = NO;
469 pB->i2eMaxIrq = 15;
470 break;
471
472 case 0:
473 case POR_BUS_DIP16: // In an 8-bit slot, DIP switch don't care.
474 default:
475 pB->i2eDataWidth16 = NO;
476 pB->i2eMaxIrq = 7;
477 break;
478 }
479 break; // POR_ID_FIIEX case
480
481 default: // Unknown type of board
482 COMPLETE(pB, I2EE_BAD_FAMILY);
483 break;
484 } // End the switch based on family
485
486 // Temporarily, claim there is no room in the outbound fifo.
487 // We will maintain this whenever we check for an empty outbound FIFO.
488 pB->i2eFifoRemains = 0;
489
490 // Now, based on the bus type, should we expect to be able to re-configure
491 // interrupts (say, for testing purposes).
492 switch (pB->i2ePom.e.porBus & POR_BUS_TYPE)
493 {
494 case POR_BUS_T_ISA:
495 case POR_BUS_T_UNK: // If the type of bus is undeclared, assume ok.
496 pB->i2eChangeIrq = YES;
497 break;
498 case POR_BUS_T_MCA:
499 case POR_BUS_T_EISA:
500 pB->i2eChangeIrq = NO;
501 break;
502 default:
503 COMPLETE(pB, I2EE_BADBUS);
504 }
505
506 if (pB->i2eDataWidth16 == YES)
507 {
508 pB->i2eWriteBuf = iiWriteBuf16;
509 pB->i2eReadBuf = iiReadBuf16;
510 pB->i2eWriteWord = iiWriteWord16;
511 pB->i2eReadWord = iiReadWord16;
512 } else {
513 pB->i2eWriteBuf = iiWriteBuf8;
514 pB->i2eReadBuf = iiReadBuf8;
515 pB->i2eWriteWord = iiWriteWord8;
516 pB->i2eReadWord = iiReadWord8;
517 }
518
519 switch(pB->i2eFifoStyle)
520 {
521 case FIFO_II:
522 pB->i2eWaitForTxEmpty = iiWaitForTxEmptyII;
523 pB->i2eTxMailEmpty = iiTxMailEmptyII;
524 pB->i2eTrySendMail = iiTrySendMailII;
525 pB->i2eGetMail = iiGetMailII;
526 pB->i2eEnableMailIrq = iiEnableMailIrqII;
527 pB->i2eWriteMask = iiWriteMaskII;
528
529 break;
530
531 case FIFO_IIEX:
532 pB->i2eWaitForTxEmpty = iiWaitForTxEmptyIIEX;
533 pB->i2eTxMailEmpty = iiTxMailEmptyIIEX;
534 pB->i2eTrySendMail = iiTrySendMailIIEX;
535 pB->i2eGetMail = iiGetMailIIEX;
536 pB->i2eEnableMailIrq = iiEnableMailIrqIIEX;
537 pB->i2eWriteMask = iiWriteMaskIIEX;
538
539 break;
540
541 default:
542 COMPLETE(pB, I2EE_INCONSIST);
543 }
544
545 // Initialize state information.
546 pB->i2eState = II_STATE_READY; // Ready to load loadware.
547
548 // Some Final cleanup:
549 // For some boards, the bootstrap firmware may perform some sort of test
550 // resulting in a stray character pending in the incoming mailbox. If one is
551 // there, it should be read and discarded, especially since for the standard
552 // firmware, it's the mailbox that interrupts the host.
553
554 pB->i2eStartMail = iiGetMail(pB);
555
556 // Throw it away and clear the mailbox structure element
557 pB->i2eStartMail = NO_MAIL_HERE;
558
559 // Everything is ok now, return with good status/
560
561 pB->i2eValid = I2E_MAGIC;
562 COMPLETE(pB, I2EE_GOOD);
563}
564
565//=======================================================
566// Delay Routines
567//
568// iiDelayIO
569// iiNop
570//=======================================================
571
572static void
573ii2DelayWakeup(unsigned long id)
574{
575 wake_up_interruptible ( &pDelayWait );
576}
577
578//******************************************************************************
579// Function: ii2DelayTimer(mseconds)
580// Parameters: mseconds - number of milliseconds to delay
581//
582// Returns: Nothing
583//
584// Description:
585//
586// This routine delays for approximately mseconds milliseconds and is intended
587// to be called indirectly through i2Delay field in i2eBordStr. It uses the
588// Linux timer_list mechanism.
589//
590// The Linux timers use a unit called "jiffies" which are 10mS in the Intel
591// architecture. This function rounds the delay period up to the next "jiffy".
592// In the Alpha architecture the "jiffy" is 1mS, but this driver is not intended
593// for Alpha platforms at this time.
594//
595//******************************************************************************
596static void
597ii2DelayTimer(unsigned int mseconds)
598{
599 wait_queue_t wait;
600
601 init_waitqueue_entry(&wait, current);
602
603 init_timer ( pDelayTimer );
604
605 add_wait_queue(&pDelayWait, &wait);
606
607 set_current_state( TASK_INTERRUPTIBLE );
608
609 pDelayTimer->expires = jiffies + ( mseconds + 9 ) / 10;
610 pDelayTimer->function = ii2DelayWakeup;
611 pDelayTimer->data = 0;
612
613 add_timer ( pDelayTimer );
614
615 schedule();
616
617 set_current_state( TASK_RUNNING );
618 remove_wait_queue(&pDelayWait, &wait);
619
620 del_timer ( pDelayTimer );
621}
622
623#if 0
624//static void ii2DelayIO(unsigned int);
625//******************************************************************************
626// !!! Not Used, this is DOS crap, some of you young folks may be interested in
627// in how things were done in the stone age of caculating machines !!!
628// Function: ii2DelayIO(mseconds)
629// Parameters: mseconds - number of milliseconds to delay
630//
631// Returns: Nothing
632//
633// Description:
634//
635// This routine delays for approximately mseconds milliseconds and is intended
636// to be called indirectly through i2Delay field in i2eBordStr. It is intended
637// for use where a clock-based function is impossible: for example, DOS drivers.
638//
639// This function uses the IN instruction to place bounds on the timing and
640// assumes that ii2Safe has been set. This is because I/O instructions are not
641// subject to caching and will therefore take a certain minimum time. To ensure
642// the delay is at least long enough on fast machines, it is based on some
643// fastest-case calculations. On slower machines this may cause VERY long
644// delays. (3 x fastest case). In the fastest case, everything is cached except
645// the I/O instruction itself.
646//
647// Timing calculations:
648// The fastest bus speed for I/O operations is likely to be 10 MHz. The I/O
649// operation in question is a byte operation to an odd address. For 8-bit
650// operations, the architecture generally enforces two wait states. At 10 MHz, a
651// single cycle time is 100nS. A read operation at two wait states takes 6
652// cycles for a total time of 600nS. Therefore approximately 1666 iterations
653// would be required to generate a single millisecond delay. The worst
654// (reasonable) case would be an 8MHz system with no cacheing. In this case, the
655// I/O instruction would take 125nS x 6 cyles = 750 nS. More importantly, code
656// fetch of other instructions in the loop would take time (zero wait states,
657// however) and would be hard to estimate. This is minimized by using in-line
658// assembler for the in inner loop of IN instructions. This consists of just a
659// few bytes. So we'll guess about four code fetches per loop. Each code fetch
660// should take four cycles, so we have 125nS * 8 = 1000nS. Worst case then is
661// that what should have taken 1 mS takes instead 1666 * (1750) = 2.9 mS.
662//
663// So much for theoretical timings: results using 1666 value on some actual
664// machines:
665// IBM 286 6MHz 3.15 mS
666// Zenith 386 33MHz 2.45 mS
667// (brandX) 386 33MHz 1.90 mS (has cache)
668// (brandY) 486 33MHz 2.35 mS
669// NCR 486 ?? 1.65 mS (microchannel)
670//
671// For most machines, it is probably safe to scale this number back (remember,
672// for robust operation use an actual timed delay if possible), so we are using
673// a value of 1190. This yields 1.17 mS for the fastest machine in our sample,
674// 1.75 mS for typical 386 machines, and 2.25 mS the absolute slowest machine.
675//
676// 1/29/93:
677// The above timings are too slow. Actual cycle times might be faster. ISA cycle
678// times could approach 500 nS, and ...
679// The IBM model 77 being microchannel has no wait states for 8-bit reads and
680// seems to be accessing the I/O at 440 nS per access (from start of one to
681// start of next). This would imply we need 1000/.440 = 2272 iterations to
682// guarantee we are fast enough. In actual testing, we see that 2 * 1190 are in
683// fact enough. For diagnostics, we keep the level at 1190, but developers note
684// this needs tuning.
685//
686// Safe assumption: 2270 i/o reads = 1 millisecond
687//
688//******************************************************************************
689
690
691static int ii2DelValue = 1190; // See timing calculations below
692 // 1666 for fastest theoretical machine
693 // 1190 safe for most fast 386 machines
694 // 1000 for fastest machine tested here
695 // 540 (sic) for AT286/6Mhz
696static void
697ii2DelayIO(unsigned int mseconds)
698{
699 if (!ii2Safe)
700 return; /* Do nothing if this variable uninitialized */
701
702 while(mseconds--) {
703 int i = ii2DelValue;
704 while ( i-- ) {
705 INB ( ii2Safe );
706 }
707 }
708}
709#endif
710
711//******************************************************************************
712// Function: ii2Nop()
713// Parameters: None
714//
715// Returns: Nothing
716//
717// Description:
718//
719// iiInitialize will set i2eDelay to this if the delay parameter is NULL. This
720// saves checking for a NULL pointer at every call.
721//******************************************************************************
722static void
723ii2Nop(void)
724{
725 return; // no mystery here
726}
727
728//=======================================================
729// Routines which are available in 8/16-bit versions, or
730// in different fifo styles. These are ALL called
731// indirectly through the board structure.
732//=======================================================
733
734//******************************************************************************
735// Function: iiWriteBuf16(pB, address, count)
736// Parameters: pB - pointer to board structure
737// address - address of data to write
738// count - number of data bytes to write
739//
740// Returns: True if everything appears copacetic.
741// False if there is any error: the pB->i2eError field has the error
742//
743// Description:
744//
745// Writes 'count' bytes from 'address' to the data fifo specified by the board
746// structure pointer pB. Should count happen to be odd, an extra pad byte is
747// sent (identity unknown...). Uses 16-bit (word) operations. Is called
748// indirectly through pB->i2eWriteBuf.
749//
750//******************************************************************************
751static int
752iiWriteBuf16(i2eBordStrPtr pB, unsigned char *address, int count)
753{
754 // Rudimentary sanity checking here.
755 if (pB->i2eValid != I2E_MAGIC)
756 COMPLETE(pB, I2EE_INVALID);
757
758 OUTSW ( pB->i2eData, address, count);
759
760 COMPLETE(pB, I2EE_GOOD);
761}
762
763//******************************************************************************
764// Function: iiWriteBuf8(pB, address, count)
765// Parameters: pB - pointer to board structure
766// address - address of data to write
767// count - number of data bytes to write
768//
769// Returns: True if everything appears copacetic.
770// False if there is any error: the pB->i2eError field has the error
771//
772// Description:
773//
774// Writes 'count' bytes from 'address' to the data fifo specified by the board
775// structure pointer pB. Should count happen to be odd, an extra pad byte is
776// sent (identity unknown...). This is to be consistent with the 16-bit version.
777// Uses 8-bit (byte) operations. Is called indirectly through pB->i2eWriteBuf.
778//
779//******************************************************************************
780static int
781iiWriteBuf8(i2eBordStrPtr pB, unsigned char *address, int count)
782{
783 /* Rudimentary sanity checking here */
784 if (pB->i2eValid != I2E_MAGIC)
785 COMPLETE(pB, I2EE_INVALID);
786
787 OUTSB ( pB->i2eData, address, count );
788
789 COMPLETE(pB, I2EE_GOOD);
790}
791
792//******************************************************************************
793// Function: iiReadBuf16(pB, address, count)
794// Parameters: pB - pointer to board structure
795// address - address to put data read
796// count - number of data bytes to read
797//
798// Returns: True if everything appears copacetic.
799// False if there is any error: the pB->i2eError field has the error
800//
801// Description:
802//
803// Reads 'count' bytes into 'address' from the data fifo specified by the board
804// structure pointer pB. Should count happen to be odd, an extra pad byte is
805// received (identity unknown...). Uses 16-bit (word) operations. Is called
806// indirectly through pB->i2eReadBuf.
807//
808//******************************************************************************
809static int
810iiReadBuf16(i2eBordStrPtr pB, unsigned char *address, int count)
811{
812 // Rudimentary sanity checking here.
813 if (pB->i2eValid != I2E_MAGIC)
814 COMPLETE(pB, I2EE_INVALID);
815
816 INSW ( pB->i2eData, address, count);
817
818 COMPLETE(pB, I2EE_GOOD);
819}
820
821//******************************************************************************
822// Function: iiReadBuf8(pB, address, count)
823// Parameters: pB - pointer to board structure
824// address - address to put data read
825// count - number of data bytes to read
826//
827// Returns: True if everything appears copacetic.
828// False if there is any error: the pB->i2eError field has the error
829//
830// Description:
831//
832// Reads 'count' bytes into 'address' from the data fifo specified by the board
833// structure pointer pB. Should count happen to be odd, an extra pad byte is
834// received (identity unknown...). This to match the 16-bit behaviour. Uses
835// 8-bit (byte) operations. Is called indirectly through pB->i2eReadBuf.
836//
837//******************************************************************************
838static int
839iiReadBuf8(i2eBordStrPtr pB, unsigned char *address, int count)
840{
841 // Rudimentary sanity checking here.
842 if (pB->i2eValid != I2E_MAGIC)
843 COMPLETE(pB, I2EE_INVALID);
844
845 INSB ( pB->i2eData, address, count);
846
847 COMPLETE(pB, I2EE_GOOD);
848}
849
850//******************************************************************************
851// Function: iiReadWord16(pB)
852// Parameters: pB - pointer to board structure
853//
854// Returns: True if everything appears copacetic.
855// False if there is any error: the pB->i2eError field has the error
856//
857// Description:
858//
859// Returns the word read from the data fifo specified by the board-structure
860// pointer pB. Uses a 16-bit operation. Is called indirectly through
861// pB->i2eReadWord.
862//
863//******************************************************************************
864static unsigned short
865iiReadWord16(i2eBordStrPtr pB)
866{
867 return (unsigned short)( INW(pB->i2eData) );
868}
869
870//******************************************************************************
871// Function: iiReadWord8(pB)
872// Parameters: pB - pointer to board structure
873//
874// Returns: True if everything appears copacetic.
875// False if there is any error: the pB->i2eError field has the error
876//
877// Description:
878//
879// Returns the word read from the data fifo specified by the board-structure
880// pointer pB. Uses two 8-bit operations. Bytes are assumed to be LSB first. Is
881// called indirectly through pB->i2eReadWord.
882//
883//******************************************************************************
884static unsigned short
885iiReadWord8(i2eBordStrPtr pB)
886{
887 unsigned short urs;
888
889 urs = INB ( pB->i2eData );
890
891 return ( ( INB ( pB->i2eData ) << 8 ) | urs );
892}
893
894//******************************************************************************
895// Function: iiWriteWord16(pB, value)
896// Parameters: pB - pointer to board structure
897// value - data to write
898//
899// Returns: True if everything appears copacetic.
900// False if there is any error: the pB->i2eError field has the error
901//
902// Description:
903//
904// Writes the word 'value' to the data fifo specified by the board-structure
905// pointer pB. Uses 16-bit operation. Is called indirectly through
906// pB->i2eWriteWord.
907//
908//******************************************************************************
909static void
910iiWriteWord16(i2eBordStrPtr pB, unsigned short value)
911{
912 WORD_TO(pB, (int)value);
913}
914
915//******************************************************************************
916// Function: iiWriteWord8(pB, value)
917// Parameters: pB - pointer to board structure
918// value - data to write
919//
920// Returns: True if everything appears copacetic.
921// False if there is any error: the pB->i2eError field has the error
922//
923// Description:
924//
925// Writes the word 'value' to the data fifo specified by the board-structure
926// pointer pB. Uses two 8-bit operations (writes LSB first). Is called
927// indirectly through pB->i2eWriteWord.
928//
929//******************************************************************************
930static void
931iiWriteWord8(i2eBordStrPtr pB, unsigned short value)
932{
933 BYTE_TO(pB, (char)value);
934 BYTE_TO(pB, (char)(value >> 8) );
935}
936
937//******************************************************************************
938// Function: iiWaitForTxEmptyII(pB, mSdelay)
939// Parameters: pB - pointer to board structure
940// mSdelay - period to wait before returning
941//
942// Returns: True if the FIFO is empty.
943// False if it not empty in the required time: the pB->i2eError
944// field has the error.
945//
946// Description:
947//
948// Waits up to "mSdelay" milliseconds for the outgoing FIFO to become empty; if
949// not empty by the required time, returns false and error in pB->i2eError,
950// otherwise returns true.
951//
952// mSdelay == 0 is taken to mean must be empty on the first test.
953//
954// This version operates on IntelliPort-II - style FIFO's
955//
956// Note this routine is organized so that if status is ok there is no delay at
957// all called either before or after the test. Is called indirectly through
958// pB->i2eWaitForTxEmpty.
959//
960//******************************************************************************
961static int
962iiWaitForTxEmptyII(i2eBordStrPtr pB, int mSdelay)
963{
964 unsigned long flags;
965 int itemp;
966
967 for (;;)
968 {
969 // This routine hinges on being able to see the "other" status register
970 // (as seen by the local processor). His incoming fifo is our outgoing
971 // FIFO.
972 //
973 // By the nature of this routine, you would be using this as part of a
974 // larger atomic context: i.e., you would use this routine to ensure the
975 // fifo empty, then act on this information. Between these two halves,
976 // you will generally not want to service interrupts or in any way
977 // disrupt the assumptions implicit in the larger context.
978 //
979 // Even worse, however, this routine "shifts" the status register to
980 // point to the local status register which is not the usual situation.
981 // Therefore for extra safety, we force the critical section to be
982 // completely atomic, and pick up after ourselves before allowing any
983 // interrupts of any kind.
984
985
986 WRITE_LOCK_IRQSAVE(&Dl_spinlock,flags)
987 OUTB(pB->i2ePointer, SEL_COMMAND);
988 OUTB(pB->i2ePointer, SEL_CMD_SH);
989
990 itemp = INB(pB->i2eStatus);
991
992 OUTB(pB->i2ePointer, SEL_COMMAND);
993 OUTB(pB->i2ePointer, SEL_CMD_UNSH);
994
995 if (itemp & ST_IN_EMPTY)
996 {
997 UPDATE_FIFO_ROOM(pB);
998 WRITE_UNLOCK_IRQRESTORE(&Dl_spinlock,flags)
999 COMPLETE(pB, I2EE_GOOD);
1000 }
1001
1002 WRITE_UNLOCK_IRQRESTORE(&Dl_spinlock,flags)
1003
1004 if (mSdelay-- == 0)
1005 break;
1006
1007 iiDelay(pB, 1); /* 1 mS granularity on checking condition */
1008 }
1009 COMPLETE(pB, I2EE_TXE_TIME);
1010}
1011
1012//******************************************************************************
1013// Function: iiWaitForTxEmptyIIEX(pB, mSdelay)
1014// Parameters: pB - pointer to board structure
1015// mSdelay - period to wait before returning
1016//
1017// Returns: True if the FIFO is empty.
1018// False if it not empty in the required time: the pB->i2eError
1019// field has the error.
1020//
1021// Description:
1022//
1023// Waits up to "mSdelay" milliseconds for the outgoing FIFO to become empty; if
1024// not empty by the required time, returns false and error in pB->i2eError,
1025// otherwise returns true.
1026//
1027// mSdelay == 0 is taken to mean must be empty on the first test.
1028//
1029// This version operates on IntelliPort-IIEX - style FIFO's
1030//
1031// Note this routine is organized so that if status is ok there is no delay at
1032// all called either before or after the test. Is called indirectly through
1033// pB->i2eWaitForTxEmpty.
1034//
1035//******************************************************************************
1036static int
1037iiWaitForTxEmptyIIEX(i2eBordStrPtr pB, int mSdelay)
1038{
1039 unsigned long flags;
1040
1041 for (;;)
1042 {
1043 // By the nature of this routine, you would be using this as part of a
1044 // larger atomic context: i.e., you would use this routine to ensure the
1045 // fifo empty, then act on this information. Between these two halves,
1046 // you will generally not want to service interrupts or in any way
1047 // disrupt the assumptions implicit in the larger context.
1048
1049 WRITE_LOCK_IRQSAVE(&Dl_spinlock,flags)
1050
1051 if (INB(pB->i2eStatus) & STE_OUT_MT) {
1052 UPDATE_FIFO_ROOM(pB);
1053 WRITE_UNLOCK_IRQRESTORE(&Dl_spinlock,flags)
1054 COMPLETE(pB, I2EE_GOOD);
1055 }
1056 WRITE_UNLOCK_IRQRESTORE(&Dl_spinlock,flags)
1057
1058 if (mSdelay-- == 0)
1059 break;
1060
1061 iiDelay(pB, 1); // 1 mS granularity on checking condition
1062 }
1063 COMPLETE(pB, I2EE_TXE_TIME);
1064}
1065
1066//******************************************************************************
1067// Function: iiTxMailEmptyII(pB)
1068// Parameters: pB - pointer to board structure
1069//
1070// Returns: True if the transmit mailbox is empty.
1071// False if it not empty.
1072//
1073// Description:
1074//
1075// Returns true or false according to whether the transmit mailbox is empty (and
1076// therefore able to accept more mail)
1077//
1078// This version operates on IntelliPort-II - style FIFO's
1079//
1080//******************************************************************************
1081static int
1082iiTxMailEmptyII(i2eBordStrPtr pB)
1083{
1084 int port = pB->i2ePointer;
1085 OUTB ( port, SEL_OUTMAIL );
1086 return ( INB(port) == 0 );
1087}
1088
1089//******************************************************************************
1090// Function: iiTxMailEmptyIIEX(pB)
1091// Parameters: pB - pointer to board structure
1092//
1093// Returns: True if the transmit mailbox is empty.
1094// False if it not empty.
1095//
1096// Description:
1097//
1098// Returns true or false according to whether the transmit mailbox is empty (and
1099// therefore able to accept more mail)
1100//
1101// This version operates on IntelliPort-IIEX - style FIFO's
1102//
1103//******************************************************************************
1104static int
1105iiTxMailEmptyIIEX(i2eBordStrPtr pB)
1106{
1107 return !(INB(pB->i2eStatus) & STE_OUT_MAIL);
1108}
1109
1110//******************************************************************************
1111// Function: iiTrySendMailII(pB,mail)
1112// Parameters: pB - pointer to board structure
1113// mail - value to write to mailbox
1114//
1115// Returns: True if the transmit mailbox is empty, and mail is sent.
1116// False if it not empty.
1117//
1118// Description:
1119//
1120// If outgoing mailbox is empty, sends mail and returns true. If outgoing
1121// mailbox is not empty, returns false.
1122//
1123// This version operates on IntelliPort-II - style FIFO's
1124//
1125//******************************************************************************
1126static int
1127iiTrySendMailII(i2eBordStrPtr pB, unsigned char mail)
1128{
1129 int port = pB->i2ePointer;
1130
1131 OUTB(port, SEL_OUTMAIL);
1132 if (INB(port) == 0) {
1133 OUTB(port, SEL_OUTMAIL);
1134 OUTB(port, mail);
1135 return 1;
1136 }
1137 return 0;
1138}
1139
1140//******************************************************************************
1141// Function: iiTrySendMailIIEX(pB,mail)
1142// Parameters: pB - pointer to board structure
1143// mail - value to write to mailbox
1144//
1145// Returns: True if the transmit mailbox is empty, and mail is sent.
1146// False if it not empty.
1147//
1148// Description:
1149//
1150// If outgoing mailbox is empty, sends mail and returns true. If outgoing
1151// mailbox is not empty, returns false.
1152//
1153// This version operates on IntelliPort-IIEX - style FIFO's
1154//
1155//******************************************************************************
1156static int
1157iiTrySendMailIIEX(i2eBordStrPtr pB, unsigned char mail)
1158{
1159 if(INB(pB->i2eStatus) & STE_OUT_MAIL) {
1160 return 0;
1161 }
1162 OUTB(pB->i2eXMail, mail);
1163 return 1;
1164}
1165
1166//******************************************************************************
1167// Function: iiGetMailII(pB,mail)
1168// Parameters: pB - pointer to board structure
1169//
1170// Returns: Mailbox data or NO_MAIL_HERE.
1171//
1172// Description:
1173//
1174// If no mail available, returns NO_MAIL_HERE otherwise returns the data from
1175// the mailbox, which is guaranteed != NO_MAIL_HERE.
1176//
1177// This version operates on IntelliPort-II - style FIFO's
1178//
1179//******************************************************************************
1180static unsigned short
1181iiGetMailII(i2eBordStrPtr pB)
1182{
1183 if (HAS_MAIL(pB)) {
1184 OUTB(pB->i2ePointer, SEL_INMAIL);
1185 return INB(pB->i2ePointer);
1186 } else {
1187 return NO_MAIL_HERE;
1188 }
1189}
1190
1191//******************************************************************************
1192// Function: iiGetMailIIEX(pB,mail)
1193// Parameters: pB - pointer to board structure
1194//
1195// Returns: Mailbox data or NO_MAIL_HERE.
1196//
1197// Description:
1198//
1199// If no mail available, returns NO_MAIL_HERE otherwise returns the data from
1200// the mailbox, which is guaranteed != NO_MAIL_HERE.
1201//
1202// This version operates on IntelliPort-IIEX - style FIFO's
1203//
1204//******************************************************************************
1205static unsigned short
1206iiGetMailIIEX(i2eBordStrPtr pB)
1207{
1208 if (HAS_MAIL(pB)) {
1209 return INB(pB->i2eXMail);
1210 } else {
1211 return NO_MAIL_HERE;
1212 }
1213}
1214
1215//******************************************************************************
1216// Function: iiEnableMailIrqII(pB)
1217// Parameters: pB - pointer to board structure
1218//
1219// Returns: Nothing
1220//
1221// Description:
1222//
1223// Enables board to interrupt host (only) by writing to host's in-bound mailbox.
1224//
1225// This version operates on IntelliPort-II - style FIFO's
1226//
1227//******************************************************************************
1228static void
1229iiEnableMailIrqII(i2eBordStrPtr pB)
1230{
1231 OUTB(pB->i2ePointer, SEL_MASK);
1232 OUTB(pB->i2ePointer, ST_IN_MAIL);
1233}
1234
1235//******************************************************************************
1236// Function: iiEnableMailIrqIIEX(pB)
1237// Parameters: pB - pointer to board structure
1238//
1239// Returns: Nothing
1240//
1241// Description:
1242//
1243// Enables board to interrupt host (only) by writing to host's in-bound mailbox.
1244//
1245// This version operates on IntelliPort-IIEX - style FIFO's
1246//
1247//******************************************************************************
1248static void
1249iiEnableMailIrqIIEX(i2eBordStrPtr pB)
1250{
1251 OUTB(pB->i2eXMask, MX_IN_MAIL);
1252}
1253
1254//******************************************************************************
1255// Function: iiWriteMaskII(pB)
1256// Parameters: pB - pointer to board structure
1257//
1258// Returns: Nothing
1259//
1260// Description:
1261//
1262// Writes arbitrary value to the mask register.
1263//
1264// This version operates on IntelliPort-II - style FIFO's
1265//
1266//******************************************************************************
1267static void
1268iiWriteMaskII(i2eBordStrPtr pB, unsigned char value)
1269{
1270 OUTB(pB->i2ePointer, SEL_MASK);
1271 OUTB(pB->i2ePointer, value);
1272}
1273
1274//******************************************************************************
1275// Function: iiWriteMaskIIEX(pB)
1276// Parameters: pB - pointer to board structure
1277//
1278// Returns: Nothing
1279//
1280// Description:
1281//
1282// Writes arbitrary value to the mask register.
1283//
1284// This version operates on IntelliPort-IIEX - style FIFO's
1285//
1286//******************************************************************************
1287static void
1288iiWriteMaskIIEX(i2eBordStrPtr pB, unsigned char value)
1289{
1290 OUTB(pB->i2eXMask, value);
1291}
1292
1293//******************************************************************************
1294// Function: iiDownloadBlock(pB, pSource, isStandard)
1295// Parameters: pB - pointer to board structure
1296// pSource - loadware block to download
1297// isStandard - True if "standard" loadware, else false.
1298//
1299// Returns: Success or Failure
1300//
1301// Description:
1302//
1303// Downloads a single block (at pSource)to the board referenced by pB. Caller
1304// sets isStandard to true/false according to whether the "standard" loadware is
1305// what's being loaded. The normal process, then, is to perform an iiInitialize
1306// to the board, then perform some number of iiDownloadBlocks using the returned
1307// state to determine when download is complete.
1308//
1309// Possible return values: (see I2ELLIS.H)
1310// II_DOWN_BADVALID
1311// II_DOWN_BADFILE
1312// II_DOWN_CONTINUING
1313// II_DOWN_GOOD
1314// II_DOWN_BAD
1315// II_DOWN_BADSTATE
1316// II_DOWN_TIMEOUT
1317//
1318// Uses the i2eState and i2eToLoad fields (initialized at iiInitialize) to
1319// determine whether this is the first block, whether to check for magic
1320// numbers, how many blocks there are to go...
1321//
1322//******************************************************************************
1323static int
1324iiDownloadBlock ( i2eBordStrPtr pB, loadHdrStrPtr pSource, int isStandard)
1325{
1326 int itemp;
1327 int loadedFirst;
1328
1329 if (pB->i2eValid != I2E_MAGIC) return II_DOWN_BADVALID;
1330
1331 switch(pB->i2eState)
1332 {
1333 case II_STATE_READY:
1334
1335 // Loading the first block after reset. Must check the magic number of the
1336 // loadfile, store the number of blocks we expect to load.
1337 if (pSource->e.loadMagic != MAGIC_LOADFILE)
1338 {
1339 return II_DOWN_BADFILE;
1340 }
1341
1342 // Next we store the total number of blocks to load, including this one.
1343 pB->i2eToLoad = 1 + pSource->e.loadBlocksMore;
1344
1345 // Set the state, store the version numbers. ('Cause this may have come
1346 // from a file - we might want to report these versions and revisions in
1347 // case of an error!
1348 pB->i2eState = II_STATE_LOADING;
1349 pB->i2eLVersion = pSource->e.loadVersion;
1350 pB->i2eLRevision = pSource->e.loadRevision;
1351 pB->i2eLSub = pSource->e.loadSubRevision;
1352
1353 // The time and date of compilation is also available but don't bother
1354 // storing it for normal purposes.
1355 loadedFirst = 1;
1356 break;
1357
1358 case II_STATE_LOADING:
1359 loadedFirst = 0;
1360 break;
1361
1362 default:
1363 return II_DOWN_BADSTATE;
1364 }
1365
1366 // Now we must be in the II_STATE_LOADING state, and we assume i2eToLoad
1367 // must be positive still, because otherwise we would have cleaned up last
1368 // time and set the state to II_STATE_LOADED.
1369 if (!iiWaitForTxEmpty(pB, MAX_DLOAD_READ_TIME)) {
1370 return II_DOWN_TIMEOUT;
1371 }
1372
1373 if (!iiWriteBuf(pB, pSource->c, LOADWARE_BLOCK_SIZE)) {
1374 return II_DOWN_BADVALID;
1375 }
1376
1377 // If we just loaded the first block, wait for the fifo to empty an extra
1378 // long time to allow for any special startup code in the firmware, like
1379 // sending status messages to the LCD's.
1380
1381 if (loadedFirst) {
1382 if (!iiWaitForTxEmpty(pB, MAX_DLOAD_START_TIME)) {
1383 return II_DOWN_TIMEOUT;
1384 }
1385 }
1386
1387 // Determine whether this was our last block!
1388 if (--(pB->i2eToLoad)) {
1389 return II_DOWN_CONTINUING; // more to come...
1390 }
1391
1392 // It WAS our last block: Clean up operations...
1393 // ...Wait for last buffer to drain from the board...
1394 if (!iiWaitForTxEmpty(pB, MAX_DLOAD_READ_TIME)) {
1395 return II_DOWN_TIMEOUT;
1396 }
1397 // If there were only a single block written, this would come back
1398 // immediately and be harmless, though not strictly necessary.
1399 itemp = MAX_DLOAD_ACK_TIME/10;
1400 while (--itemp) {
1401 if (HAS_INPUT(pB)) {
1402 switch(BYTE_FROM(pB))
1403 {
1404 case LOADWARE_OK:
1405 pB->i2eState =
1406 isStandard ? II_STATE_STDLOADED :II_STATE_LOADED;
1407
1408 // Some revisions of the bootstrap firmware (e.g. ISA-8 1.0.2)
1409 // will, // if there is a debug port attached, require some
1410 // time to send information to the debug port now. It will do
1411 // this before // executing any of the code we just downloaded.
1412 // It may take up to 700 milliseconds.
1413 if (pB->i2ePom.e.porDiag2 & POR_DEBUG_PORT) {
1414 iiDelay(pB, 700);
1415 }
1416
1417 return II_DOWN_GOOD;
1418
1419 case LOADWARE_BAD:
1420 default:
1421 return II_DOWN_BAD;
1422 }
1423 }
1424
1425 iiDelay(pB, 10); // 10 mS granularity on checking condition
1426 }
1427
1428 // Drop-through --> timed out waiting for firmware confirmation
1429
1430 pB->i2eState = II_STATE_BADLOAD;
1431 return II_DOWN_TIMEOUT;
1432}
1433
1434//******************************************************************************
1435// Function: iiDownloadAll(pB, pSource, isStandard, size)
1436// Parameters: pB - pointer to board structure
1437// pSource - loadware block to download
1438// isStandard - True if "standard" loadware, else false.
1439// size - size of data to download (in bytes)
1440//
1441// Returns: Success or Failure
1442//
1443// Description:
1444//
1445// Given a pointer to a board structure, a pointer to the beginning of some
1446// loadware, whether it is considered the "standard loadware", and the size of
1447// the array in bytes loads the entire array to the board as loadware.
1448//
1449// Assumes the board has been freshly reset and the power-up reset message read.
1450// (i.e., in II_STATE_READY). Complains if state is bad, or if there seems to be
1451// too much or too little data to load, or if iiDownloadBlock complains.
1452//******************************************************************************
1453static int
1454iiDownloadAll(i2eBordStrPtr pB, loadHdrStrPtr pSource, int isStandard, int size)
1455{
1456 int status;
1457
1458 // We know (from context) board should be ready for the first block of
1459 // download. Complain if not.
1460 if (pB->i2eState != II_STATE_READY) return II_DOWN_BADSTATE;
1461
1462 while (size > 0) {
1463 size -= LOADWARE_BLOCK_SIZE; // How much data should there be left to
1464 // load after the following operation ?
1465
1466 // Note we just bump pSource by "one", because its size is actually that
1467 // of an entire block, same as LOADWARE_BLOCK_SIZE.
1468 status = iiDownloadBlock(pB, pSource++, isStandard);
1469
1470 switch(status)
1471 {
1472 case II_DOWN_GOOD:
1473 return ( (size > 0) ? II_DOWN_OVER : II_DOWN_GOOD);
1474
1475 case II_DOWN_CONTINUING:
1476 break;
1477
1478 default:
1479 return status;
1480 }
1481 }
1482
1483 // We shouldn't drop out: it means "while" caught us with nothing left to
1484 // download, yet the previous DownloadBlock did not return complete. Ergo,
1485 // not enough data to match the size byte in the header.
1486 return II_DOWN_UNDER;
1487}
diff --git a/drivers/char/ip2/i2ellis.h b/drivers/char/ip2/i2ellis.h
new file mode 100644
index 000000000000..510b026d7d26
--- /dev/null
+++ b/drivers/char/ip2/i2ellis.h
@@ -0,0 +1,615 @@
1/*******************************************************************************
2*
3* (c) 1999 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Mainline code for the device driver
12*
13*******************************************************************************/
14//------------------------------------------------------------------------------
15// i2ellis.h
16//
17// IntelliPort-II and IntelliPort-IIEX
18//
19// Extremely
20// Low
21// Level
22// Interface
23// Services
24//
25// Structure Definitions and declarations for "ELLIS" service routines found in
26// i2ellis.c
27//
28// These routines are based on properties of the IntelliPort-II and -IIEX
29// hardware and bootstrap firmware, and are not sensitive to particular
30// conventions of any particular loadware.
31//
32// Unlike i2hw.h, which provides IRONCLAD hardware definitions, the material
33// here and in i2ellis.c is intended to provice a useful, but not required,
34// layer of insulation from the hardware specifics.
35//------------------------------------------------------------------------------
36#ifndef I2ELLIS_H /* To prevent multiple includes */
37#define I2ELLIS_H 1
38//------------------------------------------------
39// Revision History:
40//
41// 30 September 1991 MAG First Draft Started
42// 12 October 1991 ...continued...
43//
44// 20 December 1996 AKM Linux version
45//-------------------------------------------------
46
47//----------------------
48// Mandatory Includes:
49//----------------------
50#include <linux/config.h>
51#include "ip2types.h"
52#include "i2hw.h" // The hardware definitions
53
54//------------------------------------------
55// STAT_BOXIDS packets
56//------------------------------------------
57#define MAX_BOX 4
58
59typedef struct _bidStat
60{
61 unsigned char bid_value[MAX_BOX];
62} bidStat, *bidStatPtr;
63
64// This packet is sent in response to a CMD_GET_BOXIDS bypass command. For -IIEX
65// boards, reports the hardware-specific "asynchronous resource register" on
66// each expansion box. Boxes not present report 0xff. For -II boards, the first
67// element contains 0x80 for 8-port, 0x40 for 4-port boards.
68
69// Box IDs aka ARR or Async Resource Register (more than you want to know)
70// 7 6 5 4 3 2 1 0
71// F F N N L S S S
72// =============================
73// F F - Product Family Designator
74// =====+++++++++++++++++++++++++++++++
75// 0 0 - Intelliport II EX / ISA-8
76// 1 0 - IntelliServer
77// 0 1 - SAC - Port Device (Intelliport III ??? )
78// =====+++++++++++++++++++++++++++++++++++++++
79// N N - Number of Ports
80// 0 0 - 8 (eight)
81// 0 1 - 4 (four)
82// 1 0 - 12 (twelve)
83// 1 1 - 16 (sixteen)
84// =++++++++++++++++++++++++++++++++++
85// L - LCD Display Module Present
86// 0 - No
87// 1 - LCD module present
88// =========+++++++++++++++++++++++++++++++++++++
89// S S S - Async Signals Supported Designator
90// 0 0 0 - 8dss, Mod DCE DB25 Female
91// 0 0 1 - 6dss, RJ-45
92// 0 1 0 - RS-232/422 dss, DB25 Female
93// 0 1 1 - RS-232/422 dss, separate 232/422 DB25 Female
94// 1 0 0 - 6dss, 921.6 I/F with ST654's
95// 1 0 1 - RS-423/232 8dss, RJ-45 10Pin
96// 1 1 0 - 6dss, Mod DCE DB25 Female
97// 1 1 1 - NO BOX PRESENT
98
99#define FF(c) ((c & 0xC0) >> 6)
100#define NN(c) ((c & 0x30) >> 4)
101#define L(c) ((c & 0x08) >> 3)
102#define SSS(c) (c & 0x07)
103
104#define BID_HAS_654(x) (SSS(x) == 0x04)
105#define BID_NO_BOX 0xff /* no box */
106#define BID_8PORT 0x80 /* IP2-8 port */
107#define BID_4PORT 0x81 /* IP2-4 port */
108#define BID_EXP_MASK 0x30 /* IP2-EX */
109#define BID_EXP_8PORT 0x00 /* 8, */
110#define BID_EXP_4PORT 0x10 /* 4, */
111#define BID_EXP_UNDEF 0x20 /* UNDEF, */
112#define BID_EXP_16PORT 0x30 /* 16, */
113#define BID_LCD_CTRL 0x08 /* LCD Controller */
114#define BID_LCD_NONE 0x00 /* - no controller present */
115#define BID_LCD_PRES 0x08 /* - controller present */
116#define BID_CON_MASK 0x07 /* - connector pinouts */
117#define BID_CON_DB25 0x00 /* - DB-25 F */
118#define BID_CON_RJ45 0x01 /* - rj45 */
119
120//------------------------------------------------------------------------------
121// i2eBordStr
122//
123// This structure contains all the information the ELLIS routines require in
124// dealing with a particular board.
125//------------------------------------------------------------------------------
126// There are some queues here which are guaranteed to never contain the entry
127// for a single channel twice. So they must be slightly larger to allow
128// unambiguous full/empty management
129//
130#define CH_QUEUE_SIZE ABS_MOST_PORTS+2
131
132typedef struct _i2eBordStr
133{
134 porStr i2ePom; // Structure containing the power-on message.
135
136 unsigned short i2ePomSize;
137 // The number of bytes actually read if
138 // different from sizeof i2ePom, indicates
139 // there is an error!
140
141 unsigned short i2eStartMail;
142 // Contains whatever inbound mailbox data
143 // present at startup. NO_MAIL_HERE indicates
144 // nothing was present. No special
145 // significance as of this writing, but may be
146 // useful for diagnostic reasons.
147
148 unsigned short i2eValid;
149 // Indicates validity of the structure; if
150 // i2eValid == I2E_MAGIC, then we can trust
151 // the other fields. Some (especially
152 // initialization) functions are good about
153 // checking for validity. Many functions do
154 // not, it being assumed that the larger
155 // context assures we are using a valid
156 // i2eBordStrPtr.
157
158 unsigned short i2eError;
159 // Used for returning an error condition from
160 // several functions which use i2eBordStrPtr
161 // as an argument.
162
163 // Accelerators to characterize separate features of a board, derived from a
164 // number of sources.
165
166 unsigned short i2eFifoSize;
167 // Always, the size of the FIFO. For
168 // IntelliPort-II, always the same, for -IIEX
169 // taken from the Power-On reset message.
170
171 volatile
172 unsigned short i2eFifoRemains;
173 // Used during normal operation to indicate a
174 // lower bound on the amount of data which
175 // might be in the outbound fifo.
176
177 unsigned char i2eFifoStyle;
178 // Accelerator which tells which style (-II or
179 // -IIEX) FIFO we are using.
180
181 unsigned char i2eDataWidth16;
182 // Accelerator which tells whether we should
183 // do 8 or 16-bit data transfers.
184
185 unsigned char i2eMaxIrq;
186 // The highest allowable IRQ, based on the
187 // slot size.
188
189 unsigned char i2eChangeIrq;
190 // Whether tis valid to change IRQ's
191 // ISA = ok, EISA, MicroChannel, no
192
193 // Accelerators for various addresses on the board
194 int i2eBase; // I/O Address of the Board
195 int i2eData; // From here data transfers happen
196 int i2eStatus; // From here status reads happen
197 int i2ePointer; // (IntelliPort-II: pointer/commands)
198 int i2eXMail; // (IntelliPOrt-IIEX: mailboxes
199 int i2eXMask; // (IntelliPort-IIEX: mask write
200
201 //-------------------------------------------------------
202 // Information presented in a common format across boards
203 // For each box, bit map of the channels present. Box closest to
204 // the host is box 0. LSB is channel 0. IntelliPort-II (non-expandable)
205 // is taken to be box 0. These are derived from product i.d. registers.
206
207 unsigned short i2eChannelMap[ABS_MAX_BOXES];
208
209 // Same as above, except each is derived from firmware attempting to detect
210 // the uart presence (by reading a valid GFRCR register). If bits are set in
211 // i2eChannelMap and not in i2eGoodMap, there is a potential problem.
212
213 unsigned short i2eGoodMap[ABS_MAX_BOXES];
214
215 // ---------------------------
216 // For indirect function calls
217
218 // Routine to cause an N-millisecond delay: Patched by the ii2Initialize
219 // function.
220
221 void (*i2eDelay)(unsigned int);
222
223 // Routine to write N bytes to the board through the FIFO. Returns true if
224 // all copacetic, otherwise returns false and error is in i2eError field.
225 // IF COUNT IS ODD, ROUNDS UP TO THE NEXT EVEN NUMBER.
226
227 int (*i2eWriteBuf)(struct _i2eBordStr *, unsigned char *, int);
228
229 // Routine to read N bytes from the board through the FIFO. Returns true if
230 // copacetic, otherwise returns false and error in i2eError.
231 // IF COUNT IS ODD, ROUNDS UP TO THE NEXT EVEN NUMBER.
232
233 int (*i2eReadBuf)(struct _i2eBordStr *, unsigned char *, int);
234
235 // Returns a word from FIFO. Will use 2 byte operations if needed.
236
237 unsigned short (*i2eReadWord)(struct _i2eBordStr *);
238
239 // Writes a word to FIFO. Will use 2 byte operations if needed.
240
241 void (*i2eWriteWord)(struct _i2eBordStr *, unsigned short);
242
243 // Waits specified time for the Transmit FIFO to go empty. Returns true if
244 // ok, otherwise returns false and error in i2eError.
245
246 int (*i2eWaitForTxEmpty)(struct _i2eBordStr *, int);
247
248 // Returns true or false according to whether the outgoing mailbox is empty.
249
250 int (*i2eTxMailEmpty)(struct _i2eBordStr *);
251
252 // Checks whether outgoing mailbox is empty. If so, sends mail and returns
253 // true. Otherwise returns false.
254
255 int (*i2eTrySendMail)(struct _i2eBordStr *, unsigned char);
256
257 // If no mail available, returns NO_MAIL_HERE, else returns the value in the
258 // mailbox (guaranteed can't be NO_MAIL_HERE).
259
260 unsigned short (*i2eGetMail)(struct _i2eBordStr *);
261
262 // Enables the board to interrupt the host when it writes to the mailbox.
263 // Irqs will not occur, however, until the loadware separately enables
264 // interrupt generation to the host. The standard loadware does this in
265 // response to a command packet sent by the host. (Also, disables
266 // any other potential interrupt sources from the board -- other than the
267 // inbound mailbox).
268
269 void (*i2eEnableMailIrq)(struct _i2eBordStr *);
270
271 // Writes an arbitrary value to the mask register.
272
273 void (*i2eWriteMask)(struct _i2eBordStr *, unsigned char);
274
275
276 // State information
277
278 // During downloading, indicates the number of blocks remaining to download
279 // to the board.
280
281 short i2eToLoad;
282
283 // State of board (see manifests below) (e.g., whether in reset condition,
284 // whether standard loadware is installed, etc.
285
286 unsigned char i2eState;
287
288 // These three fields are only valid when there is loadware running on the
289 // board. (i2eState == II_STATE_LOADED or i2eState == II_STATE_STDLOADED )
290
291 unsigned char i2eLVersion; // Loadware version
292 unsigned char i2eLRevision; // Loadware revision
293 unsigned char i2eLSub; // Loadware subrevision
294
295 // Flags which only have meaning in the context of the standard loadware.
296 // Somewhat violates the layering concept, but there is so little additional
297 // needed at the board level (while much additional at the channel level),
298 // that this beats maintaining two different per-board structures.
299
300 // Indicates which IRQ the board has been initialized (from software) to use
301 // For MicroChannel boards, any value different from IRQ_UNDEFINED means
302 // that the software command has been sent to enable interrupts (or specify
303 // they are disabled). Special value: IRQ_UNDEFINED indicates that the
304 // software command to select the interrupt has not yet been sent, therefore
305 // (since the standard loadware insists that it be sent before any other
306 // packets are sent) no other packets should be sent yet.
307
308 unsigned short i2eUsingIrq;
309
310 // This is set when we hit the MB_OUT_STUFFED mailbox, which prevents us
311 // putting more in the mailbox until an appropriate mailbox message is
312 // received.
313
314 unsigned char i2eWaitingForEmptyFifo;
315
316 // Any mailbox bits waiting to be sent to the board are OR'ed in here.
317
318 unsigned char i2eOutMailWaiting;
319
320 // The head of any incoming packet is read into here, is then examined and
321 // we dispatch accordingly.
322
323 unsigned short i2eLeadoffWord[1];
324
325 // Running counter of interrupts where the mailbox indicated incoming data.
326
327 unsigned short i2eFifoInInts;
328
329 // Running counter of interrupts where the mailbox indicated outgoing data
330 // had been stripped.
331
332 unsigned short i2eFifoOutInts;
333
334 // If not void, gives the address of a routine to call if fatal board error
335 // is found (only applies to standard l/w).
336
337 void (*i2eFatalTrap)(struct _i2eBordStr *);
338
339 // Will point to an array of some sort of channel structures (whose format
340 // is unknown at this level, being a function of what loadware is
341 // installed and the code configuration (max sizes of buffers, etc.)).
342
343 void *i2eChannelPtr;
344
345 // Set indicates that the board has gone fatal.
346
347 unsigned short i2eFatal;
348
349 // The number of elements pointed to by i2eChannelPtr.
350
351 unsigned short i2eChannelCnt;
352
353 // Ring-buffers of channel structures whose channels have particular needs.
354
355 rwlock_t Fbuf_spinlock;
356 volatile
357 unsigned short i2Fbuf_strip; // Strip index
358 volatile
359 unsigned short i2Fbuf_stuff; // Stuff index
360 void *i2Fbuf[CH_QUEUE_SIZE]; // An array of channel pointers
361 // of channels who need to send
362 // flow control packets.
363 rwlock_t Dbuf_spinlock;
364 volatile
365 unsigned short i2Dbuf_strip; // Strip index
366 volatile
367 unsigned short i2Dbuf_stuff; // Stuff index
368 void *i2Dbuf[CH_QUEUE_SIZE]; // An array of channel pointers
369 // of channels who need to send
370 // data or in-line command packets.
371 rwlock_t Bbuf_spinlock;
372 volatile
373 unsigned short i2Bbuf_strip; // Strip index
374 volatile
375 unsigned short i2Bbuf_stuff; // Stuff index
376 void *i2Bbuf[CH_QUEUE_SIZE]; // An array of channel pointers
377 // of channels who need to send
378 // bypass command packets.
379
380 /*
381 * A set of flags to indicate that certain events have occurred on at least
382 * one of the ports on this board. We use this to decide whether to spin
383 * through the channels looking for breaks, etc.
384 */
385 int got_input;
386 int status_change;
387 bidStat channelBtypes;
388
389 /*
390 * Debugging counters, etc.
391 */
392 unsigned long debugFlowQueued;
393 unsigned long debugInlineQueued;
394 unsigned long debugDataQueued;
395 unsigned long debugBypassQueued;
396 unsigned long debugFlowCount;
397 unsigned long debugInlineCount;
398 unsigned long debugBypassCount;
399
400 rwlock_t read_fifo_spinlock;
401 rwlock_t write_fifo_spinlock;
402
403// For queuing interrupt bottom half handlers. /\/\|=mhw=|\/\/
404 struct work_struct tqueue_interrupt;
405
406 struct timer_list SendPendingTimer; // Used by iiSendPending
407 unsigned int SendPendingRetry;
408} i2eBordStr, *i2eBordStrPtr;
409
410//-------------------------------------------------------------------
411// Macro Definitions for the indirect calls defined in the i2eBordStr
412//-------------------------------------------------------------------
413//
414#define iiDelay(a,b) (*(a)->i2eDelay)(b)
415#define iiWriteBuf(a,b,c) (*(a)->i2eWriteBuf)(a,b,c)
416#define iiReadBuf(a,b,c) (*(a)->i2eReadBuf)(a,b,c)
417
418#define iiWriteWord(a,b) (*(a)->i2eWriteWord)(a,b)
419#define iiReadWord(a) (*(a)->i2eReadWord)(a)
420
421#define iiWaitForTxEmpty(a,b) (*(a)->i2eWaitForTxEmpty)(a,b)
422
423#define iiTxMailEmpty(a) (*(a)->i2eTxMailEmpty)(a)
424#define iiTrySendMail(a,b) (*(a)->i2eTrySendMail)(a,b)
425
426#define iiGetMail(a) (*(a)->i2eGetMail)(a)
427#define iiEnableMailIrq(a) (*(a)->i2eEnableMailIrq)(a)
428#define iiDisableMailIrq(a) (*(a)->i2eWriteMask)(a,0)
429#define iiWriteMask(a,b) (*(a)->i2eWriteMask)(a,b)
430
431//-------------------------------------------
432// Manifests for i2eBordStr:
433//-------------------------------------------
434
435#define YES 1
436#define NO 0
437
438#define NULLFUNC (void (*)(void))0
439#define NULLPTR (void *)0
440
441typedef void (*delayFunc_t)(unsigned int);
442
443// i2eValid
444//
445#define I2E_MAGIC 0x4251 // Structure is valid.
446#define I2E_INCOMPLETE 0x1122 // Structure failed during init.
447
448
449// i2eError
450//
451#define I2EE_GOOD 0 // Operation successful
452#define I2EE_BADADDR 1 // Address out of range
453#define I2EE_BADSTATE 2 // Attempt to perform a function when the board
454 // structure was in the incorrect state
455#define I2EE_BADMAGIC 3 // Bad magic number from Power On test (i2ePomSize
456 // reflects what was read
457#define I2EE_PORM_SHORT 4 // Power On message too short
458#define I2EE_PORM_LONG 5 // Power On message too long
459#define I2EE_BAD_FAMILY 6 // Un-supported board family type
460#define I2EE_INCONSIST 7 // Firmware reports something impossible,
461 // e.g. unexpected number of ports... Almost no
462 // excuse other than bad FIFO...
463#define I2EE_POSTERR 8 // Power-On self test reported a bad error
464#define I2EE_BADBUS 9 // Unknown Bus type declared in message
465#define I2EE_TXE_TIME 10 // Timed out waiting for TX Fifo to empty
466#define I2EE_INVALID 11 // i2eValid field does not indicate a valid and
467 // complete board structure (for functions which
468 // require this be so.)
469#define I2EE_BAD_PORT 12 // Discrepancy between channels actually found and
470 // what the product is supposed to have. Check
471 // i2eGoodMap vs i2eChannelMap for details.
472#define I2EE_BAD_IRQ 13 // Someone specified an unsupported IRQ
473#define I2EE_NOCHANNELS 14 // No channel structures have been defined (for
474 // functions requiring this).
475
476// i2eFifoStyle
477//
478#define FIFO_II 0 /* IntelliPort-II style: see also i2hw.h */
479#define FIFO_IIEX 1 /* IntelliPort-IIEX style */
480
481// i2eGetMail
482//
483#define NO_MAIL_HERE 0x1111 // Since mail is unsigned char, cannot possibly
484 // promote to 0x1111.
485// i2eState
486//
487#define II_STATE_COLD 0 // Addresses have been defined, but board not even
488 // reset yet.
489#define II_STATE_RESET 1 // Board,if it exists, has just been reset
490#define II_STATE_READY 2 // Board ready for its first block
491#define II_STATE_LOADING 3 // Board continuing load
492#define II_STATE_LOADED 4 // Board has finished load: status ok
493#define II_STATE_BADLOAD 5 // Board has finished load: failed!
494#define II_STATE_STDLOADED 6 // Board has finished load: standard firmware
495
496// i2eUsingIrq
497//
498#define IRQ_UNDEFINED 0x1352 // No valid irq (or polling = 0) can ever
499 // promote to this!
500//------------------------------------------
501// Handy Macros for i2ellis.c and others
502// Note these are common to -II and -IIEX
503//------------------------------------------
504
505// Given a pointer to the board structure, does the input FIFO have any data or
506// not?
507//
508#define HAS_INPUT(pB) !(INB(pB->i2eStatus) & ST_IN_EMPTY)
509#define HAS_NO_INPUT(pB) (INB(pB->i2eStatus) & ST_IN_EMPTY)
510
511// Given a pointer to board structure, read a byte or word from the fifo
512//
513#define BYTE_FROM(pB) (unsigned char)INB(pB->i2eData)
514#define WORD_FROM(pB) (unsigned short)INW(pB->i2eData)
515
516// Given a pointer to board structure, is there room for any data to be written
517// to the data fifo?
518//
519#define HAS_OUTROOM(pB) !(INB(pB->i2eStatus) & ST_OUT_FULL)
520#define HAS_NO_OUTROOM(pB) (INB(pB->i2eStatus) & ST_OUT_FULL)
521
522// Given a pointer to board structure, write a single byte to the fifo
523// structure. Note that for 16-bit interfaces, the high order byte is undefined
524// and unknown.
525//
526#define BYTE_TO(pB, c) OUTB(pB->i2eData,(c))
527
528// Write a word to the fifo structure. For 8-bit interfaces, this may have
529// unknown results.
530//
531#define WORD_TO(pB, c) OUTW(pB->i2eData,(c))
532
533// Given a pointer to the board structure, is there anything in the incoming
534// mailbox?
535//
536#define HAS_MAIL(pB) (INB(pB->i2eStatus) & ST_IN_MAIL)
537
538#define UPDATE_FIFO_ROOM(pB) (pB)->i2eFifoRemains=(pB)->i2eFifoSize
539
540// Handy macro to round up a number (like the buffer write and read routines do)
541//
542#define ROUNDUP(number) (((number)+1) & (~1))
543
544//------------------------------------------
545// Function Declarations for i2ellis.c
546//------------------------------------------
547//
548// Functions called directly
549//
550// Initialization of a board & structure is in four (five!) parts:
551//
552// 0) iiEllisInit() - Initialize iiEllis subsystem.
553// 1) iiSetAddress() - Define the board address & delay function for a board.
554// 2) iiReset() - Reset the board (provided it exists)
555// -- Note you may do this to several boards --
556// 3) iiResetDelay() - Delay for 2 seconds (once for all boards)
557// 4) iiInitialize() - Attempt to read Power-up message; further initialize
558// accelerators
559//
560// Then you may use iiDownloadAll() or iiDownloadFile() (in i2file.c) to write
561// loadware. To change loadware, you must begin again with step 2, resetting
562// the board again (step 1 not needed).
563
564static void iiEllisInit(void);
565static int iiSetAddress(i2eBordStrPtr, int, delayFunc_t );
566static int iiReset(i2eBordStrPtr);
567static int iiResetDelay(i2eBordStrPtr);
568static int iiInitialize(i2eBordStrPtr);
569
570// Routine to validate that all channels expected are there.
571//
572extern int iiValidateChannels(i2eBordStrPtr);
573
574// Routine used to download a block of loadware.
575//
576static int iiDownloadBlock(i2eBordStrPtr, loadHdrStrPtr, int);
577
578// Return values given by iiDownloadBlock, iiDownloadAll, iiDownloadFile:
579//
580#define II_DOWN_BADVALID 0 // board structure is invalid
581#define II_DOWN_CONTINUING 1 // So far, so good, firmware expects more
582#define II_DOWN_GOOD 2 // Download complete, CRC good
583#define II_DOWN_BAD 3 // Download complete, but CRC bad
584#define II_DOWN_BADFILE 4 // Bad magic number in loadware file
585#define II_DOWN_BADSTATE 5 // Board is in an inappropriate state for
586 // downloading loadware. (see i2eState)
587#define II_DOWN_TIMEOUT 6 // Timeout waiting for firmware
588#define II_DOWN_OVER 7 // Too much data
589#define II_DOWN_UNDER 8 // Not enough data
590#define II_DOWN_NOFILE 9 // Loadware file not found
591
592// Routine to download an entire loadware module: Return values are a subset of
593// iiDownloadBlock's, excluding, of course, II_DOWN_CONTINUING
594//
595static int iiDownloadAll(i2eBordStrPtr, loadHdrStrPtr, int, int);
596
597// Called indirectly always. Needed externally so the routine might be
598// SPECIFIED as an argument to iiReset()
599//
600//static void ii2DelayIO(unsigned int); // N-millisecond delay using
601 //hardware spin
602//static void ii2DelayTimer(unsigned int); // N-millisecond delay using Linux
603 //timer
604
605// Many functions defined here return True if good, False otherwise, with an
606// error code in i2eError field. Here is a handy macro for setting the error
607// code and returning.
608//
609#define COMPLETE(pB,code) \
610 if(1){ \
611 pB->i2eError = code; \
612 return (code == I2EE_GOOD);\
613 }
614
615#endif // I2ELLIS_H
diff --git a/drivers/char/ip2/i2hw.h b/drivers/char/ip2/i2hw.h
new file mode 100644
index 000000000000..15fe04e748f4
--- /dev/null
+++ b/drivers/char/ip2/i2hw.h
@@ -0,0 +1,648 @@
1/*******************************************************************************
2*
3* (c) 1999 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Definitions limited to properties of the hardware or the
12* bootstrap firmware. As such, they are applicable regardless of
13* operating system or loadware (standard or diagnostic).
14*
15*******************************************************************************/
16#ifndef I2HW_H
17#define I2HW_H 1
18//------------------------------------------------------------------------------
19// Revision History:
20//
21// 23 September 1991 MAG First Draft Started...through...
22// 11 October 1991 ... Continuing development...
23// 6 August 1993 Added support for ISA-4 (asic) which is architected
24// as an ISA-CEX with a single 4-port box.
25//
26// 20 December 1996 AKM Version for Linux
27//
28//------------------------------------------------------------------------------
29/*------------------------------------------------------------------------------
30
31HARDWARE DESCRIPTION:
32
33Introduction:
34
35The IntelliPort-II and IntelliPort-IIEX products occupy a block of eight (8)
36addresses in the host's I/O space.
37
38Some addresses are used to transfer data to/from the board, some to transfer
39so-called "mailbox" messages, and some to read bit-mapped status information.
40While all the products in the line are functionally similar, some use a 16-bit
41data path to transfer data while others use an 8-bit path. Also, the use of
42command /status/mailbox registers differs slightly between the II and IIEX
43branches of the family.
44
45The host determines what type of board it is dealing with by reading a string of
46sixteen characters from the board. These characters are always placed in the
47fifo by the board's local processor whenever the board is reset (either from
48power-on or under software control) and are known as the "Power-on Reset
49Message." In order that this message can be read from either type of board, the
50hardware registers used in reading this message are the same. Once this message
51has been read by the host, then it has the information required to operate.
52
53General Differences between boards:
54
55The greatest structural difference is between the -II and -IIEX families of
56product. The -II boards use the Am4701 dual 512x8 bidirectional fifo to support
57the data path, mailbox registers, and status registers. This chip contains some
58features which are not used in the IntelliPort-II products; a description of
59these is omitted here. Because of these many features, it contains many
60registers, too many to access directly within a small address space. They are
61accessed by first writing a value to a "pointer" register. This value selects
62the register to be accessed. The next read or write to that address accesses
63the selected register rather than the pointer register.
64
65The -IIEX boards use a proprietary design similar to the Am4701 in function. But
66because of a simpler, more streamlined design it doesn't require so many
67registers. This means they can be accessed directly in single operations rather
68than through a pointer register.
69
70Besides these differences, there are differences in whether 8-bit or 16-bit
71transfers are used to move data to the board.
72
73The -II boards are capable only of 8-bit data transfers, while the -IIEX boards
74may be configured for either 8-bit or 16-bit data transfers. If the on-board DIP
75switch #8 is ON, and the card has been installed in a 16-bit slot, 16-bit
76transfers are supported (and will be expected by the standard loadware). The
77on-board firmware can determine the position of the switch, and whether the
78board is installed in a 16-bit slot; it supplies this information to the host as
79part of the power-up reset message.
80
81The configuration switch (#8) and slot selection do not directly configure the
82hardware. It is up to the on-board loadware and host-based drivers to act
83according to the selected options. That is, loadware and drivers could be
84written to perform 8-bit transfers regardless of the state of the DIP switch or
85slot (and in a diagnostic environment might well do so). Likewise, 16-bit
86transfers could be performed as long as the card is in a 16-bit slot.
87
88Note the slot selection and DIP switch selection are provided separately: a
89board running in 8-bit mode in a 16-bit slot has a greater range of possible
90interrupts to choose from; information of potential use to the host.
91
92All 8-bit data transfers are done in the same way, regardless of whether on a
93-II board or a -IIEX board.
94
95The host must consider two things then: 1) whether a -II or -IIEX product is
96being used, and 2) whether an 8-bit or 16-bit data path is used.
97
98A further difference is that -II boards always have a 512-byte fifo operating in
99each direction. -IIEX boards may use fifos of varying size; this size is
100reported as part of the power-up message.
101
102I/O Map Of IntelliPort-II and IntelliPort-IIEX boards:
103(Relative to the chosen base address)
104
105Addr R/W IntelliPort-II IntelliPort-IIEX
106---- --- -------------- ----------------
1070 R/W Data Port (byte) Data Port (byte or word)
1081 R/W (Not used) (MSB of word-wide data written to Data Port)
1092 R Status Register Status Register
1102 W Pointer Register Interrupt Mask Register
1113 R/W (Not used) Mailbox Registers (6 bits: 11111100)
1124,5 -- Reserved for future products
1136 -- Reserved for future products
1147 R Guaranteed to have no effect
1157 W Hardware reset of board.
116
117
118Rules:
119All data transfers are performed using the even i/o address. If byte-wide data
120transfers are being used, do INB/OUTB operations on the data port. If word-wide
121transfers are used, do INW/OUTW operations. In some circumstances (such as
122reading the power-up message) you will do INB from the data port, but in this
123case the MSB of each word read is lost. When accessing all other unreserved
124registers, use byte operations only.
125------------------------------------------------------------------------------*/
126
127//------------------------------------------------
128// Mandatory Includes:
129//------------------------------------------------
130//
131#include "ip2types.h"
132#include "i2os.h" /* For any o.s., compiler, or host-related issues */
133
134//-------------------------------------------------------------------------
135// Manifests for the I/O map:
136//-------------------------------------------------------------------------
137// R/W: Data port (byte) for IntelliPort-II,
138// R/W: Data port (byte or word) for IntelliPort-IIEX
139// Incoming or outgoing data passes through a FIFO, the status of which is
140// available in some of the bits in FIFO_STATUS. This (bidirectional) FIFO is
141// the primary means of transferring data, commands, flow-control, and status
142// information between the host and board.
143//
144#define FIFO_DATA 0
145
146// Another way of passing information between the board and the host is
147// through "mailboxes". Unlike a FIFO, a mailbox holds only a single byte of
148// data. Writing data to the mailbox causes a status bit to be set, and
149// potentially interrupting the intended receiver. The sender has some way to
150// determine whether the data has been read yet; as soon as it has, it may send
151// more. The mailboxes are handled differently on -II and -IIEX products, as
152// suggested below.
153//------------------------------------------------------------------------------
154// Read: Status Register for IntelliPort-II or -IIEX
155// The presence of any bit set here will cause an interrupt to the host,
156// provided the corresponding bit has been unmasked in the interrupt mask
157// register. Furthermore, interrupts to the host are disabled globally until the
158// loadware selects the irq line to use. With the exception of STN_MR, the bits
159// remain set so long as the associated condition is true.
160//
161#define FIFO_STATUS 2
162
163// Bit map of status bits which are identical for -II and -IIEX
164//
165#define ST_OUT_FULL 0x40 // Outbound FIFO full
166#define ST_IN_EMPTY 0x20 // Inbound FIFO empty
167#define ST_IN_MAIL 0x04 // Inbound Mailbox full
168
169// The following exists only on the Intelliport-IIEX, and indicates that the
170// board has not read the last outgoing mailbox data yet. In the IntelliPort-II,
171// the outgoing mailbox may be read back: a zero indicates the board has read
172// the data.
173//
174#define STE_OUT_MAIL 0x80 // Outbound mailbox full (!)
175
176// The following bits are defined differently for -II and -IIEX boards. Code
177// which relies on these bits will need to be functionally different for the two
178// types of boards and should be generally avoided because of the additional
179// complexity this creates:
180
181// Bit map of status bits only on -II
182
183// Fifo has been RESET (cleared when the status register is read). Note that
184// this condition cannot be masked and would always interrupt the host, except
185// that the hardware reset also disables interrupts globally from the board
186// until re-enabled by loadware. This could also arise from the
187// Am4701-supported command to reset the chip, but this command is generally not
188// used here.
189//
190#define STN_MR 0x80
191
192// See the AMD Am4701 data sheet for details on the following four bits. They
193// are not presently used by Computone drivers.
194//
195#define STN_OUT_AF 0x10 // Outbound FIFO almost full (programmable)
196#define STN_IN_AE 0x08 // Inbound FIFO almost empty (programmable)
197#define STN_BD 0x02 // Inbound byte detected
198#define STN_PE 0x01 // Parity/Framing condition detected
199
200// Bit-map of status bits only on -IIEX
201//
202#define STE_OUT_HF 0x10 // Outbound FIFO half full
203#define STE_IN_HF 0x08 // Inbound FIFO half full
204#define STE_IN_FULL 0x02 // Inbound FIFO full
205#define STE_OUT_MT 0x01 // Outbound FIFO empty
206
207//------------------------------------------------------------------------------
208
209// Intelliport-II -- Write Only: the pointer register.
210// Values are written to this register to select the Am4701 internal register to
211// be accessed on the next operation.
212//
213#define FIFO_PTR 0x02
214
215// Values for the pointer register
216//
217#define SEL_COMMAND 0x1 // Selects the Am4701 command register
218
219// Some possible commands:
220//
221#define SEL_CMD_MR 0x80 // Am4701 command to reset the chip
222#define SEL_CMD_SH 0x40 // Am4701 command to map the "other" port into the
223 // status register.
224#define SEL_CMD_UNSH 0 // Am4701 command to "unshift": port maps into its
225 // own status register.
226#define SEL_MASK 0x2 // Selects the Am4701 interrupt mask register. The
227 // interrupt mask register is bit-mapped to match
228 // the status register (FIFO_STATUS) except for
229 // STN_MR. (See above.)
230#define SEL_BYTE_DET 0x3 // Selects the Am4701 byte-detect register. (Not
231 // normally used except in diagnostics.)
232#define SEL_OUTMAIL 0x4 // Selects the outbound mailbox (R/W). Reading back
233 // a value of zero indicates that the mailbox has
234 // been read by the board and is available for more
235 // data./ Writing to the mailbox optionally
236 // interrupts the board, depending on the loadware's
237 // setting of its interrupt mask register.
238#define SEL_AEAF 0x5 // Selects AE/AF threshold register.
239#define SEL_INMAIL 0x6 // Selects the inbound mailbox (Read)
240
241//------------------------------------------------------------------------------
242// IntelliPort-IIEX -- Write Only: interrupt mask (and misc flags) register:
243// Unlike IntelliPort-II, bit assignments do NOT match those of the status
244// register.
245//
246#define FIFO_MASK 0x2
247
248// Mailbox readback select:
249// If set, reads to FIFO_MAIL will read the OUTBOUND mailbox (host to board). If
250// clear (default on reset) reads to FIFO_MAIL will read the INBOUND mailbox.
251// This is the normal situation. The clearing of a mailbox is determined on
252// -IIEX boards by waiting for the STE_OUT_MAIL bit to clear. Readback
253// capability is provided for diagnostic purposes only.
254//
255#define MX_OUTMAIL_RSEL 0x80
256
257#define MX_IN_MAIL 0x40 // Enables interrupts when incoming mailbox goes
258 // full (ST_IN_MAIL set).
259#define MX_IN_FULL 0x20 // Enables interrupts when incoming FIFO goes full
260 // (STE_IN_FULL).
261#define MX_IN_MT 0x08 // Enables interrupts when incoming FIFO goes empty
262 // (ST_IN_MT).
263#define MX_OUT_FULL 0x04 // Enables interrupts when outgoing FIFO goes full
264 // (ST_OUT_FULL).
265#define MX_OUT_MT 0x01 // Enables interrupts when outgoing FIFO goes empty
266 // (STE_OUT_MT).
267
268// Any remaining bits are reserved, and should be written to ZERO for
269// compatibility with future Computone products.
270
271//------------------------------------------------------------------------------
272// IntelliPort-IIEX: -- These are only 6-bit mailboxes !!! -- 11111100 (low two
273// bits always read back 0).
274// Read: One of the mailboxes, usually Inbound.
275// Inbound Mailbox (MX_OUTMAIL_RSEL = 0)
276// Outbound Mailbox (MX_OUTMAIL_RSEL = 1)
277// Write: Outbound Mailbox
278// For the IntelliPort-II boards, the outbound mailbox is read back to determine
279// whether the board has read the data (0 --> data has been read). For the
280// IntelliPort-IIEX, this is done by reading a status register. To determine
281// whether mailbox is available for more outbound data, use the STE_OUT_MAIL bit
282// in FIFO_STATUS. Moreover, although the Outbound Mailbox can be read back by
283// setting MX_OUTMAIL_RSEL, it is NOT cleared when the board reads it, as is the
284// case with the -II boards. For this reason, FIFO_MAIL is normally used to read
285// the inbound FIFO, and MX_OUTMAIL_RSEL kept clear. (See above for
286// MX_OUTMAIL_RSEL description.)
287//
288#define FIFO_MAIL 0x3
289
290//------------------------------------------------------------------------------
291// WRITE ONLY: Resets the board. (Data doesn't matter).
292//
293#define FIFO_RESET 0x7
294
295//------------------------------------------------------------------------------
296// READ ONLY: Will have no effect. (Data is undefined.)
297// Actually, there will be an effect, in that the operation is sure to generate
298// a bus cycle: viz., an I/O byte Read. This fact can be used to enforce short
299// delays when no comparable time constant is available.
300//
301#define FIFO_NOP 0x7
302
303//------------------------------------------------------------------------------
304// RESET & POWER-ON RESET MESSAGE
305/*------------------------------------------------------------------------------
306RESET:
307
308The IntelliPort-II and -IIEX boards are reset in three ways: Power-up, channel
309reset, and via a write to the reset register described above. For products using
310the ISA bus, these three sources of reset are equvalent. For MCA and EISA buses,
311the Power-up and channel reset sources cause additional hardware initialization
312which should only occur at system startup time.
313
314The third type of reset, called a "command reset", is done by writing any data
315to the FIFO_RESET address described above. This resets the on-board processor,
316FIFO, UARTS, and associated hardware.
317
318This passes control of the board to the bootstrap firmware, which performs a
319Power-On Self Test and which detects its current configuration. For example,
320-IIEX products determine the size of FIFO which has been installed, and the
321number and type of expansion boxes attached.
322
323This and other information is then written to the FIFO in a 16-byte data block
324to be read by the host. This block is guaranteed to be present within two (2)
325seconds of having received the command reset. The firmware is now ready to
326receive loadware from the host.
327
328It is good practice to perform a command reset to the board explicitly as part
329of your software initialization. This allows your code to properly restart from
330a soft boot. (Many systems do not issue channel reset on soft boot).
331
332Because of a hardware reset problem on some of the Cirrus Logic 1400's which are
333used on the product, it is recommended that you reset the board twice, separated
334by an approximately 50 milliseconds delay. (VERY approximately: probably ok to
335be off by a factor of five. The important point is that the first command reset
336in fact generates a reset pulse on the board. This pulse is guaranteed to last
337less than 10 milliseconds. The additional delay ensures the 1400 has had the
338chance to respond sufficiently to the first reset. Why not a longer delay? Much
339more than 50 milliseconds gets to be noticable, but the board would still work.
340
341Once all 16 bytes of the Power-on Reset Message have been read, the bootstrap
342firmware is ready to receive loadware.
343
344Note on Power-on Reset Message format:
345The various fields have been designed with future expansion in view.
346Combinations of bitfields and values have been defined which define products
347which may not currently exist. This has been done to allow drivers to anticipate
348the possible introduction of products in a systematic fashion. This is not
349intended to suggest that each potential product is actually under consideration.
350------------------------------------------------------------------------------*/
351
352//----------------------------------------
353// Format of Power-on Reset Message
354//----------------------------------------
355
356typedef union _porStr // "por" stands for Power On Reset
357{
358 unsigned char c[16]; // array used when considering the message as a
359 // string of undifferentiated characters
360
361 struct // Elements used when considering values
362 {
363 // The first two bytes out of the FIFO are two magic numbers. These are
364 // intended to establish that there is indeed a member of the
365 // IntelliPort-II(EX) family present. The remaining bytes may be
366 // expected // to be valid. When reading the Power-on Reset message,
367 // if the magic numbers do not match it is probably best to stop
368 // reading immediately. You are certainly not reading our board (unless
369 // hardware is faulty), and may in fact be reading some other piece of
370 // hardware.
371
372 unsigned char porMagic1; // magic number: first byte == POR_MAGIC_1
373 unsigned char porMagic2; // magic number: second byte == POR_MAGIC_2
374
375 // The Version, Revision, and Subrevision are stored as absolute numbers
376 // and would normally be displayed in the format V.R.S (e.g. 1.0.2)
377
378 unsigned char porVersion; // Bootstrap firmware version number
379 unsigned char porRevision; // Bootstrap firmware revision number
380 unsigned char porSubRev; // Bootstrap firmware sub-revision number
381
382 unsigned char porID; // Product ID: Bit-mapped according to
383 // conventions described below. Among other
384 // things, this allows us to distinguish
385 // IntelliPort-II boards from IntelliPort-IIEX
386 // boards.
387
388 unsigned char porBus; // IntelliPort-II: Unused
389 // IntelliPort-IIEX: Bus Information:
390 // Bit-mapped below
391
392 unsigned char porMemory; // On-board DRAM size: in 32k blocks
393
394 // porPorts1 (and porPorts2) are used to determine the ports which are
395 // available to the board. For non-expandable product, a single number
396 // is sufficient. For expandable product, the board may be connected
397 // to as many as four boxes. Each box may be (so far) either a 16-port
398 // or an 8-port size. Whenever an 8-port box is used, the remaining 8
399 // ports leave gaps between existing channels. For that reason,
400 // expandable products must report a MAP of available channels. Since
401 // each UART supports four ports, we represent each UART found by a
402 // single bit. Using two bytes to supply the mapping information we
403 // report the presense or absense of up to 16 UARTS, or 64 ports in
404 // steps of 4 ports. For -IIEX products, the ports are numbered
405 // starting at the box closest to the controller in the "chain".
406
407 // Interpreted Differently for IntelliPort-II and -IIEX.
408 // -II: Number of ports (Derived actually from product ID). See
409 // Diag1&2 to indicate if uart was actually detected.
410 // -IIEX: Bit-map of UARTS found, LSB (see below for MSB of this). This
411 // bitmap is based on detecting the uarts themselves;
412 // see porFlags for information from the box i.d's.
413 unsigned char porPorts1;
414
415 unsigned char porDiag1; // Results of on-board P.O.S.T, 1st byte
416 unsigned char porDiag2; // Results of on-board P.O.S.T, 2nd byte
417 unsigned char porSpeed; // Speed of local CPU: given as MHz x10
418 // e.g., 16.0 MHz CPU is reported as 160
419 unsigned char porFlags; // Misc information (see manifests below)
420 // Bit-mapped: CPU type, UART's present
421
422 unsigned char porPorts2; // -II: Undefined
423 // -IIEX: Bit-map of UARTS found, MSB (see
424 // above for LSB)
425
426 // IntelliPort-II: undefined
427 // IntelliPort-IIEX: 1 << porFifoSize gives the size, in bytes, of the
428 // host interface FIFO, in each direction. When running the -IIEX in
429 // 8-bit mode, fifo capacity is halved. The bootstrap firmware will
430 // have already accounted for this fact in generating this number.
431 unsigned char porFifoSize;
432
433 // IntelliPort-II: undefined
434 // IntelliPort-IIEX: The number of boxes connected. (Presently 1-4)
435 unsigned char porNumBoxes;
436 } e;
437} porStr, *porStrPtr;
438
439//--------------------------
440// Values for porStr fields
441//--------------------------
442
443//---------------------
444// porMagic1, porMagic2
445//----------------------
446//
447#define POR_MAGIC_1 0x96 // The only valid value for porMagic1
448#define POR_MAGIC_2 0x35 // The only valid value for porMagic2
449#define POR_1_INDEX 0 // Byte position of POR_MAGIC_1
450#define POR_2_INDEX 1 // Ditto for POR_MAGIC_2
451
452//----------------------
453// porID
454//----------------------
455//
456#define POR_ID_FAMILY 0xc0 // These bits indicate the general family of
457 // product.
458#define POR_ID_FII 0x00 // Family is "IntelliPort-II"
459#define POR_ID_FIIEX 0x40 // Family is "IntelliPort-IIEX"
460
461// These bits are reserved, presently zero. May be used at a later date to
462// convey other product information.
463//
464#define POR_ID_RESERVED 0x3c
465
466#define POR_ID_SIZE 0x03 // Remaining bits indicate number of ports &
467 // Connector information.
468#define POR_ID_II_8 0x00 // For IntelliPort-II, indicates 8-port using
469 // standard brick.
470#define POR_ID_II_8R 0x01 // For IntelliPort-II, indicates 8-port using
471 // RJ11's (no CTS)
472#define POR_ID_II_6 0x02 // For IntelliPort-II, indicates 6-port using
473 // RJ45's
474#define POR_ID_II_4 0x03 // For IntelliPort-II, indicates 4-port using
475 // 4xRJ45 connectors
476#define POR_ID_EX 0x00 // For IntelliPort-IIEX, indicates standard
477 // expandable controller (other values reserved)
478
479//----------------------
480// porBus
481//----------------------
482
483// IntelliPort-IIEX only: Board is installed in a 16-bit slot
484//
485#define POR_BUS_SLOT16 0x20
486
487// IntelliPort-IIEX only: DIP switch #8 is on, selecting 16-bit host interface
488// operation.
489//
490#define POR_BUS_DIP16 0x10
491
492// Bits 0-2 indicate type of bus: This information is stored in the bootstrap
493// loadware, different loadware being used on different products for different
494// buses. For most situations, the drivers do not need this information; but it
495// is handy in a diagnostic environment. For example, on microchannel boards,
496// you would not want to try to test several interrupts, only the one for which
497// you were configured.
498//
499#define POR_BUS_TYPE 0x07
500
501// Unknown: this product doesn't know what bus it is running in. (e.g. if same
502// bootstrap firmware were wanted for two different buses.)
503//
504#define POR_BUS_T_UNK 0
505
506// Note: existing firmware for ISA-8 and MC-8 currently report the POR_BUS_T_UNK
507// state, since the same bootstrap firmware is used for each.
508
509#define POR_BUS_T_MCA 1 // MCA BUS */
510#define POR_BUS_T_EISA 2 // EISA BUS */
511#define POR_BUS_T_ISA 3 // ISA BUS */
512
513// Values 4-7 Reserved
514
515// Remaining bits are reserved
516
517//----------------------
518// porDiag1
519//----------------------
520
521#define POR_BAD_MAPPER 0x80 // HW failure on P.O.S.T: Chip mapper failed
522
523// These two bits valid only for the IntelliPort-II
524//
525#define POR_BAD_UART1 0x01 // First 1400 bad
526#define POR_BAD_UART2 0x02 // Second 1400 bad
527
528//----------------------
529// porDiag2
530//----------------------
531
532#define POR_DEBUG_PORT 0x80 // debug port was detected by the P.O.S.T
533#define POR_DIAG_OK 0x00 // Indicates passage: Failure codes not yet
534 // available.
535 // Other bits undefined.
536//----------------------
537// porFlags
538//----------------------
539
540#define POR_CPU 0x03 // These bits indicate supposed CPU type
541#define POR_CPU_8 0x01 // Board uses an 80188 (no such thing yet)
542#define POR_CPU_6 0x02 // Board uses an 80186 (all existing products)
543#define POR_CEX4 0x04 // If set, this is an ISA-CEX/4: An ISA-4 (asic)
544 // which is architected like an ISA-CEX connected
545 // to a (hitherto impossible) 4-port box.
546#define POR_BOXES 0xf0 // Valid for IntelliPort-IIEX only: Map of Box
547 // sizes based on box I.D.
548#define POR_BOX_16 0x10 // Set indicates 16-port, clear 8-port
549
550//-------------------------------------
551// LOADWARE and DOWNLOADING CODE
552//-------------------------------------
553
554/*
555Loadware may be sent to the board in two ways:
5561) It may be read from a (binary image) data file block by block as each block
557 is sent to the board. This is only possible when the initialization is
558 performed by code which can access your file system. This is most suitable
559 for diagnostics and appications which use the interface library directly.
560
5612) It may be hard-coded into your source by including a .h file (typically
562 supplied by Computone), which declares a data array and initializes every
563 element. This acheives the same result as if an entire loadware file had
564 been read into the array.
565
566 This requires more data space in your program, but access to the file system
567 is not required. This method is more suited to driver code, which typically
568 is running at a level too low to access the file system directly.
569
570At present, loadware can only be generated at Computone.
571
572All Loadware begins with a header area which has a particular format. This
573includes a magic number which identifies the file as being (purportedly)
574loadware, CRC (for the loader), and version information.
575*/
576
577
578//-----------------------------------------------------------------------------
579// Format of loadware block
580//
581// This is defined as a union so we can pass a pointer to one of these items
582// and (if it is the first block) pick out the version information, etc.
583//
584// Otherwise, to deal with this as a simple character array
585//------------------------------------------------------------------------------
586
587#define LOADWARE_BLOCK_SIZE 512 // Number of bytes in each block of loadware
588
589typedef union _loadHdrStr
590{
591 unsigned char c[LOADWARE_BLOCK_SIZE]; // Valid for every block
592
593 struct // These fields are valid for only the first block of loadware.
594 {
595 unsigned char loadMagic; // Magic number: see below
596 unsigned char loadBlocksMore; // How many more blocks?
597 unsigned char loadCRC[2]; // Two CRC bytes: used by loader
598 unsigned char loadVersion; // Version number
599 unsigned char loadRevision; // Revision number
600 unsigned char loadSubRevision; // Sub-revision number
601 unsigned char loadSpares[9]; // Presently unused
602 unsigned char loadDates[32]; // Null-terminated string which can give
603 // date and time of compilation
604 } e;
605} loadHdrStr, *loadHdrStrPtr;
606
607//------------------------------------
608// Defines for downloading code:
609//------------------------------------
610
611// The loadMagic field in the first block of the loadfile must be this, else the
612// file is not valid.
613//
614#define MAGIC_LOADFILE 0x3c
615
616// How do we know the load was successful? On completion of the load, the
617// bootstrap firmware returns a code to indicate whether it thought the download
618// was valid and intends to execute it. These are the only possible valid codes:
619//
620#define LOADWARE_OK 0xc3 // Download was ok
621#define LOADWARE_BAD 0x5a // Download was bad (CRC error)
622
623// Constants applicable to writing blocks of loadware:
624// The first block of loadware might take 600 mS to load, in extreme cases.
625// (Expandable board: worst case for sending startup messages to the LCD's).
626// The 600mS figure is not really a calculation, but a conservative
627// guess/guarantee. Usually this will be within 100 mS, like subsequent blocks.
628//
629#define MAX_DLOAD_START_TIME 1000 // 1000 mS
630#define MAX_DLOAD_READ_TIME 100 // 100 mS
631
632// Firmware should respond with status (see above) within this long of host
633// having sent the final block.
634//
635#define MAX_DLOAD_ACK_TIME 100 // 100 mS, again!
636
637//------------------------------------------------------
638// MAXIMUM NUMBER OF PORTS PER BOARD:
639// This is fixed for now (with the expandable), but may
640// be expanding according to even newer products.
641//------------------------------------------------------
642//
643#define ABS_MAX_BOXES 4 // Absolute most boxes per board
644#define ABS_BIGGEST_BOX 16 // Absolute the most ports per box
645#define ABS_MOST_PORTS (ABS_MAX_BOXES * ABS_BIGGEST_BOX)
646
647#endif // I2HW_H
648
diff --git a/drivers/char/ip2/i2lib.c b/drivers/char/ip2/i2lib.c
new file mode 100644
index 000000000000..82c5f30375ac
--- /dev/null
+++ b/drivers/char/ip2/i2lib.c
@@ -0,0 +1,2219 @@
1/*******************************************************************************
2*
3* (c) 1999 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: High-level interface code for the device driver. Uses the
12* Extremely Low Level Interface Support (i2ellis.c). Provides an
13* interface to the standard loadware, to support drivers or
14* application code. (This is included source code, not a separate
15* compilation module.)
16*
17*******************************************************************************/
18//------------------------------------------------------------------------------
19// Note on Strategy:
20// Once the board has been initialized, it will interrupt us when:
21// 1) It has something in the fifo for us to read (incoming data, flow control
22// packets, or whatever).
23// 2) It has stripped whatever we have sent last time in the FIFO (and
24// consequently is ready for more).
25//
26// Note also that the buffer sizes declared in i2lib.h are VERY SMALL. This
27// worsens performance considerably, but is done so that a great many channels
28// might use only a little memory.
29//------------------------------------------------------------------------------
30
31//------------------------------------------------------------------------------
32// Revision History:
33//
34// 0.00 - 4/16/91 --- First Draft
35// 0.01 - 4/29/91 --- 1st beta release
36// 0.02 - 6/14/91 --- Changes to allow small model compilation
37// 0.03 - 6/17/91 MAG Break reporting protected from interrupts routines with
38// in-line asm added for moving data to/from ring buffers,
39// replacing a variety of methods used previously.
40// 0.04 - 6/21/91 MAG Initial flow-control packets not queued until
41// i2_enable_interrupts time. Former versions would enqueue
42// them at i2_init_channel time, before we knew how many
43// channels were supposed to exist!
44// 0.05 - 10/12/91 MAG Major changes: works through the ellis.c routines now;
45// supports new 16-bit protocol and expandable boards.
46// - 10/24/91 MAG Most changes in place and stable.
47// 0.06 - 2/20/92 MAG Format of CMD_HOTACK corrected: the command takes no
48// argument.
49// 0.07 -- 3/11/92 MAG Support added to store special packet types at interrupt
50// level (mostly responses to specific commands.)
51// 0.08 -- 3/30/92 MAG Support added for STAT_MODEM packet
52// 0.09 -- 6/24/93 MAG i2Link... needed to update number of boards BEFORE
53// turning on the interrupt.
54// 0.10 -- 6/25/93 MAG To avoid gruesome death from a bad board, we sanity check
55// some incoming.
56//
57// 1.1 - 12/25/96 AKM Linux version.
58// - 10/09/98 DMC Revised Linux version.
59//------------------------------------------------------------------------------
60
61//************
62//* Includes *
63//************
64
65#include <linux/sched.h>
66#include "i2lib.h"
67
68
69//***********************
70//* Function Prototypes *
71//***********************
72static void i2QueueNeeds(i2eBordStrPtr, i2ChanStrPtr, int);
73static i2ChanStrPtr i2DeQueueNeeds(i2eBordStrPtr, int );
74static void i2StripFifo(i2eBordStrPtr);
75static void i2StuffFifoBypass(i2eBordStrPtr);
76static void i2StuffFifoFlow(i2eBordStrPtr);
77static void i2StuffFifoInline(i2eBordStrPtr);
78static int i2RetryFlushOutput(i2ChanStrPtr);
79
80// Not a documented part of the library routines (careful...) but the Diagnostic
81// i2diag.c finds them useful to help the throughput in certain limited
82// single-threaded operations.
83static void iiSendPendingMail(i2eBordStrPtr);
84static void serviceOutgoingFifo(i2eBordStrPtr);
85
86// Functions defined in ip2.c as part of interrupt handling
87static void do_input(void *);
88static void do_status(void *);
89
90//***************
91//* Debug Data *
92//***************
93#ifdef DEBUG_FIFO
94
95unsigned char DBGBuf[0x4000];
96unsigned short I = 0;
97
98static void
99WriteDBGBuf(char *s, unsigned char *src, unsigned short n )
100{
101 char *p = src;
102
103 // XXX: We need a spin lock here if we ever use this again
104
105 while (*s) { // copy label
106 DBGBuf[I] = *s++;
107 I = I++ & 0x3fff;
108 }
109 while (n--) { // copy data
110 DBGBuf[I] = *p++;
111 I = I++ & 0x3fff;
112 }
113}
114
115static void
116fatality(i2eBordStrPtr pB )
117{
118 int i;
119
120 for (i=0;i<sizeof(DBGBuf);i++) {
121 if ((i%16) == 0)
122 printk("\n%4x:",i);
123 printk("%02x ",DBGBuf[i]);
124 }
125 printk("\n");
126 for (i=0;i<sizeof(DBGBuf);i++) {
127 if ((i%16) == 0)
128 printk("\n%4x:",i);
129 if (DBGBuf[i] >= ' ' && DBGBuf[i] <= '~') {
130 printk(" %c ",DBGBuf[i]);
131 } else {
132 printk(" . ");
133 }
134 }
135 printk("\n");
136 printk("Last index %x\n",I);
137}
138#endif /* DEBUG_FIFO */
139
140//********
141//* Code *
142//********
143
144static inline int
145i2Validate ( i2ChanStrPtr pCh )
146{
147 //ip2trace(pCh->port_index, ITRC_VERIFY,ITRC_ENTER,2,pCh->validity,
148 // (CHANNEL_MAGIC | CHANNEL_SUPPORT));
149 return ((pCh->validity & (CHANNEL_MAGIC_BITS | CHANNEL_SUPPORT))
150 == (CHANNEL_MAGIC | CHANNEL_SUPPORT));
151}
152
153//******************************************************************************
154// Function: iiSendPendingMail(pB)
155// Parameters: Pointer to a board structure
156// Returns: Nothing
157//
158// Description:
159// If any outgoing mail bits are set and there is outgoing mailbox is empty,
160// send the mail and clear the bits.
161//******************************************************************************
162static inline void
163iiSendPendingMail(i2eBordStrPtr pB)
164{
165 if (pB->i2eOutMailWaiting && (!pB->i2eWaitingForEmptyFifo) )
166 {
167 if (iiTrySendMail(pB, pB->i2eOutMailWaiting))
168 {
169 /* If we were already waiting for fifo to empty,
170 * or just sent MB_OUT_STUFFED, then we are
171 * still waiting for it to empty, until we should
172 * receive an MB_IN_STRIPPED from the board.
173 */
174 pB->i2eWaitingForEmptyFifo |=
175 (pB->i2eOutMailWaiting & MB_OUT_STUFFED);
176 pB->i2eOutMailWaiting = 0;
177 pB->SendPendingRetry = 0;
178 } else {
179/* The only time we hit this area is when "iiTrySendMail" has
180 failed. That only occurs when the outbound mailbox is
181 still busy with the last message. We take a short breather
182 to let the board catch up with itself and then try again.
183 16 Retries is the limit - then we got a borked board.
184 /\/\|=mhw=|\/\/ */
185
186 if( ++pB->SendPendingRetry < 16 ) {
187
188 init_timer( &(pB->SendPendingTimer) );
189 pB->SendPendingTimer.expires = jiffies + 1;
190 pB->SendPendingTimer.function = (void*)(unsigned long)iiSendPendingMail;
191 pB->SendPendingTimer.data = (unsigned long)pB;
192 add_timer( &(pB->SendPendingTimer) );
193 } else {
194 printk( KERN_ERR "IP2: iiSendPendingMail unable to queue outbound mail\n" );
195 }
196 }
197 }
198}
199
200//******************************************************************************
201// Function: i2InitChannels(pB, nChannels, pCh)
202// Parameters: Pointer to Ellis Board structure
203// Number of channels to initialize
204// Pointer to first element in an array of channel structures
205// Returns: Success or failure
206//
207// Description:
208//
209// This function patches pointers, back-pointers, and initializes all the
210// elements in the channel structure array.
211//
212// This should be run after the board structure is initialized, through having
213// loaded the standard loadware (otherwise it complains).
214//
215// In any case, it must be done before any serious work begins initializing the
216// irq's or sending commands...
217//
218//******************************************************************************
219static int
220i2InitChannels ( i2eBordStrPtr pB, int nChannels, i2ChanStrPtr pCh)
221{
222 int index, stuffIndex;
223 i2ChanStrPtr *ppCh;
224
225 if (pB->i2eValid != I2E_MAGIC) {
226 COMPLETE(pB, I2EE_BADMAGIC);
227 }
228 if (pB->i2eState != II_STATE_STDLOADED) {
229 COMPLETE(pB, I2EE_BADSTATE);
230 }
231
232 LOCK_INIT(&pB->read_fifo_spinlock);
233 LOCK_INIT(&pB->write_fifo_spinlock);
234 LOCK_INIT(&pB->Dbuf_spinlock);
235 LOCK_INIT(&pB->Bbuf_spinlock);
236 LOCK_INIT(&pB->Fbuf_spinlock);
237
238 // NO LOCK needed yet - this is init
239
240 pB->i2eChannelPtr = pCh;
241 pB->i2eChannelCnt = nChannels;
242
243 pB->i2Fbuf_strip = pB->i2Fbuf_stuff = 0;
244 pB->i2Dbuf_strip = pB->i2Dbuf_stuff = 0;
245 pB->i2Bbuf_strip = pB->i2Bbuf_stuff = 0;
246
247 pB->SendPendingRetry = 0;
248
249 memset ( pCh, 0, sizeof (i2ChanStr) * nChannels );
250
251 for (index = stuffIndex = 0, ppCh = (i2ChanStrPtr *)(pB->i2Fbuf);
252 nChannels && index < ABS_MOST_PORTS;
253 index++)
254 {
255 if ( !(pB->i2eChannelMap[index >> 4] & (1 << (index & 0xf)) ) ) {
256 continue;
257 }
258 LOCK_INIT(&pCh->Ibuf_spinlock);
259 LOCK_INIT(&pCh->Obuf_spinlock);
260 LOCK_INIT(&pCh->Cbuf_spinlock);
261 LOCK_INIT(&pCh->Pbuf_spinlock);
262 // NO LOCK needed yet - this is init
263 // Set up validity flag according to support level
264 if (pB->i2eGoodMap[index >> 4] & (1 << (index & 0xf)) ) {
265 pCh->validity = CHANNEL_MAGIC | CHANNEL_SUPPORT;
266 } else {
267 pCh->validity = CHANNEL_MAGIC;
268 }
269 pCh->pMyBord = pB; /* Back-pointer */
270
271 // Prepare an outgoing flow-control packet to send as soon as the chance
272 // occurs.
273 if ( pCh->validity & CHANNEL_SUPPORT ) {
274 pCh->infl.hd.i2sChannel = index;
275 pCh->infl.hd.i2sCount = 5;
276 pCh->infl.hd.i2sType = PTYPE_BYPASS;
277 pCh->infl.fcmd = 37;
278 pCh->infl.asof = 0;
279 pCh->infl.room = IBUF_SIZE - 1;
280
281 pCh->whenSendFlow = (IBUF_SIZE/5)*4; // when 80% full
282
283 // The following is similar to calling i2QueueNeeds, except that this
284 // is done in longhand, since we are setting up initial conditions on
285 // many channels at once.
286 pCh->channelNeeds = NEED_FLOW; // Since starting from scratch
287 pCh->sinceLastFlow = 0; // No bytes received since last flow
288 // control packet was queued
289 stuffIndex++;
290 *ppCh++ = pCh; // List this channel as needing
291 // initial flow control packet sent
292 }
293
294 // Don't allow anything to be sent until the status packets come in from
295 // the board.
296
297 pCh->outfl.asof = 0;
298 pCh->outfl.room = 0;
299
300 // Initialize all the ring buffers
301
302 pCh->Ibuf_stuff = pCh->Ibuf_strip = 0;
303 pCh->Obuf_stuff = pCh->Obuf_strip = 0;
304 pCh->Cbuf_stuff = pCh->Cbuf_strip = 0;
305
306 memset( &pCh->icount, 0, sizeof (struct async_icount) );
307 pCh->hotKeyIn = HOT_CLEAR;
308 pCh->channelOptions = 0;
309 pCh->bookMarks = 0;
310 init_waitqueue_head(&pCh->pBookmarkWait);
311
312 init_waitqueue_head(&pCh->open_wait);
313 init_waitqueue_head(&pCh->close_wait);
314 init_waitqueue_head(&pCh->delta_msr_wait);
315
316 // Set base and divisor so default custom rate is 9600
317 pCh->BaudBase = 921600; // MAX for ST654, changed after we get
318 pCh->BaudDivisor = 96; // the boxids (UART types) later
319
320 pCh->dataSetIn = 0;
321 pCh->dataSetOut = 0;
322
323 pCh->wopen = 0;
324 pCh->throttled = 0;
325
326 pCh->speed = CBR_9600;
327
328 pCh->flags = 0;
329
330 pCh->ClosingDelay = 5*HZ/10;
331 pCh->ClosingWaitTime = 30*HZ;
332
333 // Initialize task queue objects
334 INIT_WORK(&pCh->tqueue_input, do_input, pCh);
335 INIT_WORK(&pCh->tqueue_status, do_status, pCh);
336
337#ifdef IP2DEBUG_TRACE
338 pCh->trace = ip2trace;
339#endif
340
341 ++pCh;
342 --nChannels;
343 }
344 // No need to check for wrap here; this is initialization.
345 pB->i2Fbuf_stuff = stuffIndex;
346 COMPLETE(pB, I2EE_GOOD);
347
348}
349
350//******************************************************************************
351// Function: i2DeQueueNeeds(pB, type)
352// Parameters: Pointer to a board structure
353// type bit map: may include NEED_INLINE, NEED_BYPASS, or NEED_FLOW
354// Returns:
355// Pointer to a channel structure
356//
357// Description: Returns pointer struct of next channel that needs service of
358// the type specified. Otherwise returns a NULL reference.
359//
360//******************************************************************************
361static i2ChanStrPtr
362i2DeQueueNeeds(i2eBordStrPtr pB, int type)
363{
364 unsigned short queueIndex;
365 unsigned long flags;
366
367 i2ChanStrPtr pCh = NULL;
368
369 switch(type) {
370
371 case NEED_INLINE:
372
373 WRITE_LOCK_IRQSAVE(&pB->Dbuf_spinlock,flags);
374 if ( pB->i2Dbuf_stuff != pB->i2Dbuf_strip)
375 {
376 queueIndex = pB->i2Dbuf_strip;
377 pCh = pB->i2Dbuf[queueIndex];
378 queueIndex++;
379 if (queueIndex >= CH_QUEUE_SIZE) {
380 queueIndex = 0;
381 }
382 pB->i2Dbuf_strip = queueIndex;
383 pCh->channelNeeds &= ~NEED_INLINE;
384 }
385 WRITE_UNLOCK_IRQRESTORE(&pB->Dbuf_spinlock,flags);
386 break;
387
388 case NEED_BYPASS:
389
390 WRITE_LOCK_IRQSAVE(&pB->Bbuf_spinlock,flags);
391 if (pB->i2Bbuf_stuff != pB->i2Bbuf_strip)
392 {
393 queueIndex = pB->i2Bbuf_strip;
394 pCh = pB->i2Bbuf[queueIndex];
395 queueIndex++;
396 if (queueIndex >= CH_QUEUE_SIZE) {
397 queueIndex = 0;
398 }
399 pB->i2Bbuf_strip = queueIndex;
400 pCh->channelNeeds &= ~NEED_BYPASS;
401 }
402 WRITE_UNLOCK_IRQRESTORE(&pB->Bbuf_spinlock,flags);
403 break;
404
405 case NEED_FLOW:
406
407 WRITE_LOCK_IRQSAVE(&pB->Fbuf_spinlock,flags);
408 if (pB->i2Fbuf_stuff != pB->i2Fbuf_strip)
409 {
410 queueIndex = pB->i2Fbuf_strip;
411 pCh = pB->i2Fbuf[queueIndex];
412 queueIndex++;
413 if (queueIndex >= CH_QUEUE_SIZE) {
414 queueIndex = 0;
415 }
416 pB->i2Fbuf_strip = queueIndex;
417 pCh->channelNeeds &= ~NEED_FLOW;
418 }
419 WRITE_UNLOCK_IRQRESTORE(&pB->Fbuf_spinlock,flags);
420 break;
421 default:
422 printk(KERN_ERR "i2DeQueueNeeds called with bad type:%x\n",type);
423 break;
424 }
425 return pCh;
426}
427
428//******************************************************************************
429// Function: i2QueueNeeds(pB, pCh, type)
430// Parameters: Pointer to a board structure
431// Pointer to a channel structure
432// type bit map: may include NEED_INLINE, NEED_BYPASS, or NEED_FLOW
433// Returns: Nothing
434//
435// Description:
436// For each type of need selected, if the given channel is not already in the
437// queue, adds it, and sets the flag indicating it is in the queue.
438//******************************************************************************
439static void
440i2QueueNeeds(i2eBordStrPtr pB, i2ChanStrPtr pCh, int type)
441{
442 unsigned short queueIndex;
443 unsigned long flags;
444
445 // We turn off all the interrupts during this brief process, since the
446 // interrupt-level code might want to put things on the queue as well.
447
448 switch (type) {
449
450 case NEED_INLINE:
451
452 WRITE_LOCK_IRQSAVE(&pB->Dbuf_spinlock,flags);
453 if ( !(pCh->channelNeeds & NEED_INLINE) )
454 {
455 pCh->channelNeeds |= NEED_INLINE;
456 queueIndex = pB->i2Dbuf_stuff;
457 pB->i2Dbuf[queueIndex++] = pCh;
458 if (queueIndex >= CH_QUEUE_SIZE)
459 queueIndex = 0;
460 pB->i2Dbuf_stuff = queueIndex;
461 }
462 WRITE_UNLOCK_IRQRESTORE(&pB->Dbuf_spinlock,flags);
463 break;
464
465 case NEED_BYPASS:
466
467 WRITE_LOCK_IRQSAVE(&pB->Bbuf_spinlock,flags);
468 if ((type & NEED_BYPASS) && !(pCh->channelNeeds & NEED_BYPASS))
469 {
470 pCh->channelNeeds |= NEED_BYPASS;
471 queueIndex = pB->i2Bbuf_stuff;
472 pB->i2Bbuf[queueIndex++] = pCh;
473 if (queueIndex >= CH_QUEUE_SIZE)
474 queueIndex = 0;
475 pB->i2Bbuf_stuff = queueIndex;
476 }
477 WRITE_UNLOCK_IRQRESTORE(&pB->Bbuf_spinlock,flags);
478 break;
479
480 case NEED_FLOW:
481
482 WRITE_LOCK_IRQSAVE(&pB->Fbuf_spinlock,flags);
483 if ((type & NEED_FLOW) && !(pCh->channelNeeds & NEED_FLOW))
484 {
485 pCh->channelNeeds |= NEED_FLOW;
486 queueIndex = pB->i2Fbuf_stuff;
487 pB->i2Fbuf[queueIndex++] = pCh;
488 if (queueIndex >= CH_QUEUE_SIZE)
489 queueIndex = 0;
490 pB->i2Fbuf_stuff = queueIndex;
491 }
492 WRITE_UNLOCK_IRQRESTORE(&pB->Fbuf_spinlock,flags);
493 break;
494
495 case NEED_CREDIT:
496 pCh->channelNeeds |= NEED_CREDIT;
497 break;
498 default:
499 printk(KERN_ERR "i2QueueNeeds called with bad type:%x\n",type);
500 break;
501 }
502 return;
503}
504
505//******************************************************************************
506// Function: i2QueueCommands(type, pCh, timeout, nCommands, pCs,...)
507// Parameters: type - PTYPE_BYPASS or PTYPE_INLINE
508// pointer to the channel structure
509// maximum period to wait
510// number of commands (n)
511// n commands
512// Returns: Number of commands sent, or -1 for error
513//
514// get board lock before calling
515//
516// Description:
517// Queues up some commands to be sent to a channel. To send possibly several
518// bypass or inline commands to the given channel. The timeout parameter
519// indicates how many HUNDREDTHS OF SECONDS to wait until there is room:
520// 0 = return immediately if no room, -ive = wait forever, +ive = number of
521// 1/100 seconds to wait. Return values:
522// -1 Some kind of nasty error: bad channel structure or invalid arguments.
523// 0 No room to send all the commands
524// (+) Number of commands sent
525//******************************************************************************
526static int
527i2QueueCommands(int type, i2ChanStrPtr pCh, int timeout, int nCommands,
528 cmdSyntaxPtr pCs0,...)
529{
530 int totalsize = 0;
531 int blocksize;
532 int lastended;
533 cmdSyntaxPtr *ppCs;
534 cmdSyntaxPtr pCs;
535 int count;
536 int flag;
537 i2eBordStrPtr pB;
538
539 unsigned short maxBlock;
540 unsigned short maxBuff;
541 short bufroom;
542 unsigned short stuffIndex;
543 unsigned char *pBuf;
544 unsigned char *pInsert;
545 unsigned char *pDest, *pSource;
546 unsigned short channel;
547 int cnt;
548 unsigned long flags = 0;
549 rwlock_t *lock_var_p = NULL;
550
551 // Make sure the channel exists, otherwise do nothing
552 if ( !i2Validate ( pCh ) ) {
553 return -1;
554 }
555
556 ip2trace (CHANN, ITRC_QUEUE, ITRC_ENTER, 0 );
557
558 pB = pCh->pMyBord;
559
560 // Board must also exist, and THE INTERRUPT COMMAND ALREADY SENT
561 if (pB->i2eValid != I2E_MAGIC || pB->i2eUsingIrq == IRQ_UNDEFINED) {
562 return -2;
563 }
564 // If the board has gone fatal, return bad, and also hit the trap routine if
565 // it exists.
566 if (pB->i2eFatal) {
567 if ( pB->i2eFatalTrap ) {
568 (*(pB)->i2eFatalTrap)(pB);
569 }
570 return -3;
571 }
572 // Set up some variables, Which buffers are we using? How big are they?
573 switch(type)
574 {
575 case PTYPE_INLINE:
576 flag = INL;
577 maxBlock = MAX_OBUF_BLOCK;
578 maxBuff = OBUF_SIZE;
579 pBuf = pCh->Obuf;
580 break;
581 case PTYPE_BYPASS:
582 flag = BYP;
583 maxBlock = MAX_CBUF_BLOCK;
584 maxBuff = CBUF_SIZE;
585 pBuf = pCh->Cbuf;
586 break;
587 default:
588 return -4;
589 }
590 // Determine the total size required for all the commands
591 totalsize = blocksize = sizeof(i2CmdHeader);
592 lastended = 0;
593 ppCs = &pCs0;
594 for ( count = nCommands; count; count--, ppCs++)
595 {
596 pCs = *ppCs;
597 cnt = pCs->length;
598 // Will a new block be needed for this one?
599 // Two possible reasons: too
600 // big or previous command has to be at the end of a packet.
601 if ((blocksize + cnt > maxBlock) || lastended) {
602 blocksize = sizeof(i2CmdHeader);
603 totalsize += sizeof(i2CmdHeader);
604 }
605 totalsize += cnt;
606 blocksize += cnt;
607
608 // If this command had to end a block, then we will make sure to
609 // account for it should there be any more blocks.
610 lastended = pCs->flags & END;
611 }
612 for (;;) {
613 // Make sure any pending flush commands go out before we add more data.
614 if ( !( pCh->flush_flags && i2RetryFlushOutput( pCh ) ) ) {
615 // How much room (this time through) ?
616 switch(type) {
617 case PTYPE_INLINE:
618 lock_var_p = &pCh->Obuf_spinlock;
619 WRITE_LOCK_IRQSAVE(lock_var_p,flags);
620 stuffIndex = pCh->Obuf_stuff;
621 bufroom = pCh->Obuf_strip - stuffIndex;
622 break;
623 case PTYPE_BYPASS:
624 lock_var_p = &pCh->Cbuf_spinlock;
625 WRITE_LOCK_IRQSAVE(lock_var_p,flags);
626 stuffIndex = pCh->Cbuf_stuff;
627 bufroom = pCh->Cbuf_strip - stuffIndex;
628 break;
629 default:
630 return -5;
631 }
632 if (--bufroom < 0) {
633 bufroom += maxBuff;
634 }
635
636 ip2trace (CHANN, ITRC_QUEUE, 2, 1, bufroom );
637
638 // Check for overflow
639 if (totalsize <= bufroom) {
640 // Normal Expected path - We still hold LOCK
641 break; /* from for()- Enough room: goto proceed */
642 }
643 }
644
645 ip2trace (CHANN, ITRC_QUEUE, 3, 1, totalsize );
646
647 // Prepare to wait for buffers to empty
648 WRITE_UNLOCK_IRQRESTORE(lock_var_p,flags);
649 serviceOutgoingFifo(pB); // Dump what we got
650
651 if (timeout == 0) {
652 return 0; // Tired of waiting
653 }
654 if (timeout > 0)
655 timeout--; // So negative values == forever
656
657 if (!in_interrupt()) {
658 current->state = TASK_INTERRUPTIBLE;
659 schedule_timeout(1); // short nap
660 } else {
661 // we cannot sched/sleep in interrrupt silly
662 return 0;
663 }
664 if (signal_pending(current)) {
665 return 0; // Wake up! Time to die!!!
666 }
667
668 ip2trace (CHANN, ITRC_QUEUE, 4, 0 );
669
670 } // end of for(;;)
671
672 // At this point we have room and the lock - stick them in.
673 channel = pCh->infl.hd.i2sChannel;
674 pInsert = &pBuf[stuffIndex]; // Pointer to start of packet
675 pDest = CMD_OF(pInsert); // Pointer to start of command
676
677 // When we start counting, the block is the size of the header
678 for (blocksize = sizeof(i2CmdHeader), count = nCommands,
679 lastended = 0, ppCs = &pCs0;
680 count;
681 count--, ppCs++)
682 {
683 pCs = *ppCs; // Points to command protocol structure
684
685 // If this is a bookmark request command, post the fact that a bookmark
686 // request is pending. NOTE THIS TRICK ONLY WORKS BECAUSE CMD_BMARK_REQ
687 // has no parameters! The more general solution would be to reference
688 // pCs->cmd[0].
689 if (pCs == CMD_BMARK_REQ) {
690 pCh->bookMarks++;
691
692 ip2trace (CHANN, ITRC_DRAIN, 30, 1, pCh->bookMarks );
693
694 }
695 cnt = pCs->length;
696
697 // If this command would put us over the maximum block size or
698 // if the last command had to be at the end of a block, we end
699 // the existing block here and start a new one.
700 if ((blocksize + cnt > maxBlock) || lastended) {
701
702 ip2trace (CHANN, ITRC_QUEUE, 5, 0 );
703
704 PTYPE_OF(pInsert) = type;
705 CHANNEL_OF(pInsert) = channel;
706 // count here does not include the header
707 CMD_COUNT_OF(pInsert) = blocksize - sizeof(i2CmdHeader);
708 stuffIndex += blocksize;
709 if(stuffIndex >= maxBuff) {
710 stuffIndex = 0;
711 pInsert = pBuf;
712 }
713 pInsert = &pBuf[stuffIndex]; // Pointer to start of next pkt
714 pDest = CMD_OF(pInsert);
715 blocksize = sizeof(i2CmdHeader);
716 }
717 // Now we know there is room for this one in the current block
718
719 blocksize += cnt; // Total bytes in this command
720 pSource = pCs->cmd; // Copy the command into the buffer
721 while (cnt--) {
722 *pDest++ = *pSource++;
723 }
724 // If this command had to end a block, then we will make sure to account
725 // for it should there be any more blocks.
726 lastended = pCs->flags & END;
727 } // end for
728 // Clean up the final block by writing header, etc
729
730 PTYPE_OF(pInsert) = type;
731 CHANNEL_OF(pInsert) = channel;
732 // count here does not include the header
733 CMD_COUNT_OF(pInsert) = blocksize - sizeof(i2CmdHeader);
734 stuffIndex += blocksize;
735 if(stuffIndex >= maxBuff) {
736 stuffIndex = 0;
737 pInsert = pBuf;
738 }
739 // Updates the index, and post the need for service. When adding these to
740 // the queue of channels, we turn off the interrupt while doing so,
741 // because at interrupt level we might want to push a channel back to the
742 // end of the queue.
743 switch(type)
744 {
745 case PTYPE_INLINE:
746 pCh->Obuf_stuff = stuffIndex; // Store buffer pointer
747 WRITE_UNLOCK_IRQRESTORE(&pCh->Obuf_spinlock,flags);
748
749 pB->debugInlineQueued++;
750 // Add the channel pointer to list of channels needing service (first
751 // come...), if it's not already there.
752 i2QueueNeeds(pB, pCh, NEED_INLINE);
753 break;
754
755 case PTYPE_BYPASS:
756 pCh->Cbuf_stuff = stuffIndex; // Store buffer pointer
757 WRITE_UNLOCK_IRQRESTORE(&pCh->Cbuf_spinlock,flags);
758
759 pB->debugBypassQueued++;
760 // Add the channel pointer to list of channels needing service (first
761 // come...), if it's not already there.
762 i2QueueNeeds(pB, pCh, NEED_BYPASS);
763 break;
764 }
765
766 ip2trace (CHANN, ITRC_QUEUE, ITRC_RETURN, 1, nCommands );
767
768 return nCommands; // Good status: number of commands sent
769}
770
771//******************************************************************************
772// Function: i2GetStatus(pCh,resetBits)
773// Parameters: Pointer to a channel structure
774// Bit map of status bits to clear
775// Returns: Bit map of current status bits
776//
777// Description:
778// Returns the state of data set signals, and whether a break has been received,
779// (see i2lib.h for bit-mapped result). resetBits is a bit-map of any status
780// bits to be cleared: I2_BRK, I2_PAR, I2_FRA, I2_OVR,... These are cleared
781// AFTER the condition is passed. If pCh does not point to a valid channel,
782// returns -1 (which would be impossible otherwise.
783//******************************************************************************
784static int
785i2GetStatus(i2ChanStrPtr pCh, int resetBits)
786{
787 unsigned short status;
788 i2eBordStrPtr pB;
789
790 ip2trace (CHANN, ITRC_STATUS, ITRC_ENTER, 2, pCh->dataSetIn, resetBits );
791
792 // Make sure the channel exists, otherwise do nothing */
793 if ( !i2Validate ( pCh ) )
794 return -1;
795
796 pB = pCh->pMyBord;
797
798 status = pCh->dataSetIn;
799
800 // Clear any specified error bits: but note that only actual error bits can
801 // be cleared, regardless of the value passed.
802 if (resetBits)
803 {
804 pCh->dataSetIn &= ~(resetBits & (I2_BRK | I2_PAR | I2_FRA | I2_OVR));
805 pCh->dataSetIn &= ~(I2_DDCD | I2_DCTS | I2_DDSR | I2_DRI);
806 }
807
808 ip2trace (CHANN, ITRC_STATUS, ITRC_RETURN, 1, pCh->dataSetIn );
809
810 return status;
811}
812
813//******************************************************************************
814// Function: i2Input(pChpDest,count)
815// Parameters: Pointer to a channel structure
816// Pointer to data buffer
817// Number of bytes to read
818// Returns: Number of bytes read, or -1 for error
819//
820// Description:
821// Strips data from the input buffer and writes it to pDest. If there is a
822// collosal blunder, (invalid structure pointers or the like), returns -1.
823// Otherwise, returns the number of bytes read.
824//******************************************************************************
825static int
826i2Input(i2ChanStrPtr pCh)
827{
828 int amountToMove;
829 unsigned short stripIndex;
830 int count;
831 unsigned long flags = 0;
832
833 ip2trace (CHANN, ITRC_INPUT, ITRC_ENTER, 0);
834
835 // Ensure channel structure seems real
836 if ( !i2Validate( pCh ) ) {
837 count = -1;
838 goto i2Input_exit;
839 }
840 WRITE_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,flags);
841
842 // initialize some accelerators and private copies
843 stripIndex = pCh->Ibuf_strip;
844
845 count = pCh->Ibuf_stuff - stripIndex;
846
847 // If buffer is empty or requested data count was 0, (trivial case) return
848 // without any further thought.
849 if ( count == 0 ) {
850 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
851 goto i2Input_exit;
852 }
853 // Adjust for buffer wrap
854 if ( count < 0 ) {
855 count += IBUF_SIZE;
856 }
857 // Don't give more than can be taken by the line discipline
858 amountToMove = pCh->pTTY->ldisc.receive_room( pCh->pTTY );
859 if (count > amountToMove) {
860 count = amountToMove;
861 }
862 // How much could we copy without a wrap?
863 amountToMove = IBUF_SIZE - stripIndex;
864
865 if (amountToMove > count) {
866 amountToMove = count;
867 }
868 // Move the first block
869 pCh->pTTY->ldisc.receive_buf( pCh->pTTY,
870 &(pCh->Ibuf[stripIndex]), NULL, amountToMove );
871 // If we needed to wrap, do the second data move
872 if (count > amountToMove) {
873 pCh->pTTY->ldisc.receive_buf( pCh->pTTY,
874 pCh->Ibuf, NULL, count - amountToMove );
875 }
876 // Bump and wrap the stripIndex all at once by the amount of data read. This
877 // method is good regardless of whether the data was in one or two pieces.
878 stripIndex += count;
879 if (stripIndex >= IBUF_SIZE) {
880 stripIndex -= IBUF_SIZE;
881 }
882 pCh->Ibuf_strip = stripIndex;
883
884 // Update our flow control information and possibly queue ourselves to send
885 // it, depending on how much data has been stripped since the last time a
886 // packet was sent.
887 pCh->infl.asof += count;
888
889 if ((pCh->sinceLastFlow += count) >= pCh->whenSendFlow) {
890 pCh->sinceLastFlow -= pCh->whenSendFlow;
891 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
892 i2QueueNeeds(pCh->pMyBord, pCh, NEED_FLOW);
893 } else {
894 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
895 }
896
897i2Input_exit:
898
899 ip2trace (CHANN, ITRC_INPUT, ITRC_RETURN, 1, count);
900
901 return count;
902}
903
904//******************************************************************************
905// Function: i2InputFlush(pCh)
906// Parameters: Pointer to a channel structure
907// Returns: Number of bytes stripped, or -1 for error
908//
909// Description:
910// Strips any data from the input buffer. If there is a collosal blunder,
911// (invalid structure pointers or the like), returns -1. Otherwise, returns the
912// number of bytes stripped.
913//******************************************************************************
914static int
915i2InputFlush(i2ChanStrPtr pCh)
916{
917 int count;
918 unsigned long flags;
919
920 // Ensure channel structure seems real
921 if ( !i2Validate ( pCh ) )
922 return -1;
923
924 ip2trace (CHANN, ITRC_INPUT, 10, 0);
925
926 WRITE_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,flags);
927 count = pCh->Ibuf_stuff - pCh->Ibuf_strip;
928
929 // Adjust for buffer wrap
930 if (count < 0) {
931 count += IBUF_SIZE;
932 }
933
934 // Expedient way to zero out the buffer
935 pCh->Ibuf_strip = pCh->Ibuf_stuff;
936
937
938 // Update our flow control information and possibly queue ourselves to send
939 // it, depending on how much data has been stripped since the last time a
940 // packet was sent.
941
942 pCh->infl.asof += count;
943
944 if ( (pCh->sinceLastFlow += count) >= pCh->whenSendFlow )
945 {
946 pCh->sinceLastFlow -= pCh->whenSendFlow;
947 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
948 i2QueueNeeds(pCh->pMyBord, pCh, NEED_FLOW);
949 } else {
950 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
951 }
952
953 ip2trace (CHANN, ITRC_INPUT, 19, 1, count);
954
955 return count;
956}
957
958//******************************************************************************
959// Function: i2InputAvailable(pCh)
960// Parameters: Pointer to a channel structure
961// Returns: Number of bytes available, or -1 for error
962//
963// Description:
964// If there is a collosal blunder, (invalid structure pointers or the like),
965// returns -1. Otherwise, returns the number of bytes stripped. Otherwise,
966// returns the number of bytes available in the buffer.
967//******************************************************************************
968#if 0
969static int
970i2InputAvailable(i2ChanStrPtr pCh)
971{
972 int count;
973
974 // Ensure channel structure seems real
975 if ( !i2Validate ( pCh ) ) return -1;
976
977
978 // initialize some accelerators and private copies
979 READ_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,flags);
980 count = pCh->Ibuf_stuff - pCh->Ibuf_strip;
981 READ_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,flags);
982
983 // Adjust for buffer wrap
984 if (count < 0)
985 {
986 count += IBUF_SIZE;
987 }
988
989 return count;
990}
991#endif
992
993//******************************************************************************
994// Function: i2Output(pCh, pSource, count)
995// Parameters: Pointer to channel structure
996// Pointer to source data
997// Number of bytes to send
998// Returns: Number of bytes sent, or -1 for error
999//
1000// Description:
1001// Queues the data at pSource to be sent as data packets to the board. If there
1002// is a collosal blunder, (invalid structure pointers or the like), returns -1.
1003// Otherwise, returns the number of bytes written. What if there is not enough
1004// room for all the data? If pCh->channelOptions & CO_NBLOCK_WRITE is set, then
1005// we transfer as many characters as we can now, then return. If this bit is
1006// clear (default), routine will spin along until all the data is buffered.
1007// Should this occur, the 1-ms delay routine is called while waiting to avoid
1008// applications that one cannot break out of.
1009//******************************************************************************
1010static int
1011i2Output(i2ChanStrPtr pCh, const char *pSource, int count, int user )
1012{
1013 i2eBordStrPtr pB;
1014 unsigned char *pInsert;
1015 int amountToMove;
1016 int countOriginal = count;
1017 unsigned short channel;
1018 unsigned short stuffIndex;
1019 unsigned long flags;
1020 int rc = 0;
1021
1022 int bailout = 10;
1023
1024 ip2trace (CHANN, ITRC_OUTPUT, ITRC_ENTER, 2, count, user );
1025
1026 // Ensure channel structure seems real
1027 if ( !i2Validate ( pCh ) )
1028 return -1;
1029
1030 // initialize some accelerators and private copies
1031 pB = pCh->pMyBord;
1032 channel = pCh->infl.hd.i2sChannel;
1033
1034 // If the board has gone fatal, return bad, and also hit the trap routine if
1035 // it exists.
1036 if (pB->i2eFatal) {
1037 if (pB->i2eFatalTrap) {
1038 (*(pB)->i2eFatalTrap)(pB);
1039 }
1040 return -1;
1041 }
1042 // Proceed as though we would do everything
1043 while ( count > 0 ) {
1044
1045 // How much room in output buffer is there?
1046 READ_LOCK_IRQSAVE(&pCh->Obuf_spinlock,flags);
1047 amountToMove = pCh->Obuf_strip - pCh->Obuf_stuff - 1;
1048 READ_UNLOCK_IRQRESTORE(&pCh->Obuf_spinlock,flags);
1049 if (amountToMove < 0) {
1050 amountToMove += OBUF_SIZE;
1051 }
1052 // Subtract off the headers size and see how much room there is for real
1053 // data. If this is negative, we will discover later.
1054 amountToMove -= sizeof (i2DataHeader);
1055
1056 // Don't move more (now) than can go in a single packet
1057 if ( amountToMove > (int)(MAX_OBUF_BLOCK - sizeof(i2DataHeader)) ) {
1058 amountToMove = MAX_OBUF_BLOCK - sizeof(i2DataHeader);
1059 }
1060 // Don't move more than the count we were given
1061 if (amountToMove > count) {
1062 amountToMove = count;
1063 }
1064 // Now we know how much we must move: NB because the ring buffers have
1065 // an overflow area at the end, we needn't worry about wrapping in the
1066 // middle of a packet.
1067
1068// Small WINDOW here with no LOCK but I can't call Flush with LOCK
1069// We would be flushing (or ending flush) anyway
1070
1071 ip2trace (CHANN, ITRC_OUTPUT, 10, 1, amountToMove );
1072
1073 if ( !(pCh->flush_flags && i2RetryFlushOutput(pCh) )
1074 && amountToMove > 0 )
1075 {
1076 WRITE_LOCK_IRQSAVE(&pCh->Obuf_spinlock,flags);
1077 stuffIndex = pCh->Obuf_stuff;
1078
1079 // Had room to move some data: don't know whether the block size,
1080 // buffer space, or what was the limiting factor...
1081 pInsert = &(pCh->Obuf[stuffIndex]);
1082
1083 // Set up the header
1084 CHANNEL_OF(pInsert) = channel;
1085 PTYPE_OF(pInsert) = PTYPE_DATA;
1086 TAG_OF(pInsert) = 0;
1087 ID_OF(pInsert) = ID_ORDINARY_DATA;
1088 DATA_COUNT_OF(pInsert) = amountToMove;
1089
1090 // Move the data
1091 if ( user ) {
1092 rc = copy_from_user((char*)(DATA_OF(pInsert)), pSource,
1093 amountToMove );
1094 } else {
1095 memcpy( (char*)(DATA_OF(pInsert)), pSource, amountToMove );
1096 }
1097 // Adjust pointers and indices
1098 pSource += amountToMove;
1099 pCh->Obuf_char_count += amountToMove;
1100 stuffIndex += amountToMove + sizeof(i2DataHeader);
1101 count -= amountToMove;
1102
1103 if (stuffIndex >= OBUF_SIZE) {
1104 stuffIndex = 0;
1105 }
1106 pCh->Obuf_stuff = stuffIndex;
1107
1108 WRITE_UNLOCK_IRQRESTORE(&pCh->Obuf_spinlock,flags);
1109
1110 ip2trace (CHANN, ITRC_OUTPUT, 13, 1, stuffIndex );
1111
1112 } else {
1113
1114 // Cannot move data
1115 // becuz we need to stuff a flush
1116 // or amount to move is <= 0
1117
1118 ip2trace(CHANN, ITRC_OUTPUT, 14, 3,
1119 amountToMove, pB->i2eFifoRemains,
1120 pB->i2eWaitingForEmptyFifo );
1121
1122 // Put this channel back on queue
1123 // this ultimatly gets more data or wakes write output
1124 i2QueueNeeds(pB, pCh, NEED_INLINE);
1125
1126 if ( pB->i2eWaitingForEmptyFifo ) {
1127
1128 ip2trace (CHANN, ITRC_OUTPUT, 16, 0 );
1129
1130 // or schedule
1131 if (!in_interrupt()) {
1132
1133 ip2trace (CHANN, ITRC_OUTPUT, 61, 0 );
1134
1135 current->state = TASK_INTERRUPTIBLE;
1136 schedule_timeout(2);
1137 if (signal_pending(current)) {
1138 break;
1139 }
1140 continue;
1141 } else {
1142
1143 ip2trace (CHANN, ITRC_OUTPUT, 62, 0 );
1144
1145 // let interrupt in = WAS restore_flags()
1146 // We hold no lock nor is irq off anymore???
1147
1148 break;
1149 }
1150 break; // from while(count)
1151 }
1152 else if ( pB->i2eFifoRemains < 32 && !pB->i2eTxMailEmpty ( pB ) )
1153 {
1154 ip2trace (CHANN, ITRC_OUTPUT, 19, 2,
1155 pB->i2eFifoRemains,
1156 pB->i2eTxMailEmpty );
1157
1158 break; // from while(count)
1159 } else if ( pCh->channelNeeds & NEED_CREDIT ) {
1160
1161 ip2trace (CHANN, ITRC_OUTPUT, 22, 0 );
1162
1163 break; // from while(count)
1164 } else if ( --bailout) {
1165
1166 // Try to throw more things (maybe not us) in the fifo if we're
1167 // not already waiting for it.
1168
1169 ip2trace (CHANN, ITRC_OUTPUT, 20, 0 );
1170
1171 serviceOutgoingFifo(pB);
1172 //break; CONTINUE;
1173 } else {
1174 ip2trace (CHANN, ITRC_OUTPUT, 21, 3,
1175 pB->i2eFifoRemains,
1176 pB->i2eOutMailWaiting,
1177 pB->i2eWaitingForEmptyFifo );
1178
1179 break; // from while(count)
1180 }
1181 }
1182 } // End of while(count)
1183
1184 i2QueueNeeds(pB, pCh, NEED_INLINE);
1185
1186 // We drop through either when the count expires, or when there is some
1187 // count left, but there was a non-blocking write.
1188 if (countOriginal > count) {
1189
1190 ip2trace (CHANN, ITRC_OUTPUT, 17, 2, countOriginal, count );
1191
1192 serviceOutgoingFifo( pB );
1193 }
1194
1195 ip2trace (CHANN, ITRC_OUTPUT, ITRC_RETURN, 2, countOriginal, count );
1196
1197 return countOriginal - count;
1198}
1199
1200//******************************************************************************
1201// Function: i2FlushOutput(pCh)
1202// Parameters: Pointer to a channel structure
1203// Returns: Nothing
1204//
1205// Description:
1206// Sends bypass command to start flushing (waiting possibly forever until there
1207// is room), then sends inline command to stop flushing output, (again waiting
1208// possibly forever).
1209//******************************************************************************
1210static inline void
1211i2FlushOutput(i2ChanStrPtr pCh)
1212{
1213
1214 ip2trace (CHANN, ITRC_FLUSH, 1, 1, pCh->flush_flags );
1215
1216 if (pCh->flush_flags)
1217 return;
1218
1219 if ( 1 != i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_STARTFL) ) {
1220 pCh->flush_flags = STARTFL_FLAG; // Failed - flag for later
1221
1222 ip2trace (CHANN, ITRC_FLUSH, 2, 0 );
1223
1224 } else if ( 1 != i2QueueCommands(PTYPE_INLINE, pCh, 0, 1, CMD_STOPFL) ) {
1225 pCh->flush_flags = STOPFL_FLAG; // Failed - flag for later
1226
1227 ip2trace (CHANN, ITRC_FLUSH, 3, 0 );
1228 }
1229}
1230
1231static int
1232i2RetryFlushOutput(i2ChanStrPtr pCh)
1233{
1234 int old_flags = pCh->flush_flags;
1235
1236 ip2trace (CHANN, ITRC_FLUSH, 14, 1, old_flags );
1237
1238 pCh->flush_flags = 0; // Clear flag so we can avoid recursion
1239 // and queue the commands
1240
1241 if ( old_flags & STARTFL_FLAG ) {
1242 if ( 1 == i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_STARTFL) ) {
1243 old_flags = STOPFL_FLAG; //Success - send stop flush
1244 } else {
1245 old_flags = STARTFL_FLAG; //Failure - Flag for retry later
1246 }
1247
1248 ip2trace (CHANN, ITRC_FLUSH, 15, 1, old_flags );
1249
1250 }
1251 if ( old_flags & STOPFL_FLAG ) {
1252 if (1 == i2QueueCommands(PTYPE_INLINE, pCh, 0, 1, CMD_STOPFL)) {
1253 old_flags = 0; // Success - clear flags
1254 }
1255
1256 ip2trace (CHANN, ITRC_FLUSH, 16, 1, old_flags );
1257 }
1258 pCh->flush_flags = old_flags;
1259
1260 ip2trace (CHANN, ITRC_FLUSH, 17, 1, old_flags );
1261
1262 return old_flags;
1263}
1264
1265//******************************************************************************
1266// Function: i2DrainOutput(pCh,timeout)
1267// Parameters: Pointer to a channel structure
1268// Maximum period to wait
1269// Returns: ?
1270//
1271// Description:
1272// Uses the bookmark request command to ask the board to send a bookmark back as
1273// soon as all the data is completely sent.
1274//******************************************************************************
1275static void
1276i2DrainWakeup(i2ChanStrPtr pCh)
1277{
1278 ip2trace (CHANN, ITRC_DRAIN, 10, 1, pCh->BookmarkTimer.expires );
1279
1280 pCh->BookmarkTimer.expires = 0;
1281 wake_up_interruptible( &pCh->pBookmarkWait );
1282}
1283
1284static void
1285i2DrainOutput(i2ChanStrPtr pCh, int timeout)
1286{
1287 wait_queue_t wait;
1288 i2eBordStrPtr pB;
1289
1290 ip2trace (CHANN, ITRC_DRAIN, ITRC_ENTER, 1, pCh->BookmarkTimer.expires);
1291
1292 pB = pCh->pMyBord;
1293 // If the board has gone fatal, return bad,
1294 // and also hit the trap routine if it exists.
1295 if (pB->i2eFatal) {
1296 if (pB->i2eFatalTrap) {
1297 (*(pB)->i2eFatalTrap)(pB);
1298 }
1299 return;
1300 }
1301 if ((timeout > 0) && (pCh->BookmarkTimer.expires == 0 )) {
1302 // One per customer (channel)
1303 init_timer( &(pCh->BookmarkTimer) );
1304 pCh->BookmarkTimer.expires = jiffies + timeout;
1305 pCh->BookmarkTimer.function = (void*)(unsigned long)i2DrainWakeup;
1306 pCh->BookmarkTimer.data = (unsigned long)pCh;
1307
1308 ip2trace (CHANN, ITRC_DRAIN, 1, 1, pCh->BookmarkTimer.expires );
1309
1310 add_timer( &(pCh->BookmarkTimer) );
1311 }
1312
1313 i2QueueCommands( PTYPE_INLINE, pCh, -1, 1, CMD_BMARK_REQ );
1314
1315 init_waitqueue_entry(&wait, current);
1316 add_wait_queue(&(pCh->pBookmarkWait), &wait);
1317 set_current_state( TASK_INTERRUPTIBLE );
1318
1319 serviceOutgoingFifo( pB );
1320
1321 schedule(); // Now we take our interruptible sleep on
1322
1323 // Clean up the queue
1324 set_current_state( TASK_RUNNING );
1325 remove_wait_queue(&(pCh->pBookmarkWait), &wait);
1326
1327 // if expires == 0 then timer poped, then do not need to del_timer
1328 if ((timeout > 0) && pCh->BookmarkTimer.expires &&
1329 time_before(jiffies, pCh->BookmarkTimer.expires)) {
1330 del_timer( &(pCh->BookmarkTimer) );
1331 pCh->BookmarkTimer.expires = 0;
1332
1333 ip2trace (CHANN, ITRC_DRAIN, 3, 1, pCh->BookmarkTimer.expires );
1334
1335 }
1336 ip2trace (CHANN, ITRC_DRAIN, ITRC_RETURN, 1, pCh->BookmarkTimer.expires );
1337 return;
1338}
1339
1340//******************************************************************************
1341// Function: i2OutputFree(pCh)
1342// Parameters: Pointer to a channel structure
1343// Returns: Space in output buffer
1344//
1345// Description:
1346// Returns -1 if very gross error. Otherwise returns the amount of bytes still
1347// free in the output buffer.
1348//******************************************************************************
1349static int
1350i2OutputFree(i2ChanStrPtr pCh)
1351{
1352 int amountToMove;
1353 unsigned long flags;
1354
1355 // Ensure channel structure seems real
1356 if ( !i2Validate ( pCh ) ) {
1357 return -1;
1358 }
1359 READ_LOCK_IRQSAVE(&pCh->Obuf_spinlock,flags);
1360 amountToMove = pCh->Obuf_strip - pCh->Obuf_stuff - 1;
1361 READ_UNLOCK_IRQRESTORE(&pCh->Obuf_spinlock,flags);
1362
1363 if (amountToMove < 0) {
1364 amountToMove += OBUF_SIZE;
1365 }
1366 // If this is negative, we will discover later
1367 amountToMove -= sizeof(i2DataHeader);
1368
1369 return (amountToMove < 0) ? 0 : amountToMove;
1370}
1371static void
1372
1373ip2_owake( PTTY tp)
1374{
1375 i2ChanStrPtr pCh;
1376
1377 if (tp == NULL) return;
1378
1379 pCh = tp->driver_data;
1380
1381 ip2trace (CHANN, ITRC_SICMD, 10, 2, tp->flags,
1382 (1 << TTY_DO_WRITE_WAKEUP) );
1383
1384 wake_up_interruptible ( &tp->write_wait );
1385 if ( ( tp->flags & (1 << TTY_DO_WRITE_WAKEUP) )
1386 && tp->ldisc.write_wakeup )
1387 {
1388 (tp->ldisc.write_wakeup) ( tp );
1389
1390 ip2trace (CHANN, ITRC_SICMD, 11, 0 );
1391
1392 }
1393}
1394
1395static inline void
1396set_baud_params(i2eBordStrPtr pB)
1397{
1398 int i,j;
1399 i2ChanStrPtr *pCh;
1400
1401 pCh = (i2ChanStrPtr *) pB->i2eChannelPtr;
1402
1403 for (i = 0; i < ABS_MAX_BOXES; i++) {
1404 if (pB->channelBtypes.bid_value[i]) {
1405 if (BID_HAS_654(pB->channelBtypes.bid_value[i])) {
1406 for (j = 0; j < ABS_BIGGEST_BOX; j++) {
1407 if (pCh[i*16+j] == NULL)
1408 break;
1409 (pCh[i*16+j])->BaudBase = 921600; // MAX for ST654
1410 (pCh[i*16+j])->BaudDivisor = 96;
1411 }
1412 } else { // has cirrus cd1400
1413 for (j = 0; j < ABS_BIGGEST_BOX; j++) {
1414 if (pCh[i*16+j] == NULL)
1415 break;
1416 (pCh[i*16+j])->BaudBase = 115200; // MAX for CD1400
1417 (pCh[i*16+j])->BaudDivisor = 12;
1418 }
1419 }
1420 }
1421 }
1422}
1423
1424//******************************************************************************
1425// Function: i2StripFifo(pB)
1426// Parameters: Pointer to a board structure
1427// Returns: ?
1428//
1429// Description:
1430// Strips all the available data from the incoming FIFO, identifies the type of
1431// packet, and either buffers the data or does what needs to be done.
1432//
1433// Note there is no overflow checking here: if the board sends more data than it
1434// ought to, we will not detect it here, but blindly overflow...
1435//******************************************************************************
1436
1437// A buffer for reading in blocks for unknown channels
1438static unsigned char junkBuffer[IBUF_SIZE];
1439
1440// A buffer to read in a status packet. Because of the size of the count field
1441// for these things, the maximum packet size must be less than MAX_CMD_PACK_SIZE
1442static unsigned char cmdBuffer[MAX_CMD_PACK_SIZE + 4];
1443
1444// This table changes the bit order from MSR order given by STAT_MODEM packet to
1445// status bits used in our library.
1446static char xlatDss[16] = {
14470 | 0 | 0 | 0 ,
14480 | 0 | 0 | I2_CTS ,
14490 | 0 | I2_DSR | 0 ,
14500 | 0 | I2_DSR | I2_CTS ,
14510 | I2_RI | 0 | 0 ,
14520 | I2_RI | 0 | I2_CTS ,
14530 | I2_RI | I2_DSR | 0 ,
14540 | I2_RI | I2_DSR | I2_CTS ,
1455I2_DCD | 0 | 0 | 0 ,
1456I2_DCD | 0 | 0 | I2_CTS ,
1457I2_DCD | 0 | I2_DSR | 0 ,
1458I2_DCD | 0 | I2_DSR | I2_CTS ,
1459I2_DCD | I2_RI | 0 | 0 ,
1460I2_DCD | I2_RI | 0 | I2_CTS ,
1461I2_DCD | I2_RI | I2_DSR | 0 ,
1462I2_DCD | I2_RI | I2_DSR | I2_CTS };
1463
1464static inline void
1465i2StripFifo(i2eBordStrPtr pB)
1466{
1467 i2ChanStrPtr pCh;
1468 int channel;
1469 int count;
1470 unsigned short stuffIndex;
1471 int amountToRead;
1472 unsigned char *pc, *pcLimit;
1473 unsigned char uc;
1474 unsigned char dss_change;
1475 unsigned long bflags,cflags;
1476
1477// ip2trace (ITRC_NO_PORT, ITRC_SFIFO, ITRC_ENTER, 0 );
1478
1479 while (HAS_INPUT(pB)) {
1480// ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 2, 0 );
1481
1482 // Process packet from fifo a one atomic unit
1483 WRITE_LOCK_IRQSAVE(&pB->read_fifo_spinlock,bflags);
1484
1485 // The first word (or two bytes) will have channel number and type of
1486 // packet, possibly other information
1487 pB->i2eLeadoffWord[0] = iiReadWord(pB);
1488
1489 switch(PTYPE_OF(pB->i2eLeadoffWord))
1490 {
1491 case PTYPE_DATA:
1492 pB->got_input = 1;
1493
1494// ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 3, 0 );
1495
1496 channel = CHANNEL_OF(pB->i2eLeadoffWord); /* Store channel */
1497 count = iiReadWord(pB); /* Count is in the next word */
1498
1499// NEW: Check the count for sanity! Should the hardware fail, our death
1500// is more pleasant. While an oversize channel is acceptable (just more
1501// than the driver supports), an over-length count clearly means we are
1502// sick!
1503 if ( ((unsigned int)count) > IBUF_SIZE ) {
1504 pB->i2eFatal = 2;
1505 WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags);
1506 return; /* Bail out ASAP */
1507 }
1508 // Channel is illegally big ?
1509 if ((channel >= pB->i2eChannelCnt) ||
1510 (NULL==(pCh = ((i2ChanStrPtr*)pB->i2eChannelPtr)[channel])))
1511 {
1512 iiReadBuf(pB, junkBuffer, count);
1513 WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags);
1514 break; /* From switch: ready for next packet */
1515 }
1516
1517 // Channel should be valid, then
1518
1519 // If this is a hot-key, merely post its receipt for now. These are
1520 // always supposed to be 1-byte packets, so we won't even check the
1521 // count. Also we will post an acknowledgement to the board so that
1522 // more data can be forthcoming. Note that we are not trying to use
1523 // these sequences in this driver, merely to robustly ignore them.
1524 if(ID_OF(pB->i2eLeadoffWord) == ID_HOT_KEY)
1525 {
1526 pCh->hotKeyIn = iiReadWord(pB) & 0xff;
1527 WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags);
1528 i2QueueCommands(PTYPE_BYPASS, pCh, 0, 1, CMD_HOTACK);
1529 break; /* From the switch: ready for next packet */
1530 }
1531
1532 // Normal data! We crudely assume there is room for the data in our
1533 // buffer because the board wouldn't have exceeded his credit limit.
1534 WRITE_LOCK_IRQSAVE(&pCh->Ibuf_spinlock,cflags);
1535 // We have 2 locks now
1536 stuffIndex = pCh->Ibuf_stuff;
1537 amountToRead = IBUF_SIZE - stuffIndex;
1538 if (amountToRead > count)
1539 amountToRead = count;
1540
1541 // stuffIndex would have been already adjusted so there would
1542 // always be room for at least one, and count is always at least
1543 // one.
1544
1545 iiReadBuf(pB, &(pCh->Ibuf[stuffIndex]), amountToRead);
1546 pCh->icount.rx += amountToRead;
1547
1548 // Update the stuffIndex by the amount of data moved. Note we could
1549 // never ask for more data than would just fit. However, we might
1550 // have read in one more byte than we wanted because the read
1551 // rounds up to even bytes. If this byte is on the end of the
1552 // packet, and is padding, we ignore it. If the byte is part of
1553 // the actual data, we need to move it.
1554
1555 stuffIndex += amountToRead;
1556
1557 if (stuffIndex >= IBUF_SIZE) {
1558 if ((amountToRead & 1) && (count > amountToRead)) {
1559 pCh->Ibuf[0] = pCh->Ibuf[IBUF_SIZE];
1560 amountToRead++;
1561 stuffIndex = 1;
1562 } else {
1563 stuffIndex = 0;
1564 }
1565 }
1566
1567 // If there is anything left over, read it as well
1568 if (count > amountToRead) {
1569 amountToRead = count - amountToRead;
1570 iiReadBuf(pB, &(pCh->Ibuf[stuffIndex]), amountToRead);
1571 pCh->icount.rx += amountToRead;
1572 stuffIndex += amountToRead;
1573 }
1574
1575 // Update stuff index
1576 pCh->Ibuf_stuff = stuffIndex;
1577 WRITE_UNLOCK_IRQRESTORE(&pCh->Ibuf_spinlock,cflags);
1578 WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags);
1579
1580#ifdef USE_IQ
1581 schedule_work(&pCh->tqueue_input);
1582#else
1583 do_input(pCh);
1584#endif
1585
1586 // Note we do not need to maintain any flow-control credits at this
1587 // time: if we were to increment .asof and decrement .room, there
1588 // would be no net effect. Instead, when we strip data, we will
1589 // increment .asof and leave .room unchanged.
1590
1591 break; // From switch: ready for next packet
1592
1593 case PTYPE_STATUS:
1594 ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 4, 0 );
1595
1596 count = CMD_COUNT_OF(pB->i2eLeadoffWord);
1597
1598 iiReadBuf(pB, cmdBuffer, count);
1599 // We can release early with buffer grab
1600 WRITE_UNLOCK_IRQRESTORE(&pB->read_fifo_spinlock,bflags);
1601
1602 pc = cmdBuffer;
1603 pcLimit = &(cmdBuffer[count]);
1604
1605 while (pc < pcLimit) {
1606 channel = *pc++;
1607
1608 ip2trace (channel, ITRC_SFIFO, 7, 2, channel, *pc );
1609
1610 /* check for valid channel */
1611 if (channel < pB->i2eChannelCnt
1612 &&
1613 (pCh = (((i2ChanStrPtr*)pB->i2eChannelPtr)[channel])) != NULL
1614 )
1615 {
1616 dss_change = 0;
1617
1618 switch (uc = *pc++)
1619 {
1620 /* Breaks and modem signals are easy: just update status */
1621 case STAT_CTS_UP:
1622 if ( !(pCh->dataSetIn & I2_CTS) )
1623 {
1624 pCh->dataSetIn |= I2_DCTS;
1625 pCh->icount.cts++;
1626 dss_change = 1;
1627 }
1628 pCh->dataSetIn |= I2_CTS;
1629 break;
1630
1631 case STAT_CTS_DN:
1632 if ( pCh->dataSetIn & I2_CTS )
1633 {
1634 pCh->dataSetIn |= I2_DCTS;
1635 pCh->icount.cts++;
1636 dss_change = 1;
1637 }
1638 pCh->dataSetIn &= ~I2_CTS;
1639 break;
1640
1641 case STAT_DCD_UP:
1642 ip2trace (channel, ITRC_MODEM, 1, 1, pCh->dataSetIn );
1643
1644 if ( !(pCh->dataSetIn & I2_DCD) )
1645 {
1646 ip2trace (CHANN, ITRC_MODEM, 2, 0 );
1647 pCh->dataSetIn |= I2_DDCD;
1648 pCh->icount.dcd++;
1649 dss_change = 1;
1650 }
1651 pCh->dataSetIn |= I2_DCD;
1652
1653 ip2trace (channel, ITRC_MODEM, 3, 1, pCh->dataSetIn );
1654 break;
1655
1656 case STAT_DCD_DN:
1657 ip2trace (channel, ITRC_MODEM, 4, 1, pCh->dataSetIn );
1658 if ( pCh->dataSetIn & I2_DCD )
1659 {
1660 ip2trace (channel, ITRC_MODEM, 5, 0 );
1661 pCh->dataSetIn |= I2_DDCD;
1662 pCh->icount.dcd++;
1663 dss_change = 1;
1664 }
1665 pCh->dataSetIn &= ~I2_DCD;
1666
1667 ip2trace (channel, ITRC_MODEM, 6, 1, pCh->dataSetIn );
1668 break;
1669
1670 case STAT_DSR_UP:
1671 if ( !(pCh->dataSetIn & I2_DSR) )
1672 {
1673 pCh->dataSetIn |= I2_DDSR;
1674 pCh->icount.dsr++;
1675 dss_change = 1;
1676 }
1677 pCh->dataSetIn |= I2_DSR;
1678 break;
1679
1680 case STAT_DSR_DN:
1681 if ( pCh->dataSetIn & I2_DSR )
1682 {
1683 pCh->dataSetIn |= I2_DDSR;
1684 pCh->icount.dsr++;
1685 dss_change = 1;
1686 }
1687 pCh->dataSetIn &= ~I2_DSR;
1688 break;
1689
1690 case STAT_RI_UP:
1691 if ( !(pCh->dataSetIn & I2_RI) )
1692 {
1693 pCh->dataSetIn |= I2_DRI;
1694 pCh->icount.rng++;
1695 dss_change = 1;
1696 }
1697 pCh->dataSetIn |= I2_RI ;
1698 break;
1699
1700 case STAT_RI_DN:
1701 // to be compat with serial.c
1702 //if ( pCh->dataSetIn & I2_RI )
1703 //{
1704 // pCh->dataSetIn |= I2_DRI;
1705 // pCh->icount.rng++;
1706 // dss_change = 1;
1707 //}
1708 pCh->dataSetIn &= ~I2_RI ;
1709 break;
1710
1711 case STAT_BRK_DET:
1712 pCh->dataSetIn |= I2_BRK;
1713 pCh->icount.brk++;
1714 dss_change = 1;
1715 break;
1716
1717 // Bookmarks? one less request we're waiting for
1718 case STAT_BMARK:
1719 pCh->bookMarks--;
1720 if (pCh->bookMarks <= 0 ) {
1721 pCh->bookMarks = 0;
1722 wake_up_interruptible( &pCh->pBookmarkWait );
1723
1724 ip2trace (channel, ITRC_DRAIN, 20, 1, pCh->BookmarkTimer.expires );
1725 }
1726 break;
1727
1728 // Flow control packets? Update the new credits, and if
1729 // someone was waiting for output, queue him up again.
1730 case STAT_FLOW:
1731 pCh->outfl.room =
1732 ((flowStatPtr)pc)->room -
1733 (pCh->outfl.asof - ((flowStatPtr)pc)->asof);
1734
1735 ip2trace (channel, ITRC_STFLW, 1, 1, pCh->outfl.room );
1736
1737 if (pCh->channelNeeds & NEED_CREDIT)
1738 {
1739 ip2trace (channel, ITRC_STFLW, 2, 1, pCh->channelNeeds);
1740
1741 pCh->channelNeeds &= ~NEED_CREDIT;
1742 i2QueueNeeds(pB, pCh, NEED_INLINE);
1743 if ( pCh->pTTY )
1744 ip2_owake(pCh->pTTY);
1745 }
1746
1747 ip2trace (channel, ITRC_STFLW, 3, 1, pCh->channelNeeds);
1748
1749 pc += sizeof(flowStat);
1750 break;
1751
1752 /* Special packets: */
1753 /* Just copy the information into the channel structure */
1754
1755 case STAT_STATUS:
1756
1757 pCh->channelStatus = *((debugStatPtr)pc);
1758 pc += sizeof(debugStat);
1759 break;
1760
1761 case STAT_TXCNT:
1762
1763 pCh->channelTcount = *((cntStatPtr)pc);
1764 pc += sizeof(cntStat);
1765 break;
1766
1767 case STAT_RXCNT:
1768
1769 pCh->channelRcount = *((cntStatPtr)pc);
1770 pc += sizeof(cntStat);
1771 break;
1772
1773 case STAT_BOXIDS:
1774 pB->channelBtypes = *((bidStatPtr)pc);
1775 pc += sizeof(bidStat);
1776 set_baud_params(pB);
1777 break;
1778
1779 case STAT_HWFAIL:
1780 i2QueueCommands (PTYPE_INLINE, pCh, 0, 1, CMD_HW_TEST);
1781 pCh->channelFail = *((failStatPtr)pc);
1782 pc += sizeof(failStat);
1783 break;
1784
1785 /* No explicit match? then
1786 * Might be an error packet...
1787 */
1788 default:
1789 switch (uc & STAT_MOD_ERROR)
1790 {
1791 case STAT_ERROR:
1792 if (uc & STAT_E_PARITY) {
1793 pCh->dataSetIn |= I2_PAR;
1794 pCh->icount.parity++;
1795 }
1796 if (uc & STAT_E_FRAMING){
1797 pCh->dataSetIn |= I2_FRA;
1798 pCh->icount.frame++;
1799 }
1800 if (uc & STAT_E_OVERRUN){
1801 pCh->dataSetIn |= I2_OVR;
1802 pCh->icount.overrun++;
1803 }
1804 break;
1805
1806 case STAT_MODEM:
1807 // the answer to DSS_NOW request (not change)
1808 pCh->dataSetIn = (pCh->dataSetIn
1809 & ~(I2_RI | I2_CTS | I2_DCD | I2_DSR) )
1810 | xlatDss[uc & 0xf];
1811 wake_up_interruptible ( &pCh->dss_now_wait );
1812 default:
1813 break;
1814 }
1815 } /* End of switch on status type */
1816 if (dss_change) {
1817#ifdef USE_IQ
1818 schedule_work(&pCh->tqueue_status);
1819#else
1820 do_status(pCh);
1821#endif
1822 }
1823 }
1824 else /* Or else, channel is invalid */
1825 {
1826 // Even though the channel is invalid, we must test the
1827 // status to see how much additional data it has (to be
1828 // skipped)
1829 switch (*pc++)
1830 {
1831 case STAT_FLOW:
1832 pc += 4; /* Skip the data */
1833 break;
1834
1835 default:
1836 break;
1837 }
1838 }
1839 } // End of while (there is still some status packet left)
1840 break;
1841
1842 default: // Neither packet? should be impossible
1843 ip2trace (ITRC_NO_PORT, ITRC_SFIFO, 5, 1,
1844 PTYPE_OF(pB->i2eLeadoffWord) );
1845
1846 break;
1847 } // End of switch on type of packets
1848 } //while(board HAS_INPUT)
1849
1850 ip2trace (ITRC_NO_PORT, ITRC_SFIFO, ITRC_RETURN, 0 );
1851
1852 // Send acknowledgement to the board even if there was no data!
1853 pB->i2eOutMailWaiting |= MB_IN_STRIPPED;
1854 return;
1855}
1856
1857//******************************************************************************
1858// Function: i2Write2Fifo(pB,address,count)
1859// Parameters: Pointer to a board structure, source address, byte count
1860// Returns: bytes written
1861//
1862// Description:
1863// Writes count bytes to board io address(implied) from source
1864// Adjusts count, leaves reserve for next time around bypass cmds
1865//******************************************************************************
1866static int
1867i2Write2Fifo(i2eBordStrPtr pB, unsigned char *source, int count,int reserve)
1868{
1869 int rc = 0;
1870 unsigned long flags;
1871 WRITE_LOCK_IRQSAVE(&pB->write_fifo_spinlock,flags);
1872 if (!pB->i2eWaitingForEmptyFifo) {
1873 if (pB->i2eFifoRemains > (count+reserve)) {
1874 pB->i2eFifoRemains -= count;
1875 iiWriteBuf(pB, source, count);
1876 pB->i2eOutMailWaiting |= MB_OUT_STUFFED;
1877 rc = count;
1878 }
1879 }
1880 WRITE_UNLOCK_IRQRESTORE(&pB->write_fifo_spinlock,flags);
1881 return rc;
1882}
1883//******************************************************************************
1884// Function: i2StuffFifoBypass(pB)
1885// Parameters: Pointer to a board structure
1886// Returns: Nothing
1887//
1888// Description:
1889// Stuffs as many bypass commands into the fifo as possible. This is simpler
1890// than stuffing data or inline commands to fifo, since we do not have
1891// flow-control to deal with.
1892//******************************************************************************
1893static inline void
1894i2StuffFifoBypass(i2eBordStrPtr pB)
1895{
1896 i2ChanStrPtr pCh;
1897 unsigned char *pRemove;
1898 unsigned short stripIndex;
1899 unsigned short packetSize;
1900 unsigned short paddedSize;
1901 unsigned short notClogged = 1;
1902 unsigned long flags;
1903
1904 int bailout = 1000;
1905
1906 // Continue processing so long as there are entries, or there is room in the
1907 // fifo. Each entry represents a channel with something to do.
1908 while ( --bailout && notClogged &&
1909 (NULL != (pCh = i2DeQueueNeeds(pB,NEED_BYPASS))))
1910 {
1911 WRITE_LOCK_IRQSAVE(&pCh->Cbuf_spinlock,flags);
1912 stripIndex = pCh->Cbuf_strip;
1913
1914 // as long as there are packets for this channel...
1915
1916 while (stripIndex != pCh->Cbuf_stuff) {
1917 pRemove = &(pCh->Cbuf[stripIndex]);
1918 packetSize = CMD_COUNT_OF(pRemove) + sizeof(i2CmdHeader);
1919 paddedSize = ROUNDUP(packetSize);
1920
1921 if (paddedSize > 0) {
1922 if ( 0 == i2Write2Fifo(pB, pRemove, paddedSize,0)) {
1923 notClogged = 0; /* fifo full */
1924 i2QueueNeeds(pB, pCh, NEED_BYPASS); // Put back on queue
1925 break; // Break from the channel
1926 }
1927 }
1928#ifdef DEBUG_FIFO
1929WriteDBGBuf("BYPS", pRemove, paddedSize);
1930#endif /* DEBUG_FIFO */
1931 pB->debugBypassCount++;
1932
1933 pRemove += packetSize;
1934 stripIndex += packetSize;
1935 if (stripIndex >= CBUF_SIZE) {
1936 stripIndex = 0;
1937 pRemove = pCh->Cbuf;
1938 }
1939 }
1940 // Done with this channel. Move to next, removing this one from
1941 // the queue of channels if we cleaned it out (i.e., didn't get clogged.
1942 pCh->Cbuf_strip = stripIndex;
1943 WRITE_UNLOCK_IRQRESTORE(&pCh->Cbuf_spinlock,flags);
1944 } // Either clogged or finished all the work
1945
1946#ifdef IP2DEBUG_TRACE
1947 if ( !bailout ) {
1948 ip2trace (ITRC_NO_PORT, ITRC_ERROR, 1, 0 );
1949 }
1950#endif
1951}
1952
1953//******************************************************************************
1954// Function: i2StuffFifoFlow(pB)
1955// Parameters: Pointer to a board structure
1956// Returns: Nothing
1957//
1958// Description:
1959// Stuffs as many flow control packets into the fifo as possible. This is easier
1960// even than doing normal bypass commands, because there is always at most one
1961// packet, already assembled, for each channel.
1962//******************************************************************************
1963static inline void
1964i2StuffFifoFlow(i2eBordStrPtr pB)
1965{
1966 i2ChanStrPtr pCh;
1967 unsigned short paddedSize = ROUNDUP(sizeof(flowIn));
1968
1969 ip2trace (ITRC_NO_PORT, ITRC_SFLOW, ITRC_ENTER, 2,
1970 pB->i2eFifoRemains, paddedSize );
1971
1972 // Continue processing so long as there are entries, or there is room in the
1973 // fifo. Each entry represents a channel with something to do.
1974 while ( (NULL != (pCh = i2DeQueueNeeds(pB,NEED_FLOW)))) {
1975 pB->debugFlowCount++;
1976
1977 // NO Chan LOCK needed ???
1978 if ( 0 == i2Write2Fifo(pB,(unsigned char *)&(pCh->infl),paddedSize,0)) {
1979 break;
1980 }
1981#ifdef DEBUG_FIFO
1982 WriteDBGBuf("FLOW",(unsigned char *) &(pCh->infl), paddedSize);
1983#endif /* DEBUG_FIFO */
1984
1985 } // Either clogged or finished all the work
1986
1987 ip2trace (ITRC_NO_PORT, ITRC_SFLOW, ITRC_RETURN, 0 );
1988}
1989
1990//******************************************************************************
1991// Function: i2StuffFifoInline(pB)
1992// Parameters: Pointer to a board structure
1993// Returns: Nothing
1994//
1995// Description:
1996// Stuffs as much data and inline commands into the fifo as possible. This is
1997// the most complex fifo-stuffing operation, since there if now the channel
1998// flow-control issue to deal with.
1999//******************************************************************************
2000static inline void
2001i2StuffFifoInline(i2eBordStrPtr pB)
2002{
2003 i2ChanStrPtr pCh;
2004 unsigned char *pRemove;
2005 unsigned short stripIndex;
2006 unsigned short packetSize;
2007 unsigned short paddedSize;
2008 unsigned short notClogged = 1;
2009 unsigned short flowsize;
2010 unsigned long flags;
2011
2012 int bailout = 1000;
2013 int bailout2;
2014
2015 ip2trace (ITRC_NO_PORT, ITRC_SICMD, ITRC_ENTER, 3, pB->i2eFifoRemains,
2016 pB->i2Dbuf_strip, pB->i2Dbuf_stuff );
2017
2018 // Continue processing so long as there are entries, or there is room in the
2019 // fifo. Each entry represents a channel with something to do.
2020 while ( --bailout && notClogged &&
2021 (NULL != (pCh = i2DeQueueNeeds(pB,NEED_INLINE))) )
2022 {
2023 WRITE_LOCK_IRQSAVE(&pCh->Obuf_spinlock,flags);
2024 stripIndex = pCh->Obuf_strip;
2025
2026 ip2trace (CHANN, ITRC_SICMD, 3, 2, stripIndex, pCh->Obuf_stuff );
2027
2028 // as long as there are packets for this channel...
2029 bailout2 = 1000;
2030 while ( --bailout2 && stripIndex != pCh->Obuf_stuff) {
2031 pRemove = &(pCh->Obuf[stripIndex]);
2032
2033 // Must determine whether this be a data or command packet to
2034 // calculate correctly the header size and the amount of
2035 // flow-control credit this type of packet will use.
2036 if (PTYPE_OF(pRemove) == PTYPE_DATA) {
2037 flowsize = DATA_COUNT_OF(pRemove);
2038 packetSize = flowsize + sizeof(i2DataHeader);
2039 } else {
2040 flowsize = CMD_COUNT_OF(pRemove);
2041 packetSize = flowsize + sizeof(i2CmdHeader);
2042 }
2043 flowsize = CREDIT_USAGE(flowsize);
2044 paddedSize = ROUNDUP(packetSize);
2045
2046 ip2trace (CHANN, ITRC_SICMD, 4, 2, pB->i2eFifoRemains, paddedSize );
2047
2048 // If we don't have enough credits from the board to send the data,
2049 // flag the channel that we are waiting for flow control credit, and
2050 // break out. This will clean up this channel and remove us from the
2051 // queue of hot things to do.
2052
2053 ip2trace (CHANN, ITRC_SICMD, 5, 2, pCh->outfl.room, flowsize );
2054
2055 if (pCh->outfl.room <= flowsize) {
2056 // Do Not have the credits to send this packet.
2057 i2QueueNeeds(pB, pCh, NEED_CREDIT);
2058 notClogged = 0;
2059 break; // So to do next channel
2060 }
2061 if ( (paddedSize > 0)
2062 && ( 0 == i2Write2Fifo(pB, pRemove, paddedSize, 128))) {
2063 // Do Not have room in fifo to send this packet.
2064 notClogged = 0;
2065 i2QueueNeeds(pB, pCh, NEED_INLINE);
2066 break; // Break from the channel
2067 }
2068#ifdef DEBUG_FIFO
2069WriteDBGBuf("DATA", pRemove, paddedSize);
2070#endif /* DEBUG_FIFO */
2071 pB->debugInlineCount++;
2072
2073 pCh->icount.tx += flowsize;
2074 // Update current credits
2075 pCh->outfl.room -= flowsize;
2076 pCh->outfl.asof += flowsize;
2077 if (PTYPE_OF(pRemove) == PTYPE_DATA) {
2078 pCh->Obuf_char_count -= DATA_COUNT_OF(pRemove);
2079 }
2080 pRemove += packetSize;
2081 stripIndex += packetSize;
2082
2083 ip2trace (CHANN, ITRC_SICMD, 6, 2, stripIndex, pCh->Obuf_strip);
2084
2085 if (stripIndex >= OBUF_SIZE) {
2086 stripIndex = 0;
2087 pRemove = pCh->Obuf;
2088
2089 ip2trace (CHANN, ITRC_SICMD, 7, 1, stripIndex );
2090
2091 }
2092 } /* while */
2093 if ( !bailout2 ) {
2094 ip2trace (CHANN, ITRC_ERROR, 3, 0 );
2095 }
2096 // Done with this channel. Move to next, removing this one from the
2097 // queue of channels if we cleaned it out (i.e., didn't get clogged.
2098 pCh->Obuf_strip = stripIndex;
2099 WRITE_UNLOCK_IRQRESTORE(&pCh->Obuf_spinlock,flags);
2100 if ( notClogged )
2101 {
2102
2103 ip2trace (CHANN, ITRC_SICMD, 8, 0 );
2104
2105 if ( pCh->pTTY ) {
2106 ip2_owake(pCh->pTTY);
2107 }
2108 }
2109 } // Either clogged or finished all the work
2110
2111 if ( !bailout ) {
2112 ip2trace (ITRC_NO_PORT, ITRC_ERROR, 4, 0 );
2113 }
2114
2115 ip2trace (ITRC_NO_PORT, ITRC_SICMD, ITRC_RETURN, 1,pB->i2Dbuf_strip);
2116}
2117
2118//******************************************************************************
2119// Function: serviceOutgoingFifo(pB)
2120// Parameters: Pointer to a board structure
2121// Returns: Nothing
2122//
2123// Description:
2124// Helper routine to put data in the outgoing fifo, if we aren't already waiting
2125// for something to be there. If the fifo has only room for a very little data,
2126// go head and hit the board with a mailbox hit immediately. Otherwise, it will
2127// have to happen later in the interrupt processing. Since this routine may be
2128// called both at interrupt and foreground time, we must turn off interrupts
2129// during the entire process.
2130//******************************************************************************
2131static void
2132serviceOutgoingFifo(i2eBordStrPtr pB)
2133{
2134 // If we aren't currently waiting for the board to empty our fifo, service
2135 // everything that is pending, in priority order (especially, Bypass before
2136 // Inline).
2137 if ( ! pB->i2eWaitingForEmptyFifo )
2138 {
2139 i2StuffFifoFlow(pB);
2140 i2StuffFifoBypass(pB);
2141 i2StuffFifoInline(pB);
2142
2143 iiSendPendingMail(pB);
2144 }
2145}
2146
2147//******************************************************************************
2148// Function: i2ServiceBoard(pB)
2149// Parameters: Pointer to a board structure
2150// Returns: Nothing
2151//
2152// Description:
2153// Normally this is called from interrupt level, but there is deliberately
2154// nothing in here specific to being called from interrupt level. All the
2155// hardware-specific, interrupt-specific things happen at the outer levels.
2156//
2157// For example, a timer interrupt could drive this routine for some sort of
2158// polled operation. The only requirement is that the programmer deal with any
2159// atomiticity/concurrency issues that result.
2160//
2161// This routine responds to the board's having sent mailbox information to the
2162// host (which would normally cause an interrupt). This routine reads the
2163// incoming mailbox. If there is no data in it, this board did not create the
2164// interrupt and/or has nothing to be done to it. (Except, if we have been
2165// waiting to write mailbox data to it, we may do so.
2166//
2167// Based on the value in the mailbox, we may take various actions.
2168//
2169// No checking here of pB validity: after all, it shouldn't have been called by
2170// the handler unless pB were on the list.
2171//******************************************************************************
2172static inline int
2173i2ServiceBoard ( i2eBordStrPtr pB )
2174{
2175 unsigned inmail;
2176 unsigned long flags;
2177
2178
2179 /* This should be atomic because of the way we are called... */
2180 if (NO_MAIL_HERE == ( inmail = pB->i2eStartMail ) ) {
2181 inmail = iiGetMail(pB);
2182 }
2183 pB->i2eStartMail = NO_MAIL_HERE;
2184
2185 ip2trace (ITRC_NO_PORT, ITRC_INTR, 2, 1, inmail );
2186
2187 if (inmail != NO_MAIL_HERE) {
2188 // If the board has gone fatal, nothing to do but hit a bit that will
2189 // alert foreground tasks to protest!
2190 if ( inmail & MB_FATAL_ERROR ) {
2191 pB->i2eFatal = 1;
2192 goto exit_i2ServiceBoard;
2193 }
2194
2195 /* Assuming no fatal condition, we proceed to do work */
2196 if ( inmail & MB_IN_STUFFED ) {
2197 pB->i2eFifoInInts++;
2198 i2StripFifo(pB); /* There might be incoming packets */
2199 }
2200
2201 if (inmail & MB_OUT_STRIPPED) {
2202 pB->i2eFifoOutInts++;
2203 WRITE_LOCK_IRQSAVE(&pB->write_fifo_spinlock,flags);
2204 pB->i2eFifoRemains = pB->i2eFifoSize;
2205 pB->i2eWaitingForEmptyFifo = 0;
2206 WRITE_UNLOCK_IRQRESTORE(&pB->write_fifo_spinlock,flags);
2207
2208 ip2trace (ITRC_NO_PORT, ITRC_INTR, 30, 1, pB->i2eFifoRemains );
2209
2210 }
2211 serviceOutgoingFifo(pB);
2212 }
2213
2214 ip2trace (ITRC_NO_PORT, ITRC_INTR, 8, 0 );
2215
2216exit_i2ServiceBoard:
2217
2218 return 0;
2219}
diff --git a/drivers/char/ip2/i2lib.h b/drivers/char/ip2/i2lib.h
new file mode 100644
index 000000000000..952e113ccd8a
--- /dev/null
+++ b/drivers/char/ip2/i2lib.h
@@ -0,0 +1,351 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Header file for high level library functions
12*
13*******************************************************************************/
14#ifndef I2LIB_H
15#define I2LIB_H 1
16//------------------------------------------------------------------------------
17// I2LIB.H
18//
19// IntelliPort-II and IntelliPort-IIEX
20//
21// Defines, structure definitions, and external declarations for i2lib.c
22//------------------------------------------------------------------------------
23//--------------------------------------
24// Mandatory Includes:
25//--------------------------------------
26#include "ip2types.h"
27#include "i2ellis.h"
28#include "i2pack.h"
29#include "i2cmd.h"
30#include <linux/workqueue.h>
31
32//------------------------------------------------------------------------------
33// i2ChanStr -- Channel Structure:
34// Used to track per-channel information for the library routines using standard
35// loadware. Note also, a pointer to an array of these structures is patched
36// into the i2eBordStr (see i2ellis.h)
37//------------------------------------------------------------------------------
38//
39// If we make some limits on the maximum block sizes, we can avoid dealing with
40// buffer wrap. The wrapping of the buffer is based on where the start of the
41// packet is. Then there is always room for the packet contiguously.
42//
43// Maximum total length of an outgoing data or in-line command block. The limit
44// of 36 on data is quite arbitrary and based more on DOS memory limitations
45// than the board interface. However, for commands, the maximum packet length is
46// MAX_CMD_PACK_SIZE, because the field size for the count is only a few bits
47// (see I2PACK.H) in such packets. For data packets, the count field size is not
48// the limiting factor. As of this writing, MAX_OBUF_BLOCK < MAX_CMD_PACK_SIZE,
49// but be careful if wanting to modify either.
50//
51#define MAX_OBUF_BLOCK 36
52
53// Another note on maximum block sizes: we are buffering packets here. Data is
54// put into the buffer (if there is room) regardless of the credits from the
55// board. The board sends new credits whenever it has removed from his buffers a
56// number of characters equal to 80% of total buffer size. (Of course, the total
57// buffer size is what is reported when the very first set of flow control
58// status packets are received from the board. Therefore, to be robust, you must
59// always fill the board to at least 80% of the current credit limit, else you
60// might not give it enough to trigger a new report. These conditions are
61// obtained here so long as the maximum output block size is less than 20% the
62// size of the board's output buffers. This is true at present by "coincidence"
63// or "infernal knowledge": the board's output buffers are at least 700 bytes
64// long (20% = 140 bytes, at least). The 80% figure is "official", so the safest
65// strategy might be to trap the first flow control report and guarantee that
66// the effective maxObufBlock is the minimum of MAX_OBUF_BLOCK and 20% of first
67// reported buffer credit.
68//
69#define MAX_CBUF_BLOCK 6 // Maximum total length of a bypass command block
70
71#define IBUF_SIZE 512 // character capacity of input buffer per channel
72#define OBUF_SIZE 1024// character capacity of output buffer per channel
73#define CBUF_SIZE 10 // character capacity of output bypass buffer
74
75typedef struct _i2ChanStr
76{
77 // First, back-pointers so that given a pointer to this structure, you can
78 // determine the correct board and channel number to reference, (say, when
79 // issuing commands, etc. (Note, channel number is in infl.hd.i2sChannel.)
80
81 int port_index; // Index of port in channel structure array attached
82 // to board structure.
83 PTTY pTTY; // Pointer to tty structure for port (OS specific)
84 USHORT validity; // Indicates whether the given channel has been
85 // initialized, really exists (or is a missing
86 // channel, e.g. channel 9 on an 8-port box.)
87
88 i2eBordStrPtr pMyBord; // Back-pointer to this channel's board structure
89
90 int wopen; // waiting fer carrier
91
92 int throttled; // Set if upper layer can take no data
93
94 int flags; // Defined in tty.h
95
96 PWAITQ open_wait; // Pointer for OS sleep function.
97 PWAITQ close_wait; // Pointer for OS sleep function.
98 PWAITQ delta_msr_wait;// Pointer for OS sleep function.
99 PWAITQ dss_now_wait; // Pointer for OS sleep function.
100
101 struct timer_list BookmarkTimer; // Used by i2DrainOutput
102 wait_queue_head_t pBookmarkWait; // Used by i2DrainOutput
103
104 int BaudBase;
105 int BaudDivisor;
106
107 USHORT ClosingDelay;
108 USHORT ClosingWaitTime;
109
110 volatile
111 flowIn infl; // This structure is initialized as a completely
112 // formed flow-control command packet, and as such
113 // has the channel number, also the capacity and
114 // "as-of" data needed continuously.
115
116 USHORT sinceLastFlow; // Counts the number of characters read from input
117 // buffers, since the last time flow control info
118 // was sent.
119
120 USHORT whenSendFlow; // Determines when new flow control is to be sent to
121 // the board. Note unlike earlier manifestations of
122 // the driver, these packets can be sent from
123 // in-place.
124
125 USHORT channelNeeds; // Bit map of important things which must be done
126 // for this channel. (See bits below )
127
128 volatile
129 flowStat outfl; // Same type of structure is used to hold current
130 // flow control information used to control our
131 // output. "asof" is kept updated as data is sent,
132 // and "room" never goes to zero.
133
134 // The incoming ring buffer
135 // Unlike the outgoing buffers, this holds raw data, not packets. The two
136 // extra bytes are used to hold the byte-padding when there is room for an
137 // odd number of bytes before we must wrap.
138 //
139 UCHAR Ibuf[IBUF_SIZE + 2];
140 volatile
141 USHORT Ibuf_stuff; // Stuffing index
142 volatile
143 USHORT Ibuf_strip; // Stripping index
144
145 // The outgoing ring-buffer: Holds Data and command packets. N.B., even
146 // though these are in the channel structure, the channel is also written
147 // here, the easier to send it to the fifo when ready. HOWEVER, individual
148 // packets here are NOT padded to even length: the routines for writing
149 // blocks to the fifo will pad to even byte counts.
150 //
151 UCHAR Obuf[OBUF_SIZE+MAX_OBUF_BLOCK+4];
152 volatile
153 USHORT Obuf_stuff; // Stuffing index
154 volatile
155 USHORT Obuf_strip; // Stripping index
156 int Obuf_char_count;
157
158 // The outgoing bypass-command buffer. Unlike earlier manifestations, the
159 // flow control packets are sent directly from the structures. As above, the
160 // channel number is included in the packet, but they are NOT padded to even
161 // size.
162 //
163 UCHAR Cbuf[CBUF_SIZE+MAX_CBUF_BLOCK+2];
164 volatile
165 USHORT Cbuf_stuff; // Stuffing index
166 volatile
167 USHORT Cbuf_strip; // Stripping index
168
169 // The temporary buffer for the Linux tty driver PutChar entry.
170 //
171 UCHAR Pbuf[MAX_OBUF_BLOCK - sizeof (i2DataHeader)];
172 volatile
173 USHORT Pbuf_stuff; // Stuffing index
174
175 // The state of incoming data-set signals
176 //
177 USHORT dataSetIn; // Bit-mapped according to below. Also indicates
178 // whether a break has been detected since last
179 // inquiry.
180
181 // The state of outcoming data-set signals (as far as we can tell!)
182 //
183 USHORT dataSetOut; // Bit-mapped according to below.
184
185 // Most recent hot-key identifier detected
186 //
187 USHORT hotKeyIn; // Hot key as sent by the board, HOT_CLEAR indicates
188 // no hot key detected since last examined.
189
190 // Counter of outstanding requests for bookmarks
191 //
192 short bookMarks; // Number of outstanding bookmark requests, (+ive
193 // whenever a bookmark request if queued up, -ive
194 // whenever a bookmark is received).
195
196 // Misc options
197 //
198 USHORT channelOptions; // See below
199
200 // To store various incoming special packets
201 //
202 debugStat channelStatus;
203 cntStat channelRcount;
204 cntStat channelTcount;
205 failStat channelFail;
206
207 // To store the last values for line characteristics we sent to the board.
208 //
209 int speed;
210
211 int flush_flags;
212
213 void (*trace)(unsigned short,unsigned char,unsigned char,unsigned long,...);
214
215 /*
216 * Kernel counters for the 4 input interrupts
217 */
218 struct async_icount icount;
219
220 /*
221 * Task queues for processing input packets from the board.
222 */
223 struct work_struct tqueue_input;
224 struct work_struct tqueue_status;
225 struct work_struct tqueue_hangup;
226
227 rwlock_t Ibuf_spinlock;
228 rwlock_t Obuf_spinlock;
229 rwlock_t Cbuf_spinlock;
230 rwlock_t Pbuf_spinlock;
231
232} i2ChanStr, *i2ChanStrPtr;
233
234//---------------------------------------------------
235// Manifests and bit-maps for elements in i2ChanStr
236//---------------------------------------------------
237//
238// flush flags
239//
240#define STARTFL_FLAG 1
241#define STOPFL_FLAG 2
242
243// validity
244//
245#define CHANNEL_MAGIC_BITS 0xff00
246#define CHANNEL_MAGIC 0x5300 // (validity & CHANNEL_MAGIC_BITS) ==
247 // CHANNEL_MAGIC --> structure good
248
249#define CHANNEL_SUPPORT 0x0001 // Indicates channel is supported, exists,
250 // and passed P.O.S.T.
251
252// channelNeeds
253//
254#define NEED_FLOW 1 // Indicates flow control has been queued
255#define NEED_INLINE 2 // Indicates inline commands or data queued
256#define NEED_BYPASS 4 // Indicates bypass commands queued
257#define NEED_CREDIT 8 // Indicates would be sending except has not sufficient
258 // credit. The data is still in the channel structure,
259 // but the channel is not enqueued in the board
260 // structure again until there is a credit received from
261 // the board.
262
263// dataSetIn (Also the bits for i2GetStatus return value)
264//
265#define I2_DCD 1
266#define I2_CTS 2
267#define I2_DSR 4
268#define I2_RI 8
269
270// dataSetOut (Also the bits for i2GetStatus return value)
271//
272#define I2_DTR 1
273#define I2_RTS 2
274
275// i2GetStatus() can optionally clear these bits
276//
277#define I2_BRK 0x10 // A break was detected
278#define I2_PAR 0x20 // A parity error was received
279#define I2_FRA 0x40 // A framing error was received
280#define I2_OVR 0x80 // An overrun error was received
281
282// i2GetStatus() automatically clears these bits */
283//
284#define I2_DDCD 0x100 // DCD changed from its former value
285#define I2_DCTS 0x200 // CTS changed from its former value
286#define I2_DDSR 0x400 // DSR changed from its former value
287#define I2_DRI 0x800 // RI changed from its former value
288
289// hotKeyIn
290//
291#define HOT_CLEAR 0x1322 // Indicates that no hot-key has been detected
292
293// channelOptions
294//
295#define CO_NBLOCK_WRITE 1 // Writes don't block waiting for buffer. (Default
296 // is, they do wait.)
297
298// fcmodes
299//
300#define I2_OUTFLOW_CTS 0x0001
301#define I2_INFLOW_RTS 0x0002
302#define I2_INFLOW_DSR 0x0004
303#define I2_INFLOW_DTR 0x0008
304#define I2_OUTFLOW_DSR 0x0010
305#define I2_OUTFLOW_DTR 0x0020
306#define I2_OUTFLOW_XON 0x0040
307#define I2_OUTFLOW_XANY 0x0080
308#define I2_INFLOW_XON 0x0100
309
310#define I2_CRTSCTS (I2_OUTFLOW_CTS|I2_INFLOW_RTS)
311#define I2_IXANY_MODE (I2_OUTFLOW_XON|I2_OUTFLOW_XANY)
312
313//-------------------------------------------
314// Macros used from user level like functions
315//-------------------------------------------
316
317// Macros to set and clear channel options
318//
319#define i2SetOption(pCh, option) pCh->channelOptions |= option
320#define i2ClrOption(pCh, option) pCh->channelOptions &= ~option
321
322// Macro to set fatal-error trap
323//
324#define i2SetFatalTrap(pB, routine) pB->i2eFatalTrap = routine
325
326//--------------------------------------------
327// Declarations and prototypes for i2lib.c
328//--------------------------------------------
329//
330static int i2InitChannels(i2eBordStrPtr, int, i2ChanStrPtr);
331static int i2QueueCommands(int, i2ChanStrPtr, int, int, cmdSyntaxPtr,...);
332static int i2GetStatus(i2ChanStrPtr, int);
333static int i2Input(i2ChanStrPtr);
334static int i2InputFlush(i2ChanStrPtr);
335static int i2Output(i2ChanStrPtr, const char *, int, int);
336static int i2OutputFree(i2ChanStrPtr);
337static int i2ServiceBoard(i2eBordStrPtr);
338static void i2DrainOutput(i2ChanStrPtr, int);
339
340#ifdef IP2DEBUG_TRACE
341void ip2trace(unsigned short,unsigned char,unsigned char,unsigned long,...);
342#else
343#define ip2trace(a,b,c,d...) do {} while (0)
344#endif
345
346// Argument to i2QueueCommands
347//
348#define C_IN_LINE 1
349#define C_BYPASS 0
350
351#endif // I2LIB_H
diff --git a/drivers/char/ip2/i2os.h b/drivers/char/ip2/i2os.h
new file mode 100644
index 000000000000..eff9b542d699
--- /dev/null
+++ b/drivers/char/ip2/i2os.h
@@ -0,0 +1,127 @@
1/*******************************************************************************
2*
3* (c) 1999 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Defines, definitions and includes which are heavily dependent
12* on O/S, host, compiler, etc. This file is tailored for:
13* Linux v2.0.0 and later
14* Gnu gcc c2.7.2
15* 80x86 architecture
16*
17*******************************************************************************/
18
19#ifndef I2OS_H /* To prevent multiple includes */
20#define I2OS_H 1
21
22//-------------------------------------------------
23// Required Includes
24//-------------------------------------------------
25
26#include "ip2types.h"
27#include <asm/io.h> /* For inb, etc */
28
29//------------------------------------
30// Defines for I/O instructions:
31//------------------------------------
32
33#define INB(port) inb(port)
34#define OUTB(port,value) outb((value),(port))
35#define INW(port) inw(port)
36#define OUTW(port,value) outw((value),(port))
37#define OUTSW(port,addr,count) outsw((port),(addr),(((count)+1)/2))
38#define OUTSB(port,addr,count) outsb((port),(addr),(((count)+1))&-2)
39#define INSW(port,addr,count) insw((port),(addr),(((count)+1)/2))
40#define INSB(port,addr,count) insb((port),(addr),(((count)+1))&-2)
41
42//--------------------------------------------
43// Interrupt control
44//--------------------------------------------
45
46#define LOCK_INIT(a) rwlock_init(a)
47
48#define SAVE_AND_DISABLE_INTS(a,b) { \
49 /* printk("get_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
50 spin_lock_irqsave(a,b); \
51}
52
53#define RESTORE_INTS(a,b) { \
54 /* printk("rel_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
55 spin_unlock_irqrestore(a,b); \
56}
57
58#define READ_LOCK_IRQSAVE(a,b) { \
59 /* printk("get_read_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
60 read_lock_irqsave(a,b); \
61}
62
63#define READ_UNLOCK_IRQRESTORE(a,b) { \
64 /* printk("rel_read_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
65 read_unlock_irqrestore(a,b); \
66}
67
68#define WRITE_LOCK_IRQSAVE(a,b) { \
69 /* printk("get_write_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
70 write_lock_irqsave(a,b); \
71}
72
73#define WRITE_UNLOCK_IRQRESTORE(a,b) { \
74 /* printk("rel_write_lock: 0x%x,%4d,%s\n",(int)a,__LINE__,__FILE__);*/ \
75 write_unlock_irqrestore(a,b); \
76}
77
78
79//------------------------------------------------------------------------------
80// Hardware-delay loop
81//
82// Probably used in only one place (see i2ellis.c) but this helps keep things
83// together. Note we have unwound the IN instructions. On machines with a
84// reasonable cache, the eight instructions (1 byte each) should fit in cache
85// nicely, and on un-cached machines, the code-fetch would tend not to dominate.
86// Note that cx is shifted so that "count" still reflects the total number of
87// iterations assuming no unwinding.
88//------------------------------------------------------------------------------
89
90//#define DELAY1MS(port,count,label)
91
92//------------------------------------------------------------------------------
93// Macros to switch to a new stack, saving stack pointers, and to restore the
94// old stack (Used, for example, in i2lib.c) "heap" is the address of some
95// buffer which will become the new stack (working down from highest address).
96// The two words at the two lowest addresses in this stack are for storing the
97// SS and SP.
98//------------------------------------------------------------------------------
99
100//#define TO_NEW_STACK(heap,size)
101//#define TO_OLD_STACK(heap)
102
103//------------------------------------------------------------------------------
104// Macros to save the original IRQ vectors and masks, and to patch in new ones.
105//------------------------------------------------------------------------------
106
107//#define SAVE_IRQ_MASKS(dest)
108//#define WRITE_IRQ_MASKS(src)
109//#define SAVE_IRQ_VECTOR(value,dest)
110//#define WRITE_IRQ_VECTOR(value,src)
111
112//------------------------------------------------------------------------------
113// Macro to copy data from one far pointer to another.
114//------------------------------------------------------------------------------
115
116#define I2_MOVE_DATA(fpSource,fpDest,count) memmove(fpDest,fpSource,count);
117
118//------------------------------------------------------------------------------
119// Macros to issue eoi's to host interrupt control (IBM AT 8259-style).
120//------------------------------------------------------------------------------
121
122//#define MASTER_EOI
123//#define SLAVE_EOI
124
125#endif /* I2OS_H */
126
127
diff --git a/drivers/char/ip2/i2pack.h b/drivers/char/ip2/i2pack.h
new file mode 100644
index 000000000000..e9b87a78622c
--- /dev/null
+++ b/drivers/char/ip2/i2pack.h
@@ -0,0 +1,364 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Definitions of the packets used to transfer data and commands
12* Host <--> Board. Information provided here is only applicable
13* when the standard loadware is active.
14*
15*******************************************************************************/
16#ifndef I2PACK_H
17#define I2PACK_H 1
18
19//-----------------------------------------------
20// Revision History:
21//
22// 10 October 1991 MAG First draft
23// 24 February 1992 MAG Additions for 1.4.x loadware
24// 11 March 1992 MAG New status packets
25//
26//-----------------------------------------------
27
28//------------------------------------------------------------------------------
29// Packet Formats:
30//
31// Information passes between the host and board through the FIFO in packets.
32// These have headers which indicate the type of packet. Because the fifo data
33// path may be 16-bits wide, the protocol is constrained such that each packet
34// is always padded to an even byte count. (The lower-level interface routines
35// -- i2ellis.c -- are designed to do this).
36//
37// The sender (be it host or board) must place some number of complete packets
38// in the fifo, then place a message in the mailbox that packets are available.
39// Placing such a message interrupts the "receiver" (be it board or host), who
40// reads the mailbox message and determines that there are incoming packets
41// ready. Since there are no partial packets, and the length of a packet is
42// given in the header, the remainder of the packet can be read without checking
43// for FIFO empty condition. The process is repeated, packet by packet, until
44// the incoming FIFO is empty. Then the receiver uses the outbound mailbox to
45// signal the board that it has read the data. Only then can the sender place
46// additional data in the fifo.
47//------------------------------------------------------------------------------
48//
49//------------------------------------------------
50// Definition of Packet Header Area
51//------------------------------------------------
52//
53// Caution: these only define header areas. In actual use the data runs off
54// beyond the end of these structures.
55//
56// Since these structures are based on sequences of bytes which go to the board,
57// there cannot be ANY padding between the elements.
58#pragma pack(1)
59
60//----------------------------
61// DATA PACKETS
62//----------------------------
63
64typedef struct _i2DataHeader
65{
66 unsigned char i2sChannel; /* The channel number: 0-255 */
67
68 // -- Bitfields are allocated LSB first --
69
70 // For incoming data, indicates whether this is an ordinary packet or a
71 // special one (e.g., hot key hit).
72 unsigned i2sId : 2 __attribute__ ((__packed__));
73
74 // For tagging data packets. There are flush commands which flush only data
75 // packets bearing a particular tag. (used in implementing IntelliView and
76 // IntelliPrint). THE TAG VALUE 0xf is RESERVED and must not be used (it has
77 // meaning internally to the loadware).
78 unsigned i2sTag : 4;
79
80 // These two bits determine the type of packet sent/received.
81 unsigned i2sType : 2;
82
83 // The count of data to follow: does not include the possible additional
84 // padding byte. MAXIMUM COUNT: 4094. The top four bits must be 0.
85 unsigned short i2sCount;
86
87} i2DataHeader, *i2DataHeaderPtr;
88
89// Structure is immediately followed by the data, proper.
90
91//----------------------------
92// NON-DATA PACKETS
93//----------------------------
94
95typedef struct _i2CmdHeader
96{
97 unsigned char i2sChannel; // The channel number: 0-255 (Except where noted
98 // - see below
99
100 // Number of bytes of commands, status or whatever to follow
101 unsigned i2sCount : 6;
102
103 // These two bits determine the type of packet sent/received.
104 unsigned i2sType : 2;
105
106} i2CmdHeader, *i2CmdHeaderPtr;
107
108// Structure is immediately followed by the applicable data.
109
110//---------------------------------------
111// Flow Control Packets (Outbound)
112//---------------------------------------
113
114// One type of outbound command packet is so important that the entire structure
115// is explicitly defined here. That is the flow-control packet. This is never
116// sent by user-level code (as would be the commands to raise/lower DTR, for
117// example). These are only sent by the library routines in response to reading
118// incoming data into the buffers.
119//
120// The parameters inside the command block are maintained in place, then the
121// block is sent at the appropriate time.
122
123typedef struct _flowIn
124{
125 i2CmdHeader hd; // Channel #, count, type (see above)
126 unsigned char fcmd; // The flow control command (37)
127 unsigned short asof; // As of byte number "asof" (LSB first!) I have room
128 // for "room" bytes
129 unsigned short room;
130} flowIn, *flowInPtr;
131
132//----------------------------------------
133// (Incoming) Status Packets
134//----------------------------------------
135
136// Incoming packets which are non-data packets are status packets. In this case,
137// the channel number in the header is unimportant. What follows are one or more
138// sub-packets, the first word of which consists of the channel (first or low
139// byte) and the status indicator (second or high byte), followed by possibly
140// more data.
141
142#define STAT_CTS_UP 0 /* CTS raised (no other bytes) */
143#define STAT_CTS_DN 1 /* CTS dropped (no other bytes) */
144#define STAT_DCD_UP 2 /* DCD raised (no other bytes) */
145#define STAT_DCD_DN 3 /* DCD dropped (no other bytes) */
146#define STAT_DSR_UP 4 /* DSR raised (no other bytes) */
147#define STAT_DSR_DN 5 /* DSR dropped (no other bytes) */
148#define STAT_RI_UP 6 /* RI raised (no other bytes) */
149#define STAT_RI_DN 7 /* RI dropped (no other bytes) */
150#define STAT_BRK_DET 8 /* BRK detect (no other bytes) */
151#define STAT_FLOW 9 /* Flow control(-- more: see below */
152#define STAT_BMARK 10 /* Bookmark (no other bytes)
153 * Bookmark is sent as a response to
154 * a command 60: request for bookmark
155 */
156#define STAT_STATUS 11 /* Special packet: see below */
157#define STAT_TXCNT 12 /* Special packet: see below */
158#define STAT_RXCNT 13 /* Special packet: see below */
159#define STAT_BOXIDS 14 /* Special packet: see below */
160#define STAT_HWFAIL 15 /* Special packet: see below */
161
162#define STAT_MOD_ERROR 0xc0
163#define STAT_MODEM 0xc0/* If status & STAT_MOD_ERROR:
164 * == STAT_MODEM, then this is a modem
165 * status packet, given in response to a
166 * CMD_DSS_NOW command.
167 * The low nibble has each data signal:
168 */
169#define STAT_MOD_DCD 0x8
170#define STAT_MOD_RI 0x4
171#define STAT_MOD_DSR 0x2
172#define STAT_MOD_CTS 0x1
173
174#define STAT_ERROR 0x80/* If status & STAT_MOD_ERROR
175 * == STAT_ERROR, then
176 * sort of error on the channel.
177 * The remaining seven bits indicate
178 * what sort of error it is.
179 */
180/* The low three bits indicate parity, framing, or overrun errors */
181
182#define STAT_E_PARITY 4 /* Parity error */
183#define STAT_E_FRAMING 2 /* Framing error */
184#define STAT_E_OVERRUN 1 /* (uxart) overrun error */
185
186//---------------------------------------
187// STAT_FLOW packets
188//---------------------------------------
189
190typedef struct _flowStat
191{
192 unsigned short asof;
193 unsigned short room;
194}flowStat, *flowStatPtr;
195
196// flowStat packets are received from the board to regulate the flow of outgoing
197// data. A local copy of this structure is also kept to track the amount of
198// credits used and credits remaining. "room" is the amount of space in the
199// board's buffers, "as of" having received a certain byte number. When sending
200// data to the fifo, you must calculate how much buffer space your packet will
201// use. Add this to the current "asof" and subtract it from the current "room".
202//
203// The calculation for the board's buffer is given by CREDIT_USAGE, where size
204// is the un-rounded count of either data characters or command characters.
205// (Which is to say, the count rounded up, plus two).
206
207#define CREDIT_USAGE(size) (((size) + 3) & ~1)
208
209//---------------------------------------
210// STAT_STATUS packets
211//---------------------------------------
212
213typedef struct _debugStat
214{
215 unsigned char d_ccsr;
216 unsigned char d_txinh;
217 unsigned char d_stat1;
218 unsigned char d_stat2;
219} debugStat, *debugStatPtr;
220
221// debugStat packets are sent to the host in response to a CMD_GET_STATUS
222// command. Each byte is bit-mapped as described below:
223
224#define D_CCSR_XON 2 /* Has received XON, ready to transmit */
225#define D_CCSR_XOFF 4 /* Has received XOFF, not transmitting */
226#define D_CCSR_TXENAB 8 /* Transmitter is enabled */
227#define D_CCSR_RXENAB 0x80 /* Receiver is enabled */
228
229#define D_TXINH_BREAK 1 /* We are sending a break */
230#define D_TXINH_EMPTY 2 /* No data to send */
231#define D_TXINH_SUSP 4 /* Output suspended via command 57 */
232#define D_TXINH_CMD 8 /* We are processing an in-line command */
233#define D_TXINH_LCD 0x10 /* LCD diagnostics are running */
234#define D_TXINH_PAUSE 0x20 /* We are processing a PAUSE command */
235#define D_TXINH_DCD 0x40 /* DCD is low, preventing transmission */
236#define D_TXINH_DSR 0x80 /* DSR is low, preventing transmission */
237
238#define D_STAT1_TXEN 1 /* Transmit INTERRUPTS enabled */
239#define D_STAT1_RXEN 2 /* Receiver INTERRUPTS enabled */
240#define D_STAT1_MDEN 4 /* Modem (data set sigs) interrupts enabled */
241#define D_STAT1_RLM 8 /* Remote loopback mode selected */
242#define D_STAT1_LLM 0x10 /* Local internal loopback mode selected */
243#define D_STAT1_CTS 0x20 /* CTS is low, preventing transmission */
244#define D_STAT1_DTR 0x40 /* DTR is low, to stop remote transmission */
245#define D_STAT1_RTS 0x80 /* RTS is low, to stop remote transmission */
246
247#define D_STAT2_TXMT 1 /* Transmit buffers are all empty */
248#define D_STAT2_RXMT 2 /* Receive buffers are all empty */
249#define D_STAT2_RXINH 4 /* Loadware has tried to inhibit remote
250 * transmission: dropped DTR, sent XOFF,
251 * whatever...
252 */
253#define D_STAT2_RXFLO 8 /* Loadware can send no more data to host
254 * until it receives a flow-control packet
255 */
256//-----------------------------------------
257// STAT_TXCNT and STAT_RXCNT packets
258//----------------------------------------
259
260typedef struct _cntStat
261{
262 unsigned short cs_time; // (Assumes host is little-endian!)
263 unsigned short cs_count;
264} cntStat, *cntStatPtr;
265
266// These packets are sent in response to a CMD_GET_RXCNT or a CMD_GET_TXCNT
267// bypass command. cs_time is a running 1 Millisecond counter which acts as a
268// time stamp. cs_count is a running counter of data sent or received from the
269// uxarts. (Not including data added by the chip itself, as with CRLF
270// processing).
271//------------------------------------------
272// STAT_HWFAIL packets
273//------------------------------------------
274
275typedef struct _failStat
276{
277 unsigned char fs_written;
278 unsigned char fs_read;
279 unsigned short fs_address;
280} failStat, *failStatPtr;
281
282// This packet is sent whenever the on-board diagnostic process detects an
283// error. At startup, this process is dormant. The host can wake it up by
284// issuing the bypass command CMD_HW_TEST. The process runs at low priority and
285// performs continuous hardware verification; writing data to certain on-board
286// registers, reading it back, and comparing. If it detects an error, this
287// packet is sent to the host, and the process goes dormant again until the host
288// sends another CMD_HW_TEST. It then continues with the next register to be
289// tested.
290
291//------------------------------------------------------------------------------
292// Macros to deal with the headers more easily! Note that these are defined so
293// they may be used as "left" as well as "right" expressions.
294//------------------------------------------------------------------------------
295
296// Given a pointer to the packet, reference the channel number
297//
298#define CHANNEL_OF(pP) ((i2DataHeaderPtr)(pP))->i2sChannel
299
300// Given a pointer to the packet, reference the Packet type
301//
302#define PTYPE_OF(pP) ((i2DataHeaderPtr)(pP))->i2sType
303
304// The possible types of packets
305//
306#define PTYPE_DATA 0 /* Host <--> Board */
307#define PTYPE_BYPASS 1 /* Host ---> Board */
308#define PTYPE_INLINE 2 /* Host ---> Board */
309#define PTYPE_STATUS 2 /* Host <--- Board */
310
311// Given a pointer to a Data packet, reference the Tag
312//
313#define TAG_OF(pP) ((i2DataHeaderPtr)(pP))->i2sTag
314
315// Given a pointer to a Data packet, reference the data i.d.
316//
317#define ID_OF(pP) ((i2DataHeaderPtr)(pP))->i2sId
318
319// The possible types of ID's
320//
321#define ID_ORDINARY_DATA 0
322#define ID_HOT_KEY 1
323
324// Given a pointer to a Data packet, reference the count
325//
326#define DATA_COUNT_OF(pP) ((i2DataHeaderPtr)(pP))->i2sCount
327
328// Given a pointer to a Data packet, reference the beginning of data
329//
330#define DATA_OF(pP) &((unsigned char *)(pP))[4] // 4 = size of header
331
332// Given a pointer to a Non-Data packet, reference the count
333//
334#define CMD_COUNT_OF(pP) ((i2CmdHeaderPtr)(pP))->i2sCount
335
336#define MAX_CMD_PACK_SIZE 62 // Maximum size of such a count
337
338// Given a pointer to a Non-Data packet, reference the beginning of data
339//
340#define CMD_OF(pP) &((unsigned char *)(pP))[2] // 2 = size of header
341
342//--------------------------------
343// MailBox Bits:
344//--------------------------------
345
346//--------------------------
347// Outgoing (host to board)
348//--------------------------
349//
350#define MB_OUT_STUFFED 0x80 // Host has placed output in fifo
351#define MB_IN_STRIPPED 0x40 // Host has read in all input from fifo
352
353//--------------------------
354// Incoming (board to host)
355//--------------------------
356//
357#define MB_IN_STUFFED 0x80 // Board has placed input in fifo
358#define MB_OUT_STRIPPED 0x40 // Board has read all output from fifo
359#define MB_FATAL_ERROR 0x20 // Board has encountered a fatal error
360
361#pragma pack(4) // Reset padding to command-line default
362
363#endif // I2PACK_H
364
diff --git a/drivers/char/ip2/ip2.h b/drivers/char/ip2/ip2.h
new file mode 100644
index 000000000000..936ccc533949
--- /dev/null
+++ b/drivers/char/ip2/ip2.h
@@ -0,0 +1,107 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Driver constants for configuration and tuning
12*
13* NOTES:
14*
15*******************************************************************************/
16#ifndef IP2_H
17#define IP2_H
18
19#include "ip2types.h"
20#include "i2cmd.h"
21
22/*************/
23/* Constants */
24/*************/
25
26/* Device major numbers - since version 2.0.26. */
27#define IP2_TTY_MAJOR 71
28#define IP2_CALLOUT_MAJOR 72
29#define IP2_IPL_MAJOR 73
30
31/* Board configuration array.
32 * This array defines the hardware irq and address for up to IP2_MAX_BOARDS
33 * (4 supported per ip2_types.h) ISA board addresses and irqs MUST be specified,
34 * PCI and EISA boards are probed for and automagicly configed
35 * iff the addresses are set to 1 and 2 respectivily.
36 * 0x0100 - 0x03f0 == ISA
37 * 1 == PCI
38 * 2 == EISA
39 * 0 == (skip this board)
40 * This array defines the hardware addresses for them. Special
41 * addresses are EISA and PCI which go sniffing for boards.
42
43 * In a multiboard system the position in the array determines which port
44 * devices are assigned to each board:
45 * board 0 is assigned ttyF0.. to ttyF63,
46 * board 1 is assigned ttyF64 to ttyF127,
47 * board 2 is assigned ttyF128 to ttyF191,
48 * board 3 is assigned ttyF192 to ttyF255.
49 *
50 * In PCI and EISA bus systems each range is mapped to card in
51 * monotonically increasing slot number order, ISA position is as specified
52 * here.
53
54 * If the irqs are ALL set to 0,0,0,0 all boards operate in
55 * polled mode. For interrupt operation ISA boards require that the IRQ be
56 * specified, while PCI and EISA boards any nonzero entry
57 * will enable interrupts using the BIOS configured irq for the board.
58 * An invalid irq entry will default to polled mode for that card and print
59 * console warning.
60
61 * When the driver is loaded as a module these setting can be overridden on the
62 * modprobe command line or on an option line in /etc/modprobe.conf.
63 * If the driver is built-in the configuration must be
64 * set here for ISA cards and address set to 1 and 2 for PCI and EISA.
65 *
66 * Here is an example that shows most if not all possibe combinations:
67
68 *static ip2config_t ip2config =
69 *{
70 * {11,1,0,0}, // irqs
71 * { // Addresses
72 * 0x0308, // Board 0, ttyF0 - ttyF63// ISA card at io=0x308, irq=11
73 * 0x0001, // Board 1, ttyF64 - ttyF127//PCI card configured by BIOS
74 * 0x0000, // Board 2, ttyF128 - ttyF191// Slot skipped
75 * 0x0002 // Board 3, ttyF192 - ttyF255//EISA card configured by BIOS
76 * // but polled not irq driven
77 * }
78 *};
79 */
80
81 /* this structure is zeroed out because the suggested method is to configure
82 * the driver as a module, set up the parameters with an options line in
83 * /etc/modprobe.conf and load with modprobe or kmod, the kernel
84 * module loader
85 */
86
87 /* This structure is NOW always initialized when the driver is initialized.
88 * Compiled in defaults MUST be added to the io and irq arrays in
89 * ip2.c. Those values are configurable from insmod parameters in the
90 * case of modules or from command line parameters (ip2=io,irq) when
91 * compiled in.
92 */
93
94static ip2config_t ip2config =
95{
96 {0,0,0,0}, // irqs
97 { // Addresses
98 /* Do NOT set compile time defaults HERE! Use the arrays in
99 ip2.c! These WILL be overwritten! =mhw= */
100 0x0000, // Board 0, ttyF0 - ttyF63
101 0x0000, // Board 1, ttyF64 - ttyF127
102 0x0000, // Board 2, ttyF128 - ttyF191
103 0x0000 // Board 3, ttyF192 - ttyF255
104 }
105};
106
107#endif
diff --git a/drivers/char/ip2/ip2ioctl.h b/drivers/char/ip2/ip2ioctl.h
new file mode 100644
index 000000000000..aa0a9da85e05
--- /dev/null
+++ b/drivers/char/ip2/ip2ioctl.h
@@ -0,0 +1,35 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Driver constants for configuration and tuning
12*
13* NOTES:
14*
15*******************************************************************************/
16
17#ifndef IP2IOCTL_H
18#define IP2IOCTL_H
19
20//*************
21//* Constants *
22//*************
23
24// High baud rates (if not defined elsewhere.
25#ifndef B153600
26# define B153600 0010005
27#endif
28#ifndef B307200
29# define B307200 0010006
30#endif
31#ifndef B921600
32# define B921600 0010007
33#endif
34
35#endif
diff --git a/drivers/char/ip2/ip2trace.h b/drivers/char/ip2/ip2trace.h
new file mode 100644
index 000000000000..da20435dc8a6
--- /dev/null
+++ b/drivers/char/ip2/ip2trace.h
@@ -0,0 +1,42 @@
1
2//
3union ip2breadcrumb
4{
5 struct {
6 unsigned char port, cat, codes, label;
7 } __attribute__ ((packed)) hdr;
8 unsigned long value;
9};
10
11#define ITRC_NO_PORT 0xFF
12#define CHANN (pCh->port_index)
13
14#define ITRC_ERROR '!'
15#define ITRC_INIT 'A'
16#define ITRC_OPEN 'B'
17#define ITRC_CLOSE 'C'
18#define ITRC_DRAIN 'D'
19#define ITRC_IOCTL 'E'
20#define ITRC_FLUSH 'F'
21#define ITRC_STATUS 'G'
22#define ITRC_HANGUP 'H'
23#define ITRC_INTR 'I'
24#define ITRC_SFLOW 'J'
25#define ITRC_SBCMD 'K'
26#define ITRC_SICMD 'L'
27#define ITRC_MODEM 'M'
28#define ITRC_INPUT 'N'
29#define ITRC_OUTPUT 'O'
30#define ITRC_PUTC 'P'
31#define ITRC_QUEUE 'Q'
32#define ITRC_STFLW 'R'
33#define ITRC_SFIFO 'S'
34#define ITRC_VERIFY 'V'
35#define ITRC_WRITE 'W'
36
37#define ITRC_ENTER 0x00
38#define ITRC_RETURN 0xFF
39
40#define ITRC_QUEUE_ROOM 2
41#define ITRC_QUEUE_CMD 6
42
diff --git a/drivers/char/ip2/ip2types.h b/drivers/char/ip2/ip2types.h
new file mode 100644
index 000000000000..9d67b260b2f6
--- /dev/null
+++ b/drivers/char/ip2/ip2types.h
@@ -0,0 +1,57 @@
1/*******************************************************************************
2*
3* (c) 1998 by Computone Corporation
4*
5********************************************************************************
6*
7*
8* PACKAGE: Linux tty Device Driver for IntelliPort II family of multiport
9* serial I/O controllers.
10*
11* DESCRIPTION: Driver constants and type definitions.
12*
13* NOTES:
14*
15*******************************************************************************/
16#ifndef IP2TYPES_H
17#define IP2TYPES_H
18
19//*************
20//* Constants *
21//*************
22
23// Define some limits for this driver. Ports per board is a hardware limitation
24// that will not change. Current hardware limits this to 64 ports per board.
25// Boards per driver is a self-imposed limit.
26//
27#define IP2_MAX_BOARDS 4
28#define IP2_PORTS_PER_BOARD ABS_MOST_PORTS
29#define IP2_MAX_PORTS (IP2_MAX_BOARDS*IP2_PORTS_PER_BOARD)
30
31#define ISA 0
32#define PCI 1
33#define EISA 2
34
35//********************
36//* Type Definitions *
37//********************
38
39typedef struct tty_struct * PTTY;
40typedef wait_queue_head_t PWAITQ;
41
42typedef unsigned char UCHAR;
43typedef unsigned int UINT;
44typedef unsigned short USHORT;
45typedef unsigned long ULONG;
46
47typedef struct
48{
49 short irq[IP2_MAX_BOARDS];
50 unsigned short addr[IP2_MAX_BOARDS];
51 int type[IP2_MAX_BOARDS];
52#ifdef CONFIG_PCI
53 struct pci_dev *pci_dev[IP2_MAX_BOARDS];
54#endif
55} ip2config_t;
56
57#endif