]> git.proxmox.com Git - mirror_edk2.git/commitdiff
AppPkg/Applications/Python/Python-2.7.10: Initial Checkin part 2/5.
authorDaryl McDaniel <edk2-lists@mc2research.org>
Sat, 7 Nov 2015 19:25:02 +0000 (19:25 +0000)
committerdarylm503 <darylm503@Edk2>
Sat, 7 Nov 2015 19:25:02 +0000 (19:25 +0000)
The Modules directory from the cPython 2.7.10 distribution.
These files are unchanged and set the baseline for subsequent commits.

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daryl McDaniel <edk2-lists@mc2research.org>
git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@18738 6f19259b-4bc3-4df7-8a09-765794883524

128 files changed:
AppPkg/Applications/Python/Python-2.7.10/Modules/_bisectmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_codecsmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_collectionsmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_csv.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_functoolsmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_heapqmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bufferedio.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bytesio.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/fileio.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/iobase.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/stringio.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_io/textio.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_json.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_localemodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_math.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_math.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_randommodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_struct.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/addrinfo.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/arraymodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/binascii.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cPickle.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cStringIO.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/README [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_cn.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_hk.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_iso2022.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_jp.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_kr.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_tw.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/alg_jisx0201.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/cjkcodecs.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/emu_jisx0213_2000.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_cn.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_hk.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jisx0213_pair.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jp.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_kr.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_tw.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/cmathmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/datetimemodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/COPYING [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/ascii.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/asciitab.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat_external.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/iasciitab.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/internal.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/latin1tab.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/nametab.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/utf8tab.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlparse.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_ns.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/future_builtins.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/gcmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/getbuildinfo.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/itertoolsmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/mathmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/md5.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/md5.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/md5module.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/operator.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/parsermodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/pyexpat.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/python.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/sha256module.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/sha512module.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/shamodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/signalmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/sre.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/sre_constants.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/stropmodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/symtablemodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/timemodule.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata_db.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/unicodename_db.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/xxsubtype.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zipimport.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/ChangeLog [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/FAQ [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/INDEX [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/README [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/adler32.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/algorithm.txt [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/compress.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/configure [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/example.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzclose.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzguts.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzlib.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzread.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzwrite.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/infback.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffixed.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/minigzip.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/uncompr.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zconf.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.3 [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.c [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.h [new file with mode: 0644]
AppPkg/Applications/Python/Python-2.7.10/Modules/zlibmodule.c [new file with mode: 0644]

diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_bisectmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_bisectmodule.c
new file mode 100644 (file)
index 0000000..e4f02f0
--- /dev/null
@@ -0,0 +1,246 @@
+/* Bisection algorithms. Drop in replacement for bisect.py\r
+\r
+Converted to C by Dmitry Vasiliev (dima at hlabs.spb.ru).\r
+*/\r
+\r
+#include "Python.h"\r
+\r
+static Py_ssize_t\r
+internal_bisect_right(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi)\r
+{\r
+    PyObject *litem;\r
+    Py_ssize_t mid, res;\r
+\r
+    if (lo < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "lo must be non-negative");\r
+        return -1;\r
+    }\r
+    if (hi == -1) {\r
+        hi = PySequence_Size(list);\r
+        if (hi < 0)\r
+            return -1;\r
+    }\r
+    while (lo < hi) {\r
+        /* The (size_t)cast ensures that the addition and subsequent division\r
+           are performed as unsigned operations, avoiding difficulties from\r
+           signed overflow.  (See issue 13496.) */\r
+        mid = ((size_t)lo + hi) / 2;\r
+        litem = PySequence_GetItem(list, mid);\r
+        if (litem == NULL)\r
+            return -1;\r
+        res = PyObject_RichCompareBool(item, litem, Py_LT);\r
+        Py_DECREF(litem);\r
+        if (res < 0)\r
+            return -1;\r
+        if (res)\r
+            hi = mid;\r
+        else\r
+            lo = mid + 1;\r
+    }\r
+    return lo;\r
+}\r
+\r
+static PyObject *\r
+bisect_right(PyObject *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *list, *item;\r
+    Py_ssize_t lo = 0;\r
+    Py_ssize_t hi = -1;\r
+    Py_ssize_t index;\r
+    static char *keywords[] = {"a", "x", "lo", "hi", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_right",\r
+        keywords, &list, &item, &lo, &hi))\r
+        return NULL;\r
+    index = internal_bisect_right(list, item, lo, hi);\r
+    if (index < 0)\r
+        return NULL;\r
+    return PyInt_FromSsize_t(index);\r
+}\r
+\r
+PyDoc_STRVAR(bisect_right_doc,\r
+"bisect(a, x[, lo[, hi]]) -> index\n\\r
+bisect_right(a, x[, lo[, hi]]) -> index\n\\r
+\n\\r
+Return the index where to insert item x in list a, assuming a is sorted.\n\\r
+\n\\r
+The return value i is such that all e in a[:i] have e <= x, and all e in\n\\r
+a[i:] have e > x.  So if x already appears in the list, i points just\n\\r
+beyond the rightmost x already there\n\\r
+\n\\r
+Optional args lo (default 0) and hi (default len(a)) bound the\n\\r
+slice of a to be searched.\n");\r
+\r
+static PyObject *\r
+insort_right(PyObject *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *list, *item, *result;\r
+    Py_ssize_t lo = 0;\r
+    Py_ssize_t hi = -1;\r
+    Py_ssize_t index;\r
+    static char *keywords[] = {"a", "x", "lo", "hi", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_right",\r
+        keywords, &list, &item, &lo, &hi))\r
+        return NULL;\r
+    index = internal_bisect_right(list, item, lo, hi);\r
+    if (index < 0)\r
+        return NULL;\r
+    if (PyList_CheckExact(list)) {\r
+        if (PyList_Insert(list, index, item) < 0)\r
+            return NULL;\r
+    } else {\r
+        result = PyObject_CallMethod(list, "insert", "nO",\r
+                                     index, item);\r
+        if (result == NULL)\r
+            return NULL;\r
+        Py_DECREF(result);\r
+    }\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(insort_right_doc,\r
+"insort(a, x[, lo[, hi]])\n\\r
+insort_right(a, x[, lo[, hi]])\n\\r
+\n\\r
+Insert item x in list a, and keep it sorted assuming a is sorted.\n\\r
+\n\\r
+If x is already in a, insert it to the right of the rightmost x.\n\\r
+\n\\r
+Optional args lo (default 0) and hi (default len(a)) bound the\n\\r
+slice of a to be searched.\n");\r
+\r
+static Py_ssize_t\r
+internal_bisect_left(PyObject *list, PyObject *item, Py_ssize_t lo, Py_ssize_t hi)\r
+{\r
+    PyObject *litem;\r
+    Py_ssize_t mid, res;\r
+\r
+    if (lo < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "lo must be non-negative");\r
+        return -1;\r
+    }\r
+    if (hi == -1) {\r
+        hi = PySequence_Size(list);\r
+        if (hi < 0)\r
+            return -1;\r
+    }\r
+    while (lo < hi) {\r
+        /* The (size_t)cast ensures that the addition and subsequent division\r
+           are performed as unsigned operations, avoiding difficulties from\r
+           signed overflow.  (See issue 13496.) */\r
+        mid = ((size_t)lo + hi) / 2;\r
+        litem = PySequence_GetItem(list, mid);\r
+        if (litem == NULL)\r
+            return -1;\r
+        res = PyObject_RichCompareBool(litem, item, Py_LT);\r
+        Py_DECREF(litem);\r
+        if (res < 0)\r
+            return -1;\r
+        if (res)\r
+            lo = mid + 1;\r
+        else\r
+            hi = mid;\r
+    }\r
+    return lo;\r
+}\r
+\r
+static PyObject *\r
+bisect_left(PyObject *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *list, *item;\r
+    Py_ssize_t lo = 0;\r
+    Py_ssize_t hi = -1;\r
+    Py_ssize_t index;\r
+    static char *keywords[] = {"a", "x", "lo", "hi", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:bisect_left",\r
+        keywords, &list, &item, &lo, &hi))\r
+        return NULL;\r
+    index = internal_bisect_left(list, item, lo, hi);\r
+    if (index < 0)\r
+        return NULL;\r
+    return PyInt_FromSsize_t(index);\r
+}\r
+\r
+PyDoc_STRVAR(bisect_left_doc,\r
+"bisect_left(a, x[, lo[, hi]]) -> index\n\\r
+\n\\r
+Return the index where to insert item x in list a, assuming a is sorted.\n\\r
+\n\\r
+The return value i is such that all e in a[:i] have e < x, and all e in\n\\r
+a[i:] have e >= x.  So if x already appears in the list, i points just\n\\r
+before the leftmost x already there.\n\\r
+\n\\r
+Optional args lo (default 0) and hi (default len(a)) bound the\n\\r
+slice of a to be searched.\n");\r
+\r
+static PyObject *\r
+insort_left(PyObject *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *list, *item, *result;\r
+    Py_ssize_t lo = 0;\r
+    Py_ssize_t hi = -1;\r
+    Py_ssize_t index;\r
+    static char *keywords[] = {"a", "x", "lo", "hi", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "OO|nn:insort_left",\r
+        keywords, &list, &item, &lo, &hi))\r
+        return NULL;\r
+    index = internal_bisect_left(list, item, lo, hi);\r
+    if (index < 0)\r
+        return NULL;\r
+    if (PyList_CheckExact(list)) {\r
+        if (PyList_Insert(list, index, item) < 0)\r
+            return NULL;\r
+    } else {\r
+        result = PyObject_CallMethod(list, "insert", "nO",\r
+                                     index, item);\r
+        if (result == NULL)\r
+            return NULL;\r
+        Py_DECREF(result);\r
+    }\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(insort_left_doc,\r
+"insort_left(a, x[, lo[, hi]])\n\\r
+\n\\r
+Insert item x in list a, and keep it sorted assuming a is sorted.\n\\r
+\n\\r
+If x is already in a, insert it to the left of the leftmost x.\n\\r
+\n\\r
+Optional args lo (default 0) and hi (default len(a)) bound the\n\\r
+slice of a to be searched.\n");\r
+\r
+static PyMethodDef bisect_methods[] = {\r
+    {"bisect_right", (PyCFunction)bisect_right,\r
+        METH_VARARGS|METH_KEYWORDS, bisect_right_doc},\r
+    {"bisect", (PyCFunction)bisect_right,\r
+        METH_VARARGS|METH_KEYWORDS, bisect_right_doc},\r
+    {"insort_right", (PyCFunction)insort_right,\r
+        METH_VARARGS|METH_KEYWORDS, insort_right_doc},\r
+    {"insort", (PyCFunction)insort_right,\r
+        METH_VARARGS|METH_KEYWORDS, insort_right_doc},\r
+    {"bisect_left", (PyCFunction)bisect_left,\r
+        METH_VARARGS|METH_KEYWORDS, bisect_left_doc},\r
+    {"insort_left", (PyCFunction)insort_left,\r
+        METH_VARARGS|METH_KEYWORDS, insort_left_doc},\r
+    {NULL, NULL} /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Bisection algorithms.\n\\r
+\n\\r
+This module provides support for maintaining a list in sorted order without\n\\r
+having to sort the list after each insertion. For long lists of items with\n\\r
+expensive comparison operations, this can be an improvement over the more\n\\r
+common approach.\n");\r
+\r
+PyMODINIT_FUNC\r
+init_bisect(void)\r
+{\r
+    Py_InitModule3("_bisect", bisect_methods, module_doc);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_codecsmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_codecsmodule.c
new file mode 100644 (file)
index 0000000..b1e6f16
--- /dev/null
@@ -0,0 +1,1116 @@
+/* ------------------------------------------------------------------------\r
+\r
+   _codecs -- Provides access to the codec registry and the builtin\r
+              codecs.\r
+\r
+   This module should never be imported directly. The standard library\r
+   module "codecs" wraps this builtin module for use within Python.\r
+\r
+   The codec registry is accessible via:\r
+\r
+     register(search_function) -> None\r
+\r
+     lookup(encoding) -> CodecInfo object\r
+\r
+   The builtin Unicode codecs use the following interface:\r
+\r
+     <encoding>_encode(Unicode_object[,errors='strict']) ->\r
+        (string object, bytes consumed)\r
+\r
+     <encoding>_decode(char_buffer_obj[,errors='strict']) ->\r
+        (Unicode object, bytes consumed)\r
+\r
+   <encoding>_encode() interfaces also accept non-Unicode object as\r
+   input. The objects are then converted to Unicode using\r
+   PyUnicode_FromObject() prior to applying the conversion.\r
+\r
+   These <encoding>s are available: utf_8, unicode_escape,\r
+   raw_unicode_escape, unicode_internal, latin_1, ascii (7-bit),\r
+   mbcs (on win32).\r
+\r
+\r
+Written by Marc-Andre Lemburg (mal@lemburg.com).\r
+\r
+Copyright (c) Corporation for National Research Initiatives.\r
+\r
+   ------------------------------------------------------------------------ */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+\r
+/* --- Registry ----------------------------------------------------------- */\r
+\r
+PyDoc_STRVAR(register__doc__,\r
+"register(search_function)\n\\r
+\n\\r
+Register a codec search function. Search functions are expected to take\n\\r
+one argument, the encoding name in all lower case letters, and return\n\\r
+a tuple of functions (encoder, decoder, stream_reader, stream_writer)\n\\r
+(or a CodecInfo object).");\r
+\r
+static\r
+PyObject *codec_register(PyObject *self, PyObject *search_function)\r
+{\r
+    if (PyCodec_Register(search_function))\r
+        return NULL;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(lookup__doc__,\r
+"lookup(encoding) -> CodecInfo\n\\r
+\n\\r
+Looks up a codec tuple in the Python codec registry and returns\n\\r
+a CodecInfo object.");\r
+\r
+static\r
+PyObject *codec_lookup(PyObject *self, PyObject *args)\r
+{\r
+    char *encoding;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:lookup", &encoding))\r
+        return NULL;\r
+\r
+    return _PyCodec_Lookup(encoding);\r
+}\r
+\r
+PyDoc_STRVAR(encode__doc__,\r
+"encode(obj, [encoding[,errors]]) -> object\n\\r
+\n\\r
+Encodes obj using the codec registered for encoding. encoding defaults\n\\r
+to the default encoding. errors may be given to set a different error\n\\r
+handling scheme. Default is 'strict' meaning that encoding errors raise\n\\r
+a ValueError. Other possible values are 'ignore', 'replace' and\n\\r
+'xmlcharrefreplace' as well as any other name registered with\n\\r
+codecs.register_error that can handle ValueErrors.");\r
+\r
+static PyObject *\r
+codec_encode(PyObject *self, PyObject *args)\r
+{\r
+    const char *encoding = NULL;\r
+    const char *errors = NULL;\r
+    PyObject *v;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|ss:encode", &v, &encoding, &errors))\r
+        return NULL;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    if (encoding == NULL)\r
+        encoding = PyUnicode_GetDefaultEncoding();\r
+#else\r
+    if (encoding == NULL) {\r
+        PyErr_SetString(PyExc_ValueError, "no encoding specified");\r
+        return NULL;\r
+    }\r
+#endif\r
+\r
+    /* Encode via the codec registry */\r
+    return PyCodec_Encode(v, encoding, errors);\r
+}\r
+\r
+PyDoc_STRVAR(decode__doc__,\r
+"decode(obj, [encoding[,errors]]) -> object\n\\r
+\n\\r
+Decodes obj using the codec registered for encoding. encoding defaults\n\\r
+to the default encoding. errors may be given to set a different error\n\\r
+handling scheme. Default is 'strict' meaning that encoding errors raise\n\\r
+a ValueError. Other possible values are 'ignore' and 'replace'\n\\r
+as well as any other name registered with codecs.register_error that is\n\\r
+able to handle ValueErrors.");\r
+\r
+static PyObject *\r
+codec_decode(PyObject *self, PyObject *args)\r
+{\r
+    const char *encoding = NULL;\r
+    const char *errors = NULL;\r
+    PyObject *v;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|ss:decode", &v, &encoding, &errors))\r
+        return NULL;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    if (encoding == NULL)\r
+        encoding = PyUnicode_GetDefaultEncoding();\r
+#else\r
+    if (encoding == NULL) {\r
+        PyErr_SetString(PyExc_ValueError, "no encoding specified");\r
+        return NULL;\r
+    }\r
+#endif\r
+\r
+    /* Decode via the codec registry */\r
+    return PyCodec_Decode(v, encoding, errors);\r
+}\r
+\r
+/* --- Helpers ------------------------------------------------------------ */\r
+\r
+static\r
+PyObject *codec_tuple(PyObject *unicode,\r
+                      Py_ssize_t len)\r
+{\r
+    PyObject *v;\r
+    if (unicode == NULL)\r
+        return NULL;\r
+    v = Py_BuildValue("On", unicode, len);\r
+    Py_DECREF(unicode);\r
+    return v;\r
+}\r
+\r
+/* --- String codecs ------------------------------------------------------ */\r
+static PyObject *\r
+escape_decode(PyObject *self,\r
+              PyObject *args)\r
+{\r
+    const char *errors = NULL;\r
+    const char *data;\r
+    Py_ssize_t size;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|z:escape_decode",\r
+                          &data, &size, &errors))\r
+        return NULL;\r
+    return codec_tuple(PyString_DecodeEscape(data, size, errors, 0, NULL),\r
+                       size);\r
+}\r
+\r
+static PyObject *\r
+escape_encode(PyObject *self,\r
+              PyObject *args)\r
+{\r
+    PyObject *str;\r
+    const char *errors = NULL;\r
+    char *buf;\r
+    Py_ssize_t consumed, len;\r
+\r
+    if (!PyArg_ParseTuple(args, "S|z:escape_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    consumed = PyString_GET_SIZE(str);\r
+    str = PyString_Repr(str, 0);\r
+    if (!str)\r
+        return NULL;\r
+\r
+    /* The string will be quoted. Unquote, similar to unicode-escape. */\r
+    buf = PyString_AS_STRING (str);\r
+    len = PyString_GET_SIZE (str);\r
+    memmove(buf, buf+1, len-2);\r
+    if (_PyString_Resize(&str, len-2) < 0)\r
+        return NULL;\r
+\r
+    return codec_tuple(str, consumed);\r
+}\r
+\r
+#ifdef Py_USING_UNICODE\r
+/* --- Decoder ------------------------------------------------------------ */\r
+\r
+static PyObject *\r
+unicode_internal_decode(PyObject *self,\r
+                        PyObject *args)\r
+{\r
+    PyObject *obj;\r
+    const char *errors = NULL;\r
+    const char *data;\r
+    Py_ssize_t size;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_decode",\r
+                          &obj, &errors))\r
+        return NULL;\r
+\r
+    if (PyUnicode_Check(obj)) {\r
+        Py_INCREF(obj);\r
+        return codec_tuple(obj, PyUnicode_GET_SIZE(obj));\r
+    }\r
+    else {\r
+        if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))\r
+            return NULL;\r
+\r
+        return codec_tuple(_PyUnicode_DecodeUnicodeInternal(data, size, errors),\r
+                           size);\r
+    }\r
+}\r
+\r
+static PyObject *\r
+utf_7_decode(PyObject *self,\r
+             PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_7_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len;\r
+\r
+    decoded = PyUnicode_DecodeUTF7Stateful(pbuf.buf, pbuf.len, errors,\r
+                                           final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_8_decode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_8_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len;\r
+\r
+    decoded = PyUnicode_DecodeUTF8Stateful(pbuf.buf, pbuf.len, errors,\r
+                                           final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_16_decode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_16_le_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = -1;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_le_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,\r
+        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_16_be_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 1;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_16_be_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,\r
+        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+/* This non-standard version also provides access to the byteorder\r
+   parameter of the builtin UTF-16 codec.\r
+\r
+   It returns a tuple (unicode, bytesread, byteorder) with byteorder\r
+   being the value in effect at the end of data.\r
+\r
+*/\r
+\r
+static PyObject *\r
+utf_16_ex_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+    PyObject *unicode, *tuple;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zii:utf_16_ex_decode",\r
+                          &pbuf, &errors, &byteorder, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    unicode = PyUnicode_DecodeUTF16Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (unicode == NULL)\r
+        return NULL;\r
+    tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);\r
+    Py_DECREF(unicode);\r
+    return tuple;\r
+}\r
+\r
+static PyObject *\r
+utf_32_decode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_32_le_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = -1;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_le_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+static PyObject *\r
+utf_32_be_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 1;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:utf_32_be_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    decoded = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+/* This non-standard version also provides access to the byteorder\r
+   parameter of the builtin UTF-32 codec.\r
+\r
+   It returns a tuple (unicode, bytesread, byteorder) with byteorder\r
+   being the value in effect at the end of data.\r
+\r
+*/\r
+\r
+static PyObject *\r
+utf_32_ex_decode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+    PyObject *unicode, *tuple;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zii:utf_32_ex_decode",\r
+                          &pbuf, &errors, &byteorder, &final))\r
+        return NULL;\r
+    consumed = pbuf.len; /* This is overwritten unless final is true. */\r
+    unicode = PyUnicode_DecodeUTF32Stateful(pbuf.buf, pbuf.len, errors,\r
+                                        &byteorder, final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (unicode == NULL)\r
+        return NULL;\r
+    tuple = Py_BuildValue("Oni", unicode, consumed, byteorder);\r
+    Py_DECREF(unicode);\r
+    return tuple;\r
+}\r
+\r
+static PyObject *\r
+unicode_escape_decode(PyObject *self,\r
+                     PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+        PyObject *unicode;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|z:unicode_escape_decode",\r
+                          &pbuf, &errors))\r
+        return NULL;\r
+\r
+    unicode = PyUnicode_DecodeUnicodeEscape(pbuf.buf, pbuf.len, errors);\r
+    PyBuffer_Release(&pbuf);\r
+    return codec_tuple(unicode, pbuf.len);\r
+}\r
+\r
+static PyObject *\r
+raw_unicode_escape_decode(PyObject *self,\r
+                        PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    PyObject *unicode;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|z:raw_unicode_escape_decode",\r
+                          &pbuf, &errors))\r
+        return NULL;\r
+\r
+    unicode = PyUnicode_DecodeRawUnicodeEscape(pbuf.buf, pbuf.len, errors);\r
+    PyBuffer_Release(&pbuf);\r
+    return codec_tuple(unicode, pbuf.len);\r
+}\r
+\r
+static PyObject *\r
+latin_1_decode(PyObject *self,\r
+               PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    PyObject *unicode;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|z:latin_1_decode",\r
+                          &pbuf, &errors))\r
+        return NULL;\r
+\r
+    unicode = PyUnicode_DecodeLatin1(pbuf.buf, pbuf.len, errors);\r
+    PyBuffer_Release(&pbuf);\r
+    return codec_tuple(unicode, pbuf.len);\r
+}\r
+\r
+static PyObject *\r
+ascii_decode(PyObject *self,\r
+             PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    PyObject *unicode;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|z:ascii_decode",\r
+                          &pbuf, &errors))\r
+        return NULL;\r
+\r
+    unicode = PyUnicode_DecodeASCII(pbuf.buf, pbuf.len, errors);\r
+    PyBuffer_Release(&pbuf);\r
+    return codec_tuple(unicode, pbuf.len);\r
+}\r
+\r
+static PyObject *\r
+charmap_decode(PyObject *self,\r
+               PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    PyObject *unicode;\r
+    const char *errors = NULL;\r
+    PyObject *mapping = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zO:charmap_decode",\r
+                          &pbuf, &errors, &mapping))\r
+        return NULL;\r
+    if (mapping == Py_None)\r
+        mapping = NULL;\r
+\r
+    unicode = PyUnicode_DecodeCharmap(pbuf.buf, pbuf.len, mapping, errors);\r
+    PyBuffer_Release(&pbuf);\r
+    return codec_tuple(unicode, pbuf.len);\r
+}\r
+\r
+#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)\r
+\r
+static PyObject *\r
+mbcs_decode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    const char *errors = NULL;\r
+    int final = 0;\r
+    Py_ssize_t consumed;\r
+    PyObject *decoded = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|zi:mbcs_decode",\r
+                          &pbuf, &errors, &final))\r
+        return NULL;\r
+    consumed = pbuf.len;\r
+\r
+    decoded = PyUnicode_DecodeMBCSStateful(pbuf.buf, pbuf.len, errors,\r
+                                           final ? NULL : &consumed);\r
+    PyBuffer_Release(&pbuf);\r
+    if (decoded == NULL)\r
+        return NULL;\r
+    return codec_tuple(decoded, consumed);\r
+}\r
+\r
+#endif /* MS_WINDOWS */\r
+\r
+/* --- Encoder ------------------------------------------------------------ */\r
+\r
+static PyObject *\r
+readbuffer_encode(PyObject *self,\r
+                  PyObject *args)\r
+{\r
+    const char *data;\r
+    Py_ssize_t size;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|z:readbuffer_encode",\r
+                          &data, &size, &errors))\r
+        return NULL;\r
+\r
+    return codec_tuple(PyString_FromStringAndSize(data, size),\r
+                       size);\r
+}\r
+\r
+static PyObject *\r
+charbuffer_encode(PyObject *self,\r
+                  PyObject *args)\r
+{\r
+    const char *data;\r
+    Py_ssize_t size;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "t#|z:charbuffer_encode",\r
+                          &data, &size, &errors))\r
+        return NULL;\r
+\r
+    return codec_tuple(PyString_FromStringAndSize(data, size),\r
+                       size);\r
+}\r
+\r
+static PyObject *\r
+unicode_internal_encode(PyObject *self,\r
+                        PyObject *args)\r
+{\r
+    PyObject *obj;\r
+    const char *errors = NULL;\r
+    const char *data;\r
+    Py_ssize_t size;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:unicode_internal_encode",\r
+                          &obj, &errors))\r
+        return NULL;\r
+\r
+    if (PyUnicode_Check(obj)) {\r
+        data = PyUnicode_AS_DATA(obj);\r
+        size = PyUnicode_GET_DATA_SIZE(obj);\r
+        return codec_tuple(PyString_FromStringAndSize(data, size),\r
+                           PyUnicode_GET_SIZE(obj));\r
+    }\r
+    else {\r
+        if (PyObject_AsReadBuffer(obj, (const void **)&data, &size))\r
+            return NULL;\r
+        return codec_tuple(PyString_FromStringAndSize(data, size),\r
+                           size);\r
+    }\r
+}\r
+\r
+static PyObject *\r
+utf_7_encode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_7_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF7(PyUnicode_AS_UNICODE(str),\r
+                                         PyUnicode_GET_SIZE(str),\r
+                                         0,\r
+                                         0,\r
+                                         errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+utf_8_encode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_8_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(str),\r
+                                         PyUnicode_GET_SIZE(str),\r
+                                         errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+/* This version provides access to the byteorder parameter of the\r
+   builtin UTF-16 codecs as optional third argument. It defaults to 0\r
+   which means: use the native byte order and prepend the data with a\r
+   BOM mark.\r
+\r
+*/\r
+\r
+static PyObject *\r
+utf_16_encode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|zi:utf_16_encode",\r
+                          &str, &errors, &byteorder))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),\r
+                                          PyUnicode_GET_SIZE(str),\r
+                                          errors,\r
+                                          byteorder),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+utf_16_le_encode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_16_le_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),\r
+                                             PyUnicode_GET_SIZE(str),\r
+                                             errors,\r
+                                             -1),\r
+                       PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+utf_16_be_encode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_16_be_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(str),\r
+                                          PyUnicode_GET_SIZE(str),\r
+                                          errors,\r
+                                          +1),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+/* This version provides access to the byteorder parameter of the\r
+   builtin UTF-32 codecs as optional third argument. It defaults to 0\r
+   which means: use the native byte order and prepend the data with a\r
+   BOM mark.\r
+\r
+*/\r
+\r
+static PyObject *\r
+utf_32_encode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+    int byteorder = 0;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|zi:utf_32_encode",\r
+                          &str, &errors, &byteorder))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),\r
+                                          PyUnicode_GET_SIZE(str),\r
+                                          errors,\r
+                                          byteorder),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+utf_32_le_encode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_32_le_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),\r
+                                             PyUnicode_GET_SIZE(str),\r
+                                             errors,\r
+                                             -1),\r
+                       PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+utf_32_be_encode(PyObject *self,\r
+                 PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:utf_32_be_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(str),\r
+                                          PyUnicode_GET_SIZE(str),\r
+                                          errors,\r
+                                          +1),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+unicode_escape_encode(PyObject *self,\r
+                     PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:unicode_escape_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeUnicodeEscape(PyUnicode_AS_UNICODE(str),\r
+                                                  PyUnicode_GET_SIZE(str)),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+raw_unicode_escape_encode(PyObject *self,\r
+                        PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:raw_unicode_escape_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeRawUnicodeEscape(\r
+                               PyUnicode_AS_UNICODE(str),\r
+                               PyUnicode_GET_SIZE(str)),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+latin_1_encode(PyObject *self,\r
+               PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:latin_1_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeLatin1(\r
+                               PyUnicode_AS_UNICODE(str),\r
+                               PyUnicode_GET_SIZE(str),\r
+                               errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+ascii_encode(PyObject *self,\r
+             PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:ascii_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeASCII(\r
+                               PyUnicode_AS_UNICODE(str),\r
+                               PyUnicode_GET_SIZE(str),\r
+                               errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+charmap_encode(PyObject *self,\r
+             PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+    PyObject *mapping = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|zO:charmap_encode",\r
+                          &str, &errors, &mapping))\r
+        return NULL;\r
+    if (mapping == Py_None)\r
+        mapping = NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeCharmap(\r
+                               PyUnicode_AS_UNICODE(str),\r
+                               PyUnicode_GET_SIZE(str),\r
+                               mapping,\r
+                               errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+static PyObject*\r
+charmap_build(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *map;\r
+    if (!PyArg_ParseTuple(args, "U:charmap_build", &map))\r
+        return NULL;\r
+    return PyUnicode_BuildEncodingMap(map);\r
+}\r
+\r
+#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)\r
+\r
+static PyObject *\r
+mbcs_encode(PyObject *self,\r
+            PyObject *args)\r
+{\r
+    PyObject *str, *v;\r
+    const char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|z:mbcs_encode",\r
+                          &str, &errors))\r
+        return NULL;\r
+\r
+    str = PyUnicode_FromObject(str);\r
+    if (str == NULL)\r
+        return NULL;\r
+    v = codec_tuple(PyUnicode_EncodeMBCS(\r
+                               PyUnicode_AS_UNICODE(str),\r
+                               PyUnicode_GET_SIZE(str),\r
+                               errors),\r
+                    PyUnicode_GET_SIZE(str));\r
+    Py_DECREF(str);\r
+    return v;\r
+}\r
+\r
+#endif /* MS_WINDOWS */\r
+#endif /* Py_USING_UNICODE */\r
+\r
+/* --- Error handler registry --------------------------------------------- */\r
+\r
+PyDoc_STRVAR(register_error__doc__,\r
+"register_error(errors, handler)\n\\r
+\n\\r
+Register the specified error handler under the name\n\\r
+errors. handler must be a callable object, that\n\\r
+will be called with an exception instance containing\n\\r
+information about the location of the encoding/decoding\n\\r
+error and must return a (replacement, new position) tuple.");\r
+\r
+static PyObject *register_error(PyObject *self, PyObject *args)\r
+{\r
+    const char *name;\r
+    PyObject *handler;\r
+\r
+    if (!PyArg_ParseTuple(args, "sO:register_error",\r
+                          &name, &handler))\r
+        return NULL;\r
+    if (PyCodec_RegisterError(name, handler))\r
+        return NULL;\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(lookup_error__doc__,\r
+"lookup_error(errors) -> handler\n\\r
+\n\\r
+Return the error handler for the specified error handling name\n\\r
+or raise a LookupError, if no handler exists under this name.");\r
+\r
+static PyObject *lookup_error(PyObject *self, PyObject *args)\r
+{\r
+    const char *name;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:lookup_error",\r
+                          &name))\r
+        return NULL;\r
+    return PyCodec_LookupError(name);\r
+}\r
+\r
+/* --- Module API --------------------------------------------------------- */\r
+\r
+static PyMethodDef _codecs_functions[] = {\r
+    {"register",                codec_register,                 METH_O,\r
+        register__doc__},\r
+    {"lookup",                  codec_lookup,                   METH_VARARGS,\r
+        lookup__doc__},\r
+    {"encode",                  codec_encode,                   METH_VARARGS,\r
+        encode__doc__},\r
+    {"decode",                  codec_decode,                   METH_VARARGS,\r
+        decode__doc__},\r
+    {"escape_encode",           escape_encode,                  METH_VARARGS},\r
+    {"escape_decode",           escape_decode,                  METH_VARARGS},\r
+#ifdef Py_USING_UNICODE\r
+    {"utf_8_encode",            utf_8_encode,                   METH_VARARGS},\r
+    {"utf_8_decode",            utf_8_decode,                   METH_VARARGS},\r
+    {"utf_7_encode",            utf_7_encode,                   METH_VARARGS},\r
+    {"utf_7_decode",            utf_7_decode,                   METH_VARARGS},\r
+    {"utf_16_encode",           utf_16_encode,                  METH_VARARGS},\r
+    {"utf_16_le_encode",        utf_16_le_encode,               METH_VARARGS},\r
+    {"utf_16_be_encode",        utf_16_be_encode,               METH_VARARGS},\r
+    {"utf_16_decode",           utf_16_decode,                  METH_VARARGS},\r
+    {"utf_16_le_decode",        utf_16_le_decode,               METH_VARARGS},\r
+    {"utf_16_be_decode",        utf_16_be_decode,               METH_VARARGS},\r
+    {"utf_16_ex_decode",        utf_16_ex_decode,               METH_VARARGS},\r
+    {"utf_32_encode",           utf_32_encode,                  METH_VARARGS},\r
+    {"utf_32_le_encode",        utf_32_le_encode,               METH_VARARGS},\r
+    {"utf_32_be_encode",        utf_32_be_encode,               METH_VARARGS},\r
+    {"utf_32_decode",           utf_32_decode,                  METH_VARARGS},\r
+    {"utf_32_le_decode",        utf_32_le_decode,               METH_VARARGS},\r
+    {"utf_32_be_decode",        utf_32_be_decode,               METH_VARARGS},\r
+    {"utf_32_ex_decode",        utf_32_ex_decode,               METH_VARARGS},\r
+    {"unicode_escape_encode",   unicode_escape_encode,          METH_VARARGS},\r
+    {"unicode_escape_decode",   unicode_escape_decode,          METH_VARARGS},\r
+    {"unicode_internal_encode", unicode_internal_encode,        METH_VARARGS},\r
+    {"unicode_internal_decode", unicode_internal_decode,        METH_VARARGS},\r
+    {"raw_unicode_escape_encode", raw_unicode_escape_encode,    METH_VARARGS},\r
+    {"raw_unicode_escape_decode", raw_unicode_escape_decode,    METH_VARARGS},\r
+    {"latin_1_encode",          latin_1_encode,                 METH_VARARGS},\r
+    {"latin_1_decode",          latin_1_decode,                 METH_VARARGS},\r
+    {"ascii_encode",            ascii_encode,                   METH_VARARGS},\r
+    {"ascii_decode",            ascii_decode,                   METH_VARARGS},\r
+    {"charmap_encode",          charmap_encode,                 METH_VARARGS},\r
+    {"charmap_decode",          charmap_decode,                 METH_VARARGS},\r
+    {"charmap_build",           charmap_build,                  METH_VARARGS},\r
+    {"readbuffer_encode",       readbuffer_encode,              METH_VARARGS},\r
+    {"charbuffer_encode",       charbuffer_encode,              METH_VARARGS},\r
+#if defined(MS_WINDOWS) && defined(HAVE_USABLE_WCHAR_T)\r
+    {"mbcs_encode",             mbcs_encode,                    METH_VARARGS},\r
+    {"mbcs_decode",             mbcs_decode,                    METH_VARARGS},\r
+#endif\r
+#endif /* Py_USING_UNICODE */\r
+    {"register_error",          register_error,                 METH_VARARGS,\r
+        register_error__doc__},\r
+    {"lookup_error",            lookup_error,                   METH_VARARGS,\r
+        lookup_error__doc__},\r
+    {NULL, NULL}                /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_codecs(void)\r
+{\r
+    Py_InitModule("_codecs", _codecs_functions);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_collectionsmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_collectionsmodule.c
new file mode 100644 (file)
index 0000000..4dfcfbb
--- /dev/null
@@ -0,0 +1,1706 @@
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+/* collections module implementation of a deque() datatype\r
+   Written and maintained by Raymond D. Hettinger <python@rcn.com>\r
+   Copyright (c) 2004 Python Software Foundation.\r
+   All rights reserved.\r
+*/\r
+\r
+/* The block length may be set to any number over 1.  Larger numbers\r
+ * reduce the number of calls to the memory allocator, give faster\r
+ * indexing and rotation, and reduce the link::data overhead ratio.\r
+ *\r
+ * Ideally, the block length will be set to two less than some\r
+ * multiple of the cache-line length (so that the full block\r
+ * including the leftlink and rightlink will fit neatly into\r
+ * cache lines).\r
+ */\r
+\r
+#define BLOCKLEN 62\r
+#define CENTER ((BLOCKLEN - 1) / 2)\r
+\r
+/* A `dequeobject` is composed of a doubly-linked list of `block` nodes.\r
+ * This list is not circular (the leftmost block has leftlink==NULL,\r
+ * and the rightmost block has rightlink==NULL).  A deque d's first\r
+ * element is at d.leftblock[leftindex] and its last element is at\r
+ * d.rightblock[rightindex]; note that, unlike as for Python slice\r
+ * indices, these indices are inclusive on both ends.  By being inclusive\r
+ * on both ends, algorithms for left and right operations become\r
+ * symmetrical which simplifies the design.\r
+ *\r
+ * The list of blocks is never empty, so d.leftblock and d.rightblock\r
+ * are never equal to NULL.\r
+ *\r
+ * The indices, d.leftindex and d.rightindex are always in the range\r
+ *     0 <= index < BLOCKLEN.\r
+ * Their exact relationship is:\r
+ *     (d.leftindex + d.len - 1) % BLOCKLEN == d.rightindex.\r
+ *\r
+ * Empty deques have d.len == 0; d.leftblock==d.rightblock;\r
+ * d.leftindex == CENTER+1; and d.rightindex == CENTER.\r
+ * Checking for d.len == 0 is the intended way to see whether d is empty.\r
+ *\r
+ * Whenever d.leftblock == d.rightblock,\r
+ *     d.leftindex + d.len - 1 == d.rightindex.\r
+ *\r
+ * However, when d.leftblock != d.rightblock, d.leftindex and d.rightindex\r
+ * become indices into distinct blocks and either may be larger than the\r
+ * other.\r
+ */\r
+\r
+typedef struct BLOCK {\r
+    PyObject *data[BLOCKLEN];\r
+    struct BLOCK *rightlink;\r
+    struct BLOCK *leftlink;\r
+} block;\r
+\r
+#define MAXFREEBLOCKS 10\r
+static Py_ssize_t numfreeblocks = 0;\r
+static block *freeblocks[MAXFREEBLOCKS];\r
+\r
+static block *\r
+newblock(block *leftlink, block *rightlink, Py_ssize_t len) {\r
+    block *b;\r
+    /* To prevent len from overflowing PY_SSIZE_T_MAX on 32-bit machines, we\r
+     * refuse to allocate new blocks if the current len is nearing overflow. */\r
+    if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "cannot add more blocks to the deque");\r
+        return NULL;\r
+    }\r
+    if (numfreeblocks) {\r
+        numfreeblocks -= 1;\r
+        b = freeblocks[numfreeblocks];\r
+    } else {\r
+        b = PyMem_Malloc(sizeof(block));\r
+        if (b == NULL) {\r
+            PyErr_NoMemory();\r
+            return NULL;\r
+        }\r
+    }\r
+    b->leftlink = leftlink;\r
+    b->rightlink = rightlink;\r
+    return b;\r
+}\r
+\r
+static void\r
+freeblock(block *b)\r
+{\r
+    if (numfreeblocks < MAXFREEBLOCKS) {\r
+        freeblocks[numfreeblocks] = b;\r
+        numfreeblocks++;\r
+    } else {\r
+        PyMem_Free(b);\r
+    }\r
+}\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    block *leftblock;\r
+    block *rightblock;\r
+    Py_ssize_t leftindex;       /* in range(BLOCKLEN) */\r
+    Py_ssize_t rightindex;      /* in range(BLOCKLEN) */\r
+    Py_ssize_t len;\r
+    long state;         /* incremented whenever the indices move */\r
+    Py_ssize_t maxlen;\r
+    PyObject *weakreflist; /* List of weak references */\r
+} dequeobject;\r
+\r
+/* The deque's size limit is d.maxlen.  The limit can be zero or positive.\r
+ * If there is no limit, then d.maxlen == -1.\r
+ *\r
+ * After an item is added to a deque, we check to see if the size has grown past\r
+ * the limit. If it has, we get the size back down to the limit by popping an\r
+ * item off of the opposite end.  The methods that can trigger this are append(),\r
+ * appendleft(), extend(), and extendleft().\r
+ */\r
+\r
+#define TRIM(d, popfunction)                                    \\r
+    if (d->maxlen != -1 && d->len > d->maxlen) {                \\r
+        PyObject *rv = popfunction(d, NULL);                \\r
+        assert(rv != NULL  &&  d->len <= d->maxlen);        \\r
+        Py_DECREF(rv);                                      \\r
+    }\r
+\r
+static PyTypeObject deque_type;\r
+\r
+static PyObject *\r
+deque_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    dequeobject *deque;\r
+    block *b;\r
+\r
+    /* create dequeobject structure */\r
+    deque = (dequeobject *)type->tp_alloc(type, 0);\r
+    if (deque == NULL)\r
+        return NULL;\r
+\r
+    b = newblock(NULL, NULL, 0);\r
+    if (b == NULL) {\r
+        Py_DECREF(deque);\r
+        return NULL;\r
+    }\r
+\r
+    assert(BLOCKLEN >= 2);\r
+    deque->leftblock = b;\r
+    deque->rightblock = b;\r
+    deque->leftindex = CENTER + 1;\r
+    deque->rightindex = CENTER;\r
+    deque->len = 0;\r
+    deque->state = 0;\r
+    deque->weakreflist = NULL;\r
+    deque->maxlen = -1;\r
+\r
+    return (PyObject *)deque;\r
+}\r
+\r
+static PyObject *\r
+deque_pop(dequeobject *deque, PyObject *unused)\r
+{\r
+    PyObject *item;\r
+    block *prevblock;\r
+\r
+    if (deque->len == 0) {\r
+        PyErr_SetString(PyExc_IndexError, "pop from an empty deque");\r
+        return NULL;\r
+    }\r
+    item = deque->rightblock->data[deque->rightindex];\r
+    deque->rightindex--;\r
+    deque->len--;\r
+    deque->state++;\r
+\r
+    if (deque->rightindex == -1) {\r
+        if (deque->len == 0) {\r
+            assert(deque->leftblock == deque->rightblock);\r
+            assert(deque->leftindex == deque->rightindex+1);\r
+            /* re-center instead of freeing a block */\r
+            deque->leftindex = CENTER + 1;\r
+            deque->rightindex = CENTER;\r
+        } else {\r
+            prevblock = deque->rightblock->leftlink;\r
+            assert(deque->leftblock != deque->rightblock);\r
+            freeblock(deque->rightblock);\r
+            prevblock->rightlink = NULL;\r
+            deque->rightblock = prevblock;\r
+            deque->rightindex = BLOCKLEN - 1;\r
+        }\r
+    }\r
+    return item;\r
+}\r
+\r
+PyDoc_STRVAR(pop_doc, "Remove and return the rightmost element.");\r
+\r
+static PyObject *\r
+deque_popleft(dequeobject *deque, PyObject *unused)\r
+{\r
+    PyObject *item;\r
+    block *prevblock;\r
+\r
+    if (deque->len == 0) {\r
+        PyErr_SetString(PyExc_IndexError, "pop from an empty deque");\r
+        return NULL;\r
+    }\r
+    assert(deque->leftblock != NULL);\r
+    item = deque->leftblock->data[deque->leftindex];\r
+    deque->leftindex++;\r
+    deque->len--;\r
+    deque->state++;\r
+\r
+    if (deque->leftindex == BLOCKLEN) {\r
+        if (deque->len == 0) {\r
+            assert(deque->leftblock == deque->rightblock);\r
+            assert(deque->leftindex == deque->rightindex+1);\r
+            /* re-center instead of freeing a block */\r
+            deque->leftindex = CENTER + 1;\r
+            deque->rightindex = CENTER;\r
+        } else {\r
+            assert(deque->leftblock != deque->rightblock);\r
+            prevblock = deque->leftblock->rightlink;\r
+            freeblock(deque->leftblock);\r
+            assert(prevblock != NULL);\r
+            prevblock->leftlink = NULL;\r
+            deque->leftblock = prevblock;\r
+            deque->leftindex = 0;\r
+        }\r
+    }\r
+    return item;\r
+}\r
+\r
+PyDoc_STRVAR(popleft_doc, "Remove and return the leftmost element.");\r
+\r
+static PyObject *\r
+deque_append(dequeobject *deque, PyObject *item)\r
+{\r
+    deque->state++;\r
+    if (deque->rightindex == BLOCKLEN-1) {\r
+        block *b = newblock(deque->rightblock, NULL, deque->len);\r
+        if (b == NULL)\r
+            return NULL;\r
+        assert(deque->rightblock->rightlink == NULL);\r
+        deque->rightblock->rightlink = b;\r
+        deque->rightblock = b;\r
+        deque->rightindex = -1;\r
+    }\r
+    Py_INCREF(item);\r
+    deque->len++;\r
+    deque->rightindex++;\r
+    deque->rightblock->data[deque->rightindex] = item;\r
+    TRIM(deque, deque_popleft);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(append_doc, "Add an element to the right side of the deque.");\r
+\r
+static PyObject *\r
+deque_appendleft(dequeobject *deque, PyObject *item)\r
+{\r
+    deque->state++;\r
+    if (deque->leftindex == 0) {\r
+        block *b = newblock(NULL, deque->leftblock, deque->len);\r
+        if (b == NULL)\r
+            return NULL;\r
+        assert(deque->leftblock->leftlink == NULL);\r
+        deque->leftblock->leftlink = b;\r
+        deque->leftblock = b;\r
+        deque->leftindex = BLOCKLEN;\r
+    }\r
+    Py_INCREF(item);\r
+    deque->len++;\r
+    deque->leftindex--;\r
+    deque->leftblock->data[deque->leftindex] = item;\r
+    TRIM(deque, deque_pop);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(appendleft_doc, "Add an element to the left side of the deque.");\r
+\r
+\r
+/* Run an iterator to exhaustion.  Shortcut for\r
+   the extend/extendleft methods when maxlen == 0. */\r
+static PyObject*\r
+consume_iterator(PyObject *it)\r
+{\r
+    PyObject *item;\r
+\r
+    while ((item = PyIter_Next(it)) != NULL) {\r
+        Py_DECREF(item);\r
+    }\r
+    Py_DECREF(it);\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+deque_extend(dequeobject *deque, PyObject *iterable)\r
+{\r
+    PyObject *it, *item;\r
+\r
+    /* Handle case where id(deque) == id(iterable) */\r
+    if ((PyObject *)deque == iterable) {\r
+        PyObject *result;\r
+        PyObject *s = PySequence_List(iterable);\r
+        if (s == NULL)\r
+            return NULL;\r
+        result = deque_extend(deque, s);\r
+        Py_DECREF(s);\r
+        return result;\r
+    }\r
+\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    if (deque->maxlen == 0)\r
+        return consume_iterator(it);\r
+\r
+    while ((item = PyIter_Next(it)) != NULL) {\r
+        deque->state++;\r
+        if (deque->rightindex == BLOCKLEN-1) {\r
+            block *b = newblock(deque->rightblock, NULL,\r
+                                deque->len);\r
+            if (b == NULL) {\r
+                Py_DECREF(item);\r
+                Py_DECREF(it);\r
+                return NULL;\r
+            }\r
+            assert(deque->rightblock->rightlink == NULL);\r
+            deque->rightblock->rightlink = b;\r
+            deque->rightblock = b;\r
+            deque->rightindex = -1;\r
+        }\r
+        deque->len++;\r
+        deque->rightindex++;\r
+        deque->rightblock->data[deque->rightindex] = item;\r
+        TRIM(deque, deque_popleft);\r
+    }\r
+    Py_DECREF(it);\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(extend_doc,\r
+"Extend the right side of the deque with elements from the iterable");\r
+\r
+static PyObject *\r
+deque_extendleft(dequeobject *deque, PyObject *iterable)\r
+{\r
+    PyObject *it, *item;\r
+\r
+    /* Handle case where id(deque) == id(iterable) */\r
+    if ((PyObject *)deque == iterable) {\r
+        PyObject *result;\r
+        PyObject *s = PySequence_List(iterable);\r
+        if (s == NULL)\r
+            return NULL;\r
+        result = deque_extendleft(deque, s);\r
+        Py_DECREF(s);\r
+        return result;\r
+    }\r
+\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    if (deque->maxlen == 0)\r
+        return consume_iterator(it);\r
+\r
+    while ((item = PyIter_Next(it)) != NULL) {\r
+        deque->state++;\r
+        if (deque->leftindex == 0) {\r
+            block *b = newblock(NULL, deque->leftblock,\r
+                                deque->len);\r
+            if (b == NULL) {\r
+                Py_DECREF(item);\r
+                Py_DECREF(it);\r
+                return NULL;\r
+            }\r
+            assert(deque->leftblock->leftlink == NULL);\r
+            deque->leftblock->leftlink = b;\r
+            deque->leftblock = b;\r
+            deque->leftindex = BLOCKLEN;\r
+        }\r
+        deque->len++;\r
+        deque->leftindex--;\r
+        deque->leftblock->data[deque->leftindex] = item;\r
+        TRIM(deque, deque_pop);\r
+    }\r
+    Py_DECREF(it);\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(extendleft_doc,\r
+"Extend the left side of the deque with elements from the iterable");\r
+\r
+static PyObject *\r
+deque_inplace_concat(dequeobject *deque, PyObject *other)\r
+{\r
+    PyObject *result;\r
+\r
+    result = deque_extend(deque, other);\r
+    if (result == NULL)\r
+        return result;\r
+    Py_DECREF(result);\r
+    Py_INCREF(deque);\r
+    return (PyObject *)deque;\r
+}\r
+\r
+static int\r
+_deque_rotate(dequeobject *deque, Py_ssize_t n)\r
+{\r
+    Py_ssize_t m, len=deque->len, halflen=len>>1;\r
+\r
+    if (len <= 1)\r
+        return 0;\r
+    if (n > halflen || n < -halflen) {\r
+        n %= len;\r
+        if (n > halflen)\r
+            n -= len;\r
+        else if (n < -halflen)\r
+            n += len;\r
+    }\r
+    assert(len > 1);\r
+    assert(-halflen <= n && n <= halflen);\r
+\r
+    deque->state++;\r
+    while (n > 0) {\r
+        if (deque->leftindex == 0) {\r
+            block *b = newblock(NULL, deque->leftblock, len);\r
+            if (b == NULL)\r
+                return -1;\r
+            assert(deque->leftblock->leftlink == NULL);\r
+            deque->leftblock->leftlink = b;\r
+            deque->leftblock = b;\r
+            deque->leftindex = BLOCKLEN;\r
+        }\r
+        assert(deque->leftindex > 0);\r
+\r
+        m = n;\r
+        if (m > deque->rightindex + 1)\r
+            m = deque->rightindex + 1;\r
+        if (m > deque->leftindex)\r
+            m = deque->leftindex;\r
+        assert (m > 0 && m <= len);\r
+        memcpy(&deque->leftblock->data[deque->leftindex - m],\r
+               &deque->rightblock->data[deque->rightindex + 1 - m],\r
+               m * sizeof(PyObject *));\r
+        deque->rightindex -= m;\r
+        deque->leftindex -= m;\r
+        n -= m;\r
+\r
+        if (deque->rightindex == -1) {\r
+            block *prevblock = deque->rightblock->leftlink;\r
+            assert(deque->rightblock != NULL);\r
+            assert(deque->leftblock != deque->rightblock);\r
+            freeblock(deque->rightblock);\r
+            prevblock->rightlink = NULL;\r
+            deque->rightblock = prevblock;\r
+            deque->rightindex = BLOCKLEN - 1;\r
+        }\r
+    }\r
+    while (n < 0) {\r
+        if (deque->rightindex == BLOCKLEN - 1) {\r
+            block *b = newblock(deque->rightblock, NULL, len);\r
+            if (b == NULL)\r
+                return -1;\r
+            assert(deque->rightblock->rightlink == NULL);\r
+            deque->rightblock->rightlink = b;\r
+            deque->rightblock = b;\r
+            deque->rightindex = -1;\r
+        }\r
+        assert (deque->rightindex < BLOCKLEN - 1);\r
+\r
+        m = -n;\r
+        if (m > BLOCKLEN - deque->leftindex)\r
+            m = BLOCKLEN - deque->leftindex;\r
+        if (m > BLOCKLEN - 1 - deque->rightindex)\r
+            m = BLOCKLEN - 1 - deque->rightindex;\r
+        assert (m > 0 && m <= len);\r
+        memcpy(&deque->rightblock->data[deque->rightindex + 1],\r
+               &deque->leftblock->data[deque->leftindex],\r
+               m * sizeof(PyObject *));\r
+        deque->leftindex += m;\r
+        deque->rightindex += m;\r
+        n += m;\r
+\r
+        if (deque->leftindex == BLOCKLEN) {\r
+            block *nextblock = deque->leftblock->rightlink;\r
+            assert(deque->leftblock != deque->rightblock);\r
+            freeblock(deque->leftblock);\r
+            assert(nextblock != NULL);\r
+            nextblock->leftlink = NULL;\r
+            deque->leftblock = nextblock;\r
+            deque->leftindex = 0;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+deque_rotate(dequeobject *deque, PyObject *args)\r
+{\r
+    Py_ssize_t n=1;\r
+\r
+    if (!PyArg_ParseTuple(args, "|n:rotate", &n))\r
+        return NULL;\r
+    if (_deque_rotate(deque, n) == 0)\r
+        Py_RETURN_NONE;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(rotate_doc,\r
+"Rotate the deque n steps to the right (default n=1).  If n is negative, rotates left.");\r
+\r
+static PyObject *\r
+deque_reverse(dequeobject *deque, PyObject *unused)\r
+{\r
+    block *leftblock = deque->leftblock;\r
+    block *rightblock = deque->rightblock;\r
+    Py_ssize_t leftindex = deque->leftindex;\r
+    Py_ssize_t rightindex = deque->rightindex;\r
+    Py_ssize_t n = (deque->len)/2;\r
+    Py_ssize_t i;\r
+    PyObject *tmp;\r
+\r
+    for (i=0 ; i<n ; i++) {\r
+        /* Validate that pointers haven't met in the middle */\r
+        assert(leftblock != rightblock || leftindex < rightindex);\r
+\r
+        /* Swap */\r
+        tmp = leftblock->data[leftindex];\r
+        leftblock->data[leftindex] = rightblock->data[rightindex];\r
+        rightblock->data[rightindex] = tmp;\r
+\r
+        /* Advance left block/index pair */\r
+        leftindex++;\r
+        if (leftindex == BLOCKLEN) {\r
+            if (leftblock->rightlink == NULL)\r
+                break;\r
+            leftblock = leftblock->rightlink;\r
+            leftindex = 0;\r
+        }\r
+\r
+        /* Step backwards with the right block/index pair */\r
+        rightindex--;\r
+        if (rightindex == -1) {\r
+            if (rightblock->leftlink == NULL)\r
+                break;\r
+            rightblock = rightblock->leftlink;\r
+            rightindex = BLOCKLEN - 1;\r
+        }\r
+    }\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(reverse_doc,\r
+"D.reverse() -- reverse *IN PLACE*");\r
+\r
+static PyObject *\r
+deque_count(dequeobject *deque, PyObject *v)\r
+{\r
+    block *leftblock = deque->leftblock;\r
+    Py_ssize_t leftindex = deque->leftindex;\r
+    Py_ssize_t n = deque->len;\r
+    Py_ssize_t i;\r
+    Py_ssize_t count = 0;\r
+    PyObject *item;\r
+    long start_state = deque->state;\r
+    int cmp;\r
+\r
+    for (i=0 ; i<n ; i++) {\r
+        item = leftblock->data[leftindex];\r
+        cmp = PyObject_RichCompareBool(item, v, Py_EQ);\r
+        if (cmp > 0)\r
+            count++;\r
+        else if (cmp < 0)\r
+            return NULL;\r
+\r
+        if (start_state != deque->state) {\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "deque mutated during iteration");\r
+            return NULL;\r
+        }\r
+\r
+        /* Advance left block/index pair */\r
+        leftindex++;\r
+        if (leftindex == BLOCKLEN) {\r
+            if (leftblock->rightlink == NULL)  /* can occur when i==n-1 */\r
+                break;\r
+            leftblock = leftblock->rightlink;\r
+            leftindex = 0;\r
+        }\r
+    }\r
+    return PyInt_FromSsize_t(count);\r
+}\r
+\r
+PyDoc_STRVAR(count_doc,\r
+"D.count(value) -> integer -- return number of occurrences of value");\r
+\r
+static Py_ssize_t\r
+deque_len(dequeobject *deque)\r
+{\r
+    return deque->len;\r
+}\r
+\r
+static PyObject *\r
+deque_remove(dequeobject *deque, PyObject *value)\r
+{\r
+    Py_ssize_t i, n=deque->len;\r
+\r
+    for (i=0 ; i<n ; i++) {\r
+        PyObject *item = deque->leftblock->data[deque->leftindex];\r
+        int cmp = PyObject_RichCompareBool(item, value, Py_EQ);\r
+\r
+        if (deque->len != n) {\r
+            PyErr_SetString(PyExc_IndexError,\r
+                "deque mutated during remove().");\r
+            return NULL;\r
+        }\r
+        if (cmp > 0) {\r
+            PyObject *tgt = deque_popleft(deque, NULL);\r
+            assert (tgt != NULL);\r
+            if (_deque_rotate(deque, i))\r
+                return NULL;\r
+            Py_DECREF(tgt);\r
+            Py_RETURN_NONE;\r
+        }\r
+        else if (cmp < 0) {\r
+            _deque_rotate(deque, i);\r
+            return NULL;\r
+        }\r
+        _deque_rotate(deque, -1);\r
+    }\r
+    PyErr_SetString(PyExc_ValueError, "deque.remove(x): x not in deque");\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(remove_doc,\r
+"D.remove(value) -- remove first occurrence of value.");\r
+\r
+static void\r
+deque_clear(dequeobject *deque)\r
+{\r
+    PyObject *item;\r
+\r
+    while (deque->len) {\r
+        item = deque_pop(deque, NULL);\r
+        assert (item != NULL);\r
+        Py_DECREF(item);\r
+    }\r
+    assert(deque->leftblock == deque->rightblock &&\r
+           deque->leftindex - 1 == deque->rightindex &&\r
+           deque->len == 0);\r
+}\r
+\r
+static PyObject *\r
+deque_item(dequeobject *deque, Py_ssize_t i)\r
+{\r
+    block *b;\r
+    PyObject *item;\r
+    Py_ssize_t n, index=i;\r
+\r
+    if (i < 0 || i >= deque->len) {\r
+        PyErr_SetString(PyExc_IndexError,\r
+                        "deque index out of range");\r
+        return NULL;\r
+    }\r
+\r
+    if (i == 0) {\r
+        i = deque->leftindex;\r
+        b = deque->leftblock;\r
+    } else if (i == deque->len - 1) {\r
+        i = deque->rightindex;\r
+        b = deque->rightblock;\r
+    } else {\r
+        i += deque->leftindex;\r
+        n = i / BLOCKLEN;\r
+        i %= BLOCKLEN;\r
+        if (index < (deque->len >> 1)) {\r
+            b = deque->leftblock;\r
+            while (n--)\r
+                b = b->rightlink;\r
+        } else {\r
+            n = (deque->leftindex + deque->len - 1) / BLOCKLEN - n;\r
+            b = deque->rightblock;\r
+            while (n--)\r
+                b = b->leftlink;\r
+        }\r
+    }\r
+    item = b->data[i];\r
+    Py_INCREF(item);\r
+    return item;\r
+}\r
+\r
+/* delitem() implemented in terms of rotate for simplicity and reasonable\r
+   performance near the end points.  If for some reason this method becomes\r
+   popular, it is not hard to re-implement this using direct data movement\r
+   (similar to code in list slice assignment) and achieve a two or threefold\r
+   performance boost.\r
+*/\r
+\r
+static int\r
+deque_del_item(dequeobject *deque, Py_ssize_t i)\r
+{\r
+    PyObject *item;\r
+    int rv;\r
+\r
+    assert (i >= 0 && i < deque->len);\r
+    if (_deque_rotate(deque, -i))\r
+        return -1;\r
+    item = deque_popleft(deque, NULL);\r
+    rv = _deque_rotate(deque, i);\r
+    assert (item != NULL);\r
+    Py_DECREF(item);\r
+    return rv;\r
+}\r
+\r
+static int\r
+deque_ass_item(dequeobject *deque, Py_ssize_t i, PyObject *v)\r
+{\r
+    PyObject *old_value;\r
+    block *b;\r
+    Py_ssize_t n, len=deque->len, halflen=(len+1)>>1, index=i;\r
+\r
+    if (i < 0 || i >= len) {\r
+        PyErr_SetString(PyExc_IndexError,\r
+                        "deque index out of range");\r
+        return -1;\r
+    }\r
+    if (v == NULL)\r
+        return deque_del_item(deque, i);\r
+\r
+    i += deque->leftindex;\r
+    n = i / BLOCKLEN;\r
+    i %= BLOCKLEN;\r
+    if (index <= halflen) {\r
+        b = deque->leftblock;\r
+        while (n--)\r
+            b = b->rightlink;\r
+    } else {\r
+        n = (deque->leftindex + len - 1) / BLOCKLEN - n;\r
+        b = deque->rightblock;\r
+        while (n--)\r
+            b = b->leftlink;\r
+    }\r
+    Py_INCREF(v);\r
+    old_value = b->data[i];\r
+    b->data[i] = v;\r
+    Py_DECREF(old_value);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+deque_clearmethod(dequeobject *deque)\r
+{\r
+    deque_clear(deque);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(clear_doc, "Remove all elements from the deque.");\r
+\r
+static void\r
+deque_dealloc(dequeobject *deque)\r
+{\r
+    PyObject_GC_UnTrack(deque);\r
+    if (deque->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) deque);\r
+    if (deque->leftblock != NULL) {\r
+        deque_clear(deque);\r
+        assert(deque->leftblock != NULL);\r
+        freeblock(deque->leftblock);\r
+    }\r
+    deque->leftblock = NULL;\r
+    deque->rightblock = NULL;\r
+    Py_TYPE(deque)->tp_free(deque);\r
+}\r
+\r
+static int\r
+deque_traverse(dequeobject *deque, visitproc visit, void *arg)\r
+{\r
+    block *b;\r
+    PyObject *item;\r
+    Py_ssize_t index;\r
+    Py_ssize_t indexlo = deque->leftindex;\r
+\r
+    for (b = deque->leftblock; b != NULL; b = b->rightlink) {\r
+        const Py_ssize_t indexhi = b == deque->rightblock ?\r
+                                 deque->rightindex :\r
+                     BLOCKLEN - 1;\r
+\r
+        for (index = indexlo; index <= indexhi; ++index) {\r
+            item = b->data[index];\r
+            Py_VISIT(item);\r
+        }\r
+        indexlo = 0;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+deque_copy(PyObject *deque)\r
+{\r
+    if (((dequeobject *)deque)->maxlen == -1)\r
+        return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "O", deque, NULL);\r
+    else\r
+        return PyObject_CallFunction((PyObject *)(Py_TYPE(deque)), "Oi",\r
+            deque, ((dequeobject *)deque)->maxlen, NULL);\r
+}\r
+\r
+PyDoc_STRVAR(copy_doc, "Return a shallow copy of a deque.");\r
+\r
+static PyObject *\r
+deque_reduce(dequeobject *deque)\r
+{\r
+    PyObject *dict, *result, *aslist;\r
+\r
+    dict = PyObject_GetAttrString((PyObject *)deque, "__dict__");\r
+    if (dict == NULL)\r
+        PyErr_Clear();\r
+    aslist = PySequence_List((PyObject *)deque);\r
+    if (aslist == NULL) {\r
+        Py_XDECREF(dict);\r
+        return NULL;\r
+    }\r
+    if (dict == NULL) {\r
+        if (deque->maxlen == -1)\r
+            result = Py_BuildValue("O(O)", Py_TYPE(deque), aslist);\r
+        else\r
+            result = Py_BuildValue("O(On)", Py_TYPE(deque), aslist, deque->maxlen);\r
+    } else {\r
+        if (deque->maxlen == -1)\r
+            result = Py_BuildValue("O(OO)O", Py_TYPE(deque), aslist, Py_None, dict);\r
+        else\r
+            result = Py_BuildValue("O(On)O", Py_TYPE(deque), aslist, deque->maxlen, dict);\r
+    }\r
+    Py_XDECREF(dict);\r
+    Py_DECREF(aslist);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");\r
+\r
+static PyObject *\r
+deque_repr(PyObject *deque)\r
+{\r
+    PyObject *aslist, *result, *fmt;\r
+    int i;\r
+\r
+    i = Py_ReprEnter(deque);\r
+    if (i != 0) {\r
+        if (i < 0)\r
+            return NULL;\r
+        return PyString_FromString("[...]");\r
+    }\r
+\r
+    aslist = PySequence_List(deque);\r
+    if (aslist == NULL) {\r
+        Py_ReprLeave(deque);\r
+        return NULL;\r
+    }\r
+    if (((dequeobject *)deque)->maxlen != -1)\r
+        fmt = PyString_FromFormat("deque(%%r, maxlen=%zd)",\r
+                                ((dequeobject *)deque)->maxlen);\r
+    else\r
+        fmt = PyString_FromString("deque(%r)");\r
+    if (fmt == NULL) {\r
+        Py_DECREF(aslist);\r
+        Py_ReprLeave(deque);\r
+        return NULL;\r
+    }\r
+    result = PyString_Format(fmt, aslist);\r
+    Py_DECREF(fmt);\r
+    Py_DECREF(aslist);\r
+    Py_ReprLeave(deque);\r
+    return result;\r
+}\r
+\r
+static int\r
+deque_tp_print(PyObject *deque, FILE *fp, int flags)\r
+{\r
+    PyObject *it, *item;\r
+    char *emit = "";            /* No separator emitted on first pass */\r
+    char *separator = ", ";\r
+    int i;\r
+\r
+    i = Py_ReprEnter(deque);\r
+    if (i != 0) {\r
+        if (i < 0)\r
+            return i;\r
+        Py_BEGIN_ALLOW_THREADS\r
+        fputs("[...]", fp);\r
+        Py_END_ALLOW_THREADS\r
+        return 0;\r
+    }\r
+\r
+    it = PyObject_GetIter(deque);\r
+    if (it == NULL)\r
+        return -1;\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    fputs("deque([", fp);\r
+    Py_END_ALLOW_THREADS\r
+    while ((item = PyIter_Next(it)) != NULL) {\r
+        Py_BEGIN_ALLOW_THREADS\r
+        fputs(emit, fp);\r
+        Py_END_ALLOW_THREADS\r
+        emit = separator;\r
+        if (PyObject_Print(item, fp, 0) != 0) {\r
+            Py_DECREF(item);\r
+            Py_DECREF(it);\r
+            Py_ReprLeave(deque);\r
+            return -1;\r
+        }\r
+        Py_DECREF(item);\r
+    }\r
+    Py_ReprLeave(deque);\r
+    Py_DECREF(it);\r
+    if (PyErr_Occurred())\r
+        return -1;\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    if (((dequeobject *)deque)->maxlen == -1)\r
+        fputs("])", fp);\r
+    else\r
+        fprintf(fp, "], maxlen=%" PY_FORMAT_SIZE_T "d)", ((dequeobject *)deque)->maxlen);\r
+    Py_END_ALLOW_THREADS\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+deque_richcompare(PyObject *v, PyObject *w, int op)\r
+{\r
+    PyObject *it1=NULL, *it2=NULL, *x, *y;\r
+    Py_ssize_t vs, ws;\r
+    int b, cmp=-1;\r
+\r
+    if (!PyObject_TypeCheck(v, &deque_type) ||\r
+        !PyObject_TypeCheck(w, &deque_type)) {\r
+        Py_INCREF(Py_NotImplemented);\r
+        return Py_NotImplemented;\r
+    }\r
+\r
+    /* Shortcuts */\r
+    vs = ((dequeobject *)v)->len;\r
+    ws = ((dequeobject *)w)->len;\r
+    if (op == Py_EQ) {\r
+        if (v == w)\r
+            Py_RETURN_TRUE;\r
+        if (vs != ws)\r
+            Py_RETURN_FALSE;\r
+    }\r
+    if (op == Py_NE) {\r
+        if (v == w)\r
+            Py_RETURN_FALSE;\r
+        if (vs != ws)\r
+            Py_RETURN_TRUE;\r
+    }\r
+\r
+    /* Search for the first index where items are different */\r
+    it1 = PyObject_GetIter(v);\r
+    if (it1 == NULL)\r
+        goto done;\r
+    it2 = PyObject_GetIter(w);\r
+    if (it2 == NULL)\r
+        goto done;\r
+    for (;;) {\r
+        x = PyIter_Next(it1);\r
+        if (x == NULL && PyErr_Occurred())\r
+            goto done;\r
+        y = PyIter_Next(it2);\r
+        if (x == NULL || y == NULL)\r
+            break;\r
+        b = PyObject_RichCompareBool(x, y, Py_EQ);\r
+        if (b == 0) {\r
+            cmp = PyObject_RichCompareBool(x, y, op);\r
+            Py_DECREF(x);\r
+            Py_DECREF(y);\r
+            goto done;\r
+        }\r
+        Py_DECREF(x);\r
+        Py_DECREF(y);\r
+        if (b == -1)\r
+            goto done;\r
+    }\r
+    /* We reached the end of one deque or both */\r
+    Py_XDECREF(x);\r
+    Py_XDECREF(y);\r
+    if (PyErr_Occurred())\r
+        goto done;\r
+    switch (op) {\r
+    case Py_LT: cmp = y != NULL; break;  /* if w was longer */\r
+    case Py_LE: cmp = x == NULL; break;  /* if v was not longer */\r
+    case Py_EQ: cmp = x == y;    break;  /* if we reached the end of both */\r
+    case Py_NE: cmp = x != y;    break;  /* if one deque continues */\r
+    case Py_GT: cmp = x != NULL; break;  /* if v was longer */\r
+    case Py_GE: cmp = y == NULL; break;  /* if w was not longer */\r
+    }\r
+\r
+done:\r
+    Py_XDECREF(it1);\r
+    Py_XDECREF(it2);\r
+    if (cmp == 1)\r
+        Py_RETURN_TRUE;\r
+    if (cmp == 0)\r
+        Py_RETURN_FALSE;\r
+    return NULL;\r
+}\r
+\r
+static int\r
+deque_init(dequeobject *deque, PyObject *args, PyObject *kwdargs)\r
+{\r
+    PyObject *iterable = NULL;\r
+    PyObject *maxlenobj = NULL;\r
+    Py_ssize_t maxlen = -1;\r
+    char *kwlist[] = {"iterable", "maxlen", 0};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdargs, "|OO:deque", kwlist, &iterable, &maxlenobj))\r
+        return -1;\r
+    if (maxlenobj != NULL && maxlenobj != Py_None) {\r
+        maxlen = PyInt_AsSsize_t(maxlenobj);\r
+        if (maxlen == -1 && PyErr_Occurred())\r
+            return -1;\r
+        if (maxlen < 0) {\r
+            PyErr_SetString(PyExc_ValueError, "maxlen must be non-negative");\r
+            return -1;\r
+        }\r
+    }\r
+    deque->maxlen = maxlen;\r
+    deque_clear(deque);\r
+    if (iterable != NULL) {\r
+        PyObject *rv = deque_extend(deque, iterable);\r
+        if (rv == NULL)\r
+            return -1;\r
+        Py_DECREF(rv);\r
+    }\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+deque_sizeof(dequeobject *deque, void *unused)\r
+{\r
+    Py_ssize_t res;\r
+    Py_ssize_t blocks;\r
+\r
+    res = sizeof(dequeobject);\r
+    blocks = (deque->leftindex + deque->len + BLOCKLEN - 1) / BLOCKLEN;\r
+    assert(deque->leftindex + deque->len - 1 ==\r
+           (blocks - 1) * BLOCKLEN + deque->rightindex);\r
+    res += blocks * sizeof(block);\r
+    return PyLong_FromSsize_t(res);\r
+}\r
+\r
+PyDoc_STRVAR(sizeof_doc,\r
+"D.__sizeof__() -- size of D in memory, in bytes");\r
+\r
+static PyObject *\r
+deque_get_maxlen(dequeobject *deque)\r
+{\r
+    if (deque->maxlen == -1)\r
+        Py_RETURN_NONE;\r
+    return PyInt_FromSsize_t(deque->maxlen);\r
+}\r
+\r
+static PyGetSetDef deque_getset[] = {\r
+    {"maxlen", (getter)deque_get_maxlen, (setter)NULL,\r
+     "maximum size of a deque or None if unbounded"},\r
+    {0}\r
+};\r
+\r
+static PySequenceMethods deque_as_sequence = {\r
+    (lenfunc)deque_len,                 /* sq_length */\r
+    0,                                  /* sq_concat */\r
+    0,                                  /* sq_repeat */\r
+    (ssizeargfunc)deque_item,           /* sq_item */\r
+    0,                                  /* sq_slice */\r
+    (ssizeobjargproc)deque_ass_item,            /* sq_ass_item */\r
+    0,                                  /* sq_ass_slice */\r
+    0,                                  /* sq_contains */\r
+    (binaryfunc)deque_inplace_concat,           /* sq_inplace_concat */\r
+    0,                                  /* sq_inplace_repeat */\r
+\r
+};\r
+\r
+/* deque object ********************************************************/\r
+\r
+static PyObject *deque_iter(dequeobject *deque);\r
+static PyObject *deque_reviter(dequeobject *deque);\r
+PyDoc_STRVAR(reversed_doc,\r
+    "D.__reversed__() -- return a reverse iterator over the deque");\r
+\r
+static PyMethodDef deque_methods[] = {\r
+    {"append",                  (PyCFunction)deque_append,\r
+        METH_O,                  append_doc},\r
+    {"appendleft",              (PyCFunction)deque_appendleft,\r
+        METH_O,                  appendleft_doc},\r
+    {"clear",                   (PyCFunction)deque_clearmethod,\r
+        METH_NOARGS,             clear_doc},\r
+    {"__copy__",                (PyCFunction)deque_copy,\r
+        METH_NOARGS,             copy_doc},\r
+    {"count",                   (PyCFunction)deque_count,\r
+        METH_O,                         count_doc},\r
+    {"extend",                  (PyCFunction)deque_extend,\r
+        METH_O,                  extend_doc},\r
+    {"extendleft",              (PyCFunction)deque_extendleft,\r
+        METH_O,                  extendleft_doc},\r
+    {"pop",                     (PyCFunction)deque_pop,\r
+        METH_NOARGS,             pop_doc},\r
+    {"popleft",                 (PyCFunction)deque_popleft,\r
+        METH_NOARGS,             popleft_doc},\r
+    {"__reduce__",      (PyCFunction)deque_reduce,\r
+        METH_NOARGS,             reduce_doc},\r
+    {"remove",                  (PyCFunction)deque_remove,\r
+        METH_O,                  remove_doc},\r
+    {"__reversed__",            (PyCFunction)deque_reviter,\r
+        METH_NOARGS,             reversed_doc},\r
+    {"reverse",                 (PyCFunction)deque_reverse,\r
+        METH_NOARGS,             reverse_doc},\r
+    {"rotate",                  (PyCFunction)deque_rotate,\r
+        METH_VARARGS,            rotate_doc},\r
+    {"__sizeof__",              (PyCFunction)deque_sizeof,\r
+        METH_NOARGS,             sizeof_doc},\r
+    {NULL,              NULL}   /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(deque_doc,\r
+"deque([iterable[, maxlen]]) --> deque object\n\\r
+\n\\r
+Build an ordered collection with optimized access from its endpoints.");\r
+\r
+static PyTypeObject deque_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "collections.deque",                /* tp_name */\r
+    sizeof(dequeobject),                /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)deque_dealloc,          /* tp_dealloc */\r
+    deque_tp_print,                     /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    deque_repr,                         /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    &deque_as_sequence,                 /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    (hashfunc)PyObject_HashNotImplemented,      /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */\r
+    deque_doc,                          /* tp_doc */\r
+    (traverseproc)deque_traverse,       /* tp_traverse */\r
+    (inquiry)deque_clear,               /* tp_clear */\r
+    (richcmpfunc)deque_richcompare,     /* tp_richcompare */\r
+    offsetof(dequeobject, weakreflist),         /* tp_weaklistoffset*/\r
+    (getiterfunc)deque_iter,            /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    deque_methods,                      /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    deque_getset,       /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    (initproc)deque_init,               /* tp_init */\r
+    PyType_GenericAlloc,                /* tp_alloc */\r
+    deque_new,                          /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+/*********************** Deque Iterator **************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t index;\r
+    block *b;\r
+    dequeobject *deque;\r
+    long state;         /* state when the iterator is created */\r
+    Py_ssize_t counter;    /* number of items remaining for iteration */\r
+} dequeiterobject;\r
+\r
+static PyTypeObject dequeiter_type;\r
+\r
+static PyObject *\r
+deque_iter(dequeobject *deque)\r
+{\r
+    dequeiterobject *it;\r
+\r
+    it = PyObject_GC_New(dequeiterobject, &dequeiter_type);\r
+    if (it == NULL)\r
+        return NULL;\r
+    it->b = deque->leftblock;\r
+    it->index = deque->leftindex;\r
+    Py_INCREF(deque);\r
+    it->deque = deque;\r
+    it->state = deque->state;\r
+    it->counter = deque->len;\r
+    PyObject_GC_Track(it);\r
+    return (PyObject *)it;\r
+}\r
+\r
+static int\r
+dequeiter_traverse(dequeiterobject *dio, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(dio->deque);\r
+    return 0;\r
+}\r
+\r
+static void\r
+dequeiter_dealloc(dequeiterobject *dio)\r
+{\r
+    Py_XDECREF(dio->deque);\r
+    PyObject_GC_Del(dio);\r
+}\r
+\r
+static PyObject *\r
+dequeiter_next(dequeiterobject *it)\r
+{\r
+    PyObject *item;\r
+\r
+    if (it->deque->state != it->state) {\r
+        it->counter = 0;\r
+        PyErr_SetString(PyExc_RuntimeError,\r
+                        "deque mutated during iteration");\r
+        return NULL;\r
+    }\r
+    if (it->counter == 0)\r
+        return NULL;\r
+    assert (!(it->b == it->deque->rightblock &&\r
+              it->index > it->deque->rightindex));\r
+\r
+    item = it->b->data[it->index];\r
+    it->index++;\r
+    it->counter--;\r
+    if (it->index == BLOCKLEN && it->counter > 0) {\r
+        assert (it->b->rightlink != NULL);\r
+        it->b = it->b->rightlink;\r
+        it->index = 0;\r
+    }\r
+    Py_INCREF(item);\r
+    return item;\r
+}\r
+\r
+static PyObject *\r
+dequeiter_len(dequeiterobject *it)\r
+{\r
+    return PyInt_FromLong(it->counter);\r
+}\r
+\r
+PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");\r
+\r
+static PyMethodDef dequeiter_methods[] = {\r
+    {"__length_hint__", (PyCFunction)dequeiter_len, METH_NOARGS, length_hint_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+static PyTypeObject dequeiter_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "deque_iterator",                           /* tp_name */\r
+    sizeof(dequeiterobject),                    /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)dequeiter_dealloc,              /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\r
+    0,                                          /* tp_doc */\r
+    (traverseproc)dequeiter_traverse,           /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                          /* tp_iter */\r
+    (iternextfunc)dequeiter_next,               /* tp_iternext */\r
+    dequeiter_methods,                          /* tp_methods */\r
+    0,\r
+};\r
+\r
+/*********************** Deque Reverse Iterator **************************/\r
+\r
+static PyTypeObject dequereviter_type;\r
+\r
+static PyObject *\r
+deque_reviter(dequeobject *deque)\r
+{\r
+    dequeiterobject *it;\r
+\r
+    it = PyObject_GC_New(dequeiterobject, &dequereviter_type);\r
+    if (it == NULL)\r
+        return NULL;\r
+    it->b = deque->rightblock;\r
+    it->index = deque->rightindex;\r
+    Py_INCREF(deque);\r
+    it->deque = deque;\r
+    it->state = deque->state;\r
+    it->counter = deque->len;\r
+    PyObject_GC_Track(it);\r
+    return (PyObject *)it;\r
+}\r
+\r
+static PyObject *\r
+dequereviter_next(dequeiterobject *it)\r
+{\r
+    PyObject *item;\r
+    if (it->counter == 0)\r
+        return NULL;\r
+\r
+    if (it->deque->state != it->state) {\r
+        it->counter = 0;\r
+        PyErr_SetString(PyExc_RuntimeError,\r
+                        "deque mutated during iteration");\r
+        return NULL;\r
+    }\r
+    assert (!(it->b == it->deque->leftblock &&\r
+              it->index < it->deque->leftindex));\r
+\r
+    item = it->b->data[it->index];\r
+    it->index--;\r
+    it->counter--;\r
+    if (it->index == -1 && it->counter > 0) {\r
+        assert (it->b->leftlink != NULL);\r
+        it->b = it->b->leftlink;\r
+        it->index = BLOCKLEN - 1;\r
+    }\r
+    Py_INCREF(item);\r
+    return item;\r
+}\r
+\r
+static PyTypeObject dequereviter_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "deque_reverse_iterator",                   /* tp_name */\r
+    sizeof(dequeiterobject),                    /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)dequeiter_dealloc,              /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\r
+    0,                                          /* tp_doc */\r
+    (traverseproc)dequeiter_traverse,           /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                          /* tp_iter */\r
+    (iternextfunc)dequereviter_next,            /* tp_iternext */\r
+    dequeiter_methods,                          /* tp_methods */\r
+    0,\r
+};\r
+\r
+/* defaultdict type *********************************************************/\r
+\r
+typedef struct {\r
+    PyDictObject dict;\r
+    PyObject *default_factory;\r
+} defdictobject;\r
+\r
+static PyTypeObject defdict_type; /* Forward */\r
+\r
+PyDoc_STRVAR(defdict_missing_doc,\r
+"__missing__(key) # Called by __getitem__ for missing key; pseudo-code:\n\\r
+  if self.default_factory is None: raise KeyError((key,))\n\\r
+  self[key] = value = self.default_factory()\n\\r
+  return value\n\\r
+");\r
+\r
+static PyObject *\r
+defdict_missing(defdictobject *dd, PyObject *key)\r
+{\r
+    PyObject *factory = dd->default_factory;\r
+    PyObject *value;\r
+    if (factory == NULL || factory == Py_None) {\r
+        /* XXX Call dict.__missing__(key) */\r
+        PyObject *tup;\r
+        tup = PyTuple_Pack(1, key);\r
+        if (!tup) return NULL;\r
+        PyErr_SetObject(PyExc_KeyError, tup);\r
+        Py_DECREF(tup);\r
+        return NULL;\r
+    }\r
+    value = PyEval_CallObject(factory, NULL);\r
+    if (value == NULL)\r
+        return value;\r
+    if (PyObject_SetItem((PyObject *)dd, key, value) < 0) {\r
+        Py_DECREF(value);\r
+        return NULL;\r
+    }\r
+    return value;\r
+}\r
+\r
+PyDoc_STRVAR(defdict_copy_doc, "D.copy() -> a shallow copy of D.");\r
+\r
+static PyObject *\r
+defdict_copy(defdictobject *dd)\r
+{\r
+    /* This calls the object's class.  That only works for subclasses\r
+       whose class constructor has the same signature.  Subclasses that\r
+       define a different constructor signature must override copy().\r
+    */\r
+\r
+    if (dd->default_factory == NULL)\r
+        return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);\r
+    return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),\r
+                                        dd->default_factory, dd, NULL);\r
+}\r
+\r
+static PyObject *\r
+defdict_reduce(defdictobject *dd)\r
+{\r
+    /* __reduce__ must return a 5-tuple as follows:\r
+\r
+       - factory function\r
+       - tuple of args for the factory function\r
+       - additional state (here None)\r
+       - sequence iterator (here None)\r
+       - dictionary iterator (yielding successive (key, value) pairs\r
+\r
+       This API is used by pickle.py and copy.py.\r
+\r
+       For this to be useful with pickle.py, the default_factory\r
+       must be picklable; e.g., None, a built-in, or a global\r
+       function in a module or package.\r
+\r
+       Both shallow and deep copying are supported, but for deep\r
+       copying, the default_factory must be deep-copyable; e.g. None,\r
+       or a built-in (functions are not copyable at this time).\r
+\r
+       This only works for subclasses as long as their constructor\r
+       signature is compatible; the first argument must be the\r
+       optional default_factory, defaulting to None.\r
+    */\r
+    PyObject *args;\r
+    PyObject *items;\r
+    PyObject *result;\r
+    if (dd->default_factory == NULL || dd->default_factory == Py_None)\r
+        args = PyTuple_New(0);\r
+    else\r
+        args = PyTuple_Pack(1, dd->default_factory);\r
+    if (args == NULL)\r
+        return NULL;\r
+    items = PyObject_CallMethod((PyObject *)dd, "iteritems", "()");\r
+    if (items == NULL) {\r
+        Py_DECREF(args);\r
+        return NULL;\r
+    }\r
+    result = PyTuple_Pack(5, Py_TYPE(dd), args,\r
+                          Py_None, Py_None, items);\r
+    Py_DECREF(items);\r
+    Py_DECREF(args);\r
+    return result;\r
+}\r
+\r
+static PyMethodDef defdict_methods[] = {\r
+    {"__missing__", (PyCFunction)defdict_missing, METH_O,\r
+     defdict_missing_doc},\r
+    {"copy", (PyCFunction)defdict_copy, METH_NOARGS,\r
+     defdict_copy_doc},\r
+    {"__copy__", (PyCFunction)defdict_copy, METH_NOARGS,\r
+     defdict_copy_doc},\r
+    {"__reduce__", (PyCFunction)defdict_reduce, METH_NOARGS,\r
+     reduce_doc},\r
+    {NULL}\r
+};\r
+\r
+static PyMemberDef defdict_members[] = {\r
+    {"default_factory", T_OBJECT,\r
+     offsetof(defdictobject, default_factory), 0,\r
+     PyDoc_STR("Factory for default value called by __missing__().")},\r
+    {NULL}\r
+};\r
+\r
+static void\r
+defdict_dealloc(defdictobject *dd)\r
+{\r
+    Py_CLEAR(dd->default_factory);\r
+    PyDict_Type.tp_dealloc((PyObject *)dd);\r
+}\r
+\r
+static int\r
+defdict_print(defdictobject *dd, FILE *fp, int flags)\r
+{\r
+    int sts;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    fprintf(fp, "defaultdict(");\r
+    Py_END_ALLOW_THREADS\r
+    if (dd->default_factory == NULL) {\r
+        Py_BEGIN_ALLOW_THREADS\r
+        fprintf(fp, "None");\r
+        Py_END_ALLOW_THREADS\r
+    } else {\r
+        PyObject_Print(dd->default_factory, fp, 0);\r
+    }\r
+    Py_BEGIN_ALLOW_THREADS\r
+    fprintf(fp, ", ");\r
+    Py_END_ALLOW_THREADS\r
+    sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    fprintf(fp, ")");\r
+    Py_END_ALLOW_THREADS\r
+    return sts;\r
+}\r
+\r
+static PyObject *\r
+defdict_repr(defdictobject *dd)\r
+{\r
+    PyObject *defrepr;\r
+    PyObject *baserepr;\r
+    PyObject *result;\r
+    baserepr = PyDict_Type.tp_repr((PyObject *)dd);\r
+    if (baserepr == NULL)\r
+        return NULL;\r
+    if (dd->default_factory == NULL)\r
+        defrepr = PyString_FromString("None");\r
+    else\r
+    {\r
+        int status = Py_ReprEnter(dd->default_factory);\r
+        if (status != 0) {\r
+            if (status < 0) {\r
+                Py_DECREF(baserepr);\r
+                return NULL;\r
+            }\r
+            defrepr = PyString_FromString("...");\r
+        }\r
+        else\r
+            defrepr = PyObject_Repr(dd->default_factory);\r
+        Py_ReprLeave(dd->default_factory);\r
+    }\r
+    if (defrepr == NULL) {\r
+        Py_DECREF(baserepr);\r
+        return NULL;\r
+    }\r
+    result = PyString_FromFormat("defaultdict(%s, %s)",\r
+                                 PyString_AS_STRING(defrepr),\r
+                                 PyString_AS_STRING(baserepr));\r
+    Py_DECREF(defrepr);\r
+    Py_DECREF(baserepr);\r
+    return result;\r
+}\r
+\r
+static int\r
+defdict_traverse(PyObject *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(((defdictobject *)self)->default_factory);\r
+    return PyDict_Type.tp_traverse(self, visit, arg);\r
+}\r
+\r
+static int\r
+defdict_tp_clear(defdictobject *dd)\r
+{\r
+    Py_CLEAR(dd->default_factory);\r
+    return PyDict_Type.tp_clear((PyObject *)dd);\r
+}\r
+\r
+static int\r
+defdict_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    defdictobject *dd = (defdictobject *)self;\r
+    PyObject *olddefault = dd->default_factory;\r
+    PyObject *newdefault = NULL;\r
+    PyObject *newargs;\r
+    int result;\r
+    if (args == NULL || !PyTuple_Check(args))\r
+        newargs = PyTuple_New(0);\r
+    else {\r
+        Py_ssize_t n = PyTuple_GET_SIZE(args);\r
+        if (n > 0) {\r
+            newdefault = PyTuple_GET_ITEM(args, 0);\r
+            if (!PyCallable_Check(newdefault) && newdefault != Py_None) {\r
+                PyErr_SetString(PyExc_TypeError,\r
+                    "first argument must be callable");\r
+                return -1;\r
+            }\r
+        }\r
+        newargs = PySequence_GetSlice(args, 1, n);\r
+    }\r
+    if (newargs == NULL)\r
+        return -1;\r
+    Py_XINCREF(newdefault);\r
+    dd->default_factory = newdefault;\r
+    result = PyDict_Type.tp_init(self, newargs, kwds);\r
+    Py_DECREF(newargs);\r
+    Py_XDECREF(olddefault);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(defdict_doc,\r
+"defaultdict(default_factory[, ...]) --> dict with default factory\n\\r
+\n\\r
+The default factory is called without arguments to produce\n\\r
+a new value when a key is not present, in __getitem__ only.\n\\r
+A defaultdict compares equal to a dict with the same items.\n\\r
+All remaining arguments are treated the same as if they were\n\\r
+passed to the dict constructor, including keyword arguments.\n\\r
+");\r
+\r
+/* See comment in xxsubtype.c */\r
+#define DEFERRED_ADDRESS(ADDR) 0\r
+\r
+static PyTypeObject defdict_type = {\r
+    PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)\r
+    "collections.defaultdict",          /* tp_name */\r
+    sizeof(defdictobject),              /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)defdict_dealloc,        /* tp_dealloc */\r
+    (printfunc)defdict_print,           /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    (reprfunc)defdict_repr,             /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_HAVE_WEAKREFS,               /* tp_flags */\r
+    defdict_doc,                        /* tp_doc */\r
+    defdict_traverse,                   /* tp_traverse */\r
+    (inquiry)defdict_tp_clear,          /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset*/\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    defdict_methods,                    /* tp_methods */\r
+    defdict_members,                    /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    DEFERRED_ADDRESS(&PyDict_Type),     /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    defdict_init,                       /* tp_init */\r
+    PyType_GenericAlloc,                /* tp_alloc */\r
+    0,                                  /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+/* module level code ********************************************************/\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"High performance data structures.\n\\r
+- deque:        ordered collection accessible from endpoints only\n\\r
+- defaultdict:  dict subclass with a default value factory\n\\r
+");\r
+\r
+PyMODINIT_FUNC\r
+init_collections(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("_collections", NULL, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    if (PyType_Ready(&deque_type) < 0)\r
+        return;\r
+    Py_INCREF(&deque_type);\r
+    PyModule_AddObject(m, "deque", (PyObject *)&deque_type);\r
+\r
+    defdict_type.tp_base = &PyDict_Type;\r
+    if (PyType_Ready(&defdict_type) < 0)\r
+        return;\r
+    Py_INCREF(&defdict_type);\r
+    PyModule_AddObject(m, "defaultdict", (PyObject *)&defdict_type);\r
+\r
+    if (PyType_Ready(&dequeiter_type) < 0)\r
+        return;\r
+\r
+    if (PyType_Ready(&dequereviter_type) < 0)\r
+        return;\r
+\r
+    return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_csv.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_csv.c
new file mode 100644 (file)
index 0000000..ab0dbe4
--- /dev/null
@@ -0,0 +1,1629 @@
+/* csv module */\r
+\r
+/*\r
+\r
+This module provides the low-level underpinnings of a CSV reading/writing\r
+module.  Users should not use this module directly, but import the csv.py\r
+module instead.\r
+\r
+**** For people modifying this code, please note that as of this writing\r
+**** (2003-03-23), it is intended that this code should work with Python\r
+**** 2.2.\r
+\r
+*/\r
+\r
+#define MODULE_VERSION "1.0"\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+\r
+/* begin 2.2 compatibility macros */\r
+#ifndef PyDoc_STRVAR\r
+/* Define macros for inline documentation. */\r
+#define PyDoc_VAR(name) static char name[]\r
+#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)\r
+#ifdef WITH_DOC_STRINGS\r
+#define PyDoc_STR(str) str\r
+#else\r
+#define PyDoc_STR(str) ""\r
+#endif\r
+#endif /* ifndef PyDoc_STRVAR */\r
+\r
+#ifndef PyMODINIT_FUNC\r
+#       if defined(__cplusplus)\r
+#               define PyMODINIT_FUNC extern "C" void\r
+#       else /* __cplusplus */\r
+#               define PyMODINIT_FUNC void\r
+#       endif /* __cplusplus */\r
+#endif\r
+\r
+#ifndef Py_CLEAR\r
+#define Py_CLEAR(op)                                            \\r
+    do {                                                        \\r
+        if (op) {                                               \\r
+            PyObject *tmp = (PyObject *)(op);                   \\r
+            (op) = NULL;                                        \\r
+            Py_DECREF(tmp);                                     \\r
+        }                                                       \\r
+    } while (0)\r
+#endif\r
+#ifndef Py_VISIT\r
+#define Py_VISIT(op)                                                    \\r
+    do {                                                                \\r
+        if (op) {                                                       \\r
+            int vret = visit((PyObject *)(op), arg);                    \\r
+            if (vret)                                                   \\r
+                return vret;                                            \\r
+        }                                                               \\r
+    } while (0)\r
+#endif\r
+\r
+/* end 2.2 compatibility macros */\r
+\r
+#define IS_BASESTRING(o) \\r
+    PyObject_TypeCheck(o, &PyBaseString_Type)\r
+\r
+static PyObject *error_obj;     /* CSV exception */\r
+static PyObject *dialects;      /* Dialect registry */\r
+static long field_limit = 128 * 1024;   /* max parsed field size */\r
+\r
+typedef enum {\r
+    START_RECORD, START_FIELD, ESCAPED_CHAR, IN_FIELD,\r
+    IN_QUOTED_FIELD, ESCAPE_IN_QUOTED_FIELD, QUOTE_IN_QUOTED_FIELD,\r
+    EAT_CRNL\r
+} ParserState;\r
+\r
+typedef enum {\r
+    QUOTE_MINIMAL, QUOTE_ALL, QUOTE_NONNUMERIC, QUOTE_NONE\r
+} QuoteStyle;\r
+\r
+typedef struct {\r
+    QuoteStyle style;\r
+    char *name;\r
+} StyleDesc;\r
+\r
+static StyleDesc quote_styles[] = {\r
+    { QUOTE_MINIMAL,    "QUOTE_MINIMAL" },\r
+    { QUOTE_ALL,        "QUOTE_ALL" },\r
+    { QUOTE_NONNUMERIC, "QUOTE_NONNUMERIC" },\r
+    { QUOTE_NONE,       "QUOTE_NONE" },\r
+    { 0 }\r
+};\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+\r
+    int doublequote;            /* is " represented by ""? */\r
+    char delimiter;             /* field separator */\r
+    char quotechar;             /* quote character */\r
+    char escapechar;            /* escape character */\r
+    int skipinitialspace;       /* ignore spaces following delimiter? */\r
+    PyObject *lineterminator; /* string to write between records */\r
+    int quoting;                /* style of quoting to write */\r
+\r
+    int strict;                 /* raise exception on bad CSV */\r
+} DialectObj;\r
+\r
+staticforward PyTypeObject Dialect_Type;\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+\r
+    PyObject *input_iter;   /* iterate over this for input lines */\r
+\r
+    DialectObj *dialect;    /* parsing dialect */\r
+\r
+    PyObject *fields;           /* field list for current record */\r
+    ParserState state;          /* current CSV parse state */\r
+    char *field;                /* build current field in here */\r
+    int field_size;             /* size of allocated buffer */\r
+    int field_len;              /* length of current field */\r
+    int numeric_field;          /* treat field as numeric */\r
+    unsigned long line_num;     /* Source-file line number */\r
+} ReaderObj;\r
+\r
+staticforward PyTypeObject Reader_Type;\r
+\r
+#define ReaderObject_Check(v)   (Py_TYPE(v) == &Reader_Type)\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+\r
+    PyObject *writeline;    /* write output lines to this file */\r
+\r
+    DialectObj *dialect;    /* parsing dialect */\r
+\r
+    char *rec;                  /* buffer for parser.join */\r
+    int rec_size;               /* size of allocated record */\r
+    int rec_len;                /* length of record */\r
+    int num_fields;             /* number of fields in record */\r
+} WriterObj;\r
+\r
+staticforward PyTypeObject Writer_Type;\r
+\r
+/*\r
+ * DIALECT class\r
+ */\r
+\r
+static PyObject *\r
+get_dialect_from_registry(PyObject * name_obj)\r
+{\r
+    PyObject *dialect_obj;\r
+\r
+    dialect_obj = PyDict_GetItem(dialects, name_obj);\r
+    if (dialect_obj == NULL) {\r
+        if (!PyErr_Occurred())\r
+            PyErr_Format(error_obj, "unknown dialect");\r
+    }\r
+    else\r
+        Py_INCREF(dialect_obj);\r
+    return dialect_obj;\r
+}\r
+\r
+static PyObject *\r
+get_string(PyObject *str)\r
+{\r
+    Py_XINCREF(str);\r
+    return str;\r
+}\r
+\r
+static PyObject *\r
+get_nullchar_as_None(char c)\r
+{\r
+    if (c == '\0') {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    else\r
+        return PyString_FromStringAndSize((char*)&c, 1);\r
+}\r
+\r
+static PyObject *\r
+Dialect_get_lineterminator(DialectObj *self)\r
+{\r
+    return get_string(self->lineterminator);\r
+}\r
+\r
+static PyObject *\r
+Dialect_get_escapechar(DialectObj *self)\r
+{\r
+    return get_nullchar_as_None(self->escapechar);\r
+}\r
+\r
+static PyObject *\r
+Dialect_get_quotechar(DialectObj *self)\r
+{\r
+    return get_nullchar_as_None(self->quotechar);\r
+}\r
+\r
+static PyObject *\r
+Dialect_get_quoting(DialectObj *self)\r
+{\r
+    return PyInt_FromLong(self->quoting);\r
+}\r
+\r
+static int\r
+_set_bool(const char *name, int *target, PyObject *src, int dflt)\r
+{\r
+    if (src == NULL)\r
+        *target = dflt;\r
+    else {\r
+        int b = PyObject_IsTrue(src);\r
+        if (b < 0)\r
+            return -1;\r
+        *target = b;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+_set_int(const char *name, int *target, PyObject *src, int dflt)\r
+{\r
+    if (src == NULL)\r
+        *target = dflt;\r
+    else {\r
+        if (!PyInt_Check(src)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "\"%s\" must be an integer", name);\r
+            return -1;\r
+        }\r
+        *target = PyInt_AsLong(src);\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+_set_char(const char *name, char *target, PyObject *src, char dflt)\r
+{\r
+    if (src == NULL)\r
+        *target = dflt;\r
+    else {\r
+        *target = '\0';\r
+        if (src != Py_None) {\r
+            Py_ssize_t len;\r
+            if (!PyString_Check(src)) {\r
+                PyErr_Format(PyExc_TypeError,\r
+                    "\"%s\" must be string, not %.200s", name,\r
+                    src->ob_type->tp_name);\r
+                return -1;\r
+            }\r
+            len = PyString_GET_SIZE(src);\r
+            if (len > 1) {\r
+                PyErr_Format(PyExc_TypeError,\r
+                    "\"%s\" must be an 1-character string",\r
+                    name);\r
+                return -1;\r
+            }\r
+            if (len > 0)\r
+                *target = *PyString_AS_STRING(src);\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+_set_str(const char *name, PyObject **target, PyObject *src, const char *dflt)\r
+{\r
+    if (src == NULL)\r
+        *target = PyString_FromString(dflt);\r
+    else {\r
+        if (src == Py_None)\r
+            *target = NULL;\r
+        else if (!IS_BASESTRING(src)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "\"%s\" must be a string", name);\r
+            return -1;\r
+        }\r
+        else {\r
+            Py_XDECREF(*target);\r
+            Py_INCREF(src);\r
+            *target = src;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+dialect_check_quoting(int quoting)\r
+{\r
+    StyleDesc *qs = quote_styles;\r
+\r
+    for (qs = quote_styles; qs->name; qs++) {\r
+        if (qs->style == quoting)\r
+            return 0;\r
+    }\r
+    PyErr_Format(PyExc_TypeError, "bad \"quoting\" value");\r
+    return -1;\r
+}\r
+\r
+#define D_OFF(x) offsetof(DialectObj, x)\r
+\r
+static struct PyMemberDef Dialect_memberlist[] = {\r
+    { "delimiter",          T_CHAR, D_OFF(delimiter), READONLY },\r
+    { "skipinitialspace",   T_INT, D_OFF(skipinitialspace), READONLY },\r
+    { "doublequote",        T_INT, D_OFF(doublequote), READONLY },\r
+    { "strict",             T_INT, D_OFF(strict), READONLY },\r
+    { NULL }\r
+};\r
+\r
+static PyGetSetDef Dialect_getsetlist[] = {\r
+    { "escapechar",             (getter)Dialect_get_escapechar},\r
+    { "lineterminator",         (getter)Dialect_get_lineterminator},\r
+    { "quotechar",              (getter)Dialect_get_quotechar},\r
+    { "quoting",                (getter)Dialect_get_quoting},\r
+    {NULL},\r
+};\r
+\r
+static void\r
+Dialect_dealloc(DialectObj *self)\r
+{\r
+    Py_XDECREF(self->lineterminator);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static char *dialect_kws[] = {\r
+    "dialect",\r
+    "delimiter",\r
+    "doublequote",\r
+    "escapechar",\r
+    "lineterminator",\r
+    "quotechar",\r
+    "quoting",\r
+    "skipinitialspace",\r
+    "strict",\r
+    NULL\r
+};\r
+\r
+static PyObject *\r
+dialect_new(PyTypeObject *type, PyObject *args, PyObject *kwargs)\r
+{\r
+    DialectObj *self;\r
+    PyObject *ret = NULL;\r
+    PyObject *dialect = NULL;\r
+    PyObject *delimiter = NULL;\r
+    PyObject *doublequote = NULL;\r
+    PyObject *escapechar = NULL;\r
+    PyObject *lineterminator = NULL;\r
+    PyObject *quotechar = NULL;\r
+    PyObject *quoting = NULL;\r
+    PyObject *skipinitialspace = NULL;\r
+    PyObject *strict = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs,\r
+                                     "|OOOOOOOOO", dialect_kws,\r
+                                     &dialect,\r
+                                     &delimiter,\r
+                                     &doublequote,\r
+                                     &escapechar,\r
+                                     &lineterminator,\r
+                                     &quotechar,\r
+                                     &quoting,\r
+                                     &skipinitialspace,\r
+                                     &strict))\r
+        return NULL;\r
+\r
+    if (dialect != NULL) {\r
+        if (IS_BASESTRING(dialect)) {\r
+            dialect = get_dialect_from_registry(dialect);\r
+            if (dialect == NULL)\r
+                return NULL;\r
+        }\r
+        else\r
+            Py_INCREF(dialect);\r
+        /* Can we reuse this instance? */\r
+        if (PyObject_TypeCheck(dialect, &Dialect_Type) &&\r
+            delimiter == 0 &&\r
+            doublequote == 0 &&\r
+            escapechar == 0 &&\r
+            lineterminator == 0 &&\r
+            quotechar == 0 &&\r
+            quoting == 0 &&\r
+            skipinitialspace == 0 &&\r
+            strict == 0)\r
+            return dialect;\r
+    }\r
+\r
+    self = (DialectObj *)type->tp_alloc(type, 0);\r
+    if (self == NULL) {\r
+        Py_XDECREF(dialect);\r
+        return NULL;\r
+    }\r
+    self->lineterminator = NULL;\r
+\r
+    Py_XINCREF(delimiter);\r
+    Py_XINCREF(doublequote);\r
+    Py_XINCREF(escapechar);\r
+    Py_XINCREF(lineterminator);\r
+    Py_XINCREF(quotechar);\r
+    Py_XINCREF(quoting);\r
+    Py_XINCREF(skipinitialspace);\r
+    Py_XINCREF(strict);\r
+    if (dialect != NULL) {\r
+#define DIALECT_GETATTR(v, n) \\r
+        if (v == NULL) \\r
+            v = PyObject_GetAttrString(dialect, n)\r
+        DIALECT_GETATTR(delimiter, "delimiter");\r
+        DIALECT_GETATTR(doublequote, "doublequote");\r
+        DIALECT_GETATTR(escapechar, "escapechar");\r
+        DIALECT_GETATTR(lineterminator, "lineterminator");\r
+        DIALECT_GETATTR(quotechar, "quotechar");\r
+        DIALECT_GETATTR(quoting, "quoting");\r
+        DIALECT_GETATTR(skipinitialspace, "skipinitialspace");\r
+        DIALECT_GETATTR(strict, "strict");\r
+        PyErr_Clear();\r
+    }\r
+\r
+    /* check types and convert to C values */\r
+#define DIASET(meth, name, target, src, dflt) \\r
+    if (meth(name, target, src, dflt)) \\r
+        goto err\r
+    DIASET(_set_char, "delimiter", &self->delimiter, delimiter, ',');\r
+    DIASET(_set_bool, "doublequote", &self->doublequote, doublequote, 1);\r
+    DIASET(_set_char, "escapechar", &self->escapechar, escapechar, 0);\r
+    DIASET(_set_str, "lineterminator", &self->lineterminator, lineterminator, "\r\n");\r
+    DIASET(_set_char, "quotechar", &self->quotechar, quotechar, '"');\r
+    DIASET(_set_int, "quoting", &self->quoting, quoting, QUOTE_MINIMAL);\r
+    DIASET(_set_bool, "skipinitialspace", &self->skipinitialspace, skipinitialspace, 0);\r
+    DIASET(_set_bool, "strict", &self->strict, strict, 0);\r
+\r
+    /* validate options */\r
+    if (dialect_check_quoting(self->quoting))\r
+        goto err;\r
+    if (self->delimiter == 0) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "\"delimiter\" must be an 1-character string");\r
+        goto err;\r
+    }\r
+    if (quotechar == Py_None && quoting == NULL)\r
+        self->quoting = QUOTE_NONE;\r
+    if (self->quoting != QUOTE_NONE && self->quotechar == 0) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "quotechar must be set if quoting enabled");\r
+        goto err;\r
+    }\r
+    if (self->lineterminator == 0) {\r
+        PyErr_SetString(PyExc_TypeError, "lineterminator must be set");\r
+        goto err;\r
+    }\r
+\r
+    ret = (PyObject *)self;\r
+    Py_INCREF(self);\r
+err:\r
+    Py_XDECREF(self);\r
+    Py_XDECREF(dialect);\r
+    Py_XDECREF(delimiter);\r
+    Py_XDECREF(doublequote);\r
+    Py_XDECREF(escapechar);\r
+    Py_XDECREF(lineterminator);\r
+    Py_XDECREF(quotechar);\r
+    Py_XDECREF(quoting);\r
+    Py_XDECREF(skipinitialspace);\r
+    Py_XDECREF(strict);\r
+    return ret;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(Dialect_Type_doc,\r
+"CSV dialect\n"\r
+"\n"\r
+"The Dialect type records CSV parsing and generation options.\n");\r
+\r
+static PyTypeObject Dialect_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_csv.Dialect",                         /* tp_name */\r
+    sizeof(DialectObj),                     /* tp_basicsize */\r
+    0,                                      /* tp_itemsize */\r
+    /*  methods  */\r
+    (destructor)Dialect_dealloc,            /* tp_dealloc */\r
+    (printfunc)0,                           /* tp_print */\r
+    (getattrfunc)0,                         /* tp_getattr */\r
+    (setattrfunc)0,                         /* tp_setattr */\r
+    (cmpfunc)0,                             /* tp_compare */\r
+    (reprfunc)0,                            /* tp_repr */\r
+    0,                                      /* tp_as_number */\r
+    0,                                      /* tp_as_sequence */\r
+    0,                                      /* tp_as_mapping */\r
+    (hashfunc)0,                            /* tp_hash */\r
+    (ternaryfunc)0,                         /* tp_call */\r
+    (reprfunc)0,                                /* tp_str */\r
+    0,                                      /* tp_getattro */\r
+    0,                                      /* tp_setattro */\r
+    0,                                      /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */\r
+    Dialect_Type_doc,                       /* tp_doc */\r
+    0,                                      /* tp_traverse */\r
+    0,                                      /* tp_clear */\r
+    0,                                      /* tp_richcompare */\r
+    0,                                      /* tp_weaklistoffset */\r
+    0,                                      /* tp_iter */\r
+    0,                                      /* tp_iternext */\r
+    0,                                          /* tp_methods */\r
+    Dialect_memberlist,                     /* tp_members */\r
+    Dialect_getsetlist,                     /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    0,                                          /* tp_alloc */\r
+    dialect_new,                                /* tp_new */\r
+    0,                                          /* tp_free */\r
+};\r
+\r
+/*\r
+ * Return an instance of the dialect type, given a Python instance or kwarg\r
+ * description of the dialect\r
+ */\r
+static PyObject *\r
+_call_dialect(PyObject *dialect_inst, PyObject *kwargs)\r
+{\r
+    PyObject *ctor_args;\r
+    PyObject *dialect;\r
+\r
+    ctor_args = Py_BuildValue(dialect_inst ? "(O)" : "()", dialect_inst);\r
+    if (ctor_args == NULL)\r
+        return NULL;\r
+    dialect = PyObject_Call((PyObject *)&Dialect_Type, ctor_args, kwargs);\r
+    Py_DECREF(ctor_args);\r
+    return dialect;\r
+}\r
+\r
+/*\r
+ * READER\r
+ */\r
+static int\r
+parse_save_field(ReaderObj *self)\r
+{\r
+    PyObject *field;\r
+\r
+    field = PyString_FromStringAndSize(self->field, self->field_len);\r
+    if (field == NULL)\r
+        return -1;\r
+    self->field_len = 0;\r
+    if (self->numeric_field) {\r
+        PyObject *tmp;\r
+\r
+        self->numeric_field = 0;\r
+        tmp = PyNumber_Float(field);\r
+        if (tmp == NULL) {\r
+            Py_DECREF(field);\r
+            return -1;\r
+        }\r
+        Py_DECREF(field);\r
+        field = tmp;\r
+    }\r
+    PyList_Append(self->fields, field);\r
+    Py_DECREF(field);\r
+    return 0;\r
+}\r
+\r
+static int\r
+parse_grow_buff(ReaderObj *self)\r
+{\r
+    if (self->field_size == 0) {\r
+        self->field_size = 4096;\r
+        if (self->field != NULL)\r
+            PyMem_Free(self->field);\r
+        self->field = PyMem_Malloc(self->field_size);\r
+    }\r
+    else {\r
+        if (self->field_size > INT_MAX / 2) {\r
+            PyErr_NoMemory();\r
+            return 0;\r
+        }\r
+        self->field_size *= 2;\r
+        self->field = PyMem_Realloc(self->field, self->field_size);\r
+    }\r
+    if (self->field == NULL) {\r
+        PyErr_NoMemory();\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+static int\r
+parse_add_char(ReaderObj *self, char c)\r
+{\r
+    if (self->field_len >= field_limit) {\r
+        PyErr_Format(error_obj, "field larger than field limit (%ld)",\r
+                     field_limit);\r
+        return -1;\r
+    }\r
+    if (self->field_len == self->field_size && !parse_grow_buff(self))\r
+        return -1;\r
+    self->field[self->field_len++] = c;\r
+    return 0;\r
+}\r
+\r
+static int\r
+parse_process_char(ReaderObj *self, char c)\r
+{\r
+    DialectObj *dialect = self->dialect;\r
+\r
+    switch (self->state) {\r
+    case START_RECORD:\r
+        /* start of record */\r
+        if (c == '\0')\r
+            /* empty line - return [] */\r
+            break;\r
+        else if (c == '\n' || c == '\r') {\r
+            self->state = EAT_CRNL;\r
+            break;\r
+        }\r
+        /* normal character - handle as START_FIELD */\r
+        self->state = START_FIELD;\r
+        /* fallthru */\r
+    case START_FIELD:\r
+        /* expecting field */\r
+        if (c == '\n' || c == '\r' || c == '\0') {\r
+            /* save empty field - return [fields] */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+            self->state = (c == '\0' ? START_RECORD : EAT_CRNL);\r
+        }\r
+        else if (c == dialect->quotechar &&\r
+                 dialect->quoting != QUOTE_NONE) {\r
+            /* start quoted field */\r
+            self->state = IN_QUOTED_FIELD;\r
+        }\r
+        else if (c == dialect->escapechar) {\r
+            /* possible escaped character */\r
+            self->state = ESCAPED_CHAR;\r
+        }\r
+        else if (c == ' ' && dialect->skipinitialspace)\r
+            /* ignore space at start of field */\r
+            ;\r
+        else if (c == dialect->delimiter) {\r
+            /* save empty field */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+        }\r
+        else {\r
+            /* begin new unquoted field */\r
+            if (dialect->quoting == QUOTE_NONNUMERIC)\r
+                self->numeric_field = 1;\r
+            if (parse_add_char(self, c) < 0)\r
+                return -1;\r
+            self->state = IN_FIELD;\r
+        }\r
+        break;\r
+\r
+    case ESCAPED_CHAR:\r
+        if (c == '\0')\r
+            c = '\n';\r
+        if (parse_add_char(self, c) < 0)\r
+            return -1;\r
+        self->state = IN_FIELD;\r
+        break;\r
+\r
+    case IN_FIELD:\r
+        /* in unquoted field */\r
+        if (c == '\n' || c == '\r' || c == '\0') {\r
+            /* end of line - return [fields] */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+            self->state = (c == '\0' ? START_RECORD : EAT_CRNL);\r
+        }\r
+        else if (c == dialect->escapechar) {\r
+            /* possible escaped character */\r
+            self->state = ESCAPED_CHAR;\r
+        }\r
+        else if (c == dialect->delimiter) {\r
+            /* save field - wait for new field */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+            self->state = START_FIELD;\r
+        }\r
+        else {\r
+            /* normal character - save in field */\r
+            if (parse_add_char(self, c) < 0)\r
+                return -1;\r
+        }\r
+        break;\r
+\r
+    case IN_QUOTED_FIELD:\r
+        /* in quoted field */\r
+        if (c == '\0')\r
+            ;\r
+        else if (c == dialect->escapechar) {\r
+            /* Possible escape character */\r
+            self->state = ESCAPE_IN_QUOTED_FIELD;\r
+        }\r
+        else if (c == dialect->quotechar &&\r
+                 dialect->quoting != QUOTE_NONE) {\r
+            if (dialect->doublequote) {\r
+                /* doublequote; " represented by "" */\r
+                self->state = QUOTE_IN_QUOTED_FIELD;\r
+            }\r
+            else {\r
+                /* end of quote part of field */\r
+                self->state = IN_FIELD;\r
+            }\r
+        }\r
+        else {\r
+            /* normal character - save in field */\r
+            if (parse_add_char(self, c) < 0)\r
+                return -1;\r
+        }\r
+        break;\r
+\r
+    case ESCAPE_IN_QUOTED_FIELD:\r
+        if (c == '\0')\r
+            c = '\n';\r
+        if (parse_add_char(self, c) < 0)\r
+            return -1;\r
+        self->state = IN_QUOTED_FIELD;\r
+        break;\r
+\r
+    case QUOTE_IN_QUOTED_FIELD:\r
+        /* doublequote - seen a quote in an quoted field */\r
+        if (dialect->quoting != QUOTE_NONE &&\r
+            c == dialect->quotechar) {\r
+            /* save "" as " */\r
+            if (parse_add_char(self, c) < 0)\r
+                return -1;\r
+            self->state = IN_QUOTED_FIELD;\r
+        }\r
+        else if (c == dialect->delimiter) {\r
+            /* save field - wait for new field */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+            self->state = START_FIELD;\r
+        }\r
+        else if (c == '\n' || c == '\r' || c == '\0') {\r
+            /* end of line - return [fields] */\r
+            if (parse_save_field(self) < 0)\r
+                return -1;\r
+            self->state = (c == '\0' ? START_RECORD : EAT_CRNL);\r
+        }\r
+        else if (!dialect->strict) {\r
+            if (parse_add_char(self, c) < 0)\r
+                return -1;\r
+            self->state = IN_FIELD;\r
+        }\r
+        else {\r
+            /* illegal */\r
+            PyErr_Format(error_obj, "'%c' expected after '%c'",\r
+                            dialect->delimiter,\r
+                            dialect->quotechar);\r
+            return -1;\r
+        }\r
+        break;\r
+\r
+    case EAT_CRNL:\r
+        if (c == '\n' || c == '\r')\r
+            ;\r
+        else if (c == '\0')\r
+            self->state = START_RECORD;\r
+        else {\r
+            PyErr_Format(error_obj, "new-line character seen in unquoted field - do you need to open the file in universal-newline mode?");\r
+            return -1;\r
+        }\r
+        break;\r
+\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+parse_reset(ReaderObj *self)\r
+{\r
+    Py_XDECREF(self->fields);\r
+    self->fields = PyList_New(0);\r
+    if (self->fields == NULL)\r
+        return -1;\r
+    self->field_len = 0;\r
+    self->state = START_RECORD;\r
+    self->numeric_field = 0;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Reader_iternext(ReaderObj *self)\r
+{\r
+    PyObject *lineobj;\r
+    PyObject *fields = NULL;\r
+    char *line, c;\r
+    int linelen;\r
+\r
+    if (parse_reset(self) < 0)\r
+        return NULL;\r
+    do {\r
+        lineobj = PyIter_Next(self->input_iter);\r
+        if (lineobj == NULL) {\r
+            /* End of input OR exception */\r
+            if (!PyErr_Occurred() && (self->field_len != 0 ||\r
+                                      self->state == IN_QUOTED_FIELD)) {\r
+                if (self->dialect->strict)\r
+                    PyErr_SetString(error_obj, "unexpected end of data");\r
+                else if (parse_save_field(self) >= 0 )\r
+                    break;\r
+            }\r
+            return NULL;\r
+        }\r
+        ++self->line_num;\r
+\r
+        line = PyString_AsString(lineobj);\r
+        linelen = PyString_Size(lineobj);\r
+\r
+        if (line == NULL || linelen < 0) {\r
+            Py_DECREF(lineobj);\r
+            return NULL;\r
+        }\r
+        while (linelen--) {\r
+            c = *line++;\r
+            if (c == '\0') {\r
+                Py_DECREF(lineobj);\r
+                PyErr_Format(error_obj,\r
+                             "line contains NULL byte");\r
+                goto err;\r
+            }\r
+            if (parse_process_char(self, c) < 0) {\r
+                Py_DECREF(lineobj);\r
+                goto err;\r
+            }\r
+        }\r
+        Py_DECREF(lineobj);\r
+        if (parse_process_char(self, 0) < 0)\r
+            goto err;\r
+    } while (self->state != START_RECORD);\r
+\r
+    fields = self->fields;\r
+    self->fields = NULL;\r
+err:\r
+    return fields;\r
+}\r
+\r
+static void\r
+Reader_dealloc(ReaderObj *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    Py_XDECREF(self->dialect);\r
+    Py_XDECREF(self->input_iter);\r
+    Py_XDECREF(self->fields);\r
+    if (self->field != NULL)\r
+        PyMem_Free(self->field);\r
+    PyObject_GC_Del(self);\r
+}\r
+\r
+static int\r
+Reader_traverse(ReaderObj *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dialect);\r
+    Py_VISIT(self->input_iter);\r
+    Py_VISIT(self->fields);\r
+    return 0;\r
+}\r
+\r
+static int\r
+Reader_clear(ReaderObj *self)\r
+{\r
+    Py_CLEAR(self->dialect);\r
+    Py_CLEAR(self->input_iter);\r
+    Py_CLEAR(self->fields);\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(Reader_Type_doc,\r
+"CSV reader\n"\r
+"\n"\r
+"Reader objects are responsible for reading and parsing tabular data\n"\r
+"in CSV format.\n"\r
+);\r
+\r
+static struct PyMethodDef Reader_methods[] = {\r
+    { NULL, NULL }\r
+};\r
+#define R_OFF(x) offsetof(ReaderObj, x)\r
+\r
+static struct PyMemberDef Reader_memberlist[] = {\r
+    { "dialect", T_OBJECT, R_OFF(dialect), RO },\r
+    { "line_num", T_ULONG, R_OFF(line_num), RO },\r
+    { NULL }\r
+};\r
+\r
+\r
+static PyTypeObject Reader_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_csv.reader",                          /*tp_name*/\r
+    sizeof(ReaderObj),                      /*tp_basicsize*/\r
+    0,                                      /*tp_itemsize*/\r
+    /* methods */\r
+    (destructor)Reader_dealloc,             /*tp_dealloc*/\r
+    (printfunc)0,                           /*tp_print*/\r
+    (getattrfunc)0,                         /*tp_getattr*/\r
+    (setattrfunc)0,                         /*tp_setattr*/\r
+    (cmpfunc)0,                             /*tp_compare*/\r
+    (reprfunc)0,                            /*tp_repr*/\r
+    0,                                      /*tp_as_number*/\r
+    0,                                      /*tp_as_sequence*/\r
+    0,                                      /*tp_as_mapping*/\r
+    (hashfunc)0,                            /*tp_hash*/\r
+    (ternaryfunc)0,                         /*tp_call*/\r
+    (reprfunc)0,                                /*tp_str*/\r
+    0,                                      /*tp_getattro*/\r
+    0,                                      /*tp_setattro*/\r
+    0,                                      /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\r
+        Py_TPFLAGS_HAVE_GC,                     /*tp_flags*/\r
+    Reader_Type_doc,                        /*tp_doc*/\r
+    (traverseproc)Reader_traverse,          /*tp_traverse*/\r
+    (inquiry)Reader_clear,                  /*tp_clear*/\r
+    0,                                      /*tp_richcompare*/\r
+    0,                                      /*tp_weaklistoffset*/\r
+    PyObject_SelfIter,                          /*tp_iter*/\r
+    (getiterfunc)Reader_iternext,           /*tp_iternext*/\r
+    Reader_methods,                         /*tp_methods*/\r
+    Reader_memberlist,                      /*tp_members*/\r
+    0,                                      /*tp_getset*/\r
+\r
+};\r
+\r
+static PyObject *\r
+csv_reader(PyObject *module, PyObject *args, PyObject *keyword_args)\r
+{\r
+    PyObject * iterator, * dialect = NULL;\r
+    ReaderObj * self = PyObject_GC_New(ReaderObj, &Reader_Type);\r
+\r
+    if (!self)\r
+        return NULL;\r
+\r
+    self->dialect = NULL;\r
+    self->fields = NULL;\r
+    self->input_iter = NULL;\r
+    self->field = NULL;\r
+    self->field_size = 0;\r
+    self->line_num = 0;\r
+\r
+    if (parse_reset(self) < 0) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+\r
+    if (!PyArg_UnpackTuple(args, "", 1, 2, &iterator, &dialect)) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    self->input_iter = PyObject_GetIter(iterator);\r
+    if (self->input_iter == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "argument 1 must be an iterator");\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args);\r
+    if (self->dialect == NULL) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+\r
+    PyObject_GC_Track(self);\r
+    return (PyObject *)self;\r
+}\r
+\r
+/*\r
+ * WRITER\r
+ */\r
+/* ---------------------------------------------------------------- */\r
+static void\r
+join_reset(WriterObj *self)\r
+{\r
+    self->rec_len = 0;\r
+    self->num_fields = 0;\r
+}\r
+\r
+#define MEM_INCR 32768\r
+\r
+/* Calculate new record length or append field to record.  Return new\r
+ * record length.\r
+ */\r
+static int\r
+join_append_data(WriterObj *self, char *field, int quote_empty,\r
+                 int *quoted, int copy_phase)\r
+{\r
+    DialectObj *dialect = self->dialect;\r
+    int i, rec_len;\r
+    char *lineterm;\r
+\r
+#define ADDCH(c) \\r
+    do {\\r
+        if (copy_phase) \\r
+            self->rec[rec_len] = c;\\r
+        rec_len++;\\r
+    } while(0)\r
+\r
+    lineterm = PyString_AsString(dialect->lineterminator);\r
+    if (lineterm == NULL)\r
+        return -1;\r
+\r
+    rec_len = self->rec_len;\r
+\r
+    /* If this is not the first field we need a field separator */\r
+    if (self->num_fields > 0)\r
+        ADDCH(dialect->delimiter);\r
+\r
+    /* Handle preceding quote */\r
+    if (copy_phase && *quoted)\r
+        ADDCH(dialect->quotechar);\r
+\r
+    /* Copy/count field data */\r
+    for (i = 0;; i++) {\r
+        char c = field[i];\r
+        int want_escape = 0;\r
+\r
+        if (c == '\0')\r
+            break;\r
+\r
+        if (c == dialect->delimiter ||\r
+            c == dialect->escapechar ||\r
+            c == dialect->quotechar ||\r
+            strchr(lineterm, c)) {\r
+            if (dialect->quoting == QUOTE_NONE)\r
+                want_escape = 1;\r
+            else {\r
+                if (c == dialect->quotechar) {\r
+                    if (dialect->doublequote)\r
+                        ADDCH(dialect->quotechar);\r
+                    else\r
+                        want_escape = 1;\r
+                }\r
+                if (!want_escape)\r
+                    *quoted = 1;\r
+            }\r
+            if (want_escape) {\r
+                if (!dialect->escapechar) {\r
+                    PyErr_Format(error_obj,\r
+                                 "need to escape, but no escapechar set");\r
+                    return -1;\r
+                }\r
+                ADDCH(dialect->escapechar);\r
+            }\r
+        }\r
+        /* Copy field character into record buffer.\r
+         */\r
+        ADDCH(c);\r
+    }\r
+\r
+    /* If field is empty check if it needs to be quoted.\r
+     */\r
+    if (i == 0 && quote_empty) {\r
+        if (dialect->quoting == QUOTE_NONE) {\r
+            PyErr_Format(error_obj,\r
+                         "single empty field record must be quoted");\r
+            return -1;\r
+        }\r
+        else\r
+            *quoted = 1;\r
+    }\r
+\r
+    if (*quoted) {\r
+        if (copy_phase)\r
+            ADDCH(dialect->quotechar);\r
+        else\r
+            rec_len += 2;\r
+    }\r
+    return rec_len;\r
+#undef ADDCH\r
+}\r
+\r
+static int\r
+join_check_rec_size(WriterObj *self, int rec_len)\r
+{\r
+\r
+    if (rec_len < 0 || rec_len > INT_MAX - MEM_INCR) {\r
+        PyErr_NoMemory();\r
+        return 0;\r
+    }\r
+\r
+    if (rec_len > self->rec_size) {\r
+        if (self->rec_size == 0) {\r
+            self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;\r
+            if (self->rec != NULL)\r
+                PyMem_Free(self->rec);\r
+            self->rec = PyMem_Malloc(self->rec_size);\r
+        }\r
+        else {\r
+            char *old_rec = self->rec;\r
+\r
+            self->rec_size = (rec_len / MEM_INCR + 1) * MEM_INCR;\r
+            self->rec = PyMem_Realloc(self->rec, self->rec_size);\r
+            if (self->rec == NULL)\r
+                PyMem_Free(old_rec);\r
+        }\r
+        if (self->rec == NULL) {\r
+            PyErr_NoMemory();\r
+            return 0;\r
+        }\r
+    }\r
+    return 1;\r
+}\r
+\r
+static int\r
+join_append(WriterObj *self, char *field, int *quoted, int quote_empty)\r
+{\r
+    int rec_len;\r
+\r
+    rec_len = join_append_data(self, field, quote_empty, quoted, 0);\r
+    if (rec_len < 0)\r
+        return 0;\r
+\r
+    /* grow record buffer if necessary */\r
+    if (!join_check_rec_size(self, rec_len))\r
+        return 0;\r
+\r
+    self->rec_len = join_append_data(self, field, quote_empty, quoted, 1);\r
+    self->num_fields++;\r
+\r
+    return 1;\r
+}\r
+\r
+static int\r
+join_append_lineterminator(WriterObj *self)\r
+{\r
+    int terminator_len;\r
+    char *terminator;\r
+\r
+    terminator_len = PyString_Size(self->dialect->lineterminator);\r
+    if (terminator_len == -1)\r
+        return 0;\r
+\r
+    /* grow record buffer if necessary */\r
+    if (!join_check_rec_size(self, self->rec_len + terminator_len))\r
+        return 0;\r
+\r
+    terminator = PyString_AsString(self->dialect->lineterminator);\r
+    if (terminator == NULL)\r
+        return 0;\r
+    memmove(self->rec + self->rec_len, terminator, terminator_len);\r
+    self->rec_len += terminator_len;\r
+\r
+    return 1;\r
+}\r
+\r
+PyDoc_STRVAR(csv_writerow_doc,\r
+"writerow(sequence)\n"\r
+"\n"\r
+"Construct and write a CSV record from a sequence of fields.  Non-string\n"\r
+"elements will be converted to string.");\r
+\r
+static PyObject *\r
+csv_writerow(WriterObj *self, PyObject *seq)\r
+{\r
+    DialectObj *dialect = self->dialect;\r
+    int len, i;\r
+\r
+    if (!PySequence_Check(seq))\r
+        return PyErr_Format(error_obj, "sequence expected");\r
+\r
+    len = PySequence_Length(seq);\r
+    if (len < 0)\r
+        return NULL;\r
+\r
+    /* Join all fields in internal buffer.\r
+     */\r
+    join_reset(self);\r
+    for (i = 0; i < len; i++) {\r
+        PyObject *field;\r
+        int append_ok;\r
+        int quoted;\r
+\r
+        field = PySequence_GetItem(seq, i);\r
+        if (field == NULL)\r
+            return NULL;\r
+\r
+        switch (dialect->quoting) {\r
+        case QUOTE_NONNUMERIC:\r
+            quoted = !PyNumber_Check(field);\r
+            break;\r
+        case QUOTE_ALL:\r
+            quoted = 1;\r
+            break;\r
+        default:\r
+            quoted = 0;\r
+            break;\r
+        }\r
+\r
+        if (PyString_Check(field)) {\r
+            append_ok = join_append(self,\r
+                                    PyString_AS_STRING(field),\r
+                                    &quoted, len == 1);\r
+            Py_DECREF(field);\r
+        }\r
+        else if (field == Py_None) {\r
+            append_ok = join_append(self, "", &quoted, len == 1);\r
+            Py_DECREF(field);\r
+        }\r
+        else {\r
+            PyObject *str;\r
+\r
+            if (PyFloat_Check(field)) {\r
+                str = PyObject_Repr(field);\r
+            } else {\r
+                str = PyObject_Str(field);\r
+            }\r
+            Py_DECREF(field);\r
+            if (str == NULL)\r
+                return NULL;\r
+\r
+            append_ok = join_append(self, PyString_AS_STRING(str),\r
+                                    &quoted, len == 1);\r
+            Py_DECREF(str);\r
+        }\r
+        if (!append_ok)\r
+            return NULL;\r
+    }\r
+\r
+    /* Add line terminator.\r
+     */\r
+    if (!join_append_lineterminator(self))\r
+        return 0;\r
+\r
+    return PyObject_CallFunction(self->writeline,\r
+                                 "(s#)", self->rec, self->rec_len);\r
+}\r
+\r
+PyDoc_STRVAR(csv_writerows_doc,\r
+"writerows(sequence of sequences)\n"\r
+"\n"\r
+"Construct and write a series of sequences to a csv file.  Non-string\n"\r
+"elements will be converted to string.");\r
+\r
+static PyObject *\r
+csv_writerows(WriterObj *self, PyObject *seqseq)\r
+{\r
+    PyObject *row_iter, *row_obj, *result;\r
+\r
+    row_iter = PyObject_GetIter(seqseq);\r
+    if (row_iter == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "writerows() argument must be iterable");\r
+        return NULL;\r
+    }\r
+    while ((row_obj = PyIter_Next(row_iter))) {\r
+        result = csv_writerow(self, row_obj);\r
+        Py_DECREF(row_obj);\r
+        if (!result) {\r
+            Py_DECREF(row_iter);\r
+            return NULL;\r
+        }\r
+        else\r
+             Py_DECREF(result);\r
+    }\r
+    Py_DECREF(row_iter);\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static struct PyMethodDef Writer_methods[] = {\r
+    { "writerow", (PyCFunction)csv_writerow, METH_O, csv_writerow_doc},\r
+    { "writerows", (PyCFunction)csv_writerows, METH_O, csv_writerows_doc},\r
+    { NULL, NULL }\r
+};\r
+\r
+#define W_OFF(x) offsetof(WriterObj, x)\r
+\r
+static struct PyMemberDef Writer_memberlist[] = {\r
+    { "dialect", T_OBJECT, W_OFF(dialect), RO },\r
+    { NULL }\r
+};\r
+\r
+static void\r
+Writer_dealloc(WriterObj *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    Py_XDECREF(self->dialect);\r
+    Py_XDECREF(self->writeline);\r
+    if (self->rec != NULL)\r
+        PyMem_Free(self->rec);\r
+    PyObject_GC_Del(self);\r
+}\r
+\r
+static int\r
+Writer_traverse(WriterObj *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dialect);\r
+    Py_VISIT(self->writeline);\r
+    return 0;\r
+}\r
+\r
+static int\r
+Writer_clear(WriterObj *self)\r
+{\r
+    Py_CLEAR(self->dialect);\r
+    Py_CLEAR(self->writeline);\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(Writer_Type_doc,\r
+"CSV writer\n"\r
+"\n"\r
+"Writer objects are responsible for generating tabular data\n"\r
+"in CSV format from sequence input.\n"\r
+);\r
+\r
+static PyTypeObject Writer_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_csv.writer",                          /*tp_name*/\r
+    sizeof(WriterObj),                      /*tp_basicsize*/\r
+    0,                                      /*tp_itemsize*/\r
+    /* methods */\r
+    (destructor)Writer_dealloc,             /*tp_dealloc*/\r
+    (printfunc)0,                           /*tp_print*/\r
+    (getattrfunc)0,                         /*tp_getattr*/\r
+    (setattrfunc)0,                         /*tp_setattr*/\r
+    (cmpfunc)0,                             /*tp_compare*/\r
+    (reprfunc)0,                            /*tp_repr*/\r
+    0,                                      /*tp_as_number*/\r
+    0,                                      /*tp_as_sequence*/\r
+    0,                                      /*tp_as_mapping*/\r
+    (hashfunc)0,                            /*tp_hash*/\r
+    (ternaryfunc)0,                         /*tp_call*/\r
+    (reprfunc)0,                            /*tp_str*/\r
+    0,                                      /*tp_getattro*/\r
+    0,                                      /*tp_setattro*/\r
+    0,                                      /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\r
+        Py_TPFLAGS_HAVE_GC,                     /*tp_flags*/\r
+    Writer_Type_doc,\r
+    (traverseproc)Writer_traverse,          /*tp_traverse*/\r
+    (inquiry)Writer_clear,                  /*tp_clear*/\r
+    0,                                      /*tp_richcompare*/\r
+    0,                                      /*tp_weaklistoffset*/\r
+    (getiterfunc)0,                         /*tp_iter*/\r
+    (getiterfunc)0,                         /*tp_iternext*/\r
+    Writer_methods,                         /*tp_methods*/\r
+    Writer_memberlist,                      /*tp_members*/\r
+    0,                                      /*tp_getset*/\r
+};\r
+\r
+static PyObject *\r
+csv_writer(PyObject *module, PyObject *args, PyObject *keyword_args)\r
+{\r
+    PyObject * output_file, * dialect = NULL;\r
+    WriterObj * self = PyObject_GC_New(WriterObj, &Writer_Type);\r
+\r
+    if (!self)\r
+        return NULL;\r
+\r
+    self->dialect = NULL;\r
+    self->writeline = NULL;\r
+\r
+    self->rec = NULL;\r
+    self->rec_size = 0;\r
+    self->rec_len = 0;\r
+    self->num_fields = 0;\r
+\r
+    if (!PyArg_UnpackTuple(args, "", 1, 2, &output_file, &dialect)) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    self->writeline = PyObject_GetAttrString(output_file, "write");\r
+    if (self->writeline == NULL || !PyCallable_Check(self->writeline)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "argument 1 must have a \"write\" method");\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    self->dialect = (DialectObj *)_call_dialect(dialect, keyword_args);\r
+    if (self->dialect == NULL) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    PyObject_GC_Track(self);\r
+    return (PyObject *)self;\r
+}\r
+\r
+/*\r
+ * DIALECT REGISTRY\r
+ */\r
+static PyObject *\r
+csv_list_dialects(PyObject *module, PyObject *args)\r
+{\r
+    return PyDict_Keys(dialects);\r
+}\r
+\r
+static PyObject *\r
+csv_register_dialect(PyObject *module, PyObject *args, PyObject *kwargs)\r
+{\r
+    PyObject *name_obj, *dialect_obj = NULL;\r
+    PyObject *dialect;\r
+\r
+    if (!PyArg_UnpackTuple(args, "", 1, 2, &name_obj, &dialect_obj))\r
+        return NULL;\r
+    if (!IS_BASESTRING(name_obj)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "dialect name must be a string or unicode");\r
+        return NULL;\r
+    }\r
+    dialect = _call_dialect(dialect_obj, kwargs);\r
+    if (dialect == NULL)\r
+        return NULL;\r
+    if (PyDict_SetItem(dialects, name_obj, dialect) < 0) {\r
+        Py_DECREF(dialect);\r
+        return NULL;\r
+    }\r
+    Py_DECREF(dialect);\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+csv_unregister_dialect(PyObject *module, PyObject *name_obj)\r
+{\r
+    if (PyDict_DelItem(dialects, name_obj) < 0)\r
+        return PyErr_Format(error_obj, "unknown dialect");\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+csv_get_dialect(PyObject *module, PyObject *name_obj)\r
+{\r
+    return get_dialect_from_registry(name_obj);\r
+}\r
+\r
+static PyObject *\r
+csv_field_size_limit(PyObject *module, PyObject *args)\r
+{\r
+    PyObject *new_limit = NULL;\r
+    long old_limit = field_limit;\r
+\r
+    if (!PyArg_UnpackTuple(args, "field_size_limit", 0, 1, &new_limit))\r
+        return NULL;\r
+    if (new_limit != NULL) {\r
+        if (!PyInt_Check(new_limit)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "limit must be an integer");\r
+            return NULL;\r
+        }\r
+        field_limit = PyInt_AsLong(new_limit);\r
+    }\r
+    return PyInt_FromLong(old_limit);\r
+}\r
+\r
+/*\r
+ * MODULE\r
+ */\r
+\r
+PyDoc_STRVAR(csv_module_doc,\r
+"CSV parsing and writing.\n"\r
+"\n"\r
+"This module provides classes that assist in the reading and writing\n"\r
+"of Comma Separated Value (CSV) files, and implements the interface\n"\r
+"described by PEP 305.  Although many CSV files are simple to parse,\n"\r
+"the format is not formally defined by a stable specification and\n"\r
+"is subtle enough that parsing lines of a CSV file with something\n"\r
+"like line.split(\",\") is bound to fail.  The module supports three\n"\r
+"basic APIs: reading, writing, and registration of dialects.\n"\r
+"\n"\r
+"\n"\r
+"DIALECT REGISTRATION:\n"\r
+"\n"\r
+"Readers and writers support a dialect argument, which is a convenient\n"\r
+"handle on a group of settings.  When the dialect argument is a string,\n"\r
+"it identifies one of the dialects previously registered with the module.\n"\r
+"If it is a class or instance, the attributes of the argument are used as\n"\r
+"the settings for the reader or writer:\n"\r
+"\n"\r
+"    class excel:\n"\r
+"        delimiter = ','\n"\r
+"        quotechar = '\"'\n"\r
+"        escapechar = None\n"\r
+"        doublequote = True\n"\r
+"        skipinitialspace = False\n"\r
+"        lineterminator = '\\r\\n'\n"\r
+"        quoting = QUOTE_MINIMAL\n"\r
+"\n"\r
+"SETTINGS:\n"\r
+"\n"\r
+"    * quotechar - specifies a one-character string to use as the \n"\r
+"        quoting character.  It defaults to '\"'.\n"\r
+"    * delimiter - specifies a one-character string to use as the \n"\r
+"        field separator.  It defaults to ','.\n"\r
+"    * skipinitialspace - specifies how to interpret whitespace which\n"\r
+"        immediately follows a delimiter.  It defaults to False, which\n"\r
+"        means that whitespace immediately following a delimiter is part\n"\r
+"        of the following field.\n"\r
+"    * lineterminator -  specifies the character sequence which should \n"\r
+"        terminate rows.\n"\r
+"    * quoting - controls when quotes should be generated by the writer.\n"\r
+"        It can take on any of the following module constants:\n"\r
+"\n"\r
+"        csv.QUOTE_MINIMAL means only when required, for example, when a\n"\r
+"            field contains either the quotechar or the delimiter\n"\r
+"        csv.QUOTE_ALL means that quotes are always placed around fields.\n"\r
+"        csv.QUOTE_NONNUMERIC means that quotes are always placed around\n"\r
+"            fields which do not parse as integers or floating point\n"\r
+"            numbers.\n"\r
+"        csv.QUOTE_NONE means that quotes are never placed around fields.\n"\r
+"    * escapechar - specifies a one-character string used to escape \n"\r
+"        the delimiter when quoting is set to QUOTE_NONE.\n"\r
+"    * doublequote - controls the handling of quotes inside fields.  When\n"\r
+"        True, two consecutive quotes are interpreted as one during read,\n"\r
+"        and when writing, each quote character embedded in the data is\n"\r
+"        written as two quotes\n");\r
+\r
+PyDoc_STRVAR(csv_reader_doc,\r
+"    csv_reader = reader(iterable [, dialect='excel']\n"\r
+"                        [optional keyword args])\n"\r
+"    for row in csv_reader:\n"\r
+"        process(row)\n"\r
+"\n"\r
+"The \"iterable\" argument can be any object that returns a line\n"\r
+"of input for each iteration, such as a file object or a list.  The\n"\r
+"optional \"dialect\" parameter is discussed below.  The function\n"\r
+"also accepts optional keyword arguments which override settings\n"\r
+"provided by the dialect.\n"\r
+"\n"\r
+"The returned object is an iterator.  Each iteration returns a row\n"\r
+"of the CSV file (which can span multiple input lines):\n");\r
+\r
+PyDoc_STRVAR(csv_writer_doc,\r
+"    csv_writer = csv.writer(fileobj [, dialect='excel']\n"\r
+"                            [optional keyword args])\n"\r
+"    for row in sequence:\n"\r
+"        csv_writer.writerow(row)\n"\r
+"\n"\r
+"    [or]\n"\r
+"\n"\r
+"    csv_writer = csv.writer(fileobj [, dialect='excel']\n"\r
+"                            [optional keyword args])\n"\r
+"    csv_writer.writerows(rows)\n"\r
+"\n"\r
+"The \"fileobj\" argument can be any object that supports the file API.\n");\r
+\r
+PyDoc_STRVAR(csv_list_dialects_doc,\r
+"Return a list of all know dialect names.\n"\r
+"    names = csv.list_dialects()");\r
+\r
+PyDoc_STRVAR(csv_get_dialect_doc,\r
+"Return the dialect instance associated with name.\n"\r
+"    dialect = csv.get_dialect(name)");\r
+\r
+PyDoc_STRVAR(csv_register_dialect_doc,\r
+"Create a mapping from a string name to a dialect class.\n"\r
+"    dialect = csv.register_dialect(name, dialect)");\r
+\r
+PyDoc_STRVAR(csv_unregister_dialect_doc,\r
+"Delete the name/dialect mapping associated with a string name.\n"\r
+"    csv.unregister_dialect(name)");\r
+\r
+PyDoc_STRVAR(csv_field_size_limit_doc,\r
+"Sets an upper limit on parsed fields.\n"\r
+"    csv.field_size_limit([limit])\n"\r
+"\n"\r
+"Returns old limit. If limit is not given, no new limit is set and\n"\r
+"the old limit is returned");\r
+\r
+static struct PyMethodDef csv_methods[] = {\r
+    { "reader", (PyCFunction)csv_reader,\r
+        METH_VARARGS | METH_KEYWORDS, csv_reader_doc},\r
+    { "writer", (PyCFunction)csv_writer,\r
+        METH_VARARGS | METH_KEYWORDS, csv_writer_doc},\r
+    { "list_dialects", (PyCFunction)csv_list_dialects,\r
+        METH_NOARGS, csv_list_dialects_doc},\r
+    { "register_dialect", (PyCFunction)csv_register_dialect,\r
+        METH_VARARGS | METH_KEYWORDS, csv_register_dialect_doc},\r
+    { "unregister_dialect", (PyCFunction)csv_unregister_dialect,\r
+        METH_O, csv_unregister_dialect_doc},\r
+    { "get_dialect", (PyCFunction)csv_get_dialect,\r
+        METH_O, csv_get_dialect_doc},\r
+    { "field_size_limit", (PyCFunction)csv_field_size_limit,\r
+        METH_VARARGS, csv_field_size_limit_doc},\r
+    { NULL, NULL }\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_csv(void)\r
+{\r
+    PyObject *module;\r
+    StyleDesc *style;\r
+\r
+    if (PyType_Ready(&Dialect_Type) < 0)\r
+        return;\r
+\r
+    if (PyType_Ready(&Reader_Type) < 0)\r
+        return;\r
+\r
+    if (PyType_Ready(&Writer_Type) < 0)\r
+        return;\r
+\r
+    /* Create the module and add the functions */\r
+    module = Py_InitModule3("_csv", csv_methods, csv_module_doc);\r
+    if (module == NULL)\r
+        return;\r
+\r
+    /* Add version to the module. */\r
+    if (PyModule_AddStringConstant(module, "__version__",\r
+                                   MODULE_VERSION) == -1)\r
+        return;\r
+\r
+    /* Add _dialects dictionary */\r
+    dialects = PyDict_New();\r
+    if (dialects == NULL)\r
+        return;\r
+    if (PyModule_AddObject(module, "_dialects", dialects))\r
+        return;\r
+\r
+    /* Add quote styles into dictionary */\r
+    for (style = quote_styles; style->name; style++) {\r
+        if (PyModule_AddIntConstant(module, style->name,\r
+                                    style->style) == -1)\r
+            return;\r
+    }\r
+\r
+    /* Add the Dialect type */\r
+    Py_INCREF(&Dialect_Type);\r
+    if (PyModule_AddObject(module, "Dialect", (PyObject *)&Dialect_Type))\r
+        return;\r
+\r
+    /* Add the CSV exception object to the module. */\r
+    error_obj = PyErr_NewException("_csv.Error", NULL, NULL);\r
+    if (error_obj == NULL)\r
+        return;\r
+    PyModule_AddObject(module, "Error", error_obj);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_functoolsmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_functoolsmodule.c
new file mode 100644 (file)
index 0000000..093e404
--- /dev/null
@@ -0,0 +1,398 @@
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+/* _functools module written and maintained\r
+   by Hye-Shik Chang <perky@FreeBSD.org>\r
+   with adaptations by Raymond Hettinger <python@rcn.com>\r
+   Copyright (c) 2004, 2005, 2006 Python Software Foundation.\r
+   All rights reserved.\r
+*/\r
+\r
+/* reduce() *************************************************************/\r
+\r
+static PyObject *\r
+functools_reduce(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *seq, *func, *result = NULL, *it;\r
+\r
+    if (!PyArg_UnpackTuple(args, "reduce", 2, 3, &func, &seq, &result))\r
+        return NULL;\r
+    if (result != NULL)\r
+        Py_INCREF(result);\r
+\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+            "reduce() arg 2 must support iteration");\r
+        Py_XDECREF(result);\r
+        return NULL;\r
+    }\r
+\r
+    if ((args = PyTuple_New(2)) == NULL)\r
+        goto Fail;\r
+\r
+    for (;;) {\r
+        PyObject *op2;\r
+\r
+        if (args->ob_refcnt > 1) {\r
+            Py_DECREF(args);\r
+            if ((args = PyTuple_New(2)) == NULL)\r
+                goto Fail;\r
+        }\r
+\r
+        op2 = PyIter_Next(it);\r
+        if (op2 == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto Fail;\r
+            break;\r
+        }\r
+\r
+        if (result == NULL)\r
+            result = op2;\r
+        else {\r
+            PyTuple_SetItem(args, 0, result);\r
+            PyTuple_SetItem(args, 1, op2);\r
+            if ((result = PyEval_CallObject(func, args)) == NULL)\r
+                goto Fail;\r
+        }\r
+    }\r
+\r
+    Py_DECREF(args);\r
+\r
+    if (result == NULL)\r
+        PyErr_SetString(PyExc_TypeError,\r
+                   "reduce() of empty sequence with no initial value");\r
+\r
+    Py_DECREF(it);\r
+    return result;\r
+\r
+Fail:\r
+    Py_XDECREF(args);\r
+    Py_XDECREF(result);\r
+    Py_DECREF(it);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(reduce_doc,\r
+"reduce(function, sequence[, initial]) -> value\n\\r
+\n\\r
+Apply a function of two arguments cumulatively to the items of a sequence,\n\\r
+from left to right, so as to reduce the sequence to a single value.\n\\r
+For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\\r
+((((1+2)+3)+4)+5).  If initial is present, it is placed before the items\n\\r
+of the sequence in the calculation, and serves as a default when the\n\\r
+sequence is empty.");\r
+\r
+\r
+\r
+\r
+/* partial object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *fn;\r
+    PyObject *args;\r
+    PyObject *kw;\r
+    PyObject *dict;\r
+    PyObject *weakreflist; /* List of weak references */\r
+} partialobject;\r
+\r
+static PyTypeObject partial_type;\r
+\r
+static PyObject *\r
+partial_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *func;\r
+    partialobject *pto;\r
+\r
+    if (PyTuple_GET_SIZE(args) < 1) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "type 'partial' takes at least one argument");\r
+        return NULL;\r
+    }\r
+\r
+    func = PyTuple_GET_ITEM(args, 0);\r
+    if (!PyCallable_Check(func)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "the first argument must be callable");\r
+        return NULL;\r
+    }\r
+\r
+    /* create partialobject structure */\r
+    pto = (partialobject *)type->tp_alloc(type, 0);\r
+    if (pto == NULL)\r
+        return NULL;\r
+\r
+    pto->fn = func;\r
+    Py_INCREF(func);\r
+    pto->args = PyTuple_GetSlice(args, 1, PY_SSIZE_T_MAX);\r
+    if (pto->args == NULL) {\r
+        pto->kw = NULL;\r
+        Py_DECREF(pto);\r
+        return NULL;\r
+    }\r
+    pto->kw = (kw != NULL) ? PyDict_Copy(kw) : PyDict_New();\r
+    if (pto->kw == NULL) {\r
+        Py_DECREF(pto);\r
+        return NULL;\r
+    }\r
+\r
+\r
+    pto->weakreflist = NULL;\r
+    pto->dict = NULL;\r
+\r
+    return (PyObject *)pto;\r
+}\r
+\r
+static void\r
+partial_dealloc(partialobject *pto)\r
+{\r
+    PyObject_GC_UnTrack(pto);\r
+    if (pto->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) pto);\r
+    Py_XDECREF(pto->fn);\r
+    Py_XDECREF(pto->args);\r
+    Py_XDECREF(pto->kw);\r
+    Py_XDECREF(pto->dict);\r
+    Py_TYPE(pto)->tp_free(pto);\r
+}\r
+\r
+static PyObject *\r
+partial_call(partialobject *pto, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *ret;\r
+    PyObject *argappl = NULL, *kwappl = NULL;\r
+\r
+    assert (PyCallable_Check(pto->fn));\r
+    assert (PyTuple_Check(pto->args));\r
+    assert (pto->kw == Py_None  ||  PyDict_Check(pto->kw));\r
+\r
+    if (PyTuple_GET_SIZE(pto->args) == 0) {\r
+        argappl = args;\r
+        Py_INCREF(args);\r
+    } else if (PyTuple_GET_SIZE(args) == 0) {\r
+        argappl = pto->args;\r
+        Py_INCREF(pto->args);\r
+    } else {\r
+        argappl = PySequence_Concat(pto->args, args);\r
+        if (argappl == NULL)\r
+            return NULL;\r
+    }\r
+\r
+    if (pto->kw == Py_None) {\r
+        kwappl = kw;\r
+        Py_XINCREF(kw);\r
+    } else {\r
+        kwappl = PyDict_Copy(pto->kw);\r
+        if (kwappl == NULL) {\r
+            Py_DECREF(argappl);\r
+            return NULL;\r
+        }\r
+        if (kw != NULL) {\r
+            if (PyDict_Merge(kwappl, kw, 1) != 0) {\r
+                Py_DECREF(argappl);\r
+                Py_DECREF(kwappl);\r
+                return NULL;\r
+            }\r
+        }\r
+    }\r
+\r
+    ret = PyObject_Call(pto->fn, argappl, kwappl);\r
+    Py_DECREF(argappl);\r
+    Py_XDECREF(kwappl);\r
+    return ret;\r
+}\r
+\r
+static int\r
+partial_traverse(partialobject *pto, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(pto->fn);\r
+    Py_VISIT(pto->args);\r
+    Py_VISIT(pto->kw);\r
+    Py_VISIT(pto->dict);\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(partial_doc,\r
+"partial(func, *args, **keywords) - new function with partial application\n\\r
+    of the given arguments and keywords.\n");\r
+\r
+#define OFF(x) offsetof(partialobject, x)\r
+static PyMemberDef partial_memberlist[] = {\r
+    {"func",            T_OBJECT,       OFF(fn),        READONLY,\r
+     "function object to use in future partial calls"},\r
+    {"args",            T_OBJECT,       OFF(args),      READONLY,\r
+     "tuple of arguments to future partial calls"},\r
+    {"keywords",        T_OBJECT,       OFF(kw),        READONLY,\r
+     "dictionary of keyword arguments to future partial calls"},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyObject *\r
+partial_get_dict(partialobject *pto)\r
+{\r
+    if (pto->dict == NULL) {\r
+        pto->dict = PyDict_New();\r
+        if (pto->dict == NULL)\r
+            return NULL;\r
+    }\r
+    Py_INCREF(pto->dict);\r
+    return pto->dict;\r
+}\r
+\r
+static int\r
+partial_set_dict(partialobject *pto, PyObject *value)\r
+{\r
+    PyObject *tmp;\r
+\r
+    /* It is illegal to del p.__dict__ */\r
+    if (value == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "a partial object's dictionary may not be deleted");\r
+        return -1;\r
+    }\r
+    /* Can only set __dict__ to a dictionary */\r
+    if (!PyDict_Check(value)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "setting partial object's dictionary to a non-dict");\r
+        return -1;\r
+    }\r
+    tmp = pto->dict;\r
+    Py_INCREF(value);\r
+    pto->dict = value;\r
+    Py_XDECREF(tmp);\r
+    return 0;\r
+}\r
+\r
+static PyGetSetDef partial_getsetlist[] = {\r
+    {"__dict__", (getter)partial_get_dict, (setter)partial_set_dict},\r
+    {NULL} /* Sentinel */\r
+};\r
+\r
+/* Pickle strategy:\r
+   __reduce__ by itself doesn't support getting kwargs in the unpickle\r
+   operation so we define a __setstate__ that replaces all the information\r
+   about the partial.  If we only replaced part of it someone would use\r
+   it as a hook to do strange things.\r
+ */\r
+\r
+PyObject *\r
+partial_reduce(partialobject *pto, PyObject *unused)\r
+{\r
+    return Py_BuildValue("O(O)(OOOO)", Py_TYPE(pto), pto->fn, pto->fn,\r
+                         pto->args, pto->kw,\r
+                         pto->dict ? pto->dict : Py_None);\r
+}\r
+\r
+PyObject *\r
+partial_setstate(partialobject *pto, PyObject *state)\r
+{\r
+    PyObject *fn, *fnargs, *kw, *dict;\r
+    if (!PyArg_ParseTuple(state, "OOOO",\r
+                          &fn, &fnargs, &kw, &dict))\r
+        return NULL;\r
+    Py_XDECREF(pto->fn);\r
+    Py_XDECREF(pto->args);\r
+    Py_XDECREF(pto->kw);\r
+    Py_XDECREF(pto->dict);\r
+    pto->fn = fn;\r
+    pto->args = fnargs;\r
+    pto->kw = kw;\r
+    if (dict != Py_None) {\r
+      pto->dict = dict;\r
+      Py_INCREF(dict);\r
+    } else {\r
+      pto->dict = NULL;\r
+    }\r
+    Py_INCREF(fn);\r
+    Py_INCREF(fnargs);\r
+    Py_INCREF(kw);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyMethodDef partial_methods[] = {\r
+    {"__reduce__", (PyCFunction)partial_reduce, METH_NOARGS},\r
+    {"__setstate__", (PyCFunction)partial_setstate, METH_O},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+static PyTypeObject partial_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "functools.partial",                /* tp_name */\r
+    sizeof(partialobject),              /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)partial_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    (ternaryfunc)partial_call,          /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    PyObject_GenericSetAttr,            /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,         /* tp_flags */\r
+    partial_doc,                        /* tp_doc */\r
+    (traverseproc)partial_traverse,     /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    offsetof(partialobject, weakreflist),       /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    partial_methods,                    /* tp_methods */\r
+    partial_memberlist,                 /* tp_members */\r
+    partial_getsetlist,                 /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    offsetof(partialobject, dict),      /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    partial_new,                        /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* module level code ********************************************************/\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Tools that operate on functions.");\r
+\r
+static PyMethodDef module_methods[] = {\r
+    {"reduce",          functools_reduce,     METH_VARARGS, reduce_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_functools(void)\r
+{\r
+    int i;\r
+    PyObject *m;\r
+    char *name;\r
+    PyTypeObject *typelist[] = {\r
+        &partial_type,\r
+        NULL\r
+    };\r
+\r
+    m = Py_InitModule3("_functools", module_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    for (i=0 ; typelist[i] != NULL ; i++) {\r
+        if (PyType_Ready(typelist[i]) < 0)\r
+            return;\r
+        name = strchr(typelist[i]->tp_name, '.');\r
+        assert (name != NULL);\r
+        Py_INCREF(typelist[i]);\r
+        PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);\r
+    }\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_heapqmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_heapqmodule.c
new file mode 100644 (file)
index 0000000..459577e
--- /dev/null
@@ -0,0 +1,696 @@
+/* Drop in replacement for heapq.py\r
+\r
+C implementation derived directly from heapq.py in Py2.3\r
+which was written by Kevin O'Connor, augmented by Tim Peters,\r
+annotated by François Pinard, and converted to C by Raymond Hettinger.\r
+\r
+*/\r
+\r
+#include "Python.h"\r
+\r
+/* Older implementations of heapq used Py_LE for comparisons.  Now, it uses\r
+   Py_LT so it will match min(), sorted(), and bisect().  Unfortunately, some\r
+   client code (Twisted for example) relied on Py_LE, so this little function\r
+   restores compatibility by trying both.\r
+*/\r
+static int\r
+cmp_lt(PyObject *x, PyObject *y)\r
+{\r
+    int cmp;\r
+    static PyObject *lt = NULL;\r
+\r
+    if (lt == NULL) {\r
+        lt = PyString_FromString("__lt__");\r
+        if (lt == NULL)\r
+            return -1;\r
+    }\r
+    if (PyObject_HasAttr(x, lt))\r
+        return PyObject_RichCompareBool(x, y, Py_LT);\r
+    cmp = PyObject_RichCompareBool(y, x, Py_LE);\r
+    if (cmp != -1)\r
+        cmp = 1 - cmp;\r
+    return cmp;\r
+}\r
+\r
+static int\r
+_siftdown(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)\r
+{\r
+    PyObject *newitem, *parent;\r
+    Py_ssize_t parentpos, size;\r
+    int cmp;\r
+\r
+    assert(PyList_Check(heap));\r
+    size = PyList_GET_SIZE(heap);\r
+    if (pos >= size) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return -1;\r
+    }\r
+\r
+    /* Follow the path to the root, moving parents down until finding\r
+       a place newitem fits. */\r
+    newitem = PyList_GET_ITEM(heap, pos);\r
+    while (pos > startpos) {\r
+        parentpos = (pos - 1) >> 1;\r
+        parent = PyList_GET_ITEM(heap, parentpos);\r
+        cmp = cmp_lt(newitem, parent);\r
+        if (cmp == -1)\r
+            return -1;\r
+        if (size != PyList_GET_SIZE(heap)) {\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "list changed size during iteration");\r
+            return -1;\r
+        }\r
+        if (cmp == 0)\r
+            break;\r
+        parent = PyList_GET_ITEM(heap, parentpos);\r
+        newitem = PyList_GET_ITEM(heap, pos);\r
+        PyList_SET_ITEM(heap, parentpos, newitem);\r
+        PyList_SET_ITEM(heap, pos, parent);\r
+        pos = parentpos;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+_siftup(PyListObject *heap, Py_ssize_t pos)\r
+{\r
+    Py_ssize_t startpos, endpos, childpos, rightpos, limit;\r
+    PyObject *tmp1, *tmp2;\r
+    int cmp;\r
+\r
+    assert(PyList_Check(heap));\r
+    endpos = PyList_GET_SIZE(heap);\r
+    startpos = pos;\r
+    if (pos >= endpos) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return -1;\r
+    }\r
+\r
+    /* Bubble up the smaller child until hitting a leaf. */\r
+    limit = endpos / 2;          /* smallest pos that has no child */\r
+    while (pos < limit) {\r
+        /* Set childpos to index of smaller child.   */\r
+        childpos = 2*pos + 1;    /* leftmost child position  */\r
+        rightpos = childpos + 1;\r
+        if (rightpos < endpos) {\r
+            cmp = cmp_lt(\r
+                PyList_GET_ITEM(heap, childpos),\r
+                PyList_GET_ITEM(heap, rightpos));\r
+            if (cmp == -1)\r
+                return -1;\r
+            if (cmp == 0)\r
+                childpos = rightpos;\r
+            if (endpos != PyList_GET_SIZE(heap)) {\r
+                PyErr_SetString(PyExc_RuntimeError,\r
+                                "list changed size during iteration");\r
+                return -1;\r
+            }\r
+        }\r
+        /* Move the smaller child up. */\r
+        tmp1 = PyList_GET_ITEM(heap, childpos);\r
+        tmp2 = PyList_GET_ITEM(heap, pos);\r
+        PyList_SET_ITEM(heap, childpos, tmp2);\r
+        PyList_SET_ITEM(heap, pos, tmp1);\r
+        pos = childpos;\r
+    }\r
+    /* Bubble it up to its final resting place (by sifting its parents down). */\r
+    return _siftdown(heap, startpos, pos);\r
+}\r
+\r
+static PyObject *\r
+heappush(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *heap, *item;\r
+\r
+    if (!PyArg_UnpackTuple(args, "heappush", 2, 2, &heap, &item))\r
+        return NULL;\r
+\r
+    if (!PyList_Check(heap)) {\r
+        PyErr_SetString(PyExc_TypeError, "heap argument must be a list");\r
+        return NULL;\r
+    }\r
+\r
+    if (PyList_Append(heap, item) == -1)\r
+        return NULL;\r
+\r
+    if (_siftdown((PyListObject *)heap, 0, PyList_GET_SIZE(heap)-1) == -1)\r
+        return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(heappush_doc,\r
+"heappush(heap, item) -> None. Push item onto heap, maintaining the heap invariant.");\r
+\r
+static PyObject *\r
+heappop(PyObject *self, PyObject *heap)\r
+{\r
+    PyObject *lastelt, *returnitem;\r
+    Py_ssize_t n;\r
+\r
+    if (!PyList_Check(heap)) {\r
+        PyErr_SetString(PyExc_TypeError, "heap argument must be a list");\r
+        return NULL;\r
+    }\r
+\r
+    /* # raises appropriate IndexError if heap is empty */\r
+    n = PyList_GET_SIZE(heap);\r
+    if (n == 0) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return NULL;\r
+    }\r
+\r
+    lastelt = PyList_GET_ITEM(heap, n-1) ;\r
+    Py_INCREF(lastelt);\r
+    PyList_SetSlice(heap, n-1, n, NULL);\r
+    n--;\r
+\r
+    if (!n)\r
+        return lastelt;\r
+    returnitem = PyList_GET_ITEM(heap, 0);\r
+    PyList_SET_ITEM(heap, 0, lastelt);\r
+    if (_siftup((PyListObject *)heap, 0) == -1) {\r
+        Py_DECREF(returnitem);\r
+        return NULL;\r
+    }\r
+    return returnitem;\r
+}\r
+\r
+PyDoc_STRVAR(heappop_doc,\r
+"Pop the smallest item off the heap, maintaining the heap invariant.");\r
+\r
+static PyObject *\r
+heapreplace(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *heap, *item, *returnitem;\r
+\r
+    if (!PyArg_UnpackTuple(args, "heapreplace", 2, 2, &heap, &item))\r
+        return NULL;\r
+\r
+    if (!PyList_Check(heap)) {\r
+        PyErr_SetString(PyExc_TypeError, "heap argument must be a list");\r
+        return NULL;\r
+    }\r
+\r
+    if (PyList_GET_SIZE(heap) < 1) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return NULL;\r
+    }\r
+\r
+    returnitem = PyList_GET_ITEM(heap, 0);\r
+    Py_INCREF(item);\r
+    PyList_SET_ITEM(heap, 0, item);\r
+    if (_siftup((PyListObject *)heap, 0) == -1) {\r
+        Py_DECREF(returnitem);\r
+        return NULL;\r
+    }\r
+    return returnitem;\r
+}\r
+\r
+PyDoc_STRVAR(heapreplace_doc,\r
+"heapreplace(heap, item) -> value. Pop and return the current smallest value, and add the new item.\n\\r
+\n\\r
+This is more efficient than heappop() followed by heappush(), and can be\n\\r
+more appropriate when using a fixed-size heap.  Note that the value\n\\r
+returned may be larger than item!  That constrains reasonable uses of\n\\r
+this routine unless written as part of a conditional replacement:\n\n\\r
+    if item > heap[0]:\n\\r
+        item = heapreplace(heap, item)\n");\r
+\r
+static PyObject *\r
+heappushpop(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *heap, *item, *returnitem;\r
+    int cmp;\r
+\r
+    if (!PyArg_UnpackTuple(args, "heappushpop", 2, 2, &heap, &item))\r
+        return NULL;\r
+\r
+    if (!PyList_Check(heap)) {\r
+        PyErr_SetString(PyExc_TypeError, "heap argument must be a list");\r
+        return NULL;\r
+    }\r
+\r
+    if (PyList_GET_SIZE(heap) < 1) {\r
+        Py_INCREF(item);\r
+        return item;\r
+    }\r
+\r
+    cmp = cmp_lt(PyList_GET_ITEM(heap, 0), item);\r
+    if (cmp == -1)\r
+        return NULL;\r
+    if (cmp == 0) {\r
+        Py_INCREF(item);\r
+        return item;\r
+    }\r
+\r
+    returnitem = PyList_GET_ITEM(heap, 0);\r
+    Py_INCREF(item);\r
+    PyList_SET_ITEM(heap, 0, item);\r
+    if (_siftup((PyListObject *)heap, 0) == -1) {\r
+        Py_DECREF(returnitem);\r
+        return NULL;\r
+    }\r
+    return returnitem;\r
+}\r
+\r
+PyDoc_STRVAR(heappushpop_doc,\r
+"heappushpop(heap, item) -> value. Push item on the heap, then pop and return the smallest item\n\\r
+from the heap. The combined action runs more efficiently than\n\\r
+heappush() followed by a separate call to heappop().");\r
+\r
+static PyObject *\r
+heapify(PyObject *self, PyObject *heap)\r
+{\r
+    Py_ssize_t i, n;\r
+\r
+    if (!PyList_Check(heap)) {\r
+        PyErr_SetString(PyExc_TypeError, "heap argument must be a list");\r
+        return NULL;\r
+    }\r
+\r
+    n = PyList_GET_SIZE(heap);\r
+    /* Transform bottom-up.  The largest index there's any point to\r
+       looking at is the largest with a child index in-range, so must\r
+       have 2*i + 1 < n, or i < (n-1)/2.  If n is even = 2*j, this is\r
+       (2*j-1)/2 = j-1/2 so j-1 is the largest, which is n//2 - 1.  If\r
+       n is odd = 2*j+1, this is (2*j+1-1)/2 = j so j-1 is the largest,\r
+       and that's again n//2-1.\r
+    */\r
+    for (i=n/2-1 ; i>=0 ; i--)\r
+        if(_siftup((PyListObject *)heap, i) == -1)\r
+            return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(heapify_doc,\r
+"Transform list into a heap, in-place, in O(len(heap)) time.");\r
+\r
+static PyObject *\r
+nlargest(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *heap=NULL, *elem, *iterable, *sol, *it, *oldelem;\r
+    Py_ssize_t i, n;\r
+    int cmp;\r
+\r
+    if (!PyArg_ParseTuple(args, "nO:nlargest", &n, &iterable))\r
+        return NULL;\r
+\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    heap = PyList_New(0);\r
+    if (heap == NULL)\r
+        goto fail;\r
+\r
+    for (i=0 ; i<n ; i++ ){\r
+        elem = PyIter_Next(it);\r
+        if (elem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto fail;\r
+            else\r
+                goto sortit;\r
+        }\r
+        if (PyList_Append(heap, elem) == -1) {\r
+            Py_DECREF(elem);\r
+            goto fail;\r
+        }\r
+        Py_DECREF(elem);\r
+    }\r
+    if (PyList_GET_SIZE(heap) == 0)\r
+        goto sortit;\r
+\r
+    for (i=n/2-1 ; i>=0 ; i--)\r
+        if(_siftup((PyListObject *)heap, i) == -1)\r
+            goto fail;\r
+\r
+    sol = PyList_GET_ITEM(heap, 0);\r
+    while (1) {\r
+        elem = PyIter_Next(it);\r
+        if (elem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto fail;\r
+            else\r
+                goto sortit;\r
+        }\r
+        cmp = cmp_lt(sol, elem);\r
+        if (cmp == -1) {\r
+            Py_DECREF(elem);\r
+            goto fail;\r
+        }\r
+        if (cmp == 0) {\r
+            Py_DECREF(elem);\r
+            continue;\r
+        }\r
+        oldelem = PyList_GET_ITEM(heap, 0);\r
+        PyList_SET_ITEM(heap, 0, elem);\r
+        Py_DECREF(oldelem);\r
+        if (_siftup((PyListObject *)heap, 0) == -1)\r
+            goto fail;\r
+        sol = PyList_GET_ITEM(heap, 0);\r
+    }\r
+sortit:\r
+    if (PyList_Sort(heap) == -1)\r
+        goto fail;\r
+    if (PyList_Reverse(heap) == -1)\r
+        goto fail;\r
+    Py_DECREF(it);\r
+    return heap;\r
+\r
+fail:\r
+    Py_DECREF(it);\r
+    Py_XDECREF(heap);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(nlargest_doc,\r
+"Find the n largest elements in a dataset.\n\\r
+\n\\r
+Equivalent to:  sorted(iterable, reverse=True)[:n]\n");\r
+\r
+static int\r
+_siftdownmax(PyListObject *heap, Py_ssize_t startpos, Py_ssize_t pos)\r
+{\r
+    PyObject *newitem, *parent;\r
+    int cmp;\r
+    Py_ssize_t parentpos;\r
+\r
+    assert(PyList_Check(heap));\r
+    if (pos >= PyList_GET_SIZE(heap)) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return -1;\r
+    }\r
+\r
+    newitem = PyList_GET_ITEM(heap, pos);\r
+    Py_INCREF(newitem);\r
+    /* Follow the path to the root, moving parents down until finding\r
+       a place newitem fits. */\r
+    while (pos > startpos){\r
+        parentpos = (pos - 1) >> 1;\r
+        parent = PyList_GET_ITEM(heap, parentpos);\r
+        cmp = cmp_lt(parent, newitem);\r
+        if (cmp == -1) {\r
+            Py_DECREF(newitem);\r
+            return -1;\r
+        }\r
+        if (cmp == 0)\r
+            break;\r
+        Py_INCREF(parent);\r
+        Py_DECREF(PyList_GET_ITEM(heap, pos));\r
+        PyList_SET_ITEM(heap, pos, parent);\r
+        pos = parentpos;\r
+    }\r
+    Py_DECREF(PyList_GET_ITEM(heap, pos));\r
+    PyList_SET_ITEM(heap, pos, newitem);\r
+    return 0;\r
+}\r
+\r
+static int\r
+_siftupmax(PyListObject *heap, Py_ssize_t pos)\r
+{\r
+    Py_ssize_t startpos, endpos, childpos, rightpos, limit;\r
+    int cmp;\r
+    PyObject *newitem, *tmp;\r
+\r
+    assert(PyList_Check(heap));\r
+    endpos = PyList_GET_SIZE(heap);\r
+    startpos = pos;\r
+    if (pos >= endpos) {\r
+        PyErr_SetString(PyExc_IndexError, "index out of range");\r
+        return -1;\r
+    }\r
+    newitem = PyList_GET_ITEM(heap, pos);\r
+    Py_INCREF(newitem);\r
+\r
+    /* Bubble up the smaller child until hitting a leaf. */\r
+    limit = endpos / 2;          /* smallest pos that has no child */\r
+    while (pos < limit) {\r
+        /* Set childpos to index of smaller child.   */\r
+        childpos = 2*pos + 1;    /* leftmost child position  */\r
+        rightpos = childpos + 1;\r
+        if (rightpos < endpos) {\r
+            cmp = cmp_lt(\r
+                PyList_GET_ITEM(heap, rightpos),\r
+                PyList_GET_ITEM(heap, childpos));\r
+            if (cmp == -1) {\r
+                Py_DECREF(newitem);\r
+                return -1;\r
+            }\r
+            if (cmp == 0)\r
+                childpos = rightpos;\r
+        }\r
+        /* Move the smaller child up. */\r
+        tmp = PyList_GET_ITEM(heap, childpos);\r
+        Py_INCREF(tmp);\r
+        Py_DECREF(PyList_GET_ITEM(heap, pos));\r
+        PyList_SET_ITEM(heap, pos, tmp);\r
+        pos = childpos;\r
+    }\r
+\r
+    /* The leaf at pos is empty now.  Put newitem there, and bubble\r
+       it up to its final resting place (by sifting its parents down). */\r
+    Py_DECREF(PyList_GET_ITEM(heap, pos));\r
+    PyList_SET_ITEM(heap, pos, newitem);\r
+    return _siftdownmax(heap, startpos, pos);\r
+}\r
+\r
+static PyObject *\r
+nsmallest(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *heap=NULL, *elem, *iterable, *los, *it, *oldelem;\r
+    Py_ssize_t i, n;\r
+    int cmp;\r
+\r
+    if (!PyArg_ParseTuple(args, "nO:nsmallest", &n, &iterable))\r
+        return NULL;\r
+\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    heap = PyList_New(0);\r
+    if (heap == NULL)\r
+        goto fail;\r
+\r
+    for (i=0 ; i<n ; i++ ){\r
+        elem = PyIter_Next(it);\r
+        if (elem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto fail;\r
+            else\r
+                goto sortit;\r
+        }\r
+        if (PyList_Append(heap, elem) == -1) {\r
+            Py_DECREF(elem);\r
+            goto fail;\r
+        }\r
+        Py_DECREF(elem);\r
+    }\r
+    n = PyList_GET_SIZE(heap);\r
+    if (n == 0)\r
+        goto sortit;\r
+\r
+    for (i=n/2-1 ; i>=0 ; i--)\r
+        if(_siftupmax((PyListObject *)heap, i) == -1)\r
+            goto fail;\r
+\r
+    los = PyList_GET_ITEM(heap, 0);\r
+    while (1) {\r
+        elem = PyIter_Next(it);\r
+        if (elem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto fail;\r
+            else\r
+                goto sortit;\r
+        }\r
+        cmp = cmp_lt(elem, los);\r
+        if (cmp == -1) {\r
+            Py_DECREF(elem);\r
+            goto fail;\r
+        }\r
+        if (cmp == 0) {\r
+            Py_DECREF(elem);\r
+            continue;\r
+        }\r
+\r
+        oldelem = PyList_GET_ITEM(heap, 0);\r
+        PyList_SET_ITEM(heap, 0, elem);\r
+        Py_DECREF(oldelem);\r
+        if (_siftupmax((PyListObject *)heap, 0) == -1)\r
+            goto fail;\r
+        los = PyList_GET_ITEM(heap, 0);\r
+    }\r
+\r
+sortit:\r
+    if (PyList_Sort(heap) == -1)\r
+        goto fail;\r
+    Py_DECREF(it);\r
+    return heap;\r
+\r
+fail:\r
+    Py_DECREF(it);\r
+    Py_XDECREF(heap);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(nsmallest_doc,\r
+"Find the n smallest elements in a dataset.\n\\r
+\n\\r
+Equivalent to:  sorted(iterable)[:n]\n");\r
+\r
+static PyMethodDef heapq_methods[] = {\r
+    {"heappush",        (PyCFunction)heappush,\r
+        METH_VARARGS,           heappush_doc},\r
+    {"heappushpop",     (PyCFunction)heappushpop,\r
+        METH_VARARGS,           heappushpop_doc},\r
+    {"heappop",         (PyCFunction)heappop,\r
+        METH_O,                 heappop_doc},\r
+    {"heapreplace",     (PyCFunction)heapreplace,\r
+        METH_VARARGS,           heapreplace_doc},\r
+    {"heapify",         (PyCFunction)heapify,\r
+        METH_O,                 heapify_doc},\r
+    {"nlargest",        (PyCFunction)nlargest,\r
+        METH_VARARGS,           nlargest_doc},\r
+    {"nsmallest",       (PyCFunction)nsmallest,\r
+        METH_VARARGS,           nsmallest_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Heap queue algorithm (a.k.a. priority queue).\n\\r
+\n\\r
+Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\n\\r
+all k, counting elements from 0.  For the sake of comparison,\n\\r
+non-existing elements are considered to be infinite.  The interesting\n\\r
+property of a heap is that a[0] is always its smallest element.\n\\r
+\n\\r
+Usage:\n\\r
+\n\\r
+heap = []            # creates an empty heap\n\\r
+heappush(heap, item) # pushes a new item on the heap\n\\r
+item = heappop(heap) # pops the smallest item from the heap\n\\r
+item = heap[0]       # smallest item on the heap without popping it\n\\r
+heapify(x)           # transforms list into a heap, in-place, in linear time\n\\r
+item = heapreplace(heap, item) # pops and returns smallest item, and adds\n\\r
+                               # new item; the heap size is unchanged\n\\r
+\n\\r
+Our API differs from textbook heap algorithms as follows:\n\\r
+\n\\r
+- We use 0-based indexing.  This makes the relationship between the\n\\r
+  index for a node and the indexes for its children slightly less\n\\r
+  obvious, but is more suitable since Python uses 0-based indexing.\n\\r
+\n\\r
+- Our heappop() method returns the smallest item, not the largest.\n\\r
+\n\\r
+These two make it possible to view the heap as a regular Python list\n\\r
+without surprises: heap[0] is the smallest item, and heap.sort()\n\\r
+maintains the heap invariant!\n");\r
+\r
+\r
+PyDoc_STRVAR(__about__,\r
+"Heap queues\n\\r
+\n\\r
+[explanation by François Pinard]\n\\r
+\n\\r
+Heaps are arrays for which a[k] <= a[2*k+1] and a[k] <= a[2*k+2] for\n\\r
+all k, counting elements from 0.  For the sake of comparison,\n\\r
+non-existing elements are considered to be infinite.  The interesting\n\\r
+property of a heap is that a[0] is always its smallest element.\n"\r
+"\n\\r
+The strange invariant above is meant to be an efficient memory\n\\r
+representation for a tournament.  The numbers below are `k', not a[k]:\n\\r
+\n\\r
+                                   0\n\\r
+\n\\r
+                  1                                 2\n\\r
+\n\\r
+          3               4                5               6\n\\r
+\n\\r
+      7       8       9       10      11      12      13      14\n\\r
+\n\\r
+    15 16   17 18   19 20   21 22   23 24   25 26   27 28   29 30\n\\r
+\n\\r
+\n\\r
+In the tree above, each cell `k' is topping `2*k+1' and `2*k+2'.  In\n\\r
+an usual binary tournament we see in sports, each cell is the winner\n\\r
+over the two cells it tops, and we can trace the winner down the tree\n\\r
+to see all opponents s/he had.  However, in many computer applications\n\\r
+of such tournaments, we do not need to trace the history of a winner.\n\\r
+To be more memory efficient, when a winner is promoted, we try to\n\\r
+replace it by something else at a lower level, and the rule becomes\n\\r
+that a cell and the two cells it tops contain three different items,\n\\r
+but the top cell \"wins\" over the two topped cells.\n"\r
+"\n\\r
+If this heap invariant is protected at all time, index 0 is clearly\n\\r
+the overall winner.  The simplest algorithmic way to remove it and\n\\r
+find the \"next\" winner is to move some loser (let's say cell 30 in the\n\\r
+diagram above) into the 0 position, and then percolate this new 0 down\n\\r
+the tree, exchanging values, until the invariant is re-established.\n\\r
+This is clearly logarithmic on the total number of items in the tree.\n\\r
+By iterating over all items, you get an O(n ln n) sort.\n"\r
+"\n\\r
+A nice feature of this sort is that you can efficiently insert new\n\\r
+items while the sort is going on, provided that the inserted items are\n\\r
+not \"better\" than the last 0'th element you extracted.  This is\n\\r
+especially useful in simulation contexts, where the tree holds all\n\\r
+incoming events, and the \"win\" condition means the smallest scheduled\n\\r
+time.  When an event schedule other events for execution, they are\n\\r
+scheduled into the future, so they can easily go into the heap.  So, a\n\\r
+heap is a good structure for implementing schedulers (this is what I\n\\r
+used for my MIDI sequencer :-).\n"\r
+"\n\\r
+Various structures for implementing schedulers have been extensively\n\\r
+studied, and heaps are good for this, as they are reasonably speedy,\n\\r
+the speed is almost constant, and the worst case is not much different\n\\r
+than the average case.  However, there are other representations which\n\\r
+are more efficient overall, yet the worst cases might be terrible.\n"\r
+"\n\\r
+Heaps are also very useful in big disk sorts.  You most probably all\n\\r
+know that a big sort implies producing \"runs\" (which are pre-sorted\n\\r
+sequences, which size is usually related to the amount of CPU memory),\n\\r
+followed by a merging passes for these runs, which merging is often\n\\r
+very cleverly organised[1].  It is very important that the initial\n\\r
+sort produces the longest runs possible.  Tournaments are a good way\n\\r
+to that.  If, using all the memory available to hold a tournament, you\n\\r
+replace and percolate items that happen to fit the current run, you'll\n\\r
+produce runs which are twice the size of the memory for random input,\n\\r
+and much better for input fuzzily ordered.\n"\r
+"\n\\r
+Moreover, if you output the 0'th item on disk and get an input which\n\\r
+may not fit in the current tournament (because the value \"wins\" over\n\\r
+the last output value), it cannot fit in the heap, so the size of the\n\\r
+heap decreases.  The freed memory could be cleverly reused immediately\n\\r
+for progressively building a second heap, which grows at exactly the\n\\r
+same rate the first heap is melting.  When the first heap completely\n\\r
+vanishes, you switch heaps and start a new run.  Clever and quite\n\\r
+effective!\n\\r
+\n\\r
+In a word, heaps are useful memory structures to know.  I use them in\n\\r
+a few applications, and I think it is good to keep a `heap' module\n\\r
+around. :-)\n"\r
+"\n\\r
+--------------------\n\\r
+[1] The disk balancing algorithms which are current, nowadays, are\n\\r
+more annoying than clever, and this is a consequence of the seeking\n\\r
+capabilities of the disks.  On devices which cannot seek, like big\n\\r
+tape drives, the story was quite different, and one had to be very\n\\r
+clever to ensure (far in advance) that each tape movement will be the\n\\r
+most effective possible (that is, will best participate at\n\\r
+\"progressing\" the merge).  Some tapes were even able to read\n\\r
+backwards, and this was also used to avoid the rewinding time.\n\\r
+Believe me, real good tape sorts were quite spectacular to watch!\n\\r
+From all times, sorting has always been a Great Art! :-)\n");\r
+\r
+PyMODINIT_FUNC\r
+init_heapq(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("_heapq", heapq_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+    PyModule_AddObject(m, "__about__", PyString_FromString(__about__));\r
+}\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.c
new file mode 100644 (file)
index 0000000..9cd1086
--- /dev/null
@@ -0,0 +1,777 @@
+/*\r
+    An implementation of the new I/O lib as defined by PEP 3116 - "New I/O"\r
+    \r
+    Classes defined here: UnsupportedOperation, BlockingIOError.\r
+    Functions defined here: open().\r
+    \r
+    Mostly written by Amaury Forgeot d'Arc\r
+*/\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "_iomodule.h"\r
+\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif /* HAVE_SYS_TYPES_H */\r
+\r
+#ifdef HAVE_SYS_STAT_H\r
+#include <sys/stat.h>\r
+#endif /* HAVE_SYS_STAT_H */\r
+\r
+\r
+/* Various interned strings */\r
+\r
+PyObject *_PyIO_str_close;\r
+PyObject *_PyIO_str_closed;\r
+PyObject *_PyIO_str_decode;\r
+PyObject *_PyIO_str_encode;\r
+PyObject *_PyIO_str_fileno;\r
+PyObject *_PyIO_str_flush;\r
+PyObject *_PyIO_str_getstate;\r
+PyObject *_PyIO_str_isatty;\r
+PyObject *_PyIO_str_newlines;\r
+PyObject *_PyIO_str_nl;\r
+PyObject *_PyIO_str_read;\r
+PyObject *_PyIO_str_read1;\r
+PyObject *_PyIO_str_readable;\r
+PyObject *_PyIO_str_readinto;\r
+PyObject *_PyIO_str_readline;\r
+PyObject *_PyIO_str_reset;\r
+PyObject *_PyIO_str_seek;\r
+PyObject *_PyIO_str_seekable;\r
+PyObject *_PyIO_str_setstate;\r
+PyObject *_PyIO_str_tell;\r
+PyObject *_PyIO_str_truncate;\r
+PyObject *_PyIO_str_writable;\r
+PyObject *_PyIO_str_write;\r
+\r
+PyObject *_PyIO_empty_str;\r
+PyObject *_PyIO_empty_bytes;\r
+PyObject *_PyIO_zero;\r
+\r
+\f\r
+PyDoc_STRVAR(module_doc,\r
+"The io module provides the Python interfaces to stream handling. The\n"\r
+"builtin open function is defined in this module.\n"\r
+"\n"\r
+"At the top of the I/O hierarchy is the abstract base class IOBase. It\n"\r
+"defines the basic interface to a stream. Note, however, that there is no\n"\r
+"separation between reading and writing to streams; implementations are\n"\r
+"allowed to raise an IOError if they do not support a given operation.\n"\r
+"\n"\r
+"Extending IOBase is RawIOBase which deals simply with the reading and\n"\r
+"writing of raw bytes to a stream. FileIO subclasses RawIOBase to provide\n"\r
+"an interface to OS files.\n"\r
+"\n"\r
+"BufferedIOBase deals with buffering on a raw byte stream (RawIOBase). Its\n"\r
+"subclasses, BufferedWriter, BufferedReader, and BufferedRWPair buffer\n"\r
+"streams that are readable, writable, and both respectively.\n"\r
+"BufferedRandom provides a buffered interface to random access\n"\r
+"streams. BytesIO is a simple stream of in-memory bytes.\n"\r
+"\n"\r
+"Another IOBase subclass, TextIOBase, deals with the encoding and decoding\n"\r
+"of streams into text. TextIOWrapper, which extends it, is a buffered text\n"\r
+"interface to a buffered raw stream (`BufferedIOBase`). Finally, StringIO\n"\r
+"is a in-memory stream for text.\n"\r
+"\n"\r
+"Argument names are not part of the specification, and only the arguments\n"\r
+"of open() are intended to be used as keyword arguments.\n"\r
+"\n"\r
+"data:\n"\r
+"\n"\r
+"DEFAULT_BUFFER_SIZE\n"\r
+"\n"\r
+"   An int containing the default buffer size used by the module's buffered\n"\r
+"   I/O classes. open() uses the file's blksize (as obtained by os.stat) if\n"\r
+"   possible.\n"\r
+    );\r
+\f\r
+\r
+/*\r
+ * BlockingIOError extends IOError\r
+ */\r
+\r
+static int\r
+blockingioerror_init(PyBlockingIOErrorObject *self, PyObject *args,\r
+                     PyObject *kwds)\r
+{\r
+    PyObject *myerrno = NULL, *strerror = NULL;\r
+    PyObject *baseargs = NULL;\r
+    Py_ssize_t written = 0;\r
+\r
+    assert(PyTuple_Check(args));\r
+\r
+    self->written = 0;\r
+    if (!PyArg_ParseTuple(args, "OO|n:BlockingIOError",\r
+                          &myerrno, &strerror, &written))\r
+        return -1;\r
+\r
+    baseargs = PyTuple_Pack(2, myerrno, strerror);\r
+    if (baseargs == NULL)\r
+        return -1;\r
+    /* This will take care of initializing of myerrno and strerror members */\r
+    if (((PyTypeObject *)PyExc_IOError)->tp_init(\r
+                (PyObject *)self, baseargs, kwds) == -1) {\r
+        Py_DECREF(baseargs);\r
+        return -1;\r
+    }\r
+    Py_DECREF(baseargs);\r
+\r
+    self->written = written;\r
+    return 0;\r
+}\r
+\r
+static PyMemberDef blockingioerror_members[] = {\r
+    {"characters_written", T_PYSSIZET, offsetof(PyBlockingIOErrorObject, written), 0},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyTypeObject _PyExc_BlockingIOError = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "BlockingIOError", /*tp_name*/\r
+    sizeof(PyBlockingIOErrorObject), /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    0,                          /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/\r
+    PyDoc_STR("Exception raised when I/O would block "\r
+              "on a non-blocking I/O stream"), /* tp_doc */\r
+    0,                          /* tp_traverse */\r
+    0,                          /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    0,                          /* tp_weaklistoffset */\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    0,                          /* tp_methods */\r
+    blockingioerror_members,    /* tp_members */\r
+    0,                          /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    0,                          /* tp_dictoffset */\r
+    (initproc)blockingioerror_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    0,                          /* tp_new */\r
+};\r
+PyObject *PyExc_BlockingIOError = (PyObject *)&_PyExc_BlockingIOError;\r
+\f\r
+\r
+/*\r
+ * The main open() function\r
+ */\r
+PyDoc_STRVAR(open_doc,\r
+"Open file and return a stream.  Raise IOError upon failure.\n"\r
+"\n"\r
+"file is either a text or byte string giving the name (and the path\n"\r
+"if the file isn't in the current working directory) of the file to\n"\r
+"be opened or an integer file descriptor of the file to be\n"\r
+"wrapped. (If a file descriptor is given, it is closed when the\n"\r
+"returned I/O object is closed, unless closefd is set to False.)\n"\r
+"\n"\r
+"mode is an optional string that specifies the mode in which the file\n"\r
+"is opened. It defaults to 'r' which means open for reading in text\n"\r
+"mode.  Other common values are 'w' for writing (truncating the file if\n"\r
+"it already exists), and 'a' for appending (which on some Unix systems,\n"\r
+"means that all writes append to the end of the file regardless of the\n"\r
+"current seek position). In text mode, if encoding is not specified the\n"\r
+"encoding used is platform dependent. (For reading and writing raw\n"\r
+"bytes use binary mode and leave encoding unspecified.) The available\n"\r
+"modes are:\n"\r
+"\n"\r
+"========= ===============================================================\n"\r
+"Character Meaning\n"\r
+"--------- ---------------------------------------------------------------\n"\r
+"'r'       open for reading (default)\n"\r
+"'w'       open for writing, truncating the file first\n"\r
+"'a'       open for writing, appending to the end of the file if it exists\n"\r
+"'b'       binary mode\n"\r
+"'t'       text mode (default)\n"\r
+"'+'       open a disk file for updating (reading and writing)\n"\r
+"'U'       universal newline mode (for backwards compatibility; unneeded\n"\r
+"          for new code)\n"\r
+"========= ===============================================================\n"\r
+"\n"\r
+"The default mode is 'rt' (open for reading text). For binary random\n"\r
+"access, the mode 'w+b' opens and truncates the file to 0 bytes, while\n"\r
+"'r+b' opens the file without truncation.\n"\r
+"\n"\r
+"Python distinguishes between files opened in binary and text modes,\n"\r
+"even when the underlying operating system doesn't. Files opened in\n"\r
+"binary mode (appending 'b' to the mode argument) return contents as\n"\r
+"bytes objects without any decoding. In text mode (the default, or when\n"\r
+"'t' is appended to the mode argument), the contents of the file are\n"\r
+"returned as strings, the bytes having been first decoded using a\n"\r
+"platform-dependent encoding or using the specified encoding if given.\n"\r
+"\n"\r
+"buffering is an optional integer used to set the buffering policy.\n"\r
+"Pass 0 to switch buffering off (only allowed in binary mode), 1 to select\n"\r
+"line buffering (only usable in text mode), and an integer > 1 to indicate\n"\r
+"the size of a fixed-size chunk buffer.  When no buffering argument is\n"\r
+"given, the default buffering policy works as follows:\n"\r
+"\n"\r
+"* Binary files are buffered in fixed-size chunks; the size of the buffer\n"\r
+"  is chosen using a heuristic trying to determine the underlying device's\n"\r
+"  \"block size\" and falling back on `io.DEFAULT_BUFFER_SIZE`.\n"\r
+"  On many systems, the buffer will typically be 4096 or 8192 bytes long.\n"\r
+"\n"\r
+"* \"Interactive\" text files (files for which isatty() returns True)\n"\r
+"  use line buffering.  Other text files use the policy described above\n"\r
+"  for binary files.\n"\r
+"\n"\r
+"encoding is the name of the encoding used to decode or encode the\n"\r
+"file. This should only be used in text mode. The default encoding is\n"\r
+"platform dependent, but any encoding supported by Python can be\n"\r
+"passed.  See the codecs module for the list of supported encodings.\n"\r
+"\n"\r
+"errors is an optional string that specifies how encoding errors are to\n"\r
+"be handled---this argument should not be used in binary mode. Pass\n"\r
+"'strict' to raise a ValueError exception if there is an encoding error\n"\r
+"(the default of None has the same effect), or pass 'ignore' to ignore\n"\r
+"errors. (Note that ignoring encoding errors can lead to data loss.)\n"\r
+"See the documentation for codecs.register for a list of the permitted\n"\r
+"encoding error strings.\n"\r
+"\n"\r
+"newline controls how universal newlines works (it only applies to text\n"\r
+"mode). It can be None, '', '\\n', '\\r', and '\\r\\n'.  It works as\n"\r
+"follows:\n"\r
+"\n"\r
+"* On input, if newline is None, universal newlines mode is\n"\r
+"  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"\r
+"  these are translated into '\\n' before being returned to the\n"\r
+"  caller. If it is '', universal newline mode is enabled, but line\n"\r
+"  endings are returned to the caller untranslated. If it has any of\n"\r
+"  the other legal values, input lines are only terminated by the given\n"\r
+"  string, and the line ending is returned to the caller untranslated.\n"\r
+"\n"\r
+"* On output, if newline is None, any '\\n' characters written are\n"\r
+"  translated to the system default line separator, os.linesep. If\n"\r
+"  newline is '', no translation takes place. If newline is any of the\n"\r
+"  other legal values, any '\\n' characters written are translated to\n"\r
+"  the given string.\n"\r
+"\n"\r
+"If closefd is False, the underlying file descriptor will be kept open\n"\r
+"when the file is closed. This does not work when a file name is given\n"\r
+"and must be True in that case.\n"\r
+"\n"\r
+"open() returns a file object whose type depends on the mode, and\n"\r
+"through which the standard file operations such as reading and writing\n"\r
+"are performed. When open() is used to open a file in a text mode ('w',\n"\r
+"'r', 'wt', 'rt', etc.), it returns a TextIOWrapper. When used to open\n"\r
+"a file in a binary mode, the returned class varies: in read binary\n"\r
+"mode, it returns a BufferedReader; in write binary and append binary\n"\r
+"modes, it returns a BufferedWriter, and in read/write mode, it returns\n"\r
+"a BufferedRandom.\n"\r
+"\n"\r
+"It is also possible to use a string or bytearray as a file for both\n"\r
+"reading and writing. For strings StringIO can be used like a file\n"\r
+"opened in a text mode, and for bytes a BytesIO can be used like a file\n"\r
+"opened in a binary mode.\n"\r
+    );\r
+\r
+static PyObject *\r
+io_open(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"file", "mode", "buffering",\r
+                      "encoding", "errors", "newline",\r
+                      "closefd", NULL};\r
+    PyObject *file;\r
+    char *mode = "r";\r
+    int buffering = -1, closefd = 1;\r
+    char *encoding = NULL, *errors = NULL, *newline = NULL;\r
+    unsigned i;\r
+\r
+    int reading = 0, writing = 0, appending = 0, updating = 0;\r
+    int text = 0, binary = 0, universal = 0;\r
+\r
+    char rawmode[5], *m;\r
+    int line_buffering;\r
+    long isatty;\r
+\r
+    PyObject *raw, *modeobj = NULL, *buffer, *wrapper, *result = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|sizzzi:open", kwlist,\r
+                                     &file, &mode, &buffering,\r
+                                     &encoding, &errors, &newline,\r
+                                     &closefd)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (!PyUnicode_Check(file) &&\r
+       !PyBytes_Check(file) &&\r
+       !PyNumber_Check(file)) {\r
+        PyObject *repr = PyObject_Repr(file);\r
+        if (repr != NULL) {\r
+            PyErr_Format(PyExc_TypeError, "invalid file: %s",\r
+                         PyString_AS_STRING(repr));\r
+            Py_DECREF(repr);\r
+        }\r
+        return NULL;\r
+    }\r
+\r
+    /* Decode mode */\r
+    for (i = 0; i < strlen(mode); i++) {\r
+        char c = mode[i];\r
+\r
+        switch (c) {\r
+        case 'r':\r
+            reading = 1;\r
+            break;\r
+        case 'w':\r
+            writing = 1;\r
+            break;\r
+        case 'a':\r
+            appending = 1;\r
+            break;\r
+        case '+':\r
+            updating = 1;\r
+            break;\r
+        case 't':\r
+            text = 1;\r
+            break;\r
+        case 'b':\r
+            binary = 1;\r
+            break;\r
+        case 'U':\r
+            universal = 1;\r
+            reading = 1;\r
+            break;\r
+        default:\r
+            goto invalid_mode;\r
+        }\r
+\r
+        /* c must not be duplicated */\r
+        if (strchr(mode+i+1, c)) {\r
+          invalid_mode:\r
+            PyErr_Format(PyExc_ValueError, "invalid mode: '%s'", mode);\r
+            return NULL;\r
+        }\r
+\r
+    }\r
+\r
+    m = rawmode;\r
+    if (reading)   *(m++) = 'r';\r
+    if (writing)   *(m++) = 'w';\r
+    if (appending) *(m++) = 'a';\r
+    if (updating)  *(m++) = '+';\r
+    *m = '\0';\r
+\r
+    /* Parameters validation */\r
+    if (universal) {\r
+        if (writing || appending) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "can't use U and writing mode at once");\r
+            return NULL;\r
+        }\r
+        reading = 1;\r
+    }\r
+\r
+    if (text && binary) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "can't have text and binary mode at once");\r
+        return NULL;\r
+    }\r
+\r
+    if (reading + writing + appending > 1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "must have exactly one of read/write/append mode");\r
+        return NULL;\r
+    }\r
+\r
+    if (binary && encoding != NULL) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "binary mode doesn't take an encoding argument");\r
+        return NULL;\r
+    }\r
+\r
+    if (binary && errors != NULL) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "binary mode doesn't take an errors argument");\r
+        return NULL;\r
+    }\r
+\r
+    if (binary && newline != NULL) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "binary mode doesn't take a newline argument");\r
+        return NULL;\r
+    }\r
+\r
+    /* Create the Raw file stream */\r
+    raw = PyObject_CallFunction((PyObject *)&PyFileIO_Type,\r
+                               "Osi", file, rawmode, closefd);\r
+    if (raw == NULL)\r
+        return NULL;\r
+    result = raw;\r
+\r
+    modeobj = PyUnicode_FromString(mode);\r
+    if (modeobj == NULL)\r
+        goto error;\r
+\r
+    /* buffering */\r
+    {\r
+        PyObject *res = PyObject_CallMethod(raw, "isatty", NULL);\r
+        if (res == NULL)\r
+            goto error;\r
+        isatty = PyLong_AsLong(res);\r
+        Py_DECREF(res);\r
+        if (isatty == -1 && PyErr_Occurred())\r
+            goto error;\r
+    }\r
+\r
+    if (buffering == 1 || (buffering < 0 && isatty)) {\r
+        buffering = -1;\r
+        line_buffering = 1;\r
+    }\r
+    else\r
+        line_buffering = 0;\r
+\r
+    if (buffering < 0) {\r
+        buffering = DEFAULT_BUFFER_SIZE;\r
+#ifdef HAVE_STRUCT_STAT_ST_BLKSIZE\r
+        {\r
+            struct stat st;\r
+            int fileno;\r
+            PyObject *res = PyObject_CallMethod(raw, "fileno", NULL);\r
+            if (res == NULL)\r
+                goto error;\r
+\r
+            fileno = _PyInt_AsInt(res);\r
+            Py_DECREF(res);\r
+            if (fileno == -1 && PyErr_Occurred())\r
+                goto error;\r
+\r
+            if (fstat(fileno, &st) >= 0 && st.st_blksize > 1)\r
+                buffering = st.st_blksize;\r
+        }\r
+#endif\r
+    }\r
+    if (buffering < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "invalid buffering size");\r
+        goto error;\r
+    }\r
+\r
+    /* if not buffering, returns the raw file object */\r
+    if (buffering == 0) {\r
+        if (!binary) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "can't have unbuffered text I/O");\r
+            goto error;\r
+        }\r
+\r
+        Py_DECREF(modeobj);\r
+        return result;\r
+    }\r
+\r
+    /* wraps into a buffered file */\r
+    {\r
+        PyObject *Buffered_class;\r
+\r
+        if (updating)\r
+            Buffered_class = (PyObject *)&PyBufferedRandom_Type;\r
+        else if (writing || appending)\r
+            Buffered_class = (PyObject *)&PyBufferedWriter_Type;\r
+        else if (reading)\r
+            Buffered_class = (PyObject *)&PyBufferedReader_Type;\r
+        else {\r
+            PyErr_Format(PyExc_ValueError,\r
+                         "unknown mode: '%s'", mode);\r
+            goto error;\r
+        }\r
+\r
+        buffer = PyObject_CallFunction(Buffered_class, "Oi", raw, buffering);\r
+    }\r
+    if (buffer == NULL)\r
+        goto error;\r
+    result = buffer;\r
+    Py_DECREF(raw);\r
+\r
+\r
+    /* if binary, returns the buffered file */\r
+    if (binary) {\r
+        Py_DECREF(modeobj);\r
+        return result;\r
+    }\r
+\r
+    /* wraps into a TextIOWrapper */\r
+    wrapper = PyObject_CallFunction((PyObject *)&PyTextIOWrapper_Type,\r
+                                   "Osssi",\r
+                                   buffer,\r
+                                   encoding, errors, newline,\r
+                                   line_buffering);\r
+    if (wrapper == NULL)\r
+        goto error;\r
+    result = wrapper;\r
+    Py_DECREF(buffer);\r
+\r
+    if (PyObject_SetAttrString(wrapper, "mode", modeobj) < 0)\r
+        goto error;\r
+    Py_DECREF(modeobj);\r
+    return result;\r
+\r
+  error:\r
+    if (result != NULL) {\r
+        PyObject *exc, *val, *tb, *close_result;\r
+        PyErr_Fetch(&exc, &val, &tb);\r
+        close_result = PyObject_CallMethod(result, "close", NULL);\r
+        _PyErr_ReplaceException(exc, val, tb);\r
+        Py_XDECREF(close_result);\r
+        Py_DECREF(result);\r
+    }\r
+    Py_XDECREF(modeobj);\r
+    return NULL;\r
+}\r
+\f\r
+/*\r
+ * Private helpers for the io module.\r
+ */\r
+\r
+Py_off_t\r
+PyNumber_AsOff_t(PyObject *item, PyObject *err)\r
+{\r
+    Py_off_t result;\r
+    PyObject *runerr;\r
+    PyObject *value = PyNumber_Index(item);\r
+    if (value == NULL)\r
+        return -1;\r
+\r
+    if (PyInt_Check(value)) {\r
+        /* We assume a long always fits in a Py_off_t... */\r
+        result = (Py_off_t) PyInt_AS_LONG(value);\r
+        goto finish;\r
+    }\r
+\r
+    /* We're done if PyLong_AsSsize_t() returns without error. */\r
+    result = PyLong_AsOff_t(value);\r
+    if (result != -1 || !(runerr = PyErr_Occurred()))\r
+        goto finish;\r
+\r
+    /* Error handling code -- only manage OverflowError differently */\r
+    if (!PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError))\r
+        goto finish;\r
+\r
+    PyErr_Clear();\r
+    /* If no error-handling desired then the default clipping\r
+       is sufficient.\r
+     */\r
+    if (!err) {\r
+        assert(PyLong_Check(value));\r
+        /* Whether or not it is less than or equal to\r
+           zero is determined by the sign of ob_size\r
+        */\r
+        if (_PyLong_Sign(value) < 0)\r
+            result = PY_OFF_T_MIN;\r
+        else\r
+            result = PY_OFF_T_MAX;\r
+    }\r
+    else {\r
+        /* Otherwise replace the error with caller's error object. */\r
+        PyErr_Format(err,\r
+                     "cannot fit '%.200s' into an offset-sized integer",\r
+                     item->ob_type->tp_name);\r
+    }\r
+\r
+ finish:\r
+    Py_DECREF(value);\r
+    return result;\r
+}\r
+\r
+\r
+/* Basically the "n" format code with the ability to turn None into -1. */\r
+int \r
+_PyIO_ConvertSsize_t(PyObject *obj, void *result) {\r
+    Py_ssize_t limit;\r
+    if (obj == Py_None) {\r
+        limit = -1;\r
+    }\r
+    else if (PyNumber_Check(obj)) {\r
+        limit = PyNumber_AsSsize_t(obj, PyExc_OverflowError);\r
+        if (limit == -1 && PyErr_Occurred())\r
+            return 0;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "integer argument expected, got '%.200s'",\r
+                     Py_TYPE(obj)->tp_name);\r
+        return 0;\r
+    }\r
+    *((Py_ssize_t *)result) = limit;\r
+    return 1;\r
+}\r
+\r
+\r
+/*\r
+ * Module definition\r
+ */\r
+\r
+PyObject *_PyIO_os_module = NULL;\r
+PyObject *_PyIO_locale_module = NULL;\r
+PyObject *_PyIO_unsupported_operation = NULL;\r
+\r
+static PyMethodDef module_methods[] = {\r
+    {"open", (PyCFunction)io_open, METH_VARARGS|METH_KEYWORDS, open_doc},\r
+    {NULL, NULL}\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_io(void)\r
+{\r
+    PyObject *m = Py_InitModule4("_io", module_methods,\r
+                                 module_doc, NULL, PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* put os in the module state */\r
+    _PyIO_os_module = PyImport_ImportModule("os");\r
+    if (_PyIO_os_module == NULL)\r
+        goto fail;\r
+\r
+#define ADD_TYPE(type, name) \\r
+    if (PyType_Ready(type) < 0) \\r
+        goto fail; \\r
+    Py_INCREF(type); \\r
+    if (PyModule_AddObject(m, name, (PyObject *)type) < 0) {  \\r
+        Py_DECREF(type); \\r
+        goto fail; \\r
+    }\r
+\r
+    /* DEFAULT_BUFFER_SIZE */\r
+    if (PyModule_AddIntMacro(m, DEFAULT_BUFFER_SIZE) < 0)\r
+        goto fail;\r
+\r
+    /* UnsupportedOperation inherits from ValueError and IOError */\r
+    _PyIO_unsupported_operation = PyObject_CallFunction(\r
+        (PyObject *)&PyType_Type, "s(OO){}",\r
+        "UnsupportedOperation", PyExc_ValueError, PyExc_IOError);\r
+    if (_PyIO_unsupported_operation == NULL)\r
+        goto fail;\r
+    Py_INCREF(_PyIO_unsupported_operation);\r
+    if (PyModule_AddObject(m, "UnsupportedOperation",\r
+                           _PyIO_unsupported_operation) < 0)\r
+        goto fail;\r
+\r
+    /* BlockingIOError */\r
+    _PyExc_BlockingIOError.tp_base = (PyTypeObject *) PyExc_IOError;\r
+    ADD_TYPE(&_PyExc_BlockingIOError, "BlockingIOError");\r
+\r
+    /* Concrete base types of the IO ABCs.\r
+       (the ABCs themselves are declared through inheritance in io.py)\r
+    */\r
+    ADD_TYPE(&PyIOBase_Type, "_IOBase");\r
+    ADD_TYPE(&PyRawIOBase_Type, "_RawIOBase");\r
+    ADD_TYPE(&PyBufferedIOBase_Type, "_BufferedIOBase");\r
+    ADD_TYPE(&PyTextIOBase_Type, "_TextIOBase");\r
+\r
+    /* Implementation of concrete IO objects. */\r
+    /* FileIO */\r
+    PyFileIO_Type.tp_base = &PyRawIOBase_Type;\r
+    ADD_TYPE(&PyFileIO_Type, "FileIO");\r
+\r
+    /* BytesIO */\r
+    PyBytesIO_Type.tp_base = &PyBufferedIOBase_Type;\r
+    ADD_TYPE(&PyBytesIO_Type, "BytesIO");\r
+\r
+    /* StringIO */\r
+    PyStringIO_Type.tp_base = &PyTextIOBase_Type;\r
+    ADD_TYPE(&PyStringIO_Type, "StringIO");\r
+\r
+    /* BufferedReader */\r
+    PyBufferedReader_Type.tp_base = &PyBufferedIOBase_Type;\r
+    ADD_TYPE(&PyBufferedReader_Type, "BufferedReader");\r
+\r
+    /* BufferedWriter */\r
+    PyBufferedWriter_Type.tp_base = &PyBufferedIOBase_Type;\r
+    ADD_TYPE(&PyBufferedWriter_Type, "BufferedWriter");\r
+\r
+    /* BufferedRWPair */\r
+    PyBufferedRWPair_Type.tp_base = &PyBufferedIOBase_Type;\r
+    ADD_TYPE(&PyBufferedRWPair_Type, "BufferedRWPair");\r
+\r
+    /* BufferedRandom */\r
+    PyBufferedRandom_Type.tp_base = &PyBufferedIOBase_Type;\r
+    ADD_TYPE(&PyBufferedRandom_Type, "BufferedRandom");\r
+\r
+    /* TextIOWrapper */\r
+    PyTextIOWrapper_Type.tp_base = &PyTextIOBase_Type;\r
+    ADD_TYPE(&PyTextIOWrapper_Type, "TextIOWrapper");\r
+\r
+    /* IncrementalNewlineDecoder */\r
+    ADD_TYPE(&PyIncrementalNewlineDecoder_Type, "IncrementalNewlineDecoder");\r
+\r
+    /* Interned strings */\r
+    if (!(_PyIO_str_close = PyString_InternFromString("close")))\r
+        goto fail;\r
+    if (!(_PyIO_str_closed = PyString_InternFromString("closed")))\r
+        goto fail;\r
+    if (!(_PyIO_str_decode = PyString_InternFromString("decode")))\r
+        goto fail;\r
+    if (!(_PyIO_str_encode = PyString_InternFromString("encode")))\r
+        goto fail;\r
+    if (!(_PyIO_str_fileno = PyString_InternFromString("fileno")))\r
+        goto fail;\r
+    if (!(_PyIO_str_flush = PyString_InternFromString("flush")))\r
+        goto fail;\r
+    if (!(_PyIO_str_getstate = PyString_InternFromString("getstate")))\r
+        goto fail;\r
+    if (!(_PyIO_str_isatty = PyString_InternFromString("isatty")))\r
+        goto fail;\r
+    if (!(_PyIO_str_newlines = PyString_InternFromString("newlines")))\r
+        goto fail;\r
+    if (!(_PyIO_str_nl = PyString_InternFromString("\n")))\r
+        goto fail;\r
+    if (!(_PyIO_str_read = PyString_InternFromString("read")))\r
+        goto fail;\r
+    if (!(_PyIO_str_read1 = PyString_InternFromString("read1")))\r
+        goto fail;\r
+    if (!(_PyIO_str_readable = PyString_InternFromString("readable")))\r
+        goto fail;\r
+    if (!(_PyIO_str_readinto = PyString_InternFromString("readinto")))\r
+        goto fail;\r
+    if (!(_PyIO_str_readline = PyString_InternFromString("readline")))\r
+        goto fail;\r
+    if (!(_PyIO_str_reset = PyString_InternFromString("reset")))\r
+        goto fail;\r
+    if (!(_PyIO_str_seek = PyString_InternFromString("seek")))\r
+        goto fail;\r
+    if (!(_PyIO_str_seekable = PyString_InternFromString("seekable")))\r
+        goto fail;\r
+    if (!(_PyIO_str_setstate = PyString_InternFromString("setstate")))\r
+        goto fail;\r
+    if (!(_PyIO_str_tell = PyString_InternFromString("tell")))\r
+        goto fail;\r
+    if (!(_PyIO_str_truncate = PyString_InternFromString("truncate")))\r
+        goto fail;\r
+    if (!(_PyIO_str_write = PyString_InternFromString("write")))\r
+        goto fail;\r
+    if (!(_PyIO_str_writable = PyString_InternFromString("writable")))\r
+        goto fail;\r
+    \r
+    if (!(_PyIO_empty_str = PyUnicode_FromStringAndSize(NULL, 0)))\r
+        goto fail;\r
+    if (!(_PyIO_empty_bytes = PyBytes_FromStringAndSize(NULL, 0)))\r
+        goto fail;\r
+    if (!(_PyIO_zero = PyLong_FromLong(0L)))\r
+        goto fail;\r
+\r
+    return;\r
+\r
+  fail:\r
+    Py_CLEAR(_PyIO_os_module);\r
+    Py_CLEAR(_PyIO_unsupported_operation);\r
+    Py_DECREF(m);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/_iomodule.h
new file mode 100644 (file)
index 0000000..054048d
--- /dev/null
@@ -0,0 +1,170 @@
+/*\r
+ * Declarations shared between the different parts of the io module\r
+ */\r
+\r
+/* ABCs */\r
+extern PyTypeObject PyIOBase_Type;\r
+extern PyTypeObject PyRawIOBase_Type;\r
+extern PyTypeObject PyBufferedIOBase_Type;\r
+extern PyTypeObject PyTextIOBase_Type;\r
+\r
+/* Concrete classes */\r
+extern PyTypeObject PyFileIO_Type;\r
+extern PyTypeObject PyBytesIO_Type;\r
+extern PyTypeObject PyStringIO_Type;\r
+extern PyTypeObject PyBufferedReader_Type;\r
+extern PyTypeObject PyBufferedWriter_Type;\r
+extern PyTypeObject PyBufferedRWPair_Type;\r
+extern PyTypeObject PyBufferedRandom_Type;\r
+extern PyTypeObject PyTextIOWrapper_Type;\r
+extern PyTypeObject PyIncrementalNewlineDecoder_Type;\r
+\r
+\r
+extern int _PyIO_ConvertSsize_t(PyObject *, void *);\r
+\r
+/* These functions are used as METH_NOARGS methods, are normally called\r
+ * with args=NULL, and return a new reference.\r
+ * BUT when args=Py_True is passed, they return a borrowed reference.\r
+ */\r
+extern PyObject* _PyIOBase_check_readable(PyObject *self, PyObject *args);\r
+extern PyObject* _PyIOBase_check_writable(PyObject *self, PyObject *args);\r
+extern PyObject* _PyIOBase_check_seekable(PyObject *self, PyObject *args);\r
+extern PyObject* _PyIOBase_check_closed(PyObject *self, PyObject *args);\r
+\r
+/* Helper for finalization.\r
+   This function will revive an object ready to be deallocated and try to\r
+   close() it. It returns 0 if the object can be destroyed, or -1 if it\r
+   is alive again. */\r
+extern int _PyIOBase_finalize(PyObject *self);\r
+\r
+/* Returns true if the given FileIO object is closed.\r
+   Doesn't check the argument type, so be careful! */\r
+extern int _PyFileIO_closed(PyObject *self);\r
+\r
+/* Shortcut to the core of the IncrementalNewlineDecoder.decode method */\r
+extern PyObject *_PyIncrementalNewlineDecoder_decode(\r
+    PyObject *self, PyObject *input, int final);\r
+\r
+/* Finds the first line ending between `start` and `end`.\r
+   If found, returns the index after the line ending and doesn't touch\r
+   `*consumed`.\r
+   If not found, returns -1 and sets `*consumed` to the number of characters\r
+   which can be safely put aside until another search.\r
+   \r
+   NOTE: for performance reasons, `end` must point to a NUL character ('\0'). \r
+   Otherwise, the function will scan further and return garbage. */\r
+extern Py_ssize_t _PyIO_find_line_ending(\r
+    int translated, int universal, PyObject *readnl,\r
+    Py_UNICODE *start, Py_UNICODE *end, Py_ssize_t *consumed);\r
+\r
+/* Return 1 if an EnvironmentError with errno == EINTR is set (and then\r
+   clears the error indicator), 0 otherwise.\r
+   Should only be called when PyErr_Occurred() is true.\r
+*/\r
+extern int _PyIO_trap_eintr(void);\r
+\r
+#define DEFAULT_BUFFER_SIZE (8 * 1024)  /* bytes */\r
+\r
+typedef struct {\r
+    /* This is the equivalent of PyException_HEAD in 3.x */\r
+    PyObject_HEAD\r
+    PyObject *dict;\r
+    PyObject *args;\r
+    PyObject *message;\r
+\r
+    PyObject *myerrno;\r
+    PyObject *strerror;\r
+    PyObject *filename; /* Not used, but part of the IOError object */\r
+    Py_ssize_t written;\r
+} PyBlockingIOErrorObject;\r
+extern PyObject *PyExc_BlockingIOError;\r
+\r
+/*\r
+ * Offset type for positioning.\r
+ */\r
+\r
+/* Printing a variable of type off_t (with e.g., PyString_FromFormat)\r
+   correctly and without producing compiler warnings is surprisingly painful.\r
+   We identify an integer type whose size matches off_t and then: (1) cast the\r
+   off_t to that integer type and (2) use the appropriate conversion\r
+   specification.  The cast is necessary: gcc complains about formatting a\r
+   long with "%lld" even when both long and long long have the same\r
+   precision. */\r
+\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+\r
+/* Windows uses long long for offsets */\r
+typedef PY_LONG_LONG Py_off_t;\r
+# define PyLong_AsOff_t     PyLong_AsLongLong\r
+# define PyLong_FromOff_t   PyLong_FromLongLong\r
+# define PY_OFF_T_MAX       PY_LLONG_MAX\r
+# define PY_OFF_T_MIN       PY_LLONG_MIN\r
+# define PY_OFF_T_COMPAT    PY_LONG_LONG /* type compatible with off_t */\r
+# define PY_PRIdOFF         "lld"        /* format to use for that type */\r
+\r
+#else\r
+\r
+/* Other platforms use off_t */\r
+typedef off_t Py_off_t;\r
+#if (SIZEOF_OFF_T == SIZEOF_SIZE_T)\r
+# define PyLong_AsOff_t     PyLong_AsSsize_t\r
+# define PyLong_FromOff_t   PyLong_FromSsize_t\r
+# define PY_OFF_T_MAX       PY_SSIZE_T_MAX\r
+# define PY_OFF_T_MIN       PY_SSIZE_T_MIN\r
+# define PY_OFF_T_COMPAT    Py_ssize_t\r
+# define PY_PRIdOFF         "zd"\r
+#elif (HAVE_LONG_LONG && SIZEOF_OFF_T == SIZEOF_LONG_LONG)\r
+# define PyLong_AsOff_t     PyLong_AsLongLong\r
+# define PyLong_FromOff_t   PyLong_FromLongLong\r
+# define PY_OFF_T_MAX       PY_LLONG_MAX\r
+# define PY_OFF_T_MIN       PY_LLONG_MIN\r
+# define PY_OFF_T_COMPAT    PY_LONG_LONG\r
+# define PY_PRIdOFF         "lld"\r
+#elif (SIZEOF_OFF_T == SIZEOF_LONG)\r
+# define PyLong_AsOff_t     PyLong_AsLong\r
+# define PyLong_FromOff_t   PyLong_FromLong\r
+# define PY_OFF_T_MAX       LONG_MAX\r
+# define PY_OFF_T_MIN       LONG_MIN\r
+# define PY_OFF_T_COMPAT    long\r
+# define PY_PRIdOFF         "ld"\r
+#else\r
+# error off_t does not match either size_t, long, or long long!\r
+#endif\r
+\r
+#endif\r
+\r
+extern Py_off_t PyNumber_AsOff_t(PyObject *item, PyObject *err);\r
+\r
+/* Implementation details */\r
+\r
+extern PyObject *_PyIO_os_module;\r
+extern PyObject *_PyIO_locale_module;\r
+extern PyObject *_PyIO_unsupported_operation;\r
+\r
+extern PyObject *_PyIO_str_close;\r
+extern PyObject *_PyIO_str_closed;\r
+extern PyObject *_PyIO_str_decode;\r
+extern PyObject *_PyIO_str_encode;\r
+extern PyObject *_PyIO_str_fileno;\r
+extern PyObject *_PyIO_str_flush;\r
+extern PyObject *_PyIO_str_getstate;\r
+extern PyObject *_PyIO_str_isatty;\r
+extern PyObject *_PyIO_str_newlines;\r
+extern PyObject *_PyIO_str_nl;\r
+extern PyObject *_PyIO_str_read;\r
+extern PyObject *_PyIO_str_read1;\r
+extern PyObject *_PyIO_str_readable;\r
+extern PyObject *_PyIO_str_readinto;\r
+extern PyObject *_PyIO_str_readline;\r
+extern PyObject *_PyIO_str_reset;\r
+extern PyObject *_PyIO_str_seek;\r
+extern PyObject *_PyIO_str_seekable;\r
+extern PyObject *_PyIO_str_setstate;\r
+extern PyObject *_PyIO_str_tell;\r
+extern PyObject *_PyIO_str_truncate;\r
+extern PyObject *_PyIO_str_writable;\r
+extern PyObject *_PyIO_str_write;\r
+\r
+extern PyObject *_PyIO_empty_str;\r
+extern PyObject *_PyIO_empty_bytes;\r
+extern PyObject *_PyIO_zero;\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bufferedio.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bufferedio.c
new file mode 100644 (file)
index 0000000..b7894b0
--- /dev/null
@@ -0,0 +1,2446 @@
+/*\r
+    An implementation of Buffered I/O as defined by PEP 3116 - "New I/O"\r
+    \r
+    Classes defined here: BufferedIOBase, BufferedReader, BufferedWriter,\r
+    BufferedRandom.\r
+    \r
+    Written by Amaury Forgeot d'Arc and Antoine Pitrou\r
+*/\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "pythread.h"\r
+#include "_iomodule.h"\r
+\r
+/*\r
+ * BufferedIOBase class, inherits from IOBase.\r
+ */\r
+PyDoc_STRVAR(bufferediobase_doc,\r
+    "Base class for buffered IO objects.\n"\r
+    "\n"\r
+    "The main difference with RawIOBase is that the read() method\n"\r
+    "supports omitting the size argument, and does not have a default\n"\r
+    "implementation that defers to readinto().\n"\r
+    "\n"\r
+    "In addition, read(), readinto() and write() may raise\n"\r
+    "BlockingIOError if the underlying raw stream is in non-blocking\n"\r
+    "mode and not ready; unlike their raw counterparts, they will never\n"\r
+    "return None.\n"\r
+    "\n"\r
+    "A typical implementation should not inherit from a RawIOBase\n"\r
+    "implementation, but wrap one.\n"\r
+    );\r
+\r
+static PyObject *\r
+bufferediobase_readinto(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer buf;\r
+    Py_ssize_t len;\r
+    PyObject *data;\r
+\r
+    if (!PyArg_ParseTuple(args, "w*:readinto", &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    data = PyObject_CallMethod(self, "read", "n", buf.len);\r
+    if (data == NULL)\r
+        goto error;\r
+\r
+    if (!PyBytes_Check(data)) {\r
+        Py_DECREF(data);\r
+        PyErr_SetString(PyExc_TypeError, "read() should return bytes");\r
+        goto error;\r
+    }\r
+\r
+    len = Py_SIZE(data);\r
+    memcpy(buf.buf, PyBytes_AS_STRING(data), len);\r
+\r
+    PyBuffer_Release(&buf);\r
+    Py_DECREF(data);\r
+\r
+    return PyLong_FromSsize_t(len);\r
+\r
+  error:\r
+    PyBuffer_Release(&buf);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+bufferediobase_unsupported(const char *message)\r
+{\r
+    PyErr_SetString(_PyIO_unsupported_operation, message);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(bufferediobase_detach_doc,\r
+    "Disconnect this buffer from its underlying raw stream and return it.\n"\r
+    "\n"\r
+    "After the raw stream has been detached, the buffer is in an unusable\n"\r
+    "state.\n");\r
+\r
+static PyObject *\r
+bufferediobase_detach(PyObject *self)\r
+{\r
+    return bufferediobase_unsupported("detach");\r
+}\r
+\r
+PyDoc_STRVAR(bufferediobase_read_doc,\r
+    "Read and return up to n bytes.\n"\r
+    "\n"\r
+    "If the argument is omitted, None, or negative, reads and\n"\r
+    "returns all data until EOF.\n"\r
+    "\n"\r
+    "If the argument is positive, and the underlying raw stream is\n"\r
+    "not 'interactive', multiple raw reads may be issued to satisfy\n"\r
+    "the byte count (unless EOF is reached first).  But for\n"\r
+    "interactive raw streams (as well as sockets and pipes), at most\n"\r
+    "one raw read will be issued, and a short result does not imply\n"\r
+    "that EOF is imminent.\n"\r
+    "\n"\r
+    "Returns an empty bytes object on EOF.\n"\r
+    "\n"\r
+    "Returns None if the underlying raw stream was open in non-blocking\n"\r
+    "mode and no data is available at the moment.\n");\r
+\r
+static PyObject *\r
+bufferediobase_read(PyObject *self, PyObject *args)\r
+{\r
+    return bufferediobase_unsupported("read");\r
+}\r
+\r
+PyDoc_STRVAR(bufferediobase_read1_doc,\r
+    "Read and return up to n bytes, with at most one read() call\n"\r
+    "to the underlying raw stream. A short result does not imply\n"\r
+    "that EOF is imminent.\n"\r
+    "\n"\r
+    "Returns an empty bytes object on EOF.\n");\r
+\r
+static PyObject *\r
+bufferediobase_read1(PyObject *self, PyObject *args)\r
+{\r
+    return bufferediobase_unsupported("read1");\r
+}\r
+\r
+PyDoc_STRVAR(bufferediobase_write_doc,\r
+    "Write the given buffer to the IO stream.\n"\r
+    "\n"\r
+    "Returns the number of bytes written, which is never less than\n"\r
+    "len(b).\n"\r
+    "\n"\r
+    "Raises BlockingIOError if the buffer is full and the\n"\r
+    "underlying raw stream cannot accept more data at the moment.\n");\r
+\r
+static PyObject *\r
+bufferediobase_write(PyObject *self, PyObject *args)\r
+{\r
+    return bufferediobase_unsupported("write");\r
+}\r
+\r
+\r
+static PyMethodDef bufferediobase_methods[] = {\r
+    {"detach", (PyCFunction)bufferediobase_detach, METH_NOARGS, bufferediobase_detach_doc},\r
+    {"read", bufferediobase_read, METH_VARARGS, bufferediobase_read_doc},\r
+    {"read1", bufferediobase_read1, METH_VARARGS, bufferediobase_read1_doc},\r
+    {"readinto", bufferediobase_readinto, METH_VARARGS, NULL},\r
+    {"write", bufferediobase_write, METH_VARARGS, bufferediobase_write_doc},\r
+    {NULL, NULL}\r
+};\r
+\r
+PyTypeObject PyBufferedIOBase_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io._BufferedIOBase",      /*tp_name*/\r
+    0,                          /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    0,                          /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/\r
+    bufferediobase_doc,         /* tp_doc */\r
+    0,                          /* tp_traverse */\r
+    0,                          /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    0,                          /* tp_weaklistoffset */\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    bufferediobase_methods,     /* tp_methods */\r
+    0,                          /* tp_members */\r
+    0,                          /* tp_getset */\r
+    &PyIOBase_Type,             /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    0,                          /* tp_dictoffset */\r
+    0,                          /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    0,                          /* tp_new */\r
+};\r
+\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+\r
+    PyObject *raw;\r
+    int ok;    /* Initialized? */\r
+    int detached;\r
+    int readable;\r
+    int writable;\r
+    \r
+    /* True if this is a vanilla Buffered object (rather than a user derived\r
+       class) *and* the raw stream is a vanilla FileIO object. */\r
+    int fast_closed_checks;\r
+\r
+    /* Absolute position inside the raw stream (-1 if unknown). */\r
+    Py_off_t abs_pos;\r
+\r
+    /* A static buffer of size `buffer_size` */\r
+    char *buffer;\r
+    /* Current logical position in the buffer. */\r
+    Py_off_t pos;\r
+    /* Position of the raw stream in the buffer. */\r
+    Py_off_t raw_pos;\r
+\r
+    /* Just after the last buffered byte in the buffer, or -1 if the buffer\r
+       isn't ready for reading. */\r
+    Py_off_t read_end;\r
+\r
+    /* Just after the last byte actually written */\r
+    Py_off_t write_pos;\r
+    /* Just after the last byte waiting to be written, or -1 if the buffer\r
+       isn't ready for writing. */\r
+    Py_off_t write_end;\r
+\r
+#ifdef WITH_THREAD\r
+    PyThread_type_lock lock;\r
+    volatile long owner;\r
+#endif\r
+\r
+    Py_ssize_t buffer_size;\r
+    Py_ssize_t buffer_mask;\r
+\r
+    PyObject *dict;\r
+    PyObject *weakreflist;\r
+} buffered;\r
+\r
+/*\r
+    Implementation notes:\r
+    \r
+    * BufferedReader, BufferedWriter and BufferedRandom try to share most\r
+      methods (this is helped by the members `readable` and `writable`, which\r
+      are initialized in the respective constructors)\r
+    * They also share a single buffer for reading and writing. This enables\r
+      interleaved reads and writes without flushing. It also makes the logic\r
+      a bit trickier to get right.\r
+    * The absolute position of the raw stream is cached, if possible, in the\r
+      `abs_pos` member. It must be updated every time an operation is done\r
+      on the raw stream. If not sure, it can be reinitialized by calling\r
+      _buffered_raw_tell(), which queries the raw stream (_buffered_raw_seek()\r
+      also does it). To read it, use RAW_TELL().\r
+    * Three helpers, _bufferedreader_raw_read, _bufferedwriter_raw_write and\r
+      _bufferedwriter_flush_unlocked do a lot of useful housekeeping.\r
+\r
+    NOTE: we should try to maintain block alignment of reads and writes to the\r
+    raw stream (according to the buffer size), but for now it is only done\r
+    in read() and friends.\r
+    \r
+*/\r
+\r
+/* These macros protect the buffered object against concurrent operations. */\r
+\r
+#ifdef WITH_THREAD\r
+\r
+static int\r
+_enter_buffered_busy(buffered *self)\r
+{\r
+    if (self->owner == PyThread_get_thread_ident()) {\r
+        PyObject *r = PyObject_Repr((PyObject *) self);\r
+        if (r != NULL) {\r
+            PyErr_Format(PyExc_RuntimeError,\r
+                         "reentrant call inside %s",\r
+                         PyString_AS_STRING(r));\r
+            Py_DECREF(r);\r
+        }\r
+        return 0;\r
+    }\r
+    Py_BEGIN_ALLOW_THREADS\r
+    PyThread_acquire_lock(self->lock, 1);\r
+    Py_END_ALLOW_THREADS\r
+    return 1;\r
+}\r
+\r
+#define ENTER_BUFFERED(self) \\r
+    ( (PyThread_acquire_lock(self->lock, 0) ? \\r
+       1 : _enter_buffered_busy(self)) \\r
+     && (self->owner = PyThread_get_thread_ident(), 1) )\r
+\r
+#define LEAVE_BUFFERED(self) \\r
+    do { \\r
+        self->owner = 0; \\r
+        PyThread_release_lock(self->lock); \\r
+    } while(0);\r
+\r
+#else\r
+#define ENTER_BUFFERED(self) 1\r
+#define LEAVE_BUFFERED(self)\r
+#endif\r
+\r
+#define CHECK_INITIALIZED(self) \\r
+    if (self->ok <= 0) { \\r
+        if (self->detached) { \\r
+            PyErr_SetString(PyExc_ValueError, \\r
+                 "raw stream has been detached"); \\r
+        } else { \\r
+            PyErr_SetString(PyExc_ValueError, \\r
+                "I/O operation on uninitialized object"); \\r
+        } \\r
+        return NULL; \\r
+    }\r
+\r
+#define CHECK_INITIALIZED_INT(self) \\r
+    if (self->ok <= 0) { \\r
+        if (self->detached) { \\r
+            PyErr_SetString(PyExc_ValueError, \\r
+                 "raw stream has been detached"); \\r
+        } else { \\r
+            PyErr_SetString(PyExc_ValueError, \\r
+                "I/O operation on uninitialized object"); \\r
+        } \\r
+        return -1; \\r
+    }\r
+\r
+#define IS_CLOSED(self) \\r
+    (self->fast_closed_checks \\r
+     ? _PyFileIO_closed(self->raw) \\r
+     : buffered_closed(self))\r
+\r
+#define CHECK_CLOSED(self, error_msg) \\r
+    if (IS_CLOSED(self)) { \\r
+        PyErr_SetString(PyExc_ValueError, error_msg); \\r
+        return NULL; \\r
+    }\r
+\r
+\r
+#define VALID_READ_BUFFER(self) \\r
+    (self->readable && self->read_end != -1)\r
+\r
+#define VALID_WRITE_BUFFER(self) \\r
+    (self->writable && self->write_end != -1)\r
+\r
+#define ADJUST_POSITION(self, _new_pos) \\r
+    do { \\r
+        self->pos = _new_pos; \\r
+        if (VALID_READ_BUFFER(self) && self->read_end < self->pos) \\r
+            self->read_end = self->pos; \\r
+    } while(0)\r
+\r
+#define READAHEAD(self) \\r
+    ((self->readable && VALID_READ_BUFFER(self)) \\r
+        ? (self->read_end - self->pos) : 0)\r
+\r
+#define RAW_OFFSET(self) \\r
+    (((VALID_READ_BUFFER(self) || VALID_WRITE_BUFFER(self)) \\r
+        && self->raw_pos >= 0) ? self->raw_pos - self->pos : 0)\r
+\r
+#define RAW_TELL(self) \\r
+    (self->abs_pos != -1 ? self->abs_pos : _buffered_raw_tell(self))\r
+\r
+#define MINUS_LAST_BLOCK(self, size) \\r
+    (self->buffer_mask ? \\r
+        (size & ~self->buffer_mask) : \\r
+        (self->buffer_size * (size / self->buffer_size)))\r
+\r
+\r
+static void\r
+buffered_dealloc(buffered *self)\r
+{\r
+    if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)\r
+        return;\r
+    _PyObject_GC_UNTRACK(self);\r
+    self->ok = 0;\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *)self);\r
+    Py_CLEAR(self->raw);\r
+    if (self->buffer) {\r
+        PyMem_Free(self->buffer);\r
+        self->buffer = NULL;\r
+    }\r
+#ifdef WITH_THREAD\r
+    if (self->lock) {\r
+        PyThread_free_lock(self->lock);\r
+        self->lock = NULL;\r
+    }\r
+#endif\r
+    Py_CLEAR(self->dict);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static PyObject *\r
+buffered_sizeof(buffered *self, void *unused)\r
+{\r
+    Py_ssize_t res;\r
+\r
+    res = sizeof(buffered);\r
+    if (self->buffer)\r
+        res += self->buffer_size;\r
+    return PyLong_FromSsize_t(res);\r
+}\r
+\r
+static int\r
+buffered_traverse(buffered *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->raw);\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+buffered_clear(buffered *self)\r
+{\r
+    if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)\r
+        return -1;\r
+    self->ok = 0;\r
+    Py_CLEAR(self->raw);\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+/*\r
+ * _BufferedIOMixin methods\r
+ * This is not a class, just a collection of methods that will be reused\r
+ * by BufferedReader and BufferedWriter\r
+ */\r
+\r
+/* Flush and close */\r
+\r
+static PyObject *\r
+buffered_simple_flush(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_flush, NULL);\r
+}\r
+\r
+static int\r
+buffered_closed(buffered *self)\r
+{\r
+    int closed;\r
+    PyObject *res;\r
+    CHECK_INITIALIZED_INT(self)\r
+    res = PyObject_GetAttr(self->raw, _PyIO_str_closed);\r
+    if (res == NULL)\r
+        return -1;\r
+    closed = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    return closed;\r
+}\r
+\r
+static PyObject *\r
+buffered_closed_get(buffered *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_GetAttr(self->raw, _PyIO_str_closed);\r
+}\r
+\r
+static PyObject *\r
+buffered_close(buffered *self, PyObject *args)\r
+{\r
+    PyObject *res = NULL, *exc = NULL, *val, *tb;\r
+    int r;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+\r
+    r = buffered_closed(self);\r
+    if (r < 0)\r
+        goto end;\r
+    if (r > 0) {\r
+        res = Py_None;\r
+        Py_INCREF(res);\r
+        goto end;\r
+    }\r
+    /* flush() will most probably re-take the lock, so drop it first */\r
+    LEAVE_BUFFERED(self)\r
+    res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL);\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+    if (res == NULL)\r
+        PyErr_Fetch(&exc, &val, &tb);\r
+    else\r
+        Py_DECREF(res);\r
+\r
+    res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_close, NULL);\r
+\r
+    if (exc != NULL) {\r
+        _PyErr_ReplaceException(exc, val, tb);\r
+        Py_CLEAR(res);\r
+    }\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+/* detach */\r
+\r
+static PyObject *\r
+buffered_detach(buffered *self, PyObject *args)\r
+{\r
+    PyObject *raw, *res;\r
+    CHECK_INITIALIZED(self)\r
+    res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    Py_DECREF(res);\r
+    raw = self->raw;\r
+    self->raw = NULL;\r
+    self->detached = 1;\r
+    self->ok = 0;\r
+    return raw;\r
+}\r
+\r
+/* Inquiries */\r
+\r
+static PyObject *\r
+buffered_seekable(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_seekable, NULL);\r
+}\r
+\r
+static PyObject *\r
+buffered_readable(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readable, NULL);\r
+}\r
+\r
+static PyObject *\r
+buffered_writable(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_writable, NULL);\r
+}\r
+\r
+static PyObject *\r
+buffered_name_get(buffered *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_GetAttrString(self->raw, "name");\r
+}\r
+\r
+static PyObject *\r
+buffered_mode_get(buffered *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_GetAttrString(self->raw, "mode");\r
+}\r
+\r
+/* Lower-level APIs */\r
+\r
+static PyObject *\r
+buffered_fileno(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_fileno, NULL);\r
+}\r
+\r
+static PyObject *\r
+buffered_isatty(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    return PyObject_CallMethodObjArgs(self->raw, _PyIO_str_isatty, NULL);\r
+}\r
+\r
+\r
+/* Forward decls */\r
+static PyObject *\r
+_bufferedwriter_flush_unlocked(buffered *);\r
+static Py_ssize_t\r
+_bufferedreader_fill_buffer(buffered *self);\r
+static void\r
+_bufferedreader_reset_buf(buffered *self);\r
+static void\r
+_bufferedwriter_reset_buf(buffered *self);\r
+static PyObject *\r
+_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t);\r
+static PyObject *\r
+_bufferedreader_read_all(buffered *self);\r
+static PyObject *\r
+_bufferedreader_read_fast(buffered *self, Py_ssize_t);\r
+static PyObject *\r
+_bufferedreader_read_generic(buffered *self, Py_ssize_t);\r
+\r
+\r
+/*\r
+ * Helpers\r
+ */\r
+\r
+/* Sets the current error to BlockingIOError */\r
+static void\r
+_set_BlockingIOError(char *msg, Py_ssize_t written)\r
+{\r
+    PyObject *err;\r
+    err = PyObject_CallFunction(PyExc_BlockingIOError, "isn",\r
+                                errno, msg, written);\r
+    if (err)\r
+        PyErr_SetObject(PyExc_BlockingIOError, err);\r
+    Py_XDECREF(err);\r
+}\r
+\r
+/* Returns the address of the `written` member if a BlockingIOError was\r
+   raised, NULL otherwise. The error is always re-raised. */\r
+static Py_ssize_t *\r
+_buffered_check_blocking_error(void)\r
+{\r
+    PyObject *t, *v, *tb;\r
+    PyBlockingIOErrorObject *err;\r
+\r
+    PyErr_Fetch(&t, &v, &tb);\r
+    if (v == NULL || !PyErr_GivenExceptionMatches(v, PyExc_BlockingIOError)) {\r
+        PyErr_Restore(t, v, tb);\r
+        return NULL;\r
+    }\r
+    err = (PyBlockingIOErrorObject *) v;\r
+    /* TODO: sanity check (err->written >= 0) */\r
+    PyErr_Restore(t, v, tb);\r
+    return &err->written;\r
+}\r
+\r
+static Py_off_t\r
+_buffered_raw_tell(buffered *self)\r
+{\r
+    Py_off_t n;\r
+    PyObject *res;\r
+    res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_tell, NULL);\r
+    if (res == NULL)\r
+        return -1;\r
+    n = PyNumber_AsOff_t(res, PyExc_ValueError);\r
+    Py_DECREF(res);\r
+    if (n < 0) {\r
+        if (!PyErr_Occurred())\r
+            PyErr_Format(PyExc_IOError,\r
+                         "Raw stream returned invalid position %" PY_PRIdOFF,\r
+                        (PY_OFF_T_COMPAT)n);\r
+        return -1;\r
+    }\r
+    self->abs_pos = n;\r
+    return n;\r
+}\r
+\r
+static Py_off_t\r
+_buffered_raw_seek(buffered *self, Py_off_t target, int whence)\r
+{\r
+    PyObject *res, *posobj, *whenceobj;\r
+    Py_off_t n;\r
+\r
+    posobj = PyLong_FromOff_t(target);\r
+    if (posobj == NULL)\r
+        return -1;\r
+    whenceobj = PyLong_FromLong(whence);\r
+    if (whenceobj == NULL) {\r
+        Py_DECREF(posobj);\r
+        return -1;\r
+    }\r
+    res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_seek,\r
+                                     posobj, whenceobj, NULL);\r
+    Py_DECREF(posobj);\r
+    Py_DECREF(whenceobj);\r
+    if (res == NULL)\r
+        return -1;\r
+    n = PyNumber_AsOff_t(res, PyExc_ValueError);\r
+    Py_DECREF(res);\r
+    if (n < 0) {\r
+        if (!PyErr_Occurred())\r
+            PyErr_Format(PyExc_IOError,\r
+                         "Raw stream returned invalid position %" PY_PRIdOFF,\r
+                        (PY_OFF_T_COMPAT)n);\r
+        return -1;\r
+    }\r
+    self->abs_pos = n;\r
+    return n;\r
+}\r
+\r
+static int\r
+_buffered_init(buffered *self)\r
+{\r
+    Py_ssize_t n;\r
+    if (self->buffer_size <= 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+            "buffer size must be strictly positive");\r
+        return -1;\r
+    }\r
+    if (self->buffer)\r
+        PyMem_Free(self->buffer);\r
+    self->buffer = PyMem_Malloc(self->buffer_size);\r
+    if (self->buffer == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+#ifdef WITH_THREAD\r
+    if (self->lock)\r
+        PyThread_free_lock(self->lock);\r
+    self->lock = PyThread_allocate_lock();\r
+    if (self->lock == NULL) {\r
+        PyErr_SetString(PyExc_RuntimeError, "can't allocate read lock");\r
+        return -1;\r
+    }\r
+    self->owner = 0;\r
+#endif\r
+    /* Find out whether buffer_size is a power of 2 */\r
+    /* XXX is this optimization useful? */\r
+    for (n = self->buffer_size - 1; n & 1; n >>= 1)\r
+        ;\r
+    if (n == 0)\r
+        self->buffer_mask = self->buffer_size - 1;\r
+    else\r
+        self->buffer_mask = 0;\r
+    if (_buffered_raw_tell(self) == -1)\r
+        PyErr_Clear();\r
+    return 0;\r
+}\r
+\r
+/* Return 1 if an EnvironmentError with errno == EINTR is set (and then\r
+   clears the error indicator), 0 otherwise.\r
+   Should only be called when PyErr_Occurred() is true.\r
+*/\r
+int\r
+_PyIO_trap_eintr(void)\r
+{\r
+    static PyObject *eintr_int = NULL;\r
+    PyObject *typ, *val, *tb;\r
+    PyEnvironmentErrorObject *env_err;\r
+\r
+    if (eintr_int == NULL) {\r
+        eintr_int = PyLong_FromLong(EINTR);\r
+        assert(eintr_int != NULL);\r
+    }\r
+    if (!PyErr_ExceptionMatches(PyExc_EnvironmentError))\r
+        return 0;\r
+    PyErr_Fetch(&typ, &val, &tb);\r
+    PyErr_NormalizeException(&typ, &val, &tb);\r
+    env_err = (PyEnvironmentErrorObject *) val;\r
+    assert(env_err != NULL);\r
+    if (env_err->myerrno != NULL &&\r
+        PyObject_RichCompareBool(env_err->myerrno, eintr_int, Py_EQ) > 0) {\r
+        Py_DECREF(typ);\r
+        Py_DECREF(val);\r
+        Py_XDECREF(tb);\r
+        return 1;\r
+    }\r
+    /* This silences any error set by PyObject_RichCompareBool() */\r
+    PyErr_Restore(typ, val, tb);\r
+    return 0;\r
+}\r
+\r
+/*\r
+ * Shared methods and wrappers\r
+ */\r
+\r
+static PyObject *\r
+buffered_flush_and_rewind_unlocked(buffered *self)\r
+{\r
+    PyObject *res;\r
+\r
+    res = _bufferedwriter_flush_unlocked(self);\r
+    if (res == NULL)\r
+        return NULL;\r
+    Py_DECREF(res);\r
+\r
+    if (self->readable) {\r
+        /* Rewind the raw stream so that its position corresponds to\r
+           the current logical position. */\r
+        Py_off_t n;\r
+        n = _buffered_raw_seek(self, -RAW_OFFSET(self), 1);\r
+        _bufferedreader_reset_buf(self);\r
+        if (n == -1)\r
+            return NULL;\r
+    }\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+buffered_flush(buffered *self, PyObject *args)\r
+{\r
+    PyObject *res;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    CHECK_CLOSED(self, "flush of closed file")\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+    res = buffered_flush_and_rewind_unlocked(self);\r
+    LEAVE_BUFFERED(self)\r
+\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_peek(buffered *self, PyObject *args)\r
+{\r
+    Py_ssize_t n = 0;\r
+    PyObject *res = NULL;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "|n:peek", &n)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+\r
+    if (self->writable) {\r
+        res = buffered_flush_and_rewind_unlocked(self);\r
+        if (res == NULL)\r
+            goto end;\r
+        Py_CLEAR(res);\r
+    }\r
+    res = _bufferedreader_peek_unlocked(self, n);\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_read(buffered *self, PyObject *args)\r
+{\r
+    Py_ssize_t n = -1;\r
+    PyObject *res;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n)) {\r
+        return NULL;\r
+    }\r
+    if (n < -1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "read length must be positive or -1");\r
+        return NULL;\r
+    }\r
+\r
+    CHECK_CLOSED(self, "read of closed file")\r
+\r
+    if (n == -1) {\r
+        /* The number of bytes is unspecified, read until the end of stream */\r
+        if (!ENTER_BUFFERED(self))\r
+            return NULL;\r
+        res = _bufferedreader_read_all(self);\r
+    }\r
+    else {\r
+        res = _bufferedreader_read_fast(self, n);\r
+        if (res != Py_None)\r
+            return res;\r
+        Py_DECREF(res);\r
+        if (!ENTER_BUFFERED(self))\r
+            return NULL;\r
+        res = _bufferedreader_read_generic(self, n);\r
+    }\r
+\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_read1(buffered *self, PyObject *args)\r
+{\r
+    Py_ssize_t n, have, r;\r
+    PyObject *res = NULL;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "n:read1", &n)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (n < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "read length must be positive");\r
+        return NULL;\r
+    }\r
+    if (n == 0)\r
+        return PyBytes_FromStringAndSize(NULL, 0);\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+    \r
+    /* Return up to n bytes.  If at least one byte is buffered, we\r
+       only return buffered bytes.  Otherwise, we do one raw read. */\r
+\r
+    /* XXX: this mimicks the io.py implementation but is probably wrong.\r
+       If we need to read from the raw stream, then we could actually read\r
+       all `n` bytes asked by the caller (and possibly more, so as to fill\r
+       our buffer for the next reads). */\r
+\r
+    have = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    if (have > 0) {\r
+        if (n > have)\r
+            n = have;\r
+        res = PyBytes_FromStringAndSize(self->buffer + self->pos, n);\r
+        if (res == NULL)\r
+            goto end;\r
+        self->pos += n;\r
+        goto end;\r
+    }\r
+\r
+    if (self->writable) {\r
+        res = buffered_flush_and_rewind_unlocked(self);\r
+        if (res == NULL)\r
+            goto end;\r
+        Py_DECREF(res);\r
+    }\r
+\r
+    /* Fill the buffer from the raw stream, and copy it to the result. */\r
+    _bufferedreader_reset_buf(self);\r
+    r = _bufferedreader_fill_buffer(self);\r
+    if (r == -1)\r
+        goto end;\r
+    if (r == -2)\r
+        r = 0;\r
+    if (n > r)\r
+        n = r;\r
+    res = PyBytes_FromStringAndSize(self->buffer, n);\r
+    if (res == NULL)\r
+        goto end;\r
+    self->pos = n;\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_readinto(buffered *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self)\r
+    \r
+    /* TODO: use raw.readinto() (or a direct copy from our buffer) instead! */\r
+    return bufferediobase_readinto((PyObject *)self, args);\r
+}\r
+\r
+static PyObject *\r
+_buffered_readline(buffered *self, Py_ssize_t limit)\r
+{\r
+    PyObject *res = NULL;\r
+    PyObject *chunks = NULL;\r
+    Py_ssize_t n, written = 0;\r
+    const char *start, *s, *end;\r
+\r
+    CHECK_CLOSED(self, "readline of closed file")\r
+\r
+    /* First, try to find a line in the buffer. This can run unlocked because\r
+       the calls to the C API are simple enough that they can't trigger\r
+       any thread switch. */\r
+    n = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    if (limit >= 0 && n > limit)\r
+        n = limit;\r
+    start = self->buffer + self->pos;\r
+    s = memchr(start, '\n', n);\r
+    if (s != NULL) {\r
+        res = PyBytes_FromStringAndSize(start, s - start + 1);\r
+        if (res != NULL)\r
+            self->pos += s - start + 1;\r
+        goto end_unlocked;\r
+    }\r
+    if (n == limit) {\r
+        res = PyBytes_FromStringAndSize(start, n);\r
+        if (res != NULL)\r
+            self->pos += n;\r
+        goto end_unlocked;\r
+    }\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        goto end_unlocked;\r
+\r
+    /* Now we try to get some more from the raw stream */\r
+    chunks = PyList_New(0);\r
+    if (chunks == NULL)\r
+        goto end;\r
+    if (n > 0) {\r
+        res = PyBytes_FromStringAndSize(start, n);\r
+        if (res == NULL)\r
+            goto end;\r
+        if (PyList_Append(chunks, res) < 0) {\r
+            Py_CLEAR(res);\r
+            goto end;\r
+        }\r
+        Py_CLEAR(res);\r
+        written += n;\r
+        self->pos += n;\r
+        if (limit >= 0)\r
+            limit -= n;\r
+    }\r
+    if (self->writable) {\r
+        PyObject *r = buffered_flush_and_rewind_unlocked(self);\r
+        if (r == NULL)\r
+            goto end;\r
+        Py_DECREF(r);\r
+    }\r
+\r
+    for (;;) {\r
+        _bufferedreader_reset_buf(self);\r
+        n = _bufferedreader_fill_buffer(self);\r
+        if (n == -1)\r
+            goto end;\r
+        if (n <= 0)\r
+            break;\r
+        if (limit >= 0 && n > limit)\r
+            n = limit;\r
+        start = self->buffer;\r
+        end = start + n;\r
+        s = start;\r
+        while (s < end) {\r
+            if (*s++ == '\n') {\r
+                res = PyBytes_FromStringAndSize(start, s - start);\r
+                if (res == NULL)\r
+                    goto end;\r
+                self->pos = s - start;\r
+                goto found;\r
+            }\r
+        }\r
+        res = PyBytes_FromStringAndSize(start, n);\r
+        if (res == NULL)\r
+            goto end;\r
+        if (n == limit) {\r
+            self->pos = n;\r
+            break;\r
+        }\r
+        if (PyList_Append(chunks, res) < 0) {\r
+            Py_CLEAR(res);\r
+            goto end;\r
+        }\r
+        Py_CLEAR(res);\r
+        written += n;\r
+        if (limit >= 0)\r
+            limit -= n;\r
+    }\r
+found:\r
+    if (res != NULL && PyList_Append(chunks, res) < 0) {\r
+        Py_CLEAR(res);\r
+        goto end;\r
+    }\r
+    Py_CLEAR(res);\r
+    res = _PyBytes_Join(_PyIO_empty_bytes, chunks);\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+end_unlocked:\r
+    Py_XDECREF(chunks);\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_readline(buffered *self, PyObject *args)\r
+{\r
+    Py_ssize_t limit = -1;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit))\r
+        return NULL;\r
+    return _buffered_readline(self, limit);\r
+}\r
+\r
+\r
+static PyObject *\r
+buffered_tell(buffered *self, PyObject *args)\r
+{\r
+    Py_off_t pos;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    pos = _buffered_raw_tell(self);\r
+    if (pos == -1)\r
+        return NULL;\r
+    pos -= RAW_OFFSET(self);\r
+    /* TODO: sanity check (pos >= 0) */\r
+    return PyLong_FromOff_t(pos);\r
+}\r
+\r
+static PyObject *\r
+buffered_seek(buffered *self, PyObject *args)\r
+{\r
+    Py_off_t target, n;\r
+    int whence = 0;\r
+    PyObject *targetobj, *res = NULL;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "O|i:seek", &targetobj, &whence)) {\r
+        return NULL;\r
+    }\r
+    if (whence < 0 || whence > 2) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "whence must be between 0 and 2, not %d", whence);\r
+        return NULL;\r
+    }\r
+\r
+    CHECK_CLOSED(self, "seek of closed file")\r
+\r
+    target = PyNumber_AsOff_t(targetobj, PyExc_ValueError);\r
+    if (target == -1 && PyErr_Occurred())\r
+        return NULL;\r
+\r
+    if (whence != 2 && self->readable) {\r
+        Py_off_t current, avail;\r
+        /* Check if seeking leaves us inside the current buffer,\r
+           so as to return quickly if possible. Also, we needn't take the\r
+           lock in this fast path.\r
+           Don't know how to do that when whence == 2, though. */\r
+        /* NOTE: RAW_TELL() can release the GIL but the object is in a stable\r
+           state at this point. */\r
+        current = RAW_TELL(self);\r
+        avail = READAHEAD(self);\r
+        if (avail > 0) {\r
+            Py_off_t offset;\r
+            if (whence == 0)\r
+                offset = target - (current - RAW_OFFSET(self));\r
+            else\r
+                offset = target;\r
+            if (offset >= -self->pos && offset <= avail) {\r
+                self->pos += offset;\r
+                return PyLong_FromOff_t(current - avail + offset);\r
+            }\r
+        }\r
+    }\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+\r
+    /* Fallback: invoke raw seek() method and clear buffer */\r
+    if (self->writable) {\r
+        res = _bufferedwriter_flush_unlocked(self);\r
+        if (res == NULL)\r
+            goto end;\r
+        Py_CLEAR(res);\r
+        _bufferedwriter_reset_buf(self);\r
+    }\r
+\r
+    /* TODO: align on block boundary and read buffer if needed? */\r
+    if (whence == 1)\r
+        target -= RAW_OFFSET(self);\r
+    n = _buffered_raw_seek(self, target, whence);\r
+    if (n == -1)\r
+        goto end;\r
+    self->raw_pos = -1;\r
+    res = PyLong_FromOff_t(n);\r
+    if (res != NULL && self->readable)\r
+        _bufferedreader_reset_buf(self);\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_truncate(buffered *self, PyObject *args)\r
+{\r
+    PyObject *pos = Py_None;\r
+    PyObject *res = NULL;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "|O:truncate", &pos)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (!ENTER_BUFFERED(self))\r
+        return NULL;\r
+\r
+    if (self->writable) {\r
+        res = buffered_flush_and_rewind_unlocked(self);\r
+        if (res == NULL)\r
+            goto end;\r
+        Py_CLEAR(res);\r
+    }\r
+    res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_truncate, pos, NULL);\r
+    if (res == NULL)\r
+        goto end;\r
+    /* Reset cached position */\r
+    if (_buffered_raw_tell(self) == -1)\r
+        PyErr_Clear();\r
+\r
+end:\r
+    LEAVE_BUFFERED(self)\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+buffered_iternext(buffered *self)\r
+{\r
+    PyObject *line;\r
+    PyTypeObject *tp;\r
+\r
+    CHECK_INITIALIZED(self);\r
+\r
+    tp = Py_TYPE(self);\r
+    if (tp == &PyBufferedReader_Type ||\r
+        tp == &PyBufferedRandom_Type) {\r
+        /* Skip method call overhead for speed */\r
+        line = _buffered_readline(self, -1);\r
+    }\r
+    else {\r
+        line = PyObject_CallMethodObjArgs((PyObject *)self,\r
+                                           _PyIO_str_readline, NULL);\r
+        if (line && !PyBytes_Check(line)) {\r
+            PyErr_Format(PyExc_IOError,\r
+                         "readline() should have returned a bytes object, "\r
+                         "not '%.200s'", Py_TYPE(line)->tp_name);\r
+            Py_DECREF(line);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    if (line == NULL)\r
+        return NULL;\r
+\r
+    if (PyBytes_GET_SIZE(line) == 0) {\r
+        /* Reached EOF or would have blocked */\r
+        Py_DECREF(line);\r
+        return NULL;\r
+    }\r
+\r
+    return line;\r
+}\r
+\r
+static PyObject *\r
+buffered_repr(buffered *self)\r
+{\r
+    PyObject *nameobj, *res;\r
+\r
+    nameobj = PyObject_GetAttrString((PyObject *) self, "name");\r
+    if (nameobj == NULL) {\r
+        if (PyErr_ExceptionMatches(PyExc_Exception))\r
+            PyErr_Clear();\r
+        else\r
+            return NULL;\r
+        res = PyString_FromFormat("<%s>", Py_TYPE(self)->tp_name);\r
+    }\r
+    else {\r
+        PyObject *repr = PyObject_Repr(nameobj);\r
+        Py_DECREF(nameobj);\r
+        if (repr == NULL)\r
+            return NULL;\r
+        res = PyString_FromFormat("<%s name=%s>",\r
+                                   Py_TYPE(self)->tp_name,\r
+                                   PyString_AS_STRING(repr));\r
+        Py_DECREF(repr);\r
+    }\r
+    return res;\r
+}\r
+\r
+/*\r
+ * class BufferedReader\r
+ */\r
+\r
+PyDoc_STRVAR(bufferedreader_doc,\r
+             "Create a new buffered reader using the given readable raw IO object.");\r
+\r
+static void _bufferedreader_reset_buf(buffered *self)\r
+{\r
+    self->read_end = -1;\r
+}\r
+\r
+static int\r
+bufferedreader_init(buffered *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"raw", "buffer_size", NULL};\r
+    Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;\r
+    PyObject *raw;\r
+\r
+    self->ok = 0;\r
+    self->detached = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:BufferedReader", kwlist,\r
+                                     &raw, &buffer_size)) {\r
+        return -1;\r
+    }\r
+\r
+    if (_PyIOBase_check_readable(raw, Py_True) == NULL)\r
+        return -1;\r
+\r
+    Py_CLEAR(self->raw);\r
+    Py_INCREF(raw);\r
+    self->raw = raw;\r
+    self->buffer_size = buffer_size;\r
+    self->readable = 1;\r
+    self->writable = 0;\r
+\r
+    if (_buffered_init(self) < 0)\r
+        return -1;\r
+    _bufferedreader_reset_buf(self);\r
+\r
+    self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedReader_Type &&\r
+                                Py_TYPE(raw) == &PyFileIO_Type);\r
+\r
+    self->ok = 1;\r
+    return 0;\r
+}\r
+\r
+static Py_ssize_t\r
+_bufferedreader_raw_read(buffered *self, char *start, Py_ssize_t len)\r
+{\r
+    Py_buffer buf;\r
+    PyObject *memobj, *res;\r
+    Py_ssize_t n;\r
+    /* NOTE: the buffer needn't be released as its object is NULL. */\r
+    if (PyBuffer_FillInfo(&buf, NULL, start, len, 0, PyBUF_CONTIG) == -1)\r
+        return -1;\r
+    memobj = PyMemoryView_FromBuffer(&buf);\r
+    if (memobj == NULL)\r
+        return -1;\r
+    /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR\r
+       occurs so we needn't do it ourselves.\r
+       We then retry reading, ignoring the signal if no handler has\r
+       raised (see issue #10956).\r
+    */\r
+    do {\r
+        res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_readinto, memobj, NULL);\r
+    } while (res == NULL && _PyIO_trap_eintr());\r
+    Py_DECREF(memobj);\r
+    if (res == NULL)\r
+        return -1;\r
+    if (res == Py_None) {\r
+        /* Non-blocking stream would have blocked. Special return code! */\r
+        Py_DECREF(res);\r
+        return -2;\r
+    }\r
+    n = PyNumber_AsSsize_t(res, PyExc_ValueError);\r
+    Py_DECREF(res);\r
+    if (n < 0 || n > len) {\r
+        PyErr_Format(PyExc_IOError,\r
+                     "raw readinto() returned invalid length %zd "\r
+                     "(should have been between 0 and %zd)", n, len);\r
+        return -1;\r
+    }\r
+    if (n > 0 && self->abs_pos != -1)\r
+        self->abs_pos += n;\r
+    return n;\r
+}\r
+\r
+static Py_ssize_t\r
+_bufferedreader_fill_buffer(buffered *self)\r
+{\r
+    Py_ssize_t start, len, n;\r
+    if (VALID_READ_BUFFER(self))\r
+        start = Py_SAFE_DOWNCAST(self->read_end, Py_off_t, Py_ssize_t);\r
+    else\r
+        start = 0;\r
+    len = self->buffer_size - start;\r
+    n = _bufferedreader_raw_read(self, self->buffer + start, len);\r
+    if (n <= 0)\r
+        return n;\r
+    self->read_end = start + n;\r
+    self->raw_pos = start + n;\r
+    return n;\r
+}\r
+\r
+static PyObject *\r
+_bufferedreader_read_all(buffered *self)\r
+{\r
+    Py_ssize_t current_size;\r
+    PyObject *res, *data = NULL;\r
+    PyObject *chunks = PyList_New(0);\r
+\r
+    if (chunks == NULL)\r
+        return NULL;\r
+\r
+    /* First copy what we have in the current buffer. */\r
+    current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    if (current_size) {\r
+        data = PyBytes_FromStringAndSize(\r
+            self->buffer + self->pos, current_size);\r
+        if (data == NULL) {\r
+            Py_DECREF(chunks);\r
+            return NULL;\r
+        }\r
+        self->pos += current_size;\r
+    }\r
+    /* We're going past the buffer's bounds, flush it */\r
+    if (self->writable) {\r
+        res = buffered_flush_and_rewind_unlocked(self);\r
+        if (res == NULL) {\r
+            Py_DECREF(chunks);\r
+            return NULL;\r
+        }\r
+        Py_CLEAR(res);\r
+    }\r
+    _bufferedreader_reset_buf(self);\r
+    while (1) {\r
+        if (data) {\r
+            if (PyList_Append(chunks, data) < 0) {\r
+                Py_DECREF(data);\r
+                Py_DECREF(chunks);\r
+                return NULL;\r
+            }\r
+            Py_DECREF(data);\r
+        }\r
+\r
+        /* Read until EOF or until read() would block. */\r
+        data = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_read, NULL);\r
+        if (data == NULL) {\r
+            Py_DECREF(chunks);\r
+            return NULL;\r
+        }\r
+        if (data != Py_None && !PyBytes_Check(data)) {\r
+            Py_DECREF(data);\r
+            Py_DECREF(chunks);\r
+            PyErr_SetString(PyExc_TypeError, "read() should return bytes");\r
+            return NULL;\r
+        }\r
+        if (data == Py_None || PyBytes_GET_SIZE(data) == 0) {\r
+            if (current_size == 0) {\r
+                Py_DECREF(chunks);\r
+                return data;\r
+            }\r
+            else {\r
+                res = _PyBytes_Join(_PyIO_empty_bytes, chunks);\r
+                Py_DECREF(data);\r
+                Py_DECREF(chunks);\r
+                return res;\r
+            }\r
+        }\r
+        current_size += PyBytes_GET_SIZE(data);\r
+        if (self->abs_pos != -1)\r
+            self->abs_pos += PyBytes_GET_SIZE(data);\r
+    }\r
+}\r
+\r
+/* Read n bytes from the buffer if it can, otherwise return None.\r
+   This function is simple enough that it can run unlocked. */\r
+static PyObject *\r
+_bufferedreader_read_fast(buffered *self, Py_ssize_t n)\r
+{\r
+    Py_ssize_t current_size;\r
+\r
+    current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    if (n <= current_size) {\r
+        /* Fast path: the data to read is fully buffered. */\r
+        PyObject *res = PyBytes_FromStringAndSize(self->buffer + self->pos, n);\r
+        if (res != NULL)\r
+            self->pos += n;\r
+        return res;\r
+    }\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+/* Generic read function: read from the stream until enough bytes are read,\r
+ * or until an EOF occurs or until read() would block.\r
+ */\r
+static PyObject *\r
+_bufferedreader_read_generic(buffered *self, Py_ssize_t n)\r
+{\r
+    PyObject *res = NULL;\r
+    Py_ssize_t current_size, remaining, written;\r
+    char *out;\r
+\r
+    current_size = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    if (n <= current_size)\r
+        return _bufferedreader_read_fast(self, n);\r
+\r
+    res = PyBytes_FromStringAndSize(NULL, n);\r
+    if (res == NULL)\r
+        goto error;\r
+    out = PyBytes_AS_STRING(res);\r
+    remaining = n;\r
+    written = 0;\r
+    if (current_size > 0) {\r
+        memcpy(out, self->buffer + self->pos, current_size);\r
+        remaining -= current_size;\r
+        written += current_size;\r
+        self->pos += current_size;\r
+    }\r
+    /* Flush the write buffer if necessary */\r
+    if (self->writable) {\r
+        PyObject *r = buffered_flush_and_rewind_unlocked(self);\r
+        if (r == NULL)\r
+            goto error;\r
+        Py_DECREF(r);\r
+    }\r
+    _bufferedreader_reset_buf(self);\r
+    while (remaining > 0) {\r
+        /* We want to read a whole block at the end into buffer.\r
+           If we had readv() we could do this in one pass. */\r
+        Py_ssize_t r = MINUS_LAST_BLOCK(self, remaining);\r
+        if (r == 0)\r
+            break;\r
+        r = _bufferedreader_raw_read(self, out + written, r);\r
+        if (r == -1)\r
+            goto error;\r
+        if (r == 0 || r == -2) {\r
+            /* EOF occurred or read() would block. */\r
+            if (r == 0 || written > 0) {\r
+                if (_PyBytes_Resize(&res, written))\r
+                    goto error;\r
+                return res;\r
+            }\r
+            Py_DECREF(res);\r
+            Py_INCREF(Py_None);\r
+            return Py_None;\r
+        }\r
+        remaining -= r;\r
+        written += r;\r
+    }\r
+    assert(remaining <= self->buffer_size);\r
+    self->pos = 0;\r
+    self->raw_pos = 0;\r
+    self->read_end = 0;\r
+    /* NOTE: when the read is satisfied, we avoid issuing any additional\r
+       reads, which could block indefinitely (e.g. on a socket).\r
+       See issue #9550. */\r
+    while (remaining > 0 && self->read_end < self->buffer_size) {\r
+        Py_ssize_t r = _bufferedreader_fill_buffer(self);\r
+        if (r == -1)\r
+            goto error;\r
+        if (r == 0 || r == -2) {\r
+            /* EOF occurred or read() would block. */\r
+            if (r == 0 || written > 0) {\r
+                if (_PyBytes_Resize(&res, written))\r
+                    goto error;\r
+                return res;\r
+            }\r
+            Py_DECREF(res);\r
+            Py_INCREF(Py_None);\r
+            return Py_None;\r
+        }\r
+        if (remaining > r) {\r
+            memcpy(out + written, self->buffer + self->pos, r);\r
+            written += r;\r
+            self->pos += r;\r
+            remaining -= r;\r
+        }\r
+        else if (remaining > 0) {\r
+            memcpy(out + written, self->buffer + self->pos, remaining);\r
+            written += remaining;\r
+            self->pos += remaining;\r
+            remaining = 0;\r
+        }\r
+        if (remaining == 0)\r
+            break;\r
+    }\r
+\r
+    return res;\r
+\r
+error:\r
+    Py_XDECREF(res);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+_bufferedreader_peek_unlocked(buffered *self, Py_ssize_t n)\r
+{\r
+    Py_ssize_t have, r;\r
+\r
+    have = Py_SAFE_DOWNCAST(READAHEAD(self), Py_off_t, Py_ssize_t);\r
+    /* Constraints:\r
+       1. we don't want to advance the file position.\r
+       2. we don't want to lose block alignment, so we can't shift the buffer\r
+          to make some place.\r
+       Therefore, we either return `have` bytes (if > 0), or a full buffer.\r
+    */\r
+    if (have > 0) {\r
+        return PyBytes_FromStringAndSize(self->buffer + self->pos, have);\r
+    }\r
+\r
+    /* Fill the buffer from the raw stream, and copy it to the result. */\r
+    _bufferedreader_reset_buf(self);\r
+    r = _bufferedreader_fill_buffer(self);\r
+    if (r == -1)\r
+        return NULL;\r
+    if (r == -2)\r
+        r = 0;\r
+    self->pos = 0;\r
+    return PyBytes_FromStringAndSize(self->buffer, r);\r
+}\r
+\r
+static PyMethodDef bufferedreader_methods[] = {\r
+    /* BufferedIOMixin methods */\r
+    {"detach", (PyCFunction)buffered_detach, METH_NOARGS},\r
+    {"flush", (PyCFunction)buffered_simple_flush, METH_NOARGS},\r
+    {"close", (PyCFunction)buffered_close, METH_NOARGS},\r
+    {"seekable", (PyCFunction)buffered_seekable, METH_NOARGS},\r
+    {"readable", (PyCFunction)buffered_readable, METH_NOARGS},\r
+    {"writable", (PyCFunction)buffered_writable, METH_NOARGS},\r
+    {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},\r
+    {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},\r
+\r
+    {"read", (PyCFunction)buffered_read, METH_VARARGS},\r
+    {"peek", (PyCFunction)buffered_peek, METH_VARARGS},\r
+    {"read1", (PyCFunction)buffered_read1, METH_VARARGS},\r
+    {"readline", (PyCFunction)buffered_readline, METH_VARARGS},\r
+    {"seek", (PyCFunction)buffered_seek, METH_VARARGS},\r
+    {"tell", (PyCFunction)buffered_tell, METH_NOARGS},\r
+    {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS},\r
+    {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyMemberDef bufferedreader_members[] = {\r
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef bufferedreader_getset[] = {\r
+    {"closed", (getter)buffered_closed_get, NULL, NULL},\r
+    {"name", (getter)buffered_name_get, NULL, NULL},\r
+    {"mode", (getter)buffered_mode_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+\r
+PyTypeObject PyBufferedReader_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.BufferedReader",       /*tp_name*/\r
+    sizeof(buffered),           /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)buffered_dealloc,     /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    (reprfunc)buffered_repr,    /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+            | Py_TPFLAGS_HAVE_GC, /*tp_flags*/\r
+    bufferedreader_doc,         /* tp_doc */\r
+    (traverseproc)buffered_traverse, /* tp_traverse */\r
+    (inquiry)buffered_clear,    /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(buffered, weakreflist), /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    (iternextfunc)buffered_iternext, /* tp_iternext */\r
+    bufferedreader_methods,     /* tp_methods */\r
+    bufferedreader_members,     /* tp_members */\r
+    bufferedreader_getset,      /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(buffered, dict), /* tp_dictoffset */\r
+    (initproc)bufferedreader_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\f\r
+\r
+\r
+static int\r
+complain_about_max_buffer_size(void)\r
+{\r
+    if (PyErr_WarnEx(PyExc_DeprecationWarning,\r
+                     "max_buffer_size is deprecated", 1) < 0)\r
+        return 0;\r
+    return 1;\r
+}\r
+\r
+/*\r
+ * class BufferedWriter\r
+ */\r
+PyDoc_STRVAR(bufferedwriter_doc,\r
+    "A buffer for a writeable sequential RawIO object.\n"\r
+    "\n"\r
+    "The constructor creates a BufferedWriter for the given writeable raw\n"\r
+    "stream. If the buffer_size is not given, it defaults to\n"\r
+    "DEFAULT_BUFFER_SIZE. max_buffer_size isn't used anymore.\n"\r
+    );\r
+\r
+static void\r
+_bufferedwriter_reset_buf(buffered *self)\r
+{\r
+    self->write_pos = 0;\r
+    self->write_end = -1;\r
+}\r
+\r
+static int\r
+bufferedwriter_init(buffered *self, PyObject *args, PyObject *kwds)\r
+{\r
+    /* TODO: properly deprecate max_buffer_size */\r
+    char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};\r
+    Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;\r
+    Py_ssize_t max_buffer_size = -234;\r
+    PyObject *raw;\r
+\r
+    self->ok = 0;\r
+    self->detached = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|nn:BufferedWriter", kwlist,\r
+                                     &raw, &buffer_size, &max_buffer_size)) {\r
+        return -1;\r
+    }\r
+\r
+    if (max_buffer_size != -234 && !complain_about_max_buffer_size())\r
+        return -1;\r
+\r
+    if (_PyIOBase_check_writable(raw, Py_True) == NULL)\r
+        return -1;\r
+\r
+    Py_CLEAR(self->raw);\r
+    Py_INCREF(raw);\r
+    self->raw = raw;\r
+    self->readable = 0;\r
+    self->writable = 1;\r
+\r
+    self->buffer_size = buffer_size;\r
+    if (_buffered_init(self) < 0)\r
+        return -1;\r
+    _bufferedwriter_reset_buf(self);\r
+    self->pos = 0;\r
+\r
+    self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedWriter_Type &&\r
+                                Py_TYPE(raw) == &PyFileIO_Type);\r
+\r
+    self->ok = 1;\r
+    return 0;\r
+}\r
+\r
+static Py_ssize_t\r
+_bufferedwriter_raw_write(buffered *self, char *start, Py_ssize_t len)\r
+{\r
+    Py_buffer buf;\r
+    PyObject *memobj, *res;\r
+    Py_ssize_t n;\r
+    int errnum;\r
+    /* NOTE: the buffer needn't be released as its object is NULL. */\r
+    if (PyBuffer_FillInfo(&buf, NULL, start, len, 1, PyBUF_CONTIG_RO) == -1)\r
+        return -1;\r
+    memobj = PyMemoryView_FromBuffer(&buf);\r
+    if (memobj == NULL)\r
+        return -1;\r
+    /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals() when EINTR\r
+       occurs so we needn't do it ourselves.\r
+       We then retry writing, ignoring the signal if no handler has\r
+       raised (see issue #10956).\r
+    */\r
+    do {\r
+        errno = 0;\r
+        res = PyObject_CallMethodObjArgs(self->raw, _PyIO_str_write, memobj, NULL);\r
+        errnum = errno;\r
+    } while (res == NULL && _PyIO_trap_eintr());\r
+    Py_DECREF(memobj);\r
+    if (res == NULL)\r
+        return -1;\r
+    if (res == Py_None) {\r
+        /* Non-blocking stream would have blocked. Special return code!\r
+           Being paranoid we reset errno in case it is changed by code\r
+           triggered by a decref.  errno is used by _set_BlockingIOError(). */\r
+        Py_DECREF(res);\r
+        errno = errnum;\r
+        return -2;\r
+    }\r
+    n = PyNumber_AsSsize_t(res, PyExc_ValueError);\r
+    Py_DECREF(res);\r
+    if (n < 0 || n > len) {\r
+        PyErr_Format(PyExc_IOError,\r
+                     "raw write() returned invalid length %zd "\r
+                     "(should have been between 0 and %zd)", n, len);\r
+        return -1;\r
+    }\r
+    if (n > 0 && self->abs_pos != -1)\r
+        self->abs_pos += n;\r
+    return n;\r
+}\r
+\r
+/* `restore_pos` is 1 if we need to restore the raw stream position at\r
+   the end, 0 otherwise. */\r
+static PyObject *\r
+_bufferedwriter_flush_unlocked(buffered *self)\r
+{\r
+    Py_ssize_t written = 0;\r
+    Py_off_t n, rewind;\r
+\r
+    if (!VALID_WRITE_BUFFER(self) || self->write_pos == self->write_end)\r
+        goto end;\r
+    /* First, rewind */\r
+    rewind = RAW_OFFSET(self) + (self->pos - self->write_pos);\r
+    if (rewind != 0) {\r
+        n = _buffered_raw_seek(self, -rewind, 1);\r
+        if (n < 0) {\r
+            goto error;\r
+        }\r
+        self->raw_pos -= rewind;\r
+    }\r
+    while (self->write_pos < self->write_end) {\r
+        n = _bufferedwriter_raw_write(self,\r
+            self->buffer + self->write_pos,\r
+            Py_SAFE_DOWNCAST(self->write_end - self->write_pos,\r
+                             Py_off_t, Py_ssize_t));\r
+        if (n == -1) {\r
+            goto error;\r
+        }\r
+        else if (n == -2) {\r
+            _set_BlockingIOError("write could not complete without blocking",\r
+                                 0);\r
+            goto error;\r
+        }\r
+        self->write_pos += n;\r
+        self->raw_pos = self->write_pos;\r
+        written += Py_SAFE_DOWNCAST(n, Py_off_t, Py_ssize_t);\r
+        /* Partial writes can return successfully when interrupted by a\r
+           signal (see write(2)).  We must run signal handlers before\r
+           blocking another time, possibly indefinitely. */\r
+        if (PyErr_CheckSignals() < 0)\r
+            goto error;\r
+    }\r
+\r
+    _bufferedwriter_reset_buf(self);\r
+\r
+end:\r
+    Py_RETURN_NONE;\r
+\r
+error:\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+bufferedwriter_write(buffered *self, PyObject *args)\r
+{\r
+    PyObject *res = NULL;\r
+    Py_buffer buf;\r
+    Py_ssize_t written, avail, remaining;\r
+    Py_off_t offset;\r
+\r
+    CHECK_INITIALIZED(self)\r
+    if (!PyArg_ParseTuple(args, "s*:write", &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (IS_CLOSED(self)) {\r
+        PyErr_SetString(PyExc_ValueError, "write to closed file");\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    if (!ENTER_BUFFERED(self)) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    /* Fast path: the data to write can be fully buffered. */\r
+    if (!VALID_READ_BUFFER(self) && !VALID_WRITE_BUFFER(self)) {\r
+        self->pos = 0;\r
+        self->raw_pos = 0;\r
+    }\r
+    avail = Py_SAFE_DOWNCAST(self->buffer_size - self->pos, Py_off_t, Py_ssize_t);\r
+    if (buf.len <= avail) {\r
+        memcpy(self->buffer + self->pos, buf.buf, buf.len);\r
+        if (!VALID_WRITE_BUFFER(self) || self->write_pos > self->pos) {\r
+            self->write_pos = self->pos;\r
+        }\r
+        ADJUST_POSITION(self, self->pos + buf.len);\r
+        if (self->pos > self->write_end)\r
+            self->write_end = self->pos;\r
+        written = buf.len;\r
+        goto end;\r
+    }\r
+\r
+    /* First write the current buffer */\r
+    res = _bufferedwriter_flush_unlocked(self);\r
+    if (res == NULL) {\r
+        Py_ssize_t *w = _buffered_check_blocking_error();\r
+        if (w == NULL)\r
+            goto error;\r
+        if (self->readable)\r
+            _bufferedreader_reset_buf(self);\r
+        /* Make some place by shifting the buffer. */\r
+        assert(VALID_WRITE_BUFFER(self));\r
+        memmove(self->buffer, self->buffer + self->write_pos,\r
+                Py_SAFE_DOWNCAST(self->write_end - self->write_pos,\r
+                                 Py_off_t, Py_ssize_t));\r
+        self->write_end -= self->write_pos;\r
+        self->raw_pos -= self->write_pos;\r
+        self->pos -= self->write_pos;\r
+        self->write_pos = 0;\r
+        avail = Py_SAFE_DOWNCAST(self->buffer_size - self->write_end,\r
+                                 Py_off_t, Py_ssize_t);\r
+        if (buf.len <= avail) {\r
+            /* Everything can be buffered */\r
+            PyErr_Clear();\r
+            memcpy(self->buffer + self->write_end, buf.buf, buf.len);\r
+            self->write_end += buf.len;\r
+            self->pos += buf.len;\r
+            written = buf.len;\r
+            goto end;\r
+        }\r
+        /* Buffer as much as possible. */\r
+        memcpy(self->buffer + self->write_end, buf.buf, avail);\r
+        self->write_end += avail;\r
+        self->pos += avail;\r
+        /* XXX Modifying the existing exception e using the pointer w\r
+           will change e.characters_written but not e.args[2].\r
+           Therefore we just replace with a new error. */\r
+        _set_BlockingIOError("write could not complete without blocking",\r
+                             avail);\r
+        goto error;\r
+    }\r
+    Py_CLEAR(res);\r
+\r
+    /* Adjust the raw stream position if it is away from the logical stream\r
+       position. This happens if the read buffer has been filled but not\r
+       modified (and therefore _bufferedwriter_flush_unlocked() didn't rewind\r
+       the raw stream by itself).\r
+       Fixes issue #6629.\r
+    */\r
+    offset = RAW_OFFSET(self);\r
+    if (offset != 0) {\r
+        if (_buffered_raw_seek(self, -offset, 1) < 0)\r
+            goto error;\r
+        self->raw_pos -= offset;\r
+    }\r
+\r
+    /* Then write buf itself. At this point the buffer has been emptied. */\r
+    remaining = buf.len;\r
+    written = 0;\r
+    while (remaining > self->buffer_size) {\r
+        Py_ssize_t n = _bufferedwriter_raw_write(\r
+            self, (char *) buf.buf + written, buf.len - written);\r
+        if (n == -1) {\r
+            goto error;\r
+        } else if (n == -2) {\r
+            /* Write failed because raw file is non-blocking */\r
+            if (remaining > self->buffer_size) {\r
+                /* Can't buffer everything, still buffer as much as possible */\r
+                memcpy(self->buffer,\r
+                       (char *) buf.buf + written, self->buffer_size);\r
+                self->raw_pos = 0;\r
+                ADJUST_POSITION(self, self->buffer_size);\r
+                self->write_end = self->buffer_size;\r
+                written += self->buffer_size;\r
+                _set_BlockingIOError("write could not complete without "\r
+                                     "blocking", written);\r
+                goto error;\r
+            }\r
+            PyErr_Clear();\r
+            break;\r
+        }\r
+        written += n;\r
+        remaining -= n;\r
+        /* Partial writes can return successfully when interrupted by a\r
+           signal (see write(2)).  We must run signal handlers before\r
+           blocking another time, possibly indefinitely. */\r
+        if (PyErr_CheckSignals() < 0)\r
+            goto error;\r
+    }\r
+    if (self->readable)\r
+        _bufferedreader_reset_buf(self);\r
+    if (remaining > 0) {\r
+        memcpy(self->buffer, (char *) buf.buf + written, remaining);\r
+        written += remaining;\r
+    }\r
+    self->write_pos = 0;\r
+    /* TODO: sanity check (remaining >= 0) */\r
+    self->write_end = remaining;\r
+    ADJUST_POSITION(self, remaining);\r
+    self->raw_pos = 0;\r
+\r
+end:\r
+    res = PyLong_FromSsize_t(written);\r
+\r
+error:\r
+    LEAVE_BUFFERED(self)\r
+    PyBuffer_Release(&buf);\r
+    return res;\r
+}\r
+\r
+static PyMethodDef bufferedwriter_methods[] = {\r
+    /* BufferedIOMixin methods */\r
+    {"close", (PyCFunction)buffered_close, METH_NOARGS},\r
+    {"detach", (PyCFunction)buffered_detach, METH_NOARGS},\r
+    {"seekable", (PyCFunction)buffered_seekable, METH_NOARGS},\r
+    {"readable", (PyCFunction)buffered_readable, METH_NOARGS},\r
+    {"writable", (PyCFunction)buffered_writable, METH_NOARGS},\r
+    {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},\r
+    {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},\r
+\r
+    {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS},\r
+    {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS},\r
+    {"flush", (PyCFunction)buffered_flush, METH_NOARGS},\r
+    {"seek", (PyCFunction)buffered_seek, METH_VARARGS},\r
+    {"tell", (PyCFunction)buffered_tell, METH_NOARGS},\r
+    {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyMemberDef bufferedwriter_members[] = {\r
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef bufferedwriter_getset[] = {\r
+    {"closed", (getter)buffered_closed_get, NULL, NULL},\r
+    {"name", (getter)buffered_name_get, NULL, NULL},\r
+    {"mode", (getter)buffered_mode_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+\r
+PyTypeObject PyBufferedWriter_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.BufferedWriter",       /*tp_name*/\r
+    sizeof(buffered),           /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)buffered_dealloc,     /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    (reprfunc)buffered_repr,    /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+        | Py_TPFLAGS_HAVE_GC,   /*tp_flags*/\r
+    bufferedwriter_doc,         /* tp_doc */\r
+    (traverseproc)buffered_traverse, /* tp_traverse */\r
+    (inquiry)buffered_clear,    /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(buffered, weakreflist), /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    bufferedwriter_methods,     /* tp_methods */\r
+    bufferedwriter_members,     /* tp_members */\r
+    bufferedwriter_getset,      /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(buffered, dict),   /* tp_dictoffset */\r
+    (initproc)bufferedwriter_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\f\r
+\r
+\r
+/*\r
+ * BufferedRWPair\r
+ */\r
+\r
+PyDoc_STRVAR(bufferedrwpair_doc,\r
+    "A buffered reader and writer object together.\n"\r
+    "\n"\r
+    "A buffered reader object and buffered writer object put together to\n"\r
+    "form a sequential IO object that can read and write. This is typically\n"\r
+    "used with a socket or two-way pipe.\n"\r
+    "\n"\r
+    "reader and writer are RawIOBase objects that are readable and\n"\r
+    "writeable respectively. If the buffer_size is omitted it defaults to\n"\r
+    "DEFAULT_BUFFER_SIZE.\n"\r
+    );\r
+\r
+/* XXX The usefulness of this (compared to having two separate IO objects) is\r
+ * questionable.\r
+ */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    buffered *reader;\r
+    buffered *writer;\r
+    PyObject *dict;\r
+    PyObject *weakreflist;\r
+} rwpair;\r
+\r
+static int\r
+bufferedrwpair_init(rwpair *self, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *reader, *writer;\r
+    Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;\r
+    Py_ssize_t max_buffer_size = -234;\r
+\r
+    if (!PyArg_ParseTuple(args, "OO|nn:BufferedRWPair", &reader, &writer,\r
+                          &buffer_size, &max_buffer_size)) {\r
+        return -1;\r
+    }\r
+\r
+    if (max_buffer_size != -234 && !complain_about_max_buffer_size())\r
+        return -1;\r
+\r
+    if (_PyIOBase_check_readable(reader, Py_True) == NULL)\r
+        return -1;\r
+    if (_PyIOBase_check_writable(writer, Py_True) == NULL)\r
+        return -1;\r
+\r
+    self->reader = (buffered *) PyObject_CallFunction(\r
+            (PyObject *) &PyBufferedReader_Type, "On", reader, buffer_size);\r
+    if (self->reader == NULL)\r
+        return -1;\r
+\r
+    self->writer = (buffered *) PyObject_CallFunction(\r
+            (PyObject *) &PyBufferedWriter_Type, "On", writer, buffer_size);\r
+    if (self->writer == NULL) {\r
+        Py_CLEAR(self->reader);\r
+        return -1;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+bufferedrwpair_traverse(rwpair *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+bufferedrwpair_clear(rwpair *self)\r
+{\r
+    Py_CLEAR(self->reader);\r
+    Py_CLEAR(self->writer);\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+static void\r
+bufferedrwpair_dealloc(rwpair *self)\r
+{\r
+    _PyObject_GC_UNTRACK(self);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *)self);\r
+    Py_CLEAR(self->reader);\r
+    Py_CLEAR(self->writer);\r
+    Py_CLEAR(self->dict);\r
+    Py_TYPE(self)->tp_free((PyObject *) self);\r
+}\r
+\r
+static PyObject *\r
+_forward_call(buffered *self, const char *name, PyObject *args)\r
+{\r
+    PyObject *func, *ret;\r
+    if (self == NULL) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "I/O operation on uninitialized object");\r
+        return NULL;\r
+    }\r
+\r
+    func = PyObject_GetAttrString((PyObject *)self, name);\r
+    if (func == NULL) {\r
+        PyErr_SetString(PyExc_AttributeError, name);\r
+        return NULL;\r
+    }\r
+\r
+    ret = PyObject_CallObject(func, args);\r
+    Py_DECREF(func);\r
+    return ret;\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_read(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->reader, "read", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_peek(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->reader, "peek", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_read1(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->reader, "read1", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_readinto(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->reader, "readinto", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_write(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->writer, "write", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_flush(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->writer, "flush", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_readable(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->reader, "readable", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_writable(rwpair *self, PyObject *args)\r
+{\r
+    return _forward_call(self->writer, "writable", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_close(rwpair *self, PyObject *args)\r
+{\r
+    PyObject *exc = NULL, *val, *tb;\r
+    PyObject *ret = _forward_call(self->writer, "close", args);\r
+    if (ret == NULL)\r
+        PyErr_Fetch(&exc, &val, &tb);\r
+    else\r
+        Py_DECREF(ret);\r
+    ret = _forward_call(self->reader, "close", args);\r
+    if (exc != NULL) {\r
+        if (ret != NULL) {\r
+            Py_CLEAR(ret);\r
+            PyErr_Restore(exc, val, tb);\r
+        }\r
+        else {\r
+            Py_DECREF(exc);\r
+            Py_XDECREF(val);\r
+            Py_XDECREF(tb);\r
+        }\r
+    }\r
+    return ret;\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_isatty(rwpair *self, PyObject *args)\r
+{\r
+    PyObject *ret = _forward_call(self->writer, "isatty", args);\r
+\r
+    if (ret != Py_False) {\r
+        /* either True or exception */\r
+        return ret;\r
+    }\r
+    Py_DECREF(ret);\r
+\r
+    return _forward_call(self->reader, "isatty", args);\r
+}\r
+\r
+static PyObject *\r
+bufferedrwpair_closed_get(rwpair *self, void *context)\r
+{\r
+    if (self->writer == NULL) {\r
+        PyErr_SetString(PyExc_RuntimeError,\r
+                "the BufferedRWPair object is being garbage-collected");\r
+        return NULL;\r
+    }\r
+    return PyObject_GetAttr((PyObject *) self->writer, _PyIO_str_closed);\r
+}\r
+\r
+static PyMethodDef bufferedrwpair_methods[] = {\r
+    {"read", (PyCFunction)bufferedrwpair_read, METH_VARARGS},\r
+    {"peek", (PyCFunction)bufferedrwpair_peek, METH_VARARGS},\r
+    {"read1", (PyCFunction)bufferedrwpair_read1, METH_VARARGS},\r
+    {"readinto", (PyCFunction)bufferedrwpair_readinto, METH_VARARGS},\r
+\r
+    {"write", (PyCFunction)bufferedrwpair_write, METH_VARARGS},\r
+    {"flush", (PyCFunction)bufferedrwpair_flush, METH_NOARGS},\r
+\r
+    {"readable", (PyCFunction)bufferedrwpair_readable, METH_NOARGS},\r
+    {"writable", (PyCFunction)bufferedrwpair_writable, METH_NOARGS},\r
+\r
+    {"close", (PyCFunction)bufferedrwpair_close, METH_NOARGS},\r
+    {"isatty", (PyCFunction)bufferedrwpair_isatty, METH_NOARGS},\r
+\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyGetSetDef bufferedrwpair_getset[] = {\r
+    {"closed", (getter)bufferedrwpair_closed_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+PyTypeObject PyBufferedRWPair_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.BufferedRWPair",       /*tp_name*/\r
+    sizeof(rwpair),            /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)bufferedrwpair_dealloc,     /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+        | Py_TPFLAGS_HAVE_GC,   /* tp_flags */\r
+    bufferedrwpair_doc,         /* tp_doc */\r
+    (traverseproc)bufferedrwpair_traverse, /* tp_traverse */\r
+    (inquiry)bufferedrwpair_clear, /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(rwpair, weakreflist), /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    bufferedrwpair_methods,     /* tp_methods */\r
+    0,                          /* tp_members */\r
+    bufferedrwpair_getset,      /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(rwpair, dict),     /* tp_dictoffset */\r
+    (initproc)bufferedrwpair_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\f\r
+\r
+\r
+/*\r
+ * BufferedRandom\r
+ */\r
+\r
+PyDoc_STRVAR(bufferedrandom_doc,\r
+    "A buffered interface to random access streams.\n"\r
+    "\n"\r
+    "The constructor creates a reader and writer for a seekable stream,\n"\r
+    "raw, given in the first argument. If the buffer_size is omitted it\n"\r
+    "defaults to DEFAULT_BUFFER_SIZE. max_buffer_size isn't used anymore.\n"\r
+    );\r
+\r
+static int\r
+bufferedrandom_init(buffered *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"raw", "buffer_size", "max_buffer_size", NULL};\r
+    Py_ssize_t buffer_size = DEFAULT_BUFFER_SIZE;\r
+    Py_ssize_t max_buffer_size = -234;\r
+    PyObject *raw;\r
+\r
+    self->ok = 0;\r
+    self->detached = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|nn:BufferedRandom", kwlist,\r
+                                     &raw, &buffer_size, &max_buffer_size)) {\r
+        return -1;\r
+    }\r
+\r
+    if (max_buffer_size != -234 && !complain_about_max_buffer_size())\r
+        return -1;\r
+\r
+    if (_PyIOBase_check_seekable(raw, Py_True) == NULL)\r
+        return -1;\r
+    if (_PyIOBase_check_readable(raw, Py_True) == NULL)\r
+        return -1;\r
+    if (_PyIOBase_check_writable(raw, Py_True) == NULL)\r
+        return -1;\r
+\r
+    Py_CLEAR(self->raw);\r
+    Py_INCREF(raw);\r
+    self->raw = raw;\r
+    self->buffer_size = buffer_size;\r
+    self->readable = 1;\r
+    self->writable = 1;\r
+\r
+    if (_buffered_init(self) < 0)\r
+        return -1;\r
+    _bufferedreader_reset_buf(self);\r
+    _bufferedwriter_reset_buf(self);\r
+    self->pos = 0;\r
+\r
+    self->fast_closed_checks = (Py_TYPE(self) == &PyBufferedRandom_Type &&\r
+                                Py_TYPE(raw) == &PyFileIO_Type);\r
+\r
+    self->ok = 1;\r
+    return 0;\r
+}\r
+\r
+static PyMethodDef bufferedrandom_methods[] = {\r
+    /* BufferedIOMixin methods */\r
+    {"close", (PyCFunction)buffered_close, METH_NOARGS},\r
+    {"detach", (PyCFunction)buffered_detach, METH_NOARGS},\r
+    {"seekable", (PyCFunction)buffered_seekable, METH_NOARGS},\r
+    {"readable", (PyCFunction)buffered_readable, METH_NOARGS},\r
+    {"writable", (PyCFunction)buffered_writable, METH_NOARGS},\r
+    {"fileno", (PyCFunction)buffered_fileno, METH_NOARGS},\r
+    {"isatty", (PyCFunction)buffered_isatty, METH_NOARGS},\r
+\r
+    {"flush", (PyCFunction)buffered_flush, METH_NOARGS},\r
+\r
+    {"seek", (PyCFunction)buffered_seek, METH_VARARGS},\r
+    {"tell", (PyCFunction)buffered_tell, METH_NOARGS},\r
+    {"truncate", (PyCFunction)buffered_truncate, METH_VARARGS},\r
+    {"read", (PyCFunction)buffered_read, METH_VARARGS},\r
+    {"read1", (PyCFunction)buffered_read1, METH_VARARGS},\r
+    {"readinto", (PyCFunction)buffered_readinto, METH_VARARGS},\r
+    {"readline", (PyCFunction)buffered_readline, METH_VARARGS},\r
+    {"peek", (PyCFunction)buffered_peek, METH_VARARGS},\r
+    {"write", (PyCFunction)bufferedwriter_write, METH_VARARGS},\r
+    {"__sizeof__", (PyCFunction)buffered_sizeof, METH_NOARGS},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyMemberDef bufferedrandom_members[] = {\r
+    {"raw", T_OBJECT, offsetof(buffered, raw), READONLY},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef bufferedrandom_getset[] = {\r
+    {"closed", (getter)buffered_closed_get, NULL, NULL},\r
+    {"name", (getter)buffered_name_get, NULL, NULL},\r
+    {"mode", (getter)buffered_mode_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+\r
+PyTypeObject PyBufferedRandom_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.BufferedRandom",       /*tp_name*/\r
+    sizeof(buffered),           /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)buffered_dealloc,     /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    (reprfunc)buffered_repr,    /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+        | Py_TPFLAGS_HAVE_GC,   /*tp_flags*/\r
+    bufferedrandom_doc,         /* tp_doc */\r
+    (traverseproc)buffered_traverse, /* tp_traverse */\r
+    (inquiry)buffered_clear,    /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(buffered, weakreflist), /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    (iternextfunc)buffered_iternext, /* tp_iternext */\r
+    bufferedrandom_methods,     /* tp_methods */\r
+    bufferedrandom_members,     /* tp_members */\r
+    bufferedrandom_getset,      /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /*tp_dict*/\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(buffered, dict), /*tp_dictoffset*/\r
+    (initproc)bufferedrandom_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bytesio.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/bytesio.c
new file mode 100644 (file)
index 0000000..36cfb76
--- /dev/null
@@ -0,0 +1,909 @@
+#include "Python.h"\r
+#include "structmember.h"       /* for offsetof() */\r
+#include "_iomodule.h"\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    char *buf;\r
+    Py_ssize_t pos;\r
+    Py_ssize_t string_size;\r
+    size_t buf_size;\r
+    PyObject *dict;\r
+    PyObject *weakreflist;\r
+} bytesio;\r
+\r
+#define CHECK_CLOSED(self)                                  \\r
+    if ((self)->buf == NULL) {                              \\r
+        PyErr_SetString(PyExc_ValueError,                   \\r
+                        "I/O operation on closed file.");   \\r
+        return NULL;                                        \\r
+    }\r
+\r
+/* Internal routine to get a line from the buffer of a BytesIO\r
+   object. Returns the length between the current position to the\r
+   next newline character. */\r
+static Py_ssize_t\r
+get_line(bytesio *self, char **output)\r
+{\r
+    char *n;\r
+    const char *str_end;\r
+    Py_ssize_t len;\r
+\r
+    assert(self->buf != NULL);\r
+\r
+    /* Move to the end of the line, up to the end of the string, s. */\r
+    str_end = self->buf + self->string_size;\r
+    for (n = self->buf + self->pos;\r
+         n < str_end && *n != '\n';\r
+         n++);\r
+\r
+    /* Skip the newline character */\r
+    if (n < str_end)\r
+        n++;\r
+\r
+    /* Get the length from the current position to the end of the line. */\r
+    len = n - (self->buf + self->pos);\r
+    *output = self->buf + self->pos;\r
+\r
+    assert(len >= 0);\r
+    assert(self->pos < PY_SSIZE_T_MAX - len);\r
+    self->pos += len;\r
+\r
+    return len;\r
+}\r
+\r
+/* Internal routine for changing the size of the buffer of BytesIO objects.\r
+   The caller should ensure that the 'size' argument is non-negative.  Returns\r
+   0 on success, -1 otherwise. */\r
+static int\r
+resize_buffer(bytesio *self, size_t size)\r
+{\r
+    /* Here, unsigned types are used to avoid dealing with signed integer\r
+       overflow, which is undefined in C. */\r
+    size_t alloc = self->buf_size;\r
+    char *new_buf = NULL;\r
+\r
+    assert(self->buf != NULL);\r
+\r
+    /* For simplicity, stay in the range of the signed type. Anyway, Python\r
+       doesn't allow strings to be longer than this. */\r
+    if (size > PY_SSIZE_T_MAX)\r
+        goto overflow;\r
+\r
+    if (size < alloc / 2) {\r
+        /* Major downsize; resize down to exact size. */\r
+        alloc = size + 1;\r
+    }\r
+    else if (size < alloc) {\r
+        /* Within allocated size; quick exit */\r
+        return 0;\r
+    }\r
+    else if (size <= alloc * 1.125) {\r
+        /* Moderate upsize; overallocate similar to list_resize() */\r
+        alloc = size + (size >> 3) + (size < 9 ? 3 : 6);\r
+    }\r
+    else {\r
+        /* Major upsize; resize up to exact size */\r
+        alloc = size + 1;\r
+    }\r
+\r
+    if (alloc > ((size_t)-1) / sizeof(char))\r
+        goto overflow;\r
+    new_buf = (char *)PyMem_Realloc(self->buf, alloc * sizeof(char));\r
+    if (new_buf == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    self->buf_size = alloc;\r
+    self->buf = new_buf;\r
+\r
+    return 0;\r
+\r
+  overflow:\r
+    PyErr_SetString(PyExc_OverflowError,\r
+                    "new buffer size too large");\r
+    return -1;\r
+}\r
+\r
+/* Internal routine for writing a string of bytes to the buffer of a BytesIO\r
+   object. Returns the number of bytes written, or -1 on error. */\r
+static Py_ssize_t\r
+write_bytes(bytesio *self, const char *bytes, Py_ssize_t len)\r
+{\r
+    assert(self->buf != NULL);\r
+    assert(self->pos >= 0);\r
+    assert(len >= 0);\r
+\r
+    if ((size_t)self->pos + len > self->buf_size) {\r
+        if (resize_buffer(self, (size_t)self->pos + len) < 0)\r
+            return -1;\r
+    }\r
+\r
+    if (self->pos > self->string_size) {\r
+        /* In case of overseek, pad with null bytes the buffer region between\r
+           the end of stream and the current position.\r
+\r
+          0   lo      string_size                           hi\r
+          |   |<---used--->|<----------available----------->|\r
+          |   |            <--to pad-->|<---to write--->    |\r
+          0   buf                   position\r
+        */\r
+        memset(self->buf + self->string_size, '\0',\r
+               (self->pos - self->string_size) * sizeof(char));\r
+    }\r
+\r
+    /* Copy the data to the internal buffer, overwriting some of the existing\r
+       data if self->pos < self->string_size. */\r
+    memcpy(self->buf + self->pos, bytes, len);\r
+    self->pos += len;\r
+\r
+    /* Set the new length of the internal string if it has changed. */\r
+    if (self->string_size < self->pos) {\r
+        self->string_size = self->pos;\r
+    }\r
+\r
+    return len;\r
+}\r
+\r
+static PyObject *\r
+bytesio_get_closed(bytesio *self)\r
+{\r
+    if (self->buf == NULL) {\r
+        Py_RETURN_TRUE;\r
+    }\r
+    else {\r
+        Py_RETURN_FALSE;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(readable_doc,\r
+"readable() -> bool. Returns True if the IO object can be read.");\r
+\r
+PyDoc_STRVAR(writable_doc,\r
+"writable() -> bool. Returns True if the IO object can be written.");\r
+\r
+PyDoc_STRVAR(seekable_doc,\r
+"seekable() -> bool. Returns True if the IO object can be seeked.");\r
+\r
+/* Generic getter for the writable, readable and seekable properties */\r
+static PyObject *\r
+return_not_closed(bytesio *self)\r
+{\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_TRUE;\r
+}\r
+\r
+PyDoc_STRVAR(flush_doc,\r
+"flush() -> None.  Does nothing.");\r
+\r
+static PyObject *\r
+bytesio_flush(bytesio *self)\r
+{\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(getval_doc,\r
+"getvalue() -> bytes.\n"\r
+"\n"\r
+"Retrieve the entire contents of the BytesIO object.");\r
+\r
+static PyObject *\r
+bytesio_getvalue(bytesio *self)\r
+{\r
+    CHECK_CLOSED(self);\r
+    return PyBytes_FromStringAndSize(self->buf, self->string_size);\r
+}\r
+\r
+PyDoc_STRVAR(isatty_doc,\r
+"isatty() -> False.\n"\r
+"\n"\r
+"Always returns False since BytesIO objects are not connected\n"\r
+"to a tty-like device.");\r
+\r
+static PyObject *\r
+bytesio_isatty(bytesio *self)\r
+{\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+PyDoc_STRVAR(tell_doc,\r
+"tell() -> current file position, an integer\n");\r
+\r
+static PyObject *\r
+bytesio_tell(bytesio *self)\r
+{\r
+    CHECK_CLOSED(self);\r
+    return PyLong_FromSsize_t(self->pos);\r
+}\r
+\r
+PyDoc_STRVAR(read_doc,\r
+"read([size]) -> read at most size bytes, returned as a string.\n"\r
+"\n"\r
+"If the size argument is negative, read until EOF is reached.\n"\r
+"Return an empty string at EOF.");\r
+\r
+static PyObject *\r
+bytesio_read(bytesio *self, PyObject *args)\r
+{\r
+    Py_ssize_t size, n;\r
+    char *output;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "|O:read", &arg))\r
+        return NULL;\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        size = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (size == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* Read until EOF is reached, by default. */\r
+        size = -1;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    /* adjust invalid sizes */\r
+    n = self->string_size - self->pos;\r
+    if (size < 0 || size > n) {\r
+        size = n;\r
+        if (size < 0)\r
+            size = 0;\r
+    }\r
+\r
+    assert(self->buf != NULL);\r
+    output = self->buf + self->pos;\r
+    self->pos += size;\r
+\r
+    return PyBytes_FromStringAndSize(output, size);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(read1_doc,\r
+"read1(size) -> read at most size bytes, returned as a string.\n"\r
+"\n"\r
+"If the size argument is negative or omitted, read until EOF is reached.\n"\r
+"Return an empty string at EOF.");\r
+\r
+static PyObject *\r
+bytesio_read1(bytesio *self, PyObject *n)\r
+{\r
+    PyObject *arg, *res;\r
+\r
+    arg = PyTuple_Pack(1, n);\r
+    if (arg == NULL)\r
+        return NULL;\r
+    res  = bytesio_read(self, arg);\r
+    Py_DECREF(arg);\r
+    return res;\r
+}\r
+\r
+PyDoc_STRVAR(readline_doc,\r
+"readline([size]) -> next line from the file, as a string.\n"\r
+"\n"\r
+"Retain newline.  A non-negative size argument limits the maximum\n"\r
+"number of bytes to return (an incomplete line may be returned then).\n"\r
+"Return an empty string at EOF.\n");\r
+\r
+static PyObject *\r
+bytesio_readline(bytesio *self, PyObject *args)\r
+{\r
+    Py_ssize_t size, n;\r
+    char *output;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "|O:readline", &arg))\r
+        return NULL;\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        size = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (size == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* No size limit, by default. */\r
+        size = -1;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    n = get_line(self, &output);\r
+\r
+    if (size >= 0 && size < n) {\r
+        size = n - size;\r
+        n -= size;\r
+        self->pos -= size;\r
+    }\r
+\r
+    return PyBytes_FromStringAndSize(output, n);\r
+}\r
+\r
+PyDoc_STRVAR(readlines_doc,\r
+"readlines([size]) -> list of strings, each a line from the file.\n"\r
+"\n"\r
+"Call readline() repeatedly and return a list of the lines so read.\n"\r
+"The optional size argument, if given, is an approximate bound on the\n"\r
+"total number of bytes in the lines returned.\n");\r
+\r
+static PyObject *\r
+bytesio_readlines(bytesio *self, PyObject *args)\r
+{\r
+    Py_ssize_t maxsize, size, n;\r
+    PyObject *result, *line;\r
+    char *output;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "|O:readlines", &arg))\r
+        return NULL;\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        maxsize = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (maxsize == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* No size limit, by default. */\r
+        maxsize = -1;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    size = 0;\r
+    result = PyList_New(0);\r
+    if (!result)\r
+        return NULL;\r
+\r
+    while ((n = get_line(self, &output)) != 0) {\r
+        line = PyBytes_FromStringAndSize(output, n);\r
+        if (!line)\r
+            goto on_error;\r
+        if (PyList_Append(result, line) == -1) {\r
+            Py_DECREF(line);\r
+            goto on_error;\r
+        }\r
+        Py_DECREF(line);\r
+        size += n;\r
+        if (maxsize > 0 && size >= maxsize)\r
+            break;\r
+    }\r
+    return result;\r
+\r
+  on_error:\r
+    Py_DECREF(result);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(readinto_doc,\r
+"readinto(bytearray) -> int.  Read up to len(b) bytes into b.\n"\r
+"\n"\r
+"Returns number of bytes read (0 for EOF), or None if the object\n"\r
+"is set not to block as has no data to read.");\r
+\r
+static PyObject *\r
+bytesio_readinto(bytesio *self, PyObject *args)\r
+{\r
+    Py_buffer buf;\r
+    Py_ssize_t len, n;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "w*", &buf))\r
+        return NULL;\r
+\r
+    len = buf.len;\r
+    /* adjust invalid sizes */\r
+    n = self->string_size - self->pos;\r
+    if (len > n) {\r
+        len = n;\r
+        if (len < 0)\r
+            len = 0;\r
+    }\r
+\r
+    memcpy(buf.buf, self->buf + self->pos, len);\r
+    assert(self->pos + len < PY_SSIZE_T_MAX);\r
+    assert(len >= 0);\r
+    self->pos += len;\r
+\r
+    PyBuffer_Release(&buf);\r
+    return PyLong_FromSsize_t(len);\r
+}\r
+\r
+PyDoc_STRVAR(truncate_doc,\r
+"truncate([size]) -> int.  Truncate the file to at most size bytes.\n"\r
+"\n"\r
+"Size defaults to the current file position, as returned by tell().\n"\r
+"The current file position is unchanged.  Returns the new size.\n");\r
+\r
+static PyObject *\r
+bytesio_truncate(bytesio *self, PyObject *args)\r
+{\r
+    Py_ssize_t size;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "|O:truncate", &arg))\r
+        return NULL;\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        size = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (size == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* Truncate to current position if no argument is passed. */\r
+        size = self->pos;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    if (size < 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "negative size value %zd", size);\r
+        return NULL;\r
+    }\r
+\r
+    if (size < self->string_size) {\r
+        self->string_size = size;\r
+        if (resize_buffer(self, size) < 0)\r
+            return NULL;\r
+    }\r
+\r
+    return PyLong_FromSsize_t(size);\r
+}\r
+\r
+static PyObject *\r
+bytesio_iternext(bytesio *self)\r
+{\r
+    char *next;\r
+    Py_ssize_t n;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    n = get_line(self, &next);\r
+\r
+    if (!next || n == 0)\r
+        return NULL;\r
+\r
+    return PyBytes_FromStringAndSize(next, n);\r
+}\r
+\r
+PyDoc_STRVAR(seek_doc,\r
+"seek(pos, whence=0) -> int.  Change stream position.\n"\r
+"\n"\r
+"Seek to byte offset pos relative to position indicated by whence:\n"\r
+"     0  Start of stream (the default).  pos should be >= 0;\n"\r
+"     1  Current position - pos may be negative;\n"\r
+"     2  End of stream - pos usually negative.\n"\r
+"Returns the new absolute position.");\r
+\r
+static PyObject *\r
+bytesio_seek(bytesio *self, PyObject *args)\r
+{\r
+    PyObject *posobj;\r
+    Py_ssize_t pos;\r
+    int mode = 0;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "O|i:seek", &posobj, &mode))\r
+        return NULL;\r
+\r
+    pos = PyNumber_AsSsize_t(posobj, PyExc_OverflowError);\r
+    if (pos == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    \r
+    if (pos < 0 && mode == 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "negative seek value %zd", pos);\r
+        return NULL;\r
+    }\r
+\r
+    /* mode 0: offset relative to beginning of the string.\r
+       mode 1: offset relative to current position.\r
+       mode 2: offset relative the end of the string. */\r
+    if (mode == 1) {\r
+        if (pos > PY_SSIZE_T_MAX - self->pos) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                            "new position too large");\r
+            return NULL;\r
+        }\r
+        pos += self->pos;\r
+    }\r
+    else if (mode == 2) {\r
+        if (pos > PY_SSIZE_T_MAX - self->string_size) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                            "new position too large");\r
+            return NULL;\r
+        }\r
+        pos += self->string_size;\r
+    }\r
+    else if (mode != 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "invalid whence (%i, should be 0, 1 or 2)", mode);\r
+        return NULL;\r
+    }\r
+\r
+    if (pos < 0)\r
+        pos = 0;\r
+    self->pos = pos;\r
+\r
+    return PyLong_FromSsize_t(self->pos);\r
+}\r
+\r
+PyDoc_STRVAR(write_doc,\r
+"write(bytes) -> int.  Write bytes to file.\n"\r
+"\n"\r
+"Return the number of bytes written.");\r
+\r
+static PyObject *\r
+bytesio_write(bytesio *self, PyObject *obj)\r
+{\r
+    Py_ssize_t n = 0;\r
+    Py_buffer buf;\r
+    PyObject *result = NULL;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (PyObject_GetBuffer(obj, &buf, PyBUF_CONTIG_RO) < 0)\r
+        return NULL;\r
+\r
+    if (buf.len != 0)\r
+        n = write_bytes(self, buf.buf, buf.len);\r
+    if (n >= 0)\r
+        result = PyLong_FromSsize_t(n);\r
+\r
+    PyBuffer_Release(&buf);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(writelines_doc,\r
+"writelines(sequence_of_strings) -> None.  Write strings to the file.\n"\r
+"\n"\r
+"Note that newlines are not added.  The sequence can be any iterable\n"\r
+"object producing strings. This is equivalent to calling write() for\n"\r
+"each string.");\r
+\r
+static PyObject *\r
+bytesio_writelines(bytesio *self, PyObject *v)\r
+{\r
+    PyObject *it, *item;\r
+    PyObject *ret;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    it = PyObject_GetIter(v);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    while ((item = PyIter_Next(it)) != NULL) {\r
+        ret = bytesio_write(self, item);\r
+        Py_DECREF(item);\r
+        if (ret == NULL) {\r
+            Py_DECREF(it);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(ret);\r
+    }\r
+    Py_DECREF(it);\r
+\r
+    /* See if PyIter_Next failed */\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(close_doc,\r
+"close() -> None.  Disable all I/O operations.");\r
+\r
+static PyObject *\r
+bytesio_close(bytesio *self)\r
+{\r
+    if (self->buf != NULL) {\r
+        PyMem_Free(self->buf);\r
+        self->buf = NULL;\r
+    }\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+/* Pickling support.\r
+\r
+   Note that only pickle protocol 2 and onward are supported since we use\r
+   extended __reduce__ API of PEP 307 to make BytesIO instances picklable.\r
+\r
+   Providing support for protocol < 2 would require the __reduce_ex__ method\r
+   which is notably long-winded when defined properly.\r
+\r
+   For BytesIO, the implementation would similar to one coded for\r
+   object.__reduce_ex__, but slightly less general. To be more specific, we\r
+   could call bytesio_getstate directly and avoid checking for the presence of\r
+   a fallback __reduce__ method. However, we would still need a __newobj__\r
+   function to use the efficient instance representation of PEP 307.\r
+ */\r
+\r
+static PyObject *\r
+bytesio_getstate(bytesio *self)\r
+{\r
+    PyObject *initvalue = bytesio_getvalue(self);\r
+    PyObject *dict;\r
+    PyObject *state;\r
+\r
+    if (initvalue == NULL)\r
+        return NULL;\r
+    if (self->dict == NULL) {\r
+        Py_INCREF(Py_None);\r
+        dict = Py_None;\r
+    }\r
+    else {\r
+        dict = PyDict_Copy(self->dict);\r
+        if (dict == NULL)\r
+            return NULL;\r
+    }\r
+\r
+    state = Py_BuildValue("(OnN)", initvalue, self->pos, dict);\r
+    Py_DECREF(initvalue);\r
+    return state;\r
+}\r
+\r
+static PyObject *\r
+bytesio_setstate(bytesio *self, PyObject *state)\r
+{\r
+    PyObject *result;\r
+    PyObject *position_obj;\r
+    PyObject *dict;\r
+    Py_ssize_t pos;\r
+\r
+    assert(state != NULL);\r
+\r
+    /* We allow the state tuple to be longer than 3, because we may need\r
+       someday to extend the object's state without breaking\r
+       backward-compatibility. */\r
+    if (!PyTuple_Check(state) || Py_SIZE(state) < 3) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "%.200s.__setstate__ argument should be 3-tuple, got %.200s",\r
+                     Py_TYPE(self)->tp_name, Py_TYPE(state)->tp_name);\r
+        return NULL;\r
+    }\r
+    /* Reset the object to its default state. This is only needed to handle\r
+       the case of repeated calls to __setstate__. */\r
+    self->string_size = 0;\r
+    self->pos = 0;\r
+\r
+    /* Set the value of the internal buffer. If state[0] does not support the\r
+       buffer protocol, bytesio_write will raise the appropriate TypeError. */\r
+    result = bytesio_write(self, PyTuple_GET_ITEM(state, 0));\r
+    if (result == NULL)\r
+        return NULL;\r
+    Py_DECREF(result);\r
+\r
+    /* Set carefully the position value. Alternatively, we could use the seek\r
+       method instead of modifying self->pos directly to better protect the\r
+       object internal state against errneous (or malicious) inputs. */\r
+    position_obj = PyTuple_GET_ITEM(state, 1);\r
+    if (!PyIndex_Check(position_obj)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "second item of state must be an integer, not %.200s",\r
+                     Py_TYPE(position_obj)->tp_name);\r
+        return NULL;\r
+    }\r
+    pos = PyNumber_AsSsize_t(position_obj, PyExc_OverflowError);\r
+    if (pos == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (pos < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "position value cannot be negative");\r
+        return NULL;\r
+    }\r
+    self->pos = pos;\r
+\r
+    /* Set the dictionary of the instance variables. */\r
+    dict = PyTuple_GET_ITEM(state, 2);\r
+    if (dict != Py_None) {\r
+        if (!PyDict_Check(dict)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "third item of state should be a dict, got a %.200s",\r
+                         Py_TYPE(dict)->tp_name);\r
+            return NULL;\r
+        }\r
+        if (self->dict) {\r
+            /* Alternatively, we could replace the internal dictionary\r
+               completely. However, it seems more practical to just update it. */\r
+            if (PyDict_Update(self->dict, dict) < 0)\r
+                return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(dict);\r
+            self->dict = dict;\r
+        }\r
+    }\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static void\r
+bytesio_dealloc(bytesio *self)\r
+{\r
+    _PyObject_GC_UNTRACK(self);\r
+    if (self->buf != NULL) {\r
+        PyMem_Free(self->buf);\r
+        self->buf = NULL;\r
+    }\r
+    Py_CLEAR(self->dict);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) self);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static PyObject *\r
+bytesio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    bytesio *self;\r
+\r
+    assert(type != NULL && type->tp_alloc != NULL);\r
+    self = (bytesio *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    /* tp_alloc initializes all the fields to zero. So we don't have to\r
+       initialize them here. */\r
+\r
+    self->buf = (char *)PyMem_Malloc(0);\r
+    if (self->buf == NULL) {\r
+        Py_DECREF(self);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    return (PyObject *)self;\r
+}\r
+\r
+static int\r
+bytesio_init(bytesio *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"initial_bytes", NULL};\r
+    PyObject *initvalue = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|O:BytesIO", kwlist,\r
+                                     &initvalue))\r
+        return -1;\r
+\r
+    /* In case, __init__ is called multiple times. */\r
+    self->string_size = 0;\r
+    self->pos = 0;\r
+\r
+    if (initvalue && initvalue != Py_None) {\r
+        PyObject *res;\r
+        res = bytesio_write(self, initvalue);\r
+        if (res == NULL)\r
+            return -1;\r
+        Py_DECREF(res);\r
+        self->pos = 0;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+bytesio_sizeof(bytesio *self, void *unused)\r
+{\r
+    Py_ssize_t res;\r
+\r
+    res = sizeof(bytesio);\r
+    if (self->buf)\r
+        res += self->buf_size;\r
+    return PyLong_FromSsize_t(res);\r
+}\r
+\r
+static int\r
+bytesio_traverse(bytesio *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+bytesio_clear(bytesio *self)\r
+{\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+\r
+static PyGetSetDef bytesio_getsetlist[] = {\r
+    {"closed",  (getter)bytesio_get_closed, NULL,\r
+     "True if the file is closed."},\r
+    {NULL},            /* sentinel */\r
+};\r
+\r
+static struct PyMethodDef bytesio_methods[] = {\r
+    {"readable",   (PyCFunction)return_not_closed,  METH_NOARGS, readable_doc},\r
+    {"seekable",   (PyCFunction)return_not_closed,  METH_NOARGS, seekable_doc},\r
+    {"writable",   (PyCFunction)return_not_closed,  METH_NOARGS, writable_doc},\r
+    {"close",      (PyCFunction)bytesio_close,      METH_NOARGS, close_doc},\r
+    {"flush",      (PyCFunction)bytesio_flush,      METH_NOARGS, flush_doc},\r
+    {"isatty",     (PyCFunction)bytesio_isatty,     METH_NOARGS, isatty_doc},\r
+    {"tell",       (PyCFunction)bytesio_tell,       METH_NOARGS, tell_doc},\r
+    {"write",      (PyCFunction)bytesio_write,      METH_O, write_doc},\r
+    {"writelines", (PyCFunction)bytesio_writelines, METH_O, writelines_doc},\r
+    {"read1",      (PyCFunction)bytesio_read1,      METH_O, read1_doc},\r
+    {"readinto",   (PyCFunction)bytesio_readinto,   METH_VARARGS, readinto_doc},\r
+    {"readline",   (PyCFunction)bytesio_readline,   METH_VARARGS, readline_doc},\r
+    {"readlines",  (PyCFunction)bytesio_readlines,  METH_VARARGS, readlines_doc},\r
+    {"read",       (PyCFunction)bytesio_read,       METH_VARARGS, read_doc},\r
+    {"getvalue",   (PyCFunction)bytesio_getvalue,   METH_NOARGS,  getval_doc},\r
+    {"seek",       (PyCFunction)bytesio_seek,       METH_VARARGS, seek_doc},\r
+    {"truncate",   (PyCFunction)bytesio_truncate,   METH_VARARGS, truncate_doc},\r
+    {"__getstate__",  (PyCFunction)bytesio_getstate,  METH_NOARGS, NULL},\r
+    {"__setstate__",  (PyCFunction)bytesio_setstate,  METH_O, NULL},\r
+    {"__sizeof__", (PyCFunction)bytesio_sizeof,     METH_NOARGS, NULL},\r
+    {NULL, NULL}        /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(bytesio_doc,\r
+"BytesIO([buffer]) -> object\n"\r
+"\n"\r
+"Create a buffered I/O implementation using an in-memory bytes\n"\r
+"buffer, ready for reading and writing.");\r
+\r
+PyTypeObject PyBytesIO_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.BytesIO",                             /*tp_name*/\r
+    sizeof(bytesio),                     /*tp_basicsize*/\r
+    0,                                         /*tp_itemsize*/\r
+    (destructor)bytesio_dealloc,               /*tp_dealloc*/\r
+    0,                                         /*tp_print*/\r
+    0,                                         /*tp_getattr*/\r
+    0,                                         /*tp_setattr*/\r
+    0,                                         /*tp_reserved*/\r
+    0,                                         /*tp_repr*/\r
+    0,                                         /*tp_as_number*/\r
+    0,                                         /*tp_as_sequence*/\r
+    0,                                         /*tp_as_mapping*/\r
+    0,                                         /*tp_hash*/\r
+    0,                                         /*tp_call*/\r
+    0,                                         /*tp_str*/\r
+    0,                                         /*tp_getattro*/\r
+    0,                                         /*tp_setattro*/\r
+    0,                                         /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\r
+    Py_TPFLAGS_HAVE_GC,                        /*tp_flags*/\r
+    bytesio_doc,                               /*tp_doc*/\r
+    (traverseproc)bytesio_traverse,            /*tp_traverse*/\r
+    (inquiry)bytesio_clear,                    /*tp_clear*/\r
+    0,                                         /*tp_richcompare*/\r
+    offsetof(bytesio, weakreflist),      /*tp_weaklistoffset*/\r
+    PyObject_SelfIter,                         /*tp_iter*/\r
+    (iternextfunc)bytesio_iternext,            /*tp_iternext*/\r
+    bytesio_methods,                           /*tp_methods*/\r
+    0,                                         /*tp_members*/\r
+    bytesio_getsetlist,                        /*tp_getset*/\r
+    0,                                         /*tp_base*/\r
+    0,                                         /*tp_dict*/\r
+    0,                                         /*tp_descr_get*/\r
+    0,                                         /*tp_descr_set*/\r
+    offsetof(bytesio, dict),             /*tp_dictoffset*/\r
+    (initproc)bytesio_init,                    /*tp_init*/\r
+    0,                                         /*tp_alloc*/\r
+    bytesio_new,                               /*tp_new*/\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/fileio.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/fileio.c
new file mode 100644 (file)
index 0000000..b69d366
--- /dev/null
@@ -0,0 +1,1118 @@
+/* Author: Daniel Stutzbach */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif\r
+#ifdef HAVE_SYS_STAT_H\r
+#include <sys/stat.h>\r
+#endif\r
+#ifdef HAVE_FCNTL_H\r
+#include <fcntl.h>\r
+#endif\r
+#include <stddef.h> /* For offsetof */\r
+#include "_iomodule.h"\r
+\r
+/*\r
+ * Known likely problems:\r
+ *\r
+ * - Files larger then 2**32-1\r
+ * - Files with unicode filenames\r
+ * - Passing numbers greater than 2**32-1 when an integer is expected\r
+ * - Making it work on Windows and other oddball platforms\r
+ *\r
+ * To Do:\r
+ *\r
+ * - autoconfify header file inclusion\r
+ */\r
+\r
+#ifdef MS_WINDOWS\r
+/* can simulate truncate with Win32 API functions; see file_truncate */\r
+#define HAVE_FTRUNCATE\r
+#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#endif\r
+\r
+#if BUFSIZ < (8*1024)\r
+#define SMALLCHUNK (8*1024)\r
+#elif (BUFSIZ >= (2 << 25))\r
+#error "unreasonable BUFSIZ > 64MB defined"\r
+#else\r
+#define SMALLCHUNK BUFSIZ\r
+#endif\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    int fd;\r
+    unsigned int readable : 1;\r
+    unsigned int writable : 1;\r
+    unsigned int appending : 1;\r
+    signed int seekable : 2; /* -1 means unknown */\r
+    unsigned int closefd : 1;\r
+    PyObject *weakreflist;\r
+    PyObject *dict;\r
+} fileio;\r
+\r
+PyTypeObject PyFileIO_Type;\r
+\r
+#define PyFileIO_Check(op) (PyObject_TypeCheck((op), &PyFileIO_Type))\r
+\r
+int\r
+_PyFileIO_closed(PyObject *self)\r
+{\r
+    return ((fileio *)self)->fd < 0;\r
+}\r
+\r
+static PyObject *\r
+portable_lseek(int fd, PyObject *posobj, int whence);\r
+\r
+static PyObject *portable_lseek(int fd, PyObject *posobj, int whence);\r
+\r
+/* Returns 0 on success, -1 with exception set on failure. */\r
+static int\r
+internal_close(fileio *self)\r
+{\r
+    int err = 0;\r
+    int save_errno = 0;\r
+    if (self->fd >= 0) {\r
+        int fd = self->fd;\r
+        self->fd = -1;\r
+        /* fd is accessible and someone else may have closed it */\r
+        if (_PyVerify_fd(fd)) {\r
+            Py_BEGIN_ALLOW_THREADS\r
+            err = close(fd);\r
+            if (err < 0)\r
+                save_errno = errno;\r
+            Py_END_ALLOW_THREADS\r
+        } else {\r
+            save_errno = errno;\r
+            err = -1;\r
+        }\r
+    }\r
+    if (err < 0) {\r
+        errno = save_errno;\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+fileio_close(fileio *self)\r
+{\r
+    PyObject *res;\r
+    res = PyObject_CallMethod((PyObject*)&PyRawIOBase_Type,\r
+                              "close", "O", self);\r
+    if (!self->closefd) {\r
+        self->fd = -1;\r
+        return res;\r
+    }\r
+    if (internal_close(self) < 0)\r
+        Py_CLEAR(res);\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+fileio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    fileio *self;\r
+\r
+    assert(type != NULL && type->tp_alloc != NULL);\r
+\r
+    self = (fileio *) type->tp_alloc(type, 0);\r
+    if (self != NULL) {\r
+        self->fd = -1;\r
+        self->readable = 0;\r
+        self->writable = 0;\r
+        self->appending = 0;\r
+        self->seekable = -1;\r
+        self->closefd = 1;\r
+        self->weakreflist = NULL;\r
+    }\r
+\r
+    return (PyObject *) self;\r
+}\r
+\r
+/* On Unix, open will succeed for directories.\r
+   In Python, there should be no file objects referring to\r
+   directories, so we need a check.  */\r
+\r
+static int\r
+dircheck(fileio* self, PyObject *nameobj)\r
+{\r
+#if defined(HAVE_FSTAT) && defined(S_IFDIR) && defined(EISDIR)\r
+    struct stat buf;\r
+    if (self->fd < 0)\r
+        return 0;\r
+    if (fstat(self->fd, &buf) == 0 && S_ISDIR(buf.st_mode)) {\r
+        errno = EISDIR;\r
+        PyErr_SetFromErrnoWithFilenameObject(PyExc_IOError, nameobj);\r
+        return -1;\r
+    }\r
+#endif\r
+    return 0;\r
+}\r
+\r
+static int\r
+check_fd(int fd)\r
+{\r
+#if defined(HAVE_FSTAT)\r
+    struct stat buf;\r
+    if (!_PyVerify_fd(fd) || (fstat(fd, &buf) < 0 && errno == EBADF)) {\r
+        PyObject *exc;\r
+        char *msg = strerror(EBADF);\r
+        exc = PyObject_CallFunction(PyExc_OSError, "(is)",\r
+                                    EBADF, msg);\r
+        PyErr_SetObject(PyExc_OSError, exc);\r
+        Py_XDECREF(exc);\r
+        return -1;\r
+    }\r
+#endif\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+fileio_init(PyObject *oself, PyObject *args, PyObject *kwds)\r
+{\r
+    fileio *self = (fileio *) oself;\r
+    static char *kwlist[] = {"file", "mode", "closefd", NULL};\r
+    const char *name = NULL;\r
+    PyObject *nameobj, *stringobj = NULL;\r
+    char *mode = "r";\r
+    char *s;\r
+#ifdef MS_WINDOWS\r
+    Py_UNICODE *widename = NULL;\r
+#endif\r
+    int ret = 0;\r
+    int rwa = 0, plus = 0;\r
+    int flags = 0;\r
+    int fd = -1;\r
+    int closefd = 1;\r
+    int fd_is_own = 0;\r
+\r
+    assert(PyFileIO_Check(oself));\r
+    if (self->fd >= 0) {\r
+        if (self->closefd) {\r
+            /* Have to close the existing file first. */\r
+            if (internal_close(self) < 0)\r
+                return -1;\r
+        }\r
+        else\r
+            self->fd = -1;\r
+    }\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|si:fileio",\r
+                                     kwlist, &nameobj, &mode, &closefd))\r
+        return -1;\r
+\r
+    if (PyFloat_Check(nameobj)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "integer argument expected, got float");\r
+        return -1;\r
+    }\r
+\r
+    fd = _PyLong_AsInt(nameobj);\r
+    if (fd < 0) {\r
+        if (!PyErr_Occurred()) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "negative file descriptor");\r
+            return -1;\r
+        }\r
+        PyErr_Clear();\r
+    }\r
+\r
+#ifdef MS_WINDOWS\r
+    if (PyUnicode_Check(nameobj))\r
+        widename = PyUnicode_AS_UNICODE(nameobj);\r
+    if (widename == NULL)\r
+#endif\r
+    if (fd < 0)\r
+    {\r
+        if (PyBytes_Check(nameobj) || PyByteArray_Check(nameobj)) {\r
+            Py_ssize_t namelen;\r
+            if (PyObject_AsCharBuffer(nameobj, &name, &namelen) < 0)\r
+                return -1;\r
+        }\r
+        else {\r
+            PyObject *u = PyUnicode_FromObject(nameobj);\r
+\r
+            if (u == NULL)\r
+                return -1;\r
+\r
+            stringobj = PyUnicode_AsEncodedString(\r
+                u, Py_FileSystemDefaultEncoding, NULL);\r
+            Py_DECREF(u);\r
+            if (stringobj == NULL)\r
+                return -1;\r
+            if (!PyBytes_Check(stringobj)) {\r
+                PyErr_SetString(PyExc_TypeError,\r
+                                "encoder failed to return bytes");\r
+                goto error;\r
+            }\r
+            name = PyBytes_AS_STRING(stringobj);\r
+        }\r
+    }\r
+\r
+    s = mode;\r
+    while (*s) {\r
+        switch (*s++) {\r
+        case 'r':\r
+            if (rwa) {\r
+            bad_mode:\r
+                PyErr_SetString(PyExc_ValueError,\r
+                                "Must have exactly one of read/write/append "\r
+                                "mode and at most one plus");\r
+                goto error;\r
+            }\r
+            rwa = 1;\r
+            self->readable = 1;\r
+            break;\r
+        case 'w':\r
+            if (rwa)\r
+                goto bad_mode;\r
+            rwa = 1;\r
+            self->writable = 1;\r
+            flags |= O_CREAT | O_TRUNC;\r
+            break;\r
+        case 'a':\r
+            if (rwa)\r
+                goto bad_mode;\r
+            rwa = 1;\r
+            self->writable = 1;\r
+            self->appending = 1;\r
+            flags |= O_APPEND | O_CREAT;\r
+            break;\r
+        case 'b':\r
+            break;\r
+        case '+':\r
+            if (plus)\r
+                goto bad_mode;\r
+            self->readable = self->writable = 1;\r
+            plus = 1;\r
+            break;\r
+        default:\r
+            PyErr_Format(PyExc_ValueError,\r
+                         "invalid mode: %.200s", mode);\r
+            goto error;\r
+        }\r
+    }\r
+\r
+    if (!rwa)\r
+        goto bad_mode;\r
+\r
+    if (self->readable && self->writable)\r
+        flags |= O_RDWR;\r
+    else if (self->readable)\r
+        flags |= O_RDONLY;\r
+    else\r
+        flags |= O_WRONLY;\r
+\r
+#ifdef O_BINARY\r
+    flags |= O_BINARY;\r
+#endif\r
+\r
+    if (fd >= 0) {\r
+        if (check_fd(fd))\r
+            goto error;\r
+        self->fd = fd;\r
+        self->closefd = closefd;\r
+    }\r
+    else {\r
+        self->closefd = 1;\r
+        if (!closefd) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                "Cannot use closefd=False with file name");\r
+            goto error;\r
+        }\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+#ifdef MS_WINDOWS\r
+        if (widename != NULL)\r
+            self->fd = _wopen(widename, flags, 0666);\r
+        else\r
+#endif\r
+            self->fd = open(name, flags, 0666);\r
+        Py_END_ALLOW_THREADS\r
+        fd_is_own = 1;\r
+        if (self->fd < 0) {\r
+#ifdef MS_WINDOWS\r
+            if (widename != NULL)\r
+                PyErr_SetFromErrnoWithUnicodeFilename(PyExc_IOError, widename);\r
+            else\r
+#endif\r
+                PyErr_SetFromErrnoWithFilename(PyExc_IOError, name);\r
+            goto error;\r
+        }\r
+    }\r
+    if (dircheck(self, nameobj) < 0)\r
+        goto error;\r
+\r
+    if (PyObject_SetAttrString((PyObject *)self, "name", nameobj) < 0)\r
+        goto error;\r
+\r
+    if (self->appending) {\r
+        /* For consistent behaviour, we explicitly seek to the\r
+           end of file (otherwise, it might be done only on the\r
+           first write()). */\r
+        PyObject *pos = portable_lseek(self->fd, NULL, 2);\r
+        if (pos == NULL)\r
+            goto error;\r
+        Py_DECREF(pos);\r
+    }\r
+\r
+    goto done;\r
+\r
+ error:\r
+    if (!fd_is_own)\r
+        self->fd = -1;\r
+\r
+    ret = -1;\r
+\r
+ done:\r
+    Py_CLEAR(stringobj);\r
+    return ret;\r
+}\r
+\r
+static int\r
+fileio_traverse(fileio *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+fileio_clear(fileio *self)\r
+{\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+static void\r
+fileio_dealloc(fileio *self)\r
+{\r
+    if (_PyIOBase_finalize((PyObject *) self) < 0)\r
+        return;\r
+    _PyObject_GC_UNTRACK(self);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) self);\r
+    Py_CLEAR(self->dict);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static PyObject *\r
+err_closed(void)\r
+{\r
+    PyErr_SetString(PyExc_ValueError, "I/O operation on closed file");\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+err_mode(char *action)\r
+{\r
+    PyErr_Format(PyExc_ValueError, "File not open for %s", action);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+fileio_fileno(fileio *self)\r
+{\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    return PyInt_FromLong((long) self->fd);\r
+}\r
+\r
+static PyObject *\r
+fileio_readable(fileio *self)\r
+{\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    return PyBool_FromLong((long) self->readable);\r
+}\r
+\r
+static PyObject *\r
+fileio_writable(fileio *self)\r
+{\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    return PyBool_FromLong((long) self->writable);\r
+}\r
+\r
+static PyObject *\r
+fileio_seekable(fileio *self)\r
+{\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    if (self->seekable < 0) {\r
+        PyObject *pos = portable_lseek(self->fd, NULL, SEEK_CUR);\r
+        if (pos == NULL) {\r
+            PyErr_Clear();\r
+            self->seekable = 0;\r
+        } else {\r
+            Py_DECREF(pos);\r
+            self->seekable = 1;\r
+        }\r
+    }\r
+    return PyBool_FromLong((long) self->seekable);\r
+}\r
+\r
+static PyObject *\r
+fileio_readinto(fileio *self, PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    Py_ssize_t n, len;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    if (!self->readable)\r
+        return err_mode("reading");\r
+\r
+    if (!PyArg_ParseTuple(args, "w*", &pbuf))\r
+        return NULL;\r
+\r
+    if (_PyVerify_fd(self->fd)) {\r
+        len = pbuf.len;\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+        if (len > INT_MAX)\r
+            len = INT_MAX;\r
+        n = read(self->fd, pbuf.buf, (int)len);\r
+#else\r
+        n = read(self->fd, pbuf.buf, len);\r
+#endif\r
+        Py_END_ALLOW_THREADS\r
+    } else\r
+        n = -1;\r
+    PyBuffer_Release(&pbuf);\r
+    if (n < 0) {\r
+        if (errno == EAGAIN)\r
+            Py_RETURN_NONE;\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+\r
+    return PyLong_FromSsize_t(n);\r
+}\r
+\r
+static size_t\r
+new_buffersize(fileio *self, size_t currentsize)\r
+{\r
+#ifdef HAVE_FSTAT\r
+    off_t pos, end;\r
+    struct stat st;\r
+    if (fstat(self->fd, &st) == 0) {\r
+        end = st.st_size;\r
+        pos = lseek(self->fd, 0L, SEEK_CUR);\r
+        /* Files claiming a size smaller than SMALLCHUNK may\r
+           actually be streaming pseudo-files. In this case, we\r
+           apply the more aggressive algorithm below.\r
+        */\r
+        if (end >= SMALLCHUNK && end >= pos && pos >= 0) {\r
+            /* Add 1 so if the file were to grow we'd notice. */\r
+            return currentsize + end - pos + 1;\r
+        }\r
+    }\r
+#endif\r
+    /* Expand the buffer by an amount proportional to the current size,\r
+       giving us amortized linear-time behavior. Use a less-than-double\r
+       growth factor to avoid excessive allocation. */\r
+    return currentsize + (currentsize >> 3) + 6;\r
+}\r
+\r
+static PyObject *\r
+fileio_readall(fileio *self)\r
+{\r
+    PyObject *result;\r
+    Py_ssize_t total = 0;\r
+    Py_ssize_t n;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    if (!_PyVerify_fd(self->fd))\r
+        return PyErr_SetFromErrno(PyExc_IOError);\r
+\r
+    result = PyBytes_FromStringAndSize(NULL, SMALLCHUNK);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    while (1) {\r
+        size_t newsize = new_buffersize(self, total);\r
+        if (newsize > PY_SSIZE_T_MAX || newsize <= 0) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                "unbounded read returned more bytes "\r
+                "than a Python string can hold ");\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+\r
+        if (PyBytes_GET_SIZE(result) < (Py_ssize_t)newsize) {\r
+            if (_PyBytes_Resize(&result, newsize) < 0)\r
+                return NULL; /* result has been freed */\r
+        }\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+        n = newsize - total;\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+        if (n > INT_MAX)\r
+            n = INT_MAX;\r
+        n = read(self->fd,\r
+                 PyBytes_AS_STRING(result) + total,\r
+                 (int)n);\r
+#else\r
+        n = read(self->fd,\r
+                 PyBytes_AS_STRING(result) + total,\r
+                 n);\r
+#endif\r
+        Py_END_ALLOW_THREADS\r
+        if (n == 0)\r
+            break;\r
+        if (n < 0) {\r
+            if (errno == EINTR) {\r
+                if (PyErr_CheckSignals()) {\r
+                    Py_DECREF(result);\r
+                    return NULL;\r
+                }\r
+                continue;\r
+            }\r
+            if (errno == EAGAIN) {\r
+                if (total > 0)\r
+                    break;\r
+                Py_DECREF(result);\r
+                Py_RETURN_NONE;\r
+            }\r
+            Py_DECREF(result);\r
+            PyErr_SetFromErrno(PyExc_IOError);\r
+            return NULL;\r
+        }\r
+        total += n;\r
+    }\r
+\r
+    if (PyBytes_GET_SIZE(result) > total) {\r
+        if (_PyBytes_Resize(&result, total) < 0) {\r
+            /* This should never happen, but just in case */\r
+            return NULL;\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+fileio_read(fileio *self, PyObject *args)\r
+{\r
+    char *ptr;\r
+    Py_ssize_t n;\r
+    Py_ssize_t size = -1;\r
+    PyObject *bytes;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    if (!self->readable)\r
+        return err_mode("reading");\r
+\r
+    if (!PyArg_ParseTuple(args, "|O&", &_PyIO_ConvertSsize_t, &size))\r
+        return NULL;\r
+\r
+    if (size < 0) {\r
+        return fileio_readall(self);\r
+    }\r
+\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+    if (size > INT_MAX)\r
+        size = INT_MAX;\r
+#endif\r
+    bytes = PyBytes_FromStringAndSize(NULL, size);\r
+    if (bytes == NULL)\r
+        return NULL;\r
+    ptr = PyBytes_AS_STRING(bytes);\r
+\r
+    if (_PyVerify_fd(self->fd)) {\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+        n = read(self->fd, ptr, (int)size);\r
+#else\r
+        n = read(self->fd, ptr, size);\r
+#endif\r
+        Py_END_ALLOW_THREADS\r
+    } else\r
+        n = -1;\r
+\r
+    if (n < 0) {\r
+        Py_DECREF(bytes);\r
+        if (errno == EAGAIN)\r
+            Py_RETURN_NONE;\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+\r
+    if (n != size) {\r
+        if (_PyBytes_Resize(&bytes, n) < 0)\r
+            return NULL;\r
+    }\r
+\r
+    return (PyObject *) bytes;\r
+}\r
+\r
+static PyObject *\r
+fileio_write(fileio *self, PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    Py_ssize_t n, len;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    if (!self->writable)\r
+        return err_mode("writing");\r
+\r
+    if (!PyArg_ParseTuple(args, "s*", &pbuf))\r
+        return NULL;\r
+\r
+    if (_PyVerify_fd(self->fd)) {\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+        len = pbuf.len;\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+        if (len > INT_MAX)\r
+            len = INT_MAX;\r
+        n = write(self->fd, pbuf.buf, (int)len);\r
+#else\r
+        n = write(self->fd, pbuf.buf, len);\r
+#endif\r
+        Py_END_ALLOW_THREADS\r
+    } else\r
+        n = -1;\r
+\r
+    PyBuffer_Release(&pbuf);\r
+\r
+    if (n < 0) {\r
+        if (errno == EAGAIN)\r
+            Py_RETURN_NONE;\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+\r
+    return PyLong_FromSsize_t(n);\r
+}\r
+\r
+/* XXX Windows support below is likely incomplete */\r
+\r
+/* Cribbed from posix_lseek() */\r
+static PyObject *\r
+portable_lseek(int fd, PyObject *posobj, int whence)\r
+{\r
+    Py_off_t pos, res;\r
+\r
+#ifdef SEEK_SET\r
+    /* Turn 0, 1, 2 into SEEK_{SET,CUR,END} */\r
+    switch (whence) {\r
+#if SEEK_SET != 0\r
+    case 0: whence = SEEK_SET; break;\r
+#endif\r
+#if SEEK_CUR != 1\r
+    case 1: whence = SEEK_CUR; break;\r
+#endif\r
+#if SEEK_END != 2\r
+    case 2: whence = SEEK_END; break;\r
+#endif\r
+    }\r
+#endif /* SEEK_SET */\r
+\r
+    if (posobj == NULL)\r
+        pos = 0;\r
+    else {\r
+        if(PyFloat_Check(posobj)) {\r
+            PyErr_SetString(PyExc_TypeError, "an integer is required");\r
+            return NULL;\r
+        }\r
+#if defined(HAVE_LARGEFILE_SUPPORT)\r
+        pos = PyLong_AsLongLong(posobj);\r
+#else\r
+        pos = PyLong_AsLong(posobj);\r
+#endif\r
+        if (PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+\r
+    if (_PyVerify_fd(fd)) {\r
+        Py_BEGIN_ALLOW_THREADS\r
+#if defined(MS_WIN64) || defined(MS_WINDOWS)\r
+        res = _lseeki64(fd, pos, whence);\r
+#else\r
+        res = lseek(fd, pos, whence);\r
+#endif\r
+        Py_END_ALLOW_THREADS\r
+    } else\r
+        res = -1;\r
+    if (res < 0)\r
+        return PyErr_SetFromErrno(PyExc_IOError);\r
+\r
+#if defined(HAVE_LARGEFILE_SUPPORT)\r
+    return PyLong_FromLongLong(res);\r
+#else\r
+    return PyLong_FromLong(res);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+fileio_seek(fileio *self, PyObject *args)\r
+{\r
+    PyObject *posobj;\r
+    int whence = 0;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+\r
+    if (!PyArg_ParseTuple(args, "O|i", &posobj, &whence))\r
+        return NULL;\r
+\r
+    return portable_lseek(self->fd, posobj, whence);\r
+}\r
+\r
+static PyObject *\r
+fileio_tell(fileio *self, PyObject *args)\r
+{\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+\r
+    return portable_lseek(self->fd, NULL, 1);\r
+}\r
+\r
+#ifdef HAVE_FTRUNCATE\r
+static PyObject *\r
+fileio_truncate(fileio *self, PyObject *args)\r
+{\r
+    PyObject *posobj = NULL; /* the new size wanted by the user */\r
+#ifndef MS_WINDOWS\r
+    Py_off_t pos;\r
+#endif\r
+    int ret;\r
+    int fd;\r
+\r
+    fd = self->fd;\r
+    if (fd < 0)\r
+        return err_closed();\r
+    if (!self->writable)\r
+        return err_mode("writing");\r
+\r
+    if (!PyArg_ParseTuple(args, "|O", &posobj))\r
+        return NULL;\r
+\r
+    if (posobj == Py_None || posobj == NULL) {\r
+        /* Get the current position. */\r
+        posobj = portable_lseek(fd, NULL, 1);\r
+        if (posobj == NULL)\r
+            return NULL;\r
+    }\r
+    else {\r
+        Py_INCREF(posobj);\r
+    }\r
+\r
+#ifdef MS_WINDOWS\r
+    /* MS _chsize doesn't work if newsize doesn't fit in 32 bits,\r
+       so don't even try using it. */\r
+    {\r
+        PyObject *oldposobj, *tempposobj;\r
+        HANDLE hFile;\r
+\r
+        /* we save the file pointer position */\r
+        oldposobj = portable_lseek(fd, NULL, 1);\r
+        if (oldposobj == NULL) {\r
+            Py_DECREF(posobj);\r
+            return NULL;\r
+        }\r
+\r
+        /* we then move to the truncation position */\r
+        tempposobj = portable_lseek(fd, posobj, 0);\r
+        if (tempposobj == NULL) {\r
+            Py_DECREF(oldposobj);\r
+            Py_DECREF(posobj);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(tempposobj);\r
+\r
+        /* Truncate.  Note that this may grow the file! */\r
+        Py_BEGIN_ALLOW_THREADS\r
+        errno = 0;\r
+        hFile = (HANDLE)_get_osfhandle(fd);\r
+        ret = hFile == (HANDLE)-1; /* testing for INVALID_HANDLE value */\r
+        if (ret == 0) {\r
+            ret = SetEndOfFile(hFile) == 0;\r
+            if (ret)\r
+                errno = EACCES;\r
+        }\r
+        Py_END_ALLOW_THREADS\r
+\r
+        /* we restore the file pointer position in any case */\r
+        tempposobj = portable_lseek(fd, oldposobj, 0);\r
+        Py_DECREF(oldposobj);\r
+        if (tempposobj == NULL) {\r
+            Py_DECREF(posobj);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(tempposobj);\r
+    }\r
+#else\r
+\r
+#if defined(HAVE_LARGEFILE_SUPPORT)\r
+    pos = PyLong_AsLongLong(posobj);\r
+#else\r
+    pos = PyLong_AsLong(posobj);\r
+#endif\r
+    if (PyErr_Occurred()){\r
+        Py_DECREF(posobj);\r
+        return NULL;\r
+    }\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    errno = 0;\r
+    ret = ftruncate(fd, pos);\r
+    Py_END_ALLOW_THREADS\r
+\r
+#endif /* !MS_WINDOWS */\r
+\r
+    if (ret != 0) {\r
+        Py_DECREF(posobj);\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+\r
+    return posobj;\r
+}\r
+#endif /* HAVE_FTRUNCATE */\r
+\r
+static char *\r
+mode_string(fileio *self)\r
+{\r
+    if (self->appending) {\r
+        if (self->readable)\r
+            return "ab+";\r
+        else\r
+            return "ab";\r
+    }\r
+    else if (self->readable) {\r
+        if (self->writable)\r
+            return "rb+";\r
+        else\r
+            return "rb";\r
+    }\r
+    else\r
+        return "wb";\r
+}\r
+\r
+static PyObject *\r
+fileio_repr(fileio *self)\r
+{\r
+    PyObject *nameobj, *res;\r
+\r
+    if (self->fd < 0)\r
+        return PyString_FromFormat("<_io.FileIO [closed]>");\r
+\r
+    nameobj = PyObject_GetAttrString((PyObject *) self, "name");\r
+    if (nameobj == NULL) {\r
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+            PyErr_Clear();\r
+        else\r
+            return NULL;\r
+        res = PyString_FromFormat("<_io.FileIO fd=%d mode='%s'>",\r
+                                   self->fd, mode_string(self));\r
+    }\r
+    else {\r
+        PyObject *repr = PyObject_Repr(nameobj);\r
+        Py_DECREF(nameobj);\r
+        if (repr == NULL)\r
+            return NULL;\r
+        res = PyString_FromFormat("<_io.FileIO name=%s mode='%s'>",\r
+                                   PyString_AS_STRING(repr),\r
+                                   mode_string(self));\r
+        Py_DECREF(repr);\r
+    }\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+fileio_isatty(fileio *self)\r
+{\r
+    long res;\r
+\r
+    if (self->fd < 0)\r
+        return err_closed();\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = isatty(self->fd);\r
+    Py_END_ALLOW_THREADS\r
+    return PyBool_FromLong(res);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(fileio_doc,\r
+"file(name: str[, mode: str]) -> file IO object\n"\r
+"\n"\r
+"Open a file.  The mode can be 'r' (default), 'w' or 'a' for reading,\n"\r
+"writing or appending.  The file will be created if it doesn't exist\n"\r
+"when opened for writing or appending; it will be truncated when\n"\r
+"opened for writing.  Add a '+' to the mode to allow simultaneous\n"\r
+"reading and writing.");\r
+\r
+PyDoc_STRVAR(read_doc,\r
+"read(size: int) -> bytes.  read at most size bytes, returned as bytes.\n"\r
+"\n"\r
+"Only makes one system call, so less data may be returned than requested\n"\r
+"In non-blocking mode, returns None if no data is available.\n"\r
+"On end-of-file, returns ''.");\r
+\r
+PyDoc_STRVAR(readall_doc,\r
+"readall() -> bytes.  read all data from the file, returned as bytes.\n"\r
+"\n"\r
+"In non-blocking mode, returns as much as is immediately available,\n"\r
+"or None if no data is available.  On end-of-file, returns ''.");\r
+\r
+PyDoc_STRVAR(write_doc,\r
+"write(b: bytes) -> int.  Write bytes b to file, return number written.\n"\r
+"\n"\r
+"Only makes one system call, so not all of the data may be written.\n"\r
+"The number of bytes actually written is returned.  In non-blocking mode,\n"\r
+"returns None if the write would block."\r
+);\r
+\r
+PyDoc_STRVAR(fileno_doc,\r
+"fileno() -> int.  Return the underlying file descriptor (an integer).");\r
+\r
+PyDoc_STRVAR(seek_doc,\r
+"seek(offset: int[, whence: int]) -> int.  Move to new file position\n"\r
+"and return the file position.\n"\r
+"\n"\r
+"Argument offset is a byte count.  Optional argument whence defaults to\n"\r
+"SEEK_SET or 0 (offset from start of file, offset should be >= 0); other values\n"\r
+"are SEEK_CUR or 1 (move relative to current position, positive or negative),\n"\r
+"and SEEK_END or 2 (move relative to end of file, usually negative, although\n"\r
+"many platforms allow seeking beyond the end of a file).\n"\r
+"\n"\r
+"Note that not all file objects are seekable.");\r
+\r
+#ifdef HAVE_FTRUNCATE\r
+PyDoc_STRVAR(truncate_doc,\r
+"truncate([size: int]) -> int.  Truncate the file to at most size bytes and\n"\r
+"return the truncated size.\n"\r
+"\n"\r
+"Size defaults to the current file position, as returned by tell().\n"\r
+"The current file position is changed to the value of size.");\r
+#endif\r
+\r
+PyDoc_STRVAR(tell_doc,\r
+"tell() -> int.  Current file position.\n"\r
+"\n"\r
+"Can raise OSError for non seekable files."\r
+);\r
+\r
+PyDoc_STRVAR(readinto_doc,\r
+"readinto() -> Same as RawIOBase.readinto().");\r
+\r
+PyDoc_STRVAR(close_doc,\r
+"close() -> None.  Close the file.\n"\r
+"\n"\r
+"A closed file cannot be used for further I/O operations.  close() may be\n"\r
+"called more than once without error.");\r
+\r
+PyDoc_STRVAR(isatty_doc,\r
+"isatty() -> bool.  True if the file is connected to a TTY device.");\r
+\r
+PyDoc_STRVAR(seekable_doc,\r
+"seekable() -> bool.  True if file supports random-access.");\r
+\r
+PyDoc_STRVAR(readable_doc,\r
+"readable() -> bool.  True if file was opened in a read mode.");\r
+\r
+PyDoc_STRVAR(writable_doc,\r
+"writable() -> bool.  True if file was opened in a write mode.");\r
+\r
+static PyMethodDef fileio_methods[] = {\r
+    {"read",     (PyCFunction)fileio_read,         METH_VARARGS, read_doc},\r
+    {"readall",  (PyCFunction)fileio_readall,  METH_NOARGS,  readall_doc},\r
+    {"readinto", (PyCFunction)fileio_readinto, METH_VARARGS, readinto_doc},\r
+    {"write",    (PyCFunction)fileio_write,        METH_VARARGS, write_doc},\r
+    {"seek",     (PyCFunction)fileio_seek,         METH_VARARGS, seek_doc},\r
+    {"tell",     (PyCFunction)fileio_tell,         METH_VARARGS, tell_doc},\r
+#ifdef HAVE_FTRUNCATE\r
+    {"truncate", (PyCFunction)fileio_truncate, METH_VARARGS, truncate_doc},\r
+#endif\r
+    {"close",    (PyCFunction)fileio_close,        METH_NOARGS,  close_doc},\r
+    {"seekable", (PyCFunction)fileio_seekable, METH_NOARGS,      seekable_doc},\r
+    {"readable", (PyCFunction)fileio_readable, METH_NOARGS,      readable_doc},\r
+    {"writable", (PyCFunction)fileio_writable, METH_NOARGS,      writable_doc},\r
+    {"fileno",   (PyCFunction)fileio_fileno,   METH_NOARGS,      fileno_doc},\r
+    {"isatty",   (PyCFunction)fileio_isatty,   METH_NOARGS,      isatty_doc},\r
+    {NULL,           NULL}             /* sentinel */\r
+};\r
+\r
+/* 'closed' and 'mode' are attributes for backwards compatibility reasons. */\r
+\r
+static PyObject *\r
+get_closed(fileio *self, void *closure)\r
+{\r
+    return PyBool_FromLong((long)(self->fd < 0));\r
+}\r
+\r
+static PyObject *\r
+get_closefd(fileio *self, void *closure)\r
+{\r
+    return PyBool_FromLong((long)(self->closefd));\r
+}\r
+\r
+static PyObject *\r
+get_mode(fileio *self, void *closure)\r
+{\r
+    return PyUnicode_FromString(mode_string(self));\r
+}\r
+\r
+static PyGetSetDef fileio_getsetlist[] = {\r
+    {"closed", (getter)get_closed, NULL, "True if the file is closed"},\r
+    {"closefd", (getter)get_closefd, NULL,\r
+        "True if the file descriptor will be closed by close()."},\r
+    {"mode", (getter)get_mode, NULL, "String giving the file mode"},\r
+    {NULL},\r
+};\r
+\r
+PyTypeObject PyFileIO_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.FileIO",\r
+    sizeof(fileio),\r
+    0,\r
+    (destructor)fileio_dealloc,                 /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_reserved */\r
+    (reprfunc)fileio_repr,                      /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+                    | Py_TPFLAGS_HAVE_GC,       /* tp_flags */\r
+    fileio_doc,                                 /* tp_doc */\r
+    (traverseproc)fileio_traverse,              /* tp_traverse */\r
+    (inquiry)fileio_clear,                      /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    offsetof(fileio, weakreflist),      /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    fileio_methods,                             /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    fileio_getsetlist,                          /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    offsetof(fileio, dict),         /* tp_dictoffset */\r
+    fileio_init,                                /* tp_init */\r
+    PyType_GenericAlloc,                        /* tp_alloc */\r
+    fileio_new,                                 /* tp_new */\r
+    PyObject_GC_Del,                            /* tp_free */\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/iobase.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/iobase.c
new file mode 100644 (file)
index 0000000..bd7f25a
--- /dev/null
@@ -0,0 +1,913 @@
+/*\r
+    An implementation of the I/O abstract base classes hierarchy\r
+    as defined by PEP 3116 - "New I/O"\r
+    \r
+    Classes defined here: IOBase, RawIOBase.\r
+    \r
+    Written by Amaury Forgeot d'Arc and Antoine Pitrou\r
+*/\r
+\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "_iomodule.h"\r
+\r
+/*\r
+ * IOBase class, an abstract class\r
+ */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    \r
+    PyObject *dict;\r
+    PyObject *weakreflist;\r
+} iobase;\r
+\r
+PyDoc_STRVAR(iobase_doc,\r
+    "The abstract base class for all I/O classes, acting on streams of\n"\r
+    "bytes. There is no public constructor.\n"\r
+    "\n"\r
+    "This class provides dummy implementations for many methods that\n"\r
+    "derived classes can override selectively; the default implementations\n"\r
+    "represent a file that cannot be read, written or seeked.\n"\r
+    "\n"\r
+    "Even though IOBase does not declare read, readinto, or write because\n"\r
+    "their signatures will vary, implementations and clients should\n"\r
+    "consider those methods part of the interface. Also, implementations\n"\r
+    "may raise a IOError when operations they do not support are called.\n"\r
+    "\n"\r
+    "The basic type used for binary data read from or written to a file is\n"\r
+    "bytes. bytearrays are accepted too, and in some cases (such as\n"\r
+    "readinto) needed. Text I/O classes work with str data.\n"\r
+    "\n"\r
+    "Note that calling any method (except additional calls to close(),\n"\r
+    "which are ignored) on a closed stream should raise a ValueError.\n"\r
+    "\n"\r
+    "IOBase (and its subclasses) support the iterator protocol, meaning\n"\r
+    "that an IOBase object can be iterated over yielding the lines in a\n"\r
+    "stream.\n"\r
+    "\n"\r
+    "IOBase also supports the :keyword:`with` statement. In this example,\n"\r
+    "fp is closed after the suite of the with statement is complete:\n"\r
+    "\n"\r
+    "with open('spam.txt', 'r') as fp:\n"\r
+    "    fp.write('Spam and eggs!')\n");\r
+\r
+/* Use this macro whenever you want to check the internal `closed` status\r
+   of the IOBase object rather than the virtual `closed` attribute as returned\r
+   by whatever subclass. */\r
+\r
+#define IS_CLOSED(self) \\r
+    PyObject_HasAttrString(self, "__IOBase_closed")\r
+\r
+/* Internal methods */\r
+static PyObject *\r
+iobase_unsupported(const char *message)\r
+{\r
+    PyErr_SetString(_PyIO_unsupported_operation, message);\r
+    return NULL;\r
+}\r
+\r
+/* Positionning */\r
+\r
+PyDoc_STRVAR(iobase_seek_doc,\r
+    "Change stream position.\n"\r
+    "\n"\r
+    "Change the stream position to the given byte offset. The offset is\n"\r
+    "interpreted relative to the position indicated by whence.  Values\n"\r
+    "for whence are:\n"\r
+    "\n"\r
+    "* 0 -- start of stream (the default); offset should be zero or positive\n"\r
+    "* 1 -- current stream position; offset may be negative\n"\r
+    "* 2 -- end of stream; offset is usually negative\n"\r
+    "\n"\r
+    "Return the new absolute position.");\r
+\r
+static PyObject *\r
+iobase_seek(PyObject *self, PyObject *args)\r
+{\r
+    return iobase_unsupported("seek");\r
+}\r
+\r
+PyDoc_STRVAR(iobase_tell_doc,\r
+             "Return current stream position.");\r
+\r
+static PyObject *\r
+iobase_tell(PyObject *self, PyObject *args)\r
+{\r
+    return PyObject_CallMethod(self, "seek", "ii", 0, 1);\r
+}\r
+\r
+PyDoc_STRVAR(iobase_truncate_doc,\r
+    "Truncate file to size bytes.\n"\r
+    "\n"\r
+    "File pointer is left unchanged.  Size defaults to the current IO\n"\r
+    "position as reported by tell().  Returns the new size.");\r
+\r
+static PyObject *\r
+iobase_truncate(PyObject *self, PyObject *args)\r
+{\r
+    return iobase_unsupported("truncate");\r
+}\r
+\r
+/* Flush and close methods */\r
+\r
+PyDoc_STRVAR(iobase_flush_doc,\r
+    "Flush write buffers, if applicable.\n"\r
+    "\n"\r
+    "This is not implemented for read-only and non-blocking streams.\n");\r
+\r
+static PyObject *\r
+iobase_flush(PyObject *self, PyObject *args)\r
+{\r
+    /* XXX Should this return the number of bytes written??? */\r
+    if (IS_CLOSED(self)) {\r
+        PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");\r
+        return NULL;\r
+    }\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(iobase_close_doc,\r
+    "Flush and close the IO object.\n"\r
+    "\n"\r
+    "This method has no effect if the file is already closed.\n");\r
+\r
+static int\r
+iobase_closed(PyObject *self)\r
+{\r
+    PyObject *res;\r
+    int closed;\r
+    /* This gets the derived attribute, which is *not* __IOBase_closed\r
+       in most cases! */\r
+    res = PyObject_GetAttr(self, _PyIO_str_closed);\r
+    if (res == NULL)\r
+        return 0;\r
+    closed = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    return closed;\r
+}\r
+\r
+static PyObject *\r
+iobase_closed_get(PyObject *self, void *context)\r
+{\r
+    return PyBool_FromLong(IS_CLOSED(self));\r
+}\r
+\r
+PyObject *\r
+_PyIOBase_check_closed(PyObject *self, PyObject *args)\r
+{\r
+    if (iobase_closed(self)) {\r
+        PyErr_SetString(PyExc_ValueError, "I/O operation on closed file.");\r
+        return NULL;\r
+    }\r
+    if (args == Py_True)\r
+        return Py_None;\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+/* XXX: IOBase thinks it has to maintain its own internal state in\r
+   `__IOBase_closed` and call flush() by itself, but it is redundant with\r
+   whatever behaviour a non-trivial derived class will implement. */\r
+\r
+static PyObject *\r
+iobase_close(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *res;\r
+\r
+    if (IS_CLOSED(self))\r
+        Py_RETURN_NONE;\r
+\r
+    res = PyObject_CallMethodObjArgs(self, _PyIO_str_flush, NULL);\r
+    PyObject_SetAttrString(self, "__IOBase_closed", Py_True);\r
+    if (res == NULL) {\r
+        return NULL;\r
+    }\r
+    Py_XDECREF(res);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+/* Finalization and garbage collection support */\r
+\r
+int\r
+_PyIOBase_finalize(PyObject *self)\r
+{\r
+    PyObject *res;\r
+    PyObject *tp, *v, *tb;\r
+    int closed = 1;\r
+    int is_zombie;\r
+\r
+    /* If _PyIOBase_finalize() is called from a destructor, we need to\r
+       resurrect the object as calling close() can invoke arbitrary code. */\r
+    is_zombie = (Py_REFCNT(self) == 0);\r
+    if (is_zombie) {\r
+        ++Py_REFCNT(self);\r
+    }\r
+    PyErr_Fetch(&tp, &v, &tb);\r
+    /* If `closed` doesn't exist or can't be evaluated as bool, then the\r
+       object is probably in an unusable state, so ignore. */\r
+    res = PyObject_GetAttr(self, _PyIO_str_closed);\r
+    if (res == NULL)\r
+        PyErr_Clear();\r
+    else {\r
+        closed = PyObject_IsTrue(res);\r
+        Py_DECREF(res);\r
+        if (closed == -1)\r
+            PyErr_Clear();\r
+    }\r
+    if (closed == 0) {\r
+        res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_close,\r
+                                          NULL);\r
+        /* Silencing I/O errors is bad, but printing spurious tracebacks is\r
+           equally as bad, and potentially more frequent (because of\r
+           shutdown issues). */\r
+        if (res == NULL)\r
+            PyErr_Clear();\r
+        else\r
+            Py_DECREF(res);\r
+    }\r
+    PyErr_Restore(tp, v, tb);\r
+    if (is_zombie) {\r
+        if (--Py_REFCNT(self) != 0) {\r
+            /* The object lives again. The following code is taken from\r
+               slot_tp_del in typeobject.c. */\r
+            Py_ssize_t refcnt = Py_REFCNT(self);\r
+            _Py_NewReference(self);\r
+            Py_REFCNT(self) = refcnt;\r
+            /* If Py_REF_DEBUG, _Py_NewReference bumped _Py_RefTotal, so\r
+             * we need to undo that. */\r
+            _Py_DEC_REFTOTAL;\r
+            /* If Py_TRACE_REFS, _Py_NewReference re-added self to the object\r
+             * chain, so no more to do there.\r
+             * If COUNT_ALLOCS, the original decref bumped tp_frees, and\r
+             * _Py_NewReference bumped tp_allocs:  both of those need to be\r
+             * undone.\r
+             */\r
+#ifdef COUNT_ALLOCS\r
+            --Py_TYPE(self)->tp_frees;\r
+            --Py_TYPE(self)->tp_allocs;\r
+#endif\r
+            return -1;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+iobase_traverse(iobase *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+iobase_clear(iobase *self)\r
+{\r
+    if (_PyIOBase_finalize((PyObject *) self) < 0)\r
+        return -1;\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+/* Destructor */\r
+\r
+static void\r
+iobase_dealloc(iobase *self)\r
+{\r
+    /* NOTE: since IOBaseObject has its own dict, Python-defined attributes\r
+       are still available here for close() to use.\r
+       However, if the derived class declares a __slots__, those slots are\r
+       already gone.\r
+    */\r
+    if (_PyIOBase_finalize((PyObject *) self) < 0) {\r
+        /* When called from a heap type's dealloc, the type will be\r
+           decref'ed on return (see e.g. subtype_dealloc in typeobject.c). */\r
+        if (PyType_HasFeature(Py_TYPE(self), Py_TPFLAGS_HEAPTYPE))\r
+            Py_INCREF(Py_TYPE(self));\r
+        return;\r
+    }\r
+    _PyObject_GC_UNTRACK(self);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) self);\r
+    Py_CLEAR(self->dict);\r
+    Py_TYPE(self)->tp_free((PyObject *) self);\r
+}\r
+\r
+/* Inquiry methods */\r
+\r
+PyDoc_STRVAR(iobase_seekable_doc,\r
+    "Return whether object supports random access.\n"\r
+    "\n"\r
+    "If False, seek(), tell() and truncate() will raise IOError.\n"\r
+    "This method may need to do a test seek().");\r
+\r
+static PyObject *\r
+iobase_seekable(PyObject *self, PyObject *args)\r
+{\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+PyObject *\r
+_PyIOBase_check_seekable(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_seekable, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    if (res != Py_True) {\r
+        Py_CLEAR(res);\r
+        PyErr_SetString(PyExc_IOError, "File or stream is not seekable.");\r
+        return NULL;\r
+    }\r
+    if (args == Py_True) {\r
+        Py_DECREF(res);\r
+    }\r
+    return res;\r
+}\r
+\r
+PyDoc_STRVAR(iobase_readable_doc,\r
+    "Return whether object was opened for reading.\n"\r
+    "\n"\r
+    "If False, read() will raise IOError.");\r
+\r
+static PyObject *\r
+iobase_readable(PyObject *self, PyObject *args)\r
+{\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+/* May be called with any object */\r
+PyObject *\r
+_PyIOBase_check_readable(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_readable, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    if (res != Py_True) {\r
+        Py_CLEAR(res);\r
+        PyErr_SetString(PyExc_IOError, "File or stream is not readable.");\r
+        return NULL;\r
+    }\r
+    if (args == Py_True) {\r
+        Py_DECREF(res);\r
+    }\r
+    return res;\r
+}\r
+\r
+PyDoc_STRVAR(iobase_writable_doc,\r
+    "Return whether object was opened for writing.\n"\r
+    "\n"\r
+    "If False, read() will raise IOError.");\r
+\r
+static PyObject *\r
+iobase_writable(PyObject *self, PyObject *args)\r
+{\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+/* May be called with any object */\r
+PyObject *\r
+_PyIOBase_check_writable(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *res  = PyObject_CallMethodObjArgs(self, _PyIO_str_writable, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    if (res != Py_True) {\r
+        Py_CLEAR(res);\r
+        PyErr_SetString(PyExc_IOError, "File or stream is not writable.");\r
+        return NULL;\r
+    }\r
+    if (args == Py_True) {\r
+        Py_DECREF(res);\r
+    }\r
+    return res;\r
+}\r
+\r
+/* Context manager */\r
+\r
+static PyObject *\r
+iobase_enter(PyObject *self, PyObject *args)\r
+{\r
+    if (_PyIOBase_check_closed(self, Py_True) == NULL)\r
+        return NULL;\r
+\r
+    Py_INCREF(self);\r
+    return self;\r
+}\r
+\r
+static PyObject *\r
+iobase_exit(PyObject *self, PyObject *args)\r
+{\r
+    return PyObject_CallMethodObjArgs(self, _PyIO_str_close, NULL);\r
+}\r
+\r
+/* Lower-level APIs */\r
+\r
+/* XXX Should these be present even if unimplemented? */\r
+\r
+PyDoc_STRVAR(iobase_fileno_doc,\r
+    "Returns underlying file descriptor if one exists.\n"\r
+    "\n"\r
+    "An IOError is raised if the IO object does not use a file descriptor.\n");\r
+\r
+static PyObject *\r
+iobase_fileno(PyObject *self, PyObject *args)\r
+{\r
+    return iobase_unsupported("fileno");\r
+}\r
+\r
+PyDoc_STRVAR(iobase_isatty_doc,\r
+    "Return whether this is an 'interactive' stream.\n"\r
+    "\n"\r
+    "Return False if it can't be determined.\n");\r
+\r
+static PyObject *\r
+iobase_isatty(PyObject *self, PyObject *args)\r
+{\r
+    if (_PyIOBase_check_closed(self, Py_True) == NULL)\r
+        return NULL;\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+/* Readline(s) and writelines */\r
+\r
+PyDoc_STRVAR(iobase_readline_doc,\r
+    "Read and return a line from the stream.\n"\r
+    "\n"\r
+    "If limit is specified, at most limit bytes will be read.\n"\r
+    "\n"\r
+    "The line terminator is always b'\\n' for binary files; for text\n"\r
+    "files, the newlines argument to open can be used to select the line\n"\r
+    "terminator(s) recognized.\n");\r
+\r
+static PyObject *\r
+iobase_readline(PyObject *self, PyObject *args)\r
+{\r
+    /* For backwards compatibility, a (slowish) readline(). */\r
+\r
+    Py_ssize_t limit = -1;\r
+    int has_peek = 0;\r
+    PyObject *buffer, *result;\r
+    Py_ssize_t old_size = -1;\r
+\r
+    if (!PyArg_ParseTuple(args, "|O&:readline", &_PyIO_ConvertSsize_t, &limit)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (PyObject_HasAttrString(self, "peek"))\r
+        has_peek = 1;\r
+\r
+    buffer = PyByteArray_FromStringAndSize(NULL, 0);\r
+    if (buffer == NULL)\r
+        return NULL;\r
+\r
+    while (limit < 0 || Py_SIZE(buffer) < limit) {\r
+        Py_ssize_t nreadahead = 1;\r
+        PyObject *b;\r
+\r
+        if (has_peek) {\r
+            PyObject *readahead = PyObject_CallMethod(self, "peek", "i", 1);\r
+            if (readahead == NULL) {\r
+                /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()\r
+                   when EINTR occurs so we needn't do it ourselves. */\r
+                if (_PyIO_trap_eintr()) {\r
+                    continue;\r
+                }\r
+                goto fail;\r
+            }\r
+            if (!PyBytes_Check(readahead)) {\r
+                PyErr_Format(PyExc_IOError,\r
+                             "peek() should have returned a bytes object, "\r
+                             "not '%.200s'", Py_TYPE(readahead)->tp_name);\r
+                Py_DECREF(readahead);\r
+                goto fail;\r
+            }\r
+            if (PyBytes_GET_SIZE(readahead) > 0) {\r
+                Py_ssize_t n = 0;\r
+                const char *buf = PyBytes_AS_STRING(readahead);\r
+                if (limit >= 0) {\r
+                    do {\r
+                        if (n >= PyBytes_GET_SIZE(readahead) || n >= limit)\r
+                            break;\r
+                        if (buf[n++] == '\n')\r
+                            break;\r
+                    } while (1);\r
+                }\r
+                else {\r
+                    do {\r
+                        if (n >= PyBytes_GET_SIZE(readahead))\r
+                            break;\r
+                        if (buf[n++] == '\n')\r
+                            break;\r
+                    } while (1);\r
+                }\r
+                nreadahead = n;\r
+            }\r
+            Py_DECREF(readahead);\r
+        }\r
+\r
+        b = PyObject_CallMethod(self, "read", "n", nreadahead);\r
+        if (b == NULL) {\r
+            /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()\r
+               when EINTR occurs so we needn't do it ourselves. */\r
+            if (_PyIO_trap_eintr()) {\r
+                continue;\r
+            }\r
+            goto fail;\r
+        }\r
+        if (!PyBytes_Check(b)) {\r
+            PyErr_Format(PyExc_IOError,\r
+                         "read() should have returned a bytes object, "\r
+                         "not '%.200s'", Py_TYPE(b)->tp_name);\r
+            Py_DECREF(b);\r
+            goto fail;\r
+        }\r
+        if (PyBytes_GET_SIZE(b) == 0) {\r
+            Py_DECREF(b);\r
+            break;\r
+        }\r
+\r
+        old_size = PyByteArray_GET_SIZE(buffer);\r
+        PyByteArray_Resize(buffer, old_size + PyBytes_GET_SIZE(b));\r
+        memcpy(PyByteArray_AS_STRING(buffer) + old_size,\r
+               PyBytes_AS_STRING(b), PyBytes_GET_SIZE(b));\r
+\r
+        Py_DECREF(b);\r
+\r
+        if (PyByteArray_AS_STRING(buffer)[PyByteArray_GET_SIZE(buffer) - 1] == '\n')\r
+            break;\r
+    }\r
+\r
+    result = PyBytes_FromStringAndSize(PyByteArray_AS_STRING(buffer),\r
+                                       PyByteArray_GET_SIZE(buffer));\r
+    Py_DECREF(buffer);\r
+    return result;\r
+  fail:\r
+    Py_DECREF(buffer);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+iobase_iter(PyObject *self)\r
+{\r
+    if (_PyIOBase_check_closed(self, Py_True) == NULL)\r
+        return NULL;\r
+\r
+    Py_INCREF(self);\r
+    return self;\r
+}\r
+\r
+static PyObject *\r
+iobase_iternext(PyObject *self)\r
+{\r
+    PyObject *line = PyObject_CallMethodObjArgs(self, _PyIO_str_readline, NULL);\r
+\r
+    if (line == NULL)\r
+        return NULL;\r
+\r
+    if (PyObject_Size(line) == 0) {\r
+        Py_DECREF(line);\r
+        return NULL;\r
+    }\r
+\r
+    return line;\r
+}\r
+\r
+PyDoc_STRVAR(iobase_readlines_doc,\r
+    "Return a list of lines from the stream.\n"\r
+    "\n"\r
+    "hint can be specified to control the number of lines read: no more\n"\r
+    "lines will be read if the total size (in bytes/characters) of all\n"\r
+    "lines so far exceeds hint.");\r
+\r
+static PyObject *\r
+iobase_readlines(PyObject *self, PyObject *args)\r
+{\r
+    Py_ssize_t hint = -1, length = 0;\r
+    PyObject *result;\r
+\r
+    if (!PyArg_ParseTuple(args, "|O&:readlines", &_PyIO_ConvertSsize_t, &hint)) {\r
+        return NULL;\r
+    }\r
+\r
+    result = PyList_New(0);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    if (hint <= 0) {\r
+        /* XXX special-casing this made sense in the Python version in order\r
+           to remove the bytecode interpretation overhead, but it could\r
+           probably be removed here. */\r
+        PyObject *ret = PyObject_CallMethod(result, "extend", "O", self);\r
+        if (ret == NULL) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(ret);\r
+        return result;\r
+    }\r
+\r
+    while (1) {\r
+        PyObject *line = PyIter_Next(self);\r
+        if (line == NULL) {\r
+            if (PyErr_Occurred()) {\r
+                Py_DECREF(result);\r
+                return NULL;\r
+            }\r
+            else\r
+                break; /* StopIteration raised */\r
+        }\r
+\r
+        if (PyList_Append(result, line) < 0) {\r
+            Py_DECREF(line);\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+        length += PyObject_Size(line);\r
+        Py_DECREF(line);\r
+\r
+        if (length > hint)\r
+            break;\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+iobase_writelines(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *lines, *iter, *res;\r
+\r
+    if (!PyArg_ParseTuple(args, "O:writelines", &lines)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (_PyIOBase_check_closed(self, Py_True) == NULL)\r
+        return NULL;\r
+\r
+    iter = PyObject_GetIter(lines);\r
+    if (iter == NULL)\r
+        return NULL;\r
+\r
+    while (1) {\r
+        PyObject *line = PyIter_Next(iter);\r
+        if (line == NULL) {\r
+            if (PyErr_Occurred()) {\r
+                Py_DECREF(iter);\r
+                return NULL;\r
+            }\r
+            else\r
+                break; /* Stop Iteration */\r
+        }\r
+\r
+        res = NULL;\r
+        do {\r
+            res = PyObject_CallMethodObjArgs(self, _PyIO_str_write, line, NULL);\r
+        } while (res == NULL && _PyIO_trap_eintr());\r
+        Py_DECREF(line);\r
+        if (res == NULL) {\r
+            Py_DECREF(iter);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(res);\r
+    }\r
+    Py_DECREF(iter);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyMethodDef iobase_methods[] = {\r
+    {"seek", iobase_seek, METH_VARARGS, iobase_seek_doc},\r
+    {"tell", iobase_tell, METH_NOARGS, iobase_tell_doc},\r
+    {"truncate", iobase_truncate, METH_VARARGS, iobase_truncate_doc},\r
+    {"flush", iobase_flush, METH_NOARGS, iobase_flush_doc},\r
+    {"close", iobase_close, METH_NOARGS, iobase_close_doc},\r
+\r
+    {"seekable", iobase_seekable, METH_NOARGS, iobase_seekable_doc},\r
+    {"readable", iobase_readable, METH_NOARGS, iobase_readable_doc},\r
+    {"writable", iobase_writable, METH_NOARGS, iobase_writable_doc},\r
+\r
+    {"_checkClosed",   _PyIOBase_check_closed, METH_NOARGS},\r
+    {"_checkSeekable", _PyIOBase_check_seekable, METH_NOARGS},\r
+    {"_checkReadable", _PyIOBase_check_readable, METH_NOARGS},\r
+    {"_checkWritable", _PyIOBase_check_writable, METH_NOARGS},\r
+\r
+    {"fileno", iobase_fileno, METH_NOARGS, iobase_fileno_doc},\r
+    {"isatty", iobase_isatty, METH_NOARGS, iobase_isatty_doc},\r
+\r
+    {"__enter__", iobase_enter, METH_NOARGS},\r
+    {"__exit__", iobase_exit, METH_VARARGS},\r
+\r
+    {"readline", iobase_readline, METH_VARARGS, iobase_readline_doc},\r
+    {"readlines", iobase_readlines, METH_VARARGS, iobase_readlines_doc},\r
+    {"writelines", iobase_writelines, METH_VARARGS},\r
+\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyGetSetDef iobase_getset[] = {\r
+    {"closed", (getter)iobase_closed_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+\r
+PyTypeObject PyIOBase_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io._IOBase",              /*tp_name*/\r
+    sizeof(iobase),             /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)iobase_dealloc, /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+        | Py_TPFLAGS_HAVE_GC,   /*tp_flags*/\r
+    iobase_doc,                 /* tp_doc */\r
+    (traverseproc)iobase_traverse, /* tp_traverse */\r
+    (inquiry)iobase_clear,      /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(iobase, weakreflist), /* tp_weaklistoffset */\r
+    iobase_iter,                /* tp_iter */\r
+    iobase_iternext,            /* tp_iternext */\r
+    iobase_methods,             /* tp_methods */\r
+    0,                          /* tp_members */\r
+    iobase_getset,              /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(iobase, dict),     /* tp_dictoffset */\r
+    0,                          /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\r
+\r
+/*\r
+ * RawIOBase class, Inherits from IOBase.\r
+ */\r
+PyDoc_STRVAR(rawiobase_doc,\r
+             "Base class for raw binary I/O.");\r
+\r
+/*\r
+ * The read() method is implemented by calling readinto(); derived classes\r
+ * that want to support read() only need to implement readinto() as a\r
+ * primitive operation.  In general, readinto() can be more efficient than\r
+ * read().\r
+ *\r
+ * (It would be tempting to also provide an implementation of readinto() in\r
+ * terms of read(), in case the latter is a more suitable primitive operation,\r
+ * but that would lead to nasty recursion in case a subclass doesn't implement\r
+ * either.)\r
+*/\r
+\r
+static PyObject *\r
+rawiobase_read(PyObject *self, PyObject *args)\r
+{\r
+    Py_ssize_t n = -1;\r
+    PyObject *b, *res;\r
+\r
+    if (!PyArg_ParseTuple(args, "|n:read", &n)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (n < 0)\r
+        return PyObject_CallMethod(self, "readall", NULL);\r
+\r
+    /* TODO: allocate a bytes object directly instead and manually construct\r
+       a writable memoryview pointing to it. */\r
+    b = PyByteArray_FromStringAndSize(NULL, n);\r
+    if (b == NULL)\r
+        return NULL;\r
+\r
+    res = PyObject_CallMethodObjArgs(self, _PyIO_str_readinto, b, NULL);\r
+    if (res == NULL || res == Py_None) {\r
+        Py_DECREF(b);\r
+        return res;\r
+    }\r
+\r
+    n = PyNumber_AsSsize_t(res, PyExc_ValueError);\r
+    Py_DECREF(res);\r
+    if (n == -1 && PyErr_Occurred()) {\r
+        Py_DECREF(b);\r
+        return NULL;\r
+    }\r
+\r
+    res = PyBytes_FromStringAndSize(PyByteArray_AsString(b), n);\r
+    Py_DECREF(b);\r
+    return res;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(rawiobase_readall_doc,\r
+             "Read until EOF, using multiple read() call.");\r
+\r
+static PyObject *\r
+rawiobase_readall(PyObject *self, PyObject *args)\r
+{\r
+    int r;\r
+    PyObject *chunks = PyList_New(0);\r
+    PyObject *result;\r
+    \r
+    if (chunks == NULL)\r
+        return NULL;\r
+\r
+    while (1) {\r
+        PyObject *data = PyObject_CallMethod(self, "read",\r
+                                             "i", DEFAULT_BUFFER_SIZE);\r
+        if (!data) {\r
+            /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()\r
+               when EINTR occurs so we needn't do it ourselves. */\r
+            if (_PyIO_trap_eintr()) {\r
+                continue;\r
+            }\r
+            Py_DECREF(chunks);\r
+            return NULL;\r
+        }\r
+        if (data == Py_None) {\r
+            if (PyList_GET_SIZE(chunks) == 0) {\r
+                Py_DECREF(chunks);\r
+                return data;\r
+            }\r
+            Py_DECREF(data);\r
+            break;\r
+        }\r
+        if (!PyBytes_Check(data)) {\r
+            Py_DECREF(chunks);\r
+            Py_DECREF(data);\r
+            PyErr_SetString(PyExc_TypeError, "read() should return bytes");\r
+            return NULL;\r
+        }\r
+        if (PyBytes_GET_SIZE(data) == 0) {\r
+            /* EOF */\r
+            Py_DECREF(data);\r
+            break;\r
+        }\r
+        r = PyList_Append(chunks, data);\r
+        Py_DECREF(data);\r
+        if (r < 0) {\r
+            Py_DECREF(chunks);\r
+            return NULL;\r
+        }\r
+    }\r
+    result = _PyBytes_Join(_PyIO_empty_bytes, chunks);\r
+    Py_DECREF(chunks);\r
+    return result;\r
+}\r
+\r
+static PyMethodDef rawiobase_methods[] = {\r
+    {"read", rawiobase_read, METH_VARARGS},\r
+    {"readall", rawiobase_readall, METH_NOARGS, rawiobase_readall_doc},\r
+    {NULL, NULL}\r
+};\r
+\r
+PyTypeObject PyRawIOBase_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io._RawIOBase",                /*tp_name*/\r
+    0,                          /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    0,                          /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/\r
+    rawiobase_doc,              /* tp_doc */\r
+    0,                          /* tp_traverse */\r
+    0,                          /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    0,                          /* tp_weaklistoffset */\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    rawiobase_methods,          /* tp_methods */\r
+    0,                          /* tp_members */\r
+    0,                          /* tp_getset */\r
+    &PyIOBase_Type,             /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    0,                          /* tp_dictoffset */\r
+    0,                          /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    0,                          /* tp_new */\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/stringio.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/stringio.c
new file mode 100644 (file)
index 0000000..605a980
--- /dev/null
@@ -0,0 +1,895 @@
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "_iomodule.h"\r
+\r
+/* Implementation note: the buffer is always at least one character longer\r
+   than the enclosed string, for proper functioning of _PyIO_find_line_ending.\r
+*/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_UNICODE *buf;\r
+    Py_ssize_t pos;\r
+    Py_ssize_t string_size;\r
+    size_t buf_size;\r
+\r
+    char ok; /* initialized? */\r
+    char closed;\r
+    char readuniversal;\r
+    char readtranslate;\r
+    PyObject *decoder;\r
+    PyObject *readnl;\r
+    PyObject *writenl;\r
+    \r
+    PyObject *dict;\r
+    PyObject *weakreflist;\r
+} stringio;\r
+\r
+#define CHECK_INITIALIZED(self) \\r
+    if (self->ok <= 0) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+            "I/O operation on uninitialized object"); \\r
+        return NULL; \\r
+    }\r
+\r
+#define CHECK_CLOSED(self) \\r
+    if (self->closed) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+            "I/O operation on closed file"); \\r
+        return NULL; \\r
+    }\r
+\r
+PyDoc_STRVAR(stringio_doc,\r
+    "Text I/O implementation using an in-memory buffer.\n"\r
+    "\n"\r
+    "The initial_value argument sets the value of object.  The newline\n"\r
+    "argument is like the one of TextIOWrapper's constructor.");\r
+\r
+\r
+/* Internal routine for changing the size, in terms of characters, of the\r
+   buffer of StringIO objects.  The caller should ensure that the 'size'\r
+   argument is non-negative.  Returns 0 on success, -1 otherwise. */\r
+static int\r
+resize_buffer(stringio *self, size_t size)\r
+{\r
+    /* Here, unsigned types are used to avoid dealing with signed integer\r
+       overflow, which is undefined in C. */\r
+    size_t alloc = self->buf_size;\r
+    Py_UNICODE *new_buf = NULL;\r
+\r
+    assert(self->buf != NULL);\r
+\r
+    /* Reserve one more char for line ending detection. */\r
+    size = size + 1;\r
+    /* For simplicity, stay in the range of the signed type. Anyway, Python\r
+       doesn't allow strings to be longer than this. */\r
+    if (size > PY_SSIZE_T_MAX)\r
+        goto overflow;\r
+\r
+    if (size < alloc / 2) {\r
+        /* Major downsize; resize down to exact size. */\r
+        alloc = size + 1;\r
+    }\r
+    else if (size < alloc) {\r
+        /* Within allocated size; quick exit */\r
+        return 0;\r
+    }\r
+    else if (size <= alloc * 1.125) {\r
+        /* Moderate upsize; overallocate similar to list_resize() */\r
+        alloc = size + (size >> 3) + (size < 9 ? 3 : 6);\r
+    }\r
+    else {\r
+        /* Major upsize; resize up to exact size */\r
+        alloc = size + 1;\r
+    }\r
+\r
+    if (alloc > ((size_t)-1) / sizeof(Py_UNICODE))\r
+        goto overflow;\r
+    new_buf = (Py_UNICODE *)PyMem_Realloc(self->buf,\r
+                                          alloc * sizeof(Py_UNICODE));\r
+    if (new_buf == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    self->buf_size = alloc;\r
+    self->buf = new_buf;\r
+\r
+    return 0;\r
+\r
+  overflow:\r
+    PyErr_SetString(PyExc_OverflowError,\r
+                    "new buffer size too large");\r
+    return -1;\r
+}\r
+\r
+/* Internal routine for writing a whole PyUnicode object to the buffer of a\r
+   StringIO object. Returns 0 on success, or -1 on error. */\r
+static Py_ssize_t\r
+write_str(stringio *self, PyObject *obj)\r
+{\r
+    Py_UNICODE *str;\r
+    Py_ssize_t len;\r
+    PyObject *decoded = NULL;\r
+    assert(self->buf != NULL);\r
+    assert(self->pos >= 0);\r
+\r
+    if (self->decoder != NULL) {\r
+        decoded = _PyIncrementalNewlineDecoder_decode(\r
+            self->decoder, obj, 1 /* always final */);\r
+    }\r
+    else {\r
+        decoded = obj;\r
+        Py_INCREF(decoded);\r
+    }\r
+    if (self->writenl) {\r
+        PyObject *translated = PyUnicode_Replace(\r
+            decoded, _PyIO_str_nl, self->writenl, -1);\r
+        Py_DECREF(decoded);\r
+        decoded = translated;\r
+    }\r
+    if (decoded == NULL)\r
+        return -1;\r
+\r
+    assert(PyUnicode_Check(decoded));\r
+    str = PyUnicode_AS_UNICODE(decoded);\r
+    len = PyUnicode_GET_SIZE(decoded);\r
+\r
+    assert(len >= 0);\r
+\r
+    /* This overflow check is not strictly necessary. However, it avoids us to\r
+       deal with funky things like comparing an unsigned and a signed\r
+       integer. */\r
+    if (self->pos > PY_SSIZE_T_MAX - len) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "new position too large");\r
+        goto fail;\r
+    }\r
+    if (self->pos + len > self->string_size) {\r
+        if (resize_buffer(self, self->pos + len) < 0)\r
+            goto fail;\r
+    }\r
+\r
+    if (self->pos > self->string_size) {\r
+        /* In case of overseek, pad with null bytes the buffer region between\r
+           the end of stream and the current position.\r
+\r
+          0   lo      string_size                           hi\r
+          |   |<---used--->|<----------available----------->|\r
+          |   |            <--to pad-->|<---to write--->    |\r
+          0   buf                   position\r
+\r
+        */\r
+        memset(self->buf + self->string_size, '\0',\r
+               (self->pos - self->string_size) * sizeof(Py_UNICODE));\r
+    }\r
+\r
+    /* Copy the data to the internal buffer, overwriting some of the\r
+       existing data if self->pos < self->string_size. */\r
+    memcpy(self->buf + self->pos, str, len * sizeof(Py_UNICODE));\r
+    self->pos += len;\r
+\r
+    /* Set the new length of the internal string if it has changed. */\r
+    if (self->string_size < self->pos) {\r
+        self->string_size = self->pos;\r
+    }\r
+\r
+    Py_DECREF(decoded);\r
+    return 0;\r
+\r
+fail:\r
+    Py_XDECREF(decoded);\r
+    return -1;\r
+}\r
+\r
+PyDoc_STRVAR(stringio_getvalue_doc,\r
+    "Retrieve the entire contents of the object.");\r
+\r
+static PyObject *\r
+stringio_getvalue(stringio *self)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    return PyUnicode_FromUnicode(self->buf, self->string_size);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_tell_doc,\r
+    "Tell the current file position.");\r
+\r
+static PyObject *\r
+stringio_tell(stringio *self)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    return PyLong_FromSsize_t(self->pos);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_read_doc,\r
+    "Read at most n characters, returned as a string.\n"\r
+    "\n"\r
+    "If the argument is negative or omitted, read until EOF\n"\r
+    "is reached. Return an empty string at EOF.\n");\r
+\r
+static PyObject *\r
+stringio_read(stringio *self, PyObject *args)\r
+{\r
+    Py_ssize_t size, n;\r
+    Py_UNICODE *output;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    if (!PyArg_ParseTuple(args, "|O:read", &arg))\r
+        return NULL;\r
+    CHECK_CLOSED(self);\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        size = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (size == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* Read until EOF is reached, by default. */\r
+        size = -1;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    /* adjust invalid sizes */\r
+    n = self->string_size - self->pos;\r
+    if (size < 0 || size > n) {\r
+        size = n;\r
+        if (size < 0)\r
+            size = 0;\r
+    }\r
+\r
+    output = self->buf + self->pos;\r
+    self->pos += size;\r
+    return PyUnicode_FromUnicode(output, size);\r
+}\r
+\r
+/* Internal helper, used by stringio_readline and stringio_iternext */\r
+static PyObject *\r
+_stringio_readline(stringio *self, Py_ssize_t limit)\r
+{\r
+    Py_UNICODE *start, *end, old_char;\r
+    Py_ssize_t len, consumed;\r
+\r
+    /* In case of overseek, return the empty string */\r
+    if (self->pos >= self->string_size)\r
+        return PyUnicode_FromString("");\r
+\r
+    start = self->buf + self->pos;\r
+    if (limit < 0 || limit > self->string_size - self->pos)\r
+        limit = self->string_size - self->pos;\r
+\r
+    end = start + limit;\r
+    old_char = *end;\r
+    *end = '\0';\r
+    len = _PyIO_find_line_ending(\r
+        self->readtranslate, self->readuniversal, self->readnl,\r
+        start, end, &consumed);\r
+    *end = old_char;\r
+    /* If we haven't found any line ending, we just return everything\r
+       (`consumed` is ignored). */\r
+    if (len < 0)\r
+        len = limit;\r
+    self->pos += len;\r
+    return PyUnicode_FromUnicode(start, len);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_readline_doc,\r
+    "Read until newline or EOF.\n"\r
+    "\n"\r
+    "Returns an empty string if EOF is hit immediately.\n");\r
+\r
+static PyObject *\r
+stringio_readline(stringio *self, PyObject *args)\r
+{\r
+    PyObject *arg = Py_None;\r
+    Py_ssize_t limit = -1;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    if (!PyArg_ParseTuple(args, "|O:readline", &arg))\r
+        return NULL;\r
+    CHECK_CLOSED(self);\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        limit = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (limit == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg != Py_None) {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+    return _stringio_readline(self, limit);\r
+}\r
+\r
+static PyObject *\r
+stringio_iternext(stringio *self)\r
+{\r
+    PyObject *line;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+\r
+    if (Py_TYPE(self) == &PyStringIO_Type) {\r
+        /* Skip method call overhead for speed */\r
+        line = _stringio_readline(self, -1);\r
+    }\r
+    else {\r
+        /* XXX is subclassing StringIO really supported? */\r
+        line = PyObject_CallMethodObjArgs((PyObject *)self,\r
+                                           _PyIO_str_readline, NULL);\r
+        if (line && !PyUnicode_Check(line)) {\r
+            PyErr_Format(PyExc_IOError,\r
+                         "readline() should have returned an str object, "\r
+                         "not '%.200s'", Py_TYPE(line)->tp_name);\r
+            Py_DECREF(line);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    if (line == NULL)\r
+        return NULL;\r
+\r
+    if (PyUnicode_GET_SIZE(line) == 0) {\r
+        /* Reached EOF */\r
+        Py_DECREF(line);\r
+        return NULL;\r
+    }\r
+\r
+    return line;\r
+}\r
+\r
+PyDoc_STRVAR(stringio_truncate_doc,\r
+    "Truncate size to pos.\n"\r
+    "\n"\r
+    "The pos argument defaults to the current file position, as\n"\r
+    "returned by tell().  The current file position is unchanged.\n"\r
+    "Returns the new absolute position.\n");\r
+\r
+static PyObject *\r
+stringio_truncate(stringio *self, PyObject *args)\r
+{\r
+    Py_ssize_t size;\r
+    PyObject *arg = Py_None;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    if (!PyArg_ParseTuple(args, "|O:truncate", &arg))\r
+        return NULL;\r
+    CHECK_CLOSED(self);\r
+\r
+    if (PyNumber_Check(arg)) {\r
+        size = PyNumber_AsSsize_t(arg, PyExc_OverflowError);\r
+        if (size == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    else if (arg == Py_None) {\r
+        /* Truncate to current position if no argument is passed. */\r
+        size = self->pos;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError, "integer argument expected, got '%s'",\r
+                     Py_TYPE(arg)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    if (size < 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "Negative size value %zd", size);\r
+        return NULL;\r
+    }\r
+\r
+    if (size < self->string_size) {\r
+        if (resize_buffer(self, size) < 0)\r
+            return NULL;\r
+        self->string_size = size;\r
+    }\r
+\r
+    return PyLong_FromSsize_t(size);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_seek_doc,\r
+    "Change stream position.\n"\r
+    "\n"\r
+    "Seek to character offset pos relative to position indicated by whence:\n"\r
+    "    0  Start of stream (the default).  pos should be >= 0;\n"\r
+    "    1  Current position - pos must be 0;\n"\r
+    "    2  End of stream - pos must be 0.\n"\r
+    "Returns the new absolute position.\n");\r
+\r
+static PyObject *\r
+stringio_seek(stringio *self, PyObject *args)\r
+{\r
+    PyObject *posobj;\r
+    Py_ssize_t pos;\r
+    int mode = 0;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    if (!PyArg_ParseTuple(args, "O|i:seek", &posobj, &mode))\r
+        return NULL;\r
+\r
+    pos = PyNumber_AsSsize_t(posobj, PyExc_OverflowError);\r
+    if (pos == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    \r
+    CHECK_CLOSED(self);\r
+\r
+    if (mode != 0 && mode != 1 && mode != 2) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "Invalid whence (%i, should be 0, 1 or 2)", mode);\r
+        return NULL;\r
+    }\r
+    else if (pos < 0 && mode == 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "Negative seek position %zd", pos);\r
+        return NULL;\r
+    }\r
+    else if (mode != 0 && pos != 0) {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "Can't do nonzero cur-relative seeks");\r
+        return NULL;\r
+    }\r
+\r
+    /* mode 0: offset relative to beginning of the string.\r
+       mode 1: no change to current position.\r
+       mode 2: change position to end of file. */\r
+    if (mode == 1) {\r
+        pos = self->pos;\r
+    }\r
+    else if (mode == 2) {\r
+        pos = self->string_size;\r
+    }\r
+\r
+    self->pos = pos;\r
+\r
+    return PyLong_FromSsize_t(self->pos);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_write_doc,\r
+    "Write string to file.\n"\r
+    "\n"\r
+    "Returns the number of characters written, which is always equal to\n"\r
+    "the length of the string.\n");\r
+\r
+static PyObject *\r
+stringio_write(stringio *self, PyObject *obj)\r
+{\r
+    Py_ssize_t size;\r
+\r
+    CHECK_INITIALIZED(self);\r
+    if (!PyUnicode_Check(obj)) {\r
+        PyErr_Format(PyExc_TypeError, "unicode argument expected, got '%s'",\r
+                     Py_TYPE(obj)->tp_name);\r
+        return NULL;\r
+    }\r
+    CHECK_CLOSED(self);\r
+    size = PyUnicode_GET_SIZE(obj);\r
+\r
+    if (size > 0 && write_str(self, obj) < 0)\r
+        return NULL;\r
+\r
+    return PyLong_FromSsize_t(size);\r
+}\r
+\r
+PyDoc_STRVAR(stringio_close_doc,\r
+    "Close the IO object. Attempting any further operation after the\n"\r
+    "object is closed will raise a ValueError.\n"\r
+    "\n"\r
+    "This method has no effect if the file is already closed.\n");\r
+\r
+static PyObject *\r
+stringio_close(stringio *self)\r
+{\r
+    self->closed = 1;\r
+    /* Free up some memory */\r
+    if (resize_buffer(self, 0) < 0)\r
+        return NULL;\r
+    Py_CLEAR(self->readnl);\r
+    Py_CLEAR(self->writenl);\r
+    Py_CLEAR(self->decoder);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static int\r
+stringio_traverse(stringio *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+stringio_clear(stringio *self)\r
+{\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+static void\r
+stringio_dealloc(stringio *self)\r
+{\r
+    _PyObject_GC_UNTRACK(self);\r
+    self->ok = 0;\r
+    if (self->buf) {\r
+        PyMem_Free(self->buf);\r
+        self->buf = NULL;\r
+    }\r
+    Py_CLEAR(self->readnl);\r
+    Py_CLEAR(self->writenl);\r
+    Py_CLEAR(self->decoder);\r
+    Py_CLEAR(self->dict);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) self);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static PyObject *\r
+stringio_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    stringio *self;\r
+\r
+    assert(type != NULL && type->tp_alloc != NULL);\r
+    self = (stringio *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    /* tp_alloc initializes all the fields to zero. So we don't have to\r
+       initialize them here. */\r
+\r
+    self->buf = (Py_UNICODE *)PyMem_Malloc(0);\r
+    if (self->buf == NULL) {\r
+        Py_DECREF(self);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    return (PyObject *)self;\r
+}\r
+\r
+static int\r
+stringio_init(stringio *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"initial_value", "newline", NULL};\r
+    PyObject *value = NULL;\r
+    char *newline = "\n";\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oz:__init__", kwlist,\r
+                                     &value, &newline))\r
+        return -1;\r
+\r
+    if (newline && newline[0] != '\0'\r
+        && !(newline[0] == '\n' && newline[1] == '\0')\r
+        && !(newline[0] == '\r' && newline[1] == '\0')\r
+        && !(newline[0] == '\r' && newline[1] == '\n' && newline[2] == '\0')) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "illegal newline value: %s", newline);\r
+        return -1;\r
+    }\r
+    if (value && value != Py_None && !PyUnicode_Check(value)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "initial_value must be unicode or None, not %.200s",\r
+                     Py_TYPE(value)->tp_name);\r
+        return -1;\r
+    }\r
+\r
+    self->ok = 0;\r
+\r
+    Py_CLEAR(self->readnl);\r
+    Py_CLEAR(self->writenl);\r
+    Py_CLEAR(self->decoder);\r
+\r
+    if (newline) {\r
+        self->readnl = PyString_FromString(newline);\r
+        if (self->readnl == NULL)\r
+            return -1;\r
+    }\r
+    self->readuniversal = (newline == NULL || newline[0] == '\0');\r
+    self->readtranslate = (newline == NULL);\r
+    /* If newline == "", we don't translate anything.\r
+       If newline == "\n" or newline == None, we translate to "\n", which is\r
+       a no-op.\r
+       (for newline == None, TextIOWrapper translates to os.sepline, but it\r
+       is pointless for StringIO)\r
+    */\r
+    if (newline != NULL && newline[0] == '\r') {\r
+        self->writenl = PyUnicode_FromString(newline);\r
+    }\r
+\r
+    if (self->readuniversal) {\r
+        self->decoder = PyObject_CallFunction(\r
+            (PyObject *)&PyIncrementalNewlineDecoder_Type,\r
+            "Oi", Py_None, (int) self->readtranslate);\r
+        if (self->decoder == NULL)\r
+            return -1;\r
+    }\r
+\r
+    /* Now everything is set up, resize buffer to size of initial value,\r
+       and copy it */\r
+    self->string_size = 0;\r
+    if (value && value != Py_None) {\r
+        Py_ssize_t len = PyUnicode_GetSize(value);\r
+        /* This is a heuristic, for newline translation might change\r
+           the string length. */\r
+        if (resize_buffer(self, len) < 0)\r
+            return -1;\r
+        self->pos = 0;\r
+        if (write_str(self, value) < 0)\r
+            return -1;\r
+    }\r
+    else {\r
+        if (resize_buffer(self, 0) < 0)\r
+            return -1;\r
+    }\r
+    self->pos = 0;\r
+\r
+    self->closed = 0;\r
+    self->ok = 1;\r
+    return 0;\r
+}\r
+\r
+/* Properties and pseudo-properties */\r
+\r
+PyDoc_STRVAR(stringio_readable_doc,\r
+"readable() -> bool. Returns True if the IO object can be read.");\r
+\r
+PyDoc_STRVAR(stringio_writable_doc,\r
+"writable() -> bool. Returns True if the IO object can be written.");\r
+\r
+PyDoc_STRVAR(stringio_seekable_doc,\r
+"seekable() -> bool. Returns True if the IO object can be seeked.");\r
+\r
+static PyObject *\r
+stringio_seekable(stringio *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_TRUE;\r
+}\r
+\r
+static PyObject *\r
+stringio_readable(stringio *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_TRUE;\r
+}\r
+\r
+static PyObject *\r
+stringio_writable(stringio *self, PyObject *args)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_TRUE;\r
+}\r
+\r
+/* Pickling support.\r
+\r
+   The implementation of __getstate__ is similar to the one for BytesIO,\r
+   except that we also save the newline parameter. For __setstate__ and unlike\r
+   BytesIO, we call __init__ to restore the object's state. Doing so allows us\r
+   to avoid decoding the complex newline state while keeping the object\r
+   representation compact.\r
+\r
+   See comment in bytesio.c regarding why only pickle protocols and onward are\r
+   supported.\r
+*/\r
+\r
+static PyObject *\r
+stringio_getstate(stringio *self)\r
+{\r
+    PyObject *initvalue = stringio_getvalue(self);\r
+    PyObject *dict;\r
+    PyObject *state;\r
+\r
+    if (initvalue == NULL)\r
+        return NULL;\r
+    if (self->dict == NULL) {\r
+        Py_INCREF(Py_None);\r
+        dict = Py_None;\r
+    }\r
+    else {\r
+        dict = PyDict_Copy(self->dict);\r
+        if (dict == NULL)\r
+            return NULL;\r
+    }\r
+\r
+    state = Py_BuildValue("(OOnN)", initvalue,\r
+                          self->readnl ? self->readnl : Py_None,\r
+                          self->pos, dict);\r
+    Py_DECREF(initvalue);\r
+    return state;\r
+}\r
+\r
+static PyObject *\r
+stringio_setstate(stringio *self, PyObject *state)\r
+{\r
+    PyObject *initarg;\r
+    PyObject *position_obj;\r
+    PyObject *dict;\r
+    Py_ssize_t pos;\r
+\r
+    assert(state != NULL);\r
+    CHECK_CLOSED(self);\r
+\r
+    /* We allow the state tuple to be longer than 4, because we may need\r
+       someday to extend the object's state without breaking\r
+       backward-compatibility. */\r
+    if (!PyTuple_Check(state) || Py_SIZE(state) < 4) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "%.200s.__setstate__ argument should be 4-tuple, got %.200s",\r
+                     Py_TYPE(self)->tp_name, Py_TYPE(state)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    /* Initialize the object's state. */\r
+    initarg = PyTuple_GetSlice(state, 0, 2);\r
+    if (initarg == NULL)\r
+        return NULL;\r
+    if (stringio_init(self, initarg, NULL) < 0) {\r
+        Py_DECREF(initarg);\r
+        return NULL;\r
+    }\r
+    Py_DECREF(initarg);\r
+\r
+    /* Restore the buffer state. Even if __init__ did initialize the buffer,\r
+       we have to initialize it again since __init__ may translates the\r
+       newlines in the inital_value string. We clearly do not want that\r
+       because the string value in the state tuple has already been translated\r
+       once by __init__. So we do not take any chance and replace object's\r
+       buffer completely. */\r
+    {\r
+        Py_UNICODE *buf = PyUnicode_AS_UNICODE(PyTuple_GET_ITEM(state, 0));\r
+        Py_ssize_t bufsize = PyUnicode_GET_SIZE(PyTuple_GET_ITEM(state, 0));\r
+        if (resize_buffer(self, bufsize) < 0)\r
+            return NULL;\r
+        memcpy(self->buf, buf, bufsize * sizeof(Py_UNICODE));\r
+        self->string_size = bufsize;\r
+    }\r
+\r
+    /* Set carefully the position value. Alternatively, we could use the seek\r
+       method instead of modifying self->pos directly to better protect the\r
+       object internal state against errneous (or malicious) inputs. */\r
+    position_obj = PyTuple_GET_ITEM(state, 2);\r
+    if (!PyIndex_Check(position_obj)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "third item of state must be an integer, got %.200s",\r
+                     Py_TYPE(position_obj)->tp_name);\r
+        return NULL;\r
+    }\r
+    pos = PyNumber_AsSsize_t(position_obj, PyExc_OverflowError);\r
+    if (pos == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (pos < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "position value cannot be negative");\r
+        return NULL;\r
+    }\r
+    self->pos = pos;\r
+\r
+    /* Set the dictionary of the instance variables. */\r
+    dict = PyTuple_GET_ITEM(state, 3);\r
+    if (dict != Py_None) {\r
+        if (!PyDict_Check(dict)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "fourth item of state should be a dict, got a %.200s",\r
+                         Py_TYPE(dict)->tp_name);\r
+            return NULL;\r
+        }\r
+        if (self->dict) {\r
+            /* Alternatively, we could replace the internal dictionary\r
+               completely. However, it seems more practical to just update it. */\r
+            if (PyDict_Update(self->dict, dict) < 0)\r
+                return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(dict);\r
+            self->dict = dict;\r
+        }\r
+    }\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+\r
+static PyObject *\r
+stringio_closed(stringio *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    return PyBool_FromLong(self->closed);\r
+}\r
+\r
+static PyObject *\r
+stringio_line_buffering(stringio *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    Py_RETURN_FALSE;\r
+}\r
+\r
+static PyObject *\r
+stringio_newlines(stringio *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    CHECK_CLOSED(self);\r
+    if (self->decoder == NULL)\r
+        Py_RETURN_NONE;\r
+    return PyObject_GetAttr(self->decoder, _PyIO_str_newlines);\r
+}\r
+\r
+static struct PyMethodDef stringio_methods[] = {\r
+    {"close",    (PyCFunction)stringio_close,    METH_NOARGS,  stringio_close_doc},\r
+    {"getvalue", (PyCFunction)stringio_getvalue, METH_NOARGS,  stringio_getvalue_doc},\r
+    {"read",     (PyCFunction)stringio_read,     METH_VARARGS, stringio_read_doc},\r
+    {"readline", (PyCFunction)stringio_readline, METH_VARARGS, stringio_readline_doc},\r
+    {"tell",     (PyCFunction)stringio_tell,     METH_NOARGS,  stringio_tell_doc},\r
+    {"truncate", (PyCFunction)stringio_truncate, METH_VARARGS, stringio_truncate_doc},\r
+    {"seek",     (PyCFunction)stringio_seek,     METH_VARARGS, stringio_seek_doc},\r
+    {"write",    (PyCFunction)stringio_write,    METH_O,       stringio_write_doc},\r
+\r
+    {"seekable", (PyCFunction)stringio_seekable, METH_NOARGS, stringio_seekable_doc},\r
+    {"readable", (PyCFunction)stringio_readable, METH_NOARGS, stringio_readable_doc},\r
+    {"writable", (PyCFunction)stringio_writable, METH_NOARGS, stringio_writable_doc},\r
+\r
+    {"__getstate__", (PyCFunction)stringio_getstate, METH_NOARGS},\r
+    {"__setstate__", (PyCFunction)stringio_setstate, METH_O},\r
+    {NULL, NULL}        /* sentinel */\r
+};\r
+\r
+static PyGetSetDef stringio_getset[] = {\r
+    {"closed",         (getter)stringio_closed,         NULL, NULL},\r
+    {"newlines",       (getter)stringio_newlines,       NULL, NULL},\r
+    /*  (following comments straight off of the original Python wrapper:)\r
+        XXX Cruft to support the TextIOWrapper API. This would only\r
+        be meaningful if StringIO supported the buffer attribute.\r
+        Hopefully, a better solution, than adding these pseudo-attributes,\r
+        will be found.\r
+    */\r
+    {"line_buffering", (getter)stringio_line_buffering, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+PyTypeObject PyStringIO_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.StringIO",                            /*tp_name*/\r
+    sizeof(stringio),                    /*tp_basicsize*/\r
+    0,                                         /*tp_itemsize*/\r
+    (destructor)stringio_dealloc,              /*tp_dealloc*/\r
+    0,                                         /*tp_print*/\r
+    0,                                         /*tp_getattr*/\r
+    0,                                         /*tp_setattr*/\r
+    0,                                         /*tp_reserved*/\r
+    0,                                         /*tp_repr*/\r
+    0,                                         /*tp_as_number*/\r
+    0,                                         /*tp_as_sequence*/\r
+    0,                                         /*tp_as_mapping*/\r
+    0,                                         /*tp_hash*/\r
+    0,                                         /*tp_call*/\r
+    0,                                         /*tp_str*/\r
+    0,                                         /*tp_getattro*/\r
+    0,                                         /*tp_setattro*/\r
+    0,                                         /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+                       | Py_TPFLAGS_HAVE_GC,   /*tp_flags*/\r
+    stringio_doc,                              /*tp_doc*/\r
+    (traverseproc)stringio_traverse,           /*tp_traverse*/\r
+    (inquiry)stringio_clear,                   /*tp_clear*/\r
+    0,                                         /*tp_richcompare*/\r
+    offsetof(stringio, weakreflist),            /*tp_weaklistoffset*/\r
+    0,                                         /*tp_iter*/\r
+    (iternextfunc)stringio_iternext,           /*tp_iternext*/\r
+    stringio_methods,                          /*tp_methods*/\r
+    0,                                         /*tp_members*/\r
+    stringio_getset,                           /*tp_getset*/\r
+    0,                                         /*tp_base*/\r
+    0,                                         /*tp_dict*/\r
+    0,                                         /*tp_descr_get*/\r
+    0,                                         /*tp_descr_set*/\r
+    offsetof(stringio, dict),                  /*tp_dictoffset*/\r
+    (initproc)stringio_init,                   /*tp_init*/\r
+    0,                                         /*tp_alloc*/\r
+    stringio_new,                              /*tp_new*/\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/textio.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_io/textio.c
new file mode 100644 (file)
index 0000000..ea42af0
--- /dev/null
@@ -0,0 +1,2670 @@
+/*\r
+    An implementation of Text I/O as defined by PEP 3116 - "New I/O"\r
+\r
+    Classes defined here: TextIOBase, IncrementalNewlineDecoder, TextIOWrapper.\r
+\r
+    Written by Amaury Forgeot d'Arc and Antoine Pitrou\r
+*/\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "_iomodule.h"\r
+\r
+/* TextIOBase */\r
+\r
+PyDoc_STRVAR(textiobase_doc,\r
+    "Base class for text I/O.\n"\r
+    "\n"\r
+    "This class provides a character and line based interface to stream\n"\r
+    "I/O. There is no readinto method because Python's character strings\n"\r
+    "are immutable. There is no public constructor.\n"\r
+    );\r
+\r
+static PyObject *\r
+_unsupported(const char *message)\r
+{\r
+    PyErr_SetString(_PyIO_unsupported_operation, message);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_detach_doc,\r
+    "Separate the underlying buffer from the TextIOBase and return it.\n"\r
+    "\n"\r
+    "After the underlying buffer has been detached, the TextIO is in an\n"\r
+    "unusable state.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_detach(PyObject *self)\r
+{\r
+    return _unsupported("detach");\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_read_doc,\r
+    "Read at most n characters from stream.\n"\r
+    "\n"\r
+    "Read from underlying buffer until we have n characters or we hit EOF.\n"\r
+    "If n is negative or omitted, read until EOF.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_read(PyObject *self, PyObject *args)\r
+{\r
+    return _unsupported("read");\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_readline_doc,\r
+    "Read until newline or EOF.\n"\r
+    "\n"\r
+    "Returns an empty string if EOF is hit immediately.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_readline(PyObject *self, PyObject *args)\r
+{\r
+    return _unsupported("readline");\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_write_doc,\r
+    "Write string to stream.\n"\r
+    "Returns the number of characters written (which is always equal to\n"\r
+    "the length of the string).\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_write(PyObject *self, PyObject *args)\r
+{\r
+    return _unsupported("write");\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_encoding_doc,\r
+    "Encoding of the text stream.\n"\r
+    "\n"\r
+    "Subclasses should override.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_encoding_get(PyObject *self, void *context)\r
+{\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_newlines_doc,\r
+    "Line endings translated so far.\n"\r
+    "\n"\r
+    "Only line endings translated during reading are considered.\n"\r
+    "\n"\r
+    "Subclasses should override.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_newlines_get(PyObject *self, void *context)\r
+{\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(textiobase_errors_doc,\r
+    "The error setting of the decoder or encoder.\n"\r
+    "\n"\r
+    "Subclasses should override.\n"\r
+    );\r
+\r
+static PyObject *\r
+textiobase_errors_get(PyObject *self, void *context)\r
+{\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+\r
+static PyMethodDef textiobase_methods[] = {\r
+    {"detach", (PyCFunction)textiobase_detach, METH_NOARGS, textiobase_detach_doc},\r
+    {"read", textiobase_read, METH_VARARGS, textiobase_read_doc},\r
+    {"readline", textiobase_readline, METH_VARARGS, textiobase_readline_doc},\r
+    {"write", textiobase_write, METH_VARARGS, textiobase_write_doc},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyGetSetDef textiobase_getset[] = {\r
+    {"encoding", (getter)textiobase_encoding_get, NULL, textiobase_encoding_doc},\r
+    {"newlines", (getter)textiobase_newlines_get, NULL, textiobase_newlines_doc},\r
+    {"errors", (getter)textiobase_errors_get, NULL, textiobase_errors_doc},\r
+    {NULL}\r
+};\r
+\r
+PyTypeObject PyTextIOBase_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io._TextIOBase",          /*tp_name*/\r
+    0,                          /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    0,                          /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/\r
+    textiobase_doc,             /* tp_doc */\r
+    0,                          /* tp_traverse */\r
+    0,                          /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    0,                          /* tp_weaklistoffset */\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    textiobase_methods,         /* tp_methods */\r
+    0,                          /* tp_members */\r
+    textiobase_getset,          /* tp_getset */\r
+    &PyIOBase_Type,             /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    0,                          /* tp_dictoffset */\r
+    0,                          /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    0,                          /* tp_new */\r
+};\r
+\r
+\r
+/* IncrementalNewlineDecoder */\r
+\r
+PyDoc_STRVAR(incrementalnewlinedecoder_doc,\r
+    "Codec used when reading a file in universal newlines mode.  It wraps\n"\r
+    "another incremental decoder, translating \\r\\n and \\r into \\n.  It also\n"\r
+    "records the types of newlines encountered.  When used with\n"\r
+    "translate=False, it ensures that the newline sequence is returned in\n"\r
+    "one piece. When used with decoder=None, it expects unicode strings as\n"\r
+    "decode input and translates newlines without first invoking an external\n"\r
+    "decoder.\n"\r
+    );\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *decoder;\r
+    PyObject *errors;\r
+    signed int pendingcr: 1;\r
+    signed int translate: 1;\r
+    unsigned int seennl: 3;\r
+} nldecoder_object;\r
+\r
+static int\r
+incrementalnewlinedecoder_init(nldecoder_object *self,\r
+                               PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *decoder;\r
+    int translate;\r
+    PyObject *errors = NULL;\r
+    char *kwlist[] = {"decoder", "translate", "errors", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "Oi|O:IncrementalNewlineDecoder",\r
+                                     kwlist, &decoder, &translate, &errors))\r
+        return -1;\r
+\r
+    self->decoder = decoder;\r
+    Py_INCREF(decoder);\r
+\r
+    if (errors == NULL) {\r
+        self->errors = PyUnicode_FromString("strict");\r
+        if (self->errors == NULL)\r
+            return -1;\r
+    }\r
+    else {\r
+        Py_INCREF(errors);\r
+        self->errors = errors;\r
+    }\r
+\r
+    self->translate = translate;\r
+    self->seennl = 0;\r
+    self->pendingcr = 0;\r
+\r
+    return 0;\r
+}\r
+\r
+static void\r
+incrementalnewlinedecoder_dealloc(nldecoder_object *self)\r
+{\r
+    Py_CLEAR(self->decoder);\r
+    Py_CLEAR(self->errors);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static int\r
+check_decoded(PyObject *decoded)\r
+{\r
+    if (decoded == NULL)\r
+        return -1;\r
+    if (!PyUnicode_Check(decoded)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "decoder should return a string result, not '%.200s'",\r
+                     Py_TYPE(decoded)->tp_name);\r
+        Py_DECREF(decoded);\r
+        return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+#define SEEN_CR   1\r
+#define SEEN_LF   2\r
+#define SEEN_CRLF 4\r
+#define SEEN_ALL (SEEN_CR | SEEN_LF | SEEN_CRLF)\r
+\r
+PyObject *\r
+_PyIncrementalNewlineDecoder_decode(PyObject *_self,\r
+                                    PyObject *input, int final)\r
+{\r
+    PyObject *output;\r
+    Py_ssize_t output_len;\r
+    nldecoder_object *self = (nldecoder_object *) _self;\r
+\r
+    if (self->decoder == NULL) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "IncrementalNewlineDecoder.__init__ not called");\r
+        return NULL;\r
+    }\r
+\r
+    /* decode input (with the eventual \r from a previous pass) */\r
+    if (self->decoder != Py_None) {\r
+        output = PyObject_CallMethodObjArgs(self->decoder,\r
+            _PyIO_str_decode, input, final ? Py_True : Py_False, NULL);\r
+    }\r
+    else {\r
+        output = input;\r
+        Py_INCREF(output);\r
+    }\r
+\r
+    if (check_decoded(output) < 0)\r
+        return NULL;\r
+\r
+    output_len = PyUnicode_GET_SIZE(output);\r
+    if (self->pendingcr && (final || output_len > 0)) {\r
+        Py_UNICODE *out;\r
+        PyObject *modified = PyUnicode_FromUnicode(NULL, output_len + 1);\r
+        if (modified == NULL)\r
+            goto error;\r
+        out = PyUnicode_AS_UNICODE(modified);\r
+        out[0] = '\r';\r
+        memcpy(out + 1, PyUnicode_AS_UNICODE(output),\r
+               output_len * sizeof(Py_UNICODE));\r
+        Py_DECREF(output);\r
+        output = modified;\r
+        self->pendingcr = 0;\r
+        output_len++;\r
+    }\r
+\r
+    /* retain last \r even when not translating data:\r
+     * then readline() is sure to get \r\n in one pass\r
+     */\r
+    if (!final) {\r
+        if (output_len > 0\r
+            && PyUnicode_AS_UNICODE(output)[output_len - 1] == '\r') {\r
+\r
+            if (Py_REFCNT(output) == 1) {\r
+                if (PyUnicode_Resize(&output, output_len - 1) < 0)\r
+                    goto error;\r
+            }\r
+            else {\r
+                PyObject *modified = PyUnicode_FromUnicode(\r
+                    PyUnicode_AS_UNICODE(output),\r
+                    output_len - 1);\r
+                if (modified == NULL)\r
+                    goto error;\r
+                Py_DECREF(output);\r
+                output = modified;\r
+            }\r
+            self->pendingcr = 1;\r
+        }\r
+    }\r
+\r
+    /* Record which newlines are read and do newline translation if desired,\r
+       all in one pass. */\r
+    {\r
+        Py_UNICODE *in_str;\r
+        Py_ssize_t len;\r
+        int seennl = self->seennl;\r
+        int only_lf = 0;\r
+\r
+        in_str = PyUnicode_AS_UNICODE(output);\r
+        len = PyUnicode_GET_SIZE(output);\r
+\r
+        if (len == 0)\r
+            return output;\r
+\r
+        /* If, up to now, newlines are consistently \n, do a quick check\r
+           for the \r *byte* with the libc's optimized memchr.\r
+           */\r
+        if (seennl == SEEN_LF || seennl == 0) {\r
+            only_lf = (memchr(in_str, '\r', len * sizeof(Py_UNICODE)) == NULL);\r
+        }\r
+\r
+        if (only_lf) {\r
+            /* If not already seen, quick scan for a possible "\n" character.\r
+               (there's nothing else to be done, even when in translation mode)\r
+            */\r
+            if (seennl == 0 &&\r
+                memchr(in_str, '\n', len * sizeof(Py_UNICODE)) != NULL) {\r
+                Py_UNICODE *s, *end;\r
+                s = in_str;\r
+                end = in_str + len;\r
+                for (;;) {\r
+                    Py_UNICODE c;\r
+                    /* Fast loop for non-control characters */\r
+                    while (*s > '\n')\r
+                        s++;\r
+                    c = *s++;\r
+                    if (c == '\n') {\r
+                        seennl |= SEEN_LF;\r
+                        break;\r
+                    }\r
+                    if (s > end)\r
+                        break;\r
+                }\r
+            }\r
+            /* Finished: we have scanned for newlines, and none of them\r
+               need translating */\r
+        }\r
+        else if (!self->translate) {\r
+            Py_UNICODE *s, *end;\r
+            /* We have already seen all newline types, no need to scan again */\r
+            if (seennl == SEEN_ALL)\r
+                goto endscan;\r
+            s = in_str;\r
+            end = in_str + len;\r
+            for (;;) {\r
+                Py_UNICODE c;\r
+                /* Fast loop for non-control characters */\r
+                while (*s > '\r')\r
+                    s++;\r
+                c = *s++;\r
+                if (c == '\n')\r
+                    seennl |= SEEN_LF;\r
+                else if (c == '\r') {\r
+                    if (*s == '\n') {\r
+                        seennl |= SEEN_CRLF;\r
+                        s++;\r
+                    }\r
+                    else\r
+                        seennl |= SEEN_CR;\r
+                }\r
+                if (s > end)\r
+                    break;\r
+                if (seennl == SEEN_ALL)\r
+                    break;\r
+            }\r
+        endscan:\r
+            ;\r
+        }\r
+        else {\r
+            PyObject *translated = NULL;\r
+            Py_UNICODE *out_str;\r
+            Py_UNICODE *in, *out, *end;\r
+            if (Py_REFCNT(output) != 1) {\r
+                /* We could try to optimize this so that we only do a copy\r
+                   when there is something to translate. On the other hand,\r
+                   most decoders should only output non-shared strings, i.e.\r
+                   translation is done in place. */\r
+                translated = PyUnicode_FromUnicode(NULL, len);\r
+                if (translated == NULL)\r
+                    goto error;\r
+                assert(Py_REFCNT(translated) == 1);\r
+                memcpy(PyUnicode_AS_UNICODE(translated),\r
+                       PyUnicode_AS_UNICODE(output),\r
+                       len * sizeof(Py_UNICODE));\r
+            }\r
+            else {\r
+                translated = output;\r
+            }\r
+            out_str = PyUnicode_AS_UNICODE(translated);\r
+            in = in_str;\r
+            out = out_str;\r
+            end = in_str + len;\r
+            for (;;) {\r
+                Py_UNICODE c;\r
+                /* Fast loop for non-control characters */\r
+                while ((c = *in++) > '\r')\r
+                    *out++ = c;\r
+                if (c == '\n') {\r
+                    *out++ = c;\r
+                    seennl |= SEEN_LF;\r
+                    continue;\r
+                }\r
+                if (c == '\r') {\r
+                    if (*in == '\n') {\r
+                        in++;\r
+                        seennl |= SEEN_CRLF;\r
+                    }\r
+                    else\r
+                        seennl |= SEEN_CR;\r
+                    *out++ = '\n';\r
+                    continue;\r
+                }\r
+                if (in > end)\r
+                    break;\r
+                *out++ = c;\r
+            }\r
+            if (translated != output) {\r
+                Py_DECREF(output);\r
+                output = translated;\r
+            }\r
+            if (out - out_str != len) {\r
+                if (PyUnicode_Resize(&output, out - out_str) < 0)\r
+                    goto error;\r
+            }\r
+        }\r
+        self->seennl |= seennl;\r
+    }\r
+\r
+    return output;\r
+\r
+  error:\r
+    Py_DECREF(output);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+incrementalnewlinedecoder_decode(nldecoder_object *self,\r
+                                 PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"input", "final", NULL};\r
+    PyObject *input;\r
+    int final = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:IncrementalNewlineDecoder",\r
+                                     kwlist, &input, &final))\r
+        return NULL;\r
+    return _PyIncrementalNewlineDecoder_decode((PyObject *) self, input, final);\r
+}\r
+\r
+static PyObject *\r
+incrementalnewlinedecoder_getstate(nldecoder_object *self, PyObject *args)\r
+{\r
+    PyObject *buffer;\r
+    unsigned PY_LONG_LONG flag;\r
+\r
+    if (self->decoder != Py_None) {\r
+        PyObject *state = PyObject_CallMethodObjArgs(self->decoder,\r
+           _PyIO_str_getstate, NULL);\r
+        if (state == NULL)\r
+            return NULL;\r
+        if (!PyArg_Parse(state, "(OK)", &buffer, &flag)) {\r
+            Py_DECREF(state);\r
+            return NULL;\r
+        }\r
+        Py_INCREF(buffer);\r
+        Py_DECREF(state);\r
+    }\r
+    else {\r
+        buffer = PyBytes_FromString("");\r
+        flag = 0;\r
+    }\r
+    flag <<= 1;\r
+    if (self->pendingcr)\r
+        flag |= 1;\r
+    return Py_BuildValue("NK", buffer, flag);\r
+}\r
+\r
+static PyObject *\r
+incrementalnewlinedecoder_setstate(nldecoder_object *self, PyObject *state)\r
+{\r
+    PyObject *buffer;\r
+    unsigned PY_LONG_LONG flag;\r
+\r
+    if (!PyArg_Parse(state, "(OK)", &buffer, &flag))\r
+        return NULL;\r
+\r
+    self->pendingcr = (int) flag & 1;\r
+    flag >>= 1;\r
+\r
+    if (self->decoder != Py_None)\r
+        return PyObject_CallMethod(self->decoder,\r
+                                   "setstate", "((OK))", buffer, flag);\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+incrementalnewlinedecoder_reset(nldecoder_object *self, PyObject *args)\r
+{\r
+    self->seennl = 0;\r
+    self->pendingcr = 0;\r
+    if (self->decoder != Py_None)\r
+        return PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL);\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+incrementalnewlinedecoder_newlines_get(nldecoder_object *self, void *context)\r
+{\r
+    switch (self->seennl) {\r
+    case SEEN_CR:\r
+        return PyUnicode_FromString("\r");\r
+    case SEEN_LF:\r
+        return PyUnicode_FromString("\n");\r
+    case SEEN_CRLF:\r
+        return PyUnicode_FromString("\r\n");\r
+    case SEEN_CR | SEEN_LF:\r
+        return Py_BuildValue("ss", "\r", "\n");\r
+    case SEEN_CR | SEEN_CRLF:\r
+        return Py_BuildValue("ss", "\r", "\r\n");\r
+    case SEEN_LF | SEEN_CRLF:\r
+        return Py_BuildValue("ss", "\n", "\r\n");\r
+    case SEEN_CR | SEEN_LF | SEEN_CRLF:\r
+        return Py_BuildValue("sss", "\r", "\n", "\r\n");\r
+    default:\r
+        Py_RETURN_NONE;\r
+   }\r
+\r
+}\r
+\r
+\r
+static PyMethodDef incrementalnewlinedecoder_methods[] = {\r
+    {"decode", (PyCFunction)incrementalnewlinedecoder_decode, METH_VARARGS|METH_KEYWORDS},\r
+    {"getstate", (PyCFunction)incrementalnewlinedecoder_getstate, METH_NOARGS},\r
+    {"setstate", (PyCFunction)incrementalnewlinedecoder_setstate, METH_O},\r
+    {"reset", (PyCFunction)incrementalnewlinedecoder_reset, METH_NOARGS},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef incrementalnewlinedecoder_getset[] = {\r
+    {"newlines", (getter)incrementalnewlinedecoder_newlines_get, NULL, NULL},\r
+    {NULL}\r
+};\r
+\r
+PyTypeObject PyIncrementalNewlineDecoder_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.IncrementalNewlineDecoder", /*tp_name*/\r
+    sizeof(nldecoder_object), /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)incrementalnewlinedecoder_dealloc, /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tp_setattr*/\r
+    0,                          /*tp_compare */\r
+    0,                          /*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,  /*tp_flags*/\r
+    incrementalnewlinedecoder_doc,          /* tp_doc */\r
+    0,                          /* tp_traverse */\r
+    0,                          /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    0,                          /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    0,                          /* tp_iternext */\r
+    incrementalnewlinedecoder_methods, /* tp_methods */\r
+    0,                          /* tp_members */\r
+    incrementalnewlinedecoder_getset, /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    0,                          /* tp_dictoffset */\r
+    (initproc)incrementalnewlinedecoder_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
+\r
+\r
+/* TextIOWrapper */\r
+\r
+PyDoc_STRVAR(textiowrapper_doc,\r
+    "Character and line based layer over a BufferedIOBase object, buffer.\n"\r
+    "\n"\r
+    "encoding gives the name of the encoding that the stream will be\n"\r
+    "decoded or encoded with. It defaults to locale.getpreferredencoding.\n"\r
+    "\n"\r
+    "errors determines the strictness of encoding and decoding (see the\n"\r
+    "codecs.register) and defaults to \"strict\".\n"\r
+    "\n"\r
+    "newline controls how line endings are handled. It can be None, '',\n"\r
+    "'\\n', '\\r', and '\\r\\n'.  It works as follows:\n"\r
+    "\n"\r
+    "* On input, if newline is None, universal newlines mode is\n"\r
+    "  enabled. Lines in the input can end in '\\n', '\\r', or '\\r\\n', and\n"\r
+    "  these are translated into '\\n' before being returned to the\n"\r
+    "  caller. If it is '', universal newline mode is enabled, but line\n"\r
+    "  endings are returned to the caller untranslated. If it has any of\n"\r
+    "  the other legal values, input lines are only terminated by the given\n"\r
+    "  string, and the line ending is returned to the caller untranslated.\n"\r
+    "\n"\r
+    "* On output, if newline is None, any '\\n' characters written are\n"\r
+    "  translated to the system default line separator, os.linesep. If\n"\r
+    "  newline is '', no translation takes place. If newline is any of the\n"\r
+    "  other legal values, any '\\n' characters written are translated to\n"\r
+    "  the given string.\n"\r
+    "\n"\r
+    "If line_buffering is True, a call to flush is implied when a call to\n"\r
+    "write contains a newline character."\r
+    );\r
+\r
+typedef PyObject *\r
+        (*encodefunc_t)(PyObject *, PyObject *);\r
+\r
+typedef struct\r
+{\r
+    PyObject_HEAD\r
+    int ok; /* initialized? */\r
+    int detached;\r
+    Py_ssize_t chunk_size;\r
+    PyObject *buffer;\r
+    PyObject *encoding;\r
+    PyObject *encoder;\r
+    PyObject *decoder;\r
+    PyObject *readnl;\r
+    PyObject *errors;\r
+    const char *writenl; /* utf-8 encoded, NULL stands for \n */\r
+    char line_buffering;\r
+    char readuniversal;\r
+    char readtranslate;\r
+    char writetranslate;\r
+    char seekable;\r
+    char telling;\r
+    /* Specialized encoding func (see below) */\r
+    encodefunc_t encodefunc;\r
+    /* Whether or not it's the start of the stream */\r
+    char encoding_start_of_stream;\r
+\r
+    /* Reads and writes are internally buffered in order to speed things up.\r
+       However, any read will first flush the write buffer if itsn't empty.\r
+\r
+       Please also note that text to be written is first encoded before being\r
+       buffered. This is necessary so that encoding errors are immediately\r
+       reported to the caller, but it unfortunately means that the\r
+       IncrementalEncoder (whose encode() method is always written in Python)\r
+       becomes a bottleneck for small writes.\r
+    */\r
+    PyObject *decoded_chars;       /* buffer for text returned from decoder */\r
+    Py_ssize_t decoded_chars_used; /* offset into _decoded_chars for read() */\r
+    PyObject *pending_bytes;       /* list of bytes objects waiting to be\r
+                                      written, or NULL */\r
+    Py_ssize_t pending_bytes_count;\r
+    PyObject *snapshot;\r
+    /* snapshot is either None, or a tuple (dec_flags, next_input) where\r
+     * dec_flags is the second (integer) item of the decoder state and\r
+     * next_input is the chunk of input bytes that comes next after the\r
+     * snapshot point.  We use this to reconstruct decoder states in tell().\r
+     */\r
+\r
+    /* Cache raw object if it's a FileIO object */\r
+    PyObject *raw;\r
+\r
+    PyObject *weakreflist;\r
+    PyObject *dict;\r
+} textio;\r
+\r
+\r
+/* A couple of specialized cases in order to bypass the slow incremental\r
+   encoding methods for the most popular encodings. */\r
+\r
+static PyObject *\r
+ascii_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeASCII(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors));\r
+}\r
+\r
+static PyObject *\r
+utf16be_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), 1);\r
+}\r
+\r
+static PyObject *\r
+utf16le_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), -1);\r
+}\r
+\r
+static PyObject *\r
+utf16_encode(textio *self, PyObject *text)\r
+{\r
+    if (!self->encoding_start_of_stream) {\r
+        /* Skip the BOM and use native byte ordering */\r
+#if defined(WORDS_BIGENDIAN)\r
+        return utf16be_encode(self, text);\r
+#else\r
+        return utf16le_encode(self, text);\r
+#endif\r
+    }\r
+    return PyUnicode_EncodeUTF16(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), 0);\r
+}\r
+\r
+static PyObject *\r
+utf32be_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), 1);\r
+}\r
+\r
+static PyObject *\r
+utf32le_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), -1);\r
+}\r
+\r
+static PyObject *\r
+utf32_encode(textio *self, PyObject *text)\r
+{\r
+    if (!self->encoding_start_of_stream) {\r
+        /* Skip the BOM and use native byte ordering */\r
+#if defined(WORDS_BIGENDIAN)\r
+        return utf32be_encode(self, text);\r
+#else\r
+        return utf32le_encode(self, text);\r
+#endif\r
+    }\r
+    return PyUnicode_EncodeUTF32(PyUnicode_AS_UNICODE(text),\r
+                                 PyUnicode_GET_SIZE(text),\r
+                                 PyBytes_AS_STRING(self->errors), 0);\r
+}\r
+\r
+static PyObject *\r
+utf8_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeUTF8(PyUnicode_AS_UNICODE(text),\r
+                                PyUnicode_GET_SIZE(text),\r
+                                PyBytes_AS_STRING(self->errors));\r
+}\r
+\r
+static PyObject *\r
+latin1_encode(textio *self, PyObject *text)\r
+{\r
+    return PyUnicode_EncodeLatin1(PyUnicode_AS_UNICODE(text),\r
+                                  PyUnicode_GET_SIZE(text),\r
+                                  PyBytes_AS_STRING(self->errors));\r
+}\r
+\r
+/* Map normalized encoding names onto the specialized encoding funcs */\r
+\r
+typedef struct {\r
+    const char *name;\r
+    encodefunc_t encodefunc;\r
+} encodefuncentry;\r
+\r
+static encodefuncentry encodefuncs[] = {\r
+    {"ascii",       (encodefunc_t) ascii_encode},\r
+    {"iso8859-1",   (encodefunc_t) latin1_encode},\r
+    {"utf-8",       (encodefunc_t) utf8_encode},\r
+    {"utf-16-be",   (encodefunc_t) utf16be_encode},\r
+    {"utf-16-le",   (encodefunc_t) utf16le_encode},\r
+    {"utf-16",      (encodefunc_t) utf16_encode},\r
+    {"utf-32-be",   (encodefunc_t) utf32be_encode},\r
+    {"utf-32-le",   (encodefunc_t) utf32le_encode},\r
+    {"utf-32",      (encodefunc_t) utf32_encode},\r
+    {NULL, NULL}\r
+};\r
+\r
+\r
+static int\r
+textiowrapper_init(textio *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *kwlist[] = {"buffer", "encoding", "errors",\r
+                      "newline", "line_buffering",\r
+                      NULL};\r
+    PyObject *buffer, *raw;\r
+    char *encoding = NULL;\r
+    char *errors = NULL;\r
+    char *newline = NULL;\r
+    int line_buffering = 0;\r
+\r
+    PyObject *res;\r
+    int r;\r
+\r
+    self->ok = 0;\r
+    self->detached = 0;\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|zzzi:fileio",\r
+                                     kwlist, &buffer, &encoding, &errors,\r
+                                     &newline, &line_buffering))\r
+        return -1;\r
+\r
+    if (newline && newline[0] != '\0'\r
+        && !(newline[0] == '\n' && newline[1] == '\0')\r
+        && !(newline[0] == '\r' && newline[1] == '\0')\r
+        && !(newline[0] == '\r' && newline[1] == '\n' && newline[2] == '\0')) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "illegal newline value: %s", newline);\r
+        return -1;\r
+    }\r
+\r
+    Py_CLEAR(self->buffer);\r
+    Py_CLEAR(self->encoding);\r
+    Py_CLEAR(self->encoder);\r
+    Py_CLEAR(self->decoder);\r
+    Py_CLEAR(self->readnl);\r
+    Py_CLEAR(self->decoded_chars);\r
+    Py_CLEAR(self->pending_bytes);\r
+    Py_CLEAR(self->snapshot);\r
+    Py_CLEAR(self->errors);\r
+    Py_CLEAR(self->raw);\r
+    self->decoded_chars_used = 0;\r
+    self->pending_bytes_count = 0;\r
+    self->encodefunc = NULL;\r
+    self->writenl = NULL;\r
+\r
+    if (encoding == NULL && self->encoding == NULL) {\r
+        if (_PyIO_locale_module == NULL) {\r
+            _PyIO_locale_module = PyImport_ImportModule("locale");\r
+            if (_PyIO_locale_module == NULL)\r
+                goto catch_ImportError;\r
+            else\r
+                goto use_locale;\r
+        }\r
+        else {\r
+          use_locale:\r
+            self->encoding = PyObject_CallMethod(\r
+                _PyIO_locale_module, "getpreferredencoding", NULL);\r
+            if (self->encoding == NULL) {\r
+              catch_ImportError:\r
+                /*\r
+                 Importing locale can raise a ImportError because of\r
+                 _functools, and locale.getpreferredencoding can raise a\r
+                 ImportError if _locale is not available.  These will happen\r
+                 during module building.\r
+                */\r
+                if (PyErr_ExceptionMatches(PyExc_ImportError)) {\r
+                    PyErr_Clear();\r
+                    self->encoding = PyString_FromString("ascii");\r
+                }\r
+                else\r
+                    goto error;\r
+            }\r
+            else if (!PyString_Check(self->encoding))\r
+                Py_CLEAR(self->encoding);\r
+        }\r
+    }\r
+    if (self->encoding != NULL)\r
+        encoding = PyString_AsString(self->encoding);\r
+    else if (encoding != NULL) {\r
+        self->encoding = PyString_FromString(encoding);\r
+        if (self->encoding == NULL)\r
+            goto error;\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "could not determine default encoding");\r
+    }\r
+\r
+    if (errors == NULL)\r
+        errors = "strict";\r
+    self->errors = PyBytes_FromString(errors);\r
+    if (self->errors == NULL)\r
+        goto error;\r
+\r
+    self->chunk_size = 8192;\r
+    self->readuniversal = (newline == NULL || newline[0] == '\0');\r
+    self->line_buffering = line_buffering;\r
+    self->readtranslate = (newline == NULL);\r
+    if (newline) {\r
+        self->readnl = PyString_FromString(newline);\r
+        if (self->readnl == NULL)\r
+            return -1;\r
+    }\r
+    self->writetranslate = (newline == NULL || newline[0] != '\0');\r
+    if (!self->readuniversal && self->writetranslate) {\r
+        self->writenl = PyString_AsString(self->readnl);\r
+        if (!strcmp(self->writenl, "\n"))\r
+            self->writenl = NULL;\r
+    }\r
+#ifdef MS_WINDOWS\r
+    else\r
+        self->writenl = "\r\n";\r
+#endif\r
+\r
+    /* Build the decoder object */\r
+    res = PyObject_CallMethod(buffer, "readable", NULL);\r
+    if (res == NULL)\r
+        goto error;\r
+    r = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    if (r == -1)\r
+        goto error;\r
+    if (r == 1) {\r
+        self->decoder = PyCodec_IncrementalDecoder(\r
+            encoding, errors);\r
+        if (self->decoder == NULL)\r
+            goto error;\r
+\r
+        if (self->readuniversal) {\r
+            PyObject *incrementalDecoder = PyObject_CallFunction(\r
+                (PyObject *)&PyIncrementalNewlineDecoder_Type,\r
+                "Oi", self->decoder, (int)self->readtranslate);\r
+            if (incrementalDecoder == NULL)\r
+                goto error;\r
+            Py_CLEAR(self->decoder);\r
+            self->decoder = incrementalDecoder;\r
+        }\r
+    }\r
+\r
+    /* Build the encoder object */\r
+    res = PyObject_CallMethod(buffer, "writable", NULL);\r
+    if (res == NULL)\r
+        goto error;\r
+    r = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    if (r == -1)\r
+        goto error;\r
+    if (r == 1) {\r
+        PyObject *ci;\r
+        self->encoder = PyCodec_IncrementalEncoder(\r
+            encoding, errors);\r
+        if (self->encoder == NULL)\r
+            goto error;\r
+        /* Get the normalized named of the codec */\r
+        ci = _PyCodec_Lookup(encoding);\r
+        if (ci == NULL)\r
+            goto error;\r
+        res = PyObject_GetAttrString(ci, "name");\r
+        Py_DECREF(ci);\r
+        if (res == NULL) {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                goto error;\r
+        }\r
+        else if (PyString_Check(res)) {\r
+            encodefuncentry *e = encodefuncs;\r
+            while (e->name != NULL) {\r
+                if (!strcmp(PyString_AS_STRING(res), e->name)) {\r
+                    self->encodefunc = e->encodefunc;\r
+                    break;\r
+                }\r
+                e++;\r
+            }\r
+        }\r
+        Py_XDECREF(res);\r
+    }\r
+\r
+    self->buffer = buffer;\r
+    Py_INCREF(buffer);\r
+\r
+    if (Py_TYPE(buffer) == &PyBufferedReader_Type ||\r
+        Py_TYPE(buffer) == &PyBufferedWriter_Type ||\r
+        Py_TYPE(buffer) == &PyBufferedRandom_Type) {\r
+        raw = PyObject_GetAttrString(buffer, "raw");\r
+        /* Cache the raw FileIO object to speed up 'closed' checks */\r
+        if (raw == NULL) {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                goto error;\r
+        }\r
+        else if (Py_TYPE(raw) == &PyFileIO_Type)\r
+            self->raw = raw;\r
+        else\r
+            Py_DECREF(raw);\r
+    }\r
+\r
+    res = PyObject_CallMethod(buffer, "seekable", NULL);\r
+    if (res == NULL)\r
+        goto error;\r
+    r = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    if (r < 0)\r
+        goto error;\r
+    self->seekable = self->telling = r;\r
+\r
+    self->encoding_start_of_stream = 0;\r
+    if (self->seekable && self->encoder) {\r
+        PyObject *cookieObj;\r
+        int cmp;\r
+\r
+        self->encoding_start_of_stream = 1;\r
+\r
+        cookieObj = PyObject_CallMethodObjArgs(buffer, _PyIO_str_tell, NULL);\r
+        if (cookieObj == NULL)\r
+            goto error;\r
+\r
+        cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_EQ);\r
+        Py_DECREF(cookieObj);\r
+        if (cmp < 0) {\r
+            goto error;\r
+        }\r
+\r
+        if (cmp == 0) {\r
+            self->encoding_start_of_stream = 0;\r
+            res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_setstate,\r
+                                             _PyIO_zero, NULL);\r
+            if (res == NULL)\r
+                goto error;\r
+            Py_DECREF(res);\r
+        }\r
+    }\r
+\r
+    self->ok = 1;\r
+    return 0;\r
+\r
+  error:\r
+    return -1;\r
+}\r
+\r
+static int\r
+_textiowrapper_clear(textio *self)\r
+{\r
+    if (self->ok && _PyIOBase_finalize((PyObject *) self) < 0)\r
+        return -1;\r
+    self->ok = 0;\r
+    Py_CLEAR(self->buffer);\r
+    Py_CLEAR(self->encoding);\r
+    Py_CLEAR(self->encoder);\r
+    Py_CLEAR(self->decoder);\r
+    Py_CLEAR(self->readnl);\r
+    Py_CLEAR(self->decoded_chars);\r
+    Py_CLEAR(self->pending_bytes);\r
+    Py_CLEAR(self->snapshot);\r
+    Py_CLEAR(self->errors);\r
+    Py_CLEAR(self->raw);\r
+    return 0;\r
+}\r
+\r
+static void\r
+textiowrapper_dealloc(textio *self)\r
+{\r
+    if (_textiowrapper_clear(self) < 0)\r
+        return;\r
+    _PyObject_GC_UNTRACK(self);\r
+    if (self->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *)self);\r
+    Py_CLEAR(self->dict);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static int\r
+textiowrapper_traverse(textio *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->buffer);\r
+    Py_VISIT(self->encoding);\r
+    Py_VISIT(self->encoder);\r
+    Py_VISIT(self->decoder);\r
+    Py_VISIT(self->readnl);\r
+    Py_VISIT(self->decoded_chars);\r
+    Py_VISIT(self->pending_bytes);\r
+    Py_VISIT(self->snapshot);\r
+    Py_VISIT(self->errors);\r
+    Py_VISIT(self->raw);\r
+\r
+    Py_VISIT(self->dict);\r
+    return 0;\r
+}\r
+\r
+static int\r
+textiowrapper_clear(textio *self)\r
+{\r
+    if (_textiowrapper_clear(self) < 0)\r
+        return -1;\r
+    Py_CLEAR(self->dict);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_closed_get(textio *self, void *context);\r
+\r
+/* This macro takes some shortcuts to make the common case faster. */\r
+#define CHECK_CLOSED(self) \\r
+    do { \\r
+        int r; \\r
+        PyObject *_res; \\r
+        if (Py_TYPE(self) == &PyTextIOWrapper_Type) { \\r
+            if (self->raw != NULL) \\r
+                r = _PyFileIO_closed(self->raw); \\r
+            else { \\r
+                _res = textiowrapper_closed_get(self, NULL); \\r
+                if (_res == NULL) \\r
+                    return NULL; \\r
+                r = PyObject_IsTrue(_res); \\r
+                Py_DECREF(_res); \\r
+                if (r < 0) \\r
+                    return NULL; \\r
+            } \\r
+            if (r > 0) { \\r
+                PyErr_SetString(PyExc_ValueError, \\r
+                                "I/O operation on closed file."); \\r
+                return NULL; \\r
+            } \\r
+        } \\r
+        else if (_PyIOBase_check_closed((PyObject *)self, Py_True) == NULL) \\r
+            return NULL; \\r
+    } while (0)\r
+\r
+#define CHECK_INITIALIZED(self) \\r
+    if (self->ok <= 0) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+            "I/O operation on uninitialized object"); \\r
+        return NULL; \\r
+    }\r
+\r
+#define CHECK_ATTACHED(self) \\r
+    CHECK_INITIALIZED(self); \\r
+    if (self->detached) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+             "underlying buffer has been detached"); \\r
+        return NULL; \\r
+    }\r
+\r
+#define CHECK_ATTACHED_INT(self) \\r
+    if (self->ok <= 0) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+            "I/O operation on uninitialized object"); \\r
+        return -1; \\r
+    } else if (self->detached) { \\r
+        PyErr_SetString(PyExc_ValueError, \\r
+             "underlying buffer has been detached"); \\r
+        return -1; \\r
+    }\r
+\r
+\r
+static PyObject *\r
+textiowrapper_detach(textio *self)\r
+{\r
+    PyObject *buffer, *res;\r
+    CHECK_ATTACHED(self);\r
+    res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    Py_DECREF(res);\r
+    buffer = self->buffer;\r
+    self->buffer = NULL;\r
+    self->detached = 1;\r
+    return buffer;\r
+}\r
+\r
+Py_LOCAL_INLINE(const Py_UNICODE *)\r
+findchar(const Py_UNICODE *s, Py_ssize_t size, Py_UNICODE ch)\r
+{\r
+    /* like wcschr, but doesn't stop at NULL characters */\r
+    while (size-- > 0) {\r
+        if (*s == ch)\r
+            return s;\r
+        s++;\r
+    }\r
+    return NULL;\r
+}\r
+\r
+/* Flush the internal write buffer. This doesn't explicitly flush the\r
+   underlying buffered object, though. */\r
+static int\r
+_textiowrapper_writeflush(textio *self)\r
+{\r
+    PyObject *pending, *b, *ret;\r
+\r
+    if (self->pending_bytes == NULL)\r
+        return 0;\r
+\r
+    pending = self->pending_bytes;\r
+    Py_INCREF(pending);\r
+    self->pending_bytes_count = 0;\r
+    Py_CLEAR(self->pending_bytes);\r
+\r
+    b = _PyBytes_Join(_PyIO_empty_bytes, pending);\r
+    Py_DECREF(pending);\r
+    if (b == NULL)\r
+        return -1;\r
+    ret = NULL;\r
+    do {\r
+        ret = PyObject_CallMethodObjArgs(self->buffer,\r
+                                         _PyIO_str_write, b, NULL);\r
+    } while (ret == NULL && _PyIO_trap_eintr());\r
+    Py_DECREF(b);\r
+    if (ret == NULL)\r
+        return -1;\r
+    Py_DECREF(ret);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_write(textio *self, PyObject *args)\r
+{\r
+    PyObject *ret;\r
+    PyObject *text; /* owned reference */\r
+    PyObject *b;\r
+    Py_ssize_t textlen;\r
+    int haslf = 0;\r
+    int needflush = 0;\r
+\r
+    CHECK_ATTACHED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "U:write", &text)) {\r
+        return NULL;\r
+    }\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (self->encoder == NULL) {\r
+        PyErr_SetString(PyExc_IOError, "not writable");\r
+        return NULL;\r
+    }\r
+\r
+    Py_INCREF(text);\r
+\r
+    textlen = PyUnicode_GetSize(text);\r
+\r
+    if ((self->writetranslate && self->writenl != NULL) || self->line_buffering)\r
+        if (findchar(PyUnicode_AS_UNICODE(text),\r
+                     PyUnicode_GET_SIZE(text), '\n'))\r
+            haslf = 1;\r
+\r
+    if (haslf && self->writetranslate && self->writenl != NULL) {\r
+        PyObject *newtext = PyObject_CallMethod(\r
+            text, "replace", "ss", "\n", self->writenl);\r
+        Py_DECREF(text);\r
+        if (newtext == NULL)\r
+            return NULL;\r
+        text = newtext;\r
+    }\r
+\r
+    if (self->line_buffering &&\r
+        (haslf ||\r
+         findchar(PyUnicode_AS_UNICODE(text),\r
+                  PyUnicode_GET_SIZE(text), '\r')))\r
+        needflush = 1;\r
+\r
+    /* XXX What if we were just reading? */\r
+    if (self->encodefunc != NULL) {\r
+        b = (*self->encodefunc)((PyObject *) self, text);\r
+        self->encoding_start_of_stream = 0;\r
+    }\r
+    else\r
+        b = PyObject_CallMethodObjArgs(self->encoder,\r
+                                       _PyIO_str_encode, text, NULL);\r
+    Py_DECREF(text);\r
+    if (b == NULL)\r
+        return NULL;\r
+\r
+    if (self->pending_bytes == NULL) {\r
+        self->pending_bytes = PyList_New(0);\r
+        if (self->pending_bytes == NULL) {\r
+            Py_DECREF(b);\r
+            return NULL;\r
+        }\r
+        self->pending_bytes_count = 0;\r
+    }\r
+    if (PyList_Append(self->pending_bytes, b) < 0) {\r
+        Py_DECREF(b);\r
+        return NULL;\r
+    }\r
+    self->pending_bytes_count += PyBytes_GET_SIZE(b);\r
+    Py_DECREF(b);\r
+    if (self->pending_bytes_count > self->chunk_size || needflush) {\r
+        if (_textiowrapper_writeflush(self) < 0)\r
+            return NULL;\r
+    }\r
+\r
+    if (needflush) {\r
+        ret = PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_flush, NULL);\r
+        if (ret == NULL)\r
+            return NULL;\r
+        Py_DECREF(ret);\r
+    }\r
+\r
+    Py_CLEAR(self->snapshot);\r
+\r
+    if (self->decoder) {\r
+        ret = PyObject_CallMethod(self->decoder, "reset", NULL);\r
+        if (ret == NULL)\r
+            return NULL;\r
+        Py_DECREF(ret);\r
+    }\r
+\r
+    return PyLong_FromSsize_t(textlen);\r
+}\r
+\r
+/* Steal a reference to chars and store it in the decoded_char buffer;\r
+ */\r
+static void\r
+textiowrapper_set_decoded_chars(textio *self, PyObject *chars)\r
+{\r
+    Py_CLEAR(self->decoded_chars);\r
+    self->decoded_chars = chars;\r
+    self->decoded_chars_used = 0;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_get_decoded_chars(textio *self, Py_ssize_t n)\r
+{\r
+    PyObject *chars;\r
+    Py_ssize_t avail;\r
+\r
+    if (self->decoded_chars == NULL)\r
+        return PyUnicode_FromStringAndSize(NULL, 0);\r
+\r
+    avail = (PyUnicode_GET_SIZE(self->decoded_chars)\r
+             - self->decoded_chars_used);\r
+\r
+    assert(avail >= 0);\r
+\r
+    if (n < 0 || n > avail)\r
+        n = avail;\r
+\r
+    if (self->decoded_chars_used > 0 || n < avail) {\r
+        chars = PyUnicode_FromUnicode(\r
+            PyUnicode_AS_UNICODE(self->decoded_chars)\r
+            + self->decoded_chars_used, n);\r
+        if (chars == NULL)\r
+            return NULL;\r
+    }\r
+    else {\r
+        chars = self->decoded_chars;\r
+        Py_INCREF(chars);\r
+    }\r
+\r
+    self->decoded_chars_used += n;\r
+    return chars;\r
+}\r
+\r
+/* Read and decode the next chunk of data from the BufferedReader.\r
+ */\r
+static int\r
+textiowrapper_read_chunk(textio *self)\r
+{\r
+    PyObject *dec_buffer = NULL;\r
+    PyObject *dec_flags = NULL;\r
+    PyObject *input_chunk = NULL;\r
+    PyObject *decoded_chars, *chunk_size;\r
+    int eof;\r
+\r
+    /* The return value is True unless EOF was reached.  The decoded string is\r
+     * placed in self._decoded_chars (replacing its previous value).  The\r
+     * entire input chunk is sent to the decoder, though some of it may remain\r
+     * buffered in the decoder, yet to be converted.\r
+     */\r
+\r
+    if (self->decoder == NULL) {\r
+        PyErr_SetString(PyExc_IOError, "not readable");\r
+        return -1;\r
+    }\r
+\r
+    if (self->telling) {\r
+        /* To prepare for tell(), we need to snapshot a point in the file\r
+         * where the decoder's input buffer is empty.\r
+         */\r
+\r
+        PyObject *state = PyObject_CallMethodObjArgs(self->decoder,\r
+                                                     _PyIO_str_getstate, NULL);\r
+        if (state == NULL)\r
+            return -1;\r
+        /* Given this, we know there was a valid snapshot point\r
+         * len(dec_buffer) bytes ago with decoder state (b'', dec_flags).\r
+         */\r
+        if (PyArg_Parse(state, "(OO)", &dec_buffer, &dec_flags) < 0) {\r
+            Py_DECREF(state);\r
+            return -1;\r
+        }\r
+        Py_INCREF(dec_buffer);\r
+        Py_INCREF(dec_flags);\r
+        Py_DECREF(state);\r
+    }\r
+\r
+    /* Read a chunk, decode it, and put the result in self._decoded_chars. */\r
+    chunk_size = PyLong_FromSsize_t(self->chunk_size);\r
+    if (chunk_size == NULL)\r
+        goto fail;\r
+    input_chunk = PyObject_CallMethodObjArgs(self->buffer,\r
+        _PyIO_str_read1, chunk_size, NULL);\r
+    Py_DECREF(chunk_size);\r
+    if (input_chunk == NULL)\r
+        goto fail;\r
+    if (!PyBytes_Check(input_chunk)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "underlying read1() should have returned a bytes object, "\r
+                     "not '%.200s'", Py_TYPE(input_chunk)->tp_name);\r
+        goto fail;\r
+    }\r
+\r
+    eof = (PyBytes_Size(input_chunk) == 0);\r
+\r
+    if (Py_TYPE(self->decoder) == &PyIncrementalNewlineDecoder_Type) {\r
+        decoded_chars = _PyIncrementalNewlineDecoder_decode(\r
+            self->decoder, input_chunk, eof);\r
+    }\r
+    else {\r
+        decoded_chars = PyObject_CallMethodObjArgs(self->decoder,\r
+            _PyIO_str_decode, input_chunk, eof ? Py_True : Py_False, NULL);\r
+    }\r
+\r
+    if (check_decoded(decoded_chars) < 0)\r
+        goto fail;\r
+    textiowrapper_set_decoded_chars(self, decoded_chars);\r
+    if (PyUnicode_GET_SIZE(decoded_chars) > 0)\r
+        eof = 0;\r
+\r
+    if (self->telling) {\r
+        /* At the snapshot point, len(dec_buffer) bytes before the read, the\r
+         * next input to be decoded is dec_buffer + input_chunk.\r
+         */\r
+        PyObject *next_input = PyNumber_Add(dec_buffer, input_chunk);\r
+        if (next_input == NULL)\r
+            goto fail;\r
+        if (!PyBytes_Check(next_input)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "decoder getstate() should have returned a bytes "\r
+                         "object, not '%.200s'",\r
+                         Py_TYPE(next_input)->tp_name);\r
+            Py_DECREF(next_input);\r
+            goto fail;\r
+        }\r
+        Py_DECREF(dec_buffer);\r
+        Py_CLEAR(self->snapshot);\r
+        self->snapshot = Py_BuildValue("NN", dec_flags, next_input);\r
+    }\r
+    Py_DECREF(input_chunk);\r
+\r
+    return (eof == 0);\r
+\r
+  fail:\r
+    Py_XDECREF(dec_buffer);\r
+    Py_XDECREF(dec_flags);\r
+    Py_XDECREF(input_chunk);\r
+    return -1;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_read(textio *self, PyObject *args)\r
+{\r
+    Py_ssize_t n = -1;\r
+    PyObject *result = NULL, *chunks = NULL;\r
+\r
+    CHECK_ATTACHED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "|O&:read", &_PyIO_ConvertSsize_t, &n))\r
+        return NULL;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (self->decoder == NULL) {\r
+        PyErr_SetString(PyExc_IOError, "not readable");\r
+        return NULL;\r
+    }\r
+\r
+    if (_textiowrapper_writeflush(self) < 0)\r
+        return NULL;\r
+\r
+    if (n < 0) {\r
+        /* Read everything */\r
+        PyObject *bytes = PyObject_CallMethod(self->buffer, "read", NULL);\r
+        PyObject *decoded, *final;\r
+        if (bytes == NULL)\r
+            goto fail;\r
+        decoded = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_decode,\r
+                                             bytes, Py_True, NULL);\r
+        Py_DECREF(bytes);\r
+        if (check_decoded(decoded) < 0)\r
+            goto fail;\r
+\r
+        result = textiowrapper_get_decoded_chars(self, -1);\r
+\r
+        if (result == NULL) {\r
+            Py_DECREF(decoded);\r
+            return NULL;\r
+        }\r
+\r
+        final = PyUnicode_Concat(result, decoded);\r
+        Py_DECREF(result);\r
+        Py_DECREF(decoded);\r
+        if (final == NULL)\r
+            goto fail;\r
+\r
+        Py_CLEAR(self->snapshot);\r
+        return final;\r
+    }\r
+    else {\r
+        int res = 1;\r
+        Py_ssize_t remaining = n;\r
+\r
+        result = textiowrapper_get_decoded_chars(self, n);\r
+        if (result == NULL)\r
+            goto fail;\r
+        remaining -= PyUnicode_GET_SIZE(result);\r
+\r
+        /* Keep reading chunks until we have n characters to return */\r
+        while (remaining > 0) {\r
+            res = textiowrapper_read_chunk(self);\r
+            if (res < 0) {\r
+                /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()\r
+                   when EINTR occurs so we needn't do it ourselves. */\r
+                if (_PyIO_trap_eintr()) {\r
+                    continue;\r
+                }\r
+                goto fail;\r
+            }\r
+            if (res == 0)  /* EOF */\r
+                break;\r
+            if (chunks == NULL) {\r
+                chunks = PyList_New(0);\r
+                if (chunks == NULL)\r
+                    goto fail;\r
+            }\r
+            if (PyList_Append(chunks, result) < 0)\r
+                goto fail;\r
+            Py_DECREF(result);\r
+            result = textiowrapper_get_decoded_chars(self, remaining);\r
+            if (result == NULL)\r
+                goto fail;\r
+            remaining -= PyUnicode_GET_SIZE(result);\r
+        }\r
+        if (chunks != NULL) {\r
+            if (result != NULL && PyList_Append(chunks, result) < 0)\r
+                goto fail;\r
+            Py_CLEAR(result);\r
+            result = PyUnicode_Join(_PyIO_empty_str, chunks);\r
+            if (result == NULL)\r
+                goto fail;\r
+            Py_CLEAR(chunks);\r
+        }\r
+        return result;\r
+    }\r
+  fail:\r
+    Py_XDECREF(result);\r
+    Py_XDECREF(chunks);\r
+    return NULL;\r
+}\r
+\r
+\r
+/* NOTE: `end` must point to the real end of the Py_UNICODE storage,\r
+   that is to the NUL character. Otherwise the function will produce\r
+   incorrect results. */\r
+static Py_UNICODE *\r
+find_control_char(Py_UNICODE *start, Py_UNICODE *end, Py_UNICODE ch)\r
+{\r
+    Py_UNICODE *s = start;\r
+    for (;;) {\r
+        while (*s > ch)\r
+            s++;\r
+        if (*s == ch)\r
+            return s;\r
+        if (s == end)\r
+            return NULL;\r
+        s++;\r
+    }\r
+}\r
+\r
+Py_ssize_t\r
+_PyIO_find_line_ending(\r
+    int translated, int universal, PyObject *readnl,\r
+    Py_UNICODE *start, Py_UNICODE *end, Py_ssize_t *consumed)\r
+{\r
+    Py_ssize_t len = end - start;\r
+\r
+    if (translated) {\r
+        /* Newlines are already translated, only search for \n */\r
+        Py_UNICODE *pos = find_control_char(start, end, '\n');\r
+        if (pos != NULL)\r
+            return pos - start + 1;\r
+        else {\r
+            *consumed = len;\r
+            return -1;\r
+        }\r
+    }\r
+    else if (universal) {\r
+        /* Universal newline search. Find any of \r, \r\n, \n\r
+         * The decoder ensures that \r\n are not split in two pieces\r
+         */\r
+        Py_UNICODE *s = start;\r
+        for (;;) {\r
+            Py_UNICODE ch;\r
+            /* Fast path for non-control chars. The loop always ends\r
+               since the Py_UNICODE storage is NUL-terminated. */\r
+            while (*s > '\r')\r
+                s++;\r
+            if (s >= end) {\r
+                *consumed = len;\r
+                return -1;\r
+            }\r
+            ch = *s++;\r
+            if (ch == '\n')\r
+                return s - start;\r
+            if (ch == '\r') {\r
+                if (*s == '\n')\r
+                    return s - start + 1;\r
+                else\r
+                    return s - start;\r
+            }\r
+        }\r
+    }\r
+    else {\r
+        /* Non-universal mode. */\r
+        Py_ssize_t readnl_len = PyString_GET_SIZE(readnl);\r
+        unsigned char *nl = (unsigned char *) PyString_AS_STRING(readnl);\r
+        if (readnl_len == 1) {\r
+            Py_UNICODE *pos = find_control_char(start, end, nl[0]);\r
+            if (pos != NULL)\r
+                return pos - start + 1;\r
+            *consumed = len;\r
+            return -1;\r
+        }\r
+        else {\r
+            Py_UNICODE *s = start;\r
+            Py_UNICODE *e = end - readnl_len + 1;\r
+            Py_UNICODE *pos;\r
+            if (e < s)\r
+                e = s;\r
+            while (s < e) {\r
+                Py_ssize_t i;\r
+                Py_UNICODE *pos = find_control_char(s, end, nl[0]);\r
+                if (pos == NULL || pos >= e)\r
+                    break;\r
+                for (i = 1; i < readnl_len; i++) {\r
+                    if (pos[i] != nl[i])\r
+                        break;\r
+                }\r
+                if (i == readnl_len)\r
+                    return pos - start + readnl_len;\r
+                s = pos + 1;\r
+            }\r
+            pos = find_control_char(e, end, nl[0]);\r
+            if (pos == NULL)\r
+                *consumed = len;\r
+            else\r
+                *consumed = pos - start;\r
+            return -1;\r
+        }\r
+    }\r
+}\r
+\r
+static PyObject *\r
+_textiowrapper_readline(textio *self, Py_ssize_t limit)\r
+{\r
+    PyObject *line = NULL, *chunks = NULL, *remaining = NULL;\r
+    Py_ssize_t start, endpos, chunked, offset_to_buffer;\r
+    int res;\r
+\r
+    CHECK_CLOSED(self);\r
+\r
+    if (_textiowrapper_writeflush(self) < 0)\r
+        return NULL;\r
+\r
+    chunked = 0;\r
+\r
+    while (1) {\r
+        Py_UNICODE *ptr;\r
+        Py_ssize_t line_len;\r
+        Py_ssize_t consumed = 0;\r
+\r
+        /* First, get some data if necessary */\r
+        res = 1;\r
+        while (!self->decoded_chars ||\r
+               !PyUnicode_GET_SIZE(self->decoded_chars)) {\r
+            res = textiowrapper_read_chunk(self);\r
+            if (res < 0) {\r
+                /* NOTE: PyErr_SetFromErrno() calls PyErr_CheckSignals()\r
+                   when EINTR occurs so we needn't do it ourselves. */\r
+                if (_PyIO_trap_eintr()) {\r
+                    continue;\r
+                }\r
+                goto error;\r
+            }\r
+            if (res == 0)\r
+                break;\r
+        }\r
+        if (res == 0) {\r
+            /* end of file */\r
+            textiowrapper_set_decoded_chars(self, NULL);\r
+            Py_CLEAR(self->snapshot);\r
+            start = endpos = offset_to_buffer = 0;\r
+            break;\r
+        }\r
+\r
+        if (remaining == NULL) {\r
+            line = self->decoded_chars;\r
+            start = self->decoded_chars_used;\r
+            offset_to_buffer = 0;\r
+            Py_INCREF(line);\r
+        }\r
+        else {\r
+            assert(self->decoded_chars_used == 0);\r
+            line = PyUnicode_Concat(remaining, self->decoded_chars);\r
+            start = 0;\r
+            offset_to_buffer = PyUnicode_GET_SIZE(remaining);\r
+            Py_CLEAR(remaining);\r
+            if (line == NULL)\r
+                goto error;\r
+        }\r
+\r
+        ptr = PyUnicode_AS_UNICODE(line);\r
+        line_len = PyUnicode_GET_SIZE(line);\r
+\r
+        endpos = _PyIO_find_line_ending(\r
+            self->readtranslate, self->readuniversal, self->readnl,\r
+            ptr + start, ptr + line_len, &consumed);\r
+        if (endpos >= 0) {\r
+            endpos += start;\r
+            if (limit >= 0 && (endpos - start) + chunked >= limit)\r
+                endpos = start + limit - chunked;\r
+            break;\r
+        }\r
+\r
+        /* We can put aside up to `endpos` */\r
+        endpos = consumed + start;\r
+        if (limit >= 0 && (endpos - start) + chunked >= limit) {\r
+            /* Didn't find line ending, but reached length limit */\r
+            endpos = start + limit - chunked;\r
+            break;\r
+        }\r
+\r
+        if (endpos > start) {\r
+            /* No line ending seen yet - put aside current data */\r
+            PyObject *s;\r
+            if (chunks == NULL) {\r
+                chunks = PyList_New(0);\r
+                if (chunks == NULL)\r
+                    goto error;\r
+            }\r
+            s = PyUnicode_FromUnicode(ptr + start, endpos - start);\r
+            if (s == NULL)\r
+                goto error;\r
+            if (PyList_Append(chunks, s) < 0) {\r
+                Py_DECREF(s);\r
+                goto error;\r
+            }\r
+            chunked += PyUnicode_GET_SIZE(s);\r
+            Py_DECREF(s);\r
+        }\r
+        /* There may be some remaining bytes we'll have to prepend to the\r
+           next chunk of data */\r
+        if (endpos < line_len) {\r
+            remaining = PyUnicode_FromUnicode(\r
+                    ptr + endpos, line_len - endpos);\r
+            if (remaining == NULL)\r
+                goto error;\r
+        }\r
+        Py_CLEAR(line);\r
+        /* We have consumed the buffer */\r
+        textiowrapper_set_decoded_chars(self, NULL);\r
+    }\r
+\r
+    if (line != NULL) {\r
+        /* Our line ends in the current buffer */\r
+        self->decoded_chars_used = endpos - offset_to_buffer;\r
+        if (start > 0 || endpos < PyUnicode_GET_SIZE(line)) {\r
+            if (start == 0 && Py_REFCNT(line) == 1) {\r
+                if (PyUnicode_Resize(&line, endpos) < 0)\r
+                    goto error;\r
+            }\r
+            else {\r
+                PyObject *s = PyUnicode_FromUnicode(\r
+                        PyUnicode_AS_UNICODE(line) + start, endpos - start);\r
+                Py_CLEAR(line);\r
+                if (s == NULL)\r
+                    goto error;\r
+                line = s;\r
+            }\r
+        }\r
+    }\r
+    if (remaining != NULL) {\r
+        if (chunks == NULL) {\r
+            chunks = PyList_New(0);\r
+            if (chunks == NULL)\r
+                goto error;\r
+        }\r
+        if (PyList_Append(chunks, remaining) < 0)\r
+            goto error;\r
+        Py_CLEAR(remaining);\r
+    }\r
+    if (chunks != NULL) {\r
+        if (line != NULL && PyList_Append(chunks, line) < 0)\r
+            goto error;\r
+        Py_CLEAR(line);\r
+        line = PyUnicode_Join(_PyIO_empty_str, chunks);\r
+        if (line == NULL)\r
+            goto error;\r
+        Py_DECREF(chunks);\r
+    }\r
+    if (line == NULL)\r
+        line = PyUnicode_FromStringAndSize(NULL, 0);\r
+\r
+    return line;\r
+\r
+  error:\r
+    Py_XDECREF(chunks);\r
+    Py_XDECREF(remaining);\r
+    Py_XDECREF(line);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_readline(textio *self, PyObject *args)\r
+{\r
+    PyObject *limitobj = NULL;\r
+    Py_ssize_t limit = -1;\r
+\r
+    CHECK_ATTACHED(self);\r
+    if (!PyArg_ParseTuple(args, "|O:readline", &limitobj)) {\r
+        return NULL;\r
+    }\r
+    if (limitobj) {\r
+        if (!PyNumber_Check(limitobj)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "integer argument expected, got '%.200s'",\r
+                         Py_TYPE(limitobj)->tp_name);\r
+            return NULL;\r
+        }\r
+        limit = PyNumber_AsSsize_t(limitobj, PyExc_OverflowError);\r
+        if (limit == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    return _textiowrapper_readline(self, limit);\r
+}\r
+\r
+/* Seek and Tell */\r
+\r
+typedef struct {\r
+    Py_off_t start_pos;\r
+    int dec_flags;\r
+    int bytes_to_feed;\r
+    int chars_to_skip;\r
+    char need_eof;\r
+} cookie_type;\r
+\r
+/*\r
+   To speed up cookie packing/unpacking, we store the fields in a temporary\r
+   string and call _PyLong_FromByteArray() or _PyLong_AsByteArray (resp.).\r
+   The following macros define at which offsets in the intermediary byte\r
+   string the various CookieStruct fields will be stored.\r
+ */\r
+\r
+#define COOKIE_BUF_LEN      (sizeof(Py_off_t) + 3 * sizeof(int) + sizeof(char))\r
+\r
+#if defined(WORDS_BIGENDIAN)\r
+\r
+# define IS_LITTLE_ENDIAN   0\r
+\r
+/* We want the least significant byte of start_pos to also be the least\r
+   significant byte of the cookie, which means that in big-endian mode we\r
+   must copy the fields in reverse order. */\r
+\r
+# define OFF_START_POS      (sizeof(char) + 3 * sizeof(int))\r
+# define OFF_DEC_FLAGS      (sizeof(char) + 2 * sizeof(int))\r
+# define OFF_BYTES_TO_FEED  (sizeof(char) + sizeof(int))\r
+# define OFF_CHARS_TO_SKIP  (sizeof(char))\r
+# define OFF_NEED_EOF       0\r
+\r
+#else\r
+\r
+# define IS_LITTLE_ENDIAN   1\r
+\r
+/* Little-endian mode: the least significant byte of start_pos will\r
+   naturally end up the least significant byte of the cookie. */\r
+\r
+# define OFF_START_POS      0\r
+# define OFF_DEC_FLAGS      (sizeof(Py_off_t))\r
+# define OFF_BYTES_TO_FEED  (sizeof(Py_off_t) + sizeof(int))\r
+# define OFF_CHARS_TO_SKIP  (sizeof(Py_off_t) + 2 * sizeof(int))\r
+# define OFF_NEED_EOF       (sizeof(Py_off_t) + 3 * sizeof(int))\r
+\r
+#endif\r
+\r
+static int\r
+textiowrapper_parse_cookie(cookie_type *cookie, PyObject *cookieObj)\r
+{\r
+    unsigned char buffer[COOKIE_BUF_LEN];\r
+    PyLongObject *cookieLong = (PyLongObject *)PyNumber_Long(cookieObj);\r
+    if (cookieLong == NULL)\r
+        return -1;\r
+\r
+    if (_PyLong_AsByteArray(cookieLong, buffer, sizeof(buffer),\r
+                            IS_LITTLE_ENDIAN, 0) < 0) {\r
+        Py_DECREF(cookieLong);\r
+        return -1;\r
+    }\r
+    Py_DECREF(cookieLong);\r
+\r
+    memcpy(&cookie->start_pos, buffer + OFF_START_POS, sizeof(cookie->start_pos));\r
+    memcpy(&cookie->dec_flags, buffer + OFF_DEC_FLAGS, sizeof(cookie->dec_flags));\r
+    memcpy(&cookie->bytes_to_feed, buffer + OFF_BYTES_TO_FEED, sizeof(cookie->bytes_to_feed));\r
+    memcpy(&cookie->chars_to_skip, buffer + OFF_CHARS_TO_SKIP, sizeof(cookie->chars_to_skip));\r
+    memcpy(&cookie->need_eof, buffer + OFF_NEED_EOF, sizeof(cookie->need_eof));\r
+\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_build_cookie(cookie_type *cookie)\r
+{\r
+    unsigned char buffer[COOKIE_BUF_LEN];\r
+\r
+    memcpy(buffer + OFF_START_POS, &cookie->start_pos, sizeof(cookie->start_pos));\r
+    memcpy(buffer + OFF_DEC_FLAGS, &cookie->dec_flags, sizeof(cookie->dec_flags));\r
+    memcpy(buffer + OFF_BYTES_TO_FEED, &cookie->bytes_to_feed, sizeof(cookie->bytes_to_feed));\r
+    memcpy(buffer + OFF_CHARS_TO_SKIP, &cookie->chars_to_skip, sizeof(cookie->chars_to_skip));\r
+    memcpy(buffer + OFF_NEED_EOF, &cookie->need_eof, sizeof(cookie->need_eof));\r
+\r
+    return _PyLong_FromByteArray(buffer, sizeof(buffer), IS_LITTLE_ENDIAN, 0);\r
+}\r
+#undef IS_LITTLE_ENDIAN\r
+\r
+static int\r
+_textiowrapper_decoder_setstate(textio *self, cookie_type *cookie)\r
+{\r
+    PyObject *res;\r
+    /* When seeking to the start of the stream, we call decoder.reset()\r
+       rather than decoder.getstate().\r
+       This is for a few decoders such as utf-16 for which the state value\r
+       at start is not (b"", 0) but e.g. (b"", 2) (meaning, in the case of\r
+       utf-16, that we are expecting a BOM).\r
+    */\r
+    if (cookie->start_pos == 0 && cookie->dec_flags == 0)\r
+        res = PyObject_CallMethodObjArgs(self->decoder, _PyIO_str_reset, NULL);\r
+    else\r
+        res = PyObject_CallMethod(self->decoder, "setstate",\r
+                                  "((si))", "", cookie->dec_flags);\r
+    if (res == NULL)\r
+        return -1;\r
+    Py_DECREF(res);\r
+    return 0;\r
+}\r
+\r
+static int\r
+_textiowrapper_encoder_setstate(textio *self, cookie_type *cookie)\r
+{\r
+    PyObject *res;\r
+    /* Same as _textiowrapper_decoder_setstate() above. */\r
+    if (cookie->start_pos == 0 && cookie->dec_flags == 0) {\r
+        res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_reset, NULL);\r
+        self->encoding_start_of_stream = 1;\r
+    }\r
+    else {\r
+        res = PyObject_CallMethodObjArgs(self->encoder, _PyIO_str_setstate,\r
+                                         _PyIO_zero, NULL);\r
+        self->encoding_start_of_stream = 0;\r
+    }\r
+    if (res == NULL)\r
+        return -1;\r
+    Py_DECREF(res);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_seek(textio *self, PyObject *args)\r
+{\r
+    PyObject *cookieObj, *posobj;\r
+    cookie_type cookie;\r
+    int whence = 0;\r
+    PyObject *res;\r
+    int cmp;\r
+\r
+    CHECK_ATTACHED(self);\r
+\r
+    if (!PyArg_ParseTuple(args, "O|i:seek", &cookieObj, &whence))\r
+        return NULL;\r
+    CHECK_CLOSED(self);\r
+\r
+    Py_INCREF(cookieObj);\r
+\r
+    if (!self->seekable) {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "underlying stream is not seekable");\r
+        goto fail;\r
+    }\r
+\r
+    if (whence == 1) {\r
+        /* seek relative to current position */\r
+        cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_EQ);\r
+        if (cmp < 0)\r
+            goto fail;\r
+\r
+        if (cmp == 0) {\r
+            PyErr_SetString(PyExc_IOError,\r
+                            "can't do nonzero cur-relative seeks");\r
+            goto fail;\r
+        }\r
+\r
+        /* Seeking to the current position should attempt to\r
+         * sync the underlying buffer with the current position.\r
+         */\r
+        Py_DECREF(cookieObj);\r
+        cookieObj = PyObject_CallMethod((PyObject *)self, "tell", NULL);\r
+        if (cookieObj == NULL)\r
+            goto fail;\r
+    }\r
+    else if (whence == 2) {\r
+        /* seek relative to end of file */\r
+\r
+        cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_EQ);\r
+        if (cmp < 0)\r
+            goto fail;\r
+\r
+        if (cmp == 0) {\r
+            PyErr_SetString(PyExc_IOError,\r
+                            "can't do nonzero end-relative seeks");\r
+            goto fail;\r
+        }\r
+\r
+        res = PyObject_CallMethod((PyObject *)self, "flush", NULL);\r
+        if (res == NULL)\r
+            goto fail;\r
+        Py_DECREF(res);\r
+\r
+        textiowrapper_set_decoded_chars(self, NULL);\r
+        Py_CLEAR(self->snapshot);\r
+        if (self->decoder) {\r
+            res = PyObject_CallMethod(self->decoder, "reset", NULL);\r
+            if (res == NULL)\r
+                goto fail;\r
+            Py_DECREF(res);\r
+        }\r
+\r
+        res = PyObject_CallMethod(self->buffer, "seek", "ii", 0, 2);\r
+        Py_XDECREF(cookieObj);\r
+        return res;\r
+    }\r
+    else if (whence != 0) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "invalid whence (%d, should be 0, 1 or 2)", whence);\r
+        goto fail;\r
+    }\r
+\r
+    cmp = PyObject_RichCompareBool(cookieObj, _PyIO_zero, Py_LT);\r
+    if (cmp < 0)\r
+        goto fail;\r
+\r
+    if (cmp == 1) {\r
+        PyObject *repr = PyObject_Repr(cookieObj);\r
+        if (repr != NULL) {\r
+            PyErr_Format(PyExc_ValueError,\r
+                         "negative seek position %s",\r
+                         PyString_AS_STRING(repr));\r
+            Py_DECREF(repr);\r
+        }\r
+        goto fail;\r
+    }\r
+\r
+    res = PyObject_CallMethodObjArgs((PyObject *)self, _PyIO_str_flush, NULL);\r
+    if (res == NULL)\r
+        goto fail;\r
+    Py_DECREF(res);\r
+\r
+    /* The strategy of seek() is to go back to the safe start point\r
+     * and replay the effect of read(chars_to_skip) from there.\r
+     */\r
+    if (textiowrapper_parse_cookie(&cookie, cookieObj) < 0)\r
+        goto fail;\r
+\r
+    /* Seek back to the safe start point. */\r
+    posobj = PyLong_FromOff_t(cookie.start_pos);\r
+    if (posobj == NULL)\r
+        goto fail;\r
+    res = PyObject_CallMethodObjArgs(self->buffer,\r
+                                     _PyIO_str_seek, posobj, NULL);\r
+    Py_DECREF(posobj);\r
+    if (res == NULL)\r
+        goto fail;\r
+    Py_DECREF(res);\r
+\r
+    textiowrapper_set_decoded_chars(self, NULL);\r
+    Py_CLEAR(self->snapshot);\r
+\r
+    /* Restore the decoder to its state from the safe start point. */\r
+    if (self->decoder) {\r
+        if (_textiowrapper_decoder_setstate(self, &cookie) < 0)\r
+            goto fail;\r
+    }\r
+\r
+    if (cookie.chars_to_skip) {\r
+        /* Just like _read_chunk, feed the decoder and save a snapshot. */\r
+        PyObject *input_chunk = PyObject_CallMethod(\r
+            self->buffer, "read", "i", cookie.bytes_to_feed);\r
+        PyObject *decoded;\r
+\r
+        if (input_chunk == NULL)\r
+            goto fail;\r
+\r
+        if (!PyBytes_Check(input_chunk)) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "underlying read() should have returned a bytes "\r
+                         "object, not '%.200s'",\r
+                         Py_TYPE(input_chunk)->tp_name);\r
+            Py_DECREF(input_chunk);\r
+            goto fail;\r
+        }\r
+\r
+        self->snapshot = Py_BuildValue("iN", cookie.dec_flags, input_chunk);\r
+        if (self->snapshot == NULL) {\r
+            Py_DECREF(input_chunk);\r
+            goto fail;\r
+        }\r
+\r
+        decoded = PyObject_CallMethod(self->decoder, "decode",\r
+                                      "Oi", input_chunk, (int)cookie.need_eof);\r
+\r
+        if (check_decoded(decoded) < 0)\r
+            goto fail;\r
+\r
+        textiowrapper_set_decoded_chars(self, decoded);\r
+\r
+        /* Skip chars_to_skip of the decoded characters. */\r
+        if (PyUnicode_GetSize(self->decoded_chars) < cookie.chars_to_skip) {\r
+            PyErr_SetString(PyExc_IOError, "can't restore logical file position");\r
+            goto fail;\r
+        }\r
+        self->decoded_chars_used = cookie.chars_to_skip;\r
+    }\r
+    else {\r
+        self->snapshot = Py_BuildValue("is", cookie.dec_flags, "");\r
+        if (self->snapshot == NULL)\r
+            goto fail;\r
+    }\r
+\r
+    /* Finally, reset the encoder (merely useful for proper BOM handling) */\r
+    if (self->encoder) {\r
+        if (_textiowrapper_encoder_setstate(self, &cookie) < 0)\r
+            goto fail;\r
+    }\r
+    return cookieObj;\r
+  fail:\r
+    Py_XDECREF(cookieObj);\r
+    return NULL;\r
+\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_tell(textio *self, PyObject *args)\r
+{\r
+    PyObject *res;\r
+    PyObject *posobj = NULL;\r
+    cookie_type cookie = {0,0,0,0,0};\r
+    PyObject *next_input;\r
+    Py_ssize_t chars_to_skip, chars_decoded;\r
+    PyObject *saved_state = NULL;\r
+    char *input, *input_end;\r
+\r
+    CHECK_ATTACHED(self);\r
+    CHECK_CLOSED(self);\r
+\r
+    if (!self->seekable) {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "underlying stream is not seekable");\r
+        goto fail;\r
+    }\r
+    if (!self->telling) {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "telling position disabled by next() call");\r
+        goto fail;\r
+    }\r
+\r
+    if (_textiowrapper_writeflush(self) < 0)\r
+        return NULL;\r
+    res = PyObject_CallMethod((PyObject *)self, "flush", NULL);\r
+    if (res == NULL)\r
+        goto fail;\r
+    Py_DECREF(res);\r
+\r
+    posobj = PyObject_CallMethod(self->buffer, "tell", NULL);\r
+    if (posobj == NULL)\r
+        goto fail;\r
+\r
+    if (self->decoder == NULL || self->snapshot == NULL) {\r
+        assert (self->decoded_chars == NULL || PyUnicode_GetSize(self->decoded_chars) == 0);\r
+        return posobj;\r
+    }\r
+\r
+#if defined(HAVE_LARGEFILE_SUPPORT)\r
+    cookie.start_pos = PyLong_AsLongLong(posobj);\r
+#else\r
+    cookie.start_pos = PyLong_AsLong(posobj);\r
+#endif\r
+    if (PyErr_Occurred())\r
+        goto fail;\r
+\r
+    /* Skip backward to the snapshot point (see _read_chunk). */\r
+    if (!PyArg_Parse(self->snapshot, "(iO)", &cookie.dec_flags, &next_input))\r
+        goto fail;\r
+\r
+    assert (PyBytes_Check(next_input));\r
+\r
+    cookie.start_pos -= PyBytes_GET_SIZE(next_input);\r
+\r
+    /* How many decoded characters have been used up since the snapshot? */\r
+    if (self->decoded_chars_used == 0)  {\r
+        /* We haven't moved from the snapshot point. */\r
+        Py_DECREF(posobj);\r
+        return textiowrapper_build_cookie(&cookie);\r
+    }\r
+\r
+    chars_to_skip = self->decoded_chars_used;\r
+\r
+    /* Starting from the snapshot position, we will walk the decoder\r
+     * forward until it gives us enough decoded characters.\r
+     */\r
+    saved_state = PyObject_CallMethodObjArgs(self->decoder,\r
+                                             _PyIO_str_getstate, NULL);\r
+    if (saved_state == NULL)\r
+        goto fail;\r
+\r
+    /* Note our initial start point. */\r
+    if (_textiowrapper_decoder_setstate(self, &cookie) < 0)\r
+        goto fail;\r
+\r
+    /* Feed the decoder one byte at a time.  As we go, note the\r
+     * nearest "safe start point" before the current location\r
+     * (a point where the decoder has nothing buffered, so seek()\r
+     * can safely start from there and advance to this location).\r
+     */\r
+    chars_decoded = 0;\r
+    input = PyBytes_AS_STRING(next_input);\r
+    input_end = input + PyBytes_GET_SIZE(next_input);\r
+    while (input < input_end) {\r
+        PyObject *state;\r
+        char *dec_buffer;\r
+        Py_ssize_t dec_buffer_len;\r
+        int dec_flags;\r
+\r
+        PyObject *decoded = PyObject_CallMethod(\r
+            self->decoder, "decode", "s#", input, (Py_ssize_t)1);\r
+        if (check_decoded(decoded) < 0)\r
+            goto fail;\r
+        chars_decoded += PyUnicode_GET_SIZE(decoded);\r
+        Py_DECREF(decoded);\r
+\r
+        cookie.bytes_to_feed += 1;\r
+\r
+        state = PyObject_CallMethodObjArgs(self->decoder,\r
+                                           _PyIO_str_getstate, NULL);\r
+        if (state == NULL)\r
+            goto fail;\r
+        if (!PyArg_Parse(state, "(s#i)", &dec_buffer, &dec_buffer_len, &dec_flags)) {\r
+            Py_DECREF(state);\r
+            goto fail;\r
+        }\r
+        Py_DECREF(state);\r
+\r
+        if (dec_buffer_len == 0 && chars_decoded <= chars_to_skip) {\r
+            /* Decoder buffer is empty, so this is a safe start point. */\r
+            cookie.start_pos += cookie.bytes_to_feed;\r
+            chars_to_skip -= chars_decoded;\r
+            cookie.dec_flags = dec_flags;\r
+            cookie.bytes_to_feed = 0;\r
+            chars_decoded = 0;\r
+        }\r
+        if (chars_decoded >= chars_to_skip)\r
+            break;\r
+        input++;\r
+    }\r
+    if (input == input_end) {\r
+        /* We didn't get enough decoded data; signal EOF to get more. */\r
+        PyObject *decoded = PyObject_CallMethod(\r
+            self->decoder, "decode", "si", "", /* final = */ 1);\r
+        if (check_decoded(decoded) < 0)\r
+            goto fail;\r
+        chars_decoded += PyUnicode_GET_SIZE(decoded);\r
+        Py_DECREF(decoded);\r
+        cookie.need_eof = 1;\r
+\r
+        if (chars_decoded < chars_to_skip) {\r
+            PyErr_SetString(PyExc_IOError,\r
+                            "can't reconstruct logical file position");\r
+            goto fail;\r
+        }\r
+    }\r
+\r
+    /* finally */\r
+    Py_XDECREF(posobj);\r
+    res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state);\r
+    Py_DECREF(saved_state);\r
+    if (res == NULL)\r
+        return NULL;\r
+    Py_DECREF(res);\r
+\r
+    /* The returned cookie corresponds to the last safe start point. */\r
+    cookie.chars_to_skip = Py_SAFE_DOWNCAST(chars_to_skip, Py_ssize_t, int);\r
+    return textiowrapper_build_cookie(&cookie);\r
+\r
+  fail:\r
+    Py_XDECREF(posobj);\r
+    if (saved_state) {\r
+        PyObject *type, *value, *traceback;\r
+        PyErr_Fetch(&type, &value, &traceback);\r
+\r
+        res = PyObject_CallMethod(self->decoder, "setstate", "(O)", saved_state);\r
+        _PyErr_ReplaceException(type, value, traceback);\r
+        Py_DECREF(saved_state);\r
+        Py_XDECREF(res);\r
+    }\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_truncate(textio *self, PyObject *args)\r
+{\r
+    PyObject *pos = Py_None;\r
+    PyObject *res;\r
+\r
+    CHECK_ATTACHED(self)\r
+    if (!PyArg_ParseTuple(args, "|O:truncate", &pos)) {\r
+        return NULL;\r
+    }\r
+\r
+    res = PyObject_CallMethodObjArgs((PyObject *) self, _PyIO_str_flush, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    Py_DECREF(res);\r
+\r
+    return PyObject_CallMethodObjArgs(self->buffer, _PyIO_str_truncate, pos, NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_repr(textio *self)\r
+{\r
+    PyObject *nameobj, *res;\r
+    PyObject *namerepr = NULL, *encrepr = NULL;\r
+\r
+    CHECK_INITIALIZED(self);\r
+\r
+    nameobj = PyObject_GetAttrString((PyObject *) self, "name");\r
+    if (nameobj == NULL) {\r
+        if (PyErr_ExceptionMatches(PyExc_Exception))\r
+            PyErr_Clear();\r
+        else\r
+            goto error;\r
+        encrepr = PyObject_Repr(self->encoding);\r
+        res = PyString_FromFormat("<_io.TextIOWrapper encoding=%s>",\r
+                                   PyString_AS_STRING(encrepr));\r
+    }\r
+    else {\r
+        encrepr = PyObject_Repr(self->encoding);\r
+        namerepr = PyObject_Repr(nameobj);\r
+        res = PyString_FromFormat("<_io.TextIOWrapper name=%s encoding=%s>",\r
+                                   PyString_AS_STRING(namerepr),\r
+                                   PyString_AS_STRING(encrepr));\r
+        Py_DECREF(nameobj);\r
+    }\r
+    Py_XDECREF(namerepr);\r
+    Py_XDECREF(encrepr);\r
+    return res;\r
+\r
+error:\r
+    Py_XDECREF(namerepr);\r
+    Py_XDECREF(encrepr);\r
+    return NULL;\r
+}\r
+\r
+\r
+/* Inquiries */\r
+\r
+static PyObject *\r
+textiowrapper_fileno(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_CallMethod(self->buffer, "fileno", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_seekable(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_CallMethod(self->buffer, "seekable", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_readable(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_CallMethod(self->buffer, "readable", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_writable(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_CallMethod(self->buffer, "writable", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_isatty(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_CallMethod(self->buffer, "isatty", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_flush(textio *self, PyObject *args)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    CHECK_CLOSED(self);\r
+    self->telling = self->seekable;\r
+    if (_textiowrapper_writeflush(self) < 0)\r
+        return NULL;\r
+    return PyObject_CallMethod(self->buffer, "flush", NULL);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_close(textio *self, PyObject *args)\r
+{\r
+    PyObject *res;\r
+    int r;\r
+    CHECK_ATTACHED(self);\r
+\r
+    res = textiowrapper_closed_get(self, NULL);\r
+    if (res == NULL)\r
+        return NULL;\r
+    r = PyObject_IsTrue(res);\r
+    Py_DECREF(res);\r
+    if (r < 0)\r
+        return NULL;\r
+\r
+    if (r > 0) {\r
+        Py_RETURN_NONE; /* stream already closed */\r
+    }\r
+    else {\r
+        PyObject *exc = NULL, *val, *tb;\r
+        res = PyObject_CallMethod((PyObject *)self, "flush", NULL);\r
+        if (res == NULL)\r
+            PyErr_Fetch(&exc, &val, &tb);\r
+        else\r
+            Py_DECREF(res);\r
+\r
+        res = PyObject_CallMethod(self->buffer, "close", NULL);\r
+        if (exc != NULL) {\r
+            _PyErr_ReplaceException(exc, val, tb);\r
+            Py_CLEAR(res);\r
+        }\r
+        return res;\r
+    }\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_iternext(textio *self)\r
+{\r
+    PyObject *line;\r
+\r
+    CHECK_ATTACHED(self);\r
+\r
+    self->telling = 0;\r
+    if (Py_TYPE(self) == &PyTextIOWrapper_Type) {\r
+        /* Skip method call overhead for speed */\r
+        line = _textiowrapper_readline(self, -1);\r
+    }\r
+    else {\r
+        line = PyObject_CallMethodObjArgs((PyObject *)self,\r
+                                           _PyIO_str_readline, NULL);\r
+        if (line && !PyUnicode_Check(line)) {\r
+            PyErr_Format(PyExc_IOError,\r
+                         "readline() should have returned an str object, "\r
+                         "not '%.200s'", Py_TYPE(line)->tp_name);\r
+            Py_DECREF(line);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    if (line == NULL)\r
+        return NULL;\r
+\r
+    if (PyUnicode_GET_SIZE(line) == 0) {\r
+        /* Reached EOF or would have blocked */\r
+        Py_DECREF(line);\r
+        Py_CLEAR(self->snapshot);\r
+        self->telling = self->seekable;\r
+        return NULL;\r
+    }\r
+\r
+    return line;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_name_get(textio *self, void *context)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_GetAttrString(self->buffer, "name");\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_closed_get(textio *self, void *context)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyObject_GetAttr(self->buffer, _PyIO_str_closed);\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_newlines_get(textio *self, void *context)\r
+{\r
+    PyObject *res;\r
+    CHECK_ATTACHED(self);\r
+    if (self->decoder == NULL)\r
+        Py_RETURN_NONE;\r
+    res = PyObject_GetAttr(self->decoder, _PyIO_str_newlines);\r
+    if (res == NULL) {\r
+        if (PyErr_ExceptionMatches(PyExc_AttributeError)) {\r
+            PyErr_Clear();\r
+            Py_RETURN_NONE;\r
+        }\r
+        else {\r
+            return NULL;\r
+        }\r
+    }\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_errors_get(textio *self, void *context)\r
+{\r
+    CHECK_INITIALIZED(self);\r
+    Py_INCREF(self->errors);\r
+    return self->errors;\r
+}\r
+\r
+static PyObject *\r
+textiowrapper_chunk_size_get(textio *self, void *context)\r
+{\r
+    CHECK_ATTACHED(self);\r
+    return PyLong_FromSsize_t(self->chunk_size);\r
+}\r
+\r
+static int\r
+textiowrapper_chunk_size_set(textio *self, PyObject *arg, void *context)\r
+{\r
+    Py_ssize_t n;\r
+    CHECK_ATTACHED_INT(self);\r
+    n = PyNumber_AsSsize_t(arg, PyExc_TypeError);\r
+    if (n == -1 && PyErr_Occurred())\r
+        return -1;\r
+    if (n <= 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "a strictly positive integer is required");\r
+        return -1;\r
+    }\r
+    self->chunk_size = n;\r
+    return 0;\r
+}\r
+\r
+static PyMethodDef textiowrapper_methods[] = {\r
+    {"detach", (PyCFunction)textiowrapper_detach, METH_NOARGS},\r
+    {"write", (PyCFunction)textiowrapper_write, METH_VARARGS},\r
+    {"read", (PyCFunction)textiowrapper_read, METH_VARARGS},\r
+    {"readline", (PyCFunction)textiowrapper_readline, METH_VARARGS},\r
+    {"flush", (PyCFunction)textiowrapper_flush, METH_NOARGS},\r
+    {"close", (PyCFunction)textiowrapper_close, METH_NOARGS},\r
+\r
+    {"fileno", (PyCFunction)textiowrapper_fileno, METH_NOARGS},\r
+    {"seekable", (PyCFunction)textiowrapper_seekable, METH_NOARGS},\r
+    {"readable", (PyCFunction)textiowrapper_readable, METH_NOARGS},\r
+    {"writable", (PyCFunction)textiowrapper_writable, METH_NOARGS},\r
+    {"isatty", (PyCFunction)textiowrapper_isatty, METH_NOARGS},\r
+\r
+    {"seek", (PyCFunction)textiowrapper_seek, METH_VARARGS},\r
+    {"tell", (PyCFunction)textiowrapper_tell, METH_NOARGS},\r
+    {"truncate", (PyCFunction)textiowrapper_truncate, METH_VARARGS},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyMemberDef textiowrapper_members[] = {\r
+    {"encoding", T_OBJECT, offsetof(textio, encoding), READONLY},\r
+    {"buffer", T_OBJECT, offsetof(textio, buffer), READONLY},\r
+    {"line_buffering", T_BOOL, offsetof(textio, line_buffering), READONLY},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef textiowrapper_getset[] = {\r
+    {"name", (getter)textiowrapper_name_get, NULL, NULL},\r
+    {"closed", (getter)textiowrapper_closed_get, NULL, NULL},\r
+/*    {"mode", (getter)TextIOWrapper_mode_get, NULL, NULL},\r
+*/\r
+    {"newlines", (getter)textiowrapper_newlines_get, NULL, NULL},\r
+    {"errors", (getter)textiowrapper_errors_get, NULL, NULL},\r
+    {"_CHUNK_SIZE", (getter)textiowrapper_chunk_size_get,\r
+                    (setter)textiowrapper_chunk_size_set, NULL},\r
+    {NULL}\r
+};\r
+\r
+PyTypeObject PyTextIOWrapper_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_io.TextIOWrapper",        /*tp_name*/\r
+    sizeof(textio), /*tp_basicsize*/\r
+    0,                          /*tp_itemsize*/\r
+    (destructor)textiowrapper_dealloc, /*tp_dealloc*/\r
+    0,                          /*tp_print*/\r
+    0,                          /*tp_getattr*/\r
+    0,                          /*tps_etattr*/\r
+    0,                          /*tp_compare */\r
+    (reprfunc)textiowrapper_repr,/*tp_repr*/\r
+    0,                          /*tp_as_number*/\r
+    0,                          /*tp_as_sequence*/\r
+    0,                          /*tp_as_mapping*/\r
+    0,                          /*tp_hash */\r
+    0,                          /*tp_call*/\r
+    0,                          /*tp_str*/\r
+    0,                          /*tp_getattro*/\r
+    0,                          /*tp_setattro*/\r
+    0,                          /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE\r
+            | Py_TPFLAGS_HAVE_GC, /*tp_flags*/\r
+    textiowrapper_doc,          /* tp_doc */\r
+    (traverseproc)textiowrapper_traverse, /* tp_traverse */\r
+    (inquiry)textiowrapper_clear, /* tp_clear */\r
+    0,                          /* tp_richcompare */\r
+    offsetof(textio, weakreflist), /*tp_weaklistoffset*/\r
+    0,                          /* tp_iter */\r
+    (iternextfunc)textiowrapper_iternext, /* tp_iternext */\r
+    textiowrapper_methods,      /* tp_methods */\r
+    textiowrapper_members,      /* tp_members */\r
+    textiowrapper_getset,       /* tp_getset */\r
+    0,                          /* tp_base */\r
+    0,                          /* tp_dict */\r
+    0,                          /* tp_descr_get */\r
+    0,                          /* tp_descr_set */\r
+    offsetof(textio, dict), /*tp_dictoffset*/\r
+    (initproc)textiowrapper_init, /* tp_init */\r
+    0,                          /* tp_alloc */\r
+    PyType_GenericNew,          /* tp_new */\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_json.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_json.c
new file mode 100644 (file)
index 0000000..b6fee68
--- /dev/null
@@ -0,0 +1,2409 @@
+#include "Python.h"\r
+#include "structmember.h"\r
+#if PY_VERSION_HEX < 0x02060000 && !defined(Py_TYPE)\r
+#define Py_TYPE(ob)     (((PyObject*)(ob))->ob_type)\r
+#endif\r
+#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)\r
+typedef int Py_ssize_t;\r
+#define PY_SSIZE_T_MAX INT_MAX\r
+#define PY_SSIZE_T_MIN INT_MIN\r
+#define PyInt_FromSsize_t PyInt_FromLong\r
+#define PyInt_AsSsize_t PyInt_AsLong\r
+#endif\r
+#ifndef Py_IS_FINITE\r
+#define Py_IS_FINITE(X) (!Py_IS_INFINITY(X) && !Py_IS_NAN(X))\r
+#endif\r
+\r
+#ifdef __GNUC__\r
+#define UNUSED __attribute__((__unused__))\r
+#else\r
+#define UNUSED\r
+#endif\r
+\r
+#define DEFAULT_ENCODING "utf-8"\r
+\r
+#define PyScanner_Check(op) PyObject_TypeCheck(op, &PyScannerType)\r
+#define PyScanner_CheckExact(op) (Py_TYPE(op) == &PyScannerType)\r
+#define PyEncoder_Check(op) PyObject_TypeCheck(op, &PyEncoderType)\r
+#define PyEncoder_CheckExact(op) (Py_TYPE(op) == &PyEncoderType)\r
+\r
+static PyTypeObject PyScannerType;\r
+static PyTypeObject PyEncoderType;\r
+\r
+typedef struct _PyScannerObject {\r
+    PyObject_HEAD\r
+    PyObject *encoding;\r
+    PyObject *strict;\r
+    PyObject *object_hook;\r
+    PyObject *pairs_hook;\r
+    PyObject *parse_float;\r
+    PyObject *parse_int;\r
+    PyObject *parse_constant;\r
+} PyScannerObject;\r
+\r
+static PyMemberDef scanner_members[] = {\r
+    {"encoding", T_OBJECT, offsetof(PyScannerObject, encoding), READONLY, "encoding"},\r
+    {"strict", T_OBJECT, offsetof(PyScannerObject, strict), READONLY, "strict"},\r
+    {"object_hook", T_OBJECT, offsetof(PyScannerObject, object_hook), READONLY, "object_hook"},\r
+    {"object_pairs_hook", T_OBJECT, offsetof(PyScannerObject, pairs_hook), READONLY, "object_pairs_hook"},\r
+    {"parse_float", T_OBJECT, offsetof(PyScannerObject, parse_float), READONLY, "parse_float"},\r
+    {"parse_int", T_OBJECT, offsetof(PyScannerObject, parse_int), READONLY, "parse_int"},\r
+    {"parse_constant", T_OBJECT, offsetof(PyScannerObject, parse_constant), READONLY, "parse_constant"},\r
+    {NULL}\r
+};\r
+\r
+typedef struct _PyEncoderObject {\r
+    PyObject_HEAD\r
+    PyObject *markers;\r
+    PyObject *defaultfn;\r
+    PyObject *encoder;\r
+    PyObject *indent;\r
+    PyObject *key_separator;\r
+    PyObject *item_separator;\r
+    PyObject *sort_keys;\r
+    PyObject *skipkeys;\r
+    int fast_encode;\r
+    int allow_nan;\r
+} PyEncoderObject;\r
+\r
+static PyMemberDef encoder_members[] = {\r
+    {"markers", T_OBJECT, offsetof(PyEncoderObject, markers), READONLY, "markers"},\r
+    {"default", T_OBJECT, offsetof(PyEncoderObject, defaultfn), READONLY, "default"},\r
+    {"encoder", T_OBJECT, offsetof(PyEncoderObject, encoder), READONLY, "encoder"},\r
+    {"indent", T_OBJECT, offsetof(PyEncoderObject, indent), READONLY, "indent"},\r
+    {"key_separator", T_OBJECT, offsetof(PyEncoderObject, key_separator), READONLY, "key_separator"},\r
+    {"item_separator", T_OBJECT, offsetof(PyEncoderObject, item_separator), READONLY, "item_separator"},\r
+    {"sort_keys", T_OBJECT, offsetof(PyEncoderObject, sort_keys), READONLY, "sort_keys"},\r
+    {"skipkeys", T_OBJECT, offsetof(PyEncoderObject, skipkeys), READONLY, "skipkeys"},\r
+    {NULL}\r
+};\r
+\r
+static Py_ssize_t\r
+ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars);\r
+static PyObject *\r
+ascii_escape_unicode(PyObject *pystr);\r
+static PyObject *\r
+ascii_escape_str(PyObject *pystr);\r
+static PyObject *\r
+py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr);\r
+void init_json(void);\r
+static PyObject *\r
+scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr);\r
+static PyObject *\r
+scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr);\r
+static PyObject *\r
+_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx);\r
+static PyObject *\r
+scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds);\r
+static int\r
+scanner_init(PyObject *self, PyObject *args, PyObject *kwds);\r
+static void\r
+scanner_dealloc(PyObject *self);\r
+static int\r
+scanner_clear(PyObject *self);\r
+static PyObject *\r
+encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds);\r
+static int\r
+encoder_init(PyObject *self, PyObject *args, PyObject *kwds);\r
+static void\r
+encoder_dealloc(PyObject *self);\r
+static int\r
+encoder_clear(PyObject *self);\r
+static int\r
+encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level);\r
+static int\r
+encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level);\r
+static int\r
+encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level);\r
+static PyObject *\r
+_encoded_const(PyObject *obj);\r
+static void\r
+raise_errmsg(char *msg, PyObject *s, Py_ssize_t end);\r
+static PyObject *\r
+encoder_encode_string(PyEncoderObject *s, PyObject *obj);\r
+static int\r
+_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr);\r
+static PyObject *\r
+_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr);\r
+static PyObject *\r
+encoder_encode_float(PyEncoderObject *s, PyObject *obj);\r
+\r
+#define S_CHAR(c) (c >= ' ' && c <= '~' && c != '\\' && c != '"')\r
+#define IS_WHITESPACE(c) (((c) == ' ') || ((c) == '\t') || ((c) == '\n') || ((c) == '\r'))\r
+\r
+#define MIN_EXPANSION 6\r
+#ifdef Py_UNICODE_WIDE\r
+#define MAX_EXPANSION (2 * MIN_EXPANSION)\r
+#else\r
+#define MAX_EXPANSION MIN_EXPANSION\r
+#endif\r
+\r
+static int\r
+_convertPyInt_AsSsize_t(PyObject *o, Py_ssize_t *size_ptr)\r
+{\r
+    /* PyObject to Py_ssize_t converter */\r
+    *size_ptr = PyInt_AsSsize_t(o);\r
+    if (*size_ptr == -1 && PyErr_Occurred())\r
+        return 0;\r
+    return 1;\r
+}\r
+\r
+static PyObject *\r
+_convertPyInt_FromSsize_t(Py_ssize_t *size_ptr)\r
+{\r
+    /* Py_ssize_t to PyObject converter */\r
+    return PyInt_FromSsize_t(*size_ptr);\r
+}\r
+\r
+static Py_ssize_t\r
+ascii_escape_char(Py_UNICODE c, char *output, Py_ssize_t chars)\r
+{\r
+    /* Escape unicode code point c to ASCII escape sequences\r
+    in char *output. output must have at least 12 bytes unused to\r
+    accommodate an escaped surrogate pair "\uXXXX\uXXXX" */\r
+    output[chars++] = '\\';\r
+    switch (c) {\r
+        case '\\': output[chars++] = (char)c; break;\r
+        case '"': output[chars++] = (char)c; break;\r
+        case '\b': output[chars++] = 'b'; break;\r
+        case '\f': output[chars++] = 'f'; break;\r
+        case '\n': output[chars++] = 'n'; break;\r
+        case '\r': output[chars++] = 'r'; break;\r
+        case '\t': output[chars++] = 't'; break;\r
+        default:\r
+#ifdef Py_UNICODE_WIDE\r
+            if (c >= 0x10000) {\r
+                /* UTF-16 surrogate pair */\r
+                Py_UNICODE v = c - 0x10000;\r
+                c = 0xd800 | ((v >> 10) & 0x3ff);\r
+                output[chars++] = 'u';\r
+                output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];\r
+                output[chars++] = "0123456789abcdef"[(c >>  8) & 0xf];\r
+                output[chars++] = "0123456789abcdef"[(c >>  4) & 0xf];\r
+                output[chars++] = "0123456789abcdef"[(c      ) & 0xf];\r
+                c = 0xdc00 | (v & 0x3ff);\r
+                output[chars++] = '\\';\r
+            }\r
+#endif\r
+            output[chars++] = 'u';\r
+            output[chars++] = "0123456789abcdef"[(c >> 12) & 0xf];\r
+            output[chars++] = "0123456789abcdef"[(c >>  8) & 0xf];\r
+            output[chars++] = "0123456789abcdef"[(c >>  4) & 0xf];\r
+            output[chars++] = "0123456789abcdef"[(c      ) & 0xf];\r
+    }\r
+    return chars;\r
+}\r
+\r
+static PyObject *\r
+ascii_escape_unicode(PyObject *pystr)\r
+{\r
+    /* Take a PyUnicode pystr and return a new ASCII-only escaped PyString */\r
+    Py_ssize_t i;\r
+    Py_ssize_t input_chars;\r
+    Py_ssize_t output_size;\r
+    Py_ssize_t max_output_size;\r
+    Py_ssize_t chars;\r
+    PyObject *rval;\r
+    char *output;\r
+    Py_UNICODE *input_unicode;\r
+\r
+    input_chars = PyUnicode_GET_SIZE(pystr);\r
+    input_unicode = PyUnicode_AS_UNICODE(pystr);\r
+\r
+    /* One char input can be up to 6 chars output, estimate 4 of these */\r
+    output_size = 2 + (MIN_EXPANSION * 4) + input_chars;\r
+    max_output_size = 2 + (input_chars * MAX_EXPANSION);\r
+    rval = PyString_FromStringAndSize(NULL, output_size);\r
+    if (rval == NULL) {\r
+        return NULL;\r
+    }\r
+    output = PyString_AS_STRING(rval);\r
+    chars = 0;\r
+    output[chars++] = '"';\r
+    for (i = 0; i < input_chars; i++) {\r
+        Py_UNICODE c = input_unicode[i];\r
+        if (S_CHAR(c)) {\r
+            output[chars++] = (char)c;\r
+        }\r
+        else {\r
+            chars = ascii_escape_char(c, output, chars);\r
+        }\r
+        if (output_size - chars < (1 + MAX_EXPANSION)) {\r
+            /* There's more than four, so let's resize by a lot */\r
+            Py_ssize_t new_output_size = output_size * 2;\r
+            /* This is an upper bound */\r
+            if (new_output_size > max_output_size) {\r
+                new_output_size = max_output_size;\r
+            }\r
+            /* Make sure that the output size changed before resizing */\r
+            if (new_output_size != output_size) {\r
+                output_size = new_output_size;\r
+                if (_PyString_Resize(&rval, output_size) == -1) {\r
+                    return NULL;\r
+                }\r
+                output = PyString_AS_STRING(rval);\r
+            }\r
+        }\r
+    }\r
+    output[chars++] = '"';\r
+    if (_PyString_Resize(&rval, chars) == -1) {\r
+        return NULL;\r
+    }\r
+    return rval;\r
+}\r
+\r
+static PyObject *\r
+ascii_escape_str(PyObject *pystr)\r
+{\r
+    /* Take a PyString pystr and return a new ASCII-only escaped PyString */\r
+    Py_ssize_t i;\r
+    Py_ssize_t input_chars;\r
+    Py_ssize_t output_size;\r
+    Py_ssize_t chars;\r
+    PyObject *rval;\r
+    char *output;\r
+    char *input_str;\r
+\r
+    input_chars = PyString_GET_SIZE(pystr);\r
+    input_str = PyString_AS_STRING(pystr);\r
+\r
+    /* Fast path for a string that's already ASCII */\r
+    for (i = 0; i < input_chars; i++) {\r
+        Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i];\r
+        if (!S_CHAR(c)) {\r
+            /* If we have to escape something, scan the string for unicode */\r
+            Py_ssize_t j;\r
+            for (j = i; j < input_chars; j++) {\r
+                c = (Py_UNICODE)(unsigned char)input_str[j];\r
+                if (c > 0x7f) {\r
+                    /* We hit a non-ASCII character, bail to unicode mode */\r
+                    PyObject *uni;\r
+                    uni = PyUnicode_DecodeUTF8(input_str, input_chars, "strict");\r
+                    if (uni == NULL) {\r
+                        return NULL;\r
+                    }\r
+                    rval = ascii_escape_unicode(uni);\r
+                    Py_DECREF(uni);\r
+                    return rval;\r
+                }\r
+            }\r
+            break;\r
+        }\r
+    }\r
+\r
+    if (i == input_chars) {\r
+        /* Input is already ASCII */\r
+        output_size = 2 + input_chars;\r
+    }\r
+    else {\r
+        /* One char input can be up to 6 chars output, estimate 4 of these */\r
+        output_size = 2 + (MIN_EXPANSION * 4) + input_chars;\r
+    }\r
+    rval = PyString_FromStringAndSize(NULL, output_size);\r
+    if (rval == NULL) {\r
+        return NULL;\r
+    }\r
+    output = PyString_AS_STRING(rval);\r
+    output[0] = '"';\r
+\r
+    /* We know that everything up to i is ASCII already */\r
+    chars = i + 1;\r
+    memcpy(&output[1], input_str, i);\r
+\r
+    for (; i < input_chars; i++) {\r
+        Py_UNICODE c = (Py_UNICODE)(unsigned char)input_str[i];\r
+        if (S_CHAR(c)) {\r
+            output[chars++] = (char)c;\r
+        }\r
+        else {\r
+            chars = ascii_escape_char(c, output, chars);\r
+        }\r
+        /* An ASCII char can't possibly expand to a surrogate! */\r
+        if (output_size - chars < (1 + MIN_EXPANSION)) {\r
+            /* There's more than four, so let's resize by a lot */\r
+            output_size *= 2;\r
+            if (output_size > 2 + (input_chars * MIN_EXPANSION)) {\r
+                output_size = 2 + (input_chars * MIN_EXPANSION);\r
+            }\r
+            if (_PyString_Resize(&rval, output_size) == -1) {\r
+                return NULL;\r
+            }\r
+            output = PyString_AS_STRING(rval);\r
+        }\r
+    }\r
+    output[chars++] = '"';\r
+    if (_PyString_Resize(&rval, chars) == -1) {\r
+        return NULL;\r
+    }\r
+    return rval;\r
+}\r
+\r
+static void\r
+raise_errmsg(char *msg, PyObject *s, Py_ssize_t end)\r
+{\r
+    /* Use the Python function json.decoder.errmsg to raise a nice\r
+    looking ValueError exception */\r
+    static PyObject *errmsg_fn = NULL;\r
+    PyObject *pymsg;\r
+    if (errmsg_fn == NULL) {\r
+        PyObject *decoder = PyImport_ImportModule("json.decoder");\r
+        if (decoder == NULL)\r
+            return;\r
+        errmsg_fn = PyObject_GetAttrString(decoder, "errmsg");\r
+        Py_DECREF(decoder);\r
+        if (errmsg_fn == NULL)\r
+            return;\r
+    }\r
+    pymsg = PyObject_CallFunction(errmsg_fn, "(zOO&)", msg, s, _convertPyInt_FromSsize_t, &end);\r
+    if (pymsg) {\r
+        PyErr_SetObject(PyExc_ValueError, pymsg);\r
+        Py_DECREF(pymsg);\r
+    }\r
+}\r
+\r
+static PyObject *\r
+join_list_unicode(PyObject *lst)\r
+{\r
+    /* return u''.join(lst) */\r
+    static PyObject *joinfn = NULL;\r
+    if (joinfn == NULL) {\r
+        PyObject *ustr = PyUnicode_FromUnicode(NULL, 0);\r
+        if (ustr == NULL)\r
+            return NULL;\r
+\r
+        joinfn = PyObject_GetAttrString(ustr, "join");\r
+        Py_DECREF(ustr);\r
+        if (joinfn == NULL)\r
+            return NULL;\r
+    }\r
+    return PyObject_CallFunctionObjArgs(joinfn, lst, NULL);\r
+}\r
+\r
+static PyObject *\r
+_build_rval_index_tuple(PyObject *rval, Py_ssize_t idx) {\r
+    /* return (rval, idx) tuple, stealing reference to rval */\r
+    PyObject *tpl;\r
+    PyObject *pyidx;\r
+    /*\r
+    steal a reference to rval, returns (rval, idx)\r
+    */\r
+    if (rval == NULL) {\r
+        return NULL;\r
+    }\r
+    pyidx = PyInt_FromSsize_t(idx);\r
+    if (pyidx == NULL) {\r
+        Py_DECREF(rval);\r
+        return NULL;\r
+    }\r
+    tpl = PyTuple_New(2);\r
+    if (tpl == NULL) {\r
+        Py_DECREF(pyidx);\r
+        Py_DECREF(rval);\r
+        return NULL;\r
+    }\r
+    PyTuple_SET_ITEM(tpl, 0, rval);\r
+    PyTuple_SET_ITEM(tpl, 1, pyidx);\r
+    return tpl;\r
+}\r
+\r
+static PyObject *\r
+scanstring_str(PyObject *pystr, Py_ssize_t end, char *encoding, int strict, Py_ssize_t *next_end_ptr)\r
+{\r
+    /* Read the JSON string from PyString pystr.\r
+    end is the index of the first character after the quote.\r
+    encoding is the encoding of pystr (must be an ASCII superset)\r
+    if strict is zero then literal control characters are allowed\r
+    *next_end_ptr is a return-by-reference index of the character\r
+        after the end quote\r
+\r
+    Return value is a new PyString (if ASCII-only) or PyUnicode\r
+    */\r
+    PyObject *rval;\r
+    Py_ssize_t len = PyString_GET_SIZE(pystr);\r
+    Py_ssize_t begin = end - 1;\r
+    Py_ssize_t next;\r
+    char *buf = PyString_AS_STRING(pystr);\r
+    PyObject *chunks = PyList_New(0);\r
+    if (chunks == NULL) {\r
+        goto bail;\r
+    }\r
+    if (end < 0 || len <= end) {\r
+        PyErr_SetString(PyExc_ValueError, "end is out of bounds");\r
+        goto bail;\r
+    }\r
+    while (1) {\r
+        /* Find the end of the string or the next escape */\r
+        Py_UNICODE c = 0;\r
+        PyObject *chunk = NULL;\r
+        for (next = end; next < len; next++) {\r
+            c = (unsigned char)buf[next];\r
+            if (c == '"' || c == '\\') {\r
+                break;\r
+            }\r
+            else if (strict && c <= 0x1f) {\r
+                raise_errmsg("Invalid control character at", pystr, next);\r
+                goto bail;\r
+            }\r
+        }\r
+        if (!(c == '"' || c == '\\')) {\r
+            raise_errmsg("Unterminated string starting at", pystr, begin);\r
+            goto bail;\r
+        }\r
+        /* Pick up this chunk if it's not zero length */\r
+        if (next != end) {\r
+            PyObject *strchunk = PyString_FromStringAndSize(&buf[end], next - end);\r
+            if (strchunk == NULL) {\r
+                goto bail;\r
+            }\r
+            chunk = PyUnicode_FromEncodedObject(strchunk, encoding, NULL);\r
+            Py_DECREF(strchunk);\r
+            if (chunk == NULL) {\r
+                goto bail;\r
+            }\r
+            if (PyList_Append(chunks, chunk)) {\r
+                Py_DECREF(chunk);\r
+                goto bail;\r
+            }\r
+            Py_DECREF(chunk);\r
+        }\r
+        next++;\r
+        if (c == '"') {\r
+            end = next;\r
+            break;\r
+        }\r
+        if (next == len) {\r
+            raise_errmsg("Unterminated string starting at", pystr, begin);\r
+            goto bail;\r
+        }\r
+        c = buf[next];\r
+        if (c != 'u') {\r
+            /* Non-unicode backslash escapes */\r
+            end = next + 1;\r
+            switch (c) {\r
+                case '"': break;\r
+                case '\\': break;\r
+                case '/': break;\r
+                case 'b': c = '\b'; break;\r
+                case 'f': c = '\f'; break;\r
+                case 'n': c = '\n'; break;\r
+                case 'r': c = '\r'; break;\r
+                case 't': c = '\t'; break;\r
+                default: c = 0;\r
+            }\r
+            if (c == 0) {\r
+                raise_errmsg("Invalid \\escape", pystr, end - 2);\r
+                goto bail;\r
+            }\r
+        }\r
+        else {\r
+            c = 0;\r
+            next++;\r
+            end = next + 4;\r
+            if (end >= len) {\r
+                raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1);\r
+                goto bail;\r
+            }\r
+            /* Decode 4 hex digits */\r
+            for (; next < end; next++) {\r
+                Py_UNICODE digit = buf[next];\r
+                c <<= 4;\r
+                switch (digit) {\r
+                    case '0': case '1': case '2': case '3': case '4':\r
+                    case '5': case '6': case '7': case '8': case '9':\r
+                        c |= (digit - '0'); break;\r
+                    case 'a': case 'b': case 'c': case 'd': case 'e':\r
+                    case 'f':\r
+                        c |= (digit - 'a' + 10); break;\r
+                    case 'A': case 'B': case 'C': case 'D': case 'E':\r
+                    case 'F':\r
+                        c |= (digit - 'A' + 10); break;\r
+                    default:\r
+                        raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);\r
+                        goto bail;\r
+                }\r
+            }\r
+#ifdef Py_UNICODE_WIDE\r
+            /* Surrogate pair */\r
+            if ((c & 0xfc00) == 0xd800 && end + 6 < len &&\r
+                buf[next++] == '\\' &&\r
+                buf[next++] == 'u') {\r
+                Py_UNICODE c2 = 0;\r
+                end += 6;\r
+                /* Decode 4 hex digits */\r
+                for (; next < end; next++) {\r
+                    Py_UNICODE digit = buf[next];\r
+                    c2 <<= 4;\r
+                    switch (digit) {\r
+                        case '0': case '1': case '2': case '3': case '4':\r
+                        case '5': case '6': case '7': case '8': case '9':\r
+                            c2 |= (digit - '0'); break;\r
+                        case 'a': case 'b': case 'c': case 'd': case 'e':\r
+                        case 'f':\r
+                            c2 |= (digit - 'a' + 10); break;\r
+                        case 'A': case 'B': case 'C': case 'D': case 'E':\r
+                        case 'F':\r
+                            c2 |= (digit - 'A' + 10); break;\r
+                        default:\r
+                            raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);\r
+                            goto bail;\r
+                    }\r
+                }\r
+                if ((c2 & 0xfc00) == 0xdc00)\r
+                    c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00));\r
+                else\r
+                    end -= 6;\r
+            }\r
+#endif\r
+        }\r
+        chunk = PyUnicode_FromUnicode(&c, 1);\r
+        if (chunk == NULL) {\r
+            goto bail;\r
+        }\r
+        if (PyList_Append(chunks, chunk)) {\r
+            Py_DECREF(chunk);\r
+            goto bail;\r
+        }\r
+        Py_DECREF(chunk);\r
+    }\r
+\r
+    rval = join_list_unicode(chunks);\r
+    if (rval == NULL) {\r
+        goto bail;\r
+    }\r
+    Py_CLEAR(chunks);\r
+    *next_end_ptr = end;\r
+    return rval;\r
+bail:\r
+    *next_end_ptr = -1;\r
+    Py_XDECREF(chunks);\r
+    return NULL;\r
+}\r
+\r
+\r
+static PyObject *\r
+scanstring_unicode(PyObject *pystr, Py_ssize_t end, int strict, Py_ssize_t *next_end_ptr)\r
+{\r
+    /* Read the JSON string from PyUnicode pystr.\r
+    end is the index of the first character after the quote.\r
+    if strict is zero then literal control characters are allowed\r
+    *next_end_ptr is a return-by-reference index of the character\r
+        after the end quote\r
+\r
+    Return value is a new PyUnicode\r
+    */\r
+    PyObject *rval;\r
+    Py_ssize_t len = PyUnicode_GET_SIZE(pystr);\r
+    Py_ssize_t begin = end - 1;\r
+    Py_ssize_t next;\r
+    const Py_UNICODE *buf = PyUnicode_AS_UNICODE(pystr);\r
+    PyObject *chunks = PyList_New(0);\r
+    if (chunks == NULL) {\r
+        goto bail;\r
+    }\r
+    if (end < 0 || len <= end) {\r
+        PyErr_SetString(PyExc_ValueError, "end is out of bounds");\r
+        goto bail;\r
+    }\r
+    while (1) {\r
+        /* Find the end of the string or the next escape */\r
+        Py_UNICODE c = 0;\r
+        PyObject *chunk = NULL;\r
+        for (next = end; next < len; next++) {\r
+            c = buf[next];\r
+            if (c == '"' || c == '\\') {\r
+                break;\r
+            }\r
+            else if (strict && c <= 0x1f) {\r
+                raise_errmsg("Invalid control character at", pystr, next);\r
+                goto bail;\r
+            }\r
+        }\r
+        if (!(c == '"' || c == '\\')) {\r
+            raise_errmsg("Unterminated string starting at", pystr, begin);\r
+            goto bail;\r
+        }\r
+        /* Pick up this chunk if it's not zero length */\r
+        if (next != end) {\r
+            chunk = PyUnicode_FromUnicode(&buf[end], next - end);\r
+            if (chunk == NULL) {\r
+                goto bail;\r
+            }\r
+            if (PyList_Append(chunks, chunk)) {\r
+                Py_DECREF(chunk);\r
+                goto bail;\r
+            }\r
+            Py_DECREF(chunk);\r
+        }\r
+        next++;\r
+        if (c == '"') {\r
+            end = next;\r
+            break;\r
+        }\r
+        if (next == len) {\r
+            raise_errmsg("Unterminated string starting at", pystr, begin);\r
+            goto bail;\r
+        }\r
+        c = buf[next];\r
+        if (c != 'u') {\r
+            /* Non-unicode backslash escapes */\r
+            end = next + 1;\r
+            switch (c) {\r
+                case '"': break;\r
+                case '\\': break;\r
+                case '/': break;\r
+                case 'b': c = '\b'; break;\r
+                case 'f': c = '\f'; break;\r
+                case 'n': c = '\n'; break;\r
+                case 'r': c = '\r'; break;\r
+                case 't': c = '\t'; break;\r
+                default: c = 0;\r
+            }\r
+            if (c == 0) {\r
+                raise_errmsg("Invalid \\escape", pystr, end - 2);\r
+                goto bail;\r
+            }\r
+        }\r
+        else {\r
+            c = 0;\r
+            next++;\r
+            end = next + 4;\r
+            if (end >= len) {\r
+                raise_errmsg("Invalid \\uXXXX escape", pystr, next - 1);\r
+                goto bail;\r
+            }\r
+            /* Decode 4 hex digits */\r
+            for (; next < end; next++) {\r
+                Py_UNICODE digit = buf[next];\r
+                c <<= 4;\r
+                switch (digit) {\r
+                    case '0': case '1': case '2': case '3': case '4':\r
+                    case '5': case '6': case '7': case '8': case '9':\r
+                        c |= (digit - '0'); break;\r
+                    case 'a': case 'b': case 'c': case 'd': case 'e':\r
+                    case 'f':\r
+                        c |= (digit - 'a' + 10); break;\r
+                    case 'A': case 'B': case 'C': case 'D': case 'E':\r
+                    case 'F':\r
+                        c |= (digit - 'A' + 10); break;\r
+                    default:\r
+                        raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);\r
+                        goto bail;\r
+                }\r
+            }\r
+#ifdef Py_UNICODE_WIDE\r
+            /* Surrogate pair */\r
+            if ((c & 0xfc00) == 0xd800 && end + 6 < len &&\r
+                buf[next++] == '\\' && buf[next++] == 'u') {\r
+                Py_UNICODE c2 = 0;\r
+                end += 6;\r
+                /* Decode 4 hex digits */\r
+                for (; next < end; next++) {\r
+                    Py_UNICODE digit = buf[next];\r
+                    c2 <<= 4;\r
+                    switch (digit) {\r
+                        case '0': case '1': case '2': case '3': case '4':\r
+                        case '5': case '6': case '7': case '8': case '9':\r
+                            c2 |= (digit - '0'); break;\r
+                        case 'a': case 'b': case 'c': case 'd': case 'e':\r
+                        case 'f':\r
+                            c2 |= (digit - 'a' + 10); break;\r
+                        case 'A': case 'B': case 'C': case 'D': case 'E':\r
+                        case 'F':\r
+                            c2 |= (digit - 'A' + 10); break;\r
+                        default:\r
+                            raise_errmsg("Invalid \\uXXXX escape", pystr, end - 5);\r
+                            goto bail;\r
+                    }\r
+                }\r
+                if ((c2 & 0xfc00) == 0xdc00)\r
+                    c = 0x10000 + (((c - 0xd800) << 10) | (c2 - 0xdc00));\r
+                else\r
+                    end -= 6;\r
+            }\r
+#endif\r
+        }\r
+        chunk = PyUnicode_FromUnicode(&c, 1);\r
+        if (chunk == NULL) {\r
+            goto bail;\r
+        }\r
+        if (PyList_Append(chunks, chunk)) {\r
+            Py_DECREF(chunk);\r
+            goto bail;\r
+        }\r
+        Py_DECREF(chunk);\r
+    }\r
+\r
+    rval = join_list_unicode(chunks);\r
+    if (rval == NULL) {\r
+        goto bail;\r
+    }\r
+    Py_DECREF(chunks);\r
+    *next_end_ptr = end;\r
+    return rval;\r
+bail:\r
+    *next_end_ptr = -1;\r
+    Py_XDECREF(chunks);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(pydoc_scanstring,\r
+    "scanstring(basestring, end, encoding, strict=True) -> (str, end)\n"\r
+    "\n"\r
+    "Scan the string s for a JSON string. End is the index of the\n"\r
+    "character in s after the quote that started the JSON string.\n"\r
+    "Unescapes all valid JSON string escape sequences and raises ValueError\n"\r
+    "on attempt to decode an invalid string. If strict is False then literal\n"\r
+    "control characters are allowed in the string.\n"\r
+    "\n"\r
+    "Returns a tuple of the decoded string and the index of the character in s\n"\r
+    "after the end quote."\r
+);\r
+\r
+static PyObject *\r
+py_scanstring(PyObject* self UNUSED, PyObject *args)\r
+{\r
+    PyObject *pystr;\r
+    PyObject *rval;\r
+    Py_ssize_t end;\r
+    Py_ssize_t next_end = -1;\r
+    char *encoding = NULL;\r
+    int strict = 1;\r
+    if (!PyArg_ParseTuple(args, "OO&|zi:scanstring", &pystr, _convertPyInt_AsSsize_t, &end, &encoding, &strict)) {\r
+        return NULL;\r
+    }\r
+    if (encoding == NULL) {\r
+        encoding = DEFAULT_ENCODING;\r
+    }\r
+    if (PyString_Check(pystr)) {\r
+        rval = scanstring_str(pystr, end, encoding, strict, &next_end);\r
+    }\r
+    else if (PyUnicode_Check(pystr)) {\r
+        rval = scanstring_unicode(pystr, end, strict, &next_end);\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "first argument must be a string, not %.80s",\r
+                     Py_TYPE(pystr)->tp_name);\r
+        return NULL;\r
+    }\r
+    return _build_rval_index_tuple(rval, next_end);\r
+}\r
+\r
+PyDoc_STRVAR(pydoc_encode_basestring_ascii,\r
+    "encode_basestring_ascii(basestring) -> str\n"\r
+    "\n"\r
+    "Return an ASCII-only JSON representation of a Python string"\r
+);\r
+\r
+static PyObject *\r
+py_encode_basestring_ascii(PyObject* self UNUSED, PyObject *pystr)\r
+{\r
+    /* Return an ASCII-only JSON representation of a Python string */\r
+    /* METH_O */\r
+    if (PyString_Check(pystr)) {\r
+        return ascii_escape_str(pystr);\r
+    }\r
+    else if (PyUnicode_Check(pystr)) {\r
+        return ascii_escape_unicode(pystr);\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "first argument must be a string, not %.80s",\r
+                     Py_TYPE(pystr)->tp_name);\r
+        return NULL;\r
+    }\r
+}\r
+\r
+static void\r
+scanner_dealloc(PyObject *self)\r
+{\r
+    /* Deallocate scanner object */\r
+    scanner_clear(self);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static int\r
+scanner_traverse(PyObject *self, visitproc visit, void *arg)\r
+{\r
+    PyScannerObject *s;\r
+    assert(PyScanner_Check(self));\r
+    s = (PyScannerObject *)self;\r
+    Py_VISIT(s->encoding);\r
+    Py_VISIT(s->strict);\r
+    Py_VISIT(s->object_hook);\r
+    Py_VISIT(s->pairs_hook);\r
+    Py_VISIT(s->parse_float);\r
+    Py_VISIT(s->parse_int);\r
+    Py_VISIT(s->parse_constant);\r
+    return 0;\r
+}\r
+\r
+static int\r
+scanner_clear(PyObject *self)\r
+{\r
+    PyScannerObject *s;\r
+    assert(PyScanner_Check(self));\r
+    s = (PyScannerObject *)self;\r
+    Py_CLEAR(s->encoding);\r
+    Py_CLEAR(s->strict);\r
+    Py_CLEAR(s->object_hook);\r
+    Py_CLEAR(s->pairs_hook);\r
+    Py_CLEAR(s->parse_float);\r
+    Py_CLEAR(s->parse_int);\r
+    Py_CLEAR(s->parse_constant);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+_parse_object_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON object from PyString pystr.\r
+    idx is the index of the first character after the opening curly brace.\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the closing curly brace.\r
+\r
+    Returns a new PyObject (usually a dict, but object_hook can change that)\r
+    */\r
+    char *str = PyString_AS_STRING(pystr);\r
+    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;\r
+    PyObject *rval;\r
+    PyObject *pairs;\r
+    PyObject *item;\r
+    PyObject *key = NULL;\r
+    PyObject *val = NULL;\r
+    char *encoding = PyString_AS_STRING(s->encoding);\r
+    int strict = PyObject_IsTrue(s->strict);\r
+    Py_ssize_t next_idx;\r
+\r
+    pairs = PyList_New(0);\r
+    if (pairs == NULL)\r
+        return NULL;\r
+\r
+    /* skip whitespace after { */\r
+    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+    /* only loop if the object is non-empty */\r
+    if (idx <= end_idx && str[idx] != '}') {\r
+        while (idx <= end_idx) {\r
+            /* read key */\r
+            if (str[idx] != '"') {\r
+                raise_errmsg("Expecting property name", pystr, idx);\r
+                goto bail;\r
+            }\r
+            key = scanstring_str(pystr, idx + 1, encoding, strict, &next_idx);\r
+            if (key == NULL)\r
+                goto bail;\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace between key and : delimiter, read :, skip whitespace */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+            if (idx > end_idx || str[idx] != ':') {\r
+                raise_errmsg("Expecting : delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* read any JSON data type */\r
+            val = scan_once_str(s, pystr, idx, &next_idx);\r
+            if (val == NULL)\r
+                goto bail;\r
+\r
+            item = PyTuple_Pack(2, key, val);\r
+            if (item == NULL)\r
+                goto bail;\r
+            Py_CLEAR(key);\r
+            Py_CLEAR(val);\r
+            if (PyList_Append(pairs, item) == -1) {\r
+                Py_DECREF(item);\r
+                goto bail;\r
+            }\r
+            Py_DECREF(item);\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace before } or , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* bail if the object is closed or we didn't get the , delimiter */\r
+            if (idx > end_idx) break;\r
+            if (str[idx] == '}') {\r
+                break;\r
+            }\r
+            else if (str[idx] != ',') {\r
+                raise_errmsg("Expecting , delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+\r
+            /* skip whitespace after , delimiter */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+        }\r
+    }\r
+    /* verify that idx < end_idx, str[idx] should be '}' */\r
+    if (idx > end_idx || str[idx] != '}') {\r
+        raise_errmsg("Expecting object", pystr, end_idx);\r
+        goto bail;\r
+    }\r
+\r
+    /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */\r
+    if (s->pairs_hook != Py_None) {\r
+        val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL);\r
+        if (val == NULL)\r
+            goto bail;\r
+        Py_DECREF(pairs);\r
+        *next_idx_ptr = idx + 1;\r
+        return val;\r
+    }\r
+\r
+    rval = PyObject_CallFunctionObjArgs((PyObject *)(&PyDict_Type), \r
+                                         pairs, NULL);\r
+    if (rval == NULL)\r
+        goto bail;\r
+    Py_CLEAR(pairs);\r
+\r
+    /* if object_hook is not None: rval = object_hook(rval) */\r
+    if (s->object_hook != Py_None) {\r
+        val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL);\r
+        if (val == NULL)\r
+            goto bail;\r
+        Py_DECREF(rval);\r
+        rval = val;\r
+        val = NULL;\r
+    }\r
+    *next_idx_ptr = idx + 1;\r
+    return rval;\r
+bail:\r
+    Py_XDECREF(key);\r
+    Py_XDECREF(val);\r
+    Py_XDECREF(pairs);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+_parse_object_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON object from PyUnicode pystr.\r
+    idx is the index of the first character after the opening curly brace.\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the closing curly brace.\r
+\r
+    Returns a new PyObject (usually a dict, but object_hook can change that)\r
+    */\r
+    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);\r
+    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;\r
+    PyObject *rval;\r
+    PyObject *pairs;\r
+    PyObject *item;\r
+    PyObject *key = NULL;\r
+    PyObject *val = NULL;\r
+    int strict = PyObject_IsTrue(s->strict);\r
+    Py_ssize_t next_idx;\r
+\r
+    pairs = PyList_New(0);\r
+    if (pairs == NULL)\r
+        return NULL;\r
+\r
+    /* skip whitespace after { */\r
+    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+    /* only loop if the object is non-empty */\r
+    if (idx <= end_idx && str[idx] != '}') {\r
+        while (idx <= end_idx) {\r
+            /* read key */\r
+            if (str[idx] != '"') {\r
+                raise_errmsg("Expecting property name enclosed in double quotes", pystr, idx);\r
+                goto bail;\r
+            }\r
+            key = scanstring_unicode(pystr, idx + 1, strict, &next_idx);\r
+            if (key == NULL)\r
+                goto bail;\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace between key and : delimiter, read :, skip whitespace */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+            if (idx > end_idx || str[idx] != ':') {\r
+                raise_errmsg("Expecting ':' delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* read any JSON term */\r
+            val = scan_once_unicode(s, pystr, idx, &next_idx);\r
+            if (val == NULL)\r
+                goto bail;\r
+\r
+            item = PyTuple_Pack(2, key, val);\r
+            if (item == NULL)\r
+                goto bail;\r
+            Py_CLEAR(key);\r
+            Py_CLEAR(val);\r
+            if (PyList_Append(pairs, item) == -1) {\r
+                Py_DECREF(item);\r
+                goto bail;\r
+            }\r
+            Py_DECREF(item);\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace before } or , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* bail if the object is closed or we didn't get the , delimiter */\r
+            if (idx > end_idx) break;\r
+            if (str[idx] == '}') {\r
+                break;\r
+            }\r
+            else if (str[idx] != ',') {\r
+                raise_errmsg("Expecting ',' delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+\r
+            /* skip whitespace after , delimiter */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+        }\r
+    }\r
+\r
+    /* verify that idx < end_idx, str[idx] should be '}' */\r
+    if (idx > end_idx || str[idx] != '}') {\r
+        raise_errmsg("Expecting object", pystr, end_idx);\r
+        goto bail;\r
+    }\r
+\r
+    /* if pairs_hook is not None: rval = object_pairs_hook(pairs) */\r
+    if (s->pairs_hook != Py_None) {\r
+        val = PyObject_CallFunctionObjArgs(s->pairs_hook, pairs, NULL);\r
+        if (val == NULL)\r
+            goto bail;\r
+        Py_DECREF(pairs);\r
+        *next_idx_ptr = idx + 1;\r
+        return val;\r
+    }\r
+\r
+    rval = PyObject_CallFunctionObjArgs((PyObject *)(&PyDict_Type), \r
+                                         pairs, NULL);\r
+    if (rval == NULL)\r
+        goto bail;\r
+    Py_CLEAR(pairs);\r
+\r
+    /* if object_hook is not None: rval = object_hook(rval) */\r
+    if (s->object_hook != Py_None) {\r
+        val = PyObject_CallFunctionObjArgs(s->object_hook, rval, NULL);\r
+        if (val == NULL)\r
+            goto bail;\r
+        Py_DECREF(rval);\r
+        rval = val;\r
+        val = NULL;\r
+    }\r
+    *next_idx_ptr = idx + 1;\r
+    return rval;\r
+bail:\r
+    Py_XDECREF(key);\r
+    Py_XDECREF(val);\r
+    Py_XDECREF(pairs);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+_parse_array_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON array from PyString pystr.\r
+    idx is the index of the first character after the opening brace.\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the closing brace.\r
+\r
+    Returns a new PyList\r
+    */\r
+    char *str = PyString_AS_STRING(pystr);\r
+    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;\r
+    PyObject *val = NULL;\r
+    PyObject *rval = PyList_New(0);\r
+    Py_ssize_t next_idx;\r
+    if (rval == NULL)\r
+        return NULL;\r
+\r
+    /* skip whitespace after [ */\r
+    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+    /* only loop if the array is non-empty */\r
+    if (idx <= end_idx && str[idx] != ']') {\r
+        while (idx <= end_idx) {\r
+\r
+            /* read any JSON term and de-tuplefy the (rval, idx) */\r
+            val = scan_once_str(s, pystr, idx, &next_idx);\r
+            if (val == NULL)\r
+                goto bail;\r
+\r
+            if (PyList_Append(rval, val) == -1)\r
+                goto bail;\r
+\r
+            Py_CLEAR(val);\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace between term and , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* bail if the array is closed or we didn't get the , delimiter */\r
+            if (idx > end_idx) break;\r
+            if (str[idx] == ']') {\r
+                break;\r
+            }\r
+            else if (str[idx] != ',') {\r
+                raise_errmsg("Expecting , delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+\r
+            /* skip whitespace after , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+        }\r
+    }\r
+\r
+    /* verify that idx < end_idx, str[idx] should be ']' */\r
+    if (idx > end_idx || str[idx] != ']') {\r
+        raise_errmsg("Expecting object", pystr, end_idx);\r
+        goto bail;\r
+    }\r
+    *next_idx_ptr = idx + 1;\r
+    return rval;\r
+bail:\r
+    Py_XDECREF(val);\r
+    Py_DECREF(rval);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+_parse_array_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON array from PyString pystr.\r
+    idx is the index of the first character after the opening brace.\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the closing brace.\r
+\r
+    Returns a new PyList\r
+    */\r
+    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);\r
+    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;\r
+    PyObject *val = NULL;\r
+    PyObject *rval = PyList_New(0);\r
+    Py_ssize_t next_idx;\r
+    if (rval == NULL)\r
+        return NULL;\r
+\r
+    /* skip whitespace after [ */\r
+    while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+    /* only loop if the array is non-empty */\r
+    if (idx <= end_idx && str[idx] != ']') {\r
+        while (idx <= end_idx) {\r
+\r
+            /* read any JSON term  */\r
+            val = scan_once_unicode(s, pystr, idx, &next_idx);\r
+            if (val == NULL)\r
+                goto bail;\r
+\r
+            if (PyList_Append(rval, val) == -1)\r
+                goto bail;\r
+\r
+            Py_CLEAR(val);\r
+            idx = next_idx;\r
+\r
+            /* skip whitespace between term and , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+\r
+            /* bail if the array is closed or we didn't get the , delimiter */\r
+            if (idx > end_idx) break;\r
+            if (str[idx] == ']') {\r
+                break;\r
+            }\r
+            else if (str[idx] != ',') {\r
+                raise_errmsg("Expecting ',' delimiter", pystr, idx);\r
+                goto bail;\r
+            }\r
+            idx++;\r
+\r
+            /* skip whitespace after , */\r
+            while (idx <= end_idx && IS_WHITESPACE(str[idx])) idx++;\r
+        }\r
+    }\r
+\r
+    /* verify that idx < end_idx, str[idx] should be ']' */\r
+    if (idx > end_idx || str[idx] != ']') {\r
+        raise_errmsg("Expecting object", pystr, end_idx);\r
+        goto bail;\r
+    }\r
+    *next_idx_ptr = idx + 1;\r
+    return rval;\r
+bail:\r
+    Py_XDECREF(val);\r
+    Py_DECREF(rval);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+_parse_constant(PyScannerObject *s, char *constant, Py_ssize_t idx, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON constant from PyString pystr.\r
+    constant is the constant string that was found\r
+        ("NaN", "Infinity", "-Infinity").\r
+    idx is the index of the first character of the constant\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the constant.\r
+\r
+    Returns the result of parse_constant\r
+    */\r
+    PyObject *cstr;\r
+    PyObject *rval;\r
+    /* constant is "NaN", "Infinity", or "-Infinity" */\r
+    cstr = PyString_InternFromString(constant);\r
+    if (cstr == NULL)\r
+        return NULL;\r
+\r
+    /* rval = parse_constant(constant) */\r
+    rval = PyObject_CallFunctionObjArgs(s->parse_constant, cstr, NULL);\r
+    idx += PyString_GET_SIZE(cstr);\r
+    Py_DECREF(cstr);\r
+    *next_idx_ptr = idx;\r
+    return rval;\r
+}\r
+\r
+static PyObject *\r
+_match_number_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON number from PyString pystr.\r
+    idx is the index of the first character of the number\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the number.\r
+\r
+    Returns a new PyObject representation of that number:\r
+        PyInt, PyLong, or PyFloat.\r
+        May return other types if parse_int or parse_float are set\r
+    */\r
+    char *str = PyString_AS_STRING(pystr);\r
+    Py_ssize_t end_idx = PyString_GET_SIZE(pystr) - 1;\r
+    Py_ssize_t idx = start;\r
+    int is_float = 0;\r
+    PyObject *rval;\r
+    PyObject *numstr;\r
+\r
+    /* read a sign if it's there, make sure it's not the end of the string */\r
+    if (str[idx] == '-') {\r
+        idx++;\r
+        if (idx > end_idx) {\r
+            PyErr_SetNone(PyExc_StopIteration);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    /* read as many integer digits as we find as long as it doesn't start with 0 */\r
+    if (str[idx] >= '1' && str[idx] <= '9') {\r
+        idx++;\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+    }\r
+    /* if it starts with 0 we only expect one integer digit */\r
+    else if (str[idx] == '0') {\r
+        idx++;\r
+    }\r
+    /* no integer digits, error */\r
+    else {\r
+        PyErr_SetNone(PyExc_StopIteration);\r
+        return NULL;\r
+    }\r
+\r
+    /* if the next char is '.' followed by a digit then read all float digits */\r
+    if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') {\r
+        is_float = 1;\r
+        idx += 2;\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+    }\r
+\r
+    /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */\r
+    if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) {\r
+\r
+        /* save the index of the 'e' or 'E' just in case we need to backtrack */\r
+        Py_ssize_t e_start = idx;\r
+        idx++;\r
+\r
+        /* read an exponent sign if present */\r
+        if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++;\r
+\r
+        /* read all digits */\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+\r
+        /* if we got a digit, then parse as float. if not, backtrack */\r
+        if (str[idx - 1] >= '0' && str[idx - 1] <= '9') {\r
+            is_float = 1;\r
+        }\r
+        else {\r
+            idx = e_start;\r
+        }\r
+    }\r
+\r
+    /* copy the section we determined to be a number */\r
+    numstr = PyString_FromStringAndSize(&str[start], idx - start);\r
+    if (numstr == NULL)\r
+        return NULL;\r
+    if (is_float) {\r
+        /* parse as a float using a fast path if available, otherwise call user defined method */\r
+        if (s->parse_float != (PyObject *)&PyFloat_Type) {\r
+            rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL);\r
+        }\r
+        else {\r
+            double d = PyOS_string_to_double(PyString_AS_STRING(numstr),\r
+                                             NULL, NULL);\r
+            if (d == -1.0 && PyErr_Occurred())\r
+                return NULL;\r
+            rval = PyFloat_FromDouble(d);\r
+        }\r
+    }\r
+    else {\r
+        /* parse as an int using a fast path if available, otherwise call user defined method */\r
+        if (s->parse_int != (PyObject *)&PyInt_Type) {\r
+            rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL);\r
+        }\r
+        else {\r
+            rval = PyInt_FromString(PyString_AS_STRING(numstr), NULL, 10);\r
+        }\r
+    }\r
+    Py_DECREF(numstr);\r
+    *next_idx_ptr = idx;\r
+    return rval;\r
+}\r
+\r
+static PyObject *\r
+_match_number_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t start, Py_ssize_t *next_idx_ptr) {\r
+    /* Read a JSON number from PyUnicode pystr.\r
+    idx is the index of the first character of the number\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the number.\r
+\r
+    Returns a new PyObject representation of that number:\r
+        PyInt, PyLong, or PyFloat.\r
+        May return other types if parse_int or parse_float are set\r
+    */\r
+    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);\r
+    Py_ssize_t end_idx = PyUnicode_GET_SIZE(pystr) - 1;\r
+    Py_ssize_t idx = start;\r
+    int is_float = 0;\r
+    PyObject *rval;\r
+    PyObject *numstr;\r
+\r
+    /* read a sign if it's there, make sure it's not the end of the string */\r
+    if (str[idx] == '-') {\r
+        idx++;\r
+        if (idx > end_idx) {\r
+            PyErr_SetNone(PyExc_StopIteration);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    /* read as many integer digits as we find as long as it doesn't start with 0 */\r
+    if (str[idx] >= '1' && str[idx] <= '9') {\r
+        idx++;\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+    }\r
+    /* if it starts with 0 we only expect one integer digit */\r
+    else if (str[idx] == '0') {\r
+        idx++;\r
+    }\r
+    /* no integer digits, error */\r
+    else {\r
+        PyErr_SetNone(PyExc_StopIteration);\r
+        return NULL;\r
+    }\r
+\r
+    /* if the next char is '.' followed by a digit then read all float digits */\r
+    if (idx < end_idx && str[idx] == '.' && str[idx + 1] >= '0' && str[idx + 1] <= '9') {\r
+        is_float = 1;\r
+        idx += 2;\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+    }\r
+\r
+    /* if the next char is 'e' or 'E' then maybe read the exponent (or backtrack) */\r
+    if (idx < end_idx && (str[idx] == 'e' || str[idx] == 'E')) {\r
+        Py_ssize_t e_start = idx;\r
+        idx++;\r
+\r
+        /* read an exponent sign if present */\r
+        if (idx < end_idx && (str[idx] == '-' || str[idx] == '+')) idx++;\r
+\r
+        /* read all digits */\r
+        while (idx <= end_idx && str[idx] >= '0' && str[idx] <= '9') idx++;\r
+\r
+        /* if we got a digit, then parse as float. if not, backtrack */\r
+        if (str[idx - 1] >= '0' && str[idx - 1] <= '9') {\r
+            is_float = 1;\r
+        }\r
+        else {\r
+            idx = e_start;\r
+        }\r
+    }\r
+\r
+    /* copy the section we determined to be a number */\r
+    numstr = PyUnicode_FromUnicode(&str[start], idx - start);\r
+    if (numstr == NULL)\r
+        return NULL;\r
+    if (is_float) {\r
+        /* parse as a float using a fast path if available, otherwise call user defined method */\r
+        if (s->parse_float != (PyObject *)&PyFloat_Type) {\r
+            rval = PyObject_CallFunctionObjArgs(s->parse_float, numstr, NULL);\r
+        }\r
+        else {\r
+            rval = PyFloat_FromString(numstr, NULL);\r
+        }\r
+    }\r
+    else {\r
+        /* no fast path for unicode -> int, just call */\r
+        rval = PyObject_CallFunctionObjArgs(s->parse_int, numstr, NULL);\r
+    }\r
+    Py_DECREF(numstr);\r
+    *next_idx_ptr = idx;\r
+    return rval;\r
+}\r
+\r
+static PyObject *\r
+scan_once_str(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr)\r
+{\r
+    /* Read one JSON term (of any kind) from PyString pystr.\r
+    idx is the index of the first character of the term\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the number.\r
+\r
+    Returns a new PyObject representation of the term.\r
+    */\r
+    PyObject *res;\r
+    char *str = PyString_AS_STRING(pystr);\r
+    Py_ssize_t length = PyString_GET_SIZE(pystr);\r
+    if (idx < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "idx cannot be negative");\r
+        return NULL;\r
+    }\r
+    if (idx >= length) {\r
+        PyErr_SetNone(PyExc_StopIteration);\r
+        return NULL;\r
+    }\r
+    switch (str[idx]) {\r
+        case '"':\r
+            /* string */\r
+            return scanstring_str(pystr, idx + 1,\r
+                PyString_AS_STRING(s->encoding),\r
+                PyObject_IsTrue(s->strict),\r
+                next_idx_ptr);\r
+        case '{':\r
+            /* object */\r
+            if (Py_EnterRecursiveCall(" while decoding a JSON object "\r
+                                      "from a byte string"))\r
+                return NULL;\r
+            res = _parse_object_str(s, pystr, idx + 1, next_idx_ptr);\r
+            Py_LeaveRecursiveCall();\r
+            return res;\r
+        case '[':\r
+            /* array */\r
+            if (Py_EnterRecursiveCall(" while decoding a JSON array "\r
+                                      "from a byte string"))\r
+                return NULL;\r
+            res = _parse_array_str(s, pystr, idx + 1, next_idx_ptr);\r
+            Py_LeaveRecursiveCall();\r
+            return res;\r
+        case 'n':\r
+            /* null */\r
+            if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') {\r
+                Py_INCREF(Py_None);\r
+                *next_idx_ptr = idx + 4;\r
+                return Py_None;\r
+            }\r
+            break;\r
+        case 't':\r
+            /* true */\r
+            if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') {\r
+                Py_INCREF(Py_True);\r
+                *next_idx_ptr = idx + 4;\r
+                return Py_True;\r
+            }\r
+            break;\r
+        case 'f':\r
+            /* false */\r
+            if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') {\r
+                Py_INCREF(Py_False);\r
+                *next_idx_ptr = idx + 5;\r
+                return Py_False;\r
+            }\r
+            break;\r
+        case 'N':\r
+            /* NaN */\r
+            if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') {\r
+                return _parse_constant(s, "NaN", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+        case 'I':\r
+            /* Infinity */\r
+            if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') {\r
+                return _parse_constant(s, "Infinity", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+        case '-':\r
+            /* -Infinity */\r
+            if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') {\r
+                return _parse_constant(s, "-Infinity", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+    }\r
+    /* Didn't find a string, object, array, or named constant. Look for a number. */\r
+    return _match_number_str(s, pystr, idx, next_idx_ptr);\r
+}\r
+\r
+static PyObject *\r
+scan_once_unicode(PyScannerObject *s, PyObject *pystr, Py_ssize_t idx, Py_ssize_t *next_idx_ptr)\r
+{\r
+    /* Read one JSON term (of any kind) from PyUnicode pystr.\r
+    idx is the index of the first character of the term\r
+    *next_idx_ptr is a return-by-reference index to the first character after\r
+        the number.\r
+\r
+    Returns a new PyObject representation of the term.\r
+    */\r
+    PyObject *res;\r
+    Py_UNICODE *str = PyUnicode_AS_UNICODE(pystr);\r
+    Py_ssize_t length = PyUnicode_GET_SIZE(pystr);\r
+    if (idx < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "idx cannot be negative");\r
+        return NULL;\r
+    }\r
+    if (idx >= length) {\r
+        PyErr_SetNone(PyExc_StopIteration);\r
+        return NULL;\r
+    }\r
+    switch (str[idx]) {\r
+        case '"':\r
+            /* string */\r
+            return scanstring_unicode(pystr, idx + 1,\r
+                PyObject_IsTrue(s->strict),\r
+                next_idx_ptr);\r
+        case '{':\r
+            /* object */\r
+            if (Py_EnterRecursiveCall(" while decoding a JSON object "\r
+                                      "from a unicode string"))\r
+                return NULL;\r
+            res = _parse_object_unicode(s, pystr, idx + 1, next_idx_ptr);\r
+            Py_LeaveRecursiveCall();\r
+            return res;\r
+        case '[':\r
+            /* array */\r
+            if (Py_EnterRecursiveCall(" while decoding a JSON array "\r
+                                      "from a unicode string"))\r
+                return NULL;\r
+            res = _parse_array_unicode(s, pystr, idx + 1, next_idx_ptr);\r
+            Py_LeaveRecursiveCall();\r
+            return res;\r
+        case 'n':\r
+            /* null */\r
+            if ((idx + 3 < length) && str[idx + 1] == 'u' && str[idx + 2] == 'l' && str[idx + 3] == 'l') {\r
+                Py_INCREF(Py_None);\r
+                *next_idx_ptr = idx + 4;\r
+                return Py_None;\r
+            }\r
+            break;\r
+        case 't':\r
+            /* true */\r
+            if ((idx + 3 < length) && str[idx + 1] == 'r' && str[idx + 2] == 'u' && str[idx + 3] == 'e') {\r
+                Py_INCREF(Py_True);\r
+                *next_idx_ptr = idx + 4;\r
+                return Py_True;\r
+            }\r
+            break;\r
+        case 'f':\r
+            /* false */\r
+            if ((idx + 4 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'l' && str[idx + 3] == 's' && str[idx + 4] == 'e') {\r
+                Py_INCREF(Py_False);\r
+                *next_idx_ptr = idx + 5;\r
+                return Py_False;\r
+            }\r
+            break;\r
+        case 'N':\r
+            /* NaN */\r
+            if ((idx + 2 < length) && str[idx + 1] == 'a' && str[idx + 2] == 'N') {\r
+                return _parse_constant(s, "NaN", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+        case 'I':\r
+            /* Infinity */\r
+            if ((idx + 7 < length) && str[idx + 1] == 'n' && str[idx + 2] == 'f' && str[idx + 3] == 'i' && str[idx + 4] == 'n' && str[idx + 5] == 'i' && str[idx + 6] == 't' && str[idx + 7] == 'y') {\r
+                return _parse_constant(s, "Infinity", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+        case '-':\r
+            /* -Infinity */\r
+            if ((idx + 8 < length) && str[idx + 1] == 'I' && str[idx + 2] == 'n' && str[idx + 3] == 'f' && str[idx + 4] == 'i' && str[idx + 5] == 'n' && str[idx + 6] == 'i' && str[idx + 7] == 't' && str[idx + 8] == 'y') {\r
+                return _parse_constant(s, "-Infinity", idx, next_idx_ptr);\r
+            }\r
+            break;\r
+    }\r
+    /* Didn't find a string, object, array, or named constant. Look for a number. */\r
+    return _match_number_unicode(s, pystr, idx, next_idx_ptr);\r
+}\r
+\r
+static PyObject *\r
+scanner_call(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    /* Python callable interface to scan_once_{str,unicode} */\r
+    PyObject *pystr;\r
+    PyObject *rval;\r
+    Py_ssize_t idx;\r
+    Py_ssize_t next_idx = -1;\r
+    static char *kwlist[] = {"string", "idx", NULL};\r
+    PyScannerObject *s;\r
+    assert(PyScanner_Check(self));\r
+    s = (PyScannerObject *)self;\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:scan_once", kwlist, &pystr, _convertPyInt_AsSsize_t, &idx))\r
+        return NULL;\r
+\r
+    if (PyString_Check(pystr)) {\r
+        rval = scan_once_str(s, pystr, idx, &next_idx);\r
+    }\r
+    else if (PyUnicode_Check(pystr)) {\r
+        rval = scan_once_unicode(s, pystr, idx, &next_idx);\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                 "first argument must be a string, not %.80s",\r
+                 Py_TYPE(pystr)->tp_name);\r
+        return NULL;\r
+    }\r
+    return _build_rval_index_tuple(rval, next_idx);\r
+}\r
+\r
+static PyObject *\r
+scanner_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyScannerObject *s;\r
+    s = (PyScannerObject *)type->tp_alloc(type, 0);\r
+    if (s != NULL) {\r
+        s->encoding = NULL;\r
+        s->strict = NULL;\r
+        s->object_hook = NULL;\r
+        s->pairs_hook = NULL;\r
+        s->parse_float = NULL;\r
+        s->parse_int = NULL;\r
+        s->parse_constant = NULL;\r
+    }\r
+    return (PyObject *)s;\r
+}\r
+\r
+static int\r
+scanner_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    /* Initialize Scanner object */\r
+    PyObject *ctx;\r
+    static char *kwlist[] = {"context", NULL};\r
+    PyScannerObject *s;\r
+\r
+    assert(PyScanner_Check(self));\r
+    s = (PyScannerObject *)self;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:make_scanner", kwlist, &ctx))\r
+        return -1;\r
+\r
+    /* PyString_AS_STRING is used on encoding */\r
+    s->encoding = PyObject_GetAttrString(ctx, "encoding");\r
+    if (s->encoding == NULL)\r
+        goto bail;\r
+    if (s->encoding == Py_None) {\r
+        Py_DECREF(Py_None);\r
+        s->encoding = PyString_InternFromString(DEFAULT_ENCODING);\r
+    }\r
+    else if (PyUnicode_Check(s->encoding)) {\r
+        PyObject *tmp = PyUnicode_AsEncodedString(s->encoding, NULL, NULL);\r
+        Py_DECREF(s->encoding);\r
+        s->encoding = tmp;\r
+    }\r
+    if (s->encoding == NULL)\r
+        goto bail;\r
+    if (!PyString_Check(s->encoding)) {\r
+       PyErr_Format(PyExc_TypeError,\r
+                    "encoding must be a string, not %.80s",\r
+                    Py_TYPE(s->encoding)->tp_name);\r
+       goto bail;\r
+    }\r
+       \r
+\r
+    /* All of these will fail "gracefully" so we don't need to verify them */\r
+    s->strict = PyObject_GetAttrString(ctx, "strict");\r
+    if (s->strict == NULL)\r
+        goto bail;\r
+    s->object_hook = PyObject_GetAttrString(ctx, "object_hook");\r
+    if (s->object_hook == NULL)\r
+        goto bail;\r
+    s->pairs_hook = PyObject_GetAttrString(ctx, "object_pairs_hook");\r
+    if (s->pairs_hook == NULL)\r
+        goto bail;\r
+    s->parse_float = PyObject_GetAttrString(ctx, "parse_float");\r
+    if (s->parse_float == NULL)\r
+        goto bail;\r
+    s->parse_int = PyObject_GetAttrString(ctx, "parse_int");\r
+    if (s->parse_int == NULL)\r
+        goto bail;\r
+    s->parse_constant = PyObject_GetAttrString(ctx, "parse_constant");\r
+    if (s->parse_constant == NULL)\r
+        goto bail;\r
+\r
+    return 0;\r
+\r
+bail:\r
+    Py_CLEAR(s->encoding);\r
+    Py_CLEAR(s->strict);\r
+    Py_CLEAR(s->object_hook);\r
+    Py_CLEAR(s->pairs_hook);\r
+    Py_CLEAR(s->parse_float);\r
+    Py_CLEAR(s->parse_int);\r
+    Py_CLEAR(s->parse_constant);\r
+    return -1;\r
+}\r
+\r
+PyDoc_STRVAR(scanner_doc, "JSON scanner object");\r
+\r
+static\r
+PyTypeObject PyScannerType = {\r
+    PyObject_HEAD_INIT(NULL)\r
+    0,                    /* tp_internal */\r
+    "_json.Scanner",       /* tp_name */\r
+    sizeof(PyScannerObject), /* tp_basicsize */\r
+    0,                    /* tp_itemsize */\r
+    scanner_dealloc, /* tp_dealloc */\r
+    0,                    /* tp_print */\r
+    0,                    /* tp_getattr */\r
+    0,                    /* tp_setattr */\r
+    0,                    /* tp_compare */\r
+    0,                    /* tp_repr */\r
+    0,                    /* tp_as_number */\r
+    0,                    /* tp_as_sequence */\r
+    0,                    /* tp_as_mapping */\r
+    0,                    /* tp_hash */\r
+    scanner_call,         /* tp_call */\r
+    0,                    /* tp_str */\r
+    0,/* PyObject_GenericGetAttr, */                    /* tp_getattro */\r
+    0,/* PyObject_GenericSetAttr, */                    /* tp_setattro */\r
+    0,                    /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,   /* tp_flags */\r
+    scanner_doc,          /* tp_doc */\r
+    scanner_traverse,                    /* tp_traverse */\r
+    scanner_clear,                    /* tp_clear */\r
+    0,                    /* tp_richcompare */\r
+    0,                    /* tp_weaklistoffset */\r
+    0,                    /* tp_iter */\r
+    0,                    /* tp_iternext */\r
+    0,                    /* tp_methods */\r
+    scanner_members,                    /* tp_members */\r
+    0,                    /* tp_getset */\r
+    0,                    /* tp_base */\r
+    0,                    /* tp_dict */\r
+    0,                    /* tp_descr_get */\r
+    0,                    /* tp_descr_set */\r
+    0,                    /* tp_dictoffset */\r
+    scanner_init,                    /* tp_init */\r
+    0,/* PyType_GenericAlloc, */        /* tp_alloc */\r
+    scanner_new,          /* tp_new */\r
+    0,/* PyObject_GC_Del, */              /* tp_free */\r
+};\r
+\r
+static PyObject *\r
+encoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyEncoderObject *s;\r
+    s = (PyEncoderObject *)type->tp_alloc(type, 0);\r
+    if (s != NULL) {\r
+        s->markers = NULL;\r
+        s->defaultfn = NULL;\r
+        s->encoder = NULL;\r
+        s->indent = NULL;\r
+        s->key_separator = NULL;\r
+        s->item_separator = NULL;\r
+        s->sort_keys = NULL;\r
+        s->skipkeys = NULL;\r
+    }\r
+    return (PyObject *)s;\r
+}\r
+\r
+static int\r
+encoder_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    /* initialize Encoder object */\r
+    static char *kwlist[] = {"markers", "default", "encoder", "indent", "key_separator", "item_separator", "sort_keys", "skipkeys", "allow_nan", NULL};\r
+\r
+    PyEncoderObject *s;\r
+    PyObject *markers, *defaultfn, *encoder, *indent, *key_separator;\r
+    PyObject *item_separator, *sort_keys, *skipkeys, *allow_nan;\r
+\r
+    assert(PyEncoder_Check(self));\r
+    s = (PyEncoderObject *)self;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OOOOOOOOO:make_encoder", kwlist,\r
+        &markers, &defaultfn, &encoder, &indent, &key_separator, &item_separator,\r
+        &sort_keys, &skipkeys, &allow_nan))\r
+        return -1;\r
+\r
+    s->markers = markers;\r
+    s->defaultfn = defaultfn;\r
+    s->encoder = encoder;\r
+    s->indent = indent;\r
+    s->key_separator = key_separator;\r
+    s->item_separator = item_separator;\r
+    s->sort_keys = sort_keys;\r
+    s->skipkeys = skipkeys;\r
+    s->fast_encode = (PyCFunction_Check(s->encoder) && PyCFunction_GetFunction(s->encoder) == (PyCFunction)py_encode_basestring_ascii);\r
+    s->allow_nan = PyObject_IsTrue(allow_nan);\r
+\r
+    Py_INCREF(s->markers);\r
+    Py_INCREF(s->defaultfn);\r
+    Py_INCREF(s->encoder);\r
+    Py_INCREF(s->indent);\r
+    Py_INCREF(s->key_separator);\r
+    Py_INCREF(s->item_separator);\r
+    Py_INCREF(s->sort_keys);\r
+    Py_INCREF(s->skipkeys);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+encoder_call(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    /* Python callable interface to encode_listencode_obj */\r
+    static char *kwlist[] = {"obj", "_current_indent_level", NULL};\r
+    PyObject *obj;\r
+    PyObject *rval;\r
+    Py_ssize_t indent_level;\r
+    PyEncoderObject *s;\r
+    assert(PyEncoder_Check(self));\r
+    s = (PyEncoderObject *)self;\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO&:_iterencode", kwlist,\r
+        &obj, _convertPyInt_AsSsize_t, &indent_level))\r
+        return NULL;\r
+    rval = PyList_New(0);\r
+    if (rval == NULL)\r
+        return NULL;\r
+    if (encoder_listencode_obj(s, rval, obj, indent_level)) {\r
+        Py_DECREF(rval);\r
+        return NULL;\r
+    }\r
+    return rval;\r
+}\r
+\r
+static PyObject *\r
+_encoded_const(PyObject *obj)\r
+{\r
+    /* Return the JSON string representation of None, True, False */\r
+    if (obj == Py_None) {\r
+        static PyObject *s_null = NULL;\r
+        if (s_null == NULL) {\r
+            s_null = PyString_InternFromString("null");\r
+        }\r
+        Py_INCREF(s_null);\r
+        return s_null;\r
+    }\r
+    else if (obj == Py_True) {\r
+        static PyObject *s_true = NULL;\r
+        if (s_true == NULL) {\r
+            s_true = PyString_InternFromString("true");\r
+        }\r
+        Py_INCREF(s_true);\r
+        return s_true;\r
+    }\r
+    else if (obj == Py_False) {\r
+        static PyObject *s_false = NULL;\r
+        if (s_false == NULL) {\r
+            s_false = PyString_InternFromString("false");\r
+        }\r
+        Py_INCREF(s_false);\r
+        return s_false;\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_ValueError, "not a const");\r
+        return NULL;\r
+    }\r
+}\r
+\r
+static PyObject *\r
+encoder_encode_float(PyEncoderObject *s, PyObject *obj)\r
+{\r
+    /* Return the JSON representation of a PyFloat */\r
+    double i = PyFloat_AS_DOUBLE(obj);\r
+    if (!Py_IS_FINITE(i)) {\r
+        if (!s->allow_nan) {\r
+            PyErr_SetString(PyExc_ValueError, "Out of range float values are not JSON compliant");\r
+            return NULL;\r
+        }\r
+        if (i > 0) {\r
+            return PyString_FromString("Infinity");\r
+        }\r
+        else if (i < 0) {\r
+            return PyString_FromString("-Infinity");\r
+        }\r
+        else {\r
+            return PyString_FromString("NaN");\r
+        }\r
+    }\r
+    /* Use a better float format here? */\r
+    return PyObject_Repr(obj);\r
+}\r
+\r
+static PyObject *\r
+encoder_encode_string(PyEncoderObject *s, PyObject *obj)\r
+{\r
+    /* Return the JSON representation of a string */\r
+    if (s->fast_encode)\r
+        return py_encode_basestring_ascii(NULL, obj);\r
+    else\r
+        return PyObject_CallFunctionObjArgs(s->encoder, obj, NULL);\r
+}\r
+\r
+static int\r
+_steal_list_append(PyObject *lst, PyObject *stolen)\r
+{\r
+    /* Append stolen and then decrement its reference count */\r
+    int rval = PyList_Append(lst, stolen);\r
+    Py_DECREF(stolen);\r
+    return rval;\r
+}\r
+\r
+static int\r
+encoder_listencode_obj(PyEncoderObject *s, PyObject *rval, PyObject *obj, Py_ssize_t indent_level)\r
+{\r
+    /* Encode Python object obj to a JSON term, rval is a PyList */\r
+    PyObject *newobj;\r
+    int rv;\r
+\r
+    if (obj == Py_None || obj == Py_True || obj == Py_False) {\r
+        PyObject *cstr = _encoded_const(obj);\r
+        if (cstr == NULL)\r
+            return -1;\r
+        return _steal_list_append(rval, cstr);\r
+    }\r
+    else if (PyString_Check(obj) || PyUnicode_Check(obj))\r
+    {\r
+        PyObject *encoded = encoder_encode_string(s, obj);\r
+        if (encoded == NULL)\r
+            return -1;\r
+        return _steal_list_append(rval, encoded);\r
+    }\r
+    else if (PyInt_Check(obj) || PyLong_Check(obj)) {\r
+        PyObject *encoded = PyObject_Str(obj);\r
+        if (encoded == NULL)\r
+            return -1;\r
+        return _steal_list_append(rval, encoded);\r
+    }\r
+    else if (PyFloat_Check(obj)) {\r
+        PyObject *encoded = encoder_encode_float(s, obj);\r
+        if (encoded == NULL)\r
+            return -1;\r
+        return _steal_list_append(rval, encoded);\r
+    }\r
+    else if (PyList_Check(obj) || PyTuple_Check(obj)) {\r
+        if (Py_EnterRecursiveCall(" while encoding a JSON object"))\r
+            return -1;\r
+        rv = encoder_listencode_list(s, rval, obj, indent_level);\r
+        Py_LeaveRecursiveCall();\r
+        return rv;\r
+    }\r
+    else if (PyDict_Check(obj)) {\r
+        if (Py_EnterRecursiveCall(" while encoding a JSON object"))\r
+            return -1;\r
+        rv = encoder_listencode_dict(s, rval, obj, indent_level);\r
+        Py_LeaveRecursiveCall();\r
+        return rv;\r
+    }\r
+    else {\r
+        PyObject *ident = NULL;\r
+        if (s->markers != Py_None) {\r
+            int has_key;\r
+            ident = PyLong_FromVoidPtr(obj);\r
+            if (ident == NULL)\r
+                return -1;\r
+            has_key = PyDict_Contains(s->markers, ident);\r
+            if (has_key) {\r
+                if (has_key != -1)\r
+                    PyErr_SetString(PyExc_ValueError, "Circular reference detected");\r
+                Py_DECREF(ident);\r
+                return -1;\r
+            }\r
+            if (PyDict_SetItem(s->markers, ident, obj)) {\r
+                Py_DECREF(ident);\r
+                return -1;\r
+            }\r
+        }\r
+        newobj = PyObject_CallFunctionObjArgs(s->defaultfn, obj, NULL);\r
+        if (newobj == NULL) {\r
+            Py_XDECREF(ident);\r
+            return -1;\r
+        }\r
+\r
+        if (Py_EnterRecursiveCall(" while encoding a JSON object"))\r
+            return -1;\r
+        rv = encoder_listencode_obj(s, rval, newobj, indent_level);\r
+        Py_LeaveRecursiveCall();\r
+\r
+        Py_DECREF(newobj);\r
+        if (rv) {\r
+            Py_XDECREF(ident);\r
+            return -1;\r
+        }\r
+        if (ident != NULL) {\r
+            if (PyDict_DelItem(s->markers, ident)) {\r
+                Py_XDECREF(ident);\r
+                return -1;\r
+            }\r
+            Py_XDECREF(ident);\r
+        }\r
+        return rv;\r
+    }\r
+}\r
+\r
+static int\r
+encoder_listencode_dict(PyEncoderObject *s, PyObject *rval, PyObject *dct, Py_ssize_t indent_level)\r
+{\r
+    /* Encode Python dict dct a JSON term, rval is a PyList */\r
+    static PyObject *open_dict = NULL;\r
+    static PyObject *close_dict = NULL;\r
+    static PyObject *empty_dict = NULL;\r
+    PyObject *kstr = NULL;\r
+    PyObject *ident = NULL;\r
+    PyObject *key = NULL;\r
+    PyObject *value = NULL;\r
+    PyObject *it = NULL;\r
+    int skipkeys;\r
+    Py_ssize_t idx;\r
+\r
+    if (open_dict == NULL || close_dict == NULL || empty_dict == NULL) {\r
+        open_dict = PyString_InternFromString("{");\r
+        close_dict = PyString_InternFromString("}");\r
+        empty_dict = PyString_InternFromString("{}");\r
+        if (open_dict == NULL || close_dict == NULL || empty_dict == NULL)\r
+            return -1;\r
+    }\r
+    if (Py_SIZE(dct) == 0)\r
+        return PyList_Append(rval, empty_dict);\r
+\r
+    if (s->markers != Py_None) {\r
+        int has_key;\r
+        ident = PyLong_FromVoidPtr(dct);\r
+        if (ident == NULL)\r
+            goto bail;\r
+        has_key = PyDict_Contains(s->markers, ident);\r
+        if (has_key) {\r
+            if (has_key != -1)\r
+                PyErr_SetString(PyExc_ValueError, "Circular reference detected");\r
+            goto bail;\r
+        }\r
+        if (PyDict_SetItem(s->markers, ident, dct)) {\r
+            goto bail;\r
+        }\r
+    }\r
+\r
+    if (PyList_Append(rval, open_dict))\r
+        goto bail;\r
+\r
+    if (s->indent != Py_None) {\r
+        /* TODO: DOES NOT RUN */\r
+        indent_level += 1;\r
+        /*\r
+            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))\r
+            separator = _item_separator + newline_indent\r
+            buf += newline_indent\r
+        */\r
+    }\r
+\r
+    /* TODO: C speedup not implemented for sort_keys */\r
+\r
+    it = PyObject_GetIter(dct);\r
+    if (it == NULL)\r
+        goto bail;\r
+    skipkeys = PyObject_IsTrue(s->skipkeys);\r
+    idx = 0;\r
+    while ((key = PyIter_Next(it)) != NULL) {\r
+        PyObject *encoded;\r
+\r
+        if (PyString_Check(key) || PyUnicode_Check(key)) {\r
+            Py_INCREF(key);\r
+            kstr = key;\r
+        }\r
+        else if (PyFloat_Check(key)) {\r
+            kstr = encoder_encode_float(s, key);\r
+            if (kstr == NULL)\r
+                goto bail;\r
+        }\r
+        else if (PyInt_Check(key) || PyLong_Check(key)) {\r
+            kstr = PyObject_Str(key);\r
+            if (kstr == NULL)\r
+                goto bail;\r
+        }\r
+        else if (key == Py_True || key == Py_False || key == Py_None) {\r
+            kstr = _encoded_const(key);\r
+            if (kstr == NULL)\r
+                goto bail;\r
+        }\r
+        else if (skipkeys) {\r
+            Py_DECREF(key);\r
+            continue;\r
+        }\r
+        else {\r
+            /* TODO: include repr of key */\r
+            PyErr_SetString(PyExc_TypeError, "keys must be a string");\r
+            goto bail;\r
+        }\r
+\r
+        if (idx) {\r
+            if (PyList_Append(rval, s->item_separator))\r
+                goto bail;\r
+        }\r
+\r
+        value = PyObject_GetItem(dct, key);\r
+        if (value == NULL)\r
+            goto bail;\r
+\r
+        encoded = encoder_encode_string(s, kstr);\r
+        Py_CLEAR(kstr);\r
+        if (encoded == NULL)\r
+            goto bail;\r
+        if (PyList_Append(rval, encoded)) {\r
+            Py_DECREF(encoded);\r
+            goto bail;\r
+        }\r
+        Py_DECREF(encoded);\r
+        if (PyList_Append(rval, s->key_separator))\r
+            goto bail;\r
+        if (encoder_listencode_obj(s, rval, value, indent_level))\r
+            goto bail;\r
+        idx += 1;\r
+        Py_CLEAR(value);\r
+        Py_DECREF(key);\r
+    }\r
+    if (PyErr_Occurred())\r
+        goto bail;\r
+    Py_CLEAR(it);\r
+\r
+    if (ident != NULL) {\r
+        if (PyDict_DelItem(s->markers, ident))\r
+            goto bail;\r
+        Py_CLEAR(ident);\r
+    }\r
+    if (s->indent != Py_None) {\r
+        /* TODO: DOES NOT RUN */\r
+        /*\r
+            indent_level -= 1;\r
+\r
+            yield '\n' + (' ' * (_indent * _current_indent_level))\r
+        */\r
+    }\r
+    if (PyList_Append(rval, close_dict))\r
+        goto bail;\r
+    return 0;\r
+\r
+bail:\r
+    Py_XDECREF(it);\r
+    Py_XDECREF(key);\r
+    Py_XDECREF(value);\r
+    Py_XDECREF(kstr);\r
+    Py_XDECREF(ident);\r
+    return -1;\r
+}\r
+\r
+\r
+static int\r
+encoder_listencode_list(PyEncoderObject *s, PyObject *rval, PyObject *seq, Py_ssize_t indent_level)\r
+{\r
+    /* Encode Python list seq to a JSON term, rval is a PyList */\r
+    static PyObject *open_array = NULL;\r
+    static PyObject *close_array = NULL;\r
+    static PyObject *empty_array = NULL;\r
+    PyObject *ident = NULL;\r
+    PyObject *s_fast = NULL;\r
+    Py_ssize_t i;\r
+\r
+    if (open_array == NULL || close_array == NULL || empty_array == NULL) {\r
+        open_array = PyString_InternFromString("[");\r
+        close_array = PyString_InternFromString("]");\r
+        empty_array = PyString_InternFromString("[]");\r
+        if (open_array == NULL || close_array == NULL || empty_array == NULL)\r
+            return -1;\r
+    }\r
+    ident = NULL;\r
+    s_fast = PySequence_Fast(seq, "_iterencode_list needs a sequence");\r
+    if (s_fast == NULL)\r
+        return -1;\r
+    if (PySequence_Fast_GET_SIZE(s_fast) == 0) {\r
+        Py_DECREF(s_fast);\r
+        return PyList_Append(rval, empty_array);\r
+    }\r
+\r
+    if (s->markers != Py_None) {\r
+        int has_key;\r
+        ident = PyLong_FromVoidPtr(seq);\r
+        if (ident == NULL)\r
+            goto bail;\r
+        has_key = PyDict_Contains(s->markers, ident);\r
+        if (has_key) {\r
+            if (has_key != -1)\r
+                PyErr_SetString(PyExc_ValueError, "Circular reference detected");\r
+            goto bail;\r
+        }\r
+        if (PyDict_SetItem(s->markers, ident, seq)) {\r
+            goto bail;\r
+        }\r
+    }\r
+\r
+    if (PyList_Append(rval, open_array))\r
+        goto bail;\r
+    if (s->indent != Py_None) {\r
+        /* TODO: DOES NOT RUN */\r
+        indent_level += 1;\r
+        /*\r
+            newline_indent = '\n' + (' ' * (_indent * _current_indent_level))\r
+            separator = _item_separator + newline_indent\r
+            buf += newline_indent\r
+        */\r
+    }\r
+    for (i = 0; i < PySequence_Fast_GET_SIZE(s_fast); i++) {\r
+        PyObject *obj = PySequence_Fast_GET_ITEM(s_fast, i);\r
+        if (i) {\r
+            if (PyList_Append(rval, s->item_separator))\r
+                goto bail;\r
+        }\r
+        if (encoder_listencode_obj(s, rval, obj, indent_level))\r
+            goto bail;\r
+    }\r
+    if (ident != NULL) {\r
+        if (PyDict_DelItem(s->markers, ident))\r
+            goto bail;\r
+        Py_CLEAR(ident);\r
+    }\r
+    if (s->indent != Py_None) {\r
+        /* TODO: DOES NOT RUN */\r
+        /*\r
+            indent_level -= 1;\r
+\r
+            yield '\n' + (' ' * (_indent * _current_indent_level))\r
+        */\r
+    }\r
+    if (PyList_Append(rval, close_array))\r
+        goto bail;\r
+    Py_DECREF(s_fast);\r
+    return 0;\r
+\r
+bail:\r
+    Py_XDECREF(ident);\r
+    Py_DECREF(s_fast);\r
+    return -1;\r
+}\r
+\r
+static void\r
+encoder_dealloc(PyObject *self)\r
+{\r
+    /* Deallocate Encoder */\r
+    encoder_clear(self);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static int\r
+encoder_traverse(PyObject *self, visitproc visit, void *arg)\r
+{\r
+    PyEncoderObject *s;\r
+    assert(PyEncoder_Check(self));\r
+    s = (PyEncoderObject *)self;\r
+    Py_VISIT(s->markers);\r
+    Py_VISIT(s->defaultfn);\r
+    Py_VISIT(s->encoder);\r
+    Py_VISIT(s->indent);\r
+    Py_VISIT(s->key_separator);\r
+    Py_VISIT(s->item_separator);\r
+    Py_VISIT(s->sort_keys);\r
+    Py_VISIT(s->skipkeys);\r
+    return 0;\r
+}\r
+\r
+static int\r
+encoder_clear(PyObject *self)\r
+{\r
+    /* Deallocate Encoder */\r
+    PyEncoderObject *s;\r
+    assert(PyEncoder_Check(self));\r
+    s = (PyEncoderObject *)self;\r
+    Py_CLEAR(s->markers);\r
+    Py_CLEAR(s->defaultfn);\r
+    Py_CLEAR(s->encoder);\r
+    Py_CLEAR(s->indent);\r
+    Py_CLEAR(s->key_separator);\r
+    Py_CLEAR(s->item_separator);\r
+    Py_CLEAR(s->sort_keys);\r
+    Py_CLEAR(s->skipkeys);\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(encoder_doc, "_iterencode(obj, _current_indent_level) -> iterable");\r
+\r
+static\r
+PyTypeObject PyEncoderType = {\r
+    PyObject_HEAD_INIT(NULL)\r
+    0,                    /* tp_internal */\r
+    "_json.Encoder",       /* tp_name */\r
+    sizeof(PyEncoderObject), /* tp_basicsize */\r
+    0,                    /* tp_itemsize */\r
+    encoder_dealloc, /* tp_dealloc */\r
+    0,                    /* tp_print */\r
+    0,                    /* tp_getattr */\r
+    0,                    /* tp_setattr */\r
+    0,                    /* tp_compare */\r
+    0,                    /* tp_repr */\r
+    0,                    /* tp_as_number */\r
+    0,                    /* tp_as_sequence */\r
+    0,                    /* tp_as_mapping */\r
+    0,                    /* tp_hash */\r
+    encoder_call,         /* tp_call */\r
+    0,                    /* tp_str */\r
+    0,                    /* tp_getattro */\r
+    0,                    /* tp_setattro */\r
+    0,                    /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,   /* tp_flags */\r
+    encoder_doc,          /* tp_doc */\r
+    encoder_traverse,     /* tp_traverse */\r
+    encoder_clear,        /* tp_clear */\r
+    0,                    /* tp_richcompare */\r
+    0,                    /* tp_weaklistoffset */\r
+    0,                    /* tp_iter */\r
+    0,                    /* tp_iternext */\r
+    0,                    /* tp_methods */\r
+    encoder_members,      /* tp_members */\r
+    0,                    /* tp_getset */\r
+    0,                    /* tp_base */\r
+    0,                    /* tp_dict */\r
+    0,                    /* tp_descr_get */\r
+    0,                    /* tp_descr_set */\r
+    0,                    /* tp_dictoffset */\r
+    encoder_init,         /* tp_init */\r
+    0,                    /* tp_alloc */\r
+    encoder_new,          /* tp_new */\r
+    0,                    /* tp_free */\r
+};\r
+\r
+static PyMethodDef speedups_methods[] = {\r
+    {"encode_basestring_ascii",\r
+        (PyCFunction)py_encode_basestring_ascii,\r
+        METH_O,\r
+        pydoc_encode_basestring_ascii},\r
+    {"scanstring",\r
+        (PyCFunction)py_scanstring,\r
+        METH_VARARGS,\r
+        pydoc_scanstring},\r
+    {NULL, NULL, 0, NULL}\r
+};\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"json speedups\n");\r
+\r
+void\r
+init_json(void)\r
+{\r
+    PyObject *m;\r
+    PyScannerType.tp_new = PyType_GenericNew;\r
+    if (PyType_Ready(&PyScannerType) < 0)\r
+        return;\r
+    PyEncoderType.tp_new = PyType_GenericNew;\r
+    if (PyType_Ready(&PyEncoderType) < 0)\r
+        return;\r
+    m = Py_InitModule3("_json", speedups_methods, module_doc);\r
+    Py_INCREF((PyObject*)&PyScannerType);\r
+    PyModule_AddObject(m, "make_scanner", (PyObject*)&PyScannerType);\r
+    Py_INCREF((PyObject*)&PyEncoderType);\r
+    PyModule_AddObject(m, "make_encoder", (PyObject*)&PyEncoderType);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_localemodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_localemodule.c
new file mode 100644 (file)
index 0000000..d0acc11
--- /dev/null
@@ -0,0 +1,758 @@
+/***********************************************************\r
+Copyright (C) 1997, 2002, 2003 Martin von Loewis\r
+\r
+Permission to use, copy, modify, and distribute this software and its\r
+documentation for any purpose and without fee is hereby granted,\r
+provided that the above copyright notice appear in all copies.\r
+\r
+This software comes with no warranty. Use at your own risk.\r
+\r
+******************************************************************/\r
+\r
+#include "Python.h"\r
+\r
+#include <stdio.h>\r
+#include <locale.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+\r
+#ifdef HAVE_ERRNO_H\r
+#include <errno.h>\r
+#endif\r
+\r
+#ifdef HAVE_LANGINFO_H\r
+#include <langinfo.h>\r
+#endif\r
+\r
+#ifdef HAVE_LIBINTL_H\r
+#include <libintl.h>\r
+#endif\r
+\r
+#ifdef HAVE_WCHAR_H\r
+#include <wchar.h>\r
+#endif\r
+\r
+#if defined(MS_WINDOWS)\r
+#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#endif\r
+\r
+#ifdef RISCOS\r
+char *strdup(const char *);\r
+#endif\r
+\r
+PyDoc_STRVAR(locale__doc__, "Support for POSIX locales.");\r
+\r
+static PyObject *Error;\r
+\r
+/* support functions for formatting floating point numbers */\r
+\r
+PyDoc_STRVAR(setlocale__doc__,\r
+"(integer,string=None) -> string. Activates/queries locale processing.");\r
+\r
+/* the grouping is terminated by either 0 or CHAR_MAX */\r
+static PyObject*\r
+copy_grouping(char* s)\r
+{\r
+    int i;\r
+    PyObject *result, *val = NULL;\r
+\r
+    if (s[0] == '\0')\r
+    /* empty string: no grouping at all */\r
+    return PyList_New(0);\r
+\r
+    for (i = 0; s[i] != '\0' && s[i] != CHAR_MAX; i++)\r
+        ; /* nothing */\r
+\r
+    result = PyList_New(i+1);\r
+    if (!result)\r
+        return NULL;\r
+\r
+    i = -1;\r
+    do {\r
+        i++;\r
+        val = PyInt_FromLong(s[i]);\r
+        if (!val)\r
+            break;\r
+        if (PyList_SetItem(result, i, val)) {\r
+            Py_DECREF(val);\r
+            val = NULL;\r
+            break;\r
+        }\r
+    } while (s[i] != '\0' && s[i] != CHAR_MAX);\r
+\r
+    if (!val) {\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+static void\r
+fixup_ulcase(void)\r
+{\r
+    PyObject *mods, *strop, *string, *ulo;\r
+    unsigned char ul[256];\r
+    int n, c;\r
+\r
+    /* find the string and strop modules */\r
+    mods = PyImport_GetModuleDict();\r
+    if (!mods)\r
+        return;\r
+    string = PyDict_GetItemString(mods, "string");\r
+    if (string)\r
+        string = PyModule_GetDict(string);\r
+    strop=PyDict_GetItemString(mods, "strop");\r
+    if (strop)\r
+        strop = PyModule_GetDict(strop);\r
+    if (!string && !strop)\r
+        return;\r
+\r
+    /* create uppercase map string */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (isupper(c))\r
+            ul[n++] = c;\r
+    }\r
+    ulo = PyString_FromStringAndSize((const char *)ul, n);\r
+    if (!ulo)\r
+        return;\r
+    if (string)\r
+        PyDict_SetItemString(string, "uppercase", ulo);\r
+    if (strop)\r
+        PyDict_SetItemString(strop, "uppercase", ulo);\r
+    Py_DECREF(ulo);\r
+\r
+    /* create lowercase string */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (islower(c))\r
+            ul[n++] = c;\r
+    }\r
+    ulo = PyString_FromStringAndSize((const char *)ul, n);\r
+    if (!ulo)\r
+        return;\r
+    if (string)\r
+        PyDict_SetItemString(string, "lowercase", ulo);\r
+    if (strop)\r
+        PyDict_SetItemString(strop, "lowercase", ulo);\r
+    Py_DECREF(ulo);\r
+\r
+    /* create letters string */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (isalpha(c))\r
+            ul[n++] = c;\r
+    }\r
+    ulo = PyString_FromStringAndSize((const char *)ul, n);\r
+    if (!ulo)\r
+        return;\r
+    if (string)\r
+        PyDict_SetItemString(string, "letters", ulo);\r
+    Py_DECREF(ulo);\r
+}\r
+\r
+static PyObject*\r
+PyLocale_setlocale(PyObject* self, PyObject* args)\r
+{\r
+    int category;\r
+    char *locale = NULL, *result;\r
+    PyObject *result_object;\r
+\r
+    if (!PyArg_ParseTuple(args, "i|z:setlocale", &category, &locale))\r
+        return NULL;\r
+\r
+#if defined(MS_WINDOWS)\r
+    if (category < LC_MIN || category > LC_MAX)\r
+    {\r
+        PyErr_SetString(Error, "invalid locale category");\r
+        return NULL;\r
+    }\r
+#endif\r
+\r
+    if (locale) {\r
+    /* set locale */\r
+    result = setlocale(category, locale);\r
+    if (!result) {\r
+        /* operation failed, no setting was changed */\r
+        PyErr_SetString(Error, "unsupported locale setting");\r
+        return NULL;\r
+    }\r
+    result_object = PyString_FromString(result);\r
+    if (!result_object)\r
+        return NULL;\r
+    /* record changes to LC_CTYPE */\r
+    if (category == LC_CTYPE || category == LC_ALL)\r
+        fixup_ulcase();\r
+        /* things that got wrong up to here are ignored */\r
+        PyErr_Clear();\r
+    } else {\r
+    /* get locale */\r
+        result = setlocale(category, NULL);\r
+        if (!result) {\r
+            PyErr_SetString(Error, "locale query failed");\r
+            return NULL;\r
+        }\r
+        result_object = PyString_FromString(result);\r
+    }\r
+    return result_object;\r
+}\r
+\r
+PyDoc_STRVAR(localeconv__doc__,\r
+"() -> dict. Returns numeric and monetary locale-specific parameters.");\r
+\r
+static PyObject*\r
+PyLocale_localeconv(PyObject* self)\r
+{\r
+    PyObject* result;\r
+    struct lconv *l;\r
+    PyObject *x;\r
+\r
+    result = PyDict_New();\r
+    if (!result)\r
+        return NULL;\r
+\r
+    /* if LC_NUMERIC is different in the C library, use saved value */\r
+    l = localeconv();\r
+\r
+    /* hopefully, the localeconv result survives the C library calls\r
+       involved herein */\r
+\r
+#define RESULT_STRING(s)\\r
+    x = PyString_FromString(l->s);\\r
+    if (!x) goto failed;\\r
+    PyDict_SetItemString(result, #s, x);\\r
+    Py_XDECREF(x)\r
+\r
+#define RESULT_INT(i)\\r
+    x = PyInt_FromLong(l->i);\\r
+    if (!x) goto failed;\\r
+    PyDict_SetItemString(result, #i, x);\\r
+    Py_XDECREF(x)\r
+\r
+    /* Numeric information */\r
+    RESULT_STRING(decimal_point);\r
+    RESULT_STRING(thousands_sep);\r
+    x = copy_grouping(l->grouping);\r
+    if (!x)\r
+        goto failed;\r
+    PyDict_SetItemString(result, "grouping", x);\r
+    Py_XDECREF(x);\r
+\r
+    /* Monetary information */\r
+    RESULT_STRING(int_curr_symbol);\r
+    RESULT_STRING(currency_symbol);\r
+    RESULT_STRING(mon_decimal_point);\r
+    RESULT_STRING(mon_thousands_sep);\r
+    x = copy_grouping(l->mon_grouping);\r
+    if (!x)\r
+        goto failed;\r
+    PyDict_SetItemString(result, "mon_grouping", x);\r
+    Py_XDECREF(x);\r
+    RESULT_STRING(positive_sign);\r
+    RESULT_STRING(negative_sign);\r
+    RESULT_INT(int_frac_digits);\r
+    RESULT_INT(frac_digits);\r
+    RESULT_INT(p_cs_precedes);\r
+    RESULT_INT(p_sep_by_space);\r
+    RESULT_INT(n_cs_precedes);\r
+    RESULT_INT(n_sep_by_space);\r
+    RESULT_INT(p_sign_posn);\r
+    RESULT_INT(n_sign_posn);\r
+    return result;\r
+\r
+  failed:\r
+    Py_XDECREF(result);\r
+    Py_XDECREF(x);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(strcoll__doc__,\r
+"string,string -> int. Compares two strings according to the locale.");\r
+\r
+static PyObject*\r
+PyLocale_strcoll(PyObject* self, PyObject* args)\r
+{\r
+#if !defined(HAVE_WCSCOLL) || !defined(Py_USING_UNICODE)\r
+    char *s1,*s2;\r
+\r
+    if (!PyArg_ParseTuple(args, "ss:strcoll", &s1, &s2))\r
+        return NULL;\r
+    return PyInt_FromLong(strcoll(s1, s2));\r
+#else\r
+    PyObject *os1, *os2, *result = NULL;\r
+    wchar_t *ws1 = NULL, *ws2 = NULL;\r
+    int rel1 = 0, rel2 = 0, len1, len2;\r
+\r
+    if (!PyArg_UnpackTuple(args, "strcoll", 2, 2, &os1, &os2))\r
+        return NULL;\r
+    /* If both arguments are byte strings, use strcoll.  */\r
+    if (PyString_Check(os1) && PyString_Check(os2))\r
+        return PyInt_FromLong(strcoll(PyString_AS_STRING(os1),\r
+                                      PyString_AS_STRING(os2)));\r
+    /* If neither argument is unicode, it's an error.  */\r
+    if (!PyUnicode_Check(os1) && !PyUnicode_Check(os2)) {\r
+        PyErr_SetString(PyExc_ValueError, "strcoll arguments must be strings");\r
+    }\r
+    /* Convert the non-unicode argument to unicode. */\r
+    if (!PyUnicode_Check(os1)) {\r
+    os1 = PyUnicode_FromObject(os1);\r
+    if (!os1)\r
+        return NULL;\r
+        rel1 = 1;\r
+    }\r
+    if (!PyUnicode_Check(os2)) {\r
+        os2 = PyUnicode_FromObject(os2);\r
+        if (!os2) {\r
+            if (rel1) {\r
+                Py_DECREF(os1);\r
+            }\r
+            return NULL;\r
+        }\r
+        rel2 = 1;\r
+    }\r
+    /* Convert the unicode strings to wchar[]. */\r
+    len1 = PyUnicode_GET_SIZE(os1) + 1;\r
+    ws1 = PyMem_NEW(wchar_t, len1);\r
+    if (!ws1) {\r
+        PyErr_NoMemory();\r
+        goto done;\r
+    }\r
+    if (PyUnicode_AsWideChar((PyUnicodeObject*)os1, ws1, len1) == -1)\r
+        goto done;\r
+    ws1[len1 - 1] = 0;\r
+    len2 = PyUnicode_GET_SIZE(os2) + 1;\r
+    ws2 = PyMem_NEW(wchar_t, len2);\r
+    if (!ws2) {\r
+        PyErr_NoMemory();\r
+        goto done;\r
+    }\r
+    if (PyUnicode_AsWideChar((PyUnicodeObject*)os2, ws2, len2) == -1)\r
+        goto done;\r
+    ws2[len2 - 1] = 0;\r
+    /* Collate the strings. */\r
+    result = PyInt_FromLong(wcscoll(ws1, ws2));\r
+  done:\r
+    /* Deallocate everything. */\r
+    if (ws1) PyMem_FREE(ws1);\r
+    if (ws2) PyMem_FREE(ws2);\r
+    if (rel1) {\r
+        Py_DECREF(os1);\r
+    }\r
+    if (rel2) {\r
+        Py_DECREF(os2);\r
+    }\r
+    return result;\r
+#endif\r
+}\r
+\r
+\r
+PyDoc_STRVAR(strxfrm__doc__,\r
+"string -> string. Returns a string that behaves for cmp locale-aware.");\r
+\r
+static PyObject*\r
+PyLocale_strxfrm(PyObject* self, PyObject* args)\r
+{\r
+    char *s, *buf;\r
+    size_t n1, n2;\r
+    PyObject *result;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:strxfrm", &s))\r
+        return NULL;\r
+\r
+    /* assume no change in size, first */\r
+    n1 = strlen(s) + 1;\r
+    buf = PyMem_Malloc(n1);\r
+    if (!buf)\r
+        return PyErr_NoMemory();\r
+    n2 = strxfrm(buf, s, n1) + 1;\r
+    if (n2 > n1) {\r
+        /* more space needed */\r
+        buf = PyMem_Realloc(buf, n2);\r
+        if (!buf)\r
+            return PyErr_NoMemory();\r
+        strxfrm(buf, s, n2);\r
+    }\r
+    result = PyString_FromString(buf);\r
+    PyMem_Free(buf);\r
+    return result;\r
+}\r
+\r
+#if defined(MS_WINDOWS)\r
+static PyObject*\r
+PyLocale_getdefaultlocale(PyObject* self)\r
+{\r
+    char encoding[100];\r
+    char locale[100];\r
+\r
+    PyOS_snprintf(encoding, sizeof(encoding), "cp%d", GetACP());\r
+\r
+    if (GetLocaleInfo(LOCALE_USER_DEFAULT,\r
+                      LOCALE_SISO639LANGNAME,\r
+                      locale, sizeof(locale))) {\r
+        Py_ssize_t i = strlen(locale);\r
+        locale[i++] = '_';\r
+        if (GetLocaleInfo(LOCALE_USER_DEFAULT,\r
+                          LOCALE_SISO3166CTRYNAME,\r
+                          locale+i, (int)(sizeof(locale)-i)))\r
+            return Py_BuildValue("ss", locale, encoding);\r
+    }\r
+\r
+    /* If we end up here, this windows version didn't know about\r
+       ISO639/ISO3166 names (it's probably Windows 95).  Return the\r
+       Windows language identifier instead (a hexadecimal number) */\r
+\r
+    locale[0] = '0';\r
+    locale[1] = 'x';\r
+    if (GetLocaleInfo(LOCALE_USER_DEFAULT, LOCALE_IDEFAULTLANGUAGE,\r
+                      locale+2, sizeof(locale)-2)) {\r
+        return Py_BuildValue("ss", locale, encoding);\r
+    }\r
+\r
+    /* cannot determine the language code (very unlikely) */\r
+    Py_INCREF(Py_None);\r
+    return Py_BuildValue("Os", Py_None, encoding);\r
+}\r
+#endif\r
+\r
+#ifdef HAVE_LANGINFO_H\r
+#define LANGINFO(X) {#X, X}\r
+static struct langinfo_constant{\r
+    char* name;\r
+    int value;\r
+} langinfo_constants[] =\r
+{\r
+    /* These constants should exist on any langinfo implementation */\r
+    LANGINFO(DAY_1),\r
+    LANGINFO(DAY_2),\r
+    LANGINFO(DAY_3),\r
+    LANGINFO(DAY_4),\r
+    LANGINFO(DAY_5),\r
+    LANGINFO(DAY_6),\r
+    LANGINFO(DAY_7),\r
+\r
+    LANGINFO(ABDAY_1),\r
+    LANGINFO(ABDAY_2),\r
+    LANGINFO(ABDAY_3),\r
+    LANGINFO(ABDAY_4),\r
+    LANGINFO(ABDAY_5),\r
+    LANGINFO(ABDAY_6),\r
+    LANGINFO(ABDAY_7),\r
+\r
+    LANGINFO(MON_1),\r
+    LANGINFO(MON_2),\r
+    LANGINFO(MON_3),\r
+    LANGINFO(MON_4),\r
+    LANGINFO(MON_5),\r
+    LANGINFO(MON_6),\r
+    LANGINFO(MON_7),\r
+    LANGINFO(MON_8),\r
+    LANGINFO(MON_9),\r
+    LANGINFO(MON_10),\r
+    LANGINFO(MON_11),\r
+    LANGINFO(MON_12),\r
+\r
+    LANGINFO(ABMON_1),\r
+    LANGINFO(ABMON_2),\r
+    LANGINFO(ABMON_3),\r
+    LANGINFO(ABMON_4),\r
+    LANGINFO(ABMON_5),\r
+    LANGINFO(ABMON_6),\r
+    LANGINFO(ABMON_7),\r
+    LANGINFO(ABMON_8),\r
+    LANGINFO(ABMON_9),\r
+    LANGINFO(ABMON_10),\r
+    LANGINFO(ABMON_11),\r
+    LANGINFO(ABMON_12),\r
+\r
+#ifdef RADIXCHAR\r
+    /* The following are not available with glibc 2.0 */\r
+    LANGINFO(RADIXCHAR),\r
+    LANGINFO(THOUSEP),\r
+    /* YESSTR and NOSTR are deprecated in glibc, since they are\r
+       a special case of message translation, which should be rather\r
+       done using gettext. So we don't expose it to Python in the\r
+       first place.\r
+    LANGINFO(YESSTR),\r
+    LANGINFO(NOSTR),\r
+    */\r
+    LANGINFO(CRNCYSTR),\r
+#endif\r
+\r
+    LANGINFO(D_T_FMT),\r
+    LANGINFO(D_FMT),\r
+    LANGINFO(T_FMT),\r
+    LANGINFO(AM_STR),\r
+    LANGINFO(PM_STR),\r
+\r
+    /* The following constants are available only with XPG4, but...\r
+       AIX 3.2. only has CODESET.\r
+       OpenBSD doesn't have CODESET but has T_FMT_AMPM, and doesn't have\r
+       a few of the others.\r
+       Solution: ifdef-test them all. */\r
+#ifdef CODESET\r
+    LANGINFO(CODESET),\r
+#endif\r
+#ifdef T_FMT_AMPM\r
+    LANGINFO(T_FMT_AMPM),\r
+#endif\r
+#ifdef ERA\r
+    LANGINFO(ERA),\r
+#endif\r
+#ifdef ERA_D_FMT\r
+    LANGINFO(ERA_D_FMT),\r
+#endif\r
+#ifdef ERA_D_T_FMT\r
+    LANGINFO(ERA_D_T_FMT),\r
+#endif\r
+#ifdef ERA_T_FMT\r
+    LANGINFO(ERA_T_FMT),\r
+#endif\r
+#ifdef ALT_DIGITS\r
+    LANGINFO(ALT_DIGITS),\r
+#endif\r
+#ifdef YESEXPR\r
+    LANGINFO(YESEXPR),\r
+#endif\r
+#ifdef NOEXPR\r
+    LANGINFO(NOEXPR),\r
+#endif\r
+#ifdef _DATE_FMT\r
+    /* This is not available in all glibc versions that have CODESET. */\r
+    LANGINFO(_DATE_FMT),\r
+#endif\r
+    {0, 0}\r
+};\r
+\r
+PyDoc_STRVAR(nl_langinfo__doc__,\r
+"nl_langinfo(key) -> string\n"\r
+"Return the value for the locale information associated with key.");\r
+\r
+static PyObject*\r
+PyLocale_nl_langinfo(PyObject* self, PyObject* args)\r
+{\r
+    int item, i;\r
+    if (!PyArg_ParseTuple(args, "i:nl_langinfo", &item))\r
+    return NULL;\r
+    /* Check whether this is a supported constant. GNU libc sometimes\r
+       returns numeric values in the char* return value, which would\r
+       crash PyString_FromString.  */\r
+    for (i = 0; langinfo_constants[i].name; i++)\r
+        if (langinfo_constants[i].value == item) {\r
+            /* Check NULL as a workaround for GNU libc's returning NULL\r
+               instead of an empty string for nl_langinfo(ERA).  */\r
+            const char *result = nl_langinfo(item);\r
+            return PyString_FromString(result != NULL ? result : "");\r
+        }\r
+    PyErr_SetString(PyExc_ValueError, "unsupported langinfo constant");\r
+    return NULL;\r
+}\r
+#endif /* HAVE_LANGINFO_H */\r
+\r
+#ifdef HAVE_LIBINTL_H\r
+\r
+PyDoc_STRVAR(gettext__doc__,\r
+"gettext(msg) -> string\n"\r
+"Return translation of msg.");\r
+\r
+static PyObject*\r
+PyIntl_gettext(PyObject* self, PyObject *args)\r
+{\r
+    char *in;\r
+    if (!PyArg_ParseTuple(args, "s", &in))\r
+        return 0;\r
+    return PyString_FromString(gettext(in));\r
+}\r
+\r
+PyDoc_STRVAR(dgettext__doc__,\r
+"dgettext(domain, msg) -> string\n"\r
+"Return translation of msg in domain.");\r
+\r
+static PyObject*\r
+PyIntl_dgettext(PyObject* self, PyObject *args)\r
+{\r
+    char *domain, *in;\r
+    if (!PyArg_ParseTuple(args, "zs", &domain, &in))\r
+        return 0;\r
+    return PyString_FromString(dgettext(domain, in));\r
+}\r
+\r
+PyDoc_STRVAR(dcgettext__doc__,\r
+"dcgettext(domain, msg, category) -> string\n"\r
+"Return translation of msg in domain and category.");\r
+\r
+static PyObject*\r
+PyIntl_dcgettext(PyObject *self, PyObject *args)\r
+{\r
+    char *domain, *msgid;\r
+    int category;\r
+    if (!PyArg_ParseTuple(args, "zsi", &domain, &msgid, &category))\r
+        return 0;\r
+    return PyString_FromString(dcgettext(domain,msgid,category));\r
+}\r
+\r
+PyDoc_STRVAR(textdomain__doc__,\r
+"textdomain(domain) -> string\n"\r
+"Set the C library's textdmain to domain, returning the new domain.");\r
+\r
+static PyObject*\r
+PyIntl_textdomain(PyObject* self, PyObject* args)\r
+{\r
+    char *domain;\r
+    if (!PyArg_ParseTuple(args, "z", &domain))\r
+        return 0;\r
+    domain = textdomain(domain);\r
+    if (!domain) {\r
+        PyErr_SetFromErrno(PyExc_OSError);\r
+        return NULL;\r
+    }\r
+    return PyString_FromString(domain);\r
+}\r
+\r
+PyDoc_STRVAR(bindtextdomain__doc__,\r
+"bindtextdomain(domain, dir) -> string\n"\r
+"Bind the C library's domain to dir.");\r
+\r
+static PyObject*\r
+PyIntl_bindtextdomain(PyObject* self,PyObject*args)\r
+{\r
+    char *domain, *dirname;\r
+    if (!PyArg_ParseTuple(args, "sz", &domain, &dirname))\r
+        return 0;\r
+    if (!strlen(domain)) {\r
+        PyErr_SetString(Error, "domain must be a non-empty string");\r
+        return 0;\r
+    }\r
+    dirname = bindtextdomain(domain, dirname);\r
+    if (!dirname) {\r
+        PyErr_SetFromErrno(PyExc_OSError);\r
+        return NULL;\r
+    }\r
+    return PyString_FromString(dirname);\r
+}\r
+\r
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET\r
+PyDoc_STRVAR(bind_textdomain_codeset__doc__,\r
+"bind_textdomain_codeset(domain, codeset) -> string\n"\r
+"Bind the C library's domain to codeset.");\r
+\r
+static PyObject*\r
+PyIntl_bind_textdomain_codeset(PyObject* self,PyObject*args)\r
+{\r
+    char *domain,*codeset;\r
+    if (!PyArg_ParseTuple(args, "sz", &domain, &codeset))\r
+        return NULL;\r
+    codeset = bind_textdomain_codeset(domain, codeset);\r
+    if (codeset)\r
+        return PyString_FromString(codeset);\r
+    Py_RETURN_NONE;\r
+}\r
+#endif\r
+\r
+#endif\r
+\r
+static struct PyMethodDef PyLocale_Methods[] = {\r
+  {"setlocale", (PyCFunction) PyLocale_setlocale,\r
+   METH_VARARGS, setlocale__doc__},\r
+  {"localeconv", (PyCFunction) PyLocale_localeconv,\r
+   METH_NOARGS, localeconv__doc__},\r
+  {"strcoll", (PyCFunction) PyLocale_strcoll,\r
+   METH_VARARGS, strcoll__doc__},\r
+  {"strxfrm", (PyCFunction) PyLocale_strxfrm,\r
+   METH_VARARGS, strxfrm__doc__},\r
+#if defined(MS_WINDOWS)\r
+  {"_getdefaultlocale", (PyCFunction) PyLocale_getdefaultlocale, METH_NOARGS},\r
+#endif\r
+#ifdef HAVE_LANGINFO_H\r
+  {"nl_langinfo", (PyCFunction) PyLocale_nl_langinfo,\r
+   METH_VARARGS, nl_langinfo__doc__},\r
+#endif\r
+#ifdef HAVE_LIBINTL_H\r
+  {"gettext",(PyCFunction)PyIntl_gettext,METH_VARARGS,\r
+    gettext__doc__},\r
+  {"dgettext",(PyCFunction)PyIntl_dgettext,METH_VARARGS,\r
+   dgettext__doc__},\r
+  {"dcgettext",(PyCFunction)PyIntl_dcgettext,METH_VARARGS,\r
+    dcgettext__doc__},\r
+  {"textdomain",(PyCFunction)PyIntl_textdomain,METH_VARARGS,\r
+   textdomain__doc__},\r
+  {"bindtextdomain",(PyCFunction)PyIntl_bindtextdomain,METH_VARARGS,\r
+   bindtextdomain__doc__},\r
+#ifdef HAVE_BIND_TEXTDOMAIN_CODESET\r
+  {"bind_textdomain_codeset",(PyCFunction)PyIntl_bind_textdomain_codeset,\r
+   METH_VARARGS, bind_textdomain_codeset__doc__},\r
+#endif\r
+#endif\r
+  {NULL, NULL}\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_locale(void)\r
+{\r
+    PyObject *m, *d, *x;\r
+#ifdef HAVE_LANGINFO_H\r
+    int i;\r
+#endif\r
+\r
+    m = Py_InitModule("_locale", PyLocale_Methods);\r
+    if (m == NULL)\r
+    return;\r
+\r
+    d = PyModule_GetDict(m);\r
+\r
+    x = PyInt_FromLong(LC_CTYPE);\r
+    PyDict_SetItemString(d, "LC_CTYPE", x);\r
+    Py_XDECREF(x);\r
+\r
+    x = PyInt_FromLong(LC_TIME);\r
+    PyDict_SetItemString(d, "LC_TIME", x);\r
+    Py_XDECREF(x);\r
+\r
+    x = PyInt_FromLong(LC_COLLATE);\r
+    PyDict_SetItemString(d, "LC_COLLATE", x);\r
+    Py_XDECREF(x);\r
+\r
+    x = PyInt_FromLong(LC_MONETARY);\r
+    PyDict_SetItemString(d, "LC_MONETARY", x);\r
+    Py_XDECREF(x);\r
+\r
+#ifdef LC_MESSAGES\r
+    x = PyInt_FromLong(LC_MESSAGES);\r
+    PyDict_SetItemString(d, "LC_MESSAGES", x);\r
+    Py_XDECREF(x);\r
+#endif /* LC_MESSAGES */\r
+\r
+    x = PyInt_FromLong(LC_NUMERIC);\r
+    PyDict_SetItemString(d, "LC_NUMERIC", x);\r
+    Py_XDECREF(x);\r
+\r
+    x = PyInt_FromLong(LC_ALL);\r
+    PyDict_SetItemString(d, "LC_ALL", x);\r
+    Py_XDECREF(x);\r
+\r
+    x = PyInt_FromLong(CHAR_MAX);\r
+    PyDict_SetItemString(d, "CHAR_MAX", x);\r
+    Py_XDECREF(x);\r
+\r
+    Error = PyErr_NewException("locale.Error", NULL, NULL);\r
+    PyDict_SetItemString(d, "Error", Error);\r
+\r
+    x = PyString_FromString(locale__doc__);\r
+    PyDict_SetItemString(d, "__doc__", x);\r
+    Py_XDECREF(x);\r
+\r
+#ifdef HAVE_LANGINFO_H\r
+    for (i = 0; langinfo_constants[i].name; i++) {\r
+        PyModule_AddIntConstant(m, langinfo_constants[i].name,\r
+                                langinfo_constants[i].value);\r
+    }\r
+#endif\r
+}\r
+\r
+/*\r
+Local variables:\r
+c-basic-offset: 4\r
+indent-tabs-mode: nil\r
+End:\r
+*/\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_math.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_math.c
new file mode 100644 (file)
index 0000000..5d9c365
--- /dev/null
@@ -0,0 +1,255 @@
+/* Definitions of some C99 math library functions, for those platforms\r
+   that don't implement these functions already. */\r
+\r
+#include "Python.h"\r
+#include <float.h>\r
+#include "_math.h"\r
+\r
+/* The following copyright notice applies to the original\r
+   implementations of acosh, asinh and atanh. */\r
+\r
+/*\r
+ * ====================================================\r
+ * Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.\r
+ *\r
+ * Developed at SunPro, a Sun Microsystems, Inc. business.\r
+ * Permission to use, copy, modify, and distribute this\r
+ * software is freely granted, provided that this notice\r
+ * is preserved.\r
+ * ====================================================\r
+ */\r
+\r
+static const double ln2 = 6.93147180559945286227E-01;\r
+static const double two_pow_m28 = 3.7252902984619141E-09; /* 2**-28 */\r
+static const double two_pow_p28 = 268435456.0; /* 2**28 */\r
+static const double zero = 0.0;\r
+\r
+/* acosh(x)\r
+ * Method :\r
+ *      Based on\r
+ *            acosh(x) = log [ x + sqrt(x*x-1) ]\r
+ *      we have\r
+ *            acosh(x) := log(x)+ln2, if x is large; else\r
+ *            acosh(x) := log(2x-1/(sqrt(x*x-1)+x)) if x>2; else\r
+ *            acosh(x) := log1p(t+sqrt(2.0*t+t*t)); where t=x-1.\r
+ *\r
+ * Special cases:\r
+ *      acosh(x) is NaN with signal if x<1.\r
+ *      acosh(NaN) is NaN without signal.\r
+ */\r
+\r
+double\r
+_Py_acosh(double x)\r
+{\r
+    if (Py_IS_NAN(x)) {\r
+        return x+x;\r
+    }\r
+    if (x < 1.) {                       /* x < 1;  return a signaling NaN */\r
+        errno = EDOM;\r
+#ifdef Py_NAN\r
+        return Py_NAN;\r
+#else\r
+        return (x-x)/(x-x);\r
+#endif\r
+    }\r
+    else if (x >= two_pow_p28) {        /* x > 2**28 */\r
+        if (Py_IS_INFINITY(x)) {\r
+            return x+x;\r
+        }\r
+        else {\r
+            return log(x)+ln2;          /* acosh(huge)=log(2x) */\r
+        }\r
+    }\r
+    else if (x == 1.) {\r
+        return 0.0;                     /* acosh(1) = 0 */\r
+    }\r
+    else if (x > 2.) {                  /* 2 < x < 2**28 */\r
+        double t = x*x;\r
+        return log(2.0*x - 1.0 / (x + sqrt(t - 1.0)));\r
+    }\r
+    else {                              /* 1 < x <= 2 */\r
+        double t = x - 1.0;\r
+        return m_log1p(t + sqrt(2.0*t + t*t));\r
+    }\r
+}\r
+\r
+\r
+/* asinh(x)\r
+ * Method :\r
+ *      Based on\r
+ *              asinh(x) = sign(x) * log [ |x| + sqrt(x*x+1) ]\r
+ *      we have\r
+ *      asinh(x) := x  if  1+x*x=1,\r
+ *               := sign(x)*(log(x)+ln2)) for large |x|, else\r
+ *               := sign(x)*log(2|x|+1/(|x|+sqrt(x*x+1))) if|x|>2, else\r
+ *               := sign(x)*log1p(|x| + x^2/(1 + sqrt(1+x^2)))\r
+ */\r
+\r
+double\r
+_Py_asinh(double x)\r
+{\r
+    double w;\r
+    double absx = fabs(x);\r
+\r
+    if (Py_IS_NAN(x) || Py_IS_INFINITY(x)) {\r
+        return x+x;\r
+    }\r
+    if (absx < two_pow_m28) {           /* |x| < 2**-28 */\r
+        return x;                       /* return x inexact except 0 */\r
+    }\r
+    if (absx > two_pow_p28) {           /* |x| > 2**28 */\r
+        w = log(absx)+ln2;\r
+    }\r
+    else if (absx > 2.0) {              /* 2 < |x| < 2**28 */\r
+        w = log(2.0*absx + 1.0 / (sqrt(x*x + 1.0) + absx));\r
+    }\r
+    else {                              /* 2**-28 <= |x| < 2= */\r
+        double t = x*x;\r
+        w = m_log1p(absx + t / (1.0 + sqrt(1.0 + t)));\r
+    }\r
+    return copysign(w, x);\r
+\r
+}\r
+\r
+/* atanh(x)\r
+ * Method :\r
+ *    1.Reduced x to positive by atanh(-x) = -atanh(x)\r
+ *    2.For x>=0.5\r
+ *                  1              2x                          x\r
+ *      atanh(x) = --- * log(1 + -------) = 0.5 * log1p(2 * -------)\r
+ *                  2             1 - x                      1 - x\r
+ *\r
+ *      For x<0.5\r
+ *      atanh(x) = 0.5*log1p(2x+2x*x/(1-x))\r
+ *\r
+ * Special cases:\r
+ *      atanh(x) is NaN if |x| >= 1 with signal;\r
+ *      atanh(NaN) is that NaN with no signal;\r
+ *\r
+ */\r
+\r
+double\r
+_Py_atanh(double x)\r
+{\r
+    double absx;\r
+    double t;\r
+\r
+    if (Py_IS_NAN(x)) {\r
+        return x+x;\r
+    }\r
+    absx = fabs(x);\r
+    if (absx >= 1.) {                   /* |x| >= 1 */\r
+        errno = EDOM;\r
+#ifdef Py_NAN\r
+        return Py_NAN;\r
+#else\r
+        return x/zero;\r
+#endif\r
+    }\r
+    if (absx < two_pow_m28) {           /* |x| < 2**-28 */\r
+        return x;\r
+    }\r
+    if (absx < 0.5) {                   /* |x| < 0.5 */\r
+        t = absx+absx;\r
+        t = 0.5 * m_log1p(t + t*absx / (1.0 - absx));\r
+    }\r
+    else {                              /* 0.5 <= |x| <= 1.0 */\r
+        t = 0.5 * m_log1p((absx + absx) / (1.0 - absx));\r
+    }\r
+    return copysign(t, x);\r
+}\r
+\r
+/* Mathematically, expm1(x) = exp(x) - 1.  The expm1 function is designed\r
+   to avoid the significant loss of precision that arises from direct\r
+   evaluation of the expression exp(x) - 1, for x near 0. */\r
+\r
+double\r
+_Py_expm1(double x)\r
+{\r
+    /* For abs(x) >= log(2), it's safe to evaluate exp(x) - 1 directly; this\r
+       also works fine for infinities and nans.\r
+\r
+       For smaller x, we can use a method due to Kahan that achieves close to\r
+       full accuracy.\r
+    */\r
+\r
+    if (fabs(x) < 0.7) {\r
+        double u;\r
+        u = exp(x);\r
+        if (u == 1.0)\r
+            return x;\r
+        else\r
+            return (u - 1.0) * x / log(u);\r
+    }\r
+    else\r
+        return exp(x) - 1.0;\r
+}\r
+\r
+/* log1p(x) = log(1+x).  The log1p function is designed to avoid the\r
+   significant loss of precision that arises from direct evaluation when x is\r
+   small. */\r
+\r
+#ifdef HAVE_LOG1P\r
+\r
+double\r
+_Py_log1p(double x)\r
+{\r
+    /* Some platforms supply a log1p function but don't respect the sign of\r
+       zero:  log1p(-0.0) gives 0.0 instead of the correct result of -0.0.\r
+\r
+       To save fiddling with configure tests and platform checks, we handle the\r
+       special case of zero input directly on all platforms.\r
+    */\r
+    if (x == 0.0) {\r
+        return x;\r
+    }\r
+    else {\r
+        return log1p(x);\r
+    }\r
+}\r
+\r
+#else\r
+\r
+double\r
+_Py_log1p(double x)\r
+{\r
+    /* For x small, we use the following approach.  Let y be the nearest float\r
+       to 1+x, then\r
+\r
+         1+x = y * (1 - (y-1-x)/y)\r
+\r
+       so log(1+x) = log(y) + log(1-(y-1-x)/y).  Since (y-1-x)/y is tiny, the\r
+       second term is well approximated by (y-1-x)/y.  If abs(x) >=\r
+       DBL_EPSILON/2 or the rounding-mode is some form of round-to-nearest\r
+       then y-1-x will be exactly representable, and is computed exactly by\r
+       (y-1)-x.\r
+\r
+       If abs(x) < DBL_EPSILON/2 and the rounding mode is not known to be\r
+       round-to-nearest then this method is slightly dangerous: 1+x could be\r
+       rounded up to 1+DBL_EPSILON instead of down to 1, and in that case\r
+       y-1-x will not be exactly representable any more and the result can be\r
+       off by many ulps.  But this is easily fixed: for a floating-point\r
+       number |x| < DBL_EPSILON/2., the closest floating-point number to\r
+       log(1+x) is exactly x.\r
+    */\r
+\r
+    double y;\r
+    if (fabs(x) < DBL_EPSILON/2.) {\r
+        return x;\r
+    }\r
+    else if (-0.5 <= x && x <= 1.) {\r
+        /* WARNING: it's possible than an overeager compiler\r
+           will incorrectly optimize the following two lines\r
+           to the equivalent of "return log(1.+x)". If this\r
+           happens, then results from log1p will be inaccurate\r
+           for small x. */\r
+        y = 1.+x;\r
+        return log(y)-((y-1.)-x)/y;\r
+    }\r
+    else {\r
+        /* NaNs and infinities should end up here */\r
+        return log(1.+x);\r
+    }\r
+}\r
+\r
+#endif /* ifdef HAVE_LOG1P */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_math.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/_math.h
new file mode 100644 (file)
index 0000000..87520bb
--- /dev/null
@@ -0,0 +1,41 @@
+double _Py_acosh(double x);\r
+double _Py_asinh(double x);\r
+double _Py_atanh(double x);\r
+double _Py_expm1(double x);\r
+double _Py_log1p(double x);\r
+\r
+#ifdef HAVE_ACOSH\r
+#define m_acosh acosh\r
+#else\r
+/* if the system doesn't have acosh, use the substitute\r
+   function defined in Modules/_math.c. */\r
+#define m_acosh _Py_acosh\r
+#endif\r
+\r
+#ifdef HAVE_ASINH\r
+#define m_asinh asinh\r
+#else\r
+/* if the system doesn't have asinh, use the substitute\r
+   function defined in Modules/_math.c. */\r
+#define m_asinh _Py_asinh\r
+#endif\r
+\r
+#ifdef HAVE_ATANH\r
+#define m_atanh atanh\r
+#else\r
+/* if the system doesn't have atanh, use the substitute\r
+   function defined in Modules/_math.c. */\r
+#define m_atanh _Py_atanh\r
+#endif\r
+\r
+#ifdef HAVE_EXPM1\r
+#define m_expm1 expm1\r
+#else\r
+/* if the system doesn't have expm1, use the substitute\r
+   function defined in Modules/_math.c. */\r
+#define m_expm1 _Py_expm1\r
+#endif\r
+\r
+/* Use the substitute from _math.c on all platforms:\r
+   it includes workarounds for buggy handling of zeros. */\r
+#define m_log1p _Py_log1p\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_randommodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_randommodule.c
new file mode 100644 (file)
index 0000000..1033965
--- /dev/null
@@ -0,0 +1,595 @@
+/* Random objects */\r
+\r
+/* ------------------------------------------------------------------\r
+   The code in this module was based on a download from:\r
+      http://www.math.keio.ac.jp/~matumoto/MT2002/emt19937ar.html\r
+\r
+   It was modified in 2002 by Raymond Hettinger as follows:\r
+\r
+    * the principal computational lines untouched.\r
+\r
+    * renamed genrand_res53() to random_random() and wrapped\r
+      in python calling/return code.\r
+\r
+    * genrand_int32() and the helper functions, init_genrand()\r
+      and init_by_array(), were declared static, wrapped in\r
+      Python calling/return code.  also, their global data\r
+      references were replaced with structure references.\r
+\r
+    * unused functions from the original were deleted.\r
+      new, original C python code was added to implement the\r
+      Random() interface.\r
+\r
+   The following are the verbatim comments from the original code:\r
+\r
+   A C-program for MT19937, with initialization improved 2002/1/26.\r
+   Coded by Takuji Nishimura and Makoto Matsumoto.\r
+\r
+   Before using, initialize the state by using init_genrand(seed)\r
+   or init_by_array(init_key, key_length).\r
+\r
+   Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura,\r
+   All rights reserved.\r
+\r
+   Redistribution and use in source and binary forms, with or without\r
+   modification, are permitted provided that the following conditions\r
+   are met:\r
+\r
+     1. Redistributions of source code must retain the above copyright\r
+    notice, this list of conditions and the following disclaimer.\r
+\r
+     2. Redistributions in binary form must reproduce the above copyright\r
+    notice, this list of conditions and the following disclaimer in the\r
+    documentation and/or other materials provided with the distribution.\r
+\r
+     3. The names of its contributors may not be used to endorse or promote\r
+    products derived from this software without specific prior written\r
+    permission.\r
+\r
+   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r
+   "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r
+   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\r
+   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR\r
+   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\r
+   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\r
+   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\r
+   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\r
+   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\r
+   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\r
+   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\r
+\r
+\r
+   Any feedback is very welcome.\r
+   http://www.math.keio.ac.jp/matumoto/emt.html\r
+   email: matumoto@math.keio.ac.jp\r
+*/\r
+\r
+/* ---------------------------------------------------------------*/\r
+\r
+#include "Python.h"\r
+#include <time.h>               /* for seeding to current time */\r
+\r
+/* Period parameters -- These are all magic.  Don't change. */\r
+#define N 624\r
+#define M 397\r
+#define MATRIX_A 0x9908b0dfUL   /* constant vector a */\r
+#define UPPER_MASK 0x80000000UL /* most significant w-r bits */\r
+#define LOWER_MASK 0x7fffffffUL /* least significant r bits */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    unsigned long state[N];\r
+    int index;\r
+} RandomObject;\r
+\r
+static PyTypeObject Random_Type;\r
+\r
+#define RandomObject_Check(v)      (Py_TYPE(v) == &Random_Type)\r
+\r
+\r
+/* Random methods */\r
+\r
+\r
+/* generates a random number on [0,0xffffffff]-interval */\r
+static unsigned long\r
+genrand_int32(RandomObject *self)\r
+{\r
+    unsigned long y;\r
+    static unsigned long mag01[2]={0x0UL, MATRIX_A};\r
+    /* mag01[x] = x * MATRIX_A  for x=0,1 */\r
+    unsigned long *mt;\r
+\r
+    mt = self->state;\r
+    if (self->index >= N) { /* generate N words at one time */\r
+        int kk;\r
+\r
+        for (kk=0;kk<N-M;kk++) {\r
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);\r
+            mt[kk] = mt[kk+M] ^ (y >> 1) ^ mag01[y & 0x1UL];\r
+        }\r
+        for (;kk<N-1;kk++) {\r
+            y = (mt[kk]&UPPER_MASK)|(mt[kk+1]&LOWER_MASK);\r
+            mt[kk] = mt[kk+(M-N)] ^ (y >> 1) ^ mag01[y & 0x1UL];\r
+        }\r
+        y = (mt[N-1]&UPPER_MASK)|(mt[0]&LOWER_MASK);\r
+        mt[N-1] = mt[M-1] ^ (y >> 1) ^ mag01[y & 0x1UL];\r
+\r
+        self->index = 0;\r
+    }\r
+\r
+    y = mt[self->index++];\r
+    y ^= (y >> 11);\r
+    y ^= (y << 7) & 0x9d2c5680UL;\r
+    y ^= (y << 15) & 0xefc60000UL;\r
+    y ^= (y >> 18);\r
+    return y;\r
+}\r
+\r
+/* random_random is the function named genrand_res53 in the original code;\r
+ * generates a random number on [0,1) with 53-bit resolution; note that\r
+ * 9007199254740992 == 2**53; I assume they're spelling "/2**53" as\r
+ * multiply-by-reciprocal in the (likely vain) hope that the compiler will\r
+ * optimize the division away at compile-time.  67108864 is 2**26.  In\r
+ * effect, a contains 27 random bits shifted left 26, and b fills in the\r
+ * lower 26 bits of the 53-bit numerator.\r
+ * The orginal code credited Isaku Wada for this algorithm, 2002/01/09.\r
+ */\r
+static PyObject *\r
+random_random(RandomObject *self)\r
+{\r
+    unsigned long a=genrand_int32(self)>>5, b=genrand_int32(self)>>6;\r
+    return PyFloat_FromDouble((a*67108864.0+b)*(1.0/9007199254740992.0));\r
+}\r
+\r
+/* initializes mt[N] with a seed */\r
+static void\r
+init_genrand(RandomObject *self, unsigned long s)\r
+{\r
+    int mti;\r
+    unsigned long *mt;\r
+\r
+    mt = self->state;\r
+    mt[0]= s & 0xffffffffUL;\r
+    for (mti=1; mti<N; mti++) {\r
+        mt[mti] =\r
+        (1812433253UL * (mt[mti-1] ^ (mt[mti-1] >> 30)) + mti);\r
+        /* See Knuth TAOCP Vol2. 3rd Ed. P.106 for multiplier. */\r
+        /* In the previous versions, MSBs of the seed affect   */\r
+        /* only MSBs of the array mt[].                                */\r
+        /* 2002/01/09 modified by Makoto Matsumoto                     */\r
+        mt[mti] &= 0xffffffffUL;\r
+        /* for >32 bit machines */\r
+    }\r
+    self->index = mti;\r
+    return;\r
+}\r
+\r
+/* initialize by an array with array-length */\r
+/* init_key is the array for initializing keys */\r
+/* key_length is its length */\r
+static PyObject *\r
+init_by_array(RandomObject *self, unsigned long init_key[], unsigned long key_length)\r
+{\r
+    unsigned int i, j, k;       /* was signed in the original code. RDH 12/16/2002 */\r
+    unsigned long *mt;\r
+\r
+    mt = self->state;\r
+    init_genrand(self, 19650218UL);\r
+    i=1; j=0;\r
+    k = (N>key_length ? N : key_length);\r
+    for (; k; k--) {\r
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1664525UL))\r
+                 + init_key[j] + j; /* non linear */\r
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */\r
+        i++; j++;\r
+        if (i>=N) { mt[0] = mt[N-1]; i=1; }\r
+        if (j>=key_length) j=0;\r
+    }\r
+    for (k=N-1; k; k--) {\r
+        mt[i] = (mt[i] ^ ((mt[i-1] ^ (mt[i-1] >> 30)) * 1566083941UL))\r
+                 - i; /* non linear */\r
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */\r
+        i++;\r
+        if (i>=N) { mt[0] = mt[N-1]; i=1; }\r
+    }\r
+\r
+    mt[0] = 0x80000000UL; /* MSB is 1; assuring non-zero initial array */\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+/*\r
+ * The rest is Python-specific code, neither part of, nor derived from, the\r
+ * Twister download.\r
+ */\r
+\r
+static PyObject *\r
+random_seed(RandomObject *self, PyObject *args)\r
+{\r
+    PyObject *result = NULL;            /* guilty until proved innocent */\r
+    PyObject *masklower = NULL;\r
+    PyObject *thirtytwo = NULL;\r
+    PyObject *n = NULL;\r
+    unsigned long *key = NULL;\r
+    unsigned long keymax;               /* # of allocated slots in key */\r
+    unsigned long keyused;              /* # of used slots in key */\r
+    int err;\r
+\r
+    PyObject *arg = NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "seed", 0, 1, &arg))\r
+        return NULL;\r
+\r
+    if (arg == NULL || arg == Py_None) {\r
+        time_t now;\r
+\r
+        time(&now);\r
+        init_genrand(self, (unsigned long)now);\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    /* If the arg is an int or long, use its absolute value; else use\r
+     * the absolute value of its hash code.\r
+     */\r
+    if (PyInt_Check(arg) || PyLong_Check(arg))\r
+        n = PyNumber_Absolute(arg);\r
+    else {\r
+        long hash = PyObject_Hash(arg);\r
+        if (hash == -1)\r
+            goto Done;\r
+        n = PyLong_FromUnsignedLong((unsigned long)hash);\r
+    }\r
+    if (n == NULL)\r
+        goto Done;\r
+\r
+    /* Now split n into 32-bit chunks, from the right.  Each piece is\r
+     * stored into key, which has a capacity of keymax chunks, of which\r
+     * keyused are filled.  Alas, the repeated shifting makes this a\r
+     * quadratic-time algorithm; we'd really like to use\r
+     * _PyLong_AsByteArray here, but then we'd have to break into the\r
+     * long representation to figure out how big an array was needed\r
+     * in advance.\r
+     */\r
+    keymax = 8;         /* arbitrary; grows later if needed */\r
+    keyused = 0;\r
+    key = (unsigned long *)PyMem_Malloc(keymax * sizeof(*key));\r
+    if (key == NULL)\r
+        goto Done;\r
+\r
+    masklower = PyLong_FromUnsignedLong(0xffffffffU);\r
+    if (masklower == NULL)\r
+        goto Done;\r
+    thirtytwo = PyInt_FromLong(32L);\r
+    if (thirtytwo == NULL)\r
+        goto Done;\r
+    while ((err=PyObject_IsTrue(n))) {\r
+        PyObject *newn;\r
+        PyObject *pychunk;\r
+        unsigned long chunk;\r
+\r
+        if (err == -1)\r
+            goto Done;\r
+        pychunk = PyNumber_And(n, masklower);\r
+        if (pychunk == NULL)\r
+            goto Done;\r
+        chunk = PyLong_AsUnsignedLong(pychunk);\r
+        Py_DECREF(pychunk);\r
+        if (chunk == (unsigned long)-1 && PyErr_Occurred())\r
+            goto Done;\r
+        newn = PyNumber_Rshift(n, thirtytwo);\r
+        if (newn == NULL)\r
+            goto Done;\r
+        Py_DECREF(n);\r
+        n = newn;\r
+        if (keyused >= keymax) {\r
+            unsigned long bigger = keymax << 1;\r
+            if ((bigger >> 1) != keymax) {\r
+                PyErr_NoMemory();\r
+                goto Done;\r
+            }\r
+            key = (unsigned long *)PyMem_Realloc(key,\r
+                                    bigger * sizeof(*key));\r
+            if (key == NULL)\r
+                goto Done;\r
+            keymax = bigger;\r
+        }\r
+        assert(keyused < keymax);\r
+        key[keyused++] = chunk;\r
+    }\r
+\r
+    if (keyused == 0)\r
+        key[keyused++] = 0UL;\r
+    result = init_by_array(self, key, keyused);\r
+Done:\r
+    Py_XDECREF(masklower);\r
+    Py_XDECREF(thirtytwo);\r
+    Py_XDECREF(n);\r
+    PyMem_Free(key);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+random_getstate(RandomObject *self)\r
+{\r
+    PyObject *state;\r
+    PyObject *element;\r
+    int i;\r
+\r
+    state = PyTuple_New(N+1);\r
+    if (state == NULL)\r
+        return NULL;\r
+    for (i=0; i<N ; i++) {\r
+        element = PyLong_FromUnsignedLong(self->state[i]);\r
+        if (element == NULL)\r
+            goto Fail;\r
+        PyTuple_SET_ITEM(state, i, element);\r
+    }\r
+    element = PyLong_FromLong((long)(self->index));\r
+    if (element == NULL)\r
+        goto Fail;\r
+    PyTuple_SET_ITEM(state, i, element);\r
+    return state;\r
+\r
+Fail:\r
+    Py_DECREF(state);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+random_setstate(RandomObject *self, PyObject *state)\r
+{\r
+    int i;\r
+    unsigned long element;\r
+    long index;\r
+\r
+    if (!PyTuple_Check(state)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+            "state vector must be a tuple");\r
+        return NULL;\r
+    }\r
+    if (PyTuple_Size(state) != N+1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+            "state vector is the wrong size");\r
+        return NULL;\r
+    }\r
+\r
+    for (i=0; i<N ; i++) {\r
+        element = PyLong_AsUnsignedLong(PyTuple_GET_ITEM(state, i));\r
+        if (element == (unsigned long)-1 && PyErr_Occurred())\r
+            return NULL;\r
+        self->state[i] = element & 0xffffffffUL; /* Make sure we get sane state */\r
+    }\r
+\r
+    index = PyLong_AsLong(PyTuple_GET_ITEM(state, i));\r
+    if (index == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    self->index = (int)index;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+/*\r
+Jumpahead should be a fast way advance the generator n-steps ahead, but\r
+lacking a formula for that, the next best is to use n and the existing\r
+state to create a new state far away from the original.\r
+\r
+The generator uses constant spaced additive feedback, so shuffling the\r
+state elements ought to produce a state which would not be encountered\r
+(in the near term) by calls to random().  Shuffling is normally\r
+implemented by swapping the ith element with another element ranging\r
+from 0 to i inclusive.  That allows the element to have the possibility\r
+of not being moved.  Since the goal is to produce a new, different\r
+state, the swap element is ranged from 0 to i-1 inclusive.  This assures\r
+that each element gets moved at least once.\r
+\r
+To make sure that consecutive calls to jumpahead(n) produce different\r
+states (even in the rare case of involutory shuffles), i+1 is added to\r
+each element at position i.  Successive calls are then guaranteed to\r
+have changing (growing) values as well as shuffled positions.\r
+\r
+Finally, the self->index value is set to N so that the generator itself\r
+kicks in on the next call to random().  This assures that all results\r
+have been through the generator and do not just reflect alterations to\r
+the underlying state.\r
+*/\r
+\r
+static PyObject *\r
+random_jumpahead(RandomObject *self, PyObject *n)\r
+{\r
+    long i, j;\r
+    PyObject *iobj;\r
+    PyObject *remobj;\r
+    unsigned long *mt, tmp, nonzero;\r
+\r
+    if (!PyInt_Check(n) && !PyLong_Check(n)) {\r
+        PyErr_Format(PyExc_TypeError, "jumpahead requires an "\r
+                     "integer, not '%s'",\r
+                     Py_TYPE(n)->tp_name);\r
+        return NULL;\r
+    }\r
+\r
+    mt = self->state;\r
+    for (i = N-1; i > 1; i--) {\r
+        iobj = PyInt_FromLong(i);\r
+        if (iobj == NULL)\r
+            return NULL;\r
+        remobj = PyNumber_Remainder(n, iobj);\r
+        Py_DECREF(iobj);\r
+        if (remobj == NULL)\r
+            return NULL;\r
+        j = PyInt_AsLong(remobj);\r
+        Py_DECREF(remobj);\r
+        if (j == -1L && PyErr_Occurred())\r
+            return NULL;\r
+        tmp = mt[i];\r
+        mt[i] = mt[j];\r
+        mt[j] = tmp;\r
+    }\r
+\r
+    nonzero = 0;\r
+    for (i = 1; i < N; i++) {\r
+        mt[i] += i+1;\r
+        mt[i] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */\r
+        nonzero |= mt[i];\r
+    }\r
+\r
+    /* Ensure the state is nonzero: in the unlikely event that mt[1] through\r
+       mt[N-1] are all zero, set the MSB of mt[0] (see issue #14591). In the\r
+       normal case, we fall back to the pre-issue 14591 behaviour for mt[0]. */\r
+    if (nonzero) {\r
+        mt[0] += 1;\r
+        mt[0] &= 0xffffffffUL; /* for WORDSIZE > 32 machines */\r
+    }\r
+    else {\r
+        mt[0] = 0x80000000UL;\r
+    }\r
+\r
+    self->index = N;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+random_getrandbits(RandomObject *self, PyObject *args)\r
+{\r
+    int k, i, bytes;\r
+    unsigned long r;\r
+    unsigned char *bytearray;\r
+    PyObject *result;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:getrandbits", &k))\r
+        return NULL;\r
+\r
+    if (k <= 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "number of bits must be greater than zero");\r
+        return NULL;\r
+    }\r
+\r
+    bytes = ((k - 1) / 32 + 1) * 4;\r
+    bytearray = (unsigned char *)PyMem_Malloc(bytes);\r
+    if (bytearray == NULL) {\r
+        PyErr_NoMemory();\r
+        return NULL;\r
+    }\r
+\r
+    /* Fill-out whole words, byte-by-byte to avoid endianness issues */\r
+    for (i=0 ; i<bytes ; i+=4, k-=32) {\r
+        r = genrand_int32(self);\r
+        if (k < 32)\r
+            r >>= (32 - k);\r
+        bytearray[i+0] = (unsigned char)r;\r
+        bytearray[i+1] = (unsigned char)(r >> 8);\r
+        bytearray[i+2] = (unsigned char)(r >> 16);\r
+        bytearray[i+3] = (unsigned char)(r >> 24);\r
+    }\r
+\r
+    /* little endian order to match bytearray assignment order */\r
+    result = _PyLong_FromByteArray(bytearray, bytes, 1, 0);\r
+    PyMem_Free(bytearray);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+random_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    RandomObject *self;\r
+    PyObject *tmp;\r
+\r
+    if (type == &Random_Type && !_PyArg_NoKeywords("Random()", kwds))\r
+        return NULL;\r
+\r
+    self = (RandomObject *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+    tmp = random_seed(self, args);\r
+    if (tmp == NULL) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    Py_DECREF(tmp);\r
+    return (PyObject *)self;\r
+}\r
+\r
+static PyMethodDef random_methods[] = {\r
+    {"random",          (PyCFunction)random_random,  METH_NOARGS,\r
+        PyDoc_STR("random() -> x in the interval [0, 1).")},\r
+    {"seed",            (PyCFunction)random_seed,  METH_VARARGS,\r
+        PyDoc_STR("seed([n]) -> None.  Defaults to current time.")},\r
+    {"getstate",        (PyCFunction)random_getstate,  METH_NOARGS,\r
+        PyDoc_STR("getstate() -> tuple containing the current state.")},\r
+    {"setstate",          (PyCFunction)random_setstate,  METH_O,\r
+        PyDoc_STR("setstate(state) -> None.  Restores generator state.")},\r
+    {"jumpahead",       (PyCFunction)random_jumpahead,  METH_O,\r
+        PyDoc_STR("jumpahead(int) -> None.  Create new state from "\r
+                  "existing state and integer.")},\r
+    {"getrandbits",     (PyCFunction)random_getrandbits,  METH_VARARGS,\r
+        PyDoc_STR("getrandbits(k) -> x.  Generates a long int with "\r
+                  "k random bits.")},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(random_doc,\r
+"Random() -> create a random number generator with its own internal state.");\r
+\r
+static PyTypeObject Random_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_random.Random",                   /*tp_name*/\r
+    sizeof(RandomObject),               /*tp_basicsize*/\r
+    0,                                  /*tp_itemsize*/\r
+    /* methods */\r
+    0,                                  /*tp_dealloc*/\r
+    0,                                  /*tp_print*/\r
+    0,                                  /*tp_getattr*/\r
+    0,                                  /*tp_setattr*/\r
+    0,                                  /*tp_compare*/\r
+    0,                                  /*tp_repr*/\r
+    0,                                  /*tp_as_number*/\r
+    0,                                  /*tp_as_sequence*/\r
+    0,                                  /*tp_as_mapping*/\r
+    0,                                  /*tp_hash*/\r
+    0,                                  /*tp_call*/\r
+    0,                                  /*tp_str*/\r
+    PyObject_GenericGetAttr,            /*tp_getattro*/\r
+    0,                                  /*tp_setattro*/\r
+    0,                                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE,           /*tp_flags*/\r
+    random_doc,                         /*tp_doc*/\r
+    0,                                  /*tp_traverse*/\r
+    0,                                  /*tp_clear*/\r
+    0,                                  /*tp_richcompare*/\r
+    0,                                  /*tp_weaklistoffset*/\r
+    0,                                  /*tp_iter*/\r
+    0,                                  /*tp_iternext*/\r
+    random_methods,                     /*tp_methods*/\r
+    0,                                  /*tp_members*/\r
+    0,                                  /*tp_getset*/\r
+    0,                                  /*tp_base*/\r
+    0,                                  /*tp_dict*/\r
+    0,                                  /*tp_descr_get*/\r
+    0,                                  /*tp_descr_set*/\r
+    0,                                  /*tp_dictoffset*/\r
+    0,                                  /*tp_init*/\r
+    0,                                  /*tp_alloc*/\r
+    random_new,                         /*tp_new*/\r
+    _PyObject_Del,                      /*tp_free*/\r
+    0,                                  /*tp_is_gc*/\r
+};\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Module implements the Mersenne Twister random number generator.");\r
+\r
+PyMODINIT_FUNC\r
+init_random(void)\r
+{\r
+    PyObject *m;\r
+\r
+    if (PyType_Ready(&Random_Type) < 0)\r
+        return;\r
+    m = Py_InitModule3("_random", NULL, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+    Py_INCREF(&Random_Type);\r
+    PyModule_AddObject(m, "Random", (PyObject *)&Random_Type);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_struct.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_struct.c
new file mode 100644 (file)
index 0000000..353f029
--- /dev/null
@@ -0,0 +1,2097 @@
+/* struct module -- pack values into and (out of) strings */\r
+\r
+/* New version supporting byte order, alignment and size options,\r
+   character strings, and unsigned numbers */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+\r
+#include "Python.h"\r
+#include "structseq.h"\r
+#include "structmember.h"\r
+#include <ctype.h>\r
+\r
+static PyTypeObject PyStructType;\r
+\r
+/* compatibility macros */\r
+#if (PY_VERSION_HEX < 0x02050000)\r
+typedef int Py_ssize_t;\r
+#endif\r
+\r
+/* warning messages */\r
+#define FLOAT_COERCE_WARN "integer argument expected, got float"\r
+#define NON_INTEGER_WARN "integer argument expected, got non-integer " \\r
+    "(implicit conversion using __int__ is deprecated)"\r
+\r
+\r
+/* The translation function for each format character is table driven */\r
+typedef struct _formatdef {\r
+    char format;\r
+    Py_ssize_t size;\r
+    Py_ssize_t alignment;\r
+    PyObject* (*unpack)(const char *,\r
+                        const struct _formatdef *);\r
+    int (*pack)(char *, PyObject *,\r
+                const struct _formatdef *);\r
+} formatdef;\r
+\r
+typedef struct _formatcode {\r
+    const struct _formatdef *fmtdef;\r
+    Py_ssize_t offset;\r
+    Py_ssize_t size;\r
+} formatcode;\r
+\r
+/* Struct object interface */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t s_size;\r
+    Py_ssize_t s_len;\r
+    formatcode *s_codes;\r
+    PyObject *s_format;\r
+    PyObject *weakreflist; /* List of weak references */\r
+} PyStructObject;\r
+\r
+\r
+#define PyStruct_Check(op) PyObject_TypeCheck(op, &PyStructType)\r
+#define PyStruct_CheckExact(op) (Py_TYPE(op) == &PyStructType)\r
+\r
+\r
+/* Exception */\r
+\r
+static PyObject *StructError;\r
+\r
+\r
+/* Define various structs to figure out the alignments of types */\r
+\r
+\r
+typedef struct { char c; short x; } st_short;\r
+typedef struct { char c; int x; } st_int;\r
+typedef struct { char c; long x; } st_long;\r
+typedef struct { char c; float x; } st_float;\r
+typedef struct { char c; double x; } st_double;\r
+typedef struct { char c; void *x; } st_void_p;\r
+\r
+#define SHORT_ALIGN (sizeof(st_short) - sizeof(short))\r
+#define INT_ALIGN (sizeof(st_int) - sizeof(int))\r
+#define LONG_ALIGN (sizeof(st_long) - sizeof(long))\r
+#define FLOAT_ALIGN (sizeof(st_float) - sizeof(float))\r
+#define DOUBLE_ALIGN (sizeof(st_double) - sizeof(double))\r
+#define VOID_P_ALIGN (sizeof(st_void_p) - sizeof(void *))\r
+\r
+/* We can't support q and Q in native mode unless the compiler does;\r
+   in std mode, they're 8 bytes on all platforms. */\r
+#ifdef HAVE_LONG_LONG\r
+typedef struct { char c; PY_LONG_LONG x; } s_long_long;\r
+#define LONG_LONG_ALIGN (sizeof(s_long_long) - sizeof(PY_LONG_LONG))\r
+#endif\r
+\r
+#ifdef HAVE_C99_BOOL\r
+#define BOOL_TYPE _Bool\r
+typedef struct { char c; _Bool x; } s_bool;\r
+#define BOOL_ALIGN (sizeof(s_bool) - sizeof(BOOL_TYPE))\r
+#else\r
+#define BOOL_TYPE char\r
+#define BOOL_ALIGN 0\r
+#endif\r
+\r
+#define STRINGIFY(x)    #x\r
+\r
+#ifdef __powerc\r
+#pragma options align=reset\r
+#endif\r
+\r
+static char *integer_codes = "bBhHiIlLqQ";\r
+\r
+/* Helper to get a PyLongObject by hook or by crook.  Caller should decref. */\r
+\r
+static PyObject *\r
+get_pylong(PyObject *v)\r
+{\r
+    PyObject *r, *w;\r
+    int converted = 0;\r
+    assert(v != NULL);\r
+    if (!PyInt_Check(v) && !PyLong_Check(v)) {\r
+        PyNumberMethods *m;\r
+        /* Not an integer; first try to use __index__ to\r
+           convert to an integer.  If the __index__ method\r
+           doesn't exist, or raises a TypeError, try __int__.\r
+           Use of the latter is deprecated, and will fail in\r
+           Python 3.x. */\r
+\r
+        m = Py_TYPE(v)->tp_as_number;\r
+        if (PyIndex_Check(v)) {\r
+            w = PyNumber_Index(v);\r
+            if (w != NULL) {\r
+                v = w;\r
+                /* successfully converted to an integer */\r
+                converted = 1;\r
+            }\r
+            else if (PyErr_ExceptionMatches(PyExc_TypeError)) {\r
+                PyErr_Clear();\r
+            }\r
+            else\r
+                return NULL;\r
+        }\r
+        if (!converted && m != NULL && m->nb_int != NULL) {\r
+            /* Special case warning message for floats, for\r
+               backwards compatibility. */\r
+            if (PyFloat_Check(v)) {\r
+                if (PyErr_WarnEx(\r
+                            PyExc_DeprecationWarning,\r
+                            FLOAT_COERCE_WARN, 1))\r
+                    return NULL;\r
+            }\r
+            else {\r
+                if (PyErr_WarnEx(\r
+                            PyExc_DeprecationWarning,\r
+                            NON_INTEGER_WARN, 1))\r
+                    return NULL;\r
+            }\r
+            v = m->nb_int(v);\r
+            if (v == NULL)\r
+                return NULL;\r
+            if (!PyInt_Check(v) && !PyLong_Check(v)) {\r
+                PyErr_SetString(PyExc_TypeError,\r
+                                "__int__ method returned "\r
+                                "non-integer");\r
+                return NULL;\r
+            }\r
+            converted = 1;\r
+        }\r
+        if (!converted) {\r
+            PyErr_SetString(StructError,\r
+                            "cannot convert argument "\r
+                            "to integer");\r
+            return NULL;\r
+        }\r
+    }\r
+    else\r
+        /* Ensure we own a reference to v. */\r
+        Py_INCREF(v);\r
+\r
+    assert(PyInt_Check(v) || PyLong_Check(v));\r
+    if (PyInt_Check(v)) {\r
+        r = PyLong_FromLong(PyInt_AS_LONG(v));\r
+        Py_DECREF(v);\r
+    }\r
+    else if (PyLong_Check(v)) {\r
+        assert(PyLong_Check(v));\r
+        r = v;\r
+    }\r
+    else {\r
+        r = NULL;   /* silence compiler warning about\r
+                       possibly uninitialized variable */\r
+        assert(0);  /* shouldn't ever get here */\r
+    }\r
+\r
+    return r;\r
+}\r
+\r
+/* Helper to convert a Python object to a C long.  Sets an exception\r
+   (struct.error for an inconvertible type, OverflowError for\r
+   out-of-range values) and returns -1 on error. */\r
+\r
+static int\r
+get_long(PyObject *v, long *p)\r
+{\r
+    long x;\r
+\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    assert(PyLong_Check(v));\r
+    x = PyLong_AsLong(v);\r
+    Py_DECREF(v);\r
+    if (x == (long)-1 && PyErr_Occurred())\r
+        return -1;\r
+    *p = x;\r
+    return 0;\r
+}\r
+\r
+/* Same, but handling unsigned long */\r
+\r
+static int\r
+get_ulong(PyObject *v, unsigned long *p)\r
+{\r
+    unsigned long x;\r
+\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    assert(PyLong_Check(v));\r
+    x = PyLong_AsUnsignedLong(v);\r
+    Py_DECREF(v);\r
+    if (x == (unsigned long)-1 && PyErr_Occurred())\r
+        return -1;\r
+    *p = x;\r
+    return 0;\r
+}\r
+\r
+#ifdef HAVE_LONG_LONG\r
+\r
+/* Same, but handling native long long. */\r
+\r
+static int\r
+get_longlong(PyObject *v, PY_LONG_LONG *p)\r
+{\r
+    PY_LONG_LONG x;\r
+\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    assert(PyLong_Check(v));\r
+    x = PyLong_AsLongLong(v);\r
+    Py_DECREF(v);\r
+    if (x == (PY_LONG_LONG)-1 && PyErr_Occurred())\r
+        return -1;\r
+    *p = x;\r
+    return 0;\r
+}\r
+\r
+/* Same, but handling native unsigned long long. */\r
+\r
+static int\r
+get_ulonglong(PyObject *v, unsigned PY_LONG_LONG *p)\r
+{\r
+    unsigned PY_LONG_LONG x;\r
+\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    assert(PyLong_Check(v));\r
+    x = PyLong_AsUnsignedLongLong(v);\r
+    Py_DECREF(v);\r
+    if (x == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())\r
+        return -1;\r
+    *p = x;\r
+    return 0;\r
+}\r
+\r
+#endif\r
+\r
+/* Floating point helpers */\r
+\r
+static PyObject *\r
+unpack_float(const char *p,  /* start of 4-byte string */\r
+         int le)             /* true for little-endian, false for big-endian */\r
+{\r
+    double x;\r
+\r
+    x = _PyFloat_Unpack4((unsigned char *)p, le);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyFloat_FromDouble(x);\r
+}\r
+\r
+static PyObject *\r
+unpack_double(const char *p,  /* start of 8-byte string */\r
+          int le)         /* true for little-endian, false for big-endian */\r
+{\r
+    double x;\r
+\r
+    x = _PyFloat_Unpack8((unsigned char *)p, le);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyFloat_FromDouble(x);\r
+}\r
+\r
+/* Helper to format the range error exceptions */\r
+static int\r
+_range_error(const formatdef *f, int is_unsigned)\r
+{\r
+    /* ulargest is the largest unsigned value with f->size bytes.\r
+     * Note that the simpler:\r
+     *     ((size_t)1 << (f->size * 8)) - 1\r
+     * doesn't work when f->size == sizeof(size_t) because C doesn't\r
+     * define what happens when a left shift count is >= the number of\r
+     * bits in the integer being shifted; e.g., on some boxes it doesn't\r
+     * shift at all when they're equal.\r
+     */\r
+    const size_t ulargest = (size_t)-1 >> ((SIZEOF_SIZE_T - f->size)*8);\r
+    assert(f->size >= 1 && f->size <= SIZEOF_SIZE_T);\r
+    if (is_unsigned)\r
+        PyErr_Format(StructError,\r
+            "'%c' format requires 0 <= number <= %zu",\r
+            f->format,\r
+            ulargest);\r
+    else {\r
+        const Py_ssize_t largest = (Py_ssize_t)(ulargest >> 1);\r
+        PyErr_Format(StructError,\r
+            "'%c' format requires %zd <= number <= %zd",\r
+            f->format,\r
+            ~ largest,\r
+            largest);\r
+    }\r
+    return -1;\r
+}\r
+\r
+\r
+\r
+/* A large number of small routines follow, with names of the form\r
+\r
+   [bln][up]_TYPE\r
+\r
+   [bln] distiguishes among big-endian, little-endian and native.\r
+   [pu] distiguishes between pack (to struct) and unpack (from struct).\r
+   TYPE is one of char, byte, ubyte, etc.\r
+*/\r
+\r
+/* Native mode routines. ****************************************************/\r
+/* NOTE:\r
+   In all n[up]_<type> routines handling types larger than 1 byte, there is\r
+   *no* guarantee that the p pointer is properly aligned for each type,\r
+   therefore memcpy is called.  An intermediate variable is used to\r
+   compensate for big-endian architectures.\r
+   Normally both the intermediate variable and the memcpy call will be\r
+   skipped by C optimisation in little-endian architectures (gcc >= 2.91\r
+   does this). */\r
+\r
+static PyObject *\r
+nu_char(const char *p, const formatdef *f)\r
+{\r
+    return PyString_FromStringAndSize(p, 1);\r
+}\r
+\r
+static PyObject *\r
+nu_byte(const char *p, const formatdef *f)\r
+{\r
+    return PyInt_FromLong((long) *(signed char *)p);\r
+}\r
+\r
+static PyObject *\r
+nu_ubyte(const char *p, const formatdef *f)\r
+{\r
+    return PyInt_FromLong((long) *(unsigned char *)p);\r
+}\r
+\r
+static PyObject *\r
+nu_short(const char *p, const formatdef *f)\r
+{\r
+    short x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyInt_FromLong((long)x);\r
+}\r
+\r
+static PyObject *\r
+nu_ushort(const char *p, const formatdef *f)\r
+{\r
+    unsigned short x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyInt_FromLong((long)x);\r
+}\r
+\r
+static PyObject *\r
+nu_int(const char *p, const formatdef *f)\r
+{\r
+    int x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyInt_FromLong((long)x);\r
+}\r
+\r
+static PyObject *\r
+nu_uint(const char *p, const formatdef *f)\r
+{\r
+    unsigned int x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+#if (SIZEOF_LONG > SIZEOF_INT)\r
+    return PyInt_FromLong((long)x);\r
+#else\r
+    if (x <= ((unsigned int)LONG_MAX))\r
+        return PyInt_FromLong((long)x);\r
+    return PyLong_FromUnsignedLong((unsigned long)x);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+nu_long(const char *p, const formatdef *f)\r
+{\r
+    long x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+static PyObject *\r
+nu_ulong(const char *p, const formatdef *f)\r
+{\r
+    unsigned long x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong((long)x);\r
+    return PyLong_FromUnsignedLong(x);\r
+}\r
+\r
+/* Native mode doesn't support q or Q unless the platform C supports\r
+   long long (or, on Windows, __int64). */\r
+\r
+#ifdef HAVE_LONG_LONG\r
+\r
+static PyObject *\r
+nu_longlong(const char *p, const formatdef *f)\r
+{\r
+    PY_LONG_LONG x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    if (x >= LONG_MIN && x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));\r
+    return PyLong_FromLongLong(x);\r
+}\r
+\r
+static PyObject *\r
+nu_ulonglong(const char *p, const formatdef *f)\r
+{\r
+    unsigned PY_LONG_LONG x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));\r
+    return PyLong_FromUnsignedLongLong(x);\r
+}\r
+\r
+#endif\r
+\r
+static PyObject *\r
+nu_bool(const char *p, const formatdef *f)\r
+{\r
+    BOOL_TYPE x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyBool_FromLong(x != 0);\r
+}\r
+\r
+\r
+static PyObject *\r
+nu_float(const char *p, const formatdef *f)\r
+{\r
+    float x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyFloat_FromDouble((double)x);\r
+}\r
+\r
+static PyObject *\r
+nu_double(const char *p, const formatdef *f)\r
+{\r
+    double x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyFloat_FromDouble(x);\r
+}\r
+\r
+static PyObject *\r
+nu_void_p(const char *p, const formatdef *f)\r
+{\r
+    void *x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyLong_FromVoidPtr(x);\r
+}\r
+\r
+static int\r
+np_byte(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    if (x < -128 || x > 127){\r
+        PyErr_SetString(StructError,\r
+                        "byte format requires -128 <= number <= 127");\r
+        return -1;\r
+    }\r
+    *p = (char)x;\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_ubyte(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    if (x < 0 || x > 255){\r
+        PyErr_SetString(StructError,\r
+                        "ubyte format requires 0 <= number <= 255");\r
+        return -1;\r
+    }\r
+    *p = (char)x;\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_char(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    if (!PyString_Check(v) || PyString_Size(v) != 1) {\r
+        PyErr_SetString(StructError,\r
+                        "char format require string of length 1");\r
+        return -1;\r
+    }\r
+    *p = *PyString_AsString(v);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_short(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    short y;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    if (x < SHRT_MIN || x > SHRT_MAX){\r
+        PyErr_SetString(StructError,\r
+                        "short format requires " STRINGIFY(SHRT_MIN)\r
+                        " <= number <= " STRINGIFY(SHRT_MAX));\r
+        return -1;\r
+    }\r
+    y = (short)x;\r
+    memcpy(p, (char *)&y, sizeof y);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_ushort(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    unsigned short y;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    if (x < 0 || x > USHRT_MAX){\r
+        PyErr_SetString(StructError,\r
+                        "ushort format requires 0 <= number <= " STRINGIFY(USHRT_MAX));\r
+        return -1;\r
+    }\r
+    y = (unsigned short)x;\r
+    memcpy(p, (char *)&y, sizeof y);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_int(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    int y;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+#if (SIZEOF_LONG > SIZEOF_INT)\r
+    if ((x < ((long)INT_MIN)) || (x > ((long)INT_MAX)))\r
+        return _range_error(f, 0);\r
+#endif\r
+    y = (int)x;\r
+    memcpy(p, (char *)&y, sizeof y);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_uint(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    unsigned long x;\r
+    unsigned int y;\r
+    if (get_ulong(v, &x) < 0)\r
+        return -1;\r
+    y = (unsigned int)x;\r
+#if (SIZEOF_LONG > SIZEOF_INT)\r
+    if (x > ((unsigned long)UINT_MAX))\r
+        return _range_error(f, 1);\r
+#endif\r
+    memcpy(p, (char *)&y, sizeof y);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_long(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_ulong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    unsigned long x;\r
+    if (get_ulong(v, &x) < 0)\r
+        return -1;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+#ifdef HAVE_LONG_LONG\r
+\r
+static int\r
+np_longlong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    PY_LONG_LONG x;\r
+    if (get_longlong(v, &x) < 0)\r
+        return -1;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_ulonglong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    unsigned PY_LONG_LONG x;\r
+    if (get_ulonglong(v, &x) < 0)\r
+        return -1;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+#endif\r
+\r
+\r
+static int\r
+np_bool(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int y;\r
+    BOOL_TYPE x;\r
+    y = PyObject_IsTrue(v);\r
+    if (y < 0)\r
+        return -1;\r
+    x = y;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_float(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    float x = (float)PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_double(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    double x = PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    memcpy(p, (char *)&x, sizeof(double));\r
+    return 0;\r
+}\r
+\r
+static int\r
+np_void_p(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    void *x;\r
+\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    assert(PyLong_Check(v));\r
+    x = PyLong_AsVoidPtr(v);\r
+    Py_DECREF(v);\r
+    if (x == NULL && PyErr_Occurred())\r
+        return -1;\r
+    memcpy(p, (char *)&x, sizeof x);\r
+    return 0;\r
+}\r
+\r
+static formatdef native_table[] = {\r
+    {'x',       sizeof(char),   0,              NULL},\r
+    {'b',       sizeof(char),   0,              nu_byte,        np_byte},\r
+    {'B',       sizeof(char),   0,              nu_ubyte,       np_ubyte},\r
+    {'c',       sizeof(char),   0,              nu_char,        np_char},\r
+    {'s',       sizeof(char),   0,              NULL},\r
+    {'p',       sizeof(char),   0,              NULL},\r
+    {'h',       sizeof(short),  SHORT_ALIGN,    nu_short,       np_short},\r
+    {'H',       sizeof(short),  SHORT_ALIGN,    nu_ushort,      np_ushort},\r
+    {'i',       sizeof(int),    INT_ALIGN,      nu_int,         np_int},\r
+    {'I',       sizeof(int),    INT_ALIGN,      nu_uint,        np_uint},\r
+    {'l',       sizeof(long),   LONG_ALIGN,     nu_long,        np_long},\r
+    {'L',       sizeof(long),   LONG_ALIGN,     nu_ulong,       np_ulong},\r
+#ifdef HAVE_LONG_LONG\r
+    {'q',       sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_longlong, np_longlong},\r
+    {'Q',       sizeof(PY_LONG_LONG), LONG_LONG_ALIGN, nu_ulonglong,np_ulonglong},\r
+#endif\r
+    {'?',       sizeof(BOOL_TYPE),      BOOL_ALIGN,     nu_bool,        np_bool},\r
+    {'f',       sizeof(float),  FLOAT_ALIGN,    nu_float,       np_float},\r
+    {'d',       sizeof(double), DOUBLE_ALIGN,   nu_double,      np_double},\r
+    {'P',       sizeof(void *), VOID_P_ALIGN,   nu_void_p,      np_void_p},\r
+    {0}\r
+};\r
+\r
+/* Big-endian routines. *****************************************************/\r
+\r
+static PyObject *\r
+bu_int(const char *p, const formatdef *f)\r
+{\r
+    long x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | *bytes++;\r
+    } while (--i > 0);\r
+    /* Extend the sign bit. */\r
+    if (SIZEOF_LONG > f->size)\r
+        x |= -(x & (1L << ((8 * f->size) - 1)));\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+static PyObject *\r
+bu_uint(const char *p, const formatdef *f)\r
+{\r
+    unsigned long x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | *bytes++;\r
+    } while (--i > 0);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong((long)x);\r
+    return PyLong_FromUnsignedLong(x);\r
+}\r
+\r
+static PyObject *\r
+bu_longlong(const char *p, const formatdef *f)\r
+{\r
+#ifdef HAVE_LONG_LONG\r
+    PY_LONG_LONG x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | *bytes++;\r
+    } while (--i > 0);\r
+    /* Extend the sign bit. */\r
+    if (SIZEOF_LONG_LONG > f->size)\r
+        x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1)));\r
+    if (x >= LONG_MIN && x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));\r
+    return PyLong_FromLongLong(x);\r
+#else\r
+    return _PyLong_FromByteArray((const unsigned char *)p,\r
+                                  8,\r
+                                  0, /* little-endian */\r
+                      1  /* signed */);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+bu_ulonglong(const char *p, const formatdef *f)\r
+{\r
+#ifdef HAVE_LONG_LONG\r
+    unsigned PY_LONG_LONG x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | *bytes++;\r
+    } while (--i > 0);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));\r
+    return PyLong_FromUnsignedLongLong(x);\r
+#else\r
+    return _PyLong_FromByteArray((const unsigned char *)p,\r
+                                  8,\r
+                                  0, /* little-endian */\r
+                      0  /* signed */);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+bu_float(const char *p, const formatdef *f)\r
+{\r
+    return unpack_float(p, 0);\r
+}\r
+\r
+static PyObject *\r
+bu_double(const char *p, const formatdef *f)\r
+{\r
+    return unpack_double(p, 0);\r
+}\r
+\r
+static PyObject *\r
+bu_bool(const char *p, const formatdef *f)\r
+{\r
+    char x;\r
+    memcpy((char *)&x, p, sizeof x);\r
+    return PyBool_FromLong(x != 0);\r
+}\r
+\r
+static int\r
+bp_int(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    Py_ssize_t i;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    i = f->size;\r
+    if (i != SIZEOF_LONG) {\r
+        if ((i == 2) && (x < -32768 || x > 32767))\r
+            return _range_error(f, 0);\r
+#if (SIZEOF_LONG != 4)\r
+        else if ((i == 4) && (x < -2147483648L || x > 2147483647L))\r
+            return _range_error(f, 0);\r
+#endif\r
+    }\r
+    do {\r
+        p[--i] = (char)x;\r
+        x >>= 8;\r
+    } while (i > 0);\r
+    return 0;\r
+}\r
+\r
+static int\r
+bp_uint(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    unsigned long x;\r
+    Py_ssize_t i;\r
+    if (get_ulong(v, &x) < 0)\r
+        return -1;\r
+    i = f->size;\r
+    if (i != SIZEOF_LONG) {\r
+        unsigned long maxint = 1;\r
+        maxint <<= (unsigned long)(i * 8);\r
+        if (x >= maxint)\r
+            return _range_error(f, 1);\r
+    }\r
+    do {\r
+        p[--i] = (char)x;\r
+        x >>= 8;\r
+    } while (i > 0);\r
+    return 0;\r
+}\r
+\r
+static int\r
+bp_longlong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int res;\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    res = _PyLong_AsByteArray((PyLongObject *)v,\r
+                              (unsigned char *)p,\r
+                              8,\r
+                              0, /* little_endian */\r
+                  1  /* signed */);\r
+    Py_DECREF(v);\r
+    return res;\r
+}\r
+\r
+static int\r
+bp_ulonglong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int res;\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    res = _PyLong_AsByteArray((PyLongObject *)v,\r
+                              (unsigned char *)p,\r
+                              8,\r
+                              0, /* little_endian */\r
+                  0  /* signed */);\r
+    Py_DECREF(v);\r
+    return res;\r
+}\r
+\r
+static int\r
+bp_float(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    double x = PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    return _PyFloat_Pack4(x, (unsigned char *)p, 0);\r
+}\r
+\r
+static int\r
+bp_double(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    double x = PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    return _PyFloat_Pack8(x, (unsigned char *)p, 0);\r
+}\r
+\r
+static int\r
+bp_bool(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int y;\r
+    y = PyObject_IsTrue(v);\r
+    if (y < 0)\r
+        return -1;\r
+    *p = (char)y;\r
+    return 0;\r
+}\r
+\r
+static formatdef bigendian_table[] = {\r
+    {'x',       1,              0,              NULL},\r
+    {'b',       1,              0,              nu_byte,        np_byte},\r
+    {'B',       1,              0,              nu_ubyte,       np_ubyte},\r
+    {'c',       1,              0,              nu_char,        np_char},\r
+    {'s',       1,              0,              NULL},\r
+    {'p',       1,              0,              NULL},\r
+    {'h',       2,              0,              bu_int,         bp_int},\r
+    {'H',       2,              0,              bu_uint,        bp_uint},\r
+    {'i',       4,              0,              bu_int,         bp_int},\r
+    {'I',       4,              0,              bu_uint,        bp_uint},\r
+    {'l',       4,              0,              bu_int,         bp_int},\r
+    {'L',       4,              0,              bu_uint,        bp_uint},\r
+    {'q',       8,              0,              bu_longlong,    bp_longlong},\r
+    {'Q',       8,              0,              bu_ulonglong,   bp_ulonglong},\r
+    {'?',       1,              0,              bu_bool,        bp_bool},\r
+    {'f',       4,              0,              bu_float,       bp_float},\r
+    {'d',       8,              0,              bu_double,      bp_double},\r
+    {0}\r
+};\r
+\r
+/* Little-endian routines. *****************************************************/\r
+\r
+static PyObject *\r
+lu_int(const char *p, const formatdef *f)\r
+{\r
+    long x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | bytes[--i];\r
+    } while (i > 0);\r
+    /* Extend the sign bit. */\r
+    if (SIZEOF_LONG > f->size)\r
+        x |= -(x & (1L << ((8 * f->size) - 1)));\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+static PyObject *\r
+lu_uint(const char *p, const formatdef *f)\r
+{\r
+    unsigned long x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | bytes[--i];\r
+    } while (i > 0);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong((long)x);\r
+    return PyLong_FromUnsignedLong((long)x);\r
+}\r
+\r
+static PyObject *\r
+lu_longlong(const char *p, const formatdef *f)\r
+{\r
+#ifdef HAVE_LONG_LONG\r
+    PY_LONG_LONG x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | bytes[--i];\r
+    } while (i > 0);\r
+    /* Extend the sign bit. */\r
+    if (SIZEOF_LONG_LONG > f->size)\r
+        x |= -(x & ((PY_LONG_LONG)1 << ((8 * f->size) - 1)));\r
+    if (x >= LONG_MIN && x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, PY_LONG_LONG, long));\r
+    return PyLong_FromLongLong(x);\r
+#else\r
+    return _PyLong_FromByteArray((const unsigned char *)p,\r
+                                  8,\r
+                                  1, /* little-endian */\r
+                      1  /* signed */);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+lu_ulonglong(const char *p, const formatdef *f)\r
+{\r
+#ifdef HAVE_LONG_LONG\r
+    unsigned PY_LONG_LONG x = 0;\r
+    Py_ssize_t i = f->size;\r
+    const unsigned char *bytes = (const unsigned char *)p;\r
+    do {\r
+        x = (x<<8) | bytes[--i];\r
+    } while (i > 0);\r
+    if (x <= LONG_MAX)\r
+        return PyInt_FromLong(Py_SAFE_DOWNCAST(x, unsigned PY_LONG_LONG, long));\r
+    return PyLong_FromUnsignedLongLong(x);\r
+#else\r
+    return _PyLong_FromByteArray((const unsigned char *)p,\r
+                                  8,\r
+                                  1, /* little-endian */\r
+                      0  /* signed */);\r
+#endif\r
+}\r
+\r
+static PyObject *\r
+lu_float(const char *p, const formatdef *f)\r
+{\r
+    return unpack_float(p, 1);\r
+}\r
+\r
+static PyObject *\r
+lu_double(const char *p, const formatdef *f)\r
+{\r
+    return unpack_double(p, 1);\r
+}\r
+\r
+static int\r
+lp_int(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    long x;\r
+    Py_ssize_t i;\r
+    if (get_long(v, &x) < 0)\r
+        return -1;\r
+    i = f->size;\r
+    if (i != SIZEOF_LONG) {\r
+        if ((i == 2) && (x < -32768 || x > 32767))\r
+            return _range_error(f, 0);\r
+#if (SIZEOF_LONG != 4)\r
+        else if ((i == 4) && (x < -2147483648L || x > 2147483647L))\r
+            return _range_error(f, 0);\r
+#endif\r
+    }\r
+    do {\r
+        *p++ = (char)x;\r
+        x >>= 8;\r
+    } while (--i > 0);\r
+    return 0;\r
+}\r
+\r
+static int\r
+lp_uint(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    unsigned long x;\r
+    Py_ssize_t i;\r
+    if (get_ulong(v, &x) < 0)\r
+        return -1;\r
+    i = f->size;\r
+    if (i != SIZEOF_LONG) {\r
+        unsigned long maxint = 1;\r
+        maxint <<= (unsigned long)(i * 8);\r
+        if (x >= maxint)\r
+            return _range_error(f, 1);\r
+    }\r
+    do {\r
+        *p++ = (char)x;\r
+        x >>= 8;\r
+    } while (--i > 0);\r
+    return 0;\r
+}\r
+\r
+static int\r
+lp_longlong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int res;\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    res = _PyLong_AsByteArray((PyLongObject*)v,\r
+                              (unsigned char *)p,\r
+                              8,\r
+                              1, /* little_endian */\r
+                  1  /* signed */);\r
+    Py_DECREF(v);\r
+    return res;\r
+}\r
+\r
+static int\r
+lp_ulonglong(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    int res;\r
+    v = get_pylong(v);\r
+    if (v == NULL)\r
+        return -1;\r
+    res = _PyLong_AsByteArray((PyLongObject*)v,\r
+                              (unsigned char *)p,\r
+                              8,\r
+                              1, /* little_endian */\r
+                  0  /* signed */);\r
+    Py_DECREF(v);\r
+    return res;\r
+}\r
+\r
+static int\r
+lp_float(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    double x = PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    return _PyFloat_Pack4(x, (unsigned char *)p, 1);\r
+}\r
+\r
+static int\r
+lp_double(char *p, PyObject *v, const formatdef *f)\r
+{\r
+    double x = PyFloat_AsDouble(v);\r
+    if (x == -1 && PyErr_Occurred()) {\r
+        PyErr_SetString(StructError,\r
+                        "required argument is not a float");\r
+        return -1;\r
+    }\r
+    return _PyFloat_Pack8(x, (unsigned char *)p, 1);\r
+}\r
+\r
+static formatdef lilendian_table[] = {\r
+    {'x',       1,              0,              NULL},\r
+    {'b',       1,              0,              nu_byte,        np_byte},\r
+    {'B',       1,              0,              nu_ubyte,       np_ubyte},\r
+    {'c',       1,              0,              nu_char,        np_char},\r
+    {'s',       1,              0,              NULL},\r
+    {'p',       1,              0,              NULL},\r
+    {'h',       2,              0,              lu_int,         lp_int},\r
+    {'H',       2,              0,              lu_uint,        lp_uint},\r
+    {'i',       4,              0,              lu_int,         lp_int},\r
+    {'I',       4,              0,              lu_uint,        lp_uint},\r
+    {'l',       4,              0,              lu_int,         lp_int},\r
+    {'L',       4,              0,              lu_uint,        lp_uint},\r
+    {'q',       8,              0,              lu_longlong,    lp_longlong},\r
+    {'Q',       8,              0,              lu_ulonglong,   lp_ulonglong},\r
+    {'?',       1,              0,              bu_bool,        bp_bool}, /* Std rep not endian dep,\r
+        but potentially different from native rep -- reuse bx_bool funcs. */\r
+    {'f',       4,              0,              lu_float,       lp_float},\r
+    {'d',       8,              0,              lu_double,      lp_double},\r
+    {0}\r
+};\r
+\r
+\r
+static const formatdef *\r
+whichtable(char **pfmt)\r
+{\r
+    const char *fmt = (*pfmt)++; /* May be backed out of later */\r
+    switch (*fmt) {\r
+    case '<':\r
+        return lilendian_table;\r
+    case '>':\r
+    case '!': /* Network byte order is big-endian */\r
+        return bigendian_table;\r
+    case '=': { /* Host byte order -- different from native in alignment! */\r
+        int n = 1;\r
+        char *p = (char *) &n;\r
+        if (*p == 1)\r
+            return lilendian_table;\r
+        else\r
+            return bigendian_table;\r
+    }\r
+    default:\r
+        --*pfmt; /* Back out of pointer increment */\r
+        /* Fall through */\r
+    case '@':\r
+        return native_table;\r
+    }\r
+}\r
+\r
+\r
+/* Get the table entry for a format code */\r
+\r
+static const formatdef *\r
+getentry(int c, const formatdef *f)\r
+{\r
+    for (; f->format != '\0'; f++) {\r
+        if (f->format == c) {\r
+            return f;\r
+        }\r
+    }\r
+    PyErr_SetString(StructError, "bad char in struct format");\r
+    return NULL;\r
+}\r
+\r
+\r
+/* Align a size according to a format code.  Return -1 on overflow. */\r
+\r
+static Py_ssize_t\r
+align(Py_ssize_t size, char c, const formatdef *e)\r
+{\r
+    Py_ssize_t extra;\r
+\r
+    if (e->format == c) {\r
+        if (e->alignment && size > 0) {\r
+            extra = (e->alignment - 1) - (size - 1) % (e->alignment);\r
+            if (extra > PY_SSIZE_T_MAX - size)\r
+                return -1;\r
+            size += extra;\r
+        }\r
+    }\r
+    return size;\r
+}\r
+\r
+\r
+/* calculate the size of a format string */\r
+\r
+static int\r
+prepare_s(PyStructObject *self)\r
+{\r
+    const formatdef *f;\r
+    const formatdef *e;\r
+    formatcode *codes;\r
+\r
+    const char *s;\r
+    const char *fmt;\r
+    char c;\r
+    Py_ssize_t size, len, num, itemsize;\r
+\r
+    fmt = PyString_AS_STRING(self->s_format);\r
+\r
+    f = whichtable((char **)&fmt);\r
+\r
+    s = fmt;\r
+    size = 0;\r
+    len = 0;\r
+    while ((c = *s++) != '\0') {\r
+        if (isspace(Py_CHARMASK(c)))\r
+            continue;\r
+        if ('0' <= c && c <= '9') {\r
+            num = c - '0';\r
+            while ('0' <= (c = *s++) && c <= '9') {\r
+                /* overflow-safe version of\r
+                   if (num*10 + (c - '0') > PY_SSIZE_T_MAX) { ... } */\r
+                if (num >= PY_SSIZE_T_MAX / 10 && (\r
+                        num > PY_SSIZE_T_MAX / 10 ||\r
+                        (c - '0') > PY_SSIZE_T_MAX % 10))\r
+                    goto overflow;\r
+                num = num*10 + (c - '0');\r
+            }\r
+            if (c == '\0')\r
+                break;\r
+        }\r
+        else\r
+            num = 1;\r
+\r
+        e = getentry(c, f);\r
+        if (e == NULL)\r
+            return -1;\r
+\r
+        switch (c) {\r
+            case 's': /* fall through */\r
+            case 'p': len++; break;\r
+            case 'x': break;\r
+            default: len += num; break;\r
+        }\r
+\r
+        itemsize = e->size;\r
+        size = align(size, c, e);\r
+        if (size == -1)\r
+            goto overflow;\r
+\r
+        /* if (size + num * itemsize > PY_SSIZE_T_MAX) { ... } */\r
+        if (num > (PY_SSIZE_T_MAX - size) / itemsize)\r
+            goto overflow;\r
+        size += num * itemsize;\r
+    }\r
+\r
+    /* check for overflow */\r
+    if ((len + 1) > (PY_SSIZE_T_MAX / sizeof(formatcode))) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+\r
+    self->s_size = size;\r
+    self->s_len = len;\r
+    codes = PyMem_MALLOC((len + 1) * sizeof(formatcode));\r
+    if (codes == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    /* Free any s_codes value left over from a previous initialization. */\r
+    if (self->s_codes != NULL)\r
+        PyMem_FREE(self->s_codes);\r
+    self->s_codes = codes;\r
+\r
+    s = fmt;\r
+    size = 0;\r
+    while ((c = *s++) != '\0') {\r
+        if (isspace(Py_CHARMASK(c)))\r
+            continue;\r
+        if ('0' <= c && c <= '9') {\r
+            num = c - '0';\r
+            while ('0' <= (c = *s++) && c <= '9')\r
+                num = num*10 + (c - '0');\r
+            if (c == '\0')\r
+                break;\r
+        }\r
+        else\r
+            num = 1;\r
+\r
+        e = getentry(c, f);\r
+\r
+        size = align(size, c, e);\r
+        if (c == 's' || c == 'p') {\r
+            codes->offset = size;\r
+            codes->size = num;\r
+            codes->fmtdef = e;\r
+            codes++;\r
+            size += num;\r
+        } else if (c == 'x') {\r
+            size += num;\r
+        } else {\r
+            while (--num >= 0) {\r
+                codes->offset = size;\r
+                codes->size = e->size;\r
+                codes->fmtdef = e;\r
+                codes++;\r
+                size += e->size;\r
+            }\r
+        }\r
+    }\r
+    codes->fmtdef = NULL;\r
+    codes->offset = size;\r
+    codes->size = 0;\r
+\r
+    return 0;\r
+\r
+  overflow:\r
+    PyErr_SetString(StructError,\r
+                    "total struct size too long");\r
+    return -1;\r
+}\r
+\r
+static PyObject *\r
+s_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *self;\r
+\r
+    assert(type != NULL && type->tp_alloc != NULL);\r
+\r
+    self = type->tp_alloc(type, 0);\r
+    if (self != NULL) {\r
+        PyStructObject *s = (PyStructObject*)self;\r
+        Py_INCREF(Py_None);\r
+        s->s_format = Py_None;\r
+        s->s_codes = NULL;\r
+        s->s_size = -1;\r
+        s->s_len = -1;\r
+    }\r
+    return self;\r
+}\r
+\r
+static int\r
+s_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    PyStructObject *soself = (PyStructObject *)self;\r
+    PyObject *o_format = NULL;\r
+    int ret = 0;\r
+    static char *kwlist[] = {"format", 0};\r
+\r
+    assert(PyStruct_Check(self));\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O:Struct", kwlist,\r
+                                     &o_format))\r
+        return -1;\r
+\r
+    if (PyString_Check(o_format)) {\r
+        Py_INCREF(o_format);\r
+        Py_CLEAR(soself->s_format);\r
+        soself->s_format = o_format;\r
+    }\r
+    else if (PyUnicode_Check(o_format)) {\r
+        PyObject *str = PyUnicode_AsEncodedString(o_format, "ascii", NULL);\r
+        if (str == NULL)\r
+            return -1;\r
+        Py_CLEAR(soself->s_format);\r
+        soself->s_format = str;\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "Struct() argument 1 must be string, not %s",\r
+                     Py_TYPE(o_format)->tp_name);\r
+        return -1;\r
+    }\r
+\r
+    ret = prepare_s(soself);\r
+    return ret;\r
+}\r
+\r
+static void\r
+s_dealloc(PyStructObject *s)\r
+{\r
+    if (s->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *)s);\r
+    if (s->s_codes != NULL) {\r
+        PyMem_FREE(s->s_codes);\r
+    }\r
+    Py_XDECREF(s->s_format);\r
+    Py_TYPE(s)->tp_free((PyObject *)s);\r
+}\r
+\r
+static PyObject *\r
+s_unpack_internal(PyStructObject *soself, char *startfrom) {\r
+    formatcode *code;\r
+    Py_ssize_t i = 0;\r
+    PyObject *result = PyTuple_New(soself->s_len);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    for (code = soself->s_codes; code->fmtdef != NULL; code++) {\r
+        PyObject *v;\r
+        const formatdef *e = code->fmtdef;\r
+        const char *res = startfrom + code->offset;\r
+        if (e->format == 's') {\r
+            v = PyString_FromStringAndSize(res, code->size);\r
+        } else if (e->format == 'p') {\r
+            Py_ssize_t n = *(unsigned char*)res;\r
+            if (n >= code->size)\r
+                n = code->size - 1;\r
+            v = PyString_FromStringAndSize(res + 1, n);\r
+        } else {\r
+            v = e->unpack(res, e);\r
+        }\r
+        if (v == NULL)\r
+            goto fail;\r
+        PyTuple_SET_ITEM(result, i++, v);\r
+    }\r
+\r
+    return result;\r
+fail:\r
+    Py_DECREF(result);\r
+    return NULL;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(s_unpack__doc__,\r
+"S.unpack(str) -> (v1, v2, ...)\n\\r
+\n\\r
+Return tuple containing values unpacked according to this Struct's format.\n\\r
+Requires len(str) == self.size. See struct.__doc__ for more on format\n\\r
+strings.");\r
+\r
+static PyObject *\r
+s_unpack(PyObject *self, PyObject *inputstr)\r
+{\r
+    Py_buffer buf;\r
+    char *start;\r
+    Py_ssize_t len;\r
+    PyObject *args=NULL, *result;\r
+    PyStructObject *soself = (PyStructObject *)self;\r
+    assert(PyStruct_Check(self));\r
+    assert(soself->s_codes != NULL);\r
+    if (inputstr == NULL)\r
+        goto fail;\r
+    if (PyString_Check(inputstr) &&\r
+        PyString_GET_SIZE(inputstr) == soself->s_size) {\r
+            return s_unpack_internal(soself, PyString_AS_STRING(inputstr));\r
+    }\r
+    args = PyTuple_Pack(1, inputstr);\r
+    if (args == NULL)\r
+        return NULL;\r
+    if (!PyArg_ParseTuple(args, "s*:unpack", &buf))\r
+        goto fail;\r
+    start = buf.buf;\r
+    len = buf.len;\r
+    if (soself->s_size != len) {\r
+        PyBuffer_Release(&buf);\r
+        goto fail;\r
+    }\r
+    result = s_unpack_internal(soself, start);\r
+    Py_DECREF(args);\r
+    PyBuffer_Release(&buf);\r
+    return result;\r
+\r
+fail:\r
+    Py_XDECREF(args);\r
+    PyErr_Format(StructError,\r
+        "unpack requires a string argument of length %zd",\r
+        soself->s_size);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(s_unpack_from__doc__,\r
+"S.unpack_from(buffer[, offset]) -> (v1, v2, ...)\n\\r
+\n\\r
+Return tuple containing values unpacked according to this Struct's format.\n\\r
+Unlike unpack, unpack_from can unpack values from any object supporting\n\\r
+the buffer API, not just str. Requires len(buffer[offset:]) >= self.size.\n\\r
+See struct.__doc__ for more on format strings.");\r
+\r
+static PyObject *\r
+s_unpack_from(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwlist[] = {"buffer", "offset", 0};\r
+    static char *fmt = "z*|n:unpack_from";\r
+    Py_buffer buf;\r
+    Py_ssize_t buffer_len = 0, offset = 0;\r
+    char *buffer = NULL;\r
+    PyStructObject *soself = (PyStructObject *)self;\r
+    PyObject *result;\r
+    assert(PyStruct_Check(self));\r
+    assert(soself->s_codes != NULL);\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, fmt, kwlist,\r
+                                     &buf, &offset))\r
+        return NULL;\r
+    buffer = buf.buf;\r
+    buffer_len = buf.len;\r
+    if (buffer == NULL) {\r
+        PyErr_Format(StructError,\r
+            "unpack_from requires a buffer argument");\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    if (offset < 0)\r
+        offset += buffer_len;\r
+\r
+    if (offset < 0 || (buffer_len - offset) < soself->s_size) {\r
+        PyErr_Format(StructError,\r
+            "unpack_from requires a buffer of at least %zd bytes",\r
+            soself->s_size);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    result = s_unpack_internal(soself, buffer + offset);\r
+    PyBuffer_Release(&buf);\r
+    return result;\r
+}\r
+\r
+\r
+/*\r
+ * Guts of the pack function.\r
+ *\r
+ * Takes a struct object, a tuple of arguments, and offset in that tuple of\r
+ * argument for where to start processing the arguments for packing, and a\r
+ * character buffer for writing the packed string.  The caller must insure\r
+ * that the buffer may contain the required length for packing the arguments.\r
+ * 0 is returned on success, 1 is returned if there is an error.\r
+ *\r
+ */\r
+static int\r
+s_pack_internal(PyStructObject *soself, PyObject *args, int offset, char* buf)\r
+{\r
+    formatcode *code;\r
+    /* XXX(nnorwitz): why does i need to be a local?  can we use\r
+       the offset parameter or do we need the wider width? */\r
+    Py_ssize_t i;\r
+\r
+    memset(buf, '\0', soself->s_size);\r
+    i = offset;\r
+    for (code = soself->s_codes; code->fmtdef != NULL; code++) {\r
+        Py_ssize_t n;\r
+        PyObject *v = PyTuple_GET_ITEM(args, i++);\r
+        const formatdef *e = code->fmtdef;\r
+        char *res = buf + code->offset;\r
+        if (e->format == 's') {\r
+            if (!PyString_Check(v)) {\r
+                PyErr_SetString(StructError,\r
+                                "argument for 's' must "\r
+                                "be a string");\r
+                return -1;\r
+            }\r
+            n = PyString_GET_SIZE(v);\r
+            if (n > code->size)\r
+                n = code->size;\r
+            if (n > 0)\r
+                memcpy(res, PyString_AS_STRING(v), n);\r
+        } else if (e->format == 'p') {\r
+            if (!PyString_Check(v)) {\r
+                PyErr_SetString(StructError,\r
+                                "argument for 'p' must "\r
+                                "be a string");\r
+                return -1;\r
+            }\r
+            n = PyString_GET_SIZE(v);\r
+            if (n > (code->size - 1))\r
+                n = code->size - 1;\r
+            if (n > 0)\r
+                memcpy(res + 1, PyString_AS_STRING(v), n);\r
+            if (n > 255)\r
+                n = 255;\r
+            *res = Py_SAFE_DOWNCAST(n, Py_ssize_t, unsigned char);\r
+        } else if (e->pack(res, v, e) < 0) {\r
+            if (strchr(integer_codes, e->format) != NULL &&\r
+                PyErr_ExceptionMatches(PyExc_OverflowError))\r
+                PyErr_Format(StructError,\r
+                             "integer out of range for "\r
+                             "'%c' format code",\r
+                             e->format);\r
+            return -1;\r
+        }\r
+    }\r
+\r
+    /* Success */\r
+    return 0;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(s_pack__doc__,\r
+"S.pack(v1, v2, ...) -> string\n\\r
+\n\\r
+Return a string containing values v1, v2, ... packed according to this\n\\r
+Struct's format. See struct.__doc__ for more on format strings.");\r
+\r
+static PyObject *\r
+s_pack(PyObject *self, PyObject *args)\r
+{\r
+    PyStructObject *soself;\r
+    PyObject *result;\r
+\r
+    /* Validate arguments. */\r
+    soself = (PyStructObject *)self;\r
+    assert(PyStruct_Check(self));\r
+    assert(soself->s_codes != NULL);\r
+    if (PyTuple_GET_SIZE(args) != soself->s_len)\r
+    {\r
+        PyErr_Format(StructError,\r
+            "pack expected %zd items for packing (got %zd)", soself->s_len, PyTuple_GET_SIZE(args));\r
+        return NULL;\r
+    }\r
+\r
+    /* Allocate a new string */\r
+    result = PyString_FromStringAndSize((char *)NULL, soself->s_size);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    /* Call the guts */\r
+    if ( s_pack_internal(soself, args, 0, PyString_AS_STRING(result)) != 0 ) {\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(s_pack_into__doc__,\r
+"S.pack_into(buffer, offset, v1, v2, ...)\n\\r
+\n\\r
+Pack the values v1, v2, ... according to this Struct's format, write \n\\r
+the packed bytes into the writable buffer buf starting at offset.  Note\n\\r
+that the offset is not an optional argument.  See struct.__doc__ for \n\\r
+more on format strings.");\r
+\r
+static PyObject *\r
+s_pack_into(PyObject *self, PyObject *args)\r
+{\r
+    PyStructObject *soself;\r
+    Py_buffer buf;\r
+    Py_ssize_t offset;\r
+\r
+    /* Validate arguments.  +1 is for the first arg as buffer. */\r
+    soself = (PyStructObject *)self;\r
+    assert(PyStruct_Check(self));\r
+    assert(soself->s_codes != NULL);\r
+    if (PyTuple_GET_SIZE(args) != (soself->s_len + 2))\r
+    {\r
+        if (PyTuple_GET_SIZE(args) == 0) {\r
+            PyErr_Format(StructError,\r
+                        "pack_into expected buffer argument");\r
+        }\r
+        else if (PyTuple_GET_SIZE(args) == 1) {\r
+            PyErr_Format(StructError,\r
+                        "pack_into expected offset argument");\r
+        }\r
+        else {\r
+            PyErr_Format(StructError,\r
+                        "pack_into expected %zd items for packing (got %zd)",\r
+                        soself->s_len, (PyTuple_GET_SIZE(args) - 2));\r
+        }\r
+        return NULL;\r
+    }\r
+\r
+    /* Extract a writable memory buffer from the first argument */\r
+    if (!PyArg_Parse(PyTuple_GET_ITEM(args, 0), "w*", &buf))\r
+        return NULL;\r
+\r
+    /* Extract the offset from the first argument */\r
+    offset = PyInt_AsSsize_t(PyTuple_GET_ITEM(args, 1));\r
+    if (offset == -1 && PyErr_Occurred()) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    /* Support negative offsets. */\r
+    if (offset < 0)\r
+        offset += buf.len;\r
+\r
+    /* Check boundaries */\r
+    if (offset < 0 || (buf.len - offset) < soself->s_size) {\r
+        PyErr_Format(StructError,\r
+                     "pack_into requires a buffer of at least %zd bytes",\r
+                     soself->s_size);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    /* Call the guts */\r
+    if (s_pack_internal(soself, args, 2, (char *)buf.buf + offset) != 0) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    PyBuffer_Release(&buf);\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+s_get_format(PyStructObject *self, void *unused)\r
+{\r
+    Py_INCREF(self->s_format);\r
+    return self->s_format;\r
+}\r
+\r
+static PyObject *\r
+s_get_size(PyStructObject *self, void *unused)\r
+{\r
+    return PyInt_FromSsize_t(self->s_size);\r
+}\r
+\r
+PyDoc_STRVAR(s_sizeof__doc__,\r
+"S.__sizeof__() -> size of S in memory, in bytes");\r
+\r
+static PyObject *\r
+s_sizeof(PyStructObject *self, void *unused)\r
+{\r
+    Py_ssize_t size;\r
+\r
+    size = sizeof(PyStructObject) + sizeof(formatcode) * (self->s_len + 1);\r
+    return PyLong_FromSsize_t(size);\r
+}\r
+\r
+/* List of functions */\r
+\r
+static struct PyMethodDef s_methods[] = {\r
+    {"pack",            s_pack,         METH_VARARGS, s_pack__doc__},\r
+    {"pack_into",       s_pack_into,    METH_VARARGS, s_pack_into__doc__},\r
+    {"unpack",          s_unpack,       METH_O, s_unpack__doc__},\r
+    {"unpack_from",     (PyCFunction)s_unpack_from, METH_VARARGS|METH_KEYWORDS,\r
+                    s_unpack_from__doc__},\r
+    {"__sizeof__",      (PyCFunction)s_sizeof, METH_NOARGS, s_sizeof__doc__},\r
+    {NULL,       NULL}          /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(s__doc__, "Compiled struct object");\r
+\r
+#define OFF(x) offsetof(PyStructObject, x)\r
+\r
+static PyGetSetDef s_getsetlist[] = {\r
+    {"format", (getter)s_get_format, (setter)NULL, "struct format string", NULL},\r
+    {"size", (getter)s_get_size, (setter)NULL, "struct size in bytes", NULL},\r
+    {NULL} /* sentinel */\r
+};\r
+\r
+static\r
+PyTypeObject PyStructType = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "Struct",\r
+    sizeof(PyStructObject),\r
+    0,\r
+    (destructor)s_dealloc,      /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    PyObject_GenericSetAttr,            /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,/* tp_flags */\r
+    s__doc__,                           /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    offsetof(PyStructObject, weakreflist),      /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    s_methods,                          /* tp_methods */\r
+    NULL,                               /* tp_members */\r
+    s_getsetlist,               /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    s_init,                             /* tp_init */\r
+    PyType_GenericAlloc,/* tp_alloc */\r
+    s_new,                              /* tp_new */\r
+    PyObject_Del,               /* tp_free */\r
+};\r
+\r
+\r
+/* ---- Standalone functions  ---- */\r
+\r
+#define MAXCACHE 100\r
+static PyObject *cache = NULL;\r
+\r
+static PyObject *\r
+cache_struct(PyObject *fmt)\r
+{\r
+    PyObject * s_object;\r
+\r
+    if (cache == NULL) {\r
+        cache = PyDict_New();\r
+        if (cache == NULL)\r
+            return NULL;\r
+    }\r
+\r
+    s_object = PyDict_GetItem(cache, fmt);\r
+    if (s_object != NULL) {\r
+        Py_INCREF(s_object);\r
+        return s_object;\r
+    }\r
+\r
+    s_object = PyObject_CallFunctionObjArgs((PyObject *)(&PyStructType), fmt, NULL);\r
+    if (s_object != NULL) {\r
+        if (PyDict_Size(cache) >= MAXCACHE)\r
+            PyDict_Clear(cache);\r
+        /* Attempt to cache the result */\r
+        if (PyDict_SetItem(cache, fmt, s_object) == -1)\r
+            PyErr_Clear();\r
+    }\r
+    return s_object;\r
+}\r
+\r
+PyDoc_STRVAR(clearcache_doc,\r
+"Clear the internal cache.");\r
+\r
+static PyObject *\r
+clearcache(PyObject *self)\r
+{\r
+    Py_CLEAR(cache);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(calcsize_doc,\r
+"Return size of C struct described by format string fmt.");\r
+\r
+static PyObject *\r
+calcsize(PyObject *self, PyObject *fmt)\r
+{\r
+    Py_ssize_t n;\r
+    PyObject *s_object = cache_struct(fmt);\r
+    if (s_object == NULL)\r
+        return NULL;\r
+    n = ((PyStructObject *)s_object)->s_size;\r
+    Py_DECREF(s_object);\r
+    return PyInt_FromSsize_t(n);\r
+}\r
+\r
+PyDoc_STRVAR(pack_doc,\r
+"Return string containing values v1, v2, ... packed according to fmt.");\r
+\r
+static PyObject *\r
+pack(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *s_object, *fmt, *newargs, *result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(args);\r
+\r
+    if (n == 0) {\r
+        PyErr_SetString(PyExc_TypeError, "missing format argument");\r
+        return NULL;\r
+    }\r
+    fmt = PyTuple_GET_ITEM(args, 0);\r
+    newargs = PyTuple_GetSlice(args, 1, n);\r
+    if (newargs == NULL)\r
+        return NULL;\r
+\r
+    s_object = cache_struct(fmt);\r
+    if (s_object == NULL) {\r
+        Py_DECREF(newargs);\r
+        return NULL;\r
+    }\r
+    result = s_pack(s_object, newargs);\r
+    Py_DECREF(newargs);\r
+    Py_DECREF(s_object);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(pack_into_doc,\r
+"Pack the values v1, v2, ... according to fmt.\n\\r
+Write the packed bytes into the writable buffer buf starting at offset.");\r
+\r
+static PyObject *\r
+pack_into(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *s_object, *fmt, *newargs, *result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(args);\r
+\r
+    if (n == 0) {\r
+        PyErr_SetString(PyExc_TypeError, "missing format argument");\r
+        return NULL;\r
+    }\r
+    fmt = PyTuple_GET_ITEM(args, 0);\r
+    newargs = PyTuple_GetSlice(args, 1, n);\r
+    if (newargs == NULL)\r
+        return NULL;\r
+\r
+    s_object = cache_struct(fmt);\r
+    if (s_object == NULL) {\r
+        Py_DECREF(newargs);\r
+        return NULL;\r
+    }\r
+    result = s_pack_into(s_object, newargs);\r
+    Py_DECREF(newargs);\r
+    Py_DECREF(s_object);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(unpack_doc,\r
+"Unpack the string containing packed C structure data, according to fmt.\n\\r
+Requires len(string) == calcsize(fmt).");\r
+\r
+static PyObject *\r
+unpack(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *s_object, *fmt, *inputstr, *result;\r
+\r
+    if (!PyArg_UnpackTuple(args, "unpack", 2, 2, &fmt, &inputstr))\r
+        return NULL;\r
+\r
+    s_object = cache_struct(fmt);\r
+    if (s_object == NULL)\r
+        return NULL;\r
+    result = s_unpack(s_object, inputstr);\r
+    Py_DECREF(s_object);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(unpack_from_doc,\r
+"Unpack the buffer, containing packed C structure data, according to\n\\r
+fmt, starting at offset. Requires len(buffer[offset:]) >= calcsize(fmt).");\r
+\r
+static PyObject *\r
+unpack_from(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *s_object, *fmt, *newargs, *result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(args);\r
+\r
+    if (n == 0) {\r
+        PyErr_SetString(PyExc_TypeError, "missing format argument");\r
+        return NULL;\r
+    }\r
+    fmt = PyTuple_GET_ITEM(args, 0);\r
+    newargs = PyTuple_GetSlice(args, 1, n);\r
+    if (newargs == NULL)\r
+        return NULL;\r
+\r
+    s_object = cache_struct(fmt);\r
+    if (s_object == NULL) {\r
+        Py_DECREF(newargs);\r
+        return NULL;\r
+    }\r
+    result = s_unpack_from(s_object, newargs, kwds);\r
+    Py_DECREF(newargs);\r
+    Py_DECREF(s_object);\r
+    return result;\r
+}\r
+\r
+static struct PyMethodDef module_functions[] = {\r
+    {"_clearcache",     (PyCFunction)clearcache,        METH_NOARGS,    clearcache_doc},\r
+    {"calcsize",        calcsize,       METH_O, calcsize_doc},\r
+    {"pack",            pack,           METH_VARARGS,   pack_doc},\r
+    {"pack_into",       pack_into,      METH_VARARGS,   pack_into_doc},\r
+    {"unpack",          unpack, METH_VARARGS,   unpack_doc},\r
+    {"unpack_from",     (PyCFunction)unpack_from,\r
+                    METH_VARARGS|METH_KEYWORDS,         unpack_from_doc},\r
+    {NULL,       NULL}          /* sentinel */\r
+};\r
+\r
+\r
+/* Module initialization */\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Functions to convert between Python values and C structs represented\n\\r
+as Python strings. It uses format strings (explained below) as compact\n\\r
+descriptions of the lay-out of the C structs and the intended conversion\n\\r
+to/from Python values.\n\\r
+\n\\r
+The optional first format char indicates byte order, size and alignment:\n\\r
+  @: native order, size & alignment (default)\n\\r
+  =: native order, std. size & alignment\n\\r
+  <: little-endian, std. size & alignment\n\\r
+  >: big-endian, std. size & alignment\n\\r
+  !: same as >\n\\r
+\n\\r
+The remaining chars indicate types of args and must match exactly;\n\\r
+these can be preceded by a decimal repeat count:\n\\r
+  x: pad byte (no data); c:char; b:signed byte; B:unsigned byte;\n\\r
+  ?: _Bool (requires C99; if not available, char is used instead)\n\\r
+  h:short; H:unsigned short; i:int; I:unsigned int;\n\\r
+  l:long; L:unsigned long; f:float; d:double.\n\\r
+Special cases (preceding decimal count indicates length):\n\\r
+  s:string (array of char); p: pascal string (with count byte).\n\\r
+Special case (only available in native format):\n\\r
+  P:an integer type that is wide enough to hold a pointer.\n\\r
+Special case (not in native mode unless 'long long' in platform C):\n\\r
+  q:long long; Q:unsigned long long\n\\r
+Whitespace between formats is ignored.\n\\r
+\n\\r
+The variable struct.error is an exception raised on errors.\n");\r
+\r
+PyMODINIT_FUNC\r
+init_struct(void)\r
+{\r
+    PyObject *ver, *m;\r
+\r
+    ver = PyString_FromString("0.2");\r
+    if (ver == NULL)\r
+        return;\r
+\r
+    m = Py_InitModule3("_struct", module_functions, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    Py_TYPE(&PyStructType) = &PyType_Type;\r
+    if (PyType_Ready(&PyStructType) < 0)\r
+        return;\r
+\r
+    /* This speed trick can't be used until overflow masking goes\r
+       away, because native endian always raises exceptions\r
+       instead of overflow masking. */\r
+\r
+    /* Check endian and swap in faster functions */\r
+    {\r
+        int one = 1;\r
+        formatdef *native = native_table;\r
+        formatdef *other, *ptr;\r
+        if ((int)*(unsigned char*)&one)\r
+            other = lilendian_table;\r
+        else\r
+            other = bigendian_table;\r
+        /* Scan through the native table, find a matching\r
+           entry in the endian table and swap in the\r
+           native implementations whenever possible\r
+           (64-bit platforms may not have "standard" sizes) */\r
+        while (native->format != '\0' && other->format != '\0') {\r
+            ptr = other;\r
+            while (ptr->format != '\0') {\r
+                if (ptr->format == native->format) {\r
+                    /* Match faster when formats are\r
+                       listed in the same order */\r
+                    if (ptr == other)\r
+                        other++;\r
+                    /* Only use the trick if the\r
+                       size matches */\r
+                    if (ptr->size != native->size)\r
+                        break;\r
+                    /* Skip float and double, could be\r
+                       "unknown" float format */\r
+                    if (ptr->format == 'd' || ptr->format == 'f')\r
+                        break;\r
+                    ptr->pack = native->pack;\r
+                    ptr->unpack = native->unpack;\r
+                    break;\r
+                }\r
+                ptr++;\r
+            }\r
+            native++;\r
+        }\r
+    }\r
+\r
+    /* Add some symbolic constants to the module */\r
+    if (StructError == NULL) {\r
+        StructError = PyErr_NewException("struct.error", NULL, NULL);\r
+        if (StructError == NULL)\r
+            return;\r
+    }\r
+\r
+    Py_INCREF(StructError);\r
+    PyModule_AddObject(m, "error", StructError);\r
+\r
+    Py_INCREF((PyObject*)&PyStructType);\r
+    PyModule_AddObject(m, "Struct", (PyObject*)&PyStructType);\r
+\r
+    PyModule_AddObject(m, "__version__", ver);\r
+\r
+    PyModule_AddIntConstant(m, "_PY_STRUCT_RANGE_CHECKING", 1);\r
+    PyModule_AddIntConstant(m, "_PY_STRUCT_FLOAT_COERCE", 1);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/_weakref.c
new file mode 100644 (file)
index 0000000..087cc92
--- /dev/null
@@ -0,0 +1,112 @@
+#include "Python.h"\r
+\r
+\r
+#define GET_WEAKREFS_LISTPTR(o) \\r
+        ((PyWeakReference **) PyObject_GET_WEAKREFS_LISTPTR(o))\r
+\r
+\r
+PyDoc_STRVAR(weakref_getweakrefcount__doc__,\r
+"getweakrefcount(object) -- return the number of weak references\n"\r
+"to 'object'.");\r
+\r
+static PyObject *\r
+weakref_getweakrefcount(PyObject *self, PyObject *object)\r
+{\r
+    PyObject *result = NULL;\r
+\r
+    if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
+        PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
+\r
+        result = PyInt_FromSsize_t(_PyWeakref_GetWeakrefCount(*list));\r
+    }\r
+    else\r
+        result = PyInt_FromLong(0);\r
+\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(weakref_getweakrefs__doc__,\r
+"getweakrefs(object) -- return a list of all weak reference objects\n"\r
+"that point to 'object'.");\r
+\r
+static PyObject *\r
+weakref_getweakrefs(PyObject *self, PyObject *object)\r
+{\r
+    PyObject *result = NULL;\r
+\r
+    if (PyType_SUPPORTS_WEAKREFS(Py_TYPE(object))) {\r
+        PyWeakReference **list = GET_WEAKREFS_LISTPTR(object);\r
+        Py_ssize_t count = _PyWeakref_GetWeakrefCount(*list);\r
+\r
+        result = PyList_New(count);\r
+        if (result != NULL) {\r
+            PyWeakReference *current = *list;\r
+            Py_ssize_t i;\r
+            for (i = 0; i < count; ++i) {\r
+                PyList_SET_ITEM(result, i, (PyObject *) current);\r
+                Py_INCREF(current);\r
+                current = current->wr_next;\r
+            }\r
+        }\r
+    }\r
+    else {\r
+        result = PyList_New(0);\r
+    }\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(weakref_proxy__doc__,\r
+"proxy(object[, callback]) -- create a proxy object that weakly\n"\r
+"references 'object'.  'callback', if given, is called with a\n"\r
+"reference to the proxy when 'object' is about to be finalized.");\r
+\r
+static PyObject *\r
+weakref_proxy(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *object;\r
+    PyObject *callback = NULL;\r
+    PyObject *result = NULL;\r
+\r
+    if (PyArg_UnpackTuple(args, "proxy", 1, 2, &object, &callback)) {\r
+        result = PyWeakref_NewProxy(object, callback);\r
+    }\r
+    return result;\r
+}\r
+\r
+\r
+static PyMethodDef\r
+weakref_functions[] =  {\r
+    {"getweakrefcount", weakref_getweakrefcount,        METH_O,\r
+     weakref_getweakrefcount__doc__},\r
+    {"getweakrefs",     weakref_getweakrefs,            METH_O,\r
+     weakref_getweakrefs__doc__},\r
+    {"proxy",           weakref_proxy,                  METH_VARARGS,\r
+     weakref_proxy__doc__},\r
+    {NULL, NULL, 0, NULL}\r
+};\r
+\r
+\r
+PyMODINIT_FUNC\r
+init_weakref(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("_weakref", weakref_functions,\r
+                       "Weak-reference support module.");\r
+    if (m != NULL) {\r
+        Py_INCREF(&_PyWeakref_RefType);\r
+        PyModule_AddObject(m, "ref",\r
+                           (PyObject *) &_PyWeakref_RefType);\r
+        Py_INCREF(&_PyWeakref_RefType);\r
+        PyModule_AddObject(m, "ReferenceType",\r
+                           (PyObject *) &_PyWeakref_RefType);\r
+        Py_INCREF(&_PyWeakref_ProxyType);\r
+        PyModule_AddObject(m, "ProxyType",\r
+                           (PyObject *) &_PyWeakref_ProxyType);\r
+        Py_INCREF(&_PyWeakref_CallableProxyType);\r
+        PyModule_AddObject(m, "CallableProxyType",\r
+                           (PyObject *) &_PyWeakref_CallableProxyType);\r
+    }\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/addrinfo.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/addrinfo.h
new file mode 100644 (file)
index 0000000..6f8b496
--- /dev/null
@@ -0,0 +1,176 @@
+/*\r
+ * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.\r
+ * All rights reserved.\r
+ *\r
+ * Redistribution and use in source and binary forms, with or without\r
+ * modification, are permitted provided that the following conditions\r
+ * are met:\r
+ * 1. Redistributions of source code must retain the above copyright\r
+ *    notice, this list of conditions and the following disclaimer.\r
+ * 2. Redistributions in binary form must reproduce the above copyright\r
+ *    notice, this list of conditions and the following disclaimer in the\r
+ *    documentation and/or other materials provided with the distribution.\r
+ * 3. Neither the name of the project nor the names of its contributors\r
+ *    may be used to endorse or promote products derived from this software\r
+ *    without specific prior written permission.\r
+ *\r
+ * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND\r
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\r
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\r
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE\r
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\r
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\r
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\r
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\r
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\r
+ * SUCH DAMAGE.\r
+ */\r
+\r
+#ifndef HAVE_GETADDRINFO\r
+\r
+/*\r
+ * Error return codes from getaddrinfo()\r
+ */\r
+#ifdef EAI_ADDRFAMILY\r
+/* If this is defined, there is a conflicting implementation\r
+   in the C library, which can't be used for some reason.\r
+   Make sure it won't interfere with this emulation. */\r
+\r
+#undef EAI_ADDRFAMILY\r
+#undef EAI_AGAIN\r
+#undef EAI_BADFLAGS\r
+#undef EAI_FAIL\r
+#undef EAI_FAMILY\r
+#undef EAI_MEMORY\r
+#undef EAI_NODATA\r
+#undef EAI_NONAME\r
+#undef EAI_SERVICE\r
+#undef EAI_SOCKTYPE\r
+#undef EAI_SYSTEM\r
+#undef EAI_BADHINTS\r
+#undef EAI_PROTOCOL\r
+#undef EAI_MAX\r
+#undef getaddrinfo\r
+#define getaddrinfo fake_getaddrinfo\r
+#endif /* EAI_ADDRFAMILY */\r
+\r
+#define EAI_ADDRFAMILY   1      /* address family for hostname not supported */\r
+#define EAI_AGAIN        2      /* temporary failure in name resolution */\r
+#define EAI_BADFLAGS     3      /* invalid value for ai_flags */\r
+#define EAI_FAIL         4      /* non-recoverable failure in name resolution */\r
+#define EAI_FAMILY       5      /* ai_family not supported */\r
+#define EAI_MEMORY       6      /* memory allocation failure */\r
+#define EAI_NODATA       7      /* no address associated with hostname */\r
+#define EAI_NONAME       8      /* hostname nor servname provided, or not known */\r
+#define EAI_SERVICE      9      /* servname not supported for ai_socktype */\r
+#define EAI_SOCKTYPE    10      /* ai_socktype not supported */\r
+#define EAI_SYSTEM      11      /* system error returned in errno */\r
+#define EAI_BADHINTS    12\r
+#define EAI_PROTOCOL    13\r
+#define EAI_MAX         14\r
+\r
+/*\r
+ * Flag values for getaddrinfo()\r
+ */\r
+#ifdef AI_PASSIVE\r
+#undef AI_PASSIVE\r
+#undef AI_CANONNAME\r
+#undef AI_NUMERICHOST\r
+#undef AI_MASK\r
+#undef AI_ALL\r
+#undef AI_V4MAPPED_CFG\r
+#undef AI_ADDRCONFIG\r
+#undef AI_V4MAPPED\r
+#undef AI_DEFAULT\r
+#endif /* AI_PASSIVE */\r
+\r
+#define AI_PASSIVE      0x00000001 /* get address to use bind() */\r
+#define AI_CANONNAME    0x00000002 /* fill ai_canonname */\r
+#define AI_NUMERICHOST  0x00000004 /* prevent name resolution */\r
+/* valid flags for addrinfo */\r
+#define AI_MASK         (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST)\r
+\r
+#define AI_ALL          0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */\r
+#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */\r
+#define AI_ADDRCONFIG   0x00000400 /* only if any address is assigned */\r
+#define AI_V4MAPPED     0x00000800 /* accept IPv4-mapped IPv6 address */\r
+/* special recommended flags for getipnodebyname */\r
+#define AI_DEFAULT      (AI_V4MAPPED_CFG | AI_ADDRCONFIG)\r
+\r
+#endif /* !HAVE_GETADDRINFO */\r
+\r
+#ifndef HAVE_GETNAMEINFO\r
+\r
+/*\r
+ * Constants for getnameinfo()\r
+ */\r
+#ifndef NI_MAXHOST\r
+#define NI_MAXHOST      1025\r
+#define NI_MAXSERV      32\r
+#endif /* !NI_MAXHOST */\r
+\r
+/*\r
+ * Flag values for getnameinfo()\r
+ */\r
+#ifndef NI_NOFQDN\r
+#define NI_NOFQDN       0x00000001\r
+#define NI_NUMERICHOST  0x00000002\r
+#define NI_NAMEREQD     0x00000004\r
+#define NI_NUMERICSERV  0x00000008\r
+#define NI_DGRAM        0x00000010\r
+#endif /* !NI_NOFQDN */\r
+\r
+#endif /* !HAVE_GETNAMEINFO */\r
+\r
+#ifndef HAVE_ADDRINFO\r
+struct addrinfo {\r
+    int         ai_flags;       /* AI_PASSIVE, AI_CANONNAME */\r
+    int         ai_family;      /* PF_xxx */\r
+    int         ai_socktype;    /* SOCK_xxx */\r
+    int         ai_protocol;    /* 0 or IPPROTO_xxx for IPv4 and IPv6 */\r
+    size_t      ai_addrlen;     /* length of ai_addr */\r
+    char        *ai_canonname;  /* canonical name for hostname */\r
+    struct sockaddr *ai_addr;           /* binary address */\r
+    struct addrinfo *ai_next;           /* next structure in linked list */\r
+};\r
+#endif /* !HAVE_ADDRINFO */\r
+\r
+#ifndef HAVE_SOCKADDR_STORAGE\r
+/*\r
+ * RFC 2553: protocol-independent placeholder for socket addresses\r
+ */\r
+#define _SS_MAXSIZE     128\r
+#ifdef HAVE_LONG_LONG\r
+#define _SS_ALIGNSIZE   (sizeof(PY_LONG_LONG))\r
+#else\r
+#define _SS_ALIGNSIZE   (sizeof(double))\r
+#endif /* HAVE_LONG_LONG */\r
+#define _SS_PAD1SIZE    (_SS_ALIGNSIZE - sizeof(u_char) * 2)\r
+#define _SS_PAD2SIZE    (_SS_MAXSIZE - sizeof(u_char) * 2 - \\r
+                _SS_PAD1SIZE - _SS_ALIGNSIZE)\r
+\r
+struct sockaddr_storage {\r
+#ifdef HAVE_SOCKADDR_SA_LEN\r
+    unsigned char ss_len;               /* address length */\r
+    unsigned char ss_family;            /* address family */\r
+#else\r
+    unsigned short ss_family;           /* address family */\r
+#endif /* HAVE_SOCKADDR_SA_LEN */\r
+    char        __ss_pad1[_SS_PAD1SIZE];\r
+#ifdef HAVE_LONG_LONG\r
+    PY_LONG_LONG __ss_align;            /* force desired structure storage alignment */\r
+#else\r
+    double __ss_align;          /* force desired structure storage alignment */\r
+#endif /* HAVE_LONG_LONG */\r
+    char        __ss_pad2[_SS_PAD2SIZE];\r
+};\r
+#endif /* !HAVE_SOCKADDR_STORAGE */\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+extern void freehostent Py_PROTO((struct hostent *));\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/arraymodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/arraymodule.c
new file mode 100644 (file)
index 0000000..572b142
--- /dev/null
@@ -0,0 +1,2261 @@
+/* Array object implementation */\r
+\r
+/* An array is a uniform list -- all items have the same type.\r
+   The item type is restricted to simple C types like int or float */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+#ifdef STDC_HEADERS\r
+#include <stddef.h>\r
+#else /* !STDC_HEADERS */\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>          /* For size_t */\r
+#endif /* HAVE_SYS_TYPES_H */\r
+#endif /* !STDC_HEADERS */\r
+\r
+struct arrayobject; /* Forward */\r
+\r
+/* All possible arraydescr values are defined in the vector "descriptors"\r
+ * below.  That's defined later because the appropriate get and set\r
+ * functions aren't visible yet.\r
+ */\r
+struct arraydescr {\r
+    int typecode;\r
+    int itemsize;\r
+    PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);\r
+    int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);\r
+};\r
+\r
+typedef struct arrayobject {\r
+    PyObject_VAR_HEAD\r
+    char *ob_item;\r
+    Py_ssize_t allocated;\r
+    struct arraydescr *ob_descr;\r
+    PyObject *weakreflist; /* List of weak references */\r
+} arrayobject;\r
+\r
+static PyTypeObject Arraytype;\r
+\r
+#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)\r
+#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)\r
+\r
+static int\r
+array_resize(arrayobject *self, Py_ssize_t newsize)\r
+{\r
+    char *items;\r
+    size_t _new_size;\r
+\r
+    /* Bypass realloc() when a previous overallocation is large enough\r
+       to accommodate the newsize.  If the newsize is 16 smaller than the\r
+       current size, then proceed with the realloc() to shrink the list.\r
+    */\r
+\r
+    if (self->allocated >= newsize &&\r
+        Py_SIZE(self) < newsize + 16 &&\r
+        self->ob_item != NULL) {\r
+        Py_SIZE(self) = newsize;\r
+        return 0;\r
+    }\r
+\r
+    /* This over-allocates proportional to the array size, making room\r
+     * for additional growth.  The over-allocation is mild, but is\r
+     * enough to give linear-time amortized behavior over a long\r
+     * sequence of appends() in the presence of a poorly-performing\r
+     * system realloc().\r
+     * The growth pattern is:  0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...\r
+     * Note, the pattern starts out the same as for lists but then\r
+     * grows at a smaller rate so that larger arrays only overallocate\r
+     * by about 1/16th -- this is done because arrays are presumed to be more\r
+     * memory critical.\r
+     */\r
+\r
+    _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;\r
+    items = self->ob_item;\r
+    /* XXX The following multiplication and division does not optimize away\r
+       like it does for lists since the size is not known at compile time */\r
+    if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))\r
+        PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));\r
+    else\r
+        items = NULL;\r
+    if (items == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    self->ob_item = items;\r
+    Py_SIZE(self) = newsize;\r
+    self->allocated = _new_size;\r
+    return 0;\r
+}\r
+\r
+/****************************************************************************\r
+Get and Set functions for each type.\r
+A Get function takes an arrayobject* and an integer index, returning the\r
+array value at that index wrapped in an appropriate PyObject*.\r
+A Set function takes an arrayobject, integer index, and PyObject*; sets\r
+the array value at that index to the raw C data extracted from the PyObject*,\r
+and returns 0 if successful, else nonzero on failure (PyObject* not of an\r
+appropriate type or value).\r
+Note that the basic Get and Set functions do NOT check that the index is\r
+in bounds; that's the responsibility of the caller.\r
+****************************************************************************/\r
+\r
+static PyObject *\r
+c_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);\r
+}\r
+\r
+static int\r
+c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    char x;\r
+    if (!PyArg_Parse(v, "c;array item must be char", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+        ((char *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+b_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    long x = ((char *)ap->ob_item)[i];\r
+    if (x >= 128)\r
+        x -= 256;\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+static int\r
+b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    short x;\r
+    /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore\r
+       must use the next size up that is signed ('h') and manually do\r
+       the overflow checking */\r
+    if (!PyArg_Parse(v, "h;array item must be integer", &x))\r
+        return -1;\r
+    else if (x < -128) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "signed char is less than minimum");\r
+        return -1;\r
+    }\r
+    else if (x > 127) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "signed char is greater than maximum");\r
+        return -1;\r
+    }\r
+    if (i >= 0)\r
+        ((char *)ap->ob_item)[i] = (char)x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+BB_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    long x = ((unsigned char *)ap->ob_item)[i];\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+static int\r
+BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    unsigned char x;\r
+    /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */\r
+    if (!PyArg_Parse(v, "b;array item must be integer", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+        ((char *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+#ifdef Py_USING_UNICODE\r
+static PyObject *\r
+u_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);\r
+}\r
+\r
+static int\r
+u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    Py_UNICODE *p;\r
+    Py_ssize_t len;\r
+\r
+    if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))\r
+        return -1;\r
+    if (len != 1) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "array item must be unicode character");\r
+        return -1;\r
+    }\r
+    if (i >= 0)\r
+        ((Py_UNICODE *)ap->ob_item)[i] = p[0];\r
+    return 0;\r
+}\r
+#endif\r
+\r
+static PyObject *\r
+h_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    short x;\r
+    /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */\r
+    if (!PyArg_Parse(v, "h;array item must be integer", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+                 ((short *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+HH_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    int x;\r
+    /* PyArg_Parse's 'h' formatter is for a signed short, therefore\r
+       must use the next size up and manually do the overflow checking */\r
+    if (!PyArg_Parse(v, "i;array item must be integer", &x))\r
+        return -1;\r
+    else if (x < 0) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "unsigned short is less than minimum");\r
+        return -1;\r
+    }\r
+    else if (x > USHRT_MAX) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "unsigned short is greater than maximum");\r
+        return -1;\r
+    }\r
+    if (i >= 0)\r
+        ((short *)ap->ob_item)[i] = (short)x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+i_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    int x;\r
+    /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */\r
+    if (!PyArg_Parse(v, "i;array item must be integer", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+                 ((int *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+II_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyLong_FromUnsignedLong(\r
+        (unsigned long) ((unsigned int *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    unsigned long x;\r
+    if (PyLong_Check(v)) {\r
+        x = PyLong_AsUnsignedLong(v);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return -1;\r
+    }\r
+    else {\r
+        long y;\r
+        if (!PyArg_Parse(v, "l;array item must be integer", &y))\r
+            return -1;\r
+        if (y < 0) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                "unsigned int is less than minimum");\r
+            return -1;\r
+        }\r
+        x = (unsigned long)y;\r
+\r
+    }\r
+    if (x > UINT_MAX) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "unsigned int is greater than maximum");\r
+        return -1;\r
+    }\r
+\r
+    if (i >= 0)\r
+        ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+l_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyInt_FromLong(((long *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    long x;\r
+    if (!PyArg_Parse(v, "l;array item must be integer", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+                 ((long *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+LL_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    unsigned long x;\r
+    if (PyLong_Check(v)) {\r
+        x = PyLong_AsUnsignedLong(v);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return -1;\r
+    }\r
+    else {\r
+        long y;\r
+        if (!PyArg_Parse(v, "l;array item must be integer", &y))\r
+            return -1;\r
+        if (y < 0) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                "unsigned long is less than minimum");\r
+            return -1;\r
+        }\r
+        x = (unsigned long)y;\r
+\r
+    }\r
+    if (x > ULONG_MAX) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "unsigned long is greater than maximum");\r
+        return -1;\r
+    }\r
+\r
+    if (i >= 0)\r
+        ((unsigned long *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+f_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    float x;\r
+    if (!PyArg_Parse(v, "f;array item must be float", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+                 ((float *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+d_getitem(arrayobject *ap, Py_ssize_t i)\r
+{\r
+    return PyFloat_FromDouble(((double *)ap->ob_item)[i]);\r
+}\r
+\r
+static int\r
+d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)\r
+{\r
+    double x;\r
+    if (!PyArg_Parse(v, "d;array item must be float", &x))\r
+        return -1;\r
+    if (i >= 0)\r
+                 ((double *)ap->ob_item)[i] = x;\r
+    return 0;\r
+}\r
+\r
+/* Description of types */\r
+static struct arraydescr descriptors[] = {\r
+    {'c', sizeof(char), c_getitem, c_setitem},\r
+    {'b', sizeof(char), b_getitem, b_setitem},\r
+    {'B', sizeof(char), BB_getitem, BB_setitem},\r
+#ifdef Py_USING_UNICODE\r
+    {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},\r
+#endif\r
+    {'h', sizeof(short), h_getitem, h_setitem},\r
+    {'H', sizeof(short), HH_getitem, HH_setitem},\r
+    {'i', sizeof(int), i_getitem, i_setitem},\r
+    {'I', sizeof(int), II_getitem, II_setitem},\r
+    {'l', sizeof(long), l_getitem, l_setitem},\r
+    {'L', sizeof(long), LL_getitem, LL_setitem},\r
+    {'f', sizeof(float), f_getitem, f_setitem},\r
+    {'d', sizeof(double), d_getitem, d_setitem},\r
+    {'\0', 0, 0, 0} /* Sentinel */\r
+};\r
+\r
+/****************************************************************************\r
+Implementations of array object methods.\r
+****************************************************************************/\r
+\r
+static PyObject *\r
+newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)\r
+{\r
+    arrayobject *op;\r
+    size_t nbytes;\r
+\r
+    if (size < 0) {\r
+        PyErr_BadInternalCall();\r
+        return NULL;\r
+    }\r
+\r
+    nbytes = size * descr->itemsize;\r
+    /* Check for overflow */\r
+    if (nbytes / descr->itemsize != (size_t)size) {\r
+        return PyErr_NoMemory();\r
+    }\r
+    op = (arrayobject *) type->tp_alloc(type, 0);\r
+    if (op == NULL) {\r
+        return NULL;\r
+    }\r
+    op->ob_descr = descr;\r
+    op->allocated = size;\r
+    op->weakreflist = NULL;\r
+    Py_SIZE(op) = size;\r
+    if (size <= 0) {\r
+        op->ob_item = NULL;\r
+    }\r
+    else {\r
+        op->ob_item = PyMem_NEW(char, nbytes);\r
+        if (op->ob_item == NULL) {\r
+            Py_DECREF(op);\r
+            return PyErr_NoMemory();\r
+        }\r
+    }\r
+    return (PyObject *) op;\r
+}\r
+\r
+static PyObject *\r
+getarrayitem(PyObject *op, Py_ssize_t i)\r
+{\r
+    register arrayobject *ap;\r
+    assert(array_Check(op));\r
+    ap = (arrayobject *)op;\r
+    assert(i>=0 && i<Py_SIZE(ap));\r
+    return (*ap->ob_descr->getitem)(ap, i);\r
+}\r
+\r
+static int\r
+ins1(arrayobject *self, Py_ssize_t where, PyObject *v)\r
+{\r
+    char *items;\r
+    Py_ssize_t n = Py_SIZE(self);\r
+    if (v == NULL) {\r
+        PyErr_BadInternalCall();\r
+        return -1;\r
+    }\r
+    if ((*self->ob_descr->setitem)(self, -1, v) < 0)\r
+        return -1;\r
+\r
+    if (array_resize(self, n+1) == -1)\r
+        return -1;\r
+    items = self->ob_item;\r
+    if (where < 0) {\r
+        where += n;\r
+        if (where < 0)\r
+            where = 0;\r
+    }\r
+    if (where > n)\r
+        where = n;\r
+    /* appends don't need to call memmove() */\r
+    if (where != n)\r
+        memmove(items + (where+1)*self->ob_descr->itemsize,\r
+            items + where*self->ob_descr->itemsize,\r
+            (n-where)*self->ob_descr->itemsize);\r
+    return (*self->ob_descr->setitem)(self, where, v);\r
+}\r
+\r
+/* Methods */\r
+\r
+static void\r
+array_dealloc(arrayobject *op)\r
+{\r
+    if (op->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) op);\r
+    if (op->ob_item != NULL)\r
+        PyMem_DEL(op->ob_item);\r
+    Py_TYPE(op)->tp_free((PyObject *)op);\r
+}\r
+\r
+static PyObject *\r
+array_richcompare(PyObject *v, PyObject *w, int op)\r
+{\r
+    arrayobject *va, *wa;\r
+    PyObject *vi = NULL;\r
+    PyObject *wi = NULL;\r
+    Py_ssize_t i, k;\r
+    PyObject *res;\r
+\r
+    if (!array_Check(v) || !array_Check(w)) {\r
+        Py_INCREF(Py_NotImplemented);\r
+        return Py_NotImplemented;\r
+    }\r
+\r
+    va = (arrayobject *)v;\r
+    wa = (arrayobject *)w;\r
+\r
+    if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {\r
+        /* Shortcut: if the lengths differ, the arrays differ */\r
+        if (op == Py_EQ)\r
+            res = Py_False;\r
+        else\r
+            res = Py_True;\r
+        Py_INCREF(res);\r
+        return res;\r
+    }\r
+\r
+    /* Search for the first index where items are different */\r
+    k = 1;\r
+    for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {\r
+        vi = getarrayitem(v, i);\r
+        wi = getarrayitem(w, i);\r
+        if (vi == NULL || wi == NULL) {\r
+            Py_XDECREF(vi);\r
+            Py_XDECREF(wi);\r
+            return NULL;\r
+        }\r
+        k = PyObject_RichCompareBool(vi, wi, Py_EQ);\r
+        if (k == 0)\r
+            break; /* Keeping vi and wi alive! */\r
+        Py_DECREF(vi);\r
+        Py_DECREF(wi);\r
+        if (k < 0)\r
+            return NULL;\r
+    }\r
+\r
+    if (k) {\r
+        /* No more items to compare -- compare sizes */\r
+        Py_ssize_t vs = Py_SIZE(va);\r
+        Py_ssize_t ws = Py_SIZE(wa);\r
+        int cmp;\r
+        switch (op) {\r
+        case Py_LT: cmp = vs <  ws; break;\r
+        case Py_LE: cmp = vs <= ws; break;\r
+        case Py_EQ: cmp = vs == ws; break;\r
+        case Py_NE: cmp = vs != ws; break;\r
+        case Py_GT: cmp = vs >  ws; break;\r
+        case Py_GE: cmp = vs >= ws; break;\r
+        default: return NULL; /* cannot happen */\r
+        }\r
+        if (cmp)\r
+            res = Py_True;\r
+        else\r
+            res = Py_False;\r
+        Py_INCREF(res);\r
+        return res;\r
+    }\r
+\r
+    /* We have an item that differs.  First, shortcuts for EQ/NE */\r
+    if (op == Py_EQ) {\r
+        Py_INCREF(Py_False);\r
+        res = Py_False;\r
+    }\r
+    else if (op == Py_NE) {\r
+        Py_INCREF(Py_True);\r
+        res = Py_True;\r
+    }\r
+    else {\r
+        /* Compare the final item again using the proper operator */\r
+        res = PyObject_RichCompare(vi, wi, op);\r
+    }\r
+    Py_DECREF(vi);\r
+    Py_DECREF(wi);\r
+    return res;\r
+}\r
+\r
+static Py_ssize_t\r
+array_length(arrayobject *a)\r
+{\r
+    return Py_SIZE(a);\r
+}\r
+\r
+static PyObject *\r
+array_item(arrayobject *a, Py_ssize_t i)\r
+{\r
+    if (i < 0 || i >= Py_SIZE(a)) {\r
+        PyErr_SetString(PyExc_IndexError, "array index out of range");\r
+        return NULL;\r
+    }\r
+    return getarrayitem((PyObject *)a, i);\r
+}\r
+\r
+static PyObject *\r
+array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)\r
+{\r
+    arrayobject *np;\r
+    if (ilow < 0)\r
+        ilow = 0;\r
+    else if (ilow > Py_SIZE(a))\r
+        ilow = Py_SIZE(a);\r
+    if (ihigh < 0)\r
+        ihigh = 0;\r
+    if (ihigh < ilow)\r
+        ihigh = ilow;\r
+    else if (ihigh > Py_SIZE(a))\r
+        ihigh = Py_SIZE(a);\r
+    np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);\r
+    if (np == NULL)\r
+        return NULL;\r
+    memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,\r
+           (ihigh-ilow) * a->ob_descr->itemsize);\r
+    return (PyObject *)np;\r
+}\r
+\r
+static PyObject *\r
+array_copy(arrayobject *a, PyObject *unused)\r
+{\r
+    return array_slice(a, 0, Py_SIZE(a));\r
+}\r
+\r
+PyDoc_STRVAR(copy_doc,\r
+"copy(array)\n\\r
+\n\\r
+ Return a copy of the array.");\r
+\r
+static PyObject *\r
+array_concat(arrayobject *a, PyObject *bb)\r
+{\r
+    Py_ssize_t size;\r
+    arrayobject *np;\r
+    if (!array_Check(bb)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+             "can only append array (not \"%.200s\") to array",\r
+                 Py_TYPE(bb)->tp_name);\r
+        return NULL;\r
+    }\r
+#define b ((arrayobject *)bb)\r
+    if (a->ob_descr != b->ob_descr) {\r
+        PyErr_BadArgument();\r
+        return NULL;\r
+    }\r
+    if (Py_SIZE(a) > PY_SSIZE_T_MAX - Py_SIZE(b)) {\r
+        return PyErr_NoMemory();\r
+    }\r
+    size = Py_SIZE(a) + Py_SIZE(b);\r
+    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);\r
+    if (np == NULL) {\r
+        return NULL;\r
+    }\r
+    memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);\r
+    memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,\r
+           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);\r
+    return (PyObject *)np;\r
+#undef b\r
+}\r
+\r
+static PyObject *\r
+array_repeat(arrayobject *a, Py_ssize_t n)\r
+{\r
+    Py_ssize_t i;\r
+    Py_ssize_t size;\r
+    arrayobject *np;\r
+    char *p;\r
+    Py_ssize_t nbytes;\r
+    if (n < 0)\r
+        n = 0;\r
+    if ((Py_SIZE(a) != 0) && (n > PY_SSIZE_T_MAX / Py_SIZE(a))) {\r
+        return PyErr_NoMemory();\r
+    }\r
+    size = Py_SIZE(a) * n;\r
+    np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);\r
+    if (np == NULL)\r
+        return NULL;\r
+    p = np->ob_item;\r
+    nbytes = Py_SIZE(a) * a->ob_descr->itemsize;\r
+    for (i = 0; i < n; i++) {\r
+        memcpy(p, a->ob_item, nbytes);\r
+        p += nbytes;\r
+    }\r
+    return (PyObject *) np;\r
+}\r
+\r
+static int\r
+array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)\r
+{\r
+    char *item;\r
+    Py_ssize_t n; /* Size of replacement array */\r
+    Py_ssize_t d; /* Change in size */\r
+#define b ((arrayobject *)v)\r
+    if (v == NULL)\r
+        n = 0;\r
+    else if (array_Check(v)) {\r
+        n = Py_SIZE(b);\r
+        if (a == b) {\r
+            /* Special case "a[i:j] = a" -- copy b first */\r
+            int ret;\r
+            v = array_slice(b, 0, n);\r
+            if (!v)\r
+                return -1;\r
+            ret = array_ass_slice(a, ilow, ihigh, v);\r
+            Py_DECREF(v);\r
+            return ret;\r
+        }\r
+        if (b->ob_descr != a->ob_descr) {\r
+            PyErr_BadArgument();\r
+            return -1;\r
+        }\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+         "can only assign array (not \"%.200s\") to array slice",\r
+                         Py_TYPE(v)->tp_name);\r
+        return -1;\r
+    }\r
+    if (ilow < 0)\r
+        ilow = 0;\r
+    else if (ilow > Py_SIZE(a))\r
+        ilow = Py_SIZE(a);\r
+    if (ihigh < 0)\r
+        ihigh = 0;\r
+    if (ihigh < ilow)\r
+        ihigh = ilow;\r
+    else if (ihigh > Py_SIZE(a))\r
+        ihigh = Py_SIZE(a);\r
+    item = a->ob_item;\r
+    d = n - (ihigh-ilow);\r
+    if (d < 0) { /* Delete -d items */\r
+        memmove(item + (ihigh+d)*a->ob_descr->itemsize,\r
+            item + ihigh*a->ob_descr->itemsize,\r
+            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);\r
+        Py_SIZE(a) += d;\r
+        PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);\r
+                                        /* Can't fail */\r
+        a->ob_item = item;\r
+        a->allocated = Py_SIZE(a);\r
+    }\r
+    else if (d > 0) { /* Insert d items */\r
+        PyMem_RESIZE(item, char,\r
+                     (Py_SIZE(a) + d)*a->ob_descr->itemsize);\r
+        if (item == NULL) {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        memmove(item + (ihigh+d)*a->ob_descr->itemsize,\r
+            item + ihigh*a->ob_descr->itemsize,\r
+            (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);\r
+        a->ob_item = item;\r
+        Py_SIZE(a) += d;\r
+        a->allocated = Py_SIZE(a);\r
+    }\r
+    if (n > 0)\r
+        memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,\r
+               n*b->ob_descr->itemsize);\r
+    return 0;\r
+#undef b\r
+}\r
+\r
+static int\r
+array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)\r
+{\r
+    if (i < 0 || i >= Py_SIZE(a)) {\r
+        PyErr_SetString(PyExc_IndexError,\r
+                         "array assignment index out of range");\r
+        return -1;\r
+    }\r
+    if (v == NULL)\r
+        return array_ass_slice(a, i, i+1, v);\r
+    return (*a->ob_descr->setitem)(a, i, v);\r
+}\r
+\r
+static int\r
+setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)\r
+{\r
+    assert(array_Check(a));\r
+    return array_ass_item((arrayobject *)a, i, v);\r
+}\r
+\r
+static int\r
+array_iter_extend(arrayobject *self, PyObject *bb)\r
+{\r
+    PyObject *it, *v;\r
+\r
+    it = PyObject_GetIter(bb);\r
+    if (it == NULL)\r
+        return -1;\r
+\r
+    while ((v = PyIter_Next(it)) != NULL) {\r
+        if (ins1(self, Py_SIZE(self), v) != 0) {\r
+            Py_DECREF(v);\r
+            Py_DECREF(it);\r
+            return -1;\r
+        }\r
+        Py_DECREF(v);\r
+    }\r
+    Py_DECREF(it);\r
+    if (PyErr_Occurred())\r
+        return -1;\r
+    return 0;\r
+}\r
+\r
+static int\r
+array_do_extend(arrayobject *self, PyObject *bb)\r
+{\r
+    Py_ssize_t size;\r
+    char *old_item;\r
+\r
+    if (!array_Check(bb))\r
+        return array_iter_extend(self, bb);\r
+#define b ((arrayobject *)bb)\r
+    if (self->ob_descr != b->ob_descr) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                     "can only extend with array of same kind");\r
+        return -1;\r
+    }\r
+    if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||\r
+        ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    size = Py_SIZE(self) + Py_SIZE(b);\r
+    old_item = self->ob_item;\r
+    PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);\r
+    if (self->ob_item == NULL) {\r
+        self->ob_item = old_item;\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+    memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,\r
+           b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);\r
+    Py_SIZE(self) = size;\r
+    self->allocated = size;\r
+\r
+    return 0;\r
+#undef b\r
+}\r
+\r
+static PyObject *\r
+array_inplace_concat(arrayobject *self, PyObject *bb)\r
+{\r
+    if (!array_Check(bb)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+            "can only extend array with array (not \"%.200s\")",\r
+            Py_TYPE(bb)->tp_name);\r
+        return NULL;\r
+    }\r
+    if (array_do_extend(self, bb) == -1)\r
+        return NULL;\r
+    Py_INCREF(self);\r
+    return (PyObject *)self;\r
+}\r
+\r
+static PyObject *\r
+array_inplace_repeat(arrayobject *self, Py_ssize_t n)\r
+{\r
+    char *items, *p;\r
+    Py_ssize_t size, i;\r
+\r
+    if (Py_SIZE(self) > 0) {\r
+        if (n < 0)\r
+            n = 0;\r
+        items = self->ob_item;\r
+        if ((self->ob_descr->itemsize != 0) &&\r
+            (Py_SIZE(self) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {\r
+            return PyErr_NoMemory();\r
+        }\r
+        size = Py_SIZE(self) * self->ob_descr->itemsize;\r
+        if (n == 0) {\r
+            PyMem_FREE(items);\r
+            self->ob_item = NULL;\r
+            Py_SIZE(self) = 0;\r
+            self->allocated = 0;\r
+        }\r
+        else {\r
+            if (size > PY_SSIZE_T_MAX / n) {\r
+                return PyErr_NoMemory();\r
+            }\r
+            PyMem_RESIZE(items, char, n * size);\r
+            if (items == NULL)\r
+                return PyErr_NoMemory();\r
+            p = items;\r
+            for (i = 1; i < n; i++) {\r
+                p += size;\r
+                memcpy(p, items, size);\r
+            }\r
+            self->ob_item = items;\r
+            Py_SIZE(self) *= n;\r
+            self->allocated = Py_SIZE(self);\r
+        }\r
+    }\r
+    Py_INCREF(self);\r
+    return (PyObject *)self;\r
+}\r
+\r
+\r
+static PyObject *\r
+ins(arrayobject *self, Py_ssize_t where, PyObject *v)\r
+{\r
+    if (ins1(self, where, v) != 0)\r
+        return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+array_count(arrayobject *self, PyObject *v)\r
+{\r
+    Py_ssize_t count = 0;\r
+    Py_ssize_t i;\r
+\r
+    for (i = 0; i < Py_SIZE(self); i++) {\r
+        PyObject *selfi = getarrayitem((PyObject *)self, i);\r
+        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);\r
+        Py_DECREF(selfi);\r
+        if (cmp > 0)\r
+            count++;\r
+        else if (cmp < 0)\r
+            return NULL;\r
+    }\r
+    return PyInt_FromSsize_t(count);\r
+}\r
+\r
+PyDoc_STRVAR(count_doc,\r
+"count(x)\n\\r
+\n\\r
+Return number of occurrences of x in the array.");\r
+\r
+static PyObject *\r
+array_index(arrayobject *self, PyObject *v)\r
+{\r
+    Py_ssize_t i;\r
+\r
+    for (i = 0; i < Py_SIZE(self); i++) {\r
+        PyObject *selfi = getarrayitem((PyObject *)self, i);\r
+        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);\r
+        Py_DECREF(selfi);\r
+        if (cmp > 0) {\r
+            return PyInt_FromLong((long)i);\r
+        }\r
+        else if (cmp < 0)\r
+            return NULL;\r
+    }\r
+    PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(index_doc,\r
+"index(x)\n\\r
+\n\\r
+Return index of first occurrence of x in the array.");\r
+\r
+static int\r
+array_contains(arrayobject *self, PyObject *v)\r
+{\r
+    Py_ssize_t i;\r
+    int cmp;\r
+\r
+    for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {\r
+        PyObject *selfi = getarrayitem((PyObject *)self, i);\r
+        cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);\r
+        Py_DECREF(selfi);\r
+    }\r
+    return cmp;\r
+}\r
+\r
+static PyObject *\r
+array_remove(arrayobject *self, PyObject *v)\r
+{\r
+    int i;\r
+\r
+    for (i = 0; i < Py_SIZE(self); i++) {\r
+        PyObject *selfi = getarrayitem((PyObject *)self,i);\r
+        int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);\r
+        Py_DECREF(selfi);\r
+        if (cmp > 0) {\r
+            if (array_ass_slice(self, i, i+1,\r
+                               (PyObject *)NULL) != 0)\r
+                return NULL;\r
+            Py_INCREF(Py_None);\r
+            return Py_None;\r
+        }\r
+        else if (cmp < 0)\r
+            return NULL;\r
+    }\r
+    PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(remove_doc,\r
+"remove(x)\n\\r
+\n\\r
+Remove the first occurrence of x in the array.");\r
+\r
+static PyObject *\r
+array_pop(arrayobject *self, PyObject *args)\r
+{\r
+    Py_ssize_t i = -1;\r
+    PyObject *v;\r
+    if (!PyArg_ParseTuple(args, "|n:pop", &i))\r
+        return NULL;\r
+    if (Py_SIZE(self) == 0) {\r
+        /* Special-case most common failure cause */\r
+        PyErr_SetString(PyExc_IndexError, "pop from empty array");\r
+        return NULL;\r
+    }\r
+    if (i < 0)\r
+        i += Py_SIZE(self);\r
+    if (i < 0 || i >= Py_SIZE(self)) {\r
+        PyErr_SetString(PyExc_IndexError, "pop index out of range");\r
+        return NULL;\r
+    }\r
+    v = getarrayitem((PyObject *)self,i);\r
+    if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {\r
+        Py_DECREF(v);\r
+        return NULL;\r
+    }\r
+    return v;\r
+}\r
+\r
+PyDoc_STRVAR(pop_doc,\r
+"pop([i])\n\\r
+\n\\r
+Return the i-th element and delete it from the array. i defaults to -1.");\r
+\r
+static PyObject *\r
+array_extend(arrayobject *self, PyObject *bb)\r
+{\r
+    if (array_do_extend(self, bb) == -1)\r
+        return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(extend_doc,\r
+"extend(array or iterable)\n\\r
+\n\\r
+ Append items to the end of the array.");\r
+\r
+static PyObject *\r
+array_insert(arrayobject *self, PyObject *args)\r
+{\r
+    Py_ssize_t i;\r
+    PyObject *v;\r
+    if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))\r
+        return NULL;\r
+    return ins(self, i, v);\r
+}\r
+\r
+PyDoc_STRVAR(insert_doc,\r
+"insert(i,x)\n\\r
+\n\\r
+Insert a new item x into the array before position i.");\r
+\r
+\r
+static PyObject *\r
+array_buffer_info(arrayobject *self, PyObject *unused)\r
+{\r
+    PyObject* retval = NULL;\r
+    retval = PyTuple_New(2);\r
+    if (!retval)\r
+        return NULL;\r
+\r
+    PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));\r
+    PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(Py_SIZE(self))));\r
+\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(buffer_info_doc,\r
+"buffer_info() -> (address, length)\n\\r
+\n\\r
+Return a tuple (address, length) giving the current memory address and\n\\r
+the length in items of the buffer used to hold array's contents\n\\r
+The length should be multiplied by the itemsize attribute to calculate\n\\r
+the buffer length in bytes.");\r
+\r
+\r
+static PyObject *\r
+array_append(arrayobject *self, PyObject *v)\r
+{\r
+    return ins(self, Py_SIZE(self), v);\r
+}\r
+\r
+PyDoc_STRVAR(append_doc,\r
+"append(x)\n\\r
+\n\\r
+Append new value x to the end of the array.");\r
+\r
+\r
+static PyObject *\r
+array_byteswap(arrayobject *self, PyObject *unused)\r
+{\r
+    char *p;\r
+    Py_ssize_t i;\r
+\r
+    switch (self->ob_descr->itemsize) {\r
+    case 1:\r
+        break;\r
+    case 2:\r
+        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {\r
+            char p0 = p[0];\r
+            p[0] = p[1];\r
+            p[1] = p0;\r
+        }\r
+        break;\r
+    case 4:\r
+        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {\r
+            char p0 = p[0];\r
+            char p1 = p[1];\r
+            p[0] = p[3];\r
+            p[1] = p[2];\r
+            p[2] = p1;\r
+            p[3] = p0;\r
+        }\r
+        break;\r
+    case 8:\r
+        for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {\r
+            char p0 = p[0];\r
+            char p1 = p[1];\r
+            char p2 = p[2];\r
+            char p3 = p[3];\r
+            p[0] = p[7];\r
+            p[1] = p[6];\r
+            p[2] = p[5];\r
+            p[3] = p[4];\r
+            p[4] = p3;\r
+            p[5] = p2;\r
+            p[6] = p1;\r
+            p[7] = p0;\r
+        }\r
+        break;\r
+    default:\r
+        PyErr_SetString(PyExc_RuntimeError,\r
+                   "don't know how to byteswap this array type");\r
+        return NULL;\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(byteswap_doc,\r
+"byteswap()\n\\r
+\n\\r
+Byteswap all items of the array.  If the items in the array are not 1, 2,\n\\r
+4, or 8 bytes in size, RuntimeError is raised.");\r
+\r
+static PyObject *\r
+array_reverse(arrayobject *self, PyObject *unused)\r
+{\r
+    register Py_ssize_t itemsize = self->ob_descr->itemsize;\r
+    register char *p, *q;\r
+    /* little buffer to hold items while swapping */\r
+    char tmp[256];      /* 8 is probably enough -- but why skimp */\r
+    assert((size_t)itemsize <= sizeof(tmp));\r
+\r
+    if (Py_SIZE(self) > 1) {\r
+        for (p = self->ob_item,\r
+             q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;\r
+             p < q;\r
+             p += itemsize, q -= itemsize) {\r
+            /* memory areas guaranteed disjoint, so memcpy\r
+             * is safe (& memmove may be slower).\r
+             */\r
+            memcpy(tmp, p, itemsize);\r
+            memcpy(p, q, itemsize);\r
+            memcpy(q, tmp, itemsize);\r
+        }\r
+    }\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(reverse_doc,\r
+"reverse()\n\\r
+\n\\r
+Reverse the order of the items in the array.");\r
+\r
+static PyObject *\r
+array_fromfile(arrayobject *self, PyObject *args)\r
+{\r
+    PyObject *f;\r
+    Py_ssize_t n;\r
+    FILE *fp;\r
+    if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))\r
+        return NULL;\r
+    fp = PyFile_AsFile(f);\r
+    if (fp == NULL) {\r
+        PyErr_SetString(PyExc_TypeError, "arg1 must be open file");\r
+        return NULL;\r
+    }\r
+    if (n > 0) {\r
+        char *item = self->ob_item;\r
+        Py_ssize_t itemsize = self->ob_descr->itemsize;\r
+        size_t nread;\r
+        Py_ssize_t newlength;\r
+        size_t newbytes;\r
+        /* Be careful here about overflow */\r
+        if ((newlength = Py_SIZE(self) + n) <= 0 ||\r
+            (newbytes = newlength * itemsize) / itemsize !=\r
+            (size_t)newlength)\r
+            goto nomem;\r
+        PyMem_RESIZE(item, char, newbytes);\r
+        if (item == NULL) {\r
+          nomem:\r
+            PyErr_NoMemory();\r
+            return NULL;\r
+        }\r
+        self->ob_item = item;\r
+        Py_SIZE(self) += n;\r
+        self->allocated = Py_SIZE(self);\r
+        nread = fread(item + (Py_SIZE(self) - n) * itemsize,\r
+                      itemsize, n, fp);\r
+        if (nread < (size_t)n) {\r
+          Py_SIZE(self) -= (n - nread);\r
+            PyMem_RESIZE(item, char, Py_SIZE(self)*itemsize);\r
+            self->ob_item = item;\r
+            self->allocated = Py_SIZE(self);\r
+            if (ferror(fp)) {\r
+                PyErr_SetFromErrno(PyExc_IOError);\r
+                clearerr(fp);\r
+            }\r
+            else {\r
+                PyErr_SetString(PyExc_EOFError,\r
+                                "not enough items in file");\r
+            }\r
+            return NULL;\r
+        }\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(fromfile_doc,\r
+"fromfile(f, n)\n\\r
+\n\\r
+Read n objects from the file object f and append them to the end of the\n\\r
+array.  Also called as read.");\r
+\r
+\r
+static PyObject *\r
+array_fromfile_as_read(arrayobject *self, PyObject *args)\r
+{\r
+    if (PyErr_WarnPy3k("array.read() not supported in 3.x; "\r
+                       "use array.fromfile()", 1) < 0)\r
+        return NULL;\r
+    return array_fromfile(self, args);\r
+}\r
+\r
+\r
+static PyObject *\r
+array_tofile(arrayobject *self, PyObject *f)\r
+{\r
+    FILE *fp;\r
+\r
+    fp = PyFile_AsFile(f);\r
+    if (fp == NULL) {\r
+        PyErr_SetString(PyExc_TypeError, "arg must be open file");\r
+        return NULL;\r
+    }\r
+    if (self->ob_size > 0) {\r
+        if (fwrite(self->ob_item, self->ob_descr->itemsize,\r
+                   self->ob_size, fp) != (size_t)self->ob_size) {\r
+            PyErr_SetFromErrno(PyExc_IOError);\r
+            clearerr(fp);\r
+            return NULL;\r
+        }\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(tofile_doc,\r
+"tofile(f)\n\\r
+\n\\r
+Write all items (as machine values) to the file object f.  Also called as\n\\r
+write.");\r
+\r
+\r
+static PyObject *\r
+array_tofile_as_write(arrayobject *self, PyObject *f)\r
+{\r
+    if (PyErr_WarnPy3k("array.write() not supported in 3.x; "\r
+                       "use array.tofile()", 1) < 0)\r
+        return NULL;\r
+    return array_tofile(self, f);\r
+}\r
+\r
+\r
+static PyObject *\r
+array_fromlist(arrayobject *self, PyObject *list)\r
+{\r
+    Py_ssize_t n;\r
+    Py_ssize_t itemsize = self->ob_descr->itemsize;\r
+\r
+    if (!PyList_Check(list)) {\r
+        PyErr_SetString(PyExc_TypeError, "arg must be list");\r
+        return NULL;\r
+    }\r
+    n = PyList_Size(list);\r
+    if (n > 0) {\r
+        char *item = self->ob_item;\r
+        Py_ssize_t i;\r
+        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);\r
+        if (item == NULL) {\r
+            PyErr_NoMemory();\r
+            return NULL;\r
+        }\r
+        self->ob_item = item;\r
+        Py_SIZE(self) += n;\r
+        self->allocated = Py_SIZE(self);\r
+        for (i = 0; i < n; i++) {\r
+            PyObject *v = PyList_GetItem(list, i);\r
+            if ((*self->ob_descr->setitem)(self,\r
+                            Py_SIZE(self) - n + i, v) != 0) {\r
+                Py_SIZE(self) -= n;\r
+                if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {\r
+                    return PyErr_NoMemory();\r
+                }\r
+                PyMem_RESIZE(item, char,\r
+                                  Py_SIZE(self) * itemsize);\r
+                self->ob_item = item;\r
+                self->allocated = Py_SIZE(self);\r
+                return NULL;\r
+            }\r
+        }\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(fromlist_doc,\r
+"fromlist(list)\n\\r
+\n\\r
+Append items to array from list.");\r
+\r
+\r
+static PyObject *\r
+array_tolist(arrayobject *self, PyObject *unused)\r
+{\r
+    PyObject *list = PyList_New(Py_SIZE(self));\r
+    Py_ssize_t i;\r
+\r
+    if (list == NULL)\r
+        return NULL;\r
+    for (i = 0; i < Py_SIZE(self); i++) {\r
+        PyObject *v = getarrayitem((PyObject *)self, i);\r
+        if (v == NULL) {\r
+            Py_DECREF(list);\r
+            return NULL;\r
+        }\r
+        PyList_SetItem(list, i, v);\r
+    }\r
+    return list;\r
+}\r
+\r
+PyDoc_STRVAR(tolist_doc,\r
+"tolist() -> list\n\\r
+\n\\r
+Convert array to an ordinary list with the same items.");\r
+\r
+\r
+static PyObject *\r
+array_fromstring(arrayobject *self, PyObject *args)\r
+{\r
+    char *str;\r
+    Py_ssize_t n;\r
+    int itemsize = self->ob_descr->itemsize;\r
+    if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))\r
+        return NULL;\r
+    if (n % itemsize != 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                   "string length not a multiple of item size");\r
+        return NULL;\r
+    }\r
+    n = n / itemsize;\r
+    if (n > 0) {\r
+        char *item = self->ob_item;\r
+        if ((n > PY_SSIZE_T_MAX - Py_SIZE(self)) ||\r
+            ((Py_SIZE(self) + n) > PY_SSIZE_T_MAX / itemsize)) {\r
+                return PyErr_NoMemory();\r
+        }\r
+        PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);\r
+        if (item == NULL) {\r
+            PyErr_NoMemory();\r
+            return NULL;\r
+        }\r
+        self->ob_item = item;\r
+        Py_SIZE(self) += n;\r
+        self->allocated = Py_SIZE(self);\r
+        memcpy(item + (Py_SIZE(self) - n) * itemsize,\r
+               str, itemsize*n);\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(fromstring_doc,\r
+"fromstring(string)\n\\r
+\n\\r
+Appends items from the string, interpreting it as an array of machine\n\\r
+values,as if it had been read from a file using the fromfile() method).");\r
+\r
+\r
+static PyObject *\r
+array_tostring(arrayobject *self, PyObject *unused)\r
+{\r
+    if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {\r
+        return PyString_FromStringAndSize(self->ob_item,\r
+                            Py_SIZE(self) * self->ob_descr->itemsize);\r
+    } else {\r
+        return PyErr_NoMemory();\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(tostring_doc,\r
+"tostring() -> string\n\\r
+\n\\r
+Convert the array to an array of machine values and return the string\n\\r
+representation.");\r
+\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+static PyObject *\r
+array_fromunicode(arrayobject *self, PyObject *args)\r
+{\r
+    Py_UNICODE *ustr;\r
+    Py_ssize_t n;\r
+\r
+    if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))\r
+        return NULL;\r
+    if (self->ob_descr->typecode != 'u') {\r
+        PyErr_SetString(PyExc_ValueError,\r
+            "fromunicode() may only be called on "\r
+            "type 'u' arrays");\r
+        return NULL;\r
+    }\r
+    if (n > 0) {\r
+        Py_UNICODE *item = (Py_UNICODE *) self->ob_item;\r
+        if (Py_SIZE(self) > PY_SSIZE_T_MAX - n) {\r
+            return PyErr_NoMemory();\r
+        }\r
+        PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);\r
+        if (item == NULL) {\r
+            PyErr_NoMemory();\r
+            return NULL;\r
+        }\r
+        self->ob_item = (char *) item;\r
+        Py_SIZE(self) += n;\r
+        self->allocated = Py_SIZE(self);\r
+        memcpy(item + Py_SIZE(self) - n,\r
+               ustr, n * sizeof(Py_UNICODE));\r
+    }\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(fromunicode_doc,\r
+"fromunicode(ustr)\n\\r
+\n\\r
+Extends this array with data from the unicode string ustr.\n\\r
+The array must be a type 'u' array; otherwise a ValueError\n\\r
+is raised.  Use array.fromstring(ustr.decode(...)) to\n\\r
+append Unicode data to an array of some other type.");\r
+\r
+\r
+static PyObject *\r
+array_tounicode(arrayobject *self, PyObject *unused)\r
+{\r
+    if (self->ob_descr->typecode != 'u') {\r
+        PyErr_SetString(PyExc_ValueError,\r
+            "tounicode() may only be called on type 'u' arrays");\r
+        return NULL;\r
+    }\r
+    return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));\r
+}\r
+\r
+PyDoc_STRVAR(tounicode_doc,\r
+"tounicode() -> unicode\n\\r
+\n\\r
+Convert the array to a unicode string.  The array must be\n\\r
+a type 'u' array; otherwise a ValueError is raised.  Use\n\\r
+array.tostring().decode() to obtain a unicode string from\n\\r
+an array of some other type.");\r
+\r
+#endif /* Py_USING_UNICODE */\r
+\r
+static PyObject *\r
+array_reduce(arrayobject *array)\r
+{\r
+    PyObject *dict, *result, *list;\r
+\r
+    dict = PyObject_GetAttrString((PyObject *)array, "__dict__");\r
+    if (dict == NULL) {\r
+        if (!PyErr_ExceptionMatches(PyExc_AttributeError))\r
+            return NULL;\r
+        PyErr_Clear();\r
+        dict = Py_None;\r
+        Py_INCREF(dict);\r
+    }\r
+    /* Unlike in Python 3.x, we never use the more efficient memory\r
+     * representation of an array for pickling.  This is unfortunately\r
+     * necessary to allow array objects to be unpickled by Python 3.x,\r
+     * since str objects from 2.x are always decoded to unicode in\r
+     * Python 3.x.\r
+     */\r
+    list = array_tolist(array, NULL);\r
+    if (list == NULL) {\r
+        Py_DECREF(dict);\r
+        return NULL;\r
+    }\r
+    result = Py_BuildValue(\r
+        "O(cO)O", Py_TYPE(array), array->ob_descr->typecode, list, dict);\r
+    Py_DECREF(list);\r
+    Py_DECREF(dict);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(reduce_doc, "Return state information for pickling.");\r
+\r
+static PyObject *\r
+array_sizeof(arrayobject *self, PyObject *unused)\r
+{\r
+    Py_ssize_t res;\r
+    res = sizeof(arrayobject) + self->allocated * self->ob_descr->itemsize;\r
+    return PyLong_FromSsize_t(res);\r
+}\r
+\r
+PyDoc_STRVAR(sizeof_doc,\r
+"__sizeof__() -> int\n\\r
+\n\\r
+Size of the array in memory, in bytes.");\r
+\r
+static PyObject *\r
+array_get_typecode(arrayobject *a, void *closure)\r
+{\r
+    char tc = a->ob_descr->typecode;\r
+    return PyString_FromStringAndSize(&tc, 1);\r
+}\r
+\r
+static PyObject *\r
+array_get_itemsize(arrayobject *a, void *closure)\r
+{\r
+    return PyInt_FromLong((long)a->ob_descr->itemsize);\r
+}\r
+\r
+static PyGetSetDef array_getsets [] = {\r
+    {"typecode", (getter) array_get_typecode, NULL,\r
+     "the typecode character used to create the array"},\r
+    {"itemsize", (getter) array_get_itemsize, NULL,\r
+     "the size, in bytes, of one array item"},\r
+    {NULL}\r
+};\r
+\r
+static PyMethodDef array_methods[] = {\r
+    {"append",          (PyCFunction)array_append,      METH_O,\r
+     append_doc},\r
+    {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,\r
+     buffer_info_doc},\r
+    {"byteswap",        (PyCFunction)array_byteswap,    METH_NOARGS,\r
+     byteswap_doc},\r
+    {"__copy__",        (PyCFunction)array_copy,        METH_NOARGS,\r
+     copy_doc},\r
+    {"count",           (PyCFunction)array_count,       METH_O,\r
+     count_doc},\r
+    {"__deepcopy__",(PyCFunction)array_copy,            METH_O,\r
+     copy_doc},\r
+    {"extend",      (PyCFunction)array_extend,          METH_O,\r
+     extend_doc},\r
+    {"fromfile",        (PyCFunction)array_fromfile,    METH_VARARGS,\r
+     fromfile_doc},\r
+    {"fromlist",        (PyCFunction)array_fromlist,    METH_O,\r
+     fromlist_doc},\r
+    {"fromstring",      (PyCFunction)array_fromstring,  METH_VARARGS,\r
+     fromstring_doc},\r
+#ifdef Py_USING_UNICODE\r
+    {"fromunicode",     (PyCFunction)array_fromunicode, METH_VARARGS,\r
+     fromunicode_doc},\r
+#endif\r
+    {"index",           (PyCFunction)array_index,       METH_O,\r
+     index_doc},\r
+    {"insert",          (PyCFunction)array_insert,      METH_VARARGS,\r
+     insert_doc},\r
+    {"pop",             (PyCFunction)array_pop,         METH_VARARGS,\r
+     pop_doc},\r
+    {"read",            (PyCFunction)array_fromfile_as_read,    METH_VARARGS,\r
+     fromfile_doc},\r
+    {"__reduce__",      (PyCFunction)array_reduce,      METH_NOARGS,\r
+     reduce_doc},\r
+    {"remove",          (PyCFunction)array_remove,      METH_O,\r
+     remove_doc},\r
+    {"reverse",         (PyCFunction)array_reverse,     METH_NOARGS,\r
+     reverse_doc},\r
+/*      {"sort",        (PyCFunction)array_sort,        METH_VARARGS,\r
+    sort_doc},*/\r
+    {"tofile",          (PyCFunction)array_tofile,      METH_O,\r
+     tofile_doc},\r
+    {"tolist",          (PyCFunction)array_tolist,      METH_NOARGS,\r
+     tolist_doc},\r
+    {"tostring",        (PyCFunction)array_tostring,    METH_NOARGS,\r
+     tostring_doc},\r
+#ifdef Py_USING_UNICODE\r
+    {"tounicode",   (PyCFunction)array_tounicode,       METH_NOARGS,\r
+     tounicode_doc},\r
+#endif\r
+    {"write",           (PyCFunction)array_tofile_as_write,     METH_O,\r
+     tofile_doc},\r
+    {"__sizeof__",      (PyCFunction)array_sizeof,      METH_NOARGS,\r
+     sizeof_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+static PyObject *\r
+array_repr(arrayobject *a)\r
+{\r
+    char buf[256], typecode;\r
+    PyObject *s, *t, *v = NULL;\r
+    Py_ssize_t len;\r
+\r
+    len = Py_SIZE(a);\r
+    typecode = a->ob_descr->typecode;\r
+    if (len == 0) {\r
+        PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);\r
+        return PyString_FromString(buf);\r
+    }\r
+\r
+    if (typecode == 'c')\r
+        v = array_tostring(a, NULL);\r
+#ifdef Py_USING_UNICODE\r
+    else if (typecode == 'u')\r
+        v = array_tounicode(a, NULL);\r
+#endif\r
+    else\r
+        v = array_tolist(a, NULL);\r
+    t = PyObject_Repr(v);\r
+    Py_XDECREF(v);\r
+\r
+    PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);\r
+    s = PyString_FromString(buf);\r
+    PyString_ConcatAndDel(&s, t);\r
+    PyString_ConcatAndDel(&s, PyString_FromString(")"));\r
+    return s;\r
+}\r
+\r
+static PyObject*\r
+array_subscr(arrayobject* self, PyObject* item)\r
+{\r
+    if (PyIndex_Check(item)) {\r
+        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);\r
+        if (i==-1 && PyErr_Occurred()) {\r
+            return NULL;\r
+        }\r
+        if (i < 0)\r
+            i += Py_SIZE(self);\r
+        return array_item(self, i);\r
+    }\r
+    else if (PySlice_Check(item)) {\r
+        Py_ssize_t start, stop, step, slicelength, cur, i;\r
+        PyObject* result;\r
+        arrayobject* ar;\r
+        int itemsize = self->ob_descr->itemsize;\r
+\r
+        if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),\r
+                         &start, &stop, &step, &slicelength) < 0) {\r
+            return NULL;\r
+        }\r
+\r
+        if (slicelength <= 0) {\r
+            return newarrayobject(&Arraytype, 0, self->ob_descr);\r
+        }\r
+        else if (step == 1) {\r
+            PyObject *result = newarrayobject(&Arraytype,\r
+                                    slicelength, self->ob_descr);\r
+            if (result == NULL)\r
+                return NULL;\r
+            memcpy(((arrayobject *)result)->ob_item,\r
+                   self->ob_item + start * itemsize,\r
+                   slicelength * itemsize);\r
+            return result;\r
+        }\r
+        else {\r
+            result = newarrayobject(&Arraytype, slicelength, self->ob_descr);\r
+            if (!result) return NULL;\r
+\r
+            ar = (arrayobject*)result;\r
+\r
+            for (cur = start, i = 0; i < slicelength;\r
+                 cur += step, i++) {\r
+                memcpy(ar->ob_item + i*itemsize,\r
+                       self->ob_item + cur*itemsize,\r
+                       itemsize);\r
+            }\r
+\r
+            return result;\r
+        }\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "array indices must be integers");\r
+        return NULL;\r
+    }\r
+}\r
+\r
+static int\r
+array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)\r
+{\r
+    Py_ssize_t start, stop, step, slicelength, needed;\r
+    arrayobject* other;\r
+    int itemsize;\r
+\r
+    if (PyIndex_Check(item)) {\r
+        Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);\r
+\r
+        if (i == -1 && PyErr_Occurred())\r
+            return -1;\r
+        if (i < 0)\r
+            i += Py_SIZE(self);\r
+        if (i < 0 || i >= Py_SIZE(self)) {\r
+            PyErr_SetString(PyExc_IndexError,\r
+                "array assignment index out of range");\r
+            return -1;\r
+        }\r
+        if (value == NULL) {\r
+            /* Fall through to slice assignment */\r
+            start = i;\r
+            stop = i + 1;\r
+            step = 1;\r
+            slicelength = 1;\r
+        }\r
+        else\r
+            return (*self->ob_descr->setitem)(self, i, value);\r
+    }\r
+    else if (PySlice_Check(item)) {\r
+        if (PySlice_GetIndicesEx((PySliceObject *)item,\r
+                                 Py_SIZE(self), &start, &stop,\r
+                                 &step, &slicelength) < 0) {\r
+            return -1;\r
+        }\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "array indices must be integer");\r
+        return -1;\r
+    }\r
+    if (value == NULL) {\r
+        other = NULL;\r
+        needed = 0;\r
+    }\r
+    else if (array_Check(value)) {\r
+        other = (arrayobject *)value;\r
+        needed = Py_SIZE(other);\r
+        if (self == other) {\r
+            /* Special case "self[i:j] = self" -- copy self first */\r
+            int ret;\r
+            value = array_slice(other, 0, needed);\r
+            if (value == NULL)\r
+                return -1;\r
+            ret = array_ass_subscr(self, item, value);\r
+            Py_DECREF(value);\r
+            return ret;\r
+        }\r
+        if (other->ob_descr != self->ob_descr) {\r
+            PyErr_BadArgument();\r
+            return -1;\r
+        }\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+         "can only assign array (not \"%.200s\") to array slice",\r
+                         Py_TYPE(value)->tp_name);\r
+        return -1;\r
+    }\r
+    itemsize = self->ob_descr->itemsize;\r
+    /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */\r
+    if ((step > 0 && stop < start) ||\r
+        (step < 0 && stop > start))\r
+        stop = start;\r
+    if (step == 1) {\r
+        if (slicelength > needed) {\r
+            memmove(self->ob_item + (start + needed) * itemsize,\r
+                self->ob_item + stop * itemsize,\r
+                (Py_SIZE(self) - stop) * itemsize);\r
+            if (array_resize(self, Py_SIZE(self) +\r
+                             needed - slicelength) < 0)\r
+                return -1;\r
+        }\r
+        else if (slicelength < needed) {\r
+            if (array_resize(self, Py_SIZE(self) +\r
+                             needed - slicelength) < 0)\r
+                return -1;\r
+            memmove(self->ob_item + (start + needed) * itemsize,\r
+                self->ob_item + stop * itemsize,\r
+                (Py_SIZE(self) - start - needed) * itemsize);\r
+        }\r
+        if (needed > 0)\r
+            memcpy(self->ob_item + start * itemsize,\r
+                   other->ob_item, needed * itemsize);\r
+        return 0;\r
+    }\r
+    else if (needed == 0) {\r
+        /* Delete slice */\r
+        size_t cur;\r
+        Py_ssize_t i;\r
+\r
+        if (step < 0) {\r
+            stop = start + 1;\r
+            start = stop + step * (slicelength - 1) - 1;\r
+            step = -step;\r
+        }\r
+        for (cur = start, i = 0; i < slicelength;\r
+             cur += step, i++) {\r
+            Py_ssize_t lim = step - 1;\r
+\r
+            if (cur + step >= (size_t)Py_SIZE(self))\r
+                lim = Py_SIZE(self) - cur - 1;\r
+            memmove(self->ob_item + (cur - i) * itemsize,\r
+                self->ob_item + (cur + 1) * itemsize,\r
+                lim * itemsize);\r
+        }\r
+        cur = start + slicelength * step;\r
+        if (cur < (size_t)Py_SIZE(self)) {\r
+            memmove(self->ob_item + (cur-slicelength) * itemsize,\r
+                self->ob_item + cur * itemsize,\r
+                (Py_SIZE(self) - cur) * itemsize);\r
+        }\r
+        if (array_resize(self, Py_SIZE(self) - slicelength) < 0)\r
+            return -1;\r
+        return 0;\r
+    }\r
+    else {\r
+        Py_ssize_t cur, i;\r
+\r
+        if (needed != slicelength) {\r
+            PyErr_Format(PyExc_ValueError,\r
+                "attempt to assign array of size %zd "\r
+                "to extended slice of size %zd",\r
+                needed, slicelength);\r
+            return -1;\r
+        }\r
+        for (cur = start, i = 0; i < slicelength;\r
+             cur += step, i++) {\r
+            memcpy(self->ob_item + cur * itemsize,\r
+                   other->ob_item + i * itemsize,\r
+                   itemsize);\r
+        }\r
+        return 0;\r
+    }\r
+}\r
+\r
+static PyMappingMethods array_as_mapping = {\r
+    (lenfunc)array_length,\r
+    (binaryfunc)array_subscr,\r
+    (objobjargproc)array_ass_subscr\r
+};\r
+\r
+static const void *emptybuf = "";\r
+\r
+static Py_ssize_t\r
+array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)\r
+{\r
+    if ( index != 0 ) {\r
+        PyErr_SetString(PyExc_SystemError,\r
+                        "Accessing non-existent array segment");\r
+        return -1;\r
+    }\r
+    *ptr = (void *)self->ob_item;\r
+    if (*ptr == NULL)\r
+        *ptr = emptybuf;\r
+    return Py_SIZE(self)*self->ob_descr->itemsize;\r
+}\r
+\r
+static Py_ssize_t\r
+array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)\r
+{\r
+    if ( index != 0 ) {\r
+        PyErr_SetString(PyExc_SystemError,\r
+                        "Accessing non-existent array segment");\r
+        return -1;\r
+    }\r
+    *ptr = (void *)self->ob_item;\r
+    if (*ptr == NULL)\r
+        *ptr = emptybuf;\r
+    return Py_SIZE(self)*self->ob_descr->itemsize;\r
+}\r
+\r
+static Py_ssize_t\r
+array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)\r
+{\r
+    if ( lenp )\r
+        *lenp = Py_SIZE(self)*self->ob_descr->itemsize;\r
+    return 1;\r
+}\r
+\r
+static PySequenceMethods array_as_sequence = {\r
+    (lenfunc)array_length,                      /*sq_length*/\r
+    (binaryfunc)array_concat,               /*sq_concat*/\r
+    (ssizeargfunc)array_repeat,                 /*sq_repeat*/\r
+    (ssizeargfunc)array_item,                           /*sq_item*/\r
+    (ssizessizeargfunc)array_slice,             /*sq_slice*/\r
+    (ssizeobjargproc)array_ass_item,                    /*sq_ass_item*/\r
+    (ssizessizeobjargproc)array_ass_slice,      /*sq_ass_slice*/\r
+    (objobjproc)array_contains,                 /*sq_contains*/\r
+    (binaryfunc)array_inplace_concat,           /*sq_inplace_concat*/\r
+    (ssizeargfunc)array_inplace_repeat          /*sq_inplace_repeat*/\r
+};\r
+\r
+static PyBufferProcs array_as_buffer = {\r
+    (readbufferproc)array_buffer_getreadbuf,\r
+    (writebufferproc)array_buffer_getwritebuf,\r
+    (segcountproc)array_buffer_getsegcount,\r
+    NULL,\r
+};\r
+\r
+static PyObject *\r
+array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    char c;\r
+    PyObject *initial = NULL, *it = NULL;\r
+    struct arraydescr *descr;\r
+\r
+    if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))\r
+        return NULL;\r
+\r
+    if (!(initial == NULL || PyList_Check(initial)\r
+          || PyString_Check(initial) || PyTuple_Check(initial)\r
+          || (c == 'u' && PyUnicode_Check(initial)))) {\r
+        it = PyObject_GetIter(initial);\r
+        if (it == NULL)\r
+            return NULL;\r
+        /* We set initial to NULL so that the subsequent code\r
+           will create an empty array of the appropriate type\r
+           and afterwards we can use array_iter_extend to populate\r
+           the array.\r
+        */\r
+        initial = NULL;\r
+    }\r
+    for (descr = descriptors; descr->typecode != '\0'; descr++) {\r
+        if (descr->typecode == c) {\r
+            PyObject *a;\r
+            Py_ssize_t len;\r
+\r
+            if (initial == NULL || !(PyList_Check(initial)\r
+                || PyTuple_Check(initial)))\r
+                len = 0;\r
+            else\r
+                len = PySequence_Size(initial);\r
+\r
+            a = newarrayobject(type, len, descr);\r
+            if (a == NULL)\r
+                return NULL;\r
+\r
+            if (len > 0) {\r
+                Py_ssize_t i;\r
+                for (i = 0; i < len; i++) {\r
+                    PyObject *v =\r
+                        PySequence_GetItem(initial, i);\r
+                    if (v == NULL) {\r
+                        Py_DECREF(a);\r
+                        return NULL;\r
+                    }\r
+                    if (setarrayitem(a, i, v) != 0) {\r
+                        Py_DECREF(v);\r
+                        Py_DECREF(a);\r
+                        return NULL;\r
+                    }\r
+                    Py_DECREF(v);\r
+                }\r
+            } else if (initial != NULL && PyString_Check(initial)) {\r
+                PyObject *t_initial, *v;\r
+                t_initial = PyTuple_Pack(1, initial);\r
+                if (t_initial == NULL) {\r
+                    Py_DECREF(a);\r
+                    return NULL;\r
+                }\r
+                v = array_fromstring((arrayobject *)a,\r
+                                         t_initial);\r
+                Py_DECREF(t_initial);\r
+                if (v == NULL) {\r
+                    Py_DECREF(a);\r
+                    return NULL;\r
+                }\r
+                Py_DECREF(v);\r
+#ifdef Py_USING_UNICODE\r
+            } else if (initial != NULL && PyUnicode_Check(initial))  {\r
+                Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);\r
+                if (n > 0) {\r
+                    arrayobject *self = (arrayobject *)a;\r
+                    char *item = self->ob_item;\r
+                    item = (char *)PyMem_Realloc(item, n);\r
+                    if (item == NULL) {\r
+                        PyErr_NoMemory();\r
+                        Py_DECREF(a);\r
+                        return NULL;\r
+                    }\r
+                    self->ob_item = item;\r
+                    Py_SIZE(self) = n / sizeof(Py_UNICODE);\r
+                    memcpy(item, PyUnicode_AS_DATA(initial), n);\r
+                    self->allocated = Py_SIZE(self);\r
+                }\r
+#endif\r
+            }\r
+            if (it != NULL) {\r
+                if (array_iter_extend((arrayobject *)a, it) == -1) {\r
+                    Py_DECREF(it);\r
+                    Py_DECREF(a);\r
+                    return NULL;\r
+                }\r
+                Py_DECREF(it);\r
+            }\r
+            return a;\r
+        }\r
+    }\r
+    PyErr_SetString(PyExc_ValueError,\r
+        "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");\r
+    return NULL;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module defines an object type which can efficiently represent\n\\r
+an array of basic values: characters, integers, floating point\n\\r
+numbers.  Arrays are sequence types and behave very much like lists,\n\\r
+except that the type of objects stored in them is constrained.  The\n\\r
+type is specified at object creation time by using a type code, which\n\\r
+is a single character.  The following type codes are defined:\n\\r
+\n\\r
+    Type code   C Type             Minimum size in bytes \n\\r
+    'c'         character          1 \n\\r
+    'b'         signed integer     1 \n\\r
+    'B'         unsigned integer   1 \n\\r
+    'u'         Unicode character  2 \n\\r
+    'h'         signed integer     2 \n\\r
+    'H'         unsigned integer   2 \n\\r
+    'i'         signed integer     2 \n\\r
+    'I'         unsigned integer   2 \n\\r
+    'l'         signed integer     4 \n\\r
+    'L'         unsigned integer   4 \n\\r
+    'f'         floating point     4 \n\\r
+    'd'         floating point     8 \n\\r
+\n\\r
+The constructor is:\n\\r
+\n\\r
+array(typecode [, initializer]) -- create a new array\n\\r
+");\r
+\r
+PyDoc_STRVAR(arraytype_doc,\r
+"array(typecode [, initializer]) -> array\n\\r
+\n\\r
+Return a new array whose items are restricted by typecode, and\n\\r
+initialized from the optional initializer value, which must be a list,\n\\r
+string or iterable over elements of the appropriate type.\n\\r
+\n\\r
+Arrays represent basic values and behave very much like lists, except\n\\r
+the type of objects stored in them is constrained.\n\\r
+\n\\r
+Methods:\n\\r
+\n\\r
+append() -- append a new item to the end of the array\n\\r
+buffer_info() -- return information giving the current memory info\n\\r
+byteswap() -- byteswap all the items of the array\n\\r
+count() -- return number of occurrences of an object\n\\r
+extend() -- extend array by appending multiple elements from an iterable\n\\r
+fromfile() -- read items from a file object\n\\r
+fromlist() -- append items from the list\n\\r
+fromstring() -- append items from the string\n\\r
+index() -- return index of first occurrence of an object\n\\r
+insert() -- insert a new item into the array at a provided position\n\\r
+pop() -- remove and return item (default last)\n\\r
+read() -- DEPRECATED, use fromfile()\n\\r
+remove() -- remove first occurrence of an object\n\\r
+reverse() -- reverse the order of the items in the array\n\\r
+tofile() -- write all items to a file object\n\\r
+tolist() -- return the array converted to an ordinary list\n\\r
+tostring() -- return the array converted to a string\n\\r
+write() -- DEPRECATED, use tofile()\n\\r
+\n\\r
+Attributes:\n\\r
+\n\\r
+typecode -- the typecode character used to create the array\n\\r
+itemsize -- the length in bytes of one array item\n\\r
+");\r
+\r
+static PyObject *array_iter(arrayobject *ao);\r
+\r
+static PyTypeObject Arraytype = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "array.array",\r
+    sizeof(arrayobject),\r
+    0,\r
+    (destructor)array_dealloc,                  /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    (reprfunc)array_repr,                       /* tp_repr */\r
+    0,                                          /* tp_as_number*/\r
+    &array_as_sequence,                         /* tp_as_sequence*/\r
+    &array_as_mapping,                          /* tp_as_mapping*/\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    &array_as_buffer,                           /* tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS,  /* tp_flags */\r
+    arraytype_doc,                              /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    array_richcompare,                          /* tp_richcompare */\r
+    offsetof(arrayobject, weakreflist),         /* tp_weaklistoffset */\r
+    (getiterfunc)array_iter,                    /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    array_methods,                              /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    array_getsets,                              /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    PyType_GenericAlloc,                        /* tp_alloc */\r
+    array_new,                                  /* tp_new */\r
+    PyObject_Del,                               /* tp_free */\r
+};\r
+\r
+\r
+/*********************** Array Iterator **************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t                          index;\r
+    arrayobject                 *ao;\r
+    PyObject                    * (*getitem)(struct arrayobject *, Py_ssize_t);\r
+} arrayiterobject;\r
+\r
+static PyTypeObject PyArrayIter_Type;\r
+\r
+#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)\r
+\r
+static PyObject *\r
+array_iter(arrayobject *ao)\r
+{\r
+    arrayiterobject *it;\r
+\r
+    if (!array_Check(ao)) {\r
+        PyErr_BadInternalCall();\r
+        return NULL;\r
+    }\r
+\r
+    it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    Py_INCREF(ao);\r
+    it->ao = ao;\r
+    it->index = 0;\r
+    it->getitem = ao->ob_descr->getitem;\r
+    PyObject_GC_Track(it);\r
+    return (PyObject *)it;\r
+}\r
+\r
+static PyObject *\r
+arrayiter_next(arrayiterobject *it)\r
+{\r
+    assert(PyArrayIter_Check(it));\r
+    if (it->index < Py_SIZE(it->ao))\r
+        return (*it->getitem)(it->ao, it->index++);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+arrayiter_dealloc(arrayiterobject *it)\r
+{\r
+    PyObject_GC_UnTrack(it);\r
+    Py_XDECREF(it->ao);\r
+    PyObject_GC_Del(it);\r
+}\r
+\r
+static int\r
+arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(it->ao);\r
+    return 0;\r
+}\r
+\r
+static PyTypeObject PyArrayIter_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "arrayiterator",                        /* tp_name */\r
+    sizeof(arrayiterobject),                /* tp_basicsize */\r
+    0,                                      /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)arrayiter_dealloc,              /* tp_dealloc */\r
+    0,                                      /* tp_print */\r
+    0,                                      /* tp_getattr */\r
+    0,                                      /* tp_setattr */\r
+    0,                                      /* tp_compare */\r
+    0,                                      /* tp_repr */\r
+    0,                                      /* tp_as_number */\r
+    0,                                      /* tp_as_sequence */\r
+    0,                                      /* tp_as_mapping */\r
+    0,                                      /* tp_hash */\r
+    0,                                      /* tp_call */\r
+    0,                                      /* tp_str */\r
+    PyObject_GenericGetAttr,                /* tp_getattro */\r
+    0,                                      /* tp_setattro */\r
+    0,                                      /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\r
+    0,                                      /* tp_doc */\r
+    (traverseproc)arrayiter_traverse,           /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                      /* tp_richcompare */\r
+    0,                                      /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                          /* tp_iter */\r
+    (iternextfunc)arrayiter_next,               /* tp_iternext */\r
+    0,                                          /* tp_methods */\r
+};\r
+\r
+\r
+/*********************** Install Module **************************/\r
+\r
+/* No functions in array module. */\r
+static PyMethodDef a_methods[] = {\r
+    {NULL, NULL, 0, NULL}        /* Sentinel */\r
+};\r
+\r
+\r
+PyMODINIT_FUNC\r
+initarray(void)\r
+{\r
+    PyObject *m;\r
+\r
+    Arraytype.ob_type = &PyType_Type;\r
+    PyArrayIter_Type.ob_type = &PyType_Type;\r
+    m = Py_InitModule3("array", a_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    Py_INCREF((PyObject *)&Arraytype);\r
+    PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);\r
+    Py_INCREF((PyObject *)&Arraytype);\r
+    PyModule_AddObject(m, "array", (PyObject *)&Arraytype);\r
+    /* No need to check the error here, the caller will do that */\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/binascii.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/binascii.c
new file mode 100644 (file)
index 0000000..ee2d042
--- /dev/null
@@ -0,0 +1,1516 @@
+/*\r
+** Routines to represent binary data in ASCII and vice-versa\r
+**\r
+** This module currently supports the following encodings:\r
+** uuencode:\r
+**      each line encodes 45 bytes (except possibly the last)\r
+**      First char encodes (binary) length, rest data\r
+**      each char encodes 6 bits, as follows:\r
+**      binary: 01234567 abcdefgh ijklmnop\r
+**      ascii:  012345 67abcd efghij klmnop\r
+**      ASCII encoding method is "excess-space": 000000 is encoded as ' ', etc.\r
+**      short binary data is zero-extended (so the bits are always in the\r
+**      right place), this does *not* reflect in the length.\r
+** base64:\r
+**      Line breaks are insignificant, but lines are at most 76 chars\r
+**      each char encodes 6 bits, in similar order as uucode/hqx. Encoding\r
+**      is done via a table.\r
+**      Short binary data is filled (in ASCII) with '='.\r
+** hqx:\r
+**      File starts with introductory text, real data starts and ends\r
+**      with colons.\r
+**      Data consists of three similar parts: info, datafork, resourcefork.\r
+**      Each part is protected (at the end) with a 16-bit crc\r
+**      The binary data is run-length encoded, and then ascii-fied:\r
+**      binary: 01234567 abcdefgh ijklmnop\r
+**      ascii:  012345 67abcd efghij klmnop\r
+**      ASCII encoding is table-driven, see the code.\r
+**      Short binary data results in the runt ascii-byte being output with\r
+**      the bits in the right place.\r
+**\r
+** While I was reading dozens of programs that encode or decode the formats\r
+** here (documentation? hihi:-) I have formulated Jansen's Observation:\r
+**\r
+**      Programs that encode binary data in ASCII are written in\r
+**      such a style that they are as unreadable as possible. Devices used\r
+**      include unnecessary global variables, burying important tables\r
+**      in unrelated sourcefiles, putting functions in include files,\r
+**      using seemingly-descriptive variable names for different purposes,\r
+**      calls to empty subroutines and a host of others.\r
+**\r
+** I have attempted to break with this tradition, but I guess that that\r
+** does make the performance sub-optimal. Oh well, too bad...\r
+**\r
+** Jack Jansen, CWI, July 1995.\r
+**\r
+** Added support for quoted-printable encoding, based on rfc 1521 et al\r
+** quoted-printable encoding specifies that non printable characters (anything\r
+** below 32 and above 126) be encoded as =XX where XX is the hexadecimal value\r
+** of the character.  It also specifies some other behavior to enable 8bit data\r
+** in a mail message with little difficulty (maximum line sizes, protecting\r
+** some cases of whitespace, etc).\r
+**\r
+** Brandon Long, September 2001.\r
+*/\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+\r
+#include "Python.h"\r
+#ifdef USE_ZLIB_CRC32\r
+#include "zlib.h"\r
+#endif\r
+\r
+static PyObject *Error;\r
+static PyObject *Incomplete;\r
+\r
+/*\r
+** hqx lookup table, ascii->binary.\r
+*/\r
+\r
+#define RUNCHAR 0x90\r
+\r
+#define DONE 0x7F\r
+#define SKIP 0x7E\r
+#define FAIL 0x7D\r
+\r
+static unsigned char table_a2b_hqx[256] = {\r
+/*       ^@    ^A    ^B    ^C    ^D    ^E    ^F    ^G   */\r
+/* 0*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*       \b    \t    \n    ^K    ^L    \r    ^N    ^O   */\r
+/* 1*/  FAIL, FAIL, SKIP, FAIL, FAIL, SKIP, FAIL, FAIL,\r
+/*       ^P    ^Q    ^R    ^S    ^T    ^U    ^V    ^W   */\r
+/* 2*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*       ^X    ^Y    ^Z    ^[    ^\    ^]    ^^    ^_   */\r
+/* 3*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*              !     "     #     $     %     &     '   */\r
+/* 4*/  FAIL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,\r
+/*        (     )     *     +     ,     -     .     /   */\r
+/* 5*/  0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, FAIL, FAIL,\r
+/*        0     1     2     3     4     5     6     7   */\r
+/* 6*/  0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, FAIL,\r
+/*        8     9     :     ;     <     =     >     ?   */\r
+/* 7*/  0x14, 0x15, DONE, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*        @     A     B     C     D     E     F     G   */\r
+/* 8*/  0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D,\r
+/*        H     I     J     K     L     M     N     O   */\r
+/* 9*/  0x1E, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, FAIL,\r
+/*        P     Q     R     S     T     U     V     W   */\r
+/*10*/  0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, FAIL,\r
+/*        X     Y     Z     [     \     ]     ^     _   */\r
+/*11*/  0x2C, 0x2D, 0x2E, 0x2F, FAIL, FAIL, FAIL, FAIL,\r
+/*        `     a     b     c     d     e     f     g   */\r
+/*12*/  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, FAIL,\r
+/*        h     i     j     k     l     m     n     o   */\r
+/*13*/  0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, FAIL, FAIL,\r
+/*        p     q     r     s     t     u     v     w   */\r
+/*14*/  0x3D, 0x3E, 0x3F, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*        x     y     z     {     |     }     ~    ^?   */\r
+/*15*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+/*16*/  FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+    FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL, FAIL,\r
+};\r
+\r
+static unsigned char table_b2a_hqx[] =\r
+"!\"#$%&'()*+,-012345689@ABCDEFGHIJKLMNPQRSTUVXYZ[`abcdefhijklmpqr";\r
+\r
+static char table_a2b_base64[] = {\r
+    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+    -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,\r
+    52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1, 0,-1,-1, /* Note PAD->0 */\r
+    -1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,\r
+    15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,\r
+    -1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,\r
+    41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1\r
+};\r
+\r
+#define BASE64_PAD '='\r
+\r
+/* Max binary chunk size; limited only by available memory */\r
+#define BASE64_MAXBIN (PY_SSIZE_T_MAX/2 - sizeof(PyStringObject) - 3)\r
+\r
+static unsigned char table_b2a_base64[] =\r
+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\r
+\r
+\r
+\r
+static unsigned short crctab_hqx[256] = {\r
+    0x0000, 0x1021, 0x2042, 0x3063, 0x4084, 0x50a5, 0x60c6, 0x70e7,\r
+    0x8108, 0x9129, 0xa14a, 0xb16b, 0xc18c, 0xd1ad, 0xe1ce, 0xf1ef,\r
+    0x1231, 0x0210, 0x3273, 0x2252, 0x52b5, 0x4294, 0x72f7, 0x62d6,\r
+    0x9339, 0x8318, 0xb37b, 0xa35a, 0xd3bd, 0xc39c, 0xf3ff, 0xe3de,\r
+    0x2462, 0x3443, 0x0420, 0x1401, 0x64e6, 0x74c7, 0x44a4, 0x5485,\r
+    0xa56a, 0xb54b, 0x8528, 0x9509, 0xe5ee, 0xf5cf, 0xc5ac, 0xd58d,\r
+    0x3653, 0x2672, 0x1611, 0x0630, 0x76d7, 0x66f6, 0x5695, 0x46b4,\r
+    0xb75b, 0xa77a, 0x9719, 0x8738, 0xf7df, 0xe7fe, 0xd79d, 0xc7bc,\r
+    0x48c4, 0x58e5, 0x6886, 0x78a7, 0x0840, 0x1861, 0x2802, 0x3823,\r
+    0xc9cc, 0xd9ed, 0xe98e, 0xf9af, 0x8948, 0x9969, 0xa90a, 0xb92b,\r
+    0x5af5, 0x4ad4, 0x7ab7, 0x6a96, 0x1a71, 0x0a50, 0x3a33, 0x2a12,\r
+    0xdbfd, 0xcbdc, 0xfbbf, 0xeb9e, 0x9b79, 0x8b58, 0xbb3b, 0xab1a,\r
+    0x6ca6, 0x7c87, 0x4ce4, 0x5cc5, 0x2c22, 0x3c03, 0x0c60, 0x1c41,\r
+    0xedae, 0xfd8f, 0xcdec, 0xddcd, 0xad2a, 0xbd0b, 0x8d68, 0x9d49,\r
+    0x7e97, 0x6eb6, 0x5ed5, 0x4ef4, 0x3e13, 0x2e32, 0x1e51, 0x0e70,\r
+    0xff9f, 0xefbe, 0xdfdd, 0xcffc, 0xbf1b, 0xaf3a, 0x9f59, 0x8f78,\r
+    0x9188, 0x81a9, 0xb1ca, 0xa1eb, 0xd10c, 0xc12d, 0xf14e, 0xe16f,\r
+    0x1080, 0x00a1, 0x30c2, 0x20e3, 0x5004, 0x4025, 0x7046, 0x6067,\r
+    0x83b9, 0x9398, 0xa3fb, 0xb3da, 0xc33d, 0xd31c, 0xe37f, 0xf35e,\r
+    0x02b1, 0x1290, 0x22f3, 0x32d2, 0x4235, 0x5214, 0x6277, 0x7256,\r
+    0xb5ea, 0xa5cb, 0x95a8, 0x8589, 0xf56e, 0xe54f, 0xd52c, 0xc50d,\r
+    0x34e2, 0x24c3, 0x14a0, 0x0481, 0x7466, 0x6447, 0x5424, 0x4405,\r
+    0xa7db, 0xb7fa, 0x8799, 0x97b8, 0xe75f, 0xf77e, 0xc71d, 0xd73c,\r
+    0x26d3, 0x36f2, 0x0691, 0x16b0, 0x6657, 0x7676, 0x4615, 0x5634,\r
+    0xd94c, 0xc96d, 0xf90e, 0xe92f, 0x99c8, 0x89e9, 0xb98a, 0xa9ab,\r
+    0x5844, 0x4865, 0x7806, 0x6827, 0x18c0, 0x08e1, 0x3882, 0x28a3,\r
+    0xcb7d, 0xdb5c, 0xeb3f, 0xfb1e, 0x8bf9, 0x9bd8, 0xabbb, 0xbb9a,\r
+    0x4a75, 0x5a54, 0x6a37, 0x7a16, 0x0af1, 0x1ad0, 0x2ab3, 0x3a92,\r
+    0xfd2e, 0xed0f, 0xdd6c, 0xcd4d, 0xbdaa, 0xad8b, 0x9de8, 0x8dc9,\r
+    0x7c26, 0x6c07, 0x5c64, 0x4c45, 0x3ca2, 0x2c83, 0x1ce0, 0x0cc1,\r
+    0xef1f, 0xff3e, 0xcf5d, 0xdf7c, 0xaf9b, 0xbfba, 0x8fd9, 0x9ff8,\r
+    0x6e17, 0x7e36, 0x4e55, 0x5e74, 0x2e93, 0x3eb2, 0x0ed1, 0x1ef0,\r
+};\r
+\r
+PyDoc_STRVAR(doc_a2b_uu, "(ascii) -> bin. Decode a line of uuencoded data");\r
+\r
+static PyObject *\r
+binascii_a2b_uu(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pascii;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t ascii_len, bin_len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:a2b_uu", &pascii) )\r
+        return NULL;\r
+    ascii_data = pascii.buf;\r
+    ascii_len = pascii.len;\r
+\r
+    assert(ascii_len >= 0);\r
+\r
+    /* First byte: binary data length (in bytes) */\r
+    bin_len = (*ascii_data++ - ' ') & 077;\r
+    ascii_len--;\r
+\r
+    /* Allocate the buffer */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) {\r
+        PyBuffer_Release(&pascii);\r
+        return NULL;\r
+    }\r
+    bin_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    for( ; bin_len > 0 ; ascii_len--, ascii_data++ ) {\r
+        /* XXX is it really best to add NULs if there's no more data */\r
+        this_ch = (ascii_len > 0) ? *ascii_data : 0;\r
+        if ( this_ch == '\n' || this_ch == '\r' || ascii_len <= 0) {\r
+            /*\r
+            ** Whitespace. Assume some spaces got eaten at\r
+            ** end-of-line. (We check this later)\r
+            */\r
+            this_ch = 0;\r
+        } else {\r
+            /* Check the character for legality\r
+            ** The 64 in stead of the expected 63 is because\r
+            ** there are a few uuencodes out there that use\r
+            ** '`' as zero instead of space.\r
+            */\r
+            if ( this_ch < ' ' || this_ch > (' ' + 64)) {\r
+                PyErr_SetString(Error, "Illegal char");\r
+                PyBuffer_Release(&pascii);\r
+                Py_DECREF(rv);\r
+                return NULL;\r
+            }\r
+            this_ch = (this_ch - ' ') & 077;\r
+        }\r
+        /*\r
+        ** Shift it in on the low end, and see if there's\r
+        ** a byte ready for output.\r
+        */\r
+        leftchar = (leftchar << 6) | (this_ch);\r
+        leftbits += 6;\r
+        if ( leftbits >= 8 ) {\r
+            leftbits -= 8;\r
+            *bin_data++ = (leftchar >> leftbits) & 0xff;\r
+            leftchar &= ((1 << leftbits) - 1);\r
+            bin_len--;\r
+        }\r
+    }\r
+    /*\r
+    ** Finally, check that if there's anything left on the line\r
+    ** that it's whitespace only.\r
+    */\r
+    while( ascii_len-- > 0 ) {\r
+        this_ch = *ascii_data++;\r
+        /* Extra '`' may be written as padding in some cases */\r
+        if ( this_ch != ' ' && this_ch != ' '+64 &&\r
+             this_ch != '\n' && this_ch != '\r' ) {\r
+            PyErr_SetString(Error, "Trailing garbage");\r
+            PyBuffer_Release(&pascii);\r
+            Py_DECREF(rv);\r
+            return NULL;\r
+        }\r
+    }\r
+    PyBuffer_Release(&pascii);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_b2a_uu, "(bin) -> ascii. Uuencode line of data");\r
+\r
+static PyObject *\r
+binascii_b2a_uu(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pbin;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t bin_len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:b2a_uu", &pbin) )\r
+        return NULL;\r
+    bin_data = pbin.buf;\r
+    bin_len = pbin.len;\r
+    if ( bin_len > 45 ) {\r
+        /* The 45 is a limit that appears in all uuencode's */\r
+        PyErr_SetString(Error, "At most 45 bytes at once");\r
+        PyBuffer_Release(&pbin);\r
+        return NULL;\r
+    }\r
+\r
+    /* We're lazy and allocate to much (fixed up later) */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, 2 + (bin_len+2)/3*4)) == NULL ) {\r
+        PyBuffer_Release(&pbin);\r
+        return NULL;\r
+    }\r
+    ascii_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    /* Store the length */\r
+    *ascii_data++ = ' ' + (bin_len & 077);\r
+\r
+    for( ; bin_len > 0 || leftbits != 0 ; bin_len--, bin_data++ ) {\r
+        /* Shift the data (or padding) into our buffer */\r
+        if ( bin_len > 0 )              /* Data */\r
+            leftchar = (leftchar << 8) | *bin_data;\r
+        else                            /* Padding */\r
+            leftchar <<= 8;\r
+        leftbits += 8;\r
+\r
+        /* See if there are 6-bit groups ready */\r
+        while ( leftbits >= 6 ) {\r
+            this_ch = (leftchar >> (leftbits-6)) & 0x3f;\r
+            leftbits -= 6;\r
+            *ascii_data++ = this_ch + ' ';\r
+        }\r
+    }\r
+    *ascii_data++ = '\n';       /* Append a courtesy newline */\r
+\r
+    /* rv is cleared on error */\r
+    (void)_PyString_Resize(&rv,\r
+                       (ascii_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv)));\r
+    PyBuffer_Release(&pbin);\r
+    return rv;\r
+}\r
+\r
+\r
+static int\r
+binascii_find_valid(unsigned char *s, Py_ssize_t slen, int num)\r
+{\r
+    /* Finds & returns the (num+1)th\r
+    ** valid character for base64, or -1 if none.\r
+    */\r
+\r
+    int ret = -1;\r
+    unsigned char c, b64val;\r
+\r
+    while ((slen > 0) && (ret == -1)) {\r
+        c = *s;\r
+        b64val = table_a2b_base64[c & 0x7f];\r
+        if ( ((c <= 0x7f) && (b64val != (unsigned char)-1)) ) {\r
+            if (num == 0)\r
+                ret = *s;\r
+            num--;\r
+        }\r
+\r
+        s++;\r
+        slen--;\r
+    }\r
+    return ret;\r
+}\r
+\r
+PyDoc_STRVAR(doc_a2b_base64, "(ascii) -> bin. Decode a line of base64 data");\r
+\r
+static PyObject *\r
+binascii_a2b_base64(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pascii;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t ascii_len, bin_len;\r
+    int quad_pos = 0;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:a2b_base64", &pascii) )\r
+        return NULL;\r
+    ascii_data = pascii.buf;\r
+    ascii_len = pascii.len;\r
+\r
+    assert(ascii_len >= 0);\r
+\r
+    if (ascii_len > PY_SSIZE_T_MAX - 3) {\r
+        PyBuffer_Release(&pascii);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    bin_len = ((ascii_len+3)/4)*3; /* Upper bound, corrected later */\r
+\r
+    /* Allocate the buffer */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, bin_len)) == NULL ) {\r
+        PyBuffer_Release(&pascii);\r
+        return NULL;\r
+    }\r
+    bin_data = (unsigned char *)PyString_AS_STRING(rv);\r
+    bin_len = 0;\r
+\r
+    for( ; ascii_len > 0; ascii_len--, ascii_data++) {\r
+        this_ch = *ascii_data;\r
+\r
+        if (this_ch > 0x7f ||\r
+            this_ch == '\r' || this_ch == '\n' || this_ch == ' ')\r
+            continue;\r
+\r
+        /* Check for pad sequences and ignore\r
+        ** the invalid ones.\r
+        */\r
+        if (this_ch == BASE64_PAD) {\r
+            if ( (quad_pos < 2) ||\r
+                 ((quad_pos == 2) &&\r
+                  (binascii_find_valid(ascii_data, ascii_len, 1)\r
+                   != BASE64_PAD)) )\r
+            {\r
+                continue;\r
+            }\r
+            else {\r
+                /* A pad sequence means no more input.\r
+                ** We've already interpreted the data\r
+                ** from the quad at this point.\r
+                */\r
+                leftbits = 0;\r
+                break;\r
+            }\r
+        }\r
+\r
+        this_ch = table_a2b_base64[*ascii_data];\r
+        if ( this_ch == (unsigned char) -1 )\r
+            continue;\r
+\r
+        /*\r
+        ** Shift it in on the low end, and see if there's\r
+        ** a byte ready for output.\r
+        */\r
+        quad_pos = (quad_pos + 1) & 0x03;\r
+        leftchar = (leftchar << 6) | (this_ch);\r
+        leftbits += 6;\r
+\r
+        if ( leftbits >= 8 ) {\r
+            leftbits -= 8;\r
+            *bin_data++ = (leftchar >> leftbits) & 0xff;\r
+            bin_len++;\r
+            leftchar &= ((1 << leftbits) - 1);\r
+        }\r
+    }\r
+\r
+    if (leftbits != 0) {\r
+        PyBuffer_Release(&pascii);\r
+        PyErr_SetString(Error, "Incorrect padding");\r
+        Py_DECREF(rv);\r
+        return NULL;\r
+    }\r
+\r
+    /* And set string size correctly. If the result string is empty\r
+    ** (because the input was all invalid) return the shared empty\r
+    ** string instead; _PyString_Resize() won't do this for us.\r
+    */\r
+    if (bin_len > 0) {\r
+        /* rv is cleared on error */\r
+        (void)_PyString_Resize(&rv, bin_len);\r
+    }\r
+    else {\r
+        Py_DECREF(rv);\r
+        rv = PyString_FromStringAndSize("", 0);\r
+    }\r
+    PyBuffer_Release(&pascii);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_b2a_base64, "(bin) -> ascii. Base64-code line of data");\r
+\r
+static PyObject *\r
+binascii_b2a_base64(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t bin_len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:b2a_base64", &pbuf) )\r
+        return NULL;\r
+    bin_data = pbuf.buf;\r
+    bin_len = pbuf.len;\r
+\r
+    assert(bin_len >= 0);\r
+\r
+    if ( bin_len > BASE64_MAXBIN ) {\r
+        PyErr_SetString(Error, "Too much data for base64 line");\r
+        PyBuffer_Release(&pbuf);\r
+        return NULL;\r
+    }\r
+\r
+    /* We're lazy and allocate too much (fixed up later).\r
+       "+3" leaves room for up to two pad characters and a trailing\r
+       newline.  Note that 'b' gets encoded as 'Yg==\n' (1 in, 5 out). */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, bin_len*2 + 3)) == NULL ) {\r
+        PyBuffer_Release(&pbuf);\r
+        return NULL;\r
+    }\r
+    ascii_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    for( ; bin_len > 0 ; bin_len--, bin_data++ ) {\r
+        /* Shift the data into our buffer */\r
+        leftchar = (leftchar << 8) | *bin_data;\r
+        leftbits += 8;\r
+\r
+        /* See if there are 6-bit groups ready */\r
+        while ( leftbits >= 6 ) {\r
+            this_ch = (leftchar >> (leftbits-6)) & 0x3f;\r
+            leftbits -= 6;\r
+            *ascii_data++ = table_b2a_base64[this_ch];\r
+        }\r
+    }\r
+    if ( leftbits == 2 ) {\r
+        *ascii_data++ = table_b2a_base64[(leftchar&3) << 4];\r
+        *ascii_data++ = BASE64_PAD;\r
+        *ascii_data++ = BASE64_PAD;\r
+    } else if ( leftbits == 4 ) {\r
+        *ascii_data++ = table_b2a_base64[(leftchar&0xf) << 2];\r
+        *ascii_data++ = BASE64_PAD;\r
+    }\r
+    *ascii_data++ = '\n';       /* Append a courtesy newline */\r
+\r
+    /* rv is cleared on error */\r
+    (void)_PyString_Resize(&rv,\r
+                       (ascii_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv)));\r
+    PyBuffer_Release(&pbuf);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_a2b_hqx, "ascii -> bin, done. Decode .hqx coding");\r
+\r
+static PyObject *\r
+binascii_a2b_hqx(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pascii;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t len;\r
+    int done = 0;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:a2b_hqx", &pascii) )\r
+        return NULL;\r
+    ascii_data = pascii.buf;\r
+    len = pascii.len;\r
+\r
+    assert(len >= 0);\r
+\r
+    if (len > PY_SSIZE_T_MAX - 2) {\r
+        PyBuffer_Release(&pascii);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    /* Allocate a string that is too big (fixed later)\r
+       Add two to the initial length to prevent interning which\r
+       would preclude subsequent resizing.  */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, len+2)) == NULL ) {\r
+        PyBuffer_Release(&pascii);\r
+        return NULL;\r
+    }\r
+    bin_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    for( ; len > 0 ; len--, ascii_data++ ) {\r
+        /* Get the byte and look it up */\r
+        this_ch = table_a2b_hqx[*ascii_data];\r
+        if ( this_ch == SKIP )\r
+            continue;\r
+        if ( this_ch == FAIL ) {\r
+            PyErr_SetString(Error, "Illegal char");\r
+            PyBuffer_Release(&pascii);\r
+            Py_DECREF(rv);\r
+            return NULL;\r
+        }\r
+        if ( this_ch == DONE ) {\r
+            /* The terminating colon */\r
+            done = 1;\r
+            break;\r
+        }\r
+\r
+        /* Shift it into the buffer and see if any bytes are ready */\r
+        leftchar = (leftchar << 6) | (this_ch);\r
+        leftbits += 6;\r
+        if ( leftbits >= 8 ) {\r
+            leftbits -= 8;\r
+            *bin_data++ = (leftchar >> leftbits) & 0xff;\r
+            leftchar &= ((1 << leftbits) - 1);\r
+        }\r
+    }\r
+\r
+    if ( leftbits && !done ) {\r
+        PyErr_SetString(Incomplete,\r
+                        "String has incomplete number of bytes");\r
+        PyBuffer_Release(&pascii);\r
+        Py_DECREF(rv);\r
+        return NULL;\r
+    }\r
+    /* rv is cleared on error */\r
+    if (_PyString_Resize(&rv,\r
+                       (bin_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv))) == 0) {\r
+        PyObject *rrv = Py_BuildValue("Oi", rv, done);\r
+        PyBuffer_Release(&pascii);\r
+        Py_DECREF(rv);\r
+        return rrv;\r
+    }\r
+\r
+    PyBuffer_Release(&pascii);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(doc_rlecode_hqx, "Binhex RLE-code binary data");\r
+\r
+static PyObject *\r
+binascii_rlecode_hqx(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    unsigned char *in_data, *out_data;\r
+    PyObject *rv;\r
+    unsigned char ch;\r
+    Py_ssize_t in, inend, len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:rlecode_hqx", &pbuf) )\r
+        return NULL;\r
+    in_data = pbuf.buf;\r
+    len = pbuf.len;\r
+\r
+    assert(len >= 0);\r
+\r
+    if (len > PY_SSIZE_T_MAX / 2 - 2) {\r
+        PyBuffer_Release(&pbuf);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    /* Worst case: output is twice as big as input (fixed later) */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) {\r
+        PyBuffer_Release(&pbuf);\r
+        return NULL;\r
+    }\r
+    out_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    for( in=0; in<len; in++) {\r
+        ch = in_data[in];\r
+        if ( ch == RUNCHAR ) {\r
+            /* RUNCHAR. Escape it. */\r
+            *out_data++ = RUNCHAR;\r
+            *out_data++ = 0;\r
+        } else {\r
+            /* Check how many following are the same */\r
+            for(inend=in+1;\r
+                inend<len && in_data[inend] == ch &&\r
+                    inend < in+255;\r
+                inend++) ;\r
+            if ( inend - in > 3 ) {\r
+                /* More than 3 in a row. Output RLE. */\r
+                *out_data++ = ch;\r
+                *out_data++ = RUNCHAR;\r
+                *out_data++ = inend-in;\r
+                in = inend-1;\r
+            } else {\r
+                /* Less than 3. Output the byte itself */\r
+                *out_data++ = ch;\r
+            }\r
+        }\r
+    }\r
+    /* rv is cleared on error */\r
+    (void)_PyString_Resize(&rv,\r
+                       (out_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv)));\r
+    PyBuffer_Release(&pbuf);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_b2a_hqx, "Encode .hqx data");\r
+\r
+static PyObject *\r
+binascii_b2a_hqx(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pbin;\r
+    unsigned char *ascii_data, *bin_data;\r
+    int leftbits = 0;\r
+    unsigned char this_ch;\r
+    unsigned int leftchar = 0;\r
+    PyObject *rv;\r
+    Py_ssize_t len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:b2a_hqx", &pbin) )\r
+        return NULL;\r
+    bin_data = pbin.buf;\r
+    len = pbin.len;\r
+\r
+    assert(len >= 0);\r
+\r
+    if (len > PY_SSIZE_T_MAX / 2 - 2) {\r
+        PyBuffer_Release(&pbin);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    /* Allocate a buffer that is at least large enough */\r
+    if ( (rv=PyString_FromStringAndSize(NULL, len*2+2)) == NULL ) {\r
+        PyBuffer_Release(&pbin);\r
+        return NULL;\r
+    }\r
+    ascii_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    for( ; len > 0 ; len--, bin_data++ ) {\r
+        /* Shift into our buffer, and output any 6bits ready */\r
+        leftchar = (leftchar << 8) | *bin_data;\r
+        leftbits += 8;\r
+        while ( leftbits >= 6 ) {\r
+            this_ch = (leftchar >> (leftbits-6)) & 0x3f;\r
+            leftbits -= 6;\r
+            *ascii_data++ = table_b2a_hqx[this_ch];\r
+        }\r
+    }\r
+    /* Output a possible runt byte */\r
+    if ( leftbits ) {\r
+        leftchar <<= (6-leftbits);\r
+        *ascii_data++ = table_b2a_hqx[leftchar & 0x3f];\r
+    }\r
+    /* rv is cleared on error */\r
+    (void)_PyString_Resize(&rv,\r
+                       (ascii_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv)));\r
+    PyBuffer_Release(&pbin);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_rledecode_hqx, "Decode hexbin RLE-coded string");\r
+\r
+static PyObject *\r
+binascii_rledecode_hqx(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pin;\r
+    unsigned char *in_data, *out_data;\r
+    unsigned char in_byte, in_repeat;\r
+    PyObject *rv;\r
+    Py_ssize_t in_len, out_len, out_len_left;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*:rledecode_hqx", &pin) )\r
+        return NULL;\r
+    in_data = pin.buf;\r
+    in_len = pin.len;\r
+\r
+    assert(in_len >= 0);\r
+\r
+    /* Empty string is a special case */\r
+    if ( in_len == 0 ) {\r
+        PyBuffer_Release(&pin);\r
+        return PyString_FromStringAndSize("", 0);\r
+    }\r
+    else if (in_len > PY_SSIZE_T_MAX / 2) {\r
+        PyBuffer_Release(&pin);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    /* Allocate a buffer of reasonable size. Resized when needed */\r
+    out_len = in_len*2;\r
+    if ( (rv=PyString_FromStringAndSize(NULL, out_len)) == NULL ) {\r
+        PyBuffer_Release(&pin);\r
+        return NULL;\r
+    }\r
+    out_len_left = out_len;\r
+    out_data = (unsigned char *)PyString_AS_STRING(rv);\r
+\r
+    /*\r
+    ** We need two macros here to get/put bytes and handle\r
+    ** end-of-buffer for input and output strings.\r
+    */\r
+#define INBYTE(b) \\r
+    do { \\r
+             if ( --in_len < 0 ) { \\r
+                       PyErr_SetString(Incomplete, ""); \\r
+                       Py_DECREF(rv); \\r
+                       PyBuffer_Release(&pin); \\r
+                       return NULL; \\r
+             } \\r
+             b = *in_data++; \\r
+    } while(0)\r
+\r
+#define OUTBYTE(b) \\r
+    do { \\r
+             if ( --out_len_left < 0 ) { \\r
+                      if ( out_len > PY_SSIZE_T_MAX / 2) return PyErr_NoMemory(); \\r
+                      if (_PyString_Resize(&rv, 2*out_len) < 0) \\r
+                        { PyBuffer_Release(&pin); return NULL; } \\r
+                      out_data = (unsigned char *)PyString_AS_STRING(rv) \\r
+                                                             + out_len; \\r
+                      out_len_left = out_len-1; \\r
+                      out_len = out_len * 2; \\r
+             } \\r
+             *out_data++ = b; \\r
+    } while(0)\r
+\r
+        /*\r
+        ** Handle first byte separately (since we have to get angry\r
+        ** in case of an orphaned RLE code).\r
+        */\r
+        INBYTE(in_byte);\r
+\r
+    if (in_byte == RUNCHAR) {\r
+        INBYTE(in_repeat);\r
+        if (in_repeat != 0) {\r
+            /* Note Error, not Incomplete (which is at the end\r
+            ** of the string only). This is a programmer error.\r
+            */\r
+            PyErr_SetString(Error, "Orphaned RLE code at start");\r
+            PyBuffer_Release(&pin);\r
+            Py_DECREF(rv);\r
+            return NULL;\r
+        }\r
+        OUTBYTE(RUNCHAR);\r
+    } else {\r
+        OUTBYTE(in_byte);\r
+    }\r
+\r
+    while( in_len > 0 ) {\r
+        INBYTE(in_byte);\r
+\r
+        if (in_byte == RUNCHAR) {\r
+            INBYTE(in_repeat);\r
+            if ( in_repeat == 0 ) {\r
+                /* Just an escaped RUNCHAR value */\r
+                OUTBYTE(RUNCHAR);\r
+            } else {\r
+                /* Pick up value and output a sequence of it */\r
+                in_byte = out_data[-1];\r
+                while ( --in_repeat > 0 )\r
+                    OUTBYTE(in_byte);\r
+            }\r
+        } else {\r
+            /* Normal byte */\r
+            OUTBYTE(in_byte);\r
+        }\r
+    }\r
+    /* rv is cleared on error */\r
+    (void)_PyString_Resize(&rv,\r
+                       (out_data -\r
+                        (unsigned char *)PyString_AS_STRING(rv)));\r
+    PyBuffer_Release(&pin);\r
+    return rv;\r
+}\r
+\r
+PyDoc_STRVAR(doc_crc_hqx,\r
+"(data, oldcrc) -> newcrc. Compute hqx CRC incrementally");\r
+\r
+static PyObject *\r
+binascii_crc_hqx(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer pin;\r
+    unsigned char *bin_data;\r
+    unsigned int crc;\r
+    Py_ssize_t len;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*i:crc_hqx", &pin, &crc) )\r
+        return NULL;\r
+    bin_data = pin.buf;\r
+    len = pin.len;\r
+\r
+    while(len-- > 0) {\r
+        crc=((crc<<8)&0xff00)^crctab_hqx[((crc>>8)&0xff)^*bin_data++];\r
+    }\r
+\r
+    PyBuffer_Release(&pin);\r
+    return Py_BuildValue("i", crc);\r
+}\r
+\r
+PyDoc_STRVAR(doc_crc32,\r
+"(data, oldcrc = 0) -> newcrc. Compute CRC-32 incrementally");\r
+\r
+#ifdef USE_ZLIB_CRC32\r
+/* This was taken from zlibmodule.c PyZlib_crc32 (but is PY_SSIZE_T_CLEAN) */\r
+static PyObject *\r
+binascii_crc32(PyObject *self, PyObject *args)\r
+{\r
+    unsigned int crc32val = 0;  /* crc32(0L, Z_NULL, 0) */\r
+    Py_buffer pbuf;\r
+    Byte *buf;\r
+    Py_ssize_t len;\r
+    int signed_val;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|I:crc32", &pbuf, &crc32val))\r
+    return NULL;\r
+    /* In Python 2.x we return a signed integer regardless of native platform\r
+     * long size (the 32bit unsigned long is treated as 32-bit signed and sign\r
+     * extended into a 64-bit long inside the integer object).  3.0 does the\r
+     * right thing and returns unsigned. http://bugs.python.org/issue1202 */\r
+    buf = (Byte*)pbuf.buf;\r
+    len = pbuf.len;\r
+    signed_val = crc32(crc32val, buf, len);\r
+    PyBuffer_Release(&pbuf);\r
+    return PyInt_FromLong(signed_val);\r
+}\r
+#else  /* USE_ZLIB_CRC32 */\r
+/*  Crc - 32 BIT ANSI X3.66 CRC checksum files\r
+    Also known as: ISO 3307\r
+**********************************************************************|\r
+*                                                                    *|\r
+* Demonstration program to compute the 32-bit CRC used as the frame  *|\r
+* check sequence in ADCCP (ANSI X3.66, also known as FIPS PUB 71     *|\r
+* and FED-STD-1003, the U.S. versions of CCITT's X.25 link-level     *|\r
+* protocol).  The 32-bit FCS was added via the Federal Register,     *|\r
+* 1 June 1982, p.23798.  I presume but don't know for certain that   *|\r
+* this polynomial is or will be included in CCITT V.41, which        *|\r
+* defines the 16-bit CRC (often called CRC-CCITT) polynomial.  FIPS  *|\r
+* PUB 78 says that the 32-bit FCS reduces otherwise undetected       *|\r
+* errors by a factor of 10^-5 over 16-bit FCS.                       *|\r
+*                                                                    *|\r
+**********************************************************************|\r
+\r
+ Copyright (C) 1986 Gary S. Brown.  You may use this program, or\r
+ code or tables extracted from it, as desired without restriction.\r
+\r
+ First, the polynomial itself and its table of feedback terms.  The\r
+ polynomial is\r
+ X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0\r
+ Note that we take it "backwards" and put the highest-order term in\r
+ the lowest-order bit.  The X^32 term is "implied"; the LSB is the\r
+ X^31 term, etc.  The X^0 term (usually shown as "+1") results in\r
+ the MSB being 1.\r
+\r
+ Note that the usual hardware shift register implementation, which\r
+ is what we're using (we're merely optimizing it by doing eight-bit\r
+ chunks at a time) shifts bits into the lowest-order term.  In our\r
+ implementation, that means shifting towards the right.  Why do we\r
+ do it this way?  Because the calculated CRC must be transmitted in\r
+ order from highest-order term to lowest-order term.  UARTs transmit\r
+ characters in order from LSB to MSB.  By storing the CRC this way,\r
+ we hand it to the UART in the order low-byte to high-byte; the UART\r
+ sends each low-bit to hight-bit; and the result is transmission bit\r
+ by bit from highest- to lowest-order term without requiring any bit\r
+ shuffling on our part.  Reception works similarly.\r
+\r
+ The feedback terms table consists of 256, 32-bit entries.  Notes:\r
+\r
+  1. The table can be generated at runtime if desired; code to do so\r
+     is shown later.  It might not be obvious, but the feedback\r
+     terms simply represent the results of eight shift/xor opera-\r
+     tions for all combinations of data and CRC register values.\r
+\r
+  2. The CRC accumulation logic is the same for all CRC polynomials,\r
+     be they sixteen or thirty-two bits wide.  You simply choose the\r
+     appropriate table.  Alternatively, because the table can be\r
+     generated at runtime, you can start by generating the table for\r
+     the polynomial in question and use exactly the same "updcrc",\r
+     if your application needn't simultaneously handle two CRC\r
+     polynomials.  (Note, however, that XMODEM is strange.)\r
+\r
+  3. For 16-bit CRCs, the table entries need be only 16 bits wide;\r
+     of course, 32-bit entries work OK if the high 16 bits are zero.\r
+\r
+  4. The values must be right-shifted by eight bits by the "updcrc"\r
+     logic; the shift must be unsigned (bring in zeroes).  On some\r
+     hardware you could probably optimize the shift in assembler by\r
+     using byte-swap instructions.\r
+********************************************************************/\r
+\r
+static unsigned int crc_32_tab[256] = {\r
+0x00000000U, 0x77073096U, 0xee0e612cU, 0x990951baU, 0x076dc419U,\r
+0x706af48fU, 0xe963a535U, 0x9e6495a3U, 0x0edb8832U, 0x79dcb8a4U,\r
+0xe0d5e91eU, 0x97d2d988U, 0x09b64c2bU, 0x7eb17cbdU, 0xe7b82d07U,\r
+0x90bf1d91U, 0x1db71064U, 0x6ab020f2U, 0xf3b97148U, 0x84be41deU,\r
+0x1adad47dU, 0x6ddde4ebU, 0xf4d4b551U, 0x83d385c7U, 0x136c9856U,\r
+0x646ba8c0U, 0xfd62f97aU, 0x8a65c9ecU, 0x14015c4fU, 0x63066cd9U,\r
+0xfa0f3d63U, 0x8d080df5U, 0x3b6e20c8U, 0x4c69105eU, 0xd56041e4U,\r
+0xa2677172U, 0x3c03e4d1U, 0x4b04d447U, 0xd20d85fdU, 0xa50ab56bU,\r
+0x35b5a8faU, 0x42b2986cU, 0xdbbbc9d6U, 0xacbcf940U, 0x32d86ce3U,\r
+0x45df5c75U, 0xdcd60dcfU, 0xabd13d59U, 0x26d930acU, 0x51de003aU,\r
+0xc8d75180U, 0xbfd06116U, 0x21b4f4b5U, 0x56b3c423U, 0xcfba9599U,\r
+0xb8bda50fU, 0x2802b89eU, 0x5f058808U, 0xc60cd9b2U, 0xb10be924U,\r
+0x2f6f7c87U, 0x58684c11U, 0xc1611dabU, 0xb6662d3dU, 0x76dc4190U,\r
+0x01db7106U, 0x98d220bcU, 0xefd5102aU, 0x71b18589U, 0x06b6b51fU,\r
+0x9fbfe4a5U, 0xe8b8d433U, 0x7807c9a2U, 0x0f00f934U, 0x9609a88eU,\r
+0xe10e9818U, 0x7f6a0dbbU, 0x086d3d2dU, 0x91646c97U, 0xe6635c01U,\r
+0x6b6b51f4U, 0x1c6c6162U, 0x856530d8U, 0xf262004eU, 0x6c0695edU,\r
+0x1b01a57bU, 0x8208f4c1U, 0xf50fc457U, 0x65b0d9c6U, 0x12b7e950U,\r
+0x8bbeb8eaU, 0xfcb9887cU, 0x62dd1ddfU, 0x15da2d49U, 0x8cd37cf3U,\r
+0xfbd44c65U, 0x4db26158U, 0x3ab551ceU, 0xa3bc0074U, 0xd4bb30e2U,\r
+0x4adfa541U, 0x3dd895d7U, 0xa4d1c46dU, 0xd3d6f4fbU, 0x4369e96aU,\r
+0x346ed9fcU, 0xad678846U, 0xda60b8d0U, 0x44042d73U, 0x33031de5U,\r
+0xaa0a4c5fU, 0xdd0d7cc9U, 0x5005713cU, 0x270241aaU, 0xbe0b1010U,\r
+0xc90c2086U, 0x5768b525U, 0x206f85b3U, 0xb966d409U, 0xce61e49fU,\r
+0x5edef90eU, 0x29d9c998U, 0xb0d09822U, 0xc7d7a8b4U, 0x59b33d17U,\r
+0x2eb40d81U, 0xb7bd5c3bU, 0xc0ba6cadU, 0xedb88320U, 0x9abfb3b6U,\r
+0x03b6e20cU, 0x74b1d29aU, 0xead54739U, 0x9dd277afU, 0x04db2615U,\r
+0x73dc1683U, 0xe3630b12U, 0x94643b84U, 0x0d6d6a3eU, 0x7a6a5aa8U,\r
+0xe40ecf0bU, 0x9309ff9dU, 0x0a00ae27U, 0x7d079eb1U, 0xf00f9344U,\r
+0x8708a3d2U, 0x1e01f268U, 0x6906c2feU, 0xf762575dU, 0x806567cbU,\r
+0x196c3671U, 0x6e6b06e7U, 0xfed41b76U, 0x89d32be0U, 0x10da7a5aU,\r
+0x67dd4accU, 0xf9b9df6fU, 0x8ebeeff9U, 0x17b7be43U, 0x60b08ed5U,\r
+0xd6d6a3e8U, 0xa1d1937eU, 0x38d8c2c4U, 0x4fdff252U, 0xd1bb67f1U,\r
+0xa6bc5767U, 0x3fb506ddU, 0x48b2364bU, 0xd80d2bdaU, 0xaf0a1b4cU,\r
+0x36034af6U, 0x41047a60U, 0xdf60efc3U, 0xa867df55U, 0x316e8eefU,\r
+0x4669be79U, 0xcb61b38cU, 0xbc66831aU, 0x256fd2a0U, 0x5268e236U,\r
+0xcc0c7795U, 0xbb0b4703U, 0x220216b9U, 0x5505262fU, 0xc5ba3bbeU,\r
+0xb2bd0b28U, 0x2bb45a92U, 0x5cb36a04U, 0xc2d7ffa7U, 0xb5d0cf31U,\r
+0x2cd99e8bU, 0x5bdeae1dU, 0x9b64c2b0U, 0xec63f226U, 0x756aa39cU,\r
+0x026d930aU, 0x9c0906a9U, 0xeb0e363fU, 0x72076785U, 0x05005713U,\r
+0x95bf4a82U, 0xe2b87a14U, 0x7bb12baeU, 0x0cb61b38U, 0x92d28e9bU,\r
+0xe5d5be0dU, 0x7cdcefb7U, 0x0bdbdf21U, 0x86d3d2d4U, 0xf1d4e242U,\r
+0x68ddb3f8U, 0x1fda836eU, 0x81be16cdU, 0xf6b9265bU, 0x6fb077e1U,\r
+0x18b74777U, 0x88085ae6U, 0xff0f6a70U, 0x66063bcaU, 0x11010b5cU,\r
+0x8f659effU, 0xf862ae69U, 0x616bffd3U, 0x166ccf45U, 0xa00ae278U,\r
+0xd70dd2eeU, 0x4e048354U, 0x3903b3c2U, 0xa7672661U, 0xd06016f7U,\r
+0x4969474dU, 0x3e6e77dbU, 0xaed16a4aU, 0xd9d65adcU, 0x40df0b66U,\r
+0x37d83bf0U, 0xa9bcae53U, 0xdebb9ec5U, 0x47b2cf7fU, 0x30b5ffe9U,\r
+0xbdbdf21cU, 0xcabac28aU, 0x53b39330U, 0x24b4a3a6U, 0xbad03605U,\r
+0xcdd70693U, 0x54de5729U, 0x23d967bfU, 0xb3667a2eU, 0xc4614ab8U,\r
+0x5d681b02U, 0x2a6f2b94U, 0xb40bbe37U, 0xc30c8ea1U, 0x5a05df1bU,\r
+0x2d02ef8dU\r
+};\r
+\r
+static PyObject *\r
+binascii_crc32(PyObject *self, PyObject *args)\r
+{ /* By Jim Ahlstrom; All rights transferred to CNRI */\r
+    Py_buffer pbin;\r
+    unsigned char *bin_data;\r
+    unsigned int crc = 0U;      /* initial value of CRC */\r
+    Py_ssize_t len;\r
+    int result;\r
+\r
+    if ( !PyArg_ParseTuple(args, "s*|I:crc32", &pbin, &crc) )\r
+        return NULL;\r
+    bin_data = pbin.buf;\r
+    len = pbin.len;\r
+\r
+    crc = ~ crc;\r
+    while (len-- > 0)\r
+        crc = crc_32_tab[(crc ^ *bin_data++) & 0xffU] ^ (crc >> 8);\r
+        /* Note:  (crc >> 8) MUST zero fill on left */\r
+\r
+    result = (int)(crc ^ 0xFFFFFFFFU);\r
+    PyBuffer_Release(&pbin);\r
+    return PyInt_FromLong(result);\r
+}\r
+#endif  /* USE_ZLIB_CRC32 */\r
+\r
+\r
+static PyObject *\r
+binascii_hexlify(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer parg;\r
+    char* argbuf;\r
+    Py_ssize_t arglen;\r
+    PyObject *retval;\r
+    char* retbuf;\r
+    Py_ssize_t i, j;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:b2a_hex", &parg))\r
+        return NULL;\r
+    argbuf = parg.buf;\r
+    arglen = parg.len;\r
+\r
+    assert(arglen >= 0);\r
+    if (arglen > PY_SSIZE_T_MAX / 2) {\r
+        PyBuffer_Release(&parg);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    retval = PyString_FromStringAndSize(NULL, arglen*2);\r
+    if (!retval) {\r
+        PyBuffer_Release(&parg);\r
+        return NULL;\r
+    }\r
+    retbuf = PyString_AS_STRING(retval);\r
+\r
+    /* make hex version of string, taken from shamodule.c */\r
+    for (i=j=0; i < arglen; i++) {\r
+        char c;\r
+        c = (argbuf[i] >> 4) & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        retbuf[j++] = c;\r
+        c = argbuf[i] & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        retbuf[j++] = c;\r
+    }\r
+    PyBuffer_Release(&parg);\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(doc_hexlify,\r
+"b2a_hex(data) -> s; Hexadecimal representation of binary data.\n\\r
+\n\\r
+This function is also available as \"hexlify()\".");\r
+\r
+\r
+static int\r
+to_int(int c)\r
+{\r
+    if (isdigit(c))\r
+        return c - '0';\r
+    else {\r
+        if (Py_ISUPPER(c))\r
+            c = Py_TOLOWER(c);\r
+        if (c >= 'a' && c <= 'f')\r
+            return c - 'a' + 10;\r
+    }\r
+    return -1;\r
+}\r
+\r
+\r
+static PyObject *\r
+binascii_unhexlify(PyObject *self, PyObject *args)\r
+{\r
+    Py_buffer parg;\r
+    char* argbuf;\r
+    Py_ssize_t arglen;\r
+    PyObject *retval;\r
+    char* retbuf;\r
+    Py_ssize_t i, j;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:a2b_hex", &parg))\r
+        return NULL;\r
+    argbuf = parg.buf;\r
+    arglen = parg.len;\r
+\r
+    assert(arglen >= 0);\r
+\r
+    /* XXX What should we do about strings with an odd length?  Should\r
+     * we add an implicit leading zero, or a trailing zero?  For now,\r
+     * raise an exception.\r
+     */\r
+    if (arglen % 2) {\r
+        PyBuffer_Release(&parg);\r
+        PyErr_SetString(PyExc_TypeError, "Odd-length string");\r
+        return NULL;\r
+    }\r
+\r
+    retval = PyString_FromStringAndSize(NULL, (arglen/2));\r
+    if (!retval) {\r
+        PyBuffer_Release(&parg);\r
+        return NULL;\r
+    }\r
+    retbuf = PyString_AS_STRING(retval);\r
+\r
+    for (i=j=0; i < arglen; i += 2) {\r
+        int top = to_int(Py_CHARMASK(argbuf[i]));\r
+        int bot = to_int(Py_CHARMASK(argbuf[i+1]));\r
+        if (top == -1 || bot == -1) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                            "Non-hexadecimal digit found");\r
+            goto finally;\r
+        }\r
+        retbuf[j++] = (top << 4) + bot;\r
+    }\r
+    PyBuffer_Release(&parg);\r
+    return retval;\r
+\r
+  finally:\r
+    PyBuffer_Release(&parg);\r
+    Py_DECREF(retval);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(doc_unhexlify,\r
+"a2b_hex(hexstr) -> s; Binary data of hexadecimal representation.\n\\r
+\n\\r
+hexstr must contain an even number of hex digits (upper or lower case).\n\\r
+This function is also available as \"unhexlify()\"");\r
+\r
+static int table_hex[128] = {\r
+  -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+  -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+  -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+   0, 1, 2, 3,  4, 5, 6, 7,  8, 9,-1,-1, -1,-1,-1,-1,\r
+  -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+  -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+  -1,10,11,12, 13,14,15,-1, -1,-1,-1,-1, -1,-1,-1,-1,\r
+  -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1\r
+};\r
+\r
+#define hexval(c) table_hex[(unsigned int)(c)]\r
+\r
+#define MAXLINESIZE 76\r
+\r
+PyDoc_STRVAR(doc_a2b_qp, "Decode a string of qp-encoded data");\r
+\r
+static PyObject*\r
+binascii_a2b_qp(PyObject *self, PyObject *args, PyObject *kwargs)\r
+{\r
+    Py_ssize_t in, out;\r
+    char ch;\r
+    Py_buffer pdata;\r
+    unsigned char *data, *odata;\r
+    Py_ssize_t datalen = 0;\r
+    PyObject *rv;\r
+    static char *kwlist[] = {"data", "header", NULL};\r
+    int header = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i", kwlist, &pdata,\r
+          &header))\r
+        return NULL;\r
+    data = pdata.buf;\r
+    datalen = pdata.len;\r
+\r
+    /* We allocate the output same size as input, this is overkill.\r
+     * The previous implementation used calloc() so we'll zero out the\r
+     * memory here too, since PyMem_Malloc() does not guarantee that.\r
+     */\r
+    odata = (unsigned char *) PyMem_Malloc(datalen);\r
+    if (odata == NULL) {\r
+        PyBuffer_Release(&pdata);\r
+        PyErr_NoMemory();\r
+        return NULL;\r
+    }\r
+    memset(odata, 0, datalen);\r
+\r
+    in = out = 0;\r
+    while (in < datalen) {\r
+        if (data[in] == '=') {\r
+            in++;\r
+            if (in >= datalen) break;\r
+            /* Soft line breaks */\r
+            if ((data[in] == '\n') || (data[in] == '\r')) {\r
+                if (data[in] != '\n') {\r
+                    while (in < datalen && data[in] != '\n') in++;\r
+                }\r
+                if (in < datalen) in++;\r
+            }\r
+            else if (data[in] == '=') {\r
+                /* broken case from broken python qp */\r
+                odata[out++] = '=';\r
+                in++;\r
+            }\r
+            else if (((data[in] >= 'A' && data[in] <= 'F') ||\r
+                      (data[in] >= 'a' && data[in] <= 'f') ||\r
+                      (data[in] >= '0' && data[in] <= '9')) &&\r
+                     ((data[in+1] >= 'A' && data[in+1] <= 'F') ||\r
+                      (data[in+1] >= 'a' && data[in+1] <= 'f') ||\r
+                      (data[in+1] >= '0' && data[in+1] <= '9'))) {\r
+                /* hexval */\r
+                ch = hexval(data[in]) << 4;\r
+                in++;\r
+                ch |= hexval(data[in]);\r
+                in++;\r
+                odata[out++] = ch;\r
+            }\r
+            else {\r
+              odata[out++] = '=';\r
+            }\r
+        }\r
+        else if (header && data[in] == '_') {\r
+            odata[out++] = ' ';\r
+            in++;\r
+        }\r
+        else {\r
+            odata[out] = data[in];\r
+            in++;\r
+            out++;\r
+        }\r
+    }\r
+    if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {\r
+        PyBuffer_Release(&pdata);\r
+        PyMem_Free(odata);\r
+        return NULL;\r
+    }\r
+    PyBuffer_Release(&pdata);\r
+    PyMem_Free(odata);\r
+    return rv;\r
+}\r
+\r
+static int\r
+to_hex (unsigned char ch, unsigned char *s)\r
+{\r
+    unsigned int uvalue = ch;\r
+\r
+    s[1] = "0123456789ABCDEF"[uvalue % 16];\r
+    uvalue = (uvalue / 16);\r
+    s[0] = "0123456789ABCDEF"[uvalue % 16];\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(doc_b2a_qp,\r
+"b2a_qp(data, quotetabs=0, istext=1, header=0) -> s; \n\\r
+ Encode a string using quoted-printable encoding. \n\\r
+\n\\r
+On encoding, when istext is set, newlines are not encoded, and white \n\\r
+space at end of lines is.  When istext is not set, \\r and \\n (CR/LF) are \n\\r
+both encoded.  When quotetabs is set, space and tabs are encoded.");\r
+\r
+/* XXX: This is ridiculously complicated to be backward compatible\r
+ * (mostly) with the quopri module.  It doesn't re-create the quopri\r
+ * module bug where text ending in CRLF has the CR encoded */\r
+static PyObject*\r
+binascii_b2a_qp (PyObject *self, PyObject *args, PyObject *kwargs)\r
+{\r
+    Py_ssize_t in, out;\r
+    Py_buffer pdata;\r
+    unsigned char *data, *odata;\r
+    Py_ssize_t datalen = 0, odatalen = 0;\r
+    PyObject *rv;\r
+    unsigned int linelen = 0;\r
+    static char *kwlist[] = {"data", "quotetabs", "istext",\r
+                                   "header", NULL};\r
+    int istext = 1;\r
+    int quotetabs = 0;\r
+    int header = 0;\r
+    unsigned char ch;\r
+    int crlf = 0;\r
+    unsigned char *p;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|iii", kwlist, &pdata,\r
+          &quotetabs, &istext, &header))\r
+        return NULL;\r
+    data = pdata.buf;\r
+    datalen = pdata.len;\r
+\r
+    /* See if this string is using CRLF line ends */\r
+    /* XXX: this function has the side effect of converting all of\r
+     * the end of lines to be the same depending on this detection\r
+     * here */\r
+    p = (unsigned char *) memchr(data, '\n', datalen);\r
+    if ((p != NULL) && (p > data) && (*(p-1) == '\r'))\r
+        crlf = 1;\r
+\r
+    /* First, scan to see how many characters need to be encoded */\r
+    in = 0;\r
+    while (in < datalen) {\r
+        if ((data[in] > 126) ||\r
+            (data[in] == '=') ||\r
+            (header && data[in] == '_') ||\r
+            ((data[in] == '.') && (linelen == 0) &&\r
+             (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||\r
+            (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||\r
+            ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||\r
+            ((data[in] < 33) &&\r
+             (data[in] != '\r') && (data[in] != '\n') &&\r
+             (quotetabs ||\r
+            (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))\r
+        {\r
+            if ((linelen + 3) >= MAXLINESIZE) {\r
+                linelen = 0;\r
+                if (crlf)\r
+                    odatalen += 3;\r
+                else\r
+                    odatalen += 2;\r
+            }\r
+            linelen += 3;\r
+            odatalen += 3;\r
+            in++;\r
+        }\r
+        else {\r
+            if (istext &&\r
+                ((data[in] == '\n') ||\r
+                 ((in+1 < datalen) && (data[in] == '\r') &&\r
+                 (data[in+1] == '\n'))))\r
+            {\r
+                linelen = 0;\r
+                /* Protect against whitespace on end of line */\r
+                if (in && ((data[in-1] == ' ') || (data[in-1] == '\t')))\r
+                    odatalen += 2;\r
+                if (crlf)\r
+                    odatalen += 2;\r
+                else\r
+                    odatalen += 1;\r
+                if (data[in] == '\r')\r
+                    in += 2;\r
+                else\r
+                    in++;\r
+            }\r
+            else {\r
+                if ((in + 1 != datalen) &&\r
+                    (data[in+1] != '\n') &&\r
+                    (linelen + 1) >= MAXLINESIZE) {\r
+                    linelen = 0;\r
+                    if (crlf)\r
+                        odatalen += 3;\r
+                    else\r
+                        odatalen += 2;\r
+                }\r
+                linelen++;\r
+                odatalen++;\r
+                in++;\r
+            }\r
+        }\r
+    }\r
+\r
+    /* We allocate the output same size as input, this is overkill.\r
+     * The previous implementation used calloc() so we'll zero out the\r
+     * memory here too, since PyMem_Malloc() does not guarantee that.\r
+     */\r
+    odata = (unsigned char *) PyMem_Malloc(odatalen);\r
+    if (odata == NULL) {\r
+        PyBuffer_Release(&pdata);\r
+        PyErr_NoMemory();\r
+        return NULL;\r
+    }\r
+    memset(odata, 0, odatalen);\r
+\r
+    in = out = linelen = 0;\r
+    while (in < datalen) {\r
+        if ((data[in] > 126) ||\r
+            (data[in] == '=') ||\r
+            (header && data[in] == '_') ||\r
+            ((data[in] == '.') && (linelen == 0) &&\r
+             (data[in+1] == '\n' || data[in+1] == '\r' || data[in+1] == 0)) ||\r
+            (!istext && ((data[in] == '\r') || (data[in] == '\n'))) ||\r
+            ((data[in] == '\t' || data[in] == ' ') && (in + 1 == datalen)) ||\r
+            ((data[in] < 33) &&\r
+             (data[in] != '\r') && (data[in] != '\n') &&\r
+             (quotetabs ||\r
+            (!quotetabs && ((data[in] != '\t') && (data[in] != ' '))))))\r
+        {\r
+            if ((linelen + 3 )>= MAXLINESIZE) {\r
+                odata[out++] = '=';\r
+                if (crlf) odata[out++] = '\r';\r
+                odata[out++] = '\n';\r
+                linelen = 0;\r
+            }\r
+            odata[out++] = '=';\r
+            to_hex(data[in], &odata[out]);\r
+            out += 2;\r
+            in++;\r
+            linelen += 3;\r
+        }\r
+        else {\r
+            if (istext &&\r
+                ((data[in] == '\n') ||\r
+                 ((in+1 < datalen) && (data[in] == '\r') &&\r
+                 (data[in+1] == '\n'))))\r
+            {\r
+                linelen = 0;\r
+                /* Protect against whitespace on end of line */\r
+                if (out && ((odata[out-1] == ' ') || (odata[out-1] == '\t'))) {\r
+                    ch = odata[out-1];\r
+                    odata[out-1] = '=';\r
+                    to_hex(ch, &odata[out]);\r
+                    out += 2;\r
+                }\r
+\r
+                if (crlf) odata[out++] = '\r';\r
+                odata[out++] = '\n';\r
+                if (data[in] == '\r')\r
+                    in += 2;\r
+                else\r
+                    in++;\r
+            }\r
+            else {\r
+                if ((in + 1 != datalen) &&\r
+                    (data[in+1] != '\n') &&\r
+                    (linelen + 1) >= MAXLINESIZE) {\r
+                    odata[out++] = '=';\r
+                    if (crlf) odata[out++] = '\r';\r
+                    odata[out++] = '\n';\r
+                    linelen = 0;\r
+                }\r
+                linelen++;\r
+                if (header && data[in] == ' ') {\r
+                    odata[out++] = '_';\r
+                    in++;\r
+                }\r
+                else {\r
+                    odata[out++] = data[in++];\r
+                }\r
+            }\r
+        }\r
+    }\r
+    if ((rv = PyString_FromStringAndSize((char *)odata, out)) == NULL) {\r
+        PyBuffer_Release(&pdata);\r
+        PyMem_Free(odata);\r
+        return NULL;\r
+    }\r
+    PyBuffer_Release(&pdata);\r
+    PyMem_Free(odata);\r
+    return rv;\r
+}\r
+\r
+/* List of functions defined in the module */\r
+\r
+static struct PyMethodDef binascii_module_methods[] = {\r
+    {"a2b_uu",     binascii_a2b_uu,     METH_VARARGS, doc_a2b_uu},\r
+    {"b2a_uu",     binascii_b2a_uu,     METH_VARARGS, doc_b2a_uu},\r
+    {"a2b_base64", binascii_a2b_base64, METH_VARARGS, doc_a2b_base64},\r
+    {"b2a_base64", binascii_b2a_base64, METH_VARARGS, doc_b2a_base64},\r
+    {"a2b_hqx",    binascii_a2b_hqx,    METH_VARARGS, doc_a2b_hqx},\r
+    {"b2a_hqx",    binascii_b2a_hqx,    METH_VARARGS, doc_b2a_hqx},\r
+    {"b2a_hex",    binascii_hexlify,    METH_VARARGS, doc_hexlify},\r
+    {"a2b_hex",    binascii_unhexlify,  METH_VARARGS, doc_unhexlify},\r
+    {"hexlify",    binascii_hexlify,    METH_VARARGS, doc_hexlify},\r
+    {"unhexlify",  binascii_unhexlify,  METH_VARARGS, doc_unhexlify},\r
+    {"rlecode_hqx",   binascii_rlecode_hqx, METH_VARARGS, doc_rlecode_hqx},\r
+    {"rledecode_hqx", binascii_rledecode_hqx, METH_VARARGS,\r
+     doc_rledecode_hqx},\r
+    {"crc_hqx",    binascii_crc_hqx,    METH_VARARGS, doc_crc_hqx},\r
+    {"crc32",      binascii_crc32,      METH_VARARGS, doc_crc32},\r
+    {"a2b_qp", (PyCFunction)binascii_a2b_qp, METH_VARARGS | METH_KEYWORDS,\r
+      doc_a2b_qp},\r
+    {"b2a_qp", (PyCFunction)binascii_b2a_qp, METH_VARARGS | METH_KEYWORDS,\r
+      doc_b2a_qp},\r
+    {NULL, NULL}                             /* sentinel */\r
+};\r
+\r
+\r
+/* Initialization function for the module (*must* be called initbinascii) */\r
+PyDoc_STRVAR(doc_binascii, "Conversion between binary data and ASCII");\r
+\r
+PyMODINIT_FUNC\r
+initbinascii(void)\r
+{\r
+    PyObject *m, *d, *x;\r
+\r
+    /* Create the module and add the functions */\r
+    m = Py_InitModule("binascii", binascii_module_methods);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    d = PyModule_GetDict(m);\r
+    x = PyString_FromString(doc_binascii);\r
+    PyDict_SetItemString(d, "__doc__", x);\r
+    Py_XDECREF(x);\r
+\r
+    Error = PyErr_NewException("binascii.Error", NULL, NULL);\r
+    PyDict_SetItemString(d, "Error", Error);\r
+    Incomplete = PyErr_NewException("binascii.Incomplete", NULL, NULL);\r
+    PyDict_SetItemString(d, "Incomplete", Incomplete);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cPickle.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cPickle.c
new file mode 100644 (file)
index 0000000..11fb895
--- /dev/null
@@ -0,0 +1,6058 @@
+#include "Python.h"\r
+#include "cStringIO.h"\r
+#include "structmember.h"\r
+\r
+PyDoc_STRVAR(cPickle_module_documentation,\r
+"C implementation and optimization of the Python pickle module.");\r
+\r
+#ifndef Py_eval_input\r
+#include <graminit.h>\r
+#define Py_eval_input eval_input\r
+#endif /* Py_eval_input */\r
+\r
+#define DEL_LIST_SLICE(list, from, to) (PyList_SetSlice(list, from, to, NULL))\r
+\r
+#define WRITE_BUF_SIZE 256\r
+\r
+/* Bump this when new opcodes are added to the pickle protocol. */\r
+#define HIGHEST_PROTOCOL 2\r
+\r
+/*\r
+ * Note: The UNICODE macro controls the TCHAR meaning of the win32 API. Since\r
+ * all headers have already been included here, we can safely redefine it.\r
+ */\r
+#ifdef UNICODE\r
+#  undef UNICODE\r
+#endif\r
+\r
+/*\r
+ * Pickle opcodes.  These must be kept in synch with pickle.py.  Extensive\r
+ * docs are in pickletools.py.\r
+ */\r
+#define MARK        '('\r
+#define STOP        '.'\r
+#define POP         '0'\r
+#define POP_MARK    '1'\r
+#define DUP         '2'\r
+#define FLOAT       'F'\r
+#define BINFLOAT    'G'\r
+#define INT         'I'\r
+#define BININT      'J'\r
+#define BININT1     'K'\r
+#define LONG        'L'\r
+#define BININT2     'M'\r
+#define NONE        'N'\r
+#define PERSID      'P'\r
+#define BINPERSID   'Q'\r
+#define REDUCE      'R'\r
+#define STRING      'S'\r
+#define BINSTRING   'T'\r
+#define SHORT_BINSTRING 'U'\r
+#define UNICODE     'V'\r
+#define BINUNICODE  'X'\r
+#define APPEND      'a'\r
+#define BUILD       'b'\r
+#define GLOBAL      'c'\r
+#define DICT        'd'\r
+#define EMPTY_DICT  '}'\r
+#define APPENDS     'e'\r
+#define GET         'g'\r
+#define BINGET      'h'\r
+#define INST        'i'\r
+#define LONG_BINGET 'j'\r
+#define LIST        'l'\r
+#define EMPTY_LIST  ']'\r
+#define OBJ         'o'\r
+#define PUT         'p'\r
+#define BINPUT      'q'\r
+#define LONG_BINPUT 'r'\r
+#define SETITEM     's'\r
+#define TUPLE       't'\r
+#define EMPTY_TUPLE ')'\r
+#define SETITEMS    'u'\r
+\r
+/* Protocol 2. */\r
+#define PROTO    '\x80' /* identify pickle protocol */\r
+#define NEWOBJ   '\x81' /* build object by applying cls.__new__ to argtuple */\r
+#define EXT1     '\x82' /* push object from extension registry; 1-byte index */\r
+#define EXT2     '\x83' /* ditto, but 2-byte index */\r
+#define EXT4     '\x84' /* ditto, but 4-byte index */\r
+#define TUPLE1   '\x85' /* build 1-tuple from stack top */\r
+#define TUPLE2   '\x86' /* build 2-tuple from two topmost stack items */\r
+#define TUPLE3   '\x87' /* build 3-tuple from three topmost stack items */\r
+#define NEWTRUE  '\x88' /* push True */\r
+#define NEWFALSE '\x89' /* push False */\r
+#define LONG1    '\x8a' /* push long from < 256 bytes */\r
+#define LONG4    '\x8b' /* push really big long */\r
+\r
+/* There aren't opcodes -- they're ways to pickle bools before protocol 2,\r
+ * so that unpicklers written before bools were introduced unpickle them\r
+ * as ints, but unpicklers after can recognize that bools were intended.\r
+ * Note that protocol 2 added direct ways to pickle bools.\r
+ */\r
+#undef TRUE\r
+#define TRUE        "I01\n"\r
+#undef FALSE\r
+#define FALSE       "I00\n"\r
+\r
+/* Keep in synch with pickle.Pickler._BATCHSIZE.  This is how many elements\r
+ * batch_list/dict() pumps out before doing APPENDS/SETITEMS.  Nothing will\r
+ * break if this gets out of synch with pickle.py, but it's unclear that\r
+ * would help anything either.\r
+ */\r
+#define BATCHSIZE 1000\r
+\r
+static char MARKv = MARK;\r
+\r
+static PyObject *PickleError;\r
+static PyObject *PicklingError;\r
+static PyObject *UnpickleableError;\r
+static PyObject *UnpicklingError;\r
+static PyObject *BadPickleGet;\r
+\r
+/* As the name says, an empty tuple. */\r
+static PyObject *empty_tuple;\r
+\r
+/* copy_reg.dispatch_table, {type_object: pickling_function} */\r
+static PyObject *dispatch_table;\r
+\r
+/* For EXT[124] opcodes. */\r
+/* copy_reg._extension_registry, {(module_name, function_name): code} */\r
+static PyObject *extension_registry;\r
+/* copy_reg._inverted_registry, {code: (module_name, function_name)} */\r
+static PyObject *inverted_registry;\r
+/* copy_reg._extension_cache, {code: object} */\r
+static PyObject *extension_cache;\r
+\r
+/* For looking up name pairs in copy_reg._extension_registry. */\r
+static PyObject *two_tuple;\r
+\r
+static PyObject *__class___str, *__getinitargs___str, *__dict___str,\r
+  *__getstate___str, *__setstate___str, *__name___str, *__reduce___str,\r
+  *__reduce_ex___str,\r
+  *write_str, *append_str,\r
+  *read_str, *readline_str, *__main___str,\r
+  *dispatch_table_str;\r
+\r
+/*************************************************************************\r
+ Internal Data type for pickle data.                                     */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t length;  /* number of initial slots in data currently used */\r
+    Py_ssize_t size;    /* number of slots in data allocated */\r
+    PyObject **data;\r
+} Pdata;\r
+\r
+static void\r
+Pdata_dealloc(Pdata *self)\r
+{\r
+    Py_ssize_t i;\r
+    PyObject **p;\r
+\r
+    for (i = self->length, p = self->data; --i >= 0; p++) {\r
+        Py_DECREF(*p);\r
+    }\r
+    if (self->data)\r
+        free(self->data);\r
+    PyObject_Del(self);\r
+}\r
+\r
+static PyTypeObject PdataType = {\r
+    PyVarObject_HEAD_INIT(NULL, 0) "cPickle.Pdata", sizeof(Pdata), 0,\r
+    (destructor)Pdata_dealloc,\r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0L,0L,0L,0L, ""\r
+};\r
+\r
+#define Pdata_Check(O) (Py_TYPE(O) == &PdataType)\r
+\r
+static PyObject *\r
+Pdata_New(void)\r
+{\r
+    Pdata *self;\r
+\r
+    if (!(self = PyObject_New(Pdata, &PdataType)))\r
+        return NULL;\r
+    self->size = 8;\r
+    self->length = 0;\r
+    self->data = malloc(self->size * sizeof(PyObject*));\r
+    if (self->data)\r
+        return (PyObject*)self;\r
+    Py_DECREF(self);\r
+    return PyErr_NoMemory();\r
+}\r
+\r
+static int\r
+stackUnderflow(void)\r
+{\r
+    PyErr_SetString(UnpicklingError, "unpickling stack underflow");\r
+    return -1;\r
+}\r
+\r
+/* Retain only the initial clearto items.  If clearto >= the current\r
+ * number of items, this is a (non-erroneous) NOP.\r
+ */\r
+static int\r
+Pdata_clear(Pdata *self, Py_ssize_t clearto)\r
+{\r
+    Py_ssize_t i;\r
+    PyObject **p;\r
+\r
+    if (clearto < 0) return stackUnderflow();\r
+    if (clearto >= self->length) return 0;\r
+\r
+    for (i = self->length, p = self->data + clearto;\r
+         --i >= clearto;\r
+         p++) {\r
+        Py_CLEAR(*p);\r
+    }\r
+    self->length = clearto;\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+Pdata_grow(Pdata *self)\r
+{\r
+    Py_ssize_t bigger;\r
+    Py_ssize_t nbytes;\r
+\r
+    PyObject **tmp;\r
+\r
+    if (self->size > (PY_SSIZE_T_MAX >> 1))\r
+        goto nomemory;\r
+    bigger = self->size << 1;\r
+    if (bigger > (PY_SSIZE_T_MAX / sizeof(PyObject *)))\r
+        goto nomemory;\r
+    nbytes = bigger * sizeof(PyObject *);\r
+    tmp = realloc(self->data, nbytes);\r
+    if (tmp == NULL)\r
+        goto nomemory;\r
+    self->data = tmp;\r
+    self->size = bigger;\r
+    return 0;\r
+\r
+  nomemory:\r
+    PyErr_NoMemory();\r
+    return -1;\r
+}\r
+\r
+/* D is a Pdata*.  Pop the topmost element and store it into V, which\r
+ * must be an lvalue holding PyObject*.  On stack underflow, UnpicklingError\r
+ * is raised and V is set to NULL.  D and V may be evaluated several times.\r
+ */\r
+#define PDATA_POP(D, V) {                                       \\r
+    if ((D)->length)                                            \\r
+        (V) = (D)->data[--((D)->length)];                       \\r
+    else {                                                      \\r
+        PyErr_SetString(UnpicklingError, "bad pickle data");            \\r
+        (V) = NULL;                                             \\r
+    }                                                           \\r
+}\r
+\r
+/* PDATA_PUSH and PDATA_APPEND both push rvalue PyObject* O on to Pdata*\r
+ * D.  If the Pdata stack can't be grown to hold the new value, both\r
+ * raise MemoryError and execute "return ER".  The difference is in ownership\r
+ * of O after:  _PUSH transfers ownership of O from the caller to the stack\r
+ * (no incref of O is done, and in case of error O is decrefed), while\r
+ * _APPEND pushes a new reference.\r
+ */\r
+\r
+/* Push O on stack D, giving ownership of O to the stack. */\r
+#define PDATA_PUSH(D, O, ER) {                                  \\r
+    if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&         \\r
+        Pdata_grow((Pdata*)(D)) < 0) {                          \\r
+        Py_DECREF(O);                                           \\r
+        return ER;                                              \\r
+    }                                                           \\r
+    ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);         \\r
+}\r
+\r
+/* Push O on stack D, pushing a new reference. */\r
+#define PDATA_APPEND(D, O, ER) {                                \\r
+    if (((Pdata*)(D))->length == ((Pdata*)(D))->size &&         \\r
+        Pdata_grow((Pdata*)(D)) < 0)                            \\r
+        return ER;                                              \\r
+    Py_INCREF(O);                                               \\r
+    ((Pdata*)(D))->data[((Pdata*)(D))->length++] = (O);         \\r
+}\r
+\r
+\r
+static PyObject *\r
+Pdata_popTuple(Pdata *self, Py_ssize_t start)\r
+{\r
+    PyObject *r;\r
+    Py_ssize_t i, j, l;\r
+\r
+    l = self->length-start;\r
+    r = PyTuple_New(l);\r
+    if (r == NULL)\r
+        return NULL;\r
+    for (i = start, j = 0 ; j < l; i++, j++)\r
+        PyTuple_SET_ITEM(r, j, self->data[i]);\r
+\r
+    self->length = start;\r
+    return r;\r
+}\r
+\r
+static PyObject *\r
+Pdata_popList(Pdata *self, Py_ssize_t start)\r
+{\r
+    PyObject *r;\r
+    Py_ssize_t i, j, l;\r
+\r
+    l=self->length-start;\r
+    if (!( r=PyList_New(l)))  return NULL;\r
+    for (i=start, j=0 ; j < l; i++, j++)\r
+        PyList_SET_ITEM(r, j, self->data[i]);\r
+\r
+    self->length=start;\r
+    return r;\r
+}\r
+\r
+/*************************************************************************/\r
+\r
+#define ARG_TUP(self, o) {                          \\r
+  if (self->arg || (self->arg=PyTuple_New(1))) {    \\r
+      Py_XDECREF(PyTuple_GET_ITEM(self->arg,0));    \\r
+      PyTuple_SET_ITEM(self->arg,0,o);              \\r
+  }                                                 \\r
+  else {                                            \\r
+      Py_DECREF(o);                                 \\r
+  }                                                 \\r
+}\r
+\r
+#define FREE_ARG_TUP(self) {                        \\r
+    if (Py_REFCNT(self->arg) > 1) {                 \\r
+      Py_CLEAR(self->arg);                          \\r
+    }                                               \\r
+  }\r
+\r
+typedef struct Picklerobject {\r
+    PyObject_HEAD\r
+    FILE *fp;\r
+    PyObject *write;\r
+    PyObject *file;\r
+    PyObject *memo;\r
+    PyObject *arg;\r
+    PyObject *pers_func;\r
+    PyObject *inst_pers_func;\r
+\r
+    /* pickle protocol number, >= 0 */\r
+    int proto;\r
+\r
+    /* bool, true if proto > 0 */\r
+    int bin;\r
+\r
+    int fast; /* Fast mode doesn't save in memo, don't use if circ ref */\r
+    Py_ssize_t (*write_func)(struct Picklerobject *, const char *, Py_ssize_t);\r
+    char *write_buf;\r
+    Py_ssize_t buf_size;\r
+    PyObject *dispatch_table;\r
+    int fast_container; /* count nested container dumps */\r
+    PyObject *fast_memo;\r
+} Picklerobject;\r
+\r
+#ifndef PY_CPICKLE_FAST_LIMIT\r
+#define PY_CPICKLE_FAST_LIMIT 50\r
+#endif\r
+\r
+static PyTypeObject Picklertype;\r
+\r
+typedef struct Unpicklerobject {\r
+    PyObject_HEAD\r
+    FILE *fp;\r
+    PyObject *file;\r
+    PyObject *readline;\r
+    PyObject *read;\r
+    PyObject *memo;\r
+    PyObject *arg;\r
+    Pdata *stack;\r
+    PyObject *mark;\r
+    PyObject *pers_func;\r
+    PyObject *last_string;\r
+    Py_ssize_t *marks;\r
+    Py_ssize_t num_marks;\r
+    Py_ssize_t marks_size;\r
+    Py_ssize_t (*read_func)(struct Unpicklerobject *, char **, Py_ssize_t);\r
+    Py_ssize_t (*readline_func)(struct Unpicklerobject *, char **);\r
+    Py_ssize_t buf_size;\r
+    char *buf;\r
+    PyObject *find_class;\r
+} Unpicklerobject;\r
+\r
+static PyTypeObject Unpicklertype;\r
+\r
+/* Forward decls that need the above structs */\r
+static int save(Picklerobject *, PyObject *, int);\r
+static int put2(Picklerobject *, PyObject *);\r
+\r
+static\r
+PyObject *\r
+cPickle_ErrFormat(PyObject *ErrType, char *stringformat, char *format, ...)\r
+{\r
+    va_list va;\r
+    PyObject *args=0, *retval=0;\r
+    va_start(va, format);\r
+\r
+    if (format) args = Py_VaBuildValue(format, va);\r
+    va_end(va);\r
+    if (format && ! args) return NULL;\r
+    if (stringformat && !(retval=PyString_FromString(stringformat)))\r
+        return NULL;\r
+\r
+    if (retval) {\r
+        if (args) {\r
+            PyObject *v;\r
+            v=PyString_Format(retval, args);\r
+            Py_DECREF(retval);\r
+            Py_DECREF(args);\r
+            if (! v) return NULL;\r
+            retval=v;\r
+        }\r
+    }\r
+    else\r
+        if (args) retval=args;\r
+        else {\r
+            PyErr_SetObject(ErrType,Py_None);\r
+            return NULL;\r
+        }\r
+    PyErr_SetObject(ErrType,retval);\r
+    Py_DECREF(retval);\r
+    return NULL;\r
+}\r
+\r
+static Py_ssize_t\r
+write_file(Picklerobject *self, const char *s, Py_ssize_t  n)\r
+{\r
+    size_t nbyteswritten;\r
+\r
+    if (s == NULL) {\r
+        return 0;\r
+    }\r
+\r
+    PyFile_IncUseCount((PyFileObject *)self->file);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    nbyteswritten = fwrite(s, sizeof(char), n, self->fp);\r
+    Py_END_ALLOW_THREADS\r
+    PyFile_DecUseCount((PyFileObject *)self->file);\r
+    if (nbyteswritten != (size_t)n) {\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return -1;\r
+    }\r
+\r
+    return n;\r
+}\r
+\r
+static Py_ssize_t\r
+write_cStringIO(Picklerobject *self, const char *s, Py_ssize_t  n)\r
+{\r
+    Py_ssize_t len = n;\r
+\r
+    if (s == NULL) {\r
+        return 0;\r
+    }\r
+\r
+    while (n > INT_MAX) {\r
+        if (PycStringIO->cwrite((PyObject *)self->file, s, INT_MAX) != INT_MAX) {\r
+            return -1;\r
+        }\r
+        n -= INT_MAX;\r
+    }\r
+\r
+    if (PycStringIO->cwrite((PyObject *)self->file, s, n) != n) {\r
+        return -1;\r
+    }\r
+\r
+    return len;\r
+}\r
+\r
+static Py_ssize_t\r
+write_none(Picklerobject *self, const char *s, Py_ssize_t  n)\r
+{\r
+    if (s == NULL) return 0;\r
+    return n;\r
+}\r
+\r
+static Py_ssize_t\r
+write_other(Picklerobject *self, const char *s, Py_ssize_t  n)\r
+{\r
+    PyObject *py_str = 0, *junk = 0;\r
+\r
+    if (s == NULL) {\r
+        if (!( self->buf_size ))  return 0;\r
+        py_str = PyString_FromStringAndSize(self->write_buf,\r
+                                            self->buf_size);\r
+        if (!py_str)\r
+            return -1;\r
+    }\r
+    else {\r
+        if (self->buf_size && n > WRITE_BUF_SIZE - self->buf_size) {\r
+            if (write_other(self, NULL, 0) < 0)\r
+                return -1;\r
+        }\r
+\r
+        if (n > WRITE_BUF_SIZE) {\r
+            if (!( py_str =\r
+                   PyString_FromStringAndSize(s, n)))\r
+                return -1;\r
+        }\r
+        else {\r
+            memcpy(self->write_buf + self->buf_size, s, n);\r
+            self->buf_size += n;\r
+            return n;\r
+        }\r
+    }\r
+\r
+    if (self->write) {\r
+        /* object with write method */\r
+        ARG_TUP(self, py_str);\r
+        if (self->arg) {\r
+            junk = PyObject_Call(self->write, self->arg, NULL);\r
+            FREE_ARG_TUP(self);\r
+        }\r
+        if (junk) Py_DECREF(junk);\r
+        else return -1;\r
+    }\r
+    else\r
+        PDATA_PUSH(self->file, py_str, -1);\r
+\r
+    self->buf_size = 0;\r
+    return n;\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+read_file(Unpicklerobject *self, char **s, Py_ssize_t n)\r
+{\r
+    size_t nbytesread;\r
+\r
+    if (self->buf_size == 0) {\r
+        Py_ssize_t size;\r
+\r
+        size = ((n < 32) ? 32 : n);\r
+        if (!( self->buf = (char *)malloc(size))) {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+\r
+        self->buf_size = size;\r
+    }\r
+    else if (n > self->buf_size) {\r
+        char *newbuf = (char *)realloc(self->buf, n);\r
+        if (!newbuf)  {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        self->buf = newbuf;\r
+        self->buf_size = n;\r
+    }\r
+\r
+    PyFile_IncUseCount((PyFileObject *)self->file);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    nbytesread = fread(self->buf, sizeof(char), n, self->fp);\r
+    Py_END_ALLOW_THREADS\r
+    PyFile_DecUseCount((PyFileObject *)self->file);\r
+    if (nbytesread != (size_t)n) {\r
+        if (feof(self->fp)) {\r
+            PyErr_SetNone(PyExc_EOFError);\r
+            return -1;\r
+        }\r
+\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return -1;\r
+    }\r
+\r
+    *s = self->buf;\r
+\r
+    return n;\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+readline_file(Unpicklerobject *self, char **s)\r
+{\r
+    Py_ssize_t i;\r
+\r
+    if (self->buf_size == 0) {\r
+        if (!( self->buf = (char *)malloc(40))) {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        self->buf_size = 40;\r
+    }\r
+\r
+    i = 0;\r
+    while (1) {\r
+        Py_ssize_t bigger;\r
+        char *newbuf;\r
+        for (; i < (self->buf_size - 1); i++) {\r
+            if (feof(self->fp) ||\r
+                (self->buf[i] = getc(self->fp)) == '\n') {\r
+                self->buf[i + 1] = '\0';\r
+                *s = self->buf;\r
+                return i + 1;\r
+            }\r
+        }\r
+        if (self->buf_size > (PY_SSIZE_T_MAX >> 1)) {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        bigger = self->buf_size << 1;\r
+        newbuf = (char *)realloc(self->buf, bigger);\r
+        if (newbuf == NULL)  {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        self->buf = newbuf;\r
+        self->buf_size = bigger;\r
+    }\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+read_cStringIO(Unpicklerobject *self, char **s, Py_ssize_t  n)\r
+{\r
+    Py_ssize_t len = n;\r
+    char *start, *end = NULL;\r
+\r
+    while (1) {\r
+        int k;\r
+        char *ptr;\r
+        if (n > INT_MAX)\r
+            k = INT_MAX;\r
+        else\r
+            k = (int)n;\r
+        if (PycStringIO->cread((PyObject *)self->file, &ptr, k) != k) {\r
+            PyErr_SetNone(PyExc_EOFError);\r
+            return -1;\r
+        }\r
+        if (end == NULL)\r
+            start = ptr;\r
+        else if (ptr != end) {\r
+            /* non-continuous area */\r
+            return -1;\r
+        }\r
+        if (n <= INT_MAX)\r
+            break;\r
+        end = ptr + INT_MAX;\r
+        n -= INT_MAX;\r
+    }\r
+\r
+    *s = start;\r
+\r
+    return len;\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+readline_cStringIO(Unpicklerobject *self, char **s)\r
+{\r
+    Py_ssize_t n = 0;\r
+    char *start = NULL, *end = NULL;\r
+\r
+    while (1) {\r
+        int k;\r
+        char *ptr;\r
+        if ((k = PycStringIO->creadline((PyObject *)self->file, &ptr)) < 0) {\r
+            return -1;\r
+        }\r
+        n += k;\r
+        if (end == NULL)\r
+            start = ptr;\r
+        else if (ptr != end) {\r
+            /* non-continuous area */\r
+            return -1;\r
+        }\r
+        if (k == 0 || ptr[k - 1] == '\n')\r
+            break;\r
+        end = ptr + k;\r
+    }\r
+\r
+    *s = start;\r
+\r
+    return n;\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+read_other(Unpicklerobject *self, char **s, Py_ssize_t  n)\r
+{\r
+    PyObject *bytes, *str=0;\r
+\r
+    if (!( bytes = PyInt_FromSsize_t(n)))  return -1;\r
+\r
+    ARG_TUP(self, bytes);\r
+    if (self->arg) {\r
+        str = PyObject_Call(self->read, self->arg, NULL);\r
+        FREE_ARG_TUP(self);\r
+    }\r
+    if (! str) return -1;\r
+\r
+    Py_XDECREF(self->last_string);\r
+    self->last_string = str;\r
+\r
+    if (! (*s = PyString_AsString(str))) return -1;\r
+\r
+    if (PyString_GET_SIZE(str) != n) {\r
+        PyErr_SetNone(PyExc_EOFError);\r
+        return -1;\r
+    }\r
+\r
+    return n;\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+readline_other(Unpicklerobject *self, char **s)\r
+{\r
+    PyObject *str;\r
+    Py_ssize_t str_size;\r
+\r
+    if (!( str = PyObject_CallObject(self->readline, empty_tuple)))  {\r
+        return -1;\r
+    }\r
+\r
+    if ((str_size = PyString_Size(str)) < 0)\r
+        return -1;\r
+\r
+    Py_XDECREF(self->last_string);\r
+    self->last_string = str;\r
+\r
+    if (! (*s = PyString_AsString(str)))\r
+        return -1;\r
+\r
+    return str_size;\r
+}\r
+\r
+/* Copy the first n bytes from s into newly malloc'ed memory, plus a\r
+ * trailing 0 byte.  Return a pointer to that, or NULL if out of memory.\r
+ * The caller is responsible for free()'ing the return value.\r
+ */\r
+static char *\r
+pystrndup(const char *s, Py_ssize_t n)\r
+{\r
+    char *r = (char *)malloc(n+1);\r
+    if (r == NULL)\r
+        return (char*)PyErr_NoMemory();\r
+    memcpy(r, s, n);\r
+    r[n] = 0;\r
+    return r;\r
+}\r
+\r
+\r
+static int\r
+get(Picklerobject *self, PyObject *id)\r
+{\r
+    PyObject *value, *mv;\r
+    Py_ssize_t c_value;\r
+    char s[30];\r
+    size_t len;\r
+\r
+    if (!( mv = PyDict_GetItem(self->memo, id)))  {\r
+        PyErr_SetObject(PyExc_KeyError, id);\r
+        return -1;\r
+    }\r
+\r
+    if (!( value = PyTuple_GetItem(mv, 0)))\r
+        return -1;\r
+\r
+    if (!( PyInt_Check(value)))  {\r
+        PyErr_SetString(PicklingError, "no int where int expected in memo");\r
+        return -1;\r
+    }\r
+    c_value = PyInt_AS_LONG((PyIntObject*)value);\r
+\r
+    if (!self->bin) {\r
+        s[0] = GET;\r
+        PyOS_snprintf(s + 1, sizeof(s) - 1,\r
+                      "%" PY_FORMAT_SIZE_T "d\n", c_value);\r
+        len = strlen(s);\r
+    }\r
+    else if (Pdata_Check(self->file)) {\r
+        if (write_other(self, NULL, 0) < 0) return -1;\r
+        PDATA_APPEND(self->file, mv, -1);\r
+        return 0;\r
+    }\r
+    else {\r
+        if (c_value < 256) {\r
+            s[0] = BINGET;\r
+            s[1] = (int)(c_value & 0xff);\r
+            len = 2;\r
+        }\r
+        else {\r
+            s[0] = LONG_BINGET;\r
+            s[1] = (int)(c_value & 0xff);\r
+            s[2] = (int)((c_value >> 8)  & 0xff);\r
+            s[3] = (int)((c_value >> 16) & 0xff);\r
+            s[4] = (int)((c_value >> 24) & 0xff);\r
+            len = 5;\r
+        }\r
+    }\r
+\r
+    if (self->write_func(self, s, len) < 0)\r
+        return -1;\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+put(Picklerobject *self, PyObject *ob)\r
+{\r
+    if (Py_REFCNT(ob) < 2 || self->fast)\r
+        return 0;\r
+\r
+    return put2(self, ob);\r
+}\r
+\r
+\r
+static int\r
+put2(Picklerobject *self, PyObject *ob)\r
+{\r
+    char c_str[30];\r
+    Py_ssize_t len, p;\r
+    int res = -1;\r
+    PyObject *py_ob_id = 0, *memo_len = 0, *t = 0;\r
+\r
+    if (self->fast)\r
+        return 0;\r
+\r
+    if ((p = PyDict_Size(self->memo)) < 0)\r
+        goto finally;\r
+\r
+    /* Make sure memo keys are positive! */\r
+    /* XXX Why?\r
+     * XXX And does "positive" really mean non-negative?\r
+     * XXX pickle.py starts with PUT index 0, not 1.  This makes for\r
+     * XXX gratuitous differences between the pickling modules.\r
+     */\r
+    p++;\r
+\r
+    if (!( py_ob_id = PyLong_FromVoidPtr(ob)))\r
+        goto finally;\r
+\r
+    if (!( memo_len = PyInt_FromLong(p)))\r
+        goto finally;\r
+\r
+    if (!( t = PyTuple_New(2)))\r
+        goto finally;\r
+\r
+    PyTuple_SET_ITEM(t, 0, memo_len);\r
+    Py_INCREF(memo_len);\r
+    PyTuple_SET_ITEM(t, 1, ob);\r
+    Py_INCREF(ob);\r
+\r
+    if (PyDict_SetItem(self->memo, py_ob_id, t) < 0)\r
+        goto finally;\r
+\r
+    if (!self->bin) {\r
+        c_str[0] = PUT;\r
+        PyOS_snprintf(c_str + 1, sizeof(c_str) - 1,\r
+                      "%" PY_FORMAT_SIZE_T "d\n", p);\r
+        len = strlen(c_str);\r
+    }\r
+    else if (Pdata_Check(self->file)) {\r
+        if (write_other(self, NULL, 0) < 0) return -1;\r
+        PDATA_APPEND(self->file, memo_len, -1);\r
+        res=0;          /* Job well done ;) */\r
+        goto finally;\r
+    }\r
+    else {\r
+        if (p >= 256) {\r
+            c_str[0] = LONG_BINPUT;\r
+            c_str[1] = (int)(p & 0xff);\r
+            c_str[2] = (int)((p >> 8)  & 0xff);\r
+            c_str[3] = (int)((p >> 16) & 0xff);\r
+            c_str[4] = (int)((p >> 24) & 0xff);\r
+            len = 5;\r
+        }\r
+        else {\r
+            c_str[0] = BINPUT;\r
+            c_str[1] = p;\r
+            len = 2;\r
+        }\r
+    }\r
+\r
+    if (self->write_func(self, c_str, len) < 0)\r
+        goto finally;\r
+\r
+    res = 0;\r
+\r
+  finally:\r
+    Py_XDECREF(py_ob_id);\r
+    Py_XDECREF(memo_len);\r
+    Py_XDECREF(t);\r
+\r
+    return res;\r
+}\r
+\r
+static PyObject *\r
+whichmodule(PyObject *global, PyObject *global_name)\r
+{\r
+    Py_ssize_t i, j;\r
+    PyObject *module = 0, *modules_dict = 0,\r
+        *global_name_attr = 0, *name = 0;\r
+\r
+    module = PyObject_GetAttrString(global, "__module__");\r
+    if (module)\r
+        return module;\r
+    if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+        PyErr_Clear();\r
+    else\r
+        return NULL;\r
+\r
+    if (!( modules_dict = PySys_GetObject("modules")))\r
+        return NULL;\r
+\r
+    i = 0;\r
+    while ((j = PyDict_Next(modules_dict, &i, &name, &module))) {\r
+\r
+        if (PyObject_Compare(name, __main___str)==0) continue;\r
+\r
+        global_name_attr = PyObject_GetAttr(module, global_name);\r
+        if (!global_name_attr)  {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                return NULL;\r
+            continue;\r
+        }\r
+\r
+        if (global_name_attr != global) {\r
+            Py_DECREF(global_name_attr);\r
+            continue;\r
+        }\r
+\r
+        Py_DECREF(global_name_attr);\r
+\r
+        break;\r
+    }\r
+\r
+    /* The following implements the rule in pickle.py added in 1.5\r
+       that used __main__ if no module is found.  I don't actually\r
+       like this rule. jlf\r
+    */\r
+    if (!j) {\r
+        name=__main___str;\r
+    }\r
+\r
+    Py_INCREF(name);\r
+    return name;\r
+}\r
+\r
+\r
+static int\r
+fast_save_enter(Picklerobject *self, PyObject *obj)\r
+{\r
+    /* if fast_container < 0, we're doing an error exit. */\r
+    if (++self->fast_container >= PY_CPICKLE_FAST_LIMIT) {\r
+        PyObject *key = NULL;\r
+        if (self->fast_memo == NULL) {\r
+            self->fast_memo = PyDict_New();\r
+            if (self->fast_memo == NULL) {\r
+                self->fast_container = -1;\r
+                return 0;\r
+            }\r
+        }\r
+        key = PyLong_FromVoidPtr(obj);\r
+        if (key == NULL)\r
+            return 0;\r
+        if (PyDict_GetItem(self->fast_memo, key)) {\r
+            Py_DECREF(key);\r
+            PyErr_Format(PyExc_ValueError,\r
+                         "fast mode: can't pickle cyclic objects "\r
+                         "including object type %s at %p",\r
+                         Py_TYPE(obj)->tp_name, obj);\r
+            self->fast_container = -1;\r
+            return 0;\r
+        }\r
+        if (PyDict_SetItem(self->fast_memo, key, Py_None) < 0) {\r
+            Py_DECREF(key);\r
+            self->fast_container = -1;\r
+            return 0;\r
+        }\r
+        Py_DECREF(key);\r
+    }\r
+    return 1;\r
+}\r
+\r
+int\r
+fast_save_leave(Picklerobject *self, PyObject *obj)\r
+{\r
+    if (self->fast_container-- >= PY_CPICKLE_FAST_LIMIT) {\r
+        PyObject *key = PyLong_FromVoidPtr(obj);\r
+        if (key == NULL)\r
+            return 0;\r
+        if (PyDict_DelItem(self->fast_memo, key) < 0) {\r
+            Py_DECREF(key);\r
+            return 0;\r
+        }\r
+        Py_DECREF(key);\r
+    }\r
+    return 1;\r
+}\r
+\r
+static int\r
+save_none(Picklerobject *self, PyObject *args)\r
+{\r
+    static char none = NONE;\r
+    if (self->write_func(self, &none, 1) < 0)\r
+        return -1;\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+save_bool(Picklerobject *self, PyObject *args)\r
+{\r
+    static const char *buf[2] = {FALSE, TRUE};\r
+    static char len[2] = {sizeof(FALSE)-1, sizeof(TRUE)-1};\r
+    long l = PyInt_AS_LONG((PyIntObject *)args);\r
+\r
+    if (self->proto >= 2) {\r
+        char opcode = l ? NEWTRUE : NEWFALSE;\r
+        if (self->write_func(self, &opcode, 1) < 0)\r
+            return -1;\r
+    }\r
+    else if (self->write_func(self, buf[l], len[l]) < 0)\r
+        return -1;\r
+    return 0;\r
+}\r
+\r
+static int\r
+save_int(Picklerobject *self, PyObject *args)\r
+{\r
+    char c_str[32];\r
+    long l = PyInt_AS_LONG((PyIntObject *)args);\r
+    Py_ssize_t len = 0;\r
+\r
+    if (!self->bin\r
+#if SIZEOF_LONG > 4\r
+        || l >  0x7fffffffL\r
+        || l < -0x80000000L\r
+#endif\r
+        ) {\r
+        /* Text-mode pickle, or long too big to fit in the 4-byte\r
+         * signed BININT format:  store as a string.\r
+         */\r
+        c_str[0] = INT;\r
+        PyOS_snprintf(c_str + 1, sizeof(c_str) - 1, "%ld\n", l);\r
+        if (self->write_func(self, c_str, strlen(c_str)) < 0)\r
+            return -1;\r
+    }\r
+    else {\r
+        /* Binary pickle and l fits in a signed 4-byte int. */\r
+        c_str[1] = (int)( l        & 0xff);\r
+        c_str[2] = (int)((l >> 8)  & 0xff);\r
+        c_str[3] = (int)((l >> 16) & 0xff);\r
+        c_str[4] = (int)((l >> 24) & 0xff);\r
+\r
+        if ((c_str[4] == 0) && (c_str[3] == 0)) {\r
+            if (c_str[2] == 0) {\r
+                c_str[0] = BININT1;\r
+                len = 2;\r
+            }\r
+            else {\r
+                c_str[0] = BININT2;\r
+                len = 3;\r
+            }\r
+        }\r
+        else {\r
+            c_str[0] = BININT;\r
+            len = 5;\r
+        }\r
+\r
+        if (self->write_func(self, c_str, len) < 0)\r
+            return -1;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+save_long(Picklerobject *self, PyObject *args)\r
+{\r
+    Py_ssize_t size;\r
+    int res = -1;\r
+    PyObject *repr = NULL;\r
+\r
+    static char l = LONG;\r
+\r
+    if (self->proto >= 2) {\r
+        /* Linear-time pickling. */\r
+        size_t nbits;\r
+        size_t nbytes;\r
+        unsigned char *pdata;\r
+        char c_str[5];\r
+        int i;\r
+        int sign = _PyLong_Sign(args);\r
+\r
+        if (sign == 0) {\r
+            /* It's 0 -- an empty bytestring. */\r
+            c_str[0] = LONG1;\r
+            c_str[1] = 0;\r
+            i = self->write_func(self, c_str, 2);\r
+            if (i < 0) goto finally;\r
+            res = 0;\r
+            goto finally;\r
+        }\r
+        nbits = _PyLong_NumBits(args);\r
+        if (nbits == (size_t)-1 && PyErr_Occurred())\r
+            goto finally;\r
+        /* How many bytes do we need?  There are nbits >> 3 full\r
+         * bytes of data, and nbits & 7 leftover bits.  If there\r
+         * are any leftover bits, then we clearly need another\r
+         * byte.  Wnat's not so obvious is that we *probably*\r
+         * need another byte even if there aren't any leftovers:\r
+         * the most-significant bit of the most-significant byte\r
+         * acts like a sign bit, and it's usually got a sense\r
+         * opposite of the one we need.  The exception is longs\r
+         * of the form -(2**(8*j-1)) for j > 0.  Such a long is\r
+         * its own 256's-complement, so has the right sign bit\r
+         * even without the extra byte.  That's a pain to check\r
+         * for in advance, though, so we always grab an extra\r
+         * byte at the start, and cut it back later if possible.\r
+         */\r
+        nbytes = (nbits >> 3) + 1;\r
+        if (nbytes > INT_MAX) {\r
+            PyErr_SetString(PyExc_OverflowError, "long too large "\r
+                "to pickle");\r
+            goto finally;\r
+        }\r
+        repr = PyString_FromStringAndSize(NULL, (int)nbytes);\r
+        if (repr == NULL) goto finally;\r
+        pdata = (unsigned char *)PyString_AS_STRING(repr);\r
+        i = _PyLong_AsByteArray((PyLongObject *)args,\r
+                        pdata, nbytes,\r
+                        1 /* little endian */, 1 /* signed */);\r
+        if (i < 0) goto finally;\r
+        /* If the long is negative, this may be a byte more than\r
+         * needed.  This is so iff the MSB is all redundant sign\r
+         * bits.\r
+         */\r
+        if (sign < 0 && nbytes > 1 && pdata[nbytes - 1] == 0xff &&\r
+            (pdata[nbytes - 2] & 0x80) != 0)\r
+            --nbytes;\r
+\r
+        if (nbytes < 256) {\r
+            c_str[0] = LONG1;\r
+            c_str[1] = (char)nbytes;\r
+            size = 2;\r
+        }\r
+        else {\r
+            c_str[0] = LONG4;\r
+            size = (int)nbytes;\r
+            for (i = 1; i < 5; i++) {\r
+                c_str[i] = (char)(size & 0xff);\r
+                size >>= 8;\r
+            }\r
+            size = 5;\r
+        }\r
+        i = self->write_func(self, c_str, size);\r
+        if (i < 0) goto finally;\r
+        i = self->write_func(self, (char *)pdata, (int)nbytes);\r
+        if (i < 0) goto finally;\r
+        res = 0;\r
+        goto finally;\r
+    }\r
+\r
+    /* proto < 2:  write the repr and newline.  This is quadratic-time\r
+     * (in the number of digits), in both directions.\r
+     */\r
+    if (!( repr = PyObject_Repr(args)))\r
+        goto finally;\r
+\r
+    if ((size = PyString_Size(repr)) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, &l, 1) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self,\r
+                         PyString_AS_STRING((PyStringObject *)repr),\r
+                                            size) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, "\n", 1) < 0)\r
+        goto finally;\r
+\r
+    res = 0;\r
+\r
+  finally:\r
+    Py_XDECREF(repr);\r
+    return res;\r
+}\r
+\r
+\r
+static int\r
+save_float(Picklerobject *self, PyObject *args)\r
+{\r
+    double x = PyFloat_AS_DOUBLE((PyFloatObject *)args);\r
+\r
+    if (self->bin) {\r
+        char str[9];\r
+        str[0] = BINFLOAT;\r
+        if (_PyFloat_Pack8(x, (unsigned char *)&str[1], 0) < 0)\r
+            return -1;\r
+        if (self->write_func(self, str, 9) < 0)\r
+            return -1;\r
+    }\r
+    else {\r
+        int result = -1;\r
+        char *buf = NULL;\r
+        char op = FLOAT;\r
+\r
+        if (self->write_func(self, &op, 1) < 0)\r
+            goto done;\r
+\r
+        buf = PyOS_double_to_string(x, 'g', 17, 0, NULL);\r
+        if (!buf) {\r
+            PyErr_NoMemory();\r
+            goto done;\r
+        }\r
+\r
+        if (self->write_func(self, buf, strlen(buf)) < 0)\r
+            goto done;\r
+\r
+        if (self->write_func(self, "\n", 1) < 0)\r
+            goto done;\r
+\r
+        result = 0;\r
+done:\r
+        PyMem_Free(buf);\r
+        return result;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+save_string(Picklerobject *self, PyObject *args, int doput)\r
+{\r
+    Py_ssize_t size, len;\r
+    PyObject *repr=0;\r
+\r
+    if ((size = PyString_Size(args)) < 0)\r
+        return -1;\r
+\r
+    if (!self->bin) {\r
+        char *repr_str;\r
+\r
+        static char string = STRING;\r
+\r
+        if (!( repr = PyObject_Repr(args)))\r
+            return -1;\r
+\r
+        if ((len = PyString_Size(repr)) < 0)\r
+            goto err;\r
+        repr_str = PyString_AS_STRING((PyStringObject *)repr);\r
+\r
+        if (self->write_func(self, &string, 1) < 0)\r
+            goto err;\r
+\r
+        if (self->write_func(self, repr_str, len) < 0)\r
+            goto err;\r
+\r
+        if (self->write_func(self, "\n", 1) < 0)\r
+            goto err;\r
+\r
+        Py_XDECREF(repr);\r
+    }\r
+    else {\r
+        int i;\r
+        char c_str[5];\r
+\r
+        if (size < 256) {\r
+            c_str[0] = SHORT_BINSTRING;\r
+            c_str[1] = size;\r
+            len = 2;\r
+        }\r
+        else if (size <= INT_MAX) {\r
+            c_str[0] = BINSTRING;\r
+            for (i = 1; i < 5; i++)\r
+                c_str[i] = (int)(size >> ((i - 1) * 8));\r
+            len = 5;\r
+        }\r
+        else\r
+            return -1;    /* string too large */\r
+\r
+        if (self->write_func(self, c_str, len) < 0)\r
+            return -1;\r
+\r
+        if (size > 128 && Pdata_Check(self->file)) {\r
+            if (write_other(self, NULL, 0) < 0) return -1;\r
+            PDATA_APPEND(self->file, args, -1);\r
+        }\r
+        else {\r
+            if (self->write_func(self,\r
+                                 PyString_AS_STRING(\r
+                                    (PyStringObject *)args),\r
+                                 size) < 0)\r
+                return -1;\r
+        }\r
+    }\r
+\r
+    if (doput)\r
+        if (put(self, args) < 0)\r
+            return -1;\r
+\r
+    return 0;\r
+\r
+  err:\r
+    Py_XDECREF(repr);\r
+    return -1;\r
+}\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+/* A copy of PyUnicode_EncodeRawUnicodeEscape() that also translates\r
+   backslash and newline characters to \uXXXX escapes. */\r
+static PyObject *\r
+modified_EncodeRawUnicodeEscape(const Py_UNICODE *s, Py_ssize_t size)\r
+{\r
+    PyObject *repr;\r
+    char *p;\r
+    char *q;\r
+\r
+    static const char *hexdigit = "0123456789abcdef";\r
+#ifdef Py_UNICODE_WIDE\r
+    const Py_ssize_t expandsize = 10;\r
+#else\r
+    const Py_ssize_t expandsize = 6;\r
+#endif\r
+\r
+    if (size > PY_SSIZE_T_MAX / expandsize)\r
+    return PyErr_NoMemory();\r
+\r
+    repr = PyString_FromStringAndSize(NULL, expandsize * size);\r
+    if (repr == NULL)\r
+    return NULL;\r
+    if (size == 0)\r
+    return repr;\r
+\r
+    p = q = PyString_AS_STRING(repr);\r
+    while (size-- > 0) {\r
+    Py_UNICODE ch = *s++;\r
+#ifdef Py_UNICODE_WIDE\r
+    /* Map 32-bit characters to '\Uxxxxxxxx' */\r
+    if (ch >= 0x10000) {\r
+        *p++ = '\\';\r
+        *p++ = 'U';\r
+        *p++ = hexdigit[(ch >> 28) & 0xf];\r
+        *p++ = hexdigit[(ch >> 24) & 0xf];\r
+        *p++ = hexdigit[(ch >> 20) & 0xf];\r
+        *p++ = hexdigit[(ch >> 16) & 0xf];\r
+        *p++ = hexdigit[(ch >> 12) & 0xf];\r
+        *p++ = hexdigit[(ch >> 8) & 0xf];\r
+        *p++ = hexdigit[(ch >> 4) & 0xf];\r
+        *p++ = hexdigit[ch & 15];\r
+    }\r
+    else\r
+#else\r
+    /* Map UTF-16 surrogate pairs to '\U00xxxxxx' */\r
+    if (ch >= 0xD800 && ch < 0xDC00) {\r
+        Py_UNICODE ch2;\r
+        Py_UCS4 ucs;\r
+\r
+        ch2 = *s++;\r
+        size--;\r
+        if (ch2 >= 0xDC00 && ch2 <= 0xDFFF) {\r
+        ucs = (((ch & 0x03FF) << 10) | (ch2 & 0x03FF)) + 0x00010000;\r
+        *p++ = '\\';\r
+        *p++ = 'U';\r
+        *p++ = hexdigit[(ucs >> 28) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 24) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 20) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 16) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 12) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 8) & 0xf];\r
+        *p++ = hexdigit[(ucs >> 4) & 0xf];\r
+        *p++ = hexdigit[ucs & 0xf];\r
+        continue;\r
+        }\r
+        /* Fall through: isolated surrogates are copied as-is */\r
+        s--;\r
+        size++;\r
+    }\r
+#endif\r
+    /* Map 16-bit characters to '\uxxxx' */\r
+    if (ch >= 256 || ch == '\\' || ch == '\n') {\r
+        *p++ = '\\';\r
+        *p++ = 'u';\r
+        *p++ = hexdigit[(ch >> 12) & 0xf];\r
+        *p++ = hexdigit[(ch >> 8) & 0xf];\r
+        *p++ = hexdigit[(ch >> 4) & 0xf];\r
+        *p++ = hexdigit[ch & 15];\r
+    }\r
+    /* Copy everything else as-is */\r
+    else\r
+        *p++ = (char) ch;\r
+    }\r
+    *p = '\0';\r
+    _PyString_Resize(&repr, p - q);\r
+    return repr;\r
+}\r
+\r
+static int\r
+save_unicode(Picklerobject *self, PyObject *args, int doput)\r
+{\r
+    Py_ssize_t size, len;\r
+    PyObject *repr=0;\r
+\r
+    if (!PyUnicode_Check(args))\r
+        return -1;\r
+\r
+    if (!self->bin) {\r
+        char *repr_str;\r
+        static char string = UNICODE;\r
+\r
+        repr = modified_EncodeRawUnicodeEscape(\r
+            PyUnicode_AS_UNICODE(args), PyUnicode_GET_SIZE(args));\r
+        if (!repr)\r
+            return -1;\r
+\r
+        if ((len = PyString_Size(repr)) < 0)\r
+            goto err;\r
+        repr_str = PyString_AS_STRING((PyStringObject *)repr);\r
+\r
+        if (self->write_func(self, &string, 1) < 0)\r
+            goto err;\r
+\r
+        if (self->write_func(self, repr_str, len) < 0)\r
+            goto err;\r
+\r
+        if (self->write_func(self, "\n", 1) < 0)\r
+            goto err;\r
+\r
+        Py_XDECREF(repr);\r
+    }\r
+    else {\r
+        int i;\r
+        char c_str[5];\r
+\r
+        if (!( repr = PyUnicode_AsUTF8String(args)))\r
+            return -1;\r
+\r
+        if ((size = PyString_Size(repr)) < 0)\r
+            goto err;\r
+        if (size > INT_MAX)\r
+            return -1;   /* string too large */\r
+\r
+        c_str[0] = BINUNICODE;\r
+        for (i = 1; i < 5; i++)\r
+            c_str[i] = (int)(size >> ((i - 1) * 8));\r
+        len = 5;\r
+\r
+        if (self->write_func(self, c_str, len) < 0)\r
+            goto err;\r
+\r
+        if (size > 128 && Pdata_Check(self->file)) {\r
+            if (write_other(self, NULL, 0) < 0)\r
+                goto err;\r
+            PDATA_APPEND(self->file, repr, -1);\r
+        }\r
+        else {\r
+            if (self->write_func(self, PyString_AS_STRING(repr),\r
+                                 size) < 0)\r
+                goto err;\r
+        }\r
+\r
+        Py_DECREF(repr);\r
+    }\r
+\r
+    if (doput)\r
+        if (put(self, args) < 0)\r
+            return -1;\r
+\r
+    return 0;\r
+\r
+  err:\r
+    Py_XDECREF(repr);\r
+    return -1;\r
+}\r
+#endif\r
+\r
+/* A helper for save_tuple.  Push the len elements in tuple t on the stack. */\r
+static int\r
+store_tuple_elements(Picklerobject *self, PyObject *t, int len)\r
+{\r
+    Py_ssize_t i;\r
+    int res = -1;       /* guilty until proved innocent */\r
+\r
+    assert(PyTuple_Size(t) == len);\r
+\r
+    for (i = 0; i < len; i++) {\r
+        PyObject *element = PyTuple_GET_ITEM(t, i);\r
+\r
+        if (element == NULL)\r
+            goto finally;\r
+        if (save(self, element, 0) < 0)\r
+            goto finally;\r
+    }\r
+    res = 0;\r
+\r
+  finally:\r
+    return res;\r
+}\r
+\r
+/* Tuples are ubiquitous in the pickle protocols, so many techniques are\r
+ * used across protocols to minimize the space needed to pickle them.\r
+ * Tuples are also the only builtin immutable type that can be recursive\r
+ * (a tuple can be reached from itself), and that requires some subtle\r
+ * magic so that it works in all cases.  IOW, this is a long routine.\r
+ */\r
+static int\r
+save_tuple(Picklerobject *self, PyObject *args)\r
+{\r
+    PyObject *py_tuple_id = NULL;\r
+    Py_ssize_t len, i;\r
+    int res = -1;\r
+\r
+    static char tuple = TUPLE;\r
+    static char pop = POP;\r
+    static char pop_mark = POP_MARK;\r
+    static char len2opcode[] = {EMPTY_TUPLE, TUPLE1, TUPLE2, TUPLE3};\r
+\r
+    if ((len = PyTuple_Size(args)) < 0)\r
+        goto finally;\r
+\r
+    if (len == 0) {\r
+        char c_str[2];\r
+\r
+        if (self->proto) {\r
+            c_str[0] = EMPTY_TUPLE;\r
+            len = 1;\r
+        }\r
+        else {\r
+            c_str[0] = MARK;\r
+            c_str[1] = TUPLE;\r
+            len = 2;\r
+        }\r
+        if (self->write_func(self, c_str, len) >= 0)\r
+            res = 0;\r
+        /* Don't memoize an empty tuple. */\r
+        goto finally;\r
+    }\r
+\r
+    /* A non-empty tuple. */\r
+\r
+    /* id(tuple) isn't in the memo now.  If it shows up there after\r
+     * saving the tuple elements, the tuple must be recursive, in\r
+     * which case we'll pop everything we put on the stack, and fetch\r
+     * its value from the memo.\r
+     */\r
+    py_tuple_id = PyLong_FromVoidPtr(args);\r
+    if (py_tuple_id == NULL)\r
+        goto finally;\r
+\r
+    if (len <= 3 && self->proto >= 2) {\r
+        /* Use TUPLE{1,2,3} opcodes. */\r
+        if (store_tuple_elements(self, args, len) < 0)\r
+            goto finally;\r
+        if (PyDict_GetItem(self->memo, py_tuple_id)) {\r
+            /* pop the len elements */\r
+            for (i = 0; i < len; ++i)\r
+                if (self->write_func(self, &pop, 1) < 0)\r
+                    goto finally;\r
+            /* fetch from memo */\r
+            if (get(self, py_tuple_id) < 0)\r
+                goto finally;\r
+            res = 0;\r
+            goto finally;\r
+        }\r
+        /* Not recursive. */\r
+        if (self->write_func(self, len2opcode + len, 1) < 0)\r
+            goto finally;\r
+        goto memoize;\r
+    }\r
+\r
+    /* proto < 2 and len > 0, or proto >= 2 and len > 3.\r
+     * Generate MARK elt1 elt2 ... TUPLE\r
+     */\r
+    if (self->write_func(self, &MARKv, 1) < 0)\r
+        goto finally;\r
+\r
+    if (store_tuple_elements(self, args, len) < 0)\r
+        goto finally;\r
+\r
+    if (PyDict_GetItem(self->memo, py_tuple_id)) {\r
+        /* pop the stack stuff we pushed */\r
+        if (self->bin) {\r
+            if (self->write_func(self, &pop_mark, 1) < 0)\r
+                goto finally;\r
+        }\r
+        else {\r
+            /* Note that we pop one more than len, to remove\r
+             * the MARK too.\r
+             */\r
+            for (i = 0; i <= len; i++)\r
+                if (self->write_func(self, &pop, 1) < 0)\r
+                    goto finally;\r
+        }\r
+        /* fetch from memo */\r
+        if (get(self, py_tuple_id) >= 0)\r
+            res = 0;\r
+        goto finally;\r
+    }\r
+\r
+    /* Not recursive. */\r
+    if (self->write_func(self, &tuple, 1) < 0)\r
+        goto finally;\r
+\r
+  memoize:\r
+    if (put(self, args) >= 0)\r
+        res = 0;\r
+\r
+  finally:\r
+    Py_XDECREF(py_tuple_id);\r
+    return res;\r
+}\r
+\r
+/* iter is an iterator giving items, and we batch up chunks of\r
+ *     MARK item item ... item APPENDS\r
+ * opcode sequences.  Calling code should have arranged to first create an\r
+ * empty list, or list-like object, for the APPENDS to operate on.\r
+ * Returns 0 on success, <0 on error.\r
+ */\r
+static int\r
+batch_list(Picklerobject *self, PyObject *iter)\r
+{\r
+    PyObject *obj = NULL;\r
+    PyObject *firstitem = NULL;\r
+    int i, n;\r
+\r
+    static char append = APPEND;\r
+    static char appends = APPENDS;\r
+\r
+    assert(iter != NULL);\r
+\r
+    if (self->proto == 0) {\r
+        /* APPENDS isn't available; do one at a time. */\r
+        for (;;) {\r
+            obj = PyIter_Next(iter);\r
+            if (obj == NULL) {\r
+                if (PyErr_Occurred())\r
+                    return -1;\r
+                break;\r
+            }\r
+            i = save(self, obj, 0);\r
+            Py_DECREF(obj);\r
+            if (i < 0)\r
+                return -1;\r
+            if (self->write_func(self, &append, 1) < 0)\r
+                return -1;\r
+        }\r
+        return 0;\r
+    }\r
+\r
+    /* proto > 0:  write in batches of BATCHSIZE. */\r
+    do {\r
+        /* Get first item */\r
+        firstitem = PyIter_Next(iter);\r
+        if (firstitem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto BatchFailed;\r
+\r
+            /* nothing more to add */\r
+            break;\r
+        }\r
+\r
+        /* Try to get a second item */\r
+        obj = PyIter_Next(iter);\r
+        if (obj == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto BatchFailed;\r
+\r
+            /* Only one item to write */\r
+            if (save(self, firstitem, 0) < 0)\r
+                goto BatchFailed;\r
+            if (self->write_func(self, &append, 1) < 0)\r
+                goto BatchFailed;\r
+            Py_CLEAR(firstitem);\r
+            break;\r
+        }\r
+\r
+        /* More than one item to write */\r
+\r
+        /* Pump out MARK, items, APPENDS. */\r
+        if (self->write_func(self, &MARKv, 1) < 0)\r
+            goto BatchFailed;\r
+\r
+        if (save(self, firstitem, 0) < 0)\r
+            goto BatchFailed;\r
+        Py_CLEAR(firstitem);\r
+        n = 1;\r
+\r
+        /* Fetch and save up to BATCHSIZE items */\r
+        while (obj) {\r
+            if (save(self, obj, 0) < 0)\r
+                goto BatchFailed;\r
+            Py_CLEAR(obj);\r
+            n += 1;\r
+\r
+            if (n == BATCHSIZE)\r
+                break;\r
+\r
+            obj = PyIter_Next(iter);\r
+            if (obj == NULL) {\r
+                if (PyErr_Occurred())\r
+                    goto BatchFailed;\r
+                break;\r
+            }\r
+        }\r
+\r
+        if (self->write_func(self, &appends, 1) < 0)\r
+            goto BatchFailed;\r
+\r
+    } while (n == BATCHSIZE);\r
+    return 0;\r
+\r
+BatchFailed:\r
+    Py_XDECREF(firstitem);\r
+    Py_XDECREF(obj);\r
+    return -1;\r
+}\r
+\r
+static int\r
+save_list(Picklerobject *self, PyObject *args)\r
+{\r
+    int res = -1;\r
+    char s[3];\r
+    Py_ssize_t len;\r
+    PyObject *iter;\r
+\r
+    if (self->fast && !fast_save_enter(self, args))\r
+        goto finally;\r
+\r
+    /* Create an empty list. */\r
+    if (self->bin) {\r
+        s[0] = EMPTY_LIST;\r
+        len = 1;\r
+    }\r
+    else {\r
+        s[0] = MARK;\r
+        s[1] = LIST;\r
+        len = 2;\r
+    }\r
+\r
+    if (self->write_func(self, s, len) < 0)\r
+        goto finally;\r
+\r
+    /* Get list length, and bow out early if empty. */\r
+    if ((len = PyList_Size(args)) < 0)\r
+        goto finally;\r
+\r
+    /* Memoize. */\r
+    if (len == 0) {\r
+        if (put(self, args) >= 0)\r
+            res = 0;\r
+        goto finally;\r
+    }\r
+    if (put2(self, args) < 0)\r
+        goto finally;\r
+\r
+    /* Materialize the list elements. */\r
+    iter = PyObject_GetIter(args);\r
+    if (iter == NULL)\r
+        goto finally;\r
+\r
+    if (Py_EnterRecursiveCall(" while pickling an object") == 0)\r
+    {\r
+        res = batch_list(self, iter);\r
+        Py_LeaveRecursiveCall();\r
+    }\r
+    Py_DECREF(iter);\r
+\r
+  finally:\r
+    if (self->fast && !fast_save_leave(self, args))\r
+        res = -1;\r
+\r
+    return res;\r
+}\r
+\r
+\r
+/* iter is an iterator giving (key, value) pairs, and we batch up chunks of\r
+ *     MARK key value ... key value SETITEMS\r
+ * opcode sequences.  Calling code should have arranged to first create an\r
+ * empty dict, or dict-like object, for the SETITEMS to operate on.\r
+ * Returns 0 on success, <0 on error.\r
+ *\r
+ * This is very much like batch_list().  The difference between saving\r
+ * elements directly, and picking apart two-tuples, is so long-winded at\r
+ * the C level, though, that attempts to combine these routines were too\r
+ * ugly to bear.\r
+ */\r
+static int\r
+batch_dict(Picklerobject *self, PyObject *iter)\r
+{\r
+    PyObject *p = NULL;\r
+    PyObject *firstitem = NULL;\r
+    int i, n;\r
+\r
+    static char setitem = SETITEM;\r
+    static char setitems = SETITEMS;\r
+\r
+    assert(iter != NULL);\r
+\r
+    if (self->proto == 0) {\r
+        /* SETITEMS isn't available; do one at a time. */\r
+        for (;;) {\r
+            p = PyIter_Next(iter);\r
+            if (p == NULL) {\r
+                if (PyErr_Occurred())\r
+                    return -1;\r
+                break;\r
+            }\r
+            if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {\r
+                PyErr_SetString(PyExc_TypeError, "dict items "\r
+                    "iterator must return 2-tuples");\r
+                return -1;\r
+            }\r
+            i = save(self, PyTuple_GET_ITEM(p, 0), 0);\r
+            if (i >= 0)\r
+                i = save(self, PyTuple_GET_ITEM(p, 1), 0);\r
+            Py_DECREF(p);\r
+            if (i < 0)\r
+                return -1;\r
+            if (self->write_func(self, &setitem, 1) < 0)\r
+                return -1;\r
+        }\r
+        return 0;\r
+    }\r
+\r
+    /* proto > 0:  write in batches of BATCHSIZE. */\r
+    do {\r
+        /* Get first item */\r
+        firstitem = PyIter_Next(iter);\r
+        if (firstitem == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto BatchFailed;\r
+\r
+            /* nothing more to add */\r
+            break;\r
+        }\r
+        if (!PyTuple_Check(firstitem) || PyTuple_Size(firstitem) != 2) {\r
+            PyErr_SetString(PyExc_TypeError, "dict items "\r
+                            "iterator must return 2-tuples");\r
+            goto BatchFailed;\r
+        }\r
+\r
+        /* Try to get a second item */\r
+        p = PyIter_Next(iter);\r
+        if (p == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto BatchFailed;\r
+\r
+            /* Only one item to write */\r
+            if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)\r
+                goto BatchFailed;\r
+            if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)\r
+                goto BatchFailed;\r
+            if (self->write_func(self, &setitem, 1) < 0)\r
+                goto BatchFailed;\r
+            Py_CLEAR(firstitem);\r
+            break;\r
+        }\r
+\r
+        /* More than one item to write */\r
+\r
+        /* Pump out MARK, items, SETITEMS. */\r
+        if (self->write_func(self, &MARKv, 1) < 0)\r
+            goto BatchFailed;\r
+\r
+        if (save(self, PyTuple_GET_ITEM(firstitem, 0), 0) < 0)\r
+            goto BatchFailed;\r
+        if (save(self, PyTuple_GET_ITEM(firstitem, 1), 0) < 0)\r
+            goto BatchFailed;\r
+        Py_CLEAR(firstitem);\r
+        n = 1;\r
+\r
+        /* Fetch and save up to BATCHSIZE items */\r
+        while (p) {\r
+            if (!PyTuple_Check(p) || PyTuple_Size(p) != 2) {\r
+                PyErr_SetString(PyExc_TypeError, "dict items "\r
+                    "iterator must return 2-tuples");\r
+                goto BatchFailed;\r
+            }\r
+            if (save(self, PyTuple_GET_ITEM(p, 0), 0) < 0)\r
+                goto BatchFailed;\r
+            if (save(self, PyTuple_GET_ITEM(p, 1), 0) < 0)\r
+                goto BatchFailed;\r
+            Py_CLEAR(p);\r
+            n += 1;\r
+\r
+            if (n == BATCHSIZE)\r
+                break;\r
+\r
+            p = PyIter_Next(iter);\r
+            if (p == NULL) {\r
+                if (PyErr_Occurred())\r
+                    goto BatchFailed;\r
+                break;\r
+            }\r
+        }\r
+\r
+        if (self->write_func(self, &setitems, 1) < 0)\r
+            goto BatchFailed;\r
+\r
+    } while (n == BATCHSIZE);\r
+    return 0;\r
+\r
+BatchFailed:\r
+    Py_XDECREF(firstitem);\r
+    Py_XDECREF(p);\r
+    return -1;\r
+}\r
+\r
+/* This is a variant of batch_dict() above that specializes for dicts, with no\r
+ * support for dict subclasses. Like batch_dict(), we batch up chunks of\r
+ *     MARK key value ... key value SETITEMS\r
+ * opcode sequences.  Calling code should have arranged to first create an\r
+ * empty dict, or dict-like object, for the SETITEMS to operate on.\r
+ * Returns 0 on success, -1 on error.\r
+ *\r
+ * Note that this currently doesn't work for protocol 0.\r
+ */\r
+static int\r
+batch_dict_exact(Picklerobject *self, PyObject *obj)\r
+{\r
+    PyObject *key = NULL, *value = NULL;\r
+    int i;\r
+    Py_ssize_t dict_size, ppos = 0;\r
+\r
+    static char setitem = SETITEM;\r
+    static char setitems = SETITEMS;\r
+\r
+    assert(obj != NULL);\r
+    assert(self->proto > 0);\r
+\r
+    dict_size = PyDict_Size(obj);\r
+\r
+    /* Special-case len(d) == 1 to save space. */\r
+    if (dict_size == 1) {\r
+        PyDict_Next(obj, &ppos, &key, &value);\r
+        if (save(self, key, 0) < 0)\r
+            return -1;\r
+        if (save(self, value, 0) < 0)\r
+            return -1;\r
+        if (self->write_func(self, &setitem, 1) < 0)\r
+            return -1;\r
+        return 0;\r
+    }\r
+\r
+    /* Write in batches of BATCHSIZE. */\r
+    do {\r
+        i = 0;\r
+        if (self->write_func(self, &MARKv, 1) < 0)\r
+            return -1;\r
+        while (PyDict_Next(obj, &ppos, &key, &value)) {\r
+            if (save(self, key, 0) < 0)\r
+                return -1;\r
+            if (save(self, value, 0) < 0)\r
+                return -1;\r
+            if (++i == BATCHSIZE)\r
+                break;\r
+        }\r
+        if (self->write_func(self, &setitems, 1) < 0)\r
+            return -1;\r
+        if (PyDict_Size(obj) != dict_size) {\r
+            PyErr_Format(\r
+                PyExc_RuntimeError,\r
+                "dictionary changed size during iteration");\r
+            return -1;\r
+        }\r
+\r
+    } while (i == BATCHSIZE);\r
+    return 0;\r
+}\r
+\r
+static int\r
+save_dict(Picklerobject *self, PyObject *args)\r
+{\r
+    int res = -1;\r
+    char s[3];\r
+    Py_ssize_t len;\r
+\r
+    if (self->fast && !fast_save_enter(self, args))\r
+        goto finally;\r
+\r
+    /* Create an empty dict. */\r
+    if (self->bin) {\r
+        s[0] = EMPTY_DICT;\r
+        len = 1;\r
+    }\r
+    else {\r
+        s[0] = MARK;\r
+        s[1] = DICT;\r
+        len = 2;\r
+    }\r
+\r
+    if (self->write_func(self, s, len) < 0)\r
+        goto finally;\r
+\r
+    /* Get dict size, and bow out early if empty. */\r
+    if ((len = PyDict_Size(args)) < 0)\r
+        goto finally;\r
+\r
+    if (len == 0) {\r
+        if (put(self, args) >= 0)\r
+            res = 0;\r
+        goto finally;\r
+    }\r
+    if (put2(self, args) < 0)\r
+        goto finally;\r
+\r
+    /* Materialize the dict items. */\r
+    if (PyDict_CheckExact(args) && self->proto > 0) {\r
+        /* We can take certain shortcuts if we know this is a dict and\r
+           not a dict subclass. */\r
+        if (Py_EnterRecursiveCall(" while pickling an object") == 0) {\r
+            res = batch_dict_exact(self, args);\r
+            Py_LeaveRecursiveCall();\r
+        }\r
+    } else {\r
+        PyObject *iter = PyObject_CallMethod(args, "iteritems", "()");\r
+        if (iter == NULL)\r
+            goto finally;\r
+        if (Py_EnterRecursiveCall(" while pickling an object") == 0) {\r
+            res = batch_dict(self, iter);\r
+            Py_LeaveRecursiveCall();\r
+        }\r
+        Py_DECREF(iter);\r
+    }\r
+\r
+  finally:\r
+    if (self->fast && !fast_save_leave(self, args))\r
+        res = -1;\r
+\r
+    return res;\r
+}\r
+\r
+\r
+static int\r
+save_inst(Picklerobject *self, PyObject *args)\r
+{\r
+    PyObject *class = 0, *module = 0, *name = 0, *state = 0,\r
+        *getinitargs_func = 0, *getstate_func = 0, *class_args = 0;\r
+    char *module_str, *name_str;\r
+    int module_size, name_size, res = -1;\r
+\r
+    static char inst = INST, obj = OBJ, build = BUILD;\r
+\r
+    if (self->fast && !fast_save_enter(self, args))\r
+        goto finally;\r
+\r
+    if (self->write_func(self, &MARKv, 1) < 0)\r
+        goto finally;\r
+\r
+    if (!( class = PyObject_GetAttr(args, __class___str)))\r
+        goto finally;\r
+\r
+    if (self->bin) {\r
+        if (save(self, class, 0) < 0)\r
+            goto finally;\r
+    }\r
+\r
+    if ((getinitargs_func = PyObject_GetAttr(args, __getinitargs___str))) {\r
+        PyObject *element = 0;\r
+        Py_ssize_t i, len;\r
+\r
+        if (!( class_args =\r
+               PyObject_Call(getinitargs_func, empty_tuple, NULL)))\r
+            goto finally;\r
+\r
+        if ((len = PyObject_Size(class_args)) < 0)\r
+            goto finally;\r
+\r
+        for (i = 0; i < len; i++) {\r
+            if (!( element = PySequence_GetItem(class_args, i)))\r
+                goto finally;\r
+\r
+            if (save(self, element, 0) < 0) {\r
+                Py_DECREF(element);\r
+                goto finally;\r
+            }\r
+\r
+            Py_DECREF(element);\r
+        }\r
+    }\r
+    else {\r
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+            PyErr_Clear();\r
+        else\r
+            goto finally;\r
+    }\r
+\r
+    if (!self->bin) {\r
+        if (!( name = ((PyClassObject *)class)->cl_name ))  {\r
+            PyErr_SetString(PicklingError, "class has no name");\r
+            goto finally;\r
+        }\r
+\r
+        if (!( module = whichmodule(class, name)))\r
+            goto finally;\r
+\r
+\r
+        if ((module_size = PyString_Size(module)) < 0 ||\r
+            (name_size = PyString_Size(name)) < 0)\r
+            goto finally;\r
+\r
+        module_str = PyString_AS_STRING((PyStringObject *)module);\r
+        name_str   = PyString_AS_STRING((PyStringObject *)name);\r
+\r
+        if (self->write_func(self, &inst, 1) < 0)\r
+            goto finally;\r
+\r
+        if (self->write_func(self, module_str, module_size) < 0)\r
+            goto finally;\r
+\r
+        if (self->write_func(self, "\n", 1) < 0)\r
+            goto finally;\r
+\r
+        if (self->write_func(self, name_str, name_size) < 0)\r
+            goto finally;\r
+\r
+        if (self->write_func(self, "\n", 1) < 0)\r
+            goto finally;\r
+    }\r
+    else if (self->write_func(self, &obj, 1) < 0) {\r
+        goto finally;\r
+    }\r
+\r
+    if ((getstate_func = PyObject_GetAttr(args, __getstate___str))) {\r
+        state = PyObject_Call(getstate_func, empty_tuple, NULL);\r
+        if (!state)\r
+            goto finally;\r
+    }\r
+    else {\r
+        if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+            PyErr_Clear();\r
+        else\r
+            goto finally;\r
+\r
+        if (!( state = PyObject_GetAttr(args, __dict___str)))  {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                goto finally;\r
+            res = 0;\r
+            goto finally;\r
+        }\r
+    }\r
+\r
+    if (!PyDict_Check(state)) {\r
+        if (put2(self, args) < 0)\r
+            goto finally;\r
+    }\r
+    else {\r
+        if (put(self, args) < 0)\r
+            goto finally;\r
+    }\r
+\r
+    if (save(self, state, 0) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, &build, 1) < 0)\r
+        goto finally;\r
+\r
+    res = 0;\r
+\r
+  finally:\r
+    if (self->fast && !fast_save_leave(self, args))\r
+        res = -1;\r
+\r
+    Py_XDECREF(module);\r
+    Py_XDECREF(class);\r
+    Py_XDECREF(state);\r
+    Py_XDECREF(getinitargs_func);\r
+    Py_XDECREF(getstate_func);\r
+    Py_XDECREF(class_args);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+static int\r
+save_global(Picklerobject *self, PyObject *args, PyObject *name)\r
+{\r
+    PyObject *global_name = 0, *module = 0, *mod = 0, *klass = 0;\r
+    char *name_str, *module_str;\r
+    int module_size, name_size, res = -1;\r
+\r
+    static char global = GLOBAL;\r
+\r
+    if (name) {\r
+        global_name = name;\r
+        Py_INCREF(global_name);\r
+    }\r
+    else {\r
+        if (!( global_name = PyObject_GetAttr(args, __name___str)))\r
+            goto finally;\r
+    }\r
+\r
+    if (!( module = whichmodule(args, global_name)))\r
+        goto finally;\r
+\r
+    if ((module_size = PyString_Size(module)) < 0 ||\r
+        (name_size = PyString_Size(global_name)) < 0)\r
+        goto finally;\r
+\r
+    module_str = PyString_AS_STRING((PyStringObject *)module);\r
+    name_str   = PyString_AS_STRING((PyStringObject *)global_name);\r
+\r
+    /* XXX This can be doing a relative import.  Clearly it shouldn't,\r
+       but I don't know how to stop it. :-( */\r
+    mod = PyImport_ImportModule(module_str);\r
+    if (mod == NULL) {\r
+        cPickle_ErrFormat(PicklingError,\r
+                          "Can't pickle %s: import of module %s "\r
+                          "failed",\r
+                          "OS", args, module);\r
+        goto finally;\r
+    }\r
+    klass = PyObject_GetAttrString(mod, name_str);\r
+    if (klass == NULL) {\r
+        cPickle_ErrFormat(PicklingError,\r
+                          "Can't pickle %s: attribute lookup %s.%s "\r
+                          "failed",\r
+                          "OSS", args, module, global_name);\r
+        goto finally;\r
+    }\r
+    if (klass != args) {\r
+        Py_DECREF(klass);\r
+        cPickle_ErrFormat(PicklingError,\r
+                          "Can't pickle %s: it's not the same object "\r
+                                "as %s.%s",\r
+                          "OSS", args, module, global_name);\r
+        goto finally;\r
+    }\r
+    Py_DECREF(klass);\r
+\r
+    if (self->proto >= 2) {\r
+        /* See whether this is in the extension registry, and if\r
+         * so generate an EXT opcode.\r
+         */\r
+        PyObject *py_code;              /* extension code as Python object */\r
+        long code;                      /* extension code as C value */\r
+        char c_str[5];\r
+        int n;\r
+\r
+        PyTuple_SET_ITEM(two_tuple, 0, module);\r
+        PyTuple_SET_ITEM(two_tuple, 1, global_name);\r
+        py_code = PyDict_GetItem(extension_registry, two_tuple);\r
+        if (py_code == NULL)\r
+            goto gen_global;                    /* not registered */\r
+\r
+        /* Verify py_code has the right type and value. */\r
+        if (!PyInt_Check(py_code)) {\r
+            cPickle_ErrFormat(PicklingError, "Can't pickle %s: "\r
+                "extension code %s isn't an integer",\r
+                "OO", args, py_code);\r
+            goto finally;\r
+        }\r
+        code = PyInt_AS_LONG(py_code);\r
+        if (code <= 0 ||  code > 0x7fffffffL) {\r
+            cPickle_ErrFormat(PicklingError, "Can't pickle %s: "\r
+                "extension code %ld is out of range",\r
+                "Ol", args, code);\r
+            goto finally;\r
+        }\r
+\r
+        /* Generate an EXT opcode. */\r
+        if (code <= 0xff) {\r
+            c_str[0] = EXT1;\r
+            c_str[1] = (char)code;\r
+            n = 2;\r
+        }\r
+        else if (code <= 0xffff) {\r
+            c_str[0] = EXT2;\r
+            c_str[1] = (char)(code & 0xff);\r
+            c_str[2] = (char)((code >> 8) & 0xff);\r
+            n = 3;\r
+        }\r
+        else {\r
+            c_str[0] = EXT4;\r
+            c_str[1] = (char)(code & 0xff);\r
+            c_str[2] = (char)((code >> 8) & 0xff);\r
+            c_str[3] = (char)((code >> 16) & 0xff);\r
+            c_str[4] = (char)((code >> 24) & 0xff);\r
+            n = 5;\r
+        }\r
+\r
+        if (self->write_func(self, c_str, n) >= 0)\r
+            res = 0;\r
+        goto finally;           /* and don't memoize */\r
+    }\r
+\r
+  gen_global:\r
+    if (self->write_func(self, &global, 1) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, module_str, module_size) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, "\n", 1) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, name_str, name_size) < 0)\r
+        goto finally;\r
+\r
+    if (self->write_func(self, "\n", 1) < 0)\r
+        goto finally;\r
+\r
+    if (put(self, args) < 0)\r
+        goto finally;\r
+\r
+    res = 0;\r
+\r
+  finally:\r
+    Py_XDECREF(module);\r
+    Py_XDECREF(global_name);\r
+    Py_XDECREF(mod);\r
+\r
+    return res;\r
+}\r
+\r
+static int\r
+save_pers(Picklerobject *self, PyObject *args, PyObject *f)\r
+{\r
+    PyObject *pid = 0;\r
+    Py_ssize_t size;\r
+    int res = -1;\r
+\r
+    static char persid = PERSID, binpersid = BINPERSID;\r
+\r
+    Py_INCREF(args);\r
+    ARG_TUP(self, args);\r
+    if (self->arg) {\r
+        pid = PyObject_Call(f, self->arg, NULL);\r
+        FREE_ARG_TUP(self);\r
+    }\r
+    if (! pid) return -1;\r
+\r
+    if (pid != Py_None) {\r
+        if (!self->bin) {\r
+            if (!PyString_Check(pid)) {\r
+                PyErr_SetString(PicklingError,\r
+                                "persistent id must be string");\r
+                goto finally;\r
+            }\r
+\r
+            if (self->write_func(self, &persid, 1) < 0)\r
+                goto finally;\r
+\r
+            if ((size = PyString_Size(pid)) < 0)\r
+                goto finally;\r
+\r
+            if (self->write_func(self,\r
+                                 PyString_AS_STRING(\r
+                                    (PyStringObject *)pid),\r
+                                 size) < 0)\r
+                goto finally;\r
+\r
+            if (self->write_func(self, "\n", 1) < 0)\r
+                goto finally;\r
+\r
+            res = 1;\r
+            goto finally;\r
+        }\r
+        else if (save(self, pid, 1) >= 0) {\r
+            if (self->write_func(self, &binpersid, 1) < 0)\r
+                res = -1;\r
+            else\r
+                res = 1;\r
+        }\r
+\r
+        goto finally;\r
+    }\r
+\r
+    res = 0;\r
+\r
+  finally:\r
+    Py_XDECREF(pid);\r
+\r
+    return res;\r
+}\r
+\r
+/* We're saving ob, and args is the 2-thru-5 tuple returned by the\r
+ * appropriate __reduce__ method for ob.\r
+ */\r
+static int\r
+save_reduce(Picklerobject *self, PyObject *args, PyObject *fn, PyObject *ob)\r
+{\r
+    PyObject *callable;\r
+    PyObject *argtup;\r
+    PyObject *state = NULL;\r
+    PyObject *listitems = Py_None;\r
+    PyObject *dictitems = Py_None;\r
+    Py_ssize_t size;\r
+\r
+    int use_newobj = self->proto >= 2;\r
+\r
+    static char reduce = REDUCE;\r
+    static char build = BUILD;\r
+    static char newobj = NEWOBJ;\r
+\r
+    size = PyTuple_Size(args);\r
+    if (size < 2 || size > 5) {\r
+        cPickle_ErrFormat(PicklingError, "tuple returned by "\r
+            "%s must contain 2 through 5 elements",\r
+            "O", fn);\r
+        return -1;\r
+    }\r
+\r
+    if (! PyArg_UnpackTuple(args, "save_reduce", 2, 5,\r
+                            &callable,\r
+                            &argtup,\r
+                            &state,\r
+                            &listitems,\r
+                            &dictitems))\r
+        return -1;\r
+\r
+    if (!PyTuple_Check(argtup)) {\r
+        cPickle_ErrFormat(PicklingError, "Second element of "\r
+            "tuple returned by %s must be a tuple",\r
+            "O", fn);\r
+        return -1;\r
+    }\r
+\r
+    if (state == Py_None)\r
+        state = NULL;\r
+\r
+    if (listitems == Py_None)\r
+        listitems = NULL;\r
+    else if (!PyIter_Check(listitems)) {\r
+        cPickle_ErrFormat(PicklingError, "Fourth element of "\r
+            "tuple returned by %s must be an iterator, not %s",\r
+            "Os", fn, Py_TYPE(listitems)->tp_name);\r
+        return -1;\r
+    }\r
+\r
+    if (dictitems == Py_None)\r
+        dictitems = NULL;\r
+    else if (!PyIter_Check(dictitems)) {\r
+        cPickle_ErrFormat(PicklingError, "Fifth element of "\r
+            "tuple returned by %s must be an iterator, not %s",\r
+            "Os", fn, Py_TYPE(dictitems)->tp_name);\r
+        return -1;\r
+    }\r
+\r
+    /* Protocol 2 special case: if callable's name is __newobj__, use\r
+     * NEWOBJ.  This consumes a lot of code.\r
+     */\r
+    if (use_newobj) {\r
+        PyObject *temp = PyObject_GetAttr(callable, __name___str);\r
+\r
+        if (temp == NULL) {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                return -1;\r
+            use_newobj = 0;\r
+        }\r
+        else {\r
+            use_newobj = PyString_Check(temp) &&\r
+                         strcmp(PyString_AS_STRING(temp),\r
+                                "__newobj__") == 0;\r
+            Py_DECREF(temp);\r
+        }\r
+    }\r
+    if (use_newobj) {\r
+        PyObject *cls;\r
+        PyObject *newargtup;\r
+        Py_ssize_t n, i;\r
+\r
+        /* Sanity checks. */\r
+        n = PyTuple_Size(argtup);\r
+        if (n < 1) {\r
+            PyErr_SetString(PicklingError, "__newobj__ arglist "\r
+                "is empty");\r
+            return -1;\r
+        }\r
+\r
+        cls = PyTuple_GET_ITEM(argtup, 0);\r
+        if (! PyObject_HasAttrString(cls, "__new__")) {\r
+            PyErr_SetString(PicklingError, "args[0] from "\r
+                "__newobj__ args has no __new__");\r
+            return -1;\r
+        }\r
+\r
+        /* XXX How could ob be NULL? */\r
+        if (ob != NULL) {\r
+            PyObject *ob_dot_class;\r
+\r
+            ob_dot_class = PyObject_GetAttr(ob, __class___str);\r
+            if (ob_dot_class == NULL) {\r
+                if (PyErr_ExceptionMatches(\r
+                            PyExc_AttributeError))\r
+                    PyErr_Clear();\r
+                else\r
+                    return -1;\r
+            }\r
+            i = ob_dot_class != cls; /* true iff a problem */\r
+            Py_XDECREF(ob_dot_class);\r
+            if (i) {\r
+                PyErr_SetString(PicklingError, "args[0] from "\r
+                    "__newobj__ args has the wrong class");\r
+                return -1;\r
+            }\r
+        }\r
+\r
+        /* Save the class and its __new__ arguments. */\r
+        if (save(self, cls, 0) < 0)\r
+            return -1;\r
+\r
+        newargtup = PyTuple_New(n-1);  /* argtup[1:] */\r
+        if (newargtup == NULL)\r
+            return -1;\r
+        for (i = 1; i < n; ++i) {\r
+            PyObject *temp = PyTuple_GET_ITEM(argtup, i);\r
+            Py_INCREF(temp);\r
+            PyTuple_SET_ITEM(newargtup, i-1, temp);\r
+        }\r
+        i = save(self, newargtup, 0);\r
+        Py_DECREF(newargtup);\r
+        if (i < 0)\r
+            return -1;\r
+\r
+        /* Add NEWOBJ opcode. */\r
+        if (self->write_func(self, &newobj, 1) < 0)\r
+            return -1;\r
+    }\r
+    else {\r
+        /* Not using NEWOBJ. */\r
+        if (save(self, callable, 0) < 0 ||\r
+            save(self, argtup, 0) < 0 ||\r
+            self->write_func(self, &reduce, 1) < 0)\r
+            return -1;\r
+    }\r
+\r
+    /* Memoize. */\r
+    /* XXX How can ob be NULL? */\r
+    if (ob != NULL) {\r
+        if (state && !PyDict_Check(state)) {\r
+            if (put2(self, ob) < 0)\r
+                return -1;\r
+        }\r
+        else if (put(self, ob) < 0)\r
+                        return -1;\r
+    }\r
+\r
+\r
+    if (listitems && batch_list(self, listitems) < 0)\r
+        return -1;\r
+\r
+    if (dictitems && batch_dict(self, dictitems) < 0)\r
+        return -1;\r
+\r
+    if (state) {\r
+        if (save(self, state, 0) < 0 ||\r
+            self->write_func(self, &build, 1) < 0)\r
+            return -1;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+save(Picklerobject *self, PyObject *args, int pers_save)\r
+{\r
+    PyTypeObject *type;\r
+    PyObject *py_ob_id = 0, *__reduce__ = 0, *t = 0;\r
+    int res = -1;\r
+    int tmp;\r
+\r
+    if (Py_EnterRecursiveCall(" while pickling an object"))\r
+        return -1;\r
+\r
+    if (!pers_save && self->pers_func) {\r
+        if ((tmp = save_pers(self, args, self->pers_func)) != 0) {\r
+            res = tmp;\r
+            goto finally;\r
+        }\r
+    }\r
+\r
+    if (args == Py_None) {\r
+        res = save_none(self, args);\r
+        goto finally;\r
+    }\r
+\r
+    type = Py_TYPE(args);\r
+\r
+    switch (type->tp_name[0]) {\r
+    case 'b':\r
+        if (args == Py_False || args == Py_True) {\r
+            res = save_bool(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+    case 'i':\r
+        if (type == &PyInt_Type) {\r
+            res = save_int(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'l':\r
+        if (type == &PyLong_Type) {\r
+            res = save_long(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'f':\r
+        if (type == &PyFloat_Type) {\r
+            res = save_float(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 't':\r
+        if (type == &PyTuple_Type && PyTuple_Size(args) == 0) {\r
+            res = save_tuple(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 's':\r
+        if ((type == &PyString_Type) && (PyString_GET_SIZE(args) < 2)) {\r
+            res = save_string(self, args, 0);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    case 'u':\r
+        if ((type == &PyUnicode_Type) && (PyString_GET_SIZE(args) < 2)) {\r
+            res = save_unicode(self, args, 0);\r
+            goto finally;\r
+        }\r
+        break;\r
+#endif\r
+    }\r
+\r
+    if (Py_REFCNT(args) > 1) {\r
+        if (!( py_ob_id = PyLong_FromVoidPtr(args)))\r
+            goto finally;\r
+\r
+        if (PyDict_GetItem(self->memo, py_ob_id)) {\r
+            if (get(self, py_ob_id) < 0)\r
+                goto finally;\r
+\r
+            res = 0;\r
+            goto finally;\r
+        }\r
+    }\r
+\r
+    switch (type->tp_name[0]) {\r
+    case 's':\r
+        if (type == &PyString_Type) {\r
+            res = save_string(self, args, 1);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    case 'u':\r
+        if (type == &PyUnicode_Type) {\r
+            res = save_unicode(self, args, 1);\r
+            goto finally;\r
+        }\r
+        break;\r
+#endif\r
+\r
+    case 't':\r
+        if (type == &PyTuple_Type) {\r
+            res = save_tuple(self, args);\r
+            goto finally;\r
+        }\r
+        if (type == &PyType_Type) {\r
+            res = save_global(self, args, NULL);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'l':\r
+        if (type == &PyList_Type) {\r
+            res = save_list(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'd':\r
+        if (type == &PyDict_Type) {\r
+            res = save_dict(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'i':\r
+        if (type == &PyInstance_Type) {\r
+            res = save_inst(self, args);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'c':\r
+        if (type == &PyClass_Type) {\r
+            res = save_global(self, args, NULL);\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'f':\r
+        if (type == &PyFunction_Type) {\r
+            res = save_global(self, args, NULL);\r
+            if (res && PyErr_ExceptionMatches(PickleError)) {\r
+                /* fall back to reduce */\r
+                PyErr_Clear();\r
+                break;\r
+            }\r
+            goto finally;\r
+        }\r
+        break;\r
+\r
+    case 'b':\r
+        if (type == &PyCFunction_Type) {\r
+            res = save_global(self, args, NULL);\r
+            goto finally;\r
+        }\r
+    }\r
+\r
+    if (!pers_save && self->inst_pers_func) {\r
+        if ((tmp = save_pers(self, args, self->inst_pers_func)) != 0) {\r
+            res = tmp;\r
+            goto finally;\r
+        }\r
+    }\r
+\r
+    /* Get a reduction callable, and call it.  This may come from\r
+     * copy_reg.dispatch_table, the object's __reduce_ex__ method,\r
+     * or the object's __reduce__ method.\r
+     */\r
+    __reduce__ = PyDict_GetItem(dispatch_table, (PyObject *)type);\r
+    if (__reduce__ != NULL) {\r
+        Py_INCREF(__reduce__);\r
+        Py_INCREF(args);\r
+        ARG_TUP(self, args);\r
+        if (self->arg) {\r
+            t = PyObject_Call(__reduce__, self->arg, NULL);\r
+            FREE_ARG_TUP(self);\r
+        }\r
+    }\r
+    else {\r
+        if (PyType_IsSubtype(type, &PyType_Type)) {\r
+            res = save_global(self, args, NULL);\r
+            goto finally;\r
+        }\r
+\r
+        /* Check for a __reduce_ex__ method. */\r
+        __reduce__ = PyObject_GetAttr(args, __reduce_ex___str);\r
+        if (__reduce__ != NULL) {\r
+            t = PyInt_FromLong(self->proto);\r
+            if (t != NULL) {\r
+                ARG_TUP(self, t);\r
+                t = NULL;\r
+                if (self->arg) {\r
+                    t = PyObject_Call(__reduce__,\r
+                                      self->arg, NULL);\r
+                    FREE_ARG_TUP(self);\r
+                }\r
+            }\r
+        }\r
+        else {\r
+            if (PyErr_ExceptionMatches(PyExc_AttributeError))\r
+                PyErr_Clear();\r
+            else\r
+                goto finally;\r
+            /* Check for a __reduce__ method. */\r
+            __reduce__ = PyObject_GetAttr(args, __reduce___str);\r
+            if (__reduce__ != NULL) {\r
+                t = PyObject_Call(__reduce__,\r
+                                  empty_tuple, NULL);\r
+            }\r
+            else {\r
+                PyErr_SetObject(UnpickleableError, args);\r
+                goto finally;\r
+            }\r
+        }\r
+    }\r
+\r
+    if (t == NULL)\r
+        goto finally;\r
+\r
+    if (PyString_Check(t)) {\r
+        res = save_global(self, args, t);\r
+        goto finally;\r
+    }\r
+\r
+    if (!PyTuple_Check(t)) {\r
+        cPickle_ErrFormat(PicklingError, "Value returned by "\r
+                        "%s must be string or tuple",\r
+                        "O", __reduce__);\r
+        goto finally;\r
+    }\r
+\r
+    res = save_reduce(self, t, __reduce__, args);\r
+\r
+  finally:\r
+    Py_LeaveRecursiveCall();\r
+    Py_XDECREF(py_ob_id);\r
+    Py_XDECREF(__reduce__);\r
+    Py_XDECREF(t);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+static int\r
+dump(Picklerobject *self, PyObject *args)\r
+{\r
+    static char stop = STOP;\r
+\r
+    if (self->proto >= 2) {\r
+        char bytes[2];\r
+\r
+        bytes[0] = PROTO;\r
+        assert(self->proto >= 0 && self->proto < 256);\r
+        bytes[1] = (char)self->proto;\r
+        if (self->write_func(self, bytes, 2) < 0)\r
+            return -1;\r
+    }\r
+\r
+    if (save(self, args, 0) < 0)\r
+        return -1;\r
+\r
+    if (self->write_func(self, &stop, 1) < 0)\r
+        return -1;\r
+\r
+    if (self->write_func(self, NULL, 0) < 0)\r
+        return -1;\r
+\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Pickle_clear_memo(Picklerobject *self, PyObject *args)\r
+{\r
+    if (self->memo)\r
+        PyDict_Clear(self->memo);\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+Pickle_getvalue(Picklerobject *self, PyObject *args)\r
+{\r
+    Py_ssize_t l, i, rsize, ssize, clear=1, lm;\r
+    long ik;\r
+    PyObject *k, *r;\r
+    char *s, *p, *have_get;\r
+    Pdata *data;\r
+\r
+    /* Can be called by Python code or C code */\r
+    if (args && !PyArg_ParseTuple(args, "|i:getvalue", &clear))\r
+        return NULL;\r
+\r
+    /* Check to make sure we are based on a list */\r
+    if (! Pdata_Check(self->file)) {\r
+        PyErr_SetString(PicklingError,\r
+                        "Attempt to getvalue() a non-list-based pickler");\r
+        return NULL;\r
+    }\r
+\r
+    /* flush write buffer */\r
+    if (write_other(self, NULL, 0) < 0) return NULL;\r
+\r
+    data=(Pdata*)self->file;\r
+    l=data->length;\r
+\r
+    /* set up an array to hold get/put status */\r
+    lm = PyDict_Size(self->memo);\r
+    if (lm < 0) return NULL;\r
+    lm++;\r
+    have_get = malloc(lm);\r
+    if (have_get == NULL) return PyErr_NoMemory();\r
+    memset(have_get, 0, lm);\r
+\r
+    /* Scan for gets. */\r
+    for (rsize = 0, i = l; --i >= 0; ) {\r
+        k = data->data[i];\r
+\r
+        if (PyString_Check(k))\r
+            rsize += PyString_GET_SIZE(k);\r
+\r
+        else if (PyInt_Check(k)) { /* put */\r
+            ik = PyInt_AS_LONG((PyIntObject*)k);\r
+            if (ik >= lm || ik == 0) {\r
+                PyErr_SetString(PicklingError,\r
+                                "Invalid get data");\r
+                goto err;\r
+            }\r
+            if (have_get[ik]) /* with matching get */\r
+                rsize += ik < 256 ? 2 : 5;\r
+        }\r
+\r
+        else if (! (PyTuple_Check(k) &&\r
+                    PyTuple_GET_SIZE(k) == 2 &&\r
+                    PyInt_Check((k = PyTuple_GET_ITEM(k, 0))))\r
+            ) {\r
+            PyErr_SetString(PicklingError,\r
+                            "Unexpected data in internal list");\r
+            goto err;\r
+        }\r
+\r
+        else { /* put */\r
+            ik = PyInt_AS_LONG((PyIntObject *)k);\r
+            if (ik >= lm || ik == 0) {\r
+                PyErr_SetString(PicklingError,\r
+                                "Invalid get data");\r
+                return NULL;\r
+            }\r
+            have_get[ik] = 1;\r
+            rsize += ik < 256 ? 2 : 5;\r
+        }\r
+    }\r
+\r
+    /* Now generate the result */\r
+    r = PyString_FromStringAndSize(NULL, rsize);\r
+    if (r == NULL) goto err;\r
+    s = PyString_AS_STRING((PyStringObject *)r);\r
+\r
+    for (i = 0; i < l; i++) {\r
+        k = data->data[i];\r
+\r
+        if (PyString_Check(k)) {\r
+            ssize = PyString_GET_SIZE(k);\r
+            if (ssize) {\r
+                p=PyString_AS_STRING((PyStringObject *)k);\r
+                while (--ssize >= 0)\r
+                    *s++ = *p++;\r
+            }\r
+        }\r
+\r
+        else if (PyTuple_Check(k)) { /* get */\r
+            ik = PyInt_AS_LONG((PyIntObject *)\r
+                                PyTuple_GET_ITEM(k, 0));\r
+            if (ik < 256) {\r
+                *s++ = BINGET;\r
+                *s++ = (int)(ik & 0xff);\r
+            }\r
+            else {\r
+                *s++ = LONG_BINGET;\r
+                *s++ = (int)(ik & 0xff);\r
+                *s++ = (int)((ik >> 8)  & 0xff);\r
+                *s++ = (int)((ik >> 16) & 0xff);\r
+                *s++ = (int)((ik >> 24) & 0xff);\r
+            }\r
+        }\r
+\r
+        else { /* put */\r
+            ik = PyInt_AS_LONG((PyIntObject*)k);\r
+\r
+            if (have_get[ik]) { /* with matching get */\r
+                if (ik < 256) {\r
+                    *s++ = BINPUT;\r
+                    *s++ = (int)(ik & 0xff);\r
+                }\r
+                else {\r
+                    *s++ = LONG_BINPUT;\r
+                    *s++ = (int)(ik & 0xff);\r
+                    *s++ = (int)((ik >> 8)  & 0xff);\r
+                    *s++ = (int)((ik >> 16) & 0xff);\r
+                    *s++ = (int)((ik >> 24) & 0xff);\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    if (clear) {\r
+        PyDict_Clear(self->memo);\r
+        Pdata_clear(data, 0);\r
+    }\r
+\r
+    free(have_get);\r
+    return r;\r
+  err:\r
+    free(have_get);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+Pickler_dump(Picklerobject *self, PyObject *args)\r
+{\r
+    PyObject *ob;\r
+    int get=0;\r
+\r
+    if (!( PyArg_ParseTuple(args, "O|i:dump", &ob, &get)))\r
+        return NULL;\r
+\r
+    if (dump(self, ob) < 0)\r
+        return NULL;\r
+\r
+    if (get) return Pickle_getvalue(self, NULL);\r
+\r
+    /* XXX Why does dump() return self? */\r
+    Py_INCREF(self);\r
+    return (PyObject*)self;\r
+}\r
+\r
+\r
+static struct PyMethodDef Pickler_methods[] =\r
+{\r
+  {"dump",          (PyCFunction)Pickler_dump,  METH_VARARGS,\r
+   PyDoc_STR("dump(object) -- "\r
+   "Write an object in pickle format to the object's pickle stream")},\r
+  {"clear_memo",  (PyCFunction)Pickle_clear_memo,  METH_NOARGS,\r
+   PyDoc_STR("clear_memo() -- Clear the picklers memo")},\r
+  {"getvalue",  (PyCFunction)Pickle_getvalue,  METH_VARARGS,\r
+   PyDoc_STR("getvalue() -- Finish picking a list-based pickle")},\r
+  {NULL,                NULL}           /* sentinel */\r
+};\r
+\r
+\r
+static Picklerobject *\r
+newPicklerobject(PyObject *file, int proto)\r
+{\r
+    Picklerobject *self;\r
+\r
+    if (proto < 0)\r
+        proto = HIGHEST_PROTOCOL;\r
+    if (proto > HIGHEST_PROTOCOL) {\r
+        PyErr_Format(PyExc_ValueError, "pickle protocol %d asked for; "\r
+                     "the highest available protocol is %d",\r
+                     proto, HIGHEST_PROTOCOL);\r
+        return NULL;\r
+    }\r
+\r
+    self = PyObject_GC_New(Picklerobject, &Picklertype);\r
+    if (self == NULL)\r
+        return NULL;\r
+    self->proto = proto;\r
+    self->bin = proto > 0;\r
+    self->fp = NULL;\r
+    self->write = NULL;\r
+    self->memo = NULL;\r
+    self->arg = NULL;\r
+    self->pers_func = NULL;\r
+    self->inst_pers_func = NULL;\r
+    self->write_buf = NULL;\r
+    self->fast = 0;\r
+    self->fast_container = 0;\r
+    self->fast_memo = NULL;\r
+    self->buf_size = 0;\r
+    self->dispatch_table = NULL;\r
+\r
+    self->file = NULL;\r
+    if (file)\r
+        Py_INCREF(file);\r
+    else {\r
+        file = Pdata_New();\r
+        if (file == NULL)\r
+            goto err;\r
+    }\r
+    self->file = file;\r
+\r
+    if (!( self->memo = PyDict_New()))\r
+        goto err;\r
+\r
+    if (PyFile_Check(file)) {\r
+        self->fp = PyFile_AsFile(file);\r
+        if (self->fp == NULL) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "I/O operation on closed file");\r
+            goto err;\r
+        }\r
+        self->write_func = write_file;\r
+    }\r
+    else if (PycStringIO_OutputCheck(file)) {\r
+        self->write_func = write_cStringIO;\r
+    }\r
+    else if (file == Py_None) {\r
+        self->write_func = write_none;\r
+    }\r
+    else {\r
+        self->write_func = write_other;\r
+\r
+        if (! Pdata_Check(file)) {\r
+            self->write = PyObject_GetAttr(file, write_str);\r
+            if (!self->write)  {\r
+                PyErr_Clear();\r
+                PyErr_SetString(PyExc_TypeError,\r
+                                "argument must have 'write' "\r
+                                "attribute");\r
+                goto err;\r
+            }\r
+        }\r
+\r
+        self->write_buf = (char *)PyMem_Malloc(WRITE_BUF_SIZE);\r
+        if (self->write_buf == NULL) {\r
+            PyErr_NoMemory();\r
+            goto err;\r
+        }\r
+    }\r
+\r
+    if (PyEval_GetRestricted()) {\r
+        /* Restricted execution, get private tables */\r
+        PyObject *m = PyImport_ImportModule("copy_reg");\r
+\r
+        if (m == NULL)\r
+            goto err;\r
+        self->dispatch_table = PyObject_GetAttr(m, dispatch_table_str);\r
+        Py_DECREF(m);\r
+        if (self->dispatch_table == NULL)\r
+            goto err;\r
+    }\r
+    else {\r
+        self->dispatch_table = dispatch_table;\r
+        Py_INCREF(dispatch_table);\r
+    }\r
+    PyObject_GC_Track(self);\r
+\r
+    return self;\r
+\r
+  err:\r
+    Py_DECREF(self);\r
+    return NULL;\r
+}\r
+\r
+\r
+static PyObject *\r
+get_Pickler(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwlist[] = {"file", "protocol", NULL};\r
+    PyObject *file = NULL;\r
+    int proto = 0;\r
+\r
+    /* XXX\r
+     * The documented signature is Pickler(file, protocol=0), but this\r
+     * accepts Pickler() and Pickler(integer) too.  The meaning then\r
+     * is clear as mud, undocumented, and not supported by pickle.py.\r
+     * I'm told Zope uses this, but I haven't traced into this code\r
+     * far enough to figure out what it means.\r
+     */\r
+    if (!PyArg_ParseTuple(args, "|i:Pickler", &proto)) {\r
+        PyErr_Clear();\r
+        proto = 0;\r
+        if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|i:Pickler",\r
+                    kwlist, &file, &proto))\r
+            return NULL;\r
+    }\r
+    return (PyObject *)newPicklerobject(file, proto);\r
+}\r
+\r
+\r
+static void\r
+Pickler_dealloc(Picklerobject *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    Py_XDECREF(self->write);\r
+    Py_XDECREF(self->memo);\r
+    Py_XDECREF(self->fast_memo);\r
+    Py_XDECREF(self->arg);\r
+    Py_XDECREF(self->file);\r
+    Py_XDECREF(self->pers_func);\r
+    Py_XDECREF(self->inst_pers_func);\r
+    Py_XDECREF(self->dispatch_table);\r
+    PyMem_Free(self->write_buf);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static int\r
+Pickler_traverse(Picklerobject *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->write);\r
+    Py_VISIT(self->memo);\r
+    Py_VISIT(self->fast_memo);\r
+    Py_VISIT(self->arg);\r
+    Py_VISIT(self->file);\r
+    Py_VISIT(self->pers_func);\r
+    Py_VISIT(self->inst_pers_func);\r
+    Py_VISIT(self->dispatch_table);\r
+    return 0;\r
+}\r
+\r
+static int\r
+Pickler_clear(Picklerobject *self)\r
+{\r
+    Py_CLEAR(self->write);\r
+    Py_CLEAR(self->memo);\r
+    Py_CLEAR(self->fast_memo);\r
+    Py_CLEAR(self->arg);\r
+    Py_CLEAR(self->file);\r
+    Py_CLEAR(self->pers_func);\r
+    Py_CLEAR(self->inst_pers_func);\r
+    Py_CLEAR(self->dispatch_table);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Pickler_get_pers_func(Picklerobject *p)\r
+{\r
+    if (p->pers_func == NULL)\r
+        PyErr_SetString(PyExc_AttributeError, "persistent_id");\r
+    else\r
+        Py_INCREF(p->pers_func);\r
+    return p->pers_func;\r
+}\r
+\r
+static int\r
+Pickler_set_pers_func(Picklerobject *p, PyObject *v)\r
+{\r
+    if (v == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "attribute deletion is not supported");\r
+        return -1;\r
+    }\r
+    Py_XDECREF(p->pers_func);\r
+    Py_INCREF(v);\r
+    p->pers_func = v;\r
+    return 0;\r
+}\r
+\r
+static int\r
+Pickler_set_inst_pers_func(Picklerobject *p, PyObject *v)\r
+{\r
+    if (v == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "attribute deletion is not supported");\r
+        return -1;\r
+    }\r
+    Py_XDECREF(p->inst_pers_func);\r
+    Py_INCREF(v);\r
+    p->inst_pers_func = v;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Pickler_get_memo(Picklerobject *p)\r
+{\r
+    if (p->memo == NULL)\r
+        PyErr_SetString(PyExc_AttributeError, "memo");\r
+    else\r
+        Py_INCREF(p->memo);\r
+    return p->memo;\r
+}\r
+\r
+static int\r
+Pickler_set_memo(Picklerobject *p, PyObject *v)\r
+{\r
+    if (v == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "attribute deletion is not supported");\r
+        return -1;\r
+    }\r
+    if (!PyDict_Check(v)) {\r
+        PyErr_SetString(PyExc_TypeError, "memo must be a dictionary");\r
+        return -1;\r
+    }\r
+    Py_XDECREF(p->memo);\r
+    Py_INCREF(v);\r
+    p->memo = v;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Pickler_get_error(Picklerobject *p)\r
+{\r
+    /* why is this an attribute on the Pickler? */\r
+    Py_INCREF(PicklingError);\r
+    return PicklingError;\r
+}\r
+\r
+static PyMemberDef Pickler_members[] = {\r
+    {"binary", T_INT, offsetof(Picklerobject, bin)},\r
+    {"fast", T_INT, offsetof(Picklerobject, fast)},\r
+    {NULL}\r
+};\r
+\r
+static PyGetSetDef Pickler_getsets[] = {\r
+    {"persistent_id", (getter)Pickler_get_pers_func,\r
+                     (setter)Pickler_set_pers_func},\r
+    {"inst_persistent_id", NULL, (setter)Pickler_set_inst_pers_func},\r
+    {"memo", (getter)Pickler_get_memo, (setter)Pickler_set_memo},\r
+    {"PicklingError", (getter)Pickler_get_error, NULL},\r
+    {NULL}\r
+};\r
+\r
+PyDoc_STRVAR(Picklertype__doc__,\r
+"Objects that know how to pickle objects\n");\r
+\r
+static PyTypeObject Picklertype = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "cPickle.Pickler",            /*tp_name*/\r
+    sizeof(Picklerobject),              /*tp_basicsize*/\r
+    0,\r
+    (destructor)Pickler_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    PyObject_GenericSetAttr,            /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,\r
+    Picklertype__doc__,                 /* tp_doc */\r
+    (traverseproc)Pickler_traverse,     /* tp_traverse */\r
+    (inquiry)Pickler_clear,             /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    Pickler_methods,                    /* tp_methods */\r
+    Pickler_members,                    /* tp_members */\r
+    Pickler_getsets,                    /* tp_getset */\r
+};\r
+\r
+static PyObject *\r
+find_class(PyObject *py_module_name, PyObject *py_global_name, PyObject *fc)\r
+{\r
+    PyObject *global = 0, *module;\r
+\r
+    if (fc) {\r
+        if (fc==Py_None) {\r
+            PyErr_SetString(UnpicklingError, "Global and instance "\r
+                            "pickles are not supported.");\r
+            return NULL;\r
+        }\r
+        return PyObject_CallFunctionObjArgs(fc, py_module_name,\r
+                                            py_global_name, NULL);\r
+    }\r
+\r
+    module = PySys_GetObject("modules");\r
+    if (module == NULL)\r
+        return NULL;\r
+\r
+    module = PyDict_GetItem(module, py_module_name);\r
+    if (module == NULL) {\r
+        module = PyImport_Import(py_module_name);\r
+        if (!module)\r
+            return NULL;\r
+        global = PyObject_GetAttr(module, py_global_name);\r
+        Py_DECREF(module);\r
+    }\r
+    else\r
+        global = PyObject_GetAttr(module, py_global_name);\r
+    return global;\r
+}\r
+\r
+static Py_ssize_t\r
+marker(Unpicklerobject *self)\r
+{\r
+    if (self->num_marks < 1) {\r
+        PyErr_SetString(UnpicklingError, "could not find MARK");\r
+        return -1;\r
+    }\r
+\r
+    return self->marks[--self->num_marks];\r
+}\r
+\r
+\r
+static int\r
+load_none(Unpicklerobject *self)\r
+{\r
+    PDATA_APPEND(self->stack, Py_None, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+bad_readline(void)\r
+{\r
+    PyErr_SetString(UnpicklingError, "pickle data was truncated");\r
+    return -1;\r
+}\r
+\r
+static int\r
+load_int(Unpicklerobject *self)\r
+{\r
+    PyObject *py_int = 0;\r
+    char *endptr, *s;\r
+    Py_ssize_t len;\r
+    int res = -1;\r
+    long l;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    if (!( s=pystrndup(s,len)))  return -1;\r
+\r
+    errno = 0;\r
+    l = strtol(s, &endptr, 0);\r
+\r
+    if (errno || (*endptr != '\n') || (endptr[1] != '\0')) {\r
+        /* Hm, maybe we've got something long.  Let's try reading\r
+           it as a Python long object. */\r
+        errno = 0;\r
+        py_int = PyLong_FromString(s, NULL, 0);\r
+        if (py_int == NULL) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "could not convert string to int");\r
+            goto finally;\r
+        }\r
+    }\r
+    else {\r
+        if (len == 3 && (l == 0 || l == 1)) {\r
+            if (!( py_int = PyBool_FromLong(l)))  goto finally;\r
+        }\r
+        else {\r
+            if (!( py_int = PyInt_FromLong(l)))  goto finally;\r
+        }\r
+    }\r
+\r
+    free(s);\r
+    PDATA_PUSH(self->stack, py_int, -1);\r
+    return 0;\r
+\r
+  finally:\r
+    free(s);\r
+\r
+    return res;\r
+}\r
+\r
+static int\r
+load_bool(Unpicklerobject *self, PyObject *boolean)\r
+{\r
+    assert(boolean == Py_True || boolean == Py_False);\r
+    PDATA_APPEND(self->stack, boolean, -1);\r
+    return 0;\r
+}\r
+\r
+/* s contains x bytes of a little-endian integer.  Return its value as a\r
+ * C int.  Obscure:  when x is 1 or 2, this is an unsigned little-endian\r
+ * int, but when x is 4 it's a signed one.  This is an historical source\r
+ * of x-platform bugs.\r
+ */\r
+static long\r
+calc_binint(char *s, int x)\r
+{\r
+    unsigned char c;\r
+    int i;\r
+    long l;\r
+\r
+    for (i = 0, l = 0L; i < x; i++) {\r
+        c = (unsigned char)s[i];\r
+        l |= (long)c << (i * 8);\r
+    }\r
+#if SIZEOF_LONG > 4\r
+    /* Unlike BININT1 and BININT2, BININT (more accurately BININT4)\r
+     * is signed, so on a box with longs bigger than 4 bytes we need\r
+     * to extend a BININT's sign bit to the full width.\r
+     */\r
+    if (x == 4 && l & (1L << 31))\r
+        l |= (~0L) << 32;\r
+#endif\r
+    return l;\r
+}\r
+\r
+\r
+static int\r
+load_binintx(Unpicklerobject *self, char *s, int  x)\r
+{\r
+    PyObject *py_int = 0;\r
+    long l;\r
+\r
+    l = calc_binint(s, x);\r
+\r
+    if (!( py_int = PyInt_FromLong(l)))\r
+        return -1;\r
+\r
+    PDATA_PUSH(self->stack, py_int, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_binint(Unpicklerobject *self)\r
+{\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 4) < 0)\r
+        return -1;\r
+\r
+    return load_binintx(self, s, 4);\r
+}\r
+\r
+\r
+static int\r
+load_binint1(Unpicklerobject *self)\r
+{\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 1) < 0)\r
+        return -1;\r
+\r
+    return load_binintx(self, s, 1);\r
+}\r
+\r
+\r
+static int\r
+load_binint2(Unpicklerobject *self)\r
+{\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 2) < 0)\r
+        return -1;\r
+\r
+    return load_binintx(self, s, 2);\r
+}\r
+\r
+static int\r
+load_long(Unpicklerobject *self)\r
+{\r
+    PyObject *l = 0;\r
+    char *end, *s;\r
+    Py_ssize_t len;\r
+    int res = -1;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    if (!( s=pystrndup(s,len)))  return -1;\r
+\r
+    if (!( l = PyLong_FromString(s, &end, 0)))\r
+        goto finally;\r
+\r
+    free(s);\r
+    PDATA_PUSH(self->stack, l, -1);\r
+    return 0;\r
+\r
+  finally:\r
+    free(s);\r
+\r
+    return res;\r
+}\r
+\r
+/* 'size' bytes contain the # of bytes of little-endian 256's-complement\r
+ * data following.\r
+ */\r
+static int\r
+load_counted_long(Unpicklerobject *self, int size)\r
+{\r
+    Py_ssize_t i;\r
+    char *nbytes;\r
+    unsigned char *pdata;\r
+    PyObject *along;\r
+\r
+    assert(size == 1 || size == 4);\r
+    i = self->read_func(self, &nbytes, size);\r
+    if (i < 0) return -1;\r
+\r
+    size = calc_binint(nbytes, size);\r
+    if (size < 0) {\r
+        /* Corrupt or hostile pickle -- we never write one like\r
+         * this.\r
+         */\r
+        PyErr_SetString(UnpicklingError, "LONG pickle has negative "\r
+                        "byte count");\r
+        return -1;\r
+    }\r
+\r
+    if (size == 0)\r
+        along = PyLong_FromLong(0L);\r
+    else {\r
+        /* Read the raw little-endian bytes & convert. */\r
+        i = self->read_func(self, (char **)&pdata, size);\r
+        if (i < 0) return -1;\r
+        along = _PyLong_FromByteArray(pdata, (size_t)size,\r
+                        1 /* little endian */, 1 /* signed */);\r
+    }\r
+    if (along == NULL)\r
+        return -1;\r
+    PDATA_PUSH(self->stack, along, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_float(Unpicklerobject *self)\r
+{\r
+    PyObject *py_float = 0;\r
+    char *endptr, *s;\r
+    Py_ssize_t len;\r
+    int res = -1;\r
+    double d;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    if (!( s=pystrndup(s,len)))  return -1;\r
+\r
+    d = PyOS_string_to_double(s, &endptr, PyExc_OverflowError);\r
+\r
+    if (d == -1.0 && PyErr_Occurred()) {\r
+        goto finally;\r
+    } else if ((endptr[0] != '\n') || (endptr[1] != '\0')) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "could not convert string to float");\r
+        goto finally;\r
+    }\r
+\r
+    if (!( py_float = PyFloat_FromDouble(d)))\r
+        goto finally;\r
+\r
+    free(s);\r
+    PDATA_PUSH(self->stack, py_float, -1);\r
+    return 0;\r
+\r
+  finally:\r
+    free(s);\r
+\r
+    return res;\r
+}\r
+\r
+static int\r
+load_binfloat(Unpicklerobject *self)\r
+{\r
+    PyObject *py_float;\r
+    double x;\r
+    char *p;\r
+\r
+    if (self->read_func(self, &p, 8) < 0)\r
+        return -1;\r
+\r
+    x = _PyFloat_Unpack8((unsigned char *)p, 0);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return -1;\r
+\r
+    py_float = PyFloat_FromDouble(x);\r
+    if (py_float == NULL)\r
+        return -1;\r
+\r
+    PDATA_PUSH(self->stack, py_float, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_string(Unpicklerobject *self)\r
+{\r
+    PyObject *str = 0;\r
+    Py_ssize_t len;\r
+    int res = -1;\r
+    char *s, *p;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    if (!( s=pystrndup(s,len)))  return -1;\r
+\r
+\r
+    /* Strip outermost quotes */\r
+    while (len > 0 && s[len-1] <= ' ')\r
+        len--;\r
+    if (len > 1 && s[0]=='"' && s[len-1]=='"') {\r
+        s[len-1] = '\0';\r
+        p = s + 1 ;\r
+        len -= 2;\r
+    }\r
+    else if (len > 1 && s[0]=='\'' && s[len-1]=='\'') {\r
+        s[len-1] = '\0';\r
+        p = s + 1 ;\r
+        len -= 2;\r
+    }\r
+    else\r
+        goto insecure;\r
+    /********************************************/\r
+\r
+    str = PyString_DecodeEscape(p, len, NULL, 0, NULL);\r
+    free(s);\r
+    if (str) {\r
+        PDATA_PUSH(self->stack, str, -1);\r
+        res = 0;\r
+    }\r
+    return res;\r
+\r
+  insecure:\r
+    free(s);\r
+    PyErr_SetString(PyExc_ValueError,"insecure string pickle");\r
+    return -1;\r
+}\r
+\r
+\r
+static int\r
+load_binstring(Unpicklerobject *self)\r
+{\r
+    PyObject *py_string = 0;\r
+    Py_ssize_t l;\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 4) < 0) return -1;\r
+\r
+    l = calc_binint(s, 4);\r
+    if (l < 0) {\r
+        /* Corrupt or hostile pickle -- we never write one like\r
+         * this.\r
+         */\r
+        PyErr_SetString(UnpicklingError,\r
+                        "BINSTRING pickle has negative byte count");\r
+        return -1;\r
+    }\r
+\r
+    if (self->read_func(self, &s, l) < 0)\r
+        return -1;\r
+\r
+    if (!( py_string = PyString_FromStringAndSize(s, l)))\r
+        return -1;\r
+\r
+    PDATA_PUSH(self->stack, py_string, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_short_binstring(Unpicklerobject *self)\r
+{\r
+    PyObject *py_string = 0;\r
+    unsigned char l;\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 1) < 0)\r
+        return -1;\r
+\r
+    l = (unsigned char)s[0];\r
+\r
+    if (self->read_func(self, &s, l) < 0) return -1;\r
+\r
+    if (!( py_string = PyString_FromStringAndSize(s, l)))  return -1;\r
+\r
+    PDATA_PUSH(self->stack, py_string, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+static int\r
+load_unicode(Unpicklerobject *self)\r
+{\r
+    PyObject *str = 0;\r
+    Py_ssize_t len;\r
+    char *s;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 1) return bad_readline();\r
+\r
+    if (!( str = PyUnicode_DecodeRawUnicodeEscape(s, len - 1, NULL)))\r
+        return -1;\r
+\r
+    PDATA_PUSH(self->stack, str, -1);\r
+    return 0;\r
+}\r
+#endif\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+static int\r
+load_binunicode(Unpicklerobject *self)\r
+{\r
+    PyObject *unicode;\r
+    Py_ssize_t l;\r
+    char *s;\r
+\r
+    if (self->read_func(self, &s, 4) < 0) return -1;\r
+\r
+    l = calc_binint(s, 4);\r
+    if (l < 0) {\r
+        /* Corrupt or hostile pickle -- we never write one like\r
+         * this.\r
+         */\r
+        PyErr_SetString(UnpicklingError,\r
+                        "BINUNICODE pickle has negative byte count");\r
+        return -1;\r
+    }\r
+\r
+    if (self->read_func(self, &s, l) < 0)\r
+        return -1;\r
+\r
+    if (!( unicode = PyUnicode_DecodeUTF8(s, l, NULL)))\r
+        return -1;\r
+\r
+    PDATA_PUSH(self->stack, unicode, -1);\r
+    return 0;\r
+}\r
+#endif\r
+\r
+\r
+static int\r
+load_tuple(Unpicklerobject *self)\r
+{\r
+    PyObject *tup;\r
+    Py_ssize_t i;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    if (!( tup=Pdata_popTuple(self->stack, i)))  return -1;\r
+    PDATA_PUSH(self->stack, tup, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_counted_tuple(Unpicklerobject *self, int len)\r
+{\r
+    PyObject *tup = PyTuple_New(len);\r
+\r
+    if (tup == NULL)\r
+        return -1;\r
+\r
+    while (--len >= 0) {\r
+        PyObject *element;\r
+\r
+        PDATA_POP(self->stack, element);\r
+        if (element == NULL)\r
+            return -1;\r
+        PyTuple_SET_ITEM(tup, len, element);\r
+    }\r
+    PDATA_PUSH(self->stack, tup, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_empty_list(Unpicklerobject *self)\r
+{\r
+    PyObject *list;\r
+\r
+    if (!( list=PyList_New(0)))  return -1;\r
+    PDATA_PUSH(self->stack, list, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_empty_dict(Unpicklerobject *self)\r
+{\r
+    PyObject *dict;\r
+\r
+    if (!( dict=PyDict_New()))  return -1;\r
+    PDATA_PUSH(self->stack, dict, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_list(Unpicklerobject *self)\r
+{\r
+    PyObject *list = 0;\r
+    Py_ssize_t i;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    if (!( list=Pdata_popList(self->stack, i)))  return -1;\r
+    PDATA_PUSH(self->stack, list, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_dict(Unpicklerobject *self)\r
+{\r
+    PyObject *dict, *key, *value;\r
+    Py_ssize_t i, j, k;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    j=self->stack->length;\r
+\r
+    if (!( dict = PyDict_New()))  return -1;\r
+\r
+    for (k = i+1; k < j; k += 2) {\r
+        key  =self->stack->data[k-1];\r
+        value=self->stack->data[k  ];\r
+        if (PyDict_SetItem(dict, key, value) < 0) {\r
+            Py_DECREF(dict);\r
+            return -1;\r
+        }\r
+    }\r
+    Pdata_clear(self->stack, i);\r
+    PDATA_PUSH(self->stack, dict, -1);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Instance_New(PyObject *cls, PyObject *args)\r
+{\r
+    PyObject *r = 0;\r
+\r
+    if (PyClass_Check(cls)) {\r
+        int l;\r
+\r
+        if ((l=PyObject_Size(args)) < 0) goto err;\r
+        if (!( l ))  {\r
+            PyObject *__getinitargs__;\r
+\r
+            __getinitargs__ = PyObject_GetAttr(cls,\r
+                                       __getinitargs___str);\r
+            if (!__getinitargs__)  {\r
+                /* We have a class with no __getinitargs__,\r
+                   so bypass usual construction  */\r
+                PyObject *inst;\r
+\r
+                PyErr_Clear();\r
+                if (!( inst=PyInstance_NewRaw(cls, NULL)))\r
+                    goto err;\r
+                return inst;\r
+            }\r
+            Py_DECREF(__getinitargs__);\r
+        }\r
+\r
+        if ((r=PyInstance_New(cls, args, NULL))) return r;\r
+        else goto err;\r
+    }\r
+\r
+    if ((r=PyObject_CallObject(cls, args))) return r;\r
+\r
+  err:\r
+    {\r
+        PyObject *tp, *v, *tb, *tmp_value;\r
+\r
+        PyErr_Fetch(&tp, &v, &tb);\r
+        tmp_value = v;\r
+        /* NULL occurs when there was a KeyboardInterrupt */\r
+        if (tmp_value == NULL)\r
+            tmp_value = Py_None;\r
+        if ((r = PyTuple_Pack(3, tmp_value, cls, args))) {\r
+            Py_XDECREF(v);\r
+            v=r;\r
+        }\r
+        PyErr_Restore(tp,v,tb);\r
+    }\r
+    return NULL;\r
+}\r
+\r
+\r
+static int\r
+load_obj(Unpicklerobject *self)\r
+{\r
+    PyObject *class, *tup, *obj=0;\r
+    Py_ssize_t i;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    if (!( tup=Pdata_popTuple(self->stack, i+1)))  return -1;\r
+    PDATA_POP(self->stack, class);\r
+    if (class) {\r
+        obj = Instance_New(class, tup);\r
+        Py_DECREF(class);\r
+    }\r
+    Py_DECREF(tup);\r
+\r
+    if (! obj) return -1;\r
+    PDATA_PUSH(self->stack, obj, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_inst(Unpicklerobject *self)\r
+{\r
+    PyObject *tup, *class=0, *obj=0, *module_name, *class_name;\r
+    Py_ssize_t i, len;\r
+    char *s;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    module_name = PyString_FromStringAndSize(s, len - 1);\r
+    if (!module_name)  return -1;\r
+\r
+    if ((len = self->readline_func(self, &s)) >= 0) {\r
+        if (len < 2) return bad_readline();\r
+        if ((class_name = PyString_FromStringAndSize(s, len - 1))) {\r
+            class = find_class(module_name, class_name,\r
+                               self->find_class);\r
+            Py_DECREF(class_name);\r
+        }\r
+    }\r
+    Py_DECREF(module_name);\r
+\r
+    if (! class) return -1;\r
+\r
+    if ((tup=Pdata_popTuple(self->stack, i))) {\r
+        obj = Instance_New(class, tup);\r
+        Py_DECREF(tup);\r
+    }\r
+    Py_DECREF(class);\r
+\r
+    if (! obj) return -1;\r
+\r
+    PDATA_PUSH(self->stack, obj, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_newobj(Unpicklerobject *self)\r
+{\r
+    PyObject *args = NULL;\r
+    PyObject *clsraw = NULL;\r
+    PyTypeObject *cls;          /* clsraw cast to its true type */\r
+    PyObject *obj;\r
+\r
+    /* Stack is ... cls argtuple, and we want to call\r
+     * cls.__new__(cls, *argtuple).\r
+     */\r
+    PDATA_POP(self->stack, args);\r
+    if (args == NULL) goto Fail;\r
+    if (! PyTuple_Check(args)) {\r
+        PyErr_SetString(UnpicklingError, "NEWOBJ expected an arg "\r
+                                         "tuple.");\r
+        goto Fail;\r
+    }\r
+\r
+    PDATA_POP(self->stack, clsraw);\r
+    cls = (PyTypeObject *)clsraw;\r
+    if (cls == NULL) goto Fail;\r
+    if (! PyType_Check(cls)) {\r
+        PyErr_SetString(UnpicklingError, "NEWOBJ class argument "\r
+                                         "isn't a type object");\r
+        goto Fail;\r
+    }\r
+    if (cls->tp_new == NULL) {\r
+        PyErr_SetString(UnpicklingError, "NEWOBJ class argument "\r
+                                         "has NULL tp_new");\r
+        goto Fail;\r
+    }\r
+\r
+    /* Call __new__. */\r
+    obj = cls->tp_new(cls, args, NULL);\r
+    if (obj == NULL) goto Fail;\r
+\r
+    Py_DECREF(args);\r
+    Py_DECREF(clsraw);\r
+    PDATA_PUSH(self->stack, obj, -1);\r
+    return 0;\r
+\r
+ Fail:\r
+    Py_XDECREF(args);\r
+    Py_XDECREF(clsraw);\r
+    return -1;\r
+}\r
+\r
+static int\r
+load_global(Unpicklerobject *self)\r
+{\r
+    PyObject *class = 0, *module_name = 0, *class_name = 0;\r
+    Py_ssize_t len;\r
+    char *s;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+    module_name = PyString_FromStringAndSize(s, len - 1);\r
+    if (!module_name)  return -1;\r
+\r
+    if ((len = self->readline_func(self, &s)) >= 0) {\r
+        if (len < 2) {\r
+            Py_DECREF(module_name);\r
+            return bad_readline();\r
+        }\r
+        if ((class_name = PyString_FromStringAndSize(s, len - 1))) {\r
+            class = find_class(module_name, class_name,\r
+                               self->find_class);\r
+            Py_DECREF(class_name);\r
+        }\r
+    }\r
+    Py_DECREF(module_name);\r
+\r
+    if (! class) return -1;\r
+    PDATA_PUSH(self->stack, class, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_persid(Unpicklerobject *self)\r
+{\r
+    PyObject *pid = 0;\r
+    Py_ssize_t len;\r
+    char *s;\r
+\r
+    if (self->pers_func) {\r
+        if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+        if (len < 2) return bad_readline();\r
+\r
+        pid = PyString_FromStringAndSize(s, len - 1);\r
+        if (!pid)  return -1;\r
+\r
+        if (PyList_Check(self->pers_func)) {\r
+            if (PyList_Append(self->pers_func, pid) < 0) {\r
+                Py_DECREF(pid);\r
+                return -1;\r
+            }\r
+        }\r
+        else {\r
+            ARG_TUP(self, pid);\r
+            if (self->arg) {\r
+                pid = PyObject_Call(self->pers_func, self->arg,\r
+                                    NULL);\r
+                FREE_ARG_TUP(self);\r
+            }\r
+        }\r
+\r
+        if (! pid) return -1;\r
+\r
+        PDATA_PUSH(self->stack, pid, -1);\r
+        return 0;\r
+    }\r
+    else {\r
+        PyErr_SetString(UnpicklingError,\r
+                        "A load persistent id instruction was encountered,\n"\r
+                        "but no persistent_load function was specified.");\r
+        return -1;\r
+    }\r
+}\r
+\r
+static int\r
+load_binpersid(Unpicklerobject *self)\r
+{\r
+    PyObject *pid = 0;\r
+\r
+    if (self->pers_func) {\r
+        PDATA_POP(self->stack, pid);\r
+        if (! pid) return -1;\r
+\r
+        if (PyList_Check(self->pers_func)) {\r
+            if (PyList_Append(self->pers_func, pid) < 0) {\r
+                Py_DECREF(pid);\r
+                return -1;\r
+            }\r
+        }\r
+        else {\r
+            ARG_TUP(self, pid);\r
+            if (self->arg) {\r
+                pid = PyObject_Call(self->pers_func, self->arg,\r
+                                    NULL);\r
+                FREE_ARG_TUP(self);\r
+            }\r
+            if (! pid) return -1;\r
+        }\r
+\r
+        PDATA_PUSH(self->stack, pid, -1);\r
+        return 0;\r
+    }\r
+    else {\r
+        PyErr_SetString(UnpicklingError,\r
+                        "A load persistent id instruction was encountered,\n"\r
+                        "but no persistent_load function was specified.");\r
+        return -1;\r
+    }\r
+}\r
+\r
+\r
+static int\r
+load_pop(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t len = self->stack->length;\r
+\r
+    /* Note that we split the (pickle.py) stack into two stacks,\r
+       an object stack and a mark stack. We have to be clever and\r
+       pop the right one. We do this by looking at the top of the\r
+       mark stack first, and only signalling a stack underflow if\r
+       the object stack is empty and the mark stack doesn't match\r
+       our expectations.\r
+    */\r
+    if (self->num_marks > 0 && self->marks[self->num_marks - 1] == len) {\r
+        self->num_marks--;\r
+    } else if (len > 0) {\r
+        len--;\r
+        Py_DECREF(self->stack->data[len]);\r
+        self->stack->length = len;\r
+    } else {\r
+        return stackUnderflow();\r
+    }\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_pop_mark(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t i;\r
+\r
+    if ((i = marker(self)) < 0)\r
+        return -1;\r
+\r
+    Pdata_clear(self->stack, i);\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_dup(Unpicklerobject *self)\r
+{\r
+    PyObject *last;\r
+    Py_ssize_t len;\r
+\r
+    if ((len = self->stack->length) <= 0) return stackUnderflow();\r
+    last=self->stack->data[len-1];\r
+    Py_INCREF(last);\r
+    PDATA_PUSH(self->stack, last, -1);\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_get(Unpicklerobject *self)\r
+{\r
+    PyObject *py_str = 0, *value = 0;\r
+    Py_ssize_t len;\r
+    char *s;\r
+    int rc;\r
+\r
+    if ((len = self->readline_func(self, &s)) < 0) return -1;\r
+    if (len < 2) return bad_readline();\r
+\r
+    if (!( py_str = PyString_FromStringAndSize(s, len - 1)))  return -1;\r
+\r
+    value = PyDict_GetItem(self->memo, py_str);\r
+    if (! value) {\r
+        PyErr_SetObject(BadPickleGet, py_str);\r
+        rc = -1;\r
+    }\r
+    else {\r
+        PDATA_APPEND(self->stack, value, -1);\r
+        rc = 0;\r
+    }\r
+\r
+    Py_DECREF(py_str);\r
+    return rc;\r
+}\r
+\r
+\r
+static int\r
+load_binget(Unpicklerobject *self)\r
+{\r
+    PyObject *py_key = 0, *value = 0;\r
+    unsigned char key;\r
+    char *s;\r
+    int rc;\r
+\r
+    if (self->read_func(self, &s, 1) < 0) return -1;\r
+\r
+    key = (unsigned char)s[0];\r
+    if (!( py_key = PyInt_FromLong((long)key)))  return -1;\r
+\r
+    value = PyDict_GetItem(self->memo, py_key);\r
+    if (! value) {\r
+        PyErr_SetObject(BadPickleGet, py_key);\r
+        rc = -1;\r
+    }\r
+    else {\r
+        PDATA_APPEND(self->stack, value, -1);\r
+        rc = 0;\r
+    }\r
+\r
+    Py_DECREF(py_key);\r
+    return rc;\r
+}\r
+\r
+\r
+static int\r
+load_long_binget(Unpicklerobject *self)\r
+{\r
+    PyObject *py_key = 0, *value = 0;\r
+    unsigned char c;\r
+    char *s;\r
+    Py_ssize_t key;\r
+    int rc;\r
+\r
+    if (self->read_func(self, &s, 4) < 0) return -1;\r
+\r
+    c = (unsigned char)s[0];\r
+    key = (long)c;\r
+    c = (unsigned char)s[1];\r
+    key |= (long)c << 8;\r
+    c = (unsigned char)s[2];\r
+    key |= (long)c << 16;\r
+    c = (unsigned char)s[3];\r
+    key |= (long)c << 24;\r
+\r
+    if (!( py_key = PyInt_FromLong((long)key)))  return -1;\r
+\r
+    value = PyDict_GetItem(self->memo, py_key);\r
+    if (! value) {\r
+        PyErr_SetObject(BadPickleGet, py_key);\r
+        rc = -1;\r
+    }\r
+    else {\r
+        PDATA_APPEND(self->stack, value, -1);\r
+        rc = 0;\r
+    }\r
+\r
+    Py_DECREF(py_key);\r
+    return rc;\r
+}\r
+\r
+/* Push an object from the extension registry (EXT[124]).  nbytes is\r
+ * the number of bytes following the opcode, holding the index (code) value.\r
+ */\r
+static int\r
+load_extension(Unpicklerobject *self, int nbytes)\r
+{\r
+    char *codebytes;            /* the nbytes bytes after the opcode */\r
+    long code;                  /* calc_binint returns long */\r
+    PyObject *py_code;          /* code as a Python int */\r
+    PyObject *obj;              /* the object to push */\r
+    PyObject *pair;             /* (module_name, class_name) */\r
+    PyObject *module_name, *class_name;\r
+\r
+    assert(nbytes == 1 || nbytes == 2 || nbytes == 4);\r
+    if (self->read_func(self, &codebytes, nbytes) < 0) return -1;\r
+    code = calc_binint(codebytes,  nbytes);\r
+    if (code <= 0) {                    /* note that 0 is forbidden */\r
+        /* Corrupt or hostile pickle. */\r
+        PyErr_SetString(UnpicklingError, "EXT specifies code <= 0");\r
+        return -1;\r
+    }\r
+\r
+    /* Look for the code in the cache. */\r
+    py_code = PyInt_FromLong(code);\r
+    if (py_code == NULL) return -1;\r
+    obj = PyDict_GetItem(extension_cache, py_code);\r
+    if (obj != NULL) {\r
+        /* Bingo. */\r
+        Py_DECREF(py_code);\r
+        PDATA_APPEND(self->stack, obj, -1);\r
+        return 0;\r
+    }\r
+\r
+    /* Look up the (module_name, class_name) pair. */\r
+    pair = PyDict_GetItem(inverted_registry, py_code);\r
+    if (pair == NULL) {\r
+        Py_DECREF(py_code);\r
+        PyErr_Format(PyExc_ValueError, "unregistered extension "\r
+                     "code %ld", code);\r
+        return -1;\r
+    }\r
+    /* Since the extension registry is manipulable via Python code,\r
+     * confirm that pair is really a 2-tuple of strings.\r
+     */\r
+    if (!PyTuple_Check(pair) || PyTuple_Size(pair) != 2 ||\r
+        !PyString_Check(module_name = PyTuple_GET_ITEM(pair, 0)) ||\r
+        !PyString_Check(class_name = PyTuple_GET_ITEM(pair, 1))) {\r
+        Py_DECREF(py_code);\r
+        PyErr_Format(PyExc_ValueError, "_inverted_registry[%ld] "\r
+                     "isn't a 2-tuple of strings", code);\r
+        return -1;\r
+    }\r
+    /* Load the object. */\r
+    obj = find_class(module_name, class_name, self->find_class);\r
+    if (obj == NULL) {\r
+        Py_DECREF(py_code);\r
+        return -1;\r
+    }\r
+    /* Cache code -> obj. */\r
+    code = PyDict_SetItem(extension_cache, py_code, obj);\r
+    Py_DECREF(py_code);\r
+    if (code < 0) {\r
+        Py_DECREF(obj);\r
+        return -1;\r
+    }\r
+    PDATA_PUSH(self->stack, obj, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_put(Unpicklerobject *self)\r
+{\r
+    PyObject *py_str = 0, *value = 0;\r
+    Py_ssize_t len, l;\r
+    char *s;\r
+\r
+    if ((l = self->readline_func(self, &s)) < 0) return -1;\r
+    if (l < 2) return bad_readline();\r
+    if (!( len=self->stack->length ))  return stackUnderflow();\r
+    if (!( py_str = PyString_FromStringAndSize(s, l - 1)))  return -1;\r
+    value=self->stack->data[len-1];\r
+    l=PyDict_SetItem(self->memo, py_str, value);\r
+    Py_DECREF(py_str);\r
+    return l;\r
+}\r
+\r
+\r
+static int\r
+load_binput(Unpicklerobject *self)\r
+{\r
+    PyObject *py_key = 0, *value = 0;\r
+    unsigned char key;\r
+    char *s;\r
+    Py_ssize_t len;\r
+\r
+    if (self->read_func(self, &s, 1) < 0) return -1;\r
+    if (!( (len=self->stack->length) > 0 ))  return stackUnderflow();\r
+\r
+    key = (unsigned char)s[0];\r
+\r
+    if (!( py_key = PyInt_FromLong((long)key)))  return -1;\r
+    value=self->stack->data[len-1];\r
+    len=PyDict_SetItem(self->memo, py_key, value);\r
+    Py_DECREF(py_key);\r
+    return len;\r
+}\r
+\r
+\r
+static int\r
+load_long_binput(Unpicklerobject *self)\r
+{\r
+    PyObject *py_key = 0, *value = 0;\r
+    Py_ssize_t key;\r
+    unsigned char c;\r
+    char *s;\r
+    Py_ssize_t len;\r
+\r
+    if (self->read_func(self, &s, 4) < 0) return -1;\r
+    if (!( len=self->stack->length ))  return stackUnderflow();\r
+\r
+    c = (unsigned char)s[0];\r
+    key = (long)c;\r
+    c = (unsigned char)s[1];\r
+    key |= (long)c << 8;\r
+    c = (unsigned char)s[2];\r
+    key |= (long)c << 16;\r
+    c = (unsigned char)s[3];\r
+    key |= (long)c << 24;\r
+\r
+    if (!( py_key = PyInt_FromLong(key)))  return -1;\r
+    value=self->stack->data[len-1];\r
+    len=PyDict_SetItem(self->memo, py_key, value);\r
+    Py_DECREF(py_key);\r
+    return len;\r
+}\r
+\r
+\r
+static int\r
+do_append(Unpicklerobject *self, Py_ssize_t  x)\r
+{\r
+    PyObject *value = 0, *list = 0, *append_method = 0;\r
+    Py_ssize_t len, i;\r
+\r
+    len=self->stack->length;\r
+    if (!( len >= x && x > 0 ))  return stackUnderflow();\r
+    /* nothing to do */\r
+    if (len==x) return 0;\r
+\r
+    list=self->stack->data[x-1];\r
+\r
+    if (PyList_Check(list)) {\r
+        PyObject *slice;\r
+        int list_len;\r
+\r
+        slice=Pdata_popList(self->stack, x);\r
+        if (! slice) return -1;\r
+        list_len = PyList_GET_SIZE(list);\r
+        i=PyList_SetSlice(list, list_len, list_len, slice);\r
+        Py_DECREF(slice);\r
+        return i;\r
+    }\r
+    else {\r
+\r
+        if (!( append_method = PyObject_GetAttr(list, append_str)))\r
+            return -1;\r
+\r
+        for (i = x; i < len; i++) {\r
+            PyObject *junk;\r
+\r
+            value=self->stack->data[i];\r
+            junk=0;\r
+            ARG_TUP(self, value);\r
+            if (self->arg) {\r
+                junk = PyObject_Call(append_method, self->arg,\r
+                                     NULL);\r
+                FREE_ARG_TUP(self);\r
+            }\r
+            if (! junk) {\r
+                Pdata_clear(self->stack, i+1);\r
+                self->stack->length=x;\r
+                Py_DECREF(append_method);\r
+                return -1;\r
+            }\r
+            Py_DECREF(junk);\r
+        }\r
+        self->stack->length=x;\r
+        Py_DECREF(append_method);\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+static int\r
+load_append(Unpicklerobject *self)\r
+{\r
+    return do_append(self, self->stack->length - 1);\r
+}\r
+\r
+\r
+static int\r
+load_appends(Unpicklerobject *self)\r
+{\r
+    return do_append(self, marker(self));\r
+}\r
+\r
+\r
+static Py_ssize_t\r
+do_setitems(Unpicklerobject *self, Py_ssize_t x)\r
+{\r
+    PyObject *value = 0, *key = 0, *dict = 0;\r
+    Py_ssize_t len, i, r=0;\r
+\r
+    if (!( (len=self->stack->length) >= x\r
+           && x > 0 ))  return stackUnderflow();\r
+\r
+    dict=self->stack->data[x-1];\r
+\r
+    for (i = x+1; i < len; i += 2) {\r
+        key  =self->stack->data[i-1];\r
+        value=self->stack->data[i  ];\r
+        if (PyObject_SetItem(dict, key, value) < 0) {\r
+            r=-1;\r
+            break;\r
+        }\r
+    }\r
+\r
+    Pdata_clear(self->stack, x);\r
+\r
+    return r;\r
+}\r
+\r
+\r
+static int\r
+load_setitem(Unpicklerobject *self)\r
+{\r
+    return do_setitems(self, self->stack->length - 2);\r
+}\r
+\r
+static int\r
+load_setitems(Unpicklerobject *self)\r
+{\r
+    return do_setitems(self, marker(self));\r
+}\r
+\r
+\r
+static int\r
+load_build(Unpicklerobject *self)\r
+{\r
+    PyObject *state, *inst, *slotstate;\r
+    PyObject *__setstate__;\r
+    PyObject *d_key, *d_value;\r
+    int res = -1;\r
+    Py_ssize_t i;\r
+\r
+    /* Stack is ... instance, state.  We want to leave instance at\r
+     * the stack top, possibly mutated via instance.__setstate__(state).\r
+     */\r
+    if (self->stack->length < 2)\r
+        return stackUnderflow();\r
+    PDATA_POP(self->stack, state);\r
+    if (state == NULL)\r
+        return -1;\r
+    inst = self->stack->data[self->stack->length - 1];\r
+\r
+    __setstate__ = PyObject_GetAttr(inst, __setstate___str);\r
+    if (__setstate__ != NULL) {\r
+        PyObject *junk = NULL;\r
+\r
+        /* The explicit __setstate__ is responsible for everything. */\r
+        ARG_TUP(self, state);\r
+        if (self->arg) {\r
+            junk = PyObject_Call(__setstate__, self->arg, NULL);\r
+            FREE_ARG_TUP(self);\r
+        }\r
+        Py_DECREF(__setstate__);\r
+        if (junk == NULL)\r
+            return -1;\r
+        Py_DECREF(junk);\r
+        return 0;\r
+    }\r
+    if (!PyErr_ExceptionMatches(PyExc_AttributeError))\r
+        return -1;\r
+    PyErr_Clear();\r
+\r
+    /* A default __setstate__.  First see whether state embeds a\r
+     * slot state dict too (a proto 2 addition).\r
+     */\r
+    if (PyTuple_Check(state) && PyTuple_Size(state) == 2) {\r
+        PyObject *temp = state;\r
+        state = PyTuple_GET_ITEM(temp, 0);\r
+        slotstate = PyTuple_GET_ITEM(temp, 1);\r
+        Py_INCREF(state);\r
+        Py_INCREF(slotstate);\r
+        Py_DECREF(temp);\r
+    }\r
+    else\r
+        slotstate = NULL;\r
+\r
+    /* Set inst.__dict__ from the state dict (if any). */\r
+    if (state != Py_None) {\r
+        PyObject *dict;\r
+        if (! PyDict_Check(state)) {\r
+            PyErr_SetString(UnpicklingError, "state is not a "\r
+                            "dictionary");\r
+            goto finally;\r
+        }\r
+        dict = PyObject_GetAttr(inst, __dict___str);\r
+        if (dict == NULL)\r
+            goto finally;\r
+\r
+        i = 0;\r
+        while (PyDict_Next(state, &i, &d_key, &d_value)) {\r
+            /* normally the keys for instance attributes are\r
+               interned.  we should try to do that here. */\r
+            Py_INCREF(d_key);\r
+            if (PyString_CheckExact(d_key))\r
+                PyString_InternInPlace(&d_key);\r
+            if (PyObject_SetItem(dict, d_key, d_value) < 0) {\r
+                Py_DECREF(d_key);\r
+                goto finally;\r
+            }\r
+            Py_DECREF(d_key);\r
+        }\r
+        Py_DECREF(dict);\r
+    }\r
+\r
+    /* Also set instance attributes from the slotstate dict (if any). */\r
+    if (slotstate != NULL) {\r
+        if (! PyDict_Check(slotstate)) {\r
+            PyErr_SetString(UnpicklingError, "slot state is not "\r
+                            "a dictionary");\r
+            goto finally;\r
+        }\r
+        i = 0;\r
+        while (PyDict_Next(slotstate, &i, &d_key, &d_value)) {\r
+            if (PyObject_SetAttr(inst, d_key, d_value) < 0)\r
+                goto finally;\r
+        }\r
+    }\r
+    res = 0;\r
+\r
+  finally:\r
+    Py_DECREF(state);\r
+    Py_XDECREF(slotstate);\r
+    return res;\r
+}\r
+\r
+\r
+static int\r
+load_mark(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t s;\r
+\r
+    /* Note that we split the (pickle.py) stack into two stacks, an\r
+       object stack and a mark stack. Here we push a mark onto the\r
+       mark stack.\r
+    */\r
+\r
+    if ((self->num_marks + 1) >= self->marks_size) {\r
+        Py_ssize_t *marks;\r
+        s=self->marks_size+20;\r
+        if (s <= self->num_marks) s=self->num_marks + 1;\r
+        if (self->marks == NULL)\r
+            marks=(Py_ssize_t *)malloc(s * sizeof(Py_ssize_t));\r
+        else\r
+            marks=(Py_ssize_t *)realloc(self->marks,\r
+                                        s * sizeof(Py_ssize_t));\r
+        if (!marks) {\r
+            PyErr_NoMemory();\r
+            return -1;\r
+        }\r
+        self->marks = marks;\r
+        self->marks_size = s;\r
+    }\r
+\r
+    self->marks[self->num_marks++] = self->stack->length;\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+load_reduce(Unpicklerobject *self)\r
+{\r
+    PyObject *callable = 0, *arg_tup = 0, *ob = 0;\r
+\r
+    PDATA_POP(self->stack, arg_tup);\r
+    if (! arg_tup) return -1;\r
+    PDATA_POP(self->stack, callable);\r
+    if (callable) {\r
+        ob = Instance_New(callable, arg_tup);\r
+        Py_DECREF(callable);\r
+    }\r
+    Py_DECREF(arg_tup);\r
+\r
+    if (! ob) return -1;\r
+\r
+    PDATA_PUSH(self->stack, ob, -1);\r
+    return 0;\r
+}\r
+\r
+/* Just raises an error if we don't know the protocol specified.  PROTO\r
+ * is the first opcode for protocols >= 2.\r
+ */\r
+static int\r
+load_proto(Unpicklerobject *self)\r
+{\r
+    int i;\r
+    char *protobyte;\r
+\r
+    i = self->read_func(self, &protobyte, 1);\r
+    if (i < 0)\r
+        return -1;\r
+\r
+    i = calc_binint(protobyte, 1);\r
+    /* No point checking for < 0, since calc_binint returns an unsigned\r
+     * int when chewing on 1 byte.\r
+     */\r
+    assert(i >= 0);\r
+    if (i <= HIGHEST_PROTOCOL)\r
+        return 0;\r
+\r
+    PyErr_Format(PyExc_ValueError, "unsupported pickle protocol: %d", i);\r
+    return -1;\r
+}\r
+\r
+static PyObject *\r
+load(Unpicklerobject *self)\r
+{\r
+    PyObject *err = 0, *val = 0;\r
+    char *s;\r
+\r
+    self->num_marks = 0;\r
+    if (self->stack->length) Pdata_clear(self->stack, 0);\r
+\r
+    while (1) {\r
+        if (self->read_func(self, &s, 1) < 0)\r
+            break;\r
+\r
+        switch (s[0]) {\r
+        case NONE:\r
+            if (load_none(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT:\r
+            if (load_binint(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT1:\r
+            if (load_binint1(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT2:\r
+            if (load_binint2(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case INT:\r
+            if (load_int(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG:\r
+            if (load_long(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG1:\r
+            if (load_counted_long(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG4:\r
+            if (load_counted_long(self, 4) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case FLOAT:\r
+            if (load_float(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINFLOAT:\r
+            if (load_binfloat(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINSTRING:\r
+            if (load_binstring(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SHORT_BINSTRING:\r
+            if (load_short_binstring(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case STRING:\r
+            if (load_string(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+#ifdef Py_USING_UNICODE\r
+        case UNICODE:\r
+            if (load_unicode(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINUNICODE:\r
+            if (load_binunicode(self) < 0)\r
+                break;\r
+            continue;\r
+#endif\r
+\r
+        case EMPTY_TUPLE:\r
+            if (load_counted_tuple(self, 0) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE1:\r
+            if (load_counted_tuple(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE2:\r
+            if (load_counted_tuple(self, 2) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE3:\r
+            if (load_counted_tuple(self, 3) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE:\r
+            if (load_tuple(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EMPTY_LIST:\r
+            if (load_empty_list(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LIST:\r
+            if (load_list(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EMPTY_DICT:\r
+            if (load_empty_dict(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case DICT:\r
+            if (load_dict(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case OBJ:\r
+            if (load_obj(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case INST:\r
+            if (load_inst(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWOBJ:\r
+            if (load_newobj(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case GLOBAL:\r
+            if (load_global(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case APPEND:\r
+            if (load_append(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case APPENDS:\r
+            if (load_appends(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BUILD:\r
+            if (load_build(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case DUP:\r
+            if (load_dup(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINGET:\r
+            if (load_binget(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG_BINGET:\r
+            if (load_long_binget(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case GET:\r
+            if (load_get(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT1:\r
+            if (load_extension(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT2:\r
+            if (load_extension(self, 2) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT4:\r
+            if (load_extension(self, 4) < 0)\r
+                break;\r
+            continue;\r
+        case MARK:\r
+            if (load_mark(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINPUT:\r
+            if (load_binput(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG_BINPUT:\r
+            if (load_long_binput(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case PUT:\r
+            if (load_put(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case POP:\r
+            if (load_pop(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case POP_MARK:\r
+            if (load_pop_mark(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SETITEM:\r
+            if (load_setitem(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SETITEMS:\r
+            if (load_setitems(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case STOP:\r
+            break;\r
+\r
+        case PERSID:\r
+            if (load_persid(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINPERSID:\r
+            if (load_binpersid(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case REDUCE:\r
+            if (load_reduce(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case PROTO:\r
+            if (load_proto(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWTRUE:\r
+            if (load_bool(self, Py_True) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWFALSE:\r
+            if (load_bool(self, Py_False) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case '\0':\r
+            /* end of file */\r
+            PyErr_SetNone(PyExc_EOFError);\r
+            break;\r
+\r
+        default:\r
+            cPickle_ErrFormat(UnpicklingError,\r
+                              "invalid load key, '%s'.",\r
+                              "c", s[0]);\r
+            return NULL;\r
+        }\r
+\r
+        break;\r
+    }\r
+\r
+    if ((err = PyErr_Occurred())) {\r
+        if (err == PyExc_EOFError) {\r
+            PyErr_SetNone(PyExc_EOFError);\r
+        }\r
+        return NULL;\r
+    }\r
+\r
+    PDATA_POP(self->stack, val);\r
+    return val;\r
+}\r
+\r
+\r
+/* No-load functions to support noload, which is used to\r
+   find persistent references. */\r
+\r
+static int\r
+noload_obj(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t i;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    return Pdata_clear(self->stack, i+1);\r
+}\r
+\r
+\r
+static int\r
+noload_inst(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t i;\r
+    char *s;\r
+\r
+    if ((i = marker(self)) < 0) return -1;\r
+    Pdata_clear(self->stack, i);\r
+    if (self->readline_func(self, &s) < 0) return -1;\r
+    if (self->readline_func(self, &s) < 0) return -1;\r
+    PDATA_APPEND(self->stack, Py_None, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+noload_newobj(Unpicklerobject *self)\r
+{\r
+    PyObject *obj;\r
+\r
+    PDATA_POP(self->stack, obj);        /* pop argtuple */\r
+    if (obj == NULL) return -1;\r
+    Py_DECREF(obj);\r
+\r
+    PDATA_POP(self->stack, obj);        /* pop cls */\r
+    if (obj == NULL) return -1;\r
+    Py_DECREF(obj);\r
+\r
+    PDATA_APPEND(self->stack, Py_None, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+noload_global(Unpicklerobject *self)\r
+{\r
+    char *s;\r
+\r
+    if (self->readline_func(self, &s) < 0) return -1;\r
+    if (self->readline_func(self, &s) < 0) return -1;\r
+    PDATA_APPEND(self->stack, Py_None,-1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+noload_reduce(Unpicklerobject *self)\r
+{\r
+\r
+    if (self->stack->length < 2) return stackUnderflow();\r
+    Pdata_clear(self->stack, self->stack->length-2);\r
+    PDATA_APPEND(self->stack, Py_None,-1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+noload_build(Unpicklerobject *self) {\r
+\r
+  if (self->stack->length < 1) return stackUnderflow();\r
+  Pdata_clear(self->stack, self->stack->length-1);\r
+  return 0;\r
+}\r
+\r
+static int\r
+noload_extension(Unpicklerobject *self, int nbytes)\r
+{\r
+    char *codebytes;\r
+\r
+    assert(nbytes == 1 || nbytes == 2 || nbytes == 4);\r
+    if (self->read_func(self, &codebytes, nbytes) < 0) return -1;\r
+    PDATA_APPEND(self->stack, Py_None, -1);\r
+    return 0;\r
+}\r
+\r
+static int\r
+noload_append(Unpicklerobject *self)\r
+{\r
+    return Pdata_clear(self->stack, self->stack->length - 1);\r
+}\r
+\r
+static int\r
+noload_appends(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t i;\r
+    if ((i = marker(self)) < 0) return -1;\r
+    return Pdata_clear(self->stack, i);\r
+}\r
+\r
+static int\r
+noload_setitem(Unpicklerobject *self)\r
+{\r
+    return Pdata_clear(self->stack, self->stack->length - 2);\r
+}\r
+\r
+static int\r
+noload_setitems(Unpicklerobject *self)\r
+{\r
+    Py_ssize_t i;\r
+    if ((i = marker(self)) < 0) return -1;\r
+    return Pdata_clear(self->stack, i);\r
+}\r
+\r
+static PyObject *\r
+noload(Unpicklerobject *self)\r
+{\r
+    PyObject *err = 0, *val = 0;\r
+    char *s;\r
+\r
+    self->num_marks = 0;\r
+    Pdata_clear(self->stack, 0);\r
+\r
+    while (1) {\r
+        if (self->read_func(self, &s, 1) < 0)\r
+            break;\r
+\r
+        switch (s[0]) {\r
+        case NONE:\r
+            if (load_none(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT:\r
+            if (load_binint(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT1:\r
+            if (load_binint1(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BININT2:\r
+            if (load_binint2(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case INT:\r
+            if (load_int(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG:\r
+            if (load_long(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG1:\r
+            if (load_counted_long(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG4:\r
+            if (load_counted_long(self, 4) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case FLOAT:\r
+            if (load_float(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINFLOAT:\r
+            if (load_binfloat(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINSTRING:\r
+            if (load_binstring(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SHORT_BINSTRING:\r
+            if (load_short_binstring(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case STRING:\r
+            if (load_string(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+#ifdef Py_USING_UNICODE\r
+        case UNICODE:\r
+            if (load_unicode(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINUNICODE:\r
+            if (load_binunicode(self) < 0)\r
+                break;\r
+            continue;\r
+#endif\r
+\r
+        case EMPTY_TUPLE:\r
+            if (load_counted_tuple(self, 0) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE1:\r
+            if (load_counted_tuple(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE2:\r
+            if (load_counted_tuple(self, 2) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE3:\r
+            if (load_counted_tuple(self, 3) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case TUPLE:\r
+            if (load_tuple(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EMPTY_LIST:\r
+            if (load_empty_list(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LIST:\r
+            if (load_list(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EMPTY_DICT:\r
+            if (load_empty_dict(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case DICT:\r
+            if (load_dict(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case OBJ:\r
+            if (noload_obj(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case INST:\r
+            if (noload_inst(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWOBJ:\r
+            if (noload_newobj(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case GLOBAL:\r
+            if (noload_global(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case APPEND:\r
+            if (noload_append(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case APPENDS:\r
+            if (noload_appends(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BUILD:\r
+            if (noload_build(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case DUP:\r
+            if (load_dup(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINGET:\r
+            if (load_binget(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG_BINGET:\r
+            if (load_long_binget(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case GET:\r
+            if (load_get(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT1:\r
+            if (noload_extension(self, 1) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT2:\r
+            if (noload_extension(self, 2) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case EXT4:\r
+            if (noload_extension(self, 4) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case MARK:\r
+            if (load_mark(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINPUT:\r
+            if (load_binput(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case LONG_BINPUT:\r
+            if (load_long_binput(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case PUT:\r
+            if (load_put(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case POP:\r
+            if (load_pop(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case POP_MARK:\r
+            if (load_pop_mark(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SETITEM:\r
+            if (noload_setitem(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case SETITEMS:\r
+            if (noload_setitems(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case STOP:\r
+            break;\r
+\r
+        case PERSID:\r
+            if (load_persid(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case BINPERSID:\r
+            if (load_binpersid(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case REDUCE:\r
+            if (noload_reduce(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case PROTO:\r
+            if (load_proto(self) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWTRUE:\r
+            if (load_bool(self, Py_True) < 0)\r
+                break;\r
+            continue;\r
+\r
+        case NEWFALSE:\r
+            if (load_bool(self, Py_False) < 0)\r
+                break;\r
+            continue;\r
+        default:\r
+            cPickle_ErrFormat(UnpicklingError,\r
+                              "invalid load key, '%s'.",\r
+                              "c", s[0]);\r
+            return NULL;\r
+        }\r
+\r
+        break;\r
+    }\r
+\r
+    if ((err = PyErr_Occurred())) {\r
+        if (err == PyExc_EOFError) {\r
+            PyErr_SetNone(PyExc_EOFError);\r
+        }\r
+        return NULL;\r
+    }\r
+\r
+    PDATA_POP(self->stack, val);\r
+    return val;\r
+}\r
+\r
+\r
+static PyObject *\r
+Unpickler_load(Unpicklerobject *self, PyObject *unused)\r
+{\r
+    return load(self);\r
+}\r
+\r
+static PyObject *\r
+Unpickler_noload(Unpicklerobject *self, PyObject *unused)\r
+{\r
+    return noload(self);\r
+}\r
+\r
+\r
+static struct PyMethodDef Unpickler_methods[] = {\r
+  {"load",         (PyCFunction)Unpickler_load,   METH_NOARGS,\r
+   PyDoc_STR("load() -- Load a pickle")\r
+  },\r
+  {"noload",         (PyCFunction)Unpickler_noload,   METH_NOARGS,\r
+   PyDoc_STR(\r
+   "noload() -- not load a pickle, but go through most of the motions\n"\r
+   "\n"\r
+   "This function can be used to read past a pickle without instantiating\n"\r
+   "any objects or importing any modules.  It can also be used to find all\n"\r
+   "persistent references without instantiating any objects or importing\n"\r
+   "any modules.\n")\r
+  },\r
+  {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+\r
+static Unpicklerobject *\r
+newUnpicklerobject(PyObject *f)\r
+{\r
+    Unpicklerobject *self;\r
+\r
+    if (!( self = PyObject_GC_New(Unpicklerobject, &Unpicklertype)))\r
+        return NULL;\r
+\r
+    self->file = NULL;\r
+    self->arg = NULL;\r
+    self->stack = (Pdata*)Pdata_New();\r
+    self->pers_func = NULL;\r
+    self->last_string = NULL;\r
+    self->marks = NULL;\r
+    self->num_marks = 0;\r
+    self->marks_size = 0;\r
+    self->buf_size = 0;\r
+    self->read = NULL;\r
+    self->readline = NULL;\r
+    self->find_class = NULL;\r
+\r
+    if (!( self->memo = PyDict_New()))\r
+        goto err;\r
+\r
+    if (!self->stack)\r
+        goto err;\r
+\r
+    Py_INCREF(f);\r
+    self->file = f;\r
+\r
+    /* Set read, readline based on type of f */\r
+    if (PyFile_Check(f)) {\r
+        self->fp = PyFile_AsFile(f);\r
+        if (self->fp == NULL) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "I/O operation on closed file");\r
+            goto err;\r
+        }\r
+        self->read_func = read_file;\r
+        self->readline_func = readline_file;\r
+    }\r
+    else if (PycStringIO_InputCheck(f)) {\r
+        self->fp = NULL;\r
+        self->read_func = read_cStringIO;\r
+        self->readline_func = readline_cStringIO;\r
+    }\r
+    else {\r
+\r
+        self->fp = NULL;\r
+        self->read_func = read_other;\r
+        self->readline_func = readline_other;\r
+\r
+        if (!( (self->readline = PyObject_GetAttr(f, readline_str)) &&\r
+               (self->read = PyObject_GetAttr(f, read_str))))  {\r
+            PyErr_Clear();\r
+            PyErr_SetString( PyExc_TypeError,\r
+                             "argument must have 'read' and "\r
+                             "'readline' attributes" );\r
+            goto err;\r
+        }\r
+    }\r
+    PyObject_GC_Track(self);\r
+\r
+    return self;\r
+\r
+  err:\r
+    Py_DECREF((PyObject *)self);\r
+    return NULL;\r
+}\r
+\r
+\r
+static PyObject *\r
+get_Unpickler(PyObject *self, PyObject *file)\r
+{\r
+    return (PyObject *)newUnpicklerobject(file);\r
+}\r
+\r
+\r
+static void\r
+Unpickler_dealloc(Unpicklerobject *self)\r
+{\r
+    PyObject_GC_UnTrack((PyObject *)self);\r
+    Py_XDECREF(self->readline);\r
+    Py_XDECREF(self->read);\r
+    Py_XDECREF(self->file);\r
+    Py_XDECREF(self->memo);\r
+    Py_XDECREF(self->stack);\r
+    Py_XDECREF(self->pers_func);\r
+    Py_XDECREF(self->arg);\r
+    Py_XDECREF(self->last_string);\r
+    Py_XDECREF(self->find_class);\r
+\r
+    if (self->marks) {\r
+        free(self->marks);\r
+    }\r
+\r
+    if (self->buf_size) {\r
+        free(self->buf);\r
+    }\r
+\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static int\r
+Unpickler_traverse(Unpicklerobject *self, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(self->readline);\r
+    Py_VISIT(self->read);\r
+    Py_VISIT(self->file);\r
+    Py_VISIT(self->memo);\r
+    Py_VISIT(self->stack);\r
+    Py_VISIT(self->pers_func);\r
+    Py_VISIT(self->arg);\r
+    Py_VISIT(self->last_string);\r
+    Py_VISIT(self->find_class);\r
+    return 0;\r
+}\r
+\r
+static int\r
+Unpickler_clear(Unpicklerobject *self)\r
+{\r
+    Py_CLEAR(self->readline);\r
+    Py_CLEAR(self->read);\r
+    Py_CLEAR(self->file);\r
+    Py_CLEAR(self->memo);\r
+    Py_CLEAR(self->stack);\r
+    Py_CLEAR(self->pers_func);\r
+    Py_CLEAR(self->arg);\r
+    Py_CLEAR(self->last_string);\r
+    Py_CLEAR(self->find_class);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+Unpickler_getattr(Unpicklerobject *self, char *name)\r
+{\r
+    if (!strcmp(name, "persistent_load")) {\r
+        if (!self->pers_func) {\r
+            PyErr_SetString(PyExc_AttributeError, name);\r
+            return NULL;\r
+        }\r
+\r
+        Py_INCREF(self->pers_func);\r
+        return self->pers_func;\r
+    }\r
+\r
+    if (!strcmp(name, "find_global")) {\r
+        if (!self->find_class) {\r
+            PyErr_SetString(PyExc_AttributeError, name);\r
+            return NULL;\r
+        }\r
+\r
+        Py_INCREF(self->find_class);\r
+        return self->find_class;\r
+    }\r
+\r
+    if (!strcmp(name, "memo")) {\r
+        if (!self->memo) {\r
+            PyErr_SetString(PyExc_AttributeError, name);\r
+            return NULL;\r
+        }\r
+\r
+        Py_INCREF(self->memo);\r
+        return self->memo;\r
+    }\r
+\r
+    if (!strcmp(name, "UnpicklingError")) {\r
+        Py_INCREF(UnpicklingError);\r
+        return UnpicklingError;\r
+    }\r
+\r
+    return Py_FindMethod(Unpickler_methods, (PyObject *)self, name);\r
+}\r
+\r
+\r
+static int\r
+Unpickler_setattr(Unpicklerobject *self, char *name, PyObject *value)\r
+{\r
+\r
+    if (!strcmp(name, "persistent_load")) {\r
+        Py_XDECREF(self->pers_func);\r
+        self->pers_func = value;\r
+        Py_XINCREF(value);\r
+        return 0;\r
+    }\r
+\r
+    if (!strcmp(name, "find_global")) {\r
+        Py_XDECREF(self->find_class);\r
+        self->find_class = value;\r
+        Py_XINCREF(value);\r
+        return 0;\r
+    }\r
+\r
+    if (! value) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "attribute deletion is not supported");\r
+        return -1;\r
+    }\r
+\r
+    if (strcmp(name, "memo") == 0) {\r
+        if (!PyDict_Check(value)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                            "memo must be a dictionary");\r
+            return -1;\r
+        }\r
+        Py_XDECREF(self->memo);\r
+        self->memo = value;\r
+        Py_INCREF(value);\r
+        return 0;\r
+    }\r
+\r
+    PyErr_SetString(PyExc_AttributeError, name);\r
+    return -1;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Module-level functions.\r
+ */\r
+\r
+/* dump(obj, file, protocol=0). */\r
+static PyObject *\r
+cpm_dump(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwlist[] = {"obj", "file", "protocol", NULL};\r
+    PyObject *ob, *file, *res = NULL;\r
+    Picklerobject *pickler = 0;\r
+    int proto = 0;\r
+\r
+    if (!( PyArg_ParseTupleAndKeywords(args, kwds, "OO|i", kwlist,\r
+               &ob, &file, &proto)))\r
+        goto finally;\r
+\r
+    if (!( pickler = newPicklerobject(file, proto)))\r
+        goto finally;\r
+\r
+    if (dump(pickler, ob) < 0)\r
+        goto finally;\r
+\r
+    Py_INCREF(Py_None);\r
+    res = Py_None;\r
+\r
+  finally:\r
+    Py_XDECREF(pickler);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+/* dumps(obj, protocol=0). */\r
+static PyObject *\r
+cpm_dumps(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwlist[] = {"obj", "protocol", NULL};\r
+    PyObject *ob, *file = 0, *res = NULL;\r
+    Picklerobject *pickler = 0;\r
+    int proto = 0;\r
+\r
+    if (!( PyArg_ParseTupleAndKeywords(args, kwds, "O|i:dumps", kwlist,\r
+               &ob, &proto)))\r
+        goto finally;\r
+\r
+    if (!( file = PycStringIO->NewOutput(128)))\r
+        goto finally;\r
+\r
+    if (!( pickler = newPicklerobject(file, proto)))\r
+        goto finally;\r
+\r
+    if (dump(pickler, ob) < 0)\r
+        goto finally;\r
+\r
+    res = PycStringIO->cgetvalue(file);\r
+\r
+  finally:\r
+    Py_XDECREF(pickler);\r
+    Py_XDECREF(file);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+/* load(fileobj). */\r
+static PyObject *\r
+cpm_load(PyObject *self, PyObject *ob)\r
+{\r
+    Unpicklerobject *unpickler = 0;\r
+    PyObject *res = NULL;\r
+\r
+    if (!( unpickler = newUnpicklerobject(ob)))\r
+        goto finally;\r
+\r
+    res = load(unpickler);\r
+\r
+  finally:\r
+    Py_XDECREF(unpickler);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+/* loads(string) */\r
+static PyObject *\r
+cpm_loads(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ob, *file = 0, *res = NULL;\r
+    Unpicklerobject *unpickler = 0;\r
+\r
+    if (!( PyArg_ParseTuple(args, "S:loads", &ob)))\r
+        goto finally;\r
+\r
+    if (!( file = PycStringIO->NewInput(ob)))\r
+        goto finally;\r
+\r
+    if (!( unpickler = newUnpicklerobject(file)))\r
+        goto finally;\r
+\r
+    res = load(unpickler);\r
+\r
+  finally:\r
+    Py_XDECREF(file);\r
+    Py_XDECREF(unpickler);\r
+\r
+    return res;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(Unpicklertype__doc__,\r
+"Objects that know how to unpickle");\r
+\r
+static PyTypeObject Unpicklertype = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "cPickle.Unpickler",                 /*tp_name*/\r
+    sizeof(Unpicklerobject),             /*tp_basicsize*/\r
+    0,\r
+    (destructor)Unpickler_dealloc,      /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    (getattrfunc)Unpickler_getattr,     /* tp_getattr */\r
+    (setattrfunc)Unpickler_setattr,     /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    0,                                  /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_GC,\r
+    Unpicklertype__doc__,               /* tp_doc */\r
+    (traverseproc)Unpickler_traverse,   /* tp_traverse */\r
+    (inquiry)Unpickler_clear,           /* tp_clear */\r
+};\r
+\r
+static struct PyMethodDef cPickle_methods[] = {\r
+  {"dump",         (PyCFunction)cpm_dump,         METH_VARARGS | METH_KEYWORDS,\r
+   PyDoc_STR("dump(obj, file, protocol=0) -- "\r
+   "Write an object in pickle format to the given file.\n"\r
+   "\n"\r
+   "See the Pickler docstring for the meaning of optional argument proto.")\r
+  },\r
+\r
+  {"dumps",        (PyCFunction)cpm_dumps,        METH_VARARGS | METH_KEYWORDS,\r
+   PyDoc_STR("dumps(obj, protocol=0) -- "\r
+   "Return a string containing an object in pickle format.\n"\r
+   "\n"\r
+   "See the Pickler docstring for the meaning of optional argument proto.")\r
+  },\r
+\r
+  {"load",         (PyCFunction)cpm_load,         METH_O,\r
+   PyDoc_STR("load(file) -- Load a pickle from the given file")},\r
+\r
+  {"loads",        (PyCFunction)cpm_loads,        METH_VARARGS,\r
+   PyDoc_STR("loads(string) -- Load a pickle from the given string")},\r
+\r
+  {"Pickler",      (PyCFunction)get_Pickler,      METH_VARARGS | METH_KEYWORDS,\r
+   PyDoc_STR("Pickler(file, protocol=0) -- Create a pickler.\n"\r
+   "\n"\r
+   "This takes a file-like object for writing a pickle data stream.\n"\r
+   "The optional proto argument tells the pickler to use the given\n"\r
+   "protocol; supported protocols are 0, 1, 2.  The default\n"\r
+   "protocol is 0, to be backwards compatible.  (Protocol 0 is the\n"\r
+   "only protocol that can be written to a file opened in text\n"\r
+   "mode and read back successfully.  When using a protocol higher\n"\r
+   "than 0, make sure the file is opened in binary mode, both when\n"\r
+   "pickling and unpickling.)\n"\r
+   "\n"\r
+   "Protocol 1 is more efficient than protocol 0; protocol 2 is\n"\r
+   "more efficient than protocol 1.\n"\r
+   "\n"\r
+   "Specifying a negative protocol version selects the highest\n"\r
+   "protocol version supported.  The higher the protocol used, the\n"\r
+   "more recent the version of Python needed to read the pickle\n"\r
+   "produced.\n"\r
+   "\n"\r
+   "The file parameter must have a write() method that accepts a single\n"\r
+   "string argument.  It can thus be an open file object, a StringIO\n"\r
+   "object, or any other custom object that meets this interface.\n")\r
+  },\r
+\r
+  {"Unpickler",    (PyCFunction)get_Unpickler,    METH_O,\r
+   PyDoc_STR("Unpickler(file) -- Create an unpickler.")},\r
+\r
+  { NULL, NULL }\r
+};\r
+\r
+static int\r
+init_stuff(PyObject *module_dict)\r
+{\r
+    PyObject *copyreg, *t, *r;\r
+\r
+#define INIT_STR(S) if (!( S ## _str=PyString_InternFromString(#S)))  return -1;\r
+\r
+    if (PyType_Ready(&Unpicklertype) < 0)\r
+        return -1;\r
+    if (PyType_Ready(&Picklertype) < 0)\r
+        return -1;\r
+\r
+    INIT_STR(__class__);\r
+    INIT_STR(__getinitargs__);\r
+    INIT_STR(__dict__);\r
+    INIT_STR(__getstate__);\r
+    INIT_STR(__setstate__);\r
+    INIT_STR(__name__);\r
+    INIT_STR(__main__);\r
+    INIT_STR(__reduce__);\r
+    INIT_STR(__reduce_ex__);\r
+    INIT_STR(write);\r
+    INIT_STR(append);\r
+    INIT_STR(read);\r
+    INIT_STR(readline);\r
+    INIT_STR(dispatch_table);\r
+\r
+    if (!( copyreg = PyImport_ImportModule("copy_reg")))\r
+        return -1;\r
+\r
+    /* This is special because we want to use a different\r
+       one in restricted mode. */\r
+    dispatch_table = PyObject_GetAttr(copyreg, dispatch_table_str);\r
+    if (!dispatch_table) return -1;\r
+\r
+    extension_registry = PyObject_GetAttrString(copyreg,\r
+                            "_extension_registry");\r
+    if (!extension_registry) return -1;\r
+\r
+    inverted_registry = PyObject_GetAttrString(copyreg,\r
+                            "_inverted_registry");\r
+    if (!inverted_registry) return -1;\r
+\r
+    extension_cache = PyObject_GetAttrString(copyreg,\r
+                            "_extension_cache");\r
+    if (!extension_cache) return -1;\r
+\r
+    Py_DECREF(copyreg);\r
+\r
+    if (!(empty_tuple = PyTuple_New(0)))\r
+        return -1;\r
+\r
+    two_tuple = PyTuple_New(2);\r
+    if (two_tuple == NULL)\r
+        return -1;\r
+    /* We use this temp container with no regard to refcounts, or to\r
+     * keeping containees alive.  Exempt from GC, because we don't\r
+     * want anything looking at two_tuple() by magic.\r
+     */\r
+    PyObject_GC_UnTrack(two_tuple);\r
+\r
+    /* Ugh */\r
+    if (!( t=PyImport_ImportModule("__builtin__")))  return -1;\r
+    if (PyDict_SetItemString(module_dict, "__builtins__", t) < 0)\r
+        return -1;\r
+\r
+    if (!( t=PyDict_New()))  return -1;\r
+    if (!( r=PyRun_String(\r
+                   "def __str__(self):\n"\r
+                   "  return self.args and ('%s' % self.args[0]) or '(what)'\n",\r
+                   Py_file_input,\r
+                   module_dict, t)  ))  return -1;\r
+    Py_DECREF(r);\r
+\r
+    PickleError = PyErr_NewException("cPickle.PickleError", NULL, t);\r
+    if (!PickleError)\r
+        return -1;\r
+\r
+    Py_DECREF(t);\r
+\r
+    PicklingError = PyErr_NewException("cPickle.PicklingError",\r
+                                       PickleError, NULL);\r
+    if (!PicklingError)\r
+        return -1;\r
+\r
+    if (!( t=PyDict_New()))  return -1;\r
+    if (!( r=PyRun_String(\r
+                   "def __str__(self):\n"\r
+                   "  a=self.args\n"\r
+                   "  a=a and type(a[0]) or '(what)'\n"\r
+                   "  return 'Cannot pickle %s objects' % a\n"\r
+                   , Py_file_input,\r
+                   module_dict, t)  ))  return -1;\r
+    Py_DECREF(r);\r
+\r
+    if (!( UnpickleableError = PyErr_NewException(\r
+                   "cPickle.UnpickleableError", PicklingError, t)))\r
+        return -1;\r
+\r
+    Py_DECREF(t);\r
+\r
+    if (!( UnpicklingError = PyErr_NewException("cPickle.UnpicklingError",\r
+                                                PickleError, NULL)))\r
+        return -1;\r
+\r
+    if (!( BadPickleGet = PyErr_NewException("cPickle.BadPickleGet",\r
+                                             UnpicklingError, NULL)))\r
+        return -1;\r
+\r
+    if (PyDict_SetItemString(module_dict, "PickleError",\r
+                             PickleError) < 0)\r
+        return -1;\r
+\r
+    if (PyDict_SetItemString(module_dict, "PicklingError",\r
+                             PicklingError) < 0)\r
+        return -1;\r
+\r
+    if (PyDict_SetItemString(module_dict, "UnpicklingError",\r
+                             UnpicklingError) < 0)\r
+        return -1;\r
+\r
+    if (PyDict_SetItemString(module_dict, "UnpickleableError",\r
+                             UnpickleableError) < 0)\r
+        return -1;\r
+\r
+    if (PyDict_SetItemString(module_dict, "BadPickleGet",\r
+                             BadPickleGet) < 0)\r
+        return -1;\r
+\r
+    PycString_IMPORT;\r
+\r
+    return 0;\r
+}\r
+\r
+#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */\r
+#define PyMODINIT_FUNC void\r
+#endif\r
+PyMODINIT_FUNC\r
+initcPickle(void)\r
+{\r
+    PyObject *m, *d, *di, *v, *k;\r
+    Py_ssize_t i;\r
+    char *rev = "1.71";         /* XXX when does this change? */\r
+    PyObject *format_version;\r
+    PyObject *compatible_formats;\r
+\r
+    Py_TYPE(&Picklertype) = &PyType_Type;\r
+    Py_TYPE(&Unpicklertype) = &PyType_Type;\r
+    Py_TYPE(&PdataType) = &PyType_Type;\r
+\r
+    /* Initialize some pieces. We need to do this before module creation,\r
+     * so we're forced to use a temporary dictionary. :(\r
+     */\r
+    di = PyDict_New();\r
+    if (!di) return;\r
+    if (init_stuff(di) < 0) return;\r
+\r
+    /* Create the module and add the functions */\r
+    m = Py_InitModule4("cPickle", cPickle_methods,\r
+                       cPickle_module_documentation,\r
+                       (PyObject*)NULL,PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Add some symbolic constants to the module */\r
+    d = PyModule_GetDict(m);\r
+    v = PyString_FromString(rev);\r
+    PyDict_SetItemString(d, "__version__", v);\r
+    Py_XDECREF(v);\r
+\r
+    /* Copy data from di. Waaa. */\r
+    for (i=0; PyDict_Next(di, &i, &k, &v); ) {\r
+        if (PyObject_SetItem(d, k, v) < 0) {\r
+            Py_DECREF(di);\r
+            return;\r
+        }\r
+    }\r
+    Py_DECREF(di);\r
+\r
+    i = PyModule_AddIntConstant(m, "HIGHEST_PROTOCOL", HIGHEST_PROTOCOL);\r
+    if (i < 0)\r
+        return;\r
+\r
+    /* These are purely informational; no code uses them. */\r
+    /* File format version we write. */\r
+    format_version = PyString_FromString("2.0");\r
+    /* Format versions we can read. */\r
+    compatible_formats = Py_BuildValue("[sssss]",\r
+        "1.0",          /* Original protocol 0 */\r
+        "1.1",          /* Protocol 0 + INST */\r
+        "1.2",          /* Original protocol 1 */\r
+        "1.3",          /* Protocol 1 + BINFLOAT */\r
+        "2.0");         /* Original protocol 2 */\r
+    PyDict_SetItemString(d, "format_version", format_version);\r
+    PyDict_SetItemString(d, "compatible_formats", compatible_formats);\r
+    Py_XDECREF(format_version);\r
+    Py_XDECREF(compatible_formats);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cStringIO.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cStringIO.c
new file mode 100644 (file)
index 0000000..9710f33
--- /dev/null
@@ -0,0 +1,779 @@
+\r
+#include "Python.h"\r
+#include "import.h"\r
+#include "cStringIO.h"\r
+#include "structmember.h"\r
+\r
+PyDoc_STRVAR(cStringIO_module_documentation,\r
+"A simple fast partial StringIO replacement.\n"\r
+"\n"\r
+"This module provides a simple useful replacement for\n"\r
+"the StringIO module that is written in C.  It does not provide the\n"\r
+"full generality of StringIO, but it provides enough for most\n"\r
+"applications and is especially useful in conjunction with the\n"\r
+"pickle module.\n"\r
+"\n"\r
+"Usage:\n"\r
+"\n"\r
+"  from cStringIO import StringIO\n"\r
+"\n"\r
+"  an_output_stream=StringIO()\n"\r
+"  an_output_stream.write(some_stuff)\n"\r
+"  ...\n"\r
+"  value=an_output_stream.getvalue()\n"\r
+"\n"\r
+"  an_input_stream=StringIO(a_string)\n"\r
+"  spam=an_input_stream.readline()\n"\r
+"  spam=an_input_stream.read(5)\n"\r
+"  an_input_stream.seek(0)           # OK, start over\n"\r
+"  spam=an_input_stream.read()       # and read it all\n"\r
+"  \n"\r
+"If someone else wants to provide a more complete implementation,\n"\r
+"go for it. :-)  \n"\r
+"\n"\r
+"cStringIO.c,v 1.29 1999/06/15 14:10:27 jim Exp\n");\r
+\r
+/* Declaration for file-like objects that manage data as strings\r
+\r
+   The IOobject type should be though of as a common base type for\r
+   Iobjects, which provide input (read-only) StringIO objects and\r
+   Oobjects, which provide read-write objects.  Most of the methods\r
+   depend only on common data.\r
+*/\r
+\r
+typedef struct {\r
+  PyObject_HEAD\r
+  char *buf;\r
+  Py_ssize_t pos, string_size;\r
+} IOobject;\r
+\r
+#define IOOOBJECT(O) ((IOobject*)(O))\r
+\r
+/* Declarations for objects of type StringO */\r
+\r
+typedef struct { /* Subtype of IOobject */\r
+  PyObject_HEAD\r
+  char *buf;\r
+  Py_ssize_t pos, string_size;\r
+\r
+  Py_ssize_t buf_size;\r
+  int softspace;\r
+} Oobject;\r
+\r
+/* Declarations for objects of type StringI */\r
+\r
+typedef struct { /* Subtype of IOobject */\r
+  PyObject_HEAD\r
+  char *buf;\r
+  Py_ssize_t pos, string_size;\r
+    Py_buffer pbuf;\r
+} Iobject;\r
+\r
+/* IOobject (common) methods */\r
+\r
+PyDoc_STRVAR(IO_flush__doc__, "flush(): does nothing.");\r
+\r
+static int\r
+IO__opencheck(IOobject *self) {\r
+    if (!self->buf) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "I/O operation on closed file");\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+static PyObject *\r
+IO_get_closed(IOobject *self, void *closure)\r
+{\r
+    PyObject *result = Py_False;\r
+\r
+    if (self->buf == NULL)\r
+        result = Py_True;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyGetSetDef file_getsetlist[] = {\r
+    {"closed", (getter)IO_get_closed, NULL, "True if the file is closed"},\r
+    {0},\r
+};\r
+\r
+static PyObject *\r
+IO_flush(IOobject *self, PyObject *unused) {\r
+\r
+    if (!IO__opencheck(self)) return NULL;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(IO_getval__doc__,\r
+"getvalue([use_pos]) -- Get the string value."\r
+"\n"\r
+"If use_pos is specified and is a true value, then the string returned\n"\r
+"will include only the text up to the current file position.\n");\r
+\r
+static PyObject *\r
+IO_cgetval(PyObject *self) {\r
+    if (!IO__opencheck(IOOOBJECT(self))) return NULL;\r
+    assert(IOOOBJECT(self)->pos >= 0);\r
+    return PyString_FromStringAndSize(((IOobject*)self)->buf,\r
+                                      ((IOobject*)self)->pos);\r
+}\r
+\r
+static PyObject *\r
+IO_getval(IOobject *self, PyObject *args) {\r
+    PyObject *use_pos=Py_None;\r
+    int b;\r
+    Py_ssize_t s;\r
+\r
+    if (!IO__opencheck(self)) return NULL;\r
+    if (!PyArg_UnpackTuple(args,"getval", 0, 1,&use_pos)) return NULL;\r
+\r
+    b = PyObject_IsTrue(use_pos);\r
+    if (b < 0)\r
+        return NULL;\r
+    if (b) {\r
+              s=self->pos;\r
+              if (s > self->string_size) s=self->string_size;\r
+    }\r
+    else\r
+              s=self->string_size;\r
+    assert(self->pos >= 0);\r
+    return PyString_FromStringAndSize(self->buf, s);\r
+}\r
+\r
+PyDoc_STRVAR(IO_isatty__doc__, "isatty(): always returns 0");\r
+\r
+static PyObject *\r
+IO_isatty(IOobject *self, PyObject *unused) {\r
+    if (!IO__opencheck(self)) return NULL;\r
+    Py_INCREF(Py_False);\r
+    return Py_False;\r
+}\r
+\r
+PyDoc_STRVAR(IO_read__doc__,\r
+"read([s]) -- Read s characters, or the rest of the string");\r
+\r
+static int\r
+IO_cread(PyObject *self, char **output, Py_ssize_t  n) {\r
+    Py_ssize_t l;\r
+\r
+    if (!IO__opencheck(IOOOBJECT(self))) return -1;\r
+    assert(IOOOBJECT(self)->pos >= 0);\r
+    assert(IOOOBJECT(self)->string_size >= 0);\r
+    l = ((IOobject*)self)->string_size - ((IOobject*)self)->pos;\r
+    if (n < 0 || n > l) {\r
+        n = l;\r
+        if (n < 0) n=0;\r
+    }\r
+    if (n > INT_MAX) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "length too large");\r
+        return -1;\r
+    }\r
+\r
+    *output=((IOobject*)self)->buf + ((IOobject*)self)->pos;\r
+    ((IOobject*)self)->pos += n;\r
+    return (int)n;\r
+}\r
+\r
+static PyObject *\r
+IO_read(IOobject *self, PyObject *args) {\r
+    Py_ssize_t n = -1;\r
+    char *output = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, "|n:read", &n)) return NULL;\r
+\r
+    if ( (n=IO_cread((PyObject*)self,&output,n)) < 0) return NULL;\r
+\r
+    return PyString_FromStringAndSize(output, n);\r
+}\r
+\r
+PyDoc_STRVAR(IO_readline__doc__, "readline() -- Read one line");\r
+\r
+static int\r
+IO_creadline(PyObject *self, char **output) {\r
+    char *n, *start, *end;\r
+    Py_ssize_t len;\r
+\r
+    if (!IO__opencheck(IOOOBJECT(self))) return -1;\r
+\r
+    n = start = ((IOobject*)self)->buf + ((IOobject*)self)->pos;\r
+    end = ((IOobject*)self)->buf + ((IOobject*)self)->string_size;\r
+    while (n < end && *n != '\n')\r
+        n++;\r
+\r
+    if (n < end) n++;\r
+\r
+    len = n - start;\r
+    if (len > INT_MAX)\r
+        len = INT_MAX;\r
+\r
+    *output=start;\r
+\r
+    assert(IOOOBJECT(self)->pos <= PY_SSIZE_T_MAX - len);\r
+    assert(IOOOBJECT(self)->pos >= 0);\r
+    assert(IOOOBJECT(self)->string_size >= 0);\r
+\r
+    ((IOobject*)self)->pos += len;\r
+    return (int)len;\r
+}\r
+\r
+static PyObject *\r
+IO_readline(IOobject *self, PyObject *args) {\r
+    int n, m=-1;\r
+    char *output;\r
+\r
+    if (args)\r
+        if (!PyArg_ParseTuple(args, "|i:readline", &m)) return NULL;\r
+\r
+    if( (n=IO_creadline((PyObject*)self,&output)) < 0) return NULL;\r
+    if (m >= 0 && m < n) {\r
+        m = n - m;\r
+        n -= m;\r
+        self->pos -= m;\r
+    }\r
+    assert(IOOOBJECT(self)->pos >= 0);\r
+    return PyString_FromStringAndSize(output, n);\r
+}\r
+\r
+PyDoc_STRVAR(IO_readlines__doc__, "readlines() -- Read all lines");\r
+\r
+static PyObject *\r
+IO_readlines(IOobject *self, PyObject *args) {\r
+    int n;\r
+    char *output;\r
+    PyObject *result, *line;\r
+    Py_ssize_t hint = 0, length = 0;\r
+\r
+    if (!PyArg_ParseTuple(args, "|n:readlines", &hint)) return NULL;\r
+\r
+    result = PyList_New(0);\r
+    if (!result)\r
+        return NULL;\r
+\r
+    while (1){\r
+        if ( (n = IO_creadline((PyObject*)self,&output)) < 0)\r
+            goto err;\r
+        if (n == 0)\r
+            break;\r
+        line = PyString_FromStringAndSize (output, n);\r
+        if (!line)\r
+            goto err;\r
+        if (PyList_Append (result, line) == -1) {\r
+            Py_DECREF (line);\r
+            goto err;\r
+        }\r
+        Py_DECREF (line);\r
+        length += n;\r
+        if (hint > 0 && length >= hint)\r
+            break;\r
+    }\r
+    return result;\r
+ err:\r
+    Py_DECREF(result);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(IO_reset__doc__,\r
+"reset() -- Reset the file position to the beginning");\r
+\r
+static PyObject *\r
+IO_reset(IOobject *self, PyObject *unused) {\r
+\r
+    if (!IO__opencheck(self)) return NULL;\r
+\r
+    self->pos = 0;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(IO_tell__doc__, "tell() -- get the current position.");\r
+\r
+static PyObject *\r
+IO_tell(IOobject *self, PyObject *unused) {\r
+\r
+    if (!IO__opencheck(self)) return NULL;\r
+\r
+    assert(self->pos >= 0);\r
+    return PyInt_FromSsize_t(self->pos);\r
+}\r
+\r
+PyDoc_STRVAR(IO_truncate__doc__,\r
+"truncate(): truncate the file at the current position.");\r
+\r
+static PyObject *\r
+IO_truncate(IOobject *self, PyObject *args) {\r
+    Py_ssize_t pos = -1;\r
+\r
+    if (!IO__opencheck(self)) return NULL;\r
+    if (!PyArg_ParseTuple(args, "|n:truncate", &pos)) return NULL;\r
+\r
+    if (PyTuple_Size(args) == 0) {\r
+        /* No argument passed, truncate to current position */\r
+        pos = self->pos;\r
+    }\r
+\r
+    if (pos < 0) {\r
+        errno = EINVAL;\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+\r
+    if (self->string_size > pos) self->string_size = pos;\r
+    self->pos = self->string_size;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+IO_iternext(Iobject *self)\r
+{\r
+    PyObject *next;\r
+    next = IO_readline((IOobject *)self, NULL);\r
+    if (!next)\r
+        return NULL;\r
+    if (!PyString_GET_SIZE(next)) {\r
+        Py_DECREF(next);\r
+        PyErr_SetNone(PyExc_StopIteration);\r
+        return NULL;\r
+    }\r
+    return next;\r
+}\r
+\r
+\r
+\r
+\r
+/* Read-write object methods */\r
+\r
+PyDoc_STRVAR(IO_seek__doc__,\r
+"seek(position)       -- set the current position\n"\r
+"seek(position, mode) -- mode 0: absolute; 1: relative; 2: relative to EOF");\r
+\r
+static PyObject *\r
+IO_seek(Iobject *self, PyObject *args) {\r
+    Py_ssize_t position;\r
+    int mode = 0;\r
+\r
+    if (!IO__opencheck(IOOOBJECT(self))) return NULL;\r
+    if (!PyArg_ParseTuple(args, "n|i:seek", &position, &mode))\r
+        return NULL;\r
+\r
+    if (mode == 2) {\r
+        position += self->string_size;\r
+    }\r
+    else if (mode == 1) {\r
+        position += self->pos;\r
+    }\r
+\r
+    if (position < 0) position=0;\r
+\r
+    self->pos=position;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(O_write__doc__,\r
+"write(s) -- Write a string to the file"\r
+"\n\nNote (hack:) writing None resets the buffer");\r
+\r
+\r
+static int\r
+O_cwrite(PyObject *self, const char *c, Py_ssize_t  len) {\r
+    Py_ssize_t newpos;\r
+    Oobject *oself;\r
+    char *newbuf;\r
+\r
+    if (!IO__opencheck(IOOOBJECT(self))) return -1;\r
+    oself = (Oobject *)self;\r
+\r
+    if (len > INT_MAX) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "length too large");\r
+        return -1;\r
+    }\r
+    assert(len >= 0);\r
+    if (oself->pos >= PY_SSIZE_T_MAX - len) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "new position too large");\r
+        return -1;\r
+    }\r
+    newpos = oself->pos + len;\r
+    if (newpos >= oself->buf_size) {\r
+        size_t newsize = oself->buf_size;\r
+        newsize *= 2;\r
+        if (newsize <= (size_t)newpos || newsize > PY_SSIZE_T_MAX) {\r
+            assert(newpos < PY_SSIZE_T_MAX - 1);\r
+            newsize = newpos + 1;\r
+        }\r
+        newbuf = (char*)realloc(oself->buf, newsize);\r
+        if (!newbuf) {\r
+            PyErr_SetString(PyExc_MemoryError,"out of memory");\r
+            return -1;\r
+        }\r
+        oself->buf_size = (Py_ssize_t)newsize;\r
+        oself->buf = newbuf;\r
+    }\r
+\r
+    if (oself->string_size < oself->pos) {\r
+        /* In case of overseek, pad with null bytes the buffer region between\r
+           the end of stream and the current position.\r
+\r
+          0   lo      string_size                           hi\r
+          |   |<---used--->|<----------available----------->|\r
+          |   |            <--to pad-->|<---to write--->    |\r
+          0   buf                   position\r
+        */\r
+        memset(oself->buf + oself->string_size, '\0',\r
+               (oself->pos - oself->string_size) * sizeof(char));\r
+    }\r
+\r
+    memcpy(oself->buf + oself->pos, c, len);\r
+\r
+    oself->pos = newpos;\r
+\r
+    if (oself->string_size < oself->pos) {\r
+        oself->string_size = oself->pos;\r
+    }\r
+\r
+    return (int)len;\r
+}\r
+\r
+static PyObject *\r
+O_write(Oobject *self, PyObject *args) {\r
+    Py_buffer buf;\r
+    int result;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:write", &buf)) return NULL;\r
+\r
+    result = O_cwrite((PyObject*)self, buf.buf, buf.len);\r
+    PyBuffer_Release(&buf);\r
+    if (result < 0) return NULL;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(O_close__doc__, "close(): explicitly release resources held.");\r
+\r
+static PyObject *\r
+O_close(Oobject *self, PyObject *unused) {\r
+    if (self->buf != NULL) free(self->buf);\r
+    self->buf = NULL;\r
+\r
+    self->pos = self->string_size = self->buf_size = 0;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(O_writelines__doc__,\r
+"writelines(sequence_of_strings) -> None.  Write the strings to the file.\n"\r
+"\n"\r
+"Note that newlines are not added.  The sequence can be any iterable object\n"\r
+"producing strings. This is equivalent to calling write() for each string.");\r
+static PyObject *\r
+O_writelines(Oobject *self, PyObject *args) {\r
+    PyObject *it, *s;\r
+\r
+    it = PyObject_GetIter(args);\r
+    if (it == NULL)\r
+        return NULL;\r
+    while ((s = PyIter_Next(it)) != NULL) {\r
+        Py_ssize_t n;\r
+        char *c;\r
+        if (PyString_AsStringAndSize(s, &c, &n) == -1) {\r
+            Py_DECREF(it);\r
+            Py_DECREF(s);\r
+            return NULL;\r
+        }\r
+        if (O_cwrite((PyObject *)self, c, n) == -1) {\r
+            Py_DECREF(it);\r
+            Py_DECREF(s);\r
+            return NULL;\r
+           }\r
+           Py_DECREF(s);\r
+       }\r
+\r
+       Py_DECREF(it);\r
+\r
+       /* See if PyIter_Next failed */\r
+       if (PyErr_Occurred())\r
+           return NULL;\r
+\r
+       Py_RETURN_NONE;\r
+}\r
+static struct PyMethodDef O_methods[] = {\r
+  /* Common methods: */\r
+  {"flush",     (PyCFunction)IO_flush,    METH_NOARGS,  IO_flush__doc__},\r
+  {"getvalue",  (PyCFunction)IO_getval,   METH_VARARGS, IO_getval__doc__},\r
+  {"isatty",    (PyCFunction)IO_isatty,   METH_NOARGS,  IO_isatty__doc__},\r
+  {"read",      (PyCFunction)IO_read,     METH_VARARGS, IO_read__doc__},\r
+  {"readline",  (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},\r
+  {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},\r
+  {"reset",     (PyCFunction)IO_reset,    METH_NOARGS,  IO_reset__doc__},\r
+  {"seek",      (PyCFunction)IO_seek,     METH_VARARGS, IO_seek__doc__},\r
+  {"tell",      (PyCFunction)IO_tell,     METH_NOARGS,  IO_tell__doc__},\r
+  {"truncate",  (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},\r
+\r
+  /* Read-write StringIO specific  methods: */\r
+  {"close",      (PyCFunction)O_close,      METH_NOARGS,  O_close__doc__},\r
+  {"write",      (PyCFunction)O_write,      METH_VARARGS, O_write__doc__},\r
+  {"writelines", (PyCFunction)O_writelines, METH_O,       O_writelines__doc__},\r
+  {NULL,         NULL}          /* sentinel */\r
+};\r
+\r
+static PyMemberDef O_memberlist[] = {\r
+    {"softspace",       T_INT,  offsetof(Oobject, softspace),   0,\r
+     "flag indicating that a space needs to be printed; used by print"},\r
+     /* getattr(f, "closed") is implemented without this table */\r
+    {NULL} /* Sentinel */\r
+};\r
+\r
+static void\r
+O_dealloc(Oobject *self) {\r
+    if (self->buf != NULL)\r
+        free(self->buf);\r
+    PyObject_Del(self);\r
+}\r
+\r
+PyDoc_STRVAR(Otype__doc__, "Simple type for output to strings.");\r
+\r
+static PyTypeObject Otype = {\r
+  PyVarObject_HEAD_INIT(NULL, 0)\r
+  "cStringIO.StringO",          /*tp_name*/\r
+  sizeof(Oobject),              /*tp_basicsize*/\r
+  0,                            /*tp_itemsize*/\r
+  /* methods */\r
+  (destructor)O_dealloc,        /*tp_dealloc*/\r
+  0,                            /*tp_print*/\r
+  0,                            /*tp_getattr */\r
+  0,                            /*tp_setattr */\r
+  0,                            /*tp_compare*/\r
+  0,                            /*tp_repr*/\r
+  0,                            /*tp_as_number*/\r
+  0,                            /*tp_as_sequence*/\r
+  0,                            /*tp_as_mapping*/\r
+  0,                            /*tp_hash*/\r
+  0     ,                       /*tp_call*/\r
+  0,                            /*tp_str*/\r
+  0,                            /*tp_getattro */\r
+  0,                            /*tp_setattro */\r
+  0,                            /*tp_as_buffer */\r
+  Py_TPFLAGS_DEFAULT,           /*tp_flags*/\r
+  Otype__doc__,                 /*tp_doc */\r
+  0,                            /*tp_traverse */\r
+  0,                            /*tp_clear */\r
+  0,                            /*tp_richcompare */\r
+  0,                            /*tp_weaklistoffset */\r
+  PyObject_SelfIter,            /*tp_iter */\r
+  (iternextfunc)IO_iternext,    /*tp_iternext */\r
+  O_methods,                    /*tp_methods */\r
+  O_memberlist,                 /*tp_members */\r
+  file_getsetlist,              /*tp_getset */\r
+};\r
+\r
+static PyObject *\r
+newOobject(int  size) {\r
+    Oobject *self;\r
+\r
+    self = PyObject_New(Oobject, &Otype);\r
+    if (self == NULL)\r
+        return NULL;\r
+    self->pos=0;\r
+    self->string_size = 0;\r
+    self->softspace = 0;\r
+\r
+    self->buf = (char *)malloc(size);\r
+    if (!self->buf) {\r
+              PyErr_SetString(PyExc_MemoryError,"out of memory");\r
+              self->buf_size = 0;\r
+              Py_DECREF(self);\r
+              return NULL;\r
+      }\r
+\r
+    self->buf_size=size;\r
+    return (PyObject*)self;\r
+}\r
+\r
+/* End of code for StringO objects */\r
+/* -------------------------------------------------------- */\r
+\r
+static PyObject *\r
+I_close(Iobject *self, PyObject *unused) {\r
+    PyBuffer_Release(&self->pbuf);\r
+    self->buf = NULL;\r
+\r
+    self->pos = self->string_size = 0;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static struct PyMethodDef I_methods[] = {\r
+  /* Common methods: */\r
+  {"flush",     (PyCFunction)IO_flush,    METH_NOARGS,  IO_flush__doc__},\r
+  {"getvalue",  (PyCFunction)IO_getval,   METH_VARARGS, IO_getval__doc__},\r
+  {"isatty",    (PyCFunction)IO_isatty,   METH_NOARGS,  IO_isatty__doc__},\r
+  {"read",      (PyCFunction)IO_read,     METH_VARARGS, IO_read__doc__},\r
+  {"readline",  (PyCFunction)IO_readline, METH_VARARGS, IO_readline__doc__},\r
+  {"readlines", (PyCFunction)IO_readlines,METH_VARARGS, IO_readlines__doc__},\r
+  {"reset",     (PyCFunction)IO_reset,    METH_NOARGS,  IO_reset__doc__},\r
+  {"seek",      (PyCFunction)IO_seek,     METH_VARARGS, IO_seek__doc__},\r
+  {"tell",      (PyCFunction)IO_tell,     METH_NOARGS,  IO_tell__doc__},\r
+  {"truncate",  (PyCFunction)IO_truncate, METH_VARARGS, IO_truncate__doc__},\r
+\r
+  /* Read-only StringIO specific  methods: */\r
+  {"close",     (PyCFunction)I_close,    METH_NOARGS,  O_close__doc__},\r
+  {NULL,        NULL}\r
+};\r
+\r
+static void\r
+I_dealloc(Iobject *self) {\r
+  PyBuffer_Release(&self->pbuf);\r
+  PyObject_Del(self);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(Itype__doc__,\r
+"Simple type for treating strings as input file streams");\r
+\r
+static PyTypeObject Itype = {\r
+  PyVarObject_HEAD_INIT(NULL, 0)\r
+  "cStringIO.StringI",                  /*tp_name*/\r
+  sizeof(Iobject),                      /*tp_basicsize*/\r
+  0,                                    /*tp_itemsize*/\r
+  /* methods */\r
+  (destructor)I_dealloc,                /*tp_dealloc*/\r
+  0,                                    /*tp_print*/\r
+  0,                                    /* tp_getattr */\r
+  0,                                    /*tp_setattr*/\r
+  0,                                    /*tp_compare*/\r
+  0,                                    /*tp_repr*/\r
+  0,                                    /*tp_as_number*/\r
+  0,                                    /*tp_as_sequence*/\r
+  0,                                    /*tp_as_mapping*/\r
+  0,                                    /*tp_hash*/\r
+  0,                                    /*tp_call*/\r
+  0,                                    /*tp_str*/\r
+  0,                                    /* tp_getattro */\r
+  0,                                    /* tp_setattro */\r
+  0,                                    /* tp_as_buffer */\r
+  Py_TPFLAGS_DEFAULT,                   /* tp_flags */\r
+  Itype__doc__,                         /* tp_doc */\r
+  0,                                    /* tp_traverse */\r
+  0,                                    /* tp_clear */\r
+  0,                                    /* tp_richcompare */\r
+  0,                                    /* tp_weaklistoffset */\r
+  PyObject_SelfIter,                    /* tp_iter */\r
+  (iternextfunc)IO_iternext,            /* tp_iternext */\r
+  I_methods,                            /* tp_methods */\r
+  0,                                    /* tp_members */\r
+  file_getsetlist,                      /* tp_getset */\r
+};\r
+\r
+static PyObject *\r
+newIobject(PyObject *s) {\r
+  Iobject *self;\r
+  Py_buffer buf;\r
+  PyObject *args;\r
+  int result;\r
+\r
+  args = Py_BuildValue("(O)", s);\r
+  if (args == NULL)\r
+      return NULL;\r
+  result = PyArg_ParseTuple(args, "s*:StringIO", &buf);\r
+  Py_DECREF(args);\r
+  if (!result)\r
+      return NULL;\r
+\r
+  self = PyObject_New(Iobject, &Itype);\r
+  if (!self) {\r
+      PyBuffer_Release(&buf);\r
+      return NULL;\r
+  }\r
+  self->buf=buf.buf;\r
+  self->string_size=buf.len;\r
+  self->pbuf=buf;\r
+  self->pos=0;\r
+\r
+  return (PyObject*)self;\r
+}\r
+\r
+/* End of code for StringI objects */\r
+/* -------------------------------------------------------- */\r
+\r
+\r
+PyDoc_STRVAR(IO_StringIO__doc__,\r
+"StringIO([s]) -- Return a StringIO-like stream for reading or writing");\r
+\r
+static PyObject *\r
+IO_StringIO(PyObject *self, PyObject *args) {\r
+  PyObject *s=0;\r
+\r
+  if (!PyArg_UnpackTuple(args, "StringIO", 0, 1, &s)) return NULL;\r
+\r
+  if (s) return newIobject(s);\r
+  return newOobject(128);\r
+}\r
+\r
+/* List of methods defined in the module */\r
+\r
+static struct PyMethodDef IO_methods[] = {\r
+  {"StringIO",  (PyCFunction)IO_StringIO,\r
+   METH_VARARGS,        IO_StringIO__doc__},\r
+  {NULL,                NULL}           /* sentinel */\r
+};\r
+\r
+\r
+/* Initialization function for the module (*must* be called initcStringIO) */\r
+\r
+static struct PycStringIO_CAPI CAPI = {\r
+  IO_cread,\r
+  IO_creadline,\r
+  O_cwrite,\r
+  IO_cgetval,\r
+  newOobject,\r
+  newIobject,\r
+  &Itype,\r
+  &Otype,\r
+};\r
+\r
+#ifndef PyMODINIT_FUNC  /* declarations for DLL import/export */\r
+#define PyMODINIT_FUNC void\r
+#endif\r
+PyMODINIT_FUNC\r
+initcStringIO(void) {\r
+  PyObject *m, *d, *v;\r
+\r
+\r
+  /* Create the module and add the functions */\r
+  m = Py_InitModule4("cStringIO", IO_methods,\r
+                     cStringIO_module_documentation,\r
+                     (PyObject*)NULL,PYTHON_API_VERSION);\r
+  if (m == NULL) return;\r
+\r
+  /* Add some symbolic constants to the module */\r
+  d = PyModule_GetDict(m);\r
+\r
+  /* Export C API */\r
+  Py_TYPE(&Itype)=&PyType_Type;\r
+  Py_TYPE(&Otype)=&PyType_Type;\r
+  if (PyType_Ready(&Otype) < 0) return;\r
+  if (PyType_Ready(&Itype) < 0) return;\r
+  v = PyCapsule_New(&CAPI, PycStringIO_CAPSULE_NAME, NULL);\r
+  PyDict_SetItemString(d,"cStringIO_CAPI", v);\r
+  Py_XDECREF(v);\r
+\r
+  /* Export Types */\r
+  PyDict_SetItemString(d,"InputType",  (PyObject*)&Itype);\r
+  PyDict_SetItemString(d,"OutputType", (PyObject*)&Otype);\r
+\r
+  /* Maybe make certain warnings go away */\r
+  if (0) PycString_IMPORT;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/README b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/README
new file mode 100644 (file)
index 0000000..76589f5
--- /dev/null
@@ -0,0 +1,79 @@
+To generate or modify mapping headers\r
+-------------------------------------\r
+Mapping headers are imported from CJKCodecs as pre-generated form.\r
+If you need to tweak or add something on it, please look at tools/\r
+subdirectory of CJKCodecs' distribution.\r
+\r
+\r
+\r
+Notes on implmentation characteristics of each codecs\r
+-----------------------------------------------------\r
+\r
+1) Big5 codec\r
+\r
+  The big5 codec maps the following characters as cp950 does rather\r
+  than conforming Unicode.org's that maps to 0xFFFD.\r
+\r
+    BIG5        Unicode     Description\r
+\r
+    0xA15A      0x2574      SPACING UNDERSCORE\r
+    0xA1C3      0xFFE3      SPACING HEAVY OVERSCORE\r
+    0xA1C5      0x02CD      SPACING HEAVY UNDERSCORE\r
+    0xA1FE      0xFF0F      LT DIAG UP RIGHT TO LOW LEFT\r
+    0xA240      0xFF3C      LT DIAG UP LEFT TO LOW RIGHT\r
+    0xA2CC      0x5341      HANGZHOU NUMERAL TEN\r
+    0xA2CE      0x5345      HANGZHOU NUMERAL THIRTY\r
+\r
+  Because unicode 0x5341, 0x5345, 0xFF0F, 0xFF3C is mapped to another\r
+  big5 codes already, a roundtrip compatibility is not guaranteed for\r
+  them.\r
+\r
+\r
+2) cp932 codec\r
+\r
+  To conform to Windows's real mapping, cp932 codec maps the following\r
+  codepoints in addition of the official cp932 mapping.\r
+\r
+    CP932     Unicode     Description\r
+\r
+    0x80      0x80        UNDEFINED\r
+    0xA0      0xF8F0      UNDEFINED\r
+    0xFD      0xF8F1      UNDEFINED\r
+    0xFE      0xF8F2      UNDEFINED\r
+    0xFF      0xF8F3      UNDEFINED\r
+\r
+\r
+3) euc-jisx0213 codec\r
+\r
+  The euc-jisx0213 codec maps JIS X 0213 Plane 1 code 0x2140 into\r
+  unicode U+FF3C instead of U+005C as on unicode.org's mapping.\r
+  Because euc-jisx0213 has REVERSE SOLIDUS on 0x5c already and A140\r
+  is shown as a full width character, mapping to U+FF3C can make\r
+  more sense.\r
+\r
+  The euc-jisx0213 codec is enabled to decode JIS X 0212 codes on\r
+  codeset 2. Because JIS X 0212 and JIS X 0213 Plane 2 don't have\r
+  overlapped by each other, it doesn't bother standard conformations\r
+  (and JIS X 0213 Plane 2 is intended to use so.) On encoding\r
+  sessions, the codec will try to encode kanji characters in this\r
+  order:\r
+\r
+    JIS X 0213 Plane 1 -> JIS X 0213 Plane 2 -> JIS X 0212\r
+\r
+\r
+4) euc-jp codec\r
+\r
+  The euc-jp codec is a compatibility instance on these points:\r
+   - U+FF3C FULLWIDTH REVERSE SOLIDUS is mapped to EUC-JP A1C0 (vice versa)\r
+   - U+00A5 YEN SIGN is mapped to EUC-JP 0x5c. (one way)\r
+   - U+203E OVERLINE is mapped to EUC-JP 0x7e. (one way)\r
+\r
+\r
+5) shift-jis codec\r
+\r
+  The shift-jis codec is mapping 0x20-0x7e area to U+20-U+7E directly\r
+  instead of using JIS X 0201 for compatibility. The differences are:\r
+   - U+005C REVERSE SOLIDUS is mapped to SHIFT-JIS 0x5c.\r
+   - U+007E TILDE is mapped to SHIFT-JIS 0x7e.\r
+   - U+FF3C FULL-WIDTH REVERSE SOLIDUS is mapped to SHIFT-JIS 815f.\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_cn.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_cn.c
new file mode 100644 (file)
index 0000000..c77f66e
--- /dev/null
@@ -0,0 +1,444 @@
+/*\r
+ * _codecs_cn.c: Codecs collection for Mainland Chinese encodings\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#include "cjkcodecs.h"\r
+#include "mappings_cn.h"\r
+\r
+/**\r
+ * hz is predefined as 100 on AIX. So we undefine it to avoid\r
+ * conflict against hz codec's.\r
+ */\r
+#ifdef _AIX\r
+#undef hz\r
+#endif\r
+\r
+/* GBK and GB2312 map differently in few code points that are listed below:\r
+ *\r
+ *              gb2312                          gbk\r
+ * A1A4         U+30FB KATAKANA MIDDLE DOT      U+00B7 MIDDLE DOT\r
+ * A1AA         U+2015 HORIZONTAL BAR           U+2014 EM DASH\r
+ * A844         undefined                       U+2015 HORIZONTAL BAR\r
+ */\r
+\r
+#define GBK_DECODE(dc1, dc2, assi) \\r
+    if ((dc1) == 0xa1 && (dc2) == 0xaa) (assi) = 0x2014; \\r
+    else if ((dc1) == 0xa8 && (dc2) == 0x44) (assi) = 0x2015; \\r
+    else if ((dc1) == 0xa1 && (dc2) == 0xa4) (assi) = 0x00b7; \\r
+    else TRYMAP_DEC(gb2312, assi, dc1 ^ 0x80, dc2 ^ 0x80); \\r
+    else TRYMAP_DEC(gbkext, assi, dc1, dc2);\r
+\r
+#define GBK_ENCODE(code, assi) \\r
+    if ((code) == 0x2014) (assi) = 0xa1aa; \\r
+    else if ((code) == 0x2015) (assi) = 0xa844; \\r
+    else if ((code) == 0x00b7) (assi) = 0xa1a4; \\r
+    else if ((code) != 0x30fb && TRYMAP_ENC_COND(gbcommon, assi, code));\r
+\r
+/*\r
+ * GB2312 codec\r
+ */\r
+\r
+ENCODER(gb2312)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+        TRYMAP_ENC(gbcommon, code, c);\r
+        else return 1;\r
+\r
+        if (code & 0x8000) /* MSB set: GBK */\r
+            return 1;\r
+\r
+        OUT1((code >> 8) | 0x80)\r
+        OUT2((code & 0xFF) | 0x80)\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(gb2312)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = **inbuf;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+        TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {\r
+            NEXT(2, 1)\r
+        }\r
+        else return 2;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * GBK codec\r
+ */\r
+\r
+ENCODER(gbk)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        GBK_ENCODE(c, code)\r
+        else return 1;\r
+\r
+        OUT1((code >> 8) | 0x80)\r
+        if (code & 0x8000)\r
+            OUT2((code & 0xFF)) /* MSB set: GBK */\r
+        else\r
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(gbk)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+\r
+        GBK_DECODE(c, IN2, **outbuf)\r
+        else return 2;\r
+\r
+        NEXT(2, 1)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * GB18030 codec\r
+ */\r
+\r
+ENCODER(gb18030)\r
+{\r
+    while (inleft > 0) {\r
+        ucs4_t c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        DECODE_SURROGATE(c)\r
+        if (c > 0x10FFFF)\r
+#if Py_UNICODE_SIZE == 2\r
+            return 2; /* surrogates pair */\r
+#else\r
+            return 1;\r
+#endif\r
+        else if (c >= 0x10000) {\r
+            ucs4_t tc = c - 0x10000;\r
+\r
+            REQUIRE_OUTBUF(4)\r
+\r
+            OUT4((unsigned char)(tc % 10) + 0x30)\r
+            tc /= 10;\r
+            OUT3((unsigned char)(tc % 126) + 0x81)\r
+            tc /= 126;\r
+            OUT2((unsigned char)(tc % 10) + 0x30)\r
+            tc /= 10;\r
+            OUT1((unsigned char)(tc + 0x90))\r
+\r
+#if Py_UNICODE_SIZE == 2\r
+            NEXT(2, 4) /* surrogates pair */\r
+#else\r
+            NEXT(1, 4)\r
+#endif\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        GBK_ENCODE(c, code)\r
+        else TRYMAP_ENC(gb18030ext, code, c);\r
+        else {\r
+            const struct _gb18030_to_unibmp_ranges *utrrange;\r
+\r
+            REQUIRE_OUTBUF(4)\r
+\r
+            for (utrrange = gb18030_to_unibmp_ranges;\r
+                 utrrange->first != 0;\r
+                 utrrange++)\r
+                if (utrrange->first <= c &&\r
+                    c <= utrrange->last) {\r
+                    Py_UNICODE tc;\r
+\r
+                    tc = c - utrrange->first +\r
+                         utrrange->base;\r
+\r
+                    OUT4((unsigned char)(tc % 10) + 0x30)\r
+                    tc /= 10;\r
+                    OUT3((unsigned char)(tc % 126) + 0x81)\r
+                    tc /= 126;\r
+                    OUT2((unsigned char)(tc % 10) + 0x30)\r
+                    tc /= 10;\r
+                    OUT1((unsigned char)tc + 0x81)\r
+\r
+                    NEXT(1, 4)\r
+                    break;\r
+                }\r
+\r
+            if (utrrange->first == 0)\r
+                return 1;\r
+            continue;\r
+        }\r
+\r
+        OUT1((code >> 8) | 0x80)\r
+        if (code & 0x8000)\r
+            OUT2((code & 0xFF)) /* MSB set: GBK or GB18030ext */\r
+        else\r
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: GB2312 */\r
+\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(gb18030)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1, c2;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+\r
+        c2 = IN2;\r
+        if (c2 >= 0x30 && c2 <= 0x39) { /* 4 bytes seq */\r
+            const struct _gb18030_to_unibmp_ranges *utr;\r
+            unsigned char c3, c4;\r
+            ucs4_t lseq;\r
+\r
+            REQUIRE_INBUF(4)\r
+            c3 = IN3;\r
+            c4 = IN4;\r
+            if (c < 0x81 || c3 < 0x81 || c4 < 0x30 || c4 > 0x39)\r
+                return 4;\r
+            c -= 0x81;  c2 -= 0x30;\r
+            c3 -= 0x81; c4 -= 0x30;\r
+\r
+            if (c < 4) { /* U+0080 - U+FFFF */\r
+                lseq = ((ucs4_t)c * 10 + c2) * 1260 +\r
+                    (ucs4_t)c3 * 10 + c4;\r
+                if (lseq < 39420) {\r
+                    for (utr = gb18030_to_unibmp_ranges;\r
+                         lseq >= (utr + 1)->base;\r
+                         utr++) ;\r
+                    OUT1(utr->first - utr->base + lseq)\r
+                    NEXT(4, 1)\r
+                    continue;\r
+                }\r
+            }\r
+            else if (c >= 15) { /* U+10000 - U+10FFFF */\r
+                lseq = 0x10000 + (((ucs4_t)c-15) * 10 + c2)\r
+                    * 1260 + (ucs4_t)c3 * 10 + c4;\r
+                if (lseq <= 0x10FFFF) {\r
+                    WRITEUCS4(lseq);\r
+                    NEXT_IN(4)\r
+                    continue;\r
+                }\r
+            }\r
+            return 4;\r
+        }\r
+\r
+        GBK_DECODE(c, c2, **outbuf)\r
+        else TRYMAP_DEC(gb18030ext, **outbuf, c, c2);\r
+        else return 2;\r
+\r
+        NEXT(2, 1)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * HZ codec\r
+ */\r
+\r
+ENCODER_INIT(hz)\r
+{\r
+    state->i = 0;\r
+    return 0;\r
+}\r
+\r
+ENCODER_RESET(hz)\r
+{\r
+    if (state->i != 0) {\r
+        WRITE2('~', '}')\r
+        state->i = 0;\r
+        NEXT_OUT(2)\r
+    }\r
+    return 0;\r
+}\r
+\r
+ENCODER(hz)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            if (state->i == 0) {\r
+                WRITE1((unsigned char)c)\r
+                NEXT(1, 1)\r
+            }\r
+            else {\r
+                WRITE3('~', '}', (unsigned char)c)\r
+                NEXT(1, 3)\r
+                state->i = 0;\r
+            }\r
+            continue;\r
+        }\r
+\r
+        UCS4INVALID(c)\r
+\r
+        TRYMAP_ENC(gbcommon, code, c);\r
+        else return 1;\r
+\r
+        if (code & 0x8000) /* MSB set: GBK */\r
+            return 1;\r
+\r
+        if (state->i == 0) {\r
+            WRITE4('~', '{', code >> 8, code & 0xff)\r
+            NEXT(1, 4)\r
+            state->i = 1;\r
+        }\r
+        else {\r
+            WRITE2(code >> 8, code & 0xff)\r
+            NEXT(1, 2)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER_INIT(hz)\r
+{\r
+    state->i = 0;\r
+    return 0;\r
+}\r
+\r
+DECODER_RESET(hz)\r
+{\r
+    state->i = 0;\r
+    return 0;\r
+}\r
+\r
+DECODER(hz)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        if (c == '~') {\r
+            unsigned char c2 = IN2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            if (c2 == '~') {\r
+                WRITE1('~')\r
+                NEXT(2, 1)\r
+                continue;\r
+            }\r
+            else if (c2 == '{' && state->i == 0)\r
+                state->i = 1; /* set GB */\r
+            else if (c2 == '}' && state->i == 1)\r
+                state->i = 0; /* set ASCII */\r
+            else if (c2 == '\n')\r
+                ; /* line-continuation */\r
+            else\r
+                return 2;\r
+            NEXT(2, 0);\r
+            continue;\r
+        }\r
+\r
+        if (c & 0x80)\r
+            return 1;\r
+\r
+        if (state->i == 0) { /* ASCII mode */\r
+            WRITE1(c)\r
+            NEXT(1, 1)\r
+        }\r
+        else { /* GB mode */\r
+            REQUIRE_INBUF(2)\r
+            REQUIRE_OUTBUF(1)\r
+            TRYMAP_DEC(gb2312, **outbuf, c, IN2) {\r
+                NEXT(2, 1)\r
+            }\r
+            else\r
+                return 2;\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  MAPPING_DECONLY(gb2312)\r
+  MAPPING_DECONLY(gbkext)\r
+  MAPPING_ENCONLY(gbcommon)\r
+  MAPPING_ENCDEC(gb18030ext)\r
+END_MAPPINGS_LIST\r
+\r
+BEGIN_CODECS_LIST\r
+  CODEC_STATELESS(gb2312)\r
+  CODEC_STATELESS(gbk)\r
+  CODEC_STATELESS(gb18030)\r
+  CODEC_STATEFUL(hz)\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(cn)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_hk.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_hk.c
new file mode 100644 (file)
index 0000000..5302b52
--- /dev/null
@@ -0,0 +1,184 @@
+/*\r
+ * _codecs_hk.c: Codecs collection for encodings from Hong Kong\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#define USING_IMPORTED_MAPS\r
+\r
+#include "cjkcodecs.h"\r
+#include "mappings_hk.h"\r
+\r
+/*\r
+ * BIG5HKSCS codec\r
+ */\r
+\r
+static const encode_map *big5_encmap = NULL;\r
+static const decode_map *big5_decmap = NULL;\r
+\r
+CODEC_INIT(big5hkscs)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && IMPORT_MAP(tw, big5, &big5_encmap, &big5_decmap))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+/*\r
+ * There are four possible pair unicode -> big5hkscs maps as in HKSCS 2004:\r
+ *  U+00CA U+0304 -> 8862  (U+00CA alone is mapped to 8866)\r
+ *  U+00CA U+030C -> 8864\r
+ *  U+00EA U+0304 -> 88a3  (U+00EA alone is mapped to 88a7)\r
+ *  U+00EA U+030C -> 88a5\r
+ * These are handled by not mapping tables but a hand-written code.\r
+ */\r
+static const DBCHAR big5hkscs_pairenc_table[4] = {0x8862, 0x8864, 0x88a3, 0x88a5};\r
+\r
+ENCODER(big5hkscs)\r
+{\r
+    while (inleft > 0) {\r
+        ucs4_t c = **inbuf;\r
+        DBCHAR code;\r
+        Py_ssize_t insize;\r
+\r
+        if (c < 0x80) {\r
+            REQUIRE_OUTBUF(1)\r
+            **outbuf = (unsigned char)c;\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        DECODE_SURROGATE(c)\r
+        insize = GET_INSIZE(c);\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        if (c < 0x10000) {\r
+            TRYMAP_ENC(big5hkscs_bmp, code, c) {\r
+                if (code == MULTIC) {\r
+                    if (inleft >= 2 &&\r
+                        ((c & 0xffdf) == 0x00ca) &&\r
+                        (((*inbuf)[1] & 0xfff7) == 0x0304)) {\r
+                        code = big5hkscs_pairenc_table[\r
+                            ((c >> 4) |\r
+                             ((*inbuf)[1] >> 3)) & 3];\r
+                        insize = 2;\r
+                    }\r
+                    else if (inleft < 2 &&\r
+                             !(flags & MBENC_FLUSH))\r
+                        return MBERR_TOOFEW;\r
+                    else {\r
+                        if (c == 0xca)\r
+                            code = 0x8866;\r
+                        else /* c == 0xea */\r
+                            code = 0x88a7;\r
+                    }\r
+                }\r
+            }\r
+            else TRYMAP_ENC(big5, code, c);\r
+            else return 1;\r
+        }\r
+        else if (c < 0x20000)\r
+            return insize;\r
+        else if (c < 0x30000) {\r
+            TRYMAP_ENC(big5hkscs_nonbmp, code, c & 0xffff);\r
+            else return insize;\r
+        }\r
+        else\r
+            return insize;\r
+\r
+        OUT1(code >> 8)\r
+        OUT2(code & 0xFF)\r
+        NEXT(insize, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+#define BH2S(c1, c2) (((c1) - 0x87) * (0xfe - 0x40 + 1) + ((c2) - 0x40))\r
+\r
+DECODER(big5hkscs)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+        ucs4_t decoded;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+\r
+        if (0xc6 > c || c > 0xc8 || (c < 0xc7 && IN2 < 0xa1)) {\r
+            TRYMAP_DEC(big5, **outbuf, c, IN2) {\r
+                NEXT(2, 1)\r
+                continue;\r
+            }\r
+        }\r
+\r
+        TRYMAP_DEC(big5hkscs, decoded, c, IN2)\r
+        {\r
+            int s = BH2S(c, IN2);\r
+            const unsigned char *hintbase;\r
+\r
+            assert(0x87 <= c && c <= 0xfe);\r
+            assert(0x40 <= IN2 && IN2 <= 0xfe);\r
+\r
+            if (BH2S(0x87, 0x40) <= s && s <= BH2S(0xa0, 0xfe)) {\r
+                    hintbase = big5hkscs_phint_0;\r
+                    s -= BH2S(0x87, 0x40);\r
+            }\r
+            else if (BH2S(0xc6,0xa1) <= s && s <= BH2S(0xc8,0xfe)){\r
+                    hintbase = big5hkscs_phint_12130;\r
+                    s -= BH2S(0xc6, 0xa1);\r
+            }\r
+            else if (BH2S(0xf9,0xd6) <= s && s <= BH2S(0xfe,0xfe)){\r
+                    hintbase = big5hkscs_phint_21924;\r
+                    s -= BH2S(0xf9, 0xd6);\r
+            }\r
+            else\r
+                    return MBERR_INTERNAL;\r
+\r
+            if (hintbase[s >> 3] & (1 << (s & 7))) {\r
+                    WRITEUCS4(decoded | 0x20000)\r
+                    NEXT_IN(2)\r
+            }\r
+            else {\r
+                    OUT1(decoded)\r
+                    NEXT(2, 1)\r
+            }\r
+            continue;\r
+        }\r
+\r
+        switch ((c << 8) | IN2) {\r
+        case 0x8862: WRITE2(0x00ca, 0x0304); break;\r
+        case 0x8864: WRITE2(0x00ca, 0x030c); break;\r
+        case 0x88a3: WRITE2(0x00ea, 0x0304); break;\r
+        case 0x88a5: WRITE2(0x00ea, 0x030c); break;\r
+        default: return 2;\r
+        }\r
+\r
+        NEXT(2, 2) /* all decoded code points are pairs, above. */\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  MAPPING_DECONLY(big5hkscs)\r
+  MAPPING_ENCONLY(big5hkscs_bmp)\r
+  MAPPING_ENCONLY(big5hkscs_nonbmp)\r
+END_MAPPINGS_LIST\r
+\r
+BEGIN_CODECS_LIST\r
+  CODEC_STATELESS_WINIT(big5hkscs)\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(hk)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_iso2022.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_iso2022.c
new file mode 100644 (file)
index 0000000..14fc643
--- /dev/null
@@ -0,0 +1,1131 @@
+/*\r
+ * _codecs_iso2022.c: Codecs collection for ISO-2022 encodings.\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#define USING_IMPORTED_MAPS\r
+#define USING_BINARY_PAIR_SEARCH\r
+#define EXTERN_JISX0213_PAIR\r
+#define EMULATE_JISX0213_2000_ENCODE_INVALID MAP_UNMAPPABLE\r
+#define EMULATE_JISX0213_2000_DECODE_INVALID MAP_UNMAPPABLE\r
+\r
+#include "cjkcodecs.h"\r
+#include "alg_jisx0201.h"\r
+#include "emu_jisx0213_2000.h"\r
+#include "mappings_jisx0213_pair.h"\r
+\r
+/* STATE\r
+\r
+   state->c[0-3]\r
+\r
+    00000000\r
+    ||^^^^^|\r
+    |+-----+----  G0-3 Character Set\r
+    +-----------  Is G0-3 double byte?\r
+\r
+   state->c[4]\r
+\r
+    00000000\r
+          ||\r
+          |+----  Locked-Shift?\r
+          +-----  ESC Throughout\r
+*/\r
+\r
+#define ESC                     0x1B\r
+#define SO                      0x0E\r
+#define SI                      0x0F\r
+#define LF                      0x0A\r
+\r
+#define MAX_ESCSEQLEN           16\r
+\r
+#define CHARSET_ISO8859_1       'A'\r
+#define CHARSET_ASCII           'B'\r
+#define CHARSET_ISO8859_7       'F'\r
+#define CHARSET_JISX0201_K      'I'\r
+#define CHARSET_JISX0201_R      'J'\r
+\r
+#define CHARSET_GB2312          ('A'|CHARSET_DBCS)\r
+#define CHARSET_JISX0208        ('B'|CHARSET_DBCS)\r
+#define CHARSET_KSX1001         ('C'|CHARSET_DBCS)\r
+#define CHARSET_JISX0212        ('D'|CHARSET_DBCS)\r
+#define CHARSET_GB2312_8565     ('E'|CHARSET_DBCS)\r
+#define CHARSET_CNS11643_1      ('G'|CHARSET_DBCS)\r
+#define CHARSET_CNS11643_2      ('H'|CHARSET_DBCS)\r
+#define CHARSET_JISX0213_2000_1 ('O'|CHARSET_DBCS)\r
+#define CHARSET_JISX0213_2      ('P'|CHARSET_DBCS)\r
+#define CHARSET_JISX0213_2004_1 ('Q'|CHARSET_DBCS)\r
+#define CHARSET_JISX0208_O      ('@'|CHARSET_DBCS)\r
+\r
+#define CHARSET_DBCS            0x80\r
+#define ESCMARK(mark)           ((mark) & 0x7f)\r
+\r
+#define IS_ESCEND(c)    (((c) >= 'A' && (c) <= 'Z') || (c) == '@')\r
+#define IS_ISO2022ESC(c2) \\r
+        ((c2) == '(' || (c2) == ')' || (c2) == '$' || \\r
+         (c2) == '.' || (c2) == '&')\r
+    /* this is not a complete list of ISO-2022 escape sequence headers.\r
+     * but, it's enough to implement CJK instances of iso-2022. */\r
+\r
+#define MAP_UNMAPPABLE          0xFFFF\r
+#define MAP_MULTIPLE_AVAIL      0xFFFE /* for JIS X 0213 */\r
+\r
+#define F_SHIFTED               0x01\r
+#define F_ESCTHROUGHOUT         0x02\r
+\r
+#define STATE_SETG(dn, v)       ((state)->c[dn]) = (v);\r
+#define STATE_GETG(dn)          ((state)->c[dn])\r
+\r
+#define STATE_G0                STATE_GETG(0)\r
+#define STATE_G1                STATE_GETG(1)\r
+#define STATE_G2                STATE_GETG(2)\r
+#define STATE_G3                STATE_GETG(3)\r
+#define STATE_SETG0(v)          STATE_SETG(0, v)\r
+#define STATE_SETG1(v)          STATE_SETG(1, v)\r
+#define STATE_SETG2(v)          STATE_SETG(2, v)\r
+#define STATE_SETG3(v)          STATE_SETG(3, v)\r
+\r
+#define STATE_SETFLAG(f)        ((state)->c[4]) |= (f);\r
+#define STATE_GETFLAG(f)        ((state)->c[4] & (f))\r
+#define STATE_CLEARFLAG(f)      ((state)->c[4]) &= ~(f);\r
+#define STATE_CLEARFLAGS()      ((state)->c[4]) = 0;\r
+\r
+#define ISO2022_CONFIG          ((const struct iso2022_config *)config)\r
+#define CONFIG_ISSET(flag)      (ISO2022_CONFIG->flags & (flag))\r
+#define CONFIG_DESIGNATIONS     (ISO2022_CONFIG->designations)\r
+\r
+/* iso2022_config.flags */\r
+#define NO_SHIFT                0x01\r
+#define USE_G2                  0x02\r
+#define USE_JISX0208_EXT        0x04\r
+\r
+/*-*- internal data structures -*-*/\r
+\r
+typedef int (*iso2022_init_func)(void);\r
+typedef ucs4_t (*iso2022_decode_func)(const unsigned char *data);\r
+typedef DBCHAR (*iso2022_encode_func)(const ucs4_t *data, Py_ssize_t *length);\r
+\r
+struct iso2022_designation {\r
+    unsigned char mark;\r
+    unsigned char plane;\r
+    unsigned char width;\r
+    iso2022_init_func initializer;\r
+    iso2022_decode_func decoder;\r
+    iso2022_encode_func encoder;\r
+};\r
+\r
+struct iso2022_config {\r
+    int flags;\r
+    const struct iso2022_designation *designations; /* non-ascii desigs */\r
+};\r
+\r
+/*-*- iso-2022 codec implementation -*-*/\r
+\r
+CODEC_INIT(iso2022)\r
+{\r
+    const struct iso2022_designation *desig = CONFIG_DESIGNATIONS;\r
+    for (desig = CONFIG_DESIGNATIONS; desig->mark; desig++)\r
+        if (desig->initializer != NULL && desig->initializer() != 0)\r
+            return -1;\r
+    return 0;\r
+}\r
+\r
+ENCODER_INIT(iso2022)\r
+{\r
+    STATE_CLEARFLAGS()\r
+    STATE_SETG0(CHARSET_ASCII)\r
+    STATE_SETG1(CHARSET_ASCII)\r
+    return 0;\r
+}\r
+\r
+ENCODER_RESET(iso2022)\r
+{\r
+    if (STATE_GETFLAG(F_SHIFTED)) {\r
+        WRITE1(SI)\r
+        NEXT_OUT(1)\r
+        STATE_CLEARFLAG(F_SHIFTED)\r
+    }\r
+    if (STATE_G0 != CHARSET_ASCII) {\r
+        WRITE3(ESC, '(', 'B')\r
+        NEXT_OUT(3)\r
+        STATE_SETG0(CHARSET_ASCII)\r
+    }\r
+    return 0;\r
+}\r
+\r
+ENCODER(iso2022)\r
+{\r
+    while (inleft > 0) {\r
+        const struct iso2022_designation *dsg;\r
+        DBCHAR encoded;\r
+        ucs4_t c = **inbuf;\r
+        Py_ssize_t insize;\r
+\r
+        if (c < 0x80) {\r
+            if (STATE_G0 != CHARSET_ASCII) {\r
+                WRITE3(ESC, '(', 'B')\r
+                STATE_SETG0(CHARSET_ASCII)\r
+                NEXT_OUT(3)\r
+            }\r
+            if (STATE_GETFLAG(F_SHIFTED)) {\r
+                WRITE1(SI)\r
+                STATE_CLEARFLAG(F_SHIFTED)\r
+                NEXT_OUT(1)\r
+            }\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        DECODE_SURROGATE(c)\r
+        insize = GET_INSIZE(c);\r
+\r
+        encoded = MAP_UNMAPPABLE;\r
+        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {\r
+            Py_ssize_t length = 1;\r
+            encoded = dsg->encoder(&c, &length);\r
+            if (encoded == MAP_MULTIPLE_AVAIL) {\r
+                /* this implementation won't work for pair\r
+                 * of non-bmp characters. */\r
+                if (inleft < 2) {\r
+                    if (!(flags & MBENC_FLUSH))\r
+                        return MBERR_TOOFEW;\r
+                    length = -1;\r
+                }\r
+                else\r
+                    length = 2;\r
+#if Py_UNICODE_SIZE == 2\r
+                if (length == 2) {\r
+                    ucs4_t u4in[2];\r
+                    u4in[0] = (ucs4_t)IN1;\r
+                    u4in[1] = (ucs4_t)IN2;\r
+                    encoded = dsg->encoder(u4in, &length);\r
+                } else\r
+                    encoded = dsg->encoder(&c, &length);\r
+#else\r
+                encoded = dsg->encoder(&c, &length);\r
+#endif\r
+                if (encoded != MAP_UNMAPPABLE) {\r
+                    insize = length;\r
+                    break;\r
+                }\r
+            }\r
+            else if (encoded != MAP_UNMAPPABLE)\r
+                break;\r
+        }\r
+\r
+        if (!dsg->mark)\r
+            return 1;\r
+        assert(dsg->width == 1 || dsg->width == 2);\r
+\r
+        switch (dsg->plane) {\r
+        case 0: /* G0 */\r
+            if (STATE_GETFLAG(F_SHIFTED)) {\r
+                WRITE1(SI)\r
+                STATE_CLEARFLAG(F_SHIFTED)\r
+                NEXT_OUT(1)\r
+            }\r
+            if (STATE_G0 != dsg->mark) {\r
+                if (dsg->width == 1) {\r
+                    WRITE3(ESC, '(', ESCMARK(dsg->mark))\r
+                    STATE_SETG0(dsg->mark)\r
+                    NEXT_OUT(3)\r
+                }\r
+                else if (dsg->mark == CHARSET_JISX0208) {\r
+                    WRITE3(ESC, '$', ESCMARK(dsg->mark))\r
+                    STATE_SETG0(dsg->mark)\r
+                    NEXT_OUT(3)\r
+                }\r
+                else {\r
+                    WRITE4(ESC, '$', '(',\r
+                        ESCMARK(dsg->mark))\r
+                    STATE_SETG0(dsg->mark)\r
+                    NEXT_OUT(4)\r
+                }\r
+            }\r
+            break;\r
+        case 1: /* G1 */\r
+            if (STATE_G1 != dsg->mark) {\r
+                if (dsg->width == 1) {\r
+                    WRITE3(ESC, ')', ESCMARK(dsg->mark))\r
+                    STATE_SETG1(dsg->mark)\r
+                    NEXT_OUT(3)\r
+                }\r
+                else {\r
+                    WRITE4(ESC, '$', ')',\r
+                        ESCMARK(dsg->mark))\r
+                    STATE_SETG1(dsg->mark)\r
+                    NEXT_OUT(4)\r
+                }\r
+            }\r
+            if (!STATE_GETFLAG(F_SHIFTED)) {\r
+                WRITE1(SO)\r
+                STATE_SETFLAG(F_SHIFTED)\r
+                NEXT_OUT(1)\r
+            }\r
+            break;\r
+        default: /* G2 and G3 is not supported: no encoding in\r
+                  * CJKCodecs are using them yet */\r
+            return MBERR_INTERNAL;\r
+        }\r
+\r
+        if (dsg->width == 1) {\r
+            WRITE1((unsigned char)encoded)\r
+            NEXT_OUT(1)\r
+        }\r
+        else {\r
+            WRITE2(encoded >> 8, encoded & 0xff)\r
+            NEXT_OUT(2)\r
+        }\r
+        NEXT_IN(insize)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER_INIT(iso2022)\r
+{\r
+    STATE_CLEARFLAGS()\r
+    STATE_SETG0(CHARSET_ASCII)\r
+    STATE_SETG1(CHARSET_ASCII)\r
+    STATE_SETG2(CHARSET_ASCII)\r
+    return 0;\r
+}\r
+\r
+DECODER_RESET(iso2022)\r
+{\r
+    STATE_SETG0(CHARSET_ASCII)\r
+    STATE_CLEARFLAG(F_SHIFTED)\r
+    return 0;\r
+}\r
+\r
+static Py_ssize_t\r
+iso2022processesc(const void *config, MultibyteCodec_State *state,\r
+                  const unsigned char **inbuf, Py_ssize_t *inleft)\r
+{\r
+    unsigned char charset, designation;\r
+    Py_ssize_t i, esclen;\r
+\r
+    for (i = 1;i < MAX_ESCSEQLEN;i++) {\r
+        if (i >= *inleft)\r
+            return MBERR_TOOFEW;\r
+        if (IS_ESCEND((*inbuf)[i])) {\r
+            esclen = i + 1;\r
+            break;\r
+        }\r
+        else if (CONFIG_ISSET(USE_JISX0208_EXT) && i+1 < *inleft &&\r
+                 (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@')\r
+            i += 2;\r
+    }\r
+\r
+    if (i >= MAX_ESCSEQLEN)\r
+        return 1; /* unterminated escape sequence */\r
+\r
+    switch (esclen) {\r
+    case 3:\r
+        if (IN2 == '$') {\r
+            charset = IN3 | CHARSET_DBCS;\r
+            designation = 0;\r
+        }\r
+        else {\r
+            charset = IN3;\r
+            if (IN2 == '(') designation = 0;\r
+            else if (IN2 == ')') designation = 1;\r
+            else if (CONFIG_ISSET(USE_G2) && IN2 == '.')\r
+                designation = 2;\r
+            else return 3;\r
+        }\r
+        break;\r
+    case 4:\r
+        if (IN2 != '$')\r
+            return 4;\r
+\r
+        charset = IN4 | CHARSET_DBCS;\r
+        if (IN3 == '(') designation = 0;\r
+        else if (IN3 == ')') designation = 1;\r
+        else return 4;\r
+        break;\r
+    case 6: /* designation with prefix */\r
+        if (CONFIG_ISSET(USE_JISX0208_EXT) &&\r
+            (*inbuf)[3] == ESC && (*inbuf)[4] == '$' &&\r
+            (*inbuf)[5] == 'B') {\r
+            charset = 'B' | CHARSET_DBCS;\r
+            designation = 0;\r
+        }\r
+        else\r
+            return 6;\r
+        break;\r
+    default:\r
+        return esclen;\r
+    }\r
+\r
+    /* raise error when the charset is not designated for this encoding */\r
+    if (charset != CHARSET_ASCII) {\r
+        const struct iso2022_designation *dsg;\r
+\r
+        for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++)\r
+            if (dsg->mark == charset)\r
+                break;\r
+        if (!dsg->mark)\r
+            return esclen;\r
+    }\r
+\r
+    STATE_SETG(designation, charset)\r
+    *inleft -= esclen;\r
+    (*inbuf) += esclen;\r
+    return 0;\r
+}\r
+\r
+#define ISO8859_7_DECODE(c, assi)                                       \\r
+    if ((c) < 0xa0) (assi) = (c);                                       \\r
+    else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0))))          \\r
+        (assi) = (c);                                                   \\r
+    else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 ||              \\r
+             (0xbffffd77L & (1L << ((c)-0xb4)))))                       \\r
+        (assi) = 0x02d0 + (c);                                          \\r
+    else if ((c) == 0xa1) (assi) = 0x2018;                              \\r
+    else if ((c) == 0xa2) (assi) = 0x2019;                              \\r
+    else if ((c) == 0xaf) (assi) = 0x2015;\r
+\r
+static Py_ssize_t\r
+iso2022processg2(const void *config, MultibyteCodec_State *state,\r
+                 const unsigned char **inbuf, Py_ssize_t *inleft,\r
+                 Py_UNICODE **outbuf, Py_ssize_t *outleft)\r
+{\r
+    /* not written to use encoder, decoder functions because only few\r
+     * encodings use G2 designations in CJKCodecs */\r
+    if (STATE_G2 == CHARSET_ISO8859_1) {\r
+        if (IN3 < 0x80)\r
+            OUT1(IN3 + 0x80)\r
+        else\r
+            return 3;\r
+    }\r
+    else if (STATE_G2 == CHARSET_ISO8859_7) {\r
+        ISO8859_7_DECODE(IN3 ^ 0x80, **outbuf)\r
+        else return 3;\r
+    }\r
+    else if (STATE_G2 == CHARSET_ASCII) {\r
+        if (IN3 & 0x80) return 3;\r
+        else **outbuf = IN3;\r
+    }\r
+    else\r
+        return MBERR_INTERNAL;\r
+\r
+    (*inbuf) += 3;\r
+    *inleft -= 3;\r
+    (*outbuf) += 1;\r
+    *outleft -= 1;\r
+    return 0;\r
+}\r
+\r
+DECODER(iso2022)\r
+{\r
+    const struct iso2022_designation *dsgcache = NULL;\r
+\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+        Py_ssize_t err;\r
+\r
+        if (STATE_GETFLAG(F_ESCTHROUGHOUT)) {\r
+            /* ESC throughout mode:\r
+             * for non-iso2022 escape sequences */\r
+            WRITE1(c) /* assume as ISO-8859-1 */\r
+            NEXT(1, 1)\r
+            if (IS_ESCEND(c)) {\r
+                STATE_CLEARFLAG(F_ESCTHROUGHOUT)\r
+            }\r
+            continue;\r
+        }\r
+\r
+        switch (c) {\r
+        case ESC:\r
+            REQUIRE_INBUF(2)\r
+            if (IS_ISO2022ESC(IN2)) {\r
+                err = iso2022processesc(config, state,\r
+                                        inbuf, &inleft);\r
+                if (err != 0)\r
+                    return err;\r
+            }\r
+            else if (CONFIG_ISSET(USE_G2) && IN2 == 'N') {/* SS2 */\r
+                REQUIRE_INBUF(3)\r
+                err = iso2022processg2(config, state,\r
+                    inbuf, &inleft, outbuf, &outleft);\r
+                if (err != 0)\r
+                    return err;\r
+            }\r
+            else {\r
+                WRITE1(ESC)\r
+                STATE_SETFLAG(F_ESCTHROUGHOUT)\r
+                NEXT(1, 1)\r
+            }\r
+            break;\r
+        case SI:\r
+            if (CONFIG_ISSET(NO_SHIFT))\r
+                goto bypass;\r
+            STATE_CLEARFLAG(F_SHIFTED)\r
+            NEXT_IN(1)\r
+            break;\r
+        case SO:\r
+            if (CONFIG_ISSET(NO_SHIFT))\r
+                goto bypass;\r
+            STATE_SETFLAG(F_SHIFTED)\r
+            NEXT_IN(1)\r
+            break;\r
+        case LF:\r
+            STATE_CLEARFLAG(F_SHIFTED)\r
+            WRITE1(LF)\r
+            NEXT(1, 1)\r
+            break;\r
+        default:\r
+            if (c < 0x20) /* C0 */\r
+                goto bypass;\r
+            else if (c >= 0x80)\r
+                return 1;\r
+            else {\r
+                const struct iso2022_designation *dsg;\r
+                unsigned char charset;\r
+                ucs4_t decoded;\r
+\r
+                if (STATE_GETFLAG(F_SHIFTED))\r
+                    charset = STATE_G1;\r
+                else\r
+                    charset = STATE_G0;\r
+\r
+                if (charset == CHARSET_ASCII) {\r
+bypass:                                 WRITE1(c)\r
+                                        NEXT(1, 1)\r
+                                        break;\r
+                                }\r
+\r
+                                if (dsgcache != NULL &&\r
+                                    dsgcache->mark == charset)\r
+                                        dsg = dsgcache;\r
+                                else {\r
+                                        for (dsg = CONFIG_DESIGNATIONS;\r
+                                             dsg->mark != charset\r
+#ifdef Py_DEBUG\r
+                                                && dsg->mark != '\0'\r
+#endif\r
+                                             ;dsg++)\r
+                                                /* noop */;\r
+                                        assert(dsg->mark != '\0');\r
+                                        dsgcache = dsg;\r
+                                }\r
+\r
+                                REQUIRE_INBUF(dsg->width)\r
+                                decoded = dsg->decoder(*inbuf);\r
+                                if (decoded == MAP_UNMAPPABLE)\r
+                                        return dsg->width;\r
+\r
+                                if (decoded < 0x10000) {\r
+                                        WRITE1(decoded)\r
+                                        NEXT_OUT(1)\r
+                                }\r
+                                else if (decoded < 0x30000) {\r
+                                        WRITEUCS4(decoded)\r
+                                }\r
+                                else { /* JIS X 0213 pairs */\r
+                    WRITE2(decoded >> 16, decoded & 0xffff)\r
+                    NEXT_OUT(2)\r
+                }\r
+                NEXT_IN(dsg->width)\r
+            }\r
+            break;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/*-*- mapping table holders -*-*/\r
+\r
+#define ENCMAP(enc) static const encode_map *enc##_encmap = NULL;\r
+#define DECMAP(enc) static const decode_map *enc##_decmap = NULL;\r
+\r
+/* kr */\r
+ENCMAP(cp949)\r
+DECMAP(ksx1001)\r
+\r
+/* jp */\r
+ENCMAP(jisxcommon)\r
+DECMAP(jisx0208)\r
+DECMAP(jisx0212)\r
+ENCMAP(jisx0213_bmp)\r
+DECMAP(jisx0213_1_bmp)\r
+DECMAP(jisx0213_2_bmp)\r
+ENCMAP(jisx0213_emp)\r
+DECMAP(jisx0213_1_emp)\r
+DECMAP(jisx0213_2_emp)\r
+\r
+/* cn */\r
+ENCMAP(gbcommon)\r
+DECMAP(gb2312)\r
+\r
+/* tw */\r
+\r
+/*-*- mapping access functions -*-*/\r
+\r
+static int\r
+ksx1001_init(void)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && (\r
+                    IMPORT_MAP(kr, cp949, &cp949_encmap, NULL) ||\r
+                    IMPORT_MAP(kr, ksx1001, NULL, &ksx1001_decmap)))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+static ucs4_t\r
+ksx1001_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    TRYMAP_DEC(ksx1001, u, data[0], data[1])\r
+        return u;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+ksx1001_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    assert(*length == 1);\r
+    if (*data < 0x10000) {\r
+        TRYMAP_ENC(cp949, coded, *data)\r
+            if (!(coded & 0x8000))\r
+                return coded;\r
+    }\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+static int\r
+jisx0208_init(void)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && (\r
+                    IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) ||\r
+                    IMPORT_MAP(jp, jisx0208, NULL, &jisx0208_decmap)))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+static ucs4_t\r
+jisx0208_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */\r
+        return 0xff3c;\r
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1])\r
+        return u;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+jisx0208_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    assert(*length == 1);\r
+    if (*data < 0x10000) {\r
+        if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */\r
+            return 0x2140;\r
+        else TRYMAP_ENC(jisxcommon, coded, *data) {\r
+            if (!(coded & 0x8000))\r
+                return coded;\r
+        }\r
+    }\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+static int\r
+jisx0212_init(void)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && (\r
+                    IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) ||\r
+                    IMPORT_MAP(jp, jisx0212, NULL, &jisx0212_decmap)))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+static ucs4_t\r
+jisx0212_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    TRYMAP_DEC(jisx0212, u, data[0], data[1])\r
+        return u;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+jisx0212_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    assert(*length == 1);\r
+    if (*data < 0x10000) {\r
+        TRYMAP_ENC(jisxcommon, coded, *data) {\r
+            if (coded & 0x8000)\r
+                return coded & 0x7fff;\r
+        }\r
+    }\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+static int\r
+jisx0213_init(void)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && (\r
+                    jisx0208_init() ||\r
+                    IMPORT_MAP(jp, jisx0213_bmp,\r
+                               &jisx0213_bmp_encmap, NULL) ||\r
+                    IMPORT_MAP(jp, jisx0213_1_bmp,\r
+                               NULL, &jisx0213_1_bmp_decmap) ||\r
+                    IMPORT_MAP(jp, jisx0213_2_bmp,\r
+                               NULL, &jisx0213_2_bmp_decmap) ||\r
+                    IMPORT_MAP(jp, jisx0213_emp,\r
+                               &jisx0213_emp_encmap, NULL) ||\r
+                    IMPORT_MAP(jp, jisx0213_1_emp,\r
+                               NULL, &jisx0213_1_emp_decmap) ||\r
+                    IMPORT_MAP(jp, jisx0213_2_emp,\r
+                               NULL, &jisx0213_2_emp_decmap) ||\r
+                    IMPORT_MAP(jp, jisx0213_pair, &jisx0213_pair_encmap,\r
+                               &jisx0213_pair_decmap)))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+#define config ((void *)2000)\r
+static ucs4_t\r
+jisx0213_2000_1_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])\r
+    else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */\r
+        return 0xff3c;\r
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])\r
+        u |= 0x20000;\r
+    else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+\r
+static ucs4_t\r
+jisx0213_2000_2_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    EMULATE_JISX0213_2000_DECODE_PLANE2(u, data[0], data[1])\r
+    TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])\r
+        u |= 0x20000;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+#undef config\r
+\r
+static ucs4_t\r
+jisx0213_2004_1_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */\r
+        return 0xff3c;\r
+    else TRYMAP_DEC(jisx0208, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1])\r
+        u |= 0x20000;\r
+    else TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]);\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+\r
+static ucs4_t\r
+jisx0213_2004_2_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]);\r
+    else TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1])\r
+        u |= 0x20000;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_encoder(const ucs4_t *data, Py_ssize_t *length, void *config)\r
+{\r
+    DBCHAR coded;\r
+\r
+    switch (*length) {\r
+    case 1: /* first character */\r
+        if (*data >= 0x10000) {\r
+            if ((*data) >> 16 == 0x20000 >> 16) {\r
+                EMULATE_JISX0213_2000_ENCODE_EMP(coded, *data)\r
+                else TRYMAP_ENC(jisx0213_emp, coded,\r
+                                (*data) & 0xffff)\r
+                    return coded;\r
+            }\r
+            return MAP_UNMAPPABLE;\r
+        }\r
+\r
+        EMULATE_JISX0213_2000_ENCODE_BMP(coded, *data)\r
+        else TRYMAP_ENC(jisx0213_bmp, coded, *data) {\r
+            if (coded == MULTIC)\r
+                return MAP_MULTIPLE_AVAIL;\r
+        }\r
+        else TRYMAP_ENC(jisxcommon, coded, *data) {\r
+            if (coded & 0x8000)\r
+                return MAP_UNMAPPABLE;\r
+        }\r
+        else\r
+            return MAP_UNMAPPABLE;\r
+        return coded;\r
+    case 2: /* second character of unicode pair */\r
+        coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1],\r
+                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);\r
+        if (coded == DBCINV) {\r
+            *length = 1;\r
+            coded = find_pairencmap((ucs2_t)data[0], 0,\r
+                      jisx0213_pair_encmap, JISX0213_ENCPAIRS);\r
+            if (coded == DBCINV)\r
+                return MAP_UNMAPPABLE;\r
+        }\r
+        else\r
+            return coded;\r
+    case -1: /* flush unterminated */\r
+        *length = 1;\r
+        coded = find_pairencmap((ucs2_t)data[0], 0,\r
+                        jisx0213_pair_encmap, JISX0213_ENCPAIRS);\r
+        if (coded == DBCINV)\r
+            return MAP_UNMAPPABLE;\r
+        else\r
+            return coded;\r
+    default:\r
+        return MAP_UNMAPPABLE;\r
+    }\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2000_1_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);\r
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)\r
+        return coded;\r
+    else if (coded & 0x8000)\r
+        return MAP_UNMAPPABLE;\r
+    else\r
+        return coded;\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2000_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    Py_ssize_t ilength = *length;\r
+\r
+    coded = jisx0213_encoder(data, length, (void *)2000);\r
+    switch (ilength) {\r
+    case 1:\r
+        if (coded == MAP_MULTIPLE_AVAIL)\r
+            return MAP_MULTIPLE_AVAIL;\r
+        else\r
+            return MAP_UNMAPPABLE;\r
+    case 2:\r
+        if (*length != 2)\r
+            return MAP_UNMAPPABLE;\r
+        else\r
+            return coded;\r
+    default:\r
+        return MAP_UNMAPPABLE;\r
+    }\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2000_2_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);\r
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)\r
+        return coded;\r
+    else if (coded & 0x8000)\r
+        return coded & 0x7fff;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2004_1_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded = jisx0213_encoder(data, length, NULL);\r
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)\r
+        return coded;\r
+    else if (coded & 0x8000)\r
+        return MAP_UNMAPPABLE;\r
+    else\r
+        return coded;\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2004_1_encoder_paironly(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    Py_ssize_t ilength = *length;\r
+\r
+    coded = jisx0213_encoder(data, length, NULL);\r
+    switch (ilength) {\r
+    case 1:\r
+        if (coded == MAP_MULTIPLE_AVAIL)\r
+            return MAP_MULTIPLE_AVAIL;\r
+        else\r
+            return MAP_UNMAPPABLE;\r
+    case 2:\r
+        if (*length != 2)\r
+            return MAP_UNMAPPABLE;\r
+        else\r
+            return coded;\r
+    default:\r
+        return MAP_UNMAPPABLE;\r
+    }\r
+}\r
+\r
+static DBCHAR\r
+jisx0213_2004_2_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded = jisx0213_encoder(data, length, NULL);\r
+    if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)\r
+        return coded;\r
+    else if (coded & 0x8000)\r
+        return coded & 0x7fff;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static ucs4_t\r
+jisx0201_r_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    JISX0201_R_DECODE(*data, u)\r
+    else return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+\r
+static DBCHAR\r
+jisx0201_r_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    JISX0201_R_ENCODE(*data, coded)\r
+    else return MAP_UNMAPPABLE;\r
+    return coded;\r
+}\r
+\r
+static ucs4_t\r
+jisx0201_k_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    JISX0201_K_DECODE(*data ^ 0x80, u)\r
+    else return MAP_UNMAPPABLE;\r
+    return u;\r
+}\r
+\r
+static DBCHAR\r
+jisx0201_k_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    JISX0201_K_ENCODE(*data, coded)\r
+    else return MAP_UNMAPPABLE;\r
+    return coded - 0x80;\r
+}\r
+\r
+static int\r
+gb2312_init(void)\r
+{\r
+    static int initialized = 0;\r
+\r
+    if (!initialized && (\r
+                    IMPORT_MAP(cn, gbcommon, &gbcommon_encmap, NULL) ||\r
+                    IMPORT_MAP(cn, gb2312, NULL, &gb2312_decmap)))\r
+        return -1;\r
+    initialized = 1;\r
+    return 0;\r
+}\r
+\r
+static ucs4_t\r
+gb2312_decoder(const unsigned char *data)\r
+{\r
+    ucs4_t u;\r
+    TRYMAP_DEC(gb2312, u, data[0], data[1])\r
+        return u;\r
+    else\r
+        return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+gb2312_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    DBCHAR coded;\r
+    assert(*length == 1);\r
+    if (*data < 0x10000) {\r
+        TRYMAP_ENC(gbcommon, coded, *data) {\r
+            if (!(coded & 0x8000))\r
+                return coded;\r
+        }\r
+    }\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+\r
+static ucs4_t\r
+dummy_decoder(const unsigned char *data)\r
+{\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+static DBCHAR\r
+dummy_encoder(const ucs4_t *data, Py_ssize_t *length)\r
+{\r
+    return MAP_UNMAPPABLE;\r
+}\r
+\r
+/*-*- registry tables -*-*/\r
+\r
+#define REGISTRY_KSX1001_G0     { CHARSET_KSX1001, 0, 2,                \\r
+                  ksx1001_init,                                         \\r
+                  ksx1001_decoder, ksx1001_encoder }\r
+#define REGISTRY_KSX1001_G1     { CHARSET_KSX1001, 1, 2,                \\r
+                  ksx1001_init,                                         \\r
+                  ksx1001_decoder, ksx1001_encoder }\r
+#define REGISTRY_JISX0201_R     { CHARSET_JISX0201_R, 0, 1,             \\r
+                  NULL,                                                 \\r
+                  jisx0201_r_decoder, jisx0201_r_encoder }\r
+#define REGISTRY_JISX0201_K     { CHARSET_JISX0201_K, 0, 1,             \\r
+                  NULL,                                                 \\r
+                  jisx0201_k_decoder, jisx0201_k_encoder }\r
+#define REGISTRY_JISX0208       { CHARSET_JISX0208, 0, 2,               \\r
+                  jisx0208_init,                                        \\r
+                  jisx0208_decoder, jisx0208_encoder }\r
+#define REGISTRY_JISX0208_O     { CHARSET_JISX0208_O, 0, 2,             \\r
+                  jisx0208_init,                                        \\r
+                  jisx0208_decoder, jisx0208_encoder }\r
+#define REGISTRY_JISX0212       { CHARSET_JISX0212, 0, 2,               \\r
+                  jisx0212_init,                                        \\r
+                  jisx0212_decoder, jisx0212_encoder }\r
+#define REGISTRY_JISX0213_2000_1 { CHARSET_JISX0213_2000_1, 0, 2,       \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2000_1_decoder,                              \\r
+                  jisx0213_2000_1_encoder }\r
+#define REGISTRY_JISX0213_2000_1_PAIRONLY { CHARSET_JISX0213_2000_1, 0, 2, \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2000_1_decoder,                              \\r
+                  jisx0213_2000_1_encoder_paironly }\r
+#define REGISTRY_JISX0213_2000_2 { CHARSET_JISX0213_2, 0, 2,            \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2000_2_decoder,                              \\r
+                  jisx0213_2000_2_encoder }\r
+#define REGISTRY_JISX0213_2004_1 { CHARSET_JISX0213_2004_1, 0, 2,       \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2004_1_decoder,                              \\r
+                  jisx0213_2004_1_encoder }\r
+#define REGISTRY_JISX0213_2004_1_PAIRONLY { CHARSET_JISX0213_2004_1, 0, 2, \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2004_1_decoder,                              \\r
+                  jisx0213_2004_1_encoder_paironly }\r
+#define REGISTRY_JISX0213_2004_2 { CHARSET_JISX0213_2, 0, 2,            \\r
+                  jisx0213_init,                                        \\r
+                  jisx0213_2004_2_decoder,                              \\r
+                  jisx0213_2004_2_encoder }\r
+#define REGISTRY_GB2312         { CHARSET_GB2312, 0, 2,                 \\r
+                  gb2312_init,                                          \\r
+                  gb2312_decoder, gb2312_encoder }\r
+#define REGISTRY_CNS11643_1     { CHARSET_CNS11643_1, 1, 2,             \\r
+                  cns11643_init,                                        \\r
+                  cns11643_1_decoder, cns11643_1_encoder }\r
+#define REGISTRY_CNS11643_2     { CHARSET_CNS11643_2, 2, 2,             \\r
+                  cns11643_init,                                        \\r
+                  cns11643_2_decoder, cns11643_2_encoder }\r
+#define REGISTRY_ISO8859_1      { CHARSET_ISO8859_1, 2, 1,              \\r
+                  NULL, dummy_decoder, dummy_encoder }\r
+#define REGISTRY_ISO8859_7      { CHARSET_ISO8859_7, 2, 1,              \\r
+                  NULL, dummy_decoder, dummy_encoder }\r
+#define REGISTRY_SENTINEL       { 0, }\r
+#define CONFIGDEF(var, attrs)                                           \\r
+    static const struct iso2022_config iso2022_##var##_config = {       \\r
+        attrs, iso2022_##var##_designations                             \\r
+    };\r
+\r
+static const struct iso2022_designation iso2022_kr_designations[] = {\r
+    REGISTRY_KSX1001_G1, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(kr, 0)\r
+\r
+static const struct iso2022_designation iso2022_jp_designations[] = {\r
+    REGISTRY_JISX0208, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,\r
+    REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp, NO_SHIFT | USE_JISX0208_EXT)\r
+\r
+static const struct iso2022_designation iso2022_jp_1_designations[] = {\r
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,\r
+    REGISTRY_JISX0208_O, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp_1, NO_SHIFT | USE_JISX0208_EXT)\r
+\r
+static const struct iso2022_designation iso2022_jp_2_designations[] = {\r
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_KSX1001_G0,\r
+    REGISTRY_GB2312, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,\r
+    REGISTRY_ISO8859_1, REGISTRY_ISO8859_7, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp_2, NO_SHIFT | USE_G2 | USE_JISX0208_EXT)\r
+\r
+static const struct iso2022_designation iso2022_jp_2004_designations[] = {\r
+    REGISTRY_JISX0213_2004_1_PAIRONLY, REGISTRY_JISX0208,\r
+    REGISTRY_JISX0213_2004_1, REGISTRY_JISX0213_2004_2, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp_2004, NO_SHIFT | USE_JISX0208_EXT)\r
+\r
+static const struct iso2022_designation iso2022_jp_3_designations[] = {\r
+    REGISTRY_JISX0213_2000_1_PAIRONLY, REGISTRY_JISX0208,\r
+    REGISTRY_JISX0213_2000_1, REGISTRY_JISX0213_2000_2, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp_3, NO_SHIFT | USE_JISX0208_EXT)\r
+\r
+static const struct iso2022_designation iso2022_jp_ext_designations[] = {\r
+    REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,\r
+    REGISTRY_JISX0201_K, REGISTRY_JISX0208_O, REGISTRY_SENTINEL\r
+};\r
+CONFIGDEF(jp_ext, NO_SHIFT | USE_JISX0208_EXT)\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  /* no mapping table here */\r
+END_MAPPINGS_LIST\r
+\r
+#define ISO2022_CODEC(variation) {              \\r
+    "iso2022_" #variation,                      \\r
+    &iso2022_##variation##_config,              \\r
+    iso2022_codec_init,                         \\r
+    _STATEFUL_METHODS(iso2022)                  \\r
+},\r
+\r
+BEGIN_CODECS_LIST\r
+  ISO2022_CODEC(kr)\r
+  ISO2022_CODEC(jp)\r
+  ISO2022_CODEC(jp_1)\r
+  ISO2022_CODEC(jp_2)\r
+  ISO2022_CODEC(jp_2004)\r
+  ISO2022_CODEC(jp_3)\r
+  ISO2022_CODEC(jp_ext)\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(iso2022)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_jp.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_jp.c
new file mode 100644 (file)
index 0000000..d326618
--- /dev/null
@@ -0,0 +1,731 @@
+/*\r
+ * _codecs_jp.c: Codecs collection for Japanese encodings\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#define USING_BINARY_PAIR_SEARCH\r
+#define EMPBASE 0x20000\r
+\r
+#include "cjkcodecs.h"\r
+#include "mappings_jp.h"\r
+#include "mappings_jisx0213_pair.h"\r
+#include "alg_jisx0201.h"\r
+#include "emu_jisx0213_2000.h"\r
+\r
+/*\r
+ * CP932 codec\r
+ */\r
+\r
+ENCODER(cp932)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+        unsigned char c1, c2;\r
+\r
+        if (c <= 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        else if (c >= 0xff61 && c <= 0xff9f) {\r
+            WRITE1(c - 0xfec0)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        else if (c >= 0xf8f0 && c <= 0xf8f3) {\r
+            /* Windows compatibility */\r
+            REQUIRE_OUTBUF(1)\r
+            if (c == 0xf8f0)\r
+                OUT1(0xa0)\r
+            else\r
+                OUT1(c - 0xfef1 + 0xfd)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        UCS4INVALID(c)\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        TRYMAP_ENC(cp932ext, code, c) {\r
+            OUT1(code >> 8)\r
+            OUT2(code & 0xff)\r
+        }\r
+        else TRYMAP_ENC(jisxcommon, code, c) {\r
+            if (code & 0x8000) /* MSB set: JIS X 0212 */\r
+                return 1;\r
+\r
+            /* JIS X 0208 */\r
+            c1 = code >> 8;\r
+            c2 = code & 0xff;\r
+            c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);\r
+            c1 = (c1 - 0x21) >> 1;\r
+            OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)\r
+            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)\r
+        }\r
+        else if (c >= 0xe000 && c < 0xe758) {\r
+            /* User-defined area */\r
+            c1 = (Py_UNICODE)(c - 0xe000) / 188;\r
+            c2 = (Py_UNICODE)(c - 0xe000) % 188;\r
+            OUT1(c1 + 0xf0)\r
+            OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)\r
+        }\r
+        else\r
+            return 1;\r
+\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(cp932)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1, c2;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+        if (c <= 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        else if (c >= 0xa0 && c <= 0xdf) {\r
+            if (c == 0xa0)\r
+                OUT1(0xf8f0) /* half-width katakana */\r
+            else\r
+                OUT1(0xfec0 + c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        else if (c >= 0xfd/* && c <= 0xff*/) {\r
+            /* Windows compatibility */\r
+            OUT1(0xf8f1 - 0xfd + c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+        c2 = IN2;\r
+\r
+        TRYMAP_DEC(cp932ext, **outbuf, c, c2);\r
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){\r
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)\r
+                return 2;\r
+\r
+            c = (c < 0xe0 ? c - 0x81 : c - 0xc1);\r
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);\r
+            c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);\r
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;\r
+\r
+            TRYMAP_DEC(jisx0208, **outbuf, c, c2);\r
+            else return 2;\r
+        }\r
+        else if (c >= 0xf0 && c <= 0xf9) {\r
+            if ((c2 >= 0x40 && c2 <= 0x7e) ||\r
+                (c2 >= 0x80 && c2 <= 0xfc))\r
+                OUT1(0xe000 + 188 * (c - 0xf0) +\r
+                     (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))\r
+            else\r
+                return 2;\r
+        }\r
+        else\r
+            return 2;\r
+\r
+        NEXT(2, 1)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * EUC-JIS-2004 codec\r
+ */\r
+\r
+ENCODER(euc_jis_2004)\r
+{\r
+    while (inleft > 0) {\r
+        ucs4_t c = IN1;\r
+        DBCHAR code;\r
+        Py_ssize_t insize;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        DECODE_SURROGATE(c)\r
+        insize = GET_INSIZE(c);\r
+\r
+        if (c <= 0xFFFF) {\r
+            EMULATE_JISX0213_2000_ENCODE_BMP(code, c)\r
+            else TRYMAP_ENC(jisx0213_bmp, code, c) {\r
+                if (code == MULTIC) {\r
+                    if (inleft < 2) {\r
+                        if (flags & MBENC_FLUSH) {\r
+                            code = find_pairencmap(\r
+                                (ucs2_t)c, 0,\r
+                              jisx0213_pair_encmap,\r
+                                JISX0213_ENCPAIRS);\r
+                            if (code == DBCINV)\r
+                                return 1;\r
+                        }\r
+                        else\r
+                            return MBERR_TOOFEW;\r
+                    }\r
+                    else {\r
+                        code = find_pairencmap(\r
+                            (ucs2_t)c, (*inbuf)[1],\r
+                            jisx0213_pair_encmap,\r
+                            JISX0213_ENCPAIRS);\r
+                        if (code == DBCINV) {\r
+                            code = find_pairencmap(\r
+                                (ucs2_t)c, 0,\r
+                              jisx0213_pair_encmap,\r
+                                JISX0213_ENCPAIRS);\r
+                            if (code == DBCINV)\r
+                                return 1;\r
+                        } else\r
+                            insize = 2;\r
+                    }\r
+                }\r
+            }\r
+            else TRYMAP_ENC(jisxcommon, code, c);\r
+            else if (c >= 0xff61 && c <= 0xff9f) {\r
+                /* JIS X 0201 half-width katakana */\r
+                WRITE2(0x8e, c - 0xfec0)\r
+                NEXT(1, 2)\r
+                continue;\r
+            }\r
+            else if (c == 0xff3c)\r
+                /* F/W REVERSE SOLIDUS (see NOTES) */\r
+                code = 0x2140;\r
+            else if (c == 0xff5e)\r
+                /* F/W TILDE (see NOTES) */\r
+                code = 0x2232;\r
+            else\r
+                return 1;\r
+        }\r
+        else if (c >> 16 == EMPBASE >> 16) {\r
+            EMULATE_JISX0213_2000_ENCODE_EMP(code, c)\r
+            else TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);\r
+            else return insize;\r
+        }\r
+        else\r
+            return insize;\r
+\r
+        if (code & 0x8000) {\r
+            /* Codeset 2 */\r
+            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)\r
+            NEXT(insize, 3)\r
+        } else {\r
+            /* Codeset 1 */\r
+            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)\r
+            NEXT(insize, 2)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(euc_jis_2004)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+        ucs4_t code;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        if (c == 0x8e) {\r
+            /* JIS X 0201 half-width katakana */\r
+            unsigned char c2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c2 = IN2;\r
+            if (c2 >= 0xa1 && c2 <= 0xdf) {\r
+                OUT1(0xfec0 + c2)\r
+                NEXT(2, 1)\r
+            }\r
+            else\r
+                return 2;\r
+        }\r
+        else if (c == 0x8f) {\r
+            unsigned char c2, c3;\r
+\r
+            REQUIRE_INBUF(3)\r
+            c2 = IN2 ^ 0x80;\r
+            c3 = IN3 ^ 0x80;\r
+\r
+            /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */\r
+            EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf, c2, c3)\r
+            else TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c2, c3) ;\r
+            else TRYMAP_DEC(jisx0213_2_emp, code, c2, c3) {\r
+                WRITEUCS4(EMPBASE | code)\r
+                NEXT_IN(3)\r
+                continue;\r
+            }\r
+            else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;\r
+            else return 3;\r
+            NEXT(3, 1)\r
+        }\r
+        else {\r
+            unsigned char c2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c ^= 0x80;\r
+            c2 = IN2 ^ 0x80;\r
+\r
+            /* JIS X 0213 Plane 1 */\r
+            EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf, c, c2)\r
+            else if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;\r
+            else if (c == 0x22 && c2 == 0x32) **outbuf = 0xff5e;\r
+            else TRYMAP_DEC(jisx0208, **outbuf, c, c2);\r
+            else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);\r
+            else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {\r
+                WRITEUCS4(EMPBASE | code)\r
+                NEXT_IN(2)\r
+                continue;\r
+            }\r
+            else TRYMAP_DEC(jisx0213_pair, code, c, c2) {\r
+                WRITE2(code >> 16, code & 0xffff)\r
+                NEXT(2, 2)\r
+                continue;\r
+            }\r
+            else return 2;\r
+            NEXT(2, 1)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * EUC-JP codec\r
+ */\r
+\r
+ENCODER(euc_jp)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        UCS4INVALID(c)\r
+\r
+        TRYMAP_ENC(jisxcommon, code, c);\r
+        else if (c >= 0xff61 && c <= 0xff9f) {\r
+            /* JIS X 0201 half-width katakana */\r
+            WRITE2(0x8e, c - 0xfec0)\r
+            NEXT(1, 2)\r
+            continue;\r
+        }\r
+#ifndef STRICT_BUILD\r
+        else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */\r
+            code = 0x2140;\r
+        else if (c == 0xa5) { /* YEN SIGN */\r
+            WRITE1(0x5c);\r
+            NEXT(1, 1)\r
+            continue;\r
+        } else if (c == 0x203e) { /* OVERLINE */\r
+            WRITE1(0x7e);\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+#endif\r
+        else\r
+            return 1;\r
+\r
+        if (code & 0x8000) {\r
+            /* JIS X 0212 */\r
+            WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)\r
+            NEXT(1, 3)\r
+        } else {\r
+            /* JIS X 0208 */\r
+            WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)\r
+            NEXT(1, 2)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(euc_jp)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        if (c == 0x8e) {\r
+            /* JIS X 0201 half-width katakana */\r
+            unsigned char c2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c2 = IN2;\r
+            if (c2 >= 0xa1 && c2 <= 0xdf) {\r
+                OUT1(0xfec0 + c2)\r
+                NEXT(2, 1)\r
+            }\r
+            else\r
+                return 2;\r
+        }\r
+        else if (c == 0x8f) {\r
+            unsigned char c2, c3;\r
+\r
+            REQUIRE_INBUF(3)\r
+            c2 = IN2;\r
+            c3 = IN3;\r
+            /* JIS X 0212 */\r
+            TRYMAP_DEC(jisx0212, **outbuf, c2 ^ 0x80, c3 ^ 0x80) {\r
+                NEXT(3, 1)\r
+            }\r
+            else\r
+                return 3;\r
+        }\r
+        else {\r
+            unsigned char c2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c2 = IN2;\r
+            /* JIS X 0208 */\r
+#ifndef STRICT_BUILD\r
+            if (c == 0xa1 && c2 == 0xc0)\r
+                /* FULL-WIDTH REVERSE SOLIDUS */\r
+                **outbuf = 0xff3c;\r
+            else\r
+#endif\r
+                TRYMAP_DEC(jisx0208, **outbuf,\r
+                           c ^ 0x80, c2 ^ 0x80) ;\r
+            else return 2;\r
+            NEXT(2, 1)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * SHIFT_JIS codec\r
+ */\r
+\r
+ENCODER(shift_jis)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+        unsigned char c1, c2;\r
+\r
+#ifdef STRICT_BUILD\r
+        JISX0201_R_ENCODE(c, code)\r
+#else\r
+        if (c < 0x80) code = c;\r
+        else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */\r
+        else if (c == 0x203e) code = 0x7e; /* OVERLINE */\r
+#endif\r
+        else JISX0201_K_ENCODE(c, code)\r
+        else UCS4INVALID(c)\r
+        else code = NOCHAR;\r
+\r
+        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {\r
+            REQUIRE_OUTBUF(1)\r
+\r
+            OUT1((unsigned char)code)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        if (code == NOCHAR) {\r
+            TRYMAP_ENC(jisxcommon, code, c);\r
+#ifndef STRICT_BUILD\r
+            else if (c == 0xff3c)\r
+                code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */\r
+#endif\r
+            else\r
+                return 1;\r
+\r
+            if (code & 0x8000) /* MSB set: JIS X 0212 */\r
+                return 1;\r
+        }\r
+\r
+        c1 = code >> 8;\r
+        c2 = code & 0xff;\r
+        c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);\r
+        c1 = (c1 - 0x21) >> 1;\r
+        OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)\r
+        OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(shift_jis)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+#ifdef STRICT_BUILD\r
+        JISX0201_R_DECODE(c, **outbuf)\r
+#else\r
+        if (c < 0x80) **outbuf = c;\r
+#endif\r
+        else JISX0201_K_DECODE(c, **outbuf)\r
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){\r
+            unsigned char c1, c2;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c2 = IN2;\r
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)\r
+                return 2;\r
+\r
+            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);\r
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);\r
+            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);\r
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;\r
+\r
+#ifndef STRICT_BUILD\r
+            if (c1 == 0x21 && c2 == 0x40) {\r
+                /* FULL-WIDTH REVERSE SOLIDUS */\r
+                OUT1(0xff3c)\r
+                NEXT(2, 1)\r
+                continue;\r
+            }\r
+#endif\r
+            TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {\r
+                NEXT(2, 1)\r
+                continue;\r
+            }\r
+            else\r
+                return 2;\r
+        }\r
+        else\r
+            return 2;\r
+\r
+        NEXT(1, 1) /* JIS X 0201 */\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * SHIFT_JIS-2004 codec\r
+ */\r
+\r
+ENCODER(shift_jis_2004)\r
+{\r
+    while (inleft > 0) {\r
+        ucs4_t c = IN1;\r
+        DBCHAR code = NOCHAR;\r
+        int c1, c2;\r
+        Py_ssize_t insize;\r
+\r
+        JISX0201_ENCODE(c, code)\r
+        else DECODE_SURROGATE(c)\r
+\r
+        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {\r
+            WRITE1((unsigned char)code)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_OUTBUF(2)\r
+        insize = GET_INSIZE(c);\r
+\r
+        if (code == NOCHAR) {\r
+            if (c <= 0xffff) {\r
+                EMULATE_JISX0213_2000_ENCODE_BMP(code, c)\r
+                else TRYMAP_ENC(jisx0213_bmp, code, c) {\r
+                    if (code == MULTIC) {\r
+                        if (inleft < 2) {\r
+                            if (flags & MBENC_FLUSH) {\r
+                            code = find_pairencmap\r
+                                ((ucs2_t)c, 0,\r
+                              jisx0213_pair_encmap,\r
+                                JISX0213_ENCPAIRS);\r
+                            if (code == DBCINV)\r
+                                return 1;\r
+                            }\r
+                            else\r
+                                return MBERR_TOOFEW;\r
+                        }\r
+                        else {\r
+                            code = find_pairencmap(\r
+                                (ucs2_t)c, IN2,\r
+                              jisx0213_pair_encmap,\r
+                                JISX0213_ENCPAIRS);\r
+                            if (code == DBCINV) {\r
+                            code = find_pairencmap(\r
+                                (ucs2_t)c, 0,\r
+                              jisx0213_pair_encmap,\r
+                                JISX0213_ENCPAIRS);\r
+                            if (code == DBCINV)\r
+                                return 1;\r
+                            }\r
+                            else\r
+                                insize = 2;\r
+                        }\r
+                    }\r
+                }\r
+                else TRYMAP_ENC(jisxcommon, code, c) {\r
+                    /* abandon JIS X 0212 codes */\r
+                    if (code & 0x8000)\r
+                        return 1;\r
+                }\r
+                else return 1;\r
+            }\r
+            else if (c >> 16 == EMPBASE >> 16) {\r
+                EMULATE_JISX0213_2000_ENCODE_EMP(code, c)\r
+                else TRYMAP_ENC(jisx0213_emp, code, c&0xffff);\r
+                else return insize;\r
+            }\r
+            else\r
+                return insize;\r
+        }\r
+\r
+        c1 = code >> 8;\r
+        c2 = (code & 0xff) - 0x21;\r
+\r
+        if (c1 & 0x80) { /* Plane 2 */\r
+            if (c1 >= 0xee) c1 -= 0x87;\r
+            else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;\r
+            else c1 -= 0x43;\r
+        }\r
+        else /* Plane 1 */\r
+            c1 -= 0x21;\r
+\r
+        if (c1 & 1) c2 += 0x5e;\r
+        c1 >>= 1;\r
+        OUT1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))\r
+        OUT2(c2 + (c2 < 0x3f ? 0x40 : 0x41))\r
+\r
+        NEXT(insize, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(shift_jis_2004)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+        JISX0201_DECODE(c, **outbuf)\r
+        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){\r
+            unsigned char c1, c2;\r
+            ucs4_t code;\r
+\r
+            REQUIRE_INBUF(2)\r
+            c2 = IN2;\r
+            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)\r
+                return 2;\r
+\r
+            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);\r
+            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);\r
+            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));\r
+            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;\r
+\r
+            if (c1 < 0x5e) { /* Plane 1 */\r
+                c1 += 0x21;\r
+                EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf,\r
+                                c1, c2)\r
+                else TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {\r
+                    NEXT_OUT(1)\r
+                }\r
+                else TRYMAP_DEC(jisx0213_1_bmp, **outbuf,\r
+                                c1, c2) {\r
+                    NEXT_OUT(1)\r
+                }\r
+                else TRYMAP_DEC(jisx0213_1_emp, code, c1, c2) {\r
+                    WRITEUCS4(EMPBASE | code)\r
+                }\r
+                else TRYMAP_DEC(jisx0213_pair, code, c1, c2) {\r
+                    WRITE2(code >> 16, code & 0xffff)\r
+                    NEXT_OUT(2)\r
+                }\r
+                else\r
+                    return 2;\r
+                NEXT_IN(2)\r
+            }\r
+            else { /* Plane 2 */\r
+                if (c1 >= 0x67) c1 += 0x07;\r
+                else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;\r
+                else c1 -= 0x3d;\r
+\r
+                EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf,\r
+                                c1, c2)\r
+                else TRYMAP_DEC(jisx0213_2_bmp, **outbuf,\r
+                                c1, c2) ;\r
+                else TRYMAP_DEC(jisx0213_2_emp, code, c1, c2) {\r
+                    WRITEUCS4(EMPBASE | code)\r
+                    NEXT_IN(2)\r
+                    continue;\r
+                }\r
+                else\r
+                    return 2;\r
+                NEXT(2, 1)\r
+            }\r
+            continue;\r
+        }\r
+        else\r
+            return 2;\r
+\r
+        NEXT(1, 1) /* JIS X 0201 */\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  MAPPING_DECONLY(jisx0208)\r
+  MAPPING_DECONLY(jisx0212)\r
+  MAPPING_ENCONLY(jisxcommon)\r
+  MAPPING_DECONLY(jisx0213_1_bmp)\r
+  MAPPING_DECONLY(jisx0213_2_bmp)\r
+  MAPPING_ENCONLY(jisx0213_bmp)\r
+  MAPPING_DECONLY(jisx0213_1_emp)\r
+  MAPPING_DECONLY(jisx0213_2_emp)\r
+  MAPPING_ENCONLY(jisx0213_emp)\r
+  MAPPING_ENCDEC(jisx0213_pair)\r
+  MAPPING_ENCDEC(cp932ext)\r
+END_MAPPINGS_LIST\r
+\r
+BEGIN_CODECS_LIST\r
+  CODEC_STATELESS(shift_jis)\r
+  CODEC_STATELESS(cp932)\r
+  CODEC_STATELESS(euc_jp)\r
+  CODEC_STATELESS(shift_jis_2004)\r
+  CODEC_STATELESS(euc_jis_2004)\r
+  { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },\r
+  { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(jp)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_kr.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_kr.c
new file mode 100644 (file)
index 0000000..6c5f224
--- /dev/null
@@ -0,0 +1,452 @@
+/*\r
+ * _codecs_kr.c: Codecs collection for Korean encodings\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#include "cjkcodecs.h"\r
+#include "mappings_kr.h"\r
+\r
+/*\r
+ * EUC-KR codec\r
+ */\r
+\r
+#define EUCKR_JAMO_FIRSTBYTE    0xA4\r
+#define EUCKR_JAMO_FILLER       0xD4\r
+\r
+static const unsigned char u2cgk_choseong[19] = {\r
+    0xa1, 0xa2, 0xa4, 0xa7, 0xa8, 0xa9, 0xb1, 0xb2,\r
+    0xb3, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb,\r
+    0xbc, 0xbd, 0xbe\r
+};\r
+static const unsigned char u2cgk_jungseong[21] = {\r
+    0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,\r
+    0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce,\r
+    0xcf, 0xd0, 0xd1, 0xd2, 0xd3\r
+};\r
+static const unsigned char u2cgk_jongseong[28] = {\r
+    0xd4, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7,\r
+    0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0,\r
+    0xb1, 0xb2, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xba,\r
+    0xbb, 0xbc, 0xbd, 0xbe\r
+};\r
+\r
+ENCODER(euc_kr)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+        TRYMAP_ENC(cp949, code, c);\r
+        else return 1;\r
+\r
+        if ((code & 0x8000) == 0) {\r
+            /* KS X 1001 coded character */\r
+            OUT1((code >> 8) | 0x80)\r
+            OUT2((code & 0xFF) | 0x80)\r
+            NEXT(1, 2)\r
+        }\r
+        else {          /* Mapping is found in CP949 extension,\r
+                 * but we encode it in KS X 1001:1998 Annex 3,\r
+                 * make-up sequence for EUC-KR. */\r
+\r
+            REQUIRE_OUTBUF(8)\r
+\r
+            /* syllable composition precedence */\r
+            OUT1(EUCKR_JAMO_FIRSTBYTE)\r
+            OUT2(EUCKR_JAMO_FILLER)\r
+\r
+            /* All code points in CP949 extension are in unicode\r
+             * Hangul Syllable area. */\r
+            assert(0xac00 <= c && c <= 0xd7a3);\r
+            c -= 0xac00;\r
+\r
+            OUT3(EUCKR_JAMO_FIRSTBYTE)\r
+            OUT4(u2cgk_choseong[c / 588])\r
+            NEXT_OUT(4)\r
+\r
+            OUT1(EUCKR_JAMO_FIRSTBYTE)\r
+            OUT2(u2cgk_jungseong[(c / 28) % 21])\r
+            OUT3(EUCKR_JAMO_FIRSTBYTE)\r
+            OUT4(u2cgk_jongseong[c % 28])\r
+            NEXT(1, 4)\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+#define NONE    127\r
+\r
+static const unsigned char cgk2u_choseong[] = { /* [A1, BE] */\r
+       0,    1, NONE,    2, NONE, NONE,    3,    4,\r
+       5, NONE, NONE, NONE, NONE, NONE, NONE, NONE,\r
+       6,    7,    8, NONE,    9,   10,   11,   12,\r
+      13,   14,   15,   16,   17,   18\r
+};\r
+static const unsigned char cgk2u_jongseong[] = { /* [A1, BE] */\r
+       1,    2,    3,    4,    5,    6,    7, NONE,\r
+       8,    9,   10,   11,   12,   13,   14,   15,\r
+      16,   17, NONE,   18,   19,   20,   21,   22,\r
+    NONE,   23,   24,   25,   26,   27\r
+};\r
+\r
+DECODER(euc_kr)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+\r
+        if (c == EUCKR_JAMO_FIRSTBYTE &&\r
+            IN2 == EUCKR_JAMO_FILLER) {\r
+            /* KS X 1001:1998 Annex 3 make-up sequence */\r
+            DBCHAR cho, jung, jong;\r
+\r
+            REQUIRE_INBUF(8)\r
+            if ((*inbuf)[2] != EUCKR_JAMO_FIRSTBYTE ||\r
+                (*inbuf)[4] != EUCKR_JAMO_FIRSTBYTE ||\r
+                (*inbuf)[6] != EUCKR_JAMO_FIRSTBYTE)\r
+                return 8;\r
+\r
+            c = (*inbuf)[3];\r
+            if (0xa1 <= c && c <= 0xbe)\r
+                cho = cgk2u_choseong[c - 0xa1];\r
+            else\r
+                cho = NONE;\r
+\r
+            c = (*inbuf)[5];\r
+            jung = (0xbf <= c && c <= 0xd3) ? c - 0xbf : NONE;\r
+\r
+            c = (*inbuf)[7];\r
+            if (c == EUCKR_JAMO_FILLER)\r
+                jong = 0;\r
+            else if (0xa1 <= c && c <= 0xbe)\r
+                jong = cgk2u_jongseong[c - 0xa1];\r
+            else\r
+                jong = NONE;\r
+\r
+            if (cho == NONE || jung == NONE || jong == NONE)\r
+                return 8;\r
+\r
+            OUT1(0xac00 + cho*588 + jung*28 + jong);\r
+            NEXT(8, 1)\r
+        }\r
+        else TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80) {\r
+            NEXT(2, 1)\r
+        }\r
+        else\r
+            return 2;\r
+    }\r
+\r
+    return 0;\r
+}\r
+#undef NONE\r
+\r
+\r
+/*\r
+ * CP949 codec\r
+ */\r
+\r
+ENCODER(cp949)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+        TRYMAP_ENC(cp949, code, c);\r
+        else return 1;\r
+\r
+        OUT1((code >> 8) | 0x80)\r
+        if (code & 0x8000)\r
+            OUT2(code & 0xFF) /* MSB set: CP949 */\r
+        else\r
+            OUT2((code & 0xFF) | 0x80) /* MSB unset: ks x 1001 */\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(cp949)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+        TRYMAP_DEC(ksx1001, **outbuf, c ^ 0x80, IN2 ^ 0x80);\r
+        else TRYMAP_DEC(cp949ext, **outbuf, c, IN2);\r
+        else return 2;\r
+\r
+        NEXT(2, 1)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * JOHAB codec\r
+ */\r
+\r
+static const unsigned char u2johabidx_choseong[32] = {\r
+                0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\r
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\r
+    0x10, 0x11, 0x12, 0x13, 0x14,\r
+};\r
+static const unsigned char u2johabidx_jungseong[32] = {\r
+                      0x03, 0x04, 0x05, 0x06, 0x07,\r
+                0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\r
+                0x12, 0x13, 0x14, 0x15, 0x16, 0x17,\r
+                0x1a, 0x1b, 0x1c, 0x1d,\r
+};\r
+static const unsigned char u2johabidx_jongseong[32] = {\r
+          0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,\r
+    0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,\r
+    0x10, 0x11,       0x13, 0x14, 0x15, 0x16, 0x17,\r
+    0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,\r
+};\r
+static const DBCHAR u2johabjamo[] = {\r
+            0x8841, 0x8c41, 0x8444, 0x9041, 0x8446, 0x8447, 0x9441,\r
+    0x9841, 0x9c41, 0x844a, 0x844b, 0x844c, 0x844d, 0x844e, 0x844f,\r
+    0x8450, 0xa041, 0xa441, 0xa841, 0x8454, 0xac41, 0xb041, 0xb441,\r
+    0xb841, 0xbc41, 0xc041, 0xc441, 0xc841, 0xcc41, 0xd041, 0x8461,\r
+    0x8481, 0x84a1, 0x84c1, 0x84e1, 0x8541, 0x8561, 0x8581, 0x85a1,\r
+    0x85c1, 0x85e1, 0x8641, 0x8661, 0x8681, 0x86a1, 0x86c1, 0x86e1,\r
+    0x8741, 0x8761, 0x8781, 0x87a1,\r
+};\r
+\r
+ENCODER(johab)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        if (c >= 0xac00 && c <= 0xd7a3) {\r
+            c -= 0xac00;\r
+            code = 0x8000 |\r
+                (u2johabidx_choseong[c / 588] << 10) |\r
+                (u2johabidx_jungseong[(c / 28) % 21] << 5) |\r
+                u2johabidx_jongseong[c % 28];\r
+        }\r
+        else if (c >= 0x3131 && c <= 0x3163)\r
+            code = u2johabjamo[c - 0x3131];\r
+        else TRYMAP_ENC(cp949, code, c) {\r
+            unsigned char c1, c2, t2;\r
+            unsigned short t1;\r
+\r
+            assert((code & 0x8000) == 0);\r
+            c1 = code >> 8;\r
+            c2 = code & 0xff;\r
+            if (((c1 >= 0x21 && c1 <= 0x2c) ||\r
+                (c1 >= 0x4a && c1 <= 0x7d)) &&\r
+                (c2 >= 0x21 && c2 <= 0x7e)) {\r
+                t1 = (c1 < 0x4a ? (c1 - 0x21 + 0x1b2) :\r
+                          (c1 - 0x21 + 0x197));\r
+                t2 = ((t1 & 1) ? 0x5e : 0) + (c2 - 0x21);\r
+                OUT1(t1 >> 1)\r
+                OUT2(t2 < 0x4e ? t2 + 0x31 : t2 + 0x43)\r
+                NEXT(1, 2)\r
+                continue;\r
+            }\r
+            else\r
+                return 1;\r
+        }\r
+        else\r
+            return 1;\r
+\r
+        OUT1(code >> 8)\r
+        OUT2(code & 0xff)\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+#define FILL 0xfd\r
+#define NONE 0xff\r
+\r
+static const unsigned char johabidx_choseong[32] = {\r
+    NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,\r
+    0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d,\r
+    0x0e, 0x0f, 0x10, 0x11, 0x12, NONE, NONE, NONE,\r
+    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,\r
+};\r
+static const unsigned char johabidx_jungseong[32] = {\r
+    NONE, NONE, FILL, 0x00, 0x01, 0x02, 0x03, 0x04,\r
+    NONE, NONE, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,\r
+    NONE, NONE, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,\r
+    NONE, NONE, 0x11, 0x12, 0x13, 0x14, NONE, NONE,\r
+};\r
+static const unsigned char johabidx_jongseong[32] = {\r
+    NONE, FILL, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06,\r
+    0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e,\r
+    0x0f, 0x10, NONE, 0x11, 0x12, 0x13, 0x14, 0x15,\r
+    0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, NONE, NONE,\r
+};\r
+\r
+static const unsigned char johabjamo_choseong[32] = {\r
+    NONE, FILL, 0x31, 0x32, 0x34, 0x37, 0x38, 0x39,\r
+    0x41, 0x42, 0x43, 0x45, 0x46, 0x47, 0x48, 0x49,\r
+    0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE, NONE,\r
+    NONE, NONE, NONE, NONE, NONE, NONE, NONE, NONE,\r
+};\r
+static const unsigned char johabjamo_jungseong[32] = {\r
+    NONE, NONE, FILL, 0x4f, 0x50, 0x51, 0x52, 0x53,\r
+    NONE, NONE, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,\r
+    NONE, NONE, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,\r
+    NONE, NONE, 0x60, 0x61, 0x62, 0x63, NONE, NONE,\r
+};\r
+static const unsigned char johabjamo_jongseong[32] = {\r
+    NONE, FILL, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,\r
+    0x37, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\r
+    0x40, 0x41, NONE, 0x42, 0x44, 0x45, 0x46, 0x47,\r
+    0x48, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, NONE, NONE,\r
+};\r
+\r
+DECODER(johab)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char    c = IN1, c2;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+        c2 = IN2;\r
+\r
+        if (c < 0xd8) {\r
+            /* johab hangul */\r
+            unsigned char c_cho, c_jung, c_jong;\r
+            unsigned char i_cho, i_jung, i_jong;\r
+\r
+            c_cho = (c >> 2) & 0x1f;\r
+            c_jung = ((c << 3) | c2 >> 5) & 0x1f;\r
+            c_jong = c2 & 0x1f;\r
+\r
+            i_cho = johabidx_choseong[c_cho];\r
+            i_jung = johabidx_jungseong[c_jung];\r
+            i_jong = johabidx_jongseong[c_jong];\r
+\r
+            if (i_cho == NONE || i_jung == NONE || i_jong == NONE)\r
+                return 2;\r
+\r
+            /* we don't use U+1100 hangul jamo yet. */\r
+            if (i_cho == FILL) {\r
+                if (i_jung == FILL) {\r
+                    if (i_jong == FILL)\r
+                        OUT1(0x3000)\r
+                    else\r
+                        OUT1(0x3100 |\r
+                          johabjamo_jongseong[c_jong])\r
+                }\r
+                else {\r
+                    if (i_jong == FILL)\r
+                        OUT1(0x3100 |\r
+                          johabjamo_jungseong[c_jung])\r
+                    else\r
+                        return 2;\r
+                }\r
+            } else {\r
+                if (i_jung == FILL) {\r
+                    if (i_jong == FILL)\r
+                        OUT1(0x3100 |\r
+                          johabjamo_choseong[c_cho])\r
+                    else\r
+                        return 2;\r
+                }\r
+                else\r
+                    OUT1(0xac00 +\r
+                         i_cho * 588 +\r
+                         i_jung * 28 +\r
+                         (i_jong == FILL ? 0 : i_jong))\r
+            }\r
+            NEXT(2, 1)\r
+        } else {\r
+            /* KS X 1001 except hangul jamos and syllables */\r
+            if (c == 0xdf || c > 0xf9 ||\r
+                c2 < 0x31 || (c2 >= 0x80 && c2 < 0x91) ||\r
+                (c2 & 0x7f) == 0x7f ||\r
+                (c == 0xda && (c2 >= 0xa1 && c2 <= 0xd3)))\r
+                return 2;\r
+            else {\r
+                unsigned char t1, t2;\r
+\r
+                t1 = (c < 0xe0 ? 2 * (c - 0xd9) :\r
+                         2 * c - 0x197);\r
+                t2 = (c2 < 0x91 ? c2 - 0x31 : c2 - 0x43);\r
+                t1 = t1 + (t2 < 0x5e ? 0 : 1) + 0x21;\r
+                t2 = (t2 < 0x5e ? t2 : t2 - 0x5e) + 0x21;\r
+\r
+                TRYMAP_DEC(ksx1001, **outbuf, t1, t2);\r
+                else return 2;\r
+                NEXT(2, 1)\r
+            }\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+#undef NONE\r
+#undef FILL\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  MAPPING_DECONLY(ksx1001)\r
+  MAPPING_ENCONLY(cp949)\r
+  MAPPING_DECONLY(cp949ext)\r
+END_MAPPINGS_LIST\r
+\r
+BEGIN_CODECS_LIST\r
+  CODEC_STATELESS(euc_kr)\r
+  CODEC_STATELESS(cp949)\r
+  CODEC_STATELESS(johab)\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(kr)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_tw.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/_codecs_tw.c
new file mode 100644 (file)
index 0000000..3f6204d
--- /dev/null
@@ -0,0 +1,132 @@
+/*\r
+ * _codecs_tw.c: Codecs collection for Taiwan's encodings\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#include "cjkcodecs.h"\r
+#include "mappings_tw.h"\r
+\r
+/*\r
+ * BIG5 codec\r
+ */\r
+\r
+ENCODER(big5)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = **inbuf;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            REQUIRE_OUTBUF(1)\r
+            **outbuf = (unsigned char)c;\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+\r
+        TRYMAP_ENC(big5, code, c);\r
+        else return 1;\r
+\r
+        OUT1(code >> 8)\r
+        OUT2(code & 0xFF)\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(big5)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+        TRYMAP_DEC(big5, **outbuf, c, IN2) {\r
+            NEXT(2, 1)\r
+        }\r
+        else return 2;\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/*\r
+ * CP950 codec\r
+ */\r
+\r
+ENCODER(cp950)\r
+{\r
+    while (inleft > 0) {\r
+        Py_UNICODE c = IN1;\r
+        DBCHAR code;\r
+\r
+        if (c < 0x80) {\r
+            WRITE1((unsigned char)c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+        UCS4INVALID(c)\r
+\r
+        REQUIRE_OUTBUF(2)\r
+        TRYMAP_ENC(cp950ext, code, c);\r
+        else TRYMAP_ENC(big5, code, c);\r
+        else return 1;\r
+\r
+        OUT1(code >> 8)\r
+        OUT2(code & 0xFF)\r
+        NEXT(1, 2)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+DECODER(cp950)\r
+{\r
+    while (inleft > 0) {\r
+        unsigned char c = IN1;\r
+\r
+        REQUIRE_OUTBUF(1)\r
+\r
+        if (c < 0x80) {\r
+            OUT1(c)\r
+            NEXT(1, 1)\r
+            continue;\r
+        }\r
+\r
+        REQUIRE_INBUF(2)\r
+\r
+        TRYMAP_DEC(cp950ext, **outbuf, c, IN2);\r
+        else TRYMAP_DEC(big5, **outbuf, c, IN2);\r
+        else return 2;\r
+\r
+        NEXT(2, 1)\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+\r
+BEGIN_MAPPINGS_LIST\r
+  MAPPING_ENCDEC(big5)\r
+  MAPPING_ENCDEC(cp950ext)\r
+END_MAPPINGS_LIST\r
+\r
+BEGIN_CODECS_LIST\r
+  CODEC_STATELESS(big5)\r
+  CODEC_STATELESS(cp950)\r
+END_CODECS_LIST\r
+\r
+I_AM_A_MODULE_FOR(tw)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/alg_jisx0201.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/alg_jisx0201.h
new file mode 100644 (file)
index 0000000..3f4e938
--- /dev/null
@@ -0,0 +1,24 @@
+#define JISX0201_R_ENCODE(c, assi)                      \\r
+    if ((c) < 0x80 && (c) != 0x5c && (c) != 0x7e)       \\r
+        (assi) = (c);                                   \\r
+    else if ((c) == 0x00a5) (assi) = 0x5c;              \\r
+    else if ((c) == 0x203e) (assi) = 0x7e;\r
+#define JISX0201_K_ENCODE(c, assi)                      \\r
+    if ((c) >= 0xff61 && (c) <= 0xff9f)                 \\r
+        (assi) = (c) - 0xfec0;\r
+#define JISX0201_ENCODE(c, assi)                        \\r
+    JISX0201_R_ENCODE(c, assi)                          \\r
+    else JISX0201_K_ENCODE(c, assi)\r
+\r
+#define JISX0201_R_DECODE(c, assi)                      \\r
+    if ((c) < 0x5c) (assi) = (c);                       \\r
+    else if ((c) == 0x5c) (assi) = 0x00a5;              \\r
+    else if ((c) < 0x7e) (assi) = (c);                  \\r
+    else if ((c) == 0x7e) (assi) = 0x203e;              \\r
+    else if ((c) == 0x7f) (assi) = 0x7f;\r
+#define JISX0201_K_DECODE(c, assi)                      \\r
+    if ((c) >= 0xa1 && (c) <= 0xdf)                     \\r
+    (assi) = 0xfec0 + (c);\r
+#define JISX0201_DECODE(c, assi)                        \\r
+    JISX0201_R_DECODE(c, assi)                          \\r
+    else JISX0201_K_DECODE(c, assi)\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/cjkcodecs.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/cjkcodecs.h
new file mode 100644 (file)
index 0000000..9c2febc
--- /dev/null
@@ -0,0 +1,398 @@
+/*\r
+ * cjkcodecs.h: common header for cjkcodecs\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#ifndef _CJKCODECS_H_\r
+#define _CJKCODECS_H_\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "multibytecodec.h"\r
+\r
+\r
+/* a unicode "undefined" code point */\r
+#define UNIINV  0xFFFE\r
+\r
+/* internal-use DBCS code points which aren't used by any charsets */\r
+#define NOCHAR  0xFFFF\r
+#define MULTIC  0xFFFE\r
+#define DBCINV  0xFFFD\r
+\r
+/* shorter macros to save source size of mapping tables */\r
+#define U UNIINV\r
+#define N NOCHAR\r
+#define M MULTIC\r
+#define D DBCINV\r
+\r
+struct dbcs_index {\r
+    const ucs2_t *map;\r
+    unsigned char bottom, top;\r
+};\r
+typedef struct dbcs_index decode_map;\r
+\r
+struct widedbcs_index {\r
+    const ucs4_t *map;\r
+    unsigned char bottom, top;\r
+};\r
+typedef struct widedbcs_index widedecode_map;\r
+\r
+struct unim_index {\r
+    const DBCHAR *map;\r
+    unsigned char bottom, top;\r
+};\r
+typedef struct unim_index encode_map;\r
+\r
+struct unim_index_bytebased {\r
+    const unsigned char *map;\r
+    unsigned char bottom, top;\r
+};\r
+\r
+struct dbcs_map {\r
+    const char *charset;\r
+    const struct unim_index *encmap;\r
+    const struct dbcs_index *decmap;\r
+};\r
+\r
+struct pair_encodemap {\r
+    ucs4_t uniseq;\r
+    DBCHAR code;\r
+};\r
+\r
+static const MultibyteCodec *codec_list;\r
+static const struct dbcs_map *mapping_list;\r
+\r
+#define CODEC_INIT(encoding)                                            \\r
+    static int encoding##_codec_init(const void *config)\r
+\r
+#define ENCODER_INIT(encoding)                                          \\r
+    static int encoding##_encode_init(                                  \\r
+        MultibyteCodec_State *state, const void *config)\r
+#define ENCODER(encoding)                                               \\r
+    static Py_ssize_t encoding##_encode(                                \\r
+        MultibyteCodec_State *state, const void *config,                \\r
+        const Py_UNICODE **inbuf, Py_ssize_t inleft,                    \\r
+        unsigned char **outbuf, Py_ssize_t outleft, int flags)\r
+#define ENCODER_RESET(encoding)                                         \\r
+    static Py_ssize_t encoding##_encode_reset(                          \\r
+        MultibyteCodec_State *state, const void *config,                \\r
+        unsigned char **outbuf, Py_ssize_t outleft)\r
+\r
+#define DECODER_INIT(encoding)                                          \\r
+    static int encoding##_decode_init(                                  \\r
+        MultibyteCodec_State *state, const void *config)\r
+#define DECODER(encoding)                                               \\r
+    static Py_ssize_t encoding##_decode(                                \\r
+        MultibyteCodec_State *state, const void *config,                \\r
+        const unsigned char **inbuf, Py_ssize_t inleft,                 \\r
+        Py_UNICODE **outbuf, Py_ssize_t outleft)\r
+#define DECODER_RESET(encoding)                                         \\r
+    static Py_ssize_t encoding##_decode_reset(                          \\r
+        MultibyteCodec_State *state, const void *config)\r
+\r
+#if Py_UNICODE_SIZE == 4\r
+#define UCS4INVALID(code)       \\r
+    if ((code) > 0xFFFF)        \\r
+    return 1;\r
+#else\r
+#define UCS4INVALID(code)       \\r
+    if (0) ;\r
+#endif\r
+\r
+#define NEXT_IN(i)                              \\r
+    (*inbuf) += (i);                            \\r
+    (inleft) -= (i);\r
+#define NEXT_OUT(o)                             \\r
+    (*outbuf) += (o);                           \\r
+    (outleft) -= (o);\r
+#define NEXT(i, o)                              \\r
+    NEXT_IN(i) NEXT_OUT(o)\r
+\r
+#define REQUIRE_INBUF(n)                        \\r
+    if (inleft < (n))                           \\r
+        return MBERR_TOOFEW;\r
+#define REQUIRE_OUTBUF(n)                       \\r
+    if (outleft < (n))                          \\r
+        return MBERR_TOOSMALL;\r
+\r
+#define IN1 ((*inbuf)[0])\r
+#define IN2 ((*inbuf)[1])\r
+#define IN3 ((*inbuf)[2])\r
+#define IN4 ((*inbuf)[3])\r
+\r
+#define OUT1(c) ((*outbuf)[0]) = (c);\r
+#define OUT2(c) ((*outbuf)[1]) = (c);\r
+#define OUT3(c) ((*outbuf)[2]) = (c);\r
+#define OUT4(c) ((*outbuf)[3]) = (c);\r
+\r
+#define WRITE1(c1)              \\r
+    REQUIRE_OUTBUF(1)           \\r
+    (*outbuf)[0] = (c1);\r
+#define WRITE2(c1, c2)          \\r
+    REQUIRE_OUTBUF(2)           \\r
+    (*outbuf)[0] = (c1);        \\r
+    (*outbuf)[1] = (c2);\r
+#define WRITE3(c1, c2, c3)      \\r
+    REQUIRE_OUTBUF(3)           \\r
+    (*outbuf)[0] = (c1);        \\r
+    (*outbuf)[1] = (c2);        \\r
+    (*outbuf)[2] = (c3);\r
+#define WRITE4(c1, c2, c3, c4)  \\r
+    REQUIRE_OUTBUF(4)           \\r
+    (*outbuf)[0] = (c1);        \\r
+    (*outbuf)[1] = (c2);        \\r
+    (*outbuf)[2] = (c3);        \\r
+    (*outbuf)[3] = (c4);\r
+\r
+#if Py_UNICODE_SIZE == 2\r
+# define WRITEUCS4(c)                                           \\r
+    REQUIRE_OUTBUF(2)                                           \\r
+    (*outbuf)[0] = 0xd800 + (((c) - 0x10000) >> 10);            \\r
+    (*outbuf)[1] = 0xdc00 + (((c) - 0x10000) & 0x3ff);          \\r
+    NEXT_OUT(2)\r
+#else\r
+# define WRITEUCS4(c)                                           \\r
+    REQUIRE_OUTBUF(1)                                           \\r
+    **outbuf = (Py_UNICODE)(c);                                 \\r
+    NEXT_OUT(1)\r
+#endif\r
+\r
+#define _TRYMAP_ENC(m, assi, val)                               \\r
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \\r
+        (val)<= (m)->top && ((assi) = (m)->map[(val) -          \\r
+        (m)->bottom]) != NOCHAR)\r
+#define TRYMAP_ENC_COND(charset, assi, uni)                     \\r
+    _TRYMAP_ENC(&charset##_encmap[(uni) >> 8], assi, (uni) & 0xff)\r
+#define TRYMAP_ENC(charset, assi, uni)                          \\r
+    if TRYMAP_ENC_COND(charset, assi, uni)\r
+\r
+#define _TRYMAP_DEC(m, assi, val)                               \\r
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \\r
+        (val)<= (m)->top && ((assi) = (m)->map[(val) -          \\r
+        (m)->bottom]) != UNIINV)\r
+#define TRYMAP_DEC(charset, assi, c1, c2)                       \\r
+    if _TRYMAP_DEC(&charset##_decmap[c1], assi, c2)\r
+\r
+#define _TRYMAP_ENC_MPLANE(m, assplane, asshi, asslo, val)      \\r
+    ((m)->map != NULL && (val) >= (m)->bottom &&                \\r
+        (val)<= (m)->top &&                                     \\r
+        ((assplane) = (m)->map[((val) - (m)->bottom)*3]) != 0 && \\r
+        (((asshi) = (m)->map[((val) - (m)->bottom)*3 + 1]), 1) && \\r
+        (((asslo) = (m)->map[((val) - (m)->bottom)*3 + 2]), 1))\r
+#define TRYMAP_ENC_MPLANE(charset, assplane, asshi, asslo, uni) \\r
+    if _TRYMAP_ENC_MPLANE(&charset##_encmap[(uni) >> 8], \\r
+                       assplane, asshi, asslo, (uni) & 0xff)\r
+#define TRYMAP_DEC_MPLANE(charset, assi, plane, c1, c2)         \\r
+    if _TRYMAP_DEC(&charset##_decmap[plane][c1], assi, c2)\r
+\r
+#if Py_UNICODE_SIZE == 2\r
+#define DECODE_SURROGATE(c)                                     \\r
+    if (c >> 10 == 0xd800 >> 10) { /* high surrogate */         \\r
+        REQUIRE_INBUF(2)                                        \\r
+        if (IN2 >> 10 == 0xdc00 >> 10) { /* low surrogate */ \\r
+            c = 0x10000 + ((ucs4_t)(c - 0xd800) << 10) + \\r
+            ((ucs4_t)(IN2) - 0xdc00);                           \\r
+        }                                                       \\r
+    }\r
+#define GET_INSIZE(c)   ((c) > 0xffff ? 2 : 1)\r
+#else\r
+#define DECODE_SURROGATE(c) {;}\r
+#define GET_INSIZE(c)   1\r
+#endif\r
+\r
+#define BEGIN_MAPPINGS_LIST static const struct dbcs_map _mapping_list[] = {\r
+#define MAPPING_ENCONLY(enc) {#enc, (void*)enc##_encmap, NULL},\r
+#define MAPPING_DECONLY(enc) {#enc, NULL, (void*)enc##_decmap},\r
+#define MAPPING_ENCDEC(enc) {#enc, (void*)enc##_encmap, (void*)enc##_decmap},\r
+#define END_MAPPINGS_LIST                               \\r
+    {"", NULL, NULL} };                                 \\r
+    static const struct dbcs_map *mapping_list =        \\r
+        (const struct dbcs_map *)_mapping_list;\r
+\r
+#define BEGIN_CODECS_LIST static const MultibyteCodec _codec_list[] = {\r
+#define _STATEFUL_METHODS(enc)          \\r
+    enc##_encode,                       \\r
+    enc##_encode_init,                  \\r
+    enc##_encode_reset,                 \\r
+    enc##_decode,                       \\r
+    enc##_decode_init,                  \\r
+    enc##_decode_reset,\r
+#define _STATELESS_METHODS(enc)         \\r
+    enc##_encode, NULL, NULL,           \\r
+    enc##_decode, NULL, NULL,\r
+#define CODEC_STATEFUL(enc) {           \\r
+    #enc, NULL, NULL,                   \\r
+    _STATEFUL_METHODS(enc)              \\r
+},\r
+#define CODEC_STATELESS(enc) {          \\r
+    #enc, NULL, NULL,                   \\r
+    _STATELESS_METHODS(enc)             \\r
+},\r
+#define CODEC_STATELESS_WINIT(enc) {    \\r
+    #enc, NULL,                         \\r
+    enc##_codec_init,                   \\r
+    _STATELESS_METHODS(enc)             \\r
+},\r
+#define END_CODECS_LIST                                 \\r
+    {"", NULL,} };                                      \\r
+    static const MultibyteCodec *codec_list =           \\r
+        (const MultibyteCodec *)_codec_list;\r
+\r
+static PyObject *\r
+getmultibytecodec(void)\r
+{\r
+    static PyObject *cofunc = NULL;\r
+\r
+    if (cofunc == NULL) {\r
+        PyObject *mod = PyImport_ImportModuleNoBlock("_multibytecodec");\r
+        if (mod == NULL)\r
+            return NULL;\r
+        cofunc = PyObject_GetAttrString(mod, "__create_codec");\r
+        Py_DECREF(mod);\r
+    }\r
+    return cofunc;\r
+}\r
+\r
+static PyObject *\r
+getcodec(PyObject *self, PyObject *encoding)\r
+{\r
+    PyObject *codecobj, *r, *cofunc;\r
+    const MultibyteCodec *codec;\r
+    const char *enc;\r
+\r
+    if (!PyString_Check(encoding)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "encoding name must be a string.");\r
+        return NULL;\r
+    }\r
+\r
+    cofunc = getmultibytecodec();\r
+    if (cofunc == NULL)\r
+        return NULL;\r
+\r
+    enc = PyString_AS_STRING(encoding);\r
+    for (codec = codec_list; codec->encoding[0]; codec++)\r
+        if (strcmp(codec->encoding, enc) == 0)\r
+            break;\r
+\r
+    if (codec->encoding[0] == '\0') {\r
+        PyErr_SetString(PyExc_LookupError,\r
+                        "no such codec is supported.");\r
+        return NULL;\r
+    }\r
+\r
+    codecobj = PyCapsule_New((void *)codec, PyMultibyteCodec_CAPSULE_NAME, NULL);\r
+    if (codecobj == NULL)\r
+        return NULL;\r
+\r
+    r = PyObject_CallFunctionObjArgs(cofunc, codecobj, NULL);\r
+    Py_DECREF(codecobj);\r
+\r
+    return r;\r
+}\r
+\r
+static struct PyMethodDef __methods[] = {\r
+    {"getcodec", (PyCFunction)getcodec, METH_O, ""},\r
+    {NULL, NULL},\r
+};\r
+\r
+static int\r
+register_maps(PyObject *module)\r
+{\r
+    const struct dbcs_map *h;\r
+\r
+    for (h = mapping_list; h->charset[0] != '\0'; h++) {\r
+        char mhname[256] = "__map_";\r
+        int r;\r
+        strcpy(mhname + sizeof("__map_") - 1, h->charset);\r
+        r = PyModule_AddObject(module, mhname,\r
+                        PyCapsule_New((void *)h, PyMultibyteCodec_CAPSULE_NAME, NULL));\r
+        if (r == -1)\r
+            return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+#ifdef USING_BINARY_PAIR_SEARCH\r
+static DBCHAR\r
+find_pairencmap(ucs2_t body, ucs2_t modifier,\r
+                const struct pair_encodemap *haystack, int haystacksize)\r
+{\r
+    int pos, min, max;\r
+    ucs4_t value = body << 16 | modifier;\r
+\r
+    min = 0;\r
+    max = haystacksize;\r
+\r
+    for (pos = haystacksize >> 1; min != max; pos = (min + max) >> 1)\r
+        if (value < haystack[pos].uniseq) {\r
+            if (max == pos) break;\r
+            else max = pos;\r
+        }\r
+        else if (value > haystack[pos].uniseq) {\r
+            if (min == pos) break;\r
+            else min = pos;\r
+        }\r
+        else\r
+            break;\r
+\r
+        if (value == haystack[pos].uniseq)\r
+            return haystack[pos].code;\r
+        else\r
+            return DBCINV;\r
+}\r
+#endif\r
+\r
+#ifdef USING_IMPORTED_MAPS\r
+#define IMPORT_MAP(locale, charset, encmap, decmap) \\r
+    importmap("_codecs_" #locale, "__map_" #charset, \\r
+              (const void**)encmap, (const void**)decmap)\r
+\r
+static int\r
+importmap(const char *modname, const char *symbol,\r
+          const void **encmap, const void **decmap)\r
+{\r
+    PyObject *o, *mod;\r
+\r
+    mod = PyImport_ImportModule((char *)modname);\r
+    if (mod == NULL)\r
+        return -1;\r
+\r
+    o = PyObject_GetAttrString(mod, (char*)symbol);\r
+    if (o == NULL)\r
+        goto errorexit;\r
+    else if (!PyCapsule_IsValid(o, PyMultibyteCodec_CAPSULE_NAME)) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "map data must be a Capsule.");\r
+        goto errorexit;\r
+    }\r
+    else {\r
+        struct dbcs_map *map;\r
+        map = PyCapsule_GetPointer(o, PyMultibyteCodec_CAPSULE_NAME);\r
+        if (encmap != NULL)\r
+            *encmap = map->encmap;\r
+        if (decmap != NULL)\r
+            *decmap = map->decmap;\r
+        Py_DECREF(o);\r
+    }\r
+\r
+    Py_DECREF(mod);\r
+    return 0;\r
+\r
+errorexit:\r
+    Py_DECREF(mod);\r
+    return -1;\r
+}\r
+#endif\r
+\r
+#define I_AM_A_MODULE_FOR(loc)                                          \\r
+    void                                                                \\r
+    init_codecs_##loc(void)                                             \\r
+    {                                                                   \\r
+        PyObject *m = Py_InitModule("_codecs_" #loc, __methods);\\r
+        if (m != NULL)                                                  \\r
+            (void)register_maps(m);                                     \\r
+    }\r
+\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/emu_jisx0213_2000.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/emu_jisx0213_2000.h
new file mode 100644 (file)
index 0000000..ca22858
--- /dev/null
@@ -0,0 +1,43 @@
+/* These routines may be quite inefficient, but it's used only to emulate old\r
+ * standards. */\r
+\r
+#ifndef EMULATE_JISX0213_2000_ENCODE_INVALID\r
+#define EMULATE_JISX0213_2000_ENCODE_INVALID 1\r
+#endif\r
+\r
+#define EMULATE_JISX0213_2000_ENCODE_BMP(assi, c)                       \\r
+    if (config == (void *)2000 && (                                     \\r
+                    (c) == 0x9B1C || (c) == 0x4FF1 ||                   \\r
+                    (c) == 0x525D || (c) == 0x541E ||                   \\r
+                    (c) == 0x5653 || (c) == 0x59F8 ||                   \\r
+                    (c) == 0x5C5B || (c) == 0x5E77 ||                   \\r
+                    (c) == 0x7626 || (c) == 0x7E6B))                    \\r
+        return EMULATE_JISX0213_2000_ENCODE_INVALID;                    \\r
+    else if (config == (void *)2000 && (c) == 0x9B1D)                   \\r
+        (assi) = 0x8000 | 0x7d3b;                                       \\r
+\r
+#define EMULATE_JISX0213_2000_ENCODE_EMP(assi, c)                       \\r
+    if (config == (void *)2000 && (c) == 0x20B9F)                       \\r
+        return EMULATE_JISX0213_2000_ENCODE_INVALID;\r
+\r
+#ifndef EMULATE_JISX0213_2000_DECODE_INVALID\r
+#define EMULATE_JISX0213_2000_DECODE_INVALID 2\r
+#endif\r
+\r
+#define EMULATE_JISX0213_2000_DECODE_PLANE1(assi, c1, c2)               \\r
+    if (config == (void *)2000 &&                                       \\r
+                    (((c1) == 0x2E && (c2) == 0x21) ||                  \\r
+                     ((c1) == 0x2F && (c2) == 0x7E) ||                  \\r
+                     ((c1) == 0x4F && (c2) == 0x54) ||                  \\r
+                     ((c1) == 0x4F && (c2) == 0x7E) ||                  \\r
+                     ((c1) == 0x74 && (c2) == 0x27) ||                  \\r
+                     ((c1) == 0x7E && (c2) == 0x7A) ||                  \\r
+                     ((c1) == 0x7E && (c2) == 0x7B) ||                  \\r
+                     ((c1) == 0x7E && (c2) == 0x7C) ||                  \\r
+                     ((c1) == 0x7E && (c2) == 0x7D) ||                  \\r
+                     ((c1) == 0x7E && (c2) == 0x7E)))                   \\r
+        return EMULATE_JISX0213_2000_DECODE_INVALID;\r
+\r
+#define EMULATE_JISX0213_2000_DECODE_PLANE2(assi, c1, c2)               \\r
+    if (config == (void *)2000 && (c1) == 0x7D && (c2) == 0x3B)         \\r
+        (assi) = 0x9B1D;\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_cn.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_cn.h
new file mode 100644 (file)
index 0000000..e6c89c6
--- /dev/null
@@ -0,0 +1,4103 @@
+static const ucs2_t __gb2312_decmap[7482] = {\r
+12288,12289,12290,12539,713,711,168,12291,12293,8213,65374,8214,8230,8216,\r
+8217,8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,\r
+12310,12311,12304,12305,177,215,247,8758,8743,8744,8721,8719,8746,8745,8712,\r
+8759,8730,8869,8741,8736,8978,8857,8747,8750,8801,8780,8776,8765,8733,8800,\r
+8814,8815,8804,8805,8734,8757,8756,9794,9792,176,8242,8243,8451,65284,164,\r
+65504,65505,8240,167,8470,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,\r
+9650,8251,8594,8592,8593,8595,12307,9352,9353,9354,9355,9356,9357,9358,9359,\r
+9360,9361,9362,9363,9364,9365,9366,9367,9368,9369,9370,9371,9332,9333,9334,\r
+9335,9336,9337,9338,9339,9340,9341,9342,9343,9344,9345,9346,9347,9348,9349,\r
+9350,9351,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,U,U,12832,12833,\r
+12834,12835,12836,12837,12838,12839,12840,12841,U,U,8544,8545,8546,8547,8548,\r
+8549,8550,8551,8552,8553,8554,8555,65281,65282,65283,65509,65285,65286,65287,\r
+65288,65289,65290,65291,65292,65293,65294,65295,65296,65297,65298,65299,65300,\r
+65301,65302,65303,65304,65305,65306,65307,65308,65309,65310,65311,65312,65313,\r
+65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,65325,65326,\r
+65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,65338,65339,\r
+65340,65341,65342,65343,65344,65345,65346,65347,65348,65349,65350,65351,65352,\r
+65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,65364,65365,\r
+65366,65367,65368,65369,65370,65371,65372,65373,65507,12353,12354,12355,12356,\r
+12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,\r
+12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,\r
+12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,\r
+12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,\r
+12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,\r
+12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,\r
+12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,\r
+12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,\r
+12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,\r
+12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,\r
+12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,\r
+12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,\r
+12526,12527,12528,12529,12530,12531,12532,12533,12534,913,914,915,916,917,918,\r
+919,920,921,922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,U,U,U,\r
+U,U,U,U,U,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,\r
+963,964,965,966,967,968,969,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,\r
+1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,\r
+1064,1065,1066,1067,1068,1069,1070,1071,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,1072,\r
+1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,\r
+1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,\r
+1102,1103,257,225,462,224,275,233,283,232,299,237,464,236,333,243,466,242,363,\r
+250,468,249,470,472,474,476,252,234,U,U,U,U,U,U,U,U,U,U,12549,12550,12551,\r
+12552,12553,12554,12555,12556,12557,12558,12559,12560,12561,12562,12563,12564,\r
+12565,12566,12567,12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,\r
+12578,12579,12580,12581,12582,12583,12584,12585,9472,9473,9474,9475,9476,9477,\r
+9478,9479,9480,9481,9482,9483,9484,9485,9486,9487,9488,9489,9490,9491,9492,\r
+9493,9494,9495,9496,9497,9498,9499,9500,9501,9502,9503,9504,9505,9506,9507,\r
+9508,9509,9510,9511,9512,9513,9514,9515,9516,9517,9518,9519,9520,9521,9522,\r
+9523,9524,9525,9526,9527,9528,9529,9530,9531,9532,9533,9534,9535,9536,9537,\r
+9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,21834,38463,22467,25384,\r
+21710,21769,21696,30353,30284,34108,30702,33406,30861,29233,38552,38797,27688,\r
+23433,20474,25353,26263,23736,33018,26696,32942,26114,30414,20985,25942,29100,\r
+32753,34948,20658,22885,25034,28595,33453,25420,25170,21485,21543,31494,20843,\r
+30116,24052,25300,36299,38774,25226,32793,22365,38712,32610,29240,30333,26575,\r
+30334,25670,20336,36133,25308,31255,26001,29677,25644,25203,33324,39041,26495,\r
+29256,25198,25292,20276,29923,21322,21150,32458,37030,24110,26758,27036,33152,\r
+32465,26834,30917,34444,38225,20621,35876,33502,32990,21253,35090,21093,34180,\r
+38649,20445,22561,39281,23453,25265,25253,26292,35961,40077,29190,26479,30865,\r
+24754,21329,21271,36744,32972,36125,38049,20493,29384,22791,24811,28953,34987,\r
+22868,33519,26412,31528,23849,32503,29997,27893,36454,36856,36924,40763,27604,\r
+37145,31508,24444,30887,34006,34109,27605,27609,27606,24065,24199,30201,38381,\r
+25949,24330,24517,36767,22721,33218,36991,38491,38829,36793,32534,36140,25153,\r
+20415,21464,21342,36776,36777,36779,36941,26631,24426,33176,34920,40150,24971,\r
+21035,30250,24428,25996,28626,28392,23486,25672,20853,20912,26564,19993,31177,\r
+39292,28851,30149,24182,29627,33760,25773,25320,38069,27874,21338,21187,25615,\r
+38082,31636,20271,24091,33334,33046,33162,28196,27850,39539,25429,21340,21754,\r
+34917,22496,19981,24067,27493,31807,37096,24598,25830,29468,35009,26448,25165,\r
+36130,30572,36393,37319,24425,33756,34081,39184,21442,34453,27531,24813,24808,\r
+28799,33485,33329,20179,27815,34255,25805,31961,27133,26361,33609,21397,31574,\r
+20391,20876,27979,23618,36461,25554,21449,33580,33590,26597,30900,25661,23519,\r
+23700,24046,35815,25286,26612,35962,25600,25530,34633,39307,35863,32544,38130,\r
+20135,38416,39076,26124,29462,22330,23581,24120,38271,20607,32928,21378,25950,\r
+30021,21809,20513,36229,25220,38046,26397,22066,28526,24034,21557,28818,36710,\r
+25199,25764,25507,24443,28552,37108,33251,36784,23576,26216,24561,27785,38472,\r
+36225,34924,25745,31216,22478,27225,25104,21576,20056,31243,24809,28548,35802,\r
+25215,36894,39563,31204,21507,30196,25345,21273,27744,36831,24347,39536,32827,\r
+40831,20360,23610,36196,32709,26021,28861,20805,20914,34411,23815,23456,25277,\r
+37228,30068,36364,31264,24833,31609,20167,32504,30597,19985,33261,21021,20986,\r
+27249,21416,36487,38148,38607,28353,38500,26970,30784,20648,30679,25616,35302,\r
+22788,25571,24029,31359,26941,20256,33337,21912,20018,30126,31383,24162,24202,\r
+38383,21019,21561,28810,25462,38180,22402,26149,26943,37255,21767,28147,32431,\r
+34850,25139,32496,30133,33576,30913,38604,36766,24904,29943,35789,27492,21050,\r
+36176,27425,32874,33905,22257,21254,20174,19995,20945,31895,37259,31751,20419,\r
+36479,31713,31388,25703,23828,20652,33030,30209,31929,28140,32736,26449,23384,\r
+23544,30923,25774,25619,25514,25387,38169,25645,36798,31572,30249,25171,22823,\r
+21574,27513,20643,25140,24102,27526,20195,36151,34955,24453,36910,24608,32829,\r
+25285,20025,21333,37112,25528,32966,26086,27694,20294,24814,28129,35806,24377,\r
+34507,24403,25377,20826,33633,26723,20992,25443,36424,20498,23707,31095,23548,\r
+21040,31291,24764,36947,30423,24503,24471,30340,36460,28783,30331,31561,30634,\r
+20979,37011,22564,20302,28404,36842,25932,31515,29380,28068,32735,23265,25269,\r
+24213,22320,33922,31532,24093,24351,36882,32532,39072,25474,28359,30872,28857,\r
+20856,38747,22443,30005,20291,30008,24215,24806,22880,28096,27583,30857,21500,\r
+38613,20939,20993,25481,21514,38035,35843,36300,29241,30879,34678,36845,35853,\r
+21472,19969,30447,21486,38025,39030,40718,38189,23450,35746,20002,19996,20908,\r
+33891,25026,21160,26635,20375,24683,20923,27934,20828,25238,26007,38497,35910,\r
+36887,30168,37117,30563,27602,29322,29420,35835,22581,30585,36172,26460,38208,\r
+32922,24230,28193,22930,31471,30701,38203,27573,26029,32526,22534,20817,38431,\r
+23545,22697,21544,36466,25958,39039,22244,38045,30462,36929,25479,21702,22810,\r
+22842,22427,36530,26421,36346,33333,21057,24816,22549,34558,23784,40517,20420,\r
+39069,35769,23077,24694,21380,25212,36943,37122,39295,24681,32780,20799,32819,\r
+23572,39285,27953,20108,36144,21457,32602,31567,20240,20047,38400,27861,29648,\r
+34281,24070,30058,32763,27146,30718,38034,32321,20961,28902,21453,36820,33539,\r
+36137,29359,39277,27867,22346,33459,26041,32938,25151,38450,22952,20223,35775,\r
+32442,25918,33778,38750,21857,39134,32933,21290,35837,21536,32954,24223,27832,\r
+36153,33452,37210,21545,27675,20998,32439,22367,28954,27774,31881,22859,20221,\r
+24575,24868,31914,20016,23553,26539,34562,23792,38155,39118,30127,28925,36898,\r
+20911,32541,35773,22857,20964,20315,21542,22827,25975,32932,23413,25206,25282,\r
+36752,24133,27679,31526,20239,20440,26381,28014,28074,31119,34993,24343,29995,\r
+25242,36741,20463,37340,26023,33071,33105,24220,33104,36212,21103,35206,36171,\r
+22797,20613,20184,38428,29238,33145,36127,23500,35747,38468,22919,32538,21648,\r
+22134,22030,35813,25913,27010,38041,30422,28297,24178,29976,26438,26577,31487,\r
+32925,36214,24863,31174,25954,36195,20872,21018,38050,32568,32923,32434,23703,\r
+28207,26464,31705,30347,39640,33167,32660,31957,25630,38224,31295,21578,21733,\r
+27468,25601,25096,40509,33011,30105,21106,38761,33883,26684,34532,38401,38548,\r
+38124,20010,21508,32473,26681,36319,32789,26356,24218,32697,22466,32831,26775,\r
+24037,25915,21151,24685,40858,20379,36524,20844,23467,24339,24041,27742,25329,\r
+36129,20849,38057,21246,27807,33503,29399,22434,26500,36141,22815,36764,33735,\r
+21653,31629,20272,27837,23396,22993,40723,21476,34506,39592,35895,32929,25925,\r
+39038,22266,38599,21038,29916,21072,23521,25346,35074,20054,25296,24618,26874,\r
+20851,23448,20896,35266,31649,39302,32592,24815,28748,36143,20809,24191,36891,\r
+29808,35268,22317,30789,24402,40863,38394,36712,39740,35809,30328,26690,26588,\r
+36330,36149,21053,36746,28378,26829,38149,37101,22269,26524,35065,36807,21704,\r
+39608,23401,28023,27686,20133,23475,39559,37219,25000,37039,38889,21547,28085,\r
+23506,20989,21898,32597,32752,25788,25421,26097,25022,24717,28938,27735,27721,\r
+22831,26477,33322,22741,22158,35946,27627,37085,22909,32791,21495,28009,21621,\r
+21917,33655,33743,26680,31166,21644,20309,21512,30418,35977,38402,27827,28088,\r
+36203,35088,40548,36154,22079,40657,30165,24456,29408,24680,21756,20136,27178,\r
+34913,24658,36720,21700,28888,34425,40511,27946,23439,24344,32418,21897,20399,\r
+29492,21564,21402,20505,21518,21628,20046,24573,29786,22774,33899,32993,34676,\r
+29392,31946,28246,24359,34382,21804,25252,20114,27818,25143,33457,21719,21326,\r
+29502,28369,30011,21010,21270,35805,27088,24458,24576,28142,22351,27426,29615,\r
+26707,36824,32531,25442,24739,21796,30186,35938,28949,28067,23462,24187,33618,\r
+24908,40644,30970,34647,31783,30343,20976,24822,29004,26179,24140,24653,35854,\r
+28784,25381,36745,24509,24674,34516,22238,27585,24724,24935,21321,24800,26214,\r
+36159,31229,20250,28905,27719,35763,35826,32472,33636,26127,23130,39746,27985,\r
+28151,35905,27963,20249,28779,33719,25110,24785,38669,36135,31096,20987,22334,\r
+22522,26426,30072,31293,31215,31637,32908,39269,36857,28608,35749,40481,23020,\r
+32489,32521,21513,26497,26840,36753,31821,38598,21450,24613,30142,27762,21363,\r
+23241,32423,25380,20960,33034,24049,34015,25216,20864,23395,20238,31085,21058,\r
+24760,27982,23492,23490,35745,35760,26082,24524,38469,22931,32487,32426,22025,\r
+26551,22841,20339,23478,21152,33626,39050,36158,30002,38078,20551,31292,20215,\r
+26550,39550,23233,27516,30417,22362,23574,31546,38388,29006,20860,32937,33392,\r
+22904,32516,33575,26816,26604,30897,30839,25315,25441,31616,20461,21098,20943,\r
+33616,27099,37492,36341,36145,35265,38190,31661,20214,20581,33328,21073,39279,\r
+28176,28293,28071,24314,20725,23004,23558,27974,27743,30086,33931,26728,22870,\r
+35762,21280,37233,38477,34121,26898,30977,28966,33014,20132,37066,27975,39556,\r
+23047,22204,25605,38128,30699,20389,33050,29409,35282,39290,32564,32478,21119,\r
+25945,37237,36735,36739,21483,31382,25581,25509,30342,31224,34903,38454,25130,\r
+21163,33410,26708,26480,25463,30571,31469,27905,32467,35299,22992,25106,34249,\r
+33445,30028,20511,20171,30117,35819,23626,24062,31563,26020,37329,20170,27941,\r
+35167,32039,38182,20165,35880,36827,38771,26187,31105,36817,28908,28024,23613,\r
+21170,33606,20834,33550,30555,26230,40120,20140,24778,31934,31923,32463,20117,\r
+35686,26223,39048,38745,22659,25964,38236,24452,30153,38742,31455,31454,20928,\r
+28847,31384,25578,31350,32416,29590,38893,20037,28792,20061,37202,21417,25937,\r
+26087,33276,33285,21646,23601,30106,38816,25304,29401,30141,23621,39545,33738,\r
+23616,21632,30697,20030,27822,32858,25298,25454,24040,20855,36317,36382,38191,\r
+20465,21477,24807,28844,21095,25424,40515,23071,20518,30519,21367,32482,25733,\r
+25899,25225,25496,20500,29237,35273,20915,35776,32477,22343,33740,38055,20891,\r
+21531,23803,20426,31459,27994,37089,39567,21888,21654,21345,21679,24320,25577,\r
+26999,20975,24936,21002,22570,21208,22350,30733,30475,24247,24951,31968,25179,\r
+25239,20130,28821,32771,25335,28900,38752,22391,33499,26607,26869,30933,39063,\r
+31185,22771,21683,21487,28212,20811,21051,23458,35838,32943,21827,22438,24691,\r
+22353,21549,31354,24656,23380,25511,25248,21475,25187,23495,26543,21741,31391,\r
+33510,37239,24211,35044,22840,22446,25358,36328,33007,22359,31607,20393,24555,\r
+23485,27454,21281,31568,29378,26694,30719,30518,26103,20917,20111,30420,23743,\r
+31397,33909,22862,39745,20608,39304,24871,28291,22372,26118,25414,22256,25324,\r
+25193,24275,38420,22403,25289,21895,34593,33098,36771,21862,33713,26469,36182,\r
+34013,23146,26639,25318,31726,38417,20848,28572,35888,25597,35272,25042,32518,\r
+28866,28389,29701,27028,29436,24266,37070,26391,28010,25438,21171,29282,32769,\r
+20332,23013,37226,28889,28061,21202,20048,38647,38253,34174,30922,32047,20769,\r
+22418,25794,32907,31867,27882,26865,26974,20919,21400,26792,29313,40654,31729,\r
+29432,31163,28435,29702,26446,37324,40100,31036,33673,33620,21519,26647,20029,\r
+21385,21169,30782,21382,21033,20616,20363,20432,30178,31435,31890,27813,38582,\r
+21147,29827,21737,20457,32852,33714,36830,38256,24265,24604,28063,24088,25947,\r
+33080,38142,24651,28860,32451,31918,20937,26753,31921,33391,20004,36742,37327,\r
+26238,20142,35845,25769,32842,20698,30103,29134,23525,36797,28518,20102,25730,\r
+38243,24278,26009,21015,35010,28872,21155,29454,29747,26519,30967,38678,20020,\r
+37051,40158,28107,20955,36161,21533,25294,29618,33777,38646,40836,38083,20278,\r
+32666,20940,28789,38517,23725,39046,21478,20196,28316,29705,27060,30827,39311,\r
+30041,21016,30244,27969,26611,20845,40857,32843,21657,31548,31423,38534,22404,\r
+25314,38471,27004,23044,25602,31699,28431,38475,33446,21346,39045,24208,28809,\r
+25523,21348,34383,40065,40595,30860,38706,36335,36162,40575,28510,31108,24405,\r
+38470,25134,39540,21525,38109,20387,26053,23653,23649,32533,34385,27695,24459,\r
+29575,28388,32511,23782,25371,23402,28390,21365,20081,25504,30053,25249,36718,\r
+20262,20177,27814,32438,35770,33821,34746,32599,36923,38179,31657,39585,35064,\r
+33853,27931,39558,32476,22920,40635,29595,30721,34434,39532,39554,22043,21527,\r
+22475,20080,40614,21334,36808,33033,30610,39314,34542,28385,34067,26364,24930,\r
+28459,35881,33426,33579,30450,27667,24537,33725,29483,33541,38170,27611,30683,\r
+38086,21359,33538,20882,24125,35980,36152,20040,29611,26522,26757,37238,38665,\r
+29028,27809,30473,23186,38209,27599,32654,26151,23504,22969,23194,38376,38391,\r
+20204,33804,33945,27308,30431,38192,29467,26790,23391,30511,37274,38753,31964,\r
+36855,35868,24357,31859,31192,35269,27852,34588,23494,24130,26825,30496,32501,\r
+20885,20813,21193,23081,32517,38754,33495,25551,30596,34256,31186,28218,24217,\r
+22937,34065,28781,27665,25279,30399,25935,24751,38397,26126,34719,40483,38125,\r
+21517,21629,35884,25720,25721,34321,27169,33180,30952,25705,39764,25273,26411,\r
+33707,22696,40664,27819,28448,23518,38476,35851,29279,26576,25287,29281,20137,\r
+22982,27597,22675,26286,24149,21215,24917,26408,30446,30566,29287,31302,25343,\r
+21738,21584,38048,37027,23068,32435,27670,20035,22902,32784,22856,21335,30007,\r
+38590,22218,25376,33041,24700,38393,28118,21602,39297,20869,23273,33021,22958,\r
+38675,20522,27877,23612,25311,20320,21311,33147,36870,28346,34091,25288,24180,\r
+30910,25781,25467,24565,23064,37247,40479,23615,25423,32834,23421,21870,38218,\r
+38221,28037,24744,26592,29406,20957,23425,25319,27870,29275,25197,38062,32445,\r
+33043,27987,20892,24324,22900,21162,24594,22899,26262,34384,30111,25386,25062,\r
+31983,35834,21734,27431,40485,27572,34261,21589,20598,27812,21866,36276,29228,\r
+24085,24597,29750,25293,25490,29260,24472,28227,27966,25856,28504,30424,30928,\r
+30460,30036,21028,21467,20051,24222,26049,32810,32982,25243,21638,21032,28846,\r
+34957,36305,27873,21624,32986,22521,35060,36180,38506,37197,20329,27803,21943,\r
+30406,30768,25256,28921,28558,24429,34028,26842,30844,31735,33192,26379,40527,\r
+25447,30896,22383,30738,38713,25209,25259,21128,29749,27607,21860,33086,30130,\r
+30382,21305,30174,20731,23617,35692,31687,20559,29255,39575,39128,28418,29922,\r
+31080,25735,30629,25340,39057,36139,21697,32856,20050,22378,33529,33805,24179,\r
+20973,29942,35780,23631,22369,27900,39047,23110,30772,39748,36843,31893,21078,\r
+25169,38138,20166,33670,33889,33769,33970,22484,26420,22275,26222,28006,35889,\r
+26333,28689,26399,27450,26646,25114,22971,19971,20932,28422,26578,27791,20854,\r
+26827,22855,27495,30054,23822,33040,40784,26071,31048,31041,39569,36215,23682,\r
+20062,20225,21551,22865,30732,22120,27668,36804,24323,27773,27875,35755,25488,\r
+24688,27965,29301,25190,38030,38085,21315,36801,31614,20191,35878,20094,40660,\r
+38065,38067,21069,28508,36963,27973,35892,22545,23884,27424,27465,26538,21595,\r
+33108,32652,22681,34103,24378,25250,27207,38201,25970,24708,26725,30631,20052,\r
+20392,24039,38808,25772,32728,23789,20431,31373,20999,33540,19988,24623,31363,\r
+38054,20405,20146,31206,29748,21220,33465,25810,31165,23517,27777,38738,36731,\r
+27682,20542,21375,28165,25806,26228,27696,24773,39031,35831,24198,29756,31351,\r
+31179,19992,37041,29699,27714,22234,37195,27845,36235,21306,34502,26354,36527,\r
+23624,39537,28192,21462,23094,40843,36259,21435,22280,39079,26435,37275,27849,\r
+20840,30154,25331,29356,21048,21149,32570,28820,30264,21364,40522,27063,30830,\r
+38592,35033,32676,28982,29123,20873,26579,29924,22756,25880,22199,35753,39286,\r
+25200,32469,24825,28909,22764,20161,20154,24525,38887,20219,35748,20995,22922,\r
+32427,25172,20173,26085,25102,33592,33993,33635,34701,29076,28342,23481,32466,\r
+20887,25545,26580,32905,33593,34837,20754,23418,22914,36785,20083,27741,20837,\r
+35109,36719,38446,34122,29790,38160,38384,28070,33509,24369,25746,27922,33832,\r
+33134,40131,22622,36187,19977,21441,20254,25955,26705,21971,20007,25620,39578,\r
+25195,23234,29791,33394,28073,26862,20711,33678,30722,26432,21049,27801,32433,\r
+20667,21861,29022,31579,26194,29642,33515,26441,23665,21024,29053,34923,38378,\r
+38485,25797,36193,33203,21892,27733,25159,32558,22674,20260,21830,36175,26188,\r
+19978,23578,35059,26786,25422,31245,28903,33421,21242,38902,23569,21736,37045,\r
+32461,22882,36170,34503,33292,33293,36198,25668,23556,24913,28041,31038,35774,\r
+30775,30003,21627,20280,36523,28145,23072,32453,31070,27784,23457,23158,29978,\r
+32958,24910,28183,22768,29983,29989,29298,21319,32499,30465,30427,21097,32988,\r
+22307,24072,22833,29422,26045,28287,35799,23608,34417,21313,30707,25342,26102,\r
+20160,39135,34432,23454,35782,21490,30690,20351,23630,39542,22987,24335,31034,\r
+22763,19990,26623,20107,25325,35475,36893,21183,26159,21980,22124,36866,20181,\r
+20365,37322,39280,27663,24066,24643,23460,35270,35797,25910,25163,39318,23432,\r
+23551,25480,21806,21463,30246,20861,34092,26530,26803,27530,25234,36755,21460,\r
+33298,28113,30095,20070,36174,23408,29087,34223,26257,26329,32626,34560,40653,\r
+40736,23646,26415,36848,26641,26463,25101,31446,22661,24246,25968,28465,24661,\r
+21047,32781,25684,34928,29993,24069,26643,25332,38684,21452,29245,35841,27700,\r
+30561,31246,21550,30636,39034,33308,35828,30805,26388,28865,26031,25749,22070,\r
+24605,31169,21496,19997,27515,32902,23546,21987,22235,20282,20284,39282,24051,\r
+26494,32824,24578,39042,36865,23435,35772,35829,25628,33368,25822,22013,33487,\r
+37221,20439,32032,36895,31903,20723,22609,28335,23487,35785,32899,37240,33948,\r
+31639,34429,38539,38543,32485,39635,30862,23681,31319,36930,38567,31071,23385,\r
+25439,31499,34001,26797,21766,32553,29712,32034,38145,25152,22604,20182,23427,\r
+22905,22612,29549,25374,36427,36367,32974,33492,25260,21488,27888,37214,22826,\r
+24577,27760,22349,25674,36138,30251,28393,22363,27264,30192,28525,35885,35848,\r
+22374,27631,34962,30899,25506,21497,28845,27748,22616,25642,22530,26848,33179,\r
+21776,31958,20504,36538,28108,36255,28907,25487,28059,28372,32486,33796,26691,\r
+36867,28120,38518,35752,22871,29305,34276,33150,30140,35466,26799,21076,36386,\r
+38161,25552,39064,36420,21884,20307,26367,22159,24789,28053,21059,23625,22825,\r
+28155,22635,30000,29980,24684,33300,33094,25361,26465,36834,30522,36339,36148,\r
+38081,24086,21381,21548,28867,27712,24311,20572,20141,24237,25402,33351,36890,\r
+26704,37230,30643,21516,38108,24420,31461,26742,25413,31570,32479,30171,20599,\r
+25237,22836,36879,20984,31171,31361,22270,24466,36884,28034,23648,22303,21520,\r
+20820,28237,22242,25512,39059,33151,34581,35114,36864,21534,23663,33216,25302,\r
+25176,33073,40501,38464,39534,39548,26925,22949,25299,21822,25366,21703,34521,\r
+27964,23043,29926,34972,27498,22806,35916,24367,28286,29609,39037,20024,28919,\r
+23436,30871,25405,26202,30358,24779,23451,23113,19975,33109,27754,29579,20129,\r
+26505,32593,24448,26106,26395,24536,22916,23041,24013,24494,21361,38886,36829,\r
+26693,22260,21807,24799,20026,28493,32500,33479,33806,22996,20255,20266,23614,\r
+32428,26410,34074,21619,30031,32963,21890,39759,20301,28205,35859,23561,24944,\r
+21355,30239,28201,34442,25991,38395,32441,21563,31283,32010,38382,21985,32705,\r
+29934,25373,34583,28065,31389,25105,26017,21351,25569,27779,24043,21596,38056,\r
+20044,27745,35820,23627,26080,33436,26791,21566,21556,27595,27494,20116,25410,\r
+21320,33310,20237,20398,22366,25098,38654,26212,29289,21247,21153,24735,35823,\r
+26132,29081,26512,35199,30802,30717,26224,22075,21560,38177,29306,31232,24687,\r
+24076,24713,33181,22805,24796,29060,28911,28330,27728,29312,27268,34989,24109,\r
+20064,23219,21916,38115,27927,31995,38553,25103,32454,30606,34430,21283,38686,\r
+36758,26247,23777,20384,29421,19979,21414,22799,21523,25472,38184,20808,20185,\r
+40092,32420,21688,36132,34900,33335,38386,28046,24358,23244,26174,38505,29616,\r
+29486,21439,33146,39301,32673,23466,38519,38480,32447,30456,21410,38262,39321,\r
+31665,35140,28248,20065,32724,31077,35814,24819,21709,20139,39033,24055,27233,\r
+20687,21521,35937,33831,30813,38660,21066,21742,22179,38144,28040,23477,28102,\r
+26195,23567,23389,26657,32918,21880,31505,25928,26964,20123,27463,34638,38795,\r
+21327,25375,25658,37034,26012,32961,35856,20889,26800,21368,34809,25032,27844,\r
+27899,35874,23633,34218,33455,38156,27427,36763,26032,24571,24515,20449,34885,\r
+26143,33125,29481,24826,20852,21009,22411,24418,37026,34892,37266,24184,26447,\r
+24615,22995,20804,20982,33016,21256,27769,38596,29066,20241,20462,32670,26429,\r
+21957,38152,31168,34966,32483,22687,25100,38656,34394,22040,39035,24464,35768,\r
+33988,37207,21465,26093,24207,30044,24676,32110,23167,32490,32493,36713,21927,\r
+23459,24748,26059,29572,36873,30307,30505,32474,38772,34203,23398,31348,38634,\r
+34880,21195,29071,24490,26092,35810,23547,39535,24033,27529,27739,35757,35759,\r
+36874,36805,21387,25276,40486,40493,21568,20011,33469,29273,34460,23830,34905,\r
+28079,38597,21713,20122,35766,28937,21693,38409,28895,28153,30416,20005,30740,\r
+34578,23721,24310,35328,39068,38414,28814,27839,22852,25513,30524,34893,28436,\r
+33395,22576,29141,21388,30746,38593,21761,24422,28976,23476,35866,39564,27523,\r
+22830,40495,31207,26472,25196,20335,30113,32650,27915,38451,27687,20208,30162,\r
+20859,26679,28478,36992,33136,22934,29814,25671,23591,36965,31377,35875,23002,\r
+21676,33280,33647,35201,32768,26928,22094,32822,29239,37326,20918,20063,39029,\r
+25494,19994,21494,26355,33099,22812,28082,19968,22777,21307,25558,38129,20381,\r
+20234,34915,39056,22839,36951,31227,20202,33008,30097,27778,23452,23016,24413,\r
+26885,34433,20506,24050,20057,30691,20197,33402,25233,26131,37009,23673,20159,\r
+24441,33222,36920,32900,30123,20134,35028,24847,27589,24518,20041,30410,28322,\r
+35811,35758,35850,35793,24322,32764,32716,32462,33589,33643,22240,27575,38899,\r
+38452,23035,21535,38134,28139,23493,39278,23609,24341,38544,21360,33521,27185,\r
+23156,40560,24212,32552,33721,33828,33829,33639,34631,36814,36194,30408,24433,\r
+39062,30828,26144,21727,25317,20323,33219,30152,24248,38605,36362,34553,21647,\r
+27891,28044,27704,24703,21191,29992,24189,20248,24736,24551,23588,30001,37038,\r
+38080,29369,27833,28216,37193,26377,21451,21491,20305,37321,35825,21448,24188,\r
+36802,28132,20110,30402,27014,34398,24858,33286,20313,20446,36926,40060,24841,\r
+28189,28180,38533,20104,23089,38632,19982,23679,31161,23431,35821,32701,29577,\r
+22495,33419,37057,21505,36935,21947,23786,24481,24840,27442,29425,32946,35465,\r
+28020,23507,35029,39044,35947,39533,40499,28170,20900,20803,22435,34945,21407,\r
+25588,36757,22253,21592,22278,29503,28304,32536,36828,33489,24895,24616,38498,\r
+26352,32422,36234,36291,38053,23731,31908,26376,24742,38405,32792,20113,37095,\r
+21248,38504,20801,36816,34164,37213,26197,38901,23381,21277,30776,26434,26685,\r
+21705,28798,23472,36733,20877,22312,21681,25874,26242,36190,36163,33039,33900,\r
+36973,31967,20991,34299,26531,26089,28577,34468,36481,22122,36896,30338,28790,\r
+29157,36131,25321,21017,27901,36156,24590,22686,24974,26366,36192,25166,21939,\r
+28195,26413,36711,38113,38392,30504,26629,27048,21643,20045,28856,35784,25688,\r
+25995,23429,31364,20538,23528,30651,27617,35449,31896,27838,30415,26025,36759,\r
+23853,23637,34360,26632,21344,25112,31449,28251,32509,27167,31456,24432,28467,\r
+24352,25484,28072,26454,19976,24080,36134,20183,32960,30260,38556,25307,26157,\r
+25214,27836,36213,29031,32617,20806,32903,21484,36974,25240,21746,34544,36761,\r
+32773,38167,34071,36825,27993,29645,26015,30495,29956,30759,33275,36126,38024,\r
+20390,26517,30137,35786,38663,25391,38215,38453,33976,25379,30529,24449,29424,\r
+20105,24596,25972,25327,27491,25919,24103,30151,37073,35777,33437,26525,25903,\r
+21553,34584,30693,32930,33026,27713,20043,32455,32844,30452,26893,27542,25191,\r
+20540,20356,22336,25351,27490,36286,21482,26088,32440,24535,25370,25527,33267,\r
+33268,32622,24092,23769,21046,26234,31209,31258,36136,28825,30164,28382,27835,\r
+31378,20013,30405,24544,38047,34935,32456,31181,32959,37325,20210,20247,33311,\r
+21608,24030,27954,35788,31909,36724,32920,24090,21650,30385,23449,26172,39588,\r
+29664,26666,34523,26417,29482,35832,35803,36880,31481,28891,29038,25284,30633,\r
+22065,20027,33879,26609,21161,34496,36142,38136,31569,20303,27880,31069,39547,\r
+25235,29226,25341,19987,30742,36716,25776,36186,31686,26729,24196,35013,22918,\r
+25758,22766,29366,26894,38181,36861,36184,22368,32512,35846,20934,25417,25305,\r
+21331,26700,29730,33537,37196,21828,30528,28796,27978,20857,21672,36164,23039,\r
+28363,28100,23388,32043,20180,31869,28371,23376,33258,28173,23383,39683,26837,\r
+36394,23447,32508,24635,32437,37049,36208,22863,25549,31199,36275,21330,26063,\r
+31062,35781,38459,32452,38075,32386,22068,37257,26368,32618,23562,36981,26152,\r
+24038,20304,26590,20570,20316,22352,24231,20109,19980,20800,19984,24319,21317,\r
+19989,20120,19998,39730,23404,22121,20008,31162,20031,21269,20039,22829,29243,\r
+21358,27664,22239,32996,39319,27603,30590,40727,20022,20127,40720,20060,20073,\r
+20115,33416,23387,21868,22031,20164,21389,21405,21411,21413,21422,38757,36189,\r
+21274,21493,21286,21294,21310,36188,21350,21347,20994,21000,21006,21037,21043,\r
+21055,21056,21068,21086,21089,21084,33967,21117,21122,21121,21136,21139,20866,\r
+32596,20155,20163,20169,20162,20200,20193,20203,20190,20251,20211,20258,20324,\r
+20213,20261,20263,20233,20267,20318,20327,25912,20314,20317,20319,20311,20274,\r
+20285,20342,20340,20369,20361,20355,20367,20350,20347,20394,20348,20396,20372,\r
+20454,20456,20458,20421,20442,20451,20444,20433,20447,20472,20521,20556,20467,\r
+20524,20495,20526,20525,20478,20508,20492,20517,20520,20606,20547,20565,20552,\r
+20558,20588,20603,20645,20647,20649,20666,20694,20742,20717,20716,20710,20718,\r
+20743,20747,20189,27709,20312,20325,20430,40864,27718,31860,20846,24061,40649,\r
+39320,20865,22804,21241,21261,35335,21264,20971,22809,20821,20128,20822,20147,\r
+34926,34980,20149,33044,35026,31104,23348,34819,32696,20907,20913,20925,20924,\r
+20935,20886,20898,20901,35744,35750,35751,35754,35764,35765,35767,35778,35779,\r
+35787,35791,35790,35794,35795,35796,35798,35800,35801,35804,35807,35808,35812,\r
+35816,35817,35822,35824,35827,35830,35833,35836,35839,35840,35842,35844,35847,\r
+35852,35855,35857,35858,35860,35861,35862,35865,35867,35864,35869,35871,35872,\r
+35873,35877,35879,35882,35883,35886,35887,35890,35891,35893,35894,21353,21370,\r
+38429,38434,38433,38449,38442,38461,38460,38466,38473,38484,38495,38503,38508,\r
+38514,38516,38536,38541,38551,38576,37015,37019,37021,37017,37036,37025,37044,\r
+37043,37046,37050,37048,37040,37071,37061,37054,37072,37060,37063,37075,37094,\r
+37090,37084,37079,37083,37099,37103,37118,37124,37154,37150,37155,37169,37167,\r
+37177,37187,37190,21005,22850,21154,21164,21165,21182,21759,21200,21206,21232,\r
+21471,29166,30669,24308,20981,20988,39727,21430,24321,30042,24047,22348,22441,\r
+22433,22654,22716,22725,22737,22313,22316,22314,22323,22329,22318,22319,22364,\r
+22331,22338,22377,22405,22379,22406,22396,22395,22376,22381,22390,22387,22445,\r
+22436,22412,22450,22479,22439,22452,22419,22432,22485,22488,22490,22489,22482,\r
+22456,22516,22511,22520,22500,22493,22539,22541,22525,22509,22528,22558,22553,\r
+22596,22560,22629,22636,22657,22665,22682,22656,39336,40729,25087,33401,33405,\r
+33407,33423,33418,33448,33412,33422,33425,33431,33433,33451,33464,33470,33456,\r
+33480,33482,33507,33432,33463,33454,33483,33484,33473,33449,33460,33441,33450,\r
+33439,33476,33486,33444,33505,33545,33527,33508,33551,33543,33500,33524,33490,\r
+33496,33548,33531,33491,33553,33562,33542,33556,33557,33504,33493,33564,33617,\r
+33627,33628,33544,33682,33596,33588,33585,33691,33630,33583,33615,33607,33603,\r
+33631,33600,33559,33632,33581,33594,33587,33638,33637,33640,33563,33641,33644,\r
+33642,33645,33646,33712,33656,33715,33716,33696,33706,33683,33692,33669,33660,\r
+33718,33705,33661,33720,33659,33688,33694,33704,33722,33724,33729,33793,33765,\r
+33752,22535,33816,33803,33757,33789,33750,33820,33848,33809,33798,33748,33759,\r
+33807,33795,33784,33785,33770,33733,33728,33830,33776,33761,33884,33873,33882,\r
+33881,33907,33927,33928,33914,33929,33912,33852,33862,33897,33910,33932,33934,\r
+33841,33901,33985,33997,34000,34022,33981,34003,33994,33983,33978,34016,33953,\r
+33977,33972,33943,34021,34019,34060,29965,34104,34032,34105,34079,34106,34134,\r
+34107,34047,34044,34137,34120,34152,34148,34142,34170,30626,34115,34162,34171,\r
+34212,34216,34183,34191,34169,34222,34204,34181,34233,34231,34224,34259,34241,\r
+34268,34303,34343,34309,34345,34326,34364,24318,24328,22844,22849,32823,22869,\r
+22874,22872,21263,23586,23589,23596,23604,25164,25194,25247,25275,25290,25306,\r
+25303,25326,25378,25334,25401,25419,25411,25517,25590,25457,25466,25486,25524,\r
+25453,25516,25482,25449,25518,25532,25586,25592,25568,25599,25540,25566,25550,\r
+25682,25542,25534,25669,25665,25611,25627,25632,25612,25638,25633,25694,25732,\r
+25709,25750,25722,25783,25784,25753,25786,25792,25808,25815,25828,25826,25865,\r
+25893,25902,24331,24530,29977,24337,21343,21489,21501,21481,21480,21499,21522,\r
+21526,21510,21579,21586,21587,21588,21590,21571,21537,21591,21593,21539,21554,\r
+21634,21652,21623,21617,21604,21658,21659,21636,21622,21606,21661,21712,21677,\r
+21698,21684,21714,21671,21670,21715,21716,21618,21667,21717,21691,21695,21708,\r
+21721,21722,21724,21673,21674,21668,21725,21711,21726,21787,21735,21792,21757,\r
+21780,21747,21794,21795,21775,21777,21799,21802,21863,21903,21941,21833,21869,\r
+21825,21845,21823,21840,21820,21815,21846,21877,21878,21879,21811,21808,21852,\r
+21899,21970,21891,21937,21945,21896,21889,21919,21886,21974,21905,21883,21983,\r
+21949,21950,21908,21913,21994,22007,21961,22047,21969,21995,21996,21972,21990,\r
+21981,21956,21999,21989,22002,22003,21964,21965,21992,22005,21988,36756,22046,\r
+22024,22028,22017,22052,22051,22014,22016,22055,22061,22104,22073,22103,22060,\r
+22093,22114,22105,22108,22092,22100,22150,22116,22129,22123,22139,22140,22149,\r
+22163,22191,22228,22231,22237,22241,22261,22251,22265,22271,22276,22282,22281,\r
+22300,24079,24089,24084,24081,24113,24123,24124,24119,24132,24148,24155,24158,\r
+24161,23692,23674,23693,23696,23702,23688,23704,23705,23697,23706,23708,23733,\r
+23714,23741,23724,23723,23729,23715,23745,23735,23748,23762,23780,23755,23781,\r
+23810,23811,23847,23846,23854,23844,23838,23814,23835,23896,23870,23860,23869,\r
+23916,23899,23919,23901,23915,23883,23882,23913,23924,23938,23961,23965,35955,\r
+23991,24005,24435,24439,24450,24455,24457,24460,24469,24473,24476,24488,24493,\r
+24501,24508,34914,24417,29357,29360,29364,29367,29368,29379,29377,29390,29389,\r
+29394,29416,29423,29417,29426,29428,29431,29441,29427,29443,29434,29435,29463,\r
+29459,29473,29450,29470,29469,29461,29474,29497,29477,29484,29496,29489,29520,\r
+29517,29527,29536,29548,29551,29566,33307,22821,39143,22820,22786,39267,39271,\r
+39272,39273,39274,39275,39276,39284,39287,39293,39296,39300,39303,39306,39309,\r
+39312,39313,39315,39316,39317,24192,24209,24203,24214,24229,24224,24249,24245,\r
+24254,24243,36179,24274,24273,24283,24296,24298,33210,24516,24521,24534,24527,\r
+24579,24558,24580,24545,24548,24574,24581,24582,24554,24557,24568,24601,24629,\r
+24614,24603,24591,24589,24617,24619,24586,24639,24609,24696,24697,24699,24698,\r
+24642,24682,24701,24726,24730,24749,24733,24707,24722,24716,24731,24812,24763,\r
+24753,24797,24792,24774,24794,24756,24864,24870,24853,24867,24820,24832,24846,\r
+24875,24906,24949,25004,24980,24999,25015,25044,25077,24541,38579,38377,38379,\r
+38385,38387,38389,38390,38396,38398,38403,38404,38406,38408,38410,38411,38412,\r
+38413,38415,38418,38421,38422,38423,38425,38426,20012,29247,25109,27701,27732,\r
+27740,27722,27811,27781,27792,27796,27788,27752,27753,27764,27766,27782,27817,\r
+27856,27860,27821,27895,27896,27889,27863,27826,27872,27862,27898,27883,27886,\r
+27825,27859,27887,27902,27961,27943,27916,27971,27976,27911,27908,27929,27918,\r
+27947,27981,27950,27957,27930,27983,27986,27988,27955,28049,28015,28062,28064,\r
+27998,28051,28052,27996,28000,28028,28003,28186,28103,28101,28126,28174,28095,\r
+28128,28177,28134,28125,28121,28182,28075,28172,28078,28203,28270,28238,28267,\r
+28338,28255,28294,28243,28244,28210,28197,28228,28383,28337,28312,28384,28461,\r
+28386,28325,28327,28349,28347,28343,28375,28340,28367,28303,28354,28319,28514,\r
+28486,28487,28452,28437,28409,28463,28470,28491,28532,28458,28425,28457,28553,\r
+28557,28556,28536,28530,28540,28538,28625,28617,28583,28601,28598,28610,28641,\r
+28654,28638,28640,28655,28698,28707,28699,28729,28725,28751,28766,23424,23428,\r
+23445,23443,23461,23480,29999,39582,25652,23524,23534,35120,23536,36423,35591,\r
+36790,36819,36821,36837,36846,36836,36841,36838,36851,36840,36869,36868,36875,\r
+36902,36881,36877,36886,36897,36917,36918,36909,36911,36932,36945,36946,36944,\r
+36968,36952,36962,36955,26297,36980,36989,36994,37000,36995,37003,24400,24407,\r
+24406,24408,23611,21675,23632,23641,23409,23651,23654,32700,24362,24361,24365,\r
+33396,24380,39739,23662,22913,22915,22925,22953,22954,22947,22935,22986,22955,\r
+22942,22948,22994,22962,22959,22999,22974,23045,23046,23005,23048,23011,23000,\r
+23033,23052,23049,23090,23092,23057,23075,23059,23104,23143,23114,23125,23100,\r
+23138,23157,33004,23210,23195,23159,23162,23230,23275,23218,23250,23252,23224,\r
+23264,23267,23281,23254,23270,23256,23260,23305,23319,23318,23346,23351,23360,\r
+23573,23580,23386,23397,23411,23377,23379,23394,39541,39543,39544,39546,39551,\r
+39549,39552,39553,39557,39560,39562,39568,39570,39571,39574,39576,39579,39580,\r
+39581,39583,39584,39586,39587,39589,39591,32415,32417,32419,32421,32424,32425,\r
+32429,32432,32446,32448,32449,32450,32457,32459,32460,32464,32468,32471,32475,\r
+32480,32481,32488,32491,32494,32495,32497,32498,32525,32502,32506,32507,32510,\r
+32513,32514,32515,32519,32520,32523,32524,32527,32529,32530,32535,32537,32540,\r
+32539,32543,32545,32546,32547,32548,32549,32550,32551,32554,32555,32556,32557,\r
+32559,32560,32561,32562,32563,32565,24186,30079,24027,30014,37013,29582,29585,\r
+29614,29602,29599,29647,29634,29649,29623,29619,29632,29641,29640,29669,29657,\r
+39036,29706,29673,29671,29662,29626,29682,29711,29738,29787,29734,29733,29736,\r
+29744,29742,29740,29723,29722,29761,29788,29783,29781,29785,29815,29805,29822,\r
+29852,29838,29824,29825,29831,29835,29854,29864,29865,29840,29863,29906,29882,\r
+38890,38891,38892,26444,26451,26462,26440,26473,26533,26503,26474,26483,26520,\r
+26535,26485,26536,26526,26541,26507,26487,26492,26608,26633,26584,26634,26601,\r
+26544,26636,26585,26549,26586,26547,26589,26624,26563,26552,26594,26638,26561,\r
+26621,26674,26675,26720,26721,26702,26722,26692,26724,26755,26653,26709,26726,\r
+26689,26727,26688,26686,26698,26697,26665,26805,26767,26740,26743,26771,26731,\r
+26818,26990,26876,26911,26912,26873,26916,26864,26891,26881,26967,26851,26896,\r
+26993,26937,26976,26946,26973,27012,26987,27008,27032,27000,26932,27084,27015,\r
+27016,27086,27017,26982,26979,27001,27035,27047,27067,27051,27053,27092,27057,\r
+27073,27082,27103,27029,27104,27021,27135,27183,27117,27159,27160,27237,27122,\r
+27204,27198,27296,27216,27227,27189,27278,27257,27197,27176,27224,27260,27281,\r
+27280,27305,27287,27307,29495,29522,27521,27522,27527,27524,27538,27539,27533,\r
+27546,27547,27553,27562,36715,36717,36721,36722,36723,36725,36726,36728,36727,\r
+36729,36730,36732,36734,36737,36738,36740,36743,36747,36749,36750,36751,36760,\r
+36762,36558,25099,25111,25115,25119,25122,25121,25125,25124,25132,33255,29935,\r
+29940,29951,29967,29969,29971,25908,26094,26095,26096,26122,26137,26482,26115,\r
+26133,26112,28805,26359,26141,26164,26161,26166,26165,32774,26207,26196,26177,\r
+26191,26198,26209,26199,26231,26244,26252,26279,26269,26302,26331,26332,26342,\r
+26345,36146,36147,36150,36155,36157,36160,36165,36166,36168,36169,36167,36173,\r
+36181,36185,35271,35274,35275,35276,35278,35279,35280,35281,29294,29343,29277,\r
+29286,29295,29310,29311,29316,29323,29325,29327,29330,25352,25394,25520,25663,\r
+25816,32772,27626,27635,27645,27637,27641,27653,27655,27654,27661,27669,27672,\r
+27673,27674,27681,27689,27684,27690,27698,25909,25941,25963,29261,29266,29270,\r
+29232,34402,21014,32927,32924,32915,32956,26378,32957,32945,32939,32941,32948,\r
+32951,32999,33000,33001,33002,32987,32962,32964,32985,32973,32983,26384,32989,\r
+33003,33009,33012,33005,33037,33038,33010,33020,26389,33042,35930,33078,33054,\r
+33068,33048,33074,33096,33100,33107,33140,33113,33114,33137,33120,33129,33148,\r
+33149,33133,33127,22605,23221,33160,33154,33169,28373,33187,33194,33228,26406,\r
+33226,33211,33217,33190,27428,27447,27449,27459,27462,27481,39121,39122,39123,\r
+39125,39129,39130,27571,24384,27586,35315,26000,40785,26003,26044,26054,26052,\r
+26051,26060,26062,26066,26070,28800,28828,28822,28829,28859,28864,28855,28843,\r
+28849,28904,28874,28944,28947,28950,28975,28977,29043,29020,29032,28997,29042,\r
+29002,29048,29050,29080,29107,29109,29096,29088,29152,29140,29159,29177,29213,\r
+29224,28780,28952,29030,29113,25150,25149,25155,25160,25161,31035,31040,31046,\r
+31049,31067,31068,31059,31066,31074,31063,31072,31087,31079,31098,31109,31114,\r
+31130,31143,31155,24529,24528,24636,24669,24666,24679,24641,24665,24675,24747,\r
+24838,24845,24925,25001,24989,25035,25041,25094,32896,32895,27795,27894,28156,\r
+30710,30712,30720,30729,30743,30744,30737,26027,30765,30748,30749,30777,30778,\r
+30779,30751,30780,30757,30764,30755,30761,30798,30829,30806,30807,30758,30800,\r
+30791,30796,30826,30875,30867,30874,30855,30876,30881,30883,30898,30905,30885,\r
+30932,30937,30921,30956,30962,30981,30964,30995,31012,31006,31028,40859,40697,\r
+40699,40700,30449,30468,30477,30457,30471,30472,30490,30498,30489,30509,30502,\r
+30517,30520,30544,30545,30535,30531,30554,30568,30562,30565,30591,30605,30589,\r
+30592,30604,30609,30623,30624,30640,30645,30653,30010,30016,30030,30027,30024,\r
+30043,30066,30073,30083,32600,32609,32607,35400,32616,32628,32625,32633,32641,\r
+32638,30413,30437,34866,38021,38022,38023,38027,38026,38028,38029,38031,38032,\r
+38036,38039,38037,38042,38043,38044,38051,38052,38059,38058,38061,38060,38063,\r
+38064,38066,38068,38070,38071,38072,38073,38074,38076,38077,38079,38084,38088,\r
+38089,38090,38091,38092,38093,38094,38096,38097,38098,38101,38102,38103,38105,\r
+38104,38107,38110,38111,38112,38114,38116,38117,38119,38120,38122,38121,38123,\r
+38126,38127,38131,38132,38133,38135,38137,38140,38141,38143,38147,38146,38150,\r
+38151,38153,38154,38157,38158,38159,38162,38163,38164,38165,38166,38168,38171,\r
+38173,38174,38175,38178,38186,38187,38185,38188,38193,38194,38196,38198,38199,\r
+38200,38204,38206,38207,38210,38197,38212,38213,38214,38217,38220,38222,38223,\r
+38226,38227,38228,38230,38231,38232,38233,38235,38238,38239,38237,38241,38242,\r
+38244,38245,38246,38247,38248,38249,38250,38251,38252,38255,38257,38258,38259,\r
+38202,30695,30700,38601,31189,31213,31203,31211,31238,23879,31235,31234,31262,\r
+31252,31289,31287,31313,40655,39333,31344,30344,30350,30355,30361,30372,29918,\r
+29920,29996,40480,40482,40488,40489,40490,40491,40492,40498,40497,40502,40504,\r
+40503,40505,40506,40510,40513,40514,40516,40518,40519,40520,40521,40523,40524,\r
+40526,40529,40533,40535,40538,40539,40540,40542,40547,40550,40551,40552,40553,\r
+40554,40555,40556,40561,40557,40563,30098,30100,30102,30112,30109,30124,30115,\r
+30131,30132,30136,30148,30129,30128,30147,30146,30166,30157,30179,30184,30182,\r
+30180,30187,30183,30211,30193,30204,30207,30224,30208,30213,30220,30231,30218,\r
+30245,30232,30229,30233,30235,30268,30242,30240,30272,30253,30256,30271,30261,\r
+30275,30270,30259,30285,30302,30292,30300,30294,30315,30319,32714,31462,31352,\r
+31353,31360,31366,31368,31381,31398,31392,31404,31400,31405,31411,34916,34921,\r
+34930,34941,34943,34946,34978,35014,34999,35004,35017,35042,35022,35043,35045,\r
+35057,35098,35068,35048,35070,35056,35105,35097,35091,35099,35082,35124,35115,\r
+35126,35137,35174,35195,30091,32997,30386,30388,30684,32786,32788,32790,32796,\r
+32800,32802,32805,32806,32807,32809,32808,32817,32779,32821,32835,32838,32845,\r
+32850,32873,32881,35203,39032,39040,39043,39049,39052,39053,39055,39060,39066,\r
+39067,39070,39071,39073,39074,39077,39078,34381,34388,34412,34414,34431,34426,\r
+34428,34427,34472,34445,34443,34476,34461,34471,34467,34474,34451,34473,34486,\r
+34500,34485,34510,34480,34490,34481,34479,34505,34511,34484,34537,34545,34546,\r
+34541,34547,34512,34579,34526,34548,34527,34520,34513,34563,34567,34552,34568,\r
+34570,34573,34569,34595,34619,34590,34597,34606,34586,34622,34632,34612,34609,\r
+34601,34615,34623,34690,34594,34685,34686,34683,34656,34672,34636,34670,34699,\r
+34643,34659,34684,34660,34649,34661,34707,34735,34728,34770,34758,34696,34693,\r
+34733,34711,34691,34731,34789,34732,34741,34739,34763,34771,34749,34769,34752,\r
+34762,34779,34794,34784,34798,34838,34835,34814,34826,34843,34849,34873,34876,\r
+32566,32578,32580,32581,33296,31482,31485,31496,31491,31492,31509,31498,31531,\r
+31503,31559,31544,31530,31513,31534,31537,31520,31525,31524,31539,31550,31518,\r
+31576,31578,31557,31605,31564,31581,31584,31598,31611,31586,31602,31601,31632,\r
+31654,31655,31672,31660,31645,31656,31621,31658,31644,31650,31659,31668,31697,\r
+31681,31692,31709,31706,31717,31718,31722,31756,31742,31740,31759,31766,31755,\r
+31775,31786,31782,31800,31809,31808,33278,33281,33282,33284,33260,34884,33313,\r
+33314,33315,33325,33327,33320,33323,33336,33339,33331,33332,33342,33348,33353,\r
+33355,33359,33370,33375,33384,34942,34949,34952,35032,35039,35166,32669,32671,\r
+32679,32687,32688,32690,31868,25929,31889,31901,31900,31902,31906,31922,31932,\r
+31933,31937,31943,31948,31949,31944,31941,31959,31976,33390,26280,32703,32718,\r
+32725,32741,32737,32742,32745,32750,32755,31992,32119,32166,32174,32327,32411,\r
+40632,40628,36211,36228,36244,36241,36273,36199,36205,35911,35913,37194,37200,\r
+37198,37199,37220,37218,37217,37232,37225,37231,37245,37246,37234,37236,37241,\r
+37260,37253,37264,37261,37265,37282,37283,37290,37293,37294,37295,37301,37300,\r
+37306,35925,40574,36280,36331,36357,36441,36457,36277,36287,36284,36282,36292,\r
+36310,36311,36314,36318,36302,36303,36315,36294,36332,36343,36344,36323,36345,\r
+36347,36324,36361,36349,36372,36381,36383,36396,36398,36387,36399,36410,36416,\r
+36409,36405,36413,36401,36425,36417,36418,36433,36434,36426,36464,36470,36476,\r
+36463,36468,36485,36495,36500,36496,36508,36510,35960,35970,35978,35973,35992,\r
+35988,26011,35286,35294,35290,35292,35301,35307,35311,35390,35622,38739,38633,\r
+38643,38639,38662,38657,38664,38671,38670,38698,38701,38704,38718,40832,40835,\r
+40837,40838,40839,40840,40841,40842,40844,40702,40715,40717,38585,38588,38589,\r
+38606,38610,30655,38624,37518,37550,37576,37694,37738,37834,37775,37950,37995,\r
+40063,40066,40069,40070,40071,40072,31267,40075,40078,40080,40081,40082,40084,\r
+40085,40090,40091,40094,40095,40096,40097,40098,40099,40101,40102,40103,40104,\r
+40105,40107,40109,40110,40112,40113,40114,40115,40116,40117,40118,40119,40122,\r
+40123,40124,40125,40132,40133,40134,40135,40138,40139,40140,40141,40142,40143,\r
+40144,40147,40148,40149,40151,40152,40153,40156,40157,40159,40162,38780,38789,\r
+38801,38802,38804,38831,38827,38819,38834,38836,39601,39600,39607,40536,39606,\r
+39610,39612,39617,39616,39621,39618,39627,39628,39633,39749,39747,39751,39753,\r
+39752,39757,39761,39144,39181,39214,39253,39252,39647,39649,39654,39663,39659,\r
+39675,39661,39673,39688,39695,39699,39711,39715,40637,40638,32315,40578,40583,\r
+40584,40587,40594,37846,40605,40607,40667,40668,40669,40672,40671,40674,40681,\r
+40679,40677,40682,40687,40738,40748,40751,40761,40759,40765,40766,40772,\r
+};\r
+\r
+static const struct dbcs_index gb2312_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb2312_decmap+0,33,126},{__gb2312_decmap+94,\r
+49,124},{__gb2312_decmap+170,33,126},{__gb2312_decmap+264,33,115},{\r
+__gb2312_decmap+347,33,118},{__gb2312_decmap+433,33,88},{__gb2312_decmap+489,\r
+33,113},{__gb2312_decmap+570,33,105},{__gb2312_decmap+643,36,111},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb2312_decmap+719,33,126},{\r
+__gb2312_decmap+813,33,126},{__gb2312_decmap+907,33,126},{__gb2312_decmap+1001\r
+,33,126},{__gb2312_decmap+1095,33,126},{__gb2312_decmap+1189,33,126},{\r
+__gb2312_decmap+1283,33,126},{__gb2312_decmap+1377,33,126},{__gb2312_decmap+\r
+1471,33,126},{__gb2312_decmap+1565,33,126},{__gb2312_decmap+1659,33,126},{\r
+__gb2312_decmap+1753,33,126},{__gb2312_decmap+1847,33,126},{__gb2312_decmap+\r
+1941,33,126},{__gb2312_decmap+2035,33,126},{__gb2312_decmap+2129,33,126},{\r
+__gb2312_decmap+2223,33,126},{__gb2312_decmap+2317,33,126},{__gb2312_decmap+\r
+2411,33,126},{__gb2312_decmap+2505,33,126},{__gb2312_decmap+2599,33,126},{\r
+__gb2312_decmap+2693,33,126},{__gb2312_decmap+2787,33,126},{__gb2312_decmap+\r
+2881,33,126},{__gb2312_decmap+2975,33,126},{__gb2312_decmap+3069,33,126},{\r
+__gb2312_decmap+3163,33,126},{__gb2312_decmap+3257,33,126},{__gb2312_decmap+\r
+3351,33,126},{__gb2312_decmap+3445,33,126},{__gb2312_decmap+3539,33,126},{\r
+__gb2312_decmap+3633,33,126},{__gb2312_decmap+3727,33,126},{__gb2312_decmap+\r
+3821,33,126},{__gb2312_decmap+3915,33,126},{__gb2312_decmap+4009,33,126},{\r
+__gb2312_decmap+4103,33,126},{__gb2312_decmap+4197,33,126},{__gb2312_decmap+\r
+4291,33,126},{__gb2312_decmap+4385,33,121},{__gb2312_decmap+4474,33,126},{\r
+__gb2312_decmap+4568,33,126},{__gb2312_decmap+4662,33,126},{__gb2312_decmap+\r
+4756,33,126},{__gb2312_decmap+4850,33,126},{__gb2312_decmap+4944,33,126},{\r
+__gb2312_decmap+5038,33,126},{__gb2312_decmap+5132,33,126},{__gb2312_decmap+\r
+5226,33,126},{__gb2312_decmap+5320,33,126},{__gb2312_decmap+5414,33,126},{\r
+__gb2312_decmap+5508,33,126},{__gb2312_decmap+5602,33,126},{__gb2312_decmap+\r
+5696,33,126},{__gb2312_decmap+5790,33,126},{__gb2312_decmap+5884,33,126},{\r
+__gb2312_decmap+5978,33,126},{__gb2312_decmap+6072,33,126},{__gb2312_decmap+\r
+6166,33,126},{__gb2312_decmap+6260,33,126},{__gb2312_decmap+6354,33,126},{\r
+__gb2312_decmap+6448,33,126},{__gb2312_decmap+6542,33,126},{__gb2312_decmap+\r
+6636,33,126},{__gb2312_decmap+6730,33,126},{__gb2312_decmap+6824,33,126},{\r
+__gb2312_decmap+6918,33,126},{__gb2312_decmap+7012,33,126},{__gb2312_decmap+\r
+7106,33,126},{__gb2312_decmap+7200,33,126},{__gb2312_decmap+7294,33,126},{\r
+__gb2312_decmap+7388,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const ucs2_t __gbkext_decmap[14531] = {\r
+19970,19972,19973,19974,19983,19986,19991,19999,20000,20001,20003,20006,20009,\r
+20014,20015,20017,20019,20021,20023,20028,20032,20033,20034,20036,20038,20042,\r
+20049,20053,20055,20058,20059,20066,20067,20068,20069,20071,20072,20074,20075,\r
+20076,20077,20078,20079,20082,20084,20085,20086,20087,20088,20089,20090,20091,\r
+20092,20093,20095,20096,20097,20098,20099,20100,20101,20103,20106,U,20112,\r
+20118,20119,20121,20124,20125,20126,20131,20138,20143,20144,20145,20148,20150,\r
+20151,20152,20153,20156,20157,20158,20168,20172,20175,20176,20178,20186,20187,\r
+20188,20192,20194,20198,20199,20201,20205,20206,20207,20209,20212,20216,20217,\r
+20218,20220,20222,20224,20226,20227,20228,20229,20230,20231,20232,20235,20236,\r
+20242,20243,20244,20245,20246,20252,20253,20257,20259,20264,20265,20268,20269,\r
+20270,20273,20275,20277,20279,20281,20283,20286,20287,20288,20289,20290,20292,\r
+20293,20295,20296,20297,20298,20299,20300,20306,20308,20310,20321,20322,20326,\r
+20328,20330,20331,20333,20334,20337,20338,20341,20343,20344,20345,20346,20349,\r
+20352,20353,20354,20357,20358,20359,20362,20364,20366,20368,20370,20371,20373,\r
+20374,20376,20377,20378,20380,20382,20383,20385,20386,20388,20395,20397,20400,\r
+20401,20402,20403,20404,20406,20407,20408,20409,20410,20411,20412,20413,20414,\r
+20416,20417,20418,20422,20423,20424,20425,20427,20428,20429,20434,20435,20436,\r
+20437,20438,20441,20443,20448,20450,20452,20453,20455,20459,20460,20464,20466,\r
+20468,20469,20470,20471,20473,20475,20476,20477,20479,20480,20481,20482,20483,\r
+20484,20485,20486,20487,20488,20489,20490,U,20491,20494,20496,20497,20499,\r
+20501,20502,20503,20507,20509,20510,20512,20514,20515,20516,20519,20523,20527,\r
+20528,20529,20530,20531,20532,20533,20534,20535,20536,20537,20539,20541,20543,\r
+20544,20545,20546,20548,20549,20550,20553,20554,20555,20557,20560,20561,20562,\r
+20563,20564,20566,20567,20568,20569,20571,20573,20574,20575,20576,20577,20578,\r
+20579,20580,20582,20583,20584,20585,20586,20587,20589,20590,20591,20592,20593,\r
+20594,20595,20596,20597,20600,20601,20602,20604,20605,20609,20610,20611,20612,\r
+20614,20615,20617,20618,20619,20620,20622,20623,20624,20625,20626,20627,20628,\r
+20629,20630,20631,20632,20633,20634,20635,20636,20637,20638,20639,20640,20641,\r
+20642,20644,20646,20650,20651,20653,20654,20655,20656,20657,20659,20660,20661,\r
+20662,20663,20664,20665,20668,20669,20670,20671,20672,20673,20674,20675,20676,\r
+20677,20678,20679,20680,20681,20682,20683,20684,20685,20686,20688,20689,20690,\r
+20691,20692,20693,20695,20696,20697,20699,20700,20701,20702,20703,20704,20705,\r
+20706,20707,20708,20709,20712,20713,20714,20715,20719,20720,20721,20722,20724,\r
+20726,20727,20728,20729,20730,20732,20733,20734,20735,20736,20737,20738,20739,\r
+20740,20741,20744,U,20745,20746,20748,20749,20750,20751,20752,20753,20755,\r
+20756,20757,20758,20759,20760,20761,20762,20763,20764,20765,20766,20767,20768,\r
+20770,20771,20772,20773,20774,20775,20776,20777,20778,20779,20780,20781,20782,\r
+20783,20784,20785,20786,20787,20788,20789,20790,20791,20792,20793,20794,20795,\r
+20796,20797,20798,20802,20807,20810,20812,20814,20815,20816,20818,20819,20823,\r
+20824,20825,20827,20829,20830,20831,20832,20833,20835,20836,20838,20839,20841,\r
+20842,20847,20850,20858,20862,20863,20867,20868,20870,20871,20874,20875,20878,\r
+20879,20880,20881,20883,20884,20888,20890,20893,20894,20895,20897,20899,20902,\r
+20903,20904,20905,20906,20909,20910,20916,20920,20921,20922,20926,20927,20929,\r
+20930,20931,20933,20936,20938,20941,20942,20944,20946,20947,20948,20949,20950,\r
+20951,20952,20953,20954,20956,20958,20959,20962,20963,20965,20966,20967,20968,\r
+20969,20970,20972,20974,20977,20978,20980,20983,20990,20996,20997,21001,21003,\r
+21004,21007,21008,21011,21012,21013,21020,21022,21023,21025,21026,21027,21029,\r
+21030,21031,21034,21036,21039,21041,21042,21044,21045,21052,21054,21060,21061,\r
+21062,21063,21064,21065,21067,21070,21071,21074,21075,21077,21079,21080,U,\r
+21081,21082,21083,21085,21087,21088,21090,21091,21092,21094,21096,21099,21100,\r
+21101,21102,21104,21105,21107,21108,21109,21110,21111,21112,21113,21114,21115,\r
+21116,21118,21120,21123,21124,21125,21126,21127,21129,21130,21131,21132,21133,\r
+21134,21135,21137,21138,21140,21141,21142,21143,21144,21145,21146,21148,21156,\r
+21157,21158,21159,21166,21167,21168,21172,21173,21174,21175,21176,21177,21178,\r
+21179,21180,21181,21184,21185,21186,21188,21189,21190,21192,21194,21196,21197,\r
+21198,21199,21201,21203,21204,21205,21207,21209,21210,21211,21212,21213,21214,\r
+21216,21217,21218,21219,21221,21222,21223,21224,21225,21226,21227,21228,21229,\r
+21230,21231,21233,21234,21235,21236,21237,21238,21239,21240,21243,21244,21245,\r
+21249,21250,21251,21252,21255,21257,21258,21259,21260,21262,21265,21266,21267,\r
+21268,21272,21275,21276,21278,21279,21282,21284,21285,21287,21288,21289,21291,\r
+21292,21293,21295,21296,21297,21298,21299,21300,21301,21302,21303,21304,21308,\r
+21309,21312,21314,21316,21318,21323,21324,21325,21328,21332,21336,21337,21339,\r
+21341,21349,21352,21354,21356,21357,21362,21366,21369,21371,21372,21373,21374,\r
+21376,21377,21379,21383,21384,21386,21390,21391,U,21392,21393,21394,21395,\r
+21396,21398,21399,21401,21403,21404,21406,21408,21409,21412,21415,21418,21419,\r
+21420,21421,21423,21424,21425,21426,21427,21428,21429,21431,21432,21433,21434,\r
+21436,21437,21438,21440,21443,21444,21445,21446,21447,21454,21455,21456,21458,\r
+21459,21461,21466,21468,21469,21470,21473,21474,21479,21492,21498,21502,21503,\r
+21504,21506,21509,21511,21515,21524,21528,21529,21530,21532,21538,21540,21541,\r
+21546,21552,21555,21558,21559,21562,21565,21567,21569,21570,21572,21573,21575,\r
+21577,21580,21581,21582,21583,21585,21594,21597,21598,21599,21600,21601,21603,\r
+21605,21607,21609,21610,21611,21612,21613,21614,21615,21616,21620,21625,21626,\r
+21630,21631,21633,21635,21637,21639,21640,21641,21642,21645,21649,21651,21655,\r
+21656,21660,21662,21663,21664,21665,21666,21669,21678,21680,21682,21685,21686,\r
+21687,21689,21690,21692,21694,21699,21701,21706,21707,21718,21720,21723,21728,\r
+21729,21730,21731,21732,21739,21740,21743,21744,21745,21748,21749,21750,21751,\r
+21752,21753,21755,21758,21760,21762,21763,21764,21765,21768,21770,21771,21772,\r
+21773,21774,21778,21779,21781,21782,21783,21784,21785,21786,21788,21789,21790,\r
+21791,21793,21797,21798,U,21800,21801,21803,21805,21810,21812,21813,21814,\r
+21816,21817,21818,21819,21821,21824,21826,21829,21831,21832,21835,21836,21837,\r
+21838,21839,21841,21842,21843,21844,21847,21848,21849,21850,21851,21853,21854,\r
+21855,21856,21858,21859,21864,21865,21867,21871,21872,21873,21874,21875,21876,\r
+21881,21882,21885,21887,21893,21894,21900,21901,21902,21904,21906,21907,21909,\r
+21910,21911,21914,21915,21918,21920,21921,21922,21923,21924,21925,21926,21928,\r
+21929,21930,21931,21932,21933,21934,21935,21936,21938,21940,21942,21944,21946,\r
+21948,21951,21952,21953,21954,21955,21958,21959,21960,21962,21963,21966,21967,\r
+21968,21973,21975,21976,21977,21978,21979,21982,21984,21986,21991,21993,21997,\r
+21998,22000,22001,22004,22006,22008,22009,22010,22011,22012,22015,22018,22019,\r
+22020,22021,22022,22023,22026,22027,22029,22032,22033,22034,22035,22036,22037,\r
+22038,22039,22041,22042,22044,22045,22048,22049,22050,22053,22054,22056,22057,\r
+22058,22059,22062,22063,22064,22067,22069,22071,22072,22074,22076,22077,22078,\r
+22080,22081,22082,22083,22084,22085,22086,22087,22088,22089,22090,22091,22095,\r
+22096,22097,22098,22099,22101,22102,22106,22107,22109,22110,22111,22112,22113,\r
+U,22115,22117,22118,22119,22125,22126,22127,22128,22130,22131,22132,22133,\r
+22135,22136,22137,22138,22141,22142,22143,22144,22145,22146,22147,22148,22151,\r
+22152,22153,22154,22155,22156,22157,22160,22161,22162,22164,22165,22166,22167,\r
+22168,22169,22170,22171,22172,22173,22174,22175,22176,22177,22178,22180,22181,\r
+22182,22183,22184,22185,22186,22187,22188,22189,22190,22192,22193,22194,22195,\r
+22196,22197,22198,22200,22201,22202,22203,22205,22206,22207,22208,22209,22210,\r
+22211,22212,22213,22214,22215,22216,22217,22219,22220,22221,22222,22223,22224,\r
+22225,22226,22227,22229,22230,22232,22233,22236,22243,22245,22246,22247,22248,\r
+22249,22250,22252,22254,22255,22258,22259,22262,22263,22264,22267,22268,22272,\r
+22273,22274,22277,22279,22283,22284,22285,22286,22287,22288,22289,22290,22291,\r
+22292,22293,22294,22295,22296,22297,22298,22299,22301,22302,22304,22305,22306,\r
+22308,22309,22310,22311,22315,22321,22322,22324,22325,22326,22327,22328,22332,\r
+22333,22335,22337,22339,22340,22341,22342,22344,22345,22347,22354,22355,22356,\r
+22357,22358,22360,22361,22370,22371,22373,22375,22380,22382,22384,22385,22386,\r
+22388,22389,22392,22393,22394,22397,22398,22399,22400,U,22401,22407,22408,\r
+22409,22410,22413,22414,22415,22416,22417,22420,22421,22422,22423,22424,22425,\r
+22426,22428,22429,22430,22431,22437,22440,22442,22444,22447,22448,22449,22451,\r
+22453,22454,22455,22457,22458,22459,22460,22461,22462,22463,22464,22465,22468,\r
+22469,22470,22471,22472,22473,22474,22476,22477,22480,22481,22483,22486,22487,\r
+22491,22492,22494,22497,22498,22499,22501,22502,22503,22504,22505,22506,22507,\r
+22508,22510,22512,22513,22514,22515,22517,22518,22519,22523,22524,22526,22527,\r
+22529,22531,22532,22533,22536,22537,22538,22540,22542,22543,22544,22546,22547,\r
+22548,22550,22551,22552,22554,22555,22556,22557,22559,22562,22563,22565,22566,\r
+22567,22568,22569,22571,22572,22573,22574,22575,22577,22578,22579,22580,22582,\r
+22583,22584,22585,22586,22587,22588,22589,22590,22591,22592,22593,22594,22595,\r
+22597,22598,22599,22600,22601,22602,22603,22606,22607,22608,22610,22611,22613,\r
+22614,22615,22617,22618,22619,22620,22621,22623,22624,22625,22626,22627,22628,\r
+22630,22631,22632,22633,22634,22637,22638,22639,22640,22641,22642,22643,22644,\r
+22645,22646,22647,22648,22649,22650,22651,22652,22653,22655,22658,22660,22662,\r
+22663,22664,22666,22667,22668,U,22669,22670,22671,22672,22673,22676,22677,\r
+22678,22679,22680,22683,22684,22685,22688,22689,22690,22691,22692,22693,22694,\r
+22695,22698,22699,22700,22701,22702,22703,22704,22705,22706,22707,22708,22709,\r
+22710,22711,22712,22713,22714,22715,22717,22718,22719,22720,22722,22723,22724,\r
+22726,22727,22728,22729,22730,22731,22732,22733,22734,22735,22736,22738,22739,\r
+22740,22742,22743,22744,22745,22746,22747,22748,22749,22750,22751,22752,22753,\r
+22754,22755,22757,22758,22759,22760,22761,22762,22765,22767,22769,22770,22772,\r
+22773,22775,22776,22778,22779,22780,22781,22782,22783,22784,22785,22787,22789,\r
+22790,22792,22793,22794,22795,22796,22798,22800,22801,22802,22803,22807,22808,\r
+22811,22813,22814,22816,22817,22818,22819,22822,22824,22828,22832,22834,22835,\r
+22837,22838,22843,22845,22846,22847,22848,22851,22853,22854,22858,22860,22861,\r
+22864,22866,22867,22873,22875,22876,22877,22878,22879,22881,22883,22884,22886,\r
+22887,22888,22889,22890,22891,22892,22893,22894,22895,22896,22897,22898,22901,\r
+22903,22906,22907,22908,22910,22911,22912,22917,22921,22923,22924,22926,22927,\r
+22928,22929,22932,22933,22936,22938,22939,22940,22941,22943,22944,22945,22946,\r
+22950,U,22951,22956,22957,22960,22961,22963,22964,22965,22966,22967,22968,\r
+22970,22972,22973,22975,22976,22977,22978,22979,22980,22981,22983,22984,22985,\r
+22988,22989,22990,22991,22997,22998,23001,23003,23006,23007,23008,23009,23010,\r
+23012,23014,23015,23017,23018,23019,23021,23022,23023,23024,23025,23026,23027,\r
+23028,23029,23030,23031,23032,23034,23036,23037,23038,23040,23042,23050,23051,\r
+23053,23054,23055,23056,23058,23060,23061,23062,23063,23065,23066,23067,23069,\r
+23070,23073,23074,23076,23078,23079,23080,23082,23083,23084,23085,23086,23087,\r
+23088,23091,23093,23095,23096,23097,23098,23099,23101,23102,23103,23105,23106,\r
+23107,23108,23109,23111,23112,23115,23116,23117,23118,23119,23120,23121,23122,\r
+23123,23124,23126,23127,23128,23129,23131,23132,23133,23134,23135,23136,23137,\r
+23139,23140,23141,23142,23144,23145,23147,23148,23149,23150,23151,23152,23153,\r
+23154,23155,23160,23161,23163,23164,23165,23166,23168,23169,23170,23171,23172,\r
+23173,23174,23175,23176,23177,23178,23179,23180,23181,23182,23183,23184,23185,\r
+23187,23188,23189,23190,23191,23192,23193,23196,23197,23198,23199,23200,23201,\r
+23202,23203,23204,23205,23206,23207,23208,23209,23211,23212,U,23213,23214,\r
+23215,23216,23217,23220,23222,23223,23225,23226,23227,23228,23229,23231,23232,\r
+23235,23236,23237,23238,23239,23240,23242,23243,23245,23246,23247,23248,23249,\r
+23251,23253,23255,23257,23258,23259,23261,23262,23263,23266,23268,23269,23271,\r
+23272,23274,23276,23277,23278,23279,23280,23282,23283,23284,23285,23286,23287,\r
+23288,23289,23290,23291,23292,23293,23294,23295,23296,23297,23298,23299,23300,\r
+23301,23302,23303,23304,23306,23307,23308,23309,23310,23311,23312,23313,23314,\r
+23315,23316,23317,23320,23321,23322,23323,23324,23325,23326,23327,23328,23329,\r
+23330,23331,23332,23333,23334,23335,23336,23337,23338,23339,23340,23341,23342,\r
+23343,23344,23345,23347,23349,23350,23352,23353,23354,23355,23356,23357,23358,\r
+23359,23361,23362,23363,23364,23365,23366,23367,23368,23369,23370,23371,23372,\r
+23373,23374,23375,23378,23382,23390,23392,23393,23399,23400,23403,23405,23406,\r
+23407,23410,23412,23414,23415,23416,23417,23419,23420,23422,23423,23426,23430,\r
+23434,23437,23438,23440,23441,23442,23444,23446,23455,23463,23464,23465,23468,\r
+23469,23470,23471,23473,23474,23479,23482,23483,23484,23488,23489,23491,23496,\r
+23497,23498,23499,23501,23502,23503,U,23505,23508,23509,23510,23511,23512,\r
+23513,23514,23515,23516,23520,23522,23523,23526,23527,23529,23530,23531,23532,\r
+23533,23535,23537,23538,23539,23540,23541,23542,23543,23549,23550,23552,23554,\r
+23555,23557,23559,23560,23563,23564,23565,23566,23568,23570,23571,23575,23577,\r
+23579,23582,23583,23584,23585,23587,23590,23592,23593,23594,23595,23597,23598,\r
+23599,23600,23602,23603,23605,23606,23607,23619,23620,23622,23623,23628,23629,\r
+23634,23635,23636,23638,23639,23640,23642,23643,23644,23645,23647,23650,23652,\r
+23655,23656,23657,23658,23659,23660,23661,23664,23666,23667,23668,23669,23670,\r
+23671,23672,23675,23676,23677,23678,23680,23683,23684,23685,23686,23687,23689,\r
+23690,23691,23694,23695,23698,23699,23701,23709,23710,23711,23712,23713,23716,\r
+23717,23718,23719,23720,23722,23726,23727,23728,23730,23732,23734,23737,23738,\r
+23739,23740,23742,23744,23746,23747,23749,23750,23751,23752,23753,23754,23756,\r
+23757,23758,23759,23760,23761,23763,23764,23765,23766,23767,23768,23770,23771,\r
+23772,23773,23774,23775,23776,23778,23779,23783,23785,23787,23788,23790,23791,\r
+23793,23794,23795,23796,23797,23798,23799,23800,23801,23802,23804,23805,23806,\r
+23807,23808,U,23809,23812,23813,23816,23817,23818,23819,23820,23821,23823,\r
+23824,23825,23826,23827,23829,23831,23832,23833,23834,23836,23837,23839,23840,\r
+23841,23842,23843,23845,23848,23850,23851,23852,23855,23856,23857,23858,23859,\r
+23861,23862,23863,23864,23865,23866,23867,23868,23871,23872,23873,23874,23875,\r
+23876,23877,23878,23880,23881,23885,23886,23887,23888,23889,23890,23891,23892,\r
+23893,23894,23895,23897,23898,23900,23902,23903,23904,23905,23906,23907,23908,\r
+23909,23910,23911,23912,23914,23917,23918,23920,23921,23922,23923,23925,23926,\r
+23927,23928,23929,23930,23931,23932,23933,23934,23935,23936,23937,23939,23940,\r
+23941,23942,23943,23944,23945,23946,23947,23948,23949,23950,23951,23952,23953,\r
+23954,23955,23956,23957,23958,23959,23960,23962,23963,23964,23966,23967,23968,\r
+23969,23970,23971,23972,23973,23974,23975,23976,23977,23978,23979,23980,23981,\r
+23982,23983,23984,23985,23986,23987,23988,23989,23990,23992,23993,23994,23995,\r
+23996,23997,23998,23999,24000,24001,24002,24003,24004,24006,24007,24008,24009,\r
+24010,24011,24012,24014,24015,24016,24017,24018,24019,24020,24021,24022,24023,\r
+24024,24025,24026,24028,24031,24032,24035,24036,24042,24044,24045,U,24048,\r
+24053,24054,24056,24057,24058,24059,24060,24063,24064,24068,24071,24073,24074,\r
+24075,24077,24078,24082,24083,24087,24094,24095,24096,24097,24098,24099,24100,\r
+24101,24104,24105,24106,24107,24108,24111,24112,24114,24115,24116,24117,24118,\r
+24121,24122,24126,24127,24128,24129,24131,24134,24135,24136,24137,24138,24139,\r
+24141,24142,24143,24144,24145,24146,24147,24150,24151,24152,24153,24154,24156,\r
+24157,24159,24160,24163,24164,24165,24166,24167,24168,24169,24170,24171,24172,\r
+24173,24174,24175,24176,24177,24181,24183,24185,24190,24193,24194,24195,24197,\r
+24200,24201,24204,24205,24206,24210,24216,24219,24221,24225,24226,24227,24228,\r
+24232,24233,24234,24235,24236,24238,24239,24240,24241,24242,24244,24250,24251,\r
+24252,24253,24255,24256,24257,24258,24259,24260,24261,24262,24263,24264,24267,\r
+24268,24269,24270,24271,24272,24276,24277,24279,24280,24281,24282,24284,24285,\r
+24286,24287,24288,24289,24290,24291,24292,24293,24294,24295,24297,24299,24300,\r
+24301,24302,24303,24304,24305,24306,24307,24309,24312,24313,24315,24316,24317,\r
+24325,24326,24327,24329,24332,24333,24334,24336,24338,24340,24342,24345,24346,\r
+24348,24349,24350,24353,24354,24355,24356,U,24360,24363,24364,24366,24368,\r
+24370,24371,24372,24373,24374,24375,24376,24379,24381,24382,24383,24385,24386,\r
+24387,24388,24389,24390,24391,24392,24393,24394,24395,24396,24397,24398,24399,\r
+24401,24404,24409,24410,24411,24412,24414,24415,24416,24419,24421,24423,24424,\r
+24427,24430,24431,24434,24436,24437,24438,24440,24442,24445,24446,24447,24451,\r
+24454,24461,24462,24463,24465,24467,24468,24470,24474,24475,24477,24478,24479,\r
+24480,24482,24483,24484,24485,24486,24487,24489,24491,24492,24495,24496,24497,\r
+24498,24499,24500,24502,24504,24505,24506,24507,24510,24511,24512,24513,24514,\r
+24519,24520,24522,24523,24526,24531,24532,24533,24538,24539,24540,24542,24543,\r
+24546,24547,24549,24550,24552,24553,24556,24559,24560,24562,24563,24564,24566,\r
+24567,24569,24570,24572,24583,24584,24585,24587,24588,24592,24593,24595,24599,\r
+24600,24602,24606,24607,24610,24611,24612,24620,24621,24622,24624,24625,24626,\r
+24627,24628,24630,24631,24632,24633,24634,24637,24638,24640,24644,24645,24646,\r
+24647,24648,24649,24650,24652,24654,24655,24657,24659,24660,24662,24663,24664,\r
+24667,24668,24670,24671,24672,24673,24677,24678,24686,24689,24690,24692,24693,\r
+24695,24702,24704,U,24705,24706,24709,24710,24711,24712,24714,24715,24718,\r
+24719,24720,24721,24723,24725,24727,24728,24729,24732,24734,24737,24738,24740,\r
+24741,24743,24745,24746,24750,24752,24755,24757,24758,24759,24761,24762,24765,\r
+24766,24767,24768,24769,24770,24771,24772,24775,24776,24777,24780,24781,24782,\r
+24783,24784,24786,24787,24788,24790,24791,24793,24795,24798,24801,24802,24803,\r
+24804,24805,24810,24817,24818,24821,24823,24824,24827,24828,24829,24830,24831,\r
+24834,24835,24836,24837,24839,24842,24843,24844,24848,24849,24850,24851,24852,\r
+24854,24855,24856,24857,24859,24860,24861,24862,24865,24866,24869,24872,24873,\r
+24874,24876,24877,24878,24879,24880,24881,24882,24883,24884,24885,24886,24887,\r
+24888,24889,24890,24891,24892,24893,24894,24896,24897,24898,24899,24900,24901,\r
+24902,24903,24905,24907,24909,24911,24912,24914,24915,24916,24918,24919,24920,\r
+24921,24922,24923,24924,24926,24927,24928,24929,24931,24932,24933,24934,24937,\r
+24938,24939,24940,24941,24942,24943,24945,24946,24947,24948,24950,24952,24953,\r
+24954,24955,24956,24957,24958,24959,24960,24961,24962,24963,24964,24965,24966,\r
+24967,24968,24969,24970,24972,24973,24975,24976,24977,24978,24979,24981,U,\r
+24982,24983,24984,24985,24986,24987,24988,24990,24991,24992,24993,24994,24995,\r
+24996,24997,24998,25002,25003,25005,25006,25007,25008,25009,25010,25011,25012,\r
+25013,25014,25016,25017,25018,25019,25020,25021,25023,25024,25025,25027,25028,\r
+25029,25030,25031,25033,25036,25037,25038,25039,25040,25043,25045,25046,25047,\r
+25048,25049,25050,25051,25052,25053,25054,25055,25056,25057,25058,25059,25060,\r
+25061,25063,25064,25065,25066,25067,25068,25069,25070,25071,25072,25073,25074,\r
+25075,25076,25078,25079,25080,25081,25082,25083,25084,25085,25086,25088,25089,\r
+25090,25091,25092,25093,25095,25097,25107,25108,25113,25116,25117,25118,25120,\r
+25123,25126,25127,25128,25129,25131,25133,25135,25136,25137,25138,25141,25142,\r
+25144,25145,25146,25147,25148,25154,25156,25157,25158,25162,25167,25168,25173,\r
+25174,25175,25177,25178,25180,25181,25182,25183,25184,25185,25186,25188,25189,\r
+25192,25201,25202,25204,25205,25207,25208,25210,25211,25213,25217,25218,25219,\r
+25221,25222,25223,25224,25227,25228,25229,25230,25231,25232,25236,25241,25244,\r
+25245,25246,25251,25254,25255,25257,25258,25261,25262,25263,25264,25266,25267,\r
+25268,25270,25271,25272,25274,25278,25280,25281,U,25283,25291,25295,25297,\r
+25301,25309,25310,25312,25313,25316,25322,25323,25328,25330,25333,25336,25337,\r
+25338,25339,25344,25347,25348,25349,25350,25354,25355,25356,25357,25359,25360,\r
+25362,25363,25364,25365,25367,25368,25369,25372,25382,25383,25385,25388,25389,\r
+25390,25392,25393,25395,25396,25397,25398,25399,25400,25403,25404,25406,25407,\r
+25408,25409,25412,25415,25416,25418,25425,25426,25427,25428,25430,25431,25432,\r
+25433,25434,25435,25436,25437,25440,25444,25445,25446,25448,25450,25451,25452,\r
+25455,25456,25458,25459,25460,25461,25464,25465,25468,25469,25470,25471,25473,\r
+25475,25476,25477,25478,25483,25485,25489,25491,25492,25493,25495,25497,25498,\r
+25499,25500,25501,25502,25503,25505,25508,25510,25515,25519,25521,25522,25525,\r
+25526,25529,25531,25533,25535,25536,25537,25538,25539,25541,25543,25544,25546,\r
+25547,25548,25553,25555,25556,25557,25559,25560,25561,25562,25563,25564,25565,\r
+25567,25570,25572,25573,25574,25575,25576,25579,25580,25582,25583,25584,25585,\r
+25587,25589,25591,25593,25594,25595,25596,25598,25603,25604,25606,25607,25608,\r
+25609,25610,25613,25614,25617,25618,25621,25622,25623,25624,25625,25626,25629,\r
+25631,25634,25635,25636,U,25637,25639,25640,25641,25643,25646,25647,25648,\r
+25649,25650,25651,25653,25654,25655,25656,25657,25659,25660,25662,25664,25666,\r
+25667,25673,25675,25676,25677,25678,25679,25680,25681,25683,25685,25686,25687,\r
+25689,25690,25691,25692,25693,25695,25696,25697,25698,25699,25700,25701,25702,\r
+25704,25706,25707,25708,25710,25711,25712,25713,25714,25715,25716,25717,25718,\r
+25719,25723,25724,25725,25726,25727,25728,25729,25731,25734,25736,25737,25738,\r
+25739,25740,25741,25742,25743,25744,25747,25748,25751,25752,25754,25755,25756,\r
+25757,25759,25760,25761,25762,25763,25765,25766,25767,25768,25770,25771,25775,\r
+25777,25778,25779,25780,25782,25785,25787,25789,25790,25791,25793,25795,25796,\r
+25798,25799,25800,25801,25802,25803,25804,25807,25809,25811,25812,25813,25814,\r
+25817,25818,25819,25820,25821,25823,25824,25825,25827,25829,25831,25832,25833,\r
+25834,25835,25836,25837,25838,25839,25840,25841,25842,25843,25844,25845,25846,\r
+25847,25848,25849,25850,25851,25852,25853,25854,25855,25857,25858,25859,25860,\r
+25861,25862,25863,25864,25866,25867,25868,25869,25870,25871,25872,25873,25875,\r
+25876,25877,25878,25879,25881,25882,25883,25884,25885,25886,25887,25888,25889,\r
+U,25890,25891,25892,25894,25895,25896,25897,25898,25900,25901,25904,25905,\r
+25906,25907,25911,25914,25916,25917,25920,25921,25922,25923,25924,25926,25927,\r
+25930,25931,25933,25934,25936,25938,25939,25940,25943,25944,25946,25948,25951,\r
+25952,25953,25956,25957,25959,25960,25961,25962,25965,25966,25967,25969,25971,\r
+25973,25974,25976,25977,25978,25979,25980,25981,25982,25983,25984,25985,25986,\r
+25987,25988,25989,25990,25992,25993,25994,25997,25998,25999,26002,26004,26005,\r
+26006,26008,26010,26013,26014,26016,26018,26019,26022,26024,26026,26028,26030,\r
+26033,26034,26035,26036,26037,26038,26039,26040,26042,26043,26046,26047,26048,\r
+26050,26055,26056,26057,26058,26061,26064,26065,26067,26068,26069,26072,26073,\r
+26074,26075,26076,26077,26078,26079,26081,26083,26084,26090,26091,26098,26099,\r
+26100,26101,26104,26105,26107,26108,26109,26110,26111,26113,26116,26117,26119,\r
+26120,26121,26123,26125,26128,26129,26130,26134,26135,26136,26138,26139,26140,\r
+26142,26145,26146,26147,26148,26150,26153,26154,26155,26156,26158,26160,26162,\r
+26163,26167,26168,26169,26170,26171,26173,26175,26176,26178,26180,26181,26182,\r
+26183,26184,26185,26186,26189,26190,26192,26193,26200,U,26201,26203,26204,\r
+26205,26206,26208,26210,26211,26213,26215,26217,26218,26219,26220,26221,26225,\r
+26226,26227,26229,26232,26233,26235,26236,26237,26239,26240,26241,26243,26245,\r
+26246,26248,26249,26250,26251,26253,26254,26255,26256,26258,26259,26260,26261,\r
+26264,26265,26266,26267,26268,26270,26271,26272,26273,26274,26275,26276,26277,\r
+26278,26281,26282,26283,26284,26285,26287,26288,26289,26290,26291,26293,26294,\r
+26295,26296,26298,26299,26300,26301,26303,26304,26305,26306,26307,26308,26309,\r
+26310,26311,26312,26313,26314,26315,26316,26317,26318,26319,26320,26321,26322,\r
+26323,26324,26325,26326,26327,26328,26330,26334,26335,26336,26337,26338,26339,\r
+26340,26341,26343,26344,26346,26347,26348,26349,26350,26351,26353,26357,26358,\r
+26360,26362,26363,26365,26369,26370,26371,26372,26373,26374,26375,26380,26382,\r
+26383,26385,26386,26387,26390,26392,26393,26394,26396,26398,26400,26401,26402,\r
+26403,26404,26405,26407,26409,26414,26416,26418,26419,26422,26423,26424,26425,\r
+26427,26428,26430,26431,26433,26436,26437,26439,26442,26443,26445,26450,26452,\r
+26453,26455,26456,26457,26458,26459,26461,26466,26467,26468,26470,26471,26475,\r
+26476,26478,26481,26484,26486,U,26488,26489,26490,26491,26493,26496,26498,\r
+26499,26501,26502,26504,26506,26508,26509,26510,26511,26513,26514,26515,26516,\r
+26518,26521,26523,26527,26528,26529,26532,26534,26537,26540,26542,26545,26546,\r
+26548,26553,26554,26555,26556,26557,26558,26559,26560,26562,26565,26566,26567,\r
+26568,26569,26570,26571,26572,26573,26574,26581,26582,26583,26587,26591,26593,\r
+26595,26596,26598,26599,26600,26602,26603,26605,26606,26610,26613,26614,26615,\r
+26616,26617,26618,26619,26620,26622,26625,26626,26627,26628,26630,26637,26640,\r
+26642,26644,26645,26648,26649,26650,26651,26652,26654,26655,26656,26658,26659,\r
+26660,26661,26662,26663,26664,26667,26668,26669,26670,26671,26672,26673,26676,\r
+26677,26678,26682,26683,26687,26695,26699,26701,26703,26706,26710,26711,26712,\r
+26713,26714,26715,26716,26717,26718,26719,26730,26732,26733,26734,26735,26736,\r
+26737,26738,26739,26741,26744,26745,26746,26747,26748,26749,26750,26751,26752,\r
+26754,26756,26759,26760,26761,26762,26763,26764,26765,26766,26768,26769,26770,\r
+26772,26773,26774,26776,26777,26778,26779,26780,26781,26782,26783,26784,26785,\r
+26787,26788,26789,26793,26794,26795,26796,26798,26801,26802,26804,26806,26807,\r
+26808,U,26809,26810,26811,26812,26813,26814,26815,26817,26819,26820,26821,\r
+26822,26823,26824,26826,26828,26830,26831,26832,26833,26835,26836,26838,26839,\r
+26841,26843,26844,26845,26846,26847,26849,26850,26852,26853,26854,26855,26856,\r
+26857,26858,26859,26860,26861,26863,26866,26867,26868,26870,26871,26872,26875,\r
+26877,26878,26879,26880,26882,26883,26884,26886,26887,26888,26889,26890,26892,\r
+26895,26897,26899,26900,26901,26902,26903,26904,26905,26906,26907,26908,26909,\r
+26910,26913,26914,26915,26917,26918,26919,26920,26921,26922,26923,26924,26926,\r
+26927,26929,26930,26931,26933,26934,26935,26936,26938,26939,26940,26942,26944,\r
+26945,26947,26948,26949,26950,26951,26952,26953,26954,26955,26956,26957,26958,\r
+26959,26960,26961,26962,26963,26965,26966,26968,26969,26971,26972,26975,26977,\r
+26978,26980,26981,26983,26984,26985,26986,26988,26989,26991,26992,26994,26995,\r
+26996,26997,26998,27002,27003,27005,27006,27007,27009,27011,27013,27018,27019,\r
+27020,27022,27023,27024,27025,27026,27027,27030,27031,27033,27034,27037,27038,\r
+27039,27040,27041,27042,27043,27044,27045,27046,27049,27050,27052,27054,27055,\r
+27056,27058,27059,27061,27062,27064,27065,27066,27068,27069,U,27070,27071,\r
+27072,27074,27075,27076,27077,27078,27079,27080,27081,27083,27085,27087,27089,\r
+27090,27091,27093,27094,27095,27096,27097,27098,27100,27101,27102,27105,27106,\r
+27107,27108,27109,27110,27111,27112,27113,27114,27115,27116,27118,27119,27120,\r
+27121,27123,27124,27125,27126,27127,27128,27129,27130,27131,27132,27134,27136,\r
+27137,27138,27139,27140,27141,27142,27143,27144,27145,27147,27148,27149,27150,\r
+27151,27152,27153,27154,27155,27156,27157,27158,27161,27162,27163,27164,27165,\r
+27166,27168,27170,27171,27172,27173,27174,27175,27177,27179,27180,27181,27182,\r
+27184,27186,27187,27188,27190,27191,27192,27193,27194,27195,27196,27199,27200,\r
+27201,27202,27203,27205,27206,27208,27209,27210,27211,27212,27213,27214,27215,\r
+27217,27218,27219,27220,27221,27222,27223,27226,27228,27229,27230,27231,27232,\r
+27234,27235,27236,27238,27239,27240,27241,27242,27243,27244,27245,27246,27247,\r
+27248,27250,27251,27252,27253,27254,27255,27256,27258,27259,27261,27262,27263,\r
+27265,27266,27267,27269,27270,27271,27272,27273,27274,27275,27276,27277,27279,\r
+27282,27283,27284,27285,27286,27288,27289,27290,27291,27292,27293,27294,27295,\r
+27297,27298,27299,27300,27301,27302,U,27303,27304,27306,27309,27310,27311,\r
+27312,27313,27314,27315,27316,27317,27318,27319,27320,27321,27322,27323,27324,\r
+27325,27326,27327,27328,27329,27330,27331,27332,27333,27334,27335,27336,27337,\r
+27338,27339,27340,27341,27342,27343,27344,27345,27346,27347,27348,27349,27350,\r
+27351,27352,27353,27354,27355,27356,27357,27358,27359,27360,27361,27362,27363,\r
+27364,27365,27366,27367,27368,27369,27370,27371,27372,27373,27374,27375,27376,\r
+27377,27378,27379,27380,27381,27382,27383,27384,27385,27386,27387,27388,27389,\r
+27390,27391,27392,27393,27394,27395,27396,27397,27398,27399,27400,27401,27402,\r
+27403,27404,27405,27406,27407,27408,27409,27410,27411,27412,27413,27414,27415,\r
+27416,27417,27418,27419,27420,27421,27422,27423,27429,27430,27432,27433,27434,\r
+27435,27436,27437,27438,27439,27440,27441,27443,27444,27445,27446,27448,27451,\r
+27452,27453,27455,27456,27457,27458,27460,27461,27464,27466,27467,27469,27470,\r
+27471,27472,27473,27474,27475,27476,27477,27478,27479,27480,27482,27483,27484,\r
+27485,27486,27487,27488,27489,27496,27497,27499,27500,27501,27502,27503,27504,\r
+27505,27506,27507,27508,27509,27510,27511,27512,27514,27517,27518,27519,27520,\r
+27525,27528,U,27532,27534,27535,27536,27537,27540,27541,27543,27544,27545,\r
+27548,27549,27550,27551,27552,27554,27555,27556,27557,27558,27559,27560,27561,\r
+27563,27564,27565,27566,27567,27568,27569,27570,27574,27576,27577,27578,27579,\r
+27580,27581,27582,27584,27587,27588,27590,27591,27592,27593,27594,27596,27598,\r
+27600,27601,27608,27610,27612,27613,27614,27615,27616,27618,27619,27620,27621,\r
+27622,27623,27624,27625,27628,27629,27630,27632,27633,27634,27636,27638,27639,\r
+27640,27642,27643,27644,27646,27647,27648,27649,27650,27651,27652,27656,27657,\r
+27658,27659,27660,27662,27666,27671,27676,27677,27678,27680,27683,27685,27691,\r
+27692,27693,27697,27699,27702,27703,27705,27706,27707,27708,27710,27711,27715,\r
+27716,27717,27720,27723,27724,27725,27726,27727,27729,27730,27731,27734,27736,\r
+27737,27738,27746,27747,27749,27750,27751,27755,27756,27757,27758,27759,27761,\r
+27763,27765,27767,27768,27770,27771,27772,27775,27776,27780,27783,27786,27787,\r
+27789,27790,27793,27794,27797,27798,27799,27800,27802,27804,27805,27806,27808,\r
+27810,27816,27820,27823,27824,27828,27829,27830,27831,27834,27840,27841,27842,\r
+27843,27846,27847,27848,27851,27853,27854,27855,27857,27858,27864,U,27865,\r
+27866,27868,27869,27871,27876,27878,27879,27881,27884,27885,27890,27892,27897,\r
+27903,27904,27906,27907,27909,27910,27912,27913,27914,27917,27919,27920,27921,\r
+27923,27924,27925,27926,27928,27932,27933,27935,27936,27937,27938,27939,27940,\r
+27942,27944,27945,27948,27949,27951,27952,27956,27958,27959,27960,27962,27967,\r
+27968,27970,27972,27977,27980,27984,27989,27990,27991,27992,27995,27997,27999,\r
+28001,28002,28004,28005,28007,28008,28011,28012,28013,28016,28017,28018,28019,\r
+28021,28022,28025,28026,28027,28029,28030,28031,28032,28033,28035,28036,28038,\r
+28039,28042,28043,28045,28047,28048,28050,28054,28055,28056,28057,28058,28060,\r
+28066,28069,28076,28077,28080,28081,28083,28084,28086,28087,28089,28090,28091,\r
+28092,28093,28094,28097,28098,28099,28104,28105,28106,28109,28110,28111,28112,\r
+28114,28115,28116,28117,28119,28122,28123,28124,28127,28130,28131,28133,28135,\r
+28136,28137,28138,28141,28143,28144,28146,28148,28149,28150,28152,28154,28157,\r
+28158,28159,28160,28161,28162,28163,28164,28166,28167,28168,28169,28171,28175,\r
+28178,28179,28181,28184,28185,28187,28188,28190,28191,28194,28198,28199,28200,\r
+28202,28204,28206,28208,28209,28211,28213,U,28214,28215,28217,28219,28220,\r
+28221,28222,28223,28224,28225,28226,28229,28230,28231,28232,28233,28234,28235,\r
+28236,28239,28240,28241,28242,28245,28247,28249,28250,28252,28253,28254,28256,\r
+28257,28258,28259,28260,28261,28262,28263,28264,28265,28266,28268,28269,28271,\r
+28272,28273,28274,28275,28276,28277,28278,28279,28280,28281,28282,28283,28284,\r
+28285,28288,28289,28290,28292,28295,28296,28298,28299,28300,28301,28302,28305,\r
+28306,28307,28308,28309,28310,28311,28313,28314,28315,28317,28318,28320,28321,\r
+28323,28324,28326,28328,28329,28331,28332,28333,28334,28336,28339,28341,28344,\r
+28345,28348,28350,28351,28352,28355,28356,28357,28358,28360,28361,28362,28364,\r
+28365,28366,28368,28370,28374,28376,28377,28379,28380,28381,28387,28391,28394,\r
+28395,28396,28397,28398,28399,28400,28401,28402,28403,28405,28406,28407,28408,\r
+28410,28411,28412,28413,28414,28415,28416,28417,28419,28420,28421,28423,28424,\r
+28426,28427,28428,28429,28430,28432,28433,28434,28438,28439,28440,28441,28442,\r
+28443,28444,28445,28446,28447,28449,28450,28451,28453,28454,28455,28456,28460,\r
+28462,28464,28466,28468,28469,28471,28472,28473,28474,28475,28476,28477,28479,\r
+28480,28481,28482,U,28483,28484,28485,28488,28489,28490,28492,28494,28495,\r
+28496,28497,28498,28499,28500,28501,28502,28503,28505,28506,28507,28509,28511,\r
+28512,28513,28515,28516,28517,28519,28520,28521,28522,28523,28524,28527,28528,\r
+28529,28531,28533,28534,28535,28537,28539,28541,28542,28543,28544,28545,28546,\r
+28547,28549,28550,28551,28554,28555,28559,28560,28561,28562,28563,28564,28565,\r
+28566,28567,28568,28569,28570,28571,28573,28574,28575,28576,28578,28579,28580,\r
+28581,28582,28584,28585,28586,28587,28588,28589,28590,28591,28592,28593,28594,\r
+28596,28597,28599,28600,28602,28603,28604,28605,28606,28607,28609,28611,28612,\r
+28613,28614,28615,28616,28618,28619,28620,28621,28622,28623,28624,28627,28628,\r
+28629,28630,28631,28632,28633,28634,28635,28636,28637,28639,28642,28643,28644,\r
+28645,28646,28647,28648,28649,28650,28651,28652,28653,28656,28657,28658,28659,\r
+28660,28661,28662,28663,28664,28665,28666,28667,28668,28669,28670,28671,28672,\r
+28673,28674,28675,28676,28677,28678,28679,28680,28681,28682,28683,28684,28685,\r
+28686,28687,28688,28690,28691,28692,28693,28694,28695,28696,28697,28700,28701,\r
+28702,28703,28704,28705,28706,28708,28709,28710,28711,28712,28713,28714,U,\r
+28715,28716,28717,28718,28719,28720,28721,28722,28723,28724,28726,28727,28728,\r
+28730,28731,28732,28733,28734,28735,28736,28737,28738,28739,28740,28741,28742,\r
+28743,28744,28745,28746,28747,28749,28750,28752,28753,28754,28755,28756,28757,\r
+28758,28759,28760,28761,28762,28763,28764,28765,28767,28768,28769,28770,28771,\r
+28772,28773,28774,28775,28776,28777,28778,28782,28785,28786,28787,28788,28791,\r
+28793,28794,28795,28797,28801,28802,28803,28804,28806,28807,28808,28811,28812,\r
+28813,28815,28816,28817,28819,28823,28824,28826,28827,28830,28831,28832,28833,\r
+28834,28835,28836,28837,28838,28839,28840,28841,28842,28848,28850,28852,28853,\r
+28854,28858,28862,28863,28868,28869,28870,28871,28873,28875,28876,28877,28878,\r
+28879,28880,28881,28882,28883,28884,28885,28886,28887,28890,28892,28893,28894,\r
+28896,28897,28898,28899,28901,28906,28910,28912,28913,28914,28915,28916,28917,\r
+28918,28920,28922,28923,28924,28926,28927,28928,28929,28930,28931,28932,28933,\r
+28934,28935,28936,28939,28940,28941,28942,28943,28945,28946,28948,28951,28955,\r
+28956,28957,28958,28959,28960,28961,28962,28963,28964,28965,28967,28968,28969,\r
+28970,28971,28972,28973,28974,28978,28979,28980,U,28981,28983,28984,28985,\r
+28986,28987,28988,28989,28990,28991,28992,28993,28994,28995,28996,28998,28999,\r
+29000,29001,29003,29005,29007,29008,29009,29010,29011,29012,29013,29014,29015,\r
+29016,29017,29018,29019,29021,29023,29024,29025,29026,29027,29029,29033,29034,\r
+29035,29036,29037,29039,29040,29041,29044,29045,29046,29047,29049,29051,29052,\r
+29054,29055,29056,29057,29058,29059,29061,29062,29063,29064,29065,29067,29068,\r
+29069,29070,29072,29073,29074,29075,29077,29078,29079,29082,29083,29084,29085,\r
+29086,29089,29090,29091,29092,29093,29094,29095,29097,29098,29099,29101,29102,\r
+29103,29104,29105,29106,29108,29110,29111,29112,29114,29115,29116,29117,29118,\r
+29119,29120,29121,29122,29124,29125,29126,29127,29128,29129,29130,29131,29132,\r
+29133,29135,29136,29137,29138,29139,29142,29143,29144,29145,29146,29147,29148,\r
+29149,29150,29151,29153,29154,29155,29156,29158,29160,29161,29162,29163,29164,\r
+29165,29167,29168,29169,29170,29171,29172,29173,29174,29175,29176,29178,29179,\r
+29180,29181,29182,29183,29184,29185,29186,29187,29188,29189,29191,29192,29193,\r
+29194,29195,29196,29197,29198,29199,29200,29201,29202,29203,29204,29205,29206,\r
+29207,29208,29209,29210,U,29211,29212,29214,29215,29216,29217,29218,29219,\r
+29220,29221,29222,29223,29225,29227,29229,29230,29231,29234,29235,29236,29242,\r
+29244,29246,29248,29249,29250,29251,29252,29253,29254,29257,29258,29259,29262,\r
+29263,29264,29265,29267,29268,29269,29271,29272,29274,29276,29278,29280,29283,\r
+29284,29285,29288,29290,29291,29292,29293,29296,29297,29299,29300,29302,29303,\r
+29304,29307,29308,29309,29314,29315,29317,29318,29319,29320,29321,29324,29326,\r
+29328,29329,29331,29332,29333,29334,29335,29336,29337,29338,29339,29340,29341,\r
+29342,29344,29345,29346,29347,29348,29349,29350,29351,29352,29353,29354,29355,\r
+29358,29361,29362,29363,29365,29370,29371,29372,29373,29374,29375,29376,29381,\r
+29382,29383,29385,29386,29387,29388,29391,29393,29395,29396,29397,29398,29400,\r
+29402,29403,183,U,U,U,U,U,8212,8560,8561,8562,8563,8564,8565,8566,8567,8568,\r
+8569,65077,65078,65081,65082,65087,65088,65085,65086,65089,65090,65091,65092,\r
+U,U,65083,65084,65079,65080,65073,U,65075,65076,714,715,729,8211,8213,8229,\r
+8245,8453,8457,8598,8599,8600,8601,8725,8735,8739,8786,8806,8807,8895,9552,\r
+9553,9554,9555,9556,9557,9558,9559,9560,9561,9562,9563,9564,9565,9566,9567,\r
+9568,9569,9570,9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,\r
+9583,9584,9585,9586,9587,9601,9602,9603,9604,9605,9606,9607,U,9608,9609,9610,\r
+9611,9612,9613,9614,9615,9619,9620,9621,9660,9661,9698,9699,9700,9701,9737,\r
+8853,12306,12317,12318,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,593,U,324,328,U,609,12321,12322,12323,12324,12325,12326,\r
+12327,12328,12329,12963,13198,13199,13212,13213,13214,13217,13252,13262,13265,\r
+13266,13269,65072,65506,65508,U,8481,12849,U,8208,U,U,U,12540,12443,12444,\r
+12541,12542,12294,12445,12446,65097,65098,65099,65100,65101,65102,65103,65104,\r
+65105,65106,65108,65109,65110,65111,65113,65114,65115,65116,65117,65118,65119,\r
+65120,65121,U,65122,65123,65124,65125,65126,65128,65129,65130,65131,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,12295,29404,29405,29407,29410,29411,29412,29413,29414,29415,\r
+29418,29419,29429,29430,29433,29437,29438,29439,29440,29442,29444,29445,29446,\r
+29447,29448,29449,29451,29452,29453,29455,29456,29457,29458,29460,29464,29465,\r
+29466,29471,29472,29475,29476,29478,29479,29480,29485,29487,29488,29490,29491,\r
+29493,29494,29498,29499,29500,29501,29504,29505,29506,29507,29508,29509,29510,\r
+29511,29512,U,29513,29514,29515,29516,29518,29519,29521,29523,29524,29525,\r
+29526,29528,29529,29530,29531,29532,29533,29534,29535,29537,29538,29539,29540,\r
+29541,29542,29543,29544,29545,29546,29547,29550,29552,29553,29554,29555,29556,\r
+29557,29558,29559,29560,29561,29562,29563,29564,29565,29567,29568,29569,29570,\r
+29571,29573,29574,29576,29578,29580,29581,29583,29584,29586,29587,29588,29589,\r
+29591,29592,29593,29594,29596,29597,29598,29600,29601,29603,29604,29605,29606,\r
+29607,29608,29610,29612,29613,29617,29620,29621,29622,29624,29625,29628,29629,\r
+29630,29631,29633,29635,29636,29637,29638,29639,U,29643,29644,29646,29650,\r
+29651,29652,29653,29654,29655,29656,29658,29659,29660,29661,29663,29665,29666,\r
+29667,29668,29670,29672,29674,29675,29676,29678,29679,29680,29681,29683,29684,\r
+29685,29686,29687,29688,29689,29690,29691,29692,29693,29694,29695,29696,29697,\r
+29698,29700,29703,29704,29707,29708,29709,29710,29713,29714,29715,29716,29717,\r
+29718,29719,29720,29721,29724,29725,29726,29727,29728,29729,29731,29732,29735,\r
+29737,29739,29741,29743,29745,29746,29751,29752,29753,29754,29755,29757,29758,\r
+29759,29760,29762,29763,29764,29765,29766,29767,29768,29769,29770,29771,29772,\r
+29773,U,29774,29775,29776,29777,29778,29779,29780,29782,29784,29789,29792,\r
+29793,29794,29795,29796,29797,29798,29799,29800,29801,29802,29803,29804,29806,\r
+29807,29809,29810,29811,29812,29813,29816,29817,29818,29819,29820,29821,29823,\r
+29826,29828,29829,29830,29832,29833,29834,29836,29837,29839,29841,29842,29843,\r
+29844,29845,29846,29847,29848,29849,29850,29851,29853,29855,29856,29857,29858,\r
+29859,29860,29861,29862,29866,29867,29868,29869,29870,29871,29872,29873,29874,\r
+29875,29876,29877,29878,29879,29880,29881,29883,29884,29885,29886,29887,29888,\r
+29889,29890,29891,29892,29893,29894,29895,U,29896,29897,29898,29899,29900,\r
+29901,29902,29903,29904,29905,29907,29908,29909,29910,29911,29912,29913,29914,\r
+29915,29917,29919,29921,29925,29927,29928,29929,29930,29931,29932,29933,29936,\r
+29937,29938,29939,29941,29944,29945,29946,29947,29948,29949,29950,29952,29953,\r
+29954,29955,29957,29958,29959,29960,29961,29962,29963,29964,29966,29968,29970,\r
+29972,29973,29974,29975,29979,29981,29982,29984,29985,29986,29987,29988,29990,\r
+29991,29994,29998,30004,30006,30009,30012,30013,30015,30017,30018,30019,30020,\r
+30022,30023,30025,30026,30029,30032,30033,30034,30035,30037,30038,30039,30040,\r
+U,30045,30046,30047,30048,30049,30050,30051,30052,30055,30056,30057,30059,\r
+30060,30061,30062,30063,30064,30065,30067,30069,30070,30071,30074,30075,30076,\r
+30077,30078,30080,30081,30082,30084,30085,30087,30088,30089,30090,30092,30093,\r
+30094,30096,30099,30101,30104,30107,30108,30110,30114,30118,30119,30120,30121,\r
+30122,30125,30134,30135,30138,30139,30143,30144,30145,30150,30155,30156,30158,\r
+30159,30160,30161,30163,30167,30169,30170,30172,30173,30175,30176,30177,30181,\r
+30185,30188,30189,30190,30191,30194,30195,30197,30198,30199,30200,30202,30203,\r
+30205,30206,30210,30212,30214,30215,U,30216,30217,30219,30221,30222,30223,\r
+30225,30226,30227,30228,30230,30234,30236,30237,30238,30241,30243,30247,30248,\r
+30252,30254,30255,30257,30258,30262,30263,30265,30266,30267,30269,30273,30274,\r
+30276,30277,30278,30279,30280,30281,30282,30283,30286,30287,30288,30289,30290,\r
+30291,30293,30295,30296,30297,30298,30299,30301,30303,30304,30305,30306,30308,\r
+30309,30310,30311,30312,30313,30314,30316,30317,30318,30320,30321,30322,30323,\r
+30324,30325,30326,30327,30329,30330,30332,30335,30336,30337,30339,30341,30345,\r
+30346,30348,30349,30351,30352,30354,30356,30357,30359,30360,30362,30363,U,\r
+30364,30365,30366,30367,30368,30369,30370,30371,30373,30374,30375,30376,30377,\r
+30378,30379,30380,30381,30383,30384,30387,30389,30390,30391,30392,30393,30394,\r
+30395,30396,30397,30398,30400,30401,30403,30404,30407,30409,30411,30412,30419,\r
+30421,30425,30426,30428,30429,30430,30432,30433,30434,30435,30436,30438,30439,\r
+30440,30441,30442,30443,30444,30445,30448,30451,30453,30454,30455,30458,30459,\r
+30461,30463,30464,30466,30467,30469,30470,30474,30476,30478,30479,30480,30481,\r
+30482,30483,30484,30485,30486,30487,30488,30491,30492,30493,30494,30497,30499,\r
+30500,30501,30503,30506,30507,U,30508,30510,30512,30513,30514,30515,30516,\r
+30521,30523,30525,30526,30527,30530,30532,30533,30534,30536,30537,30538,30539,\r
+30540,30541,30542,30543,30546,30547,30548,30549,30550,30551,30552,30553,30556,\r
+30557,30558,30559,30560,30564,30567,30569,30570,30573,30574,30575,30576,30577,\r
+30578,30579,30580,30581,30582,30583,30584,30586,30587,30588,30593,30594,30595,\r
+30598,30599,30600,30601,30602,30603,30607,30608,30611,30612,30613,30614,30615,\r
+30616,30617,30618,30619,30620,30621,30622,30625,30627,30628,30630,30632,30635,\r
+30637,30638,30639,30641,30642,30644,30646,30647,30648,30649,30650,U,30652,\r
+30654,30656,30657,30658,30659,30660,30661,30662,30663,30664,30665,30666,30667,\r
+30668,30670,30671,30672,30673,30674,30675,30676,30677,30678,30680,30681,30682,\r
+30685,30686,30687,30688,30689,30692,30694,30696,30698,30703,30704,30705,30706,\r
+30708,30709,30711,30713,30714,30715,30716,30723,30724,30725,30726,30727,30728,\r
+30730,30731,30734,30735,30736,30739,30741,30745,30747,30750,30752,30753,30754,\r
+30756,30760,30762,30763,30766,30767,30769,30770,30771,30773,30774,30781,30783,\r
+30785,30786,30787,30788,30790,30792,30793,30794,30795,30797,30799,30801,30803,\r
+30804,30808,30809,30810,U,30811,30812,30814,30815,30816,30817,30818,30819,\r
+30820,30821,30822,30823,30824,30825,30831,30832,30833,30834,30835,30836,30837,\r
+30838,30840,30841,30842,30843,30845,30846,30847,30848,30849,30850,30851,30852,\r
+30853,30854,30856,30858,30859,30863,30864,30866,30868,30869,30870,30873,30877,\r
+30878,30880,30882,30884,30886,30888,30889,30890,30891,30892,30893,30894,30895,\r
+30901,30902,30903,30904,30906,30907,30908,30909,30911,30912,30914,30915,30916,\r
+30918,30919,30920,30924,30925,30926,30927,30929,30930,30931,30934,30935,30936,\r
+30938,30939,30940,30941,30942,30943,30944,30945,30946,30947,U,30948,30949,\r
+30950,30951,30953,30954,30955,30957,30958,30959,30960,30961,30963,30965,30966,\r
+30968,30969,30971,30972,30973,30974,30975,30976,30978,30979,30980,30982,30983,\r
+30984,30985,30986,30987,30988,30989,30990,30991,30992,30993,30994,30996,30997,\r
+30998,30999,31000,31001,31002,31003,31004,31005,31007,31008,31009,31010,31011,\r
+31013,31014,31015,31016,31017,31018,31019,31020,31021,31022,31023,31024,31025,\r
+31026,31027,31029,31030,31031,31032,31033,31037,31039,31042,31043,31044,31045,\r
+31047,31050,31051,31052,31053,31054,31055,31056,31057,31058,31060,31061,31064,\r
+31065,31073,31075,U,31076,31078,31081,31082,31083,31084,31086,31088,31089,\r
+31090,31091,31092,31093,31094,31097,31099,31100,31101,31102,31103,31106,31107,\r
+31110,31111,31112,31113,31115,31116,31117,31118,31120,31121,31122,31123,31124,\r
+31125,31126,31127,31128,31129,31131,31132,31133,31134,31135,31136,31137,31138,\r
+31139,31140,31141,31142,31144,31145,31146,31147,31148,31149,31150,31151,31152,\r
+31153,31154,31156,31157,31158,31159,31160,31164,31167,31170,31172,31173,31175,\r
+31176,31178,31180,31182,31183,31184,31187,31188,31190,31191,31193,31194,31195,\r
+31196,31197,31198,31200,31201,31202,31205,31208,31210,U,31212,31214,31217,\r
+31218,31219,31220,31221,31222,31223,31225,31226,31228,31230,31231,31233,31236,\r
+31237,31239,31240,31241,31242,31244,31247,31248,31249,31250,31251,31253,31254,\r
+31256,31257,31259,31260,31261,31263,31265,31266,31268,31269,31270,31271,31272,\r
+31273,31274,31275,31276,31277,31278,31279,31280,31281,31282,31284,31285,31286,\r
+31288,31290,31294,31296,31297,31298,31299,31300,31301,31303,31304,31305,31306,\r
+31307,31308,31309,31310,31311,31312,31314,31315,31316,31317,31318,31320,31321,\r
+31322,31323,31324,31325,31326,31327,31328,31329,31330,31331,31332,31333,31334,\r
+31335,31336,U,31337,31338,31339,31340,31341,31342,31343,31345,31346,31347,\r
+31349,31355,31356,31357,31358,31362,31365,31367,31369,31370,31371,31372,31374,\r
+31375,31376,31379,31380,31385,31386,31387,31390,31393,31394,31395,31396,31399,\r
+31401,31402,31403,31406,31407,31408,31409,31410,31412,31413,31414,31415,31416,\r
+31417,31418,31419,31420,31421,31422,31424,31425,31426,31427,31428,31429,31430,\r
+31431,31432,31433,31434,31436,31437,31438,31439,31440,31441,31442,31443,31444,\r
+31445,31447,31448,31450,31451,31452,31453,31457,31458,31460,31463,31464,31465,\r
+31466,31467,31468,31470,31472,31473,31474,31475,U,31476,31477,31478,31479,\r
+31480,31483,31484,31486,31488,31489,31490,31493,31495,31497,31500,31501,31502,\r
+31504,31506,31507,31510,31511,31512,31514,31516,31517,31519,31521,31522,31523,\r
+31527,31529,31533,31535,31536,31538,31540,31541,31542,31543,31545,31547,31549,\r
+31551,31552,31553,31554,31555,31556,31558,31560,31562,31565,31566,31571,31573,\r
+31575,31577,31580,31582,31583,31585,31587,31588,31589,31590,31591,31592,31593,\r
+31594,31595,31596,31597,31599,31600,31603,31604,31606,31608,31610,31612,31613,\r
+31615,31617,31618,31619,31620,31622,31623,31624,31625,31626,31627,31628,31630,\r
+31631,U,31633,31634,31635,31638,31640,31641,31642,31643,31646,31647,31648,\r
+31651,31652,31653,31662,31663,31664,31666,31667,31669,31670,31671,31673,31674,\r
+31675,31676,31677,31678,31679,31680,31682,31683,31684,31685,31688,31689,31690,\r
+31691,31693,31694,31695,31696,31698,31700,31701,31702,31703,31704,31707,31708,\r
+31710,31711,31712,31714,31715,31716,31719,31720,31721,31723,31724,31725,31727,\r
+31728,31730,31731,31732,31733,31734,31736,31737,31738,31739,31741,31743,31744,\r
+31745,31746,31747,31748,31749,31750,31752,31753,31754,31757,31758,31760,31761,\r
+31762,31763,31764,31765,31767,31768,31769,U,31770,31771,31772,31773,31774,\r
+31776,31777,31778,31779,31780,31781,31784,31785,31787,31788,31789,31790,31791,\r
+31792,31793,31794,31795,31796,31797,31798,31799,31801,31802,31803,31804,31805,\r
+31806,31810,31811,31812,31813,31814,31815,31816,31817,31818,31819,31820,31822,\r
+31823,31824,31825,31826,31827,31828,31829,31830,31831,31832,31833,31834,31835,\r
+31836,31837,31838,31839,31840,31841,31842,31843,31844,31845,31846,31847,31848,\r
+31849,31850,31851,31852,31853,31854,31855,31856,31857,31858,31861,31862,31863,\r
+31864,31865,31866,31870,31871,31872,31873,31874,31875,31876,31877,31878,31879,\r
+U,31880,31882,31883,31884,31885,31886,31887,31888,31891,31892,31894,31897,\r
+31898,31899,31904,31905,31907,31910,31911,31912,31913,31915,31916,31917,31919,\r
+31920,31924,31925,31926,31927,31928,31930,31931,31935,31936,31938,31939,31940,\r
+31942,31945,31947,31950,31951,31952,31953,31954,31955,31956,31960,31962,31963,\r
+31965,31966,31969,31970,31971,31972,31973,31974,31975,31977,31978,31979,31980,\r
+31981,31982,31984,31985,31986,31987,31988,31989,31990,31991,31993,31994,31996,\r
+31997,31998,31999,32000,32001,32002,32003,32004,32005,32006,32007,32008,32009,\r
+32011,32012,32013,32014,32015,32016,U,32017,32018,32019,32020,32021,32022,\r
+32023,32024,32025,32026,32027,32028,32029,32030,32031,32033,32035,32036,32037,\r
+32038,32040,32041,32042,32044,32045,32046,32048,32049,32050,32051,32052,32053,\r
+32054,32055,32056,32057,32058,32059,32060,32061,32062,32063,32064,32065,32066,\r
+32067,32068,32069,32070,32071,32072,32073,32074,32075,32076,32077,32078,32079,\r
+32080,32081,32082,32083,32084,32085,32086,32087,32088,32089,32090,32091,32092,\r
+32093,32094,32095,32096,32097,32098,32099,32100,32101,32102,32103,32104,32105,\r
+32106,32107,32108,32109,32111,32112,32113,32114,32115,32116,32117,32118,U,\r
+32120,32121,32122,32123,32124,32125,32126,32127,32128,32129,32130,32131,32132,\r
+32133,32134,32135,32136,32137,32138,32139,32140,32141,32142,32143,32144,32145,\r
+32146,32147,32148,32149,32150,32151,32152,32153,32154,32155,32156,32157,32158,\r
+32159,32160,32161,32162,32163,32164,32165,32167,32168,32169,32170,32171,32172,\r
+32173,32175,32176,32177,32178,32179,32180,32181,32182,32183,32184,32185,32186,\r
+32187,32188,32189,32190,32191,32192,32193,32194,32195,32196,32197,32198,32199,\r
+32200,32201,32202,32203,32204,32205,32206,32207,32208,32209,32210,32211,32212,\r
+32213,32214,32215,32216,32217,U,32218,32219,32220,32221,32222,32223,32224,\r
+32225,32226,32227,32228,32229,32230,32231,32232,32233,32234,32235,32236,32237,\r
+32238,32239,32240,32241,32242,32243,32244,32245,32246,32247,32248,32249,32250,\r
+32251,32252,32253,32254,32255,32256,32257,32258,32259,32260,32261,32262,32263,\r
+32264,32265,32266,32267,32268,32269,32270,32271,32272,32273,32274,32275,32276,\r
+32277,32278,32279,32280,32281,32282,32283,32284,32285,32286,32287,32288,32289,\r
+32290,32291,32292,32293,32294,32295,32296,32297,32298,32299,32300,32301,32302,\r
+32303,32304,32305,32306,32307,32308,32309,32310,32311,32312,32313,U,32314,\r
+32316,32317,32318,32319,32320,32322,32323,32324,32325,32326,32328,32329,32330,\r
+32331,32332,32333,32334,32335,32336,32337,32338,32339,32340,32341,32342,32343,\r
+32344,32345,32346,32347,32348,32349,32350,32351,32352,32353,32354,32355,32356,\r
+32357,32358,32359,32360,32361,32362,32363,32364,32365,32366,32367,32368,32369,\r
+32370,32371,32372,32373,32374,32375,32376,32377,32378,32379,32380,32381,32382,\r
+32383,32384,32385,32387,32388,32389,32390,32391,32392,32393,32394,32395,32396,\r
+32397,32398,32399,32400,32401,32402,32403,32404,32405,32406,32407,32408,32409,\r
+32410,32412,32413,32414,U,32430,32436,32443,32444,32470,32484,32492,32505,\r
+32522,32528,32542,32567,32569,32571,32572,32573,32574,32575,32576,32577,32579,\r
+32582,32583,32584,32585,32586,32587,32588,32589,32590,32591,32594,32595,32598,\r
+32601,32603,32604,32605,32606,32608,32611,32612,32613,32614,32615,32619,32620,\r
+32621,32623,32624,32627,32629,32630,32631,32632,32634,32635,32636,32637,32639,\r
+32640,32642,32643,32644,32645,32646,32647,32648,32649,32651,32653,32655,32656,\r
+32657,32658,32659,32661,32662,32663,32664,32665,32667,32668,32672,32674,32675,\r
+32677,32678,32680,32681,32682,32683,32684,32685,32686,32689,U,32691,32692,\r
+32693,32694,32695,32698,32699,32702,32704,32706,32707,32708,32710,32711,32712,\r
+32713,32715,32717,32719,32720,32721,32722,32723,32726,32727,32729,32730,32731,\r
+32732,32733,32734,32738,32739,32740,32743,32744,32746,32747,32748,32749,32751,\r
+32754,32756,32757,32758,32759,32760,32761,32762,32765,32766,32767,32770,32775,\r
+32776,32777,32778,32782,32783,32785,32787,32794,32795,32797,32798,32799,32801,\r
+32803,32804,32811,32812,32813,32814,32815,32816,32818,32820,32825,32826,32828,\r
+32830,32832,32833,32836,32837,32839,32840,32841,32846,32847,32848,32849,32851,\r
+32853,32854,32855,U,32857,32859,32860,32861,32862,32863,32864,32865,32866,\r
+32867,32868,32869,32870,32871,32872,32875,32876,32877,32878,32879,32880,32882,\r
+32883,32884,32885,32886,32887,32888,32889,32890,32891,32892,32893,32894,32897,\r
+32898,32901,32904,32906,32909,32910,32911,32912,32913,32914,32916,32917,32919,\r
+32921,32926,32931,32934,32935,32936,32940,32944,32947,32949,32950,32952,32953,\r
+32955,32965,32967,32968,32969,32970,32971,32975,32976,32977,32978,32979,32980,\r
+32981,32984,32991,32992,32994,32995,32998,33006,33013,33015,33017,33019,33022,\r
+33023,33024,33025,33027,33028,33029,33031,33032,33035,U,33036,33045,33047,\r
+33049,33051,33052,33053,33055,33056,33057,33058,33059,33060,33061,33062,33063,\r
+33064,33065,33066,33067,33069,33070,33072,33075,33076,33077,33079,33081,33082,\r
+33083,33084,33085,33087,33088,33089,33090,33091,33092,33093,33095,33097,33101,\r
+33102,33103,33106,33110,33111,33112,33115,33116,33117,33118,33119,33121,33122,\r
+33123,33124,33126,33128,33130,33131,33132,33135,33138,33139,33141,33142,33143,\r
+33144,33153,33155,33156,33157,33158,33159,33161,33163,33164,33165,33166,33168,\r
+33170,33171,33172,33173,33174,33175,33177,33178,33182,33183,33184,33185,33186,\r
+33188,33189,U,33191,33193,33195,33196,33197,33198,33199,33200,33201,33202,\r
+33204,33205,33206,33207,33208,33209,33212,33213,33214,33215,33220,33221,33223,\r
+33224,33225,33227,33229,33230,33231,33232,33233,33234,33235,33236,33237,33238,\r
+33239,33240,33241,33242,33243,33244,33245,33246,33247,33248,33249,33250,33252,\r
+33253,33254,33256,33257,33259,33262,33263,33264,33265,33266,33269,33270,33271,\r
+33272,33273,33274,33277,33279,33283,33287,33288,33289,33290,33291,33294,33295,\r
+33297,33299,33301,33302,33303,33304,33305,33306,33309,33312,33316,33317,33318,\r
+33319,33321,33326,33330,33338,33340,33341,33343,U,33344,33345,33346,33347,\r
+33349,33350,33352,33354,33356,33357,33358,33360,33361,33362,33363,33364,33365,\r
+33366,33367,33369,33371,33372,33373,33374,33376,33377,33378,33379,33380,33381,\r
+33382,33383,33385,33386,33387,33388,33389,33393,33397,33398,33399,33400,33403,\r
+33404,33408,33409,33411,33413,33414,33415,33417,33420,33424,33427,33428,33429,\r
+33430,33434,33435,33438,33440,33442,33443,33447,33458,33461,33462,33466,33467,\r
+33468,33471,33472,33474,33475,33477,33478,33481,33488,33494,33497,33498,33501,\r
+33506,33511,33512,33513,33514,33516,33517,33518,33520,33522,33523,33525,33526,\r
+33528,U,33530,33532,33533,33534,33535,33536,33546,33547,33549,33552,33554,\r
+33555,33558,33560,33561,33565,33566,33567,33568,33569,33570,33571,33572,33573,\r
+33574,33577,33578,33582,33584,33586,33591,33595,33597,33598,33599,33601,33602,\r
+33604,33605,33608,33610,33611,33612,33613,33614,33619,33621,33622,33623,33624,\r
+33625,33629,33634,33648,33649,33650,33651,33652,33653,33654,33657,33658,33662,\r
+33663,33664,33665,33666,33667,33668,33671,33672,33674,33675,33676,33677,33679,\r
+33680,33681,33684,33685,33686,33687,33689,33690,33693,33695,33697,33698,33699,\r
+33700,33701,33702,33703,33708,33709,33710,U,33711,33717,33723,33726,33727,\r
+33730,33731,33732,33734,33736,33737,33739,33741,33742,33744,33745,33746,33747,\r
+33749,33751,33753,33754,33755,33758,33762,33763,33764,33766,33767,33768,33771,\r
+33772,33773,33774,33775,33779,33780,33781,33782,33783,33786,33787,33788,33790,\r
+33791,33792,33794,33797,33799,33800,33801,33802,33808,33810,33811,33812,33813,\r
+33814,33815,33817,33818,33819,33822,33823,33824,33825,33826,33827,33833,33834,\r
+33835,33836,33837,33838,33839,33840,33842,33843,33844,33845,33846,33847,33849,\r
+33850,33851,33854,33855,33856,33857,33858,33859,33860,33861,33863,33864,33865,\r
+U,33866,33867,33868,33869,33870,33871,33872,33874,33875,33876,33877,33878,\r
+33880,33885,33886,33887,33888,33890,33892,33893,33894,33895,33896,33898,33902,\r
+33903,33904,33906,33908,33911,33913,33915,33916,33917,33918,33919,33920,33921,\r
+33923,33924,33925,33926,33930,33933,33935,33936,33937,33938,33939,33940,33941,\r
+33942,33944,33946,33947,33949,33950,33951,33952,33954,33955,33956,33957,33958,\r
+33959,33960,33961,33962,33963,33964,33965,33966,33968,33969,33971,33973,33974,\r
+33975,33979,33980,33982,33984,33986,33987,33989,33990,33991,33992,33995,33996,\r
+33998,33999,34002,34004,34005,34007,U,34008,34009,34010,34011,34012,34014,\r
+34017,34018,34020,34023,34024,34025,34026,34027,34029,34030,34031,34033,34034,\r
+34035,34036,34037,34038,34039,34040,34041,34042,34043,34045,34046,34048,34049,\r
+34050,34051,34052,34053,34054,34055,34056,34057,34058,34059,34061,34062,34063,\r
+34064,34066,34068,34069,34070,34072,34073,34075,34076,34077,34078,34080,34082,\r
+34083,34084,34085,34086,34087,34088,34089,34090,34093,34094,34095,34096,34097,\r
+34098,34099,34100,34101,34102,34110,34111,34112,34113,34114,34116,34117,34118,\r
+34119,34123,34124,34125,34126,34127,34128,34129,34130,34131,34132,34133,U,\r
+34135,34136,34138,34139,34140,34141,34143,34144,34145,34146,34147,34149,34150,\r
+34151,34153,34154,34155,34156,34157,34158,34159,34160,34161,34163,34165,34166,\r
+34167,34168,34172,34173,34175,34176,34177,34178,34179,34182,34184,34185,34186,\r
+34187,34188,34189,34190,34192,34193,34194,34195,34196,34197,34198,34199,34200,\r
+34201,34202,34205,34206,34207,34208,34209,34210,34211,34213,34214,34215,34217,\r
+34219,34220,34221,34225,34226,34227,34228,34229,34230,34232,34234,34235,34236,\r
+34237,34238,34239,34240,34242,34243,34244,34245,34246,34247,34248,34250,34251,\r
+34252,34253,34254,34257,34258,U,34260,34262,34263,34264,34265,34266,34267,\r
+34269,34270,34271,34272,34273,34274,34275,34277,34278,34279,34280,34282,34283,\r
+34284,34285,34286,34287,34288,34289,34290,34291,34292,34293,34294,34295,34296,\r
+34297,34298,34300,34301,34302,34304,34305,34306,34307,34308,34310,34311,34312,\r
+34313,34314,34315,34316,34317,34318,34319,34320,34322,34323,34324,34325,34327,\r
+34328,34329,34330,34331,34332,34333,34334,34335,34336,34337,34338,34339,34340,\r
+34341,34342,34344,34346,34347,34348,34349,34350,34351,34352,34353,34354,34355,\r
+34356,34357,34358,34359,34361,34362,34363,34365,34366,34367,34368,U,34369,\r
+34370,34371,34372,34373,34374,34375,34376,34377,34378,34379,34380,34386,34387,\r
+34389,34390,34391,34392,34393,34395,34396,34397,34399,34400,34401,34403,34404,\r
+34405,34406,34407,34408,34409,34410,34413,34415,34416,34418,34419,34420,34421,\r
+34422,34423,34424,34435,34436,34437,34438,34439,34440,34441,34446,34447,34448,\r
+34449,34450,34452,34454,34455,34456,34457,34458,34459,34462,34463,34464,34465,\r
+34466,34469,34470,34475,34477,34478,34482,34483,34487,34488,34489,34491,34492,\r
+34493,34494,34495,34497,34498,34499,34501,34504,34508,34509,34514,34515,34517,\r
+34518,34519,34522,34524,U,34525,34528,34529,34530,34531,34533,34534,34535,\r
+34536,34538,34539,34540,34543,34549,34550,34551,34554,34555,34556,34557,34559,\r
+34561,34564,34565,34566,34571,34572,34574,34575,34576,34577,34580,34582,34585,\r
+34587,34589,34591,34592,34596,34598,34599,34600,34602,34603,34604,34605,34607,\r
+34608,34610,34611,34613,34614,34616,34617,34618,34620,34621,34624,34625,34626,\r
+34627,34628,34629,34630,34634,34635,34637,34639,34640,34641,34642,34644,34645,\r
+34646,34648,34650,34651,34652,34653,34654,34655,34657,34658,34662,34663,34664,\r
+34665,34666,34667,34668,34669,34671,34673,34674,34675,34677,U,34679,34680,\r
+34681,34682,34687,34688,34689,34692,34694,34695,34697,34698,34700,34702,34703,\r
+34704,34705,34706,34708,34709,34710,34712,34713,34714,34715,34716,34717,34718,\r
+34720,34721,34722,34723,34724,34725,34726,34727,34729,34730,34734,34736,34737,\r
+34738,34740,34742,34743,34744,34745,34747,34748,34750,34751,34753,34754,34755,\r
+34756,34757,34759,34760,34761,34764,34765,34766,34767,34768,34772,34773,34774,\r
+34775,34776,34777,34778,34780,34781,34782,34783,34785,34786,34787,34788,34790,\r
+34791,34792,34793,34795,34796,34797,34799,34800,34801,34802,34803,34804,34805,\r
+34806,34807,34808,U,34810,34811,34812,34813,34815,34816,34817,34818,34820,\r
+34821,34822,34823,34824,34825,34827,34828,34829,34830,34831,34832,34833,34834,\r
+34836,34839,34840,34841,34842,34844,34845,34846,34847,34848,34851,34852,34853,\r
+34854,34855,34856,34857,34858,34859,34860,34861,34862,34863,34864,34865,34867,\r
+34868,34869,34870,34871,34872,34874,34875,34877,34878,34879,34881,34882,34883,\r
+34886,34887,34888,34889,34890,34891,34894,34895,34896,34897,34898,34899,34901,\r
+34902,34904,34906,34907,34908,34909,34910,34911,34912,34918,34919,34922,34925,\r
+34927,34929,34931,34932,34933,34934,34936,34937,34938,U,34939,34940,34944,\r
+34947,34950,34951,34953,34954,34956,34958,34959,34960,34961,34963,34964,34965,\r
+34967,34968,34969,34970,34971,34973,34974,34975,34976,34977,34979,34981,34982,\r
+34983,34984,34985,34986,34988,34990,34991,34992,34994,34995,34996,34997,34998,\r
+35000,35001,35002,35003,35005,35006,35007,35008,35011,35012,35015,35016,35018,\r
+35019,35020,35021,35023,35024,35025,35027,35030,35031,35034,35035,35036,35037,\r
+35038,35040,35041,35046,35047,35049,35050,35051,35052,35053,35054,35055,35058,\r
+35061,35062,35063,35066,35067,35069,35071,35072,35073,35075,35076,35077,35078,\r
+35079,35080,U,35081,35083,35084,35085,35086,35087,35089,35092,35093,35094,\r
+35095,35096,35100,35101,35102,35103,35104,35106,35107,35108,35110,35111,35112,\r
+35113,35116,35117,35118,35119,35121,35122,35123,35125,35127,35128,35129,35130,\r
+35131,35132,35133,35134,35135,35136,35138,35139,35141,35142,35143,35144,35145,\r
+35146,35147,35148,35149,35150,35151,35152,35153,35154,35155,35156,35157,35158,\r
+35159,35160,35161,35162,35163,35164,35165,35168,35169,35170,35171,35172,35173,\r
+35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,35185,35186,35187,\r
+35188,35189,35190,35191,35192,35193,35194,35196,U,35197,35198,35200,35202,\r
+35204,35205,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,\r
+35218,35219,35220,35221,35222,35223,35224,35225,35226,35227,35228,35229,35230,\r
+35231,35232,35233,35234,35235,35236,35237,35238,35239,35240,35241,35242,35243,\r
+35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,\r
+35257,35258,35259,35260,35261,35262,35263,35264,35267,35277,35283,35284,35285,\r
+35287,35288,35289,35291,35293,35295,35296,35297,35298,35300,35303,35304,35305,\r
+35306,35308,35309,35310,35312,35313,35314,35316,35317,35318,35319,35320,35321,\r
+35322,U,35323,35324,35325,35326,35327,35329,35330,35331,35332,35333,35334,\r
+35336,35337,35338,35339,35340,35341,35342,35343,35344,35345,35346,35347,35348,\r
+35349,35350,35351,35352,35353,35354,35355,35356,35357,35358,35359,35360,35361,\r
+35362,35363,35364,35365,35366,35367,35368,35369,35370,35371,35372,35373,35374,\r
+35375,35376,35377,35378,35379,35380,35381,35382,35383,35384,35385,35386,35387,\r
+35388,35389,35391,35392,35393,35394,35395,35396,35397,35398,35399,35401,35402,\r
+35403,35404,35405,35406,35407,35408,35409,35410,35411,35412,35413,35414,35415,\r
+35416,35417,35418,35419,35420,35421,35422,U,35423,35424,35425,35426,35427,\r
+35428,35429,35430,35431,35432,35433,35434,35435,35436,35437,35438,35439,35440,\r
+35441,35442,35443,35444,35445,35446,35447,35448,35450,35451,35452,35453,35454,\r
+35455,35456,35457,35458,35459,35460,35461,35462,35463,35464,35467,35468,35469,\r
+35470,35471,35472,35473,35474,35476,35477,35478,35479,35480,35481,35482,35483,\r
+35484,35485,35486,35487,35488,35489,35490,35491,35492,35493,35494,35495,35496,\r
+35497,35498,35499,35500,35501,35502,35503,35504,35505,35506,35507,35508,35509,\r
+35510,35511,35512,35513,35514,35515,35516,35517,35518,35519,35520,35521,35522,\r
+U,35523,35524,35525,35526,35527,35528,35529,35530,35531,35532,35533,35534,\r
+35535,35536,35537,35538,35539,35540,35541,35542,35543,35544,35545,35546,35547,\r
+35548,35549,35550,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,\r
+35561,35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,\r
+35574,35575,35576,35577,35578,35579,35580,35581,35582,35583,35584,35585,35586,\r
+35587,35588,35589,35590,35592,35593,35594,35595,35596,35597,35598,35599,35600,\r
+35601,35602,35603,35604,35605,35606,35607,35608,35609,35610,35611,35612,35613,\r
+35614,35615,35616,35617,35618,35619,U,35620,35621,35623,35624,35625,35626,\r
+35627,35628,35629,35630,35631,35632,35633,35634,35635,35636,35637,35638,35639,\r
+35640,35641,35642,35643,35644,35645,35646,35647,35648,35649,35650,35651,35652,\r
+35653,35654,35655,35656,35657,35658,35659,35660,35661,35662,35663,35664,35665,\r
+35666,35667,35668,35669,35670,35671,35672,35673,35674,35675,35676,35677,35678,\r
+35679,35680,35681,35682,35683,35684,35685,35687,35688,35689,35690,35691,35693,\r
+35694,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,\r
+35707,35708,35709,35710,35711,35712,35713,35714,35715,35716,35717,35718,U,\r
+35719,35720,35721,35722,35723,35724,35725,35726,35727,35728,35729,35730,35731,\r
+35732,35733,35734,35735,35736,35737,35738,35739,35740,35741,35742,35743,35756,\r
+35761,35771,35783,35792,35818,35849,35870,35896,35897,35898,35899,35900,35901,\r
+35902,35903,35904,35906,35907,35908,35909,35912,35914,35915,35917,35918,35919,\r
+35920,35921,35922,35923,35924,35926,35927,35928,35929,35931,35932,35933,35934,\r
+35935,35936,35939,35940,35941,35942,35943,35944,35945,35948,35949,35950,35951,\r
+35952,35953,35954,35956,35957,35958,35959,35963,35964,35965,35966,35967,35968,\r
+35969,35971,35972,35974,35975,U,35976,35979,35981,35982,35983,35984,35985,\r
+35986,35987,35989,35990,35991,35993,35994,35995,35996,35997,35998,35999,36000,\r
+36001,36002,36003,36004,36005,36006,36007,36008,36009,36010,36011,36012,36013,\r
+36014,36015,36016,36017,36018,36019,36020,36021,36022,36023,36024,36025,36026,\r
+36027,36028,36029,36030,36031,36032,36033,36034,36035,36036,36037,36038,36039,\r
+36040,36041,36042,36043,36044,36045,36046,36047,36048,36049,36050,36051,36052,\r
+36053,36054,36055,36056,36057,36058,36059,36060,36061,36062,36063,36064,36065,\r
+36066,36067,36068,36069,36070,36071,36072,36073,36074,36075,36076,U,36077,\r
+36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,36090,\r
+36091,36092,36093,36094,36095,36096,36097,36098,36099,36100,36101,36102,36103,\r
+36104,36105,36106,36107,36108,36109,36110,36111,36112,36113,36114,36115,36116,\r
+36117,36118,36119,36120,36121,36122,36123,36124,36128,36177,36178,36183,36191,\r
+36197,36200,36201,36202,36204,36206,36207,36209,36210,36216,36217,36218,36219,\r
+36220,36221,36222,36223,36224,36226,36227,36230,36231,36232,36233,36236,36237,\r
+36238,36239,36240,36242,36243,36245,36246,36247,36248,36249,36250,36251,36252,\r
+36253,36254,36256,36257,U,36258,36260,36261,36262,36263,36264,36265,36266,\r
+36267,36268,36269,36270,36271,36272,36274,36278,36279,36281,36283,36285,36288,\r
+36289,36290,36293,36295,36296,36297,36298,36301,36304,36306,36307,36308,36309,\r
+36312,36313,36316,36320,36321,36322,36325,36326,36327,36329,36333,36334,36336,\r
+36337,36338,36340,36342,36348,36350,36351,36352,36353,36354,36355,36356,36358,\r
+36359,36360,36363,36365,36366,36368,36369,36370,36371,36373,36374,36375,36376,\r
+36377,36378,36379,36380,36384,36385,36388,36389,36390,36391,36392,36395,36397,\r
+36400,36402,36403,36404,36406,36407,36408,36411,36412,36414,U,36415,36419,\r
+36421,36422,36428,36429,36430,36431,36432,36435,36436,36437,36438,36439,36440,\r
+36442,36443,36444,36445,36446,36447,36448,36449,36450,36451,36452,36453,36455,\r
+36456,36458,36459,36462,36465,36467,36469,36471,36472,36473,36474,36475,36477,\r
+36478,36480,36482,36483,36484,36486,36488,36489,36490,36491,36492,36493,36494,\r
+36497,36498,36499,36501,36502,36503,36504,36505,36506,36507,36509,36511,36512,\r
+36513,36514,36515,36516,36517,36518,36519,36520,36521,36522,36525,36526,36528,\r
+36529,36531,36532,36533,36534,36535,36536,36537,36539,36540,36541,36542,36543,\r
+36544,36545,36546,U,36547,36548,36549,36550,36551,36552,36553,36554,36555,\r
+36556,36557,36559,36560,36561,36562,36563,36564,36565,36566,36567,36568,36569,\r
+36570,36571,36572,36573,36574,36575,36576,36577,36578,36579,36580,36581,36582,\r
+36583,36584,36585,36586,36587,36588,36589,36590,36591,36592,36593,36594,36595,\r
+36596,36597,36598,36599,36600,36601,36602,36603,36604,36605,36606,36607,36608,\r
+36609,36610,36611,36612,36613,36614,36615,36616,36617,36618,36619,36620,36621,\r
+36622,36623,36624,36625,36626,36627,36628,36629,36630,36631,36632,36633,36634,\r
+36635,36636,36637,36638,36639,36640,36641,36642,36643,U,36644,36645,36646,\r
+36647,36648,36649,36650,36651,36652,36653,36654,36655,36656,36657,36658,36659,\r
+36660,36661,36662,36663,36664,36665,36666,36667,36668,36669,36670,36671,36672,\r
+36673,36674,36675,36676,36677,36678,36679,36680,36681,36682,36683,36684,36685,\r
+36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,36698,\r
+36699,36700,36701,36702,36703,36704,36705,36706,36707,36708,36709,36714,36736,\r
+36748,36754,36765,36768,36769,36770,36772,36773,36774,36775,36778,36780,36781,\r
+36782,36783,36786,36787,36788,36789,36791,36792,36794,36795,36796,36799,36800,\r
+36803,36806,U,36809,36810,36811,36812,36813,36815,36818,36822,36823,36826,\r
+36832,36833,36835,36839,36844,36847,36849,36850,36852,36853,36854,36858,36859,\r
+36860,36862,36863,36871,36872,36876,36878,36883,36885,36888,36889,36892,36899,\r
+36900,36901,36903,36904,36905,36906,36907,36908,36912,36913,36914,36915,36916,\r
+36919,36921,36922,36925,36927,36928,36931,36933,36934,36936,36937,36938,36939,\r
+36940,36942,36948,36949,36950,36953,36954,36956,36957,36958,36959,36960,36961,\r
+36964,36966,36967,36969,36970,36971,36972,36975,36976,36977,36978,36979,36982,\r
+36983,36984,36985,36986,36987,36988,36990,36993,U,36996,36997,36998,36999,\r
+37001,37002,37004,37005,37006,37007,37008,37010,37012,37014,37016,37018,37020,\r
+37022,37023,37024,37028,37029,37031,37032,37033,37035,37037,37042,37047,37052,\r
+37053,37055,37056,37058,37059,37062,37064,37065,37067,37068,37069,37074,37076,\r
+37077,37078,37080,37081,37082,37086,37087,37088,37091,37092,37093,37097,37098,\r
+37100,37102,37104,37105,37106,37107,37109,37110,37111,37113,37114,37115,37116,\r
+37119,37120,37121,37123,37125,37126,37127,37128,37129,37130,37131,37132,37133,\r
+37134,37135,37136,37137,37138,37139,37140,37141,37142,37143,37144,37146,37147,\r
+37148,U,37149,37151,37152,37153,37156,37157,37158,37159,37160,37161,37162,\r
+37163,37164,37165,37166,37168,37170,37171,37172,37173,37174,37175,37176,37178,\r
+37179,37180,37181,37182,37183,37184,37185,37186,37188,37189,37191,37192,37201,\r
+37203,37204,37205,37206,37208,37209,37211,37212,37215,37216,37222,37223,37224,\r
+37227,37229,37235,37242,37243,37244,37248,37249,37250,37251,37252,37254,37256,\r
+37258,37262,37263,37267,37268,37269,37270,37271,37272,37273,37276,37277,37278,\r
+37279,37280,37281,37284,37285,37286,37287,37288,37289,37291,37292,37296,37297,\r
+37298,37299,37302,37303,37304,37305,37307,U,37308,37309,37310,37311,37312,\r
+37313,37314,37315,37316,37317,37318,37320,37323,37328,37330,37331,37332,37333,\r
+37334,37335,37336,37337,37338,37339,37341,37342,37343,37344,37345,37346,37347,\r
+37348,37349,37350,37351,37352,37353,37354,37355,37356,37357,37358,37359,37360,\r
+37361,37362,37363,37364,37365,37366,37367,37368,37369,37370,37371,37372,37373,\r
+37374,37375,37376,37377,37378,37379,37380,37381,37382,37383,37384,37385,37386,\r
+37387,37388,37389,37390,37391,37392,37393,37394,37395,37396,37397,37398,37399,\r
+37400,37401,37402,37403,37404,37405,37406,37407,37408,37409,37410,37411,37412,\r
+U,37413,37414,37415,37416,37417,37418,37419,37420,37421,37422,37423,37424,\r
+37425,37426,37427,37428,37429,37430,37431,37432,37433,37434,37435,37436,37437,\r
+37438,37439,37440,37441,37442,37443,37444,37445,37446,37447,37448,37449,37450,\r
+37451,37452,37453,37454,37455,37456,37457,37458,37459,37460,37461,37462,37463,\r
+37464,37465,37466,37467,37468,37469,37470,37471,37472,37473,37474,37475,37476,\r
+37477,37478,37479,37480,37481,37482,37483,37484,37485,37486,37487,37488,37489,\r
+37490,37491,37493,37494,37495,37496,37497,37498,37499,37500,37501,37502,37503,\r
+37504,37505,37506,37507,37508,37509,U,37510,37511,37512,37513,37514,37515,\r
+37516,37517,37519,37520,37521,37522,37523,37524,37525,37526,37527,37528,37529,\r
+37530,37531,37532,37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,\r
+37543,37544,37545,37546,37547,37548,37549,37551,37552,37553,37554,37555,37556,\r
+37557,37558,37559,37560,37561,37562,37563,37564,37565,37566,37567,37568,37569,\r
+37570,37571,37572,37573,37574,37575,37577,37578,37579,37580,37581,37582,37583,\r
+37584,37585,37586,37587,37588,37589,37590,37591,37592,37593,37594,37595,37596,\r
+37597,37598,37599,37600,37601,37602,37603,37604,37605,37606,37607,37608,U,\r
+37609,37610,37611,37612,37613,37614,37615,37616,37617,37618,37619,37620,37621,\r
+37622,37623,37624,37625,37626,37627,37628,37629,37630,37631,37632,37633,37634,\r
+37635,37636,37637,37638,37639,37640,37641,37642,37643,37644,37645,37646,37647,\r
+37648,37649,37650,37651,37652,37653,37654,37655,37656,37657,37658,37659,37660,\r
+37661,37662,37663,37664,37665,37666,37667,37668,37669,37670,37671,37672,37673,\r
+37674,37675,37676,37677,37678,37679,37680,37681,37682,37683,37684,37685,37686,\r
+37687,37688,37689,37690,37691,37692,37693,37695,37696,37697,37698,37699,37700,\r
+37701,37702,37703,37704,37705,U,37706,37707,37708,37709,37710,37711,37712,\r
+37713,37714,37715,37716,37717,37718,37719,37720,37721,37722,37723,37724,37725,\r
+37726,37727,37728,37729,37730,37731,37732,37733,37734,37735,37736,37737,37739,\r
+37740,37741,37742,37743,37744,37745,37746,37747,37748,37749,37750,37751,37752,\r
+37753,37754,37755,37756,37757,37758,37759,37760,37761,37762,37763,37764,37765,\r
+37766,37767,37768,37769,37770,37771,37772,37773,37774,37776,37777,37778,37779,\r
+37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,\r
+37793,37794,37795,37796,37797,37798,37799,37800,37801,37802,37803,U,37804,\r
+37805,37806,37807,37808,37809,37810,37811,37812,37813,37814,37815,37816,37817,\r
+37818,37819,37820,37821,37822,37823,37824,37825,37826,37827,37828,37829,37830,\r
+37831,37832,37833,37835,37836,37837,37838,37839,37840,37841,37842,37843,37844,\r
+37845,37847,37848,37849,37850,37851,37852,37853,37854,37855,37856,37857,37858,\r
+37859,37860,37861,37862,37863,37864,37865,37866,37867,37868,37869,37870,37871,\r
+37872,37873,37874,37875,37876,37877,37878,37879,37880,37881,37882,37883,37884,\r
+37885,37886,37887,37888,37889,37890,37891,37892,37893,37894,37895,37896,37897,\r
+37898,37899,37900,37901,U,37902,37903,37904,37905,37906,37907,37908,37909,\r
+37910,37911,37912,37913,37914,37915,37916,37917,37918,37919,37920,37921,37922,\r
+37923,37924,37925,37926,37927,37928,37929,37930,37931,37932,37933,37934,37935,\r
+37936,37937,37938,37939,37940,37941,37942,37943,37944,37945,37946,37947,37948,\r
+37949,37951,37952,37953,37954,37955,37956,37957,37958,37959,37960,37961,37962,\r
+37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,\r
+37976,37977,37978,37979,37980,37981,37982,37983,37984,37985,37986,37987,37988,\r
+37989,37990,37991,37992,37993,37994,37996,37997,37998,37999,U,38000,38001,\r
+38002,38003,38004,38005,38006,38007,38008,38009,38010,38011,38012,38013,38014,\r
+38015,38016,38017,38018,38019,38020,38033,38038,38040,38087,38095,38099,38100,\r
+38106,38118,38139,38172,38176,38183,38195,38205,38211,38216,38219,38229,38234,\r
+38240,38254,38260,38261,38263,38264,38265,38266,38267,38268,38269,38270,38272,\r
+38273,38274,38275,38276,38277,38278,38279,38280,38281,38282,38283,38284,38285,\r
+38286,38287,38288,38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,\r
+38299,38300,38301,38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,\r
+38312,38313,38314,U,38315,38316,38317,38318,38319,38320,38321,38322,38323,\r
+38324,38325,38326,38327,38328,38329,38330,38331,38332,38333,38334,38335,38336,\r
+38337,38338,38339,38340,38341,38342,38343,38344,38345,38346,38347,38348,38349,\r
+38350,38351,38352,38353,38354,38355,38356,38357,38358,38359,38360,38361,38362,\r
+38363,38364,38365,38366,38367,38368,38369,38370,38371,38372,38373,38374,38375,\r
+38380,38399,38407,38419,38424,38427,38430,38432,38435,38436,38437,38438,38439,\r
+38440,38441,38443,38444,38445,38447,38448,38455,38456,38457,38458,38462,38465,\r
+38467,38474,38478,38479,38481,38482,38483,38486,38487,U,38488,38489,38490,\r
+38492,38493,38494,38496,38499,38501,38502,38507,38509,38510,38511,38512,38513,\r
+38515,38520,38521,38522,38523,38524,38525,38526,38527,38528,38529,38530,38531,\r
+38532,38535,38537,38538,38540,38542,38545,38546,38547,38549,38550,38554,38555,\r
+38557,38558,38559,38560,38561,38562,38563,38564,38565,38566,38568,38569,38570,\r
+38571,38572,38573,38574,38575,38577,38578,38580,38581,38583,38584,38586,38587,\r
+38591,38594,38595,38600,38602,38603,38608,38609,38611,38612,38614,38615,38616,\r
+38617,38618,38619,38620,38621,38622,38623,38625,38626,38627,38628,38629,38630,\r
+38631,38635,U,38636,38637,38638,38640,38641,38642,38644,38645,38648,38650,\r
+38651,38652,38653,38655,38658,38659,38661,38666,38667,38668,38672,38673,38674,\r
+38676,38677,38679,38680,38681,38682,38683,38685,38687,38688,38689,38690,38691,\r
+38692,38693,38694,38695,38696,38697,38699,38700,38702,38703,38705,38707,38708,\r
+38709,38710,38711,38714,38715,38716,38717,38719,38720,38721,38722,38723,38724,\r
+38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,\r
+38740,38741,38743,38744,38746,38748,38749,38751,38755,38756,38758,38759,38760,\r
+38762,38763,38764,38765,38766,38767,38768,38769,U,38770,38773,38775,38776,\r
+38777,38778,38779,38781,38782,38783,38784,38785,38786,38787,38788,38790,38791,\r
+38792,38793,38794,38796,38798,38799,38800,38803,38805,38806,38807,38809,38810,\r
+38811,38812,38813,38814,38815,38817,38818,38820,38821,38822,38823,38824,38825,\r
+38826,38828,38830,38832,38833,38835,38837,38838,38839,38840,38841,38842,38843,\r
+38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,\r
+38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,\r
+38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,\r
+38883,U,38884,38885,38888,38894,38895,38896,38897,38898,38900,38903,38904,\r
+38905,38906,38907,38908,38909,38910,38911,38912,38913,38914,38915,38916,38917,\r
+38918,38919,38920,38921,38922,38923,38924,38925,38926,38927,38928,38929,38930,\r
+38931,38932,38933,38934,38935,38936,38937,38938,38939,38940,38941,38942,38943,\r
+38944,38945,38946,38947,38948,38949,38950,38951,38952,38953,38954,38955,38956,\r
+38957,38958,38959,38960,38961,38962,38963,38964,38965,38966,38967,38968,38969,\r
+38970,38971,38972,38973,38974,38975,38976,38977,38978,38979,38980,38981,38982,\r
+38983,38984,38985,38986,38987,38988,38989,U,38990,38991,38992,38993,38994,\r
+38995,38996,38997,38998,38999,39000,39001,39002,39003,39004,39005,39006,39007,\r
+39008,39009,39010,39011,39012,39013,39014,39015,39016,39017,39018,39019,39020,\r
+39021,39022,39023,39024,39025,39026,39027,39028,39051,39054,39058,39061,39065,\r
+39075,39080,39081,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,\r
+39092,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,39103,39104,\r
+39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,39115,39116,39117,\r
+39119,39120,39124,39126,39127,39131,39132,39133,39136,39137,39138,39139,39140,\r
+U,39141,39142,39145,39146,39147,39148,39149,39150,39151,39152,39153,39154,\r
+39155,39156,39157,39158,39159,39160,39161,39162,39163,39164,39165,39166,39167,\r
+39168,39169,39170,39171,39172,39173,39174,39175,39176,39177,39178,39179,39180,\r
+39182,39183,39185,39186,39187,39188,39189,39190,39191,39192,39193,39194,39195,\r
+39196,39197,39198,39199,39200,39201,39202,39203,39204,39205,39206,39207,39208,\r
+39209,39210,39211,39212,39213,39215,39216,39217,39218,39219,39220,39221,39222,\r
+39223,39224,39225,39226,39227,39228,39229,39230,39231,39232,39233,39234,39235,\r
+39236,39237,39238,39239,39240,39241,U,39242,39243,39244,39245,39246,39247,\r
+39248,39249,39250,39251,39254,39255,39256,39257,39258,39259,39260,39261,39262,\r
+39263,39264,39265,39266,39268,39270,39283,39288,39289,39291,39294,39298,39299,\r
+39305,39308,39310,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,\r
+39332,39334,39335,39337,39338,39339,39340,39341,39342,39343,39344,39345,39346,\r
+39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,39358,39359,\r
+39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,39371,39372,\r
+39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,39384,U,\r
+39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,39397,\r
+39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,39410,\r
+39411,39412,39413,39414,39415,39416,39417,39418,39419,39420,39421,39422,39423,\r
+39424,39425,39426,39427,39428,39429,39430,39431,39432,39433,39434,39435,39436,\r
+39437,39438,39439,39440,39441,39442,39443,39444,39445,39446,39447,39448,39449,\r
+39450,39451,39452,39453,39454,39455,39456,39457,39458,39459,39460,39461,39462,\r
+39463,39464,39465,39466,39467,39468,39469,39470,39471,39472,39473,39474,39475,\r
+39476,39477,39478,39479,39480,U,39481,39482,39483,39484,39485,39486,39487,\r
+39488,39489,39490,39491,39492,39493,39494,39495,39496,39497,39498,39499,39500,\r
+39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,\r
+39514,39515,39516,39517,39518,39519,39520,39521,39522,39523,39524,39525,39526,\r
+39527,39528,39529,39530,39531,39538,39555,39561,39565,39566,39572,39573,39577,\r
+39590,39593,39594,39595,39596,39597,39598,39599,39602,39603,39604,39605,39609,\r
+39611,39613,39614,39615,39619,39620,39622,39623,39624,39625,39626,39629,39630,\r
+39631,39632,39634,39636,39637,39638,39639,39641,39642,39643,39644,U,39645,\r
+39646,39648,39650,39651,39652,39653,39655,39656,39657,39658,39660,39662,39664,\r
+39665,39666,39667,39668,39669,39670,39671,39672,39674,39676,39677,39678,39679,\r
+39680,39681,39682,39684,39685,39686,39687,39689,39690,39691,39692,39693,39694,\r
+39696,39697,39698,39700,39701,39702,39703,39704,39705,39706,39707,39708,39709,\r
+39710,39712,39713,39714,39716,39717,39718,39719,39720,39721,39722,39723,39724,\r
+39725,39726,39728,39729,39731,39732,39733,39734,39735,39736,39737,39738,39741,\r
+39742,39743,39744,39750,39754,39755,39756,39758,39760,39762,39763,39765,39766,\r
+39767,39768,39769,39770,U,39771,39772,39773,39774,39775,39776,39777,39778,\r
+39779,39780,39781,39782,39783,39784,39785,39786,39787,39788,39789,39790,39791,\r
+39792,39793,39794,39795,39796,39797,39798,39799,39800,39801,39802,39803,39804,\r
+39805,39806,39807,39808,39809,39810,39811,39812,39813,39814,39815,39816,39817,\r
+39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,39830,\r
+39831,39832,39833,39834,39835,39836,39837,39838,39839,39840,39841,39842,39843,\r
+39844,39845,39846,39847,39848,39849,39850,39851,39852,39853,39854,39855,39856,\r
+39857,39858,39859,39860,39861,39862,39863,39864,39865,39866,U,39867,39868,\r
+39869,39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,\r
+39882,39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,\r
+39895,39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,\r
+39908,39909,39910,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,\r
+39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,\r
+39934,39935,39936,39937,39938,39939,39940,39941,39942,39943,39944,39945,39946,\r
+39947,39948,39949,39950,39951,39952,39953,39954,39955,39956,39957,39958,39959,\r
+39960,39961,39962,U,39963,39964,39965,39966,39967,39968,39969,39970,39971,\r
+39972,39973,39974,39975,39976,39977,39978,39979,39980,39981,39982,39983,39984,\r
+39985,39986,39987,39988,39989,39990,39991,39992,39993,39994,39995,39996,39997,\r
+39998,39999,40000,40001,40002,40003,40004,40005,40006,40007,40008,40009,40010,\r
+40011,40012,40013,40014,40015,40016,40017,40018,40019,40020,40021,40022,40023,\r
+40024,40025,40026,40027,40028,40029,40030,40031,40032,40033,40034,40035,40036,\r
+40037,40038,40039,40040,40041,40042,40043,40044,40045,40046,40047,40048,40049,\r
+40050,40051,40052,40053,40054,40055,40056,40057,40058,U,40059,40061,40062,\r
+40064,40067,40068,40073,40074,40076,40079,40083,40086,40087,40088,40089,40093,\r
+40106,40108,40111,40121,40126,40127,40128,40129,40130,40136,40137,40145,40146,\r
+40154,40155,40160,40161,40163,40164,40165,40166,40167,40168,40169,40170,40171,\r
+40172,40173,40174,40175,40176,40177,40178,40179,40180,40181,40182,40183,40184,\r
+40185,40186,40187,40188,40189,40190,40191,40192,40193,40194,40195,40196,40197,\r
+40198,40199,40200,40201,40202,40203,40204,40205,40206,40207,40208,40209,40210,\r
+40211,40212,40213,40214,40215,40216,40217,40218,40219,40220,40221,40222,40223,\r
+40224,40225,U,40226,40227,40228,40229,40230,40231,40232,40233,40234,40235,\r
+40236,40237,40238,40239,40240,40241,40242,40243,40244,40245,40246,40247,40248,\r
+40249,40250,40251,40252,40253,40254,40255,40256,40257,40258,40259,40260,40261,\r
+40262,40263,40264,40265,40266,40267,40268,40269,40270,40271,40272,40273,40274,\r
+40275,40276,40277,40278,40279,40280,40281,40282,40283,40284,40285,40286,40287,\r
+40288,40289,40290,40291,40292,40293,40294,40295,40296,40297,40298,40299,40300,\r
+40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,40311,40312,40313,\r
+40314,40315,40316,40317,40318,40319,40320,40321,U,40322,40323,40324,40325,\r
+40326,40327,40328,40329,40330,40331,40332,40333,40334,40335,40336,40337,40338,\r
+40339,40340,40341,40342,40343,40344,40345,40346,40347,40348,40349,40350,40351,\r
+40352,40353,40354,40355,40356,40357,40358,40359,40360,40361,40362,40363,40364,\r
+40365,40366,40367,40368,40369,40370,40371,40372,40373,40374,40375,40376,40377,\r
+40378,40379,40380,40381,40382,40383,40384,40385,40386,40387,40388,40389,40390,\r
+40391,40392,40393,40394,40395,40396,40397,40398,40399,40400,40401,40402,40403,\r
+40404,40405,40406,40407,40408,40409,40410,40411,40412,40413,40414,40415,40416,\r
+40417,U,40418,40419,40420,40421,40422,40423,40424,40425,40426,40427,40428,\r
+40429,40430,40431,40432,40433,40434,40435,40436,40437,40438,40439,40440,40441,\r
+40442,40443,40444,40445,40446,40447,40448,40449,40450,40451,40452,40453,40454,\r
+40455,40456,40457,40458,40459,40460,40461,40462,40463,40464,40465,40466,40467,\r
+40468,40469,40470,40471,40472,40473,40474,40475,40476,40477,40478,40484,40487,\r
+40494,40496,40500,40507,40508,40512,40525,40528,40530,40531,40532,40534,40537,\r
+40541,40543,40544,40545,40546,40549,40558,40559,40562,40564,40565,40566,40567,\r
+40568,40569,40570,40571,40572,40573,40576,U,40577,40579,40580,40581,40582,\r
+40585,40586,40588,40589,40590,40591,40592,40593,40596,40597,40598,40599,40600,\r
+40601,40602,40603,40604,40606,40608,40609,40610,40611,40612,40613,40615,40616,\r
+40617,40618,40619,40620,40621,40622,40623,40624,40625,40626,40627,40629,40630,\r
+40631,40633,40634,40636,40639,40640,40641,40642,40643,40645,40646,40647,40648,\r
+40650,40651,40652,40656,40658,40659,40661,40662,40663,40665,40666,40670,40673,\r
+40675,40676,40678,40680,40683,40684,40685,40686,40688,40689,40690,40691,40692,\r
+40693,40694,40695,40696,40698,40701,40703,40704,40705,40706,40707,40708,40709,\r
+U,40710,40711,40712,40713,40714,40716,40719,40721,40722,40724,40725,40726,\r
+40728,40730,40731,40732,40733,40734,40735,40737,40739,40740,40741,40742,40743,\r
+40744,40745,40746,40747,40749,40750,40752,40753,40754,40755,40756,40757,40758,\r
+40760,40762,40764,40767,40768,40769,40770,40771,40773,40774,40775,40776,40777,\r
+40778,40779,40780,40781,40782,40783,40786,40787,40788,40789,40790,40791,40792,\r
+40793,40794,40795,40796,40797,40798,40799,40800,40801,40802,40803,40804,40805,\r
+40806,40807,40808,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,\r
+40819,40820,40821,40822,40823,40824,U,40825,40826,40827,40828,40829,40830,\r
+40833,40834,40845,40846,40847,40848,40849,40850,40851,40852,40853,40854,40855,\r
+40856,40860,40861,40862,40865,40866,40867,40868,40869,63788,63865,63893,63975,\r
+63985,64012,64013,64014,64015,64017,64019,64020,64024,64031,64032,64033,64035,\r
+64036,64039,64040,64041,\r
+};\r
+\r
+static const struct dbcs_index gbkext_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{__gbkext_decmap+0,64,254},{__gbkext_decmap+191,64,\r
+254},{__gbkext_decmap+382,64,254},{__gbkext_decmap+573,64,254},{\r
+__gbkext_decmap+764,64,254},{__gbkext_decmap+955,64,254},{__gbkext_decmap+1146\r
+,64,254},{__gbkext_decmap+1337,64,254},{__gbkext_decmap+1528,64,254},{\r
+__gbkext_decmap+1719,64,254},{__gbkext_decmap+1910,64,254},{__gbkext_decmap+\r
+2101,64,254},{__gbkext_decmap+2292,64,254},{__gbkext_decmap+2483,64,254},{\r
+__gbkext_decmap+2674,64,254},{__gbkext_decmap+2865,64,254},{__gbkext_decmap+\r
+3056,64,254},{__gbkext_decmap+3247,64,254},{__gbkext_decmap+3438,64,254},{\r
+__gbkext_decmap+3629,64,254},{__gbkext_decmap+3820,64,254},{__gbkext_decmap+\r
+4011,64,254},{__gbkext_decmap+4202,64,254},{__gbkext_decmap+4393,64,254},{\r
+__gbkext_decmap+4584,64,254},{__gbkext_decmap+4775,64,254},{__gbkext_decmap+\r
+4966,64,254},{__gbkext_decmap+5157,64,254},{__gbkext_decmap+5348,64,254},{\r
+__gbkext_decmap+5539,64,254},{__gbkext_decmap+5730,64,254},{__gbkext_decmap+\r
+5921,64,254},{__gbkext_decmap+6112,164,170},{__gbkext_decmap+6119,161,170},{0,\r
+0,0},{0,0,0},{0,0,0},{__gbkext_decmap+6129,224,245},{0,0,0},{__gbkext_decmap+\r
+6151,64,192},{__gbkext_decmap+6280,64,150},{__gbkext_decmap+6367,64,160},{\r
+__gbkext_decmap+6464,64,160},{__gbkext_decmap+6561,64,160},{__gbkext_decmap+\r
+6658,64,160},{__gbkext_decmap+6755,64,160},{__gbkext_decmap+6852,64,160},{\r
+__gbkext_decmap+6949,64,160},{__gbkext_decmap+7046,64,160},{__gbkext_decmap+\r
+7143,64,160},{__gbkext_decmap+7240,64,160},{__gbkext_decmap+7337,64,160},{\r
+__gbkext_decmap+7434,64,160},{__gbkext_decmap+7531,64,160},{__gbkext_decmap+\r
+7628,64,160},{__gbkext_decmap+7725,64,160},{__gbkext_decmap+7822,64,160},{\r
+__gbkext_decmap+7919,64,160},{__gbkext_decmap+8016,64,160},{__gbkext_decmap+\r
+8113,64,160},{__gbkext_decmap+8210,64,160},{__gbkext_decmap+8307,64,160},{\r
+__gbkext_decmap+8404,64,160},{__gbkext_decmap+8501,64,160},{__gbkext_decmap+\r
+8598,64,160},{__gbkext_decmap+8695,64,160},{__gbkext_decmap+8792,64,160},{\r
+__gbkext_decmap+8889,64,160},{__gbkext_decmap+8986,64,160},{__gbkext_decmap+\r
+9083,64,160},{__gbkext_decmap+9180,64,160},{__gbkext_decmap+9277,64,160},{\r
+__gbkext_decmap+9374,64,160},{__gbkext_decmap+9471,64,160},{__gbkext_decmap+\r
+9568,64,160},{__gbkext_decmap+9665,64,160},{__gbkext_decmap+9762,64,160},{\r
+__gbkext_decmap+9859,64,160},{__gbkext_decmap+9956,64,160},{__gbkext_decmap+\r
+10053,64,160},{__gbkext_decmap+10150,64,160},{__gbkext_decmap+10247,64,160},{\r
+__gbkext_decmap+10344,64,160},{__gbkext_decmap+10441,64,160},{__gbkext_decmap+\r
+10538,64,160},{__gbkext_decmap+10635,64,160},{__gbkext_decmap+10732,64,160},{\r
+__gbkext_decmap+10829,64,160},{__gbkext_decmap+10926,64,160},{__gbkext_decmap+\r
+11023,64,160},{__gbkext_decmap+11120,64,160},{__gbkext_decmap+11217,64,160},{\r
+__gbkext_decmap+11314,64,160},{__gbkext_decmap+11411,64,160},{__gbkext_decmap+\r
+11508,64,160},{__gbkext_decmap+11605,64,160},{__gbkext_decmap+11702,64,160},{\r
+__gbkext_decmap+11799,64,160},{__gbkext_decmap+11896,64,160},{__gbkext_decmap+\r
+11993,64,160},{__gbkext_decmap+12090,64,160},{__gbkext_decmap+12187,64,160},{\r
+__gbkext_decmap+12284,64,160},{__gbkext_decmap+12381,64,160},{__gbkext_decmap+\r
+12478,64,160},{__gbkext_decmap+12575,64,160},{__gbkext_decmap+12672,64,160},{\r
+__gbkext_decmap+12769,64,160},{__gbkext_decmap+12866,64,160},{__gbkext_decmap+\r
+12963,64,160},{__gbkext_decmap+13060,64,160},{__gbkext_decmap+13157,64,160},{\r
+__gbkext_decmap+13254,64,160},{__gbkext_decmap+13351,64,160},{__gbkext_decmap+\r
+13448,64,160},{__gbkext_decmap+13545,64,160},{__gbkext_decmap+13642,64,160},{\r
+__gbkext_decmap+13739,64,160},{__gbkext_decmap+13836,64,160},{__gbkext_decmap+\r
+13933,64,160},{__gbkext_decmap+14030,64,160},{__gbkext_decmap+14127,64,160},{\r
+__gbkext_decmap+14224,64,160},{__gbkext_decmap+14321,64,160},{__gbkext_decmap+\r
+14418,64,160},{__gbkext_decmap+14515,64,79},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __gbcommon_encmap[23231] = {\r
+8552,N,N,8556,8487,N,N,N,N,N,N,N,8547,8512,N,N,N,N,N,41380,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8513,N,N,N,N,N,N,N,N,10276,10274,\r
+N,N,N,N,N,N,10280,10278,10298,N,10284,10282,N,N,N,N,10288,10286,N,N,N,8514,N,\r
+10292,10290,N,10297,10273,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10277,N,N,N,N,N,N,\r
+N,10279,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10281,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,43197,N,N,N,43198,N,N,N,N,10285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,10289,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10275,\r
+N,10283,N,10287,N,10291,N,10293,N,10294,N,10295,N,10296,43195,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,43200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8486,N,8485,\r
+43072,43073,N,N,N,N,N,N,N,N,N,N,N,N,N,43074,9761,9762,9763,9764,9765,9766,\r
+9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,N,9778,9779,9780,9781,\r
+9782,9783,9784,N,N,N,N,N,N,N,9793,9794,9795,9796,9797,9798,9799,9800,9801,\r
+9802,9803,9804,9805,9806,9807,9808,9809,N,9810,9811,9812,9813,9814,9815,9816,\r
+10023,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10017,10018,10019,10020,10021,10022,10024,\r
+10025,10026,10027,10028,10029,10030,10031,10032,10033,10034,10035,10036,10037,\r
+10038,10039,10040,10041,10042,10043,10044,10045,10046,10047,10048,10049,10065,\r
+10066,10067,10068,10069,10070,10072,10073,10074,10075,10076,10077,10078,10079,\r
+10080,10081,10082,10083,10084,10085,10086,10087,10088,10089,10090,10091,10092,\r
+10093,10094,10095,10096,10097,N,10071,43356,N,N,43075,41386,8490,8492,N,8494,\r
+8495,N,N,8496,8497,N,N,N,N,N,N,N,43077,8493,N,N,N,N,N,N,N,N,N,8555,N,8548,\r
+8549,N,43078,N,N,N,N,N,8569,8550,N,43079,N,N,N,43080,N,N,N,N,N,N,N,N,N,N,N,N,\r
+8557,N,N,N,N,N,N,N,N,N,N,43353,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+8817,8818,8819,8820,8821,8822,8823,8824,8825,8826,8827,8828,N,N,N,N,41633,\r
+41634,41635,41636,41637,41638,41639,41640,41641,41642,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,8571,8572,8570,8573,N,N,43081,43082,43083,43084,8522,N,N,\r
+N,N,N,N,8519,N,8518,N,N,N,43085,N,N,N,N,8524,N,N,8536,8542,43086,8527,N,N,\r
+43087,N,8526,N,8516,8517,8521,8520,8530,N,N,8531,N,N,N,N,N,8544,8543,8515,\r
+8523,N,N,N,N,N,8535,N,N,N,N,N,N,N,N,N,N,8534,N,N,N,8533,N,N,N,N,N,43088,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,8537,8532,N,N,8540,8541,43089,43090,N,N,N,N,N,N,8538,8539,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43154,N,N,N,8529,N,N,N,N,N,N,N,N,N,N,N,8525,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,43091,8528,8793,8794,8795,8796,8797,8798,8799,8800,8801,8802,\r
+N,N,N,N,N,N,N,N,N,N,8773,8774,8775,8776,8777,8778,8779,8780,8781,8782,8783,\r
+8784,8785,8786,8787,8788,8789,8790,8791,8792,8753,8754,8755,8756,8757,8758,\r
+8759,8760,8761,8762,8763,8764,8765,8766,8767,8768,8769,8770,8771,8772,10532,\r
+10533,10534,10535,10536,10537,10538,10539,10540,10541,10542,10543,10544,10545,\r
+10546,10547,10548,10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,\r
+10559,10560,10561,10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,\r
+10572,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,10583,10584,\r
+10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,10596,10597,\r
+10598,10599,10600,10601,10602,10603,10604,10605,10606,10607,N,N,N,N,43092,\r
+43093,43094,43095,43096,43097,43098,43099,43100,43101,43102,43103,43104,43105,\r
+43106,43107,43108,43109,43110,43111,43112,43113,43114,43115,43116,43117,43118,\r
+43119,43120,43121,43122,43123,43124,43125,43126,43127,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,43128,43129,43130,43131,43132,43133,43134,43136,43137,43138,43139,43140,\r
+43141,43142,43143,N,N,N,43144,43145,43146,N,N,N,N,N,N,N,N,N,N,8566,8565,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,8568,8567,N,N,N,N,N,N,N,N,43147,43148,N,N,N,N,N,N,N,\r
+N,8564,8563,N,N,N,8560,N,N,8562,8561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43149,43150,43151,43152,8559,8558,N,N,43153,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+8546,N,8545,8481,8482,8483,8488,N,8489,43365,43414,8500,8501,8502,8503,8504,\r
+8505,8506,8507,8510,8511,43155,8574,8498,8499,8508,8509,N,N,N,N,N,43156,43157,\r
+N,N,43328,43329,43330,43331,43332,43333,43334,43335,43336,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,\r
+9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,\r
+9274,9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,\r
+9289,9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,\r
+9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,\r
+9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,N,N,N,N,N,N,\r
+N,43361,43362,43366,43367,N,N,9505,9506,9507,9508,9509,9510,9511,9512,9513,\r
+9514,9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,\r
+9529,9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,\r
+9544,9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,\r
+9559,9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,\r
+9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,\r
+9589,9590,N,N,N,N,8484,43360,43363,43364,10309,10310,10311,10312,10313,10314,\r
+10315,10316,10317,10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,\r
+10328,10329,10330,10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,\r
+10341,10342,10343,10344,10345,8805,8806,8807,8808,8809,8810,8811,8812,8813,\r
+8814,N,N,N,N,N,N,N,43354,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,43337,43338,43339,N,N,N,N,N,N,N,N,N,N,N,N,43340,43341,43342,\r
+N,N,43343,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43344,N,N,N,N,N,N,N,N,N,43345,N,N,43346,43347,N,N,43348,21051,13857,33088,\r
+18015,33089,33090,33091,19826,21833,18557,18767,20290,22562,12859,21355,33092,\r
+22564,13171,33093,22312,18258,22567,19008,33094,18288,12667,21045,13396,13867,\r
+19263,22569,33095,33096,33097,13866,33098,16701,20815,33099,18725,22573,33100,\r
+14454,20798,25436,22096,33101,33102,14177,33103,13358,33104,16729,33105,22588,\r
+33106,19816,13604,20010,22135,33107,16502,15961,22575,33108,33109,33110,17483,\r
+33111,15939,33112,22577,17204,21093,33113,22062,20058,21799,14965,14118,16470,\r
+33114,17977,17746,18247,33115,14676,33116,13131,21074,33117,33118,22591,15941,\r
+18034,21042,20272,20327,33119,33120,33121,33122,19049,33123,33124,22592,33125,\r
+33126,33127,33128,33129,33130,17010,16978,33131,18537,33132,33133,33134,33135,\r
+33136,33137,33138,33139,33140,33141,18220,33142,33143,33144,33145,33146,33147,\r
+33148,16715,33149,21352,21881,33150,19010,13950,22561,21338,16247,33152,21574,\r
+15141,22593,20069,15918,33153,33154,22568,33155,20807,20521,33156,33157,33158,\r
+22589,22895,19830,16186,33159,15675,14885,21088,12922,14944,17462,33160,20333,\r
+15913,19748,16705,33161,33162,33163,18263,22897,33164,22900,33165,33166,33167,\r
+33168,18507,22633,33169,33170,33171,21082,18994,18506,22636,22634,22598,15734,\r
+17997,13168,33172,22635,15729,15721,33173,18516,13395,33174,33175,16984,33176,\r
+12886,22352,19019,19323,21836,14390,20297,33177,33178,33179,22874,22640,18218,\r
+33180,22638,33181,13434,16750,21076,33182,33183,22637,33184,21063,22639,17223,\r
+33185,33186,33187,20854,33188,22105,22642,33189,22645,15486,15451,33190,33191,\r
+33192,18510,33193,14173,33194,14146,33195,18035,33196,33197,33198,33199,33200,\r
+33201,33202,22648,21057,33203,33204,20073,15423,14204,14117,20573,33205,33206,\r
+33207,33208,33209,22106,21317,15215,15201,22641,33210,33211,18721,20016,13355,\r
+33212,22643,33213,18763,22646,16983,22647,33214,33215,20017,22649,33216,33217,\r
+33218,12846,14656,33219,22819,33220,12393,33221,16742,33222,18796,33223,19269,\r
+33224,19270,22820,33225,33226,33227,33228,33229,13672,33230,33231,13611,33232,\r
+33233,33234,33235,33236,33237,20027,13645,22305,22388,21331,33238,19557,33239,\r
+14926,33240,22818,22876,21344,22653,14192,22391,22654,22650,22817,17507,33241,\r
+33242,21302,22644,22877,33243,22651,33244,17765,33245,33246,16464,33247,33248,\r
+20848,12379,33249,33250,15441,22822,33251,22821,33252,33253,33254,33255,22828,\r
+22830,33256,22827,19001,33257,33258,33259,22825,22070,33260,33261,33262,13150,\r
+22824,33263,16509,33264,19020,33265,22826,33266,22823,33267,33268,22832,33269,\r
+33270,13873,33271,33272,33273,14633,33274,21056,33275,33276,20288,33277,33278,\r
+16962,33344,15684,21868,12896,18248,16235,22829,33345,22831,33346,20074,14958,\r
+33347,33348,33349,33350,33351,18262,33352,33353,33354,33355,33356,33357,33358,\r
+33359,33360,12643,33361,33362,33363,13401,13933,22836,33364,33365,33366,33367,\r
+16161,33368,33369,33370,22878,18254,16510,22840,33371,33372,33373,33374,33375,\r
+19287,14205,33376,22837,33377,22839,12579,21345,22841,33378,20549,33379,22838,\r
+33380,33381,22833,33382,22834,16681,22835,33383,33384,15475,20574,14377,33385,\r
+15971,33386,22845,33387,33388,33389,33390,22842,33391,12339,33392,33393,33394,\r
+22850,33395,33396,33397,33398,33399,33400,33401,33402,33403,33404,33405,33406,\r
+33408,22852,12598,33409,22847,33410,33411,13625,33412,15987,33413,33414,33415,\r
+19528,14962,21072,33416,22851,33417,33418,15720,33419,13099,33420,33421,33422,\r
+22853,15979,33423,22854,22843,17503,33424,22846,22849,22848,33425,33426,33427,\r
+33428,33429,33430,33431,33432,33433,33434,33435,21806,33436,22069,33437,18275,\r
+33438,33439,33440,33441,22856,33442,33443,33444,15449,22858,33445,33446,33447,\r
+22844,33448,22859,17963,33449,33450,33451,33452,33453,22857,33454,33455,33456,\r
+33457,22390,33458,19747,33459,33460,33461,33462,33463,33464,33465,33466,15649,\r
+33467,33468,33469,33470,33471,33472,22860,33473,33474,33475,33476,33477,33478,\r
+33479,33480,33481,17724,19765,33482,33483,33484,22861,33485,33486,22855,13093,\r
+16254,33487,33488,33489,33490,14389,33491,33492,16508,33493,33494,33495,33496,\r
+12408,33497,33498,33499,33500,33501,33502,33503,33504,33505,33506,33507,33508,\r
+33509,33510,33511,33512,33513,33514,33515,33516,33517,13430,33518,22862,33519,\r
+22863,13346,22864,33520,33521,13407,33522,33523,33524,33525,33526,12353,33527,\r
+33528,33529,33530,33531,33532,33533,22865,18741,33534,33600,33601,33602,33603,\r
+33604,33605,33606,33607,33608,33609,33610,33611,33612,33613,33614,33615,33616,\r
+33617,20337,33618,33619,33620,33621,33622,33623,22866,33624,33625,33626,16709,\r
+33627,33628,33629,33630,33631,33632,33633,33634,33635,33636,33637,22870,18734,\r
+33638,33639,33640,33641,22869,22868,22871,33642,33643,33644,33645,19291,33646,\r
+15657,33647,33648,33649,33650,33651,17959,33652,33653,33654,33655,33656,33657,\r
+33658,33659,33660,33661,22867,22872,33662,33664,33665,22873,33666,33667,33668,\r
+33669,33670,33671,18533,33672,33673,33674,33675,33676,33677,33678,33679,33680,\r
+33681,33682,33683,33684,33685,16476,33686,33687,33688,33689,33690,33691,33692,\r
+33693,33694,33695,33696,33697,33698,33699,33700,33701,33702,33703,33704,33705,\r
+33706,33707,33708,33709,33710,33711,33712,33713,33714,13945,22563,21578,33715,\r
+21546,20566,13156,21847,33716,20296,14690,33717,16203,33718,17250,33719,33720,\r
+33721,13906,33722,33723,19779,22894,22896,33724,33725,33726,13619,33727,13877,\r
+33728,33729,33730,33731,33732,15908,33733,33734,18539,33735,33736,18475,33737,\r
+33738,12363,14635,16761,22882,33739,16444,14642,33740,14680,20555,12664,18020,\r
+15967,13668,22344,33741,20856,15462,19038,33742,33743,15421,22886,22631,33744,\r
+33745,17498,33746,33747,14420,18493,33748,33749,12897,21593,33750,33751,33752,\r
+33753,17200,33754,33755,17249,23074,18527,33756,20532,33757,15996,17705,33758,\r
+33759,33760,14682,33761,23075,33762,21545,23076,33763,33764,33765,33766,33767,\r
+22907,13868,33768,33769,14187,12665,22908,13157,15990,33770,16246,21041,16484,\r
+33771,33772,33773,13875,22910,22909,33774,33775,15931,33776,33777,33778,18016,\r
+33779,22332,23073,33780,16697,33781,13682,16744,33782,33783,15477,33784,13397,\r
+33785,33786,33787,33788,33789,33790,33856,33857,33858,16733,33859,17533,33860,\r
+33861,15416,14130,33862,33863,14191,33864,33865,33866,33867,33868,33869,22892,\r
+33870,17982,33871,16173,15179,33872,33873,13642,33874,23369,20567,33875,19769,\r
+12348,13174,15223,23370,14895,33876,21604,13622,13683,22614,18512,33877,33878,\r
+14166,18256,22615,33879,16175,33880,33881,23355,22616,33882,33883,20556,15150,\r
+33884,33885,33886,27454,16720,16757,21618,14421,13364,33887,13173,33888,33889,\r
+18750,33890,33891,33892,17744,33893,33894,33895,17753,16507,33896,12656,33897,\r
+22617,14670,33898,13629,33899,33900,22618,33901,33902,22086,19234,18479,18738,\r
+13388,16204,33903,14708,33904,22619,22620,13927,15425,19562,33905,33906,33907,\r
+33908,33909,33910,20343,33911,22621,18224,33912,33913,14672,15651,33914,33915,\r
+19550,33916,17994,33917,33918,33920,33921,33922,22624,33923,22622,33924,33925,\r
+22623,33926,33927,33928,12414,33929,15975,33930,18979,15476,33931,33932,33933,\r
+33934,14385,33935,33936,14446,33937,33938,33939,33940,33941,33942,33943,33944,\r
+33945,33946,22626,33947,15691,33948,22628,22627,33949,33950,33951,33952,33953,\r
+17788,33954,33955,33956,33957,33958,33959,33960,22629,33961,33962,22630,33963,\r
+33964,33965,33966,33967,33968,33969,16678,33970,18480,12396,14630,15443,20081,\r
+23357,16723,33971,33972,33973,33974,13871,22138,17708,15705,23358,23359,33975,\r
+33976,33977,16504,15906,16461,33978,33979,33980,33981,33982,33983,33984,33985,\r
+33986,33987,23360,19014,33988,33989,33990,12842,33991,33992,33993,21314,33994,\r
+17251,33995,20779,33996,33997,33998,33999,23362,34000,16469,34001,34002,34003,\r
+23363,34004,16177,34005,34006,34007,34008,34009,34010,17468,34011,34012,34013,\r
+34014,18266,34015,34016,34017,34018,34019,34020,34021,34022,34023,34024,34025,\r
+23364,34026,34027,34028,34029,34030,34031,34032,34033,22888,18775,34034,34035,\r
+34036,14644,20080,21576,34037,34038,34039,34040,12412,13394,34041,20569,34042,\r
+34043,34044,34045,22889,34046,24139,22891,34112,34113,34114,34115,22576,15151,\r
+12593,34116,13143,22606,34117,34118,21585,34119,34120,15667,16239,34121,20283,\r
+34122,34123,22608,34124,34125,34126,14155,34127,34128,34129,22609,34130,34131,\r
+34132,34133,34134,34135,34136,34137,34138,34139,17957,18296,21053,34140,34141,\r
+22610,17508,34142,18990,34143,18215,34144,22566,34145,18813,20071,15196,12395,\r
+34146,34147,34148,15146,20525,34149,12592,22372,22335,34150,13605,17012,17487,\r
+34151,34152,12841,34153,12855,34154,12645,24370,21820,16168,16940,22613,16945,\r
+34155,22612,20052,34156,23136,34157,20032,34158,34159,22580,17198,21281,20003,\r
+34160,15412,18484,16977,34161,15981,20534,34162,23137,34163,34164,34165,34166,\r
+18276,34167,34168,13095,34169,13938,19580,16506,34170,34171,16503,34172,20793,\r
+20833,22599,34173,34174,34176,34177,34178,34179,34180,12894,34181,34182,16485,\r
+34183,14961,34184,34185,22600,34186,21549,34187,34188,20321,22601,34189,22602,\r
+20291,34190,13176,15943,34191,34192,34193,34194,22603,34195,34196,34197,34198,\r
+34199,34200,34201,23372,34202,34203,34204,34205,18469,34206,34207,34208,20312,\r
+34209,18558,12878,34210,34211,34212,34213,34214,21334,12902,15408,21329,19243,\r
+14132,34215,34216,34217,14114,34218,34219,19045,34220,18465,19036,12644,20592,\r
+34221,17745,34222,34223,34224,23365,13694,34225,34226,16218,14661,15972,16749,\r
+34227,24374,24373,22075,15696,21849,12360,13859,16201,19496,24371,18999,21330,\r
+34228,22607,21046,14917,19262,19518,34229,24375,13680,24372,34230,34231,34232,\r
+21365,34233,13140,14455,34234,24378,34235,14927,15402,13685,34236,19756,17275,\r
+14963,16500,19778,20338,24376,20293,34237,16960,24377,17008,34238,34239,34240,\r
+15997,34241,16735,19788,21111,14157,24385,34242,24388,34243,34244,14193,12361,\r
+13910,14164,34245,14892,19581,16212,19249,18036,34246,22056,24389,34247,20066,\r
+13107,34248,34249,20092,13365,34250,20039,14960,34251,20065,34252,20797,34253,\r
+34254,24384,34255,34256,13428,34257,13130,34258,14438,24379,34259,34260,34261,\r
+34262,17477,34263,24380,24381,24382,17723,24383,24386,21553,24387,34264,18234,\r
+20056,34265,34266,34267,34268,34269,17496,34270,24394,34271,24399,34272,22108,\r
+34273,34274,34275,34276,34277,34278,34279,34280,24393,24410,20022,34281,14919,\r
+24398,24392,17758,34282,34283,18795,14964,17276,34284,34285,15959,34286,24390,\r
+34287,24397,34288,17752,34289,34290,34291,34292,21798,14925,34293,15948,21309,\r
+14400,34294,22116,34295,24391,14654,16167,34296,34297,16764,24395,24396,34298,\r
+24400,34299,34300,34301,34302,34368,24411,24421,34369,24407,24406,22345,24419,\r
+24420,25963,21031,24402,34370,16169,34371,21595,34372,16200,24404,34373,34374,\r
+34375,20300,34376,34377,24413,34378,20810,34379,24414,12327,17975,24403,34380,\r
+14949,34381,13919,19803,14718,21589,34382,34383,24415,20332,12325,24423,24401,\r
+20806,24405,24408,24409,24412,34384,15145,34385,24416,24417,34386,24418,24422,\r
+24424,21300,34387,34388,34389,34390,34391,14439,17718,24426,18778,16680,17476,\r
+34392,34393,16222,20344,34394,34395,34396,21852,24430,34397,34398,34399,34400,\r
+34401,34402,12856,34403,14943,24428,34404,23361,34405,20836,34406,34407,34408,\r
+34409,19316,13373,34410,12326,34411,34412,34413,34414,34415,24433,19526,24434,\r
+34416,34417,24429,34418,34419,34420,34421,34422,34423,24425,34424,34425,34426,\r
+34427,24427,34428,24431,24432,15165,34429,34430,24435,34432,34433,24436,34434,\r
+15139,34435,19035,20008,24615,13098,34436,24614,34437,34438,34439,24609,34440,\r
+34441,34442,34443,24446,34444,19801,24444,34445,24442,34446,16208,22340,34447,\r
+18764,34448,34449,24440,12321,34450,34451,34452,34453,34454,24445,34455,34456,\r
+34457,34458,24443,24610,34459,34460,34461,34462,34463,24616,34464,34465,34466,\r
+34467,14152,34468,34469,17953,18742,16434,24437,34470,34471,17726,34472,22596,\r
+24441,17526,34473,34474,34475,34476,34477,34478,24611,24612,24613,20517,34479,\r
+34480,24628,19556,34481,24625,34482,16166,24623,20025,24619,18758,34483,34484,\r
+16430,24622,14957,14896,24617,34485,34486,34487,24438,34488,24627,34489,34490,\r
+24632,34491,34492,34493,13357,24633,34494,34495,20274,14920,34496,24624,34497,\r
+34498,34499,34500,34501,34502,34503,20602,34504,34505,34506,34507,34508,34509,\r
+34510,34511,34512,24620,34513,21627,34514,24439,34515,17767,34516,24621,34517,\r
+21367,34518,24630,24631,34519,34520,34521,34522,34523,24644,20577,34524,34525,\r
+34526,24636,34527,34528,24649,24650,34529,34530,34531,24638,24618,18724,24641,\r
+34532,24626,34533,34534,34535,34536,34537,19016,24643,34538,24629,34539,20043,\r
+34540,19267,24653,24646,24642,34541,24651,34542,24634,24639,24640,34543,34544,\r
+24645,34545,34546,24647,24648,34547,24652,34548,24635,34549,34550,34551,34552,\r
+34553,19284,24661,34554,24662,24658,34555,34556,34557,34558,34624,34625,24656,\r
+15438,34626,34627,24657,34628,14402,22597,34629,34630,34631,34632,34633,34634,\r
+34635,34636,20586,34637,34638,17007,34639,34640,24655,24637,34641,34642,34643,\r
+24660,24659,34644,34645,24663,34646,34647,34648,34649,24668,24664,34650,34651,\r
+34652,22134,13104,34653,22380,34654,19259,34655,34656,24666,34657,20091,34658,\r
+34659,34660,14937,34661,34662,34663,34664,34665,34666,34667,34668,34669,34670,\r
+34671,34672,24673,24669,21037,34673,34674,34675,34676,34677,24674,34678,34679,\r
+24667,24665,24671,34680,34681,24672,34682,34683,34684,34685,34686,24670,34688,\r
+24676,34689,34690,34691,18039,22572,21611,24678,19017,34692,34693,34694,34695,\r
+24677,34696,34697,34698,34699,14401,34700,34701,34702,34703,24679,24680,34704,\r
+34705,34706,34707,34708,34709,34710,34711,24681,24675,34712,34713,34714,34715,\r
+34716,34717,34718,14911,19559,34719,34720,34721,24682,34722,34723,34724,34725,\r
+34726,34727,34728,34729,34730,34731,34732,34733,34734,34735,34736,20345,34737,\r
+34738,34739,34740,34741,34742,34743,34744,34745,34746,34747,24683,34748,34749,\r
+34750,34751,34752,34753,34754,18498,34755,34756,34757,34758,15680,34759,34760,\r
+34761,34762,34763,34764,34765,34766,34767,34768,34769,34770,34771,17490,34772,\r
+34773,34774,34775,34776,34777,34778,34779,34780,24684,34781,34782,24685,34783,\r
+34784,18292,19268,34785,24686,15192,22582,21106,24687,19781,34786,13914,34787,\r
+34788,34789,34790,34791,34792,24689,34793,21552,34794,34795,16423,13393,34796,\r
+34797,20007,24688,34798,34799,34800,24690,14668,34801,34802,14714,19772,24691,\r
+34803,34804,34805,18004,24692,34806,21554,34807,18470,24694,24693,34808,34809,\r
+34810,34811,34812,34813,34814,34880,34881,34882,34883,34884,34885,34886,34887,\r
+34888,34889,24695,34890,34891,19777,34892,34893,34894,18981,34895,34896,34897,\r
+34898,21594,23383,23385,34899,23384,14695,23388,23389,13656,34900,34901,23386,\r
+34902,34903,34904,34905,34906,23387,13089,23391,34907,34908,15224,34909,22071,\r
+34910,23392,34911,34912,34913,34914,15993,34915,34916,14139,34917,23376,19502,\r
+16178,15157,22392,16211,34918,34919,34920,34921,34922,16233,34923,34924,15457,\r
+19507,23390,12371,20075,14168,22329,17986,34925,34926,16420,34927,19513,34928,\r
+23399,23393,17978,23395,34929,23400,34930,17783,34931,34932,34933,23402,34934,\r
+34935,23401,16192,34936,34937,34938,23398,23397,34939,34940,34941,34942,34944,\r
+13369,16428,16930,23394,23396,34945,34946,34947,34948,20557,23405,34949,34950,\r
+34951,34952,34953,16477,23410,34954,34955,34956,34957,34958,34959,34960,13922,\r
+34961,34962,34963,34964,23411,23378,14648,21547,23404,34965,16209,23408,34966,\r
+23377,34967,13670,34968,23403,16229,34969,34970,34971,23406,34972,23409,34973,\r
+34974,34975,23417,34976,34977,34978,34979,34980,34981,34982,34983,34984,14625,\r
+12323,34985,34986,34987,34988,34989,34990,34991,17009,34992,34993,13127,23407,\r
+34994,34995,23416,34996,18002,23412,34997,34998,23413,23415,23414,34999,35000,\r
+23422,35001,21362,12858,35002,35003,35004,23421,35005,35006,35007,35008,35009,\r
+35010,35011,35012,23588,35013,23419,35014,35015,35016,35017,23418,35018,35019,\r
+35020,23420,17760,15225,35021,35022,23587,35023,35024,23589,35025,19523,35026,\r
+35027,35028,13905,23872,35029,35030,35031,23585,35032,23586,35033,35034,35035,\r
+18229,35036,35037,35038,13929,35039,35040,35041,23591,35042,35043,35044,35045,\r
+23590,35046,23593,12580,35047,35048,13644,35049,35050,35051,35052,35053,16176,\r
+35054,35055,35056,35057,35058,20831,35059,35060,35061,35062,13890,35063,35064,\r
+35065,35066,35067,35068,35069,35070,35136,35137,35138,35139,35140,35141,23592,\r
+35142,35143,35144,35145,35146,35147,35148,19322,27507,35149,35150,35151,19292,\r
+35152,35153,19326,35154,35155,35156,19521,35157,35158,35159,35160,35161,18555,\r
+35162,35163,35164,35165,35166,35167,23594,35168,35169,35170,35171,35172,19566,\r
+23595,35173,35174,35175,35176,35177,35178,35179,35180,35181,35182,35183,35184,\r
+35185,35186,35187,35188,35189,23379,35190,23599,23596,35191,15923,35192,19067,\r
+35193,35194,35195,23597,35196,35197,35198,35200,35201,35202,35203,35204,18762,\r
+17465,35205,35206,35207,35208,35209,18237,23598,35210,35211,35212,21622,20582,\r
+35213,35214,35215,35216,35217,35218,35219,35220,17451,13909,35221,35222,35223,\r
+35224,35225,35226,35227,35228,35229,35230,35231,35232,35233,35234,35235,35236,\r
+35237,35238,23380,35239,35240,35241,35242,12634,35243,35244,35245,23381,35246,\r
+35247,35248,35249,35250,35251,35252,35253,35254,35255,35256,23382,35257,35258,\r
+35259,14910,35260,35261,35262,35263,35264,35265,35266,35267,35268,35269,35270,\r
+35271,35272,35273,18496,35274,35275,35276,35277,35278,35279,19007,18505,35280,\r
+22323,35281,18809,35282,35283,16199,35284,35285,14968,35286,35287,21052,35288,\r
+35289,35290,35291,35292,35293,35294,35295,25146,35296,13350,35297,35298,12600,\r
+35299,35300,35301,35302,35303,14388,35304,20292,35305,35306,35307,35308,22887,\r
+20262,19810,35309,35310,22893,13920,35311,21049,35312,35313,14651,35314,35315,\r
+35316,35317,25145,25143,35318,13427,35319,19564,19499,14194,35320,22578,20843,\r
+14907,35321,18983,35322,35323,19767,35324,35325,21060,16228,15440,13921,35326,\r
+24133,35392,35393,35394,35395,24134,23356,35396,20825,35397,35398,18022,17486,\r
+14190,35399,14172,35400,35401,16252,22368,35402,18037,35403,35404,12604,24136,\r
+15665,19543,24138,35405,24137,35406,35407,35408,35409,35410,13676,35411,18781,\r
+35412,35413,12354,35414,35415,35416,35417,35418,35419,35420,35421,35422,35423,\r
+35424,35425,35426,17710,17707,35427,17484,35428,15465,19325,35429,35430,35431,\r
+14915,35432,35433,35434,25977,18535,25978,19837,35435,22321,14398,17000,35436,\r
+18513,35437,35438,25979,35439,35440,35441,35442,13898,15435,35443,35444,20861,\r
+26145,35445,17262,35446,35447,35448,35449,26148,35450,35451,35452,35453,25982,\r
+26149,19799,35454,35456,14145,25980,25981,26147,35457,35458,17501,26152,35459,\r
+35460,26151,35461,35462,35463,35464,35465,35466,17219,35467,18014,35468,35469,\r
+26154,35470,35471,35472,35473,35474,35475,35476,17463,35477,35478,35479,26146,\r
+19004,35480,35481,35482,35483,15715,14659,26150,20565,20015,35484,35485,26153,\r
+26160,35486,21030,35487,15658,26157,35488,35489,35490,35491,35492,26159,35493,\r
+16465,35494,35495,21068,35496,35497,35498,15399,35499,35500,35501,35502,35503,\r
+35504,35505,35506,35507,35508,35509,35510,26161,35511,21110,35512,35513,35514,\r
+22347,35515,19838,35516,19806,16934,26155,26156,15679,26158,26163,35517,35518,\r
+26162,35519,35520,35521,35522,26166,35523,26168,35524,35525,35526,35527,17519,\r
+35528,35529,35530,17480,35531,35532,15978,18799,35533,35534,26167,35535,13936,\r
+35536,35537,35538,17252,35539,35540,35541,35542,35543,35544,35545,21353,26164,\r
+35546,26165,35547,18466,35548,35549,35550,35551,35552,26173,35553,35554,35555,\r
+26169,35556,35557,35558,35559,35560,17989,35561,35562,19825,26171,35563,35564,\r
+35565,35566,35567,35568,35569,35570,35571,35572,26172,35573,35574,35575,35576,\r
+15209,35577,35578,35579,35580,35581,35582,35648,26174,35649,35650,35651,35652,\r
+26170,35653,35654,16439,35655,35656,35657,35658,35659,35660,35661,35662,35663,\r
+21284,26175,18804,26179,35664,35665,26180,35666,35667,35668,35669,20598,35670,\r
+35671,35672,35673,35674,35675,35676,35677,35678,35679,35680,35681,35682,35683,\r
+35684,35685,35686,35687,17213,35688,35689,35690,35691,35692,35693,35694,17220,\r
+26178,35695,35696,35697,35698,35699,35700,35701,35702,35703,35704,35705,35706,\r
+35707,35708,26177,35709,35710,35712,35713,35714,35715,35716,26183,20273,35717,\r
+27508,35718,35719,26186,35720,35721,35722,35723,35724,26181,35725,35726,15454,\r
+18729,35727,35728,35729,35730,35731,35732,15413,35733,35734,20307,35735,35736,\r
+35737,35738,35739,26184,35740,26185,35741,26190,35742,26192,35743,35744,35745,\r
+26193,35746,35747,35748,26187,13653,35749,26188,35750,35751,26191,35752,35753,\r
+17499,35754,26182,35755,35756,35757,35758,35759,26189,35760,35761,35762,35763,\r
+35764,35765,35766,35767,35768,35769,35770,35771,35772,35773,35774,35775,35776,\r
+35777,35778,35779,35780,35781,35782,26194,35783,35784,35785,35786,35787,35788,\r
+35789,35790,35791,35792,35793,35794,26196,26195,35795,35796,35797,35798,35799,\r
+35800,35801,35802,35803,35804,35805,35806,35807,35808,35809,35810,35811,35812,\r
+35813,35814,35815,35816,35817,35818,35819,35820,26197,35821,22904,35822,35823,\r
+26198,35824,35825,35826,35827,35828,35829,35830,35831,26199,35832,35833,35834,\r
+35835,35836,35837,35838,35904,35905,35906,35907,35908,35909,35910,35911,22355,\r
+26205,35912,26206,16215,21584,35913,22358,13414,19311,26202,22595,22350,20514,\r
+35914,17231,35915,35916,26207,15422,14658,26203,20775,35917,35918,14882,16975,\r
+35919,22571,35920,35921,35922,19051,25966,35923,26204,35924,14197,35925,35926,\r
+35927,35928,18534,35929,35930,17525,35931,35932,25906,17534,35933,19324,25907,\r
+21804,35934,21358,19032,12338,35935,19278,19818,35936,35937,14954,35938,35939,\r
+35940,25909,35941,25908,35942,22362,14681,22118,13864,19824,21067,12582,18997,\r
+35943,13160,18803,16205,20603,19026,25910,15170,35944,35945,35946,20316,14636,\r
+35947,35948,35949,35950,21591,35951,35952,14886,20839,20348,15442,35953,25911,\r
+18525,35954,35955,35956,16237,12662,19294,35957,35958,15429,35959,15428,21114,\r
+17244,16220,35960,35961,35962,35963,14395,35964,35965,35966,17218,35968,14894,\r
+21538,35969,35970,35971,35972,35973,35974,35975,35976,35977,18270,17455,12908,\r
+35978,14673,35979,35980,25915,16712,35981,35982,21807,35983,35984,35985,35986,\r
+35987,25916,35988,25918,35989,35990,35991,35992,35993,35994,35995,13415,13908,\r
+19266,20784,13628,35996,35997,19033,35998,14178,35999,36000,18788,36001,15659,\r
+36002,36003,20030,22384,36004,36005,36006,36007,20513,36008,18777,36009,36010,\r
+13947,26200,15458,36011,13118,36012,18768,36013,26201,13090,36014,36015,36016,\r
+36017,24140,36018,21320,24141,36019,21026,36020,36021,36022,36023,24142,36024,\r
+36025,36026,36027,15949,36028,36029,24143,36030,36031,36032,18988,21116,13151,\r
+25962,17505,15905,20018,17522,15958,17960,12899,36033,36034,15955,36035,36036,\r
+18300,19563,15724,20061,36037,36038,19002,17985,25964,20540,36039,36040,36041,\r
+21817,36042,36043,36044,25965,36045,36046,36047,36048,19060,36049,19776,16965,\r
+36050,25967,36051,16964,25968,36052,36053,36054,36055,36056,36057,36058,25976,\r
+19789,36059,18749,36060,36061,36062,36063,36064,36065,36066,21081,24872,36067,\r
+36068,36069,36070,21356,36071,19306,18033,36072,36073,36074,36075,36076,24876,\r
+36077,36078,36079,24871,24873,36080,36081,24874,24879,36082,36083,12909,36084,\r
+24875,14426,24877,24878,24880,13626,24881,36085,36086,36087,36088,36089,24883,\r
+24888,36090,36091,36092,36093,36094,20818,36160,24886,24885,16747,36161,36162,\r
+36163,24887,36164,21568,36165,24882,36166,24890,12342,36167,36168,36169,36170,\r
+24884,36171,16249,36172,24889,36173,36174,24891,36175,36176,36177,36178,36179,\r
+36180,24894,36181,36182,36183,36184,36185,36186,24892,36187,36188,36189,36190,\r
+36191,36192,22085,36193,36194,36195,36196,36197,36198,36199,20287,36200,36201,\r
+24893,24895,16973,36202,13931,36203,21368,36204,36205,18253,36206,36207,14181,\r
+36208,36209,36210,36211,36212,36213,36214,36215,36216,36217,15998,36218,36219,\r
+36220,36221,36222,36224,24896,24897,36225,36226,24903,13159,36227,36228,36229,\r
+36230,36231,36232,18025,36233,36234,36235,36236,36237,13406,36238,20802,36239,\r
+36240,36241,36242,24904,36243,36244,24902,36245,36246,36247,36248,36249,24901,\r
+36250,24899,24898,36251,12608,36252,36253,36254,21816,24900,36255,36256,36257,\r
+36258,36259,24907,36260,36261,36262,36263,36264,36265,36266,36267,24908,24906,\r
+36268,36269,36270,36271,36272,36273,36274,36275,28538,36276,36277,24915,24914,\r
+18230,36278,36279,36280,36281,36282,36283,36284,36285,36286,36287,36288,24905,\r
+36289,36290,24910,36291,24912,36292,36293,36294,36295,36296,36297,36298,36299,\r
+36300,36301,36302,24916,36303,24913,24909,36304,36305,24911,36306,36307,36308,\r
+36309,24917,36310,36311,36312,36313,36314,36315,36316,36317,36318,36319,36320,\r
+36321,36322,24918,36323,36324,36325,36326,36327,36328,36329,36330,36331,36332,\r
+36333,36334,36335,36336,36337,36338,36339,36340,36341,36342,36343,36344,24919,\r
+36345,36346,36347,24920,36348,36349,36350,36416,36417,36418,36419,36420,36421,\r
+36422,36423,36424,36425,36426,36427,36428,36429,36430,36431,36432,36433,36434,\r
+36435,36436,36437,24922,36438,36439,36440,36441,36442,36443,36444,36445,36446,\r
+36447,36448,36449,36450,24923,36451,36452,36453,36454,36455,36456,36457,20001,\r
+36458,36459,36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,\r
+26461,36471,13352,22109,36472,36473,20786,13106,36474,36475,14628,22387,18249,\r
+15966,14638,36476,20055,36477,36478,12910,23375,36480,15418,21073,19272,12365,\r
+36481,36482,20335,36483,36484,36485,36486,36487,22883,15725,36488,36489,12626,\r
+19024,12860,36490,19239,14123,36491,18982,36492,36493,36494,20259,36495,36496,\r
+24696,21834,24699,36497,36498,24698,17729,19579,36499,16689,24697,22115,12847,\r
+22084,13659,36500,36501,36502,36503,36504,36505,36506,36507,13432,22049,36508,\r
+36509,36510,36511,36512,20271,12399,36513,36514,24700,36515,36516,36517,36518,\r
+36519,24865,13091,36520,36521,24701,24702,17201,36522,36523,36524,36525,17245,\r
+36526,24866,14201,36527,36528,36529,36530,36531,36532,15183,36533,36534,36535,\r
+36536,36537,36538,36539,24867,17467,36540,36541,36542,36543,36544,24868,36545,\r
+36546,24869,36547,36548,24870,13361,36549,36550,36551,36552,36553,36554,36555,\r
+36556,36557,36558,36559,36560,36561,36562,36563,14409,17981,17514,36564,12834,\r
+36565,20562,36566,26459,15171,21335,21316,36567,14691,25167,36568,36569,36570,\r
+22319,36571,18284,12627,36572,36573,13362,25169,36574,36575,36576,20594,16942,\r
+25168,36577,16226,21286,13655,25170,13674,36578,17261,14461,36579,14382,36580,\r
+17747,14159,25172,36581,36582,36583,36584,25171,13896,22393,36585,36586,36587,\r
+36588,36589,19749,36590,36591,36592,36593,36594,25176,36595,25174,19068,16181,\r
+21305,25173,36596,36597,36598,36599,25175,36600,36601,36602,36603,36604,36605,\r
+36606,36672,36673,36674,16686,16456,36675,36676,36677,36678,36679,36680,25179,\r
+25178,16426,36681,36682,16718,36683,36684,36685,36686,25180,36687,36688,36689,\r
+36690,36691,36692,36693,36694,36695,36696,36697,36698,25181,36699,25182,36700,\r
+36701,36702,36703,36704,36705,36706,36707,36708,23368,36709,20819,19746,36710,\r
+36711,15656,36712,36713,36714,24131,22565,16170,23373,21100,18042,17706,36715,\r
+36716,36717,24132,36718,12631,24366,36719,36720,36721,19005,36722,24369,36723,\r
+14637,36724,21117,36725,14373,14955,36726,36727,13146,36728,36729,36730,13660,\r
+21829,36731,36732,36733,36734,17238,20306,15137,36736,25971,25970,36737,36738,\r
+25972,36739,19812,36740,18549,36741,36742,36743,36744,36745,36746,36747,13615,\r
+18239,36748,25974,36749,36750,36751,27696,36752,36753,36754,36755,36756,36757,\r
+36758,36759,36760,36761,36762,36763,36764,36765,36766,25958,36767,14697,13617,\r
+36768,16956,25960,25959,25961,36769,36770,36771,36772,21069,36773,36774,36775,\r
+24938,20558,36776,19758,36777,20837,36778,36779,12874,12651,36780,12658,17773,\r
+36781,36782,21827,21296,36783,24924,36784,36785,36786,24925,36787,21083,36788,\r
+13113,12619,36789,36790,36791,19833,21879,24926,36792,15926,13437,36793,24927,\r
+14940,24928,15154,16969,24929,36794,36795,36796,20588,36797,19773,36798,36799,\r
+24930,36800,13635,17735,24931,36801,36802,24932,36803,36804,36805,36806,21369,\r
+36807,36808,36809,36810,36811,36812,24933,36813,20781,36814,36815,24934,20002,\r
+36816,36817,36818,36819,36820,36821,24935,36822,13634,36823,36824,36825,36826,\r
+24936,15189,36827,36828,36829,36830,36831,20548,25184,12632,21092,36832,36833,\r
+25185,36834,36835,15433,18508,36836,25187,27774,27773,24367,36837,36838,36839,\r
+25186,22078,19836,17190,36840,36841,36842,25411,36843,36844,22098,25191,36845,\r
+36846,25192,36847,36848,21319,36849,36850,25196,16236,36851,25197,25189,36852,\r
+36853,13120,36854,36855,36856,17518,36857,36858,25198,36859,36860,20547,36861,\r
+14966,25193,14174,15155,19500,19275,25188,25190,25194,25195,36862,36928,36929,\r
+25207,36930,36931,25204,21621,25203,36932,36933,17709,36934,21882,17730,12864,\r
+36935,36936,25199,36937,25202,16687,19260,36938,36939,13601,25209,36940,36941,\r
+36942,15409,25201,20564,21561,25205,14678,25206,36943,36944,36945,18259,36946,\r
+36947,36948,36949,36950,25200,36951,36952,36953,36954,36955,22364,27937,36956,\r
+36957,25208,36958,27941,25214,19025,36959,36960,36961,36962,36963,36964,36965,\r
+16693,36966,15184,36967,36968,16214,36969,14947,36970,36971,19233,36972,36973,\r
+36974,27942,27939,36975,36976,27938,36977,36978,36979,36980,15190,27943,20596,\r
+36981,36982,27940,14942,13943,25377,13874,19569,14631,36983,20258,18209,36984,\r
+36985,16210,36986,36987,13937,36988,25210,25211,25213,25212,17493,25378,36989,\r
+21313,36990,36992,36993,25383,18244,36994,36995,36996,36997,20260,36998,36999,\r
+25385,14903,37000,37001,37002,37003,25384,37004,15194,37005,25379,37006,37007,\r
+37008,25380,25386,37009,25382,37010,20082,21318,37011,37012,15164,37013,37014,\r
+21571,37015,17530,37016,37017,27944,20604,25381,37018,17269,37019,25389,12591,\r
+37020,25394,37021,37022,37023,15426,37024,37025,25388,13631,37026,37027,37028,\r
+37029,37030,37031,37032,37033,18281,25392,37034,37035,37036,15914,19823,37037,\r
+37038,37039,37040,37041,15219,37042,37043,37044,19560,37045,37046,25391,37047,\r
+25393,37048,20263,25390,37049,20009,15197,37050,37051,37052,37053,37054,13675,\r
+15973,12882,13133,37055,12601,25387,12881,13612,14687,13928,37056,37057,20331,\r
+25399,37058,15180,37059,37060,18503,20554,37061,37062,37063,37064,37065,25400,\r
+13166,37066,37067,37068,37069,27945,37070,21370,21348,37071,37072,37073,27946,\r
+25401,21090,37074,37075,37076,37077,37078,25397,37079,37080,37081,37082,21342,\r
+37083,37084,37085,37086,14416,25395,37087,37088,25398,14175,37089,25396,16418,\r
+37090,37091,37092,25402,37093,37094,37095,37096,37097,37098,37099,37100,37101,\r
+37102,37103,37104,37105,37106,37107,37108,37109,37110,37111,21560,37112,37113,\r
+37114,37115,37116,37117,37118,37184,13384,37185,25403,37186,15173,37187,18807,\r
+37188,37189,18789,37190,37191,37192,17469,37193,37194,37195,37196,37197,37198,\r
+37199,27947,37200,37201,37202,37203,17021,37204,37205,37206,37207,15195,16174,\r
+37208,37209,37210,37211,37212,37213,37214,20031,37215,37216,37217,37218,25404,\r
+37219,16182,37220,37221,37222,37223,37224,37225,37226,37227,37228,37229,37230,\r
+37231,37232,37233,37234,37235,37236,37237,37238,12655,37239,37240,21623,37241,\r
+37242,37243,37244,37245,25406,37246,37248,37249,37250,37251,37252,37253,37254,\r
+27949,37255,37256,37257,37258,37259,37260,37261,37262,37263,25407,14889,27948,\r
+37264,37265,25405,37266,37267,37268,37269,37270,37271,37272,37273,37274,37275,\r
+25408,37276,37277,37278,37279,37280,37281,14902,37282,37283,37284,13870,37285,\r
+37286,37287,37288,37289,20536,37290,12355,27950,37291,37292,37293,37294,37295,\r
+27951,16449,37296,25409,37297,37298,37299,37300,37301,37302,37303,37304,37305,\r
+37306,37307,37308,37309,37310,37311,37312,37313,17715,37314,37315,37316,37317,\r
+37318,37319,37320,37321,37322,37323,37324,37325,37326,37327,25410,37328,37329,\r
+37330,37331,37332,37333,37334,37335,37336,23602,37337,37338,37339,37340,37341,\r
+37342,27952,37343,14442,37344,20076,27175,20583,19065,18518,20279,13129,20050,\r
+15716,37345,37346,25438,15218,27176,21821,37347,18013,27177,37348,37349,37350,\r
+27178,37351,27180,27179,37352,27182,27181,37353,37354,37355,37356,15704,37357,\r
+27183,37358,16958,37359,37360,37361,37362,13377,13431,37363,37364,15143,37365,\r
+37366,37367,37368,37369,27750,27749,14143,19321,12642,37370,27751,37371,37372,\r
+37373,18760,27752,27753,37374,19030,24144,12869,21626,37440,37441,17995,12359,\r
+13426,18515,37442,37443,37444,19792,37445,37446,16184,37447,37448,37449,37450,\r
+37451,37452,37453,16219,37454,37455,18212,22068,37456,16425,24145,18728,20847,\r
+17700,12391,13110,18501,37457,37458,12386,37459,37460,14198,37461,37462,17786,\r
+37463,37464,13939,37465,21842,13136,15420,37466,37467,37468,13101,37469,37470,\r
+37471,37472,15985,12369,37473,37474,37475,37476,37477,37478,21078,19043,22309,\r
+37479,19766,13878,16185,21851,37480,14375,17751,37481,37482,37483,24146,16217,\r
+16981,18240,37484,15140,12584,37485,37486,17770,37487,37488,17787,19495,37489,\r
+37490,37491,37492,12583,37493,37494,37495,13654,37496,37497,37498,17448,37499,\r
+24147,20794,13161,37500,17266,37501,37502,14199,37504,22132,13603,12912,17460,\r
+17513,16429,24148,37505,12392,17732,16736,37506,14677,37507,15964,19800,12366,\r
+37508,19791,24150,15952,22334,24149,21840,12381,37509,37510,17506,37511,37512,\r
+16931,15472,37513,21301,16441,17697,12838,21617,37514,37515,16424,19011,24151,\r
+21884,37516,14640,37517,18477,19241,37518,24153,16189,37519,37520,37521,37522,\r
+17972,22311,18992,17475,37523,13142,14674,37524,37525,37526,37527,22072,27260,\r
+12340,37528,37529,37530,37531,16230,37532,37533,19572,37534,37535,37536,37537,\r
+19802,37538,37539,37540,22079,16974,37541,20046,19490,20526,17491,13618,24152,\r
+21877,15415,15187,37542,37543,12324,37544,17714,13420,37545,37546,37547,21873,\r
+37548,37549,27261,37550,37551,37552,37553,37554,37555,24154,19750,37556,37557,\r
+19820,37558,37559,37560,37561,20070,24156,37562,19761,16422,37563,37564,22333,\r
+37565,24155,12358,14900,18771,17523,15976,37566,37567,37568,37569,12854,37570,\r
+37571,37572,37573,37574,37575,37576,37577,16460,19312,37578,15473,15163,13623,\r
+37579,37580,37581,17781,37582,24166,37583,37584,37585,24163,15965,37586,37587,\r
+24159,37588,37589,37590,37591,13367,15709,37592,37593,24160,17517,37594,37595,\r
+37596,37597,20294,37598,13664,37599,37600,37601,37602,13918,19034,13684,24165,\r
+37603,21830,37604,24161,19533,18046,37605,17733,37606,37607,37608,21044,37609,\r
+15986,37610,37611,37612,37613,37614,37615,37616,16979,37617,19517,13112,37618,\r
+15699,37619,16216,19782,20826,13419,37620,24164,24157,24167,37621,27262,37622,\r
+37623,16944,24162,37624,37625,22080,13607,37626,12916,37627,24168,37628,24178,\r
+37629,37630,37696,37697,37698,24173,37699,24177,37700,37701,18528,37702,37703,\r
+37704,22369,24175,17256,19553,37705,12901,37706,37707,37708,21054,37709,37710,\r
+37711,37712,37713,37714,37715,24174,37716,24171,20053,37717,13351,37718,37719,\r
+37720,37721,37722,16171,15934,37723,37724,15698,37725,37726,37727,37728,24169,\r
+37729,21550,37730,24158,37731,24170,37732,37733,37734,37735,16447,37736,24172,\r
+12915,14441,16935,37737,37738,15681,37739,37740,37741,37742,37743,24181,24184,\r
+37744,37745,12843,13348,37746,37747,13418,18726,37748,37749,37750,37751,37752,\r
+37753,24182,19281,37754,14435,37755,24183,24186,37756,37757,37758,37760,24185,\r
+37761,37762,37763,19522,37764,12385,13422,37765,37766,37767,37768,37769,37770,\r
+25914,37771,37772,37773,37774,37775,20527,37776,37777,12907,37778,27425,37779,\r
+24180,37780,37781,18787,24179,12378,21025,12663,37782,19503,37783,37784,37785,\r
+37786,37787,37788,37789,24176,37790,19236,37791,37792,37793,21802,37794,37795,\r
+37796,37797,37798,24187,37799,37800,37801,37802,37803,37804,37805,37806,13405,\r
+37807,17446,37808,37809,37810,24189,37811,37812,37813,37814,37815,37816,37817,\r
+37818,37819,37820,17278,17441,24353,37821,37822,37823,37824,37825,37826,37827,\r
+16716,37828,24188,15983,37829,17970,37830,37831,37832,37833,37834,37835,37836,\r
+37837,37838,13125,18550,37839,37840,19258,24190,37841,37842,24356,37843,37844,\r
+37845,37846,22322,37847,37848,37849,37850,37851,13111,37852,37853,37854,37855,\r
+16707,37856,37857,18251,12837,13417,37858,22315,37859,37860,37861,37862,17516,\r
+37863,24354,24355,37864,24357,37865,14899,37866,37867,37868,24358,37869,16478,\r
+37870,37871,18755,37872,37873,37874,37875,37876,37877,37878,12889,18278,37879,\r
+24359,37880,18268,37881,37882,37883,37884,24360,27426,37885,37886,37952,37953,\r
+37954,19283,37955,37956,37957,24362,37958,24361,37959,12865,37960,37961,37962,\r
+37963,37964,37965,37966,37967,37968,37969,37970,37971,37972,37973,37974,37975,\r
+37976,37977,37978,37979,37980,37981,37982,37983,37984,17738,37985,37986,37987,\r
+37988,37989,37990,37991,37992,24363,37993,37994,37995,37996,37997,37998,37999,\r
+38000,21596,38001,38002,38003,38004,38005,18497,38006,38007,38008,38009,38010,\r
+38011,38012,38013,38014,38016,38017,38018,24364,38019,38020,38021,38022,38023,\r
+15984,38024,38025,24365,22055,38026,38027,38028,38029,27191,27446,19029,38030,\r
+22652,14404,38031,14629,38032,38033,14149,21886,38034,38035,38036,38037,38038,\r
+14666,38039,38040,20519,29773,38041,38042,13648,38043,38044,17268,38045,15944,\r
+38046,38047,38048,27447,12349,38049,38050,15692,38051,16690,38052,12630,13096,\r
+38053,38054,38055,14418,18722,38056,38057,13912,38058,38059,38060,38061,27448,\r
+15924,38062,38063,38064,19069,38065,18243,38066,21883,38067,38068,14195,38069,\r
+38070,38071,38072,38073,38074,38075,38076,38077,38078,38079,38080,38081,38082,\r
+38083,20036,38084,38085,38086,21803,12659,38087,38088,38089,27699,12383,38090,\r
+27701,38091,38092,38093,13879,38094,16719,38095,30074,20529,38096,38097,21861,\r
+38098,20051,38099,38100,15727,13154,38101,14379,38102,21814,38103,27965,38104,\r
+13903,38105,19257,20546,38106,38107,38108,38109,38110,38111,38112,38113,14141,\r
+38114,38115,27702,18985,38116,38117,38118,17748,38119,27705,27704,16963,27703,\r
+38120,38121,38122,38123,20605,27706,38124,27707,22373,38125,38126,27708,38127,\r
+38128,38129,27709,18028,38130,38131,38132,38133,38134,38135,38136,38137,20062,\r
+38138,15432,38139,38140,18517,13609,15945,22076,21607,38141,38142,20782,20593,\r
+27192,27193,27194,14901,38208,38209,38210,38211,18993,16245,38212,38213,19834,\r
+38214,38215,38216,38217,38218,27200,38219,12346,27198,38220,38221,16421,38222,\r
+38223,38224,27195,38225,12925,38226,17271,15208,38227,38228,38229,21079,20084,\r
+27199,38230,38231,38232,27196,38233,38234,38235,27203,38236,20551,21299,38237,\r
+38238,38239,38240,13370,38241,17217,22386,38242,38243,38244,38245,21841,38246,\r
+19015,38247,27205,38248,38249,27204,27207,27206,38250,38251,38252,38253,38254,\r
+22119,38255,20308,38256,38257,27211,38258,15182,38259,38260,38261,38262,38263,\r
+38264,38265,15738,18766,38266,38267,27212,38268,38269,18745,20350,27210,21582,\r
+27213,27215,38270,38272,19821,38273,38274,38275,38276,27209,38277,27214,38278,\r
+38279,20078,38280,15198,38281,13119,38282,38283,38284,38285,38286,18005,15920,\r
+20090,38287,38288,38289,18279,38290,15911,27216,38291,38292,22087,38293,38294,\r
+38295,16704,38296,38297,38298,21597,38299,27217,38300,38301,20286,38302,38303,\r
+38304,38305,27218,38306,38307,38308,38309,19054,38310,38311,38312,38313,17711,\r
+12341,38314,38315,38316,38317,38318,27220,38319,38320,38321,38322,38323,38324,\r
+38325,38326,38327,27219,29791,38328,38329,38330,38331,38332,17466,38333,38334,\r
+38335,38336,38337,12585,38338,38339,38340,38341,25951,38342,38343,38344,38345,\r
+27221,38346,38347,38348,38349,38350,38351,38352,38353,38354,38355,38356,38357,\r
+38358,38359,38360,38361,38362,38363,38364,38365,38366,38367,38368,38369,38370,\r
+38371,19055,38372,27222,27223,18008,38373,38374,38375,38376,38377,38378,38379,\r
+38380,27224,38381,38382,27225,38383,38384,38385,38386,38387,38388,21563,38389,\r
+18298,21047,14460,38390,38391,27202,38392,12892,38393,38394,17020,38395,21624,\r
+19558,22382,38396,38397,38398,38464,38465,38466,38467,21570,21328,27459,17779,\r
+38468,14206,38469,38470,27476,38471,38472,38473,19255,27486,38474,16458,38475,\r
+38476,38477,19835,38478,13103,38479,18010,38480,38481,38482,38483,38484,38485,\r
+27516,38486,17470,38487,20020,17449,12606,21629,38488,19061,38489,22124,38490,\r
+38491,18003,13924,38492,38493,38494,38495,15226,38496,38497,20576,38498,38499,\r
+18737,38500,21587,18472,38501,38502,14411,38503,26686,18748,38504,38505,26683,\r
+38506,16494,20563,12868,13413,38507,26684,38508,38509,21832,38510,38511,38512,\r
+38513,38514,13893,38515,26685,19064,14428,19573,38516,38517,38518,16436,38519,\r
+38520,20846,26687,26690,38521,38522,14908,38523,12589,15708,38524,27197,26691,\r
+38525,26694,38526,26699,38528,38529,38530,38531,26700,38532,19273,12389,38533,\r
+15403,38534,38535,14649,38536,38537,26689,38538,19831,38539,26698,38540,38541,\r
+38542,38543,20086,38544,38545,38546,38547,21869,38548,16726,26692,38549,17206,\r
+38550,14715,22054,26696,38551,38552,38553,19040,21606,38554,26688,38555,26693,\r
+26695,38556,18233,14179,38557,26697,38558,16221,26706,38559,38560,26711,38561,\r
+26709,15452,15439,26715,38562,38563,38564,38565,38566,38567,38568,38569,26718,\r
+38570,26714,12666,38571,38572,38573,38574,38575,38576,38577,38578,38579,38580,\r
+12376,17459,14412,18018,18494,18529,38581,38582,38583,26703,26708,26710,38584,\r
+14705,26712,22389,38585,17531,38586,26716,38587,38588,12905,38589,38590,38591,\r
+26705,38592,38593,15469,38594,38595,16194,26701,22137,38596,16760,12913,38597,\r
+38598,38599,38600,38601,38602,38603,38604,26719,38605,19009,26713,38606,38607,\r
+38608,38609,21796,38610,12650,21819,26702,26704,13872,26707,38611,26717,16440,\r
+38612,19063,38613,19240,38614,38615,18012,16501,38616,38617,38618,38619,38620,\r
+26729,38621,38622,38623,20515,38624,38625,38626,38627,38628,38629,38630,26738,\r
+22122,38631,38632,38633,38634,38635,38636,38637,26720,26721,38638,38639,38640,\r
+20857,14923,14457,38641,38642,14449,21588,26735,38643,26734,26732,14704,19538,\r
+26726,20006,16242,38644,12344,26737,26736,38645,22336,38646,26724,38647,19753,\r
+18723,38648,15160,15707,26730,38649,38650,38651,38652,38653,38654,38720,38721,\r
+38722,38723,26722,26723,26725,13621,26727,18245,26731,26733,15664,22318,38724,\r
+26744,38725,38726,38727,38728,38729,38730,38731,38732,26741,38733,19760,26742,\r
+38734,38735,38736,38737,38738,38739,38740,38741,38742,16698,38743,26728,38744,\r
+17207,12400,38745,38746,38747,38748,38749,38750,38751,38752,26740,38753,38754,\r
+38755,26743,38756,38757,38758,14627,38759,38760,38761,38762,38763,38764,38765,\r
+38766,38767,38768,18770,38769,38770,38771,17230,20064,16486,38772,38773,38774,\r
+38775,19315,38776,19549,20533,38777,38778,19041,38779,26739,38780,38781,38782,\r
+38784,38785,38786,38787,38788,38789,38790,15468,38791,26745,38792,38793,38794,\r
+38795,38796,38797,17246,38798,18021,38799,14711,38800,38801,38802,38803,12404,\r
+38804,38805,22360,38806,38807,15404,38808,17775,38809,38810,38811,38812,38813,\r
+19524,38814,38815,26918,38816,38817,38818,38819,38820,38821,38822,38823,38824,\r
+38825,18733,38826,26914,16482,38827,38828,38829,16195,38830,38831,38832,26750,\r
+14679,38833,26747,38834,38835,38836,38837,26916,38838,38839,38840,21070,38841,\r
+38842,38843,38844,38845,26915,38846,22066,22325,38847,26919,38848,15671,38849,\r
+38850,38851,38852,38853,38854,38855,38856,38857,38858,38859,38860,26748,26749,\r
+38861,38862,38863,26913,38864,38865,38866,38867,38868,38869,38870,38871,19798,\r
+38872,38873,21036,38874,38875,38876,26930,38877,38878,38879,38880,26921,38881,\r
+38882,38883,13354,38884,13371,38885,38886,26923,38887,38888,38889,38890,38891,\r
+38892,38893,38894,38895,38896,38897,38898,38899,38900,38901,38902,38903,20520,\r
+38904,38905,26917,38906,38907,13182,38908,38909,26924,16483,38910,26922,38976,\r
+38977,26937,38978,38979,26936,38980,38981,38982,38983,26926,38984,38985,26746,\r
+38986,38987,26920,38988,38989,38990,38991,38992,16172,26929,26938,38993,38994,\r
+16933,38995,38996,38997,26927,38998,14405,38999,26925,39000,21340,26932,26933,\r
+26935,39001,39002,39003,26951,39004,39005,39006,39007,39008,39009,16454,26949,\r
+39010,39011,26928,39012,39013,26939,12401,39014,39015,39016,39017,39018,39019,\r
+39020,39021,39022,39023,26940,21797,39024,39025,26942,39026,26943,39027,39028,\r
+39029,26945,39030,39031,16753,39032,39033,18486,39034,39035,39036,26941,39037,\r
+39038,39040,39041,39042,26946,39043,39044,39045,39046,39047,39048,39049,39050,\r
+26947,39051,26931,39052,26934,39053,15153,39054,39055,39056,26944,39057,39058,\r
+39059,39060,39061,39062,15479,39063,39064,39065,26948,26950,39066,39067,39068,\r
+39069,39070,39071,39072,39073,39074,39075,39076,39077,26954,39078,39079,39080,\r
+39081,26958,39082,39083,39084,39085,39086,39087,39088,39089,39090,39091,12891,\r
+39092,26952,39093,39094,39095,39096,39097,39098,39099,39100,39101,39102,14126,\r
+39103,39104,39105,39106,39107,39108,39109,39110,39111,39112,39113,39114,26955,\r
+26956,39115,39116,39117,39118,39119,39120,21825,39121,17443,39122,39123,39124,\r
+39125,39126,39127,26968,39128,14945,39129,39130,39131,39132,26953,39133,21283,\r
+39134,39135,39136,26964,39137,39138,39139,39140,39141,39142,39143,26967,26960,\r
+39144,39145,39146,39147,39148,26959,39149,39150,18241,39151,39152,39153,39154,\r
+39155,39156,39157,39158,26962,39159,39160,39161,39162,39163,39164,39165,26969,\r
+13128,39166,26963,39232,39233,39234,39235,39236,20336,39237,39238,39239,26957,\r
+39240,39241,39242,39243,39244,39245,39246,39247,39248,39249,39250,13175,39251,\r
+39252,39253,39254,39255,39256,39257,26966,39258,39259,26970,39260,39261,39262,\r
+19508,39263,39264,39265,20269,39266,39267,39268,39269,39270,39271,39272,39273,\r
+39274,26965,39275,26972,26971,39276,39277,39278,39279,39280,26974,39281,39282,\r
+39283,39284,39285,39286,39287,39288,26961,39289,39290,39291,39292,39293,39294,\r
+39296,39297,26973,39298,26975,17226,39299,39300,39301,39302,39303,39304,39305,\r
+39306,39307,39308,39309,39310,39311,39312,39313,39314,39315,39316,39317,39318,\r
+39319,39320,39321,39322,39323,39324,39325,39326,39327,39328,39329,39330,39331,\r
+39332,39333,39334,39335,39336,39337,39338,39339,39340,39341,39342,39343,39344,\r
+39345,39346,39347,39348,39349,39350,39351,39352,39353,39354,39355,39356,39357,\r
+39358,39359,39360,39361,39362,39363,39364,39365,39366,39367,39368,39369,39370,\r
+39371,39372,39373,39374,39375,39376,39377,39378,39379,39380,39381,39382,39383,\r
+39384,39385,39386,39387,39388,39389,39390,39391,39392,39393,39394,39395,39396,\r
+39397,39398,39399,39400,39401,39402,39403,39404,39405,39406,39407,39408,39409,\r
+39410,39411,39412,39413,18231,13390,15158,20544,27683,39414,39415,17719,39416,\r
+39417,39418,39419,39420,39421,39422,39488,39489,39490,21371,39491,39492,39493,\r
+39494,27684,39495,27685,18011,39496,39497,39498,16238,39499,39500,39501,39502,\r
+27686,39503,39504,27687,20522,39505,18232,39506,39507,14440,39508,39509,39510,\r
+39511,39512,39513,39514,39515,39516,39517,39518,39519,27688,39520,39521,39522,\r
+39523,39524,39525,39526,39527,22073,21885,13387,12861,20068,18023,39528,39529,\r
+19809,39530,39531,39532,39533,39534,39535,39536,39537,39538,39539,39540,39541,\r
+39542,39543,13429,39544,19264,15455,39545,39546,39547,39548,26978,26979,20842,\r
+26981,39549,13433,26980,39550,20787,19042,12880,39552,26984,39553,39554,39555,\r
+39556,26982,26983,39557,39558,22067,39559,39560,39561,26985,26986,39562,39563,\r
+39564,39565,39566,26987,39567,39568,39569,39570,39571,39572,39573,39574,26988,\r
+39575,39576,39577,39578,39579,39580,39581,39582,27695,17721,13902,39583,21107,\r
+39584,39585,39586,39587,39588,39589,39590,13678,39591,15193,27697,39592,39593,\r
+21091,39594,39595,39596,39597,39598,20067,39599,17464,39600,17215,39601,39602,\r
+13886,22585,12616,12623,12625,17790,39603,12624,39604,17195,39605,39606,39607,\r
+39608,39609,21809,39610,39611,39612,39613,39614,39615,39616,39617,27428,14913,\r
+39618,39619,39620,19514,39621,39622,39623,27429,39624,27431,39625,39626,39627,\r
+27432,39628,39629,39630,27430,39631,39632,39633,39634,39635,39636,39637,27433,\r
+27435,27434,39638,39639,39640,39641,39642,27436,39643,19023,22581,17265,39644,\r
+17189,18040,27437,17482,39645,27438,27439,27440,14165,39646,39647,39648,14202,\r
+39649,27441,18274,39650,27443,39651,14884,20853,12337,27442,27444,39652,39653,\r
+39654,13610,16968,18280,39655,27445,39656,19246,25439,39657,39658,21312,39659,\r
+39660,39661,39662,22875,39663,39664,19745,22061,18291,39665,39666,39667,22880,\r
+15203,39668,14906,25442,39669,39670,39671,39672,39673,20267,39674,39675,39676,\r
+25440,18759,39677,14905,39678,39744,39745,20788,25441,18538,14639,15661,13144,\r
+20059,39746,39747,19520,39748,39749,39750,25448,25449,19828,39751,39752,39753,\r
+39754,39755,19501,39756,15411,39757,25450,39758,25451,39759,39760,20570,39761,\r
+39762,39763,18043,14170,39764,39765,18271,21066,20054,39766,25444,25452,39767,\r
+18802,13121,39768,39769,25447,39770,39771,18019,25445,39772,39773,27955,25446,\r
+39774,39775,39776,39777,18739,39778,17766,39779,39780,39781,14645,39782,17211,\r
+39783,25443,17725,16676,16985,12887,39784,25453,15142,17453,39785,25456,15962,\r
+39786,39787,25467,25461,14931,39788,39789,39790,39791,14160,21325,39792,22094,\r
+21843,14657,21812,20824,39793,39794,39795,39796,20537,18294,39797,39798,39799,\r
+18474,12852,39800,17242,39801,39802,39803,25454,39804,39805,25468,25455,14120,\r
+25463,25460,39806,39808,39809,14138,39810,39811,17698,39812,25462,17757,12840,\r
+18044,39813,17504,39814,39815,22306,39816,16481,25465,39817,39818,25466,25469,\r
+19497,25459,39819,21310,39820,12611,27956,25457,25458,39821,25464,20538,17987,\r
+21619,25470,39822,39823,15712,39824,39825,25639,39826,39827,25638,39828,39829,\r
+39830,20851,25635,39831,25641,39832,39833,39834,18551,39835,39836,39837,39838,\r
+20276,39839,25640,25646,16997,39840,39841,13876,39842,39843,39844,39845,39846,\r
+39847,15730,39848,25634,39849,39850,14953,25642,39851,39852,25644,39853,39854,\r
+13949,22110,25650,39855,25645,39856,39857,39858,25633,39859,15214,19805,18210,\r
+17737,39860,39861,16759,39862,25636,39863,18227,15660,15677,25637,39864,22343,\r
+12898,39865,25643,15427,25647,39866,15211,25648,17704,25649,39867,39868,39869,\r
+39870,21859,16163,39871,25658,39872,25655,39873,25659,39874,39875,25661,39876,\r
+39877,18006,39878,39879,14918,16459,39880,39881,39882,14369,25652,39883,39884,\r
+39885,39886,21537,39887,39888,14883,15742,39889,39890,39891,25660,39892,39893,\r
+39894,39895,39896,19775,39897,39898,17529,39899,39900,20347,18790,39901,39902,\r
+21311,39903,20305,39904,39905,25651,39906,25656,25657,19561,39907,39908,39909,\r
+39910,39911,19534,39912,16468,25653,16688,25654,20048,39913,15169,13651,39914,\r
+18547,15655,21831,18732,14370,25674,39915,39916,25676,20804,39917,39918,21050,\r
+39919,39920,14893,39921,39922,14932,39923,39924,39925,39926,39927,39928,25667,\r
+13677,39929,39930,39931,22349,25664,20349,25663,39932,39933,39934,16732,19530,\r
+40000,40001,40002,40003,19047,40004,40005,40006,40007,17495,40008,19540,25672,\r
+40009,40010,40011,25671,25665,40012,25668,13613,40013,40014,21337,40015,25670,\r
+40016,40017,40018,40019,21113,13411,40020,15156,40021,40022,18798,40023,13374,\r
+40024,40025,40026,15212,40027,20813,40028,19565,27957,40029,40030,40031,40032,\r
+40033,40034,40035,40036,18277,40037,40038,40039,40040,21544,40041,25675,22357,\r
+25666,40042,15653,25669,40043,40044,21350,40045,25673,18808,40046,40047,25662,\r
+40048,40049,21349,40050,40051,18302,13897,40052,21628,12851,25687,40053,40054,\r
+40055,20034,40056,25677,40057,20028,40058,14427,40059,40060,25686,40061,16202,\r
+40062,40064,40065,21326,40066,17260,40067,40068,40069,40070,40071,40072,40073,\r
+40074,17736,25688,40075,40076,40077,40078,40079,40080,40081,40082,19780,25679,\r
+40083,40084,40085,40086,25684,25685,40087,14974,40088,20326,40089,40090,21823,\r
+40091,40092,40093,25682,40094,40095,40096,40097,40098,40099,40100,40101,40102,\r
+40103,40104,25680,40105,40106,25678,40107,40108,40109,40110,40111,40112,40113,\r
+40114,40115,40116,40117,40118,40119,40120,40121,19813,18986,40122,40123,40124,\r
+16419,40125,15654,25683,40126,40127,14408,40128,40129,40130,40131,40132,25703,\r
+21556,40133,40134,40135,40136,40137,40138,40139,25691,40140,40141,40142,16751,\r
+40143,40144,25705,40145,40146,21095,40147,40148,25695,40149,25696,40150,40151,\r
+20266,40152,40153,40154,40155,19293,40156,25690,25681,40157,25701,40158,18524,\r
+25699,40159,40160,17511,25698,40161,25697,40162,40163,40164,13180,25704,40165,\r
+40166,40167,40168,13665,40169,40170,40171,22348,40172,40173,40174,25702,40175,\r
+15148,40176,22354,19535,27512,40177,25700,40178,40179,14710,40180,40181,40182,\r
+22093,25689,25692,17018,25694,40183,16971,16452,16976,40184,12661,19506,40185,\r
+40186,40187,40188,40189,40190,40256,40257,40258,40259,13646,40260,40261,40262,\r
+40263,25711,40264,40265,40266,40267,40268,40269,40270,40271,17967,40272,40273,\r
+40274,18017,40275,40276,25717,40277,40278,40279,40280,40281,16937,40282,40283,\r
+40284,16492,20829,25710,40285,40286,40287,40288,40289,40290,40291,40292,40293,\r
+40294,17454,40295,40296,40297,25709,40298,40299,40300,40301,25718,25716,17022,\r
+40302,25693,40303,25712,40304,19070,40305,21828,40306,40307,25713,40308,40309,\r
+40310,40311,40312,40313,40314,20858,40315,40316,40317,40318,40320,40321,40322,\r
+25707,25708,40323,40324,40325,25714,40326,20011,40327,40328,40329,40330,40331,\r
+40332,40333,40334,40335,40336,17739,40337,40338,40339,18225,40340,16954,40341,\r
+40342,40343,25706,40344,40345,40346,16714,40347,40348,40349,40350,40351,40352,\r
+19510,13105,40353,40354,40355,25723,40356,25715,40357,40358,40359,25722,40360,\r
+25725,40361,25724,40362,40363,40364,40365,40366,40367,40368,13134,40369,40370,\r
+40371,13114,25719,40372,40373,25721,25720,17772,40374,40375,40376,40377,40378,\r
+40379,40380,40381,40382,40383,40384,40385,40386,16445,40387,40388,40389,40390,\r
+21608,40391,40392,40393,40394,40395,25890,40396,40397,40398,40399,40400,40401,\r
+40402,40403,40404,40405,40406,12356,40407,40408,25892,40409,40410,25891,40411,\r
+40412,40413,40414,40415,40416,15396,40417,25893,40418,40419,40420,40421,40422,\r
+40423,25889,40424,40425,40426,40427,40428,40429,40430,25726,12660,40431,40432,\r
+40433,40434,40435,40436,40437,40438,40439,40440,40441,25896,40442,25897,25894,\r
+40443,40444,40445,40446,40512,40513,40514,40515,40516,40517,40518,40519,25895,\r
+25898,40520,40521,40522,40523,40524,40525,40526,40527,40528,40529,40530,40531,\r
+40532,40533,40534,40535,40536,40537,40538,40539,40540,40541,40542,40543,40544,\r
+40545,40546,40547,40548,40549,40550,40551,40552,18009,40553,40554,40555,40556,\r
+40557,40558,40559,40560,25899,25901,40561,40562,40563,40564,40565,40566,40567,\r
+25900,40568,40569,40570,40571,40572,40573,40574,40576,40577,40578,40579,40580,\r
+40581,40582,40583,40584,40585,25903,40586,40587,40588,25902,40589,40590,40591,\r
+40592,40593,40594,40595,40596,40597,40598,40599,40600,40601,40602,40603,40604,\r
+40605,40606,14688,40607,40608,25904,40609,40610,40611,40612,40613,40614,40615,\r
+40616,40617,40618,40619,40620,40621,40622,25905,40623,40624,40625,40626,40627,\r
+40628,40629,40630,40631,40632,40633,40634,15216,27745,17264,40635,13638,15186,\r
+40636,40637,40638,40639,16745,21614,40640,15940,40641,40642,40643,22342,40644,\r
+21590,12883,27710,40645,40646,40647,40648,27201,40649,40650,40651,16943,13366,\r
+40652,40653,40654,20823,40655,40656,40657,13108,40658,18482,16187,27712,40659,\r
+40660,22091,40661,40662,27711,27713,40663,40664,40665,40666,40667,40668,40669,\r
+40670,40671,40672,40673,40674,40675,27717,15974,19519,17754,15932,40676,27718,\r
+40677,12670,40678,40679,40680,27716,21800,13667,40681,27714,16694,13155,40682,\r
+40683,27715,19256,16451,19582,40684,40685,40686,40687,16722,40688,27720,40689,\r
+40690,40691,40692,40693,40694,40695,40696,40697,40698,40699,40700,40701,14950,\r
+16467,40702,22130,40768,40769,40770,20812,40771,40772,40773,40774,16190,40775,\r
+14131,18773,27719,15202,40776,19532,15741,18504,40777,20265,40778,40779,40780,\r
+40781,40782,40783,40784,19817,40785,17771,40786,40787,40788,14185,40789,40790,\r
+40791,40792,40793,40794,40795,40796,40797,40798,40799,20809,14904,40800,40801,\r
+40802,40803,40804,27721,40805,40806,27722,40807,15168,27723,40808,27746,12602,\r
+14169,40809,40810,40811,40812,40813,40814,40815,40816,40817,40818,40819,15673,\r
+40820,40821,40822,40823,40824,40825,40826,40827,27724,20838,27725,40828,40829,\r
+40830,40832,18491,40833,40834,40835,40836,40837,40838,40839,40840,40841,40842,\r
+40843,40844,40845,40846,27729,40847,40848,40849,40850,27731,40851,15181,40852,\r
+15461,40853,40854,40855,40856,40857,40858,40859,40860,40861,40862,40863,40864,\r
+40865,27727,40866,18743,40867,40868,40869,40870,40871,17210,40872,27747,21845,\r
+27728,40873,40874,40875,40876,40877,22131,40878,40879,40880,27730,27726,40881,\r
+40882,40883,40884,27732,40885,27733,40886,40887,18751,40888,40889,40890,40891,\r
+40892,40893,20264,40894,40895,40896,40897,40898,20572,40899,40900,40901,40902,\r
+20780,40903,40904,40905,40906,18523,40907,40908,40909,27734,20085,40910,40911,\r
+40912,40913,40914,19052,27738,40915,40916,40917,40918,40919,40920,40921,27737,\r
+40922,40923,40924,12350,40925,40926,40927,40928,40929,40930,27735,40931,27736,\r
+40932,40933,40934,27748,40935,40936,40937,40938,40939,40940,40941,40942,40943,\r
+18492,40944,40945,40946,40947,40948,40949,40950,40951,40952,40953,16711,40954,\r
+40955,40956,40957,40958,27740,20832,41024,41025,41026,41027,41028,41029,41030,\r
+41031,41032,41033,27739,41034,41035,41036,41037,21615,41038,27741,41039,41040,\r
+41041,41042,41043,41044,23366,41045,41046,41047,41048,41049,41050,41051,41052,\r
+41053,41054,27742,41055,41056,41057,41058,41059,41060,41061,41062,41063,41064,\r
+41065,41066,12588,41067,41068,41069,41070,41071,41072,41073,41074,41075,41076,\r
+41077,41078,41079,41080,41081,41082,41083,41084,41085,41086,41088,41089,27743,\r
+41090,41091,41092,41093,41094,41095,41096,41097,41098,41099,27744,41100,22310,\r
+41101,17728,41102,41103,41104,27452,12334,41105,41106,41107,15988,14392,21039,\r
+12374,13689,41108,22579,41109,19244,41110,25437,41111,41112,41113,41114,41115,\r
+41116,41117,17964,12390,41118,41119,41120,17734,27449,41121,41122,41123,41124,\r
+27450,41125,41126,41127,27451,41128,41129,20800,41130,17699,41131,27250,41132,\r
+17458,41133,17461,16462,41134,41135,41136,27251,17473,41137,20079,41138,41139,\r
+41140,41141,27248,27252,41142,41143,18812,41144,41145,18211,41146,41147,41148,\r
+19544,20094,41149,41150,41151,27253,27254,20268,16487,41152,41153,27255,41154,\r
+41155,41156,41157,41158,13887,27256,41159,27257,41160,27258,41161,41162,27259,\r
+41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,41174,27249,\r
+41175,41176,41177,41178,41179,41180,41181,41182,41183,41184,41185,41186,18478,\r
+24939,41187,14136,24940,41188,41189,41190,24941,41191,22324,24942,24943,21324,\r
+41192,41193,41194,41195,41196,41197,41198,24945,16241,24944,13650,41199,41200,\r
+41201,12599,41202,41203,41204,41205,24947,24946,41206,14972,41207,24948,41208,\r
+41209,41210,41211,14647,41212,15953,41213,41214,43584,43585,17532,43586,14941,\r
+15686,43587,43588,43589,43590,43591,43592,24949,24951,43593,43594,13888,20289,\r
+18984,24950,21880,21372,24952,24956,24953,43595,43596,24954,16490,43597,24958,\r
+25121,16455,43598,43599,43600,43601,24955,43602,24957,43603,43604,43605,43606,\r
+43607,43608,25125,43609,43610,43611,16724,43612,43613,43614,43615,25123,43616,\r
+25128,12926,25122,43617,43618,43619,17229,12866,25127,25126,43620,43621,25124,\r
+25129,43622,43623,25131,43624,43625,43626,20553,22125,17192,25132,43627,20311,\r
+43628,43629,25134,43630,43631,14959,43632,43633,26976,25133,25130,43634,43635,\r
+43636,43637,15147,21555,43638,43639,43640,43641,43642,43643,43644,43645,43646,\r
+43648,43649,43650,43651,25136,43652,43653,25135,43654,26977,43655,43656,43657,\r
+43658,25137,43659,43660,43661,43662,43663,43664,43665,43666,25138,43667,43668,\r
+43669,43670,43671,43672,43673,43674,43675,43676,43677,25139,19489,43678,25140,\r
+43679,43680,43840,43841,43842,43843,43844,43845,43846,43847,43848,43849,43850,\r
+43851,25141,43852,43853,43854,43855,43856,20606,43857,43858,16970,43859,21361,\r
+43860,19829,43861,43862,26464,43863,43864,26465,43865,43866,43867,43868,15937,\r
+43869,43870,43871,43872,17002,43873,43874,43875,26468,43876,43877,26467,43878,\r
+43879,43880,43881,43882,43883,19814,43884,17205,43885,43886,26466,15159,20310,\r
+43887,16737,26473,43888,43889,43890,26472,43891,43892,26484,12835,43893,43894,\r
+43895,43896,26474,43897,26470,43898,43899,43900,43901,43902,26476,26475,18746,\r
+43904,43905,21860,43906,26469,14121,26471,43907,43908,43909,43910,43911,43912,\r
+43913,26478,43914,43915,43916,43917,26483,43918,22121,43919,43920,43921,43922,\r
+26477,43923,26482,43924,26481,43925,43926,43927,12384,43928,43929,43930,43931,\r
+26485,43932,43933,43934,43935,43936,44096,44097,44098,44099,44100,44101,44102,\r
+44103,44104,44105,44106,18290,44107,16453,16493,44108,44109,16752,26480,44110,\r
+44111,44112,44113,26486,19318,44114,44115,44116,44117,44118,44119,44120,44121,\r
+44122,26658,26657,44123,44124,44125,44126,44127,44128,22337,44129,44130,26490,\r
+26489,44131,26491,44132,26487,44133,26494,44134,26493,44135,26492,44136,44137,\r
+16725,18265,17789,17731,44138,44139,44140,44141,44142,18285,44143,44144,44145,\r
+44146,26659,44147,44148,44149,44150,44151,44152,44153,44154,44155,44156,44157,\r
+44158,44160,44161,44162,44163,44164,44165,44166,26662,44167,26661,44168,26663,\r
+14967,26488,26660,44169,18544,18730,44170,44171,44172,44173,44174,44175,44176,\r
+44177,44178,44179,44180,44181,44182,26665,44183,44184,14693,44185,44186,44187,\r
+44188,44189,20862,26664,44190,44191,44192,44352,44353,44354,26666,44355,26669,\r
+26670,44356,16679,44357,44358,44359,26671,44360,44361,44362,26672,44363,44364,\r
+26668,44365,26676,44366,44367,44368,44369,44370,44371,44372,44373,44374,44375,\r
+44376,26667,44377,26673,44378,44379,44380,44381,44382,44383,44384,44385,26677,\r
+26674,26675,44386,44387,44388,44389,44390,44391,44392,44393,44394,44395,44396,\r
+44397,44398,44399,44400,44401,26679,44402,44403,44404,44405,44406,44407,44408,\r
+44409,44410,44411,44412,44413,44414,44416,44417,44418,44419,44420,44421,44422,\r
+44423,44424,44425,26678,44426,44427,44428,44429,44430,44431,44432,44433,44434,\r
+14671,44435,28716,44436,28717,44437,17968,12394,18495,44438,19807,44439,44440,\r
+44441,44442,44443,44444,44445,20045,27185,44446,44447,44448,44608,27186,44609,\r
+17983,13385,44610,44611,44612,44613,44614,44615,44616,27187,44617,44618,44619,\r
+44620,21863,44621,44622,44623,44624,44625,44626,44627,44628,23929,44629,27188,\r
+44630,27189,44631,27190,44632,44633,44634,44635,14410,24368,18805,44636,19568,\r
+44637,44638,18810,44639,44640,44641,44642,44643,18811,44644,44645,21315,19238,\r
+44646,14374,28718,12610,44647,25912,19567,21321,15447,18794,44648,13671,44649,\r
+17488,13673,44650,28206,15149,44651,44652,26462,44653,28207,44654,44655,44656,\r
+44657,13097,44658,44659,28210,44660,44661,28209,15719,44662,28208,20023,44663,\r
+44664,44665,44666,17743,44667,44668,44669,44670,16756,23374,28211,20595,44672,\r
+44673,44674,44675,44676,44677,44678,44679,16980,18024,44680,44681,44682,14124,\r
+44683,44684,44685,44686,44687,44688,44689,28212,44690,13163,44691,44692,44693,\r
+15227,28213,44694,44695,44696,44697,44698,26460,44699,44700,44701,28214,44702,\r
+44703,15662,44704,44864,44865,44866,29026,44867,44868,44869,19048,44870,21065,\r
+28762,44871,28763,44872,28764,16710,44873,14445,15950,44874,44875,28766,44876,\r
+17713,28765,20849,44877,28768,12364,15722,44878,44879,44880,44881,44882,21087,\r
+28767,44883,13359,14184,28774,28773,17955,28769,28770,13379,44884,44885,28771,\r
+21870,44886,44887,19547,15954,15410,44888,44889,44890,28776,28775,28772,12833,\r
+44891,22050,21304,15927,18476,44892,44893,28778,44894,44895,44896,44897,20855,\r
+44898,22092,14939,28777,44899,13883,44900,44901,19764,44902,44903,17958,44904,\r
+44905,44906,16673,28779,28782,44907,28781,28784,28780,44908,15166,28783,44909,\r
+44910,44911,44912,19509,28786,44913,44914,13141,44915,44916,44917,44918,12628,\r
+44919,44920,28787,44921,44922,28788,28790,13409,44923,28785,44924,28791,44925,\r
+44926,44928,44929,28794,44930,28792,44931,44932,44933,28789,44934,44935,44936,\r
+44937,28797,44938,28793,28796,28798,44939,28961,44940,44941,44942,20033,28964,\r
+44943,28963,44944,16758,28795,19037,44945,44946,13425,12657,19505,44947,28966,\r
+44948,44949,28967,44950,44951,28972,21838,28969,44952,44953,18483,44954,44955,\r
+44956,28962,44957,28971,28968,28965,44958,44959,28970,44960,45120,45121,45122,\r
+45123,45124,45125,45126,12329,28973,45127,45128,45129,45130,45131,45132,28975,\r
+45133,28977,45134,45135,45136,45137,45138,28976,45139,28974,45140,45141,45142,\r
+45143,20770,45144,45145,45146,45147,45148,45149,45150,28978,45151,45152,45153,\r
+28979,45154,45155,45156,45157,45158,45159,45160,45161,14703,45162,45163,13639,\r
+45164,12375,12377,45165,45166,45167,21613,45168,13636,45169,15700,15178,28711,\r
+45170,45171,14430,45172,45173,28712,45174,45175,12328,45176,28713,45177,45178,\r
+19822,45179,45180,28714,45181,45182,45184,45185,45186,45187,45188,45189,45190,\r
+45191,28715,45192,45193,45194,45195,45196,45197,45198,45199,45200,17956,45201,\r
+45202,22117,29028,45203,29029,45204,45205,45206,45207,45208,45209,45210,45211,\r
+45212,45213,17267,45214,45215,21339,45216,45376,22097,17768,45377,21295,45378,\r
+21094,45379,45380,28225,12347,21813,20814,15456,14928,45381,16248,45382,14407,\r
+13633,17740,45383,45384,18978,45385,45386,45387,17227,45388,45389,45390,45391,\r
+45392,28226,45393,45394,45395,45396,45397,45398,45399,45400,17471,13858,45401,\r
+28012,17188,45402,22065,45403,45404,45405,20320,28015,45406,45407,17742,45408,\r
+13916,45409,45410,18977,45411,45412,28013,45413,45414,28016,28017,17212,45415,\r
+16180,45416,28014,45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,\r
+45427,28020,28018,45428,45429,45430,45431,21862,17247,45432,28019,45433,45434,\r
+45435,28022,45436,21795,20771,45437,45438,45440,28021,45441,17232,45442,45443,\r
+45444,45445,45446,28023,16244,15980,28024,45447,19575,45448,20827,45449,45450,\r
+45451,22341,21878,45452,28028,45453,45454,45455,28027,45456,45457,45458,45459,\r
+45460,45461,45462,45463,28025,28026,45464,45465,45466,45467,45468,45469,45470,\r
+45471,28029,15910,45472,45632,45633,45634,45635,19247,28193,13885,45636,28194,\r
+17472,45637,28030,45638,45639,15710,12871,45640,45641,45642,45643,45644,45645,\r
+45646,45647,45648,45649,45650,45651,13891,45652,45653,45654,28197,22586,28195,\r
+28198,45655,45656,45657,17257,13170,45658,45659,45660,45661,45662,45663,28199,\r
+28196,20281,45664,45665,28200,17015,45666,45667,45668,45669,45670,45671,45672,\r
+45673,45674,45675,45676,45677,28201,28202,45678,24107,45679,45680,17971,45681,\r
+18246,45682,22133,13641,45683,19250,45684,45685,45686,28203,45687,45688,19755,\r
+45689,28204,45690,45691,45692,45693,45694,21808,45696,28205,45697,30276,45698,\r
+45699,45700,45701,45702,45703,45704,45705,45706,45707,45708,45709,45710,23367,\r
+45711,45712,45713,45714,45715,45716,45717,45718,45719,13347,45720,45721,45722,\r
+17196,29030,45723,45724,45725,45726,45727,19000,21075,45728,22058,45888,28530,\r
+45889,15960,45890,15683,28531,13900,12331,45891,45892,45893,45894,18991,45895,\r
+45896,27958,45897,27959,45898,45899,45900,45901,20089,14127,16243,27960,17003,\r
+18736,45902,45903,45904,45905,45906,45907,27961,45908,45909,18038,16179,45910,\r
+45911,45912,27964,17784,45913,20816,45914,22313,27962,27963,45915,20834,45916,\r
+27967,27968,45917,27972,45918,45919,45920,27976,45921,27974,27982,21864,45922,\r
+27977,45923,45924,27975,27966,45925,45926,17769,45927,45928,45929,17990,45930,\r
+45931,18793,21586,27969,27970,27971,27973,45932,16505,45933,13345,45934,45935,\r
+45936,45937,14696,45938,27984,45939,45940,45941,45942,27985,45943,27978,45944,\r
+27983,45945,20088,45946,45947,19254,27980,27981,45948,45949,45950,45952,45953,\r
+20341,45954,45955,45956,45957,45958,45959,45960,45961,45962,45963,45964,45965,\r
+27986,16754,21298,27979,18487,45966,45967,45968,45969,45970,45971,45972,45973,\r
+15471,45974,45975,45976,45977,17776,45978,45979,45980,45981,45982,45983,45984,\r
+46144,46145,46146,27990,46147,13679,46148,46149,16949,12333,19305,46150,46151,\r
+12590,46152,27988,46153,46154,46155,19819,13666,46156,27989,27987,27991,46157,\r
+46158,13690,46159,27992,46160,27993,46161,27996,46162,12620,46163,46164,46165,\r
+46166,46167,46168,46169,46170,17782,15470,27994,19516,12906,46171,46172,46173,\r
+46174,27995,46175,46176,46177,46178,17515,46179,46180,13381,46181,46182,46183,\r
+12405,46184,46185,46186,27999,16474,13416,46187,46188,46189,46190,17741,46191,\r
+46192,46193,27997,16196,46194,46195,46196,27998,46197,46198,46199,46200,46201,\r
+46202,46203,46204,46205,46206,46208,46209,46210,46211,17445,46212,46213,46214,\r
+28000,46215,46216,46217,46218,46219,28001,46220,28003,46221,46222,16727,46223,\r
+46224,15175,46225,46226,46227,46228,46229,46230,15672,46231,46232,46233,28002,\r
+46234,46235,46236,46237,46238,46239,46240,46400,46401,46402,46403,46404,46405,\r
+28004,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,28006,46416,\r
+46417,46418,46419,46420,28005,46421,46422,46423,46424,46425,46426,46427,46428,\r
+46429,46430,46431,46432,46433,46434,46435,28007,46436,46437,46438,46439,46440,\r
+19006,27754,16497,46441,18791,46442,27755,18030,46443,46444,46445,46446,27756,\r
+46447,18029,27757,46448,46449,46450,46451,46452,46453,46454,46455,46456,27760,\r
+46457,46458,22374,27763,46459,46460,27761,27758,27759,22307,18801,19310,27764,\r
+46461,27762,46462,46464,20329,46465,27766,17969,46466,46467,46468,46469,15424,\r
+46470,27765,46471,46472,46473,46474,46475,46476,46477,13627,15222,46478,27767,\r
+46479,46480,46481,46482,46483,22903,15739,46484,46485,16955,27768,46486,46487,\r
+46488,46489,27769,46490,46491,46492,46493,14371,46494,46495,46496,46656,46657,\r
+46658,46659,46660,46661,46662,27770,46663,46664,46665,46666,46667,46668,46669,\r
+46670,46671,46672,46673,46674,27771,46675,46676,46677,46678,46679,46680,46681,\r
+46682,46683,46684,46685,27772,46686,46687,46688,46689,46690,21357,22574,16491,\r
+46691,18269,14924,46692,20579,19261,46693,19770,46694,46695,14417,46696,46697,\r
+12668,46698,18287,46699,22102,46700,46701,46702,16198,17259,46703,46704,28533,\r
+46705,46706,17240,46707,46708,46709,46710,46711,46712,22370,46713,46714,46715,\r
+28535,13139,46716,18264,20845,46717,22088,46718,28536,46720,28534,46721,15229,\r
+13126,46722,46723,46724,46725,46726,46727,46728,15701,46729,46730,21062,46731,\r
+15200,46732,46733,20257,46734,28540,28539,46735,46736,28537,46737,46738,46739,\r
+46740,13132,46741,18772,19248,46742,46743,46744,46745,46746,28542,46747,46748,\r
+12382,46749,46750,22089,46751,46752,46912,28541,46913,13165,46914,46915,30293,\r
+46916,46917,46918,46919,46920,46921,46922,46923,46924,46925,46926,46927,46928,\r
+46929,46930,20040,46931,46932,46933,28706,46934,28705,46935,13630,15450,15228,\r
+46936,14437,46937,46938,46939,46940,46941,46942,17474,46943,46944,46945,46946,\r
+46947,46948,46949,46950,46951,46952,28707,46953,46954,46955,46956,46957,19307,\r
+46958,46959,46960,46961,46962,46963,46964,46965,46966,46967,46968,46969,46970,\r
+46971,46972,46973,46974,46976,46977,46978,46979,46980,46981,46982,28710,46983,\r
+46984,46985,20776,46986,15935,18286,28982,28983,16213,46987,46988,46989,46990,\r
+13353,28984,19771,46991,18260,21805,46992,28985,46993,28986,46994,46995,46996,\r
+46997,18255,46998,46999,47000,21028,22095,47001,47002,28987,15697,13360,15933,\r
+47003,47004,47005,13404,20049,47006,16223,28989,47007,47008,47168,47169,16250,\r
+28988,47170,28991,47171,47172,47173,28990,28992,47174,47175,47176,47177,47178,\r
+28993,47179,47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,16766,\r
+47190,47191,47192,47193,47194,47195,47196,47197,47198,47199,47200,16674,47201,\r
+47202,47203,47204,47205,47206,47207,47208,47209,47210,19066,47211,47212,21822,\r
+47213,47214,47215,47216,15930,15929,21826,47217,47218,16162,47219,19759,28981,\r
+47220,47221,47222,47223,47224,47225,15711,47226,13899,47227,47228,47229,47230,\r
+47232,47233,47234,47235,47236,22129,29507,47237,47238,29508,47239,14413,47240,\r
+47241,47242,29510,29511,47243,12362,47244,29509,47245,29513,19313,47246,47247,\r
+47248,29515,47249,20518,47250,47251,12618,29512,47252,47253,47254,29519,47255,\r
+13649,47256,47257,29527,47258,29522,47259,47260,47261,29524,29523,14203,47262,\r
+12607,47263,29518,29514,13658,47264,29520,47424,47425,29521,47426,29525,47427,\r
+47428,47429,47430,29517,47431,15459,47432,16765,47433,29526,47434,47435,47436,\r
+47437,47438,47439,29530,47440,29516,47441,13640,47442,15726,29532,47443,47444,\r
+14116,16240,22142,19762,47445,13424,47446,12895,47447,29528,47448,29529,18744,\r
+47449,29533,47450,47451,29534,47452,29537,47453,47454,47455,47456,47457,47458,\r
+47459,47460,47461,47462,47463,29535,47464,47465,29539,29538,47466,47467,29531,\r
+47468,16234,47469,13167,47470,29536,47471,47472,18217,47473,15474,47474,47475,\r
+47476,47477,29547,47478,47479,47480,47481,47482,47483,47484,14655,47485,47486,\r
+29540,47488,47489,47490,12845,15230,47491,19299,47492,47493,47494,47495,29549,\r
+29545,47496,47497,47498,14684,29550,47499,47500,47501,29541,29542,29546,16993,\r
+29548,29551,29544,15485,47502,47503,47504,20324,47505,47506,29552,47507,47508,\r
+47509,29543,47510,47511,47512,47513,47514,47515,47516,47517,29554,47518,47519,\r
+47520,47680,22317,17962,47681,47682,47683,47684,29555,47685,47686,47687,47688,\r
+29553,47689,16936,47690,47691,47692,47693,47694,14429,29557,47695,47696,29556,\r
+47697,47698,47699,13403,47700,47701,47702,29558,29559,47703,47704,47705,29560,\r
+47706,47707,47708,16442,47709,47710,16489,47711,47712,47713,47714,47715,17777,\r
+47716,47717,47718,47719,29563,47720,29562,47721,47722,47723,47724,47725,47726,\r
+47727,47728,13400,47729,47730,47731,29566,29561,47732,47733,29564,47734,47735,\r
+47736,47737,47738,47739,29565,47740,47741,47742,47744,47745,47746,47747,47748,\r
+29729,47749,47750,47751,47752,47753,47754,29731,15177,47755,47756,29730,47757,\r
+47758,47759,47760,47761,47762,47763,47764,47765,47766,47767,47768,47769,29732,\r
+47770,47771,47772,47773,47774,47775,12862,29734,29733,47776,47936,47937,47938,\r
+47939,47940,47941,47942,47943,47944,47945,15406,47946,47947,47948,47949,47950,\r
+47951,47952,47953,47954,47955,47956,47957,47958,47959,47960,47961,47962,47963,\r
+47964,47965,47966,47967,47968,47969,47970,47971,47972,47973,47974,47975,47976,\r
+47977,47978,47979,47980,47981,47982,17239,22881,47983,47984,47985,47986,47987,\r
+47988,16480,29772,22353,47989,47990,47991,47992,47993,47994,47995,47996,47997,\r
+47998,48000,14171,48001,48002,48003,48004,48005,48006,48007,29774,16675,48008,\r
+48009,17993,48010,13398,21811,48011,48012,48013,29776,29775,29777,19290,48014,\r
+48015,29778,48016,21569,22112,48017,48018,48019,48020,14176,48021,48022,48023,\r
+16696,48024,48025,16699,29779,15916,48026,48027,48028,48029,48030,13410,48031,\r
+48032,29780,29781,15915,48192,48193,29782,48194,48195,48196,29787,48197,29783,\r
+29786,48198,14973,48199,29784,29785,48200,48201,48202,48203,48204,48205,48206,\r
+14434,19527,29788,48207,12890,48208,48209,17235,48210,48211,21603,16183,48212,\r
+48213,48214,48215,48216,48217,48218,29789,48219,48220,48221,48222,48223,48224,\r
+17716,48225,48226,48227,48228,48229,48230,48231,48232,29801,48233,48234,20277,\r
+48235,48236,48237,48238,48239,48240,48241,48242,48243,48244,48245,48246,48247,\r
+48248,20041,48249,48250,48251,48252,48253,48254,48256,48257,48258,48259,48260,\r
+48261,48262,48263,48264,48265,48266,48267,48268,48269,48270,19288,48271,19319,\r
+48272,48273,48274,48275,15732,48276,48277,48278,22351,48279,48280,48281,16475,\r
+48282,48283,48284,48285,48286,48287,48288,48448,48449,48450,48451,48452,48453,\r
+48454,48455,48456,48457,48458,48459,48460,48461,48462,48463,48464,48465,48466,\r
+48467,48468,48469,48470,48471,48472,48473,48474,48475,48476,48477,48478,48479,\r
+48480,48481,48482,48483,48484,48485,48486,48487,48488,48489,48490,48491,48492,\r
+48493,48494,48495,48496,48497,48498,48499,48500,48501,48502,20597,48503,48504,\r
+48505,48506,48507,48508,48509,48510,29802,48512,48513,48514,48515,48516,48517,\r
+48518,48519,48520,48521,48522,48523,48524,48525,48526,48527,48528,48529,48530,\r
+48531,48532,48533,48534,48535,48536,48537,48538,48539,48540,48541,48542,48543,\r
+48544,48704,48705,48706,48707,48708,48709,48710,48711,48712,48713,48714,48715,\r
+48716,29803,48717,48718,48719,48720,48721,48722,48723,29804,48724,48725,48726,\r
+48727,48728,48729,48730,48731,48732,48733,48734,48735,48736,48737,48738,48739,\r
+48740,48741,48742,48743,48744,48745,48746,48747,48748,48749,48750,48751,48752,\r
+48753,48754,48755,48756,48757,48758,48759,48760,48761,48762,48763,48764,48765,\r
+48766,48768,48769,48770,48771,48772,48773,48774,48775,48776,48777,48778,48779,\r
+48780,48781,48782,48783,48784,48785,48786,48787,48788,48789,48790,48791,48792,\r
+48793,48794,48795,48796,48797,48798,48799,48800,48960,48961,48962,48963,48964,\r
+48965,48966,48967,48968,48969,48970,48971,48972,48973,48974,48975,48976,48977,\r
+48978,48979,48980,48981,48982,48983,48984,48985,48986,48987,48988,48989,48990,\r
+48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,49001,49002,49003,\r
+49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,49014,49015,49016,\r
+49017,49018,49019,49020,49021,49022,49024,30563,49025,49026,49027,49028,49029,\r
+14129,49030,49031,49032,49033,49034,29805,49035,49036,49037,49038,49039,49040,\r
+49041,49042,49043,49044,49045,49046,49047,49048,49049,49050,49051,49052,49053,\r
+49054,49055,49056,49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,\r
+49226,49227,49228,49229,49230,49231,49232,49233,49234,49235,49236,49237,49238,\r
+49239,49240,49241,49242,49243,49244,49245,49246,49247,49248,49249,49250,49251,\r
+22379,49252,49253,49254,49255,49256,49257,49258,49259,49260,49261,49262,49263,\r
+49264,49265,49266,49267,49268,49269,49270,49271,49272,49273,49274,49275,29806,\r
+49276,49277,49278,26233,15936,26234,14956,26235,20299,26236,21564,15414,26237,\r
+26238,15437,18514,20019,26401,49280,13375,26402,18740,14425,17481,49281,22365,\r
+16986,14167,22077,20038,14148,49282,49283,17702,26403,20319,26404,26405,26406,\r
+16695,22377,18800,20280,22063,22101,26407,12397,26408,26409,18780,21103,15917,\r
+26410,12403,18526,15713,26411,18502,49284,26412,15206,14456,20772,26413,16999,\r
+15992,15690,19763,26414,26415,15982,20581,49285,19303,19536,15436,26416,15400,\r
+20599,26417,49286,20600,26418,26419,13378,26420,26421,18814,20012,17248,26423,\r
+12609,13169,49287,26424,26425,22363,21824,26426,16972,22330,26427,26428,26429,\r
+15466,17253,16450,26430,26431,15401,49288,26432,26433,26422,13904,26434,49289,\r
+26435,26436,15162,13662,16966,12640,26437,21557,26438,14399,26440,26439,14188,\r
+49290,26441,12920,26442,26443,26444,26445,26446,26447,26448,21287,19317,26449,\r
+26450,26451,26452,18761,26453,26454,26455,26456,26457,15689,26458,29502,49291,\r
+14423,49292,18481,49293,49294,49295,49296,49297,49298,49299,29503,49300,29504,\r
+29505,49301,49302,49303,49304,49305,49306,49307,49308,49309,49310,14686,19832,\r
+49311,49312,22632,14897,49472,16990,28215,49473,14115,49474,49475,49476,49477,\r
+28217,49478,28216,12373,49479,49480,49481,49482,49483,28219,21846,22383,49484,\r
+49485,49486,22083,49487,49488,28221,19056,49489,28220,49490,49491,49492,49493,\r
+28222,49494,49495,49496,49497,28224,49498,49499,28223,49500,49501,49502,49503,\r
+49504,49505,49506,49507,20850,49508,18236,49509,17216,49510,49511,49512,49513,\r
+49514,14433,49515,49516,49517,49518,49519,16743,49520,49521,29766,20575,29767,\r
+49522,20315,49523,49524,18490,49525,49526,29768,49527,49528,49529,49530,49531,\r
+49532,49533,29769,29770,49534,29771,49536,49537,49538,49539,49540,22906,14462,\r
+49541,49542,25969,21360,49543,29792,49544,20044,49545,49546,49547,13153,49548,\r
+49549,49550,49551,28980,49552,21102,49553,29793,49554,49555,49556,49557,49558,\r
+20328,29794,49559,49560,18252,49561,49562,49563,49564,49565,49566,13652,13412,\r
+29796,49567,49568,49728,29795,29797,49729,49730,29798,49731,49732,49733,49734,\r
+29799,49735,14898,12351,49736,29800,49737,49738,49739,49740,49741,49742,49743,\r
+14125,21101,49744,49745,49746,21035,16463,49747,16188,27427,21855,27208,49748,\r
+49749,49750,49751,29043,13944,19235,49752,49753,17485,49754,29031,49755,29032,\r
+14459,29033,14916,21573,12370,49756,49757,29034,49758,49759,49760,29035,49761,\r
+29036,49762,49763,29037,29038,29039,29041,29040,17749,49764,49765,49766,49767,\r
+49768,49769,29042,49770,13946,49771,29044,21038,24135,19274,49772,49773,13148,\r
+49774,13602,49775,14626,49776,49777,17524,29045,49778,49779,29046,49780,49781,\r
+49782,16708,16763,22064,29047,49783,49784,49785,49786,29048,49787,16682,49788,\r
+49789,49790,17976,49792,15963,49793,49794,49795,49796,49797,49798,49799,49800,\r
+49801,49802,49803,49804,49805,49806,29049,13391,49807,49808,49809,49810,49811,\r
+49812,29050,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,49823,\r
+49824,49984,27954,27953,49985,49986,19296,21086,49987,19265,21848,49988,18530,\r
+49989,16479,15393,49990,49991,49992,49993,49994,49995,27457,49996,49997,20516,\r
+49998,22114,49999,13895,14424,27456,14414,50000,27455,13094,14665,22059,50001,\r
+14196,14154,50002,50003,50004,15463,14142,27462,50005,27463,12345,16207,50006,\r
+27461,21373,50007,27464,50008,50009,27465,50010,50011,14158,50012,27458,27460,\r
+18806,22103,21837,20530,27471,20024,27472,50013,13608,50014,50015,50016,50017,\r
+50018,12595,27474,19493,50019,50020,50021,50022,50023,50024,50025,17750,27475,\r
+50026,27473,17759,27470,18980,27477,12411,50027,50028,14970,50029,50030,22583,\r
+29027,50031,27466,27467,27468,27469,27478,26176,27481,50032,16232,21064,27479,\r
+27484,14444,27480,50033,15674,50034,20568,50035,12343,50036,27485,17500,50037,\r
+50038,50039,50040,22060,50041,50042,50043,13408,50044,50045,17014,15417,50046,\r
+50048,27482,27483,21600,18026,17492,27487,17703,22901,50049,12849,50050,27492,\r
+50051,15685,50052,50053,50054,27490,50055,50056,50057,50058,50059,50060,50061,\r
+50062,50063,50064,50065,50066,50067,27491,50068,50069,14380,50070,19793,27493,\r
+50071,50072,50073,27489,50074,16691,50075,50076,50077,50078,50079,17954,50080,\r
+50240,50241,50242,50243,50244,50245,19571,50246,27494,50247,16432,21048,27495,\r
+50248,50249,50250,14383,14381,50251,27496,18235,19827,50252,50253,50254,27498,\r
+27499,50255,50256,50257,50258,50259,27501,50260,50261,50262,50263,20552,50264,\r
+27506,50265,27502,50266,50267,50268,27505,18553,50269,20860,27500,50270,50271,\r
+27497,50272,50273,50274,50275,14393,20313,17509,27503,27504,19546,19784,12402,\r
+50276,27510,50277,50278,50279,50280,50281,27509,50282,12850,50283,50284,50285,\r
+50286,14432,50287,27511,50288,50289,50290,50291,50292,50293,12652,50294,50295,\r
+19525,17444,20261,50296,50297,50298,50299,50300,27513,50301,50302,27682,50304,\r
+17778,50305,27514,50306,50307,50308,50309,50310,50311,50312,50313,18757,50314,\r
+50315,50316,50317,50318,50319,25183,27518,50320,50321,50322,50323,19790,27681,\r
+12635,21303,50324,50325,21084,50326,50327,50328,27517,50329,27515,50330,50331,\r
+50332,50333,50334,50335,50336,50496,50497,50498,50499,50500,50501,50502,50503,\r
+50504,50505,50506,50507,50508,50509,50510,13116,50511,50512,50513,27184,50514,\r
+50515,22356,50516,29739,13172,50517,50518,50519,50520,50521,22081,22082,50522,\r
+50523,50524,50525,50526,50527,21865,15946,50528,29735,50529,21032,29736,29737,\r
+50530,29738,15947,21343,50531,50532,50533,50534,50535,18784,18785,50536,50537,\r
+29506,50538,19046,50539,19570,50540,50541,50542,50543,50544,50545,25142,19252,\r
+50546,20072,22107,50547,29741,29742,29743,50548,50549,50550,50551,29746,50552,\r
+14909,29747,12387,29744,50553,29745,15650,12885,50554,29750,29751,13926,12848,\r
+20303,29748,13356,50555,29749,50556,50557,29752,50558,50560,50561,50562,50563,\r
+29753,50564,50565,19751,50566,29754,50567,29755,50568,50569,50570,29756,50571,\r
+50572,50573,50574,50575,50576,50577,50578,19282,50579,29757,50580,50581,50582,\r
+50583,29758,50584,50585,50586,50587,50588,50589,50590,50591,29759,50592,50752,\r
+50753,50754,50755,29790,16700,15464,50756,18731,20830,25973,50757,50758,50759,\r
+50760,23603,21077,50761,50762,23604,12332,23605,50763,50764,15706,50765,23609,\r
+50766,50767,50768,22594,50769,23607,21363,50770,18774,23610,23606,50771,23611,\r
+17186,50772,50773,50774,50775,23612,23621,23613,50776,50777,20063,22053,50778,\r
+23631,50779,23629,50780,50781,23634,15718,16939,50782,23608,23627,23630,23614,\r
+14162,12357,23623,20542,23617,15144,50783,14140,23628,50784,50785,23622,23615,\r
+18267,50786,50787,50788,20799,23616,50789,50790,23626,50791,50792,23632,50793,\r
+50794,20013,23618,50795,23619,23624,23625,12884,23633,19285,50796,21559,23643,\r
+23647,19494,23654,50797,17255,23644,50798,50799,16193,23641,50800,12410,14646,\r
+23653,23635,50801,23620,23638,18548,16224,50802,50803,50804,50805,18747,50806,\r
+50807,50808,12605,50809,21282,50810,50811,23642,50812,50813,23637,50814,17979,\r
+50816,23646,50817,50818,50819,50820,50821,22338,17199,14134,18257,17193,23650,\r
+23640,23659,23636,50822,50823,23645,50824,15909,23639,50825,23648,50826,50827,\r
+23651,23652,50828,23672,50829,50830,23649,23842,23655,50831,50832,50833,50834,\r
+50835,50836,50837,50838,50839,50840,15467,13380,50841,50842,17187,12903,23674,\r
+50843,23666,50844,23663,50845,23676,23662,21104,12904,50846,18519,18531,23675,\r
+50847,23661,50848,51008,51009,23671,51010,51011,23669,51012,51013,15907,23668,\r
+51014,12893,51015,51016,51017,51018,51019,23667,15478,23656,15172,51020,16499,\r
+51021,51022,51023,51024,51025,15444,23657,23658,51026,23665,23670,23673,13620,\r
+51027,18521,15207,23678,23677,21291,23841,23843,23845,21105,23844,23846,23847,\r
+21033,51028,51029,51030,51031,51032,51033,51034,14921,23849,51035,51036,23862,\r
+23857,23860,51037,51038,51039,51040,51041,51042,51043,23856,17998,51044,51045,\r
+16498,51046,51047,51048,51049,18735,51050,51051,51052,23660,23854,51053,51054,\r
+51055,51056,23863,51057,51058,23664,23855,51059,23864,51060,23852,51061,51062,\r
+51063,51064,51065,51066,51067,23865,23859,23853,17450,51068,51069,51070,51072,\r
+23848,16435,16683,23850,23851,51073,23858,15217,23861,21288,23866,51074,23867,\r
+17191,51075,51076,23890,23868,51077,51078,51079,23889,51080,14653,51081,51082,\r
+15957,51083,15994,51084,51085,14922,51086,51087,51088,51089,23882,51090,23877,\r
+51091,23871,51092,51093,51094,12875,23875,51095,23883,12836,23893,51096,51097,\r
+51098,23870,51099,51100,51101,18000,23888,51102,51103,51104,51264,51265,23892,\r
+16738,14150,51266,51267,51268,51269,51270,23886,23887,51271,51272,51273,23876,\r
+51274,51275,51276,23869,51277,23885,19537,51278,23881,51279,51280,51281,51282,\r
+23874,17224,17980,20014,23884,51283,23880,51284,51285,51286,51287,51288,51289,\r
+23873,51290,51291,51292,23878,16988,51293,51294,51295,51296,51297,51298,21289,\r
+21290,23891,20340,18552,51299,51300,51301,51302,51303,51304,51305,51306,23910,\r
+51307,51308,51309,51310,51311,51312,23879,51313,51314,51315,23904,16996,51316,\r
+51317,51318,51319,51320,51321,51322,51323,23905,51324,51325,51326,51328,51329,\r
+51330,51331,51332,51333,51334,23895,51335,51336,51337,51338,51339,22136,51340,\r
+23897,23896,14448,23894,51341,51342,51343,51344,17999,51345,13869,51346,51347,\r
+51348,51349,51350,23906,51351,14969,21601,23911,51352,51353,51354,13392,51355,\r
+23898,51356,16251,23907,51357,23903,51358,23901,51359,51360,51520,51521,51522,\r
+51523,51524,13657,51525,51526,51527,51528,23899,23900,23902,51529,15663,23908,\r
+51530,23909,51531,51532,51533,51534,51535,51536,51537,51538,23925,51539,17225,\r
+51540,51541,19298,51542,51543,51544,51545,23922,51546,51547,51548,51549,51550,\r
+51551,51552,51553,51554,51555,51556,51557,51558,22625,51559,51560,18001,51561,\r
+23924,51562,51563,51564,21876,23923,23920,51565,51566,23916,51567,23919,51568,\r
+23912,51569,51570,20590,51571,51572,51573,51574,18520,23918,51575,51576,23913,\r
+51577,51578,23914,19314,51579,23917,51580,51581,12621,51582,51584,51585,51586,\r
+51587,51588,16438,51589,15419,23921,51590,51591,23927,51592,23926,23915,51593,\r
+51594,51595,51596,51597,17774,51598,51599,51600,23931,51601,51602,51603,51604,\r
+51605,51606,51607,51608,51609,51610,51611,24100,51612,51613,24099,51614,51615,\r
+51616,51776,51777,51778,51779,51780,51781,51782,51783,51784,23928,51785,51786,\r
+51787,51788,17263,51789,17019,51790,51791,51792,21857,51793,51794,20021,51795,\r
+51796,51797,51798,23933,51799,12876,51800,51801,51802,51803,51804,51805,51806,\r
+51807,51808,17512,19039,51809,51810,51811,51812,51813,51814,51815,51816,51817,\r
+51818,18238,23930,23932,23934,24098,12330,12622,51819,51820,51821,51822,51823,\r
+24108,51824,51825,51826,51827,24102,15670,18543,51828,51829,51830,51831,51832,\r
+51833,51834,51835,51836,51837,51838,24097,51840,51841,24101,51842,51843,51844,\r
+51845,24105,51846,51847,51848,51849,51850,24104,51851,51852,51853,24103,51854,\r
+51855,51856,51857,51858,51859,51860,51861,51862,24109,51863,21580,51864,51865,\r
+51866,51867,24115,24106,24110,51868,51869,16473,51870,51871,51872,52032,52033,\r
+12577,24118,52034,24113,52035,52036,52037,52038,52039,52040,52041,24114,52042,\r
+52043,52044,52045,52046,52047,52048,52049,52050,52051,52052,20774,24117,52053,\r
+52054,52055,52056,52057,52058,52059,24111,52060,52061,52062,24112,52063,20541,\r
+52064,52065,52066,24116,19053,24121,52067,52068,52069,52070,52071,52072,24120,\r
+52073,24119,52074,52075,52076,52077,52078,52079,52080,24123,52081,52082,52083,\r
+52084,52085,52086,52087,15717,52088,52089,52090,52091,52092,12888,17258,52093,\r
+52094,24122,52096,17722,52097,52098,52099,52100,52101,52102,24124,52103,52104,\r
+52105,52106,52107,52108,52109,19545,52110,52111,52112,52113,14122,52114,52115,\r
+52116,52117,52118,52119,52120,52121,52122,52123,52124,52125,52126,52127,52128,\r
+52288,52289,21605,52290,52291,52292,24125,52293,52294,52295,52296,52297,24127,\r
+52298,52299,52300,52301,52302,52303,52304,52305,52306,52307,52308,17442,52309,\r
+52310,52311,52312,24129,52313,52314,52315,52316,52317,52318,52319,52320,52321,\r
+52322,52323,52324,52325,52326,52327,52328,24126,52329,24128,52330,52331,52332,\r
+52333,52334,52335,52336,52337,52338,52339,52340,52341,52342,52343,21818,52344,\r
+52345,52346,24130,52347,52348,52349,52350,52352,52353,52354,52355,52356,52357,\r
+52358,52359,52360,52361,52362,52363,29230,15138,16946,17712,16967,52364,52365,\r
+29231,52366,52367,52368,52369,52370,20585,52371,52372,52373,21341,52374,52375,\r
+52376,27453,52377,52378,52379,52380,52381,52382,52383,52384,13158,29232,52544,\r
+29233,52545,52546,18989,52547,52548,52549,52550,52551,52552,52553,14951,29235,\r
+29237,29236,19300,20282,29234,18996,21071,17004,52554,52555,52556,52557,52558,\r
+52559,52560,20035,29240,12406,29239,52561,52562,52563,52564,52565,29246,52566,\r
+12879,52567,52568,52569,52570,52571,52572,20801,29242,52573,52574,52575,52576,\r
+52577,29244,21609,52578,52579,29243,29238,29247,29245,52580,29241,52581,52582,\r
+29255,29252,29254,52583,52584,29258,29250,29248,52585,52586,52587,29253,52588,\r
+52589,52590,52591,52592,22139,52593,52594,52595,29249,52596,18297,18783,52597,\r
+29256,14662,13616,52598,52599,29251,29257,29264,29270,52600,52601,15191,52602,\r
+52603,52604,29269,19804,52605,22123,52606,52608,29266,29268,52609,52610,52611,\r
+52612,14450,52613,52614,52615,52616,29259,52617,52618,52619,29262,17017,52620,\r
+21853,29260,29261,29263,29267,52621,52622,52623,29273,21308,52624,52625,52626,\r
+52627,13930,52628,19057,52629,14180,29271,52630,52631,52632,29272,29274,29277,\r
+29275,52633,52634,29276,52635,52636,52637,52638,20817,29265,52639,19785,52640,\r
+20047,22057,52800,29283,52801,17243,52802,29280,52803,52804,16431,29292,29278,\r
+52805,29281,52806,52807,52808,29288,52809,52810,52811,52812,29282,52813,52814,\r
+29287,52815,52816,29286,52817,52818,29289,52819,52820,52821,29279,52822,52823,\r
+29284,29290,52824,52825,52826,52827,52828,52829,52830,21292,29285,12917,52831,\r
+52832,29298,52833,20523,52834,52835,52836,52837,29301,52838,52839,52840,15176,\r
+52841,29305,52842,52843,52844,52845,52846,52847,29296,52848,52849,29302,29304,\r
+29306,52850,52851,52852,52853,52854,52855,52856,52857,29299,52858,29297,52859,\r
+52860,52861,14971,52862,13691,52864,52865,52866,52867,29295,29303,29293,29294,\r
+52868,52869,52870,29291,29478,52871,29475,52872,52873,29474,52874,52875,29300,\r
+52876,18522,52877,52878,52879,52880,52881,29307,52882,52883,52884,29477,52885,\r
+52886,52887,52888,52889,52890,52891,17272,52892,52893,52894,52895,52896,53056,\r
+53057,53058,29309,53059,53060,29479,29481,29476,53061,29308,53062,53063,53064,\r
+29483,53065,29482,53066,53067,53068,53069,16989,53070,53071,29486,53072,53073,\r
+29488,53074,53075,53076,53077,53078,29473,53079,53080,53081,29489,29484,53082,\r
+53083,53084,53085,53086,29487,29310,29485,53087,53088,53089,53090,53091,53092,\r
+53093,29490,53094,53095,53096,53097,29492,53098,53099,53100,53101,29480,53102,\r
+53103,53104,53105,29491,53106,53107,53108,29493,53109,53110,53111,53112,53113,\r
+53114,53115,53116,53117,53118,20535,53120,53121,53122,53123,29496,53124,53125,\r
+53126,53127,22905,53128,53129,53130,53131,53132,53133,29497,53134,53135,53136,\r
+53137,53138,53139,53140,53141,29495,53142,18532,29494,53143,53144,53145,53146,\r
+29498,53147,53148,53149,53150,53151,29499,13376,53152,53312,53313,53314,53315,\r
+53316,53317,53318,53319,53320,53321,53322,53323,53324,53325,28227,53326,53327,\r
+53328,53329,53330,53331,29500,53332,53333,29501,53334,53335,53336,20778,53337,\r
+53338,53339,29740,20550,53340,53341,53342,53343,53344,53345,20560,20828,53346,\r
+53347,53348,53349,53350,53351,20302,53352,53353,15702,53354,20803,53355,53356,\r
+53357,53358,53359,53360,53361,14946,24937,21058,28994,12857,53362,53363,12653,\r
+28995,53364,18752,13124,53365,22898,53366,19237,53367,28996,53368,53369,53370,\r
+53371,22100,53372,53373,53374,53376,53377,28997,29760,28998,53378,21548,28999,\r
+53379,12352,29761,53380,53381,29762,53382,53383,13436,53384,17755,53385,53386,\r
+53387,53388,19515,53389,53390,53391,20580,53392,53393,53394,53395,53396,19808,\r
+53397,53398,53399,53400,53401,29000,53402,22899,53403,53404,53405,53406,53407,\r
+53408,12603,53568,20270,53569,53570,53571,14372,53572,53573,53574,53575,53576,\r
+29002,53577,53578,53579,53580,29003,53581,53582,53583,53584,12867,16721,53585,\r
+53586,22320,29001,53587,53588,29004,53589,53590,53591,53592,29006,53593,53594,\r
+53595,22902,53596,21089,21539,53597,53598,29763,18489,53599,53600,53601,53602,\r
+53603,29764,53604,53605,29005,29007,16227,29008,53606,53607,29012,53608,53609,\r
+53610,53611,53612,53613,53614,29014,29009,53615,18769,17761,53616,53617,53618,\r
+16995,14716,53619,53620,29011,53621,29013,53622,53623,53624,14675,53625,53626,\r
+53627,53628,53629,53630,53632,29019,53633,53634,53635,53636,53637,14934,53638,\r
+12413,29017,53639,53640,53641,53642,53643,29016,29010,29018,53644,53645,53646,\r
+53647,53648,29015,53649,53650,53651,18540,53652,53653,53654,53655,19786,29021,\r
+53656,53657,53658,53659,25917,53660,53661,53662,29020,53663,29022,53664,53824,\r
+53825,53826,53827,53828,53829,53830,53831,53832,29023,53833,53834,20325,53835,\r
+53836,53837,53838,53839,53840,53841,53842,53843,53844,53845,53846,53847,53848,\r
+53849,53850,53851,53852,53853,53854,53855,53856,53857,53858,53859,29765,15731,\r
+53860,53861,53862,53863,53864,53865,29024,53866,53867,53868,53869,53870,53871,\r
+53872,53873,53874,53875,53876,53877,53878,53879,53880,53881,53882,53883,53884,\r
+53885,29025,53886,53888,53889,20087,53890,21034,53891,29051,53892,53893,14386,\r
+53894,53895,53896,53897,53898,53899,53900,53901,53902,53903,53904,53905,53906,\r
+53907,53908,53909,53910,53911,53912,53913,53914,53915,53916,53917,53918,53919,\r
+53920,54080,54081,54082,54083,54084,54085,54086,54087,54088,54089,54090,54091,\r
+54092,54093,54094,54095,54096,54097,54098,54099,54100,54101,54102,54103,54104,\r
+54105,54106,54107,54108,54109,54110,15483,14683,54111,14694,17241,19027,27240,\r
+16448,15989,27241,27242,27243,54112,27244,27245,27246,27247,15687,54113,54114,\r
+54115,30075,54116,54117,54118,30077,54119,30078,54120,30076,54121,54122,54123,\r
+54124,15714,54125,30241,13349,54126,54127,54128,54129,30242,54130,54131,54132,\r
+30243,54133,54134,54135,27698,54136,54137,54138,54139,54140,54141,54142,54144,\r
+54145,54146,54147,54148,20820,54149,54150,54151,54152,54153,54154,22890,54155,\r
+54156,54157,54158,54159,54160,54161,54162,54163,54164,54165,54166,54167,54168,\r
+54169,54170,54171,54172,54173,54174,54175,54176,54336,54337,54338,54339,54340,\r
+54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,54352,54353,\r
+54354,54355,54356,54357,54358,54359,54360,54361,54362,54363,54364,54365,54366,\r
+54367,30244,54368,54369,54370,54371,54372,54373,54374,54375,54376,28218,54377,\r
+54378,54379,54380,54381,54382,54383,54384,54385,54386,54387,54388,54389,54390,\r
+54391,54392,54393,54394,54395,54396,54397,54398,54400,54401,54402,54403,54404,\r
+54405,54406,54407,54408,54409,54410,54411,54412,54413,54414,54415,54416,54417,\r
+54418,54419,54420,54421,54422,54423,54424,54425,21810,54426,54427,54428,54429,\r
+54430,54431,54432,54592,54593,54594,54595,54596,54597,54598,54599,21374,19548,\r
+54600,54601,54602,54603,54604,54605,54606,54607,19012,54608,54609,54610,54611,\r
+54612,54613,54614,54615,54616,54617,54618,54619,54620,54621,54622,54623,54624,\r
+54625,54626,54627,54628,54629,54630,54631,54632,54633,54634,54635,54636,54637,\r
+54638,54639,54640,54641,54642,54643,54644,54645,54646,54647,54648,54649,54650,\r
+54651,54652,54653,54654,54656,54657,54658,54659,54660,54661,54662,54663,54664,\r
+54665,54666,54667,54668,54669,54670,54671,54672,54673,54674,54675,54676,54677,\r
+54678,54679,54680,54681,54682,54683,54684,54685,54686,54687,54688,54848,54849,\r
+54850,54851,54852,54853,54854,54855,54856,54857,54858,54859,54860,54861,54862,\r
+54863,54864,54865,54866,54867,54868,54869,54870,54871,54872,54873,54874,54875,\r
+54876,54877,54878,54879,54880,54881,54882,25920,54883,54884,54885,54886,54887,\r
+54888,54889,54890,54891,54892,54893,54894,54895,54896,54897,54898,54899,54900,\r
+54901,54902,54903,54904,54905,54906,54907,54908,54909,54910,54912,54913,30245,\r
+54914,54915,54916,54917,54918,54919,54920,54921,54922,54923,54924,54925,54926,\r
+54927,54928,54929,54930,54931,54932,54933,54934,54935,54936,54937,54938,54939,\r
+54940,54941,54942,54943,54944,55104,55105,55106,55107,55108,55109,55110,55111,\r
+55112,55113,55114,55115,55116,55117,55118,55119,55120,55121,55122,55123,55124,\r
+55125,55126,55127,55128,55129,55130,55131,55132,55133,55134,55135,15919,55136,\r
+55137,55138,55139,55140,17961,55141,55142,55143,55144,55145,55146,55147,55148,\r
+55149,55150,55151,55152,55153,55154,55155,55156,55157,55158,55159,55160,55161,\r
+55162,55163,55164,55165,55166,55168,55169,55170,55171,55172,55173,55174,55175,\r
+55176,55177,55178,55179,55180,55181,55182,55183,55184,55185,55186,55187,55188,\r
+55189,55190,55191,55192,23077,15430,13865,14396,18511,15397,23078,23079,19542,\r
+18499,23080,18045,55193,20789,21097,20790,15431,55194,15666,15204,23081,23082,\r
+20808,23083,20589,13935,16987,55195,19279,14189,18792,14147,15991,22052,23084,\r
+23085,17984,22375,18998,55196,21801,19295,21871,23086,22111,13386,23088,23087,\r
+55197,21099,23089,23090,23091,19028,23092,18987,23093,23094,13135,22127,23095,\r
+15152,13614,23096,23097,14702,20783,21096,23098,14403,20330,12911,23099,23100,\r
+55198,15723,20060,21359,23101,20083,23102,21333,15205,23103,19253,19280,23104,\r
+18283,22126,23105,17717,13889,23106,14156,16206,23107,23108,19245,23109,13687,\r
+23110,16706,22331,23111,19512,55199,21098,17457,23112,13693,15185,23113,20531,\r
+23114,23115,20029,23116,23117,23118,12919,23121,23119,20840,23120,17237,23122,\r
+55200,23123,23124,23125,20539,21029,12409,23126,18219,23127,15735,17185,23128,\r
+23129,17277,19511,23130,23131,16446,18007,23132,23133,18228,23134,23135,14664,\r
+55360,55361,55362,55363,55364,55365,55366,55367,55368,15213,55369,55370,55371,\r
+55372,13881,29816,55373,29817,55374,55375,19811,55376,55377,55378,55379,55380,\r
+55381,55382,55383,30009,55384,55385,55386,55387,27488,55388,55389,55390,55391,\r
+55392,55393,20339,15167,55394,55395,55396,55397,55398,55399,55400,14912,21541,\r
+55401,55402,55403,55404,55405,55406,55407,24921,55408,55409,55410,55411,30068,\r
+12586,12914,55412,55413,55414,55415,55416,55417,55418,30069,55419,55420,30071,\r
+55421,55422,55424,14929,30070,55425,17202,55426,55427,55428,55429,55430,55431,\r
+55432,30073,55433,55434,55435,30072,55436,55437,55438,55439,55440,55441,55442,\r
+55443,55444,55445,55446,55447,55448,55449,55450,55451,55452,55453,55454,55455,\r
+55456,55616,55617,55618,55619,55620,55621,55622,55623,55624,55625,55626,55627,\r
+55628,55629,55630,55631,55632,55633,55634,55635,55636,55637,55638,55639,55640,\r
+55641,55642,55643,55644,55645,55646,55647,55648,55649,55650,55651,55652,55653,\r
+55654,55655,55656,55657,55658,55659,55660,55661,55662,55663,55664,55665,55666,\r
+55667,55668,55669,55670,55671,55672,55673,55674,55675,55676,55677,55678,55680,\r
+55681,55682,55683,55684,55685,55686,55687,55688,55689,55690,55691,55692,55693,\r
+55694,55695,55696,55697,55698,55699,55700,55701,55702,55703,55704,55705,55706,\r
+55707,55708,55709,55710,55711,55712,55872,55873,55874,55875,55876,55877,55878,\r
+55879,55880,55881,55882,55883,55884,55885,55886,12596,21866,14394,55887,14641,\r
+12870,21616,20301,12380,21835,15221,22090,14135,19504,17974,12641,14650,22140,\r
+14689,14113,15482,27226,27227,19577,14707,27228,13435,17203,14161,14936,27229,\r
+21620,27230,15446,15199,27231,16734,16952,21599,22346,27232,27233,27236,27234,\r
+27235,18782,14387,13892,27237,19050,18765,13389,55888,55889,25177,17762,27238,\r
+16437,55890,22328,27239,22316,18556,22611,22605,21598,55891,21625,18756,21294,\r
+14419,13152,55892,18786,29814,55893,55894,55895,14933,55896,29815,55897,55898,\r
+22367,55899,55900,29809,14384,21844,14415,18032,55901,55902,55903,55904,55905,\r
+55906,55907,55908,55909,13123,55910,55911,29810,13100,55912,55913,55914,55915,\r
+21565,18295,55916,55917,55918,55919,55920,29812,55921,55922,29811,55923,55924,\r
+55925,55926,55927,55928,55929,55930,55931,55932,19531,55933,55934,55936,18468,\r
+55937,55938,55939,55940,55941,55942,55943,55944,55945,55946,55947,55948,55949,\r
+29813,55950,22371,17727,30016,55951,55952,30011,55953,30019,55954,30018,55955,\r
+22074,30017,55956,55957,55958,21566,30020,55959,30028,55960,55961,55962,55963,\r
+12367,13688,55964,30025,30026,55965,17756,55966,55967,55968,56128,30021,30022,\r
+56129,56130,30023,30027,56131,15968,30024,14458,56132,56133,56134,30032,30035,\r
+56135,56136,56137,16231,56138,14706,30012,30029,56139,56140,16951,56141,56142,\r
+56143,19576,56144,15481,56145,30030,30031,30033,13925,30034,56146,30037,56147,\r
+56148,56149,56150,56151,56152,56153,30013,56154,56155,56156,30036,21307,56157,\r
+13164,56158,56159,19492,56160,56161,56162,56163,30038,56164,56165,56166,56167,\r
+56168,56169,56170,56171,30039,15969,30040,56172,56173,19551,30043,56174,56175,\r
+56176,56177,56178,12872,22361,56179,30041,56180,30042,30044,56181,30050,56182,\r
+56183,56184,30048,56185,56186,56187,30047,30045,56188,56189,30049,56190,56192,\r
+30046,30052,30053,56193,19555,56194,56195,25919,13624,30051,30056,19491,56196,\r
+56197,56198,56199,56200,30054,30055,56201,56202,56203,56204,56205,56206,30014,\r
+56207,56208,56209,56210,56211,56212,56213,56214,56215,56216,56217,56218,12612,\r
+56219,56220,30015,56221,56222,13637,12900,56223,30060,30057,56224,13911,56384,\r
+30061,56385,30058,56386,56387,56388,56389,56390,30059,56391,56392,13402,56393,\r
+21610,56394,56395,56396,30062,56397,13177,56398,56399,56400,56401,56402,56403,\r
+56404,30063,30065,56405,56406,56407,30064,56408,56409,56410,56411,56412,56413,\r
+56414,30066,56415,30067,56416,56417,56418,56419,56420,56421,56422,56423,56424,\r
+56425,56426,56427,18797,14634,56428,56429,18299,56430,56431,13923,56432,56433,\r
+56434,56435,56436,56437,56438,19529,56439,56440,56441,56442,56443,56444,56445,\r
+56446,56448,56449,56450,56451,56452,56453,56454,56455,56456,56457,56458,27174,\r
+56459,56460,56461,56462,56463,56464,56465,56466,56467,56468,56469,56470,56471,\r
+56472,56473,56474,56475,56476,56477,56478,56479,56480,56640,56641,56642,56643,\r
+56644,56645,56646,56647,56648,56649,56650,56651,56652,56653,56654,56655,56656,\r
+56657,56658,56659,56660,56661,56662,56663,56664,56665,56666,56667,56668,56669,\r
+56670,56671,56672,56673,56674,56675,56676,56677,56678,56679,56680,56681,56682,\r
+56683,56684,56685,56686,56687,56688,56689,56690,56691,56692,56693,56694,56695,\r
+56696,56697,56698,56699,56700,56701,56702,56704,56705,56706,56707,56708,56709,\r
+56710,56711,56712,56713,56714,56715,56716,56717,56718,56719,56720,56721,56722,\r
+56723,56724,56725,56726,56727,56728,56729,56730,56731,56732,56733,56734,56735,\r
+56736,56896,56897,56898,56899,56900,56901,56902,56903,56904,56905,56906,56907,\r
+56908,56909,56910,56911,56912,56913,56914,56915,56916,56917,56918,56919,56920,\r
+56921,56922,56923,56924,56925,56926,56927,56928,13109,21630,14700,20601,56929,\r
+26989,22314,26990,16982,18541,14948,26991,26992,26993,22113,26994,26995,26997,\r
+26996,26998,26999,18273,27000,21592,27001,15694,56930,27002,27003,15695,27004,\r
+14376,16702,27005,12594,15188,14709,27006,56931,27169,27170,27171,14200,15405,\r
+56932,19044,24654,21551,20285,21815,27172,21854,27173,20545,14652,56933,13383,\r
+12633,56934,56935,56936,16433,56937,56938,56939,56940,12646,12647,56941,12648,\r
+56942,56943,56944,56945,13117,18536,56946,56947,56948,56949,25921,56950,56951,\r
+12639,56952,56953,56954,16713,13423,56955,56956,18216,21336,56957,18041,20792,\r
+56958,14717,17013,56960,56961,56962,56963,56964,21293,56965,21579,15740,56966,\r
+25922,14133,25923,56967,56968,15161,21858,56969,15736,21558,20005,16684,13145,\r
+56970,56971,19574,56972,25926,25924,25928,56973,25930,25927,13647,17992,56974,\r
+13692,25925,56975,19062,56976,56977,25929,56978,56979,56980,17236,12613,15395,\r
+56981,56982,56983,22327,56984,56985,19787,19277,19018,19539,25932,25931,17510,\r
+56986,56987,20769,20791,25933,56988,25936,56989,19768,22128,25935,13661,56990,\r
+19774,56991,25937,13882,56992,57152,19752,14692,57153,19013,13137,19289,21612,\r
+25938,14186,57154,57155,57156,25934,57157,57158,57159,57160,57161,57162,25941,\r
+13438,25942,57163,57164,57165,57166,57167,25939,25940,57168,21085,57169,57170,\r
+16991,12614,57171,21346,57172,57173,13917,19308,57174,25943,57175,57176,21366,\r
+57177,57178,57179,57180,57181,12649,57182,13940,25946,25944,25945,13632,57183,\r
+57184,57185,21061,25948,57186,57187,25950,57188,57189,57190,57191,57192,57193,\r
+25949,18226,57194,21027,57195,57196,25947,57197,57198,57199,57200,21602,21850,\r
+57201,57202,57203,57204,57205,25952,22385,57206,57207,57208,57209,57210,57211,\r
+57212,25953,57213,12636,20859,57214,25954,25956,57216,57217,57218,57219,25955,\r
+57220,57221,25957,57222,57223,57224,57225,57226,21080,57227,13643,57228,26463,\r
+57229,23157,57230,23160,57231,23158,57232,23159,57233,57234,57235,23162,20559,\r
+17479,57236,57237,12398,57238,57239,57240,20528,57241,23161,57242,21322,14890,\r
+23330,18289,57243,23164,23163,18779,23165,57244,23329,22366,23166,16730,57245,\r
+57246,23333,57247,57248,21364,57408,57409,23335,23332,57410,23336,57411,57412,\r
+15676,57413,57414,57415,16457,23331,23334,22051,57416,23337,57417,57418,57419,\r
+23341,57420,57421,57422,23342,23340,14914,57423,57424,57425,16164,23339,57426,\r
+57427,57428,23338,21575,12863,57429,57430,23343,57431,14713,57432,23344,57433,\r
+57434,57435,57436,13115,57437,57438,57439,13606,57440,57441,57442,57443,13884,\r
+23345,57444,57445,57446,13941,57447,23346,57448,57449,57450,57451,57452,57453,\r
+57454,57455,57456,57457,57458,57459,57460,57461,57462,57463,57464,57465,57466,\r
+57467,12617,57468,57469,57470,57472,23348,57473,57474,57475,23347,23349,57476,\r
+57477,57478,57479,57480,57481,57482,57483,57484,57485,57486,23351,57487,23350,\r
+57488,57489,57490,57491,57492,57493,57494,23352,57495,57496,57497,57498,57499,\r
+57500,57501,57502,57503,23353,57504,57664,23354,57665,57666,21327,29818,18293,\r
+22339,17764,29820,29821,29819,57667,15942,57668,57669,57670,57671,20591,57672,\r
+57673,14163,57674,57675,21581,19498,57676,57677,29986,29985,14888,29822,19286,\r
+57678,57679,57680,29988,16466,57681,13162,57682,19754,29989,29987,15668,29992,\r
+57683,29993,15693,17208,16225,19297,29994,57684,57685,57686,29990,29991,17520,\r
+57687,57688,57689,57690,57691,29996,57692,13372,57693,22381,57694,13399,29995,\r
+29998,57695,57696,29997,29999,20561,57697,57698,57699,57700,57701,57702,57703,\r
+17233,18473,57704,57705,57706,57707,57708,57709,30000,30001,57710,57711,57712,\r
+57713,57714,57715,30002,57716,57717,30003,30004,30005,57718,57719,57720,57721,\r
+30007,30006,57722,57723,57724,57725,30008,57726,57728,57729,57730,57731,57732,\r
+57733,57734,57735,57736,57737,57738,12873,57739,21332,19021,57740,16495,22104,\r
+21040,16703,57741,15728,57742,57743,57744,57745,57746,57747,57748,57749,57750,\r
+57751,14378,57752,57753,57754,57755,57756,57757,57758,57759,57760,57920,57921,\r
+57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,57934,\r
+57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,57947,\r
+57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,57960,\r
+57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,57973,\r
+57974,57975,57976,57977,57978,57979,57980,57981,57982,57984,57985,57986,57987,\r
+57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,57999,58000,\r
+58001,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,58012,58013,\r
+58014,58015,58016,58176,58177,58178,58179,58180,58181,58182,58183,58184,58185,\r
+58186,58187,58188,58189,58190,58191,58192,58193,58194,58195,58196,58197,58198,\r
+58199,58200,58201,58202,58203,58204,58205,58206,58207,58208,58209,58210,58211,\r
+58212,58213,58214,58215,58216,58217,58218,58219,58220,58221,15480,58222,58223,\r
+58224,58225,58226,58227,58228,58229,58230,58231,58232,58233,58234,58235,58236,\r
+58237,58238,58240,58241,58242,58243,58244,58245,58246,58247,30278,58248,58249,\r
+58250,58251,58252,58253,58254,58255,58256,58257,58258,58259,58260,58261,58262,\r
+58263,58264,58265,58266,58267,58268,58269,58270,58271,58272,58432,58433,58434,\r
+58435,58436,58437,30279,58438,58439,58440,58441,58442,58443,58444,58445,58446,\r
+58447,58448,58449,58450,58451,58452,58453,58454,58455,58456,58457,58458,58459,\r
+58460,58461,58462,30280,58463,58464,58465,58466,58467,58468,58469,58470,58471,\r
+58472,58473,58474,58475,58476,58477,58478,58479,58480,58481,58482,58483,58484,\r
+58485,58486,58487,58488,58489,58490,58491,58492,58493,58494,58496,58497,58498,\r
+58499,58500,58501,58502,58503,58504,58505,58506,58507,58508,58509,58510,58511,\r
+58512,58513,58514,58515,58516,58517,58518,58519,58520,58521,58522,58523,58524,\r
+58525,58526,58527,58528,58688,58689,58690,58691,58692,58693,58694,58695,58696,\r
+58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,58708,58709,\r
+58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,58721,58722,\r
+58723,58724,58725,58726,58727,58728,58729,58730,58731,58732,58733,58734,58735,\r
+58736,58737,58738,58739,30281,58740,58741,58742,58743,58744,58745,58746,58747,\r
+58748,58749,58750,58752,58753,58754,58755,58756,58757,58758,58759,58760,58761,\r
+58762,58763,58764,58765,58766,58767,58768,58769,58770,58771,58772,58773,58774,\r
+58775,58776,58777,58778,58779,58780,58781,58782,58783,30282,58784,58944,58945,\r
+58946,58947,58948,58949,58950,58951,58952,58953,58954,58955,58956,58957,58958,\r
+58959,58960,58961,58962,58963,58964,58965,58966,58967,58968,58969,58970,58971,\r
+58972,58973,58974,58975,58976,58977,58978,30284,58979,58980,58981,58982,58983,\r
+58984,58985,58986,58987,58988,58989,58990,58991,58992,58993,58994,58995,58996,\r
+58997,58998,58999,59000,59001,59002,59003,59004,59005,59006,59008,59009,59010,\r
+59011,59012,59013,59014,59015,59016,59017,59018,59019,59020,59021,59022,59023,\r
+59024,59025,59026,59027,59028,59029,59030,59031,59032,59033,59034,59035,59036,\r
+59037,30283,59038,59039,59040,59200,59201,59202,59203,59204,59205,59206,59207,\r
+30569,59208,59209,59210,59211,59212,59213,59214,59215,59216,59217,59218,59219,\r
+59220,59221,59222,59223,59224,59225,59226,59227,59228,59229,59230,59231,59232,\r
+59233,59234,59235,59236,59237,59238,59239,59240,59241,59242,59243,59244,59245,\r
+59246,59247,59248,59249,59250,59251,59252,59253,59254,59255,59256,59257,59258,\r
+59259,59260,59261,59262,59264,59265,59266,59267,59268,59269,59270,59271,59272,\r
+59273,59274,59275,59276,59277,59278,59279,59280,59281,59282,59283,59284,59285,\r
+59286,59287,59288,59289,59290,59291,59292,59293,59294,59295,59296,59456,59457,\r
+59458,59459,59460,59461,59462,59463,59464,59465,59466,59467,59468,59469,59470,\r
+30285,59471,59472,59473,59474,59475,59476,59477,59478,59479,59480,59481,59482,\r
+59483,59484,59485,59486,59487,59488,59489,59490,59491,59492,59493,59494,59495,\r
+59496,59497,59498,59499,59500,59501,59502,59503,59504,59505,59506,59507,59508,\r
+59509,59510,59511,59512,59513,59514,30286,59515,59516,59517,59518,59520,59521,\r
+59522,59523,59524,59525,59526,59527,59528,59529,59530,59531,59532,59533,59534,\r
+59535,59536,59537,59538,59539,59540,28228,28229,28230,21867,13860,28232,28231,\r
+28233,28234,18213,28235,28236,59541,14128,13686,28237,28239,59542,28238,59543,\r
+14406,28240,28241,28242,13915,13102,22099,17478,12597,14422,28243,28244,21567,\r
+18261,15995,20057,14643,28246,28245,28248,28247,17701,28249,28250,18222,28251,\r
+18223,28252,12839,28253,28254,28255,28256,28257,22378,28258,28259,15448,28260,\r
+21323,19578,12844,16741,28261,18214,17197,59544,28262,28263,28264,28265,28266,\r
+28267,28268,59545,28269,28270,28271,59546,59547,28272,28273,28274,28276,28275,\r
+59548,28277,19757,16961,28278,28279,28280,21793,28281,20275,28282,28283,59549,\r
+28284,28285,28449,28286,28450,14453,17274,28451,28452,15682,21055,12921,28453,\r
+28454,28455,21112,28456,22141,28457,17996,59550,28458,28459,16692,28460,20346,\r
+19320,28462,28461,13178,14712,28463,28464,20578,28465,28466,14182,20543,28467,\r
+28468,28469,18545,19552,28470,28471,28472,28473,28474,21856,28475,13421,17194,\r
+28476,59551,28477,28478,28479,59552,20093,28480,16992,13368,22326,15733,59712,\r
+20295,28483,28481,28482,28484,13863,15484,15970,17228,28485,28486,59713,28487,\r
+28495,28488,28489,28490,18242,28529,13901,28491,59714,28492,28493,13894,17214,\r
+28494,59715,28496,28497,28498,21874,59716,28499,17527,59717,28500,17528,28501,\r
+28502,14436,12407,28503,28504,28505,59718,28506,28507,28508,28509,59719,28510,\r
+15925,28513,28511,28512,59720,28514,28515,16717,28516,28517,28518,28519,28520,\r
+28521,28522,28523,28524,16472,59721,28525,16685,28526,28527,28528,59722,59723,\r
+20322,59724,59725,59726,59727,59728,59729,59730,59731,13092,59732,59733,59734,\r
+59735,59736,59737,59738,59739,59740,59741,59742,59743,59744,59745,59746,59747,\r
+59748,59749,59750,59751,59752,59753,59754,59755,59756,59757,59758,59759,59760,\r
+59761,59762,59763,59764,59765,59766,59767,59768,59769,59770,59771,59772,59773,\r
+59774,59776,59777,59778,59779,59780,59781,59782,59783,59784,59785,59786,59787,\r
+59788,59789,59790,59791,59792,59793,59794,59795,59796,59797,59798,59799,59800,\r
+59801,59802,59803,59804,59805,59806,59807,59808,59968,59969,59970,59971,59972,\r
+59973,59974,59975,59976,59977,59978,59979,59980,59981,59982,59983,59984,59985,\r
+59986,59987,59988,59989,59990,59991,59992,59993,59994,59995,17221,25413,18753,\r
+25414,59996,12629,20042,13363,18546,25415,20304,25416,15460,25417,25418,17222,\r
+21794,17494,14699,20037,25419,17270,25420,59997,14119,14451,14930,25421,25422,\r
+21572,25423,59998,25424,20811,25425,25426,25427,25428,20822,25429,12923,16443,\r
+25430,59999,16427,25431,25432,25433,60000,25434,25435,60001,14391,23138,60002,\r
+13907,60003,23140,23139,60004,60005,60006,60007,60008,60009,60010,23142,60011,\r
+60012,60013,18542,60014,60015,23141,14144,20852,21109,21875,15703,60016,60017,\r
+60018,60019,22376,23144,23143,60020,12322,19795,60021,23145,60022,14397,15434,\r
+16957,16932,13122,23146,60023,16938,17456,15669,60024,60025,20318,60026,60027,\r
+60028,23147,18754,60029,60030,60032,60033,60034,12637,60035,60036,60037,23148,\r
+60038,13880,21562,60039,13181,60040,60041,23149,21577,20309,17763,60042,23150,\r
+60043,60044,60045,60046,60047,23151,60048,23152,16746,19541,20317,60049,60050,\r
+60051,60052,60053,60054,60055,60056,60057,60058,60059,60060,60061,21351,16929,\r
+60062,23153,60063,60064,19301,60224,23154,60225,19302,21118,60226,60227,60228,\r
+14452,60229,60230,23155,12335,20278,60231,60232,21839,60233,60234,60235,60236,\r
+60237,60238,60239,60240,60241,60242,19309,60243,60244,60245,60246,60247,60248,\r
+60249,60250,23156,60251,60252,25412,60253,60254,16677,60255,60256,30271,60257,\r
+60258,30272,30273,17489,60259,18488,20835,60260,60261,20571,20805,15407,14669,\r
+60262,28532,60263,60264,13382,21306,30274,13179,60265,60266,30275,60267,60268,\r
+13681,60269,60270,60271,60272,60273,60274,60275,60276,60277,60278,30277,60279,\r
+60280,60281,60282,60283,60284,60285,21354,30247,20777,60286,60288,60289,60290,\r
+30249,60291,60292,60293,30248,60294,60295,16739,16471,60296,12578,60297,60298,\r
+60299,60300,20077,60301,20584,30251,60302,60303,20342,60304,30250,21872,30252,\r
+17209,60305,60306,60307,15220,30254,30253,60308,60309,60310,17502,60311,60312,\r
+16728,60313,60314,60315,60316,60317,19242,60318,20284,60319,60320,60480,60481,\r
+60482,60483,60484,60485,60486,60487,60488,30255,60489,60490,30256,60491,60492,\r
+30257,60493,16950,60494,60495,60496,60497,60498,12372,17785,60499,60500,60501,\r
+60502,30258,60503,60504,60505,60506,60507,60508,60509,60510,60511,60512,60513,\r
+60514,60515,60516,60517,60518,60519,60520,60521,18272,30246,60522,60523,15928,\r
+60524,60525,15922,60526,13669,60527,60528,14151,60529,16191,17234,17254,60530,\r
+60531,22604,60532,60533,60534,14447,60535,60536,60537,60538,60539,60540,60541,\r
+60542,60544,15737,20773,60545,12368,60546,60547,60548,60549,60550,30512,60551,\r
+60552,60553,60554,60555,60556,60557,60558,30513,60559,60560,60561,60562,60563,\r
+20524,60564,12336,60565,60566,60567,30514,30515,60568,30516,60569,60570,60571,\r
+18250,60572,60573,60574,60575,60576,60736,60737,15951,60738,60739,30519,60740,\r
+60741,60742,60743,60744,60745,60746,30518,60747,12638,60748,30517,60749,60750,\r
+30520,60751,30521,60752,60753,60754,60755,60756,60757,60758,60759,60760,60761,\r
+60762,60763,60764,60765,60766,60767,60768,60769,60770,60771,60772,60773,60774,\r
+60775,60776,60777,60778,60779,60780,60781,60782,60783,60784,60785,60786,60787,\r
+60788,60789,60790,60791,60792,60793,60794,60795,60796,60797,60798,60800,60801,\r
+20004,18509,60802,14891,26680,26681,26682,15938,60803,60804,60805,60806,60807,\r
+21108,60808,21583,18776,60809,60810,60811,60812,60813,60814,60815,60816,60817,\r
+60818,60819,60820,60821,60822,60823,60824,60825,60826,60827,60828,60829,60830,\r
+60831,60832,60992,60993,60994,60995,60996,60997,60998,60999,61000,61001,61002,\r
+61003,61004,61005,61006,61007,61008,61009,61010,61011,61012,61013,61014,61015,\r
+61016,61017,61018,61019,61020,61021,61022,61023,61024,61025,61026,61027,61028,\r
+61029,61030,61031,61032,61033,61034,61035,61036,61037,61038,61039,61040,61041,\r
+61042,61043,61044,61045,61046,61047,61048,61049,61050,61051,61052,61053,61054,\r
+61056,61057,61058,61059,61060,61061,61062,61063,61064,61065,61066,61067,61068,\r
+61069,61070,61071,61072,61073,61074,61075,61076,61077,61078,61079,61080,61081,\r
+61082,61083,61084,61085,61086,61087,61088,61248,61249,61250,61251,61252,61253,\r
+21043,13861,18282,29052,20334,19251,20587,26479,19815,14667,13913,29053,12388,\r
+19276,29054,21540,16941,16748,17988,15921,29217,15445,61254,29218,29219,61255,\r
+29220,21059,17973,61256,19783,29221,61257,21297,16197,19554,61258,29222,29223,\r
+20821,13934,29224,29225,13663,29226,29227,61259,12924,29228,29229,18471,61260,\r
+61261,61262,61263,61264,61265,61266,61267,61268,61269,61270,61271,61272,61273,\r
+61274,61275,61276,61277,61278,61279,61280,61281,61282,61283,61284,61285,61286,\r
+61287,61288,61289,61290,61291,61292,61293,61294,61295,61296,61297,14183,61298,\r
+61299,27689,27690,27691,61300,27692,61301,61302,17966,27693,27694,61303,61304,\r
+61305,14153,18995,61306,61307,61308,61309,61310,61312,61313,25144,30543,61314,\r
+61315,61316,61317,61318,61319,61320,61321,61322,61323,61324,61325,61326,61327,\r
+61328,61329,61330,61331,61332,61333,61334,61335,61336,61337,61338,61339,61340,\r
+61341,61342,61343,61344,61504,61505,61506,61507,61508,30544,61509,61510,12877,\r
+61511,61512,61513,61514,61515,61516,61517,61518,61519,61520,61521,61522,61523,\r
+61524,61525,61526,61527,61528,61529,61530,61531,61532,61533,61534,61535,61536,\r
+61537,61538,61539,30545,61540,61541,61542,61543,61544,61545,61546,61547,61548,\r
+61549,61550,61551,61552,61553,61554,61555,61556,61557,61558,61559,61560,61561,\r
+61562,61563,61564,61565,61566,61568,61569,61570,61571,61572,61573,61574,61575,\r
+61576,61577,30547,30546,61578,61579,61580,61581,61582,61583,61584,61585,61586,\r
+61587,61588,61589,61590,25147,61591,15394,61592,25148,25149,25150,25151,25152,\r
+25153,14137,21115,15652,19022,12581,19271,61593,25154,13948,18500,25155,61594,\r
+61595,15688,61596,12669,25156,61597,13942,25157,17497,61598,61599,25158,20314,\r
+14685,25159,16417,61600,25160,12918,61760,25161,61761,16755,25162,25163,17016,\r
+25164,25165,25166,19031,22584,22885,20323,61762,61763,61764,61765,61766,61767,\r
+61768,61769,61770,61771,61772,28709,61773,61774,23600,61775,61776,61777,61778,\r
+61779,61780,61781,61782,61783,61784,61785,61786,61787,61788,61789,61790,61791,\r
+61792,61793,61794,61795,61796,61797,61798,61799,61800,61801,61802,61803,61804,\r
+61805,61806,61807,61808,61809,61810,61811,61812,61813,61814,61815,61816,61817,\r
+61818,61819,61820,61821,61822,61824,61825,61826,61827,61828,61829,61830,61831,\r
+61832,61833,61834,61835,61836,61837,61838,61839,61840,61841,61842,61843,61844,\r
+61845,61846,61847,61848,61849,61850,61851,61852,61853,61854,61855,61856,62016,\r
+62017,62018,62019,62020,62021,62022,62023,62024,62025,62026,62027,62028,62029,\r
+62030,62031,62032,62033,62034,62035,62036,62037,62038,62039,62040,62041,62042,\r
+62043,62044,62045,62046,62047,62048,62049,62050,62051,62052,62053,62054,62055,\r
+62056,62057,62058,62059,62060,62061,62062,62063,62064,62065,62066,62067,62068,\r
+62069,62070,62071,62072,62073,62074,62075,62076,62077,62078,62080,62081,62082,\r
+62083,62084,62085,62086,62087,62088,62089,62090,62091,62092,62093,62094,62095,\r
+62096,62097,62098,62099,62100,62101,62102,62103,62104,62105,62106,62107,62108,\r
+62109,62110,62111,62112,62272,62273,62274,62275,62276,62277,62278,62279,62280,\r
+62281,62282,62283,62284,62285,62286,62287,62288,62289,17005,21542,19796,20785,\r
+13147,18301,62290,12853,16959,26208,19003,26209,26210,15956,26211,22308,19797,\r
+26213,15453,26212,26214,26215,17006,62291,15678,26216,16998,14887,26217,62292,\r
+26218,13138,20841,62293,62294,16165,26219,18031,26220,26221,62295,62296,26222,\r
+17965,26223,62297,18727,26224,26225,26226,25913,26227,26228,16994,26229,26230,\r
+22120,26231,62298,26232,14663,62299,62300,62301,62302,62303,62304,62305,30523,\r
+30522,62306,62307,62308,62309,30526,30524,14881,62310,30527,62311,30528,62312,\r
+62313,62314,30530,30529,30532,62315,62316,30531,62317,62318,62319,62320,62321,\r
+30533,30534,62322,62323,62324,62325,30535,62326,19304,62327,62328,62329,62330,\r
+14431,62331,62332,62333,62334,62336,62337,30548,62338,30549,62339,62340,62341,\r
+62342,30550,62343,62344,62345,62346,30552,62347,30554,62348,30551,62349,62350,\r
+62351,62352,62353,62354,62355,62356,62357,30555,62358,30553,62359,62360,62361,\r
+62362,62363,62364,62365,22359,62366,62367,62368,62528,30556,62529,62530,62531,\r
+62532,62533,62534,30557,62535,62536,62537,30558,62538,62539,62540,62541,62542,\r
+62543,62544,62545,62546,62547,62548,30559,62549,62550,62551,30560,62552,62553,\r
+62554,62555,62556,62557,62558,62559,62560,62561,62562,23371,62563,62564,22570,\r
+62565,62566,62567,62568,62569,62570,62571,62572,25975,14701,62573,62574,62575,\r
+62576,16253,15210,30537,17991,30536,62577,30538,30540,30539,62578,62579,62580,\r
+30541,62581,20026,62582,30542,62583,62584,17447,62585,62586,62587,62588,62589,\r
+62590,62592,62593,62594,62595,62596,62597,62598,62599,62600,62601,62602,62603,\r
+62604,62605,62606,62607,62608,62609,62610,62611,62612,62613,62614,62615,62616,\r
+62617,62618,62619,62620,62621,62622,62623,62624,62784,62785,62786,62787,62788,\r
+62789,62790,62791,62792,62793,62794,62795,62796,62797,62798,62799,62800,62801,\r
+62802,62803,62804,62805,62806,62807,62808,62809,62810,62811,62812,62813,62814,\r
+62815,62816,62817,62818,62819,62820,62821,62822,62823,62824,62825,62826,62827,\r
+62828,62829,62830,62831,62832,62833,62834,62835,62836,62837,62838,62839,62840,\r
+62841,62842,62843,62844,62845,62846,62848,62849,62850,62851,62852,62853,62854,\r
+62855,62856,62857,62858,62859,62860,62861,62862,62863,62864,62865,62866,62867,\r
+62868,62869,62870,62871,62872,62873,62874,62875,62876,62877,62878,62879,62880,\r
+63040,63041,63042,63043,63044,63045,63046,63047,63048,63049,63050,63051,63052,\r
+63053,63054,63055,63056,63057,63058,63059,63060,63061,63062,63063,63064,63065,\r
+63066,63067,63068,63069,63070,63071,63072,63073,63074,63075,63076,63077,63078,\r
+63079,63080,63081,63082,63083,63084,63085,63086,63087,63088,63089,63090,63091,\r
+63092,63093,63094,63095,63096,63097,63098,63099,63100,63101,63102,63104,63105,\r
+63106,63107,63108,63109,63110,63111,63112,63113,63114,63115,63116,63117,63118,\r
+63119,63120,63121,63122,63123,63124,63125,63126,63127,63128,63129,63130,63131,\r
+63132,63133,63134,63135,63136,63296,63297,63298,63299,63300,63301,63302,63303,\r
+63304,63305,63306,63307,63308,63309,63310,63311,63312,63313,63314,63315,63316,\r
+63317,63318,63319,63320,63321,63322,63323,63324,63325,63326,63327,63328,63329,\r
+63330,63331,63332,63333,63334,63335,63336,63337,63338,63339,63340,63341,63342,\r
+63343,63344,63345,63346,63347,63348,63349,63350,63351,63352,63353,63354,63355,\r
+63356,63357,63358,63360,21347,63361,63362,30287,63363,16947,30288,63364,63365,\r
+30289,30290,30291,30292,63366,63367,30294,63368,12587,30295,63369,30296,30297,\r
+30298,63370,30299,30300,63371,63372,63373,63374,30301,30302,20298,63375,30303,\r
+30304,30305,30306,30307,30308,16496,30309,30310,30311,30312,30313,63376,30314,\r
+63377,30315,30316,63378,30317,30318,30319,30320,30321,30322,30323,30324,15912,\r
+63379,30325,30326,30327,30328,63380,63381,63382,63383,63384,18554,30329,30330,\r
+30331,30332,63385,63386,30333,30334,30497,30498,30499,30500,30501,63387,63388,\r
+30502,30503,30504,12654,30505,30506,30507,63389,63390,30508,30509,16731,30510,\r
+63391,63392,30511,63552,63553,63554,63555,63556,63557,63558,63559,63560,63561,\r
+63562,63563,63564,63565,63566,63567,63568,63569,63570,63571,63572,63573,63574,\r
+63575,63576,63577,63578,63579,63580,63581,63582,63583,63584,63585,63586,63587,\r
+63588,63589,63590,63591,63592,63593,63594,63595,63596,63597,63598,63599,63600,\r
+63601,63602,63603,63604,63605,63606,63607,63608,63609,63610,63611,63612,63613,\r
+63614,63616,63617,63618,63619,63620,63621,63622,63623,63624,63625,63626,63627,\r
+63628,63629,63630,63631,63632,63633,63634,63635,63636,63637,63638,63639,63640,\r
+63641,63642,63643,63644,63645,63646,63647,63648,63808,63809,63810,63811,63812,\r
+63813,63814,63815,63816,63817,63818,63819,63820,63821,63822,63823,63824,63825,\r
+63826,63827,63828,63829,63830,63831,63832,63833,63834,63835,63836,63837,63838,\r
+63839,63840,63841,63842,63843,63844,63845,63846,63847,63848,63849,63850,63851,\r
+63852,63853,63854,63855,63856,63857,63858,63859,63860,63861,63862,63863,63864,\r
+63865,63866,63867,63868,63869,63870,63872,63873,63874,63875,63876,63877,63878,\r
+63879,63880,63881,63882,63883,63884,63885,63886,63887,63888,63889,63890,63891,\r
+63892,63893,63894,63895,63896,63897,63898,63899,63900,63901,63902,63903,63904,\r
+64064,64065,64066,64067,64068,64069,64070,64071,64072,64073,64074,64075,64076,\r
+64077,64078,64079,64080,64081,64082,64083,64084,64085,64086,64087,64088,64089,\r
+64090,64091,64092,64093,64094,64095,64096,64097,64098,64099,64100,64101,64102,\r
+64103,64104,64105,64106,64107,64108,64109,64110,64111,64112,64113,64114,64115,\r
+64116,64117,64118,64119,64120,64121,64122,64123,64124,64125,64126,64128,64129,\r
+64130,64131,64132,64133,64134,64135,64136,64137,64138,64139,64140,64141,64142,\r
+64143,64144,64145,64146,64147,64148,64149,64150,64151,64152,64153,64154,64155,\r
+64156,64157,64158,64159,64160,64320,64321,64322,64323,64324,64325,64326,64327,\r
+64328,64329,64330,64331,64332,64333,64334,64335,64336,64337,64338,64339,64340,\r
+64341,64342,64343,64344,64345,64346,64347,17521,28719,15398,28720,17273,64348,\r
+17720,20795,64349,28721,28722,28723,28724,28725,20796,64350,20844,64351,28727,\r
+28726,21543,64352,19794,28728,28730,28729,28731,28732,64353,64354,14443,28733,\r
+14952,64355,28734,28735,15977,28736,13932,28737,28738,28739,28740,18485,28741,\r
+28742,64356,28743,17780,64357,28744,64358,64359,64360,28745,64361,28746,30525,\r
+64362,28747,28748,28749,64363,28750,64364,64365,64366,64367,28751,14935,64368,\r
+28752,28753,28754,28755,28756,28757,28758,28760,64369,64370,21285,28759,64371,\r
+28761,64372,64373,64374,64375,64376,64377,64378,64379,64380,64381,30010,16953,\r
+64382,64384,30564,64385,64386,64387,64388,30565,30566,64389,64390,30567,64391,\r
+64392,64393,64394,64395,64396,30568,16948,64397,64398,64399,64400,64401,64402,\r
+64403,64404,64405,30570,64406,30571,64407,64408,64409,64410,64411,64412,17011,\r
+64413,64414,64415,64416,64576,64577,64578,64579,64580,64581,64582,64583,64584,\r
+29808,64585,64586,64587,29807,64588,64589,17001,64590,30561,30562,64591,64592,\r
+64593,64594,64595,15174,64596,64597,64598,64599,22884,64600,64601,64602,19058,\r
+16488,28708,64603,14938,64604,64605,18221,64606,64607,64608,17452,64609,64610,\r
+30572,30573,30574,64611,30576,30575,64612,30577,64613,64614,30580,64615,30579,\r
+64616,30578,30581,64617,64618,64619,64620,30582,64621,64622,64623,64624,64625,\r
+64626,64627,64628,64629,28009,64630,28010,28011,64631,30268,64632,64633,64634,\r
+64635,64636,64637,64638,64640,64641,64642,64643,64644,30269,64645,30270,13862,\r
+64646,22590,64647,64648,14660,64649,64650,64651,22587,64652,23601,64653,64654,\r
+64655,64656,64657,64658,19059,64659,30583,64660,64661,64662,64663,64664,64665,\r
+64666,64667,64668,30584,64669,64670,30585,64671,64672,64832,64833,64834,64835,\r
+64836,30587,64837,30586,64838,12615,64839,30588,30589,64840,64841,64842,64843,\r
+64844,30590,64845,64846,64847,64848,64849,64850,64851,64852,64853,64854,64855,\r
+18027,27700,64856,64857,64858,64859,64860,64861,64862,64863,64864,64865,64866,\r
+64867,64868,64869,64870,64871,64872,64873,64874,64875,64876,64877,64878,64879,\r
+64880,64881,64882,64883,64884,64885,64886,64887,64888,64889,64890,64891,64892,\r
+64893,64894,64896,64897,64898,64899,64900,64901,13149,30259,64902,64903,30260,\r
+16740,30261,30262,30263,30264,30265,30266,18467,30267,64904,64905,64906,64907,\r
+64908,64909,64910,64911,64912,64913,64914,64915,16762,14632,28008,64916,64917,\r
+64918,14698,22879,64919,64920,64921,64922,64923,64924,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64925,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64927,N,N,N,N,N,N,N,N,N,64928,\r
+65088,65089,65090,65091,N,65092,N,65093,65094,N,N,N,65095,N,N,N,N,N,N,65096,\r
+65097,65098,N,65099,65100,N,N,65101,65102,65103,43349,42738,N,42740,42741,\r
+42720,42721,42736,42737,42722,42723,42734,42735,42726,42727,42724,42725,42728,\r
+42729,42730,42731,N,N,N,N,43368,43369,43370,43371,43372,43373,43374,43375,\r
+43376,43377,N,43378,43379,43380,43381,N,43382,43383,43384,43385,43386,43387,\r
+43388,43389,43390,43392,43393,43394,43395,43396,N,43397,43398,43399,43400,\r
+8993,8994,8995,8551,8997,8998,8999,9000,9001,9002,9003,9004,9005,9006,9007,\r
+9008,9009,9010,9011,9012,9013,9014,9015,9016,9017,9018,9019,9020,9021,9022,\r
+9023,9024,9025,9026,9027,9028,9029,9030,9031,9032,9033,9034,9035,9036,9037,\r
+9038,9039,9040,9041,9042,9043,9044,9045,9046,9047,9048,9049,9050,9051,9052,\r
+9053,9054,9055,9056,9057,9058,9059,9060,9061,9062,9063,9064,9065,9066,9067,\r
+9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,9078,9079,9080,9081,9082,\r
+9083,9084,9085,8491,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8553,8554,43350,9086,43351,8996,\r
+};\r
+\r
+static const struct unim_index gbcommon_encmap[256] = {\r
+{__gbcommon_encmap+0,164,252},{__gbcommon_encmap+89,1,220},{__gbcommon_encmap+\r
+309,81,217},{__gbcommon_encmap+446,145,201},{__gbcommon_encmap+503,1,81},{0,0,\r
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gbcommon_encmap+584,\r
+16,59},{__gbcommon_encmap+628,3,153},{__gbcommon_encmap+779,8,191},{\r
+__gbcommon_encmap+963,18,18},{__gbcommon_encmap+964,96,155},{__gbcommon_encmap\r
++1024,0,229},{__gbcommon_encmap+1254,5,66},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gbcommon_encmap+1316,0,254},{\r
+__gbcommon_encmap+1571,5,41},{__gbcommon_encmap+1608,32,163},{\r
+__gbcommon_encmap+1740,142,213},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{__gbcommon_encmap+1812,0,255},{__gbcommon_encmap+2068,0,255},{\r
+__gbcommon_encmap+2324,0,255},{__gbcommon_encmap+2580,0,255},{\r
+__gbcommon_encmap+2836,0,255},{__gbcommon_encmap+3092,0,255},{\r
+__gbcommon_encmap+3348,0,255},{__gbcommon_encmap+3604,0,255},{\r
+__gbcommon_encmap+3860,0,255},{__gbcommon_encmap+4116,0,255},{\r
+__gbcommon_encmap+4372,0,255},{__gbcommon_encmap+4628,0,255},{\r
+__gbcommon_encmap+4884,0,255},{__gbcommon_encmap+5140,0,255},{\r
+__gbcommon_encmap+5396,0,255},{__gbcommon_encmap+5652,0,255},{\r
+__gbcommon_encmap+5908,0,255},{__gbcommon_encmap+6164,0,255},{\r
+__gbcommon_encmap+6420,0,255},{__gbcommon_encmap+6676,0,255},{\r
+__gbcommon_encmap+6932,0,255},{__gbcommon_encmap+7188,0,255},{\r
+__gbcommon_encmap+7444,0,255},{__gbcommon_encmap+7700,0,255},{\r
+__gbcommon_encmap+7956,0,255},{__gbcommon_encmap+8212,0,255},{\r
+__gbcommon_encmap+8468,0,255},{__gbcommon_encmap+8724,0,255},{\r
+__gbcommon_encmap+8980,0,255},{__gbcommon_encmap+9236,0,255},{\r
+__gbcommon_encmap+9492,0,255},{__gbcommon_encmap+9748,0,255},{\r
+__gbcommon_encmap+10004,0,255},{__gbcommon_encmap+10260,0,255},{\r
+__gbcommon_encmap+10516,0,255},{__gbcommon_encmap+10772,0,255},{\r
+__gbcommon_encmap+11028,0,255},{__gbcommon_encmap+11284,0,255},{\r
+__gbcommon_encmap+11540,0,255},{__gbcommon_encmap+11796,0,255},{\r
+__gbcommon_encmap+12052,0,255},{__gbcommon_encmap+12308,0,255},{\r
+__gbcommon_encmap+12564,0,255},{__gbcommon_encmap+12820,0,255},{\r
+__gbcommon_encmap+13076,0,255},{__gbcommon_encmap+13332,0,255},{\r
+__gbcommon_encmap+13588,0,255},{__gbcommon_encmap+13844,0,255},{\r
+__gbcommon_encmap+14100,0,255},{__gbcommon_encmap+14356,0,255},{\r
+__gbcommon_encmap+14612,0,255},{__gbcommon_encmap+14868,0,255},{\r
+__gbcommon_encmap+15124,0,255},{__gbcommon_encmap+15380,0,255},{\r
+__gbcommon_encmap+15636,0,255},{__gbcommon_encmap+15892,0,255},{\r
+__gbcommon_encmap+16148,0,255},{__gbcommon_encmap+16404,0,255},{\r
+__gbcommon_encmap+16660,0,255},{__gbcommon_encmap+16916,0,255},{\r
+__gbcommon_encmap+17172,0,255},{__gbcommon_encmap+17428,0,255},{\r
+__gbcommon_encmap+17684,0,255},{__gbcommon_encmap+17940,0,255},{\r
+__gbcommon_encmap+18196,0,255},{__gbcommon_encmap+18452,0,255},{\r
+__gbcommon_encmap+18708,0,255},{__gbcommon_encmap+18964,0,255},{\r
+__gbcommon_encmap+19220,0,255},{__gbcommon_encmap+19476,0,255},{\r
+__gbcommon_encmap+19732,0,255},{__gbcommon_encmap+19988,0,255},{\r
+__gbcommon_encmap+20244,0,255},{__gbcommon_encmap+20500,0,255},{\r
+__gbcommon_encmap+20756,0,255},{__gbcommon_encmap+21012,0,255},{\r
+__gbcommon_encmap+21268,0,255},{__gbcommon_encmap+21524,0,255},{\r
+__gbcommon_encmap+21780,0,255},{__gbcommon_encmap+22036,0,255},{\r
+__gbcommon_encmap+22292,0,255},{__gbcommon_encmap+22548,0,165},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{__gbcommon_encmap+22714,44,241},{__gbcommon_encmap+22912,12,41},{0,0,0},{0,\r
+0,0},{0,0,0},{__gbcommon_encmap+22942,48,107},{__gbcommon_encmap+23002,1,229},\r
+};\r
+\r
+static const ucs2_t __gb18030ext_decmap[2729] = {\r
+58566,58567,58568,58569,58570,58571,58572,58573,58574,58575,58576,58577,58578,\r
+58579,58580,58581,58582,58583,58584,58585,58586,58587,58588,58589,58590,58591,\r
+58592,58593,58594,58595,58596,58597,58598,58599,58600,58601,58602,58603,58604,\r
+58605,58606,58607,58608,58609,58610,58611,58612,58613,58614,58615,58616,58617,\r
+58618,58619,58620,58621,58622,58623,58624,58625,58626,58627,58628,U,58629,\r
+58630,58631,58632,58633,58634,58635,58636,58637,58638,58639,58640,58641,58642,\r
+58643,58644,58645,58646,58647,58648,58649,58650,58651,58652,58653,58654,58655,\r
+58656,58657,58658,58659,58660,58661,58662,58663,58664,58665,58666,58667,58668,\r
+58669,58670,58671,58672,58673,58674,58675,58676,58677,58678,58679,58680,58681,\r
+58682,58683,58684,58685,58686,58687,58688,58689,58690,58691,58692,58693,58694,\r
+58695,58696,58697,58698,58699,58700,58701,58702,58703,58704,58705,58706,58707,\r
+58708,58709,58710,58711,58712,58713,58714,58715,58716,58717,58718,58719,58720,\r
+58721,58722,58723,58724,U,58725,58726,58727,58728,58729,58730,58731,58732,\r
+58733,58734,58735,58736,58737,58738,58739,58740,58741,58742,58743,58744,58745,\r
+58746,58747,58748,58749,58750,58751,58752,58753,58754,58755,58756,58757,U,U,U,\r
+U,U,U,U,U,U,U,59238,59239,59240,59241,59242,59243,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,8364,\r
+59245,U,U,U,U,U,U,U,U,U,U,59246,59247,U,U,U,U,U,U,U,U,U,U,U,U,59248,59249,\r
+58758,58759,58760,58761,58762,58763,58764,58765,58766,58767,58768,58769,58770,\r
+58771,58772,58773,58774,58775,58776,58777,58778,58779,58780,58781,58782,58783,\r
+58784,58785,58786,58787,58788,58789,58790,58791,58792,58793,58794,58795,58796,\r
+58797,58798,58799,58800,58801,58802,58803,58804,58805,58806,58807,58808,58809,\r
+58810,58811,58812,58813,58814,58815,58816,58817,58818,58819,58820,U,58821,\r
+58822,58823,58824,58825,58826,58827,58828,58829,58830,58831,58832,58833,58834,\r
+58835,58836,58837,58838,58839,58840,58841,58842,58843,58844,58845,58846,58847,\r
+58848,58849,58850,58851,58852,58853,58854,58855,58856,58857,58858,58859,58860,\r
+58861,58862,58863,58864,58865,58866,58867,58868,58869,58870,58871,58872,58873,\r
+58874,58875,58876,58877,58878,58879,58880,58881,58882,58883,58884,58885,58886,\r
+58887,58888,58889,58890,58891,58892,58893,58894,58895,58896,58897,58898,58899,\r
+58900,58901,58902,58903,58904,58905,58906,58907,58908,58909,58910,58911,58912,\r
+58913,58914,58915,58916,U,58917,58918,58919,58920,58921,58922,58923,58924,\r
+58925,58926,58927,58928,58929,58930,58931,58932,58933,58934,58935,58936,58937,\r
+58938,58939,58940,58941,58942,58943,58944,58945,58946,58947,58948,58949,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,59250,59251,59252,59253,59254,59255,59256,59257,59258,59259,59260,58950,\r
+58951,58952,58953,58954,58955,58956,58957,58958,58959,58960,58961,58962,58963,\r
+58964,58965,58966,58967,58968,58969,58970,58971,58972,58973,58974,58975,58976,\r
+58977,58978,58979,58980,58981,58982,58983,58984,58985,58986,58987,58988,58989,\r
+58990,58991,58992,58993,58994,58995,58996,58997,58998,58999,59000,59001,59002,\r
+59003,59004,59005,59006,59007,59008,59009,59010,59011,59012,U,59013,59014,\r
+59015,59016,59017,59018,59019,59020,59021,59022,59023,59024,59025,59026,59027,\r
+59028,59029,59030,59031,59032,59033,59034,59035,59036,59037,59038,59039,59040,\r
+59041,59042,59043,59044,59045,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59261,59262,59263,59264,59265,\r
+59266,59267,59268,59046,59047,59048,59049,59050,59051,59052,59053,59054,59055,\r
+59056,59057,59058,59059,59060,59061,59062,59063,59064,59065,59066,59067,59068,\r
+59069,59070,59071,59072,59073,59074,59075,59076,59077,59078,59079,59080,59081,\r
+59082,59083,59084,59085,59086,59087,59088,59089,59090,59091,59092,59093,59094,\r
+59095,59096,59097,59098,59099,59100,59101,59102,59103,59104,59105,59106,59107,\r
+59108,U,59109,59110,59111,59112,59113,59114,59115,59116,59117,59118,59119,\r
+59120,59121,59122,59123,59124,59125,59126,59127,59128,59129,59130,59131,59132,\r
+59133,59134,59135,59136,59137,59138,59139,59140,59141,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,59269,59270,59271,59272,59273,59274,59275,59276,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59277,59278,59279,59280,59281,59282,\r
+59283,U,U,U,U,U,U,U,U,U,U,U,U,59284,59285,U,U,U,U,U,59286,U,U,59287,59288,\r
+59289,59290,59291,59292,59293,59294,59295,59142,59143,59144,59145,59146,59147,\r
+59148,59149,59150,59151,59152,59153,59154,59155,59156,59157,59158,59159,59160,\r
+59161,59162,59163,59164,59165,59166,59167,59168,59169,59170,59171,59172,59173,\r
+59174,59175,59176,59177,59178,59179,59180,59181,59182,59183,59184,59185,59186,\r
+59187,59188,59189,59190,59191,59192,59193,59194,59195,59196,59197,59198,59199,\r
+59200,59201,59202,59203,59204,U,59205,59206,59207,59208,59209,59210,59211,\r
+59212,59213,59214,59215,59216,59217,59218,59219,59220,59221,59222,59223,59224,\r
+59225,59226,59227,59228,59229,59230,59231,59232,59233,59234,59235,59236,59237,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59296,59297,\r
+59298,59299,59300,59301,59302,59303,59304,59305,59306,59307,59308,59309,59310,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59311,59312,\r
+59313,59314,59315,59316,59317,59318,59319,59320,59321,59322,59323,59324,59325,\r
+59326,59327,59328,59329,59330,59331,59332,59333,59334,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59335,U,U,505,U,59337,59338,59339,59340,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,59341,59342,\r
+59343,59344,59345,59346,59347,59348,59349,59350,59351,59352,59353,59354,59355,\r
+59356,59357,59358,59359,59360,59361,59362,U,U,59363,U,59364,59365,59366,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+12350,12272,12273,12274,12275,12276,12277,12278,12279,12280,12281,12282,12283,\r
+U,59380,59381,59382,59383,59384,59385,59386,59387,59388,59389,59390,59391,\r
+59392,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,59393,59394,59395,59396,59397,59398,59399,59400,59401,59402,59403,59404,\r
+59405,59406,59407,57344,57345,57346,57347,57348,57349,57350,57351,57352,57353,\r
+57354,57355,57356,57357,57358,57359,57360,57361,57362,57363,57364,57365,57366,\r
+57367,57368,57369,57370,57371,57372,57373,57374,57375,57376,57377,57378,57379,\r
+57380,57381,57382,57383,57384,57385,57386,57387,57388,57389,57390,57391,57392,\r
+57393,57394,57395,57396,57397,57398,57399,57400,57401,57402,57403,57404,57405,\r
+57406,57407,57408,57409,57410,57411,57412,57413,57414,57415,57416,57417,57418,\r
+57419,57420,57421,57422,57423,57424,57425,57426,57427,57428,57429,57430,57431,\r
+57432,57433,57434,57435,57436,57437,57438,57439,57440,57441,57442,57443,57444,\r
+57445,57446,57447,57448,57449,57450,57451,57452,57453,57454,57455,57456,57457,\r
+57458,57459,57460,57461,57462,57463,57464,57465,57466,57467,57468,57469,57470,\r
+57471,57472,57473,57474,57475,57476,57477,57478,57479,57480,57481,57482,57483,\r
+57484,57485,57486,57487,57488,57489,57490,57491,57492,57493,57494,57495,57496,\r
+57497,57498,57499,57500,57501,57502,57503,57504,57505,57506,57507,57508,57509,\r
+57510,57511,57512,57513,57514,57515,57516,57517,57518,57519,57520,57521,57522,\r
+57523,57524,57525,57526,57527,57528,57529,57530,57531,57532,57533,57534,57535,\r
+57536,57537,57538,57539,57540,57541,57542,57543,57544,57545,57546,57547,57548,\r
+57549,57550,57551,57552,57553,57554,57555,57556,57557,57558,57559,57560,57561,\r
+57562,57563,57564,57565,57566,57567,57568,57569,57570,57571,57572,57573,57574,\r
+57575,57576,57577,57578,57579,57580,57581,57582,57583,57584,57585,57586,57587,\r
+57588,57589,57590,57591,57592,57593,57594,57595,57596,57597,57598,57599,57600,\r
+57601,57602,57603,57604,57605,57606,57607,57608,57609,57610,57611,57612,57613,\r
+57614,57615,57616,57617,57618,57619,57620,57621,57622,57623,57624,57625,57626,\r
+57627,57628,57629,57630,57631,57632,57633,57634,57635,57636,57637,57638,57639,\r
+57640,57641,57642,57643,57644,57645,57646,57647,57648,57649,57650,57651,57652,\r
+57653,57654,57655,57656,57657,57658,57659,57660,57661,57662,57663,57664,57665,\r
+57666,57667,57668,57669,57670,57671,57672,57673,57674,57675,57676,57677,57678,\r
+57679,57680,57681,57682,57683,57684,57685,57686,57687,57688,57689,57690,57691,\r
+57692,57693,57694,57695,57696,57697,57698,57699,57700,57701,57702,57703,57704,\r
+57705,57706,57707,57708,57709,57710,57711,57712,57713,57714,57715,57716,57717,\r
+57718,57719,57720,57721,57722,57723,57724,57725,57726,57727,57728,57729,57730,\r
+57731,57732,57733,57734,57735,57736,57737,57738,57739,57740,57741,57742,57743,\r
+57744,57745,57746,57747,57748,57749,57750,57751,57752,57753,57754,57755,57756,\r
+57757,57758,57759,57760,57761,57762,57763,57764,57765,57766,57767,57768,57769,\r
+57770,57771,57772,57773,57774,57775,57776,57777,57778,57779,57780,57781,57782,\r
+57783,57784,57785,57786,57787,57788,57789,57790,57791,57792,57793,57794,57795,\r
+57796,57797,57798,57799,57800,57801,57802,57803,57804,57805,57806,57807,57808,\r
+57809,57810,57811,57812,57813,57814,57815,57816,57817,57818,57819,57820,57821,\r
+57822,57823,57824,57825,57826,57827,57828,57829,57830,57831,57832,57833,57834,\r
+57835,57836,57837,57838,57839,57840,57841,57842,57843,57844,57845,57846,57847,\r
+57848,57849,57850,57851,57852,57853,57854,57855,57856,57857,57858,57859,57860,\r
+57861,57862,57863,57864,57865,57866,57867,57868,57869,57870,57871,57872,57873,\r
+57874,57875,57876,57877,57878,57879,57880,57881,57882,57883,57884,57885,57886,\r
+57887,57888,57889,57890,57891,57892,57893,57894,57895,57896,57897,57898,57899,\r
+57900,57901,57902,57903,57904,57905,57906,57907,59408,59409,59410,59411,59412,\r
+57908,57909,57910,57911,57912,57913,57914,57915,57916,57917,57918,57919,57920,\r
+57921,57922,57923,57924,57925,57926,57927,57928,57929,57930,57931,57932,57933,\r
+57934,57935,57936,57937,57938,57939,57940,57941,57942,57943,57944,57945,57946,\r
+57947,57948,57949,57950,57951,57952,57953,57954,57955,57956,57957,57958,57959,\r
+57960,57961,57962,57963,57964,57965,57966,57967,57968,57969,57970,57971,57972,\r
+57973,57974,57975,57976,57977,57978,57979,57980,57981,57982,57983,57984,57985,\r
+57986,57987,57988,57989,57990,57991,57992,57993,57994,57995,57996,57997,57998,\r
+57999,58000,58001,58002,58003,58004,58005,58006,58007,58008,58009,58010,58011,\r
+58012,58013,58014,58015,58016,58017,58018,58019,58020,58021,58022,58023,58024,\r
+58025,58026,58027,58028,58029,58030,58031,58032,58033,58034,58035,58036,58037,\r
+58038,58039,58040,58041,58042,58043,58044,58045,58046,58047,58048,58049,58050,\r
+58051,58052,58053,58054,58055,58056,58057,58058,58059,58060,58061,58062,58063,\r
+58064,58065,58066,58067,58068,58069,58070,58071,58072,58073,58074,58075,58076,\r
+58077,58078,58079,58080,58081,58082,58083,58084,58085,58086,58087,58088,58089,\r
+58090,58091,58092,58093,58094,58095,58096,58097,58098,58099,58100,58101,58102,\r
+58103,58104,58105,58106,58107,58108,58109,58110,58111,58112,58113,58114,58115,\r
+58116,58117,58118,58119,58120,58121,58122,58123,58124,58125,58126,58127,58128,\r
+58129,58130,58131,58132,58133,58134,58135,58136,58137,58138,58139,58140,58141,\r
+58142,58143,58144,58145,58146,58147,58148,58149,58150,58151,58152,58153,58154,\r
+58155,58156,58157,58158,58159,58160,58161,58162,58163,58164,58165,58166,58167,\r
+58168,58169,58170,58171,58172,58173,58174,58175,58176,58177,58178,58179,58180,\r
+58181,58182,58183,58184,58185,58186,58187,58188,58189,58190,58191,58192,58193,\r
+58194,58195,58196,58197,58198,58199,58200,58201,58202,58203,58204,58205,58206,\r
+58207,58208,58209,58210,58211,58212,58213,58214,58215,58216,58217,58218,58219,\r
+58220,58221,58222,58223,58224,58225,58226,58227,58228,58229,58230,58231,58232,\r
+58233,58234,58235,58236,58237,58238,58239,58240,58241,58242,58243,58244,58245,\r
+58246,58247,58248,58249,58250,58251,58252,58253,58254,58255,58256,58257,58258,\r
+58259,58260,58261,58262,58263,58264,58265,58266,58267,58268,58269,58270,58271,\r
+58272,58273,58274,58275,58276,58277,58278,58279,58280,58281,58282,58283,58284,\r
+58285,58286,58287,58288,58289,58290,58291,58292,58293,58294,58295,58296,58297,\r
+58298,58299,58300,58301,58302,58303,58304,58305,58306,58307,58308,58309,58310,\r
+58311,58312,58313,58314,58315,58316,58317,58318,58319,58320,58321,58322,58323,\r
+58324,58325,58326,58327,58328,58329,58330,58331,58332,58333,58334,58335,58336,\r
+58337,58338,58339,58340,58341,58342,58343,58344,58345,58346,58347,58348,58349,\r
+58350,58351,58352,58353,58354,58355,58356,58357,58358,58359,58360,58361,58362,\r
+58363,58364,58365,58366,58367,58368,58369,58370,58371,58372,58373,58374,58375,\r
+58376,58377,58378,58379,58380,58381,58382,58383,58384,58385,58386,58387,58388,\r
+58389,58390,58391,58392,58393,58394,58395,58396,58397,58398,58399,58400,58401,\r
+58402,58403,58404,58405,58406,58407,58408,58409,58410,58411,58412,58413,58414,\r
+58415,58416,58417,58418,58419,58420,58421,58422,58423,58424,58425,58426,58427,\r
+58428,58429,58430,58431,58432,58433,58434,58435,58436,58437,58438,58439,58440,\r
+58441,58442,58443,58444,58445,58446,58447,58448,58449,58450,58451,58452,58453,\r
+58454,58455,58456,58457,58458,58459,58460,58461,58462,58463,58464,58465,58466,\r
+58467,58468,58469,58470,58471,11905,59414,59415,59416,11908,13427,13383,11912,\r
+11915,59422,13726,13850,13838,11916,11927,14702,14616,59430,14799,14815,14963,\r
+14800,59435,59436,15182,15470,15584,11943,59441,59442,11946,16470,16735,11950,\r
+17207,11955,11958,11959,59451,17329,17324,11963,17373,17622,18017,17996,59459,\r
+U,18211,18217,18300,18317,11978,18759,18810,18813,18818,18819,18821,18822,\r
+18847,18843,18871,18870,59476,59477,19619,19615,19616,19617,19575,19618,19731,\r
+19732,19733,19734,19735,19736,19737,19886,59492,58472,58473,58474,58475,58476,\r
+58477,58478,58479,58480,58481,58482,58483,58484,58485,58486,58487,58488,58489,\r
+58490,58491,58492,58493,58494,58495,58496,58497,58498,58499,58500,58501,58502,\r
+58503,58504,58505,58506,58507,58508,58509,58510,58511,58512,58513,58514,58515,\r
+58516,58517,58518,58519,58520,58521,58522,58523,58524,58525,58526,58527,58528,\r
+58529,58530,58531,58532,58533,58534,58535,58536,58537,58538,58539,58540,58541,\r
+58542,58543,58544,58545,58546,58547,58548,58549,58550,58551,58552,58553,58554,\r
+58555,58556,58557,58558,58559,58560,58561,58562,58563,58564,58565,\r
+};\r
+\r
+static const struct dbcs_index gb18030ext_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_decmap+0,64,\r
+160},{__gb18030ext_decmap+97,64,254},{__gb18030ext_decmap+288,64,160},{\r
+__gb18030ext_decmap+385,64,254},{__gb18030ext_decmap+576,64,254},{\r
+__gb18030ext_decmap+767,64,254},{__gb18030ext_decmap+958,64,254},{\r
+__gb18030ext_decmap+1149,150,254},{__gb18030ext_decmap+1254,88,254},{\r
+__gb18030ext_decmap+1421,161,254},{__gb18030ext_decmap+1515,161,254},{\r
+__gb18030ext_decmap+1609,161,254},{__gb18030ext_decmap+1703,161,254},{\r
+__gb18030ext_decmap+1797,161,254},{__gb18030ext_decmap+1891,161,254},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__gb18030ext_decmap+1985,250,254},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_decmap\r
++1990,161,254},{__gb18030ext_decmap+2084,161,254},{__gb18030ext_decmap+2178,\r
+161,254},{__gb18030ext_decmap+2272,161,254},{__gb18030ext_decmap+2366,161,254\r
+},{__gb18030ext_decmap+2460,161,254},{__gb18030ext_decmap+2554,80,254},{0,0,0\r
+},\r
+};\r
+\r
+static const DBCHAR __gb18030ext_encmap[3227] = {\r
+43199,41699,65104,N,N,65108,N,N,N,65111,N,N,65112,65117,N,N,N,N,N,N,N,N,N,N,\r
+65118,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65131,N,N,65134,N,N,N,65137,N,N,N,N,65139,\r
+N,N,65140,65141,N,N,N,65145,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65156,43402,43403,\r
+43404,43405,43406,43407,43408,43409,43410,43411,43412,43413,43401,65110,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,65109,65114,65116,N,N,N,N,N,N,N,N,N,N,N,65115,65120,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65119,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65122,65125,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65123,\r
+65124,65128,65129,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,65130,65135,65136,65138,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65144,N,N,N,N,65143,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65146,65147,65149,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65148,65152,N,N,N,N,N,65153,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+65154,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65155,65157,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65158,\r
+N,N,65159,N,N,N,N,65160,65161,N,65162,65163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,65165,N,N,N,65164,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65167,\r
+65166,65174,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,65171,65172,65173,65175,65170,65176,65177,65178,65179,65180,65181,\r
+65182,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65183,\r
+43681,43682,43683,43684,43685,43686,43687,43688,43689,43690,43691,43692,43693,\r
+43694,43695,43696,43697,43698,43699,43700,43701,43702,43703,43704,43705,43706,\r
+43707,43708,43709,43710,43711,43712,43713,43714,43715,43716,43717,43718,43719,\r
+43720,43721,43722,43723,43724,43725,43726,43727,43728,43729,43730,43731,43732,\r
+43733,43734,43735,43736,43737,43738,43739,43740,43741,43742,43743,43744,43745,\r
+43746,43747,43748,43749,43750,43751,43752,43753,43754,43755,43756,43757,43758,\r
+43759,43760,43761,43762,43763,43764,43765,43766,43767,43768,43769,43770,43771,\r
+43772,43773,43774,43937,43938,43939,43940,43941,43942,43943,43944,43945,43946,\r
+43947,43948,43949,43950,43951,43952,43953,43954,43955,43956,43957,43958,43959,\r
+43960,43961,43962,43963,43964,43965,43966,43967,43968,43969,43970,43971,43972,\r
+43973,43974,43975,43976,43977,43978,43979,43980,43981,43982,43983,43984,43985,\r
+43986,43987,43988,43989,43990,43991,43992,43993,43994,43995,43996,43997,43998,\r
+43999,44000,44001,44002,44003,44004,44005,44006,44007,44008,44009,44010,44011,\r
+44012,44013,44014,44015,44016,44017,44018,44019,44020,44021,44022,44023,44024,\r
+44025,44026,44027,44028,44029,44030,44193,44194,44195,44196,44197,44198,44199,\r
+44200,44201,44202,44203,44204,44205,44206,44207,44208,44209,44210,44211,44212,\r
+44213,44214,44215,44216,44217,44218,44219,44220,44221,44222,44223,44224,44225,\r
+44226,44227,44228,44229,44230,44231,44232,44233,44234,44235,44236,44237,44238,\r
+44239,44240,44241,44242,44243,44244,44245,44246,44247,44248,44249,44250,44251,\r
+44252,44253,44254,44255,44256,44257,44258,44259,44260,44261,44262,44263,44264,\r
+44265,44266,44267,44268,44269,44270,44271,44272,44273,44274,44275,44276,44277,\r
+44278,44279,44280,44281,44282,44283,44284,44285,44286,44449,44450,44451,44452,\r
+44453,44454,44455,44456,44457,44458,44459,44460,44461,44462,44463,44464,44465,\r
+44466,44467,44468,44469,44470,44471,44472,44473,44474,44475,44476,44477,44478,\r
+44479,44480,44481,44482,44483,44484,44485,44486,44487,44488,44489,44490,44491,\r
+44492,44493,44494,44495,44496,44497,44498,44499,44500,44501,44502,44503,44504,\r
+44505,44506,44507,44508,44509,44510,44511,44512,44513,44514,44515,44516,44517,\r
+44518,44519,44520,44521,44522,44523,44524,44525,44526,44527,44528,44529,44530,\r
+44531,44532,44533,44534,44535,44536,44537,44538,44539,44540,44541,44542,44705,\r
+44706,44707,44708,44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,\r
+44719,44720,44721,44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,\r
+44732,44733,44734,44735,44736,44737,44738,44739,44740,44741,44742,44743,44744,\r
+44745,44746,44747,44748,44749,44750,44751,44752,44753,44754,44755,44756,44757,\r
+44758,44759,44760,44761,44762,44763,44764,44765,44766,44767,44768,44769,44770,\r
+44771,44772,44773,44774,44775,44776,44777,44778,44779,44780,44781,44782,44783,\r
+44784,44785,44786,44787,44788,44789,44790,44791,44792,44793,44794,44795,44796,\r
+44797,44798,44961,44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,\r
+44972,44973,44974,44975,44976,44977,44978,44979,44980,44981,44982,44983,44984,\r
+44985,44986,44987,44988,44989,44990,44991,44992,44993,44994,44995,44996,44997,\r
+44998,44999,45000,45001,45002,45003,45004,45005,45006,45007,45008,45009,45010,\r
+45011,45012,45013,45014,45015,45016,45017,45018,45019,45020,45021,45022,45023,\r
+45024,45025,45026,45027,45028,45029,45030,45031,45032,45033,45034,45035,45036,\r
+45037,45038,45039,45040,45041,45042,45043,45044,45045,45046,45047,45048,45049,\r
+45050,45051,45052,45053,45054,63649,63650,63651,63652,63653,63654,63655,63656,\r
+63657,63658,63659,63660,63661,63662,63663,63664,63665,63666,63667,63668,63669,\r
+63670,63671,63672,63673,63674,63675,63676,63677,63678,63679,63680,63681,63682,\r
+63683,63684,63685,63686,63687,63688,63689,63690,63691,63692,63693,63694,63695,\r
+63696,63697,63698,63699,63700,63701,63702,63703,63704,63705,63706,63707,63708,\r
+63709,63710,63711,63712,63713,63714,63715,63716,63717,63718,63719,63720,63721,\r
+63722,63723,63724,63725,63726,63727,63728,63729,63730,63731,63732,63733,63734,\r
+63735,63736,63737,63738,63739,63740,63741,63742,63905,63906,63907,63908,63909,\r
+63910,63911,63912,63913,63914,63915,63916,63917,63918,63919,63920,63921,63922,\r
+63923,63924,63925,63926,63927,63928,63929,63930,63931,63932,63933,63934,63935,\r
+63936,63937,63938,63939,63940,63941,63942,63943,63944,63945,63946,63947,63948,\r
+63949,63950,63951,63952,63953,63954,63955,63956,63957,63958,63959,63960,63961,\r
+63962,63963,63964,63965,63966,63967,63968,63969,63970,63971,63972,63973,63974,\r
+63975,63976,63977,63978,63979,63980,63981,63982,63983,63984,63985,63986,63987,\r
+63988,63989,63990,63991,63992,63993,63994,63995,63996,63997,63998,64161,64162,\r
+64163,64164,64165,64166,64167,64168,64169,64170,64171,64172,64173,64174,64175,\r
+64176,64177,64178,64179,64180,64181,64182,64183,64184,64185,64186,64187,64188,\r
+64189,64190,64191,64192,64193,64194,64195,64196,64197,64198,64199,64200,64201,\r
+64202,64203,64204,64205,64206,64207,64208,64209,64210,64211,64212,64213,64214,\r
+64215,64216,64217,64218,64219,64220,64221,64222,64223,64224,64225,64226,64227,\r
+64228,64229,64230,64231,64232,64233,64234,64235,64236,64237,64238,64239,64240,\r
+64241,64242,64243,64244,64245,64246,64247,64248,64249,64250,64251,64252,64253,\r
+64254,64417,64418,64419,64420,64421,64422,64423,64424,64425,64426,64427,64428,\r
+64429,64430,64431,64432,64433,64434,64435,64436,64437,64438,64439,64440,64441,\r
+64442,64443,64444,64445,64446,64447,64448,64449,64450,64451,64452,64453,64454,\r
+64455,64456,64457,64458,64459,64460,64461,64462,64463,64464,64465,64466,64467,\r
+64468,64469,64470,64471,64472,64473,64474,64475,64476,64477,64478,64479,64480,\r
+64481,64482,64483,64484,64485,64486,64487,64488,64489,64490,64491,64492,64493,\r
+64494,64495,64496,64497,64498,64499,64500,64501,64502,64503,64504,64505,64506,\r
+64507,64508,64509,64510,64673,64674,64675,64676,64677,64678,64679,64680,64681,\r
+64682,64683,64684,64685,64686,64687,64688,64689,64690,64691,64692,64693,64694,\r
+64695,64696,64697,64698,64699,64700,64701,64702,64703,64704,64705,64706,64707,\r
+64708,64709,64710,64711,64712,64713,64714,64715,64716,64717,64718,64719,64720,\r
+64721,64722,64723,64724,64725,64726,64727,64728,64729,64730,64731,64732,64733,\r
+64734,64735,64736,64737,64738,64739,64740,64741,64742,64743,64744,64745,64746,\r
+64747,64748,64749,64750,64751,64752,64753,64754,64755,64756,64757,64758,64759,\r
+64760,64761,64762,64763,64764,64765,64766,64929,64930,64931,64932,64933,64934,\r
+64935,64936,64937,64938,64939,64940,64941,64942,64943,64944,64945,64946,64947,\r
+64948,64949,64950,64951,64952,64953,64954,64955,64956,64957,64958,64959,64960,\r
+64961,64962,64963,64964,64965,64966,64967,64968,64969,64970,64971,64972,64973,\r
+64974,64975,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,\r
+64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,\r
+65000,65001,65002,65003,65004,65005,65006,65007,65008,65009,65010,65011,65012,\r
+65013,65014,65015,65016,65017,65018,65019,65020,65021,65022,65185,65186,65187,\r
+65188,65189,65190,65191,65192,65193,65194,65195,65196,65197,65198,65199,65200,\r
+65201,65202,65203,65204,65205,65206,65207,65208,65209,65210,65211,65212,65213,\r
+65214,65215,65216,65217,65218,65219,65220,65221,65222,65223,65224,65225,65226,\r
+65227,65228,65229,65230,65231,65232,65233,65234,65235,65236,65237,65238,65239,\r
+65240,65241,65242,65243,65244,65245,65246,65247,65248,65249,65250,65251,65252,\r
+65253,65254,65255,65256,65257,65258,65259,65260,65261,65262,65263,65264,65265,\r
+65266,65267,65268,65269,65270,65271,65272,65273,65274,65275,65276,65277,65278,\r
+41280,41281,41282,41283,41284,41285,41286,41287,41288,41289,41290,41291,41292,\r
+41293,41294,41295,41296,41297,41298,41299,41300,41301,41302,41303,41304,41305,\r
+41306,41307,41308,41309,41310,41311,41312,41313,41314,41315,41316,41317,41318,\r
+41319,41320,41321,41322,41323,41324,41325,41326,41327,41328,41329,41330,41331,\r
+41332,41333,41334,41335,41336,41337,41338,41339,41340,41341,41342,41344,41345,\r
+41346,41347,41348,41349,41350,41351,41352,41353,41354,41355,41356,41357,41358,\r
+41359,41360,41361,41362,41363,41364,41365,41366,41367,41368,41369,41370,41371,\r
+41372,41373,41374,41375,41376,41536,41537,41538,41539,41540,41541,41542,41543,\r
+41544,41545,41546,41547,41548,41549,41550,41551,41552,41553,41554,41555,41556,\r
+41557,41558,41559,41560,41561,41562,41563,41564,41565,41566,41567,41568,41569,\r
+41570,41571,41572,41573,41574,41575,41576,41577,41578,41579,41580,41581,41582,\r
+41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,41594,41595,\r
+41596,41597,41598,41600,41601,41602,41603,41604,41605,41606,41607,41608,41609,\r
+41610,41611,41612,41613,41614,41615,41616,41617,41618,41619,41620,41621,41622,\r
+41623,41624,41625,41626,41627,41628,41629,41630,41631,41632,41792,41793,41794,\r
+41795,41796,41797,41798,41799,41800,41801,41802,41803,41804,41805,41806,41807,\r
+41808,41809,41810,41811,41812,41813,41814,41815,41816,41817,41818,41819,41820,\r
+41821,41822,41823,41824,41825,41826,41827,41828,41829,41830,41831,41832,41833,\r
+41834,41835,41836,41837,41838,41839,41840,41841,41842,41843,41844,41845,41846,\r
+41847,41848,41849,41850,41851,41852,41853,41854,41856,41857,41858,41859,41860,\r
+41861,41862,41863,41864,41865,41866,41867,41868,41869,41870,41871,41872,41873,\r
+41874,41875,41876,41877,41878,41879,41880,41881,41882,41883,41884,41885,41886,\r
+41887,41888,42048,42049,42050,42051,42052,42053,42054,42055,42056,42057,42058,\r
+42059,42060,42061,42062,42063,42064,42065,42066,42067,42068,42069,42070,42071,\r
+42072,42073,42074,42075,42076,42077,42078,42079,42080,42081,42082,42083,42084,\r
+42085,42086,42087,42088,42089,42090,42091,42092,42093,42094,42095,42096,42097,\r
+42098,42099,42100,42101,42102,42103,42104,42105,42106,42107,42108,42109,42110,\r
+42112,42113,42114,42115,42116,42117,42118,42119,42120,42121,42122,42123,42124,\r
+42125,42126,42127,42128,42129,42130,42131,42132,42133,42134,42135,42136,42137,\r
+42138,42139,42140,42141,42142,42143,42144,42304,42305,42306,42307,42308,42309,\r
+42310,42311,42312,42313,42314,42315,42316,42317,42318,42319,42320,42321,42322,\r
+42323,42324,42325,42326,42327,42328,42329,42330,42331,42332,42333,42334,42335,\r
+42336,42337,42338,42339,42340,42341,42342,42343,42344,42345,42346,42347,42348,\r
+42349,42350,42351,42352,42353,42354,42355,42356,42357,42358,42359,42360,42361,\r
+42362,42363,42364,42365,42366,42368,42369,42370,42371,42372,42373,42374,42375,\r
+42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,42386,42387,42388,\r
+42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,42399,42400,42560,\r
+42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,42572,42573,\r
+42574,42575,42576,42577,42578,42579,42580,42581,42582,42583,42584,42585,42586,\r
+42587,42588,42589,42590,42591,42592,42593,42594,42595,42596,42597,42598,42599,\r
+42600,42601,42602,42603,42604,42605,42606,42607,42608,42609,42610,42611,42612,\r
+42613,42614,42615,42616,42617,42618,42619,42620,42621,42622,42624,42625,42626,\r
+42627,42628,42629,42630,42631,42632,42633,42634,42635,42636,42637,42638,42639,\r
+42640,42641,42642,42643,42644,42645,42646,42647,42648,42649,42650,42651,42652,\r
+42653,42654,42655,42656,42816,42817,42818,42819,42820,42821,42822,42823,42824,\r
+42825,42826,42827,42828,42829,42830,42831,42832,42833,42834,42835,42836,42837,\r
+42838,42839,42840,42841,42842,42843,42844,42845,42846,42847,42848,42849,42850,\r
+42851,42852,42853,42854,42855,42856,42857,42858,42859,42860,42861,42862,42863,\r
+42864,42865,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,\r
+42877,42878,42880,42881,42882,42883,42884,42885,42886,42887,42888,42889,42890,\r
+42891,42892,42893,42894,42895,42896,42897,42898,42899,42900,42901,42902,42903,\r
+42904,42905,42906,42907,42908,42909,42910,42911,42912,41643,41644,41645,41646,\r
+41647,41648,N,41700,41711,41712,41725,41726,42228,42229,42230,42231,42232,\r
+42233,42234,42235,42236,42237,42238,42487,42488,42489,42490,42491,42492,42493,\r
+42494,42681,42682,42683,42684,42685,42686,42687,42688,42713,42714,42715,42716,\r
+42717,42718,42719,42732,42733,42739,42742,42743,42744,42745,42746,42747,42748,\r
+42749,42750,42946,42947,42948,42949,42950,42951,42952,42953,42954,42955,42956,\r
+42957,42958,42959,42960,42994,42995,42996,42997,42998,42999,43000,43001,43002,\r
+43003,43004,43005,43006,43158,43159,43160,43161,43162,43163,43164,43165,43166,\r
+43167,43168,43196,N,43201,43202,43203,43204,43242,43243,43244,43245,43246,\r
+43247,43248,43249,43250,43251,43252,43253,43254,43255,43256,43257,43258,43259,\r
+43260,43261,43262,43352,43355,43357,43358,43359,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43415,43416,43417,43418,43419,43420,43421,43422,43423,43424,43425,43426,43427,\r
+43504,43505,43506,43507,43508,43509,43510,43511,43512,43513,43514,43515,43516,\r
+43517,43518,55290,55291,55292,55293,55294,N,65105,65106,65107,N,N,N,N,N,65113,\r
+N,N,N,N,N,N,N,65121,N,N,N,N,65126,65127,N,N,N,N,65132,65133,N,N,N,N,N,N,N,N,\r
+65142,N,N,N,N,N,N,N,65150,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65168,65169,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,65184,\r
+};\r
+\r
+static const struct unim_index gb18030ext_encmap[256] = {\r
+{0,0,0},{__gb18030ext_encmap+0,249,249},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+1,172,172\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+2,129,202},{\r
+__gb18030ext_encmap+76,240,251},{__gb18030ext_encmap+88,62,62},{0,0,0},{0,0,0\r
+},{0,0,0},{__gb18030ext_encmap+89,71,115},{__gb18030ext_encmap+134,158,158},{\r
+__gb18030ext_encmap+135,14,26},{0,0,0},{0,0,0},{__gb18030ext_encmap+148,24,223\r
+},{__gb18030ext_encmap+348,115,115},{__gb18030ext_encmap+349,78,78},{\r
+__gb18030ext_encmap+350,110,224},{0,0,0},{0,0,0},{0,0,0},{__gb18030ext_encmap+\r
+465,86,86},{__gb18030ext_encmap+466,95,95},{0,0,0},{__gb18030ext_encmap+467,\r
+55,221},{__gb18030ext_encmap+634,214,214},{0,0,0},{__gb18030ext_encmap+635,76,\r
+97},{__gb18030ext_encmap+657,35,141},{0,0,0},{__gb18030ext_encmap+764,71,183},\r
+{0,0,0},{0,0,0},{__gb18030ext_encmap+877,119,163},{__gb18030ext_encmap+922,19,\r
+174},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{__gb18030ext_encmap+1078,0,255},{__gb18030ext_encmap+1334,0,255\r
+},{__gb18030ext_encmap+1590,0,255},{__gb18030ext_encmap+1846,0,255},{\r
+__gb18030ext_encmap+2102,0,255},{__gb18030ext_encmap+2358,0,255},{\r
+__gb18030ext_encmap+2614,0,255},{__gb18030ext_encmap+2870,0,255},{\r
+__gb18030ext_encmap+3126,0,100},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+\r
+static const struct _gb18030_to_unibmp_ranges {\r
+    Py_UNICODE   first, last;\r
+    DBCHAR       base;\r
+} gb18030_to_unibmp_ranges[] = {\r
+{128,163,0},{165,166,36},{169,175,38},{178,182,45},{184,214,50},{216,223,81},{\r
+226,231,89},{235,235,95},{238,241,96},{244,246,100},{248,248,103},{251,251,104\r
+},{253,256,105},{258,274,109},{276,282,126},{284,298,133},{300,323,148},{325,\r
+327,172},{329,332,175},{334,362,179},{364,461,208},{463,463,306},{465,465,307\r
+},{467,467,308},{469,469,309},{471,471,310},{473,473,311},{475,475,312},{477,\r
+504,313},{506,592,341},{594,608,428},{610,710,443},{712,712,544},{716,728,545\r
+},{730,912,558},{930,930,741},{938,944,742},{962,962,749},{970,1024,750},{1026\r
+,1039,805},{1104,1104,819},{1106,8207,820},{8209,8210,7922},{8215,8215,7924},{\r
+8218,8219,7925},{8222,8228,7927},{8231,8239,7934},{8241,8241,7943},{8244,8244,\r
+7944},{8246,8250,7945},{8252,8363,7950},{8365,8450,8062},{8452,8452,8148},{\r
+8454,8456,8149},{8458,8469,8152},{8471,8480,8164},{8482,8543,8174},{8556,8559,\r
+8236},{8570,8591,8240},{8596,8597,8262},{8602,8711,8264},{8713,8718,8374},{\r
+8720,8720,8380},{8722,8724,8381},{8726,8729,8384},{8731,8732,8388},{8737,8738,\r
+8390},{8740,8740,8392},{8742,8742,8393},{8748,8749,8394},{8751,8755,8396},{\r
+8760,8764,8401},{8766,8775,8406},{8777,8779,8416},{8781,8785,8419},{8787,8799,\r
+8424},{8802,8803,8437},{8808,8813,8439},{8816,8852,8445},{8854,8856,8482},{\r
+8858,8868,8485},{8870,8894,8496},{8896,8977,8521},{8979,9311,8603},{9322,9331,\r
+8936},{9372,9471,8946},{9548,9551,9046},{9588,9600,9050},{9616,9618,9063},{\r
+9622,9631,9066},{9634,9649,9076},{9652,9659,9092},{9662,9669,9100},{9672,9674,\r
+9108},{9676,9677,9111},{9680,9697,9113},{9702,9732,9131},{9735,9736,9162},{\r
+9738,9791,9164},{9793,9793,9218},{9795,11904,9219},{11906,11907,11329},{11909,\r
+11911,11331},{11913,11914,11334},{11917,11926,11336},{11928,11942,11346},{\r
+11944,11945,11361},{11947,11949,11363},{11951,11954,11366},{11956,11957,11370\r
+},{11960,11962,11372},{11964,11977,11375},{11979,12271,11389},{12284,12287,\r
+11682},{12292,12292,11686},{12312,12316,11687},{12319,12320,11692},{12330,\r
+12349,11694},{12351,12352,11714},{12436,12442,11716},{12447,12448,11723},{\r
+12535,12539,11725},{12543,12548,11730},{12586,12831,11736},{12842,12848,11982\r
+},{12850,12962,11989},{12964,13197,12102},{13200,13211,12336},{13215,13216,\r
+12348},{13218,13251,12350},{13253,13261,12384},{13263,13264,12393},{13267,\r
+13268,12395},{13270,13382,12397},{13384,13426,12510},{13428,13725,12553},{\r
+13727,13837,12851},{13839,13849,12962},{13851,14615,12973},{14617,14701,13738\r
+},{14703,14798,13823},{14801,14814,13919},{14816,14962,13933},{14964,15181,\r
+14080},{15183,15469,14298},{15471,15583,14585},{15585,16469,14698},{16471,\r
+16734,15583},{16736,17206,15847},{17208,17323,16318},{17325,17328,16434},{\r
+17330,17372,16438},{17374,17621,16481},{17623,17995,16729},{17997,18016,17102\r
+},{18018,18210,17122},{18212,18216,17315},{18218,18299,17320},{18301,18316,\r
+17402},{18318,18758,17418},{18760,18809,17859},{18811,18812,17909},{18814,\r
+18817,17911},{18820,18820,17915},{18823,18842,17916},{18844,18846,17936},{\r
+18848,18869,17939},{18872,19574,17961},{19576,19614,18664},{19620,19730,18703\r
+},{19738,19885,18814},{19887,19967,18962},{40870,55295,19043},{59244,59244,\r
+33469},{59336,59336,33470},{59367,59379,33471},{59413,59413,33484},{59417,\r
+59421,33485},{59423,59429,33490},{59431,59434,33497},{59437,59440,33501},{\r
+59443,59450,33505},{59452,59458,33513},{59460,59475,33520},{59478,59491,33536\r
+},{59493,63787,33550},{63789,63864,37845},{63866,63892,37921},{63894,63974,\r
+37948},{63976,63984,38029},{63986,64011,38038},{64016,64016,38064},{64018,\r
+64018,38065},{64021,64023,38066},{64025,64030,38069},{64034,64034,38075},{\r
+64037,64038,38076},{64042,65071,38078},{65074,65074,39108},{65093,65096,39109\r
+},{65107,65107,39113},{65112,65112,39114},{65127,65127,39115},{65132,65280,\r
+39116},{65375,65503,39265},{65510,65535,39394},{0,0,39420}};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_hk.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_hk.h
new file mode 100644 (file)
index 0000000..3a7c76c
--- /dev/null
@@ -0,0 +1,2378 @@
+static const ucs2_t __big5hkscs_decmap[6219] = {\r
+17392,19506,17923,17830,17784,29287,19831,17843,31921,19682,31941,15253,18230,\r
+18244,19527,19520,17087,13847,29522,28299,28882,19543,41809,18255,17882,19589,\r
+31852,19719,19108,18081,27427,29221,23124,6755,15878,16225,26189,22267,U,\r
+32149,22813,35769,15860,38708,31727,23515,7518,23204,13861,40624,23249,23479,\r
+23804,26478,34195,39237,29793,29853,12736,12737,12738,12739,12740,268,12741,\r
+209,205,12742,12743,203,8168,12744,202,12745,12746,12747,12748,270,12749,\r
+12750,256,193,461,192,274,201,282,200,332,211,465,210,U,7870,U,7872,202,257,\r
+225,462,224,593,275,233,283,232,299,237,464,236,333,243,466,242,363,250,468,\r
+249,470,472,474,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,476,252,U,7871,U,7873,234,609,9178,9179,41897,4421,U,25866,U,U,20029,\r
+28381,40270,37343,U,U,30517,25745,20250,20264,20392,20822,20852,20892,20964,\r
+21153,21160,21307,21326,21457,21464,22242,22768,22788,22791,22834,22836,23398,\r
+23454,23455,23706,24198,24635,25993,26622,26628,26725,27982,28860,30005,32420,\r
+32428,32442,32455,32463,32479,32518,32567,33402,33487,33647,35270,35774,35810,\r
+36710,36711,36718,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,29713,31996,32205,26950,31433,21031,U,U,U,U,37260,30904,37214,32956,U,\r
+36107,33014,2535,U,U,32927,40647,19661,40393,40460,19518,40438,28686,40458,\r
+41267,13761,U,28314,33342,29977,U,18705,39532,39567,40857,31111,33900,7626,\r
+1488,10982,20004,20097,20096,20103,20159,20203,20279,13388,20413,15944,20483,\r
+20616,13437,13459,13477,20870,22789,20955,20988,20997,20105,21113,21136,21287,\r
+13767,21417,13649,21424,13651,21442,21539,13677,13682,13953,21651,21667,21684,\r
+21689,21712,21743,21784,21795,21800,13720,21823,13733,13759,21975,13765,32132,\r
+21797,U,3138,3349,20779,21904,11462,14828,833,36422,19896,38117,16467,32958,\r
+30586,11320,14900,18389,33117,27122,19946,25821,3452,4020,3285,4340,25741,\r
+36478,3734,3083,3940,11433,33366,17619,U,3398,39501,33001,18420,20135,11458,\r
+39602,14951,38388,16365,13574,21191,38868,30920,11588,40302,38933,U,17369,\r
+24741,25780,21731,11596,11210,4215,14843,4207,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26330,26390,31136,25834,20562,3139,36456,\r
+8609,35660,1841,U,18443,425,16378,22643,11661,U,17864,1276,24727,3916,3478,\r
+21881,16571,17338,U,19124,10854,4253,33194,39157,3484,25465,14846,10101,36288,\r
+22177,25724,15939,U,42497,3593,10959,11465,U,4296,14786,14738,14854,33435,\r
+13688,24137,8391,22098,3889,11442,38688,13500,27709,20027,U,U,30068,11915,\r
+8712,42587,36045,3706,3124,26652,32659,4303,10243,10553,13819,20963,3724,3981,\r
+3754,16275,3888,3399,4431,3660,U,3755,2985,3400,4288,4413,16377,9878,25650,\r
+4013,13300,30265,11214,3454,3455,11345,11349,14872,3736,4295,3886,42546,27472,\r
+36050,36249,36042,38314,21708,33476,21945,U,40643,39974,39606,30558,11758,\r
+28992,33133,33004,23580,25970,33076,14231,21343,32957,37302,3834,3599,3703,\r
+3835,13789,19947,13833,3286,22191,10165,4297,3600,3704,4216,4424,33287,5205,\r
+3705,20048,11684,23124,4125,4126,4341,4342,22428,3601,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30356,33485,4021,3707,20862,14083,\r
+4022,4480,21208,41661,18906,6202,16759,33404,22681,21096,13850,22333,31666,\r
+23400,18432,19244,40743,18919,39967,39821,23412,12605,22011,13810,22153,20008,\r
+22786,7105,63608,38737,134,20059,20155,13630,23587,24401,24516,14586,25164,\r
+25909,27514,27701,27706,28780,29227,20012,29357,18665,32594,31035,31993,32595,\r
+25194,13505,U,25419,32770,32896,26130,26961,21341,34916,35265,30898,35744,\r
+36125,38021,38264,38271,38376,36367,38886,39029,39118,39134,39267,38928,40060,\r
+40479,40644,27503,63751,20023,135,38429,25143,38050,20539,28158,40051,40870,\r
+15817,34959,16718,28791,23797,19232,20941,13657,23856,24866,35378,36775,37366,\r
+29073,26393,29626,12929,41223,15499,6528,19216,30948,29698,20910,34575,16393,\r
+27235,41658,16931,34319,2671,31274,39239,35562,38741,28749,21284,8318,37876,\r
+30425,35299,40871,30685,20131,20464,20668,20015,20247,40872,21556,32139,22674,\r
+22736,7606,24210,24217,24514,10002,25995,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,13305,26905,27203,15459,27903,U,29184,17669,\r
+29580,16091,18963,23317,29881,35715,23716,22165,31379,31724,31939,32364,33528,\r
+34199,40873,34960,40874,36537,40875,36815,34143,39392,37409,40876,36281,5183,\r
+16497,17058,23066,U,U,U,39016,26475,17014,22333,U,34262,18811,33471,28941,\r
+19585,28020,23931,27413,28606,40877,40878,23446,40879,26343,32347,28247,31178,\r
+15752,17603,12886,10134,17306,17718,U,23765,15130,35577,23672,15634,13649,\r
+23928,40882,29015,17752,16620,7715,19575,14712,13386,420,27713,35532,20404,\r
+569,22975,33132,38998,39162,24379,2975,U,8641,35181,16642,18107,36985,16135,\r
+40883,41397,16632,14294,18167,27718,16764,34482,29695,17773,14548,21658,17761,\r
+17691,19849,19579,19830,17898,16328,19215,13921,17630,17597,16877,23870,23880,\r
+23894,15868,14351,23972,23993,14368,14392,24130,24253,24357,24451,14600,14612,\r
+14655,14669,24791,24893,23781,14729,25015,25017,25039,14776,25132,25232,25317,\r
+25368,14840,22193,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,14851,25570,25595,25607,25690,14923,25792,23829,22049,40863,14999,\r
+25990,15037,26111,26195,15090,26258,15138,26390,15170,26532,26624,15192,26698,\r
+26756,15218,15217,15227,26889,26947,29276,26980,27039,27013,15292,27094,15325,\r
+27237,27252,27249,27266,15340,27289,15346,27307,27317,27348,27382,27521,27585,\r
+27626,27765,27818,15563,27906,27910,27942,28033,15599,28068,28081,28181,28184,\r
+28201,28294,35264,28347,28386,28378,40831,28392,28393,28452,28468,15686,16193,\r
+28545,28606,15722,15733,29111,23705,15754,28716,15761,28752,28756,28783,28799,\r
+28809,805,17345,13809,3800,16087,22462,28371,28990,22496,13902,27042,35817,\r
+23412,31305,22753,38105,31333,31357,22956,31419,31408,31426,31427,29137,25741,\r
+16842,31450,31453,31466,16879,21682,23553,31499,31573,31529,21262,23806,31650,\r
+31599,33692,23476,27775,31696,33825,31634,U,23840,15789,23653,33938,31738,U,\r
+31797,23745,31812,31875,18562,31910,26237,17784,31945,31943,31974,31860,31987,\r
+31989,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+32359,17693,28228,32093,28374,29837,32137,32171,28981,32179,U,16471,24617,\r
+32228,15635,32245,6137,32229,33645,U,24865,24922,32366,32402,17195,37996,\r
+32295,32576,32577,32583,31030,25296,39393,32663,25425,32675,5729,104,17756,\r
+14182,17667,33594,32762,25737,U,32776,32797,U,32815,41095,27843,32827,32828,\r
+32865,10004,18825,26150,15843,26344,26405,32935,35400,33031,33050,22704,9974,\r
+27775,25752,20408,25831,5258,33304,6238,27219,19045,19093,17530,33321,2829,\r
+27218,15742,20473,5373,34018,33634,27402,18855,13616,6003,15864,33450,26907,\r
+63892,16859,34123,33488,33562,3606,6068,14017,12669,13658,33403,33506,33560,\r
+16011,28067,27397,27543,13774,15807,33565,21996,33669,17675,28069,33708,U,\r
+33747,13438,28372,27223,34138,13462,28226,12015,33880,23524,33905,15827,17636,\r
+27303,33866,15541,31064,U,27542,28279,28227,34014,U,33681,17568,33939,34020,\r
+23697,16960,23744,17731,34100,23282,28313,17703,34163,17686,26559,34326,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34341,34363,\r
+34241,28808,34306,5506,28877,63922,17770,34344,13896,6306,21495,29594,34430,\r
+34673,41208,34798,11303,34737,34778,34831,22113,34412,26710,17935,34885,34886,\r
+30176,15801,30180,34910,34972,18011,34996,34997,25537,35013,30583,30479,35207,\r
+35210,U,U,35239,35260,35365,35303,31012,31421,35484,30611,37374,35472,31321,\r
+31465,31546,16271,18195,31544,29052,35596,35615,21552,21861,35647,35660,35661,\r
+35497,19066,35728,35739,35503,5855,17941,34895,35995,32084,32143,63956,14117,\r
+32083,36054,32152,32189,36114,36099,6416,36059,28764,36113,19657,16080,36265,\r
+32770,4116,18826,15228,33212,28940,31463,36525,36534,36547,37588,36633,36653,\r
+33637,33810,36773,37635,41631,2640,36787,18730,35294,34109,15803,24312,12898,\r
+36857,40980,34492,34049,8997,14720,28375,36919,34108,31422,36961,34156,34315,\r
+37032,34579,37060,34534,37038,U,37223,15088,37289,37316,31916,35123,7817,\r
+37390,27807,37441,37474,21945,U,35526,15515,35596,21979,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,3377,37676,37739,35553,35819,\r
+28815,23235,35554,35557,18789,37444,35820,35897,35839,37747,37979,36540,38277,\r
+38310,37926,38304,28662,17081,9850,34520,4732,15918,18911,27676,38523,38550,\r
+16748,38563,28373,25050,38582,30965,35552,38589,21452,18849,27832,628,25616,\r
+37039,37093,19153,6421,13066,38705,34370,38710,18959,17725,17797,19177,28789,\r
+23361,38683,U,37333,38743,23370,37355,38751,37925,20688,12471,12476,38793,\r
+38815,38833,38846,38848,38866,38880,21612,38894,29724,37939,U,38901,37917,\r
+31098,19153,38964,38963,38987,39014,15118,29045,15697,1584,16732,22278,39114,\r
+39095,39112,39111,19199,27943,5843,21936,39137,39142,39148,37752,39225,18985,\r
+19314,38999,39173,39413,39436,39483,39440,39512,22309,14020,37041,39893,39648,\r
+39650,39685,39668,19470,39700,39725,34304,20532,39732,27048,14531,12413,39760,\r
+39744,40254,23109,6243,39822,16971,39938,39935,39948,40552,40404,40887,41362,\r
+41387,41185,41251,41439,40318,40323,41268,40462,26760,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40388,8539,41363,41504,6459,41523,\r
+40249,41145,41652,40592,40597,40606,40610,19764,40618,40623,17252,40641,15200,\r
+14821,15645,20274,14270,35883,40706,40712,19350,37924,28066,40727,U,40761,\r
+22175,22154,40773,39352,37003,38898,33919,40802,40809,31452,40846,29206,19390,\r
+18805,18875,29047,18936,17224,19025,29598,35802,6394,31135,35198,36406,37737,\r
+37875,35396,37612,37761,37835,35180,17593,29207,16107,30578,31299,28880,17523,\r
+17400,29054,6127,28835,6334,13721,16071,6277,21551,6136,14114,5883,6201,14049,\r
+6004,6353,24395,14115,5824,22363,18981,5118,4776,5062,5302,34051,13990,U,\r
+33877,18836,29029,15921,21852,16123,28754,17652,14062,39325,28454,26617,14131,\r
+15381,15847,22636,6434,26640,16471,14143,16609,16523,16655,27681,21707,22174,\r
+26289,22162,4063,2984,3597,37830,35603,37788,20216,20779,14361,17462,20156,\r
+1125,895,20299,20362,22097,23144,427,971,14745,778,1044,13365,20265,704,36531,\r
+629,35546,524,20120,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,20685,20749,20386,20227,18958,16010,20290,20526,20588,20609,20428,\r
+20453,20568,20732,U,U,U,U,28278,13717,15929,16063,28018,6276,16009,20904,\r
+20931,1504,17629,1187,1170,1169,36218,35484,1806,21081,21156,2163,21217,U,\r
+18042,29068,17292,3104,18860,4324,27089,3613,U,16094,29849,29716,29782,29592,\r
+19342,19132,16525,21456,13700,29199,16585,21940,837,21709,3014,22301,37469,\r
+38644,37734,22493,22413,22399,13886,22731,23193,35398,5882,5999,5904,23084,\r
+22968,37519,23166,23247,23058,22854,6643,6241,17045,14069,27909,29763,23073,\r
+24195,23169,35799,1043,37856,29836,4867,28933,18802,37896,35323,37821,14240,\r
+23582,23710,24158,24136,6550,6524,15086,24269,23375,6403,6404,14081,6304,\r
+14045,5886,14035,33066,35399,7610,13426,35240,24332,24334,6439,6059,23147,\r
+5947,23364,34324,30205,34912,24702,10336,9771,24539,16056,9647,9662,37000,\r
+28531,25024,62,70,9755,24985,24984,24693,11419,11527,18132,37197,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25713,18021,11114,\r
+14889,11042,13392,39146,11896,25399,42075,25782,25393,25553,18915,11623,25252,\r
+11425,25659,25963,26994,15348,12430,12973,18825,12971,21773,13024,6361,37951,\r
+26318,12937,12723,15072,16784,21892,35618,21903,5884,21851,21541,30958,12547,\r
+6186,12852,13412,12815,12674,17097,26254,27940,26219,19347,26160,30832,7659,\r
+26211,13010,13025,26142,22642,14545,14394,14268,15257,14242,13310,29904,15254,\r
+26511,17962,26806,26654,15300,27326,14435,14293,17543,27187,27218,27337,27397,\r
+6418,25873,26776,27212,15319,27258,27479,16320,15514,37792,37618,35818,35531,\r
+37513,32798,35292,37991,28069,28427,18924,U,16255,15759,28164,16444,23101,\r
+28170,22599,27940,30786,28987,17178,17014,28913,29264,29319,29332,18319,18213,\r
+20857,19108,1515,29818,16120,13919,19018,18711,24545,16134,16049,19167,35875,\r
+16181,24743,16115,29900,29756,37767,29751,17567,28138,17745,30083,16227,19673,\r
+19718,16216,30037,30323,42438,15129,29800,35532,18859,18830,15099,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,15821,19022,16127,\r
+18885,18675,37370,22322,37698,35555,6244,20703,21025,20967,30584,12850,30478,\r
+30479,30587,18071,14209,14942,18672,29752,29851,16063,19130,19143,16584,19094,\r
+25006,37639,21889,30750,30861,30856,30930,29648,31065,30529,22243,16654,U,\r
+33942,31141,27181,16122,31290,31220,16750,5862,16690,37429,31217,3404,18828,\r
+665,15802,5998,13719,21867,13680,13994,468,3085,31458,23129,9973,23215,23196,\r
+23053,603,30960,23082,23494,31486,16889,31837,31853,16913,23475,24252,24230,\r
+31949,18937,6064,31886,31868,31918,27314,32220,32263,32211,32590,25185,24924,\r
+31560,32151,24194,17002,27509,2326,26582,78,13775,22468,25618,25592,18786,\r
+32733,31527,2092,23273,23875,31500,24078,39398,34373,39523,27164,13375,14818,\r
+18935,26029,39455,26016,33920,28967,27857,17642,33079,17410,32966,33033,33090,\r
+26548,39107,27202,33378,33381,27217,33875,28071,34320,29211,23174,16767,6208,\r
+23339,6305,23268,6360,34464,63932,15759,34861,29730,23042,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34926,20293,34951,35007,35046,\r
+35173,35149,22147,35156,30597,30596,35829,35801,35740,35321,16045,33955,18165,\r
+18127,14322,35389,35356,37960,24397,37419,17028,26068,28969,28868,6213,40301,\r
+35999,36073,32220,22938,30659,23024,17262,14036,36394,36519,19465,36656,36682,\r
+17140,27736,28603,8993,18587,28537,28299,6106,39913,14005,18735,37051,U,21873,\r
+18694,37307,37892,35403,16482,35580,37927,35869,35899,34021,35371,38297,38311,\r
+38295,38294,36148,29765,16066,18687,19010,17386,16103,12837,38543,36583,36454,\r
+36453,16076,18925,19064,16366,29714,29803,16124,38721,37040,26695,18973,37011,\r
+22495,U,37736,35209,35878,35631,25534,37562,23313,35689,18748,29689,16923,\r
+38811,38769,39224,3878,24001,35781,19122,38943,38106,37622,38359,37349,17600,\r
+35664,19047,35684,39132,35397,16128,37418,18725,33812,39227,39245,31494,15869,\r
+39323,19311,39338,39516,35685,22728,27279,39457,23294,39471,39153,19344,39240,\r
+39356,19389,19351,37757,22642,4866,22562,18872,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,5352,30788,10015,15800,26821,15741,\r
+37976,14631,24912,10113,10603,24839,40015,40019,40059,39989,39952,39807,39887,\r
+40493,39839,41461,41214,40225,19630,16644,40472,19632,40204,41396,41197,41203,\r
+39215,40357,33981,28178,28639,27522,34300,17715,28068,28292,28144,33824,34286,\r
+28160,14295,24676,31202,13724,13888,18733,18910,15714,37851,37566,37704,703,\r
+30905,37495,37965,20452,13376,36964,21853,30781,30804,30902,30795,5975,12745,\r
+18753,13978,20338,28634,28633,U,28702,21524,16821,22459,22771,22410,40214,\r
+22487,28980,13487,16812,29163,27712,20375,U,6069,35401,24844,23246,23051,\r
+17084,17544,14124,19323,35324,37819,37816,6358,3869,33906,27840,5139,17146,\r
+11302,17345,22932,15799,26433,32168,24923,24740,18873,18827,35322,37605,29666,\r
+16105,29876,35683,6303,16097,19123,27352,29683,29691,16086,19006,19092,6105,\r
+19046,935,5156,18917,29768,18710,28837,18806,37508,29670,37727,1278,37681,\r
+35534,35350,37766,35815,21973,18741,35458,29035,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,18755,3327,22180,1562,3051,3256,21762,\r
+31172,6138,32254,5826,19024,6226,17710,37889,14090,35520,18861,22960,6335,\r
+6275,29828,23201,14050,15707,14000,37471,23161,35457,6242,37748,15565,2740,\r
+19094,14730,20724,15721,15692,5020,29045,17147,33304,28175,37092,17643,27991,\r
+32335,28775,27823,15574,16365,15917,28162,28428,15727,1013,30033,14012,13512,\r
+18048,16090,18545,22980,37486,18750,36673,35868,27584,22546,22472,14038,5202,\r
+28926,17250,19057,12259,4784,9149,26809,26983,5016,13541,31732,14047,35459,\r
+14294,13306,19615,27162,13997,27831,33854,17631,17614,27942,27985,27778,28638,\r
+28439,28937,33597,5946,33773,27776,28755,6107,22921,23170,6067,23137,23153,\r
+6405,16892,14125,23023,5948,14023,29070,37776,26266,17061,23150,23083,17043,\r
+27179,16121,30518,17499,17098,28957,16985,35297,20400,27944,23746,17614,32333,\r
+17341,27148,16982,4868,28838,28979,17385,15781,27871,63525,19023,32357,23019,\r
+23855,15859,24412,19037,6111,32164,33830,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21637,15098,13056,532,22398,2261,1561,16357,\r
+8094,41654,28675,37211,23920,29583,31955,35417,37920,20424,32743,29389,29456,\r
+31476,29496,29497,22262,29505,29512,16041,31512,36972,29173,18674,29665,33270,\r
+16074,30476,16081,27810,22269,29721,29726,29727,16098,16112,16116,16122,29907,\r
+16142,16211,30018,30061,30066,30093,16252,30152,30172,16320,30285,16343,30324,\r
+16348,30330,20316,29064,22051,35200,22633,16413,30531,16441,26465,16453,13787,\r
+30616,16490,16495,23646,30654,30667,22770,30744,28857,30748,16552,30777,30791,\r
+30801,30822,33864,21813,31027,26627,31026,16643,16649,31121,31129,36795,31238,\r
+36796,16743,31377,16818,31420,33401,16836,31439,31451,16847,20001,31586,31596,\r
+31611,31762,31771,16992,17018,31867,31900,17036,31928,17044,31981,36755,28864,\r
+3279,32207,32212,32208,32253,32686,32692,29343,17303,32800,32805,31545,32814,\r
+32817,32852,15820,22452,28832,32951,33001,17389,33036,29482,33038,33042,30048,\r
+33044,17409,15161,33110,33113,33114,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,17427,22586,33148,33156,17445,33171,17453,33189,\r
+22511,33217,33252,33364,17551,33446,33398,33482,33496,33535,17584,33623,38505,\r
+27018,33797,28917,33892,24803,33928,17668,33982,34017,34040,34064,34104,34130,\r
+17723,34159,34160,34272,17783,34418,34450,34482,34543,38469,34699,17926,17943,\r
+34990,35071,35108,35143,35217,31079,35369,35384,35476,35508,35921,36052,36082,\r
+36124,18328,22623,36291,18413,20206,36410,21976,22356,36465,22005,36528,18487,\r
+36558,36578,36580,36589,36594,36791,36801,36810,36812,36915,39364,18605,39136,\r
+37395,18718,37416,37464,37483,37553,37550,37567,37603,37611,37619,37620,37629,\r
+37699,37764,37805,18757,18769,40639,37911,21249,37917,37933,37950,18794,37972,\r
+38009,38189,38306,18855,38388,38451,18917,26528,18980,38720,18997,38834,38850,\r
+22100,19172,24808,39097,19225,39153,22596,39182,39193,20916,39196,39223,39234,\r
+39261,39266,19312,39365,19357,39484,39695,31363,39785,39809,39901,39921,39924,\r
+19565,39968,14191,7106,40265,39994,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,40702,22096,40339,40381,40384,40444,38134,36790,\r
+40571,40620,40625,40637,40646,38108,40674,40689,40696,31432,40772,148,695,928,\r
+26906,38083,22956,1239,22592,38081,14265,1493,1557,1654,5818,22359,29043,2754,\r
+2765,3007,21610,63547,3019,21662,3067,3131,3155,3173,3196,24807,3213,22138,\r
+3253,3293,3309,3439,3506,3528,26965,39983,34725,3588,3598,3799,3984,3885,3699,\r
+23584,4028,24075,4188,4175,4214,26398,4219,4232,4246,13895,4287,4307,4399,\r
+4411,21348,33965,4835,4981,4918,35713,5495,5657,6083,6087,20088,28859,6189,\r
+6506,6701,6725,7210,7280,7340,7880,25283,7893,7957,29080,26709,8261,27113,\r
+14024,8828,9175,9210,10026,10353,10575,33533,10599,10643,10965,35237,10984,\r
+36768,11022,38840,11071,38983,39613,11340,U,11400,11447,23528,11528,11538,\r
+11703,11669,11842,12148,12236,12339,12390,13087,13278,24497,26184,26303,31353,\r
+13671,13811,U,18874,U,13850,14102,U,838,22709,26382,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26904,15015,30295,24546,15889,16057,\r
+30206,8346,18640,19128,16665,35482,17134,17165,16443,17204,17302,19013,1482,\r
+20946,1553,22943,7848,15294,15615,17412,17622,22408,18036,14747,18223,34280,\r
+39369,14178,8643,35678,35662,U,18450,18683,18965,29193,19136,3192,22885,20133,\r
+20358,1913,36570,20524,21135,22335,29041,21145,21529,16202,19111,21948,21574,\r
+21614,27474,U,13427,21823,30258,21854,18200,21858,21862,22471,18751,22621,\r
+20582,13563,13260,U,22787,18300,35144,23214,23433,23558,7568,22433,29009,U,\r
+24834,31762,36950,25010,20378,35682,25602,25674,23899,27639,U,25732,6428,\r
+35562,18934,25736,16367,25874,19392,26047,26293,10011,37989,22497,24981,23079,\r
+63693,U,22201,17697,26364,20074,18740,38486,28047,27837,13848,35191,26521,\r
+26734,25617,26718,U,26823,31554,37056,2577,26918,U,26937,31301,U,27130,39462,\r
+27181,13919,25705,33,31107,27188,27483,23852,13593,U,27549,18128,27812,30011,\r
+34917,28078,22710,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,14108,9613,28747,29133,15444,29312,29317,37505,8570,29323,37680,29414,\r
+18896,27705,38047,29776,3832,34855,35061,10534,33907,6065,28344,18986,6176,\r
+14756,14009,U,U,17727,26294,40109,39076,35139,30668,30808,22230,16607,5642,\r
+14753,14127,33000,5061,29101,33638,31197,37288,U,19639,28847,35243,31229,\r
+31242,31499,32102,16762,31555,31102,32777,28597,41695,27139,33560,21410,28167,\r
+37823,26678,38749,33135,32803,27061,5101,12847,32840,23941,35888,32899,22293,\r
+38947,35145,23979,18824,26046,27093,21458,19109,16257,15377,26422,32912,33012,\r
+33070,8097,33103,33161,33199,33306,33542,33583,33674,13770,33896,34474,18682,\r
+25574,35158,30728,37461,35256,17394,35303,17375,35304,35654,35796,23032,35849,\r
+U,36805,37100,U,37136,37180,15863,37214,19146,36816,29327,22155,38119,38377,\r
+38320,38328,38706,39121,39241,39274,39363,39464,39694,40282,40347,32415,40696,\r
+40739,19620,38215,41619,29090,41727,19857,36882,42443,19868,3228,36798,21953,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,36794,\r
+9392,36793,19091,17673,32383,28502,27313,20202,13540,35628,30877,14138,36480,\r
+6133,32804,35692,35737,31294,26287,15851,30293,15543,22069,22870,20122,24193,\r
+25176,22207,3693,36366,23405,16008,19614,25566,U,6134,6267,25904,22061,23626,\r
+21530,21265,15814,40344,19581,22050,22046,32585,24280,22901,15680,34672,19996,\r
+4074,3401,14010,33047,40286,36120,30267,40005,30286,30649,37701,21554,33096,\r
+33527,22053,33074,33816,32957,21994,31074,22083,21526,3741,13774,22021,22001,\r
+26353,33506,13869,30004,22000,21946,21655,21874,3137,3222,24272,20808,3702,\r
+11362,3746,40619,32090,21982,4213,25245,38765,21652,36045,29174,37238,25596,\r
+25529,25598,21865,11075,40050,11955,20890,13535,3495,20903,21581,21790,21779,\r
+30310,36397,26762,30129,32950,34820,34694,35015,33206,33820,4289,17644,29444,\r
+18182,23440,33547,26771,22139,9972,32047,16803,32115,28368,29366,37232,4569,\r
+37384,15612,42665,3756,3833,29286,7330,18254,20418,32761,4075,16634,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40029,25887,11680,\r
+18675,18400,40316,4076,3594,U,30115,4077,U,24648,4487,29091,32398,40272,19994,\r
+19972,13687,23309,27826,21351,13996,14812,21373,13989,17944,22682,19310,33325,\r
+21579,22442,23189,2425,U,14930,9317,29556,40620,19721,39917,15614,40752,19547,\r
+20393,38302,40926,33884,15798,29362,26547,14112,25390,32037,16119,15916,14890,\r
+36872,21196,15988,13946,17897,1166,30272,23280,3766,30842,32558,22695,16575,\r
+22140,39819,23924,30292,42036,40581,19681,U,14331,24857,12506,17394,U,22109,\r
+4777,22439,18787,40454,21044,28846,13741,U,40316,31830,39737,22494,5996,23635,\r
+25811,38096,25397,29028,34477,3368,27938,19170,3441,U,20990,7951,23950,38659,\r
+7633,40577,36940,31519,39682,23761,31651,25192,25397,39679,31695,39722,31870,\r
+U,31810,31878,39957,31740,39689,U,39963,18750,40794,21875,23491,20477,40600,\r
+20466,21088,15878,21201,22375,20566,22967,24082,38856,40363,36700,21609,38836,\r
+39232,38842,21292,24880,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,26924,21466,39946,40194,19515,38465,27008,20646,30022,5997,\r
+39386,21107,U,37209,38529,37212,U,37201,36503,25471,27939,27338,22033,37262,\r
+30074,25221,1020,29519,31856,23585,15613,U,18713,30422,39837,20010,3284,33726,\r
+34882,U,23626,27072,U,22394,21023,24053,20174,27697,498,20281,21660,21722,\r
+21146,36226,13822,U,13811,U,27474,37244,40869,39831,38958,39092,39610,40616,\r
+40580,29050,31508,U,27642,34840,32632,U,22048,42570,36471,40787,U,36308,36431,\r
+40476,36353,25218,33661,36392,36469,31443,19063,31294,30936,27882,35431,30215,\r
+35418,40742,27854,34774,30147,41650,30803,63552,36108,29410,29553,35629,29442,\r
+29937,36075,19131,34351,24506,34976,17591,U,6203,28165,U,35454,9499,U,24829,\r
+30311,39639,40260,37742,39823,34805,U,U,36087,29484,38689,39856,13782,29362,\r
+19463,31825,39242,24921,24921,19460,40598,24957,U,22367,24943,25254,25145,U,\r
+14940,25058,21418,13301,25444,26626,13778,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23895,35778,36826,36409,U,20697,7494,30982,\r
+21298,38456,3899,16485,U,30718,U,31938,24346,31962,31277,32870,32867,32077,\r
+29957,29938,35220,33306,26380,32866,29830,32859,29936,33027,30500,35209,26572,\r
+30035,28369,34729,34766,33224,34700,35401,36013,35651,30507,29944,34010,13877,\r
+27058,36262,U,35241,U,28089,34753,16401,29927,15835,29046,24740,24988,15569,U,\r
+24695,U,32625,35629,U,24809,19326,21024,15384,15559,24279,30294,21809,6468,\r
+4862,39171,28124,28845,23745,25005,35343,13943,238,26694,20238,17762,23327,\r
+25420,40784,40614,25195,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,\r
+9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,8560,8561,8562,8563,8564,\r
+8565,8566,8567,8568,8569,20022,20031,20101,20128,20866,20886,20907,21241,\r
+21304,21353,21430,22794,23424,24027,12083,24191,U,24400,24417,25908,U,30098,U,\r
+36789,U,168,710,12541,12542,12445,12446,U,U,12293,12294,12295,12540,65339,\r
+65341,10045,12353,12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,\r
+12364,12365,12366,12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,\r
+12377,12378,12379,12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,\r
+12390,12391,12392,12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,\r
+12403,12404,12405,12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,\r
+12416,12417,12418,12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,\r
+12429,12430,12431,12432,12433,12434,12435,12449,12450,12451,12452,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12453,12454,12455,\r
+12456,12457,12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,\r
+12469,12470,12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,\r
+12482,12483,12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,\r
+12495,12496,12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,\r
+12508,12509,12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,\r
+12521,12522,12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,\r
+12534,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,\r
+1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,\r
+1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,\r
+1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,\r
+1097,1098,1099,1100,1101,1102,1103,8679,8632,8633,12751,204,20058,138,20994,\r
+17553,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+40880,20872,40881,30215,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,65506,65508,65287,65282,12849,8470,8481,12443,12444,\r
+11904,11908,11910,11911,11912,11914,11916,11917,11925,11932,11933,11941,11943,\r
+11946,11948,11950,11958,11964,11966,11974,11978,11980,11981,11983,11990,11991,\r
+11998,12003,U,U,U,643,592,603,596,629,339,248,331,650,618,30849,37561,35023,\r
+22715,24658,31911,23290,9556,9574,9559,9568,9580,9571,9562,9577,9565,9554,\r
+9572,9557,9566,9578,9569,9560,9575,9563,9555,9573,9558,9567,9579,9570,9561,\r
+9576,9564,9553,9552,9581,9582,9584,9583,65517,1351,37595,1503,16325,34124,\r
+17077,29679,20917,13897,18754,35300,37700,6619,33518,15560,30780,26436,25311,\r
+18739,35242,672,27571,4869,20395,9453,20488,27945,31364,13824,19121,9491,U,\r
+894,24484,896,839,28379,1055,U,20737,13434,20750,39020,14147,33814,18852,1159,\r
+20832,13236,20842,3071,8444,741,9520,1422,12851,6531,23426,34685,1459,15513,\r
+20914,20920,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,40244,20937,20943,20945,15580,20947,19110,20915,20962,21314,20973,33741,\r
+26942,14125,24443,21003,21030,21052,21173,21079,21140,21177,21189,31765,34114,\r
+21216,34317,27411,U,35550,21833,28377,16256,2388,16364,21299,U,3042,27851,\r
+5926,26651,29653,24650,16042,14540,5864,29149,17570,21357,21364,34475,21374,U,\r
+5526,5651,30694,21395,35483,21408,21419,21422,29607,22386,16217,29596,21441,\r
+21445,27721,20041,22526,21465,15019,2959,21472,16363,11683,21494,3191,21523,\r
+28793,21803,26199,27995,21613,27475,3444,21853,21647,21668,18342,5901,3805,\r
+15796,3405,35260,9880,21831,19693,21551,29719,21894,21929,U,6359,16442,17746,\r
+17461,26291,4276,22071,26317,12938,26276,26285,22093,22095,30961,22257,38791,\r
+21502,22272,22255,22253,35686,13859,4687,22342,16805,27758,28811,22338,14001,\r
+27774,22502,5142,22531,5204,17251,22566,19445,22620,22698,13665,22752,22748,\r
+4668,22779,23551,22339,41296,17016,37843,13729,22815,26790,14019,28249,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,5694,23076,\r
+21843,5778,34053,22985,3406,27777,27946,6108,23001,6139,6066,28070,28017,6184,\r
+5845,23033,28229,23211,23139,14054,18857,U,14088,23190,29797,23251,28577,9556,\r
+15749,6417,14130,5816,24195,21200,23414,25992,23420,31246,16388,18525,516,\r
+23509,24928,6708,22988,1445,23539,23453,19728,23557,6980,23571,29646,23572,\r
+7333,27432,23625,18653,23685,23785,23791,23947,7673,7735,23824,23832,23878,\r
+7844,23738,24023,33532,14381,18689,8265,8563,33415,14390,15298,24110,27274,U,\r
+24186,17596,3283,21414,20151,U,21416,6001,24073,24308,33922,24313,24315,14496,\r
+24316,26686,37915,24333,449,63636,15070,18606,4922,24378,26760,9168,U,9329,\r
+24419,38845,28270,24434,37696,35382,24487,23990,15711,21072,8042,28920,9832,\r
+37334,670,35369,24625,26245,6263,14691,15815,13881,22416,10164,31089,15936,\r
+24734,U,24755,18818,18831,31315,29860,20705,23200,24932,33828,24898,63654,\r
+28370,24961,20980,1622,24967,23466,16311,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,10335,25043,35741,39261,25040,14642,10624,\r
+10433,24611,24924,25886,25483,280,25285,6000,25301,11789,25452,18911,14871,\r
+25656,25592,5006,6140,U,28554,11830,38932,16524,22301,25825,25829,38011,14950,\r
+25658,14935,25933,28438,18984,18979,25989,25965,25951,12414,26037,18752,19255,\r
+26065,16600,6185,26080,26083,24543,13312,26136,12791,12792,26180,12708,12709,\r
+26187,3701,26215,20966,26227,U,7741,12849,34292,12744,21267,30661,10487,39332,\r
+26370,17308,18977,15147,27130,14274,U,26471,26466,16845,37101,26583,17641,\r
+26658,28240,37436,26625,13286,28064,26717,13423,27105,27147,35551,26995,26819,\r
+13773,26881,26880,15666,14849,13884,15232,26540,26977,35402,17148,26934,27032,\r
+15265,969,33635,20624,27129,13913,8490,27205,14083,27293,15347,26545,27336,\r
+37276,15373,27421,2339,24798,27445,27508,10189,28341,15067,949,6488,14144,\r
+21537,15194,27617,16124,27612,27703,9355,18673,27473,27738,33318,27769,15804,\r
+17605,15805,16804,18700,18688,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,15561,14053,15595,3378,39811,12793,9361,32655,26679,27941,\r
+28065,28139,28054,27996,28284,28420,18815,16517,28274,34099,28532,20935,U,U,\r
+33838,35617,U,15919,29779,16258,31180,28239,23185,12363,28664,14093,28573,\r
+15920,28410,5271,16445,17749,37872,28484,28508,15694,28532,37232,15675,28575,\r
+16708,28627,16529,16725,16441,16368,16308,16703,20959,16726,16727,16704,25053,\r
+28747,28798,28839,28801,28876,28885,28886,28895,16644,15848,29108,29078,17015,\r
+28971,28997,23176,29002,U,23708,17253,29007,37730,17089,28972,17498,18983,\r
+18978,29114,35816,28861,29198,37954,29205,22801,37955,29220,37697,22021,29230,\r
+29248,18804,26813,29269,29271,15957,12356,26637,28477,29314,U,29483,18467,\r
+34859,18669,34820,29480,29486,29647,29610,3130,27182,29641,29769,16866,5863,\r
+18980,26147,14021,18871,18829,18939,29687,29717,26883,18982,29753,1475,16087,\r
+U,10413,29792,36530,29767,29668,29814,33721,29804,14128,29812,37873,27180,\r
+29826,18771,19084,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,16735,19065,35727,23366,35843,6302,29896,6536,29966,U,29982,36569,\r
+6731,23511,36524,37765,30029,30026,30055,30062,20354,16132,19731,30094,29789,\r
+30110,30132,30210,30252,30289,30287,30319,30326,25589,30352,33263,14328,26897,\r
+26894,30369,30373,30391,30412,28575,33890,20637,20861,7708,30494,30502,30528,\r
+25775,21024,30552,12972,30639,35172,35176,5825,30708,U,4982,18962,26826,30895,\r
+30919,30931,38565,31022,21984,30935,31028,30897,30220,36792,34948,35627,24707,\r
+9756,31110,35072,26882,31104,22615,31133,31545,31036,31145,28202,28966,16040,\r
+31174,37133,31188,\r
+};\r
+\r
+static const struct dbcs_index big5hkscs_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__big5hkscs_decmap+0,64,121},{__big5hkscs_decmap+58,64,170},{\r
+__big5hkscs_decmap+165,64,254},{__big5hkscs_decmap+356,64,254},{\r
+__big5hkscs_decmap+547,64,253},{__big5hkscs_decmap+737,64,254},{\r
+__big5hkscs_decmap+928,64,254},{__big5hkscs_decmap+1119,64,254},{\r
+__big5hkscs_decmap+1310,64,253},{__big5hkscs_decmap+1500,64,254},{\r
+__big5hkscs_decmap+1691,64,254},{__big5hkscs_decmap+1882,64,254},{\r
+__big5hkscs_decmap+2073,64,254},{__big5hkscs_decmap+2264,64,254},{\r
+__big5hkscs_decmap+2455,64,254},{__big5hkscs_decmap+2646,64,254},{\r
+__big5hkscs_decmap+2837,64,254},{__big5hkscs_decmap+3028,64,254},{\r
+__big5hkscs_decmap+3219,64,254},{__big5hkscs_decmap+3410,64,254},{\r
+__big5hkscs_decmap+3601,64,254},{__big5hkscs_decmap+3792,64,254},{\r
+__big5hkscs_decmap+3983,64,254},{__big5hkscs_decmap+4174,64,254},{\r
+__big5hkscs_decmap+4365,64,254},{__big5hkscs_decmap+4556,64,254},{0,0,0},{0,0,\r
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_decmap+4747,\r
+161,254},{__big5hkscs_decmap+4841,64,254},{__big5hkscs_decmap+5032,64,254},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__big5hkscs_decmap+5223,214,254},{__big5hkscs_decmap+5264,64,254},{\r
+__big5hkscs_decmap+5455,64,254},{__big5hkscs_decmap+5646,64,254},{\r
+__big5hkscs_decmap+5837,64,254},{__big5hkscs_decmap+6028,64,254},{0,0,0},\r
+};\r
+\r
+static const unsigned char big5hkscs_phint_0[] = {\r
+32,5,95,68,15,82,130,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,44,4,0,0,0,0,0,0,0,\r
+0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,4,0,0,0,0,0,0,0,0,0,0,0,0,1,22,0,15,0,0,0,0,0,\r
+32,87,43,247,252,110,242,144,11,0,0,0,192,237,164,15,38,193,155,118,242,239,\r
+222,251,250,247,15,50,68,175,254,239,5,0,0,0,224,251,71,128,193,2,0,132,100,4,\r
+130,64,32,162,130,133,164,145,0,16,1,0,0,0,144,72,12,0,48,0,84,3,48,68,24,19,\r
+53,137,38,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,64,0,32,43,153,32,16,99,40,36,\r
+1,0,0,0,0,80,96,212,0,210,42,24,157,104,53,151,79,216,248,32,196,130,28,40,2,\r
+0,0,0,0,214,81,10,224,0,129,134,22,67,196,53,17,55,96,230,122,109,5,12,61,0,0,\r
+0,0,153,57,128,7,34,254,129,144,24,144,12,116,48,208,160,9,41,21,253,4,0,0,0,\r
+0,223,128,64,8,8,176,219,196,96,237,118,125,249,29,228,211,133,166,205,5,0,0,\r
+0,0,12,0,110,186,9,47,96,84,0,30,120,104,34,112,86,158,37,243,142,7,0,0,0,192,\r
+94,44,188,155,223,93,108,109,4,67,96,54,74,96,216,62,7,196,200,1,0,0,0,160,\r
+177,197,98,11,12,34,62,204,37,184,1,174,237,92,104,13,148,74,181,0,0,0,0,0,\r
+244,3,18,17,16,68,2,53,144,235,14,153,7,209,202,5,130,161,160,0,0,0,0,52,24,\r
+160,137,231,156,91,8,132,3,2,218,144,236,219,135,133,191,162,45,0,0,0,0,118,\r
+58,118,98,130,148,24,1,24,125,254,141,87,39,19,210,91,55,25,12,0,0,0,0,110,\r
+139,33,145,0,0,0,64,0,0,0,2,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,\r
+0,0,0,0,0,0,0,2,0,0,0,0,0,0,142,120,110,95,63,126,221,61,247,252,155,252,174,\r
+210,255,143,107,1,0,0,0,192,159,255,234,186,186,93,188,115,159,250,216,214,\r
+222,37,75,94,151,218,42,1,0,0,0,224,182,153,27,216,116,230,79,21,191,41,230,\r
+255,38,117,109,227,255,155,82,0,0,0,0,80,96,126,111,153,169,80,14,0,128,16,\r
+216,35,0,37,16,144,244,235,117,0,0,0,0,208,219,0,160,152,178,123,6,82,32,152,\r
+22,200,61,9,0,0,1,0,0,0,0,0,0,0,4,40,200,34,0,2,0,0,16,32,130,80,64,48,1,0,16,\r
+0,4,0,0,0,0,74,4,1,16,20,0,128,0,4,255,253,36,\r
+};\r
+\r
+static const unsigned char big5hkscs_phint_12130[] = {\r
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,\r
+0,0,0,128,2,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,\r
+};\r
+\r
+static const unsigned char big5hkscs_phint_21924[] = {\r
+0,0,0,0,0,26,172,248,250,90,192,250,51,0,0,0,0,0,129,0,160,156,130,144,9,1,\r
+180,192,176,3,86,2,160,66,45,136,1,0,0,0,0,146,119,139,96,5,201,33,6,70,56,96,\r
+72,192,180,36,222,132,224,192,36,0,0,0,0,205,80,197,52,192,40,162,173,124,153,\r
+24,88,18,34,196,66,162,83,142,30,0,0,0,128,52,135,11,21,209,64,250,61,0,4,210,\r
+5,72,8,22,230,28,165,0,8,0,0,0,192,45,22,20,128,24,58,212,25,136,28,138,4,\r
+};\r
+\r
+static const DBCHAR __big5hkscs_bmp_encmap[26401] = {\r
+50904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34905,34903,N,N,N,N,N,N,\r
+34909,34907,M,N,N,N,N,N,N,N,34913,34911,N,N,N,N,N,N,N,N,N,N,N,N,34922,34920,N,\r
+N,N,N,N,N,34927,34925,M,N,34931,34929,N,N,N,N,34935,34933,N,N,N,N,51451,34939,\r
+34937,N,34978,34902,34919,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34906,34924,N,N,N,N,\r
+N,N,34908,34926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34928,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51452,34910,34932,N,N,N,N,N,51450,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34936,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,34904,34921,N,34930,34912,34934,N,34938,N,34940,N,34941,N,34942,N,34977,\r
+51446,34923,N,N,51448,N,N,N,N,N,N,51447,N,N,N,N,N,34984,N,N,N,N,N,N,N,N,51454,\r
+N,N,N,N,N,N,N,N,N,N,51449,N,N,N,N,N,N,N,N,N,N,N,N,N,51445,N,N,N,N,N,N,51453,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50905,51193,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+51187,51188,51189,51190,51191,51192,51194,51195,51196,51197,51198,51264,51265,\r
+51266,51267,51268,51269,51270,51271,51272,51273,51274,51275,51276,51277,51278,\r
+51279,51280,51281,51282,51283,51284,51285,51286,51287,51288,51289,51290,51292,\r
+51293,51294,51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,\r
+51306,51307,51308,51309,51310,51311,51312,51313,51314,51315,51316,51317,N,\r
+51291,34915,34980,34917,34982,51410,N,N,N,N,N,N,N,N,N,N,51411,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50869,50870,\r
+50871,50872,50873,50874,50875,50876,50877,50878,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,51319,51320,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,51318,34985,34986,50849,50850,50851,\r
+50852,50853,50854,50855,50856,50857,50858,N,N,N,N,N,N,N,N,N,N,50859,50860,\r
+50861,50862,50863,50864,50865,50866,50867,50868,63993,63992,63974,63983,63965,\r
+63976,63985,63967,63980,63989,63971,63982,63991,63973,63977,63986,63968,63979,\r
+63988,63970,63975,63984,63966,63981,63990,63972,63978,63987,63969,63994,63995,\r
+63997,63996,50918,51414,N,N,N,51415,N,51416,51417,51418,N,51419,N,51420,51421,\r
+N,N,N,N,N,N,N,51422,N,N,N,N,N,N,51423,51424,N,N,N,N,N,N,N,51425,N,51426,N,N,\r
+51427,N,51428,N,51429,N,N,N,N,N,N,N,51430,N,N,N,N,N,51431,N,51432,N,N,N,N,N,N,\r
+N,51433,N,N,N,51434,N,51435,51436,N,51437,N,N,N,N,N,N,51438,51439,N,N,N,N,N,N,\r
+51440,N,N,N,N,51441,50893,50912,50913,50914,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,50919,50920,50921,50922,50923,50924,50925,50926,50927,50928,50929,50930,\r
+50931,50932,50933,50934,50935,50936,50937,50938,50939,50940,50941,50942,51008,\r
+51009,51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,\r
+51022,51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,\r
+51035,51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,\r
+51048,51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,\r
+51061,51062,51063,51064,51065,51066,N,N,N,N,N,N,N,51412,51413,50908,50909,N,N,\r
+51067,51068,51069,51070,51105,51106,51107,51108,51109,51110,51111,51112,51113,\r
+51114,51115,51116,51117,51118,51119,51120,51121,51122,51123,51124,51125,51126,\r
+51127,51128,51129,51130,51131,51132,51133,51134,51135,51136,51137,51138,51139,\r
+51140,51141,51142,51143,51144,51145,51146,51147,51148,51149,51150,51151,51152,\r
+51153,51154,51155,51156,51157,51158,51159,51160,51161,51162,51163,51164,51165,\r
+51166,51167,51168,51169,51170,51171,51172,51173,51174,51175,51176,51177,51178,\r
+51179,51180,51181,51182,51183,51184,51185,51186,N,N,N,N,N,50915,50906,50907,\r
+34880,34881,34882,34883,34884,34886,34889,34890,34893,34895,34896,34897,34898,\r
+34900,34901,51321,51409,37495,N,N,N,N,N,N,N,N,N,N,38623,N,N,N,N,N,N,N,N,N,\r
+36084,N,35285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37837,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,39903,N,N,N,N,N,N,64104,N,N,35290,36697,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,35291,N,N,36701,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35292,N,N,N,N,N,\r
+N,N,N,N,38647,N,N,N,N,N,N,N,N,N,N,N,N,35546,N,N,N,N,35804,N,N,N,N,N,N,38875,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40531,N,N,N,N,40362,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,39914,35438,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35784,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35304,N,35306,N,N,N,N,N,35915,N,N,N,N,N,N,\r
+N,64368,N,N,N,N,N,N,N,N,N,N,N,35309,N,N,38109,N,35310,N,N,N,N,40628,35539,N,N,\r
+N,N,N,N,N,N,N,N,N,37595,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38107,35321,N,N,N,\r
+N,N,N,N,N,64378,N,N,N,35323,N,N,N,N,N,N,N,40700,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,35324,N,35263,N,N,N,35326,N,35302,N,N,40262,N,N,N,40430,N,N,N,41086,N,N,N,\r
+41064,N,N,N,N,39145,N,35688,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36349,35774,\r
+40921,N,N,N,N,N,N,N,35563,N,N,40919,35690,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40028,N,\r
+35761,N,N,N,N,N,N,N,N,64350,N,34672,N,N,N,N,N,N,N,40435,N,N,N,N,N,N,N,41168,N,\r
+N,N,64614,N,N,N,N,37609,N,N,N,N,N,N,N,N,39660,36779,64072,N,N,N,N,36421,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40047,N,36188,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40670,N,N,N,N,N,N,35311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38633,N,N,N,N,N,N,N,N,N,N,40635,N,N,N,N,38110,N,40632,N,N,N,38842,64357,N,\r
+N,N,38358,N,N,N,40123,N,N,38874,N,N,N,N,36677,N,64381,37208,65124,N,38998,\r
+39757,N,N,N,N,N,N,N,N,N,N,37723,38343,N,38887,N,N,N,N,N,N,37721,N,N,N,37365,\r
+38840,N,N,64930,64438,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37626,37719,N,35750,N,N,N,N,\r
+64441,N,38832,N,N,64964,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40097,N,N,N,N,N,37362,\r
+37369,N,36849,N,N,N,N,N,N,38725,38995,N,N,65144,N,64449,37457,N,N,N,N,N,N,\r
+40365,N,N,N,N,N,64876,N,N,64107,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,39874,N,N,N,N,N,N,N,N,N,N,N,N,39547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35680,N,N,N,N,N,N,N,N,37707,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39613,N,N,N,N,37303,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36171,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38324,N,N,N,N,N,65221,N,N,40688,36196,N,N,N,N,N,N,N,N,N,\r
+37481,N,N,N,N,N,N,36199,N,N,N,N,N,N,N,N,N,N,N,N,64490,N,N,N,N,N,N,N,N,64495,N,\r
+36200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,37867,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64578,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37222,N,N,N,N,N,N,N,N,\r
+64205,N,N,N,N,37853,N,N,36178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35788,36205,N,N,N,N,N,N,N,N,N,N,N,36206,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,38568,N,N,N,N,N,N,N,N,N,N,64678,N,N,N,N,N,N,N,N,N,N,N,\r
+N,36207,N,N,N,N,N,N,N,N,N,N,N,N,N,36208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,64612,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36083,N,N,N,N,N,N,N,36960,N,\r
+N,N,N,N,N,N,N,36212,38851,N,N,N,N,N,N,N,35536,N,N,N,N,N,N,37492,N,39870,N,N,N,\r
+N,N,40136,N,N,40122,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36216,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40633,N,N,N,N,N,38234,\r
+N,N,37300,N,N,N,N,N,N,35400,N,N,N,N,N,N,N,N,N,N,N,36221,N,N,35453,N,N,35522,\r
+64842,N,36257,N,N,35537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64692,35655,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37796,40666,N,N,N,N,N,N,N,N,N,35409,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36262,N,N,N,N,N,N,40645,N,N,N,N,64708,N,N,N,N,41080,N,\r
+38069,N,N,N,N,N,N,N,64706,35435,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36267,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36269,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64585,N,37825,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36975,N,36272,N,N,N,N,N,N,N,N,38014,37114,N,N,N,N,N,N,N,N,N,N,\r
+38009,N,N,N,N,N,N,N,N,36274,N,N,N,N,N,N,N,N,64750,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39291,N,N,N,N,N,N,N,N,36276,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36279,N,\r
+N,N,N,N,N,N,37299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36283,36282,N,N,N,N,N,N,N,N,\r
+36284,36932,N,N,N,64844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34635,37860,N,\r
+N,37856,N,N,N,N,N,N,N,64851,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,36291,N,39864,N,N,N,64496,N,37865,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37878,\r
+N,N,N,N,N,36293,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36298,N,N,N,N,N,36300,64861,37813,\r
+64865,N,N,N,40184,N,N,N,37458,N,N,41192,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35926,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,36310,N,38848,N,N,N,41182,N,N,N,N,38866,N,N,N,N,N,64165,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64931,N,N,N,36315,36074,36527,N,N,N,N,N,N,N,N,N,37301,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64841,N,N,N,N,N,N,N,N,64977,N,N,N,N,N,N,N,\r
+N,N,N,36331,N,N,N,N,N,38854,N,64974,N,N,37116,N,N,N,N,N,N,N,N,N,N,N,N,N,64601,\r
+N,N,38614,N,N,N,N,N,N,38853,36335,N,N,N,N,38871,N,N,N,N,N,36336,N,N,N,N,N,N,N,\r
+38566,N,N,N,N,N,N,N,64447,N,N,36063,N,36339,N,N,N,N,37961,N,36341,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,39026,N,N,N,N,N,N,N,36459,N,N,N,N,N,N,64253,N,N,N,N,\r
+N,N,N,N,N,N,36688,N,N,N,N,N,N,40396,64613,N,35908,N,N,39278,38049,N,N,N,N,N,\r
+36707,N,N,N,N,N,N,N,41178,N,N,N,N,N,N,N,N,N,N,N,37459,65001,N,N,40373,N,N,N,N,\r
+N,N,N,39033,34666,N,N,40285,N,N,N,N,36195,38505,40816,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64618,N,N,35527,N,N,N,N,35287,N,N,N,N,N,N,N,N,N,N,N,N,65101,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40669,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,65275,39100,64204,N,N,38320,N,N,N,37988,N,N,N,N,N,N,37743,N,N,N,N,N,N,\r
+38073,N,N,38380,N,N,N,N,37358,N,N,39107,N,38390,N,N,N,36861,39109,N,N,N,N,\r
+38758,65134,N,N,38877,36010,N,N,37586,N,N,38753,39115,N,N,N,N,38384,N,38749,N,\r
+37347,N,N,N,N,39116,N,N,37993,39117,N,N,N,N,N,39118,N,38396,N,N,38051,38498,N,\r
+N,N,65206,N,37987,36167,N,N,N,N,N,N,39120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39121,N,N,N,N,38005,64224,N,N,N,N,N,N,N,N,N,38002,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39126,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,35568,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39129,N,N,N,N,N,N,N,36186,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,39131,N,N,N,N,39133,N,N,N,N,N,N,N,N,39080,N,N,N,N,N,N,N,35437,N,N,N,N,N,\r
+N,N,N,N,N,N,35579,35502,64457,N,N,N,N,35933,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,39140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39142,N,N,N,N,\r
+N,N,N,N,N,N,N,39144,N,N,N,N,N,N,N,N,N,N,N,N,N,35405,N,N,N,37463,N,N,N,N,N,N,N,\r
+N,N,N,38367,N,N,41132,N,N,N,N,39147,N,N,N,N,39148,N,36035,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39156,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35512,N,N,N,40679,N,N,N,N,\r
+N,N,N,N,38076,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64721,N,N,N,N,N,N,40134,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36170,N,40574,36164,39166,65000,N,N,N,N,\r
+39232,N,N,N,N,38089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,38099,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39238,N,N,N,N,37056,N,38097,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36174,N,N,38259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37826,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39240,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39243,N,N,N,N,N,36437,N,N,N,N,39246,N,N,N,N,N,N,N,N,N,\r
+N,N,36606,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36191,N,36441,N,N,N,N,N,N,N,N,N,\r
+38124,38127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35936,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36724,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,39253,N,N,N,N,N,N,N,N,N,38212,N,N,N,N,N,N,N,N,N,N,N,36043,\r
+N,N,N,39254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39257,N,N,N,N,N,N,N,39259,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36036,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64069,N,N,N,\r
+37047,N,N,38723,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38349,N,N,N,N,N,N,38857,64848,\r
+36537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38342,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39271,N,N,\r
+36067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35513,N,N,\r
+N,N,N,N,36348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35446,N,N,N,N,N,\r
+40273,N,N,N,N,N,N,N,N,N,N,N,N,N,39283,N,N,34624,N,40271,39290,38244,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39329,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39333,N,N,N,N,N,\r
+N,N,39335,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,36589,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39341,N,51326,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,37998,36720,N,64208,N,N,N,N,N,N,N,N,N,N,N,N,N,39347,N,N,N,N,N,N,\r
+41043,N,N,N,N,N,36190,N,N,38492,N,N,36064,N,64890,N,N,N,N,N,N,N,N,38910,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37565,36189,38909,N,N,N,N,36708,N,N,N,N,64759,38242,\r
+38861,40548,N,N,N,N,N,N,N,37452,36553,39356,N,N,N,N,40357,N,36692,N,N,N,N,N,N,\r
+N,N,N,N,36732,N,N,N,N,36181,N,36514,N,N,N,N,N,N,N,N,N,36730,N,N,N,N,N,N,38830,\r
+N,N,N,N,38600,N,N,36068,N,N,N,N,39363,N,37078,N,40126,N,N,N,36726,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,38000,64331,N,N,64970,N,N,36079,N,N,N,36551,N,N,N,N,36180,41209,\r
+N,N,N,N,N,N,N,36777,N,N,36177,N,N,N,N,N,N,N,N,N,39367,34628,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+34627,N,N,N,N,N,N,N,N,N,N,N,N,34631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34648,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40671,\r
+36185,34626,N,N,39374,N,N,N,N,N,N,N,N,36794,N,N,N,N,N,36843,N,39375,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36802,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37577,N,N,N,N,N,38876,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34653,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36165,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38323,40057,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38322,N,\r
+36172,36827,N,N,N,N,39907,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,34636,N,N,N,N,N,N,N,N,N,N,N,N,N,34637,N,N,N,N,N,N,N,N,N,40570,34647,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,39918,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39390,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35410,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,39393,N,N,N,N,N,N,35431,35765,N,N,N,N,N,N,N,N,N,N,35500,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39401,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64458,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38878,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38353,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39413,64586,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39849,N,N,N,N,N,N,N,N,N,N,N,N,64476,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,65110,N,N,N,N,N,40612,N,N,N,N,N,N,40265,38363,N,N,N,N,N,N,N,N,N,N,35269,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39416,N,N,N,N,N,N,38500,N,N,N,N,36949,N,N,38612,N,N,N,\r
+N,N,N,N,38780,N,N,N,N,N,N,38477,N,38881,N,N,N,N,N,N,39496,N,N,N,N,N,N,N,N,N,N,\r
+N,39497,N,65149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37034,N,N,N,N,39504,N,N,N,N,\r
+N,N,N,37703,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36568,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37065,N,N,N,N,N,39509,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37052,N,N,N,N,N,39512,N,35768,37077,N,N,N,N,N,N,N,N,N,N,N,N,N,38465,N,N,\r
+N,N,N,N,39514,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39516,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,38850,N,N,N,N,N,N,N,N,N,N,N,N,N,34652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35515,N,N,N,39850,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37109,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39520,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,37189,35928,N,N,N,N,N,N,N,N,39523,N,N,N,N,N,N,35913,N,N,N,N,N,N,N,N,\r
+N,N,N,35766,N,N,N,N,N,N,N,N,N,N,64719,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38507,\r
+39534,N,37199,N,N,N,N,N,N,N,N,38726,N,N,41190,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37591,N,38517,N,N,37844,N,N,37307,38521,N,N,N,N,N,39536,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38520,37325,N,40010,41071,N,N,41066,N,\r
+N,N,N,N,N,37215,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,34625,N,N,N,N,N,N,N,N,40869,N,N,35258,N,34639,N,N,N,N,N,N,34638,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,34645,N,N,N,40653,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39545,N,N,N,N,N,N,N,N,N,36082,N,N,N,36183,N,40398,N,N,N,36050,N,N,N,34649,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40307,N,N,N,N,N,N,N,N,\r
+N,38585,N,38588,N,N,N,N,N,N,40145,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35255,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40686,34633,N,N,N,N,N,N,N,N,N,N,\r
+64323,34651,N,40649,N,N,N,N,N,N,64467,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37294,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,36184,34630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36182,N,N,N,N,N,N,N,\r
+40312,N,N,N,N,N,N,N,N,N,N,40315,40627,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40626,N,40406,N,N,N,N,39247,N,N,35278,N,N,N,35776,N,40900,N,35796,N,N,35954,\r
+N,N,N,N,N,N,50879,35833,N,N,N,N,N,35142,N,50880,N,N,N,N,N,N,N,N,N,64229,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,51323,35782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40023,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,39675,N,N,N,N,N,N,N,35280,35279,N,N,N,50881,N,35281,N,\r
+35298,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37502,N,40378,N,N,N,N,N,50882,N,N,35951,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64504,N,N,N,35783,37483,N,N,35282,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,40911,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40361,35283,N,N,39394,N,N,N,N,N,N,N,N,N,37479,37540,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35955,N,N,35150,N,N,N,N,N,N,N,N,N,N,N,N,N,35151,37496,N,N,N,N,N,N,\r
+N,N,37302,N,N,N,N,35284,N,40914,N,N,N,N,N,N,N,N,37543,N,N,38306,N,N,N,N,N,\r
+37486,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38634,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37487,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37539,N,N,N,N,N,35152,N,N,64087,N,N,N,N,39014,N,\r
+N,N,36088,N,N,N,N,N,N,N,N,35286,N,N,N,N,N,N,N,N,N,N,39090,N,N,N,37547,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38622,37548,N,N,N,N,N,N,N,N,N,N,35952,N,\r
+40814,N,N,N,N,N,N,36594,N,N,N,40812,35288,N,N,N,N,64089,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37544,N,N,N,N,N,37219,N,N,\r
+N,N,N,N,35904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40819,N,\r
+37549,N,N,N,N,N,N,N,N,N,N,N,N,N,39913,N,N,N,N,N,37545,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,37546,N,N,N,N,N,N,35289,N,N,N,N,N,N,N,64854,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,40872,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35953,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37537,N,N,37091,N,N,N,N,N,N,N,N,41126,N,N,N,N,\r
+N,38059,N,64626,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38852,N,N,N,N,N,N,N,37550,\r
+64103,N,N,N,N,N,N,N,N,N,N,N,37538,64105,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37480,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35153,N,N,N,N,N,N,N,N,N,64111,N,N,N,N,N,N,N,N,N,\r
+64113,N,N,N,N,N,N,N,N,N,35154,N,N,N,N,37978,N,N,N,N,N,N,N,N,50883,N,N,N,35293,\r
+N,51362,N,N,N,N,N,N,N,N,N,N,N,N,N,50884,N,N,N,40530,N,35155,N,N,N,N,N,N,N,N,N,\r
+N,40533,37562,N,N,50885,N,N,35931,N,N,N,64125,64168,39528,64071,N,N,64126,N,N,\r
+N,N,N,N,N,N,N,N,37563,N,N,N,64950,N,64162,N,N,N,N,N,64163,N,64164,39860,64166,\r
+N,N,N,N,N,N,N,35295,N,N,N,64987,N,N,64169,N,35156,N,N,N,N,N,N,N,N,64171,N,N,N,\r
+N,N,N,64634,N,N,N,N,N,N,N,35296,N,40783,51325,N,N,35297,N,N,N,N,N,64176,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40909,41191,N,N,N,N,N,64177,35238,N,N,N,N,N,N,\r
+N,N,N,N,N,N,40698,N,N,N,N,N,N,N,64178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64180,N,37572,N,N,N,N,N,N,40815,N,N,N,N,N,N,N,35760,N,N,N,N,N,N,N,\r
+N,N,N,40876,N,N,N,N,N,35299,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39891,\r
+35300,N,N,N,64181,N,N,N,N,N,40917,N,N,N,N,N,N,35157,N,N,37573,N,N,N,35158,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64179,N,N,N,64182,N,N,N,N,N,N,N,N,N,N,N,64183,N,N,N,N,N,N,\r
+40668,N,N,N,64452,40817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64186,37575,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50886,39500,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35944,N,N,35301,N,N,N,N,40829,N,N,N,N,N,\r
+41129,64196,N,N,N,N,50887,N,N,35159,N,N,N,N,N,N,64170,N,N,N,N,N,N,N,N,N,N,N,\r
+35160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35811,N,35681,N,N,N,N,39665,N,N,40631,N,\r
+50888,N,N,N,64209,N,N,N,N,N,N,64210,N,N,N,N,N,N,N,N,40634,64212,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64217,N,N,N,N,N,N,N,N,N,N,N,N,64219,N,40160,N,N,N,\r
+64503,N,64506,35303,41082,64220,N,N,64221,N,35305,N,N,N,N,N,50889,N,N,N,N,N,N,\r
+N,N,N,N,64226,35307,N,N,64227,N,N,N,N,N,N,37064,N,N,N,37594,35161,40181,N,N,N,\r
+N,N,35162,64231,40866,N,N,N,N,N,64234,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64237,36781,N,N,N,N,N,N,64345,64239,38639,N,40428,N,N,N,40394,N,N,N,N,N,N,\r
+64877,N,35308,N,N,N,N,N,N,N,N,N,N,N,64324,N,N,40418,N,35957,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40640,N,40534,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,40825,39623,N,N,64244,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,39073,N,N,N,N,N,N,N,N,N,64248,N,N,N,35312,40519,N,N,40439,N,N,N,N,40915,\r
+N,39626,N,N,N,N,35313,64249,N,N,N,N,N,N,N,N,N,N,N,N,N,36442,N,35314,N,N,N,N,\r
+35315,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37469,35665,37600,N,N,35316,N,N,N,N,N,\r
+N,N,N,N,40916,N,N,N,N,N,N,N,N,35449,N,N,N,N,N,N,N,N,N,N,N,35317,38823,N,N,N,N,\r
+N,N,N,N,N,N,37818,N,N,N,N,N,40536,N,N,N,N,35318,N,N,N,N,N,40535,N,N,N,N,35319,\r
+N,35393,N,N,35320,N,N,64241,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35322,N,N,N,\r
+N,N,N,N,64322,N,64191,N,N,N,N,N,N,N,N,N,64419,N,N,N,N,N,N,N,N,N,64247,N,N,N,N,\r
+N,N,N,N,N,N,N,40526,N,38108,N,N,N,N,N,38362,40440,40810,N,N,N,N,N,35511,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64326,N,N,N,N,N,N,N,N,N,35398,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64327,N,N,N,N,N,N,37192,N,N,N,37598,N,N,N,N,35667,40438,N,\r
+39898,N,N,N,N,40318,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35325,39396,N,N,\r
+N,N,N,40515,N,N,N,N,N,N,N,N,N,N,N,40425,N,36690,N,N,N,40437,40432,N,N,N,39399,\r
+N,N,N,N,N,35773,40431,N,N,N,N,N,N,N,N,N,N,N,40887,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40400,N,40939,36265,40399,39137,N,40421,N,N,N,N,N,N,N,40392,N,N,N,N,N,N,N,N,N,\r
+64335,N,N,N,N,N,N,N,N,N,N,N,40427,N,N,N,N,N,N,N,N,N,64340,N,64341,39586,N,\r
+35542,N,39519,N,N,N,N,N,N,N,N,40693,N,N,N,36791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39634,40554,40680,N,N,N,N,N,N,N,N,N,N,N,N,35775,37314,40290,\r
+N,N,N,N,N,N,37472,N,N,N,N,N,N,N,N,N,N,N,37470,37313,N,35525,N,N,38819,N,N,N,N,\r
+N,N,N,N,N,N,35692,N,36222,N,N,N,N,N,N,N,40020,N,N,N,N,N,40381,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,40133,N,N,N,N,N,N,N,N,N,N,N,35163,N,N,N,N,N,N,N,N,\r
+N,N,64348,N,64347,N,64343,N,N,N,N,N,N,N,N,N,34661,N,39111,64346,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40174,N,N,N,N,N,N,N,37602,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,38055,N,N,N,N,N,N,N,N,N,N,36044,N,39892,N,N,64356,64374,N,N,\r
+64352,N,N,N,N,N,N,N,N,N,N,N,N,N,39397,N,N,39618,N,N,N,37371,N,N,N,41075,N,N,N,\r
+N,N,N,N,40818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40908,N,N,N,39077,37608,N,N,\r
+N,N,N,N,N,N,39868,N,38643,N,N,37607,N,N,64615,N,N,N,N,N,N,N,N,N,N,N,35709,N,N,\r
+N,N,39924,N,N,N,N,N,40695,N,N,40641,N,N,N,N,N,N,N,N,N,39279,N,N,N,N,N,N,38641,\r
+N,N,36417,N,N,N,N,N,38218,N,N,N,38886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38645,N,N,N,\r
+N,N,37606,40770,N,N,N,N,N,N,N,64359,N,N,N,N,N,N,N,N,39337,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,64230,64361,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38885,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,38525,N,N,N,64364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39330,N,N,N,N,N,\r
+39611,N,N,N,39525,N,N,37966,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64366,N,N,\r
+39391,N,N,N,N,N,N,N,N,N,39139,N,N,37460,N,N,N,N,N,38523,35503,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35959,N,N,N,N,N,N,35759,40637,N,N,\r
+N,N,N,N,N,N,N,N,N,N,40678,N,N,64367,N,N,N,N,N,36577,N,N,N,N,39805,40062,N,N,N,\r
+N,63961,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37610,N,N,N,N,35960,N,N,N,N,N,N,N,N,N,N,\r
+N,64370,N,N,N,64369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35164,N,39152,38642,N,N,N,N,\r
+N,N,N,64372,35777,N,35165,35294,N,35166,N,N,50890,N,N,N,N,N,N,65090,N,N,N,N,N,\r
+N,N,N,N,N,N,34664,N,64379,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35167,N,35168,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,39885,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40403,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38988,N,N,N,N,N,N,N,N,N,N,38738,N,N,N,N,N,38339,N,N,N,N,\r
+39862,N,N,N,N,N,N,N,N,N,N,N,N,39609,N,N,N,38835,N,N,N,N,N,N,40820,37617,N,N,N,\r
+N,N,N,36090,N,N,N,N,38879,N,N,N,N,64422,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64427,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39031,N,N,N,38996,38341,N,N,N,N,N,N,N,40277,\r
+64434,38270,N,N,N,N,N,N,N,N,38722,N,38118,N,N,N,N,37621,N,N,N,N,N,N,N,36037,N,\r
+N,N,N,N,N,37629,N,N,64418,N,N,40017,N,N,38121,39004,37616,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,37964,N,N,N,N,N,N,N,37227,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35704,N,N,N,\r
+N,38114,N,N,N,N,N,N,N,38991,N,64437,N,N,N,N,37489,N,N,37733,N,N,39003,N,N,\r
+38992,N,N,N,N,N,N,N,38844,N,N,N,N,37619,N,N,37696,38989,N,N,N,38258,N,65007,N,\r
+N,N,N,N,N,N,N,64961,N,N,N,N,64442,N,N,37611,N,N,N,N,N,N,64627,38839,N,N,34671,\r
+N,N,N,N,N,N,64436,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37031,N,N,N,N,\r
+N,N,N,N,N,N,38721,37620,N,34674,N,64444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38263,\r
+N,N,N,N,N,N,N,N,N,N,N,40674,N,36728,N,N,N,N,N,N,N,63964,N,N,N,38514,40629,N,N,\r
+N,38475,N,N,N,36012,N,N,N,N,N,N,N,N,N,41210,N,N,N,N,N,N,N,N,N,N,N,38261,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37082,N,N,37735,N,65188,N,N,N,37087,N,N,N,\r
+N,37716,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35169,N,35764,N,N,N,N,\r
+40384,N,N,N,N,N,N,36424,N,64453,N,N,N,N,N,64455,N,N,N,50891,N,64121,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,40551,N,N,N,N,N,36057,N,N,N,N,N,N,64466,35170,35171,N,N,N,N,N,\r
+N,N,N,N,N,64637,N,N,N,N,N,N,N,N,N,N,N,N,34675,N,N,N,N,N,N,N,N,N,N,N,40811,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64460,N,65198,N,N,N,34669,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64465,N,N,N,N,N,N,N,N,N,N,N,64373,64468,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64470,64472,N,N,N,N,N,N,N,35677,N,37708,N,39650,N,N,35785,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64475,40905,\r
+N,N,N,N,N,N,N,N,40772,N,N,N,N,N,N,N,N,N,N,39149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36073,N,N,N,N,N,N,N,N,N,N,N,N,64477,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,36338,35172,N,65010,N,37709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64487,N,N,N,N,N,N,41202,39016,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40792,N,N,N,36070,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36211,N,N,N,64478,N,N,N,N,N,\r
+64479,N,N,N,N,N,35912,N,N,N,N,N,N,34676,64483,N,N,N,N,36264,N,N,64484,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40053,N,N,39032,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36192,N,N,N,N,N,N,N,64485,N,36193,N,N,N,N,N,N,N,N,N,N,N,N,N,36194,41121,N,N,N,\r
+40000,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39085,N,N,N,40682,N,N,N,36076,N,\r
+N,36052,N,N,N,N,N,N,N,N,N,40171,N,N,N,N,N,64480,N,N,40785,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36197,N,N,N,N,N,N,40177,N,N,N,N,N,N,N,N,N,N,64600,N,N,\r
+36198,N,N,N,N,N,N,N,38484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64488,N,N,\r
+N,50892,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40910,64508,N,39652,\r
+N,N,N,N,N,N,40821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64497,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36201,N,N,N,N,N,37711,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37710,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64500,N,N,N,N,50894,N,N,N,64451,N,N,35173,N,N,N,N,N,N,N,N,N,N,N,35962,N,\r
+N,N,N,N,N,35963,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,36202,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37715,N,N,40443,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64509,N,N,N,36953,64576,N,\r
+64577,64579,37729,64582,37730,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36203,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64588,36094,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,38328,N,N,50896,35786,N,N,N,N,N,N,N,N,N,N,39034,N,N,N,N,50897,N,\r
+64593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64596,N,N,N,N,N,N,N,N,64175,N,N,N,N,N,N,N,\r
+36204,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64097,N,\r
+N,64599,N,N,N,N,N,N,N,N,N,39792,N,N,N,N,N,N,N,N,41041,N,N,N,N,N,N,N,35964,N,\r
+35787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37742,N,N,N,64725,64681,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,64609,N,N,N,N,N,N,N,N,N,35174,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64203,N,N,N,N,N,N,N,63962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37754,N,41184,N,N,N,N,N,N,37739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64619,N,N,N,N,N,41180,N,N,37992,N,N,N,N,N,N,\r
+N,N,N,N,N,64621,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,36209,N,N,N,N,N,N,64868,N,N,N,N,39354,N,N,N,39632,39521,41189,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41051,38572,N,N,N,N,38720,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40689,N,N,N,N,N,N,N,N,35917,N,N,N,N,N,N,N,N,N,N,N,N,N,40830,N,N,N,N,N,N,N,N,\r
+N,N,N,N,36210,N,N,N,N,64630,N,N,N,N,N,N,N,N,N,N,N,N,N,38569,N,N,N,N,N,N,N,N,\r
+41070,N,N,64682,N,N,N,64461,N,N,N,64628,N,N,N,N,N,N,N,N,N,N,41076,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,41073,N,N,N,64633,N,N,N,N,N,64636,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40016,N,N,37753,37752,N,N,41181,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,36213,N,36214,N,N,N,N,N,N,37748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36215,64677,\r
+N,N,64674,N,N,N,N,N,N,37059,N,N,N,N,N,N,N,41081,36217,N,N,N,N,N,N,N,N,N,N,\r
+35836,N,41078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35789,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40948,N,N,40890,N,N,N,N,N,N,N,N,N,N,36218,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40517,N,N,N,N,N,N,37808,N,41077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39750,N,64686,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64688,N,N,N,N,N,N,N,N,N,\r
+64081,N,N,N,N,N,36219,36220,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40662,N,\r
+N,37804,N,N,N,40795,N,37801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41084,N,N,N,N,N,N,N,64690,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35521,N,N,N,N,N,40884,N,N,N,N,N,N,N,N,N,N,N,64684,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40524,\r
+N,N,N,N,N,N,N,36805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37805,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40387,N,N,N,36258,N,N,N,40266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64694,N,N,\r
+36259,40523,N,40525,36260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35581,N,N,N,N,N,64693,N,64707,37810,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36261,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37793,N,N,N,N,N,N,N,N,N,N,35526,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,35419,N,N,N,35149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,65236,N,N,N,N,35448,N,37803,N,N,N,N,N,N,N,N,N,36263,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,40773,N,N,N,N,N,N,N,N,N,35414,N,N,N,64703,N,N,N,64704,N,36582,\r
+N,N,35492,35139,N,N,N,N,N,N,37875,N,N,N,N,N,N,N,N,N,N,N,N,64683,40610,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,40391,N,N,N,50898,35790,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,64709,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64715,N,N,N,N,N,N,N,N,\r
+N,N,N,37811,N,64714,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64713,36268,\r
+N,64454,35175,N,35966,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64717,N,N,N,N,N,N,N,N,40179,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64720,N,N,38331,N,N,N,N,N,N,N,N,N,N,N,64723,N,N,64724,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36270,64727,N,N,N,N,N,37851,N,N,N,N,\r
+65123,N,N,N,N,N,N,N,N,N,N,N,N,37845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64730,N,N,N,39793,N,N,64733,N,34660,N,N,N,N,N,36271,N,N,N,64242,N,N,N,N,N,N,N,\r
+N,N,N,N,37848,N,N,N,64735,N,N,N,37843,N,N,N,N,N,N,N,64737,N,N,N,N,N,N,N,N,N,\r
+36470,N,N,N,N,N,N,N,64610,N,N,N,N,N,N,N,N,37841,N,N,N,36273,N,N,N,N,N,N,N,\r
+39001,N,N,N,N,N,N,N,N,N,64338,N,N,N,N,N,N,N,N,64339,N,N,N,N,N,64333,N,N,40127,\r
+N,N,N,N,N,N,N,N,39794,N,N,N,N,N,N,N,N,N,N,N,N,N,64336,37822,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36059,N,N,N,N,N,N,N,N,N,40433,64747,N,N,N,N,N,N,\r
+N,N,N,41147,N,39806,N,N,N,N,N,N,N,36275,N,N,35922,N,N,N,N,39656,N,N,N,N,N,N,\r
+36572,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40185,N,N,N,N,N,N,N,N,N,N,N,N,N,64080,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39143,64755,N,N,N,N,\r
+64754,N,N,N,36042,N,N,34677,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,37861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39513,N,N,N,36277,N,N,N,N,\r
+N,N,N,64845,N,N,N,N,64862,N,N,N,N,N,N,N,N,N,N,N,N,N,36733,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,38215,64758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37456,N,N,N,N,35176,36278,64763,41085,39164,35177,N,N,\r
+N,N,N,N,N,N,65103,N,N,37462,N,N,N,N,N,N,N,N,N,N,64201,N,N,37864,N,N,N,64760,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40163,64937,N,N,N,N,N,N,64580,N,N,N,N,N,N,\r
+N,N,38464,N,N,36280,N,N,N,N,N,N,N,N,N,N,39754,36793,N,N,N,N,N,N,64766,N,N,N,N,\r
+N,N,N,35178,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36281,\r
+N,N,N,37246,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37876,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64380,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37863,N,N,38895,N,N,N,65098,N,N,N,N,N,\r
+64837,N,38565,N,N,N,N,65248,64840,64839,65266,65130,N,N,N,N,N,36285,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39841,36002,39607,36604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40865,N,N,N,N,N,N,N,N,N,64849,N,N,N,N,N,N,N,64173,N,N,N,N,36286,N,N,35236,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39641,N,N,N,N,N,N,N,N,N,N,N,64846,N,N,36288,N,N,38896,\r
+N,N,N,N,N,N,N,N,N,N,37812,64836,N,N,N,N,N,N,N,N,N,N,N,N,40871,N,N,N,N,36290,N,\r
+N,N,N,39350,N,N,N,N,N,N,N,N,N,N,N,N,N,64850,N,N,N,N,N,N,36289,N,N,36422,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,41169,N,N,N,N,N,N,N,N,N,N,N,N,N,40906,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,37583,N,N,N,40180,36292,N,N,N,N,N,N,N,N,N,N,64833,N,N,N,N,N,N,\r
+N,39756,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64855,64751,40158,N,N,N,N,N,N,N,64834,\r
+39020,N,N,N,N,N,N,N,N,N,N,N,N,N,38905,N,38232,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39006,65147,38093,N,N,N,N,N,37870,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36003,N,64858,\r
+N,N,N,N,N,N,37877,N,N,N,N,N,37871,36586,N,N,N,36699,N,N,N,N,N,N,N,N,N,N,N,\r
+35934,N,36294,N,N,N,N,N,N,N,N,N,N,N,36296,N,N,36295,N,N,N,N,N,37879,N,N,N,N,N,\r
+N,N,36297,N,N,N,N,N,N,N,64498,N,N,N,N,38512,N,N,N,N,N,N,N,N,N,36299,N,N,N,\r
+64860,N,N,N,N,N,N,N,N,N,36709,N,N,N,36301,N,N,N,N,N,40360,38137,N,N,36302,N,N,\r
+N,N,N,N,N,N,37866,N,N,N,N,N,N,N,N,N,64863,37872,40886,N,N,N,N,N,N,N,N,N,36303,\r
+N,N,N,38755,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36304,\r
+37873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64866,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40923,N,N,N,N,37880,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35831,N,N,N,N,64870,N,N,N,N,N,35791,N,N,N,N,N,N,36305,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,64881,N,N,N,N,64879,N,N,N,N,N,N,N,N,36307,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40935,37053,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40912,N,N,N,35792,N,64882,\r
+N,40110,35793,N,N,35547,N,N,N,N,N,N,N,N,N,N,N,64228,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,38350,N,64886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64354,N,N,N,N,N,N,36308,\r
+N,N,N,64888,N,N,N,N,N,36579,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36982,N,N,39110,N,N,N,N,N,N,N,36309,N,N,N,N,38865,N,N,40630,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64199,N,N,41026,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,39027,N,N,N,N,N,N,N,N,N,N,40956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,36005,36311,N,N,37627,36312,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,37967,N,36313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,35179,N,N,N,N,N,N,N,N,38862,N,N,N,64243,64942,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64431,37559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36314,N,N,N,N,N,N,N,N,N,N,N,N,N,40026,N,N,N,N,N,N,64941,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,36316,37956,N,N,N,N,N,N,N,N,N,N,N,36317,N,N,N,N,N,N,N,41174,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35905,38869,N,37962,N,N,N,N,N,\r
+37965,N,N,N,N,38859,N,N,N,N,N,36318,N,N,36319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36320,65273,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64960,64761,N,N,N,N,N,N,36061,N,64382,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37555,N,N,N,N,N,64943,N,N,N,N,N,N,N,N,N,36321,N,N,N,N,\r
+38355,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64872,N,N,40119,N,N,36323,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64192,36325,64100,N,35143,N,N,N,N,36324,N,N,N,N,N,36327,\r
+36328,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64967,64944,N,N,N,N,N,N,37957,38870,N,N,\r
+N,N,N,N,N,N,N,64710,38980,N,N,N,N,N,N,N,N,N,N,N,N,36329,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,36330,N,N,N,N,N,N,N,N,65104,N,N,N,N,N,N,64972,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40359,N,N,N,N,N,64973,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64975,N,N,N,N,38354,N,N,N,N,N,N,N,36333,N,N,N,N,N,N,N,N,64698,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64965,N,64978,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40156,N,N,N,N,N,38351,N,N,36334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64980,\r
+N,N,N,N,N,38636,38635,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37046,N,64963,39083,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38638,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,36340,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64992,N,35943,N,N,36342,N,N,N,36343,N,N,N,N,N,N,N,36858,N,N,N,N,\r
+N,N,N,N,N,N,38864,N,N,N,N,35794,N,N,36344,N,N,N,N,N,37081,N,35911,N,64240,N,N,\r
+N,N,64993,36345,N,64995,N,N,N,N,N,N,N,36346,N,64355,N,N,N,37030,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39280,N,N,37355,N,38768,39023,64994,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39154,N,39676,35180,65021,N,N,39262,N,N,N,38333,N,N,N,N,N,N,N,64996,\r
+N,N,N,37350,N,N,N,N,64997,64998,N,N,N,N,N,N,N,N,64999,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,37972,N,N,N,39352,N,N,N,N,N,N,N,N,38889,37702,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39011,N,N,N,N,N,N,N,N,N,N,N,38332,N,65005,65015,N,N,N,\r
+N,N,N,39024,38646,36521,N,N,N,N,N,37969,N,N,36419,N,35674,N,N,N,N,65006,N,N,N,\r
+N,65008,N,N,N,N,65012,N,39925,N,N,N,N,N,36078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,38782,N,N,N,N,N,39893,N,39619,N,38856,41179,37328,N,N,40932,N,36829,N,\r
+37353,N,N,N,N,N,N,N,N,N,39136,N,N,N,37578,N,38999,N,N,35921,N,N,N,N,65003,N,\r
+39753,N,N,N,N,N,N,N,N,N,40310,40623,N,N,N,N,N,N,N,N,N,40140,N,N,N,N,N,N,65002,\r
+N,N,36337,N,N,65019,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36435,N,N,N,N,\r
+N,N,N,N,N,N,N,64207,N,N,N,N,N,N,N,N,N,N,N,N,N,38649,N,N,N,N,N,N,N,N,N,39103,\r
+40521,36007,N,N,N,N,N,N,N,N,39882,N,N,N,N,65022,37596,N,N,N,N,N,65089,37324,\r
+37346,N,N,N,N,N,N,N,N,N,N,N,N,65092,34655,N,N,N,N,N,35795,N,N,65095,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,65096,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37973,N,N,N,N,\r
+65099,N,65100,N,N,N,N,36287,N,N,N,N,N,N,N,N,N,40568,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,65105,N,N,N,N,37974,N,N,N,N,N,N,N,40289,N,N,N,N,\r
+37975,N,N,N,N,N,N,N,N,N,N,39270,N,N,N,N,N,N,N,N,N,N,N,N,N,35797,N,N,N,N,41065,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39092,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,41033,41036,N,40549,N,N,N,N,N,N,N,N,N,N,N,39093,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65112,N,39285,65107,41061,N,65113,N,N,N,N,\r
+N,N,N,N,N,39095,39096,N,N,N,N,N,N,N,39098,N,N,N,N,N,N,39099,N,N,N,N,N,N,40892,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41034,N,N,\r
+40647,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36009,N,N,39086,N,N,N,N,N,\r
+N,N,N,37590,N,N,N,64225,N,37332,N,N,N,N,N,N,N,N,64222,N,N,65115,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,35923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65118,N,N,N,N,64471,65114,\r
+38085,N,N,N,N,64202,N,N,N,N,N,N,N,N,N,N,N,39105,38748,N,65140,N,38771,N,N,N,N,\r
+N,N,N,N,64070,N,N,N,38756,N,N,N,65128,N,38478,N,38757,35930,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35233,38394,N,37588,65129,N,64325,N,39112,N,N,37103,N,39113,39114,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37997,38071,65132,N,N,37995,N,N,N,\r
+N,N,N,37628,N,38379,N,65139,38766,65119,N,N,N,N,N,N,N,N,N,64957,N,N,37589,N,N,\r
+N,N,N,N,65209,N,N,65137,34680,N,N,N,64443,N,N,38010,N,N,38395,65143,N,N,N,N,N,\r
+N,N,65145,N,65141,N,N,N,37981,N,N,N,N,N,N,N,65148,N,N,N,N,N,N,N,N,N,37700,\r
+36518,N,N,N,N,N,N,N,N,N,N,N,37587,N,38072,N,34681,N,N,N,N,N,N,64625,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,38750,N,N,N,N,36013,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65191,N,N,\r
+N,37994,N,N,N,37859,N,N,39119,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41177,N,N,\r
+N,N,N,N,N,N,41151,41037,41144,N,N,N,N,N,41166,41143,N,N,N,N,N,N,N,N,65193,N,N,\r
+N,N,N,N,N,N,N,N,35267,N,N,N,N,65195,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40436,35181,N,N,N,N,N,40059,N,N,N,N,N,N,39122,N,N,N,40873,N,N,N,65202,N,N,\r
+65201,N,N,N,38873,N,41156,N,38006,N,N,N,N,N,N,N,N,N,N,39288,N,N,N,N,N,N,65203,\r
+N,N,N,N,N,39123,65204,N,N,N,39124,N,N,N,N,N,N,N,40889,N,N,N,N,N,N,N,N,38001,N,\r
+N,N,N,N,N,N,N,N,39125,65208,N,N,N,50900,N,N,N,N,N,N,N,N,N,N,N,65210,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40540,N,N,65211,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41028,N,\r
+N,N,N,39127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39128,65212,N,N,N,N,40958,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65213,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40413,N,N,N,N,40673,N,N,N,N,N,N,N,N,N,N,N,N,39130,\r
+40415,65215,N,65214,N,N,40683,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40537,41052,N,\r
+N,N,N,N,N,N,65216,N,N,N,38007,39132,N,65217,N,N,N,39134,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,65219,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65224,N,N,N,65225,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65226,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+65227,N,N,N,N,N,N,N,N,N,40898,N,N,35947,39108,N,38064,38065,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,65233,N,N,N,N,N,41153,N,65234,N,N,N,N,41165,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,65235,N,N,39141,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65238,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37348,N,N,N,N,36807,38062,N,\r
+35407,38066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36820,N,N,N,N,39146,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65240,N,N,N,N,N,N,N,N,N,40416,N,N,\r
+N,N,39150,N,N,N,N,38340,N,64744,N,N,N,N,N,39151,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,35950,N,N,N,N,N,N,N,N,64216,N,N,N,N,N,N,N,N,N,N,N,N,N,65244,N,N,N,N,N,N,N,\r
+N,N,41134,40268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39153,N,N,N,39155,N,38081,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39157,N,N,64079,38626,N,N,N,N,\r
+37968,N,38562,N,N,39158,N,N,N,38629,N,N,N,N,N,39159,N,41030,38627,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40676,N,N,N,\r
+N,N,N,63958,N,N,N,N,N,N,38083,N,N,N,N,38082,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65249,N,65257,N,N,N,N,38628,N,35244,38619,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,65250,N,N,N,N,N,N,N,N,N,N,38084,65251,N,N,N,65255,40955,\r
+N,N,N,N,N,N,N,N,N,N,N,35929,N,N,N,N,N,N,N,N,N,37833,N,38120,64342,N,N,N,37061,\r
+41128,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,65253,N,N,N,39165,39163,65256,N,36543,N,N,N,N,35800,65271,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36712,38086,N,N,N,N,N,N,N,N,40426,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64617,N,N,N,N,N,N,N,N,N,N,N,N,40154,N,65267,N,N,40050,\r
+N,N,65264,35273,N,N,N,N,N,N,N,N,N,39233,N,N,N,N,N,N,N,39234,N,N,N,65269,N,\r
+37335,N,N,N,N,N,38092,N,N,N,65272,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,38824,N,65276,N,N,N,36062,N,64959,N,N,N,N,N,N,N,65278,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,38609,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38101,N,N,38096,39236,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35939,N,N,41139,N,N,\r
+N,N,N,N,N,N,N,N,N,N,38095,N,N,N,40954,N,N,N,N,37349,N,40042,N,N,N,36425,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36428,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36429,N,N,N,N,N,39539,N,N,N,N,N,N,N,N,N,N,N,N,N,39239,N,\r
+36017,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36432,N,N,N,N,N,\r
+N,N,N,N,N,36431,39241,N,N,N,N,N,36433,36434,N,N,N,N,39602,35237,N,N,N,N,N,\r
+39244,N,N,N,40952,N,N,N,N,N,N,36438,39245,37322,36439,N,N,N,N,38113,N,N,N,N,\r
+36935,N,36824,36440,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38123,36444,38227,N,\r
+N,N,N,N,N,N,40933,N,N,N,N,N,N,N,N,N,N,40790,N,N,N,N,N,N,N,38223,N,36446,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39274,N,N,N,N,N,N,N,N,40036,40153,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,36445,N,N,N,N,N,N,N,N,N,N,N,N,39248,N,N,N,N,N,N,N,N,N,39249,N,N,\r
+36450,N,N,N,N,N,N,N,N,N,N,N,39250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36456,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36449,40793,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35763,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40797,36454,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36018,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,36462,N,40804,39251,N,N,64184,N,N,N,N,N,39252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36464,N,N,N,N,N,N,N,N,N,N,N,N,40801,N,36466,N,N,N,N,N,N,\r
+N,N,N,N,N,N,41067,N,N,N,N,40768,N,N,N,N,N,N,38125,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,38126,N,N,40893,N,N,N,36475,N,N,N,N,N,N,39255,38135,N,40799,N,N,N,N,36467,N,\r
+N,40802,N,N,N,N,N,N,N,38134,N,N,N,N,N,N,N,N,N,N,N,N,N,39256,N,N,N,N,N,N,N,N,N,\r
+36469,63963,N,N,N,N,36978,N,38136,N,N,N,N,N,N,N,N,N,39258,N,N,N,N,N,N,N,N,N,\r
+41136,36019,N,N,N,36473,N,36472,N,N,N,38131,N,N,N,N,N,39087,N,N,N,N,N,N,41138,\r
+N,N,N,N,N,N,N,N,N,N,N,36474,N,N,N,N,N,N,39260,N,N,N,N,N,36476,N,36477,N,N,N,\r
+35801,N,N,35234,40663,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,41142,N,N,N,N,N,N,N,N,N,N,N,N,40514,N,N,36516,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36519,N,35958,N,N,N,N,N,N,N,N,N,34663,N,38210,N,N,N,N,N,N,N,N,N,N,N,N,39037,N,\r
+N,N,38741,N,N,36520,N,N,N,N,N,N,N,36522,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35235,N,39264,39266,N,N,38140,39265,N,N,N,N,N,N,N,38138,N,N,N,N,N,\r
+N,N,36526,36530,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36528,N,N,N,N,N,N,N,39267,38826,\r
+38139,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36539,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36060,N,N,N,N,N,N,N,N,N,39030,N,36513,N,N,N,N,36020,N,\r
+36535,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40358,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40624,\r
+N,N,N,36536,N,N,N,N,N,N,N,N,N,N,N,N,40304,N,N,N,N,35182,N,N,N,N,N,N,N,35183,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,35184,N,N,N,N,N,N,N,N,N,N,N,N,35185,N,N,N,N,N,N,N,\r
+35186,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35187,35188,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35189,N,N,N,\r
+N,N,N,N,N,36540,36541,N,N,N,N,N,36542,N,40401,N,N,N,N,38141,N,N,N,35799,35802,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41186,N,N,N,N,N,N,\r
+40937,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64936,N,N,N,35559,N,N,N,\r
+36546,N,N,N,N,N,N,N,N,N,N,N,36548,N,N,N,N,N,N,N,N,N,N,39268,N,N,N,N,N,39269,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38222,N,N,N,N,N,N,N,N,N,39091,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36555,35807,\r
+N,N,N,N,N,36558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36559,N,N,39272,N,N,N,\r
+N,39273,N,N,N,N,N,N,N,N,39275,36561,N,39276,N,N,N,N,N,N,N,N,N,36564,36565,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39277,N,N,N,N,N,N,41150,N,N,N,N,N,\r
+36566,41148,41141,N,N,41140,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35253,N,N,N,\r
+N,N,N,N,36573,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40541,39281,N,N,N,N,35246,40424,N,N,\r
+N,N,N,N,N,N,38245,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,39282,N,N,35676,N,N,N,N,N,N,N,N,N,35249,41152,N,N,N,36575,N,38246,N,N,\r
+39284,N,39286,N,N,N,39287,N,39289,N,N,40410,N,N,36576,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37724,N,N,N,N,N,N,N,40422,N,35679,N,N,38243,N,N,N,N,N,N,N,N,N,N,38247,N,\r
+N,N,N,N,40419,N,N,N,N,N,N,N,N,N,N,N,N,N,39292,N,N,39293,39294,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,36091,35675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39331,N,N,N,N,N,N,N,\r
+39332,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39336,N,N,N,N,35518,N,N,N,N,N,N,N,N,N,N,N,40545,N,N,N,N,N,N,N,N,N,N,39338,N,N,\r
+N,N,N,N,41160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39339,N,N,\r
+N,N,N,N,N,N,N,N,65220,N,N,N,N,N,N,39106,36584,N,41146,N,N,N,N,N,N,N,N,N,N,N,\r
+64887,N,N,36590,N,N,N,40639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35266,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39340,N,N,N,N,N,N,N,N,N,N,N,N,N,38251,N,N,38252,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39343,N,N,39242,35190,36680,N,N,N,N,N,N,N,N,N,\r
+N,N,64494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39342,N,\r
+N,N,36603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36048,N,N,N,N,35666,N,N,N,N,\r
+N,39344,N,N,N,N,35191,36673,N,N,N,N,N,N,N,39345,N,N,N,N,N,N,N,N,N,36681,N,N,N,\r
+N,N,N,N,N,N,N,N,64077,N,N,N,N,N,N,N,N,40420,36021,N,N,N,64489,39764,N,39346,\r
+40552,N,N,N,N,N,N,N,N,N,N,N,N,36682,N,36674,N,N,36689,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38982,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,39348,N,N,N,N,N,N,N,N,N,N,36597,64853,N,N,40141,N,N,N,N,N,N,N,\r
+N,35192,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36691,N,N,N,N,N,N,N,N,N,N,N,\r
+36719,N,N,N,N,N,N,N,N,N,N,36451,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36694,N,N,N,N,N,\r
+N,N,N,N,N,N,N,65142,N,N,N,N,40902,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64172,N,N,N,N,N,\r
+36696,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38984,39351,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38501,N,64108,N,40423,N,N,N,40546,N,N,N,38604,36455,N,N,\r
+64629,N,39038,N,N,N,N,N,N,N,64953,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38908,N,N,N,N,\r
+N,N,N,N,N,39161,N,36710,N,N,N,N,N,N,N,N,38254,N,37445,N,N,36704,N,N,N,40657,N,\r
+N,N,N,N,65229,N,39353,N,N,N,N,N,N,N,N,N,N,N,N,36706,38732,N,N,N,N,N,N,N,N,N,N,\r
+N,N,37319,38239,N,N,N,N,N,N,N,39355,N,N,N,N,N,N,N,N,N,36461,36721,N,N,38091,N,\r
+N,N,N,N,N,N,N,N,N,N,N,38321,N,N,N,N,N,N,N,N,N,39666,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38595,39357,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41167,N,\r
+N,N,36717,N,N,39358,36596,N,36722,38372,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39359,37442,N,64421,N,N,N,N,N,N,N,N,N,N,39360,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64948,36727,N,N,N,39361,N,N,N,N,N,N,N,N,N,\r
+64185,N,N,N,N,N,N,N,N,36672,64068,N,N,N,N,N,39362,N,N,N,N,N,N,N,36700,N,N,N,N,\r
+36029,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39364,39365,N,N,36731,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34678,N,N,N,36022,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36771,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36046,N,N,N,N,N,N,N,N,N,39366,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,38605,N,N,N,N,N,N,N,N,N,N,N,N,N,38599,36773,N,N,N,N,N,N,N,N,N,N,\r
+64187,N,35937,38256,N,N,N,37736,N,36734,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36778,N,N,N,N,N,N,41040,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37075,N,N,38230,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36792,N,N,N,N,N,39368,N,N,N,N,N,N,N,N,N,N,N,36783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39369,N,N,N,N,N,N,N,N,N,N,N,N,N,38265,N,N,N,N,N,N,N,N,N,N,N,N,40777,\r
+N,N,N,N,39370,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39371,40405,36784,N,N,\r
+N,N,N,N,N,N,N,N,N,64122,N,N,N,N,N,N,N,N,40543,N,N,N,N,39373,41161,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39643,N,N,N,41158,N,N,N,N,N,N,N,36788,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,41175,N,N,N,N,N,N,N,N,N,N,N,N,41159,N,N,N,N,N,N,N,\r
+41027,N,N,N,36789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36786,N,N,N,N,N,N,\r
+41057,40542,N,N,N,N,N,N,N,N,N,N,36790,N,N,N,N,N,N,N,N,40936,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40114,N,N,N,N,N,38268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40903,\r
+N,N,36795,36796,N,N,N,N,N,N,N,N,36844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36800,N,\r
+37738,N,N,N,35812,40060,N,N,N,N,N,N,N,N,38305,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,65260,N,N,38307,N,N,N,N,N,N,N,35909,36024,N,N,N,N,N,N,N,N,N,N,N,\r
+36801,N,N,N,41042,N,N,N,N,N,N,N,N,N,N,N,N,N,39376,N,N,N,N,N,36803,36804,N,N,N,\r
+N,N,N,N,N,N,38308,N,N,N,N,N,36806,N,40544,N,N,N,N,N,N,N,63960,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38309,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40115,N,N,N,N,N,\r
+N,N,N,N,39377,65265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,39378,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40130,N,N,N,39379,N,N,N,N,N,38311,N,N,N,N,N,N,38313,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,38310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40029,N,N,N,N,N,N,N,N,39138,N,N,\r
+N,N,N,N,36809,N,41154,36810,N,N,N,N,N,N,39380,N,N,41145,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39768,N,36813,N,41172,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36814,N,N,\r
+N,N,35813,N,N,N,N,35193,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,36816,38326,N,N,N,N,N,N,N,N,N,N,N,N,39382,N,38373,N,N,N,N,N,N,N,N,N,\r
+N,N,N,39383,N,N,N,N,38325,N,N,N,N,N,N,N,N,N,N,N,41162,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40957,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,41048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36822,N,N,N,39384,N,N,N,N,N,N,N,\r
+36819,N,N,N,N,N,N,N,N,N,N,N,N,36837,N,N,N,N,N,36841,N,N,N,N,39385,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36087,N,N,N,N,N,N,N,N,N,N,N,N,N,37500,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,40005,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36072,36830,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,36831,N,N,N,N,N,N,N,N,N,N,N,N,N,41035,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36834,N,N,N,41164,N,N,N,N,N,N,N,N,36835,36836,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39876,N,N,N,39932,N,N,N,N,N,N,38476,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,39670,N,36014,N,N,N,N,N,N,N,N,N,N,N,N,36839,N,N,N,N,\r
+N,N,N,N,N,N,36840,N,N,N,N,35815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35194,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35195,39386,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36845,N,N,N,38336,N,N,N,N,N,N,N,N,N,N,N,N,N,41163,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40520,N,N,N,N,N,N,39387,N,36851,\r
+N,N,N,N,36857,N,N,N,N,N,N,N,N,N,N,N,N,N,38337,N,41038,N,N,N,N,N,N,39388,N,N,N,\r
+N,41060,36855,N,N,N,N,N,N,N,35248,41032,N,N,N,N,36859,36854,N,N,N,N,N,40412,N,\r
+N,N,39389,35816,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37569,N,N,N,N,N,N,N,40918,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41170,N,N,36928,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35524,N,N,39392,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,40944,40947,N,N,N,N,N,N,N,N,N,N,N,N,40383,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,40950,N,38344,N,N,40538,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39395,N,N,N,N,N,N,N,N,N,N,N,35402,N,N,N,N,N,N,N,N,40945,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35495,N,N,N,N,N,N,N,N,39398,N,N,N,40951,N,40941,N,N,\r
+N,N,N,N,35420,N,40366,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,38345,N,N,N,N,N,36936,N,N,39400,N,N,N,N,N,36937,N,N,36026,\r
+N,N,37041,N,N,N,N,N,N,36938,N,N,N,N,N,N,N,N,N,N,39402,N,N,N,N,N,N,N,N,N,N,N,\r
+39889,N,N,N,N,N,N,N,39403,N,39404,N,N,N,N,N,N,N,N,39405,N,N,N,N,39406,36940,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36941,N,N,38347,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,38882,N,N,N,N,N,N,N,N,38348,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40824,N,N,\r
+N,N,N,N,N,N,N,35196,35197,N,N,N,N,N,N,35198,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39261,N,N,N,N,N,N,N,N,N,N,N,N,39770,N,N,\r
+N,N,36944,N,35919,N,N,N,N,N,N,N,N,N,N,N,36948,N,50902,39592,39407,65259,40355,\r
+40353,39235,39237,N,40317,N,N,39408,N,N,N,N,N,N,N,N,39409,N,39410,N,N,36028,\r
+40288,N,N,N,N,N,N,N,N,N,41123,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36955,40667,N,N,N,N,N,N,N,N,N,40313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39411,N,N,N,36962,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,40789,N,N,N,N,N,N,N,N,N,39929,N,N,N,N,N,N,N,N,N,N,36965,N,N,\r
+38624,N,N,N,N,N,N,N,39102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36968,N,N,N,\r
+N,N,36972,N,N,N,N,N,N,N,N,N,N,N,N,38360,N,N,N,N,N,N,N,N,36970,40882,N,N,N,N,N,\r
+N,N,40878,N,N,40880,N,35245,N,N,N,N,N,N,N,N,36974,N,N,N,N,N,N,N,N,40561,N,N,N,\r
+N,N,40522,N,N,N,N,N,40924,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35243,N,40888,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36976,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35683,N,N,N,N,38364,N,N,N,N,N,N,N,N,36977,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64606,N,N,N,N,N,N,N,N,35145,N,N,N,N,N,38491,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35920,N,N,N,38054,N,N,N,36821,40563,N,N,N,N,N,36981,N,N,N,N,39415,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,36031,N,N,N,N,N,N,39417,N,38499,38329,N,N,N,N,N,N,N,N,N,38100,N,\r
+N,N,N,N,N,64762,N,N,N,N,36983,N,N,37035,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40269,\r
+N,N,39418,N,N,N,N,37603,N,38843,N,N,36984,N,N,N,N,N,N,N,N,39419,N,N,38880,N,N,\r
+N,N,N,N,N,N,38620,N,N,N,N,N,N,N,N,N,40104,N,N,38770,N,N,N,N,37952,N,N,N,N,N,\r
+37618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39421,N,N,\r
+39420,N,N,N,N,N,N,N,63959,38474,N,N,N,38616,39422,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36939,N,N,N,N,N,N,64065,N,N,N,N,N,N,N,39488,N,38747,N,N,N,N,N,\r
+39489,37341,N,N,N,N,N,37884,39490,39491,N,38489,N,N,N,N,N,N,39492,36945,N,N,N,\r
+38079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37026,N,N,N,40107,38774,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64597,65093,38056,39493,\r
+64075,40417,N,N,38617,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38772,N,N,\r
+65013,N,N,N,37605,N,38469,37338,N,37027,N,N,41055,N,N,N,N,37039,38847,N,N,N,\r
+37196,N,N,N,N,38522,N,N,N,37342,N,N,39494,65200,38777,37996,N,N,N,N,N,N,N,N,\r
+39000,N,N,N,N,N,N,N,N,N,N,N,37478,N,N,N,37883,N,N,N,N,N,N,N,N,N,N,N,N,39495,N,\r
+N,N,N,N,N,N,N,N,N,38729,N,N,38728,N,37706,N,40162,N,N,N,N,N,N,37476,N,N,N,N,\r
+37343,N,N,N,N,N,N,N,64377,N,N,N,N,N,N,N,38615,N,N,N,N,37699,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64971,65146,N,37339,35946,38831,N,N,38365,N,N,N,37704,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,39499,N,N,N,64581,N,39501,N,N,N,N,N,N,37308,37090,37044,38369,\r
+N,N,N,N,N,39502,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39503,N,N,N,65088,65091,N,N,N,\r
+N,N,N,N,N,N,38621,N,N,N,N,N,N,39505,N,N,N,38567,N,N,37040,N,N,N,N,N,N,N,N,N,\r
+40014,N,37955,N,N,N,N,36538,N,N,N,N,N,N,N,N,N,N,N,N,39506,N,64705,N,N,N,N,N,N,\r
+N,N,N,35817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40111,N,N,35837,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39612,N,39608,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39598,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39591,39507,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,40308,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35818,N,N,N,N,N,N,35819,N,N,N,N,N,37042,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,38377,38376,N,38374,N,N,N,N,N,N,37045,N,39508,N,N,N,\r
+37043,38375,N,N,35664,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35820,N,N,N,\r
+N,N,N,N,N,N,N,N,39510,35835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39511,N,\r
+N,N,N,41130,N,N,N,N,N,N,N,N,40870,N,N,N,39372,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40025,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39349,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,37054,N,N,N,N,N,40879,N,N,N,N,N,N,N,N,N,N,N,N,N,38386,N,N,N,N,N,N,37055,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37057,N,65252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37060,N,N,\r
+N,N,N,N,37063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37604,40786,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37083,N,N,N,N,N,41062,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37074,N,N,34667,N,37076,N,N,N,N,N,N,N,N,N,39515,38397,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,35780,N,N,N,35942,N,37086,N,N,N,N,N,40164,N,37089,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,40518,N,N,N,38481,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64344,N,37094,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38480,N,N,N,37095,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,37096,39517,N,40826,N,N,N,39772,N,40828,N,N,64594,37097,N,37098,N,\r
+39518,N,N,N,N,N,40822,N,N,N,N,N,N,N,N,N,37099,N,N,N,N,N,N,N,N,N,N,N,N,N,37100,\r
+N,N,N,N,N,35822,N,N,N,N,N,N,N,37102,N,N,N,37318,N,N,37106,64700,35444,N,N,N,N,\r
+N,N,N,N,N,38487,N,N,N,40175,N,N,N,N,N,N,N,N,N,N,40927,N,N,N,N,37111,37110,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39774,N,N,N,37112,N,N,N,N,N,N,N,N,N,N,36092,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37113,N,36041,N,N,N,64106,N,N,N,N,N,N,N,N,35823,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40928,N,N,37186,N,39522,N,N,N,N,N,\r
+N,N,N,N,38249,N,N,N,37188,37187,N,37185,N,N,N,35824,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38496,N,35825,N,39414,37193,N,N,N,N,37194,N,N,N,N,N,37195,N,N,N,N,39524,N,N,N,\r
+35519,39526,N,N,N,N,N,N,N,N,N,N,39527,N,N,39529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39530,38482,37197,N,38502,N,N,N,N,40827,N,39531,N,N,N,N,\r
+N,N,N,41068,N,N,38503,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39532,N,N,N,N,39533,35826,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38506,N,N,N,N,N,N,N,N,64746,N,N,N,N,N,38508,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37316,N,N,N,38519,N,N,N,N,N,N,N,39412,39535,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40875,N,N,N,N,N,36030,36545,N,N,N,N,38229,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37202,37203,N,N,N,37205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38237,N,38513,N,N,N,N,40045,N,N,N,N,N,N,N,N,38515,N,N,N,N,N,N,N,N,N,N,N,37204,\r
+39537,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37206,N,N,N,38509,\r
+N,N,N,N,N,N,38231,N,N,N,N,N,N,N,N,35270,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35434,N,N,N,35671,N,N,N,40929,N,N,39775,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41053,N,N,N,N,N,N,N,N,37211,N,37212,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37214,N,N,N,N,N,N,N,N,N,N,40796,40791,N,N,N,N,N,\r
+N,40805,N,N,N,N,N,39538,N,N,N,N,37216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40798,N,N,37217,N,N,N,N,N,N,37220,N,N,N,N,40769,N,N,N,N,N,N,37225,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,37224,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38578,N,39541,N,64933,N,N,N,N,\r
+N,N,N,40681,N,35770,37229,41056,N,N,N,N,N,N,N,40926,N,N,N,N,N,40899,N,38581,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38579,N,N,N,N,N,N,N,N,N,N,N,N,N,39542,N,N,N,N,N,N,N,N,N,N,N,\r
+38357,N,N,N,40650,N,N,N,39543,N,N,39544,N,N,N,N,N,N,N,N,N,N,37232,37231,N,N,N,\r
+N,N,N,N,40867,N,37233,N,N,N,38577,N,N,N,N,40803,N,N,N,N,N,40807,N,N,N,35769,\r
+39546,N,N,N,N,N,35670,N,N,N,N,N,N,N,N,39642,N,N,N,N,N,38576,N,N,N,N,39550,N,N,\r
+N,N,N,N,N,N,N,N,40414,N,N,N,N,N,N,N,N,N,38573,N,N,N,38574,N,N,N,N,N,N,N,N,N,\r
+40609,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40528,N,N,N,N,N,N,N,N,38575,\r
+35828,40868,N,N,N,N,N,N,N,N,N,38589,N,N,N,N,N,N,N,N,N,38644,N,N,N,N,N,N,N,N,N,\r
+N,38584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64161,N,N,N,N,37287,N,N,N,N,N,N,N,\r
+N,N,N,41054,N,N,N,N,39549,N,N,N,N,35144,N,40625,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38335,35443,N,N,N,N,N,N,N,N,N,N,N,N,N,40702,\r
+N,37242,N,N,N,N,37243,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39587,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,38594,N,N,N,N,N,40823,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39588,N,\r
+N,39589,N,N,N,37281,N,N,N,N,35256,N,N,N,N,N,N,N,N,N,N,37235,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39590,35261,N,\r
+35257,N,37245,N,N,N,N,N,N,N,N,N,38587,N,N,N,40946,N,N,35829,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,39593,N,N,N,N,N,40788,N,N,40931,40685,N,N,N,N,N,N,N,N,N,N,37290,N,N,N,\r
+N,37291,41072,N,40813,N,N,N,N,N,37292,N,N,N,37293,N,N,N,41213,N,40930,N,37295,\r
+40513,39594,N,N,37296,N,39595,N,N,N,N,N,N,N,N,N,N,N,39596,N,39498,N,37298,N,N,\r
+35830,N,39597,35254,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39599,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,39600,N,N,N,N,N,N,39601,N,N,N,N,N,39585,37305,N,N,\r
+N,N,N,37306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41025,35767,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37312,N,N,N,N,N,N,N,N,N,N,39603,\r
+37315,N,N,N,N,N,N,N,N,N,N,41212,N,N,40942,N,N,N,N,N,N,40809,N,N,N,N,N,N,N,\r
+37320,N,N,N,N,N,N,37321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36326,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37323,N,N,N,N,N,N,N,N,N,N,35272,N,N,N,N,N,36266,N,N,N,N,\r
+N,40925,35907,35949,35956,36023,36025,36027,36032,36055,36056,36058,51361,\r
+51363,36077,36168,35832,51408,N,N,N,N,51407,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50916,N,\r
+50917,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,51405,N,51406,N,N,N,N,N,N,N,N,63998,\r
+};\r
+\r
+static const struct unim_index big5hkscs_bmp_encmap[256] = {\r
+{__big5hkscs_bmp_encmap+0,168,252},{__big5hkscs_bmp_encmap+85,0,220},{\r
+__big5hkscs_bmp_encmap+306,80,198},{0,0,0},{__big5hkscs_bmp_encmap+425,1,81},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+506,190,\r
+193},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+510,22,231},{0,0,0},{\r
+__big5hkscs_bmp_encmap+720,218,219},{__big5hkscs_bmp_encmap+722,96,125},{\r
+__big5hkscs_bmp_encmap+752,80,112},{0,0,0},{__big5hkscs_bmp_encmap+785,61,61},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5hkscs_bmp_encmap+786,\r
+128,227},{__big5hkscs_bmp_encmap+886,51,51},{__big5hkscs_bmp_encmap+887,5,254\r
+},{__big5hkscs_bmp_encmap+1137,192,207},{__big5hkscs_bmp_encmap+1153,49,49},{\r
+0,0,0},{__big5hkscs_bmp_encmap+1154,53,251},{__big5hkscs_bmp_encmap+1353,6,254\r
+},{__big5hkscs_bmp_encmap+1602,9,245},{__big5hkscs_bmp_encmap+1839,1,251},{\r
+__big5hkscs_bmp_encmap+2090,15,250},{__big5hkscs_bmp_encmap+2326,8,254},{\r
+__big5hkscs_bmp_encmap+2573,1,251},{__big5hkscs_bmp_encmap+2824,14,244},{\r
+__big5hkscs_bmp_encmap+3055,13,239},{__big5hkscs_bmp_encmap+3282,18,253},{\r
+__big5hkscs_bmp_encmap+3518,6,255},{__big5hkscs_bmp_encmap+3768,0,250},{\r
+__big5hkscs_bmp_encmap+4019,4,250},{__big5hkscs_bmp_encmap+4266,2,249},{\r
+__big5hkscs_bmp_encmap+4514,17,252},{__big5hkscs_bmp_encmap+4750,43,242},{\r
+__big5hkscs_bmp_encmap+4950,1,244},{__big5hkscs_bmp_encmap+5194,3,234},{\r
+__big5hkscs_bmp_encmap+5426,3,247},{__big5hkscs_bmp_encmap+5671,19,244},{\r
+__big5hkscs_bmp_encmap+5897,0,250},{__big5hkscs_bmp_encmap+6148,6,231},{\r
+__big5hkscs_bmp_encmap+6374,15,255},{__big5hkscs_bmp_encmap+6615,16,192},{\r
+__big5hkscs_bmp_encmap+6792,4,237},{__big5hkscs_bmp_encmap+7026,7,156},{\r
+__big5hkscs_bmp_encmap+7176,4,248},{__big5hkscs_bmp_encmap+7421,3,253},{\r
+__big5hkscs_bmp_encmap+7672,3,252},{__big5hkscs_bmp_encmap+7922,1,254},{\r
+__big5hkscs_bmp_encmap+8176,2,249},{__big5hkscs_bmp_encmap+8424,1,254},{\r
+__big5hkscs_bmp_encmap+8678,19,239},{__big5hkscs_bmp_encmap+8899,2,251},{\r
+__big5hkscs_bmp_encmap+9149,5,253},{__big5hkscs_bmp_encmap+9398,0,254},{\r
+__big5hkscs_bmp_encmap+9653,3,251},{__big5hkscs_bmp_encmap+9902,2,249},{\r
+__big5hkscs_bmp_encmap+10150,2,254},{__big5hkscs_bmp_encmap+10403,13,255},{\r
+__big5hkscs_bmp_encmap+10646,5,252},{__big5hkscs_bmp_encmap+10894,16,245},{\r
+__big5hkscs_bmp_encmap+11124,9,252},{__big5hkscs_bmp_encmap+11368,12,223},{\r
+__big5hkscs_bmp_encmap+11580,35,253},{__big5hkscs_bmp_encmap+11799,7,226},{\r
+__big5hkscs_bmp_encmap+12019,44,229},{__big5hkscs_bmp_encmap+12205,24,254},{\r
+__big5hkscs_bmp_encmap+12436,7,234},{__big5hkscs_bmp_encmap+12664,10,255},{\r
+__big5hkscs_bmp_encmap+12910,24,241},{__big5hkscs_bmp_encmap+13128,2,254},{\r
+__big5hkscs_bmp_encmap+13381,0,202},{__big5hkscs_bmp_encmap+13584,0,250},{\r
+__big5hkscs_bmp_encmap+13835,3,246},{__big5hkscs_bmp_encmap+14079,5,250},{\r
+__big5hkscs_bmp_encmap+14325,28,255},{__big5hkscs_bmp_encmap+14553,2,254},{\r
+__big5hkscs_bmp_encmap+14806,2,250},{__big5hkscs_bmp_encmap+15055,4,248},{\r
+__big5hkscs_bmp_encmap+15300,3,254},{__big5hkscs_bmp_encmap+15552,5,246},{\r
+__big5hkscs_bmp_encmap+15794,0,226},{__big5hkscs_bmp_encmap+16021,2,251},{\r
+__big5hkscs_bmp_encmap+16271,2,248},{__big5hkscs_bmp_encmap+16518,5,220},{\r
+__big5hkscs_bmp_encmap+16734,2,217},{__big5hkscs_bmp_encmap+16950,12,254},{\r
+__big5hkscs_bmp_encmap+17193,8,245},{__big5hkscs_bmp_encmap+17431,6,244},{\r
+__big5hkscs_bmp_encmap+17670,6,254},{__big5hkscs_bmp_encmap+17919,11,252},{\r
+__big5hkscs_bmp_encmap+18161,18,252},{__big5hkscs_bmp_encmap+18396,37,254},{\r
+__big5hkscs_bmp_encmap+18614,7,223},{__big5hkscs_bmp_encmap+18831,6,250},{\r
+__big5hkscs_bmp_encmap+19076,2,246},{__big5hkscs_bmp_encmap+19321,3,246},{\r
+__big5hkscs_bmp_encmap+19565,24,255},{__big5hkscs_bmp_encmap+19797,11,237},{\r
+__big5hkscs_bmp_encmap+20024,5,248},{__big5hkscs_bmp_encmap+20268,3,252},{\r
+__big5hkscs_bmp_encmap+20518,2,239},{__big5hkscs_bmp_encmap+20756,112,245},{\r
+__big5hkscs_bmp_encmap+20890,4,255},{__big5hkscs_bmp_encmap+21142,0,231},{\r
+__big5hkscs_bmp_encmap+21374,28,249},{__big5hkscs_bmp_encmap+21596,12,226},{\r
+__big5hkscs_bmp_encmap+21811,81,247},{__big5hkscs_bmp_encmap+21978,3,212},{\r
+__big5hkscs_bmp_encmap+22188,1,242},{__big5hkscs_bmp_encmap+22430,25,249},{\r
+__big5hkscs_bmp_encmap+22655,8,196},{__big5hkscs_bmp_encmap+22844,81,254},{\r
+__big5hkscs_bmp_encmap+23018,8,253},{__big5hkscs_bmp_encmap+23264,3,244},{\r
+__big5hkscs_bmp_encmap+23506,1,246},{__big5hkscs_bmp_encmap+23752,45,244},{\r
+__big5hkscs_bmp_encmap+23952,29,244},{__big5hkscs_bmp_encmap+24168,3,245},{\r
+__big5hkscs_bmp_encmap+24411,20,245},{__big5hkscs_bmp_encmap+24637,14,245},{\r
+__big5hkscs_bmp_encmap+24869,12,255},{__big5hkscs_bmp_encmap+25113,2,255},{\r
+__big5hkscs_bmp_encmap+25367,2,124},{__big5hkscs_bmp_encmap+25490,2,252},{\r
+__big5hkscs_bmp_encmap+25741,10,254},{__big5hkscs_bmp_encmap+25986,2,179},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{__big5hkscs_bmp_encmap+26164,7,7},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{__big5hkscs_bmp_encmap+26165,2,237},\r
+};\r
+\r
+static const DBCHAR __big5hkscs_nonbmp_encmap[29306] = {\r
+40049,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37749,N,N,N,N,N,\r
+N,N,37750,N,N,N,N,N,N,N,38216,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,36550,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35781,35834,\r
+N,N,51324,N,N,N,N,N,N,N,N,N,39604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34894,34891,\r
+51322,34888,N,N,N,34887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,41206,34885,N,34899,N,N,N,N,N,N,N,N,N,64685,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36085,N,N,N,N,35501,N,37490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,64583,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38111,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40913,64459,N,N,N,N,N,N,N,37501,N,N,N,N,N,N,N,\r
+39076,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38119,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37067,37499,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38104,N,N,N,N,64607,N,\r
+64084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39605,N,N,N,N,N,N,N,38618,\r
+37497,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64116,37493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36347,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35401,N,N,N,37599,39804,64099,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,64096,37485,64098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39606,N,N,N,N,N,N,38763,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64874,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64852,N,37491,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38872,N,N,N,N,\r
+N,N,40891,37698,37494,N,N,N,N,N,N,N,N,N,N,64101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37484,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64110,N,N,N,N,N,N,40672,N,N,37568,37567,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37566,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39610,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35507,N,38773,64064,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64118,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64464,N,N,N,N,N,N,N,N,N,N,N,N,N,64123,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,65133,N,N,N,N,N,N,39859,N,N,N,N,N,35276,N,N,N,N,39614,N,N,N,N,N,\r
+N,N,N,N,64066,37564,N,N,N,N,N,N,N,N,N,N,37980,39861,N,N,N,39615,N,N,N,39079,\r
+38820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37117,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64635,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39616,37571,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35498,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39888,38224,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37574,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39078,38214,N,N,N,N,N,N,N,N,N,N,N,N,64867,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64194,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40643,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35250,40038,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36947,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,35938,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38849,N,N,N,N,N,N,N,N,N,N,N,N,N,39620,N,N,N,N,N,N,N,N,N,N,39621,36591,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64233,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36160,N,N,N,N,N,N,N,N,\r
+37474,35575,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39622,N,N,N,N,N,N,37601,\r
+N,N,N,N,39625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64198,N,N,N,N,N,N,N,\r
+N,38821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39627,N,N,N,64114,35422,N,38112,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37580,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35557,\r
+N,N,N,N,N,65116,39628,N,N,N,N,N,40441,35395,35494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,39629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,64238,39884,N,N,N,39631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39633,N,N,N,N,N,N,\r
+N,N,40442,N,N,N,N,N,40316,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39635,N,N,38822,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39263,N,N,N,64502,\r
+40901,35417,35691,N,N,N,N,N,N,39636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39637,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38818,35396,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40778,N,N,N,N,N,N,N,N,37025,64932,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35428,\r
+35570,35576,40408,N,N,38102,64254,64423,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,39638,N,40781,N,N,64246,N,N,N,N,N,N,N,35415,N,35651,\r
+35652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35510,N,N,N,N,N,35520,N,N,N,\r
+N,N,N,N,N,N,N,40532,N,N,N,N,N,N,N,N,N,N,39639,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39640,39644,N,N,N,N,35530,40616,N,N,37475,39645,35685,35695,35710,N,\r
+N,N,N,36675,N,N,N,N,N,N,37584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35572,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40382,N,N,N,N,N,39649,N,64734,40445,35686,\r
+35696,35701,35556,35748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35565,N,N,N,N,N,N,N,N,\r
+N,35421,N,35656,N,N,N,N,40429,N,N,N,N,40512,N,N,N,N,N,N,N,35567,35574,40566,N,\r
+N,N,N,N,N,N,N,N,40675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,39646,36350,N,N,N,N,64252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,40113,40567,35684,35687,38731,N,N,N,N,N,N,N,N,38483,N,N,N,N,N,N,39648,\r
+35658,N,35569,35543,N,N,N,N,N,N,N,N,N,41131,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35509,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35423,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35566,N,N,39647,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35582,N,N,N,N,N,N,35416,\r
+35747,35751,N,N,N,N,N,39651,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37473,N,N,N,N,N,N,N,N,N,N,40407,40573,40615,40619,36930,N,N,\r
+N,N,N,N,N,N,35705,35706,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39654,N,N,N,N,N,N,N,N,N,N,N,N,39653,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35454,N,N,N,N,N,40516,39655,35452,35697,N,\r
+N,39657,N,N,N,N,N,N,N,N,N,N,N,N,39658,N,N,N,N,N,N,N,N,N,N,N,N,N,39659,N,N,N,N,\r
+N,N,35517,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64334,N,N,N,N,N,N,N,N,N,\r
+N,39661,35577,40547,N,N,N,N,N,35657,35534,35694,N,N,N,N,N,35560,N,N,N,39662,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37582,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35418,35707,\r
+35708,39663,N,N,N,N,N,N,N,N,N,N,N,39664,N,35578,N,N,N,N,N,N,N,35137,N,N,35698,\r
+N,N,N,N,N,N,35571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35752,N,N,N,N,N,N,40622,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40562,64371,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64351,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37050,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37374,40694,\r
+N,N,N,N,N,N,38893,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39667,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,41198,38524,37701,39022,64086,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39669,N,N,\r
+N,64587,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39668,65246,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64695,N,N,N,N,N,N,N,N,N,38897,N,N,N,38855,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40139,\r
+37440,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,40168,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37373,38734,N,N,64360,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,38764,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36034,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38888,N,64362,35700,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,36583,N,N,N,N,N,N,N,N,N,N,N,N,64968,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,37441,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38561,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,36595,39671,N,N,N,N,N,N,N,N,N,N,36774,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64214,40135,N,N,N,N,N,N,N,N,64215,N,N,N,N,N,39672,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64417,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36549,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64420,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64450,N,39617,N,N,N,N,N,37370,65243,38827,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37191,N,64433,N,N,N,N,N,N,N,N,N,36842,N,N,N,N,N,N,38098,65121,64206,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37613,37363,37830,N,37722,64251,N,N,37615,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38983,37734,38997,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38630,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40771,40874,38106,37614,64687,64507,N,\r
+36601,37366,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37732,N,N,N,N,38133,40118,64429,\r
+38990,36676,38653,N,N,N,N,N,N,N,N,N,N,N,N,N,39673,N,N,N,39674,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38761,38356,38987,64426,N,N,39036,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,37354,N,N,N,N,N,40367,40389,N,37361,36529,38825,64428,64696,40121,N,N,N,N,\r
+N,N,N,64432,64722,37835,N,N,39677,N,N,N,N,N,N,N,N,N,N,N,37364,35756,41045,N,N,\r
+N,N,38260,N,N,N,N,38334,N,N,N,N,N,N,N,N,N,N,N,N,38829,N,N,N,N,N,N,N,N,N,N,N,\r
+36585,N,N,37624,38846,37228,38058,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64611,N,\r
+N,N,40390,N,N,N,N,N,N,N,38837,37560,37359,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,65190,38752,37720,38262,36780,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37356,38836,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37367,N,N,N,N,\r
+38730,64329,38264,37820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,37334,37717,37718,38993,N,N,N,N,N,N,N,N,N,N,36856,64448,37874,N,N,\r
+37072,N,N,N,N,N,N,40004,N,N,N,N,N,37461,N,N,N,N,37731,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,37285,N,N,N,N,N,N,N,N,41197,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64875,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,37713,N,N,N,35927,N,N,64120,N,N,N,N,65192,N,N,N,N,N,N,N,N,N,N,N,N,N,37712,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64076,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37623,39744,N,N,N,N,N,N,64462,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,39745,N,N,N,N,N,65197,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,34657,64469,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35778,39548,39746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39747,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40569,N,N,64473,N,N,\r
+N,N,N,N,39748,41127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34670,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,39923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,35961,N,N,N,37726,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35275,N,N,N,N,\r
+N,N,40787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37847,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64481,65232,N,N,N,N,N,N,36081,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,64482,N,N,N,N,N,64739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36980,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64486,N,N,N,39863,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,39749,N,N,N,N,N,N,N,N,N,N,N,N,39751,40784,N,N,N,N,N,39752,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64603,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,39081,N,N,40189,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,34892,39755,N,N,N,64492,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35945,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39848,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35541,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64115,64857,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37282,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64493,N,N,N,N,N,N,40105,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35496,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36162,N,39875,35553,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39758,38352,N,\r
+N,N,36959,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64590,N,N,N,N,N,N,39759,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39760,40646,N,N,N,N,N,\r
+N,N,N,N,N,N,64592,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64883,N,N,\r
+N,N,N,64935,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40354,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64088,64094,N,N,N,N,N,N,N,41049,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64446,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37744,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37745,37751,65263,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37741,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64605,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,37048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35580,N,\r
+64321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40555,38115,36578,35965,N,36567,N,N,N,N,N,N,\r
+40013,N,N,N,38563,N,N,N,N,N,N,N,N,N,N,39761,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35523,N,N,N,N,N,N,N,N,N,N,N,38570,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64616,35693,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64871,35561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64673,37740,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,39762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65136,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,64680,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64745,40116,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,35562,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39763,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39765,N,N,N,38571,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,64679,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39766,35516,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35531,N,N,N,N,N,39767,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35277,N,39769,39771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37797,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39773,N,N,\r
+N,40527,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37795,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35451,N,N,N,35650,38736,36787,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35408,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39776,N,N,N,N,35653,N,N,N,35654,N,N,N,N,N,N,N,N,N,N,N,N,40446,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39778,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37755,N,N,N,N,N,37809,N,N,N,N,N,N,N,35424,N,N,N,N,N,N,N,\r
+N,35544,N,N,N,N,39779,N,N,N,N,N,N,N,N,N,N,35433,N,N,N,35399,N,N,35532,37756,\r
+39781,N,N,N,N,N,N,N,N,N,39782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35442,N,N,N,N,N,N,N,35450,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37807,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35504,N,N,N,N,N,N,N,39784,\r
+N,N,N,N,N,N,N,N,N,N,40611,N,N,64236,35703,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35673,64689,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64699,N,N,N,N,N,N,N,N,N,N,N,\r
+39785,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37800,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35552,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,40529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36703,39786,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,39787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38892,39788,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,65102,N,N,N,N,N,N,64962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37223,\r
+64716,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37814,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37092,N,N,N,N,37093,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40690,37834,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,35772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36678,N,N,\r
+N,N,37839,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64731,64732,N,N,N,N,N,N,N,N,N,N,N,N,N,37824,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64742,38631,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64728,64729,64934,37838,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,38385,N,N,N,N,N,N,N,N,N,40169,N,64740,38063,64119,37836,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36065,N,N,N,N,N,\r
+N,N,N,N,N,N,36954,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35924,N,N,N,N,N,N,N,37823,64337,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,37817,65239,37815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37849,N,N,N,N,N,N,N,N,N,N,N,N,N,37819,37850,\r
+39075,N,N,N,N,N,N,N,N,N,37073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39790,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64112,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39915,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39791,N,N,N,N,N,N,N,64764,N,N,N,N,N,N,N,N,N,N,N,N,N,35648,41083,N,N,N,36001,\r
+38903,N,N,N,37858,64726,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38233,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37798,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64832,N,N,37727,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38898,40054,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,36600,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36075,N,N,N,N,N,N,N,N,36679,N,N,N,N,N,N,N,N,N,N,N,N,39796,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37556,N,\r
+N,N,37357,N,N,38610,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64838,36687,38217,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39797,64092,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,34641,N,N,39801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64843,N,N,N,38611,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64856,N,N,N,N,N,37983,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,41205,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37443,N,N,N,N,N,N,38906,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40409,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38900,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37453,64859,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,39802,N,N,N,N,N,N,N,N,N,40661,N,N,N,N,N,N,N,N,N,N,N,N,64174,N,40137,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37464,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,36552,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,38068,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37857,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37855,N,N,N,N,N,64752,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37868,38902,38607,37854,35535,39842,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37714,N,N,N,N,N,N,\r
+N,N,N,N,N,39074,36071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64878,\r
+36004,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64124,37882,36988,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36711,N,40375,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41193,\r
+64078,64929,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40564,40895,40651,39865,40404,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38841,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38267,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40658,38739,38564,36798,38105,36952,64889,64891,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36570,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36602,34658,N,N,N,N,N,N,N,N,N,N,39845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,40665,38868,37051,64956,64966,37448,N,N,N,N,N,N,N,\r
+37557,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,40385,37561,37542,36683,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39846,N,N,N,N,N,37558,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36416,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,40664,37982,39007,38094,37450,64880,37991,N,N,N,N,N,N,N,\r
+N,N,N,N,36332,N,N,N,N,N,N,N,N,39896,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,34659,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37960,64193,\r
+40183,64958,N,N,N,N,N,N,N,N,N,N,N,N,36826,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64985,N,N,64638,N,N,N,N,N,N,N,N,37881,N,N,\r
+N,N,64067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64235,64195,38867,38393,40008,64984,41176,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64983,64330,39855,37963,64969,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36524,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64946,N,N,\r
+N,N,N,37466,64701,37593,N,N,N,64981,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37597,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37465,N,N,N,N,N,N,N,N,N,N,36080,\r
+38586,N,N,N,N,N,N,N,N,N,N,37467,N,N,N,N,N,N,N,N,N,39851,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64986,64990,N,N,N,64979,N,\r
+N,N,N,N,N,N,N,N,35910,N,N,N,N,N,N,64982,64988,64989,N,N,N,N,37118,N,N,65185,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35757,N,N,40152,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40557,64892,\r
+64353,N,N,N,N,N,N,38648,N,N,N,N,N,N,N,N,38640,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64756,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65120,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38994,38479,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37230,N,N,N,\r
+N,N,N,N,N,N,N,39021,N,N,39012,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,37971,65004,64376,N,N,N,N,N,N,N,N,N,N,N,38330,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,39005,N,37625,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39002,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,34640,N,65014,N,N,N,N,N,N,N,37840,39010,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39853,N,N,N,N,N,N,N,\r
+N,N,N,N,38735,39854,N,N,N,N,N,N,N,N,N,N,N,N,37970,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39856,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37330,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38890,64363,37297,65011,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37579,N,N,N,\r
+N,N,N,N,N,N,39857,N,N,N,N,N,64748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,39019,N,N,N,38737,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39025,38383,N,N,N,N,N,N,N,40691,N,N,N,N,\r
+N,37352,39866,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64332,37482,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65016,39009,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,37351,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37869,38724,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,37345,N,N,64501,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39017,N,N,N,N,\r
+35426,N,N,39867,36008,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40021,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36471,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35506,40636,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37862,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37794,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37757,40550,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37977,N,N,N,N,N,N,N,N,N,39871,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,37976,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40613,39879,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,65108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,35798,N,N,N,N,N,N,38070,64884,39104,38053,N,N,N,N,N,N,N,\r
+39880,N,N,N,38381,64894,64491,N,N,N,N,N,N,N,N,N,N,64893,N,N,N,N,N,N,N,N,N,\r
+38767,37985,N,40897,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38359,N,N,N,\r
+64082,40024,N,N,N,N,N,N,N,N,N,40808,39911,64718,38632,64073,38817,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38221,40696,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,65097,37326,38769,N,N,N,N,36047,N,N,N,64945,N,N,64622,N,N,N,N,N,\r
+40178,37816,36931,38745,38103,65126,38013,64623,N,N,N,N,37446,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64109,N,N,36599,N,64439,N,38012,37581,38834,N,N,N,N,N,N,N,N,N,\r
+65125,38526,38744,39799,37327,N,N,N,N,N,N,N,N,N,38052,N,N,N,N,N,N,N,N,N,N,\r
+40109,N,N,N,N,N,N,N,N,N,35755,N,N,N,38613,64691,N,N,N,37806,N,38765,N,N,N,N,N,\r
+N,37958,38391,N,N,N,N,N,N,N,N,40006,38235,37329,38132,N,65127,37541,N,N,N,\r
+65247,36011,N,39881,N,N,N,N,N,N,N,N,N,N,N,64749,65018,64712,65122,37372,65131,\r
+65017,64711,37198,40120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38759,N,N,N,\r
+38382,N,N,39858,N,N,N,N,37984,N,N,N,38050,39029,38828,37331,N,N,N,N,N,N,N,N,N,\r
+N,N,39035,N,N,N,N,N,N,N,36587,38762,38494,N,N,N,N,N,N,N,N,N,38891,N,N,N,N,N,\r
+40953,38392,65186,36838,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65150,N,N,N,N,N,N,\r
+40356,38760,36588,38077,N,N,N,N,N,N,N,N,N,N,N,N,N,37979,40182,64167,39897,N,N,\r
+N,N,N,N,N,N,N,64093,38486,38754,N,N,N,N,N,N,38074,41039,37592,N,N,N,39883,N,N,\r
+N,N,N,N,38075,N,N,40287,N,N,N,N,N,N,37071,N,N,N,N,N,N,N,N,N,N,N,N,N,37989,N,N,\r
+40780,N,N,N,N,N,N,37080,36187,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40638,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64365,38346,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,40386,38904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36860,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38003,\r
+38004,N,N,N,N,N,N,N,N,N,N,N,N,65207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35403,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35413,35689,35548,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35702,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39886,N,35432,41208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,39135,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,65205,N,N,N,39887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38651,N,\r
+N,39931,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40654,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36581,N,\r
+N,N,N,N,N,N,N,N,40571,39890,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,35493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,65230,35397,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,40444,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65231,35749,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35914,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35564,N,N,64736,38061,65237,38060,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64602,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39894,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35439,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35753,36447,N,N,40395,N,\r
+64743,39895,N,N,N,N,N,N,N,N,N,N,N,37832,N,N,N,N,N,N,N,N,N,37360,36832,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39899,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37101,N,39900,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36179,41196,N,N,N,\r
+39162,N,N,N,N,N,N,N,N,N,39904,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37831,37449,38625,39906,N,N,N,39908,N,N,36833,39909,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38080,N,N,37827,N,N,N,N,N,N,N,N,N,N,37829,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36985,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38779,N,N,N,N,N,\r
+36990,N,N,N,N,65254,65094,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40376,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,37488,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38312,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36016,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,38088,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39097,37184,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64702,N,N,N,N,N,N,N,37207,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35762,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64223,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,39910,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38467,36420,40015,65268,\r
+N,N,N,N,N,39912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37852,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38511,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36426,39917,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37622,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40377,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,36430,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,64463,34656,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40642,\r
+N,N,N,N,N,N,38117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39920,38116,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,38225,35771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39921,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,38128,36452,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38122,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36705,N,N,N,39780,36443,N,N,N,N,\r
+39922,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40894,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40393,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36460,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36723,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36015,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,36725,36465,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36448,36458,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,35916,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38226,38228,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40379,38211,37630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,38130,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38129,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41194,40402,41137,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37368,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37986,39844,\r
+36525,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40621,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38608,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65262,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,35508,N,N,N,N,N,N,N,N,N,N,N,N,38743,35447,39927,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36533,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41069,\r
+36534,38742,38208,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,41203,38078,N,N,N,39930,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64991,40380,N,N,N,N,N,N,N,\r
+N,38142,N,N,N,N,N,N,N,N,35803,41214,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,36544,40775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35806,41211,N,N,N,N,\r
+36547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38473,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,65218,N,N,38220,39933,N,N,N,N,N,N,N,N,N,N,N,N,N,37068,\r
+40032,38219,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39934,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40048,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,40003,N,N,N,40007,36556,N,N,N,36436,N,N,N,N,N,N,N,N,N,N,36580,\r
+40009,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38238,N,N,N,N,N,N,N,\r
+N,N,N,N,N,38236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40011,35809,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36569,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40372,N,\r
+37471,N,N,N,40012,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35489,N,N,N,N,N,N,N,N,N,N,N,N,N,36571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40022,35490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38740,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40030,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40660,38248,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,41155,35558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,41207,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40033,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64589,N,40539,N,N,N,N,N,N,N,N,40553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40035,65223,N,N,65222,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40039,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40041,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,37221,N,N,N,N,N,N,N,N,N,N,N,N,40167,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,35412,N,N,N,N,N,N,N,40044,40046,65117,N,N,N,N,N,40051,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,38250,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38253,36592,36685,N,\r
+N,N,N,36598,N,N,N,N,N,N,N,N,64188,N,36053,N,N,N,N,N,N,N,N,N,N,N,N,N,34654,N,N,\r
+N,N,64474,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35660,64885,39901,64245,N,N,N,N,N,N,N,40052,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,38213,N,N,N,N,N,N,N,N,N,N,N,N,38598,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,36714,36686,N,N,N,N,N,40056,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64085,N,N,N,N,N,N,N,N,N,N,N,N,38884,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40001,37468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38650,36086,N,N,N,N,36173,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64358,36453,38985,\r
+64424,38978,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40058,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38907,37066,N,N,N,N,40027,N,N,38733,\r
+N,N,36563,N,N,N,N,N,N,N,N,N,N,N,N,N,38241,40779,40885,37842,64938,38976,37190,\r
+39015,64090,64425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,38977,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,36051,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64765,64939,37309,36684,38601,36693,64430,38255,N,N,\r
+N,N,N,N,40061,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,41200,N,N,N,N,N,N,N,N,N,N,N,N,N,37999,64940,N,N,N,N,\r
+38603,38606,N,N,N,N,41046,N,40161,N,N,N,N,N,N,N,N,N,N,38596,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+36702,36716,36515,64435,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64595,N,N,N,64947,N,N,N,N,36715,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38602,N,N,N,N,N,N,34643,N,N,N,N,N,N,N,N,N,N,N,N,N,36729,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,40559,41157,64632,36418,36698,37058,36517,36961,37455,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37747,64949,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,65228,N,64445,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36054,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38979,38597,\r
+35260,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40099,N,N,N,N,N,N,37451,38986,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,36772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,41201,40699,40146,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36775,N,N,N,N,34644,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64604,38981,N,N,36934,36049,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65274,38240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,40776,37447,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37115,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40100,38257,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,34629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40102,N,N,N,N,\r
+40103,N,N,N,N,N,40106,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,40659,N,N,N,40560,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40108,34642,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36782,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,36176,38269,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40112,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38838,N,41149,35551,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,36797,N,N,N,36799,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37737,\r
+39847,51364,N,N,N,N,65258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,39905,N,N,N,N,N,N,35649,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,40374,41195,39843,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,35745,36808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,35148,39008,N,N,N,N,N,N,N,N,N,N,38087,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,35672,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38315,38314,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,40131,40132,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,40364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35814,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35441,36817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,39381,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37108,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35491,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40142,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40148,40149,N,N,N,64456,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40371,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64624,N,N,N,N,N,36823,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39795,N,N,N,N,N,N,N,N,N,N,64091,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36818,36964,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39094,\r
+38504,N,N,N,N,40150,N,N,N,N,N,N,N,N,N,N,N,N,39101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36828,65270,36825,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38209,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,34668,N,N,N,N,38899,39928,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+34650,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34632,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34634,40556,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36850,36846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40151,N,N,N,N,N,N,N,N,N,N,N,N,40558,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35392,N,\r
+N,N,N,N,N,N,N,N,N,36847,N,N,N,N,N,N,N,N,36852,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36853,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38338,39018,N,38863,40677,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40572,\r
+36929,N,N,N,N,N,N,40155,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37953,N,N,N,N,\r
+40166,40368,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,40170,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40173,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40186,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,35682,35406,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40138,35430,N,N,N,N,N,N,N,N,N,N,40187,40188,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40190,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,35411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40165,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40256,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40257,N,N,N,N,N,N,N,N,N,N,N,N,36933,35699,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38858,N,40258,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,35425,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35758,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35538,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,35746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40434,\r
+40259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40159,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,40260,N,N,N,N,N,N,N,N,N,N,36554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36942,N,N,N,N,N,N,N,36531,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,40949,N,N,N,N,N,N,N,N,N,N,N,N,40261,36943,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,40263,N,N,N,35274,N,N,N,N,N,N,40117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64510,\r
+36958,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36963,36951,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36966,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,39872,N,N,N,N,N,N,N,N,N,N,N,64741,37218,N,N,N,N,N,N,N,N,N,N,36967,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36769,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,36770,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40264,64211,N,N,N,N,N,N,36175,N,N,N,N,N,N,N,N,N,36957,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37049,N,N,N,N,N,N,N,N,N,N,N,N,N,36971,\r
+35932,N,N,N,36969,65111,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,65109,36979,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+39919,40176,N,N,N,N,N,N,N,N,N,N,N,N,40267,N,N,N,N,N,N,N,N,N,N,N,N,N,65241,N,N,\r
+N,65242,N,N,N,37344,36163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37336,N,N,N,N,N,N,N,\r
+N,N,N,38470,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37728,\r
+N,64083,40147,N,N,N,N,N,N,N,N,N,N,N,N,40270,N,N,N,64320,N,N,N,36322,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37954,N,36950,N,N,39013,N,35948,\r
+64074,N,N,40272,40274,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38319,38746,37705,38727,\r
+41204,N,N,N,N,N,N,38776,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36815,N,N,N,64608,N,N,N,N,\r
+N,N,N,N,35918,N,N,N,64598,N,N,N,N,N,N,N,N,N,N,N,N,N,37340,38497,37612,37725,\r
+36574,38654,64847,38366,N,N,N,N,N,N,N,N,N,N,N,N,N,39088,41024,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38845,38781,38901,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39852,64218,37570,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38833,N,N,N,N,N,36987,N,\r
+N,N,N,37886,38011,N,38775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64190,64835,37062,\r
+37028,37032,38057,N,37033,N,N,N,N,35941,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38368,36989,N,N,N,N,N,N,37477,N,N,N,N,N,N,N,N,N,N,N,N,N,64954,37828,N,N,N,N,N,\r
+N,N,N,65261,40363,41187,N,38472,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40275,N,N,N,N,N,35497,N,39877,N,38493,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+38751,38495,38510,64349,N,N,N,N,N,40369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65187,N,N,N,N,N,N,N,N,N,40370,N,N,38318,64675,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34665,N,N,N,N,N,N,N,N,\r
+41122,N,N,38485,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40276,N,N,37697,N,38317,37333,N,N,\r
+N,N,N,N,N,N,N,N,N,N,38778,65020,36423,37885,37029,37036,N,N,N,N,N,N,N,N,38316,\r
+N,N,N,N,N,N,N,N,N,37038,65189,N,N,N,N,N,40278,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38883,38370,N,N,N,N,N,37990,N,N,38471,N,N,N,N,37304,N,N,N,N,40172,N,N,N,N,\r
+N,N,N,N,37037,N,38371,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35663,\r
+N,N,35555,N,N,N,N,35661,38378,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35662,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36033,\r
+35821,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,37337,N,N,41124,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38389,38388,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40883,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,65199,N,N,N,N,N,65138,37498,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65196,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,38387,40280,36166,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37746,N,N,37317,N,N,N,N,N,N,\r
+N,38466,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37069,38398,\r
+37209,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40037,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38860,37070,N,N,N,N,N,N,40281,64757,65277,N,N,\r
+40283,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,40284,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37758,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,39084,N,N,40286,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64976,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64864,N,\r
+N,N,N,N,N,N,N,N,N,N,40143,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37085,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37088,37107,N,N,39089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37104,N,N,N,N,\r
+N,N,N,N,N,N,N,37821,N,N,N,N,N,N,N,N,38327,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40774,N,N,N,N,N,N,N,N,36427,38488,N,N,N,N,N,N,N,N,N,N,35404,N,40291,40655,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40293,N,N,N,N,N,N,N,40294,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38490,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40292,N,N,N,N,N,N,N,N,N,N,35436,35545,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40295,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,35440,35827,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37200,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,40129,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,40296,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37799,N,N,N,N,N,N,38516,N,N,N,N,N,N,N,N,36093,41199,N,37201,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38593,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34679,N,35940,38518,40297,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,64676,N,N,N,N,N,N,N,N,N,N,N,N,40298,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37454,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,40299,N,N,N,N,N,39873,40300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,35429,37213,N,N,N,N,N,N,N,N,40301,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37210,35906,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40128,37226,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,40302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,40614,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40397,N,N,40303,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35259,40697,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,38580,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,37234,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+40648,N,N,N,34673,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35669,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,40305,40306,N,N,N,N,N,N,N,N,N,N,N,N,40652,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,37236,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,40656,36956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,36562,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37288,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37239,N,N,N,N,N,N,N,N,N,N,N,\r
+38591,N,N,N,N,N,38592,N,N,N,N,36785,N,N,N,N,N,38583,35925,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37240,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35262,\r
+37244,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64375,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37237,37283,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,37238,N,N,N,N,N,N,N,N,38590,36169,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,37241,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,38582,37284,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+37286,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40309,N,N,N,N,N,N,N,N,N,N,N,36946,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41029,N,37289,N,39082,N,N,N,35935,N,N,35754,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40157,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40311,34646,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,35136,40684,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,37802,38008,N,N,N,N,40314,35529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35659,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40940,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+35554,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,40565,39028,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,39624,N,N,N,N,41031,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,35779,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64631,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,40018,36605,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36776,N,N,N,N,N,N,N,N,N,\r
+38266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,36848,\r
+};\r
+\r
+static const struct unim_index big5hkscs_nonbmp_encmap[256] = {\r
+{__big5hkscs_nonbmp_encmap+0,33,238},{__big5hkscs_nonbmp_encmap+206,12,242},{\r
+__big5hkscs_nonbmp_encmap+437,4,229},{__big5hkscs_nonbmp_encmap+663,10,252},{\r
+__big5hkscs_nonbmp_encmap+906,19,254},{__big5hkscs_nonbmp_encmap+1142,71,235},\r
+{__big5hkscs_nonbmp_encmap+1307,17,118},{__big5hkscs_nonbmp_encmap+1409,14,121\r
+},{__big5hkscs_nonbmp_encmap+1517,44,213},{__big5hkscs_nonbmp_encmap+1687,22,\r
+231},{__big5hkscs_nonbmp_encmap+1897,17,205},{__big5hkscs_nonbmp_encmap+2086,\r
+13,255},{__big5hkscs_nonbmp_encmap+2329,11,255},{__big5hkscs_nonbmp_encmap+\r
+2574,21,200},{__big5hkscs_nonbmp_encmap+2754,4,251},{__big5hkscs_nonbmp_encmap\r
++3002,29,237},{__big5hkscs_nonbmp_encmap+3211,20,246},{\r
+__big5hkscs_nonbmp_encmap+3438,47,217},{__big5hkscs_nonbmp_encmap+3609,60,254\r
+},{__big5hkscs_nonbmp_encmap+3804,2,254},{__big5hkscs_nonbmp_encmap+4057,19,\r
+253},{__big5hkscs_nonbmp_encmap+4292,119,150},{__big5hkscs_nonbmp_encmap+4324,\r
+10,254},{__big5hkscs_nonbmp_encmap+4569,13,252},{__big5hkscs_nonbmp_encmap+\r
+4809,32,250},{__big5hkscs_nonbmp_encmap+5028,3,243},{__big5hkscs_nonbmp_encmap\r
++5269,45,99},{__big5hkscs_nonbmp_encmap+5324,68,194},{\r
+__big5hkscs_nonbmp_encmap+5451,42,172},{__big5hkscs_nonbmp_encmap+5582,70,249\r
+},{__big5hkscs_nonbmp_encmap+5762,28,213},{__big5hkscs_nonbmp_encmap+5948,15,\r
+232},{__big5hkscs_nonbmp_encmap+6166,69,252},{__big5hkscs_nonbmp_encmap+6350,\r
+42,195},{__big5hkscs_nonbmp_encmap+6504,8,124},{__big5hkscs_nonbmp_encmap+6621\r
+,33,250},{__big5hkscs_nonbmp_encmap+6839,101,237},{__big5hkscs_nonbmp_encmap+\r
+6976,19,190},{__big5hkscs_nonbmp_encmap+7148,27,246},{\r
+__big5hkscs_nonbmp_encmap+7368,18,205},{__big5hkscs_nonbmp_encmap+7556,3,247},\r
+{__big5hkscs_nonbmp_encmap+7801,38,147},{__big5hkscs_nonbmp_encmap+7911,102,\r
+232},{__big5hkscs_nonbmp_encmap+8042,14,206},{__big5hkscs_nonbmp_encmap+8235,\r
+38,201},{__big5hkscs_nonbmp_encmap+8399,7,238},{__big5hkscs_nonbmp_encmap+8631\r
+,13,239},{__big5hkscs_nonbmp_encmap+8858,116,227},{__big5hkscs_nonbmp_encmap+\r
+8970,51,218},{__big5hkscs_nonbmp_encmap+9138,3,249},{__big5hkscs_nonbmp_encmap\r
++9385,15,225},{__big5hkscs_nonbmp_encmap+9596,0,254},{\r
+__big5hkscs_nonbmp_encmap+9851,0,229},{__big5hkscs_nonbmp_encmap+10081,25,243\r
+},{__big5hkscs_nonbmp_encmap+10300,0,238},{__big5hkscs_nonbmp_encmap+10539,3,\r
+215},{__big5hkscs_nonbmp_encmap+10752,58,58},{__big5hkscs_nonbmp_encmap+10753,\r
+194,194},{__big5hkscs_nonbmp_encmap+10754,167,250},{__big5hkscs_nonbmp_encmap+\r
+10838,26,90},{__big5hkscs_nonbmp_encmap+10903,99,255},{\r
+__big5hkscs_nonbmp_encmap+11060,64,248},{__big5hkscs_nonbmp_encmap+11245,6,252\r
+},{__big5hkscs_nonbmp_encmap+11492,53,240},{__big5hkscs_nonbmp_encmap+11680,\r
+17,236},{__big5hkscs_nonbmp_encmap+11900,4,252},{__big5hkscs_nonbmp_encmap+\r
+12149,27,250},{__big5hkscs_nonbmp_encmap+12373,13,248},{\r
+__big5hkscs_nonbmp_encmap+12609,4,214},{__big5hkscs_nonbmp_encmap+12820,5,200\r
+},{__big5hkscs_nonbmp_encmap+13016,24,212},{__big5hkscs_nonbmp_encmap+13205,6,\r
+224},{__big5hkscs_nonbmp_encmap+13424,18,255},{__big5hkscs_nonbmp_encmap+13662\r
+,0,251},{__big5hkscs_nonbmp_encmap+13914,14,233},{__big5hkscs_nonbmp_encmap+\r
+14134,15,245},{__big5hkscs_nonbmp_encmap+14365,9,217},{\r
+__big5hkscs_nonbmp_encmap+14574,6,235},{__big5hkscs_nonbmp_encmap+14804,59,167\r
+},{__big5hkscs_nonbmp_encmap+14913,14,194},{__big5hkscs_nonbmp_encmap+15094,\r
+44,157},{__big5hkscs_nonbmp_encmap+15208,43,231},{__big5hkscs_nonbmp_encmap+\r
+15397,32,216},{__big5hkscs_nonbmp_encmap+15582,14,19},{\r
+__big5hkscs_nonbmp_encmap+15588,25,154},{__big5hkscs_nonbmp_encmap+15718,49,\r
+224},{__big5hkscs_nonbmp_encmap+15894,5,246},{__big5hkscs_nonbmp_encmap+16136,\r
+6,225},{__big5hkscs_nonbmp_encmap+16356,87,225},{__big5hkscs_nonbmp_encmap+\r
+16495,3,204},{__big5hkscs_nonbmp_encmap+16697,84,233},{\r
+__big5hkscs_nonbmp_encmap+16847,116,232},{__big5hkscs_nonbmp_encmap+16964,1,\r
+254},{__big5hkscs_nonbmp_encmap+17218,32,67},{__big5hkscs_nonbmp_encmap+17254,\r
+14,216},{__big5hkscs_nonbmp_encmap+17457,26,226},{__big5hkscs_nonbmp_encmap+\r
+17658,41,165},{__big5hkscs_nonbmp_encmap+17783,2,221},{\r
+__big5hkscs_nonbmp_encmap+18003,88,208},{__big5hkscs_nonbmp_encmap+18124,53,\r
+248},{__big5hkscs_nonbmp_encmap+18320,2,152},{__big5hkscs_nonbmp_encmap+18471,\r
+18,191},{__big5hkscs_nonbmp_encmap+18645,18,252},{__big5hkscs_nonbmp_encmap+\r
+18880,22,204},{__big5hkscs_nonbmp_encmap+19063,28,199},{\r
+__big5hkscs_nonbmp_encmap+19235,14,250},{__big5hkscs_nonbmp_encmap+19472,45,82\r
+},{__big5hkscs_nonbmp_encmap+19510,5,247},{__big5hkscs_nonbmp_encmap+19753,33,\r
+209},{__big5hkscs_nonbmp_encmap+19930,34,240},{__big5hkscs_nonbmp_encmap+20137\r
+,0,215},{__big5hkscs_nonbmp_encmap+20353,38,223},{__big5hkscs_nonbmp_encmap+\r
+20539,14,248},{__big5hkscs_nonbmp_encmap+20774,9,205},{\r
+__big5hkscs_nonbmp_encmap+20971,27,230},{__big5hkscs_nonbmp_encmap+21175,82,\r
+255},{__big5hkscs_nonbmp_encmap+21349,34,134},{__big5hkscs_nonbmp_encmap+21450\r
+,116,254},{__big5hkscs_nonbmp_encmap+21589,7,148},{__big5hkscs_nonbmp_encmap+\r
+21731,15,204},{__big5hkscs_nonbmp_encmap+21921,88,200},{\r
+__big5hkscs_nonbmp_encmap+22034,36,253},{__big5hkscs_nonbmp_encmap+22252,10,\r
+244},{__big5hkscs_nonbmp_encmap+22487,6,244},{__big5hkscs_nonbmp_encmap+22726,\r
+18,197},{__big5hkscs_nonbmp_encmap+22906,47,220},{__big5hkscs_nonbmp_encmap+\r
+23080,77,79},{__big5hkscs_nonbmp_encmap+23083,46,249},{\r
+__big5hkscs_nonbmp_encmap+23287,2,244},{__big5hkscs_nonbmp_encmap+23530,46,188\r
+},{__big5hkscs_nonbmp_encmap+23673,7,226},{__big5hkscs_nonbmp_encmap+23893,6,\r
+138},{__big5hkscs_nonbmp_encmap+24026,18,130},{__big5hkscs_nonbmp_encmap+24139\r
+,1,244},{__big5hkscs_nonbmp_encmap+24383,0,230},{__big5hkscs_nonbmp_encmap+\r
+24614,15,19},{__big5hkscs_nonbmp_encmap+24619,4,43},{__big5hkscs_nonbmp_encmap\r
++24659,51,252},{__big5hkscs_nonbmp_encmap+24861,15,252},{\r
+__big5hkscs_nonbmp_encmap+25099,12,255},{__big5hkscs_nonbmp_encmap+25343,3,210\r
+},{__big5hkscs_nonbmp_encmap+25551,52,185},{__big5hkscs_nonbmp_encmap+25685,\r
+15,231},{__big5hkscs_nonbmp_encmap+25902,197,197},{__big5hkscs_nonbmp_encmap+\r
+25903,121,237},{__big5hkscs_nonbmp_encmap+26020,13,235},{0,0,0},{0,0,0},{\r
+__big5hkscs_nonbmp_encmap+26243,29,231},{__big5hkscs_nonbmp_encmap+26446,158,\r
+244},{0,0,0},{__big5hkscs_nonbmp_encmap+26533,32,212},{\r
+__big5hkscs_nonbmp_encmap+26714,16,250},{__big5hkscs_nonbmp_encmap+26949,3,201\r
+},{__big5hkscs_nonbmp_encmap+27148,40,77},{__big5hkscs_nonbmp_encmap+27186,5,\r
+213},{__big5hkscs_nonbmp_encmap+27395,115,173},{__big5hkscs_nonbmp_encmap+\r
+27454,62,246},{__big5hkscs_nonbmp_encmap+27639,6,248},{\r
+__big5hkscs_nonbmp_encmap+27882,35,222},{__big5hkscs_nonbmp_encmap+28070,20,\r
+254},{__big5hkscs_nonbmp_encmap+28305,7,245},{__big5hkscs_nonbmp_encmap+28544,\r
+32,255},{__big5hkscs_nonbmp_encmap+28768,81,169},{__big5hkscs_nonbmp_encmap+\r
+28857,52,91},{__big5hkscs_nonbmp_encmap+28897,198,203},{\r
+__big5hkscs_nonbmp_encmap+28903,1,169},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__big5hkscs_nonbmp_encmap+29072,37,205},{__big5hkscs_nonbmp_encmap+29241,148,\r
+212},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jisx0213_pair.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jisx0213_pair.h
new file mode 100644 (file)
index 0000000..3f1424f
--- /dev/null
@@ -0,0 +1,59 @@
+#define JISX0213_ENCPAIRS 46\r
+#ifdef EXTERN_JISX0213_PAIR\r
+static const struct widedbcs_index *jisx0213_pair_decmap;\r
+static const struct pair_encodemap *jisx0213_pair_encmap;\r
+#else\r
+static const ucs4_t __jisx0213_pair_decmap[49] = {\r
+810234010,810365082,810496154,810627226,810758298,816525466,816656538,\r
+816787610,816918682,817049754,817574042,818163866,818426010,838283418,\r
+15074048,U,U,U,39060224,39060225,42730240,42730241,39387904,39387905,39453440,\r
+39453441,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,48825061,48562921,\r
+};\r
+\r
+static const struct widedbcs_index jisx0213_pair_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_pair_decmap\r
++0,119,123},{__jisx0213_pair_decmap+5,119,126},{__jisx0213_pair_decmap+13,120,\r
+120},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_pair_decmap+14,68,102},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const struct pair_encodemap jisx0213_pair_encmap[JISX0213_ENCPAIRS] = {\r
+{0x00e60000,0x295c},{0x00e60300,0x2b44},{0x02540000,0x2b38},{0x02540300,0x2b48\r
+},{0x02540301,0x2b49},{0x02590000,0x2b30},{0x02590300,0x2b4c},{0x02590301,\r
+0x2b4d},{0x025a0000,0x2b43},{0x025a0300,0x2b4e},{0x025a0301,0x2b4f},{\r
+0x028c0000,0x2b37},{0x028c0300,0x2b4a},{0x028c0301,0x2b4b},{0x02e50000,0x2b60\r
+},{0x02e502e9,0x2b66},{0x02e90000,0x2b64},{0x02e902e5,0x2b65},{0x304b0000,\r
+0x242b},{0x304b309a,0x2477},{0x304d0000,0x242d},{0x304d309a,0x2478},{\r
+0x304f0000,0x242f},{0x304f309a,0x2479},{0x30510000,0x2431},{0x3051309a,0x247a\r
+},{0x30530000,0x2433},{0x3053309a,0x247b},{0x30ab0000,0x252b},{0x30ab309a,\r
+0x2577},{0x30ad0000,0x252d},{0x30ad309a,0x2578},{0x30af0000,0x252f},{\r
+0x30af309a,0x2579},{0x30b10000,0x2531},{0x30b1309a,0x257a},{0x30b30000,0x2533\r
+},{0x30b3309a,0x257b},{0x30bb0000,0x253b},{0x30bb309a,0x257c},{0x30c40000,\r
+0x2544},{0x30c4309a,0x257d},{0x30c80000,0x2548},{0x30c8309a,0x257e},{\r
+0x31f70000,0x2675},{0x31f7309a,0x2678},\r
+};\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jp.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_jp.h
new file mode 100644 (file)
index 0000000..1dd865c
--- /dev/null
@@ -0,0 +1,4765 @@
+static const ucs2_t __jisx0208_decmap[6956] = {\r
+12288,12289,12290,65292,65294,12539,65306,65307,65311,65281,12443,12444,180,\r
+65344,168,65342,65507,65343,12541,12542,12445,12446,12291,20189,12293,12294,\r
+12295,12540,8213,8208,65295,92,12316,8214,65372,8230,8229,8216,8217,8220,8221,\r
+65288,65289,12308,12309,65339,65341,65371,65373,12296,12297,12298,12299,12300,\r
+12301,12302,12303,12304,12305,65291,8722,177,215,247,65309,8800,65308,65310,\r
+8806,8807,8734,8756,9794,9792,176,8242,8243,8451,65509,65284,162,163,65285,\r
+65283,65286,65290,65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,\r
+9650,9661,9660,8251,12306,8594,8592,8593,8595,12307,U,U,U,U,U,U,U,U,U,U,U,\r
+8712,8715,8838,8839,8834,8835,8746,8745,U,U,U,U,U,U,U,U,8743,8744,172,8658,\r
+8660,8704,8707,U,U,U,U,U,U,U,U,U,U,U,8736,8869,8978,8706,8711,8801,8786,8810,\r
+8811,8730,8765,8733,8757,8747,8748,U,U,U,U,U,U,U,8491,8240,9839,9837,9834,\r
+8224,8225,182,U,U,U,U,9711,65296,65297,65298,65299,65300,65301,65302,65303,\r
+65304,65305,U,U,U,U,U,U,U,65313,65314,65315,65316,65317,65318,65319,65320,\r
+65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,65333,\r
+65334,65335,65336,65337,65338,U,U,U,U,U,U,65345,65346,65347,65348,65349,65350,\r
+65351,65352,65353,65354,65355,65356,65357,65358,65359,65360,65361,65362,65363,\r
+65364,65365,65366,65367,65368,65369,65370,12353,12354,12355,12356,12357,12358,\r
+12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,12369,12370,12371,\r
+12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,12382,12383,12384,\r
+12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,12395,12396,12397,\r
+12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,12408,12409,12410,\r
+12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,12421,12422,12423,\r
+12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,12434,12435,12449,\r
+12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,12460,12461,12462,\r
+12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,12473,12474,12475,\r
+12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,12486,12487,12488,\r
+12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,12499,12500,12501,\r
+12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,12512,12513,12514,\r
+12515,12516,12517,12518,12519,12520,12521,12522,12523,12524,12525,12526,12527,\r
+12528,12529,12530,12531,12532,12533,12534,913,914,915,916,917,918,919,920,921,\r
+922,923,924,925,926,927,928,929,931,932,933,934,935,936,937,U,U,U,U,U,U,U,U,\r
+945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,963,964,\r
+965,966,967,968,969,1040,1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,\r
+1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,\r
+1065,1066,1067,1068,1069,1070,1071,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,1072,1073,\r
+1074,1075,1076,1077,1105,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,\r
+1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,\r
+1103,9472,9474,9484,9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,\r
+9491,9499,9495,9507,9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,\r
+9509,9528,9538,20124,21782,23043,38463,21696,24859,25384,23030,36898,33909,\r
+33564,31312,24746,25569,28197,26093,33894,33446,39925,26771,22311,26017,25201,\r
+23451,22992,34427,39156,32098,32190,39822,25110,31903,34999,23433,24245,25353,\r
+26263,26696,38343,38797,26447,20197,20234,20301,20381,20553,22258,22839,22996,\r
+23041,23561,24799,24847,24944,26131,26885,28858,30031,30064,31227,32173,32239,\r
+32963,33806,34915,35586,36949,36986,21307,20117,20133,22495,32946,37057,30959,\r
+19968,22769,28322,36920,31282,33576,33419,39983,20801,21360,21693,21729,22240,\r
+23035,24341,39154,28139,32996,34093,38498,38512,38560,38907,21515,21491,23431,\r
+28879,32701,36802,38632,21359,40284,31418,19985,30867,33276,28198,22040,21764,\r
+27421,34074,39995,23013,21417,28006,29916,38287,22082,20113,36939,38642,33615,\r
+39180,21473,21942,23344,24433,26144,26355,26628,27704,27891,27945,29787,30408,\r
+31310,38964,33521,34907,35424,37613,28082,30123,30410,39365,24742,35585,36234,\r
+38322,27022,21421,20870,22290,22576,22852,23476,24310,24616,25513,25588,27839,\r
+28436,28814,28948,29017,29141,29503,32257,33398,33489,34199,36960,37467,40219,\r
+22633,26044,27738,29989,20985,22830,22885,24448,24540,25276,26106,27178,27431,\r
+27572,29579,32705,35158,40236,40206,40644,23713,27798,33659,20740,23627,25014,\r
+33222,26742,29281,20057,20474,21368,24681,28201,31311,38899,19979,21270,20206,\r
+20309,20285,20385,20339,21152,21487,22025,22799,23233,23478,23521,31185,26247,\r
+26524,26550,27468,27827,28779,29634,31117,31166,31292,31623,33457,33499,33540,\r
+33655,33775,33747,34662,35506,22057,36008,36838,36942,38686,34442,20420,23784,\r
+25105,29273,30011,33253,33469,34558,36032,38597,39187,39381,20171,20250,35299,\r
+22238,22602,22730,24315,24555,24618,24724,24674,25040,25106,25296,25913,39745,\r
+26214,26800,28023,28784,30028,30342,32117,33445,34809,38283,38542,35997,20977,\r
+21182,22806,21683,23475,23830,24936,27010,28079,30861,33995,34903,35442,37799,\r
+39608,28012,39336,34521,22435,26623,34510,37390,21123,22151,21508,24275,25313,\r
+25785,26684,26680,27579,29554,30906,31339,35226,35282,36203,36611,37101,38307,\r
+38548,38761,23398,23731,27005,38989,38990,25499,31520,27179,27263,26806,39949,\r
+28511,21106,21917,24688,25324,27963,28167,28369,33883,35088,36676,19988,39993,\r
+21494,26907,27194,38788,26666,20828,31427,33970,37340,37772,22107,40232,26658,\r
+33541,33841,31909,21000,33477,29926,20094,20355,20896,23506,21002,21208,21223,\r
+24059,21914,22570,23014,23436,23448,23515,24178,24185,24739,24863,24931,25022,\r
+25563,25954,26577,26707,26874,27454,27475,27735,28450,28567,28485,29872,29976,\r
+30435,30475,31487,31649,31777,32233,32566,32752,32925,33382,33694,35251,35532,\r
+36011,36996,37969,38291,38289,38306,38501,38867,39208,33304,20024,21547,23736,\r
+24012,29609,30284,30524,23721,32747,36107,38593,38929,38996,39000,20225,20238,\r
+21361,21916,22120,22522,22855,23305,23492,23696,24076,24190,24524,25582,26426,\r
+26071,26082,26399,26827,26820,27231,24112,27589,27671,27773,30079,31048,23395,\r
+31232,32000,24509,35215,35352,36020,36215,36556,36637,39138,39438,39740,20096,\r
+20605,20736,22931,23452,25135,25216,25836,27450,29344,30097,31047,32681,34811,\r
+35516,35696,25516,33738,38816,21513,21507,21931,26708,27224,35440,30759,26485,\r
+40653,21364,23458,33050,34384,36870,19992,20037,20167,20241,21450,21560,23470,\r
+24339,24613,25937,26429,27714,27762,27875,28792,29699,31350,31406,31496,32026,\r
+31998,32102,26087,29275,21435,23621,24040,25298,25312,25369,28192,34394,35377,\r
+36317,37624,28417,31142,39770,20136,20139,20140,20379,20384,20689,20807,31478,\r
+20849,20982,21332,21281,21375,21483,21932,22659,23777,24375,24394,24623,24656,\r
+24685,25375,25945,27211,27841,29378,29421,30703,33016,33029,33288,34126,37111,\r
+37857,38911,39255,39514,20208,20957,23597,26241,26989,23616,26354,26997,29577,\r
+26704,31873,20677,21220,22343,24062,37670,26020,27427,27453,29748,31105,31165,\r
+31563,32202,33465,33740,34943,35167,35641,36817,37329,21535,37504,20061,20534,\r
+21477,21306,29399,29590,30697,33510,36527,39366,39368,39378,20855,24858,34398,\r
+21936,31354,20598,23507,36935,38533,20018,27355,37351,23633,23624,25496,31391,\r
+27795,38772,36705,31402,29066,38536,31874,26647,32368,26705,37740,21234,21531,\r
+34219,35347,32676,36557,37089,21350,34952,31041,20418,20670,21009,20804,21843,\r
+22317,29674,22411,22865,24418,24452,24693,24950,24935,25001,25522,25658,25964,\r
+26223,26690,28179,30054,31293,31995,32076,32153,32331,32619,33550,33610,34509,\r
+35336,35427,35686,36605,38938,40335,33464,36814,39912,21127,25119,25731,28608,\r
+38553,26689,20625,27424,27770,28500,31348,32080,34880,35363,26376,20214,20537,\r
+20518,20581,20860,21048,21091,21927,22287,22533,23244,24314,25010,25080,25331,\r
+25458,26908,27177,29309,29356,29486,30740,30831,32121,30476,32937,35211,35609,\r
+36066,36562,36963,37749,38522,38997,39443,40568,20803,21407,21427,24187,24358,\r
+28187,28304,29572,29694,32067,33335,35328,35578,38480,20046,20491,21476,21628,\r
+22266,22993,23396,24049,24235,24359,25144,25925,26543,28246,29392,31946,34996,\r
+32929,32993,33776,34382,35463,36328,37431,38599,39015,40723,20116,20114,20237,\r
+21320,21577,21566,23087,24460,24481,24735,26791,27278,29786,30849,35486,35492,\r
+35703,37264,20062,39881,20132,20348,20399,20505,20502,20809,20844,21151,21177,\r
+21246,21402,21475,21521,21518,21897,22353,22434,22909,23380,23389,23439,24037,\r
+24039,24055,24184,24195,24218,24247,24344,24658,24908,25239,25304,25511,25915,\r
+26114,26179,26356,26477,26657,26775,27083,27743,27946,28009,28207,28317,30002,\r
+30343,30828,31295,31968,32005,32024,32094,32177,32789,32771,32943,32945,33108,\r
+33167,33322,33618,34892,34913,35611,36002,36092,37066,37237,37489,30783,37628,\r
+38308,38477,38917,39321,39640,40251,21083,21163,21495,21512,22741,25335,28640,\r
+35946,36703,40633,20811,21051,21578,22269,31296,37239,40288,40658,29508,28425,\r
+33136,29969,24573,24794,39592,29403,36796,27492,38915,20170,22256,22372,22718,\r
+23130,24680,25031,26127,26118,26681,26801,28151,30165,32058,33390,39746,20123,\r
+20304,21449,21766,23919,24038,24046,26619,27801,29811,30722,35408,37782,35039,\r
+22352,24231,25387,20661,20652,20877,26368,21705,22622,22971,23472,24425,25165,\r
+25505,26685,27507,28168,28797,37319,29312,30741,30758,31085,25998,32048,33756,\r
+35009,36617,38555,21092,22312,26448,32618,36001,20916,22338,38442,22586,27018,\r
+32948,21682,23822,22524,30869,40442,20316,21066,21643,25662,26152,26388,26613,\r
+31364,31574,32034,37679,26716,39853,31545,21273,20874,21047,23519,25334,25774,\r
+25830,26413,27578,34217,38609,30352,39894,25420,37638,39851,30399,26194,19977,\r
+20632,21442,23665,24808,25746,25955,26719,29158,29642,29987,31639,32386,34453,\r
+35715,36059,37240,39184,26028,26283,27531,20181,20180,20282,20351,21050,21496,\r
+21490,21987,22235,22763,22987,22985,23039,23376,23629,24066,24107,24535,24605,\r
+25351,25903,23388,26031,26045,26088,26525,27490,27515,27663,29509,31049,31169,\r
+31992,32025,32043,32930,33026,33267,35222,35422,35433,35430,35468,35566,36039,\r
+36060,38604,39164,27503,20107,20284,20365,20816,23383,23546,24904,25345,26178,\r
+27425,28363,27835,29246,29885,30164,30913,31034,32780,32819,33258,33940,36766,\r
+27728,40575,24335,35672,40235,31482,36600,23437,38635,19971,21489,22519,22833,\r
+23241,23460,24713,28287,28422,30142,36074,23455,34048,31712,20594,26612,33437,\r
+23649,34122,32286,33294,20889,23556,25448,36198,26012,29038,31038,32023,32773,\r
+35613,36554,36974,34503,37034,20511,21242,23610,26451,28796,29237,37196,37320,\r
+37675,33509,23490,24369,24825,20027,21462,23432,25163,26417,27530,29417,29664,\r
+31278,33131,36259,37202,39318,20754,21463,21610,23551,25480,27193,32172,38656,\r
+22234,21454,21608,23447,23601,24030,20462,24833,25342,27954,31168,31179,32066,\r
+32333,32722,33261,33311,33936,34886,35186,35728,36468,36655,36913,37195,37228,\r
+38598,37276,20160,20303,20805,21313,24467,25102,26580,27713,28171,29539,32294,\r
+37325,37507,21460,22809,23487,28113,31069,32302,31899,22654,29087,20986,34899,\r
+36848,20426,23803,26149,30636,31459,33308,39423,20934,24490,26092,26991,27529,\r
+28147,28310,28516,30462,32020,24033,36981,37255,38918,20966,21021,25152,26257,\r
+26329,28186,24246,32210,32626,26360,34223,34295,35576,21161,21465,22899,24207,\r
+24464,24661,37604,38500,20663,20767,21213,21280,21319,21484,21736,21830,21809,\r
+22039,22888,22974,23100,23477,23558,23567,23569,23578,24196,24202,24288,24432,\r
+25215,25220,25307,25484,25463,26119,26124,26157,26230,26494,26786,27167,27189,\r
+27836,28040,28169,28248,28988,28966,29031,30151,30465,30813,30977,31077,31216,\r
+31456,31505,31911,32057,32918,33750,33931,34121,34909,35059,35359,35388,35412,\r
+35443,35937,36062,37284,37478,37758,37912,38556,38808,19978,19976,19998,20055,\r
+20887,21104,22478,22580,22732,23330,24120,24773,25854,26465,26454,27972,29366,\r
+30067,31331,33976,35698,37304,37664,22065,22516,39166,25325,26893,27542,29165,\r
+32340,32887,33394,35302,39135,34645,36785,23611,20280,20449,20405,21767,23072,\r
+23517,23529,24515,24910,25391,26032,26187,26862,27035,28024,28145,30003,30137,\r
+30495,31070,31206,32051,33251,33455,34218,35242,35386,36523,36763,36914,37341,\r
+38663,20154,20161,20995,22645,22764,23563,29978,23613,33102,35338,36805,38499,\r
+38765,31525,35535,38920,37218,22259,21416,36887,21561,22402,24101,25512,27700,\r
+28810,30561,31883,32736,34928,36930,37204,37648,37656,38543,29790,39620,23815,\r
+23913,25968,26530,36264,38619,25454,26441,26905,33733,38935,38592,35070,28548,\r
+25722,23544,19990,28716,30045,26159,20932,21046,21218,22995,24449,24615,25104,\r
+25919,25972,26143,26228,26866,26646,27491,28165,29298,29983,30427,31934,32854,\r
+22768,35069,35199,35488,35475,35531,36893,37266,38738,38745,25993,31246,33030,\r
+38587,24109,24796,25114,26021,26132,26512,30707,31309,31821,32318,33034,36012,\r
+36196,36321,36447,30889,20999,25305,25509,25666,25240,35373,31363,31680,35500,\r
+38634,32118,33292,34633,20185,20808,21315,21344,23459,23554,23574,24029,25126,\r
+25159,25776,26643,26676,27849,27973,27927,26579,28508,29006,29053,26059,31359,\r
+31661,32218,32330,32680,33146,33307,33337,34214,35438,36046,36341,36984,36983,\r
+37549,37521,38275,39854,21069,21892,28472,28982,20840,31109,32341,33203,31950,\r
+22092,22609,23720,25514,26366,26365,26970,29401,30095,30094,30990,31062,31199,\r
+31895,32032,32068,34311,35380,38459,36961,40736,20711,21109,21452,21474,20489,\r
+21930,22766,22863,29245,23435,23652,21277,24803,24819,25436,25475,25407,25531,\r
+25805,26089,26361,24035,27085,27133,28437,29157,20105,30185,30456,31379,31967,\r
+32207,32156,32865,33609,33624,33900,33980,34299,35013,36208,36865,36973,37783,\r
+38684,39442,20687,22679,24974,33235,34101,36104,36896,20419,20596,21063,21363,\r
+24687,25417,26463,28204,36275,36895,20439,23646,36042,26063,32154,21330,34966,\r
+20854,25539,23384,23403,23562,25613,26449,36956,20182,22810,22826,27760,35409,\r
+21822,22549,22949,24816,25171,26561,33333,26965,38464,39364,39464,20307,22534,\r
+23550,32784,23729,24111,24453,24608,24907,25140,26367,27888,28382,32974,33151,\r
+33492,34955,36024,36864,36910,38538,40667,39899,20195,21488,22823,31532,37261,\r
+38988,40441,28381,28711,21331,21828,23429,25176,25246,25299,27810,28655,29730,\r
+35351,37944,28609,35582,33592,20967,34552,21482,21481,20294,36948,36784,22890,\r
+33073,24061,31466,36799,26842,35895,29432,40008,27197,35504,20025,21336,22022,\r
+22374,25285,25506,26086,27470,28129,28251,28845,30701,31471,31658,32187,32829,\r
+32966,34507,35477,37723,22243,22727,24382,26029,26262,27264,27573,30007,35527,\r
+20516,30693,22320,24347,24677,26234,27744,30196,31258,32622,33268,34584,36933,\r
+39347,31689,30044,31481,31569,33988,36880,31209,31378,33590,23265,30528,20013,\r
+20210,23449,24544,25277,26172,26609,27880,34411,34935,35387,37198,37619,39376,\r
+27159,28710,29482,33511,33879,36015,19969,20806,20939,21899,23541,24086,24115,\r
+24193,24340,24373,24427,24500,25074,25361,26274,26397,28526,29266,30010,30522,\r
+32884,33081,33144,34678,35519,35548,36229,36339,37530,38263,38914,40165,21189,\r
+25431,30452,26389,27784,29645,36035,37806,38515,27941,22684,26894,27084,36861,\r
+37786,30171,36890,22618,26626,25524,27131,20291,28460,26584,36795,34086,32180,\r
+37716,26943,28528,22378,22775,23340,32044,29226,21514,37347,40372,20141,20302,\r
+20572,20597,21059,35998,21576,22564,23450,24093,24213,24237,24311,24351,24716,\r
+25269,25402,25552,26799,27712,30855,31118,31243,32224,33351,35330,35558,36420,\r
+36883,37048,37165,37336,40718,27877,25688,25826,25973,28404,30340,31515,36969,\r
+37841,28346,21746,24505,25764,36685,36845,37444,20856,22635,22825,23637,24215,\r
+28155,32399,29980,36028,36578,39003,28857,20253,27583,28593,30000,38651,20814,\r
+21520,22581,22615,22956,23648,24466,26007,26460,28193,30331,33759,36077,36884,\r
+37117,37709,30757,30778,21162,24230,22303,22900,24594,20498,20826,20908,20941,\r
+20992,21776,22612,22616,22871,23445,23798,23947,24764,25237,25645,26481,26691,\r
+26812,26847,30423,28120,28271,28059,28783,29128,24403,30168,31095,31561,31572,\r
+31570,31958,32113,21040,33891,34153,34276,35342,35588,35910,36367,36867,36879,\r
+37913,38518,38957,39472,38360,20685,21205,21516,22530,23566,24999,25758,27934,\r
+30643,31461,33012,33796,36947,37509,23776,40199,21311,24471,24499,28060,29305,\r
+30563,31167,31716,27602,29420,35501,26627,27233,20984,31361,26932,23626,40182,\r
+33515,23493,37193,28702,22136,23663,24775,25958,27788,35930,36929,38931,21585,\r
+26311,37389,22856,37027,20869,20045,20970,34201,35598,28760,25466,37707,26978,\r
+39348,32260,30071,21335,26976,36575,38627,27741,20108,23612,24336,36841,21250,\r
+36049,32905,34425,24319,26085,20083,20837,22914,23615,38894,20219,22922,24525,\r
+35469,28641,31152,31074,23527,33905,29483,29105,24180,24565,25467,25754,29123,\r
+31896,20035,24316,20043,22492,22178,24745,28611,32013,33021,33075,33215,36786,\r
+35223,34468,24052,25226,25773,35207,26487,27874,27966,29750,30772,23110,32629,\r
+33453,39340,20467,24259,25309,25490,25943,26479,30403,29260,32972,32954,36649,\r
+37197,20493,22521,23186,26757,26995,29028,29437,36023,22770,36064,38506,36889,\r
+34687,31204,30695,33833,20271,21093,21338,25293,26575,27850,30333,31636,31893,\r
+33334,34180,36843,26333,28448,29190,32283,33707,39361,40614,20989,31665,30834,\r
+31672,32903,31560,27368,24161,32908,30033,30048,20843,37474,28300,30330,37271,\r
+39658,20240,32624,25244,31567,38309,40169,22138,22617,34532,38588,20276,21028,\r
+21322,21453,21467,24070,25644,26001,26495,27710,27726,29256,29359,29677,30036,\r
+32321,33324,34281,36009,31684,37318,29033,38930,39151,25405,26217,30058,30436,\r
+30928,34115,34542,21290,21329,21542,22915,24199,24444,24754,25161,25209,25259,\r
+26000,27604,27852,30130,30382,30865,31192,32203,32631,32933,34987,35513,36027,\r
+36991,38750,39131,27147,31800,20633,23614,24494,26503,27608,29749,30473,32654,\r
+40763,26570,31255,21305,30091,39661,24422,33181,33777,32920,24380,24517,30050,\r
+31558,36924,26727,23019,23195,32016,30334,35628,20469,24426,27161,27703,28418,\r
+29922,31080,34920,35413,35961,24287,25551,30149,31186,33495,37672,37618,33948,\r
+34541,39981,21697,24428,25996,27996,28693,36007,36051,38971,25935,29942,19981,\r
+20184,22496,22827,23142,23500,20904,24067,24220,24598,25206,25975,26023,26222,\r
+28014,29238,31526,33104,33178,33433,35676,36000,36070,36212,38428,38468,20398,\r
+25771,27494,33310,33889,34154,37096,23553,26963,39080,33914,34135,20239,21103,\r
+24489,24133,26381,31119,33145,35079,35206,28149,24343,25173,27832,20175,29289,\r
+39826,20998,21563,22132,22707,24996,25198,28954,22894,31881,31966,32027,38640,\r
+25991,32862,19993,20341,20853,22592,24163,24179,24330,26564,20006,34109,38281,\r
+38491,31859,38913,20731,22721,30294,30887,21029,30629,34065,31622,20559,22793,\r
+29255,31687,32232,36794,36820,36941,20415,21193,23081,24321,38829,20445,33303,\r
+37610,22275,25429,27497,29995,35036,36628,31298,21215,22675,24917,25098,26286,\r
+27597,31807,33769,20515,20472,21253,21574,22577,22857,23453,23792,23791,23849,\r
+24214,25265,25447,25918,26041,26379,27861,27873,28921,30770,32299,32990,33459,\r
+33804,34028,34562,35090,35370,35914,37030,37586,39165,40179,40300,20047,20129,\r
+20621,21078,22346,22952,24125,24536,24537,25151,26292,26395,26576,26834,20882,\r
+32033,32938,33192,35584,35980,36031,37502,38450,21536,38956,21271,20693,21340,\r
+22696,25778,26420,29287,30566,31302,37350,21187,27809,27526,22528,24140,22868,\r
+26412,32763,20961,30406,25705,30952,39764,40635,22475,22969,26151,26522,27598,\r
+21737,27097,24149,33180,26517,39850,26622,40018,26717,20134,20451,21448,25273,\r
+26411,27819,36804,20397,32365,40639,19975,24930,28288,28459,34067,21619,26410,\r
+39749,24051,31637,23724,23494,34588,28234,34001,31252,33032,22937,31885,27665,\r
+30496,21209,22818,28961,29279,30683,38695,40289,26891,23167,23064,20901,21517,\r
+21629,26126,30431,36855,37528,40180,23018,29277,28357,20813,26825,32191,32236,\r
+38754,40634,25720,27169,33538,22916,23391,27611,29467,30450,32178,32791,33945,\r
+20786,26408,40665,30446,26466,21247,39173,23588,25147,31870,36016,21839,24758,\r
+32011,38272,21249,20063,20918,22812,29242,32822,37326,24357,30690,21380,24441,\r
+32004,34220,35379,36493,38742,26611,34222,37971,24841,24840,27833,30290,35565,\r
+36664,21807,20305,20778,21191,21451,23461,24189,24736,24962,25558,26377,26586,\r
+28263,28044,29494,29495,30001,31056,35029,35480,36938,37009,37109,38596,34701,\r
+22805,20104,20313,19982,35465,36671,38928,20653,24188,22934,23481,24248,25562,\r
+25594,25793,26332,26954,27096,27915,28342,29076,29992,31407,32650,32768,33865,\r
+33993,35201,35617,36362,36965,38525,39178,24958,25233,27442,27779,28020,32716,\r
+32764,28096,32645,34746,35064,26469,33713,38972,38647,27931,32097,33853,37226,\r
+20081,21365,23888,27396,28651,34253,34349,35239,21033,21519,23653,26446,26792,\r
+29702,29827,30178,35023,35041,37324,38626,38520,24459,29575,31435,33870,25504,\r
+30053,21129,27969,28316,29705,30041,30827,31890,38534,31452,40845,20406,24942,\r
+26053,34396,20102,20142,20698,20001,20940,23534,26009,26753,28092,29471,30274,\r
+30637,31260,31975,33391,35538,36988,37327,38517,38936,21147,32209,20523,21400,\r
+26519,28107,29136,29747,33256,36650,38563,40023,40607,29792,22593,28057,32047,\r
+39006,20196,20278,20363,20919,21169,23994,24604,29618,31036,33491,37428,38583,\r
+38646,38666,40599,40802,26278,27508,21015,21155,28872,35010,24265,24651,24976,\r
+28451,29001,31806,32244,32879,34030,36899,37676,21570,39791,27347,28809,36034,\r
+36335,38706,21172,23105,24266,24324,26391,27004,27028,28010,28431,29282,29436,\r
+31725,32769,32894,34635,37070,20845,40595,31108,32907,37682,35542,20525,21644,\r
+35441,27498,36036,33031,24785,26528,40434,20121,20120,39952,35435,34241,34152,\r
+26880,28286,30871,33109,24332,19984,19989,20010,20017,20022,20028,20031,20034,\r
+20054,20056,20098,20101,35947,20106,33298,24333,20110,20126,20127,20128,20130,\r
+20144,20147,20150,20174,20173,20164,20166,20162,20183,20190,20205,20191,20215,\r
+20233,20314,20272,20315,20317,20311,20295,20342,20360,20367,20376,20347,20329,\r
+20336,20369,20335,20358,20374,20760,20436,20447,20430,20440,20443,20433,20442,\r
+20432,20452,20453,20506,20520,20500,20522,20517,20485,20252,20470,20513,20521,\r
+20524,20478,20463,20497,20486,20547,20551,26371,20565,20560,20552,20570,20566,\r
+20588,20600,20608,20634,20613,20660,20658,20681,20682,20659,20674,20694,20702,\r
+20709,20717,20707,20718,20729,20725,20745,20737,20738,20758,20757,20756,20762,\r
+20769,20794,20791,20796,20795,20799,20800,20818,20812,20820,20834,31480,20841,\r
+20842,20846,20864,20866,22232,20876,20873,20879,20881,20883,20885,20886,20900,\r
+20902,20898,20905,20906,20907,20915,20913,20914,20912,20917,20925,20933,20937,\r
+20955,20960,34389,20969,20973,20976,20981,20990,20996,21003,21012,21006,21031,\r
+21034,21038,21043,21049,21071,21060,21067,21068,21086,21076,21098,21108,21097,\r
+21107,21119,21117,21133,21140,21138,21105,21128,21137,36776,36775,21164,21165,\r
+21180,21173,21185,21197,21207,21214,21219,21222,39149,21216,21235,21237,21240,\r
+21241,21254,21256,30008,21261,21264,21263,21269,21274,21283,21295,21297,21299,\r
+21304,21312,21318,21317,19991,21321,21325,20950,21342,21353,21358,22808,21371,\r
+21367,21378,21398,21408,21414,21413,21422,21424,21430,21443,31762,38617,21471,\r
+26364,29166,21486,21480,21485,21498,21505,21565,21568,21548,21549,21564,21550,\r
+21558,21545,21533,21582,21647,21621,21646,21599,21617,21623,21616,21650,21627,\r
+21632,21622,21636,21648,21638,21703,21666,21688,21669,21676,21700,21704,21672,\r
+21675,21698,21668,21694,21692,21720,21733,21734,21775,21780,21757,21742,21741,\r
+21754,21730,21817,21824,21859,21836,21806,21852,21829,21846,21847,21816,21811,\r
+21853,21913,21888,21679,21898,21919,21883,21886,21912,21918,21934,21884,21891,\r
+21929,21895,21928,21978,21957,21983,21956,21980,21988,21972,22036,22007,22038,\r
+22014,22013,22043,22009,22094,22096,29151,22068,22070,22066,22072,22123,22116,\r
+22063,22124,22122,22150,22144,22154,22176,22164,22159,22181,22190,22198,22196,\r
+22210,22204,22209,22211,22208,22216,22222,22225,22227,22231,22254,22265,22272,\r
+22271,22276,22281,22280,22283,22285,22291,22296,22294,21959,22300,22310,22327,\r
+22328,22350,22331,22336,22351,22377,22464,22408,22369,22399,22409,22419,22432,\r
+22451,22436,22442,22448,22467,22470,22484,22482,22483,22538,22486,22499,22539,\r
+22553,22557,22642,22561,22626,22603,22640,27584,22610,22589,22649,22661,22713,\r
+22687,22699,22714,22750,22715,22712,22702,22725,22739,22737,22743,22745,22744,\r
+22757,22748,22756,22751,22767,22778,22777,22779,22780,22781,22786,22794,22800,\r
+22811,26790,22821,22828,22829,22834,22840,22846,31442,22869,22864,22862,22874,\r
+22872,22882,22880,22887,22892,22889,22904,22913,22941,20318,20395,22947,22962,\r
+22982,23016,23004,22925,23001,23002,23077,23071,23057,23068,23049,23066,23104,\r
+23148,23113,23093,23094,23138,23146,23194,23228,23230,23243,23234,23229,23267,\r
+23255,23270,23273,23254,23290,23291,23308,23307,23318,23346,23248,23338,23350,\r
+23358,23363,23365,23360,23377,23381,23386,23387,23397,23401,23408,23411,23413,\r
+23416,25992,23418,23424,23427,23462,23480,23491,23495,23497,23508,23504,23524,\r
+23526,23522,23518,23525,23531,23536,23542,23539,23557,23559,23560,23565,23571,\r
+23584,23586,23592,23608,23609,23617,23622,23630,23635,23632,23631,23409,23660,\r
+23662,20066,23670,23673,23692,23697,23700,22939,23723,23739,23734,23740,23735,\r
+23749,23742,23751,23769,23785,23805,23802,23789,23948,23786,23819,23829,23831,\r
+23900,23839,23835,23825,23828,23842,23834,23833,23832,23884,23890,23886,23883,\r
+23916,23923,23926,23943,23940,23938,23970,23965,23980,23982,23997,23952,23991,\r
+23996,24009,24013,24019,24018,24022,24027,24043,24050,24053,24075,24090,24089,\r
+24081,24091,24118,24119,24132,24131,24128,24142,24151,24148,24159,24162,24164,\r
+24135,24181,24182,24186,40636,24191,24224,24257,24258,24264,24272,24271,24278,\r
+24291,24285,24282,24283,24290,24289,24296,24297,24300,24305,24307,24304,24308,\r
+24312,24318,24323,24329,24413,24412,24331,24337,24342,24361,24365,24376,24385,\r
+24392,24396,24398,24367,24401,24406,24407,24409,24417,24429,24435,24439,24451,\r
+24450,24447,24458,24456,24465,24455,24478,24473,24472,24480,24488,24493,24508,\r
+24534,24571,24548,24568,24561,24541,24755,24575,24609,24672,24601,24592,24617,\r
+24590,24625,24603,24597,24619,24614,24591,24634,24666,24641,24682,24695,24671,\r
+24650,24646,24653,24675,24643,24676,24642,24684,24683,24665,24705,24717,24807,\r
+24707,24730,24708,24731,24726,24727,24722,24743,24715,24801,24760,24800,24787,\r
+24756,24560,24765,24774,24757,24792,24909,24853,24838,24822,24823,24832,24820,\r
+24826,24835,24865,24827,24817,24845,24846,24903,24894,24872,24871,24906,24895,\r
+24892,24876,24884,24893,24898,24900,24947,24951,24920,24921,24922,24939,24948,\r
+24943,24933,24945,24927,24925,24915,24949,24985,24982,24967,25004,24980,24986,\r
+24970,24977,25003,25006,25036,25034,25033,25079,25032,25027,25030,25018,25035,\r
+32633,25037,25062,25059,25078,25082,25076,25087,25085,25084,25086,25088,25096,\r
+25097,25101,25100,25108,25115,25118,25121,25130,25134,25136,25138,25139,25153,\r
+25166,25182,25187,25179,25184,25192,25212,25218,25225,25214,25234,25235,25238,\r
+25300,25219,25236,25303,25297,25275,25295,25343,25286,25812,25288,25308,25292,\r
+25290,25282,25287,25243,25289,25356,25326,25329,25383,25346,25352,25327,25333,\r
+25424,25406,25421,25628,25423,25494,25486,25472,25515,25462,25507,25487,25481,\r
+25503,25525,25451,25449,25534,25577,25536,25542,25571,25545,25554,25590,25540,\r
+25622,25652,25606,25619,25638,25654,25885,25623,25640,25615,25703,25711,25718,\r
+25678,25898,25749,25747,25765,25769,25736,25788,25818,25810,25797,25799,25787,\r
+25816,25794,25841,25831,33289,25824,25825,25260,25827,25839,25900,25846,25844,\r
+25842,25850,25856,25853,25880,25884,25861,25892,25891,25899,25908,25909,25911,\r
+25910,25912,30027,25928,25942,25941,25933,25944,25950,25949,25970,25976,25986,\r
+25987,35722,26011,26015,26027,26039,26051,26054,26049,26052,26060,26066,26075,\r
+26073,26080,26081,26097,26482,26122,26115,26107,26483,26165,26166,26164,26140,\r
+26191,26180,26185,26177,26206,26205,26212,26215,26216,26207,26210,26224,26243,\r
+26248,26254,26249,26244,26264,26269,26305,26297,26313,26302,26300,26308,26296,\r
+26326,26330,26336,26175,26342,26345,26352,26357,26359,26383,26390,26398,26406,\r
+26407,38712,26414,26431,26422,26433,26424,26423,26438,26462,26464,26457,26467,\r
+26468,26505,26480,26537,26492,26474,26508,26507,26534,26529,26501,26551,26607,\r
+26548,26604,26547,26601,26552,26596,26590,26589,26594,26606,26553,26574,26566,\r
+26599,27292,26654,26694,26665,26688,26701,26674,26702,26803,26667,26713,26723,\r
+26743,26751,26783,26767,26797,26772,26781,26779,26755,27310,26809,26740,26805,\r
+26784,26810,26895,26765,26750,26881,26826,26888,26840,26914,26918,26849,26892,\r
+26829,26836,26855,26837,26934,26898,26884,26839,26851,26917,26873,26848,26863,\r
+26920,26922,26906,26915,26913,26822,27001,26999,26972,27000,26987,26964,27006,\r
+26990,26937,26996,26941,26969,26928,26977,26974,26973,27009,26986,27058,27054,\r
+27088,27071,27073,27091,27070,27086,23528,27082,27101,27067,27075,27047,27182,\r
+27025,27040,27036,27029,27060,27102,27112,27138,27163,27135,27402,27129,27122,\r
+27111,27141,27057,27166,27117,27156,27115,27146,27154,27329,27171,27155,27204,\r
+27148,27250,27190,27256,27207,27234,27225,27238,27208,27192,27170,27280,27277,\r
+27296,27268,27298,27299,27287,34327,27323,27331,27330,27320,27315,27308,27358,\r
+27345,27359,27306,27354,27370,27387,27397,34326,27386,27410,27414,39729,27423,\r
+27448,27447,30428,27449,39150,27463,27459,27465,27472,27481,27476,27483,27487,\r
+27489,27512,27513,27519,27520,27524,27523,27533,27544,27541,27550,27556,27562,\r
+27563,27567,27570,27569,27571,27575,27580,27590,27595,27603,27615,27628,27627,\r
+27635,27631,40638,27656,27667,27668,27675,27684,27683,27742,27733,27746,27754,\r
+27778,27789,27802,27777,27803,27774,27752,27763,27794,27792,27844,27889,27859,\r
+27837,27863,27845,27869,27822,27825,27838,27834,27867,27887,27865,27882,27935,\r
+34893,27958,27947,27965,27960,27929,27957,27955,27922,27916,28003,28051,28004,\r
+27994,28025,27993,28046,28053,28644,28037,28153,28181,28170,28085,28103,28134,\r
+28088,28102,28140,28126,28108,28136,28114,28101,28154,28121,28132,28117,28138,\r
+28142,28205,28270,28206,28185,28274,28255,28222,28195,28267,28203,28278,28237,\r
+28191,28227,28218,28238,28196,28415,28189,28216,28290,28330,28312,28361,28343,\r
+28371,28349,28335,28356,28338,28372,28373,28303,28325,28354,28319,28481,28433,\r
+28748,28396,28408,28414,28479,28402,28465,28399,28466,28364,28478,28435,28407,\r
+28550,28538,28536,28545,28544,28527,28507,28659,28525,28546,28540,28504,28558,\r
+28561,28610,28518,28595,28579,28577,28580,28601,28614,28586,28639,28629,28652,\r
+28628,28632,28657,28654,28635,28681,28683,28666,28689,28673,28687,28670,28699,\r
+28698,28532,28701,28696,28703,28720,28734,28722,28753,28771,28825,28818,28847,\r
+28913,28844,28856,28851,28846,28895,28875,28893,28889,28937,28925,28956,28953,\r
+29029,29013,29064,29030,29026,29004,29014,29036,29071,29179,29060,29077,29096,\r
+29100,29143,29113,29118,29138,29129,29140,29134,29152,29164,29159,29173,29180,\r
+29177,29183,29197,29200,29211,29224,29229,29228,29232,29234,29243,29244,29247,\r
+29248,29254,29259,29272,29300,29310,29314,29313,29319,29330,29334,29346,29351,\r
+29369,29362,29379,29382,29380,29390,29394,29410,29408,29409,29433,29431,20495,\r
+29463,29450,29468,29462,29469,29492,29487,29481,29477,29502,29518,29519,40664,\r
+29527,29546,29544,29552,29560,29557,29563,29562,29640,29619,29646,29627,29632,\r
+29669,29678,29662,29858,29701,29807,29733,29688,29746,29754,29781,29759,29791,\r
+29785,29761,29788,29801,29808,29795,29802,29814,29822,29835,29854,29863,29898,\r
+29903,29908,29681,29920,29923,29927,29929,29934,29938,29936,29937,29944,29943,\r
+29956,29955,29957,29964,29966,29965,29973,29971,29982,29990,29996,30012,30020,\r
+30029,30026,30025,30043,30022,30042,30057,30052,30055,30059,30061,30072,30070,\r
+30086,30087,30068,30090,30089,30082,30100,30106,30109,30117,30115,30146,30131,\r
+30147,30133,30141,30136,30140,30129,30157,30154,30162,30169,30179,30174,30206,\r
+30207,30204,30209,30192,30202,30194,30195,30219,30221,30217,30239,30247,30240,\r
+30241,30242,30244,30260,30256,30267,30279,30280,30278,30300,30296,30305,30306,\r
+30312,30313,30314,30311,30316,30320,30322,30326,30328,30332,30336,30339,30344,\r
+30347,30350,30358,30355,30361,30362,30384,30388,30392,30393,30394,30402,30413,\r
+30422,30418,30430,30433,30437,30439,30442,34351,30459,30472,30471,30468,30505,\r
+30500,30494,30501,30502,30491,30519,30520,30535,30554,30568,30571,30555,30565,\r
+30591,30590,30585,30606,30603,30609,30624,30622,30640,30646,30649,30655,30652,\r
+30653,30651,30663,30669,30679,30682,30684,30691,30702,30716,30732,30738,31014,\r
+30752,31018,30789,30862,30836,30854,30844,30874,30860,30883,30901,30890,30895,\r
+30929,30918,30923,30932,30910,30908,30917,30922,30956,30951,30938,30973,30964,\r
+30983,30994,30993,31001,31020,31019,31040,31072,31063,31071,31066,31061,31059,\r
+31098,31103,31114,31133,31143,40779,31146,31150,31155,31161,31162,31177,31189,\r
+31207,31212,31201,31203,31240,31245,31256,31257,31264,31263,31104,31281,31291,\r
+31294,31287,31299,31319,31305,31329,31330,31337,40861,31344,31353,31357,31368,\r
+31383,31381,31384,31382,31401,31432,31408,31414,31429,31428,31423,36995,31431,\r
+31434,31437,31439,31445,31443,31449,31450,31453,31457,31458,31462,31469,31472,\r
+31490,31503,31498,31494,31539,31512,31513,31518,31541,31528,31542,31568,31610,\r
+31492,31565,31499,31564,31557,31605,31589,31604,31591,31600,31601,31596,31598,\r
+31645,31640,31647,31629,31644,31642,31627,31634,31631,31581,31641,31691,31681,\r
+31692,31695,31668,31686,31709,31721,31761,31764,31718,31717,31840,31744,31751,\r
+31763,31731,31735,31767,31757,31734,31779,31783,31786,31775,31799,31787,31805,\r
+31820,31811,31828,31823,31808,31824,31832,31839,31844,31830,31845,31852,31861,\r
+31875,31888,31908,31917,31906,31915,31905,31912,31923,31922,31921,31918,31929,\r
+31933,31936,31941,31938,31960,31954,31964,31970,39739,31983,31986,31988,31990,\r
+31994,32006,32002,32028,32021,32010,32069,32075,32046,32050,32063,32053,32070,\r
+32115,32086,32078,32114,32104,32110,32079,32099,32147,32137,32091,32143,32125,\r
+32155,32186,32174,32163,32181,32199,32189,32171,32317,32162,32175,32220,32184,\r
+32159,32176,32216,32221,32228,32222,32251,32242,32225,32261,32266,32291,32289,\r
+32274,32305,32287,32265,32267,32290,32326,32358,32315,32309,32313,32323,32311,\r
+32306,32314,32359,32349,32342,32350,32345,32346,32377,32362,32361,32380,32379,\r
+32387,32213,32381,36782,32383,32392,32393,32396,32402,32400,32403,32404,32406,\r
+32398,32411,32412,32568,32570,32581,32588,32589,32590,32592,32593,32597,32596,\r
+32600,32607,32608,32616,32617,32615,32632,32642,32646,32643,32648,32647,32652,\r
+32660,32670,32669,32666,32675,32687,32690,32697,32686,32694,32696,35697,32709,\r
+32710,32714,32725,32724,32737,32742,32745,32755,32761,39132,32774,32772,32779,\r
+32786,32792,32793,32796,32801,32808,32831,32827,32842,32838,32850,32856,32858,\r
+32863,32866,32872,32883,32882,32880,32886,32889,32893,32895,32900,32902,32901,\r
+32923,32915,32922,32941,20880,32940,32987,32997,32985,32989,32964,32986,32982,\r
+33033,33007,33009,33051,33065,33059,33071,33099,38539,33094,33086,33107,33105,\r
+33020,33137,33134,33125,33126,33140,33155,33160,33162,33152,33154,33184,33173,\r
+33188,33187,33119,33171,33193,33200,33205,33214,33208,33213,33216,33218,33210,\r
+33225,33229,33233,33241,33240,33224,33242,33247,33248,33255,33274,33275,33278,\r
+33281,33282,33285,33287,33290,33293,33296,33302,33321,33323,33336,33331,33344,\r
+33369,33368,33373,33370,33375,33380,33378,33384,33386,33387,33326,33393,33399,\r
+33400,33406,33421,33426,33451,33439,33467,33452,33505,33507,33503,33490,33524,\r
+33523,33530,33683,33539,33531,33529,33502,33542,33500,33545,33497,33589,33588,\r
+33558,33586,33585,33600,33593,33616,33605,33583,33579,33559,33560,33669,33690,\r
+33706,33695,33698,33686,33571,33678,33671,33674,33660,33717,33651,33653,33696,\r
+33673,33704,33780,33811,33771,33742,33789,33795,33752,33803,33729,33783,33799,\r
+33760,33778,33805,33826,33824,33725,33848,34054,33787,33901,33834,33852,34138,\r
+33924,33911,33899,33965,33902,33922,33897,33862,33836,33903,33913,33845,33994,\r
+33890,33977,33983,33951,34009,33997,33979,34010,34000,33985,33990,34006,33953,\r
+34081,34047,34036,34071,34072,34092,34079,34069,34068,34044,34112,34147,34136,\r
+34120,34113,34306,34123,34133,34176,34212,34184,34193,34186,34216,34157,34196,\r
+34203,34282,34183,34204,34167,34174,34192,34249,34234,34255,34233,34256,34261,\r
+34269,34277,34268,34297,34314,34323,34315,34302,34298,34310,34338,34330,34352,\r
+34367,34381,20053,34388,34399,34407,34417,34451,34467,34473,34474,34443,34444,\r
+34486,34479,34500,34502,34480,34505,34851,34475,34516,34526,34537,34540,34527,\r
+34523,34543,34578,34566,34568,34560,34563,34555,34577,34569,34573,34553,34570,\r
+34612,34623,34615,34619,34597,34601,34586,34656,34655,34680,34636,34638,34676,\r
+34647,34664,34670,34649,34643,34659,34666,34821,34722,34719,34690,34735,34763,\r
+34749,34752,34768,38614,34731,34756,34739,34759,34758,34747,34799,34802,34784,\r
+34831,34829,34814,34806,34807,34830,34770,34833,34838,34837,34850,34849,34865,\r
+34870,34873,34855,34875,34884,34882,34898,34905,34910,34914,34923,34945,34942,\r
+34974,34933,34941,34997,34930,34946,34967,34962,34990,34969,34978,34957,34980,\r
+34992,35007,34993,35011,35012,35028,35032,35033,35037,35065,35074,35068,35060,\r
+35048,35058,35076,35084,35082,35091,35139,35102,35109,35114,35115,35137,35140,\r
+35131,35126,35128,35148,35101,35168,35166,35174,35172,35181,35178,35183,35188,\r
+35191,35198,35203,35208,35210,35219,35224,35233,35241,35238,35244,35247,35250,\r
+35258,35261,35263,35264,35290,35292,35293,35303,35316,35320,35331,35350,35344,\r
+35340,35355,35357,35365,35382,35393,35419,35410,35398,35400,35452,35437,35436,\r
+35426,35461,35458,35460,35496,35489,35473,35493,35494,35482,35491,35524,35533,\r
+35522,35546,35563,35571,35559,35556,35569,35604,35552,35554,35575,35550,35547,\r
+35596,35591,35610,35553,35606,35600,35607,35616,35635,38827,35622,35627,35646,\r
+35624,35649,35660,35663,35662,35657,35670,35675,35674,35691,35679,35692,35695,\r
+35700,35709,35712,35724,35726,35730,35731,35734,35737,35738,35898,35905,35903,\r
+35912,35916,35918,35920,35925,35938,35948,35960,35962,35970,35977,35973,35978,\r
+35981,35982,35988,35964,35992,25117,36013,36010,36029,36018,36019,36014,36022,\r
+36040,36033,36068,36067,36058,36093,36090,36091,36100,36101,36106,36103,36111,\r
+36109,36112,40782,36115,36045,36116,36118,36199,36205,36209,36211,36225,36249,\r
+36290,36286,36282,36303,36314,36310,36300,36315,36299,36330,36331,36319,36323,\r
+36348,36360,36361,36351,36381,36382,36368,36383,36418,36405,36400,36404,36426,\r
+36423,36425,36428,36432,36424,36441,36452,36448,36394,36451,36437,36470,36466,\r
+36476,36481,36487,36485,36484,36491,36490,36499,36497,36500,36505,36522,36513,\r
+36524,36528,36550,36529,36542,36549,36552,36555,36571,36579,36604,36603,36587,\r
+36606,36618,36613,36629,36626,36633,36627,36636,36639,36635,36620,36646,36659,\r
+36667,36665,36677,36674,36670,36684,36681,36678,36686,36695,36700,36706,36707,\r
+36708,36764,36767,36771,36781,36783,36791,36826,36837,36834,36842,36847,36999,\r
+36852,36869,36857,36858,36881,36885,36897,36877,36894,36886,36875,36903,36918,\r
+36917,36921,36856,36943,36944,36945,36946,36878,36937,36926,36950,36952,36958,\r
+36968,36975,36982,38568,36978,36994,36989,36993,36992,37002,37001,37007,37032,\r
+37039,37041,37045,37090,37092,25160,37083,37122,37138,37145,37170,37168,37194,\r
+37206,37208,37219,37221,37225,37235,37234,37259,37257,37250,37282,37291,37295,\r
+37290,37301,37300,37306,37312,37313,37321,37323,37328,37334,37343,37345,37339,\r
+37372,37365,37366,37406,37375,37396,37420,37397,37393,37470,37463,37445,37449,\r
+37476,37448,37525,37439,37451,37456,37532,37526,37523,37531,37466,37583,37561,\r
+37559,37609,37647,37626,37700,37678,37657,37666,37658,37667,37690,37685,37691,\r
+37724,37728,37756,37742,37718,37808,37804,37805,37780,37817,37846,37847,37864,\r
+37861,37848,37827,37853,37840,37832,37860,37914,37908,37907,37891,37895,37904,\r
+37942,37931,37941,37921,37946,37953,37970,37956,37979,37984,37986,37982,37994,\r
+37417,38000,38005,38007,38013,37978,38012,38014,38017,38015,38274,38279,38282,\r
+38292,38294,38296,38297,38304,38312,38311,38317,38332,38331,38329,38334,38346,\r
+28662,38339,38349,38348,38357,38356,38358,38364,38369,38373,38370,38433,38440,\r
+38446,38447,38466,38476,38479,38475,38519,38492,38494,38493,38495,38502,38514,\r
+38508,38541,38552,38549,38551,38570,38567,38577,38578,38576,38580,38582,38584,\r
+38585,38606,38603,38601,38605,35149,38620,38669,38613,38649,38660,38662,38664,\r
+38675,38670,38673,38671,38678,38681,38692,38698,38704,38713,38717,38718,38724,\r
+38726,38728,38722,38729,38748,38752,38756,38758,38760,21202,38763,38769,38777,\r
+38789,38780,38785,38778,38790,38795,38799,38800,38812,38824,38822,38819,38835,\r
+38836,38851,38854,38856,38859,38876,38893,40783,38898,31455,38902,38901,38927,\r
+38924,38968,38948,38945,38967,38973,38982,38991,38987,39019,39023,39024,39025,\r
+39028,39027,39082,39087,39089,39094,39108,39107,39110,39145,39147,39171,39177,\r
+39186,39188,39192,39201,39197,39198,39204,39200,39212,39214,39229,39230,39234,\r
+39241,39237,39248,39243,39249,39250,39244,39253,39319,39320,39333,39341,39342,\r
+39356,39391,39387,39389,39384,39377,39405,39406,39409,39410,39419,39416,39425,\r
+39439,39429,39394,39449,39467,39479,39493,39490,39488,39491,39486,39509,39501,\r
+39515,39511,39519,39522,39525,39524,39529,39531,39530,39597,39600,39612,39616,\r
+39631,39633,39635,39636,39646,39647,39650,39651,39654,39663,39659,39662,39668,\r
+39665,39671,39675,39686,39704,39706,39711,39714,39715,39717,39719,39720,39721,\r
+39722,39726,39727,39730,39748,39747,39759,39757,39758,39761,39768,39796,39827,\r
+39811,39825,39830,39831,39839,39840,39848,39860,39872,39882,39865,39878,39887,\r
+39889,39890,39907,39906,39908,39892,39905,39994,39922,39921,39920,39957,39956,\r
+39945,39955,39948,39942,39944,39954,39946,39940,39982,39963,39973,39972,39969,\r
+39984,40007,39986,40006,39998,40026,40032,40039,40054,40056,40167,40172,40176,\r
+40201,40200,40171,40195,40198,40234,40230,40367,40227,40223,40260,40213,40210,\r
+40257,40255,40254,40262,40264,40285,40286,40292,40273,40272,40281,40306,40329,\r
+40327,40363,40303,40314,40346,40356,40361,40370,40388,40385,40379,40376,40378,\r
+40390,40399,40386,40409,40403,40440,40422,40429,40431,40445,40474,40475,40478,\r
+40565,40569,40573,40577,40584,40587,40588,40594,40597,40593,40605,40613,40617,\r
+40632,40618,40621,38753,40652,40654,40655,40656,40660,40668,40670,40669,40672,\r
+40677,40680,40687,40692,40694,40695,40697,40699,40700,40701,40711,40712,30391,\r
+40725,40737,40748,40766,40778,40786,40788,40803,40799,40800,40801,40806,40807,\r
+40812,40810,40823,40818,40822,40853,40860,40864,22575,27079,36953,29796,20956,\r
+29081,\r
+};\r
+\r
+static const struct dbcs_index jisx0208_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0208_decmap+0,33,126},{__jisx0208_decmap\r
++94,33,126},{__jisx0208_decmap+188,48,122},{__jisx0208_decmap+263,33,115},{\r
+__jisx0208_decmap+346,33,118},{__jisx0208_decmap+432,33,88},{__jisx0208_decmap\r
++488,33,113},{__jisx0208_decmap+569,33,64},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{__jisx0208_decmap+601,33,126},{__jisx0208_decmap+695,33,\r
+126},{__jisx0208_decmap+789,33,126},{__jisx0208_decmap+883,33,126},{\r
+__jisx0208_decmap+977,33,126},{__jisx0208_decmap+1071,33,126},{\r
+__jisx0208_decmap+1165,33,126},{__jisx0208_decmap+1259,33,126},{\r
+__jisx0208_decmap+1353,33,126},{__jisx0208_decmap+1447,33,126},{\r
+__jisx0208_decmap+1541,33,126},{__jisx0208_decmap+1635,33,126},{\r
+__jisx0208_decmap+1729,33,126},{__jisx0208_decmap+1823,33,126},{\r
+__jisx0208_decmap+1917,33,126},{__jisx0208_decmap+2011,33,126},{\r
+__jisx0208_decmap+2105,33,126},{__jisx0208_decmap+2199,33,126},{\r
+__jisx0208_decmap+2293,33,126},{__jisx0208_decmap+2387,33,126},{\r
+__jisx0208_decmap+2481,33,126},{__jisx0208_decmap+2575,33,126},{\r
+__jisx0208_decmap+2669,33,126},{__jisx0208_decmap+2763,33,126},{\r
+__jisx0208_decmap+2857,33,126},{__jisx0208_decmap+2951,33,126},{\r
+__jisx0208_decmap+3045,33,126},{__jisx0208_decmap+3139,33,126},{\r
+__jisx0208_decmap+3233,33,126},{__jisx0208_decmap+3327,33,126},{\r
+__jisx0208_decmap+3421,33,126},{__jisx0208_decmap+3515,33,83},{\r
+__jisx0208_decmap+3566,33,126},{__jisx0208_decmap+3660,33,126},{\r
+__jisx0208_decmap+3754,33,126},{__jisx0208_decmap+3848,33,126},{\r
+__jisx0208_decmap+3942,33,126},{__jisx0208_decmap+4036,33,126},{\r
+__jisx0208_decmap+4130,33,126},{__jisx0208_decmap+4224,33,126},{\r
+__jisx0208_decmap+4318,33,126},{__jisx0208_decmap+4412,33,126},{\r
+__jisx0208_decmap+4506,33,126},{__jisx0208_decmap+4600,33,126},{\r
+__jisx0208_decmap+4694,33,126},{__jisx0208_decmap+4788,33,126},{\r
+__jisx0208_decmap+4882,33,126},{__jisx0208_decmap+4976,33,126},{\r
+__jisx0208_decmap+5070,33,126},{__jisx0208_decmap+5164,33,126},{\r
+__jisx0208_decmap+5258,33,126},{__jisx0208_decmap+5352,33,126},{\r
+__jisx0208_decmap+5446,33,126},{__jisx0208_decmap+5540,33,126},{\r
+__jisx0208_decmap+5634,33,126},{__jisx0208_decmap+5728,33,126},{\r
+__jisx0208_decmap+5822,33,126},{__jisx0208_decmap+5916,33,126},{\r
+__jisx0208_decmap+6010,33,126},{__jisx0208_decmap+6104,33,126},{\r
+__jisx0208_decmap+6198,33,126},{__jisx0208_decmap+6292,33,126},{\r
+__jisx0208_decmap+6386,33,126},{__jisx0208_decmap+6480,33,126},{\r
+__jisx0208_decmap+6574,33,126},{__jisx0208_decmap+6668,33,126},{\r
+__jisx0208_decmap+6762,33,126},{__jisx0208_decmap+6856,33,126},{\r
+__jisx0208_decmap+6950,33,38},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const ucs2_t __jisx0212_decmap[6179] = {\r
+728,711,184,729,733,175,731,730,126,900,901,U,U,U,U,U,U,U,U,161,166,191,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,186,170,\r
+169,174,8482,164,8470,902,904,905,906,938,U,908,U,910,939,U,911,U,U,U,U,940,\r
+941,942,943,970,912,972,962,973,971,944,974,1026,1027,1028,1029,1030,1031,\r
+1032,1033,1034,1035,1036,1038,1039,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,\r
+1116,1118,1119,198,272,U,294,U,306,U,321,319,U,330,216,338,U,358,222,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,230,273,240,295,305,307,312,322,320,329,331,248,339,\r
+223,359,254,193,192,196,194,258,461,256,260,197,195,262,264,268,199,266,270,\r
+201,200,203,202,282,278,274,280,U,284,286,290,288,292,205,204,207,206,463,304,\r
+298,302,296,308,310,313,317,315,323,327,325,209,211,210,214,212,465,336,332,\r
+213,340,344,342,346,348,352,350,356,354,218,217,220,219,364,467,368,362,370,\r
+366,360,471,475,473,469,372,221,376,374,377,381,379,225,224,228,226,259,462,\r
+257,261,229,227,263,265,269,231,267,271,233,232,235,234,283,279,275,281,501,\r
+285,287,U,289,293,237,236,239,238,464,U,299,303,297,309,311,314,318,316,324,\r
+328,326,241,243,242,246,244,466,337,333,245,341,345,343,347,349,353,351,357,\r
+355,250,249,252,251,365,468,369,363,371,367,361,472,476,474,470,373,253,255,\r
+375,378,382,380,19970,19972,19973,19980,19986,19999,20003,20004,20008,20011,\r
+20014,20015,20016,20021,20032,20033,20036,20039,20049,20058,20060,20067,20072,\r
+20073,20084,20085,20089,20095,20109,20118,20119,20125,20143,20153,20163,20176,\r
+20186,20187,20192,20193,20194,20200,20207,20209,20211,20213,20221,20222,20223,\r
+20224,20226,20227,20232,20235,20236,20242,20245,20246,20247,20249,20270,20273,\r
+20320,20275,20277,20279,20281,20283,20286,20288,20290,20296,20297,20299,20300,\r
+20306,20308,20310,20312,20319,20323,20330,20332,20334,20337,20343,20344,20345,\r
+20346,20349,20350,20353,20354,20356,20357,20361,20362,20364,20366,20368,20370,\r
+20371,20372,20375,20377,20378,20382,20383,20402,20407,20409,20411,20412,20413,\r
+20414,20416,20417,20421,20422,20424,20425,20427,20428,20429,20431,20434,20444,\r
+20448,20450,20464,20466,20476,20477,20479,20480,20481,20484,20487,20490,20492,\r
+20494,20496,20499,20503,20504,20507,20508,20509,20510,20514,20519,20526,20528,\r
+20530,20531,20533,20544,20545,20546,20549,20550,20554,20556,20558,20561,20562,\r
+20563,20567,20569,20575,20576,20578,20579,20582,20583,20586,20589,20592,20593,\r
+20539,20609,20611,20612,20614,20618,20622,20623,20624,20626,20627,20628,20630,\r
+20635,20636,20638,20639,20640,20641,20642,20650,20655,20656,20665,20666,20669,\r
+20672,20675,20676,20679,20684,20686,20688,20691,20692,20696,20700,20701,20703,\r
+20706,20708,20710,20712,20713,20719,20721,20726,20730,20734,20739,20742,20743,\r
+20744,20747,20748,20749,20750,20722,20752,20759,20761,20763,20764,20765,20766,\r
+20771,20775,20776,20780,20781,20783,20785,20787,20788,20789,20792,20793,20802,\r
+20810,20815,20819,20821,20823,20824,20831,20836,20838,20862,20867,20868,20875,\r
+20878,20888,20893,20897,20899,20909,20920,20922,20924,20926,20927,20930,20936,\r
+20943,20945,20946,20947,20949,20952,20958,20962,20965,20974,20978,20979,20980,\r
+20983,20993,20994,20997,21010,21011,21013,21014,21016,21026,21032,21041,21042,\r
+21045,21052,21061,21065,21077,21079,21080,21082,21084,21087,21088,21089,21094,\r
+21102,21111,21112,21113,21120,21122,21125,21130,21132,21139,21141,21142,21143,\r
+21144,21146,21148,21156,21157,21158,21159,21167,21168,21174,21175,21176,21178,\r
+21179,21181,21184,21188,21190,21192,21196,21199,21201,21204,21206,21211,21212,\r
+21217,21221,21224,21225,21226,21228,21232,21233,21236,21238,21239,21248,21251,\r
+21258,21259,21260,21265,21267,21272,21275,21276,21278,21279,21285,21287,21288,\r
+21289,21291,21292,21293,21296,21298,21301,21308,21309,21310,21314,21324,21323,\r
+21337,21339,21345,21347,21349,21356,21357,21362,21369,21374,21379,21383,21384,\r
+21390,21395,21396,21401,21405,21409,21412,21418,21419,21423,21426,21428,21429,\r
+21431,21432,21434,21437,21440,21445,21455,21458,21459,21461,21466,21469,21470,\r
+21472,21478,21479,21493,21506,21523,21530,21537,21543,21544,21546,21551,21553,\r
+21556,21557,21571,21572,21575,21581,21583,21598,21602,21604,21606,21607,21609,\r
+21611,21613,21614,21620,21631,21633,21635,21637,21640,21641,21645,21649,21653,\r
+21654,21660,21663,21665,21670,21671,21673,21674,21677,21678,21681,21687,21689,\r
+21690,21691,21695,21702,21706,21709,21710,21728,21738,21740,21743,21750,21756,\r
+21758,21759,21760,21761,21765,21768,21769,21772,21773,21774,21781,21802,21803,\r
+21810,21813,21814,21819,21820,21821,21825,21831,21833,21834,21837,21840,21841,\r
+21848,21850,21851,21854,21856,21857,21860,21862,21887,21889,21890,21894,21896,\r
+21902,21903,21905,21906,21907,21908,21911,21923,21924,21933,21938,21951,21953,\r
+21955,21958,21961,21963,21964,21966,21969,21970,21971,21975,21976,21979,21982,\r
+21986,21993,22006,22015,22021,22024,22026,22029,22030,22031,22032,22033,22034,\r
+22041,22060,22064,22067,22069,22071,22073,22075,22076,22077,22079,22080,22081,\r
+22083,22084,22086,22089,22091,22093,22095,22100,22110,22112,22113,22114,22115,\r
+22118,22121,22125,22127,22129,22130,22133,22148,22149,22152,22155,22156,22165,\r
+22169,22170,22173,22174,22175,22182,22183,22184,22185,22187,22188,22189,22193,\r
+22195,22199,22206,22213,22217,22218,22219,22223,22224,22220,22221,22233,22236,\r
+22237,22239,22241,22244,22245,22246,22247,22248,22257,22251,22253,22262,22263,\r
+22273,22274,22279,22282,22284,22289,22293,22298,22299,22301,22304,22306,22307,\r
+22308,22309,22313,22314,22316,22318,22319,22323,22324,22333,22334,22335,22341,\r
+22342,22348,22349,22354,22370,22373,22375,22376,22379,22381,22382,22383,22384,\r
+22385,22387,22388,22389,22391,22393,22394,22395,22396,22398,22401,22403,22412,\r
+22420,22423,22425,22426,22428,22429,22430,22431,22433,22421,22439,22440,22441,\r
+22444,22456,22461,22471,22472,22476,22479,22485,22493,22494,22500,22502,22503,\r
+22505,22509,22512,22517,22518,22520,22525,22526,22527,22531,22532,22536,22537,\r
+22497,22540,22541,22555,22558,22559,22560,22566,22567,22573,22578,22585,22591,\r
+22601,22604,22605,22607,22608,22613,22623,22625,22628,22631,22632,22648,22652,\r
+22655,22656,22657,22663,22664,22665,22666,22668,22669,22671,22672,22676,22678,\r
+22685,22688,22689,22690,22694,22697,22705,22706,22724,22716,22722,22728,22733,\r
+22734,22736,22738,22740,22742,22746,22749,22753,22754,22761,22771,22789,22790,\r
+22795,22796,22802,22803,22804,34369,22813,22817,22819,22820,22824,22831,22832,\r
+22835,22837,22838,22847,22851,22854,22866,22867,22873,22875,22877,22878,22879,\r
+22881,22883,22891,22893,22895,22898,22901,22902,22905,22907,22908,22923,22924,\r
+22926,22930,22933,22935,22943,22948,22951,22957,22958,22959,22960,22963,22967,\r
+22970,22972,22977,22979,22980,22984,22986,22989,22994,23005,23006,23007,23011,\r
+23012,23015,23022,23023,23025,23026,23028,23031,23040,23044,23052,23053,23054,\r
+23058,23059,23070,23075,23076,23079,23080,23082,23085,23088,23108,23109,23111,\r
+23112,23116,23120,23125,23134,23139,23141,23143,23149,23159,23162,23163,23166,\r
+23179,23184,23187,23190,23193,23196,23198,23199,23200,23202,23207,23212,23217,\r
+23218,23219,23221,23224,23226,23227,23231,23236,23238,23240,23247,23258,23260,\r
+23264,23269,23274,23278,23285,23286,23293,23296,23297,23304,23319,23348,23321,\r
+23323,23325,23329,23333,23341,23352,23361,23371,23372,23378,23382,23390,23400,\r
+23406,23407,23420,23421,23422,23423,23425,23428,23430,23434,23438,23440,23441,\r
+23443,23444,23446,23464,23465,23468,23469,23471,23473,23474,23479,23482,23484,\r
+23488,23489,23501,23503,23510,23511,23512,23513,23514,23520,23535,23537,23540,\r
+23549,23564,23575,23582,23583,23587,23590,23593,23595,23596,23598,23600,23602,\r
+23605,23606,23641,23642,23644,23650,23651,23655,23656,23657,23661,23664,23668,\r
+23669,23674,23675,23676,23677,23687,23688,23690,23695,23698,23709,23711,23712,\r
+23714,23715,23718,23722,23730,23732,23733,23738,23753,23755,23762,23773,23767,\r
+23790,23793,23794,23796,23809,23814,23821,23826,23851,23843,23844,23846,23847,\r
+23857,23860,23865,23869,23871,23874,23875,23878,23880,23893,23889,23897,23882,\r
+23903,23904,23905,23906,23908,23914,23917,23920,23929,23930,23934,23935,23937,\r
+23939,23944,23946,23954,23955,23956,23957,23961,23963,23967,23968,23975,23979,\r
+23984,23988,23992,23993,24003,24007,24011,24016,24014,24024,24025,24032,24036,\r
+24041,24056,24057,24064,24071,24077,24082,24084,24085,24088,24095,24096,24110,\r
+24104,24114,24117,24126,24139,24144,24137,24145,24150,24152,24155,24156,24158,\r
+24168,24170,24171,24172,24173,24174,24176,24192,24203,24206,24226,24228,24229,\r
+24232,24234,24236,24241,24243,24253,24254,24255,24262,24268,24267,24270,24273,\r
+24274,24276,24277,24284,24286,24293,24299,24322,24326,24327,24328,24334,24345,\r
+24348,24349,24353,24354,24355,24356,24360,24363,24364,24366,24368,24372,24374,\r
+24379,24381,24383,24384,24388,24389,24391,24397,24400,24404,24408,24411,24416,\r
+24419,24420,24423,24431,24434,24436,24437,24440,24442,24445,24446,24457,24461,\r
+24463,24470,24476,24477,24482,24487,24491,24484,24492,24495,24496,24497,24504,\r
+24516,24519,24520,24521,24523,24528,24529,24530,24531,24532,24542,24545,24546,\r
+24552,24553,24554,24556,24557,24558,24559,24562,24563,24566,24570,24572,24583,\r
+24586,24589,24595,24596,24599,24600,24602,24607,24612,24621,24627,24629,24640,\r
+24647,24648,24649,24652,24657,24660,24662,24663,24669,24673,24679,24689,24702,\r
+24703,24706,24710,24712,24714,24718,24721,24723,24725,24728,24733,24734,24738,\r
+24740,24741,24744,24752,24753,24759,24763,24766,24770,24772,24776,24777,24778,\r
+24779,24782,24783,24788,24789,24793,24795,24797,24798,24802,24805,24818,24821,\r
+24824,24828,24829,24834,24839,24842,24844,24848,24849,24850,24851,24852,24854,\r
+24855,24857,24860,24862,24866,24874,24875,24880,24881,24885,24886,24887,24889,\r
+24897,24901,24902,24905,24926,24928,24940,24946,24952,24955,24956,24959,24960,\r
+24961,24963,24964,24971,24973,24978,24979,24983,24984,24988,24989,24991,24992,\r
+24997,25000,25002,25005,25016,25017,25020,25024,25025,25026,25038,25039,25045,\r
+25052,25053,25054,25055,25057,25058,25063,25065,25061,25068,25069,25071,25089,\r
+25091,25092,25095,25107,25109,25116,25120,25122,25123,25127,25129,25131,25145,\r
+25149,25154,25155,25156,25158,25164,25168,25169,25170,25172,25174,25178,25180,\r
+25188,25197,25199,25203,25210,25213,25229,25230,25231,25232,25254,25256,25267,\r
+25270,25271,25274,25278,25279,25284,25294,25301,25302,25306,25322,25330,25332,\r
+25340,25341,25347,25348,25354,25355,25357,25360,25363,25366,25368,25385,25386,\r
+25389,25397,25398,25401,25404,25409,25410,25411,25412,25414,25418,25419,25422,\r
+25426,25427,25428,25432,25435,25445,25446,25452,25453,25457,25460,25461,25464,\r
+25468,25469,25471,25474,25476,25479,25482,25488,25492,25493,25497,25498,25502,\r
+25508,25510,25517,25518,25519,25533,25537,25541,25544,25550,25553,25555,25556,\r
+25557,25564,25568,25573,25578,25580,25586,25587,25589,25592,25593,25609,25610,\r
+25616,25618,25620,25624,25630,25632,25634,25636,25637,25641,25642,25647,25648,\r
+25653,25661,25663,25675,25679,25681,25682,25683,25684,25690,25691,25692,25693,\r
+25695,25696,25697,25699,25709,25715,25716,25723,25725,25733,25735,25743,25744,\r
+25745,25752,25753,25755,25757,25759,25761,25763,25766,25768,25772,25779,25789,\r
+25790,25791,25796,25801,25802,25803,25804,25806,25808,25809,25813,25815,25828,\r
+25829,25833,25834,25837,25840,25845,25847,25851,25855,25857,25860,25864,25865,\r
+25866,25871,25875,25876,25878,25881,25883,25886,25887,25890,25894,25897,25902,\r
+25905,25914,25916,25917,25923,25927,25929,25936,25938,25940,25951,25952,25959,\r
+25963,25978,25981,25985,25989,25994,26002,26005,26008,26013,26016,26019,26022,\r
+26030,26034,26035,26036,26047,26050,26056,26057,26062,26064,26068,26070,26072,\r
+26079,26096,26098,26100,26101,26105,26110,26111,26112,26116,26120,26121,26125,\r
+26129,26130,26133,26134,26141,26142,26145,26146,26147,26148,26150,26153,26154,\r
+26155,26156,26158,26160,26161,26163,26169,26167,26176,26181,26182,26186,26188,\r
+26193,26190,26199,26200,26201,26203,26204,26208,26209,26363,26218,26219,26220,\r
+26238,26227,26229,26239,26231,26232,26233,26235,26240,26236,26251,26252,26253,\r
+26256,26258,26265,26266,26267,26268,26271,26272,26276,26285,26289,26290,26293,\r
+26299,26303,26304,26306,26307,26312,26316,26318,26319,26324,26331,26335,26344,\r
+26347,26348,26350,26362,26373,26375,26382,26387,26393,26396,26400,26402,26419,\r
+26430,26437,26439,26440,26444,26452,26453,26461,26470,26476,26478,26484,26486,\r
+26491,26497,26500,26510,26511,26513,26515,26518,26520,26521,26523,26544,26545,\r
+26546,26549,26555,26556,26557,26617,26560,26562,26563,26565,26568,26569,26578,\r
+26583,26585,26588,26593,26598,26608,26610,26614,26615,26706,26644,26649,26653,\r
+26655,26664,26663,26668,26669,26671,26672,26673,26675,26683,26687,26692,26693,\r
+26698,26700,26709,26711,26712,26715,26731,26734,26735,26736,26737,26738,26741,\r
+26745,26746,26747,26748,26754,26756,26758,26760,26774,26776,26778,26780,26785,\r
+26787,26789,26793,26794,26798,26802,26811,26821,26824,26828,26831,26832,26833,\r
+26835,26838,26841,26844,26845,26853,26856,26858,26859,26860,26861,26864,26865,\r
+26869,26870,26875,26876,26877,26886,26889,26890,26896,26897,26899,26902,26903,\r
+26929,26931,26933,26936,26939,26946,26949,26953,26958,26967,26971,26979,26980,\r
+26981,26982,26984,26985,26988,26992,26993,26994,27002,27003,27007,27008,27021,\r
+27026,27030,27032,27041,27045,27046,27048,27051,27053,27055,27063,27064,27066,\r
+27068,27077,27080,27089,27094,27095,27106,27109,27118,27119,27121,27123,27125,\r
+27134,27136,27137,27139,27151,27153,27157,27162,27165,27168,27172,27176,27184,\r
+27186,27188,27191,27195,27198,27199,27205,27206,27209,27210,27214,27216,27217,\r
+27218,27221,27222,27227,27236,27239,27242,27249,27251,27262,27265,27267,27270,\r
+27271,27273,27275,27281,27291,27293,27294,27295,27301,27307,27311,27312,27313,\r
+27316,27325,27326,27327,27334,27337,27336,27340,27344,27348,27349,27350,27356,\r
+27357,27364,27367,27372,27376,27377,27378,27388,27389,27394,27395,27398,27399,\r
+27401,27407,27408,27409,27415,27419,27422,27428,27432,27435,27436,27439,27445,\r
+27446,27451,27455,27462,27466,27469,27474,27478,27480,27485,27488,27495,27499,\r
+27502,27504,27509,27517,27518,27522,27525,27543,27547,27551,27552,27554,27555,\r
+27560,27561,27564,27565,27566,27568,27576,27577,27581,27582,27587,27588,27593,\r
+27596,27606,27610,27617,27619,27622,27623,27630,27633,27639,27641,27647,27650,\r
+27652,27653,27657,27661,27662,27664,27666,27673,27679,27686,27687,27688,27692,\r
+27694,27699,27701,27702,27706,27707,27711,27722,27723,27725,27727,27730,27732,\r
+27737,27739,27740,27755,27757,27759,27764,27766,27768,27769,27771,27781,27782,\r
+27783,27785,27796,27797,27799,27800,27804,27807,27824,27826,27828,27842,27846,\r
+27853,27855,27856,27857,27858,27860,27862,27866,27868,27872,27879,27881,27883,\r
+27884,27886,27890,27892,27908,27911,27914,27918,27919,27921,27923,27930,27942,\r
+27943,27944,27751,27950,27951,27953,27961,27964,27967,27991,27998,27999,28001,\r
+28005,28007,28015,28016,28028,28034,28039,28049,28050,28052,28054,28055,28056,\r
+28074,28076,28084,28087,28089,28093,28095,28100,28104,28106,28110,28111,28118,\r
+28123,28125,28127,28128,28130,28133,28137,28143,28144,28148,28150,28156,28160,\r
+28164,28190,28194,28199,28210,28214,28217,28219,28220,28228,28229,28232,28233,\r
+28235,28239,28241,28242,28243,28244,28247,28252,28253,28254,28258,28259,28264,\r
+28275,28283,28285,28301,28307,28313,28320,28327,28333,28334,28337,28339,28347,\r
+28351,28352,28353,28355,28359,28360,28362,28365,28366,28367,28395,28397,28398,\r
+28409,28411,28413,28420,28424,28426,28428,28429,28438,28440,28442,28443,28454,\r
+28457,28458,28463,28464,28467,28470,28475,28476,28461,28495,28497,28498,28499,\r
+28503,28505,28506,28509,28510,28513,28514,28520,28524,28541,28542,28547,28551,\r
+28552,28555,28556,28557,28560,28562,28563,28564,28566,28570,28575,28576,28581,\r
+28582,28583,28584,28590,28591,28592,28597,28598,28604,28613,28615,28616,28618,\r
+28634,28638,28648,28649,28656,28661,28665,28668,28669,28672,28677,28678,28679,\r
+28685,28695,28704,28707,28719,28724,28727,28729,28732,28739,28740,28744,28745,\r
+28746,28747,28756,28757,28765,28766,28750,28772,28773,28780,28782,28789,28790,\r
+28798,28801,28805,28806,28820,28821,28822,28823,28824,28827,28836,28843,28848,\r
+28849,28852,28855,28874,28881,28883,28884,28885,28886,28888,28892,28900,28922,\r
+28931,28932,28933,28934,28935,28939,28940,28943,28958,28960,28971,28973,28975,\r
+28976,28977,28984,28993,28997,28998,28999,29002,29003,29008,29010,29015,29018,\r
+29020,29022,29024,29032,29049,29056,29061,29063,29068,29074,29082,29083,29088,\r
+29090,29103,29104,29106,29107,29114,29119,29120,29121,29124,29131,29132,29139,\r
+29142,29145,29146,29148,29176,29182,29184,29191,29192,29193,29203,29207,29210,\r
+29213,29215,29220,29227,29231,29236,29240,29241,29249,29250,29251,29253,29262,\r
+29263,29264,29267,29269,29270,29274,29276,29278,29280,29283,29288,29291,29294,\r
+29295,29297,29303,29304,29307,29308,29311,29316,29321,29325,29326,29331,29339,\r
+29352,29357,29358,29361,29364,29374,29377,29383,29385,29388,29397,29398,29400,\r
+29407,29413,29427,29428,29434,29435,29438,29442,29444,29445,29447,29451,29453,\r
+29458,29459,29464,29465,29470,29474,29476,29479,29480,29484,29489,29490,29493,\r
+29498,29499,29501,29507,29517,29520,29522,29526,29528,29533,29534,29535,29536,\r
+29542,29543,29545,29547,29548,29550,29551,29553,29559,29561,29564,29568,29569,\r
+29571,29573,29574,29582,29584,29587,29589,29591,29592,29596,29598,29599,29600,\r
+29602,29605,29606,29610,29611,29613,29621,29623,29625,29628,29629,29631,29637,\r
+29638,29641,29643,29644,29647,29650,29651,29654,29657,29661,29665,29667,29670,\r
+29671,29673,29684,29685,29687,29689,29690,29691,29693,29695,29696,29697,29700,\r
+29703,29706,29713,29722,29723,29732,29734,29736,29737,29738,29739,29740,29741,\r
+29742,29743,29744,29745,29753,29760,29763,29764,29766,29767,29771,29773,29777,\r
+29778,29783,29789,29794,29798,29799,29800,29803,29805,29806,29809,29810,29824,\r
+29825,29829,29830,29831,29833,29839,29840,29841,29842,29848,29849,29850,29852,\r
+29855,29856,29857,29859,29862,29864,29865,29866,29867,29870,29871,29873,29874,\r
+29877,29881,29883,29887,29896,29897,29900,29904,29907,29912,29914,29915,29918,\r
+29919,29924,29928,29930,29931,29935,29940,29946,29947,29948,29951,29958,29970,\r
+29974,29975,29984,29985,29988,29991,29993,29994,29999,30006,30009,30013,30014,\r
+30015,30016,30019,30023,30024,30030,30032,30034,30039,30046,30047,30049,30063,\r
+30065,30073,30074,30075,30076,30077,30078,30081,30085,30096,30098,30099,30101,\r
+30105,30108,30114,30116,30132,30138,30143,30144,30145,30148,30150,30156,30158,\r
+30159,30167,30172,30175,30176,30177,30180,30183,30188,30190,30191,30193,30201,\r
+30208,30210,30211,30212,30215,30216,30218,30220,30223,30226,30227,30229,30230,\r
+30233,30235,30236,30237,30238,30243,30245,30246,30249,30253,30258,30259,30261,\r
+30264,30265,30266,30268,30282,30272,30273,30275,30276,30277,30281,30283,30293,\r
+30297,30303,30308,30309,30317,30318,30319,30321,30324,30337,30341,30348,30349,\r
+30357,30363,30364,30365,30367,30368,30370,30371,30372,30373,30374,30375,30376,\r
+30378,30381,30397,30401,30405,30409,30411,30412,30414,30420,30425,30432,30438,\r
+30440,30444,30448,30449,30454,30457,30460,30464,30470,30474,30478,30482,30484,\r
+30485,30487,30489,30490,30492,30498,30504,30509,30510,30511,30516,30517,30518,\r
+30521,30525,30526,30530,30533,30534,30538,30541,30542,30543,30546,30550,30551,\r
+30556,30558,30559,30560,30562,30564,30567,30570,30572,30576,30578,30579,30580,\r
+30586,30589,30592,30596,30604,30605,30612,30613,30614,30618,30623,30626,30631,\r
+30634,30638,30639,30641,30645,30654,30659,30665,30673,30674,30677,30681,30686,\r
+30687,30688,30692,30694,30698,30700,30704,30705,30708,30712,30715,30725,30726,\r
+30729,30733,30734,30737,30749,30753,30754,30755,30765,30766,30768,30773,30775,\r
+30787,30788,30791,30792,30796,30798,30802,30812,30814,30816,30817,30819,30820,\r
+30824,30826,30830,30842,30846,30858,30863,30868,30872,30881,30877,30878,30879,\r
+30884,30888,30892,30893,30896,30897,30898,30899,30907,30909,30911,30919,30920,\r
+30921,30924,30926,30930,30931,30933,30934,30948,30939,30943,30944,30945,30950,\r
+30954,30962,30963,30976,30966,30967,30970,30971,30975,30982,30988,30992,31002,\r
+31004,31006,31007,31008,31013,31015,31017,31021,31025,31028,31029,31035,31037,\r
+31039,31044,31045,31046,31050,31051,31055,31057,31060,31064,31067,31068,31079,\r
+31081,31083,31090,31097,31099,31100,31102,31115,31116,31121,31123,31124,31125,\r
+31126,31128,31131,31132,31137,31144,31145,31147,31151,31153,31156,31160,31163,\r
+31170,31172,31175,31176,31178,31183,31188,31190,31194,31197,31198,31200,31202,\r
+31205,31210,31211,31213,31217,31224,31228,31234,31235,31239,31241,31242,31244,\r
+31249,31253,31259,31262,31265,31271,31275,31277,31279,31280,31284,31285,31288,\r
+31289,31290,31300,31301,31303,31304,31308,31317,31318,31321,31324,31325,31327,\r
+31328,31333,31335,31338,31341,31349,31352,31358,31360,31362,31365,31366,31370,\r
+31371,31376,31377,31380,31390,31392,31395,31404,31411,31413,31417,31419,31420,\r
+31430,31433,31436,31438,31441,31451,31464,31465,31467,31468,31473,31476,31483,\r
+31485,31486,31495,31508,31519,31523,31527,31529,31530,31531,31533,31534,31535,\r
+31536,31537,31540,31549,31551,31552,31553,31559,31566,31573,31584,31588,31590,\r
+31593,31594,31597,31599,31602,31603,31607,31620,31625,31630,31632,31633,31638,\r
+31643,31646,31648,31653,31660,31663,31664,31666,31669,31670,31674,31675,31676,\r
+31677,31682,31685,31688,31690,31700,31702,31703,31705,31706,31707,31720,31722,\r
+31730,31732,31733,31736,31737,31738,31740,31742,31745,31746,31747,31748,31750,\r
+31753,31755,31756,31758,31759,31769,31771,31776,31781,31782,31784,31788,31793,\r
+31795,31796,31798,31801,31802,31814,31818,31829,31825,31826,31827,31833,31834,\r
+31835,31836,31837,31838,31841,31843,31847,31849,31853,31854,31856,31858,31865,\r
+31868,31869,31878,31879,31887,31892,31902,31904,31910,31920,31926,31927,31930,\r
+31931,31932,31935,31940,31943,31944,31945,31949,31951,31955,31956,31957,31959,\r
+31961,31962,31965,31974,31977,31979,31989,32003,32007,32008,32009,32015,32017,\r
+32018,32019,32022,32029,32030,32035,32038,32042,32045,32049,32060,32061,32062,\r
+32064,32065,32071,32072,32077,32081,32083,32087,32089,32090,32092,32093,32101,\r
+32103,32106,32112,32120,32122,32123,32127,32129,32130,32131,32133,32134,32136,\r
+32139,32140,32141,32145,32150,32151,32157,32158,32166,32167,32170,32179,32182,\r
+32183,32185,32194,32195,32196,32197,32198,32204,32205,32206,32215,32217,32256,\r
+32226,32229,32230,32234,32235,32237,32241,32245,32246,32249,32250,32264,32272,\r
+32273,32277,32279,32284,32285,32288,32295,32296,32300,32301,32303,32307,32310,\r
+32319,32324,32325,32327,32334,32336,32338,32344,32351,32353,32354,32357,32363,\r
+32366,32367,32371,32376,32382,32385,32390,32391,32394,32397,32401,32405,32408,\r
+32410,32413,32414,32572,32571,32573,32574,32575,32579,32580,32583,32591,32594,\r
+32595,32603,32604,32605,32609,32611,32612,32613,32614,32621,32625,32637,32638,\r
+32639,32640,32651,32653,32655,32656,32657,32662,32663,32668,32673,32674,32678,\r
+32682,32685,32692,32700,32703,32704,32707,32712,32718,32719,32731,32735,32739,\r
+32741,32744,32748,32750,32751,32754,32762,32765,32766,32767,32775,32776,32778,\r
+32781,32782,32783,32785,32787,32788,32790,32797,32798,32799,32800,32804,32806,\r
+32812,32814,32816,32820,32821,32823,32825,32826,32828,32830,32832,32836,32864,\r
+32868,32870,32877,32881,32885,32897,32904,32910,32924,32926,32934,32935,32939,\r
+32952,32953,32968,32973,32975,32978,32980,32981,32983,32984,32992,33005,33006,\r
+33008,33010,33011,33014,33017,33018,33022,33027,33035,33046,33047,33048,33052,\r
+33054,33056,33060,33063,33068,33072,33077,33082,33084,33093,33095,33098,33100,\r
+33106,33111,33120,33121,33127,33128,33129,33133,33135,33143,33153,33168,33156,\r
+33157,33158,33163,33166,33174,33176,33179,33182,33186,33198,33202,33204,33211,\r
+33227,33219,33221,33226,33230,33231,33237,33239,33243,33245,33246,33249,33252,\r
+33259,33260,33264,33265,33266,33269,33270,33272,33273,33277,33279,33280,33283,\r
+33295,33299,33300,33305,33306,33309,33313,33314,33320,33330,33332,33338,33347,\r
+33348,33349,33350,33355,33358,33359,33361,33366,33372,33376,33379,33383,33389,\r
+33396,33403,33405,33407,33408,33409,33411,33412,33415,33417,33418,33422,33425,\r
+33428,33430,33432,33434,33435,33440,33441,33443,33444,33447,33448,33449,33450,\r
+33454,33456,33458,33460,33463,33466,33468,33470,33471,33478,33488,33493,33498,\r
+33504,33506,33508,33512,33514,33517,33519,33526,33527,33533,33534,33536,33537,\r
+33543,33544,33546,33547,33620,33563,33565,33566,33567,33569,33570,33580,33581,\r
+33582,33584,33587,33591,33594,33596,33597,33602,33603,33604,33607,33613,33614,\r
+33617,33621,33622,33623,33648,33656,33661,33663,33664,33666,33668,33670,33677,\r
+33682,33684,33685,33688,33689,33691,33692,33693,33702,33703,33705,33708,33726,\r
+33727,33728,33735,33737,33743,33744,33745,33748,33757,33619,33768,33770,33782,\r
+33784,33785,33788,33793,33798,33802,33807,33809,33813,33817,33709,33839,33849,\r
+33861,33863,33864,33866,33869,33871,33873,33874,33878,33880,33881,33882,33884,\r
+33888,33892,33893,33895,33898,33904,33907,33908,33910,33912,33916,33917,33921,\r
+33925,33938,33939,33941,33950,33958,33960,33961,33962,33967,33969,33972,33978,\r
+33981,33982,33984,33986,33991,33992,33996,33999,34003,34012,34023,34026,34031,\r
+34032,34033,34034,34039,34098,34042,34043,34045,34050,34051,34055,34060,34062,\r
+34064,34076,34078,34082,34083,34084,34085,34087,34090,34091,34095,34099,34100,\r
+34102,34111,34118,34127,34128,34129,34130,34131,34134,34137,34140,34141,34142,\r
+34143,34144,34145,34146,34148,34155,34159,34169,34170,34171,34173,34175,34177,\r
+34181,34182,34185,34187,34188,34191,34195,34200,34205,34207,34208,34210,34213,\r
+34215,34228,34230,34231,34232,34236,34237,34238,34239,34242,34247,34250,34251,\r
+34254,34221,34264,34266,34271,34272,34278,34280,34285,34291,34294,34300,34303,\r
+34304,34308,34309,34317,34318,34320,34321,34322,34328,34329,34331,34334,34337,\r
+34343,34345,34358,34360,34362,34364,34365,34368,34370,34374,34386,34387,34390,\r
+34391,34392,34393,34397,34400,34401,34402,34403,34404,34409,34412,34415,34421,\r
+34422,34423,34426,34445,34449,34454,34456,34458,34460,34465,34470,34471,34472,\r
+34477,34481,34483,34484,34485,34487,34488,34489,34495,34496,34497,34499,34501,\r
+34513,34514,34517,34519,34522,34524,34528,34531,34533,34535,34440,34554,34556,\r
+34557,34564,34565,34567,34571,34574,34575,34576,34579,34580,34585,34590,34591,\r
+34593,34595,34600,34606,34607,34609,34610,34617,34618,34620,34621,34622,34624,\r
+34627,34629,34637,34648,34653,34657,34660,34661,34671,34673,34674,34683,34691,\r
+34692,34693,34694,34695,34696,34697,34699,34700,34704,34707,34709,34711,34712,\r
+34713,34718,34720,34723,34727,34732,34733,34734,34737,34741,34750,34751,34753,\r
+34760,34761,34762,34766,34773,34774,34777,34778,34780,34783,34786,34787,34788,\r
+34794,34795,34797,34801,34803,34808,34810,34815,34817,34819,34822,34825,34826,\r
+34827,34832,34841,34834,34835,34836,34840,34842,34843,34844,34846,34847,34856,\r
+34861,34862,34864,34866,34869,34874,34876,34881,34883,34885,34888,34889,34890,\r
+34891,34894,34897,34901,34902,34904,34906,34908,34911,34912,34916,34921,34929,\r
+34937,34939,34944,34968,34970,34971,34972,34975,34976,34984,34986,35002,35005,\r
+35006,35008,35018,35019,35020,35021,35022,35025,35026,35027,35035,35038,35047,\r
+35055,35056,35057,35061,35063,35073,35078,35085,35086,35087,35093,35094,35096,\r
+35097,35098,35100,35104,35110,35111,35112,35120,35121,35122,35125,35129,35130,\r
+35134,35136,35138,35141,35142,35145,35151,35154,35159,35162,35163,35164,35169,\r
+35170,35171,35179,35182,35184,35187,35189,35194,35195,35196,35197,35209,35213,\r
+35216,35220,35221,35227,35228,35231,35232,35237,35248,35252,35253,35254,35255,\r
+35260,35284,35285,35286,35287,35288,35301,35305,35307,35309,35313,35315,35318,\r
+35321,35325,35327,35332,35333,35335,35343,35345,35346,35348,35349,35358,35360,\r
+35362,35364,35366,35371,35372,35375,35381,35383,35389,35390,35392,35395,35397,\r
+35399,35401,35405,35406,35411,35414,35415,35416,35420,35421,35425,35429,35431,\r
+35445,35446,35447,35449,35450,35451,35454,35455,35456,35459,35462,35467,35471,\r
+35472,35474,35478,35479,35481,35487,35495,35497,35502,35503,35507,35510,35511,\r
+35515,35518,35523,35526,35528,35529,35530,35537,35539,35540,35541,35543,35549,\r
+35551,35564,35568,35572,35573,35574,35580,35583,35589,35590,35595,35601,35612,\r
+35614,35615,35594,35629,35632,35639,35644,35650,35651,35652,35653,35654,35656,\r
+35666,35667,35668,35673,35661,35678,35683,35693,35702,35704,35705,35708,35710,\r
+35713,35716,35717,35723,35725,35727,35732,35733,35740,35742,35743,35896,35897,\r
+35901,35902,35909,35911,35913,35915,35919,35921,35923,35924,35927,35928,35931,\r
+35933,35929,35939,35940,35942,35944,35945,35949,35955,35957,35958,35963,35966,\r
+35974,35975,35979,35984,35986,35987,35993,35995,35996,36004,36025,36026,36037,\r
+36038,36041,36043,36047,36054,36053,36057,36061,36065,36072,36076,36079,36080,\r
+36082,36085,36087,36088,36094,36095,36097,36099,36105,36114,36119,36123,36197,\r
+36201,36204,36206,36223,36226,36228,36232,36237,36240,36241,36245,36254,36255,\r
+36256,36262,36267,36268,36271,36274,36277,36279,36281,36283,36288,36293,36294,\r
+36295,36296,36298,36302,36305,36308,36309,36311,36313,36324,36325,36327,36332,\r
+36336,36284,36337,36338,36340,36349,36353,36356,36357,36358,36363,36369,36372,\r
+36374,36384,36385,36386,36387,36390,36391,36401,36403,36406,36407,36408,36409,\r
+36413,36416,36417,36427,36429,36430,36431,36436,36443,36444,36445,36446,36449,\r
+36450,36457,36460,36461,36463,36464,36465,36473,36474,36475,36482,36483,36489,\r
+36496,36498,36501,36506,36507,36509,36510,36514,36519,36521,36525,36526,36531,\r
+36533,36538,36539,36544,36545,36547,36548,36551,36559,36561,36564,36572,36584,\r
+36590,36592,36593,36599,36601,36602,36589,36608,36610,36615,36616,36623,36624,\r
+36630,36631,36632,36638,36640,36641,36643,36645,36647,36648,36652,36653,36654,\r
+36660,36661,36662,36663,36666,36672,36673,36675,36679,36687,36689,36690,36691,\r
+36692,36693,36696,36701,36702,36709,36765,36768,36769,36772,36773,36774,36789,\r
+36790,36792,36798,36800,36801,36806,36810,36811,36813,36816,36818,36819,36821,\r
+36832,36835,36836,36840,36846,36849,36853,36854,36859,36862,36866,36868,36872,\r
+36876,36888,36891,36904,36905,36911,36906,36908,36909,36915,36916,36919,36927,\r
+36931,36932,36940,36955,36957,36962,36966,36967,36972,36976,36980,36985,36997,\r
+37000,37003,37004,37006,37008,37013,37015,37016,37017,37019,37024,37025,37026,\r
+37029,37040,37042,37043,37044,37046,37053,37068,37054,37059,37060,37061,37063,\r
+37064,37077,37079,37080,37081,37084,37085,37087,37093,37074,37110,37099,37103,\r
+37104,37108,37118,37119,37120,37124,37125,37126,37128,37133,37136,37140,37142,\r
+37143,37144,37146,37148,37150,37152,37157,37154,37155,37159,37161,37166,37167,\r
+37169,37172,37174,37175,37177,37178,37180,37181,37187,37191,37192,37199,37203,\r
+37207,37209,37210,37211,37217,37220,37223,37229,37236,37241,37242,37243,37249,\r
+37251,37253,37254,37258,37262,37265,37267,37268,37269,37272,37278,37281,37286,\r
+37288,37292,37293,37294,37296,37297,37298,37299,37302,37307,37308,37309,37311,\r
+37314,37315,37317,37331,37332,37335,37337,37338,37342,37348,37349,37353,37354,\r
+37356,37357,37358,37359,37360,37361,37367,37369,37371,37373,37376,37377,37380,\r
+37381,37382,37383,37385,37386,37388,37392,37394,37395,37398,37400,37404,37405,\r
+37411,37412,37413,37414,37416,37422,37423,37424,37427,37429,37430,37432,37433,\r
+37434,37436,37438,37440,37442,37443,37446,37447,37450,37453,37454,37455,37457,\r
+37464,37465,37468,37469,37472,37473,37477,37479,37480,37481,37486,37487,37488,\r
+37493,37494,37495,37496,37497,37499,37500,37501,37503,37512,37513,37514,37517,\r
+37518,37522,37527,37529,37535,37536,37540,37541,37543,37544,37547,37551,37554,\r
+37558,37560,37562,37563,37564,37565,37567,37568,37569,37570,37571,37573,37574,\r
+37575,37576,37579,37580,37581,37582,37584,37587,37589,37591,37592,37593,37596,\r
+37597,37599,37600,37601,37603,37605,37607,37608,37612,37614,37616,37625,37627,\r
+37631,37632,37634,37640,37645,37649,37652,37653,37660,37661,37662,37663,37665,\r
+37668,37669,37671,37673,37674,37683,37684,37686,37687,37703,37704,37705,37712,\r
+37713,37714,37717,37719,37720,37722,37726,37732,37733,37735,37737,37738,37741,\r
+37743,37744,37745,37747,37748,37750,37754,37757,37759,37760,37761,37762,37768,\r
+37770,37771,37773,37775,37778,37781,37784,37787,37790,37793,37795,37796,37798,\r
+37800,37803,37812,37813,37814,37818,37801,37825,37828,37829,37830,37831,37833,\r
+37834,37835,37836,37837,37843,37849,37852,37854,37855,37858,37862,37863,37881,\r
+37879,37880,37882,37883,37885,37889,37890,37892,37896,37897,37901,37902,37903,\r
+37909,37910,37911,37919,37934,37935,37937,37938,37939,37940,37947,37951,37949,\r
+37955,37957,37960,37962,37964,37973,37977,37980,37983,37985,37987,37992,37995,\r
+37997,37998,37999,38001,38002,38020,38019,38264,38265,38270,38276,38280,38284,\r
+38285,38286,38301,38302,38303,38305,38310,38313,38315,38316,38324,38326,38330,\r
+38333,38335,38342,38344,38345,38347,38352,38353,38354,38355,38361,38362,38365,\r
+38366,38367,38368,38372,38374,38429,38430,38434,38436,38437,38438,38444,38449,\r
+38451,38455,38456,38457,38458,38460,38461,38465,38482,38484,38486,38487,38488,\r
+38497,38510,38516,38523,38524,38526,38527,38529,38530,38531,38532,38537,38545,\r
+38550,38554,38557,38559,38564,38565,38566,38569,38574,38575,38579,38586,38602,\r
+38610,23986,38616,38618,38621,38622,38623,38633,38639,38641,38650,38658,38659,\r
+38661,38665,38682,38683,38685,38689,38690,38691,38696,38705,38707,38721,38723,\r
+38730,38734,38735,38741,38743,38744,38746,38747,38755,38759,38762,38766,38771,\r
+38774,38775,38776,38779,38781,38783,38784,38793,38805,38806,38807,38809,38810,\r
+38814,38815,38818,38828,38830,38833,38834,38837,38838,38840,38841,38842,38844,\r
+38846,38847,38849,38852,38853,38855,38857,38858,38860,38861,38862,38864,38865,\r
+38868,38871,38872,38873,38877,38878,38880,38875,38881,38884,38895,38897,38900,\r
+38903,38904,38906,38919,38922,38937,38925,38926,38932,38934,38940,38942,38944,\r
+38947,38950,38955,38958,38959,38960,38962,38963,38965,38949,38974,38980,38983,\r
+38986,38993,38994,38995,38998,38999,39001,39002,39010,39011,39013,39014,39018,\r
+39020,39083,39085,39086,39088,39092,39095,39096,39098,39099,39103,39106,39109,\r
+39112,39116,39137,39139,39141,39142,39143,39146,39155,39158,39170,39175,39176,\r
+39185,39189,39190,39191,39194,39195,39196,39199,39202,39206,39207,39211,39217,\r
+39218,39219,39220,39221,39225,39226,39227,39228,39232,39233,39238,39239,39240,\r
+39245,39246,39252,39256,39257,39259,39260,39262,39263,39264,39323,39325,39327,\r
+39334,39344,39345,39346,39349,39353,39354,39357,39359,39363,39369,39379,39380,\r
+39385,39386,39388,39390,39399,39402,39403,39404,39408,39412,39413,39417,39421,\r
+39422,39426,39427,39428,39435,39436,39440,39441,39446,39454,39456,39458,39459,\r
+39460,39463,39469,39470,39475,39477,39478,39480,39495,39489,39492,39498,39499,\r
+39500,39502,39505,39508,39510,39517,39594,39596,39598,39599,39602,39604,39605,\r
+39606,39609,39611,39614,39615,39617,39619,39622,39624,39630,39632,39634,39637,\r
+39638,39639,39643,39644,39648,39652,39653,39655,39657,39660,39666,39667,39669,\r
+39673,39674,39677,39679,39680,39681,39682,39683,39684,39685,39688,39689,39691,\r
+39692,39693,39694,39696,39698,39702,39705,39707,39708,39712,39718,39723,39725,\r
+39731,39732,39733,39735,39737,39738,39741,39752,39755,39756,39765,39766,39767,\r
+39771,39774,39777,39779,39781,39782,39784,39786,39787,39788,39789,39790,39795,\r
+39797,39799,39800,39801,39807,39808,39812,39813,39814,39815,39817,39818,39819,\r
+39821,39823,39824,39828,39834,39837,39838,39846,39847,39849,39852,39856,39857,\r
+39858,39863,39864,39867,39868,39870,39871,39873,39879,39880,39886,39888,39895,\r
+39896,39901,39903,39909,39911,39914,39915,39919,39923,39927,39928,39929,39930,\r
+39933,39935,39936,39938,39947,39951,39953,39958,39960,39961,39962,39964,39966,\r
+39970,39971,39974,39975,39976,39977,39978,39985,39989,39990,39991,39997,40001,\r
+40003,40004,40005,40009,40010,40014,40015,40016,40019,40020,40022,40024,40027,\r
+40029,40030,40031,40035,40041,40042,40028,40043,40040,40046,40048,40050,40053,\r
+40055,40059,40166,40178,40183,40185,40203,40194,40209,40215,40216,40220,40221,\r
+40222,40239,40240,40242,40243,40244,40250,40252,40261,40253,40258,40259,40263,\r
+40266,40275,40276,40287,40291,40290,40293,40297,40298,40299,40304,40310,40311,\r
+40315,40316,40318,40323,40324,40326,40330,40333,40334,40338,40339,40341,40342,\r
+40343,40344,40353,40362,40364,40366,40369,40373,40377,40380,40383,40387,40391,\r
+40393,40394,40404,40405,40406,40407,40410,40414,40415,40416,40421,40423,40425,\r
+40427,40430,40432,40435,40436,40446,40458,40450,40455,40462,40464,40465,40466,\r
+40469,40470,40473,40476,40477,40570,40571,40572,40576,40578,40579,40580,40581,\r
+40583,40590,40591,40598,40600,40603,40606,40612,40616,40620,40622,40623,40624,\r
+40627,40628,40629,40646,40648,40651,40661,40671,40676,40679,40684,40685,40686,\r
+40688,40689,40690,40693,40696,40703,40706,40707,40713,40719,40720,40721,40722,\r
+40724,40726,40727,40729,40730,40731,40735,40738,40742,40746,40747,40751,40753,\r
+40754,40756,40759,40761,40762,40764,40765,40767,40769,40771,40772,40773,40774,\r
+40775,40787,40789,40790,40791,40792,40794,40797,40798,40808,40809,40813,40814,\r
+40815,40816,40817,40819,40821,40826,40829,40847,40848,40849,40850,40852,40854,\r
+40855,40862,40865,40866,40867,40869,\r
+};\r
+\r
+static const struct dbcs_index jisx0212_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0212_decmap+0,47,113},{0,0,0},{\r
+0,0,0},{0,0,0},{__jisx0212_decmap+67,97,124},{__jisx0212_decmap+95,66,126},{0,\r
+0,0},{__jisx0212_decmap+156,33,80},{__jisx0212_decmap+204,33,119},{\r
+__jisx0212_decmap+291,33,119},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0212_decmap+378,33,126},{__jisx0212_decmap+472,33,126},{\r
+__jisx0212_decmap+566,33,126},{__jisx0212_decmap+660,33,126},{\r
+__jisx0212_decmap+754,33,126},{__jisx0212_decmap+848,33,126},{\r
+__jisx0212_decmap+942,33,126},{__jisx0212_decmap+1036,33,126},{\r
+__jisx0212_decmap+1130,33,126},{__jisx0212_decmap+1224,33,126},{\r
+__jisx0212_decmap+1318,33,126},{__jisx0212_decmap+1412,33,126},{\r
+__jisx0212_decmap+1506,33,126},{__jisx0212_decmap+1600,33,126},{\r
+__jisx0212_decmap+1694,33,126},{__jisx0212_decmap+1788,33,126},{\r
+__jisx0212_decmap+1882,33,126},{__jisx0212_decmap+1976,33,126},{\r
+__jisx0212_decmap+2070,33,126},{__jisx0212_decmap+2164,33,126},{\r
+__jisx0212_decmap+2258,33,126},{__jisx0212_decmap+2352,33,126},{\r
+__jisx0212_decmap+2446,33,126},{__jisx0212_decmap+2540,33,126},{\r
+__jisx0212_decmap+2634,33,126},{__jisx0212_decmap+2728,33,126},{\r
+__jisx0212_decmap+2822,33,126},{__jisx0212_decmap+2916,33,126},{\r
+__jisx0212_decmap+3010,33,126},{__jisx0212_decmap+3104,33,126},{\r
+__jisx0212_decmap+3198,33,126},{__jisx0212_decmap+3292,33,126},{\r
+__jisx0212_decmap+3386,33,126},{__jisx0212_decmap+3480,33,126},{\r
+__jisx0212_decmap+3574,33,126},{__jisx0212_decmap+3668,33,126},{\r
+__jisx0212_decmap+3762,33,126},{__jisx0212_decmap+3856,33,126},{\r
+__jisx0212_decmap+3950,33,126},{__jisx0212_decmap+4044,33,126},{\r
+__jisx0212_decmap+4138,33,126},{__jisx0212_decmap+4232,33,126},{\r
+__jisx0212_decmap+4326,33,126},{__jisx0212_decmap+4420,33,126},{\r
+__jisx0212_decmap+4514,33,126},{__jisx0212_decmap+4608,33,126},{\r
+__jisx0212_decmap+4702,33,126},{__jisx0212_decmap+4796,33,126},{\r
+__jisx0212_decmap+4890,33,126},{__jisx0212_decmap+4984,33,126},{\r
+__jisx0212_decmap+5078,33,126},{__jisx0212_decmap+5172,33,126},{\r
+__jisx0212_decmap+5266,33,126},{__jisx0212_decmap+5360,33,126},{\r
+__jisx0212_decmap+5454,33,126},{__jisx0212_decmap+5548,33,126},{\r
+__jisx0212_decmap+5642,33,126},{__jisx0212_decmap+5736,33,126},{\r
+__jisx0212_decmap+5830,33,126},{__jisx0212_decmap+5924,33,126},{\r
+__jisx0212_decmap+6018,33,126},{__jisx0212_decmap+6112,33,99},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __jisxcommon_encmap[22016] = {\r
+8512,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41527,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41538,\r
+8561,8562,41584,N,41539,8568,8495,41581,41580,N,8780,N,41582,41524,8555,8542,\r
+N,N,8493,N,8825,N,41521,N,41579,N,N,N,N,41540,43554,43553,43556,43562,43555,\r
+43561,43297,43566,43570,43569,43572,43571,43584,43583,43586,43585,N,43600,\r
+43602,43601,43604,43608,43603,8543,43308,43619,43618,43621,43620,43634,43312,\r
+43342,43810,43809,43812,43818,43811,43817,43329,43822,43826,43825,43828,43827,\r
+43840,43839,43842,43841,43331,43856,43858,43857,43860,43864,43859,8544,43340,\r
+43875,43874,43877,43876,43890,43344,43891,43559,43815,43557,43813,43560,43816,\r
+43563,43819,43564,43820,43567,43823,43565,43821,43568,43824,43298,43330,43575,\r
+43831,N,N,43574,43830,43576,43832,43573,43829,43578,43834,43579,43835,43581,\r
+43837,43580,N,43582,43838,43300,43332,43591,43847,43589,43845,N,N,43590,43846,\r
+43588,43333,43302,43334,43592,43848,43593,43849,43335,43594,43850,43596,43852,\r
+43595,43851,43305,43337,43304,43336,43597,43853,43599,43855,43598,43854,43338,\r
+43307,43339,43607,43863,N,N,43606,43862,43309,43341,43609,43865,43611,43867,\r
+43610,43866,43612,43868,43613,43869,43615,43871,43614,43870,43617,43873,43616,\r
+43872,43311,43343,43628,43884,43625,43881,43622,43878,43627,43883,43624,43880,\r
+43626,43882,43633,43889,43636,43892,43635,43637,43893,43639,43895,43638,43894,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43558,43814,43587,43843,43605,43861,43623,43879,43632,43888,43629,43885,43631,\r
+43887,43630,43886,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43833,41520,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41519,41522,41526,41525,N,41523,41528,41529,\r
+42593,N,42594,42595,42596,N,42599,N,42601,42604,42614,9761,9762,9763,9764,\r
+9765,9766,9767,9768,9769,9770,9771,9772,9773,9774,9775,9776,9777,N,9778,9779,\r
+9780,9781,9782,9783,9784,42597,42602,42609,42610,42611,42612,42619,9793,9794,\r
+9795,9796,9797,9798,9799,9800,9801,9802,9803,9804,9805,9806,9807,9808,9809,\r
+42616,9810,9811,9812,9813,9814,9815,9816,42613,42618,42615,42617,42620,10023,\r
+42818,42819,42820,42821,42822,42823,42824,42825,42826,42827,42828,N,42829,\r
+42830,10017,10018,10019,10020,10021,10022,10024,10025,10026,10027,10028,10029,\r
+10030,10031,10032,10033,10034,10035,10036,10037,10038,10039,10040,10041,10042,\r
+10043,10044,10045,10046,10047,10048,10049,10065,10066,10067,10068,10069,10070,\r
+10072,10073,10074,10075,10076,10077,10078,10079,10080,10081,10082,10083,10084,\r
+10085,10086,10087,10088,10089,10090,10091,10092,10093,10094,10095,10096,10097,\r
+N,10071,42866,42867,42868,42869,42870,42871,42872,42873,42874,42875,42876,N,\r
+42877,42878,8510,N,N,N,N,8509,8514,N,8518,8519,N,N,8520,8521,N,N,8823,8824,N,\r
+N,N,8517,8516,N,N,N,N,N,N,N,N,N,8819,N,8556,8557,N,N,N,N,N,N,N,8744,8558,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41585,N,N,N,N,N,N,N,N,N,N,N,41583,N,N,N,N,N,N,\r
+N,N,8818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8747,8748,8746,8749,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8781,N,8782,8783,N,8799,8784,N,N,N,\r
+8800,8762,N,N,8763,N,N,N,N,N,N,8541,N,N,N,N,N,N,N,8805,N,N,8807,8551,N,8796,N,\r
+N,N,N,N,N,8778,8779,8769,8768,8809,8810,N,N,N,N,N,N,N,8552,8808,N,N,N,N,N,N,N,\r
+8806,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8802,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+8546,8801,N,N,N,N,8549,8550,N,N,8803,8804,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,8766,8767,N,N,8764,8765,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,8797,8798,10273,10284,10274,10285,N,N,N,N,N,N,N,N,10275,N,N,10286,\r
+10276,N,N,10287,10278,N,N,10289,10277,N,N,10288,10279,10300,N,N,10295,N,N,\r
+10290,10281,10302,N,N,10297,N,N,10292,10280,N,N,10296,10301,N,N,10291,10282,N,\r
+N,10298,10303,N,N,10293,10283,N,N,10299,N,N,10304,N,N,N,N,N,N,N,N,10294,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,8739,8738,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8741,8740,N,N,N,N,N,N,N,N,\r
+8743,8742,N,N,N,N,N,N,N,N,8737,8574,N,N,N,8571,N,N,8573,8572,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8830,8570,8569,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,8554,N,8553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8822,N,N,8821,N,8820,8481,8482,8483,8503,N,\r
+8505,8506,8507,8530,8531,8532,8533,8534,8535,8536,8537,8538,8539,8745,8750,\r
+8524,8525,N,N,N,N,N,N,8513,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,9249,9250,9251,9252,9253,9254,9255,9256,9257,9258,9259,\r
+9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,9273,9274,\r
+9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,9288,9289,\r
+9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,9303,9304,\r
+9305,9306,9307,9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,9318,9319,\r
+9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,N,N,N,N,N,N,N,\r
+8491,8492,8501,8502,N,N,9505,9506,9507,9508,9509,9510,9511,9512,9513,9514,\r
+9515,9516,9517,9518,9519,9520,9521,9522,9523,9524,9525,9526,9527,9528,9529,\r
+9530,9531,9532,9533,9534,9535,9536,9537,9538,9539,9540,9541,9542,9543,9544,\r
+9545,9546,9547,9548,9549,9550,9551,9552,9553,9554,9555,9556,9557,9558,9559,\r
+9560,9561,9562,9563,9564,9565,9566,9567,9568,9569,9570,9571,9572,9573,9574,\r
+9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,9586,9587,9588,9589,\r
+9590,N,N,N,N,8486,8508,8499,8500,12396,17274,45089,15415,45090,45091,N,19324,\r
+15974,15152,15973,12860,45092,18772,19775,N,20514,12591,45093,N,13166,20515,\r
+16420,21058,13654,19002,N,N,N,N,15975,45094,N,20030,N,45095,45096,N,19010,N,\r
+45097,N,20516,45098,N,17254,45099,45100,45101,20517,13946,N,N,45102,20518,N,\r
+13405,17200,N,15463,20519,N,N,20520,45103,45104,20521,18229,45105,13655,N,\r
+45106,N,N,N,18231,N,18019,14403,19251,N,45107,N,N,N,26953,20522,15976,20523,\r
+12853,45108,N,45109,13925,14448,19561,N,N,22054,45110,N,N,N,N,45111,45112,N,N,\r
+N,N,N,N,N,19824,N,18045,45113,45114,N,N,N,45115,N,N,N,N,13349,45116,13621,N,\r
+20524,N,N,20525,20027,N,19773,16744,20527,15222,18035,45117,20530,N,N,12606,\r
+14431,N,14430,12390,45118,45119,20299,20298,N,14899,12321,45120,20531,20532,\r
+20533,19252,20534,N,14450,12391,19314,N,13692,N,N,13693,13694,17506,20028,\r
+45121,20535,N,N,20536,N,N,20537,N,N,45122,16205,N,N,N,N,N,15674,16206,20542,\r
+45123,20540,N,20541,13656,N,N,14883,12912,N,20539,20538,18985,45124,N,N,N,\r
+15174,15173,16958,20543,18773,16487,45125,45126,N,8504,20544,20546,45127,\r
+45128,45129,16997,20065,12362,N,N,45130,N,N,N,N,20545,12862,45131,13892,45132,\r
+17255,45133,N,45134,14191,20547,N,N,N,18212,N,45135,45136,45137,45138,13419,\r
+45139,45140,N,N,N,N,45141,20548,12363,45142,45143,14432,13420,18810,18482,\r
+13657,45144,N,N,45145,45146,45147,N,45148,12913,N,20583,17729,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,45149,18284,20550,45150,N,45152,18492,45153,20066,45154,16173,\r
+45155,15175,45156,15223,12864,45157,N,45158,N,45159,17489,N,N,17186,20554,\r
+45160,45161,N,45162,45163,12364,17507,15675,14900,19748,45164,16974,45165,\r
+12863,45166,20553,45167,19774,20549,20551,14958,20552,21796,45168,45151,N,N,\r
+45169,N,N,N,N,N,20560,45170,N,45171,N,45172,20563,20561,45173,N,12866,N,19003,\r
+20555,45174,45175,45176,45177,20559,14451,45178,45179,15176,N,45180,45181,\r
+13350,45182,45345,20564,N,20556,45346,45347,20067,45348,15224,45349,20557,\r
+45350,20562,45351,45352,45353,N,20565,45354,20558,45355,45356,13857,N,12365,\r
+45357,45358,13858,12865,N,N,N,N,N,N,N,N,N,21797,N,19321,18798,14452,N,N,45359,\r
+N,N,16175,20023,45360,N,45361,N,45362,45363,45364,45365,19032,45366,45367,\r
+14136,16933,12900,45368,45369,N,45370,45371,15699,45372,45373,45374,20569,\r
+45375,20574,20572,45376,N,20567,N,N,16943,20570,N,20573,20571,45377,19037,N,\r
+20568,45378,16174,45379,19315,20575,20576,N,N,N,N,N,N,N,N,15652,20589,45380,N,\r
+45381,18256,N,18742,20584,N,19056,N,12854,N,45382,45383,20588,45384,45385,\r
+45386,N,N,45387,20582,20591,45388,N,16722,45389,14404,45390,18268,45391,24647,\r
+45392,20590,17757,45393,20579,N,14454,45394,45395,14453,20577,45396,45397,\r
+45398,45399,15450,N,20585,45400,19055,17229,20581,14193,45401,20578,20586,\r
+20580,20049,20587,20289,45402,N,45403,N,45404,45405,N,45406,13926,N,N,14192,N,\r
+45430,N,N,N,N,45407,45408,45409,20592,N,45410,45411,20593,20597,12366,45412,N,\r
+45413,N,45414,19024,20596,45415,45416,45417,N,20595,20599,45418,N,45419,20598,\r
+N,17508,N,N,45420,45421,N,45422,45423,N,14194,45424,45425,N,N,45426,N,20600,\r
+45427,N,N,45428,45429,15429,N,16934,17509,13942,N,20601,N,N,N,N,13622,N,N,\r
+20602,45431,N,45432,45433,20604,45434,N,N,N,45435,N,N,19253,45436,45437,45438,\r
+14182,45601,45602,45603,N,45604,N,15153,18551,20603,45605,45606,N,45607,45608,\r
+45609,45610,45611,N,N,N,N,N,N,N,45612,N,14917,19779,N,45613,45614,N,20606,\r
+20771,20605,14916,N,15741,N,45615,45616,N,N,45617,14137,N,45618,N,20772,45619,\r
+45620,13903,N,45621,N,20769,20770,N,45622,17967,45623,16764,45624,13859,N,\r
+45625,45626,19277,20773,N,45627,N,20029,N,45628,45629,20774,45630,N,N,45631,\r
+20777,45632,20775,45633,16718,45634,45635,N,N,N,20776,20778,45636,N,45637,\r
+45649,N,N,20780,45638,N,N,20779,45639,19016,N,N,45640,13623,20782,20783,45641,\r
+12847,N,45642,45643,45644,20781,N,45645,45646,45647,45648,N,45650,N,15476,N,\r
+20786,20785,20784,45651,20566,45652,20787,45653,45654,45655,45656,15742,N,\r
+20788,N,45657,N,N,N,45658,45659,N,19749,N,45660,45661,N,45662,N,45663,19545,\r
+45664,45665,45666,N,20790,45667,45668,20789,20792,20791,N,N,20793,20794,12404,\r
+45669,14389,14139,15676,17275,13860,16488,14455,45670,14702,20796,19528,17734,\r
+45671,15225,N,20795,45672,20797,45673,N,45674,45675,N,17758,N,13173,N,N,45676,\r
+N,N,20798,N,45677,18046,45678,N,16692,20800,20801,18476,14456,20283,20802,N,N,\r
+13862,N,N,N,19004,16950,13937,17717,N,N,N,14195,N,45679,N,20803,N,20804,45680,\r
+45681,18018,12639,N,N,20807,14973,45682,20806,14918,45683,20808,26222,20809,\r
+19265,20810,N,20811,20812,15977,45684,15436,N,N,N,45685,N,N,13351,45686,20815,\r
+45687,20813,19517,20814,N,18778,20816,20817,20818,17759,45688,N,N,20822,20820,\r
+20821,20819,14947,20823,19562,20068,45689,N,45690,N,45691,20824,45692,45693,N,\r
+N,45694,N,16424,20825,15706,N,45857,20826,N,17276,20031,17760,N,45858,N,45859,\r
+45860,45861,N,45862,21061,N,45863,N,N,20827,29733,13893,45864,N,20828,19294,\r
+45865,N,N,45866,15720,17020,N,20830,18020,N,N,20831,45867,N,20832,13102,45868,\r
+45869,45870,20833,13863,45871,17996,12666,15696,N,N,18465,20834,17761,45872,\r
+45873,16207,20835,45874,18988,16474,13346,N,13353,20836,N,N,20838,N,N,14138,\r
+45875,45876,20837,45877,45878,20083,45879,N,N,N,N,15721,N,N,N,N,45880,N,18493,\r
+19020,N,20839,45881,19832,20840,N,N,N,20841,N,17790,45882,45883,20842,N,45884,\r
+16425,14974,14196,20843,15177,14703,45885,N,N,N,N,N,N,17510,20845,45886,N,\r
+16935,N,45887,14959,20846,20847,16688,N,20844,N,N,N,N,20849,45888,19254,45889,\r
+45890,N,45891,14692,45892,N,20848,45893,45894,45895,N,14197,14942,18285,45896,\r
+N,N,20852,20850,N,N,N,45897,18811,15978,20859,13156,20853,20851,16719,N,45898,\r
+45899,45900,N,N,N,20855,N,20854,45901,N,45902,13124,N,45903,N,14176,20860,\r
+20013,45904,N,45905,20856,N,N,N,20861,20858,45906,20857,45907,45908,45909,\r
+45910,N,45911,20047,45912,N,N,14457,12867,N,N,20084,45913,45914,45915,45916,N,\r
+15733,17752,14693,21026,21027,N,45917,45918,20069,N,N,20267,21029,45919,45920,\r
+45921,14458,45922,45923,21028,45924,13103,N,45925,21030,N,19286,45926,17468,\r
+45927,19750,45928,19033,N,N,45929,21031,N,45930,N,45931,28757,N,45932,17968,\r
+45933,21032,13354,19507,N,45934,45935,15905,21033,19047,21037,45936,16426,\r
+21034,13904,45937,21035,13355,45938,45939,45940,N,45941,N,N,N,45942,45943,\r
+14126,21038,45944,21039,45945,45946,21040,21041,15451,N,N,N,14459,19550,45947,\r
+19560,18039,45948,N,19057,21042,N,21043,N,45949,45950,46113,21045,N,21047,\r
+21046,46114,N,46115,N,21048,12861,19276,46116,14972,21049,46117,46118,16729,\r
+46119,46120,15906,13865,N,21050,N,46121,N,46122,46123,46124,18523,46125,46126,\r
+46127,N,21051,46128,21052,46129,21053,N,46130,N,N,21054,18724,13928,12389,\r
+46131,46132,46133,17983,21055,15677,46134,16489,N,21057,21056,15907,14433,\r
+21059,18494,46136,46135,21060,N,N,N,18524,16948,17006,13864,N,N,18030,17201,\r
+46137,18286,46138,19278,N,21062,N,16490,46139,N,46140,N,46141,14133,N,N,21063,\r
+N,N,46142,46143,21064,12588,12405,13421,46144,16936,13649,19825,N,21067,12855,\r
+46145,N,21066,N,N,46146,13866,N,N,21068,46147,19569,N,N,46148,46149,N,N,N,N,N,\r
+46150,N,N,N,N,46151,46152,N,21069,N,20050,46153,14460,N,N,46154,N,14390,21070,\r
+46155,N,N,46156,21072,21071,N,16223,12601,46157,46158,N,12638,21073,46159,\r
+21074,N,46160,14391,46161,46162,21075,46163,46164,N,46165,13678,N,46166,N,N,\r
+46167,N,15154,21076,N,46168,N,N,19316,14901,13658,19751,16720,18495,15485,\r
+46169,N,N,46170,46171,15687,46172,15464,15477,N,15734,46173,18496,N,46174,\r
+46175,21079,46176,12611,16721,14461,14405,13927,46177,46178,21083,17185,17022,\r
+13867,15908,21084,21082,12868,16998,15416,15179,12582,N,46179,13168,14694,\r
+15178,N,21085,21086,46180,13641,13126,N,N,N,14695,13640,17503,12581,17969,\r
+19518,14625,19833,17735,14462,N,46181,N,N,N,N,N,N,46182,14127,N,21095,N,13923,\r
+19274,46183,N,N,N,N,18525,46184,46185,21094,46186,13406,21089,21090,21092,\r
+46187,N,46188,N,N,46189,46190,21093,N,13659,16225,N,18989,21091,21087,14435,N,\r
+21088,N,20260,46191,46192,N,19058,46193,17512,14434,14704,N,N,46194,21096,\r
+46195,N,18013,N,N,N,N,N,N,N,N,N,N,N,N,46196,21100,N,N,46197,N,46198,N,46199,\r
+46200,15486,46201,15478,46202,N,46203,46204,N,21103,21101,N,19491,46205,21098,\r
+21107,21102,N,N,N,21105,14406,19519,N,46206,21106,46369,N,46370,21108,46371,\r
+21110,N,46372,46373,N,14960,20290,46374,21099,21097,21109,46375,21104,N,N,\r
+46376,46377,N,N,N,N,N,46378,N,N,46379,N,46380,21112,N,21283,21114,46381,46382,\r
+21118,46383,46384,21281,21115,46385,46386,21310,N,46387,14953,13105,N,N,N,\r
+46388,21113,46389,46390,46391,21285,12406,21284,46392,12325,18762,21282,N,\r
+21116,N,46393,21111,21117,14920,46394,N,N,46395,46396,N,N,N,N,N,N,N,N,N,21286,\r
+N,N,N,N,N,N,N,46397,12407,21295,N,N,21287,21288,N,15909,19305,46398,N,46399,\r
+21293,21292,46400,N,N,17711,N,N,N,46401,N,N,N,21294,N,46402,21291,46403,46404,\r
+46405,46406,N,N,12596,46407,14902,16176,46408,46409,N,N,46410,46411,46412,\r
+21289,17762,N,N,N,21290,46413,12322,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+46414,46415,N,N,21300,19747,N,15911,46416,21306,N,46417,46418,N,21305,21296,N,\r
+46419,46420,46421,16963,N,21297,46422,N,N,17007,21302,15910,46423,N,46424,\r
+46425,N,21299,46426,N,19556,46427,46428,N,14140,N,N,21303,21304,46429,N,46430,\r
+46431,21301,21307,46432,N,46433,46434,N,21298,46435,N,46436,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,21313,21318,N,21314,46437,21309,46438,46439,21319,16689,\r
+N,46440,21321,46441,14626,21311,17277,N,N,46442,46443,N,46444,46445,46446,\r
+46447,N,N,46448,21315,21308,13357,N,13422,13157,21316,21312,N,N,N,46449,46450,\r
+N,N,14198,21322,21320,16723,13642,13868,46451,21317,N,13940,N,46452,N,N,N,\r
+12612,N,N,N,N,N,N,N,N,46453,N,46454,N,46455,21326,21324,46456,21543,N,46457,N,\r
+46458,46459,N,46460,N,N,46461,46462,46625,21329,N,N,46626,46627,N,21323,46628,\r
+21327,N,46629,21325,N,N,46630,15180,21328,N,N,N,N,46631,N,N,N,N,N,N,N,N,N,N,N,\r
+N,46632,21331,N,21336,N,N,N,21334,21333,46633,46634,17202,N,46635,12869,46636,\r
+N,N,46637,46638,46639,46640,46641,46642,N,21330,N,21332,15912,12595,46643,N,\r
+21335,N,N,N,N,N,N,N,N,N,N,N,N,N,12894,N,N,46644,N,N,21346,46645,15996,21342,\r
+46646,21340,46647,21341,46648,21343,46649,N,46650,46651,46652,N,46653,46654,\r
+46655,12605,46656,46657,N,46658,N,N,46659,N,46660,16697,46661,21337,46662,\r
+21338,N,N,N,46663,N,N,N,N,N,N,13178,N,N,46664,N,46665,46666,46667,46668,21345,\r
+N,46669,N,13423,46670,21348,21344,21347,46671,N,46672,N,46673,46674,N,18990,\r
+46675,N,N,18005,N,18488,N,N,N,N,N,21350,N,N,N,46676,46677,21349,13125,46678,N,\r
+21351,46679,46680,N,N,21354,N,N,N,N,21353,46681,N,N,N,46682,46683,N,N,46684,\r
+46685,46686,21352,N,18233,N,N,21355,46687,46688,46689,46690,N,46691,46692,\r
+46693,21356,N,N,46694,N,46695,21358,N,21357,46696,N,N,N,N,21360,N,46697,N,\r
+21363,21361,21359,21362,N,46698,N,N,21364,46699,46700,46701,46704,46705,21365,\r
+46702,46703,21366,N,21367,N,N,N,21368,20805,46706,15484,15181,46707,46708,\r
+12915,46709,12408,46710,N,17220,46711,46712,46713,46714,46715,N,N,46717,N,\r
+46718,21369,N,14884,46716,12367,16222,N,N,46881,46882,N,21370,14407,N,N,14705,\r
+N,21372,21371,46883,46884,19040,21373,N,N,46885,21537,21374,46886,21538,46887,\r
+21539,N,14199,N,46888,12640,21540,N,46889,21542,N,21541,N,46890,46891,21544,\r
+46892,N,17754,46893,N,46894,46895,46896,46897,21545,12341,14943,46898,46899,N,\r
+46900,14141,46901,46902,17231,N,N,46903,46904,N,N,21546,21547,N,N,21549,N,\r
+46905,46906,46907,21550,N,14948,N,N,46908,46909,13905,N,N,19255,N,46910,46911,\r
+21548,21551,14913,14627,46912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21555,46913,N,14885,\r
+46914,17203,46915,46916,21552,17498,46917,N,46918,46919,46920,46921,46922,N,\r
+46923,46924,46925,N,46926,N,46927,46928,46929,46930,N,46931,21556,N,46932,\r
+16226,46933,N,N,N,N,21554,21557,N,14143,46934,N,N,N,N,N,N,21558,46935,46944,N,\r
+46936,N,46937,46938,N,46939,46940,46941,46942,21559,46943,14628,13120,21561,N,\r
+N,46945,46946,46947,21562,N,46948,N,N,N,21563,N,N,21560,N,N,N,N,46949,N,N,N,N,\r
+46950,N,N,21553,N,N,21564,N,N,21565,46951,46952,N,N,19300,46953,N,15979,46954,\r
+N,N,21567,21568,21566,46955,21570,N,N,N,N,N,18232,46956,46957,12392,18774,\r
+46974,N,21571,46958,N,46959,46960,N,46961,N,N,N,46962,N,N,46963,N,N,N,15997,\r
+46964,46965,15417,46966,18269,13424,N,14955,46967,46968,46969,19289,N,17970,\r
+46970,46971,14200,16975,N,46972,46973,21569,21572,47137,47138,N,N,N,N,N,N,N,\r
+16964,N,N,N,21573,N,47139,N,21574,47140,47141,47142,21576,N,N,17513,N,47143,\r
+47144,N,N,13358,N,N,47145,N,29729,12641,19059,47146,N,15980,17736,N,N,N,47147,\r
+14950,N,N,21582,N,47148,19005,20061,N,N,N,N,N,N,N,47149,12916,21578,47150,\r
+47151,N,47152,47153,16698,21581,N,17763,47154,N,17737,17764,18489,17485,N,N,N,\r
+14921,47155,N,47156,21577,N,47157,N,N,47158,47159,12662,N,17718,N,N,N,N,21579,\r
+N,21575,N,N,16208,N,N,47160,21583,N,N,47161,N,15694,47162,47163,47164,N,13869,\r
+N,21584,N,47165,47166,47167,47168,N,47169,47170,N,47171,47172,N,N,19048,47173,\r
+N,47174,16765,N,N,N,N,17478,47175,N,21586,47176,47177,47178,N,N,N,47179,N,\r
+19279,47180,N,21587,N,N,21592,N,N,47181,47182,18991,N,N,N,N,21591,21585,21588,\r
+21590,47184,N,14886,N,N,19017,47185,N,47183,21593,N,17221,47186,N,12917,N,\r
+15981,47187,47188,N,47189,21595,47190,21594,47191,14696,47192,21596,21598,\r
+21597,47193,N,21600,47194,21589,21602,N,47195,47196,N,21601,21599,N,N,N,47197,\r
+N,15182,16209,N,16724,21603,16444,12397,18276,47198,N,N,N,17499,N,21605,21604,\r
+21606,21607,21608,21609,N,N,47199,47200,N,N,19025,21610,47201,47202,N,N,12870,\r
+21611,N,47203,47204,47205,19772,13104,N,21065,15688,16959,21612,19563,47207,N,\r
+N,N,47208,19508,47209,47210,21614,N,16999,47211,17719,16960,18775,21615,21616,\r
+12667,47212,47213,15418,21617,47214,N,47215,47216,12368,21618,N,N,N,N,N,21619,\r
+47217,N,N,N,47218,12642,N,47219,13425,18016,19060,N,N,N,N,21623,16725,21622,\r
+14144,47220,47221,19291,21621,N,17765,21625,47222,21624,47223,N,47224,47225,\r
+47226,21627,47227,21626,47228,N,12668,N,21628,15913,21630,17189,47229,21629,\r
+47230,18995,47393,N,N,47394,15735,17755,47395,47396,N,21793,47397,N,47398,\r
+47399,14629,N,N,N,21794,18209,18526,19537,N,N,N,N,N,18213,47400,47401,21803,\r
+47402,N,N,N,47403,13624,N,47404,19781,47405,N,19503,N,22060,N,21795,N,47406,N,\r
+N,N,21798,47407,16965,N,47408,19256,N,N,N,17738,47409,47410,47411,47412,N,\r
+21799,47413,N,N,N,47414,N,19301,47415,14922,47416,N,15914,N,N,47417,N,47418,\r
+47419,N,21800,N,47420,15184,47421,15183,N,47422,N,N,12345,14408,47423,16427,\r
+12369,N,N,N,N,21804,21805,N,21802,47424,47425,47426,N,N,N,47427,47428,12600,\r
+13359,47429,21801,N,19525,18737,N,N,47430,47431,N,47432,47433,N,47434,N,12328,\r
+47435,N,N,N,12409,N,N,N,15185,47436,12370,N,12323,47437,N,N,N,N,21810,N,N,\r
+47438,47439,47440,N,N,21808,47441,47442,N,N,N,N,19516,N,21811,N,21809,N,47443,\r
+21807,16177,N,N,47444,47445,21806,N,47446,47447,19034,47448,N,N,47449,N,14436,\r
+47450,N,N,N,N,21815,21816,N,N,N,N,N,15915,N,N,N,21812,20268,N,N,47451,47452,\r
+18252,47453,47454,21814,N,N,47455,N,N,N,47456,N,N,N,N,47457,N,N,N,N,14887,N,N,\r
+N,47458,N,N,N,21817,47459,N,47460,18776,47461,N,N,21818,N,21813,47462,N,N,N,N,\r
+N,N,N,N,N,47463,N,N,47464,47465,N,N,47466,19515,N,N,N,N,N,N,N,N,N,N,N,47467,N,\r
+N,N,N,47468,N,18270,47469,N,N,47470,N,N,47471,21819,18738,47472,N,47473,47474,\r
+47475,N,47476,N,N,N,N,47477,N,N,N,N,47478,N,N,N,N,47479,47480,47481,N,47482,N,\r
+N,47483,N,47484,47485,21820,21824,21821,47486,N,12871,21823,N,47649,N,47650,N,\r
+47651,15419,N,21822,14201,N,N,47652,21836,N,N,N,N,N,21829,21826,N,N,47653,N,\r
+47654,N,N,N,47655,17252,N,21825,N,47656,21827,N,N,21828,47657,N,N,N,47658,N,N,\r
+N,N,N,N,47659,47660,N,N,N,21830,21831,N,47661,47662,47663,N,N,N,N,N,N,47664,\r
+13426,N,21833,21832,N,N,N,N,N,N,N,N,N,21834,47665,N,47667,N,47668,N,47669,N,N,\r
+N,47670,15982,N,N,47671,N,N,N,N,21837,N,17500,47672,N,N,12613,N,21835,N,47666,\r
+N,21838,N,47673,N,N,N,N,N,21839,N,21842,47674,N,21840,N,21841,N,N,N,N,N,47675,\r
+47676,N,N,N,15186,21843,47677,N,14630,21844,47678,15226,16952,N,21845,21846,\r
+15194,14631,47679,19538,N,N,N,13608,14409,21847,13144,N,47680,21848,N,16953,N,\r
+N,47681,47682,21849,22051,N,21850,N,21851,N,N,21852,N,21854,N,47683,47684,\r
+47685,47686,21855,47687,N,21856,47688,17008,47689,12583,15465,12354,47690,\r
+16727,13360,15413,47691,14632,47692,47693,N,47694,47695,17766,47696,15649,\r
+13361,17256,17514,12344,13625,19061,N,15426,N,N,13650,16491,15420,19752,21857,\r
+N,47697,47698,N,N,47699,47700,13660,47701,14923,47702,47703,13106,12643,15916,\r
+12872,47704,21858,19782,47705,N,47706,N,N,15689,47707,47708,15460,21859,13427,\r
+18002,19497,21860,N,21861,N,N,18777,47709,N,47710,21863,N,13352,13943,21862,N,\r
+47711,47712,47713,47714,47715,13362,N,16178,21867,15137,47716,12873,21866,N,\r
+21864,21868,21865,18219,23629,16179,N,21869,N,N,20032,47717,21870,47718,N,\r
+21872,47719,17278,21871,N,16419,N,15227,N,N,47720,16976,15479,18805,16492,N,\r
+15437,21873,15917,21874,21875,12371,16954,16210,47721,21876,17971,15918,N,\r
+15919,N,21877,N,N,16493,47722,N,N,15920,N,N,N,47723,47724,21878,N,21879,47725,\r
+19552,N,47726,N,21880,47727,N,47728,47729,13894,47730,N,47731,15650,47732,N,N,\r
+47733,47734,N,21881,21882,15452,16172,18036,16212,18552,18210,13897,21883,N,N,\r
+N,13679,21884,N,13950,N,17999,12848,N,15187,21885,22050,22049,13949,N,21886,N,\r
+17720,N,N,N,47735,47736,N,47737,N,16944,N,17739,15432,47738,47739,16728,19834,\r
+N,47740,47741,47742,N,N,22052,47905,22053,18006,47906,15155,N,N,47907,47908,\r
+22055,N,N,22056,47909,47910,47911,47912,N,N,N,N,N,N,N,N,N,47913,47914,N,47915,\r
+N,22057,N,N,47916,13428,22058,47917,N,22059,N,N,N,N,N,N,N,N,47918,N,47919,\r
+47920,12844,47921,47922,N,N,47923,N,16699,13412,47924,22061,19496,N,N,N,N,\r
+16978,47925,13145,47926,47927,22063,22065,13407,N,47928,22062,22064,N,22067,N,\r
+N,N,N,N,N,22066,N,22068,N,47929,N,47930,N,N,N,N,N,N,47931,N,N,N,N,47933,N,\r
+22069,N,N,N,47932,N,N,17981,13870,N,N,N,N,N,N,12901,22070,22075,N,N,22073,\r
+47934,19063,19062,47935,47936,N,47937,N,17767,N,N,N,22072,15700,N,22071,47938,\r
+N,N,N,N,47939,16242,N,N,N,22076,N,47940,14954,N,N,22082,47941,N,22083,22077,\r
+13107,22078,22087,22086,22085,22081,N,N,N,22080,N,N,22084,47943,47944,N,47945,\r
+47946,N,19064,N,47942,N,N,N,N,N,47947,N,N,47948,N,N,N,N,47949,N,N,N,47950,N,\r
+47951,N,N,47952,47953,N,N,47954,N,47955,N,47959,22091,22088,N,22090,N,19826,\r
+47957,22089,N,N,47956,N,N,N,47958,N,N,22079,N,N,47960,47961,47962,47963,N,\r
+47964,N,N,N,N,16243,47965,N,22092,47966,N,14903,47967,N,N,22093,N,N,22094,N,N,\r
+47968,47969,N,N,N,47970,47971,N,47972,22097,47973,22096,N,N,22095,47974,N,\r
+47975,17768,22074,N,N,N,22103,N,47976,47977,47978,47979,N,N,N,47980,N,47981,N,\r
+22099,N,47982,47983,N,22098,N,N,N,N,47984,N,N,N,47985,22100,N,22101,N,47986,N,\r
+58996,N,47987,N,N,22104,47988,47989,20070,N,22105,22102,N,N,N,N,N,47990,N,N,N,\r
+47991,N,22106,N,47992,13408,22107,47994,N,47993,N,22109,22108,N,N,22110,N,\r
+47995,47996,N,22111,N,16494,15651,N,47997,15716,N,16739,47998,14633,14904,\r
+14634,13680,48161,N,22112,N,N,14905,N,N,14410,22113,19494,18243,22114,N,14635,\r
+48162,48163,N,13356,N,17191,13906,48164,N,15188,18779,N,N,18497,48165,N,N,N,\r
+22115,13429,48166,N,N,N,22118,48167,N,48168,48169,17441,N,48170,22117,22116,\r
+22119,N,17515,N,48171,48172,N,N,N,N,16227,N,N,48174,N,N,15189,N,16458,48173,\r
+16979,13602,N,48175,17442,N,48176,22120,22121,15983,N,N,N,N,19257,48177,N,\r
+22124,N,N,22123,22122,18813,N,22131,N,48180,N,48178,19290,N,22125,N,48179,\r
+48181,N,N,22127,19307,48182,22126,48183,N,N,48184,48185,N,48186,22128,N,18472,\r
+22129,19006,22130,N,N,N,48187,N,48188,48189,48190,48191,48192,N,48193,N,13363,\r
+19007,18223,22132,22133,N,14636,13364,22134,14392,19780,19753,13430,22136,\r
+48194,17443,N,14637,15921,N,N,18527,N,N,15922,48195,N,N,48196,15736,N,N,N,N,N,\r
+17516,19065,17721,N,N,14638,N,18780,N,N,N,22137,N,48197,N,48198,48199,17753,\r
+14914,48200,N,48201,14411,48202,17517,N,N,N,48203,N,48204,N,12355,15726,14639,\r
+19783,N,N,N,N,48205,48206,48207,N,22138,22139,18257,N,N,48208,N,22140,20087,\r
+20269,48210,48209,N,48211,22142,22141,48212,48213,13127,48214,48215,22305,N,N,\r
+N,22308,22309,48216,22307,48217,18752,15923,22311,22310,22306,N,48218,N,N,\r
+22312,22313,N,48219,22314,N,N,N,22317,22315,N,22316,22318,N,12644,17518,22319,\r
+N,14202,12918,18230,N,22320,18043,19035,48220,22321,20270,N,48221,48222,48223,\r
+22322,19008,22325,20513,20529,48224,15408,18037,22326,N,13661,17444,12410,\r
+22327,18982,14640,48225,N,17232,48226,48227,N,17519,N,48228,48229,48230,48231,\r
+19567,14393,14412,48232,22328,N,48233,48234,22329,48235,22335,48236,15461,N,N,\r
+48237,17445,48238,13871,22330,N,N,48239,18731,48240,17222,48241,48242,22331,N,\r
+N,48243,48244,N,48245,22332,N,13872,N,22333,48246,22334,N,48247,22336,N,17782,\r
+48248,N,22337,22338,48249,22339,N,48250,22324,22323,N,N,48251,22340,14145,\r
+48252,48253,N,18727,48254,N,14924,18743,17446,18763,22341,N,48417,15924,12614,\r
+48418,22342,48419,48420,N,22343,48421,19570,48422,N,18528,48423,48424,22346,\r
+12669,16428,22345,22344,14146,16980,N,22350,22348,48425,22347,20007,14437,\r
+48426,N,48427,15737,22349,17740,15678,N,N,48428,17984,22353,22352,N,N,48429,\r
+48430,22351,N,22354,14438,48431,N,48434,N,N,48432,22355,18812,15707,48433,\r
+48435,22356,18553,48436,48437,48438,N,17985,17447,N,N,N,48439,17712,N,N,22357,\r
+13611,N,N,N,N,N,16180,48440,18732,N,48441,48442,48443,N,48444,13431,18214,N,N,\r
+48445,48446,48447,48448,48449,N,22358,15190,19258,19259,N,N,12670,22363,48450,\r
+N,17257,48451,48452,N,22360,N,N,N,48453,48454,48455,12919,48456,48457,48458,\r
+48459,22573,22362,48460,48461,N,18224,48462,N,22361,N,48463,22359,48464,14714,\r
+N,22365,48465,N,N,48466,N,N,48467,22371,22377,22369,N,17756,48468,48469,22374,\r
+18781,48470,48471,22368,48472,22373,20071,15191,N,48473,16981,22366,N,N,48474,\r
+13662,22376,16429,12645,22370,12920,22375,N,48475,N,13873,N,22372,N,48476,N,\r
+48477,N,N,N,N,22378,N,N,N,N,N,48478,22380,22390,22388,N,N,22385,48479,48480,\r
+48481,22384,20088,48482,22386,N,N,13874,48483,14641,N,48484,15738,48485,48486,\r
+N,22393,22379,N,N,48487,N,22383,22367,48488,12922,22387,22389,17233,N,48489,\r
+14888,12856,22381,22392,22391,13875,N,16937,13158,48490,N,N,N,14147,N,22382,N,\r
+N,N,N,N,N,48491,48492,N,22394,48493,22397,22561,N,48494,N,48495,15421,48496,\r
+22567,17520,22395,48497,N,N,48498,22565,48499,12921,48500,22563,22564,48501,N,\r
+22398,22562,N,48502,48503,14439,19754,N,48504,13365,48505,48506,12633,22566,\r
+48507,18234,12333,N,N,N,N,N,48508,48509,18529,22364,22572,22576,19557,48510,\r
+22569,N,N,48673,17769,22574,48674,N,N,N,48675,N,48676,15984,22575,18007,48677,\r
+48678,48679,48680,N,N,48681,48682,N,20295,N,22571,48683,48684,N,N,22577,48685,\r
+14715,48686,16459,48687,48688,12372,22570,22568,48689,16730,N,48690,N,22396,\r
+15156,N,N,N,N,N,N,N,16966,22589,48691,16731,22584,48692,22581,22582,48693,\r
+15462,22585,22588,48694,48695,22583,15653,48696,22586,N,N,22580,48697,19580,\r
+19579,48698,N,48699,22590,22591,12373,48700,48701,48702,48703,48704,22579,\r
+48705,48706,N,48707,13938,12326,48708,N,48709,13366,N,22587,48710,N,N,N,N,\r
+22595,22594,N,48711,48712,22599,N,N,N,48713,48714,N,N,22600,48715,48716,48717,\r
+N,48718,N,N,22598,22601,22593,22597,N,48719,22602,N,22603,48720,48721,22592,\r
+15228,48722,22596,16982,14642,22578,16181,N,N,N,N,22616,N,19049,N,N,22606,\r
+22607,22608,N,N,22615,48723,22614,48724,N,19325,13367,N,22612,N,14149,13108,N,\r
+N,22609,48725,N,20024,22611,12374,22613,48726,22604,22610,22617,14148,22605,\r
+48727,N,N,48728,48729,N,19805,48730,48731,48732,19755,48733,48734,N,N,22620,N,\r
+N,22624,48735,N,48736,16766,N,20089,22625,48737,48738,22622,N,22619,48739,\r
+48740,22618,22623,N,48741,48742,N,48743,48744,N,N,N,18992,48745,N,17972,48746,\r
+14150,48747,22626,22621,48748,22627,N,N,N,14203,N,N,N,12849,N,48749,48750,\r
+22635,N,48751,N,13368,N,48752,48753,48754,22633,N,N,22634,14889,22632,22630,\r
+22629,22636,22628,22638,48755,48756,12923,N,N,N,N,48757,N,N,N,N,N,N,48758,\r
+48759,48760,48761,N,48762,48763,22640,N,48766,22639,48764,N,48765,N,N,48929,\r
+48930,N,48931,N,N,17448,N,22643,N,22641,22631,14204,N,22642,N,22646,22645,\r
+22647,22644,22648,48932,N,48933,48934,N,N,48935,22649,22650,19050,N,22652,\r
+22651,15679,N,16430,12902,12924,48936,22653,48937,12351,N,N,N,16460,22654,\r
+48938,27715,22817,14177,48939,22818,48940,48941,N,N,16495,48942,N,48943,22819,\r
+48944,N,N,22820,13626,22821,N,22822,22823,16983,N,N,N,14413,48945,N,19553,N,\r
+48946,N,19260,15722,22824,48947,48948,48949,N,48950,16496,28221,18530,N,15466,\r
+48951,14925,22825,N,48952,48953,48954,16967,48955,18983,48956,N,17009,N,48957,\r
+22828,48958,N,22826,N,22829,N,N,22827,48959,N,N,N,22830,N,N,N,N,48960,18993,\r
+48961,N,12343,N,48962,N,N,18782,N,N,18531,48963,N,22831,48964,22834,15925,\r
+13627,N,22832,22839,15926,N,N,N,N,22833,18244,N,N,48965,48966,48967,48968,\r
+19806,22835,22836,22840,17770,22837,14643,16478,N,N,22854,18484,N,17010,N,N,N,\r
+N,N,N,N,48969,N,48970,N,N,18532,23085,N,N,N,N,19066,N,48971,N,17521,48972,\r
+48973,N,19317,48974,22843,12833,17258,48975,48976,N,N,22852,N,48977,17204,\r
+22846,22853,22848,22855,22851,N,22850,18287,48978,22844,12925,22842,13681,\r
+17011,22838,48979,48980,22841,14644,16475,48981,15927,22849,18258,N,N,13682,\r
+13128,N,N,N,N,N,N,N,N,48982,N,13159,16161,22857,22862,N,22858,48983,14205,\r
+48984,22863,15138,14697,N,N,N,N,48985,48986,15654,22845,15229,22860,48987,\r
+48988,N,N,15192,22861,12356,48989,48990,22856,48991,N,N,48992,17449,N,48993,N,\r
+N,48994,N,48995,13683,N,N,N,N,N,13876,N,N,N,N,N,N,N,22859,12327,48996,48997,\r
+14915,N,48998,N,16182,N,N,N,N,N,48999,49000,N,N,49001,17522,N,49002,18516,\r
+22865,16734,N,49003,49004,49005,49006,N,49007,N,N,16938,49008,49009,15147,\r
+22866,49010,22868,22864,N,49011,49012,49013,19041,N,17469,49014,N,N,49015,\r
+16732,N,N,N,N,N,N,N,N,49016,49017,19067,15438,22880,N,22879,49018,49019,16248,\r
+N,N,49020,14206,N,49021,49022,22873,15929,49185,N,18024,18225,49186,49187,N,\r
+49188,22871,N,49189,16733,49190,N,N,49191,15480,22876,49192,N,15928,N,22870,\r
+22875,49193,N,18259,N,49194,49195,22869,N,14113,49196,49197,13149,N,N,49198,\r
+22877,20011,14926,17205,22874,49199,16476,49200,14645,16228,12646,16700,22872,\r
+13637,49201,49202,49203,N,N,14151,N,17487,22878,N,N,N,N,N,16735,N,49204,22881,\r
+N,22883,49205,N,16951,22889,49206,22884,N,49207,22886,N,N,N,N,49208,18753,\r
+17523,49209,22887,49210,49211,49212,19756,N,N,N,19784,13369,49213,N,N,N,49214,\r
+12334,N,22885,N,49215,N,N,N,22882,49216,N,49217,N,13432,N,N,N,49218,49219,\r
+12647,49220,22888,N,49221,49222,19785,22892,N,N,49223,49224,N,N,16955,N,22899,\r
+49225,N,49226,22893,49227,N,22890,22897,49228,N,N,N,22867,N,49229,N,49230,N,\r
+49231,N,49232,49233,22894,N,22898,49234,49235,N,18498,17771,N,49236,49237,N,N,\r
+N,22891,49238,22895,N,N,N,14152,N,N,49239,14961,49240,N,N,16477,N,N,N,N,N,N,N,\r
+N,49241,N,N,22903,49242,N,49243,49244,49245,49246,N,N,N,17702,N,49247,49248,\r
+49249,49250,N,49251,49252,49253,N,49254,N,N,N,22900,N,19296,N,N,N,49255,N,\r
+22901,N,N,N,49256,49257,N,22902,N,19534,N,16418,49258,N,49259,N,N,N,N,N,14178,\r
+N,49260,N,49261,22909,N,N,N,N,N,N,49262,49263,49264,15157,22906,N,22905,N,N,\r
+49265,49266,18226,49267,N,49268,17973,49269,N,49270,N,49271,17713,22907,49272,\r
+N,49273,22908,N,18799,49274,18245,15139,N,16497,N,19280,49275,N,N,N,N,N,13129,\r
+N,23077,22910,49276,49277,49278,N,19786,23079,N,49441,23075,N,23076,N,49442,\r
+49443,49444,49445,16736,49446,N,49447,49448,23074,N,22847,49449,N,49450,23078,\r
+N,23073,N,N,N,N,N,23083,23084,17703,23086,49451,49452,15140,23081,N,49453,\r
+49454,N,13628,49455,N,23087,49456,23080,23091,N,23090,49457,23089,49458,N,N,\r
+23092,49459,N,23094,15985,49460,23093,49461,N,N,49462,23097,N,N,49463,49464,\r
+49465,N,N,N,N,49466,N,N,N,49467,49468,N,49469,N,23095,49470,N,49471,23096,\r
+22896,49472,49473,N,N,49474,23099,23098,N,49475,N,N,49476,22904,23100,23088,N,\r
+49477,15193,N,49478,N,N,23101,23102,23104,23103,23105,12926,49479,14646,49480,\r
+49481,19068,16431,N,N,N,49482,N,14414,N,49483,23107,49484,N,N,N,23110,N,18770,\r
+49485,13663,49486,N,49487,23109,23108,18260,23111,13877,N,N,N,23113,23112,\r
+49488,49489,N,13370,15158,N,N,18008,49490,N,N,N,49491,14153,N,N,N,16244,N,\r
+23114,N,16432,17704,N,18783,23115,N,49492,N,N,49493,N,N,N,49494,23116,23117,N,\r
+49495,N,19000,21853,16454,49496,N,18764,N,14936,N,18533,18499,49497,N,N,49498,\r
+N,17741,49499,20033,N,23119,15440,49500,N,23120,49501,12342,N,49502,13908,\r
+16461,49503,18784,N,N,N,23121,15170,17223,49504,15195,16183,N,49505,49506,\r
+49507,N,N,23122,N,19069,N,N,12663,15196,N,49508,N,23125,49509,23123,23126,\r
+20025,23124,N,49510,49511,N,16507,23127,N,49512,16946,49513,N,23128,N,49514,N,\r
+49515,13434,49516,23130,N,23129,N,N,N,49517,23131,23132,13435,N,N,18044,17206,\r
+13676,15197,16737,N,N,15708,12336,N,N,49518,23133,49519,N,49520,49521,N,N,N,\r
+49522,12834,23137,N,N,49523,49524,49525,N,14647,23136,49526,N,14891,15930,\r
+49527,49528,23135,N,15931,49529,19520,14890,N,49530,49531,12375,16462,49532,\r
+49533,N,N,N,N,N,23142,49534,49697,16433,12615,49698,49699,49700,49701,15701,\r
+49702,19302,14962,49703,49704,49705,49706,15932,49707,16423,49708,49709,N,\r
+49710,23141,23139,23140,49712,N,49711,N,N,17259,N,N,23334,49713,23146,15230,\r
+14648,23144,49714,49715,N,N,23145,49716,16184,49717,N,49719,23143,N,49718,\r
+15151,N,N,N,N,49720,49721,49722,N,49723,49724,23148,23147,23152,49725,49726,\r
+23153,N,23149,N,13090,23150,23151,18517,49728,49729,49730,N,18785,14154,23154,\r
+N,N,49732,16434,49733,15933,49735,49736,49737,17234,49738,49740,N,49731,49734,\r
+49739,13895,N,23155,23159,N,N,12875,23156,23158,N,49741,49742,49743,23157,N,\r
+49744,15723,49745,N,N,N,17224,12357,23160,49746,49747,49748,49749,23161,N,\r
+49750,49751,N,17450,N,49752,N,20081,N,N,N,N,15171,N,49753,19051,N,N,49754,\r
+49755,N,19261,49756,N,N,23330,23163,N,49757,23166,N,23165,49758,49759,23162,\r
+49760,49761,23329,N,N,18014,49762,23164,N,N,49763,N,49764,49765,N,N,N,N,49766,\r
+N,23331,N,N,15724,23332,49767,19787,18296,N,49768,23333,N,N,N,N,N,23335,N,\r
+49769,23336,N,49770,49771,N,49772,N,23337,N,13898,12616,14649,23338,N,23339,\r
+15729,16738,49773,49727,21080,16702,16701,16984,14919,N,N,20594,N,49774,N,\r
+49775,14190,19757,N,19070,N,18814,49776,23340,N,N,N,49777,14963,17471,23341,\r
+20271,N,49778,N,19262,49779,17451,23342,13436,49780,N,49781,N,N,N,23343,23344,\r
+19546,N,19492,19318,19292,15141,23346,N,N,15467,N,49782,19281,N,23348,23351,\r
+23350,N,13433,N,N,13664,49783,23347,N,23349,N,N,N,49784,23352,49785,49786,\r
+16249,N,N,49787,N,19835,12361,14944,16956,N,15453,49788,49789,15987,N,N,23355,\r
+N,N,17742,49790,23353,16939,23354,15986,19549,23356,23357,19816,49953,N,N,N,\r
+23362,N,49954,14650,49955,18261,23359,17772,23134,23138,49956,13647,49957,\r
+18247,N,N,N,49958,23361,N,15934,18500,N,49959,N,N,49960,23367,N,18554,N,23358,\r
+N,23364,23363,N,49961,49962,16463,49963,N,49964,N,19309,49965,20051,49966,\r
+49967,19303,49968,12876,15198,N,N,20296,23366,16245,N,N,N,23365,N,N,23360,N,N,\r
+N,N,N,14415,49969,49970,49971,23372,23370,49972,12877,23368,23374,23380,N,\r
+49973,49974,49975,N,N,49977,16968,49978,49979,19009,49980,23382,N,49981,49982,\r
+18722,N,N,N,23381,18288,19263,13371,49983,16503,15680,N,N,49984,17491,49985,\r
+19758,N,49986,23377,23376,N,N,49987,23378,N,23375,N,49988,23383,N,23373,N,N,\r
+23371,N,23379,23369,49989,17260,49990,19576,15430,14964,49991,49992,N,49976,N,\r
+14906,N,N,19311,13121,17486,17994,12617,N,N,N,N,N,N,N,N,N,N,N,N,N,N,16498,\r
+49994,N,16436,14122,N,49995,N,N,N,49996,23385,49997,N,14651,13180,N,N,N,N,\r
+49999,49998,23387,13172,23393,50000,50001,N,50002,50003,50004,23390,50005,\r
+16499,N,N,N,13131,14892,N,50006,13130,14927,N,50007,23388,14181,14155,17773,\r
+50008,50009,23386,N,12358,N,50010,N,50011,23389,23391,N,13901,14124,49993,\r
+13372,13643,50012,N,50013,50014,23394,N,50015,14969,19313,N,15159,N,N,N,23395,\r
+N,N,N,18736,N,N,N,50016,N,N,50017,50018,50019,50020,50021,N,23407,50022,12851,\r
+23396,N,50023,50024,50025,50026,N,23413,23397,N,20034,50027,23404,50028,18271,\r
+50029,N,50030,N,N,N,N,23412,N,23399,N,N,N,12340,23401,N,50031,14652,50032,N,\r
+50033,23403,50034,23402,N,23398,23409,50035,15935,50036,N,50037,21613,14440,\r
+19836,50038,50039,N,N,23400,50040,17524,13091,14893,50041,23392,N,23408,13153,\r
+N,N,23406,23410,50042,17774,N,N,N,N,N,N,N,13438,50043,23602,N,50044,19529,\r
+23415,13437,50045,23422,N,50046,50209,50210,19264,50211,23585,23587,50212,\r
+23591,23417,50213,17194,N,50214,50215,N,17775,23595,23420,N,23592,N,50216,N,\r
+23586,50217,N,50218,50219,50220,50221,16185,23596,50222,50223,16435,N,N,50224,\r
+50225,N,N,23594,13373,50226,50227,50228,20304,23414,N,N,23590,12376,50229,N,\r
+23416,50230,50231,19514,23421,16162,17479,23411,50232,50233,23589,50234,N,N,\r
+50235,50236,N,16250,23599,13169,14369,N,N,N,N,23601,23418,23600,N,23593,23419,\r
+N,23597,N,23598,N,N,N,N,N,23615,50237,N,50238,17998,50239,23588,N,50240,23611,\r
+N,50241,N,23613,N,17496,N,N,50242,N,N,50243,N,N,N,50244,19788,N,N,N,50245,N,N,\r
+N,N,18806,23608,16970,N,50246,N,23614,16703,50247,23605,23618,23617,N,18031,\r
+23616,18026,50248,50249,50250,50251,N,50252,50253,23620,23607,50254,13896,\r
+23610,15709,50255,50256,50257,18272,23612,13899,N,23604,23606,23603,50258,\r
+50259,20272,13146,23609,50260,50261,23619,13109,N,N,N,N,N,N,N,14951,N,N,50262,\r
+12637,N,N,23636,50263,N,20273,23639,50264,N,50265,N,N,16186,23638,N,N,N,23637,\r
+50266,N,N,N,50267,50268,23634,50269,N,N,50270,N,50271,23622,50272,N,23651,\r
+23621,N,23640,N,N,50273,50274,N,50275,23632,50276,N,23627,23624,N,23625,N,\r
+23633,N,50277,N,29730,50278,N,23630,14653,17480,16740,23628,N,23623,50279,N,\r
+23626,N,N,50280,50281,19789,19306,N,N,N,23631,23641,N,N,N,50282,N,N,50283,N,\r
+23649,23642,N,N,23655,N,23653,50284,50285,N,50286,23648,50287,N,50288,N,N,N,\r
+23647,N,17488,N,16741,50289,23645,50290,50291,23643,50292,N,23650,N,N,N,N,\r
+23656,18549,23662,N,N,50293,N,50294,23657,23660,23654,50295,N,17268,N,18744,\r
+50296,23644,N,50297,23652,15936,50298,19535,23672,23659,50299,N,N,N,50300,\r
+14370,12835,13151,N,N,23635,N,50301,N,50302,N,50465,15937,23664,50466,23671,\r
+15481,13170,50467,N,17198,50468,50469,N,N,N,N,23661,50470,50471,23666,23670,\r
+50472,50473,13878,N,N,50474,N,50475,50476,50477,N,N,50478,50479,N,13644,23668,\r
+N,50480,N,N,N,13601,N,17995,23667,N,50481,N,23669,50482,N,N,50483,N,N,N,N,N,N,\r
+50484,23663,50485,N,N,N,N,23665,N,N,N,N,N,50486,13152,17225,50487,N,50488,\r
+23676,N,50489,50490,N,50491,N,50492,N,23674,14441,N,23673,50493,N,N,N,N,N,\r
+23841,N,N,N,50494,23384,50495,50496,50497,23675,N,23677,23678,N,50498,N,N,N,N,\r
+23852,50499,23848,N,23405,50500,50501,50502,N,23847,50503,N,N,N,23846,N,N,\r
+23843,N,50504,50505,50506,N,23658,23845,23844,N,N,50507,N,50509,50508,N,N,\r
+50510,N,N,N,50511,23850,N,20262,50512,50513,50514,N,N,N,23853,13947,50515,\r
+50516,23849,23851,N,N,N,N,50517,N,N,50518,18471,N,23854,N,50519,N,N,N,50520,\r
+50521,50522,N,N,N,N,N,N,N,23858,23855,50523,50524,50525,50526,19827,23856,\r
+50527,50528,N,50529,23646,N,N,N,N,50530,50531,50532,23859,N,N,N,23860,50533,N,\r
+N,N,50534,N,12597,50535,23862,14183,15393,N,13909,50536,N,N,12836,50537,N,N,\r
+50538,50539,N,N,50540,N,N,19807,N,N,50541,50542,23864,23863,23866,13629,50543,\r
+N,13910,13374,50544,N,N,N,23869,N,N,50545,23868,N,23870,50546,N,12878,50547,\r
+17207,N,23871,N,50548,13375,23873,N,50549,N,50550,23872,N,23874,N,50551,N,\r
+23875,50552,23876,15199,16437,14881,N,18800,50553,N,19042,20292,50554,N,N,\r
+50555,15221,50556,N,N,14928,20082,50557,N,N,23877,23878,N,15200,N,50558,50721,\r
+23879,23880,N,50722,23882,23881,50723,19288,N,N,15710,15468,15172,N,23883,N,N,\r
+N,N,N,N,N,23885,16163,50724,23884,N,N,50725,N,N,23886,50726,50727,N,50728,\r
+50729,23887,N,N,N,50730,50731,23888,23889,50732,50733,50734,23890,50735,23892,\r
+23891,23893,12837,17226,N,23894,50736,50737,15142,13132,23895,50738,50739,\r
+17730,21580,N,N,50740,50741,13603,23896,N,N,50742,N,23897,50743,19052,19304,N,\r
+N,N,17991,23898,18534,N,50744,N,18555,N,50745,19539,N,N,N,23899,N,50746,N,\r
+50747,N,N,50748,50749,N,N,N,23901,23900,N,50750,23903,N,50751,N,23902,N,N,N,\r
+50752,N,50753,N,N,N,N,N,50754,50755,N,50756,50757,N,N,23905,50758,N,N,N,50759,\r
+50760,15201,50761,19505,50762,23906,23907,N,N,13604,N,50763,N,23908,N,N,N,\r
+50764,N,N,N,23910,23909,N,50765,50766,50767,N,N,N,50768,N,50769,N,N,N,N,50770,\r
+16229,50771,50772,18745,12618,N,50773,50774,N,N,18501,50775,17525,15681,13665,\r
+N,N,N,N,N,N,N,50776,50777,N,50778,18502,50779,15406,N,50780,N,50781,23912,N,\r
+13376,N,50782,12664,50783,50784,18034,23911,14654,17235,N,23913,N,N,N,N,50998,\r
+23921,N,23914,50785,N,50786,N,50787,16961,N,13666,23922,50788,N,50789,N,50790,\r
+50791,14184,50792,N,13605,23920,N,N,23918,23915,19808,N,50793,50794,50795,\r
+17472,50796,N,N,18009,23916,N,N,23924,N,23923,14115,50797,50798,12845,50799,\r
+50800,14907,23917,23919,50801,N,N,50802,N,19287,17012,N,N,N,N,N,N,N,N,19319,N,\r
+N,23932,N,50803,23933,50804,12879,50805,N,N,N,18984,19581,24097,15395,15938,\r
+23928,23934,12648,N,13879,50806,N,23925,23930,50807,N,N,16500,18289,N,18535,\r
+50808,N,50809,50810,50811,50812,23927,50813,19233,50814,23929,N,24100,50977,\r
+24098,50978,23931,N,N,50979,19234,18248,13667,N,17701,N,50980,17261,50981,\r
+24101,50982,50983,N,50984,24099,16985,23926,50985,12619,50986,50987,N,N,50988,\r
+N,N,50989,19790,24112,N,50990,50991,N,50992,24111,50993,N,N,N,16502,N,24108,\r
+50994,19820,N,N,17974,24102,N,N,N,N,N,17477,50995,50996,50997,12620,14655,\r
+24105,N,N,50999,51000,N,51001,15655,24110,N,24109,24104,N,24107,51002,N,13160,\r
+51003,24106,18249,51004,N,20014,N,N,15988,16501,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,51005,N,24118,24116,N,18765,N,51006,51007,N,51008,N,24113,24115,51009,\r
+12602,51010,N,14656,20274,N,13117,N,18786,51011,51012,N,N,N,19809,N,N,13092,\r
+16187,24117,N,N,51013,N,N,N,N,N,51014,N,N,24122,N,51015,15939,N,N,N,19760,N,\r
+24119,N,N,51016,51017,24114,51018,24120,51019,51020,51021,20062,N,17779,17986,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,51022,N,51023,N,N,13110,N,N,12629,N,51024,24126,N,\r
+51025,24129,51026,N,N,20035,51027,N,51028,19812,N,N,N,51029,24136,24130,24127,\r
+51030,N,51031,20052,24133,N,51032,51033,N,15690,24135,N,N,24140,51034,N,17777,\r
+24138,N,51035,N,51036,24132,51037,51038,17208,51039,N,24139,51040,24128,N,\r
+24134,51041,24141,12412,24131,N,24142,51042,51043,16188,N,15711,51044,18981,\r
+51045,14894,N,24123,24137,17722,51046,51047,N,N,N,51048,16438,N,13161,14929,\r
+15940,24125,15682,N,N,N,N,N,N,N,14156,N,24124,N,N,N,24146,15725,14394,N,24161,\r
+51049,24155,13684,17743,51050,24150,24159,12335,12594,51051,N,12857,N,24152,\r
+16940,24143,24145,14657,N,N,51052,N,N,N,51053,N,24162,51054,24157,51055,51056,\r
+N,24149,N,N,N,N,24156,51057,51058,N,N,51059,51060,19499,51061,N,24154,24158,\r
+51062,N,51063,51064,51065,51066,N,14416,51067,15941,N,N,17209,51068,51069,\r
+51070,24148,N,N,51233,51234,N,N,N,19759,51235,N,N,24151,N,N,24144,17778,N,N,\r
+24147,51236,N,N,24153,N,N,N,N,51237,N,51238,20305,15422,19326,N,24163,N,N,N,N,\r
+N,N,N,N,N,18478,51239,N,24175,14395,N,N,51240,N,N,15712,N,24165,51241,N,N,\r
+20015,14658,N,24178,51242,N,12398,N,N,24176,N,51243,N,N,24164,N,N,51244,51245,\r
+24170,N,51246,24172,51247,N,N,19791,24167,N,N,17710,51248,N,24169,N,51249,\r
+51250,51251,24177,51252,24171,19527,N,51253,51254,24166,51255,15394,24190,\r
+51256,51257,51258,N,13162,N,24168,24173,24174,N,N,N,N,N,N,N,17004,16986,N,N,N,\r
+N,N,N,N,N,N,N,N,N,51259,24182,51260,51261,24188,N,N,24186,N,17705,N,N,24355,\r
+24183,51262,N,51263,N,51264,24184,24160,13689,18746,N,51265,N,15423,N,51266,\r
+14711,51267,N,51268,51269,N,20275,N,24180,N,24354,12649,16742,51270,N,51271,N,\r
+51272,51273,N,N,N,N,18297,N,13377,20090,N,N,51274,N,N,51275,51276,19489,17490,\r
+51283,N,51277,51278,24187,24189,51279,N,N,51280,N,16690,N,N,51281,51282,N,\r
+24353,24185,N,24179,N,N,N,13379,N,N,N,N,N,N,N,N,N,51284,N,51285,51286,51287,\r
+14185,N,N,51288,24367,51289,51290,24362,16504,51291,51292,13155,N,51293,51294,\r
+N,15713,N,24371,N,51295,N,N,N,51296,24364,17452,24361,17497,N,N,N,24396,N,N,N,\r
+24358,N,24357,N,24366,51297,51298,N,24360,24359,24365,51299,16417,N,24356,\r
+51300,51301,N,N,51302,51303,51304,24368,N,51305,24369,51306,51307,51308,N,\r
+51309,13378,N,N,51310,N,N,N,N,51311,51312,24374,N,24373,24375,51313,51314,\r
+51315,51316,N,24378,N,N,N,51317,51318,51319,17731,N,24372,N,51320,51321,N,N,\r
+24376,N,N,51322,N,N,N,14179,17017,24370,18235,N,51323,24377,51324,51325,N,\r
+51326,N,N,N,N,N,N,N,N,N,24382,24380,N,N,24383,N,51489,24386,N,N,51490,24379,\r
+14698,18216,N,N,24121,N,N,N,51491,51492,N,19828,24381,N,24385,17013,51493,\r
+24384,N,24363,N,51494,28521,N,N,51495,24389,N,51496,51497,24393,51498,24391,N,\r
+N,N,51499,51500,51501,N,24387,N,24388,N,51502,N,24392,N,24390,N,N,N,18766,N,\r
+51503,24398,N,24395,24394,N,24397,18004,24399,51504,N,N,51505,N,N,17269,17005,\r
+N,N,N,N,16421,N,N,51506,24400,N,24402,N,51507,N,N,51508,N,51509,N,N,51510,N,\r
+24401,N,N,N,N,51511,51512,N,N,N,51513,51514,51515,51516,24181,N,51521,N,N,\r
+24403,N,N,51517,51518,N,N,18023,N,N,N,N,51519,51520,N,N,N,N,24404,51522,51523,\r
+N,N,N,N,N,12880,51524,N,51525,17780,13093,N,N,N,N,51526,51527,N,13668,N,N,N,\r
+15454,14930,51528,N,N,51529,N,N,N,51530,51531,N,N,20263,16230,N,N,N,12650,N,N,\r
+N,24406,N,51532,51533,51534,51535,51536,24405,N,51537,N,N,N,N,N,N,N,N,51538,N,\r
+N,N,N,N,N,51539,24409,17210,24412,24407,51540,51541,N,24411,51542,N,N,51543,\r
+24410,17728,12377,N,N,N,N,N,N,N,N,N,N,N,N,N,20085,N,51544,24414,N,N,N,12584,N,\r
+51545,N,51546,51547,51548,51549,N,51550,24416,N,N,51551,24415,N,24413,N,N,N,N,\r
+51552,N,N,N,N,N,N,N,N,N,N,N,N,24408,N,N,N,N,N,N,N,19235,51553,N,N,24418,51554,\r
+51555,51556,51557,51558,N,24417,N,51559,51560,N,N,51561,N,N,N,N,12651,N,N,N,N,\r
+24420,18994,N,24419,N,51562,N,51563,19509,N,N,N,N,15943,N,N,N,N,51564,N,51565,\r
+N,51566,51567,51568,N,N,N,N,16691,N,51569,N,N,N,15942,N,N,N,N,51570,N,N,N,\r
+51571,51572,51573,N,20091,51574,51575,24426,N,16505,N,51576,N,51577,N,N,24422,\r
+24427,51578,N,12652,51579,N,51580,N,51581,N,51582,N,24425,N,18273,24421,24424,\r
+15944,51745,18513,N,N,24428,N,15441,N,N,N,N,N,N,N,N,N,N,51746,N,N,N,16506,N,N,\r
+51747,N,N,N,24431,51748,N,51749,24423,N,14119,N,51750,N,N,24429,N,N,51751,N,\r
+19792,24432,N,N,N,29734,51752,51753,N,N,N,15695,51754,N,51755,N,N,N,N,N,24433,\r
+N,N,N,24434,N,N,51756,51757,18222,51758,51759,N,N,N,N,N,24436,51760,N,N,N,\r
+24437,51761,51762,51763,N,18227,51764,N,N,N,17781,24439,N,51765,51766,N,24441,\r
+N,20053,N,24438,51767,24440,12653,51768,24435,N,51769,51770,N,51771,N,N,21339,\r
+24442,N,N,N,N,16743,15160,24444,N,N,N,N,24443,16164,21081,N,N,N,N,N,N,24445,N,\r
+N,51772,24609,N,24430,24446,N,51773,24610,51774,N,N,N,N,N,18298,51775,51776,\r
+51777,N,N,N,24611,N,N,24612,N,N,51778,N,N,N,51779,N,N,51780,24613,N,51781,N,\r
+51782,N,N,N,N,51783,N,N,N,24614,N,17502,51784,24616,24615,N,51785,24617,N,\r
+24618,N,51786,15455,18787,N,51787,51788,19564,24619,24620,16726,15396,24621,\r
+24622,51789,51790,51791,N,51792,24623,19026,18503,N,N,24624,18263,N,51793,\r
+51794,51795,N,17453,51796,N,51797,51798,N,24625,12903,51799,13677,51800,19526,\r
+51801,19510,51802,12852,20276,51803,N,N,N,19282,51804,18986,N,51805,N,N,51806,\r
+51807,N,51808,16439,N,24626,N,N,51809,51810,17987,N,51811,51812,14371,24627,\r
+51813,14932,24629,24628,N,51814,N,N,24630,N,51815,N,N,N,51816,51817,N,N,N,\r
+24631,51818,N,N,24632,N,N,N,N,51819,N,N,N,N,13630,N,24633,N,N,N,N,24634,51820,\r
+N,N,N,14372,51821,51822,18504,N,51823,24636,N,51824,N,15989,N,N,24635,N,N,N,N,\r
+51825,N,N,51826,13880,24637,24639,N,24638,51827,N,51828,N,N,51829,N,24640,N,\r
+14417,N,24641,N,N,51830,51831,13929,51832,16704,N,14717,N,N,N,51833,24643,\r
+24644,24642,N,N,51834,N,N,N,15469,N,N,17992,13881,N,N,N,N,N,51835,51836,N,N,\r
+24646,17196,24645,51837,51838,20277,18274,52001,52002,N,52003,52004,N,52005,N,\r
+N,24649,52006,N,52007,N,N,N,N,52008,52009,N,N,24651,24648,52010,52011,N,19540,\r
+24650,24652,52012,20036,N,N,52013,N,52014,24656,N,52015,52016,24655,17270,\r
+18221,52017,N,14373,24654,N,52018,52019,N,24653,52020,19761,19762,N,N,52021,\r
+52022,N,52023,24657,12654,N,N,N,52024,14710,15202,N,N,N,N,N,N,N,52025,24658,\r
+24659,52026,N,52027,N,N,N,52028,24661,52029,N,N,N,N,52030,52031,52032,52033,N,\r
+N,15683,N,N,52034,52035,24663,52036,24662,52037,52038,N,52039,52040,24664,\r
+52041,13133,N,N,24666,N,52042,24665,52043,24668,24667,52044,N,N,N,52045,52046,\r
+N,52047,14396,52048,52049,20008,N,13900,N,12838,N,N,52050,N,52051,N,N,52052,N,\r
+52053,13930,52054,52055,N,N,N,52056,N,52057,52058,52059,N,52060,N,N,52061,\r
+52062,N,N,13409,52063,52064,N,52065,N,N,N,N,20072,24670,N,52066,N,52067,N,\r
+52068,N,24672,52069,52070,N,52071,24673,N,12881,N,N,52072,52073,N,24669,52074,\r
+15161,52075,52076,17473,24671,52077,N,N,52078,52079,N,N,52080,N,N,52081,N,N,N,\r
+52082,24676,N,15470,52083,N,52084,N,24674,52085,52086,N,52087,14142,N,N,18505,\r
+24675,N,N,24702,N,N,52088,52089,N,52090,24681,52091,52092,52093,N,52094,14397,\r
+52257,52258,52259,N,13669,52260,24678,19837,52261,N,20016,52262,N,N,N,N,N,N,\r
+52263,N,N,N,N,N,N,N,N,52264,52265,N,N,N,N,N,N,17014,N,52266,24680,52267,N,\r
+52268,52269,52270,52271,52272,52273,52274,52275,52276,52277,24682,20054,13911,\r
+18556,18250,N,N,52278,24683,N,N,N,N,24685,52279,24688,N,52280,52281,N,52282,\r
+52283,N,N,N,52284,N,52285,N,N,N,52286,52287,N,N,24684,N,52288,N,24687,14442,\r
+12621,24689,52289,16240,24686,20060,N,52290,24692,29732,N,52291,52292,52293,\r
+24690,24693,52294,N,52295,52296,24679,24691,52297,52298,14908,N,N,24694,N,N,N,\r
+N,N,N,N,24695,N,52299,52300,N,19838,N,52301,52302,52303,N,52304,N,24696,N,N,N,\r
+52305,52306,52307,52308,N,N,N,N,N,52309,52310,52311,N,52312,N,24697,52313,\r
+52314,52315,24677,52316,N,N,52317,24698,52318,52319,52320,52321,N,N,52322,\r
+52323,13380,52324,52325,N,N,52326,N,N,N,52327,N,52328,N,15397,N,52329,N,N,N,N,\r
+N,N,N,N,52330,52331,24699,N,52332,N,N,24700,52333,N,N,52334,24701,N,N,N,52335,\r
+N,52336,52337,12603,N,52338,52339,24865,N,18747,24866,52340,N,13348,24867,\r
+52341,24868,52342,52343,N,N,24869,52344,24871,24872,24870,N,52345,N,18771,\r
+24874,24873,N,52346,52347,52348,N,N,52349,24876,24875,24877,52350,N,N,N,N,N,\r
+24878,24880,24879,N,N,14713,52513,24882,N,24881,52514,52515,13381,N,16211,N,\r
+17724,N,24883,16440,52516,52517,N,15162,52518,12665,24884,52519,19793,52520,\r
+52521,19043,24885,N,N,52522,17732,19763,14659,16189,N,N,52523,17227,21044,\r
+52524,17454,12904,24886,52525,52526,52527,52528,N,N,52529,24887,N,24892,52530,\r
+52531,24890,24889,23106,13094,24888,52532,12378,52533,18474,52534,N,18506,N,N,\r
+52535,N,20017,24893,24891,17244,16422,52536,52537,18475,52538,18733,N,24895,\r
+20012,14157,24896,N,24894,18518,24897,N,24898,N,52539,12379,52540,N,15990,\r
+24903,N,24900,18029,24899,52541,52542,52543,52544,52545,52546,13606,N,52547,\r
+24906,N,N,52548,24901,24902,N,24905,24904,18725,N,N,16706,16705,52549,13631,\r
+52550,52551,24907,52552,N,N,N,52553,24908,N,52554,24909,N,N,N,N,52555,24911,\r
+52556,24910,N,N,N,N,N,12630,N,N,N,N,N,24919,18536,24913,52557,24915,N,N,24917,\r
+16190,52558,N,24918,24916,15424,52559,52560,52561,24912,24914,52562,18754,\r
+52563,15945,N,N,24921,N,52564,24920,52565,52566,N,N,24922,N,15398,14895,N,\r
+52567,17783,24923,N,17483,52568,N,24925,52569,52570,52571,20001,24924,52572,N,\r
+N,52573,N,16745,N,N,52574,N,52575,52576,24930,52577,24932,24933,17236,N,N,N,N,\r
+52578,24931,N,24928,N,24926,24927,52579,24929,52580,52581,52582,N,N,52583,\r
+52584,24936,52585,24934,52586,24935,N,52587,N,N,52588,52589,N,52590,52591,N,N,\r
+52592,N,52593,52594,52595,52596,24937,24939,24940,24941,52597,24942,52598,\r
+52599,24938,N,52600,N,N,N,52601,N,N,24944,N,52602,52603,24943,52604,N,N,52605,\r
+52606,52769,24945,52770,N,N,N,52772,52773,20037,52774,52775,52776,24948,24946,\r
+24947,52777,52771,52778,13410,N,N,N,N,N,19582,N,N,52779,19018,N,24950,52780,N,\r
+N,24949,N,N,52781,N,24951,24952,N,52782,52783,N,24956,24953,24954,24955,N,\r
+24957,52784,52785,52786,24958,52787,25121,N,52788,N,25122,N,25123,N,18479,\r
+17744,25124,18290,18740,N,25125,52789,N,25126,17706,52790,13095,14660,25127,N,\r
+N,25128,52791,52792,25129,N,15145,N,N,25131,N,52793,25130,N,N,25132,25133,\r
+52794,52795,52796,N,52797,52798,N,52799,52800,52801,52802,52803,52804,52805,N,\r
+52806,N,N,52807,18537,N,25134,N,N,N,25135,N,N,29545,25136,25137,25138,N,N,\r
+52808,N,15150,N,52809,25139,18262,N,52810,19295,N,12622,52811,12631,52812,\r
+52813,25140,52814,N,N,N,25142,N,52815,N,25141,17776,N,52816,N,16441,23865,N,\r
+25143,19521,52817,25144,N,13382,18519,25145,52818,25146,52819,N,25147,N,52820,\r
+N,19548,N,52821,52822,19541,N,17470,N,52823,N,16746,52824,N,25149,52825,N,\r
+15714,52826,15946,N,N,25152,N,52827,25151,25150,18557,52828,13383,14377,N,\r
+52829,N,N,N,52830,N,52831,52832,N,52833,N,52834,52835,25158,52836,N,25155,\r
+16191,19506,N,52837,N,25154,25156,25157,N,52838,25153,N,N,N,52839,52840,52841,\r
+N,N,N,N,52842,52843,52844,25159,25160,52845,17455,N,13411,52846,52847,N,17253,\r
+N,52848,N,N,52849,52850,25161,N,N,52851,N,N,52852,52853,52854,N,N,52855,N,N,N,\r
+52856,52857,N,N,25162,25165,52858,N,52859,52860,52861,16231,52862,17988,53025,\r
+25166,19283,53026,25163,N,53027,25164,53028,N,N,N,53029,N,53030,53031,53032,N,\r
+N,N,N,25169,53033,N,N,53034,25168,25167,53035,N,N,N,53036,N,N,N,N,N,N,25171,\r
+53037,53038,25170,N,N,25172,N,N,53039,53040,53041,N,N,N,53042,N,N,N,25174,\r
+53043,25173,N,53044,N,N,19021,N,53045,N,N,53046,N,15702,20038,53047,53048,\r
+25175,53049,N,17975,N,53050,25176,N,N,25177,N,25181,25179,25180,53051,25178,N,\r
+N,N,53052,N,N,N,25182,N,53053,N,N,N,25183,N,N,N,53054,53055,N,N,53056,N,25184,\r
+N,53057,25185,19511,25186,N,53058,53059,53060,N,19568,25187,53061,17230,53062,\r
+18282,N,13931,53063,N,53064,17211,25188,13882,53065,53066,N,16464,53067,N,N,N,\r
+53068,N,N,53069,25189,14909,N,N,53070,53071,N,N,53072,N,N,25190,53073,53074,N,\r
+N,53075,25191,N,14374,14933,N,N,N,N,N,N,N,53076,N,N,25193,53077,53078,53079,N,\r
+17750,14934,13646,N,N,N,N,N,53080,53081,N,53082,N,19236,N,18251,53083,N,53084,\r
+N,N,17751,N,N,N,N,14684,N,N,N,53085,53086,25195,N,53087,53088,N,N,N,53089,N,\r
+53090,N,N,N,53091,N,N,N,N,N,N,N,N,N,53092,15947,53093,N,53094,53095,N,53096,\r
+53097,N,N,N,53098,N,53099,20018,14661,N,53100,14375,N,N,18467,N,25197,N,N,N,N,\r
+N,53101,N,25199,N,53102,N,N,14443,N,N,N,N,25198,17526,N,N,53103,N,25201,13111,\r
+25196,53104,N,18538,N,12592,53105,14956,N,20306,53106,N,25200,N,N,53108,53109,\r
+53110,N,53107,N,25202,53111,N,N,19019,53112,16473,25204,N,53113,53114,N,25205,\r
+53115,53116,53117,53118,N,25203,N,N,N,N,13134,53281,25211,53282,25210,53283,N,\r
+15399,N,N,N,25212,25207,53284,53285,53286,25213,25208,53287,N,53288,N,18520,\r
+25206,53289,53290,25209,53291,53292,N,N,N,25378,53294,N,N,N,53295,53296,53297,\r
+N,N,53293,N,53298,25377,19297,N,53299,N,25214,N,N,12395,N,N,53300,53301,25380,\r
+N,53303,53304,N,N,53305,53306,N,25379,N,53307,53302,15948,N,N,N,N,53308,25381,\r
+N,N,N,N,53309,N,16707,N,53310,25383,25382,N,N,N,N,N,N,25384,53311,N,53312,N,\r
+53313,53314,53315,N,N,N,N,53316,25192,53317,N,53318,25194,25386,25385,53319,N,\r
+N,N,53320,N,N,53321,53322,N,N,N,N,15400,53323,20073,53324,15442,53325,25387,\r
+14135,N,N,53326,53327,53328,13632,13607,15203,53329,53330,N,N,N,53331,19764,\r
+53332,N,25393,53333,25392,16708,25389,53334,N,25391,53335,53336,15691,16192,\r
+25390,25388,N,18218,N,N,15949,N,53337,18748,53338,N,53339,N,14935,N,N,N,N,\r
+53340,N,N,N,N,17784,N,53341,25394,53342,53343,N,53344,25395,25417,13912,N,N,\r
+20285,16693,N,N,N,N,25396,53345,53346,12882,17527,18977,N,53347,N,53348,53349,\r
+53350,53351,N,53352,N,N,53353,53354,25397,N,N,N,53355,N,N,N,N,13690,25398,\r
+53356,53357,25400,53358,N,N,25401,53359,18217,53360,N,25402,53361,N,N,N,53362,\r
+25403,25404,53363,N,13913,12883,17989,15656,15204,53364,N,53365,N,N,53366,\r
+53367,25405,53368,15657,N,N,N,53369,N,12874,18755,N,53370,25406,53371,N,18539,\r
+N,53372,N,N,53373,53374,16709,53537,25409,53538,25410,18281,53539,16193,25407,\r
+N,17249,53540,53541,25408,53542,N,N,15950,53543,N,N,N,N,N,N,53544,N,N,12380,\r
+53545,13609,N,53546,53547,N,N,N,53548,25411,53549,53550,17528,53551,25412,\r
+16455,N,N,53552,N,N,19501,53553,N,18723,25413,25414,17237,53554,20039,N,53555,\r
+25416,25415,53556,N,N,N,N,N,53557,N,N,N,53558,N,53559,15471,53560,53561,25418,\r
+12400,N,53562,53563,N,25421,53564,53565,53566,25419,12884,14158,25420,14662,\r
+14706,N,19046,25422,53567,53568,19284,53569,53570,25424,N,N,53571,16465,12623,\r
+12858,12332,N,N,N,N,53572,53573,25423,N,53574,N,N,53575,53576,N,53577,53578,\r
+25425,25426,15991,N,53579,N,53580,N,25427,53581,13135,N,53582,N,N,25429,N,N,N,\r
+14186,53583,13670,N,53584,25430,13941,N,N,25431,53585,16508,53586,17997,53587,\r
+16480,14965,53588,53589,N,25432,N,53590,53591,N,N,N,N,53592,53593,17250,16747,\r
+53594,25434,25436,25433,25435,N,N,N,N,N,53595,14114,53596,N,N,53597,N,N,N,N,N,\r
+25437,14118,N,53598,N,13671,19794,25439,N,N,53599,N,53600,25440,N,N,53601,\r
+12590,53602,53603,N,N,25443,N,N,N,13174,25442,25441,53604,25445,25438,53605,\r
+25446,20009,53606,25447,53607,25448,N,53608,21620,25450,N,25449,N,N,N,25451,\r
+25452,53609,20021,25453,N,28783,15951,25454,25455,15703,N,17976,25456,N,53610,\r
+53611,17192,53612,53613,25457,N,17212,25458,53614,N,N,53615,N,13861,N,20799,\r
+17245,15411,53616,N,53617,53618,13384,25459,N,25634,N,25462,53619,13672,N,\r
+25461,25636,N,N,N,25460,N,15952,N,N,53620,N,N,N,25464,25465,N,17707,N,N,25466,\r
+53621,13150,N,N,53622,N,16218,18788,53623,25468,53624,53625,53626,17000,53627,\r
+53628,53629,53630,53793,N,25463,53794,25467,25469,N,N,14971,N,N,N,53795,N,\r
+53796,53797,53798,N,N,N,25638,18734,53799,18470,17785,N,13914,25637,25635,\r
+53800,18485,25470,17246,17787,N,17786,53801,14966,N,N,N,N,N,N,25656,N,N,53802,\r
+N,N,N,53803,25640,53804,25642,N,53805,53806,N,25645,53807,25646,53808,25643,\r
+25644,53809,53810,25641,25639,N,53811,N,N,25633,N,N,N,N,N,N,N,N,N,53812,N,\r
+19023,12885,N,53813,N,25653,N,25650,53814,25655,53815,53816,25654,N,18291,\r
+19495,53817,15163,25648,25657,25652,53818,25651,25647,53819,25649,53820,13385,\r
+N,N,N,53821,N,N,N,N,17213,N,53822,16509,N,53823,53824,18466,53825,N,25662,\r
+53826,53827,N,18468,N,53828,53829,53830,53831,N,N,16481,25659,53832,N,18511,\r
+53833,25663,19027,53834,17243,53835,25658,25660,N,N,25661,N,N,N,N,53836,N,\r
+53837,53838,N,53839,53840,53841,N,25664,N,N,15428,N,N,N,17990,25669,25668,N,\r
+53842,25665,53843,N,N,20278,N,N,N,N,53844,25674,53845,53846,25678,25675,53847,\r
+53848,53849,N,53850,N,53851,25671,53852,53853,53854,53855,N,53856,25672,N,\r
+53857,N,53858,53859,25677,53860,53861,N,25666,21077,25673,25667,N,N,25676,N,\r
+53862,N,53863,N,N,N,25682,53864,13386,N,25679,N,53865,53866,25680,53867,N,\r
+25681,25684,53868,N,N,N,N,53869,N,53870,53871,N,53872,25683,18550,53873,53874,\r
+N,N,25685,20092,19053,25690,N,N,25687,N,N,53875,N,N,N,53876,N,25686,16466,N,\r
+25689,25691,53878,53879,53880,25688,53877,25695,N,25692,53881,53882,53883,\r
+53884,53885,53886,25693,25670,54049,N,54050,25694,25696,N,54051,N,54052,N,N,\r
+25697,54053,54054,N,54055,N,54056,19014,N,25698,N,N,N,54057,N,N,54058,54059,\r
+19554,N,N,13902,14121,25699,N,N,54060,54061,N,18996,N,16232,N,19504,N,54062,\r
+25700,N,20019,N,54063,18292,N,16710,18228,N,N,15693,N,N,54064,12352,54065,\r
+25705,25703,N,25701,13345,54066,15953,25706,N,N,25704,N,25702,25710,N,54067,\r
+25709,25708,25707,N,N,54068,54069,N,25711,54070,54071,54072,25712,16442,54073,\r
+25713,N,25715,N,54074,25714,N,54075,54076,54077,14418,N,N,54078,16696,54079,N,\r
+N,25717,54080,54081,54082,17788,54083,25716,54084,54085,N,25718,54086,18997,\r
+16748,14663,N,25719,N,N,N,54087,20040,N,54088,N,54089,N,N,N,25721,N,N,25722,N,\r
+25723,54090,25724,N,15205,N,25725,14159,N,N,13674,13610,N,25889,54091,19571,\r
+14664,25726,54092,54093,54094,25892,19558,N,18236,N,54095,18739,54096,54097,\r
+54098,15715,25891,54099,15443,14665,15206,13673,18998,25890,54100,54101,N,\r
+16711,19266,14967,54102,N,N,54103,N,N,N,54104,15207,17501,54105,25895,20063,\r
+14937,54106,25896,16194,N,25898,N,N,N,15954,14896,N,54107,54108,54109,25897,\r
+54110,54111,15658,14398,16712,25893,25899,54112,54113,N,N,25894,14160,54114,\r
+25902,25906,14187,54115,N,54116,N,N,25901,54117,N,54118,54119,25910,54120,\r
+54121,14666,N,N,19821,12348,25907,N,54122,13675,54123,25904,N,54124,N,N,N,\r
+25905,N,54125,17789,25903,25900,N,13096,16484,N,54126,14376,54127,54128,N,\r
+25912,N,54129,N,54130,54131,54132,N,54133,54134,N,54135,25909,N,54136,54137,\r
+54138,N,25911,N,54139,N,25908,N,N,54140,54141,N,14161,16947,25913,16750,54142,\r
+54305,25926,N,N,25922,25916,N,N,54306,54307,N,N,54308,25920,15482,12381,25915,\r
+25923,25927,14667,19542,54309,17494,25917,54310,54311,25925,54312,25914,17214,\r
+N,25919,12349,19530,N,N,54313,54314,54315,54316,54317,25918,N,N,13915,18540,\r
+54318,54319,54320,16749,N,20048,15727,N,N,25966,N,54321,25928,54322,16510,N,\r
+25924,25929,25931,N,17529,25934,54324,N,25930,54325,54326,N,19028,13387,54327,\r
+54328,19531,54329,N,12382,N,54330,25933,N,20093,54331,54332,N,N,54333,54334,\r
+25932,54323,12655,N,N,18028,25935,N,N,54335,25942,25936,25943,N,N,N,N,54336,\r
+54337,25939,N,N,54338,N,54339,N,N,N,18299,54340,54341,15434,25941,54342,25938,\r
+25944,25937,N,N,15684,54343,54344,N,N,19237,54345,54346,15692,54347,N,25940,\r
+25952,54348,N,25948,54349,25951,N,25949,25953,25947,N,25921,16467,54350,N,\r
+18507,N,25950,54351,54352,25945,54353,N,N,16673,14162,N,15659,54354,N,54355,N,\r
+54356,N,16165,16694,25956,N,54357,25958,25959,N,N,25955,25957,54358,N,54359,\r
+54360,N,N,54361,25946,25954,N,25962,25961,54362,N,19322,54363,54364,14123,N,N,\r
+54365,N,N,N,N,54366,25960,N,25964,25963,25967,54367,25969,N,54368,15164,25965,\r
+N,N,54369,54370,25970,25971,54371,N,25972,54372,25978,17723,25974,54373,25973,\r
+25975,25976,54374,25977,N,54375,N,54376,25979,25980,54377,54378,13388,N,25981,\r
+N,25982,54380,54379,54381,54382,54383,N,N,N,54384,54385,26145,N,54386,N,N,N,N,\r
+26146,26147,26148,54387,26149,26150,54388,54389,26152,26151,N,N,26153,N,N,\r
+54390,54391,54392,N,26154,26155,54393,N,54394,54395,54396,54397,26158,26156,\r
+26157,14945,14163,N,54398,17238,N,18483,54561,15728,N,N,18253,N,18541,26159,\r
+22637,N,N,N,54562,54563,54564,54565,N,26160,26162,N,19813,26161,26164,26163,N,\r
+19795,54566,26165,54567,18558,54568,54569,54570,N,N,26166,N,54571,54572,N,N,\r
+26169,N,54573,26168,26167,N,N,54574,54575,26170,14130,N,54576,N,16674,13633,\r
+54577,N,N,54578,26174,26171,N,N,26172,N,54579,N,26175,N,26176,26173,N,N,54580,\r
+12585,N,54581,54582,12839,N,54583,N,26178,26179,N,54584,N,26180,N,19810,N,\r
+54585,54586,N,N,15660,N,26182,26181,N,N,N,N,N,54587,N,N,N,54588,16233,26183,N,\r
+54589,N,54590,26184,N,54591,26185,N,13413,54592,N,54593,54594,13389,N,54595,\r
+26186,N,N,N,N,N,26187,54596,19293,19811,54597,54598,54599,19796,20279,N,14669,\r
+26190,15444,26189,54600,54601,N,54602,26191,15401,54603,54604,54605,16977,\r
+54606,26192,54607,54608,14668,54609,19543,26193,26194,N,N,26195,54610,54611,\r
+54612,54613,26196,N,N,54614,N,54615,N,26197,N,N,N,54616,N,54617,N,54618,N,N,\r
+15402,54619,54620,19565,54621,N,54622,54623,26199,54624,17215,54625,26198,\r
+54626,N,N,N,54627,N,26201,N,N,N,26200,N,N,N,N,N,N,N,26202,N,N,N,16443,N,26203,\r
+N,26204,N,N,N,19001,26205,54628,16751,26206,N,54629,N,54630,N,26207,N,N,N,N,\r
+54631,N,20094,26210,54632,26209,26208,17456,54633,26211,16166,N,26212,N,N,N,\r
+26213,20280,26214,N,54634,N,N,26215,26217,26216,18469,54635,18041,N,20286,\r
+18473,N,54636,N,N,N,N,26219,N,N,15955,N,18730,N,26220,26218,54637,13390,54638,\r
+N,N,14420,15208,N,N,18542,54639,54640,N,14378,19267,54641,26223,26221,N,14670,\r
+N,14671,12393,N,14952,N,N,N,54642,54643,18265,N,N,N,N,N,N,N,N,12383,26228,N,\r
+17216,N,54644,N,N,N,18264,54645,16987,54646,N,N,54647,N,54648,54649,26230,\r
+54650,54651,26226,26229,26224,N,26227,19238,N,54652,14421,N,N,12413,26225,N,N,\r
+N,N,N,N,N,54653,54654,26232,54817,26233,54818,54819,17977,N,54820,N,13883,\r
+54821,54822,N,26406,18237,54823,15209,54824,N,13884,16456,20294,19502,26231,\r
+16468,54825,N,N,N,N,N,N,N,N,N,N,54826,54827,54828,N,13651,26234,54829,N,54830,\r
+N,54831,N,N,26236,54832,N,N,54833,N,26235,N,N,54834,N,N,26237,54835,17190,N,\r
+18238,N,54836,N,N,N,17457,54837,N,54838,N,26403,N,N,N,N,N,N,54839,26402,54840,\r
+N,N,54841,26238,54842,N,16213,N,18789,26405,54843,26404,14672,20307,N,54844,N,\r
+N,N,N,N,N,N,26421,54845,54846,N,N,N,26409,26410,54847,54848,54849,N,15472,N,\r
+54850,26408,54851,14712,26407,N,N,26411,N,N,54852,17458,18978,16675,N,N,N,N,\r
+16988,26415,54853,26416,26412,54855,54856,54857,N,26413,N,26414,54858,N,N,\r
+54859,14673,54854,N,N,26422,N,26418,54860,N,54861,N,18790,54862,19308,18728,\r
+54863,N,26417,N,54864,26420,26419,N,N,N,19268,26423,N,N,N,N,54865,N,26424,N,\r
+54866,16695,54867,26425,N,N,26427,N,26431,54868,N,26428,26426,18239,26429,N,\r
+26430,54870,N,54871,12850,N,26437,26432,54872,54869,N,26433,54873,54874,N,\r
+26434,N,16929,N,54875,N,54876,26436,26435,26438,54877,N,54878,54879,26439,\r
+26440,54880,N,16195,54881,12905,N,26441,20055,N,15403,54882,54883,15661,N,N,\r
+54884,54885,54886,15210,17239,54887,54888,N,54889,54890,26442,26443,12593,\r
+54891,26444,54892,54893,26445,26446,54894,N,26447,N,26448,13885,23082,26449,N,\r
+16485,26450,15435,54895,26451,N,20528,54896,54897,N,26452,19038,13404,54898,\r
+54899,16676,15704,54900,18801,15662,N,54901,54902,N,N,N,N,N,54903,26453,14674,\r
+26454,18508,N,26468,N,N,N,54904,26456,54905,16969,18293,14399,26455,16677,\r
+54906,N,N,N,N,N,26457,N,N,54907,54908,54909,54910,17530,N,N,N,55073,N,N,55074,\r
+55075,N,55076,N,N,N,N,55077,N,26459,26458,26461,N,55078,26460,N,26462,55079,N,\r
+26464,55080,26463,N,13391,55081,26465,N,26466,26467,N,55082,14897,20041,N,\r
+26469,16167,N,55083,N,12656,26470,26471,N,N,55084,N,55085,26472,55086,55087,\r
+55088,N,55089,55090,N,N,55091,N,55092,55093,12402,N,26473,55094,N,N,55095,\r
+26474,N,55096,N,55097,N,55098,18791,55099,55100,N,15431,N,26476,55101,55102,N,\r
+55103,55104,13097,12338,55105,55106,55107,55108,26475,26478,18254,55109,16196,\r
+55110,12886,55111,19239,55112,N,N,55113,14173,13916,55114,26477,55115,12906,\r
+55116,55117,N,N,N,N,N,13347,55118,N,N,N,N,N,N,N,N,N,55119,12657,26482,20074,\r
+16989,55120,N,18756,N,26494,55121,12887,26492,N,26490,26481,55122,26479,55123,\r
+26480,55124,15459,13932,17271,55125,N,55126,18001,N,55127,N,55128,N,12625,N,\r
+26484,26483,N,55129,55130,N,26489,26485,26488,N,55131,55132,55133,55134,19536,\r
+26487,12888,13181,26491,55135,55136,26493,55137,55138,N,N,14164,N,N,N,N,N,N,N,\r
+26659,26668,26669,N,N,55140,12331,55141,55142,55143,N,55144,55145,26676,N,N,N,\r
+N,12401,N,N,26667,55146,55147,55148,26666,55149,26661,26660,55150,26658,26657,\r
+17251,55151,17019,26663,55152,N,55153,55154,N,N,26662,N,55155,55156,55157,\r
+26665,N,55158,N,16752,14165,N,N,55159,55160,12609,26664,55161,14675,55358,\r
+55139,55162,55163,55164,16753,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+55165,N,N,26682,N,26683,N,12889,55166,N,N,12846,26680,55329,N,55330,55331,N,\r
+55332,N,55333,26670,55334,26678,N,26685,26679,N,N,55335,26677,N,N,N,55336,\r
+26486,55337,55338,26675,N,55339,55340,26671,55341,55342,55343,13392,26673,\r
+26684,N,26674,N,N,N,55344,55345,26686,55346,26672,18300,55347,55372,N,N,N,\r
+19817,N,N,N,26681,N,N,N,N,N,N,N,26703,55348,55349,55350,26695,N,N,N,16251,N,\r
+55351,N,55352,13638,N,13917,N,26690,55353,55354,55355,N,12891,55356,N,15956,N,\r
+26693,N,N,N,14938,55357,N,17745,26698,N,N,N,N,N,N,N,55359,19054,55360,26689,N,\r
+N,N,12890,14422,18729,26699,N,26687,N,55361,26696,55362,55363,N,26706,55364,\r
+26691,55365,N,26692,17978,N,55366,26697,N,N,55367,26694,19240,26700,12384,\r
+55368,N,55369,N,26688,N,55370,N,N,N,55371,N,N,N,N,N,N,26702,N,26701,N,N,N,N,N,\r
+N,18283,26708,N,26719,N,N,55373,N,13182,N,N,N,26722,N,N,26704,55374,N,N,26709,\r
+19822,N,N,N,N,N,N,N,55375,26718,55376,55377,19797,55378,N,N,55379,20010,55380,\r
+N,55381,55382,N,N,N,55383,17272,55384,55385,55386,13163,55387,N,N,N,55388,\r
+18802,26724,17953,55389,55390,12337,55391,N,26717,55392,26713,16754,26707,\r
+26715,26720,55393,18220,N,55394,55395,12330,55396,26712,55397,26721,18808,N,\r
+55398,55399,N,N,N,55400,26716,N,26711,55401,N,N,N,N,N,15957,N,N,N,N,15663,N,\r
+55402,55403,15404,55404,N,N,N,19544,N,N,18759,N,55405,26727,N,26736,N,N,N,N,\r
+55406,N,55407,55408,55409,N,N,26714,N,55410,N,55411,13175,N,55412,N,N,N,15992,\r
+26725,55413,26730,16755,55414,55415,26726,55416,26733,55417,N,17247,N,26734,\r
+55418,55419,19798,26723,13112,55420,26729,N,55421,26732,19500,N,55422,N,N,\r
+26735,N,N,26728,26731,N,55585,N,N,N,N,N,N,N,N,N,N,55586,N,N,55587,N,19241,N,\r
+20257,55588,55589,55590,55591,N,26739,N,N,55592,N,N,55594,55595,26746,55596,N,\r
+26738,15427,N,55597,55598,N,N,26705,55599,N,N,N,N,55600,N,55601,N,55602,19022,\r
+N,19490,26745,26744,N,26740,26741,N,12598,N,55603,N,55604,26743,N,26737,55605,\r
+55606,55607,55608,17493,55609,N,N,55610,55611,26742,12414,N,55612,N,N,55593,\r
+55613,55614,16930,55615,N,N,N,N,N,N,19011,N,55616,26747,26913,N,18521,N,N,\r
+55617,N,26750,15958,15433,26915,N,N,13886,55618,55619,55620,55621,55622,N,\r
+26916,55623,18809,26749,55624,26710,N,55625,55626,55627,55628,55629,55630,\r
+55631,26748,55632,N,N,N,20303,17954,18803,55633,N,26923,N,55634,N,N,N,N,N,N,N,\r
+26929,N,55635,55636,55637,N,55638,26930,55639,26917,55640,N,N,18294,55641,\r
+55642,26927,26919,55643,26921,55644,55645,N,N,55646,26931,26920,N,55647,26924,\r
+N,N,12658,55648,18021,N,26925,26928,55649,N,55650,55651,N,55652,N,26918,55653,\r
+16678,55654,26922,15143,16197,14128,19572,55668,19577,15730,N,N,N,N,55655,N,\r
+55656,55657,55658,26935,26933,N,55659,55660,55661,55662,N,20302,55663,N,N,N,N,\r
+55664,N,26932,55665,55666,N,19829,55667,26934,26936,N,N,N,N,26937,N,N,55669,N,\r
+55670,N,26940,26938,N,55671,55672,N,N,N,17955,26939,55673,N,55674,18509,26926,\r
+N,N,55675,N,N,N,N,N,55676,N,N,55677,15731,N,26941,26946,16756,55678,N,26945,\r
+55841,55842,N,26914,N,55843,55844,26947,16713,N,N,26942,26944,N,55845,55846,N,\r
+55847,55848,55849,26943,N,N,23857,23842,55850,55851,26949,55852,N,N,55853,N,N,\r
+55854,26948,N,N,N,N,55855,N,55856,N,N,N,19830,N,25148,26950,N,N,N,N,N,55857,N,\r
+55858,N,55859,N,55860,55861,N,26951,55862,47206,55863,N,N,N,55864,N,N,N,N,N,N,\r
+26952,14423,N,13652,N,55865,55866,26954,20829,55867,55868,55869,55870,13685,N,\r
+20026,55871,13939,26955,55872,55873,55874,55875,55876,N,N,26956,N,55877,N,\r
+17262,55878,N,N,55879,N,26957,N,N,N,55880,55881,55882,N,18042,55883,12346,N,N,\r
+N,N,N,N,N,N,N,N,N,N,55917,N,12899,26962,26963,55884,N,N,N,55885,N,26958,N,\r
+15165,55886,N,55887,N,55888,N,55889,N,N,N,N,55890,N,26959,18242,N,55891,55892,\r
+55893,26960,26961,26971,N,55894,N,26965,26968,55895,N,55896,55897,55898,26964,\r
+55899,55900,55901,N,N,N,N,N,55902,55903,55904,N,55905,26966,55906,26967,15448,\r
+N,26969,N,17217,N,14166,13122,N,N,55907,55908,N,26972,55909,N,55910,N,13119,\r
+55911,26977,55912,N,26973,26976,55913,N,N,55914,18490,55915,N,55916,N,26974,N,\r
+N,26975,18760,18522,26978,N,N,N,N,N,N,N,N,17021,26988,55918,26984,55919,55920,\r
+12907,26982,N,19242,26983,55921,55922,26980,55923,26981,26986,26989,55924,N,\r
+26987,55925,55926,55927,26985,26979,55928,55929,N,N,N,17240,55930,26996,N,\r
+19498,N,55931,55932,N,55933,N,55934,N,26994,N,N,56097,26995,N,N,N,N,56098,\r
+56099,N,56100,56101,N,26990,N,N,26992,N,56102,56103,26993,56104,56105,56106,\r
+26991,56107,N,N,56108,N,56109,N,N,N,16486,N,20281,27000,56110,27001,N,N,N,N,\r
+27169,N,16170,N,27003,56111,27006,N,N,N,56112,N,26998,26997,56113,N,27170,\r
+56114,56115,12892,N,27004,N,27171,N,N,N,27005,56116,N,56117,56118,N,27002,N,\r
+17459,N,26999,N,N,56119,N,N,N,18280,N,N,27175,56120,56121,56122,56123,56124,\r
+56125,56126,N,56127,56128,19771,N,N,56129,N,N,56130,N,56131,N,56132,56133,\r
+56134,N,N,N,N,56135,27174,56136,N,27173,56137,N,N,N,56138,N,N,N,27182,56139,\r
+56140,56141,27176,N,56142,N,27184,N,56143,N,N,N,N,19814,27187,N,27178,56144,\r
+56145,27179,56146,N,N,27183,N,27186,27185,56147,56148,56149,27177,N,N,56150,N,\r
+27180,N,27197,N,N,56151,56152,N,N,56153,56154,N,56155,N,N,56156,27190,N,56157,\r
+56158,56159,N,N,N,N,N,56160,56161,N,56162,N,27188,N,56163,27189,56164,N,N,\r
+27194,27195,56165,13098,56166,13634,N,N,27193,56167,56168,N,56169,N,27172,\r
+56170,N,N,56171,56172,56173,N,27192,27196,27191,56174,27198,56176,56177,56178,\r
+27200,27199,N,56179,56175,56180,56181,56182,N,56183,56184,N,27202,27201,26970,\r
+N,N,N,27206,56185,N,N,N,N,56186,56187,N,56188,27203,56189,N,N,56190,27204,N,N,\r
+27205,56353,27207,56354,N,N,N,14188,56355,27209,56356,27208,56357,15664,N,\r
+56358,56359,56360,56361,14676,24103,56362,N,N,56363,27210,15697,N,56364,56365,\r
+13113,56366,27211,56367,12626,56368,15959,27212,56369,56370,14677,27213,12385,\r
+56371,N,N,N,18749,56372,N,27214,N,N,N,N,16234,56373,27221,N,N,27218,N,17263,N,\r
+56374,N,56375,N,27219,27216,13918,56376,27215,27222,N,N,N,N,N,14134,N,N,16990,\r
+N,27228,N,N,N,N,27224,N,N,N,16949,27223,56377,27226,56378,56379,56380,N,27217,\r
+56381,56382,N,27227,N,27229,N,N,N,56383,N,56384,18543,N,N,27225,N,27230,27232,\r
+N,N,14419,27220,N,12353,N,N,56385,N,N,56386,56387,27231,56388,14939,20086,\r
+27233,27234,16757,N,N,N,N,56389,56390,56391,56392,56393,20002,N,56394,56395,\r
+56396,27235,19765,N,N,27236,27237,N,56397,19044,27238,56398,14912,N,20003,N,N,\r
+N,N,N,56399,27243,N,N,N,N,N,N,56400,56401,56402,27244,15960,27242,56403,N,\r
+56404,19815,27239,N,N,27241,16445,16254,56405,27240,N,27245,N,56406,18979,N,N,\r
+27247,N,27246,56407,56408,56409,13164,N,19243,27248,N,56410,56411,N,56412,\r
+56413,56414,N,56415,27260,27250,N,56416,N,N,N,N,27251,56417,56418,56419,N,\r
+27252,27253,N,N,N,N,56420,56421,56422,N,N,56423,27257,N,27258,56424,56425,\r
+27256,N,N,56426,N,56427,27254,56428,27249,27255,56429,56430,N,N,56431,N,N,\r
+27259,28727,N,56432,N,N,56433,N,N,N,12840,56434,N,N,56435,56436,56437,N,27262,\r
+13919,27261,56438,56439,56440,27426,N,27425,N,N,N,27428,56441,N,27427,56442,\r
+27429,56443,N,15665,56444,27430,56445,N,27431,N,N,56446,56609,56610,56611,\r
+27432,16446,N,19799,N,27433,N,N,18980,18246,27434,56612,27435,14379,N,56613,N,\r
+13612,56614,N,N,27436,56615,56616,15211,18241,27437,N,13136,56617,56618,N,N,\r
+56619,56620,27438,N,N,N,56621,27440,19831,N,27439,16198,N,27441,N,N,27442,\r
+56622,N,27443,13393,56623,56624,56625,56626,N,N,27444,N,56627,27445,N,27446,\r
+27447,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,13137,N,56628,56629,56630,56631,56632,\r
+N,27448,N,27449,27450,N,N,N,N,N,12914,N,56633,16168,27451,N,56634,N,56635,N,\r
+56636,N,N,N,56637,N,56638,27452,N,56639,N,27453,56640,N,N,N,56641,N,56642,\r
+14400,N,17531,27454,56643,56644,N,56645,14167,N,16214,N,27457,N,17956,56646,\r
+27456,56647,56648,14129,56649,56650,27455,17015,13613,N,N,27458,N,27459,56651,\r
+15961,56652,N,56653,14189,56654,27460,56655,N,N,N,19244,56656,56657,16479,N,\r
+56658,N,13686,N,19573,16714,56659,27461,56660,N,N,16199,17264,15962,56661,\r
+56662,N,56663,27462,N,56664,N,56665,27465,56666,27466,56667,N,N,N,56668,56669,\r
+N,14910,16962,27464,56670,15963,18750,56671,56672,56673,N,N,27463,56674,56675,\r
+15212,N,12627,56676,27470,14168,N,56677,15214,56678,N,15213,N,20301,27469,\r
+27468,16679,N,13645,20291,13114,15964,N,56679,56680,56681,N,56682,56683,56684,\r
+27467,N,56685,56686,56687,N,27472,56688,27473,27471,56689,14424,N,19776,N,\r
+56690,15215,18215,N,56691,56692,27476,56693,16448,N,17218,56694,56695,19766,\r
+56696,27479,N,N,N,14444,56697,16447,27475,N,27480,14445,27477,27478,56698,\r
+27474,56699,N,N,16482,17993,56700,56701,17199,N,12893,56702,N,N,56865,56866,N,\r
+18544,N,56867,13635,N,56868,17460,N,N,27483,56869,27481,N,56870,17228,56871,\r
+56872,56873,16449,13394,27482,N,16219,N,56874,20042,56875,56876,56877,20288,\r
+56878,N,N,27484,27495,17461,56879,27494,56880,27491,27499,27492,N,27488,N,\r
+17532,27487,N,N,N,27485,56881,19745,15216,N,56882,27489,N,27486,56883,56884,\r
+56885,27493,15732,N,14401,N,56886,N,17018,56887,19269,12634,12386,N,17957,\r
+56888,56889,27497,N,N,56895,56890,27496,N,18022,N,27501,56891,N,N,27490,N,\r
+27500,27502,N,14380,27498,14678,56892,15445,56893,56894,27503,19800,N,N,N,N,\r
+27506,N,27509,N,N,27507,18741,56896,N,N,56897,N,N,27504,N,N,N,56898,N,13920,N,\r
+N,56899,N,27508,N,N,27510,56900,56901,56902,56903,56904,N,56905,27514,N,N,\r
+27511,56910,27513,27512,N,N,56906,56907,56908,N,27515,N,15409,56909,27517,\r
+27516,18792,N,56911,27681,N,N,N,56912,N,N,14169,N,N,N,N,27518,27682,56913,N,\r
+27683,13636,26177,15993,N,27684,N,56914,14446,56915,56916,N,N,56917,27685,\r
+56918,N,27686,56919,N,15166,56920,56921,N,N,N,N,23118,56922,27687,56923,27688,\r
+56924,15666,N,27689,27690,56925,56926,27691,N,N,27692,27693,N,56927,N,56928,\r
+56929,17195,56930,56931,27694,N,N,56932,56933,27696,N,27695,N,N,N,56934,17958,\r
+56935,27697,56936,19245,56937,27698,N,27699,56938,27700,56939,N,56940,56941,\r
+27701,N,56942,56943,56946,18010,56944,N,56945,N,N,N,15965,27702,56947,56948,N,\r
+56949,N,56950,56951,14699,20526,27703,56952,N,N,N,N,N,56953,N,56954,56955,N,\r
+27704,18751,27705,56956,27713,N,56957,N,N,N,27706,N,N,27708,56958,57121,N,\r
+27707,27709,57122,19270,27710,27711,N,57123,N,57124,57125,27712,N,N,N,27714,\r
+57126,N,57127,57128,13101,17511,N,18793,14946,14679,N,57129,N,N,18767,12895,\r
+18510,27717,13395,16469,27716,27721,17273,19555,N,27719,27720,13614,N,27722,\r
+18275,16991,57130,57131,18545,17725,27718,N,19271,12908,27724,20264,17474,\r
+20293,57132,57133,15217,27723,57134,16945,57135,N,27740,16680,57136,N,18040,N,\r
+18768,N,57138,57137,N,N,57139,27727,15167,15218,57140,15966,N,18277,57141,\r
+14381,27726,27725,N,18794,N,57142,N,15425,N,57143,17746,N,57144,57145,N,57146,\r
+N,N,57147,N,57148,57149,N,27729,27730,14680,27728,57150,57151,57152,N,57153,\r
+27731,27732,N,27734,16931,57154,27733,13414,N,27736,N,27735,27737,N,57155,\r
+27739,27741,N,27742,57156,N,N,N,57157,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,16470,57158,15439,27743,N,57159,N,13138,57160,27744,\r
+57161,N,16758,27745,N,27746,18795,N,N,13615,N,N,N,N,N,N,N,57162,N,27747,57163,\r
+N,57164,17462,N,N,57165,N,12635,N,N,57166,N,N,57167,57168,N,N,N,57169,N,N,N,\r
+27748,N,N,N,N,57170,57171,57172,N,N,15473,N,N,57173,N,16246,N,N,57174,57175,N,\r
+N,57176,N,N,57177,16941,N,57178,N,57179,N,57180,27751,57181,57199,N,27750,N,\r
+57182,N,27749,N,N,57183,57184,57185,57186,N,57187,27757,27755,N,57188,27752,N,\r
+57189,N,N,57190,57191,27754,57192,N,57193,27753,27756,N,13687,N,27760,N,16471,\r
+N,27761,57194,57195,N,57196,14425,N,27758,27759,57197,N,N,20265,57198,57200,\r
+57201,17463,57202,16681,N,N,N,N,N,N,27762,57203,N,27765,57204,N,N,57205,57206,\r
+57207,N,27763,27764,19801,57208,N,N,N,17959,27768,57209,N,N,57210,N,57211,N,N,\r
+N,N,N,N,27766,27767,27769,57212,57213,57214,57377,N,N,57378,57379,N,N,27945,N,\r
+N,N,N,N,27772,57380,N,57381,27773,27771,57382,57383,57384,57385,N,N,N,57386,N,\r
+N,57387,57388,27770,N,17533,N,N,27937,27941,27938,27774,57389,27939,57390,\r
+57391,57392,27940,N,N,N,57393,27947,N,N,N,27942,N,57394,57395,57396,57397,\r
+16472,27944,57398,57399,27946,27943,N,N,N,N,57400,N,N,57401,57402,N,57403,\r
+57404,57405,27949,N,15667,N,27948,N,N,57406,57407,57408,27950,N,N,N,N,27951,\r
+57409,57410,27954,27953,N,27952,N,57411,27956,27955,N,19574,N,N,57412,27958,\r
+57413,27957,27959,57414,N,N,N,27960,57415,57416,N,57417,57418,N,N,27962,57419,\r
+N,N,N,N,57420,N,57421,27961,16200,27963,57422,57423,13933,27964,27966,N,57424,\r
+N,57425,N,N,N,N,57426,57427,N,N,27967,N,57428,57429,N,57430,57431,27968,27965,\r
+57432,27969,N,15446,27970,13616,14131,N,57433,N,57434,14382,N,57435,N,N,N,N,N,\r
+N,27971,57436,N,N,18032,N,N,17726,27972,N,N,N,N,57437,N,N,27975,N,57444,57438,\r
+N,57439,57440,N,N,N,N,N,57441,15412,57442,57443,27974,27973,14170,27976,57445,\r
+N,57446,13139,N,27978,N,57447,57448,14940,27977,N,27986,N,N,57449,57450,N,\r
+27980,27982,19045,27979,57451,57452,57453,27981,N,27985,27983,13617,57454,\r
+27984,57455,57456,N,57457,N,57458,27987,57459,57460,18266,20056,N,57461,57462,\r
+57463,15668,N,N,N,27988,57464,57465,57466,57467,19746,27990,57468,27989,N,N,\r
+27993,19777,57469,57470,27992,57633,13165,27991,27996,57634,N,27995,N,N,27994,\r
+17714,27997,57635,N,57636,57637,57638,57639,57640,N,27998,57641,N,N,N,27999,\r
+57642,57643,14700,N,14117,28000,28001,28002,57644,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+16201,28003,57645,15405,28004,57646,57647,N,28005,57648,57649,57650,21025,\r
+20862,N,N,N,N,28006,25968,28007,17188,16171,18240,N,N,57651,57652,28008,57653,\r
+N,19029,17492,14718,N,57654,17193,57655,57656,12586,N,19320,16215,57657,N,N,N,\r
+57658,57659,N,57660,14174,N,57661,13921,57662,57663,19030,57664,N,N,N,N,28009,\r
+N,N,N,N,N,57665,N,28011,57666,57667,28010,12896,N,57668,18038,28012,18295,N,\r
+17715,57669,28013,15698,57670,N,N,28015,57671,57672,19522,28030,28017,28018,\r
+57673,N,17481,57674,16992,16759,57675,17960,57676,28016,13653,N,57677,N,N,\r
+28025,57678,28022,28197,17961,17248,28019,N,17534,17747,28020,28024,16224,\r
+57679,18279,17484,57680,N,16450,28023,16942,16932,28021,12329,20258,N,N,N,\r
+28026,57681,57682,57684,N,57685,57686,16993,57683,N,15669,16202,57687,57688,\r
+28028,28027,57689,12399,28029,N,N,18735,N,28199,57690,N,18011,16235,57691,\r
+57692,17241,N,13944,N,28198,19767,12607,57693,19031,12897,28193,28194,28195,\r
+28196,17979,17187,12387,28200,N,28201,29731,N,57694,16957,57695,28202,N,12659,\r
+16716,57696,14383,N,19802,57697,57698,28203,17708,N,N,57699,16760,15447,28204,\r
+57700,N,28207,N,57701,15717,28205,16683,16682,57702,12388,N,20043,28209,N,\r
+18546,28211,28210,28208,25444,13396,57703,N,28014,57704,28213,28212,57705,\r
+57706,N,57707,28214,57708,19768,N,N,N,57709,N,57710,57711,57712,N,57713,N,N,N,\r
+N,57714,57715,57716,18017,N,57717,19246,N,28215,N,15449,N,N,N,N,28216,57718,\r
+28217,57719,57720,57721,28218,57722,N,17697,N,N,N,N,57723,57725,N,N,12394,N,\r
+57726,57889,57890,N,57891,57892,N,14681,N,57724,N,20282,N,N,N,57901,N,N,57893,\r
+N,57894,57895,57896,N,28222,57897,57898,N,57899,N,14132,28219,N,28220,57900,N,\r
+N,18804,N,N,57903,N,13140,N,57904,57905,N,N,N,57906,19769,57902,13887,N,N,N,N,\r
+N,17748,57907,57908,57909,N,28223,N,57910,57911,57912,N,57913,N,N,N,N,57914,N,\r
+N,57915,N,28224,N,57916,N,57917,57918,57919,28225,57920,N,57921,N,57922,N,\r
+57923,N,57925,57926,N,57924,N,57927,N,57928,N,N,N,17698,57929,57930,28227,\r
+57931,28226,N,57932,N,57933,57934,N,57935,57936,N,57937,57938,N,N,N,N,N,57939,\r
+N,N,N,57940,57941,18003,28228,15670,15456,18267,17265,57942,N,N,15474,57943,\r
+16236,N,28229,57944,28230,57945,57946,57947,N,N,N,N,N,57948,16221,28231,57949,\r
+28232,N,57950,N,28233,19823,N,15671,57951,N,N,N,N,28235,28234,57952,14682,N,\r
+14707,15168,57953,57954,57955,N,N,N,N,N,57956,28238,57957,N,57958,57959,15718,\r
+N,28237,57960,28236,N,17001,57961,N,14447,57962,16451,57963,57964,57965,N,\r
+18480,57966,N,N,N,15673,N,57967,N,N,57968,28239,N,15967,N,57969,N,57970,N,\r
+28242,28240,57971,57972,57973,28241,57974,57975,57976,57977,28244,28243,57978,\r
+N,15994,N,28245,57979,57980,57981,N,57982,28246,28247,58145,58146,N,58147,\r
+18512,14931,15457,28248,N,28249,20004,15685,19566,20044,28250,13922,N,58148,\r
+58149,N,28251,58150,17699,58151,58152,28254,13176,16203,58153,28252,N,28253,N,\r
+17504,58154,58155,19285,13948,N,58156,58157,N,58158,58159,58160,58161,58162,\r
+58163,N,N,N,28256,28257,58164,N,58165,N,58166,28255,58167,N,28259,58168,58169,\r
+N,N,58170,58171,58172,58173,N,58174,58175,N,58176,18015,13123,N,58177,28263,\r
+58178,58179,28260,28262,58180,N,58181,N,N,N,58182,58183,28258,N,N,N,N,58184,\r
+58185,58186,58187,N,58188,28495,N,N,28261,N,58189,58190,58191,N,N,58192,20075,\r
+58193,58194,14426,58195,58196,58197,N,58198,N,58199,28271,58200,N,58201,58202,\r
+17716,28266,58203,58204,28269,28267,58205,28272,N,58206,58207,58208,28273,\r
+58209,N,N,N,N,N,28265,58210,58211,28278,12660,58212,58213,28264,N,58214,58215,\r
+18477,N,28268,58216,15968,58217,58218,58219,N,N,N,N,58220,58221,58222,14683,N,\r
+N,N,58223,58224,58225,58226,58227,N,58228,58229,58230,19272,58231,13924,N,N,\r
+15686,N,17980,N,N,58232,58233,58234,N,N,58235,58236,N,N,16685,58237,28276,N,\r
+28270,28275,58238,19523,58401,17464,28277,28274,N,N,58402,58403,N,N,N,58404,\r
+58405,N,58406,58407,N,N,58408,N,16684,N,58409,N,N,58410,N,N,N,58411,28281,\r
+58412,28280,58413,58414,58415,58416,N,58417,58418,58419,58420,58421,N,58422,\r
+58423,58424,58425,N,N,58426,58427,58428,58429,28279,58430,N,19247,58431,N,\r
+58432,N,58433,58434,58435,N,N,58436,58437,N,58438,58439,58440,N,58441,15739,\r
+58442,N,58443,58444,28282,19039,N,58445,12628,58446,N,58447,N,18758,17266,N,N,\r
+N,N,13688,58448,28284,58449,14685,N,N,58450,58451,N,58452,N,N,N,15148,N,58453,\r
+N,N,N,N,58454,N,28283,16237,58455,N,N,58456,58457,N,N,16238,28449,28451,N,\r
+58458,58459,58460,58461,15995,58462,28450,28452,58463,58464,13907,58465,18757,\r
+58466,58467,15458,20259,N,28286,14968,N,N,20287,58468,58469,28454,58470,58471,\r
+N,N,28453,28455,N,N,N,N,N,N,N,N,28285,N,N,58472,58473,58474,N,18025,N,17749,N,\r
+N,58475,58476,58477,N,17495,58478,28460,58479,58480,N,58481,17219,28456,N,\r
+58482,N,28457,N,N,N,58483,58484,N,58485,N,58486,58487,N,14125,58488,28459,\r
+58489,58490,58491,N,58492,58493,14384,58494,N,N,N,58657,N,28458,58658,15969,\r
+58659,58660,58661,58662,N,N,N,N,N,58663,N,58664,58665,13177,58666,N,58667,N,N,\r
+58668,N,28464,58669,14911,16761,58670,N,17482,58671,N,N,58672,N,N,58673,N,\r
+58674,58675,N,58676,13115,58677,58683,N,58678,28462,28463,17475,N,28461,N,N,N,\r
+58679,58680,58681,N,N,28465,58682,N,N,N,N,N,N,58684,N,28471,58685,58686,58687,\r
+58688,28474,58689,58690,58691,58692,58693,N,N,28473,17709,N,58694,N,N,28466,\r
+28467,28470,58695,N,N,58696,28472,58697,58698,N,13888,58699,N,28475,28469,\r
+58700,58701,28468,N,N,N,N,N,N,N,N,N,N,N,N,N,N,58703,58704,58702,58705,58706,N,\r
+58707,58708,58709,28479,58710,N,N,28480,58711,58712,N,N,N,58713,58714,58715,\r
+28481,N,N,28478,28477,58716,58717,58718,15970,17962,28476,N,N,N,N,58719,N,\r
+28485,N,N,N,N,N,N,N,N,N,28483,N,N,58720,58721,N,58722,58723,58724,58725,28484,\r
+28482,N,17016,N,28486,58726,N,58728,N,58727,N,28487,N,58729,28489,58730,N,N,\r
+58731,N,58732,N,58733,N,N,N,N,13397,28488,19578,N,58734,N,N,N,58735,28500,\r
+28490,58736,N,28493,58737,28491,58738,28492,58739,N,N,N,N,58740,N,28494,58741,\r
+N,58742,58743,58744,28496,58745,58746,N,N,28497,N,28498,N,N,N,N,28501,28499,\r
+28502,28504,N,28503,N,58748,58747,17465,58749,58750,N,N,N,N,58913,N,19559,N,\r
+28505,16686,58914,N,N,28506,58915,19012,28507,13099,58916,58917,58918,12604,N,\r
+13399,N,13398,28508,N,28509,N,28510,28511,N,N,N,58919,58920,58921,28512,58922,\r
+13400,13141,14686,18486,58923,28514,28513,58924,N,58925,58926,28515,N,N,N,N,\r
+12636,N,58927,N,58928,N,N,28518,58929,28517,28516,58930,28519,58931,N,N,N,\r
+28522,N,N,58932,12359,58933,58934,28520,58935,28524,28523,N,N,58936,58937,\r
+58938,58939,28526,28525,28527,N,17966,58940,58941,N,28528,58942,58943,58944,\r
+58945,28529,28531,N,58946,28530,58947,18796,58948,58949,N,N,28532,58950,N,\r
+58951,58952,58953,N,28533,N,14949,N,58954,N,28534,28535,N,58955,19273,58956,N,\r
+N,N,58957,58958,58959,58960,16715,58961,58962,N,12324,16971,58963,28536,N,\r
+18797,N,N,N,N,N,N,28539,28537,14687,N,28538,14402,N,58964,N,58965,N,58966,\r
+58967,58968,N,N,19013,28541,28705,28542,28706,N,58969,12577,16216,15740,13401,\r
+28707,N,N,N,18278,N,28709,N,58970,N,12578,N,28708,17476,58971,20045,17963,\r
+28540,20006,N,14385,58972,58973,19803,58974,58975,N,58976,58977,58978,58979,\r
+13945,20020,N,14120,58980,16994,26401,N,28710,13100,16239,N,58981,N,N,13142,\r
+28712,58982,28713,28711,14180,58983,14941,15971,58984,N,58985,12579,N,N,20057,\r
+58986,58987,58988,28715,28206,58989,28714,N,N,N,58990,58991,28718,28716,28717,\r
+58992,28719,N,28720,20076,28721,28722,58993,16457,18491,N,N,N,16253,13415,N,N,\r
+19770,12909,15672,14427,N,28725,58994,28724,15219,28726,28723,N,N,15144,58995,\r
+N,N,28730,27181,N,58997,21078,58998,16247,28728,58999,59000,59001,N,N,20005,\r
+18033,N,N,N,N,12587,59002,16483,15414,N,N,N,59003,18999,59004,12608,N,N,N,\r
+20077,19819,N,28731,59005,17733,15483,N,59006,59169,28732,59170,28733,16204,\r
+28734,59171,20078,N,N,28729,28736,28738,N,28737,N,28735,N,N,28739,N,N,28740,\r
+59172,59173,16762,59174,12898,N,N,59175,59176,59177,28741,N,N,19512,59178,N,\r
+28742,N,N,N,N,N,28743,59179,20266,59180,N,N,N,N,23345,28744,N,N,N,28745,28746,\r
+N,N,59181,28750,59182,28747,N,28748,N,28749,28751,59183,N,N,N,59184,59185,N,N,\r
+16452,N,N,59186,19575,59187,59188,16453,59189,59190,28752,N,18547,N,28753,\r
+29523,19532,59191,28754,N,28755,59192,28756,13143,59193,28758,N,16217,59194,N,\r
+N,28759,N,59195,14116,N,59196,59197,59198,28760,28764,59199,28762,59200,N,\r
+59201,59202,28763,N,N,13171,28761,28765,N,N,59203,N,28766,N,12360,N,28767,\r
+28768,N,N,N,N,59204,59205,59206,15972,59207,59208,N,28769,N,59209,59210,13639,\r
+N,59211,28772,N,N,28771,N,28770,N,N,27505,59212,19036,59213,N,N,59214,59215,\r
+28773,28774,59216,59217,N,59218,59219,59220,N,59221,N,59222,59223,N,59224,N,\r
+28775,59225,59226,28776,59227,28777,59228,59229,28778,59230,59231,59232,N,\r
+59233,59234,N,13402,59235,N,N,59236,59237,59238,N,59242,28779,59239,59240,N,\r
+59241,59243,N,N,59244,N,N,N,N,N,N,N,N,28780,18211,59245,N,59246,28782,12859,\r
+59247,28785,28784,59248,59249,N,59250,12580,N,N,N,13889,19015,17466,14882,N,\r
+14688,15719,59251,16220,N,59252,N,28787,59254,59255,28786,19778,13416,18514,\r
+18012,59256,N,59257,16252,20046,59253,14171,N,59258,N,59259,N,59260,28790,N,\r
+59261,28789,59432,59262,N,N,N,N,59425,19275,17964,59426,59427,59428,N,59429,\r
+59430,12624,59431,N,28791,28788,N,N,18769,19818,28792,59433,N,N,N,N,N,59434,N,\r
+28793,59435,N,N,59436,28795,17002,13147,13148,28794,N,59437,59438,59439,13417,\r
+14386,59440,59441,13418,59442,59443,17727,N,N,20064,N,N,N,59444,59445,N,59446,\r
+59447,14428,N,N,59448,28796,59449,N,N,28797,28798,28961,N,28963,28962,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,18807,N,28964,59450,N,59451,59452,28965,59453,28966,N,N,59454,\r
+N,28967,59455,59456,N,59457,59458,N,N,N,59459,N,N,59460,28969,28968,59461,\r
+28970,N,59462,N,N,N,59463,N,N,N,N,N,N,N,N,N,N,N,N,N,N,18548,26188,N,N,16169,N,\r
+59464,13618,59465,N,59466,59467,59468,N,28971,59469,28972,N,21036,23867,18515,\r
+N,N,12411,59470,12347,N,59471,N,N,N,N,N,15220,19248,15998,59472,28973,N,19551,\r
+N,59473,59474,28974,19804,N,12610,N,N,N,15169,59475,28975,12910,28976,59476,\r
+59477,59478,28977,N,59479,59480,59481,28979,28980,59482,28982,28978,59483,N,\r
+28981,N,59484,59485,13403,N,N,59486,28983,N,28984,N,N,59487,59488,59489,59490,\r
+59491,N,N,N,59492,59493,59494,59495,28985,28986,N,59496,59497,28987,N,N,28989,\r
+59498,59499,59500,28988,N,28991,28994,59501,59502,N,28990,28992,28993,N,59503,\r
+28995,N,13890,59504,59505,N,59506,59507,N,59508,59509,59510,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,15475,28996,28997,14689,N,59511,N,59512,N,59513,N,N,N,N,N,28998,\r
+59514,N,13118,N,N,N,18255,28999,29000,N,59515,59516,59517,17242,18027,59518,N,\r
+N,N,59681,59682,N,29001,59683,N,59684,N,18301,N,59685,16972,12632,13934,N,\r
+13935,59686,N,N,N,N,N,N,17267,29006,13936,59687,59688,12911,N,N,29005,59689,\r
+59690,29003,59691,29004,59692,29002,N,N,29016,N,N,N,N,59693,N,N,59694,59695,\r
+59696,29007,29008,N,59697,29009,29010,N,59698,59699,N,N,29012,59700,N,29011,N,\r
+59701,59702,15705,29013,59703,59704,59705,29015,N,N,N,N,N,59706,59707,N,13619,\r
+29014,59708,59709,16763,14387,N,N,59710,N,N,29017,N,N,N,N,59711,N,59712,N,\r
+59713,59714,59715,N,N,59716,16973,N,N,29018,N,59717,59718,N,17965,N,N,59719,N,\r
+59720,59721,29019,59722,N,N,N,N,N,29024,N,29022,59724,29021,29023,59725,29020,\r
+N,59723,N,N,59726,59727,59728,29026,59729,N,N,59730,N,N,59731,29025,59732,\r
+29028,N,N,13891,29027,N,59733,N,29029,N,N,29030,N,29032,29031,N,N,N,29033,\r
+29035,29034,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,14716,N,59734,N,59735,\r
+29036,59736,59737,29037,N,59738,N,59739,59740,59741,N,13116,59742,N,59743,\r
+29038,N,59744,59745,29039,59746,N,59747,16241,N,59748,N,59749,N,N,N,N,N,59750,\r
+29040,59751,29041,59752,29042,29043,59753,59754,59755,14690,N,N,59756,59757,N,\r
+29044,29045,59758,N,29046,29047,59759,59760,29048,59761,N,59762,18481,29050,\r
+59763,18726,29051,29049,N,29053,59764,59765,29052,59766,N,29054,N,59767,59768,\r
+29217,N,59769,N,59770,59771,59772,59773,59774,59937,59938,29218,N,59939,59940,\r
+N,59941,59942,59943,59944,N,59945,N,59946,N,N,N,59947,N,29219,59948,29220,\r
+59949,59950,N,N,29221,59951,N,29222,29223,N,29224,59952,29225,29226,29227,\r
+29228,59953,N,59954,29229,29230,N,23861,29231,59955,59956,59957,N,59958,N,\r
+59959,59960,25720,13620,59961,N,N,N,13089,14898,29233,29232,19493,N,N,59962,N,\r
+N,59963,59964,29235,29236,29234,N,29237,N,N,19298,59965,59966,59967,29238,N,\r
+13691,59968,N,N,59969,N,N,59970,N,59971,N,59972,59973,N,59974,N,59975,59976,\r
+59977,59978,59979,20261,N,N,N,59980,29239,59981,N,59982,59983,59984,N,N,N,N,N,\r
+59985,59986,N,N,29241,59987,59988,59989,59990,N,59991,59992,59993,N,59994,\r
+12350,59995,59996,29242,18987,29240,59997,N,29243,29244,N,N,59998,N,N,59999,\r
+60000,29245,29246,N,N,N,N,N,60001,60002,29247,60003,19310,15149,60004,14970,\r
+16687,N,60005,60006,60007,N,29248,N,N,60008,60009,29251,N,60010,60011,N,60012,\r
+60013,29249,60014,N,N,N,N,29252,60015,60016,14449,29250,N,N,N,60017,29253,\r
+60018,29254,29255,N,29259,N,15146,60019,60020,N,N,16996,N,60021,N,60022,N,\r
+29260,29257,29256,29258,60023,N,60024,14175,N,60025,60026,N,N,N,60027,29264,\r
+29263,29262,60028,N,12339,N,60029,60030,60193,60194,N,N,60195,N,60196,60197,N,\r
+60198,N,29274,N,29270,N,29271,29267,29273,60199,29269,13154,N,60200,20300,\r
+60201,29272,29268,29266,29265,60202,N,60203,60204,60205,29276,60206,N,60207,N,\r
+N,29279,60208,60209,29278,29277,60210,60211,60212,60213,60214,N,N,18761,29275,\r
+12403,29280,60215,29282,N,N,60216,60217,60218,N,13167,29261,12599,N,60219,\r
+29284,N,N,60220,N,60221,60222,60223,29283,29281,17197,60224,60225,N,N,N,60226,\r
+60227,60228,N,19312,60229,60230,N,60231,20058,60232,N,29285,60233,60240,60234,\r
+60235,60236,29286,N,N,60237,N,N,N,29287,60242,60238,60239,60241,N,N,60243,N,\r
+60244,N,60245,N,N,60246,29288,60247,29289,N,N,60248,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,17467,60249,29290,N,18487,N,29295,29291,N,N,N,\r
+29292,N,60250,19249,19524,N,18000,60251,N,60252,60254,29296,N,N,29297,17982,\r
+29294,29293,N,60253,N,N,12842,N,N,60255,29305,N,N,29304,N,60256,60257,N,N,\r
+12661,60258,60259,60260,29302,N,N,N,29301,N,N,29299,N,13179,N,29298,15410,\r
+12841,N,N,60261,60262,N,60263,60264,60265,N,N,N,N,N,60266,14691,60267,60269,\r
+29308,29307,N,29306,60270,60271,29303,60268,29309,60272,29310,N,60273,N,N,N,N,\r
+N,29477,29476,N,60274,60275,N,N,N,N,29478,N,N,12589,29473,29474,60276,14708,\r
+19513,60278,60277,29475,60279,N,N,N,60280,60281,60282,19250,N,N,29483,60283,N,\r
+29479,N,N,N,60284,60285,N,N,29484,60286,60449,N,60450,N,N,N,N,60451,60452,N,\r
+60453,29481,N,29480,60454,N,N,60455,60456,14172,N,N,60457,60458,N,60459,60460,\r
+60461,60462,N,29485,N,N,N,N,N,N,60463,N,N,29486,N,N,N,N,29487,60464,29482,\r
+60465,N,60466,29300,N,60467,29488,N,17505,60468,N,N,29492,60469,29493,29491,\r
+60470,N,N,60471,N,29490,29496,60472,29489,N,29494,60473,N,60474,60475,N,N,N,N,\r
+29495,N,N,N,29498,60476,60477,60478,60479,N,29497,60480,N,N,N,60481,60482,\r
+60483,N,N,N,N,60484,29500,60485,N,60486,N,60487,N,29501,60488,29502,60489,N,\r
+20297,60490,60491,N,N,N,29499,17003,14957,N,N,29503,60492,60494,N,N,N,N,60495,\r
+N,N,60493,N,N,N,60496,N,60497,60498,60499,N,N,60500,60501,N,N,60502,29504,\r
+29505,60503,60504,29506,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29507,N,N,14388,29508,60505,60506,\r
+60507,29509,N,15407,60508,29510,60509,60510,60511,60512,N,60513,29511,N,N,\r
+29512,29513,N,60514,60515,N,29516,29514,20284,N,29515,60516,20079,60517,N,N,\r
+60518,N,29517,60519,20059,N,N,N,N,60520,29518,18302,N,60521,29519,29521,N,\r
+60522,29522,60523,60524,60525,N,N,60526,60527,60528,N,N,29520,14701,19533,\r
+19299,22135,N,23904,19323,N,N,N,N,12843,N,60529,N,60530,N,N,60531,29524,13648,\r
+29525,29526,29527,N,14709,N,29528,60532,N,N,24660,19547,N,16995,29529,29531,\r
+29530,60533,29532,N,N,N,60534,29533,N,60535,29534,N,N,N,60536,60537,60538,\r
+29535,60539,60540,60541,N,29536,60542,29537,29538,60705,29539,N,29540,29541,\r
+29542,N,60706,60707,60708,N,N,N,29543,29544,60709,N,N,N,N,17700,60710,60711,\r
+60712,60713,14429,60714,29546,60715,60716,N,60717,60718,60719,N,N,N,60720,\r
+16717,29547,60721,N,N,N,60722,N,N,N,60723,60724,29548,N,N,60725,N,60726,60727,\r
+N,60728,N,N,60729,N,60730,60731,18721,60732,60733,29549,60734,N,60735,N,60736,\r
+60737,60738,60739,60740,N,N,29550,25399,N,N,27738,28781,N,N,29551,60741,29552,\r
+60742,60743,60744,60745,N,60746,N,N,60747,60748,29554,29555,29556,20080,29553,\r
+N,N,29557,29558,60749,60750,29560,N,29559,60751,60752,60753,60754,60755,29562,\r
+60756,N,60757,29563,29561,N,N,60758,N,N,60759,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+20022,N,60760,60761,60762,60763,N,60764,29564,60765,60766,N,N,N,N,29565,25428,\r
+60767,N,29566,60768,60769,60770,N,60771,8490,N,8564,8560,8563,8565,N,8522,\r
+8523,8566,8540,8484,N,8485,8511,9008,9009,9010,9011,9012,9013,9014,9015,9016,\r
+9017,8487,8488,8547,8545,8548,8489,8567,9025,9026,9027,9028,9029,9030,9031,\r
+9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,9046,\r
+9047,9048,9049,9050,8526,N,8527,8496,8498,8494,9057,9058,9059,9060,9061,9062,\r
+9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,9076,9077,\r
+9078,9079,9080,9081,9082,8528,8515,8529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8497,\r
+N,8559,\r
+};\r
+\r
+static const struct unim_index jisxcommon_encmap[256] = {\r
+{__jisxcommon_encmap+0,92,255},{__jisxcommon_encmap+164,0,245},{\r
+__jisxcommon_encmap+410,199,221},{__jisxcommon_encmap+433,132,206},{\r
+__jisxcommon_encmap+508,1,95},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{__jisxcommon_encmap+603,16,59},{__jisxcommon_encmap+647,3,212},{\r
+__jisxcommon_encmap+857,0,165},{__jisxcommon_encmap+1023,18,18},{0,0,0},{\r
+__jisxcommon_encmap+1024,0,239},{__jisxcommon_encmap+1264,5,111},{0,0,0},{0,0,\r
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisxcommon_encmap+1371,0,254},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisxcommon_encmap+1626,0,255},{\r
+__jisxcommon_encmap+1882,0,255},{__jisxcommon_encmap+2138,0,254},{\r
+__jisxcommon_encmap+2393,0,254},{__jisxcommon_encmap+2648,0,255},{\r
+__jisxcommon_encmap+2904,0,250},{__jisxcommon_encmap+3155,1,255},{\r
+__jisxcommon_encmap+3410,0,255},{__jisxcommon_encmap+3666,5,255},{\r
+__jisxcommon_encmap+3917,0,255},{__jisxcommon_encmap+4173,0,253},{\r
+__jisxcommon_encmap+4427,2,255},{__jisxcommon_encmap+4681,0,253},{\r
+__jisxcommon_encmap+4935,0,255},{__jisxcommon_encmap+5191,1,253},{\r
+__jisxcommon_encmap+5444,1,254},{__jisxcommon_encmap+5698,0,255},{\r
+__jisxcommon_encmap+5954,1,255},{__jisxcommon_encmap+6209,7,253},{\r
+__jisxcommon_encmap+6456,0,255},{__jisxcommon_encmap+6712,0,255},{\r
+__jisxcommon_encmap+6968,1,250},{__jisxcommon_encmap+7218,6,255},{\r
+__jisxcommon_encmap+7468,0,255},{__jisxcommon_encmap+7724,0,255},{\r
+__jisxcommon_encmap+7980,0,255},{__jisxcommon_encmap+8236,2,253},{\r
+__jisxcommon_encmap+8488,0,255},{__jisxcommon_encmap+8744,0,253},{\r
+__jisxcommon_encmap+8998,2,255},{__jisxcommon_encmap+9252,2,244},{\r
+__jisxcommon_encmap+9495,4,252},{__jisxcommon_encmap+9744,0,255},{\r
+__jisxcommon_encmap+10000,1,254},{__jisxcommon_encmap+10254,0,253},{\r
+__jisxcommon_encmap+10508,3,255},{__jisxcommon_encmap+10761,0,254},{\r
+__jisxcommon_encmap+11016,2,255},{__jisxcommon_encmap+11270,0,255},{\r
+__jisxcommon_encmap+11526,3,255},{__jisxcommon_encmap+11779,0,254},{\r
+__jisxcommon_encmap+12034,0,252},{__jisxcommon_encmap+12287,2,255},{\r
+__jisxcommon_encmap+12541,0,252},{__jisxcommon_encmap+12794,0,255},{\r
+__jisxcommon_encmap+13050,2,254},{__jisxcommon_encmap+13303,0,254},{\r
+__jisxcommon_encmap+13558,0,251},{__jisxcommon_encmap+13810,0,158},{\r
+__jisxcommon_encmap+13969,54,255},{__jisxcommon_encmap+14171,0,254},{\r
+__jisxcommon_encmap+14426,2,255},{__jisxcommon_encmap+14680,0,254},{\r
+__jisxcommon_encmap+14935,0,253},{__jisxcommon_encmap+15189,1,255},{\r
+__jisxcommon_encmap+15444,0,255},{__jisxcommon_encmap+15700,0,254},{\r
+__jisxcommon_encmap+15955,0,255},{__jisxcommon_encmap+16211,1,254},{\r
+__jisxcommon_encmap+16465,1,255},{__jisxcommon_encmap+16720,0,255},{\r
+__jisxcommon_encmap+16976,0,159},{__jisxcommon_encmap+17136,55,255},{\r
+__jisxcommon_encmap+17337,1,255},{__jisxcommon_encmap+17592,1,254},{\r
+__jisxcommon_encmap+17846,0,254},{__jisxcommon_encmap+18101,0,255},{\r
+__jisxcommon_encmap+18357,0,255},{__jisxcommon_encmap+18613,0,255},{\r
+__jisxcommon_encmap+18869,0,253},{__jisxcommon_encmap+19123,1,132},{\r
+__jisxcommon_encmap+19255,119,230},{__jisxcommon_encmap+19367,28,251},{\r
+__jisxcommon_encmap+19591,0,255},{__jisxcommon_encmap+19847,1,254},{\r
+__jisxcommon_encmap+20101,2,255},{__jisxcommon_encmap+20355,1,255},{\r
+__jisxcommon_encmap+20610,0,255},{__jisxcommon_encmap+20866,0,249},{\r
+__jisxcommon_encmap+21116,2,254},{__jisxcommon_encmap+21369,2,255},{\r
+__jisxcommon_encmap+21623,2,165},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,\r
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{__jisxcommon_encmap+21787,1,229},\r
+};\r
+\r
+static const ucs2_t __cp932ext_decmap[969] = {\r
+65340,65374,8741,65372,8230,8229,8216,8217,8220,8221,65288,65289,12308,12309,\r
+65339,65341,65371,65373,12296,12297,12298,12299,12300,12301,12302,12303,12304,\r
+12305,65291,65293,177,215,U,247,65309,8800,65308,65310,8806,8807,8734,8756,\r
+9794,9792,176,8242,8243,8451,65509,65284,65504,65505,65285,65283,65286,65290,\r
+65312,167,9734,9733,9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,\r
+8251,12306,8594,8592,8593,8595,12307,U,U,U,U,U,U,U,U,U,U,U,8712,8715,8838,\r
+8839,8834,8835,8746,8745,U,U,U,U,U,U,U,U,8743,8744,65506,9312,9313,9314,9315,\r
+9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,\r
+9331,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,U,13129,13076,13090,\r
+13133,13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,\r
+13212,13213,13214,13198,13199,13252,13217,U,U,U,U,U,U,U,U,13179,U,12317,12319,\r
+8470,13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,\r
+13180,8786,8801,8747,8750,8721,8730,8869,8736,8735,8895,8757,8745,8746,32394,\r
+35100,37704,37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,\r
+20220,20224,20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,\r
+20510,20550,20592,20546,20628,20724,20696,20810,20836,20893,20926,20972,21013,\r
+21148,21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,\r
+21642,21673,21759,21894,22361,22373,22444,22472,22471,64015,U,64016,22686,\r
+22706,22795,22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,\r
+23582,23718,23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,\r
+24372,24423,24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,\r
+24880,24984,25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,\r
+26158,26142,26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,\r
+26382,63785,26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,\r
+27106,27184,27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,\r
+27866,27908,28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,\r
+28220,28351,28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,\r
+28998,28999,64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,\r
+29667,29650,29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,\r
+30338,30364,30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,\r
+64024,64025,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,\r
+32092,32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,\r
+33864,33972,34131,34137,U,34155,64031,34224,64032,64033,34823,35061,35346,\r
+35383,35449,35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,\r
+64035,36559,64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,\r
+37358,37348,37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,\r
+37479,37543,37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,\r
+37665,37627,64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,\r
+37937,37957,37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,\r
+38737,38741,38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,\r
+39794,39823,39857,39867,39936,40304,40299,64045,40473,40657,U,U,8560,8561,\r
+8562,8563,8564,8565,8566,8567,8568,8569,65506,65508,65287,65282,8560,8561,\r
+8562,8563,8564,8565,8566,8567,8568,8569,8544,8545,8546,8547,8548,8549,8550,\r
+8551,8552,8553,65506,65508,65287,65282,12849,8470,8481,8757,32394,35100,37704,\r
+37512,34012,20425,28859,26161,26824,37625,26363,24389,20008,20193,20220,20224,\r
+20227,20281,20310,20370,20362,20378,20372,20429,20544,20514,20479,20510,20550,\r
+20592,20546,20628,20724,20696,20810,U,20836,20893,20926,20972,21013,21148,\r
+21158,21184,21211,21248,21255,21284,21362,21395,21426,21469,64014,21660,21642,\r
+21673,21759,21894,22361,22373,22444,22472,22471,64015,64016,22686,22706,22795,\r
+22867,22875,22877,22883,22948,22970,23382,23488,29999,23512,23532,23582,23718,\r
+23738,23797,23847,23891,64017,23874,23917,23992,23993,24016,24353,24372,24423,\r
+24503,24542,24669,24709,24714,24798,24789,24864,24818,24849,24887,24880,24984,\r
+25107,25254,25589,25696,25757,25806,25934,26112,26133,26171,26121,26158,26142,\r
+26148,26213,26199,26201,64018,26227,26265,26272,26290,26303,26362,26382,63785,\r
+26470,26555,26706,26560,26625,26692,26831,64019,26984,64020,27032,27106,27184,\r
+27243,27206,27251,27262,27362,27364,27606,27711,27740,27782,27759,27866,27908,\r
+28039,28015,28054,28076,28111,28152,28146,28156,28217,28252,28199,28220,28351,\r
+28552,28597,28661,28677,28679,28712,28805,28843,28943,28932,29020,28998,28999,\r
+64021,29121,29182,29361,29374,29476,64022,29559,29629,29641,29654,29667,29650,\r
+29703,29685,29734,29738,29737,29742,29794,29833,29855,29953,30063,30338,30364,\r
+30366,30363,30374,64023,30534,21167,30753,30798,30820,30842,31024,64024,64025,\r
+U,64026,31124,64027,31131,31441,31463,64028,31467,31646,64029,32072,32092,\r
+32183,32160,32214,32338,32583,32673,64030,33537,33634,33663,33735,33782,33864,\r
+33972,34131,34137,34155,64031,34224,64032,64033,34823,35061,35346,35383,35449,\r
+35495,35518,35551,64034,35574,35667,35711,36080,36084,36114,36214,64035,36559,\r
+64036,64037,36967,37086,64038,37141,37159,37338,37335,37342,37357,37358,37348,\r
+37349,37382,37392,37386,37434,37440,37436,37454,37465,37457,37433,37479,37543,\r
+37495,37496,37607,37591,37593,37584,64039,37589,37600,37587,37669,37665,37627,\r
+64040,37662,37631,37661,37634,37744,37719,37796,37830,37854,37880,37937,37957,\r
+37960,38290,63964,64041,38557,38575,38707,38715,38723,38733,38735,38737,38741,\r
+38999,39013,64042,64043,39207,64044,39326,39502,39641,39644,39797,39794,39823,\r
+39857,39867,39936,40304,40299,64045,40473,40657,\r
+};\r
+\r
+static const struct dbcs_index cp932ext_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{__cp932ext_decmap+0,95,202},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{__cp932ext_decmap+108,64,156},{0,0,0},{0,0,0},{0,0,0},{0,0,\r
+0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{__cp932ext_decmap+201,64,252},{__cp932ext_decmap+390,64,252},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__cp932ext_decmap+579,64,252},{__cp932ext_decmap+768,64,252},{\r
+__cp932ext_decmap+957,64,75},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __cp932ext_encmap[9686] = {\r
+34690,N,N,N,N,N,N,N,N,N,N,34692,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+34644,34645,34646,34647,34648,34649,34650,34651,34652,34653,N,N,N,N,N,N,61167,\r
+61168,61169,61170,61171,61172,61173,61174,61175,61176,34708,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,34712,N,N,N,N,N,33121,N,N,N,N,N,N,N,N,34707,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,34713,34624,34625,34626,34627,34628,34629,34630,\r
+34631,34632,34633,34634,34635,34636,34637,34638,34639,34640,34641,34642,34643,\r
+34688,N,34689,34698,34699,N,N,N,N,N,N,34700,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,34693,34694,34695,34696,34697,34661,N,N,N,N,N,N,N,N,N,\r
+34665,N,N,N,N,N,N,34656,N,N,N,34659,N,N,N,N,N,N,N,N,N,34657,34667,N,N,34666,\r
+34660,N,N,N,34668,N,N,N,N,N,N,N,N,N,N,34662,N,N,N,N,34670,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,34655,34669,N,N,34658,N,N,N,34663,N,N,N,N,N,34664,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,34686,34703,34702,34701,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,34674,34675,N,N,N,N,N,N,N,N,N,N,N,N,34671,34672,34673,\r
+N,N,34677,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+34676,N,N,N,N,N,N,N,N,34691,60748,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,60749,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60750,\r
+60751,N,N,60752,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60753,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,60754,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60756,N,N,N,N,N,N,N,\r
+60755,N,60758,N,N,N,N,N,60757,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60741,N,N,N,60759,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,60762,60763,N,N,N,60761,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,60760,N,60766,N,N,N,60764,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60765,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60767,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,60769,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,60768,60770,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60771,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,60772,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,60773,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60774,60775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,60776,N,N,N,N,N,N,N,N,N,60777,N,N,N,N,N,N,N,N,61019,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,60778,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60779,\r
+60780,N,N,N,N,N,N,60781,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,60782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60783,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60784,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60785,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60786,60789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60788,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60790,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,60791,60792,60793,N,N,N,N,N,N,N,N,N,N,N,60794,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60795,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60797,60796,60801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,60802,60803,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60804,N,N,N,N,N,N,N,60805,N,60806,N,N,N,N,N,60807,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,60808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60809,60810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60811,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60813,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60814,60815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60816,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,60817,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60818,60819,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60822,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,60820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60823,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60824,60825,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60826,60827,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,60828,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60747,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60829,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60830,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60831,60832,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60833,N,N,\r
+N,N,60834,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,60836,N,N,N,N,N,N,N,N,60835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60838,\r
+60839,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60837,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60841,N,\r
+N,N,N,N,N,60840,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60842,60843,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60844,60845,60846,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,60847,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60848,60849,60850,N,N,N,N,N,\r
+N,N,N,60853,N,N,N,N,N,N,N,N,N,N,N,60851,N,N,N,N,N,N,N,N,60855,N,N,N,N,N,60856,\r
+N,N,N,N,N,N,N,N,N,60854,N,N,60743,N,N,N,N,N,N,N,N,N,60852,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60858,N,60859,N,N,N,N,N,N,N,N,N,N,N,60857,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,60861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,60862,N,N,N,N,N,N,60863,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60864,N,N,N,N,N,N,N,N,N,N,N,N,60865,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,60866,60746,60867,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60870,N,N,N,N,60872,\r
+60873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60874,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,60871,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,60744,N,N,N,N,N,N,60875,60877,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60879,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60880,60881,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60883,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60882,N,N,N,N,N,N,N,60884,N,N,N,N,N,N,N,\r
+N,N,N,60885,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60886,N,60887,60888,\r
+60889,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60890,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,60892,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60891,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,60893,60894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60896,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60895,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,60897,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60898,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60899,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60901,N,N,N,N,N,60900,N,\r
+N,N,60902,60905,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60903,N,N,60906,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60904,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,60907,60908,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60909,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,60910,60911,N,60912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,60913,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60914,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60915,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,60742,60917,N,N,N,N,N,N,N,N,N,N,60916,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,60919,60920,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60918,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60922,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60923,60924,N,N,N,N,N,N,N,N,N,N,N,N,60992,60993,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60995,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60996,N,N,N,N,N,N,N,N,N,N,N,60997,\r
+N,N,N,N,N,N,N,N,61000,N,N,N,60998,N,N,N,N,N,N,N,N,N,N,N,N,60999,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,61002,61001,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,61003,N,N,61005,61004,N,N,N,61006,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61007,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61008,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61009,61010,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60812,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61011,61012,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61015,61013,N,61014,N,N,N,N,N,N,N,61016,61018,\r
+61020,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61021,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61022,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61023,61024,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,61028,N,N,N,N,N,N,61030,61031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,61032,N,N,N,61034,61035,61037,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61038,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61040,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,61039,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61041,61042,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60736,61043,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61044,61046,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61047,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61048,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61049,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61050,61051,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61052,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60740,61053,N,N,N,N,\r
+N,61054,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61056,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,61058,61061,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61062,60737,61063,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61064,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61065,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61066,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,61067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,61068,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61070,\r
+61071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,61072,61073,N,N,N,61074,61075,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,61076,61078,61081,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,61082,61084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61085,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61087,N,N,61086,N,N,N,61088,N,N,N,\r
+N,N,61091,61092,N,N,N,N,N,N,N,61089,61090,61093,N,N,N,61095,N,N,N,N,N,61094,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61102,61096,N,61098,N,N,N,61097,N,N,N,N,N,N,N,N,N,N,N,N,N,61099,N,N,61101,N,N,\r
+N,N,N,N,N,61100,N,N,N,N,N,N,N,N,N,N,N,N,N,61103,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61105,61106,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60739,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61104,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61110,N,N,61114,N,61112,N,61108,N,61109,\r
+N,N,N,N,N,N,61113,N,N,N,N,N,N,61107,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60745,N,\r
+61117,N,N,N,61120,61122,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61121,61119,N,N,61116,N,N,N,61115,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,60738,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61124,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61123,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61125,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61126,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61127,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,61128,61129,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61130,N,N,61131,\r
+61132,61135,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61136,61137,N,N,N,N,N,N,N,61138,\r
+N,N,N,N,N,N,N,61139,N,N,N,N,N,N,N,N,N,61140,N,61141,N,61142,N,N,N,61143,61144,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,61145,61148,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61150,61151,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61152,N,N,61153,61155,N,N,61154,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,61156,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,61157,N,N,N,N,N,N,N,N,N,61158,61159,61161,N,N,N,N,61160,61163,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61164,60868,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61133,60787,60798,60800,60821,60860,60876,60878,\r
+60921,60994,61017,61025,61026,61027,61029,61033,61036,61045,61057,61059,61060,\r
+61069,61077,61079,61080,61083,61111,61118,61134,61146,61147,61149,61162,61180,\r
+N,N,N,N,61179,N,N,N,N,N,33148,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,33119,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,33120,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,33169,\r
+33170,33226,N,61178,\r
+};\r
+\r
+static const struct unim_index cp932ext_encmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp932ext_encmap+0,22,121},{__cp932ext_encmap\r
++100,17,191},{0,0,0},{__cp932ext_encmap+275,96,115},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__cp932ext_encmap+295,29,31},{0,0,0},{__cp932ext_encmap+298,49,168},{\r
+__cp932ext_encmap+418,3,205},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{__cp932ext_encmap+621,40,252},{__cp932ext_encmap+834,0,255},{\r
+__cp932ext_encmap+1090,30,244},{__cp932ext_encmap+1305,74,236},{\r
+__cp932ext_encmap+1468,21,219},{__cp932ext_encmap+1667,0,221},{\r
+__cp932ext_encmap+1889,138,255},{__cp932ext_encmap+2007,134,134},{0,0,0},{\r
+__cp932ext_encmap+2008,89,200},{__cp932ext_encmap+2120,158,178},{\r
+__cp932ext_encmap+2141,11,186},{0,0,0},{__cp932ext_encmap+2317,86,236},{\r
+__cp932ext_encmap+2468,30,245},{__cp932ext_encmap+2684,39,208},{0,0,0},{\r
+__cp932ext_encmap+2854,33,222},{__cp932ext_encmap+3044,93,242},{\r
+__cp932ext_encmap+3194,17,152},{__cp932ext_encmap+3330,19,166},{\r
+__cp932ext_encmap+3478,245,245},{__cp932ext_encmap+3479,96,206},{\r
+__cp932ext_encmap+3590,78,78},{__cp932ext_encmap+3591,0,251},{\r
+__cp932ext_encmap+3843,14,192},{__cp932ext_encmap+4022,1,207},{\r
+__cp932ext_encmap+4229,104,226},{__cp932ext_encmap+4352,48,228},{\r
+__cp932ext_encmap+4533,214,214},{__cp932ext_encmap+4534,63,218},{\r
+__cp932ext_encmap+4690,4,252},{__cp932ext_encmap+4939,39,191},{\r
+__cp932ext_encmap+5092,136,245},{__cp932ext_encmap+5202,5,187},{\r
+__cp932ext_encmap+5385,4,254},{__cp932ext_encmap+5636,177,190},{\r
+__cp932ext_encmap+5650,36,245},{__cp932ext_encmap+5860,7,159},{\r
+__cp932ext_encmap+6013,1,111},{__cp932ext_encmap+6124,130,166},{\r
+__cp932ext_encmap+6161,70,70},{__cp932ext_encmap+6162,33,122},{\r
+__cp932ext_encmap+6252,48,155},{__cp932ext_encmap+6360,209,235},{\r
+__cp932ext_encmap+6387,158,158},{0,0,0},{__cp932ext_encmap+6388,72,214},{\r
+__cp932ext_encmap+6531,82,138},{__cp932ext_encmap+6588,71,161},{0,0,0},{0,0,0\r
+},{0,0,0},{__cp932ext_encmap+6679,1,246},{__cp932ext_encmap+6925,72,220},{\r
+__cp932ext_encmap+7074,83,176},{0,0,0},{0,0,0},{__cp932ext_encmap+7168,7,245},\r
+{__cp932ext_encmap+7407,28,28},{__cp932ext_encmap+7408,18,246},{\r
+__cp932ext_encmap+7637,83,127},{__cp932ext_encmap+7682,240,244},{\r
+__cp932ext_encmap+7687,18,118},{__cp932ext_encmap+7788,207,207},{0,0,0},{\r
+__cp932ext_encmap+7789,103,222},{__cp932ext_encmap+7909,21,238},{\r
+__cp932ext_encmap+8127,6,255},{__cp932ext_encmap+8377,2,248},{\r
+__cp932ext_encmap+8624,49,72},{__cp932ext_encmap+8648,146,146},{\r
+__cp932ext_encmap+8649,157,175},{__cp932ext_encmap+8668,51,85},{\r
+__cp932ext_encmap+8703,87,101},{__cp932ext_encmap+8718,39,158},{\r
+__cp932ext_encmap+8838,78,220},{__cp932ext_encmap+8981,114,187},{\r
+__cp932ext_encmap+9055,0,0},{__cp932ext_encmap+9056,107,112},{\r
+__cp932ext_encmap+9062,25,209},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp932ext_encmap+9247\r
+,41,220},{__cp932ext_encmap+9427,14,45},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__cp932ext_encmap+9459,2,228},\r
+};\r
+\r
+static const ucs2_t __jisx0213_1_bmp_decmap[2197] = {\r
+65287,65282,65293,126,12339,12340,12341,12347,12348,12543,12447,U,U,U,U,U,U,U,\r
+U,8836,8837,8842,8843,8713,8709,8965,8966,U,U,U,U,U,U,U,8853,8854,8855,8741,\r
+8742,10629,10630,12312,12313,12310,12311,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,8802,\r
+8771,8773,8776,8822,8823,8596,U,U,U,U,U,U,U,U,9838,9835,9836,9833,9655,9654,\r
+9665,9664,8599,8600,8598,8601,8644,8680,8678,8679,8681,10548,10549,U,U,U,U,U,\r
+U,U,U,U,U,10687,9673,12349,65094,65093,9702,8226,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,8723,8501,8463,13259,8467,8487,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12448,8211,10746,10747,12363,U,12365,U,12367,U,\r
+12369,U,12371,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12436,12437,\r
+12438,12459,U,12461,U,12463,U,12465,U,12467,U,U,U,U,U,U,U,12475,U,U,U,U,U,U,U,\r
+U,12484,U,U,U,12488,9828,9824,9826,9830,9825,9829,9831,9827,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,962,9461,9462,9463,9464,9465,9466,9467,9468,\r
+9469,9470,9750,9751,12320,9742,9728,9729,9730,9731,9832,9649,12784,12785,\r
+12786,12787,12788,12789,12790,12791,12792,12793,U,12794,12795,12796,12797,\r
+12798,12799,9150,9151,9152,9153,9154,9155,9156,9157,9158,9159,9160,9161,9162,\r
+9163,9164,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+12535,12536,12537,12538,8922,8923,8531,8532,8533,10003,8984,9251,9166,12881,\r
+12882,12883,12884,12885,12886,12887,12888,12889,12890,12891,12892,12893,12894,\r
+12895,12977,12978,12979,12980,12981,12982,12983,12984,12985,12986,12987,12988,\r
+12989,12990,12991,U,U,U,U,U,U,U,U,9680,9681,9682,9683,8252,8263,8264,8265,461,\r
+462,464,7742,7743,504,505,465,466,468,470,472,474,476,8364,160,161,164,166,\r
+169,170,171,173,174,175,178,179,183,184,185,186,187,188,189,190,191,192,193,\r
+194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,\r
+213,214,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,\r
+233,234,235,236,237,238,239,240,241,242,243,244,245,246,248,249,250,251,252,\r
+253,254,255,256,298,362,274,332,257,299,363,275,333,260,728,321,317,346,352,\r
+350,356,377,381,379,261,731,322,318,347,711,353,351,357,378,733,382,380,340,\r
+258,313,262,268,280,282,270,323,327,336,344,366,368,354,341,259,314,263,269,\r
+281,283,271,273,324,328,337,345,367,369,355,729,264,284,292,308,348,364,265,\r
+285,293,309,349,365,625,651,638,643,658,620,622,633,648,598,627,637,642,656,\r
+635,621,607,626,669,654,609,331,624,641,295,661,660,614,664,450,595,599,644,\r
+608,403,339,338,616,649,600,629,601,604,606,592,623,650,612,652,596,593,594,\r
+653,613,674,673,597,657,634,615,602,U,509,8048,8049,U,U,U,U,U,U,U,U,8050,8051,\r
+865,712,716,720,721,774,8255,779,769,772,768,783,780,770,741,742,743,744,745,\r
+U,U,805,812,825,796,799,800,776,829,809,815,734,804,816,828,820,797,798,792,\r
+793,810,826,827,771,794,10102,10103,10104,10105,10106,10107,10108,10109,10110,\r
+10111,9451,9452,9453,9454,9455,9456,9457,9458,9459,9460,8560,8561,8562,8563,\r
+8564,8565,8566,8567,8568,8569,8570,8571,9424,9425,9426,9427,9428,9429,9430,\r
+9431,9432,9433,9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,\r
+9446,9447,9448,9449,13008,13009,13010,13011,13012,13013,13014,13015,13016,\r
+13017,13018,13019,13020,13021,13022,13023,13024,13025,13026,13027,13050,13033,\r
+13029,13037,13036,U,U,U,U,U,U,U,U,U,8273,8258,9312,9313,9314,9315,9316,9317,\r
+9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,8544,\r
+8545,8546,8547,8548,8549,8550,8551,8552,8553,8554,13129,13076,13090,13133,\r
+13080,13095,13059,13110,13137,13143,13069,13094,13091,13099,13130,13115,13212,\r
+13213,13214,13198,13199,13252,13217,8555,U,U,U,U,U,U,U,13179,12317,12319,8470,\r
+13261,8481,12964,12965,12966,12967,12968,12849,12850,12857,13182,13181,13180,\r
+U,U,U,8750,U,U,U,U,8735,8895,U,U,U,10070,9758,20465,U,13314,20008,20015,20016,\r
+20109,20193,20221,20223,20227,20235,20320,20296,20297,20310,20319,20330,20332,\r
+20350,20362,20372,20375,64048,20425,20448,20481,20482,20494,20504,20519,20526,\r
+20544,20539,20545,20628,20684,20722,20688,20710,64049,20742,20739,20747,20766,\r
+20789,20810,64050,20821,20823,13493,20893,20931,20938,20958,20962,20974,20993,\r
+13531,21011,21013,21065,21079,21089,21139,21192,64051,21196,21200,21206,21211,\r
+64052,21232,21243,21248,21255,21276,64053,21345,21347,21373,21395,21405,21426,\r
+21522,21543,21581,21660,21611,21620,21631,21640,21654,21665,21673,21702,21759,\r
+21774,21803,21813,21840,21854,21889,21894,21902,64054,21933,21966,64055,22024,\r
+22030,22075,22089,22134,22118,64056,22127,22129,22130,22169,22174,22185,22188,\r
+22195,22217,22218,22282,U,22305,22319,22323,22324,22384,22391,22396,22428,\r
+64015,U,22456,22471,22472,22479,22500,22509,22517,22518,22527,22537,64016,\r
+22625,22628,64057,22652,22665,22686,64058,22697,U,22738,22734,22740,22746,\r
+22752,22761,22796,34369,22877,22893,22923,22930,22948,22979,22994,23005,23059,\r
+23075,23143,23149,23159,23166,23172,23198,23207,23236,U,23321,23333,21085,\r
+23361,23382,23421,23443,23512,23532,23570,23582,23587,23595,14221,23650,64059,\r
+64060,U,23674,23695,23711,23715,23722,23738,23755,23760,23762,23796,U,14306,\r
+23821,23847,64017,23878,23879,23891,23882,23917,23937,23968,23972,23975,23992,\r
+24011,21534,22099,24034,24084,24088,24152,24158,24254,63784,24267,24313,24320,\r
+24322,24327,24349,24355,24372,24374,24381,24384,24389,24404,24408,24420,24423,\r
+24445,24457,24476,24487,24495,24501,24503,24521,24542,24545,24553,24589,24596,\r
+24600,24627,24629,24647,64061,24733,24734,24779,24788,24789,24797,24824,24860,\r
+24875,24880,24887,64062,24973,64063,25020,25017,64064,25122,25150,25155,25174,\r
+25178,25199,25221,25284,25302,25340,25354,25368,25401,25411,25445,25468,25573,\r
+25581,25589,25616,25620,25634,25721,25681,25696,25709,25806,25790,25791,25796,\r
+25802,25808,25847,25851,25890,25897,64065,25959,26013,64066,26112,26121,26133,\r
+26142,26170,26146,26148,26155,26160,26161,26163,26363,26184,26188,U,26201,\r
+26202,26209,26213,26227,26231,26232,26253,64067,26272,26290,26299,26310,26312,\r
+15138,26331,26344,26362,26387,63785,26419,26470,26439,26440,26491,26497,26515,\r
+26520,26523,26555,26617,26560,26583,26620,26625,26706,26653,26668,26673,26715,\r
+26738,26741,64068,26787,26789,26802,26824,26832,26856,26861,26864,26865,26876,\r
+26890,26953,U,26933,26946,26967,26979,26980,26984,27008,64020,27045,27053,\r
+27087,15286,15299,27106,27113,27114,27125,27126,27151,27157,U,27195,27198,\r
+27205,27216,27222,27227,27243,27251,U,27273,27284,27293,27294,27301,27364,\r
+27367,15375,63773,27419,27422,27436,27445,27462,27478,27488,27493,27495,27511,\r
+27522,27561,27565,63856,27599,27606,27607,27647,27653,27664,27699,27737,27740,\r
+27818,27764,27766,27781,27782,27800,27804,27899,27846,27860,27872,27883,27886,\r
+U,27908,27918,27950,27953,27961,27967,27992,28005,64069,28034,28039,28041,\r
+28052,28074,28076,28095,28100,28118,28122,28123,28125,28156,64070,28212,28228,\r
+28252,28254,28331,28337,28353,28359,28366,28432,28442,64071,28458,28463,28467,\r
+28497,28505,28510,28513,28514,28542,28552,28556,28557,28564,28576,28583,28598,\r
+28604,28615,28618,28665,28656,28661,28677,28678,28712,28746,28765,28766,28750,\r
+28772,28789,28805,28836,28843,28855,28884,28888,28900,28943,28971,28958,28960,\r
+28974,28976,28998,28999,29009,64072,29010,29020,29024,29032,64021,29061,29063,\r
+29074,29121,29114,29124,29182,29184,29205,29269,29270,15935,29325,29339,29374,\r
+29376,29435,U,29479,29480,64022,29520,29542,29564,29589,29599,29600,29602,\r
+29606,29611,29641,29647,29654,29657,29667,29673,29703,29706,29722,29723,64074,\r
+29734,29736,29738,29739,29740,29742,29743,29744,29764,29766,29767,29771,29783,\r
+29794,29803,29805,29830,29831,29833,29848,29852,29855,29859,29840,29862,29864,\r
+29865,29877,29887,29896,29897,29914,29951,29953,29975,29999,30063,30073,30098,\r
+16242,30158,30180,30208,30210,30216,30229,30230,30233,30238,30253,30261,30275,\r
+30283,30308,30309,30317,30319,30321,30337,30363,30365,30366,30374,30378,30390,\r
+30405,30412,30414,30420,30438,30449,30460,30474,30489,30516,30518,30534,30541,\r
+30542,30556,30559,30562,30586,30592,30612,30634,30688,30765,30787,30798,30799,\r
+30801,30824,30830,64075,30896,U,30893,30948,30962,30976,30967,31004,31022,\r
+31025,31028,64076,64077,31045,31046,64078,64079,64080,31068,64081,64025,64026,\r
+31097,64082,64083,64027,31128,31153,31160,31176,31178,U,31188,31198,31211,\r
+31213,31235,64084,31289,31325,31341,64085,31365,31392,U,31411,31419,31438,\r
+31467,31485,31506,31533,31547,31559,31566,31584,31597,31599,31602,31646,64086,\r
+31703,31705,31745,31793,31774,31776,31795,31798,16996,U,31833,31853,31865,\r
+31887,31892,31904,31932,31957,31961,31965,32007,32008,32019,32029,32035,32049,\r
+32065,32072,32083,32092,32122,32131,32139,32160,32166,32194,32204,32214,32227,\r
+64087,32296,32264,32273,32277,64089,32327,32338,32353,32394,32397,32583,64090,\r
+32657,32663,32703,32718,32731,32735,32748,32750,32762,64091,32788,32806,32821,\r
+32823,32828,32970,32983,32992,33011,33048,33098,33120,33127,33128,33133,33211,\r
+33226,33231,33239,64092,17491,17499,33376,33396,U,33422,33441,33443,33444,\r
+33449,33454,33463,33470,33471,33478,33493,33533,33534,33536,33537,33634,33570,\r
+33581,33594,33603,33607,33617,33621,33661,33670,33682,33688,33703,33705,33727,\r
+33728,33735,33743,33745,33761,33770,33793,33798,33802,64095,33864,33887,33904,\r
+33907,33925,33950,33967,33972,33978,33984,33986,U,34098,34078,34083,34095,\r
+34137,34148,64031,34221,34170,34188,34191,34210,34224,34251,34254,34285,34322,\r
+34303,34308,34309,34320,U,34328,34345,34360,34391,34395,63798,34402,17821,\r
+34412,34421,34456,34488,34554,34556,34557,34571,34673,34695,34696,34732,34733,\r
+34741,17898,34774,34796,34822,34826,34832,34836,34847,34968,34986,35018,35022,\r
+U,35061,35100,64096,35096,35097,35098,35111,35120,35122,35129,35136,35220,\r
+64097,35284,35301,35318,35346,35349,35362,35383,35399,35406,35421,35425,35445,\r
+35449,35495,35536,35551,35572,35574,64034,64098,64099,35654,35668,35673,35689,\r
+35741,35913,35944,64100,36065,36084,36088,36094,64101,36114,36123,36271,36302,\r
+36305,36311,36384,36387,36413,36464,36475,U,36544,18500,36602,36638,36653,\r
+36662,36692,U,36774,36789,36836,36840,36846,36872,36909,64103,37000,37013,\r
+37015,37017,37019,37026,37043,37054,37060,37061,37063,37079,37085,37086,37103,\r
+37108,64038,37140,37141,37142,37154,37155,37159,37167,37169,37172,37181,37192,\r
+37211,37251,37278,37292,37297,37308,37335,37371,37348,37349,37357,37361,37383,\r
+37392,37432,37433,37434,37436,37440,37443,37455,37496,37512,37570,37579,37580,\r
+37587,37600,37631,37636,37663,37665,37669,37704,37705,37706,37732,37733,37738,\r
+37744,37787,37795,37818,37830,37854,37855,37892,37885,37939,37962,37987,37995,\r
+38001,38002,38286,38303,38310,38313,38316,38326,38333,38347,38352,38355,18864,\r
+38362,38366,38488,38532,63964,38557,38564,38565,38610,38622,64104,38633,38639,\r
+38707,38715,38733,38734,38735,38746,38766,38771,38805,38830,38842,38849,38857,\r
+38878,38875,38900,64105,38922,38942,38955,38960,64106,38994,38995,38998,38999,\r
+39001,39002,63952,39013,39020,39098,39112,39143,39256,39326,39426,39427,39460,\r
+39469,39470,39480,39498,39502,39506,39606,39617,39619,39630,39638,39673,39682,\r
+39688,39712,19479,39725,39774,39801,39782,39794,39797,39812,39818,39823,39838,\r
+39847,39873,39886,39909,39928,39933,39936,39971,40001,40015,40016,40019,40035,\r
+40037,40055,40221,40222,40259,40263,40274,40291,40304,40316,40330,40342,40384,\r
+40364,40380,40407,U,40423,40455,40469,40572,40606,40612,40620,40623,40628,\r
+40629,40643,40657,40720,40761,40791,40848,40852,40855,40866,23032,23643,24183,\r
+30246,32363,\r
+};\r
+\r
+static const struct dbcs_index jisx0213_1_bmp_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_1_bmp_decmap+0,47,125},{\r
+__jisx0213_1_bmp_decmap+79,33,126},{__jisx0213_1_bmp_decmap+173,43,118},{\r
+__jisx0213_1_bmp_decmap+249,43,72},{__jisx0213_1_bmp_decmap+279,57,126},{\r
+__jisx0213_1_bmp_decmap+349,66,126},{__jisx0213_1_bmp_decmap+410,65,124},{\r
+__jisx0213_1_bmp_decmap+470,33,126},{__jisx0213_1_bmp_decmap+564,33,126},{\r
+__jisx0213_1_bmp_decmap+658,33,126},{__jisx0213_1_bmp_decmap+752,33,126},{\r
+__jisx0213_1_bmp_decmap+846,33,126},{__jisx0213_1_bmp_decmap+940,33,126},{\r
+__jisx0213_1_bmp_decmap+1034,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_1_bmp_decmap+\r
+1128,85,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0213_1_bmp_decmap+1170,39,126},{__jisx0213_1_bmp_decmap+1258,33,126},{\r
+__jisx0213_1_bmp_decmap+1352,33,126},{__jisx0213_1_bmp_decmap+1446,33,126},{\r
+__jisx0213_1_bmp_decmap+1540,33,125},{__jisx0213_1_bmp_decmap+1633,33,126},{\r
+__jisx0213_1_bmp_decmap+1727,33,126},{__jisx0213_1_bmp_decmap+1821,33,126},{\r
+__jisx0213_1_bmp_decmap+1915,33,126},{__jisx0213_1_bmp_decmap+2009,33,126},{\r
+__jisx0213_1_bmp_decmap+2103,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const ucs2_t __jisx0213_2_bmp_decmap[2425] = {\r
+19970,19983,19986,20009,20011,20014,20032,20039,20040,U,20049,13318,U,20058,\r
+20073,20125,13356,13358,20153,20155,U,20156,20163,20168,20176,20203,20186,\r
+20209,20213,20224,20246,20324,20279,20286,20308,20312,U,20343,20344,20346,\r
+20349,20354,20357,20370,20378,20454,20402,20414,20421,20427,20431,20434,13418,\r
+20466,20480,20496,20499,20508,20510,20514,13416,20546,20550,20558,20563,20567,\r
+20579,20582,20586,20592,20643,20616,20626,20627,20629,20630,20636,20650,U,\r
+20657,20666,20667,20676,20679,20723,U,20686,U,20692,20697,20705,20713,13458,\r
+20744,U,20759,20763,U,20832,U,20851,20867,20875,13500,20888,20899,20909,13511,\r
+20924,U,U,20979,20980,20994,21010,21014,U,21077,21084,21100,21111,21124,21122,\r
+U,21144,U,21156,21158,21167,21178,21179,21194,13599,21201,U,21239,21258,21259,\r
+21284,21301,21310,21314,U,U,21351,21356,21370,21412,21428,U,21431,21440,U,\r
+13661,13662,21461,21466,13667,21492,21493,21589,21540,21544,13678,21571,21602,\r
+21606,21612,21642,21645,21653,21664,21670,21677,21678,21687,21690,21695,21699,\r
+U,21740,21743,21745,21747,21760,21761,21769,21820,21825,13734,21831,21834,\r
+13736,21856,21857,21860,U,21885,21890,21896,21905,13765,21970,U,U,21951,21961,\r
+21964,21969,21981,13786,21986,U,21993,22056,U,22023,22032,22064,22071,13812,\r
+22077,22079,22080,22087,22110,22112,22125,13829,22152,22156,22165,22170,22173,\r
+22184,22189,22194,22213,22221,22239,22248,22262,22263,U,22293,22307,U,22313,U,\r
+22341,22342,22348,22349,U,22376,22383,22387,22388,22389,22395,U,U,22444,22426,\r
+22429,22430,22440,22487,U,22476,U,U,22494,22502,22512,13898,22520,22523,22525,\r
+22532,22558,22560,22567,22578,22585,U,22601,22604,22631,22666,22667,22669,\r
+22671,22672,22676,22685,22698,22705,U,22723,22733,22754,22771,22772,22789,\r
+22790,22795,22797,22804,22820,U,13969,22845,13977,22854,13974,U,22875,22879,U,\r
+22901,22902,22908,22943,22958,22972,22984,22989,23006,23011,23012,23015,23022,\r
+U,U,14031,23052,23053,23063,23079,23085,23125,23141,23162,23179,23196,23199,\r
+23200,23202,23217,23219,23221,23226,23231,23258,23260,23264,23269,23280,23278,\r
+23285,23296,23304,23319,23348,23341,23372,23378,23400,23407,23420,23423,23425,\r
+23428,23446,23468,14177,23488,14178,23502,23510,14188,14187,23537,23549,14197,\r
+23555,23593,23600,U,23647,23651,23655,23656,23657,23664,U,U,23676,U,U,23688,\r
+23690,14273,U,U,23712,23714,23718,23719,U,23725,23733,U,23753,U,U,23814,23824,\r
+23851,23837,23840,23844,23846,23857,23865,23874,14312,23905,23914,14324,23920,\r
+U,14333,23944,14336,23954,23956,23959,23961,23984,23986,23988,U,23993,24017,\r
+24023,24024,24032,U,24036,24041,14383,24064,14390,24082,24085,14400,24095,\r
+24110,24126,24137,14428,24150,14433,24171,24172,24173,24174,U,24229,24234,\r
+24236,24249,24255,24262,24274,24281,U,24317,24328,24334,24348,U,24350,24391,\r
+24419,24434,24446,24463,24482,24484,24504,24516,14586,24519,24523,24530,24531,\r
+24532,24546,24558,24559,24563,24572,14615,24599,24610,24612,14618,24652,24703,\r
+24714,24725,24744,U,24752,24753,24766,24776,24793,24795,24814,24818,24821,\r
+24848,24850,24851,24857,24862,24890,14703,24897,24902,24928,24956,U,24978,\r
+24979,24983,24984,24997,25000,25005,U,25045,25053,25055,25077,U,25109,25123,\r
+25129,25158,25164,25169,25170,25185,25188,25211,25197,25203,25241,25254,25301,\r
+U,25341,25347,25357,25360,U,U,25394,25397,25403,25404,25409,25412,25422,U,\r
+25433,U,U,25452,25476,25497,U,25492,25533,25591,25556,25557,25564,25568,25579,\r
+25580,25586,25609,25630,25637,25641,25647,25690,25691,25693,25715,25725,25735,\r
+25745,25757,25759,25803,25804,25813,25815,U,25828,25829,25855,25860,14958,\r
+25871,25876,25878,14963,25886,25906,25924,25940,25963,25978,25985,25988,25989,\r
+25994,26034,26037,26040,26047,26050,26057,26068,15062,26098,26105,26108,26116,\r
+26120,26145,26154,26181,26193,26190,15082,U,26199,26203,26211,U,U,26218,26219,\r
+26220,26221,26235,26240,26256,26258,26265,15118,26285,26289,26293,15130,26303,\r
+15132,26348,15063,26369,26373,26386,U,26393,U,U,26444,26445,26452,26461,U,U,U,\r
+26484,26486,U,26514,U,33635,26640,26544,26546,26563,26568,26578,26585,26587,\r
+26608,26615,U,U,U,26648,26655,26669,U,26675,26683,26686,26692,26693,26697,\r
+26700,26709,26711,15223,26731,26734,26746,26748,26754,26768,26774,15213,26776,\r
+26777,26778,26780,26794,26795,26804,26811,26875,U,U,64019,26819,26821,26828,\r
+26831,26838,26841,26852,26853,26860,26871,26883,26887,15239,15240,U,26939,\r
+15245,26950,26985,26988,26994,27002,27007,27026,15268,27030,27032,27046,27056,\r
+27063,27066,27068,27072,27089,27094,U,U,27184,U,U,27107,27118,27119,27123,\r
+15309,27124,27134,27153,27162,27165,U,27186,27187,27188,27199,27206,27209,\r
+27258,27214,27218,27236,U,27262,27267,27275,15344,27281,27295,27297,U,27307,\r
+27325,27334,27348,27344,27356,27357,U,U,27372,27377,27378,27379,27389,U,27403,\r
+27407,27408,27409,U,27415,15398,27439,27466,27480,27500,27509,27514,27521,\r
+27547,27566,U,27581,27582,27591,27592,27593,27610,27622,27623,27630,27633,\r
+27650,27658,27662,27701,27702,27706,U,27711,27725,27739,27757,27780,27785,\r
+15555,27796,27797,27799,27821,27842,27856,15570,27862,27866,27868,27881,27884,\r
+27885,U,27904,27914,27940,27942,27943,27751,27951,27964,27995,27998,28000,\r
+28016,28032,28033,28042,28045,28049,28056,U,28183,U,U,U,28075,28078,28084,\r
+28098,27956,28104,28110,28111,28112,28127,28137,28150,28214,28190,28194,28199,\r
+15633,28210,28220,28232,28233,28235,28236,28239,28241,28243,28244,28247,28259,\r
+15646,28307,28327,28340,28351,28355,28362,28377,28469,28395,28409,28411,28426,\r
+28428,28440,28453,28470,28476,U,28498,28503,28506,28512,28520,28568,28541,\r
+28560,28566,28606,28575,28581,28591,15716,28597,28616,28617,28634,28638,28649,\r
+U,28668,28672,28679,28682,28707,U,28729,28730,28732,28739,28743,28747,15770,\r
+28756,28773,28777,28780,28782,28790,28798,28801,28806,28821,28823,28859,U,\r
+28831,28849,U,28908,28874,28881,28883,28892,28931,28932,28934,28935,28936,\r
+28940,15808,28975,28977,29008,29002,29011,29022,15828,29078,29056,29083,29088,\r
+29090,29102,29103,29107,U,29131,29139,29145,29148,29191,15877,64073,29227,\r
+29236,29240,29241,20012,29250,29267,29271,29283,U,29294,29295,29304,29311,\r
+29326,U,29357,29358,29360,29361,29377,15968,29388,15974,15976,29427,29434,\r
+29447,29458,29464,29465,16003,29497,29484,29489,29491,29501,29522,16020,29547,\r
+29548,U,29550,29551,29553,29559,29569,29573,29578,29588,29592,29596,29598,\r
+29605,29608,29621,29623,29625,29628,29631,29637,29643,29665,29671,29689,29715,\r
+29690,29697,29732,29745,29753,29779,29760,29763,29773,29778,29789,29809,29825,\r
+29829,29832,U,29842,29847,29849,29856,29857,29861,29866,29867,29881,29883,\r
+29882,29910,29912,29918,29935,29931,U,29946,U,29984,29988,29994,16215,U,30013,\r
+30014,30016,30024,30030,30032,30034,30060,30066,30065,30074,30077,30078,30081,\r
+U,30092,16245,30114,16247,30128,30135,30143,30144,30150,30159,30163,30173,\r
+30175,30176,30183,30188,30190,30193,30201,30211,30232,30215,30223,16302,U,\r
+30227,30235,30236,U,30245,30248,30268,30259,U,16329,30273,U,30281,30293,16343,\r
+30318,30357,30364,30369,30368,30375,30376,30383,U,30409,U,30440,30444,U,30487,\r
+30490,30509,30517,16441,U,U,30552,30560,30570,U,30578,30588,30589,U,16472,\r
+30618,30623,30626,30628,30633,30686,30687,30692,30694,30698,30700,16531,30704,\r
+30708,30715,U,30725,30726,30729,30733,30745,30753,30764,30791,30820,30826,U,\r
+30858,30868,30884,30877,30878,30879,30907,30920,30924,30926,30933,30944,30945,\r
+30950,30969,30970,30971,30974,U,30992,31003,31024,31013,31035,31050,31064,\r
+31067,16645,31079,31090,31124,31125,31126,31131,31137,31145,31156,31163,31170,\r
+31175,31180,31181,31190,16712,U,U,16719,31242,31249,31253,31259,31262,16739,\r
+31277,31288,31303,31308,31318,31321,31324,31327,31328,31335,31338,31349,31352,\r
+31362,31370,31376,31395,31404,U,16820,31417,31420,31422,16831,31436,31441,\r
+31463,31464,31476,U,U,31495,U,31549,31527,31530,31534,31535,31537,16870,16883,\r
+31615,31553,16878,31573,31609,31588,31590,31593,31603,U,16903,31632,31633,\r
+31643,16910,31663,31669,31676,31685,31690,U,U,31700,31702,31706,31722,31728,\r
+31747,31755,31758,31759,31782,31813,31818,31825,31831,31838,31841,31849,31854,\r
+31855,31856,U,U,U,31910,U,31926,31927,31935,U,31940,U,31944,31949,U,31959,U,\r
+31974,31979,U,31989,32003,32009,17094,32018,32030,U,U,32061,32062,32064,32071,\r
+U,U,17110,32089,32090,32106,32112,17117,32127,U,32134,32136,32140,32151,U,\r
+32157,32167,32170,32182,32183,32192,32215,32217,32230,32241,32249,17154,U,\r
+64088,32272,32279,32285,32288,32295,32300,32325,32371,32373,32382,32390,32391,\r
+17195,32401,32408,32410,17219,32572,32571,32574,32579,32580,32591,13505,U,\r
+32594,U,32609,32611,32612,32621,32637,32638,U,32656,20859,U,32662,32668,32685,\r
+U,32707,32719,32739,32741,32751,32754,32770,32778,32776,32782,32785,32790,\r
+32804,32812,32816,32835,32870,32881,32885,32891,32921,32924,32932,32935,32952,\r
+U,32965,32981,32984,32998,U,33037,33013,33019,17390,33077,33046,33054,17392,\r
+33060,33063,33068,U,33085,17416,33129,17431,33153,17436,33156,33157,17442,\r
+33176,33202,33217,33219,33238,33243,U,33252,U,33260,U,33277,33279,U,33284,U,\r
+33305,33313,33314,U,33330,33332,33340,33350,33353,33349,U,33355,17526,33359,\r
+17530,33367,U,33372,33379,U,64093,64094,33401,17553,33405,33407,33411,33418,\r
+33427,33447,33448,33458,33460,33466,33468,33506,33512,33527,33543,33544,33548,\r
+33620,33563,33565,33584,33596,33604,33623,17598,33663,17620,17587,33677,33684,\r
+33685,33691,33693,33737,33744,33748,33757,33765,33785,33807,33809,33813,U,\r
+33815,33849,33866,33871,33873,33874,33881,33882,33884,U,33893,33910,33912,\r
+33916,33921,17677,34012,33943,33958,33982,17672,33998,33999,34003,U,34023,\r
+34026,34031,34032,34033,34042,34045,34060,34075,34084,34085,34091,34100,34127,\r
+34159,17701,17731,34110,34129,34131,34142,34145,34146,U,34171,34173,34175,\r
+34177,34182,34195,34205,34207,34231,34236,34247,34250,34264,34265,34271,34273,\r
+34278,34294,34304,34321,34334,34337,34340,34343,U,34361,34364,U,34368,64032,\r
+34387,34390,34415,34423,34426,34439,34441,34445,34449,34460,34461,34472,64033,\r
+34481,34483,34497,34499,34513,34517,34519,34531,34534,17848,34565,34567,34574,\r
+34576,34579,34585,34591,34593,34595,34609,34618,34622,34624,34627,34641,34648,\r
+34660,34661,34674,34684,U,U,34727,34697,34699,34707,34720,U,17893,34750,U,\r
+34753,34766,34805,34783,U,34787,34789,34790,34794,34795,34797,34817,34819,\r
+34827,34835,34856,34862,34866,34876,17935,34890,34904,34911,34916,U,U,34921,U,\r
+34927,34976,35004,35005,35006,35008,35026,U,35025,35027,35035,35056,35057,\r
+17985,35073,U,35127,U,35138,35141,35145,U,18021,35170,35200,35209,35216,35231,\r
+35248,35255,35286,35288,35307,18081,35313,35315,35325,35327,18095,35345,35348,\r
+U,35361,35381,35390,35397,35405,35416,35502,35472,35511,35518,35543,35580,U,\r
+35594,35589,35597,35612,35615,35629,35651,18188,35665,35678,35702,35711,35713,\r
+35723,35732,35733,35740,35742,35897,U,35901,U,U,35909,35911,35919,35924,35927,\r
+35945,35949,35955,U,35987,35986,35993,18276,35995,36004,36054,36053,36057,U,\r
+36080,36081,U,36105,36110,36204,36228,36245,36262,U,36294,36296,36313,36332,\r
+36364,18429,36349,36358,U,36372,36374,36385,36386,36391,U,18454,36406,36409,\r
+36427,36436,36450,36460,36461,36463,36504,36510,36526,36531,36533,36534,36539,\r
+U,36561,36564,18510,36601,U,36608,36616,36631,36651,36672,36682,36696,U,36772,\r
+36788,64102,36790,U,36801,36806,64036,36810,36813,36819,36821,36832,36849,\r
+36853,36859,36866,36876,36919,U,36931,36932,36957,36997,37004,37008,38429,\r
+37025,18613,37040,37046,37059,37064,U,37084,37087,U,37110,37106,37120,37099,\r
+37118,37119,37124,37126,37144,37148,37150,37175,37177,37178,37190,37191,37207,\r
+37209,37217,37220,37236,37241,37253,37262,37288,37294,37299,37302,37315,37316,\r
+37338,U,U,37356,37358,37377,37386,37398,37399,U,37427,37442,37447,37450,37454,\r
+37457,37462,37465,37472,37473,37477,37479,37480,U,U,37500,37501,37503,37513,\r
+37517,37527,37529,37535,37543,37547,U,U,37554,37567,37568,37574,37582,37584,\r
+37591,37593,37605,37607,37649,37623,37625,37627,37634,37645,37653,37661,37662,\r
+37671,37673,U,U,37703,37713,37719,37722,37739,37745,37747,37793,U,U,37768,\r
+37771,37775,37790,37877,U,U,37873,37825,37831,37852,37858,37863,37897,37903,\r
+37910,37911,37883,37938,37940,37947,37957,U,U,37997,37999,38264,38265,38278,\r
+38284,38285,U,38315,38324,U,38344,U,U,38444,38451,38452,U,38460,38465,38497,U,\r
+38530,U,38554,U,18919,38569,38575,38579,38586,38589,18938,U,38616,38618,38621,\r
+18948,38676,38691,18985,38710,38721,38727,38741,38743,38747,38762,U,U,38806,\r
+38810,38814,38818,38833,38834,38846,38860,38865,38868,38872,38873,38881,38897,\r
+38916,38925,38926,38932,38934,19132,U,38947,38962,38963,38949,38983,39014,\r
+39083,39085,39088,U,39095,39096,39099,39100,39103,39106,39111,39115,39136,U,\r
+39137,39139,39141,39146,39152,39153,39155,39176,19259,U,39190,39191,U,39194,\r
+39195,39196,U,39217,39218,39219,39226,39227,39228,39232,39233,39238,39245,\r
+39246,39260,39263,39264,39331,39334,39353,39357,39359,39363,39369,39380,39385,\r
+39390,U,39408,39417,39420,39434,39441,39446,39450,39456,39473,39478,39492,\r
+39500,39512,19394,39599,19402,39607,19410,39609,U,39622,39632,39634,39637,\r
+19432,39644,39648,39653,39657,39683,39692,39696,39698,39702,39708,39723,39731,\r
+39741,19488,39755,39779,39781,39787,39788,39795,39798,39799,39846,39852,39857,\r
+U,U,39858,39864,39870,39879,39923,39896,39901,39911,39914,39915,39919,39918,U,\r
+39930,U,39927,U,39958,39960,39961,39962,39965,39970,39975,39977,39978,U,39985,\r
+39990,39991,40005,40028,U,40009,40010,U,40020,40024,40027,40029,40031,40041,\r
+40042,40043,40045,40046,40048,40050,40053,40058,40166,40178,40203,40194,U,\r
+40209,40215,40216,U,19652,U,40242,19665,40258,40266,40287,40290,U,40297,40299,\r
+U,40307,40310,40311,40318,40324,40333,40345,40353,40383,40373,40377,40381,\r
+40387,40391,40393,40406,40410,40415,40416,40419,40436,19719,40458,40450,40461,\r
+40473,40476,40477,40571,U,40576,40581,40603,40616,U,40637,U,40671,40679,40686,\r
+40703,40706,19831,40707,40727,40729,40751,40759,40762,40765,40769,40773,40774,\r
+40787,40789,40792,U,40797,U,40809,U,40813,40816,40821,\r
+};\r
+\r
+static const struct dbcs_index jisx0213_2_bmp_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_2_bmp_decmap+0,34,126},{0,0,0},{\r
+__jisx0213_2_bmp_decmap+93,33,126},{__jisx0213_2_bmp_decmap+187,33,126},{\r
+__jisx0213_2_bmp_decmap+281,33,125},{0,0,0},{0,0,0},{__jisx0213_2_bmp_decmap+\r
+374,33,126},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_2_bmp_decmap+468,33,126},{\r
+__jisx0213_2_bmp_decmap+562,33,126},{__jisx0213_2_bmp_decmap+656,33,126},{\r
+__jisx0213_2_bmp_decmap+750,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0213_2_bmp_decmap+844,33,126},{__jisx0213_2_bmp_decmap+938,33,126},{\r
+__jisx0213_2_bmp_decmap+1032,33,126},{__jisx0213_2_bmp_decmap+1126,33,126},{\r
+__jisx0213_2_bmp_decmap+1220,34,126},{__jisx0213_2_bmp_decmap+1313,33,126},{\r
+__jisx0213_2_bmp_decmap+1407,33,126},{__jisx0213_2_bmp_decmap+1501,33,126},{\r
+__jisx0213_2_bmp_decmap+1595,33,125},{__jisx0213_2_bmp_decmap+1688,35,126},{\r
+__jisx0213_2_bmp_decmap+1780,33,126},{__jisx0213_2_bmp_decmap+1874,33,125},{\r
+__jisx0213_2_bmp_decmap+1967,34,125},{__jisx0213_2_bmp_decmap+2059,34,126},{\r
+__jisx0213_2_bmp_decmap+2152,33,126},{__jisx0213_2_bmp_decmap+2246,33,126},{\r
+__jisx0213_2_bmp_decmap+2340,33,117},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __jisx0213_bmp_encmap[27287] = {\r
+8754,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10530,\r
+10531,N,N,10532,N,10533,N,N,10534,10535,10536,N,10537,10538,10539,N,N,10540,\r
+10541,N,N,N,10542,10543,10544,10545,10546,10547,10548,10549,10550,10551,10552,\r
+10553,10554,10555,10556,10557,10558,10559,10560,10561,10562,10563,10564,10565,\r
+10566,10567,10568,10569,10570,10571,10572,10573,N,10574,10575,10576,10577,\r
+10578,10579,10580,10581,10582,10583,10584,10585,10586,10587,M,10589,10590,\r
+10591,10592,10593,10594,10595,10596,10597,10598,10599,10600,10601,10602,10603,\r
+10604,N,10605,10606,10607,10608,10609,10610,10611,10612,10613,10618,10810,\r
+10825,10785,10796,10812,10827,10841,10847,N,N,10813,10828,10816,10831,N,10832,\r
+10616,10621,N,N,N,N,10814,10829,10815,10830,10842,10848,N,N,N,N,N,N,10843,\r
+10849,N,10877,N,N,10614,10619,N,N,N,N,N,N,N,N,10844,10850,N,N,N,10811,10826,N,\r
+N,10788,10799,N,N,10787,10798,10817,10833,N,N,10818,10834,N,N,10874,10617,\r
+10622,N,N,10819,10835,11051,11050,10809,10824,N,N,10820,10836,10789,10800,\r
+10845,10851,10791,10803,10790,10802,10823,10839,10792,10804,N,N,N,N,10615,\r
+10620,10846,10852,10821,10837,10822,10838,N,N,N,N,N,N,N,10793,10805,10795,\r
+10808,10794,10807,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11049,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+11044,N,N,N,N,N,N,N,N,N,N,10351,10352,N,10353,10358,10359,N,10360,N,10361,N,\r
+10362,N,10363,N,10364,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+10356,10357,N,N,N,11077,11059,11065,11066,11045,M,11071,10862,11046,11054,M,M,\r
+N,11057,N,11058,10869,11048,10873,N,N,11062,11068,11042,11074,11052,N,N,N,\r
+10858,10868,10859,11060,10875,10853,10870,10863,N,11055,N,N,N,10860,11073,\r
+10867,N,10864,10855,N,N,10876,10865,10856,11047,N,N,N,10861,11053,11061,10854,\r
+M,11067,10872,N,10866,11072,10857,N,11041,10878,N,N,11043,N,N,N,N,10871,N,N,N,\r
+11070,11069,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,10801,11091,N,N,N,11092,N,N,N,11093,11094,N,N,N,N,N,N,10786,10840,N,\r
+10797,N,10806,11121,N,N,N,N,N,N,M,11105,11106,11107,M,11100,11098,11103,11133,\r
+11099,N,11095,N,11117,N,N,11097,11102,N,N,11101,N,N,N,N,N,N,N,N,11128,11129,\r
+11134,N,11114,11126,11127,11115,11116,N,N,N,11122,11111,N,N,N,11119,11130,N,\r
+11112,N,N,11120,11123,N,N,N,11125,N,N,N,N,11113,11131,11132,11124,11118,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11090,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,9817,10354,10355,11078,11079,11088,11089,9084,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,9024,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,10347,N,N,11096,N,N,11390,N,N,N,N,10348,10349,10350,N,N,N,N,N,N,N,11389,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,10529,9053,N,N,N,9055,N,N,11618,N,N,N,N,N,N,N,N,N,N,11620,\r
+N,N,N,N,N,9056,N,N,N,N,N,N,N,N,N,N,N,N,N,9052,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,10104,10105,10106,N,N,N,N,N,N,N,N,N,N,11573,11574,\r
+11575,11576,11577,11578,11579,11580,11581,11582,11583,11607,N,N,N,N,11317,\r
+11318,11319,11320,11321,11322,11323,11324,11325,11326,11327,11328,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8817,N,8999,8997,8998,9000,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,9001,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,9003,9004,\r
+9002,9005,8775,N,N,N,8774,N,N,N,N,N,N,N,N,N,9051,N,N,N,N,N,N,N,N,N,N,N,11640,\r
+N,N,N,N,N,8788,8789,N,N,N,N,N,N,N,11635,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,8812,N,8813,N,N,8814,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8811,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8815,8816,N,N,N,N,N,N,N,N,N,N,N,N,8770,\r
+8771,N,N,N,N,8772,8773,N,N,N,N,N,N,N,N,N,8785,8786,8787,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11641,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10102,10103,8776,8777,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,10108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10050,10051,10052,10053,10054,10055,\r
+10056,10057,10058,10059,10060,10061,10062,10063,10064,N,10110,10109,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11553,11554,11555,11556,11557,11558,11559,\r
+11560,11561,11562,11563,11564,11565,11566,11567,11568,11569,11570,11571,11572,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,11329,11330,11331,11332,11333,11334,11335,11336,\r
+11337,11338,11339,11340,11341,11342,11343,11344,11345,11346,11347,11348,11349,\r
+11350,11351,11352,11353,11354,N,11307,11308,11309,11310,11311,11312,11313,\r
+11314,11315,11316,9818,9819,9820,9821,9822,9823,9824,9825,9826,9827,9837,N,N,\r
+N,N,8994,8993,N,N,N,N,N,N,N,N,8996,8995,N,N,N,N,N,N,N,9019,N,N,N,N,N,N,10343,\r
+10344,10345,10346,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,9023,9832,9833,9834,\r
+9835,N,N,N,N,N,N,N,N,N,N,9831,N,N,N,N,N,N,N,9828,9829,N,N,N,N,N,N,11646,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,9786,9789,9787,9792,9785,9790,\r
+9788,9791,9836,8829,N,8827,8828,N,8826,10107,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,11645,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,11297,11298,11299,11300,11301,11302,11303,11304,11305,11306,9006,\r
+9007,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,8790,8791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,9018,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,9085,9086,8794,8795,8792,8793,N,N,N,11616,N,11617,9830,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8755,8756,8757,N,N,N,N,N,8758,8759,9020,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,M,N,M,N,M,N,M,N,M,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,9332,9333,9334,N,N,N,N,N,N,N,N,8761,9083,N,N,N,N,N,N,N,N,N,N,M,N,M,\r
+N,M,N,M,N,M,N,N,N,N,N,N,N,M,N,N,N,N,N,N,N,N,M,N,N,N,M,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10098,\r
+10099,10100,10101,N,N,N,N,8760,9838,9839,9840,9841,9842,9843,9844,M,9846,9847,\r
+9849,9850,9851,9852,9853,9854,11626,11627,N,N,N,N,N,N,11628,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,10305,10306,10307,10308,10309,10310,10311,10312,\r
+10313,10314,10315,10316,10317,10318,10319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,11621,11622,11623,11624,11625,N,N,N,N,N,N,N,N,10320,\r
+10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,10331,10332,10333,\r
+10334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11355,11356,11357,11358,11359,11360,\r
+11361,11362,11363,11364,11365,11366,11367,11368,11369,11370,11371,11372,11373,\r
+11374,N,11377,N,N,N,11376,N,N,11379,11378,N,N,N,N,N,N,N,N,N,N,N,N,11375,11590,\r
+N,N,N,N,N,N,N,N,N,11594,N,N,N,N,N,N,11585,N,N,N,11588,N,N,N,N,N,N,N,N,N,11586,\r
+11596,N,N,11595,11589,N,N,N,11597,N,N,N,N,N,N,N,N,N,N,11591,N,N,N,N,11599,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,11584,11598,N,N,11587,N,N,N,11592,N,N,N,N,N,11593,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11615,11631,\r
+11630,11629,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11603,11604,N,N,N,N,N,N,N,N,N,N,N,N,\r
+11600,11601,11602,N,N,11606,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,11605,N,N,N,N,N,N,9054,N,11619,11811,N,N,N,41261,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41266,N,41267,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41310,N,41302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41342,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11859,N,N,N,N,N,N,41771,N,N,N,N,\r
+62568,N,N,N,N,N,41775,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11867,41800,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41821,41822,N,N,N,N,41825,N,N,N,N,N,N,N,\r
+N,N,N,41831,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42019,N,42022,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,42040,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42050,42058,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42105,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42303,N,N,N,N,42307,N,N,42305,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,42327,43043,43045,N,N,N,N,N,N,N,N,43049,43048,N,N,N,N,N,\r
+N,N,N,43052,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20319,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,43070,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,20335,N,N,N,N,N,43094,N,N,N,N,N,N,N,N,N,N,N,43097,N,N,N,N,N,N,N,N,43100,\r
+43102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,43119,N,N,N,N,N,N,43121,N,N,N,N,N,N,N,N,N,43124,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43129,N,N,N,N,43131,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44091,44102,N,N,44106,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44128,44379,N,N,N,N,44383,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44401,44598,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44412,44590,N,N,N,N,N,N,N,N,N,\r
+N,N,44594,N,44596,N,N,N,N,N,30025,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,44653,N,N,N,N,N,N,N,N,N,44645,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,44840,44841,N,N,N,N,44844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44852,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30078,N,N,N,N,N,N,N,N,N,N,N,N,30241,N,\r
+N,N,N,N,N,N,N,N,44872,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44893,30266,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44919,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+60987,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60994,61041,N,N,N,N,N,N,N,N,N,N,N,N,61054,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61248,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,61268,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61296,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61303,61480,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30566,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,61503,N,N,N,N,N,61505,N,61506,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,61513,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61520,61748,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30797,N,N,61766,N,61768,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,61788,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,61799,N,N,N,N,N,N,N,N,N,N,N,N,N,61804,61986,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61997,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+62009,62052,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62068,N,N,N,\r
+N,N,N,62071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62077,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62259,N,N,N,N,N,N,\r
+N,N,N,N,62263,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,62279,N,N,N,N,N,N,N,62283,N,N,N,N,62280,62291,N,N,N,N,N,N,62295,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,31085,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62507,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,62518,N,N,N,N,N,N,62523,62542,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62557,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,62561,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62782,N,62786,62792,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,62794,N,N,N,N,62796,N,N,N,N,N,62799,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+31321,N,N,N,N,N,N,N,31322,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+62828,N,N,N,62830,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62839,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63029,N,N,N,N,N,N,N,N,\r
+N,N,63026,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63028,63065,N,N,N,N,63060,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63085,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63086,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31569,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63340,N,N,N,N,31584,\r
+63524,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,63546,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,63555,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63566,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,63571,63595,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63785,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63807,63817,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+31819,N,N,N,N,N,N,N,N,N,63836,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64039,32088,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64362,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64368,64373,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,64376,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64567,64597,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64806,N,N,N,N,N,N,N,64808,N,N,N,\r
+N,N,N,N,64810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64817,32318,N,N,N,N,N,\r
+N,N,N,64831,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,65066,N,N,N,N,N,N,N,N,N,N,N,N,65069,65099,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65120,41250,N,N,N,N,N,\r
+N,N,N,N,N,N,N,41251,N,N,41252,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11812,\r
+41253,N,41254,61486,N,41255,11813,11814,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41256,N,\r
+N,N,N,N,N,41257,41258,N,N,N,N,N,N,N,N,41260,N,N,N,N,N,N,N,N,41263,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,41264,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,11815,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41265,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41268,N,41269,41271,N,N,N,N,N,N,41272,N,N,N,N,\r
+41273,N,N,N,N,N,N,N,41274,N,N,N,N,N,N,N,N,N,41276,N,N,N,N,N,N,11816,N,N,N,N,N,\r
+N,N,N,N,41275,N,N,N,N,N,41277,N,N,N,41278,N,N,N,N,N,N,N,11817,N,11818,41279,N,\r
+N,11819,N,N,N,N,N,N,N,11820,N,N,N,N,N,N,N,N,N,N,41280,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41282,N,N,N,N,N,N,41283,N,N,N,N,N,N,N,\r
+N,N,11822,11823,N,N,N,N,N,N,N,N,N,N,41284,N,11824,N,41285,N,N,N,N,N,N,11825,\r
+11821,N,N,N,41281,N,N,N,N,N,11826,N,11827,N,N,N,N,N,N,N,N,N,N,41287,41288,N,\r
+41289,N,N,41290,11828,N,N,N,41291,N,N,41292,N,N,N,N,11829,N,N,N,N,N,N,N,41293,\r
+N,11830,N,N,11831,N,N,41294,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41296,N,N,N,N,N,N,N,N,N,N,N,41297,N,N,N,N,N,N,41298,N,N,N,11833,N,41299,N,N,N,\r
+41300,N,N,41301,N,N,N,N,N,N,N,N,N,N,N,N,N,11834,N,N,N,N,N,41295,N,N,N,N,N,N,N,\r
+N,N,N,11809,41303,41304,11835,11836,N,N,N,N,N,N,N,N,N,N,N,11837,N,41305,N,N,\r
+41306,N,N,N,N,11838,N,N,N,41307,N,41308,N,N,N,41309,N,N,N,N,11839,N,N,N,N,N,N,\r
+11840,N,N,N,N,N,N,N,N,N,N,N,N,11842,N,N,N,N,11841,11843,41311,N,N,N,41312,N,N,\r
+N,N,N,N,N,41313,N,N,N,N,41314,N,N,N,41315,N,N,N,N,N,N,N,N,N,N,N,41316,N,N,\r
+41317,N,N,N,41318,N,N,N,N,N,41319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,41321,N,N,N,N,N,N,N,N,N,41322,41323,11844,41324,41325,N,N,N,N,N,41326,N,N,N,\r
+N,N,N,41320,N,N,N,N,N,N,41327,N,N,N,N,N,N,41329,N,N,N,N,N,N,N,N,41330,41331,N,\r
+N,N,N,N,N,N,N,41332,N,N,41333,N,N,N,N,11845,N,41336,N,11847,N,N,N,41338,N,N,N,\r
+N,41339,N,N,N,N,N,N,N,41340,N,N,N,N,11848,N,N,41341,N,N,N,N,N,N,N,N,11846,\r
+41334,11851,N,N,11850,N,41761,N,N,11852,N,N,N,N,N,N,N,N,N,N,N,41763,N,N,N,\r
+41764,N,N,11853,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11854,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,11855,N,N,N,N,N,N,N,N,N,N,11857,N,11858,N,N,N,N,N,\r
+N,N,N,41766,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41768,N,N,N,N,N,N,N,62580,N,N,\r
+N,N,N,N,N,41769,N,N,N,N,N,N,N,41770,N,N,N,N,N,N,N,N,N,N,N,N,41772,N,N,N,N,\r
+11860,N,N,N,N,N,41773,N,N,N,N,N,N,N,N,N,41774,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41776,N,N,N,N,N,N,11861,N,N,N,N,N,N,11862,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,11863,N,N,N,11864,N,N,N,N,N,N,N,N,N,N,N,11865,N,N,N,N,41779,41780,11866,\r
+41781,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41782,11868,N,11869,41783,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,11870,N,N,N,N,N,N,N,N,N,N,N,41785,N,11871,N,N,N,N,41786,12158,N,N,N,\r
+11872,N,N,N,N,N,N,N,N,N,N,41787,N,N,N,N,N,N,N,N,N,N,41788,N,N,N,N,N,N,N,N,N,N,\r
+41790,N,41789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11873,N,N,N,N,41792,N,N,N,N,N,N,N,N,\r
+N,N,N,41794,N,41795,N,N,N,N,N,N,N,N,41796,N,N,N,N,N,N,N,N,N,N,41797,41798,N,N,\r
+N,N,N,N,N,N,N,N,N,N,11874,N,41799,N,11876,N,N,N,11877,41801,N,N,N,N,11878,N,N,\r
+N,N,11879,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11881,N,N,N,N,N,N,41803,N,N,\r
+N,11882,11883,N,N,N,N,N,N,11884,N,N,41804,41805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,11885,N,N,N,N,N,N,N,41806,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41807,N,N,N,N,N,N,\r
+N,N,41808,N,N,N,41809,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,11887,N,11888,N,N,N,41812,N,N,N,N,41813,N,N,N,N,N,N,N,N,N,N,N,N,N,41814,N,\r
+N,11889,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11890,N,N,N,N,N,N,N,N,N,\r
+11891,N,N,N,N,N,N,41815,N,N,N,N,N,N,N,N,N,N,N,N,N,11892,N,41816,N,N,41818,N,N,\r
+N,N,N,N,N,N,41819,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41823,N,N,N,N,41824,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41826,41827,11893,N,N,N,N,N,\r
+N,N,N,N,N,N,20350,N,N,N,N,N,41829,N,N,11894,41830,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,41832,N,N,N,N,N,N,N,N,N,11895,N,N,N,N,N,N,N,41828,N,N,\r
+N,N,N,N,N,N,N,N,N,N,41833,N,N,N,41834,N,N,N,N,11897,41835,N,N,N,N,N,N,N,11898,\r
+N,N,N,N,N,N,N,N,N,N,11899,N,N,N,N,N,N,N,N,11900,N,41836,N,N,41837,N,N,N,N,N,N,\r
+N,41838,11901,N,N,N,N,N,11896,N,N,N,41839,11902,N,N,N,N,41840,N,N,12065,N,N,N,\r
+41841,41842,N,N,N,N,N,N,N,N,41843,N,N,41844,N,N,N,N,41845,N,N,N,41846,N,N,\r
+12066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,41848,N,N,41849,N,41850,N,41851,N,N,N,N,N,N,N,N,N,N,N,12067,41852,41853,N,N,\r
+N,N,N,N,N,41854,N,N,N,N,12068,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,12069,N,N,N,N,N,N,N,N,N,12070,N,N,N,N,N,N,42017,N,N,N,N,42018,N,N,N,N,\r
+N,42020,N,N,42021,N,N,N,N,N,12071,N,N,N,N,N,N,N,N,N,N,N,N,N,12072,N,42023,\r
+42024,N,N,42025,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42027,N,N,N,\r
+12073,42028,N,N,N,12074,N,42029,N,N,N,N,N,12075,N,N,42030,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,12077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+42035,N,N,N,N,N,N,N,N,N,42036,N,N,42037,N,12078,N,N,42038,42032,N,N,N,N,N,N,N,\r
+N,N,N,42039,N,N,N,N,42041,N,N,N,N,N,N,42043,42046,12080,N,N,N,N,N,12081,N,\r
+42047,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42044,N,N,N,N,N,N,N,42048,\r
+N,N,N,N,N,N,42049,N,N,N,12082,N,42051,N,42052,42053,N,N,N,N,N,N,42054,N,12083,\r
+N,N,N,N,N,N,N,N,N,29735,N,N,N,N,N,N,N,N,N,N,42055,N,42056,N,N,N,N,N,12085,N,N,\r
+N,N,N,N,42057,N,12087,N,12088,12089,N,N,N,12084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,42059,N,N,N,42060,N,N,N,N,N,N,N,N,42061,N,N,N,12090,42062,N,N,42063,12091,\r
+N,N,N,N,N,N,N,N,N,42064,12092,N,N,12093,42065,N,N,N,N,42066,12094,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,42067,N,N,N,12095,12096,N,N,42068,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,42069,N,N,N,N,N,N,N,N,42070,N,N,N,N,N,N,N,N,N,N,N,N,N,42071,42072,\r
+12097,N,N,N,N,N,N,N,N,N,N,42074,N,N,N,N,N,N,N,N,N,N,N,12099,N,42075,N,N,N,N,N,\r
+42077,N,N,N,N,N,12100,N,N,N,12101,12102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42079,\r
+42080,N,N,N,N,N,42081,42082,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,42084,N,N,N,N,N,N,42085,12103,N,N,42086,42087,42088,N,12104,N,N,N,42089,\r
+12105,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42093,N,12106,\r
+42094,42095,N,N,N,N,N,N,N,N,N,42096,N,N,N,42092,N,N,N,N,N,N,N,N,N,N,N,12109,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,12110,12111,N,N,N,42099,N,N,12112,N,N,N,N,N,N,N,\r
+42097,N,N,N,N,N,N,42102,N,N,N,N,N,12113,N,42103,N,N,N,N,N,N,12114,N,N,42104,N,\r
+N,N,N,12115,12116,N,42106,N,N,42107,N,42108,N,12117,42109,N,N,N,N,12118,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42110,N,42273,N,N,N,N,N,N,42274,N,N,N,N,N,N,\r
+N,N,N,N,42275,N,N,N,N,N,N,42276,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42278,N,N,42279,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,12120,N,N,12121,N,N,42280,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,12123,N,N,N,N,N,N,N,N,N,N,N,N,12124,42281,42282,N,\r
+42283,N,42284,42285,N,N,N,42286,N,N,N,N,N,N,N,N,42287,12125,N,N,N,N,N,N,N,N,N,\r
+N,12127,42288,N,N,N,N,N,N,42289,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42291,N,N,N,\r
+N,N,N,N,N,N,42292,12130,N,N,N,12129,N,12131,N,N,N,N,N,12132,N,N,N,N,N,12133,N,\r
+42293,N,N,N,N,N,N,12134,N,N,N,N,N,N,N,N,N,42294,42295,42296,42297,N,N,N,N,\r
+42298,12135,42299,N,N,N,N,N,N,42300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42301,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42304,N,N,N,N,N,N,N,N,42306,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42309,N,12137,N,42310,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,12138,N,N,N,N,N,N,N,42312,42313,N,N,N,N,N,42314,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+12139,N,N,N,N,N,N,12140,N,N,N,N,N,N,N,N,N,N,N,N,42315,N,N,N,N,12141,N,N,N,N,N,\r
+N,N,N,N,42316,N,N,N,N,N,N,N,N,N,N,N,N,N,42317,N,N,N,N,N,N,12142,N,N,N,N,42318,\r
+N,N,N,N,42319,N,N,N,N,12143,N,N,N,N,N,N,N,N,N,N,12144,42320,N,N,N,N,42321,\r
+42322,N,N,42323,N,N,N,N,N,N,42324,N,N,N,N,N,N,N,N,N,32378,42328,42329,N,N,N,N,\r
+N,12145,N,N,N,42330,N,N,N,N,N,N,N,N,N,N,N,12146,N,N,N,42331,N,N,N,N,N,42332,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+42333,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42334,N,12147,N,N,N,N,N,12148,N,N,N,N,N,N,\r
+N,N,N,12149,N,N,42335,N,N,N,12150,N,N,N,N,N,12151,N,N,N,N,N,N,42336,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,42337,N,12152,42338,42339,N,42340,N,N,N,N,12153,N,N,N,N,\r
+N,N,N,N,N,42341,N,42342,N,42343,N,N,N,N,42344,N,N,N,N,42345,N,N,N,N,12154,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42346,N,42347,N,N,N,42348,N,N,N,N,42349,\r
+N,N,N,N,N,N,N,N,42351,N,42350,N,N,N,N,42352,42353,N,N,N,N,N,N,N,42354,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,42355,N,12156,N,N,N,N,N,N,N,N,N,N,N,12157,N,N,N,N,N,N,N,\r
+42357,N,N,N,N,N,N,42356,N,N,N,N,N,N,N,N,N,N,N,N,20309,N,N,N,N,N,N,N,N,N,N,\r
+42358,N,N,N,N,N,42359,N,N,N,20310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42360,N,N,\r
+N,N,N,N,42361,N,N,N,N,N,N,N,N,N,N,N,N,42362,20311,N,42363,N,42364,N,N,42365,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,20312,N,N,43041,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,43042,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43044,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,43046,N,N,N,N,N,N,N,43047,N,20313,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+20314,N,N,N,N,43050,N,N,N,N,N,N,N,N,N,N,N,43051,43053,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,20315,N,N,N,N,N,N,N,N,N,N,N,20316,N,N,N,N,20317,N,N,N,N,N,43054,N,20318,N,\r
+N,N,N,43055,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,32379,N,N,N,43057,N,N,20320,43058,N,N,N,43059,43060,43061,N,\r
+N,N,N,N,N,43062,N,N,N,N,N,N,N,N,N,20324,N,43065,N,N,N,N,N,N,N,N,N,N,N,43068,N,\r
+43069,N,N,N,N,20325,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20326,43073,N,43074,20327,N,\r
+N,43075,43076,N,N,20328,N,N,43078,N,N,N,N,N,N,N,43079,N,N,N,N,20329,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,43081,N,20330,N,N,N,N,20331,N,20332,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20333,43084,N,N,N,N,N,N,20336,N,N,\r
+43085,N,N,N,N,N,N,N,N,N,N,N,N,43087,N,N,43088,N,N,N,43089,N,43090,20337,N,N,N,\r
+43086,N,N,N,N,N,43091,N,N,N,N,N,N,N,43092,N,N,N,N,N,N,N,N,43093,N,N,N,20339,\r
+20340,N,N,20342,N,N,N,N,N,N,N,N,20341,N,N,N,N,N,N,N,N,N,N,N,N,N,43095,N,N,N,N,\r
+N,N,N,N,43096,N,N,20343,N,N,43098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20344,N,N,N,\r
+N,N,N,43101,N,N,N,N,N,N,N,N,N,43103,N,43104,N,N,43105,N,43106,N,N,N,N,N,N,\r
+20345,N,N,N,20346,N,N,20347,N,N,N,N,N,N,N,N,43107,N,43108,N,43109,N,N,N,20348,\r
+43111,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20349,N,N,N,N,N,43112,N,N,N,N,N,43113,\r
+43114,N,N,N,N,N,N,N,43115,N,29736,N,43117,N,N,N,N,43118,43120,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,43122,N,29737,43123,N,N,29738,N,N,N,N,N,N,43125,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,43126,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43127,N,N,N,N,N,N,N,N,N,N,\r
+43128,N,N,N,N,N,N,N,N,N,N,N,N,43130,N,29739,N,N,N,N,N,29740,N,N,N,N,N,N,N,N,N,\r
+N,N,N,43132,43133,43134,44065,N,N,N,N,N,N,N,N,32380,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44067,N,N,N,N,\r
+44068,N,44069,N,N,N,N,N,N,N,N,N,N,N,N,44070,N,N,N,N,29741,44071,N,N,N,N,N,N,\r
+44072,N,N,N,N,29743,N,N,N,N,N,N,44073,N,N,N,N,N,N,44074,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29744,N,N,N,44076,29745,N,29746,N,N,N,\r
+N,29747,44077,N,N,N,N,N,44078,N,N,N,N,N,N,N,N,N,N,N,N,N,44079,29748,44081,N,N,\r
+N,N,29749,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29750,N,29751,N,N,N,N,N,N,29752,N,N,\r
+29753,N,N,N,N,29754,N,44082,N,N,N,N,N,N,N,N,N,N,N,N,29755,N,N,N,29756,N,N,N,N,\r
+N,N,N,N,N,N,44083,29757,N,N,29758,N,N,N,N,N,N,N,N,N,N,44084,N,N,N,N,N,N,N,N,N,\r
+N,29759,44085,N,N,N,N,N,N,N,N,N,N,29760,N,N,N,N,N,44086,N,N,N,N,N,N,N,N,N,N,N,\r
+N,29761,N,N,N,N,N,44087,N,44088,N,N,29762,N,N,N,N,N,N,N,29763,N,N,N,N,N,29764,\r
+N,29765,44089,N,N,N,N,N,N,N,N,N,N,N,44090,N,N,44092,N,29766,N,44093,N,N,N,N,N,\r
+N,44094,44095,44096,N,N,N,N,N,N,N,N,N,29767,N,N,29768,44097,N,N,N,N,N,N,29769,\r
+N,N,N,N,44098,44099,N,N,N,44100,N,N,N,N,N,N,N,N,44101,29770,N,N,N,N,N,N,29771,\r
+N,N,44103,29772,N,N,N,N,N,N,N,N,N,44104,N,44105,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+29773,N,29774,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29775,N,N,N,N,44107,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44108,N,N,N,N,N,N,N,N,N,N,44109,N,N,N,N,N,N,N,N,N,N,44110,N,N,N,N,\r
+N,N,N,29777,29778,N,N,N,N,N,N,N,N,N,44111,N,N,N,N,N,N,N,44113,44114,N,N,N,N,N,\r
+N,N,N,N,N,N,N,44115,N,N,N,N,N,N,N,N,N,44116,N,N,29779,N,N,N,N,N,N,N,N,29780,\r
+29781,N,N,N,44117,N,44118,N,29782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44119,N,N,N,\r
+44120,N,N,44121,N,N,29783,44122,N,44123,44124,N,N,N,N,N,44125,N,N,29784,N,\r
+44126,N,N,N,N,N,N,N,N,N,N,N,N,29785,N,N,N,N,29786,N,N,N,N,N,N,29787,N,N,44127,\r
+N,N,N,N,N,N,44129,N,N,N,N,44130,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,44131,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44132,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,29789,N,N,N,N,44134,44135,N,N,N,44136,44137,N,N,N,N,N,\r
+N,N,N,N,N,N,N,44138,N,N,44139,N,N,N,N,44140,N,N,N,N,N,N,N,N,N,N,N,29792,N,N,\r
+29791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44142,N,N,N,N,N,N,N,\r
+44143,N,44144,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44145,44147,N,N,N,N,N,\r
+N,N,N,N,N,N,N,29794,44148,N,N,N,N,N,44149,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,29795,N,N,N,N,29796,N,N,44150,N,N,N,N,N,44151,N,N,N,N,44152,44153,N,N,N,\r
+29797,N,N,N,29798,N,N,N,N,N,N,44154,N,N,44155,N,N,N,N,N,N,N,N,44157,N,29799,N,\r
+N,N,44158,N,N,N,N,N,N,N,44156,N,N,N,N,N,N,N,N,N,29800,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,44321,N,N,N,N,N,N,N,N,N,N,N,N,44322,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44323,\r
+29802,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,29803,44325,44326,N,N,N,N,N,N,29804,N,N,44327,N,N,44328,N,N,N,N,N,N,N,29805,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44331,N,N,44332,N,N,N,29806,\r
+N,44333,44334,N,N,N,N,44335,N,29807,44336,N,N,N,N,N,N,N,N,N,44337,N,N,N,N,N,N,\r
+N,N,N,N,44339,N,N,N,N,N,N,N,N,N,N,N,29808,N,N,N,N,N,N,44342,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,29809,N,N,N,N,N,N,N,44343,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44346,N,N,\r
+N,N,44344,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,44347,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44349,44350,N,N,N,N,N,N,\r
+44351,N,N,N,44352,N,N,N,N,29810,N,N,N,N,N,44353,44354,29811,N,N,N,N,44355,N,N,\r
+29812,N,44348,44356,N,N,N,N,N,N,29813,N,N,N,29814,N,N,N,N,N,N,N,N,N,44357,N,N,\r
+N,29815,N,N,44358,N,N,N,44359,N,N,N,N,N,44360,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29817,N,N,N,N,N,N,N,N,44361,44362,N,44363,N,\r
+N,29818,N,N,N,N,N,N,N,N,N,N,N,N,29819,N,N,N,N,N,44364,N,N,N,N,N,29816,N,N,N,\r
+44365,N,N,N,N,N,N,N,N,N,44366,N,N,N,N,N,N,N,N,N,44367,N,N,N,N,N,N,N,N,N,N,N,\r
+44368,N,44369,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+29821,29822,N,N,N,N,29985,N,N,N,N,N,29986,44370,44371,N,29820,N,29987,N,N,N,N,\r
+44372,N,44373,N,N,N,N,N,N,N,N,N,N,N,N,44375,44376,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,29988,N,N,N,29989,N,N,N,44377,44378,N,N,N,N,N,N,N,N,N,N,44380,N,N,N,N,\r
+44381,N,44382,N,N,N,N,N,N,N,44384,N,N,N,29990,N,N,N,N,N,N,29991,N,N,N,N,N,N,N,\r
+N,44385,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44386,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44387,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29993,N,N,N,44388,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,44389,N,N,N,N,N,N,44390,N,N,44391,44392,N,N,N,N,44393,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,29994,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44394,N,N,\r
+44395,N,N,44396,N,N,N,N,N,N,44397,N,N,44398,N,N,N,N,N,N,44399,N,N,N,N,N,N,N,N,\r
+N,N,44400,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44402,N,N,\r
+N,N,N,N,44403,N,N,44404,29996,N,N,N,44405,N,N,N,44406,29997,N,N,N,N,N,N,N,N,N,\r
+N,N,29998,N,N,N,N,N,N,N,N,29999,N,N,44407,30001,N,30002,N,N,N,N,N,44408,30003,\r
+N,N,N,N,30004,30005,N,30006,N,N,N,N,N,N,30000,N,N,N,N,N,N,N,N,N,N,44409,N,N,\r
+30008,N,N,N,30009,N,44411,N,N,44410,N,N,N,N,N,44414,N,30011,30012,44577,N,N,N,\r
+N,N,30013,N,44578,N,30014,N,N,N,N,44581,44582,44583,44584,N,N,N,N,N,30015,N,N,\r
+N,30016,30017,N,N,44585,N,N,N,N,44586,N,N,N,N,N,N,N,N,N,N,N,N,30018,N,N,44587,\r
+N,44588,N,N,N,N,N,N,44589,N,N,N,N,N,N,30020,N,N,N,N,N,N,N,N,N,N,N,N,44591,N,N,\r
+N,44592,30021,N,N,44593,N,N,N,N,N,30022,N,N,N,44595,N,N,N,N,N,N,30023,N,30024,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30026,N,N,N,N,N,N,N,N,N,N,N,N,30027,N,N,N,\r
+44597,N,N,N,N,N,N,N,N,N,N,N,N,N,30028,30007,44599,N,N,N,44600,N,N,N,N,N,N,N,N,\r
+N,N,N,N,44601,30029,N,N,N,N,N,44603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,30031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30033,30034,N,N,N,44606,\r
+44607,N,N,N,N,N,N,44608,N,N,N,N,N,N,N,N,44609,N,N,N,N,N,N,N,N,30032,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,44613,N,44614,N,N,N,N,30035,N,N,N,N,N,30036,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,44616,30037,N,N,N,N,30038,N,N,30039,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44620,N,44621,N,N,N,N,N,N,N,N,30040,N,N,N,N,30042,N,N,44622,N,N,N,\r
+N,44623,N,N,N,N,N,N,N,N,N,44624,N,N,N,N,30043,N,44625,N,44626,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,44627,N,N,N,N,N,N,44628,N,30041,N,N,30044,30045,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,44619,N,N,N,N,N,N,N,44632,N,N,N,N,30047,N,44633,N,N,N,N,\r
+N,N,N,N,N,N,N,N,30048,44634,N,N,N,30049,N,44636,N,N,N,N,N,N,N,44637,N,N,44638,\r
+N,N,N,N,N,44639,44640,N,N,N,44641,N,N,44642,N,N,N,N,N,30046,N,N,44643,N,44644,\r
+N,N,N,30050,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44646,N,N,44647,N,N,N,30051,N,N,\r
+30052,N,N,N,N,44648,N,44649,N,N,N,N,N,44650,N,N,N,N,N,N,N,N,N,N,N,N,N,44651,N,\r
+N,N,N,N,44652,N,44654,44655,44656,N,44657,N,N,N,N,N,N,30054,N,30055,N,N,N,N,\r
+44658,44659,N,N,N,N,N,N,30056,N,44660,N,N,N,N,N,N,44661,N,N,N,N,N,N,N,44666,N,\r
+44667,N,N,30057,N,N,N,44668,N,N,44669,30058,N,N,N,N,N,44670,N,N,44833,N,N,N,N,\r
+N,N,N,N,N,N,44834,44835,N,N,30059,N,N,N,44836,30060,N,N,30061,30062,N,N,N,N,N,\r
+44837,N,N,N,44662,30063,44838,N,N,N,44839,N,N,30064,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30067,N,N,N,N,N,\r
+44843,N,N,N,N,N,N,30068,N,N,N,44845,N,N,30065,N,N,N,N,N,N,N,N,N,N,N,N,N,30069,\r
+N,N,N,N,N,N,N,N,N,N,N,30070,30071,N,N,N,30072,44846,N,N,44847,N,N,N,N,N,44848,\r
+N,N,N,N,N,N,N,44849,N,N,N,N,44850,30073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44851,N,N,N,44853,N,44854,N,N,N,N,N,N,N,N,N,N,N,N,30075,44855,N,N,N,N,N,N,\r
+30076,N,N,44856,N,N,N,N,N,N,44857,N,N,44858,N,44859,N,N,N,44860,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,30077,N,44861,N,N,N,N,44862,N,N,N,N,N,N,N,N,N,N,N,30242,44868,N,\r
+N,N,N,N,30243,30244,N,N,N,44869,44870,N,N,N,44871,44873,30245,30246,N,N,N,N,N,\r
+N,N,44874,30247,N,44875,N,N,N,30248,N,N,N,N,44876,N,N,44877,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,44865,N,44879,44880,44881,N,N,N,N,N,N,30250,N,N,30251,44882,\r
+N,N,N,N,N,30252,44883,N,N,44884,N,N,N,N,44886,N,30253,N,44887,N,N,N,30254,N,N,\r
+N,N,30255,N,N,N,N,N,N,N,N,44888,N,N,N,N,N,N,30256,N,N,N,N,N,N,N,30257,N,N,N,N,\r
+N,N,44885,N,N,N,44890,N,N,N,N,44891,N,N,N,N,N,30259,N,44892,N,N,N,N,N,44894,N,\r
+N,30260,N,N,N,N,N,N,N,N,30261,30262,44895,N,44896,N,N,N,30263,N,N,N,N,N,44898,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44899,N,N,N,N,N,N,N,N,44900,N,N,N,N,N,N,N,N,\r
+N,44902,N,N,N,44901,N,N,N,N,N,N,N,44903,44904,N,N,N,N,N,N,30264,N,N,30265,N,N,\r
+N,N,44907,N,N,N,N,44908,44909,44910,N,N,N,N,N,N,N,N,N,44911,44913,N,N,N,44914,\r
+44915,44916,N,N,N,N,N,44918,N,N,N,30268,N,N,30269,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30270,N,N,44920,N,N,N,N,N,30271,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30272,N,N,N,\r
+44921,N,N,N,N,N,N,N,N,N,N,N,30273,N,44922,N,N,N,N,N,N,N,30274,N,N,N,N,30275,N,\r
+30276,N,N,N,N,44923,N,N,N,N,N,N,N,N,44924,N,30277,N,N,44925,N,N,N,N,N,N,44926,\r
+30278,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60961,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,30279,N,N,N,30280,60962,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60964,60965,N,N,N,\r
+N,N,N,N,N,60966,60967,60968,N,N,N,N,N,30282,N,N,N,N,N,N,30283,30284,N,N,60969,\r
+N,N,N,N,N,N,N,N,N,N,N,60970,60971,N,N,N,N,N,N,60972,N,N,60973,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,30285,60974,N,N,30286,N,N,N,N,60975,N,N,N,60976,N,30287,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30288,N,60977,60978,N,\r
+N,N,60979,N,N,N,N,60981,N,N,N,N,N,N,N,N,N,N,N,N,N,60982,N,N,N,N,N,N,N,N,N,N,N,\r
+30289,N,60983,30290,N,N,N,N,N,N,N,N,N,N,61007,N,N,N,N,N,60984,N,N,N,N,N,N,\r
+30292,N,30293,N,N,N,N,N,N,N,N,N,N,N,N,N,60985,30294,30295,N,N,60986,N,N,N,N,N,\r
+N,N,N,N,N,60988,60989,N,60990,30296,N,N,N,30297,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30291,N,N,60991,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,60992,N,N,N,30299,N,N,\r
+N,N,N,N,N,N,N,60993,N,N,N,30300,N,60995,N,N,N,60996,N,60997,N,N,N,30301,N,N,N,\r
+N,N,N,N,N,60998,N,30302,60999,61000,30303,N,N,N,N,N,N,N,N,N,N,N,N,30298,61002,\r
+N,N,N,30305,N,N,N,N,N,61003,N,N,N,30306,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,61004,N,61005,61006,N,N,N,N,N,N,30307,61008,N,30308,N,N,61029,N,N,N,N,\r
+30309,N,N,61009,N,N,30310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30311,N,N,61010,N,N,61011,N,61012,N,N,N,N,30312,N,N,N,N,N,N,N,N,N,N,61013,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,61014,61015,30314,N,N,N,N,30315,N,30316,61016,N,N,\r
+61017,N,N,N,61018,N,N,30317,N,N,N,61019,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30318,61025,30319,N,61026,N,N,N,N,N,61027,N,N,N,N,N,N,N,N,N,N,30320,N,N,61028,\r
+N,30321,N,N,N,61030,N,N,N,N,N,61031,61032,61033,N,N,N,N,N,30322,N,N,N,30323,\r
+30324,N,30325,N,61034,N,N,N,N,N,N,N,N,N,61035,N,N,N,N,N,N,N,N,N,N,N,N,61036,N,\r
+N,N,N,N,30326,61021,N,N,N,N,N,N,61038,N,N,N,61039,N,N,N,N,61040,N,N,N,N,N,N,N,\r
+N,N,N,61042,N,30328,N,61037,N,N,N,N,N,61043,N,N,N,N,N,N,N,30329,N,N,N,61044,\r
+61045,N,61046,61047,N,N,61048,N,61049,N,61050,61051,N,N,61052,N,N,N,N,30330,N,\r
+30331,N,N,N,N,61053,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61217,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,61218,N,N,N,30332,N,N,N,N,N,30333,N,N,61219,N,N,N,N,N,N,N,N,N,N,61220,N,\r
+30334,N,61221,N,N,N,30497,N,N,61222,N,N,N,30498,N,N,N,N,N,N,N,N,N,N,61223,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61225,N,N,N,N,N,N,N,N,N,N,N,N,N,61226,N,61227,\r
+61228,N,61229,N,N,N,30499,N,N,N,N,N,N,N,61230,N,30500,N,N,N,N,N,N,N,N,N,N,\r
+61231,N,N,N,N,30502,N,N,N,N,30503,N,N,N,30504,N,61224,61232,N,N,N,N,N,61233,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30505,61235,N,N,N,N,61236,N,30506,61237,\r
+N,N,N,30507,N,61238,30508,30509,N,N,N,N,N,61239,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,61241,30510,N,N,N,N,N,N,N,N,N,30511,N,N,N,30512,30513,N,N,61242,N,N,\r
+N,30514,N,61243,N,61240,N,N,N,N,N,N,61245,30515,N,N,N,N,61246,N,30516,N,N,N,N,\r
+N,N,N,61247,N,N,N,N,N,61249,30517,N,N,N,N,N,30518,N,61244,N,N,N,N,N,N,N,N,\r
+30519,61250,61251,30520,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61252,N,N,N,61253,N,N,N,\r
+N,N,N,N,N,N,N,61254,N,N,N,N,N,N,30522,N,N,N,N,30523,N,N,N,30521,N,N,61256,\r
+61257,N,N,N,N,30524,30525,61258,N,N,61259,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,61260,N,N,N,N,30526,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61262,61263,N,\r
+61264,N,N,N,N,N,N,61265,N,N,N,61266,N,N,30527,61267,N,N,30530,N,N,N,N,N,61269,\r
+N,N,N,N,N,N,N,N,30528,30529,N,N,N,N,N,30531,61270,N,N,N,61271,N,N,61272,N,\r
+61273,N,N,N,N,N,N,30532,61274,N,N,N,N,N,N,N,61275,N,N,61276,N,N,N,30533,61277,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,61278,N,61279,N,N,N,N,N,N,N,61282,N,N,N,N,30534,N,\r
+N,N,N,N,N,30535,N,N,N,N,N,61283,N,N,N,N,N,30536,N,N,N,61280,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,61286,N,N,N,N,N,N,61287,N,61288,30537,N,N,N,30538,N,N,N,61289,N,N,N,\r
+N,N,N,N,30539,N,N,N,N,N,N,N,61285,61290,61291,N,61292,61293,61294,N,N,N,61295,\r
+N,N,30540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30542,N,30543,N,N,N,N,N,N,N,N,N,N,30541,\r
+N,N,30544,61297,30545,61298,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30546,\r
+30547,N,N,61300,N,N,N,N,N,61299,30548,30550,61301,N,N,N,N,N,N,N,N,30551,N,\r
+61302,N,30552,N,N,N,N,N,N,N,30553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,61305,N,N,N,N,30555,N,30556,N,N,N,N,N,N,N,N,N,N,30557,N,N,N,61304,N,N,N,N,\r
+61306,N,N,N,N,61307,N,61308,N,N,N,N,N,N,N,N,N,N,N,61309,61310,N,N,N,61473,N,N,\r
+N,N,N,N,30559,N,N,N,N,N,N,30558,N,N,30560,N,N,N,N,N,N,61475,N,N,N,N,N,N,N,\r
+61476,N,N,N,N,N,61477,N,N,61478,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,30561,30562,N,N,N,N,N,N,61479,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30563,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61482,N,N,N,N,N,N,N,N,61483,N,\r
+N,N,61484,61485,N,N,N,N,N,N,N,N,61487,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61488,N,\r
+30564,30565,61489,N,N,N,N,N,N,N,N,N,N,N,61490,N,N,N,N,N,N,N,N,N,N,61492,61493,\r
+N,N,N,N,N,N,N,N,61494,N,N,N,N,N,N,61495,N,N,N,N,N,N,N,N,N,N,N,N,N,30567,61496,\r
+N,N,N,N,N,N,N,N,N,N,N,N,30568,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61498,61499,N,\r
+61500,61501,N,N,N,N,N,N,N,N,N,N,N,N,30569,N,30570,61502,N,N,N,N,N,N,N,N,N,N,\r
+61504,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,61507,N,N,N,N,N,N,61508,30571,61509,N,N,N,N,N,N,N,N,N,N,61510,N,N,N,N,N,\r
+61511,61512,N,N,N,N,N,N,N,N,N,N,N,N,N,30573,30574,N,N,N,61515,N,N,N,N,61516,N,\r
+61517,N,N,N,N,N,61514,N,N,N,61518,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30576,N,\r
+61519,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30577,N,N,N,N,61521,61522,N,61524,\r
+61525,N,61526,N,N,N,N,N,61527,N,N,N,N,30578,N,N,N,N,61528,N,N,N,61529,N,N,N,N,\r
+61530,N,N,N,N,N,N,N,N,N,61531,30579,N,N,61532,N,N,N,61533,N,61534,30580,30581,\r
+N,30582,N,N,61535,30583,N,61536,N,N,30584,N,N,N,N,N,N,N,N,N,61537,N,61538,N,\r
+61539,N,N,61540,N,N,61541,N,N,N,N,N,61542,N,N,N,30585,N,61543,N,N,N,30586,N,N,\r
+N,N,N,N,30587,N,N,30588,N,N,N,N,N,N,N,61544,N,30589,N,N,N,61545,N,30590,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,61546,61548,61549,N,N,N,N,N,30753,N,N,30754,N,N,N,N,N,\r
+N,N,N,61547,N,N,N,N,N,N,30755,30756,N,N,N,N,N,N,N,N,61550,N,30758,N,30759,N,\r
+30760,30761,30762,N,30763,30764,30765,61551,N,N,N,N,N,N,N,61552,N,N,N,N,N,N,\r
+61554,N,N,61555,30766,N,30767,30768,N,N,N,30769,N,61556,N,N,N,N,61557,61553,N,\r
+N,N,30770,N,N,N,N,N,61558,N,N,N,N,30771,N,N,N,N,N,N,N,N,30772,N,30773,N,N,N,\r
+61559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61560,N,N,N,61561,30774,30775,61562,30776,\r
+N,N,N,N,N,N,30781,N,61564,N,N,N,N,61565,30777,61566,N,N,30778,N,N,30779,61729,\r
+61730,N,30780,N,61731,30782,N,30783,30784,61732,61733,N,N,N,N,N,N,N,N,N,30785,\r
+N,N,N,61734,61736,61735,N,N,N,30786,N,N,N,N,N,N,N,N,30787,30788,N,N,N,N,N,N,N,\r
+N,N,N,N,N,61737,N,61738,N,30789,N,N,N,61739,N,N,N,N,N,N,N,N,N,N,N,N,61741,N,N,\r
+N,61740,N,N,N,N,N,N,N,N,N,N,61743,N,N,N,N,30790,30791,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,30792,N,N,N,N,N,N,N,N,61745,N,N,N,61746,N,N,N,N,N,61747,N,N,\r
+N,N,30793,N,N,N,N,N,N,N,N,N,N,N,N,N,61750,61751,N,61752,N,N,N,N,N,N,N,61753,N,\r
+N,N,N,N,61754,N,61755,N,61756,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,61757,N,N,30794,N,61759,61758,N,N,N,N,N,N,30795,61760,N,N,61761,61762,N,N,\r
+61763,N,N,N,N,N,N,N,N,N,N,61765,N,N,N,N,N,30796,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61767,N,N,N,N,N,N,N,N,N,N,N,N,N,61769,N,N,N,N,N,N,61770,N,N,N,N,N,N,N,61771,\r
+61772,N,N,N,N,N,61773,N,N,N,N,N,N,N,30798,61774,N,N,N,61775,N,N,N,N,N,N,N,N,N,\r
+61776,N,61777,61778,N,N,N,30799,N,N,61779,N,N,N,N,61780,N,61781,N,N,61782,N,N,\r
+N,N,N,N,N,61783,30800,N,30801,61784,N,N,N,61786,30802,N,N,N,N,N,N,61787,N,N,N,\r
+61790,N,30803,30804,N,61785,30805,N,61791,61792,N,30806,N,N,N,N,N,N,61794,\r
+32381,N,61795,N,N,N,N,30807,N,N,N,N,N,61797,N,30808,N,N,N,N,N,N,61796,N,N,N,N,\r
+61800,N,30809,N,N,N,N,N,61802,N,30810,N,N,N,N,N,N,N,N,N,61803,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,30811,30812,N,N,N,N,N,N,N,30813,61805,30814,N,30815,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,30816,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61806,N,N,N,N,N,\r
+30817,61807,30818,30819,N,61809,61808,N,N,N,N,30820,61810,61811,N,30821,N,N,N,\r
+N,61812,N,N,N,N,N,N,30822,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30823,N,N,N,61814,N,N,\r
+30824,N,30825,N,N,N,N,N,30826,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30827,N,61816,\r
+N,N,N,61817,N,N,N,N,30828,N,N,N,N,N,N,N,N,N,N,30829,30830,N,N,N,N,N,N,N,N,N,N,\r
+N,N,61819,N,30831,61820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61821,N,N,N,N,N,N,\r
+30832,61822,30833,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30834,N,N,N,N,N,N,30835,30836,\r
+N,N,N,N,N,N,N,N,N,61989,N,N,N,30837,N,N,30838,61990,N,30839,N,N,N,N,N,N,N,\r
+61991,N,N,N,N,N,N,N,61993,N,N,N,N,N,N,N,30840,N,61994,61995,N,N,30841,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30842,N,N,N,N,N,61998,N,N,N,N,61999,N,N,62000,N,\r
+62001,N,N,N,N,62002,30843,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62003,62004,30844,N,N,N,\r
+62005,N,62006,N,N,N,62007,N,62008,N,N,N,62010,N,N,N,62011,N,N,N,N,N,N,62012,\r
+62014,62015,N,N,62016,N,N,N,62017,N,N,N,N,N,N,N,N,N,N,N,62018,N,N,N,N,N,N,N,\r
+62019,N,N,N,N,N,N,N,N,N,N,62020,30845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,31009,N,N,N,62021,N,N,N,N,N,N,31010,31011,N,31012,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,62022,N,N,N,31013,N,62023,N,N,N,31014,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,62025,N,N,N,N,N,N,N,N,N,62026,N,N,N,N,N,N,N,N,62028,\r
+62029,62030,N,N,N,N,62027,N,N,N,N,N,N,N,N,31018,N,N,31016,N,N,N,N,N,N,N,N,N,N,\r
+62031,N,N,N,N,N,N,N,N,N,N,N,N,62032,N,N,N,62033,N,62034,N,N,N,N,N,N,62035,N,N,\r
+N,N,N,N,N,N,N,N,62036,62037,N,N,31019,N,62038,N,N,N,N,N,N,N,N,N,N,N,31020,N,N,\r
+N,N,31022,N,62039,62040,62041,N,N,62042,31021,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+62044,N,N,N,N,N,N,N,N,N,N,62045,31023,N,N,N,N,N,N,N,N,62047,N,N,N,N,N,N,N,N,\r
+31024,N,62046,31025,N,N,31026,N,N,N,N,N,N,62048,N,N,N,N,N,N,N,N,N,31029,31030,\r
+N,N,N,62049,N,N,N,N,N,N,N,N,N,N,N,N,N,62050,N,N,62051,31034,N,N,N,N,N,N,N,N,N,\r
+N,62053,N,N,N,N,N,N,N,N,N,N,62054,N,N,N,N,N,N,31038,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,62055,62056,62057,N,31042,N,N,62058,N,N,N,N,N,62059,\r
+N,N,N,N,N,N,N,62060,N,N,N,N,N,N,N,31043,N,N,62061,N,N,N,31044,N,N,62062,N,N,N,\r
+N,N,N,62063,N,N,N,N,62064,31045,N,31046,N,62065,62066,N,N,N,N,N,N,31048,N,\r
+62067,N,N,N,N,N,N,N,31049,N,N,N,N,N,N,N,N,N,N,N,N,31050,N,31051,31052,N,N,N,N,\r
+N,N,62072,N,N,N,N,N,N,62073,N,N,N,62074,N,N,N,N,N,62075,N,N,62076,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,62078,N,N,N,N,N,N,N,N,N,N,62241,31054,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,62242,N,N,N,N,62243,N,N,N,N,N,N,N,N,N,62244,N,N,62245,N,N,62246,31055,N,\r
+62247,62248,N,N,N,N,N,N,62249,N,N,62250,N,N,31056,N,N,N,N,N,N,N,62251,N,N,\r
+62252,N,N,N,N,N,N,N,N,N,62253,N,N,31058,N,N,N,N,62254,N,N,N,N,N,62255,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,31059,N,N,62256,N,N,N,N,N,N,N,N,62257,N,N,N,N,N,N,31061,\r
+N,N,N,N,N,62260,N,31062,62261,N,62262,N,N,N,N,N,N,N,N,N,N,N,N,N,62264,N,31063,\r
+N,N,62265,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62266,62267,N,N,31064,N,N,\r
+N,N,N,N,N,N,62268,N,N,N,N,N,N,N,N,31065,62271,N,N,N,N,N,N,N,N,N,N,31066,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62274,N,N,62275,N,N,31067,62276,62277,N,\r
+62278,N,N,N,N,N,N,N,N,N,31068,N,62273,N,N,N,62282,N,N,N,N,N,31069,N,N,N,N,N,N,\r
+31070,N,N,N,N,N,N,62284,N,N,N,N,N,N,N,N,N,N,31071,N,N,N,62286,N,62287,N,N,\r
+62288,N,N,N,31072,N,31073,N,N,31074,62289,N,N,N,N,N,62285,N,N,N,N,N,62281,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,62292,62293,N,N,N,N,N,N,N,N,N,62294,N,N,31075,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,62296,N,N,N,N,N,62297,N,N,N,N,N,N,62298,N,N,N,N,N,\r
+N,N,N,62299,N,N,N,N,62300,N,N,N,N,N,N,N,N,N,62303,N,62304,31077,N,31078,62305,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62306,N,N,N,N,N,62307,31079,N,62308,N,N,N,N,N,N,\r
+N,62309,N,N,62310,62311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31081,N,31082,N,N,N,N,N,\r
+62312,N,N,N,N,N,N,N,N,N,N,31080,N,31083,N,N,31084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+62313,N,N,N,N,62314,N,N,N,N,N,N,62315,N,N,N,N,N,62316,N,31087,N,N,N,N,62317,N,\r
+N,62318,N,N,N,N,N,N,N,62319,N,N,N,31088,62320,62321,62322,N,N,N,N,N,N,N,N,\r
+31089,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31090,N,N,N,N,31091,N,N,N,N,N,\r
+N,N,N,N,N,N,31092,N,N,N,N,N,62326,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62328,62329,N,\r
+N,N,N,31093,N,N,62330,N,N,N,N,62332,N,N,N,62334,N,N,N,N,62497,N,N,N,N,N,N,N,\r
+31094,N,62499,N,31095,N,N,N,31096,N,N,N,N,N,N,N,N,62501,N,N,N,N,62502,N,N,N,N,\r
+N,N,N,N,N,62504,62505,N,N,N,31097,31098,62506,N,N,N,N,N,N,N,N,62508,31099,N,N,\r
+N,N,N,N,N,N,N,31100,62509,N,N,N,N,31101,N,N,N,N,N,N,N,N,N,N,N,N,N,31102,N,N,N,\r
+N,N,N,N,N,N,N,N,62512,62513,N,62514,31265,N,N,N,N,N,62515,31266,N,N,N,N,N,N,N,\r
+N,N,N,31267,N,N,N,N,N,62519,62520,N,31268,N,N,N,N,N,N,N,N,N,N,N,N,N,62521,N,N,\r
+N,N,N,62522,N,N,N,N,N,N,N,N,N,31269,N,N,N,N,62524,N,N,N,31270,N,N,62526,N,\r
+62527,N,N,31271,62528,N,N,N,N,N,N,N,N,N,N,62529,N,N,N,N,N,62531,N,N,31272,N,N,\r
+N,N,N,31273,62532,N,N,62533,N,N,N,N,N,N,N,N,N,N,N,62534,62535,N,N,N,N,N,N,N,N,\r
+62536,N,31274,N,N,N,N,N,N,N,N,N,31275,N,N,N,N,N,N,N,N,N,31276,62537,N,62538,N,\r
+N,N,N,N,N,N,N,N,31277,N,N,62539,N,N,N,N,N,N,N,N,N,N,62540,N,N,N,N,N,N,N,62541,\r
+31280,N,N,N,N,N,N,N,62545,31281,N,N,N,31282,N,62546,N,N,N,N,N,62547,N,N,62548,\r
+N,N,N,N,N,N,62549,31279,N,N,N,62550,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,62551,N,31284,N,N,N,N,N,N,N,N,N,N,31285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+31286,N,N,N,N,N,N,N,N,N,32382,N,N,N,N,N,N,N,62552,N,62553,N,N,N,N,N,N,N,N,\r
+62554,N,N,N,N,N,N,N,62555,62556,N,N,31287,N,N,31288,N,N,N,62558,N,N,N,N,N,N,\r
+62559,N,62560,62563,62562,N,62564,N,N,N,N,62565,62566,N,N,31289,N,N,N,N,N,N,N,\r
+62567,N,N,62570,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62572,N,62573,62574,N,N,N,N,N,N,N,\r
+N,62575,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62576,62577,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,62579,31291,N,N,N,N,62582,31292,N,N,N,N,62583,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,62584,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31293,N,N,N,62586,N,N,N,N,N,N,N,\r
+N,N,N,31294,62587,N,N,N,N,N,N,N,N,N,N,N,31295,N,N,N,31296,N,N,N,62588,N,62589,\r
+N,N,N,N,N,N,31297,N,31298,62590,N,N,62753,N,N,N,N,N,N,N,31299,62754,N,N,N,N,N,\r
+62756,N,62755,N,N,N,62757,N,N,62758,N,N,31301,N,62759,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,62760,N,31302,N,N,N,N,N,62761,N,N,N,62762,N,N,N,N,31303,N,31304,N,N,N,N,\r
+31305,N,N,N,N,N,N,62763,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,62764,N,N,N,N,N,N,N,N,N,N,62765,N,N,N,62766,N,N,N,N,N,62767,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62768,N,N,62769,N,N,N,N,\r
+N,N,N,62770,N,N,62771,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62772,N,N,N,N,N,N,N,N,N,\r
+N,N,N,62774,N,N,N,N,31306,N,N,N,N,N,N,N,N,N,N,62775,N,31307,62776,N,N,N,N,N,N,\r
+N,31308,N,N,N,N,N,62777,N,N,N,N,N,N,N,N,N,N,N,N,31309,N,62780,N,N,N,N,N,62781,\r
+62779,N,N,N,N,N,N,N,N,62784,N,31310,N,N,N,N,N,62785,N,N,N,N,N,62787,N,N,62788,\r
+N,N,N,N,62789,N,N,N,N,N,N,N,N,62783,N,N,N,N,N,N,N,62791,N,N,N,N,N,N,N,N,N,N,N,\r
+N,31311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31312,N,N,N,N,N,N,31313,\r
+31314,62793,N,N,N,31315,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62795,N,N,62797,\r
+62798,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62800,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,62801,N,N,N,N,N,N,N,N,31316,N,N,N,N,N,62802,N,62803,N,N,N,\r
+N,N,N,31317,N,N,N,N,31318,N,N,N,N,N,N,62804,31319,N,N,N,62805,N,N,N,N,N,N,N,N,\r
+62807,N,N,N,N,N,N,N,62809,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62811,N,62812,62814,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62816,N,N,N,N,N,N,N,62817,62818,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,62820,N,62821,N,N,N,N,N,N,N,62822,N,N,N,N,N,N,N,N,\r
+62825,62823,N,N,62824,N,62827,N,N,N,62829,N,N,N,N,N,N,N,62831,N,N,N,N,62833,N,\r
+N,N,31323,N,N,62834,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31324,N,N,N,N,62838,N,N,N,\r
+62840,N,62841,N,N,N,62842,N,N,N,N,N,N,62843,N,N,N,31326,N,N,N,N,62844,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,31327,N,31328,31329,N,N,62845,62846,31330,N,N,N,N,31331,N,N,\r
+N,63009,N,63010,N,N,31332,N,N,63011,N,63012,N,31333,31334,N,N,N,N,N,N,31335,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,31336,N,N,N,N,N,N,N,N,N,N,N,N,63013,N,N,N,N,N,63014,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,63015,N,N,N,N,N,31337,31338,31339,31340,N,N,N,N,N,\r
+63016,63017,N,N,N,63018,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63020,N,63021,N,N,N,N,\r
+31342,N,N,N,N,N,N,N,N,N,N,31343,N,N,63022,N,N,N,N,N,N,N,N,N,31344,N,63023,N,N,\r
+N,N,N,N,31345,63024,N,N,31346,N,N,N,N,N,N,N,N,N,31347,N,N,63019,31348,N,63025,\r
+N,N,N,N,N,N,N,N,N,N,31341,44618,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,31349,N,63027,N,N,N,N,N,N,31350,N,N,N,N,N,N,63030,N,N,N,N,31351,N,63031,\r
+63032,N,N,31352,N,N,63033,N,63034,N,N,N,N,N,N,N,N,N,31353,N,31354,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31355,31356,N,N,N,N,N,N,31357,N,63035,N,N,N,N,N,\r
+31358,63036,31521,N,N,63037,N,N,N,N,N,N,N,N,63038,N,N,N,31522,N,N,N,63039,N,N,\r
+N,N,31523,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63040,31524,N,N,N,N,31525,N,N,N,31526,N,\r
+N,N,N,63041,N,63042,N,N,N,63043,N,63045,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,63046,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31528,N,63047,N,\r
+N,N,N,63048,N,63049,63050,N,N,N,N,N,N,63051,63052,N,63053,N,N,31529,N,N,N,N,N,\r
+63055,N,N,N,N,N,N,N,N,N,N,31530,N,N,31531,N,N,63056,N,63057,N,N,N,63058,N,N,N,\r
+N,63059,N,N,N,31532,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63062,N,N,N,N,N,N,31533,\r
+N,N,N,N,N,N,N,63063,N,N,N,N,N,N,N,N,31534,N,N,N,N,31535,N,N,N,N,N,31536,N,N,N,\r
+63064,N,31537,N,31538,N,N,N,N,N,N,N,N,N,N,N,63066,63067,N,N,N,63068,N,N,N,N,N,\r
+N,N,N,63061,N,N,N,N,N,N,N,N,N,N,63070,N,N,63071,N,N,N,N,63072,63073,63074,N,N,\r
+N,N,N,N,N,N,63075,N,N,63076,63077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63078,N,N,31541,\r
+N,N,N,N,31542,63079,63080,N,N,N,N,N,63081,N,N,N,31543,N,N,31540,N,63082,N,N,N,\r
+N,N,N,N,N,N,63087,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63083,N,63088,N,63089,N,N,N,\r
+N,N,31544,N,N,N,N,63090,N,N,63091,63092,N,31545,N,N,N,N,N,N,N,N,N,N,63084,N,N,\r
+N,N,N,N,N,N,N,N,31548,63094,N,63095,N,63096,N,63097,N,N,N,N,63098,N,N,N,N,N,\r
+31549,N,N,31550,N,N,N,63099,N,N,N,N,N,N,N,N,N,63100,N,63101,N,N,31551,N,N,N,N,\r
+N,N,N,N,N,N,31547,N,N,31552,N,N,N,N,N,N,63267,N,N,N,N,63268,N,N,N,N,N,N,N,N,N,\r
+N,63269,N,N,63270,31553,N,N,31554,N,N,N,N,N,N,N,N,N,63271,63272,N,N,N,N,N,\r
+63273,N,63274,N,N,N,N,63275,N,N,N,N,N,N,31555,N,N,N,N,N,N,N,N,63276,N,N,N,N,N,\r
+N,N,N,31557,63277,N,N,N,31558,31559,N,N,N,N,N,N,N,N,N,N,31560,63278,31556,N,N,\r
+N,N,N,31562,N,N,N,N,N,63279,N,N,63280,N,N,63281,N,N,63282,N,31563,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,31564,63284,N,N,63285,N,N,N,63287,12136,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,63289,N,N,63290,31565,N,N,N,31566,N,N,N,N,N,N,31568,N,N,N,N,N,N,N,\r
+N,N,31570,N,N,63291,N,N,N,N,N,31571,N,63292,N,N,63293,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63294,N,63295,N,N,N,63296,N,N,N,63297,N,N,N,N,N,N,31572,N,N,N,63298,63299,N,N,\r
+N,N,N,N,N,N,N,N,63300,N,N,N,N,N,N,N,N,63302,N,63303,N,N,N,N,31573,N,N,N,N,N,N,\r
+N,N,63304,N,63305,N,N,N,N,N,N,N,N,N,N,N,N,N,63306,N,N,N,63307,N,63308,N,N,N,N,\r
+N,N,N,N,N,N,N,63309,N,N,63310,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31574,N,\r
+31575,31576,63312,N,63313,N,N,N,31577,N,N,63314,N,63315,N,N,63316,N,N,N,N,N,\r
+63317,N,N,N,N,N,63318,N,63319,N,63320,N,N,N,N,N,N,N,N,N,N,N,N,N,63321,N,N,N,N,\r
+N,N,N,N,63322,N,N,N,63323,N,63324,N,N,63325,N,N,N,N,N,N,N,N,N,N,N,N,N,63326,N,\r
+N,N,N,N,N,63327,N,N,N,N,N,N,N,N,N,N,N,63328,63329,N,N,N,N,N,N,N,N,N,N,N,31578,\r
+63330,N,N,N,N,N,N,N,N,N,63331,N,N,N,N,N,N,N,N,N,N,31579,31580,63335,N,63336,N,\r
+N,N,N,N,N,N,63337,N,N,N,N,N,N,N,N,N,N,N,N,63338,N,N,N,N,N,N,63334,N,N,N,N,\r
+31581,31582,N,N,N,N,N,N,N,31583,N,N,N,N,N,N,N,N,63341,N,N,63343,N,N,N,N,N,N,N,\r
+N,N,N,N,N,63344,N,N,N,N,N,N,N,31585,N,N,N,N,N,N,N,N,63346,N,N,N,63348,N,63349,\r
+63350,N,N,N,63351,63352,31586,63353,N,N,N,N,N,N,N,63345,63354,N,63355,N,N,\r
+31587,N,N,N,31588,63356,N,N,N,N,31589,N,N,63357,31590,N,N,N,N,N,N,N,N,N,N,\r
+31591,N,N,N,N,N,N,N,N,63358,N,N,N,N,N,63521,N,N,N,63522,N,N,N,N,N,N,N,N,N,\r
+63523,N,N,N,N,N,N,N,N,N,N,N,N,N,63525,N,N,N,N,N,N,N,N,N,N,N,N,N,63526,N,N,N,N,\r
+N,N,63527,N,N,N,N,63528,N,N,N,N,63531,N,N,N,N,N,63533,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31592,N,N,N,N,N,N,N,\r
+63534,N,N,N,N,N,N,N,N,N,31593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63535,63536,\r
+63537,N,63538,N,N,N,N,N,N,N,N,N,31594,N,N,N,31595,N,N,63541,63539,63542,N,N,N,\r
+N,N,N,N,63543,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63544,63545,N,N,N,31597,\r
+63547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31600,31601,31602,N,31598,N,\r
+N,N,N,N,N,N,N,N,N,31603,N,N,N,N,N,N,N,N,31604,N,31605,N,N,N,N,63549,N,31606,N,\r
+N,N,N,N,N,31607,N,63551,N,N,63552,N,N,N,63553,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,63556,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,63557,N,N,N,N,N,N,N,N,63558,N,N,N,N,N,N,63559,N,N,N,31608,N,N,N,N,N,N,N,N,N,\r
+N,63560,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63561,N,N,N,N,N,N,63562,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31610,N,63563,N,63564,N,N,N,N,N,N,N,\r
+N,N,N,N,N,31611,N,N,N,N,N,63565,N,N,N,N,N,63567,N,63568,N,N,31612,N,N,N,N,N,N,\r
+63569,N,63570,63572,31613,N,63573,31614,N,N,N,N,N,N,N,N,N,N,N,63575,31777,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63576,N,31778,N,N,N,N,N,N,63577,N,N,N,N,N,N,\r
+63578,N,31779,N,N,N,N,N,63579,31780,N,N,N,N,N,N,N,N,N,63580,N,N,N,N,31781,N,N,\r
+N,31782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31783,N,N,N,31784,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63582,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,31785,N,N,N,N,N,N,63581,N,N,N,N,N,N,N,N,63583,N,N,N,N,N,N,63584,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,31786,N,N,N,N,N,N,63585,N,N,N,N,N,N,N,31787,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,31788,N,31789,N,N,N,N,N,63586,63589,N,N,N,N,63588,\r
+N,N,63590,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63591,N,N,63592,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,63593,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63594,N,N,31793,N,N,N,N,N,N,\r
+N,N,N,N,63596,N,N,31794,N,N,N,N,31795,N,N,N,N,63597,N,N,N,N,N,N,N,N,N,N,31796,\r
+N,N,N,N,N,N,N,N,N,N,N,N,63598,N,N,N,N,N,N,N,N,63599,N,63600,N,N,N,N,N,N,N,N,N,\r
+63601,N,N,N,N,N,N,N,N,63602,63603,N,N,N,N,N,N,63604,31797,63605,63606,N,N,N,\r
+63608,N,N,N,N,N,N,N,63611,N,63612,N,31798,N,N,N,N,N,63613,N,N,N,N,63614,N,N,\r
+63777,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31799,63778,N,N,N,63779,N,N,N,N,N,63780,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63783,63782,N,N,N,\r
+N,N,63784,N,63786,N,N,N,N,N,N,N,N,63787,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63789,63788,N,N,\r
+63790,N,N,N,N,N,N,N,31801,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63792,63793,N,N,31802,N,\r
+N,N,31803,N,N,N,N,N,31804,63795,N,N,N,N,63796,N,N,N,31806,N,N,N,N,N,N,N,N,\r
+31807,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,63797,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63798,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,63799,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63800,N,N,N,N,N,N,\r
+N,N,31808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63802,N,63803,N,N,N,N,N,\r
+31809,N,N,31810,N,N,N,N,N,31811,N,63804,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63808,63809,N,N,N,N,N,63806,N,N,N,N,N,N,\r
+N,63811,N,63812,N,N,N,N,N,N,N,N,N,31812,63813,63814,31813,N,N,N,63815,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,63818,N,N,63819,N,N,N,31814,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63820,N,N,N,N,N,N,N,N,63821,N,N,N,N,N,N,N,N,N,N,N,N,N,63822,N,N,N,N,N,N,N,N,N,\r
+63823,63824,N,63825,31815,N,N,N,N,N,N,N,N,N,N,31816,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63826,N,N,N,N,N,63827,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,63828,N,N,N,N,63829,N,63830,63831,N,N,N,N,63832,N,N,N,N,31818,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,63834,N,N,63835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63837,31820,63839,N,N,N,N,N,N,N,63840,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,63841,N,N,N,N,N,N,31821,N,N,N,N,N,N,N,N,N,N,N,N,63842,N,\r
+31822,N,N,N,N,N,N,N,N,31823,N,N,N,N,N,N,N,N,N,63843,N,N,N,N,N,N,N,N,N,63844,N,\r
+N,N,N,N,N,N,N,N,31824,N,N,N,63845,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,63847,N,31826,N,N,N,N,N,N,N,N,N,N,N,N,N,63848,\r
+31827,63850,N,N,N,N,N,N,N,N,N,N,63852,N,N,N,N,63853,N,N,N,63855,N,N,63856,N,N,\r
+N,N,N,63857,N,63858,N,N,N,N,N,N,N,N,N,N,63859,N,N,N,31828,N,N,N,31829,N,N,N,N,\r
+N,31830,N,N,63860,N,N,N,63861,N,N,N,N,N,63862,63863,N,N,N,N,N,31831,N,N,N,\r
+63864,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31832,N,\r
+N,N,N,N,N,N,N,N,63865,N,N,N,N,N,N,N,N,N,N,N,63867,63868,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,63869,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64034,N,N,31834,N,N,N,64035,N,N,N,64036,N,N,N,\r
+N,31835,N,31836,N,31837,N,31838,N,N,N,N,N,64038,31839,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,64040,N,N,31840,N,N,64041,N,N,N,N,N,N,N,31841,N,N,N,N,64042,31842,31843,N,\r
+31844,64043,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31845,N,N,N,N,64045,31846,31847,64046,\r
+N,N,N,N,N,N,N,N,N,N,N,64051,N,N,N,31848,N,N,64049,N,31849,N,64048,N,N,N,N,N,N,\r
+N,64052,64053,64050,N,N,N,64054,N,64055,N,N,N,N,N,N,N,N,N,N,N,N,N,31851,31852,\r
+31853,N,64056,N,N,N,64057,N,64058,N,N,N,31854,31855,N,N,N,31856,N,N,N,N,N,N,N,\r
+31857,N,31858,N,N,31859,N,N,64059,N,64060,64061,N,N,31860,N,N,N,N,N,N,N,N,\r
+64062,64063,31861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64064,N,64065,N,31862,N,N,N,N,N,\r
+64066,N,N,64067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64068,N,N,N,N,64069,N,N,N,N,N,N,\r
+N,N,N,31863,N,64070,N,N,N,N,N,N,N,N,64071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31864,\r
+N,N,N,N,N,N,N,N,N,64072,N,N,N,31865,N,64073,N,N,31866,N,64074,N,N,64075,N,N,N,\r
+N,N,31867,N,N,N,N,N,N,64076,64077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31868,N,\r
+N,64078,N,N,N,N,N,N,N,N,N,31870,32033,N,N,N,N,N,N,64081,32034,64082,N,N,32035,\r
+N,N,N,N,N,N,N,N,N,31869,64083,N,N,N,N,N,32036,N,N,64084,N,N,N,N,N,32037,N,N,N,\r
+N,N,64085,64086,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64088,N,\r
+N,N,N,32038,32039,32040,N,32041,N,N,N,32042,N,64089,32043,N,N,N,64090,N,N,\r
+64091,N,N,N,64092,32044,N,64093,N,N,N,N,64094,N,N,64095,N,N,N,N,N,N,64096,\r
+64097,N,N,N,64098,N,64099,64100,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32045,N,N,N,\r
+64103,64104,N,64105,N,N,N,N,N,N,N,N,32046,64106,N,N,N,64107,N,N,N,N,N,N,N,N,N,\r
+64108,N,64109,N,N,N,N,N,64110,N,N,N,N,N,N,N,64111,N,N,N,64112,N,N,N,N,N,N,\r
+64115,N,N,N,N,N,N,N,N,N,N,N,N,64116,64117,N,32047,N,N,N,64118,N,N,N,N,32048,\r
+32049,N,64119,N,64120,N,N,32050,N,N,N,64121,N,64122,N,N,N,N,N,N,32051,N,N,N,N,\r
+64123,N,64124,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64290,N,64291,N,64292,N,N,N,32052,\r
+64293,N,32053,N,N,N,N,N,N,N,N,64294,N,N,N,64125,N,N,N,64295,N,N,N,N,N,N,N,\r
+64296,64297,32054,N,32055,N,N,N,32056,N,64298,N,64299,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64302,32057,32058,32059,N,N,N,N,N,N,64303,N,\r
+N,N,N,N,64304,N,N,64305,N,N,N,N,N,N,N,N,N,32060,32061,N,N,N,N,32062,64306,N,N,\r
+N,N,32063,64307,N,64308,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64312,N,N,\r
+64313,N,N,N,64314,N,N,N,N,N,N,N,N,N,N,N,32064,N,N,64315,N,N,64309,N,32065,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32066,N,N,N,N,N,N,64320,N,N,N,N,32067,\r
+64321,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64322,N,32068,32069,N,N,64323,N,\r
+N,N,N,64324,N,N,N,N,N,N,N,N,N,64319,N,N,N,64316,N,N,N,N,N,64329,N,32071,32070,\r
+N,N,N,N,64325,N,N,N,N,N,64326,N,N,N,N,N,N,64327,64328,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,64330,32072,64331,N,N,N,N,N,N,64332,N,N,N,N,N,N,N,\r
+N,N,64333,N,N,N,N,32073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32074,\r
+N,N,N,N,N,N,N,32075,N,64336,N,64337,N,32076,32077,64338,64339,N,N,N,N,N,N,N,N,\r
+N,N,N,N,64340,N,N,N,N,N,64341,64342,32078,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+32079,N,N,N,N,N,N,32080,N,N,32081,N,64344,32082,N,N,N,N,N,N,N,64345,N,32083,N,\r
+N,N,N,N,N,32084,N,N,N,N,N,N,N,N,N,N,64347,N,N,32085,N,N,N,N,32086,N,N,32087,N,\r
+N,N,N,N,N,32089,N,N,N,32090,64037,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64350,N,N,N,N,N,\r
+N,64351,64352,N,N,N,N,N,N,N,64354,N,N,N,N,64355,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,32091,N,N,N,N,N,N,N,N,64356,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,64358,N,32092,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,64360,N,N,32094,N,N,N,N,N,N,32095,32096,N,N,N,64363,N,N,N,N,N,64364,N,N,\r
+N,64365,N,N,N,N,N,N,64366,N,N,64367,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+32097,N,N,N,N,N,64370,N,64371,N,N,64372,32098,N,N,N,N,N,N,N,N,N,N,32100,N,N,N,\r
+N,N,32101,64374,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64375,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,32102,N,N,64377,N,N,N,N,32103,N,N,N,N,N,64378,N,N,N,N,N,64379,N,N,N,N,N,\r
+32104,32105,32106,N,N,N,N,N,64380,N,64381,N,N,32107,64382,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,64545,N,N,N,32108,N,N,N,N,32109,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,32110,64548,N,N,N,64549,N,N,N,64550,N,N,N,64551,N,\r
+N,N,N,N,N,N,N,N,N,N,32111,N,N,64552,64553,N,N,N,N,N,N,N,32112,N,N,N,64554,N,N,\r
+32113,N,N,N,N,N,N,N,32114,N,N,64555,N,N,N,N,64556,N,N,64557,N,N,N,64558,64559,\r
+N,32116,N,N,32115,N,N,64560,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64561,N,N,32117,\r
+64562,N,N,N,N,N,32119,N,N,64563,64564,N,N,N,N,N,64565,N,64566,N,N,N,N,N,N,N,\r
+32120,N,N,N,N,64569,N,64572,N,N,N,N,N,32121,N,N,N,N,32122,N,64570,64571,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64573,N,N,N,N,N,N,N,N,N,N,32124,32125,N,N,\r
+32126,32289,N,32290,32291,N,N,N,N,N,N,N,N,N,N,32293,64574,N,N,N,N,N,32294,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64575,N,64576,N,N,64577,N,N,N,N,N,N,\r
+64579,64580,N,32295,64581,64582,N,N,64583,N,N,64584,N,N,N,N,64585,32296,N,N,\r
+64586,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64587,64589,N,64590,N,64591,N,\r
+32297,N,N,64592,N,N,N,N,N,64593,64594,N,64595,64596,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64599,64600,N,N,64602,64603,64604,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64606,64607,64608,N,N,N,N,N,N,64609,64610,64611,N,N,N,64612,64613,N,N,N,N,\r
+64614,N,N,N,N,N,N,64615,64616,N,N,N,N,N,N,N,N,N,32298,N,N,N,64617,N,N,64618,\r
+64619,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32299,N,N,N,N,64620,N,N,\r
+64621,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64622,N,N,N,64623,N,64624,N,N,N,\r
+64625,N,N,N,N,N,64626,N,N,N,N,N,N,N,N,N,N,64627,N,N,N,N,64628,N,N,N,N,64629,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64631,N,N,N,N,N,N,N,N,64632,N,N,64633,32300,\r
+32301,N,N,N,N,N,N,64634,N,N,N,N,N,N,64635,N,N,N,N,64636,N,N,N,64637,N,N,N,N,N,\r
+64638,N,N,N,32302,N,N,N,N,N,N,N,N,32303,32304,N,N,64801,N,N,N,N,64802,N,32305,\r
+N,N,N,N,N,N,N,N,N,N,N,64803,N,N,N,N,N,32306,N,64804,N,32307,N,N,N,32308,N,N,N,\r
+N,N,64805,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,64807,N,N,N,N,N,N,32309,64809,N,64811,N,N,N,N,N,N,N,\r
+32310,N,32311,N,N,64813,N,N,N,N,N,N,N,32312,N,64814,N,64815,N,N,64816,32313,N,\r
+N,N,N,N,64818,N,N,N,64819,N,N,N,N,64820,N,N,N,64821,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,32314,32315,64822,N,N,N,N,32316,N,N,N,64823,N,N,N,64824,N,64825,N,N,N,\r
+64826,N,N,N,N,N,64827,N,N,N,32317,N,N,N,N,N,N,N,N,N,N,64828,N,32319,N,N,N,N,N,\r
+64829,N,N,N,N,N,N,N,N,N,64830,N,N,N,N,N,N,N,N,N,N,N,N,N,64832,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,32320,N,N,N,N,64833,N,64834,32322,N,N,N,N,64835,64836,N,N,\r
+N,N,N,32323,64837,N,32324,64838,64839,N,32321,N,N,N,N,N,N,N,N,N,N,32325,N,N,N,\r
+N,N,32326,N,N,N,N,32327,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32328,N,N,N,N,N,N,N,64840,\r
+32329,N,N,N,N,64841,N,N,N,N,64842,64845,N,N,N,N,N,64846,N,N,N,N,N,64847,N,N,\r
+32330,N,N,N,N,N,64848,N,N,N,N,N,N,32331,N,N,N,N,N,N,N,N,N,64850,N,N,N,N,64851,\r
+N,N,N,N,N,N,N,32332,N,64852,N,N,64853,64854,N,N,64856,64855,N,N,N,64849,N,N,N,\r
+64860,32333,N,64858,N,N,32334,32335,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64862,N,64863,64864,64865,N,N,64866,N,N,N,N,64867,32336,N,N,N,64868,N,64869,\r
+64870,N,N,N,N,N,N,64872,N,N,N,N,64873,64874,N,N,N,N,N,N,N,N,N,32337,N,N,N,\r
+64875,N,N,N,64878,64879,N,N,N,N,32338,32339,N,N,32340,64881,N,N,N,64882,N,N,\r
+64883,64876,64884,N,64885,N,N,N,32341,N,32342,N,N,N,64886,64887,64888,N,64889,\r
+64890,N,64891,N,64892,N,N,64893,N,32343,N,N,64894,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65057,N,N,N,N,N,N,N,N,N,N,N,65058,65060,N,N,N,N,\r
+N,N,N,N,65059,N,N,N,N,N,65062,N,N,N,N,N,65063,65064,N,N,N,N,32344,32345,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65068,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65070,\r
+32346,N,N,N,32347,N,N,65071,N,N,N,N,N,N,N,32348,N,N,N,N,N,N,N,N,N,N,N,N,65072,\r
+N,N,65073,32349,N,N,N,N,N,65075,N,65076,N,N,N,N,32350,N,N,65078,N,N,65079,\r
+65080,N,N,N,N,32351,N,65081,N,N,N,N,N,65082,N,N,N,N,N,32352,N,N,65083,N,N,N,N,\r
+N,N,N,N,32353,N,N,65084,N,N,N,N,N,N,N,65085,N,N,N,N,N,N,N,N,N,N,32355,N,N,N,N,\r
+N,N,N,N,65087,N,N,N,65088,N,N,32356,65089,N,65086,32354,N,N,65090,N,N,N,65091,\r
+N,65092,N,N,N,N,N,N,N,N,N,N,N,N,65093,32357,N,N,65094,N,N,N,N,65095,65096,N,N,\r
+65097,N,N,N,32359,N,N,N,N,N,N,N,N,N,N,N,N,65098,65101,N,N,N,N,32360,N,N,65100,\r
+N,N,65102,N,N,N,N,N,N,N,32361,N,N,N,65103,N,N,65104,65105,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,65106,32362,N,N,N,65108,N,N,N,N,65109,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,65110,N,N,32363,N,N,N,N,N,32364,N,N,N,65111,N,N,N,32365,N,N,32366,\r
+N,N,N,N,32367,32368,N,N,N,N,N,N,N,65113,N,N,N,N,N,32369,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,32370,N,N,N,N,N,N,N,N,N,N,N,N,N,65115,N,N,N,N,N,N,N,65116,N,N,N,N,N,N,\r
+65117,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65118,65119,65121,N,N,N,N,N,N,N,N,N,N,N,\r
+N,32371,N,N,N,N,N,N,65122,N,65123,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+65124,N,N,N,N,N,N,N,65125,N,32372,65126,N,N,65127,N,N,N,65128,N,N,N,65129,\r
+65130,N,N,N,N,N,N,N,N,N,N,N,N,65131,N,65132,N,32373,65133,N,N,N,N,65135,N,N,N,\r
+N,N,N,N,N,N,N,N,65137,N,N,N,65139,N,N,65140,N,N,N,N,65141,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32374,N,N,N,32375,N,N,32376,N,N,N,N,N,N,N,N,N,\r
+N,32377,30267,N,N,N,N,N,N,N,N,N,N,29742,30030,N,N,N,N,N,N,N,N,N,N,N,N,31567,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30281,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+32292,N,N,N,N,N,N,N,N,N,N,N,32093,12107,12119,20338,N,44665,30074,30554,30575,\r
+N,N,31036,31037,31041,N,N,N,31546,63288,63301,31790,N,63854,N,31850,N,N,N,N,N,\r
+N,N,N,N,11832,11849,11856,11875,11880,11886,12076,12079,12086,12122,12126,\r
+20321,20322,29776,29788,29790,29793,29992,29995,30019,30053,30313,30327,30501,\r
+30549,61481,30757,31015,31027,31028,31031,31032,31033,31035,31039,31040,31053,\r
+31057,31076,31278,62544,31283,31290,31300,31320,62836,62837,31527,31599,31609,\r
+31791,31792,31800,31805,63849,31833,32099,32118,32123,9022,9021,8752,N,N,N,N,\r
+8751,N,N,N,N,N,8753,\r
+};\r
+\r
+static const struct unim_index jisx0213_bmp_encmap[256] = {\r
+{__jisx0213_bmp_encmap+0,126,255},{__jisx0213_bmp_encmap+130,0,253},{\r
+__jisx0213_bmp_encmap+384,80,233},{__jisx0213_bmp_encmap+538,0,194},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_bmp_encmap+733,62,63\r
+},{__jisx0213_bmp_encmap+735,112,115},{__jisx0213_bmp_encmap+739,19,172},{\r
+__jisx0213_bmp_encmap+893,15,233},{__jisx0213_bmp_encmap+1112,5,219},{\r
+__jisx0213_bmp_encmap+1327,5,206},{__jisx0213_bmp_encmap+1529,35,254},{\r
+__jisx0213_bmp_encmap+1749,177,230},{__jisx0213_bmp_encmap+1803,0,110},{\r
+__jisx0213_bmp_encmap+1914,19,127},{0,0,0},{__jisx0213_bmp_encmap+2023,52,251\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_bmp_encmap+2223,\r
+22,255},{__jisx0213_bmp_encmap+2457,240,255},{__jisx0213_bmp_encmap+2473,49,\r
+250},{__jisx0213_bmp_encmap+2675,3,205},{__jisx0213_bmp_encmap+2878,2,219},{\r
+__jisx0213_bmp_encmap+3096,31,244},{__jisx0213_bmp_encmap+3310,5,207},{\r
+__jisx0213_bmp_encmap+3513,97,253},{__jisx0213_bmp_encmap+3670,0,250},{\r
+__jisx0213_bmp_encmap+3921,23,111},{__jisx0213_bmp_encmap+4010,110,234},{\r
+__jisx0213_bmp_encmap+4135,14,240},{__jisx0213_bmp_encmap+4362,15,210},{\r
+__jisx0213_bmp_encmap+4558,17,212},{__jisx0213_bmp_encmap+4754,5,148},{\r
+__jisx0213_bmp_encmap+4898,87,215},{__jisx0213_bmp_encmap+5027,57,147},{\r
+__jisx0213_bmp_encmap+5118,5,243},{__jisx0213_bmp_encmap+5357,7,221},{\r
+__jisx0213_bmp_encmap+5572,2,240},{__jisx0213_bmp_encmap+5811,8,212},{\r
+__jisx0213_bmp_encmap+6016,8,234},{__jisx0213_bmp_encmap+6243,15,175},{\r
+__jisx0213_bmp_encmap+6404,12,253},{__jisx0213_bmp_encmap+6646,22,181},{\r
+__jisx0213_bmp_encmap+6806,176,250},{__jisx0213_bmp_encmap+6881,4,188},{\r
+__jisx0213_bmp_encmap+7066,59,232},{__jisx0213_bmp_encmap+7240,23,209},{\r
+__jisx0213_bmp_encmap+7427,7,119},{__jisx0213_bmp_encmap+7540,2,255},{\r
+__jisx0213_bmp_encmap+7794,0,242},{__jisx0213_bmp_encmap+8037,0,243},{\r
+__jisx0213_bmp_encmap+8281,3,244},{__jisx0213_bmp_encmap+8523,1,251},{\r
+__jisx0213_bmp_encmap+8774,0,245},{__jisx0213_bmp_encmap+9020,18,255},{\r
+__jisx0213_bmp_encmap+9258,0,233},{__jisx0213_bmp_encmap+9492,7,247},{\r
+__jisx0213_bmp_encmap+9733,10,255},{__jisx0213_bmp_encmap+9979,4,244},{\r
+__jisx0213_bmp_encmap+10220,5,248},{__jisx0213_bmp_encmap+10464,12,245},{\r
+__jisx0213_bmp_encmap+10698,0,253},{__jisx0213_bmp_encmap+10952,3,244},{\r
+__jisx0213_bmp_encmap+11194,6,233},{__jisx0213_bmp_encmap+11422,0,253},{\r
+__jisx0213_bmp_encmap+11676,0,252},{__jisx0213_bmp_encmap+11929,13,248},{\r
+__jisx0213_bmp_encmap+12165,16,245},{__jisx0213_bmp_encmap+12395,21,253},{\r
+__jisx0213_bmp_encmap+12628,3,247},{__jisx0213_bmp_encmap+12873,9,255},{\r
+__jisx0213_bmp_encmap+13120,4,252},{__jisx0213_bmp_encmap+13369,0,251},{\r
+__jisx0213_bmp_encmap+13621,1,252},{__jisx0213_bmp_encmap+13873,1,252},{\r
+__jisx0213_bmp_encmap+14125,3,254},{__jisx0213_bmp_encmap+14377,15,253},{\r
+__jisx0213_bmp_encmap+14616,11,255},{__jisx0213_bmp_encmap+14861,2,251},{\r
+__jisx0213_bmp_encmap+15111,0,252},{__jisx0213_bmp_encmap+15364,23,251},{\r
+__jisx0213_bmp_encmap+15593,10,252},{__jisx0213_bmp_encmap+15836,0,236},{\r
+__jisx0213_bmp_encmap+16073,3,254},{__jisx0213_bmp_encmap+16325,0,251},{\r
+__jisx0213_bmp_encmap+16577,7,250},{__jisx0213_bmp_encmap+16821,1,255},{\r
+__jisx0213_bmp_encmap+17076,1,249},{__jisx0213_bmp_encmap+17325,0,252},{\r
+__jisx0213_bmp_encmap+17578,10,251},{__jisx0213_bmp_encmap+17820,5,254},{\r
+__jisx0213_bmp_encmap+18070,0,237},{__jisx0213_bmp_encmap+18308,3,253},{\r
+__jisx0213_bmp_encmap+18559,7,240},{__jisx0213_bmp_encmap+18793,1,245},{\r
+__jisx0213_bmp_encmap+19038,3,249},{__jisx0213_bmp_encmap+19285,8,154},{\r
+__jisx0213_bmp_encmap+19432,59,250},{__jisx0213_bmp_encmap+19624,2,251},{\r
+__jisx0213_bmp_encmap+19874,13,255},{__jisx0213_bmp_encmap+20117,4,254},{\r
+__jisx0213_bmp_encmap+20368,0,249},{__jisx0213_bmp_encmap+20618,1,253},{\r
+__jisx0213_bmp_encmap+20871,12,255},{__jisx0213_bmp_encmap+21115,0,253},{\r
+__jisx0213_bmp_encmap+21369,5,245},{__jisx0213_bmp_encmap+21610,1,245},{\r
+__jisx0213_bmp_encmap+21855,1,255},{__jisx0213_bmp_encmap+22110,17,252},{\r
+__jisx0213_bmp_encmap+22346,5,158},{__jisx0213_bmp_encmap+22500,57,254},{\r
+__jisx0213_bmp_encmap+22698,9,253},{__jisx0213_bmp_encmap+22943,6,250},{\r
+__jisx0213_bmp_encmap+23188,0,251},{__jisx0213_bmp_encmap+23440,2,255},{\r
+__jisx0213_bmp_encmap+23694,0,251},{__jisx0213_bmp_encmap+23946,1,255},{\r
+__jisx0213_bmp_encmap+24201,2,253},{__jisx0213_bmp_encmap+24453,4,114},{\r
+__jisx0213_bmp_encmap+24564,120,222},{__jisx0213_bmp_encmap+24667,29,239},{\r
+__jisx0213_bmp_encmap+24878,20,244},{__jisx0213_bmp_encmap+25103,4,243},{\r
+__jisx0213_bmp_encmap+25343,8,252},{__jisx0213_bmp_encmap+25588,2,249},{\r
+__jisx0213_bmp_encmap+25836,2,253},{__jisx0213_bmp_encmap+26088,0,242},{\r
+__jisx0213_bmp_encmap+26331,2,244},{__jisx0213_bmp_encmap+26574,2,255},{\r
+__jisx0213_bmp_encmap+26828,2,162},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_bmp_encmap+26989\r
+,29,220},{__jisx0213_bmp_encmap+27181,15,106},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0213_bmp_encmap+27273,69,70},{__jisx0213_bmp_encmap+27275,2,13},\r
+};\r
+\r
+static const ucs2_t __jisx0213_1_emp_decmap[340] = {\r
+11,4669,U,U,U,U,U,U,U,U,U,4891,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,5230,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,6333,2975,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,5812,U,U,U,U,U,U,U,U,U,U,7732,12740,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+13764,14143,U,U,U,U,U,U,U,U,14179,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,15614,18417,21646,21774,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22385,U,U,U,U,U,U,U,U,U,U,U,\r
+U,22980,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23969,27391,28224,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28916,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30340,33399,U,U,U,U,U,U,U,33741,41360,\r
+};\r
+\r
+static const struct dbcs_index jisx0213_1_emp_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0213_1_emp_decmap+0,34,34},{__jisx0213_1_emp_decmap+1,66,123},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{__jisx0213_1_emp_decmap+59,84,110},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_1_emp_decmap+86,58,114},{\r
+__jisx0213_1_emp_decmap+143,41,96},{__jisx0213_1_emp_decmap+199,108,108},{\r
+__jisx0213_1_emp_decmap+200,126,126},{__jisx0213_1_emp_decmap+201,41,110},{\r
+__jisx0213_1_emp_decmap+271,93,93},{__jisx0213_1_emp_decmap+272,51,108},{\r
+__jisx0213_1_emp_decmap+330,73,81},{0,0,0},{__jisx0213_1_emp_decmap+339,102,\r
+102},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const ucs2_t __jisx0213_2_emp_decmap[2053] = {\r
+137,U,U,U,U,U,U,U,U,U,162,U,U,164,U,U,U,U,U,U,U,418,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,531,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,811,U,U,U,U,U,U,897,U,881,1017,U,U,1098,U,1289,U,U,U,U,U,U,U,U,U,\r
+1494,1576,U,U,U,U,U,1871,U,U,U,U,U,U,2055,U,2106,U,U,U,U,U,U,U,U,2233,U,U,U,U,\r
+U,U,U,2428,2461,U,U,U,U,U,2771,U,U,2845,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,3397,3553,U,U,U,U,U,U,3733,3693,U,U,U,U,U,U,U,3684,U,U,3935,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,4609,U,U,4693,U,4731,U,U,U,\r
+U,4724,U,U,U,U,U,U,4836,4823,U,U,U,U,U,U,4861,U,4918,4932,5060,U,U,U,U,U,U,U,\r
+U,U,U,U,U,5229,U,U,U,U,U,U,U,U,U,U,U,5591,U,U,U,U,U,27689,U,U,5703,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,5894,5954,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,6595,7254,U,U,U,U,U,U,7469,7493,U,7544,7522,U,U,U,\r
+7585,7580,U,U,U,U,7570,U,U,7607,U,7648,7731,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+7966,U,U,U,U,U,U,U,U,U,U,8054,U,U,U,U,U,8186,8571,U,U,U,U,U,U,U,U,8990,U,U,U,\r
+U,9133,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,9971,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,10331,U,U,U,U,U,U,U,10411,U,U,U,U,10639,\r
+10936,U,U,U,U,11087,11088,U,U,U,U,U,U,U,11078,U,11293,11174,U,U,U,11300,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,11745,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12739,12789,12726,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,13170,U,13267,13266,U,U,U,U,13264,13284,\r
+13269,U,U,13274,U,13279,U,U,U,U,U,U,U,U,U,U,U,13386,13393,13387,U,U,U,13413,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,13540,13658,13716,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,13881,13895,U,13880,13882,U,U,U,U,U,U,U,U,U,U,\r
+14108,U,U,U,U,U,U,U,U,U,U,14092,U,U,U,U,U,U,U,14180,U,U,U,U,U,U,U,14335,14311,\r
+U,U,U,U,U,14372,U,U,U,U,14397,15000,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,15487,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,15616,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+15680,U,15866,15865,15827,16254,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,16534,\r
+U,U,U,U,U,16643,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,16838,U,U,16894,17340,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,17961,U,U,U,U,U,18085,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,18582,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,19021,19286,U,19311,U,U,U,U,19478,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,19732,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,19982,U,U,\r
+U,20023,U,U,U,U,20074,U,U,20107,U,U,U,U,U,U,U,U,U,U,U,20554,U,20565,U,U,20770,\r
+20905,U,20965,20941,U,U,U,21022,U,U,U,21068,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+21550,U,U,U,U,U,U,U,U,U,U,21721,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21927,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22441,22452,22996,U,U,U,U,U,U,U,\r
+U,U,U,23268,23267,U,23281,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23474,U,U,U,U,U,U,\r
+U,U,U,U,23627,23652,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24110,24150,24165,\r
+U,24162,U,U,U,24280,U,24258,24296,U,24355,U,U,24412,U,U,U,U,U,U,24544,24532,U,\r
+U,U,U,24588,24571,U,U,U,U,U,U,U,24599,U,U,U,U,24672,U,U,U,U,U,U,U,U,U,U,U,U,\r
+24813,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25200,U,25222,U,U,U,U,\r
+U,U,25420,U,U,15630,U,U,U,25602,26238,U,U,U,U,26288,U,U,U,U,U,U,U,U,U,U,U,\r
+26397,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26845,U,26858,U,26961,U,U,26991,U,27101,U,\r
+U,U,27166,U,U,U,U,U,U,27224,U,U,U,U,U,27276,U,U,27319,27763,U,U,U,U,U,U,U,U,U,\r
+27869,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28261,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,28564,U,U,U,U,U,U,U,U,28664,28662,28663,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,28941,U,U,28985,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29659,29658,U,U,U,U,U,29694,U,U,29712,U,U,U,U,\r
+29769,30229,30228,U,30257,U,U,U,U,U,U,U,30355,U,U,U,U,U,U,U,30478,U,30499,U,U,\r
+U,30546,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31109,U,U,U,U,U,U,U,U,U,U,U,U,\r
+31364,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31667,U,31678,31687,31928,U,U,U,U,\r
+U,U,U,U,U,32160,U,U,32272,U,U,U,U,U,U,32695,U,U,U,U,U,U,U,U,32906,U,U,U,U,U,\r
+32955,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33410,U,U,U,U,33523,U,U,U,U,U,U,U,33804,\r
+U,U,U,U,33877,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34155,U,U,U,34248,34249,U,U,U,U,U,U,\r
+U,U,U,U,34519,U,U,34554,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,35145,35142,U,U,U,U,U,U,35179,U,U,U,U,U,U,U,U,U,U,U,U,U,35207,35208,U,\r
+U,U,U,U,U,U,U,U,U,35258,35259,U,U,U,U,U,U,U,U,U,U,U,35358,35369,U,U,U,U,U,U,U,\r
+U,U,U,35441,35395,U,U,U,U,U,U,U,U,35481,35533,U,U,U,U,U,35556,35549,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,35777,35823,U,U,U,U,U,U,U,36112,U,U,36209,U,36347,36383,U,\r
+U,U,36406,U,U,U,36489,U,36587,U,36658,U,U,U,U,U,U,U,36856,37536,37553,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38032,U,U,U,U,U,U,U,U,U,38351,U,U,U,U,U,U,U,U,\r
+U,38527,U,U,U,U,U,U,U,U,U,38640,U,U,38681,U,U,U,38736,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,39110,39538,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,40411,40509,U,U,U,U,U,U,U,U,U,U,U,U,40469,U,40586,U,40521,U,\r
+U,U,U,U,U,U,U,U,40644,U,U,U,U,U,40681,U,U,40667,40910,U,U,U,41007,U,40986,U,U,\r
+U,U,U,U,41209,U,U,41090,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,8728,U,U,U,U,41868,U,42039,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,42481,U,\r
+42498,U,42522,U,U,U,42674,\r
+};\r
+\r
+static const struct dbcs_index jisx0213_2_emp_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_2_emp_decmap+0,33,121},{0,0,0},{\r
+__jisx0213_2_emp_decmap+89,34,119},{__jisx0213_2_emp_decmap+175,42,117},{\r
+__jisx0213_2_emp_decmap+251,37,126},{0,0,0},{0,0,0},{__jisx0213_2_emp_decmap+\r
+341,48,108},{0,0,0},{0,0,0},{0,0,0},{__jisx0213_2_emp_decmap+402,34,114},{\r
+__jisx0213_2_emp_decmap+483,36,125},{__jisx0213_2_emp_decmap+573,35,120},{\r
+__jisx0213_2_emp_decmap+659,42,117},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+__jisx0213_2_emp_decmap+735,35,96},{__jisx0213_2_emp_decmap+797,50,100},{\r
+__jisx0213_2_emp_decmap+848,34,123},{__jisx0213_2_emp_decmap+938,46,122},{\r
+__jisx0213_2_emp_decmap+1015,33,118},{__jisx0213_2_emp_decmap+1101,50,125},{\r
+__jisx0213_2_emp_decmap+1177,34,121},{__jisx0213_2_emp_decmap+1265,53,115},{\r
+__jisx0213_2_emp_decmap+1328,68,126},{__jisx0213_2_emp_decmap+1387,33,115},{\r
+__jisx0213_2_emp_decmap+1470,41,122},{__jisx0213_2_emp_decmap+1552,37,126},{\r
+__jisx0213_2_emp_decmap+1642,33,126},{__jisx0213_2_emp_decmap+1736,33,113},{\r
+__jisx0213_2_emp_decmap+1817,34,118},{__jisx0213_2_emp_decmap+1902,44,112},{\r
+__jisx0213_2_emp_decmap+1971,37,118},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __jisx0213_emp_encmap[8787] = {\r
+11810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,41249,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41259,N,41262,41270,41286,41328,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,41337,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41335,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41762,41765,41767,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,41777,41778,41784,41791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41793,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,41802,41810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,41811,41817,41820,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20308,41847,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42026,42042,N,N,N,\r
+N,N,N,N,N,42034,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,42033,42045,42073,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+12098,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42076,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42083,N,N,N,N,N,N,42078,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,42091,N,N,N,N,N,N,N,N,N,N,N,N,42090,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,42098,12108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,42100,N,N,N,N,N,N,N,N,N,N,N,N,N,42101,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42277,42290,\r
+12128,42302,42311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+20323,42325,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,42326,12155,42366,43056,\r
+43063,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43064,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43067,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,43066,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43077,N,N,N,N,N,\r
+N,N,N,N,43072,N,N,N,N,43071,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43080,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43082,43083,20334,43099,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43110,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+43116,44066,65107,44075,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44080,44112,44133,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,44141,44146,44324,44338,N,N,N,N,N,N,N,N,44329,44330,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,44341,44340,N,N,N,N,N,N,44345,44374,44580,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44413,30010,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44579,44602,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44610,\r
+N,44605,44604,N,44612,N,N,N,N,44615,N,N,N,N,44617,N,N,N,N,44611,44629,44631,N,\r
+N,N,N,N,44630,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44635,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+44663,44664,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44842,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30066,\r
+44866,44863,44867,N,N,N,N,N,N,N,N,N,N,N,N,44864,44889,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,44878,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,30249,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30258,44897,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44906,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44905,44912,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44917,\r
+60963,60980,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30304,61001,N,N,N,N,N,N,N,N,N,N,N,N,N,62581,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,61020,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,61024,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,61023,61022,61234,61255,61261,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61281,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61284,\r
+61474,61491,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,61497,30572,61523,61563,61742,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,61744,61749,61764,61789,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61793,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+61798,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61801,\r
+61813,N,N,N,N,N,N,N,N,N,N,61815,61818,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61985,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61988,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61987,61992,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,61996,\r
+62013,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62024,31017,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62043,31047,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,62069,N,N,N,N,N,N,N,N,N,N,62070,31060,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+62258,62270,62269,N,N,N,N,N,N,N,N,N,N,N,N,62272,62290,62301,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62302,31086,62323,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62324,N,N,N,N,N,N,N,N,N,N,N,\r
+62327,N,N,62325,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62333,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,62331,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62498,62500,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,62503,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,62511,N,N,N,N,N,N,N,N,N,N,N,62510,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62517,62516,N,N,N,N,N,N,N,N,N,N,62525,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62530,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62543,62569,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,62571,62578,62585,62773,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62778,62790,62806,N,N,\r
+N,N,N,N,N,N,N,N,N,N,62808,62810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,62813,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,62815,62819,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,62826,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,62832,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,62835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,31325,42308,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,63044,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63054,\r
+31539,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63069,63093,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63265,63266,63102,31561,\r
+63283,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,63286,63333,63332,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,63339,63342,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63347,\r
+63530,63529,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63532,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,31596,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63540,63548,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,63550,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63554,63574,63587,63607,N,N,N,N,N,N,N,N,N,N,\r
+63609,N,N,N,N,N,N,N,N,63610,63781,63791,63794,63801,63810,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63816,31817,N,N,N,N,N,N,N,N,N,N,63833,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,63838,31825,63846,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,63851,63866,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+63870,64033,64044,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,64047,64080,N,N,64079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64087,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64101,64102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64113,64114,64126,N,N,N,N,N,N,N,N,N,N,64289,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64301,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64300,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64310,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64311,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64318,N,N,N,N,N,N,\r
+64317,64334,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,64335,64343,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64346,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64348,64349,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,64353,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64357,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64359,64361,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,64369,64546,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64547,64568,64578,\r
+64588,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64598,64601,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64605,64630,64812,64843,64857,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64844,\r
+N,N,N,N,N,N,N,N,N,N,N,64861,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+64859,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,64871,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,64880,N,N,N,N,N,N,N,N,N,N,N,N,N,64877,65061,65067,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,65065,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65077,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65074,32358,65112,65114,65134,\r
+65136,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65138,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,65142,\r
+};\r
+\r
+static const struct unim_index jisx0213_emp_encmap[256] = {\r
+{__jisx0213_emp_encmap+0,11,164},{__jisx0213_emp_encmap+154,162,162},{\r
+__jisx0213_emp_encmap+155,19,19},{__jisx0213_emp_encmap+156,43,249},{\r
+__jisx0213_emp_encmap+363,74,74},{__jisx0213_emp_encmap+364,9,214},{\r
+__jisx0213_emp_encmap+570,40,40},{__jisx0213_emp_encmap+571,79,79},{\r
+__jisx0213_emp_encmap+572,7,185},{__jisx0213_emp_encmap+751,124,157},{\r
+__jisx0213_emp_encmap+785,211,211},{__jisx0213_emp_encmap+786,29,159},{0,0,0},\r
+{__jisx0213_emp_encmap+917,69,225},{__jisx0213_emp_encmap+1074,100,149},{\r
+__jisx0213_emp_encmap+1124,95,95},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+1125,\r
+1,253},{__jisx0213_emp_encmap+1378,27,196},{__jisx0213_emp_encmap+1548,109,110\r
+},{__jisx0213_emp_encmap+1550,215,215},{__jisx0213_emp_encmap+1551,71,180},{\r
+__jisx0213_emp_encmap+1661,6,66},{__jisx0213_emp_encmap+1722,189,189},{\r
+__jisx0213_emp_encmap+1723,195,195},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+\r
+1724,86,86},{__jisx0213_emp_encmap+1725,45,224},{__jisx0213_emp_encmap+1905,\r
+51,52},{__jisx0213_emp_encmap+1907,30,250},{0,0,0},{__jisx0213_emp_encmap+2128\r
+,123,123},{__jisx0213_emp_encmap+2129,24,24},{__jisx0213_emp_encmap+2130,30,\r
+173},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+2274,243,243},{0,0,0},{\r
+__jisx0213_emp_encmap+2275,91,171},{__jisx0213_emp_encmap+2356,143,143},{\r
+__jisx0213_emp_encmap+2357,184,184},{__jisx0213_emp_encmap+2358,70,166},{\r
+__jisx0213_emp_encmap+2455,29,36},{__jisx0213_emp_encmap+2463,225,225},{0,0,0\r
+},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+2464,182,245},{0,0,0},{\r
+__jisx0213_emp_encmap+2528,114,228},{__jisx0213_emp_encmap+2643,74,228},{\r
+__jisx0213_emp_encmap+2798,90,196},{__jisx0213_emp_encmap+2905,56,71},{\r
+__jisx0213_emp_encmap+2921,12,255},{__jisx0213_emp_encmap+3165,36,61},{0,0,0},\r
+{__jisx0213_emp_encmap+3191,152,152},{0,0,0},{__jisx0213_emp_encmap+3192,127,\r
+254},{__jisx0213_emp_encmap+3320,0,250},{0,0,0},{__jisx0213_emp_encmap+3571,\r
+126,126},{__jisx0213_emp_encmap+3572,150,150},{__jisx0213_emp_encmap+3573,3,\r
+254},{0,0,0},{__jisx0213_emp_encmap+3825,188,188},{0,0,0},{0,0,0},{\r
+__jisx0213_emp_encmap+3826,41,165},{__jisx0213_emp_encmap+3951,241,241},{\r
+__jisx0213_emp_encmap+3952,150,150},{0,0,0},{__jisx0213_emp_encmap+3953,77,77\r
+},{__jisx0213_emp_encmap+3954,86,111},{__jisx0213_emp_encmap+3980,22,22},{\r
+__jisx0213_emp_encmap+3981,20,20},{__jisx0213_emp_encmap+3982,14,139},{0,0,0},\r
+{__jisx0213_emp_encmap+4108,74,85},{__jisx0213_emp_encmap+4120,34,229},{\r
+__jisx0213_emp_encmap+4316,30,76},{0,0,0},{__jisx0213_emp_encmap+4363,46,217},\r
+{__jisx0213_emp_encmap+4535,14,167},{0,0,0},{__jisx0213_emp_encmap+4689,113,\r
+180},{0,0,0},{__jisx0213_emp_encmap+4757,196,212},{__jisx0213_emp_encmap+4774,\r
+227,241},{__jisx0213_emp_encmap+4789,178,178},{__jisx0213_emp_encmap+4790,75,\r
+100},{__jisx0213_emp_encmap+4816,161,161},{__jisx0213_emp_encmap+4817,46,232},\r
+{__jisx0213_emp_encmap+5004,35,251},{__jisx0213_emp_encmap+5221,12,237},{0,0,0\r
+},{__jisx0213_emp_encmap+5447,112,134},{__jisx0213_emp_encmap+5470,76,76},{\r
+__jisx0213_emp_encmap+5471,2,2},{0,0,0},{__jisx0213_emp_encmap+5472,126,176},{\r
+__jisx0213_emp_encmap+5523,29,29},{__jisx0213_emp_encmap+5524,221,234},{\r
+__jisx0213_emp_encmap+5538,81,221},{__jisx0213_emp_encmap+5679,30,255},{0,0,0\r
+},{__jisx0213_emp_encmap+5905,41,221},{0,0,0},{__jisx0213_emp_encmap+6086,64,\r
+101},{__jisx0213_emp_encmap+6124,148,248},{__jisx0213_emp_encmap+6225,244,244\r
+},{__jisx0213_emp_encmap+6226,13,57},{0,0,0},{__jisx0213_emp_encmap+6271,218,\r
+254},{__jisx0213_emp_encmap+6308,16,73},{0,0,0},{__jisx0213_emp_encmap+6366,\r
+20,147},{__jisx0213_emp_encmap+6494,14,82},{0,0,0},{__jisx0213_emp_encmap+6563\r
+,133,133},{__jisx0213_emp_encmap+6564,132,132},{__jisx0213_emp_encmap+6565,\r
+179,199},{__jisx0213_emp_encmap+6586,184,184},{__jisx0213_emp_encmap+6587,160,\r
+160},{__jisx0213_emp_encmap+6588,16,16},{__jisx0213_emp_encmap+6589,183,183},{\r
+__jisx0213_emp_encmap+6590,138,187},{0,0,0},{__jisx0213_emp_encmap+6640,119,\r
+243},{__jisx0213_emp_encmap+6765,205,205},{__jisx0213_emp_encmap+6766,12,85},{\r
+__jisx0213_emp_encmap+6840,107,201},{__jisx0213_emp_encmap+6935,215,250},{0,0,\r
+0},{0,0,0},{__jisx0213_emp_encmap+6971,70,187},{__jisx0213_emp_encmap+7089,30,\r
+228},{__jisx0213_emp_encmap+7288,193,239},{0,0,0},{__jisx0213_emp_encmap+7335,\r
+16,251},{__jisx0213_emp_encmap+7571,31,235},{__jisx0213_emp_encmap+7776,50,248\r
+},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+7975,160,177},{0,0,0},{\r
+__jisx0213_emp_encmap+7993,144,144},{__jisx0213_emp_encmap+7994,207,207},{\r
+__jisx0213_emp_encmap+7995,127,240},{__jisx0213_emp_encmap+8109,25,80},{\r
+__jisx0213_emp_encmap+8165,198,198},{0,0,0},{__jisx0213_emp_encmap+8166,114,\r
+114},{0,0,0},{0,0,0},{__jisx0213_emp_encmap+8167,219,219},{\r
+__jisx0213_emp_encmap+8168,21,233},{__jisx0213_emp_encmap+8381,206,206},{\r
+__jisx0213_emp_encmap+8382,26,249},{__jisx0213_emp_encmap+8606,144,144},{0,0,0\r
+},{__jisx0213_emp_encmap+8607,140,140},{__jisx0213_emp_encmap+8608,55,55},{\r
+__jisx0213_emp_encmap+8609,241,241},{__jisx0213_emp_encmap+8610,2,178},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},\r
+};\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_kr.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_kr.h
new file mode 100644 (file)
index 0000000..31f66d5
--- /dev/null
@@ -0,0 +1,3251 @@
+static const ucs2_t __ksx1001_decmap[8264] = {\r
+12288,12289,12290,183,8229,8230,168,12291,173,8213,8741,65340,8764,8216,8217,\r
+8220,8221,12308,12309,12296,12297,12298,12299,12300,12301,12302,12303,12304,\r
+12305,177,215,247,8800,8804,8805,8734,8756,176,8242,8243,8451,8491,65504,\r
+65505,65509,9794,9792,8736,8869,8978,8706,8711,8801,8786,167,8251,9734,9733,\r
+9675,9679,9678,9671,9670,9633,9632,9651,9650,9661,9660,8594,8592,8593,8595,\r
+8596,12307,8810,8811,8730,8765,8733,8757,8747,8748,8712,8715,8838,8839,8834,\r
+8835,8746,8745,8743,8744,65506,8658,8660,8704,8707,180,65374,711,728,733,730,\r
+729,184,731,161,191,720,8750,8721,8719,164,8457,8240,9665,9664,9655,9654,9828,\r
+9824,9825,9829,9831,9827,8857,9672,9635,9680,9681,9618,9636,9637,9640,9639,\r
+9638,9641,9832,9743,9742,9756,9758,182,8224,8225,8597,8599,8601,8598,8600,\r
+9837,9833,9834,9836,12927,12828,8470,13255,8482,13250,13272,8481,8364,174,\r
+65281,65282,65283,65284,65285,65286,65287,65288,65289,65290,65291,65292,65293,\r
+65294,65295,65296,65297,65298,65299,65300,65301,65302,65303,65304,65305,65306,\r
+65307,65308,65309,65310,65311,65312,65313,65314,65315,65316,65317,65318,65319,\r
+65320,65321,65322,65323,65324,65325,65326,65327,65328,65329,65330,65331,65332,\r
+65333,65334,65335,65336,65337,65338,65339,65510,65341,65342,65343,65344,65345,\r
+65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,65357,65358,\r
+65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,65370,65371,\r
+65372,65373,65507,12593,12594,12595,12596,12597,12598,12599,12600,12601,12602,\r
+12603,12604,12605,12606,12607,12608,12609,12610,12611,12612,12613,12614,12615,\r
+12616,12617,12618,12619,12620,12621,12622,12623,12624,12625,12626,12627,12628,\r
+12629,12630,12631,12632,12633,12634,12635,12636,12637,12638,12639,12640,12641,\r
+12642,12643,12644,12645,12646,12647,12648,12649,12650,12651,12652,12653,12654,\r
+12655,12656,12657,12658,12659,12660,12661,12662,12663,12664,12665,12666,12667,\r
+12668,12669,12670,12671,12672,12673,12674,12675,12676,12677,12678,12679,12680,\r
+12681,12682,12683,12684,12685,12686,8560,8561,8562,8563,8564,8565,8566,8567,\r
+8568,8569,U,U,U,U,U,8544,8545,8546,8547,8548,8549,8550,8551,8552,8553,U,U,U,U,\r
+U,U,U,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,\r
+932,933,934,935,936,937,U,U,U,U,U,U,U,U,945,946,947,948,949,950,951,952,953,\r
+954,955,956,957,958,959,960,961,963,964,965,966,967,968,969,9472,9474,9484,\r
+9488,9496,9492,9500,9516,9508,9524,9532,9473,9475,9487,9491,9499,9495,9507,\r
+9523,9515,9531,9547,9504,9519,9512,9527,9535,9501,9520,9509,9528,9538,9490,\r
+9489,9498,9497,9494,9493,9486,9485,9502,9503,9505,9506,9510,9511,9513,9514,\r
+9517,9518,9521,9522,9525,9526,9529,9530,9533,9534,9536,9537,9539,9540,9541,\r
+9542,9543,9544,9545,9546,13205,13206,13207,8467,13208,13252,13219,13220,13221,\r
+13222,13209,13210,13211,13212,13213,13214,13215,13216,13217,13218,13258,13197,\r
+13198,13199,13263,13192,13193,13256,13223,13224,13232,13233,13234,13235,13236,\r
+13237,13238,13239,13240,13241,13184,13185,13186,13187,13188,13242,13243,13244,\r
+13245,13246,13247,13200,13201,13202,13203,13204,8486,13248,13249,13194,13195,\r
+13196,13270,13253,13229,13230,13231,13275,13225,13226,13227,13228,13277,13264,\r
+13267,13251,13257,13276,13254,198,208,170,294,U,306,U,319,321,216,338,186,222,\r
+358,330,U,12896,12897,12898,12899,12900,12901,12902,12903,12904,12905,12906,\r
+12907,12908,12909,12910,12911,12912,12913,12914,12915,12916,12917,12918,12919,\r
+12920,12921,12922,12923,9424,9425,9426,9427,9428,9429,9430,9431,9432,9433,\r
+9434,9435,9436,9437,9438,9439,9440,9441,9442,9443,9444,9445,9446,9447,9448,\r
+9449,9312,9313,9314,9315,9316,9317,9318,9319,9320,9321,9322,9323,9324,9325,\r
+9326,189,8531,8532,188,190,8539,8540,8541,8542,230,273,240,295,305,307,312,\r
+320,322,248,339,223,254,359,331,329,12800,12801,12802,12803,12804,12805,12806,\r
+12807,12808,12809,12810,12811,12812,12813,12814,12815,12816,12817,12818,12819,\r
+12820,12821,12822,12823,12824,12825,12826,12827,9372,9373,9374,9375,9376,9377,\r
+9378,9379,9380,9381,9382,9383,9384,9385,9386,9387,9388,9389,9390,9391,9392,\r
+9393,9394,9395,9396,9397,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,\r
+9342,9343,9344,9345,9346,185,178,179,8308,8319,8321,8322,8323,8324,12353,\r
+12354,12355,12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,\r
+12367,12368,12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,\r
+12380,12381,12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,\r
+12393,12394,12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,\r
+12406,12407,12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,\r
+12419,12420,12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,\r
+12432,12433,12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,\r
+12458,12459,12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,\r
+12471,12472,12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,\r
+12484,12485,12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,\r
+12497,12498,12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,\r
+12510,12511,12512,12513,12514,12515,12516,12517,12518,12519,12520,12521,12522,\r
+12523,12524,12525,12526,12527,12528,12529,12530,12531,12532,12533,12534,1040,\r
+1041,1042,1043,1044,1045,1025,1046,1047,1048,1049,1050,1051,1052,1053,1054,\r
+1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,\r
+1070,1071,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,1072,1073,1074,1075,1076,1077,1105,\r
+1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,\r
+1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,44032,44033,44036,\r
+44039,44040,44041,44042,44048,44049,44050,44051,44052,44053,44054,44055,44057,\r
+44058,44059,44060,44061,44064,44068,44076,44077,44079,44080,44081,44088,44089,\r
+44092,44096,44107,44109,44116,44120,44124,44144,44145,44148,44151,44152,44154,\r
+44160,44161,44163,44164,44165,44166,44169,44170,44171,44172,44176,44180,44188,\r
+44189,44191,44192,44193,44200,44201,44202,44204,44207,44208,44216,44217,44219,\r
+44220,44221,44225,44228,44232,44236,44245,44247,44256,44257,44260,44263,44264,\r
+44266,44268,44271,44272,44273,44275,44277,44278,44284,44285,44288,44292,44294,\r
+44300,44301,44303,44305,44312,44316,44320,44329,44332,44333,44340,44341,44344,\r
+44348,44356,44357,44359,44361,44368,44372,44376,44385,44387,44396,44397,44400,\r
+44403,44404,44405,44406,44411,44412,44413,44415,44417,44418,44424,44425,44428,\r
+44432,44444,44445,44452,44471,44480,44481,44484,44488,44496,44497,44499,44508,\r
+44512,44516,44536,44537,44540,44543,44544,44545,44552,44553,44555,44557,44564,\r
+44592,44593,44596,44599,44600,44602,44608,44609,44611,44613,44614,44618,44620,\r
+44621,44622,44624,44628,44630,44636,44637,44639,44640,44641,44645,44648,44649,\r
+44652,44656,44664,44665,44667,44668,44669,44676,44677,44684,44732,44733,44734,\r
+44736,44740,44748,44749,44751,44752,44753,44760,44761,44764,44776,44779,44781,\r
+44788,44792,44796,44807,44808,44813,44816,44844,44845,44848,44850,44852,44860,\r
+44861,44863,44865,44866,44867,44872,44873,44880,44892,44893,44900,44901,44921,\r
+44928,44932,44936,44944,44945,44949,44956,44984,44985,44988,44992,44999,45000,\r
+45001,45003,45005,45006,45012,45020,45032,45033,45040,45041,45044,45048,45056,\r
+45057,45060,45068,45072,45076,45084,45085,45096,45124,45125,45128,45130,45132,\r
+45134,45139,45140,45141,45143,45145,45149,45180,45181,45184,45188,45196,45197,\r
+45199,45201,45208,45209,45210,45212,45215,45216,45217,45218,45224,45225,45227,\r
+45228,45229,45230,45231,45233,45235,45236,45237,45240,45244,45252,45253,45255,\r
+45256,45257,45264,45265,45268,45272,45280,45285,45320,45321,45323,45324,45328,\r
+45330,45331,45336,45337,45339,45340,45341,45347,45348,45349,45352,45356,45364,\r
+45365,45367,45368,45369,45376,45377,45380,45384,45392,45393,45396,45397,45400,\r
+45404,45408,45432,45433,45436,45440,45442,45448,45449,45451,45453,45458,45459,\r
+45460,45464,45468,45480,45516,45520,45524,45532,45533,45535,45544,45545,45548,\r
+45552,45561,45563,45565,45572,45573,45576,45579,45580,45588,45589,45591,45593,\r
+45600,45620,45628,45656,45660,45664,45672,45673,45684,45685,45692,45700,45701,\r
+45705,45712,45713,45716,45720,45721,45722,45728,45729,45731,45733,45734,45738,\r
+45740,45744,45748,45768,45769,45772,45776,45778,45784,45785,45787,45789,45794,\r
+45796,45797,45798,45800,45803,45804,45805,45806,45807,45811,45812,45813,45815,\r
+45816,45817,45818,45819,45823,45824,45825,45828,45832,45840,45841,45843,45844,\r
+45845,45852,45908,45909,45910,45912,45915,45916,45918,45919,45924,45925,45927,\r
+45929,45931,45934,45936,45937,45940,45944,45952,45953,45955,45956,45957,45964,\r
+45968,45972,45984,45985,45992,45996,46020,46021,46024,46027,46028,46030,46032,\r
+46036,46037,46039,46041,46043,46045,46048,46052,46056,46076,46096,46104,46108,\r
+46112,46120,46121,46123,46132,46160,46161,46164,46168,46176,46177,46179,46181,\r
+46188,46208,46216,46237,46244,46248,46252,46261,46263,46265,46272,46276,46280,\r
+46288,46293,46300,46301,46304,46307,46308,46310,46316,46317,46319,46321,46328,\r
+46356,46357,46360,46363,46364,46372,46373,46375,46376,46377,46378,46384,46385,\r
+46388,46392,46400,46401,46403,46404,46405,46411,46412,46413,46416,46420,46428,\r
+46429,46431,46432,46433,46496,46497,46500,46504,46506,46507,46512,46513,46515,\r
+46516,46517,46523,46524,46525,46528,46532,46540,46541,46543,46544,46545,46552,\r
+46572,46608,46609,46612,46616,46629,46636,46644,46664,46692,46696,46748,46749,\r
+46752,46756,46763,46764,46769,46804,46832,46836,46840,46848,46849,46853,46888,\r
+46889,46892,46895,46896,46904,46905,46907,46916,46920,46924,46932,46933,46944,\r
+46948,46952,46960,46961,46963,46965,46972,46973,46976,46980,46988,46989,46991,\r
+46992,46993,46994,46998,46999,47000,47001,47004,47008,47016,47017,47019,47020,\r
+47021,47028,47029,47032,47047,47049,47084,47085,47088,47092,47100,47101,47103,\r
+47104,47105,47111,47112,47113,47116,47120,47128,47129,47131,47133,47140,47141,\r
+47144,47148,47156,47157,47159,47160,47161,47168,47172,47185,47187,47196,47197,\r
+47200,47204,47212,47213,47215,47217,47224,47228,47245,47272,47280,47284,47288,\r
+47296,47297,47299,47301,47308,47312,47316,47325,47327,47329,47336,47337,47340,\r
+47344,47352,47353,47355,47357,47364,47384,47392,47420,47421,47424,47428,47436,\r
+47439,47441,47448,47449,47452,47456,47464,47465,47467,47469,47476,47477,47480,\r
+47484,47492,47493,47495,47497,47498,47501,47502,47532,47533,47536,47540,47548,\r
+47549,47551,47553,47560,47561,47564,47566,47567,47568,47569,47570,47576,47577,\r
+47579,47581,47582,47585,47587,47588,47589,47592,47596,47604,47605,47607,47608,\r
+47609,47610,47616,47617,47624,47637,47672,47673,47676,47680,47682,47688,47689,\r
+47691,47693,47694,47699,47700,47701,47704,47708,47716,47717,47719,47720,47721,\r
+47728,47729,47732,47736,47747,47748,47749,47751,47756,47784,47785,47787,47788,\r
+47792,47794,47800,47801,47803,47805,47812,47816,47832,47833,47868,47872,47876,\r
+47885,47887,47889,47896,47900,47904,47913,47915,47924,47925,47926,47928,47931,\r
+47932,47933,47934,47940,47941,47943,47945,47949,47951,47952,47956,47960,47969,\r
+47971,47980,48008,48012,48016,48036,48040,48044,48052,48055,48064,48068,48072,\r
+48080,48083,48120,48121,48124,48127,48128,48130,48136,48137,48139,48140,48141,\r
+48143,48145,48148,48149,48150,48151,48152,48155,48156,48157,48158,48159,48164,\r
+48165,48167,48169,48173,48176,48177,48180,48184,48192,48193,48195,48196,48197,\r
+48201,48204,48205,48208,48221,48260,48261,48264,48267,48268,48270,48276,48277,\r
+48279,48281,48282,48288,48289,48292,48295,48296,48304,48305,48307,48308,48309,\r
+48316,48317,48320,48324,48333,48335,48336,48337,48341,48344,48348,48372,48373,\r
+48374,48376,48380,48388,48389,48391,48393,48400,48404,48420,48428,48448,48456,\r
+48457,48460,48464,48472,48473,48484,48488,48512,48513,48516,48519,48520,48521,\r
+48522,48528,48529,48531,48533,48537,48538,48540,48548,48560,48568,48596,48597,\r
+48600,48604,48617,48624,48628,48632,48640,48643,48645,48652,48653,48656,48660,\r
+48668,48669,48671,48708,48709,48712,48716,48718,48724,48725,48727,48729,48730,\r
+48731,48736,48737,48740,48744,48746,48752,48753,48755,48756,48757,48763,48764,\r
+48765,48768,48772,48780,48781,48783,48784,48785,48792,48793,48808,48848,48849,\r
+48852,48855,48856,48864,48867,48868,48869,48876,48897,48904,48905,48920,48921,\r
+48923,48924,48925,48960,48961,48964,48968,48976,48977,48981,49044,49072,49093,\r
+49100,49101,49104,49108,49116,49119,49121,49212,49233,49240,49244,49248,49256,\r
+49257,49296,49297,49300,49304,49312,49313,49315,49317,49324,49325,49327,49328,\r
+49331,49332,49333,49334,49340,49341,49343,49344,49345,49349,49352,49353,49356,\r
+49360,49368,49369,49371,49372,49373,49380,49381,49384,49388,49396,49397,49399,\r
+49401,49408,49412,49416,49424,49429,49436,49437,49438,49439,49440,49443,49444,\r
+49446,49447,49452,49453,49455,49456,49457,49462,49464,49465,49468,49472,49480,\r
+49481,49483,49484,49485,49492,49493,49496,49500,49508,49509,49511,49512,49513,\r
+49520,49524,49528,49541,49548,49549,49550,49552,49556,49558,49564,49565,49567,\r
+49569,49573,49576,49577,49580,49584,49597,49604,49608,49612,49620,49623,49624,\r
+49632,49636,49640,49648,49649,49651,49660,49661,49664,49668,49676,49677,49679,\r
+49681,49688,49689,49692,49695,49696,49704,49705,49707,49709,49711,49713,49714,\r
+49716,49736,49744,49745,49748,49752,49760,49765,49772,49773,49776,49780,49788,\r
+49789,49791,49793,49800,49801,49808,49816,49819,49821,49828,49829,49832,49836,\r
+49837,49844,49845,49847,49849,49884,49885,49888,49891,49892,49899,49900,49901,\r
+49903,49905,49910,49912,49913,49915,49916,49920,49928,49929,49932,49933,49939,\r
+49940,49941,49944,49948,49956,49957,49960,49961,49989,50024,50025,50028,50032,\r
+50034,50040,50041,50044,50045,50052,50056,50060,50112,50136,50137,50140,50143,\r
+50144,50146,50152,50153,50157,50164,50165,50168,50184,50192,50212,50220,50224,\r
+50228,50236,50237,50248,50276,50277,50280,50284,50292,50293,50297,50304,50324,\r
+50332,50360,50364,50409,50416,50417,50420,50424,50426,50431,50432,50433,50444,\r
+50448,50452,50460,50472,50473,50476,50480,50488,50489,50491,50493,50500,50501,\r
+50504,50505,50506,50508,50509,50510,50515,50516,50517,50519,50520,50521,50525,\r
+50526,50528,50529,50532,50536,50544,50545,50547,50548,50549,50556,50557,50560,\r
+50564,50567,50572,50573,50575,50577,50581,50583,50584,50588,50592,50601,50612,\r
+50613,50616,50617,50619,50620,50621,50622,50628,50629,50630,50631,50632,50633,\r
+50634,50636,50638,50640,50641,50644,50648,50656,50657,50659,50661,50668,50669,\r
+50670,50672,50676,50678,50679,50684,50685,50686,50687,50688,50689,50693,50694,\r
+50695,50696,50700,50704,50712,50713,50715,50716,50724,50725,50728,50732,50733,\r
+50734,50736,50739,50740,50741,50743,50745,50747,50752,50753,50756,50760,50768,\r
+50769,50771,50772,50773,50780,50781,50784,50796,50799,50801,50808,50809,50812,\r
+50816,50824,50825,50827,50829,50836,50837,50840,50844,50852,50853,50855,50857,\r
+50864,50865,50868,50872,50873,50874,50880,50881,50883,50885,50892,50893,50896,\r
+50900,50908,50909,50912,50913,50920,50921,50924,50928,50936,50937,50941,50948,\r
+50949,50952,50956,50964,50965,50967,50969,50976,50977,50980,50984,50992,50993,\r
+50995,50997,50999,51004,51005,51008,51012,51018,51020,51021,51023,51025,51026,\r
+51027,51028,51029,51030,51031,51032,51036,51040,51048,51051,51060,51061,51064,\r
+51068,51069,51070,51075,51076,51077,51079,51080,51081,51082,51086,51088,51089,\r
+51092,51094,51095,51096,51098,51104,51105,51107,51108,51109,51110,51116,51117,\r
+51120,51124,51132,51133,51135,51136,51137,51144,51145,51148,51150,51152,51160,\r
+51165,51172,51176,51180,51200,51201,51204,51208,51210,51216,51217,51219,51221,\r
+51222,51228,51229,51232,51236,51244,51245,51247,51249,51256,51260,51264,51272,\r
+51273,51276,51277,51284,51312,51313,51316,51320,51322,51328,51329,51331,51333,\r
+51334,51335,51339,51340,51341,51348,51357,51359,51361,51368,51388,51389,51396,\r
+51400,51404,51412,51413,51415,51417,51424,51425,51428,51445,51452,51453,51456,\r
+51460,51461,51462,51468,51469,51471,51473,51480,51500,51508,51536,51537,51540,\r
+51544,51552,51553,51555,51564,51568,51572,51580,51592,51593,51596,51600,51608,\r
+51609,51611,51613,51648,51649,51652,51655,51656,51658,51664,51665,51667,51669,\r
+51670,51673,51674,51676,51677,51680,51682,51684,51687,51692,51693,51695,51696,\r
+51697,51704,51705,51708,51712,51720,51721,51723,51724,51725,51732,51736,51753,\r
+51788,51789,51792,51796,51804,51805,51807,51808,51809,51816,51837,51844,51864,\r
+51900,51901,51904,51908,51916,51917,51919,51921,51923,51928,51929,51936,51948,\r
+51956,51976,51984,51988,51992,52000,52001,52033,52040,52041,52044,52048,52056,\r
+52057,52061,52068,52088,52089,52124,52152,52180,52196,52199,52201,52236,52237,\r
+52240,52244,52252,52253,52257,52258,52263,52264,52265,52268,52270,52272,52280,\r
+52281,52283,52284,52285,52286,52292,52293,52296,52300,52308,52309,52311,52312,\r
+52313,52320,52324,52326,52328,52336,52341,52376,52377,52380,52384,52392,52393,\r
+52395,52396,52397,52404,52405,52408,52412,52420,52421,52423,52425,52432,52436,\r
+52452,52460,52464,52481,52488,52489,52492,52496,52504,52505,52507,52509,52516,\r
+52520,52524,52537,52572,52576,52580,52588,52589,52591,52593,52600,52616,52628,\r
+52629,52632,52636,52644,52645,52647,52649,52656,52676,52684,52688,52712,52716,\r
+52720,52728,52729,52731,52733,52740,52744,52748,52756,52761,52768,52769,52772,\r
+52776,52784,52785,52787,52789,52824,52825,52828,52831,52832,52833,52840,52841,\r
+52843,52845,52852,52853,52856,52860,52868,52869,52871,52873,52880,52881,52884,\r
+52888,52896,52897,52899,52900,52901,52908,52909,52929,52964,52965,52968,52971,\r
+52972,52980,52981,52983,52984,52985,52992,52993,52996,53000,53008,53009,53011,\r
+53013,53020,53024,53028,53036,53037,53039,53040,53041,53048,53076,53077,53080,\r
+53084,53092,53093,53095,53097,53104,53105,53108,53112,53120,53125,53132,53153,\r
+53160,53168,53188,53216,53217,53220,53224,53232,53233,53235,53237,53244,53248,\r
+53252,53265,53272,53293,53300,53301,53304,53308,53316,53317,53319,53321,53328,\r
+53332,53336,53344,53356,53357,53360,53364,53372,53373,53377,53412,53413,53416,\r
+53420,53428,53429,53431,53433,53440,53441,53444,53448,53449,53456,53457,53459,\r
+53460,53461,53468,53469,53472,53476,53484,53485,53487,53488,53489,53496,53517,\r
+53552,53553,53556,53560,53562,53568,53569,53571,53572,53573,53580,53581,53584,\r
+53588,53596,53597,53599,53601,53608,53612,53628,53636,53640,53664,53665,53668,\r
+53672,53680,53681,53683,53685,53690,53692,53696,53720,53748,53752,53767,53769,\r
+53776,53804,53805,53808,53812,53820,53821,53823,53825,53832,53852,53860,53888,\r
+53889,53892,53896,53904,53905,53909,53916,53920,53924,53932,53937,53944,53945,\r
+53948,53951,53952,53954,53960,53961,53963,53972,53976,53980,53988,53989,54000,\r
+54001,54004,54008,54016,54017,54019,54021,54028,54029,54030,54032,54036,54038,\r
+54044,54045,54047,54048,54049,54053,54056,54057,54060,54064,54072,54073,54075,\r
+54076,54077,54084,54085,54140,54141,54144,54148,54156,54157,54159,54160,54161,\r
+54168,54169,54172,54176,54184,54185,54187,54189,54196,54200,54204,54212,54213,\r
+54216,54217,54224,54232,54241,54243,54252,54253,54256,54260,54268,54269,54271,\r
+54273,54280,54301,54336,54340,54364,54368,54372,54381,54383,54392,54393,54396,\r
+54399,54400,54402,54408,54409,54411,54413,54420,54441,54476,54480,54484,54492,\r
+54495,54504,54508,54512,54520,54523,54525,54532,54536,54540,54548,54549,54551,\r
+54588,54589,54592,54596,54604,54605,54607,54609,54616,54617,54620,54624,54629,\r
+54632,54633,54635,54637,54644,54645,54648,54652,54660,54661,54663,54664,54665,\r
+54672,54693,54728,54729,54732,54736,54738,54744,54745,54747,54749,54756,54757,\r
+54760,54764,54772,54773,54775,54777,54784,54785,54788,54792,54800,54801,54803,\r
+54804,54805,54812,54816,54820,54829,54840,54841,54844,54848,54853,54856,54857,\r
+54859,54861,54865,54868,54869,54872,54876,54887,54889,54896,54897,54900,54915,\r
+54917,54924,54925,54928,54932,54941,54943,54945,54952,54956,54960,54969,54971,\r
+54980,54981,54984,54988,54993,54996,54999,55001,55008,55012,55016,55024,55029,\r
+55036,55037,55040,55044,55057,55064,55065,55068,55072,55080,55081,55083,55085,\r
+55092,55093,55096,55100,55108,55111,55113,55120,55121,55124,55126,55127,55128,\r
+55129,55136,55137,55139,55141,55145,55148,55152,55156,55164,55165,55169,55176,\r
+55177,55180,55184,55192,55193,55195,55197,20285,20339,20551,20729,21152,21487,\r
+21621,21733,22025,23233,23478,26247,26550,26551,26607,27468,29634,30146,31292,\r
+33499,33540,34903,34952,35382,36040,36303,36603,36838,39381,21051,21364,21508,\r
+24682,24932,27580,29647,33050,35258,35282,38307,20355,21002,22718,22904,23014,\r
+24178,24185,25031,25536,26438,26604,26751,28567,30286,30475,30965,31240,31487,\r
+31777,32925,33390,33393,35563,38291,20075,21917,26359,28212,30883,31469,33883,\r
+35088,34638,38824,21208,22350,22570,23884,24863,25022,25121,25954,26577,27204,\r
+28187,29976,30131,30435,30640,32058,37039,37969,37970,40853,21283,23724,30002,\r
+32987,37440,38296,21083,22536,23004,23713,23831,24247,24378,24394,24951,27743,\r
+30074,30086,31968,32115,32177,32652,33108,33313,34193,35137,35611,37628,38477,\r
+40007,20171,20215,20491,20977,22607,24887,24894,24936,25913,27114,28433,30117,\r
+30342,30422,31623,33445,33995,63744,37799,38283,21888,23458,22353,63745,31923,\r
+32697,37301,20520,21435,23621,24040,25298,25454,25818,25831,28192,28844,31067,\r
+36317,36382,63746,36989,37445,37624,20094,20214,20581,24062,24314,24838,26967,\r
+33137,34388,36423,37749,39467,20062,20625,26480,26688,20745,21133,21138,27298,\r
+30652,37392,40660,21163,24623,36850,20552,25001,25581,25802,26684,27268,28608,\r
+33160,35233,38548,22533,29309,29356,29956,32121,32365,32937,35211,35700,36963,\r
+40273,25225,27770,28500,32080,32570,35363,20860,24906,31645,35609,37463,37772,\r
+20140,20435,20510,20670,20742,21185,21197,21375,22384,22659,24218,24465,24950,\r
+25004,25806,25964,26223,26299,26356,26775,28039,28805,28913,29855,29861,29898,\r
+30169,30828,30956,31455,31478,32069,32147,32789,32831,33051,33686,35686,36629,\r
+36885,37857,38915,38968,39514,39912,20418,21843,22586,22865,23395,23622,24760,\r
+25106,26690,26800,26856,28330,30028,30328,30926,31293,31995,32363,32380,35336,\r
+35489,35903,38542,40388,21476,21481,21578,21617,22266,22993,23396,23611,24235,\r
+25335,25911,25925,25970,26272,26543,27073,27837,30204,30352,30590,31295,32660,\r
+32771,32929,33167,33510,33533,33776,34241,34865,34996,35493,63747,36764,37678,\r
+38599,39015,39640,40723,21741,26011,26354,26767,31296,35895,40288,22256,22372,\r
+23825,26118,26801,26829,28414,29736,34974,39908,27752,63748,39592,20379,20844,\r
+20849,21151,23380,24037,24656,24685,25329,25511,25915,29657,31354,34467,36002,\r
+38799,20018,23521,25096,26524,29916,31185,33747,35463,35506,36328,36942,37707,\r
+38982,24275,27112,34303,37101,63749,20896,23448,23532,24931,26874,27454,28748,\r
+29743,29912,31649,32592,33733,35264,36011,38364,39208,21038,24669,25324,36866,\r
+20362,20809,21281,22745,24291,26336,27960,28826,29378,29654,31568,33009,37979,\r
+21350,25499,32619,20054,20608,22602,22750,24618,24871,25296,27088,39745,23439,\r
+32024,32945,36703,20132,20689,21676,21932,23308,23968,24039,25898,25934,26657,\r
+27211,29409,30350,30703,32094,32761,33184,34126,34527,36611,36686,37066,39171,\r
+39509,39851,19992,20037,20061,20167,20465,20855,21246,21312,21475,21477,21646,\r
+22036,22389,22434,23495,23943,24272,25084,25304,25937,26552,26601,27083,27472,\r
+27590,27628,27714,28317,28792,29399,29590,29699,30655,30697,31350,32127,32777,\r
+33276,33285,33290,33503,34914,35635,36092,36544,36881,37041,37476,37558,39378,\r
+39493,40169,40407,40860,22283,23616,33738,38816,38827,40628,21531,31384,32676,\r
+35033,36557,37089,22528,23624,25496,31391,23470,24339,31353,31406,33422,36524,\r
+20518,21048,21240,21367,22280,25331,25458,27402,28099,30519,21413,29527,34152,\r
+36470,38357,26426,27331,28528,35437,36556,39243,63750,26231,27512,36020,39740,\r
+63751,21483,22317,22862,25542,27131,29674,30789,31418,31429,31998,33909,35215,\r
+36211,36917,38312,21243,22343,30023,31584,33740,37406,63752,27224,20811,21067,\r
+21127,25119,26840,26997,38553,20677,21156,21220,25027,26020,26681,27135,29822,\r
+31563,33465,33771,35250,35641,36817,39241,63753,20170,22935,25810,26129,27278,\r
+29748,31105,31165,33449,34942,34943,35167,63754,37670,20235,21450,24613,25201,\r
+27762,32026,32102,20120,20834,30684,32943,20225,20238,20854,20864,21980,22120,\r
+22331,22522,22524,22804,22855,22931,23492,23696,23822,24049,24190,24524,25216,\r
+26071,26083,26398,26399,26462,26827,26820,27231,27450,27683,27773,27778,28103,\r
+29592,29734,29738,29826,29859,30072,30079,30849,30959,31041,31047,31048,31098,\r
+31637,32000,32186,32648,32774,32813,32908,35352,35663,35912,36215,37665,37668,\r
+39138,39249,39438,39439,39525,40594,32202,20342,21513,25326,26708,37329,21931,\r
+20794,63755,63756,23068,25062,63757,25295,25343,63758,63759,63760,63761,63762,\r
+63763,37027,63764,63765,63766,63767,63768,35582,63769,63770,63771,63772,26262,\r
+63773,29014,63774,63775,38627,63776,25423,25466,21335,63777,26511,26976,28275,\r
+63778,30007,63779,63780,63781,32013,63782,63783,34930,22218,23064,63784,63785,\r
+63786,63787,63788,20035,63789,20839,22856,26608,32784,63790,22899,24180,25754,\r
+31178,24565,24684,25288,25467,23527,23511,21162,63791,22900,24361,24594,63792,\r
+63793,63794,29785,63795,63796,63797,63798,63799,63800,39377,63801,63802,63803,\r
+63804,63805,63806,63807,63808,63809,63810,63811,28611,63812,63813,33215,36786,\r
+24817,63814,63815,33126,63816,63817,23615,63818,63819,63820,63821,63822,63823,\r
+63824,63825,23273,35365,26491,32016,63826,63827,63828,63829,63830,63831,33021,\r
+63832,63833,23612,27877,21311,28346,22810,33590,20025,20150,20294,21934,22296,\r
+22727,24406,26039,26086,27264,27573,28237,30701,31471,31774,32222,34507,34962,\r
+37170,37723,25787,28606,29562,30136,36948,21846,22349,25018,25812,26311,28129,\r
+28251,28525,28601,30192,32835,33213,34113,35203,35527,35674,37663,27795,30035,\r
+31572,36367,36957,21776,22530,22616,24162,25095,25758,26848,30070,31958,34739,\r
+40680,20195,22408,22382,22823,23565,23729,24118,24453,25140,25825,29619,33274,\r
+34955,36024,38538,40667,23429,24503,24755,20498,20992,21040,22294,22581,22615,\r
+23566,23648,23798,23947,24230,24466,24764,25361,25481,25623,26691,26873,27330,\r
+28120,28193,28372,28644,29182,30428,30585,31153,31291,33796,35241,36077,36339,\r
+36424,36867,36884,36947,37117,37709,38518,38876,27602,28678,29272,29346,29544,\r
+30563,31167,31716,32411,35712,22697,24775,25958,26109,26302,27788,28958,29129,\r
+35930,38931,20077,31361,20189,20908,20941,21205,21516,24999,26481,26704,26847,\r
+27934,28540,30140,30643,31461,33012,33891,37509,20828,26007,26460,26515,30168,\r
+31431,33651,63834,35910,36887,38957,23663,33216,33434,36929,36975,37389,24471,\r
+23965,27225,29128,30331,31561,34276,35588,37159,39472,21895,25078,63835,30313,\r
+32645,34367,34746,35064,37007,63836,27931,28889,29662,32097,33853,63837,37226,\r
+39409,63838,20098,21365,27396,27410,28734,29211,34349,40478,21068,36771,23888,\r
+25829,25900,27414,28651,31811,32412,34253,35172,35261,25289,33240,34847,24266,\r
+26391,28010,29436,29701,29807,34690,37086,20358,23821,24480,33802,20919,25504,\r
+30053,20142,20486,20841,20937,26753,27153,31918,31921,31975,33391,35538,36635,\r
+37327,20406,20791,21237,21570,24300,24942,25150,26053,27354,28670,31018,34268,\r
+34851,38317,39522,39530,40599,40654,21147,26310,27511,28701,31019,36706,38722,\r
+24976,25088,25891,28451,29001,29833,32244,32879,34030,36646,36899,37706,20925,\r
+21015,21155,27916,28872,35010,24265,25986,27566,28610,31806,29557,20196,20278,\r
+22265,63839,23738,23994,24604,29618,31533,32666,32718,32838,36894,37428,38646,\r
+38728,38936,40801,20363,28583,31150,37300,38583,21214,63840,25736,25796,27347,\r
+28510,28696,29200,30439,32769,34310,34396,36335,36613,38706,39791,40442,40565,\r
+30860,31103,32160,33737,37636,40575,40595,35542,22751,24324,26407,28711,29903,\r
+31840,32894,20769,28712,29282,30922,36034,36058,36084,38647,20102,20698,23534,\r
+24278,26009,29134,30274,30637,32842,34044,36988,39719,40845,22744,23105,23650,\r
+27155,28122,28431,30267,32047,32311,34078,35128,37860,38475,21129,26066,26611,\r
+27060,27969,28316,28687,29705,29792,30041,30244,30827,35628,39006,20845,25134,\r
+38520,20374,20523,23833,28138,32184,36650,24459,24900,26647,63841,38534,21202,\r
+32907,20956,20940,26974,31260,32190,33777,38517,20442,21033,21400,21519,21774,\r
+23653,24743,26446,26792,28012,29313,29432,29702,29827,63842,30178,31852,32633,\r
+32696,33673,35023,35041,37324,37328,38626,39881,21533,28542,29136,29848,34298,\r
+36522,38563,40023,40607,26519,28107,29747,33256,38678,30764,31435,31520,31890,\r
+25705,29802,30194,30908,30952,39340,39764,40635,23518,24149,28448,33180,33707,\r
+37000,19975,21325,23081,24018,24398,24930,25405,26217,26364,28415,28459,28771,\r
+30622,33836,34067,34875,36627,39237,39995,21788,25273,26411,27819,33545,35178,\r
+38778,20129,22916,24536,24537,26395,32178,32596,33426,33579,33725,36638,37017,\r
+22475,22969,23186,23504,26151,26522,26757,27599,29028,32629,36023,36067,36993,\r
+39749,33032,35978,38476,39488,40613,23391,27667,29467,30450,30431,33804,20906,\r
+35219,20813,20885,21193,26825,27796,30468,30496,32191,32236,38754,40629,28357,\r
+34065,20901,21517,21629,26126,26269,26919,28319,30399,30609,33559,33986,34719,\r
+37225,37528,40180,34946,20398,20882,21215,22982,24125,24917,25720,25721,26286,\r
+26576,27169,27597,27611,29279,29281,29761,30520,30683,32791,33468,33541,35584,\r
+35624,35980,26408,27792,29287,30446,30566,31302,40361,27519,27794,22818,26406,\r
+33945,21359,22675,22937,24287,25551,26164,26483,28218,29483,31447,33495,37672,\r
+21209,24043,25006,25035,25098,25287,25771,26080,26969,27494,27595,28961,29687,\r
+30045,32326,33310,33538,34154,35491,36031,38695,40289,22696,40664,20497,21006,\r
+21563,21839,25991,27766,32010,32011,32862,34442,38272,38639,21247,27797,29289,\r
+21619,23194,23614,23883,24396,24494,26410,26806,26979,28220,28228,30473,31859,\r
+32654,34183,35598,36855,38753,40692,23735,24758,24845,25003,25935,26107,26108,\r
+27665,27887,29599,29641,32225,38292,23494,34588,35600,21085,21338,25293,25615,\r
+25778,26420,27192,27850,29632,29854,31636,31893,32283,33162,33334,34180,36843,\r
+38649,39361,20276,21322,21453,21467,25292,25644,25856,26001,27075,27886,28504,\r
+29677,30036,30242,30436,30460,30928,30971,31020,32070,33324,34784,36820,38930,\r
+39151,21187,25300,25765,28196,28497,30332,36299,37297,37474,39662,39747,20515,\r
+20621,22346,22952,23592,24135,24439,25151,25918,26041,26049,26121,26507,27036,\r
+28354,30917,32033,32938,33152,33323,33459,33953,34444,35370,35607,37030,38450,\r
+40848,20493,20467,63843,22521,24472,25308,25490,26479,28227,28953,30403,32972,\r
+32986,35060,35061,35097,36064,36649,37197,38506,20271,20336,24091,26575,26658,\r
+30333,30334,39748,24161,27146,29033,29140,30058,63844,32321,34115,34281,39132,\r
+20240,31567,32624,38309,20961,24070,26805,27710,27726,27867,29359,31684,33539,\r
+27861,29754,20731,21128,22721,25816,27287,29863,30294,30887,34327,38370,38713,\r
+63845,21342,24321,35722,36776,36783,37002,21029,30629,40009,40712,19993,20482,\r
+20853,23643,24183,26142,26170,26564,26821,28851,29953,30149,31177,31453,36647,\r
+39200,39432,20445,22561,22577,23542,26222,27493,27921,28282,28541,29668,29995,\r
+33769,35036,35091,35676,36628,20239,20693,21264,21340,23443,24489,26381,31119,\r
+33145,33583,34068,35079,35206,36665,36667,39333,39954,26412,20086,20472,22857,\r
+23553,23791,23792,25447,26834,28925,29090,29739,32299,34028,34562,36898,37586,\r
+40179,19981,20184,20463,20613,21078,21103,21542,21648,22496,22827,23142,23386,\r
+23413,23500,24220,63846,25206,25975,26023,28014,28325,29238,31526,31807,32566,\r
+33104,33105,33178,33344,33433,33705,35331,36000,36070,36091,36212,36282,37096,\r
+37340,38428,38468,39385,40167,21271,20998,21545,22132,22707,22868,22894,24575,\r
+24996,25198,26128,27774,28954,30406,31881,31966,32027,33452,36033,38640,63847,\r
+20315,24343,24447,25282,23849,26379,26842,30844,32323,40300,19989,20633,21269,\r
+21290,21329,22915,23138,24199,24754,24970,25161,25209,26000,26503,27047,27604,\r
+27606,27607,27608,27832,63848,29749,30202,30738,30865,31189,31192,31875,32203,\r
+32737,32933,33086,33218,33778,34586,35048,35513,35692,36027,37145,38750,39131,\r
+40763,22188,23338,24428,25996,27315,27567,27996,28657,28693,29277,29613,36007,\r
+36051,38971,24977,27703,32856,39425,20045,20107,20123,20181,20282,20284,20351,\r
+20447,20735,21490,21496,21766,21987,22235,22763,22882,23057,23531,23546,23556,\r
+24051,24107,24473,24605,25448,26012,26031,26614,26619,26797,27515,27801,27863,\r
+28195,28681,29509,30722,31038,31040,31072,31169,31721,32023,32114,32902,33293,\r
+33678,34001,34503,35039,35408,35422,35613,36060,36198,36781,37034,39164,39391,\r
+40605,21066,63849,26388,63850,20632,21034,23665,25955,27733,29642,29987,30109,\r
+31639,33948,37240,38704,20087,25746,27578,29022,34217,19977,63851,26441,26862,\r
+28183,33439,34072,34923,25591,28545,37394,39087,19978,20663,20687,20767,21830,\r
+21930,22039,23360,23577,23776,24120,24202,24224,24258,24819,26705,27233,28248,\r
+29245,29248,29376,30456,31077,31665,32724,35059,35316,35443,35937,36062,38684,\r
+22622,29885,36093,21959,63852,31329,32034,33394,29298,29983,29989,63853,31513,\r
+22661,22779,23996,24207,24246,24464,24661,25234,25471,25933,26257,26329,26360,\r
+26646,26866,29312,29790,31598,32110,32214,32626,32997,33298,34223,35199,35475,\r
+36893,37604,40653,40736,22805,22893,24109,24796,26132,26227,26512,27728,28101,\r
+28511,30707,30889,33990,37323,37675,20185,20682,20808,21892,23307,23459,25159,\r
+25982,26059,28210,29053,29697,29764,29831,29887,30316,31146,32218,32341,32680,\r
+33146,33203,33337,34330,34796,35445,36323,36984,37521,37925,39245,39854,21352,\r
+23633,26964,27844,27945,28203,33292,34203,35131,35373,35498,38634,40807,21089,\r
+26297,27570,32406,34814,36109,38275,38493,25885,28041,29166,63854,22478,22995,\r
+23468,24615,24826,25104,26143,26207,29481,29689,30427,30465,31596,32854,32882,\r
+33125,35488,37266,19990,21218,27506,27927,31237,31545,32048,63855,36016,21484,\r
+22063,22609,23477,23567,23569,24034,25152,25475,25620,26157,26803,27836,28040,\r
+28335,28703,28836,29138,29990,30095,30094,30233,31505,31712,31787,32032,32057,\r
+34092,34157,34311,35380,36877,36961,37045,37559,38902,39479,20439,23660,26463,\r
+28049,31903,32396,35606,36118,36895,23403,24061,25613,33984,36956,39137,29575,\r
+23435,24730,26494,28126,35359,35494,36865,38924,21047,63856,28753,30862,37782,\r
+34928,37335,20462,21463,22013,22234,22402,22781,23234,23432,23723,23744,24101,\r
+24833,25101,25163,25480,25628,25910,25976,27193,27530,27700,27929,28465,29159,\r
+29417,29560,29703,29874,30246,30561,31168,31319,31466,31929,32143,32172,32353,\r
+32670,33065,33585,33936,34010,34282,34966,35504,35728,36664,36930,36995,37228,\r
+37526,37561,38539,38567,38568,38614,38656,38920,39318,39635,39706,21460,22654,\r
+22809,23408,23487,28113,28506,29087,29729,29881,32901,33789,24033,24455,24490,\r
+24642,26092,26642,26991,27219,27529,27957,28147,29667,30462,30636,31565,32020,\r
+33059,33308,33600,34036,34147,35426,35524,37255,37662,38918,39348,25100,34899,\r
+36848,37477,23815,23847,23913,29791,33181,34664,28629,25342,32722,35126,35186,\r
+19998,20056,20711,21213,21319,25215,26119,32361,34821,38494,20365,21273,22070,\r
+22987,23204,23608,23630,23629,24066,24337,24643,26045,26159,26178,26558,26612,\r
+29468,30690,31034,32709,33940,33997,35222,35430,35433,35553,35925,35962,22516,\r
+23508,24335,24687,25325,26893,27542,28252,29060,31698,34645,35672,36606,39135,\r
+39166,20280,20353,20449,21627,23072,23480,24892,26032,26216,29180,30003,31070,\r
+32051,33102,33251,33688,34218,34254,34563,35338,36523,36763,63857,36805,22833,\r
+23460,23526,24713,23529,23563,24515,27777,63858,28145,28683,29978,33455,35574,\r
+20160,21313,63859,38617,27663,20126,20420,20818,21854,23077,23784,25105,29273,\r
+33469,33706,34558,34905,35357,38463,38597,39187,40201,40285,22538,23731,23997,\r
+24132,24801,24853,25569,27138,28197,37122,37716,38990,39952,40823,23433,23736,\r
+25353,26191,26696,30524,38593,38797,38996,39839,26017,35585,36555,38332,21813,\r
+23721,24022,24245,26263,30284,33780,38343,22739,25276,29390,40232,20208,22830,\r
+24591,26171,27523,31207,40230,21395,21696,22467,23830,24859,26326,28079,30861,\r
+33406,38552,38724,21380,25212,25494,28082,32266,33099,38989,27387,32588,40367,\r
+40474,20063,20539,20918,22812,24825,25590,26928,29242,32822,63860,37326,24369,\r
+63861,63862,32004,33509,33903,33979,34277,36493,63863,20335,63864,63865,22756,\r
+23363,24665,25562,25880,25965,26264,63866,26954,27171,27915,28673,29036,30162,\r
+30221,31155,31344,63867,32650,63868,35140,63869,35731,37312,38525,63870,39178,\r
+22276,24481,26044,28417,30208,31142,35486,39341,39770,40812,20740,25014,25233,\r
+27277,33222,20547,22576,24422,28937,35328,35578,23420,34326,20474,20796,22196,\r
+22852,25513,28153,23978,26989,20870,20104,20313,63871,63872,63873,22914,63874,\r
+63875,27487,27741,63876,29877,30998,63877,33287,33349,33593,36671,36701,63878,\r
+39192,63879,63880,63881,20134,63882,22495,24441,26131,63883,63884,30123,32377,\r
+35695,63885,36870,39515,22181,22567,23032,23071,23476,63886,24310,63887,63888,\r
+25424,25403,63889,26941,27783,27839,28046,28051,28149,28436,63890,28895,28982,\r
+29017,63891,29123,29141,63892,30799,30831,63893,31605,32227,63894,32303,63895,\r
+34893,36575,63896,63897,63898,37467,63899,40182,63900,63901,63902,24709,28037,\r
+63903,29105,63904,63905,38321,21421,63906,63907,63908,26579,63909,28814,28976,\r
+29744,33398,33490,63910,38331,39653,40573,26308,63911,29121,33865,63912,63913,\r
+22603,63914,63915,23992,24433,63916,26144,26254,27001,27054,27704,27891,28214,\r
+28481,28634,28699,28719,29008,29151,29552,63917,29787,63918,29908,30408,31310,\r
+32403,63919,63920,33521,35424,36814,63921,37704,63922,38681,63923,63924,20034,\r
+20522,63925,21000,21473,26355,27757,28618,29450,30591,31330,33454,34269,34306,\r
+63926,35028,35427,35709,35947,63927,37555,63928,38675,38928,20116,20237,20425,\r
+20658,21320,21566,21555,21978,22626,22714,22887,23067,23524,24735,63929,25034,\r
+25942,26111,26212,26791,27738,28595,28879,29100,29522,31613,34568,35492,39986,\r
+40711,23627,27779,29508,29577,37434,28331,29797,30239,31337,32277,34314,20800,\r
+22725,25793,29934,29973,30320,32705,37013,38605,39252,28198,29926,31401,31402,\r
+33253,34521,34680,35355,23113,23436,23451,26785,26880,28003,29609,29715,29740,\r
+30871,32233,32747,33048,33109,33694,35916,38446,38929,26352,24448,26106,26505,\r
+27754,29579,20525,23043,27498,30702,22806,23916,24013,29477,30031,63930,63931,\r
+20709,20985,22575,22829,22934,23002,23525,63932,63933,23970,25303,25622,25747,\r
+25854,63934,26332,63935,27208,63936,29183,29796,63937,31368,31407,32327,32350,\r
+32768,33136,63938,34799,35201,35616,36953,63939,36992,39250,24958,27442,28020,\r
+32287,35109,36785,20433,20653,20887,21191,22471,22665,23481,24248,24898,27029,\r
+28044,28263,28342,29076,29794,29992,29996,32883,33592,33993,36362,37780,37854,\r
+63940,20110,20305,20598,20778,21448,21451,21491,23431,23507,23588,24858,24962,\r
+26100,29275,29591,29760,30402,31056,31121,31161,32006,32701,33419,34261,34398,\r
+36802,36935,37109,37354,38533,38632,38633,21206,24423,26093,26161,26671,29020,\r
+31286,37057,38922,20113,63941,27218,27550,28560,29065,32792,33464,34131,36939,\r
+38549,38642,38907,34074,39729,20112,29066,38596,20803,21407,21729,22291,22290,\r
+22435,23195,23236,23491,24616,24895,25588,27781,27961,28274,28304,29232,29503,\r
+29783,33489,34945,36677,36960,63942,38498,39000,40219,26376,36234,37470,20301,\r
+20553,20702,21361,22285,22996,23041,23561,24944,26256,28205,29234,29771,32239,\r
+32963,33806,33894,34111,34655,34907,35096,35586,36949,38859,39759,20083,20369,\r
+20754,20842,63943,21807,21929,23418,23461,24188,24189,24254,24736,24799,24840,\r
+24841,25540,25912,26377,63944,26580,26586,63945,26977,26978,27833,27943,63946,\r
+28216,63947,28641,29494,29495,63948,29788,30001,63949,30290,63950,63951,32173,\r
+33278,33848,35029,35480,35547,35565,36400,36418,36938,36926,36986,37193,37321,\r
+37742,63952,63953,22537,63954,27603,32905,32946,63955,63956,20801,22891,23609,\r
+63957,63958,28516,29607,32996,36103,63959,37399,38287,63960,63961,63962,63963,\r
+32895,25102,28700,32104,34701,63964,22432,24681,24903,27575,35518,37504,38577,\r
+20057,21535,28139,34093,38512,38899,39150,25558,27875,37009,20957,25033,33210,\r
+40441,20381,20506,20736,23452,24847,25087,25836,26885,27589,30097,30691,32681,\r
+33380,34191,34811,34915,35516,35696,37291,20108,20197,20234,63965,63966,22839,\r
+23016,63967,24050,24347,24411,24609,63968,63969,63970,63971,29246,29669,63972,\r
+30064,30157,63973,31227,63974,32780,32819,32900,33505,33617,63975,63976,36029,\r
+36019,36999,63977,63978,39156,39180,63979,63980,28727,30410,32714,32716,32764,\r
+35610,20154,20161,20995,21360,63981,21693,22240,23035,23493,24341,24525,28270,\r
+63982,63983,32106,33589,63984,34451,35469,63985,38765,38775,63986,63987,19968,\r
+20314,20350,22777,26085,28322,36920,37808,39353,20219,22764,22922,23001,24641,\r
+63988,63989,31252,63990,33615,36035,20837,21316,63991,63992,63993,20173,21097,\r
+23381,33471,20180,21050,21672,22985,23039,23376,23383,23388,24675,24904,28363,\r
+28825,29038,29574,29943,30133,30913,32043,32773,33258,33576,34071,34249,35566,\r
+36039,38604,20316,21242,22204,26027,26152,28796,28856,29237,32189,33421,37196,\r
+38592,40306,23409,26855,27544,28538,30430,23697,26283,28507,31668,31786,34870,\r
+38620,19976,20183,21280,22580,22715,22767,22892,23559,24115,24196,24373,25484,\r
+26290,26454,27167,27299,27404,28479,29254,63994,29520,29835,31456,31911,33144,\r
+33247,33255,33674,33900,34083,34196,34255,35037,36115,37292,38263,38556,20877,\r
+21705,22312,23472,25165,26448,26685,26771,28221,28371,28797,32289,35009,36001,\r
+36617,40779,40782,29229,31631,35533,37658,20295,20302,20786,21632,22992,24213,\r
+25269,26485,26990,27159,27822,28186,29401,29482,30141,31672,32053,33511,33785,\r
+33879,34295,35419,36015,36487,36889,37048,38606,40799,21219,21514,23265,23490,\r
+25688,25973,28404,29380,63995,30340,31309,31515,31821,32318,32735,33659,35627,\r
+36042,36196,36321,36447,36842,36857,36969,37841,20291,20346,20659,20840,20856,\r
+21069,21098,22625,22652,22880,23560,23637,24283,24731,25136,26643,27583,27656,\r
+28593,29006,29728,30000,30008,30033,30322,31564,31627,31661,31686,32399,35438,\r
+36670,36681,37439,37523,37666,37931,38651,39002,39019,39198,20999,25130,25240,\r
+27993,30308,31434,31680,32118,21344,23742,24215,28472,28857,31896,38673,39822,\r
+40670,25509,25722,34678,19969,20117,20141,20572,20597,21576,22979,23450,24128,\r
+24237,24311,24449,24773,25402,25919,25972,26060,26230,26232,26622,26984,27273,\r
+27491,27712,28096,28136,28191,28254,28702,28833,29582,29693,30010,30555,30855,\r
+31118,31243,31357,31934,32142,33351,35330,35562,35998,37165,37194,37336,37478,\r
+37580,37664,38662,38742,38748,38914,40718,21046,21137,21884,22564,24093,24351,\r
+24716,25552,26799,28639,31085,31532,33229,34234,35069,35576,36420,37261,38500,\r
+38555,38717,38988,40778,20430,20806,20939,21161,22066,24340,24427,25514,25805,\r
+26089,26177,26362,26361,26397,26781,26839,27133,28437,28526,29031,29157,29226,\r
+29866,30522,31062,31066,31199,31264,31381,31895,31967,32068,32368,32903,34299,\r
+34468,35412,35519,36249,36481,36896,36973,37347,38459,38613,40165,26063,31751,\r
+36275,37827,23384,23562,21330,25305,29469,20519,23447,24478,24752,24939,26837,\r
+28121,29742,31278,32066,32156,32305,33131,36394,36405,37758,37912,20304,22352,\r
+24038,24231,25387,32618,20027,20303,20367,20570,23005,32964,21610,21608,22014,\r
+22863,23449,24030,24282,26205,26417,26609,26666,27880,27954,28234,28557,28855,\r
+29664,30087,31820,32002,32044,32162,33311,34523,35387,35461,36208,36490,36659,\r
+36913,37198,37202,37956,39376,31481,31909,20426,20737,20934,22472,23535,23803,\r
+26201,27197,27994,28310,28652,28940,30063,31459,34850,36897,36981,38603,39423,\r
+33537,20013,20210,34886,37325,21373,27355,26987,27713,33914,22686,24974,26366,\r
+25327,28893,29969,30151,32338,33976,35657,36104,20043,21482,21675,22320,22336,\r
+24535,25345,25351,25711,25903,26088,26234,26525,26547,27490,27744,27802,28460,\r
+30693,30757,31049,31063,32025,32930,33026,33267,33437,33463,34584,35468,63996,\r
+36100,36286,36978,30452,31257,31287,32340,32887,21767,21972,22645,25391,25634,\r
+26185,26187,26733,27035,27524,27941,28337,29645,29800,29857,30043,30137,30433,\r
+30494,30603,31206,32265,32285,33275,34095,34967,35386,36049,36587,36784,36914,\r
+37805,38499,38515,38663,20356,21489,23018,23241,24089,26702,29894,30142,31209,\r
+31378,33187,34541,36074,36300,36845,26015,26389,63997,22519,28503,32221,36655,\r
+37878,38598,24501,25074,28548,19988,20376,20511,21449,21983,23919,24046,27425,\r
+27492,30923,31642,63998,36425,36554,36974,25417,25662,30528,31364,37679,38015,\r
+40810,25776,28591,29158,29864,29914,31428,31762,32386,31922,32408,35738,36106,\r
+38013,39184,39244,21049,23519,25830,26413,32046,20717,21443,22649,24920,24921,\r
+25082,26028,31449,35730,35734,20489,20513,21109,21809,23100,24288,24432,24884,\r
+25950,26124,26166,26274,27085,28356,28466,29462,30241,31379,33081,33369,33750,\r
+33980,20661,22512,23488,23528,24425,25505,30758,32181,33756,34081,37319,37365,\r
+20874,26613,31574,36012,20932,22971,24765,34389,20508,63999,21076,23610,24957,\r
+25114,25299,25842,26021,28364,30240,33034,36448,38495,38587,20191,21315,21912,\r
+22825,24029,25797,27849,28154,29588,31359,33307,34214,36068,36368,36983,37351,\r
+38369,38433,38854,20984,21746,21894,24505,25764,28552,32180,36639,36685,37941,\r
+20681,23574,27838,28155,29979,30651,31805,31844,35449,35522,22558,22974,24086,\r
+25463,29266,30090,30571,35548,36028,36626,24307,26228,28152,32893,33729,35531,\r
+38737,39894,64000,21059,26367,28053,28399,32224,35558,36910,36958,39636,21021,\r
+21119,21736,24980,25220,25307,26786,26898,26970,27189,28818,28966,30813,30977,\r
+30990,31186,31245,32918,33400,33493,33609,34121,35970,36229,37218,37259,37294,\r
+20419,22225,29165,30679,34560,35320,23544,24534,26449,37032,21474,22618,23541,\r
+24740,24961,25696,32317,32880,34085,37507,25774,20652,23828,26368,22684,25277,\r
+25512,26894,27000,27166,28267,30394,31179,33467,33833,35535,36264,36861,37138,\r
+37195,37276,37648,37656,37786,38619,39478,39949,19985,30044,31069,31482,31569,\r
+31689,32302,33988,36441,36468,36600,36880,26149,26943,29763,20986,26414,40668,\r
+20805,24544,27798,34802,34909,34935,24756,33205,33795,36101,21462,21561,22068,\r
+23094,23601,28810,32736,32858,33030,33261,36259,37257,39519,40434,20596,20164,\r
+21408,24827,28204,23652,20360,20516,21988,23769,24159,24677,26772,27835,28100,\r
+29118,30164,30196,30305,31258,31305,32199,32251,32622,33268,34473,36636,38601,\r
+39347,40786,21063,21189,39149,35242,19971,26578,28422,20405,23522,26517,27784,\r
+28024,29723,30759,37341,37756,34756,31204,31281,24555,20182,21668,21822,22702,\r
+22949,24816,25171,25302,26422,26965,33333,38464,39345,39389,20524,21331,21828,\r
+22396,64001,25176,64002,25826,26219,26589,28609,28655,29730,29752,35351,37944,\r
+21585,22022,22374,24392,24986,27470,28760,28845,32187,35477,22890,33067,25506,\r
+30472,32829,36010,22612,25645,27067,23445,24081,28271,64003,34153,20812,21488,\r
+22826,24608,24907,27526,27760,27888,31518,32974,33492,36294,37040,39089,64004,\r
+25799,28580,25745,25860,20814,21520,22303,35342,24927,26742,64005,30171,31570,\r
+32113,36890,22534,27084,33151,35114,36864,38969,20600,22871,22956,25237,36879,\r
+39722,24925,29305,38358,22369,23110,24052,25226,25773,25850,26487,27874,27966,\r
+29228,29750,30772,32631,33453,36315,38935,21028,22338,26495,29256,29923,36009,\r
+36774,37393,38442,20843,21485,25420,20329,21764,24726,25943,27803,28031,29260,\r
+29437,31255,35207,35997,24429,28558,28921,33192,24846,20415,20559,25153,29255,\r
+31687,32232,32745,36941,38829,39449,36022,22378,24179,26544,33805,35413,21536,\r
+23318,24163,24290,24330,25987,32954,34109,38281,38491,20296,21253,21261,21263,\r
+21638,21754,22275,24067,24598,25243,25265,25429,64006,27873,28006,30129,30770,\r
+32990,33071,33502,33889,33970,34957,35090,36875,37610,39165,39825,24133,26292,\r
+26333,28689,29190,64007,20469,21117,24426,24915,26451,27161,28418,29922,31080,\r
+34920,35961,39111,39108,39491,21697,31263,26963,35575,35914,39080,39342,24444,\r
+25259,30130,30382,34987,36991,38466,21305,24380,24517,27852,29644,30050,30091,\r
+31558,33534,39325,20047,36924,19979,20309,21414,22799,24264,26160,27827,29781,\r
+33655,34662,36032,36944,38686,39957,22737,23416,34384,35604,40372,23506,24680,\r
+24717,26097,27735,28450,28579,28698,32597,32752,38289,38290,38480,38867,21106,\r
+36676,20989,21547,21688,21859,21898,27323,28085,32216,33382,37532,38519,40569,\r
+21512,21704,30418,34532,38308,38356,38492,20130,20233,23022,23270,24055,24658,\r
+25239,26477,26689,27782,28207,32568,32923,33322,64008,64009,38917,20133,20565,\r
+21683,22419,22874,23401,23475,25032,26999,28023,28707,34809,35299,35442,35559,\r
+36994,39405,39608,21182,26680,20502,24184,26447,33607,34892,20139,21521,22190,\r
+29670,37141,38911,39177,39255,39321,22099,22687,34395,35377,25010,27382,29563,\r
+36562,27463,38570,39511,22869,29184,36203,38761,20436,23796,24358,25080,26203,\r
+27883,28843,29572,29625,29694,30505,30541,32067,32098,32291,33335,34898,64010,\r
+36066,37449,39023,23377,31348,34880,38913,23244,20448,21332,22846,23805,25406,\r
+28025,29433,33029,33031,33698,37583,38960,20136,20804,21009,22411,24418,27842,\r
+28366,28677,28752,28847,29074,29673,29801,33610,34722,34913,36872,37026,37795,\r
+39336,20846,24407,24800,24935,26291,34137,36426,37295,38795,20046,20114,21628,\r
+22741,22778,22909,23733,24359,25142,25160,26122,26215,27627,28009,28111,28246,\r
+28408,28564,28640,28649,28765,29392,29733,29786,29920,30355,31068,31946,32286,\r
+32993,33446,33899,33983,34382,34399,34676,35703,35946,37804,38912,39013,24785,\r
+25110,37239,23130,26127,28151,28222,29759,39746,24573,24794,31503,21700,24344,\r
+27742,27859,27946,28888,32005,34425,35340,40251,21270,21644,23301,27194,28779,\r
+30069,31117,31166,33457,33775,35441,35649,36008,38772,64011,25844,25899,30906,\r
+30907,31339,20024,21914,22864,23462,24187,24739,25563,27489,26213,26707,28185,\r
+29029,29872,32008,36996,39529,39973,27963,28369,29502,35905,38346,20976,24140,\r
+24488,24653,24822,24880,24908,26179,26180,27045,27841,28255,28361,28514,29004,\r
+29852,30343,31681,31783,33618,34647,36945,38541,40643,21295,22238,24315,24458,\r
+24674,24724,25079,26214,26371,27292,28142,28590,28784,29546,32362,33214,33588,\r
+34516,35496,36036,21123,29554,23446,27243,37892,21742,22150,23389,25928,25989,\r
+26313,26783,28045,28102,29243,32948,37237,39501,20399,20505,21402,21518,21564,\r
+21897,21957,24127,24460,26429,29030,29661,36869,21211,21235,22628,22734,28932,\r
+29071,29179,34224,35347,26248,34216,21927,26244,29002,33841,21321,21913,27585,\r
+24409,24509,25582,26249,28999,35569,36637,40638,20241,25658,28875,30054,34407,\r
+24676,35662,40440,20807,20982,21256,27958,33016,40657,26133,27427,28824,30165,\r
+21507,23673,32007,35350,27424,27453,27462,21560,24688,27965,32725,33288,20694,\r
+20958,21916,22123,22221,23020,23305,24076,24985,24984,25137,26206,26342,29081,\r
+29113,29114,29351,31143,31232,32690,35440,\r
+};\r
+\r
+static const struct dbcs_index ksx1001_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__ksx1001_decmap+0,33,126},{__ksx1001_decmap+\r
+94,33,103},{__ksx1001_decmap+165,33,126},{__ksx1001_decmap+259,33,126},{\r
+__ksx1001_decmap+353,33,120},{__ksx1001_decmap+441,33,100},{__ksx1001_decmap+\r
+509,33,111},{__ksx1001_decmap+588,33,126},{__ksx1001_decmap+682,33,126},{\r
+__ksx1001_decmap+776,33,115},{__ksx1001_decmap+859,33,118},{__ksx1001_decmap+\r
+945,33,113},{0,0,0},{0,0,0},{0,0,0},{__ksx1001_decmap+1026,33,126},{\r
+__ksx1001_decmap+1120,33,126},{__ksx1001_decmap+1214,33,126},{__ksx1001_decmap\r
++1308,33,126},{__ksx1001_decmap+1402,33,126},{__ksx1001_decmap+1496,33,126},{\r
+__ksx1001_decmap+1590,33,126},{__ksx1001_decmap+1684,33,126},{__ksx1001_decmap\r
++1778,33,126},{__ksx1001_decmap+1872,33,126},{__ksx1001_decmap+1966,33,126},{\r
+__ksx1001_decmap+2060,33,126},{__ksx1001_decmap+2154,33,126},{__ksx1001_decmap\r
++2248,33,126},{__ksx1001_decmap+2342,33,126},{__ksx1001_decmap+2436,33,126},{\r
+__ksx1001_decmap+2530,33,126},{__ksx1001_decmap+2624,33,126},{__ksx1001_decmap\r
++2718,33,126},{__ksx1001_decmap+2812,33,126},{__ksx1001_decmap+2906,33,126},{\r
+__ksx1001_decmap+3000,33,126},{__ksx1001_decmap+3094,33,126},{__ksx1001_decmap\r
++3188,33,126},{__ksx1001_decmap+3282,33,126},{0,0,0},{__ksx1001_decmap+3376,\r
+33,126},{__ksx1001_decmap+3470,33,126},{__ksx1001_decmap+3564,33,126},{\r
+__ksx1001_decmap+3658,33,126},{__ksx1001_decmap+3752,33,126},{__ksx1001_decmap\r
++3846,33,126},{__ksx1001_decmap+3940,33,126},{__ksx1001_decmap+4034,33,126},{\r
+__ksx1001_decmap+4128,33,126},{__ksx1001_decmap+4222,33,126},{__ksx1001_decmap\r
++4316,33,126},{__ksx1001_decmap+4410,33,126},{__ksx1001_decmap+4504,33,126},{\r
+__ksx1001_decmap+4598,33,126},{__ksx1001_decmap+4692,33,126},{__ksx1001_decmap\r
++4786,33,126},{__ksx1001_decmap+4880,33,126},{__ksx1001_decmap+4974,33,126},{\r
+__ksx1001_decmap+5068,33,126},{__ksx1001_decmap+5162,33,126},{__ksx1001_decmap\r
++5256,33,126},{__ksx1001_decmap+5350,33,126},{__ksx1001_decmap+5444,33,126},{\r
+__ksx1001_decmap+5538,33,126},{__ksx1001_decmap+5632,33,126},{__ksx1001_decmap\r
++5726,33,126},{__ksx1001_decmap+5820,33,126},{__ksx1001_decmap+5914,33,126},{\r
+__ksx1001_decmap+6008,33,126},{__ksx1001_decmap+6102,33,126},{__ksx1001_decmap\r
++6196,33,126},{__ksx1001_decmap+6290,33,126},{__ksx1001_decmap+6384,33,126},{\r
+__ksx1001_decmap+6478,33,126},{__ksx1001_decmap+6572,33,126},{__ksx1001_decmap\r
++6666,33,126},{__ksx1001_decmap+6760,33,126},{__ksx1001_decmap+6854,33,126},{\r
+__ksx1001_decmap+6948,33,126},{__ksx1001_decmap+7042,33,126},{__ksx1001_decmap\r
++7136,33,126},{__ksx1001_decmap+7230,33,126},{__ksx1001_decmap+7324,33,126},{\r
+__ksx1001_decmap+7418,33,126},{__ksx1001_decmap+7512,33,126},{__ksx1001_decmap\r
++7606,33,126},{__ksx1001_decmap+7700,33,126},{__ksx1001_decmap+7794,33,126},{\r
+__ksx1001_decmap+7888,33,126},{__ksx1001_decmap+7982,33,126},{__ksx1001_decmap\r
++8076,33,126},{__ksx1001_decmap+8170,33,126},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},\r
+};\r
+\r
+static const ucs2_t __cp949ext_decmap[9650] = {\r
+44034,44035,44037,44038,44043,44044,44045,44046,44047,44056,44062,44063,44065,\r
+44066,44067,44069,44070,44071,44072,44073,44074,44075,44078,44082,44083,44084,\r
+U,U,U,U,U,U,44085,44086,44087,44090,44091,44093,44094,44095,44097,44098,44099,\r
+44100,44101,44102,44103,44104,44105,44106,44108,44110,44111,44112,44113,44114,\r
+44115,44117,U,U,U,U,U,U,44118,44119,44121,44122,44123,44125,44126,44127,44128,\r
+44129,44130,44131,44132,44133,44134,44135,44136,44137,44138,44139,44140,44141,\r
+44142,44143,44146,44147,44149,44150,44153,44155,44156,44157,44158,44159,44162,\r
+44167,44168,44173,44174,44175,44177,44178,44179,44181,44182,44183,44184,44185,\r
+44186,44187,44190,44194,44195,44196,44197,44198,44199,44203,44205,44206,44209,\r
+44210,44211,44212,44213,44214,44215,44218,44222,44223,44224,44226,44227,44229,\r
+44230,44231,44233,44234,44235,44237,44238,44239,44240,44241,44242,44243,44244,\r
+44246,44248,44249,44250,44251,44252,44253,44254,44255,44258,44259,44261,44262,\r
+44265,44267,44269,44270,44274,44276,44279,44280,44281,44282,44283,44286,44287,\r
+44289,44290,44291,44293,44295,44296,44297,44298,44299,44302,44304,44306,44307,\r
+44308,44309,44310,44311,44313,44314,44315,44317,44318,44319,44321,44322,44323,\r
+44324,44325,44326,44327,44328,44330,44331,44334,44335,44336,44337,44338,44339,\r
+U,U,U,U,U,U,44342,44343,44345,44346,44347,44349,44350,44351,44352,44353,44354,\r
+44355,44358,44360,44362,44363,44364,44365,44366,44367,44369,44370,44371,44373,\r
+44374,44375,U,U,U,U,U,U,44377,44378,44379,44380,44381,44382,44383,44384,44386,\r
+44388,44389,44390,44391,44392,44393,44394,44395,44398,44399,44401,44402,44407,\r
+44408,44409,44410,44414,44416,44419,44420,44421,44422,44423,44426,44427,44429,\r
+44430,44431,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,44443,\r
+44446,44447,44448,44449,44450,44451,44453,44454,44455,44456,44457,44458,44459,\r
+44460,44461,44462,44463,44464,44465,44466,44467,44468,44469,44470,44472,44473,\r
+44474,44475,44476,44477,44478,44479,44482,44483,44485,44486,44487,44489,44490,\r
+44491,44492,44493,44494,44495,44498,44500,44501,44502,44503,44504,44505,44506,\r
+44507,44509,44510,44511,44513,44514,44515,44517,44518,44519,44520,44521,44522,\r
+44523,44524,44525,44526,44527,44528,44529,44530,44531,44532,44533,44534,44535,\r
+44538,44539,44541,44542,44546,44547,44548,44549,44550,44551,44554,44556,44558,\r
+44559,44560,44561,44562,44563,44565,44566,44567,44568,44569,44570,44571,44572,\r
+U,U,U,U,U,U,44573,44574,44575,44576,44577,44578,44579,44580,44581,44582,44583,\r
+44584,44585,44586,44587,44588,44589,44590,44591,44594,44595,44597,44598,44601,\r
+44603,44604,U,U,U,U,U,U,44605,44606,44607,44610,44612,44615,44616,44617,44619,\r
+44623,44625,44626,44627,44629,44631,44632,44633,44634,44635,44638,44642,44643,\r
+44644,44646,44647,44650,44651,44653,44654,44655,44657,44658,44659,44660,44661,\r
+44662,44663,44666,44670,44671,44672,44673,44674,44675,44678,44679,44680,44681,\r
+44682,44683,44685,44686,44687,44688,44689,44690,44691,44692,44693,44694,44695,\r
+44696,44697,44698,44699,44700,44701,44702,44703,44704,44705,44706,44707,44708,\r
+44709,44710,44711,44712,44713,44714,44715,44716,44717,44718,44719,44720,44721,\r
+44722,44723,44724,44725,44726,44727,44728,44729,44730,44731,44735,44737,44738,\r
+44739,44741,44742,44743,44744,44745,44746,44747,44750,44754,44755,44756,44757,\r
+44758,44759,44762,44763,44765,44766,44767,44768,44769,44770,44771,44772,44773,\r
+44774,44775,44777,44778,44780,44782,44783,44784,44785,44786,44787,44789,44790,\r
+44791,44793,44794,44795,44797,44798,44799,44800,44801,44802,44803,44804,44805,\r
+U,U,U,U,U,U,44806,44809,44810,44811,44812,44814,44815,44817,44818,44819,44820,\r
+44821,44822,44823,44824,44825,44826,44827,44828,44829,44830,44831,44832,44833,\r
+44834,44835,U,U,U,U,U,U,44836,44837,44838,44839,44840,44841,44842,44843,44846,\r
+44847,44849,44851,44853,44854,44855,44856,44857,44858,44859,44862,44864,44868,\r
+44869,44870,44871,44874,44875,44876,44877,44878,44879,44881,44882,44883,44884,\r
+44885,44886,44887,44888,44889,44890,44891,44894,44895,44896,44897,44898,44899,\r
+44902,44903,44904,44905,44906,44907,44908,44909,44910,44911,44912,44913,44914,\r
+44915,44916,44917,44918,44919,44920,44922,44923,44924,44925,44926,44927,44929,\r
+44930,44931,44933,44934,44935,44937,44938,44939,44940,44941,44942,44943,44946,\r
+44947,44948,44950,44951,44952,44953,44954,44955,44957,44958,44959,44960,44961,\r
+44962,44963,44964,44965,44966,44967,44968,44969,44970,44971,44972,44973,44974,\r
+44975,44976,44977,44978,44979,44980,44981,44982,44983,44986,44987,44989,44990,\r
+44991,44993,44994,44995,44996,44997,44998,45002,45004,45007,45008,45009,45010,\r
+45011,45013,45014,45015,45016,45017,45018,45019,45021,45022,45023,45024,45025,\r
+U,U,U,U,U,U,45026,45027,45028,45029,45030,45031,45034,45035,45036,45037,45038,\r
+45039,45042,45043,45045,45046,45047,45049,45050,45051,45052,45053,45054,45055,\r
+45058,45059,U,U,U,U,U,U,45061,45062,45063,45064,45065,45066,45067,45069,45070,\r
+45071,45073,45074,45075,45077,45078,45079,45080,45081,45082,45083,45086,45087,\r
+45088,45089,45090,45091,45092,45093,45094,45095,45097,45098,45099,45100,45101,\r
+45102,45103,45104,45105,45106,45107,45108,45109,45110,45111,45112,45113,45114,\r
+45115,45116,45117,45118,45119,45120,45121,45122,45123,45126,45127,45129,45131,\r
+45133,45135,45136,45137,45138,45142,45144,45146,45147,45148,45150,45151,45152,\r
+45153,45154,45155,45156,45157,45158,45159,45160,45161,45162,45163,45164,45165,\r
+45166,45167,45168,45169,45170,45171,45172,45173,45174,45175,45176,45177,45178,\r
+45179,45182,45183,45185,45186,45187,45189,45190,45191,45192,45193,45194,45195,\r
+45198,45200,45202,45203,45204,45205,45206,45207,45211,45213,45214,45219,45220,\r
+45221,45222,45223,45226,45232,45234,45238,45239,45241,45242,45243,45245,45246,\r
+45247,45248,45249,45250,45251,45254,45258,45259,45260,45261,45262,45263,45266,\r
+U,U,U,U,U,U,45267,45269,45270,45271,45273,45274,45275,45276,45277,45278,45279,\r
+45281,45282,45283,45284,45286,45287,45288,45289,45290,45291,45292,45293,45294,\r
+45295,45296,U,U,U,U,U,U,45297,45298,45299,45300,45301,45302,45303,45304,45305,\r
+45306,45307,45308,45309,45310,45311,45312,45313,45314,45315,45316,45317,45318,\r
+45319,45322,45325,45326,45327,45329,45332,45333,45334,45335,45338,45342,45343,\r
+45344,45345,45346,45350,45351,45353,45354,45355,45357,45358,45359,45360,45361,\r
+45362,45363,45366,45370,45371,45372,45373,45374,45375,45378,45379,45381,45382,\r
+45383,45385,45386,45387,45388,45389,45390,45391,45394,45395,45398,45399,45401,\r
+45402,45403,45405,45406,45407,45409,45410,45411,45412,45413,45414,45415,45416,\r
+45417,45418,45419,45420,45421,45422,45423,45424,45425,45426,45427,45428,45429,\r
+45430,45431,45434,45435,45437,45438,45439,45441,45443,45444,45445,45446,45447,\r
+45450,45452,45454,45455,45456,45457,45461,45462,45463,45465,45466,45467,45469,\r
+45470,45471,45472,45473,45474,45475,45476,45477,45478,45479,45481,45482,45483,\r
+45484,45485,45486,45487,45488,45489,45490,45491,45492,45493,45494,45495,45496,\r
+U,U,U,U,U,U,45497,45498,45499,45500,45501,45502,45503,45504,45505,45506,45507,\r
+45508,45509,45510,45511,45512,45513,45514,45515,45517,45518,45519,45521,45522,\r
+45523,45525,U,U,U,U,U,U,45526,45527,45528,45529,45530,45531,45534,45536,45537,\r
+45538,45539,45540,45541,45542,45543,45546,45547,45549,45550,45551,45553,45554,\r
+45555,45556,45557,45558,45559,45560,45562,45564,45566,45567,45568,45569,45570,\r
+45571,45574,45575,45577,45578,45581,45582,45583,45584,45585,45586,45587,45590,\r
+45592,45594,45595,45596,45597,45598,45599,45601,45602,45603,45604,45605,45606,\r
+45607,45608,45609,45610,45611,45612,45613,45614,45615,45616,45617,45618,45619,\r
+45621,45622,45623,45624,45625,45626,45627,45629,45630,45631,45632,45633,45634,\r
+45635,45636,45637,45638,45639,45640,45641,45642,45643,45644,45645,45646,45647,\r
+45648,45649,45650,45651,45652,45653,45654,45655,45657,45658,45659,45661,45662,\r
+45663,45665,45666,45667,45668,45669,45670,45671,45674,45675,45676,45677,45678,\r
+45679,45680,45681,45682,45683,45686,45687,45688,45689,45690,45691,45693,45694,\r
+45695,45696,45697,45698,45699,45702,45703,45704,45706,45707,45708,45709,45710,\r
+U,U,U,U,U,U,45711,45714,45715,45717,45718,45719,45723,45724,45725,45726,45727,\r
+45730,45732,45735,45736,45737,45739,45741,45742,45743,45745,45746,45747,45749,\r
+45750,45751,U,U,U,U,U,U,45752,45753,45754,45755,45756,45757,45758,45759,45760,\r
+45761,45762,45763,45764,45765,45766,45767,45770,45771,45773,45774,45775,45777,\r
+45779,45780,45781,45782,45783,45786,45788,45790,45791,45792,45793,45795,45799,\r
+45801,45802,45808,45809,45810,45814,45820,45821,45822,45826,45827,45829,45830,\r
+45831,45833,45834,45835,45836,45837,45838,45839,45842,45846,45847,45848,45849,\r
+45850,45851,45853,45854,45855,45856,45857,45858,45859,45860,45861,45862,45863,\r
+45864,45865,45866,45867,45868,45869,45870,45871,45872,45873,45874,45875,45876,\r
+45877,45878,45879,45880,45881,45882,45883,45884,45885,45886,45887,45888,45889,\r
+45890,45891,45892,45893,45894,45895,45896,45897,45898,45899,45900,45901,45902,\r
+45903,45904,45905,45906,45907,45911,45913,45914,45917,45920,45921,45922,45923,\r
+45926,45928,45930,45932,45933,45935,45938,45939,45941,45942,45943,45945,45946,\r
+45947,45948,45949,45950,45951,45954,45958,45959,45960,45961,45962,45963,45965,\r
+U,U,U,U,U,U,45966,45967,45969,45970,45971,45973,45974,45975,45976,45977,45978,\r
+45979,45980,45981,45982,45983,45986,45987,45988,45989,45990,45991,45993,45994,\r
+45995,45997,U,U,U,U,U,U,45998,45999,46000,46001,46002,46003,46004,46005,46006,\r
+46007,46008,46009,46010,46011,46012,46013,46014,46015,46016,46017,46018,46019,\r
+46022,46023,46025,46026,46029,46031,46033,46034,46035,46038,46040,46042,46044,\r
+46046,46047,46049,46050,46051,46053,46054,46055,46057,46058,46059,46060,46061,\r
+46062,46063,46064,46065,46066,46067,46068,46069,46070,46071,46072,46073,46074,\r
+46075,46077,46078,46079,46080,46081,46082,46083,46084,46085,46086,46087,46088,\r
+46089,46090,46091,46092,46093,46094,46095,46097,46098,46099,46100,46101,46102,\r
+46103,46105,46106,46107,46109,46110,46111,46113,46114,46115,46116,46117,46118,\r
+46119,46122,46124,46125,46126,46127,46128,46129,46130,46131,46133,46134,46135,\r
+46136,46137,46138,46139,46140,46141,46142,46143,46144,46145,46146,46147,46148,\r
+46149,46150,46151,46152,46153,46154,46155,46156,46157,46158,46159,46162,46163,\r
+46165,46166,46167,46169,46170,46171,46172,46173,46174,46175,46178,46180,46182,\r
+U,U,U,U,U,U,46183,46184,46185,46186,46187,46189,46190,46191,46192,46193,46194,\r
+46195,46196,46197,46198,46199,46200,46201,46202,46203,46204,46205,46206,46207,\r
+46209,46210,U,U,U,U,U,U,46211,46212,46213,46214,46215,46217,46218,46219,46220,\r
+46221,46222,46223,46224,46225,46226,46227,46228,46229,46230,46231,46232,46233,\r
+46234,46235,46236,46238,46239,46240,46241,46242,46243,46245,46246,46247,46249,\r
+46250,46251,46253,46254,46255,46256,46257,46258,46259,46260,46262,46264,46266,\r
+46267,46268,46269,46270,46271,46273,46274,46275,46277,46278,46279,46281,46282,\r
+46283,46284,46285,46286,46287,46289,46290,46291,46292,46294,46295,46296,46297,\r
+46298,46299,46302,46303,46305,46306,46309,46311,46312,46313,46314,46315,46318,\r
+46320,46322,46323,46324,46325,46326,46327,46329,46330,46331,46332,46333,46334,\r
+46335,46336,46337,46338,46339,46340,46341,46342,46343,46344,46345,46346,46347,\r
+46348,46349,46350,46351,46352,46353,46354,46355,46358,46359,46361,46362,46365,\r
+46366,46367,46368,46369,46370,46371,46374,46379,46380,46381,46382,46383,46386,\r
+46387,46389,46390,46391,46393,46394,46395,46396,46397,46398,46399,46402,46406,\r
+U,U,U,U,U,U,46407,46408,46409,46410,46414,46415,46417,46418,46419,46421,46422,\r
+46423,46424,46425,46426,46427,46430,46434,46435,46436,46437,46438,46439,46440,\r
+46441,46442,U,U,U,U,U,U,46443,46444,46445,46446,46447,46448,46449,46450,46451,\r
+46452,46453,46454,46455,46456,46457,46458,46459,46460,46461,46462,46463,46464,\r
+46465,46466,46467,46468,46469,46470,46471,46472,46473,46474,46475,46476,46477,\r
+46478,46479,46480,46481,46482,46483,46484,46485,46486,46487,46488,46489,46490,\r
+46491,46492,46493,46494,46495,46498,46499,46501,46502,46503,46505,46508,46509,\r
+46510,46511,46514,46518,46519,46520,46521,46522,46526,46527,46529,46530,46531,\r
+46533,46534,46535,46536,46537,46538,46539,46542,46546,46547,46548,46549,46550,\r
+46551,46553,46554,46555,46556,46557,46558,46559,46560,46561,46562,46563,46564,\r
+46565,46566,46567,46568,46569,46570,46571,46573,46574,46575,46576,46577,46578,\r
+46579,46580,46581,46582,46583,46584,46585,46586,46587,46588,46589,46590,46591,\r
+46592,46593,46594,46595,46596,46597,46598,46599,46600,46601,46602,46603,46604,\r
+46605,46606,46607,46610,46611,46613,46614,46615,46617,46618,46619,46620,46621,\r
+U,U,U,U,U,U,46622,46623,46624,46625,46626,46627,46628,46630,46631,46632,46633,\r
+46634,46635,46637,46638,46639,46640,46641,46642,46643,46645,46646,46647,46648,\r
+46649,46650,U,U,U,U,U,U,46651,46652,46653,46654,46655,46656,46657,46658,46659,\r
+46660,46661,46662,46663,46665,46666,46667,46668,46669,46670,46671,46672,46673,\r
+46674,46675,46676,46677,46678,46679,46680,46681,46682,46683,46684,46685,46686,\r
+46687,46688,46689,46690,46691,46693,46694,46695,46697,46698,46699,46700,46701,\r
+46702,46703,46704,46705,46706,46707,46708,46709,46710,46711,46712,46713,46714,\r
+46715,46716,46717,46718,46719,46720,46721,46722,46723,46724,46725,46726,46727,\r
+46728,46729,46730,46731,46732,46733,46734,46735,46736,46737,46738,46739,46740,\r
+46741,46742,46743,46744,46745,46746,46747,46750,46751,46753,46754,46755,46757,\r
+46758,46759,46760,46761,46762,46765,46766,46767,46768,46770,46771,46772,46773,\r
+46774,46775,46776,46777,46778,46779,46780,46781,46782,46783,46784,46785,46786,\r
+46787,46788,46789,46790,46791,46792,46793,46794,46795,46796,46797,46798,46799,\r
+46800,46801,46802,46803,46805,46806,46807,46808,46809,46810,46811,46812,46813,\r
+U,U,U,U,U,U,46814,46815,46816,46817,46818,46819,46820,46821,46822,46823,46824,\r
+46825,46826,46827,46828,46829,46830,46831,46833,46834,46835,46837,46838,46839,\r
+46841,46842,U,U,U,U,U,U,46843,46844,46845,46846,46847,46850,46851,46852,46854,\r
+46855,46856,46857,46858,46859,46860,46861,46862,46863,46864,46865,46866,46867,\r
+46868,46869,46870,46871,46872,46873,46874,46875,46876,46877,46878,46879,46880,\r
+46881,46882,46883,46884,46885,46886,46887,46890,46891,46893,46894,46897,46898,\r
+46899,46900,46901,46902,46903,46906,46908,46909,46910,46911,46912,46913,46914,\r
+46915,46917,46918,46919,46921,46922,46923,46925,46926,46927,46928,46929,46930,\r
+46931,46934,46935,46936,46937,46938,46939,46940,46941,46942,46943,46945,46946,\r
+46947,46949,46950,46951,46953,46954,46955,46956,46957,46958,46959,46962,46964,\r
+46966,46967,46968,46969,46970,46971,46974,46975,46977,46978,46979,46981,46982,\r
+46983,46984,46985,46986,46987,46990,46995,46996,46997,47002,47003,47005,47006,\r
+47007,47009,47010,47011,47012,47013,47014,47015,47018,47022,47023,47024,47025,\r
+47026,47027,47030,47031,47033,47034,47035,47036,47037,47038,47039,47040,47041,\r
+U,U,U,U,U,U,47042,47043,47044,47045,47046,47048,47050,47051,47052,47053,47054,\r
+47055,47056,47057,47058,47059,47060,47061,47062,47063,47064,47065,47066,47067,\r
+47068,47069,U,U,U,U,U,U,47070,47071,47072,47073,47074,47075,47076,47077,47078,\r
+47079,47080,47081,47082,47083,47086,47087,47089,47090,47091,47093,47094,47095,\r
+47096,47097,47098,47099,47102,47106,47107,47108,47109,47110,47114,47115,47117,\r
+47118,47119,47121,47122,47123,47124,47125,47126,47127,47130,47132,47134,47135,\r
+47136,47137,47138,47139,47142,47143,47145,47146,47147,47149,47150,47151,47152,\r
+47153,47154,47155,47158,47162,47163,47164,47165,47166,47167,47169,47170,47171,\r
+47173,47174,47175,47176,47177,47178,47179,47180,47181,47182,47183,47184,47186,\r
+47188,47189,47190,47191,47192,47193,47194,47195,47198,47199,47201,47202,47203,\r
+47205,47206,47207,47208,47209,47210,47211,47214,47216,47218,47219,47220,47221,\r
+47222,47223,47225,47226,47227,47229,47230,47231,47232,47233,47234,47235,47236,\r
+47237,47238,47239,47240,47241,47242,47243,47244,47246,47247,47248,47249,47250,\r
+47251,47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,\r
+U,U,U,U,U,U,47264,47265,47266,47267,47268,47269,47270,47271,47273,47274,47275,\r
+47276,47277,47278,47279,47281,47282,47283,47285,47286,47287,47289,47290,47291,\r
+47292,47293,U,U,U,U,U,U,47294,47295,47298,47300,47302,47303,47304,47305,47306,\r
+47307,47309,47310,47311,47313,47314,47315,47317,47318,47319,47320,47321,47322,\r
+47323,47324,47326,47328,47330,47331,47332,47333,47334,47335,47338,47339,47341,\r
+47342,47343,47345,47346,47347,47348,47349,47350,47351,47354,47356,47358,47359,\r
+47360,47361,47362,47363,47365,47366,47367,47368,47369,47370,47371,47372,47373,\r
+47374,47375,47376,47377,47378,47379,47380,47381,47382,47383,47385,47386,47387,\r
+47388,47389,47390,47391,47393,47394,47395,47396,47397,47398,47399,47400,47401,\r
+47402,47403,47404,47405,47406,47407,47408,47409,47410,47411,47412,47413,47414,\r
+47415,47416,47417,47418,47419,47422,47423,47425,47426,47427,47429,47430,47431,\r
+47432,47433,47434,47435,47437,47438,47440,47442,47443,47444,47445,47446,47447,\r
+47450,47451,47453,47454,47455,47457,47458,47459,47460,47461,47462,47463,47466,\r
+47468,47470,47471,47472,47473,47474,47475,47478,47479,47481,47482,47483,47485,\r
+U,U,U,U,U,U,47486,47487,47488,47489,47490,47491,47494,47496,47499,47500,47503,\r
+47504,47505,47506,47507,47508,47509,47510,47511,47512,47513,47514,47515,47516,\r
+47517,47518,U,U,U,U,U,U,47519,47520,47521,47522,47523,47524,47525,47526,47527,\r
+47528,47529,47530,47531,47534,47535,47537,47538,47539,47541,47542,47543,47544,\r
+47545,47546,47547,47550,47552,47554,47555,47556,47557,47558,47559,47562,47563,\r
+47565,47571,47572,47573,47574,47575,47578,47580,47583,47584,47586,47590,47591,\r
+47593,47594,47595,47597,47598,47599,47600,47601,47602,47603,47606,47611,47612,\r
+47613,47614,47615,47618,47619,47620,47621,47622,47623,47625,47626,47627,47628,\r
+47629,47630,47631,47632,47633,47634,47635,47636,47638,47639,47640,47641,47642,\r
+47643,47644,47645,47646,47647,47648,47649,47650,47651,47652,47653,47654,47655,\r
+47656,47657,47658,47659,47660,47661,47662,47663,47664,47665,47666,47667,47668,\r
+47669,47670,47671,47674,47675,47677,47678,47679,47681,47683,47684,47685,47686,\r
+47687,47690,47692,47695,47696,47697,47698,47702,47703,47705,47706,47707,47709,\r
+47710,47711,47712,47713,47714,47715,47718,47722,47723,47724,47725,47726,47727,\r
+U,U,U,U,U,U,47730,47731,47733,47734,47735,47737,47738,47739,47740,47741,47742,\r
+47743,47744,47745,47746,47750,47752,47753,47754,47755,47757,47758,47759,47760,\r
+47761,47762,U,U,U,U,U,U,47763,47764,47765,47766,47767,47768,47769,47770,47771,\r
+47772,47773,47774,47775,47776,47777,47778,47779,47780,47781,47782,47783,47786,\r
+47789,47790,47791,47793,47795,47796,47797,47798,47799,47802,47804,47806,47807,\r
+47808,47809,47810,47811,47813,47814,47815,47817,47818,47819,47820,47821,47822,\r
+47823,47824,47825,47826,47827,47828,47829,47830,47831,47834,47835,47836,47837,\r
+47838,47839,47840,47841,47842,47843,47844,47845,47846,47847,47848,47849,47850,\r
+47851,47852,47853,47854,47855,47856,47857,47858,47859,47860,47861,47862,47863,\r
+47864,47865,47866,47867,47869,47870,47871,47873,47874,47875,47877,47878,47879,\r
+47880,47881,47882,47883,47884,47886,47888,47890,47891,47892,47893,47894,47895,\r
+47897,47898,47899,47901,47902,47903,47905,47906,47907,47908,47909,47910,47911,\r
+47912,47914,47916,47917,47918,47919,47920,47921,47922,47923,47927,47929,47930,\r
+47935,47936,47937,47938,47939,47942,47944,47946,47947,47948,47950,47953,47954,\r
+U,U,U,U,U,U,47955,47957,47958,47959,47961,47962,47963,47964,47965,47966,47967,\r
+47968,47970,47972,47973,47974,47975,47976,47977,47978,47979,47981,47982,47983,\r
+47984,47985,U,U,U,U,U,U,47986,47987,47988,47989,47990,47991,47992,47993,47994,\r
+47995,47996,47997,47998,47999,48000,48001,48002,48003,48004,48005,48006,48007,\r
+48009,48010,48011,48013,48014,48015,48017,48018,48019,48020,48021,48022,48023,\r
+48024,48025,48026,48027,48028,48029,48030,48031,48032,48033,48034,48035,48037,\r
+48038,48039,48041,48042,48043,48045,48046,48047,48048,48049,48050,48051,48053,\r
+48054,48056,48057,48058,48059,48060,48061,48062,48063,48065,48066,48067,48069,\r
+48070,48071,48073,48074,48075,48076,48077,48078,48079,48081,48082,48084,48085,\r
+48086,48087,48088,48089,48090,48091,48092,48093,48094,48095,48096,48097,48098,\r
+48099,48100,48101,48102,48103,48104,48105,48106,48107,48108,48109,48110,48111,\r
+48112,48113,48114,48115,48116,48117,48118,48119,48122,48123,48125,48126,48129,\r
+48131,48132,48133,48134,48135,48138,48142,48144,48146,48147,48153,48154,48160,\r
+48161,48162,48163,48166,48168,48170,48171,48172,48174,48175,48178,48179,48181,\r
+U,U,U,U,U,U,48182,48183,48185,48186,48187,48188,48189,48190,48191,48194,48198,\r
+48199,48200,48202,48203,48206,48207,48209,48210,48211,48212,48213,48214,48215,\r
+48216,48217,U,U,U,U,U,U,48218,48219,48220,48222,48223,48224,48225,48226,48227,\r
+48228,48229,48230,48231,48232,48233,48234,48235,48236,48237,48238,48239,48240,\r
+48241,48242,48243,48244,48245,48246,48247,48248,48249,48250,48251,48252,48253,\r
+48254,48255,48256,48257,48258,48259,48262,48263,48265,48266,48269,48271,48272,\r
+48273,48274,48275,48278,48280,48283,48284,48285,48286,48287,48290,48291,48293,\r
+48294,48297,48298,48299,48300,48301,48302,48303,48306,48310,48311,48312,48313,\r
+48314,48315,48318,48319,48321,48322,48323,48325,48326,48327,48328,48329,48330,\r
+48331,48332,48334,48338,48339,48340,48342,48343,48345,48346,48347,48349,48350,\r
+48351,48352,48353,48354,48355,48356,48357,48358,48359,48360,48361,48362,48363,\r
+48364,48365,48366,48367,48368,48369,48370,48371,48375,48377,48378,48379,48381,\r
+48382,48383,48384,48385,48386,48387,48390,48392,48394,48395,48396,48397,48398,\r
+48399,48401,48402,48403,48405,48406,48407,48408,48409,48410,48411,48412,48413,\r
+U,U,U,U,U,U,48414,48415,48416,48417,48418,48419,48421,48422,48423,48424,48425,\r
+48426,48427,48429,48430,48431,48432,48433,48434,48435,48436,48437,48438,48439,\r
+48440,48441,U,U,U,U,U,U,48442,48443,48444,48445,48446,48447,48449,48450,48451,\r
+48452,48453,48454,48455,48458,48459,48461,48462,48463,48465,48466,48467,48468,\r
+48469,48470,48471,48474,48475,48476,48477,48478,48479,48480,48481,48482,48483,\r
+48485,48486,48487,48489,48490,48491,48492,48493,48494,48495,48496,48497,48498,\r
+48499,48500,48501,48502,48503,48504,48505,48506,48507,48508,48509,48510,48511,\r
+48514,48515,48517,48518,48523,48524,48525,48526,48527,48530,48532,48534,48535,\r
+48536,48539,48541,48542,48543,48544,48545,48546,48547,48549,48550,48551,48552,\r
+48553,48554,48555,48556,48557,48558,48559,48561,48562,48563,48564,48565,48566,\r
+48567,48569,48570,48571,48572,48573,48574,48575,48576,48577,48578,48579,48580,\r
+48581,48582,48583,48584,48585,48586,48587,48588,48589,48590,48591,48592,48593,\r
+48594,48595,48598,48599,48601,48602,48603,48605,48606,48607,48608,48609,48610,\r
+48611,48612,48613,48614,48615,48616,48618,48619,48620,48621,48622,48623,48625,\r
+U,U,U,U,U,U,48626,48627,48629,48630,48631,48633,48634,48635,48636,48637,48638,\r
+48639,48641,48642,48644,48646,48647,48648,48649,48650,48651,48654,48655,48657,\r
+48658,48659,U,U,U,U,U,U,48661,48662,48663,48664,48665,48666,48667,48670,48672,\r
+48673,48674,48675,48676,48677,48678,48679,48680,48681,48682,48683,48684,48685,\r
+48686,48687,48688,48689,48690,48691,48692,48693,48694,48695,48696,48697,48698,\r
+48699,48700,48701,48702,48703,48704,48705,48706,48707,48710,48711,48713,48714,\r
+48715,48717,48719,48720,48721,48722,48723,48726,48728,48732,48733,48734,48735,\r
+48738,48739,48741,48742,48743,48745,48747,48748,48749,48750,48751,48754,48758,\r
+48759,48760,48761,48762,48766,48767,48769,48770,48771,48773,48774,48775,48776,\r
+48777,48778,48779,48782,48786,48787,48788,48789,48790,48791,48794,48795,48796,\r
+48797,48798,48799,48800,48801,48802,48803,48804,48805,48806,48807,48809,48810,\r
+48811,48812,48813,48814,48815,48816,48817,48818,48819,48820,48821,48822,48823,\r
+48824,48825,48826,48827,48828,48829,48830,48831,48832,48833,48834,48835,48836,\r
+48837,48838,48839,48840,48841,48842,48843,48844,48845,48846,48847,48850,48851,\r
+U,U,U,U,U,U,48853,48854,48857,48858,48859,48860,48861,48862,48863,48865,48866,\r
+48870,48871,48872,48873,48874,48875,48877,48878,48879,48880,48881,48882,48883,\r
+48884,48885,U,U,U,U,U,U,48886,48887,48888,48889,48890,48891,48892,48893,48894,\r
+48895,48896,48898,48899,48900,48901,48902,48903,48906,48907,48908,48909,48910,\r
+48911,48912,48913,48914,48915,48916,48917,48918,48919,48922,48926,48927,48928,\r
+48929,48930,48931,48932,48933,48934,48935,48936,48937,48938,48939,48940,48941,\r
+48942,48943,48944,48945,48946,48947,48948,48949,48950,48951,48952,48953,48954,\r
+48955,48956,48957,48958,48959,48962,48963,48965,48966,48967,48969,48970,48971,\r
+48972,48973,48974,48975,48978,48979,48980,48982,48983,48984,48985,48986,48987,\r
+48988,48989,48990,48991,48992,48993,48994,48995,48996,48997,48998,48999,49000,\r
+49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,49012,49013,\r
+49014,49015,49016,49017,49018,49019,49020,49021,49022,49023,49024,49025,49026,\r
+49027,49028,49029,49030,49031,49032,49033,49034,49035,49036,49037,49038,49039,\r
+49040,49041,49042,49043,49045,49046,49047,49048,49049,49050,49051,49052,49053,\r
+U,U,U,U,U,U,49054,49055,49056,49057,49058,49059,49060,49061,49062,49063,49064,\r
+49065,49066,49067,49068,49069,49070,49071,49073,49074,49075,49076,49077,49078,\r
+49079,49080,U,U,U,U,U,U,49081,49082,49083,49084,49085,49086,49087,49088,49089,\r
+49090,49091,49092,49094,49095,49096,49097,49098,49099,49102,49103,49105,49106,\r
+49107,49109,49110,49111,49112,49113,49114,49115,49117,49118,49120,49122,49123,\r
+49124,49125,49126,49127,49128,49129,49130,49131,49132,49133,49134,49135,49136,\r
+49137,49138,49139,49140,49141,49142,49143,49144,49145,49146,49147,49148,49149,\r
+49150,49151,49152,49153,49154,49155,49156,49157,49158,49159,49160,49161,49162,\r
+49163,49164,49165,49166,49167,49168,49169,49170,49171,49172,49173,49174,49175,\r
+49176,49177,49178,49179,49180,49181,49182,49183,49184,49185,49186,49187,49188,\r
+49189,49190,49191,49192,49193,49194,49195,49196,49197,49198,49199,49200,49201,\r
+49202,49203,49204,49205,49206,49207,49208,49209,49210,49211,49213,49214,49215,\r
+49216,49217,49218,49219,49220,49221,49222,49223,49224,49225,49226,49227,49228,\r
+49229,49230,49231,49232,49234,49235,49236,49237,49238,49239,49241,49242,49243,\r
+U,U,U,U,U,U,49245,49246,49247,49249,49250,49251,49252,49253,49254,49255,49258,\r
+49259,49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,\r
+49272,49273,U,U,U,U,U,U,49274,49275,49276,49277,49278,49279,49280,49281,49282,\r
+49283,49284,49285,49286,49287,49288,49289,49290,49291,49292,49293,49294,49295,\r
+49298,49299,49301,49302,49303,49305,49306,49307,49308,49309,49310,49311,49314,\r
+49316,49318,49319,49320,49321,49322,49323,49326,49329,49330,49335,49336,49337,\r
+49338,49339,49342,49346,49347,49348,49350,49351,49354,49355,49357,49358,49359,\r
+49361,49362,49363,49364,49365,49366,49367,49370,49374,49375,49376,49377,49378,\r
+49379,49382,49383,49385,49386,49387,49389,49390,49391,49392,49393,49394,49395,\r
+49398,49400,49402,49403,49404,49405,49406,49407,49409,49410,49411,49413,49414,\r
+49415,49417,49418,49419,49420,49421,49422,49423,49425,49426,49427,49428,49430,\r
+49431,49432,49433,49434,49435,49441,49442,49445,49448,49449,49450,49451,49454,\r
+49458,49459,49460,49461,49463,49466,49467,49469,49470,49471,49473,49474,49475,\r
+49476,49477,49478,49479,49482,49486,49487,49488,49489,49490,49491,49494,49495,\r
+U,U,U,U,U,U,49497,49498,49499,49501,49502,49503,49504,49505,49506,49507,49510,\r
+49514,49515,49516,49517,49518,49519,49521,49522,49523,49525,49526,49527,49529,\r
+49530,49531,U,U,U,U,U,U,49532,49533,49534,49535,49536,49537,49538,49539,49540,\r
+49542,49543,49544,49545,49546,49547,49551,49553,49554,49555,49557,49559,49560,\r
+49561,49562,49563,49566,49568,49570,49571,49572,49574,49575,49578,49579,49581,\r
+49582,49583,49585,49586,49587,49588,49589,49590,49591,49592,49593,49594,49595,\r
+49596,49598,49599,49600,49601,49602,49603,49605,49606,49607,49609,49610,49611,\r
+49613,49614,49615,49616,49617,49618,49619,49621,49622,49625,49626,49627,49628,\r
+49629,49630,49631,49633,49634,49635,49637,49638,49639,49641,49642,49643,49644,\r
+49645,49646,49647,49650,49652,49653,49654,49655,49656,49657,49658,49659,49662,\r
+49663,49665,49666,49667,49669,49670,49671,49672,49673,49674,49675,49678,49680,\r
+49682,49683,49684,49685,49686,49687,49690,49691,49693,49694,49697,49698,49699,\r
+49700,49701,49702,49703,49706,49708,49710,49712,49715,49717,49718,49719,49720,\r
+49721,49722,49723,49724,49725,49726,49727,49728,49729,49730,49731,49732,49733,\r
+U,U,U,U,U,U,49734,49735,49737,49738,49739,49740,49741,49742,49743,49746,49747,\r
+49749,49750,49751,49753,49754,49755,49756,49757,49758,49759,49761,49762,49763,\r
+49764,49766,U,U,U,U,U,U,49767,49768,49769,49770,49771,49774,49775,49777,49778,\r
+49779,49781,49782,49783,49784,49785,49786,49787,49790,49792,49794,49795,49796,\r
+49797,49798,49799,49802,49803,49804,49805,49806,49807,49809,49810,49811,49812,\r
+49813,49814,49815,49817,49818,49820,49822,49823,49824,49825,49826,49827,49830,\r
+49831,49833,49834,49835,49838,49839,49840,49841,49842,49843,49846,49848,49850,\r
+49851,49852,49853,49854,49855,49856,49857,49858,49859,49860,49861,49862,49863,\r
+49864,49865,49866,49867,49868,49869,49870,49871,49872,49873,49874,49875,49876,\r
+49877,49878,49879,49880,49881,49882,49883,49886,49887,49889,49890,49893,49894,\r
+49895,49896,49897,49898,49902,49904,49906,49907,49908,49909,49911,49914,49917,\r
+49918,49919,49921,49922,49923,49924,49925,49926,49927,49930,49931,49934,49935,\r
+49936,49937,49938,49942,49943,49945,49946,49947,49949,49950,49951,49952,49953,\r
+49954,49955,49958,49959,49962,49963,49964,49965,49966,49967,49968,49969,49970,\r
+U,U,U,U,U,U,49971,49972,49973,49974,49975,49976,49977,49978,49979,49980,49981,\r
+49982,49983,49984,49985,49986,49987,49988,49990,49991,49992,49993,49994,49995,\r
+49996,49997,U,U,U,U,U,U,49998,49999,50000,50001,50002,50003,50004,50005,50006,\r
+50007,50008,50009,50010,50011,50012,50013,50014,50015,50016,50017,50018,50019,\r
+50020,50021,50022,50023,50026,50027,50029,50030,50031,50033,50035,50036,50037,\r
+50038,50039,50042,50043,50046,50047,50048,50049,50050,50051,50053,50054,50055,\r
+50057,50058,50059,50061,50062,50063,50064,50065,50066,50067,50068,50069,50070,\r
+50071,50072,50073,50074,50075,50076,50077,50078,50079,50080,50081,50082,50083,\r
+50084,50085,50086,50087,50088,50089,50090,50091,50092,50093,50094,50095,50096,\r
+50097,50098,50099,50100,50101,50102,50103,50104,50105,50106,50107,50108,50109,\r
+50110,50111,50113,50114,50115,50116,50117,50118,50119,50120,50121,50122,50123,\r
+50124,50125,50126,50127,50128,50129,50130,50131,50132,50133,50134,50135,50138,\r
+50139,50141,50142,50145,50147,50148,50149,50150,50151,50154,50155,50156,50158,\r
+50159,50160,50161,50162,50163,50166,50167,50169,50170,50171,50172,50173,50174,\r
+U,U,U,U,U,U,50175,50176,50177,50178,50179,50180,50181,50182,50183,50185,50186,\r
+50187,50188,50189,50190,50191,50193,50194,50195,50196,50197,50198,50199,50200,\r
+50201,50202,U,U,U,U,U,U,50203,50204,50205,50206,50207,50208,50209,50210,50211,\r
+50213,50214,50215,50216,50217,50218,50219,50221,50222,50223,50225,50226,50227,\r
+50229,50230,50231,50232,50233,50234,50235,50238,50239,50240,50241,50242,50243,\r
+50244,50245,50246,50247,50249,50250,50251,50252,50253,50254,50255,50256,50257,\r
+50258,50259,50260,50261,50262,50263,50264,50265,50266,50267,50268,50269,50270,\r
+50271,50272,50273,50274,50275,50278,50279,50281,50282,50283,50285,50286,50287,\r
+50288,50289,50290,50291,50294,50295,50296,50298,50299,50300,50301,50302,50303,\r
+50305,50306,50307,50308,50309,50310,50311,50312,50313,50314,50315,50316,50317,\r
+50318,50319,50320,50321,50322,50323,50325,50326,50327,50328,50329,50330,50331,\r
+50333,50334,50335,50336,50337,50338,50339,50340,50341,50342,50343,50344,50345,\r
+50346,50347,50348,50349,50350,50351,50352,50353,50354,50355,50356,50357,50358,\r
+50359,50361,50362,50363,50365,50366,50367,50368,50369,50370,50371,50372,50373,\r
+U,U,U,U,U,U,50374,50375,50376,50377,50378,50379,50380,50381,50382,50383,50384,\r
+50385,50386,50387,50388,50389,50390,50391,50392,50393,50394,50395,50396,50397,\r
+50398,50399,U,U,U,U,U,U,50400,50401,50402,50403,50404,50405,50406,50407,50408,\r
+50410,50411,50412,50413,50414,50415,50418,50419,50421,50422,50423,50425,50427,\r
+50428,50429,50430,50434,50435,50436,50437,50438,50439,50440,50441,50442,50443,\r
+50445,50446,50447,50449,50450,50451,50453,50454,50455,50456,50457,50458,50459,\r
+50461,50462,50463,50464,50465,50466,50467,50468,50469,50470,50471,50474,50475,\r
+50477,50478,50479,50481,50482,50483,50484,50485,50486,50487,50490,50492,50494,\r
+50495,50496,50497,50498,50499,50502,50503,50507,50511,50512,50513,50514,50518,\r
+50522,50523,50524,50527,50530,50531,50533,50534,50535,50537,50538,50539,50540,\r
+50541,50542,50543,50546,50550,50551,50552,50553,50554,50555,50558,50559,50561,\r
+50562,50563,50565,50566,50568,50569,50570,50571,50574,50576,50578,50579,50580,\r
+50582,50585,50586,50587,50589,50590,50591,50593,50594,50595,50596,50597,50598,\r
+50599,50600,50602,50603,50604,50605,50606,50607,50608,50609,50610,50611,50614,\r
+U,U,U,U,U,U,50615,50618,50623,50624,50625,50626,50627,50635,50637,50639,50642,\r
+50643,50645,50646,50647,50649,50650,50651,50652,50653,50654,50655,50658,50660,\r
+50662,50663,U,U,U,U,U,U,50664,50665,50666,50667,50671,50673,50674,50675,50677,\r
+50680,50681,50682,50683,50690,50691,50692,50697,50698,50699,50701,50702,50703,\r
+50705,50706,50707,50708,50709,50710,50711,50714,50717,50718,50719,50720,50721,\r
+50722,50723,50726,50727,50729,50730,50731,50735,50737,50738,50742,50744,50746,\r
+50748,50749,50750,50751,50754,50755,50757,50758,50759,50761,50762,50763,50764,\r
+50765,50766,50767,50770,50774,50775,50776,50777,50778,50779,50782,50783,50785,\r
+50786,50787,50788,50789,50790,50791,50792,50793,50794,50795,50797,50798,50800,\r
+50802,50803,50804,50805,50806,50807,50810,50811,50813,50814,50815,50817,50818,\r
+50819,50820,50821,50822,50823,50826,50828,50830,50831,50832,50833,50834,50835,\r
+50838,50839,50841,50842,50843,50845,50846,50847,50848,50849,50850,50851,50854,\r
+50856,50858,50859,50860,50861,50862,50863,50866,50867,50869,50870,50871,50875,\r
+50876,50877,50878,50879,50882,50884,50886,50887,50888,50889,50890,50891,50894,\r
+U,U,U,U,U,U,50895,50897,50898,50899,50901,50902,50903,50904,50905,50906,50907,\r
+50910,50911,50914,50915,50916,50917,50918,50919,50922,50923,50925,50926,50927,\r
+50929,50930,U,U,U,U,U,U,50931,50932,50933,50934,50935,50938,50939,50940,50942,\r
+50943,50944,50945,50946,50947,50950,50951,50953,50954,50955,50957,50958,50959,\r
+50960,50961,50962,50963,50966,50968,50970,50971,50972,50973,50974,50975,50978,\r
+50979,50981,50982,50983,50985,50986,50987,50988,50989,50990,50991,50994,50996,\r
+50998,51000,51001,51002,51003,51006,51007,51009,51010,51011,51013,51014,51015,\r
+51016,51017,51019,51022,51024,51033,51034,51035,51037,51038,51039,51041,51042,\r
+51043,51044,51045,51046,51047,51049,51050,51052,51053,51054,51055,51056,51057,\r
+51058,51059,51062,51063,51065,51066,51067,51071,51072,51073,51074,51078,51083,\r
+51084,51085,51087,51090,51091,51093,51097,51099,51100,51101,51102,51103,51106,\r
+51111,51112,51113,51114,51115,51118,51119,51121,51122,51123,51125,51126,51127,\r
+51128,51129,51130,51131,51134,51138,51139,51140,51141,51142,51143,51146,51147,\r
+51149,51151,51153,51154,51155,51156,51157,51158,51159,51161,51162,51163,51164,\r
+U,U,U,U,U,U,51166,51167,51168,51169,51170,51171,51173,51174,51175,51177,51178,\r
+51179,51181,51182,51183,51184,51185,51186,51187,51188,51189,51190,51191,51192,\r
+51193,51194,U,U,U,U,U,U,51195,51196,51197,51198,51199,51202,51203,51205,51206,\r
+51207,51209,51211,51212,51213,51214,51215,51218,51220,51223,51224,51225,51226,\r
+51227,51230,51231,51233,51234,51235,51237,51238,51239,51240,51241,51242,51243,\r
+51246,51248,51250,51251,51252,51253,51254,51255,51257,51258,51259,51261,51262,\r
+51263,51265,51266,51267,51268,51269,51270,51271,51274,51275,51278,51279,51280,\r
+51281,51282,51283,51285,51286,51287,51288,51289,51290,51291,51292,51293,51294,\r
+51295,51296,51297,51298,51299,51300,51301,51302,51303,51304,51305,51306,51307,\r
+51308,51309,51310,51311,51314,51315,51317,51318,51319,51321,51323,51324,51325,\r
+51326,51327,51330,51332,51336,51337,51338,51342,51343,51344,51345,51346,51347,\r
+51349,51350,51351,51352,51353,51354,51355,51356,51358,51360,51362,51363,51364,\r
+51365,51366,51367,51369,51370,51371,51372,51373,51374,51375,51376,51377,51378,\r
+51379,51380,51381,51382,51383,51384,51385,51386,51387,51390,51391,51392,51393,\r
+U,U,U,U,U,U,51394,51395,51397,51398,51399,51401,51402,51403,51405,51406,51407,\r
+51408,51409,51410,51411,51414,51416,51418,51419,51420,51421,51422,51423,51426,\r
+51427,51429,U,U,U,U,U,U,51430,51431,51432,51433,51434,51435,51436,51437,51438,\r
+51439,51440,51441,51442,51443,51444,51446,51447,51448,51449,51450,51451,51454,\r
+51455,51457,51458,51459,51463,51464,51465,51466,51467,51470,51472,51474,51475,\r
+51476,51477,51478,51479,51481,51482,51483,51484,51485,51486,51487,51488,51489,\r
+51490,51491,51492,51493,51494,51495,51496,51497,51498,51499,U,U,U,U,U,U,51501,\r
+51502,51503,51504,51505,51506,51507,51509,51510,51511,51512,51513,51514,51515,\r
+51516,51517,51518,51519,51520,51521,51522,51523,51524,51525,51526,51527,U,U,U,\r
+U,U,U,51528,51529,51530,51531,51532,51533,51534,51535,51538,51539,51541,51542,\r
+51543,51545,51546,51547,51548,51549,51550,51551,51554,51556,51557,51558,51559,\r
+51560,51561,51562,51563,51565,51566,51567,51569,51570,51571,51573,51574,51575,\r
+51576,51577,51578,51579,51581,51582,51583,51584,51585,51586,51587,51588,51589,\r
+51590,51591,51594,51595,51597,51598,51599,U,U,U,U,U,U,51601,51602,51603,51604,\r
+51605,51606,51607,51610,51612,51614,51615,51616,51617,51618,51619,51620,51621,\r
+51622,51623,51624,51625,51626,51627,51628,51629,51630,U,U,U,U,U,U,51631,51632,\r
+51633,51634,51635,51636,51637,51638,51639,51640,51641,51642,51643,51644,51645,\r
+51646,51647,51650,51651,51653,51654,51657,51659,51660,51661,51662,51663,51666,\r
+51668,51671,51672,51675,51678,51679,51681,51683,51685,51686,51688,51689,51690,\r
+51691,51694,51698,51699,51700,51701,51702,51703,51706,51707,51709,51710,51711,\r
+51713,51714,51715,51716,U,U,U,U,U,U,51717,51718,51719,51722,51726,51727,51728,\r
+51729,51730,51731,51733,51734,51735,51737,51738,51739,51740,51741,51742,51743,\r
+51744,51745,51746,51747,51748,51749,U,U,U,U,U,U,51750,51751,51752,51754,51755,\r
+51756,51757,51758,51759,51760,51761,51762,51763,51764,51765,51766,51767,51768,\r
+51769,51770,51771,51772,51773,51774,51775,51776,51777,51778,51779,51780,51781,\r
+51782,51783,51784,51785,51786,51787,51790,51791,51793,51794,51795,51797,51798,\r
+51799,51800,51801,51802,51803,51806,51810,51811,51812,51813,51814,51815,51817,\r
+51818,U,U,U,U,U,U,51819,51820,51821,51822,51823,51824,51825,51826,51827,51828,\r
+51829,51830,51831,51832,51833,51834,51835,51836,51838,51839,51840,51841,51842,\r
+51843,51845,51846,U,U,U,U,U,U,51847,51848,51849,51850,51851,51852,51853,51854,\r
+51855,51856,51857,51858,51859,51860,51861,51862,51863,51865,51866,51867,51868,\r
+51869,51870,51871,51872,51873,51874,51875,51876,51877,51878,51879,51880,51881,\r
+51882,51883,51884,51885,51886,51887,51888,51889,51890,51891,51892,51893,51894,\r
+51895,51896,51897,51898,51899,51902,51903,51905,51906,51907,51909,U,U,U,U,U,U,\r
+51910,51911,51912,51913,51914,51915,51918,51920,51922,51924,51925,51926,51927,\r
+51930,51931,51932,51933,51934,51935,51937,51938,51939,51940,51941,51942,51943,\r
+U,U,U,U,U,U,51944,51945,51946,51947,51949,51950,51951,51952,51953,51954,51955,\r
+51957,51958,51959,51960,51961,51962,51963,51964,51965,51966,51967,51968,51969,\r
+51970,51971,51972,51973,51974,51975,51977,51978,51979,51980,51981,51982,51983,\r
+51985,51986,51987,51989,51990,51991,51993,51994,51995,51996,51997,51998,51999,\r
+52002,52003,52004,52005,52006,52007,52008,52009,U,U,U,U,U,U,52010,52011,52012,\r
+52013,52014,52015,52016,52017,52018,52019,52020,52021,52022,52023,52024,52025,\r
+52026,52027,52028,52029,52030,52031,52032,52034,52035,52036,U,U,U,U,U,U,52037,\r
+52038,52039,52042,52043,52045,52046,52047,52049,52050,52051,52052,52053,52054,\r
+52055,52058,52059,52060,52062,52063,52064,52065,52066,52067,52069,52070,52071,\r
+52072,52073,52074,52075,52076,52077,52078,52079,52080,52081,52082,52083,52084,\r
+52085,52086,52087,52090,52091,52092,52093,52094,52095,52096,52097,52098,52099,\r
+52100,52101,52102,52103,52104,U,U,U,U,U,U,52105,52106,52107,52108,52109,52110,\r
+52111,52112,52113,52114,52115,52116,52117,52118,52119,52120,52121,52122,52123,\r
+52125,52126,52127,52128,52129,52130,52131,U,U,U,U,U,U,52132,52133,52134,52135,\r
+52136,52137,52138,52139,52140,52141,52142,52143,52144,52145,52146,52147,52148,\r
+52149,52150,52151,52153,52154,52155,52156,52157,52158,52159,52160,52161,52162,\r
+52163,52164,52165,52166,52167,52168,52169,52170,52171,52172,52173,52174,52175,\r
+52176,52177,52178,52179,52181,52182,52183,52184,52185,52186,52187,52188,52189,\r
+52190,52191,U,U,U,U,U,U,52192,52193,52194,52195,52197,52198,52200,52202,52203,\r
+52204,52205,52206,52207,52208,52209,52210,52211,52212,52213,52214,52215,52216,\r
+52217,52218,52219,52220,U,U,U,U,U,U,52221,52222,52223,52224,52225,52226,52227,\r
+52228,52229,52230,52231,52232,52233,52234,52235,52238,52239,52241,52242,52243,\r
+52245,52246,52247,52248,52249,52250,52251,52254,52255,52256,52259,52260,52261,\r
+52262,52266,52267,52269,52271,52273,52274,52275,52276,52277,52278,52279,52282,\r
+52287,52288,52289,52290,52291,52294,52295,52297,52298,52299,52301,52302,U,U,U,\r
+U,U,U,52303,52304,52305,52306,52307,52310,52314,52315,52316,52317,52318,52319,\r
+52321,52322,52323,52325,52327,52329,52330,52331,52332,52333,52334,52335,52337,\r
+52338,U,U,U,U,U,U,52339,52340,52342,52343,52344,52345,52346,52347,52348,52349,\r
+52350,52351,52352,52353,52354,52355,52356,52357,52358,52359,52360,52361,52362,\r
+52363,52364,52365,52366,52367,52368,52369,52370,52371,52372,52373,52374,52375,\r
+52378,52379,52381,52382,52383,52385,52386,52387,52388,52389,52390,52391,52394,\r
+52398,52399,52400,52401,52402,52403,52406,52407,52409,U,U,U,U,U,U,52410,52411,\r
+52413,52414,52415,52416,52417,52418,52419,52422,52424,52426,52427,52428,52429,\r
+52430,52431,52433,52434,52435,52437,52438,52439,52440,52441,52442,U,U,U,U,U,U,\r
+52443,52444,52445,52446,52447,52448,52449,52450,52451,52453,52454,52455,52456,\r
+52457,52458,52459,52461,52462,52463,52465,52466,52467,52468,52469,52470,52471,\r
+52472,52473,52474,52475,52476,52477,52478,52479,52480,52482,52483,52484,52485,\r
+52486,52487,52490,52491,52493,52494,52495,52497,52498,52499,52500,52501,52502,\r
+52503,52506,52508,52510,52511,52512,U,U,U,U,U,U,52513,52514,52515,52517,52518,\r
+52519,52521,52522,52523,52525,52526,52527,52528,52529,52530,52531,52532,52533,\r
+52534,52535,52536,52538,52539,52540,52541,52542,U,U,U,U,U,U,52543,52544,52545,\r
+52546,52547,52548,52549,52550,52551,52552,52553,52554,52555,52556,52557,52558,\r
+52559,52560,52561,52562,52563,52564,52565,52566,52567,52568,52569,52570,52571,\r
+52573,52574,52575,52577,52578,52579,52581,52582,52583,52584,52585,52586,52587,\r
+52590,52592,52594,52595,52596,52597,52598,52599,52601,52602,52603,52604,52605,\r
+52606,52607,52608,U,U,U,U,U,U,52609,52610,52611,52612,52613,52614,52615,52617,\r
+52618,52619,52620,52621,52622,52623,52624,52625,52626,52627,52630,52631,52633,\r
+52634,52635,52637,52638,52639,U,U,U,U,U,U,52640,52641,52642,52643,52646,52648,\r
+52650,52651,52652,52653,52654,52655,52657,52658,52659,52660,52661,52662,52663,\r
+52664,52665,52666,52667,52668,52669,52670,52671,52672,52673,52674,52675,52677,\r
+52678,52679,52680,52681,52682,52683,52685,52686,52687,52689,52690,52691,52692,\r
+52693,52694,52695,52696,52697,52698,52699,52700,52701,52702,52703,52704,52705,\r
+U,U,U,U,U,U,52706,52707,52708,52709,52710,52711,52713,52714,52715,52717,52718,\r
+52719,52721,52722,52723,52724,52725,52726,52727,52730,52732,52734,52735,52736,\r
+52737,52738,U,U,U,U,U,U,52739,52741,52742,52743,52745,52746,52747,52749,52750,\r
+52751,52752,52753,52754,52755,52757,52758,52759,52760,52762,52763,52764,52765,\r
+52766,52767,52770,52771,52773,52774,52775,52777,52778,52779,52780,52781,52782,\r
+52783,52786,52788,52790,52791,52792,52793,52794,52795,52796,52797,52798,52799,\r
+52800,52801,52802,52803,52804,52805,52806,52807,52808,52809,U,U,U,U,U,U,52810,\r
+52811,52812,52813,52814,52815,52816,52817,52818,52819,52820,52821,52822,52823,\r
+52826,52827,52829,52830,52834,52835,52836,52837,52838,52839,52842,52844,U,U,U,\r
+U,U,U,52846,52847,52848,52849,52850,52851,52854,52855,52857,52858,52859,52861,\r
+52862,52863,52864,52865,52866,52867,52870,52872,52874,52875,52876,52877,52878,\r
+52879,52882,52883,52885,52886,52887,52889,52890,52891,52892,52893,52894,52895,\r
+52898,52902,52903,52904,52905,52906,52907,52910,52911,52912,52913,52914,52915,\r
+52916,52917,52918,52919,52920,52921,52922,U,U,U,U,U,U,52923,52924,52925,52926,\r
+52927,52928,52930,52931,52932,52933,52934,52935,52936,52937,52938,52939,52940,\r
+52941,52942,52943,52944,52945,52946,52947,52948,52949,U,U,U,U,U,U,52950,52951,\r
+52952,52953,52954,52955,52956,52957,52958,52959,52960,52961,52962,52963,52966,\r
+52967,52969,52970,52973,52974,52975,52976,52977,52978,52979,52982,52986,52987,\r
+52988,52989,52990,52991,52994,52995,52997,52998,52999,53001,53002,53003,53004,\r
+53005,53006,53007,53010,53012,53014,53015,53016,53017,53018,53019,53021,53022,\r
+53023,53025,53026,53027,U,U,U,U,U,U,53029,53030,53031,53032,53033,53034,53035,\r
+53038,53042,53043,53044,53045,53046,53047,53049,53050,53051,53052,53053,53054,\r
+53055,53056,53057,53058,53059,53060,U,U,U,U,U,U,53061,53062,53063,53064,53065,\r
+53066,53067,53068,53069,53070,53071,53072,53073,53074,53075,53078,53079,53081,\r
+53082,53083,53085,53086,53087,53088,53089,53090,53091,53094,53096,53098,53099,\r
+53100,53101,53102,53103,53106,53107,53109,53110,53111,53113,53114,53115,53116,\r
+53117,53118,53119,53121,53122,53123,53124,53126,53127,53128,53129,53130,53131,\r
+53133,U,U,U,U,U,U,53134,53135,53136,53137,53138,53139,53140,53141,53142,53143,\r
+53144,53145,53146,53147,53148,53149,53150,53151,53152,53154,53155,53156,53157,\r
+53158,53159,53161,U,U,U,U,U,U,53162,53163,53164,53165,53166,53167,53169,53170,\r
+53171,53172,53173,53174,53175,53176,53177,53178,53179,53180,53181,53182,53183,\r
+53184,53185,53186,53187,53189,53190,53191,53192,53193,53194,53195,53196,53197,\r
+53198,53199,53200,53201,53202,53203,53204,53205,53206,53207,53208,53209,53210,\r
+53211,53212,53213,53214,53215,53218,53219,53221,53222,53223,53225,U,U,U,U,U,U,\r
+53226,53227,53228,53229,53230,53231,53234,53236,53238,53239,53240,53241,53242,\r
+53243,53245,53246,53247,53249,53250,53251,53253,53254,53255,53256,53257,53258,\r
+U,U,U,U,U,U,53259,53260,53261,53262,53263,53264,53266,53267,53268,53269,53270,\r
+53271,53273,53274,53275,53276,53277,53278,53279,53280,53281,53282,53283,53284,\r
+53285,53286,53287,53288,53289,53290,53291,53292,53294,53295,53296,53297,53298,\r
+53299,53302,53303,53305,53306,53307,53309,53310,53311,53312,53313,53314,53315,\r
+53318,53320,53322,53323,53324,53325,53326,53327,U,U,U,U,U,U,53329,53330,53331,\r
+53333,53334,53335,53337,53338,53339,53340,53341,53342,53343,53345,53346,53347,\r
+53348,53349,53350,53351,53352,53353,53354,53355,53358,53359,U,U,U,U,U,U,53361,\r
+53362,53363,53365,53366,53367,53368,53369,53370,53371,53374,53375,53376,53378,\r
+53379,53380,53381,53382,53383,53384,53385,53386,53387,53388,53389,53390,53391,\r
+53392,53393,53394,53395,53396,53397,53398,53399,53400,53401,53402,53403,53404,\r
+53405,53406,53407,53408,53409,53410,53411,53414,53415,53417,53418,53419,53421,\r
+53422,53423,53424,53425,53426,U,U,U,U,U,U,53427,53430,53432,53434,53435,53436,\r
+53437,53438,53439,53442,53443,53445,53446,53447,53450,53451,53452,53453,53454,\r
+53455,53458,53462,53463,53464,53465,53466,U,U,U,U,U,U,53467,53470,53471,53473,\r
+53474,53475,53477,53478,53479,53480,53481,53482,53483,53486,53490,53491,53492,\r
+53493,53494,53495,53497,53498,53499,53500,53501,53502,53503,53504,53505,53506,\r
+53507,53508,53509,53510,53511,53512,53513,53514,53515,53516,53518,53519,53520,\r
+53521,53522,53523,53524,53525,53526,53527,53528,53529,53530,53531,53532,53533,\r
+53534,53535,U,U,U,U,U,U,53536,53537,53538,53539,53540,53541,53542,53543,53544,\r
+53545,53546,53547,53548,53549,53550,53551,53554,53555,53557,53558,53559,53561,\r
+53563,53564,53565,53566,U,U,U,U,U,U,53567,53570,53574,53575,53576,53577,53578,\r
+53579,53582,53583,53585,53586,53587,53589,53590,53591,53592,53593,53594,53595,\r
+53598,53600,53602,53603,53604,53605,53606,53607,53609,53610,53611,53613,53614,\r
+53615,53616,53617,53618,53619,53620,53621,53622,53623,53624,53625,53626,53627,\r
+53629,53630,53631,53632,53633,53634,53635,53637,53638,53639,53641,53642,U,U,U,\r
+U,U,U,53643,53644,53645,53646,53647,53648,53649,53650,53651,53652,53653,53654,\r
+53655,53656,53657,53658,53659,53660,53661,53662,53663,53666,53667,53669,53670,\r
+53671,U,U,U,U,U,U,53673,53674,53675,53676,53677,53678,53679,53682,53684,53686,\r
+53687,53688,53689,53691,53693,53694,53695,53697,53698,53699,53700,53701,53702,\r
+53703,53704,53705,53706,53707,53708,53709,53710,53711,53712,53713,53714,53715,\r
+53716,53717,53718,53719,53721,53722,53723,53724,53725,53726,53727,53728,53729,\r
+53730,53731,53732,53733,53734,53735,53736,53737,53738,U,U,U,U,U,U,53739,53740,\r
+53741,53742,53743,53744,53745,53746,53747,53749,53750,53751,53753,53754,53755,\r
+53756,53757,53758,53759,53760,53761,53762,53763,53764,53765,53766,U,U,U,U,U,U,\r
+53768,53770,53771,53772,53773,53774,53775,53777,53778,53779,53780,53781,53782,\r
+53783,53784,53785,53786,53787,53788,53789,53790,53791,53792,53793,53794,53795,\r
+53796,53797,53798,53799,53800,53801,53802,53803,53806,53807,53809,53810,53811,\r
+53813,53814,53815,53816,53817,53818,53819,53822,53824,53826,53827,53828,53829,\r
+53830,53831,53833,53834,53835,53836,U,U,U,U,U,U,53837,53838,53839,53840,53841,\r
+53842,53843,53844,53845,53846,53847,53848,53849,53850,53851,53853,53854,53855,\r
+53856,53857,53858,53859,53861,53862,53863,53864,U,U,U,U,U,U,53865,53866,53867,\r
+53868,53869,53870,53871,53872,53873,53874,53875,53876,53877,53878,53879,53880,\r
+53881,53882,53883,53884,53885,53886,53887,53890,53891,53893,53894,53895,53897,\r
+53898,53899,53900,53901,53902,53903,53906,53907,53908,53910,53911,53912,53913,\r
+53914,53915,53917,53918,53919,53921,53922,53923,53925,53926,53927,53928,53929,\r
+53930,53931,53933,U,U,U,U,U,U,53934,53935,53936,53938,53939,53940,53941,53942,\r
+53943,53946,53947,53949,53950,53953,53955,53956,53957,53958,53959,53962,53964,\r
+53965,53966,53967,53968,53969,U,U,U,U,U,U,53970,53971,53973,53974,53975,53977,\r
+53978,53979,53981,53982,53983,53984,53985,53986,53987,53990,53991,53992,53993,\r
+53994,53995,53996,53997,53998,53999,54002,54003,54005,54006,54007,54009,54010,\r
+54011,54012,54013,54014,54015,54018,54020,54022,54023,54024,54025,54026,54027,\r
+54031,54033,54034,54035,54037,54039,54040,54041,54042,54043,54046,54050,54051,\r
+U,U,U,U,U,U,54052,54054,54055,54058,54059,54061,54062,54063,54065,54066,54067,\r
+54068,54069,54070,54071,54074,54078,54079,54080,54081,54082,54083,54086,54087,\r
+54088,54089,U,U,U,U,U,U,54090,54091,54092,54093,54094,54095,54096,54097,54098,\r
+54099,54100,54101,54102,54103,54104,54105,54106,54107,54108,54109,54110,54111,\r
+54112,54113,54114,54115,54116,54117,54118,54119,54120,54121,54122,54123,54124,\r
+54125,54126,54127,54128,54129,54130,54131,54132,54133,54134,54135,54136,54137,\r
+54138,54139,54142,54143,54145,54146,54147,54149,54150,54151,U,U,U,U,U,U,54152,\r
+54153,54154,54155,54158,54162,54163,54164,54165,54166,54167,54170,54171,54173,\r
+54174,54175,54177,54178,54179,54180,54181,54182,54183,54186,54188,54190,U,U,U,\r
+U,U,U,54191,54192,54193,54194,54195,54197,54198,54199,54201,54202,54203,54205,\r
+54206,54207,54208,54209,54210,54211,54214,54215,54218,54219,54220,54221,54222,\r
+54223,54225,54226,54227,54228,54229,54230,54231,54233,54234,54235,54236,54237,\r
+54238,54239,54240,54242,54244,54245,54246,54247,54248,54249,54250,54251,54254,\r
+54255,54257,54258,54259,54261,54262,54263,U,U,U,U,U,U,54264,54265,54266,54267,\r
+54270,54272,54274,54275,54276,54277,54278,54279,54281,54282,54283,54284,54285,\r
+54286,54287,54288,54289,54290,54291,54292,54293,54294,U,U,U,U,U,U,54295,54296,\r
+54297,54298,54299,54300,54302,54303,54304,54305,54306,54307,54308,54309,54310,\r
+54311,54312,54313,54314,54315,54316,54317,54318,54319,54320,54321,54322,54323,\r
+54324,54325,54326,54327,54328,54329,54330,54331,54332,54333,54334,54335,54337,\r
+54338,54339,54341,54342,54343,54344,54345,54346,54347,54348,54349,54350,54351,\r
+54352,54353,54354,54355,U,U,U,U,U,U,54356,54357,54358,54359,54360,54361,54362,\r
+54363,54365,54366,54367,54369,54370,54371,54373,54374,54375,54376,54377,54378,\r
+54379,54380,54382,54384,54385,54386,U,U,U,U,U,U,54387,54388,54389,54390,54391,\r
+54394,54395,54397,54398,54401,54403,54404,54405,54406,54407,54410,54412,54414,\r
+54415,54416,54417,54418,54419,54421,54422,54423,54424,54425,54426,54427,54428,\r
+54429,54430,54431,54432,54433,54434,54435,54436,54437,54438,54439,54440,54442,\r
+54443,54444,54445,54446,54447,54448,54449,54450,54451,54452,54453,54454,54455,\r
+54456,U,U,U,U,U,U,54457,54458,54459,54460,54461,54462,54463,54464,54465,54466,\r
+54467,54468,54469,54470,54471,54472,54473,54474,54475,54477,54478,54479,54481,\r
+54482,54483,54485,U,U,U,U,U,U,54486,54487,54488,54489,54490,54491,54493,54494,\r
+54496,54497,54498,54499,54500,54501,54502,54503,54505,54506,54507,54509,54510,\r
+54511,54513,54514,54515,54516,54517,54518,54519,54521,54522,54524,54526,54527,\r
+54528,54529,54530,54531,54533,54534,54535,54537,54538,54539,54541,54542,54543,\r
+54544,54545,54546,54547,54550,54552,54553,54554,54555,54556,54557,U,U,U,U,U,U,\r
+54558,54559,54560,54561,54562,54563,54564,54565,54566,54567,54568,54569,54570,\r
+54571,54572,54573,54574,54575,54576,54577,54578,54579,54580,54581,54582,54583,\r
+U,U,U,U,U,U,54584,54585,54586,54587,54590,54591,54593,54594,54595,54597,54598,\r
+54599,54600,54601,54602,54603,54606,54608,54610,54611,54612,54613,54614,54615,\r
+54618,54619,54621,54622,54623,54625,54626,54627,54628,54630,54631,54634,54636,\r
+54638,54639,54640,54641,54642,54643,54646,54647,54649,54650,54651,54653,54654,\r
+54655,54656,54657,54658,54659,54662,54666,54667,U,U,U,U,U,U,54668,54669,54670,\r
+54671,54673,54674,54675,54676,54677,54678,54679,54680,54681,54682,54683,54684,\r
+54685,54686,54687,54688,54689,54690,54691,54692,54694,54695,U,U,U,U,U,U,54696,\r
+54697,54698,54699,54700,54701,54702,54703,54704,54705,54706,54707,54708,54709,\r
+54710,54711,54712,54713,54714,54715,54716,54717,54718,54719,54720,54721,54722,\r
+54723,54724,54725,54726,54727,54730,54731,54733,54734,54735,54737,54739,54740,\r
+54741,54742,54743,54746,54748,54750,54751,54752,54753,54754,54755,54758,54759,\r
+54761,54762,54763,54765,54766,U,U,U,U,U,U,54767,54768,54769,54770,54771,54774,\r
+54776,54778,54779,54780,54781,54782,54783,54786,54787,54789,54790,54791,54793,\r
+54794,54795,54796,54797,54798,54799,54802,U,U,U,U,U,U,54806,54807,54808,54809,\r
+54810,54811,54813,54814,54815,54817,54818,54819,54821,54822,54823,54824,54825,\r
+54826,54827,54828,54830,54831,54832,54833,54834,54835,54836,54837,54838,54839,\r
+54842,54843,54845,54846,54847,54849,54850,54851,54852,54854,54855,54858,54860,\r
+54862,54863,54864,54866,54867,54870,54871,54873,54874,54875,54877,54878,54879,\r
+54880,54881,U,U,U,U,U,U,54882,54883,54884,54885,54886,54888,54890,54891,54892,\r
+54893,54894,54895,54898,54899,54901,54902,54903,54904,54905,54906,54907,54908,\r
+54909,54910,54911,54912,U,U,U,U,U,U,54913,54914,54916,54918,54919,54920,54921,\r
+54922,54923,54926,54927,54929,54930,54931,54933,54934,54935,54936,54937,54938,\r
+54939,54940,54942,54944,54946,54947,54948,54949,54950,54951,54953,54954,54955,\r
+54957,54958,54959,54961,54962,54963,54964,54965,54966,54967,54968,54970,54972,\r
+54973,54974,54975,54976,54977,54978,54979,54982,54983,54985,54986,54987,U,U,U,\r
+U,U,U,54989,54990,54991,54992,54994,54995,54997,54998,55000,55002,55003,55004,\r
+55005,55006,55007,55009,55010,55011,55013,55014,55015,55017,55018,55019,55020,\r
+55021,U,U,U,U,U,U,55022,55023,55025,55026,55027,55028,55030,55031,55032,55033,\r
+55034,55035,55038,55039,55041,55042,55043,55045,55046,55047,55048,55049,55050,\r
+55051,55052,55053,55054,55055,55056,55058,55059,55060,55061,55062,55063,55066,\r
+55067,55069,55070,55071,55073,55074,55075,55076,55077,55078,55079,55082,55084,\r
+55086,55087,55088,55089,55090,55091,55094,55095,55097,U,U,U,U,U,U,55098,55099,\r
+55101,55102,55103,55104,55105,55106,55107,55109,55110,55112,55114,55115,55116,\r
+55117,55118,55119,55122,55123,55125,55130,55131,55132,55133,55134,U,U,U,U,U,U,\r
+55135,55138,55140,55142,55143,55144,55146,55147,55149,55150,55151,55153,55154,\r
+55155,55157,55158,55159,55160,55161,55162,55163,55166,55167,55168,55170,55171,\r
+55172,55173,55174,55175,55178,55179,55181,55182,55183,55185,55186,55187,55188,\r
+55189,55190,55191,55194,55196,55198,55199,55200,55201,55202,55203,\r
+};\r
+\r
+static const struct dbcs_index cp949ext_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{__cp949ext_decmap+0,65,254},{__cp949ext_decmap+190,\r
+65,254},{__cp949ext_decmap+380,65,254},{__cp949ext_decmap+570,65,254},{\r
+__cp949ext_decmap+760,65,254},{__cp949ext_decmap+950,65,254},{\r
+__cp949ext_decmap+1140,65,254},{__cp949ext_decmap+1330,65,254},{\r
+__cp949ext_decmap+1520,65,254},{__cp949ext_decmap+1710,65,254},{\r
+__cp949ext_decmap+1900,65,254},{__cp949ext_decmap+2090,65,254},{\r
+__cp949ext_decmap+2280,65,254},{__cp949ext_decmap+2470,65,254},{\r
+__cp949ext_decmap+2660,65,254},{__cp949ext_decmap+2850,65,254},{\r
+__cp949ext_decmap+3040,65,254},{__cp949ext_decmap+3230,65,254},{\r
+__cp949ext_decmap+3420,65,254},{__cp949ext_decmap+3610,65,254},{\r
+__cp949ext_decmap+3800,65,254},{__cp949ext_decmap+3990,65,254},{\r
+__cp949ext_decmap+4180,65,254},{__cp949ext_decmap+4370,65,254},{\r
+__cp949ext_decmap+4560,65,254},{__cp949ext_decmap+4750,65,254},{\r
+__cp949ext_decmap+4940,65,254},{__cp949ext_decmap+5130,65,254},{\r
+__cp949ext_decmap+5320,65,254},{__cp949ext_decmap+5510,65,254},{\r
+__cp949ext_decmap+5700,65,254},{__cp949ext_decmap+5890,65,254},{\r
+__cp949ext_decmap+6080,65,160},{__cp949ext_decmap+6176,65,160},{\r
+__cp949ext_decmap+6272,65,160},{__cp949ext_decmap+6368,65,160},{\r
+__cp949ext_decmap+6464,65,160},{__cp949ext_decmap+6560,65,160},{\r
+__cp949ext_decmap+6656,65,160},{__cp949ext_decmap+6752,65,160},{\r
+__cp949ext_decmap+6848,65,160},{__cp949ext_decmap+6944,65,160},{\r
+__cp949ext_decmap+7040,65,160},{__cp949ext_decmap+7136,65,160},{\r
+__cp949ext_decmap+7232,65,160},{__cp949ext_decmap+7328,65,160},{\r
+__cp949ext_decmap+7424,65,160},{__cp949ext_decmap+7520,65,160},{\r
+__cp949ext_decmap+7616,65,160},{__cp949ext_decmap+7712,65,160},{\r
+__cp949ext_decmap+7808,65,160},{__cp949ext_decmap+7904,65,160},{\r
+__cp949ext_decmap+8000,65,160},{__cp949ext_decmap+8096,65,160},{\r
+__cp949ext_decmap+8192,65,160},{__cp949ext_decmap+8288,65,160},{\r
+__cp949ext_decmap+8384,65,160},{__cp949ext_decmap+8480,65,160},{\r
+__cp949ext_decmap+8576,65,160},{__cp949ext_decmap+8672,65,160},{\r
+__cp949ext_decmap+8768,65,160},{__cp949ext_decmap+8864,65,160},{\r
+__cp949ext_decmap+8960,65,160},{__cp949ext_decmap+9056,65,160},{\r
+__cp949ext_decmap+9152,65,160},{__cp949ext_decmap+9248,65,160},{\r
+__cp949ext_decmap+9344,65,160},{__cp949ext_decmap+9440,65,160},{\r
+__cp949ext_decmap+9536,65,160},{__cp949ext_decmap+9632,65,82},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __cp949_encmap[33133] = {\r
+8750,N,N,8756,N,N,8535,8487,N,10275,N,N,8489,8807,N,8518,8510,10615,10616,\r
+8741,N,8786,8484,8748,10614,10284,N,10361,10358,10362,8751,N,N,N,N,N,N,10273,\r
+N,N,N,N,N,N,N,N,N,10274,N,N,N,N,N,N,8511,10282,N,N,N,N,N,10285,10540,N,N,N,N,\r
+N,N,10529,N,N,N,N,N,N,N,N,N,10531,N,N,N,N,N,N,8512,10538,N,N,N,N,N,10541,\r
+10530,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10276,10532,N,N,N,N,N,N,N,N,N,\r
+10533,10278,10534,N,N,N,N,10535,N,N,N,N,N,N,10280,10536,10281,10537,N,N,N,N,N,\r
+N,10544,10287,10543,N,N,N,N,N,N,10283,10539,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,10286,10542,8743,N,N,N,N,N,N,N,N,8752,N,N,N,N,N,N,N,8744,8747,8746,8749,N,\r
+8745,9537,9538,9539,9540,9541,9542,9543,9544,9545,9546,9547,9548,9549,9550,\r
+9551,9552,9553,N,9554,9555,9556,9557,9558,9559,9560,N,N,N,N,N,N,N,9569,9570,\r
+9571,9572,9573,9574,9575,9576,9577,9578,9579,9580,9581,9582,9583,9584,9585,N,\r
+9586,9587,9588,9589,9590,9591,9592,11303,N,N,N,N,N,N,N,N,N,N,N,N,N,N,11297,\r
+11298,11299,11300,11301,11302,11304,11305,11306,11307,11308,11309,11310,11311,\r
+11312,11313,11314,11315,11316,11317,11318,11319,11320,11321,11322,11323,11324,\r
+11325,11326,11327,11328,11329,11345,11346,11347,11348,11349,11350,11352,11353,\r
+11354,11355,11356,11357,11358,11359,11360,11361,11362,11363,11364,11365,11366,\r
+11367,11368,11369,11370,11371,11372,11373,11374,11375,11376,11377,N,11351,\r
+8490,N,N,8494,8495,N,N,8496,8497,N,N,8787,8788,N,N,N,8485,8486,N,N,N,N,N,N,N,\r
+N,N,8758,N,8519,8520,N,N,N,N,N,N,N,8536,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+10617,N,N,N,N,N,N,N,N,N,N,10618,N,10619,10620,10621,10622,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8806,8521,N,N,N,N,N,\r
+8757,N,N,N,N,N,N,N,N,N,10020,N,N,8800,N,N,N,N,N,N,N,N,N,N,8805,8802,N,N,N,\r
+10073,N,N,N,N,8522,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,10359,10360,N,N,N,N,N,N,10363,10364,10365,10366,N,9520,\r
+9521,9522,9523,9524,9525,9526,9527,9528,9529,N,N,N,N,N,N,9505,9506,9507,9508,\r
+9509,9510,9511,9512,9513,9514,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+8551,8552,8550,8553,8554,8789,8792,8790,8793,8791,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,8737,N,8738,8739,N,8531,8740,N,N,N,8532,8564,N,N,8565,N,N,N,8755,N,8754,\r
+N,N,N,N,N,N,N,N,8558,N,N,8560,8516,N,8528,N,N,N,N,8491,N,8572,8573,8571,8570,\r
+8562,8563,N,8753,N,N,N,N,N,8517,8561,N,N,N,N,N,N,8493,8559,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,8534,N,N,N,N,N,N,N,N,N,N,N,N,N,8513,8533,N,N,8514,8515,\r
+N,N,N,N,8556,8557,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8568,8569,N,N,\r
+8566,8567,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8769,N,N,N,N,N,N,N,N,N,N,N,8529,\r
+8530,10343,10344,10345,10346,10347,10348,10349,10350,10351,10352,10353,10354,\r
+10355,10356,10357,N,N,N,N,N,10599,10600,10601,10602,10603,10604,10605,10606,\r
+10607,10608,10609,10610,10611,10612,10613,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,10573,10574,10575,10576,10577,10578,10579,10580,10581,10582,\r
+10583,10584,10585,10586,10587,10588,10589,10590,10591,10592,10593,10594,10595,\r
+10596,10597,10598,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10317,\r
+10318,10319,10320,10321,10322,10323,10324,10325,10326,10327,10328,10329,10330,\r
+10331,10332,10333,10334,10335,10336,10337,10338,10339,10340,10341,10342,9761,\r
+9772,9762,9773,N,N,N,N,N,N,N,N,9763,9800,9799,9774,9764,9794,9793,9775,9766,\r
+9798,9797,9777,9765,9796,9795,9776,9767,9788,9801,9802,9783,9803,9804,9778,\r
+9769,9790,9805,9806,9785,9807,9808,9780,9768,9809,9810,9784,9789,9811,9812,\r
+9779,9770,9813,9814,9786,9791,9815,9816,9781,9771,9817,9818,9787,9819,9820,\r
+9792,9821,9822,9823,9824,9825,9826,9827,9828,9782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8774,N,N,N,N,N,N,N,N,N,N,N,N,N,8545,8544,N,\r
+8771,8775,8776,8779,8778,8777,8780,N,N,N,N,N,N,N,N,8547,8546,N,N,8762,8761,N,\r
+N,N,N,8549,8548,N,N,8760,8759,N,N,N,N,8543,8542,8770,N,N,8539,N,N,8541,8540,\r
+8772,8773,8538,8537,N,N,N,N,N,N,N,8783,8782,N,N,N,N,N,N,N,N,N,N,N,N,8784,N,\r
+8785,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8527,N,\r
+8526,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,8764,8765,N,\r
+8768,8763,8766,N,8767,8781,8795,8796,N,8797,8794,8481,8482,8483,8488,N,N,N,N,\r
+8500,8501,8502,8503,8504,8505,8506,8507,8508,8509,N,8555,8498,8499,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+10785,10786,10787,10788,10789,10790,10791,10792,10793,10794,10795,10796,10797,\r
+10798,10799,10800,10801,10802,10803,10804,10805,10806,10807,10808,10809,10810,\r
+10811,10812,10813,10814,10815,10816,10817,10818,10819,10820,10821,10822,10823,\r
+10824,10825,10826,10827,10828,10829,10830,10831,10832,10833,10834,10835,10836,\r
+10837,10838,10839,10840,10841,10842,10843,10844,10845,10846,10847,10848,10849,\r
+10850,10851,10852,10853,10854,10855,10856,10857,10858,10859,10860,10861,10862,\r
+10863,10864,10865,10866,10867,N,N,N,N,N,N,N,N,N,N,N,N,N,11041,11042,11043,\r
+11044,11045,11046,11047,11048,11049,11050,11051,11052,11053,11054,11055,11056,\r
+11057,11058,11059,11060,11061,11062,11063,11064,11065,11066,11067,11068,11069,\r
+11070,11071,11072,11073,11074,11075,11076,11077,11078,11079,11080,11081,11082,\r
+11083,11084,11085,11086,11087,11088,11089,11090,11091,11092,11093,11094,11095,\r
+11096,11097,11098,11099,11100,11101,11102,11103,11104,11105,11106,11107,11108,\r
+11109,11110,11111,11112,11113,11114,11115,11116,11117,11118,11119,11120,11121,\r
+11122,11123,11124,11125,11126,9249,9250,9251,9252,9253,9254,9255,9256,9257,\r
+9258,9259,9260,9261,9262,9263,9264,9265,9266,9267,9268,9269,9270,9271,9272,\r
+9273,9274,9275,9276,9277,9278,9279,9280,9281,9282,9283,9284,9285,9286,9287,\r
+9288,9289,9290,9291,9292,9293,9294,9295,9296,9297,9298,9299,9300,9301,9302,\r
+9303,9304,9305,9306,9307,9308,9309,9310,9311,9312,9313,9314,9315,9316,9317,\r
+9318,9319,9320,9321,9322,9323,9324,9325,9326,9327,9328,9329,9330,9331,9332,\r
+9333,9334,9335,9336,9337,9338,9339,9340,9341,9342,10545,10546,10547,10548,\r
+10549,10550,10551,10552,10553,10554,10555,10556,10557,10558,10559,10560,10561,\r
+10562,10563,10564,10565,10566,10567,10568,10569,10570,10571,10572,8799,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,10289,10290,10291,10292,\r
+10293,10294,10295,10296,10297,10298,10299,10300,10301,10302,10303,10304,10305,\r
+10306,10307,10308,10309,10310,10311,10312,10313,10314,10315,10316,N,N,N,8798,\r
+10057,10058,10059,10060,10061,N,N,N,10042,10043,10076,10077,10078,10038,10039,\r
+10040,10068,10069,10070,10071,10072,10017,10018,10019,10021,10027,10028,10029,\r
+10030,10031,10032,10033,10034,10035,10036,10023,10024,10025,10026,10045,10046,\r
+10085,10086,10087,10088,10081,10082,10083,10047,10048,10049,10050,10051,10052,\r
+10053,10054,10055,10056,10062,10063,10064,10065,10066,10067,10074,10075,8803,\r
+10092,10022,10080,10095,8801,10044,10093,10037,N,N,N,N,10041,10090,N,N,10091,\r
+N,N,10079,N,8804,N,N,10084,10094,10089,27753,28491,N,30290,N,N,N,22578,27995,\r
+24370,24382,31035,N,23668,N,N,N,30052,N,N,29478,23904,24870,N,20088,23600,N,N,\r
+N,N,25386,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29033,N,N,N,N,19834,N,N,N,N,N,31791,\r
+21281,N,28971,N,N,N,N,N,N,26449,21036,N,20089,N,N,N,N,N,29053,N,24127,31546,\r
+31033,N,N,N,N,N,N,20050,N,25387,27488,N,N,N,20090,19319,25893,N,N,N,N,N,N,N,N,\r
+N,N,N,19041,N,21580,N,N,N,N,N,27233,N,N,23651,24365,N,N,N,N,N,N,19307,N,N,N,\r
+21807,N,N,N,22133,N,25976,N,N,24128,27683,N,26957,N,27175,26998,31547,N,26473,\r
+28492,N,N,20582,N,N,24129,N,N,25644,N,N,22604,31089,N,20063,31268,26162,N,\r
+31355,N,N,31293,19528,28493,21845,N,N,N,N,N,N,N,21282,N,N,N,27729,N,N,N,N,N,\r
+25639,27730,N,N,30257,N,N,20091,N,N,20561,19263,N,27940,N,N,N,N,N,N,27944,\r
+24130,30306,27996,23669,24633,N,N,N,21582,N,29749,N,N,N,21339,22069,27684,N,N,\r
+N,N,N,N,N,N,N,N,25702,N,29034,N,N,N,19308,19264,N,N,N,27762,20586,N,N,N,N,N,N,\r
+N,31090,27685,20575,N,26474,20587,23633,23401,32076,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23383,N,N,N,N,23137,N,22070,N,25439,N,24131,N,\r
+24132,18977,N,N,N,N,N,28268,N,N,21283,28215,30799,N,N,N,N,27208,28216,28972,\r
+28965,26958,N,N,N,31036,N,N,N,25977,27754,23894,27970,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30757,N,N,N,N,N,25914,23384,N,N,18978,N,N,20813,N,N,N,28269,N,N,N,27755,24133,\r
+N,25440,N,19017,29289,N,21838,N,30262,N,20034,22087,N,25396,N,28973,N,27234,N,\r
+N,N,N,22338,N,29479,N,N,19818,N,27502,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22834,\r
+32037,N,N,N,N,N,30293,21858,N,N,N,N,N,N,N,N,30773,N,N,19573,30005,25645,N,N,N,\r
+N,26475,29013,N,N,N,28731,N,N,26933,N,19529,31317,N,N,24916,N,N,22358,N,N,\r
+23617,N,24134,31343,25441,N,N,N,N,N,N,N,N,N,N,N,N,24947,23670,N,20092,N,23364,\r
+N,30833,N,N,23652,N,25967,23601,N,N,N,21846,N,N,29530,N,19265,N,23363,N,N,N,\r
+22906,21358,N,N,N,31288,N,N,32038,27503,N,29734,N,19530,29480,N,29531,N,23335,\r
+30263,N,20326,28786,19290,N,26450,22339,30320,26718,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+25894,N,N,N,N,N,N,N,25959,N,N,N,18979,19495,27209,N,N,N,N,N,30774,N,N,N,N,N,\r
+31269,N,N,N,N,28974,N,28494,N,N,N,N,N,N,N,N,19309,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30256,28495,26959,N,30558,N,N,N,N,N,N,N,20051,N,N,N,N,23671,N,N,N,N,N,N,N,\r
+23336,N,N,N,19320,N,N,N,N,N,N,24353,23905,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30026,26934,N,N,N,N,26476,28270,N,29552,N,24383,N,N,N,N,N,N,19531,N,N,N,N,N,N,\r
+20545,N,N,N,29778,24634,N,N,N,N,24384,N,20064,N,N,N,23634,32106,N,N,N,22134,N,\r
+N,N,27210,N,N,N,N,N,N,26729,N,25388,N,N,N,N,N,29520,N,N,N,N,N,N,N,N,N,N,N,\r
+18980,N,23416,N,N,N,24135,27504,29014,N,N,25954,N,19532,N,N,19323,N,N,N,N,N,N,\r
+N,N,27235,N,N,N,N,N,N,N,N,N,N,N,N,24385,N,22125,N,N,N,N,N,N,N,N,26960,N,N,N,N,\r
+N,N,N,28217,N,N,N,N,21859,N,N,20819,N,25968,N,N,N,26676,27459,N,27178,31356,\r
+30070,28732,32084,24635,20035,N,20538,30522,22643,30541,N,N,N,25646,N,N,N,N,N,\r
+N,N,N,N,21599,N,N,N,N,N,20583,N,N,27773,N,21038,28271,21847,27236,30754,19819,\r
+22335,31537,N,N,19820,N,N,N,23602,20588,20093,28272,N,N,N,19522,N,N,N,20589,N,\r
+N,N,N,N,25975,N,N,N,29564,N,N,28194,N,N,N,N,22835,N,N,22644,N,26935,N,N,N,N,N,\r
+N,N,N,20014,N,N,N,N,22818,N,N,N,N,22641,N,21583,N,N,N,N,N,N,N,N,N,25895,21842,\r
+N,N,N,N,N,22057,N,N,N,N,N,N,29730,N,29015,N,N,21848,N,28733,22352,21584,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,22351,27498,32107,N,N,23405,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+31813,19266,N,N,N,N,32085,N,29768,26730,30067,N,N,31070,21359,N,N,27731,N,N,\r
+23874,28471,26452,N,19018,N,N,N,22907,N,N,31357,N,N,N,N,N,22058,N,N,N,N,N,\r
+29816,N,N,N,N,N,N,30583,23596,N,N,N,22359,24354,N,N,N,20030,N,21360,N,N,N,N,N,\r
+28708,24940,20327,29515,27945,19006,N,N,N,N,N,N,N,29807,N,N,N,30286,N,N,24187,\r
+20539,21815,28273,N,N,N,N,N,N,29736,N,23672,N,N,N,N,19239,N,23118,N,N,N,24678,\r
+N,N,N,N,N,N,N,27941,28274,N,N,N,N,23673,N,N,31068,N,N,29532,N,N,N,N,N,N,N,\r
+30834,N,29817,N,N,N,31857,N,N,N,20540,23417,22321,N,N,N,19324,N,N,N,28709,\r
+19325,N,N,N,N,N,N,N,N,21876,N,N,N,19821,18981,N,N,22059,20546,N,N,N,N,28734,\r
+21053,19492,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31286,N,N,19533,N,23162,N,\r
+30287,N,26936,N,22645,N,N,N,19534,N,N,N,N,22349,N,N,21585,26989,N,19051,22882,\r
+N,32050,N,25389,22092,22836,N,N,24871,28243,20547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+32051,N,21860,N,N,20328,N,27971,20530,N,N,20094,23080,30800,N,N,32086,N,N,N,N,\r
+30801,N,30802,23635,N,N,N,N,23906,31609,23873,N,25397,N,N,N,N,N,N,27997,20036,\r
+N,19233,N,N,N,N,N,N,23907,N,N,N,N,31837,N,N,N,N,N,N,N,N,N,31023,N,N,N,N,N,\r
+21115,20257,25640,N,29750,27774,N,N,25390,26477,32065,23138,N,N,22579,N,N,N,\r
+23908,28783,30321,31344,N,N,20853,N,N,23119,N,23636,N,23590,N,28479,N,N,N,N,N,\r
+20047,N,24665,N,N,N,N,N,N,22870,27732,27211,N,N,19007,21808,N,20329,N,N,N,N,N,\r
+29037,N,19535,N,N,N,N,25720,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25709,N,N,N,N,22360,N,\r
+32039,N,N,N,N,27179,30258,N,N,N,N,20336,31037,N,N,N,N,N,N,26228,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,19291,N,N,N,N,N,N,N,29521,N,N,N,N,26961,29481,20576,26962,N,23139,\r
+N,N,N,N,N,N,25170,N,30242,24948,N,N,N,23140,N,N,N,N,N,26453,30015,20258,19759,\r
+20259,N,N,N,19760,29054,20515,24879,30755,N,18982,30523,29290,24136,26963,N,N,\r
+N,N,24137,32094,19008,N,N,N,31082,20814,28244,N,21586,22819,32040,22361,30542,\r
+31294,N,N,N,N,N,N,N,N,N,20310,N,22384,N,27489,30789,N,N,N,N,N,23674,N,N,23875,\r
+N,31071,N,N,N,N,N,N,N,26479,N,N,N,N,32101,30243,N,22908,32041,N,26478,N,N,N,\r
+21861,N,N,N,N,N,28496,N,19761,N,N,N,N,N,N,30498,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,28978,N,28977,N,N,N,N,N,N,19762,N,23083,N,18983,N,N,N,N,N,25442,\r
+31548,22820,N,N,28218,N,N,N,N,N,30803,N,N,N,N,N,31610,N,20260,N,23675,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30307,N,N,N,27946,N,N,29217,20065,N,N,N,N,N,N,\r
+31270,N,N,N,N,31072,N,N,N,N,27734,N,N,25710,31009,N,N,31599,N,N,N,31083,28195,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27180,N,N,N,18984,N,N,29818,N,N,\r
+N,N,19798,31862,N,N,N,29769,N,N,N,N,N,N,N,30804,30758,N,24138,29254,N,N,N,N,N,\r
+N,22362,N,21328,N,N,N,N,N,N,N,N,N,N,N,22597,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,27238,N,29533,N,N,N,25690,N,N,N,N,N,N,N,N,30308,N,N,N,N,N,30322,N,24386,N,N,\r
+N,N,N,N,N,N,22909,N,N,N,19574,N,N,21306,N,N,N,N,N,N,N,25647,N,N,N,N,31073,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28710,N,N,N,19283,N,N,N,24636,N,\r
+29770,21626,N,32042,31074,N,N,N,N,N,N,N,N,N,N,N,N,N,29751,32066,31792,N,32108,\r
+19042,N,N,N,N,N,N,N,N,N,32061,N,27239,24387,20818,20066,N,21284,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,32043,N,24416,N,N,N,N,N,N,N,N,N,N,N,N,29255,N,N,\r
+N,N,N,26480,N,20590,N,N,29482,N,N,N,24139,30264,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,24949,28979,30499,N,N,18985,N,N,N,N,N,N,N,N,N,N,20261,N,N,\r
+24388,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24880,N,N,28735,N,30244,N,\r
+25398,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31302,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20591,N,N,32109,N,N,N,N,N,N,N,N,23876,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,31863,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,26175,N,N,N,N,N,N,24109,N,31295,N,N,N,N,N,25969,N,N,N,N,N,N,N,\r
+27972,N,N,N,N,N,N,N,N,N,N,N,N,N,21029,N,N,32110,N,N,N,30006,N,N,N,N,N,N,N,N,\r
+24950,24140,N,N,31838,N,27735,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19805,N,N,N,N,N,N,\r
+N,N,22071,19763,30805,25944,N,N,N,20330,N,N,20304,N,27212,N,N,N,N,27182,27181,\r
+N,N,21361,N,21285,N,N,N,N,N,N,30543,N,N,N,N,N,N,N,N,28196,N,N,N,N,20516,N,N,\r
+29218,N,N,N,N,N,N,N,N,N,N,20592,N,N,N,N,29219,N,30584,N,N,N,N,20531,N,N,23337,\r
+N,N,21307,19052,N,28966,19285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30567,N,N,19806,N,\r
+30500,N,N,N,30784,N,N,N,21341,N,19536,N,N,N,N,20262,N,N,N,N,N,N,30323,N,N,N,N,\r
+N,24951,N,N,N,N,N,21340,N,N,31358,N,N,N,N,N,N,N,31271,N,N,N,N,N,N,N,N,N,N,N,N,\r
+27481,N,20263,27183,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,25711,N,N,N,26937,29016,N,N,22616,N,N,24690,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,26164,23676,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29553,N,N,N,25424,N,N,29307,N,\r
+23366,20593,N,20594,20316,N,21329,N,N,19505,30552,N,19240,27452,25662,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29788,N,N,23618,N,N,28711,N,N,26176,N,N,19053,N,\r
+N,N,N,26731,25960,23619,N,N,27998,21362,N,N,N,N,19575,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,20052,26411,N,N,N,19267,N,24881,N,N,30514,N,N,21363,21330,N,30016,N,N,N,\r
+24413,N,N,28275,26481,N,32052,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29256,N,N,N,\r
+29522,N,N,28276,N,25171,N,N,N,N,19537,N,24426,N,N,N,26938,N,N,N,N,N,N,N,N,N,\r
+22871,N,N,N,N,N,N,N,N,30029,N,29042,31303,N,N,N,N,N,N,N,N,22904,21570,N,N,N,N,\r
+30309,N,N,N,N,23877,N,N,N,N,N,N,26482,27999,N,N,19019,N,N,23418,N,N,N,26677,N,\r
+21286,N,N,N,N,N,N,32053,N,N,31049,N,25698,N,31549,N,N,22308,20037,N,N,N,N,\r
+20053,22118,N,N,N,N,25917,N,N,N,N,N,N,24141,27763,N,N,28000,N,N,N,N,N,N,N,N,N,\r
+27756,31550,24427,N,24952,31038,N,N,N,N,20595,24618,26722,N,N,25172,21117,N,\r
+25896,N,N,N,N,N,22867,N,N,N,N,21342,N,29752,30524,23677,N,26732,25703,N,N,\r
+25463,N,N,N,N,N,27688,N,N,N,N,N,N,31345,N,N,N,N,N,25970,N,N,20596,21039,23653,\r
+N,N,N,N,20517,28980,31793,19576,N,N,23878,31313,N,30559,N,N,31272,N,N,N,N,N,\r
+28277,N,24142,N,N,N,N,26483,N,N,30508,27460,28001,24619,23879,N,N,N,N,21043,\r
+21055,N,N,N,19020,N,N,N,N,31551,N,N,N,N,25981,23909,22605,N,N,N,N,N,27764,N,N,\r
+N,N,N,N,N,N,20597,N,N,26733,20562,N,22872,N,N,N,N,N,N,N,N,N,N,N,30310,N,N,\r
+23338,N,N,N,30560,N,N,N,N,N,N,N,N,N,N,N,N,22617,N,29731,N,N,29789,N,N,N,N,\r
+28497,N,N,22837,N,N,27947,N,25399,N,N,N,N,28219,19764,N,24691,27213,N,N,N,N,\r
+27765,26734,N,19241,28975,N,N,N,N,N,N,N,N,19021,N,27689,N,29291,N,32111,N,\r
+31091,N,N,N,N,N,N,N,N,N,26177,N,N,27736,N,N,N,27948,27214,N,26719,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,24143,N,N,N,N,N,N,21030,N,N,26484,20822,N,N,26178,25443,N,N,N,N,\r
+25648,N,N,N,22580,N,N,N,N,N,N,N,N,N,N,N,N,30245,N,N,N,N,N,29534,N,N,N,N,22309,\r
+N,N,N,N,30568,N,N,26694,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31590,N,N,N,N,N,N,N,\r
+23910,N,N,N,23678,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,22618,N,N,N,N,N,N,N,23084,27184,N,N,N,N,N,N,N,N,\r
+25400,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,18986,24953,N,\r
+27185,N,N,N,N,29292,N,N,31342,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28245,N,\r
+N,N,N,31092,N,N,21100,31611,N,N,N,32112,N,24637,20067,N,N,N,N,N,N,N,N,N,30790,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24110,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,24389,N,N,25918,N,N,N,N,N,N,N,N,N,N,N,N,27949,31338,N,N,19822,27942,N,\r
+27950,28781,N,23841,N,27951,31864,N,22635,N,N,N,19577,19765,N,N,N,N,31273,N,\r
+24925,N,N,N,N,25173,27983,N,N,N,23842,N,N,31050,N,27240,N,25965,N,N,N,N,N,N,N,\r
+N,21355,N,26964,24954,25676,N,24932,26695,N,N,20059,N,N,N,23637,N,30517,31859,\r
+28787,20015,28981,28498,26696,27505,N,N,N,N,N,19284,24638,25464,27241,31794,N,\r
+N,N,N,N,24692,N,20320,N,28197,N,N,31274,26179,24882,18987,N,25444,26939,N,N,N,\r
+N,N,25174,29554,N,28246,27186,20598,27737,23115,20264,N,N,N,N,23843,N,N,N,\r
+22619,N,31054,26965,25425,N,N,21052,N,N,N,N,N,N,22572,29516,N,19835,30294,N,\r
+26485,26735,25465,21051,29555,25467,N,24144,20016,N,22135,29017,N,N,N,N,N,\r
+30017,23620,N,30011,N,24145,23654,N,N,24146,N,N,28002,28278,27215,28782,25468,\r
+N,21343,21364,24883,N,24884,N,N,N,N,29779,N,N,24390,N,N,N,N,N,N,N,N,N,N,26966,\r
+N,N,N,23339,N,N,N,N,N,N,N,N,30246,N,N,N,N,N,N,25401,27461,29737,19766,21113,N,\r
+23085,21091,20305,N,N,N,N,19292,19578,N,20317,N,N,26665,N,25403,25402,N,N,\r
+24666,N,N,N,28279,N,N,N,N,N,23603,N,N,N,N,21365,N,22310,N,30261,22363,N,N,N,N,\r
+N,N,24917,N,N,21610,N,24355,N,N,N,N,N,N,N,32095,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,20599,27988,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19242,N,N,N,N,N,N,N,\r
+25691,N,24955,19234,N,N,N,N,21344,N,25663,N,31552,N,23102,25677,N,22073,N,N,N,\r
+28480,N,24956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30265,N,N,N,N,N,\r
+N,24391,N,N,N,N,N,N,N,25649,N,N,N,N,N,N,23655,23656,N,N,N,31318,N,21366,N,N,N,\r
+N,29018,N,31346,25213,N,N,N,N,N,21839,20600,N,N,19807,N,N,30027,N,25712,19243,\r
+N,22340,N,N,N,N,N,N,N,N,N,N,N,N,N,25214,N,23898,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23086,19054,N,N,N,21817,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25377,N,N,26723,N,N,29483,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,20265,N,N,N,21367,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+21617,N,N,20068,N,26738,N,N,N,N,N,N,N,25973,N,N,N,N,N,N,N,N,N,N,N,N,N,26414,N,\r
+22074,N,24428,25664,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26724,N,N,N,N,22581,N,N,N,\r
+25692,N,N,N,N,N,N,29753,28982,N,N,25182,24885,N,N,19823,28967,20069,19293,N,N,\r
+22883,N,N,29484,N,N,20601,27691,24147,30569,N,N,31093,N,N,N,N,N,24926,19310,\r
+25404,30806,N,N,23406,N,N,N,N,N,32113,N,N,N,N,30518,N,N,N,N,29790,N,N,29293,N,\r
+23385,N,28712,N,N,N,N,N,N,N,24957,N,N,N,N,N,24148,N,24620,N,N,N,N,N,28003,N,N,\r
+21345,N,24392,N,N,N,N,22838,N,32044,28499,N,N,N,25665,30827,N,23340,N,N,N,N,\r
+31814,N,N,N,N,N,N,N,N,22573,N,N,N,N,N,N,N,N,N,30266,N,23391,21331,30791,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,19022,30785,21044,N,N,23604,31289,19023,N,31795,27242,\r
+27243,20602,N,N,N,N,N,28004,N,N,23911,N,N,24393,N,N,N,N,24429,N,N,N,N,N,28220,\r
+N,28481,N,N,19538,N,23844,N,N,N,24394,N,N,N,N,N,21368,28968,N,N,N,19767,N,\r
+28500,N,N,N,N,N,N,N,25693,24430,19244,26940,N,N,N,N,N,27244,N,N,N,24395,N,N,N,\r
+N,N,31039,22063,21830,N,N,N,N,N,20266,N,N,20009,N,N,22136,N,N,N,28983,28280,N,\r
+N,N,22873,29535,N,30792,20038,N,N,N,N,N,N,N,N,21862,N,N,N,N,N,N,29798,N,N,\r
+26181,28501,N,N,19311,31839,23591,N,N,22119,N,N,N,N,N,30793,N,N,N,N,25426,N,\r
+25405,N,20321,28736,27738,N,23895,31600,N,N,27692,N,N,N,28713,N,N,N,N,N,N,\r
+31319,31553,N,21056,N,N,N,N,N,N,N,25904,N,N,N,28005,N,N,N,N,19245,N,31024,N,N,\r
+N,N,N,N,N,N,N,N,N,30501,N,19246,N,23087,N,22582,N,N,N,N,N,N,N,21287,31538,N,\r
+32068,N,27693,N,N,N,N,N,N,31521,N,N,N,25961,26990,N,29556,30835,28737,24111,\r
+30768,N,N,29536,26415,N,N,N,N,N,23341,N,26165,N,N,31016,N,N,23896,26713,28502,\r
+N,N,N,21346,N,25183,N,N,31840,22344,32045,N,N,N,24431,19539,21369,N,N,N,N,\r
+21616,23367,24149,N,N,N,N,28788,N,21840,25945,N,N,N,N,N,N,31815,23638,25184,N,\r
+N,N,23088,N,N,N,N,N,N,29475,N,21356,N,29771,N,N,N,32069,N,N,N,N,N,25469,N,\r
+31025,N,N,N,N,N,N,20603,27739,N,N,N,N,N,N,N,N,30012,29220,22606,22607,N,N,N,N,\r
+N,N,30071,N,N,N,N,N,N,N,N,N,N,30305,N,N,N,N,N,N,N,N,N,21047,N,N,N,N,N,N,N,\r
+31596,N,23880,25704,N,N,21057,N,N,N,30807,N,N,N,N,N,22075,24150,N,N,30525,\r
+27694,N,N,N,20577,N,24693,27187,N,20054,N,N,N,N,19493,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,27766,25185,25406,N,N,N,N,N,N,N,N,N,31816,N,N,19824,N,31094,N,N,\r
+24432,N,N,N,25919,N,N,N,20031,N,N,N,N,31841,27952,32081,30267,N,N,31055,27482,\r
+19009,N,21048,19825,N,25427,32102,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+26221,N,N,N,25466,N,N,28714,31056,N,N,N,N,N,N,31842,N,30759,N,N,N,24933,28281,\r
+N,N,N,26486,27245,N,N,31796,30018,N,N,22364,N,N,N,N,N,N,N,N,28789,N,23912,\r
+21357,30076,N,23103,N,19579,N,N,N,21370,29732,N,N,N,N,N,N,N,28503,N,21571,N,N,\r
+N,N,N,N,N,N,N,31587,N,N,N,N,N,N,N,N,31597,N,24621,N,N,27246,31539,25666,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,30311,21085,N,24396,N,N,31817,N,N,25897,24694,30259,\r
+24958,N,N,N,N,19312,N,27247,27248,N,N,N,23104,30772,27506,N,N,N,N,N,25667,N,N,\r
+N,N,26967,25713,N,N,N,19055,N,N,N,N,N,N,N,20055,N,N,N,N,N,N,N,N,31818,N,N,N,\r
+29537,N,N,19268,N,N,N,N,25445,N,19269,27188,N,N,26941,N,22345,N,N,27483,27953,\r
+N,19523,30526,31819,N,N,N,N,N,N,30836,N,22839,N,N,29523,29524,N,N,N,30564,N,\r
+30545,N,N,22583,20017,19010,N,N,31540,19270,N,N,28790,N,N,21863,N,27216,N,N,N,\r
+N,N,19540,19247,N,N,N,N,N,29738,26927,N,N,30019,26968,N,N,N,N,N,N,N,23913,N,N,\r
+N,29043,N,21883,24123,N,N,29819,N,N,N,32115,32114,30502,N,N,N,N,N,N,N,N,N,\r
+23881,N,N,21587,N,19496,N,23105,19541,N,22884,N,N,N,31306,N,N,N,25955,N,N,N,\r
+21308,N,N,N,19056,N,N,N,N,20548,N,N,N,19024,31275,27499,26488,22885,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20823,N,N,N,N,N,N,N,N,N,N,N,29476,N,\r
+N,N,21627,31843,31320,N,29525,N,20267,N,N,27507,21884,N,N,N,N,N,N,21332,19836,\r
+N,22886,N,25209,25121,27476,N,24695,25650,19580,N,N,N,31588,N,N,N,29739,N,N,N,\r
+N,20541,N,19057,N,N,N,N,N,N,N,N,28472,N,N,N,22336,N,28282,32116,N,N,21347,N,\r
+31554,N,N,N,N,N,N,N,21864,23342,24886,30775,N,N,N,N,N,24639,31555,23914,N,\r
+25122,N,28198,N,N,N,N,N,30312,N,N,N,N,30325,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,23882,N,N,20578,N,N,N,N,23846,N,N,23915,N,N,25721,N,N,25391,20604,N,N,\r
+N,29820,N,N,N,N,19516,30570,N,N,N,N,N,N,25956,24433,N,N,30561,N,31095,28473,N,\r
+N,30808,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31017,N,N,N,N,N,30809,N,N,N,28221,N,N,N,\r
+22598,N,N,25699,30030,N,N,N,N,23897,N,N,N,N,22887,21049,21827,N,N,23141,23120,\r
+N,20825,20056,N,19294,29740,23163,N,30313,26739,20268,28784,N,29821,23368,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,20032,25428,20815,29045,N,19826,N,20331,N,N,N,19768,\r
+N,N,N,N,N,N,25382,20826,29221,N,N,N,N,N,29222,N,25678,N,N,N,N,N,N,N,21371,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28969,N,N,N,29257,N,N,N,N,N,N,N,\r
+N,N,N,28504,26185,N,22584,31347,N,N,N,N,N,N,N,N,N,N,29493,N,N,30756,N,N,20851,\r
+26184,N,N,N,N,30810,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23657,24151,N,N,N,N,N,\r
+19295,N,N,N,20332,N,N,N,N,29791,N,N,20852,21050,N,N,N,24434,N,N,N,24887,N,N,N,\r
+N,25123,21372,N,N,28006,N,N,N,N,N,23369,N,N,N,25722,N,20318,N,N,20048,N,N,N,N,\r
+21843,29557,30510,N,N,28488,N,19827,30031,25971,28738,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,19025,N,N,N,27249,N,20518,N,N,N,N,N,N,N,N,22874,28715,N,N,N,\r
+N,N,27495,N,N,N,25920,31797,N,N,N,N,N,25668,N,N,N,N,N,N,N,N,N,N,N,19497,32070,\r
+N,N,N,N,N,27189,N,25898,24378,24927,N,23121,N,N,N,N,24888,N,26740,21373,N,N,N,\r
+N,25124,N,N,N,N,N,29258,N,N,N,N,N,N,N,N,N,23142,30515,N,N,N,N,N,N,N,N,N,N,N,N,\r
+32077,N,N,N,29494,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28247,N,N,\r
+N,N,N,N,N,30020,N,N,N,N,N,N,N,N,22564,N,N,N,N,N,29223,N,N,N,N,N,N,N,N,22840,\r
+22841,28489,N,N,N,N,N,N,N,N,N,N,N,N,N,22094,N,N,N,N,N,N,N,N,30539,24366,26741,\r
+N,N,N,N,N,N,21045,N,N,N,21333,N,N,N,N,N,29772,23164,N,N,N,N,N,22888,N,30571,\r
+30025,N,29500,N,23122,N,N,N,N,N,N,N,N,21301,N,N,N,N,N,26678,N,N,22095,29754,N,\r
+30537,N,N,19498,N,N,28739,19542,N,N,N,20563,N,21309,N,N,N,23419,N,19296,N,N,N,\r
+N,N,N,21348,30327,N,N,21818,29517,19297,N,N,N,N,27508,N,N,N,N,N,29741,N,31786,\r
+N,N,N,N,N,30572,N,N,N,26742,23143,N,N,N,30540,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,25921,N,N,N,N,24686,N,N,N,N,N,21885,N,N,N,N,N,N,20070,31787,21819,N,N,\r
+29224,N,N,N,N,N,N,25125,19769,27250,19271,N,19828,N,N,23343,28505,N,N,N,N,N,\r
+19770,N,N,31865,N,N,N,N,24435,20071,23106,N,20269,N,N,N,N,26489,30760,N,N,N,N,\r
+N,N,29538,N,N,N,19058,24356,N,N,21572,N,N,N,N,N,19543,25922,N,N,N,N,19771,N,\r
+28506,28248,N,23847,25126,N,N,N,N,N,24640,N,N,N,22064,30794,N,31866,N,22910,N,\r
+N,N,N,24112,N,N,N,23916,23144,N,N,N,N,N,21600,N,22137,N,19799,24152,N,N,29304,\r
+N,25686,N,N,20549,29742,N,23848,N,N,N,27973,29526,N,N,24153,25446,N,N,N,N,N,N,\r
+21288,N,23344,N,N,25946,25407,N,N,N,23345,N,N,N,21865,N,N,N,N,N,24641,28507,N,\r
+N,28777,N,N,22322,N,N,N,N,20605,N,N,N,N,N,N,N,N,22889,N,N,20606,N,27757,21289,\r
+N,29225,28740,N,N,25186,26991,N,N,N,31057,N,N,26969,N,N,N,N,N,26714,23107,\r
+23108,21573,N,26490,19808,25392,N,23346,31556,N,29539,N,22821,31591,23883,\r
+20564,N,26166,24622,32090,N,N,N,N,N,N,N,N,23605,24696,26417,N,N,N,N,30064,N,\r
+22620,27974,N,N,N,N,24889,N,25408,31040,26992,N,N,22875,N,29540,N,N,N,23606,\r
+25705,N,N,N,N,N,28741,25409,31820,31821,N,N,N,N,29259,N,29260,N,N,N,25679,N,N,\r
+N,N,N,N,N,N,N,29019,N,31321,N,28984,32117,24697,N,N,N,N,26491,31799,31844,\r
+31557,25447,22585,N,30328,N,N,23621,19544,N,N,N,24623,29799,N,28508,20348,\r
+28509,N,29226,N,N,N,N,N,N,N,N,N,32062,N,N,18988,32059,32071,N,N,N,N,26418,N,\r
+27217,24436,N,N,N,N,20844,25694,25923,N,N,N,N,22822,N,N,19772,N,29541,N,N,N,N,\r
+N,N,N,N,27989,N,N,22842,N,N,N,28007,31541,30828,N,N,N,N,24679,N,19545,N,N,\r
+21574,N,N,N,N,N,26405,N,21877,21310,N,31867,N,N,N,N,N,N,N,N,N,N,N,N,25714,N,N,\r
+24437,N,N,26744,30829,N,N,20039,N,N,N,N,N,32118,N,N,N,N,N,N,N,N,N,26712,N,\r
+19800,26454,19546,N,N,19043,24438,28743,28742,N,22586,N,29044,29808,30028,N,N,\r
+31845,N,N,N,N,27205,27251,N,23899,N,23639,N,N,N,N,N,N,24189,29305,N,21831,N,N,\r
+N,22608,N,28744,20769,20770,N,N,N,N,N,N,22868,22120,22858,N,23089,22599,23650,\r
+29518,30068,N,N,28985,N,N,23123,N,30314,N,N,N,20341,N,N,32046,N,N,N,N,N,N,N,N,\r
+19026,N,N,24372,N,N,N,N,22365,31290,28199,30013,N,30837,N,N,28008,N,N,N,N,N,\r
+21601,N,20771,24918,N,N,N,N,N,N,N,N,N,N,N,N,N,31096,N,23370,19321,21588,N,\r
+22876,N,28222,N,30573,N,N,N,21102,N,N,24934,30585,N,N,N,N,N,N,N,23917,N,26715,\r
+N,23347,N,N,N,20855,24624,N,N,21602,N,30295,N,22393,N,N,22621,N,19837,29227,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19773,30786,N,N,29228,N,N,18989,18990,20270,N,\r
+N,N,N,N,25410,N,N,N,N,N,23607,N,N,N,N,N,N,N,N,N,N,23386,22843,19059,30291,\r
+26232,27253,N,N,N,N,N,27254,N,N,30329,N,N,N,N,N,N,N,N,N,N,N,20271,N,N,19027,N,\r
+N,18991,21040,28986,N,22323,25411,29565,24154,N,N,N,N,24155,N,N,28510,25187,\r
+28283,N,N,24439,22346,N,N,N,N,N,N,N,N,N,20072,23387,N,N,N,N,N,N,N,28987,N,N,N,\r
+N,26993,N,N,N,N,N,N,N,N,31287,20550,N,N,19499,28200,N,N,19322,31097,19581,\r
+21374,N,N,N,N,25680,N,N,N,N,N,29294,N,21589,24397,N,31800,20816,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29261,N,N,N,N,N,N,N,N,30546,N,N,N,N,N,N,N,N,\r
+19028,N,21849,N,N,N,22622,N,N,N,N,N,N,N,N,N,19801,N,N,N,28201,30268,N,N,19547,\r
+N,N,N,N,N,28745,N,31868,N,26697,29822,N,N,N,N,26492,22366,N,N,N,N,24156,N,\r
+28716,19582,19809,N,24890,N,23407,23090,N,N,N,N,N,N,N,N,N,N,N,N,N,20773,23608,\r
+N,N,N,22646,N,20772,N,19810,N,N,N,N,23658,N,N,28791,N,28746,20542,N,23900,N,N,\r
+N,N,21590,21334,N,N,N,N,N,N,27984,19745,N,N,N,N,N,24373,N,N,N,24440,N,N,N,N,N,\r
+N,21537,20018,26698,N,N,N,N,27509,N,N,N,N,N,N,N,25429,30032,N,N,N,29985,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22823,N,N,N,N,N,N,N,N,25899,N,N,N,N,N,N,N,N,\r
+N,N,N,N,26187,N,30065,N,N,N,N,N,N,N,N,N,N,25925,N,N,N,N,N,N,N,N,31011,24667,\r
+30315,N,19313,N,22890,29986,N,N,N,22353,N,20856,27256,27257,23091,N,N,N,N,\r
+28511,N,N,29039,N,25974,28223,25188,N,N,N,N,N,20543,N,31276,30033,26419,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26942,N,N,N,N,N,29262,23348,N,\r
+N,N,N,N,N,N,N,31822,N,23918,N,N,N,N,N,N,26420,N,N,N,N,N,22324,N,N,N,N,N,N,\r
+30516,N,N,N,N,N,19774,N,23145,N,N,N,N,N,N,N,20272,30553,29542,N,N,20057,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20010,N,19272,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,20519,N,28747,N,20551,25669,N,N,N,N,N,N,N,23392,N,N,N,N,N,N,21850,N,\r
+22311,N,N,N,28224,N,30838,N,N,N,N,30034,28009,N,22844,N,25926,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,29987,N,N,23124,25127,31612,N,N,29020,N,N,N,N,N,N,19060,N,N,\r
+N,26746,N,N,20073,N,N,N,N,N,N,27000,25189,N,N,N,N,20537,21618,N,N,N,N,N,20774,\r
+N,24398,N,N,N,N,N,N,N,N,N,31860,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21290,\r
+N,N,N,19500,N,N,N,N,28512,N,N,N,25957,20565,N,N,N,N,N,N,N,N,23420,N,N,N,N,\r
+31846,N,N,N,N,N,19326,28010,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24113,N,N,N,N,N,N,N,\r
+31075,N,N,N,N,N,N,21538,20342,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22096,N,N,N,N,N,N,\r
+21866,29038,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31307,N,N,N,N,\r
+25889,21809,N,N,N,N,N,20333,N,28011,N,N,N,N,N,21810,N,N,N,21820,N,N,N,N,N,N,N,\r
+N,N,32098,29485,N,32091,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26928,N,N,N,N,N,N,N,20775,\r
+N,N,32099,20019,N,N,N,N,N,N,N,32100,31310,N,N,N,N,18992,N,30503,N,20273,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,26146,N,31798,29229,28513,29486,23622,22891,N,N,N,26720,\r
+N,N,N,N,N,N,N,24872,N,N,N,N,21878,20349,N,N,24157,N,N,N,22865,N,N,N,25706,\r
+29263,N,30527,N,N,25190,25128,N,N,N,N,N,N,N,N,N,N,N,25430,N,27985,N,N,N,N,N,\r
+27001,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22065,24114,N,N,24680,N,N,21291,N,27484,N,\r
+N,24367,N,19011,N,N,28284,N,32067,N,N,N,27510,20274,N,N,N,N,22892,N,22845,N,\r
+22623,N,N,21560,27454,23919,N,23920,23921,23922,N,N,22846,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,31558,20275,28285,N,N,N,N,N,N,25643,N,23109,N,22636,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,20776,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25129,N,N,24124,26421,N,N,\r
+N,N,N,23408,N,28514,29040,20276,N,N,N,N,N,N,N,N,N,N,N,23409,N,24625,N,N,N,N,\r
+24357,N,31058,N,N,26493,N,N,26147,31601,19248,29230,N,N,N,N,N,N,N,19815,N,\r
+26716,N,N,26455,N,N,30528,N,20579,N,N,N,23073,N,N,N,19517,N,N,20777,23884,N,N,\r
+25470,20778,26666,N,27190,31098,26188,30296,N,N,N,21575,N,N,N,22859,N,22866,\r
+21323,22647,23081,30072,N,N,24158,29231,30761,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+22600,N,N,28225,N,N,N,N,31041,N,N,N,N,23923,27258,N,30269,24891,19775,29780,\r
+26189,N,31823,31522,N,24668,N,N,N,N,29755,23125,N,31026,N,N,N,N,N,N,31602,N,\r
+23414,N,24159,N,N,N,23410,N,N,N,N,N,30812,30574,27496,N,21114,N,N,28988,N,N,\r
+31322,N,N,23146,23110,30529,N,N,26422,25927,22060,N,N,N,N,23623,N,N,N,N,N,\r
+24873,N,25130,N,21798,N,N,21591,N,N,N,N,N,N,29264,N,27259,N,24669,31603,N,N,N,\r
+N,N,N,N,28989,N,N,25191,32087,N,20040,27191,N,31808,N,32103,30575,N,N,22325,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28474,29021,N,24115,N,N,N,N,N,N,\r
+26699,N,N,30813,N,N,31559,21832,N,22367,N,23849,N,N,N,N,N,26929,N,N,31277,\r
+30297,31348,N,N,N,N,N,30762,N,N,N,N,N,26222,N,19548,24892,24687,N,N,26943,\r
+31869,26190,N,N,24919,N,26191,N,29809,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,25715,N,N,25723,N,N,31076,N,N,N,N,N,N,N,N,N,N,28515,N,N,20334,30270,\r
+24626,31870,20779,N,N,N,22394,N,N,N,31560,N,25175,N,N,N,N,N,N,21539,28792,\r
+22312,N,N,N,24935,N,N,21311,N,N,N,N,N,N,28516,N,22341,27490,N,N,31847,N,N,\r
+25634,N,25192,N,26192,N,31592,29800,25972,29756,29781,24374,N,31801,28226,\r
+19061,N,N,N,28517,19298,21540,N,24160,23165,25670,26686,N,N,N,N,24670,30260,\r
+27218,N,31099,N,N,24642,N,19044,N,26423,N,27261,N,22877,N,23092,28202,31593,N,\r
+N,N,N,23371,23093,N,N,N,N,N,28990,N,N,21292,N,N,N,N,N,N,N,N,31561,N,24399,N,N,\r
+21312,25431,N,28518,31824,N,N,N,N,N,N,N,26944,N,N,N,30035,N,N,27740,30519,N,N,\r
+27192,20857,N,N,N,N,N,N,23624,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27193,\r
+N,N,N,N,N,29022,N,N,N,N,N,22326,20277,N,22824,N,N,27758,N,N,23850,N,N,N,N,\r
+19746,26670,N,N,N,24893,N,29265,N,N,N,N,26945,N,N,N,21116,N,N,N,N,N,N,N,23349,\r
+N,29543,22654,N,N,N,31825,N,27954,29743,N,31523,N,N,31809,N,28203,21541,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29810,N,N,N,N,28249,N,N,N,31562,\r
+N,N,N,N,N,19811,22587,25947,30839,N,N,N,30292,N,N,N,N,N,N,N,N,22313,N,19273,N,\r
+N,26193,28748,N,N,N,N,N,N,N,N,N,N,22574,N,31059,21886,N,N,N,N,N,N,N,22588,\r
+29232,N,N,N,N,25131,29544,N,N,N,N,N,28482,N,N,N,N,N,N,28012,N,26424,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,23166,N,N,19518,N,N,29308,23147,N,25176,27990,N,N,22097,\r
+24627,N,N,31826,N,27464,N,N,N,N,N,N,N,N,21313,28749,N,20343,N,N,N,N,N,N,N,N,N,\r
+27986,N,21592,23625,22385,N,N,24379,N,N,29477,N,N,N,29773,N,N,N,N,28991,30769,\r
+N,27002,N,N,N,31563,N,N,19029,N,N,N,N,N,N,N,N,N,N,N,31060,30538,N,N,22088,N,N,\r
+N,N,N,N,31848,29501,N,28286,N,26494,N,N,N,N,N,21314,N,N,N,N,21302,N,19501,\r
+30330,22066,21080,N,N,N,N,N,N,26456,N,N,N,N,N,N,N,N,N,N,25381,N,N,N,N,26425,N,\r
+N,N,N,28717,31564,27425,N,N,21542,N,N,N,N,31565,N,21821,29023,N,N,30331,N,\r
+24116,N,N,N,N,N,N,N,N,N,N,N,N,21867,25928,N,N,N,31524,21561,N,N,24161,N,25635,\r
+N,N,N,22327,N,30830,N,N,N,24117,N,N,22098,N,31061,26426,27477,21879,28519,\r
+24894,N,N,N,31278,N,N,N,22121,22126,N,N,N,N,N,N,26427,N,N,N,N,N,N,N,27723,N,N,\r
+N,N,N,N,21811,N,N,N,N,N,N,N,N,N,N,N,N,N,20020,N,N,N,31525,24942,N,N,N,N,N,N,\r
+30504,N,N,N,N,31566,N,N,N,N,N,22589,N,N,N,N,N,N,N,31613,N,N,N,N,31849,N,N,N,N,\r
+N,N,N,20278,N,N,N,27975,28204,N,N,N,N,N,N,N,19549,N,N,N,N,30247,N,N,N,26234,N,\r
+N,N,29988,N,N,N,N,N,32092,27955,20041,N,N,N,N,N,N,28520,N,N,24895,N,N,N,N,N,N,\r
+31323,19299,30505,N,31526,N,N,N,23609,N,N,N,28992,27976,28483,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,22061,N,N,32078,N,N,N,26657,N,N,N,N,N,N,N,N,31604,21799,N,N,N,\r
+29046,N,26195,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19550,N,N,N,N,N,N,N,30770,N,N,\r
+N,23659,32054,N,N,N,N,25962,N,N,29024,N,N,N,N,N,N,N,N,N,N,N,N,23372,23885,N,N,\r
+N,21576,N,N,22893,N,N,N,N,29989,N,N,N,N,N,N,N,N,N,26235,N,N,N,N,N,26196,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,32072,N,22049,32063,N,31827,N,28449,N,26428,N,N,N,N,\r
+N,20846,N,N,26197,N,N,26994,N,24368,N,N,N,N,N,22624,31802,32047,28750,N,23393,\r
+N,N,25929,N,27956,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24643,N,N,N,N,N,N,25432,N,N,N,N,\r
+27003,27176,N,N,N,N,32055,N,N,31527,N,26946,N,N,N,N,32119,N,N,N,N,N,25177,N,N,\r
+23660,N,N,N,N,N,N,N,N,N,26658,N,N,N,N,26224,N,N,N,N,N,N,N,32120,32121,N,N,N,\r
+30271,N,N,26407,N,26199,N,N,N,N,21619,21577,N,N,N,N,22138,N,22386,N,24896,N,\r
+23394,26200,N,N,N,N,N,N,N,N,N,26429,N,N,N,N,N,28751,29502,25132,N,N,N,N,N,\r
+30007,24688,N,N,N,N,N,N,N,N,N,N,N,N,32056,25448,N,21543,26748,31314,N,N,N,N,N,\r
+30831,N,N,N,N,N,N,N,N,N,22099,N,N,N,N,N,N,N,N,N,N,21812,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,28752,N,30576,28211,N,N,27194,N,27219,N,N,27977,23851,N,N,N,25900,32033,\r
+N,24400,27699,N,24401,N,N,N,N,N,28013,30776,30586,N,N,N,30763,N,N,N,N,N,29792,\r
+N,N,N,N,N,21562,25651,N,26970,N,24118,N,22847,N,22848,22127,N,N,N,N,22860,N,\r
+23082,N,N,N,N,N,N,N,N,24421,N,N,N,N,N,N,30565,N,N,N,19506,N,N,24441,22368,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21563,N,N,N,N,\r
+32122,N,N,N,N,19507,N,N,23411,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24402,N,20042,N,\r
+28250,N,N,N,N,N,N,N,N,N,25700,N,31567,N,N,N,N,N,N,20279,N,28227,N,N,N,N,N,N,N,\r
+20074,N,N,N,N,N,N,N,25133,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22369,31349,N,N,21833,\r
+30764,26457,N,N,N,N,N,N,N,N,N,N,N,29545,N,N,N,N,22637,25412,28785,N,N,N,N,N,N,\r
+N,26725,N,N,N,24698,28228,22878,N,N,N,N,N,N,N,N,N,N,27426,27427,N,N,N,N,N,N,\r
+31810,27195,N,N,N,N,26667,24162,N,N,N,N,N,N,N,N,N,N,28015,N,26659,N,N,N,N,\r
+20337,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21564,N,31850,N,N,N,N,N,26430,N,31858,N,\r
+N,22068,N,N,25134,N,21303,31308,N,N,N,N,N,N,N,N,31324,N,27957,24931,N,26668,N,\r
+26717,N,N,28521,N,N,N,N,N,29757,N,20280,26971,20780,N,N,N,N,N,N,23111,N,N,N,N,\r
+N,N,N,27465,N,26700,N,N,N,24119,N,N,N,N,22076,21349,N,N,N,N,N,31325,N,N,N,N,N,\r
+N,23126,N,18993,N,N,N,N,N,N,23112,24358,N,31027,29266,N,19012,N,N,N,N,N,N,\r
+20043,N,N,19829,N,N,N,32048,21800,N,28993,N,N,25193,23626,27700,31296,N,N,\r
+31528,20520,N,N,23148,N,N,N,N,N,N,N,N,N,22894,N,24699,N,N,N,28522,31326,24644,\r
+N,20281,N,21834,22370,25135,N,22328,N,N,N,N,N,N,N,N,N,26701,N,N,N,N,N,N,N,\r
+30298,N,N,N,N,28450,25178,30332,N,N,31568,20781,N,19812,N,20782,23661,26702,N,\r
+28793,20021,26236,N,N,22395,20566,23925,30577,N,30333,N,23415,N,N,N,N,31594,\r
+26972,22849,N,30066,24645,N,N,N,N,N,N,27220,N,N,N,N,N,N,N,N,N,31042,N,27196,N,\r
+21061,31569,26432,27429,N,24442,25378,22329,N,26947,N,26749,26671,N,N,29267,\r
+31529,22565,N,N,N,N,21835,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20552,N,N,N,20783,22371,\r
+N,N,N,24646,N,22050,N,28016,N,N,N,N,N,N,N,N,N,N,N,N,22387,N,N,N,31828,N,23127,\r
+19551,N,29268,N,20784,N,19552,N,23421,29503,N,28753,N,N,N,N,N,31803,N,25136,N,\r
+N,26149,N,N,N,25179,N,N,N,24414,N,24647,N,N,N,N,N,N,29295,N,N,N,19553,N,N,N,N,\r
+22122,N,N,N,N,26434,N,N,N,20022,N,29504,N,19838,N,N,N,31570,N,30840,30587,N,N,\r
+26687,N,N,N,N,N,N,N,26679,N,N,N,N,N,N,N,N,27958,23610,N,N,19508,N,N,N,N,N,N,N,\r
+N,N,N,N,N,29047,N,N,N,26680,N,N,19062,N,25636,29782,N,N,N,24422,N,N,N,24359,N,\r
+24423,24897,N,26948,N,N,23627,26949,N,N,N,28451,27430,19235,25449,N,N,N,20859,\r
+28452,N,28523,N,N,N,N,N,N,N,N,N,N,N,N,20532,N,N,N,N,19747,N,N,26726,N,28453,N,\r
+21324,23149,N,N,N,N,22330,N,29269,30053,22895,N,N,N,N,31028,N,N,21844,32079,N,\r
+N,N,23395,N,N,N,N,29025,27702,N,N,N,N,31614,21335,N,20785,N,19249,N,N,N,N,\r
+20786,N,N,N,N,N,N,19250,28994,N,N,29793,31029,N,N,24899,24898,N,27511,N,N,N,N,\r
+N,N,N,N,N,N,N,24360,N,N,N,N,N,N,N,19274,N,N,N,N,N,26169,N,N,N,N,N,30814,31018,\r
+19063,N,27959,N,N,21304,29270,N,N,21593,28229,29296,N,N,N,18994,N,N,23611,N,\r
+29048,N,N,N,N,N,27703,N,N,N,N,25930,N,30272,32093,N,N,21603,19554,N,30548,N,N,\r
+N,N,N,N,22373,N,N,N,N,N,N,N,N,N,N,N,N,N,21315,N,22566,N,30273,N,N,N,N,N,23926,\r
+N,19776,25948,N,N,N,N,N,N,N,N,N,N,N,N,25931,N,N,N,N,N,N,N,N,N,N,N,24900,N,N,N,\r
+N,N,26672,29744,29546,23150,N,22331,N,25137,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,22314,N,N,N,N,N,N,22139,N,N,N,N,N,N,N,N,N,25695,N,19030,N,N,N,27432,N,N,\r
+N,23422,N,N,N,N,N,N,N,N,N,N,30274,N,N,28475,N,N,N,N,21629,N,N,24648,N,N,N,\r
+26681,N,28454,N,N,N,N,N,19748,N,N,21620,23329,23388,23389,N,N,N,N,N,28252,N,\r
+19275,31829,N,N,N,N,N,N,20075,N,19777,N,N,31571,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,31019,N,N,N,N,N,N,N,N,N,N,N,30036,N,N,N,N,22825,N,N,\r
+26973,23373,N,N,23886,N,26435,N,27724,N,N,N,N,N,N,N,31084,N,N,N,19276,N,N,N,N,\r
+24700,21544,N,27987,22639,N,29271,N,19064,23151,N,N,22100,N,N,N,N,N,N,22861,N,\r
+N,N,22638,N,29249,N,N,N,24403,N,N,N,23152,N,25194,24701,N,N,22648,N,N,N,30511,\r
+23094,N,19031,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29272,N,22649,N,N,N,N,N,N,N,\r
+N,31327,N,N,N,N,N,N,N,N,N,N,N,N,N,20335,22850,N,28754,N,25681,N,N,N,29495,N,N,\r
+N,N,N,N,N,N,N,N,N,N,31328,N,N,N,N,N,N,N,N,N,N,N,N,N,28524,N,N,N,N,N,25138,N,\r
+21565,N,N,22862,N,N,N,N,29794,N,N,N,N,N,N,N,N,N,N,N,N,N,21545,N,N,N,N,19778,\r
+26458,N,N,N,N,N,N,N,N,N,N,N,29273,N,N,N,N,N,22826,N,N,N,N,N,N,N,N,N,N,N,N,\r
+22590,N,N,N,N,N,N,23597,N,N,N,N,N,N,25195,22140,N,N,19065,N,N,21594,N,N,N,N,N,\r
+N,N,29783,19489,N,N,20282,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30008,\r
+N,N,N,22851,20584,N,N,N,N,N,25413,27512,N,29233,N,N,N,20283,N,N,N,21293,26721,\r
+20076,N,N,N,24628,24163,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23927,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,29234,29558,30299,N,N,N,N,22398,N,N,N,N,N,30815,N,30578,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,20521,N,N,N,N,N,N,N,N,N,26202,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,29990,N,N,N,N,N,N,N,N,N,N,N,N,N,22332,19555,N,N,26203,N,N,N,N,N,N,N,N,N,\r
+N,N,N,23901,N,N,N,N,20787,N,N,N,N,N,28525,N,N,N,N,22110,25716,24943,N,N,23928,\r
+N,N,N,N,N,26703,N,N,N,N,N,N,N,N,N,N,N,19045,N,N,N,23585,N,24629,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,31788,31789,22567,N,N,N,N,27960,N,N,N,23350,N,N,N,N,22128,\r
+29487,N,N,19749,N,23153,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22568,N,\r
+N,N,19556,N,N,20788,N,N,N,N,N,19032,N,N,N,N,N,23154,29991,N,N,N,N,N,N,N,N,N,N,\r
+N,N,29992,N,N,N,N,N,N,N,26150,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21868,\r
+21880,23155,N,N,N,N,N,N,N,N,N,N,N,N,N,25414,N,N,N,24164,N,24165,20789,N,N,N,N,\r
+N,20790,20791,29235,N,N,N,N,N,N,26974,N,N,N,N,N,28755,29236,N,N,28756,19300,\r
+31572,30054,25450,N,24166,N,N,N,N,24404,N,N,30841,N,N,N,N,28718,N,N,N,N,N,N,N,\r
+N,N,N,N,N,20792,N,N,N,N,22111,N,20567,N,N,N,N,N,N,N,N,N,N,N,31777,28526,23640,\r
+N,26975,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25949,32123,N,N,24649,N,N,N,\r
+22089,N,N,21546,N,25932,N,N,N,N,N,26976,N,N,N,20568,31778,21566,25139,24167,N,\r
+N,N,N,N,N,N,23612,21046,30037,N,N,N,N,N,20001,29993,N,N,23929,N,N,23930,N,N,N,\r
+N,N,N,28757,N,N,N,N,30303,N,29274,25707,N,29297,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,27705,32124,N,N,N,N,24874,N,N,19033,N,N,28527,N,29994,N,N,N,N,N,N,27769,N,\r
+N,30765,N,29250,30275,N,22354,N,N,31010,28758,N,N,N,N,N,N,N,N,N,N,N,N,N,28794,\r
+N,N,30304,N,N,N,N,26995,29251,N,N,N,21547,18995,19750,N,19779,19802,N,N,N,N,N,\r
+22863,N,N,30276,N,N,N,28253,26436,N,N,N,N,N,N,N,N,25140,N,N,N,N,N,N,N,N,N,\r
+24418,26459,N,N,N,N,N,N,26673,N,31790,N,N,N,N,25933,N,N,N,31339,N,20284,N,N,\r
+20322,19830,N,N,28528,N,29758,N,21581,N,N,29496,N,N,N,26913,N,N,N,N,N,N,N,N,N,\r
+29298,29547,N,28759,N,N,20311,N,N,N,N,N,N,20319,N,N,N,N,N,N,N,N,N,26688,26689,\r
+N,N,N,20323,26914,N,N,N,N,N,N,N,N,N,N,20522,N,N,N,N,N,N,N,N,N,29505,20523,N,\r
+21604,N,N,28476,22561,N,N,N,N,N,N,N,N,N,N,N,22879,N,29527,N,N,N,23613,N,19557,\r
+28017,N,N,29026,N,21595,N,N,N,N,25141,N,N,19046,N,21294,N,N,N,N,N,N,19558,N,N,\r
+29011,30055,N,N,N,N,19034,31598,N,24901,N,N,N,N,N,N,N,24425,N,28254,N,N,30530,\r
+N,22562,N,N,N,N,N,23852,N,N,N,N,N,28719,22077,N,N,N,N,N,N,N,N,N,N,N,24875,N,N,\r
+N,N,N,N,N,N,N,N,N,N,31030,N,N,21621,N,20553,28455,25196,N,23402,20044,30056,\r
+30549,N,21325,N,29566,N,N,N,N,N,N,N,N,N,20533,N,N,N,N,N,N,N,N,N,N,N,24702,N,\r
+24443,N,N,N,N,N,N,26205,N,N,N,N,N,N,N,26660,N,N,N,N,N,N,N,N,N,19277,N,N,N,\r
+28456,N,N,N,28212,N,N,N,N,23128,20793,N,24361,N,N,29488,N,N,19524,N,N,N,20023,\r
+N,N,N,N,N,N,N,N,N,N,N,28457,N,N,N,24405,N,N,27991,N,N,N,28230,N,N,N,N,N,N,N,\r
+28477,31830,N,N,23412,N,28458,30777,N,30057,N,N,N,N,N,N,N,N,25433,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,24902,N,N,N,21567,N,N,N,N,24168,28778,N,N,N,N,N,N,N,N,N,N,29506,\r
+N,N,N,N,N,N,N,N,N,N,N,21295,N,N,19035,N,N,N,N,N,31831,N,N,27992,24903,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,29784,22067,23853,N,N,N,21822,N,N,N,N,N,N,N,N,28995,\r
+28255,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22123,N,N,N,29785,N,N,N,N,N,N,N,\r
+22374,N,N,N,N,N,N,23095,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23931,N,N,N,N,N,23887,N,\r
+N,N,N,N,N,N,N,22563,N,N,23129,N,28760,28484,N,N,N,N,N,N,24920,N,N,N,N,N,29012,\r
+N,28018,N,N,N,N,N,N,21851,N,N,21852,29508,19287,N,N,N,N,N,25142,N,N,N,N,28529,\r
+N,N,N,N,N,N,N,N,N,N,N,31573,N,N,N,N,N,N,N,N,N,N,N,21336,N,N,N,N,N,N,N,23888,\r
+28761,19251,N,N,N,N,N,N,21853,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19751,N,N,\r
+20524,20794,N,28996,N,25907,31605,26977,32096,31804,N,23074,23075,N,21025,N,N,\r
+21103,N,N,N,25197,N,N,24169,20060,29237,20580,23889,N,N,N,N,24904,23351,24419,\r
+N,N,N,N,N,N,N,N,27961,28997,N,29519,22315,24876,N,N,25451,N,28231,N,N,N,24905,\r
+19066,N,N,N,N,N,N,N,28795,31329,28762,19559,23156,N,N,N,N,N,N,N,N,N,19519,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,20077,N,N,21801,31330,N,N,N,20581,N,27478,N,27743,N,N,N,\r
+24444,N,N,30550,24170,19252,N,N,28478,N,N,19509,N,N,N,N,N,20285,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,28530,25143,N,N,N,19560,N,N,N,N,N,N,N,N,28796,N,N,N,22112,N,\r
+28998,N,N,N,N,N,N,N,N,N,25144,27435,N,N,N,19253,22609,N,29774,29559,N,N,22342,\r
+N,20795,30506,N,27978,22355,22650,N,N,N,N,N,N,N,30277,N,N,20812,23932,N,N,N,N,\r
+N,N,N,N,N,N,24445,N,31077,N,24650,N,N,29309,21296,N,29811,23113,N,26206,N,N,N,\r
+N,30778,26704,N,N,22651,N,N,27221,N,N,N,N,22051,N,N,N,N,N,N,30278,29275,25724,\r
+N,N,N,N,N,N,N,N,N,N,26674,N,N,N,N,N,23130,N,29276,31574,26930,N,28205,N,31331,\r
+N,N,N,N,N,N,N,23662,N,N,30058,26208,N,28797,N,N,N,N,N,22316,N,N,N,N,N,30021,\r
+28256,N,N,23397,N,23902,N,N,22896,26915,N,N,N,N,N,N,N,N,N,N,29049,N,29252,\r
+24651,N,N,N,N,N,N,N,N,26916,N,N,25145,N,N,N,N,N,N,N,25393,31851,19752,N,19510,\r
+N,N,28763,N,N,N,N,N,N,N,N,26170,N,N,19753,N,N,N,N,N,29507,N,N,N,N,N,N,N,N,N,\r
+24921,N,N,28459,N,N,N,26437,N,N,24681,N,29509,N,N,21568,21823,23854,N,31100,N,\r
+19520,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25890,N,N,N,20024,N,N,N,22610,31062,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28970,20049,N,N,30279,N,23403,N,24446,N,\r
+N,22625,N,30579,N,22375,N,N,N,N,N,N,N,N,N,N,N,21630,N,N,20796,N,25935,N,19254,\r
+N,23096,N,N,N,N,N,19780,N,N,N,N,N,22078,N,N,N,25146,N,N,N,N,N,20312,N,N,N,\r
+24652,27513,N,N,N,N,N,N,N,N,32125,N,N,N,N,N,22376,19288,N,N,N,26978,N,N,N,\r
+26682,N,N,N,25415,N,N,N,N,27725,N,27726,N,22079,N,N,N,25383,N,24406,32104,N,N,\r
+N,N,N,N,N,N,N,28257,30248,23933,N,N,N,N,N,N,N,30779,N,26705,N,N,N,N,31063,N,N,\r
+N,N,N,N,N,N,20078,N,N,27727,26917,22101,N,19781,N,27962,20797,N,N,20286,N,N,\r
+27707,N,N,N,21041,N,N,N,N,19561,N,22852,27004,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,20798,N,N,N,N,N,27708,N,N,25901,N,N,N,N,N,N,30512,N,19562,N,N,N,21316,\r
+N,N,22080,N,N,N,22141,N,N,N,N,N,N,N,N,N,N,N,24865,N,24125,N,30249,N,N,N,23076,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22052,30022,N,24866,26950,N,N,N,29253,N,N,N,N,\r
+N,29801,22124,27475,N,N,N,N,27709,25180,24171,28764,N,27455,N,22350,20799,N,N,\r
+N,N,N,N,N,N,N,29995,N,N,N,N,31101,N,19036,N,N,N,19782,29238,N,N,23934,N,N,N,\r
+19511,23352,N,N,N,N,20585,N,20061,27456,N,32034,N,N,N,N,N,30795,N,N,N,N,N,N,N,\r
+N,27222,28976,N,N,N,N,N,N,N,23374,N,30531,N,N,N,N,N,N,N,N,N,N,N,23375,19236,N,\r
+N,30816,N,N,31575,N,N,27466,24609,N,N,N,N,N,N,N,N,N,N,N,20045,N,N,21596,N,N,N,\r
+32088,N,N,N,N,21110,29239,N,N,31350,30250,31351,22630,N,29745,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,26706,N,19013,19563,N,N,N,N,N,N,N,25198,N,N,N,N,N,25147,N,30509,N,N,\r
+N,30817,N,N,N,N,N,N,N,N,N,29548,N,N,N,N,24097,N,N,N,N,N,N,N,N,N,N,N,N,25725,N,\r
+N,25452,N,23855,23856,N,N,19255,26707,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24867,\r
+21088,N,N,N,N,28798,N,N,N,N,26918,19314,N,N,N,N,N,N,28019,23641,24653,N,N,N,N,\r
+30554,23353,N,N,N,N,N,N,N,19502,N,23131,N,N,N,N,19783,N,N,N,N,N,N,N,N,N,N,\r
+23857,N,22575,25379,N,N,20079,N,N,29299,N,N,N,N,30771,N,N,N,N,N,N,N,N,N,N,\r
+24654,N,30077,N,N,N,N,27500,N,N,21317,31852,21083,21611,N,24098,N,N,N,25958,N,\r
+N,N,N,N,N,28720,N,N,N,N,N,N,N,N,N,N,21828,N,N,N,N,N,N,28020,N,N,N,25453,N,\r
+26690,N,28021,22396,N,27963,N,N,30251,N,N,N,N,N,29240,30280,N,N,N,N,N,21350,\r
+29277,20287,N,27436,20288,N,26152,32105,N,20289,N,24671,24172,N,N,N,N,24610,N,\r
+N,N,N,N,N,N,N,29759,25199,N,22897,28999,N,19256,N,N,N,N,N,N,N,N,31102,23354,\r
+23157,N,N,N,N,N,N,N,N,30316,23132,31332,N,24655,N,N,N,N,N,N,23858,N,N,N,N,\r
+26153,N,28531,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29549,N,N,N,N,N,N,N,N,N,N,\r
+27514,N,31078,N,N,N,N,N,N,N,19037,21854,N,19038,24420,N,N,N,26237,N,29996,N,N,\r
+N,N,N,25717,N,N,N,N,N,N,N,N,N,N,N,N,26979,N,27979,20324,N,N,N,22611,N,N,N,N,N,\r
+N,23859,21612,N,N,29241,N,24375,N,N,N,N,N,19278,31576,N,N,20569,N,N,23890,\r
+30580,26460,25637,N,31779,N,23355,N,N,N,29242,27005,20554,N,30038,22853,25652,\r
+N,27943,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27197,26238,N,30532,29997,N,22880,N,\r
+N,N,18996,N,N,30818,20290,N,27710,N,N,N,25908,19784,28232,N,N,N,N,N,N,N,N,N,\r
+26440,N,N,N,N,N,N,N,N,N,N,N,19785,31031,29032,22898,23413,18997,22854,N,N,N,\r
+22601,N,N,N,N,N,N,N,N,N,N,N,N,N,22827,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27964,N,\r
+N,22612,N,N,N,23642,N,25148,N,N,31853,27744,21118,N,26951,26154,N,N,N,N,N,N,\r
+25200,N,N,N,N,N,N,31291,N,29998,31530,N,N,N,N,27771,N,27711,31832,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21605,N,N,N,31043,N,N,N,\r
+28258,N,N,N,N,N,N,N,N,N,N,N,N,N,22377,28022,N,N,N,24173,N,N,N,N,N,N,N,19564,N,\r
+25454,N,N,N,N,N,26708,N,N,N,31352,N,N,N,N,N,N,23860,25653,22576,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,22613,N,N,N,29802,N,N,N,20025,N,N,N,22113,20306,N,20534,N,\r
+N,N,N,N,N,20002,N,N,29550,N,N,N,N,N,29560,N,N,N,N,N,N,N,N,N,N,N,N,23628,N,\r
+20555,N,N,N,31780,19786,22356,24099,N,25696,N,N,N,N,28233,N,N,N,25181,30078,\r
+21548,N,N,N,N,N,21841,N,22640,30787,27223,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,30039,N,N,22591,N,N,N,N,32064,N,N,N,N,N,N,27437,N,N,N,N,21802,\r
+N,N,N,N,N,N,N,N,N,N,N,26408,N,N,N,N,N,N,N,N,N,N,N,N,N,28234,N,N,N,19047,N,N,N,\r
+N,N,30819,N,21597,N,N,27224,N,N,N,N,31577,28023,N,N,25909,N,N,N,N,N,20525,N,N,\r
+N,N,29041,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25149,N,N,N,25416,N,N,N,N,\r
+22869,N,N,24362,N,N,N,N,23356,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30820,N,N,N,N,N,\r
+29050,N,N,25910,29551,N,N,31578,24928,N,22828,N,30059,N,24630,N,N,26952,N,\r
+19279,N,25417,N,N,N,24174,N,N,N,N,N,N,N,N,25150,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,23663,N,22053,N,N,N,N,N,25201,N,N,N,N,N,N,N,22142,22817,N,22592,23643,N,N,\r
+27965,24376,N,27173,N,N,N,22317,N,N,29561,N,28024,N,30023,N,N,N,N,N,N,24906,\r
+27491,N,29278,N,N,N,N,N,N,N,N,N,N,N,N,N,30796,N,27225,N,21318,N,23398,N,N,N,N,\r
+N,29999,N,N,N,N,20080,N,N,N,N,27006,N,N,N,N,N,31542,N,N,N,N,N,N,N,N,N,25202,N,\r
+N,N,N,20338,30521,22899,N,N,24907,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+23133,N,N,23097,N,N,N,N,N,N,N,27515,N,19257,N,N,28025,N,N,N,N,N,N,24672,N,N,N,\r
+N,N,N,N,N,N,N,29760,N,32060,24369,25455,N,N,N,N,24611,32057,N,N,N,N,N,N,N,N,N,\r
+28721,N,N,N,N,N,N,19787,N,N,N,N,N,N,N,27966,N,N,N,21824,25456,28026,N,N,N,N,N,\r
+26980,N,N,N,N,N,N,21869,26461,N,N,N,N,N,N,21622,25911,N,N,N,23399,25151,N,N,N,\r
+N,N,N,N,N,N,N,N,N,28235,N,N,22388,28765,N,N,N,20011,26462,N,N,N,22102,24908,N,\r
+N,26675,N,N,N,N,N,N,N,N,N,N,N,25966,23586,N,N,24656,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,21813,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21793,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,31579,N,31051,N,N,N,19315,29733,N,N,N,N,N,31304,22103,N,26981,31580,N,N,\r
+N,N,N,N,N,32080,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31606,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,23077,N,23357,N,N,N,N,N,N,27746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19831,\r
+28766,N,N,N,N,30281,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+24175,N,N,N,21297,N,N,N,N,N,N,N,N,31854,N,N,N,N,26691,N,29000,N,N,N,20081,N,N,\r
+N,N,31085,N,N,N,N,N,N,N,N,29300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25654,30009,N,\r
+23664,25457,N,N,N,N,26661,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29243,N,24100,N,23116,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,19049,N,N,N,N,N,N,25434,N,31833,N,N,N,N,N,N,N,27226,N,N,N,\r
+N,N,N,31044,N,25380,N,N,N,N,N,N,N,N,N,N,N,31581,N,28490,N,26692,N,N,N,N,N,N,N,\r
+N,N,21836,N,N,N,N,N,N,N,N,N,N,27479,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22829,N,\r
+N,31531,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21337,N,N,N,N,N,N,21794,N,N,N,N,N,N,N,\r
+N,N,30302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,23158,N,N,N,N,\r
+N,N,N,N,N,N,N,24657,N,N,26920,N,N,30073,N,N,N,N,N,N,31279,N,27516,N,N,24682,\r
+25394,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,21829,N,N,29027,21870,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,19788,N,N,N,N,27993,N,N,N,N,22593,N,N,N,N,31340,N,N,\r
+N,N,N,29035,N,N,N,N,N,31292,26210,N,N,N,N,31333,25210,N,N,N,18998,N,25655,N,\r
+27227,N,30074,N,N,N,31532,20291,27517,N,N,N,N,30842,N,N,24377,N,N,N,N,24945,N,\r
+21028,N,N,N,N,30075,N,N,N,N,N,N,20570,20571,N,27198,22833,N,N,N,N,N,18999,N,N,\r
+21351,N,30821,N,N,N,N,21298,N,N,N,25152,29279,N,N,N,N,N,N,19813,N,N,N,N,N,N,N,\r
+N,N,N,N,N,31020,N,N,N,N,N,N,N,N,19789,N,N,N,N,N,N,N,N,N,N,N,N,28206,22062,N,N,\r
+N,N,N,N,N,N,N,N,N,N,22378,N,N,N,N,26464,27438,N,N,N,20313,N,N,23629,28027,N,\r
+24176,N,22379,N,N,N,N,N,N,24101,N,N,N,N,N,N,N,N,N,N,24407,23376,23377,N,N,\r
+21795,N,N,N,N,28722,23644,N,N,N,N,N,N,N,N,19048,N,30822,23630,N,N,N,N,27228,\r
+23378,N,N,N,N,N,N,N,N,N,N,N,26931,N,N,N,N,30555,N,N,N,N,N,N,N,N,N,N,N,25384,N,\r
+22318,N,N,24673,N,N,N,N,N,19258,N,N,25937,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,20572,N,N,N,N,21825,N,N,N,N,N,22602,N,N,N,N,N,N,N,25385,N,N,N,\r
+N,N,N,N,N,N,N,N,N,24612,N,26921,N,21319,N,N,23645,30766,N,N,N,19512,N,N,N,\r
+20526,N,N,N,22642,N,N,25418,N,N,N,N,N,N,N,N,N,N,19503,N,N,N,N,N,N,N,21549,\r
+30289,N,N,N,N,N,N,N,20556,N,N,N,N,N,N,N,19014,N,N,21826,N,N,20026,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,19015,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31280,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,24408,N,N,N,30010,25963,N,28532,23861,N,N,N,N,19754,N,\r
+25458,N,31607,N,30544,N,N,N,N,32058,N,N,32097,30334,20800,N,N,26693,N,25656,N,\r
+24936,N,N,N,19521,N,21101,N,N,N,N,23358,N,N,24674,N,N,N,31305,N,N,24909,N,\r
+19000,N,N,N,29280,29001,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24177,N,N,N,\r
+28767,30788,N,N,N,N,N,28236,N,N,24178,N,26441,N,25203,26465,N,N,25419,N,N,\r
+25420,N,N,N,20344,28460,N,32126,31781,31281,24409,N,24658,N,N,N,29786,N,N,N,N,\r
+N,N,N,N,N,N,N,29002,N,20003,N,N,N,N,29244,27747,N,N,N,N,N,24613,N,30507,N,N,\r
+27439,N,N,N,N,N,25950,N,24868,19755,N,22900,26662,19790,24937,N,31855,N,24675,\r
+N,N,N,N,N,25153,N,20004,N,N,N,N,N,N,24102,N,N,27518,N,27485,28768,N,N,29787,N,\r
+25204,N,N,21320,N,N,N,29803,N,28213,N,30040,N,N,21855,N,N,N,22117,N,N,N,N,\r
+27440,29795,N,N,N,N,25421,N,N,N,N,29812,31282,N,N,28533,19039,N,27441,27967,N,\r
+N,32073,N,N,N,N,25638,31012,28723,N,25964,N,N,N,20839,22855,25687,27229,N,\r
+21623,N,N,N,N,N,N,N,N,N,23098,N,23117,N,N,N,31052,N,24922,23359,N,19525,27728,\r
+19259,N,24179,N,N,26922,N,N,N,N,N,N,N,22856,N,N,28259,22333,N,N,N,N,N,N,20292,\r
+N,N,N,N,N,20557,N,N,N,N,N,N,N,31782,N,N,N,N,N,N,N,29051,N,N,N,N,32082,20801,N,\r
+N,N,N,N,N,N,N,25435,N,21321,N,23631,N,N,N,N,N,N,N,N,N,19565,N,N,N,N,N,24103,N,\r
+N,26171,27681,N,N,N,19513,N,N,31582,N,N,N,N,N,26466,N,N,21569,N,N,N,N,N,N,N,N,\r
+N,23592,N,N,N,N,N,25154,N,29528,25939,N,N,29529,N,N,N,29510,19803,N,N,N,N,N,N,\r
+N,19756,N,31811,N,N,N,N,21607,N,20802,N,31013,N,26709,N,N,N,N,N,N,N,N,25422,N,\r
+N,N,N,21578,N,N,N,N,N,N,24410,N,N,N,N,N,N,N,N,31583,26467,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,30843,25423,N,N,N,N,N,N,N,30000,N,N,N,N,N,N,N,22631,N,22857,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,30767,28534,N,23862,28207,19832,N,N,N,N,24120,31783,30588,\r
+30513,20027,29729,N,N,28237,24878,N,N,27715,20350,N,30783,22626,21352,N,N,\r
+24104,29796,27714,N,22901,31045,23891,22129,27772,31856,N,N,27968,19001,N,\r
+28260,N,N,N,N,N,N,29281,N,24121,N,N,N,N,N,N,22130,N,24180,N,24411,N,23379,N,\r
+31335,22627,29761,N,23863,N,N,N,29301,N,N,21550,N,N,N,N,N,N,22131,N,N,N,N,N,N,\r
+23864,20293,24415,29246,30241,N,27467,29052,N,29511,N,N,24683,N,N,N,N,N,28028,\r
+N,N,24923,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,28261,N,24181,N,N,N,N,31315,N,N,N,N,29003,N,N,20527,23865,N,N,20803,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,30001,N,N,N,N,27206,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28769,\r
+N,N,N,N,N,N,N,N,N,30252,N,N,N,N,30041,N,N,N,N,N,N,N,N,N,N,28779,N,N,N,N,N,N,\r
+23866,N,N,N,29247,N,N,N,N,N,N,N,30533,N,N,N,N,23330,29302,N,N,19002,N,N,N,N,N,\r
+N,N,N,N,N,N,30581,N,19301,N,N,N,28262,N,24659,N,N,N,N,20005,N,N,N,N,N,N,22104,\r
+N,N,N,21551,26953,N,N,N,N,21326,29762,N,N,N,N,N,N,N,N,N,N,N,N,N,19302,N,N,N,N,\r
+N,N,N,N,N,N,N,28961,N,N,N,N,N,27442,N,N,N,N,28962,N,N,N,N,N,N,N,N,N,N,N,N,\r
+27443,N,28724,N,N,19316,21552,29490,31543,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30060,N,\r
+N,N,N,N,28263,29746,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30061,N,20339,N,N,N,\r
+N,N,N,N,N,N,N,28770,N,N,N,N,N,28238,N,N,29004,N,N,25912,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22389,25459,20325,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,20294,N,N,N,N,N,N,N,N,N,29491,25688,20345,20314,N,N,N,N,31309,N,N,\r
+N,N,N,N,N,N,N,N,N,N,26211,N,N,N,N,N,N,N,N,N,N,N,29282,N,N,N,N,N,N,N,N,N,N,N,N,\r
+30062,N,N,19003,N,N,25436,20082,N,22105,N,N,N,28208,N,N,N,N,N,N,N,N,29797,\r
+22594,23632,19566,N,N,N,N,N,21856,30282,32074,22614,29775,N,N,N,N,N,N,22054,\r
+23614,N,23380,22343,N,N,N,N,29310,N,N,N,29005,N,N,N,N,25155,23646,N,23647,N,N,\r
+28461,26155,N,N,N,N,31069,27199,N,N,N,28462,N,N,N,29776,20083,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,26156,N,20062,N,N,21881,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25460,\r
+19792,N,N,N,N,N,N,21816,N,N,30589,N,23593,N,N,N,N,24182,N,23594,29283,26932,\r
+21084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26982,N,N,25462,N,N,N,N,N,N,N,N,26442,N,N,\r
+20558,N,N,23159,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19004,N,N,N,28264,23134,N,\r
+29303,N,N,25211,N,19494,N,N,N,N,23099,N,28265,N,N,N,30042,30556,24938,20033,\r
+21553,N,32049,26173,N,31533,N,N,30823,N,24910,N,30562,30063,20295,N,N,21554,\r
+19567,N,21608,N,28239,30551,N,N,24614,22081,24924,28771,29028,23665,22055,N,N,\r
+N,N,N,N,N,N,N,N,29813,N,N,29006,29284,N,N,20528,N,N,27759,N,N,N,31034,N,27445,\r
+N,N,21613,25156,N,N,N,N,26983,N,N,27444,27169,N,30780,20006,N,31046,31834,N,\r
+21555,21305,27230,N,N,N,26923,N,N,24929,21327,29814,N,27200,24911,N,19514,N,N,\r
+N,N,N,28266,N,N,N,28772,29492,21614,N,N,29248,N,N,29029,N,29763,24660,N,27446,\r
+N,22305,19304,N,31021,26925,22628,31283,25157,31805,N,N,27716,22577,N,23595,N,\r
+N,N,N,21796,N,27497,N,N,N,26683,N,N,N,22615,N,N,N,N,N,N,N,N,31534,20833,N,N,\r
+23360,N,30014,N,24183,N,N,N,N,19067,30534,20296,N,N,N,24912,N,N,28240,N,N,N,N,\r
+N,N,N,N,26996,N,N,N,N,N,N,N,N,20084,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+21837,N,N,20315,N,N,N,N,N,N,23867,N,N,N,N,20012,N,N,N,N,N,N,N,26984,N,N,N,N,N,\r
+N,N,21556,25671,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,30043,N,N,31297,N,N,N,24105,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,21624,N,N,N,N,N,28535,N,N,N,N,21299,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,27447,28536,30044,27980,23381,29007,N,N,N,29008,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,30002,N,N,N,N,N,N,22830,21804,N,25158,N,N,N,N,N,N,N,N,\r
+32035,N,31589,24363,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25205,N,30253,N,30003,N,28725,\r
+N,N,N,N,24869,N,N,N,N,N,N,N,N,N,30045,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27682,28029,\r
+N,30004,31544,N,23331,N,N,22090,19289,N,N,N,N,N,N,N,N,N,N,25940,N,N,N,N,N,N,\r
+29562,N,27448,N,24631,22380,29036,25903,21857,22381,20817,N,N,N,N,N,24946,\r
+28537,N,N,N,23868,30300,N,N,N,N,N,28773,N,N,N,29764,N,N,26985,N,N,N,N,N,N,N,N,\r
+N,N,29563,21615,N,N,19490,30590,24380,N,N,N,N,27469,N,N,N,N,N,N,20535,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22082,N,N,N,N,N,26669,N,N,N,N,28463,19237,N,\r
+N,N,N,19305,N,N,N,31336,N,N,N,N,N,N,N,N,N,N,N,N,N,19526,N,N,N,26215,N,N,27207,\r
+N,N,N,23332,N,20297,25212,28538,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,27486,N,N,30024,N,21598,N,N,N,N,N,N,N,N,N,N,N,24661,N,28464,N,N,25159,N,\r
+22831,N,N,N,31079,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26469,N,N,20298,\r
+24913,N,25160,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28539,N,N,31353,N,N,23666,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,24615,N,N,N,N,N,30824,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,19306,N,N,N,19260,22114,N,N,N,N,N,N,N,N,N,N,N,30046,N,N,N,N,N,N,N,30047,N,\r
+28214,N,N,N,25206,21322,28540,20804,28465,N,20805,N,20574,N,22881,N,N,24632,N,\r
+N,19793,29497,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,26444,N,22056,\r
+20007,N,21557,N,N,N,N,N,N,25672,N,N,N,N,N,N,21300,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,27449,N,N,N,N,N,N,19317,N,N,N,N,N,N,30301,N,28963,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,19527,N,N,N,N,N,N,N,26954,N,24944,N,N,N,30048,N,N,N,N,N,N,N,N,31535,N,N,\r
+N,19281,N,N,N,N,31584,29285,N,N,27760,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+28780,N,N,N,N,N,N,N,N,N,N,N,N,N,28267,N,N,N,N,N,N,N,N,N,N,N,N,26955,N,N,19568,\r
+N,N,22319,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29473,31861,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,28964,N,N,N,N,N,N,N,N,N,N,N,N,24662,N,N,N,N,N,28466,N,N,N,N,N,\r
+N,N,N,N,29777,N,N,30497,N,N,N,N,N,N,N,N,N,N,N,29009,N,N,N,N,N,N,N,N,N,N,N,N,\r
+19068,19069,N,N,N,N,N,N,N,N,20046,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,29512,N,29498,28030,N,N,N,N,N,N,N,N,23078,N,N,24684,N,N,\r
+N,N,N,30797,N,19282,N,N,N,27470,N,31064,31065,19040,23114,N,N,N,19238,N,N,N,N,\r
+N,N,N,N,N,N,19016,31086,23404,N,N,20529,N,N,N,N,21871,N,N,N,26227,N,N,N,N,N,N,\r
+N,N,N,26402,25689,N,N,N,N,N,N,N,N,N,N,25697,N,N,31812,N,N,N,N,N,N,N,N,N,31087,\r
+20340,30566,N,N,N,N,N,20028,N,N,N,N,29765,23587,23869,N,N,N,N,29766,N,N,N,N,N,\r
+N,N,N,30753,N,N,N,26710,N,N,N,23361,N,N,N,N,N,N,N,N,28774,N,N,N,25657,30317,N,\r
+31022,N,23870,N,N,N,N,N,N,22320,22632,19261,N,N,31066,N,N,N,N,N,N,N,N,N,N,\r
+30798,31088,24685,25395,29747,N,N,27202,29286,28726,N,N,N,N,N,23382,N,N,N,N,N,\r
+27492,N,N,29287,N,22357,21558,31080,22337,N,N,N,N,25941,N,N,N,N,N,N,N,26986,\r
+22348,N,N,N,21353,25161,N,31835,19757,N,N,N,N,N,19504,27170,N,N,25718,20544,N,\r
+28727,28193,N,N,N,N,N,N,22390,N,N,N,25162,25163,N,31311,N,N,N,N,N,N,27487,N,N,\r
+N,N,N,22091,N,N,N,29748,N,N,N,N,27981,25682,N,N,27177,25658,29474,19794,N,\r
+30283,N,29030,27969,26684,28241,N,N,N,N,N,N,28775,25164,N,N,25642,N,30049,\r
+27994,N,N,N,N,N,22382,20849,N,N,N,N,26987,26988,24676,N,N,N,N,23079,23892,N,\r
+27171,N,N,N,22083,22132,N,23135,N,28467,25165,N,N,N,N,N,28541,29288,N,N,N,N,N,\r
+N,N,N,N,28485,N,26471,N,N,22397,N,N,26446,N,N,24412,N,31047,N,N,N,N,N,N,N,N,\r
+22902,N,N,N,N,N,N,N,N,24364,N,22106,N,N,N,N,N,N,23588,N,N,N,28728,N,N,N,N,\r
+21882,N,25719,N,N,N,22084,N,N,N,N,N,N,N,N,29804,N,N,N,N,28542,N,N,N,N,N,28705,\r
+N,24106,N,N,23100,22652,N,N,N,N,N,N,31316,N,N,N,27749,N,N,N,N,N,N,31784,N,N,\r
+27750,N,N,22603,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31545,N,25683,N,19833,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,20307,N,N,N,N,N,N,N,19050,N,N,20308,N,30781,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29767,N,N,N,N,27231,N,N,N,N,N,N,N,31067,\r
+N,N,N,N,N,N,N,N,21559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27493,N,N,\r
+24914,N,N,N,N,27172,N,N,N,31298,31585,31341,28706,19569,N,31267,25207,N,25166,\r
+N,26997,N,24939,N,N,N,26472,26711,23160,21579,N,N,N,30582,22085,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,21609,N,N,31354,N,N,N,N,N,N,N,19570,30557,N,24122,N,\r
+N,N,N,N,N,N,N,N,N,20008,N,N,N,N,N,28729,25726,25673,N,N,N,N,N,25684,N,N,N,\r
+27203,N,28468,N,N,N,22334,N,N,N,N,N,N,31586,N,19795,N,N,N,28469,N,N,N,31337,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31014,N,N,N,N,N,N,24381,N,30535,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,30845,N,N,30844,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+24107,23400,N,N,25437,N,24930,20806,N,N,N,N,N,N,N,N,N,N,30288,27494,23161,N,N,\r
+N,N,27719,N,N,N,N,N,N,N,24184,30825,25438,20085,N,N,N,N,N,31299,25943,N,27720,\r
+N,N,N,29513,N,N,25659,N,N,N,N,26158,N,N,N,N,N,28470,N,23615,N,N,N,N,N,N,N,\r
+20029,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22595,N,N,N,\r
+20559,N,20346,29514,24663,N,N,N,20807,26926,N,26685,N,N,31300,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25167,N,N,31301,N,N,N,31032,N,N,N,N,N,N,N,23648,\r
+N,N,31536,N,N,N,22569,25951,31015,N,N,30318,N,30284,25208,N,N,N,N,27761,N,N,N,\r
+N,N,N,N,23136,N,N,N,N,N,N,N,N,N,N,N,N,N,N,29010,21068,20299,N,N,19005,N,N,N,\r
+23871,N,N,N,30319,N,24185,N,N,N,N,N,N,N,N,N,N,N,N,N,31284,N,N,N,21805,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,29031,24126,N,N,N,N,N,N,23616,N,N,N,N,N,20808,20809,N,N,N,N,\r
+N,N,N,N,N,30782,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19318,N,N,N,N,21625,N,N,N,N,\r
+N,30050,24915,N,N,N,N,N,N,N,N,22633,N,N,30846,N,20300,N,N,N,N,N,N,N,32036,N,N,\r
+N,N,N,N,N,20086,N,31312,N,N,19571,26174,N,N,N,30254,N,N,21872,N,N,20810,N,N,N,\r
+31806,21873,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19817,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,31285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,25168,\r
+29815,N,N,N,19796,N,N,N,N,N,N,N,N,N,N,N,N,26403,N,N,N,N,N,N,N,N,23333,25169,N,\r
+N,N,N,N,N,N,N,N,N,N,N,22306,N,N,30563,N,N,N,N,N,N,27174,N,N,N,N,N,N,N,N,N,N,\r
+20513,N,N,N,N,20058,31595,23334,23390,22629,N,N,N,N,N,N,N,N,N,27232,N,N,N,N,\r
+22570,N,N,N,N,N,25952,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22107,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28486,N,N,30826,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,25685,N,N,N,N,N,N,N,N,N,N,N,20087,N,N,24664,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22383,N,N,N,N,N,N,N,N,N,N,N,N,29805,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,19814,N,N,N,19572,30051,N,N,25674,N,23649,N,N,31048,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,31807,N,N,N,N,N,N,N,N,N,N,N,N,26663,N,N,N,N,N,N,N,N,22596,\r
+N,N,N,N,N,N,N,N,N,N,N,19262,N,23598,N,N,N,N,N,N,N,N,N,N,N,N,N,22391,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28776,N,23872,N,20301,N,N,N,N,N,N,N,N,N,\r
+23667,22832,N,26217,25660,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,27204,N,N,N,N,N,N,\r
+N,N,N,N,25708,N,25701,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,31608,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,19515,N,N,N,N,N,N,N,N,N,N,N,25661,N,N,19804,22903,\r
+N,N,N,N,N,N,N,N,N,N,23903,N,N,N,N,N,27982,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22864,\r
+N,N,N,N,N,25891,N,N,N,N,31053,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,19758,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,20302,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,30255,N,N,N,N,N,32083,27501,22108,25892,N,N,N,21814,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22109,\r
+N,N,N,31081,N,N,N,26404,N,22115,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,20811,\r
+22116,N,N,N,21874,N,N,N,N,N,24186,N,22392,N,N,N,N,N,22634,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,20309,22653,N,N,N,N,N,22571,N,N,32075,N,N,N,N,31836,N,N,N,N,N,N,N,N,N,\r
+24616,21875,N,N,32089,N,N,19491,N,N,N,22905,N,N,21354,30069,N,28487,N,N,N,N,N,\r
+N,N,N,N,21338,N,N,N,N,N,N,N,N,N,N,N,23101,26664,23599,N,N,N,N,N,28707,N,N,N,N,\r
+19797,N,N,N,N,N,N,N,N,N,N,N,N,24617,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,24108,N,N,N,N,N,N,N,N,N,N,N,N,N,N,28730,28209,N,N,28210,N,N,N,30285,\r
+N,N,N,N,N,N,N,N,N,N,N,N,28242,N,22086,N,N,N,N,N,24677,N,N,29499,N,25953,N,N,N,\r
+N,N,N,N,N,N,N,25675,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,22307,N,N,23362,\r
+N,N,N,N,19070,N,N,N,N,N,N,20303,12321,12322,33089,33090,12323,33091,33092,\r
+12324,12325,12326,12327,33093,33094,33095,33096,33097,12328,12329,12330,12331,\r
+12332,12333,12334,12335,33098,12336,12337,12338,12339,12340,33099,33100,12341,\r
+33101,33102,33103,12342,33104,33105,33106,33107,33108,33109,33110,12343,12344,\r
+33111,12345,12346,12347,33112,33113,33114,33121,33122,33123,12348,12349,33124,\r
+33125,12350,33126,33127,33128,12351,33129,33130,33131,33132,33133,33134,33135,\r
+33136,33137,33138,12352,33139,12353,33140,33141,33142,33143,33144,33145,12354,\r
+33146,33153,33154,12355,33155,33156,33157,12356,33158,33159,33160,33161,33162,\r
+33163,33164,33165,33166,33167,33168,33169,33170,33171,33172,33173,33174,33175,\r
+33176,12357,12358,33177,33178,12359,33179,33180,12360,12361,33181,12362,33182,\r
+33183,33184,33185,33186,12363,12364,33187,12365,12366,12367,12368,33188,33189,\r
+12369,12370,12371,12372,33190,33191,33192,12373,33193,33194,33195,12374,33196,\r
+33197,33198,33199,33200,33201,33202,12375,12376,33203,12377,12378,12379,33204,\r
+33205,33206,33207,33208,33209,12380,12381,12382,33210,12383,33211,33212,12384,\r
+12385,33213,33214,33215,33216,33217,33218,33219,12386,12387,33220,12388,12389,\r
+12390,33221,33222,33223,12391,33224,33225,12392,33226,33227,33228,12393,33229,\r
+33230,33231,12394,33232,33233,33234,33235,33236,33237,33238,33239,12395,33240,\r
+12396,33241,33242,33243,33244,33245,33246,33247,33248,12397,12398,33249,33250,\r
+12399,33251,33252,12400,12401,33253,12402,33254,12403,33255,33256,12404,12405,\r
+12406,33257,12407,33258,12408,12409,33259,33260,33261,33262,33263,12410,12411,\r
+33264,33265,12412,33266,33267,33268,12413,33269,12414,33270,33271,33272,33273,\r
+33274,12577,12578,33275,12579,33276,12580,33277,33278,33345,33346,33347,33348,\r
+12581,33349,33350,33351,12582,33352,33353,33354,12583,33355,33356,33357,33358,\r
+33359,33360,33361,33362,12584,33363,33364,12585,12586,33365,33366,33367,33368,\r
+33369,33370,12587,12588,33377,33378,12589,33379,33380,33381,12590,33382,33383,\r
+33384,33385,33386,33387,33388,12591,12592,33389,12593,33390,12594,33391,33392,\r
+33393,33394,33395,33396,12595,33397,33398,33399,12596,33400,33401,33402,12597,\r
+33409,33410,33411,33412,33413,33414,33415,33416,12598,33417,12599,33418,33419,\r
+33420,33421,33422,33423,33424,33425,12600,12601,33426,33427,12602,33428,33429,\r
+12603,12604,12605,12606,33430,33431,33432,33433,12607,12608,12609,33434,12610,\r
+33435,12611,12612,33436,33437,33438,33439,33440,12613,12614,33441,33442,12615,\r
+33443,33444,33445,12616,33446,33447,33448,33449,33450,33451,33452,33453,33454,\r
+33455,33456,12617,12618,33457,33458,33459,33460,33461,33462,12619,33463,33464,\r
+33465,33466,33467,33468,33469,33470,33471,33472,33473,33474,33475,33476,33477,\r
+33478,33479,33480,12620,33481,33482,33483,33484,33485,33486,33487,33488,12621,\r
+12622,33489,33490,12623,33491,33492,33493,12624,33494,33495,33496,33497,33498,\r
+33499,33500,12625,12626,33501,12627,33502,33503,33504,33505,33506,33507,33508,\r
+33509,12628,33510,33511,33512,12629,33513,33514,33515,12630,33516,33517,33518,\r
+33519,33520,33521,33522,33523,33524,33525,33526,33527,33528,33529,33530,33531,\r
+33532,33533,33534,12631,12632,33601,33602,12633,33603,33604,12634,12635,12636,\r
+33605,33606,33607,33608,33609,33610,12637,12638,33611,12639,33612,12640,33613,\r
+33614,33615,33616,33617,33618,12641,33619,33620,33621,33622,33623,33624,33625,\r
+33626,33633,33634,33635,33636,33637,33638,33639,33640,33641,33642,33643,33644,\r
+33645,33646,33647,33648,33649,33650,33651,12642,12643,33652,33653,12644,33654,\r
+33655,12645,12646,33656,12647,33657,33658,33665,33666,33667,12648,12649,33668,\r
+12650,33669,12651,12652,33670,33671,33672,12653,33673,12654,12655,12656,33674,\r
+12657,33675,33676,33677,12658,33678,12659,33679,33680,33681,33682,33683,12660,\r
+12661,33684,12662,12663,12664,33685,33686,33687,12665,33688,33689,12666,12667,\r
+33690,33691,12668,33692,33693,33694,12669,33695,33696,33697,33698,33699,33700,\r
+33701,12670,12833,33702,12834,12835,12836,33703,33704,33705,33706,33707,33708,\r
+12837,12838,33709,33710,33711,33712,33713,33714,12839,33715,33716,33717,33718,\r
+33719,33720,33721,33722,33723,33724,33725,33726,33727,33728,33729,33730,33731,\r
+33732,33733,33734,33735,33736,33737,33738,33739,33740,33741,33742,33743,33744,\r
+33745,33746,33747,33748,33749,33750,33751,33752,33753,33754,33755,33756,33757,\r
+33758,33759,33760,33761,12840,12841,12842,33762,12843,33763,33764,33765,12844,\r
+33766,33767,33768,33769,33770,33771,33772,12845,12846,33773,12847,12848,12849,\r
+33774,33775,33776,33777,33778,33779,12850,12851,33780,33781,12852,33782,33783,\r
+33784,33785,33786,33787,33788,33789,33790,33857,33858,12853,33859,33860,12854,\r
+33861,12855,33862,33863,33864,33865,33866,33867,12856,33868,33869,33870,12857,\r
+33871,33872,33873,12858,33874,33875,33876,33877,33878,33879,33880,33881,33882,\r
+33889,12859,12860,33890,33891,33892,33893,12861,33894,33895,12862,33896,33897,\r
+33898,33899,33900,33901,33902,33903,33904,33905,33906,33907,33908,33909,33910,\r
+33911,33912,33913,33914,33921,33922,33923,33924,33925,33926,33927,33928,12863,\r
+12864,33929,33930,12865,33931,12866,33932,12867,33933,33934,33935,33936,33937,\r
+33938,33939,12868,12869,33940,12870,33941,12871,12872,12873,33942,33943,33944,\r
+33945,12874,12875,33946,33947,33948,33949,33950,33951,12876,33952,33953,33954,\r
+33955,33956,33957,33958,33959,33960,33961,33962,12877,12878,33963,33964,33965,\r
+33966,33967,33968,12879,12880,33969,33970,33971,33972,33973,33974,33975,33976,\r
+33977,33978,33979,33980,33981,33982,33983,33984,33985,33986,33987,12881,33988,\r
+33989,33990,33991,33992,33993,12882,33994,33995,33996,12883,33997,33998,33999,\r
+12884,34000,34001,34002,34003,34004,34005,34006,12885,12886,34007,34008,34009,\r
+12887,34010,34011,34012,34013,34014,34015,12888,34016,34017,34018,34019,34020,\r
+34021,34022,34023,34024,34025,34026,34027,34028,34029,34030,34031,34032,34033,\r
+34034,34035,34036,34037,34038,34039,34040,34041,34042,12889,12890,34043,34044,\r
+12891,34045,34046,34113,12892,34114,34115,34116,34117,34118,34119,12893,12894,\r
+12895,34120,12896,34121,12897,12898,34122,34123,34124,34125,34126,12899,34127,\r
+34128,34129,34130,34131,34132,34133,12900,34134,34135,34136,34137,34138,34145,\r
+34146,34147,34148,34149,34150,12901,12902,34151,34152,34153,34154,34155,34156,\r
+12903,12904,34157,34158,12905,34159,34160,34161,12906,34162,34163,34164,34165,\r
+34166,34167,34168,12907,12908,34169,34170,12909,34177,34178,34179,34180,34181,\r
+34182,34183,12910,34184,34185,34186,12911,34187,34188,34189,12912,34190,34191,\r
+34192,34193,34194,34195,34196,12913,12914,34197,34198,34199,34200,34201,34202,\r
+34203,34204,34205,34206,12915,34207,34208,34209,34210,34211,34212,34213,34214,\r
+34215,34216,34217,34218,34219,34220,34221,34222,34223,34224,34225,34226,34227,\r
+34228,34229,34230,34231,34232,34233,12916,12917,34234,34235,12918,34236,12919,\r
+34237,12920,34238,12921,34239,34240,34241,34242,12922,12923,12924,34243,12925,\r
+34244,12926,34245,34246,34247,13089,34248,34249,34250,34251,34252,34253,34254,\r
+34255,34256,34257,34258,34259,34260,34261,34262,34263,34264,34265,34266,34267,\r
+34268,34269,34270,34271,34272,34273,34274,34275,34276,34277,13090,13091,34278,\r
+34279,13092,34280,34281,34282,13093,34283,34284,34285,34286,34287,34288,34289,\r
+13094,13095,34290,13096,34291,13097,34292,34293,34294,34295,34296,34297,13098,\r
+13099,13100,34298,13101,34299,34300,13102,13103,13104,13105,34301,34302,34369,\r
+34370,34371,13106,13107,34372,13108,13109,13110,13111,13112,34373,13113,34374,\r
+13114,13115,13116,34375,34376,13117,34377,34378,34379,13118,34380,34381,34382,\r
+34383,34384,34385,34386,13119,13120,34387,13121,13122,13123,34388,34389,34390,\r
+34391,34392,34393,13124,13125,34394,34401,13126,34402,34403,34404,13127,34405,\r
+34406,34407,34408,34409,34410,34411,13128,34412,34413,34414,34415,13129,34416,\r
+34417,34418,34419,34420,34421,34422,34423,34424,34425,34426,34433,34434,34435,\r
+34436,34437,34438,34439,34440,34441,34442,34443,34444,34445,34446,34447,34448,\r
+34449,34450,34451,34452,34453,34454,34455,13130,13131,34456,13132,13133,34457,\r
+34458,34459,13134,34460,13135,13136,34461,34462,34463,34464,13137,13138,34465,\r
+13139,13140,13141,34466,34467,34468,34469,34470,13142,13143,13144,34471,34472,\r
+13145,34473,34474,34475,13146,34476,34477,34478,34479,34480,34481,34482,13147,\r
+13148,34483,13149,13150,13151,34484,34485,34486,34487,34488,34489,13152,13153,\r
+34490,34491,13154,34492,34493,34494,13155,34495,34496,34497,34498,34499,34500,\r
+34501,13156,13157,34502,34503,13158,13159,34504,34505,13160,34506,34507,34508,\r
+13161,34509,34510,34511,13162,34512,34513,34514,34515,34516,34517,34518,34519,\r
+34520,34521,34522,34523,34524,34525,34526,34527,34528,34529,34530,34531,34532,\r
+34533,34534,13163,13164,34535,34536,13165,34537,34538,34539,13166,34540,13167,\r
+34541,34542,34543,34544,34545,13168,13169,34546,13170,34547,13171,34548,34549,\r
+34550,34551,13172,13173,13174,34552,34553,34554,13175,34555,34556,34557,13176,\r
+34558,34625,34626,34627,34628,34629,34630,34631,34632,34633,34634,13177,34635,\r
+34636,34637,34638,34639,34640,34641,34642,34643,34644,34645,34646,34647,34648,\r
+34649,34650,34657,34658,34659,34660,34661,34662,34663,34664,34665,34666,34667,\r
+34668,34669,34670,34671,34672,34673,34674,34675,13178,34676,34677,34678,13179,\r
+34679,34680,34681,13180,34682,34689,34690,34691,34692,34693,34694,13181,13182,\r
+34695,13345,34696,34697,34698,34699,34700,34701,34702,34703,13346,13347,34704,\r
+34705,13348,34706,34707,34708,13349,34709,34710,34711,34712,34713,34714,34715,\r
+34716,13350,34717,13351,34718,13352,34719,34720,34721,34722,34723,34724,13353,\r
+13354,34725,34726,13355,34727,34728,13356,13357,34729,34730,34731,34732,34733,\r
+34734,34735,13358,13359,34736,13360,34737,13361,34738,34739,34740,34741,34742,\r
+34743,13362,34744,34745,34746,34747,34748,34749,34750,34751,34752,34753,34754,\r
+34755,34756,34757,34758,34759,34760,34761,34762,13363,34763,34764,34765,34766,\r
+34767,34768,34769,13364,34770,34771,34772,34773,34774,34775,34776,34777,34778,\r
+34779,34780,34781,34782,34783,34784,34785,34786,34787,34788,34789,34790,34791,\r
+34792,34793,34794,34795,34796,13365,34797,34798,34799,13366,34800,34801,34802,\r
+13367,34803,34804,34805,34806,34807,34808,34809,13368,13369,34810,34811,34812,\r
+34813,34814,34881,34882,34883,34884,34885,13370,13371,34886,34887,34888,34889,\r
+34890,34891,13372,34892,34893,34894,34895,34896,34897,34898,13373,13374,34899,\r
+34900,34901,13375,34902,34903,34904,34905,34906,34913,13376,13377,34914,34915,\r
+13378,34916,34917,34918,13379,13380,13381,34919,34920,34921,34922,34923,13382,\r
+13383,34924,13384,34925,13385,13386,34926,34927,34928,13387,34929,13388,34930,\r
+34931,34932,13389,34933,34934,34935,13390,34936,34937,34938,34945,34946,34947,\r
+34948,34949,34950,34951,34952,34953,34954,34955,34956,34957,34958,34959,34960,\r
+13391,13392,34961,34962,13393,34963,34964,34965,13394,34966,13395,34967,34968,\r
+34969,34970,34971,13396,13397,34972,13398,34973,13399,34974,34975,34976,34977,\r
+13400,34978,13401,13402,13403,34979,13404,34980,34981,13405,13406,13407,13408,\r
+13409,34982,34983,34984,13410,13411,13412,34985,13413,13414,13415,13416,13417,\r
+34986,34987,34988,13418,13419,13420,34989,34990,13421,34991,34992,34993,13422,\r
+34994,34995,34996,34997,34998,34999,35000,13423,13424,35001,13425,13426,13427,\r
+35002,35003,35004,35005,35006,35007,13428,35008,35009,35010,35011,35012,35013,\r
+35014,35015,35016,35017,35018,35019,35020,35021,35022,35023,35024,35025,35026,\r
+35027,35028,35029,35030,35031,35032,35033,35034,35035,35036,35037,35038,35039,\r
+35040,35041,35042,35043,35044,35045,35046,35047,35048,35049,35050,35051,35052,\r
+35053,35054,35055,35056,35057,35058,35059,35060,35061,35062,13429,13430,13431,\r
+35063,13432,35064,35065,13433,13434,35066,13435,13436,35067,35068,35069,35070,\r
+13437,13438,35137,13601,35138,13602,35139,13603,35140,35141,13604,35142,13605,\r
+13606,35143,35144,13607,35145,35146,35147,13608,35148,35149,35150,35151,35152,\r
+35153,35154,13609,13610,35155,13611,13612,13613,35156,35157,35158,35159,35160,\r
+35161,13614,35162,35169,35170,13615,35171,35172,35173,13616,35174,35175,35176,\r
+35177,35178,35179,35180,35181,35182,35183,35184,13617,13618,35185,35186,35187,\r
+35188,35189,35190,13619,35191,35192,35193,13620,35194,35201,35202,35203,35204,\r
+35205,35206,35207,35208,35209,35210,35211,35212,35213,35214,35215,35216,35217,\r
+35218,35219,35220,35221,35222,13621,13622,35223,35224,13623,35225,35226,13624,\r
+13625,35227,13626,35228,13627,35229,35230,35231,13628,13629,35232,13630,35233,\r
+13631,35234,13632,35235,13633,35236,35237,13634,35238,35239,35240,13635,35241,\r
+35242,35243,13636,35244,35245,35246,35247,35248,35249,35250,35251,35252,35253,\r
+35254,35255,35256,35257,35258,35259,35260,35261,35262,13637,35263,35264,35265,\r
+35266,35267,35268,35269,35270,35271,35272,35273,35274,35275,35276,35277,35278,\r
+35279,35280,35281,13638,35282,35283,35284,35285,35286,35287,35288,13639,35289,\r
+35290,35291,13640,35292,35293,35294,13641,35295,35296,35297,35298,35299,35300,\r
+35301,13642,13643,35302,13644,35303,35304,35305,35306,35307,35308,35309,35310,\r
+13645,35311,35312,35313,35314,35315,35316,35317,35318,35319,35320,35321,35322,\r
+35323,35324,35325,35326,35393,35394,35395,35396,35397,35398,35399,35400,35401,\r
+35402,35403,13646,13647,35404,35405,13648,35406,35407,35408,13649,35409,35410,\r
+35411,35412,35413,35414,35415,13650,13651,35416,13652,35417,13653,35418,35425,\r
+35426,35427,35428,35429,13654,35430,35431,35432,35433,35434,35435,35436,35437,\r
+35438,35439,35440,35441,35442,35443,35444,35445,35446,35447,35448,13655,35449,\r
+35450,35457,35458,35459,35460,35461,13656,35462,35463,35464,35465,35466,35467,\r
+35468,35469,35470,35471,35472,35473,35474,35475,35476,35477,35478,35479,35480,\r
+35481,13657,35482,35483,35484,35485,35486,35487,13658,35488,35489,35490,13659,\r
+35491,35492,35493,13660,35494,35495,35496,35497,35498,35499,35500,35501,13661,\r
+35502,13662,35503,13663,35504,35505,35506,35507,35508,35509,13664,35510,35511,\r
+35512,13665,35513,35514,35515,13666,35516,35517,35518,35519,35520,35521,35522,\r
+13667,35523,35524,35525,35526,13668,35527,35528,35529,35530,35531,35532,13669,\r
+13670,35533,35534,13671,35535,35536,13672,13673,35537,13674,35538,35539,35540,\r
+35541,35542,13675,13676,35543,13677,35544,13678,35545,35546,35547,35548,35549,\r
+35550,13679,35551,35552,35553,35554,35555,35556,35557,35558,35559,35560,35561,\r
+35562,35563,35564,35565,35566,35567,35568,35569,35570,35571,35572,35573,35574,\r
+35575,35576,35577,13680,13681,35578,35579,13682,35580,35581,13683,13684,35582,\r
+35649,35650,35651,35652,35653,35654,13685,13686,35655,13687,13688,13689,13690,\r
+35656,35657,35658,35659,35660,13691,13692,35661,35662,13693,35663,35664,35665,\r
+13694,35666,35667,35668,35669,35670,35671,35672,13857,13858,35673,13859,13860,\r
+13861,35674,35681,35682,35683,35684,13862,13863,13864,35685,35686,13865,35687,\r
+35688,35689,13866,35690,35691,35692,35693,35694,35695,35696,13867,13868,35697,\r
+13869,13870,13871,35698,35699,35700,35701,35702,35703,35704,35705,35706,35713,\r
+35714,35715,35716,35717,35718,35719,35720,35721,35722,35723,35724,35725,35726,\r
+35727,35728,35729,35730,35731,35732,35733,35734,35735,35736,35737,35738,35739,\r
+35740,35741,35742,35743,35744,35745,35746,35747,35748,35749,35750,35751,35752,\r
+35753,35754,35755,35756,35757,35758,35759,35760,35761,35762,35763,35764,35765,\r
+13872,13873,35766,35767,13874,35768,35769,35770,13875,35771,13876,13877,35772,\r
+35773,35774,35775,13878,13879,35776,13880,13881,13882,35777,35778,35779,35780,\r
+35781,13883,13884,13885,35782,35783,13886,35784,35785,35786,13887,35787,35788,\r
+35789,35790,35791,35792,35793,13888,13889,35794,13890,13891,13892,35795,35796,\r
+35797,35798,35799,35800,13893,35801,35802,35803,35804,35805,35806,35807,35808,\r
+35809,35810,35811,35812,35813,35814,35815,35816,35817,35818,35819,13894,35820,\r
+35821,35822,35823,35824,35825,35826,35827,35828,35829,35830,35831,35832,35833,\r
+35834,35835,35836,35837,35838,35905,35906,35907,35908,35909,35910,35911,35912,\r
+35913,35914,35915,35916,35917,35918,35919,35920,13895,13896,35921,35922,13897,\r
+35923,35924,35925,13898,35926,35927,35928,35929,35930,35937,35938,35939,35940,\r
+35941,35942,35943,13899,35944,35945,35946,35947,35948,35949,13900,35950,35951,\r
+35952,35953,35954,35955,35956,13901,35957,35958,35959,35960,35961,35962,35969,\r
+35970,35971,35972,35973,35974,35975,35976,35977,35978,35979,35980,35981,13902,\r
+35982,35983,35984,35985,35986,35987,35988,35989,35990,35991,35992,35993,35994,\r
+35995,35996,35997,35998,35999,36000,36001,36002,36003,36004,36005,36006,36007,\r
+36008,13903,36009,36010,36011,13904,36012,36013,36014,36015,36016,36017,36018,\r
+36019,36020,36021,36022,36023,36024,36025,36026,36027,36028,36029,36030,36031,\r
+36032,36033,36034,36035,36036,36037,36038,36039,36040,36041,36042,36043,36044,\r
+36045,36046,36047,36048,36049,36050,36051,36052,36053,36054,36055,36056,36057,\r
+36058,36059,36060,36061,36062,13905,13906,36063,36064,13907,36065,36066,36067,\r
+13908,36068,36069,36070,36071,36072,36073,13909,13910,36074,36075,36076,36077,\r
+13911,36078,36079,36080,36081,36082,36083,36084,36085,36086,36087,36088,36089,\r
+36090,36091,36092,36093,36094,36161,36162,36163,36164,36165,36166,36167,36168,\r
+36169,36170,36171,36172,36173,36174,36175,36176,36177,13912,36178,36179,36180,\r
+36181,36182,36183,36184,36185,36186,36193,36194,36195,36196,36197,36198,36199,\r
+36200,36201,36202,36203,36204,36205,36206,36207,36208,36209,36210,13913,36211,\r
+36212,36213,13914,36214,36215,36216,13915,36217,36218,36225,36226,36227,36228,\r
+36229,13916,13917,36230,36231,36232,13918,36233,36234,36235,36236,36237,36238,\r
+36239,36240,36241,36242,36243,36244,36245,36246,36247,36248,36249,36250,36251,\r
+36252,36253,36254,36255,36256,36257,36258,36259,36260,36261,36262,36263,36264,\r
+36265,36266,13919,13920,36267,36268,13921,36269,36270,13922,13923,36271,36272,\r
+36273,36274,36275,36276,36277,13924,13925,36278,13926,36279,36280,36281,36282,\r
+36283,36284,36285,36286,13927,36287,36288,36289,13928,36290,36291,36292,13929,\r
+36293,36294,36295,36296,36297,36298,36299,13930,13931,36300,36301,36302,36303,\r
+36304,36305,36306,36307,36308,36309,13932,36310,36311,36312,13933,36313,36314,\r
+36315,13934,36316,36317,36318,36319,36320,36321,36322,13935,13936,36323,13937,\r
+36324,13938,36325,36326,36327,36328,36329,36330,13939,13940,36331,36332,13941,\r
+36333,36334,36335,13942,36336,36337,36338,36339,36340,36341,36342,13943,13944,\r
+36343,13945,13946,13947,13948,36344,36345,36346,13949,13950,14113,14114,36347,\r
+36348,14115,36349,36350,36417,14116,36418,36419,36420,36421,36422,36423,36424,\r
+14117,14118,36425,14119,14120,14121,36426,36427,36428,36429,36430,36431,14122,\r
+14123,36432,36433,14124,36434,36435,36436,36437,36438,36439,36440,36441,36442,\r
+36449,36450,36451,36452,36453,14125,36454,14126,36455,36456,36457,36458,36459,\r
+36460,36461,36462,36463,36464,36465,36466,36467,36468,36469,36470,36471,36472,\r
+36473,36474,36481,36482,36483,36484,36485,36486,36487,36488,36489,36490,36491,\r
+36492,36493,36494,14127,14128,36495,36496,14129,36497,36498,36499,14130,36500,\r
+36501,36502,36503,36504,36505,36506,14131,14132,36507,14133,14134,14135,36508,\r
+36509,36510,36511,36512,14136,14137,14138,36513,36514,14139,36515,36516,36517,\r
+14140,36518,36519,36520,36521,36522,36523,36524,14141,14142,36525,14143,36526,\r
+14144,36527,36528,36529,36530,36531,36532,14145,14146,36533,36534,14147,36535,\r
+36536,36537,14148,36538,36539,36540,36541,36542,36543,36544,14149,14150,36545,\r
+14151,14152,14153,36546,36547,36548,36549,36550,36551,14154,36552,36553,36554,\r
+14155,36555,36556,36557,36558,36559,36560,36561,36562,36563,36564,36565,36566,\r
+14156,36567,14157,36568,36569,36570,36571,36572,36573,36574,36575,14158,14159,\r
+36576,36577,14160,36578,36579,36580,14161,36581,36582,36583,36584,36585,36586,\r
+36587,14162,14163,36588,14164,36589,14165,36590,36591,36592,36593,36594,36595,\r
+14166,36596,36597,36598,14167,36599,36600,36601,36602,36603,36604,36605,36606,\r
+36673,36674,36675,36676,36677,36678,36679,36680,14168,36681,36682,36683,36684,\r
+36685,36686,36687,36688,36689,36690,36691,36692,36693,36694,36695,36696,36697,\r
+36698,36705,36706,36707,36708,36709,36710,36711,36712,14169,36713,36714,36715,\r
+36716,36717,36718,36719,14170,36720,36721,36722,14171,36723,36724,36725,14172,\r
+36726,36727,36728,36729,36730,36737,36738,14173,14174,36739,14175,36740,14176,\r
+36741,36742,36743,36744,36745,36746,14177,36747,36748,36749,14178,36750,36751,\r
+36752,14179,36753,36754,36755,36756,36757,36758,36759,36760,14180,36761,14181,\r
+36762,14182,36763,36764,36765,36766,36767,36768,14183,14184,36769,36770,14185,\r
+36771,36772,36773,14186,36774,36775,36776,36777,36778,36779,36780,14187,14188,\r
+36781,14189,36782,14190,36783,36784,36785,36786,36787,36788,14191,36789,36790,\r
+36791,36792,36793,36794,36795,36796,36797,36798,36799,36800,36801,36802,36803,\r
+36804,36805,36806,36807,14192,36808,36809,36810,36811,36812,36813,36814,14193,\r
+36815,36816,36817,36818,36819,36820,36821,36822,36823,36824,36825,36826,36827,\r
+36828,36829,36830,36831,36832,36833,36834,36835,36836,36837,36838,36839,36840,\r
+36841,14194,14195,36842,36843,14196,36844,36845,36846,14197,36847,36848,36849,\r
+36850,36851,36852,36853,14198,36854,36855,14199,36856,14200,36857,36858,36859,\r
+36860,36861,36862,14201,14202,36929,36930,14203,36931,36932,36933,14204,36934,\r
+36935,36936,36937,36938,36939,36940,14205,14206,36941,14369,36942,14370,36943,\r
+36944,36945,36946,36947,36948,14371,14372,36949,36950,14373,36951,36952,36953,\r
+14374,36954,36961,36962,36963,36964,36965,36966,14375,14376,36967,14377,36968,\r
+14378,14379,36969,36970,14380,14381,36971,36972,36973,36974,36975,36976,36977,\r
+36978,36979,36980,36981,36982,36983,36984,36985,36986,36993,36994,36995,36996,\r
+36997,36998,36999,37000,37001,37002,37003,37004,37005,14382,14383,37006,37007,\r
+14384,37008,37009,37010,14385,37011,37012,37013,37014,37015,37016,37017,14386,\r
+14387,37018,14388,37019,14389,37020,37021,37022,37023,37024,37025,14390,14391,\r
+37026,37027,14392,37028,14393,14394,14395,14396,14397,37029,37030,37031,37032,\r
+37033,14398,14399,37034,14400,37035,14401,14402,37036,37037,14403,37038,14404,\r
+14405,14406,37039,37040,14407,37041,37042,37043,14408,37044,37045,37046,37047,\r
+37048,37049,37050,14409,14410,37051,14411,14412,14413,14414,37052,37053,37054,\r
+37055,37056,14415,14416,37057,37058,37059,37060,37061,37062,14417,37063,37064,\r
+37065,37066,37067,37068,37069,37070,37071,37072,37073,37074,14418,37075,37076,\r
+37077,37078,37079,37080,37081,37082,37083,37084,37085,37086,37087,37088,37089,\r
+37090,37091,37092,37093,37094,37095,37096,37097,37098,37099,37100,37101,37102,\r
+37103,37104,37105,37106,37107,37108,14419,14420,37109,37110,14421,37111,37112,\r
+37113,14422,37114,14423,37115,37116,37117,37118,37185,14424,14425,37186,14426,\r
+37187,14427,14428,37188,37189,37190,37191,14429,14430,14431,37192,37193,14432,\r
+37194,37195,37196,14433,37197,37198,37199,37200,37201,37202,37203,14434,14435,\r
+37204,14436,14437,14438,37205,37206,37207,37208,37209,37210,14439,14440,37217,\r
+37218,14441,37219,37220,37221,14442,37222,37223,37224,37225,37226,37227,37228,\r
+37229,37230,37231,14443,14444,14445,37232,14446,37233,37234,37235,37236,14447,\r
+37237,37238,37239,37240,37241,37242,37249,37250,37251,37252,37253,37254,37255,\r
+37256,37257,37258,37259,37260,37261,37262,37263,37264,37265,37266,37267,37268,\r
+37269,14448,14449,37270,14450,14451,37271,37272,37273,14452,37274,14453,37275,\r
+37276,37277,37278,37279,14454,14455,37280,14456,37281,14457,37282,37283,37284,\r
+37285,37286,37287,14458,37288,37289,37290,14459,37291,37292,37293,37294,37295,\r
+37296,37297,37298,37299,37300,37301,37302,37303,37304,37305,14460,14461,37306,\r
+37307,37308,37309,37310,37311,37312,37313,37314,37315,37316,37317,37318,37319,\r
+37320,37321,37322,37323,37324,37325,37326,37327,37328,37329,37330,37331,37332,\r
+37333,37334,37335,37336,37337,37338,37339,14462,37340,37341,37342,14625,37343,\r
+37344,37345,14626,37346,37347,37348,37349,37350,37351,37352,37353,14627,37354,\r
+14628,37355,14629,37356,37357,37358,37359,37360,37361,14630,37362,37363,37364,\r
+14631,37365,37366,37367,14632,37368,37369,37370,37371,37372,37373,37374,37441,\r
+14633,37442,14634,37443,37444,37445,37446,37447,37448,37449,37450,14635,14636,\r
+14637,37451,14638,37452,37453,14639,14640,14641,14642,37454,37455,37456,37457,\r
+37458,14643,14644,37459,14645,37460,14646,37461,37462,37463,14647,37464,14648,\r
+14649,37465,37466,37473,14650,37474,37475,37476,14651,37477,37478,37479,37480,\r
+37481,37482,37483,37484,14652,37485,14653,37486,37487,37488,37489,37490,37491,\r
+37492,37493,14654,37494,37495,37496,37497,37498,37505,37506,37507,37508,37509,\r
+37510,37511,37512,37513,37514,37515,37516,37517,37518,37519,37520,37521,37522,\r
+37523,37524,37525,37526,14655,37527,37528,37529,14656,37530,37531,37532,14657,\r
+37533,37534,37535,37536,37537,37538,37539,37540,37541,37542,37543,37544,37545,\r
+37546,37547,37548,37549,37550,37551,14658,37552,37553,37554,14659,37555,37556,\r
+37557,14660,37558,37559,37560,37561,37562,37563,37564,14661,37565,37566,14662,\r
+37567,37568,37569,37570,37571,37572,37573,37574,14663,37575,37576,37577,14664,\r
+37578,37579,37580,14665,37581,37582,37583,37584,37585,37586,37587,14666,37588,\r
+37589,14667,37590,37591,37592,37593,37594,37595,37596,37597,37598,37599,37600,\r
+37601,37602,37603,37604,37605,37606,37607,37608,37609,37610,37611,37612,37613,\r
+37614,37615,37616,37617,37618,37619,37620,37621,37622,37623,37624,37625,14668,\r
+14669,37626,37627,14670,37628,37629,14671,14672,37630,14673,37697,37698,37699,\r
+37700,37701,14674,14675,37702,14676,14677,14678,37703,14679,37704,14680,37705,\r
+37706,14681,14682,14683,14684,14685,37707,37708,14686,14687,14688,14689,14690,\r
+37709,37710,37711,37712,14691,14692,37713,14693,37714,14694,37715,37716,37717,\r
+14695,37718,37719,14696,14697,37720,37721,14698,37722,37729,37730,14699,37731,\r
+37732,37733,37734,37735,37736,37737,14700,14701,37738,14702,14703,14704,37739,\r
+37740,37741,14705,37742,37743,14706,14707,37744,37745,14708,37746,37747,37748,\r
+37749,37750,37751,37752,37753,37754,37761,37762,37763,14709,37764,37765,37766,\r
+37767,37768,37769,37770,37771,37772,37773,37774,37775,37776,37777,37778,37779,\r
+37780,37781,37782,37783,37784,37785,37786,37787,37788,37789,37790,37791,37792,\r
+37793,37794,37795,37796,37797,37798,37799,37800,37801,14710,14711,37802,37803,\r
+14712,37804,37805,14713,14714,37806,14715,37807,37808,37809,37810,37811,14716,\r
+14717,37812,14718,37813,14881,14882,37814,37815,37816,37817,37818,14883,14884,\r
+37819,37820,14885,37821,37822,14886,14887,37823,37824,37825,37826,37827,37828,\r
+37829,14888,14889,37830,14890,14891,14892,37831,37832,37833,37834,37835,37836,\r
+14893,14894,37837,37838,14895,37839,37840,37841,14896,37842,37843,37844,37845,\r
+37846,37847,37848,37849,14897,37850,14898,14899,14900,37851,37852,37853,14901,\r
+37854,37855,14902,37856,37857,37858,14903,37859,37860,37861,37862,37863,37864,\r
+37865,37866,37867,37868,37869,37870,37871,37872,37873,37874,37875,37876,37877,\r
+37878,37879,37880,37881,14904,14905,14906,37882,14907,37883,37884,37885,14908,\r
+37886,37953,37954,37955,37956,37957,37958,14909,14910,37959,14911,37960,14912,\r
+37961,37962,37963,37964,37965,37966,14913,37967,37968,37969,14914,37970,37971,\r
+37972,37973,37974,37975,37976,37977,37978,37985,37986,37987,37988,37989,37990,\r
+14915,37991,37992,37993,37994,37995,37996,37997,14916,37998,37999,38000,38001,\r
+38002,38003,38004,38005,38006,38007,38008,38009,38010,38017,38018,38019,38020,\r
+38021,38022,14917,38023,38024,38025,38026,38027,38028,38029,14918,14919,38030,\r
+38031,14920,38032,38033,38034,14921,38035,38036,38037,38038,38039,38040,38041,\r
+14922,14923,38042,38043,38044,38045,38046,38047,38048,38049,38050,38051,14924,\r
+38052,38053,38054,14925,38055,38056,38057,38058,38059,38060,38061,38062,38063,\r
+38064,38065,38066,38067,38068,38069,38070,38071,38072,38073,38074,38075,38076,\r
+38077,14926,14927,38078,38079,14928,38080,38081,14929,14930,14931,14932,38082,\r
+38083,38084,38085,38086,14933,14934,38087,14935,38088,14936,38089,38090,38091,\r
+14937,14938,38092,14939,38093,38094,38095,38096,38097,38098,38099,14940,38100,\r
+38101,38102,38103,38104,38105,38106,38107,38108,38109,38110,14941,38111,38112,\r
+38113,38114,38115,38116,38117,14942,38118,38119,38120,38121,38122,38123,38124,\r
+38125,38126,38127,38128,38129,38130,38131,38132,38133,38134,38135,38136,38137,\r
+38138,38139,38140,38141,38142,38209,38210,14943,14944,38211,38212,14945,38213,\r
+38214,38215,14946,38216,38217,38218,38219,38220,38221,38222,38223,38224,38225,\r
+38226,38227,14947,38228,38229,38230,38231,38232,38233,14948,38234,38241,38242,\r
+14949,38243,38244,38245,14950,38246,38247,38248,38249,38250,38251,38252,14951,\r
+38253,38254,14952,38255,14953,38256,38257,38258,38259,38260,38261,14954,14955,\r
+38262,38263,14956,38264,38265,38266,14957,38273,38274,38275,38276,38277,38278,\r
+38279,14958,14959,38280,14960,38281,38282,38283,38284,38285,38286,38287,38288,\r
+38289,38290,38291,38292,38293,38294,38295,38296,38297,38298,38299,38300,38301,\r
+38302,38303,38304,38305,38306,38307,38308,38309,38310,38311,38312,38313,38314,\r
+38315,38316,14961,14962,38317,38318,14963,38319,38320,38321,14964,38322,14965,\r
+38323,38324,38325,38326,38327,14966,14967,38328,14968,38329,14969,14970,14971,\r
+38330,38331,38332,38333,14972,14973,38334,38335,14974,38336,38337,38338,15137,\r
+38339,15138,38340,38341,38342,38343,38344,15139,15140,38345,15141,15142,15143,\r
+38346,38347,38348,38349,38350,15144,15145,15146,38351,38352,15147,38353,38354,\r
+38355,15148,38356,38357,38358,38359,38360,38361,38362,15149,15150,38363,15151,\r
+15152,15153,38364,38365,38366,38367,38368,38369,15154,15155,38370,38371,38372,\r
+38373,38374,38375,38376,38377,38378,38379,38380,38381,38382,38383,15156,38384,\r
+38385,38386,38387,38388,38389,38390,38391,38392,38393,38394,38395,38396,38397,\r
+38398,38465,38466,38467,38468,38469,38470,38471,38472,38473,38474,38475,38476,\r
+38477,38478,38479,38480,38481,38482,38483,38484,38485,38486,38487,38488,15157,\r
+15158,38489,38490,15159,38497,38498,15160,15161,38499,38500,38501,38502,38503,\r
+38504,38505,15162,38506,38507,15163,15164,15165,38508,38509,38510,38511,38512,\r
+38513,15166,38514,38515,38516,38517,38518,38519,38520,38521,38522,38529,38530,\r
+38531,38532,38533,38534,38535,38536,38537,38538,38539,15167,38540,38541,38542,\r
+38543,38544,38545,15168,15169,38546,38547,38548,38549,38550,38551,38552,38553,\r
+38554,38555,38556,38557,38558,38559,15170,15171,38560,15172,15173,15174,38561,\r
+38562,38563,38564,38565,38566,38567,38568,38569,38570,38571,38572,38573,38574,\r
+38575,38576,38577,38578,38579,38580,38581,38582,38583,38584,38585,38586,38587,\r
+38588,38589,38590,38591,38592,38593,38594,15175,15176,38595,38596,15177,38597,\r
+38598,38599,15178,38600,38601,38602,38603,38604,38605,38606,15179,15180,38607,\r
+38608,38609,15181,38610,38611,38612,38613,38614,38615,38616,38617,38618,38619,\r
+38620,38621,38622,38623,38624,38625,38626,38627,38628,38629,38630,38631,38632,\r
+38633,38634,38635,38636,38637,38638,38639,38640,38641,38642,38643,38644,38645,\r
+38646,38647,38648,38649,38650,38651,38652,38653,38654,38721,38722,38723,38724,\r
+38725,38726,38727,38728,38729,38730,38731,38732,38733,38734,38735,38736,38737,\r
+15182,38738,38739,38740,38741,38742,38743,38744,38745,38746,38753,38754,38755,\r
+38756,38757,38758,38759,38760,38761,38762,38763,38764,38765,38766,38767,38768,\r
+38769,38770,15183,38771,38772,38773,38774,38775,38776,38777,38778,38785,38786,\r
+38787,38788,38789,38790,38791,38792,38793,38794,38795,38796,15184,38797,38798,\r
+38799,38800,38801,38802,15185,15186,38803,38804,15187,38805,38806,38807,15188,\r
+38808,38809,38810,38811,38812,38813,38814,15189,38815,38816,15190,38817,15191,\r
+38818,38819,38820,38821,38822,38823,38824,38825,38826,38827,38828,38829,38830,\r
+38831,38832,38833,38834,38835,38836,38837,38838,38839,38840,38841,38842,38843,\r
+38844,38845,38846,38847,38848,38849,38850,38851,38852,38853,38854,38855,38856,\r
+38857,38858,38859,38860,38861,38862,38863,38864,38865,38866,38867,38868,38869,\r
+38870,38871,38872,38873,38874,38875,38876,38877,38878,38879,38880,38881,38882,\r
+38883,38884,38885,38886,38887,38888,38889,38890,38891,38892,38893,38894,38895,\r
+38896,38897,38898,38899,38900,38901,38902,38903,38904,38905,38906,38907,15192,\r
+38908,38909,38910,38977,38978,38979,38980,38981,38982,38983,38984,38985,38986,\r
+38987,38988,38989,38990,38991,38992,38993,15193,38994,38995,38996,38997,38998,\r
+38999,15194,39000,39001,39002,15195,39009,39010,39011,15196,39012,39013,39014,\r
+39015,39016,39017,39018,15197,15198,39019,39020,39021,39022,39023,39024,39025,\r
+39026,39027,39028,39029,39030,39031,39032,39033,39034,39041,39042,39043,39044,\r
+39045,39046,39047,39048,39049,39050,39051,39052,39053,39054,39055,39056,39057,\r
+39058,39059,39060,39061,39062,15199,15200,39063,39064,15201,39065,39066,39067,\r
+15202,39068,39069,39070,39071,39072,39073,39074,15203,15204,39075,15205,39076,\r
+15206,39077,39078,39079,39080,39081,39082,15207,15208,39083,15209,15210,39084,\r
+39085,15211,15212,15213,15214,39086,39087,39088,39089,39090,15215,15216,39091,\r
+15217,15218,15219,39092,39093,39094,15220,39095,39096,15221,15222,39097,39098,\r
+15223,39099,39100,39101,15224,39102,39103,39104,39105,39106,39107,39108,15225,\r
+15226,39109,15227,15228,15229,39110,39111,39112,39113,39114,39115,15230,15393,\r
+39116,39117,15394,39118,39119,39120,15395,39121,39122,39123,39124,39125,39126,\r
+39127,15396,15397,39128,15398,39129,15399,39130,39131,39132,39133,39134,39135,\r
+15400,39136,39137,39138,15401,39139,39140,39141,15402,39142,39143,39144,39145,\r
+39146,39147,39148,15403,39149,39150,39151,39152,15404,39153,39154,39155,39156,\r
+39157,39158,15405,15406,15407,15408,15409,39159,39160,15410,15411,39161,15412,\r
+15413,39162,39163,39164,39165,15414,15415,39166,15416,15417,15418,39233,39234,\r
+39235,39236,15419,39237,15420,15421,39238,39239,15422,39240,39241,39242,15423,\r
+39243,39244,39245,39246,39247,39248,39249,15424,15425,39250,15426,15427,15428,\r
+39251,39252,39253,39254,39255,39256,15429,15430,39257,39258,15431,39265,39266,\r
+39267,15432,39268,39269,39270,39271,39272,39273,39274,15433,15434,39275,15435,\r
+15436,15437,39276,39277,39278,39279,39280,39281,15438,39282,39283,39284,15439,\r
+39285,39286,39287,15440,39288,39289,39290,39297,39298,39299,39300,39301,39302,\r
+39303,39304,39305,15441,39306,39307,39308,39309,39310,39311,15442,15443,15444,\r
+39312,15445,39313,39314,39315,15446,39316,15447,39317,39318,39319,39320,39321,\r
+15448,15449,39322,15450,39323,15451,39324,39325,39326,15452,39327,39328,15453,\r
+15454,39329,39330,15455,39331,39332,39333,15456,39334,39335,39336,39337,39338,\r
+39339,39340,39341,39342,39343,39344,39345,15457,39346,39347,39348,39349,39350,\r
+39351,15458,39352,39353,39354,15459,39355,39356,39357,15460,39358,39359,39360,\r
+39361,39362,39363,39364,15461,39365,39366,15462,15463,39367,39368,39369,39370,\r
+39371,39372,39373,15464,39374,39375,39376,15465,39377,39378,39379,15466,39380,\r
+39381,39382,39383,39384,39385,39386,15467,15468,39387,15469,39388,39389,39390,\r
+39391,39392,39393,39394,39395,15470,15471,39396,39397,15472,39398,39399,39400,\r
+15473,39401,39402,39403,39404,39405,39406,39407,15474,15475,39408,15476,39409,\r
+15477,39410,39411,39412,39413,39414,39415,15478,15479,39416,39417,15480,39418,\r
+39419,15481,15482,39420,39421,39422,39489,39490,39491,39492,15483,15484,39493,\r
+15485,39494,15486,39495,15649,39496,15650,15651,39497,15652,39498,39499,39500,\r
+39501,39502,39503,39504,39505,39506,39507,39508,39509,39510,39511,39512,39513,\r
+39514,39521,39522,15653,39523,39524,39525,39526,39527,39528,39529,15654,15655,\r
+39530,39531,15656,39532,39533,39534,15657,39535,39536,39537,39538,39539,39540,\r
+39541,15658,39542,39543,39544,39545,15659,39546,39553,39554,39555,39556,39557,\r
+15660,15661,39558,39559,15662,39560,39561,39562,15663,39563,39564,39565,39566,\r
+39567,39568,39569,15664,15665,39570,15666,39571,15667,39572,39573,39574,39575,\r
+39576,39577,15668,15669,39578,39579,39580,39581,39582,39583,15670,39584,39585,\r
+39586,39587,39588,39589,39590,15671,39591,39592,15672,39593,15673,39594,39595,\r
+39596,39597,39598,39599,15674,15675,39600,39601,15676,39602,39603,39604,15677,\r
+15678,39605,39606,39607,39608,39609,39610,15679,15680,39611,15681,39612,15682,\r
+39613,39614,39615,39616,39617,39618,39619,39620,39621,39622,39623,39624,39625,\r
+39626,39627,39628,39629,39630,39631,39632,39633,39634,39635,39636,39637,39638,\r
+39639,39640,39641,39642,39643,39644,39645,39646,15683,15684,39647,39648,15685,\r
+39649,39650,15686,15687,39651,39652,39653,39654,39655,39656,15688,15689,15690,\r
+39657,15691,39658,15692,39659,39660,39661,39662,15693,39663,15694,15695,39664,\r
+15696,15697,39665,39666,39667,15698,39668,39669,39670,39671,39672,39673,39674,\r
+15699,15700,39675,39676,15701,15702,39677,39678,39745,39746,39747,15703,15704,\r
+15705,39748,39749,15706,39750,39751,39752,15707,39753,39754,39755,39756,39757,\r
+39758,39759,15708,15709,39760,39761,15710,15711,39762,39763,39764,39765,39766,\r
+39767,39768,39769,39770,39777,39778,39779,39780,39781,39782,39783,39784,39785,\r
+39786,39787,39788,39789,39790,39791,39792,39793,39794,15712,39795,39796,39797,\r
+39798,39799,39800,39801,39802,39809,39810,39811,39812,39813,39814,39815,39816,\r
+39817,39818,39819,39820,39821,39822,39823,39824,39825,39826,39827,39828,39829,\r
+39830,39831,39832,39833,39834,15713,15714,39835,39836,15715,39837,39838,39839,\r
+15716,39840,15717,39841,39842,39843,39844,39845,15718,15719,39846,39847,15720,\r
+15721,39848,39849,39850,39851,39852,39853,15722,39854,39855,39856,15723,39857,\r
+39858,39859,15724,39860,39861,39862,39863,39864,39865,39866,39867,39868,39869,\r
+39870,39871,39872,39873,39874,39875,39876,39877,39878,39879,39880,39881,39882,\r
+39883,39884,39885,39886,39887,39888,39889,39890,39891,39892,39893,39894,39895,\r
+39896,39897,39898,39899,39900,39901,39902,39903,39904,39905,39906,39907,39908,\r
+39909,39910,15725,39911,39912,39913,39914,39915,39916,39917,39918,39919,39920,\r
+39921,39922,39923,39924,39925,39926,39927,39928,39929,39930,39931,39932,39933,\r
+15726,15727,39934,40001,15728,40002,40003,15729,15730,40004,15731,40005,40006,\r
+40007,40008,40009,15732,15733,40010,40011,40012,15734,40013,40014,40015,40016,\r
+40017,40018,15735,15736,40019,40020,15737,40021,40022,40023,40024,40025,40026,\r
+40033,40034,40035,40036,40037,40038,40039,40040,40041,15738,40042,40043,40044,\r
+40045,40046,40047,40048,15739,40049,40050,40051,40052,40053,40054,40055,40056,\r
+40057,40058,40065,40066,40067,40068,40069,40070,40071,40072,40073,15740,40074,\r
+40075,40076,40077,40078,40079,40080,15741,40081,40082,40083,15742,40084,40085,\r
+40086,15905,40087,40088,40089,40090,40091,40092,40093,15906,15907,40094,40095,\r
+40096,40097,40098,40099,40100,40101,40102,40103,15908,40104,40105,40106,40107,\r
+40108,40109,40110,40111,40112,40113,40114,40115,40116,40117,40118,40119,40120,\r
+40121,40122,40123,40124,40125,40126,40127,40128,40129,40130,15909,15910,40131,\r
+40132,15911,40133,40134,40135,15912,40136,40137,40138,40139,40140,40141,40142,\r
+15913,15914,40143,40144,40145,15915,40146,40147,40148,40149,40150,40151,15916,\r
+40152,40153,40154,40155,40156,40157,40158,40159,40160,40161,40162,40163,40164,\r
+40165,40166,40167,40168,40169,40170,15917,40171,40172,40173,40174,40175,40176,\r
+40177,15918,40178,40179,40180,40181,40182,40183,40184,40185,40186,40187,40188,\r
+40189,40190,40257,40258,40259,40260,40261,40262,40263,40264,40265,40266,40267,\r
+40268,40269,40270,15919,40271,40272,40273,15920,40274,40275,40276,40277,40278,\r
+40279,40280,40281,40282,40289,40290,40291,40292,40293,40294,40295,40296,40297,\r
+40298,40299,40300,40301,40302,40303,40304,40305,40306,40307,40308,40309,40310,\r
+40311,40312,40313,40314,40321,40322,40323,40324,40325,40326,40327,40328,40329,\r
+15921,40330,40331,40332,40333,40334,40335,15922,15923,40336,40337,15924,40338,\r
+40339,40340,15925,40341,15926,40342,40343,40344,40345,15927,15928,15929,40346,\r
+40347,40348,40349,40350,40351,40352,40353,40354,40355,15930,40356,40357,40358,\r
+15931,40359,40360,40361,15932,40362,40363,40364,40365,40366,40367,40368,15933,\r
+40369,40370,40371,40372,40373,40374,40375,40376,40377,40378,40379,15934,15935,\r
+40380,40381,15936,40382,40383,40384,15937,40385,40386,40387,40388,40389,40390,\r
+40391,15938,15939,40392,15940,40393,15941,40394,40395,40396,40397,40398,40399,\r
+15942,15943,40400,40401,15944,15945,15946,40402,15947,15948,15949,40403,40404,\r
+40405,40406,15950,15951,15952,40407,15953,15954,15955,40408,40409,40410,15956,\r
+15957,40411,15958,15959,40412,40413,15960,40414,40415,40416,15961,40417,40418,\r
+40419,40420,40421,40422,40423,15962,15963,40424,15964,15965,15966,40425,40426,\r
+40427,40428,40429,40430,15967,15968,40431,40432,15969,40433,40434,40435,15970,\r
+40436,40437,15971,40438,40439,40440,40441,15972,15973,40442,15974,40443,15975,\r
+40444,40445,40446,15976,40513,15977,15978,40514,40515,40516,15979,40517,40518,\r
+40519,15980,40520,40521,40522,40523,40524,40525,40526,40527,15981,40528,40529,\r
+40530,40531,40532,40533,40534,40535,40536,40537,15982,15983,40538,40545,15984,\r
+15985,40546,15986,15987,15988,15989,40547,40548,40549,40550,40551,15990,15991,\r
+15992,15993,15994,15995,15996,40552,15997,40553,15998,40554,16161,16162,40555,\r
+40556,16163,40557,40558,40559,16164,40560,40561,40562,40563,40564,40565,40566,\r
+16165,16166,40567,16167,40568,16168,40569,40570,40577,40578,40579,40580,16169,\r
+16170,16171,40581,16172,40582,40583,40584,16173,40585,16174,16175,40586,40587,\r
+40588,40589,16176,16177,16178,16179,16180,16181,40590,40591,40592,16182,16183,\r
+16184,16185,40593,40594,40595,16186,40596,40597,40598,16187,40599,40600,40601,\r
+40602,40603,40604,40605,16188,16189,40606,16190,16191,40607,40608,40609,40610,\r
+40611,40612,40613,16192,16193,40614,40615,16194,40616,40617,40618,16195,16196,\r
+16197,40619,16198,40620,40621,16199,16200,16201,40622,16202,40623,16203,40624,\r
+16204,40625,40626,40627,40628,16205,16206,40629,40630,16207,40631,40632,40633,\r
+16208,40634,40635,40636,40637,40638,40639,40640,16209,16210,40641,16211,16212,\r
+16213,40642,40643,40644,40645,40646,40647,16214,16215,40648,40649,16216,40650,\r
+40651,40652,40653,40654,40655,40656,40657,40658,40659,40660,16217,40661,40662,\r
+16218,40663,16219,40664,40665,40666,40667,40668,40669,16220,16221,40670,40671,\r
+16222,40672,40673,40674,16223,40675,40676,40677,40678,40679,40680,40681,16224,\r
+16225,40682,16226,40683,16227,40684,40685,40686,40687,40688,40689,16228,16229,\r
+40690,40691,16230,40692,40693,40694,16231,40695,40696,40697,40698,40699,40700,\r
+40701,16232,16233,40702,16234,40769,16235,40770,40771,40772,40773,40774,40775,\r
+16236,16237,40776,40777,16238,40778,40779,40780,16239,16240,16241,40781,40782,\r
+40783,40784,40785,16242,16243,40786,16244,40787,16245,40788,40789,40790,40791,\r
+40792,40793,16246,16247,40794,40801,16248,40802,40803,40804,16249,40805,40806,\r
+40807,40808,40809,40810,40811,16250,16251,40812,40813,16252,16253,40814,40815,\r
+40816,40817,40818,40819,16254,16417,40820,40821,16418,40822,40823,40824,16419,\r
+40825,40826,40833,40834,40835,40836,40837,16420,16421,40838,40839,40840,16422,\r
+40841,40842,40843,40844,40845,40846,16423,16424,40847,40848,16425,40849,40850,\r
+40851,16426,40852,40853,40854,40855,40856,40857,40858,16427,16428,40859,16429,\r
+40860,16430,40861,40862,40863,40864,40865,40866,16431,16432,40867,40868,16433,\r
+40869,40870,40871,16434,40872,40873,40874,40875,40876,40877,40878,16435,16436,\r
+40879,16437,40880,16438,40881,16439,40882,40883,40884,40885,16440,16441,40886,\r
+40887,16442,40888,40889,40890,16443,40891,40892,40893,40894,40895,16444,40896,\r
+16445,16446,40897,16447,40898,16448,16449,16450,16451,16452,16453,16454,16455,\r
+40899,40900,40901,16456,40902,40903,40904,16457,40905,40906,40907,40908,40909,\r
+40910,40911,16458,40912,40913,16459,40914,40915,40916,40917,40918,40919,40920,\r
+40921,16460,16461,40922,40923,16462,40924,40925,40926,16463,16464,16465,40927,\r
+40928,40929,40930,16466,16467,16468,40931,16469,16470,16471,16472,40932,40933,\r
+40934,16473,40935,16474,16475,40936,40937,16476,40938,16477,16478,16479,40939,\r
+16480,40940,40941,40942,40943,40944,16481,16482,40945,16483,16484,16485,16486,\r
+40946,40947,40948,40949,40950,16487,16488,40951,40952,16489,40953,40954,40955,\r
+16490,40956,40957,40958,41025,41026,41027,41028,16491,16492,41029,16493,16494,\r
+16495,41030,41031,41032,41033,41034,41035,16496,16497,41036,41037,16498,41038,\r
+16499,41039,16500,41040,41041,41042,41043,41044,41045,41046,16501,41047,41048,\r
+41049,41050,16502,41057,41058,41059,41060,41061,41062,16503,41063,41064,41065,\r
+16504,41066,41067,41068,16505,41069,41070,41071,41072,41073,41074,41075,41076,\r
+41077,41078,41079,41080,41081,41082,41089,41090,41091,41092,41093,16506,16507,\r
+41094,41095,16508,41096,41097,41098,16509,41099,16510,41100,41101,41102,41103,\r
+41104,16673,16674,41105,16675,41106,16676,16677,41107,41108,41109,41110,41111,\r
+16678,16679,41112,41113,16680,41114,41115,41116,16681,41117,41118,41119,41120,\r
+41121,41122,41123,16682,16683,41124,16684,41125,16685,41126,41127,41128,41129,\r
+41130,41131,16686,41132,41133,41134,16687,41135,41136,41137,16688,41138,41139,\r
+41140,41141,41142,41143,41144,16689,16690,41145,41146,16691,16692,41147,41148,\r
+41149,41150,41151,41152,16693,41153,41154,41155,41156,41157,41158,41159,41160,\r
+41161,41162,41163,41164,41165,41166,41167,41168,41169,41170,41171,41172,41173,\r
+41174,41175,41176,41177,41178,41179,16694,16695,41180,41181,16696,41182,41183,\r
+41184,16697,41185,16698,41186,41187,41188,41189,41190,16699,16700,41191,16701,\r
+41192,16702,16703,16704,41193,41194,41195,16705,16706,16707,41196,41197,41198,\r
+41199,41200,41201,16708,41202,41203,41204,41205,41206,41207,41208,41209,16709,\r
+41210,16710,41211,16711,41212,41213,41214,41281,41282,41283,16712,41284,41285,\r
+41286,41287,41288,41289,41290,41291,41292,41293,41294,41295,41296,41297,41298,\r
+41299,41300,41301,41302,16713,16714,41303,41304,41305,41306,41313,41314,16715,\r
+41315,41316,41317,16716,41318,41319,41320,16717,41321,41322,41323,41324,41325,\r
+41326,41327,16718,16719,41328,16720,41329,16721,41330,41331,41332,41333,41334,\r
+41335,16722,16723,41336,41337,16724,41338,41345,41346,41347,41348,41349,41350,\r
+41351,41352,41353,41354,41355,41356,41357,41358,41359,16725,41360,41361,41362,\r
+41363,41364,41365,16726,16727,41366,41367,16728,41368,41369,41370,16729,16730,\r
+16731,41371,41372,41373,41374,41375,16732,16733,41376,16734,41537,16735,41538,\r
+41539,41540,41541,41542,41543,16736,41544,41545,41546,41547,41548,41549,41550,\r
+41551,41552,41553,41554,41555,41556,41557,41558,41559,41560,41561,41562,16737,\r
+41569,41570,41571,41572,41573,41574,41575,16738,41576,41577,41578,41579,41580,\r
+41581,41582,41583,41584,41585,41586,41587,41588,41589,41590,41591,41592,41593,\r
+41594,41601,41602,41603,41604,41605,41606,41607,41608,16739,16740,41609,41610,\r
+16741,41611,41612,41613,16742,41614,41615,41616,41617,41618,41619,41620,16743,\r
+16744,41621,16745,41622,41623,41624,41625,41626,41627,41628,41629,16746,41630,\r
+41631,41632,16747,41793,41794,41795,16748,41796,41797,41798,41799,41800,41801,\r
+41802,16749,41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,41813,\r
+16750,16751,41814,41815,16752,41816,41817,41818,16753,41825,41826,41827,41828,\r
+41829,41830,41831,16754,16755,41832,16756,41833,16757,41834,41835,41836,41837,\r
+41838,41839,41840,41841,41842,41843,41844,41845,41846,41847,41848,41849,41850,\r
+41857,41858,41859,41860,41861,41862,41863,41864,41865,41866,41867,41868,41869,\r
+41870,41871,41872,41873,16758,16759,41874,41875,16760,41876,41877,16761,16762,\r
+41878,16763,41879,41880,41881,41882,41883,16764,16765,41884,16766,41885,16929,\r
+16930,41886,41887,16931,16932,41888,16933,16934,42049,42050,16935,42051,16936,\r
+42052,16937,42053,42054,16938,42055,42056,42057,42058,16939,16940,42059,16941,\r
+16942,16943,42060,42061,42062,42063,42064,42065,16944,16945,42066,42067,16946,\r
+42068,42069,42070,16947,42071,42072,42073,42074,42081,42082,42083,16948,16949,\r
+42084,16950,16951,16952,42085,42086,42087,42088,42089,42090,16953,42091,42092,\r
+42093,16954,42094,42095,42096,42097,42098,42099,42100,42101,42102,42103,42104,\r
+42105,42106,42113,42114,42115,16955,42116,42117,42118,42119,42120,42121,42122,\r
+42123,42124,42125,42126,42127,42128,42129,42130,42131,42132,42133,42134,42135,\r
+42136,42137,42138,42139,42140,42141,42142,42143,42144,42305,42306,42307,42308,\r
+42309,16956,16957,42310,42311,16958,42312,42313,42314,16959,42315,42316,42317,\r
+42318,42319,42320,42321,16960,16961,42322,16962,16963,16964,42323,42324,42325,\r
+42326,42327,42328,16965,42329,42330,42337,42338,42339,42340,42341,42342,42343,\r
+42344,42345,42346,42347,42348,42349,42350,42351,42352,42353,42354,16966,42355,\r
+42356,42357,42358,42359,42360,16967,42361,42362,42369,42370,42371,42372,42373,\r
+42374,42375,42376,42377,42378,42379,42380,42381,42382,42383,42384,42385,16968,\r
+42386,42387,42388,42389,42390,42391,42392,42393,42394,42395,42396,42397,42398,\r
+42399,42400,42561,42562,42563,42564,42565,42566,42567,42568,42569,42570,42571,\r
+42572,42573,42574,42575,42576,42577,42578,42579,42580,16969,16970,42581,42582,\r
+16971,42583,42584,42585,16972,42586,42593,42594,42595,42596,42597,42598,16973,\r
+16974,42599,16975,42600,16976,42601,16977,42602,42603,42604,42605,16978,16979,\r
+42606,42607,42608,42609,42610,42611,16980,42612,42613,42614,42615,42616,42617,\r
+42618,42625,42626,42627,42628,16981,42629,42630,42631,42632,42633,42634,42635,\r
+16982,42636,42637,42638,42639,42640,42641,42642,42643,42644,42645,42646,42647,\r
+42648,42649,42650,42651,42652,42653,42654,16983,42655,42656,42817,42818,42819,\r
+42820,42821,16984,42822,42823,42824,16985,42825,42826,42827,16986,42828,42829,\r
+42830,42831,42832,42833,42834,16987,16988,42835,42836,42837,42838,42839,42840,\r
+42841,42842,42849,42850,42851,42852,42853,42854,42855,42856,42857,42858,42859,\r
+42860,42861,42862,42863,42864,42865,42866,42867,42868,42869,42870,42871,16989,\r
+42872,42873,42874,42881,42882,42883,16990,16991,42884,42885,16992,42886,42887,\r
+42888,16993,42889,42890,42891,42892,42893,42894,42895,16994,16995,42896,42897,\r
+42898,16996,42899,42900,42901,42902,42903,42904,16997,42905,42906,42907,42908,\r
+42909,42910,42911,42912,43073,43074,43075,43076,43077,43078,43079,43080,43081,\r
+43082,43083,16998,16999,43084,43085,43086,43087,43088,43089,43090,43091,43092,\r
+43093,43094,43095,43096,43097,43098,43105,43106,43107,43108,43109,43110,43111,\r
+43112,43113,43114,43115,43116,43117,43118,43119,43120,43121,43122,43123,17000,\r
+43124,43125,43126,43127,43128,43129,43130,43137,43138,43139,43140,43141,43142,\r
+43143,43144,43145,43146,43147,43148,43149,43150,43151,43152,43153,43154,43155,\r
+43156,17001,43157,43158,43159,43160,43161,43162,43163,43164,43165,43166,43167,\r
+43168,43329,43330,43331,43332,43333,43334,43335,43336,43337,43338,43339,43340,\r
+43341,43342,43343,17002,43344,43345,43346,43347,43348,43349,43350,43351,43352,\r
+43353,43354,43361,43362,43363,43364,17003,43365,43366,17004,43367,17005,43368,\r
+43369,43370,43371,43372,43373,43374,43375,43376,43377,43378,43379,43380,43381,\r
+43382,43383,43384,43385,43386,43393,43394,43395,43396,43397,43398,43399,43400,\r
+43401,43402,43403,43404,43405,43406,43407,17006,17007,43408,43409,17008,43410,\r
+43411,43412,17009,43413,43414,43415,43416,43417,43418,43419,17010,17011,43420,\r
+43421,43422,17012,17013,43423,43424,43585,43586,17014,17015,17016,43587,43588,\r
+17017,43589,17018,43590,17019,43591,43592,43593,43594,43595,43596,43597,17020,\r
+17021,43598,17022,17185,17186,17187,43599,43600,43601,43602,43603,17188,17189,\r
+43604,43605,17190,43606,43607,43608,17191,43609,43610,43617,43618,43619,43620,\r
+43621,17192,17193,43622,17194,17195,17196,43623,43624,43625,43626,43627,43628,\r
+17197,43629,43630,43631,17198,43632,17199,43633,17200,43634,43635,43636,43637,\r
+43638,43639,43640,17201,43641,43642,43649,43650,17202,43651,43652,43653,43654,\r
+43655,43656,43657,43658,43659,43660,43661,43662,43663,43664,43665,43666,43667,\r
+43668,43669,43670,43671,43672,43673,43674,43675,43676,43677,43678,43679,43680,\r
+43841,43842,43843,43844,17203,17204,43845,43846,17205,43847,43848,43849,17206,\r
+43850,43851,43852,43853,43854,43855,43856,17207,17208,43857,17209,17210,17211,\r
+43858,43859,43860,43861,43862,43863,17212,17213,43864,43865,17214,43866,43873,\r
+43874,17215,43875,43876,43877,43878,43879,43880,43881,17216,17217,43882,17218,\r
+43883,17219,43884,43885,43886,43887,43888,43889,17220,43890,43891,43892,17221,\r
+43893,43894,43895,43896,43897,43898,43905,43906,43907,43908,43909,43910,43911,\r
+43912,43913,17222,43914,43915,43916,43917,43918,43919,43920,17223,43921,43922,\r
+43923,17224,43924,43925,43926,43927,43928,43929,43930,43931,43932,43933,43934,\r
+43935,43936,44097,44098,44099,17225,44100,44101,44102,44103,44104,44105,17226,\r
+17227,44106,44107,17228,44108,44109,44110,17229,44111,44112,44113,44114,44115,\r
+44116,44117,17230,17231,44118,17232,44119,17233,44120,44121,44122,44129,44130,\r
+44131,17234,44132,44133,44134,17235,44135,44136,44137,17236,44138,44139,44140,\r
+44141,44142,44143,44144,44145,44146,44147,44148,44149,17237,44150,44151,44152,\r
+44153,44154,44161,44162,44163,44164,44165,44166,44167,44168,44169,44170,44171,\r
+44172,44173,44174,44175,44176,44177,44178,44179,44180,44181,44182,44183,44184,\r
+44185,44186,44187,44188,44189,17238,44190,44191,44192,17239,44353,44354,44355,\r
+17240,44356,44357,44358,44359,44360,44361,44362,17241,17242,44363,17243,44364,\r
+17244,44365,44366,44367,44368,44369,44370,17245,44371,44372,44373,44374,44375,\r
+44376,44377,44378,44385,44386,44387,44388,44389,44390,44391,17246,44392,44393,\r
+44394,44395,44396,44397,44398,44399,44400,44401,44402,17247,17248,44403,44404,\r
+17249,44405,44406,44407,17250,44408,44409,44410,44417,44418,44419,44420,17251,\r
+17252,44421,17253,44422,17254,44423,44424,44425,44426,44427,44428,17255,44429,\r
+44430,44431,44432,44433,44434,44435,44436,44437,44438,44439,44440,44441,44442,\r
+44443,44444,44445,44446,44447,17256,44448,44609,44610,44611,44612,44613,44614,\r
+17257,44615,44616,44617,17258,44618,44619,44620,44621,44622,44623,44624,44625,\r
+44626,44627,44628,44629,44630,44631,44632,44633,44634,44641,44642,44643,44644,\r
+44645,44646,17259,44647,44648,44649,17260,44650,44651,44652,17261,44653,44654,\r
+44655,44656,44657,44658,44659,17262,17263,44660,17264,44661,17265,44662,44663,\r
+44664,44665,44666,44673,17266,44674,44675,44676,17267,44677,44678,44679,17268,\r
+44680,44681,44682,44683,44684,44685,44686,17269,44687,44688,44689,44690,17270,\r
+44691,44692,44693,44694,44695,44696,17271,17272,44697,44698,17273,44699,44700,\r
+44701,17274,44702,44703,44704,44865,44866,44867,44868,17275,17276,44869,17277,\r
+44870,17278,44871,44872,44873,44874,44875,44876,44877,44878,44879,44880,44881,\r
+44882,44883,44884,44885,44886,44887,44888,44889,44890,44897,44898,44899,44900,\r
+44901,44902,44903,44904,44905,44906,44907,44908,44909,44910,17441,17442,44911,\r
+44912,17443,44913,44914,17444,17445,17446,44915,44916,44917,44918,44919,44920,\r
+17447,17448,44921,17449,44922,17450,44929,44930,44931,44932,44933,44934,17451,\r
+17452,44935,44936,17453,44937,44938,44939,17454,44940,44941,44942,44943,44944,\r
+44945,44946,17455,17456,44947,17457,44948,17458,44949,44950,44951,44952,44953,\r
+44954,17459,17460,44955,44956,17461,44957,44958,44959,17462,44960,45121,45122,\r
+45123,45124,45125,45126,17463,17464,45127,17465,17466,17467,45128,45129,45130,\r
+45131,45132,45133,17468,17469,45134,45135,45136,45137,45138,45139,45140,45141,\r
+45142,45143,45144,45145,45146,45153,45154,45155,45156,45157,45158,17470,45159,\r
+45160,45161,45162,45163,45164,45165,45166,45167,45168,45169,45170,45171,45172,\r
+45173,45174,45175,45176,45177,45178,45185,45186,45187,45188,45189,45190,45191,\r
+45192,45193,45194,45195,45196,45197,45198,17471,17472,45199,45200,17473,45201,\r
+45202,17474,17475,45203,45204,45205,45206,45207,45208,45209,17476,17477,45210,\r
+17478,17479,17480,45211,45212,45213,45214,45215,45216,17481,17482,45377,45378,\r
+17483,45379,45380,45381,17484,45382,45383,45384,45385,45386,45387,45388,17485,\r
+17486,45389,17487,45390,17488,45391,45392,45393,45394,45395,45396,17489,45397,\r
+45398,45399,17490,45400,45401,45402,17491,45409,45410,45411,45412,45413,45414,\r
+45415,17492,17493,45416,17494,17495,17496,45417,45418,45419,45420,45421,45422,\r
+17497,45423,45424,45425,45426,45427,45428,45429,45430,45431,45432,45433,45434,\r
+45441,45442,45443,45444,45445,45446,45447,45448,45449,45450,45451,45452,45453,\r
+45454,45455,17498,17499,45456,45457,17500,45458,45459,45460,17501,45461,45462,\r
+45463,45464,45465,45466,45467,17502,17503,45468,17504,45469,17505,45470,45471,\r
+45472,45633,45634,45635,17506,17507,45636,45637,17508,45638,45639,45640,17509,\r
+45641,45642,45643,45644,45645,45646,45647,17510,45648,45649,45650,45651,17511,\r
+45652,45653,45654,45655,45656,45657,17512,45658,45665,45666,45667,45668,45669,\r
+45670,45671,45672,45673,45674,45675,45676,45677,45678,45679,45680,45681,45682,\r
+45683,17513,45684,45685,45686,45687,45688,45689,17514,45690,45697,45698,45699,\r
+45700,45701,45702,17515,45703,45704,45705,45706,45707,45708,45709,45710,45711,\r
+45712,45713,45714,45715,45716,45717,45718,45719,45720,45721,17516,45722,45723,\r
+45724,45725,45726,45727,45728,45889,45890,45891,45892,45893,45894,45895,45896,\r
+45897,45898,45899,45900,45901,45902,45903,45904,45905,45906,45907,45908,17517,\r
+17518,45909,45910,17519,45911,45912,45913,17520,45914,45921,45922,45923,45924,\r
+45925,45926,17521,17522,45927,17523,45928,17524,45929,45930,45931,45932,45933,\r
+45934,17525,45935,45936,45937,17526,45938,45939,45940,17527,45941,45942,45943,\r
+45944,45945,45946,45953,45954,45955,45956,45957,45958,17528,45959,45960,45961,\r
+45962,45963,45964,17529,45965,45966,45967,45968,45969,45970,45971,45972,45973,\r
+45974,45975,45976,45977,45978,45979,45980,45981,45982,45983,45984,17530,46145,\r
+46146,46147,46148,46149,46150,17531,17532,46151,46152,17533,46153,46154,46155,\r
+17534,46156,46157,46158,46159,46160,46161,46162,17697,17698,46163,17699,46164,\r
+17700,46165,46166,46167,46168,46169,46170,17701,46177,46178,46179,17702,46180,\r
+46181,46182,17703,46183,46184,46185,46186,46187,46188,46189,17704,46190,46191,\r
+46192,46193,46194,46195,46196,46197,46198,46199,46200,17705,17706,46201,46202,\r
+17707,46209,46210,46211,17708,46212,46213,46214,46215,46216,46217,46218,17709,\r
+17710,46219,46220,46221,17711,46222,46223,46224,46225,46226,46227,46228,46229,\r
+46230,46231,46232,46233,46234,46235,46236,46237,46238,46239,46240,46401,46402,\r
+46403,46404,46405,46406,46407,46408,46409,46410,46411,46412,46413,46414,46415,\r
+17712,17713,46416,46417,17714,46418,46419,46420,17715,46421,46422,46423,46424,\r
+46425,46426,46433,17716,17717,46434,17718,46435,17719,46436,46437,46438,46439,\r
+46440,46441,17720,17721,46442,46443,17722,46444,46445,46446,17723,17724,46447,\r
+46448,46449,46450,46451,46452,17725,17726,46453,17727,17728,17729,46454,46455,\r
+46456,46457,46458,46465,17730,17731,46466,46467,17732,46468,46469,46470,17733,\r
+46471,46472,46473,46474,46475,46476,46477,17734,17735,46478,17736,17737,17738,\r
+46479,46480,46481,46482,46483,46484,17739,46485,46486,46487,46488,46489,46490,\r
+46491,46492,46493,46494,46495,46496,46657,46658,46659,46660,46661,46662,46663,\r
+46664,17740,46665,46666,46667,46668,46669,46670,46671,46672,46673,46674,46675,\r
+46676,46677,46678,46679,46680,46681,46682,46689,46690,46691,46692,46693,46694,\r
+46695,46696,46697,46698,46699,46700,46701,46702,46703,46704,17741,17742,46705,\r
+46706,17743,46707,46708,46709,17744,46710,17745,46711,46712,46713,46714,46721,\r
+17746,17747,46722,17748,17749,17750,46723,46724,46725,46726,46727,46728,17751,\r
+17752,46729,46730,17753,46731,46732,46733,17754,46734,46735,46736,46737,46738,\r
+46739,46740,17755,17756,46741,17757,46742,17758,46743,46744,46745,46746,46747,\r
+46748,17759,46749,46750,46751,17760,46752,46913,46914,46915,46916,46917,46918,\r
+46919,46920,46921,46922,46923,46924,46925,46926,17761,46927,46928,46929,46930,\r
+46931,46932,46933,17762,46934,46935,46936,17763,46937,46938,46945,46946,46947,\r
+46948,46949,46950,46951,46952,46953,46954,46955,46956,46957,46958,46959,46960,\r
+46961,46962,46963,46964,46965,17764,17765,46966,46967,17766,46968,46969,46970,\r
+17767,46977,46978,46979,46980,46981,46982,46983,17768,17769,46984,17770,46985,\r
+17771,46986,46987,46988,46989,17772,46990,17773,46991,46992,46993,17774,46994,\r
+46995,46996,46997,46998,46999,47000,47001,47002,47003,47004,47005,47006,47007,\r
+47008,47169,47170,47171,47172,47173,47174,47175,47176,17775,47177,47178,47179,\r
+47180,47181,47182,47183,47184,47185,47186,47187,47188,47189,47190,47191,47192,\r
+47193,47194,47201,47202,47203,47204,47205,47206,47207,47208,47209,17776,47210,\r
+47211,47212,17777,47213,47214,47215,47216,47217,47218,47219,47220,47221,47222,\r
+47223,47224,47225,47226,17778,47233,17779,47234,47235,47236,47237,47238,47239,\r
+17780,47240,47241,47242,47243,47244,47245,47246,47247,47248,47249,47250,47251,\r
+47252,47253,47254,47255,47256,47257,47258,47259,47260,47261,47262,47263,47264,\r
+47425,47426,17781,17782,47427,47428,17783,47429,47430,47431,17784,47432,47433,\r
+47434,47435,47436,47437,47438,17785,17786,47439,17787,47440,17788,47441,47442,\r
+47443,47444,47445,47446,17789,47447,47448,47449,47450,47457,47458,47459,47460,\r
+47461,47462,47463,47464,47465,47466,47467,47468,47469,47470,47471,17790,47472,\r
+47473,47474,47475,47476,47477,47478,17953,47479,47480,47481,47482,47489,47490,\r
+47491,47492,47493,47494,47495,47496,47497,47498,47499,47500,47501,47502,47503,\r
+47504,47505,47506,47507,47508,47509,47510,47511,17954,17955,47512,47513,17956,\r
+47514,47515,47516,17957,47517,47518,47519,47520,47681,47682,47683,17958,17959,\r
+47684,47685,47686,17960,47687,47688,47689,47690,47691,47692,17961,47693,47694,\r
+47695,17962,47696,47697,47698,17963,47699,47700,47701,47702,47703,47704,47705,\r
+17964,47706,47713,47714,47715,17965,47716,47717,47718,47719,47720,47721,17966,\r
+17967,47722,47723,17968,47724,47725,17969,17970,47726,17971,47727,47728,47729,\r
+47730,47731,17972,17973,47732,17974,47733,47734,47735,47736,47737,47738,47745,\r
+47746,17975,47747,47748,47749,17976,47750,47751,47752,17977,47753,47754,47755,\r
+47756,47757,47758,47759,17978,17979,47760,47761,47762,47763,47764,47765,47766,\r
+47767,47768,47769,17980,17981,47770,47771,17982,47772,47773,47774,17983,47775,\r
+47776,47937,47938,47939,47940,47941,17984,17985,47942,17986,47943,17987,47944,\r
+47945,47946,47947,47948,47949,17988,17989,17990,47950,17991,47951,47952,47953,\r
+17992,47954,17993,47955,47956,47957,47958,47959,17994,17995,47960,17996,17997,\r
+17998,47961,47962,47969,17999,47970,47971,18000,18001,47972,47973,18002,47974,\r
+47975,47976,18003,47977,47978,47979,47980,47981,47982,47983,18004,18005,47984,\r
+18006,18007,18008,47985,47986,47987,47988,47989,47990,18009,18010,47991,47992,\r
+47993,47994,48001,48002,48003,48004,48005,48006,48007,48008,48009,48010,48011,\r
+48012,48013,48014,48015,48016,48017,48018,48019,48020,48021,48022,48023,48024,\r
+48025,48026,48027,48028,48029,48030,48031,48032,48193,48194,48195,48196,48197,\r
+48198,48199,48200,48201,48202,48203,48204,48205,48206,48207,48208,48209,48210,\r
+18011,18012,48211,48212,18013,48213,48214,48215,18014,48216,48217,48218,48225,\r
+48226,48227,48228,18015,18016,48229,18017,18018,18019,48230,48231,48232,48233,\r
+48234,48235,18020,18021,48236,48237,18022,48238,48239,48240,18023,48241,48242,\r
+48243,48244,48245,48246,48247,18024,18025,48248,18026,48249,18027,48250,48257,\r
+48258,48259,48260,48261,18028,48262,48263,48264,18029,48265,48266,48267,18030,\r
+48268,48269,48270,48271,48272,48273,48274,18031,18032,48275,48276,18033,18034,\r
+48277,48278,48279,48280,48281,48282,18035,48283,48284,48285,48286,48287,48288,\r
+48449,18036,48450,48451,48452,48453,48454,48455,48456,48457,18037,48458,18038,\r
+48459,48460,48461,48462,48463,48464,48465,48466,18039,18040,48467,48468,18041,\r
+48469,48470,48471,18042,48472,48473,48474,48481,48482,48483,48484,18043,18044,\r
+48485,18045,48486,18046,48487,48488,48489,48490,48491,48492,18209,48493,48494,\r
+48495,48496,48497,48498,48499,48500,48501,48502,48503,48504,48505,48506,48513,\r
+48514,48515,48516,48517,48518,18210,48519,48520,48521,48522,48523,48524,48525,\r
+48526,48527,48528,48529,48530,48531,48532,48533,48534,48535,48536,48537,48538,\r
+48539,48540,48541,48542,48543,48544,48705,48706,48707,48708,48709,48710,48711,\r
+48712,18211,48713,48714,48715,18212,48716,48717,48718,48719,48720,48721,48722,\r
+48723,48724,48725,48726,48727,48728,48729,48730,48737,48738,48739,48740,48741,\r
+48742,48743,48744,18213,48745,48746,48747,18214,48748,48749,48750,18215,48751,\r
+48752,48753,48754,48755,48756,48757,48758,18216,48759,18217,48760,48761,48762,\r
+48769,48770,48771,48772,48773,18218,18219,48774,48775,18220,48776,48777,18221,\r
+18222,48778,18223,48779,48780,48781,48782,48783,18224,18225,48784,18226,48785,\r
+18227,48786,48787,48788,48789,48790,48791,18228,48792,48793,48794,48795,48796,\r
+48797,48798,48799,48800,48961,48962,48963,48964,48965,48966,48967,48968,48969,\r
+48970,48971,18229,48972,48973,48974,48975,48976,48977,48978,48979,48980,48981,\r
+48982,48983,48984,48985,48986,48993,48994,48995,48996,48997,48998,48999,49000,\r
+49001,49002,49003,49004,49005,49006,49007,49008,49009,49010,49011,18230,49012,\r
+49013,49014,18231,49015,49016,49017,18232,49018,49025,49026,49027,49028,49029,\r
+49030,18233,49031,49032,18234,49033,49034,49035,49036,49037,49038,49039,49040,\r
+18235,49041,49042,49043,18236,49044,49045,49046,18237,49047,49048,49049,49050,\r
+49051,49052,49053,18238,49054,49055,18239,49056,18240,49217,49218,49219,49220,\r
+49221,49222,18241,49223,49224,49225,18242,49226,49227,49228,18243,49229,49230,\r
+49231,49232,49233,49234,49235,18244,18245,49236,18246,49237,49238,49239,49240,\r
+49241,49242,49249,49250,49251,49252,49253,49254,49255,49256,49257,49258,49259,\r
+49260,49261,49262,49263,49264,49265,49266,49267,49268,49269,49270,49271,49272,\r
+49273,49274,49281,49282,49283,49284,18247,18248,49285,49286,18249,49287,49288,\r
+49289,18250,49290,49291,49292,49293,49294,49295,49296,18251,18252,49297,18253,\r
+49298,18254,49299,49300,49301,49302,49303,49304,18255,18256,49305,49306,18257,\r
+49307,49308,49309,18258,49310,49311,49312,49473,18259,49474,49475,18260,18261,\r
+49476,18262,49477,18263,49478,49479,49480,49481,49482,49483,18264,18265,49484,\r
+49485,18266,49486,49487,49488,18267,49489,49490,49491,49492,49493,49494,49495,\r
+18268,18269,49496,18270,18271,18272,49497,49498,49505,49506,49507,49508,18273,\r
+49509,49510,49511,49512,49513,49514,49515,49516,49517,49518,49519,49520,49521,\r
+49522,49523,49524,49525,49526,49527,49528,18274,49529,49530,49537,49538,49539,\r
+49540,49541,49542,49543,49544,49545,49546,49547,49548,49549,49550,49551,49552,\r
+49553,49554,49555,49556,49557,49558,49559,49560,49561,49562,49563,49564,49565,\r
+49566,49567,49568,18275,18276,49729,49730,18277,49731,49732,49733,18278,49734,\r
+18279,49735,49736,49737,49738,49739,18280,18281,49740,18282,49741,18283,49742,\r
+49743,49744,49745,49746,49747,18284,18285,49748,49749,18286,49750,49751,49752,\r
+18287,49753,49754,49761,49762,49763,49764,49765,18288,18289,49766,18290,49767,\r
+18291,49768,49769,49770,49771,49772,49773,18292,18293,49774,49775,18294,49776,\r
+49777,49778,18295,49779,49780,49781,49782,49783,49784,49785,18296,18297,49786,\r
+18298,18299,18300,49793,49794,49795,49796,49797,49798,18301,49799,49800,49801,\r
+18302,49802,49803,49804,18465,49805,49806,49807,49808,49809,49810,49811,49812,\r
+18466,49813,49814,49815,49816,49817,49818,49819,49820,49821,49822,18467,18468,\r
+49823,49824,18469,49985,49986,49987,18470,49988,49989,49990,49991,18471,49992,\r
+49993,18472,18473,49994,18474,49995,18475,49996,49997,49998,18476,49999,50000,\r
+18477,18478,50001,50002,18479,50003,50004,50005,18480,50006,50007,50008,50009,\r
+50010,50017,50018,50019,50020,50021,18481,50022,18482,50023,50024,50025,50026,\r
+50027,50028,18483,18484,50029,50030,18485,50031,50032,50033,50034,50035,50036,\r
+50037,50038,50039,50040,50041,50042,50049,50050,18486,50051,18487,50052,50053,\r
+50054,50055,50056,50057,18488,18489,50058,50059,18490,50060,50061,50062,18491,\r
+50063,50064,50065,50066,50067,50068,50069,50070,18492,50071,18493,50072,18494,\r
+50073,50074,50075,50076,50077,50078,18495,50079,50080,50241,18496,50242,50243,\r
+50244,18497,50245,50246,50247,50248,50249,50250,50251,50252,18498,50253,18499,\r
+50254,50255,50256,50257,50258,50259,50260,50261,18500,18501,50262,50263,18502,\r
+50264,50265,50266,18503,50273,50274,50275,50276,18504,50277,50278,18505,50279,\r
+50280,18506,50281,18507,50282,50283,50284,50285,50286,50287,18508,50288,50289,\r
+50290,18509,50291,50292,50293,18510,50294,50295,50296,50297,50298,50305,50306,\r
+18511,50307,50308,50309,50310,18512,50311,50312,50313,50314,50315,50316,18513,\r
+18514,50317,50318,18515,50319,50320,50321,18516,50322,50323,50324,50325,50326,\r
+50327,50328,50329,50330,50331,50332,50333,18517,50334,50335,50336,50497,50498,\r
+50499,18518,18519,50500,50501,18520,50502,50503,50504,18521,50505,50506,50507,\r
+50508,50509,50510,50511,18522,18523,50512,18524,50513,18525,50514,50515,50516,\r
+50517,50518,50519,18526,18527,50520,50521,18528,50522,50529,50530,18529,50531,\r
+50532,50533,50534,50535,50536,50537,18530,50538,50539,18531,50540,18532,50541,\r
+50542,50543,50544,50545,50546,18533,18534,50547,50548,18535,50549,18536,18537,\r
+18538,18539,50550,50551,50552,50553,50554,50561,18540,18541,50562,18542,50563,\r
+18543,50564,50565,50566,18544,50567,50568,18545,50569,50570,50571,18546,50572,\r
+50573,50574,18547,50575,50576,50577,50578,50579,50580,50581,18548,18549,50582,\r
+50583,50584,18550,50585,50586,50587,50588,50589,50590,18551,18552,50591,50592,\r
+18553,50753,50754,50755,18554,50756,50757,50758,50759,50760,50761,50762,18555,\r
+18556,50763,18557,50764,18558,50765,50766,50767,50768,50769,50770,19280,19286,\r
+19303,19791,19816,20013,20347,20514,20536,20560,20573,20820,20821,20824,20827,\r
+20828,20829,20830,20831,20832,20834,20835,20836,20837,20838,20840,20841,20842,\r
+20843,20845,20847,20848,20850,20854,20858,20860,20861,20862,21026,21027,21031,\r
+21032,21033,21034,21035,21037,21042,21054,21058,21059,21060,21062,21063,21064,\r
+21065,21066,21067,21069,21070,21071,21072,21073,21074,21075,21076,21077,21078,\r
+21079,21081,21082,21086,21087,21089,21090,21092,21093,21094,21095,21096,21097,\r
+21098,21099,21104,21105,21106,21107,21108,21109,21111,21112,21606,21628,21797,\r
+21803,21806,22072,22093,22347,22372,23365,23396,23589,23845,23893,23924,24188,\r
+24190,24371,24417,24424,24689,24877,24941,25461,25633,25641,25902,25905,25906,\r
+25913,25915,25916,25924,25934,25936,25938,25942,25978,25979,25980,25982,26145,\r
+26148,26151,26157,26159,26160,26161,26163,26167,26168,26172,26180,26182,26183,\r
+26186,26194,26198,26201,26204,26207,26209,26212,26213,26214,26216,26218,26219,\r
+26220,26223,26225,26226,26229,26230,26231,26233,26401,26406,26409,26410,26412,\r
+26413,26416,26431,26433,26438,26439,26443,26445,26447,26448,26451,26463,26468,\r
+26470,26487,26727,26728,26736,26737,26743,26745,26747,26750,26919,26924,26956,\r
+26999,27201,27237,27252,27255,27260,27262,27428,27431,27433,27434,27450,27451,\r
+27453,27457,27458,27462,27463,27468,27471,27472,27473,27474,27480,27686,27687,\r
+27690,27695,27696,27697,27698,27701,27704,27706,27712,27713,27717,27718,27721,\r
+27722,27733,27741,27742,27745,27748,27751,27752,27767,27768,27770,27937,27938,\r
+27939,28014,28251,29245,29306,29489,29735,29806,30324,30326,30520,30536,30547,\r
+30811,30832,31265,31266,31334,31785,8993,8994,8995,8996,8997,8998,8999,9000,\r
+9001,9002,9003,9004,9005,9006,9007,9008,9009,9010,9011,9012,9013,9014,9015,\r
+9016,9017,9018,9019,9020,9021,9022,9023,9024,9025,9026,9027,9028,9029,9030,\r
+9031,9032,9033,9034,9035,9036,9037,9038,9039,9040,9041,9042,9043,9044,9045,\r
+9046,9047,9048,9049,9050,9051,8492,9053,9054,9055,9056,9057,9058,9059,9060,\r
+9061,9062,9063,9064,9065,9066,9067,9068,9069,9070,9071,9072,9073,9074,9075,\r
+9076,9077,9078,9079,9080,9081,9082,9083,9084,9085,8742,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,8523,8524,8574,9086,N,8525,9052,\r
+};\r
+\r
+static const struct unim_index cp949_encmap[256] = {\r
+{__cp949_encmap+0,161,254},{__cp949_encmap+94,17,103},{__cp949_encmap+181,199,\r
+221},{__cp949_encmap+204,145,201},{__cp949_encmap+261,1,81},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+342,21,172},{\r
+__cp949_encmap+494,3,212},{__cp949_encmap+704,0,165},{__cp949_encmap+870,18,18\r
+},{__cp949_encmap+871,96,233},{__cp949_encmap+1009,0,209},{__cp949_encmap+1219\r
+,5,109},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{__cp949_encmap+1324,0,246},{__cp949_encmap+1571,49,142},{__cp949_encmap+\r
+1665,0,127},{__cp949_encmap+1793,128,221},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{__cp949_encmap+1887,0,251},{__cp949_encmap+2139,1,250},{\r
+__cp949_encmap+2389,2,255},{__cp949_encmap+2643,0,253},{__cp949_encmap+2897,0,\r
+255},{__cp949_encmap+3153,5,248},{__cp949_encmap+3397,3,250},{__cp949_encmap+\r
+3645,4,254},{__cp949_encmap+3896,6,250},{__cp949_encmap+4141,3,252},{\r
+__cp949_encmap+4391,0,253},{__cp949_encmap+4645,15,255},{__cp949_encmap+4886,\r
+1,233},{__cp949_encmap+5119,5,250},{__cp949_encmap+5365,1,253},{__cp949_encmap\r
++5618,7,254},{__cp949_encmap+5866,2,251},{__cp949_encmap+6116,1,255},{\r
+__cp949_encmap+6371,15,251},{__cp949_encmap+6608,1,255},{__cp949_encmap+6863,\r
+0,255},{__cp949_encmap+7119,1,247},{__cp949_encmap+7366,13,254},{\r
+__cp949_encmap+7608,0,255},{__cp949_encmap+7864,6,255},{__cp949_encmap+8114,0,\r
+254},{__cp949_encmap+8369,18,250},{__cp949_encmap+8602,0,255},{__cp949_encmap+\r
+8858,2,251},{__cp949_encmap+9108,4,236},{__cp949_encmap+9341,8,243},{\r
+__cp949_encmap+9577,11,251},{__cp949_encmap+9818,23,255},{__cp949_encmap+10051\r
+,1,254},{__cp949_encmap+10305,1,253},{__cp949_encmap+10558,4,255},{\r
+__cp949_encmap+10810,0,253},{__cp949_encmap+11064,10,254},{__cp949_encmap+\r
+11309,1,247},{__cp949_encmap+11556,1,252},{__cp949_encmap+11808,0,254},{\r
+__cp949_encmap+12063,1,243},{__cp949_encmap+12306,2,251},{__cp949_encmap+12556\r
+,1,251},{__cp949_encmap+12807,0,255},{__cp949_encmap+13063,15,233},{\r
+__cp949_encmap+13282,7,254},{__cp949_encmap+13530,0,251},{__cp949_encmap+13782\r
+,9,156},{__cp949_encmap+13930,54,252},{__cp949_encmap+14129,0,253},{\r
+__cp949_encmap+14383,2,254},{__cp949_encmap+14636,5,254},{__cp949_encmap+14886\r
+,1,253},{__cp949_encmap+15139,3,252},{__cp949_encmap+15389,17,255},{\r
+__cp949_encmap+15628,2,254},{__cp949_encmap+15881,0,254},{__cp949_encmap+16136\r
+,5,253},{__cp949_encmap+16385,7,248},{__cp949_encmap+16627,0,254},{\r
+__cp949_encmap+16882,0,154},{__cp949_encmap+17037,55,253},{__cp949_encmap+\r
+17236,4,243},{__cp949_encmap+17476,10,254},{__cp949_encmap+17721,3,253},{\r
+__cp949_encmap+17972,0,253},{__cp949_encmap+18226,2,245},{__cp949_encmap+18470\r
+,13,252},{__cp949_encmap+18710,4,246},{__cp949_encmap+18953,4,127},{\r
+__cp949_encmap+19077,119,226},{__cp949_encmap+19185,28,251},{__cp949_encmap+\r
+19409,0,255},{__cp949_encmap+19665,0,254},{__cp949_encmap+19920,3,255},{\r
+__cp949_encmap+20173,1,238},{__cp949_encmap+20411,26,232},{__cp949_encmap+\r
+20618,13,246},{__cp949_encmap+20852,9,250},{__cp949_encmap+21094,26,244},{\r
+__cp949_encmap+21313,7,156},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+21463,0,255},{\r
+__cp949_encmap+21719,0,255},{__cp949_encmap+21975,0,255},{__cp949_encmap+22231\r
+,0,255},{__cp949_encmap+22487,0,255},{__cp949_encmap+22743,0,255},{\r
+__cp949_encmap+22999,0,255},{__cp949_encmap+23255,0,255},{__cp949_encmap+23511\r
+,0,255},{__cp949_encmap+23767,0,255},{__cp949_encmap+24023,0,255},{\r
+__cp949_encmap+24279,0,255},{__cp949_encmap+24535,0,255},{__cp949_encmap+24791\r
+,0,255},{__cp949_encmap+25047,0,255},{__cp949_encmap+25303,0,255},{\r
+__cp949_encmap+25559,0,255},{__cp949_encmap+25815,0,255},{__cp949_encmap+26071\r
+,0,255},{__cp949_encmap+26327,0,255},{__cp949_encmap+26583,0,255},{\r
+__cp949_encmap+26839,0,255},{__cp949_encmap+27095,0,255},{__cp949_encmap+27351\r
+,0,255},{__cp949_encmap+27607,0,255},{__cp949_encmap+27863,0,255},{\r
+__cp949_encmap+28119,0,255},{__cp949_encmap+28375,0,255},{__cp949_encmap+28631\r
+,0,255},{__cp949_encmap+28887,0,255},{__cp949_encmap+29143,0,255},{\r
+__cp949_encmap+29399,0,255},{__cp949_encmap+29655,0,255},{__cp949_encmap+29911\r
+,0,255},{__cp949_encmap+30167,0,255},{__cp949_encmap+30423,0,255},{\r
+__cp949_encmap+30679,0,255},{__cp949_encmap+30935,0,255},{__cp949_encmap+31191\r
+,0,255},{__cp949_encmap+31447,0,255},{__cp949_encmap+31703,0,255},{\r
+__cp949_encmap+31959,0,255},{__cp949_encmap+32215,0,255},{__cp949_encmap+32471\r
+,0,163},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+32635,0,255},{\r
+__cp949_encmap+32891,0,11},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp949_encmap+\r
+32903,1,230},\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_tw.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/mappings_tw.h
new file mode 100644 (file)
index 0000000..fa2fb81
--- /dev/null
@@ -0,0 +1,2633 @@
+static const ucs2_t __big5_decmap[16702] = {\r
+12288,65292,12289,12290,65294,8226,65307,65306,65311,65281,65072,8230,8229,\r
+65104,65380,65106,183,65108,65109,65110,65111,65372,8211,65073,8212,65075,\r
+9588,65076,65103,65288,65289,65077,65078,65371,65373,65079,65080,12308,12309,\r
+65081,65082,12304,12305,65083,65084,12298,12299,65085,65086,12296,12297,65087,\r
+65088,12300,12301,65089,65090,12302,12303,65091,65092,65113,65114,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,65115,65116,65117,\r
+65118,8216,8217,8220,8221,12317,12318,8245,8242,65283,65286,65290,8251,167,\r
+12291,9675,9679,9651,9650,9678,9734,9733,9671,9670,9633,9632,9661,9660,12963,\r
+8453,8254,65507,65343,717,65097,65098,65101,65102,65099,65100,65119,65120,\r
+65121,65291,65293,215,247,177,8730,65308,65310,65309,8806,8807,8800,8734,8786,\r
+8801,65122,65123,65124,65125,65126,8764,8745,8746,8869,8736,8735,8895,13266,\r
+13265,8747,8750,8757,8756,9792,9794,9793,9737,8593,8595,8592,8594,8598,8599,\r
+8601,8600,8741,8739,65295,65340,65295,65340,65284,165,12306,162,163,65285,\r
+65312,8451,8457,65129,65130,65131,13269,13212,13213,13214,13262,13217,13198,\r
+13199,13252,176,20825,20827,20830,20829,20833,20835,21991,29929,31950,9601,\r
+9602,9603,9604,9605,9606,9607,9608,9615,9614,9613,9612,9611,9610,9609,9532,\r
+9524,9516,9508,9500,9620,9472,9474,9621,9484,9488,9492,9496,9581,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,9582,9584,9583,9552,\r
+9566,9578,9569,9698,9699,9701,9700,9585,9586,9587,65296,65297,65298,65299,\r
+65300,65301,65302,65303,65304,65305,8544,8545,8546,8547,8548,8549,8550,8551,\r
+8552,8553,12321,12322,12323,12324,12325,12326,12327,12328,12329,21313,21316,\r
+21317,65313,65314,65315,65316,65317,65318,65319,65320,65321,65322,65323,65324,\r
+65325,65326,65327,65328,65329,65330,65331,65332,65333,65334,65335,65336,65337,\r
+65338,65345,65346,65347,65348,65349,65350,65351,65352,65353,65354,65355,65356,\r
+65357,65358,65359,65360,65361,65362,65363,65364,65365,65366,65367,65368,65369,\r
+65370,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,931,\r
+932,933,934,935,936,937,945,946,947,948,949,950,951,952,953,954,955,956,957,\r
+958,959,960,961,963,964,965,966,967,968,969,12549,12550,12551,12552,12553,\r
+12554,12555,12556,12557,12558,12559,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,12560,12561,12562,12563,12564,12565,12566,12567,\r
+12568,12569,12570,12571,12572,12573,12574,12575,12576,12577,12578,12579,12580,\r
+12581,12582,12583,12584,12585,729,713,714,711,715,19968,20057,19969,19971,\r
+20035,20061,20102,20108,20154,20799,20837,20843,20960,20992,20993,21147,21269,\r
+21313,21340,21448,19977,19979,19976,19978,20011,20024,20961,20037,20040,20063,\r
+20062,20110,20129,20800,20995,21242,21315,21449,21475,22303,22763,22805,22823,\r
+22899,23376,23377,23379,23544,23567,23586,23608,23665,24029,24037,24049,24050,\r
+24051,24062,24178,24318,24331,24339,25165,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,19985,19984,19981,20013,20016,20025,20043,\r
+23609,20104,20113,20117,20114,20116,20130,20161,20160,20163,20166,20167,20173,\r
+20170,20171,20164,20803,20801,20839,20845,20846,20844,20887,20982,20998,20999,\r
+21000,21243,21246,21247,21270,21305,21320,21319,21317,21342,21380,21451,21450,\r
+21453,22764,22825,22827,22826,22829,23380,23569,23588,23610,23663,24052,24187,\r
+24319,24340,24341,24515,25096,25142,25163,25166,25903,25991,26007,26020,26041,\r
+26085,26352,26376,26408,27424,27490,27513,27595,27604,27611,27663,27700,28779,\r
+29226,29238,29243,29255,29273,29275,29356,29579,19993,19990,19989,19988,19992,\r
+20027,20045,20047,20046,20197,20184,20180,20181,20182,20183,20195,20196,20185,\r
+20190,20805,20804,20873,20874,20908,20985,20986,20984,21002,21152,21151,21253,\r
+21254,21271,21277,20191,21322,21321,21345,21344,21359,21358,21435,21487,21476,\r
+21491,21484,21486,21481,21480,21500,21496,21493,21483,21478,21482,21490,21489,\r
+21488,21477,21485,21499,22235,22234,22806,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22830,22833,22900,22902,23381,23427,23612,\r
+24040,24039,24038,24066,24067,24179,24188,24321,24344,24343,24517,25098,25171,\r
+25172,25170,25169,26021,26086,26414,26412,26410,26411,26413,27491,27597,27665,\r
+27664,27704,27713,27712,27710,29359,29572,29577,29916,29926,29976,29983,29992,\r
+29993,30000,30001,30002,30003,30091,30333,30382,30399,30446,30683,30690,30707,\r
+31034,31166,31348,31435,19998,19999,20050,20051,20073,20121,20132,20134,20133,\r
+20223,20233,20249,20234,20245,20237,20240,20241,20239,20210,20214,20219,20208,\r
+20211,20221,20225,20235,20809,20807,20806,20808,20840,20849,20877,20912,21015,\r
+21009,21010,21006,21014,21155,21256,21281,21280,21360,21361,21513,21519,21516,\r
+21514,21520,21505,21515,21508,21521,21517,21512,21507,21518,21510,21522,22240,\r
+22238,22237,22323,22320,22312,22317,22316,22319,22313,22809,22810,22839,22840,\r
+22916,22904,22915,22909,22905,22914,22913,23383,23384,23431,23432,23429,23433,\r
+23546,23574,23673,24030,24070,24182,24180,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24335,24347,24537,24534,25102,25100,25101,\r
+25104,25187,25179,25176,25910,26089,26088,26092,26093,26354,26355,26377,26429,\r
+26420,26417,26421,27425,27492,27515,27670,27741,27735,27737,27743,27744,27728,\r
+27733,27745,27739,27725,27726,28784,29279,29277,30334,31481,31859,31992,32566,\r
+32650,32701,32769,32771,32780,32786,32819,32895,32905,32907,32908,33251,33258,\r
+33267,33276,33292,33307,33311,33390,33394,33406,34411,34880,34892,34915,35199,\r
+38433,20018,20136,20301,20303,20295,20311,20318,20276,20315,20309,20272,20304,\r
+20305,20285,20282,20280,20291,20308,20284,20294,20323,20316,20320,20271,20302,\r
+20278,20313,20317,20296,20314,20812,20811,20813,20853,20918,20919,21029,21028,\r
+21033,21034,21032,21163,21161,21162,21164,21283,21363,21365,21533,21549,21534,\r
+21566,21542,21582,21543,21574,21571,21555,21576,21570,21531,21545,21578,21561,\r
+21563,21560,21550,21557,21558,21536,21564,21568,21553,21547,21535,21548,22250,\r
+22256,22244,22251,22346,22353,22336,22349,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22343,22350,22334,22352,22351,22331,22767,\r
+22846,22941,22930,22952,22942,22947,22937,22934,22925,22948,22931,22922,22949,\r
+23389,23388,23386,23387,23436,23435,23439,23596,23616,23617,23615,23614,23696,\r
+23697,23700,23692,24043,24076,24207,24199,24202,24311,24324,24351,24420,24418,\r
+24439,24441,24536,24524,24535,24525,24561,24555,24568,24554,25106,25105,25220,\r
+25239,25238,25216,25206,25225,25197,25226,25212,25214,25209,25203,25234,25199,\r
+25240,25198,25237,25235,25233,25222,25913,25915,25912,26097,26356,26463,26446,\r
+26447,26448,26449,26460,26454,26462,26441,26438,26464,26451,26455,27493,27599,\r
+27714,27742,27801,27777,27784,27785,27781,27803,27754,27770,27792,27760,27788,\r
+27752,27798,27794,27773,27779,27762,27774,27764,27782,27766,27789,27796,27800,\r
+27778,28790,28796,28797,28792,29282,29281,29280,29380,29378,29590,29996,29995,\r
+30007,30008,30338,30447,30691,31169,31168,31167,31350,31995,32597,32918,32915,\r
+32925,32920,32923,32922,32946,33391,33426,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33419,33421,35211,35282,35328,35895,35910,\r
+35925,35997,36196,36208,36275,36523,36554,36763,36784,36802,36806,36805,36804,\r
+24033,37009,37026,37034,37030,37027,37193,37318,37324,38450,38446,38449,38442,\r
+38444,20006,20054,20083,20107,20123,20126,20139,20140,20335,20381,20365,20339,\r
+20351,20332,20379,20363,20358,20355,20336,20341,20360,20329,20347,20374,20350,\r
+20367,20369,20346,20820,20818,20821,20841,20855,20854,20856,20925,20989,21051,\r
+21048,21047,21050,21040,21038,21046,21057,21182,21179,21330,21332,21331,21329,\r
+21350,21367,21368,21369,21462,21460,21463,21619,21621,21654,21624,21653,21632,\r
+21627,21623,21636,21650,21638,21628,21648,21617,21622,21644,21658,21602,21608,\r
+21643,21629,21646,22266,22403,22391,22378,22377,22369,22374,22372,22396,22812,\r
+22857,22855,22856,22852,22868,22974,22971,22996,22969,22958,22993,22982,22992,\r
+22989,22987,22995,22986,22959,22963,22994,22981,23391,23396,23395,23447,23450,\r
+23448,23452,23449,23451,23578,23624,23621,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23622,23735,23713,23736,23721,23723,23729,\r
+23731,24088,24090,24086,24085,24091,24081,24184,24218,24215,24220,24213,24214,\r
+24310,24358,24359,24361,24448,24449,24447,24444,24541,24544,24573,24565,24575,\r
+24591,24596,24623,24629,24598,24618,24597,24609,24615,24617,24619,24603,25110,\r
+25109,25151,25150,25152,25215,25289,25292,25284,25279,25282,25273,25298,25307,\r
+25259,25299,25300,25291,25288,25256,25277,25276,25296,25305,25287,25293,25269,\r
+25306,25265,25304,25302,25303,25286,25260,25294,25918,26023,26044,26106,26132,\r
+26131,26124,26118,26114,26126,26112,26127,26133,26122,26119,26381,26379,26477,\r
+26507,26517,26481,26524,26483,26487,26503,26525,26519,26479,26480,26495,26505,\r
+26494,26512,26485,26522,26515,26492,26474,26482,27427,27494,27495,27519,27667,\r
+27675,27875,27880,27891,27825,27852,27877,27827,27837,27838,27836,27874,27819,\r
+27861,27859,27832,27844,27833,27841,27822,27863,27845,27889,27839,27835,27873,\r
+27867,27850,27820,27887,27868,27862,27872,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28821,28814,28818,28810,28825,29228,29229,\r
+29240,29256,29287,29289,29376,29390,29401,29399,29392,29609,29608,29599,29611,\r
+29605,30013,30109,30105,30106,30340,30402,30450,30452,30693,30717,31038,31040,\r
+31041,31177,31176,31354,31353,31482,31998,32596,32652,32651,32773,32954,32933,\r
+32930,32945,32929,32939,32937,32948,32938,32943,33253,33278,33293,33459,33437,\r
+33433,33453,33469,33439,33465,33457,33452,33445,33455,33464,33443,33456,33470,\r
+33463,34382,34417,21021,34920,36555,36814,36820,36817,37045,37048,37041,37046,\r
+37319,37329,38263,38272,38428,38464,38463,38459,38468,38466,38585,38632,38738,\r
+38750,20127,20141,20142,20449,20405,20399,20415,20448,20433,20431,20445,20419,\r
+20406,20440,20447,20426,20439,20398,20432,20420,20418,20442,20430,20446,20407,\r
+20823,20882,20881,20896,21070,21059,21066,21069,21068,21067,21063,21191,21193,\r
+21187,21185,21261,21335,21371,21402,21467,21676,21696,21672,21710,21705,21688,\r
+21670,21683,21703,21698,21693,21674,21697,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21700,21704,21679,21675,21681,21691,21673,\r
+21671,21695,22271,22402,22411,22432,22435,22434,22478,22446,22419,22869,22865,\r
+22863,22862,22864,23004,23000,23039,23011,23016,23043,23013,23018,23002,23014,\r
+23041,23035,23401,23459,23462,23460,23458,23461,23553,23630,23631,23629,23627,\r
+23769,23762,24055,24093,24101,24095,24189,24224,24230,24314,24328,24365,24421,\r
+24456,24453,24458,24459,24455,24460,24457,24594,24605,24608,24613,24590,24616,\r
+24653,24688,24680,24674,24646,24643,24684,24683,24682,24676,25153,25308,25366,\r
+25353,25340,25325,25345,25326,25341,25351,25329,25335,25327,25324,25342,25332,\r
+25361,25346,25919,25925,26027,26045,26082,26149,26157,26144,26151,26159,26143,\r
+26152,26161,26148,26359,26623,26579,26609,26580,26576,26604,26550,26543,26613,\r
+26601,26607,26564,26577,26548,26586,26597,26552,26575,26590,26611,26544,26585,\r
+26594,26589,26578,27498,27523,27526,27573,27602,27607,27679,27849,27915,27954,\r
+27946,27969,27941,27916,27953,27934,27927,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,27963,27965,27966,27958,27931,27893,27961,\r
+27943,27960,27945,27950,27957,27918,27947,28843,28858,28851,28844,28847,28845,\r
+28856,28846,28836,29232,29298,29295,29300,29417,29408,29409,29623,29642,29627,\r
+29618,29645,29632,29619,29978,29997,30031,30028,30030,30027,30123,30116,30117,\r
+30114,30115,30328,30342,30343,30344,30408,30406,30403,30405,30465,30457,30456,\r
+30473,30475,30462,30460,30471,30684,30722,30740,30732,30733,31046,31049,31048,\r
+31047,31161,31162,31185,31186,31179,31359,31361,31487,31485,31869,32002,32005,\r
+32000,32009,32007,32004,32006,32568,32654,32703,32772,32784,32781,32785,32822,\r
+32982,32997,32986,32963,32964,32972,32993,32987,32974,32990,32996,32989,33268,\r
+33314,33511,33539,33541,33507,33499,33510,33540,33509,33538,33545,33490,33495,\r
+33521,33537,33500,33492,33489,33502,33491,33503,33519,33542,34384,34425,34427,\r
+34426,34893,34923,35201,35284,35336,35330,35331,35998,36000,36212,36211,36276,\r
+36557,36556,36848,36838,36834,36842,36837,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,36845,36843,36836,36840,37066,37070,37057,\r
+37059,37195,37194,37325,38274,38480,38475,38476,38477,38754,38761,38859,38893,\r
+38899,38913,39080,39131,39135,39318,39321,20056,20147,20492,20493,20515,20463,\r
+20518,20517,20472,20521,20502,20486,20540,20511,20506,20498,20497,20474,20480,\r
+20500,20520,20465,20513,20491,20505,20504,20467,20462,20525,20522,20478,20523,\r
+20489,20860,20900,20901,20898,20941,20940,20934,20939,21078,21084,21076,21083,\r
+21085,21290,21375,21407,21405,21471,21736,21776,21761,21815,21756,21733,21746,\r
+21766,21754,21780,21737,21741,21729,21769,21742,21738,21734,21799,21767,21757,\r
+21775,22275,22276,22466,22484,22475,22467,22537,22799,22871,22872,22874,23057,\r
+23064,23068,23071,23067,23059,23020,23072,23075,23081,23077,23052,23049,23403,\r
+23640,23472,23475,23478,23476,23470,23477,23481,23480,23556,23633,23637,23632,\r
+23789,23805,23803,23786,23784,23792,23798,23809,23796,24046,24109,24107,24235,\r
+24237,24231,24369,24466,24465,24464,24665,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24675,24677,24656,24661,24685,24681,24687,\r
+24708,24735,24730,24717,24724,24716,24709,24726,25159,25331,25352,25343,25422,\r
+25406,25391,25429,25410,25414,25423,25417,25402,25424,25405,25386,25387,25384,\r
+25421,25420,25928,25929,26009,26049,26053,26178,26185,26191,26179,26194,26188,\r
+26181,26177,26360,26388,26389,26391,26657,26680,26696,26694,26707,26681,26690,\r
+26708,26665,26803,26647,26700,26705,26685,26612,26704,26688,26684,26691,26666,\r
+26693,26643,26648,26689,27530,27529,27575,27683,27687,27688,27686,27684,27888,\r
+28010,28053,28040,28039,28006,28024,28023,27993,28051,28012,28041,28014,27994,\r
+28020,28009,28044,28042,28025,28037,28005,28052,28874,28888,28900,28889,28872,\r
+28879,29241,29305,29436,29433,29437,29432,29431,29574,29677,29705,29678,29664,\r
+29674,29662,30036,30045,30044,30042,30041,30142,30149,30151,30130,30131,30141,\r
+30140,30137,30146,30136,30347,30384,30410,30413,30414,30505,30495,30496,30504,\r
+30697,30768,30759,30776,30749,30772,30775,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30757,30765,30752,30751,30770,31061,31056,\r
+31072,31071,31062,31070,31069,31063,31066,31204,31203,31207,31199,31206,31209,\r
+31192,31364,31368,31449,31494,31505,31881,32033,32023,32011,32010,32032,32034,\r
+32020,32016,32021,32026,32028,32013,32025,32027,32570,32607,32660,32709,32705,\r
+32774,32792,32789,32793,32791,32829,32831,33009,33026,33008,33029,33005,33012,\r
+33030,33016,33011,33032,33021,33034,33020,33007,33261,33260,33280,33296,33322,\r
+33323,33320,33324,33467,33579,33618,33620,33610,33592,33616,33609,33589,33588,\r
+33615,33586,33593,33590,33559,33600,33585,33576,33603,34388,34442,34474,34451,\r
+34468,34473,34444,34467,34460,34928,34935,34945,34946,34941,34937,35352,35344,\r
+35342,35340,35349,35338,35351,35347,35350,35343,35345,35912,35962,35961,36001,\r
+36002,36215,36524,36562,36564,36559,36785,36865,36870,36855,36864,36858,36852,\r
+36867,36861,36869,36856,37013,37089,37085,37090,37202,37197,37196,37336,37341,\r
+37335,37340,37337,38275,38498,38499,38497,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38491,38493,38500,38488,38494,38587,39138,\r
+39340,39592,39640,39717,39730,39740,20094,20602,20605,20572,20551,20547,20556,\r
+20570,20553,20581,20598,20558,20565,20597,20596,20599,20559,20495,20591,20589,\r
+20828,20885,20976,21098,21103,21202,21209,21208,21205,21264,21263,21273,21311,\r
+21312,21310,21443,26364,21830,21866,21862,21828,21854,21857,21827,21834,21809,\r
+21846,21839,21845,21807,21860,21816,21806,21852,21804,21859,21811,21825,21847,\r
+22280,22283,22281,22495,22533,22538,22534,22496,22500,22522,22530,22581,22519,\r
+22521,22816,22882,23094,23105,23113,23142,23146,23104,23100,23138,23130,23110,\r
+23114,23408,23495,23493,23492,23490,23487,23494,23561,23560,23559,23648,23644,\r
+23645,23815,23814,23822,23835,23830,23842,23825,23849,23828,23833,23844,23847,\r
+23831,24034,24120,24118,24115,24119,24247,24248,24246,24245,24254,24373,24375,\r
+24407,24428,24425,24427,24471,24473,24478,24472,24481,24480,24476,24703,24739,\r
+24713,24736,24744,24779,24756,24806,24765,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24773,24763,24757,24796,24764,24792,24789,\r
+24774,24799,24760,24794,24775,25114,25115,25160,25504,25511,25458,25494,25506,\r
+25509,25463,25447,25496,25514,25457,25513,25481,25475,25499,25451,25512,25476,\r
+25480,25497,25505,25516,25490,25487,25472,25467,25449,25448,25466,25949,25942,\r
+25937,25945,25943,21855,25935,25944,25941,25940,26012,26011,26028,26063,26059,\r
+26060,26062,26205,26202,26212,26216,26214,26206,26361,21207,26395,26753,26799,\r
+26786,26771,26805,26751,26742,26801,26791,26775,26800,26755,26820,26797,26758,\r
+26757,26772,26781,26792,26783,26785,26754,27442,27578,27627,27628,27691,28046,\r
+28092,28147,28121,28082,28129,28108,28132,28155,28154,28165,28103,28107,28079,\r
+28113,28078,28126,28153,28088,28151,28149,28101,28114,28186,28085,28122,28139,\r
+28120,28138,28145,28142,28136,28102,28100,28074,28140,28095,28134,28921,28937,\r
+28938,28925,28911,29245,29309,29313,29468,29467,29462,29459,29465,29575,29701,\r
+29706,29699,29702,29694,29709,29920,29942,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29943,29980,29986,30053,30054,30050,30064,\r
+30095,30164,30165,30133,30154,30157,30350,30420,30418,30427,30519,30526,30524,\r
+30518,30520,30522,30827,30787,30798,31077,31080,31085,31227,31378,31381,31520,\r
+31528,31515,31532,31526,31513,31518,31534,31890,31895,31893,32070,32067,32113,\r
+32046,32057,32060,32064,32048,32051,32068,32047,32066,32050,32049,32573,32670,\r
+32666,32716,32718,32722,32796,32842,32838,33071,33046,33059,33067,33065,33072,\r
+33060,33282,33333,33335,33334,33337,33678,33694,33688,33656,33698,33686,33725,\r
+33707,33682,33674,33683,33673,33696,33655,33659,33660,33670,33703,34389,24426,\r
+34503,34496,34486,34500,34485,34502,34507,34481,34479,34505,34899,34974,34952,\r
+34987,34962,34966,34957,34955,35219,35215,35370,35357,35363,35365,35377,35373,\r
+35359,35355,35362,35913,35930,36009,36012,36011,36008,36010,36007,36199,36198,\r
+36286,36282,36571,36575,36889,36877,36890,36887,36899,36895,36893,36880,36885,\r
+36894,36896,36879,36898,36886,36891,36884,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,37096,37101,37117,37207,37326,37365,37350,\r
+37347,37351,37357,37353,38281,38506,38517,38515,38520,38512,38516,38518,38519,\r
+38508,38592,38634,38633,31456,31455,38914,38915,39770,40165,40565,40575,40613,\r
+40635,20642,20621,20613,20633,20625,20608,20630,20632,20634,26368,20977,21106,\r
+21108,21109,21097,21214,21213,21211,21338,21413,21883,21888,21927,21884,21898,\r
+21917,21912,21890,21916,21930,21908,21895,21899,21891,21939,21934,21919,21822,\r
+21938,21914,21947,21932,21937,21886,21897,21931,21913,22285,22575,22570,22580,\r
+22564,22576,22577,22561,22557,22560,22777,22778,22880,23159,23194,23167,23186,\r
+23195,23207,23411,23409,23506,23500,23507,23504,23562,23563,23601,23884,23888,\r
+23860,23879,24061,24133,24125,24128,24131,24190,24266,24257,24258,24260,24380,\r
+24429,24489,24490,24488,24785,24801,24754,24758,24800,24860,24867,24826,24853,\r
+24816,24827,24820,24936,24817,24846,24822,24841,24832,24850,25119,25161,25507,\r
+25484,25551,25536,25577,25545,25542,25549,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25554,25571,25552,25569,25558,25581,25582,\r
+25462,25588,25578,25563,25682,25562,25593,25950,25958,25954,25955,26001,26000,\r
+26031,26222,26224,26228,26230,26223,26257,26234,26238,26231,26366,26367,26399,\r
+26397,26874,26837,26848,26840,26839,26885,26847,26869,26862,26855,26873,26834,\r
+26866,26851,26827,26829,26893,26898,26894,26825,26842,26990,26875,27454,27450,\r
+27453,27544,27542,27580,27631,27694,27695,27692,28207,28216,28244,28193,28210,\r
+28263,28234,28192,28197,28195,28187,28251,28248,28196,28246,28270,28205,28198,\r
+28271,28212,28237,28218,28204,28227,28189,28222,28363,28297,28185,28238,28259,\r
+28228,28274,28265,28255,28953,28954,28966,28976,28961,28982,29038,28956,29260,\r
+29316,29312,29494,29477,29492,29481,29754,29738,29747,29730,29733,29749,29750,\r
+29748,29743,29723,29734,29736,29989,29990,30059,30058,30178,30171,30179,30169,\r
+30168,30174,30176,30331,30332,30358,30355,30388,30428,30543,30701,30813,30828,\r
+30831,31245,31240,31243,31237,31232,31384,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31383,31382,31461,31459,31561,31574,31558,\r
+31568,31570,31572,31565,31563,31567,31569,31903,31909,32094,32080,32104,32085,\r
+32043,32110,32114,32097,32102,32098,32112,32115,21892,32724,32725,32779,32850,\r
+32901,33109,33108,33099,33105,33102,33081,33094,33086,33100,33107,33140,33298,\r
+33308,33769,33795,33784,33805,33760,33733,33803,33729,33775,33777,33780,33879,\r
+33802,33776,33804,33740,33789,33778,33738,33848,33806,33796,33756,33799,33748,\r
+33759,34395,34527,34521,34541,34516,34523,34532,34512,34526,34903,35009,35010,\r
+34993,35203,35222,35387,35424,35413,35422,35388,35393,35412,35419,35408,35398,\r
+35380,35386,35382,35414,35937,35970,36015,36028,36019,36029,36033,36027,36032,\r
+36020,36023,36022,36031,36024,36234,36229,36225,36302,36317,36299,36314,36305,\r
+36300,36315,36294,36603,36600,36604,36764,36910,36917,36913,36920,36914,36918,\r
+37122,37109,37129,37118,37219,37221,37327,37396,37397,37411,37385,37406,37389,\r
+37392,37383,37393,38292,38287,38283,38289,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38291,38290,38286,38538,38542,38539,38525,\r
+38533,38534,38541,38514,38532,38593,38597,38596,38598,38599,38639,38642,38860,\r
+38917,38918,38920,39143,39146,39151,39145,39154,39149,39342,39341,40643,40653,\r
+40657,20098,20653,20661,20658,20659,20677,20670,20652,20663,20667,20655,20679,\r
+21119,21111,21117,21215,21222,21220,21218,21219,21295,21983,21992,21971,21990,\r
+21966,21980,21959,21969,21987,21988,21999,21978,21985,21957,21958,21989,21961,\r
+22290,22291,22622,22609,22616,22615,22618,22612,22635,22604,22637,22602,22626,\r
+22610,22603,22887,23233,23241,23244,23230,23229,23228,23219,23234,23218,23913,\r
+23919,24140,24185,24265,24264,24338,24409,24492,24494,24858,24847,24904,24863,\r
+24819,24859,24825,24833,24840,24910,24908,24900,24909,24894,24884,24871,24845,\r
+24838,24887,25121,25122,25619,25662,25630,25642,25645,25661,25644,25615,25628,\r
+25620,25613,25654,25622,25623,25606,25964,26015,26032,26263,26249,26247,26248,\r
+26262,26244,26264,26253,26371,27028,26989,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26970,26999,26976,26964,26997,26928,27010,\r
+26954,26984,26987,26974,26963,27001,27014,26973,26979,26971,27463,27506,27584,\r
+27583,27603,27645,28322,28335,28371,28342,28354,28304,28317,28359,28357,28325,\r
+28312,28348,28346,28331,28369,28310,28316,28356,28372,28330,28327,28340,29006,\r
+29017,29033,29028,29001,29031,29020,29036,29030,29004,29029,29022,28998,29032,\r
+29014,29242,29266,29495,29509,29503,29502,29807,29786,29781,29791,29790,29761,\r
+29759,29785,29787,29788,30070,30072,30208,30192,30209,30194,30193,30202,30207,\r
+30196,30195,30430,30431,30555,30571,30566,30558,30563,30585,30570,30572,30556,\r
+30565,30568,30562,30702,30862,30896,30871,30872,30860,30857,30844,30865,30867,\r
+30847,31098,31103,31105,33836,31165,31260,31258,31264,31252,31263,31262,31391,\r
+31392,31607,31680,31584,31598,31591,31921,31923,31925,32147,32121,32145,32129,\r
+32143,32091,32622,32617,32618,32626,32681,32680,32676,32854,32856,32902,32900,\r
+33137,33136,33144,33125,33134,33139,33131,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33145,33146,33126,33285,33351,33922,33911,\r
+33853,33841,33909,33894,33899,33865,33900,33883,33852,33845,33889,33891,33897,\r
+33901,33862,34398,34396,34399,34553,34579,34568,34567,34560,34558,34555,34562,\r
+34563,34566,34570,34905,35039,35028,35033,35036,35032,35037,35041,35018,35029,\r
+35026,35228,35299,35435,35442,35443,35430,35433,35440,35463,35452,35427,35488,\r
+35441,35461,35437,35426,35438,35436,35449,35451,35390,35432,35938,35978,35977,\r
+36042,36039,36040,36036,36018,36035,36034,36037,36321,36319,36328,36335,36339,\r
+36346,36330,36324,36326,36530,36611,36617,36606,36618,36767,36786,36939,36938,\r
+36947,36930,36948,36924,36949,36944,36935,36943,36942,36941,36945,36926,36929,\r
+37138,37143,37228,37226,37225,37321,37431,37463,37432,37437,37440,37438,37467,\r
+37451,37476,37457,37428,37449,37453,37445,37433,37439,37466,38296,38552,38548,\r
+38549,38605,38603,38601,38602,38647,38651,38649,38646,38742,38772,38774,38928,\r
+38929,38931,38922,38930,38924,39164,39156,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,39165,39166,39347,39345,39348,39649,40169,\r
+40578,40718,40723,40736,20711,20718,20709,20694,20717,20698,20693,20687,20689,\r
+20721,20686,20713,20834,20979,21123,21122,21297,21421,22014,22016,22043,22039,\r
+22013,22036,22022,22025,22029,22030,22007,22038,22047,22024,22032,22006,22296,\r
+22294,22645,22654,22659,22675,22666,22649,22661,22653,22781,22821,22818,22820,\r
+22890,22889,23265,23270,23273,23255,23254,23256,23267,23413,23518,23527,23521,\r
+23525,23526,23528,23522,23524,23519,23565,23650,23940,23943,24155,24163,24149,\r
+24151,24148,24275,24278,24330,24390,24432,24505,24903,24895,24907,24951,24930,\r
+24931,24927,24922,24920,24949,25130,25735,25688,25684,25764,25720,25695,25722,\r
+25681,25703,25652,25709,25723,25970,26017,26071,26070,26274,26280,26269,27036,\r
+27048,27029,27073,27054,27091,27083,27035,27063,27067,27051,27060,27088,27085,\r
+27053,27084,27046,27075,27043,27465,27468,27699,28467,28436,28414,28435,28404,\r
+28457,28478,28448,28460,28431,28418,28450,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28415,28399,28422,28465,28472,28466,28451,\r
+28437,28459,28463,28552,28458,28396,28417,28402,28364,28407,29076,29081,29053,\r
+29066,29060,29074,29246,29330,29334,29508,29520,29796,29795,29802,29808,29805,\r
+29956,30097,30247,30221,30219,30217,30227,30433,30435,30596,30589,30591,30561,\r
+30913,30879,30887,30899,30889,30883,31118,31119,31117,31278,31281,31402,31401,\r
+31469,31471,31649,31637,31627,31605,31639,31645,31636,31631,31672,31623,31620,\r
+31929,31933,31934,32187,32176,32156,32189,32190,32160,32202,32180,32178,32177,\r
+32186,32162,32191,32181,32184,32173,32210,32199,32172,32624,32736,32737,32735,\r
+32862,32858,32903,33104,33152,33167,33160,33162,33151,33154,33255,33274,33287,\r
+33300,33310,33355,33993,33983,33990,33988,33945,33950,33970,33948,33995,33976,\r
+33984,34003,33936,33980,34001,33994,34623,34588,34619,34594,34597,34612,34584,\r
+34645,34615,34601,35059,35074,35060,35065,35064,35069,35048,35098,35055,35494,\r
+35468,35486,35491,35469,35489,35475,35492,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,35498,35493,35496,35480,35473,35482,35495,\r
+35946,35981,35980,36051,36049,36050,36203,36249,36245,36348,36628,36626,36629,\r
+36627,36771,36960,36952,36956,36963,36953,36958,36962,36957,36955,37145,37144,\r
+37150,37237,37240,37239,37236,37496,37504,37509,37528,37526,37499,37523,37532,\r
+37544,37500,37521,38305,38312,38313,38307,38309,38308,38553,38556,38555,38604,\r
+38610,38656,38780,38789,38902,38935,38936,39087,39089,39171,39173,39180,39177,\r
+39361,39599,39600,39654,39745,39746,40180,40182,40179,40636,40763,40778,20740,\r
+20736,20731,20725,20729,20738,20744,20745,20741,20956,21127,21128,21129,21133,\r
+21130,21232,21426,22062,22075,22073,22066,22079,22068,22057,22099,22094,22103,\r
+22132,22070,22063,22064,22656,22687,22686,22707,22684,22702,22697,22694,22893,\r
+23305,23291,23307,23285,23308,23304,23534,23532,23529,23531,23652,23653,23965,\r
+23956,24162,24159,24161,24290,24282,24287,24285,24291,24288,24392,24433,24503,\r
+24501,24950,24935,24942,24925,24917,24962,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24956,24944,24939,24958,24999,24976,25003,\r
+24974,25004,24986,24996,24980,25006,25134,25705,25711,25721,25758,25778,25736,\r
+25744,25776,25765,25747,25749,25769,25746,25774,25773,25771,25754,25772,25753,\r
+25762,25779,25973,25975,25976,26286,26283,26292,26289,27171,27167,27112,27137,\r
+27166,27161,27133,27169,27155,27146,27123,27138,27141,27117,27153,27472,27470,\r
+27556,27589,27590,28479,28540,28548,28497,28518,28500,28550,28525,28507,28536,\r
+28526,28558,28538,28528,28516,28567,28504,28373,28527,28512,28511,29087,29100,\r
+29105,29096,29270,29339,29518,29527,29801,29835,29827,29822,29824,30079,30240,\r
+30249,30239,30244,30246,30241,30242,30362,30394,30436,30606,30599,30604,30609,\r
+30603,30923,30917,30906,30922,30910,30933,30908,30928,31295,31292,31296,31293,\r
+31287,31291,31407,31406,31661,31665,31684,31668,31686,31687,31681,31648,31692,\r
+31946,32224,32244,32239,32251,32216,32236,32221,32232,32227,32218,32222,32233,\r
+32158,32217,32242,32249,32629,32631,32687,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,32745,32806,33179,33180,33181,33184,33178,\r
+33176,34071,34109,34074,34030,34092,34093,34067,34065,34083,34081,34068,34028,\r
+34085,34047,34054,34690,34676,34678,34656,34662,34680,34664,34649,34647,34636,\r
+34643,34907,34909,35088,35079,35090,35091,35093,35082,35516,35538,35527,35524,\r
+35477,35531,35576,35506,35529,35522,35519,35504,35542,35533,35510,35513,35547,\r
+35916,35918,35948,36064,36062,36070,36068,36076,36077,36066,36067,36060,36074,\r
+36065,36205,36255,36259,36395,36368,36381,36386,36367,36393,36383,36385,36382,\r
+36538,36637,36635,36639,36649,36646,36650,36636,36638,36645,36969,36974,36968,\r
+36973,36983,37168,37165,37159,37169,37255,37257,37259,37251,37573,37563,37559,\r
+37610,37548,37604,37569,37555,37564,37586,37575,37616,37554,38317,38321,38660,\r
+38662,38663,38665,38752,38797,38795,38799,38945,38955,38940,39091,39178,39187,\r
+39186,39192,39389,39376,39391,39387,39377,39381,39378,39385,39607,39662,39663,\r
+39719,39749,39748,39799,39791,40198,40201,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40195,40617,40638,40654,22696,40786,20754,\r
+20760,20756,20752,20757,20864,20906,20957,21137,21139,21235,22105,22123,22137,\r
+22121,22116,22136,22122,22120,22117,22129,22127,22124,22114,22134,22721,22718,\r
+22727,22725,22894,23325,23348,23416,23536,23566,24394,25010,24977,25001,24970,\r
+25037,25014,25022,25034,25032,25136,25797,25793,25803,25787,25788,25818,25796,\r
+25799,25794,25805,25791,25810,25812,25790,25972,26310,26313,26297,26308,26311,\r
+26296,27197,27192,27194,27225,27243,27224,27193,27204,27234,27233,27211,27207,\r
+27189,27231,27208,27481,27511,27653,28610,28593,28577,28611,28580,28609,28583,\r
+28595,28608,28601,28598,28582,28576,28596,29118,29129,29136,29138,29128,29141,\r
+29113,29134,29145,29148,29123,29124,29544,29852,29859,29848,29855,29854,29922,\r
+29964,29965,30260,30264,30266,30439,30437,30624,30622,30623,30629,30952,30938,\r
+30956,30951,31142,31309,31310,31302,31308,31307,31418,31705,31761,31689,31716,\r
+31707,31713,31721,31718,31957,31958,32266,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,32273,32264,32283,32291,32286,32285,32265,\r
+32272,32633,32690,32752,32753,32750,32808,33203,33193,33192,33275,33288,33368,\r
+33369,34122,34137,34120,34152,34153,34115,34121,34157,34154,34142,34691,34719,\r
+34718,34722,34701,34913,35114,35122,35109,35115,35105,35242,35238,35558,35578,\r
+35563,35569,35584,35548,35559,35566,35582,35585,35586,35575,35565,35571,35574,\r
+35580,35947,35949,35987,36084,36420,36401,36404,36418,36409,36405,36667,36655,\r
+36664,36659,36776,36774,36981,36980,36984,36978,36988,36986,37172,37266,37664,\r
+37686,37624,37683,37679,37666,37628,37675,37636,37658,37648,37670,37665,37653,\r
+37678,37657,38331,38567,38568,38570,38613,38670,38673,38678,38669,38675,38671,\r
+38747,38748,38758,38808,38960,38968,38971,38967,38957,38969,38948,39184,39208,\r
+39198,39195,39201,39194,39405,39394,39409,39608,39612,39675,39661,39720,39825,\r
+40213,40227,40230,40232,40210,40219,40664,40660,40845,40860,20778,20767,20769,\r
+20786,21237,22158,22144,22160,22149,22151,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22159,22741,22739,22737,22734,23344,23338,\r
+23332,23418,23607,23656,23996,23994,23997,23992,24171,24396,24509,25033,25026,\r
+25031,25062,25035,25138,25140,25806,25802,25816,25824,25840,25830,25836,25841,\r
+25826,25837,25986,25987,26329,26326,27264,27284,27268,27298,27292,27355,27299,\r
+27262,27287,27280,27296,27484,27566,27610,27656,28632,28657,28639,28640,28635,\r
+28644,28651,28655,28544,28652,28641,28649,28629,28654,28656,29159,29151,29166,\r
+29158,29157,29165,29164,29172,29152,29237,29254,29552,29554,29865,29872,29862,\r
+29864,30278,30274,30284,30442,30643,30634,30640,30636,30631,30637,30703,30967,\r
+30970,30964,30959,30977,31143,31146,31319,31423,31751,31757,31742,31735,31756,\r
+31712,31968,31964,31966,31970,31967,31961,31965,32302,32318,32326,32311,32306,\r
+32323,32299,32317,32305,32325,32321,32308,32313,32328,32309,32319,32303,32580,\r
+32755,32764,32881,32882,32880,32879,32883,33222,33219,33210,33218,33216,33215,\r
+33213,33225,33214,33256,33289,33393,34218,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34180,34174,34204,34193,34196,34223,34203,\r
+34183,34216,34186,34407,34752,34769,34739,34770,34758,34731,34747,34746,34760,\r
+34763,35131,35126,35140,35128,35133,35244,35598,35607,35609,35611,35594,35616,\r
+35613,35588,35600,35905,35903,35955,36090,36093,36092,36088,36091,36264,36425,\r
+36427,36424,36426,36676,36670,36674,36677,36671,36991,36989,36996,36993,36994,\r
+36992,37177,37283,37278,37276,37709,37762,37672,37749,37706,37733,37707,37656,\r
+37758,37740,37723,37744,37722,37716,38346,38347,38348,38344,38342,38577,38584,\r
+38614,38684,38686,38816,38867,38982,39094,39221,39425,39423,39854,39851,39850,\r
+39853,40251,40255,40587,40655,40670,40668,40669,40667,40766,40779,21474,22165,\r
+22190,22745,22744,23352,24413,25059,25139,25844,25842,25854,25862,25850,25851,\r
+25847,26039,26332,26406,27315,27308,27331,27323,27320,27330,27310,27311,27487,\r
+27512,27567,28681,28683,28670,28678,28666,28689,28687,29179,29180,29182,29176,\r
+29559,29557,29863,29887,29973,30294,30296,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30290,30653,30655,30651,30652,30990,31150,\r
+31329,31330,31328,31428,31429,31787,31783,31786,31774,31779,31777,31975,32340,\r
+32341,32350,32346,32353,32338,32345,32584,32761,32763,32887,32886,33229,33231,\r
+33290,34255,34217,34253,34256,34249,34224,34234,34233,34214,34799,34796,34802,\r
+34784,35206,35250,35316,35624,35641,35628,35627,35920,36101,36441,36451,36454,\r
+36452,36447,36437,36544,36681,36685,36999,36995,37000,37291,37292,37328,37780,\r
+37770,37782,37794,37811,37806,37804,37808,37784,37786,37783,38356,38358,38352,\r
+38357,38626,38620,38617,38619,38622,38692,38819,38822,38829,38905,38989,38991,\r
+38988,38990,38995,39098,39230,39231,39229,39214,39333,39438,39617,39683,39686,\r
+39759,39758,39757,39882,39881,39933,39880,39872,40273,40285,40288,40672,40725,\r
+40748,20787,22181,22750,22751,22754,23541,40848,24300,25074,25079,25078,25077,\r
+25856,25871,26336,26333,27365,27357,27354,27347,28699,28703,28712,28698,28701,\r
+28693,28696,29190,29197,29272,29346,29560,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29562,29885,29898,29923,30087,30086,30303,\r
+30305,30663,31001,31153,31339,31337,31806,31807,31800,31805,31799,31808,32363,\r
+32365,32377,32361,32362,32645,32371,32694,32697,32696,33240,34281,34269,34282,\r
+34261,34276,34277,34295,34811,34821,34829,34809,34814,35168,35167,35158,35166,\r
+35649,35676,35672,35657,35674,35662,35663,35654,35673,36104,36106,36476,36466,\r
+36487,36470,36460,36474,36468,36692,36686,36781,37002,37003,37297,37294,37857,\r
+37841,37855,37827,37832,37852,37853,37846,37858,37837,37848,37860,37847,37864,\r
+38364,38580,38627,38698,38695,38753,38876,38907,39006,39000,39003,39100,39237,\r
+39241,39446,39449,39693,39912,39911,39894,39899,40329,40289,40306,40298,40300,\r
+40594,40599,40595,40628,21240,22184,22199,22198,22196,22204,22756,23360,23363,\r
+23421,23542,24009,25080,25082,25880,25876,25881,26342,26407,27372,28734,28720,\r
+28722,29200,29563,29903,30306,30309,31014,31018,31020,31019,31431,31478,31820,\r
+31811,31821,31983,31984,36782,32381,32380,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,32386,32588,32768,33242,33382,34299,34297,\r
+34321,34298,34310,34315,34311,34314,34836,34837,35172,35258,35320,35696,35692,\r
+35686,35695,35679,35691,36111,36109,36489,36481,36485,36482,37300,37323,37912,\r
+37891,37885,38369,38704,39108,39250,39249,39336,39467,39472,39479,39477,39955,\r
+39949,40569,40629,40680,40751,40799,40803,40801,20791,20792,22209,22208,22210,\r
+22804,23660,24013,25084,25086,25885,25884,26005,26345,27387,27396,27386,27570,\r
+28748,29211,29351,29910,29908,30313,30675,31824,32399,32396,32700,34327,34349,\r
+34330,34851,34850,34849,34847,35178,35180,35261,35700,35703,35709,36115,36490,\r
+36493,36491,36703,36783,37306,37934,37939,37941,37946,37944,37938,37931,38370,\r
+38712,38713,38706,38911,39015,39013,39255,39493,39491,39488,39486,39631,39764,\r
+39761,39981,39973,40367,40372,40386,40376,40605,40687,40729,40796,40806,40807,\r
+20796,20795,22216,22218,22217,23423,24020,24018,24398,25087,25892,27402,27489,\r
+28753,28760,29568,29924,30090,30318,30316,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31155,31840,31839,32894,32893,33247,35186,\r
+35183,35324,35712,36118,36119,36497,36499,36705,37192,37956,37969,37970,38717,\r
+38718,38851,38849,39019,39253,39509,39501,39634,39706,40009,39985,39998,39995,\r
+40403,40407,40756,40812,40810,40852,22220,24022,25088,25891,25899,25898,26348,\r
+27408,29914,31434,31844,31843,31845,32403,32406,32404,33250,34360,34367,34865,\r
+35722,37008,37007,37987,37984,37988,38760,39023,39260,39514,39515,39511,39635,\r
+39636,39633,40020,40023,40022,40421,40607,40692,22225,22761,25900,28766,30321,\r
+30322,30679,32592,32648,34870,34873,34914,35731,35730,35734,33399,36123,37312,\r
+37994,38722,38728,38724,38854,39024,39519,39714,39768,40031,40441,40442,40572,\r
+40573,40711,40823,40818,24307,27414,28771,31852,31854,34875,35264,36513,37313,\r
+38002,38000,39025,39262,39638,39715,40652,28772,30682,35738,38007,38857,39522,\r
+39525,32412,35740,36522,37317,38013,38014,38012,40055,40056,40695,35924,38015,\r
+40474,29224,39530,39729,40475,40478,31858,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12542,12445,12446,12293,12353,12354,12355,\r
+12356,12357,12358,12359,12360,12361,12362,12363,12364,12365,12366,12367,12368,\r
+12369,12370,12371,12372,12373,12374,12375,12376,12377,12378,12379,12380,12381,\r
+12382,12383,12384,12385,12386,12387,12388,12389,12390,12391,12392,12393,12394,\r
+12395,12396,12397,12398,12399,12400,12401,12402,12403,12404,12405,12406,12407,\r
+12408,12409,12410,12411,12412,12413,12414,12415,12416,12417,12418,12419,12420,\r
+12421,12422,12423,12424,12425,12426,12427,12428,12429,12430,12431,12432,12433,\r
+12434,12435,12449,12450,12451,12452,12453,12454,12455,12456,12457,12458,12459,\r
+12460,12461,12462,12463,12464,12465,12466,12467,12468,12469,12470,12471,12472,\r
+12473,12474,12475,12476,12477,12478,12479,12480,12481,12482,12483,12484,12485,\r
+12486,12487,12488,12489,12490,12491,12492,12493,12494,12495,12496,12497,12498,\r
+12499,12500,12501,12502,12503,12504,12505,12506,12507,12508,12509,12510,12511,\r
+12512,12513,12514,12515,12516,12517,12518,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,12519,12520,12521,12522,12523,12524,12525,\r
+12526,12527,12528,12529,12530,12531,12532,12533,12534,1044,1045,1025,1046,\r
+1047,1048,1049,1050,1051,1052,1059,1060,1061,1062,1063,1064,1065,1066,1067,\r
+1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1105,1078,1079,1080,1081,\r
+1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,\r
+1097,1098,1099,1100,1101,1102,1103,9312,9313,9314,9315,9316,9317,9318,9319,\r
+9320,9321,9332,9333,9334,9335,9336,9337,9338,9339,9340,9341,20034,20060,20981,\r
+21274,21378,19975,19980,20039,20109,22231,64012,23662,24435,19983,20871,19982,\r
+20014,20115,20162,20169,20168,20888,21244,21356,21433,22304,22787,22828,23568,\r
+24063,26081,27571,27596,27668,29247,20017,20028,20200,20188,20201,20193,20189,\r
+20186,21004,21276,21324,22306,22307,22807,22831,23425,23428,23570,23611,23668,\r
+23667,24068,24192,24194,24521,25097,25168,27669,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,27702,27715,27711,27707,29358,29360,\r
+29578,31160,32906,38430,20238,20248,20268,20213,20244,20209,20224,20215,20232,\r
+20253,20226,20229,20258,20243,20228,20212,20242,20913,21011,21001,21008,21158,\r
+21282,21279,21325,21386,21511,22241,22239,22318,22314,22324,22844,22912,22908,\r
+22917,22907,22910,22903,22911,23382,23573,23589,23676,23674,23675,23678,24031,\r
+24181,24196,24322,24346,24436,24533,24532,24527,25180,25182,25188,25185,25190,\r
+25186,25177,25184,25178,25189,26095,26094,26430,26425,26424,26427,26426,26431,\r
+26428,26419,27672,27718,27730,27740,27727,27722,27732,27723,27724,28785,29278,\r
+29364,29365,29582,29994,30335,31349,32593,33400,33404,33408,33405,33407,34381,\r
+35198,37017,37015,37016,37019,37012,38434,38436,38432,38435,20310,20283,20322,\r
+20297,20307,20324,20286,20327,20306,20319,20289,20312,20269,20275,20287,20321,\r
+20879,20921,21020,21022,21025,21165,21166,21257,21347,21362,21390,21391,21552,\r
+21559,21546,21588,21573,21529,21532,21541,21528,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21565,21583,21569,21544,21540,21575,\r
+22254,22247,22245,22337,22341,22348,22345,22347,22354,22790,22848,22950,22936,\r
+22944,22935,22926,22946,22928,22927,22951,22945,23438,23442,23592,23594,23693,\r
+23695,23688,23691,23689,23698,23690,23686,23699,23701,24032,24074,24078,24203,\r
+24201,24204,24200,24205,24325,24349,24440,24438,24530,24529,24528,24557,24552,\r
+24558,24563,24545,24548,24547,24570,24559,24567,24571,24576,24564,25146,25219,\r
+25228,25230,25231,25236,25223,25201,25211,25210,25200,25217,25224,25207,25213,\r
+25202,25204,25911,26096,26100,26099,26098,26101,26437,26439,26457,26453,26444,\r
+26440,26461,26445,26458,26443,27600,27673,27674,27768,27751,27755,27780,27787,\r
+27791,27761,27759,27753,27802,27757,27783,27797,27804,27750,27763,27749,27771,\r
+27790,28788,28794,29283,29375,29373,29379,29382,29377,29370,29381,29589,29591,\r
+29587,29588,29586,30010,30009,30100,30101,30337,31037,32820,32917,32921,32912,\r
+32914,32924,33424,33423,33413,33422,33425,33427,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33418,33411,33412,35960,36809,36799,\r
+37023,37025,37029,37022,37031,37024,38448,38440,38447,38445,20019,20376,20348,\r
+20357,20349,20352,20359,20342,20340,20361,20356,20343,20300,20375,20330,20378,\r
+20345,20353,20344,20368,20380,20372,20382,20370,20354,20373,20331,20334,20894,\r
+20924,20926,21045,21042,21043,21062,21041,21180,21258,21259,21308,21394,21396,\r
+21639,21631,21633,21649,21634,21640,21611,21626,21630,21605,21612,21620,21606,\r
+21645,21615,21601,21600,21656,21603,21607,21604,22263,22265,22383,22386,22381,\r
+22379,22385,22384,22390,22400,22389,22395,22387,22388,22370,22376,22397,22796,\r
+22853,22965,22970,22991,22990,22962,22988,22977,22966,22972,22979,22998,22961,\r
+22973,22976,22984,22964,22983,23394,23397,23443,23445,23620,23623,23726,23716,\r
+23712,23733,23727,23720,23724,23711,23715,23725,23714,23722,23719,23709,23717,\r
+23734,23728,23718,24087,24084,24089,24360,24354,24355,24356,24404,24450,24446,\r
+24445,24542,24549,24621,24614,24601,24626,24587,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24628,24586,24599,24627,24602,24606,\r
+24620,24610,24589,24592,24622,24595,24593,24588,24585,24604,25108,25149,25261,\r
+25268,25297,25278,25258,25270,25290,25262,25267,25263,25275,25257,25264,25272,\r
+25917,26024,26043,26121,26108,26116,26130,26120,26107,26115,26123,26125,26117,\r
+26109,26129,26128,26358,26378,26501,26476,26510,26514,26486,26491,26520,26502,\r
+26500,26484,26509,26508,26490,26527,26513,26521,26499,26493,26497,26488,26489,\r
+26516,27429,27520,27518,27614,27677,27795,27884,27883,27886,27865,27830,27860,\r
+27821,27879,27831,27856,27842,27834,27843,27846,27885,27890,27858,27869,27828,\r
+27786,27805,27776,27870,27840,27952,27853,27847,27824,27897,27855,27881,27857,\r
+28820,28824,28805,28819,28806,28804,28817,28822,28802,28826,28803,29290,29398,\r
+29387,29400,29385,29404,29394,29396,29402,29388,29393,29604,29601,29613,29606,\r
+29602,29600,29612,29597,29917,29928,30015,30016,30014,30092,30104,30383,30451,\r
+30449,30448,30453,30712,30716,30713,30715,30714,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30711,31042,31039,31173,31352,31355,\r
+31483,31861,31997,32821,32911,32942,32931,32952,32949,32941,33312,33440,33472,\r
+33451,33434,33432,33435,33461,33447,33454,33468,33438,33466,33460,33448,33441,\r
+33449,33474,33444,33475,33462,33442,34416,34415,34413,34414,35926,36818,36811,\r
+36819,36813,36822,36821,36823,37042,37044,37039,37043,37040,38457,38461,38460,\r
+38458,38467,20429,20421,20435,20402,20425,20427,20417,20436,20444,20441,20411,\r
+20403,20443,20423,20438,20410,20416,20409,20460,21060,21065,21184,21186,21309,\r
+21372,21399,21398,21401,21400,21690,21665,21677,21669,21711,21699,33549,21687,\r
+21678,21718,21686,21701,21702,21664,21616,21692,21666,21694,21618,21726,21680,\r
+22453,22430,22431,22436,22412,22423,22429,22427,22420,22424,22415,22425,22437,\r
+22426,22421,22772,22797,22867,23009,23006,23022,23040,23025,23005,23034,23037,\r
+23036,23030,23012,23026,23031,23003,23017,23027,23029,23008,23038,23028,23021,\r
+23464,23628,23760,23768,23756,23767,23755,23771,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23774,23770,23753,23751,23754,23766,\r
+23763,23764,23759,23752,23750,23758,23775,23800,24057,24097,24098,24099,24096,\r
+24100,24240,24228,24226,24219,24227,24229,24327,24366,24406,24454,24631,24633,\r
+24660,24690,24670,24645,24659,24647,24649,24667,24652,24640,24642,24671,24612,\r
+24644,24664,24678,24686,25154,25155,25295,25357,25355,25333,25358,25347,25323,\r
+25337,25359,25356,25336,25334,25344,25363,25364,25338,25365,25339,25328,25921,\r
+25923,26026,26047,26166,26145,26162,26165,26140,26150,26146,26163,26155,26170,\r
+26141,26164,26169,26158,26383,26384,26561,26610,26568,26554,26588,26555,26616,\r
+26584,26560,26551,26565,26603,26596,26591,26549,26573,26547,26615,26614,26606,\r
+26595,26562,26553,26574,26599,26608,26546,26620,26566,26605,26572,26542,26598,\r
+26587,26618,26569,26570,26563,26602,26571,27432,27522,27524,27574,27606,27608,\r
+27616,27680,27681,27944,27956,27949,27935,27964,27967,27922,27914,27866,27955,\r
+27908,27929,27962,27930,27921,27904,27933,27970,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,27905,27928,27959,27907,27919,27968,\r
+27911,27936,27948,27912,27938,27913,27920,28855,28831,28862,28849,28848,28833,\r
+28852,28853,28841,29249,29257,29258,29292,29296,29299,29294,29386,29412,29416,\r
+29419,29407,29418,29414,29411,29573,29644,29634,29640,29637,29625,29622,29621,\r
+29620,29675,29631,29639,29630,29635,29638,29624,29643,29932,29934,29998,30023,\r
+30024,30119,30122,30329,30404,30472,30467,30468,30469,30474,30455,30459,30458,\r
+30695,30696,30726,30737,30738,30725,30736,30735,30734,30729,30723,30739,31050,\r
+31052,31051,31045,31044,31189,31181,31183,31190,31182,31360,31358,31441,31488,\r
+31489,31866,31864,31865,31871,31872,31873,32003,32008,32001,32600,32657,32653,\r
+32702,32775,32782,32783,32788,32823,32984,32967,32992,32977,32968,32962,32976,\r
+32965,32995,32985,32988,32970,32981,32969,32975,32983,32998,32973,33279,33313,\r
+33428,33497,33534,33529,33543,33512,33536,33493,33594,33515,33494,33524,33516,\r
+33505,33522,33525,33548,33531,33526,33520,33514,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33508,33504,33530,33523,33517,34423,\r
+34420,34428,34419,34881,34894,34919,34922,34921,35283,35332,35335,36210,36835,\r
+36833,36846,36832,37105,37053,37055,37077,37061,37054,37063,37067,37064,37332,\r
+37331,38484,38479,38481,38483,38474,38478,20510,20485,20487,20499,20514,20528,\r
+20507,20469,20468,20531,20535,20524,20470,20471,20503,20508,20512,20519,20533,\r
+20527,20529,20494,20826,20884,20883,20938,20932,20933,20936,20942,21089,21082,\r
+21074,21086,21087,21077,21090,21197,21262,21406,21798,21730,21783,21778,21735,\r
+21747,21732,21786,21759,21764,21768,21739,21777,21765,21745,21770,21755,21751,\r
+21752,21728,21774,21763,21771,22273,22274,22476,22578,22485,22482,22458,22470,\r
+22461,22460,22456,22454,22463,22471,22480,22457,22465,22798,22858,23065,23062,\r
+23085,23086,23061,23055,23063,23050,23070,23091,23404,23463,23469,23468,23555,\r
+23638,23636,23788,23807,23790,23793,23799,23808,23801,24105,24104,24232,24238,\r
+24234,24236,24371,24368,24423,24669,24666,24679,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24641,24738,24712,24704,24722,24705,\r
+24733,24707,24725,24731,24727,24711,24732,24718,25113,25158,25330,25360,25430,\r
+25388,25412,25413,25398,25411,25572,25401,25419,25418,25404,25385,25409,25396,\r
+25432,25428,25433,25389,25415,25395,25434,25425,25400,25431,25408,25416,25930,\r
+25926,26054,26051,26052,26050,26186,26207,26183,26193,26386,26387,26655,26650,\r
+26697,26674,26675,26683,26699,26703,26646,26673,26652,26677,26667,26669,26671,\r
+26702,26692,26676,26653,26642,26644,26662,26664,26670,26701,26682,26661,26656,\r
+27436,27439,27437,27441,27444,27501,32898,27528,27622,27620,27624,27619,27618,\r
+27623,27685,28026,28003,28004,28022,27917,28001,28050,27992,28002,28013,28015,\r
+28049,28045,28143,28031,28038,27998,28007,28000,28055,28016,28028,27999,28034,\r
+28056,27951,28008,28043,28030,28032,28036,27926,28035,28027,28029,28021,28048,\r
+28892,28883,28881,28893,28875,32569,28898,28887,28882,28894,28896,28884,28877,\r
+28869,28870,28871,28890,28878,28897,29250,29304,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29303,29302,29440,29434,29428,29438,\r
+29430,29427,29435,29441,29651,29657,29669,29654,29628,29671,29667,29673,29660,\r
+29650,29659,29652,29661,29658,29655,29656,29672,29918,29919,29940,29941,29985,\r
+30043,30047,30128,30145,30139,30148,30144,30143,30134,30138,30346,30409,30493,\r
+30491,30480,30483,30482,30499,30481,30485,30489,30490,30498,30503,30755,30764,\r
+30754,30773,30767,30760,30766,30763,30753,30761,30771,30762,30769,31060,31067,\r
+31055,31068,31059,31058,31057,31211,31212,31200,31214,31213,31210,31196,31198,\r
+31197,31366,31369,31365,31371,31372,31370,31367,31448,31504,31492,31507,31493,\r
+31503,31496,31498,31502,31497,31506,31876,31889,31882,31884,31880,31885,31877,\r
+32030,32029,32017,32014,32024,32022,32019,32031,32018,32015,32012,32604,32609,\r
+32606,32608,32605,32603,32662,32658,32707,32706,32704,32790,32830,32825,33018,\r
+33010,33017,33013,33025,33019,33024,33281,33327,33317,33587,33581,33604,33561,\r
+33617,33573,33622,33599,33601,33574,33564,33570,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33602,33614,33563,33578,33544,33596,\r
+33613,33558,33572,33568,33591,33583,33577,33607,33605,33612,33619,33566,33580,\r
+33611,33575,33608,34387,34386,34466,34472,34454,34445,34449,34462,34439,34455,\r
+34438,34443,34458,34437,34469,34457,34465,34471,34453,34456,34446,34461,34448,\r
+34452,34883,34884,34925,34933,34934,34930,34944,34929,34943,34927,34947,34942,\r
+34932,34940,35346,35911,35927,35963,36004,36003,36214,36216,36277,36279,36278,\r
+36561,36563,36862,36853,36866,36863,36859,36868,36860,36854,37078,37088,37081,\r
+37082,37091,37087,37093,37080,37083,37079,37084,37092,37200,37198,37199,37333,\r
+37346,37338,38492,38495,38588,39139,39647,39727,20095,20592,20586,20577,20574,\r
+20576,20563,20555,20573,20594,20552,20557,20545,20571,20554,20578,20501,20549,\r
+20575,20585,20587,20579,20580,20550,20544,20590,20595,20567,20561,20944,21099,\r
+21101,21100,21102,21206,21203,21293,21404,21877,21878,21820,21837,21840,21812,\r
+21802,21841,21858,21814,21813,21808,21842,21829,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,21772,21810,21861,21838,21817,21832,\r
+21805,21819,21824,21835,22282,22279,22523,22548,22498,22518,22492,22516,22528,\r
+22509,22525,22536,22520,22539,22515,22479,22535,22510,22499,22514,22501,22508,\r
+22497,22542,22524,22544,22503,22529,22540,22513,22505,22512,22541,22532,22876,\r
+23136,23128,23125,23143,23134,23096,23093,23149,23120,23135,23141,23148,23123,\r
+23140,23127,23107,23133,23122,23108,23131,23112,23182,23102,23117,23097,23116,\r
+23152,23145,23111,23121,23126,23106,23132,23410,23406,23489,23488,23641,23838,\r
+23819,23837,23834,23840,23820,23848,23821,23846,23845,23823,23856,23826,23843,\r
+23839,23854,24126,24116,24241,24244,24249,24242,24243,24374,24376,24475,24470,\r
+24479,24714,24720,24710,24766,24752,24762,24787,24788,24783,24804,24793,24797,\r
+24776,24753,24795,24759,24778,24767,24771,24781,24768,25394,25445,25482,25474,\r
+25469,25533,25502,25517,25501,25495,25515,25486,25455,25479,25488,25454,25519,\r
+25461,25500,25453,25518,25468,25508,25403,25503,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25464,25477,25473,25489,25485,25456,\r
+25939,26061,26213,26209,26203,26201,26204,26210,26392,26745,26759,26768,26780,\r
+26733,26734,26798,26795,26966,26735,26787,26796,26793,26741,26740,26802,26767,\r
+26743,26770,26748,26731,26738,26794,26752,26737,26750,26779,26774,26763,26784,\r
+26761,26788,26744,26747,26769,26764,26762,26749,27446,27443,27447,27448,27537,\r
+27535,27533,27534,27532,27690,28096,28075,28084,28083,28276,28076,28137,28130,\r
+28087,28150,28116,28160,28104,28128,28127,28118,28094,28133,28124,28125,28123,\r
+28148,28106,28093,28141,28144,28090,28117,28098,28111,28105,28112,28146,28115,\r
+28157,28119,28109,28131,28091,28922,28941,28919,28951,28916,28940,28912,28932,\r
+28915,28944,28924,28927,28934,28947,28928,28920,28918,28939,28930,28942,29310,\r
+29307,29308,29311,29469,29463,29447,29457,29464,29450,29448,29439,29455,29470,\r
+29576,29686,29688,29685,29700,29697,29693,29703,29696,29690,29692,29695,29708,\r
+29707,29684,29704,30052,30051,30158,30162,30159,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30155,30156,30161,30160,30351,30345,\r
+30419,30521,30511,30509,30513,30514,30516,30515,30525,30501,30523,30517,30792,\r
+30802,30793,30797,30794,30796,30758,30789,30800,31076,31079,31081,31082,31075,\r
+31083,31073,31163,31226,31224,31222,31223,31375,31380,31376,31541,31559,31540,\r
+31525,31536,31522,31524,31539,31512,31530,31517,31537,31531,31533,31535,31538,\r
+31544,31514,31523,31892,31896,31894,31907,32053,32061,32056,32054,32058,32069,\r
+32044,32041,32065,32071,32062,32063,32074,32059,32040,32611,32661,32668,32669,\r
+32667,32714,32715,32717,32720,32721,32711,32719,32713,32799,32798,32795,32839,\r
+32835,32840,33048,33061,33049,33051,33069,33055,33068,33054,33057,33045,33063,\r
+33053,33058,33297,33336,33331,33338,33332,33330,33396,33680,33699,33704,33677,\r
+33658,33651,33700,33652,33679,33665,33685,33689,33653,33684,33705,33661,33667,\r
+33676,33693,33691,33706,33675,33662,33701,33711,33672,33687,33712,33663,33702,\r
+33671,33710,33654,33690,34393,34390,34495,34487,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34498,34497,34501,34490,34480,34504,\r
+34489,34483,34488,34508,34484,34491,34492,34499,34493,34494,34898,34953,34965,\r
+34984,34978,34986,34970,34961,34977,34975,34968,34983,34969,34971,34967,34980,\r
+34988,34956,34963,34958,35202,35286,35289,35285,35376,35367,35372,35358,35897,\r
+35899,35932,35933,35965,36005,36221,36219,36217,36284,36290,36281,36287,36289,\r
+36568,36574,36573,36572,36567,36576,36577,36900,36875,36881,36892,36876,36897,\r
+37103,37098,37104,37108,37106,37107,37076,37099,37100,37097,37206,37208,37210,\r
+37203,37205,37356,37364,37361,37363,37368,37348,37369,37354,37355,37367,37352,\r
+37358,38266,38278,38280,38524,38509,38507,38513,38511,38591,38762,38916,39141,\r
+39319,20635,20629,20628,20638,20619,20643,20611,20620,20622,20637,20584,20636,\r
+20626,20610,20615,20831,20948,21266,21265,21412,21415,21905,21928,21925,21933,\r
+21879,22085,21922,21907,21896,21903,21941,21889,21923,21906,21924,21885,21900,\r
+21926,21887,21909,21921,21902,22284,22569,22583,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,22553,22558,22567,22563,22568,22517,\r
+22600,22565,22556,22555,22579,22591,22582,22574,22585,22584,22573,22572,22587,\r
+22881,23215,23188,23199,23162,23202,23198,23160,23206,23164,23205,23212,23189,\r
+23214,23095,23172,23178,23191,23171,23179,23209,23163,23165,23180,23196,23183,\r
+23187,23197,23530,23501,23499,23508,23505,23498,23502,23564,23600,23863,23875,\r
+23915,23873,23883,23871,23861,23889,23886,23893,23859,23866,23890,23869,23857,\r
+23897,23874,23865,23881,23864,23868,23858,23862,23872,23877,24132,24129,24408,\r
+24486,24485,24491,24777,24761,24780,24802,24782,24772,24852,24818,24842,24854,\r
+24837,24821,24851,24824,24828,24830,24769,24835,24856,24861,24848,24831,24836,\r
+24843,25162,25492,25521,25520,25550,25573,25576,25583,25539,25757,25587,25546,\r
+25568,25590,25557,25586,25589,25697,25567,25534,25565,25564,25540,25560,25555,\r
+25538,25543,25548,25547,25544,25584,25559,25561,25906,25959,25962,25956,25948,\r
+25960,25957,25996,26013,26014,26030,26064,26066,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,26236,26220,26235,26240,26225,26233,\r
+26218,26226,26369,26892,26835,26884,26844,26922,26860,26858,26865,26895,26838,\r
+26871,26859,26852,26870,26899,26896,26867,26849,26887,26828,26888,26992,26804,\r
+26897,26863,26822,26900,26872,26832,26877,26876,26856,26891,26890,26903,26830,\r
+26824,26845,26846,26854,26868,26833,26886,26836,26857,26901,26917,26823,27449,\r
+27451,27455,27452,27540,27543,27545,27541,27581,27632,27634,27635,27696,28156,\r
+28230,28231,28191,28233,28296,28220,28221,28229,28258,28203,28223,28225,28253,\r
+28275,28188,28211,28235,28224,28241,28219,28163,28206,28254,28264,28252,28257,\r
+28209,28200,28256,28273,28267,28217,28194,28208,28243,28261,28199,28280,28260,\r
+28279,28245,28281,28242,28262,28213,28214,28250,28960,28958,28975,28923,28974,\r
+28977,28963,28965,28962,28978,28959,28968,28986,28955,29259,29274,29320,29321,\r
+29318,29317,29323,29458,29451,29488,29474,29489,29491,29479,29490,29485,29478,\r
+29475,29493,29452,29742,29740,29744,29739,29718,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29722,29729,29741,29745,29732,29731,\r
+29725,29737,29728,29746,29947,29999,30063,30060,30183,30170,30177,30182,30173,\r
+30175,30180,30167,30357,30354,30426,30534,30535,30532,30541,30533,30538,30542,\r
+30539,30540,30686,30700,30816,30820,30821,30812,30829,30833,30826,30830,30832,\r
+30825,30824,30814,30818,31092,31091,31090,31088,31234,31242,31235,31244,31236,\r
+31385,31462,31460,31562,31547,31556,31560,31564,31566,31552,31576,31557,31906,\r
+31902,31912,31905,32088,32111,32099,32083,32086,32103,32106,32079,32109,32092,\r
+32107,32082,32084,32105,32081,32095,32078,32574,32575,32613,32614,32674,32672,\r
+32673,32727,32849,32847,32848,33022,32980,33091,33098,33106,33103,33095,33085,\r
+33101,33082,33254,33262,33271,33272,33273,33284,33340,33341,33343,33397,33595,\r
+33743,33785,33827,33728,33768,33810,33767,33764,33788,33782,33808,33734,33736,\r
+33771,33763,33727,33793,33757,33765,33752,33791,33761,33739,33742,33750,33781,\r
+33737,33801,33807,33758,33809,33798,33730,33779,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33749,33786,33735,33745,33770,33811,\r
+33731,33772,33774,33732,33787,33751,33762,33819,33755,33790,34520,34530,34534,\r
+34515,34531,34522,34538,34525,34539,34524,34540,34537,34519,34536,34513,34888,\r
+34902,34901,35002,35031,35001,35000,35008,35006,34998,35004,34999,35005,34994,\r
+35073,35017,35221,35224,35223,35293,35290,35291,35406,35405,35385,35417,35392,\r
+35415,35416,35396,35397,35410,35400,35409,35402,35404,35407,35935,35969,35968,\r
+36026,36030,36016,36025,36021,36228,36224,36233,36312,36307,36301,36295,36310,\r
+36316,36303,36309,36313,36296,36311,36293,36591,36599,36602,36601,36582,36590,\r
+36581,36597,36583,36584,36598,36587,36593,36588,36596,36585,36909,36916,36911,\r
+37126,37164,37124,37119,37116,37128,37113,37115,37121,37120,37127,37125,37123,\r
+37217,37220,37215,37218,37216,37377,37386,37413,37379,37402,37414,37391,37388,\r
+37376,37394,37375,37373,37382,37380,37415,37378,37404,37412,37401,37399,37381,\r
+37398,38267,38285,38284,38288,38535,38526,38536,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38537,38531,38528,38594,38600,38595,\r
+38641,38640,38764,38768,38766,38919,39081,39147,40166,40697,20099,20100,20150,\r
+20669,20671,20678,20654,20676,20682,20660,20680,20674,20656,20673,20666,20657,\r
+20683,20681,20662,20664,20951,21114,21112,21115,21116,21955,21979,21964,21968,\r
+21963,21962,21981,21952,21972,21956,21993,21951,21970,21901,21967,21973,21986,\r
+21974,21960,22002,21965,21977,21954,22292,22611,22632,22628,22607,22605,22601,\r
+22639,22613,22606,22621,22617,22629,22619,22589,22627,22641,22780,23239,23236,\r
+23243,23226,23224,23217,23221,23216,23231,23240,23227,23238,23223,23232,23242,\r
+23220,23222,23245,23225,23184,23510,23512,23513,23583,23603,23921,23907,23882,\r
+23909,23922,23916,23902,23912,23911,23906,24048,24143,24142,24138,24141,24139,\r
+24261,24268,24262,24267,24263,24384,24495,24493,24823,24905,24906,24875,24901,\r
+24886,24882,24878,24902,24879,24911,24873,24896,25120,37224,25123,25125,25124,\r
+25541,25585,25579,25616,25618,25609,25632,25636,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25651,25667,25631,25621,25624,25657,\r
+25655,25634,25635,25612,25638,25648,25640,25665,25653,25647,25610,25626,25664,\r
+25637,25639,25611,25575,25627,25646,25633,25614,25967,26002,26067,26246,26252,\r
+26261,26256,26251,26250,26265,26260,26232,26400,26982,26975,26936,26958,26978,\r
+26993,26943,26949,26986,26937,26946,26967,26969,27002,26952,26953,26933,26988,\r
+26931,26941,26981,26864,27000,26932,26985,26944,26991,26948,26998,26968,26945,\r
+26996,26956,26939,26955,26935,26972,26959,26961,26930,26962,26927,27003,26940,\r
+27462,27461,27459,27458,27464,27457,27547,64013,27643,27644,27641,27639,27640,\r
+28315,28374,28360,28303,28352,28319,28307,28308,28320,28337,28345,28358,28370,\r
+28349,28353,28318,28361,28343,28336,28365,28326,28367,28338,28350,28355,28380,\r
+28376,28313,28306,28302,28301,28324,28321,28351,28339,28368,28362,28311,28334,\r
+28323,28999,29012,29010,29027,29024,28993,29021,29026,29042,29048,29034,29025,\r
+28994,29016,28995,29003,29040,29023,29008,29011,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28996,29005,29018,29263,29325,29324,\r
+29329,29328,29326,29500,29506,29499,29498,29504,29514,29513,29764,29770,29771,\r
+29778,29777,29783,29760,29775,29776,29774,29762,29766,29773,29780,29921,29951,\r
+29950,29949,29981,30073,30071,27011,30191,30223,30211,30199,30206,30204,30201,\r
+30200,30224,30203,30198,30189,30197,30205,30361,30389,30429,30549,30559,30560,\r
+30546,30550,30554,30569,30567,30548,30553,30573,30688,30855,30874,30868,30863,\r
+30852,30869,30853,30854,30881,30851,30841,30873,30848,30870,30843,31100,31106,\r
+31101,31097,31249,31256,31257,31250,31255,31253,31266,31251,31259,31248,31395,\r
+31394,31390,31467,31590,31588,31597,31604,31593,31602,31589,31603,31601,31600,\r
+31585,31608,31606,31587,31922,31924,31919,32136,32134,32128,32141,32127,32133,\r
+32122,32142,32123,32131,32124,32140,32148,32132,32125,32146,32621,32619,32615,\r
+32616,32620,32678,32677,32679,32731,32732,32801,33124,33120,33143,33116,33129,\r
+33115,33122,33138,26401,33118,33142,33127,33135,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33092,33121,33309,33353,33348,33344,\r
+33346,33349,34033,33855,33878,33910,33913,33935,33933,33893,33873,33856,33926,\r
+33895,33840,33869,33917,33882,33881,33908,33907,33885,34055,33886,33847,33850,\r
+33844,33914,33859,33912,33842,33861,33833,33753,33867,33839,33858,33837,33887,\r
+33904,33849,33870,33868,33874,33903,33989,33934,33851,33863,33846,33843,33896,\r
+33918,33860,33835,33888,33876,33902,33872,34571,34564,34551,34572,34554,34518,\r
+34549,34637,34552,34574,34569,34561,34550,34573,34565,35030,35019,35021,35022,\r
+35038,35035,35034,35020,35024,35205,35227,35295,35301,35300,35297,35296,35298,\r
+35292,35302,35446,35462,35455,35425,35391,35447,35458,35460,35445,35459,35457,\r
+35444,35450,35900,35915,35914,35941,35940,35942,35974,35972,35973,36044,36200,\r
+36201,36241,36236,36238,36239,36237,36243,36244,36240,36242,36336,36320,36332,\r
+36337,36334,36304,36329,36323,36322,36327,36338,36331,36340,36614,36607,36609,\r
+36608,36613,36615,36616,36610,36619,36946,36927,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,36932,36937,36925,37136,37133,37135,\r
+37137,37142,37140,37131,37134,37230,37231,37448,37458,37424,37434,37478,37427,\r
+37477,37470,37507,37422,37450,37446,37485,37484,37455,37472,37479,37487,37430,\r
+37473,37488,37425,37460,37475,37456,37490,37454,37459,37452,37462,37426,38303,\r
+38300,38302,38299,38546,38547,38545,38551,38606,38650,38653,38648,38645,38771,\r
+38775,38776,38770,38927,38925,38926,39084,39158,39161,39343,39346,39344,39349,\r
+39597,39595,39771,40170,40173,40167,40576,40701,20710,20692,20695,20712,20723,\r
+20699,20714,20701,20708,20691,20716,20720,20719,20707,20704,20952,21120,21121,\r
+21225,21227,21296,21420,22055,22037,22028,22034,22012,22031,22044,22017,22035,\r
+22018,22010,22045,22020,22015,22009,22665,22652,22672,22680,22662,22657,22655,\r
+22644,22667,22650,22663,22673,22670,22646,22658,22664,22651,22676,22671,22782,\r
+22891,23260,23278,23269,23253,23274,23258,23277,23275,23283,23266,23264,23259,\r
+23276,23262,23261,23257,23272,23263,23415,23520,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,23523,23651,23938,23936,23933,23942,\r
+23930,23937,23927,23946,23945,23944,23934,23932,23949,23929,23935,24152,24153,\r
+24147,24280,24273,24279,24270,24284,24277,24281,24274,24276,24388,24387,24431,\r
+24502,24876,24872,24897,24926,24945,24947,24914,24915,24946,24940,24960,24948,\r
+24916,24954,24923,24933,24891,24938,24929,24918,25129,25127,25131,25643,25677,\r
+25691,25693,25716,25718,25714,25715,25725,25717,25702,25766,25678,25730,25694,\r
+25692,25675,25683,25696,25680,25727,25663,25708,25707,25689,25701,25719,25971,\r
+26016,26273,26272,26271,26373,26372,26402,27057,27062,27081,27040,27086,27030,\r
+27056,27052,27068,27025,27033,27022,27047,27021,27049,27070,27055,27071,27076,\r
+27069,27044,27092,27065,27082,27034,27087,27059,27027,27050,27041,27038,27097,\r
+27031,27024,27074,27061,27045,27078,27466,27469,27467,27550,27551,27552,27587,\r
+27588,27646,28366,28405,28401,28419,28453,28408,28471,28411,28462,28425,28494,\r
+28441,28442,28455,28440,28475,28434,28397,28426,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,28470,28531,28409,28398,28461,28480,\r
+28464,28476,28469,28395,28423,28430,28483,28421,28413,28406,28473,28444,28412,\r
+28474,28447,28429,28446,28424,28449,29063,29072,29065,29056,29061,29058,29071,\r
+29051,29062,29057,29079,29252,29267,29335,29333,29331,29507,29517,29521,29516,\r
+29794,29811,29809,29813,29810,29799,29806,29952,29954,29955,30077,30096,30230,\r
+30216,30220,30229,30225,30218,30228,30392,30593,30588,30597,30594,30574,30592,\r
+30575,30590,30595,30898,30890,30900,30893,30888,30846,30891,30878,30885,30880,\r
+30892,30882,30884,31128,31114,31115,31126,31125,31124,31123,31127,31112,31122,\r
+31120,31275,31306,31280,31279,31272,31270,31400,31403,31404,31470,31624,31644,\r
+31626,31633,31632,31638,31629,31628,31643,31630,31621,31640,21124,31641,31652,\r
+31618,31931,31935,31932,31930,32167,32183,32194,32163,32170,32193,32192,32197,\r
+32157,32206,32196,32198,32203,32204,32175,32185,32150,32188,32159,32166,32174,\r
+32169,32161,32201,32627,32738,32739,32741,32734,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,32804,32861,32860,33161,33158,33155,\r
+33159,33165,33164,33163,33301,33943,33956,33953,33951,33978,33998,33986,33964,\r
+33966,33963,33977,33972,33985,33997,33962,33946,33969,34000,33949,33959,33979,\r
+33954,33940,33991,33996,33947,33961,33967,33960,34006,33944,33974,33999,33952,\r
+34007,34004,34002,34011,33968,33937,34401,34611,34595,34600,34667,34624,34606,\r
+34590,34593,34585,34587,34627,34604,34625,34622,34630,34592,34610,34602,34605,\r
+34620,34578,34618,34609,34613,34626,34598,34599,34616,34596,34586,34608,34577,\r
+35063,35047,35057,35058,35066,35070,35054,35068,35062,35067,35056,35052,35051,\r
+35229,35233,35231,35230,35305,35307,35304,35499,35481,35467,35474,35471,35478,\r
+35901,35944,35945,36053,36047,36055,36246,36361,36354,36351,36365,36349,36362,\r
+36355,36359,36358,36357,36350,36352,36356,36624,36625,36622,36621,37155,37148,\r
+37152,37154,37151,37149,37146,37156,37153,37147,37242,37234,37241,37235,37541,\r
+37540,37494,37531,37498,37536,37524,37546,37517,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,37542,37530,37547,37497,37527,37503,\r
+37539,37614,37518,37506,37525,37538,37501,37512,37537,37514,37510,37516,37529,\r
+37543,37502,37511,37545,37533,37515,37421,38558,38561,38655,38744,38781,38778,\r
+38782,38787,38784,38786,38779,38788,38785,38783,38862,38861,38934,39085,39086,\r
+39170,39168,39175,39325,39324,39363,39353,39355,39354,39362,39357,39367,39601,\r
+39651,39655,39742,39743,39776,39777,39775,40177,40178,40181,40615,20735,20739,\r
+20784,20728,20742,20743,20726,20734,20747,20748,20733,20746,21131,21132,21233,\r
+21231,22088,22082,22092,22069,22081,22090,22089,22086,22104,22106,22080,22067,\r
+22077,22060,22078,22072,22058,22074,22298,22699,22685,22705,22688,22691,22703,\r
+22700,22693,22689,22783,23295,23284,23293,23287,23286,23299,23288,23298,23289,\r
+23297,23303,23301,23311,23655,23961,23959,23967,23954,23970,23955,23957,23968,\r
+23964,23969,23962,23966,24169,24157,24160,24156,32243,24283,24286,24289,24393,\r
+24498,24971,24963,24953,25009,25008,24994,24969,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,24987,24979,25007,25005,24991,24978,\r
+25002,24993,24973,24934,25011,25133,25710,25712,25750,25760,25733,25751,25756,\r
+25743,25739,25738,25740,25763,25759,25704,25777,25752,25974,25978,25977,25979,\r
+26034,26035,26293,26288,26281,26290,26295,26282,26287,27136,27142,27159,27109,\r
+27128,27157,27121,27108,27168,27135,27116,27106,27163,27165,27134,27175,27122,\r
+27118,27156,27127,27111,27200,27144,27110,27131,27149,27132,27115,27145,27140,\r
+27160,27173,27151,27126,27174,27143,27124,27158,27473,27557,27555,27554,27558,\r
+27649,27648,27647,27650,28481,28454,28542,28551,28614,28562,28557,28553,28556,\r
+28514,28495,28549,28506,28566,28534,28524,28546,28501,28530,28498,28496,28503,\r
+28564,28563,28509,28416,28513,28523,28541,28519,28560,28499,28555,28521,28543,\r
+28565,28515,28535,28522,28539,29106,29103,29083,29104,29088,29082,29097,29109,\r
+29085,29093,29086,29092,29089,29098,29084,29095,29107,29336,29338,29528,29522,\r
+29534,29535,29536,29533,29531,29537,29530,29529,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,29538,29831,29833,29834,29830,29825,\r
+29821,29829,29832,29820,29817,29960,29959,30078,30245,30238,30233,30237,30236,\r
+30243,30234,30248,30235,30364,30365,30366,30363,30605,30607,30601,30600,30925,\r
+30907,30927,30924,30929,30926,30932,30920,30915,30916,30921,31130,31137,31136,\r
+31132,31138,31131,27510,31289,31410,31412,31411,31671,31691,31678,31660,31694,\r
+31663,31673,31690,31669,31941,31944,31948,31947,32247,32219,32234,32231,32215,\r
+32225,32259,32250,32230,32246,32241,32240,32238,32223,32630,32684,32688,32685,\r
+32749,32747,32746,32748,32742,32744,32868,32871,33187,33183,33182,33173,33186,\r
+33177,33175,33302,33359,33363,33362,33360,33358,33361,34084,34107,34063,34048,\r
+34089,34062,34057,34061,34079,34058,34087,34076,34043,34091,34042,34056,34060,\r
+34036,34090,34034,34069,34039,34027,34035,34044,34066,34026,34025,34070,34046,\r
+34088,34077,34094,34050,34045,34078,34038,34097,34086,34023,34024,34032,34031,\r
+34041,34072,34080,34096,34059,34073,34095,34402,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,34646,34659,34660,34679,34785,34675,\r
+34648,34644,34651,34642,34657,34650,34641,34654,34669,34666,34640,34638,34655,\r
+34653,34671,34668,34682,34670,34652,34661,34639,34683,34677,34658,34663,34665,\r
+34906,35077,35084,35092,35083,35095,35096,35097,35078,35094,35089,35086,35081,\r
+35234,35236,35235,35309,35312,35308,35535,35526,35512,35539,35537,35540,35541,\r
+35515,35543,35518,35520,35525,35544,35523,35514,35517,35545,35902,35917,35983,\r
+36069,36063,36057,36072,36058,36061,36071,36256,36252,36257,36251,36384,36387,\r
+36389,36388,36398,36373,36379,36374,36369,36377,36390,36391,36372,36370,36376,\r
+36371,36380,36375,36378,36652,36644,36632,36634,36640,36643,36630,36631,36979,\r
+36976,36975,36967,36971,37167,37163,37161,37162,37170,37158,37166,37253,37254,\r
+37258,37249,37250,37252,37248,37584,37571,37572,37568,37593,37558,37583,37617,\r
+37599,37592,37609,37591,37597,37580,37615,37570,37608,37578,37576,37582,37606,\r
+37581,37589,37577,37600,37598,37607,37585,37587,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,37557,37601,37574,37556,38268,38316,\r
+38315,38318,38320,38564,38562,38611,38661,38664,38658,38746,38794,38798,38792,\r
+38864,38863,38942,38941,38950,38953,38952,38944,38939,38951,39090,39176,39162,\r
+39185,39188,39190,39191,39189,39388,39373,39375,39379,39380,39374,39369,39382,\r
+39384,39371,39383,39372,39603,39660,39659,39667,39666,39665,39750,39747,39783,\r
+39796,39793,39782,39798,39797,39792,39784,39780,39788,40188,40186,40189,40191,\r
+40183,40199,40192,40185,40187,40200,40197,40196,40579,40659,40719,40720,20764,\r
+20755,20759,20762,20753,20958,21300,21473,22128,22112,22126,22131,22118,22115,\r
+22125,22130,22110,22135,22300,22299,22728,22717,22729,22719,22714,22722,22716,\r
+22726,23319,23321,23323,23329,23316,23315,23312,23318,23336,23322,23328,23326,\r
+23535,23980,23985,23977,23975,23989,23984,23982,23978,23976,23986,23981,23983,\r
+23988,24167,24168,24166,24175,24297,24295,24294,24296,24293,24395,24508,24989,\r
+25000,24982,25029,25012,25030,25025,25036,25018,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,25023,25016,24972,25815,25814,25808,\r
+25807,25801,25789,25737,25795,25819,25843,25817,25907,25983,25980,26018,26312,\r
+26302,26304,26314,26315,26319,26301,26299,26298,26316,26403,27188,27238,27209,\r
+27239,27186,27240,27198,27229,27245,27254,27227,27217,27176,27226,27195,27199,\r
+27201,27242,27236,27216,27215,27220,27247,27241,27232,27196,27230,27222,27221,\r
+27213,27214,27206,27477,27476,27478,27559,27562,27563,27592,27591,27652,27651,\r
+27654,28589,28619,28579,28615,28604,28622,28616,28510,28612,28605,28574,28618,\r
+28584,28676,28581,28590,28602,28588,28586,28623,28607,28600,28578,28617,28587,\r
+28621,28591,28594,28592,29125,29122,29119,29112,29142,29120,29121,29131,29140,\r
+29130,29127,29135,29117,29144,29116,29126,29146,29147,29341,29342,29545,29542,\r
+29543,29548,29541,29547,29546,29823,29850,29856,29844,29842,29845,29857,29963,\r
+30080,30255,30253,30257,30269,30259,30268,30261,30258,30256,30395,30438,30618,\r
+30621,30625,30620,30619,30626,30627,30613,30617,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30615,30941,30953,30949,30954,30942,\r
+30947,30939,30945,30946,30957,30943,30944,31140,31300,31304,31303,31414,31416,\r
+31413,31409,31415,31710,31715,31719,31709,31701,31717,31706,31720,31737,31700,\r
+31722,31714,31708,31723,31704,31711,31954,31956,31959,31952,31953,32274,32289,\r
+32279,32268,32287,32288,32275,32270,32284,32277,32282,32290,32267,32271,32278,\r
+32269,32276,32293,32292,32579,32635,32636,32634,32689,32751,32810,32809,32876,\r
+33201,33190,33198,33209,33205,33195,33200,33196,33204,33202,33207,33191,33266,\r
+33365,33366,33367,34134,34117,34155,34125,34131,34145,34136,34112,34118,34148,\r
+34113,34146,34116,34129,34119,34147,34110,34139,34161,34126,34158,34165,34133,\r
+34151,34144,34188,34150,34141,34132,34149,34156,34403,34405,34404,34715,34703,\r
+34711,34707,34706,34696,34689,34710,34712,34681,34695,34723,34693,34704,34705,\r
+34717,34692,34708,34716,34714,34697,35102,35110,35120,35117,35118,35111,35121,\r
+35106,35113,35107,35119,35116,35103,35313,35552,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,35554,35570,35572,35573,35549,35604,\r
+35556,35551,35568,35528,35550,35553,35560,35583,35567,35579,35985,35986,35984,\r
+36085,36078,36081,36080,36083,36204,36206,36261,36263,36403,36414,36408,36416,\r
+36421,36406,36412,36413,36417,36400,36415,36541,36662,36654,36661,36658,36665,\r
+36663,36660,36982,36985,36987,36998,37114,37171,37173,37174,37267,37264,37265,\r
+37261,37263,37671,37662,37640,37663,37638,37647,37754,37688,37692,37659,37667,\r
+37650,37633,37702,37677,37646,37645,37579,37661,37626,37669,37651,37625,37623,\r
+37684,37634,37668,37631,37673,37689,37685,37674,37652,37644,37643,37630,37641,\r
+37632,37627,37654,38332,38349,38334,38329,38330,38326,38335,38325,38333,38569,\r
+38612,38667,38674,38672,38809,38807,38804,38896,38904,38965,38959,38962,39204,\r
+39199,39207,39209,39326,39406,39404,39397,39396,39408,39395,39402,39401,39399,\r
+39609,39615,39604,39611,39670,39674,39673,39671,39731,39808,39813,39815,39804,\r
+39806,39803,39810,39827,39826,39824,39802,39829,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,39805,39816,40229,40215,40224,40222,\r
+40212,40233,40221,40216,40226,40208,40217,40223,40584,40582,40583,40622,40621,\r
+40661,40662,40698,40722,40765,20774,20773,20770,20772,20768,20777,21236,22163,\r
+22156,22157,22150,22148,22147,22142,22146,22143,22145,22742,22740,22735,22738,\r
+23341,23333,23346,23331,23340,23335,23334,23343,23342,23419,23537,23538,23991,\r
+24172,24170,24510,24507,25027,25013,25020,25063,25056,25061,25060,25064,25054,\r
+25839,25833,25827,25835,25828,25832,25985,25984,26038,26074,26322,27277,27286,\r
+27265,27301,27273,27295,27291,27297,27294,27271,27283,27278,27285,27267,27304,\r
+27300,27281,27263,27302,27290,27269,27276,27282,27483,27565,27657,28620,28585,\r
+28660,28628,28643,28636,28653,28647,28646,28638,28658,28637,28642,28648,29153,\r
+29169,29160,29170,29156,29168,29154,29555,29550,29551,29847,29874,29867,29840,\r
+29866,29869,29873,29861,29871,29968,29969,29970,29967,30084,30275,30280,30281,\r
+30279,30372,30441,30645,30635,30642,30647,30646,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,30644,30641,30632,30704,30963,30973,\r
+30978,30971,30972,30962,30981,30969,30974,30980,31147,31144,31324,31323,31318,\r
+31320,31316,31322,31422,31424,31425,31749,31759,31730,31744,31743,31739,31758,\r
+31732,31755,31731,31746,31753,31747,31745,31736,31741,31750,31728,31729,31760,\r
+31754,31976,32301,32316,32322,32307,38984,32312,32298,32329,32320,32327,32297,\r
+32332,32304,32315,32310,32324,32314,32581,32639,32638,32637,32756,32754,32812,\r
+33211,33220,33228,33226,33221,33223,33212,33257,33371,33370,33372,34179,34176,\r
+34191,34215,34197,34208,34187,34211,34171,34212,34202,34206,34167,34172,34185,\r
+34209,34170,34168,34135,34190,34198,34182,34189,34201,34205,34177,34210,34178,\r
+34184,34181,34169,34166,34200,34192,34207,34408,34750,34730,34733,34757,34736,\r
+34732,34745,34741,34748,34734,34761,34755,34754,34764,34743,34735,34756,34762,\r
+34740,34742,34751,34744,34749,34782,34738,35125,35123,35132,35134,35137,35154,\r
+35127,35138,35245,35247,35246,35314,35315,35614,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,35608,35606,35601,35589,35595,35618,\r
+35599,35602,35605,35591,35597,35592,35590,35612,35603,35610,35919,35952,35954,\r
+35953,35951,35989,35988,36089,36207,36430,36429,36435,36432,36428,36423,36675,\r
+36672,36997,36990,37176,37274,37282,37275,37273,37279,37281,37277,37280,37793,\r
+37763,37807,37732,37718,37703,37756,37720,37724,37750,37705,37712,37713,37728,\r
+37741,37775,37708,37738,37753,37719,37717,37714,37711,37745,37751,37755,37729,\r
+37726,37731,37735,37760,37710,37721,38343,38336,38345,38339,38341,38327,38574,\r
+38576,38572,38688,38687,38680,38685,38681,38810,38817,38812,38814,38813,38869,\r
+38868,38897,38977,38980,38986,38985,38981,38979,39205,39211,39212,39210,39219,\r
+39218,39215,39213,39217,39216,39320,39331,39329,39426,39418,39412,39415,39417,\r
+39416,39414,39419,39421,39422,39420,39427,39614,39678,39677,39681,39676,39752,\r
+39834,39848,39838,39835,39846,39841,39845,39844,39814,39842,39840,39855,40243,\r
+40257,40295,40246,40238,40239,40241,40248,40240,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40261,40258,40259,40254,40247,40256,\r
+40253,32757,40237,40586,40585,40589,40624,40648,40666,40699,40703,40740,40739,\r
+40738,40788,40864,20785,20781,20782,22168,22172,22167,22170,22173,22169,22896,\r
+23356,23657,23658,24000,24173,24174,25048,25055,25069,25070,25073,25066,25072,\r
+25067,25046,25065,25855,25860,25853,25848,25857,25859,25852,26004,26075,26330,\r
+26331,26328,27333,27321,27325,27361,27334,27322,27318,27319,27335,27316,27309,\r
+27486,27593,27659,28679,28684,28685,28673,28677,28692,28686,28671,28672,28667,\r
+28710,28668,28663,28682,29185,29183,29177,29187,29181,29558,29880,29888,29877,\r
+29889,29886,29878,29883,29890,29972,29971,30300,30308,30297,30288,30291,30295,\r
+30298,30374,30397,30444,30658,30650,30975,30988,30995,30996,30985,30992,30994,\r
+30993,31149,31148,31327,31772,31785,31769,31776,31775,31789,31773,31782,31784,\r
+31778,31781,31792,32348,32336,32342,32355,32344,32354,32351,32337,32352,32343,\r
+32339,32693,32691,32759,32760,32885,33233,33234,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,33232,33375,33374,34228,34246,34240,\r
+34243,34242,34227,34229,34237,34247,34244,34239,34251,34254,34248,34245,34225,\r
+34230,34258,34340,34232,34231,34238,34409,34791,34790,34786,34779,34795,34794,\r
+34789,34783,34803,34788,34772,34780,34771,34797,34776,34787,34724,34775,34777,\r
+34817,34804,34792,34781,35155,35147,35151,35148,35142,35152,35153,35145,35626,\r
+35623,35619,35635,35632,35637,35655,35631,35644,35646,35633,35621,35639,35622,\r
+35638,35630,35620,35643,35645,35642,35906,35957,35993,35992,35991,36094,36100,\r
+36098,36096,36444,36450,36448,36439,36438,36446,36453,36455,36443,36442,36449,\r
+36445,36457,36436,36678,36679,36680,36683,37160,37178,37179,37182,37288,37285,\r
+37287,37295,37290,37813,37772,37778,37815,37787,37789,37769,37799,37774,37802,\r
+37790,37798,37781,37768,37785,37791,37773,37809,37777,37810,37796,37800,37812,\r
+37795,37797,38354,38355,38353,38579,38615,38618,24002,38623,38616,38621,38691,\r
+38690,38693,38828,38830,38824,38827,38820,38826,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38818,38821,38871,38873,38870,38872,\r
+38906,38992,38993,38994,39096,39233,39228,39226,39439,39435,39433,39437,39428,\r
+39441,39434,39429,39431,39430,39616,39644,39688,39684,39685,39721,39733,39754,\r
+39756,39755,39879,39878,39875,39871,39873,39861,39864,39891,39862,39876,39865,\r
+39869,40284,40275,40271,40266,40283,40267,40281,40278,40268,40279,40274,40276,\r
+40287,40280,40282,40590,40588,40671,40705,40704,40726,40741,40747,40746,40745,\r
+40744,40780,40789,20788,20789,21142,21239,21428,22187,22189,22182,22183,22186,\r
+22188,22746,22749,22747,22802,23357,23358,23359,24003,24176,24511,25083,25863,\r
+25872,25869,25865,25868,25870,25988,26078,26077,26334,27367,27360,27340,27345,\r
+27353,27339,27359,27356,27344,27371,27343,27341,27358,27488,27568,27660,28697,\r
+28711,28704,28694,28715,28705,28706,28707,28713,28695,28708,28700,28714,29196,\r
+29194,29191,29186,29189,29349,29350,29348,29347,29345,29899,29893,29879,29891,\r
+29974,30304,30665,30666,30660,30705,31005,31003,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31009,31004,30999,31006,31152,31335,\r
+31336,31795,31804,31801,31788,31803,31980,31978,32374,32373,32376,32368,32375,\r
+32367,32378,32370,32372,32360,32587,32586,32643,32646,32695,32765,32766,32888,\r
+33239,33237,33380,33377,33379,34283,34289,34285,34265,34273,34280,34266,34263,\r
+34284,34290,34296,34264,34271,34275,34268,34257,34288,34278,34287,34270,34274,\r
+34816,34810,34819,34806,34807,34825,34828,34827,34822,34812,34824,34815,34826,\r
+34818,35170,35162,35163,35159,35169,35164,35160,35165,35161,35208,35255,35254,\r
+35318,35664,35656,35658,35648,35667,35670,35668,35659,35669,35665,35650,35666,\r
+35671,35907,35959,35958,35994,36102,36103,36105,36268,36266,36269,36267,36461,\r
+36472,36467,36458,36463,36475,36546,36690,36689,36687,36688,36691,36788,37184,\r
+37183,37296,37293,37854,37831,37839,37826,37850,37840,37881,37868,37836,37849,\r
+37801,37862,37834,37844,37870,37859,37845,37828,37838,37824,37842,37863,38269,\r
+38362,38363,38625,38697,38699,38700,38696,38694,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,38835,38839,38838,38877,38878,38879,\r
+39004,39001,39005,38999,39103,39101,39099,39102,39240,39239,39235,39334,39335,\r
+39450,39445,39461,39453,39460,39451,39458,39456,39463,39459,39454,39452,39444,\r
+39618,39691,39690,39694,39692,39735,39914,39915,39904,39902,39908,39910,39906,\r
+39920,39892,39895,39916,39900,39897,39909,39893,39905,39898,40311,40321,40330,\r
+40324,40328,40305,40320,40312,40326,40331,40332,40317,40299,40308,40309,40304,\r
+40297,40325,40307,40315,40322,40303,40313,40319,40327,40296,40596,40593,40640,\r
+40700,40749,40768,40769,40781,40790,40791,40792,21303,22194,22197,22195,22755,\r
+23365,24006,24007,24302,24303,24512,24513,25081,25879,25878,25877,25875,26079,\r
+26344,26339,26340,27379,27376,27370,27368,27385,27377,27374,27375,28732,28725,\r
+28719,28727,28724,28721,28738,28728,28735,28730,28729,28736,28731,28723,28737,\r
+29203,29204,29352,29565,29564,29882,30379,30378,30398,30445,30668,30670,30671,\r
+30669,30706,31013,31011,31015,31016,31012,31017,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,31154,31342,31340,31341,31479,31817,\r
+31816,31818,31815,31813,31982,32379,32382,32385,32384,32698,32767,32889,33243,\r
+33241,33291,33384,33385,34338,34303,34305,34302,34331,34304,34294,34308,34313,\r
+34309,34316,34301,34841,34832,34833,34839,34835,34838,35171,35174,35257,35319,\r
+35680,35690,35677,35688,35683,35685,35687,35693,36270,36486,36488,36484,36697,\r
+36694,36695,36693,36696,36698,37005,37187,37185,37303,37301,37298,37299,37899,\r
+37907,37883,37920,37903,37908,37886,37909,37904,37928,37913,37901,37877,37888,\r
+37879,37895,37902,37910,37906,37882,37897,37880,37898,37887,37884,37900,37878,\r
+37905,37894,38366,38368,38367,38702,38703,38841,38843,38909,38910,39008,39010,\r
+39011,39007,39105,39106,39248,39246,39257,39244,39243,39251,39474,39476,39473,\r
+39468,39466,39478,39465,39470,39480,39469,39623,39626,39622,39696,39698,39697,\r
+39947,39944,39927,39941,39954,39928,40000,39943,39950,39942,39959,39956,39945,\r
+40351,40345,40356,40349,40338,40344,40336,40347,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40352,40340,40348,40362,40343,40353,\r
+40346,40354,40360,40350,40355,40383,40361,40342,40358,40359,40601,40603,40602,\r
+40677,40676,40679,40678,40752,40750,40795,40800,40798,40797,40793,40849,20794,\r
+20793,21144,21143,22211,22205,22206,23368,23367,24011,24015,24305,25085,25883,\r
+27394,27388,27395,27384,27392,28739,28740,28746,28744,28745,28741,28742,29213,\r
+29210,29209,29566,29975,30314,30672,31021,31025,31023,31828,31827,31986,32394,\r
+32391,32392,32395,32390,32397,32589,32699,32816,33245,34328,34346,34342,34335,\r
+34339,34332,34329,34343,34350,34337,34336,34345,34334,34341,34857,34845,34843,\r
+34848,34852,34844,34859,34890,35181,35177,35182,35179,35322,35705,35704,35653,\r
+35706,35707,36112,36116,36271,36494,36492,36702,36699,36701,37190,37188,37189,\r
+37305,37951,37947,37942,37929,37949,37948,37936,37945,37930,37943,37932,37952,\r
+37937,38373,38372,38371,38709,38714,38847,38881,39012,39113,39110,39104,39256,\r
+39254,39481,39485,39494,39492,39490,39489,39482,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,39487,39629,39701,39703,39704,39702,\r
+39738,39762,39979,39965,39964,39980,39971,39976,39977,39972,39969,40375,40374,\r
+40380,40385,40391,40394,40399,40382,40389,40387,40379,40373,40398,40377,40378,\r
+40364,40392,40369,40365,40396,40371,40397,40370,40570,40604,40683,40686,40685,\r
+40731,40728,40730,40753,40782,40805,40804,40850,20153,22214,22213,22219,22897,\r
+23371,23372,24021,24017,24306,25889,25888,25894,25890,27403,27400,27401,27661,\r
+28757,28758,28759,28754,29214,29215,29353,29567,29912,29909,29913,29911,30317,\r
+30381,31029,31156,31344,31345,31831,31836,31833,31835,31834,31988,31985,32401,\r
+32591,32647,33246,33387,34356,34357,34355,34348,34354,34358,34860,34856,34854,\r
+34858,34853,35185,35263,35262,35323,35710,35716,35714,35718,35717,35711,36117,\r
+36501,36500,36506,36498,36496,36502,36503,36704,36706,37191,37964,37968,37962,\r
+37963,37967,37959,37957,37960,37961,37958,38719,38883,39018,39017,39115,39252,\r
+39259,39502,39507,39508,39500,39503,39496,39498,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,39497,39506,39504,39632,39705,39723,\r
+39739,39766,39765,40006,40008,39999,40004,39993,39987,40001,39996,39991,39988,\r
+39986,39997,39990,40411,40402,40414,40410,40395,40400,40412,40401,40415,40425,\r
+40409,40408,40406,40437,40405,40413,40630,40688,40757,40755,40754,40770,40811,\r
+40853,40866,20797,21145,22760,22759,22898,23373,24024,34863,24399,25089,25091,\r
+25092,25897,25893,26006,26347,27409,27410,27407,27594,28763,28762,29218,29570,\r
+29569,29571,30320,30676,31847,31846,32405,33388,34362,34368,34361,34364,34353,\r
+34363,34366,34864,34866,34862,34867,35190,35188,35187,35326,35724,35726,35723,\r
+35720,35909,36121,36504,36708,36707,37308,37986,37973,37981,37975,37982,38852,\r
+38853,38912,39510,39513,39710,39711,39712,40018,40024,40016,40010,40013,40011,\r
+40021,40025,40012,40014,40443,40439,40431,40419,40427,40440,40420,40438,40417,\r
+40430,40422,40434,40432,40418,40428,40436,40435,40424,40429,40642,40656,40690,\r
+40691,40710,40732,40760,40759,40758,40771,40783,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40817,40816,40814,40815,22227,22221,\r
+23374,23661,25901,26349,26350,27411,28767,28769,28765,28768,29219,29915,29925,\r
+30677,31032,31159,31158,31850,32407,32649,33389,34371,34872,34871,34869,34891,\r
+35732,35733,36510,36511,36512,36509,37310,37309,37314,37995,37992,37993,38629,\r
+38726,38723,38727,38855,38885,39518,39637,39769,40035,40039,40038,40034,40030,\r
+40032,40450,40446,40455,40451,40454,40453,40448,40449,40457,40447,40445,40452,\r
+40608,40734,40774,40820,40821,40822,22228,25902,26040,27416,27417,27415,27418,\r
+28770,29222,29354,30680,30681,31033,31849,31851,31990,32410,32408,32411,32409,\r
+33248,33249,34374,34375,34376,35193,35194,35196,35195,35327,35736,35737,36517,\r
+36516,36515,37998,37997,37999,38001,38003,38729,39026,39263,40040,40046,40045,\r
+40459,40461,40464,40463,40466,40465,40609,40693,40713,40775,40824,40827,40826,\r
+40825,22302,28774,31855,34876,36274,36518,37315,38004,38008,38006,38005,39520,\r
+40052,40051,40049,40053,40468,40467,40694,40714,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,40868,28776,28773,31991,34410,34878,\r
+34877,34879,35742,35996,36521,36553,38731,39027,39028,39116,39265,39339,39524,\r
+39526,39527,39716,40469,40471,40776,25095,27422,29223,34380,36520,38018,38016,\r
+38017,39529,39528,39726,40473,29225,34379,35743,38019,40057,40631,30325,39531,\r
+40058,40477,28777,28778,40612,40830,40777,40856,\r
+};\r
+\r
+static const struct dbcs_index big5_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5_decmap+0,64,254},{\r
+__big5_decmap+191,64,254},{__big5_decmap+382,64,191},{__big5_decmap+510,64,254\r
+},{__big5_decmap+701,64,254},{__big5_decmap+892,64,254},{__big5_decmap+1083,\r
+64,254},{__big5_decmap+1274,64,254},{__big5_decmap+1465,64,254},{__big5_decmap\r
++1656,64,254},{__big5_decmap+1847,64,254},{__big5_decmap+2038,64,254},{\r
+__big5_decmap+2229,64,254},{__big5_decmap+2420,64,254},{__big5_decmap+2611,64,\r
+254},{__big5_decmap+2802,64,254},{__big5_decmap+2993,64,254},{__big5_decmap+\r
+3184,64,254},{__big5_decmap+3375,64,254},{__big5_decmap+3566,64,254},{\r
+__big5_decmap+3757,64,254},{__big5_decmap+3948,64,254},{__big5_decmap+4139,64,\r
+254},{__big5_decmap+4330,64,254},{__big5_decmap+4521,64,254},{__big5_decmap+\r
+4712,64,254},{__big5_decmap+4903,64,254},{__big5_decmap+5094,64,254},{\r
+__big5_decmap+5285,64,254},{__big5_decmap+5476,64,254},{__big5_decmap+5667,64,\r
+254},{__big5_decmap+5858,64,254},{__big5_decmap+6049,64,254},{__big5_decmap+\r
+6240,64,254},{__big5_decmap+6431,64,254},{__big5_decmap+6622,64,254},{\r
+__big5_decmap+6813,64,254},{__big5_decmap+7004,64,254},{__big5_decmap+7195,64,\r
+252},{0,0,0},{__big5_decmap+7384,64,254},{__big5_decmap+7575,64,254},{\r
+__big5_decmap+7766,64,254},{__big5_decmap+7957,64,254},{__big5_decmap+8148,64,\r
+254},{__big5_decmap+8339,64,254},{__big5_decmap+8530,64,254},{__big5_decmap+\r
+8721,64,254},{__big5_decmap+8912,64,254},{__big5_decmap+9103,64,254},{\r
+__big5_decmap+9294,64,254},{__big5_decmap+9485,64,254},{__big5_decmap+9676,64,\r
+254},{__big5_decmap+9867,64,254},{__big5_decmap+10058,64,254},{__big5_decmap+\r
+10249,64,254},{__big5_decmap+10440,64,254},{__big5_decmap+10631,64,254},{\r
+__big5_decmap+10822,64,254},{__big5_decmap+11013,64,254},{__big5_decmap+11204,\r
+64,254},{__big5_decmap+11395,64,254},{__big5_decmap+11586,64,254},{\r
+__big5_decmap+11777,64,254},{__big5_decmap+11968,64,254},{__big5_decmap+12159,\r
+64,254},{__big5_decmap+12350,64,254},{__big5_decmap+12541,64,254},{\r
+__big5_decmap+12732,64,254},{__big5_decmap+12923,64,254},{__big5_decmap+13114,\r
+64,254},{__big5_decmap+13305,64,254},{__big5_decmap+13496,64,254},{\r
+__big5_decmap+13687,64,254},{__big5_decmap+13878,64,254},{__big5_decmap+14069,\r
+64,254},{__big5_decmap+14260,64,254},{__big5_decmap+14451,64,254},{\r
+__big5_decmap+14642,64,254},{__big5_decmap+14833,64,254},{__big5_decmap+15024,\r
+64,254},{__big5_decmap+15215,64,254},{__big5_decmap+15406,64,254},{\r
+__big5_decmap+15597,64,254},{__big5_decmap+15788,64,254},{__big5_decmap+15979,\r
+64,254},{__big5_decmap+16170,64,254},{__big5_decmap+16361,64,254},{\r
+__big5_decmap+16552,64,213},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __big5_encmap[21764] = {\r
+41542,41543,N,41540,N,41393,N,N,N,N,N,N,N,N,41560,41427,N,N,N,N,N,41296,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41425,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41426,41918,N,41916,41917,41919,\r
+N,41413,N,N,N,N,N,N,N,N,N,N,N,41915,41796,41797,41798,41799,41800,41801,41802,\r
+41803,41804,41805,41806,41807,41808,41809,41810,41811,41812,N,41813,41814,\r
+41815,41816,41817,41818,41819,N,N,N,N,N,N,N,41820,41821,41822,41823,41824,\r
+41825,41826,41827,41828,41829,41830,41831,41832,41833,41834,41835,41836,N,\r
+41837,41838,41839,41840,41841,41842,41843,51123,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,51121,51122,51124,51125,51126,51127,51128,51129,51130,N,N,N,N,N,N,51131,\r
+51132,51133,51134,51135,51136,51137,51138,51139,51140,51141,51142,51143,51144,\r
+51145,51146,51147,51148,51149,51151,51152,51153,51154,51155,51156,51157,51158,\r
+51159,51160,51161,51162,51163,51164,51165,51166,51167,51168,51169,51170,51171,\r
+51172,51173,51174,51175,51176,N,51150,41302,41304,N,N,N,41381,41382,N,N,41383,\r
+41384,N,N,N,N,41285,N,N,41292,41291,N,N,N,N,N,N,N,N,N,N,N,41388,N,N,41387,N,N,\r
+N,N,N,41392,N,N,41410,41546,N,41409,N,N,N,41547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41657,41658,\r
+41659,41660,41661,41662,41663,41664,41665,41666,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41462,41460,41463,41461,N,N,\r
+41464,41465,41467,41466,41428,N,N,N,41435,41448,41447,N,N,41469,N,41468,N,N,N,\r
+41444,41445,41452,N,N,41453,N,N,N,N,N,41455,41454,N,N,N,N,N,N,41443,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41436,N,N,N,N,N,N,N,N,N,N,N,N,N,41434,41437,N,\r
+N,N,N,41432,41433,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41446,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41449,51177,51178,51179,51180,51181,\r
+51182,51183,51184,51185,51186,N,N,N,N,N,N,N,N,N,N,51187,51188,51189,51190,\r
+51191,51192,51193,51194,51195,51196,41591,N,41592,N,N,N,N,N,N,N,N,N,41594,N,N,\r
+N,41595,N,N,N,41596,N,N,N,41597,N,N,N,41589,N,N,N,N,N,N,N,41588,N,N,N,N,N,N,N,\r
+41587,N,N,N,N,N,N,N,41586,N,N,N,N,N,N,N,41585,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,41636,N,N,N,N,N,N,N,N,N,N,N,N,N,41637,N,N,41639,N,N,N,N,N,N,N,N,41638,N,\r
+N,41598,41633,41635,41634,41644,41645,41646,41306,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41570,41571,41572,41573,41574,41575,41576,41577,41584,41583,41582,41581,41580,\r
+41579,41578,N,N,N,N,41590,41593,N,N,N,N,N,N,N,N,N,N,41405,41404,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,41398,41397,N,N,N,N,N,N,N,N,41407,41406,N,N,N,N,N,N,N,N,\r
+41403,41402,N,N,N,41395,N,N,41399,41396,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41640,41641,41643,41642,41401,41400,N,N,41459,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41456,41458,41457,41280,41282,41283,41394,N,50852,N,N,41329,41330,41325,41326,\r
+41333,41334,41337,41338,41321,41322,41541,N,41317,41318,N,N,N,N,N,N,N,41385,\r
+41386,N,N,41667,41668,41669,41670,41671,41672,41673,41674,41675,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,50853,50854,50855,50856,50857,50858,50859,\r
+50860,50861,50862,50863,50864,50865,50866,50867,50868,50869,50870,50871,50872,\r
+50873,50874,50875,50876,50877,50878,50879,50880,50881,50882,50883,50884,50885,\r
+50886,50887,50888,50889,50890,50891,50892,50893,50894,50895,50896,50897,50898,\r
+50899,50900,50901,50902,50903,50904,50905,50906,50907,50908,50909,50910,50911,\r
+50912,50913,50914,50915,50916,50917,50918,50919,50920,50921,50922,50923,50924,\r
+50925,50926,50927,50928,50929,50930,50931,50932,50933,50934,50935,N,N,N,N,N,N,\r
+N,N,N,50850,50851,N,N,50936,50937,50938,50939,50940,50941,50942,51008,51009,\r
+51010,51011,51012,51013,51014,51015,51016,51017,51018,51019,51020,51021,51022,\r
+51023,51024,51025,51026,51027,51028,51029,51030,51031,51032,51033,51034,51035,\r
+51036,51037,51038,51039,51040,51041,51042,51043,51044,51045,51046,51047,51048,\r
+51049,51050,51051,51052,51053,51054,51055,51056,51057,51058,51059,51060,51061,\r
+51062,51063,51064,51065,51066,51067,51068,51069,51070,51105,51106,51107,51108,\r
+51109,51110,51111,51112,51113,51114,51115,51116,51117,51118,51119,51120,N,N,N,\r
+N,N,N,N,50849,41844,41845,41846,41847,41848,41849,41850,41851,41852,41853,\r
+41854,41889,41890,41891,41892,41893,41894,41895,41896,41897,41898,41899,41900,\r
+41901,41902,41903,41904,41905,41906,41907,41908,41909,41910,41911,41912,41913,\r
+41914,41408,41557,41558,N,N,N,N,N,N,N,N,N,N,N,N,41552,41553,41554,N,N,41556,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41559,N,N,N,\r
+N,N,N,N,N,N,41555,N,N,41451,41450,N,N,41551,42048,42050,N,42051,N,N,N,51525,\r
+42070,42068,42071,42069,51526,42147,51535,51533,42146,42145,N,N,42306,42305,\r
+42304,N,42307,42238,N,N,N,N,42464,42465,N,N,N,N,N,N,43203,N,N,N,N,42072,N,\r
+42148,51536,N,42149,51555,42730,52145,N,N,N,N,42073,42150,N,42308,51556,N,N,N,\r
+N,N,51520,42052,N,42075,N,51527,42076,N,N,42151,N,42309,42311,42310,N,N,42466,\r
+42467,N,N,43204,N,44476,42049,N,N,51521,42053,42078,42077,N,N,N,N,N,N,N,N,N,\r
+42468,N,N,N,N,N,N,N,N,N,43205,N,N,N,N,N,N,N,N,N,N,45230,54347,N,N,46787,56497,\r
+56498,N,42054,N,42153,N,N,43206,42055,51528,42079,N,N,42154,42156,51537,42157,\r
+42155,N,N,N,42469,N,43207,N,N,43208,43845,N,42080,42158,N,42470,42472,42471,N,\r
+42731,N,N,43209,43210,43846,43847,N,N,N,N,44477,N,N,56499,N,N,63190,42056,N,N,\r
+N,N,N,42160,42159,51538,42161,42167,N,42162,42163,51540,51539,42165,42166,N,\r
+42164,N,N,N,N,N,N,42314,42315,42316,42317,42313,42320,51562,N,51558,51561,\r
+42321,42337,N,51560,N,42318,42319,42312,N,N,51557,51559,N,N,N,N,N,N,42485,\r
+51632,42482,42486,51642,51630,42483,51634,N,N,N,42484,N,42487,N,42473,51633,\r
+42488,51637,N,51641,51638,N,N,51635,42474,42476,42489,N,42478,51627,42481,\r
+42479,42480,51643,51640,51631,42477,N,N,51628,42475,N,N,N,51636,N,N,N,N,51639,\r
+N,N,N,N,N,N,N,N,N,51629,51814,N,42818,42740,N,N,51815,42737,N,42820,N,42745,N,\r
+42744,51803,42748,42743,51808,51816,N,51812,N,42746,N,N,42749,42734,42823,\r
+51805,N,N,52157,42732,42819,42733,42741,42742,51810,51806,42747,42739,51802,\r
+42735,51813,42821,42824,42738,42816,42822,42736,51811,42817,51817,51804,42750,\r
+51807,N,N,51809,N,43224,52159,52171,43216,N,52172,43211,43221,N,N,43214,52153,\r
+43222,52152,52156,52163,52161,43230,43225,52147,52149,43227,43215,52150,52162,\r
+52169,43220,52155,52148,43219,52151,43223,52154,N,43218,N,43213,N,43228,52164,\r
+43229,52168,N,52166,52170,43226,52158,52146,N,52160,43217,52165,43212,52167,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,43862,43850,N,N,52704,52712,N,43849,43857,43869,N,\r
+52718,52716,52711,N,N,N,43851,52717,52707,43865,43856,43864,52702,N,52714,N,\r
+52705,43860,52706,N,52701,43867,43854,43863,43853,N,52703,52708,N,52715,43861,\r
+43858,52710,43866,52713,52709,43855,43868,43859,43852,43848,N,N,N,N,N,N,N,N,N,\r
+N,52719,N,44503,44481,N,44497,N,44502,53456,53455,53460,53461,44484,N,44493,N,\r
+N,N,44506,44494,N,N,N,N,53449,44487,53450,N,44508,N,44499,44478,44479,53469,\r
+45247,N,44492,44491,53451,44495,54363,44486,53462,44501,44500,44490,53454,\r
+53463,N,53448,44489,53464,44498,53452,44480,N,44483,44482,53465,44496,44485,\r
+44505,44507,53459,44504,N,53467,53453,53468,N,53457,N,53466,N,53458,N,N,N,N,\r
+44488,N,N,N,54371,54359,N,45235,N,54364,54370,45234,54357,45238,54361,54354,\r
+45236,54358,45241,45246,N,54375,N,54353,N,45242,N,54374,N,N,45237,54360,45233,\r
+54355,54351,54365,54352,54350,54362,54368,54369,45239,N,N,55387,54366,54349,\r
+54367,N,45249,54372,45248,54348,N,54356,54373,45244,45243,45240,45245,N,N,\r
+45231,N,N,45232,N,N,46024,N,55390,55383,N,46021,N,55391,N,N,N,55381,55384,\r
+46020,55385,N,N,46023,55389,N,55379,55378,46025,N,46026,46022,46027,55377,\r
+55388,55386,55380,N,N,N,46019,55382,N,N,N,N,N,N,N,N,46794,46788,56503,46797,\r
+56509,56512,46790,46791,56506,46789,56515,46795,56516,N,56511,46796,N,56500,\r
+46793,56501,N,56510,56508,N,56504,46792,56502,46798,56507,56514,56505,56513,N,\r
+N,47542,47539,N,47540,N,57593,57585,47538,47535,57586,N,N,47537,57589,N,57591,\r
+N,N,57598,N,N,57597,57592,47534,57584,47532,57587,47543,57590,N,57594,47536,\r
+47533,57596,57595,47541,N,57588,N,48120,58604,N,58601,48121,N,48119,N,58608,\r
+58605,58598,48118,N,48122,58599,48117,48125,58602,58603,48123,48124,58609,\r
+58606,58607,N,N,N,48810,59640,48807,59637,48809,48811,N,59638,48808,N,59639,N,\r
+59636,N,N,49270,60605,49271,60603,N,60604,60602,60601,N,N,60606,49269,N,N,\r
+61368,61369,N,58600,61367,49272,50015,61931,61932,N,50391,50392,62913,62912,\r
+50540,50539,63440,N,42057,42081,42169,N,42168,42323,42322,42492,42491,42493,\r
+42490,N,42826,42825,42827,N,N,N,N,43232,N,43231,43233,N,43870,N,41561,53470,\r
+41562,45250,41564,41563,55392,N,41565,47544,41566,N,42058,N,42170,42494,43234,\r
+N,42059,42173,42171,42172,N,N,42560,N,N,N,42828,43236,43235,43237,N,N,N,44509,\r
+N,N,N,48812,N,N,N,N,N,N,51534,N,42324,42325,N,N,42561,N,51818,N,43872,43871,\r
+53472,53471,45251,N,42174,51541,N,N,N,N,N,52173,N,43873,N,44512,N,44510,44511,\r
+N,N,N,N,48813,N,42326,N,N,N,42562,51644,N,N,N,N,42829,42830,N,51819,N,N,52174,\r
+43238,52175,N,N,N,N,N,53474,53475,44515,N,53476,N,53473,44516,44514,44513,\r
+53477,N,54376,N,N,N,55393,N,N,56517,57664,N,N,N,48126,48814,59641,N,42060,\r
+42074,N,N,N,N,N,N,N,N,N,N,N,N,N,N,45252,46029,N,47545,N,51522,42175,N,42329,\r
+42327,42328,N,N,43239,42061,42062,N,42082,N,N,42176,42177,42178,51646,42330,N,\r
+51563,N,42566,N,51647,42564,42565,51645,N,N,42567,42563,N,N,N,N,51820,43756,\r
+51821,N,N,51822,N,N,42832,42831,N,N,42835,42833,42834,N,N,N,43245,N,43244,\r
+52180,52177,52178,N,52176,43246,43242,43241,N,43243,43240,N,N,N,N,N,43247,N,\r
+43875,52720,N,52179,43880,N,52721,43876,43879,43878,43877,43874,N,N,N,53480,N,\r
+44519,53483,44517,N,N,N,53479,44520,44518,44521,53481,53482,N,53478,53484,N,N,\r
+N,N,N,N,46033,45253,54377,54379,54378,54380,45254,N,N,46030,N,46031,46032,N,\r
+46800,56519,N,56518,56520,56521,46801,N,46799,57665,57666,47547,47546,58202,N,\r
+N,48192,48193,48194,48196,58610,58611,48195,N,N,N,48815,N,48816,N,N,61933,\r
+62915,62914,63441,N,42063,N,N,N,42332,42331,N,N,42568,N,N,51648,N,N,42837,\r
+42838,42836,42839,51823,51824,N,N,N,N,N,N,N,N,N,N,N,N,43249,52181,N,43248,N,\r
+52722,43884,52723,43883,N,N,N,43881,N,43882,N,N,N,53485,N,N,N,N,45255,54382,N,\r
+45258,54381,45541,45257,45256,N,46036,N,46035,46034,46802,N,N,46805,46806,\r
+46804,N,46803,N,N,57667,N,57668,N,N,N,58613,48197,58612,N,48817,60607,49273,N,\r
+61934,50261,N,42083,42179,51542,N,42180,42181,42333,42334,N,42569,51825,52182,\r
+52183,N,43885,53486,45260,45259,55395,55394,N,N,42064,42182,42335,N,45261,\r
+51523,N,51564,42336,N,51650,42571,42570,51649,42840,N,N,N,N,N,N,44522,N,N,\r
+54383,N,46807,57669,47548,N,N,59642,N,N,62461,N,42183,N,N,52184,52724,45264,\r
+45262,45263,42065,N,42084,41677,42186,N,42185,42184,42339,42338,N,51565,51651,\r
+N,N,N,43253,43250,43252,43251,N,N,43886,N,N,46037,N,42066,N,42187,N,42341,\r
+42340,N,51826,N,N,43254,N,N,N,N,N,51543,N,42343,42342,42572,42573,51827,42841,\r
+N,42842,N,43255,43256,43257,N,43887,52725,N,N,44523,N,N,51524,N,42188,N,N,N,N,\r
+N,51652,N,N,N,51828,51829,N,N,52185,N,52186,N,52727,52726,52729,52728,43888,N,\r
+54384,44525,53487,44524,N,N,N,N,55396,46038,N,55397,N,N,N,N,57670,47549,N,N,N,\r
+N,48198,N,61935,N,N,N,N,51544,N,42344,N,N,N,N,N,N,N,45265,N,N,N,N,42067,42085,\r
+42190,42189,N,42191,N,N,N,N,N,N,43259,N,43258,43260,N,N,N,43889,N,N,N,44526,N,\r
+59643,49743,42086,42346,42361,42356,N,42351,42350,42357,42355,42348,42362,\r
+42349,42345,42360,42359,42358,42347,N,42354,N,N,42353,N,N,42363,42352,42579,N,\r
+42585,42581,N,42587,51653,42584,42574,42577,42580,42576,42583,42586,42575,\r
+42578,42582,42588,N,N,N,N,N,51838,51835,N,42855,51836,42843,42845,42869,42864,\r
+N,N,N,51877,51837,42847,42849,51876,42856,51832,42868,42870,42844,42861,N,\r
+51830,42867,N,42852,N,42862,42863,51831,42860,42858,N,42859,42865,51873,42846,\r
+N,42866,51875,42854,42851,N,51834,42850,51878,42853,N,42857,N,N,N,42848,51874,\r
+N,N,N,N,51833,N,N,N,N,N,N,N,N,N,N,N,52203,52202,43343,52205,52207,52196,52199,\r
+52206,43344,N,N,52193,52197,N,N,52201,52809,43339,52813,43261,52198,43262,\r
+43340,43333,43329,N,52194,43332,43337,43346,52195,52188,43331,52189,52191,N,\r
+43334,N,43336,52187,52192,N,N,43345,43341,52200,43347,N,43338,52190,43335,N,N,\r
+43330,43328,N,52204,N,43342,N,N,N,N,N,52808,52731,52811,N,N,52733,43896,43944,\r
+43892,43943,43901,43940,43890,52732,52803,43939,52815,43941,N,43897,N,N,52805,\r
+52802,43895,N,52730,43942,52810,43900,52812,43945,43891,43902,43899,52800,\r
+43937,52806,52807,43898,43938,43894,N,N,N,N,43893,52734,N,N,N,N,N,N,52804,N,N,\r
+N,N,N,N,N,52814,N,53572,44539,53489,N,53494,44532,44608,53492,44527,44537,\r
+44542,53499,N,44538,44541,N,N,53502,44533,53493,N,N,N,53570,53571,N,44535,\r
+53569,44531,44611,N,53496,44529,N,53574,53497,53501,44534,44610,53498,44540,\r
+53568,53575,54433,N,53573,44612,44528,53500,53491,N,44536,N,N,53490,N,N,53495,\r
+N,N,N,N,N,N,N,N,N,N,N,53488,44609,N,N,54391,N,45284,54439,45282,45279,54396,\r
+45275,54434,45286,54390,54395,54394,44530,45281,54437,N,54440,54387,N,46056,N,\r
+54441,45287,N,45273,45270,54398,45267,N,54438,N,45274,54442,N,54388,54436,\r
+45277,54389,54392,54397,N,N,45278,45276,45288,N,N,N,N,45283,N,45271,45522,N,\r
+45272,54393,45285,45280,54435,45269,N,N,N,45268,N,N,N,N,N,N,N,N,N,N,54385,\r
+54386,55402,N,N,N,46039,46042,55413,46062,55416,46040,55409,46046,46052,46525,\r
+N,N,46050,55406,46063,46043,46051,55414,56535,55419,55407,N,55398,55411,55405,\r
+46049,55417,N,N,46045,46065,46058,N,46047,46044,N,46055,N,55418,55404,55410,\r
+55412,55400,55415,46041,55399,N,46048,46064,46060,55401,46054,N,N,46061,46057,\r
+46053,N,55408,N,N,N,N,N,46059,N,N,N,56533,56529,N,56544,56522,56531,46821,\r
+46822,46814,56540,46824,56527,56526,56524,56542,46812,56536,56525,46815,56534,\r
+46810,56530,56537,56539,N,N,56543,46819,56523,46813,56528,N,46808,N,46820,\r
+56538,46816,46817,46823,46811,41567,46809,56532,N,N,N,N,N,46818,N,N,56541,N,N,\r
+N,47565,47560,N,57685,57681,N,57675,47554,47550,57684,47551,57678,57680,N,\r
+57683,N,47556,N,47563,47557,N,N,57673,47558,47559,57676,47564,N,57674,57679,\r
+47555,57672,47561,47553,N,N,N,47552,57677,57682,N,47562,N,N,N,N,N,N,N,57671,N,\r
+48205,58695,N,58692,N,48199,48211,48212,N,48202,58690,48204,58617,48210,N,\r
+58694,48201,58696,48200,N,58691,58693,48203,58689,58618,58615,N,N,55403,58621,\r
+N,58614,58620,58619,N,58616,N,48207,N,N,N,N,48206,N,N,N,48208,58622,48818,\r
+58688,N,N,N,59717,N,59645,N,48830,59714,48822,48826,59713,N,48825,48821,48824,\r
+48819,48829,59715,59646,48828,59644,48827,59716,59712,48209,N,48831,59718,\r
+48823,48820,N,N,N,N,60614,60616,49275,60617,60615,60613,60612,49277,60611,\r
+49278,N,N,N,N,60609,60610,49274,49313,49276,N,N,60608,N,49744,N,61372,61370,\r
+61375,61373,N,61371,61374,N,N,N,N,N,N,N,50016,61938,61939,50262,N,61940,61936,\r
+61941,61937,49745,N,N,N,62462,62529,50265,62528,50264,50263,N,N,N,N,50266,\r
+62917,62918,N,50394,50393,50395,62916,N,63192,63191,N,50541,50543,50542,63193,\r
+50632,63654,N,N,N,50673,N,63653,63726,N,N,51529,N,N,42365,42364,N,42591,42590,\r
+51655,42589,51654,N,N,42873,51881,N,51880,N,N,42871,42874,N,N,51879,N,42872,N,\r
+N,N,N,N,N,52208,N,52209,43348,N,N,N,N,43946,53576,53577,44613,44614,N,N,54444,\r
+45289,45291,54443,45290,55420,46066,N,N,N,N,46825,46826,56545,N,47567,N,47566,\r
+N,58697,59720,59719,N,63851,42087,51545,N,51566,51567,N,N,N,N,42594,42598,\r
+51657,N,42596,42595,51656,42597,42593,N,N,42592,51658,N,N,N,N,N,N,42918,N,N,\r
+42915,N,42877,51882,N,N,N,51883,N,42913,N,51885,42875,51886,51884,42878,42914,\r
+42917,42916,42876,51887,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43353,52222,N,43355,N,\r
+43354,N,52288,43352,43351,52213,N,52212,N,52210,52215,52214,52211,52220,52221,\r
+52218,52216,43350,N,N,N,52219,43356,52289,N,N,52217,N,43947,43349,N,N,N,N,N,N,\r
+N,43948,52820,N,N,52826,N,N,N,43954,52824,52830,N,52821,52825,52827,52829,\r
+52823,N,52822,52817,52818,43949,N,43951,43950,52819,52828,N,N,N,N,N,N,N,N,\r
+43953,N,N,N,N,N,N,52816,53587,N,53586,53591,53582,N,53585,53584,N,53588,N,\r
+53592,44615,44618,N,N,53583,53589,N,N,N,44617,53578,N,43952,54458,53590,N,\r
+53581,N,44616,53580,N,N,N,N,N,N,54449,N,N,45292,45296,54465,54447,54461,45297,\r
+54463,N,54469,N,54473,N,N,54464,54452,54460,N,54474,54472,54462,54457,54450,\r
+55462,54448,45301,54455,45302,45298,54445,54467,54453,54451,54470,45299,N,\r
+54476,45293,45295,54459,54454,44619,45294,54456,54471,54475,54466,N,54468,N,N,\r
+N,54446,N,N,N,N,55457,N,55466,55465,46074,55458,N,46075,46073,N,55460,46070,\r
+55464,N,55459,55461,55421,46068,N,55474,55473,55470,46067,46071,46072,53579,\r
+55467,46069,45300,55469,55422,55472,55471,N,55475,N,56559,N,55468,N,N,N,N,N,N,\r
+N,N,55463,56551,46836,46839,46834,56550,56554,56549,N,46828,46838,56546,46832,\r
+56553,N,46830,46829,56556,46831,56558,N,56555,46827,N,N,N,46837,56560,56548,\r
+56557,N,N,56547,N,N,46833,N,46835,N,56552,N,56561,N,N,57693,47568,57699,N,N,\r
+47573,57695,57702,57687,47575,47569,57692,48213,57691,57700,47570,N,47574,\r
+57690,57696,57701,57686,47572,57694,N,N,57698,57704,57688,57697,N,47571,57703,\r
+N,N,N,57689,N,N,N,48217,58699,48215,48214,58701,58706,N,58702,N,58705,48220,N,\r
+48805,48219,N,58698,58704,N,48218,58703,N,58700,N,48216,N,N,N,N,N,N,59725,N,\r
+59727,59722,48833,59724,N,48832,59726,N,N,48835,59728,48834,59721,59723,N,N,N,\r
+N,49317,60620,N,49316,60621,49315,60619,49314,60618,N,49747,49746,61942,61944,\r
+N,61943,50017,50018,N,N,50019,62530,50267,N,N,63443,63442,50674,N,42088,42192,\r
+N,N,42919,N,N,N,N,52831,N,N,N,N,46076,46077,N,56562,47576,57705,58707,51546,N,\r
+N,51888,N,N,N,N,N,52290,52832,53593,44620,N,N,61945,N,50396,42089,42366,51568,\r
+N,42599,42600,N,43357,N,N,N,45303,N,47578,N,47579,47577,N,42090,N,42193,42195,\r
+42194,51547,42196,42401,51569,N,42402,N,N,N,N,N,42601,42602,N,N,N,51659,N,\r
+42920,N,51889,N,N,N,43361,52291,N,43359,43360,43358,53594,N,N,N,43958,43957,\r
+43959,43956,N,52833,43362,43955,N,44621,44622,N,44623,N,54477,N,N,N,46078,\r
+55476,45304,N,N,N,N,46840,N,47581,47580,57706,N,48221,48836,N,61376,63194,\r
+63444,42091,42403,N,42404,51665,42604,42607,N,51663,51661,42606,51664,51666,\r
+51660,42609,42608,42605,42603,51662,N,N,N,N,42931,N,N,42928,51894,51897,51896,\r
+N,42922,42930,N,N,42927,51893,51891,42926,N,N,N,42921,42924,N,51892,51899,\r
+51895,42925,42929,42932,51890,51898,42923,N,N,N,N,N,43367,43375,N,52303,52296,\r
+43376,52307,52292,52299,N,N,43366,52293,43364,52300,52304,43363,N,52305,52298,\r
+N,52301,N,43378,43369,52308,52306,N,43374,43372,52297,43371,52295,52294,43370,\r
+43368,43377,43373,43365,N,52302,N,43961,N,43968,52847,43960,52839,52835,N,\r
+52851,52834,N,43963,52844,43966,43969,N,43964,52848,43967,N,44630,52854,52836,\r
+N,N,52838,52845,52849,52853,52850,52843,52846,N,N,52840,43971,52842,52841,\r
+52852,43962,52837,43970,N,43965,N,N,N,N,N,44636,53602,N,44635,N,N,53600,N,\r
+44624,N,44629,N,53599,53596,53601,44625,53595,N,44628,44626,N,53603,44627,\r
+44631,N,N,44632,N,44634,N,N,N,44633,N,N,N,53597,53598,N,N,N,N,53604,N,54484,\r
+45305,55490,54483,54502,N,N,45376,N,54500,N,45310,45306,54509,54493,54496,N,\r
+45379,54506,54498,45307,45380,N,54503,54501,N,N,54486,54507,54495,54490,N,\r
+54480,54508,54492,54479,N,45378,54497,54510,54494,54482,54487,54478,N,45377,N,\r
+54491,54488,45308,54481,N,54505,45309,N,54489,54485,N,N,54504,N,N,N,N,N,N,\r
+46144,55483,N,55480,55497,55485,55498,N,46146,N,N,N,55494,55491,N,N,N,N,N,\r
+55492,55495,55499,N,54499,55501,56647,N,46147,55502,55478,55488,N,55493,N,N,\r
+46145,46148,55500,55503,55482,55479,N,N,55481,N,N,55486,55484,46149,N,55496,N,\r
+N,55487,N,55489,55477,56570,56568,46914,46912,56643,56569,56644,56640,56567,\r
+56646,56566,56573,46846,46845,46844,56571,56641,46841,46913,N,56564,N,56574,\r
+56563,56572,46842,56642,56565,46843,56645,N,N,N,N,N,N,N,57710,47586,47585,\r
+47587,57722,57712,57718,57707,57721,57720,57724,57717,47582,57716,47588,N,\r
+57709,47583,N,57723,47584,57711,57714,57719,57713,57708,N,N,N,N,57715,58709,\r
+48225,58712,58711,58714,58716,N,48223,N,58710,N,58708,58717,58715,58713,N,\r
+58719,N,58718,48227,48222,N,48224,48226,N,N,58720,59735,N,N,59734,59733,N,\r
+59736,59729,N,59730,59738,59731,N,48837,59740,N,59739,59732,N,60625,49320,\r
+60623,60628,60627,59737,N,49319,N,60626,60622,60630,60629,49318,N,60624,N,\r
+48838,N,N,N,49748,N,N,N,61377,61946,61947,61948,50268,N,N,50269,N,62531,N,\r
+62920,62919,N,N,63195,63196,63445,63655,N,42092,42093,N,42094,42197,42405,\r
+51667,42610,42611,N,42935,42936,42934,42933,N,43379,N,N,52309,43381,43380,\r
+52310,N,N,N,43972,N,44637,53605,N,54512,N,45381,46151,54511,46150,N,47589,N,\r
+57725,48839,N,49321,60631,N,50270,N,50544,N,51570,N,42406,51571,42614,N,42612,\r
+42613,42615,N,42938,42937,N,51900,42939,N,N,51901,52311,N,52312,N,43382,43384,\r
+43386,43383,43387,43385,N,N,N,N,N,43976,43973,43975,43977,43974,53606,52855,N,\r
+N,N,53608,53607,44643,N,44639,N,N,44640,44642,44644,44641,N,44646,44645,N,N,N,\r
+N,N,45386,54514,54513,45385,N,45384,45383,45387,45382,N,N,55509,55506,46153,\r
+55505,55510,N,46155,55508,46152,46154,55507,N,56648,N,56649,56650,N,N,N,N,\r
+47590,47598,57726,47592,47596,57761,47597,47593,47594,47591,47595,48230,55504,\r
+48231,48229,N,48228,59741,48840,60632,60633,N,N,50020,50271,N,42095,N,42616,\r
+43978,N,53609,44647,N,N,45390,45389,45388,46156,46157,55511,47599,48841,42096,\r
+51548,42198,51572,N,N,51668,42617,N,N,N,43388,N,N,N,N,56651,N,N,42097,N,42199,\r
+51669,N,N,51902,N,51903,N,42940,N,N,N,55512,46158,N,56652,N,N,N,49322,42098,\r
+42152,42200,51573,42407,N,42944,42943,42941,42942,N,N,52313,43390,43425,52314,\r
+43389,N,N,43982,52856,43981,43979,43980,44650,44648,N,N,53611,44649,53610,N,\r
+44638,54515,N,N,45392,45393,N,N,45391,N,47600,57762,48232,48233,N,58721,49323,\r
+61378,61379,N,50397,63656,51531,42201,N,42099,N,51575,51574,N,N,N,N,42618,\r
+51671,51672,51670,N,51673,N,N,N,N,N,N,N,51911,N,51906,51908,51910,51907,42948,\r
+51904,N,51905,42945,42946,51909,51912,42947,51913,N,N,N,N,N,N,N,52328,N,52322,\r
+52317,43427,52325,52323,52316,52329,52332,52327,52320,43429,52326,43430,52321,\r
+52324,52315,52319,52331,43431,N,43432,N,52318,52330,43426,43428,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,52907,52900,52906,52899,52901,52861,52859,N,52908,52905,52857,N,\r
+43984,52903,52904,N,52902,52860,52858,43983,52898,52862,N,N,52897,52909,N,N,N,\r
+N,N,N,N,N,44655,N,44654,N,53612,44651,53614,N,44656,53615,N,N,44659,N,44657,\r
+53616,52910,53618,N,44653,N,44652,N,53613,53617,44658,N,N,N,N,45395,45394,N,N,\r
+N,54517,54521,54523,45396,54526,N,45400,54593,N,45402,N,45398,45406,N,45403,\r
+54519,45397,N,54518,54516,54595,54520,N,45399,54594,45404,54525,54524,45405,\r
+54522,45401,N,N,N,N,54596,N,54592,55527,55534,55523,46161,55519,55535,55513,\r
+55532,55530,55524,N,55533,55526,N,55518,55536,55516,55529,55514,N,55537,N,\r
+46162,N,55531,56655,55517,46159,N,55521,N,46160,55520,55525,N,N,55522,N,N,N,\r
+55528,N,N,N,N,56659,N,N,N,56662,56654,N,56656,N,56661,56660,46915,N,55515,\r
+56658,N,N,46916,N,56653,56657,N,N,N,N,57769,N,57776,57767,N,57774,57765,57773,\r
+57777,57764,57768,57763,N,47601,N,57766,47602,57772,57771,57770,N,N,57775,N,N,\r
+N,N,58725,58727,48235,58728,N,58723,N,58722,58732,N,58730,48234,58733,58724,\r
+58729,58731,58726,N,N,N,N,59745,59750,59744,59749,N,59742,59752,59748,59753,\r
+59747,59743,59751,N,59754,59746,N,60634,49327,N,49325,N,49324,49326,N,N,61380,\r
+N,61810,61949,N,N,62532,62533,N,50272,N,62921,N,50398,N,62922,N,63198,50546,N,\r
+50545,63197,50633,N,63446,N,N,N,N,42100,42619,51674,51914,43189,45407,N,N,\r
+42101,42410,42409,42408,N,N,42949,N,N,44660,N,56663,42102,42103,42104,42202,N,\r
+N,43985,N,52911,N,N,N,46163,42105,51549,42411,42412,51576,N,42620,N,N,N,51915,\r
+N,42950,N,51916,N,N,43438,N,N,52334,43436,43435,52333,43433,52335,43434,43437,\r
+N,43986,N,43988,52915,52912,52913,52914,52916,43987,N,N,53620,53619,N,44662,N,\r
+44661,N,N,N,N,N,45410,54598,N,45409,45411,45408,N,N,N,N,46165,54597,N,46166,\r
+55539,N,46167,55538,46164,N,N,N,N,56666,56668,46917,56667,56665,56664,N,N,N,\r
+57780,47607,47605,N,47606,57778,57779,N,47603,58737,58735,N,48237,58736,48238,\r
+48236,47604,N,N,59757,59755,59756,58734,60636,49328,60635,61381,61382,59758,\r
+61950,N,42106,42413,42622,51675,42621,N,43439,46918,N,42203,42414,43989,46168,\r
+N,51577,N,51578,N,51676,N,N,42952,51920,51918,42953,51917,51919,51921,N,42951,\r
+N,N,N,N,N,43443,43444,43441,N,N,43440,52920,43442,N,N,N,43990,N,52919,52921,\r
+52918,52922,43991,44665,53621,N,53623,44663,53624,44664,53622,N,52917,54599,\r
+54602,54603,54600,45415,45414,45412,45413,54601,N,N,N,N,45416,N,N,46170,46171,\r
+N,46172,56669,56671,56673,46920,46919,46169,56672,56670,N,57784,N,N,57782,\r
+57788,47608,57789,57786,47609,57783,57781,57787,48240,58739,57785,48242,58740,\r
+48241,48244,58741,48239,48243,N,59763,59761,59760,59762,59759,N,N,50022,N,\r
+62534,62535,N,62923,63199,50773,N,N,43445,42954,N,N,43992,N,N,N,42107,42204,\r
+42415,51677,N,42955,51922,N,52923,43993,N,47610,42108,N,N,N,42657,N,N,46921,\r
+42109,42205,42206,N,42417,42416,N,51678,42658,N,51923,N,42956,N,N,52337,52338,\r
+52339,N,43446,43447,52336,43448,N,N,N,43994,52924,N,53626,44666,N,53625,N,\r
+45417,54604,45418,54605,N,N,N,46173,N,N,N,56674,N,N,57791,57790,N,47611,N,\r
+48245,58742,48842,59764,49329,N,50547,63448,N,N,N,N,52340,N,52925,45419,55540,\r
+46922,N,N,N,49749,N,N,N,N,42958,N,42957,43995,N,53627,N,45421,45891,45422,\r
+45420,46174,N,57792,47612,48246,N,51532,51679,N,51925,42959,51924,42960,N,N,\r
+43452,52343,52342,43451,43449,43450,52341,N,N,43997,52926,44000,43996,44002,\r
+43998,43999,44001,N,N,N,44669,44668,44667,N,N,N,54607,45423,45426,45424,N,\r
+54606,45429,N,45425,54608,45428,45427,N,N,N,55542,55541,N,46177,46175,46176,\r
+55543,46923,56676,46924,56675,N,N,58743,N,N,48248,57793,48247,N,47613,N,60638,\r
+59765,49330,60637,62016,62536,62537,N,42207,N,42418,N,N,N,51579,N,N,42962,\r
+42964,N,51682,51928,51927,51926,N,51681,51680,42660,42963,42961,42659,N,N,N,\r
+43453,52344,N,43454,51933,N,51935,51934,52345,N,N,51930,N,42968,42966,N,51929,\r
+51931,51937,N,42965,N,51932,51941,43456,N,51938,42967,N,51936,51939,N,43455,N,\r
+43457,51940,N,N,N,N,N,N,N,N,52399,52386,52350,52398,52393,44007,43458,52394,\r
+52397,44003,52396,43459,43464,43462,52387,N,52348,52389,43469,52400,44004,\r
+52390,N,44005,43465,52392,N,52941,44006,52347,43466,44008,43467,43463,43468,\r
+52391,52346,52395,43460,N,N,52349,52388,52385,43461,N,52927,N,52928,N,N,N,N,N,\r
+N,52938,53665,52939,44014,52942,52932,44013,52934,N,52935,N,N,52937,44009,N,N,\r
+44707,N,N,52933,52929,44708,N,N,52943,44670,53629,52936,N,53628,52931,52940,N,\r
+N,44012,44705,44018,44706,52944,53630,44011,44710,44017,44016,44015,44709,\r
+52945,44711,44010,N,52930,N,N,N,N,N,N,N,N,N,N,N,N,45430,53668,53670,N,53672,\r
+44712,44718,54611,53676,53667,45432,54609,N,44717,44715,53678,N,54610,N,53669,\r
+N,44716,53673,44719,53675,N,N,44714,53674,53677,53671,N,44713,45433,N,53666,\r
+45431,N,N,N,N,45434,N,N,N,N,N,N,N,54613,54622,46180,N,45436,45475,46181,54624,\r
+45482,55545,54614,45474,45477,45438,54612,54626,54629,55625,N,54627,55549,\r
+45473,45480,45484,54621,55544,54625,45435,55546,54628,55548,54617,N,46178,N,\r
+54615,54616,45479,N,N,45478,54619,45483,54623,45476,54620,N,45481,46182,46179,\r
+55547,N,54618,N,45437,N,N,N,N,N,N,N,N,N,46187,46191,55616,46929,46189,55620,\r
+46193,56677,55622,46931,46185,46188,55623,N,55624,55630,46195,46932,N,55626,\r
+55631,55619,46942,N,46933,46194,55617,55632,N,46941,46192,46926,55629,N,46196,\r
+55621,55550,46186,55618,N,55627,N,46925,46930,46183,55628,N,46928,N,N,N,46184,\r
+N,N,N,46940,57795,56688,N,56680,57794,N,56684,56686,N,N,56683,N,46939,N,56682,\r
+46943,N,N,N,57810,N,N,46938,47680,56689,57796,N,N,46936,56681,56685,47614,\r
+46927,56678,56679,47681,46935,46937,46934,56687,N,N,57800,57801,57806,48253,\r
+57813,N,47687,N,47686,57808,N,48252,57797,47685,N,57812,47683,47684,N,57809,\r
+58794,48250,46190,N,57811,48291,57803,N,48251,N,48290,57798,57802,57799,57805,\r
+47688,48249,47682,N,58746,57807,N,48289,N,48292,N,57804,N,48254,58745,N,N,N,N,\r
+N,58750,48846,58744,59811,58793,48296,N,48294,48844,58790,58786,48300,N,59768,\r
+N,N,N,48298,58785,N,59766,N,58789,N,58792,58749,N,48299,N,N,48293,59767,48845,\r
+58791,48295,48297,58788,48301,58787,58748,58747,48843,58795,59770,60640,48848,\r
+N,59810,N,59774,N,60641,N,48849,59809,N,59772,49332,60639,N,59769,59771,49333,\r
+48851,49331,48850,49335,59773,48847,N,N,N,N,N,N,N,N,61391,N,61383,N,N,N,N,N,\r
+60647,61384,60643,N,N,49750,60645,60644,49334,60642,60646,61392,61388,61390,N,\r
+61385,61386,N,61389,61387,50023,N,N,50026,50025,50024,50273,62538,50274,62017,\r
+50399,62924,50400,50548,50634,63449,N,63450,63451,N,N,63930,42208,51580,42419,\r
+N,42662,42663,42661,N,42664,42970,42969,N,52401,43471,43470,N,N,53679,45485,\r
+45486,N,N,N,46197,56690,46944,46945,56692,56694,56693,N,57815,N,57814,47689,\r
+57816,N,58796,48302,N,48852,N,49336,49751,49337,N,42209,N,N,N,51942,N,N,52402,\r
+43473,43472,43474,44019,52946,52947,N,N,53680,44720,45487,46198,55633,42210,N,\r
+42110,42211,N,51581,42423,42422,42420,42421,N,N,N,42667,51689,51691,42666,\r
+51683,N,51684,N,51690,51686,51688,42665,51685,51692,51687,N,N,N,N,N,N,42977,\r
+42986,42984,51952,51949,51957,42982,51958,N,42975,51955,N,42981,51951,51950,\r
+42979,51956,42980,43475,42974,51953,N,51943,42971,N,42990,51948,51954,42976,\r
+42978,N,51944,N,51945,51946,N,42989,42983,42988,51947,42987,42973,42972,42985,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43489,52414,52407,43484,43503,52403,52410,52412,\r
+52415,43498,N,52411,52404,43496,52408,N,52416,43481,N,52413,43491,43490,52406,\r
+43479,N,N,43480,N,43478,N,43502,43494,43488,43476,52409,43487,43477,43495,\r
+43504,52948,43492,52405,43482,43485,43486,N,43500,43501,43499,43493,43497,\r
+43483,44020,N,N,N,N,N,N,N,N,N,N,N,N,N,N,52954,44097,44024,44026,44096,52966,\r
+44029,53681,44721,44099,52951,52959,44030,52958,52955,52963,52965,44023,44027,\r
+44098,44723,52960,44025,44101,52953,N,N,N,44028,44722,44022,N,52950,52957,\r
+52949,52952,52956,53682,44100,N,52961,52962,52964,44021,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44737,53694,44735,44736,53684,53700,N,44726,N,N,54630,53702,53696,\r
+N,53687,N,53705,53690,44732,54653,53693,44734,44725,N,53707,53695,44728,53688,\r
+53685,53686,44729,53701,53708,44731,53692,53691,44739,44738,44724,44730,44733,\r
+53704,N,N,53698,44727,53683,53706,53697,53699,53703,N,N,N,N,N,N,N,N,N,N,54631,\r
+N,45495,45515,45514,N,45503,N,54649,54645,54642,54694,45498,45490,N,N,54647,\r
+46248,45494,54689,N,45516,45513,54651,54634,N,N,45512,54691,54633,45501,45505,\r
+54690,N,54643,45506,45500,54632,N,46200,54693,54641,45511,54644,54692,45510,N,\r
+55634,N,45491,54639,45496,45507,N,45502,54648,54638,54636,54654,45488,45508,\r
+45492,46199,54652,45493,N,45489,45504,45499,45497,54640,45509,54637,54650,\r
+54646,55636,55635,N,N,N,N,N,N,N,N,N,N,N,54635,55652,N,46202,N,55658,55641,\r
+55655,56695,46205,55659,55662,46204,55644,55661,55660,46206,55637,46201,46243,\r
+N,46241,55657,N,55647,46245,55664,55656,55665,46253,46251,55654,55653,N,55651,\r
+55645,46244,N,46242,53689,55638,N,56759,55639,46203,46250,56697,N,46246,46247,\r
+55640,55663,56696,55648,55643,46249,55649,55646,N,N,46254,46960,N,N,56700,\r
+56753,56758,56746,46956,56763,46953,56698,N,56699,46946,46955,56740,46958,\r
+46959,56741,N,56754,56760,46954,N,46948,56739,56701,56762,56744,56745,56702,\r
+56756,56747,56757,56749,N,46949,57817,46952,46950,56761,56752,56748,N,N,56737,\r
+47699,56751,46957,56743,N,56742,N,N,N,46951,46947,57838,56755,56750,N,56738,N,\r
+N,N,N,N,N,N,57833,N,57818,57829,N,57836,47697,46252,57834,47692,N,N,N,47691,\r
+57841,N,57819,57832,57820,57831,47695,57835,55650,N,N,N,57842,57827,47698,\r
+58810,48303,N,57840,57839,47700,58797,48304,58798,N,57823,57824,57821,57826,\r
+57822,57843,47694,48305,47696,47701,N,57825,N,57837,N,N,57830,N,N,58801,N,\r
+47690,48308,59818,58806,58805,58807,N,N,58804,48309,N,48315,48312,N,48313,\r
+58799,58802,58812,48321,48319,N,58803,55642,48306,58809,58800,N,48322,58808,\r
+47693,48311,57828,N,N,48314,N,48318,48320,48317,48316,N,48310,58811,48307,\r
+48323,N,N,N,N,N,N,N,48856,48857,59817,48866,48863,N,48854,48861,59819,48859,\r
+48853,N,48860,N,59816,49339,48855,N,48862,49338,59815,59814,N,48864,N,48865,N,\r
+59813,59812,49340,59822,48858,59820,N,N,N,N,49341,N,49346,60650,60652,N,49343,\r
+N,60653,60649,N,60651,49344,49347,N,60648,49342,49345,49753,59821,49752,N,N,\r
+49758,61396,N,49756,49757,61399,61395,49754,61393,50027,61397,N,61398,61394,N,\r
+49755,62018,N,62021,N,N,62022,62020,62023,50028,62019,N,N,62542,50276,62541,\r
+62540,62539,50275,50277,N,62925,50402,50401,N,N,63201,63200,63203,50635,50549,\r
+63453,63202,N,N,63452,50637,50636,50675,63657,63727,42212,N,N,55666,59823,N,N,\r
+42668,51959,42993,42991,N,42992,N,52417,43505,44102,N,52967,N,52968,N,44103,\r
+53710,N,44740,44741,53709,N,N,N,N,45523,N,45519,N,54695,45526,45525,45518,\r
+45521,45524,45520,N,N,55670,45517,46255,N,N,N,46257,46258,55669,55672,46256,\r
+55667,55671,N,55668,N,46961,N,N,56764,N,N,47702,57844,48867,48324,58813,48325,\r
+48326,58815,58814,58816,59825,N,N,59824,60655,60654,49348,49349,62024,N,N,\r
+42213,N,N,N,N,55673,N,N,N,46260,46259,56765,N,61400,50403,63454,42214,N,44742,\r
+N,45528,45527,55674,55675,46962,57845,47703,59826,N,42215,42424,N,43506,52418,\r
+N,52969,44104,45529,N,55676,46261,46963,N,58817,58818,N,N,60656,49759,63728,\r
+42216,N,52419,43507,44105,N,52970,N,44743,53714,53712,53713,44744,53711,N,N,N,\r
+N,45531,45532,54696,45533,45530,55677,N,55678,56766,N,N,47705,47704,N,N,60657,\r
+61401,N,62026,62025,62543,N,51550,44106,N,N,42217,42425,N,42670,42669,N,N,\r
+42671,42672,51694,51693,51960,42994,51963,51962,51961,51964,N,N,N,N,43508,\r
+52425,52421,52430,43515,N,43513,52426,52422,52429,43512,43584,52424,52420,\r
+43518,52427,43511,52428,43514,43516,52432,52431,52423,43510,43509,43517,N,N,N,\r
+N,N,N,52975,52981,N,44112,44109,52972,52977,N,44115,44107,52976,44110,44113,N,\r
+N,52979,N,44108,52984,44111,N,44114,52973,52978,52982,52974,52971,N,N,52983,\r
+52980,N,N,N,N,N,N,44752,44745,44748,N,44751,N,53717,N,44746,53715,N,44750,N,N,\r
+44747,N,53718,44749,N,N,N,N,N,N,54700,45535,54699,54701,45534,45539,53716,N,\r
+54698,54702,N,45536,54697,45538,N,45537,N,55719,N,55714,N,46262,46266,46263,\r
+55717,55720,N,46264,N,46265,46270,56775,55718,46268,55715,55713,N,46269,N,\r
+55716,N,N,N,46969,N,56767,46966,46967,46965,56772,56771,56768,46971,N,N,56770,\r
+46267,N,N,56774,56769,46968,46964,46970,56773,N,N,N,47708,N,57848,57847,57846,\r
+47706,N,N,N,N,N,47707,58821,58824,48328,N,N,48327,58825,58820,48330,58822,N,\r
+48329,58819,N,58823,48873,48870,59835,59834,N,59833,59828,N,59829,N,N,N,48871,\r
+N,48868,48872,59827,48869,59830,59831,59836,N,N,59832,N,N,60658,N,N,N,49351,N,\r
+61404,49350,61402,61403,49760,50030,62027,N,50029,N,N,62545,62546,N,50278,N,\r
+62544,50404,N,63455,50638,63658,63659,N,42218,N,42673,42674,42995,N,52433,\r
+44116,44753,45540,N,N,45266,N,46271,46272,46028,55721,N,46972,57850,57849,N,N,\r
+42219,42675,52434,43586,N,43585,N,52985,52986,N,53719,53720,44754,44755,N,\r
+44756,54703,N,N,45542,N,46274,N,46273,56776,57210,57851,59837,N,N,49761,50279,\r
+42220,N,42428,42429,42427,42430,42426,N,N,42678,N,51702,42677,42679,N,N,51697,\r
+51696,51699,51698,51701,42676,51695,51700,N,N,N,N,N,51965,43005,51966,52035,\r
+43004,N,52039,52034,52037,42997,42998,42999,43000,N,43072,N,52033,43002,43073,\r
+N,52032,52038,N,43001,52036,43003,42996,43006,N,N,N,N,N,N,N,N,N,43607,N,52436,\r
+43587,N,43597,43598,43590,43608,43592,52444,43603,52439,43593,52454,52455,\r
+52447,52440,43606,52452,43601,43599,N,52453,N,52451,52443,52435,52442,43594,N,\r
+43600,N,43588,52446,52445,52437,N,43602,52449,52438,43605,52456,43589,N,43596,\r
+52441,52450,43604,N,43591,43595,N,52448,N,N,N,N,N,N,N,N,N,N,N,N,N,N,53083,\r
+44124,44137,N,53078,53068,44130,53066,44123,53061,44133,53074,52990,53057,N,N,\r
+N,N,53060,52987,53073,53089,44128,53062,53080,N,52989,53087,53088,53091,53082,\r
+53067,53075,44134,44121,44129,44141,44118,44120,N,N,N,53059,44138,44131,53085,\r
+53056,44140,44135,53065,N,N,44139,53072,53064,44132,53084,53076,N,44126,53090,\r
+53063,44122,53081,53071,44127,53077,44119,52988,44136,44771,44125,53070,53069,\r
+53058,N,53086,N,53079,N,N,44117,53740,44778,53741,N,53729,44767,44779,N,53722,\r
+N,53731,53739,N,53721,53748,44757,N,N,N,53747,53742,N,53743,44765,44776,53733,\r
+N,53734,53744,53735,N,53730,53724,53725,53738,53732,N,N,44758,44762,53746,\r
+53726,44774,44770,N,N,44773,44780,44763,44775,53737,44777,44760,N,44759,53723,\r
+N,53727,44768,53745,53736,53728,44772,44769,N,44761,44764,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,54724,N,54708,54709,54713,N,54728,54725,N,54718,54717,\r
+45549,54721,54736,54704,N,54737,54723,54741,54729,45548,54727,45543,45564,\r
+45554,N,45558,45557,54705,N,54734,54740,54732,54739,N,N,54720,54706,54738,\r
+54722,45546,45559,N,54731,45552,N,N,N,54730,54707,45560,N,45562,54733,45563,\r
+45545,54714,54735,N,N,45551,45561,54716,54726,54711,54715,45556,54710,45544,\r
+45553,45550,54719,44766,55744,45547,N,N,N,N,N,N,N,N,N,N,N,N,N,N,45555,N,55747,\r
+55769,55758,46294,N,46289,55741,46290,55757,N,55750,55763,46286,55723,55765,\r
+46276,55731,46279,46278,N,46295,N,55725,55759,55760,46281,46277,55739,N,46288,\r
+55734,N,55761,46284,55753,55766,55728,55733,55727,N,46283,55746,56798,55729,\r
+46287,55738,55762,46282,55735,55732,55749,46285,46275,46297,55752,55751,55724,\r
+46280,55764,55740,55742,N,55755,55754,55722,46291,46293,55730,55737,55745,\r
+46292,55736,55748,55767,N,55756,N,N,N,N,N,N,N,N,N,N,N,N,N,55768,N,N,N,N,55726,\r
+N,N,N,N,56818,47014,N,56816,56795,56800,56793,N,56812,56779,56786,N,56810,\r
+56820,56796,N,56783,56802,56807,56787,N,56804,56784,N,N,56791,56792,47016,\r
+56811,56809,N,56780,56814,N,56815,56817,47020,47012,N,54712,56788,56806,56789,\r
+47009,47025,56813,47023,47019,56778,47011,N,56781,47024,N,56797,56777,N,47017,\r
+56801,56785,47018,56794,46974,46296,56803,55743,56782,N,N,56808,47013,56805,\r
+47010,56799,47021,56790,56819,N,N,N,N,N,N,47015,57030,N,N,47022,N,N,N,N,N,N,\r
+57930,57928,N,57950,57926,N,57944,46973,47711,57922,57949,N,57927,57941,47716,\r
+47709,N,57947,N,57920,57946,N,47727,57937,57953,47725,57929,47710,57931,57945,\r
+47719,57924,47723,47713,57933,57923,57852,N,57943,47720,57952,57853,47717,N,\r
+57939,N,47718,57925,57936,57932,57934,N,47712,57951,47726,57935,N,57954,N,N,\r
+57854,57940,47715,47724,47722,57921,57942,47721,N,N,47714,57938,N,N,N,N,57948,\r
+N,N,N,N,N,N,N,N,58837,N,58833,58829,58849,58846,48333,N,N,58853,58836,48344,\r
+58843,N,N,58832,58842,48341,58862,N,58859,58845,58830,N,N,58850,58852,48337,\r
+58840,58835,58826,48334,48342,N,58855,48343,58827,58861,58848,58854,48340,N,N,\r
+58851,N,58858,N,48345,N,48339,58844,58831,58863,58828,58856,48336,N,58838,N,\r
+58839,48335,48332,58834,48338,N,48331,N,58857,58860,58841,59850,N,N,N,N,N,N,N,\r
+N,N,59842,N,59838,48886,N,N,48875,48880,48876,59852,59863,48874,59844,59853,\r
+58847,59854,N,N,48881,N,59869,48885,48888,59840,N,48884,N,59867,59868,59858,\r
+59857,59849,N,N,59859,59866,59865,N,48879,48877,59851,59848,N,59845,59864,\r
+48887,59862,48883,48882,N,59856,N,59839,59841,59843,59861,59855,48878,N,59846,\r
+N,59860,N,N,N,N,N,N,59847,N,N,N,N,N,N,N,49359,60741,49352,60661,N,60737,49354,\r
+60744,N,60668,N,60663,N,N,60745,60659,60670,N,49361,60740,60746,60669,49353,\r
+60736,60660,49360,N,N,60743,60665,49356,N,60667,60664,49362,60666,49355,49358,\r
+60739,60662,60742,N,60738,N,N,N,49763,61415,49768,49769,N,N,N,49762,61414,N,\r
+61411,61412,49766,61406,61410,49765,N,61407,N,N,N,N,49767,49764,N,61405,61409,\r
+61413,N,N,N,62033,62030,62039,N,62038,62036,62031,N,50034,N,N,N,N,N,62032,\r
+50033,49357,62035,50032,62040,62034,62029,61408,N,N,N,50031,N,62028,62550,N,\r
+62549,62037,50280,N,62553,62554,62548,62552,N,62547,N,N,N,N,62929,62551,50407,\r
+50405,62927,62930,N,62926,62928,50406,N,N,N,63205,63206,50550,63204,N,N,N,\r
+63458,50639,63456,63457,63660,N,N,50774,63731,63729,63730,63732,N,N,N,63931,N,\r
+42221,42680,N,43609,N,52457,N,N,53092,N,N,N,53749,53751,N,53750,N,53752,45565,\r
+54743,53753,N,54742,54744,54745,55770,46299,55771,55773,46300,46298,55772,N,\r
+56826,56824,56823,N,56822,56821,47026,56825,47728,57955,57957,47729,57956,\r
+48347,N,48346,58864,N,N,59871,59870,59872,N,N,48889,N,60747,49363,N,61416,\r
+49770,62041,50551,42222,42431,42681,43074,43610,43611,N,N,44142,N,N,53754,N,N,\r
+N,N,47027,N,N,N,59089,48890,49771,42223,N,42682,N,N,52459,43612,52458,N,53093,\r
+44143,53094,N,44144,N,53756,44782,44781,N,54750,54748,54749,54747,N,54746,N,N,\r
+55774,55777,46302,55775,46301,55776,N,56827,N,N,57958,57959,57960,N,58867,\r
+58866,48348,58865,58868,59873,N,N,59874,59875,N,60748,49364,49772,62042,N,\r
+50408,51551,N,44145,53095,44783,N,N,45566,N,46303,55778,N,47029,47028,N,N,\r
+57961,57962,48349,48350,59877,59876,61417,63459,42224,51552,42432,N,43075,\r
+52040,N,44146,47030,42225,N,53096,44147,53097,N,49365,42226,N,N,52460,N,53098,\r
+N,53826,53825,53758,N,53757,53827,53824,N,N,45632,45633,N,N,46304,55779,N,\r
+55780,55781,N,N,N,56897,56898,56896,N,56829,56830,47031,57963,58871,58870,\r
+58869,58872,59879,59878,48891,59880,N,49366,60749,N,61418,62043,63207,N,42227,\r
+42434,42433,N,43613,51553,51582,42683,N,51703,52041,52042,43614,N,52461,N,\r
+44148,53099,53100,N,44784,44788,53828,44787,44785,44786,N,54751,45634,46307,N,\r
+46305,46306,55782,N,N,47730,42228,N,51617,N,42435,N,N,51620,N,N,42438,51619,\r
+42437,42436,43076,51618,N,N,51704,N,N,N,51708,51710,51776,42693,42694,51707,\r
+42689,N,51705,N,51709,42690,N,42685,N,42686,N,42692,51706,42684,43077,42687,\r
+42688,42691,N,N,N,52059,52057,52044,43089,52051,43084,52045,N,52053,N,52050,\r
+43087,52049,43094,52058,43096,N,43098,N,52043,N,43085,52060,N,43092,43095,N,\r
+52549,43079,43102,43093,52046,43082,43097,52054,43080,43081,52547,52047,43088,\r
+43099,52061,52048,43086,N,43091,52462,43100,52055,43090,N,43101,43078,52052,\r
+43083,52056,52548,N,N,N,N,N,N,N,N,N,N,N,N,N,43626,43642,52469,43633,N,52555,\r
+43618,N,43621,52546,N,52467,52471,43629,43631,52474,43638,43624,43622,43623,\r
+43637,52551,43632,52473,52475,43630,43635,52476,52554,N,44149,43641,N,43619,\r
+52553,N,52557,52472,52559,52544,43628,52468,43627,43645,43634,N,52466,53109,\r
+43640,43644,52545,52550,N,43646,43639,43625,43615,N,43620,N,52470,43616,52558,\r
+N,52464,52463,52477,52465,43643,44789,43636,52478,43617,N,44198,N,N,N,52556,\r
+53116,53153,N,53156,53111,N,N,53159,53162,53164,53108,44150,44155,53833,44205,\r
+53157,53165,53115,53107,N,N,N,53860,44158,53154,53112,53114,44197,N,53117,\r
+44157,53104,53160,N,53163,N,N,44154,N,44200,53101,44202,44152,44206,53161,\r
+53103,44203,53854,52552,44156,44151,53110,53102,44204,44196,53155,44201,44199,\r
+53113,44193,53105,44194,44195,53106,53158,44153,53118,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,53836,44797,44867,N,N,N,53845,53851,53847,53834,53837,53830,\r
+53831,44874,44794,53846,53855,44869,44790,N,44864,53838,44866,53839,53849,N,N,\r
+N,44868,53864,53832,44796,44795,44872,53829,53862,53850,53863,53857,53843,\r
+53858,N,53852,53861,53859,44873,53844,44793,44792,44865,44871,53856,44870,\r
+53841,45635,N,53865,53840,53835,44798,44875,44791,N,53848,53853,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,45669,54753,54757,N,45650,45648,N,N,45639,54755,54754,\r
+45659,N,54760,45653,N,54778,54855,45636,54775,54768,45671,54752,N,54780,N,\r
+45668,45656,45667,45646,54764,54782,54774,45647,45641,54853,N,54781,54848,\r
+45649,45657,54850,54762,54779,54767,54852,45662,45638,45660,54772,54770,54771,\r
+45651,54766,54765,45640,54759,54854,45642,54769,45672,N,45666,54758,45663,\r
+45661,45670,54776,45665,53842,54777,45664,54849,45637,54773,45655,54761,45654,\r
+N,45652,45644,45643,55783,54851,54763,N,N,55804,N,45645,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,46401,45658,46318,55798,46332,N,55786,46315,46311,55881,46317,\r
+46321,46316,46325,55885,55876,N,N,55793,46330,46324,55805,46308,55882,55875,\r
+46312,55799,46327,55893,55894,N,46309,55880,46329,55803,55789,55790,46333,\r
+55794,55801,55795,N,46331,46404,55791,55784,55785,N,55787,46314,55800,N,46328,\r
+46402,N,N,55802,55891,55883,46310,55889,46322,N,46320,N,55895,46319,55873,\r
+55796,55806,46407,55877,55874,55792,46403,55887,55884,55892,46313,55872,46406,\r
+N,55879,N,N,46323,46326,N,55878,46405,55797,54756,N,N,55888,55886,55890,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,55788,46400,N,N,N,56929,56928,56902,47037,N,56927,56905,\r
+56906,N,47047,56936,47042,56926,N,56899,47048,47038,56914,56904,56907,56931,\r
+47032,56938,56930,47041,56919,47052,N,N,47051,47045,N,N,56937,47033,56917,\r
+56908,56921,56933,47053,N,47035,56916,N,56909,47044,N,47043,56912,56922,56932,\r
+56903,56913,47036,56923,47049,47040,56910,47039,56901,56915,56935,46334,47792,\r
+56918,57964,56920,56934,47046,56911,47034,47050,48368,56900,N,56925,N,N,N,\r
+56924,N,N,N,N,N,N,N,N,N,N,N,N,N,N,58026,47789,57981,58020,47778,N,57966,47791,\r
+N,47735,57965,58032,47793,57969,58019,N,57971,58035,58031,47733,47777,58963,\r
+47790,47741,57967,N,58030,47779,58027,58040,57973,57982,N,N,58038,58028,47740,\r
+N,N,57980,47734,47732,47784,N,N,57978,57975,57976,N,58034,N,58039,58037,47738,\r
+58041,47742,47783,N,57968,58874,57977,N,47736,47788,47785,47739,58021,57972,\r
+47786,58023,47780,47782,47731,N,58025,58017,57970,47781,58033,58036,57979,\r
+58024,N,47737,48351,58022,58873,N,58029,N,N,N,N,N,N,N,N,N,N,57974,58948,58958,\r
+48354,58957,58969,48356,58955,N,58959,48367,N,58950,48359,N,58962,59888,48371,\r
+48370,58964,58947,58974,48365,N,48355,58967,N,58971,58976,58965,58953,48358,\r
+48361,48369,48364,N,58956,58018,N,N,58952,58975,48360,N,48363,58977,48352,\r
+58966,58875,58972,49375,N,58954,N,48353,58949,48357,58876,47787,58945,N,58970,\r
+58946,58944,48362,N,58968,N,58878,58961,58960,58973,58951,48366,N,N,N,N,N,N,\r
+59891,N,48969,48894,59968,59883,48961,59895,48968,48963,59893,60751,59899,\r
+59970,59898,59881,59896,59972,59974,48893,59973,48964,48970,N,48967,N,59902,\r
+48966,59897,N,59885,59890,N,59901,48965,48962,48892,48960,59889,N,58877,59884,\r
+59887,59969,59892,59882,60750,59971,59886,59900,N,N,N,N,60753,49379,N,N,49367,\r
+N,N,49371,60755,60761,60759,49369,49370,49377,60762,60754,49372,N,60758,60757,\r
+60763,49378,N,49373,49376,60756,49380,49374,49381,49368,60760,N,60752,N,N,\r
+61431,N,N,49777,61428,61430,N,49775,61426,61427,61422,N,N,59894,61423,49776,\r
+61419,N,49773,61432,49774,61420,61421,61425,49779,N,49778,N,N,61424,50040,\r
+62047,62053,50041,62044,50038,50035,62055,50039,N,50036,62046,62049,62050,\r
+62051,62054,N,61429,62045,50037,62052,62056,62048,N,N,N,62557,50282,62560,\r
+50283,62568,62559,62556,N,62558,62562,62565,62564,62567,62555,N,50281,62563,\r
+62566,62569,62561,62931,62932,62936,62937,N,62934,62935,62933,N,50409,N,N,N,N,\r
+50552,63211,N,N,63208,63209,63210,50553,N,63461,63460,N,63663,50676,63661,\r
+63664,63662,63733,50775,50789,63907,63852,N,63906,63952,63953,42229,N,N,N,N,\r
+42695,51777,N,N,52062,N,43103,N,43106,N,52063,N,43104,43105,N,N,N,N,52568,\r
+52570,52565,52562,52564,N,N,N,43684,N,N,N,43682,N,N,52566,43683,52563,52560,\r
+43681,52567,N,52561,43685,52569,N,N,N,N,53167,N,53171,N,N,44215,N,N,N,N,53174,\r
+N,44207,44210,44212,44214,44211,53170,53169,N,44209,53172,53173,N,53166,44213,\r
+N,44208,N,N,N,53168,N,N,N,N,N,N,53879,53880,53881,44880,N,44876,53870,N,53878,\r
+53883,44881,N,53868,53874,53867,53877,N,N,53873,44877,44879,53882,N,53866,\r
+53869,53875,N,53876,53884,53872,N,44878,N,N,N,N,N,N,N,N,N,N,45677,54862,N,N,\r
+54864,54860,N,54872,54858,54871,45673,54856,55899,54866,45676,N,54867,54870,N,\r
+54874,N,54863,N,54868,N,N,45674,45675,54873,54861,54857,54875,N,54865,N,N,\r
+54869,N,N,N,54859,N,46408,46409,55909,46415,N,55897,55906,55896,46412,55904,\r
+55902,N,55903,46410,N,55907,N,N,N,N,N,55900,55898,46411,55901,55905,N,N,N,\r
+46413,N,N,N,55908,N,N,N,N,N,N,56944,56951,56953,56993,N,47066,56939,N,47058,N,\r
+56954,47063,56994,47054,N,56957,N,56941,56958,56940,N,47068,N,56952,47055,\r
+56995,N,47060,56945,47065,56956,56943,56950,56946,56942,47057,47064,47062,\r
+47059,47067,47056,56949,N,47061,N,46414,N,56955,N,56947,N,N,N,N,N,56948,N,N,\r
+58049,N,47796,N,N,58045,58051,58047,N,47798,58046,58050,58042,N,58044,47797,N,\r
+N,N,N,58048,58043,N,47799,N,47794,N,N,58052,N,47795,58983,58980,58992,58986,\r
+58988,48372,58982,58990,N,N,58989,58987,N,58993,48375,58984,58991,N,48373,N,N,\r
+58979,58981,48374,58978,58994,N,58985,N,N,59978,48977,N,N,59989,59987,48971,\r
+59977,59980,59981,59976,48981,48982,59975,59990,59985,48975,48972,59984,59982,\r
+N,N,48978,59986,48973,N,48974,N,59983,48976,59979,N,59988,48979,59991,59992,\r
+48980,N,N,49383,49390,60764,60770,N,60768,49386,49385,49382,60766,N,N,N,49388,\r
+49387,49384,N,60769,60765,60767,N,49389,N,N,N,49783,61435,N,49780,49781,61437,\r
+49782,61434,61433,62060,61436,N,62061,50042,62059,N,N,62058,N,62057,50043,N,N,\r
+50284,N,N,62570,62571,N,N,N,N,62940,62939,50410,N,62938,63212,63213,N,N,63462,\r
+63665,N,N,63734,63932,50809,63942,42230,N,43686,43687,N,N,44216,N,N,N,N,49391,\r
+42231,N,43688,44882,47069,42232,N,45678,47800,51554,N,53175,53885,N,58053,N,\r
+49392,42233,43689,53176,53177,55910,46416,N,N,56996,N,N,47070,58054,N,N,48376,\r
+N,50044,42234,55911,42235,N,42697,51778,42696,43109,43108,43107,52064,N,N,N,\r
+43690,N,43691,52571,N,53178,N,53181,44218,53179,N,44217,53180,44219,N,53922,\r
+53921,53886,44883,N,54877,54878,45679,54876,54879,46418,45680,N,N,46417,55915,\r
+55914,N,55912,55913,N,55916,56998,56997,57001,N,57000,56999,47801,58057,N,\r
+58056,47802,58055,58995,N,58996,48377,N,59993,59994,N,N,62066,50045,62065,\r
+62064,62062,62063,50411,62572,63214,63735,N,42236,N,51621,42439,51622,N,N,N,\r
+51779,51780,N,N,N,N,52070,N,N,52066,N,52065,43692,52069,43111,52067,43110,\r
+52071,52068,N,N,52575,53182,52573,52580,N,43693,N,43696,52581,52577,N,52578,N,\r
+52572,43695,52574,43694,52579,N,52576,N,N,53186,44221,44222,N,53189,53183,N,\r
+53188,N,53184,44220,53187,53185,N,N,N,N,N,N,N,53928,53925,N,53927,44888,44887,\r
+44885,53924,53929,44884,44886,53926,54887,53923,53930,N,N,N,N,N,54882,54886,N,\r
+54885,55918,55929,N,N,54888,N,54883,55917,45684,N,N,45683,54881,54884,45685,N,\r
+45682,45681,54880,54889,N,N,N,55920,55927,N,46420,55926,55923,N,46422,N,N,N,\r
+55925,N,N,55919,55921,55924,55922,46421,55928,46419,47071,N,N,57005,57004,\r
+57002,N,47074,47073,57006,N,57003,58058,47803,47072,N,N,N,57008,57007,N,58061,\r
+58059,48378,N,47804,58060,58998,N,N,N,N,48379,58997,59006,59005,59003,N,59002,\r
+58999,59000,59001,59004,59041,N,N,59999,59996,59997,48983,59995,60001,60000,\r
+59998,N,60772,60773,49393,N,49394,60771,N,49785,61438,49784,50046,N,50081,\r
+50285,62574,62573,62941,63215,50554,63464,63463,63465,42440,53190,44889,45686,\r
+54890,42441,51623,42237,N,N,51781,N,N,N,52076,52074,52075,52072,43112,52073,N,\r
+N,N,N,N,52589,N,43699,52587,52583,52586,N,52582,43701,52585,N,43698,43697,N,\r
+43700,52588,52584,N,N,N,N,44226,44229,53198,53197,53196,44223,53205,53195,N,\r
+44225,53935,N,53202,53200,44228,N,53192,53203,N,53194,53204,53201,53193,N,\r
+44224,53206,53191,44227,N,N,N,N,53940,53931,53942,N,53934,53945,53946,53932,\r
+53944,53941,53939,53943,44895,N,44893,N,N,53937,N,53933,N,53936,53947,53938,\r
+44894,53199,N,44890,44892,N,N,N,N,N,54904,54893,54891,N,54892,N,54899,N,54900,\r
+54896,45691,54901,54898,54895,N,45689,54894,45687,45690,54897,54905,44891,\r
+45688,54903,54902,45692,N,N,N,N,N,N,N,N,55934,N,N,N,55969,46432,N,55975,N,N,\r
+55977,55970,46426,55974,55973,46427,46433,N,46434,55976,46424,55933,55931,\r
+55971,55930,46431,55932,55972,55978,46425,46430,46428,46429,N,N,N,46423,N,N,N,\r
+N,47081,57015,47080,57019,N,57009,N,57020,N,N,N,57010,57011,N,57021,57018,\r
+57016,57017,57013,57012,N,57022,47077,N,57014,N,47082,47076,47083,47084,N,\r
+47079,47078,N,N,58062,47806,47805,N,N,58067,N,48380,47807,N,N,47809,58068,\r
+47075,47808,58064,58066,58063,N,58065,N,N,N,59051,N,N,59050,59047,48448,60002,\r
+48449,59046,N,48382,N,59048,59045,59042,59049,59043,59044,48381,N,N,N,N,60777,\r
+N,60006,N,60005,60007,N,60774,48986,N,60003,N,48984,N,48988,48987,60004,60008,\r
+N,48985,N,60781,49397,49786,49398,49395,60778,60776,N,60779,N,60782,49396,\r
+60780,60775,N,N,61506,61509,62069,61504,N,62575,61510,N,50082,61508,49787,\r
+61505,61507,61511,62070,N,62068,N,N,N,N,50083,62067,N,N,N,50286,N,N,N,N,50413,\r
+63217,50412,63219,63216,63218,50640,63666,42442,52590,53948,53949,45693,57023,\r
+48989,50084,50555,63667,42443,N,52591,41568,N,N,53207,N,53208,N,N,N,N,N,53950,\r
+53951,45694,45729,N,N,N,55979,N,57026,57025,57024,58069,N,58070,58071,47810,N,\r
+N,59053,59052,N,N,60009,48990,48991,N,60786,60783,60784,60785,61513,61512,\r
+49788,62071,62942,42444,N,44230,N,45730,57027,N,42445,N,53952,45731,N,N,46435,\r
+46436,N,42446,42447,51782,43114,43113,44231,53209,55980,42448,42449,42450,\r
+42451,N,N,N,43115,43116,52078,52077,N,N,43702,52594,52592,52593,N,N,N,N,N,N,\r
+53210,53211,N,N,44235,44233,N,44234,44232,N,N,N,N,44896,N,N,N,N,44900,44899,\r
+53953,44898,44897,N,53954,N,N,45734,54907,54906,45732,45733,N,N,N,46438,46437,\r
+55982,N,N,55981,45735,N,N,N,N,N,47085,57029,47086,57028,N,N,N,58072,59054,\r
+48450,60010,N,N,N,60787,N,50086,50085,N,N,50556,42452,52595,N,N,45736,58073,\r
+47811,N,N,52079,52080,N,N,52596,43704,43705,N,N,43703,N,N,N,N,44239,44240,\r
+44237,44238,N,53212,N,N,53213,44236,N,N,N,N,53955,N,44904,44905,N,45739,53961,\r
+N,44910,44908,53962,53957,44907,44906,44901,53960,53959,53956,44909,N,53958,\r
+44902,N,44903,N,N,45740,54945,54946,45741,54908,54910,54948,54947,54909,N,\r
+45737,45738,N,55990,46443,46442,55984,46440,N,55987,46444,55988,46445,55985,\r
+46439,46441,55989,N,55986,55983,N,N,N,N,N,57042,N,57031,47088,47091,47090,\r
+47095,47094,57043,57041,57034,57038,57037,47092,57040,57036,57044,57035,47093,\r
+47087,47089,N,57033,N,N,N,N,58075,47815,58079,47814,58076,47813,N,57032,57039,\r
+58078,N,47816,58080,58077,58074,N,N,59057,59061,59063,59059,59058,59056,48453,\r
+48451,48456,48457,59060,48454,59055,48455,47812,59062,48452,N,N,N,60012,N,\r
+60011,60019,60013,60018,60015,48992,60017,N,N,48993,N,48994,N,60016,60014,N,N,\r
+N,N,49400,60788,N,N,49399,60791,60789,60790,N,N,49401,N,N,N,61517,N,49825,\r
+61518,N,N,49789,61519,49790,61516,61520,N,61514,N,N,50087,62072,50088,50287,N,\r
+61515,50288,N,N,N,50414,62943,N,50558,63220,50557,N,63466,50677,50678,N,N,\r
+63948,N,N,44241,53214,N,46446,46447,42453,42698,51783,N,52081,43117,N,43706,N,\r
+44242,44243,44244,54950,53963,44911,N,N,45742,54949,N,N,55992,46449,N,55991,\r
+46448,N,N,57045,48458,59067,59064,59065,59066,N,N,N,N,N,60792,N,61521,N,N,N,\r
+62577,62576,N,63221,42454,52597,44912,N,N,N,46450,57046,N,N,58081,N,48459,\r
+60020,N,61522,62578,42455,N,N,43707,44247,53215,44248,44246,N,44245,53964,\r
+44913,N,N,44914,44915,N,N,N,45744,54951,45743,N,N,N,N,N,55993,45745,46451,\r
+57047,47096,47097,N,47817,N,47818,48460,48996,60021,48995,N,60793,49402,N,\r
+61523,62579,42456,43118,52600,52599,43708,52598,43709,52601,N,53221,44251,\r
+44250,53223,53222,44255,N,44254,44249,N,53217,53218,53219,N,44256,53216,44252,\r
+53220,44253,N,N,N,N,53967,53971,53969,53968,N,53972,N,N,N,53973,53974,53966,N,\r
+53965,N,44917,44918,N,53975,53970,N,54960,N,53976,44919,44916,N,N,N,54954,N,\r
+54953,N,54955,54956,54958,54957,54962,45749,45746,45750,54952,45751,54961,\r
+45748,54959,45747,N,N,N,N,N,55996,55998,55994,55995,N,N,55999,56001,56002,\r
+55997,56000,46452,N,N,57051,N,57056,57048,57052,N,N,57057,57053,47098,47171,N,\r
+47101,57049,57050,47822,47174,47102,N,47172,47100,57055,47173,57054,47169,\r
+47099,47170,57058,58086,58088,N,N,N,N,N,N,N,N,N,47168,N,N,58083,47820,58089,\r
+47821,58087,58082,58085,58090,47819,58084,N,48462,59071,59070,N,48465,48463,\r
+59068,48461,59069,N,48464,N,N,N,60029,N,60065,N,60030,60022,60026,60025,60023,\r
+48998,48999,48997,60024,60027,60028,N,49000,N,49472,60835,N,49404,60795,49406,\r
+49473,N,N,49405,60834,60796,49403,60833,60794,60798,60797,N,N,61525,49828,\r
+49829,49826,N,49827,N,N,61524,N,62075,N,N,50089,N,62073,62074,N,62580,62583,\r
+62581,62582,62944,N,N,50415,63467,63668,N,50679,63736,63737,50790,42457,44257,\r
+N,56003,N,57059,N,42458,43119,N,43710,N,53224,53225,44920,N,N,56004,46453,\r
+47175,49474,60836,62076,62584,42459,N,N,N,52641,52602,52604,52606,52605,52603,\r
+43711,44258,53234,N,53229,53226,N,N,53233,N,N,44260,44261,53232,53231,53230,\r
+53227,53228,53235,44259,N,N,N,N,N,N,N,N,44924,N,44964,44963,53985,53979,53977,\r
+N,44961,54969,44922,53982,53986,53988,53984,53978,44962,53983,53981,44921,\r
+53989,44965,53987,44925,53980,N,44926,44923,N,N,N,N,N,N,N,N,N,N,45753,N,54970,\r
+N,N,54963,54965,54967,N,54968,54966,45754,N,54971,N,54964,N,N,N,N,N,N,N,N,N,\r
+56008,46454,56016,N,56005,N,56017,N,56006,56007,N,N,56015,56014,56011,45752,\r
+46455,56009,56012,46456,56013,56010,N,N,N,N,N,N,N,57070,N,57074,47182,N,58096,\r
+47185,57072,N,N,57069,57064,57066,57067,57060,N,47181,N,N,47180,N,47176,57063,\r
+N,47183,N,47184,57062,57065,57073,47178,47179,57071,57061,N,N,N,58098,47824,\r
+58100,57068,58102,47828,58103,58099,N,47825,58095,47827,58092,58097,58101,\r
+58094,N,N,47177,N,58091,47826,58093,N,N,N,N,N,48468,59073,48472,N,48470,N,N,\r
+47823,N,59080,59081,48467,N,N,59079,59082,48469,48466,59075,59072,59077,59074,\r
+48473,59076,N,N,59078,48471,N,N,N,N,49002,60072,N,60066,60070,60076,60077,\r
+60073,60074,60071,N,60068,N,49004,49001,60067,60069,N,49003,60075,N,49478,N,N,\r
+60842,60837,49477,N,N,49475,N,60844,49476,60840,60841,60838,60845,61526,49479,\r
+60839,N,60846,60843,N,N,N,61530,N,N,61527,N,49830,N,61531,61533,61532,61528,\r
+61529,N,N,62115,N,50090,N,62078,62114,62077,62116,N,N,62113,N,62586,62589,\r
+62585,50289,62587,62588,62590,50290,50292,50291,62945,N,62947,N,62946,N,N,N,\r
+63222,N,N,63669,63738,42460,N,N,52082,43712,52643,43713,43714,52642,N,53240,\r
+53239,44262,44265,44264,44263,53236,53238,53237,N,N,53992,44967,53996,53995,\r
+53994,53990,44966,44970,44973,N,N,44974,53991,53993,44972,44971,44969,44968,\r
+54978,N,54976,54972,45755,N,54973,45756,54974,54975,54977,N,45757,N,N,56021,N,\r
+56020,56019,56018,N,N,N,N,57078,47186,N,57075,57077,N,47187,N,47188,57076,N,N,\r
+N,N,N,58177,N,58105,58106,N,47831,47829,47830,58179,N,58178,58110,58109,58108,\r
+58107,58176,58104,N,59083,59088,59086,N,N,N,59085,59084,59087,N,60078,N,49005,\r
+49480,60848,N,49481,60847,61535,61534,49831,N,62117,50091,62625,50593,63223,N,\r
+63671,63670,51624,44266,44267,54979,N,47190,42461,43122,43121,43120,N,N,N,\r
+52644,N,N,43716,43715,N,44270,N,53242,53245,53243,N,44268,44269,N,N,53241,\r
+53244,N,44981,N,N,N,54003,54005,54004,44978,53999,N,N,44976,44975,N,44979,\r
+44977,N,44980,54002,53997,53998,54001,54000,N,N,N,N,N,N,N,54982,54983,54981,N,\r
+54980,45758,46461,N,56022,56024,56026,46460,N,N,46458,N,56023,46459,56025,\r
+46457,N,N,57153,57079,57082,57086,47194,57084,N,57083,57080,57081,47192,57152,\r
+47191,N,47196,47195,47193,N,57085,N,N,N,58185,N,58184,N,N,58180,N,N,47832,\r
+58183,58182,47833,N,N,N,N,N,48478,N,59090,N,48479,48475,48477,N,48474,48476,N,\r
+N,N,60079,N,49008,60081,60080,N,58181,49010,49009,49006,49007,N,N,N,N,N,60853,\r
+N,60851,49482,60852,N,60854,60850,60849,N,N,61536,49834,49832,49833,N,N,N,N,\r
+62118,62119,50093,N,50092,62627,62628,62626,N,63224,63225,N,N,42462,51784,\r
+43123,N,52645,43718,43717,52646,N,N,53312,44271,53246,44272,N,N,44982,54008,\r
+54006,54012,44983,54007,54011,54009,54010,N,N,54984,54986,N,45759,N,54985,\r
+45760,46498,46497,46462,56027,N,N,N,N,57156,47197,47198,N,57155,57154,N,N,N,N,\r
+58186,47835,47834,58187,58188,N,48481,48480,N,60085,59091,59093,59092,60084,\r
+60082,60086,60083,N,49011,N,N,N,60855,49483,60856,60857,N,N,49835,49836,N,\r
+50293,N,N,50641,42463,N,N,N,N,N,53313,N,N,N,N,N,N,54013,44984,N,N,N,N,N,46010,\r
+46009,N,N,46500,56029,46499,56028,N,N,N,N,57157,N,47836,58189,47837,N,N,N,N,N,\r
+N,50294,62629,N,42699,43719,52647,N,44274,N,44273,53314,53315,N,N,54080,54082,\r
+44985,N,54084,54087,54085,N,N,N,54086,54083,54014,44986,54088,54081,N,N,N,N,\r
+54995,45766,55004,45763,N,54997,45767,N,45761,N,54992,55005,54993,54990,45765,\r
+N,45762,N,54996,54999,45764,55000,45768,55001,54991,54998,55002,54994,54989,\r
+54987,N,N,55003,N,N,56031,N,N,N,N,56036,N,N,N,56032,56038,46503,54988,56033,\r
+46501,56030,46508,56034,46507,56035,46509,46504,46510,46505,N,46506,N,46502,N,\r
+56037,N,N,N,N,N,N,N,47201,57168,N,57171,57159,57164,57158,47203,N,57162,N,N,N,\r
+57160,47202,N,57167,57166,57163,57165,57161,47841,57170,47199,57169,N,N,N,N,N,\r
+N,N,N,N,58205,N,47848,58200,N,47847,58190,N,58192,47840,58197,58196,58199,\r
+47845,58194,58193,N,N,47844,47839,58195,47842,58201,58203,N,58198,58191,47843,\r
+N,N,48489,47838,N,N,58204,N,N,N,N,N,N,N,59097,48482,N,59099,N,48483,N,N,48485,\r
+59102,N,59094,47846,59100,N,N,N,N,59096,N,47200,48488,N,N,48484,N,48486,48487,\r
+N,49014,59101,59095,48490,N,59098,N,N,N,N,N,60096,60091,N,N,60101,49012,60093,\r
+49016,60099,60090,60087,60102,49489,49017,60098,60088,49015,60092,49019,60089,\r
+60094,49018,60097,60100,N,N,N,N,60875,60876,60860,60867,60865,N,N,49487,60872,\r
+60095,N,60863,N,60873,49486,60862,60861,60871,60868,60870,N,60858,60874,49484,\r
+N,60869,60878,60866,49488,49485,60864,60859,60877,49013,N,N,N,N,N,N,N,61539,N,\r
+N,61537,61543,49840,61541,61540,49842,61546,49841,N,61547,61544,49838,61545,\r
+61538,49839,49837,62123,61542,N,N,61548,N,N,62120,N,N,N,50098,50096,62122,N,\r
+62124,62121,50097,50094,50095,50099,N,N,50296,N,62634,N,62633,62631,62630,\r
+62632,N,50295,50297,N,N,50416,N,N,62949,62948,N,N,63226,N,63228,63230,63229,\r
+63227,N,N,50595,50594,N,N,50643,50642,50644,63469,63468,N,63739,63672,63740,\r
+50776,N,50777,63853,N,N,50814,42700,N,52648,N,N,53317,53318,53316,N,N,44275,N,\r
+53319,53320,53321,N,N,54089,54095,N,N,54093,44987,54091,N,54092,54094,N,N,N,\r
+54090,45769,N,55006,45771,55008,45770,55007,N,N,N,N,N,56040,46511,N,56042,\r
+56039,55009,N,46512,N,N,56041,N,N,N,N,N,N,57174,N,47204,57172,47205,57173,\r
+47206,N,N,N,47849,58209,58206,58208,47850,47851,58207,N,N,N,N,N,59103,N,N,\r
+59104,N,48491,59106,59105,N,41569,N,60106,60107,60103,N,60104,49020,49021,\r
+60105,N,49495,N,N,49491,49496,49492,49494,49490,N,49493,N,N,N,N,49843,60879,N,\r
+62126,N,62125,N,62635,50298,50299,63297,62950,N,63296,N,63741,63908,42701,N,N,\r
+43124,N,52649,43720,44278,53324,44276,53322,44281,44277,44282,44280,53323,\r
+44279,44991,44990,54106,44999,54099,54105,44995,54098,54104,54102,44994,44996,\r
+54101,44989,54100,45000,44997,45001,44998,54097,54096,54103,44992,44988,44993,\r
+N,N,N,N,N,55024,55017,N,46517,55016,N,45775,45782,45779,45785,45784,45780,N,\r
+55010,55013,N,55012,45776,55014,55023,45777,55011,55020,55021,45778,55018,\r
+45783,45773,45781,55015,45772,55019,N,N,55022,N,N,N,56059,56050,46514,56057,\r
+56054,56046,56055,46516,56047,N,56043,N,N,47212,56052,N,46513,56058,N,46520,\r
+46522,56045,N,N,46521,56048,46515,56056,56049,56053,N,56051,46518,56044,46523,\r
+45774,46519,46524,N,N,N,N,N,47208,57181,57183,57185,57189,N,57179,57177,47210,\r
+N,57184,57188,57180,57176,N,57175,N,N,N,57186,57178,57182,47211,N,47209,57190,\r
+47207,57187,N,58226,N,N,N,N,N,47854,58218,48504,58228,47857,58232,47863,58213,\r
+N,N,58229,58210,N,58231,58214,N,47870,47867,58230,58224,47853,47861,47860,N,\r
+47859,47865,N,58211,47866,58225,47862,47852,58227,47855,47856,47864,58216,\r
+58215,58212,N,58220,58217,58221,47869,N,58233,47858,58222,58223,N,58219,N,N,N,\r
+47868,N,N,N,N,59111,48496,48505,48501,59108,N,48498,48502,59120,48492,59112,N,\r
+48500,N,N,59115,59110,48499,48503,59109,N,48497,N,59119,48494,59118,59117,\r
+48506,58738,48493,N,59116,59107,N,48507,59114,48495,59113,N,N,N,N,49058,49063,\r
+49022,60120,60111,60123,60115,60121,49064,49057,60108,60114,60124,60117,60122,\r
+60110,N,N,60118,49059,60116,49062,49061,60112,60113,60109,60119,49060,60126,\r
+60125,N,N,N,60890,60886,49503,N,60880,49497,49513,60892,49505,49501,60883,\r
+49508,49511,60894,49500,60885,49509,60896,60893,60881,49504,49498,49512,60888,\r
+49507,60882,49502,60895,49506,49499,60889,49510,60887,N,N,60891,N,N,N,61550,\r
+61556,49849,61559,49844,49845,61551,61558,61553,49850,49847,N,61549,N,49846,\r
+61555,61557,49848,61554,61552,N,N,N,N,62136,50103,50104,50100,N,50101,N,62132,\r
+62130,N,62134,50106,62135,62128,62127,62131,62129,50102,62133,62636,50302,\r
+50301,62637,N,62639,62638,50337,N,N,N,62955,62952,62953,N,62951,62954,50418,\r
+62956,N,50417,N,63298,N,50645,50647,63470,50646,63673,63808,63810,63742,63809,\r
+50796,42702,N,44283,53871,45002,N,N,45786,56060,56061,N,N,N,60127,49514,60897,\r
+N,N,49851,N,62138,62137,50338,62957,N,63299,50680,51785,N,N,43721,43125,N,N,\r
+53325,N,N,54112,54107,54111,54109,45003,54110,54108,N,55025,N,56062,56128,\r
+57193,57194,47214,47215,57192,57195,57191,47213,N,47936,N,47216,58234,N,48508,\r
+59121,48509,N,49065,60130,60128,60129,60900,60899,60898,N,N,N,62139,N,50105,\r
+62140,63300,50681,63674,42703,43723,43722,53327,44284,N,N,53326,54114,N,45004,\r
+55026,54113,N,N,N,45788,55029,55027,55028,45787,N,56130,56131,56129,N,47219,\r
+57197,57196,57198,47218,47217,N,N,59122,59124,N,48510,59123,60131,49066,61561,\r
+N,61560,50107,62141,50109,50108,62640,62958,50419,42704,53328,44285,54117,\r
+45006,54116,54115,N,45005,N,55035,N,55037,55030,55031,45789,55032,45790,55036,\r
+55033,55034,45791,N,46526,46527,N,56132,N,N,N,57199,57200,N,58238,47939,47937,\r
+47938,58235,58236,N,58237,59129,N,59130,48545,59127,59126,59128,59125,49069,\r
+60132,49067,49068,60902,49515,60901,61352,N,61562,61563,49852,N,49853,49516,\r
+62142,62143,62641,50339,42705,N,42706,44286,43724,45007,53329,N,N,N,46528,\r
+42707,44353,53330,53331,44352,44354,42708,N,53332,45009,54118,45011,45008,\r
+45010,N,55105,45792,N,55104,55038,N,57201,N,N,58273,N,48546,N,49070,60134,\r
+60133,N,60903,N,N,N,62959,N,N,42709,52083,52650,44355,53333,N,54120,N,N,N,\r
+45012,54119,45013,N,N,N,55107,N,N,45794,55106,55108,N,45793,N,N,N,N,56134,\r
+56135,56133,46529,N,N,N,47220,N,47221,N,47941,N,58275,58274,47940,N,N,N,N,N,\r
+59131,N,N,59132,N,N,N,N,60135,N,N,49520,49519,49517,49518,49521,N,61564,49855,\r
+49854,62144,62642,N,N,N,50597,50596,42710,N,N,53755,N,47223,46530,47222,47942,\r
+N,42711,51625,42712,42713,N,N,52651,52086,N,52087,43127,N,52084,43126,N,43129,\r
+52085,43131,43130,52088,43128,N,N,N,43729,43727,52653,N,43726,N,N,N,43731,\r
+43733,43730,N,52656,52652,43734,N,43728,43132,N,43732,52655,N,N,52654,N,43725,\r
+N,N,N,N,N,N,N,53339,44359,44360,53341,N,53335,53338,53347,53345,N,44361,53351,\r
+44364,53348,53340,53337,N,N,56137,53346,44356,53349,53334,53343,44358,44363,\r
+53344,44367,44365,N,53336,44362,N,53342,44366,44357,53350,N,N,N,N,N,N,45018,N,\r
+45027,45016,45014,54122,45022,45019,54124,N,N,45021,54123,54121,54126,45026,\r
+45024,56136,54127,54125,45015,N,N,45017,45020,N,45023,N,45025,N,N,N,N,N,N,N,N,\r
+N,N,55118,45796,N,55109,55111,N,55112,N,55120,55116,55114,N,55117,55121,45797,\r
+45801,55110,N,55119,N,45799,N,45798,55115,55113,N,45795,45800,N,N,N,N,N,N,N,N,\r
+46536,56145,N,N,56143,46538,N,N,N,N,56138,57249,N,46537,56142,N,N,56139,46533,\r
+46539,56144,46535,56141,47943,46534,56140,46540,46532,46531,N,N,N,N,N,57207,\r
+57205,N,57211,N,57203,57250,57208,N,57202,47227,47267,57213,N,57206,N,47230,N,\r
+N,47228,57214,47225,47224,57209,47229,46541,N,57212,57204,47226,47265,47266,N,\r
+N,N,N,47948,47944,N,47949,58278,N,N,58277,58279,47946,58276,47947,58282,58281,\r
+58280,N,47945,N,N,N,N,N,59201,N,59204,48552,59203,48551,48547,48548,48549,\r
+59200,59134,48550,N,59202,59133,N,N,60137,60147,49073,49072,N,60141,60143,N,\r
+60138,N,60142,60136,60145,49071,60144,60140,N,60146,N,60139,49524,60904,60910,\r
+49528,49530,49527,49526,N,49525,49523,60905,60908,49522,60909,N,49529,60907,N,\r
+60906,49856,N,49857,61601,61565,61566,N,N,62146,N,62145,50110,62644,50340,\r
+62643,N,62960,63301,50598,63811,63812,50648,42714,N,43735,56146,47950,49531,\r
+60911,42715,N,45029,45028,56147,N,N,N,60148,42716,44368,N,N,56148,56149,56150,\r
+47951,49074,42717,N,43736,53352,45030,54128,45802,N,56151,47268,N,47952,49075,\r
+49532,49858,62645,42718,43737,N,N,45031,55122,46542,N,47953,58283,59205,N,N,N,\r
+N,42719,46543,57251,47954,42720,52657,53353,44369,N,N,54130,N,N,45034,N,45032,\r
+45033,45035,N,N,54129,N,N,55127,55124,55126,45803,45805,45804,55123,45806,\r
+55125,N,56152,56153,N,56154,57254,N,57255,N,57253,57256,N,47269,N,57252,N,\r
+47955,N,N,59210,59206,59209,59211,59208,59207,N,60149,60150,60151,49076,49077,\r
+60913,60912,60914,N,61603,61602,N,62148,N,62149,62147,N,50341,N,62646,62647,N,\r
+63302,63471,63675,42721,43133,N,49533,42722,N,55128,56155,N,50753,51786,N,N,N,\r
+51787,51789,42723,51790,51788,N,N,52130,52131,52091,N,N,N,N,52129,43169,N,\r
+43170,52092,52090,52089,52093,43134,52094,53354,N,N,N,52662,43740,52661,52663,\r
+N,43739,52668,43743,52658,52672,52678,43750,52675,43747,N,52665,52671,52673,N,\r
+52660,43746,43741,52666,43748,43751,43745,N,43738,52670,52664,52677,43753,\r
+43749,43744,52669,45036,52667,43742,43752,N,52659,N,52674,52676,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,44386,44380,44388,44385,53361,53364,44381,N,53355,N,44374,44384,N,\r
+44387,44389,53410,53367,N,44373,53409,44377,44375,44370,53359,N,53374,53363,\r
+53366,53413,N,44390,53373,44382,53368,53412,53365,53369,53372,N,N,53357,53411,\r
+53371,N,N,53356,53360,44383,44378,44371,44376,44372,44391,53358,54181,44379,N,\r
+N,53370,52801,N,N,N,N,N,N,N,N,54184,45050,N,54134,N,54179,54141,N,54194,N,\r
+54186,N,54142,N,54185,54136,54140,54197,45053,54189,54180,45037,54195,54132,N,\r
+54188,N,45052,45047,54131,45045,45044,45049,54187,45041,45048,53362,56156,\r
+54182,N,N,54138,45051,54139,54177,45054,54133,54191,N,54190,54198,45043,45040,\r
+54196,54192,54183,54178,45046,45042,54135,45038,54193,45039,N,54137,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,55134,55136,55141,55161,45820,\r
+45810,N,55133,45821,45822,55144,55151,55157,N,55138,N,55145,N,N,45888,55159,\r
+55154,45818,45816,55150,55146,55132,45807,55137,55129,N,45815,45817,55142,\r
+55139,45812,55155,45809,55140,55162,55148,N,55147,45808,N,45819,N,45811,55130,\r
+55135,55152,55158,45889,55131,55143,55149,45814,N,N,55160,55153,55156,N,N,N,N,\r
+N,N,N,N,N,N,N,N,45813,N,56172,56160,46551,56189,56231,56234,46549,56168,56227,\r
+56169,56183,46562,56179,46559,N,56180,56157,N,56228,N,N,46568,56225,56181,\r
+56236,56176,57288,N,56239,46566,56174,56186,46569,46548,56178,56237,56171,\r
+56164,56175,N,56163,56161,46544,56229,56170,56232,N,56233,46552,46557,46553,\r
+46561,56190,46554,56182,56166,N,46546,56158,56226,56235,56165,46560,56240,\r
+56177,56173,N,46545,46565,N,56188,46567,N,56184,46556,46550,46558,46547,46564,\r
+56185,56167,56187,56162,56230,N,N,N,N,N,N,N,56238,N,N,N,N,N,N,N,56159,N,N,N,N,\r
+N,57287,N,57309,47189,57292,N,57290,57269,47273,57285,57305,57281,47281,57304,\r
+57279,46563,57295,57280,57302,47280,47272,N,57258,57266,N,57291,57283,57308,\r
+57286,47286,57303,N,47277,N,57289,57297,57270,57296,N,57313,57265,57298,N,\r
+57311,N,57259,46555,N,57273,57272,47279,N,57276,57278,57293,57310,47282,N,\r
+47283,N,57264,47275,57268,57306,47284,N,47276,47278,47285,57312,57299,57294,N,\r
+N,57275,57274,47274,57260,47271,57284,57261,57282,N,N,57271,57307,N,N,N,47270,\r
+N,N,N,57267,N,N,N,N,N,N,57263,57301,57262,47968,58323,N,N,58306,N,N,58284,\r
+58314,47960,58299,58309,47963,58302,47961,58287,58317,58286,58305,N,58285,N,N,\r
+58303,58312,58310,58298,58293,58291,N,58292,58311,58322,58300,47962,N,58295,N,\r
+58315,N,47965,58294,58288,58304,47969,N,N,47957,47966,58296,58290,N,47959,\r
+57300,47958,58307,N,47956,47971,47964,58308,58297,58289,58316,58301,47970,\r
+58320,47967,58319,N,58313,58318,N,N,N,58321,N,N,N,N,N,N,N,N,N,N,N,59251,59252,\r
+59239,59238,59234,48564,N,48556,59254,59253,57257,59231,59235,59229,N,59248,\r
+59233,N,59255,59226,59224,59236,59246,59241,48566,59215,N,59245,N,N,N,48567,\r
+57277,59227,59218,59221,59259,59228,59219,59217,59214,N,48560,59237,48559,\r
+48563,59232,59240,48553,59256,59260,48555,N,59223,59243,59247,59220,59257,\r
+48562,N,48561,59212,48565,59250,59222,59242,59216,59230,59225,48557,48558,\r
+59244,59261,59258,59249,N,N,N,N,N,N,N,N,N,59213,N,48554,60233,N,60224,60227,N,\r
+49083,60229,60153,60225,60231,49080,49084,49078,N,N,60155,60236,N,N,60230,N,\r
+60156,60245,60239,60152,60998,60158,49079,N,60234,N,60244,49087,N,60241,60157,\r
+60228,60232,60226,60246,60243,60240,49081,49082,49086,60154,60247,49085,60237,\r
+N,N,60235,N,N,N,60238,61011,60992,60997,61010,60996,60923,60993,N,49570,N,\r
+60916,61005,61007,60915,49569,61009,61001,49576,61008,60994,49578,60921,60242,\r
+61002,60999,60917,61013,49572,N,N,49573,60919,61000,N,61012,61003,60925,49575,\r
+49571,61004,60926,61014,60920,60995,61006,60922,60924,N,49867,60918,49577,\r
+49860,49534,N,N,N,N,49574,49864,61619,N,61609,61604,61610,61620,61624,61623,\r
+49866,49865,N,N,61611,61625,61614,61606,N,61608,61607,61613,61618,61605,61612,\r
+61617,49863,N,61615,N,49861,61616,49859,49862,62165,61621,N,N,50114,N,62157,\r
+62161,62153,62156,N,62164,50112,62169,62162,N,62154,62170,62163,50115,50116,\r
+62167,N,62155,50111,50113,62150,62158,62152,N,62168,62166,62151,62159,N,N,N,\r
+62654,50117,62160,50343,50345,50342,N,62659,62651,62649,62653,62650,N,N,62655,\r
+62657,50346,50348,N,62656,50349,50347,62658,N,N,N,N,50344,N,N,N,N,N,50420,\r
+62961,62967,50422,62652,62966,N,62973,62964,62971,62970,62648,62965,61622,\r
+62974,62963,62968,N,62972,62962,N,63306,50421,62969,N,N,63476,63307,63305,\r
+63303,63304,63308,N,50649,63474,63472,63477,63475,N,63478,50650,63473,N,N,\r
+63676,N,N,63813,63814,63815,N,N,63943,63933,51791,43754,N,44392,N,54200,54199,\r
+45120,45890,55164,N,N,55163,N,46570,47288,N,47287,47289,N,58324,59262,60248,\r
+60250,60249,N,49579,61015,61626,63909,42724,N,52681,52682,52680,52679,43755,N,\r
+53417,53415,N,N,53414,N,44393,44395,44394,53416,N,N,N,N,N,N,N,N,54212,54209,\r
+54207,N,N,45121,54210,45126,54204,54219,N,54221,54205,N,45123,54222,54217,\r
+54203,54208,54218,54214,54211,N,45128,54220,54206,N,N,54215,54201,45127,45124,\r
+54213,N,54216,54202,45125,45122,N,N,N,N,45900,55205,45899,N,55208,55211,45896,\r
+45894,55166,55209,55207,55204,55212,55213,55215,55216,55165,45893,55202,55201,\r
+55214,45895,55203,45897,45892,55206,45901,N,45898,55210,N,N,N,46577,56255,N,\r
+56244,46574,N,57319,56253,56241,46572,56246,46575,56250,56248,46578,46571,N,N,\r
+56242,56245,46576,N,56243,N,56254,56252,56247,56249,56251,46573,N,N,N,N,N,N,N,\r
+57320,57326,57316,57322,47290,57318,47296,N,N,47295,47294,57325,47297,47298,\r
+57315,57328,47299,47293,47292,57324,47300,57314,57317,57327,57323,N,N,58356,\r
+58345,47291,N,N,N,N,47978,58333,58354,58334,47973,N,58331,N,58340,58332,47975,\r
+58326,58353,47976,58350,58351,58327,47981,58342,N,58336,58343,58330,N,58355,\r
+58347,58341,58325,47977,58348,N,47980,58352,N,58346,47974,58344,N,58338,47972,\r
+58329,58337,58349,58335,N,N,58339,N,N,N,N,N,48577,57321,59314,59323,59313,\r
+59309,59306,48578,59304,47979,59297,48576,59303,48575,59308,59305,59321,59316,\r
+59310,59315,48571,59307,59326,59298,59299,59322,48572,59327,48574,59328,59312,\r
+58328,59318,59311,59320,59317,N,N,N,59302,48569,59325,48570,59300,48573,60260,\r
+59319,59324,N,N,N,N,N,60257,48568,49088,60267,60263,N,60261,60256,60271,N,N,N,\r
+49092,N,60252,60264,60265,60255,60254,60268,N,60258,60253,60259,N,60270,60251,\r
+60269,60266,49090,49089,N,N,49091,60262,61643,N,N,N,N,N,61017,49585,61021,\r
+61018,61025,61031,61020,N,61040,49582,61034,61023,61035,61030,61037,61022,\r
+49587,49586,61024,61038,61016,61036,49580,N,61028,61027,61032,61019,49584,N,\r
+49588,61026,61033,49589,61029,N,N,N,N,49581,49583,61639,61637,N,N,61644,61641,\r
+61645,N,61630,61638,61649,61039,61634,49871,59301,61629,61642,61636,61633,\r
+61628,61627,61648,N,61632,61631,49869,61640,N,49868,N,N,49870,61635,61647,N,\r
+62174,62175,N,50121,62172,50118,62180,N,50122,62182,62171,61646,62184,62173,N,\r
+50119,62179,N,62181,62176,62183,62178,62177,50120,N,N,62661,62662,N,62664,\r
+50350,50351,62665,62663,N,62660,N,63042,63045,63041,N,50426,63043,50425,50424,\r
+50423,63044,63313,63311,N,63310,63040,63312,63046,63309,N,63481,63447,63479,\r
+50651,63480,63482,N,63679,50682,63678,63677,50683,N,50778,63854,63911,63910,\r
+63912,42725,53418,N,54223,54224,N,N,N,56256,N,63047,63680,42726,44396,53419,N,\r
+N,N,55217,45902,N,56258,56257,46579,N,47301,59329,48579,N,48580,N,N,N,49093,\r
+50684,42727,N,N,N,53420,43757,53422,53421,44397,N,54225,N,54232,45129,54230,\r
+54228,N,54235,54226,54227,45130,N,45134,N,N,54236,45133,54234,54231,54229,\r
+45131,45132,54233,N,N,N,N,45904,55218,N,45909,55234,45908,55236,N,N,55224,\r
+45906,55235,N,55219,45907,55231,55227,55229,55223,55230,N,N,45903,55226,N,\r
+55225,55221,N,55232,N,N,55228,55220,N,55222,45905,55233,N,N,N,N,46582,56269,N,\r
+N,N,56265,56267,56262,56261,56259,N,56266,56268,56264,N,56263,46580,46581,N,N,\r
+N,N,N,N,56271,47309,57330,57336,57331,57332,N,57337,N,47311,N,47303,47310,\r
+57329,56260,47306,47304,57335,57334,47305,47307,57333,47302,N,47308,N,N,N,N,N,\r
+58358,47988,N,N,58434,58433,N,58363,47990,58432,58359,58360,47982,47984,N,\r
+58365,58357,47986,47985,58361,58366,58364,47987,58362,56270,47983,N,N,59330,\r
+59337,48582,N,59341,48586,59333,59331,N,59340,N,48581,59339,48583,48584,59332,\r
+48585,59338,59334,59335,59336,47989,N,N,N,60272,60284,N,49098,60279,60281,N,\r
+49096,60273,60277,N,60280,49094,49097,60283,60275,60276,60282,60274,60278,\r
+49095,61042,N,61041,49591,61047,49593,N,N,49590,61043,49594,61044,N,N,61045,\r
+61048,N,49592,N,61654,N,N,61657,N,61651,61653,N,N,61652,61655,61656,61046,\r
+61650,N,N,50125,62188,62191,62193,62186,62187,62190,62192,50126,50124,50123,\r
+62189,62185,62666,50352,N,62667,N,N,63049,50427,63051,50428,63048,63050,50600,\r
+N,63314,50599,63485,63484,N,63483,N,N,63816,63817,63819,63818,N,51792,42728,N,\r
+44398,55237,46583,N,57338,49872,N,62194,N,N,43171,N,N,N,45911,N,N,N,45910,N,\r
+56272,46584,56274,56273,N,N,57339,47312,58435,58438,58437,N,58436,59342,59344,\r
+59343,N,49100,N,N,N,49099,N,49595,61049,61051,61050,N,N,49873,N,N,N,62196,\r
+62195,N,62668,50353,N,N,50429,63316,63315,50779,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,43172,53423,44399,55240,55238,N,N,55239,56276,56277,57411,56275,N,57340,\r
+57409,57408,57410,47313,57342,57341,57412,N,58441,58439,N,58440,59347,59345,N,\r
+N,59346,60285,61052,61053,49874,N,62197,62669,50354,N,63052,63317,50601,N,\r
+63486,63820,43173,N,44401,44402,53424,N,N,53425,44400,N,45140,N,45138,N,45137,\r
+45144,45136,45145,54237,45142,N,45139,45143,45141,45135,N,N,45919,N,45913,\r
+55244,45918,N,N,45920,45914,N,45915,N,55242,N,N,45912,N,55243,45917,N,N,55241,\r
+45916,N,N,46660,N,46662,N,N,56280,46661,46585,46589,N,47332,57417,56282,46590,\r
+N,N,56285,56286,46659,N,56288,N,56290,N,56291,56279,56278,56292,46658,56289,\r
+56287,N,46656,46587,46663,56283,56284,56281,N,46657,N,N,46588,N,46586,57416,\r
+47327,47322,N,N,47317,N,47333,47318,N,47314,47329,47326,47328,N,47319,47324,\r
+47315,47316,57424,57421,57413,57418,N,47330,57425,47331,47321,N,N,57415,N,\r
+57423,57419,57422,57420,47325,57414,47320,N,N,N,58444,47992,47995,N,58446,N,\r
+48037,58445,47997,N,48591,58447,N,48036,58443,48038,N,N,N,47993,N,47323,47996,\r
+N,47994,47998,48034,47991,48039,48035,N,48033,58442,N,N,N,N,48598,N,48594,N,N,\r
+N,48601,N,59350,48602,59362,59355,48587,59363,59357,48597,59358,N,48596,59361,\r
+48590,59359,59349,48589,60330,48595,N,48592,N,48600,N,59348,N,59352,48588,\r
+59351,59353,59354,48599,59356,59360,59364,N,48603,49106,60325,60331,60328,\r
+60286,60332,60321,N,60327,N,49101,49107,60333,N,N,49103,N,49113,49108,60335,\r
+60329,49104,60322,49114,60323,60324,49115,49112,48593,N,49102,60336,49116,N,\r
+49109,60334,49105,49110,49111,N,49603,61092,61101,61098,61100,N,49600,61093,N,\r
+61099,49596,61095,49604,61091,61096,61103,60326,61097,61090,49597,61089,49598,\r
+61104,49599,61102,49602,61054,N,49601,N,61094,61660,61674,61669,61671,61659,\r
+49875,N,61658,49878,49877,N,61673,61665,61662,61668,N,61661,N,61663,61672,\r
+61670,N,49876,61677,61675,61666,61676,61667,N,62201,50127,62273,N,N,63055,\r
+50134,61664,62199,50130,62200,62205,N,N,50132,50133,62198,62272,62274,62202,\r
+62204,62206,62203,62275,50129,50135,50131,N,50128,62672,N,50359,62670,N,N,\r
+62674,N,62675,50357,62676,62673,N,62671,50360,50356,62677,N,50358,50355,N,N,N,\r
+50430,N,N,50496,63054,63053,63056,63057,N,50497,63318,63323,50602,N,63320,N,\r
+63319,63322,63321,N,63555,N,50652,63554,63552,N,63553,N,N,N,50686,50685,63681,\r
+63682,50752,N,63821,63822,50791,N,50797,N,63913,63944,43174,N,55245,N,55246,\r
+57426,58448,59365,49606,N,49605,61678,62276,N,63556,43175,54238,45146,45921,\r
+57428,57427,48604,59366,48605,61105,49879,N,N,N,50806,43176,52683,54239,N,N,\r
+45922,N,55247,55248,N,56293,N,46664,47334,N,57430,57429,57431,N,58449,58450,\r
+48040,49117,48606,49118,N,61109,61106,61108,61107,49607,N,61679,62278,62277,\r
+52132,45148,45147,54240,N,55249,N,N,56295,56294,46665,N,57433,57434,57432,N,N,\r
+47336,47335,N,48042,48041,N,59367,60339,60337,60338,49119,61111,61110,N,61682,\r
+61681,61680,62279,N,63914,43177,44403,N,44404,45149,45150,54242,54241,55250,N,\r
+45928,45926,45923,45927,45925,45924,N,N,46666,56298,N,47341,46668,46673,56300,\r
+46675,46674,46677,56299,56296,46671,46667,46669,56297,46676,46672,46670,47343,\r
+47342,47340,47344,N,47338,47339,N,47337,N,57435,N,N,58452,N,48044,48045,48043,\r
+N,58451,N,58453,N,59370,59372,N,48615,59373,48608,59369,48607,48617,48613,\r
+48614,48610,59368,48609,59374,59371,N,48616,N,48611,48612,60341,N,60343,60342,\r
+N,60344,49120,60340,N,N,49611,61112,49608,49612,49610,49609,61683,61686,N,\r
+61685,N,61684,49880,62280,62281,50136,62282,50137,N,N,50362,N,50361,63058,N,N,\r
+50498,63059,63324,50603,50604,N,63557,N,50754,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43178,N,45930,45929,57436,57437,N,48046,\r
+60345,48618,60346,61113,43179,N,53426,44406,44405,N,54243,45151,54244,55253,N,\r
+55252,N,55251,N,N,56302,46680,N,N,56301,46679,N,N,N,56303,46678,N,57439,57442,\r
+57440,57441,57445,57438,57446,57443,57444,48048,58454,N,N,48047,N,59378,59376,\r
+N,N,48619,59375,59377,N,48620,N,60347,N,60348,49613,N,62284,62286,62283,62285,\r
+62678,63060,N,N,63855,43180,44407,54245,54247,54246,N,55256,45932,N,55254,N,\r
+45931,55257,N,55258,55255,N,N,56315,46688,56307,56313,N,N,46683,46686,56306,\r
+46681,56310,57452,46685,N,56305,N,56311,56308,56314,56304,56312,46684,46687,\r
+56309,46682,N,47346,57448,47345,57455,57454,47352,N,47353,57456,47347,57453,\r
+47351,57458,57449,N,57451,47348,57447,57450,57457,47349,57459,N,N,N,N,N,47350,\r
+N,48049,58459,58465,58457,58466,N,58456,58461,58467,58464,58463,58462,N,58455,\r
+58460,N,N,58458,N,48625,48622,59387,59457,59459,59456,59384,59386,59461,59458,\r
+59388,59462,59385,59460,48623,48629,48627,59379,48628,48624,59380,59382,59381,\r
+59389,59390,N,48626,N,48621,N,N,59383,N,60358,49122,N,60349,49123,49126,60354,\r
+N,60351,49125,N,N,60355,60356,60350,60359,60352,60357,49124,N,49121,60353,N,\r
+61119,49616,49614,49617,49615,61118,61115,61114,N,61117,N,N,61116,61765,49886,\r
+61691,61690,N,49881,61761,61760,61687,61763,61692,49885,61689,61762,61688,\r
+49882,49884,61693,49883,61694,N,61764,62290,N,50142,62287,N,62291,N,N,50139,\r
+62289,50144,N,50141,N,62288,N,50143,62292,50138,N,N,N,N,50364,50366,N,62681,\r
+50365,62679,50140,62680,50363,50499,50501,63062,50500,63061,N,63329,50605,\r
+63328,50606,63326,63325,63330,63331,63558,N,63327,N,N,63686,63683,63684,63685,\r
+50780,N,63825,63824,63823,63856,N,63934,63915,50798,43181,45152,N,N,N,N,N,\r
+47354,N,N,N,N,N,N,N,48630,N,N,60360,N,N,49887,N,62293,N,N,N,N,N,N,63916,43182,\r
+43758,44409,44408,N,45155,N,54248,45153,54249,45154,N,N,55263,55259,N,N,45933,\r
+55262,55261,55260,45934,55264,55265,N,N,N,56387,56385,56389,56390,56396,N,\r
+56392,56394,N,56386,56316,N,56393,N,N,56395,56388,56391,56317,46690,56384,\r
+56318,46689,46691,N,47357,57461,57463,57462,57467,47355,N,57464,57460,57465,\r
+57466,47356,47358,57468,N,58471,58470,N,58468,58469,48051,48053,48050,48052,\r
+59469,59470,59465,N,59466,48632,48637,48631,48638,48633,59467,N,N,59468,59464,\r
+48704,48635,N,N,48634,48636,N,59463,N,60362,49128,N,N,60364,49130,60367,60363,\r
+60361,60366,49129,60365,N,49127,N,N,49619,49622,61121,N,49620,61120,49618,\r
+49621,61766,61767,61768,49888,N,61769,N,49889,50146,62296,62297,62295,62294,\r
+62298,50145,62685,62683,62684,62686,62682,62687,63064,N,63065,63063,50502,\r
+63332,50607,63333,63560,63559,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,43183,46692,N,N,\r
+47424,N,N,N,48054,N,N,49132,N,49131,N,N,N,N,50147,50300,50503,43184,45156,\r
+47425,N,62299,N,N,N,N,N,N,N,N,N,N,52134,N,N,43185,N,43188,43187,43186,N,N,\r
+52133,N,52685,N,52687,43759,N,N,43761,52684,52686,43760,52689,52688,52690,N,N,\r
+N,N,N,N,N,N,53430,53428,44412,53427,44451,44414,44411,N,44452,N,44413,44450,N,\r
+44449,53429,N,44410,N,N,N,45162,54251,54257,45159,45166,N,45161,54254,54256,\r
+45164,54250,54253,45160,45157,54252,45163,54255,45165,45158,N,N,N,N,55267,\r
+55270,45936,N,45946,45942,55268,N,N,45950,45943,45948,45938,N,45935,45937,\r
+45949,55269,45941,45944,45940,45945,55271,45947,45939,55266,N,N,N,N,N,N,N,N,\r
+56397,46693,56399,N,46695,46697,N,56398,46694,46698,N,46696,N,N,N,47431,57507,\r
+47439,57470,N,47440,47429,N,57505,N,N,47434,N,57506,47427,47426,N,47437,47436,\r
+47435,47433,47438,57469,47428,47430,47432,N,N,48056,48059,N,48063,48057,48062,\r
+48060,N,48055,N,48061,48058,N,N,N,59474,48707,48705,N,59475,N,48708,48706,\r
+59473,59472,N,49136,59471,49134,49133,60368,48709,49135,60369,49138,60370,\r
+49137,49624,61123,49623,49628,49626,49627,49891,49625,61122,60371,49890,49892,\r
+N,50148,50149,N,62688,N,50654,50653,43190,N,N,51797,45167,N,51794,51795,51793,\r
+N,51796,N,N,52138,52135,52140,52136,43191,43194,N,52137,43193,52139,N,N,43192,\r
+N,N,N,N,52693,52695,43764,52691,52694,52692,43762,43765,N,43763,N,N,N,N,53432,\r
+53436,53433,N,44455,N,44456,N,53435,N,53437,53439,N,44453,53438,N,N,44454,N,N,\r
+N,N,N,55278,53434,54258,54267,54265,54260,54261,54266,54268,45169,N,54263,\r
+54259,45168,45170,54262,54269,54264,N,N,45985,55281,55273,55279,55280,45986,N,\r
+55272,55274,53431,55276,55277,55275,46700,N,N,N,56406,60372,56407,56404,45987,\r
+46702,56403,56409,56408,46699,56412,56402,56411,56400,56410,56405,46701,N,\r
+57514,N,57509,57515,57510,57508,57511,47441,N,57513,N,57512,47442,48065,48064,\r
+58478,58481,58473,58477,48066,58476,58474,58480,58475,58472,58479,N,59481,\r
+48712,61770,59478,59479,59477,56401,48711,59482,59476,48710,48713,59480,60373,\r
+49139,60374,60375,N,61124,49629,61771,61772,N,N,61773,62301,62300,62690,N,\r
+62689,63067,63068,63066,63334,50608,43195,44458,44457,45173,45172,54336,54337,\r
+54270,N,45171,55285,N,55286,55282,45988,55283,N,55284,N,N,N,N,56415,56417,\r
+56413,56416,46703,56414,46704,N,N,56691,47445,47444,N,47443,N,57516,57517,N,N,\r
+58483,58485,48070,48067,N,48069,48068,58484,58482,N,N,N,N,N,59489,59486,59487,\r
+48717,59488,59483,59484,48714,N,48715,59485,48716,N,60379,N,60380,60377,60378,\r
+49140,60376,N,N,N,N,N,61128,61125,61127,49632,61131,49631,61129,61132,61130,\r
+61126,49630,N,61775,N,61776,61774,N,61778,49893,49894,62303,50151,61777,62302,\r
+50150,62693,62694,50367,62692,N,62691,N,63069,50504,N,63561,63688,63687,N,\r
+50755,50781,63689,63857,N,50799,43196,43766,N,47446,N,50368,43197,44459,45989,\r
+46705,49895,43767,N,53441,53440,54338,N,45176,45174,45178,54340,N,45177,45175,\r
+N,N,N,N,54339,45992,55292,N,45991,45993,55362,45995,55294,55360,55287,45994,\r
+55363,N,N,55289,N,55290,55288,45990,N,55361,55291,55293,N,N,N,56429,N,56428,\r
+56426,56418,56433,56421,56431,56438,56430,46713,N,46709,56419,N,56425,46711,N,\r
+56424,46712,46714,56427,N,46706,46707,56439,56437,N,56436,56422,N,56434,N,\r
+46710,N,N,N,N,46708,56435,56420,56423,56432,N,N,N,N,N,58554,57527,N,57520,\r
+57539,57548,57523,47457,N,57536,47447,47449,47461,57521,N,N,47450,47452,47462,\r
+47451,N,N,N,N,47460,57529,N,57518,47458,57528,47454,57546,47459,57544,57532,\r
+57542,47456,57519,57545,57540,N,57547,47448,N,N,47463,47453,N,N,57525,N,57533,\r
+57537,N,57541,47455,57524,57522,57534,N,N,N,N,57531,57530,N,57535,57538,N,\r
+57543,N,N,N,58488,N,48071,58532,58490,48076,48080,58541,58549,58534,48072,N,\r
+58538,57526,N,48073,58545,58550,58542,N,58544,58553,58546,58494,58537,N,N,\r
+48081,N,48077,58492,58539,48075,58533,48074,58547,58530,58489,48078,58552,N,N,\r
+58491,58543,58540,58535,58487,58486,58529,58548,48079,58551,58493,58531,48722,\r
+N,N,N,N,N,48730,48725,59556,59553,59495,48720,N,N,N,48719,48726,N,N,N,59493,\r
+48724,59505,59491,59492,48718,59555,48728,59508,59513,59507,60398,59503,59511,\r
+59509,59496,59490,59517,48727,59518,N,59512,N,59501,59499,59494,N,N,N,59502,\r
+59515,59498,59514,59554,N,N,48723,N,59510,59516,59506,59500,48721,N,N,N,58536,\r
+59504,48729,59497,N,N,N,N,N,60404,49143,60403,60400,60484,49147,N,60481,60408,\r
+60483,60393,60406,N,49149,N,60385,N,60383,60482,N,60480,60414,60397,60396,\r
+60386,49216,N,60392,60402,60413,49219,60485,N,49640,49221,49150,60390,N,60399,\r
+60382,60384,49141,49218,49146,60391,60407,60401,49217,60381,49635,60409,60412,\r
+49148,N,60395,49220,49145,N,N,N,49144,60405,60411,49142,N,60388,60410,N,N,\r
+60389,N,N,N,N,N,N,N,N,N,60394,61138,N,61143,49637,49639,61149,49633,61164,\r
+61155,61144,61145,61154,N,49646,61153,61137,61152,61140,61165,49645,49643,\r
+61141,N,61160,N,61146,61159,N,61161,61136,49638,N,61162,N,N,61150,N,49642,\r
+61147,N,N,49644,61156,N,N,N,49636,61142,61157,N,61151,60387,61158,61139,N,\r
+49641,N,61163,N,49634,61134,N,N,N,N,61792,61785,49897,N,61780,61795,61787,\r
+61148,N,61797,61781,N,49896,61791,49898,49906,49904,61793,49905,61783,N,61784,\r
+61789,61794,N,61133,49899,61802,61799,61803,61790,61786,61800,62314,61788,N,\r
+49902,N,49901,61135,49903,61796,61798,49900,61801,61779,N,61782,N,N,N,N,N,N,N,\r
+N,62323,N,62307,50155,62321,N,N,62305,50156,N,62316,N,62312,50161,62322,62306,\r
+62309,50153,62324,N,62317,62320,50159,50164,50162,62313,62308,N,50157,50158,\r
+62304,50154,N,50152,50160,62319,50163,N,62315,62325,50165,N,N,N,62311,N,62318,\r
+N,N,N,N,N,N,62707,62786,62709,62716,62310,62714,62697,62784,50371,62701,62718,\r
+62708,N,N,50370,N,N,62788,62710,N,62715,62717,62695,62785,62706,62711,62699,\r
+62703,62787,62713,62696,62700,62702,62712,N,50369,62705,N,N,N,N,N,N,62698,N,N,\r
+N,N,N,N,N,62704,63073,63078,50511,63080,N,50505,N,63076,63082,50510,50506,N,\r
+50507,63072,63079,50509,63077,50508,63071,63075,63074,N,63070,63081,N,N,N,\r
+50609,63341,63344,63340,63342,63343,63337,63338,63335,N,N,63339,63336,50610,\r
+50611,N,N,63563,N,63565,N,N,N,N,N,63564,63566,N,50656,N,63562,50655,50657,N,N,\r
+N,63691,63692,50756,63690,N,63827,63826,63828,50783,63829,50782,63830,63858,\r
+63861,63860,50792,63859,N,N,N,50802,50800,50801,50807,63936,63937,63935,63945,\r
+43768,N,N,55364,56440,59557,62326,N,N,43769,N,44460,45179,N,N,55365,N,55366,\r
+45996,N,46717,56442,56441,46755,46716,56443,46718,46754,46753,46715,N,N,N,\r
+47464,N,N,57552,57550,N,57551,57549,N,48082,N,48085,48087,48086,N,N,48083,\r
+48084,N,59559,59558,48731,59560,N,59561,48732,N,N,N,60493,60491,61171,N,60489,\r
+60490,49222,60486,60494,60488,60492,61167,N,N,61169,N,61170,49651,61166,49650,\r
+61168,49647,49648,49649,60487,N,N,49909,61806,61804,61805,49907,49910,49908,N,\r
+N,N,62327,62328,50166,N,62789,62791,62790,50372,50512,63085,63084,63083,43770,\r
+N,51626,N,51800,42729,51798,51801,51799,N,N,N,52142,N,43201,N,43202,52144,\r
+43199,52143,52141,43200,43198,N,N,N,N,N,N,52696,52699,43773,52698,52697,N,\r
+43772,43771,N,43840,52700,43774,N,N,N,N,N,53446,44462,44463,44464,53447,53443,\r
+44461,53444,N,53445,53442,N,N,N,45220,N,N,45217,54341,45218,45221,54342,N,\r
+45182,45180,45181,45219,N,N,N,N,N,45997,55369,46005,55368,N,55371,46001,55370,\r
+46763,45999,46002,45998,46003,46004,46000,N,N,N,55367,46759,56445,N,56483,N,N,\r
+56482,46764,46760,46761,56444,56446,56481,46756,46758,N,46762,46757,N,N,57555,\r
+57553,57554,47466,47467,N,57556,47465,48088,N,48090,48089,N,58555,N,N,58556,\r
+59563,N,59562,N,N,49223,49224,60495,49225,N,61174,N,61172,N,61173,49652,N,\r
+61807,50167,N,N,N,49653,43841,N,45222,54343,N,N,55372,46006,46765,56484,56486,\r
+46767,46766,46768,46769,56485,47470,47471,47469,48091,47468,57557,N,N,N,48092,\r
+59564,60496,49226,49654,61808,61812,49913,61809,49914,49912,61813,49915,61811,\r
+N,62329,49911,50168,N,63693,N,N,43842,46008,46007,N,N,N,N,46770,56488,56487,\r
+46771,N,N,57561,47475,47472,57560,47474,57558,47473,N,57559,N,58557,48093,N,\r
+59567,N,48733,59565,48734,48735,59566,48736,N,60497,N,49230,49227,49232,60499,\r
+49228,60498,49231,N,N,49229,N,61177,61179,N,N,49655,61178,49656,61176,61175,N,\r
+61815,61814,49916,61816,62334,50170,62333,62330,50169,62331,62332,N,62792,\r
+62793,50373,N,50515,N,N,63086,N,N,50513,50514,63087,N,N,50612,50613,63345,N,N,\r
+50757,63695,50759,N,63694,63696,50758,63831,N,63917,N,N,N,N,N,N,43843,N,N,N,\r
+47476,N,58558,N,59568,49233,49234,N,43844,N,48737,50171,44465,N,N,N,49235,N,\r
+50658,44466,55373,N,56489,N,56491,N,56490,N,57565,57562,47477,N,47478,57563,\r
+57564,N,58560,58565,48094,58559,58561,58568,58563,58567,58564,58562,58566,\r
+48095,N,N,59571,N,59569,48739,N,48738,59570,48740,N,N,N,N,60502,N,N,60501,\r
+49236,60500,61180,N,61182,61249,61248,N,49657,61181,61857,49917,61821,61858,\r
+49918,N,61819,N,61822,61820,61817,49984,61818,N,N,N,N,62369,N,N,62371,62370,N,\r
+62794,N,62795,N,N,N,63088,N,50615,N,50614,63567,63568,50760,63697,N,50793,N,\r
+44467,46772,58570,58569,59573,59572,N,N,49658,61251,61250,61861,61859,61862,\r
+61860,N,N,50172,62372,62373,62374,N,63089,N,63346,N,63698,N,N,N,N,N,N,N,44468,\r
+N,N,60503,61252,N,44469,N,N,48096,N,60504,49985,61863,50173,N,62796,62797,\r
+50516,63569,44470,46011,46012,55374,46773,46774,56492,46775,N,47482,N,47484,\r
+57567,57568,57566,47479,47480,47483,47481,N,N,58571,48097,48098,N,N,59580,\r
+48743,59575,59574,N,59579,48741,N,N,49243,N,59576,59581,59578,59577,N,48742,N,\r
+49241,N,60506,49237,N,60507,N,N,60505,N,49240,49238,49242,N,49239,N,N,N,N,N,\r
+61253,N,61258,61254,61257,49659,N,60884,61256,61255,N,49988,49986,49989,49987,\r
+61864,61865,61866,49990,N,N,N,62378,50240,62376,N,50241,62375,62377,50174,\r
+62801,62798,N,62799,62800,63090,50518,N,50517,N,63348,63347,50616,N,N,N,50659,\r
+50761,50784,63832,63918,63919,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44471,56493,N,N,57569,\r
+58572,58573,48099,N,48100,59582,48744,N,N,49660,N,61867,N,49991,62381,50242,\r
+62380,62382,62379,63093,62802,62803,N,50374,N,63092,N,N,63091,N,63349,63920,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,44472,N,N,N,44473,N,N,45223,54344,N,55375,N,46776,N,\r
+46779,46777,56494,N,46781,N,46778,N,N,46780,N,47486,N,57570,N,N,57571,59584,N,\r
+47485,47521,47522,58575,N,58574,48101,N,48102,N,58576,59583,48104,48745,N,\r
+48103,N,N,N,49244,59585,48747,48746,59586,59589,59587,59588,48748,N,49249,\r
+49247,N,N,49246,60509,N,49248,N,N,60508,61259,N,60510,49245,60511,61262,61260,\r
+61261,61266,49995,61265,61268,61267,61264,61263,N,49661,N,N,N,N,61870,N,61869,\r
+49994,49992,49993,N,61868,N,62385,N,50243,N,62384,62383,50244,N,62808,62807,N,\r
+62805,N,62804,50376,50375,62809,63350,50617,63095,50519,63094,62806,N,63351,\r
+50660,N,50785,63833,N,63921,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,44474,55376,61269,44475,\r
+N,N,58578,58577,60512,N,N,61271,N,61270,N,49996,62386,62387,50377,N,N,63922,\r
+45224,46783,46782,57572,57574,47524,57573,47523,47525,57575,N,N,N,58580,58582,\r
+58581,N,58584,N,N,N,48105,58583,58579,N,N,N,58585,N,59596,N,59599,59601,59591,\r
+59595,59592,48750,48753,48755,59593,59594,48754,59597,59600,59598,48756,N,\r
+48752,59590,48749,N,48751,N,N,49251,60518,60516,60515,N,60521,N,60520,60519,N,\r
+60514,49250,60513,N,60517,49252,N,N,61274,N,61278,61275,61277,61276,61273,\r
+61279,61282,61280,61281,49728,49662,61272,61283,61875,61878,61880,61879,N,\r
+61873,61877,61872,N,61874,49997,61871,N,61876,N,N,62400,62389,50245,N,N,50246,\r
+62388,62393,62399,62391,62398,N,62395,N,62394,62397,62392,62390,N,62396,N,\r
+62816,62814,50378,62813,62819,62817,N,50379,62812,62810,N,62811,50381,62815,\r
+50380,62818,63096,63102,N,N,63097,50523,63137,50522,63101,63100,50521,63099,\r
+50520,63098,N,63357,63393,63358,N,63355,50619,63352,63356,63395,N,63394,63353,\r
+63354,50618,63570,50663,N,63571,50661,50662,N,N,63699,50762,63862,N,50794,N,\r
+63923,50795,63924,63925,63939,63938,50810,63949,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,45225,N,N,57577,N,57576,N,48106,48107,58586,N,59602,60524,N,N,\r
+48757,49253,60522,N,60525,49254,N,61284,60523,61881,49998,62401,N,N,N,62822,\r
+62820,N,N,62821,N,N,63138,N,50524,63396,50666,50620,50664,50665,63700,50786,N,\r
+45226,N,N,N,61882,N,N,54345,N,47526,N,58587,N,N,48108,58588,N,N,N,59604,59603,\r
+49256,48758,48759,N,59607,59606,59605,N,N,60526,60529,N,60528,60527,49255,\r
+61288,61286,61285,61287,N,49999,61884,61885,50000,N,61883,N,62403,62402,62405,\r
+50247,62404,N,62823,62825,62824,N,N,63139,63142,63140,63141,63397,50621,N,N,N,\r
+63572,63573,63574,N,50763,50787,63926,45227,N,48760,49257,61886,N,63398,N,N,\r
+63940,54346,N,50811,45228,60530,N,61887,N,62406,N,N,63143,63399,45229,N,58589,\r
+58590,N,48109,48110,59609,48762,48761,59608,N,61289,N,61888,61890,61889,50003,\r
+50002,50001,N,50526,63144,N,50525,63401,63400,N,50764,63701,46013,57578,N,N,N,\r
+58593,58591,58592,N,N,59618,N,59613,59610,59617,N,N,N,59619,N,N,48764,59616,\r
+59612,N,N,59611,59615,59614,48763,N,N,60541,60536,60534,60577,60535,N,60531,N,\r
+60537,N,N,60532,61298,60533,60578,N,N,N,N,N,N,N,60540,49258,60539,60538,N,\r
+60542,N,N,N,N,61290,61293,N,N,61292,N,61300,61295,61299,N,61297,61296,61294,N,\r
+61291,N,49731,49730,N,49732,49729,61301,N,N,N,N,N,61896,61899,N,61897,61901,N,\r
+N,N,61902,N,61894,50008,61895,N,61893,61900,N,61892,61891,50007,50005,50004,N,\r
+N,N,N,N,N,N,N,61898,62415,62421,50250,62416,N,62419,62423,50251,62418,N,62410,\r
+N,62409,62422,62413,N,62411,62420,62412,50249,50248,N,62407,62408,62417,N,N,N,\r
+62414,N,N,N,N,N,N,62828,62831,N,N,N,N,50006,62829,62835,62833,62827,62838,N,\r
+62826,N,50383,62834,N,N,N,62830,50382,62837,N,N,62836,N,N,N,N,63147,63146,N,N,\r
+N,63153,N,63149,63152,50528,N,N,63150,63151,N,63145,63148,50527,N,N,N,50623,\r
+63412,63407,63411,N,63414,63410,N,63406,N,50625,63409,63413,50624,63404,62832,\r
+63408,N,N,63405,N,63402,N,63403,50622,63578,63580,63583,63579,63584,N,63577,N,\r
+63575,N,50667,63581,50669,50668,63576,63582,N,N,N,N,63706,50765,63707,N,63705,\r
+63702,N,N,63704,63703,63834,N,N,N,N,63836,63835,N,N,63865,N,63864,63863,63866,\r
+N,50803,50804,63946,63950,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,46014,56495,57581,N,47527,57579,N,N,57580,N,N,N,58594,58595,48113,48111,\r
+58596,48112,59624,N,59627,59621,59628,59620,59622,N,59623,59626,N,N,48801,\r
+59631,59630,48765,59625,59629,48766,N,N,N,N,N,N,60588,N,49263,N,60583,49259,N,\r
+60580,60586,60589,N,49264,N,60585,60582,60590,60581,N,60587,49260,N,60579,\r
+49261,N,49262,60584,N,N,N,61353,61306,61307,61310,61308,N,61302,N,N,61305,\r
+61349,61309,N,N,49733,N,61351,61348,49734,61350,61303,61346,61347,N,61345,N,N,\r
+N,N,61906,61908,61911,N,N,61905,N,50009,61913,61904,61914,N,61910,61912,61916,\r
+61909,61917,61907,61903,50010,N,61915,50011,50253,N,N,N,N,N,61304,62449,62440,\r
+50255,62436,50256,N,N,62445,62439,62429,50254,62442,62437,62438,N,62424,62431,\r
+62446,N,62443,N,62435,N,62447,62430,62425,62444,N,62427,62441,62432,62448,\r
+62428,50252,62426,62433,62434,N,N,N,62845,N,62843,N,62882,N,62894,62885,62844,\r
+62840,62887,62846,62883,62842,62890,62839,62881,62886,62888,62891,62841,N,\r
+62895,62896,62889,62893,62884,N,63169,63172,N,50529,N,63171,63176,63174,50530,\r
+63165,63155,63154,50532,63167,63168,63164,63156,N,63161,62892,N,63157,50531,\r
+63163,N,63162,N,63158,63170,N,63159,63419,63173,63175,63166,63160,63420,63422,\r
+63416,50626,N,63429,63427,50627,63426,63425,63418,63415,63421,63430,63417,\r
+63423,N,63593,63598,63588,63591,50670,63595,N,63602,63424,N,63589,63599,63603,\r
+63594,63587,63597,N,63596,63601,63600,63428,63592,63586,63590,50766,50767,\r
+63585,N,63718,63709,63717,63714,63715,63708,63711,63719,63713,63712,63710,N,\r
+63716,N,63837,N,63838,N,63840,63839,63842,63841,63868,63867,63927,N,63928,N,\r
+63941,50808,50812,N,63951,50813,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,46015,N,N,N,50384,63177,N,\r
+50768,50769,N,46016,57582,N,47528,59632,N,N,60592,60593,60591,61355,61354,\r
+49735,61919,61356,61918,N,N,62451,50257,50259,62450,N,N,50258,N,62897,62899,\r
+62898,63178,50533,N,50671,63720,63843,N,N,63954,46017,N,58597,N,48802,N,N,N,\r
+60595,60594,N,61357,N,N,N,50260,50385,63431,63947,N,N,N,46018,48114,N,48803,N,\r
+62452,N,63604,46784,N,N,N,N,61358,N,N,N,50788,46785,48804,49736,63605,46786,N,\r
+59633,49266,60596,60597,N,49265,N,61359,49740,49738,49739,49737,61920,50012,N,\r
+N,N,62901,62900,62903,62902,50386,N,N,63179,N,63181,63180,50534,63432,N,63606,\r
+63607,50672,63844,63869,50805,N,56496,60598,61360,62453,57583,N,61361,61922,\r
+61921,N,N,N,N,63608,50770,N,63845,63870,N,N,N,47529,59634,59635,N,60599,47530,\r
+N,50013,61923,N,63183,50535,63184,63182,63609,N,63721,N,47531,N,61364,61363,\r
+61362,61924,N,N,61928,61927,61926,61925,50014,62454,62905,50387,62904,63185,\r
+63435,63434,50628,63433,63612,63611,63610,N,N,48115,N,60600,49741,N,62455,\r
+62456,63436,63613,N,N,63722,63846,63929,63956,48116,49742,61929,62457,63186,\r
+63614,N,N,48806,N,61365,61930,62458,62459,62460,62910,N,62906,50536,62909,\r
+62908,50388,62907,50390,N,50389,63188,63187,50537,50538,N,N,50630,63437,50629,\r
+N,63651,63652,63650,63649,50772,N,63723,63724,63725,50771,63847,63850,63849,\r
+63848,N,N,63955,N,N,N,N,N,N,N,N,N,N,N,N,N,N,49267,N,N,50021,62911,63189,N,\r
+50631,63438,N,N,63957,N,N,N,49268,N,N,N,61366,N,63439,N,63905,51530,56828,\r
+41290,41303,N,41305,41307,41311,41312,41315,41316,41319,41320,41323,41324,\r
+41327,41328,41331,41332,41335,41336,41339,41340,N,N,N,N,41414,41415,41418,\r
+41419,41416,41417,41308,41293,N,41295,N,41297,41298,41299,41300,N,41341,41342,\r
+41377,41378,41379,41380,41420,41421,41422,41438,41439,41440,41441,41442,N,N,\r
+41548,41549,41550,41289,N,41389,41539,41544,41390,N,41309,41310,41391,41423,\r
+41281,41424,41284,41537,41647,41648,41649,41650,41651,41652,41653,41654,41655,\r
+41656,41287,41286,41429,41431,41430,41288,41545,41679,41680,41681,41682,41683,\r
+41684,41685,41686,41687,41688,41689,41690,41691,41692,41693,41694,41695,41696,\r
+41697,41698,41699,41700,41701,41702,41703,41704,N,41538,N,N,41412,N,41705,\r
+41706,41707,41708,41709,41710,41711,41712,41713,41714,41715,41716,41717,41718,\r
+41719,41720,41721,41722,41723,41724,41725,41726,41792,41793,41794,41795,41313,\r
+41301,41314,N,N,N,N,N,N,41294,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41411,\r
+};\r
+\r
+static const struct unim_index big5_encmap[256] = {\r
+{__big5_encmap+0,162,247},{0,0,0},{__big5_encmap+86,199,217},{__big5_encmap+\r
+105,145,201},{__big5_encmap+162,1,81},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{__big5_encmap+243,19,62},{__big5_encmap+287,3,153},{\r
+__big5_encmap+438,26,191},{0,0,0},{__big5_encmap+604,96,125},{__big5_encmap+\r
+634,0,229},{__big5_encmap+864,5,66},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5_encmap+926,0,254},{__big5_encmap+1181,\r
+5,41},{__big5_encmap+1218,163,163},{__big5_encmap+1219,142,213},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__big5_encmap+1291,0,255},{\r
+__big5_encmap+1547,0,254},{__big5_encmap+1802,0,255},{__big5_encmap+2058,0,253\r
+},{__big5_encmap+2312,0,255},{__big5_encmap+2568,5,252},{__big5_encmap+2816,1,\r
+255},{__big5_encmap+3071,1,255},{__big5_encmap+3326,0,255},{__big5_encmap+3582\r
+,1,253},{__big5_encmap+3835,0,255},{__big5_encmap+4091,3,255},{__big5_encmap+\r
+4344,0,255},{__big5_encmap+4600,1,250},{__big5_encmap+4850,1,255},{\r
+__big5_encmap+5105,0,255},{__big5_encmap+5361,2,255},{__big5_encmap+5615,1,255\r
+},{__big5_encmap+5870,0,255},{__big5_encmap+6126,0,255},{__big5_encmap+6382,0,\r
+255},{__big5_encmap+6638,0,249},{__big5_encmap+6888,6,255},{__big5_encmap+7138\r
+,0,253},{__big5_encmap+7392,0,255},{__big5_encmap+7648,0,255},{__big5_encmap+\r
+7904,18,253},{__big5_encmap+8140,4,255},{__big5_encmap+8392,0,252},{\r
+__big5_encmap+8645,0,255},{__big5_encmap+8901,0,249},{__big5_encmap+9151,0,253\r
+},{__big5_encmap+9405,0,255},{__big5_encmap+9661,0,255},{__big5_encmap+9917,0,\r
+255},{__big5_encmap+10173,0,255},{__big5_encmap+10429,1,255},{__big5_encmap+\r
+10684,0,255},{__big5_encmap+10940,0,255},{__big5_encmap+11196,0,255},{\r
+__big5_encmap+11452,0,254},{__big5_encmap+11707,1,253},{__big5_encmap+11960,2,\r
+255},{__big5_encmap+12214,1,251},{__big5_encmap+12465,0,255},{__big5_encmap+\r
+12721,0,255},{__big5_encmap+12977,0,254},{__big5_encmap+13232,0,251},{\r
+__big5_encmap+13484,3,156},{__big5_encmap+13638,54,255},{__big5_encmap+13840,\r
+0,254},{__big5_encmap+14095,0,255},{__big5_encmap+14351,0,254},{__big5_encmap+\r
+14606,0,255},{__big5_encmap+14862,1,255},{__big5_encmap+15117,0,255},{\r
+__big5_encmap+15373,0,254},{__big5_encmap+15628,0,255},{__big5_encmap+15884,0,\r
+254},{__big5_encmap+16139,1,255},{__big5_encmap+16394,0,255},{__big5_encmap+\r
+16650,0,159},{__big5_encmap+16810,55,254},{__big5_encmap+17010,0,255},{\r
+__big5_encmap+17266,0,255},{__big5_encmap+17522,0,255},{__big5_encmap+17778,0,\r
+255},{__big5_encmap+18034,0,255},{__big5_encmap+18290,0,255},{__big5_encmap+\r
+18546,0,255},{__big5_encmap+18802,0,131},{__big5_encmap+18934,119,229},{\r
+__big5_encmap+19045,28,255},{__big5_encmap+19273,0,255},{__big5_encmap+19529,\r
+0,254},{__big5_encmap+19784,0,255},{__big5_encmap+20040,1,254},{__big5_encmap+\r
+20294,1,253},{__big5_encmap+20547,5,255},{__big5_encmap+20798,0,255},{\r
+__big5_encmap+21054,0,255},{__big5_encmap+21310,0,164},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{__big5_encmap+21475,12,13},{0,0,0},{0,0,0},{0,0,0},{__big5_encmap+21477,48,\r
+107},{__big5_encmap+21537,1,227},\r
+};\r
+\r
+static const ucs2_t __cp950ext_decmap[224] = {\r
+8231,U,U,U,U,U,U,U,U,65105,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,U,U,U,U,U,175,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,U,\r
+U,U,U,U,U,U,U,65374,U,U,U,U,U,U,U,U,U,U,U,U,U,U,8853,8857,8725,65128,U,65509,\r
+U,65504,65505,8364,30849,37561,35023,22715,24658,31911,23290,9556,9574,9559,\r
+9568,9580,9571,9562,9577,9565,9554,9572,9557,9566,9578,9569,9560,9575,9563,\r
+9555,9573,9558,9567,9579,9570,9561,9576,9564,9553,9552,9581,9582,9584,9583,\r
+9619,\r
+};\r
+\r
+static const struct dbcs_index cp950ext_decmap[256] = {\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_decmap+0,69,243\r
+},{__cp950ext_decmap+175,65,71},{__cp950ext_decmap+182,225,225},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_decmap+183,214,254\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+};\r
+\r
+static const DBCHAR __cp950ext_encmap[581] = {\r
+41410,41285,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41953,41537,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+41458,N,N,N,41459,63992,63974,63983,63965,63976,63985,63967,63980,63989,63971,\r
+63982,63991,63973,N,63986,63968,N,63988,63970,63975,63984,63966,63981,63990,\r
+63972,N,63987,63969,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,63998,63961,63964,63962,63958,63963,63960,63959,41294,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41538,41470,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41536,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,41443,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,N,\r
+N,N,N,41542,41543,N,N,N,41540,\r
+};\r
+\r
+static const struct unim_index cp950ext_encmap[256] = {\r
+{__cp950ext_encmap+0,175,175},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},\r
+{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_encmap+1,39,172},{0,\r
+0,0},{__cp950ext_encmap+135,21,153},{0,0,0},{0,0,0},{__cp950ext_encmap+268,81,\r
+147},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{__cp950ext_encmap+335,187,187},{0,0,0},{__cp950ext_encmap+\r
+336,250,250},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_encmap+337,\r
+82,82},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_encmap+338,129,129},{0,0,0},{\r
+0,0,0},{0,0,0},{__cp950ext_encmap+339,167,167},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_encmap+\r
+340,207,207},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{__cp950ext_encmap+341,185,185},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{\r
+0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0\r
+},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,\r
+0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{__cp950ext_encmap+342,81,104},{\r
+__cp950ext_encmap+366,15,229},\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.c
new file mode 100644 (file)
index 0000000..882fbdd
--- /dev/null
@@ -0,0 +1,1832 @@
+/*\r
+ * multibytecodec.c: Common Multibyte Codec Implementation\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "multibytecodec.h"\r
+\r
+typedef struct {\r
+    const Py_UNICODE    *inbuf, *inbuf_top, *inbuf_end;\r
+    unsigned char       *outbuf, *outbuf_end;\r
+    PyObject            *excobj, *outobj;\r
+} MultibyteEncodeBuffer;\r
+\r
+typedef struct {\r
+    const unsigned char *inbuf, *inbuf_top, *inbuf_end;\r
+    Py_UNICODE          *outbuf, *outbuf_end;\r
+    PyObject            *excobj, *outobj;\r
+} MultibyteDecodeBuffer;\r
+\r
+PyDoc_STRVAR(MultibyteCodec_Encode__doc__,\r
+"I.encode(unicode[, errors]) -> (string, length consumed)\n\\r
+\n\\r
+Return an encoded string version of `unicode'. errors may be given to\n\\r
+set a different error handling scheme. Default is 'strict' meaning that\n\\r
+encoding errors raise a UnicodeEncodeError. Other possible values are\n\\r
+'ignore', 'replace' and 'xmlcharrefreplace' as well as any other name\n\\r
+registered with codecs.register_error that can handle UnicodeEncodeErrors.");\r
+\r
+PyDoc_STRVAR(MultibyteCodec_Decode__doc__,\r
+"I.decode(string[, errors]) -> (unicodeobject, length consumed)\n\\r
+\n\\r
+Decodes `string' using I, an MultibyteCodec instance. errors may be given\n\\r
+to set a different error handling scheme. Default is 'strict' meaning\n\\r
+that encoding errors raise a UnicodeDecodeError. Other possible values\n\\r
+are 'ignore' and 'replace' as well as any other name registered with\n\\r
+codecs.register_error that is able to handle UnicodeDecodeErrors.");\r
+\r
+static char *codeckwarglist[] = {"input", "errors", NULL};\r
+static char *incnewkwarglist[] = {"errors", NULL};\r
+static char *incrementalkwarglist[] = {"input", "final", NULL};\r
+static char *streamkwarglist[] = {"stream", "errors", NULL};\r
+\r
+static PyObject *multibytecodec_encode(MultibyteCodec *,\r
+                MultibyteCodec_State *, const Py_UNICODE **, Py_ssize_t,\r
+                PyObject *, int);\r
+\r
+#define MBENC_RESET     MBENC_MAX<<1 /* reset after an encoding session */\r
+\r
+static PyObject *\r
+make_tuple(PyObject *object, Py_ssize_t len)\r
+{\r
+    PyObject *v, *w;\r
+\r
+    if (object == NULL)\r
+        return NULL;\r
+\r
+    v = PyTuple_New(2);\r
+    if (v == NULL) {\r
+        Py_DECREF(object);\r
+        return NULL;\r
+    }\r
+    PyTuple_SET_ITEM(v, 0, object);\r
+\r
+    w = PyInt_FromSsize_t(len);\r
+    if (w == NULL) {\r
+        Py_DECREF(v);\r
+        return NULL;\r
+    }\r
+    PyTuple_SET_ITEM(v, 1, w);\r
+\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+internal_error_callback(const char *errors)\r
+{\r
+    if (errors == NULL || strcmp(errors, "strict") == 0)\r
+        return ERROR_STRICT;\r
+    else if (strcmp(errors, "ignore") == 0)\r
+        return ERROR_IGNORE;\r
+    else if (strcmp(errors, "replace") == 0)\r
+        return ERROR_REPLACE;\r
+    else\r
+        return PyString_FromString(errors);\r
+}\r
+\r
+static PyObject *\r
+call_error_callback(PyObject *errors, PyObject *exc)\r
+{\r
+    PyObject *args, *cb, *r;\r
+\r
+    assert(PyString_Check(errors));\r
+    cb = PyCodec_LookupError(PyString_AS_STRING(errors));\r
+    if (cb == NULL)\r
+        return NULL;\r
+\r
+    args = PyTuple_New(1);\r
+    if (args == NULL) {\r
+        Py_DECREF(cb);\r
+        return NULL;\r
+    }\r
+\r
+    PyTuple_SET_ITEM(args, 0, exc);\r
+    Py_INCREF(exc);\r
+\r
+    r = PyObject_CallObject(cb, args);\r
+    Py_DECREF(args);\r
+    Py_DECREF(cb);\r
+    return r;\r
+}\r
+\r
+static PyObject *\r
+codecctx_errors_get(MultibyteStatefulCodecContext *self)\r
+{\r
+    const char *errors;\r
+\r
+    if (self->errors == ERROR_STRICT)\r
+        errors = "strict";\r
+    else if (self->errors == ERROR_IGNORE)\r
+        errors = "ignore";\r
+    else if (self->errors == ERROR_REPLACE)\r
+        errors = "replace";\r
+    else {\r
+        Py_INCREF(self->errors);\r
+        return self->errors;\r
+    }\r
+\r
+    return PyString_FromString(errors);\r
+}\r
+\r
+static int\r
+codecctx_errors_set(MultibyteStatefulCodecContext *self, PyObject *value,\r
+                    void *closure)\r
+{\r
+    PyObject *cb;\r
+\r
+    if (!PyString_Check(value)) {\r
+        PyErr_SetString(PyExc_TypeError, "errors must be a string");\r
+        return -1;\r
+    }\r
+\r
+    cb = internal_error_callback(PyString_AS_STRING(value));\r
+    if (cb == NULL)\r
+        return -1;\r
+\r
+    ERROR_DECREF(self->errors);\r
+    self->errors = cb;\r
+    return 0;\r
+}\r
+\r
+/* This getset handlers list is used by all the stateful codec objects */\r
+static PyGetSetDef codecctx_getsets[] = {\r
+    {"errors",          (getter)codecctx_errors_get,\r
+                    (setter)codecctx_errors_set,\r
+                    PyDoc_STR("how to treat errors")},\r
+    {NULL,}\r
+};\r
+\r
+static int\r
+expand_encodebuffer(MultibyteEncodeBuffer *buf, Py_ssize_t esize)\r
+{\r
+    Py_ssize_t orgpos, orgsize, incsize;\r
+\r
+    orgpos = (Py_ssize_t)((char *)buf->outbuf -\r
+                            PyString_AS_STRING(buf->outobj));\r
+    orgsize = PyString_GET_SIZE(buf->outobj);\r
+    incsize = (esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize);\r
+\r
+    if (orgsize > PY_SSIZE_T_MAX - incsize) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+    }\r
+\r
+    if (_PyString_Resize(&buf->outobj, orgsize + incsize) == -1)\r
+        return -1;\r
+\r
+    buf->outbuf = (unsigned char *)PyString_AS_STRING(buf->outobj) +orgpos;\r
+    buf->outbuf_end = (unsigned char *)PyString_AS_STRING(buf->outobj)\r
+        + PyString_GET_SIZE(buf->outobj);\r
+\r
+    return 0;\r
+}\r
+#define REQUIRE_ENCODEBUFFER(buf, s) do {                               \\r
+    if ((s) < 0 || (s) > (buf)->outbuf_end - (buf)->outbuf)             \\r
+        if (expand_encodebuffer(buf, s) == -1)                          \\r
+            goto errorexit;                                             \\r
+} while(0)\r
+\r
+static int\r
+expand_decodebuffer(MultibyteDecodeBuffer *buf, Py_ssize_t esize)\r
+{\r
+    Py_ssize_t orgpos, orgsize;\r
+\r
+    orgpos = (Py_ssize_t)(buf->outbuf - PyUnicode_AS_UNICODE(buf->outobj));\r
+    orgsize = PyUnicode_GET_SIZE(buf->outobj);\r
+    if (PyUnicode_Resize(&buf->outobj, orgsize + (\r
+        esize < (orgsize >> 1) ? (orgsize >> 1) | 1 : esize)) == -1)\r
+        return -1;\r
+\r
+    buf->outbuf = PyUnicode_AS_UNICODE(buf->outobj) + orgpos;\r
+    buf->outbuf_end = PyUnicode_AS_UNICODE(buf->outobj)\r
+                      + PyUnicode_GET_SIZE(buf->outobj);\r
+\r
+    return 0;\r
+}\r
+#define REQUIRE_DECODEBUFFER(buf, s) do {                               \\r
+    if ((s) < 0 || (s) > (buf)->outbuf_end - (buf)->outbuf)             \\r
+        if (expand_decodebuffer(buf, s) == -1)                          \\r
+            goto errorexit;                                             \\r
+} while(0)\r
+\r
+\r
+/**\r
+ * MultibyteCodec object\r
+ */\r
+\r
+static int\r
+multibytecodec_encerror(MultibyteCodec *codec,\r
+                        MultibyteCodec_State *state,\r
+                        MultibyteEncodeBuffer *buf,\r
+                        PyObject *errors, Py_ssize_t e)\r
+{\r
+    PyObject *retobj = NULL, *retstr = NULL, *tobj;\r
+    Py_ssize_t retstrsize, newpos;\r
+    Py_ssize_t esize, start, end;\r
+    const char *reason;\r
+\r
+    if (e > 0) {\r
+        reason = "illegal multibyte sequence";\r
+        esize = e;\r
+    }\r
+    else {\r
+        switch (e) {\r
+        case MBERR_TOOSMALL:\r
+            REQUIRE_ENCODEBUFFER(buf, -1);\r
+            return 0; /* retry it */\r
+        case MBERR_TOOFEW:\r
+            reason = "incomplete multibyte sequence";\r
+            esize = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);\r
+            break;\r
+        case MBERR_INTERNAL:\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "internal codec error");\r
+            return -1;\r
+        default:\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "unknown runtime error");\r
+            return -1;\r
+        }\r
+    }\r
+\r
+    if (errors == ERROR_REPLACE) {\r
+        const Py_UNICODE replchar = '?', *inbuf = &replchar;\r
+        Py_ssize_t r;\r
+\r
+        for (;;) {\r
+            Py_ssize_t outleft;\r
+\r
+            outleft = (Py_ssize_t)(buf->outbuf_end - buf->outbuf);\r
+            r = codec->encode(state, codec->config, &inbuf, 1,\r
+                              &buf->outbuf, outleft, 0);\r
+            if (r == MBERR_TOOSMALL) {\r
+                REQUIRE_ENCODEBUFFER(buf, -1);\r
+                continue;\r
+            }\r
+            else\r
+                break;\r
+        }\r
+\r
+        if (r != 0) {\r
+            REQUIRE_ENCODEBUFFER(buf, 1);\r
+            *buf->outbuf++ = '?';\r
+        }\r
+    }\r
+    if (errors == ERROR_IGNORE || errors == ERROR_REPLACE) {\r
+        buf->inbuf += esize;\r
+        return 0;\r
+    }\r
+\r
+    start = (Py_ssize_t)(buf->inbuf - buf->inbuf_top);\r
+    end = start + esize;\r
+\r
+    /* use cached exception object if available */\r
+    if (buf->excobj == NULL) {\r
+        buf->excobj = PyUnicodeEncodeError_Create(codec->encoding,\r
+                        buf->inbuf_top,\r
+                        buf->inbuf_end - buf->inbuf_top,\r
+                        start, end, reason);\r
+        if (buf->excobj == NULL)\r
+            goto errorexit;\r
+    }\r
+    else\r
+        if (PyUnicodeEncodeError_SetStart(buf->excobj, start) != 0 ||\r
+            PyUnicodeEncodeError_SetEnd(buf->excobj, end) != 0 ||\r
+            PyUnicodeEncodeError_SetReason(buf->excobj, reason) != 0)\r
+            goto errorexit;\r
+\r
+    if (errors == ERROR_STRICT) {\r
+        PyCodec_StrictErrors(buf->excobj);\r
+        goto errorexit;\r
+    }\r
+\r
+    retobj = call_error_callback(errors, buf->excobj);\r
+    if (retobj == NULL)\r
+        goto errorexit;\r
+\r
+    if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 ||\r
+        !PyUnicode_Check((tobj = PyTuple_GET_ITEM(retobj, 0))) ||\r
+        !(PyInt_Check(PyTuple_GET_ITEM(retobj, 1)) ||\r
+          PyLong_Check(PyTuple_GET_ITEM(retobj, 1)))) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "encoding error handler must return "\r
+                        "(unicode, int) tuple");\r
+        goto errorexit;\r
+    }\r
+\r
+    {\r
+        const Py_UNICODE *uraw = PyUnicode_AS_UNICODE(tobj);\r
+\r
+        retstr = multibytecodec_encode(codec, state, &uraw,\r
+                        PyUnicode_GET_SIZE(tobj), ERROR_STRICT,\r
+                        MBENC_FLUSH);\r
+        if (retstr == NULL)\r
+            goto errorexit;\r
+    }\r
+\r
+    retstrsize = PyString_GET_SIZE(retstr);\r
+    if (retstrsize > 0) {\r
+        REQUIRE_ENCODEBUFFER(buf, retstrsize);\r
+        memcpy(buf->outbuf, PyString_AS_STRING(retstr), retstrsize);\r
+        buf->outbuf += retstrsize;\r
+    }\r
+\r
+    newpos = PyInt_AsSsize_t(PyTuple_GET_ITEM(retobj, 1));\r
+    if (newpos < 0 && !PyErr_Occurred())\r
+        newpos += (Py_ssize_t)(buf->inbuf_end - buf->inbuf_top);\r
+    if (newpos < 0 || buf->inbuf_top + newpos > buf->inbuf_end) {\r
+        PyErr_Clear();\r
+        PyErr_Format(PyExc_IndexError,\r
+                     "position %zd from error handler out of bounds",\r
+                     newpos);\r
+        goto errorexit;\r
+    }\r
+    buf->inbuf = buf->inbuf_top + newpos;\r
+\r
+    Py_DECREF(retobj);\r
+    Py_DECREF(retstr);\r
+    return 0;\r
+\r
+errorexit:\r
+    Py_XDECREF(retobj);\r
+    Py_XDECREF(retstr);\r
+    return -1;\r
+}\r
+\r
+static int\r
+multibytecodec_decerror(MultibyteCodec *codec,\r
+                        MultibyteCodec_State *state,\r
+                        MultibyteDecodeBuffer *buf,\r
+                        PyObject *errors, Py_ssize_t e)\r
+{\r
+    PyObject *retobj = NULL, *retuni = NULL;\r
+    Py_ssize_t retunisize, newpos;\r
+    const char *reason;\r
+    Py_ssize_t esize, start, end;\r
+\r
+    if (e > 0) {\r
+        reason = "illegal multibyte sequence";\r
+        esize = e;\r
+    }\r
+    else {\r
+        switch (e) {\r
+        case MBERR_TOOSMALL:\r
+            REQUIRE_DECODEBUFFER(buf, -1);\r
+            return 0; /* retry it */\r
+        case MBERR_TOOFEW:\r
+            reason = "incomplete multibyte sequence";\r
+            esize = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);\r
+            break;\r
+        case MBERR_INTERNAL:\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "internal codec error");\r
+            return -1;\r
+        default:\r
+            PyErr_SetString(PyExc_RuntimeError,\r
+                            "unknown runtime error");\r
+            return -1;\r
+        }\r
+    }\r
+\r
+    if (errors == ERROR_REPLACE) {\r
+        REQUIRE_DECODEBUFFER(buf, 1);\r
+        *buf->outbuf++ = Py_UNICODE_REPLACEMENT_CHARACTER;\r
+    }\r
+    if (errors == ERROR_IGNORE || errors == ERROR_REPLACE) {\r
+        buf->inbuf += esize;\r
+        return 0;\r
+    }\r
+\r
+    start = (Py_ssize_t)(buf->inbuf - buf->inbuf_top);\r
+    end = start + esize;\r
+\r
+    /* use cached exception object if available */\r
+    if (buf->excobj == NULL) {\r
+        buf->excobj = PyUnicodeDecodeError_Create(codec->encoding,\r
+                        (const char *)buf->inbuf_top,\r
+                        (Py_ssize_t)(buf->inbuf_end - buf->inbuf_top),\r
+                        start, end, reason);\r
+        if (buf->excobj == NULL)\r
+            goto errorexit;\r
+    }\r
+    else\r
+        if (PyUnicodeDecodeError_SetStart(buf->excobj, start) ||\r
+            PyUnicodeDecodeError_SetEnd(buf->excobj, end) ||\r
+            PyUnicodeDecodeError_SetReason(buf->excobj, reason))\r
+            goto errorexit;\r
+\r
+    if (errors == ERROR_STRICT) {\r
+        PyCodec_StrictErrors(buf->excobj);\r
+        goto errorexit;\r
+    }\r
+\r
+    retobj = call_error_callback(errors, buf->excobj);\r
+    if (retobj == NULL)\r
+        goto errorexit;\r
+\r
+    if (!PyTuple_Check(retobj) || PyTuple_GET_SIZE(retobj) != 2 ||\r
+        !PyUnicode_Check((retuni = PyTuple_GET_ITEM(retobj, 0))) ||\r
+        !(PyInt_Check(PyTuple_GET_ITEM(retobj, 1)) ||\r
+          PyLong_Check(PyTuple_GET_ITEM(retobj, 1)))) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "decoding error handler must return "\r
+                        "(unicode, int) tuple");\r
+        goto errorexit;\r
+    }\r
+\r
+    retunisize = PyUnicode_GET_SIZE(retuni);\r
+    if (retunisize > 0) {\r
+        REQUIRE_DECODEBUFFER(buf, retunisize);\r
+        memcpy((char *)buf->outbuf, PyUnicode_AS_DATA(retuni),\r
+                        retunisize * Py_UNICODE_SIZE);\r
+        buf->outbuf += retunisize;\r
+    }\r
+\r
+    newpos = PyInt_AsSsize_t(PyTuple_GET_ITEM(retobj, 1));\r
+    if (newpos < 0 && !PyErr_Occurred())\r
+        newpos += (Py_ssize_t)(buf->inbuf_end - buf->inbuf_top);\r
+    if (newpos < 0 || buf->inbuf_top + newpos > buf->inbuf_end) {\r
+        PyErr_Clear();\r
+        PyErr_Format(PyExc_IndexError,\r
+                     "position %zd from error handler out of bounds",\r
+                     newpos);\r
+        goto errorexit;\r
+    }\r
+    buf->inbuf = buf->inbuf_top + newpos;\r
+    Py_DECREF(retobj);\r
+    return 0;\r
+\r
+errorexit:\r
+    Py_XDECREF(retobj);\r
+    return -1;\r
+}\r
+\r
+static PyObject *\r
+multibytecodec_encode(MultibyteCodec *codec,\r
+                      MultibyteCodec_State *state,\r
+                      const Py_UNICODE **data, Py_ssize_t datalen,\r
+                      PyObject *errors, int flags)\r
+{\r
+    MultibyteEncodeBuffer buf;\r
+    Py_ssize_t finalsize, r = 0;\r
+\r
+    if (datalen == 0 && !(flags & MBENC_RESET))\r
+        return PyString_FromString("");\r
+\r
+    buf.excobj = NULL;\r
+    buf.inbuf = buf.inbuf_top = *data;\r
+    buf.inbuf_end = buf.inbuf_top + datalen;\r
+\r
+    if (datalen > (PY_SSIZE_T_MAX - 16) / 2) {\r
+        PyErr_NoMemory();\r
+        goto errorexit;\r
+    }\r
+\r
+    buf.outobj = PyString_FromStringAndSize(NULL, datalen * 2 + 16);\r
+    if (buf.outobj == NULL)\r
+        goto errorexit;\r
+    buf.outbuf = (unsigned char *)PyString_AS_STRING(buf.outobj);\r
+    buf.outbuf_end = buf.outbuf + PyString_GET_SIZE(buf.outobj);\r
+\r
+    while (buf.inbuf < buf.inbuf_end) {\r
+        Py_ssize_t inleft, outleft;\r
+\r
+        /* we don't reuse inleft and outleft here.\r
+         * error callbacks can relocate the cursor anywhere on buffer*/\r
+        inleft = (Py_ssize_t)(buf.inbuf_end - buf.inbuf);\r
+        outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);\r
+        r = codec->encode(state, codec->config, &buf.inbuf, inleft,\r
+                          &buf.outbuf, outleft, flags);\r
+        if ((r == 0) || (r == MBERR_TOOFEW && !(flags & MBENC_FLUSH)))\r
+            break;\r
+        else if (multibytecodec_encerror(codec, state, &buf, errors,r))\r
+            goto errorexit;\r
+        else if (r == MBERR_TOOFEW)\r
+            break;\r
+    }\r
+\r
+    if (codec->encreset != NULL && (flags & MBENC_RESET))\r
+        for (;;) {\r
+            Py_ssize_t outleft;\r
+\r
+            outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);\r
+            r = codec->encreset(state, codec->config, &buf.outbuf,\r
+                                outleft);\r
+            if (r == 0)\r
+                break;\r
+            else if (multibytecodec_encerror(codec, state,\r
+                                             &buf, errors, r))\r
+                goto errorexit;\r
+        }\r
+\r
+    finalsize = (Py_ssize_t)((char *)buf.outbuf -\r
+                             PyString_AS_STRING(buf.outobj));\r
+\r
+    if (finalsize != PyString_GET_SIZE(buf.outobj))\r
+        if (_PyString_Resize(&buf.outobj, finalsize) == -1)\r
+            goto errorexit;\r
+\r
+       *data = buf.inbuf;\r
+    Py_XDECREF(buf.excobj);\r
+    return buf.outobj;\r
+\r
+errorexit:\r
+    Py_XDECREF(buf.excobj);\r
+    Py_XDECREF(buf.outobj);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+MultibyteCodec_Encode(MultibyteCodecObject *self,\r
+                      PyObject *args, PyObject *kwargs)\r
+{\r
+    MultibyteCodec_State state;\r
+    Py_UNICODE *data;\r
+    PyObject *errorcb, *r, *arg, *ucvt;\r
+    const char *errors = NULL;\r
+    Py_ssize_t datalen;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|z:encode",\r
+                            codeckwarglist, &arg, &errors))\r
+        return NULL;\r
+\r
+    if (PyUnicode_Check(arg))\r
+        ucvt = NULL;\r
+    else {\r
+        arg = ucvt = PyObject_Unicode(arg);\r
+        if (arg == NULL)\r
+            return NULL;\r
+        else if (!PyUnicode_Check(arg)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                "couldn't convert the object to unicode.");\r
+            Py_DECREF(ucvt);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    data = PyUnicode_AS_UNICODE(arg);\r
+    datalen = PyUnicode_GET_SIZE(arg);\r
+\r
+    errorcb = internal_error_callback(errors);\r
+    if (errorcb == NULL) {\r
+        Py_XDECREF(ucvt);\r
+        return NULL;\r
+    }\r
+\r
+    if (self->codec->encinit != NULL &&\r
+        self->codec->encinit(&state, self->codec->config) != 0)\r
+        goto errorexit;\r
+    r = multibytecodec_encode(self->codec, &state,\r
+                    (const Py_UNICODE **)&data, datalen, errorcb,\r
+                    MBENC_FLUSH | MBENC_RESET);\r
+    if (r == NULL)\r
+        goto errorexit;\r
+\r
+    ERROR_DECREF(errorcb);\r
+    Py_XDECREF(ucvt);\r
+    return make_tuple(r, datalen);\r
+\r
+errorexit:\r
+    ERROR_DECREF(errorcb);\r
+    Py_XDECREF(ucvt);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+MultibyteCodec_Decode(MultibyteCodecObject *self,\r
+                      PyObject *args, PyObject *kwargs)\r
+{\r
+    MultibyteCodec_State state;\r
+    MultibyteDecodeBuffer buf;\r
+    PyObject *errorcb;\r
+    Py_buffer pdata;\r
+    const char *data, *errors = NULL;\r
+    Py_ssize_t datalen, finalsize;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|z:decode",\r
+                            codeckwarglist, &pdata, &errors))\r
+        return NULL;\r
+    data = pdata.buf;\r
+    datalen = pdata.len;\r
+\r
+    errorcb = internal_error_callback(errors);\r
+    if (errorcb == NULL) {\r
+        PyBuffer_Release(&pdata);\r
+        return NULL;\r
+    }\r
+\r
+    if (datalen == 0) {\r
+        PyBuffer_Release(&pdata);\r
+        ERROR_DECREF(errorcb);\r
+        return make_tuple(PyUnicode_FromUnicode(NULL, 0), 0);\r
+    }\r
+\r
+    buf.excobj = NULL;\r
+    buf.inbuf = buf.inbuf_top = (unsigned char *)data;\r
+    buf.inbuf_end = buf.inbuf_top + datalen;\r
+    buf.outobj = PyUnicode_FromUnicode(NULL, datalen);\r
+    if (buf.outobj == NULL)\r
+        goto errorexit;\r
+    buf.outbuf = PyUnicode_AS_UNICODE(buf.outobj);\r
+    buf.outbuf_end = buf.outbuf + PyUnicode_GET_SIZE(buf.outobj);\r
+\r
+    if (self->codec->decinit != NULL &&\r
+        self->codec->decinit(&state, self->codec->config) != 0)\r
+        goto errorexit;\r
+\r
+    while (buf.inbuf < buf.inbuf_end) {\r
+        Py_ssize_t inleft, outleft, r;\r
+\r
+        inleft = (Py_ssize_t)(buf.inbuf_end - buf.inbuf);\r
+        outleft = (Py_ssize_t)(buf.outbuf_end - buf.outbuf);\r
+\r
+        r = self->codec->decode(&state, self->codec->config,\r
+                        &buf.inbuf, inleft, &buf.outbuf, outleft);\r
+        if (r == 0)\r
+            break;\r
+        else if (multibytecodec_decerror(self->codec, &state,\r
+                                         &buf, errorcb, r))\r
+            goto errorexit;\r
+    }\r
+\r
+    finalsize = (Py_ssize_t)(buf.outbuf -\r
+                             PyUnicode_AS_UNICODE(buf.outobj));\r
+\r
+    if (finalsize != PyUnicode_GET_SIZE(buf.outobj))\r
+        if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)\r
+            goto errorexit;\r
+\r
+    PyBuffer_Release(&pdata);\r
+    Py_XDECREF(buf.excobj);\r
+    ERROR_DECREF(errorcb);\r
+    return make_tuple(buf.outobj, datalen);\r
+\r
+errorexit:\r
+    PyBuffer_Release(&pdata);\r
+    ERROR_DECREF(errorcb);\r
+    Py_XDECREF(buf.excobj);\r
+    Py_XDECREF(buf.outobj);\r
+\r
+    return NULL;\r
+}\r
+\r
+static struct PyMethodDef multibytecodec_methods[] = {\r
+    {"encode",          (PyCFunction)MultibyteCodec_Encode,\r
+                    METH_VARARGS | METH_KEYWORDS,\r
+                    MultibyteCodec_Encode__doc__},\r
+    {"decode",          (PyCFunction)MultibyteCodec_Decode,\r
+                    METH_VARARGS | METH_KEYWORDS,\r
+                    MultibyteCodec_Decode__doc__},\r
+    {NULL,              NULL},\r
+};\r
+\r
+static void\r
+multibytecodec_dealloc(MultibyteCodecObject *self)\r
+{\r
+    PyObject_Del(self);\r
+}\r
+\r
+static PyTypeObject MultibyteCodec_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "MultibyteCodec",                   /* tp_name */\r
+    sizeof(MultibyteCodecObject),       /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)multibytecodec_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT,                 /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    0,                                  /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iterext */\r
+    multibytecodec_methods,             /* tp_methods */\r
+};\r
+\r
+\r
+/**\r
+ * Utility functions for stateful codec mechanism\r
+ */\r
+\r
+#define STATEFUL_DCTX(o)        ((MultibyteStatefulDecoderContext *)(o))\r
+#define STATEFUL_ECTX(o)        ((MultibyteStatefulEncoderContext *)(o))\r
+\r
+static PyObject *\r
+encoder_encode_stateful(MultibyteStatefulEncoderContext *ctx,\r
+                        PyObject *unistr, int final)\r
+{\r
+    PyObject *ucvt, *r = NULL;\r
+    Py_UNICODE *inbuf, *inbuf_end, *inbuf_tmp = NULL;\r
+    Py_ssize_t datalen, origpending;\r
+\r
+    if (PyUnicode_Check(unistr))\r
+        ucvt = NULL;\r
+    else {\r
+        unistr = ucvt = PyObject_Unicode(unistr);\r
+        if (unistr == NULL)\r
+            return NULL;\r
+        else if (!PyUnicode_Check(unistr)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                "couldn't convert the object to unicode.");\r
+            Py_DECREF(ucvt);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    datalen = PyUnicode_GET_SIZE(unistr);\r
+    origpending = ctx->pendingsize;\r
+\r
+    if (origpending > 0) {\r
+        if (datalen > PY_SSIZE_T_MAX - ctx->pendingsize) {\r
+            PyErr_NoMemory();\r
+            /* inbuf_tmp == NULL */\r
+            goto errorexit;\r
+        }\r
+        inbuf_tmp = PyMem_New(Py_UNICODE, datalen + ctx->pendingsize);\r
+        if (inbuf_tmp == NULL)\r
+            goto errorexit;\r
+        memcpy(inbuf_tmp, ctx->pending,\r
+            Py_UNICODE_SIZE * ctx->pendingsize);\r
+        memcpy(inbuf_tmp + ctx->pendingsize,\r
+            PyUnicode_AS_UNICODE(unistr),\r
+            Py_UNICODE_SIZE * datalen);\r
+        datalen += ctx->pendingsize;\r
+        ctx->pendingsize = 0;\r
+        inbuf = inbuf_tmp;\r
+    }\r
+    else\r
+        inbuf = (Py_UNICODE *)PyUnicode_AS_UNICODE(unistr);\r
+\r
+    inbuf_end = inbuf + datalen;\r
+\r
+    r = multibytecodec_encode(ctx->codec, &ctx->state,\r
+                    (const Py_UNICODE **)&inbuf, datalen,\r
+                    ctx->errors, final ? MBENC_FLUSH | MBENC_RESET : 0);\r
+    if (r == NULL) {\r
+        /* recover the original pending buffer */\r
+        if (origpending > 0)\r
+            memcpy(ctx->pending, inbuf_tmp,\r
+                Py_UNICODE_SIZE * origpending);\r
+        ctx->pendingsize = origpending;\r
+        goto errorexit;\r
+    }\r
+\r
+    if (inbuf < inbuf_end) {\r
+        ctx->pendingsize = (Py_ssize_t)(inbuf_end - inbuf);\r
+        if (ctx->pendingsize > MAXENCPENDING) {\r
+            /* normal codecs can't reach here */\r
+            ctx->pendingsize = 0;\r
+            PyErr_SetString(PyExc_UnicodeError,\r
+                            "pending buffer overflow");\r
+            goto errorexit;\r
+        }\r
+        memcpy(ctx->pending, inbuf,\r
+            ctx->pendingsize * Py_UNICODE_SIZE);\r
+    }\r
+\r
+    if (inbuf_tmp != NULL)\r
+        PyMem_Del(inbuf_tmp);\r
+    Py_XDECREF(ucvt);\r
+    return r;\r
+\r
+errorexit:\r
+    if (inbuf_tmp != NULL)\r
+        PyMem_Del(inbuf_tmp);\r
+    Py_XDECREF(r);\r
+    Py_XDECREF(ucvt);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+decoder_append_pending(MultibyteStatefulDecoderContext *ctx,\r
+                       MultibyteDecodeBuffer *buf)\r
+{\r
+    Py_ssize_t npendings;\r
+\r
+    npendings = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);\r
+    if (npendings + ctx->pendingsize > MAXDECPENDING ||\r
+        npendings > PY_SSIZE_T_MAX - ctx->pendingsize) {\r
+            PyErr_SetString(PyExc_UnicodeError, "pending buffer overflow");\r
+            return -1;\r
+    }\r
+    memcpy(ctx->pending + ctx->pendingsize, buf->inbuf, npendings);\r
+    ctx->pendingsize += npendings;\r
+    return 0;\r
+}\r
+\r
+static int\r
+decoder_prepare_buffer(MultibyteDecodeBuffer *buf, const char *data,\r
+                       Py_ssize_t size)\r
+{\r
+    buf->inbuf = buf->inbuf_top = (const unsigned char *)data;\r
+    buf->inbuf_end = buf->inbuf_top + size;\r
+    if (buf->outobj == NULL) { /* only if outobj is not allocated yet */\r
+        buf->outobj = PyUnicode_FromUnicode(NULL, size);\r
+        if (buf->outobj == NULL)\r
+            return -1;\r
+        buf->outbuf = PyUnicode_AS_UNICODE(buf->outobj);\r
+        buf->outbuf_end = buf->outbuf +\r
+                          PyUnicode_GET_SIZE(buf->outobj);\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+static int\r
+decoder_feed_buffer(MultibyteStatefulDecoderContext *ctx,\r
+                    MultibyteDecodeBuffer *buf)\r
+{\r
+    while (buf->inbuf < buf->inbuf_end) {\r
+        Py_ssize_t inleft, outleft;\r
+        Py_ssize_t r;\r
+\r
+        inleft = (Py_ssize_t)(buf->inbuf_end - buf->inbuf);\r
+        outleft = (Py_ssize_t)(buf->outbuf_end - buf->outbuf);\r
+\r
+        r = ctx->codec->decode(&ctx->state, ctx->codec->config,\r
+            &buf->inbuf, inleft, &buf->outbuf, outleft);\r
+        if (r == 0 || r == MBERR_TOOFEW)\r
+            break;\r
+        else if (multibytecodec_decerror(ctx->codec, &ctx->state,\r
+                                         buf, ctx->errors, r))\r
+            return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+\r
+/**\r
+ * MultibyteIncrementalEncoder object\r
+ */\r
+\r
+static PyObject *\r
+mbiencoder_encode(MultibyteIncrementalEncoderObject *self,\r
+                  PyObject *args, PyObject *kwargs)\r
+{\r
+    PyObject *data;\r
+    int final = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O|i:encode",\r
+                    incrementalkwarglist, &data, &final))\r
+        return NULL;\r
+\r
+    return encoder_encode_stateful(STATEFUL_ECTX(self), data, final);\r
+}\r
+\r
+static PyObject *\r
+mbiencoder_reset(MultibyteIncrementalEncoderObject *self)\r
+{\r
+    if (self->codec->decreset != NULL &&\r
+        self->codec->decreset(&self->state, self->codec->config) != 0)\r
+        return NULL;\r
+    self->pendingsize = 0;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static struct PyMethodDef mbiencoder_methods[] = {\r
+    {"encode",          (PyCFunction)mbiencoder_encode,\r
+                    METH_VARARGS | METH_KEYWORDS, NULL},\r
+    {"reset",           (PyCFunction)mbiencoder_reset,\r
+                    METH_NOARGS, NULL},\r
+    {NULL,              NULL},\r
+};\r
+\r
+static PyObject *\r
+mbiencoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    MultibyteIncrementalEncoderObject *self;\r
+    PyObject *codec = NULL;\r
+    char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalEncoder",\r
+                                     incnewkwarglist, &errors))\r
+        return NULL;\r
+\r
+    self = (MultibyteIncrementalEncoderObject *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    codec = PyObject_GetAttrString((PyObject *)type, "codec");\r
+    if (codec == NULL)\r
+        goto errorexit;\r
+    if (!MultibyteCodec_Check(codec)) {\r
+        PyErr_SetString(PyExc_TypeError, "codec is unexpected type");\r
+        goto errorexit;\r
+    }\r
+\r
+    self->codec = ((MultibyteCodecObject *)codec)->codec;\r
+    self->pendingsize = 0;\r
+    self->errors = internal_error_callback(errors);\r
+    if (self->errors == NULL)\r
+        goto errorexit;\r
+    if (self->codec->encinit != NULL &&\r
+        self->codec->encinit(&self->state, self->codec->config) != 0)\r
+        goto errorexit;\r
+\r
+    Py_DECREF(codec);\r
+    return (PyObject *)self;\r
+\r
+errorexit:\r
+    Py_XDECREF(self);\r
+    Py_XDECREF(codec);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+mbiencoder_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    return 0;\r
+}\r
+\r
+static int\r
+mbiencoder_traverse(MultibyteIncrementalEncoderObject *self,\r
+                    visitproc visit, void *arg)\r
+{\r
+    if (ERROR_ISCUSTOM(self->errors))\r
+        Py_VISIT(self->errors);\r
+    return 0;\r
+}\r
+\r
+static void\r
+mbiencoder_dealloc(MultibyteIncrementalEncoderObject *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    ERROR_DECREF(self->errors);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static PyTypeObject MultibyteIncrementalEncoder_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "MultibyteIncrementalEncoder",      /* tp_name */\r
+    sizeof(MultibyteIncrementalEncoderObject), /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /*  methods  */\r
+    (destructor)mbiencoder_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC\r
+        | Py_TPFLAGS_BASETYPE,          /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    (traverseproc)mbiencoder_traverse,          /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iterext */\r
+    mbiencoder_methods,                 /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    codecctx_getsets,                   /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    mbiencoder_init,                    /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    mbiencoder_new,                     /* tp_new */\r
+};\r
+\r
+\r
+/**\r
+ * MultibyteIncrementalDecoder object\r
+ */\r
+\r
+static PyObject *\r
+mbidecoder_decode(MultibyteIncrementalDecoderObject *self,\r
+                  PyObject *args, PyObject *kwargs)\r
+{\r
+    MultibyteDecodeBuffer buf;\r
+    char *data, *wdata = NULL;\r
+    Py_buffer pdata;\r
+    Py_ssize_t wsize, finalsize = 0, size, origpending;\r
+    int final = 0;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s*|i:decode",\r
+                    incrementalkwarglist, &pdata, &final))\r
+        return NULL;\r
+    data = pdata.buf;\r
+    size = pdata.len;\r
+\r
+    buf.outobj = buf.excobj = NULL;\r
+    origpending = self->pendingsize;\r
+\r
+    if (self->pendingsize == 0) {\r
+        wsize = size;\r
+        wdata = data;\r
+    }\r
+    else {\r
+        if (size > PY_SSIZE_T_MAX - self->pendingsize) {\r
+            PyErr_NoMemory();\r
+            goto errorexit;\r
+        }\r
+        wsize = size + self->pendingsize;\r
+        wdata = PyMem_Malloc(wsize);\r
+        if (wdata == NULL)\r
+            goto errorexit;\r
+        memcpy(wdata, self->pending, self->pendingsize);\r
+        memcpy(wdata + self->pendingsize, data, size);\r
+        self->pendingsize = 0;\r
+    }\r
+\r
+    if (decoder_prepare_buffer(&buf, wdata, wsize) != 0)\r
+        goto errorexit;\r
+\r
+    if (decoder_feed_buffer(STATEFUL_DCTX(self), &buf))\r
+        goto errorexit;\r
+\r
+    if (final && buf.inbuf < buf.inbuf_end) {\r
+        if (multibytecodec_decerror(self->codec, &self->state,\r
+                        &buf, self->errors, MBERR_TOOFEW)) {\r
+            /* recover the original pending buffer */\r
+            memcpy(self->pending, wdata, origpending);\r
+            self->pendingsize = origpending;\r
+            goto errorexit;\r
+        }\r
+    }\r
+\r
+    if (buf.inbuf < buf.inbuf_end) { /* pending sequence still exists */\r
+        if (decoder_append_pending(STATEFUL_DCTX(self), &buf) != 0)\r
+            goto errorexit;\r
+    }\r
+\r
+    finalsize = (Py_ssize_t)(buf.outbuf - PyUnicode_AS_UNICODE(buf.outobj));\r
+    if (finalsize != PyUnicode_GET_SIZE(buf.outobj))\r
+        if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)\r
+            goto errorexit;\r
+\r
+    PyBuffer_Release(&pdata);\r
+    if (wdata != data)\r
+        PyMem_Del(wdata);\r
+    Py_XDECREF(buf.excobj);\r
+    return buf.outobj;\r
+\r
+errorexit:\r
+    PyBuffer_Release(&pdata);\r
+    if (wdata != NULL && wdata != data)\r
+        PyMem_Del(wdata);\r
+    Py_XDECREF(buf.excobj);\r
+    Py_XDECREF(buf.outobj);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+mbidecoder_reset(MultibyteIncrementalDecoderObject *self)\r
+{\r
+    if (self->codec->decreset != NULL &&\r
+        self->codec->decreset(&self->state, self->codec->config) != 0)\r
+        return NULL;\r
+    self->pendingsize = 0;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static struct PyMethodDef mbidecoder_methods[] = {\r
+    {"decode",          (PyCFunction)mbidecoder_decode,\r
+                    METH_VARARGS | METH_KEYWORDS, NULL},\r
+    {"reset",           (PyCFunction)mbidecoder_reset,\r
+                    METH_NOARGS, NULL},\r
+    {NULL,              NULL},\r
+};\r
+\r
+static PyObject *\r
+mbidecoder_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    MultibyteIncrementalDecoderObject *self;\r
+    PyObject *codec = NULL;\r
+    char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|s:IncrementalDecoder",\r
+                                     incnewkwarglist, &errors))\r
+        return NULL;\r
+\r
+    self = (MultibyteIncrementalDecoderObject *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    codec = PyObject_GetAttrString((PyObject *)type, "codec");\r
+    if (codec == NULL)\r
+        goto errorexit;\r
+    if (!MultibyteCodec_Check(codec)) {\r
+        PyErr_SetString(PyExc_TypeError, "codec is unexpected type");\r
+        goto errorexit;\r
+    }\r
+\r
+    self->codec = ((MultibyteCodecObject *)codec)->codec;\r
+    self->pendingsize = 0;\r
+    self->errors = internal_error_callback(errors);\r
+    if (self->errors == NULL)\r
+        goto errorexit;\r
+    if (self->codec->decinit != NULL &&\r
+        self->codec->decinit(&self->state, self->codec->config) != 0)\r
+        goto errorexit;\r
+\r
+    Py_DECREF(codec);\r
+    return (PyObject *)self;\r
+\r
+errorexit:\r
+    Py_XDECREF(self);\r
+    Py_XDECREF(codec);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+mbidecoder_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    return 0;\r
+}\r
+\r
+static int\r
+mbidecoder_traverse(MultibyteIncrementalDecoderObject *self,\r
+                    visitproc visit, void *arg)\r
+{\r
+    if (ERROR_ISCUSTOM(self->errors))\r
+        Py_VISIT(self->errors);\r
+    return 0;\r
+}\r
+\r
+static void\r
+mbidecoder_dealloc(MultibyteIncrementalDecoderObject *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    ERROR_DECREF(self->errors);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static PyTypeObject MultibyteIncrementalDecoder_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "MultibyteIncrementalDecoder",      /* tp_name */\r
+    sizeof(MultibyteIncrementalDecoderObject), /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /*  methods  */\r
+    (destructor)mbidecoder_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC\r
+        | Py_TPFLAGS_BASETYPE,          /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    (traverseproc)mbidecoder_traverse,          /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iterext */\r
+    mbidecoder_methods,                 /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    codecctx_getsets,                   /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    mbidecoder_init,                    /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    mbidecoder_new,                     /* tp_new */\r
+};\r
+\r
+\r
+/**\r
+ * MultibyteStreamReader object\r
+ */\r
+\r
+static PyObject *\r
+mbstreamreader_iread(MultibyteStreamReaderObject *self,\r
+                     const char *method, Py_ssize_t sizehint)\r
+{\r
+    MultibyteDecodeBuffer buf;\r
+    PyObject *cres;\r
+    Py_ssize_t rsize, finalsize = 0;\r
+\r
+    if (sizehint == 0)\r
+        return PyUnicode_FromUnicode(NULL, 0);\r
+\r
+    buf.outobj = buf.excobj = NULL;\r
+    cres = NULL;\r
+\r
+    for (;;) {\r
+        int endoffile;\r
+\r
+        if (sizehint < 0)\r
+            cres = PyObject_CallMethod(self->stream,\r
+                            (char *)method, NULL);\r
+        else\r
+            cres = PyObject_CallMethod(self->stream,\r
+                            (char *)method, "i", sizehint);\r
+        if (cres == NULL)\r
+            goto errorexit;\r
+\r
+        if (!PyString_Check(cres)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                            "stream function returned a "\r
+                            "non-string object");\r
+            goto errorexit;\r
+        }\r
+\r
+        endoffile = (PyString_GET_SIZE(cres) == 0);\r
+\r
+        if (self->pendingsize > 0) {\r
+            PyObject *ctr;\r
+            char *ctrdata;\r
+\r
+            if (PyString_GET_SIZE(cres) > PY_SSIZE_T_MAX - self->pendingsize) {\r
+                PyErr_NoMemory();\r
+                goto errorexit;\r
+        }\r
+                    rsize = PyString_GET_SIZE(cres) + self->pendingsize;\r
+                    ctr = PyString_FromStringAndSize(NULL, rsize);\r
+                    if (ctr == NULL)\r
+                            goto errorexit;\r
+                    ctrdata = PyString_AS_STRING(ctr);\r
+                    memcpy(ctrdata, self->pending, self->pendingsize);\r
+                    memcpy(ctrdata + self->pendingsize,\r
+                            PyString_AS_STRING(cres),\r
+                            PyString_GET_SIZE(cres));\r
+                    Py_DECREF(cres);\r
+                    cres = ctr;\r
+                    self->pendingsize = 0;\r
+        }\r
+\r
+        rsize = PyString_GET_SIZE(cres);\r
+        if (decoder_prepare_buffer(&buf, PyString_AS_STRING(cres),\r
+                                   rsize) != 0)\r
+            goto errorexit;\r
+\r
+        if (rsize > 0 && decoder_feed_buffer(\r
+                        (MultibyteStatefulDecoderContext *)self, &buf))\r
+            goto errorexit;\r
+\r
+        if (endoffile || sizehint < 0) {\r
+            if (buf.inbuf < buf.inbuf_end &&\r
+                multibytecodec_decerror(self->codec, &self->state,\r
+                            &buf, self->errors, MBERR_TOOFEW))\r
+                goto errorexit;\r
+        }\r
+\r
+        if (buf.inbuf < buf.inbuf_end) { /* pending sequence exists */\r
+            if (decoder_append_pending(STATEFUL_DCTX(self),\r
+                                       &buf) != 0)\r
+                goto errorexit;\r
+        }\r
+\r
+        finalsize = (Py_ssize_t)(buf.outbuf -\r
+                        PyUnicode_AS_UNICODE(buf.outobj));\r
+        Py_DECREF(cres);\r
+        cres = NULL;\r
+\r
+        if (sizehint < 0 || finalsize != 0 || rsize == 0)\r
+            break;\r
+\r
+        sizehint = 1; /* read 1 more byte and retry */\r
+    }\r
+\r
+    if (finalsize != PyUnicode_GET_SIZE(buf.outobj))\r
+        if (PyUnicode_Resize(&buf.outobj, finalsize) == -1)\r
+            goto errorexit;\r
+\r
+    Py_XDECREF(cres);\r
+    Py_XDECREF(buf.excobj);\r
+    return buf.outobj;\r
+\r
+errorexit:\r
+    Py_XDECREF(cres);\r
+    Py_XDECREF(buf.excobj);\r
+    Py_XDECREF(buf.outobj);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+mbstreamreader_read(MultibyteStreamReaderObject *self, PyObject *args)\r
+{\r
+    PyObject *sizeobj = NULL;\r
+    Py_ssize_t size;\r
+\r
+    if (!PyArg_UnpackTuple(args, "read", 0, 1, &sizeobj))\r
+        return NULL;\r
+\r
+    if (sizeobj == Py_None || sizeobj == NULL)\r
+        size = -1;\r
+    else if (PyInt_Check(sizeobj))\r
+        size = PyInt_AsSsize_t(sizeobj);\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer");\r
+        return NULL;\r
+    }\r
+\r
+    return mbstreamreader_iread(self, "read", size);\r
+}\r
+\r
+static PyObject *\r
+mbstreamreader_readline(MultibyteStreamReaderObject *self, PyObject *args)\r
+{\r
+    PyObject *sizeobj = NULL;\r
+    Py_ssize_t size;\r
+\r
+    if (!PyArg_UnpackTuple(args, "readline", 0, 1, &sizeobj))\r
+        return NULL;\r
+\r
+    if (sizeobj == Py_None || sizeobj == NULL)\r
+        size = -1;\r
+    else if (PyInt_Check(sizeobj))\r
+        size = PyInt_AsSsize_t(sizeobj);\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer");\r
+        return NULL;\r
+    }\r
+\r
+    return mbstreamreader_iread(self, "readline", size);\r
+}\r
+\r
+static PyObject *\r
+mbstreamreader_readlines(MultibyteStreamReaderObject *self, PyObject *args)\r
+{\r
+    PyObject *sizehintobj = NULL, *r, *sr;\r
+    Py_ssize_t sizehint;\r
+\r
+    if (!PyArg_UnpackTuple(args, "readlines", 0, 1, &sizehintobj))\r
+        return NULL;\r
+\r
+    if (sizehintobj == Py_None || sizehintobj == NULL)\r
+        sizehint = -1;\r
+    else if (PyInt_Check(sizehintobj))\r
+        sizehint = PyInt_AsSsize_t(sizehintobj);\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError, "arg 1 must be an integer");\r
+        return NULL;\r
+    }\r
+\r
+    r = mbstreamreader_iread(self, "read", sizehint);\r
+    if (r == NULL)\r
+        return NULL;\r
+\r
+    sr = PyUnicode_Splitlines(r, 1);\r
+    Py_DECREF(r);\r
+    return sr;\r
+}\r
+\r
+static PyObject *\r
+mbstreamreader_reset(MultibyteStreamReaderObject *self)\r
+{\r
+    if (self->codec->decreset != NULL &&\r
+        self->codec->decreset(&self->state, self->codec->config) != 0)\r
+        return NULL;\r
+    self->pendingsize = 0;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static struct PyMethodDef mbstreamreader_methods[] = {\r
+    {"read",            (PyCFunction)mbstreamreader_read,\r
+                    METH_VARARGS, NULL},\r
+    {"readline",        (PyCFunction)mbstreamreader_readline,\r
+                    METH_VARARGS, NULL},\r
+    {"readlines",       (PyCFunction)mbstreamreader_readlines,\r
+                    METH_VARARGS, NULL},\r
+    {"reset",           (PyCFunction)mbstreamreader_reset,\r
+                    METH_NOARGS, NULL},\r
+    {NULL,              NULL},\r
+};\r
+\r
+static PyMemberDef mbstreamreader_members[] = {\r
+    {"stream",          T_OBJECT,\r
+                    offsetof(MultibyteStreamReaderObject, stream),\r
+                    READONLY, NULL},\r
+    {NULL,}\r
+};\r
+\r
+static PyObject *\r
+mbstreamreader_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    MultibyteStreamReaderObject *self;\r
+    PyObject *stream, *codec = NULL;\r
+    char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamReader",\r
+                            streamkwarglist, &stream, &errors))\r
+        return NULL;\r
+\r
+    self = (MultibyteStreamReaderObject *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    codec = PyObject_GetAttrString((PyObject *)type, "codec");\r
+    if (codec == NULL)\r
+        goto errorexit;\r
+    if (!MultibyteCodec_Check(codec)) {\r
+        PyErr_SetString(PyExc_TypeError, "codec is unexpected type");\r
+        goto errorexit;\r
+    }\r
+\r
+    self->codec = ((MultibyteCodecObject *)codec)->codec;\r
+    self->stream = stream;\r
+    Py_INCREF(stream);\r
+    self->pendingsize = 0;\r
+    self->errors = internal_error_callback(errors);\r
+    if (self->errors == NULL)\r
+        goto errorexit;\r
+    if (self->codec->decinit != NULL &&\r
+        self->codec->decinit(&self->state, self->codec->config) != 0)\r
+        goto errorexit;\r
+\r
+    Py_DECREF(codec);\r
+    return (PyObject *)self;\r
+\r
+errorexit:\r
+    Py_XDECREF(self);\r
+    Py_XDECREF(codec);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+mbstreamreader_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    return 0;\r
+}\r
+\r
+static int\r
+mbstreamreader_traverse(MultibyteStreamReaderObject *self,\r
+                        visitproc visit, void *arg)\r
+{\r
+    if (ERROR_ISCUSTOM(self->errors))\r
+        Py_VISIT(self->errors);\r
+    Py_VISIT(self->stream);\r
+    return 0;\r
+}\r
+\r
+static void\r
+mbstreamreader_dealloc(MultibyteStreamReaderObject *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    ERROR_DECREF(self->errors);\r
+    Py_XDECREF(self->stream);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static PyTypeObject MultibyteStreamReader_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "MultibyteStreamReader",            /* tp_name */\r
+    sizeof(MultibyteStreamReaderObject), /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /*  methods  */\r
+    (destructor)mbstreamreader_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC\r
+        | Py_TPFLAGS_BASETYPE,          /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    (traverseproc)mbstreamreader_traverse,      /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iterext */\r
+    mbstreamreader_methods,             /* tp_methods */\r
+    mbstreamreader_members,             /* tp_members */\r
+    codecctx_getsets,                   /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    mbstreamreader_init,                /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    mbstreamreader_new,                 /* tp_new */\r
+};\r
+\r
+\r
+/**\r
+ * MultibyteStreamWriter object\r
+ */\r
+\r
+static int\r
+mbstreamwriter_iwrite(MultibyteStreamWriterObject *self,\r
+                      PyObject *unistr)\r
+{\r
+    PyObject *str, *wr;\r
+\r
+    str = encoder_encode_stateful(STATEFUL_ECTX(self), unistr, 0);\r
+    if (str == NULL)\r
+        return -1;\r
+\r
+    wr = PyObject_CallMethod(self->stream, "write", "O", str);\r
+    Py_DECREF(str);\r
+    if (wr == NULL)\r
+        return -1;\r
+\r
+    Py_DECREF(wr);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+mbstreamwriter_write(MultibyteStreamWriterObject *self, PyObject *strobj)\r
+{\r
+    if (mbstreamwriter_iwrite(self, strobj))\r
+        return NULL;\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+mbstreamwriter_writelines(MultibyteStreamWriterObject *self, PyObject *lines)\r
+{\r
+    PyObject *strobj;\r
+    int i, r;\r
+\r
+    if (!PySequence_Check(lines)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "arg must be a sequence object");\r
+        return NULL;\r
+    }\r
+\r
+    for (i = 0; i < PySequence_Length(lines); i++) {\r
+        /* length can be changed even within this loop */\r
+        strobj = PySequence_GetItem(lines, i);\r
+        if (strobj == NULL)\r
+            return NULL;\r
+\r
+        r = mbstreamwriter_iwrite(self, strobj);\r
+        Py_DECREF(strobj);\r
+        if (r == -1)\r
+            return NULL;\r
+    }\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+mbstreamwriter_reset(MultibyteStreamWriterObject *self)\r
+{\r
+    const Py_UNICODE *pending;\r
+    PyObject *pwrt;\r
+\r
+    pending = self->pending;\r
+    pwrt = multibytecodec_encode(self->codec, &self->state,\r
+                    &pending, self->pendingsize, self->errors,\r
+                    MBENC_FLUSH | MBENC_RESET);\r
+    /* some pending buffer can be truncated when UnicodeEncodeError is\r
+     * raised on 'strict' mode. but, 'reset' method is designed to\r
+     * reset the pending buffer or states so failed string sequence\r
+     * ought to be missed */\r
+    self->pendingsize = 0;\r
+    if (pwrt == NULL)\r
+        return NULL;\r
+\r
+    if (PyString_Size(pwrt) > 0) {\r
+        PyObject *wr;\r
+        wr = PyObject_CallMethod(self->stream, "write", "O", pwrt);\r
+        if (wr == NULL) {\r
+            Py_DECREF(pwrt);\r
+            return NULL;\r
+        }\r
+    }\r
+    Py_DECREF(pwrt);\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject *\r
+mbstreamwriter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    MultibyteStreamWriterObject *self;\r
+    PyObject *stream, *codec = NULL;\r
+    char *errors = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|s:StreamWriter",\r
+                            streamkwarglist, &stream, &errors))\r
+        return NULL;\r
+\r
+    self = (MultibyteStreamWriterObject *)type->tp_alloc(type, 0);\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+    codec = PyObject_GetAttrString((PyObject *)type, "codec");\r
+    if (codec == NULL)\r
+        goto errorexit;\r
+    if (!MultibyteCodec_Check(codec)) {\r
+        PyErr_SetString(PyExc_TypeError, "codec is unexpected type");\r
+        goto errorexit;\r
+    }\r
+\r
+    self->codec = ((MultibyteCodecObject *)codec)->codec;\r
+    self->stream = stream;\r
+    Py_INCREF(stream);\r
+    self->pendingsize = 0;\r
+    self->errors = internal_error_callback(errors);\r
+    if (self->errors == NULL)\r
+        goto errorexit;\r
+    if (self->codec->encinit != NULL &&\r
+        self->codec->encinit(&self->state, self->codec->config) != 0)\r
+        goto errorexit;\r
+\r
+    Py_DECREF(codec);\r
+    return (PyObject *)self;\r
+\r
+errorexit:\r
+    Py_XDECREF(self);\r
+    Py_XDECREF(codec);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+mbstreamwriter_init(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    return 0;\r
+}\r
+\r
+static int\r
+mbstreamwriter_traverse(MultibyteStreamWriterObject *self,\r
+                        visitproc visit, void *arg)\r
+{\r
+    if (ERROR_ISCUSTOM(self->errors))\r
+        Py_VISIT(self->errors);\r
+    Py_VISIT(self->stream);\r
+    return 0;\r
+}\r
+\r
+static void\r
+mbstreamwriter_dealloc(MultibyteStreamWriterObject *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    ERROR_DECREF(self->errors);\r
+    Py_XDECREF(self->stream);\r
+    Py_TYPE(self)->tp_free(self);\r
+}\r
+\r
+static struct PyMethodDef mbstreamwriter_methods[] = {\r
+    {"write",           (PyCFunction)mbstreamwriter_write,\r
+                    METH_O, NULL},\r
+    {"writelines",      (PyCFunction)mbstreamwriter_writelines,\r
+                    METH_O, NULL},\r
+    {"reset",           (PyCFunction)mbstreamwriter_reset,\r
+                    METH_NOARGS, NULL},\r
+    {NULL,              NULL},\r
+};\r
+\r
+static PyMemberDef mbstreamwriter_members[] = {\r
+    {"stream",          T_OBJECT,\r
+                    offsetof(MultibyteStreamWriterObject, stream),\r
+                    READONLY, NULL},\r
+    {NULL,}\r
+};\r
+\r
+static PyTypeObject MultibyteStreamWriter_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "MultibyteStreamWriter",            /* tp_name */\r
+    sizeof(MultibyteStreamWriterObject), /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /*  methods  */\r
+    (destructor)mbstreamwriter_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC\r
+        | Py_TPFLAGS_BASETYPE,          /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    (traverseproc)mbstreamwriter_traverse,      /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iterext */\r
+    mbstreamwriter_methods,             /* tp_methods */\r
+    mbstreamwriter_members,             /* tp_members */\r
+    codecctx_getsets,                   /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    mbstreamwriter_init,                /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    mbstreamwriter_new,                 /* tp_new */\r
+};\r
+\r
+\r
+/**\r
+ * Exposed factory function\r
+ */\r
+\r
+static PyObject *\r
+__create_codec(PyObject *ignore, PyObject *arg)\r
+{\r
+    MultibyteCodecObject *self;\r
+    MultibyteCodec *codec;\r
+\r
+    if (!PyCapsule_IsValid(arg, PyMultibyteCodec_CAPSULE_NAME)) {\r
+        PyErr_SetString(PyExc_ValueError, "argument type invalid");\r
+        return NULL;\r
+    }\r
+\r
+    codec = PyCapsule_GetPointer(arg, PyMultibyteCodec_CAPSULE_NAME);\r
+    if (codec->codecinit != NULL && codec->codecinit(codec->config) != 0)\r
+        return NULL;\r
+\r
+    self = PyObject_New(MultibyteCodecObject, &MultibyteCodec_Type);\r
+    if (self == NULL)\r
+        return NULL;\r
+    self->codec = codec;\r
+\r
+    return (PyObject *)self;\r
+}\r
+\r
+static struct PyMethodDef __methods[] = {\r
+    {"__create_codec", (PyCFunction)__create_codec, METH_O},\r
+    {NULL, NULL},\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_multibytecodec(void)\r
+{\r
+    int i;\r
+    PyObject *m;\r
+    PyTypeObject *typelist[] = {\r
+        &MultibyteIncrementalEncoder_Type,\r
+        &MultibyteIncrementalDecoder_Type,\r
+        &MultibyteStreamReader_Type,\r
+        &MultibyteStreamWriter_Type,\r
+        NULL\r
+    };\r
+\r
+    if (PyType_Ready(&MultibyteCodec_Type) < 0)\r
+        return;\r
+\r
+    m = Py_InitModule("_multibytecodec", __methods);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    for (i = 0; typelist[i] != NULL; i++) {\r
+        if (PyType_Ready(typelist[i]) < 0)\r
+            return;\r
+        Py_INCREF(typelist[i]);\r
+        PyModule_AddObject(m, typelist[i]->tp_name,\r
+                           (PyObject *)typelist[i]);\r
+    }\r
+\r
+    if (PyErr_Occurred())\r
+        Py_FatalError("can't initialize the _multibytecodec module");\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/cjkcodecs/multibytecodec.h
new file mode 100644 (file)
index 0000000..2efa037
--- /dev/null
@@ -0,0 +1,141 @@
+/*\r
+ * multibytecodec.h: Common Multibyte Codec Implementation\r
+ *\r
+ * Written by Hye-Shik Chang <perky@FreeBSD.org>\r
+ */\r
+\r
+#ifndef _PYTHON_MULTIBYTECODEC_H_\r
+#define _PYTHON_MULTIBYTECODEC_H_\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef uint32_t\r
+typedef uint32_t ucs4_t;\r
+#else\r
+typedef unsigned int ucs4_t;\r
+#endif\r
+\r
+#ifdef uint16_t\r
+typedef uint16_t ucs2_t, DBCHAR;\r
+#else\r
+typedef unsigned short ucs2_t, DBCHAR;\r
+#endif\r
+\r
+typedef union {\r
+    void *p;\r
+    int i;\r
+    unsigned char c[8];\r
+    ucs2_t u2[4];\r
+    ucs4_t u4[2];\r
+} MultibyteCodec_State;\r
+\r
+typedef int (*mbcodec_init)(const void *config);\r
+typedef Py_ssize_t (*mbencode_func)(MultibyteCodec_State *state,\r
+                        const void *config,\r
+                        const Py_UNICODE **inbuf, Py_ssize_t inleft,\r
+                        unsigned char **outbuf, Py_ssize_t outleft,\r
+                        int flags);\r
+typedef int (*mbencodeinit_func)(MultibyteCodec_State *state,\r
+                                 const void *config);\r
+typedef Py_ssize_t (*mbencodereset_func)(MultibyteCodec_State *state,\r
+                        const void *config,\r
+                        unsigned char **outbuf, Py_ssize_t outleft);\r
+typedef Py_ssize_t (*mbdecode_func)(MultibyteCodec_State *state,\r
+                        const void *config,\r
+                        const unsigned char **inbuf, Py_ssize_t inleft,\r
+                        Py_UNICODE **outbuf, Py_ssize_t outleft);\r
+typedef int (*mbdecodeinit_func)(MultibyteCodec_State *state,\r
+                                 const void *config);\r
+typedef Py_ssize_t (*mbdecodereset_func)(MultibyteCodec_State *state,\r
+                                         const void *config);\r
+\r
+typedef struct {\r
+    const char *encoding;\r
+    const void *config;\r
+    mbcodec_init codecinit;\r
+    mbencode_func encode;\r
+    mbencodeinit_func encinit;\r
+    mbencodereset_func encreset;\r
+    mbdecode_func decode;\r
+    mbdecodeinit_func decinit;\r
+    mbdecodereset_func decreset;\r
+} MultibyteCodec;\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    MultibyteCodec *codec;\r
+} MultibyteCodecObject;\r
+\r
+#define MultibyteCodec_Check(op) ((op)->ob_type == &MultibyteCodec_Type)\r
+\r
+#define _MultibyteStatefulCodec_HEAD            \\r
+    PyObject_HEAD                               \\r
+    MultibyteCodec *codec;                      \\r
+    MultibyteCodec_State state;                 \\r
+    PyObject *errors;\r
+typedef struct {\r
+    _MultibyteStatefulCodec_HEAD\r
+} MultibyteStatefulCodecContext;\r
+\r
+#define MAXENCPENDING   2\r
+#define _MultibyteStatefulEncoder_HEAD          \\r
+    _MultibyteStatefulCodec_HEAD                \\r
+    Py_UNICODE pending[MAXENCPENDING];          \\r
+    Py_ssize_t pendingsize;\r
+typedef struct {\r
+    _MultibyteStatefulEncoder_HEAD\r
+} MultibyteStatefulEncoderContext;\r
+\r
+#define MAXDECPENDING   8\r
+#define _MultibyteStatefulDecoder_HEAD          \\r
+    _MultibyteStatefulCodec_HEAD                \\r
+    unsigned char pending[MAXDECPENDING];       \\r
+    Py_ssize_t pendingsize;\r
+typedef struct {\r
+    _MultibyteStatefulDecoder_HEAD\r
+} MultibyteStatefulDecoderContext;\r
+\r
+typedef struct {\r
+    _MultibyteStatefulEncoder_HEAD\r
+} MultibyteIncrementalEncoderObject;\r
+\r
+typedef struct {\r
+    _MultibyteStatefulDecoder_HEAD\r
+} MultibyteIncrementalDecoderObject;\r
+\r
+typedef struct {\r
+    _MultibyteStatefulDecoder_HEAD\r
+    PyObject *stream;\r
+} MultibyteStreamReaderObject;\r
+\r
+typedef struct {\r
+    _MultibyteStatefulEncoder_HEAD\r
+    PyObject *stream;\r
+} MultibyteStreamWriterObject;\r
+\r
+/* positive values for illegal sequences */\r
+#define MBERR_TOOSMALL          (-1) /* insufficient output buffer space */\r
+#define MBERR_TOOFEW            (-2) /* incomplete input buffer */\r
+#define MBERR_INTERNAL          (-3) /* internal runtime error */\r
+\r
+#define ERROR_STRICT            (PyObject *)(1)\r
+#define ERROR_IGNORE            (PyObject *)(2)\r
+#define ERROR_REPLACE           (PyObject *)(3)\r
+#define ERROR_ISCUSTOM(p)       ((p) < ERROR_STRICT || ERROR_REPLACE < (p))\r
+#define ERROR_DECREF(p) do {                    \\r
+    if (p != NULL && ERROR_ISCUSTOM(p)) {       \\r
+        Py_DECREF(p);                           \\r
+    }                                           \\r
+} while (0);\r
+\r
+#define MBENC_FLUSH             0x0001 /* encode all characters encodable */\r
+#define MBENC_MAX               MBENC_FLUSH\r
+\r
+#define PyMultibyteCodec_CAPSULE_NAME "multibytecodec.__map_*"\r
+\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/cmathmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/cmathmodule.c
new file mode 100644 (file)
index 0000000..1c51ee5
--- /dev/null
@@ -0,0 +1,1217 @@
+/* Complex math module */\r
+\r
+/* much code borrowed from mathmodule.c */\r
+\r
+#include "Python.h"\r
+#include "_math.h"\r
+/* we need DBL_MAX, DBL_MIN, DBL_EPSILON, DBL_MANT_DIG and FLT_RADIX from\r
+   float.h.  We assume that FLT_RADIX is either 2 or 16. */\r
+#include <float.h>\r
+\r
+#if (FLT_RADIX != 2 && FLT_RADIX != 16)\r
+#error "Modules/cmathmodule.c expects FLT_RADIX to be 2 or 16"\r
+#endif\r
+\r
+#ifndef M_LN2\r
+#define M_LN2 (0.6931471805599453094) /* natural log of 2 */\r
+#endif\r
+\r
+#ifndef M_LN10\r
+#define M_LN10 (2.302585092994045684) /* natural log of 10 */\r
+#endif\r
+\r
+/*\r
+   CM_LARGE_DOUBLE is used to avoid spurious overflow in the sqrt, log,\r
+   inverse trig and inverse hyperbolic trig functions.  Its log is used in the\r
+   evaluation of exp, cos, cosh, sin, sinh, tan, and tanh to avoid unnecessary\r
+   overflow.\r
+ */\r
+\r
+#define CM_LARGE_DOUBLE (DBL_MAX/4.)\r
+#define CM_SQRT_LARGE_DOUBLE (sqrt(CM_LARGE_DOUBLE))\r
+#define CM_LOG_LARGE_DOUBLE (log(CM_LARGE_DOUBLE))\r
+#define CM_SQRT_DBL_MIN (sqrt(DBL_MIN))\r
+\r
+/*\r
+   CM_SCALE_UP is an odd integer chosen such that multiplication by\r
+   2**CM_SCALE_UP is sufficient to turn a subnormal into a normal.\r
+   CM_SCALE_DOWN is (-(CM_SCALE_UP+1)/2).  These scalings are used to compute\r
+   square roots accurately when the real and imaginary parts of the argument\r
+   are subnormal.\r
+*/\r
+\r
+#if FLT_RADIX==2\r
+#define CM_SCALE_UP (2*(DBL_MANT_DIG/2) + 1)\r
+#elif FLT_RADIX==16\r
+#define CM_SCALE_UP (4*DBL_MANT_DIG+1)\r
+#endif\r
+#define CM_SCALE_DOWN (-(CM_SCALE_UP+1)/2)\r
+\r
+/* forward declarations */\r
+static Py_complex c_asinh(Py_complex);\r
+static Py_complex c_atanh(Py_complex);\r
+static Py_complex c_cosh(Py_complex);\r
+static Py_complex c_sinh(Py_complex);\r
+static Py_complex c_sqrt(Py_complex);\r
+static Py_complex c_tanh(Py_complex);\r
+static PyObject * math_error(void);\r
+\r
+/* Code to deal with special values (infinities, NaNs, etc.). */\r
+\r
+/* special_type takes a double and returns an integer code indicating\r
+   the type of the double as follows:\r
+*/\r
+\r
+enum special_types {\r
+    ST_NINF,            /* 0, negative infinity */\r
+    ST_NEG,             /* 1, negative finite number (nonzero) */\r
+    ST_NZERO,           /* 2, -0. */\r
+    ST_PZERO,           /* 3, +0. */\r
+    ST_POS,             /* 4, positive finite number (nonzero) */\r
+    ST_PINF,            /* 5, positive infinity */\r
+    ST_NAN              /* 6, Not a Number */\r
+};\r
+\r
+static enum special_types\r
+special_type(double d)\r
+{\r
+    if (Py_IS_FINITE(d)) {\r
+        if (d != 0) {\r
+            if (copysign(1., d) == 1.)\r
+                return ST_POS;\r
+            else\r
+                return ST_NEG;\r
+        }\r
+        else {\r
+            if (copysign(1., d) == 1.)\r
+                return ST_PZERO;\r
+            else\r
+                return ST_NZERO;\r
+        }\r
+    }\r
+    if (Py_IS_NAN(d))\r
+        return ST_NAN;\r
+    if (copysign(1., d) == 1.)\r
+        return ST_PINF;\r
+    else\r
+        return ST_NINF;\r
+}\r
+\r
+#define SPECIAL_VALUE(z, table)                                         \\r
+    if (!Py_IS_FINITE((z).real) || !Py_IS_FINITE((z).imag)) {           \\r
+        errno = 0;                                              \\r
+        return table[special_type((z).real)]                            \\r
+                    [special_type((z).imag)];                           \\r
+    }\r
+\r
+#define P Py_MATH_PI\r
+#define P14 0.25*Py_MATH_PI\r
+#define P12 0.5*Py_MATH_PI\r
+#define P34 0.75*Py_MATH_PI\r
+#define INF Py_HUGE_VAL\r
+#define N Py_NAN\r
+#define U -9.5426319407711027e33 /* unlikely value, used as placeholder */\r
+\r
+/* First, the C functions that do the real work.  Each of the c_*\r
+   functions computes and returns the C99 Annex G recommended result\r
+   and also sets errno as follows: errno = 0 if no floating-point\r
+   exception is associated with the result; errno = EDOM if C99 Annex\r
+   G recommends raising divide-by-zero or invalid for this result; and\r
+   errno = ERANGE where the overflow floating-point signal should be\r
+   raised.\r
+*/\r
+\r
+static Py_complex acos_special_values[7][7];\r
+\r
+static Py_complex\r
+c_acos(Py_complex z)\r
+{\r
+    Py_complex s1, s2, r;\r
+\r
+    SPECIAL_VALUE(z, acos_special_values);\r
+\r
+    if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {\r
+        /* avoid unnecessary overflow for large arguments */\r
+        r.real = atan2(fabs(z.imag), z.real);\r
+        /* split into cases to make sure that the branch cut has the\r
+           correct continuity on systems with unsigned zeros */\r
+        if (z.real < 0.) {\r
+            r.imag = -copysign(log(hypot(z.real/2., z.imag/2.)) +\r
+                               M_LN2*2., z.imag);\r
+        } else {\r
+            r.imag = copysign(log(hypot(z.real/2., z.imag/2.)) +\r
+                              M_LN2*2., -z.imag);\r
+        }\r
+    } else {\r
+        s1.real = 1.-z.real;\r
+        s1.imag = -z.imag;\r
+        s1 = c_sqrt(s1);\r
+        s2.real = 1.+z.real;\r
+        s2.imag = z.imag;\r
+        s2 = c_sqrt(s2);\r
+        r.real = 2.*atan2(s1.real, s2.real);\r
+        r.imag = m_asinh(s2.real*s1.imag - s2.imag*s1.real);\r
+    }\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_acos_doc,\r
+"acos(x)\n"\r
+"\n"\r
+"Return the arc cosine of x.");\r
+\r
+\r
+static Py_complex acosh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_acosh(Py_complex z)\r
+{\r
+    Py_complex s1, s2, r;\r
+\r
+    SPECIAL_VALUE(z, acosh_special_values);\r
+\r
+    if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {\r
+        /* avoid unnecessary overflow for large arguments */\r
+        r.real = log(hypot(z.real/2., z.imag/2.)) + M_LN2*2.;\r
+        r.imag = atan2(z.imag, z.real);\r
+    } else {\r
+        s1.real = z.real - 1.;\r
+        s1.imag = z.imag;\r
+        s1 = c_sqrt(s1);\r
+        s2.real = z.real + 1.;\r
+        s2.imag = z.imag;\r
+        s2 = c_sqrt(s2);\r
+        r.real = m_asinh(s1.real*s2.real + s1.imag*s2.imag);\r
+        r.imag = 2.*atan2(s1.imag, s2.real);\r
+    }\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_acosh_doc,\r
+"acosh(x)\n"\r
+"\n"\r
+"Return the inverse hyperbolic cosine of x.");\r
+\r
+\r
+static Py_complex\r
+c_asin(Py_complex z)\r
+{\r
+    /* asin(z) = -i asinh(iz) */\r
+    Py_complex s, r;\r
+    s.real = -z.imag;\r
+    s.imag = z.real;\r
+    s = c_asinh(s);\r
+    r.real = s.imag;\r
+    r.imag = -s.real;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_asin_doc,\r
+"asin(x)\n"\r
+"\n"\r
+"Return the arc sine of x.");\r
+\r
+\r
+static Py_complex asinh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_asinh(Py_complex z)\r
+{\r
+    Py_complex s1, s2, r;\r
+\r
+    SPECIAL_VALUE(z, asinh_special_values);\r
+\r
+    if (fabs(z.real) > CM_LARGE_DOUBLE || fabs(z.imag) > CM_LARGE_DOUBLE) {\r
+        if (z.imag >= 0.) {\r
+            r.real = copysign(log(hypot(z.real/2., z.imag/2.)) +\r
+                              M_LN2*2., z.real);\r
+        } else {\r
+            r.real = -copysign(log(hypot(z.real/2., z.imag/2.)) +\r
+                               M_LN2*2., -z.real);\r
+        }\r
+        r.imag = atan2(z.imag, fabs(z.real));\r
+    } else {\r
+        s1.real = 1.+z.imag;\r
+        s1.imag = -z.real;\r
+        s1 = c_sqrt(s1);\r
+        s2.real = 1.-z.imag;\r
+        s2.imag = z.real;\r
+        s2 = c_sqrt(s2);\r
+        r.real = m_asinh(s1.real*s2.imag-s2.real*s1.imag);\r
+        r.imag = atan2(z.imag, s1.real*s2.real-s1.imag*s2.imag);\r
+    }\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_asinh_doc,\r
+"asinh(x)\n"\r
+"\n"\r
+"Return the inverse hyperbolic sine of x.");\r
+\r
+\r
+static Py_complex\r
+c_atan(Py_complex z)\r
+{\r
+    /* atan(z) = -i atanh(iz) */\r
+    Py_complex s, r;\r
+    s.real = -z.imag;\r
+    s.imag = z.real;\r
+    s = c_atanh(s);\r
+    r.real = s.imag;\r
+    r.imag = -s.real;\r
+    return r;\r
+}\r
+\r
+/* Windows screws up atan2 for inf and nan, and alpha Tru64 5.1 doesn't follow\r
+   C99 for atan2(0., 0.). */\r
+static double\r
+c_atan2(Py_complex z)\r
+{\r
+    if (Py_IS_NAN(z.real) || Py_IS_NAN(z.imag))\r
+        return Py_NAN;\r
+    if (Py_IS_INFINITY(z.imag)) {\r
+        if (Py_IS_INFINITY(z.real)) {\r
+            if (copysign(1., z.real) == 1.)\r
+                /* atan2(+-inf, +inf) == +-pi/4 */\r
+                return copysign(0.25*Py_MATH_PI, z.imag);\r
+            else\r
+                /* atan2(+-inf, -inf) == +-pi*3/4 */\r
+                return copysign(0.75*Py_MATH_PI, z.imag);\r
+        }\r
+        /* atan2(+-inf, x) == +-pi/2 for finite x */\r
+        return copysign(0.5*Py_MATH_PI, z.imag);\r
+    }\r
+    if (Py_IS_INFINITY(z.real) || z.imag == 0.) {\r
+        if (copysign(1., z.real) == 1.)\r
+            /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */\r
+            return copysign(0., z.imag);\r
+        else\r
+            /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */\r
+            return copysign(Py_MATH_PI, z.imag);\r
+    }\r
+    return atan2(z.imag, z.real);\r
+}\r
+\r
+PyDoc_STRVAR(c_atan_doc,\r
+"atan(x)\n"\r
+"\n"\r
+"Return the arc tangent of x.");\r
+\r
+\r
+static Py_complex atanh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_atanh(Py_complex z)\r
+{\r
+    Py_complex r;\r
+    double ay, h;\r
+\r
+    SPECIAL_VALUE(z, atanh_special_values);\r
+\r
+    /* Reduce to case where z.real >= 0., using atanh(z) = -atanh(-z). */\r
+    if (z.real < 0.) {\r
+        return c_neg(c_atanh(c_neg(z)));\r
+    }\r
+\r
+    ay = fabs(z.imag);\r
+    if (z.real > CM_SQRT_LARGE_DOUBLE || ay > CM_SQRT_LARGE_DOUBLE) {\r
+        /*\r
+           if abs(z) is large then we use the approximation\r
+           atanh(z) ~ 1/z +/- i*pi/2 (+/- depending on the sign\r
+           of z.imag)\r
+        */\r
+        h = hypot(z.real/2., z.imag/2.);  /* safe from overflow */\r
+        r.real = z.real/4./h/h;\r
+        /* the two negations in the next line cancel each other out\r
+           except when working with unsigned zeros: they're there to\r
+           ensure that the branch cut has the correct continuity on\r
+           systems that don't support signed zeros */\r
+        r.imag = -copysign(Py_MATH_PI/2., -z.imag);\r
+        errno = 0;\r
+    } else if (z.real == 1. && ay < CM_SQRT_DBL_MIN) {\r
+        /* C99 standard says:  atanh(1+/-0.) should be inf +/- 0i */\r
+        if (ay == 0.) {\r
+            r.real = INF;\r
+            r.imag = z.imag;\r
+            errno = EDOM;\r
+        } else {\r
+            r.real = -log(sqrt(ay)/sqrt(hypot(ay, 2.)));\r
+            r.imag = copysign(atan2(2., -ay)/2, z.imag);\r
+            errno = 0;\r
+        }\r
+    } else {\r
+        r.real = m_log1p(4.*z.real/((1-z.real)*(1-z.real) + ay*ay))/4.;\r
+        r.imag = -atan2(-2.*z.imag, (1-z.real)*(1+z.real) - ay*ay)/2.;\r
+        errno = 0;\r
+    }\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_atanh_doc,\r
+"atanh(x)\n"\r
+"\n"\r
+"Return the inverse hyperbolic tangent of x.");\r
+\r
+\r
+static Py_complex\r
+c_cos(Py_complex z)\r
+{\r
+    /* cos(z) = cosh(iz) */\r
+    Py_complex r;\r
+    r.real = -z.imag;\r
+    r.imag = z.real;\r
+    r = c_cosh(r);\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_cos_doc,\r
+"cos(x)\n"\r
+"\n"\r
+"Return the cosine of x.");\r
+\r
+\r
+/* cosh(infinity + i*y) needs to be dealt with specially */\r
+static Py_complex cosh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_cosh(Py_complex z)\r
+{\r
+    Py_complex r;\r
+    double x_minus_one;\r
+\r
+    /* special treatment for cosh(+/-inf + iy) if y is not a NaN */\r
+    if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {\r
+        if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag) &&\r
+            (z.imag != 0.)) {\r
+            if (z.real > 0) {\r
+                r.real = copysign(INF, cos(z.imag));\r
+                r.imag = copysign(INF, sin(z.imag));\r
+            }\r
+            else {\r
+                r.real = copysign(INF, cos(z.imag));\r
+                r.imag = -copysign(INF, sin(z.imag));\r
+            }\r
+        }\r
+        else {\r
+            r = cosh_special_values[special_type(z.real)]\r
+                                   [special_type(z.imag)];\r
+        }\r
+        /* need to set errno = EDOM if y is +/- infinity and x is not\r
+           a NaN */\r
+        if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+        return r;\r
+    }\r
+\r
+    if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {\r
+        /* deal correctly with cases where cosh(z.real) overflows but\r
+           cosh(z) does not. */\r
+        x_minus_one = z.real - copysign(1., z.real);\r
+        r.real = cos(z.imag) * cosh(x_minus_one) * Py_MATH_E;\r
+        r.imag = sin(z.imag) * sinh(x_minus_one) * Py_MATH_E;\r
+    } else {\r
+        r.real = cos(z.imag) * cosh(z.real);\r
+        r.imag = sin(z.imag) * sinh(z.real);\r
+    }\r
+    /* detect overflow, and set errno accordingly */\r
+    if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))\r
+        errno = ERANGE;\r
+    else\r
+        errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_cosh_doc,\r
+"cosh(x)\n"\r
+"\n"\r
+"Return the hyperbolic cosine of x.");\r
+\r
+\r
+/* exp(infinity + i*y) and exp(-infinity + i*y) need special treatment for\r
+   finite y */\r
+static Py_complex exp_special_values[7][7];\r
+\r
+static Py_complex\r
+c_exp(Py_complex z)\r
+{\r
+    Py_complex r;\r
+    double l;\r
+\r
+    if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {\r
+        if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)\r
+            && (z.imag != 0.)) {\r
+            if (z.real > 0) {\r
+                r.real = copysign(INF, cos(z.imag));\r
+                r.imag = copysign(INF, sin(z.imag));\r
+            }\r
+            else {\r
+                r.real = copysign(0., cos(z.imag));\r
+                r.imag = copysign(0., sin(z.imag));\r
+            }\r
+        }\r
+        else {\r
+            r = exp_special_values[special_type(z.real)]\r
+                                  [special_type(z.imag)];\r
+        }\r
+        /* need to set errno = EDOM if y is +/- infinity and x is not\r
+           a NaN and not -infinity */\r
+        if (Py_IS_INFINITY(z.imag) &&\r
+            (Py_IS_FINITE(z.real) ||\r
+             (Py_IS_INFINITY(z.real) && z.real > 0)))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+        return r;\r
+    }\r
+\r
+    if (z.real > CM_LOG_LARGE_DOUBLE) {\r
+        l = exp(z.real-1.);\r
+        r.real = l*cos(z.imag)*Py_MATH_E;\r
+        r.imag = l*sin(z.imag)*Py_MATH_E;\r
+    } else {\r
+        l = exp(z.real);\r
+        r.real = l*cos(z.imag);\r
+        r.imag = l*sin(z.imag);\r
+    }\r
+    /* detect overflow, and set errno accordingly */\r
+    if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))\r
+        errno = ERANGE;\r
+    else\r
+        errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_exp_doc,\r
+"exp(x)\n"\r
+"\n"\r
+"Return the exponential value e**x.");\r
+\r
+\r
+static Py_complex log_special_values[7][7];\r
+\r
+static Py_complex\r
+c_log(Py_complex z)\r
+{\r
+    /*\r
+       The usual formula for the real part is log(hypot(z.real, z.imag)).\r
+       There are four situations where this formula is potentially\r
+       problematic:\r
+\r
+       (1) the absolute value of z is subnormal.  Then hypot is subnormal,\r
+       so has fewer than the usual number of bits of accuracy, hence may\r
+       have large relative error.  This then gives a large absolute error\r
+       in the log.  This can be solved by rescaling z by a suitable power\r
+       of 2.\r
+\r
+       (2) the absolute value of z is greater than DBL_MAX (e.g. when both\r
+       z.real and z.imag are within a factor of 1/sqrt(2) of DBL_MAX)\r
+       Again, rescaling solves this.\r
+\r
+       (3) the absolute value of z is close to 1.  In this case it's\r
+       difficult to achieve good accuracy, at least in part because a\r
+       change of 1ulp in the real or imaginary part of z can result in a\r
+       change of billions of ulps in the correctly rounded answer.\r
+\r
+       (4) z = 0.  The simplest thing to do here is to call the\r
+       floating-point log with an argument of 0, and let its behaviour\r
+       (returning -infinity, signaling a floating-point exception, setting\r
+       errno, or whatever) determine that of c_log.  So the usual formula\r
+       is fine here.\r
+\r
+     */\r
+\r
+    Py_complex r;\r
+    double ax, ay, am, an, h;\r
+\r
+    SPECIAL_VALUE(z, log_special_values);\r
+\r
+    ax = fabs(z.real);\r
+    ay = fabs(z.imag);\r
+\r
+    if (ax > CM_LARGE_DOUBLE || ay > CM_LARGE_DOUBLE) {\r
+        r.real = log(hypot(ax/2., ay/2.)) + M_LN2;\r
+    } else if (ax < DBL_MIN && ay < DBL_MIN) {\r
+        if (ax > 0. || ay > 0.) {\r
+            /* catch cases where hypot(ax, ay) is subnormal */\r
+            r.real = log(hypot(ldexp(ax, DBL_MANT_DIG),\r
+                     ldexp(ay, DBL_MANT_DIG))) - DBL_MANT_DIG*M_LN2;\r
+        }\r
+        else {\r
+            /* log(+/-0. +/- 0i) */\r
+            r.real = -INF;\r
+            r.imag = atan2(z.imag, z.real);\r
+            errno = EDOM;\r
+            return r;\r
+        }\r
+    } else {\r
+        h = hypot(ax, ay);\r
+        if (0.71 <= h && h <= 1.73) {\r
+            am = ax > ay ? ax : ay;  /* max(ax, ay) */\r
+            an = ax > ay ? ay : ax;  /* min(ax, ay) */\r
+            r.real = m_log1p((am-1)*(am+1)+an*an)/2.;\r
+        } else {\r
+            r.real = log(h);\r
+        }\r
+    }\r
+    r.imag = atan2(z.imag, z.real);\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+\r
+static Py_complex\r
+c_log10(Py_complex z)\r
+{\r
+    Py_complex r;\r
+    int errno_save;\r
+\r
+    r = c_log(z);\r
+    errno_save = errno; /* just in case the divisions affect errno */\r
+    r.real = r.real / M_LN10;\r
+    r.imag = r.imag / M_LN10;\r
+    errno = errno_save;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_log10_doc,\r
+"log10(x)\n"\r
+"\n"\r
+"Return the base-10 logarithm of x.");\r
+\r
+\r
+static Py_complex\r
+c_sin(Py_complex z)\r
+{\r
+    /* sin(z) = -i sin(iz) */\r
+    Py_complex s, r;\r
+    s.real = -z.imag;\r
+    s.imag = z.real;\r
+    s = c_sinh(s);\r
+    r.real = s.imag;\r
+    r.imag = -s.real;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_sin_doc,\r
+"sin(x)\n"\r
+"\n"\r
+"Return the sine of x.");\r
+\r
+\r
+/* sinh(infinity + i*y) needs to be dealt with specially */\r
+static Py_complex sinh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_sinh(Py_complex z)\r
+{\r
+    Py_complex r;\r
+    double x_minus_one;\r
+\r
+    /* special treatment for sinh(+/-inf + iy) if y is finite and\r
+       nonzero */\r
+    if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {\r
+        if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)\r
+            && (z.imag != 0.)) {\r
+            if (z.real > 0) {\r
+                r.real = copysign(INF, cos(z.imag));\r
+                r.imag = copysign(INF, sin(z.imag));\r
+            }\r
+            else {\r
+                r.real = -copysign(INF, cos(z.imag));\r
+                r.imag = copysign(INF, sin(z.imag));\r
+            }\r
+        }\r
+        else {\r
+            r = sinh_special_values[special_type(z.real)]\r
+                                   [special_type(z.imag)];\r
+        }\r
+        /* need to set errno = EDOM if y is +/- infinity and x is not\r
+           a NaN */\r
+        if (Py_IS_INFINITY(z.imag) && !Py_IS_NAN(z.real))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+        return r;\r
+    }\r
+\r
+    if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {\r
+        x_minus_one = z.real - copysign(1., z.real);\r
+        r.real = cos(z.imag) * sinh(x_minus_one) * Py_MATH_E;\r
+        r.imag = sin(z.imag) * cosh(x_minus_one) * Py_MATH_E;\r
+    } else {\r
+        r.real = cos(z.imag) * sinh(z.real);\r
+        r.imag = sin(z.imag) * cosh(z.real);\r
+    }\r
+    /* detect overflow, and set errno accordingly */\r
+    if (Py_IS_INFINITY(r.real) || Py_IS_INFINITY(r.imag))\r
+        errno = ERANGE;\r
+    else\r
+        errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_sinh_doc,\r
+"sinh(x)\n"\r
+"\n"\r
+"Return the hyperbolic sine of x.");\r
+\r
+\r
+static Py_complex sqrt_special_values[7][7];\r
+\r
+static Py_complex\r
+c_sqrt(Py_complex z)\r
+{\r
+    /*\r
+       Method: use symmetries to reduce to the case when x = z.real and y\r
+       = z.imag are nonnegative.  Then the real part of the result is\r
+       given by\r
+\r
+         s = sqrt((x + hypot(x, y))/2)\r
+\r
+       and the imaginary part is\r
+\r
+         d = (y/2)/s\r
+\r
+       If either x or y is very large then there's a risk of overflow in\r
+       computation of the expression x + hypot(x, y).  We can avoid this\r
+       by rewriting the formula for s as:\r
+\r
+         s = 2*sqrt(x/8 + hypot(x/8, y/8))\r
+\r
+       This costs us two extra multiplications/divisions, but avoids the\r
+       overhead of checking for x and y large.\r
+\r
+       If both x and y are subnormal then hypot(x, y) may also be\r
+       subnormal, so will lack full precision.  We solve this by rescaling\r
+       x and y by a sufficiently large power of 2 to ensure that x and y\r
+       are normal.\r
+    */\r
+\r
+\r
+    Py_complex r;\r
+    double s,d;\r
+    double ax, ay;\r
+\r
+    SPECIAL_VALUE(z, sqrt_special_values);\r
+\r
+    if (z.real == 0. && z.imag == 0.) {\r
+        r.real = 0.;\r
+        r.imag = z.imag;\r
+        return r;\r
+    }\r
+\r
+    ax = fabs(z.real);\r
+    ay = fabs(z.imag);\r
+\r
+    if (ax < DBL_MIN && ay < DBL_MIN && (ax > 0. || ay > 0.)) {\r
+        /* here we catch cases where hypot(ax, ay) is subnormal */\r
+        ax = ldexp(ax, CM_SCALE_UP);\r
+        s = ldexp(sqrt(ax + hypot(ax, ldexp(ay, CM_SCALE_UP))),\r
+                  CM_SCALE_DOWN);\r
+    } else {\r
+        ax /= 8.;\r
+        s = 2.*sqrt(ax + hypot(ax, ay/8.));\r
+    }\r
+    d = ay/(2.*s);\r
+\r
+    if (z.real >= 0.) {\r
+        r.real = s;\r
+        r.imag = copysign(d, z.imag);\r
+    } else {\r
+        r.real = d;\r
+        r.imag = copysign(s, z.imag);\r
+    }\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_sqrt_doc,\r
+"sqrt(x)\n"\r
+"\n"\r
+"Return the square root of x.");\r
+\r
+\r
+static Py_complex\r
+c_tan(Py_complex z)\r
+{\r
+    /* tan(z) = -i tanh(iz) */\r
+    Py_complex s, r;\r
+    s.real = -z.imag;\r
+    s.imag = z.real;\r
+    s = c_tanh(s);\r
+    r.real = s.imag;\r
+    r.imag = -s.real;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_tan_doc,\r
+"tan(x)\n"\r
+"\n"\r
+"Return the tangent of x.");\r
+\r
+\r
+/* tanh(infinity + i*y) needs to be dealt with specially */\r
+static Py_complex tanh_special_values[7][7];\r
+\r
+static Py_complex\r
+c_tanh(Py_complex z)\r
+{\r
+    /* Formula:\r
+\r
+       tanh(x+iy) = (tanh(x)(1+tan(y)^2) + i tan(y)(1-tanh(x))^2) /\r
+       (1+tan(y)^2 tanh(x)^2)\r
+\r
+       To avoid excessive roundoff error, 1-tanh(x)^2 is better computed\r
+       as 1/cosh(x)^2.  When abs(x) is large, we approximate 1-tanh(x)^2\r
+       by 4 exp(-2*x) instead, to avoid possible overflow in the\r
+       computation of cosh(x).\r
+\r
+    */\r
+\r
+    Py_complex r;\r
+    double tx, ty, cx, txty, denom;\r
+\r
+    /* special treatment for tanh(+/-inf + iy) if y is finite and\r
+       nonzero */\r
+    if (!Py_IS_FINITE(z.real) || !Py_IS_FINITE(z.imag)) {\r
+        if (Py_IS_INFINITY(z.real) && Py_IS_FINITE(z.imag)\r
+            && (z.imag != 0.)) {\r
+            if (z.real > 0) {\r
+                r.real = 1.0;\r
+                r.imag = copysign(0.,\r
+                                  2.*sin(z.imag)*cos(z.imag));\r
+            }\r
+            else {\r
+                r.real = -1.0;\r
+                r.imag = copysign(0.,\r
+                                  2.*sin(z.imag)*cos(z.imag));\r
+            }\r
+        }\r
+        else {\r
+            r = tanh_special_values[special_type(z.real)]\r
+                                   [special_type(z.imag)];\r
+        }\r
+        /* need to set errno = EDOM if z.imag is +/-infinity and\r
+           z.real is finite */\r
+        if (Py_IS_INFINITY(z.imag) && Py_IS_FINITE(z.real))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+        return r;\r
+    }\r
+\r
+    /* danger of overflow in 2.*z.imag !*/\r
+    if (fabs(z.real) > CM_LOG_LARGE_DOUBLE) {\r
+        r.real = copysign(1., z.real);\r
+        r.imag = 4.*sin(z.imag)*cos(z.imag)*exp(-2.*fabs(z.real));\r
+    } else {\r
+        tx = tanh(z.real);\r
+        ty = tan(z.imag);\r
+        cx = 1./cosh(z.real);\r
+        txty = tx*ty;\r
+        denom = 1. + txty*txty;\r
+        r.real = tx*(1.+ty*ty)/denom;\r
+        r.imag = ((ty/denom)*cx)*cx;\r
+    }\r
+    errno = 0;\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(c_tanh_doc,\r
+"tanh(x)\n"\r
+"\n"\r
+"Return the hyperbolic tangent of x.");\r
+\r
+\r
+static PyObject *\r
+cmath_log(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex x;\r
+    Py_complex y;\r
+\r
+    if (!PyArg_ParseTuple(args, "D|D", &x, &y))\r
+        return NULL;\r
+\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("complex function", return 0)\r
+    x = c_log(x);\r
+    if (PyTuple_GET_SIZE(args) == 2) {\r
+        y = c_log(y);\r
+        x = c_quot(x, y);\r
+    }\r
+    PyFPE_END_PROTECT(x)\r
+    if (errno != 0)\r
+        return math_error();\r
+    return PyComplex_FromCComplex(x);\r
+}\r
+\r
+PyDoc_STRVAR(cmath_log_doc,\r
+"log(x[, base]) -> the logarithm of x to the given base.\n\\r
+If the base not specified, returns the natural logarithm (base e) of x.");\r
+\r
+\r
+/* And now the glue to make them available from Python: */\r
+\r
+static PyObject *\r
+math_error(void)\r
+{\r
+    if (errno == EDOM)\r
+        PyErr_SetString(PyExc_ValueError, "math domain error");\r
+    else if (errno == ERANGE)\r
+        PyErr_SetString(PyExc_OverflowError, "math range error");\r
+    else    /* Unexpected math error */\r
+        PyErr_SetFromErrno(PyExc_ValueError);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+math_1(PyObject *args, Py_complex (*func)(Py_complex))\r
+{\r
+    Py_complex x,r ;\r
+    if (!PyArg_ParseTuple(args, "D", &x))\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("complex function", return 0);\r
+    r = (*func)(x);\r
+    PyFPE_END_PROTECT(r);\r
+    if (errno == EDOM) {\r
+        PyErr_SetString(PyExc_ValueError, "math domain error");\r
+        return NULL;\r
+    }\r
+    else if (errno == ERANGE) {\r
+        PyErr_SetString(PyExc_OverflowError, "math range error");\r
+        return NULL;\r
+    }\r
+    else {\r
+        return PyComplex_FromCComplex(r);\r
+    }\r
+}\r
+\r
+#define FUNC1(stubname, func) \\r
+    static PyObject * stubname(PyObject *self, PyObject *args) { \\r
+        return math_1(args, func); \\r
+    }\r
+\r
+FUNC1(cmath_acos, c_acos)\r
+FUNC1(cmath_acosh, c_acosh)\r
+FUNC1(cmath_asin, c_asin)\r
+FUNC1(cmath_asinh, c_asinh)\r
+FUNC1(cmath_atan, c_atan)\r
+FUNC1(cmath_atanh, c_atanh)\r
+FUNC1(cmath_cos, c_cos)\r
+FUNC1(cmath_cosh, c_cosh)\r
+FUNC1(cmath_exp, c_exp)\r
+FUNC1(cmath_log10, c_log10)\r
+FUNC1(cmath_sin, c_sin)\r
+FUNC1(cmath_sinh, c_sinh)\r
+FUNC1(cmath_sqrt, c_sqrt)\r
+FUNC1(cmath_tan, c_tan)\r
+FUNC1(cmath_tanh, c_tanh)\r
+\r
+static PyObject *\r
+cmath_phase(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex z;\r
+    double phi;\r
+    if (!PyArg_ParseTuple(args, "D:phase", &z))\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("arg function", return 0)\r
+    phi = c_atan2(z);\r
+    PyFPE_END_PROTECT(phi)\r
+    if (errno != 0)\r
+        return math_error();\r
+    else\r
+        return PyFloat_FromDouble(phi);\r
+}\r
+\r
+PyDoc_STRVAR(cmath_phase_doc,\r
+"phase(z) -> float\n\n\\r
+Return argument, also known as the phase angle, of a complex.");\r
+\r
+static PyObject *\r
+cmath_polar(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex z;\r
+    double r, phi;\r
+    if (!PyArg_ParseTuple(args, "D:polar", &z))\r
+        return NULL;\r
+    PyFPE_START_PROTECT("polar function", return 0)\r
+    phi = c_atan2(z); /* should not cause any exception */\r
+    r = c_abs(z); /* sets errno to ERANGE on overflow;  otherwise 0 */\r
+    PyFPE_END_PROTECT(r)\r
+    if (errno != 0)\r
+        return math_error();\r
+    else\r
+        return Py_BuildValue("dd", r, phi);\r
+}\r
+\r
+PyDoc_STRVAR(cmath_polar_doc,\r
+"polar(z) -> r: float, phi: float\n\n\\r
+Convert a complex from rectangular coordinates to polar coordinates. r is\n\\r
+the distance from 0 and phi the phase angle.");\r
+\r
+/*\r
+  rect() isn't covered by the C99 standard, but it's not too hard to\r
+  figure out 'spirit of C99' rules for special value handing:\r
+\r
+    rect(x, t) should behave like exp(log(x) + it) for positive-signed x\r
+    rect(x, t) should behave like -exp(log(-x) + it) for negative-signed x\r
+    rect(nan, t) should behave like exp(nan + it), except that rect(nan, 0)\r
+      gives nan +- i0 with the sign of the imaginary part unspecified.\r
+\r
+*/\r
+\r
+static Py_complex rect_special_values[7][7];\r
+\r
+static PyObject *\r
+cmath_rect(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex z;\r
+    double r, phi;\r
+    if (!PyArg_ParseTuple(args, "dd:rect", &r, &phi))\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("rect function", return 0)\r
+\r
+    /* deal with special values */\r
+    if (!Py_IS_FINITE(r) || !Py_IS_FINITE(phi)) {\r
+        /* if r is +/-infinity and phi is finite but nonzero then\r
+           result is (+-INF +-INF i), but we need to compute cos(phi)\r
+           and sin(phi) to figure out the signs. */\r
+        if (Py_IS_INFINITY(r) && (Py_IS_FINITE(phi)\r
+                                  && (phi != 0.))) {\r
+            if (r > 0) {\r
+                z.real = copysign(INF, cos(phi));\r
+                z.imag = copysign(INF, sin(phi));\r
+            }\r
+            else {\r
+                z.real = -copysign(INF, cos(phi));\r
+                z.imag = -copysign(INF, sin(phi));\r
+            }\r
+        }\r
+        else {\r
+            z = rect_special_values[special_type(r)]\r
+                                   [special_type(phi)];\r
+        }\r
+        /* need to set errno = EDOM if r is a nonzero number and phi\r
+           is infinite */\r
+        if (r != 0. && !Py_IS_NAN(r) && Py_IS_INFINITY(phi))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    else if (phi == 0.0) {\r
+        /* Workaround for buggy results with phi=-0.0 on OS X 10.8.  See\r
+           bugs.python.org/issue18513. */\r
+        z.real = r;\r
+        z.imag = r * phi;\r
+        errno = 0;\r
+    }\r
+    else {\r
+        z.real = r * cos(phi);\r
+        z.imag = r * sin(phi);\r
+        errno = 0;\r
+    }\r
+\r
+    PyFPE_END_PROTECT(z)\r
+    if (errno != 0)\r
+        return math_error();\r
+    else\r
+        return PyComplex_FromCComplex(z);\r
+}\r
+\r
+PyDoc_STRVAR(cmath_rect_doc,\r
+"rect(r, phi) -> z: complex\n\n\\r
+Convert from polar coordinates to rectangular coordinates.");\r
+\r
+static PyObject *\r
+cmath_isnan(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex z;\r
+    if (!PyArg_ParseTuple(args, "D:isnan", &z))\r
+        return NULL;\r
+    return PyBool_FromLong(Py_IS_NAN(z.real) || Py_IS_NAN(z.imag));\r
+}\r
+\r
+PyDoc_STRVAR(cmath_isnan_doc,\r
+"isnan(z) -> bool\n\\r
+Checks if the real or imaginary part of z not a number (NaN)");\r
+\r
+static PyObject *\r
+cmath_isinf(PyObject *self, PyObject *args)\r
+{\r
+    Py_complex z;\r
+    if (!PyArg_ParseTuple(args, "D:isnan", &z))\r
+        return NULL;\r
+    return PyBool_FromLong(Py_IS_INFINITY(z.real) ||\r
+                           Py_IS_INFINITY(z.imag));\r
+}\r
+\r
+PyDoc_STRVAR(cmath_isinf_doc,\r
+"isinf(z) -> bool\n\\r
+Checks if the real or imaginary part of z is infinite.");\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module is always available. It provides access to mathematical\n"\r
+"functions for complex numbers.");\r
+\r
+static PyMethodDef cmath_methods[] = {\r
+    {"acos",   cmath_acos,  METH_VARARGS, c_acos_doc},\r
+    {"acosh",  cmath_acosh, METH_VARARGS, c_acosh_doc},\r
+    {"asin",   cmath_asin,  METH_VARARGS, c_asin_doc},\r
+    {"asinh",  cmath_asinh, METH_VARARGS, c_asinh_doc},\r
+    {"atan",   cmath_atan,  METH_VARARGS, c_atan_doc},\r
+    {"atanh",  cmath_atanh, METH_VARARGS, c_atanh_doc},\r
+    {"cos",    cmath_cos,   METH_VARARGS, c_cos_doc},\r
+    {"cosh",   cmath_cosh,  METH_VARARGS, c_cosh_doc},\r
+    {"exp",    cmath_exp,   METH_VARARGS, c_exp_doc},\r
+    {"isinf",  cmath_isinf, METH_VARARGS, cmath_isinf_doc},\r
+    {"isnan",  cmath_isnan, METH_VARARGS, cmath_isnan_doc},\r
+    {"log",    cmath_log,   METH_VARARGS, cmath_log_doc},\r
+    {"log10",  cmath_log10, METH_VARARGS, c_log10_doc},\r
+    {"phase",  cmath_phase, METH_VARARGS, cmath_phase_doc},\r
+    {"polar",  cmath_polar, METH_VARARGS, cmath_polar_doc},\r
+    {"rect",   cmath_rect,  METH_VARARGS, cmath_rect_doc},\r
+    {"sin",    cmath_sin,   METH_VARARGS, c_sin_doc},\r
+    {"sinh",   cmath_sinh,  METH_VARARGS, c_sinh_doc},\r
+    {"sqrt",   cmath_sqrt,  METH_VARARGS, c_sqrt_doc},\r
+    {"tan",    cmath_tan,   METH_VARARGS, c_tan_doc},\r
+    {"tanh",   cmath_tanh,  METH_VARARGS, c_tanh_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+initcmath(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("cmath", cmath_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    PyModule_AddObject(m, "pi",\r
+                       PyFloat_FromDouble(Py_MATH_PI));\r
+    PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));\r
+\r
+    /* initialize special value tables */\r
+\r
+#define INIT_SPECIAL_VALUES(NAME, BODY) { Py_complex* p = (Py_complex*)NAME; BODY }\r
+#define C(REAL, IMAG) p->real = REAL; p->imag = IMAG; ++p;\r
+\r
+    INIT_SPECIAL_VALUES(acos_special_values, {\r
+      C(P34,INF) C(P,INF)  C(P,INF)  C(P,-INF)  C(P,-INF)  C(P34,-INF) C(N,INF)\r
+      C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)\r
+      C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)\r
+      C(P12,INF) C(U,U)    C(P12,0.) C(P12,-0.) C(U,U)     C(P12,-INF) C(P12,N)\r
+      C(P12,INF) C(U,U)    C(U,U)    C(U,U)     C(U,U)     C(P12,-INF) C(N,N)\r
+      C(P14,INF) C(0.,INF) C(0.,INF) C(0.,-INF) C(0.,-INF) C(P14,-INF) C(N,INF)\r
+      C(N,INF)   C(N,N)    C(N,N)    C(N,N)     C(N,N)     C(N,-INF)   C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(acosh_special_values, {\r
+      C(INF,-P34) C(INF,-P)  C(INF,-P)  C(INF,P)  C(INF,P)  C(INF,P34) C(INF,N)\r
+      C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)\r
+      C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)\r
+      C(INF,-P12) C(U,U)     C(0.,-P12) C(0.,P12) C(U,U)    C(INF,P12) C(N,N)\r
+      C(INF,-P12) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,P12) C(N,N)\r
+      C(INF,-P14) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,P14) C(INF,N)\r
+      C(INF,N)    C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,N)   C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(asinh_special_values, {\r
+      C(-INF,-P14) C(-INF,-0.) C(-INF,-0.) C(-INF,0.) C(-INF,0.) C(-INF,P14) C(-INF,N)\r
+      C(-INF,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-INF,P12) C(N,N)\r
+      C(-INF,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-INF,P12) C(N,N)\r
+      C(INF,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(INF,P12)  C(N,N)\r
+      C(INF,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(INF,P12)  C(N,N)\r
+      C(INF,-P14)  C(INF,-0.)  C(INF,-0.)  C(INF,0.)  C(INF,0.)  C(INF,P14)  C(INF,N)\r
+      C(INF,N)     C(N,N)      C(N,-0.)    C(N,0.)    C(N,N)     C(INF,N)    C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(atanh_special_values, {\r
+      C(-0.,-P12) C(-0.,-P12) C(-0.,-P12) C(-0.,P12) C(-0.,P12) C(-0.,P12) C(-0.,N)\r
+      C(-0.,-P12) C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(-0.,P12) C(N,N)\r
+      C(-0.,-P12) C(U,U)      C(-0.,-0.)  C(-0.,0.)  C(U,U)     C(-0.,P12) C(-0.,N)\r
+      C(0.,-P12)  C(U,U)      C(0.,-0.)   C(0.,0.)   C(U,U)     C(0.,P12)  C(0.,N)\r
+      C(0.,-P12)  C(U,U)      C(U,U)      C(U,U)     C(U,U)     C(0.,P12)  C(N,N)\r
+      C(0.,-P12)  C(0.,-P12)  C(0.,-P12)  C(0.,P12)  C(0.,P12)  C(0.,P12)  C(0.,N)\r
+      C(0.,-P12)  C(N,N)      C(N,N)      C(N,N)     C(N,N)     C(0.,P12)  C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(cosh_special_values, {\r
+      C(INF,N) C(U,U) C(INF,0.)  C(INF,-0.) C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)\r
+      C(N,0.)  C(U,U) C(1.,0.)   C(1.,-0.)  C(U,U) C(N,0.)  C(N,0.)\r
+      C(N,0.)  C(U,U) C(1.,-0.)  C(1.,0.)   C(U,U) C(N,0.)  C(N,0.)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)     C(U,U) C(N,N)   C(N,N)\r
+      C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)  C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(N,N) C(N,0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(exp_special_values, {\r
+      C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(0.,0.) C(0.,0.)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)\r
+      C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)\r
+      C(N,N)   C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(N,N)   C(N,N)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)   C(N,N)\r
+      C(INF,N) C(U,U) C(INF,-0.) C(INF,0.) C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)   C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(log_special_values, {\r
+      C(INF,-P34) C(INF,-P)  C(INF,-P)   C(INF,P)   C(INF,P)  C(INF,P34)  C(INF,N)\r
+      C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)\r
+      C(INF,-P12) C(U,U)     C(-INF,-P)  C(-INF,P)  C(U,U)    C(INF,P12)  C(N,N)\r
+      C(INF,-P12) C(U,U)     C(-INF,-0.) C(-INF,0.) C(U,U)    C(INF,P12)  C(N,N)\r
+      C(INF,-P12) C(U,U)     C(U,U)      C(U,U)     C(U,U)    C(INF,P12)  C(N,N)\r
+      C(INF,-P14) C(INF,-0.) C(INF,-0.)  C(INF,0.)  C(INF,0.) C(INF,P14)  C(INF,N)\r
+      C(INF,N)    C(N,N)     C(N,N)      C(N,N)     C(N,N)    C(INF,N)    C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(sinh_special_values, {\r
+      C(INF,N) C(U,U) C(-INF,-0.) C(-INF,0.) C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)\r
+      C(0.,N)  C(U,U) C(-0.,-0.)  C(-0.,0.)  C(U,U) C(0.,N)  C(0.,N)\r
+      C(0.,N)  C(U,U) C(0.,-0.)   C(0.,0.)   C(U,U) C(0.,N)  C(0.,N)\r
+      C(N,N)   C(U,U) C(U,U)      C(U,U)     C(U,U) C(N,N)   C(N,N)\r
+      C(INF,N) C(U,U) C(INF,-0.)  C(INF,0.)  C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(N,N) C(N,-0.)    C(N,0.)    C(N,N) C(N,N)   C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(sqrt_special_values, {\r
+      C(INF,-INF) C(0.,-INF) C(0.,-INF) C(0.,INF) C(0.,INF) C(INF,INF) C(N,INF)\r
+      C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)\r
+      C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)\r
+      C(INF,-INF) C(U,U)     C(0.,-0.)  C(0.,0.)  C(U,U)    C(INF,INF) C(N,N)\r
+      C(INF,-INF) C(U,U)     C(U,U)     C(U,U)    C(U,U)    C(INF,INF) C(N,N)\r
+      C(INF,-INF) C(INF,-0.) C(INF,-0.) C(INF,0.) C(INF,0.) C(INF,INF) C(INF,N)\r
+      C(INF,-INF) C(N,N)     C(N,N)     C(N,N)    C(N,N)    C(INF,INF) C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(tanh_special_values, {\r
+      C(-1.,0.) C(U,U) C(-1.,-0.) C(-1.,0.) C(U,U) C(-1.,0.) C(-1.,0.)\r
+      C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)\r
+      C(N,N)    C(U,U) C(-0.,-0.) C(-0.,0.) C(U,U) C(N,N)    C(N,N)\r
+      C(N,N)    C(U,U) C(0.,-0.)  C(0.,0.)  C(U,U) C(N,N)    C(N,N)\r
+      C(N,N)    C(U,U) C(U,U)     C(U,U)    C(U,U) C(N,N)    C(N,N)\r
+      C(1.,0.)  C(U,U) C(1.,-0.)  C(1.,0.)  C(U,U) C(1.,0.)  C(1.,0.)\r
+      C(N,N)    C(N,N) C(N,-0.)   C(N,0.)   C(N,N) C(N,N)    C(N,N)\r
+    })\r
+\r
+    INIT_SPECIAL_VALUES(rect_special_values, {\r
+      C(INF,N) C(U,U) C(-INF,0.) C(-INF,-0.) C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)\r
+      C(0.,0.) C(U,U) C(-0.,0.)  C(-0.,-0.)  C(U,U) C(0.,0.) C(0.,0.)\r
+      C(0.,0.) C(U,U) C(0.,-0.)  C(0.,0.)    C(U,U) C(0.,0.) C(0.,0.)\r
+      C(N,N)   C(U,U) C(U,U)     C(U,U)      C(U,U) C(N,N)   C(N,N)\r
+      C(INF,N) C(U,U) C(INF,-0.) C(INF,0.)   C(U,U) C(INF,N) C(INF,N)\r
+      C(N,N)   C(N,N) C(N,0.)    C(N,0.)     C(N,N) C(N,N)   C(N,N)\r
+    })\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/datetimemodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/datetimemodule.c
new file mode 100644 (file)
index 0000000..655f70d
--- /dev/null
@@ -0,0 +1,5117 @@
+/*  C implementation for the date/time type documented at\r
+ *  http://www.zope.org/Members/fdrake/DateTimeWiki/FrontPage\r
+ */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+\r
+#include "Python.h"\r
+#include "modsupport.h"\r
+#include "structmember.h"\r
+\r
+#include <time.h>\r
+\r
+#include "timefuncs.h"\r
+\r
+/* Differentiate between building the core module and building extension\r
+ * modules.\r
+ */\r
+#ifndef Py_BUILD_CORE\r
+#define Py_BUILD_CORE\r
+#endif\r
+#include "datetime.h"\r
+#undef Py_BUILD_CORE\r
+\r
+/* We require that C int be at least 32 bits, and use int virtually\r
+ * everywhere.  In just a few cases we use a temp long, where a Python\r
+ * API returns a C long.  In such cases, we have to ensure that the\r
+ * final result fits in a C int (this can be an issue on 64-bit boxes).\r
+ */\r
+#if SIZEOF_INT < 4\r
+#       error "datetime.c requires that C int have at least 32 bits"\r
+#endif\r
+\r
+#define MINYEAR 1\r
+#define MAXYEAR 9999\r
+#define MAXORDINAL 3652059 /* date(9999,12,31).toordinal() */\r
+\r
+/* Nine decimal digits is easy to communicate, and leaves enough room\r
+ * so that two delta days can be added w/o fear of overflowing a signed\r
+ * 32-bit int, and with plenty of room left over to absorb any possible\r
+ * carries from adding seconds.\r
+ */\r
+#define MAX_DELTA_DAYS 999999999\r
+\r
+/* Rename the long macros in datetime.h to more reasonable short names. */\r
+#define GET_YEAR                PyDateTime_GET_YEAR\r
+#define GET_MONTH               PyDateTime_GET_MONTH\r
+#define GET_DAY                 PyDateTime_GET_DAY\r
+#define DATE_GET_HOUR           PyDateTime_DATE_GET_HOUR\r
+#define DATE_GET_MINUTE         PyDateTime_DATE_GET_MINUTE\r
+#define DATE_GET_SECOND         PyDateTime_DATE_GET_SECOND\r
+#define DATE_GET_MICROSECOND    PyDateTime_DATE_GET_MICROSECOND\r
+\r
+/* Date accessors for date and datetime. */\r
+#define SET_YEAR(o, v)          (((o)->data[0] = ((v) & 0xff00) >> 8), \\r
+                 ((o)->data[1] = ((v) & 0x00ff)))\r
+#define SET_MONTH(o, v)         (PyDateTime_GET_MONTH(o) = (v))\r
+#define SET_DAY(o, v)           (PyDateTime_GET_DAY(o) = (v))\r
+\r
+/* Date/Time accessors for datetime. */\r
+#define DATE_SET_HOUR(o, v)     (PyDateTime_DATE_GET_HOUR(o) = (v))\r
+#define DATE_SET_MINUTE(o, v)   (PyDateTime_DATE_GET_MINUTE(o) = (v))\r
+#define DATE_SET_SECOND(o, v)   (PyDateTime_DATE_GET_SECOND(o) = (v))\r
+#define DATE_SET_MICROSECOND(o, v)      \\r
+    (((o)->data[7] = ((v) & 0xff0000) >> 16), \\r
+     ((o)->data[8] = ((v) & 0x00ff00) >> 8), \\r
+     ((o)->data[9] = ((v) & 0x0000ff)))\r
+\r
+/* Time accessors for time. */\r
+#define TIME_GET_HOUR           PyDateTime_TIME_GET_HOUR\r
+#define TIME_GET_MINUTE         PyDateTime_TIME_GET_MINUTE\r
+#define TIME_GET_SECOND         PyDateTime_TIME_GET_SECOND\r
+#define TIME_GET_MICROSECOND    PyDateTime_TIME_GET_MICROSECOND\r
+#define TIME_SET_HOUR(o, v)     (PyDateTime_TIME_GET_HOUR(o) = (v))\r
+#define TIME_SET_MINUTE(o, v)   (PyDateTime_TIME_GET_MINUTE(o) = (v))\r
+#define TIME_SET_SECOND(o, v)   (PyDateTime_TIME_GET_SECOND(o) = (v))\r
+#define TIME_SET_MICROSECOND(o, v)      \\r
+    (((o)->data[3] = ((v) & 0xff0000) >> 16), \\r
+     ((o)->data[4] = ((v) & 0x00ff00) >> 8), \\r
+     ((o)->data[5] = ((v) & 0x0000ff)))\r
+\r
+/* Delta accessors for timedelta. */\r
+#define GET_TD_DAYS(o)          (((PyDateTime_Delta *)(o))->days)\r
+#define GET_TD_SECONDS(o)       (((PyDateTime_Delta *)(o))->seconds)\r
+#define GET_TD_MICROSECONDS(o)  (((PyDateTime_Delta *)(o))->microseconds)\r
+\r
+#define SET_TD_DAYS(o, v)       ((o)->days = (v))\r
+#define SET_TD_SECONDS(o, v)    ((o)->seconds = (v))\r
+#define SET_TD_MICROSECONDS(o, v) ((o)->microseconds = (v))\r
+\r
+/* p is a pointer to a time or a datetime object; HASTZINFO(p) returns\r
+ * p->hastzinfo.\r
+ */\r
+#define HASTZINFO(p)            (((_PyDateTime_BaseTZInfo *)(p))->hastzinfo)\r
+\r
+/* M is a char or int claiming to be a valid month.  The macro is equivalent\r
+ * to the two-sided Python test\r
+ *      1 <= M <= 12\r
+ */\r
+#define MONTH_IS_SANE(M) ((unsigned int)(M) - 1 < 12)\r
+\r
+/* Forward declarations. */\r
+static PyTypeObject PyDateTime_DateType;\r
+static PyTypeObject PyDateTime_DateTimeType;\r
+static PyTypeObject PyDateTime_DeltaType;\r
+static PyTypeObject PyDateTime_TimeType;\r
+static PyTypeObject PyDateTime_TZInfoType;\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Math utilities.\r
+ */\r
+\r
+/* k = i+j overflows iff k differs in sign from both inputs,\r
+ * iff k^i has sign bit set and k^j has sign bit set,\r
+ * iff (k^i)&(k^j) has sign bit set.\r
+ */\r
+#define SIGNED_ADD_OVERFLOWED(RESULT, I, J) \\r
+    ((((RESULT) ^ (I)) & ((RESULT) ^ (J))) < 0)\r
+\r
+/* Compute Python divmod(x, y), returning the quotient and storing the\r
+ * remainder into *r.  The quotient is the floor of x/y, and that's\r
+ * the real point of this.  C will probably truncate instead (C99\r
+ * requires truncation; C89 left it implementation-defined).\r
+ * Simplification:  we *require* that y > 0 here.  That's appropriate\r
+ * for all the uses made of it.  This simplifies the code and makes\r
+ * the overflow case impossible (divmod(LONG_MIN, -1) is the only\r
+ * overflow case).\r
+ */\r
+static int\r
+divmod(int x, int y, int *r)\r
+{\r
+    int quo;\r
+\r
+    assert(y > 0);\r
+    quo = x / y;\r
+    *r = x - quo * y;\r
+    if (*r < 0) {\r
+        --quo;\r
+        *r += y;\r
+    }\r
+    assert(0 <= *r && *r < y);\r
+    return quo;\r
+}\r
+\r
+/* Round a double to the nearest long.  |x| must be small enough to fit\r
+ * in a C long; this is not checked.\r
+ */\r
+static long\r
+round_to_long(double x)\r
+{\r
+    if (x >= 0.0)\r
+        x = floor(x + 0.5);\r
+    else\r
+        x = ceil(x - 0.5);\r
+    return (long)x;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * General calendrical helper functions\r
+ */\r
+\r
+/* For each month ordinal in 1..12, the number of days in that month,\r
+ * and the number of days before that month in the same year.  These\r
+ * are correct for non-leap years only.\r
+ */\r
+static int _days_in_month[] = {\r
+    0, /* unused; this vector uses 1-based indexing */\r
+    31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31\r
+};\r
+\r
+static int _days_before_month[] = {\r
+    0, /* unused; this vector uses 1-based indexing */\r
+    0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334\r
+};\r
+\r
+/* year -> 1 if leap year, else 0. */\r
+static int\r
+is_leap(int year)\r
+{\r
+    /* Cast year to unsigned.  The result is the same either way, but\r
+     * C can generate faster code for unsigned mod than for signed\r
+     * mod (especially for % 4 -- a good compiler should just grab\r
+     * the last 2 bits when the LHS is unsigned).\r
+     */\r
+    const unsigned int ayear = (unsigned int)year;\r
+    return ayear % 4 == 0 && (ayear % 100 != 0 || ayear % 400 == 0);\r
+}\r
+\r
+/* year, month -> number of days in that month in that year */\r
+static int\r
+days_in_month(int year, int month)\r
+{\r
+    assert(month >= 1);\r
+    assert(month <= 12);\r
+    if (month == 2 && is_leap(year))\r
+        return 29;\r
+    else\r
+        return _days_in_month[month];\r
+}\r
+\r
+/* year, month -> number of days in year preceeding first day of month */\r
+static int\r
+days_before_month(int year, int month)\r
+{\r
+    int days;\r
+\r
+    assert(month >= 1);\r
+    assert(month <= 12);\r
+    days = _days_before_month[month];\r
+    if (month > 2 && is_leap(year))\r
+        ++days;\r
+    return days;\r
+}\r
+\r
+/* year -> number of days before January 1st of year.  Remember that we\r
+ * start with year 1, so days_before_year(1) == 0.\r
+ */\r
+static int\r
+days_before_year(int year)\r
+{\r
+    int y = year - 1;\r
+    /* This is incorrect if year <= 0; we really want the floor\r
+     * here.  But so long as MINYEAR is 1, the smallest year this\r
+     * can see is 0 (this can happen in some normalization endcases),\r
+     * so we'll just special-case that.\r
+     */\r
+    assert (year >= 0);\r
+    if (y >= 0)\r
+        return y*365 + y/4 - y/100 + y/400;\r
+    else {\r
+        assert(y == -1);\r
+        return -366;\r
+    }\r
+}\r
+\r
+/* Number of days in 4, 100, and 400 year cycles.  That these have\r
+ * the correct values is asserted in the module init function.\r
+ */\r
+#define DI4Y    1461    /* days_before_year(5); days in 4 years */\r
+#define DI100Y  36524   /* days_before_year(101); days in 100 years */\r
+#define DI400Y  146097  /* days_before_year(401); days in 400 years  */\r
+\r
+/* ordinal -> year, month, day, considering 01-Jan-0001 as day 1. */\r
+static void\r
+ord_to_ymd(int ordinal, int *year, int *month, int *day)\r
+{\r
+    int n, n1, n4, n100, n400, leapyear, preceding;\r
+\r
+    /* ordinal is a 1-based index, starting at 1-Jan-1.  The pattern of\r
+     * leap years repeats exactly every 400 years.  The basic strategy is\r
+     * to find the closest 400-year boundary at or before ordinal, then\r
+     * work with the offset from that boundary to ordinal.  Life is much\r
+     * clearer if we subtract 1 from ordinal first -- then the values\r
+     * of ordinal at 400-year boundaries are exactly those divisible\r
+     * by DI400Y:\r
+     *\r
+     *    D  M   Y            n              n-1\r
+     *    -- --- ----        ----------     ----------------\r
+     *    31 Dec -400        -DI400Y       -DI400Y -1\r
+     *     1 Jan -399         -DI400Y +1   -DI400Y      400-year boundary\r
+     *    ...\r
+     *    30 Dec  000        -1             -2\r
+     *    31 Dec  000         0             -1\r
+     *     1 Jan  001         1              0          400-year boundary\r
+     *     2 Jan  001         2              1\r
+     *     3 Jan  001         3              2\r
+     *    ...\r
+     *    31 Dec  400         DI400Y        DI400Y -1\r
+     *     1 Jan  401         DI400Y +1     DI400Y      400-year boundary\r
+     */\r
+    assert(ordinal >= 1);\r
+    --ordinal;\r
+    n400 = ordinal / DI400Y;\r
+    n = ordinal % DI400Y;\r
+    *year = n400 * 400 + 1;\r
+\r
+    /* Now n is the (non-negative) offset, in days, from January 1 of\r
+     * year, to the desired date.  Now compute how many 100-year cycles\r
+     * precede n.\r
+     * Note that it's possible for n100 to equal 4!  In that case 4 full\r
+     * 100-year cycles precede the desired day, which implies the\r
+     * desired day is December 31 at the end of a 400-year cycle.\r
+     */\r
+    n100 = n / DI100Y;\r
+    n = n % DI100Y;\r
+\r
+    /* Now compute how many 4-year cycles precede it. */\r
+    n4 = n / DI4Y;\r
+    n = n % DI4Y;\r
+\r
+    /* And now how many single years.  Again n1 can be 4, and again\r
+     * meaning that the desired day is December 31 at the end of the\r
+     * 4-year cycle.\r
+     */\r
+    n1 = n / 365;\r
+    n = n % 365;\r
+\r
+    *year += n100 * 100 + n4 * 4 + n1;\r
+    if (n1 == 4 || n100 == 4) {\r
+        assert(n == 0);\r
+        *year -= 1;\r
+        *month = 12;\r
+        *day = 31;\r
+        return;\r
+    }\r
+\r
+    /* Now the year is correct, and n is the offset from January 1.  We\r
+     * find the month via an estimate that's either exact or one too\r
+     * large.\r
+     */\r
+    leapyear = n1 == 3 && (n4 != 24 || n100 == 3);\r
+    assert(leapyear == is_leap(*year));\r
+    *month = (n + 50) >> 5;\r
+    preceding = (_days_before_month[*month] + (*month > 2 && leapyear));\r
+    if (preceding > n) {\r
+        /* estimate is too large */\r
+        *month -= 1;\r
+        preceding -= days_in_month(*year, *month);\r
+    }\r
+    n -= preceding;\r
+    assert(0 <= n);\r
+    assert(n < days_in_month(*year, *month));\r
+\r
+    *day = n + 1;\r
+}\r
+\r
+/* year, month, day -> ordinal, considering 01-Jan-0001 as day 1. */\r
+static int\r
+ymd_to_ord(int year, int month, int day)\r
+{\r
+    return days_before_year(year) + days_before_month(year, month) + day;\r
+}\r
+\r
+/* Day of week, where Monday==0, ..., Sunday==6.  1/1/1 was a Monday. */\r
+static int\r
+weekday(int year, int month, int day)\r
+{\r
+    return (ymd_to_ord(year, month, day) + 6) % 7;\r
+}\r
+\r
+/* Ordinal of the Monday starting week 1 of the ISO year.  Week 1 is the\r
+ * first calendar week containing a Thursday.\r
+ */\r
+static int\r
+iso_week1_monday(int year)\r
+{\r
+    int first_day = ymd_to_ord(year, 1, 1);     /* ord of 1/1 */\r
+    /* 0 if 1/1 is a Monday, 1 if a Tue, etc. */\r
+    int first_weekday = (first_day + 6) % 7;\r
+    /* ordinal of closest Monday at or before 1/1 */\r
+    int week1_monday  = first_day - first_weekday;\r
+\r
+    if (first_weekday > 3)      /* if 1/1 was Fri, Sat, Sun */\r
+        week1_monday += 7;\r
+    return week1_monday;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Range checkers.\r
+ */\r
+\r
+/* Check that -MAX_DELTA_DAYS <= days <= MAX_DELTA_DAYS.  If so, return 0.\r
+ * If not, raise OverflowError and return -1.\r
+ */\r
+static int\r
+check_delta_day_range(int days)\r
+{\r
+    if (-MAX_DELTA_DAYS <= days && days <= MAX_DELTA_DAYS)\r
+        return 0;\r
+    PyErr_Format(PyExc_OverflowError,\r
+                 "days=%d; must have magnitude <= %d",\r
+                 days, MAX_DELTA_DAYS);\r
+    return -1;\r
+}\r
+\r
+/* Check that date arguments are in range.  Return 0 if they are.  If they\r
+ * aren't, raise ValueError and return -1.\r
+ */\r
+static int\r
+check_date_args(int year, int month, int day)\r
+{\r
+\r
+    if (year < MINYEAR || year > MAXYEAR) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "year is out of range");\r
+        return -1;\r
+    }\r
+    if (month < 1 || month > 12) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "month must be in 1..12");\r
+        return -1;\r
+    }\r
+    if (day < 1 || day > days_in_month(year, month)) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "day is out of range for month");\r
+        return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Check that time arguments are in range.  Return 0 if they are.  If they\r
+ * aren't, raise ValueError and return -1.\r
+ */\r
+static int\r
+check_time_args(int h, int m, int s, int us)\r
+{\r
+    if (h < 0 || h > 23) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "hour must be in 0..23");\r
+        return -1;\r
+    }\r
+    if (m < 0 || m > 59) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "minute must be in 0..59");\r
+        return -1;\r
+    }\r
+    if (s < 0 || s > 59) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "second must be in 0..59");\r
+        return -1;\r
+    }\r
+    if (us < 0 || us > 999999) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "microsecond must be in 0..999999");\r
+        return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Normalization utilities.\r
+ */\r
+\r
+/* One step of a mixed-radix conversion.  A "hi" unit is equivalent to\r
+ * factor "lo" units.  factor must be > 0.  If *lo is less than 0, or\r
+ * at least factor, enough of *lo is converted into "hi" units so that\r
+ * 0 <= *lo < factor.  The input values must be such that int overflow\r
+ * is impossible.\r
+ */\r
+static void\r
+normalize_pair(int *hi, int *lo, int factor)\r
+{\r
+    assert(factor > 0);\r
+    assert(lo != hi);\r
+    if (*lo < 0 || *lo >= factor) {\r
+        const int num_hi = divmod(*lo, factor, lo);\r
+        const int new_hi = *hi + num_hi;\r
+        assert(! SIGNED_ADD_OVERFLOWED(new_hi, *hi, num_hi));\r
+        *hi = new_hi;\r
+    }\r
+    assert(0 <= *lo && *lo < factor);\r
+}\r
+\r
+/* Fiddle days (d), seconds (s), and microseconds (us) so that\r
+ *      0 <= *s < 24*3600\r
+ *      0 <= *us < 1000000\r
+ * The input values must be such that the internals don't overflow.\r
+ * The way this routine is used, we don't get close.\r
+ */\r
+static void\r
+normalize_d_s_us(int *d, int *s, int *us)\r
+{\r
+    if (*us < 0 || *us >= 1000000) {\r
+        normalize_pair(s, us, 1000000);\r
+        /* |s| can't be bigger than about\r
+         * |original s| + |original us|/1000000 now.\r
+         */\r
+\r
+    }\r
+    if (*s < 0 || *s >= 24*3600) {\r
+        normalize_pair(d, s, 24*3600);\r
+        /* |d| can't be bigger than about\r
+         * |original d| +\r
+         * (|original s| + |original us|/1000000) / (24*3600) now.\r
+         */\r
+    }\r
+    assert(0 <= *s && *s < 24*3600);\r
+    assert(0 <= *us && *us < 1000000);\r
+}\r
+\r
+/* Fiddle years (y), months (m), and days (d) so that\r
+ *      1 <= *m <= 12\r
+ *      1 <= *d <= days_in_month(*y, *m)\r
+ * The input values must be such that the internals don't overflow.\r
+ * The way this routine is used, we don't get close.\r
+ */\r
+static int\r
+normalize_y_m_d(int *y, int *m, int *d)\r
+{\r
+    int dim;            /* # of days in month */\r
+\r
+    /* This gets muddy:  the proper range for day can't be determined\r
+     * without knowing the correct month and year, but if day is, e.g.,\r
+     * plus or minus a million, the current month and year values make\r
+     * no sense (and may also be out of bounds themselves).\r
+     * Saying 12 months == 1 year should be non-controversial.\r
+     */\r
+    if (*m < 1 || *m > 12) {\r
+        --*m;\r
+        normalize_pair(y, m, 12);\r
+        ++*m;\r
+        /* |y| can't be bigger than about\r
+         * |original y| + |original m|/12 now.\r
+         */\r
+    }\r
+    assert(1 <= *m && *m <= 12);\r
+\r
+    /* Now only day can be out of bounds (year may also be out of bounds\r
+     * for a datetime object, but we don't care about that here).\r
+     * If day is out of bounds, what to do is arguable, but at least the\r
+     * method here is principled and explainable.\r
+     */\r
+    dim = days_in_month(*y, *m);\r
+    if (*d < 1 || *d > dim) {\r
+        /* Move day-1 days from the first of the month.  First try to\r
+         * get off cheap if we're only one day out of range\r
+         * (adjustments for timezone alone can't be worse than that).\r
+         */\r
+        if (*d == 0) {\r
+            --*m;\r
+            if (*m > 0)\r
+                *d = days_in_month(*y, *m);\r
+            else {\r
+                --*y;\r
+                *m = 12;\r
+                *d = 31;\r
+            }\r
+        }\r
+        else if (*d == dim + 1) {\r
+            /* move forward a day */\r
+            ++*m;\r
+            *d = 1;\r
+            if (*m > 12) {\r
+                *m = 1;\r
+                ++*y;\r
+            }\r
+        }\r
+        else {\r
+            int ordinal = ymd_to_ord(*y, *m, 1) +\r
+                                      *d - 1;\r
+            if (ordinal < 1 || ordinal > MAXORDINAL) {\r
+                goto error;\r
+            } else {\r
+                ord_to_ymd(ordinal, y, m, d);\r
+                return 0;\r
+            }\r
+        }\r
+    }\r
+    assert(*m > 0);\r
+    assert(*d > 0);\r
+    if (MINYEAR <= *y && *y <= MAXYEAR)\r
+        return 0;\r
+ error:\r
+    PyErr_SetString(PyExc_OverflowError,\r
+            "date value out of range");\r
+    return -1;\r
+\r
+}\r
+\r
+/* Fiddle out-of-bounds months and days so that the result makes some kind\r
+ * of sense.  The parameters are both inputs and outputs.  Returns < 0 on\r
+ * failure, where failure means the adjusted year is out of bounds.\r
+ */\r
+static int\r
+normalize_date(int *year, int *month, int *day)\r
+{\r
+    return normalize_y_m_d(year, month, day);\r
+}\r
+\r
+/* Force all the datetime fields into range.  The parameters are both\r
+ * inputs and outputs.  Returns < 0 on error.\r
+ */\r
+static int\r
+normalize_datetime(int *year, int *month, int *day,\r
+                   int *hour, int *minute, int *second,\r
+                   int *microsecond)\r
+{\r
+    normalize_pair(second, microsecond, 1000000);\r
+    normalize_pair(minute, second, 60);\r
+    normalize_pair(hour, minute, 60);\r
+    normalize_pair(day, hour, 24);\r
+    return normalize_date(year, month, day);\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Basic object allocation:  tp_alloc implementations.  These allocate\r
+ * Python objects of the right size and type, and do the Python object-\r
+ * initialization bit.  If there's not enough memory, they return NULL after\r
+ * setting MemoryError.  All data members remain uninitialized trash.\r
+ *\r
+ * We abuse the tp_alloc "nitems" argument to communicate whether a tzinfo\r
+ * member is needed.  This is ugly, imprecise, and possibly insecure.\r
+ * tp_basicsize for the time and datetime types is set to the size of the\r
+ * struct that has room for the tzinfo member, so subclasses in Python will\r
+ * allocate enough space for a tzinfo member whether or not one is actually\r
+ * needed.  That's the "ugly and imprecise" parts.  The "possibly insecure"\r
+ * part is that PyType_GenericAlloc() (which subclasses in Python end up\r
+ * using) just happens today to effectively ignore the nitems argument\r
+ * when tp_itemsize is 0, which it is for these type objects.  If that\r
+ * changes, perhaps the callers of tp_alloc slots in this file should\r
+ * be changed to force a 0 nitems argument unless the type being allocated\r
+ * is a base type implemented in this file (so that tp_alloc is time_alloc\r
+ * or datetime_alloc below, which know about the nitems abuse).\r
+ */\r
+\r
+static PyObject *\r
+time_alloc(PyTypeObject *type, Py_ssize_t aware)\r
+{\r
+    PyObject *self;\r
+\r
+    self = (PyObject *)\r
+        PyObject_MALLOC(aware ?\r
+                        sizeof(PyDateTime_Time) :\r
+                sizeof(_PyDateTime_BaseTime));\r
+    if (self == NULL)\r
+        return (PyObject *)PyErr_NoMemory();\r
+    PyObject_INIT(self, type);\r
+    return self;\r
+}\r
+\r
+static PyObject *\r
+datetime_alloc(PyTypeObject *type, Py_ssize_t aware)\r
+{\r
+    PyObject *self;\r
+\r
+    self = (PyObject *)\r
+        PyObject_MALLOC(aware ?\r
+                        sizeof(PyDateTime_DateTime) :\r
+                sizeof(_PyDateTime_BaseDateTime));\r
+    if (self == NULL)\r
+        return (PyObject *)PyErr_NoMemory();\r
+    PyObject_INIT(self, type);\r
+    return self;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Helpers for setting object fields.  These work on pointers to the\r
+ * appropriate base class.\r
+ */\r
+\r
+/* For date and datetime. */\r
+static void\r
+set_date_fields(PyDateTime_Date *self, int y, int m, int d)\r
+{\r
+    self->hashcode = -1;\r
+    SET_YEAR(self, y);\r
+    SET_MONTH(self, m);\r
+    SET_DAY(self, d);\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Create various objects, mostly without range checking.\r
+ */\r
+\r
+/* Create a date instance with no range checking. */\r
+static PyObject *\r
+new_date_ex(int year, int month, int day, PyTypeObject *type)\r
+{\r
+    PyDateTime_Date *self;\r
+\r
+    self = (PyDateTime_Date *) (type->tp_alloc(type, 0));\r
+    if (self != NULL)\r
+        set_date_fields(self, year, month, day);\r
+    return (PyObject *) self;\r
+}\r
+\r
+#define new_date(year, month, day) \\r
+    new_date_ex(year, month, day, &PyDateTime_DateType)\r
+\r
+/* Create a datetime instance with no range checking. */\r
+static PyObject *\r
+new_datetime_ex(int year, int month, int day, int hour, int minute,\r
+             int second, int usecond, PyObject *tzinfo, PyTypeObject *type)\r
+{\r
+    PyDateTime_DateTime *self;\r
+    char aware = tzinfo != Py_None;\r
+\r
+    self = (PyDateTime_DateTime *) (type->tp_alloc(type, aware));\r
+    if (self != NULL) {\r
+        self->hastzinfo = aware;\r
+        set_date_fields((PyDateTime_Date *)self, year, month, day);\r
+        DATE_SET_HOUR(self, hour);\r
+        DATE_SET_MINUTE(self, minute);\r
+        DATE_SET_SECOND(self, second);\r
+        DATE_SET_MICROSECOND(self, usecond);\r
+        if (aware) {\r
+            Py_INCREF(tzinfo);\r
+            self->tzinfo = tzinfo;\r
+        }\r
+    }\r
+    return (PyObject *)self;\r
+}\r
+\r
+#define new_datetime(y, m, d, hh, mm, ss, us, tzinfo)           \\r
+    new_datetime_ex(y, m, d, hh, mm, ss, us, tzinfo,            \\r
+                    &PyDateTime_DateTimeType)\r
+\r
+/* Create a time instance with no range checking. */\r
+static PyObject *\r
+new_time_ex(int hour, int minute, int second, int usecond,\r
+            PyObject *tzinfo, PyTypeObject *type)\r
+{\r
+    PyDateTime_Time *self;\r
+    char aware = tzinfo != Py_None;\r
+\r
+    self = (PyDateTime_Time *) (type->tp_alloc(type, aware));\r
+    if (self != NULL) {\r
+        self->hastzinfo = aware;\r
+        self->hashcode = -1;\r
+        TIME_SET_HOUR(self, hour);\r
+        TIME_SET_MINUTE(self, minute);\r
+        TIME_SET_SECOND(self, second);\r
+        TIME_SET_MICROSECOND(self, usecond);\r
+        if (aware) {\r
+            Py_INCREF(tzinfo);\r
+            self->tzinfo = tzinfo;\r
+        }\r
+    }\r
+    return (PyObject *)self;\r
+}\r
+\r
+#define new_time(hh, mm, ss, us, tzinfo)                \\r
+    new_time_ex(hh, mm, ss, us, tzinfo, &PyDateTime_TimeType)\r
+\r
+/* Create a timedelta instance.  Normalize the members iff normalize is\r
+ * true.  Passing false is a speed optimization, if you know for sure\r
+ * that seconds and microseconds are already in their proper ranges.  In any\r
+ * case, raises OverflowError and returns NULL if the normalized days is out\r
+ * of range).\r
+ */\r
+static PyObject *\r
+new_delta_ex(int days, int seconds, int microseconds, int normalize,\r
+             PyTypeObject *type)\r
+{\r
+    PyDateTime_Delta *self;\r
+\r
+    if (normalize)\r
+        normalize_d_s_us(&days, &seconds, &microseconds);\r
+    assert(0 <= seconds && seconds < 24*3600);\r
+    assert(0 <= microseconds && microseconds < 1000000);\r
+\r
+    if (check_delta_day_range(days) < 0)\r
+        return NULL;\r
+\r
+    self = (PyDateTime_Delta *) (type->tp_alloc(type, 0));\r
+    if (self != NULL) {\r
+        self->hashcode = -1;\r
+        SET_TD_DAYS(self, days);\r
+        SET_TD_SECONDS(self, seconds);\r
+        SET_TD_MICROSECONDS(self, microseconds);\r
+    }\r
+    return (PyObject *) self;\r
+}\r
+\r
+#define new_delta(d, s, us, normalize)  \\r
+    new_delta_ex(d, s, us, normalize, &PyDateTime_DeltaType)\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * tzinfo helpers.\r
+ */\r
+\r
+/* Ensure that p is None or of a tzinfo subclass.  Return 0 if OK; if not\r
+ * raise TypeError and return -1.\r
+ */\r
+static int\r
+check_tzinfo_subclass(PyObject *p)\r
+{\r
+    if (p == Py_None || PyTZInfo_Check(p))\r
+        return 0;\r
+    PyErr_Format(PyExc_TypeError,\r
+                 "tzinfo argument must be None or of a tzinfo subclass, "\r
+                 "not type '%s'",\r
+                 Py_TYPE(p)->tp_name);\r
+    return -1;\r
+}\r
+\r
+/* Return tzinfo.methname(tzinfoarg), without any checking of results.\r
+ * If tzinfo is None, returns None.\r
+ */\r
+static PyObject *\r
+call_tzinfo_method(PyObject *tzinfo, char *methname, PyObject *tzinfoarg)\r
+{\r
+    PyObject *result;\r
+\r
+    assert(tzinfo && methname && tzinfoarg);\r
+    assert(check_tzinfo_subclass(tzinfo) >= 0);\r
+    if (tzinfo == Py_None) {\r
+        result = Py_None;\r
+        Py_INCREF(result);\r
+    }\r
+    else\r
+        result = PyObject_CallMethod(tzinfo, methname, "O", tzinfoarg);\r
+    return result;\r
+}\r
+\r
+/* If self has a tzinfo member, return a BORROWED reference to it.  Else\r
+ * return NULL, which is NOT AN ERROR.  There are no error returns here,\r
+ * and the caller must not decref the result.\r
+ */\r
+static PyObject *\r
+get_tzinfo_member(PyObject *self)\r
+{\r
+    PyObject *tzinfo = NULL;\r
+\r
+    if (PyDateTime_Check(self) && HASTZINFO(self))\r
+        tzinfo = ((PyDateTime_DateTime *)self)->tzinfo;\r
+    else if (PyTime_Check(self) && HASTZINFO(self))\r
+        tzinfo = ((PyDateTime_Time *)self)->tzinfo;\r
+\r
+    return tzinfo;\r
+}\r
+\r
+/* Call getattr(tzinfo, name)(tzinfoarg), and extract an int from the\r
+ * result.  tzinfo must be an instance of the tzinfo class.  If the method\r
+ * returns None, this returns 0 and sets *none to 1.  If the method doesn't\r
+ * return None or timedelta, TypeError is raised and this returns -1.  If it\r
+ * returnsa timedelta and the value is out of range or isn't a whole number\r
+ * of minutes, ValueError is raised and this returns -1.\r
+ * Else *none is set to 0 and the integer method result is returned.\r
+ */\r
+static int\r
+call_utc_tzinfo_method(PyObject *tzinfo, char *name, PyObject *tzinfoarg,\r
+                       int *none)\r
+{\r
+    PyObject *u;\r
+    int result = -1;\r
+\r
+    assert(tzinfo != NULL);\r
+    assert(PyTZInfo_Check(tzinfo));\r
+    assert(tzinfoarg != NULL);\r
+\r
+    *none = 0;\r
+    u = call_tzinfo_method(tzinfo, name, tzinfoarg);\r
+    if (u == NULL)\r
+        return -1;\r
+\r
+    else if (u == Py_None) {\r
+        result = 0;\r
+        *none = 1;\r
+    }\r
+    else if (PyDelta_Check(u)) {\r
+        const int days = GET_TD_DAYS(u);\r
+        if (days < -1 || days > 0)\r
+            result = 24*60;             /* trigger ValueError below */\r
+        else {\r
+            /* next line can't overflow because we know days\r
+             * is -1 or 0 now\r
+             */\r
+            int ss = days * 24 * 3600 + GET_TD_SECONDS(u);\r
+            result = divmod(ss, 60, &ss);\r
+            if (ss || GET_TD_MICROSECONDS(u)) {\r
+                PyErr_Format(PyExc_ValueError,\r
+                             "tzinfo.%s() must return a "\r
+                             "whole number of minutes",\r
+                             name);\r
+                result = -1;\r
+            }\r
+        }\r
+    }\r
+    else {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "tzinfo.%s() must return None or "\r
+                     "timedelta, not '%s'",\r
+                     name, Py_TYPE(u)->tp_name);\r
+    }\r
+\r
+    Py_DECREF(u);\r
+    if (result < -1439 || result > 1439) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "tzinfo.%s() returned %d; must be in "\r
+                     "-1439 .. 1439",\r
+                     name, result);\r
+        result = -1;\r
+    }\r
+    return result;\r
+}\r
+\r
+/* Call tzinfo.utcoffset(tzinfoarg), and extract an integer from the\r
+ * result.  tzinfo must be an instance of the tzinfo class.  If utcoffset()\r
+ * returns None, call_utcoffset returns 0 and sets *none to 1.  If uctoffset()\r
+ * doesn't return None or timedelta, TypeError is raised and this returns -1.\r
+ * If utcoffset() returns an invalid timedelta (out of range, or not a whole\r
+ * # of minutes), ValueError is raised and this returns -1.  Else *none is\r
+ * set to 0 and the offset is returned (as int # of minutes east of UTC).\r
+ */\r
+static int\r
+call_utcoffset(PyObject *tzinfo, PyObject *tzinfoarg, int *none)\r
+{\r
+    return call_utc_tzinfo_method(tzinfo, "utcoffset", tzinfoarg, none);\r
+}\r
+\r
+/* Call tzinfo.name(tzinfoarg), and return the offset as a timedelta or None.\r
+ */\r
+static PyObject *\r
+offset_as_timedelta(PyObject *tzinfo, char *name, PyObject *tzinfoarg) {\r
+    PyObject *result;\r
+\r
+    assert(tzinfo && name && tzinfoarg);\r
+    if (tzinfo == Py_None) {\r
+        result = Py_None;\r
+        Py_INCREF(result);\r
+    }\r
+    else {\r
+        int none;\r
+        int offset = call_utc_tzinfo_method(tzinfo, name, tzinfoarg,\r
+                                            &none);\r
+        if (offset < 0 && PyErr_Occurred())\r
+            return NULL;\r
+        if (none) {\r
+            result = Py_None;\r
+            Py_INCREF(result);\r
+        }\r
+        else\r
+            result = new_delta(0, offset * 60, 0, 1);\r
+    }\r
+    return result;\r
+}\r
+\r
+/* Call tzinfo.dst(tzinfoarg), and extract an integer from the\r
+ * result.  tzinfo must be an instance of the tzinfo class.  If dst()\r
+ * returns None, call_dst returns 0 and sets *none to 1.  If dst()\r
+ & doesn't return None or timedelta, TypeError is raised and this\r
+ * returns -1.  If dst() returns an invalid timedelta for a UTC offset,\r
+ * ValueError is raised and this returns -1.  Else *none is set to 0 and\r
+ * the offset is returned (as an int # of minutes east of UTC).\r
+ */\r
+static int\r
+call_dst(PyObject *tzinfo, PyObject *tzinfoarg, int *none)\r
+{\r
+    return call_utc_tzinfo_method(tzinfo, "dst", tzinfoarg, none);\r
+}\r
+\r
+/* Call tzinfo.tzname(tzinfoarg), and return the result.  tzinfo must be\r
+ * an instance of the tzinfo class or None.  If tzinfo isn't None, and\r
+ * tzname() doesn't return None or a string, TypeError is raised and this\r
+ * returns NULL.\r
+ */\r
+static PyObject *\r
+call_tzname(PyObject *tzinfo, PyObject *tzinfoarg)\r
+{\r
+    PyObject *result;\r
+\r
+    assert(tzinfo != NULL);\r
+    assert(check_tzinfo_subclass(tzinfo) >= 0);\r
+    assert(tzinfoarg != NULL);\r
+\r
+    if (tzinfo == Py_None) {\r
+        result = Py_None;\r
+        Py_INCREF(result);\r
+    }\r
+    else\r
+        result = PyObject_CallMethod(tzinfo, "tzname", "O", tzinfoarg);\r
+\r
+    if (result != NULL && result != Py_None && ! PyString_Check(result)) {\r
+        PyErr_Format(PyExc_TypeError, "tzinfo.tzname() must "\r
+                     "return None or a string, not '%s'",\r
+                     Py_TYPE(result)->tp_name);\r
+        Py_DECREF(result);\r
+        result = NULL;\r
+    }\r
+    return result;\r
+}\r
+\r
+typedef enum {\r
+              /* an exception has been set; the caller should pass it on */\r
+          OFFSET_ERROR,\r
+\r
+          /* type isn't date, datetime, or time subclass */\r
+          OFFSET_UNKNOWN,\r
+\r
+          /* date,\r
+           * datetime with !hastzinfo\r
+           * datetime with None tzinfo,\r
+           * datetime where utcoffset() returns None\r
+           * time with !hastzinfo\r
+           * time with None tzinfo,\r
+           * time where utcoffset() returns None\r
+           */\r
+          OFFSET_NAIVE,\r
+\r
+          /* time or datetime where utcoffset() doesn't return None */\r
+          OFFSET_AWARE\r
+} naivety;\r
+\r
+/* Classify an object as to whether it's naive or offset-aware.  See\r
+ * the "naivety" typedef for details.  If the type is aware, *offset is set\r
+ * to minutes east of UTC (as returned by the tzinfo.utcoffset() method).\r
+ * If the type is offset-naive (or unknown, or error), *offset is set to 0.\r
+ * tzinfoarg is the argument to pass to the tzinfo.utcoffset() method.\r
+ */\r
+static naivety\r
+classify_utcoffset(PyObject *op, PyObject *tzinfoarg, int *offset)\r
+{\r
+    int none;\r
+    PyObject *tzinfo;\r
+\r
+    assert(tzinfoarg != NULL);\r
+    *offset = 0;\r
+    tzinfo = get_tzinfo_member(op);     /* NULL means no tzinfo, not error */\r
+    if (tzinfo == Py_None)\r
+        return OFFSET_NAIVE;\r
+    if (tzinfo == NULL) {\r
+        /* note that a datetime passes the PyDate_Check test */\r
+        return (PyTime_Check(op) || PyDate_Check(op)) ?\r
+               OFFSET_NAIVE : OFFSET_UNKNOWN;\r
+    }\r
+    *offset = call_utcoffset(tzinfo, tzinfoarg, &none);\r
+    if (*offset == -1 && PyErr_Occurred())\r
+        return OFFSET_ERROR;\r
+    return none ? OFFSET_NAIVE : OFFSET_AWARE;\r
+}\r
+\r
+/* Classify two objects as to whether they're naive or offset-aware.\r
+ * This isn't quite the same as calling classify_utcoffset() twice:  for\r
+ * binary operations (comparison and subtraction), we generally want to\r
+ * ignore the tzinfo members if they're identical.  This is by design,\r
+ * so that results match "naive" expectations when mixing objects from a\r
+ * single timezone.  So in that case, this sets both offsets to 0 and\r
+ * both naiveties to OFFSET_NAIVE.\r
+ * The function returns 0 if everything's OK, and -1 on error.\r
+ */\r
+static int\r
+classify_two_utcoffsets(PyObject *o1, int *offset1, naivety *n1,\r
+                        PyObject *tzinfoarg1,\r
+                        PyObject *o2, int *offset2, naivety *n2,\r
+                        PyObject *tzinfoarg2)\r
+{\r
+    if (get_tzinfo_member(o1) == get_tzinfo_member(o2)) {\r
+        *offset1 = *offset2 = 0;\r
+        *n1 = *n2 = OFFSET_NAIVE;\r
+    }\r
+    else {\r
+        *n1 = classify_utcoffset(o1, tzinfoarg1, offset1);\r
+        if (*n1 == OFFSET_ERROR)\r
+            return -1;\r
+        *n2 = classify_utcoffset(o2, tzinfoarg2, offset2);\r
+        if (*n2 == OFFSET_ERROR)\r
+            return -1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* repr is like "someclass(arg1, arg2)".  If tzinfo isn't None,\r
+ * stuff\r
+ *     ", tzinfo=" + repr(tzinfo)\r
+ * before the closing ")".\r
+ */\r
+static PyObject *\r
+append_keyword_tzinfo(PyObject *repr, PyObject *tzinfo)\r
+{\r
+    PyObject *temp;\r
+\r
+    assert(PyString_Check(repr));\r
+    assert(tzinfo);\r
+    if (tzinfo == Py_None)\r
+        return repr;\r
+    /* Get rid of the trailing ')'. */\r
+    assert(PyString_AsString(repr)[PyString_Size(repr)-1] == ')');\r
+    temp = PyString_FromStringAndSize(PyString_AsString(repr),\r
+                                      PyString_Size(repr) - 1);\r
+    Py_DECREF(repr);\r
+    if (temp == NULL)\r
+        return NULL;\r
+    repr = temp;\r
+\r
+    /* Append ", tzinfo=". */\r
+    PyString_ConcatAndDel(&repr, PyString_FromString(", tzinfo="));\r
+\r
+    /* Append repr(tzinfo). */\r
+    PyString_ConcatAndDel(&repr, PyObject_Repr(tzinfo));\r
+\r
+    /* Add a closing paren. */\r
+    PyString_ConcatAndDel(&repr, PyString_FromString(")"));\r
+    return repr;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * String format helpers.\r
+ */\r
+\r
+static PyObject *\r
+format_ctime(PyDateTime_Date *date, int hours, int minutes, int seconds)\r
+{\r
+    static const char *DayNames[] = {\r
+        "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"\r
+    };\r
+    static const char *MonthNames[] = {\r
+        "Jan", "Feb", "Mar", "Apr", "May", "Jun",\r
+        "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"\r
+    };\r
+\r
+    char buffer[128];\r
+    int wday = weekday(GET_YEAR(date), GET_MONTH(date), GET_DAY(date));\r
+\r
+    PyOS_snprintf(buffer, sizeof(buffer), "%s %s %2d %02d:%02d:%02d %04d",\r
+                  DayNames[wday], MonthNames[GET_MONTH(date) - 1],\r
+                  GET_DAY(date), hours, minutes, seconds,\r
+                  GET_YEAR(date));\r
+    return PyString_FromString(buffer);\r
+}\r
+\r
+/* Add an hours & minutes UTC offset string to buf.  buf has no more than\r
+ * buflen bytes remaining.  The UTC offset is gotten by calling\r
+ * tzinfo.uctoffset(tzinfoarg).  If that returns None, \0 is stored into\r
+ * *buf, and that's all.  Else the returned value is checked for sanity (an\r
+ * integer in range), and if that's OK it's converted to an hours & minutes\r
+ * string of the form\r
+ *   sign HH sep MM\r
+ * Returns 0 if everything is OK.  If the return value from utcoffset() is\r
+ * bogus, an appropriate exception is set and -1 is returned.\r
+ */\r
+static int\r
+format_utcoffset(char *buf, size_t buflen, const char *sep,\r
+                PyObject *tzinfo, PyObject *tzinfoarg)\r
+{\r
+    int offset;\r
+    int hours;\r
+    int minutes;\r
+    char sign;\r
+    int none;\r
+\r
+    assert(buflen >= 1);\r
+\r
+    offset = call_utcoffset(tzinfo, tzinfoarg, &none);\r
+    if (offset == -1 && PyErr_Occurred())\r
+        return -1;\r
+    if (none) {\r
+        *buf = '\0';\r
+        return 0;\r
+    }\r
+    sign = '+';\r
+    if (offset < 0) {\r
+        sign = '-';\r
+        offset = - offset;\r
+    }\r
+    hours = divmod(offset, 60, &minutes);\r
+    PyOS_snprintf(buf, buflen, "%c%02d%s%02d", sign, hours, sep, minutes);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+make_freplacement(PyObject *object)\r
+{\r
+    char freplacement[64];\r
+    if (PyTime_Check(object))\r
+        sprintf(freplacement, "%06d", TIME_GET_MICROSECOND(object));\r
+    else if (PyDateTime_Check(object))\r
+        sprintf(freplacement, "%06d", DATE_GET_MICROSECOND(object));\r
+    else\r
+        sprintf(freplacement, "%06d", 0);\r
+\r
+    return PyString_FromStringAndSize(freplacement, strlen(freplacement));\r
+}\r
+\r
+/* I sure don't want to reproduce the strftime code from the time module,\r
+ * so this imports the module and calls it.  All the hair is due to\r
+ * giving special meanings to the %z, %Z and %f format codes via a\r
+ * preprocessing step on the format string.\r
+ * tzinfoarg is the argument to pass to the object's tzinfo method, if\r
+ * needed.\r
+ */\r
+static PyObject *\r
+wrap_strftime(PyObject *object, const char *format, size_t format_len,\r
+                PyObject *timetuple, PyObject *tzinfoarg)\r
+{\r
+    PyObject *result = NULL;            /* guilty until proved innocent */\r
+\r
+    PyObject *zreplacement = NULL;      /* py string, replacement for %z */\r
+    PyObject *Zreplacement = NULL;      /* py string, replacement for %Z */\r
+    PyObject *freplacement = NULL;      /* py string, replacement for %f */\r
+\r
+    const char *pin;            /* pointer to next char in input format */\r
+    char ch;                    /* next char in input format */\r
+\r
+    PyObject *newfmt = NULL;            /* py string, the output format */\r
+    char *pnew;         /* pointer to available byte in output format */\r
+    size_t totalnew;            /* number bytes total in output format buffer,\r
+                               exclusive of trailing \0 */\r
+    size_t usednew;     /* number bytes used so far in output format buffer */\r
+\r
+    const char *ptoappend;      /* ptr to string to append to output buffer */\r
+    size_t ntoappend;           /* # of bytes to append to output buffer */\r
+\r
+    assert(object && format && timetuple);\r
+\r
+    /* Give up if the year is before 1900.\r
+     * Python strftime() plays games with the year, and different\r
+     * games depending on whether envar PYTHON2K is set.  This makes\r
+     * years before 1900 a nightmare, even if the platform strftime\r
+     * supports them (and not all do).\r
+     * We could get a lot farther here by avoiding Python's strftime\r
+     * wrapper and calling the C strftime() directly, but that isn't\r
+     * an option in the Python implementation of this module.\r
+     */\r
+    {\r
+        long year;\r
+        PyObject *pyyear = PySequence_GetItem(timetuple, 0);\r
+        if (pyyear == NULL) return NULL;\r
+        assert(PyInt_Check(pyyear));\r
+        year = PyInt_AsLong(pyyear);\r
+        Py_DECREF(pyyear);\r
+        if (year < 1900) {\r
+            PyErr_Format(PyExc_ValueError, "year=%ld is before "\r
+                         "1900; the datetime strftime() "\r
+                         "methods require year >= 1900",\r
+                         year);\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    /* Scan the input format, looking for %z/%Z/%f escapes, building\r
+     * a new format.  Since computing the replacements for those codes\r
+     * is expensive, don't unless they're actually used.\r
+     */\r
+    if (format_len > INT_MAX - 1) {\r
+        PyErr_NoMemory();\r
+        goto Done;\r
+    }\r
+\r
+    totalnew = format_len + 1;          /* realistic if no %z/%Z/%f */\r
+    newfmt = PyString_FromStringAndSize(NULL, totalnew);\r
+    if (newfmt == NULL) goto Done;\r
+    pnew = PyString_AsString(newfmt);\r
+    usednew = 0;\r
+\r
+    pin = format;\r
+    while ((ch = *pin++) != '\0') {\r
+        if (ch != '%') {\r
+            ptoappend = pin - 1;\r
+            ntoappend = 1;\r
+        }\r
+        else if ((ch = *pin++) == '\0') {\r
+            /* There's a lone trailing %; doesn't make sense. */\r
+            PyErr_SetString(PyExc_ValueError, "strftime format "\r
+                            "ends with raw %");\r
+            goto Done;\r
+        }\r
+        /* A % has been seen and ch is the character after it. */\r
+        else if (ch == 'z') {\r
+            if (zreplacement == NULL) {\r
+                /* format utcoffset */\r
+                char buf[100];\r
+                PyObject *tzinfo = get_tzinfo_member(object);\r
+                zreplacement = PyString_FromString("");\r
+                if (zreplacement == NULL) goto Done;\r
+                if (tzinfo != Py_None && tzinfo != NULL) {\r
+                    assert(tzinfoarg != NULL);\r
+                    if (format_utcoffset(buf,\r
+                                         sizeof(buf),\r
+                                         "",\r
+                                         tzinfo,\r
+                                         tzinfoarg) < 0)\r
+                        goto Done;\r
+                    Py_DECREF(zreplacement);\r
+                    zreplacement = PyString_FromString(buf);\r
+                    if (zreplacement == NULL) goto Done;\r
+                }\r
+            }\r
+            assert(zreplacement != NULL);\r
+            ptoappend = PyString_AS_STRING(zreplacement);\r
+            ntoappend = PyString_GET_SIZE(zreplacement);\r
+        }\r
+        else if (ch == 'Z') {\r
+            /* format tzname */\r
+            if (Zreplacement == NULL) {\r
+                PyObject *tzinfo = get_tzinfo_member(object);\r
+                Zreplacement = PyString_FromString("");\r
+                if (Zreplacement == NULL) goto Done;\r
+                if (tzinfo != Py_None && tzinfo != NULL) {\r
+                    PyObject *temp;\r
+                    assert(tzinfoarg != NULL);\r
+                    temp = call_tzname(tzinfo, tzinfoarg);\r
+                    if (temp == NULL) goto Done;\r
+                    if (temp != Py_None) {\r
+                        assert(PyString_Check(temp));\r
+                        /* Since the tzname is getting\r
+                         * stuffed into the format, we\r
+                         * have to double any % signs\r
+                         * so that strftime doesn't\r
+                         * treat them as format codes.\r
+                         */\r
+                        Py_DECREF(Zreplacement);\r
+                        Zreplacement = PyObject_CallMethod(\r
+                            temp, "replace",\r
+                            "ss", "%", "%%");\r
+                        Py_DECREF(temp);\r
+                        if (Zreplacement == NULL)\r
+                            goto Done;\r
+                        if (!PyString_Check(Zreplacement)) {\r
+                            PyErr_SetString(PyExc_TypeError, "tzname.replace() did not return a string");\r
+                            goto Done;\r
+                        }\r
+                    }\r
+                    else\r
+                        Py_DECREF(temp);\r
+                }\r
+            }\r
+            assert(Zreplacement != NULL);\r
+            ptoappend = PyString_AS_STRING(Zreplacement);\r
+            ntoappend = PyString_GET_SIZE(Zreplacement);\r
+        }\r
+        else if (ch == 'f') {\r
+            /* format microseconds */\r
+            if (freplacement == NULL) {\r
+                freplacement = make_freplacement(object);\r
+                if (freplacement == NULL)\r
+                    goto Done;\r
+            }\r
+            assert(freplacement != NULL);\r
+            assert(PyString_Check(freplacement));\r
+            ptoappend = PyString_AS_STRING(freplacement);\r
+            ntoappend = PyString_GET_SIZE(freplacement);\r
+        }\r
+        else {\r
+            /* percent followed by neither z nor Z */\r
+            ptoappend = pin - 2;\r
+            ntoappend = 2;\r
+        }\r
+\r
+        /* Append the ntoappend chars starting at ptoappend to\r
+         * the new format.\r
+         */\r
+        assert(ptoappend != NULL);\r
+        assert(ntoappend >= 0);\r
+        if (ntoappend == 0)\r
+            continue;\r
+        while (usednew + ntoappend > totalnew) {\r
+            size_t bigger = totalnew << 1;\r
+            if ((bigger >> 1) != totalnew) { /* overflow */\r
+                PyErr_NoMemory();\r
+                goto Done;\r
+            }\r
+            if (_PyString_Resize(&newfmt, bigger) < 0)\r
+                goto Done;\r
+            totalnew = bigger;\r
+            pnew = PyString_AsString(newfmt) + usednew;\r
+        }\r
+        memcpy(pnew, ptoappend, ntoappend);\r
+        pnew += ntoappend;\r
+        usednew += ntoappend;\r
+        assert(usednew <= totalnew);\r
+    }  /* end while() */\r
+\r
+    if (_PyString_Resize(&newfmt, usednew) < 0)\r
+        goto Done;\r
+    {\r
+        PyObject *time = PyImport_ImportModuleNoBlock("time");\r
+        if (time == NULL)\r
+            goto Done;\r
+        result = PyObject_CallMethod(time, "strftime", "OO",\r
+                                     newfmt, timetuple);\r
+        Py_DECREF(time);\r
+    }\r
+ Done:\r
+    Py_XDECREF(freplacement);\r
+    Py_XDECREF(zreplacement);\r
+    Py_XDECREF(Zreplacement);\r
+    Py_XDECREF(newfmt);\r
+    return result;\r
+}\r
+\r
+static char *\r
+isoformat_date(PyDateTime_Date *dt, char buffer[], int bufflen)\r
+{\r
+    int x;\r
+    x = PyOS_snprintf(buffer, bufflen,\r
+                      "%04d-%02d-%02d",\r
+                      GET_YEAR(dt), GET_MONTH(dt), GET_DAY(dt));\r
+    assert(bufflen >= x);\r
+    return buffer + x;\r
+}\r
+\r
+static char *\r
+isoformat_time(PyDateTime_DateTime *dt, char buffer[], int bufflen)\r
+{\r
+    int x;\r
+    int us = DATE_GET_MICROSECOND(dt);\r
+\r
+    x = PyOS_snprintf(buffer, bufflen,\r
+                      "%02d:%02d:%02d",\r
+                      DATE_GET_HOUR(dt),\r
+                      DATE_GET_MINUTE(dt),\r
+                      DATE_GET_SECOND(dt));\r
+    assert(bufflen >= x);\r
+    if (us)\r
+        x += PyOS_snprintf(buffer + x, bufflen - x, ".%06d", us);\r
+    assert(bufflen >= x);\r
+    return buffer + x;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Wrap functions from the time module.  These aren't directly available\r
+ * from C.  Perhaps they should be.\r
+ */\r
+\r
+/* Call time.time() and return its result (a Python float). */\r
+static PyObject *\r
+time_time(void)\r
+{\r
+    PyObject *result = NULL;\r
+    PyObject *time = PyImport_ImportModuleNoBlock("time");\r
+\r
+    if (time != NULL) {\r
+        result = PyObject_CallMethod(time, "time", "()");\r
+        Py_DECREF(time);\r
+    }\r
+    return result;\r
+}\r
+\r
+/* Build a time.struct_time.  The weekday and day number are automatically\r
+ * computed from the y,m,d args.\r
+ */\r
+static PyObject *\r
+build_struct_time(int y, int m, int d, int hh, int mm, int ss, int dstflag)\r
+{\r
+    PyObject *time;\r
+    PyObject *result = NULL;\r
+\r
+    time = PyImport_ImportModuleNoBlock("time");\r
+    if (time != NULL) {\r
+        result = PyObject_CallMethod(time, "struct_time",\r
+                                     "((iiiiiiiii))",\r
+                                     y, m, d,\r
+                                     hh, mm, ss,\r
+                                     weekday(y, m, d),\r
+                                     days_before_month(y, m) + d,\r
+                                     dstflag);\r
+        Py_DECREF(time);\r
+    }\r
+    return result;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Miscellaneous helpers.\r
+ */\r
+\r
+/* For obscure reasons, we need to use tp_richcompare instead of tp_compare.\r
+ * The comparisons here all most naturally compute a cmp()-like result.\r
+ * This little helper turns that into a bool result for rich comparisons.\r
+ */\r
+static PyObject *\r
+diff_to_bool(int diff, int op)\r
+{\r
+    PyObject *result;\r
+    int istrue;\r
+\r
+    switch (op) {\r
+        case Py_EQ: istrue = diff == 0; break;\r
+        case Py_NE: istrue = diff != 0; break;\r
+        case Py_LE: istrue = diff <= 0; break;\r
+        case Py_GE: istrue = diff >= 0; break;\r
+        case Py_LT: istrue = diff < 0; break;\r
+        case Py_GT: istrue = diff > 0; break;\r
+        default:\r
+            assert(! "op unknown");\r
+            istrue = 0; /* To shut up compiler */\r
+    }\r
+    result = istrue ? Py_True : Py_False;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+/* Raises a "can't compare" TypeError and returns NULL. */\r
+static PyObject *\r
+cmperror(PyObject *a, PyObject *b)\r
+{\r
+    PyErr_Format(PyExc_TypeError,\r
+                 "can't compare %s to %s",\r
+                 Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);\r
+    return NULL;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Cached Python objects; these are set by the module init function.\r
+ */\r
+\r
+/* Conversion factors. */\r
+static PyObject *us_per_us = NULL;      /* 1 */\r
+static PyObject *us_per_ms = NULL;      /* 1000 */\r
+static PyObject *us_per_second = NULL;  /* 1000000 */\r
+static PyObject *us_per_minute = NULL;  /* 1e6 * 60 as Python int */\r
+static PyObject *us_per_hour = NULL;    /* 1e6 * 3600 as Python long */\r
+static PyObject *us_per_day = NULL;     /* 1e6 * 3600 * 24 as Python long */\r
+static PyObject *us_per_week = NULL;    /* 1e6*3600*24*7 as Python long */\r
+static PyObject *seconds_per_day = NULL; /* 3600*24 as Python int */\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Class implementations.\r
+ */\r
+\r
+/*\r
+ * PyDateTime_Delta implementation.\r
+ */\r
+\r
+/* Convert a timedelta to a number of us,\r
+ *      (24*3600*self.days + self.seconds)*1000000 + self.microseconds\r
+ * as a Python int or long.\r
+ * Doing mixed-radix arithmetic by hand instead is excruciating in C,\r
+ * due to ubiquitous overflow possibilities.\r
+ */\r
+static PyObject *\r
+delta_to_microseconds(PyDateTime_Delta *self)\r
+{\r
+    PyObject *x1 = NULL;\r
+    PyObject *x2 = NULL;\r
+    PyObject *x3 = NULL;\r
+    PyObject *result = NULL;\r
+\r
+    x1 = PyInt_FromLong(GET_TD_DAYS(self));\r
+    if (x1 == NULL)\r
+        goto Done;\r
+    x2 = PyNumber_Multiply(x1, seconds_per_day);        /* days in seconds */\r
+    if (x2 == NULL)\r
+        goto Done;\r
+    Py_DECREF(x1);\r
+    x1 = NULL;\r
+\r
+    /* x2 has days in seconds */\r
+    x1 = PyInt_FromLong(GET_TD_SECONDS(self));          /* seconds */\r
+    if (x1 == NULL)\r
+        goto Done;\r
+    x3 = PyNumber_Add(x1, x2);          /* days and seconds in seconds */\r
+    if (x3 == NULL)\r
+        goto Done;\r
+    Py_DECREF(x1);\r
+    Py_DECREF(x2);\r
+    x2 = NULL;\r
+\r
+    /* x3 has days+seconds in seconds */\r
+    x1 = PyNumber_Multiply(x3, us_per_second);          /* us */\r
+    if (x1 == NULL)\r
+        goto Done;\r
+    Py_DECREF(x3);\r
+    x3 = NULL;\r
+\r
+    /* x1 has days+seconds in us */\r
+    x2 = PyInt_FromLong(GET_TD_MICROSECONDS(self));\r
+    if (x2 == NULL)\r
+        goto Done;\r
+    result = PyNumber_Add(x1, x2);\r
+\r
+Done:\r
+    Py_XDECREF(x1);\r
+    Py_XDECREF(x2);\r
+    Py_XDECREF(x3);\r
+    return result;\r
+}\r
+\r
+/* Convert a number of us (as a Python int or long) to a timedelta.\r
+ */\r
+static PyObject *\r
+microseconds_to_delta_ex(PyObject *pyus, PyTypeObject *type)\r
+{\r
+    int us;\r
+    int s;\r
+    int d;\r
+    long temp;\r
+\r
+    PyObject *tuple = NULL;\r
+    PyObject *num = NULL;\r
+    PyObject *result = NULL;\r
+\r
+    tuple = PyNumber_Divmod(pyus, us_per_second);\r
+    if (tuple == NULL)\r
+        goto Done;\r
+\r
+    num = PyTuple_GetItem(tuple, 1);            /* us */\r
+    if (num == NULL)\r
+        goto Done;\r
+    temp = PyLong_AsLong(num);\r
+    num = NULL;\r
+    if (temp == -1 && PyErr_Occurred())\r
+        goto Done;\r
+    assert(0 <= temp && temp < 1000000);\r
+    us = (int)temp;\r
+    if (us < 0) {\r
+        /* The divisor was positive, so this must be an error. */\r
+        assert(PyErr_Occurred());\r
+        goto Done;\r
+    }\r
+\r
+    num = PyTuple_GetItem(tuple, 0);            /* leftover seconds */\r
+    if (num == NULL)\r
+        goto Done;\r
+    Py_INCREF(num);\r
+    Py_DECREF(tuple);\r
+\r
+    tuple = PyNumber_Divmod(num, seconds_per_day);\r
+    if (tuple == NULL)\r
+        goto Done;\r
+    Py_DECREF(num);\r
+\r
+    num = PyTuple_GetItem(tuple, 1);            /* seconds */\r
+    if (num == NULL)\r
+        goto Done;\r
+    temp = PyLong_AsLong(num);\r
+    num = NULL;\r
+    if (temp == -1 && PyErr_Occurred())\r
+        goto Done;\r
+    assert(0 <= temp && temp < 24*3600);\r
+    s = (int)temp;\r
+\r
+    if (s < 0) {\r
+        /* The divisor was positive, so this must be an error. */\r
+        assert(PyErr_Occurred());\r
+        goto Done;\r
+    }\r
+\r
+    num = PyTuple_GetItem(tuple, 0);            /* leftover days */\r
+    if (num == NULL)\r
+        goto Done;\r
+    Py_INCREF(num);\r
+    temp = PyLong_AsLong(num);\r
+    if (temp == -1 && PyErr_Occurred())\r
+        goto Done;\r
+    d = (int)temp;\r
+    if ((long)d != temp) {\r
+        PyErr_SetString(PyExc_OverflowError, "normalized days too "\r
+                        "large to fit in a C int");\r
+        goto Done;\r
+    }\r
+    result = new_delta_ex(d, s, us, 0, type);\r
+\r
+Done:\r
+    Py_XDECREF(tuple);\r
+    Py_XDECREF(num);\r
+    return result;\r
+}\r
+\r
+#define microseconds_to_delta(pymicros) \\r
+    microseconds_to_delta_ex(pymicros, &PyDateTime_DeltaType)\r
+\r
+static PyObject *\r
+multiply_int_timedelta(PyObject *intobj, PyDateTime_Delta *delta)\r
+{\r
+    PyObject *pyus_in;\r
+    PyObject *pyus_out;\r
+    PyObject *result;\r
+\r
+    pyus_in = delta_to_microseconds(delta);\r
+    if (pyus_in == NULL)\r
+        return NULL;\r
+\r
+    pyus_out = PyNumber_Multiply(pyus_in, intobj);\r
+    Py_DECREF(pyus_in);\r
+    if (pyus_out == NULL)\r
+        return NULL;\r
+\r
+    result = microseconds_to_delta(pyus_out);\r
+    Py_DECREF(pyus_out);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+divide_timedelta_int(PyDateTime_Delta *delta, PyObject *intobj)\r
+{\r
+    PyObject *pyus_in;\r
+    PyObject *pyus_out;\r
+    PyObject *result;\r
+\r
+    pyus_in = delta_to_microseconds(delta);\r
+    if (pyus_in == NULL)\r
+        return NULL;\r
+\r
+    pyus_out = PyNumber_FloorDivide(pyus_in, intobj);\r
+    Py_DECREF(pyus_in);\r
+    if (pyus_out == NULL)\r
+        return NULL;\r
+\r
+    result = microseconds_to_delta(pyus_out);\r
+    Py_DECREF(pyus_out);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+delta_add(PyObject *left, PyObject *right)\r
+{\r
+    PyObject *result = Py_NotImplemented;\r
+\r
+    if (PyDelta_Check(left) && PyDelta_Check(right)) {\r
+        /* delta + delta */\r
+        /* The C-level additions can't overflow because of the\r
+         * invariant bounds.\r
+         */\r
+        int days = GET_TD_DAYS(left) + GET_TD_DAYS(right);\r
+        int seconds = GET_TD_SECONDS(left) + GET_TD_SECONDS(right);\r
+        int microseconds = GET_TD_MICROSECONDS(left) +\r
+                           GET_TD_MICROSECONDS(right);\r
+        result = new_delta(days, seconds, microseconds, 1);\r
+    }\r
+\r
+    if (result == Py_NotImplemented)\r
+        Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+delta_negative(PyDateTime_Delta *self)\r
+{\r
+    return new_delta(-GET_TD_DAYS(self),\r
+                     -GET_TD_SECONDS(self),\r
+                     -GET_TD_MICROSECONDS(self),\r
+                     1);\r
+}\r
+\r
+static PyObject *\r
+delta_positive(PyDateTime_Delta *self)\r
+{\r
+    /* Could optimize this (by returning self) if this isn't a\r
+     * subclass -- but who uses unary + ?  Approximately nobody.\r
+     */\r
+    return new_delta(GET_TD_DAYS(self),\r
+                     GET_TD_SECONDS(self),\r
+                     GET_TD_MICROSECONDS(self),\r
+                     0);\r
+}\r
+\r
+static PyObject *\r
+delta_abs(PyDateTime_Delta *self)\r
+{\r
+    PyObject *result;\r
+\r
+    assert(GET_TD_MICROSECONDS(self) >= 0);\r
+    assert(GET_TD_SECONDS(self) >= 0);\r
+\r
+    if (GET_TD_DAYS(self) < 0)\r
+        result = delta_negative(self);\r
+    else\r
+        result = delta_positive(self);\r
+\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+delta_subtract(PyObject *left, PyObject *right)\r
+{\r
+    PyObject *result = Py_NotImplemented;\r
+\r
+    if (PyDelta_Check(left) && PyDelta_Check(right)) {\r
+        /* delta - delta */\r
+        /* The C-level additions can't overflow because of the\r
+         * invariant bounds.\r
+         */\r
+        int days = GET_TD_DAYS(left) - GET_TD_DAYS(right);\r
+        int seconds = GET_TD_SECONDS(left) - GET_TD_SECONDS(right);\r
+        int microseconds = GET_TD_MICROSECONDS(left) -\r
+                           GET_TD_MICROSECONDS(right);\r
+        result = new_delta(days, seconds, microseconds, 1);\r
+    }\r
+\r
+    if (result == Py_NotImplemented)\r
+        Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+/* This is more natural as a tp_compare, but doesn't work then:  for whatever\r
+ * reason, Python's try_3way_compare ignores tp_compare unless\r
+ * PyInstance_Check returns true, but these aren't old-style classes.\r
+ */\r
+static PyObject *\r
+delta_richcompare(PyDateTime_Delta *self, PyObject *other, int op)\r
+{\r
+    int diff = 42;      /* nonsense */\r
+\r
+    if (PyDelta_Check(other)) {\r
+        diff = GET_TD_DAYS(self) - GET_TD_DAYS(other);\r
+        if (diff == 0) {\r
+            diff = GET_TD_SECONDS(self) - GET_TD_SECONDS(other);\r
+            if (diff == 0)\r
+                diff = GET_TD_MICROSECONDS(self) -\r
+                       GET_TD_MICROSECONDS(other);\r
+        }\r
+    }\r
+    else if (op == Py_EQ || op == Py_NE)\r
+        diff = 1;               /* any non-zero value will do */\r
+\r
+    else /* stop this from falling back to address comparison */\r
+        return cmperror((PyObject *)self, other);\r
+\r
+    return diff_to_bool(diff, op);\r
+}\r
+\r
+static PyObject *delta_getstate(PyDateTime_Delta *self);\r
+\r
+static long\r
+delta_hash(PyDateTime_Delta *self)\r
+{\r
+    if (self->hashcode == -1) {\r
+        PyObject *temp = delta_getstate(self);\r
+        if (temp != NULL) {\r
+            self->hashcode = PyObject_Hash(temp);\r
+            Py_DECREF(temp);\r
+        }\r
+    }\r
+    return self->hashcode;\r
+}\r
+\r
+static PyObject *\r
+delta_multiply(PyObject *left, PyObject *right)\r
+{\r
+    PyObject *result = Py_NotImplemented;\r
+\r
+    if (PyDelta_Check(left)) {\r
+        /* delta * ??? */\r
+        if (PyInt_Check(right) || PyLong_Check(right))\r
+            result = multiply_int_timedelta(right,\r
+                            (PyDateTime_Delta *) left);\r
+    }\r
+    else if (PyInt_Check(left) || PyLong_Check(left))\r
+        result = multiply_int_timedelta(left,\r
+                                        (PyDateTime_Delta *) right);\r
+\r
+    if (result == Py_NotImplemented)\r
+        Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+delta_divide(PyObject *left, PyObject *right)\r
+{\r
+    PyObject *result = Py_NotImplemented;\r
+\r
+    if (PyDelta_Check(left)) {\r
+        /* delta * ??? */\r
+        if (PyInt_Check(right) || PyLong_Check(right))\r
+            result = divide_timedelta_int(\r
+                            (PyDateTime_Delta *)left,\r
+                            right);\r
+    }\r
+\r
+    if (result == Py_NotImplemented)\r
+        Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+/* Fold in the value of the tag ("seconds", "weeks", etc) component of a\r
+ * timedelta constructor.  sofar is the # of microseconds accounted for\r
+ * so far, and there are factor microseconds per current unit, the number\r
+ * of which is given by num.  num * factor is added to sofar in a\r
+ * numerically careful way, and that's the result.  Any fractional\r
+ * microseconds left over (this can happen if num is a float type) are\r
+ * added into *leftover.\r
+ * Note that there are many ways this can give an error (NULL) return.\r
+ */\r
+static PyObject *\r
+accum(const char* tag, PyObject *sofar, PyObject *num, PyObject *factor,\r
+      double *leftover)\r
+{\r
+    PyObject *prod;\r
+    PyObject *sum;\r
+\r
+    assert(num != NULL);\r
+\r
+    if (PyInt_Check(num) || PyLong_Check(num)) {\r
+        prod = PyNumber_Multiply(num, factor);\r
+        if (prod == NULL)\r
+            return NULL;\r
+        sum = PyNumber_Add(sofar, prod);\r
+        Py_DECREF(prod);\r
+        return sum;\r
+    }\r
+\r
+    if (PyFloat_Check(num)) {\r
+        double dnum;\r
+        double fracpart;\r
+        double intpart;\r
+        PyObject *x;\r
+        PyObject *y;\r
+\r
+        /* The Plan:  decompose num into an integer part and a\r
+         * fractional part, num = intpart + fracpart.\r
+         * Then num * factor ==\r
+         *      intpart * factor + fracpart * factor\r
+         * and the LHS can be computed exactly in long arithmetic.\r
+         * The RHS is again broken into an int part and frac part.\r
+         * and the frac part is added into *leftover.\r
+         */\r
+        dnum = PyFloat_AsDouble(num);\r
+        if (dnum == -1.0 && PyErr_Occurred())\r
+            return NULL;\r
+        fracpart = modf(dnum, &intpart);\r
+        x = PyLong_FromDouble(intpart);\r
+        if (x == NULL)\r
+            return NULL;\r
+\r
+        prod = PyNumber_Multiply(x, factor);\r
+        Py_DECREF(x);\r
+        if (prod == NULL)\r
+            return NULL;\r
+\r
+        sum = PyNumber_Add(sofar, prod);\r
+        Py_DECREF(prod);\r
+        if (sum == NULL)\r
+            return NULL;\r
+\r
+        if (fracpart == 0.0)\r
+            return sum;\r
+        /* So far we've lost no information.  Dealing with the\r
+         * fractional part requires float arithmetic, and may\r
+         * lose a little info.\r
+         */\r
+        assert(PyInt_Check(factor) || PyLong_Check(factor));\r
+        if (PyInt_Check(factor))\r
+            dnum = (double)PyInt_AsLong(factor);\r
+        else\r
+            dnum = PyLong_AsDouble(factor);\r
+\r
+        dnum *= fracpart;\r
+        fracpart = modf(dnum, &intpart);\r
+        x = PyLong_FromDouble(intpart);\r
+        if (x == NULL) {\r
+            Py_DECREF(sum);\r
+            return NULL;\r
+        }\r
+\r
+        y = PyNumber_Add(sum, x);\r
+        Py_DECREF(sum);\r
+        Py_DECREF(x);\r
+        *leftover += fracpart;\r
+        return y;\r
+    }\r
+\r
+    PyErr_Format(PyExc_TypeError,\r
+                 "unsupported type for timedelta %s component: %s",\r
+                 tag, Py_TYPE(num)->tp_name);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+delta_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self = NULL;\r
+\r
+    /* Argument objects. */\r
+    PyObject *day = NULL;\r
+    PyObject *second = NULL;\r
+    PyObject *us = NULL;\r
+    PyObject *ms = NULL;\r
+    PyObject *minute = NULL;\r
+    PyObject *hour = NULL;\r
+    PyObject *week = NULL;\r
+\r
+    PyObject *x = NULL;         /* running sum of microseconds */\r
+    PyObject *y = NULL;         /* temp sum of microseconds */\r
+    double leftover_us = 0.0;\r
+\r
+    static char *keywords[] = {\r
+        "days", "seconds", "microseconds", "milliseconds",\r
+        "minutes", "hours", "weeks", NULL\r
+    };\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, "|OOOOOOO:__new__",\r
+                                    keywords,\r
+                                    &day, &second, &us,\r
+                                    &ms, &minute, &hour, &week) == 0)\r
+        goto Done;\r
+\r
+    x = PyInt_FromLong(0);\r
+    if (x == NULL)\r
+        goto Done;\r
+\r
+#define CLEANUP         \\r
+    Py_DECREF(x);       \\r
+    x = y;              \\r
+    if (x == NULL)      \\r
+        goto Done\r
+\r
+    if (us) {\r
+        y = accum("microseconds", x, us, us_per_us, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (ms) {\r
+        y = accum("milliseconds", x, ms, us_per_ms, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (second) {\r
+        y = accum("seconds", x, second, us_per_second, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (minute) {\r
+        y = accum("minutes", x, minute, us_per_minute, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (hour) {\r
+        y = accum("hours", x, hour, us_per_hour, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (day) {\r
+        y = accum("days", x, day, us_per_day, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (week) {\r
+        y = accum("weeks", x, week, us_per_week, &leftover_us);\r
+        CLEANUP;\r
+    }\r
+    if (leftover_us) {\r
+        /* Round to nearest whole # of us, and add into x. */\r
+        PyObject *temp = PyLong_FromLong(round_to_long(leftover_us));\r
+        if (temp == NULL) {\r
+            Py_DECREF(x);\r
+            goto Done;\r
+        }\r
+        y = PyNumber_Add(x, temp);\r
+        Py_DECREF(temp);\r
+        CLEANUP;\r
+    }\r
+\r
+    self = microseconds_to_delta_ex(x, type);\r
+    Py_DECREF(x);\r
+Done:\r
+    return self;\r
+\r
+#undef CLEANUP\r
+}\r
+\r
+static int\r
+delta_nonzero(PyDateTime_Delta *self)\r
+{\r
+    return (GET_TD_DAYS(self) != 0\r
+        || GET_TD_SECONDS(self) != 0\r
+        || GET_TD_MICROSECONDS(self) != 0);\r
+}\r
+\r
+static PyObject *\r
+delta_repr(PyDateTime_Delta *self)\r
+{\r
+    if (GET_TD_MICROSECONDS(self) != 0)\r
+        return PyString_FromFormat("%s(%d, %d, %d)",\r
+                                   Py_TYPE(self)->tp_name,\r
+                                   GET_TD_DAYS(self),\r
+                                   GET_TD_SECONDS(self),\r
+                                   GET_TD_MICROSECONDS(self));\r
+    if (GET_TD_SECONDS(self) != 0)\r
+        return PyString_FromFormat("%s(%d, %d)",\r
+                                   Py_TYPE(self)->tp_name,\r
+                                   GET_TD_DAYS(self),\r
+                                   GET_TD_SECONDS(self));\r
+\r
+    return PyString_FromFormat("%s(%d)",\r
+                               Py_TYPE(self)->tp_name,\r
+                               GET_TD_DAYS(self));\r
+}\r
+\r
+static PyObject *\r
+delta_str(PyDateTime_Delta *self)\r
+{\r
+    int days = GET_TD_DAYS(self);\r
+    int seconds = GET_TD_SECONDS(self);\r
+    int us = GET_TD_MICROSECONDS(self);\r
+    int hours;\r
+    int minutes;\r
+    char buf[100];\r
+    char *pbuf = buf;\r
+    size_t buflen = sizeof(buf);\r
+    int n;\r
+\r
+    minutes = divmod(seconds, 60, &seconds);\r
+    hours = divmod(minutes, 60, &minutes);\r
+\r
+    if (days) {\r
+        n = PyOS_snprintf(pbuf, buflen, "%d day%s, ", days,\r
+                          (days == 1 || days == -1) ? "" : "s");\r
+        if (n < 0 || (size_t)n >= buflen)\r
+            goto Fail;\r
+        pbuf += n;\r
+        buflen -= (size_t)n;\r
+    }\r
+\r
+    n = PyOS_snprintf(pbuf, buflen, "%d:%02d:%02d",\r
+                      hours, minutes, seconds);\r
+    if (n < 0 || (size_t)n >= buflen)\r
+        goto Fail;\r
+    pbuf += n;\r
+    buflen -= (size_t)n;\r
+\r
+    if (us) {\r
+        n = PyOS_snprintf(pbuf, buflen, ".%06d", us);\r
+        if (n < 0 || (size_t)n >= buflen)\r
+            goto Fail;\r
+        pbuf += n;\r
+    }\r
+\r
+    return PyString_FromStringAndSize(buf, pbuf - buf);\r
+\r
+ Fail:\r
+    PyErr_SetString(PyExc_SystemError, "goofy result from PyOS_snprintf");\r
+    return NULL;\r
+}\r
+\r
+/* Pickle support, a simple use of __reduce__. */\r
+\r
+/* __getstate__ isn't exposed */\r
+static PyObject *\r
+delta_getstate(PyDateTime_Delta *self)\r
+{\r
+    return Py_BuildValue("iii", GET_TD_DAYS(self),\r
+                                GET_TD_SECONDS(self),\r
+                                GET_TD_MICROSECONDS(self));\r
+}\r
+\r
+static PyObject *\r
+delta_total_seconds(PyObject *self)\r
+{\r
+    PyObject *total_seconds;\r
+    PyObject *total_microseconds;\r
+    PyObject *one_million;\r
+\r
+    total_microseconds = delta_to_microseconds((PyDateTime_Delta *)self);\r
+    if (total_microseconds == NULL)\r
+        return NULL;\r
+\r
+    one_million = PyLong_FromLong(1000000L);\r
+    if (one_million == NULL) {\r
+        Py_DECREF(total_microseconds);\r
+        return NULL;\r
+    }\r
+\r
+    total_seconds = PyNumber_TrueDivide(total_microseconds, one_million);\r
+\r
+    Py_DECREF(total_microseconds);\r
+    Py_DECREF(one_million);\r
+    return total_seconds;\r
+}\r
+\r
+static PyObject *\r
+delta_reduce(PyDateTime_Delta* self)\r
+{\r
+    return Py_BuildValue("ON", Py_TYPE(self), delta_getstate(self));\r
+}\r
+\r
+#define OFFSET(field)  offsetof(PyDateTime_Delta, field)\r
+\r
+static PyMemberDef delta_members[] = {\r
+\r
+    {"days",         T_INT, OFFSET(days),         READONLY,\r
+     PyDoc_STR("Number of days.")},\r
+\r
+    {"seconds",      T_INT, OFFSET(seconds),      READONLY,\r
+     PyDoc_STR("Number of seconds (>= 0 and less than 1 day).")},\r
+\r
+    {"microseconds", T_INT, OFFSET(microseconds), READONLY,\r
+     PyDoc_STR("Number of microseconds (>= 0 and less than 1 second).")},\r
+    {NULL}\r
+};\r
+\r
+static PyMethodDef delta_methods[] = {\r
+    {"total_seconds", (PyCFunction)delta_total_seconds, METH_NOARGS,\r
+     PyDoc_STR("Total seconds in the duration.")},\r
+\r
+    {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS,\r
+     PyDoc_STR("__reduce__() -> (cls, state)")},\r
+\r
+    {NULL,      NULL},\r
+};\r
+\r
+static char delta_doc[] =\r
+PyDoc_STR("Difference between two datetime values.");\r
+\r
+static PyNumberMethods delta_as_number = {\r
+    delta_add,                                  /* nb_add */\r
+    delta_subtract,                             /* nb_subtract */\r
+    delta_multiply,                             /* nb_multiply */\r
+    delta_divide,                               /* nb_divide */\r
+    0,                                          /* nb_remainder */\r
+    0,                                          /* nb_divmod */\r
+    0,                                          /* nb_power */\r
+    (unaryfunc)delta_negative,                  /* nb_negative */\r
+    (unaryfunc)delta_positive,                  /* nb_positive */\r
+    (unaryfunc)delta_abs,                       /* nb_absolute */\r
+    (inquiry)delta_nonzero,                     /* nb_nonzero */\r
+    0,                                          /*nb_invert*/\r
+    0,                                          /*nb_lshift*/\r
+    0,                                          /*nb_rshift*/\r
+    0,                                          /*nb_and*/\r
+    0,                                          /*nb_xor*/\r
+    0,                                          /*nb_or*/\r
+    0,                                          /*nb_coerce*/\r
+    0,                                          /*nb_int*/\r
+    0,                                          /*nb_long*/\r
+    0,                                          /*nb_float*/\r
+    0,                                          /*nb_oct*/\r
+    0,                                          /*nb_hex*/\r
+    0,                                          /*nb_inplace_add*/\r
+    0,                                          /*nb_inplace_subtract*/\r
+    0,                                          /*nb_inplace_multiply*/\r
+    0,                                          /*nb_inplace_divide*/\r
+    0,                                          /*nb_inplace_remainder*/\r
+    0,                                          /*nb_inplace_power*/\r
+    0,                                          /*nb_inplace_lshift*/\r
+    0,                                          /*nb_inplace_rshift*/\r
+    0,                                          /*nb_inplace_and*/\r
+    0,                                          /*nb_inplace_xor*/\r
+    0,                                          /*nb_inplace_or*/\r
+    delta_divide,                               /* nb_floor_divide */\r
+    0,                                          /* nb_true_divide */\r
+    0,                                          /* nb_inplace_floor_divide */\r
+    0,                                          /* nb_inplace_true_divide */\r
+};\r
+\r
+static PyTypeObject PyDateTime_DeltaType = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "datetime.timedelta",                               /* tp_name */\r
+    sizeof(PyDateTime_Delta),                           /* tp_basicsize */\r
+    0,                                                  /* tp_itemsize */\r
+    0,                                                  /* tp_dealloc */\r
+    0,                                                  /* tp_print */\r
+    0,                                                  /* tp_getattr */\r
+    0,                                                  /* tp_setattr */\r
+    0,                                                  /* tp_compare */\r
+    (reprfunc)delta_repr,                               /* tp_repr */\r
+    &delta_as_number,                                   /* tp_as_number */\r
+    0,                                                  /* tp_as_sequence */\r
+    0,                                                  /* tp_as_mapping */\r
+    (hashfunc)delta_hash,                               /* tp_hash */\r
+    0,                                                  /* tp_call */\r
+    (reprfunc)delta_str,                                /* tp_str */\r
+    PyObject_GenericGetAttr,                            /* tp_getattro */\r
+    0,                                                  /* tp_setattro */\r
+    0,                                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |\r
+        Py_TPFLAGS_BASETYPE,                            /* tp_flags */\r
+    delta_doc,                                          /* tp_doc */\r
+    0,                                                  /* tp_traverse */\r
+    0,                                                  /* tp_clear */\r
+    (richcmpfunc)delta_richcompare,                     /* tp_richcompare */\r
+    0,                                                  /* tp_weaklistoffset */\r
+    0,                                                  /* tp_iter */\r
+    0,                                                  /* tp_iternext */\r
+    delta_methods,                                      /* tp_methods */\r
+    delta_members,                                      /* tp_members */\r
+    0,                                                  /* tp_getset */\r
+    0,                                                  /* tp_base */\r
+    0,                                                  /* tp_dict */\r
+    0,                                                  /* tp_descr_get */\r
+    0,                                                  /* tp_descr_set */\r
+    0,                                                  /* tp_dictoffset */\r
+    0,                                                  /* tp_init */\r
+    0,                                                  /* tp_alloc */\r
+    delta_new,                                          /* tp_new */\r
+    0,                                                  /* tp_free */\r
+};\r
+\r
+/*\r
+ * PyDateTime_Date implementation.\r
+ */\r
+\r
+/* Accessor properties. */\r
+\r
+static PyObject *\r
+date_year(PyDateTime_Date *self, void *unused)\r
+{\r
+    return PyInt_FromLong(GET_YEAR(self));\r
+}\r
+\r
+static PyObject *\r
+date_month(PyDateTime_Date *self, void *unused)\r
+{\r
+    return PyInt_FromLong(GET_MONTH(self));\r
+}\r
+\r
+static PyObject *\r
+date_day(PyDateTime_Date *self, void *unused)\r
+{\r
+    return PyInt_FromLong(GET_DAY(self));\r
+}\r
+\r
+static PyGetSetDef date_getset[] = {\r
+    {"year",        (getter)date_year},\r
+    {"month",       (getter)date_month},\r
+    {"day",         (getter)date_day},\r
+    {NULL}\r
+};\r
+\r
+/* Constructors. */\r
+\r
+static char *date_kws[] = {"year", "month", "day", NULL};\r
+\r
+static PyObject *\r
+date_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self = NULL;\r
+    PyObject *state;\r
+    int year;\r
+    int month;\r
+    int day;\r
+\r
+    /* Check for invocation from pickle with __getstate__ state */\r
+    if (PyTuple_GET_SIZE(args) == 1 &&\r
+        PyString_Check(state = PyTuple_GET_ITEM(args, 0)) &&\r
+        PyString_GET_SIZE(state) == _PyDateTime_DATE_DATASIZE &&\r
+        MONTH_IS_SANE(PyString_AS_STRING(state)[2]))\r
+    {\r
+        PyDateTime_Date *me;\r
+\r
+        me = (PyDateTime_Date *) (type->tp_alloc(type, 0));\r
+        if (me != NULL) {\r
+            char *pdata = PyString_AS_STRING(state);\r
+            memcpy(me->data, pdata, _PyDateTime_DATE_DATASIZE);\r
+            me->hashcode = -1;\r
+        }\r
+        return (PyObject *)me;\r
+    }\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, "iii", date_kws,\r
+                                    &year, &month, &day)) {\r
+        if (check_date_args(year, month, day) < 0)\r
+            return NULL;\r
+        self = new_date_ex(year, month, day, type);\r
+    }\r
+    return self;\r
+}\r
+\r
+/* Return new date from localtime(t). */\r
+static PyObject *\r
+date_local_from_time_t(PyObject *cls, double ts)\r
+{\r
+    struct tm *tm;\r
+    time_t t;\r
+    PyObject *result = NULL;\r
+\r
+    t = _PyTime_DoubleToTimet(ts);\r
+    if (t == (time_t)-1 && PyErr_Occurred())\r
+        return NULL;\r
+    tm = localtime(&t);\r
+    if (tm)\r
+        result = PyObject_CallFunction(cls, "iii",\r
+                                       tm->tm_year + 1900,\r
+                                       tm->tm_mon + 1,\r
+                                       tm->tm_mday);\r
+    else\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "timestamp out of range for "\r
+                        "platform localtime() function");\r
+    return result;\r
+}\r
+\r
+/* Return new date from current time.\r
+ * We say this is equivalent to fromtimestamp(time.time()), and the\r
+ * only way to be sure of that is to *call* time.time().  That's not\r
+ * generally the same as calling C's time.\r
+ */\r
+static PyObject *\r
+date_today(PyObject *cls, PyObject *dummy)\r
+{\r
+    PyObject *time;\r
+    PyObject *result;\r
+\r
+    time = time_time();\r
+    if (time == NULL)\r
+        return NULL;\r
+\r
+    /* Note well:  today() is a class method, so this may not call\r
+     * date.fromtimestamp.  For example, it may call\r
+     * datetime.fromtimestamp.  That's why we need all the accuracy\r
+     * time.time() delivers; if someone were gonzo about optimization,\r
+     * date.today() could get away with plain C time().\r
+     */\r
+    result = PyObject_CallMethod(cls, "fromtimestamp", "O", time);\r
+    Py_DECREF(time);\r
+    return result;\r
+}\r
+\r
+/* Return new date from given timestamp (Python timestamp -- a double). */\r
+static PyObject *\r
+date_fromtimestamp(PyObject *cls, PyObject *args)\r
+{\r
+    double timestamp;\r
+    PyObject *result = NULL;\r
+\r
+    if (PyArg_ParseTuple(args, "d:fromtimestamp", &timestamp))\r
+        result = date_local_from_time_t(cls, timestamp);\r
+    return result;\r
+}\r
+\r
+/* Return new date from proleptic Gregorian ordinal.  Raises ValueError if\r
+ * the ordinal is out of range.\r
+ */\r
+static PyObject *\r
+date_fromordinal(PyObject *cls, PyObject *args)\r
+{\r
+    PyObject *result = NULL;\r
+    int ordinal;\r
+\r
+    if (PyArg_ParseTuple(args, "i:fromordinal", &ordinal)) {\r
+        int year;\r
+        int month;\r
+        int day;\r
+\r
+        if (ordinal < 1)\r
+            PyErr_SetString(PyExc_ValueError, "ordinal must be "\r
+                                              ">= 1");\r
+        else {\r
+            ord_to_ymd(ordinal, &year, &month, &day);\r
+            result = PyObject_CallFunction(cls, "iii",\r
+                                           year, month, day);\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+/*\r
+ * Date arithmetic.\r
+ */\r
+\r
+/* date + timedelta -> date.  If arg negate is true, subtract the timedelta\r
+ * instead.\r
+ */\r
+static PyObject *\r
+add_date_timedelta(PyDateTime_Date *date, PyDateTime_Delta *delta, int negate)\r
+{\r
+    PyObject *result = NULL;\r
+    int year = GET_YEAR(date);\r
+    int month = GET_MONTH(date);\r
+    int deltadays = GET_TD_DAYS(delta);\r
+    /* C-level overflow is impossible because |deltadays| < 1e9. */\r
+    int day = GET_DAY(date) + (negate ? -deltadays : deltadays);\r
+\r
+    if (normalize_date(&year, &month, &day) >= 0)\r
+        result = new_date(year, month, day);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+date_add(PyObject *left, PyObject *right)\r
+{\r
+    if (PyDateTime_Check(left) || PyDateTime_Check(right)) {\r
+        Py_INCREF(Py_NotImplemented);\r
+        return Py_NotImplemented;\r
+    }\r
+    if (PyDate_Check(left)) {\r
+        /* date + ??? */\r
+        if (PyDelta_Check(right))\r
+            /* date + delta */\r
+            return add_date_timedelta((PyDateTime_Date *) left,\r
+                                      (PyDateTime_Delta *) right,\r
+                                      0);\r
+    }\r
+    else {\r
+        /* ??? + date\r
+         * 'right' must be one of us, or we wouldn't have been called\r
+         */\r
+        if (PyDelta_Check(left))\r
+            /* delta + date */\r
+            return add_date_timedelta((PyDateTime_Date *) right,\r
+                                      (PyDateTime_Delta *) left,\r
+                                      0);\r
+    }\r
+    Py_INCREF(Py_NotImplemented);\r
+    return Py_NotImplemented;\r
+}\r
+\r
+static PyObject *\r
+date_subtract(PyObject *left, PyObject *right)\r
+{\r
+    if (PyDateTime_Check(left) || PyDateTime_Check(right)) {\r
+        Py_INCREF(Py_NotImplemented);\r
+        return Py_NotImplemented;\r
+    }\r
+    if (PyDate_Check(left)) {\r
+        if (PyDate_Check(right)) {\r
+            /* date - date */\r
+            int left_ord = ymd_to_ord(GET_YEAR(left),\r
+                                      GET_MONTH(left),\r
+                                      GET_DAY(left));\r
+            int right_ord = ymd_to_ord(GET_YEAR(right),\r
+                                       GET_MONTH(right),\r
+                                       GET_DAY(right));\r
+            return new_delta(left_ord - right_ord, 0, 0, 0);\r
+        }\r
+        if (PyDelta_Check(right)) {\r
+            /* date - delta */\r
+            return add_date_timedelta((PyDateTime_Date *) left,\r
+                                      (PyDateTime_Delta *) right,\r
+                                      1);\r
+        }\r
+    }\r
+    Py_INCREF(Py_NotImplemented);\r
+    return Py_NotImplemented;\r
+}\r
+\r
+\r
+/* Various ways to turn a date into a string. */\r
+\r
+static PyObject *\r
+date_repr(PyDateTime_Date *self)\r
+{\r
+    char buffer[1028];\r
+    const char *type_name;\r
+\r
+    type_name = Py_TYPE(self)->tp_name;\r
+    PyOS_snprintf(buffer, sizeof(buffer), "%s(%d, %d, %d)",\r
+                  type_name,\r
+                  GET_YEAR(self), GET_MONTH(self), GET_DAY(self));\r
+\r
+    return PyString_FromString(buffer);\r
+}\r
+\r
+static PyObject *\r
+date_isoformat(PyDateTime_Date *self)\r
+{\r
+    char buffer[128];\r
+\r
+    isoformat_date(self, buffer, sizeof(buffer));\r
+    return PyString_FromString(buffer);\r
+}\r
+\r
+/* str() calls the appropriate isoformat() method. */\r
+static PyObject *\r
+date_str(PyDateTime_Date *self)\r
+{\r
+    return PyObject_CallMethod((PyObject *)self, "isoformat", "()");\r
+}\r
+\r
+\r
+static PyObject *\r
+date_ctime(PyDateTime_Date *self)\r
+{\r
+    return format_ctime(self, 0, 0, 0);\r
+}\r
+\r
+static PyObject *\r
+date_strftime(PyDateTime_Date *self, PyObject *args, PyObject *kw)\r
+{\r
+    /* This method can be inherited, and needs to call the\r
+     * timetuple() method appropriate to self's class.\r
+     */\r
+    PyObject *result;\r
+    PyObject *tuple;\r
+    const char *format;\r
+    Py_ssize_t format_len;\r
+    static char *keywords[] = {"format", NULL};\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords,\r
+                                      &format, &format_len))\r
+        return NULL;\r
+\r
+    tuple = PyObject_CallMethod((PyObject *)self, "timetuple", "()");\r
+    if (tuple == NULL)\r
+        return NULL;\r
+    result = wrap_strftime((PyObject *)self, format, format_len, tuple,\r
+                           (PyObject *)self);\r
+    Py_DECREF(tuple);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+date_format(PyDateTime_Date *self, PyObject *args)\r
+{\r
+    PyObject *format;\r
+\r
+    if (!PyArg_ParseTuple(args, "O:__format__", &format))\r
+        return NULL;\r
+\r
+    /* Check for str or unicode */\r
+    if (PyString_Check(format)) {\r
+        /* If format is zero length, return str(self) */\r
+        if (PyString_GET_SIZE(format) == 0)\r
+            return PyObject_Str((PyObject *)self);\r
+    } else if (PyUnicode_Check(format)) {\r
+        /* If format is zero length, return str(self) */\r
+        if (PyUnicode_GET_SIZE(format) == 0)\r
+            return PyObject_Unicode((PyObject *)self);\r
+    } else {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "__format__ expects str or unicode, not %.200s",\r
+                     Py_TYPE(format)->tp_name);\r
+        return NULL;\r
+    }\r
+    return PyObject_CallMethod((PyObject *)self, "strftime", "O", format);\r
+}\r
+\r
+/* ISO methods. */\r
+\r
+static PyObject *\r
+date_isoweekday(PyDateTime_Date *self)\r
+{\r
+    int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));\r
+\r
+    return PyInt_FromLong(dow + 1);\r
+}\r
+\r
+static PyObject *\r
+date_isocalendar(PyDateTime_Date *self)\r
+{\r
+    int  year         = GET_YEAR(self);\r
+    int  week1_monday = iso_week1_monday(year);\r
+    int today         = ymd_to_ord(year, GET_MONTH(self), GET_DAY(self));\r
+    int  week;\r
+    int  day;\r
+\r
+    week = divmod(today - week1_monday, 7, &day);\r
+    if (week < 0) {\r
+        --year;\r
+        week1_monday = iso_week1_monday(year);\r
+        week = divmod(today - week1_monday, 7, &day);\r
+    }\r
+    else if (week >= 52 && today >= iso_week1_monday(year + 1)) {\r
+        ++year;\r
+        week = 0;\r
+    }\r
+    return Py_BuildValue("iii", year, week + 1, day + 1);\r
+}\r
+\r
+/* Miscellaneous methods. */\r
+\r
+/* This is more natural as a tp_compare, but doesn't work then:  for whatever\r
+ * reason, Python's try_3way_compare ignores tp_compare unless\r
+ * PyInstance_Check returns true, but these aren't old-style classes.\r
+ */\r
+static PyObject *\r
+date_richcompare(PyDateTime_Date *self, PyObject *other, int op)\r
+{\r
+    int diff = 42;      /* nonsense */\r
+\r
+    if (PyDate_Check(other))\r
+        diff = memcmp(self->data, ((PyDateTime_Date *)other)->data,\r
+                      _PyDateTime_DATE_DATASIZE);\r
+\r
+    else if (PyObject_HasAttrString(other, "timetuple")) {\r
+        /* A hook for other kinds of date objects. */\r
+        Py_INCREF(Py_NotImplemented);\r
+        return Py_NotImplemented;\r
+    }\r
+    else if (op == Py_EQ || op == Py_NE)\r
+        diff = 1;               /* any non-zero value will do */\r
+\r
+    else /* stop this from falling back to address comparison */\r
+        return cmperror((PyObject *)self, other);\r
+\r
+    return diff_to_bool(diff, op);\r
+}\r
+\r
+static PyObject *\r
+date_timetuple(PyDateTime_Date *self)\r
+{\r
+    return build_struct_time(GET_YEAR(self),\r
+                             GET_MONTH(self),\r
+                             GET_DAY(self),\r
+                             0, 0, 0, -1);\r
+}\r
+\r
+static PyObject *\r
+date_replace(PyDateTime_Date *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *clone;\r
+    PyObject *tuple;\r
+    int year = GET_YEAR(self);\r
+    int month = GET_MONTH(self);\r
+    int day = GET_DAY(self);\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "|iii:replace", date_kws,\r
+                                      &year, &month, &day))\r
+        return NULL;\r
+    tuple = Py_BuildValue("iii", year, month, day);\r
+    if (tuple == NULL)\r
+        return NULL;\r
+    clone = date_new(Py_TYPE(self), tuple, NULL);\r
+    Py_DECREF(tuple);\r
+    return clone;\r
+}\r
+\r
+static PyObject *date_getstate(PyDateTime_Date *self);\r
+\r
+static long\r
+date_hash(PyDateTime_Date *self)\r
+{\r
+    if (self->hashcode == -1) {\r
+        PyObject *temp = date_getstate(self);\r
+        if (temp != NULL) {\r
+            self->hashcode = PyObject_Hash(temp);\r
+            Py_DECREF(temp);\r
+        }\r
+    }\r
+    return self->hashcode;\r
+}\r
+\r
+static PyObject *\r
+date_toordinal(PyDateTime_Date *self)\r
+{\r
+    return PyInt_FromLong(ymd_to_ord(GET_YEAR(self), GET_MONTH(self),\r
+                                     GET_DAY(self)));\r
+}\r
+\r
+static PyObject *\r
+date_weekday(PyDateTime_Date *self)\r
+{\r
+    int dow = weekday(GET_YEAR(self), GET_MONTH(self), GET_DAY(self));\r
+\r
+    return PyInt_FromLong(dow);\r
+}\r
+\r
+/* Pickle support, a simple use of __reduce__. */\r
+\r
+/* __getstate__ isn't exposed */\r
+static PyObject *\r
+date_getstate(PyDateTime_Date *self)\r
+{\r
+    return Py_BuildValue(\r
+        "(N)",\r
+        PyString_FromStringAndSize((char *)self->data,\r
+                                   _PyDateTime_DATE_DATASIZE));\r
+}\r
+\r
+static PyObject *\r
+date_reduce(PyDateTime_Date *self, PyObject *arg)\r
+{\r
+    return Py_BuildValue("(ON)", Py_TYPE(self), date_getstate(self));\r
+}\r
+\r
+static PyMethodDef date_methods[] = {\r
+\r
+    /* Class methods: */\r
+\r
+    {"fromtimestamp", (PyCFunction)date_fromtimestamp, METH_VARARGS |\r
+                                                       METH_CLASS,\r
+     PyDoc_STR("timestamp -> local date from a POSIX timestamp (like "\r
+               "time.time()).")},\r
+\r
+    {"fromordinal", (PyCFunction)date_fromordinal,      METH_VARARGS |\r
+                                                    METH_CLASS,\r
+     PyDoc_STR("int -> date corresponding to a proleptic Gregorian "\r
+               "ordinal.")},\r
+\r
+    {"today",         (PyCFunction)date_today,   METH_NOARGS | METH_CLASS,\r
+     PyDoc_STR("Current date or datetime:  same as "\r
+               "self.__class__.fromtimestamp(time.time()).")},\r
+\r
+    /* Instance methods: */\r
+\r
+    {"ctime",       (PyCFunction)date_ctime,        METH_NOARGS,\r
+     PyDoc_STR("Return ctime() style string.")},\r
+\r
+    {"strftime",        (PyCFunction)date_strftime,     METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("format -> strftime() style string.")},\r
+\r
+    {"__format__",      (PyCFunction)date_format,       METH_VARARGS,\r
+     PyDoc_STR("Formats self with strftime.")},\r
+\r
+    {"timetuple",   (PyCFunction)date_timetuple,    METH_NOARGS,\r
+     PyDoc_STR("Return time tuple, compatible with time.localtime().")},\r
+\r
+    {"isocalendar", (PyCFunction)date_isocalendar,  METH_NOARGS,\r
+     PyDoc_STR("Return a 3-tuple containing ISO year, week number, and "\r
+               "weekday.")},\r
+\r
+    {"isoformat",   (PyCFunction)date_isoformat,        METH_NOARGS,\r
+     PyDoc_STR("Return string in ISO 8601 format, YYYY-MM-DD.")},\r
+\r
+    {"isoweekday",  (PyCFunction)date_isoweekday,   METH_NOARGS,\r
+     PyDoc_STR("Return the day of the week represented by the date.\n"\r
+               "Monday == 1 ... Sunday == 7")},\r
+\r
+    {"toordinal",   (PyCFunction)date_toordinal,    METH_NOARGS,\r
+     PyDoc_STR("Return proleptic Gregorian ordinal.  January 1 of year "\r
+               "1 is day 1.")},\r
+\r
+    {"weekday",     (PyCFunction)date_weekday,      METH_NOARGS,\r
+     PyDoc_STR("Return the day of the week represented by the date.\n"\r
+               "Monday == 0 ... Sunday == 6")},\r
+\r
+    {"replace",     (PyCFunction)date_replace,      METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("Return date with new specified fields.")},\r
+\r
+    {"__reduce__", (PyCFunction)date_reduce,        METH_NOARGS,\r
+     PyDoc_STR("__reduce__() -> (cls, state)")},\r
+\r
+    {NULL,      NULL}\r
+};\r
+\r
+static char date_doc[] =\r
+PyDoc_STR("date(year, month, day) --> date object");\r
+\r
+static PyNumberMethods date_as_number = {\r
+    date_add,                                           /* nb_add */\r
+    date_subtract,                                      /* nb_subtract */\r
+    0,                                                  /* nb_multiply */\r
+    0,                                                  /* nb_divide */\r
+    0,                                                  /* nb_remainder */\r
+    0,                                                  /* nb_divmod */\r
+    0,                                                  /* nb_power */\r
+    0,                                                  /* nb_negative */\r
+    0,                                                  /* nb_positive */\r
+    0,                                                  /* nb_absolute */\r
+    0,                                                  /* nb_nonzero */\r
+};\r
+\r
+static PyTypeObject PyDateTime_DateType = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "datetime.date",                                    /* tp_name */\r
+    sizeof(PyDateTime_Date),                            /* tp_basicsize */\r
+    0,                                                  /* tp_itemsize */\r
+    0,                                                  /* tp_dealloc */\r
+    0,                                                  /* tp_print */\r
+    0,                                                  /* tp_getattr */\r
+    0,                                                  /* tp_setattr */\r
+    0,                                                  /* tp_compare */\r
+    (reprfunc)date_repr,                                /* tp_repr */\r
+    &date_as_number,                                    /* tp_as_number */\r
+    0,                                                  /* tp_as_sequence */\r
+    0,                                                  /* tp_as_mapping */\r
+    (hashfunc)date_hash,                                /* tp_hash */\r
+    0,                                                  /* tp_call */\r
+    (reprfunc)date_str,                                 /* tp_str */\r
+    PyObject_GenericGetAttr,                            /* tp_getattro */\r
+    0,                                                  /* tp_setattro */\r
+    0,                                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |\r
+    Py_TPFLAGS_BASETYPE,                                /* tp_flags */\r
+    date_doc,                                           /* tp_doc */\r
+    0,                                                  /* tp_traverse */\r
+    0,                                                  /* tp_clear */\r
+    (richcmpfunc)date_richcompare,                      /* tp_richcompare */\r
+    0,                                                  /* tp_weaklistoffset */\r
+    0,                                                  /* tp_iter */\r
+    0,                                                  /* tp_iternext */\r
+    date_methods,                                       /* tp_methods */\r
+    0,                                                  /* tp_members */\r
+    date_getset,                                        /* tp_getset */\r
+    0,                                                  /* tp_base */\r
+    0,                                                  /* tp_dict */\r
+    0,                                                  /* tp_descr_get */\r
+    0,                                                  /* tp_descr_set */\r
+    0,                                                  /* tp_dictoffset */\r
+    0,                                                  /* tp_init */\r
+    0,                                                  /* tp_alloc */\r
+    date_new,                                           /* tp_new */\r
+    0,                                                  /* tp_free */\r
+};\r
+\r
+/*\r
+ * PyDateTime_TZInfo implementation.\r
+ */\r
+\r
+/* This is a pure abstract base class, so doesn't do anything beyond\r
+ * raising NotImplemented exceptions.  Real tzinfo classes need\r
+ * to derive from this.  This is mostly for clarity, and for efficiency in\r
+ * datetime and time constructors (their tzinfo arguments need to\r
+ * be subclasses of this tzinfo class, which is easy and quick to check).\r
+ *\r
+ * Note:  For reasons having to do with pickling of subclasses, we have\r
+ * to allow tzinfo objects to be instantiated.  This wasn't an issue\r
+ * in the Python implementation (__init__() could raise NotImplementedError\r
+ * there without ill effect), but doing so in the C implementation hit a\r
+ * brick wall.\r
+ */\r
+\r
+static PyObject *\r
+tzinfo_nogo(const char* methodname)\r
+{\r
+    PyErr_Format(PyExc_NotImplementedError,\r
+                 "a tzinfo subclass must implement %s()",\r
+                 methodname);\r
+    return NULL;\r
+}\r
+\r
+/* Methods.  A subclass must implement these. */\r
+\r
+static PyObject *\r
+tzinfo_tzname(PyDateTime_TZInfo *self, PyObject *dt)\r
+{\r
+    return tzinfo_nogo("tzname");\r
+}\r
+\r
+static PyObject *\r
+tzinfo_utcoffset(PyDateTime_TZInfo *self, PyObject *dt)\r
+{\r
+    return tzinfo_nogo("utcoffset");\r
+}\r
+\r
+static PyObject *\r
+tzinfo_dst(PyDateTime_TZInfo *self, PyObject *dt)\r
+{\r
+    return tzinfo_nogo("dst");\r
+}\r
+\r
+static PyObject *\r
+tzinfo_fromutc(PyDateTime_TZInfo *self, PyDateTime_DateTime *dt)\r
+{\r
+    int y, m, d, hh, mm, ss, us;\r
+\r
+    PyObject *result;\r
+    int off, dst;\r
+    int none;\r
+    int delta;\r
+\r
+    if (! PyDateTime_Check(dt)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "fromutc: argument must be a datetime");\r
+        return NULL;\r
+    }\r
+    if (! HASTZINFO(dt) || dt->tzinfo != (PyObject *)self) {\r
+        PyErr_SetString(PyExc_ValueError, "fromutc: dt.tzinfo "\r
+                        "is not self");\r
+        return NULL;\r
+    }\r
+\r
+    off = call_utcoffset(dt->tzinfo, (PyObject *)dt, &none);\r
+    if (off == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (none) {\r
+        PyErr_SetString(PyExc_ValueError, "fromutc: non-None "\r
+                        "utcoffset() result required");\r
+        return NULL;\r
+    }\r
+\r
+    dst = call_dst(dt->tzinfo, (PyObject *)dt, &none);\r
+    if (dst == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (none) {\r
+        PyErr_SetString(PyExc_ValueError, "fromutc: non-None "\r
+                        "dst() result required");\r
+        return NULL;\r
+    }\r
+\r
+    y = GET_YEAR(dt);\r
+    m = GET_MONTH(dt);\r
+    d = GET_DAY(dt);\r
+    hh = DATE_GET_HOUR(dt);\r
+    mm = DATE_GET_MINUTE(dt);\r
+    ss = DATE_GET_SECOND(dt);\r
+    us = DATE_GET_MICROSECOND(dt);\r
+\r
+    delta = off - dst;\r
+    mm += delta;\r
+    if ((mm < 0 || mm >= 60) &&\r
+        normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)\r
+        return NULL;\r
+    result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo);\r
+    if (result == NULL)\r
+        return result;\r
+\r
+    dst = call_dst(dt->tzinfo, result, &none);\r
+    if (dst == -1 && PyErr_Occurred())\r
+        goto Fail;\r
+    if (none)\r
+        goto Inconsistent;\r
+    if (dst == 0)\r
+        return result;\r
+\r
+    mm += dst;\r
+    if ((mm < 0 || mm >= 60) &&\r
+        normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)\r
+        goto Fail;\r
+    Py_DECREF(result);\r
+    result = new_datetime(y, m, d, hh, mm, ss, us, dt->tzinfo);\r
+    return result;\r
+\r
+Inconsistent:\r
+    PyErr_SetString(PyExc_ValueError, "fromutc: tz.dst() gave"\r
+                    "inconsistent results; cannot convert");\r
+\r
+    /* fall thru to failure */\r
+Fail:\r
+    Py_DECREF(result);\r
+    return NULL;\r
+}\r
+\r
+/*\r
+ * Pickle support.  This is solely so that tzinfo subclasses can use\r
+ * pickling -- tzinfo itself is supposed to be uninstantiable.\r
+ */\r
+\r
+static PyObject *\r
+tzinfo_reduce(PyObject *self)\r
+{\r
+    PyObject *args, *state, *tmp;\r
+    PyObject *getinitargs, *getstate;\r
+\r
+    tmp = PyTuple_New(0);\r
+    if (tmp == NULL)\r
+        return NULL;\r
+\r
+    getinitargs = PyObject_GetAttrString(self, "__getinitargs__");\r
+    if (getinitargs != NULL) {\r
+        args = PyObject_CallObject(getinitargs, tmp);\r
+        Py_DECREF(getinitargs);\r
+        if (args == NULL) {\r
+            Py_DECREF(tmp);\r
+            return NULL;\r
+        }\r
+    }\r
+    else {\r
+        PyErr_Clear();\r
+        args = tmp;\r
+        Py_INCREF(args);\r
+    }\r
+\r
+    getstate = PyObject_GetAttrString(self, "__getstate__");\r
+    if (getstate != NULL) {\r
+        state = PyObject_CallObject(getstate, tmp);\r
+        Py_DECREF(getstate);\r
+        if (state == NULL) {\r
+            Py_DECREF(args);\r
+            Py_DECREF(tmp);\r
+            return NULL;\r
+        }\r
+    }\r
+    else {\r
+        PyObject **dictptr;\r
+        PyErr_Clear();\r
+        state = Py_None;\r
+        dictptr = _PyObject_GetDictPtr(self);\r
+        if (dictptr && *dictptr && PyDict_Size(*dictptr))\r
+            state = *dictptr;\r
+        Py_INCREF(state);\r
+    }\r
+\r
+    Py_DECREF(tmp);\r
+\r
+    if (state == Py_None) {\r
+        Py_DECREF(state);\r
+        return Py_BuildValue("(ON)", Py_TYPE(self), args);\r
+    }\r
+    else\r
+        return Py_BuildValue("(ONN)", Py_TYPE(self), args, state);\r
+}\r
+\r
+static PyMethodDef tzinfo_methods[] = {\r
+\r
+    {"tzname",          (PyCFunction)tzinfo_tzname,             METH_O,\r
+     PyDoc_STR("datetime -> string name of time zone.")},\r
+\r
+    {"utcoffset",       (PyCFunction)tzinfo_utcoffset,          METH_O,\r
+     PyDoc_STR("datetime -> minutes east of UTC (negative for "\r
+               "west of UTC).")},\r
+\r
+    {"dst",             (PyCFunction)tzinfo_dst,                METH_O,\r
+     PyDoc_STR("datetime -> DST offset in minutes east of UTC.")},\r
+\r
+    {"fromutc",         (PyCFunction)tzinfo_fromutc,            METH_O,\r
+     PyDoc_STR("datetime in UTC -> datetime in local time.")},\r
+\r
+    {"__reduce__",  (PyCFunction)tzinfo_reduce,             METH_NOARGS,\r
+     PyDoc_STR("-> (cls, state)")},\r
+\r
+    {NULL, NULL}\r
+};\r
+\r
+static char tzinfo_doc[] =\r
+PyDoc_STR("Abstract base class for time zone info objects.");\r
+\r
+statichere PyTypeObject PyDateTime_TZInfoType = {\r
+    PyObject_HEAD_INIT(NULL)\r
+    0,                                          /* ob_size */\r
+    "datetime.tzinfo",                          /* tp_name */\r
+    sizeof(PyDateTime_TZInfo),                  /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    0,                                          /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |\r
+    Py_TPFLAGS_BASETYPE,                        /* tp_flags */\r
+    tzinfo_doc,                                 /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    tzinfo_methods,                             /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    0,                                          /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    0,                                          /* tp_alloc */\r
+    PyType_GenericNew,                          /* tp_new */\r
+    0,                                          /* tp_free */\r
+};\r
+\r
+/*\r
+ * PyDateTime_Time implementation.\r
+ */\r
+\r
+/* Accessor properties.\r
+ */\r
+\r
+static PyObject *\r
+time_hour(PyDateTime_Time *self, void *unused)\r
+{\r
+    return PyInt_FromLong(TIME_GET_HOUR(self));\r
+}\r
+\r
+static PyObject *\r
+time_minute(PyDateTime_Time *self, void *unused)\r
+{\r
+    return PyInt_FromLong(TIME_GET_MINUTE(self));\r
+}\r
+\r
+/* The name time_second conflicted with some platform header file. */\r
+static PyObject *\r
+py_time_second(PyDateTime_Time *self, void *unused)\r
+{\r
+    return PyInt_FromLong(TIME_GET_SECOND(self));\r
+}\r
+\r
+static PyObject *\r
+time_microsecond(PyDateTime_Time *self, void *unused)\r
+{\r
+    return PyInt_FromLong(TIME_GET_MICROSECOND(self));\r
+}\r
+\r
+static PyObject *\r
+time_tzinfo(PyDateTime_Time *self, void *unused)\r
+{\r
+    PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyGetSetDef time_getset[] = {\r
+    {"hour",        (getter)time_hour},\r
+    {"minute",      (getter)time_minute},\r
+    {"second",      (getter)py_time_second},\r
+    {"microsecond", (getter)time_microsecond},\r
+    {"tzinfo",          (getter)time_tzinfo},\r
+    {NULL}\r
+};\r
+\r
+/*\r
+ * Constructors.\r
+ */\r
+\r
+static char *time_kws[] = {"hour", "minute", "second", "microsecond",\r
+                           "tzinfo", NULL};\r
+\r
+static PyObject *\r
+time_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self = NULL;\r
+    PyObject *state;\r
+    int hour = 0;\r
+    int minute = 0;\r
+    int second = 0;\r
+    int usecond = 0;\r
+    PyObject *tzinfo = Py_None;\r
+\r
+    /* Check for invocation from pickle with __getstate__ state */\r
+    if (PyTuple_GET_SIZE(args) >= 1 &&\r
+        PyTuple_GET_SIZE(args) <= 2 &&\r
+        PyString_Check(state = PyTuple_GET_ITEM(args, 0)) &&\r
+        PyString_GET_SIZE(state) == _PyDateTime_TIME_DATASIZE &&\r
+        ((unsigned char) (PyString_AS_STRING(state)[0])) < 24)\r
+    {\r
+        PyDateTime_Time *me;\r
+        char aware;\r
+\r
+        if (PyTuple_GET_SIZE(args) == 2) {\r
+            tzinfo = PyTuple_GET_ITEM(args, 1);\r
+            if (check_tzinfo_subclass(tzinfo) < 0) {\r
+                PyErr_SetString(PyExc_TypeError, "bad "\r
+                    "tzinfo state arg");\r
+                return NULL;\r
+            }\r
+        }\r
+        aware = (char)(tzinfo != Py_None);\r
+        me = (PyDateTime_Time *) (type->tp_alloc(type, aware));\r
+        if (me != NULL) {\r
+            char *pdata = PyString_AS_STRING(state);\r
+\r
+            memcpy(me->data, pdata, _PyDateTime_TIME_DATASIZE);\r
+            me->hashcode = -1;\r
+            me->hastzinfo = aware;\r
+            if (aware) {\r
+                Py_INCREF(tzinfo);\r
+                me->tzinfo = tzinfo;\r
+            }\r
+        }\r
+        return (PyObject *)me;\r
+    }\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO", time_kws,\r
+                                    &hour, &minute, &second, &usecond,\r
+                                    &tzinfo)) {\r
+        if (check_time_args(hour, minute, second, usecond) < 0)\r
+            return NULL;\r
+        if (check_tzinfo_subclass(tzinfo) < 0)\r
+            return NULL;\r
+        self = new_time_ex(hour, minute, second, usecond, tzinfo,\r
+                           type);\r
+    }\r
+    return self;\r
+}\r
+\r
+/*\r
+ * Destructor.\r
+ */\r
+\r
+static void\r
+time_dealloc(PyDateTime_Time *self)\r
+{\r
+    if (HASTZINFO(self)) {\r
+        Py_XDECREF(self->tzinfo);\r
+    }\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+/*\r
+ * Indirect access to tzinfo methods.\r
+ */\r
+\r
+/* These are all METH_NOARGS, so don't need to check the arglist. */\r
+static PyObject *\r
+time_utcoffset(PyDateTime_Time *self, PyObject *unused) {\r
+    return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                               "utcoffset", Py_None);\r
+}\r
+\r
+static PyObject *\r
+time_dst(PyDateTime_Time *self, PyObject *unused) {\r
+    return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                               "dst", Py_None);\r
+}\r
+\r
+static PyObject *\r
+time_tzname(PyDateTime_Time *self, PyObject *unused) {\r
+    return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                       Py_None);\r
+}\r
+\r
+/*\r
+ * Various ways to turn a time into a string.\r
+ */\r
+\r
+static PyObject *\r
+time_repr(PyDateTime_Time *self)\r
+{\r
+    char buffer[100];\r
+    const char *type_name = Py_TYPE(self)->tp_name;\r
+    int h = TIME_GET_HOUR(self);\r
+    int m = TIME_GET_MINUTE(self);\r
+    int s = TIME_GET_SECOND(self);\r
+    int us = TIME_GET_MICROSECOND(self);\r
+    PyObject *result = NULL;\r
+\r
+    if (us)\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d, %d, %d)", type_name, h, m, s, us);\r
+    else if (s)\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d, %d)", type_name, h, m, s);\r
+    else\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d)", type_name, h, m);\r
+    result = PyString_FromString(buffer);\r
+    if (result != NULL && HASTZINFO(self))\r
+        result = append_keyword_tzinfo(result, self->tzinfo);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+time_str(PyDateTime_Time *self)\r
+{\r
+    return PyObject_CallMethod((PyObject *)self, "isoformat", "()");\r
+}\r
+\r
+static PyObject *\r
+time_isoformat(PyDateTime_Time *self, PyObject *unused)\r
+{\r
+    char buf[100];\r
+    PyObject *result;\r
+    /* Reuse the time format code from the datetime type. */\r
+    PyDateTime_DateTime datetime;\r
+    PyDateTime_DateTime *pdatetime = &datetime;\r
+\r
+    /* Copy over just the time bytes. */\r
+    memcpy(pdatetime->data + _PyDateTime_DATE_DATASIZE,\r
+           self->data,\r
+           _PyDateTime_TIME_DATASIZE);\r
+\r
+    isoformat_time(pdatetime, buf, sizeof(buf));\r
+    result = PyString_FromString(buf);\r
+    if (result == NULL || ! HASTZINFO(self) || self->tzinfo == Py_None)\r
+        return result;\r
+\r
+    /* We need to append the UTC offset. */\r
+    if (format_utcoffset(buf, sizeof(buf), ":", self->tzinfo,\r
+                         Py_None) < 0) {\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+    PyString_ConcatAndDel(&result, PyString_FromString(buf));\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+time_strftime(PyDateTime_Time *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *result;\r
+    PyObject *tuple;\r
+    const char *format;\r
+    Py_ssize_t format_len;\r
+    static char *keywords[] = {"format", NULL};\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "s#:strftime", keywords,\r
+                                      &format, &format_len))\r
+        return NULL;\r
+\r
+    /* Python's strftime does insane things with the year part of the\r
+     * timetuple.  The year is forced to (the otherwise nonsensical)\r
+     * 1900 to worm around that.\r
+     */\r
+    tuple = Py_BuildValue("iiiiiiiii",\r
+                          1900, 1, 1, /* year, month, day */\r
+                  TIME_GET_HOUR(self),\r
+                  TIME_GET_MINUTE(self),\r
+                  TIME_GET_SECOND(self),\r
+                  0, 1, -1); /* weekday, daynum, dst */\r
+    if (tuple == NULL)\r
+        return NULL;\r
+    assert(PyTuple_Size(tuple) == 9);\r
+    result = wrap_strftime((PyObject *)self, format, format_len, tuple,\r
+                           Py_None);\r
+    Py_DECREF(tuple);\r
+    return result;\r
+}\r
+\r
+/*\r
+ * Miscellaneous methods.\r
+ */\r
+\r
+/* This is more natural as a tp_compare, but doesn't work then:  for whatever\r
+ * reason, Python's try_3way_compare ignores tp_compare unless\r
+ * PyInstance_Check returns true, but these aren't old-style classes.\r
+ */\r
+static PyObject *\r
+time_richcompare(PyDateTime_Time *self, PyObject *other, int op)\r
+{\r
+    int diff;\r
+    naivety n1, n2;\r
+    int offset1, offset2;\r
+\r
+    if (! PyTime_Check(other)) {\r
+        if (op == Py_EQ || op == Py_NE) {\r
+            PyObject *result = op == Py_EQ ? Py_False : Py_True;\r
+            Py_INCREF(result);\r
+            return result;\r
+        }\r
+        /* Stop this from falling back to address comparison. */\r
+        return cmperror((PyObject *)self, other);\r
+    }\r
+    if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1, Py_None,\r
+                                 other, &offset2, &n2, Py_None) < 0)\r
+        return NULL;\r
+    assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);\r
+    /* If they're both naive, or both aware and have the same offsets,\r
+     * we get off cheap.  Note that if they're both naive, offset1 ==\r
+     * offset2 == 0 at this point.\r
+     */\r
+    if (n1 == n2 && offset1 == offset2) {\r
+        diff = memcmp(self->data, ((PyDateTime_Time *)other)->data,\r
+                      _PyDateTime_TIME_DATASIZE);\r
+        return diff_to_bool(diff, op);\r
+    }\r
+\r
+    if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) {\r
+        assert(offset1 != offset2);             /* else last "if" handled it */\r
+        /* Convert everything except microseconds to seconds.  These\r
+         * can't overflow (no more than the # of seconds in 2 days).\r
+         */\r
+        offset1 = TIME_GET_HOUR(self) * 3600 +\r
+                  (TIME_GET_MINUTE(self) - offset1) * 60 +\r
+                  TIME_GET_SECOND(self);\r
+        offset2 = TIME_GET_HOUR(other) * 3600 +\r
+                  (TIME_GET_MINUTE(other) - offset2) * 60 +\r
+                  TIME_GET_SECOND(other);\r
+        diff = offset1 - offset2;\r
+        if (diff == 0)\r
+            diff = TIME_GET_MICROSECOND(self) -\r
+                   TIME_GET_MICROSECOND(other);\r
+        return diff_to_bool(diff, op);\r
+    }\r
+\r
+    assert(n1 != n2);\r
+    PyErr_SetString(PyExc_TypeError,\r
+                    "can't compare offset-naive and "\r
+                    "offset-aware times");\r
+    return NULL;\r
+}\r
+\r
+static long\r
+time_hash(PyDateTime_Time *self)\r
+{\r
+    if (self->hashcode == -1) {\r
+        naivety n;\r
+        int offset;\r
+        PyObject *temp;\r
+\r
+        n = classify_utcoffset((PyObject *)self, Py_None, &offset);\r
+        assert(n != OFFSET_UNKNOWN);\r
+        if (n == OFFSET_ERROR)\r
+            return -1;\r
+\r
+        /* Reduce this to a hash of another object. */\r
+        if (offset == 0)\r
+            temp = PyString_FromStringAndSize((char *)self->data,\r
+                                    _PyDateTime_TIME_DATASIZE);\r
+        else {\r
+            int hour;\r
+            int minute;\r
+\r
+            assert(n == OFFSET_AWARE);\r
+            assert(HASTZINFO(self));\r
+            hour = divmod(TIME_GET_HOUR(self) * 60 +\r
+                            TIME_GET_MINUTE(self) - offset,\r
+                          60,\r
+                          &minute);\r
+            if (0 <= hour && hour < 24)\r
+                temp = new_time(hour, minute,\r
+                                TIME_GET_SECOND(self),\r
+                                TIME_GET_MICROSECOND(self),\r
+                                Py_None);\r
+            else\r
+                temp = Py_BuildValue("iiii",\r
+                           hour, minute,\r
+                           TIME_GET_SECOND(self),\r
+                           TIME_GET_MICROSECOND(self));\r
+        }\r
+        if (temp != NULL) {\r
+            self->hashcode = PyObject_Hash(temp);\r
+            Py_DECREF(temp);\r
+        }\r
+    }\r
+    return self->hashcode;\r
+}\r
+\r
+static PyObject *\r
+time_replace(PyDateTime_Time *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *clone;\r
+    PyObject *tuple;\r
+    int hh = TIME_GET_HOUR(self);\r
+    int mm = TIME_GET_MINUTE(self);\r
+    int ss = TIME_GET_SECOND(self);\r
+    int us = TIME_GET_MICROSECOND(self);\r
+    PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiO:replace",\r
+                                      time_kws,\r
+                                      &hh, &mm, &ss, &us, &tzinfo))\r
+        return NULL;\r
+    tuple = Py_BuildValue("iiiiO", hh, mm, ss, us, tzinfo);\r
+    if (tuple == NULL)\r
+        return NULL;\r
+    clone = time_new(Py_TYPE(self), tuple, NULL);\r
+    Py_DECREF(tuple);\r
+    return clone;\r
+}\r
+\r
+static int\r
+time_nonzero(PyDateTime_Time *self)\r
+{\r
+    int offset;\r
+    int none;\r
+\r
+    if (TIME_GET_SECOND(self) || TIME_GET_MICROSECOND(self)) {\r
+        /* Since utcoffset is in whole minutes, nothing can\r
+         * alter the conclusion that this is nonzero.\r
+         */\r
+        return 1;\r
+    }\r
+    offset = 0;\r
+    if (HASTZINFO(self) && self->tzinfo != Py_None) {\r
+        offset = call_utcoffset(self->tzinfo, Py_None, &none);\r
+        if (offset == -1 && PyErr_Occurred())\r
+            return -1;\r
+    }\r
+    return (TIME_GET_MINUTE(self) - offset + TIME_GET_HOUR(self)*60) != 0;\r
+}\r
+\r
+/* Pickle support, a simple use of __reduce__. */\r
+\r
+/* Let basestate be the non-tzinfo data string.\r
+ * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).\r
+ * So it's a tuple in any (non-error) case.\r
+ * __getstate__ isn't exposed.\r
+ */\r
+static PyObject *\r
+time_getstate(PyDateTime_Time *self)\r
+{\r
+    PyObject *basestate;\r
+    PyObject *result = NULL;\r
+\r
+    basestate =  PyString_FromStringAndSize((char *)self->data,\r
+                                            _PyDateTime_TIME_DATASIZE);\r
+    if (basestate != NULL) {\r
+        if (! HASTZINFO(self) || self->tzinfo == Py_None)\r
+            result = PyTuple_Pack(1, basestate);\r
+        else\r
+            result = PyTuple_Pack(2, basestate, self->tzinfo);\r
+        Py_DECREF(basestate);\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+time_reduce(PyDateTime_Time *self, PyObject *arg)\r
+{\r
+    return Py_BuildValue("(ON)", Py_TYPE(self), time_getstate(self));\r
+}\r
+\r
+static PyMethodDef time_methods[] = {\r
+\r
+    {"isoformat",   (PyCFunction)time_isoformat,        METH_NOARGS,\r
+     PyDoc_STR("Return string in ISO 8601 format, HH:MM:SS[.mmmmmm]"\r
+               "[+HH:MM].")},\r
+\r
+    {"strftime",        (PyCFunction)time_strftime,     METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("format -> strftime() style string.")},\r
+\r
+    {"__format__",      (PyCFunction)date_format,       METH_VARARGS,\r
+     PyDoc_STR("Formats self with strftime.")},\r
+\r
+    {"utcoffset",       (PyCFunction)time_utcoffset,    METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.utcoffset(self).")},\r
+\r
+    {"tzname",          (PyCFunction)time_tzname,       METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.tzname(self).")},\r
+\r
+    {"dst",             (PyCFunction)time_dst,          METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.dst(self).")},\r
+\r
+    {"replace",     (PyCFunction)time_replace,          METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("Return time with new specified fields.")},\r
+\r
+    {"__reduce__", (PyCFunction)time_reduce,        METH_NOARGS,\r
+     PyDoc_STR("__reduce__() -> (cls, state)")},\r
+\r
+    {NULL,      NULL}\r
+};\r
+\r
+static char time_doc[] =\r
+PyDoc_STR("time([hour[, minute[, second[, microsecond[, tzinfo]]]]]) --> a time object\n\\r
+\n\\r
+All arguments are optional. tzinfo may be None, or an instance of\n\\r
+a tzinfo subclass. The remaining arguments may be ints or longs.\n");\r
+\r
+static PyNumberMethods time_as_number = {\r
+    0,                                          /* nb_add */\r
+    0,                                          /* nb_subtract */\r
+    0,                                          /* nb_multiply */\r
+    0,                                          /* nb_divide */\r
+    0,                                          /* nb_remainder */\r
+    0,                                          /* nb_divmod */\r
+    0,                                          /* nb_power */\r
+    0,                                          /* nb_negative */\r
+    0,                                          /* nb_positive */\r
+    0,                                          /* nb_absolute */\r
+    (inquiry)time_nonzero,                      /* nb_nonzero */\r
+};\r
+\r
+statichere PyTypeObject PyDateTime_TimeType = {\r
+    PyObject_HEAD_INIT(NULL)\r
+    0,                                          /* ob_size */\r
+    "datetime.time",                            /* tp_name */\r
+    sizeof(PyDateTime_Time),                    /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    (destructor)time_dealloc,                   /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    (reprfunc)time_repr,                        /* tp_repr */\r
+    &time_as_number,                            /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    (hashfunc)time_hash,                        /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    (reprfunc)time_str,                         /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |\r
+    Py_TPFLAGS_BASETYPE,                        /* tp_flags */\r
+    time_doc,                                   /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    (richcmpfunc)time_richcompare,              /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    time_methods,                               /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    time_getset,                                /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    time_alloc,                                 /* tp_alloc */\r
+    time_new,                                   /* tp_new */\r
+    0,                                          /* tp_free */\r
+};\r
+\r
+/*\r
+ * PyDateTime_DateTime implementation.\r
+ */\r
+\r
+/* Accessor properties.  Properties for day, month, and year are inherited\r
+ * from date.\r
+ */\r
+\r
+static PyObject *\r
+datetime_hour(PyDateTime_DateTime *self, void *unused)\r
+{\r
+    return PyInt_FromLong(DATE_GET_HOUR(self));\r
+}\r
+\r
+static PyObject *\r
+datetime_minute(PyDateTime_DateTime *self, void *unused)\r
+{\r
+    return PyInt_FromLong(DATE_GET_MINUTE(self));\r
+}\r
+\r
+static PyObject *\r
+datetime_second(PyDateTime_DateTime *self, void *unused)\r
+{\r
+    return PyInt_FromLong(DATE_GET_SECOND(self));\r
+}\r
+\r
+static PyObject *\r
+datetime_microsecond(PyDateTime_DateTime *self, void *unused)\r
+{\r
+    return PyInt_FromLong(DATE_GET_MICROSECOND(self));\r
+}\r
+\r
+static PyObject *\r
+datetime_tzinfo(PyDateTime_DateTime *self, void *unused)\r
+{\r
+    PyObject *result = HASTZINFO(self) ? self->tzinfo : Py_None;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyGetSetDef datetime_getset[] = {\r
+    {"hour",        (getter)datetime_hour},\r
+    {"minute",      (getter)datetime_minute},\r
+    {"second",      (getter)datetime_second},\r
+    {"microsecond", (getter)datetime_microsecond},\r
+    {"tzinfo",          (getter)datetime_tzinfo},\r
+    {NULL}\r
+};\r
+\r
+/*\r
+ * Constructors.\r
+ */\r
+\r
+static char *datetime_kws[] = {\r
+    "year", "month", "day", "hour", "minute", "second",\r
+    "microsecond", "tzinfo", NULL\r
+};\r
+\r
+static PyObject *\r
+datetime_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self = NULL;\r
+    PyObject *state;\r
+    int year;\r
+    int month;\r
+    int day;\r
+    int hour = 0;\r
+    int minute = 0;\r
+    int second = 0;\r
+    int usecond = 0;\r
+    PyObject *tzinfo = Py_None;\r
+\r
+    /* Check for invocation from pickle with __getstate__ state */\r
+    if (PyTuple_GET_SIZE(args) >= 1 &&\r
+        PyTuple_GET_SIZE(args) <= 2 &&\r
+        PyString_Check(state = PyTuple_GET_ITEM(args, 0)) &&\r
+        PyString_GET_SIZE(state) == _PyDateTime_DATETIME_DATASIZE &&\r
+        MONTH_IS_SANE(PyString_AS_STRING(state)[2]))\r
+    {\r
+        PyDateTime_DateTime *me;\r
+        char aware;\r
+\r
+        if (PyTuple_GET_SIZE(args) == 2) {\r
+            tzinfo = PyTuple_GET_ITEM(args, 1);\r
+            if (check_tzinfo_subclass(tzinfo) < 0) {\r
+                PyErr_SetString(PyExc_TypeError, "bad "\r
+                    "tzinfo state arg");\r
+                return NULL;\r
+            }\r
+        }\r
+        aware = (char)(tzinfo != Py_None);\r
+        me = (PyDateTime_DateTime *) (type->tp_alloc(type , aware));\r
+        if (me != NULL) {\r
+            char *pdata = PyString_AS_STRING(state);\r
+\r
+            memcpy(me->data, pdata, _PyDateTime_DATETIME_DATASIZE);\r
+            me->hashcode = -1;\r
+            me->hastzinfo = aware;\r
+            if (aware) {\r
+                Py_INCREF(tzinfo);\r
+                me->tzinfo = tzinfo;\r
+            }\r
+        }\r
+        return (PyObject *)me;\r
+    }\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, "iii|iiiiO", datetime_kws,\r
+                                    &year, &month, &day, &hour, &minute,\r
+                                    &second, &usecond, &tzinfo)) {\r
+        if (check_date_args(year, month, day) < 0)\r
+            return NULL;\r
+        if (check_time_args(hour, minute, second, usecond) < 0)\r
+            return NULL;\r
+        if (check_tzinfo_subclass(tzinfo) < 0)\r
+            return NULL;\r
+        self = new_datetime_ex(year, month, day,\r
+                                hour, minute, second, usecond,\r
+                                tzinfo, type);\r
+    }\r
+    return self;\r
+}\r
+\r
+/* TM_FUNC is the shared type of localtime() and gmtime(). */\r
+typedef struct tm *(*TM_FUNC)(const time_t *timer);\r
+\r
+/* Internal helper.\r
+ * Build datetime from a time_t and a distinct count of microseconds.\r
+ * Pass localtime or gmtime for f, to control the interpretation of timet.\r
+ */\r
+static PyObject *\r
+datetime_from_timet_and_us(PyObject *cls, TM_FUNC f, time_t timet, int us,\r
+                           PyObject *tzinfo)\r
+{\r
+    struct tm *tm;\r
+    PyObject *result = NULL;\r
+\r
+    tm = f(&timet);\r
+    if (tm) {\r
+        /* The platform localtime/gmtime may insert leap seconds,\r
+         * indicated by tm->tm_sec > 59.  We don't care about them,\r
+         * except to the extent that passing them on to the datetime\r
+         * constructor would raise ValueError for a reason that\r
+         * made no sense to the user.\r
+         */\r
+        if (tm->tm_sec > 59)\r
+            tm->tm_sec = 59;\r
+        result = PyObject_CallFunction(cls, "iiiiiiiO",\r
+                                       tm->tm_year + 1900,\r
+                                       tm->tm_mon + 1,\r
+                                       tm->tm_mday,\r
+                                       tm->tm_hour,\r
+                                       tm->tm_min,\r
+                                       tm->tm_sec,\r
+                                       us,\r
+                                       tzinfo);\r
+    }\r
+    else\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "timestamp out of range for "\r
+                        "platform localtime()/gmtime() function");\r
+    return result;\r
+}\r
+\r
+/* Internal helper.\r
+ * Build datetime from a Python timestamp.  Pass localtime or gmtime for f,\r
+ * to control the interpretation of the timestamp.  Since a double doesn't\r
+ * have enough bits to cover a datetime's full range of precision, it's\r
+ * better to call datetime_from_timet_and_us provided you have a way\r
+ * to get that much precision (e.g., C time() isn't good enough).\r
+ */\r
+static PyObject *\r
+datetime_from_timestamp(PyObject *cls, TM_FUNC f, double timestamp,\r
+                        PyObject *tzinfo)\r
+{\r
+    time_t timet;\r
+    double fraction;\r
+    int us;\r
+\r
+    timet = _PyTime_DoubleToTimet(timestamp);\r
+    if (timet == (time_t)-1 && PyErr_Occurred())\r
+        return NULL;\r
+    fraction = timestamp - (double)timet;\r
+    us = (int)round_to_long(fraction * 1e6);\r
+    if (us < 0) {\r
+        /* Truncation towards zero is not what we wanted\r
+           for negative numbers (Python's mod semantics) */\r
+        timet -= 1;\r
+        us += 1000000;\r
+    }\r
+    /* If timestamp is less than one microsecond smaller than a\r
+     * full second, round up. Otherwise, ValueErrors are raised\r
+     * for some floats. */\r
+    if (us == 1000000) {\r
+        timet += 1;\r
+        us = 0;\r
+    }\r
+    return datetime_from_timet_and_us(cls, f, timet, us, tzinfo);\r
+}\r
+\r
+/* Internal helper.\r
+ * Build most accurate possible datetime for current time.  Pass localtime or\r
+ * gmtime for f as appropriate.\r
+ */\r
+static PyObject *\r
+datetime_best_possible(PyObject *cls, TM_FUNC f, PyObject *tzinfo)\r
+{\r
+#ifdef HAVE_GETTIMEOFDAY\r
+    struct timeval t;\r
+\r
+#ifdef GETTIMEOFDAY_NO_TZ\r
+    gettimeofday(&t);\r
+#else\r
+    gettimeofday(&t, (struct timezone *)NULL);\r
+#endif\r
+    return datetime_from_timet_and_us(cls, f, t.tv_sec, (int)t.tv_usec,\r
+                                      tzinfo);\r
+\r
+#else   /* ! HAVE_GETTIMEOFDAY */\r
+    /* No flavor of gettimeofday exists on this platform.  Python's\r
+     * time.time() does a lot of other platform tricks to get the\r
+     * best time it can on the platform, and we're not going to do\r
+     * better than that (if we could, the better code would belong\r
+     * in time.time()!)  We're limited by the precision of a double,\r
+     * though.\r
+     */\r
+    PyObject *time;\r
+    double dtime;\r
+\r
+    time = time_time();\r
+    if (time == NULL)\r
+        return NULL;\r
+    dtime = PyFloat_AsDouble(time);\r
+    Py_DECREF(time);\r
+    if (dtime == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return datetime_from_timestamp(cls, f, dtime, tzinfo);\r
+#endif  /* ! HAVE_GETTIMEOFDAY */\r
+}\r
+\r
+/* Return best possible local time -- this isn't constrained by the\r
+ * precision of a timestamp.\r
+ */\r
+static PyObject *\r
+datetime_now(PyObject *cls, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self;\r
+    PyObject *tzinfo = Py_None;\r
+    static char *keywords[] = {"tz", NULL};\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "|O:now", keywords,\r
+                                      &tzinfo))\r
+        return NULL;\r
+    if (check_tzinfo_subclass(tzinfo) < 0)\r
+        return NULL;\r
+\r
+    self = datetime_best_possible(cls,\r
+                                  tzinfo == Py_None ? localtime : gmtime,\r
+                                  tzinfo);\r
+    if (self != NULL && tzinfo != Py_None) {\r
+        /* Convert UTC to tzinfo's zone. */\r
+        PyObject *temp = self;\r
+        self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);\r
+        Py_DECREF(temp);\r
+    }\r
+    return self;\r
+}\r
+\r
+/* Return best possible UTC time -- this isn't constrained by the\r
+ * precision of a timestamp.\r
+ */\r
+static PyObject *\r
+datetime_utcnow(PyObject *cls, PyObject *dummy)\r
+{\r
+    return datetime_best_possible(cls, gmtime, Py_None);\r
+}\r
+\r
+/* Return new local datetime from timestamp (Python timestamp -- a double). */\r
+static PyObject *\r
+datetime_fromtimestamp(PyObject *cls, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *self;\r
+    double timestamp;\r
+    PyObject *tzinfo = Py_None;\r
+    static char *keywords[] = {"timestamp", "tz", NULL};\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "d|O:fromtimestamp",\r
+                                      keywords, &timestamp, &tzinfo))\r
+        return NULL;\r
+    if (check_tzinfo_subclass(tzinfo) < 0)\r
+        return NULL;\r
+\r
+    self = datetime_from_timestamp(cls,\r
+                                   tzinfo == Py_None ? localtime : gmtime,\r
+                                   timestamp,\r
+                                   tzinfo);\r
+    if (self != NULL && tzinfo != Py_None) {\r
+        /* Convert UTC to tzinfo's zone. */\r
+        PyObject *temp = self;\r
+        self = PyObject_CallMethod(tzinfo, "fromutc", "O", self);\r
+        Py_DECREF(temp);\r
+    }\r
+    return self;\r
+}\r
+\r
+/* Return new UTC datetime from timestamp (Python timestamp -- a double). */\r
+static PyObject *\r
+datetime_utcfromtimestamp(PyObject *cls, PyObject *args)\r
+{\r
+    double timestamp;\r
+    PyObject *result = NULL;\r
+\r
+    if (PyArg_ParseTuple(args, "d:utcfromtimestamp", &timestamp))\r
+        result = datetime_from_timestamp(cls, gmtime, timestamp,\r
+                                         Py_None);\r
+    return result;\r
+}\r
+\r
+/* Return new datetime from time.strptime(). */\r
+static PyObject *\r
+datetime_strptime(PyObject *cls, PyObject *args)\r
+{\r
+    static PyObject *module = NULL;\r
+    PyObject *result = NULL, *obj, *st = NULL, *frac = NULL;\r
+    const char *string, *format;\r
+\r
+    if (!PyArg_ParseTuple(args, "ss:strptime", &string, &format))\r
+        return NULL;\r
+\r
+    if (module == NULL &&\r
+        (module = PyImport_ImportModuleNoBlock("_strptime")) == NULL)\r
+        return NULL;\r
+\r
+    /* _strptime._strptime returns a two-element tuple.  The first\r
+       element is a time.struct_time object.  The second is the\r
+       microseconds (which are not defined for time.struct_time). */\r
+    obj = PyObject_CallMethod(module, "_strptime", "ss", string, format);\r
+    if (obj != NULL) {\r
+        int i, good_timetuple = 1;\r
+        long int ia[7];\r
+        if (PySequence_Check(obj) && PySequence_Size(obj) == 2) {\r
+            st = PySequence_GetItem(obj, 0);\r
+            frac = PySequence_GetItem(obj, 1);\r
+            if (st == NULL || frac == NULL)\r
+                good_timetuple = 0;\r
+            /* copy y/m/d/h/m/s values out of the\r
+               time.struct_time */\r
+            if (good_timetuple &&\r
+                PySequence_Check(st) &&\r
+                PySequence_Size(st) >= 6) {\r
+                for (i=0; i < 6; i++) {\r
+                    PyObject *p = PySequence_GetItem(st, i);\r
+                    if (p == NULL) {\r
+                        good_timetuple = 0;\r
+                        break;\r
+                    }\r
+                    if (PyInt_Check(p))\r
+                        ia[i] = PyInt_AsLong(p);\r
+                    else\r
+                        good_timetuple = 0;\r
+                    Py_DECREF(p);\r
+                }\r
+            }\r
+            else\r
+                good_timetuple = 0;\r
+            /* follow that up with a little dose of microseconds */\r
+            if (good_timetuple && PyInt_Check(frac))\r
+                ia[6] = PyInt_AsLong(frac);\r
+            else\r
+                good_timetuple = 0;\r
+        }\r
+        else\r
+            good_timetuple = 0;\r
+        if (good_timetuple)\r
+            result = PyObject_CallFunction(cls, "iiiiiii",\r
+                                           ia[0], ia[1], ia[2],\r
+                                           ia[3], ia[4], ia[5],\r
+                                           ia[6]);\r
+        else\r
+            PyErr_SetString(PyExc_ValueError,\r
+                "unexpected value from _strptime._strptime");\r
+    }\r
+    Py_XDECREF(obj);\r
+    Py_XDECREF(st);\r
+    Py_XDECREF(frac);\r
+    return result;\r
+}\r
+\r
+/* Return new datetime from date/datetime and time arguments. */\r
+static PyObject *\r
+datetime_combine(PyObject *cls, PyObject *args, PyObject *kw)\r
+{\r
+    static char *keywords[] = {"date", "time", NULL};\r
+    PyObject *date;\r
+    PyObject *time;\r
+    PyObject *result = NULL;\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, "O!O!:combine", keywords,\r
+                                    &PyDateTime_DateType, &date,\r
+                                    &PyDateTime_TimeType, &time)) {\r
+        PyObject *tzinfo = Py_None;\r
+\r
+        if (HASTZINFO(time))\r
+            tzinfo = ((PyDateTime_Time *)time)->tzinfo;\r
+        result = PyObject_CallFunction(cls, "iiiiiiiO",\r
+                                        GET_YEAR(date),\r
+                                        GET_MONTH(date),\r
+                                        GET_DAY(date),\r
+                                        TIME_GET_HOUR(time),\r
+                                        TIME_GET_MINUTE(time),\r
+                                        TIME_GET_SECOND(time),\r
+                                        TIME_GET_MICROSECOND(time),\r
+                                        tzinfo);\r
+    }\r
+    return result;\r
+}\r
+\r
+/*\r
+ * Destructor.\r
+ */\r
+\r
+static void\r
+datetime_dealloc(PyDateTime_DateTime *self)\r
+{\r
+    if (HASTZINFO(self)) {\r
+        Py_XDECREF(self->tzinfo);\r
+    }\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+/*\r
+ * Indirect access to tzinfo methods.\r
+ */\r
+\r
+/* These are all METH_NOARGS, so don't need to check the arglist. */\r
+static PyObject *\r
+datetime_utcoffset(PyDateTime_DateTime *self, PyObject *unused) {\r
+    return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                               "utcoffset", (PyObject *)self);\r
+}\r
+\r
+static PyObject *\r
+datetime_dst(PyDateTime_DateTime *self, PyObject *unused) {\r
+    return offset_as_timedelta(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                               "dst", (PyObject *)self);\r
+}\r
+\r
+static PyObject *\r
+datetime_tzname(PyDateTime_DateTime *self, PyObject *unused) {\r
+    return call_tzname(HASTZINFO(self) ? self->tzinfo : Py_None,\r
+                       (PyObject *)self);\r
+}\r
+\r
+/*\r
+ * datetime arithmetic.\r
+ */\r
+\r
+/* factor must be 1 (to add) or -1 (to subtract).  The result inherits\r
+ * the tzinfo state of date.\r
+ */\r
+static PyObject *\r
+add_datetime_timedelta(PyDateTime_DateTime *date, PyDateTime_Delta *delta,\r
+                       int factor)\r
+{\r
+    /* Note that the C-level additions can't overflow, because of\r
+     * invariant bounds on the member values.\r
+     */\r
+    int year = GET_YEAR(date);\r
+    int month = GET_MONTH(date);\r
+    int day = GET_DAY(date) + GET_TD_DAYS(delta) * factor;\r
+    int hour = DATE_GET_HOUR(date);\r
+    int minute = DATE_GET_MINUTE(date);\r
+    int second = DATE_GET_SECOND(date) + GET_TD_SECONDS(delta) * factor;\r
+    int microsecond = DATE_GET_MICROSECOND(date) +\r
+                      GET_TD_MICROSECONDS(delta) * factor;\r
+\r
+    assert(factor == 1 || factor == -1);\r
+    if (normalize_datetime(&year, &month, &day,\r
+                           &hour, &minute, &second, &microsecond) < 0)\r
+        return NULL;\r
+    else\r
+        return new_datetime(year, month, day,\r
+                            hour, minute, second, microsecond,\r
+                            HASTZINFO(date) ? date->tzinfo : Py_None);\r
+}\r
+\r
+static PyObject *\r
+datetime_add(PyObject *left, PyObject *right)\r
+{\r
+    if (PyDateTime_Check(left)) {\r
+        /* datetime + ??? */\r
+        if (PyDelta_Check(right))\r
+            /* datetime + delta */\r
+            return add_datetime_timedelta(\r
+                            (PyDateTime_DateTime *)left,\r
+                            (PyDateTime_Delta *)right,\r
+                            1);\r
+    }\r
+    else if (PyDelta_Check(left)) {\r
+        /* delta + datetime */\r
+        return add_datetime_timedelta((PyDateTime_DateTime *) right,\r
+                                      (PyDateTime_Delta *) left,\r
+                                      1);\r
+    }\r
+    Py_INCREF(Py_NotImplemented);\r
+    return Py_NotImplemented;\r
+}\r
+\r
+static PyObject *\r
+datetime_subtract(PyObject *left, PyObject *right)\r
+{\r
+    PyObject *result = Py_NotImplemented;\r
+\r
+    if (PyDateTime_Check(left)) {\r
+        /* datetime - ??? */\r
+        if (PyDateTime_Check(right)) {\r
+            /* datetime - datetime */\r
+            naivety n1, n2;\r
+            int offset1, offset2;\r
+            int delta_d, delta_s, delta_us;\r
+\r
+            if (classify_two_utcoffsets(left, &offset1, &n1, left,\r
+                                        right, &offset2, &n2,\r
+                                        right) < 0)\r
+                return NULL;\r
+            assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);\r
+            if (n1 != n2) {\r
+                PyErr_SetString(PyExc_TypeError,\r
+                    "can't subtract offset-naive and "\r
+                    "offset-aware datetimes");\r
+                return NULL;\r
+            }\r
+            delta_d = ymd_to_ord(GET_YEAR(left),\r
+                                 GET_MONTH(left),\r
+                                 GET_DAY(left)) -\r
+                      ymd_to_ord(GET_YEAR(right),\r
+                                 GET_MONTH(right),\r
+                                 GET_DAY(right));\r
+            /* These can't overflow, since the values are\r
+             * normalized.  At most this gives the number of\r
+             * seconds in one day.\r
+             */\r
+            delta_s = (DATE_GET_HOUR(left) -\r
+                       DATE_GET_HOUR(right)) * 3600 +\r
+                      (DATE_GET_MINUTE(left) -\r
+                       DATE_GET_MINUTE(right)) * 60 +\r
+                      (DATE_GET_SECOND(left) -\r
+                       DATE_GET_SECOND(right));\r
+            delta_us = DATE_GET_MICROSECOND(left) -\r
+                       DATE_GET_MICROSECOND(right);\r
+            /* (left - offset1) - (right - offset2) =\r
+             * (left - right) + (offset2 - offset1)\r
+             */\r
+            delta_s += (offset2 - offset1) * 60;\r
+            result = new_delta(delta_d, delta_s, delta_us, 1);\r
+        }\r
+        else if (PyDelta_Check(right)) {\r
+            /* datetime - delta */\r
+            result = add_datetime_timedelta(\r
+                            (PyDateTime_DateTime *)left,\r
+                            (PyDateTime_Delta *)right,\r
+                            -1);\r
+        }\r
+    }\r
+\r
+    if (result == Py_NotImplemented)\r
+        Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+/* Various ways to turn a datetime into a string. */\r
+\r
+static PyObject *\r
+datetime_repr(PyDateTime_DateTime *self)\r
+{\r
+    char buffer[1000];\r
+    const char *type_name = Py_TYPE(self)->tp_name;\r
+    PyObject *baserepr;\r
+\r
+    if (DATE_GET_MICROSECOND(self)) {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d, %d, %d, %d, %d, %d)",\r
+                      type_name,\r
+                      GET_YEAR(self), GET_MONTH(self), GET_DAY(self),\r
+                      DATE_GET_HOUR(self), DATE_GET_MINUTE(self),\r
+                      DATE_GET_SECOND(self),\r
+                      DATE_GET_MICROSECOND(self));\r
+    }\r
+    else if (DATE_GET_SECOND(self)) {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d, %d, %d, %d, %d)",\r
+                      type_name,\r
+                      GET_YEAR(self), GET_MONTH(self), GET_DAY(self),\r
+                      DATE_GET_HOUR(self), DATE_GET_MINUTE(self),\r
+                      DATE_GET_SECOND(self));\r
+    }\r
+    else {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "%s(%d, %d, %d, %d, %d)",\r
+                      type_name,\r
+                      GET_YEAR(self), GET_MONTH(self), GET_DAY(self),\r
+                      DATE_GET_HOUR(self), DATE_GET_MINUTE(self));\r
+    }\r
+    baserepr = PyString_FromString(buffer);\r
+    if (baserepr == NULL || ! HASTZINFO(self))\r
+        return baserepr;\r
+    return append_keyword_tzinfo(baserepr, self->tzinfo);\r
+}\r
+\r
+static PyObject *\r
+datetime_str(PyDateTime_DateTime *self)\r
+{\r
+    return PyObject_CallMethod((PyObject *)self, "isoformat", "(s)", " ");\r
+}\r
+\r
+static PyObject *\r
+datetime_isoformat(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)\r
+{\r
+    char sep = 'T';\r
+    static char *keywords[] = {"sep", NULL};\r
+    char buffer[100];\r
+    char *cp;\r
+    PyObject *result;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "|c:isoformat", keywords,\r
+                                     &sep))\r
+        return NULL;\r
+    cp = isoformat_date((PyDateTime_Date *)self, buffer, sizeof(buffer));\r
+    assert(cp != NULL);\r
+    *cp++ = sep;\r
+    cp = isoformat_time(self, cp, sizeof(buffer) - (cp - buffer));\r
+    result = PyString_FromStringAndSize(buffer, cp - buffer);\r
+    if (result == NULL || ! HASTZINFO(self))\r
+        return result;\r
+\r
+    /* We need to append the UTC offset. */\r
+    if (format_utcoffset(buffer, sizeof(buffer), ":", self->tzinfo,\r
+                         (PyObject *)self) < 0) {\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+    PyString_ConcatAndDel(&result, PyString_FromString(buffer));\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+datetime_ctime(PyDateTime_DateTime *self)\r
+{\r
+    return format_ctime((PyDateTime_Date *)self,\r
+                        DATE_GET_HOUR(self),\r
+                        DATE_GET_MINUTE(self),\r
+                        DATE_GET_SECOND(self));\r
+}\r
+\r
+/* Miscellaneous methods. */\r
+\r
+/* This is more natural as a tp_compare, but doesn't work then:  for whatever\r
+ * reason, Python's try_3way_compare ignores tp_compare unless\r
+ * PyInstance_Check returns true, but these aren't old-style classes.\r
+ */\r
+static PyObject *\r
+datetime_richcompare(PyDateTime_DateTime *self, PyObject *other, int op)\r
+{\r
+    int diff;\r
+    naivety n1, n2;\r
+    int offset1, offset2;\r
+\r
+    if (! PyDateTime_Check(other)) {\r
+        /* If other has a "timetuple" attr, that's an advertised\r
+         * hook for other classes to ask to get comparison control.\r
+         * However, date instances have a timetuple attr, and we\r
+         * don't want to allow that comparison.  Because datetime\r
+         * is a subclass of date, when mixing date and datetime\r
+         * in a comparison, Python gives datetime the first shot\r
+         * (it's the more specific subtype).  So we can stop that\r
+         * combination here reliably.\r
+         */\r
+        if (PyObject_HasAttrString(other, "timetuple") &&\r
+            ! PyDate_Check(other)) {\r
+            /* A hook for other kinds of datetime objects. */\r
+            Py_INCREF(Py_NotImplemented);\r
+            return Py_NotImplemented;\r
+        }\r
+        if (op == Py_EQ || op == Py_NE) {\r
+            PyObject *result = op == Py_EQ ? Py_False : Py_True;\r
+            Py_INCREF(result);\r
+            return result;\r
+        }\r
+        /* Stop this from falling back to address comparison. */\r
+        return cmperror((PyObject *)self, other);\r
+    }\r
+\r
+    if (classify_two_utcoffsets((PyObject *)self, &offset1, &n1,\r
+                                (PyObject *)self,\r
+                                 other, &offset2, &n2,\r
+                                 other) < 0)\r
+        return NULL;\r
+    assert(n1 != OFFSET_UNKNOWN && n2 != OFFSET_UNKNOWN);\r
+    /* If they're both naive, or both aware and have the same offsets,\r
+     * we get off cheap.  Note that if they're both naive, offset1 ==\r
+     * offset2 == 0 at this point.\r
+     */\r
+    if (n1 == n2 && offset1 == offset2) {\r
+        diff = memcmp(self->data, ((PyDateTime_DateTime *)other)->data,\r
+                      _PyDateTime_DATETIME_DATASIZE);\r
+        return diff_to_bool(diff, op);\r
+    }\r
+\r
+    if (n1 == OFFSET_AWARE && n2 == OFFSET_AWARE) {\r
+        PyDateTime_Delta *delta;\r
+\r
+        assert(offset1 != offset2);             /* else last "if" handled it */\r
+        delta = (PyDateTime_Delta *)datetime_subtract((PyObject *)self,\r
+                                                       other);\r
+        if (delta == NULL)\r
+            return NULL;\r
+        diff = GET_TD_DAYS(delta);\r
+        if (diff == 0)\r
+            diff = GET_TD_SECONDS(delta) |\r
+                   GET_TD_MICROSECONDS(delta);\r
+        Py_DECREF(delta);\r
+        return diff_to_bool(diff, op);\r
+    }\r
+\r
+    assert(n1 != n2);\r
+    PyErr_SetString(PyExc_TypeError,\r
+                    "can't compare offset-naive and "\r
+                    "offset-aware datetimes");\r
+    return NULL;\r
+}\r
+\r
+static long\r
+datetime_hash(PyDateTime_DateTime *self)\r
+{\r
+    if (self->hashcode == -1) {\r
+        naivety n;\r
+        int offset;\r
+        PyObject *temp;\r
+\r
+        n = classify_utcoffset((PyObject *)self, (PyObject *)self,\r
+                               &offset);\r
+        assert(n != OFFSET_UNKNOWN);\r
+        if (n == OFFSET_ERROR)\r
+            return -1;\r
+\r
+        /* Reduce this to a hash of another object. */\r
+        if (n == OFFSET_NAIVE)\r
+            temp = PyString_FromStringAndSize(\r
+                            (char *)self->data,\r
+                            _PyDateTime_DATETIME_DATASIZE);\r
+        else {\r
+            int days;\r
+            int seconds;\r
+\r
+            assert(n == OFFSET_AWARE);\r
+            assert(HASTZINFO(self));\r
+            days = ymd_to_ord(GET_YEAR(self),\r
+                              GET_MONTH(self),\r
+                              GET_DAY(self));\r
+            seconds = DATE_GET_HOUR(self) * 3600 +\r
+                      (DATE_GET_MINUTE(self) - offset) * 60 +\r
+                      DATE_GET_SECOND(self);\r
+            temp = new_delta(days,\r
+                             seconds,\r
+                             DATE_GET_MICROSECOND(self),\r
+                             1);\r
+        }\r
+        if (temp != NULL) {\r
+            self->hashcode = PyObject_Hash(temp);\r
+            Py_DECREF(temp);\r
+        }\r
+    }\r
+    return self->hashcode;\r
+}\r
+\r
+static PyObject *\r
+datetime_replace(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *clone;\r
+    PyObject *tuple;\r
+    int y = GET_YEAR(self);\r
+    int m = GET_MONTH(self);\r
+    int d = GET_DAY(self);\r
+    int hh = DATE_GET_HOUR(self);\r
+    int mm = DATE_GET_MINUTE(self);\r
+    int ss = DATE_GET_SECOND(self);\r
+    int us = DATE_GET_MICROSECOND(self);\r
+    PyObject *tzinfo = HASTZINFO(self) ? self->tzinfo : Py_None;\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "|iiiiiiiO:replace",\r
+                                      datetime_kws,\r
+                                      &y, &m, &d, &hh, &mm, &ss, &us,\r
+                                      &tzinfo))\r
+        return NULL;\r
+    tuple = Py_BuildValue("iiiiiiiO", y, m, d, hh, mm, ss, us, tzinfo);\r
+    if (tuple == NULL)\r
+        return NULL;\r
+    clone = datetime_new(Py_TYPE(self), tuple, NULL);\r
+    Py_DECREF(tuple);\r
+    return clone;\r
+}\r
+\r
+static PyObject *\r
+datetime_astimezone(PyDateTime_DateTime *self, PyObject *args, PyObject *kw)\r
+{\r
+    int y, m, d, hh, mm, ss, us;\r
+    PyObject *result;\r
+    int offset, none;\r
+\r
+    PyObject *tzinfo;\r
+    static char *keywords[] = {"tz", NULL};\r
+\r
+    if (! PyArg_ParseTupleAndKeywords(args, kw, "O!:astimezone", keywords,\r
+                                      &PyDateTime_TZInfoType, &tzinfo))\r
+        return NULL;\r
+\r
+    if (!HASTZINFO(self) || self->tzinfo == Py_None)\r
+        goto NeedAware;\r
+\r
+    /* Conversion to self's own time zone is a NOP. */\r
+    if (self->tzinfo == tzinfo) {\r
+        Py_INCREF(self);\r
+        return (PyObject *)self;\r
+    }\r
+\r
+    /* Convert self to UTC. */\r
+    offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none);\r
+    if (offset == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (none)\r
+        goto NeedAware;\r
+\r
+    y = GET_YEAR(self);\r
+    m = GET_MONTH(self);\r
+    d = GET_DAY(self);\r
+    hh = DATE_GET_HOUR(self);\r
+    mm = DATE_GET_MINUTE(self);\r
+    ss = DATE_GET_SECOND(self);\r
+    us = DATE_GET_MICROSECOND(self);\r
+\r
+    mm -= offset;\r
+    if ((mm < 0 || mm >= 60) &&\r
+        normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us) < 0)\r
+        return NULL;\r
+\r
+    /* Attach new tzinfo and let fromutc() do the rest. */\r
+    result = new_datetime(y, m, d, hh, mm, ss, us, tzinfo);\r
+    if (result != NULL) {\r
+        PyObject *temp = result;\r
+\r
+        result = PyObject_CallMethod(tzinfo, "fromutc", "O", temp);\r
+        Py_DECREF(temp);\r
+    }\r
+    return result;\r
+\r
+NeedAware:\r
+    PyErr_SetString(PyExc_ValueError, "astimezone() cannot be applied to "\r
+                                      "a naive datetime");\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+datetime_timetuple(PyDateTime_DateTime *self)\r
+{\r
+    int dstflag = -1;\r
+\r
+    if (HASTZINFO(self) && self->tzinfo != Py_None) {\r
+        int none;\r
+\r
+        dstflag = call_dst(self->tzinfo, (PyObject *)self, &none);\r
+        if (dstflag == -1 && PyErr_Occurred())\r
+            return NULL;\r
+\r
+        if (none)\r
+            dstflag = -1;\r
+        else if (dstflag != 0)\r
+            dstflag = 1;\r
+\r
+    }\r
+    return build_struct_time(GET_YEAR(self),\r
+                             GET_MONTH(self),\r
+                             GET_DAY(self),\r
+                             DATE_GET_HOUR(self),\r
+                             DATE_GET_MINUTE(self),\r
+                             DATE_GET_SECOND(self),\r
+                             dstflag);\r
+}\r
+\r
+static PyObject *\r
+datetime_getdate(PyDateTime_DateTime *self)\r
+{\r
+    return new_date(GET_YEAR(self),\r
+                    GET_MONTH(self),\r
+                    GET_DAY(self));\r
+}\r
+\r
+static PyObject *\r
+datetime_gettime(PyDateTime_DateTime *self)\r
+{\r
+    return new_time(DATE_GET_HOUR(self),\r
+                    DATE_GET_MINUTE(self),\r
+                    DATE_GET_SECOND(self),\r
+                    DATE_GET_MICROSECOND(self),\r
+                    Py_None);\r
+}\r
+\r
+static PyObject *\r
+datetime_gettimetz(PyDateTime_DateTime *self)\r
+{\r
+    return new_time(DATE_GET_HOUR(self),\r
+                    DATE_GET_MINUTE(self),\r
+                    DATE_GET_SECOND(self),\r
+                    DATE_GET_MICROSECOND(self),\r
+                    HASTZINFO(self) ? self->tzinfo : Py_None);\r
+}\r
+\r
+static PyObject *\r
+datetime_utctimetuple(PyDateTime_DateTime *self)\r
+{\r
+    int y = GET_YEAR(self);\r
+    int m = GET_MONTH(self);\r
+    int d = GET_DAY(self);\r
+    int hh = DATE_GET_HOUR(self);\r
+    int mm = DATE_GET_MINUTE(self);\r
+    int ss = DATE_GET_SECOND(self);\r
+    int us = 0;         /* microseconds are ignored in a timetuple */\r
+    int offset = 0;\r
+\r
+    if (HASTZINFO(self) && self->tzinfo != Py_None) {\r
+        int none;\r
+\r
+        offset = call_utcoffset(self->tzinfo, (PyObject *)self, &none);\r
+        if (offset == -1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    /* Even if offset is 0, don't call timetuple() -- tm_isdst should be\r
+     * 0 in a UTC timetuple regardless of what dst() says.\r
+     */\r
+    if (offset) {\r
+        /* Subtract offset minutes & normalize. */\r
+        int stat;\r
+\r
+        mm -= offset;\r
+        stat = normalize_datetime(&y, &m, &d, &hh, &mm, &ss, &us);\r
+        if (stat < 0) {\r
+            /* At the edges, it's possible we overflowed\r
+             * beyond MINYEAR or MAXYEAR.\r
+             */\r
+            if (PyErr_ExceptionMatches(PyExc_OverflowError))\r
+                PyErr_Clear();\r
+            else\r
+                return NULL;\r
+        }\r
+    }\r
+    return build_struct_time(y, m, d, hh, mm, ss, 0);\r
+}\r
+\r
+/* Pickle support, a simple use of __reduce__. */\r
+\r
+/* Let basestate be the non-tzinfo data string.\r
+ * If tzinfo is None, this returns (basestate,), else (basestate, tzinfo).\r
+ * So it's a tuple in any (non-error) case.\r
+ * __getstate__ isn't exposed.\r
+ */\r
+static PyObject *\r
+datetime_getstate(PyDateTime_DateTime *self)\r
+{\r
+    PyObject *basestate;\r
+    PyObject *result = NULL;\r
+\r
+    basestate = PyString_FromStringAndSize((char *)self->data,\r
+                                      _PyDateTime_DATETIME_DATASIZE);\r
+    if (basestate != NULL) {\r
+        if (! HASTZINFO(self) || self->tzinfo == Py_None)\r
+            result = PyTuple_Pack(1, basestate);\r
+        else\r
+            result = PyTuple_Pack(2, basestate, self->tzinfo);\r
+        Py_DECREF(basestate);\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+datetime_reduce(PyDateTime_DateTime *self, PyObject *arg)\r
+{\r
+    return Py_BuildValue("(ON)", Py_TYPE(self), datetime_getstate(self));\r
+}\r
+\r
+static PyMethodDef datetime_methods[] = {\r
+\r
+    /* Class methods: */\r
+\r
+    {"now",         (PyCFunction)datetime_now,\r
+     METH_VARARGS | METH_KEYWORDS | METH_CLASS,\r
+     PyDoc_STR("[tz] -> new datetime with tz's local day and time.")},\r
+\r
+    {"utcnow",         (PyCFunction)datetime_utcnow,\r
+     METH_NOARGS | METH_CLASS,\r
+     PyDoc_STR("Return a new datetime representing UTC day and time.")},\r
+\r
+    {"fromtimestamp", (PyCFunction)datetime_fromtimestamp,\r
+     METH_VARARGS | METH_KEYWORDS | METH_CLASS,\r
+     PyDoc_STR("timestamp[, tz] -> tz's local time from POSIX timestamp.")},\r
+\r
+    {"utcfromtimestamp", (PyCFunction)datetime_utcfromtimestamp,\r
+     METH_VARARGS | METH_CLASS,\r
+     PyDoc_STR("timestamp -> UTC datetime from a POSIX timestamp "\r
+               "(like time.time()).")},\r
+\r
+    {"strptime", (PyCFunction)datetime_strptime,\r
+     METH_VARARGS | METH_CLASS,\r
+     PyDoc_STR("string, format -> new datetime parsed from a string "\r
+               "(like time.strptime()).")},\r
+\r
+    {"combine", (PyCFunction)datetime_combine,\r
+     METH_VARARGS | METH_KEYWORDS | METH_CLASS,\r
+     PyDoc_STR("date, time -> datetime with same date and time fields")},\r
+\r
+    /* Instance methods: */\r
+\r
+    {"date",   (PyCFunction)datetime_getdate, METH_NOARGS,\r
+     PyDoc_STR("Return date object with same year, month and day.")},\r
+\r
+    {"time",   (PyCFunction)datetime_gettime, METH_NOARGS,\r
+     PyDoc_STR("Return time object with same time but with tzinfo=None.")},\r
+\r
+    {"timetz",   (PyCFunction)datetime_gettimetz, METH_NOARGS,\r
+     PyDoc_STR("Return time object with same time and tzinfo.")},\r
+\r
+    {"ctime",       (PyCFunction)datetime_ctime,        METH_NOARGS,\r
+     PyDoc_STR("Return ctime() style string.")},\r
+\r
+    {"timetuple",   (PyCFunction)datetime_timetuple, METH_NOARGS,\r
+     PyDoc_STR("Return time tuple, compatible with time.localtime().")},\r
+\r
+    {"utctimetuple",   (PyCFunction)datetime_utctimetuple, METH_NOARGS,\r
+     PyDoc_STR("Return UTC time tuple, compatible with time.localtime().")},\r
+\r
+    {"isoformat",   (PyCFunction)datetime_isoformat, METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("[sep] -> string in ISO 8601 format, "\r
+               "YYYY-MM-DDTHH:MM:SS[.mmmmmm][+HH:MM].\n\n"\r
+               "sep is used to separate the year from the time, and "\r
+               "defaults to 'T'.")},\r
+\r
+    {"utcoffset",       (PyCFunction)datetime_utcoffset, METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.utcoffset(self).")},\r
+\r
+    {"tzname",          (PyCFunction)datetime_tzname,   METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.tzname(self).")},\r
+\r
+    {"dst",             (PyCFunction)datetime_dst, METH_NOARGS,\r
+     PyDoc_STR("Return self.tzinfo.dst(self).")},\r
+\r
+    {"replace",     (PyCFunction)datetime_replace,      METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("Return datetime with new specified fields.")},\r
+\r
+    {"astimezone",  (PyCFunction)datetime_astimezone, METH_VARARGS | METH_KEYWORDS,\r
+     PyDoc_STR("tz -> convert to local time in new timezone tz\n")},\r
+\r
+    {"__reduce__", (PyCFunction)datetime_reduce,     METH_NOARGS,\r
+     PyDoc_STR("__reduce__() -> (cls, state)")},\r
+\r
+    {NULL,      NULL}\r
+};\r
+\r
+static char datetime_doc[] =\r
+PyDoc_STR("datetime(year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]])\n\\r
+\n\\r
+The year, month and day arguments are required. tzinfo may be None, or an\n\\r
+instance of a tzinfo subclass. The remaining arguments may be ints or longs.\n");\r
+\r
+static PyNumberMethods datetime_as_number = {\r
+    datetime_add,                               /* nb_add */\r
+    datetime_subtract,                          /* nb_subtract */\r
+    0,                                          /* nb_multiply */\r
+    0,                                          /* nb_divide */\r
+    0,                                          /* nb_remainder */\r
+    0,                                          /* nb_divmod */\r
+    0,                                          /* nb_power */\r
+    0,                                          /* nb_negative */\r
+    0,                                          /* nb_positive */\r
+    0,                                          /* nb_absolute */\r
+    0,                                          /* nb_nonzero */\r
+};\r
+\r
+statichere PyTypeObject PyDateTime_DateTimeType = {\r
+    PyObject_HEAD_INIT(NULL)\r
+    0,                                          /* ob_size */\r
+    "datetime.datetime",                        /* tp_name */\r
+    sizeof(PyDateTime_DateTime),                /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    (destructor)datetime_dealloc,               /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    (reprfunc)datetime_repr,                    /* tp_repr */\r
+    &datetime_as_number,                        /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    (hashfunc)datetime_hash,                    /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    (reprfunc)datetime_str,                     /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_CHECKTYPES |\r
+    Py_TPFLAGS_BASETYPE,                        /* tp_flags */\r
+    datetime_doc,                               /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    (richcmpfunc)datetime_richcompare,          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    datetime_methods,                           /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    datetime_getset,                            /* tp_getset */\r
+    &PyDateTime_DateType,                       /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    datetime_alloc,                             /* tp_alloc */\r
+    datetime_new,                               /* tp_new */\r
+    0,                                          /* tp_free */\r
+};\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Module methods and initialization.\r
+ */\r
+\r
+static PyMethodDef module_methods[] = {\r
+    {NULL, NULL}\r
+};\r
+\r
+/* C API.  Clients get at this via PyDateTime_IMPORT, defined in\r
+ * datetime.h.\r
+ */\r
+static PyDateTime_CAPI CAPI = {\r
+    &PyDateTime_DateType,\r
+    &PyDateTime_DateTimeType,\r
+    &PyDateTime_TimeType,\r
+    &PyDateTime_DeltaType,\r
+    &PyDateTime_TZInfoType,\r
+    new_date_ex,\r
+    new_datetime_ex,\r
+    new_time_ex,\r
+    new_delta_ex,\r
+    datetime_fromtimestamp,\r
+    date_fromtimestamp\r
+};\r
+\r
+\r
+PyMODINIT_FUNC\r
+initdatetime(void)\r
+{\r
+    PyObject *m;        /* a module object */\r
+    PyObject *d;        /* its dict */\r
+    PyObject *x;\r
+\r
+    m = Py_InitModule3("datetime", module_methods,\r
+                       "Fast implementation of the datetime type.");\r
+    if (m == NULL)\r
+        return;\r
+\r
+    if (PyType_Ready(&PyDateTime_DateType) < 0)\r
+        return;\r
+    if (PyType_Ready(&PyDateTime_DateTimeType) < 0)\r
+        return;\r
+    if (PyType_Ready(&PyDateTime_DeltaType) < 0)\r
+        return;\r
+    if (PyType_Ready(&PyDateTime_TimeType) < 0)\r
+        return;\r
+    if (PyType_Ready(&PyDateTime_TZInfoType) < 0)\r
+        return;\r
+\r
+    /* timedelta values */\r
+    d = PyDateTime_DeltaType.tp_dict;\r
+\r
+    x = new_delta(0, 0, 1, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_delta(-MAX_DELTA_DAYS, 0, 0, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_delta(MAX_DELTA_DAYS, 24*3600-1, 1000000-1, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    /* date values */\r
+    d = PyDateTime_DateType.tp_dict;\r
+\r
+    x = new_date(1, 1, 1);\r
+    if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_date(MAXYEAR, 12, 31);\r
+    if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_delta(1, 0, 0, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    /* time values */\r
+    d = PyDateTime_TimeType.tp_dict;\r
+\r
+    x = new_time(0, 0, 0, 0, Py_None);\r
+    if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_time(23, 59, 59, 999999, Py_None);\r
+    if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_delta(0, 0, 1, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    /* datetime values */\r
+    d = PyDateTime_DateTimeType.tp_dict;\r
+\r
+    x = new_datetime(1, 1, 1, 0, 0, 0, 0, Py_None);\r
+    if (x == NULL || PyDict_SetItemString(d, "min", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_datetime(MAXYEAR, 12, 31, 23, 59, 59, 999999, Py_None);\r
+    if (x == NULL || PyDict_SetItemString(d, "max", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    x = new_delta(0, 0, 1, 0);\r
+    if (x == NULL || PyDict_SetItemString(d, "resolution", x) < 0)\r
+        return;\r
+    Py_DECREF(x);\r
+\r
+    /* module initialization */\r
+    PyModule_AddIntConstant(m, "MINYEAR", MINYEAR);\r
+    PyModule_AddIntConstant(m, "MAXYEAR", MAXYEAR);\r
+\r
+    Py_INCREF(&PyDateTime_DateType);\r
+    PyModule_AddObject(m, "date", (PyObject *) &PyDateTime_DateType);\r
+\r
+    Py_INCREF(&PyDateTime_DateTimeType);\r
+    PyModule_AddObject(m, "datetime",\r
+                       (PyObject *)&PyDateTime_DateTimeType);\r
+\r
+    Py_INCREF(&PyDateTime_TimeType);\r
+    PyModule_AddObject(m, "time", (PyObject *) &PyDateTime_TimeType);\r
+\r
+    Py_INCREF(&PyDateTime_DeltaType);\r
+    PyModule_AddObject(m, "timedelta", (PyObject *) &PyDateTime_DeltaType);\r
+\r
+    Py_INCREF(&PyDateTime_TZInfoType);\r
+    PyModule_AddObject(m, "tzinfo", (PyObject *) &PyDateTime_TZInfoType);\r
+\r
+    x = PyCapsule_New(&CAPI, PyDateTime_CAPSULE_NAME, NULL);\r
+    if (x == NULL)\r
+        return;\r
+    PyModule_AddObject(m, "datetime_CAPI", x);\r
+\r
+    /* A 4-year cycle has an extra leap day over what we'd get from\r
+     * pasting together 4 single years.\r
+     */\r
+    assert(DI4Y == 4 * 365 + 1);\r
+    assert(DI4Y == days_before_year(4+1));\r
+\r
+    /* Similarly, a 400-year cycle has an extra leap day over what we'd\r
+     * get from pasting together 4 100-year cycles.\r
+     */\r
+    assert(DI400Y == 4 * DI100Y + 1);\r
+    assert(DI400Y == days_before_year(400+1));\r
+\r
+    /* OTOH, a 100-year cycle has one fewer leap day than we'd get from\r
+     * pasting together 25 4-year cycles.\r
+     */\r
+    assert(DI100Y == 25 * DI4Y - 1);\r
+    assert(DI100Y == days_before_year(100+1));\r
+\r
+    us_per_us = PyInt_FromLong(1);\r
+    us_per_ms = PyInt_FromLong(1000);\r
+    us_per_second = PyInt_FromLong(1000000);\r
+    us_per_minute = PyInt_FromLong(60000000);\r
+    seconds_per_day = PyInt_FromLong(24 * 3600);\r
+    if (us_per_us == NULL || us_per_ms == NULL || us_per_second == NULL ||\r
+        us_per_minute == NULL || seconds_per_day == NULL)\r
+        return;\r
+\r
+    /* The rest are too big for 32-bit ints, but even\r
+     * us_per_week fits in 40 bits, so doubles should be exact.\r
+     */\r
+    us_per_hour = PyLong_FromDouble(3600000000.0);\r
+    us_per_day = PyLong_FromDouble(86400000000.0);\r
+    us_per_week = PyLong_FromDouble(604800000000.0);\r
+    if (us_per_hour == NULL || us_per_day == NULL || us_per_week == NULL)\r
+        return;\r
+}\r
+\r
+/* ---------------------------------------------------------------------------\r
+Some time zone algebra.  For a datetime x, let\r
+    x.n = x stripped of its timezone -- its naive time.\r
+    x.o = x.utcoffset(), and assuming that doesn't raise an exception or\r
+      return None\r
+    x.d = x.dst(), and assuming that doesn't raise an exception or\r
+      return None\r
+    x.s = x's standard offset, x.o - x.d\r
+\r
+Now some derived rules, where k is a duration (timedelta).\r
+\r
+1. x.o = x.s + x.d\r
+   This follows from the definition of x.s.\r
+\r
+2. If x and y have the same tzinfo member, x.s = y.s.\r
+   This is actually a requirement, an assumption we need to make about\r
+   sane tzinfo classes.\r
+\r
+3. The naive UTC time corresponding to x is x.n - x.o.\r
+   This is again a requirement for a sane tzinfo class.\r
+\r
+4. (x+k).s = x.s\r
+   This follows from #2, and that datimetimetz+timedelta preserves tzinfo.\r
+\r
+5. (x+k).n = x.n + k\r
+   Again follows from how arithmetic is defined.\r
+\r
+Now we can explain tz.fromutc(x).  Let's assume it's an interesting case\r
+(meaning that the various tzinfo methods exist, and don't blow up or return\r
+None when called).\r
+\r
+The function wants to return a datetime y with timezone tz, equivalent to x.\r
+x is already in UTC.\r
+\r
+By #3, we want\r
+\r
+    y.n - y.o = x.n                             [1]\r
+\r
+The algorithm starts by attaching tz to x.n, and calling that y.  So\r
+x.n = y.n at the start.  Then it wants to add a duration k to y, so that [1]\r
+becomes true; in effect, we want to solve [2] for k:\r
+\r
+   (y+k).n - (y+k).o = x.n                      [2]\r
+\r
+By #1, this is the same as\r
+\r
+   (y+k).n - ((y+k).s + (y+k).d) = x.n          [3]\r
+\r
+By #5, (y+k).n = y.n + k, which equals x.n + k because x.n=y.n at the start.\r
+Substituting that into [3],\r
+\r
+   x.n + k - (y+k).s - (y+k).d = x.n; the x.n terms cancel, leaving\r
+   k - (y+k).s - (y+k).d = 0; rearranging,\r
+   k = (y+k).s - (y+k).d; by #4, (y+k).s == y.s, so\r
+   k = y.s - (y+k).d\r
+\r
+On the RHS, (y+k).d can't be computed directly, but y.s can be, and we\r
+approximate k by ignoring the (y+k).d term at first.  Note that k can't be\r
+very large, since all offset-returning methods return a duration of magnitude\r
+less than 24 hours.  For that reason, if y is firmly in std time, (y+k).d must\r
+be 0, so ignoring it has no consequence then.\r
+\r
+In any case, the new value is\r
+\r
+    z = y + y.s                                 [4]\r
+\r
+It's helpful to step back at look at [4] from a higher level:  it's simply\r
+mapping from UTC to tz's standard time.\r
+\r
+At this point, if\r
+\r
+    z.n - z.o = x.n                             [5]\r
+\r
+we have an equivalent time, and are almost done.  The insecurity here is\r
+at the start of daylight time.  Picture US Eastern for concreteness.  The wall\r
+time jumps from 1:59 to 3:00, and wall hours of the form 2:MM don't make good\r
+sense then.  The docs ask that an Eastern tzinfo class consider such a time to\r
+be EDT (because it's "after 2"), which is a redundant spelling of 1:MM EST\r
+on the day DST starts.  We want to return the 1:MM EST spelling because that's\r
+the only spelling that makes sense on the local wall clock.\r
+\r
+In fact, if [5] holds at this point, we do have the standard-time spelling,\r
+but that takes a bit of proof.  We first prove a stronger result.  What's the\r
+difference between the LHS and RHS of [5]?  Let\r
+\r
+    diff = x.n - (z.n - z.o)                    [6]\r
+\r
+Now\r
+    z.n =                       by [4]\r
+    (y + y.s).n =               by #5\r
+    y.n + y.s =                 since y.n = x.n\r
+    x.n + y.s =                 since z and y are have the same tzinfo member,\r
+                                    y.s = z.s by #2\r
+    x.n + z.s\r
+\r
+Plugging that back into [6] gives\r
+\r
+    diff =\r
+    x.n - ((x.n + z.s) - z.o) =     expanding\r
+    x.n - x.n - z.s + z.o =         cancelling\r
+    - z.s + z.o =                   by #2\r
+    z.d\r
+\r
+So diff = z.d.\r
+\r
+If [5] is true now, diff = 0, so z.d = 0 too, and we have the standard-time\r
+spelling we wanted in the endcase described above.  We're done.  Contrarily,\r
+if z.d = 0, then we have a UTC equivalent, and are also done.\r
+\r
+If [5] is not true now, diff = z.d != 0, and z.d is the offset we need to\r
+add to z (in effect, z is in tz's standard time, and we need to shift the\r
+local clock into tz's daylight time).\r
+\r
+Let\r
+\r
+    z' = z + z.d = z + diff                     [7]\r
+\r
+and we can again ask whether\r
+\r
+    z'.n - z'.o = x.n                           [8]\r
+\r
+If so, we're done.  If not, the tzinfo class is insane, according to the\r
+assumptions we've made.  This also requires a bit of proof.  As before, let's\r
+compute the difference between the LHS and RHS of [8] (and skipping some of\r
+the justifications for the kinds of substitutions we've done several times\r
+already):\r
+\r
+    diff' = x.n - (z'.n - z'.o) =           replacing z'.n via [7]\r
+        x.n  - (z.n + diff - z'.o) =    replacing diff via [6]\r
+        x.n - (z.n + x.n - (z.n - z.o) - z'.o) =\r
+        x.n - z.n - x.n + z.n - z.o + z'.o =    cancel x.n\r
+        - z.n + z.n - z.o + z'.o =              cancel z.n\r
+        - z.o + z'.o =                      #1 twice\r
+        -z.s - z.d + z'.s + z'.d =          z and z' have same tzinfo\r
+        z'.d - z.d\r
+\r
+So z' is UTC-equivalent to x iff z'.d = z.d at this point.  If they are equal,\r
+we've found the UTC-equivalent so are done.  In fact, we stop with [7] and\r
+return z', not bothering to compute z'.d.\r
+\r
+How could z.d and z'd differ?  z' = z + z.d [7], so merely moving z' by\r
+a dst() offset, and starting *from* a time already in DST (we know z.d != 0),\r
+would have to change the result dst() returns:  we start in DST, and moving\r
+a little further into it takes us out of DST.\r
+\r
+There isn't a sane case where this can happen.  The closest it gets is at\r
+the end of DST, where there's an hour in UTC with no spelling in a hybrid\r
+tzinfo class.  In US Eastern, that's 5:MM UTC = 0:MM EST = 1:MM EDT.  During\r
+that hour, on an Eastern clock 1:MM is taken as being in standard time (6:MM\r
+UTC) because the docs insist on that, but 0:MM is taken as being in daylight\r
+time (4:MM UTC).  There is no local time mapping to 5:MM UTC.  The local\r
+clock jumps from 1:59 back to 1:00 again, and repeats the 1:MM hour in\r
+standard time.  Since that's what the local clock *does*, we want to map both\r
+UTC hours 5:MM and 6:MM to 1:MM Eastern.  The result is ambiguous\r
+in local time, but so it goes -- it's the way the local clock works.\r
+\r
+When x = 5:MM UTC is the input to this algorithm, x.o=0, y.o=-5 and y.d=0,\r
+so z=0:MM.  z.d=60 (minutes) then, so [5] doesn't hold and we keep going.\r
+z' = z + z.d = 1:MM then, and z'.d=0, and z'.d - z.d = -60 != 0 so [8]\r
+(correctly) concludes that z' is not UTC-equivalent to x.\r
+\r
+Because we know z.d said z was in daylight time (else [5] would have held and\r
+we would have stopped then), and we know z.d != z'.d (else [8] would have held\r
+and we would have stopped then), and there are only 2 possible values dst() can\r
+return in Eastern, it follows that z'.d must be 0 (which it is in the example,\r
+but the reasoning doesn't depend on the example -- it depends on there being\r
+two possible dst() outcomes, one zero and the other non-zero).  Therefore\r
+z' must be in standard time, and is the spelling we want in this case.\r
+\r
+Note again that z' is not UTC-equivalent as far as the hybrid tzinfo class is\r
+concerned (because it takes z' as being in standard time rather than the\r
+daylight time we intend here), but returning it gives the real-life "local\r
+clock repeats an hour" behavior when mapping the "unspellable" UTC hour into\r
+tz.\r
+\r
+When the input is 6:MM, z=1:MM and z.d=0, and we stop at once, again with\r
+the 1:MM standard time spelling we want.\r
+\r
+So how can this break?  One of the assumptions must be violated.  Two\r
+possibilities:\r
+\r
+1) [2] effectively says that y.s is invariant across all y belong to a given\r
+   time zone.  This isn't true if, for political reasons or continental drift,\r
+   a region decides to change its base offset from UTC.\r
+\r
+2) There may be versions of "double daylight" time where the tail end of\r
+   the analysis gives up a step too early.  I haven't thought about that\r
+   enough to say.\r
+\r
+In any case, it's clear that the default fromutc() is strong enough to handle\r
+"almost all" time zones:  so long as the standard offset is invariant, it\r
+doesn't matter if daylight time transition points change from year to year, or\r
+if daylight time is skipped in some years; it doesn't matter how large or\r
+small dst() may get within its bounds; and it doesn't even matter if some\r
+perverse time zone returns a negative dst()).  So a breaking case must be\r
+pretty bizarre, and a tzinfo subclass can override fromutc() if it is.\r
+--------------------------------------------------------------------------- */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/COPYING b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/COPYING
new file mode 100644 (file)
index 0000000..9c86f4d
--- /dev/null
@@ -0,0 +1,22 @@
+Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd\r
+                               and Clark Cooper\r
+Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006 Expat maintainers.\r
+\r
+Permission is hereby granted, free of charge, to any person obtaining\r
+a copy of this software and associated documentation files (the\r
+"Software"), to deal in the Software without restriction, including\r
+without limitation the rights to use, copy, modify, merge, publish,\r
+distribute, sublicense, and/or sell copies of the Software, and to\r
+permit persons to whom the Software is furnished to do so, subject to\r
+the following conditions:\r
+\r
+The above copyright notice and this permission notice shall be included\r
+in all copies or substantial portions of the Software.\r
+\r
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,\r
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\r
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\r
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\r
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\r
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\r
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/ascii.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/ascii.h
new file mode 100644 (file)
index 0000000..73b2712
--- /dev/null
@@ -0,0 +1,92 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#define ASCII_A 0x41\r
+#define ASCII_B 0x42\r
+#define ASCII_C 0x43\r
+#define ASCII_D 0x44\r
+#define ASCII_E 0x45\r
+#define ASCII_F 0x46\r
+#define ASCII_G 0x47\r
+#define ASCII_H 0x48\r
+#define ASCII_I 0x49\r
+#define ASCII_J 0x4A\r
+#define ASCII_K 0x4B\r
+#define ASCII_L 0x4C\r
+#define ASCII_M 0x4D\r
+#define ASCII_N 0x4E\r
+#define ASCII_O 0x4F\r
+#define ASCII_P 0x50\r
+#define ASCII_Q 0x51\r
+#define ASCII_R 0x52\r
+#define ASCII_S 0x53\r
+#define ASCII_T 0x54\r
+#define ASCII_U 0x55\r
+#define ASCII_V 0x56\r
+#define ASCII_W 0x57\r
+#define ASCII_X 0x58\r
+#define ASCII_Y 0x59\r
+#define ASCII_Z 0x5A\r
+\r
+#define ASCII_a 0x61\r
+#define ASCII_b 0x62\r
+#define ASCII_c 0x63\r
+#define ASCII_d 0x64\r
+#define ASCII_e 0x65\r
+#define ASCII_f 0x66\r
+#define ASCII_g 0x67\r
+#define ASCII_h 0x68\r
+#define ASCII_i 0x69\r
+#define ASCII_j 0x6A\r
+#define ASCII_k 0x6B\r
+#define ASCII_l 0x6C\r
+#define ASCII_m 0x6D\r
+#define ASCII_n 0x6E\r
+#define ASCII_o 0x6F\r
+#define ASCII_p 0x70\r
+#define ASCII_q 0x71\r
+#define ASCII_r 0x72\r
+#define ASCII_s 0x73\r
+#define ASCII_t 0x74\r
+#define ASCII_u 0x75\r
+#define ASCII_v 0x76\r
+#define ASCII_w 0x77\r
+#define ASCII_x 0x78\r
+#define ASCII_y 0x79\r
+#define ASCII_z 0x7A\r
+\r
+#define ASCII_0 0x30\r
+#define ASCII_1 0x31\r
+#define ASCII_2 0x32\r
+#define ASCII_3 0x33\r
+#define ASCII_4 0x34\r
+#define ASCII_5 0x35\r
+#define ASCII_6 0x36\r
+#define ASCII_7 0x37\r
+#define ASCII_8 0x38\r
+#define ASCII_9 0x39\r
+\r
+#define ASCII_TAB 0x09\r
+#define ASCII_SPACE 0x20\r
+#define ASCII_EXCL 0x21\r
+#define ASCII_QUOT 0x22\r
+#define ASCII_AMP 0x26\r
+#define ASCII_APOS 0x27\r
+#define ASCII_MINUS 0x2D\r
+#define ASCII_PERIOD 0x2E\r
+#define ASCII_COLON 0x3A\r
+#define ASCII_SEMI 0x3B\r
+#define ASCII_LT 0x3C\r
+#define ASCII_EQUALS 0x3D\r
+#define ASCII_GT 0x3E\r
+#define ASCII_LSQB 0x5B\r
+#define ASCII_RSQB 0x5D\r
+#define ASCII_UNDERSCORE 0x5F\r
+#define ASCII_LPAREN 0x28\r
+#define ASCII_RPAREN 0x29\r
+#define ASCII_FF 0x0C\r
+#define ASCII_SLASH 0x2F\r
+#define ASCII_HASH 0x23\r
+#define ASCII_PIPE 0x7C\r
+#define ASCII_COMMA 0x2C\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/asciitab.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/asciitab.h
new file mode 100644 (file)
index 0000000..2ef65c7
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,\r
+/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML,\r
+/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM,\r
+/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS,\r
+/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS,\r
+/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL,\r
+/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,\r
+/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,\r
+/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI,\r
+/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST,\r
+/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,\r
+/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,\r
+/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB,\r
+/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT,\r
+/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,\r
+/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,\r
+/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,\r
+/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER,\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat.h
new file mode 100644 (file)
index 0000000..ff5a2e7
--- /dev/null
@@ -0,0 +1,1049 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#ifndef Expat_INCLUDED\r
+#define Expat_INCLUDED 1\r
+\r
+#ifdef __VMS\r
+/*      0        1         2         3      0        1         2         3\r
+        1234567890123456789012345678901     1234567890123456789012345678901 */\r
+#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler\r
+#define XML_SetUnparsedEntityDeclHandler    XML_SetUnparsedEntDeclHandler\r
+#define XML_SetStartNamespaceDeclHandler    XML_SetStartNamespcDeclHandler\r
+#define XML_SetExternalEntityRefHandlerArg  XML_SetExternalEntRefHandlerArg\r
+#endif\r
+\r
+#include <stdlib.h>\r
+#include "expat_external.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+struct XML_ParserStruct;\r
+typedef struct XML_ParserStruct *XML_Parser;\r
+\r
+/* Should this be defined using stdbool.h when C99 is available? */\r
+typedef unsigned char XML_Bool;\r
+#define XML_TRUE   ((XML_Bool) 1)\r
+#define XML_FALSE  ((XML_Bool) 0)\r
+\r
+/* The XML_Status enum gives the possible return values for several\r
+   API functions.  The preprocessor #defines are included so this\r
+   stanza can be added to code that still needs to support older\r
+   versions of Expat 1.95.x:\r
+\r
+   #ifndef XML_STATUS_OK\r
+   #define XML_STATUS_OK    1\r
+   #define XML_STATUS_ERROR 0\r
+   #endif\r
+\r
+   Otherwise, the #define hackery is quite ugly and would have been\r
+   dropped.\r
+*/\r
+enum XML_Status {\r
+  XML_STATUS_ERROR = 0,\r
+#define XML_STATUS_ERROR XML_STATUS_ERROR\r
+  XML_STATUS_OK = 1,\r
+#define XML_STATUS_OK XML_STATUS_OK\r
+  XML_STATUS_SUSPENDED = 2\r
+#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED\r
+};\r
+\r
+enum XML_Error {\r
+  XML_ERROR_NONE,\r
+  XML_ERROR_NO_MEMORY,\r
+  XML_ERROR_SYNTAX,\r
+  XML_ERROR_NO_ELEMENTS,\r
+  XML_ERROR_INVALID_TOKEN,\r
+  XML_ERROR_UNCLOSED_TOKEN,\r
+  XML_ERROR_PARTIAL_CHAR,\r
+  XML_ERROR_TAG_MISMATCH,\r
+  XML_ERROR_DUPLICATE_ATTRIBUTE,\r
+  XML_ERROR_JUNK_AFTER_DOC_ELEMENT,\r
+  XML_ERROR_PARAM_ENTITY_REF,\r
+  XML_ERROR_UNDEFINED_ENTITY,\r
+  XML_ERROR_RECURSIVE_ENTITY_REF,\r
+  XML_ERROR_ASYNC_ENTITY,\r
+  XML_ERROR_BAD_CHAR_REF,\r
+  XML_ERROR_BINARY_ENTITY_REF,\r
+  XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF,\r
+  XML_ERROR_MISPLACED_XML_PI,\r
+  XML_ERROR_UNKNOWN_ENCODING,\r
+  XML_ERROR_INCORRECT_ENCODING,\r
+  XML_ERROR_UNCLOSED_CDATA_SECTION,\r
+  XML_ERROR_EXTERNAL_ENTITY_HANDLING,\r
+  XML_ERROR_NOT_STANDALONE,\r
+  XML_ERROR_UNEXPECTED_STATE,\r
+  XML_ERROR_ENTITY_DECLARED_IN_PE,\r
+  XML_ERROR_FEATURE_REQUIRES_XML_DTD,\r
+  XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING,\r
+  /* Added in 1.95.7. */\r
+  XML_ERROR_UNBOUND_PREFIX,\r
+  /* Added in 1.95.8. */\r
+  XML_ERROR_UNDECLARING_PREFIX,\r
+  XML_ERROR_INCOMPLETE_PE,\r
+  XML_ERROR_XML_DECL,\r
+  XML_ERROR_TEXT_DECL,\r
+  XML_ERROR_PUBLICID,\r
+  XML_ERROR_SUSPENDED,\r
+  XML_ERROR_NOT_SUSPENDED,\r
+  XML_ERROR_ABORTED,\r
+  XML_ERROR_FINISHED,\r
+  XML_ERROR_SUSPEND_PE,\r
+  /* Added in 2.0. */\r
+  XML_ERROR_RESERVED_PREFIX_XML,\r
+  XML_ERROR_RESERVED_PREFIX_XMLNS,\r
+  XML_ERROR_RESERVED_NAMESPACE_URI\r
+};\r
+\r
+enum XML_Content_Type {\r
+  XML_CTYPE_EMPTY = 1,\r
+  XML_CTYPE_ANY,\r
+  XML_CTYPE_MIXED,\r
+  XML_CTYPE_NAME,\r
+  XML_CTYPE_CHOICE,\r
+  XML_CTYPE_SEQ\r
+};\r
+\r
+enum XML_Content_Quant {\r
+  XML_CQUANT_NONE,\r
+  XML_CQUANT_OPT,\r
+  XML_CQUANT_REP,\r
+  XML_CQUANT_PLUS\r
+};\r
+\r
+/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be\r
+   XML_CQUANT_NONE, and the other fields will be zero or NULL.\r
+   If type == XML_CTYPE_MIXED, then quant will be NONE or REP and\r
+   numchildren will contain number of elements that may be mixed in\r
+   and children point to an array of XML_Content cells that will be\r
+   all of XML_CTYPE_NAME type with no quantification.\r
+\r
+   If type == XML_CTYPE_NAME, then the name points to the name, and\r
+   the numchildren field will be zero and children will be NULL. The\r
+   quant fields indicates any quantifiers placed on the name.\r
+\r
+   CHOICE and SEQ will have name NULL, the number of children in\r
+   numchildren and children will point, recursively, to an array\r
+   of XML_Content cells.\r
+\r
+   The EMPTY, ANY, and MIXED types will only occur at top level.\r
+*/\r
+\r
+typedef struct XML_cp XML_Content;\r
+\r
+struct XML_cp {\r
+  enum XML_Content_Type         type;\r
+  enum XML_Content_Quant        quant;\r
+  XML_Char *                    name;\r
+  unsigned int                  numchildren;\r
+  XML_Content *                 children;\r
+};\r
+\r
+\r
+/* This is called for an element declaration. See above for\r
+   description of the model argument. It's the caller's responsibility\r
+   to free model when finished with it.\r
+*/\r
+typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData,\r
+                                                const XML_Char *name,\r
+                                                XML_Content *model);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetElementDeclHandler(XML_Parser parser,\r
+                          XML_ElementDeclHandler eldecl);\r
+\r
+/* The Attlist declaration handler is called for *each* attribute. So\r
+   a single Attlist declaration with multiple attributes declared will\r
+   generate multiple calls to this handler. The "default" parameter\r
+   may be NULL in the case of the "#IMPLIED" or "#REQUIRED"\r
+   keyword. The "isrequired" parameter will be true and the default\r
+   value will be NULL in the case of "#REQUIRED". If "isrequired" is\r
+   true and default is non-NULL, then this is a "#FIXED" default.\r
+*/\r
+typedef void (XMLCALL *XML_AttlistDeclHandler) (\r
+                                    void            *userData,\r
+                                    const XML_Char  *elname,\r
+                                    const XML_Char  *attname,\r
+                                    const XML_Char  *att_type,\r
+                                    const XML_Char  *dflt,\r
+                                    int              isrequired);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetAttlistDeclHandler(XML_Parser parser,\r
+                          XML_AttlistDeclHandler attdecl);\r
+\r
+/* The XML declaration handler is called for *both* XML declarations\r
+   and text declarations. The way to distinguish is that the version\r
+   parameter will be NULL for text declarations. The encoding\r
+   parameter may be NULL for XML declarations. The standalone\r
+   parameter will be -1, 0, or 1 indicating respectively that there\r
+   was no standalone parameter in the declaration, that it was given\r
+   as no, or that it was given as yes.\r
+*/\r
+typedef void (XMLCALL *XML_XmlDeclHandler) (void           *userData,\r
+                                            const XML_Char *version,\r
+                                            const XML_Char *encoding,\r
+                                            int             standalone);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetXmlDeclHandler(XML_Parser parser,\r
+                      XML_XmlDeclHandler xmldecl);\r
+\r
+\r
+typedef struct {\r
+  void *(*malloc_fcn)(size_t size);\r
+  void *(*realloc_fcn)(void *ptr, size_t size);\r
+  void (*free_fcn)(void *ptr);\r
+} XML_Memory_Handling_Suite;\r
+\r
+/* Constructs a new parser; encoding is the encoding specified by the\r
+   external protocol or NULL if there is none specified.\r
+*/\r
+XMLPARSEAPI(XML_Parser)\r
+XML_ParserCreate(const XML_Char *encoding);\r
+\r
+/* Constructs a new parser and namespace processor.  Element type\r
+   names and attribute names that belong to a namespace will be\r
+   expanded; unprefixed attribute names are never expanded; unprefixed\r
+   element type names are expanded only if there is a default\r
+   namespace. The expanded name is the concatenation of the namespace\r
+   URI, the namespace separator character, and the local part of the\r
+   name.  If the namespace separator is '\0' then the namespace URI\r
+   and the local part will be concatenated without any separator.\r
+   It is a programming error to use the separator '\0' with namespace\r
+   triplets (see XML_SetReturnNSTriplet).\r
+*/\r
+XMLPARSEAPI(XML_Parser)\r
+XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator);\r
+\r
+\r
+/* Constructs a new parser using the memory management suite referred to\r
+   by memsuite. If memsuite is NULL, then use the standard library memory\r
+   suite. If namespaceSeparator is non-NULL it creates a parser with\r
+   namespace processing as described above. The character pointed at\r
+   will serve as the namespace separator.\r
+\r
+   All further memory operations used for the created parser will come from\r
+   the given suite.\r
+*/\r
+XMLPARSEAPI(XML_Parser)\r
+XML_ParserCreate_MM(const XML_Char *encoding,\r
+                    const XML_Memory_Handling_Suite *memsuite,\r
+                    const XML_Char *namespaceSeparator);\r
+\r
+/* Prepare a parser object to be re-used.  This is particularly\r
+   valuable when memory allocation overhead is disproportionatly high,\r
+   such as when a large number of small documnents need to be parsed.\r
+   All handlers are cleared from the parser, except for the\r
+   unknownEncodingHandler. The parser's external state is re-initialized\r
+   except for the values of ns and ns_triplets.\r
+\r
+   Added in Expat 1.95.3.\r
+*/\r
+XMLPARSEAPI(XML_Bool)\r
+XML_ParserReset(XML_Parser parser, const XML_Char *encoding);\r
+\r
+/* atts is array of name/value pairs, terminated by 0;\r
+   names and values are 0 terminated.\r
+*/\r
+typedef void (XMLCALL *XML_StartElementHandler) (void *userData,\r
+                                                 const XML_Char *name,\r
+                                                 const XML_Char **atts);\r
+\r
+typedef void (XMLCALL *XML_EndElementHandler) (void *userData,\r
+                                               const XML_Char *name);\r
+\r
+\r
+/* s is not 0 terminated. */\r
+typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData,\r
+                                                  const XML_Char *s,\r
+                                                  int len);\r
+\r
+/* target and data are 0 terminated */\r
+typedef void (XMLCALL *XML_ProcessingInstructionHandler) (\r
+                                                void *userData,\r
+                                                const XML_Char *target,\r
+                                                const XML_Char *data);\r
+\r
+/* data is 0 terminated */\r
+typedef void (XMLCALL *XML_CommentHandler) (void *userData,\r
+                                            const XML_Char *data);\r
+\r
+typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData);\r
+typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData);\r
+\r
+/* This is called for any characters in the XML document for which\r
+   there is no applicable handler.  This includes both characters that\r
+   are part of markup which is of a kind that is not reported\r
+   (comments, markup declarations), or characters that are part of a\r
+   construct which could be reported but for which no handler has been\r
+   supplied. The characters are passed exactly as they were in the XML\r
+   document except that they will be encoded in UTF-8 or UTF-16.\r
+   Line boundaries are not normalized. Note that a byte order mark\r
+   character is not passed to the default handler. There are no\r
+   guarantees about how characters are divided between calls to the\r
+   default handler: for example, a comment might be split between\r
+   multiple calls.\r
+*/\r
+typedef void (XMLCALL *XML_DefaultHandler) (void *userData,\r
+                                            const XML_Char *s,\r
+                                            int len);\r
+\r
+/* This is called for the start of the DOCTYPE declaration, before\r
+   any DTD or internal subset is parsed.\r
+*/\r
+typedef void (XMLCALL *XML_StartDoctypeDeclHandler) (\r
+                                            void *userData,\r
+                                            const XML_Char *doctypeName,\r
+                                            const XML_Char *sysid,\r
+                                            const XML_Char *pubid,\r
+                                            int has_internal_subset);\r
+\r
+/* This is called for the start of the DOCTYPE declaration when the\r
+   closing > is encountered, but after processing any external\r
+   subset.\r
+*/\r
+typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);\r
+\r
+/* This is called for entity declarations. The is_parameter_entity\r
+   argument will be non-zero if the entity is a parameter entity, zero\r
+   otherwise.\r
+\r
+   For internal entities (<!ENTITY foo "bar">), value will\r
+   be non-NULL and systemId, publicID, and notationName will be NULL.\r
+   The value string is NOT nul-terminated; the length is provided in\r
+   the value_length argument. Since it is legal to have zero-length\r
+   values, do not use this argument to test for internal entities.\r
+\r
+   For external entities, value will be NULL and systemId will be\r
+   non-NULL. The publicId argument will be NULL unless a public\r
+   identifier was provided. The notationName argument will have a\r
+   non-NULL value only for unparsed entity declarations.\r
+\r
+   Note that is_parameter_entity can't be changed to XML_Bool, since\r
+   that would break binary compatibility.\r
+*/\r
+typedef void (XMLCALL *XML_EntityDeclHandler) (\r
+                              void *userData,\r
+                              const XML_Char *entityName,\r
+                              int is_parameter_entity,\r
+                              const XML_Char *value,\r
+                              int value_length,\r
+                              const XML_Char *base,\r
+                              const XML_Char *systemId,\r
+                              const XML_Char *publicId,\r
+                              const XML_Char *notationName);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetEntityDeclHandler(XML_Parser parser,\r
+                         XML_EntityDeclHandler handler);\r
+\r
+/* OBSOLETE -- OBSOLETE -- OBSOLETE\r
+   This handler has been superceded by the EntityDeclHandler above.\r
+   It is provided here for backward compatibility.\r
+\r
+   This is called for a declaration of an unparsed (NDATA) entity.\r
+   The base argument is whatever was set by XML_SetBase. The\r
+   entityName, systemId and notationName arguments will never be\r
+   NULL. The other arguments may be.\r
+*/\r
+typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) (\r
+                                    void *userData,\r
+                                    const XML_Char *entityName,\r
+                                    const XML_Char *base,\r
+                                    const XML_Char *systemId,\r
+                                    const XML_Char *publicId,\r
+                                    const XML_Char *notationName);\r
+\r
+/* This is called for a declaration of notation.  The base argument is\r
+   whatever was set by XML_SetBase. The notationName will never be\r
+   NULL.  The other arguments can be.\r
+*/\r
+typedef void (XMLCALL *XML_NotationDeclHandler) (\r
+                                    void *userData,\r
+                                    const XML_Char *notationName,\r
+                                    const XML_Char *base,\r
+                                    const XML_Char *systemId,\r
+                                    const XML_Char *publicId);\r
+\r
+/* When namespace processing is enabled, these are called once for\r
+   each namespace declaration. The call to the start and end element\r
+   handlers occur between the calls to the start and end namespace\r
+   declaration handlers. For an xmlns attribute, prefix will be\r
+   NULL.  For an xmlns="" attribute, uri will be NULL.\r
+*/\r
+typedef void (XMLCALL *XML_StartNamespaceDeclHandler) (\r
+                                    void *userData,\r
+                                    const XML_Char *prefix,\r
+                                    const XML_Char *uri);\r
+\r
+typedef void (XMLCALL *XML_EndNamespaceDeclHandler) (\r
+                                    void *userData,\r
+                                    const XML_Char *prefix);\r
+\r
+/* This is called if the document is not standalone, that is, it has an\r
+   external subset or a reference to a parameter entity, but does not\r
+   have standalone="yes". If this handler returns XML_STATUS_ERROR,\r
+   then processing will not continue, and the parser will return a\r
+   XML_ERROR_NOT_STANDALONE error.\r
+   If parameter entity parsing is enabled, then in addition to the\r
+   conditions above this handler will only be called if the referenced\r
+   entity was actually read.\r
+*/\r
+typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData);\r
+\r
+/* This is called for a reference to an external parsed general\r
+   entity.  The referenced entity is not automatically parsed.  The\r
+   application can parse it immediately or later using\r
+   XML_ExternalEntityParserCreate.\r
+\r
+   The parser argument is the parser parsing the entity containing the\r
+   reference; it can be passed as the parser argument to\r
+   XML_ExternalEntityParserCreate.  The systemId argument is the\r
+   system identifier as specified in the entity declaration; it will\r
+   not be NULL.\r
+\r
+   The base argument is the system identifier that should be used as\r
+   the base for resolving systemId if systemId was relative; this is\r
+   set by XML_SetBase; it may be NULL.\r
+\r
+   The publicId argument is the public identifier as specified in the\r
+   entity declaration, or NULL if none was specified; the whitespace\r
+   in the public identifier will have been normalized as required by\r
+   the XML spec.\r
+\r
+   The context argument specifies the parsing context in the format\r
+   expected by the context argument to XML_ExternalEntityParserCreate;\r
+   context is valid only until the handler returns, so if the\r
+   referenced entity is to be parsed later, it must be copied.\r
+   context is NULL only when the entity is a parameter entity.\r
+\r
+   The handler should return XML_STATUS_ERROR if processing should not\r
+   continue because of a fatal error in the handling of the external\r
+   entity.  In this case the calling parser will return an\r
+   XML_ERROR_EXTERNAL_ENTITY_HANDLING error.\r
+\r
+   Note that unlike other handlers the first argument is the parser,\r
+   not userData.\r
+*/\r
+typedef int (XMLCALL *XML_ExternalEntityRefHandler) (\r
+                                    XML_Parser parser,\r
+                                    const XML_Char *context,\r
+                                    const XML_Char *base,\r
+                                    const XML_Char *systemId,\r
+                                    const XML_Char *publicId);\r
+\r
+/* This is called in two situations:\r
+   1) An entity reference is encountered for which no declaration\r
+      has been read *and* this is not an error.\r
+   2) An internal entity reference is read, but not expanded, because\r
+      XML_SetDefaultHandler has been called.\r
+   Note: skipped parameter entities in declarations and skipped general\r
+         entities in attribute values cannot be reported, because\r
+         the event would be out of sync with the reporting of the\r
+         declarations or attribute values\r
+*/\r
+typedef void (XMLCALL *XML_SkippedEntityHandler) (\r
+                                    void *userData,\r
+                                    const XML_Char *entityName,\r
+                                    int is_parameter_entity);\r
+\r
+/* This structure is filled in by the XML_UnknownEncodingHandler to\r
+   provide information to the parser about encodings that are unknown\r
+   to the parser.\r
+\r
+   The map[b] member gives information about byte sequences whose\r
+   first byte is b.\r
+\r
+   If map[b] is c where c is >= 0, then b by itself encodes the\r
+   Unicode scalar value c.\r
+\r
+   If map[b] is -1, then the byte sequence is malformed.\r
+\r
+   If map[b] is -n, where n >= 2, then b is the first byte of an\r
+   n-byte sequence that encodes a single Unicode scalar value.\r
+\r
+   The data member will be passed as the first argument to the convert\r
+   function.\r
+\r
+   The convert function is used to convert multibyte sequences; s will\r
+   point to a n-byte sequence where map[(unsigned char)*s] == -n.  The\r
+   convert function must return the Unicode scalar value represented\r
+   by this byte sequence or -1 if the byte sequence is malformed.\r
+\r
+   The convert function may be NULL if the encoding is a single-byte\r
+   encoding, that is if map[b] >= -1 for all bytes b.\r
+\r
+   When the parser is finished with the encoding, then if release is\r
+   not NULL, it will call release passing it the data member; once\r
+   release has been called, the convert function will not be called\r
+   again.\r
+\r
+   Expat places certain restrictions on the encodings that are supported\r
+   using this mechanism.\r
+\r
+   1. Every ASCII character that can appear in a well-formed XML document,\r
+      other than the characters\r
+\r
+      $@\^`{}~\r
+\r
+      must be represented by a single byte, and that byte must be the\r
+      same byte that represents that character in ASCII.\r
+\r
+   2. No character may require more than 4 bytes to encode.\r
+\r
+   3. All characters encoded must have Unicode scalar values <=\r
+      0xFFFF, (i.e., characters that would be encoded by surrogates in\r
+      UTF-16 are  not allowed).  Note that this restriction doesn't\r
+      apply to the built-in support for UTF-8 and UTF-16.\r
+\r
+   4. No Unicode character may be encoded by more than one distinct\r
+      sequence of bytes.\r
+*/\r
+typedef struct {\r
+  int map[256];\r
+  void *data;\r
+  int (XMLCALL *convert)(void *data, const char *s);\r
+  void (XMLCALL *release)(void *data);\r
+} XML_Encoding;\r
+\r
+/* This is called for an encoding that is unknown to the parser.\r
+\r
+   The encodingHandlerData argument is that which was passed as the\r
+   second argument to XML_SetUnknownEncodingHandler.\r
+\r
+   The name argument gives the name of the encoding as specified in\r
+   the encoding declaration.\r
+\r
+   If the callback can provide information about the encoding, it must\r
+   fill in the XML_Encoding structure, and return XML_STATUS_OK.\r
+   Otherwise it must return XML_STATUS_ERROR.\r
+\r
+   If info does not describe a suitable encoding, then the parser will\r
+   return an XML_UNKNOWN_ENCODING error.\r
+*/\r
+typedef int (XMLCALL *XML_UnknownEncodingHandler) (\r
+                                    void *encodingHandlerData,\r
+                                    const XML_Char *name,\r
+                                    XML_Encoding *info);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetElementHandler(XML_Parser parser,\r
+                      XML_StartElementHandler start,\r
+                      XML_EndElementHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetStartElementHandler(XML_Parser parser,\r
+                           XML_StartElementHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetEndElementHandler(XML_Parser parser,\r
+                         XML_EndElementHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetCharacterDataHandler(XML_Parser parser,\r
+                            XML_CharacterDataHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetProcessingInstructionHandler(XML_Parser parser,\r
+                                    XML_ProcessingInstructionHandler handler);\r
+XMLPARSEAPI(void)\r
+XML_SetCommentHandler(XML_Parser parser,\r
+                      XML_CommentHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetCdataSectionHandler(XML_Parser parser,\r
+                           XML_StartCdataSectionHandler start,\r
+                           XML_EndCdataSectionHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetStartCdataSectionHandler(XML_Parser parser,\r
+                                XML_StartCdataSectionHandler start);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetEndCdataSectionHandler(XML_Parser parser,\r
+                              XML_EndCdataSectionHandler end);\r
+\r
+/* This sets the default handler and also inhibits expansion of\r
+   internal entities. These entity references will be passed to the\r
+   default handler, or to the skipped entity handler, if one is set.\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_SetDefaultHandler(XML_Parser parser,\r
+                      XML_DefaultHandler handler);\r
+\r
+/* This sets the default handler but does not inhibit expansion of\r
+   internal entities.  The entity reference will not be passed to the\r
+   default handler.\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_SetDefaultHandlerExpand(XML_Parser parser,\r
+                            XML_DefaultHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetDoctypeDeclHandler(XML_Parser parser,\r
+                          XML_StartDoctypeDeclHandler start,\r
+                          XML_EndDoctypeDeclHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetStartDoctypeDeclHandler(XML_Parser parser,\r
+                               XML_StartDoctypeDeclHandler start);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetEndDoctypeDeclHandler(XML_Parser parser,\r
+                             XML_EndDoctypeDeclHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetUnparsedEntityDeclHandler(XML_Parser parser,\r
+                                 XML_UnparsedEntityDeclHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetNotationDeclHandler(XML_Parser parser,\r
+                           XML_NotationDeclHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetNamespaceDeclHandler(XML_Parser parser,\r
+                            XML_StartNamespaceDeclHandler start,\r
+                            XML_EndNamespaceDeclHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetStartNamespaceDeclHandler(XML_Parser parser,\r
+                                 XML_StartNamespaceDeclHandler start);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetEndNamespaceDeclHandler(XML_Parser parser,\r
+                               XML_EndNamespaceDeclHandler end);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetNotStandaloneHandler(XML_Parser parser,\r
+                            XML_NotStandaloneHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetExternalEntityRefHandler(XML_Parser parser,\r
+                                XML_ExternalEntityRefHandler handler);\r
+\r
+/* If a non-NULL value for arg is specified here, then it will be\r
+   passed as the first argument to the external entity ref handler\r
+   instead of the parser object.\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_SetExternalEntityRefHandlerArg(XML_Parser parser,\r
+                                   void *arg);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetSkippedEntityHandler(XML_Parser parser,\r
+                            XML_SkippedEntityHandler handler);\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetUnknownEncodingHandler(XML_Parser parser,\r
+                              XML_UnknownEncodingHandler handler,\r
+                              void *encodingHandlerData);\r
+\r
+/* This can be called within a handler for a start element, end\r
+   element, processing instruction or character data.  It causes the\r
+   corresponding markup to be passed to the default handler.\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_DefaultCurrent(XML_Parser parser);\r
+\r
+/* If do_nst is non-zero, and namespace processing is in effect, and\r
+   a name has a prefix (i.e. an explicit namespace qualifier) then\r
+   that name is returned as a triplet in a single string separated by\r
+   the separator character specified when the parser was created: URI\r
+   + sep + local_name + sep + prefix.\r
+\r
+   If do_nst is zero, then namespace information is returned in the\r
+   default manner (URI + sep + local_name) whether or not the name\r
+   has a prefix.\r
+\r
+   Note: Calling XML_SetReturnNSTriplet after XML_Parse or\r
+     XML_ParseBuffer has no effect.\r
+*/\r
+\r
+XMLPARSEAPI(void)\r
+XML_SetReturnNSTriplet(XML_Parser parser, int do_nst);\r
+\r
+/* This value is passed as the userData argument to callbacks. */\r
+XMLPARSEAPI(void)\r
+XML_SetUserData(XML_Parser parser, void *userData);\r
+\r
+/* Returns the last value set by XML_SetUserData or NULL. */\r
+#define XML_GetUserData(parser) (*(void **)(parser))\r
+\r
+/* This is equivalent to supplying an encoding argument to\r
+   XML_ParserCreate. On success XML_SetEncoding returns non-zero,\r
+   zero otherwise.\r
+   Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer\r
+     has no effect and returns XML_STATUS_ERROR.\r
+*/\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_SetEncoding(XML_Parser parser, const XML_Char *encoding);\r
+\r
+/* If this function is called, then the parser will be passed as the\r
+   first argument to callbacks instead of userData.  The userData will\r
+   still be accessible using XML_GetUserData.\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_UseParserAsHandlerArg(XML_Parser parser);\r
+\r
+/* If useDTD == XML_TRUE is passed to this function, then the parser\r
+   will assume that there is an external subset, even if none is\r
+   specified in the document. In such a case the parser will call the\r
+   externalEntityRefHandler with a value of NULL for the systemId\r
+   argument (the publicId and context arguments will be NULL as well).\r
+   Note: For the purpose of checking WFC: Entity Declared, passing\r
+     useDTD == XML_TRUE will make the parser behave as if the document\r
+     had a DTD with an external subset.\r
+   Note: If this function is called, then this must be done before\r
+     the first call to XML_Parse or XML_ParseBuffer, since it will\r
+     have no effect after that.  Returns\r
+     XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING.\r
+   Note: If the document does not have a DOCTYPE declaration at all,\r
+     then startDoctypeDeclHandler and endDoctypeDeclHandler will not\r
+     be called, despite an external subset being parsed.\r
+   Note: If XML_DTD is not defined when Expat is compiled, returns\r
+     XML_ERROR_FEATURE_REQUIRES_XML_DTD.\r
+*/\r
+XMLPARSEAPI(enum XML_Error)\r
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);\r
+\r
+\r
+/* Sets the base to be used for resolving relative URIs in system\r
+   identifiers in declarations.  Resolving relative identifiers is\r
+   left to the application: this value will be passed through as the\r
+   base argument to the XML_ExternalEntityRefHandler,\r
+   XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base\r
+   argument will be copied.  Returns XML_STATUS_ERROR if out of memory,\r
+   XML_STATUS_OK otherwise.\r
+*/\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_SetBase(XML_Parser parser, const XML_Char *base);\r
+\r
+XMLPARSEAPI(const XML_Char *)\r
+XML_GetBase(XML_Parser parser);\r
+\r
+/* Returns the number of the attribute/value pairs passed in last call\r
+   to the XML_StartElementHandler that were specified in the start-tag\r
+   rather than defaulted. Each attribute/value pair counts as 2; thus\r
+   this correspondds to an index into the atts array passed to the\r
+   XML_StartElementHandler.\r
+*/\r
+XMLPARSEAPI(int)\r
+XML_GetSpecifiedAttributeCount(XML_Parser parser);\r
+\r
+/* Returns the index of the ID attribute passed in the last call to\r
+   XML_StartElementHandler, or -1 if there is no ID attribute.  Each\r
+   attribute/value pair counts as 2; thus this correspondds to an\r
+   index into the atts array passed to the XML_StartElementHandler.\r
+*/\r
+XMLPARSEAPI(int)\r
+XML_GetIdAttributeIndex(XML_Parser parser);\r
+\r
+#ifdef XML_ATTR_INFO\r
+/* Source file byte offsets for the start and end of attribute names and values.\r
+   The value indices are exclusive of surrounding quotes; thus in a UTF-8 source\r
+   file an attribute value of "blah" will yield:\r
+   info->valueEnd - info->valueStart = 4 bytes.\r
+*/\r
+typedef struct {\r
+  XML_Index  nameStart;  /* Offset to beginning of the attribute name. */\r
+  XML_Index  nameEnd;    /* Offset after the attribute name's last byte. */\r
+  XML_Index  valueStart; /* Offset to beginning of the attribute value. */\r
+  XML_Index  valueEnd;   /* Offset after the attribute value's last byte. */\r
+} XML_AttrInfo;\r
+\r
+/* Returns an array of XML_AttrInfo structures for the attribute/value pairs\r
+   passed in last call to the XML_StartElementHandler that were specified\r
+   in the start-tag rather than defaulted. Each attribute/value pair counts\r
+   as 1; thus the number of entries in the array is\r
+   XML_GetSpecifiedAttributeCount(parser) / 2.\r
+*/\r
+XMLPARSEAPI(const XML_AttrInfo *)\r
+XML_GetAttributeInfo(XML_Parser parser);\r
+#endif\r
+\r
+/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is\r
+   detected.  The last call to XML_Parse must have isFinal true; len\r
+   may be zero for this call (or any other).\r
+\r
+   Though the return values for these functions has always been\r
+   described as a Boolean value, the implementation, at least for the\r
+   1.95.x series, has always returned exactly one of the XML_Status\r
+   values.\r
+*/\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_Parse(XML_Parser parser, const char *s, int len, int isFinal);\r
+\r
+XMLPARSEAPI(void *)\r
+XML_GetBuffer(XML_Parser parser, int len);\r
+\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_ParseBuffer(XML_Parser parser, int len, int isFinal);\r
+\r
+/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return.\r
+   Must be called from within a call-back handler, except when aborting\r
+   (resumable = 0) an already suspended parser. Some call-backs may\r
+   still follow because they would otherwise get lost. Examples:\r
+   - endElementHandler() for empty elements when stopped in\r
+     startElementHandler(), \r
+   - endNameSpaceDeclHandler() when stopped in endElementHandler(), \r
+   and possibly others.\r
+\r
+   Can be called from most handlers, including DTD related call-backs,\r
+   except when parsing an external parameter entity and resumable != 0.\r
+   Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise.\r
+   Possible error codes: \r
+   - XML_ERROR_SUSPENDED: when suspending an already suspended parser.\r
+   - XML_ERROR_FINISHED: when the parser has already finished.\r
+   - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE.\r
+\r
+   When resumable != 0 (true) then parsing is suspended, that is, \r
+   XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED. \r
+   Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer()\r
+   return XML_STATUS_ERROR with error code XML_ERROR_ABORTED.\r
+\r
+   *Note*:\r
+   This will be applied to the current parser instance only, that is, if\r
+   there is a parent parser then it will continue parsing when the\r
+   externalEntityRefHandler() returns. It is up to the implementation of\r
+   the externalEntityRefHandler() to call XML_StopParser() on the parent\r
+   parser (recursively), if one wants to stop parsing altogether.\r
+\r
+   When suspended, parsing can be resumed by calling XML_ResumeParser(). \r
+*/\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_StopParser(XML_Parser parser, XML_Bool resumable);\r
+\r
+/* Resumes parsing after it has been suspended with XML_StopParser().\r
+   Must not be called from within a handler call-back. Returns same\r
+   status codes as XML_Parse() or XML_ParseBuffer().\r
+   Additional error code XML_ERROR_NOT_SUSPENDED possible.   \r
+\r
+   *Note*:\r
+   This must be called on the most deeply nested child parser instance\r
+   first, and on its parent parser only after the child parser has finished,\r
+   to be applied recursively until the document entity's parser is restarted.\r
+   That is, the parent parser will not resume by itself and it is up to the\r
+   application to call XML_ResumeParser() on it at the appropriate moment.\r
+*/\r
+XMLPARSEAPI(enum XML_Status)\r
+XML_ResumeParser(XML_Parser parser);\r
+\r
+enum XML_Parsing {\r
+  XML_INITIALIZED,\r
+  XML_PARSING,\r
+  XML_FINISHED,\r
+  XML_SUSPENDED\r
+};\r
+\r
+typedef struct {\r
+  enum XML_Parsing parsing;\r
+  XML_Bool finalBuffer;\r
+} XML_ParsingStatus;\r
+\r
+/* Returns status of parser with respect to being initialized, parsing,\r
+   finished, or suspended and processing the final buffer.\r
+   XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus,\r
+   XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED\r
+*/\r
+XMLPARSEAPI(void)\r
+XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status);\r
+\r
+/* Creates an XML_Parser object that can parse an external general\r
+   entity; context is a '\0'-terminated string specifying the parse\r
+   context; encoding is a '\0'-terminated string giving the name of\r
+   the externally specified encoding, or NULL if there is no\r
+   externally specified encoding.  The context string consists of a\r
+   sequence of tokens separated by formfeeds (\f); a token consisting\r
+   of a name specifies that the general entity of the name is open; a\r
+   token of the form prefix=uri specifies the namespace for a\r
+   particular prefix; a token of the form =uri specifies the default\r
+   namespace.  This can be called at any point after the first call to\r
+   an ExternalEntityRefHandler so longer as the parser has not yet\r
+   been freed.  The new parser is completely independent and may\r
+   safely be used in a separate thread.  The handlers and userData are\r
+   initialized from the parser argument.  Returns NULL if out of memory.\r
+   Otherwise returns a new XML_Parser object.\r
+*/\r
+XMLPARSEAPI(XML_Parser)\r
+XML_ExternalEntityParserCreate(XML_Parser parser,\r
+                               const XML_Char *context,\r
+                               const XML_Char *encoding);\r
+\r
+enum XML_ParamEntityParsing {\r
+  XML_PARAM_ENTITY_PARSING_NEVER,\r
+  XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE,\r
+  XML_PARAM_ENTITY_PARSING_ALWAYS\r
+};\r
+\r
+/* Controls parsing of parameter entities (including the external DTD\r
+   subset). If parsing of parameter entities is enabled, then\r
+   references to external parameter entities (including the external\r
+   DTD subset) will be passed to the handler set with\r
+   XML_SetExternalEntityRefHandler.  The context passed will be 0.\r
+\r
+   Unlike external general entities, external parameter entities can\r
+   only be parsed synchronously.  If the external parameter entity is\r
+   to be parsed, it must be parsed during the call to the external\r
+   entity ref handler: the complete sequence of\r
+   XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and\r
+   XML_ParserFree calls must be made during this call.  After\r
+   XML_ExternalEntityParserCreate has been called to create the parser\r
+   for the external parameter entity (context must be 0 for this\r
+   call), it is illegal to make any calls on the old parser until\r
+   XML_ParserFree has been called on the newly created parser.\r
+   If the library has been compiled without support for parameter\r
+   entity parsing (ie without XML_DTD being defined), then\r
+   XML_SetParamEntityParsing will return 0 if parsing of parameter\r
+   entities is requested; otherwise it will return non-zero.\r
+   Note: If XML_SetParamEntityParsing is called after XML_Parse or\r
+      XML_ParseBuffer, then it has no effect and will always return 0.\r
+*/\r
+XMLPARSEAPI(int)\r
+XML_SetParamEntityParsing(XML_Parser parser,\r
+                          enum XML_ParamEntityParsing parsing);\r
+\r
+/* Sets the hash salt to use for internal hash calculations.\r
+   Helps in preventing DoS attacks based on predicting hash\r
+   function behavior. This must be called before parsing is started.\r
+   Returns 1 if successful, 0 when called after parsing has started.\r
+*/\r
+XMLPARSEAPI(int)\r
+XML_SetHashSalt(XML_Parser parser,\r
+                unsigned long hash_salt);\r
+\r
+#define XML_HAS_SET_HASH_SALT  /* Python Only: Defined for pyexpat.c. */\r
+\r
+/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then\r
+   XML_GetErrorCode returns information about the error.\r
+*/\r
+XMLPARSEAPI(enum XML_Error)\r
+XML_GetErrorCode(XML_Parser parser);\r
+\r
+/* These functions return information about the current parse\r
+   location.  They may be called from any callback called to report\r
+   some parse event; in this case the location is the location of the\r
+   first of the sequence of characters that generated the event.  When\r
+   called from callbacks generated by declarations in the document\r
+   prologue, the location identified isn't as neatly defined, but will\r
+   be within the relevant markup.  When called outside of the callback\r
+   functions, the position indicated will be just past the last parse\r
+   event (regardless of whether there was an associated callback).\r
+   \r
+   They may also be called after returning from a call to XML_Parse\r
+   or XML_ParseBuffer.  If the return value is XML_STATUS_ERROR then\r
+   the location is the location of the character at which the error\r
+   was detected; otherwise the location is the location of the last\r
+   parse event, as described above.\r
+*/\r
+XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser);\r
+XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser);\r
+XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser);\r
+\r
+/* Return the number of bytes in the current event.\r
+   Returns 0 if the event is in an internal entity.\r
+*/\r
+XMLPARSEAPI(int)\r
+XML_GetCurrentByteCount(XML_Parser parser);\r
+\r
+/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets\r
+   the integer pointed to by offset to the offset within this buffer\r
+   of the current parse position, and sets the integer pointed to by size\r
+   to the size of this buffer (the number of input bytes). Otherwise\r
+   returns a NULL pointer. Also returns a NULL pointer if a parse isn't\r
+   active.\r
+\r
+   NOTE: The character pointer returned should not be used outside\r
+   the handler that makes the call.\r
+*/\r
+XMLPARSEAPI(const char *)\r
+XML_GetInputContext(XML_Parser parser,\r
+                    int *offset,\r
+                    int *size);\r
+\r
+/* For backwards compatibility with previous versions. */\r
+#define XML_GetErrorLineNumber   XML_GetCurrentLineNumber\r
+#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber\r
+#define XML_GetErrorByteIndex    XML_GetCurrentByteIndex\r
+\r
+/* Frees the content model passed to the element declaration handler */\r
+XMLPARSEAPI(void)\r
+XML_FreeContentModel(XML_Parser parser, XML_Content *model);\r
+\r
+/* Exposing the memory handling functions used in Expat */\r
+XMLPARSEAPI(void *)\r
+XML_MemMalloc(XML_Parser parser, size_t size);\r
+\r
+XMLPARSEAPI(void *)\r
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);\r
+\r
+XMLPARSEAPI(void)\r
+XML_MemFree(XML_Parser parser, void *ptr);\r
+\r
+/* Frees memory used by the parser. */\r
+XMLPARSEAPI(void)\r
+XML_ParserFree(XML_Parser parser);\r
+\r
+/* Returns a string describing the error. */\r
+XMLPARSEAPI(const XML_LChar *)\r
+XML_ErrorString(enum XML_Error code);\r
+\r
+/* Return a string containing the version number of this expat */\r
+XMLPARSEAPI(const XML_LChar *)\r
+XML_ExpatVersion(void);\r
+\r
+typedef struct {\r
+  int major;\r
+  int minor;\r
+  int micro;\r
+} XML_Expat_Version;\r
+\r
+/* Return an XML_Expat_Version structure containing numeric version\r
+   number information for this version of expat.\r
+*/\r
+XMLPARSEAPI(XML_Expat_Version)\r
+XML_ExpatVersionInfo(void);\r
+\r
+/* Added in Expat 1.95.5. */\r
+enum XML_FeatureEnum {\r
+  XML_FEATURE_END = 0,\r
+  XML_FEATURE_UNICODE,\r
+  XML_FEATURE_UNICODE_WCHAR_T,\r
+  XML_FEATURE_DTD,\r
+  XML_FEATURE_CONTEXT_BYTES,\r
+  XML_FEATURE_MIN_SIZE,\r
+  XML_FEATURE_SIZEOF_XML_CHAR,\r
+  XML_FEATURE_SIZEOF_XML_LCHAR,\r
+  XML_FEATURE_NS,\r
+  XML_FEATURE_LARGE_SIZE,\r
+  XML_FEATURE_ATTR_INFO\r
+  /* Additional features must be added to the end of this enum. */\r
+};\r
+\r
+typedef struct {\r
+  enum XML_FeatureEnum  feature;\r
+  const XML_LChar       *name;\r
+  long int              value;\r
+} XML_Feature;\r
+\r
+XMLPARSEAPI(const XML_Feature *)\r
+XML_GetFeatureList(void);\r
+\r
+\r
+/* Expat follows the GNU/Linux convention of odd number minor version for\r
+   beta/development releases and even number minor version for stable\r
+   releases. Micro is bumped with each release, and set to 0 with each\r
+   change to major or minor version.\r
+*/\r
+#define XML_MAJOR_VERSION 2\r
+#define XML_MINOR_VERSION 1\r
+#define XML_MICRO_VERSION 0\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* not Expat_INCLUDED */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat_external.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/expat_external.h
new file mode 100644 (file)
index 0000000..8210f41
--- /dev/null
@@ -0,0 +1,119 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#ifndef Expat_External_INCLUDED\r
+#define Expat_External_INCLUDED 1\r
+\r
+/* External API definitions */\r
+\r
+/* Namespace external symbols to allow multiple libexpat version to\r
+   co-exist. */\r
+#include "pyexpatns.h"\r
+\r
+#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)\r
+#define XML_USE_MSC_EXTENSIONS 1\r
+#endif\r
+\r
+/* Expat tries very hard to make the API boundary very specifically\r
+   defined.  There are two macros defined to control this boundary;\r
+   each of these can be defined before including this header to\r
+   achieve some different behavior, but doing so it not recommended or\r
+   tested frequently.\r
+\r
+   XMLCALL    - The calling convention to use for all calls across the\r
+                "library boundary."  This will default to cdecl, and\r
+                try really hard to tell the compiler that's what we\r
+                want.\r
+\r
+   XMLIMPORT  - Whatever magic is needed to note that a function is\r
+                to be imported from a dynamically loaded library\r
+                (.dll, .so, or .sl, depending on your platform).\r
+\r
+   The XMLCALL macro was added in Expat 1.95.7.  The only one which is\r
+   expected to be directly useful in client code is XMLCALL.\r
+\r
+   Note that on at least some Unix versions, the Expat library must be\r
+   compiled with the cdecl calling convention as the default since\r
+   system headers may assume the cdecl convention.\r
+*/\r
+#ifndef XMLCALL\r
+#if defined(_MSC_VER)\r
+#define XMLCALL __cdecl\r
+#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)\r
+#define XMLCALL __attribute__((cdecl))\r
+#else\r
+/* For any platform which uses this definition and supports more than\r
+   one calling convention, we need to extend this definition to\r
+   declare the convention used on that platform, if it's possible to\r
+   do so.\r
+\r
+   If this is the case for your platform, please file a bug report\r
+   with information on how to identify your platform via the C\r
+   pre-processor and how to specify the same calling convention as the\r
+   platform's malloc() implementation.\r
+*/\r
+#define XMLCALL\r
+#endif\r
+#endif  /* not defined XMLCALL */\r
+\r
+\r
+#if !defined(XML_STATIC) && !defined(XMLIMPORT)\r
+#ifndef XML_BUILDING_EXPAT\r
+/* using Expat from an application */\r
+\r
+#ifdef XML_USE_MSC_EXTENSIONS\r
+#define XMLIMPORT __declspec(dllimport)\r
+#endif\r
+\r
+#endif\r
+#endif  /* not defined XML_STATIC */\r
+\r
+\r
+/* If we didn't define it above, define it away: */\r
+#ifndef XMLIMPORT\r
+#define XMLIMPORT\r
+#endif\r
+\r
+\r
+#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#ifdef XML_UNICODE_WCHAR_T\r
+#define XML_UNICODE\r
+#endif\r
+\r
+#ifdef XML_UNICODE     /* Information is UTF-16 encoded. */\r
+#ifdef XML_UNICODE_WCHAR_T\r
+typedef wchar_t XML_Char;\r
+typedef wchar_t XML_LChar;\r
+#else\r
+typedef unsigned short XML_Char;\r
+typedef char XML_LChar;\r
+#endif /* XML_UNICODE_WCHAR_T */\r
+#else                  /* Information is UTF-8 encoded. */\r
+typedef char XML_Char;\r
+typedef char XML_LChar;\r
+#endif /* XML_UNICODE */\r
+\r
+#ifdef XML_LARGE_SIZE  /* Use large integers for file/stream positions. */\r
+#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400\r
+typedef __int64 XML_Index; \r
+typedef unsigned __int64 XML_Size;\r
+#else\r
+typedef long long XML_Index;\r
+typedef unsigned long long XML_Size;\r
+#endif\r
+#else\r
+typedef long XML_Index;\r
+typedef unsigned long XML_Size;\r
+#endif /* XML_LARGE_SIZE */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* not Expat_External_INCLUDED */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/iasciitab.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/iasciitab.h
new file mode 100644 (file)
index 0000000..980686f
--- /dev/null
@@ -0,0 +1,37 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */\r
+/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,\r
+/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML,\r
+/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM,\r
+/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS,\r
+/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS,\r
+/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL,\r
+/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,\r
+/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,\r
+/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI,\r
+/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST,\r
+/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,\r
+/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,\r
+/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB,\r
+/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT,\r
+/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,\r
+/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,\r
+/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,\r
+/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER,\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/internal.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/internal.h
new file mode 100644 (file)
index 0000000..3da3b78
--- /dev/null
@@ -0,0 +1,73 @@
+/* internal.h\r
+\r
+   Internal definitions used by Expat.  This is not needed to compile\r
+   client code.\r
+\r
+   The following calling convention macros are defined for frequently\r
+   called functions:\r
+\r
+   FASTCALL    - Used for those internal functions that have a simple\r
+                 body and a low number of arguments and local variables.\r
+\r
+   PTRCALL     - Used for functions called though function pointers.\r
+\r
+   PTRFASTCALL - Like PTRCALL, but for low number of arguments.\r
+\r
+   inline      - Used for selected internal functions for which inlining\r
+                 may improve performance on some platforms.\r
+\r
+   Note: Use of these macros is based on judgement, not hard rules,\r
+         and therefore subject to change.\r
+*/\r
+\r
+#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__)\r
+/* We'll use this version by default only where we know it helps.\r
+\r
+   regparm() generates warnings on Solaris boxes.   See SF bug #692878.\r
+\r
+   Instability reported with egcs on a RedHat Linux 7.3.\r
+   Let's comment out:\r
+   #define FASTCALL __attribute__((stdcall, regparm(3)))\r
+   and let's try this:\r
+*/\r
+#define FASTCALL __attribute__((regparm(3)))\r
+#define PTRFASTCALL __attribute__((regparm(3)))\r
+#endif\r
+\r
+/* Using __fastcall seems to have an unexpected negative effect under\r
+   MS VC++, especially for function pointers, so we won't use it for\r
+   now on that platform. It may be reconsidered for a future release\r
+   if it can be made more effective.\r
+   Likely reason: __fastcall on Windows is like stdcall, therefore\r
+   the compiler cannot perform stack optimizations for call clusters.\r
+*/\r
+\r
+/* Make sure all of these are defined if they aren't already. */\r
+\r
+#ifndef FASTCALL\r
+#define FASTCALL\r
+#endif\r
+\r
+#ifndef PTRCALL\r
+#define PTRCALL\r
+#endif\r
+\r
+#ifndef PTRFASTCALL\r
+#define PTRFASTCALL\r
+#endif\r
+\r
+#ifndef XML_MIN_SIZE\r
+#if !defined(__cplusplus) && !defined(inline)\r
+#ifdef __GNUC__\r
+#define inline __inline\r
+#endif /* __GNUC__ */\r
+#endif\r
+#endif /* XML_MIN_SIZE */\r
+\r
+#ifdef __cplusplus\r
+#define inline inline\r
+#else\r
+#ifndef inline\r
+#define inline\r
+#endif\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/latin1tab.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/latin1tab.h
new file mode 100644 (file)
index 0000000..0c5b1ca
--- /dev/null
@@ -0,0 +1,36 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER,\r
+/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME,\r
+/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER,\r
+/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,\r
+/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,\r
+/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,\r
+/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
+/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/nametab.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/nametab.h
new file mode 100644 (file)
index 0000000..adea34c
--- /dev/null
@@ -0,0 +1,150 @@
+static const unsigned namingBitmap[] = {\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
+0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE,\r
+0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF,\r
+0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF,\r
+0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,\r
+0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,\r
+0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,\r
+0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,\r
+0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,\r
+0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF,\r
+0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000,\r
+0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060,\r
+0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003,\r
+0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003,\r
+0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,\r
+0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001,\r
+0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003,\r
+0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000,\r
+0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003,\r
+0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003,\r
+0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000,\r
+0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000,\r
+0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF,\r
+0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB,\r
+0x40000000, 0xF580C900, 0x00000007, 0x02010800,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
+0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,\r
+0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,\r
+0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,\r
+0x00000000, 0x00004C40, 0x00000000, 0x00000000,\r
+0x00000007, 0x00000000, 0x00000000, 0x00000000,\r
+0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF,\r
+0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF,\r
+0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
+0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,\r
+0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,\r
+0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE,\r
+0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF,\r
+0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,\r
+0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000,\r
+0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003,\r
+0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,\r
+0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,\r
+0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,\r
+0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,\r
+0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF,\r
+0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF,\r
+0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF,\r
+0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF,\r
+0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF,\r
+0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0,\r
+0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1,\r
+0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3,\r
+0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80,\r
+0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3,\r
+0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3,\r
+0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000,\r
+0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000,\r
+0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF,\r
+0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000,\r
+0x00000000, 0x00000000, 0x00000000, 0x00000000,\r
+0x00000000, 0x00000000, 0x1FFF0000, 0x00000002,\r
+0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,\r
+0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF,\r
+};\r
+static const unsigned char nmstrtPages[] = {\r
+0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00,\r
+0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,\r
+0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,\r
+0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+};\r
+static const unsigned char namePages[] = {\r
+0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00,\r
+0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,\r
+0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,\r
+0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,\r
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/utf8tab.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/utf8tab.h
new file mode 100644 (file)
index 0000000..3419601
--- /dev/null
@@ -0,0 +1,37 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+\r
+/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,\r
+/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,\r
+/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,\r
+/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,\r
+/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,\r
+/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,\r
+/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4,\r
+/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,\r
+/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM,\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlparse.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlparse.c
new file mode 100644 (file)
index 0000000..dfbc9d5
--- /dev/null
@@ -0,0 +1,6403 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#include <stddef.h>\r
+#include <string.h>                     /* memset(), memcpy() */\r
+#include <assert.h>\r
+#include <limits.h>                     /* UINT_MAX */\r
+#include <time.h>                       /* time() */\r
+\r
+#define XML_BUILDING_EXPAT 1\r
+\r
+#ifdef COMPILED_FROM_DSP\r
+#include "winconfig.h"\r
+#elif defined(MACOS_CLASSIC)\r
+#include "macconfig.h"\r
+#elif defined(__amigaos__)\r
+#include "amigaconfig.h"\r
+#elif defined(__WATCOMC__)\r
+#include "watcomconfig.h"\r
+#elif defined(HAVE_EXPAT_CONFIG_H)\r
+#include <expat_config.h>\r
+#endif /* ndef COMPILED_FROM_DSP */\r
+\r
+#include "ascii.h"\r
+#include "expat.h"\r
+\r
+#ifdef XML_UNICODE\r
+#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX\r
+#define XmlConvert XmlUtf16Convert\r
+#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding\r
+#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS\r
+#define XmlEncode XmlUtf16Encode\r
+/* Using pointer subtraction to convert to integer type. */\r
+#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))\r
+typedef unsigned short ICHAR;\r
+#else\r
+#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX\r
+#define XmlConvert XmlUtf8Convert\r
+#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding\r
+#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS\r
+#define XmlEncode XmlUtf8Encode\r
+#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)\r
+typedef char ICHAR;\r
+#endif\r
+\r
+\r
+#ifndef XML_NS\r
+\r
+#define XmlInitEncodingNS XmlInitEncoding\r
+#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding\r
+#undef XmlGetInternalEncodingNS\r
+#define XmlGetInternalEncodingNS XmlGetInternalEncoding\r
+#define XmlParseXmlDeclNS XmlParseXmlDecl\r
+\r
+#endif\r
+\r
+#ifdef XML_UNICODE\r
+\r
+#ifdef XML_UNICODE_WCHAR_T\r
+#define XML_T(x) (const wchar_t)x\r
+#define XML_L(x) L ## x\r
+#else\r
+#define XML_T(x) (const unsigned short)x\r
+#define XML_L(x) x\r
+#endif\r
+\r
+#else\r
+\r
+#define XML_T(x) x\r
+#define XML_L(x) x\r
+\r
+#endif\r
+\r
+/* Round up n to be a multiple of sz, where sz is a power of 2. */\r
+#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))\r
+\r
+/* Handle the case where memmove() doesn't exist. */\r
+#ifndef HAVE_MEMMOVE\r
+#ifdef HAVE_BCOPY\r
+#define memmove(d,s,l) bcopy((s),(d),(l))\r
+#else\r
+#error memmove does not exist on this platform, nor is a substitute available\r
+#endif /* HAVE_BCOPY */\r
+#endif /* HAVE_MEMMOVE */\r
+\r
+#include "internal.h"\r
+#include "xmltok.h"\r
+#include "xmlrole.h"\r
+\r
+typedef const XML_Char *KEY;\r
+\r
+typedef struct {\r
+  KEY name;\r
+} NAMED;\r
+\r
+typedef struct {\r
+  NAMED **v;\r
+  unsigned char power;\r
+  size_t size;\r
+  size_t used;\r
+  const XML_Memory_Handling_Suite *mem;\r
+} HASH_TABLE;\r
+\r
+/* Basic character hash algorithm, taken from Python's string hash:\r
+   h = h * 1000003 ^ character, the constant being a prime number.\r
+\r
+*/\r
+#ifdef XML_UNICODE\r
+#define CHAR_HASH(h, c) \\r
+  (((h) * 0xF4243) ^ (unsigned short)(c))\r
+#else\r
+#define CHAR_HASH(h, c) \\r
+  (((h) * 0xF4243) ^ (unsigned char)(c))\r
+#endif\r
+\r
+/* For probing (after a collision) we need a step size relative prime\r
+   to the hash table size, which is a power of 2. We use double-hashing,\r
+   since we can calculate a second hash value cheaply by taking those bits\r
+   of the first hash value that were discarded (masked out) when the table\r
+   index was calculated: index = hash & mask, where mask = table->size - 1.\r
+   We limit the maximum step size to table->size / 4 (mask >> 2) and make\r
+   it odd, since odd numbers are always relative prime to a power of 2.\r
+*/\r
+#define SECOND_HASH(hash, mask, power) \\r
+  ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))\r
+#define PROBE_STEP(hash, mask, power) \\r
+  ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))\r
+\r
+typedef struct {\r
+  NAMED **p;\r
+  NAMED **end;\r
+} HASH_TABLE_ITER;\r
+\r
+#define INIT_TAG_BUF_SIZE 32  /* must be a multiple of sizeof(XML_Char) */\r
+#define INIT_DATA_BUF_SIZE 1024\r
+#define INIT_ATTS_SIZE 16\r
+#define INIT_ATTS_VERSION 0xFFFFFFFF\r
+#define INIT_BLOCK_SIZE 1024\r
+#define INIT_BUFFER_SIZE 1024\r
+\r
+#define EXPAND_SPARE 24\r
+\r
+typedef struct binding {\r
+  struct prefix *prefix;\r
+  struct binding *nextTagBinding;\r
+  struct binding *prevPrefixBinding;\r
+  const struct attribute_id *attId;\r
+  XML_Char *uri;\r
+  int uriLen;\r
+  int uriAlloc;\r
+} BINDING;\r
+\r
+typedef struct prefix {\r
+  const XML_Char *name;\r
+  BINDING *binding;\r
+} PREFIX;\r
+\r
+typedef struct {\r
+  const XML_Char *str;\r
+  const XML_Char *localPart;\r
+  const XML_Char *prefix;\r
+  int strLen;\r
+  int uriLen;\r
+  int prefixLen;\r
+} TAG_NAME;\r
+\r
+/* TAG represents an open element.\r
+   The name of the element is stored in both the document and API\r
+   encodings.  The memory buffer 'buf' is a separately-allocated\r
+   memory area which stores the name.  During the XML_Parse()/\r
+   XMLParseBuffer() when the element is open, the memory for the 'raw'\r
+   version of the name (in the document encoding) is shared with the\r
+   document buffer.  If the element is open across calls to\r
+   XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to\r
+   contain the 'raw' name as well.\r
+\r
+   A parser re-uses these structures, maintaining a list of allocated\r
+   TAG objects in a free list.\r
+*/\r
+typedef struct tag {\r
+  struct tag *parent;           /* parent of this element */\r
+  const char *rawName;          /* tagName in the original encoding */\r
+  int rawNameLength;\r
+  TAG_NAME name;                /* tagName in the API encoding */\r
+  char *buf;                    /* buffer for name components */\r
+  char *bufEnd;                 /* end of the buffer */\r
+  BINDING *bindings;\r
+} TAG;\r
+\r
+typedef struct {\r
+  const XML_Char *name;\r
+  const XML_Char *textPtr;\r
+  int textLen;                  /* length in XML_Chars */\r
+  int processed;                /* # of processed bytes - when suspended */\r
+  const XML_Char *systemId;\r
+  const XML_Char *base;\r
+  const XML_Char *publicId;\r
+  const XML_Char *notation;\r
+  XML_Bool open;\r
+  XML_Bool is_param;\r
+  XML_Bool is_internal; /* true if declared in internal subset outside PE */\r
+} ENTITY;\r
+\r
+typedef struct {\r
+  enum XML_Content_Type         type;\r
+  enum XML_Content_Quant        quant;\r
+  const XML_Char *              name;\r
+  int                           firstchild;\r
+  int                           lastchild;\r
+  int                           childcnt;\r
+  int                           nextsib;\r
+} CONTENT_SCAFFOLD;\r
+\r
+#define INIT_SCAFFOLD_ELEMENTS 32\r
+\r
+typedef struct block {\r
+  struct block *next;\r
+  int size;\r
+  XML_Char s[1];\r
+} BLOCK;\r
+\r
+typedef struct {\r
+  BLOCK *blocks;\r
+  BLOCK *freeBlocks;\r
+  const XML_Char *end;\r
+  XML_Char *ptr;\r
+  XML_Char *start;\r
+  const XML_Memory_Handling_Suite *mem;\r
+} STRING_POOL;\r
+\r
+/* The XML_Char before the name is used to determine whether\r
+   an attribute has been specified. */\r
+typedef struct attribute_id {\r
+  XML_Char *name;\r
+  PREFIX *prefix;\r
+  XML_Bool maybeTokenized;\r
+  XML_Bool xmlns;\r
+} ATTRIBUTE_ID;\r
+\r
+typedef struct {\r
+  const ATTRIBUTE_ID *id;\r
+  XML_Bool isCdata;\r
+  const XML_Char *value;\r
+} DEFAULT_ATTRIBUTE;\r
+\r
+typedef struct {\r
+  unsigned long version;\r
+  unsigned long hash;\r
+  const XML_Char *uriName;\r
+} NS_ATT;\r
+\r
+typedef struct {\r
+  const XML_Char *name;\r
+  PREFIX *prefix;\r
+  const ATTRIBUTE_ID *idAtt;\r
+  int nDefaultAtts;\r
+  int allocDefaultAtts;\r
+  DEFAULT_ATTRIBUTE *defaultAtts;\r
+} ELEMENT_TYPE;\r
+\r
+typedef struct {\r
+  HASH_TABLE generalEntities;\r
+  HASH_TABLE elementTypes;\r
+  HASH_TABLE attributeIds;\r
+  HASH_TABLE prefixes;\r
+  STRING_POOL pool;\r
+  STRING_POOL entityValuePool;\r
+  /* false once a parameter entity reference has been skipped */\r
+  XML_Bool keepProcessing;\r
+  /* true once an internal or external PE reference has been encountered;\r
+     this includes the reference to an external subset */\r
+  XML_Bool hasParamEntityRefs;\r
+  XML_Bool standalone;\r
+#ifdef XML_DTD\r
+  /* indicates if external PE has been read */\r
+  XML_Bool paramEntityRead;\r
+  HASH_TABLE paramEntities;\r
+#endif /* XML_DTD */\r
+  PREFIX defaultPrefix;\r
+  /* === scaffolding for building content model === */\r
+  XML_Bool in_eldecl;\r
+  CONTENT_SCAFFOLD *scaffold;\r
+  unsigned contentStringLen;\r
+  unsigned scaffSize;\r
+  unsigned scaffCount;\r
+  int scaffLevel;\r
+  int *scaffIndex;\r
+} DTD;\r
+\r
+typedef struct open_internal_entity {\r
+  const char *internalEventPtr;\r
+  const char *internalEventEndPtr;\r
+  struct open_internal_entity *next;\r
+  ENTITY *entity;\r
+  int startTagLevel;\r
+  XML_Bool betweenDecl; /* WFC: PE Between Declarations */\r
+} OPEN_INTERNAL_ENTITY;\r
+\r
+typedef enum XML_Error PTRCALL Processor(XML_Parser parser,\r
+                                         const char *start,\r
+                                         const char *end,\r
+                                         const char **endPtr);\r
+\r
+static Processor prologProcessor;\r
+static Processor prologInitProcessor;\r
+static Processor contentProcessor;\r
+static Processor cdataSectionProcessor;\r
+#ifdef XML_DTD\r
+static Processor ignoreSectionProcessor;\r
+static Processor externalParEntProcessor;\r
+static Processor externalParEntInitProcessor;\r
+static Processor entityValueProcessor;\r
+static Processor entityValueInitProcessor;\r
+#endif /* XML_DTD */\r
+static Processor epilogProcessor;\r
+static Processor errorProcessor;\r
+static Processor externalEntityInitProcessor;\r
+static Processor externalEntityInitProcessor2;\r
+static Processor externalEntityInitProcessor3;\r
+static Processor externalEntityContentProcessor;\r
+static Processor internalEntityProcessor;\r
+\r
+static enum XML_Error\r
+handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);\r
+static enum XML_Error\r
+processXmlDecl(XML_Parser parser, int isGeneralTextEntity,\r
+               const char *s, const char *next);\r
+static enum XML_Error\r
+initializeEncoding(XML_Parser parser);\r
+static enum XML_Error\r
+doProlog(XML_Parser parser, const ENCODING *enc, const char *s,\r
+         const char *end, int tok, const char *next, const char **nextPtr,\r
+         XML_Bool haveMore);\r
+static enum XML_Error\r
+processInternalEntity(XML_Parser parser, ENTITY *entity,\r
+                      XML_Bool betweenDecl);\r
+static enum XML_Error\r
+doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,\r
+          const char *start, const char *end, const char **endPtr,\r
+          XML_Bool haveMore);\r
+static enum XML_Error\r
+doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,\r
+               const char *end, const char **nextPtr, XML_Bool haveMore);\r
+#ifdef XML_DTD\r
+static enum XML_Error\r
+doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,\r
+                const char *end, const char **nextPtr, XML_Bool haveMore);\r
+#endif /* XML_DTD */\r
+\r
+static enum XML_Error\r
+storeAtts(XML_Parser parser, const ENCODING *, const char *s,\r
+          TAG_NAME *tagNamePtr, BINDING **bindingsPtr);\r
+static enum XML_Error\r
+addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,\r
+           const XML_Char *uri, BINDING **bindingsPtr);\r
+static int\r
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,\r
+                XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);\r
+static enum XML_Error\r
+storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,\r
+                    const char *, const char *, STRING_POOL *);\r
+static enum XML_Error\r
+appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,\r
+                     const char *, const char *, STRING_POOL *);\r
+static ATTRIBUTE_ID *\r
+getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,\r
+               const char *end);\r
+static int\r
+setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);\r
+static enum XML_Error\r
+storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,\r
+                 const char *end);\r
+static int\r
+reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,\r
+                            const char *start, const char *end);\r
+static int\r
+reportComment(XML_Parser parser, const ENCODING *enc, const char *start,\r
+              const char *end);\r
+static void\r
+reportDefault(XML_Parser parser, const ENCODING *enc, const char *start,\r
+              const char *end);\r
+\r
+static const XML_Char * getContext(XML_Parser parser);\r
+static XML_Bool\r
+setContext(XML_Parser parser, const XML_Char *context);\r
+\r
+static void FASTCALL normalizePublicId(XML_Char *s);\r
+\r
+static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);\r
+/* do not call if parentParser != NULL */\r
+static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);\r
+static void\r
+dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);\r
+static int\r
+dtdCopy(XML_Parser oldParser,\r
+        DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);\r
+static int\r
+copyEntityTable(XML_Parser oldParser,\r
+                HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);\r
+static NAMED *\r
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);\r
+static void FASTCALL\r
+hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);\r
+static void FASTCALL hashTableClear(HASH_TABLE *);\r
+static void FASTCALL hashTableDestroy(HASH_TABLE *);\r
+static void FASTCALL\r
+hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);\r
+static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);\r
+\r
+static void FASTCALL\r
+poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);\r
+static void FASTCALL poolClear(STRING_POOL *);\r
+static void FASTCALL poolDestroy(STRING_POOL *);\r
+static XML_Char *\r
+poolAppend(STRING_POOL *pool, const ENCODING *enc,\r
+           const char *ptr, const char *end);\r
+static XML_Char *\r
+poolStoreString(STRING_POOL *pool, const ENCODING *enc,\r
+                const char *ptr, const char *end);\r
+static XML_Bool FASTCALL poolGrow(STRING_POOL *pool);\r
+static const XML_Char * FASTCALL\r
+poolCopyString(STRING_POOL *pool, const XML_Char *s);\r
+static const XML_Char *\r
+poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);\r
+static const XML_Char * FASTCALL\r
+poolAppendString(STRING_POOL *pool, const XML_Char *s);\r
+\r
+static int FASTCALL nextScaffoldPart(XML_Parser parser);\r
+static XML_Content * build_model(XML_Parser parser);\r
+static ELEMENT_TYPE *\r
+getElementType(XML_Parser parser, const ENCODING *enc,\r
+               const char *ptr, const char *end);\r
+\r
+static unsigned long generate_hash_secret_salt(void);\r
+static XML_Bool startParsing(XML_Parser parser);\r
+\r
+static XML_Parser\r
+parserCreate(const XML_Char *encodingName,\r
+             const XML_Memory_Handling_Suite *memsuite,\r
+             const XML_Char *nameSep,\r
+             DTD *dtd);\r
+\r
+static void\r
+parserInit(XML_Parser parser, const XML_Char *encodingName);\r
+\r
+#define poolStart(pool) ((pool)->start)\r
+#define poolEnd(pool) ((pool)->ptr)\r
+#define poolLength(pool) ((pool)->ptr - (pool)->start)\r
+#define poolChop(pool) ((void)--(pool->ptr))\r
+#define poolLastChar(pool) (((pool)->ptr)[-1])\r
+#define poolDiscard(pool) ((pool)->ptr = (pool)->start)\r
+#define poolFinish(pool) ((pool)->start = (pool)->ptr)\r
+#define poolAppendChar(pool, c) \\r
+  (((pool)->ptr == (pool)->end && !poolGrow(pool)) \\r
+   ? 0 \\r
+   : ((*((pool)->ptr)++ = c), 1))\r
+\r
+struct XML_ParserStruct {\r
+  /* The first member must be userData so that the XML_GetUserData\r
+     macro works. */\r
+  void *m_userData;\r
+  void *m_handlerArg;\r
+  char *m_buffer;\r
+  const XML_Memory_Handling_Suite m_mem;\r
+  /* first character to be parsed */\r
+  const char *m_bufferPtr;\r
+  /* past last character to be parsed */\r
+  char *m_bufferEnd;\r
+  /* allocated end of buffer */\r
+  const char *m_bufferLim;\r
+  XML_Index m_parseEndByteIndex;\r
+  const char *m_parseEndPtr;\r
+  XML_Char *m_dataBuf;\r
+  XML_Char *m_dataBufEnd;\r
+  XML_StartElementHandler m_startElementHandler;\r
+  XML_EndElementHandler m_endElementHandler;\r
+  XML_CharacterDataHandler m_characterDataHandler;\r
+  XML_ProcessingInstructionHandler m_processingInstructionHandler;\r
+  XML_CommentHandler m_commentHandler;\r
+  XML_StartCdataSectionHandler m_startCdataSectionHandler;\r
+  XML_EndCdataSectionHandler m_endCdataSectionHandler;\r
+  XML_DefaultHandler m_defaultHandler;\r
+  XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;\r
+  XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;\r
+  XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;\r
+  XML_NotationDeclHandler m_notationDeclHandler;\r
+  XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;\r
+  XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;\r
+  XML_NotStandaloneHandler m_notStandaloneHandler;\r
+  XML_ExternalEntityRefHandler m_externalEntityRefHandler;\r
+  XML_Parser m_externalEntityRefHandlerArg;\r
+  XML_SkippedEntityHandler m_skippedEntityHandler;\r
+  XML_UnknownEncodingHandler m_unknownEncodingHandler;\r
+  XML_ElementDeclHandler m_elementDeclHandler;\r
+  XML_AttlistDeclHandler m_attlistDeclHandler;\r
+  XML_EntityDeclHandler m_entityDeclHandler;\r
+  XML_XmlDeclHandler m_xmlDeclHandler;\r
+  const ENCODING *m_encoding;\r
+  INIT_ENCODING m_initEncoding;\r
+  const ENCODING *m_internalEncoding;\r
+  const XML_Char *m_protocolEncodingName;\r
+  XML_Bool m_ns;\r
+  XML_Bool m_ns_triplets;\r
+  void *m_unknownEncodingMem;\r
+  void *m_unknownEncodingData;\r
+  void *m_unknownEncodingHandlerData;\r
+  void (XMLCALL *m_unknownEncodingRelease)(void *);\r
+  PROLOG_STATE m_prologState;\r
+  Processor *m_processor;\r
+  enum XML_Error m_errorCode;\r
+  const char *m_eventPtr;\r
+  const char *m_eventEndPtr;\r
+  const char *m_positionPtr;\r
+  OPEN_INTERNAL_ENTITY *m_openInternalEntities;\r
+  OPEN_INTERNAL_ENTITY *m_freeInternalEntities;\r
+  XML_Bool m_defaultExpandInternalEntities;\r
+  int m_tagLevel;\r
+  ENTITY *m_declEntity;\r
+  const XML_Char *m_doctypeName;\r
+  const XML_Char *m_doctypeSysid;\r
+  const XML_Char *m_doctypePubid;\r
+  const XML_Char *m_declAttributeType;\r
+  const XML_Char *m_declNotationName;\r
+  const XML_Char *m_declNotationPublicId;\r
+  ELEMENT_TYPE *m_declElementType;\r
+  ATTRIBUTE_ID *m_declAttributeId;\r
+  XML_Bool m_declAttributeIsCdata;\r
+  XML_Bool m_declAttributeIsId;\r
+  DTD *m_dtd;\r
+  const XML_Char *m_curBase;\r
+  TAG *m_tagStack;\r
+  TAG *m_freeTagList;\r
+  BINDING *m_inheritedBindings;\r
+  BINDING *m_freeBindingList;\r
+  int m_attsSize;\r
+  int m_nSpecifiedAtts;\r
+  int m_idAttIndex;\r
+  ATTRIBUTE *m_atts;\r
+  NS_ATT *m_nsAtts;\r
+  unsigned long m_nsAttsVersion;\r
+  unsigned char m_nsAttsPower;\r
+#ifdef XML_ATTR_INFO\r
+  XML_AttrInfo *m_attInfo;\r
+#endif\r
+  POSITION m_position;\r
+  STRING_POOL m_tempPool;\r
+  STRING_POOL m_temp2Pool;\r
+  char *m_groupConnector;\r
+  unsigned int m_groupSize;\r
+  XML_Char m_namespaceSeparator;\r
+  XML_Parser m_parentParser;\r
+  XML_ParsingStatus m_parsingStatus;\r
+#ifdef XML_DTD\r
+  XML_Bool m_isParamEntity;\r
+  XML_Bool m_useForeignDTD;\r
+  enum XML_ParamEntityParsing m_paramEntityParsing;\r
+#endif\r
+  unsigned long m_hash_secret_salt;\r
+};\r
+\r
+#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))\r
+#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))\r
+#define FREE(p) (parser->m_mem.free_fcn((p)))\r
+\r
+#define userData (parser->m_userData)\r
+#define handlerArg (parser->m_handlerArg)\r
+#define startElementHandler (parser->m_startElementHandler)\r
+#define endElementHandler (parser->m_endElementHandler)\r
+#define characterDataHandler (parser->m_characterDataHandler)\r
+#define processingInstructionHandler \\r
+        (parser->m_processingInstructionHandler)\r
+#define commentHandler (parser->m_commentHandler)\r
+#define startCdataSectionHandler \\r
+        (parser->m_startCdataSectionHandler)\r
+#define endCdataSectionHandler (parser->m_endCdataSectionHandler)\r
+#define defaultHandler (parser->m_defaultHandler)\r
+#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)\r
+#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)\r
+#define unparsedEntityDeclHandler \\r
+        (parser->m_unparsedEntityDeclHandler)\r
+#define notationDeclHandler (parser->m_notationDeclHandler)\r
+#define startNamespaceDeclHandler \\r
+        (parser->m_startNamespaceDeclHandler)\r
+#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)\r
+#define notStandaloneHandler (parser->m_notStandaloneHandler)\r
+#define externalEntityRefHandler \\r
+        (parser->m_externalEntityRefHandler)\r
+#define externalEntityRefHandlerArg \\r
+        (parser->m_externalEntityRefHandlerArg)\r
+#define internalEntityRefHandler \\r
+        (parser->m_internalEntityRefHandler)\r
+#define skippedEntityHandler (parser->m_skippedEntityHandler)\r
+#define unknownEncodingHandler (parser->m_unknownEncodingHandler)\r
+#define elementDeclHandler (parser->m_elementDeclHandler)\r
+#define attlistDeclHandler (parser->m_attlistDeclHandler)\r
+#define entityDeclHandler (parser->m_entityDeclHandler)\r
+#define xmlDeclHandler (parser->m_xmlDeclHandler)\r
+#define encoding (parser->m_encoding)\r
+#define initEncoding (parser->m_initEncoding)\r
+#define internalEncoding (parser->m_internalEncoding)\r
+#define unknownEncodingMem (parser->m_unknownEncodingMem)\r
+#define unknownEncodingData (parser->m_unknownEncodingData)\r
+#define unknownEncodingHandlerData \\r
+  (parser->m_unknownEncodingHandlerData)\r
+#define unknownEncodingRelease (parser->m_unknownEncodingRelease)\r
+#define protocolEncodingName (parser->m_protocolEncodingName)\r
+#define ns (parser->m_ns)\r
+#define ns_triplets (parser->m_ns_triplets)\r
+#define prologState (parser->m_prologState)\r
+#define processor (parser->m_processor)\r
+#define errorCode (parser->m_errorCode)\r
+#define eventPtr (parser->m_eventPtr)\r
+#define eventEndPtr (parser->m_eventEndPtr)\r
+#define positionPtr (parser->m_positionPtr)\r
+#define position (parser->m_position)\r
+#define openInternalEntities (parser->m_openInternalEntities)\r
+#define freeInternalEntities (parser->m_freeInternalEntities)\r
+#define defaultExpandInternalEntities \\r
+        (parser->m_defaultExpandInternalEntities)\r
+#define tagLevel (parser->m_tagLevel)\r
+#define buffer (parser->m_buffer)\r
+#define bufferPtr (parser->m_bufferPtr)\r
+#define bufferEnd (parser->m_bufferEnd)\r
+#define parseEndByteIndex (parser->m_parseEndByteIndex)\r
+#define parseEndPtr (parser->m_parseEndPtr)\r
+#define bufferLim (parser->m_bufferLim)\r
+#define dataBuf (parser->m_dataBuf)\r
+#define dataBufEnd (parser->m_dataBufEnd)\r
+#define _dtd (parser->m_dtd)\r
+#define curBase (parser->m_curBase)\r
+#define declEntity (parser->m_declEntity)\r
+#define doctypeName (parser->m_doctypeName)\r
+#define doctypeSysid (parser->m_doctypeSysid)\r
+#define doctypePubid (parser->m_doctypePubid)\r
+#define declAttributeType (parser->m_declAttributeType)\r
+#define declNotationName (parser->m_declNotationName)\r
+#define declNotationPublicId (parser->m_declNotationPublicId)\r
+#define declElementType (parser->m_declElementType)\r
+#define declAttributeId (parser->m_declAttributeId)\r
+#define declAttributeIsCdata (parser->m_declAttributeIsCdata)\r
+#define declAttributeIsId (parser->m_declAttributeIsId)\r
+#define freeTagList (parser->m_freeTagList)\r
+#define freeBindingList (parser->m_freeBindingList)\r
+#define inheritedBindings (parser->m_inheritedBindings)\r
+#define tagStack (parser->m_tagStack)\r
+#define atts (parser->m_atts)\r
+#define attsSize (parser->m_attsSize)\r
+#define nSpecifiedAtts (parser->m_nSpecifiedAtts)\r
+#define idAttIndex (parser->m_idAttIndex)\r
+#define nsAtts (parser->m_nsAtts)\r
+#define nsAttsVersion (parser->m_nsAttsVersion)\r
+#define nsAttsPower (parser->m_nsAttsPower)\r
+#define attInfo (parser->m_attInfo)\r
+#define tempPool (parser->m_tempPool)\r
+#define temp2Pool (parser->m_temp2Pool)\r
+#define groupConnector (parser->m_groupConnector)\r
+#define groupSize (parser->m_groupSize)\r
+#define namespaceSeparator (parser->m_namespaceSeparator)\r
+#define parentParser (parser->m_parentParser)\r
+#define ps_parsing (parser->m_parsingStatus.parsing)\r
+#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer)\r
+#ifdef XML_DTD\r
+#define isParamEntity (parser->m_isParamEntity)\r
+#define useForeignDTD (parser->m_useForeignDTD)\r
+#define paramEntityParsing (parser->m_paramEntityParsing)\r
+#endif /* XML_DTD */\r
+#define hash_secret_salt (parser->m_hash_secret_salt)\r
+\r
+XML_Parser XMLCALL\r
+XML_ParserCreate(const XML_Char *encodingName)\r
+{\r
+  return XML_ParserCreate_MM(encodingName, NULL, NULL);\r
+}\r
+\r
+XML_Parser XMLCALL\r
+XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)\r
+{\r
+  XML_Char tmp[2];\r
+  *tmp = nsSep;\r
+  return XML_ParserCreate_MM(encodingName, NULL, tmp);\r
+}\r
+\r
+static const XML_Char implicitContext[] = {\r
+  ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,\r
+  ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,\r
+  ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,\r
+  ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,\r
+  ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,\r
+  ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'\r
+};\r
+\r
+static unsigned long\r
+generate_hash_secret_salt(void)\r
+{\r
+  unsigned int seed = time(NULL) % UINT_MAX;\r
+  srand(seed);\r
+  return rand();\r
+}\r
+\r
+static XML_Bool  /* only valid for root parser */\r
+startParsing(XML_Parser parser)\r
+{\r
+    /* hash functions must be initialized before setContext() is called */\r
+    if (hash_secret_salt == 0)\r
+      hash_secret_salt = generate_hash_secret_salt();\r
+    if (ns) {\r
+      /* implicit context only set for root parser, since child\r
+         parsers (i.e. external entity parsers) will inherit it\r
+      */\r
+      return setContext(parser, implicitContext);\r
+    }\r
+    return XML_TRUE;\r
+}\r
+\r
+XML_Parser XMLCALL\r
+XML_ParserCreate_MM(const XML_Char *encodingName,\r
+                    const XML_Memory_Handling_Suite *memsuite,\r
+                    const XML_Char *nameSep)\r
+{\r
+  return parserCreate(encodingName, memsuite, nameSep, NULL);\r
+}\r
+\r
+static XML_Parser\r
+parserCreate(const XML_Char *encodingName,\r
+             const XML_Memory_Handling_Suite *memsuite,\r
+             const XML_Char *nameSep,\r
+             DTD *dtd)\r
+{\r
+  XML_Parser parser;\r
+\r
+  if (memsuite) {\r
+    XML_Memory_Handling_Suite *mtemp;\r
+    parser = (XML_Parser)\r
+      memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));\r
+    if (parser != NULL) {\r
+      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);\r
+      mtemp->malloc_fcn = memsuite->malloc_fcn;\r
+      mtemp->realloc_fcn = memsuite->realloc_fcn;\r
+      mtemp->free_fcn = memsuite->free_fcn;\r
+    }\r
+  }\r
+  else {\r
+    XML_Memory_Handling_Suite *mtemp;\r
+    parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));\r
+    if (parser != NULL) {\r
+      mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);\r
+      mtemp->malloc_fcn = malloc;\r
+      mtemp->realloc_fcn = realloc;\r
+      mtemp->free_fcn = free;\r
+    }\r
+  }\r
+\r
+  if (!parser)\r
+    return parser;\r
+\r
+  buffer = NULL;\r
+  bufferLim = NULL;\r
+\r
+  attsSize = INIT_ATTS_SIZE;\r
+  atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));\r
+  if (atts == NULL) {\r
+    FREE(parser);\r
+    return NULL;\r
+  }\r
+#ifdef XML_ATTR_INFO\r
+  attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));\r
+  if (attInfo == NULL) {\r
+    FREE(atts);\r
+    FREE(parser);\r
+    return NULL;\r
+  }\r
+#endif\r
+  dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));\r
+  if (dataBuf == NULL) {\r
+    FREE(atts);\r
+#ifdef XML_ATTR_INFO\r
+    FREE(attInfo);\r
+#endif\r
+    FREE(parser);\r
+    return NULL;\r
+  }\r
+  dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;\r
+\r
+  if (dtd)\r
+    _dtd = dtd;\r
+  else {\r
+    _dtd = dtdCreate(&parser->m_mem);\r
+    if (_dtd == NULL) {\r
+      FREE(dataBuf);\r
+      FREE(atts);\r
+#ifdef XML_ATTR_INFO\r
+      FREE(attInfo);\r
+#endif\r
+      FREE(parser);\r
+      return NULL;\r
+    }\r
+  }\r
+\r
+  freeBindingList = NULL;\r
+  freeTagList = NULL;\r
+  freeInternalEntities = NULL;\r
+\r
+  groupSize = 0;\r
+  groupConnector = NULL;\r
+\r
+  unknownEncodingHandler = NULL;\r
+  unknownEncodingHandlerData = NULL;\r
+\r
+  namespaceSeparator = ASCII_EXCL;\r
+  ns = XML_FALSE;\r
+  ns_triplets = XML_FALSE;\r
+\r
+  nsAtts = NULL;\r
+  nsAttsVersion = 0;\r
+  nsAttsPower = 0;\r
+\r
+  poolInit(&tempPool, &(parser->m_mem));\r
+  poolInit(&temp2Pool, &(parser->m_mem));\r
+  parserInit(parser, encodingName);\r
+\r
+  if (encodingName && !protocolEncodingName) {\r
+    XML_ParserFree(parser);\r
+    return NULL;\r
+  }\r
+\r
+  if (nameSep) {\r
+    ns = XML_TRUE;\r
+    internalEncoding = XmlGetInternalEncodingNS();\r
+    namespaceSeparator = *nameSep;\r
+  }\r
+  else {\r
+    internalEncoding = XmlGetInternalEncoding();\r
+  }\r
+\r
+  return parser;\r
+}\r
+\r
+static void\r
+parserInit(XML_Parser parser, const XML_Char *encodingName)\r
+{\r
+  processor = prologInitProcessor;\r
+  XmlPrologStateInit(&prologState);\r
+  protocolEncodingName = (encodingName != NULL\r
+                          ? poolCopyString(&tempPool, encodingName)\r
+                          : NULL);\r
+  curBase = NULL;\r
+  XmlInitEncoding(&initEncoding, &encoding, 0);\r
+  userData = NULL;\r
+  handlerArg = NULL;\r
+  startElementHandler = NULL;\r
+  endElementHandler = NULL;\r
+  characterDataHandler = NULL;\r
+  processingInstructionHandler = NULL;\r
+  commentHandler = NULL;\r
+  startCdataSectionHandler = NULL;\r
+  endCdataSectionHandler = NULL;\r
+  defaultHandler = NULL;\r
+  startDoctypeDeclHandler = NULL;\r
+  endDoctypeDeclHandler = NULL;\r
+  unparsedEntityDeclHandler = NULL;\r
+  notationDeclHandler = NULL;\r
+  startNamespaceDeclHandler = NULL;\r
+  endNamespaceDeclHandler = NULL;\r
+  notStandaloneHandler = NULL;\r
+  externalEntityRefHandler = NULL;\r
+  externalEntityRefHandlerArg = parser;\r
+  skippedEntityHandler = NULL;\r
+  elementDeclHandler = NULL;\r
+  attlistDeclHandler = NULL;\r
+  entityDeclHandler = NULL;\r
+  xmlDeclHandler = NULL;\r
+  bufferPtr = buffer;\r
+  bufferEnd = buffer;\r
+  parseEndByteIndex = 0;\r
+  parseEndPtr = NULL;\r
+  declElementType = NULL;\r
+  declAttributeId = NULL;\r
+  declEntity = NULL;\r
+  doctypeName = NULL;\r
+  doctypeSysid = NULL;\r
+  doctypePubid = NULL;\r
+  declAttributeType = NULL;\r
+  declNotationName = NULL;\r
+  declNotationPublicId = NULL;\r
+  declAttributeIsCdata = XML_FALSE;\r
+  declAttributeIsId = XML_FALSE;\r
+  memset(&position, 0, sizeof(POSITION));\r
+  errorCode = XML_ERROR_NONE;\r
+  eventPtr = NULL;\r
+  eventEndPtr = NULL;\r
+  positionPtr = NULL;\r
+  openInternalEntities = NULL;\r
+  defaultExpandInternalEntities = XML_TRUE;\r
+  tagLevel = 0;\r
+  tagStack = NULL;\r
+  inheritedBindings = NULL;\r
+  nSpecifiedAtts = 0;\r
+  unknownEncodingMem = NULL;\r
+  unknownEncodingRelease = NULL;\r
+  unknownEncodingData = NULL;\r
+  parentParser = NULL;\r
+  ps_parsing = XML_INITIALIZED;\r
+#ifdef XML_DTD\r
+  isParamEntity = XML_FALSE;\r
+  useForeignDTD = XML_FALSE;\r
+  paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;\r
+#endif\r
+  hash_secret_salt = 0;\r
+}\r
+\r
+/* moves list of bindings to freeBindingList */\r
+static void FASTCALL\r
+moveToFreeBindingList(XML_Parser parser, BINDING *bindings)\r
+{\r
+  while (bindings) {\r
+    BINDING *b = bindings;\r
+    bindings = bindings->nextTagBinding;\r
+    b->nextTagBinding = freeBindingList;\r
+    freeBindingList = b;\r
+  }\r
+}\r
+\r
+XML_Bool XMLCALL\r
+XML_ParserReset(XML_Parser parser, const XML_Char *encodingName)\r
+{\r
+  TAG *tStk;\r
+  OPEN_INTERNAL_ENTITY *openEntityList;\r
+  if (parentParser)\r
+    return XML_FALSE;\r
+  /* move tagStack to freeTagList */\r
+  tStk = tagStack;\r
+  while (tStk) {\r
+    TAG *tag = tStk;\r
+    tStk = tStk->parent;\r
+    tag->parent = freeTagList;\r
+    moveToFreeBindingList(parser, tag->bindings);\r
+    tag->bindings = NULL;\r
+    freeTagList = tag;\r
+  }\r
+  /* move openInternalEntities to freeInternalEntities */\r
+  openEntityList = openInternalEntities;\r
+  while (openEntityList) {\r
+    OPEN_INTERNAL_ENTITY *openEntity = openEntityList;\r
+    openEntityList = openEntity->next;\r
+    openEntity->next = freeInternalEntities;\r
+    freeInternalEntities = openEntity;\r
+  }\r
+  moveToFreeBindingList(parser, inheritedBindings);\r
+  FREE(unknownEncodingMem);\r
+  if (unknownEncodingRelease)\r
+    unknownEncodingRelease(unknownEncodingData);\r
+  poolClear(&tempPool);\r
+  poolClear(&temp2Pool);\r
+  parserInit(parser, encodingName);\r
+  dtdReset(_dtd, &parser->m_mem);\r
+  return XML_TRUE;\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)\r
+{\r
+  /* Block after XML_Parse()/XML_ParseBuffer() has been called.\r
+     XXX There's no way for the caller to determine which of the\r
+     XXX possible error cases caused the XML_STATUS_ERROR return.\r
+  */\r
+  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)\r
+    return XML_STATUS_ERROR;\r
+  if (encodingName == NULL)\r
+    protocolEncodingName = NULL;\r
+  else {\r
+    protocolEncodingName = poolCopyString(&tempPool, encodingName);\r
+    if (!protocolEncodingName)\r
+      return XML_STATUS_ERROR;\r
+  }\r
+  return XML_STATUS_OK;\r
+}\r
+\r
+XML_Parser XMLCALL\r
+XML_ExternalEntityParserCreate(XML_Parser oldParser,\r
+                               const XML_Char *context,\r
+                               const XML_Char *encodingName)\r
+{\r
+  XML_Parser parser = oldParser;\r
+  DTD *newDtd = NULL;\r
+  DTD *oldDtd = _dtd;\r
+  XML_StartElementHandler oldStartElementHandler = startElementHandler;\r
+  XML_EndElementHandler oldEndElementHandler = endElementHandler;\r
+  XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;\r
+  XML_ProcessingInstructionHandler oldProcessingInstructionHandler\r
+      = processingInstructionHandler;\r
+  XML_CommentHandler oldCommentHandler = commentHandler;\r
+  XML_StartCdataSectionHandler oldStartCdataSectionHandler\r
+      = startCdataSectionHandler;\r
+  XML_EndCdataSectionHandler oldEndCdataSectionHandler\r
+      = endCdataSectionHandler;\r
+  XML_DefaultHandler oldDefaultHandler = defaultHandler;\r
+  XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler\r
+      = unparsedEntityDeclHandler;\r
+  XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler;\r
+  XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler\r
+      = startNamespaceDeclHandler;\r
+  XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler\r
+      = endNamespaceDeclHandler;\r
+  XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;\r
+  XML_ExternalEntityRefHandler oldExternalEntityRefHandler\r
+      = externalEntityRefHandler;\r
+  XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler;\r
+  XML_UnknownEncodingHandler oldUnknownEncodingHandler\r
+      = unknownEncodingHandler;\r
+  XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler;\r
+  XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler;\r
+  XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler;\r
+  XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler;\r
+  ELEMENT_TYPE * oldDeclElementType = declElementType;\r
+\r
+  void *oldUserData = userData;\r
+  void *oldHandlerArg = handlerArg;\r
+  XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities;\r
+  XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;\r
+#ifdef XML_DTD\r
+  enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing;\r
+  int oldInEntityValue = prologState.inEntityValue;\r
+#endif\r
+  XML_Bool oldns_triplets = ns_triplets;\r
+  /* Note that the new parser shares the same hash secret as the old\r
+     parser, so that dtdCopy and copyEntityTable can lookup values\r
+     from hash tables associated with either parser without us having\r
+     to worry which hash secrets each table has.\r
+  */\r
+  unsigned long oldhash_secret_salt = hash_secret_salt;\r
+\r
+#ifdef XML_DTD\r
+  if (!context)\r
+    newDtd = oldDtd;\r
+#endif /* XML_DTD */\r
+\r
+  /* Note that the magical uses of the pre-processor to make field\r
+     access look more like C++ require that `parser' be overwritten\r
+     here.  This makes this function more painful to follow than it\r
+     would be otherwise.\r
+  */\r
+  if (ns) {\r
+    XML_Char tmp[2];\r
+    *tmp = namespaceSeparator;\r
+    parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);\r
+  }\r
+  else {\r
+    parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);\r
+  }\r
+\r
+  if (!parser)\r
+    return NULL;\r
+\r
+  startElementHandler = oldStartElementHandler;\r
+  endElementHandler = oldEndElementHandler;\r
+  characterDataHandler = oldCharacterDataHandler;\r
+  processingInstructionHandler = oldProcessingInstructionHandler;\r
+  commentHandler = oldCommentHandler;\r
+  startCdataSectionHandler = oldStartCdataSectionHandler;\r
+  endCdataSectionHandler = oldEndCdataSectionHandler;\r
+  defaultHandler = oldDefaultHandler;\r
+  unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;\r
+  notationDeclHandler = oldNotationDeclHandler;\r
+  startNamespaceDeclHandler = oldStartNamespaceDeclHandler;\r
+  endNamespaceDeclHandler = oldEndNamespaceDeclHandler;\r
+  notStandaloneHandler = oldNotStandaloneHandler;\r
+  externalEntityRefHandler = oldExternalEntityRefHandler;\r
+  skippedEntityHandler = oldSkippedEntityHandler;\r
+  unknownEncodingHandler = oldUnknownEncodingHandler;\r
+  elementDeclHandler = oldElementDeclHandler;\r
+  attlistDeclHandler = oldAttlistDeclHandler;\r
+  entityDeclHandler = oldEntityDeclHandler;\r
+  xmlDeclHandler = oldXmlDeclHandler;\r
+  declElementType = oldDeclElementType;\r
+  userData = oldUserData;\r
+  if (oldUserData == oldHandlerArg)\r
+    handlerArg = userData;\r
+  else\r
+    handlerArg = parser;\r
+  if (oldExternalEntityRefHandlerArg != oldParser)\r
+    externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;\r
+  defaultExpandInternalEntities = oldDefaultExpandInternalEntities;\r
+  ns_triplets = oldns_triplets;\r
+  hash_secret_salt = oldhash_secret_salt;\r
+  parentParser = oldParser;\r
+#ifdef XML_DTD\r
+  paramEntityParsing = oldParamEntityParsing;\r
+  prologState.inEntityValue = oldInEntityValue;\r
+  if (context) {\r
+#endif /* XML_DTD */\r
+    if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)\r
+      || !setContext(parser, context)) {\r
+      XML_ParserFree(parser);\r
+      return NULL;\r
+    }\r
+    processor = externalEntityInitProcessor;\r
+#ifdef XML_DTD\r
+  }\r
+  else {\r
+    /* The DTD instance referenced by _dtd is shared between the document's\r
+       root parser and external PE parsers, therefore one does not need to\r
+       call setContext. In addition, one also *must* not call setContext,\r
+       because this would overwrite existing prefix->binding pointers in\r
+       _dtd with ones that get destroyed with the external PE parser.\r
+       This would leave those prefixes with dangling pointers.\r
+    */\r
+    isParamEntity = XML_TRUE;\r
+    XmlPrologStateInitExternalEntity(&prologState);\r
+    processor = externalParEntInitProcessor;\r
+  }\r
+#endif /* XML_DTD */\r
+  return parser;\r
+}\r
+\r
+static void FASTCALL\r
+destroyBindings(BINDING *bindings, XML_Parser parser)\r
+{\r
+  for (;;) {\r
+    BINDING *b = bindings;\r
+    if (!b)\r
+      break;\r
+    bindings = b->nextTagBinding;\r
+    FREE(b->uri);\r
+    FREE(b);\r
+  }\r
+}\r
+\r
+void XMLCALL\r
+XML_ParserFree(XML_Parser parser)\r
+{\r
+  TAG *tagList;\r
+  OPEN_INTERNAL_ENTITY *entityList;\r
+  if (parser == NULL)\r
+    return;\r
+  /* free tagStack and freeTagList */\r
+  tagList = tagStack;\r
+  for (;;) {\r
+    TAG *p;\r
+    if (tagList == NULL) {\r
+      if (freeTagList == NULL)\r
+        break;\r
+      tagList = freeTagList;\r
+      freeTagList = NULL;\r
+    }\r
+    p = tagList;\r
+    tagList = tagList->parent;\r
+    FREE(p->buf);\r
+    destroyBindings(p->bindings, parser);\r
+    FREE(p);\r
+  }\r
+  /* free openInternalEntities and freeInternalEntities */\r
+  entityList = openInternalEntities;\r
+  for (;;) {\r
+    OPEN_INTERNAL_ENTITY *openEntity;\r
+    if (entityList == NULL) {\r
+      if (freeInternalEntities == NULL)\r
+        break;\r
+      entityList = freeInternalEntities;\r
+      freeInternalEntities = NULL;\r
+    }\r
+    openEntity = entityList;\r
+    entityList = entityList->next;\r
+    FREE(openEntity);\r
+  }\r
+\r
+  destroyBindings(freeBindingList, parser);\r
+  destroyBindings(inheritedBindings, parser);\r
+  poolDestroy(&tempPool);\r
+  poolDestroy(&temp2Pool);\r
+#ifdef XML_DTD\r
+  /* external parameter entity parsers share the DTD structure\r
+     parser->m_dtd with the root parser, so we must not destroy it\r
+  */\r
+  if (!isParamEntity && _dtd)\r
+#else\r
+  if (_dtd)\r
+#endif /* XML_DTD */\r
+    dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);\r
+  FREE((void *)atts);\r
+#ifdef XML_ATTR_INFO\r
+  FREE((void *)attInfo);\r
+#endif\r
+  FREE(groupConnector);\r
+  FREE(buffer);\r
+  FREE(dataBuf);\r
+  FREE(nsAtts);\r
+  FREE(unknownEncodingMem);\r
+  if (unknownEncodingRelease)\r
+    unknownEncodingRelease(unknownEncodingData);\r
+  FREE(parser);\r
+}\r
+\r
+void XMLCALL\r
+XML_UseParserAsHandlerArg(XML_Parser parser)\r
+{\r
+  handlerArg = parser;\r
+}\r
+\r
+enum XML_Error XMLCALL\r
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)\r
+{\r
+#ifdef XML_DTD\r
+  /* block after XML_Parse()/XML_ParseBuffer() has been called */\r
+  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)\r
+    return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;\r
+  useForeignDTD = useDTD;\r
+  return XML_ERROR_NONE;\r
+#else\r
+  return XML_ERROR_FEATURE_REQUIRES_XML_DTD;\r
+#endif\r
+}\r
+\r
+void XMLCALL\r
+XML_SetReturnNSTriplet(XML_Parser parser, int do_nst)\r
+{\r
+  /* block after XML_Parse()/XML_ParseBuffer() has been called */\r
+  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)\r
+    return;\r
+  ns_triplets = do_nst ? XML_TRUE : XML_FALSE;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetUserData(XML_Parser parser, void *p)\r
+{\r
+  if (handlerArg == userData)\r
+    handlerArg = userData = p;\r
+  else\r
+    userData = p;\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_SetBase(XML_Parser parser, const XML_Char *p)\r
+{\r
+  if (p) {\r
+    p = poolCopyString(&_dtd->pool, p);\r
+    if (!p)\r
+      return XML_STATUS_ERROR;\r
+    curBase = p;\r
+  }\r
+  else\r
+    curBase = NULL;\r
+  return XML_STATUS_OK;\r
+}\r
+\r
+const XML_Char * XMLCALL\r
+XML_GetBase(XML_Parser parser)\r
+{\r
+  return curBase;\r
+}\r
+\r
+int XMLCALL\r
+XML_GetSpecifiedAttributeCount(XML_Parser parser)\r
+{\r
+  return nSpecifiedAtts;\r
+}\r
+\r
+int XMLCALL\r
+XML_GetIdAttributeIndex(XML_Parser parser)\r
+{\r
+  return idAttIndex;\r
+}\r
+\r
+#ifdef XML_ATTR_INFO\r
+const XML_AttrInfo * XMLCALL\r
+XML_GetAttributeInfo(XML_Parser parser)\r
+{\r
+  return attInfo;\r
+}\r
+#endif\r
+\r
+void XMLCALL\r
+XML_SetElementHandler(XML_Parser parser,\r
+                      XML_StartElementHandler start,\r
+                      XML_EndElementHandler end)\r
+{\r
+  startElementHandler = start;\r
+  endElementHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetStartElementHandler(XML_Parser parser,\r
+                           XML_StartElementHandler start) {\r
+  startElementHandler = start;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetEndElementHandler(XML_Parser parser,\r
+                         XML_EndElementHandler end) {\r
+  endElementHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetCharacterDataHandler(XML_Parser parser,\r
+                            XML_CharacterDataHandler handler)\r
+{\r
+  characterDataHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetProcessingInstructionHandler(XML_Parser parser,\r
+                                    XML_ProcessingInstructionHandler handler)\r
+{\r
+  processingInstructionHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetCommentHandler(XML_Parser parser,\r
+                      XML_CommentHandler handler)\r
+{\r
+  commentHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetCdataSectionHandler(XML_Parser parser,\r
+                           XML_StartCdataSectionHandler start,\r
+                           XML_EndCdataSectionHandler end)\r
+{\r
+  startCdataSectionHandler = start;\r
+  endCdataSectionHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetStartCdataSectionHandler(XML_Parser parser,\r
+                                XML_StartCdataSectionHandler start) {\r
+  startCdataSectionHandler = start;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetEndCdataSectionHandler(XML_Parser parser,\r
+                              XML_EndCdataSectionHandler end) {\r
+  endCdataSectionHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetDefaultHandler(XML_Parser parser,\r
+                      XML_DefaultHandler handler)\r
+{\r
+  defaultHandler = handler;\r
+  defaultExpandInternalEntities = XML_FALSE;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetDefaultHandlerExpand(XML_Parser parser,\r
+                            XML_DefaultHandler handler)\r
+{\r
+  defaultHandler = handler;\r
+  defaultExpandInternalEntities = XML_TRUE;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetDoctypeDeclHandler(XML_Parser parser,\r
+                          XML_StartDoctypeDeclHandler start,\r
+                          XML_EndDoctypeDeclHandler end)\r
+{\r
+  startDoctypeDeclHandler = start;\r
+  endDoctypeDeclHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetStartDoctypeDeclHandler(XML_Parser parser,\r
+                               XML_StartDoctypeDeclHandler start) {\r
+  startDoctypeDeclHandler = start;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetEndDoctypeDeclHandler(XML_Parser parser,\r
+                             XML_EndDoctypeDeclHandler end) {\r
+  endDoctypeDeclHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetUnparsedEntityDeclHandler(XML_Parser parser,\r
+                                 XML_UnparsedEntityDeclHandler handler)\r
+{\r
+  unparsedEntityDeclHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetNotationDeclHandler(XML_Parser parser,\r
+                           XML_NotationDeclHandler handler)\r
+{\r
+  notationDeclHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetNamespaceDeclHandler(XML_Parser parser,\r
+                            XML_StartNamespaceDeclHandler start,\r
+                            XML_EndNamespaceDeclHandler end)\r
+{\r
+  startNamespaceDeclHandler = start;\r
+  endNamespaceDeclHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetStartNamespaceDeclHandler(XML_Parser parser,\r
+                                 XML_StartNamespaceDeclHandler start) {\r
+  startNamespaceDeclHandler = start;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetEndNamespaceDeclHandler(XML_Parser parser,\r
+                               XML_EndNamespaceDeclHandler end) {\r
+  endNamespaceDeclHandler = end;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetNotStandaloneHandler(XML_Parser parser,\r
+                            XML_NotStandaloneHandler handler)\r
+{\r
+  notStandaloneHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetExternalEntityRefHandler(XML_Parser parser,\r
+                                XML_ExternalEntityRefHandler handler)\r
+{\r
+  externalEntityRefHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)\r
+{\r
+  if (arg)\r
+    externalEntityRefHandlerArg = (XML_Parser)arg;\r
+  else\r
+    externalEntityRefHandlerArg = parser;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetSkippedEntityHandler(XML_Parser parser,\r
+                            XML_SkippedEntityHandler handler)\r
+{\r
+  skippedEntityHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetUnknownEncodingHandler(XML_Parser parser,\r
+                              XML_UnknownEncodingHandler handler,\r
+                              void *data)\r
+{\r
+  unknownEncodingHandler = handler;\r
+  unknownEncodingHandlerData = data;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetElementDeclHandler(XML_Parser parser,\r
+                          XML_ElementDeclHandler eldecl)\r
+{\r
+  elementDeclHandler = eldecl;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetAttlistDeclHandler(XML_Parser parser,\r
+                          XML_AttlistDeclHandler attdecl)\r
+{\r
+  attlistDeclHandler = attdecl;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetEntityDeclHandler(XML_Parser parser,\r
+                         XML_EntityDeclHandler handler)\r
+{\r
+  entityDeclHandler = handler;\r
+}\r
+\r
+void XMLCALL\r
+XML_SetXmlDeclHandler(XML_Parser parser,\r
+                      XML_XmlDeclHandler handler) {\r
+  xmlDeclHandler = handler;\r
+}\r
+\r
+int XMLCALL\r
+XML_SetParamEntityParsing(XML_Parser parser,\r
+                          enum XML_ParamEntityParsing peParsing)\r
+{\r
+  /* block after XML_Parse()/XML_ParseBuffer() has been called */\r
+  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)\r
+    return 0;\r
+#ifdef XML_DTD\r
+  paramEntityParsing = peParsing;\r
+  return 1;\r
+#else\r
+  return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;\r
+#endif\r
+}\r
+\r
+int XMLCALL\r
+XML_SetHashSalt(XML_Parser parser,\r
+                unsigned long hash_salt)\r
+{\r
+  /* block after XML_Parse()/XML_ParseBuffer() has been called */\r
+  if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)\r
+    return 0;\r
+  hash_secret_salt = hash_salt;\r
+  return 1;\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)\r
+{\r
+  switch (ps_parsing) {\r
+  case XML_SUSPENDED:\r
+    errorCode = XML_ERROR_SUSPENDED;\r
+    return XML_STATUS_ERROR;\r
+  case XML_FINISHED:\r
+    errorCode = XML_ERROR_FINISHED;\r
+    return XML_STATUS_ERROR;\r
+  case XML_INITIALIZED:\r
+    if (parentParser == NULL && !startParsing(parser)) {\r
+      errorCode = XML_ERROR_NO_MEMORY;\r
+      return XML_STATUS_ERROR;\r
+    }\r
+  default:\r
+    ps_parsing = XML_PARSING;\r
+  }\r
+\r
+  if (len == 0) {\r
+    ps_finalBuffer = (XML_Bool)isFinal;\r
+    if (!isFinal)\r
+      return XML_STATUS_OK;\r
+    positionPtr = bufferPtr;\r
+    parseEndPtr = bufferEnd;\r
+\r
+    /* If data are left over from last buffer, and we now know that these\r
+       data are the final chunk of input, then we have to check them again\r
+       to detect errors based on that fact.\r
+    */\r
+    errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);\r
+\r
+    if (errorCode == XML_ERROR_NONE) {\r
+      switch (ps_parsing) {\r
+      case XML_SUSPENDED:\r
+        XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);\r
+        positionPtr = bufferPtr;\r
+        return XML_STATUS_SUSPENDED;\r
+      case XML_INITIALIZED:\r
+      case XML_PARSING:\r
+        ps_parsing = XML_FINISHED;\r
+        /* fall through */\r
+      default:\r
+        return XML_STATUS_OK;\r
+      }\r
+    }\r
+    eventEndPtr = eventPtr;\r
+    processor = errorProcessor;\r
+    return XML_STATUS_ERROR;\r
+  }\r
+#ifndef XML_CONTEXT_BYTES\r
+  else if (bufferPtr == bufferEnd) {\r
+    const char *end;\r
+    int nLeftOver;\r
+    enum XML_Error result;\r
+    parseEndByteIndex += len;\r
+    positionPtr = s;\r
+    ps_finalBuffer = (XML_Bool)isFinal;\r
+\r
+    errorCode = processor(parser, s, parseEndPtr = s + len, &end);\r
+\r
+    if (errorCode != XML_ERROR_NONE) {\r
+      eventEndPtr = eventPtr;\r
+      processor = errorProcessor;\r
+      return XML_STATUS_ERROR;\r
+    }\r
+    else {\r
+      switch (ps_parsing) {\r
+      case XML_SUSPENDED:\r
+        result = XML_STATUS_SUSPENDED;\r
+        break;\r
+      case XML_INITIALIZED:\r
+      case XML_PARSING:\r
+        if (isFinal) {\r
+          ps_parsing = XML_FINISHED;\r
+          return XML_STATUS_OK;\r
+        }\r
+      /* fall through */\r
+      default:\r
+        result = XML_STATUS_OK;\r
+      }\r
+    }\r
+\r
+    XmlUpdatePosition(encoding, positionPtr, end, &position);\r
+    nLeftOver = s + len - end;\r
+    if (nLeftOver) {\r
+      if (buffer == NULL || nLeftOver > bufferLim - buffer) {\r
+        /* FIXME avoid integer overflow */\r
+        char *temp;\r
+        temp = (buffer == NULL\r
+                ? (char *)MALLOC(len * 2)\r
+                : (char *)REALLOC(buffer, len * 2));\r
+        if (temp == NULL) {\r
+          errorCode = XML_ERROR_NO_MEMORY;\r
+          eventPtr = eventEndPtr = NULL;\r
+          processor = errorProcessor;\r
+          return XML_STATUS_ERROR;\r
+        }\r
+        buffer = temp;\r
+        bufferLim = buffer + len * 2;\r
+      }\r
+      memcpy(buffer, end, nLeftOver);\r
+    }\r
+    bufferPtr = buffer;\r
+    bufferEnd = buffer + nLeftOver;\r
+    positionPtr = bufferPtr;\r
+    parseEndPtr = bufferEnd;\r
+    eventPtr = bufferPtr;\r
+    eventEndPtr = bufferPtr;\r
+    return result;\r
+  }\r
+#endif  /* not defined XML_CONTEXT_BYTES */\r
+  else {\r
+    void *buff = XML_GetBuffer(parser, len);\r
+    if (buff == NULL)\r
+      return XML_STATUS_ERROR;\r
+    else {\r
+      memcpy(buff, s, len);\r
+      return XML_ParseBuffer(parser, len, isFinal);\r
+    }\r
+  }\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_ParseBuffer(XML_Parser parser, int len, int isFinal)\r
+{\r
+  const char *start;\r
+  enum XML_Status result = XML_STATUS_OK;\r
+\r
+  switch (ps_parsing) {\r
+  case XML_SUSPENDED:\r
+    errorCode = XML_ERROR_SUSPENDED;\r
+    return XML_STATUS_ERROR;\r
+  case XML_FINISHED:\r
+    errorCode = XML_ERROR_FINISHED;\r
+    return XML_STATUS_ERROR;\r
+  case XML_INITIALIZED:\r
+    if (parentParser == NULL && !startParsing(parser)) {\r
+      errorCode = XML_ERROR_NO_MEMORY;\r
+      return XML_STATUS_ERROR;\r
+    }\r
+  default:\r
+    ps_parsing = XML_PARSING;\r
+  }\r
+\r
+  start = bufferPtr;\r
+  positionPtr = start;\r
+  bufferEnd += len;\r
+  parseEndPtr = bufferEnd;\r
+  parseEndByteIndex += len;\r
+  ps_finalBuffer = (XML_Bool)isFinal;\r
+\r
+  errorCode = processor(parser, start, parseEndPtr, &bufferPtr);\r
+\r
+  if (errorCode != XML_ERROR_NONE) {\r
+    eventEndPtr = eventPtr;\r
+    processor = errorProcessor;\r
+    return XML_STATUS_ERROR;\r
+  }\r
+  else {\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      result = XML_STATUS_SUSPENDED;\r
+      break;\r
+    case XML_INITIALIZED:\r
+    case XML_PARSING:\r
+      if (isFinal) {\r
+        ps_parsing = XML_FINISHED;\r
+        return result;\r
+      }\r
+    default: ;  /* should not happen */\r
+    }\r
+  }\r
+\r
+  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);\r
+  positionPtr = bufferPtr;\r
+  return result;\r
+}\r
+\r
+void * XMLCALL\r
+XML_GetBuffer(XML_Parser parser, int len)\r
+{\r
+  switch (ps_parsing) {\r
+  case XML_SUSPENDED:\r
+    errorCode = XML_ERROR_SUSPENDED;\r
+    return NULL;\r
+  case XML_FINISHED:\r
+    errorCode = XML_ERROR_FINISHED;\r
+    return NULL;\r
+  default: ;\r
+  }\r
+\r
+  if (len > bufferLim - bufferEnd) {\r
+    /* FIXME avoid integer overflow */\r
+    int neededSize = len + (int)(bufferEnd - bufferPtr);\r
+#ifdef XML_CONTEXT_BYTES\r
+    int keep = (int)(bufferPtr - buffer);\r
+\r
+    if (keep > XML_CONTEXT_BYTES)\r
+      keep = XML_CONTEXT_BYTES;\r
+    neededSize += keep;\r
+#endif  /* defined XML_CONTEXT_BYTES */\r
+    if (neededSize  <= bufferLim - buffer) {\r
+#ifdef XML_CONTEXT_BYTES\r
+      if (keep < bufferPtr - buffer) {\r
+        int offset = (int)(bufferPtr - buffer) - keep;\r
+        memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);\r
+        bufferEnd -= offset;\r
+        bufferPtr -= offset;\r
+      }\r
+#else\r
+      memmove(buffer, bufferPtr, bufferEnd - bufferPtr);\r
+      bufferEnd = buffer + (bufferEnd - bufferPtr);\r
+      bufferPtr = buffer;\r
+#endif  /* not defined XML_CONTEXT_BYTES */\r
+    }\r
+    else {\r
+      char *newBuf;\r
+      int bufferSize = (int)(bufferLim - bufferPtr);\r
+      if (bufferSize == 0)\r
+        bufferSize = INIT_BUFFER_SIZE;\r
+      do {\r
+        bufferSize *= 2;\r
+      } while (bufferSize < neededSize);\r
+      newBuf = (char *)MALLOC(bufferSize);\r
+      if (newBuf == 0) {\r
+        errorCode = XML_ERROR_NO_MEMORY;\r
+        return NULL;\r
+      }\r
+      bufferLim = newBuf + bufferSize;\r
+#ifdef XML_CONTEXT_BYTES\r
+      if (bufferPtr) {\r
+        int keep = (int)(bufferPtr - buffer);\r
+        if (keep > XML_CONTEXT_BYTES)\r
+          keep = XML_CONTEXT_BYTES;\r
+        memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);\r
+        FREE(buffer);\r
+        buffer = newBuf;\r
+        bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;\r
+        bufferPtr = buffer + keep;\r
+      }\r
+      else {\r
+        bufferEnd = newBuf + (bufferEnd - bufferPtr);\r
+        bufferPtr = buffer = newBuf;\r
+      }\r
+#else\r
+      if (bufferPtr) {\r
+        memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);\r
+        FREE(buffer);\r
+      }\r
+      bufferEnd = newBuf + (bufferEnd - bufferPtr);\r
+      bufferPtr = buffer = newBuf;\r
+#endif  /* not defined XML_CONTEXT_BYTES */\r
+    }\r
+    eventPtr = eventEndPtr = NULL;\r
+    positionPtr = NULL;\r
+  }\r
+  return bufferEnd;\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_StopParser(XML_Parser parser, XML_Bool resumable)\r
+{\r
+  switch (ps_parsing) {\r
+  case XML_SUSPENDED:\r
+    if (resumable) {\r
+      errorCode = XML_ERROR_SUSPENDED;\r
+      return XML_STATUS_ERROR;\r
+    }\r
+    ps_parsing = XML_FINISHED;\r
+    break;\r
+  case XML_FINISHED:\r
+    errorCode = XML_ERROR_FINISHED;\r
+    return XML_STATUS_ERROR;\r
+  default:\r
+    if (resumable) {\r
+#ifdef XML_DTD\r
+      if (isParamEntity) {\r
+        errorCode = XML_ERROR_SUSPEND_PE;\r
+        return XML_STATUS_ERROR;\r
+      }\r
+#endif\r
+      ps_parsing = XML_SUSPENDED;\r
+    }\r
+    else\r
+      ps_parsing = XML_FINISHED;\r
+  }\r
+  return XML_STATUS_OK;\r
+}\r
+\r
+enum XML_Status XMLCALL\r
+XML_ResumeParser(XML_Parser parser)\r
+{\r
+  enum XML_Status result = XML_STATUS_OK;\r
+\r
+  if (ps_parsing != XML_SUSPENDED) {\r
+    errorCode = XML_ERROR_NOT_SUSPENDED;\r
+    return XML_STATUS_ERROR;\r
+  }\r
+  ps_parsing = XML_PARSING;\r
+\r
+  errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);\r
+\r
+  if (errorCode != XML_ERROR_NONE) {\r
+    eventEndPtr = eventPtr;\r
+    processor = errorProcessor;\r
+    return XML_STATUS_ERROR;\r
+  }\r
+  else {\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      result = XML_STATUS_SUSPENDED;\r
+      break;\r
+    case XML_INITIALIZED:\r
+    case XML_PARSING:\r
+      if (ps_finalBuffer) {\r
+        ps_parsing = XML_FINISHED;\r
+        return result;\r
+      }\r
+    default: ;\r
+    }\r
+  }\r
+\r
+  XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);\r
+  positionPtr = bufferPtr;\r
+  return result;\r
+}\r
+\r
+void XMLCALL\r
+XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status)\r
+{\r
+  assert(status != NULL);\r
+  *status = parser->m_parsingStatus;\r
+}\r
+\r
+enum XML_Error XMLCALL\r
+XML_GetErrorCode(XML_Parser parser)\r
+{\r
+  return errorCode;\r
+}\r
+\r
+XML_Index XMLCALL\r
+XML_GetCurrentByteIndex(XML_Parser parser)\r
+{\r
+  if (eventPtr)\r
+    return parseEndByteIndex - (parseEndPtr - eventPtr);\r
+  return -1;\r
+}\r
+\r
+int XMLCALL\r
+XML_GetCurrentByteCount(XML_Parser parser)\r
+{\r
+  if (eventEndPtr && eventPtr)\r
+    return (int)(eventEndPtr - eventPtr);\r
+  return 0;\r
+}\r
+\r
+const char * XMLCALL\r
+XML_GetInputContext(XML_Parser parser, int *offset, int *size)\r
+{\r
+#ifdef XML_CONTEXT_BYTES\r
+  if (eventPtr && buffer) {\r
+    *offset = (int)(eventPtr - buffer);\r
+    *size   = (int)(bufferEnd - buffer);\r
+    return buffer;\r
+  }\r
+#endif /* defined XML_CONTEXT_BYTES */\r
+  return (char *) 0;\r
+}\r
+\r
+XML_Size XMLCALL\r
+XML_GetCurrentLineNumber(XML_Parser parser)\r
+{\r
+  if (eventPtr && eventPtr >= positionPtr) {\r
+    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);\r
+    positionPtr = eventPtr;\r
+  }\r
+  return position.lineNumber + 1;\r
+}\r
+\r
+XML_Size XMLCALL\r
+XML_GetCurrentColumnNumber(XML_Parser parser)\r
+{\r
+  if (eventPtr && eventPtr >= positionPtr) {\r
+    XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);\r
+    positionPtr = eventPtr;\r
+  }\r
+  return position.columnNumber;\r
+}\r
+\r
+void XMLCALL\r
+XML_FreeContentModel(XML_Parser parser, XML_Content *model)\r
+{\r
+  FREE(model);\r
+}\r
+\r
+void * XMLCALL\r
+XML_MemMalloc(XML_Parser parser, size_t size)\r
+{\r
+  return MALLOC(size);\r
+}\r
+\r
+void * XMLCALL\r
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size)\r
+{\r
+  return REALLOC(ptr, size);\r
+}\r
+\r
+void XMLCALL\r
+XML_MemFree(XML_Parser parser, void *ptr)\r
+{\r
+  FREE(ptr);\r
+}\r
+\r
+void XMLCALL\r
+XML_DefaultCurrent(XML_Parser parser)\r
+{\r
+  if (defaultHandler) {\r
+    if (openInternalEntities)\r
+      reportDefault(parser,\r
+                    internalEncoding,\r
+                    openInternalEntities->internalEventPtr,\r
+                    openInternalEntities->internalEventEndPtr);\r
+    else\r
+      reportDefault(parser, encoding, eventPtr, eventEndPtr);\r
+  }\r
+}\r
+\r
+const XML_LChar * XMLCALL\r
+XML_ErrorString(enum XML_Error code)\r
+{\r
+  static const XML_LChar* const message[] = {\r
+    0,\r
+    XML_L("out of memory"),\r
+    XML_L("syntax error"),\r
+    XML_L("no element found"),\r
+    XML_L("not well-formed (invalid token)"),\r
+    XML_L("unclosed token"),\r
+    XML_L("partial character"),\r
+    XML_L("mismatched tag"),\r
+    XML_L("duplicate attribute"),\r
+    XML_L("junk after document element"),\r
+    XML_L("illegal parameter entity reference"),\r
+    XML_L("undefined entity"),\r
+    XML_L("recursive entity reference"),\r
+    XML_L("asynchronous entity"),\r
+    XML_L("reference to invalid character number"),\r
+    XML_L("reference to binary entity"),\r
+    XML_L("reference to external entity in attribute"),\r
+    XML_L("XML or text declaration not at start of entity"),\r
+    XML_L("unknown encoding"),\r
+    XML_L("encoding specified in XML declaration is incorrect"),\r
+    XML_L("unclosed CDATA section"),\r
+    XML_L("error in processing external entity reference"),\r
+    XML_L("document is not standalone"),\r
+    XML_L("unexpected parser state - please send a bug report"),\r
+    XML_L("entity declared in parameter entity"),\r
+    XML_L("requested feature requires XML_DTD support in Expat"),\r
+    XML_L("cannot change setting once parsing has begun"),\r
+    XML_L("unbound prefix"),\r
+    XML_L("must not undeclare prefix"),\r
+    XML_L("incomplete markup in parameter entity"),\r
+    XML_L("XML declaration not well-formed"),\r
+    XML_L("text declaration not well-formed"),\r
+    XML_L("illegal character(s) in public id"),\r
+    XML_L("parser suspended"),\r
+    XML_L("parser not suspended"),\r
+    XML_L("parsing aborted"),\r
+    XML_L("parsing finished"),\r
+    XML_L("cannot suspend in external parameter entity"),\r
+    XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),\r
+    XML_L("reserved prefix (xmlns) must not be declared or undeclared"),\r
+    XML_L("prefix must not be bound to one of the reserved namespace names")\r
+  };\r
+  if (code > 0 && code < sizeof(message)/sizeof(message[0]))\r
+    return message[code];\r
+  return NULL;\r
+}\r
+\r
+const XML_LChar * XMLCALL\r
+XML_ExpatVersion(void) {\r
+\r
+  /* V1 is used to string-ize the version number. However, it would\r
+     string-ize the actual version macro *names* unless we get them\r
+     substituted before being passed to V1. CPP is defined to expand\r
+     a macro, then rescan for more expansions. Thus, we use V2 to expand\r
+     the version macros, then CPP will expand the resulting V1() macro\r
+     with the correct numerals. */\r
+  /* ### I'm assuming cpp is portable in this respect... */\r
+\r
+#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)\r
+#define V2(a,b,c) XML_L("expat_")V1(a,b,c)\r
+\r
+  return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);\r
+\r
+#undef V1\r
+#undef V2\r
+}\r
+\r
+XML_Expat_Version XMLCALL\r
+XML_ExpatVersionInfo(void)\r
+{\r
+  XML_Expat_Version version;\r
+\r
+  version.major = XML_MAJOR_VERSION;\r
+  version.minor = XML_MINOR_VERSION;\r
+  version.micro = XML_MICRO_VERSION;\r
+\r
+  return version;\r
+}\r
+\r
+const XML_Feature * XMLCALL\r
+XML_GetFeatureList(void)\r
+{\r
+  static const XML_Feature features[] = {\r
+    {XML_FEATURE_SIZEOF_XML_CHAR,  XML_L("sizeof(XML_Char)"),\r
+     sizeof(XML_Char)},\r
+    {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),\r
+     sizeof(XML_LChar)},\r
+#ifdef XML_UNICODE\r
+    {XML_FEATURE_UNICODE,          XML_L("XML_UNICODE"), 0},\r
+#endif\r
+#ifdef XML_UNICODE_WCHAR_T\r
+    {XML_FEATURE_UNICODE_WCHAR_T,  XML_L("XML_UNICODE_WCHAR_T"), 0},\r
+#endif\r
+#ifdef XML_DTD\r
+    {XML_FEATURE_DTD,              XML_L("XML_DTD"), 0},\r
+#endif\r
+#ifdef XML_CONTEXT_BYTES\r
+    {XML_FEATURE_CONTEXT_BYTES,    XML_L("XML_CONTEXT_BYTES"),\r
+     XML_CONTEXT_BYTES},\r
+#endif\r
+#ifdef XML_MIN_SIZE\r
+    {XML_FEATURE_MIN_SIZE,         XML_L("XML_MIN_SIZE"), 0},\r
+#endif\r
+#ifdef XML_NS\r
+    {XML_FEATURE_NS,               XML_L("XML_NS"), 0},\r
+#endif\r
+#ifdef XML_LARGE_SIZE\r
+    {XML_FEATURE_LARGE_SIZE,       XML_L("XML_LARGE_SIZE"), 0},\r
+#endif\r
+#ifdef XML_ATTR_INFO\r
+    {XML_FEATURE_ATTR_INFO,        XML_L("XML_ATTR_INFO"), 0},\r
+#endif\r
+    {XML_FEATURE_END,              NULL, 0}\r
+  };\r
+\r
+  return features;\r
+}\r
+\r
+/* Initially tag->rawName always points into the parse buffer;\r
+   for those TAG instances opened while the current parse buffer was\r
+   processed, and not yet closed, we need to store tag->rawName in a more\r
+   permanent location, since the parse buffer is about to be discarded.\r
+*/\r
+static XML_Bool\r
+storeRawNames(XML_Parser parser)\r
+{\r
+  TAG *tag = tagStack;\r
+  while (tag) {\r
+    int bufSize;\r
+    int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);\r
+    char *rawNameBuf = tag->buf + nameLen;\r
+    /* Stop if already stored.  Since tagStack is a stack, we can stop\r
+       at the first entry that has already been copied; everything\r
+       below it in the stack is already been accounted for in a\r
+       previous call to this function.\r
+    */\r
+    if (tag->rawName == rawNameBuf)\r
+      break;\r
+    /* For re-use purposes we need to ensure that the\r
+       size of tag->buf is a multiple of sizeof(XML_Char).\r
+    */\r
+    bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));\r
+    if (bufSize > tag->bufEnd - tag->buf) {\r
+      char *temp = (char *)REALLOC(tag->buf, bufSize);\r
+      if (temp == NULL)\r
+        return XML_FALSE;\r
+      /* if tag->name.str points to tag->buf (only when namespace\r
+         processing is off) then we have to update it\r
+      */\r
+      if (tag->name.str == (XML_Char *)tag->buf)\r
+        tag->name.str = (XML_Char *)temp;\r
+      /* if tag->name.localPart is set (when namespace processing is on)\r
+         then update it as well, since it will always point into tag->buf\r
+      */\r
+      if (tag->name.localPart)\r
+        tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -\r
+                                                  (XML_Char *)tag->buf);\r
+      tag->buf = temp;\r
+      tag->bufEnd = temp + bufSize;\r
+      rawNameBuf = temp + nameLen;\r
+    }\r
+    memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);\r
+    tag->rawName = rawNameBuf;\r
+    tag = tag->parent;\r
+  }\r
+  return XML_TRUE;\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+contentProcessor(XML_Parser parser,\r
+                 const char *start,\r
+                 const char *end,\r
+                 const char **endPtr)\r
+{\r
+  enum XML_Error result = doContent(parser, 0, encoding, start, end,\r
+                                    endPtr, (XML_Bool)!ps_finalBuffer);\r
+  if (result == XML_ERROR_NONE) {\r
+    if (!storeRawNames(parser))\r
+      return XML_ERROR_NO_MEMORY;\r
+  }\r
+  return result;\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+externalEntityInitProcessor(XML_Parser parser,\r
+                            const char *start,\r
+                            const char *end,\r
+                            const char **endPtr)\r
+{\r
+  enum XML_Error result = initializeEncoding(parser);\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+  processor = externalEntityInitProcessor2;\r
+  return externalEntityInitProcessor2(parser, start, end, endPtr);\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+externalEntityInitProcessor2(XML_Parser parser,\r
+                             const char *start,\r
+                             const char *end,\r
+                             const char **endPtr)\r
+{\r
+  const char *next = start; /* XmlContentTok doesn't always set the last arg */\r
+  int tok = XmlContentTok(encoding, start, end, &next);\r
+  switch (tok) {\r
+  case XML_TOK_BOM:\r
+    /* If we are at the end of the buffer, this would cause the next stage,\r
+       i.e. externalEntityInitProcessor3, to pass control directly to\r
+       doContent (by detecting XML_TOK_NONE) without processing any xml text\r
+       declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.\r
+    */\r
+    if (next == end && !ps_finalBuffer) {\r
+      *endPtr = next;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    start = next;\r
+    break;\r
+  case XML_TOK_PARTIAL:\r
+    if (!ps_finalBuffer) {\r
+      *endPtr = start;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    eventPtr = start;\r
+    return XML_ERROR_UNCLOSED_TOKEN;\r
+  case XML_TOK_PARTIAL_CHAR:\r
+    if (!ps_finalBuffer) {\r
+      *endPtr = start;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    eventPtr = start;\r
+    return XML_ERROR_PARTIAL_CHAR;\r
+  }\r
+  processor = externalEntityInitProcessor3;\r
+  return externalEntityInitProcessor3(parser, start, end, endPtr);\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+externalEntityInitProcessor3(XML_Parser parser,\r
+                             const char *start,\r
+                             const char *end,\r
+                             const char **endPtr)\r
+{\r
+  int tok;\r
+  const char *next = start; /* XmlContentTok doesn't always set the last arg */\r
+  eventPtr = start;\r
+  tok = XmlContentTok(encoding, start, end, &next);\r
+  eventEndPtr = next;\r
+\r
+  switch (tok) {\r
+  case XML_TOK_XML_DECL:\r
+    {\r
+      enum XML_Error result;\r
+      result = processXmlDecl(parser, 1, start, next);\r
+      if (result != XML_ERROR_NONE)\r
+        return result;\r
+      switch (ps_parsing) {\r
+      case XML_SUSPENDED:\r
+        *endPtr = next;\r
+        return XML_ERROR_NONE;\r
+      case XML_FINISHED:\r
+        return XML_ERROR_ABORTED;\r
+      default:\r
+        start = next;\r
+      }\r
+    }\r
+    break;\r
+  case XML_TOK_PARTIAL:\r
+    if (!ps_finalBuffer) {\r
+      *endPtr = start;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    return XML_ERROR_UNCLOSED_TOKEN;\r
+  case XML_TOK_PARTIAL_CHAR:\r
+    if (!ps_finalBuffer) {\r
+      *endPtr = start;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    return XML_ERROR_PARTIAL_CHAR;\r
+  }\r
+  processor = externalEntityContentProcessor;\r
+  tagLevel = 1;\r
+  return externalEntityContentProcessor(parser, start, end, endPtr);\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+externalEntityContentProcessor(XML_Parser parser,\r
+                               const char *start,\r
+                               const char *end,\r
+                               const char **endPtr)\r
+{\r
+  enum XML_Error result = doContent(parser, 1, encoding, start, end,\r
+                                    endPtr, (XML_Bool)!ps_finalBuffer);\r
+  if (result == XML_ERROR_NONE) {\r
+    if (!storeRawNames(parser))\r
+      return XML_ERROR_NO_MEMORY;\r
+  }\r
+  return result;\r
+}\r
+\r
+static enum XML_Error\r
+doContent(XML_Parser parser,\r
+          int startTagLevel,\r
+          const ENCODING *enc,\r
+          const char *s,\r
+          const char *end,\r
+          const char **nextPtr,\r
+          XML_Bool haveMore)\r
+{\r
+  /* save one level of indirection */\r
+  DTD * const dtd = _dtd;\r
+\r
+  const char **eventPP;\r
+  const char **eventEndPP;\r
+  if (enc == encoding) {\r
+    eventPP = &eventPtr;\r
+    eventEndPP = &eventEndPtr;\r
+  }\r
+  else {\r
+    eventPP = &(openInternalEntities->internalEventPtr);\r
+    eventEndPP = &(openInternalEntities->internalEventEndPtr);\r
+  }\r
+  *eventPP = s;\r
+\r
+  for (;;) {\r
+    const char *next = s; /* XmlContentTok doesn't always set the last arg */\r
+    int tok = XmlContentTok(enc, s, end, &next);\r
+    *eventEndPP = next;\r
+    switch (tok) {\r
+    case XML_TOK_TRAILING_CR:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      *eventEndPP = end;\r
+      if (characterDataHandler) {\r
+        XML_Char c = 0xA;\r
+        characterDataHandler(handlerArg, &c, 1);\r
+      }\r
+      else if (defaultHandler)\r
+        reportDefault(parser, enc, s, end);\r
+      /* We are at the end of the final buffer, should we check for\r
+         XML_SUSPENDED, XML_FINISHED?\r
+      */\r
+      if (startTagLevel == 0)\r
+        return XML_ERROR_NO_ELEMENTS;\r
+      if (tagLevel != startTagLevel)\r
+        return XML_ERROR_ASYNC_ENTITY;\r
+      *nextPtr = end;\r
+      return XML_ERROR_NONE;\r
+    case XML_TOK_NONE:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      if (startTagLevel > 0) {\r
+        if (tagLevel != startTagLevel)\r
+          return XML_ERROR_ASYNC_ENTITY;\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_NO_ELEMENTS;\r
+    case XML_TOK_INVALID:\r
+      *eventPP = next;\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_PARTIAL:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_UNCLOSED_TOKEN;\r
+    case XML_TOK_PARTIAL_CHAR:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_PARTIAL_CHAR;\r
+    case XML_TOK_ENTITY_REF:\r
+      {\r
+        const XML_Char *name;\r
+        ENTITY *entity;\r
+        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,\r
+                                              s + enc->minBytesPerChar,\r
+                                              next - enc->minBytesPerChar);\r
+        if (ch) {\r
+          if (characterDataHandler)\r
+            characterDataHandler(handlerArg, &ch, 1);\r
+          else if (defaultHandler)\r
+            reportDefault(parser, enc, s, next);\r
+          break;\r
+        }\r
+        name = poolStoreString(&dtd->pool, enc,\r
+                                s + enc->minBytesPerChar,\r
+                                next - enc->minBytesPerChar);\r
+        if (!name)\r
+          return XML_ERROR_NO_MEMORY;\r
+        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);\r
+        poolDiscard(&dtd->pool);\r
+        /* First, determine if a check for an existing declaration is needed;\r
+           if yes, check that the entity exists, and that it is internal,\r
+           otherwise call the skipped entity or default handler.\r
+        */\r
+        if (!dtd->hasParamEntityRefs || dtd->standalone) {\r
+          if (!entity)\r
+            return XML_ERROR_UNDEFINED_ENTITY;\r
+          else if (!entity->is_internal)\r
+            return XML_ERROR_ENTITY_DECLARED_IN_PE;\r
+        }\r
+        else if (!entity) {\r
+          if (skippedEntityHandler)\r
+            skippedEntityHandler(handlerArg, name, 0);\r
+          else if (defaultHandler)\r
+            reportDefault(parser, enc, s, next);\r
+          break;\r
+        }\r
+        if (entity->open)\r
+          return XML_ERROR_RECURSIVE_ENTITY_REF;\r
+        if (entity->notation)\r
+          return XML_ERROR_BINARY_ENTITY_REF;\r
+        if (entity->textPtr) {\r
+          enum XML_Error result;\r
+          if (!defaultExpandInternalEntities) {\r
+            if (skippedEntityHandler)\r
+              skippedEntityHandler(handlerArg, entity->name, 0);\r
+            else if (defaultHandler)\r
+              reportDefault(parser, enc, s, next);\r
+            break;\r
+          }\r
+          result = processInternalEntity(parser, entity, XML_FALSE);\r
+          if (result != XML_ERROR_NONE)\r
+            return result;\r
+        }\r
+        else if (externalEntityRefHandler) {\r
+          const XML_Char *context;\r
+          entity->open = XML_TRUE;\r
+          context = getContext(parser);\r
+          entity->open = XML_FALSE;\r
+          if (!context)\r
+            return XML_ERROR_NO_MEMORY;\r
+          if (!externalEntityRefHandler(externalEntityRefHandlerArg,\r
+                                        context,\r
+                                        entity->base,\r
+                                        entity->systemId,\r
+                                        entity->publicId))\r
+            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;\r
+          poolDiscard(&tempPool);\r
+        }\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        break;\r
+      }\r
+    case XML_TOK_START_TAG_NO_ATTS:\r
+      /* fall through */\r
+    case XML_TOK_START_TAG_WITH_ATTS:\r
+      {\r
+        TAG *tag;\r
+        enum XML_Error result;\r
+        XML_Char *toPtr;\r
+        if (freeTagList) {\r
+          tag = freeTagList;\r
+          freeTagList = freeTagList->parent;\r
+        }\r
+        else {\r
+          tag = (TAG *)MALLOC(sizeof(TAG));\r
+          if (!tag)\r
+            return XML_ERROR_NO_MEMORY;\r
+          tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);\r
+          if (!tag->buf) {\r
+            FREE(tag);\r
+            return XML_ERROR_NO_MEMORY;\r
+          }\r
+          tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;\r
+        }\r
+        tag->bindings = NULL;\r
+        tag->parent = tagStack;\r
+        tagStack = tag;\r
+        tag->name.localPart = NULL;\r
+        tag->name.prefix = NULL;\r
+        tag->rawName = s + enc->minBytesPerChar;\r
+        tag->rawNameLength = XmlNameLength(enc, tag->rawName);\r
+        ++tagLevel;\r
+        {\r
+          const char *rawNameEnd = tag->rawName + tag->rawNameLength;\r
+          const char *fromPtr = tag->rawName;\r
+          toPtr = (XML_Char *)tag->buf;\r
+          for (;;) {\r
+            int bufSize;\r
+            int convLen;\r
+            XmlConvert(enc,\r
+                       &fromPtr, rawNameEnd,\r
+                       (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);\r
+            convLen = (int)(toPtr - (XML_Char *)tag->buf);\r
+            if (fromPtr == rawNameEnd) {\r
+              tag->name.strLen = convLen;\r
+              break;\r
+            }\r
+            bufSize = (int)(tag->bufEnd - tag->buf) << 1;\r
+            {\r
+              char *temp = (char *)REALLOC(tag->buf, bufSize);\r
+              if (temp == NULL)\r
+                return XML_ERROR_NO_MEMORY;\r
+              tag->buf = temp;\r
+              tag->bufEnd = temp + bufSize;\r
+              toPtr = (XML_Char *)temp + convLen;\r
+            }\r
+          }\r
+        }\r
+        tag->name.str = (XML_Char *)tag->buf;\r
+        *toPtr = XML_T('\0');\r
+        result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));\r
+        if (result)\r
+          return result;\r
+        if (startElementHandler)\r
+          startElementHandler(handlerArg, tag->name.str,\r
+                              (const XML_Char **)atts);\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        poolClear(&tempPool);\r
+        break;\r
+      }\r
+    case XML_TOK_EMPTY_ELEMENT_NO_ATTS:\r
+      /* fall through */\r
+    case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:\r
+      {\r
+        const char *rawName = s + enc->minBytesPerChar;\r
+        enum XML_Error result;\r
+        BINDING *bindings = NULL;\r
+        XML_Bool noElmHandlers = XML_TRUE;\r
+        TAG_NAME name;\r
+        name.str = poolStoreString(&tempPool, enc, rawName,\r
+                                   rawName + XmlNameLength(enc, rawName));\r
+        if (!name.str)\r
+          return XML_ERROR_NO_MEMORY;\r
+        poolFinish(&tempPool);\r
+        result = storeAtts(parser, enc, s, &name, &bindings);\r
+        if (result)\r
+          return result;\r
+        poolFinish(&tempPool);\r
+        if (startElementHandler) {\r
+          startElementHandler(handlerArg, name.str, (const XML_Char **)atts);\r
+          noElmHandlers = XML_FALSE;\r
+        }\r
+        if (endElementHandler) {\r
+          if (startElementHandler)\r
+            *eventPP = *eventEndPP;\r
+          endElementHandler(handlerArg, name.str);\r
+          noElmHandlers = XML_FALSE;\r
+        }\r
+        if (noElmHandlers && defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        poolClear(&tempPool);\r
+        while (bindings) {\r
+          BINDING *b = bindings;\r
+          if (endNamespaceDeclHandler)\r
+            endNamespaceDeclHandler(handlerArg, b->prefix->name);\r
+          bindings = bindings->nextTagBinding;\r
+          b->nextTagBinding = freeBindingList;\r
+          freeBindingList = b;\r
+          b->prefix->binding = b->prevPrefixBinding;\r
+        }\r
+      }\r
+      if (tagLevel == 0)\r
+        return epilogProcessor(parser, next, end, nextPtr);\r
+      break;\r
+    case XML_TOK_END_TAG:\r
+      if (tagLevel == startTagLevel)\r
+        return XML_ERROR_ASYNC_ENTITY;\r
+      else {\r
+        int len;\r
+        const char *rawName;\r
+        TAG *tag = tagStack;\r
+        tagStack = tag->parent;\r
+        tag->parent = freeTagList;\r
+        freeTagList = tag;\r
+        rawName = s + enc->minBytesPerChar*2;\r
+        len = XmlNameLength(enc, rawName);\r
+        if (len != tag->rawNameLength\r
+            || memcmp(tag->rawName, rawName, len) != 0) {\r
+          *eventPP = rawName;\r
+          return XML_ERROR_TAG_MISMATCH;\r
+        }\r
+        --tagLevel;\r
+        if (endElementHandler) {\r
+          const XML_Char *localPart;\r
+          const XML_Char *prefix;\r
+          XML_Char *uri;\r
+          localPart = tag->name.localPart;\r
+          if (ns && localPart) {\r
+            /* localPart and prefix may have been overwritten in\r
+               tag->name.str, since this points to the binding->uri\r
+               buffer which gets re-used; so we have to add them again\r
+            */\r
+            uri = (XML_Char *)tag->name.str + tag->name.uriLen;\r
+            /* don't need to check for space - already done in storeAtts() */\r
+            while (*localPart) *uri++ = *localPart++;\r
+            prefix = (XML_Char *)tag->name.prefix;\r
+            if (ns_triplets && prefix) {\r
+              *uri++ = namespaceSeparator;\r
+              while (*prefix) *uri++ = *prefix++;\r
+             }\r
+            *uri = XML_T('\0');\r
+          }\r
+          endElementHandler(handlerArg, tag->name.str);\r
+        }\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        while (tag->bindings) {\r
+          BINDING *b = tag->bindings;\r
+          if (endNamespaceDeclHandler)\r
+            endNamespaceDeclHandler(handlerArg, b->prefix->name);\r
+          tag->bindings = tag->bindings->nextTagBinding;\r
+          b->nextTagBinding = freeBindingList;\r
+          freeBindingList = b;\r
+          b->prefix->binding = b->prevPrefixBinding;\r
+        }\r
+        if (tagLevel == 0)\r
+          return epilogProcessor(parser, next, end, nextPtr);\r
+      }\r
+      break;\r
+    case XML_TOK_CHAR_REF:\r
+      {\r
+        int n = XmlCharRefNumber(enc, s);\r
+        if (n < 0)\r
+          return XML_ERROR_BAD_CHAR_REF;\r
+        if (characterDataHandler) {\r
+          XML_Char buf[XML_ENCODE_MAX];\r
+          characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));\r
+        }\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+      }\r
+      break;\r
+    case XML_TOK_XML_DECL:\r
+      return XML_ERROR_MISPLACED_XML_PI;\r
+    case XML_TOK_DATA_NEWLINE:\r
+      if (characterDataHandler) {\r
+        XML_Char c = 0xA;\r
+        characterDataHandler(handlerArg, &c, 1);\r
+      }\r
+      else if (defaultHandler)\r
+        reportDefault(parser, enc, s, next);\r
+      break;\r
+    case XML_TOK_CDATA_SECT_OPEN:\r
+      {\r
+        enum XML_Error result;\r
+        if (startCdataSectionHandler)\r
+          startCdataSectionHandler(handlerArg);\r
+#if 0\r
+        /* Suppose you doing a transformation on a document that involves\r
+           changing only the character data.  You set up a defaultHandler\r
+           and a characterDataHandler.  The defaultHandler simply copies\r
+           characters through.  The characterDataHandler does the\r
+           transformation and writes the characters out escaping them as\r
+           necessary.  This case will fail to work if we leave out the\r
+           following two lines (because & and < inside CDATA sections will\r
+           be incorrectly escaped).\r
+\r
+           However, now we have a start/endCdataSectionHandler, so it seems\r
+           easier to let the user deal with this.\r
+        */\r
+        else if (characterDataHandler)\r
+          characterDataHandler(handlerArg, dataBuf, 0);\r
+#endif\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);\r
+        if (result != XML_ERROR_NONE)\r
+          return result;\r
+        else if (!next) {\r
+          processor = cdataSectionProcessor;\r
+          return result;\r
+        }\r
+      }\r
+      break;\r
+    case XML_TOK_TRAILING_RSQB:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      if (characterDataHandler) {\r
+        if (MUST_CONVERT(enc, s)) {\r
+          ICHAR *dataPtr = (ICHAR *)dataBuf;\r
+          XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);\r
+          characterDataHandler(handlerArg, dataBuf,\r
+                               (int)(dataPtr - (ICHAR *)dataBuf));\r
+        }\r
+        else\r
+          characterDataHandler(handlerArg,\r
+                               (XML_Char *)s,\r
+                               (int)((XML_Char *)end - (XML_Char *)s));\r
+      }\r
+      else if (defaultHandler)\r
+        reportDefault(parser, enc, s, end);\r
+      /* We are at the end of the final buffer, should we check for\r
+         XML_SUSPENDED, XML_FINISHED?\r
+      */\r
+      if (startTagLevel == 0) {\r
+        *eventPP = end;\r
+        return XML_ERROR_NO_ELEMENTS;\r
+      }\r
+      if (tagLevel != startTagLevel) {\r
+        *eventPP = end;\r
+        return XML_ERROR_ASYNC_ENTITY;\r
+      }\r
+      *nextPtr = end;\r
+      return XML_ERROR_NONE;\r
+    case XML_TOK_DATA_CHARS:\r
+      {\r
+        XML_CharacterDataHandler charDataHandler = characterDataHandler;\r
+        if (charDataHandler) {\r
+          if (MUST_CONVERT(enc, s)) {\r
+            for (;;) {\r
+              ICHAR *dataPtr = (ICHAR *)dataBuf;\r
+              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);\r
+              *eventEndPP = s;\r
+              charDataHandler(handlerArg, dataBuf,\r
+                              (int)(dataPtr - (ICHAR *)dataBuf));\r
+              if (s == next)\r
+                break;\r
+              *eventPP = s;\r
+            }\r
+          }\r
+          else\r
+            charDataHandler(handlerArg,\r
+                            (XML_Char *)s,\r
+                            (int)((XML_Char *)next - (XML_Char *)s));\r
+        }\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+      }\r
+      break;\r
+    case XML_TOK_PI:\r
+      if (!reportProcessingInstruction(parser, enc, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    case XML_TOK_COMMENT:\r
+      if (!reportComment(parser, enc, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    default:\r
+      if (defaultHandler)\r
+        reportDefault(parser, enc, s, next);\r
+      break;\r
+    }\r
+    *eventPP = s = next;\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    case XML_FINISHED:\r
+      return XML_ERROR_ABORTED;\r
+    default: ;\r
+    }\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+/* Precondition: all arguments must be non-NULL;\r
+   Purpose:\r
+   - normalize attributes\r
+   - check attributes for well-formedness\r
+   - generate namespace aware attribute names (URI, prefix)\r
+   - build list of attributes for startElementHandler\r
+   - default attributes\r
+   - process namespace declarations (check and report them)\r
+   - generate namespace aware element name (URI, prefix)\r
+*/\r
+static enum XML_Error\r
+storeAtts(XML_Parser parser, const ENCODING *enc,\r
+          const char *attStr, TAG_NAME *tagNamePtr,\r
+          BINDING **bindingsPtr)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  ELEMENT_TYPE *elementType;\r
+  int nDefaultAtts;\r
+  const XML_Char **appAtts;   /* the attribute list for the application */\r
+  int attIndex = 0;\r
+  int prefixLen;\r
+  int i;\r
+  int n;\r
+  XML_Char *uri;\r
+  int nPrefixes = 0;\r
+  BINDING *binding;\r
+  const XML_Char *localPart;\r
+\r
+  /* lookup the element type name */\r
+  elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);\r
+  if (!elementType) {\r
+    const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);\r
+    if (!name)\r
+      return XML_ERROR_NO_MEMORY;\r
+    elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,\r
+                                         sizeof(ELEMENT_TYPE));\r
+    if (!elementType)\r
+      return XML_ERROR_NO_MEMORY;\r
+    if (ns && !setElementTypePrefix(parser, elementType))\r
+      return XML_ERROR_NO_MEMORY;\r
+  }\r
+  nDefaultAtts = elementType->nDefaultAtts;\r
+\r
+  /* get the attributes from the tokenizer */\r
+  n = XmlGetAttributes(enc, attStr, attsSize, atts);\r
+  if (n + nDefaultAtts > attsSize) {\r
+    int oldAttsSize = attsSize;\r
+    ATTRIBUTE *temp;\r
+#ifdef XML_ATTR_INFO\r
+    XML_AttrInfo *temp2;\r
+#endif\r
+    attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;\r
+    temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));\r
+    if (temp == NULL)\r
+      return XML_ERROR_NO_MEMORY;\r
+    atts = temp;\r
+#ifdef XML_ATTR_INFO\r
+    temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));\r
+    if (temp2 == NULL)\r
+      return XML_ERROR_NO_MEMORY;\r
+    attInfo = temp2;\r
+#endif\r
+    if (n > oldAttsSize)\r
+      XmlGetAttributes(enc, attStr, n, atts);\r
+  }\r
+\r
+  appAtts = (const XML_Char **)atts;\r
+  for (i = 0; i < n; i++) {\r
+    ATTRIBUTE *currAtt = &atts[i];\r
+#ifdef XML_ATTR_INFO\r
+    XML_AttrInfo *currAttInfo = &attInfo[i];\r
+#endif\r
+    /* add the name and value to the attribute list */\r
+    ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,\r
+                                         currAtt->name\r
+                                         + XmlNameLength(enc, currAtt->name));\r
+    if (!attId)\r
+      return XML_ERROR_NO_MEMORY;\r
+#ifdef XML_ATTR_INFO\r
+    currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);\r
+    currAttInfo->nameEnd = currAttInfo->nameStart +\r
+                           XmlNameLength(enc, currAtt->name);\r
+    currAttInfo->valueStart = parseEndByteIndex -\r
+                            (parseEndPtr - currAtt->valuePtr);\r
+    currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);\r
+#endif\r
+    /* Detect duplicate attributes by their QNames. This does not work when\r
+       namespace processing is turned on and different prefixes for the same\r
+       namespace are used. For this case we have a check further down.\r
+    */\r
+    if ((attId->name)[-1]) {\r
+      if (enc == encoding)\r
+        eventPtr = atts[i].name;\r
+      return XML_ERROR_DUPLICATE_ATTRIBUTE;\r
+    }\r
+    (attId->name)[-1] = 1;\r
+    appAtts[attIndex++] = attId->name;\r
+    if (!atts[i].normalized) {\r
+      enum XML_Error result;\r
+      XML_Bool isCdata = XML_TRUE;\r
+\r
+      /* figure out whether declared as other than CDATA */\r
+      if (attId->maybeTokenized) {\r
+        int j;\r
+        for (j = 0; j < nDefaultAtts; j++) {\r
+          if (attId == elementType->defaultAtts[j].id) {\r
+            isCdata = elementType->defaultAtts[j].isCdata;\r
+            break;\r
+          }\r
+        }\r
+      }\r
+\r
+      /* normalize the attribute value */\r
+      result = storeAttributeValue(parser, enc, isCdata,\r
+                                   atts[i].valuePtr, atts[i].valueEnd,\r
+                                   &tempPool);\r
+      if (result)\r
+        return result;\r
+      appAtts[attIndex] = poolStart(&tempPool);\r
+      poolFinish(&tempPool);\r
+    }\r
+    else {\r
+      /* the value did not need normalizing */\r
+      appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,\r
+                                          atts[i].valueEnd);\r
+      if (appAtts[attIndex] == 0)\r
+        return XML_ERROR_NO_MEMORY;\r
+      poolFinish(&tempPool);\r
+    }\r
+    /* handle prefixed attribute names */\r
+    if (attId->prefix) {\r
+      if (attId->xmlns) {\r
+        /* deal with namespace declarations here */\r
+        enum XML_Error result = addBinding(parser, attId->prefix, attId,\r
+                                           appAtts[attIndex], bindingsPtr);\r
+        if (result)\r
+          return result;\r
+        --attIndex;\r
+      }\r
+      else {\r
+        /* deal with other prefixed names later */\r
+        attIndex++;\r
+        nPrefixes++;\r
+        (attId->name)[-1] = 2;\r
+      }\r
+    }\r
+    else\r
+      attIndex++;\r
+  }\r
+\r
+  /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */\r
+  nSpecifiedAtts = attIndex;\r
+  if (elementType->idAtt && (elementType->idAtt->name)[-1]) {\r
+    for (i = 0; i < attIndex; i += 2)\r
+      if (appAtts[i] == elementType->idAtt->name) {\r
+        idAttIndex = i;\r
+        break;\r
+      }\r
+  }\r
+  else\r
+    idAttIndex = -1;\r
+\r
+  /* do attribute defaulting */\r
+  for (i = 0; i < nDefaultAtts; i++) {\r
+    const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i;\r
+    if (!(da->id->name)[-1] && da->value) {\r
+      if (da->id->prefix) {\r
+        if (da->id->xmlns) {\r
+          enum XML_Error result = addBinding(parser, da->id->prefix, da->id,\r
+                                             da->value, bindingsPtr);\r
+          if (result)\r
+            return result;\r
+        }\r
+        else {\r
+          (da->id->name)[-1] = 2;\r
+          nPrefixes++;\r
+          appAtts[attIndex++] = da->id->name;\r
+          appAtts[attIndex++] = da->value;\r
+        }\r
+      }\r
+      else {\r
+        (da->id->name)[-1] = 1;\r
+        appAtts[attIndex++] = da->id->name;\r
+        appAtts[attIndex++] = da->value;\r
+      }\r
+    }\r
+  }\r
+  appAtts[attIndex] = 0;\r
+\r
+  /* expand prefixed attribute names, check for duplicates,\r
+     and clear flags that say whether attributes were specified */\r
+  i = 0;\r
+  if (nPrefixes) {\r
+    int j;  /* hash table index */\r
+    unsigned long version = nsAttsVersion;\r
+    int nsAttsSize = (int)1 << nsAttsPower;\r
+    /* size of hash table must be at least 2 * (# of prefixed attributes) */\r
+    if ((nPrefixes << 1) >> nsAttsPower) {  /* true for nsAttsPower = 0 */\r
+      NS_ATT *temp;\r
+      /* hash table size must also be a power of 2 and >= 8 */\r
+      while (nPrefixes >> nsAttsPower++);\r
+      if (nsAttsPower < 3)\r
+        nsAttsPower = 3;\r
+      nsAttsSize = (int)1 << nsAttsPower;\r
+      temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT));\r
+      if (!temp)\r
+        return XML_ERROR_NO_MEMORY;\r
+      nsAtts = temp;\r
+      version = 0;  /* force re-initialization of nsAtts hash table */\r
+    }\r
+    /* using a version flag saves us from initializing nsAtts every time */\r
+    if (!version) {  /* initialize version flags when version wraps around */\r
+      version = INIT_ATTS_VERSION;\r
+      for (j = nsAttsSize; j != 0; )\r
+        nsAtts[--j].version = version;\r
+    }\r
+    nsAttsVersion = --version;\r
+\r
+    /* expand prefixed names and check for duplicates */\r
+    for (; i < attIndex; i += 2) {\r
+      const XML_Char *s = appAtts[i];\r
+      if (s[-1] == 2) {  /* prefixed */\r
+        ATTRIBUTE_ID *id;\r
+        const BINDING *b;\r
+        unsigned long uriHash = hash_secret_salt;\r
+        ((XML_Char *)s)[-1] = 0;  /* clear flag */\r
+        id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);\r
+        b = id->prefix->binding;\r
+        if (!b)\r
+          return XML_ERROR_UNBOUND_PREFIX;\r
+\r
+        /* as we expand the name we also calculate its hash value */\r
+        for (j = 0; j < b->uriLen; j++) {\r
+          const XML_Char c = b->uri[j];\r
+          if (!poolAppendChar(&tempPool, c))\r
+            return XML_ERROR_NO_MEMORY;\r
+          uriHash = CHAR_HASH(uriHash, c);\r
+        }\r
+        while (*s++ != XML_T(ASCII_COLON))\r
+          ;\r
+        do {  /* copies null terminator */\r
+          const XML_Char c = *s;\r
+          if (!poolAppendChar(&tempPool, *s))\r
+            return XML_ERROR_NO_MEMORY;\r
+          uriHash = CHAR_HASH(uriHash, c);\r
+        } while (*s++);\r
+\r
+        { /* Check hash table for duplicate of expanded name (uriName).\r
+             Derived from code in lookup(parser, HASH_TABLE *table, ...).\r
+          */\r
+          unsigned char step = 0;\r
+          unsigned long mask = nsAttsSize - 1;\r
+          j = uriHash & mask;  /* index into hash table */\r
+          while (nsAtts[j].version == version) {\r
+            /* for speed we compare stored hash values first */\r
+            if (uriHash == nsAtts[j].hash) {\r
+              const XML_Char *s1 = poolStart(&tempPool);\r
+              const XML_Char *s2 = nsAtts[j].uriName;\r
+              /* s1 is null terminated, but not s2 */\r
+              for (; *s1 == *s2 && *s1 != 0; s1++, s2++);\r
+              if (*s1 == 0)\r
+                return XML_ERROR_DUPLICATE_ATTRIBUTE;\r
+            }\r
+            if (!step)\r
+              step = PROBE_STEP(uriHash, mask, nsAttsPower);\r
+            j < step ? (j += nsAttsSize - step) : (j -= step);\r
+          }\r
+        }\r
+\r
+        if (ns_triplets) {  /* append namespace separator and prefix */\r
+          tempPool.ptr[-1] = namespaceSeparator;\r
+          s = b->prefix->name;\r
+          do {\r
+            if (!poolAppendChar(&tempPool, *s))\r
+              return XML_ERROR_NO_MEMORY;\r
+          } while (*s++);\r
+        }\r
+\r
+        /* store expanded name in attribute list */\r
+        s = poolStart(&tempPool);\r
+        poolFinish(&tempPool);\r
+        appAtts[i] = s;\r
+\r
+        /* fill empty slot with new version, uriName and hash value */\r
+        nsAtts[j].version = version;\r
+        nsAtts[j].hash = uriHash;\r
+        nsAtts[j].uriName = s;\r
+\r
+        if (!--nPrefixes) {\r
+          i += 2;\r
+          break;\r
+        }\r
+      }\r
+      else  /* not prefixed */\r
+        ((XML_Char *)s)[-1] = 0;  /* clear flag */\r
+    }\r
+  }\r
+  /* clear flags for the remaining attributes */\r
+  for (; i < attIndex; i += 2)\r
+    ((XML_Char *)(appAtts[i]))[-1] = 0;\r
+  for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)\r
+    binding->attId->name[-1] = 0;\r
+\r
+  if (!ns)\r
+    return XML_ERROR_NONE;\r
+\r
+  /* expand the element type name */\r
+  if (elementType->prefix) {\r
+    binding = elementType->prefix->binding;\r
+    if (!binding)\r
+      return XML_ERROR_UNBOUND_PREFIX;\r
+    localPart = tagNamePtr->str;\r
+    while (*localPart++ != XML_T(ASCII_COLON))\r
+      ;\r
+  }\r
+  else if (dtd->defaultPrefix.binding) {\r
+    binding = dtd->defaultPrefix.binding;\r
+    localPart = tagNamePtr->str;\r
+  }\r
+  else\r
+    return XML_ERROR_NONE;\r
+  prefixLen = 0;\r
+  if (ns_triplets && binding->prefix->name) {\r
+    for (; binding->prefix->name[prefixLen++];)\r
+      ;  /* prefixLen includes null terminator */\r
+  }\r
+  tagNamePtr->localPart = localPart;\r
+  tagNamePtr->uriLen = binding->uriLen;\r
+  tagNamePtr->prefix = binding->prefix->name;\r
+  tagNamePtr->prefixLen = prefixLen;\r
+  for (i = 0; localPart[i++];)\r
+    ;  /* i includes null terminator */\r
+  n = i + binding->uriLen + prefixLen;\r
+  if (n > binding->uriAlloc) {\r
+    TAG *p;\r
+    uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));\r
+    if (!uri)\r
+      return XML_ERROR_NO_MEMORY;\r
+    binding->uriAlloc = n + EXPAND_SPARE;\r
+    memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));\r
+    for (p = tagStack; p; p = p->parent)\r
+      if (p->name.str == binding->uri)\r
+        p->name.str = uri;\r
+    FREE(binding->uri);\r
+    binding->uri = uri;\r
+  }\r
+  /* if namespaceSeparator != '\0' then uri includes it already */\r
+  uri = binding->uri + binding->uriLen;\r
+  memcpy(uri, localPart, i * sizeof(XML_Char));\r
+  /* we always have a namespace separator between localPart and prefix */\r
+  if (prefixLen) {\r
+    uri += i - 1;\r
+    *uri = namespaceSeparator;  /* replace null terminator */\r
+    memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));\r
+  }\r
+  tagNamePtr->str = binding->uri;\r
+  return XML_ERROR_NONE;\r
+}\r
+\r
+/* addBinding() overwrites the value of prefix->binding without checking.\r
+   Therefore one must keep track of the old value outside of addBinding().\r
+*/\r
+static enum XML_Error\r
+addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,\r
+           const XML_Char *uri, BINDING **bindingsPtr)\r
+{\r
+  static const XML_Char xmlNamespace[] = {\r
+    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,\r
+    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,\r
+    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,\r
+    ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,\r
+    ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,\r
+    ASCII_e, '\0'\r
+  };\r
+  static const int xmlLen =\r
+    (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;\r
+  static const XML_Char xmlnsNamespace[] = {\r
+    ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,\r
+    ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,\r
+    ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,\r
+    ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,\r
+    ASCII_SLASH, '\0'\r
+  };\r
+  static const int xmlnsLen =\r
+    (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;\r
+\r
+  XML_Bool mustBeXML = XML_FALSE;\r
+  XML_Bool isXML = XML_TRUE;\r
+  XML_Bool isXMLNS = XML_TRUE;\r
+\r
+  BINDING *b;\r
+  int len;\r
+\r
+  /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */\r
+  if (*uri == XML_T('\0') && prefix->name)\r
+    return XML_ERROR_UNDECLARING_PREFIX;\r
+\r
+  if (prefix->name\r
+      && prefix->name[0] == XML_T(ASCII_x)\r
+      && prefix->name[1] == XML_T(ASCII_m)\r
+      && prefix->name[2] == XML_T(ASCII_l)) {\r
+\r
+    /* Not allowed to bind xmlns */\r
+    if (prefix->name[3] == XML_T(ASCII_n)\r
+        && prefix->name[4] == XML_T(ASCII_s)\r
+        && prefix->name[5] == XML_T('\0'))\r
+      return XML_ERROR_RESERVED_PREFIX_XMLNS;\r
+\r
+    if (prefix->name[3] == XML_T('\0'))\r
+      mustBeXML = XML_TRUE;\r
+  }\r
+\r
+  for (len = 0; uri[len]; len++) {\r
+    if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))\r
+      isXML = XML_FALSE;\r
+\r
+    if (!mustBeXML && isXMLNS\r
+        && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))\r
+      isXMLNS = XML_FALSE;\r
+  }\r
+  isXML = isXML && len == xmlLen;\r
+  isXMLNS = isXMLNS && len == xmlnsLen;\r
+\r
+  if (mustBeXML != isXML)\r
+    return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML\r
+                     : XML_ERROR_RESERVED_NAMESPACE_URI;\r
+\r
+  if (isXMLNS)\r
+    return XML_ERROR_RESERVED_NAMESPACE_URI;\r
+\r
+  if (namespaceSeparator)\r
+    len++;\r
+  if (freeBindingList) {\r
+    b = freeBindingList;\r
+    if (len > b->uriAlloc) {\r
+      XML_Char *temp = (XML_Char *)REALLOC(b->uri,\r
+                          sizeof(XML_Char) * (len + EXPAND_SPARE));\r
+      if (temp == NULL)\r
+        return XML_ERROR_NO_MEMORY;\r
+      b->uri = temp;\r
+      b->uriAlloc = len + EXPAND_SPARE;\r
+    }\r
+    freeBindingList = b->nextTagBinding;\r
+  }\r
+  else {\r
+    b = (BINDING *)MALLOC(sizeof(BINDING));\r
+    if (!b)\r
+      return XML_ERROR_NO_MEMORY;\r
+    b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));\r
+    if (!b->uri) {\r
+      FREE(b);\r
+      return XML_ERROR_NO_MEMORY;\r
+    }\r
+    b->uriAlloc = len + EXPAND_SPARE;\r
+  }\r
+  b->uriLen = len;\r
+  memcpy(b->uri, uri, len * sizeof(XML_Char));\r
+  if (namespaceSeparator)\r
+    b->uri[len - 1] = namespaceSeparator;\r
+  b->prefix = prefix;\r
+  b->attId = attId;\r
+  b->prevPrefixBinding = prefix->binding;\r
+  /* NULL binding when default namespace undeclared */\r
+  if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)\r
+    prefix->binding = NULL;\r
+  else\r
+    prefix->binding = b;\r
+  b->nextTagBinding = *bindingsPtr;\r
+  *bindingsPtr = b;\r
+  /* if attId == NULL then we are not starting a namespace scope */\r
+  if (attId && startNamespaceDeclHandler)\r
+    startNamespaceDeclHandler(handlerArg, prefix->name,\r
+                              prefix->binding ? uri : 0);\r
+  return XML_ERROR_NONE;\r
+}\r
+\r
+/* The idea here is to avoid using stack for each CDATA section when\r
+   the whole file is parsed with one call.\r
+*/\r
+static enum XML_Error PTRCALL\r
+cdataSectionProcessor(XML_Parser parser,\r
+                      const char *start,\r
+                      const char *end,\r
+                      const char **endPtr)\r
+{\r
+  enum XML_Error result = doCdataSection(parser, encoding, &start, end,\r
+                                         endPtr, (XML_Bool)!ps_finalBuffer);\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+  if (start) {\r
+    if (parentParser) {  /* we are parsing an external entity */\r
+      processor = externalEntityContentProcessor;\r
+      return externalEntityContentProcessor(parser, start, end, endPtr);\r
+    }\r
+    else {\r
+      processor = contentProcessor;\r
+      return contentProcessor(parser, start, end, endPtr);\r
+    }\r
+  }\r
+  return result;\r
+}\r
+\r
+/* startPtr gets set to non-null if the section is closed, and to null if\r
+   the section is not yet closed.\r
+*/\r
+static enum XML_Error\r
+doCdataSection(XML_Parser parser,\r
+               const ENCODING *enc,\r
+               const char **startPtr,\r
+               const char *end,\r
+               const char **nextPtr,\r
+               XML_Bool haveMore)\r
+{\r
+  const char *s = *startPtr;\r
+  const char **eventPP;\r
+  const char **eventEndPP;\r
+  if (enc == encoding) {\r
+    eventPP = &eventPtr;\r
+    *eventPP = s;\r
+    eventEndPP = &eventEndPtr;\r
+  }\r
+  else {\r
+    eventPP = &(openInternalEntities->internalEventPtr);\r
+    eventEndPP = &(openInternalEntities->internalEventEndPtr);\r
+  }\r
+  *eventPP = s;\r
+  *startPtr = NULL;\r
+\r
+  for (;;) {\r
+    const char *next;\r
+    int tok = XmlCdataSectionTok(enc, s, end, &next);\r
+    *eventEndPP = next;\r
+    switch (tok) {\r
+    case XML_TOK_CDATA_SECT_CLOSE:\r
+      if (endCdataSectionHandler)\r
+        endCdataSectionHandler(handlerArg);\r
+#if 0\r
+      /* see comment under XML_TOK_CDATA_SECT_OPEN */\r
+      else if (characterDataHandler)\r
+        characterDataHandler(handlerArg, dataBuf, 0);\r
+#endif\r
+      else if (defaultHandler)\r
+        reportDefault(parser, enc, s, next);\r
+      *startPtr = next;\r
+      *nextPtr = next;\r
+      if (ps_parsing == XML_FINISHED)\r
+        return XML_ERROR_ABORTED;\r
+      else\r
+        return XML_ERROR_NONE;\r
+    case XML_TOK_DATA_NEWLINE:\r
+      if (characterDataHandler) {\r
+        XML_Char c = 0xA;\r
+        characterDataHandler(handlerArg, &c, 1);\r
+      }\r
+      else if (defaultHandler)\r
+        reportDefault(parser, enc, s, next);\r
+      break;\r
+    case XML_TOK_DATA_CHARS:\r
+      {\r
+        XML_CharacterDataHandler charDataHandler = characterDataHandler;\r
+        if (charDataHandler) {\r
+          if (MUST_CONVERT(enc, s)) {\r
+            for (;;) {\r
+              ICHAR *dataPtr = (ICHAR *)dataBuf;\r
+              XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);\r
+              *eventEndPP = next;\r
+              charDataHandler(handlerArg, dataBuf,\r
+                              (int)(dataPtr - (ICHAR *)dataBuf));\r
+              if (s == next)\r
+                break;\r
+              *eventPP = s;\r
+            }\r
+          }\r
+          else\r
+            charDataHandler(handlerArg,\r
+                            (XML_Char *)s,\r
+                            (int)((XML_Char *)next - (XML_Char *)s));\r
+        }\r
+        else if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+      }\r
+      break;\r
+    case XML_TOK_INVALID:\r
+      *eventPP = next;\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_PARTIAL_CHAR:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_PARTIAL_CHAR;\r
+    case XML_TOK_PARTIAL:\r
+    case XML_TOK_NONE:\r
+      if (haveMore) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_UNCLOSED_CDATA_SECTION;\r
+    default:\r
+      *eventPP = next;\r
+      return XML_ERROR_UNEXPECTED_STATE;\r
+    }\r
+\r
+    *eventPP = s = next;\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    case XML_FINISHED:\r
+      return XML_ERROR_ABORTED;\r
+    default: ;\r
+    }\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+/* The idea here is to avoid using stack for each IGNORE section when\r
+   the whole file is parsed with one call.\r
+*/\r
+static enum XML_Error PTRCALL\r
+ignoreSectionProcessor(XML_Parser parser,\r
+                       const char *start,\r
+                       const char *end,\r
+                       const char **endPtr)\r
+{\r
+  enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,\r
+                                          endPtr, (XML_Bool)!ps_finalBuffer);\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+  if (start) {\r
+    processor = prologProcessor;\r
+    return prologProcessor(parser, start, end, endPtr);\r
+  }\r
+  return result;\r
+}\r
+\r
+/* startPtr gets set to non-null is the section is closed, and to null\r
+   if the section is not yet closed.\r
+*/\r
+static enum XML_Error\r
+doIgnoreSection(XML_Parser parser,\r
+                const ENCODING *enc,\r
+                const char **startPtr,\r
+                const char *end,\r
+                const char **nextPtr,\r
+                XML_Bool haveMore)\r
+{\r
+  const char *next;\r
+  int tok;\r
+  const char *s = *startPtr;\r
+  const char **eventPP;\r
+  const char **eventEndPP;\r
+  if (enc == encoding) {\r
+    eventPP = &eventPtr;\r
+    *eventPP = s;\r
+    eventEndPP = &eventEndPtr;\r
+  }\r
+  else {\r
+    eventPP = &(openInternalEntities->internalEventPtr);\r
+    eventEndPP = &(openInternalEntities->internalEventEndPtr);\r
+  }\r
+  *eventPP = s;\r
+  *startPtr = NULL;\r
+  tok = XmlIgnoreSectionTok(enc, s, end, &next);\r
+  *eventEndPP = next;\r
+  switch (tok) {\r
+  case XML_TOK_IGNORE_SECT:\r
+    if (defaultHandler)\r
+      reportDefault(parser, enc, s, next);\r
+    *startPtr = next;\r
+    *nextPtr = next;\r
+    if (ps_parsing == XML_FINISHED)\r
+      return XML_ERROR_ABORTED;\r
+    else\r
+      return XML_ERROR_NONE;\r
+  case XML_TOK_INVALID:\r
+    *eventPP = next;\r
+    return XML_ERROR_INVALID_TOKEN;\r
+  case XML_TOK_PARTIAL_CHAR:\r
+    if (haveMore) {\r
+      *nextPtr = s;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    return XML_ERROR_PARTIAL_CHAR;\r
+  case XML_TOK_PARTIAL:\r
+  case XML_TOK_NONE:\r
+    if (haveMore) {\r
+      *nextPtr = s;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */\r
+  default:\r
+    *eventPP = next;\r
+    return XML_ERROR_UNEXPECTED_STATE;\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+#endif /* XML_DTD */\r
+\r
+static enum XML_Error\r
+initializeEncoding(XML_Parser parser)\r
+{\r
+  const char *s;\r
+#ifdef XML_UNICODE\r
+  char encodingBuf[128];\r
+  if (!protocolEncodingName)\r
+    s = NULL;\r
+  else {\r
+    int i;\r
+    for (i = 0; protocolEncodingName[i]; i++) {\r
+      if (i == sizeof(encodingBuf) - 1\r
+          || (protocolEncodingName[i] & ~0x7f) != 0) {\r
+        encodingBuf[0] = '\0';\r
+        break;\r
+      }\r
+      encodingBuf[i] = (char)protocolEncodingName[i];\r
+    }\r
+    encodingBuf[i] = '\0';\r
+    s = encodingBuf;\r
+  }\r
+#else\r
+  s = protocolEncodingName;\r
+#endif\r
+  if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))\r
+    return XML_ERROR_NONE;\r
+  return handleUnknownEncoding(parser, protocolEncodingName);\r
+}\r
+\r
+static enum XML_Error\r
+processXmlDecl(XML_Parser parser, int isGeneralTextEntity,\r
+               const char *s, const char *next)\r
+{\r
+  const char *encodingName = NULL;\r
+  const XML_Char *storedEncName = NULL;\r
+  const ENCODING *newEncoding = NULL;\r
+  const char *version = NULL;\r
+  const char *versionend;\r
+  const XML_Char *storedversion = NULL;\r
+  int standalone = -1;\r
+  if (!(ns\r
+        ? XmlParseXmlDeclNS\r
+        : XmlParseXmlDecl)(isGeneralTextEntity,\r
+                           encoding,\r
+                           s,\r
+                           next,\r
+                           &eventPtr,\r
+                           &version,\r
+                           &versionend,\r
+                           &encodingName,\r
+                           &newEncoding,\r
+                           &standalone)) {\r
+    if (isGeneralTextEntity)\r
+      return XML_ERROR_TEXT_DECL;\r
+    else\r
+      return XML_ERROR_XML_DECL;\r
+  }\r
+  if (!isGeneralTextEntity && standalone == 1) {\r
+    _dtd->standalone = XML_TRUE;\r
+#ifdef XML_DTD\r
+    if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)\r
+      paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;\r
+#endif /* XML_DTD */\r
+  }\r
+  if (xmlDeclHandler) {\r
+    if (encodingName != NULL) {\r
+      storedEncName = poolStoreString(&temp2Pool,\r
+                                      encoding,\r
+                                      encodingName,\r
+                                      encodingName\r
+                                      + XmlNameLength(encoding, encodingName));\r
+      if (!storedEncName)\r
+              return XML_ERROR_NO_MEMORY;\r
+      poolFinish(&temp2Pool);\r
+    }\r
+    if (version) {\r
+      storedversion = poolStoreString(&temp2Pool,\r
+                                      encoding,\r
+                                      version,\r
+                                      versionend - encoding->minBytesPerChar);\r
+      if (!storedversion)\r
+        return XML_ERROR_NO_MEMORY;\r
+    }\r
+    xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);\r
+  }\r
+  else if (defaultHandler)\r
+    reportDefault(parser, encoding, s, next);\r
+  if (protocolEncodingName == NULL) {\r
+    if (newEncoding) {\r
+      if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {\r
+        eventPtr = encodingName;\r
+        return XML_ERROR_INCORRECT_ENCODING;\r
+      }\r
+      encoding = newEncoding;\r
+    }\r
+    else if (encodingName) {\r
+      enum XML_Error result;\r
+      if (!storedEncName) {\r
+        storedEncName = poolStoreString(\r
+          &temp2Pool, encoding, encodingName,\r
+          encodingName + XmlNameLength(encoding, encodingName));\r
+        if (!storedEncName)\r
+          return XML_ERROR_NO_MEMORY;\r
+      }\r
+      result = handleUnknownEncoding(parser, storedEncName);\r
+      poolClear(&temp2Pool);\r
+      if (result == XML_ERROR_UNKNOWN_ENCODING)\r
+        eventPtr = encodingName;\r
+      return result;\r
+    }\r
+  }\r
+\r
+  if (storedEncName || storedversion)\r
+    poolClear(&temp2Pool);\r
+\r
+  return XML_ERROR_NONE;\r
+}\r
+\r
+static enum XML_Error\r
+handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)\r
+{\r
+  if (unknownEncodingHandler) {\r
+    XML_Encoding info;\r
+    int i;\r
+    for (i = 0; i < 256; i++)\r
+      info.map[i] = -1;\r
+    info.convert = NULL;\r
+    info.data = NULL;\r
+    info.release = NULL;\r
+    if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,\r
+                               &info)) {\r
+      ENCODING *enc;\r
+      unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());\r
+      if (!unknownEncodingMem) {\r
+        if (info.release)\r
+          info.release(info.data);\r
+        return XML_ERROR_NO_MEMORY;\r
+      }\r
+      enc = (ns\r
+             ? XmlInitUnknownEncodingNS\r
+             : XmlInitUnknownEncoding)(unknownEncodingMem,\r
+                                       info.map,\r
+                                       info.convert,\r
+                                       info.data);\r
+      if (enc) {\r
+        unknownEncodingData = info.data;\r
+        unknownEncodingRelease = info.release;\r
+        encoding = enc;\r
+        return XML_ERROR_NONE;\r
+      }\r
+    }\r
+    if (info.release != NULL)\r
+      info.release(info.data);\r
+  }\r
+  return XML_ERROR_UNKNOWN_ENCODING;\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+prologInitProcessor(XML_Parser parser,\r
+                    const char *s,\r
+                    const char *end,\r
+                    const char **nextPtr)\r
+{\r
+  enum XML_Error result = initializeEncoding(parser);\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+  processor = prologProcessor;\r
+  return prologProcessor(parser, s, end, nextPtr);\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+static enum XML_Error PTRCALL\r
+externalParEntInitProcessor(XML_Parser parser,\r
+                            const char *s,\r
+                            const char *end,\r
+                            const char **nextPtr)\r
+{\r
+  enum XML_Error result = initializeEncoding(parser);\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+\r
+  /* we know now that XML_Parse(Buffer) has been called,\r
+     so we consider the external parameter entity read */\r
+  _dtd->paramEntityRead = XML_TRUE;\r
+\r
+  if (prologState.inEntityValue) {\r
+    processor = entityValueInitProcessor;\r
+    return entityValueInitProcessor(parser, s, end, nextPtr);\r
+  }\r
+  else {\r
+    processor = externalParEntProcessor;\r
+    return externalParEntProcessor(parser, s, end, nextPtr);\r
+  }\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+entityValueInitProcessor(XML_Parser parser,\r
+                         const char *s,\r
+                         const char *end,\r
+                         const char **nextPtr)\r
+{\r
+  int tok;\r
+  const char *start = s;\r
+  const char *next = start;\r
+  eventPtr = start;\r
+\r
+  for (;;) {\r
+    tok = XmlPrologTok(encoding, start, end, &next);\r
+    eventEndPtr = next;\r
+    if (tok <= 0) {\r
+      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      switch (tok) {\r
+      case XML_TOK_INVALID:\r
+        return XML_ERROR_INVALID_TOKEN;\r
+      case XML_TOK_PARTIAL:\r
+        return XML_ERROR_UNCLOSED_TOKEN;\r
+      case XML_TOK_PARTIAL_CHAR:\r
+        return XML_ERROR_PARTIAL_CHAR;\r
+      case XML_TOK_NONE:   /* start == end */\r
+      default:\r
+        break;\r
+      }\r
+      /* found end of entity value - can store it now */\r
+      return storeEntityValue(parser, encoding, s, end);\r
+    }\r
+    else if (tok == XML_TOK_XML_DECL) {\r
+      enum XML_Error result;\r
+      result = processXmlDecl(parser, 0, start, next);\r
+      if (result != XML_ERROR_NONE)\r
+        return result;\r
+      switch (ps_parsing) {\r
+      case XML_SUSPENDED:\r
+        *nextPtr = next;\r
+        return XML_ERROR_NONE;\r
+      case XML_FINISHED:\r
+        return XML_ERROR_ABORTED;\r
+      default:\r
+        *nextPtr = next;\r
+      }\r
+      /* stop scanning for text declaration - we found one */\r
+      processor = entityValueProcessor;\r
+      return entityValueProcessor(parser, next, end, nextPtr);\r
+    }\r
+    /* If we are at the end of the buffer, this would cause XmlPrologTok to\r
+       return XML_TOK_NONE on the next call, which would then cause the\r
+       function to exit with *nextPtr set to s - that is what we want for other\r
+       tokens, but not for the BOM - we would rather like to skip it;\r
+       then, when this routine is entered the next time, XmlPrologTok will\r
+       return XML_TOK_INVALID, since the BOM is still in the buffer\r
+    */\r
+    else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) {\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    start = next;\r
+    eventPtr = start;\r
+  }\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+externalParEntProcessor(XML_Parser parser,\r
+                        const char *s,\r
+                        const char *end,\r
+                        const char **nextPtr)\r
+{\r
+  const char *next = s;\r
+  int tok;\r
+\r
+  tok = XmlPrologTok(encoding, s, end, &next);\r
+  if (tok <= 0) {\r
+    if (!ps_finalBuffer && tok != XML_TOK_INVALID) {\r
+      *nextPtr = s;\r
+      return XML_ERROR_NONE;\r
+    }\r
+    switch (tok) {\r
+    case XML_TOK_INVALID:\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_PARTIAL:\r
+      return XML_ERROR_UNCLOSED_TOKEN;\r
+    case XML_TOK_PARTIAL_CHAR:\r
+      return XML_ERROR_PARTIAL_CHAR;\r
+    case XML_TOK_NONE:   /* start == end */\r
+    default:\r
+      break;\r
+    }\r
+  }\r
+  /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.\r
+     However, when parsing an external subset, doProlog will not accept a BOM\r
+     as valid, and report a syntax error, so we have to skip the BOM\r
+  */\r
+  else if (tok == XML_TOK_BOM) {\r
+    s = next;\r
+    tok = XmlPrologTok(encoding, s, end, &next);\r
+  }\r
+\r
+  processor = prologProcessor;\r
+  return doProlog(parser, encoding, s, end, tok, next,\r
+                  nextPtr, (XML_Bool)!ps_finalBuffer);\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+entityValueProcessor(XML_Parser parser,\r
+                     const char *s,\r
+                     const char *end,\r
+                     const char **nextPtr)\r
+{\r
+  const char *start = s;\r
+  const char *next = s;\r
+  const ENCODING *enc = encoding;\r
+  int tok;\r
+\r
+  for (;;) {\r
+    tok = XmlPrologTok(enc, start, end, &next);\r
+    if (tok <= 0) {\r
+      if (!ps_finalBuffer && tok != XML_TOK_INVALID) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      switch (tok) {\r
+      case XML_TOK_INVALID:\r
+        return XML_ERROR_INVALID_TOKEN;\r
+      case XML_TOK_PARTIAL:\r
+        return XML_ERROR_UNCLOSED_TOKEN;\r
+      case XML_TOK_PARTIAL_CHAR:\r
+        return XML_ERROR_PARTIAL_CHAR;\r
+      case XML_TOK_NONE:   /* start == end */\r
+      default:\r
+        break;\r
+      }\r
+      /* found end of entity value - can store it now */\r
+      return storeEntityValue(parser, enc, s, end);\r
+    }\r
+    start = next;\r
+  }\r
+}\r
+\r
+#endif /* XML_DTD */\r
+\r
+static enum XML_Error PTRCALL\r
+prologProcessor(XML_Parser parser,\r
+                const char *s,\r
+                const char *end,\r
+                const char **nextPtr)\r
+{\r
+  const char *next = s;\r
+  int tok = XmlPrologTok(encoding, s, end, &next);\r
+  return doProlog(parser, encoding, s, end, tok, next,\r
+                  nextPtr, (XML_Bool)!ps_finalBuffer);\r
+}\r
+\r
+static enum XML_Error\r
+doProlog(XML_Parser parser,\r
+         const ENCODING *enc,\r
+         const char *s,\r
+         const char *end,\r
+         int tok,\r
+         const char *next,\r
+         const char **nextPtr,\r
+         XML_Bool haveMore)\r
+{\r
+#ifdef XML_DTD\r
+  static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };\r
+#endif /* XML_DTD */\r
+  static const XML_Char atypeCDATA[] =\r
+      { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };\r
+  static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };\r
+  static const XML_Char atypeIDREF[] =\r
+      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };\r
+  static const XML_Char atypeIDREFS[] =\r
+      { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };\r
+  static const XML_Char atypeENTITY[] =\r
+      { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };\r
+  static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,\r
+      ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };\r
+  static const XML_Char atypeNMTOKEN[] = {\r
+      ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };\r
+  static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,\r
+      ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };\r
+  static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,\r
+      ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };\r
+  static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };\r
+  static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };\r
+\r
+  /* save one level of indirection */\r
+  DTD * const dtd = _dtd;\r
+\r
+  const char **eventPP;\r
+  const char **eventEndPP;\r
+  enum XML_Content_Quant quant;\r
+\r
+  if (enc == encoding) {\r
+    eventPP = &eventPtr;\r
+    eventEndPP = &eventEndPtr;\r
+  }\r
+  else {\r
+    eventPP = &(openInternalEntities->internalEventPtr);\r
+    eventEndPP = &(openInternalEntities->internalEventEndPtr);\r
+  }\r
+\r
+  for (;;) {\r
+    int role;\r
+    XML_Bool handleDefault = XML_TRUE;\r
+    *eventPP = s;\r
+    *eventEndPP = next;\r
+    if (tok <= 0) {\r
+      if (haveMore && tok != XML_TOK_INVALID) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      switch (tok) {\r
+      case XML_TOK_INVALID:\r
+        *eventPP = next;\r
+        return XML_ERROR_INVALID_TOKEN;\r
+      case XML_TOK_PARTIAL:\r
+        return XML_ERROR_UNCLOSED_TOKEN;\r
+      case XML_TOK_PARTIAL_CHAR:\r
+        return XML_ERROR_PARTIAL_CHAR;\r
+      case -XML_TOK_PROLOG_S:\r
+        tok = -tok;\r
+        break;\r
+      case XML_TOK_NONE:\r
+#ifdef XML_DTD\r
+        /* for internal PE NOT referenced between declarations */\r
+        if (enc != encoding && !openInternalEntities->betweenDecl) {\r
+          *nextPtr = s;\r
+          return XML_ERROR_NONE;\r
+        }\r
+        /* WFC: PE Between Declarations - must check that PE contains\r
+           complete markup, not only for external PEs, but also for\r
+           internal PEs if the reference occurs between declarations.\r
+        */\r
+        if (isParamEntity || enc != encoding) {\r
+          if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)\r
+              == XML_ROLE_ERROR)\r
+            return XML_ERROR_INCOMPLETE_PE;\r
+          *nextPtr = s;\r
+          return XML_ERROR_NONE;\r
+        }\r
+#endif /* XML_DTD */\r
+        return XML_ERROR_NO_ELEMENTS;\r
+      default:\r
+        tok = -tok;\r
+        next = end;\r
+        break;\r
+      }\r
+    }\r
+    role = XmlTokenRole(&prologState, tok, s, next, enc);\r
+    switch (role) {\r
+    case XML_ROLE_XML_DECL:\r
+      {\r
+        enum XML_Error result = processXmlDecl(parser, 0, s, next);\r
+        if (result != XML_ERROR_NONE)\r
+          return result;\r
+        enc = encoding;\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_DOCTYPE_NAME:\r
+      if (startDoctypeDeclHandler) {\r
+        doctypeName = poolStoreString(&tempPool, enc, s, next);\r
+        if (!doctypeName)\r
+          return XML_ERROR_NO_MEMORY;\r
+        poolFinish(&tempPool);\r
+        doctypePubid = NULL;\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      doctypeSysid = NULL; /* always initialize to NULL */\r
+      break;\r
+    case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:\r
+      if (startDoctypeDeclHandler) {\r
+        startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,\r
+                                doctypePubid, 1);\r
+        doctypeName = NULL;\r
+        poolClear(&tempPool);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+#ifdef XML_DTD\r
+    case XML_ROLE_TEXT_DECL:\r
+      {\r
+        enum XML_Error result = processXmlDecl(parser, 1, s, next);\r
+        if (result != XML_ERROR_NONE)\r
+          return result;\r
+        enc = encoding;\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+#endif /* XML_DTD */\r
+    case XML_ROLE_DOCTYPE_PUBLIC_ID:\r
+#ifdef XML_DTD\r
+      useForeignDTD = XML_FALSE;\r
+      declEntity = (ENTITY *)lookup(parser,\r
+                                    &dtd->paramEntities,\r
+                                    externalSubsetName,\r
+                                    sizeof(ENTITY));\r
+      if (!declEntity)\r
+        return XML_ERROR_NO_MEMORY;\r
+#endif /* XML_DTD */\r
+      dtd->hasParamEntityRefs = XML_TRUE;\r
+      if (startDoctypeDeclHandler) {\r
+        XML_Char *pubId;\r
+        if (!XmlIsPublicId(enc, s, next, eventPP))\r
+          return XML_ERROR_PUBLICID;\r
+        pubId = poolStoreString(&tempPool, enc,\r
+                                s + enc->minBytesPerChar,\r
+                                next - enc->minBytesPerChar);\r
+        if (!pubId)\r
+          return XML_ERROR_NO_MEMORY;\r
+        normalizePublicId(pubId);\r
+        poolFinish(&tempPool);\r
+        doctypePubid = pubId;\r
+        handleDefault = XML_FALSE;\r
+        goto alreadyChecked;\r
+      }\r
+      /* fall through */\r
+    case XML_ROLE_ENTITY_PUBLIC_ID:\r
+      if (!XmlIsPublicId(enc, s, next, eventPP))\r
+        return XML_ERROR_PUBLICID;\r
+    alreadyChecked:\r
+      if (dtd->keepProcessing && declEntity) {\r
+        XML_Char *tem = poolStoreString(&dtd->pool,\r
+                                        enc,\r
+                                        s + enc->minBytesPerChar,\r
+                                        next - enc->minBytesPerChar);\r
+        if (!tem)\r
+          return XML_ERROR_NO_MEMORY;\r
+        normalizePublicId(tem);\r
+        declEntity->publicId = tem;\r
+        poolFinish(&dtd->pool);\r
+        if (entityDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_DOCTYPE_CLOSE:\r
+      if (doctypeName) {\r
+        startDoctypeDeclHandler(handlerArg, doctypeName,\r
+                                doctypeSysid, doctypePubid, 0);\r
+        poolClear(&tempPool);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      /* doctypeSysid will be non-NULL in the case of a previous\r
+         XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler\r
+         was not set, indicating an external subset\r
+      */\r
+#ifdef XML_DTD\r
+      if (doctypeSysid || useForeignDTD) {\r
+        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;\r
+        dtd->hasParamEntityRefs = XML_TRUE;\r
+        if (paramEntityParsing && externalEntityRefHandler) {\r
+          ENTITY *entity = (ENTITY *)lookup(parser,\r
+                                            &dtd->paramEntities,\r
+                                            externalSubsetName,\r
+                                            sizeof(ENTITY));\r
+          if (!entity)\r
+            return XML_ERROR_NO_MEMORY;\r
+          if (useForeignDTD)\r
+            entity->base = curBase;\r
+          dtd->paramEntityRead = XML_FALSE;\r
+          if (!externalEntityRefHandler(externalEntityRefHandlerArg,\r
+                                        0,\r
+                                        entity->base,\r
+                                        entity->systemId,\r
+                                        entity->publicId))\r
+            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;\r
+          if (dtd->paramEntityRead) {\r
+            if (!dtd->standalone &&\r
+                notStandaloneHandler &&\r
+                !notStandaloneHandler(handlerArg))\r
+              return XML_ERROR_NOT_STANDALONE;\r
+          }\r
+          /* if we didn't read the foreign DTD then this means that there\r
+             is no external subset and we must reset dtd->hasParamEntityRefs\r
+          */\r
+          else if (!doctypeSysid)\r
+            dtd->hasParamEntityRefs = hadParamEntityRefs;\r
+          /* end of DTD - no need to update dtd->keepProcessing */\r
+        }\r
+        useForeignDTD = XML_FALSE;\r
+      }\r
+#endif /* XML_DTD */\r
+      if (endDoctypeDeclHandler) {\r
+        endDoctypeDeclHandler(handlerArg);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_INSTANCE_START:\r
+#ifdef XML_DTD\r
+      /* if there is no DOCTYPE declaration then now is the\r
+         last chance to read the foreign DTD\r
+      */\r
+      if (useForeignDTD) {\r
+        XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;\r
+        dtd->hasParamEntityRefs = XML_TRUE;\r
+        if (paramEntityParsing && externalEntityRefHandler) {\r
+          ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,\r
+                                            externalSubsetName,\r
+                                            sizeof(ENTITY));\r
+          if (!entity)\r
+            return XML_ERROR_NO_MEMORY;\r
+          entity->base = curBase;\r
+          dtd->paramEntityRead = XML_FALSE;\r
+          if (!externalEntityRefHandler(externalEntityRefHandlerArg,\r
+                                        0,\r
+                                        entity->base,\r
+                                        entity->systemId,\r
+                                        entity->publicId))\r
+            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;\r
+          if (dtd->paramEntityRead) {\r
+            if (!dtd->standalone &&\r
+                notStandaloneHandler &&\r
+                !notStandaloneHandler(handlerArg))\r
+              return XML_ERROR_NOT_STANDALONE;\r
+          }\r
+          /* if we didn't read the foreign DTD then this means that there\r
+             is no external subset and we must reset dtd->hasParamEntityRefs\r
+          */\r
+          else\r
+            dtd->hasParamEntityRefs = hadParamEntityRefs;\r
+          /* end of DTD - no need to update dtd->keepProcessing */\r
+        }\r
+      }\r
+#endif /* XML_DTD */\r
+      processor = contentProcessor;\r
+      return contentProcessor(parser, s, end, nextPtr);\r
+    case XML_ROLE_ATTLIST_ELEMENT_NAME:\r
+      declElementType = getElementType(parser, enc, s, next);\r
+      if (!declElementType)\r
+        return XML_ERROR_NO_MEMORY;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_NAME:\r
+      declAttributeId = getAttributeId(parser, enc, s, next);\r
+      if (!declAttributeId)\r
+        return XML_ERROR_NO_MEMORY;\r
+      declAttributeIsCdata = XML_FALSE;\r
+      declAttributeType = NULL;\r
+      declAttributeIsId = XML_FALSE;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_CDATA:\r
+      declAttributeIsCdata = XML_TRUE;\r
+      declAttributeType = atypeCDATA;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_ID:\r
+      declAttributeIsId = XML_TRUE;\r
+      declAttributeType = atypeID;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_IDREF:\r
+      declAttributeType = atypeIDREF;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:\r
+      declAttributeType = atypeIDREFS;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:\r
+      declAttributeType = atypeENTITY;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:\r
+      declAttributeType = atypeENTITIES;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:\r
+      declAttributeType = atypeNMTOKEN;\r
+      goto checkAttListDeclHandler;\r
+    case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:\r
+      declAttributeType = atypeNMTOKENS;\r
+    checkAttListDeclHandler:\r
+      if (dtd->keepProcessing && attlistDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_ATTRIBUTE_ENUM_VALUE:\r
+    case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:\r
+      if (dtd->keepProcessing && attlistDeclHandler) {\r
+        const XML_Char *prefix;\r
+        if (declAttributeType) {\r
+          prefix = enumValueSep;\r
+        }\r
+        else {\r
+          prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE\r
+                    ? notationPrefix\r
+                    : enumValueStart);\r
+        }\r
+        if (!poolAppendString(&tempPool, prefix))\r
+          return XML_ERROR_NO_MEMORY;\r
+        if (!poolAppend(&tempPool, enc, s, next))\r
+          return XML_ERROR_NO_MEMORY;\r
+        declAttributeType = tempPool.start;\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:\r
+    case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:\r
+      if (dtd->keepProcessing) {\r
+        if (!defineAttribute(declElementType, declAttributeId,\r
+                             declAttributeIsCdata, declAttributeIsId,\r
+                             0, parser))\r
+          return XML_ERROR_NO_MEMORY;\r
+        if (attlistDeclHandler && declAttributeType) {\r
+          if (*declAttributeType == XML_T(ASCII_LPAREN)\r
+              || (*declAttributeType == XML_T(ASCII_N)\r
+                  && declAttributeType[1] == XML_T(ASCII_O))) {\r
+            /* Enumerated or Notation type */\r
+            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))\r
+                || !poolAppendChar(&tempPool, XML_T('\0')))\r
+              return XML_ERROR_NO_MEMORY;\r
+            declAttributeType = tempPool.start;\r
+            poolFinish(&tempPool);\r
+          }\r
+          *eventEndPP = s;\r
+          attlistDeclHandler(handlerArg, declElementType->name,\r
+                             declAttributeId->name, declAttributeType,\r
+                             0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);\r
+          poolClear(&tempPool);\r
+          handleDefault = XML_FALSE;\r
+        }\r
+      }\r
+      break;\r
+    case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:\r
+    case XML_ROLE_FIXED_ATTRIBUTE_VALUE:\r
+      if (dtd->keepProcessing) {\r
+        const XML_Char *attVal;\r
+        enum XML_Error result =\r
+          storeAttributeValue(parser, enc, declAttributeIsCdata,\r
+                              s + enc->minBytesPerChar,\r
+                              next - enc->minBytesPerChar,\r
+                              &dtd->pool);\r
+        if (result)\r
+          return result;\r
+        attVal = poolStart(&dtd->pool);\r
+        poolFinish(&dtd->pool);\r
+        /* ID attributes aren't allowed to have a default */\r
+        if (!defineAttribute(declElementType, declAttributeId,\r
+                             declAttributeIsCdata, XML_FALSE, attVal, parser))\r
+          return XML_ERROR_NO_MEMORY;\r
+        if (attlistDeclHandler && declAttributeType) {\r
+          if (*declAttributeType == XML_T(ASCII_LPAREN)\r
+              || (*declAttributeType == XML_T(ASCII_N)\r
+                  && declAttributeType[1] == XML_T(ASCII_O))) {\r
+            /* Enumerated or Notation type */\r
+            if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))\r
+                || !poolAppendChar(&tempPool, XML_T('\0')))\r
+              return XML_ERROR_NO_MEMORY;\r
+            declAttributeType = tempPool.start;\r
+            poolFinish(&tempPool);\r
+          }\r
+          *eventEndPP = s;\r
+          attlistDeclHandler(handlerArg, declElementType->name,\r
+                             declAttributeId->name, declAttributeType,\r
+                             attVal,\r
+                             role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);\r
+          poolClear(&tempPool);\r
+          handleDefault = XML_FALSE;\r
+        }\r
+      }\r
+      break;\r
+    case XML_ROLE_ENTITY_VALUE:\r
+      if (dtd->keepProcessing) {\r
+        enum XML_Error result = storeEntityValue(parser, enc,\r
+                                            s + enc->minBytesPerChar,\r
+                                            next - enc->minBytesPerChar);\r
+        if (declEntity) {\r
+          declEntity->textPtr = poolStart(&dtd->entityValuePool);\r
+          declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));\r
+          poolFinish(&dtd->entityValuePool);\r
+          if (entityDeclHandler) {\r
+            *eventEndPP = s;\r
+            entityDeclHandler(handlerArg,\r
+                              declEntity->name,\r
+                              declEntity->is_param,\r
+                              declEntity->textPtr,\r
+                              declEntity->textLen,\r
+                              curBase, 0, 0, 0);\r
+            handleDefault = XML_FALSE;\r
+          }\r
+        }\r
+        else\r
+          poolDiscard(&dtd->entityValuePool);\r
+        if (result != XML_ERROR_NONE)\r
+          return result;\r
+      }\r
+      break;\r
+    case XML_ROLE_DOCTYPE_SYSTEM_ID:\r
+#ifdef XML_DTD\r
+      useForeignDTD = XML_FALSE;\r
+#endif /* XML_DTD */\r
+      dtd->hasParamEntityRefs = XML_TRUE;\r
+      if (startDoctypeDeclHandler) {\r
+        doctypeSysid = poolStoreString(&tempPool, enc,\r
+                                       s + enc->minBytesPerChar,\r
+                                       next - enc->minBytesPerChar);\r
+        if (doctypeSysid == NULL)\r
+          return XML_ERROR_NO_MEMORY;\r
+        poolFinish(&tempPool);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+#ifdef XML_DTD\r
+      else\r
+        /* use externalSubsetName to make doctypeSysid non-NULL\r
+           for the case where no startDoctypeDeclHandler is set */\r
+        doctypeSysid = externalSubsetName;\r
+#endif /* XML_DTD */\r
+      if (!dtd->standalone\r
+#ifdef XML_DTD\r
+          && !paramEntityParsing\r
+#endif /* XML_DTD */\r
+          && notStandaloneHandler\r
+          && !notStandaloneHandler(handlerArg))\r
+        return XML_ERROR_NOT_STANDALONE;\r
+#ifndef XML_DTD\r
+      break;\r
+#else /* XML_DTD */\r
+      if (!declEntity) {\r
+        declEntity = (ENTITY *)lookup(parser,\r
+                                      &dtd->paramEntities,\r
+                                      externalSubsetName,\r
+                                      sizeof(ENTITY));\r
+        if (!declEntity)\r
+          return XML_ERROR_NO_MEMORY;\r
+        declEntity->publicId = NULL;\r
+      }\r
+      /* fall through */\r
+#endif /* XML_DTD */\r
+    case XML_ROLE_ENTITY_SYSTEM_ID:\r
+      if (dtd->keepProcessing && declEntity) {\r
+        declEntity->systemId = poolStoreString(&dtd->pool, enc,\r
+                                               s + enc->minBytesPerChar,\r
+                                               next - enc->minBytesPerChar);\r
+        if (!declEntity->systemId)\r
+          return XML_ERROR_NO_MEMORY;\r
+        declEntity->base = curBase;\r
+        poolFinish(&dtd->pool);\r
+        if (entityDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_ENTITY_COMPLETE:\r
+      if (dtd->keepProcessing && declEntity && entityDeclHandler) {\r
+        *eventEndPP = s;\r
+        entityDeclHandler(handlerArg,\r
+                          declEntity->name,\r
+                          declEntity->is_param,\r
+                          0,0,\r
+                          declEntity->base,\r
+                          declEntity->systemId,\r
+                          declEntity->publicId,\r
+                          0);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_ENTITY_NOTATION_NAME:\r
+      if (dtd->keepProcessing && declEntity) {\r
+        declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);\r
+        if (!declEntity->notation)\r
+          return XML_ERROR_NO_MEMORY;\r
+        poolFinish(&dtd->pool);\r
+        if (unparsedEntityDeclHandler) {\r
+          *eventEndPP = s;\r
+          unparsedEntityDeclHandler(handlerArg,\r
+                                    declEntity->name,\r
+                                    declEntity->base,\r
+                                    declEntity->systemId,\r
+                                    declEntity->publicId,\r
+                                    declEntity->notation);\r
+          handleDefault = XML_FALSE;\r
+        }\r
+        else if (entityDeclHandler) {\r
+          *eventEndPP = s;\r
+          entityDeclHandler(handlerArg,\r
+                            declEntity->name,\r
+                            0,0,0,\r
+                            declEntity->base,\r
+                            declEntity->systemId,\r
+                            declEntity->publicId,\r
+                            declEntity->notation);\r
+          handleDefault = XML_FALSE;\r
+        }\r
+      }\r
+      break;\r
+    case XML_ROLE_GENERAL_ENTITY_NAME:\r
+      {\r
+        if (XmlPredefinedEntityName(enc, s, next)) {\r
+          declEntity = NULL;\r
+          break;\r
+        }\r
+        if (dtd->keepProcessing) {\r
+          const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);\r
+          if (!name)\r
+            return XML_ERROR_NO_MEMORY;\r
+          declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,\r
+                                        sizeof(ENTITY));\r
+          if (!declEntity)\r
+            return XML_ERROR_NO_MEMORY;\r
+          if (declEntity->name != name) {\r
+            poolDiscard(&dtd->pool);\r
+            declEntity = NULL;\r
+          }\r
+          else {\r
+            poolFinish(&dtd->pool);\r
+            declEntity->publicId = NULL;\r
+            declEntity->is_param = XML_FALSE;\r
+            /* if we have a parent parser or are reading an internal parameter\r
+               entity, then the entity declaration is not considered "internal"\r
+            */\r
+            declEntity->is_internal = !(parentParser || openInternalEntities);\r
+            if (entityDeclHandler)\r
+              handleDefault = XML_FALSE;\r
+          }\r
+        }\r
+        else {\r
+          poolDiscard(&dtd->pool);\r
+          declEntity = NULL;\r
+        }\r
+      }\r
+      break;\r
+    case XML_ROLE_PARAM_ENTITY_NAME:\r
+#ifdef XML_DTD\r
+      if (dtd->keepProcessing) {\r
+        const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);\r
+        if (!name)\r
+          return XML_ERROR_NO_MEMORY;\r
+        declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,\r
+                                           name, sizeof(ENTITY));\r
+        if (!declEntity)\r
+          return XML_ERROR_NO_MEMORY;\r
+        if (declEntity->name != name) {\r
+          poolDiscard(&dtd->pool);\r
+          declEntity = NULL;\r
+        }\r
+        else {\r
+          poolFinish(&dtd->pool);\r
+          declEntity->publicId = NULL;\r
+          declEntity->is_param = XML_TRUE;\r
+          /* if we have a parent parser or are reading an internal parameter\r
+             entity, then the entity declaration is not considered "internal"\r
+          */\r
+          declEntity->is_internal = !(parentParser || openInternalEntities);\r
+          if (entityDeclHandler)\r
+            handleDefault = XML_FALSE;\r
+        }\r
+      }\r
+      else {\r
+        poolDiscard(&dtd->pool);\r
+        declEntity = NULL;\r
+      }\r
+#else /* not XML_DTD */\r
+      declEntity = NULL;\r
+#endif /* XML_DTD */\r
+      break;\r
+    case XML_ROLE_NOTATION_NAME:\r
+      declNotationPublicId = NULL;\r
+      declNotationName = NULL;\r
+      if (notationDeclHandler) {\r
+        declNotationName = poolStoreString(&tempPool, enc, s, next);\r
+        if (!declNotationName)\r
+          return XML_ERROR_NO_MEMORY;\r
+        poolFinish(&tempPool);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_NOTATION_PUBLIC_ID:\r
+      if (!XmlIsPublicId(enc, s, next, eventPP))\r
+        return XML_ERROR_PUBLICID;\r
+      if (declNotationName) {  /* means notationDeclHandler != NULL */\r
+        XML_Char *tem = poolStoreString(&tempPool,\r
+                                        enc,\r
+                                        s + enc->minBytesPerChar,\r
+                                        next - enc->minBytesPerChar);\r
+        if (!tem)\r
+          return XML_ERROR_NO_MEMORY;\r
+        normalizePublicId(tem);\r
+        declNotationPublicId = tem;\r
+        poolFinish(&tempPool);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_NOTATION_SYSTEM_ID:\r
+      if (declNotationName && notationDeclHandler) {\r
+        const XML_Char *systemId\r
+          = poolStoreString(&tempPool, enc,\r
+                            s + enc->minBytesPerChar,\r
+                            next - enc->minBytesPerChar);\r
+        if (!systemId)\r
+          return XML_ERROR_NO_MEMORY;\r
+        *eventEndPP = s;\r
+        notationDeclHandler(handlerArg,\r
+                            declNotationName,\r
+                            curBase,\r
+                            systemId,\r
+                            declNotationPublicId);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      poolClear(&tempPool);\r
+      break;\r
+    case XML_ROLE_NOTATION_NO_SYSTEM_ID:\r
+      if (declNotationPublicId && notationDeclHandler) {\r
+        *eventEndPP = s;\r
+        notationDeclHandler(handlerArg,\r
+                            declNotationName,\r
+                            curBase,\r
+                            0,\r
+                            declNotationPublicId);\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      poolClear(&tempPool);\r
+      break;\r
+    case XML_ROLE_ERROR:\r
+      switch (tok) {\r
+      case XML_TOK_PARAM_ENTITY_REF:\r
+        /* PE references in internal subset are\r
+           not allowed within declarations. */\r
+        return XML_ERROR_PARAM_ENTITY_REF;\r
+      case XML_TOK_XML_DECL:\r
+        return XML_ERROR_MISPLACED_XML_PI;\r
+      default:\r
+        return XML_ERROR_SYNTAX;\r
+      }\r
+#ifdef XML_DTD\r
+    case XML_ROLE_IGNORE_SECT:\r
+      {\r
+        enum XML_Error result;\r
+        if (defaultHandler)\r
+          reportDefault(parser, enc, s, next);\r
+        handleDefault = XML_FALSE;\r
+        result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore);\r
+        if (result != XML_ERROR_NONE)\r
+          return result;\r
+        else if (!next) {\r
+          processor = ignoreSectionProcessor;\r
+          return result;\r
+        }\r
+      }\r
+      break;\r
+#endif /* XML_DTD */\r
+    case XML_ROLE_GROUP_OPEN:\r
+      if (prologState.level >= groupSize) {\r
+        if (groupSize) {\r
+          char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);\r
+          if (temp == NULL)\r
+            return XML_ERROR_NO_MEMORY;\r
+          groupConnector = temp;\r
+          if (dtd->scaffIndex) {\r
+            int *temp = (int *)REALLOC(dtd->scaffIndex,\r
+                          groupSize * sizeof(int));\r
+            if (temp == NULL)\r
+              return XML_ERROR_NO_MEMORY;\r
+            dtd->scaffIndex = temp;\r
+          }\r
+        }\r
+        else {\r
+          groupConnector = (char *)MALLOC(groupSize = 32);\r
+          if (!groupConnector)\r
+            return XML_ERROR_NO_MEMORY;\r
+        }\r
+      }\r
+      groupConnector[prologState.level] = 0;\r
+      if (dtd->in_eldecl) {\r
+        int myindex = nextScaffoldPart(parser);\r
+        if (myindex < 0)\r
+          return XML_ERROR_NO_MEMORY;\r
+        dtd->scaffIndex[dtd->scaffLevel] = myindex;\r
+        dtd->scaffLevel++;\r
+        dtd->scaffold[myindex].type = XML_CTYPE_SEQ;\r
+        if (elementDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+    case XML_ROLE_GROUP_SEQUENCE:\r
+      if (groupConnector[prologState.level] == ASCII_PIPE)\r
+        return XML_ERROR_SYNTAX;\r
+      groupConnector[prologState.level] = ASCII_COMMA;\r
+      if (dtd->in_eldecl && elementDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_GROUP_CHOICE:\r
+      if (groupConnector[prologState.level] == ASCII_COMMA)\r
+        return XML_ERROR_SYNTAX;\r
+      if (dtd->in_eldecl\r
+          && !groupConnector[prologState.level]\r
+          && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type\r
+              != XML_CTYPE_MIXED)\r
+          ) {\r
+        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type\r
+            = XML_CTYPE_CHOICE;\r
+        if (elementDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      groupConnector[prologState.level] = ASCII_PIPE;\r
+      break;\r
+    case XML_ROLE_PARAM_ENTITY_REF:\r
+#ifdef XML_DTD\r
+    case XML_ROLE_INNER_PARAM_ENTITY_REF:\r
+      dtd->hasParamEntityRefs = XML_TRUE;\r
+      if (!paramEntityParsing)\r
+        dtd->keepProcessing = dtd->standalone;\r
+      else {\r
+        const XML_Char *name;\r
+        ENTITY *entity;\r
+        name = poolStoreString(&dtd->pool, enc,\r
+                                s + enc->minBytesPerChar,\r
+                                next - enc->minBytesPerChar);\r
+        if (!name)\r
+          return XML_ERROR_NO_MEMORY;\r
+        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);\r
+        poolDiscard(&dtd->pool);\r
+        /* first, determine if a check for an existing declaration is needed;\r
+           if yes, check that the entity exists, and that it is internal,\r
+           otherwise call the skipped entity handler\r
+        */\r
+        if (prologState.documentEntity &&\r
+            (dtd->standalone\r
+             ? !openInternalEntities\r
+             : !dtd->hasParamEntityRefs)) {\r
+          if (!entity)\r
+            return XML_ERROR_UNDEFINED_ENTITY;\r
+          else if (!entity->is_internal)\r
+            return XML_ERROR_ENTITY_DECLARED_IN_PE;\r
+        }\r
+        else if (!entity) {\r
+          dtd->keepProcessing = dtd->standalone;\r
+          /* cannot report skipped entities in declarations */\r
+          if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {\r
+            skippedEntityHandler(handlerArg, name, 1);\r
+            handleDefault = XML_FALSE;\r
+          }\r
+          break;\r
+        }\r
+        if (entity->open)\r
+          return XML_ERROR_RECURSIVE_ENTITY_REF;\r
+        if (entity->textPtr) {\r
+          enum XML_Error result;\r
+          XML_Bool betweenDecl =\r
+            (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);\r
+          result = processInternalEntity(parser, entity, betweenDecl);\r
+          if (result != XML_ERROR_NONE)\r
+            return result;\r
+          handleDefault = XML_FALSE;\r
+          break;\r
+        }\r
+        if (externalEntityRefHandler) {\r
+          dtd->paramEntityRead = XML_FALSE;\r
+          entity->open = XML_TRUE;\r
+          if (!externalEntityRefHandler(externalEntityRefHandlerArg,\r
+                                        0,\r
+                                        entity->base,\r
+                                        entity->systemId,\r
+                                        entity->publicId)) {\r
+            entity->open = XML_FALSE;\r
+            return XML_ERROR_EXTERNAL_ENTITY_HANDLING;\r
+          }\r
+          entity->open = XML_FALSE;\r
+          handleDefault = XML_FALSE;\r
+          if (!dtd->paramEntityRead) {\r
+            dtd->keepProcessing = dtd->standalone;\r
+            break;\r
+          }\r
+        }\r
+        else {\r
+          dtd->keepProcessing = dtd->standalone;\r
+          break;\r
+        }\r
+      }\r
+#endif /* XML_DTD */\r
+      if (!dtd->standalone &&\r
+          notStandaloneHandler &&\r
+          !notStandaloneHandler(handlerArg))\r
+        return XML_ERROR_NOT_STANDALONE;\r
+      break;\r
+\r
+    /* Element declaration stuff */\r
+\r
+    case XML_ROLE_ELEMENT_NAME:\r
+      if (elementDeclHandler) {\r
+        declElementType = getElementType(parser, enc, s, next);\r
+        if (!declElementType)\r
+          return XML_ERROR_NO_MEMORY;\r
+        dtd->scaffLevel = 0;\r
+        dtd->scaffCount = 0;\r
+        dtd->in_eldecl = XML_TRUE;\r
+        handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+\r
+    case XML_ROLE_CONTENT_ANY:\r
+    case XML_ROLE_CONTENT_EMPTY:\r
+      if (dtd->in_eldecl) {\r
+        if (elementDeclHandler) {\r
+          XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));\r
+          if (!content)\r
+            return XML_ERROR_NO_MEMORY;\r
+          content->quant = XML_CQUANT_NONE;\r
+          content->name = NULL;\r
+          content->numchildren = 0;\r
+          content->children = NULL;\r
+          content->type = ((role == XML_ROLE_CONTENT_ANY) ?\r
+                           XML_CTYPE_ANY :\r
+                           XML_CTYPE_EMPTY);\r
+          *eventEndPP = s;\r
+          elementDeclHandler(handlerArg, declElementType->name, content);\r
+          handleDefault = XML_FALSE;\r
+        }\r
+        dtd->in_eldecl = XML_FALSE;\r
+      }\r
+      break;\r
+\r
+    case XML_ROLE_CONTENT_PCDATA:\r
+      if (dtd->in_eldecl) {\r
+        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type\r
+            = XML_CTYPE_MIXED;\r
+        if (elementDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+\r
+    case XML_ROLE_CONTENT_ELEMENT:\r
+      quant = XML_CQUANT_NONE;\r
+      goto elementContent;\r
+    case XML_ROLE_CONTENT_ELEMENT_OPT:\r
+      quant = XML_CQUANT_OPT;\r
+      goto elementContent;\r
+    case XML_ROLE_CONTENT_ELEMENT_REP:\r
+      quant = XML_CQUANT_REP;\r
+      goto elementContent;\r
+    case XML_ROLE_CONTENT_ELEMENT_PLUS:\r
+      quant = XML_CQUANT_PLUS;\r
+    elementContent:\r
+      if (dtd->in_eldecl) {\r
+        ELEMENT_TYPE *el;\r
+        const XML_Char *name;\r
+        int nameLen;\r
+        const char *nxt = (quant == XML_CQUANT_NONE\r
+                           ? next\r
+                           : next - enc->minBytesPerChar);\r
+        int myindex = nextScaffoldPart(parser);\r
+        if (myindex < 0)\r
+          return XML_ERROR_NO_MEMORY;\r
+        dtd->scaffold[myindex].type = XML_CTYPE_NAME;\r
+        dtd->scaffold[myindex].quant = quant;\r
+        el = getElementType(parser, enc, s, nxt);\r
+        if (!el)\r
+          return XML_ERROR_NO_MEMORY;\r
+        name = el->name;\r
+        dtd->scaffold[myindex].name = name;\r
+        nameLen = 0;\r
+        for (; name[nameLen++]; );\r
+        dtd->contentStringLen +=  nameLen;\r
+        if (elementDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+      }\r
+      break;\r
+\r
+    case XML_ROLE_GROUP_CLOSE:\r
+      quant = XML_CQUANT_NONE;\r
+      goto closeGroup;\r
+    case XML_ROLE_GROUP_CLOSE_OPT:\r
+      quant = XML_CQUANT_OPT;\r
+      goto closeGroup;\r
+    case XML_ROLE_GROUP_CLOSE_REP:\r
+      quant = XML_CQUANT_REP;\r
+      goto closeGroup;\r
+    case XML_ROLE_GROUP_CLOSE_PLUS:\r
+      quant = XML_CQUANT_PLUS;\r
+    closeGroup:\r
+      if (dtd->in_eldecl) {\r
+        if (elementDeclHandler)\r
+          handleDefault = XML_FALSE;\r
+        dtd->scaffLevel--;\r
+        dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;\r
+        if (dtd->scaffLevel == 0) {\r
+          if (!handleDefault) {\r
+            XML_Content *model = build_model(parser);\r
+            if (!model)\r
+              return XML_ERROR_NO_MEMORY;\r
+            *eventEndPP = s;\r
+            elementDeclHandler(handlerArg, declElementType->name, model);\r
+          }\r
+          dtd->in_eldecl = XML_FALSE;\r
+          dtd->contentStringLen = 0;\r
+        }\r
+      }\r
+      break;\r
+      /* End element declaration stuff */\r
+\r
+    case XML_ROLE_PI:\r
+      if (!reportProcessingInstruction(parser, enc, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_COMMENT:\r
+      if (!reportComment(parser, enc, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_NONE:\r
+      switch (tok) {\r
+      case XML_TOK_BOM:\r
+        handleDefault = XML_FALSE;\r
+        break;\r
+      }\r
+      break;\r
+    case XML_ROLE_DOCTYPE_NONE:\r
+      if (startDoctypeDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_ENTITY_NONE:\r
+      if (dtd->keepProcessing && entityDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_NOTATION_NONE:\r
+      if (notationDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_ATTLIST_NONE:\r
+      if (dtd->keepProcessing && attlistDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    case XML_ROLE_ELEMENT_NONE:\r
+      if (elementDeclHandler)\r
+        handleDefault = XML_FALSE;\r
+      break;\r
+    } /* end of big switch */\r
+\r
+    if (handleDefault && defaultHandler)\r
+      reportDefault(parser, enc, s, next);\r
+\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    case XML_FINISHED:\r
+      return XML_ERROR_ABORTED;\r
+    default:\r
+      s = next;\r
+      tok = XmlPrologTok(enc, s, end, &next);\r
+    }\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+epilogProcessor(XML_Parser parser,\r
+                const char *s,\r
+                const char *end,\r
+                const char **nextPtr)\r
+{\r
+  processor = epilogProcessor;\r
+  eventPtr = s;\r
+  for (;;) {\r
+    const char *next = NULL;\r
+    int tok = XmlPrologTok(encoding, s, end, &next);\r
+    eventEndPtr = next;\r
+    switch (tok) {\r
+    /* report partial linebreak - it might be the last token */\r
+    case -XML_TOK_PROLOG_S:\r
+      if (defaultHandler) {\r
+        reportDefault(parser, encoding, s, next);\r
+        if (ps_parsing == XML_FINISHED)\r
+          return XML_ERROR_ABORTED;\r
+      }\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    case XML_TOK_NONE:\r
+      *nextPtr = s;\r
+      return XML_ERROR_NONE;\r
+    case XML_TOK_PROLOG_S:\r
+      if (defaultHandler)\r
+        reportDefault(parser, encoding, s, next);\r
+      break;\r
+    case XML_TOK_PI:\r
+      if (!reportProcessingInstruction(parser, encoding, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    case XML_TOK_COMMENT:\r
+      if (!reportComment(parser, encoding, s, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    case XML_TOK_INVALID:\r
+      eventPtr = next;\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_PARTIAL:\r
+      if (!ps_finalBuffer) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_UNCLOSED_TOKEN;\r
+    case XML_TOK_PARTIAL_CHAR:\r
+      if (!ps_finalBuffer) {\r
+        *nextPtr = s;\r
+        return XML_ERROR_NONE;\r
+      }\r
+      return XML_ERROR_PARTIAL_CHAR;\r
+    default:\r
+      return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;\r
+    }\r
+    eventPtr = s = next;\r
+    switch (ps_parsing) {\r
+    case XML_SUSPENDED:\r
+      *nextPtr = next;\r
+      return XML_ERROR_NONE;\r
+    case XML_FINISHED:\r
+      return XML_ERROR_ABORTED;\r
+    default: ;\r
+    }\r
+  }\r
+}\r
+\r
+static enum XML_Error\r
+processInternalEntity(XML_Parser parser, ENTITY *entity,\r
+                      XML_Bool betweenDecl)\r
+{\r
+  const char *textStart, *textEnd;\r
+  const char *next;\r
+  enum XML_Error result;\r
+  OPEN_INTERNAL_ENTITY *openEntity;\r
+\r
+  if (freeInternalEntities) {\r
+    openEntity = freeInternalEntities;\r
+    freeInternalEntities = openEntity->next;\r
+  }\r
+  else {\r
+    openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY));\r
+    if (!openEntity)\r
+      return XML_ERROR_NO_MEMORY;\r
+  }\r
+  entity->open = XML_TRUE;\r
+  entity->processed = 0;\r
+  openEntity->next = openInternalEntities;\r
+  openInternalEntities = openEntity;\r
+  openEntity->entity = entity;\r
+  openEntity->startTagLevel = tagLevel;\r
+  openEntity->betweenDecl = betweenDecl;\r
+  openEntity->internalEventPtr = NULL;\r
+  openEntity->internalEventEndPtr = NULL;\r
+  textStart = (char *)entity->textPtr;\r
+  textEnd = (char *)(entity->textPtr + entity->textLen);\r
+\r
+#ifdef XML_DTD\r
+  if (entity->is_param) {\r
+    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);\r
+    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,\r
+                      next, &next, XML_FALSE);\r
+  }\r
+  else\r
+#endif /* XML_DTD */\r
+    result = doContent(parser, tagLevel, internalEncoding, textStart,\r
+                       textEnd, &next, XML_FALSE);\r
+\r
+  if (result == XML_ERROR_NONE) {\r
+    if (textEnd != next && ps_parsing == XML_SUSPENDED) {\r
+      entity->processed = (int)(next - textStart);\r
+      processor = internalEntityProcessor;\r
+    }\r
+    else {\r
+      entity->open = XML_FALSE;\r
+      openInternalEntities = openEntity->next;\r
+      /* put openEntity back in list of free instances */\r
+      openEntity->next = freeInternalEntities;\r
+      freeInternalEntities = openEntity;\r
+    }\r
+  }\r
+  return result;\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+internalEntityProcessor(XML_Parser parser,\r
+                        const char *s,\r
+                        const char *end,\r
+                        const char **nextPtr)\r
+{\r
+  ENTITY *entity;\r
+  const char *textStart, *textEnd;\r
+  const char *next;\r
+  enum XML_Error result;\r
+  OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities;\r
+  if (!openEntity)\r
+    return XML_ERROR_UNEXPECTED_STATE;\r
+\r
+  entity = openEntity->entity;\r
+  textStart = ((char *)entity->textPtr) + entity->processed;\r
+  textEnd = (char *)(entity->textPtr + entity->textLen);\r
+\r
+#ifdef XML_DTD\r
+  if (entity->is_param) {\r
+    int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);\r
+    result = doProlog(parser, internalEncoding, textStart, textEnd, tok,\r
+                      next, &next, XML_FALSE);\r
+  }\r
+  else\r
+#endif /* XML_DTD */\r
+    result = doContent(parser, openEntity->startTagLevel, internalEncoding,\r
+                       textStart, textEnd, &next, XML_FALSE);\r
+\r
+  if (result != XML_ERROR_NONE)\r
+    return result;\r
+  else if (textEnd != next && ps_parsing == XML_SUSPENDED) {\r
+    entity->processed = (int)(next - (char *)entity->textPtr);\r
+    return result;\r
+  }\r
+  else {\r
+    entity->open = XML_FALSE;\r
+    openInternalEntities = openEntity->next;\r
+    /* put openEntity back in list of free instances */\r
+    openEntity->next = freeInternalEntities;\r
+    freeInternalEntities = openEntity;\r
+  }\r
+\r
+#ifdef XML_DTD\r
+  if (entity->is_param) {\r
+    int tok;\r
+    processor = prologProcessor;\r
+    tok = XmlPrologTok(encoding, s, end, &next);\r
+    return doProlog(parser, encoding, s, end, tok, next, nextPtr,\r
+                    (XML_Bool)!ps_finalBuffer);\r
+  }\r
+  else\r
+#endif /* XML_DTD */\r
+  {\r
+    processor = contentProcessor;\r
+    /* see externalEntityContentProcessor vs contentProcessor */\r
+    return doContent(parser, parentParser ? 1 : 0, encoding, s, end,\r
+                     nextPtr, (XML_Bool)!ps_finalBuffer);\r
+  }\r
+}\r
+\r
+static enum XML_Error PTRCALL\r
+errorProcessor(XML_Parser parser,\r
+               const char *s,\r
+               const char *end,\r
+               const char **nextPtr)\r
+{\r
+  return errorCode;\r
+}\r
+\r
+static enum XML_Error\r
+storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,\r
+                    const char *ptr, const char *end,\r
+                    STRING_POOL *pool)\r
+{\r
+  enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr,\r
+                                               end, pool);\r
+  if (result)\r
+    return result;\r
+  if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)\r
+    poolChop(pool);\r
+  if (!poolAppendChar(pool, XML_T('\0')))\r
+    return XML_ERROR_NO_MEMORY;\r
+  return XML_ERROR_NONE;\r
+}\r
+\r
+static enum XML_Error\r
+appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,\r
+                     const char *ptr, const char *end,\r
+                     STRING_POOL *pool)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  for (;;) {\r
+    const char *next;\r
+    int tok = XmlAttributeValueTok(enc, ptr, end, &next);\r
+    switch (tok) {\r
+    case XML_TOK_NONE:\r
+      return XML_ERROR_NONE;\r
+    case XML_TOK_INVALID:\r
+      if (enc == encoding)\r
+        eventPtr = next;\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_PARTIAL:\r
+      if (enc == encoding)\r
+        eventPtr = ptr;\r
+      return XML_ERROR_INVALID_TOKEN;\r
+    case XML_TOK_CHAR_REF:\r
+      {\r
+        XML_Char buf[XML_ENCODE_MAX];\r
+        int i;\r
+        int n = XmlCharRefNumber(enc, ptr);\r
+        if (n < 0) {\r
+          if (enc == encoding)\r
+            eventPtr = ptr;\r
+          return XML_ERROR_BAD_CHAR_REF;\r
+        }\r
+        if (!isCdata\r
+            && n == 0x20 /* space */\r
+            && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))\r
+          break;\r
+        n = XmlEncode(n, (ICHAR *)buf);\r
+        if (!n) {\r
+          if (enc == encoding)\r
+            eventPtr = ptr;\r
+          return XML_ERROR_BAD_CHAR_REF;\r
+        }\r
+        for (i = 0; i < n; i++) {\r
+          if (!poolAppendChar(pool, buf[i]))\r
+            return XML_ERROR_NO_MEMORY;\r
+        }\r
+      }\r
+      break;\r
+    case XML_TOK_DATA_CHARS:\r
+      if (!poolAppend(pool, enc, ptr, next))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    case XML_TOK_TRAILING_CR:\r
+      next = ptr + enc->minBytesPerChar;\r
+      /* fall through */\r
+    case XML_TOK_ATTRIBUTE_VALUE_S:\r
+    case XML_TOK_DATA_NEWLINE:\r
+      if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))\r
+        break;\r
+      if (!poolAppendChar(pool, 0x20))\r
+        return XML_ERROR_NO_MEMORY;\r
+      break;\r
+    case XML_TOK_ENTITY_REF:\r
+      {\r
+        const XML_Char *name;\r
+        ENTITY *entity;\r
+        char checkEntityDecl;\r
+        XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,\r
+                                              ptr + enc->minBytesPerChar,\r
+                                              next - enc->minBytesPerChar);\r
+        if (ch) {\r
+          if (!poolAppendChar(pool, ch))\r
+                return XML_ERROR_NO_MEMORY;\r
+          break;\r
+        }\r
+        name = poolStoreString(&temp2Pool, enc,\r
+                               ptr + enc->minBytesPerChar,\r
+                               next - enc->minBytesPerChar);\r
+        if (!name)\r
+          return XML_ERROR_NO_MEMORY;\r
+        entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);\r
+        poolDiscard(&temp2Pool);\r
+        /* First, determine if a check for an existing declaration is needed;\r
+           if yes, check that the entity exists, and that it is internal.\r
+        */\r
+        if (pool == &dtd->pool)  /* are we called from prolog? */\r
+          checkEntityDecl =\r
+#ifdef XML_DTD\r
+              prologState.documentEntity &&\r
+#endif /* XML_DTD */\r
+              (dtd->standalone\r
+               ? !openInternalEntities\r
+               : !dtd->hasParamEntityRefs);\r
+        else /* if (pool == &tempPool): we are called from content */\r
+          checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;\r
+        if (checkEntityDecl) {\r
+          if (!entity)\r
+            return XML_ERROR_UNDEFINED_ENTITY;\r
+          else if (!entity->is_internal)\r
+            return XML_ERROR_ENTITY_DECLARED_IN_PE;\r
+        }\r
+        else if (!entity) {\r
+          /* Cannot report skipped entity here - see comments on\r
+             skippedEntityHandler.\r
+          if (skippedEntityHandler)\r
+            skippedEntityHandler(handlerArg, name, 0);\r
+          */\r
+          /* Cannot call the default handler because this would be\r
+             out of sync with the call to the startElementHandler.\r
+          if ((pool == &tempPool) && defaultHandler)\r
+            reportDefault(parser, enc, ptr, next);\r
+          */\r
+          break;\r
+        }\r
+        if (entity->open) {\r
+          if (enc == encoding)\r
+            eventPtr = ptr;\r
+          return XML_ERROR_RECURSIVE_ENTITY_REF;\r
+        }\r
+        if (entity->notation) {\r
+          if (enc == encoding)\r
+            eventPtr = ptr;\r
+          return XML_ERROR_BINARY_ENTITY_REF;\r
+        }\r
+        if (!entity->textPtr) {\r
+          if (enc == encoding)\r
+            eventPtr = ptr;\r
+          return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;\r
+        }\r
+        else {\r
+          enum XML_Error result;\r
+          const XML_Char *textEnd = entity->textPtr + entity->textLen;\r
+          entity->open = XML_TRUE;\r
+          result = appendAttributeValue(parser, internalEncoding, isCdata,\r
+                                        (char *)entity->textPtr,\r
+                                        (char *)textEnd, pool);\r
+          entity->open = XML_FALSE;\r
+          if (result)\r
+            return result;\r
+        }\r
+      }\r
+      break;\r
+    default:\r
+      if (enc == encoding)\r
+        eventPtr = ptr;\r
+      return XML_ERROR_UNEXPECTED_STATE;\r
+    }\r
+    ptr = next;\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+static enum XML_Error\r
+storeEntityValue(XML_Parser parser,\r
+                 const ENCODING *enc,\r
+                 const char *entityTextPtr,\r
+                 const char *entityTextEnd)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  STRING_POOL *pool = &(dtd->entityValuePool);\r
+  enum XML_Error result = XML_ERROR_NONE;\r
+#ifdef XML_DTD\r
+  int oldInEntityValue = prologState.inEntityValue;\r
+  prologState.inEntityValue = 1;\r
+#endif /* XML_DTD */\r
+  /* never return Null for the value argument in EntityDeclHandler,\r
+     since this would indicate an external entity; therefore we\r
+     have to make sure that entityValuePool.start is not null */\r
+  if (!pool->blocks) {\r
+    if (!poolGrow(pool))\r
+      return XML_ERROR_NO_MEMORY;\r
+  }\r
+\r
+  for (;;) {\r
+    const char *next;\r
+    int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);\r
+    switch (tok) {\r
+    case XML_TOK_PARAM_ENTITY_REF:\r
+#ifdef XML_DTD\r
+      if (isParamEntity || enc != encoding) {\r
+        const XML_Char *name;\r
+        ENTITY *entity;\r
+        name = poolStoreString(&tempPool, enc,\r
+                               entityTextPtr + enc->minBytesPerChar,\r
+                               next - enc->minBytesPerChar);\r
+        if (!name) {\r
+          result = XML_ERROR_NO_MEMORY;\r
+          goto endEntityValue;\r
+        }\r
+        entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);\r
+        poolDiscard(&tempPool);\r
+        if (!entity) {\r
+          /* not a well-formedness error - see XML 1.0: WFC Entity Declared */\r
+          /* cannot report skipped entity here - see comments on\r
+             skippedEntityHandler\r
+          if (skippedEntityHandler)\r
+            skippedEntityHandler(handlerArg, name, 0);\r
+          */\r
+          dtd->keepProcessing = dtd->standalone;\r
+          goto endEntityValue;\r
+        }\r
+        if (entity->open) {\r
+          if (enc == encoding)\r
+            eventPtr = entityTextPtr;\r
+          result = XML_ERROR_RECURSIVE_ENTITY_REF;\r
+          goto endEntityValue;\r
+        }\r
+        if (entity->systemId) {\r
+          if (externalEntityRefHandler) {\r
+            dtd->paramEntityRead = XML_FALSE;\r
+            entity->open = XML_TRUE;\r
+            if (!externalEntityRefHandler(externalEntityRefHandlerArg,\r
+                                          0,\r
+                                          entity->base,\r
+                                          entity->systemId,\r
+                                          entity->publicId)) {\r
+              entity->open = XML_FALSE;\r
+              result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;\r
+              goto endEntityValue;\r
+            }\r
+            entity->open = XML_FALSE;\r
+            if (!dtd->paramEntityRead)\r
+              dtd->keepProcessing = dtd->standalone;\r
+          }\r
+          else\r
+            dtd->keepProcessing = dtd->standalone;\r
+        }\r
+        else {\r
+          entity->open = XML_TRUE;\r
+          result = storeEntityValue(parser,\r
+                                    internalEncoding,\r
+                                    (char *)entity->textPtr,\r
+                                    (char *)(entity->textPtr\r
+                                             + entity->textLen));\r
+          entity->open = XML_FALSE;\r
+          if (result)\r
+            goto endEntityValue;\r
+        }\r
+        break;\r
+      }\r
+#endif /* XML_DTD */\r
+      /* In the internal subset, PE references are not legal\r
+         within markup declarations, e.g entity values in this case. */\r
+      eventPtr = entityTextPtr;\r
+      result = XML_ERROR_PARAM_ENTITY_REF;\r
+      goto endEntityValue;\r
+    case XML_TOK_NONE:\r
+      result = XML_ERROR_NONE;\r
+      goto endEntityValue;\r
+    case XML_TOK_ENTITY_REF:\r
+    case XML_TOK_DATA_CHARS:\r
+      if (!poolAppend(pool, enc, entityTextPtr, next)) {\r
+        result = XML_ERROR_NO_MEMORY;\r
+        goto endEntityValue;\r
+      }\r
+      break;\r
+    case XML_TOK_TRAILING_CR:\r
+      next = entityTextPtr + enc->minBytesPerChar;\r
+      /* fall through */\r
+    case XML_TOK_DATA_NEWLINE:\r
+      if (pool->end == pool->ptr && !poolGrow(pool)) {\r
+              result = XML_ERROR_NO_MEMORY;\r
+        goto endEntityValue;\r
+      }\r
+      *(pool->ptr)++ = 0xA;\r
+      break;\r
+    case XML_TOK_CHAR_REF:\r
+      {\r
+        XML_Char buf[XML_ENCODE_MAX];\r
+        int i;\r
+        int n = XmlCharRefNumber(enc, entityTextPtr);\r
+        if (n < 0) {\r
+          if (enc == encoding)\r
+            eventPtr = entityTextPtr;\r
+          result = XML_ERROR_BAD_CHAR_REF;\r
+          goto endEntityValue;\r
+        }\r
+        n = XmlEncode(n, (ICHAR *)buf);\r
+        if (!n) {\r
+          if (enc == encoding)\r
+            eventPtr = entityTextPtr;\r
+          result = XML_ERROR_BAD_CHAR_REF;\r
+          goto endEntityValue;\r
+        }\r
+        for (i = 0; i < n; i++) {\r
+          if (pool->end == pool->ptr && !poolGrow(pool)) {\r
+            result = XML_ERROR_NO_MEMORY;\r
+            goto endEntityValue;\r
+          }\r
+          *(pool->ptr)++ = buf[i];\r
+        }\r
+      }\r
+      break;\r
+    case XML_TOK_PARTIAL:\r
+      if (enc == encoding)\r
+        eventPtr = entityTextPtr;\r
+      result = XML_ERROR_INVALID_TOKEN;\r
+      goto endEntityValue;\r
+    case XML_TOK_INVALID:\r
+      if (enc == encoding)\r
+        eventPtr = next;\r
+      result = XML_ERROR_INVALID_TOKEN;\r
+      goto endEntityValue;\r
+    default:\r
+      if (enc == encoding)\r
+        eventPtr = entityTextPtr;\r
+      result = XML_ERROR_UNEXPECTED_STATE;\r
+      goto endEntityValue;\r
+    }\r
+    entityTextPtr = next;\r
+  }\r
+endEntityValue:\r
+#ifdef XML_DTD\r
+  prologState.inEntityValue = oldInEntityValue;\r
+#endif /* XML_DTD */\r
+  return result;\r
+}\r
+\r
+static void FASTCALL\r
+normalizeLines(XML_Char *s)\r
+{\r
+  XML_Char *p;\r
+  for (;; s++) {\r
+    if (*s == XML_T('\0'))\r
+      return;\r
+    if (*s == 0xD)\r
+      break;\r
+  }\r
+  p = s;\r
+  do {\r
+    if (*s == 0xD) {\r
+      *p++ = 0xA;\r
+      if (*++s == 0xA)\r
+        s++;\r
+    }\r
+    else\r
+      *p++ = *s++;\r
+  } while (*s);\r
+  *p = XML_T('\0');\r
+}\r
+\r
+static int\r
+reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,\r
+                            const char *start, const char *end)\r
+{\r
+  const XML_Char *target;\r
+  XML_Char *data;\r
+  const char *tem;\r
+  if (!processingInstructionHandler) {\r
+    if (defaultHandler)\r
+      reportDefault(parser, enc, start, end);\r
+    return 1;\r
+  }\r
+  start += enc->minBytesPerChar * 2;\r
+  tem = start + XmlNameLength(enc, start);\r
+  target = poolStoreString(&tempPool, enc, start, tem);\r
+  if (!target)\r
+    return 0;\r
+  poolFinish(&tempPool);\r
+  data = poolStoreString(&tempPool, enc,\r
+                        XmlSkipS(enc, tem),\r
+                        end - enc->minBytesPerChar*2);\r
+  if (!data)\r
+    return 0;\r
+  normalizeLines(data);\r
+  processingInstructionHandler(handlerArg, target, data);\r
+  poolClear(&tempPool);\r
+  return 1;\r
+}\r
+\r
+static int\r
+reportComment(XML_Parser parser, const ENCODING *enc,\r
+              const char *start, const char *end)\r
+{\r
+  XML_Char *data;\r
+  if (!commentHandler) {\r
+    if (defaultHandler)\r
+      reportDefault(parser, enc, start, end);\r
+    return 1;\r
+  }\r
+  data = poolStoreString(&tempPool,\r
+                         enc,\r
+                         start + enc->minBytesPerChar * 4,\r
+                         end - enc->minBytesPerChar * 3);\r
+  if (!data)\r
+    return 0;\r
+  normalizeLines(data);\r
+  commentHandler(handlerArg, data);\r
+  poolClear(&tempPool);\r
+  return 1;\r
+}\r
+\r
+static void\r
+reportDefault(XML_Parser parser, const ENCODING *enc,\r
+              const char *s, const char *end)\r
+{\r
+  if (MUST_CONVERT(enc, s)) {\r
+    const char **eventPP;\r
+    const char **eventEndPP;\r
+    if (enc == encoding) {\r
+      eventPP = &eventPtr;\r
+      eventEndPP = &eventEndPtr;\r
+    }\r
+    else {\r
+      eventPP = &(openInternalEntities->internalEventPtr);\r
+      eventEndPP = &(openInternalEntities->internalEventEndPtr);\r
+    }\r
+    do {\r
+      ICHAR *dataPtr = (ICHAR *)dataBuf;\r
+      XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);\r
+      *eventEndPP = s;\r
+      defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));\r
+      *eventPP = s;\r
+    } while (s != end);\r
+  }\r
+  else\r
+    defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));\r
+}\r
+\r
+\r
+static int\r
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,\r
+                XML_Bool isId, const XML_Char *value, XML_Parser parser)\r
+{\r
+  DEFAULT_ATTRIBUTE *att;\r
+  if (value || isId) {\r
+    /* The handling of default attributes gets messed up if we have\r
+       a default which duplicates a non-default. */\r
+    int i;\r
+    for (i = 0; i < type->nDefaultAtts; i++)\r
+      if (attId == type->defaultAtts[i].id)\r
+        return 1;\r
+    if (isId && !type->idAtt && !attId->xmlns)\r
+      type->idAtt = attId;\r
+  }\r
+  if (type->nDefaultAtts == type->allocDefaultAtts) {\r
+    if (type->allocDefaultAtts == 0) {\r
+      type->allocDefaultAtts = 8;\r
+      type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts\r
+                            * sizeof(DEFAULT_ATTRIBUTE));\r
+      if (!type->defaultAtts)\r
+        return 0;\r
+    }\r
+    else {\r
+      DEFAULT_ATTRIBUTE *temp;\r
+      int count = type->allocDefaultAtts * 2;\r
+      temp = (DEFAULT_ATTRIBUTE *)\r
+        REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));\r
+      if (temp == NULL)\r
+        return 0;\r
+      type->allocDefaultAtts = count;\r
+      type->defaultAtts = temp;\r
+    }\r
+  }\r
+  att = type->defaultAtts + type->nDefaultAtts;\r
+  att->id = attId;\r
+  att->value = value;\r
+  att->isCdata = isCdata;\r
+  if (!isCdata)\r
+    attId->maybeTokenized = XML_TRUE;\r
+  type->nDefaultAtts += 1;\r
+  return 1;\r
+}\r
+\r
+static int\r
+setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  const XML_Char *name;\r
+  for (name = elementType->name; *name; name++) {\r
+    if (*name == XML_T(ASCII_COLON)) {\r
+      PREFIX *prefix;\r
+      const XML_Char *s;\r
+      for (s = elementType->name; s != name; s++) {\r
+        if (!poolAppendChar(&dtd->pool, *s))\r
+          return 0;\r
+      }\r
+      if (!poolAppendChar(&dtd->pool, XML_T('\0')))\r
+        return 0;\r
+      prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),\r
+                                sizeof(PREFIX));\r
+      if (!prefix)\r
+        return 0;\r
+      if (prefix->name == poolStart(&dtd->pool))\r
+        poolFinish(&dtd->pool);\r
+      else\r
+        poolDiscard(&dtd->pool);\r
+      elementType->prefix = prefix;\r
+\r
+    }\r
+  }\r
+  return 1;\r
+}\r
+\r
+static ATTRIBUTE_ID *\r
+getAttributeId(XML_Parser parser, const ENCODING *enc,\r
+               const char *start, const char *end)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  ATTRIBUTE_ID *id;\r
+  const XML_Char *name;\r
+  if (!poolAppendChar(&dtd->pool, XML_T('\0')))\r
+    return NULL;\r
+  name = poolStoreString(&dtd->pool, enc, start, end);\r
+  if (!name)\r
+    return NULL;\r
+  /* skip quotation mark - its storage will be re-used (like in name[-1]) */\r
+  ++name;\r
+  id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));\r
+  if (!id)\r
+    return NULL;\r
+  if (id->name != name)\r
+    poolDiscard(&dtd->pool);\r
+  else {\r
+    poolFinish(&dtd->pool);\r
+    if (!ns)\r
+      ;\r
+    else if (name[0] == XML_T(ASCII_x)\r
+        && name[1] == XML_T(ASCII_m)\r
+        && name[2] == XML_T(ASCII_l)\r
+        && name[3] == XML_T(ASCII_n)\r
+        && name[4] == XML_T(ASCII_s)\r
+        && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {\r
+      if (name[5] == XML_T('\0'))\r
+        id->prefix = &dtd->defaultPrefix;\r
+      else\r
+        id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));\r
+      id->xmlns = XML_TRUE;\r
+    }\r
+    else {\r
+      int i;\r
+      for (i = 0; name[i]; i++) {\r
+        /* attributes without prefix are *not* in the default namespace */\r
+        if (name[i] == XML_T(ASCII_COLON)) {\r
+          int j;\r
+          for (j = 0; j < i; j++) {\r
+            if (!poolAppendChar(&dtd->pool, name[j]))\r
+              return NULL;\r
+          }\r
+          if (!poolAppendChar(&dtd->pool, XML_T('\0')))\r
+            return NULL;\r
+          id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),\r
+                                        sizeof(PREFIX));\r
+          if (id->prefix->name == poolStart(&dtd->pool))\r
+            poolFinish(&dtd->pool);\r
+          else\r
+            poolDiscard(&dtd->pool);\r
+          break;\r
+        }\r
+      }\r
+    }\r
+  }\r
+  return id;\r
+}\r
+\r
+#define CONTEXT_SEP XML_T(ASCII_FF)\r
+\r
+static const XML_Char *\r
+getContext(XML_Parser parser)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  HASH_TABLE_ITER iter;\r
+  XML_Bool needSep = XML_FALSE;\r
+\r
+  if (dtd->defaultPrefix.binding) {\r
+    int i;\r
+    int len;\r
+    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))\r
+      return NULL;\r
+    len = dtd->defaultPrefix.binding->uriLen;\r
+    if (namespaceSeparator)\r
+      len--;\r
+    for (i = 0; i < len; i++)\r
+      if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))\r
+        return NULL;\r
+    needSep = XML_TRUE;\r
+  }\r
+\r
+  hashTableIterInit(&iter, &(dtd->prefixes));\r
+  for (;;) {\r
+    int i;\r
+    int len;\r
+    const XML_Char *s;\r
+    PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);\r
+    if (!prefix)\r
+      break;\r
+    if (!prefix->binding)\r
+      continue;\r
+    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))\r
+      return NULL;\r
+    for (s = prefix->name; *s; s++)\r
+      if (!poolAppendChar(&tempPool, *s))\r
+        return NULL;\r
+    if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))\r
+      return NULL;\r
+    len = prefix->binding->uriLen;\r
+    if (namespaceSeparator)\r
+      len--;\r
+    for (i = 0; i < len; i++)\r
+      if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))\r
+        return NULL;\r
+    needSep = XML_TRUE;\r
+  }\r
+\r
+\r
+  hashTableIterInit(&iter, &(dtd->generalEntities));\r
+  for (;;) {\r
+    const XML_Char *s;\r
+    ENTITY *e = (ENTITY *)hashTableIterNext(&iter);\r
+    if (!e)\r
+      break;\r
+    if (!e->open)\r
+      continue;\r
+    if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))\r
+      return NULL;\r
+    for (s = e->name; *s; s++)\r
+      if (!poolAppendChar(&tempPool, *s))\r
+        return 0;\r
+    needSep = XML_TRUE;\r
+  }\r
+\r
+  if (!poolAppendChar(&tempPool, XML_T('\0')))\r
+    return NULL;\r
+  return tempPool.start;\r
+}\r
+\r
+static XML_Bool\r
+setContext(XML_Parser parser, const XML_Char *context)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  const XML_Char *s = context;\r
+\r
+  while (*context != XML_T('\0')) {\r
+    if (*s == CONTEXT_SEP || *s == XML_T('\0')) {\r
+      ENTITY *e;\r
+      if (!poolAppendChar(&tempPool, XML_T('\0')))\r
+        return XML_FALSE;\r
+      e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);\r
+      if (e)\r
+        e->open = XML_TRUE;\r
+      if (*s != XML_T('\0'))\r
+        s++;\r
+      context = s;\r
+      poolDiscard(&tempPool);\r
+    }\r
+    else if (*s == XML_T(ASCII_EQUALS)) {\r
+      PREFIX *prefix;\r
+      if (poolLength(&tempPool) == 0)\r
+        prefix = &dtd->defaultPrefix;\r
+      else {\r
+        if (!poolAppendChar(&tempPool, XML_T('\0')))\r
+          return XML_FALSE;\r
+        prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),\r
+                                  sizeof(PREFIX));\r
+        if (!prefix)\r
+          return XML_FALSE;\r
+        if (prefix->name == poolStart(&tempPool)) {\r
+          prefix->name = poolCopyString(&dtd->pool, prefix->name);\r
+          if (!prefix->name)\r
+            return XML_FALSE;\r
+        }\r
+        poolDiscard(&tempPool);\r
+      }\r
+      for (context = s + 1;\r
+           *context != CONTEXT_SEP && *context != XML_T('\0');\r
+           context++)\r
+        if (!poolAppendChar(&tempPool, *context))\r
+          return XML_FALSE;\r
+      if (!poolAppendChar(&tempPool, XML_T('\0')))\r
+        return XML_FALSE;\r
+      if (addBinding(parser, prefix, NULL, poolStart(&tempPool),\r
+                     &inheritedBindings) != XML_ERROR_NONE)\r
+        return XML_FALSE;\r
+      poolDiscard(&tempPool);\r
+      if (*context != XML_T('\0'))\r
+        ++context;\r
+      s = context;\r
+    }\r
+    else {\r
+      if (!poolAppendChar(&tempPool, *s))\r
+        return XML_FALSE;\r
+      s++;\r
+    }\r
+  }\r
+  return XML_TRUE;\r
+}\r
+\r
+static void FASTCALL\r
+normalizePublicId(XML_Char *publicId)\r
+{\r
+  XML_Char *p = publicId;\r
+  XML_Char *s;\r
+  for (s = publicId; *s; s++) {\r
+    switch (*s) {\r
+    case 0x20:\r
+    case 0xD:\r
+    case 0xA:\r
+      if (p != publicId && p[-1] != 0x20)\r
+        *p++ = 0x20;\r
+      break;\r
+    default:\r
+      *p++ = *s;\r
+    }\r
+  }\r
+  if (p != publicId && p[-1] == 0x20)\r
+    --p;\r
+  *p = XML_T('\0');\r
+}\r
+\r
+static DTD *\r
+dtdCreate(const XML_Memory_Handling_Suite *ms)\r
+{\r
+  DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));\r
+  if (p == NULL)\r
+    return p;\r
+  poolInit(&(p->pool), ms);\r
+  poolInit(&(p->entityValuePool), ms);\r
+  hashTableInit(&(p->generalEntities), ms);\r
+  hashTableInit(&(p->elementTypes), ms);\r
+  hashTableInit(&(p->attributeIds), ms);\r
+  hashTableInit(&(p->prefixes), ms);\r
+#ifdef XML_DTD\r
+  p->paramEntityRead = XML_FALSE;\r
+  hashTableInit(&(p->paramEntities), ms);\r
+#endif /* XML_DTD */\r
+  p->defaultPrefix.name = NULL;\r
+  p->defaultPrefix.binding = NULL;\r
+\r
+  p->in_eldecl = XML_FALSE;\r
+  p->scaffIndex = NULL;\r
+  p->scaffold = NULL;\r
+  p->scaffLevel = 0;\r
+  p->scaffSize = 0;\r
+  p->scaffCount = 0;\r
+  p->contentStringLen = 0;\r
+\r
+  p->keepProcessing = XML_TRUE;\r
+  p->hasParamEntityRefs = XML_FALSE;\r
+  p->standalone = XML_FALSE;\r
+  return p;\r
+}\r
+\r
+static void\r
+dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms)\r
+{\r
+  HASH_TABLE_ITER iter;\r
+  hashTableIterInit(&iter, &(p->elementTypes));\r
+  for (;;) {\r
+    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);\r
+    if (!e)\r
+      break;\r
+    if (e->allocDefaultAtts != 0)\r
+      ms->free_fcn(e->defaultAtts);\r
+  }\r
+  hashTableClear(&(p->generalEntities));\r
+#ifdef XML_DTD\r
+  p->paramEntityRead = XML_FALSE;\r
+  hashTableClear(&(p->paramEntities));\r
+#endif /* XML_DTD */\r
+  hashTableClear(&(p->elementTypes));\r
+  hashTableClear(&(p->attributeIds));\r
+  hashTableClear(&(p->prefixes));\r
+  poolClear(&(p->pool));\r
+  poolClear(&(p->entityValuePool));\r
+  p->defaultPrefix.name = NULL;\r
+  p->defaultPrefix.binding = NULL;\r
+\r
+  p->in_eldecl = XML_FALSE;\r
+\r
+  ms->free_fcn(p->scaffIndex);\r
+  p->scaffIndex = NULL;\r
+  ms->free_fcn(p->scaffold);\r
+  p->scaffold = NULL;\r
+\r
+  p->scaffLevel = 0;\r
+  p->scaffSize = 0;\r
+  p->scaffCount = 0;\r
+  p->contentStringLen = 0;\r
+\r
+  p->keepProcessing = XML_TRUE;\r
+  p->hasParamEntityRefs = XML_FALSE;\r
+  p->standalone = XML_FALSE;\r
+}\r
+\r
+static void\r
+dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)\r
+{\r
+  HASH_TABLE_ITER iter;\r
+  hashTableIterInit(&iter, &(p->elementTypes));\r
+  for (;;) {\r
+    ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);\r
+    if (!e)\r
+      break;\r
+    if (e->allocDefaultAtts != 0)\r
+      ms->free_fcn(e->defaultAtts);\r
+  }\r
+  hashTableDestroy(&(p->generalEntities));\r
+#ifdef XML_DTD\r
+  hashTableDestroy(&(p->paramEntities));\r
+#endif /* XML_DTD */\r
+  hashTableDestroy(&(p->elementTypes));\r
+  hashTableDestroy(&(p->attributeIds));\r
+  hashTableDestroy(&(p->prefixes));\r
+  poolDestroy(&(p->pool));\r
+  poolDestroy(&(p->entityValuePool));\r
+  if (isDocEntity) {\r
+    ms->free_fcn(p->scaffIndex);\r
+    ms->free_fcn(p->scaffold);\r
+  }\r
+  ms->free_fcn(p);\r
+}\r
+\r
+/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.\r
+   The new DTD has already been initialized.\r
+*/\r
+static int\r
+dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)\r
+{\r
+  HASH_TABLE_ITER iter;\r
+\r
+  /* Copy the prefix table. */\r
+\r
+  hashTableIterInit(&iter, &(oldDtd->prefixes));\r
+  for (;;) {\r
+    const XML_Char *name;\r
+    const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);\r
+    if (!oldP)\r
+      break;\r
+    name = poolCopyString(&(newDtd->pool), oldP->name);\r
+    if (!name)\r
+      return 0;\r
+    if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))\r
+      return 0;\r
+  }\r
+\r
+  hashTableIterInit(&iter, &(oldDtd->attributeIds));\r
+\r
+  /* Copy the attribute id table. */\r
+\r
+  for (;;) {\r
+    ATTRIBUTE_ID *newA;\r
+    const XML_Char *name;\r
+    const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);\r
+\r
+    if (!oldA)\r
+      break;\r
+    /* Remember to allocate the scratch byte before the name. */\r
+    if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))\r
+      return 0;\r
+    name = poolCopyString(&(newDtd->pool), oldA->name);\r
+    if (!name)\r
+      return 0;\r
+    ++name;\r
+    newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,\r
+                                  sizeof(ATTRIBUTE_ID));\r
+    if (!newA)\r
+      return 0;\r
+    newA->maybeTokenized = oldA->maybeTokenized;\r
+    if (oldA->prefix) {\r
+      newA->xmlns = oldA->xmlns;\r
+      if (oldA->prefix == &oldDtd->defaultPrefix)\r
+        newA->prefix = &newDtd->defaultPrefix;\r
+      else\r
+        newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),\r
+                                        oldA->prefix->name, 0);\r
+    }\r
+  }\r
+\r
+  /* Copy the element type table. */\r
+\r
+  hashTableIterInit(&iter, &(oldDtd->elementTypes));\r
+\r
+  for (;;) {\r
+    int i;\r
+    ELEMENT_TYPE *newE;\r
+    const XML_Char *name;\r
+    const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);\r
+    if (!oldE)\r
+      break;\r
+    name = poolCopyString(&(newDtd->pool), oldE->name);\r
+    if (!name)\r
+      return 0;\r
+    newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,\r
+                                  sizeof(ELEMENT_TYPE));\r
+    if (!newE)\r
+      return 0;\r
+    if (oldE->nDefaultAtts) {\r
+      newE->defaultAtts = (DEFAULT_ATTRIBUTE *)\r
+          ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));\r
+      if (!newE->defaultAtts) {\r
+        ms->free_fcn(newE);\r
+        return 0;\r
+      }\r
+    }\r
+    if (oldE->idAtt)\r
+      newE->idAtt = (ATTRIBUTE_ID *)\r
+          lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);\r
+    newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;\r
+    if (oldE->prefix)\r
+      newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),\r
+                                      oldE->prefix->name, 0);\r
+    for (i = 0; i < newE->nDefaultAtts; i++) {\r
+      newE->defaultAtts[i].id = (ATTRIBUTE_ID *)\r
+          lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);\r
+      newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;\r
+      if (oldE->defaultAtts[i].value) {\r
+        newE->defaultAtts[i].value\r
+            = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);\r
+        if (!newE->defaultAtts[i].value)\r
+          return 0;\r
+      }\r
+      else\r
+        newE->defaultAtts[i].value = NULL;\r
+    }\r
+  }\r
+\r
+  /* Copy the entity tables. */\r
+  if (!copyEntityTable(oldParser,\r
+                       &(newDtd->generalEntities),\r
+                       &(newDtd->pool),\r
+                       &(oldDtd->generalEntities)))\r
+      return 0;\r
+\r
+#ifdef XML_DTD\r
+  if (!copyEntityTable(oldParser,\r
+                       &(newDtd->paramEntities),\r
+                       &(newDtd->pool),\r
+                       &(oldDtd->paramEntities)))\r
+      return 0;\r
+  newDtd->paramEntityRead = oldDtd->paramEntityRead;\r
+#endif /* XML_DTD */\r
+\r
+  newDtd->keepProcessing = oldDtd->keepProcessing;\r
+  newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs;\r
+  newDtd->standalone = oldDtd->standalone;\r
+\r
+  /* Don't want deep copying for scaffolding */\r
+  newDtd->in_eldecl = oldDtd->in_eldecl;\r
+  newDtd->scaffold = oldDtd->scaffold;\r
+  newDtd->contentStringLen = oldDtd->contentStringLen;\r
+  newDtd->scaffSize = oldDtd->scaffSize;\r
+  newDtd->scaffLevel = oldDtd->scaffLevel;\r
+  newDtd->scaffIndex = oldDtd->scaffIndex;\r
+\r
+  return 1;\r
+}  /* End dtdCopy */\r
+\r
+static int\r
+copyEntityTable(XML_Parser oldParser,\r
+                HASH_TABLE *newTable,\r
+                STRING_POOL *newPool,\r
+                const HASH_TABLE *oldTable)\r
+{\r
+  HASH_TABLE_ITER iter;\r
+  const XML_Char *cachedOldBase = NULL;\r
+  const XML_Char *cachedNewBase = NULL;\r
+\r
+  hashTableIterInit(&iter, oldTable);\r
+\r
+  for (;;) {\r
+    ENTITY *newE;\r
+    const XML_Char *name;\r
+    const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);\r
+    if (!oldE)\r
+      break;\r
+    name = poolCopyString(newPool, oldE->name);\r
+    if (!name)\r
+      return 0;\r
+    newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));\r
+    if (!newE)\r
+      return 0;\r
+    if (oldE->systemId) {\r
+      const XML_Char *tem = poolCopyString(newPool, oldE->systemId);\r
+      if (!tem)\r
+        return 0;\r
+      newE->systemId = tem;\r
+      if (oldE->base) {\r
+        if (oldE->base == cachedOldBase)\r
+          newE->base = cachedNewBase;\r
+        else {\r
+          cachedOldBase = oldE->base;\r
+          tem = poolCopyString(newPool, cachedOldBase);\r
+          if (!tem)\r
+            return 0;\r
+          cachedNewBase = newE->base = tem;\r
+        }\r
+      }\r
+      if (oldE->publicId) {\r
+        tem = poolCopyString(newPool, oldE->publicId);\r
+        if (!tem)\r
+          return 0;\r
+        newE->publicId = tem;\r
+      }\r
+    }\r
+    else {\r
+      const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr,\r
+                                            oldE->textLen);\r
+      if (!tem)\r
+        return 0;\r
+      newE->textPtr = tem;\r
+      newE->textLen = oldE->textLen;\r
+    }\r
+    if (oldE->notation) {\r
+      const XML_Char *tem = poolCopyString(newPool, oldE->notation);\r
+      if (!tem)\r
+        return 0;\r
+      newE->notation = tem;\r
+    }\r
+    newE->is_param = oldE->is_param;\r
+    newE->is_internal = oldE->is_internal;\r
+  }\r
+  return 1;\r
+}\r
+\r
+#define INIT_POWER 6\r
+\r
+static XML_Bool FASTCALL\r
+keyeq(KEY s1, KEY s2)\r
+{\r
+  for (; *s1 == *s2; s1++, s2++)\r
+    if (*s1 == 0)\r
+      return XML_TRUE;\r
+  return XML_FALSE;\r
+}\r
+\r
+static unsigned long FASTCALL\r
+hash(XML_Parser parser, KEY s)\r
+{\r
+  unsigned long h = hash_secret_salt;\r
+  while (*s)\r
+    h = CHAR_HASH(h, *s++);\r
+  return h;\r
+}\r
+\r
+static NAMED *\r
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)\r
+{\r
+  size_t i;\r
+  if (table->size == 0) {\r
+    size_t tsize;\r
+    if (!createSize)\r
+      return NULL;\r
+    table->power = INIT_POWER;\r
+    /* table->size is a power of 2 */\r
+    table->size = (size_t)1 << INIT_POWER;\r
+    tsize = table->size * sizeof(NAMED *);\r
+    table->v = (NAMED **)table->mem->malloc_fcn(tsize);\r
+    if (!table->v) {\r
+      table->size = 0;\r
+      return NULL;\r
+    }\r
+    memset(table->v, 0, tsize);\r
+    i = hash(parser, name) & ((unsigned long)table->size - 1);\r
+  }\r
+  else {\r
+    unsigned long h = hash(parser, name);\r
+    unsigned long mask = (unsigned long)table->size - 1;\r
+    unsigned char step = 0;\r
+    i = h & mask;\r
+    while (table->v[i]) {\r
+      if (keyeq(name, table->v[i]->name))\r
+        return table->v[i];\r
+      if (!step)\r
+        step = PROBE_STEP(h, mask, table->power);\r
+      i < step ? (i += table->size - step) : (i -= step);\r
+    }\r
+    if (!createSize)\r
+      return NULL;\r
+\r
+    /* check for overflow (table is half full) */\r
+    if (table->used >> (table->power - 1)) {\r
+      unsigned char newPower = table->power + 1;\r
+      size_t newSize = (size_t)1 << newPower;\r
+      unsigned long newMask = (unsigned long)newSize - 1;\r
+      size_t tsize = newSize * sizeof(NAMED *);\r
+      NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);\r
+      if (!newV)\r
+        return NULL;\r
+      memset(newV, 0, tsize);\r
+      for (i = 0; i < table->size; i++)\r
+        if (table->v[i]) {\r
+          unsigned long newHash = hash(parser, table->v[i]->name);\r
+          size_t j = newHash & newMask;\r
+          step = 0;\r
+          while (newV[j]) {\r
+            if (!step)\r
+              step = PROBE_STEP(newHash, newMask, newPower);\r
+            j < step ? (j += newSize - step) : (j -= step);\r
+          }\r
+          newV[j] = table->v[i];\r
+        }\r
+      table->mem->free_fcn(table->v);\r
+      table->v = newV;\r
+      table->power = newPower;\r
+      table->size = newSize;\r
+      i = h & newMask;\r
+      step = 0;\r
+      while (table->v[i]) {\r
+        if (!step)\r
+          step = PROBE_STEP(h, newMask, newPower);\r
+        i < step ? (i += newSize - step) : (i -= step);\r
+      }\r
+    }\r
+  }\r
+  table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);\r
+  if (!table->v[i])\r
+    return NULL;\r
+  memset(table->v[i], 0, createSize);\r
+  table->v[i]->name = name;\r
+  (table->used)++;\r
+  return table->v[i];\r
+}\r
+\r
+static void FASTCALL\r
+hashTableClear(HASH_TABLE *table)\r
+{\r
+  size_t i;\r
+  for (i = 0; i < table->size; i++) {\r
+    table->mem->free_fcn(table->v[i]);\r
+    table->v[i] = NULL;\r
+  }\r
+  table->used = 0;\r
+}\r
+\r
+static void FASTCALL\r
+hashTableDestroy(HASH_TABLE *table)\r
+{\r
+  size_t i;\r
+  for (i = 0; i < table->size; i++)\r
+    table->mem->free_fcn(table->v[i]);\r
+  table->mem->free_fcn(table->v);\r
+}\r
+\r
+static void FASTCALL\r
+hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms)\r
+{\r
+  p->power = 0;\r
+  p->size = 0;\r
+  p->used = 0;\r
+  p->v = NULL;\r
+  p->mem = ms;\r
+}\r
+\r
+static void FASTCALL\r
+hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table)\r
+{\r
+  iter->p = table->v;\r
+  iter->end = iter->p + table->size;\r
+}\r
+\r
+static NAMED * FASTCALL\r
+hashTableIterNext(HASH_TABLE_ITER *iter)\r
+{\r
+  while (iter->p != iter->end) {\r
+    NAMED *tem = *(iter->p)++;\r
+    if (tem)\r
+      return tem;\r
+  }\r
+  return NULL;\r
+}\r
+\r
+static void FASTCALL\r
+poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms)\r
+{\r
+  pool->blocks = NULL;\r
+  pool->freeBlocks = NULL;\r
+  pool->start = NULL;\r
+  pool->ptr = NULL;\r
+  pool->end = NULL;\r
+  pool->mem = ms;\r
+}\r
+\r
+static void FASTCALL\r
+poolClear(STRING_POOL *pool)\r
+{\r
+  if (!pool->freeBlocks)\r
+    pool->freeBlocks = pool->blocks;\r
+  else {\r
+    BLOCK *p = pool->blocks;\r
+    while (p) {\r
+      BLOCK *tem = p->next;\r
+      p->next = pool->freeBlocks;\r
+      pool->freeBlocks = p;\r
+      p = tem;\r
+    }\r
+  }\r
+  pool->blocks = NULL;\r
+  pool->start = NULL;\r
+  pool->ptr = NULL;\r
+  pool->end = NULL;\r
+}\r
+\r
+static void FASTCALL\r
+poolDestroy(STRING_POOL *pool)\r
+{\r
+  BLOCK *p = pool->blocks;\r
+  while (p) {\r
+    BLOCK *tem = p->next;\r
+    pool->mem->free_fcn(p);\r
+    p = tem;\r
+  }\r
+  p = pool->freeBlocks;\r
+  while (p) {\r
+    BLOCK *tem = p->next;\r
+    pool->mem->free_fcn(p);\r
+    p = tem;\r
+  }\r
+}\r
+\r
+static XML_Char *\r
+poolAppend(STRING_POOL *pool, const ENCODING *enc,\r
+           const char *ptr, const char *end)\r
+{\r
+  if (!pool->ptr && !poolGrow(pool))\r
+    return NULL;\r
+  for (;;) {\r
+    XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);\r
+    if (ptr == end)\r
+      break;\r
+    if (!poolGrow(pool))\r
+      return NULL;\r
+  }\r
+  return pool->start;\r
+}\r
+\r
+static const XML_Char * FASTCALL\r
+poolCopyString(STRING_POOL *pool, const XML_Char *s)\r
+{\r
+  do {\r
+    if (!poolAppendChar(pool, *s))\r
+      return NULL;\r
+  } while (*s++);\r
+  s = pool->start;\r
+  poolFinish(pool);\r
+  return s;\r
+}\r
+\r
+static const XML_Char *\r
+poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)\r
+{\r
+  if (!pool->ptr && !poolGrow(pool))\r
+    return NULL;\r
+  for (; n > 0; --n, s++) {\r
+    if (!poolAppendChar(pool, *s))\r
+      return NULL;\r
+  }\r
+  s = pool->start;\r
+  poolFinish(pool);\r
+  return s;\r
+}\r
+\r
+static const XML_Char * FASTCALL\r
+poolAppendString(STRING_POOL *pool, const XML_Char *s)\r
+{\r
+  while (*s) {\r
+    if (!poolAppendChar(pool, *s))\r
+      return NULL;\r
+    s++;\r
+  }\r
+  return pool->start;\r
+}\r
+\r
+static XML_Char *\r
+poolStoreString(STRING_POOL *pool, const ENCODING *enc,\r
+                const char *ptr, const char *end)\r
+{\r
+  if (!poolAppend(pool, enc, ptr, end))\r
+    return NULL;\r
+  if (pool->ptr == pool->end && !poolGrow(pool))\r
+    return NULL;\r
+  *(pool->ptr)++ = 0;\r
+  return pool->start;\r
+}\r
+\r
+static XML_Bool FASTCALL\r
+poolGrow(STRING_POOL *pool)\r
+{\r
+  if (pool->freeBlocks) {\r
+    if (pool->start == 0) {\r
+      pool->blocks = pool->freeBlocks;\r
+      pool->freeBlocks = pool->freeBlocks->next;\r
+      pool->blocks->next = NULL;\r
+      pool->start = pool->blocks->s;\r
+      pool->end = pool->start + pool->blocks->size;\r
+      pool->ptr = pool->start;\r
+      return XML_TRUE;\r
+    }\r
+    if (pool->end - pool->start < pool->freeBlocks->size) {\r
+      BLOCK *tem = pool->freeBlocks->next;\r
+      pool->freeBlocks->next = pool->blocks;\r
+      pool->blocks = pool->freeBlocks;\r
+      pool->freeBlocks = tem;\r
+      memcpy(pool->blocks->s, pool->start,\r
+             (pool->end - pool->start) * sizeof(XML_Char));\r
+      pool->ptr = pool->blocks->s + (pool->ptr - pool->start);\r
+      pool->start = pool->blocks->s;\r
+      pool->end = pool->start + pool->blocks->size;\r
+      return XML_TRUE;\r
+    }\r
+  }\r
+  if (pool->blocks && pool->start == pool->blocks->s) {\r
+    int blockSize = (int)(pool->end - pool->start)*2;\r
+    BLOCK *temp = (BLOCK *)\r
+      pool->mem->realloc_fcn(pool->blocks,\r
+                             (offsetof(BLOCK, s)\r
+                              + blockSize * sizeof(XML_Char)));\r
+    if (temp == NULL)\r
+      return XML_FALSE;\r
+    pool->blocks = temp;\r
+    pool->blocks->size = blockSize;\r
+    pool->ptr = pool->blocks->s + (pool->ptr - pool->start);\r
+    pool->start = pool->blocks->s;\r
+    pool->end = pool->start + blockSize;\r
+  }\r
+  else {\r
+    BLOCK *tem;\r
+    int blockSize = (int)(pool->end - pool->start);\r
+    if (blockSize < INIT_BLOCK_SIZE)\r
+      blockSize = INIT_BLOCK_SIZE;\r
+    else\r
+      blockSize *= 2;\r
+    tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s)\r
+                                        + blockSize * sizeof(XML_Char));\r
+    if (!tem)\r
+      return XML_FALSE;\r
+    tem->size = blockSize;\r
+    tem->next = pool->blocks;\r
+    pool->blocks = tem;\r
+    if (pool->ptr != pool->start)\r
+      memcpy(tem->s, pool->start,\r
+             (pool->ptr - pool->start) * sizeof(XML_Char));\r
+    pool->ptr = tem->s + (pool->ptr - pool->start);\r
+    pool->start = tem->s;\r
+    pool->end = tem->s + blockSize;\r
+  }\r
+  return XML_TRUE;\r
+}\r
+\r
+static int FASTCALL\r
+nextScaffoldPart(XML_Parser parser)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  CONTENT_SCAFFOLD * me;\r
+  int next;\r
+\r
+  if (!dtd->scaffIndex) {\r
+    dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));\r
+    if (!dtd->scaffIndex)\r
+      return -1;\r
+    dtd->scaffIndex[0] = 0;\r
+  }\r
+\r
+  if (dtd->scaffCount >= dtd->scaffSize) {\r
+    CONTENT_SCAFFOLD *temp;\r
+    if (dtd->scaffold) {\r
+      temp = (CONTENT_SCAFFOLD *)\r
+        REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));\r
+      if (temp == NULL)\r
+        return -1;\r
+      dtd->scaffSize *= 2;\r
+    }\r
+    else {\r
+      temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS\r
+                                        * sizeof(CONTENT_SCAFFOLD));\r
+      if (temp == NULL)\r
+        return -1;\r
+      dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS;\r
+    }\r
+    dtd->scaffold = temp;\r
+  }\r
+  next = dtd->scaffCount++;\r
+  me = &dtd->scaffold[next];\r
+  if (dtd->scaffLevel) {\r
+    CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]];\r
+    if (parent->lastchild) {\r
+      dtd->scaffold[parent->lastchild].nextsib = next;\r
+    }\r
+    if (!parent->childcnt)\r
+      parent->firstchild = next;\r
+    parent->lastchild = next;\r
+    parent->childcnt++;\r
+  }\r
+  me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0;\r
+  return next;\r
+}\r
+\r
+static void\r
+build_node(XML_Parser parser,\r
+           int src_node,\r
+           XML_Content *dest,\r
+           XML_Content **contpos,\r
+           XML_Char **strpos)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  dest->type = dtd->scaffold[src_node].type;\r
+  dest->quant = dtd->scaffold[src_node].quant;\r
+  if (dest->type == XML_CTYPE_NAME) {\r
+    const XML_Char *src;\r
+    dest->name = *strpos;\r
+    src = dtd->scaffold[src_node].name;\r
+    for (;;) {\r
+      *(*strpos)++ = *src;\r
+      if (!*src)\r
+        break;\r
+      src++;\r
+    }\r
+    dest->numchildren = 0;\r
+    dest->children = NULL;\r
+  }\r
+  else {\r
+    unsigned int i;\r
+    int cn;\r
+    dest->numchildren = dtd->scaffold[src_node].childcnt;\r
+    dest->children = *contpos;\r
+    *contpos += dest->numchildren;\r
+    for (i = 0, cn = dtd->scaffold[src_node].firstchild;\r
+         i < dest->numchildren;\r
+         i++, cn = dtd->scaffold[cn].nextsib) {\r
+      build_node(parser, cn, &(dest->children[i]), contpos, strpos);\r
+    }\r
+    dest->name = NULL;\r
+  }\r
+}\r
+\r
+static XML_Content *\r
+build_model (XML_Parser parser)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  XML_Content *ret;\r
+  XML_Content *cpos;\r
+  XML_Char * str;\r
+  int allocsize = (dtd->scaffCount * sizeof(XML_Content)\r
+                   + (dtd->contentStringLen * sizeof(XML_Char)));\r
+\r
+  ret = (XML_Content *)MALLOC(allocsize);\r
+  if (!ret)\r
+    return NULL;\r
+\r
+  str =  (XML_Char *) (&ret[dtd->scaffCount]);\r
+  cpos = &ret[1];\r
+\r
+  build_node(parser, 0, ret, &cpos, &str);\r
+  return ret;\r
+}\r
+\r
+static ELEMENT_TYPE *\r
+getElementType(XML_Parser parser,\r
+               const ENCODING *enc,\r
+               const char *ptr,\r
+               const char *end)\r
+{\r
+  DTD * const dtd = _dtd;  /* save one level of indirection */\r
+  const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);\r
+  ELEMENT_TYPE *ret;\r
+\r
+  if (!name)\r
+    return NULL;\r
+  ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));\r
+  if (!ret)\r
+    return NULL;\r
+  if (ret->name != name)\r
+    poolDiscard(&dtd->pool);\r
+  else {\r
+    poolFinish(&dtd->pool);\r
+    if (!setElementTypePrefix(parser, ret))\r
+      return NULL;\r
+  }\r
+  return ret;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.c
new file mode 100644 (file)
index 0000000..c452cb8
--- /dev/null
@@ -0,0 +1,1336 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#include <stddef.h>\r
+\r
+#ifdef COMPILED_FROM_DSP\r
+#include "winconfig.h"\r
+#elif defined(MACOS_CLASSIC)\r
+#include "macconfig.h"\r
+#elif defined(__amigaos__)\r
+#include "amigaconfig.h"\r
+#elif defined(__WATCOMC__)\r
+#include "watcomconfig.h"\r
+#else\r
+#ifdef HAVE_EXPAT_CONFIG_H\r
+#include <expat_config.h>\r
+#endif\r
+#endif /* ndef COMPILED_FROM_DSP */\r
+\r
+#include "expat_external.h"\r
+#include "internal.h"\r
+#include "xmlrole.h"\r
+#include "ascii.h"\r
+\r
+/* Doesn't check:\r
+\r
+ that ,| are not mixed in a model group\r
+ content of literals\r
+\r
+*/\r
+\r
+static const char KW_ANY[] = {\r
+    ASCII_A, ASCII_N, ASCII_Y, '\0' };\r
+static const char KW_ATTLIST[] = {\r
+    ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };\r
+static const char KW_CDATA[] = {\r
+    ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };\r
+static const char KW_DOCTYPE[] = {\r
+    ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };\r
+static const char KW_ELEMENT[] = {\r
+    ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };\r
+static const char KW_EMPTY[] = {\r
+    ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };\r
+static const char KW_ENTITIES[] = {\r
+    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,\r
+    '\0' };\r
+static const char KW_ENTITY[] = {\r
+    ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };\r
+static const char KW_FIXED[] = {\r
+    ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };\r
+static const char KW_ID[] = {\r
+    ASCII_I, ASCII_D, '\0' };\r
+static const char KW_IDREF[] = {\r
+    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };\r
+static const char KW_IDREFS[] = {\r
+    ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };\r
+#ifdef XML_DTD\r
+static const char KW_IGNORE[] = {\r
+    ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };\r
+#endif\r
+static const char KW_IMPLIED[] = {\r
+    ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };\r
+#ifdef XML_DTD\r
+static const char KW_INCLUDE[] = {\r
+    ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };\r
+#endif\r
+static const char KW_NDATA[] = {\r
+    ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };\r
+static const char KW_NMTOKEN[] = {\r
+    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };\r
+static const char KW_NMTOKENS[] = {\r
+    ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,\r
+    '\0' };\r
+static const char KW_NOTATION[] =\r
+    { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,\r
+      '\0' };\r
+static const char KW_PCDATA[] = {\r
+    ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };\r
+static const char KW_PUBLIC[] = {\r
+    ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };\r
+static const char KW_REQUIRED[] = {\r
+    ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,\r
+    '\0' };\r
+static const char KW_SYSTEM[] = {\r
+    ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };\r
+\r
+#ifndef MIN_BYTES_PER_CHAR\r
+#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)\r
+#endif\r
+\r
+#ifdef XML_DTD\r
+#define setTopLevel(state) \\r
+  ((state)->handler = ((state)->documentEntity \\r
+                       ? internalSubset \\r
+                       : externalSubset1))\r
+#else /* not XML_DTD */\r
+#define setTopLevel(state) ((state)->handler = internalSubset)\r
+#endif /* not XML_DTD */\r
+\r
+typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,\r
+                                   int tok,\r
+                                   const char *ptr,\r
+                                   const char *end,\r
+                                   const ENCODING *enc);\r
+\r
+static PROLOG_HANDLER\r
+  prolog0, prolog1, prolog2,\r
+  doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,\r
+  internalSubset,\r
+  entity0, entity1, entity2, entity3, entity4, entity5, entity6,\r
+  entity7, entity8, entity9, entity10,\r
+  notation0, notation1, notation2, notation3, notation4,\r
+  attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,\r
+  attlist7, attlist8, attlist9,\r
+  element0, element1, element2, element3, element4, element5, element6,\r
+  element7,\r
+#ifdef XML_DTD\r
+  externalSubset0, externalSubset1,\r
+  condSect0, condSect1, condSect2,\r
+#endif /* XML_DTD */\r
+  declClose,\r
+  error;\r
+\r
+static int FASTCALL common(PROLOG_STATE *state, int tok);\r
+\r
+static int PTRCALL\r
+prolog0(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    state->handler = prolog1;\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_XML_DECL:\r
+    state->handler = prolog1;\r
+    return XML_ROLE_XML_DECL;\r
+  case XML_TOK_PI:\r
+    state->handler = prolog1;\r
+    return XML_ROLE_PI;\r
+  case XML_TOK_COMMENT:\r
+    state->handler = prolog1;\r
+    return XML_ROLE_COMMENT;\r
+  case XML_TOK_BOM:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_DECL_OPEN:\r
+    if (!XmlNameMatchesAscii(enc,\r
+                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                             end,\r
+                             KW_DOCTYPE))\r
+      break;\r
+    state->handler = doctype0;\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_INSTANCE_START:\r
+    state->handler = error;\r
+    return XML_ROLE_INSTANCE_START;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+prolog1(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_PI:\r
+    return XML_ROLE_PI;\r
+  case XML_TOK_COMMENT:\r
+    return XML_ROLE_COMMENT;\r
+  case XML_TOK_BOM:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_DECL_OPEN:\r
+    if (!XmlNameMatchesAscii(enc,\r
+                             ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                             end,\r
+                             KW_DOCTYPE))\r
+      break;\r
+    state->handler = doctype0;\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_INSTANCE_START:\r
+    state->handler = error;\r
+    return XML_ROLE_INSTANCE_START;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+prolog2(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_PI:\r
+    return XML_ROLE_PI;\r
+  case XML_TOK_COMMENT:\r
+    return XML_ROLE_COMMENT;\r
+  case XML_TOK_INSTANCE_START:\r
+    state->handler = error;\r
+    return XML_ROLE_INSTANCE_START;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype0(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = doctype1;\r
+    return XML_ROLE_DOCTYPE_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype1(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_OPEN_BRACKET:\r
+    state->handler = internalSubset;\r
+    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;\r
+  case XML_TOK_DECL_CLOSE:\r
+    state->handler = prolog2;\r
+    return XML_ROLE_DOCTYPE_CLOSE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {\r
+      state->handler = doctype3;\r
+      return XML_ROLE_DOCTYPE_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {\r
+      state->handler = doctype2;\r
+      return XML_ROLE_DOCTYPE_NONE;\r
+    }\r
+    break;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype2(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = doctype3;\r
+    return XML_ROLE_DOCTYPE_PUBLIC_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype3(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = doctype4;\r
+    return XML_ROLE_DOCTYPE_SYSTEM_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype4(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_OPEN_BRACKET:\r
+    state->handler = internalSubset;\r
+    return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;\r
+  case XML_TOK_DECL_CLOSE:\r
+    state->handler = prolog2;\r
+    return XML_ROLE_DOCTYPE_CLOSE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+doctype5(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_DECL_CLOSE:\r
+    state->handler = prolog2;\r
+    return XML_ROLE_DOCTYPE_CLOSE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+internalSubset(PROLOG_STATE *state,\r
+               int tok,\r
+               const char *ptr,\r
+               const char *end,\r
+               const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_DECL_OPEN:\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_ENTITY)) {\r
+      state->handler = entity0;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_ATTLIST)) {\r
+      state->handler = attlist0;\r
+      return XML_ROLE_ATTLIST_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_ELEMENT)) {\r
+      state->handler = element0;\r
+      return XML_ROLE_ELEMENT_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + 2 * MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_NOTATION)) {\r
+      state->handler = notation0;\r
+      return XML_ROLE_NOTATION_NONE;\r
+    }\r
+    break;\r
+  case XML_TOK_PI:\r
+    return XML_ROLE_PI;\r
+  case XML_TOK_COMMENT:\r
+    return XML_ROLE_COMMENT;\r
+  case XML_TOK_PARAM_ENTITY_REF:\r
+    return XML_ROLE_PARAM_ENTITY_REF;\r
+  case XML_TOK_CLOSE_BRACKET:\r
+    state->handler = doctype5;\r
+    return XML_ROLE_DOCTYPE_NONE;\r
+  case XML_TOK_NONE:\r
+    return XML_ROLE_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+static int PTRCALL\r
+externalSubset0(PROLOG_STATE *state,\r
+                int tok,\r
+                const char *ptr,\r
+                const char *end,\r
+                const ENCODING *enc)\r
+{\r
+  state->handler = externalSubset1;\r
+  if (tok == XML_TOK_XML_DECL)\r
+    return XML_ROLE_TEXT_DECL;\r
+  return externalSubset1(state, tok, ptr, end, enc);\r
+}\r
+\r
+static int PTRCALL\r
+externalSubset1(PROLOG_STATE *state,\r
+                int tok,\r
+                const char *ptr,\r
+                const char *end,\r
+                const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_COND_SECT_OPEN:\r
+    state->handler = condSect0;\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_COND_SECT_CLOSE:\r
+    if (state->includeLevel == 0)\r
+      break;\r
+    state->includeLevel -= 1;\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_CLOSE_BRACKET:\r
+    break;\r
+  case XML_TOK_NONE:\r
+    if (state->includeLevel)\r
+      break;\r
+    return XML_ROLE_NONE;\r
+  default:\r
+    return internalSubset(state, tok, ptr, end, enc);\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+#endif /* XML_DTD */\r
+\r
+static int PTRCALL\r
+entity0(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_PERCENT:\r
+    state->handler = entity1;\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_NAME:\r
+    state->handler = entity2;\r
+    return XML_ROLE_GENERAL_ENTITY_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity1(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_NAME:\r
+    state->handler = entity7;\r
+    return XML_ROLE_PARAM_ENTITY_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity2(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {\r
+      state->handler = entity4;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {\r
+      state->handler = entity3;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    break;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ENTITY_NONE;\r
+    return XML_ROLE_ENTITY_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity3(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = entity4;\r
+    return XML_ROLE_ENTITY_PUBLIC_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity4(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = entity5;\r
+    return XML_ROLE_ENTITY_SYSTEM_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity5(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_DECL_CLOSE:\r
+    setTopLevel(state);\r
+    return XML_ROLE_ENTITY_COMPLETE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {\r
+      state->handler = entity6;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    break;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity6(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_NAME:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ENTITY_NONE;\r
+    return XML_ROLE_ENTITY_NOTATION_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity7(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {\r
+      state->handler = entity9;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {\r
+      state->handler = entity8;\r
+      return XML_ROLE_ENTITY_NONE;\r
+    }\r
+    break;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ENTITY_NONE;\r
+    return XML_ROLE_ENTITY_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity8(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = entity9;\r
+    return XML_ROLE_ENTITY_PUBLIC_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity9(PROLOG_STATE *state,\r
+        int tok,\r
+        const char *ptr,\r
+        const char *end,\r
+        const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = entity10;\r
+    return XML_ROLE_ENTITY_SYSTEM_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+entity10(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ENTITY_NONE;\r
+  case XML_TOK_DECL_CLOSE:\r
+    setTopLevel(state);\r
+    return XML_ROLE_ENTITY_COMPLETE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+notation0(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NOTATION_NONE;\r
+  case XML_TOK_NAME:\r
+    state->handler = notation1;\r
+    return XML_ROLE_NOTATION_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+notation1(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NOTATION_NONE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {\r
+      state->handler = notation3;\r
+      return XML_ROLE_NOTATION_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {\r
+      state->handler = notation2;\r
+      return XML_ROLE_NOTATION_NONE;\r
+    }\r
+    break;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+notation2(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NOTATION_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = notation4;\r
+    return XML_ROLE_NOTATION_PUBLIC_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+notation3(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NOTATION_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_NOTATION_NONE;\r
+    return XML_ROLE_NOTATION_SYSTEM_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+notation4(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NOTATION_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_NOTATION_NONE;\r
+    return XML_ROLE_NOTATION_SYSTEM_ID;\r
+  case XML_TOK_DECL_CLOSE:\r
+    setTopLevel(state);\r
+    return XML_ROLE_NOTATION_NO_SYSTEM_ID;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist0(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = attlist1;\r
+    return XML_ROLE_ATTLIST_ELEMENT_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist1(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_DECL_CLOSE:\r
+    setTopLevel(state);\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = attlist2;\r
+    return XML_ROLE_ATTRIBUTE_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist2(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_NAME:\r
+    {\r
+      static const char * const types[] = {\r
+        KW_CDATA,\r
+        KW_ID,\r
+        KW_IDREF,\r
+        KW_IDREFS,\r
+        KW_ENTITY,\r
+        KW_ENTITIES,\r
+        KW_NMTOKEN,\r
+        KW_NMTOKENS,\r
+      };\r
+      int i;\r
+      for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)\r
+        if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {\r
+          state->handler = attlist8;\r
+          return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;\r
+        }\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {\r
+      state->handler = attlist5;\r
+      return XML_ROLE_ATTLIST_NONE;\r
+    }\r
+    break;\r
+  case XML_TOK_OPEN_PAREN:\r
+    state->handler = attlist3;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist3(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_NMTOKEN:\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = attlist4;\r
+    return XML_ROLE_ATTRIBUTE_ENUM_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist4(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_CLOSE_PAREN:\r
+    state->handler = attlist8;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_OR:\r
+    state->handler = attlist3;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist5(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_OPEN_PAREN:\r
+    state->handler = attlist6;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist6(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_NAME:\r
+    state->handler = attlist7;\r
+    return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist7(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_CLOSE_PAREN:\r
+    state->handler = attlist8;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_OR:\r
+    state->handler = attlist6;\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+/* default value */\r
+static int PTRCALL\r
+attlist8(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_POUND_NAME:\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_IMPLIED)) {\r
+      state->handler = attlist1;\r
+      return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_REQUIRED)) {\r
+      state->handler = attlist1;\r
+      return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_FIXED)) {\r
+      state->handler = attlist9;\r
+      return XML_ROLE_ATTLIST_NONE;\r
+    }\r
+    break;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = attlist1;\r
+    return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+attlist9(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ATTLIST_NONE;\r
+  case XML_TOK_LITERAL:\r
+    state->handler = attlist1;\r
+    return XML_ROLE_FIXED_ATTRIBUTE_VALUE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element0(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = element1;\r
+    return XML_ROLE_ELEMENT_NAME;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element1(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+      return XML_ROLE_CONTENT_EMPTY;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+      return XML_ROLE_CONTENT_ANY;\r
+    }\r
+    break;\r
+  case XML_TOK_OPEN_PAREN:\r
+    state->handler = element2;\r
+    state->level = 1;\r
+    return XML_ROLE_GROUP_OPEN;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element2(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_POUND_NAME:\r
+    if (XmlNameMatchesAscii(enc,\r
+                            ptr + MIN_BYTES_PER_CHAR(enc),\r
+                            end,\r
+                            KW_PCDATA)) {\r
+      state->handler = element3;\r
+      return XML_ROLE_CONTENT_PCDATA;\r
+    }\r
+    break;\r
+  case XML_TOK_OPEN_PAREN:\r
+    state->level = 2;\r
+    state->handler = element6;\r
+    return XML_ROLE_GROUP_OPEN;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT;\r
+  case XML_TOK_NAME_QUESTION:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_OPT;\r
+  case XML_TOK_NAME_ASTERISK:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_REP;\r
+  case XML_TOK_NAME_PLUS:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_PLUS;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element3(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_CLOSE_PAREN:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    return XML_ROLE_GROUP_CLOSE;\r
+  case XML_TOK_CLOSE_PAREN_ASTERISK:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    return XML_ROLE_GROUP_CLOSE_REP;\r
+  case XML_TOK_OR:\r
+    state->handler = element4;\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element4(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = element5;\r
+    return XML_ROLE_CONTENT_ELEMENT;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element5(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_CLOSE_PAREN_ASTERISK:\r
+    state->handler = declClose;\r
+    state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    return XML_ROLE_GROUP_CLOSE_REP;\r
+  case XML_TOK_OR:\r
+    state->handler = element4;\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element6(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_OPEN_PAREN:\r
+    state->level += 1;\r
+    return XML_ROLE_GROUP_OPEN;\r
+  case XML_TOK_NAME:\r
+  case XML_TOK_PREFIXED_NAME:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT;\r
+  case XML_TOK_NAME_QUESTION:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_OPT;\r
+  case XML_TOK_NAME_ASTERISK:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_REP;\r
+  case XML_TOK_NAME_PLUS:\r
+    state->handler = element7;\r
+    return XML_ROLE_CONTENT_ELEMENT_PLUS;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+element7(PROLOG_STATE *state,\r
+         int tok,\r
+         const char *ptr,\r
+         const char *end,\r
+         const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_ELEMENT_NONE;\r
+  case XML_TOK_CLOSE_PAREN:\r
+    state->level -= 1;\r
+    if (state->level == 0) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    }\r
+    return XML_ROLE_GROUP_CLOSE;\r
+  case XML_TOK_CLOSE_PAREN_ASTERISK:\r
+    state->level -= 1;\r
+    if (state->level == 0) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    }\r
+    return XML_ROLE_GROUP_CLOSE_REP;\r
+  case XML_TOK_CLOSE_PAREN_QUESTION:\r
+    state->level -= 1;\r
+    if (state->level == 0) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    }\r
+    return XML_ROLE_GROUP_CLOSE_OPT;\r
+  case XML_TOK_CLOSE_PAREN_PLUS:\r
+    state->level -= 1;\r
+    if (state->level == 0) {\r
+      state->handler = declClose;\r
+      state->role_none = XML_ROLE_ELEMENT_NONE;\r
+    }\r
+    return XML_ROLE_GROUP_CLOSE_PLUS;\r
+  case XML_TOK_COMMA:\r
+    state->handler = element6;\r
+    return XML_ROLE_GROUP_SEQUENCE;\r
+  case XML_TOK_OR:\r
+    state->handler = element6;\r
+    return XML_ROLE_GROUP_CHOICE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+static int PTRCALL\r
+condSect0(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_NAME:\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {\r
+      state->handler = condSect1;\r
+      return XML_ROLE_NONE;\r
+    }\r
+    if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {\r
+      state->handler = condSect2;\r
+      return XML_ROLE_NONE;\r
+    }\r
+    break;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+condSect1(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_OPEN_BRACKET:\r
+    state->handler = externalSubset1;\r
+    state->includeLevel += 1;\r
+    return XML_ROLE_NONE;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+condSect2(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return XML_ROLE_NONE;\r
+  case XML_TOK_OPEN_BRACKET:\r
+    state->handler = externalSubset1;\r
+    return XML_ROLE_IGNORE_SECT;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+#endif /* XML_DTD */\r
+\r
+static int PTRCALL\r
+declClose(PROLOG_STATE *state,\r
+          int tok,\r
+          const char *ptr,\r
+          const char *end,\r
+          const ENCODING *enc)\r
+{\r
+  switch (tok) {\r
+  case XML_TOK_PROLOG_S:\r
+    return state->role_none;\r
+  case XML_TOK_DECL_CLOSE:\r
+    setTopLevel(state);\r
+    return state->role_none;\r
+  }\r
+  return common(state, tok);\r
+}\r
+\r
+static int PTRCALL\r
+error(PROLOG_STATE *state,\r
+      int tok,\r
+      const char *ptr,\r
+      const char *end,\r
+      const ENCODING *enc)\r
+{\r
+  return XML_ROLE_NONE;\r
+}\r
+\r
+static int FASTCALL\r
+common(PROLOG_STATE *state, int tok)\r
+{\r
+#ifdef XML_DTD\r
+  if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)\r
+    return XML_ROLE_INNER_PARAM_ENTITY_REF;\r
+#endif\r
+  state->handler = error;\r
+  return XML_ROLE_ERROR;\r
+}\r
+\r
+void\r
+XmlPrologStateInit(PROLOG_STATE *state)\r
+{\r
+  state->handler = prolog0;\r
+#ifdef XML_DTD\r
+  state->documentEntity = 1;\r
+  state->includeLevel = 0;\r
+  state->inEntityValue = 0;\r
+#endif /* XML_DTD */\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+void\r
+XmlPrologStateInitExternalEntity(PROLOG_STATE *state)\r
+{\r
+  state->handler = externalSubset0;\r
+  state->documentEntity = 0;\r
+  state->includeLevel = 0;\r
+}\r
+\r
+#endif /* XML_DTD */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmlrole.h
new file mode 100644 (file)
index 0000000..25be6b0
--- /dev/null
@@ -0,0 +1,114 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#ifndef XmlRole_INCLUDED\r
+#define XmlRole_INCLUDED 1\r
+\r
+#ifdef __VMS\r
+/*      0        1         2         3      0        1         2         3\r
+        1234567890123456789012345678901     1234567890123456789012345678901 */\r
+#define XmlPrologStateInitExternalEntity    XmlPrologStateInitExternalEnt\r
+#endif\r
+\r
+#include "xmltok.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+enum {\r
+  XML_ROLE_ERROR = -1,\r
+  XML_ROLE_NONE = 0,\r
+  XML_ROLE_XML_DECL,\r
+  XML_ROLE_INSTANCE_START,\r
+  XML_ROLE_DOCTYPE_NONE,\r
+  XML_ROLE_DOCTYPE_NAME,\r
+  XML_ROLE_DOCTYPE_SYSTEM_ID,\r
+  XML_ROLE_DOCTYPE_PUBLIC_ID,\r
+  XML_ROLE_DOCTYPE_INTERNAL_SUBSET,\r
+  XML_ROLE_DOCTYPE_CLOSE,\r
+  XML_ROLE_GENERAL_ENTITY_NAME,\r
+  XML_ROLE_PARAM_ENTITY_NAME,\r
+  XML_ROLE_ENTITY_NONE,\r
+  XML_ROLE_ENTITY_VALUE,\r
+  XML_ROLE_ENTITY_SYSTEM_ID,\r
+  XML_ROLE_ENTITY_PUBLIC_ID,\r
+  XML_ROLE_ENTITY_COMPLETE,\r
+  XML_ROLE_ENTITY_NOTATION_NAME,\r
+  XML_ROLE_NOTATION_NONE,\r
+  XML_ROLE_NOTATION_NAME,\r
+  XML_ROLE_NOTATION_SYSTEM_ID,\r
+  XML_ROLE_NOTATION_NO_SYSTEM_ID,\r
+  XML_ROLE_NOTATION_PUBLIC_ID,\r
+  XML_ROLE_ATTRIBUTE_NAME,\r
+  XML_ROLE_ATTRIBUTE_TYPE_CDATA,\r
+  XML_ROLE_ATTRIBUTE_TYPE_ID,\r
+  XML_ROLE_ATTRIBUTE_TYPE_IDREF,\r
+  XML_ROLE_ATTRIBUTE_TYPE_IDREFS,\r
+  XML_ROLE_ATTRIBUTE_TYPE_ENTITY,\r
+  XML_ROLE_ATTRIBUTE_TYPE_ENTITIES,\r
+  XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN,\r
+  XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS,\r
+  XML_ROLE_ATTRIBUTE_ENUM_VALUE,\r
+  XML_ROLE_ATTRIBUTE_NOTATION_VALUE,\r
+  XML_ROLE_ATTLIST_NONE,\r
+  XML_ROLE_ATTLIST_ELEMENT_NAME,\r
+  XML_ROLE_IMPLIED_ATTRIBUTE_VALUE,\r
+  XML_ROLE_REQUIRED_ATTRIBUTE_VALUE,\r
+  XML_ROLE_DEFAULT_ATTRIBUTE_VALUE,\r
+  XML_ROLE_FIXED_ATTRIBUTE_VALUE,\r
+  XML_ROLE_ELEMENT_NONE,\r
+  XML_ROLE_ELEMENT_NAME,\r
+  XML_ROLE_CONTENT_ANY,\r
+  XML_ROLE_CONTENT_EMPTY,\r
+  XML_ROLE_CONTENT_PCDATA,\r
+  XML_ROLE_GROUP_OPEN,\r
+  XML_ROLE_GROUP_CLOSE,\r
+  XML_ROLE_GROUP_CLOSE_REP,\r
+  XML_ROLE_GROUP_CLOSE_OPT,\r
+  XML_ROLE_GROUP_CLOSE_PLUS,\r
+  XML_ROLE_GROUP_CHOICE,\r
+  XML_ROLE_GROUP_SEQUENCE,\r
+  XML_ROLE_CONTENT_ELEMENT,\r
+  XML_ROLE_CONTENT_ELEMENT_REP,\r
+  XML_ROLE_CONTENT_ELEMENT_OPT,\r
+  XML_ROLE_CONTENT_ELEMENT_PLUS,\r
+  XML_ROLE_PI,\r
+  XML_ROLE_COMMENT,\r
+#ifdef XML_DTD\r
+  XML_ROLE_TEXT_DECL,\r
+  XML_ROLE_IGNORE_SECT,\r
+  XML_ROLE_INNER_PARAM_ENTITY_REF,\r
+#endif /* XML_DTD */\r
+  XML_ROLE_PARAM_ENTITY_REF\r
+};\r
+\r
+typedef struct prolog_state {\r
+  int (PTRCALL *handler) (struct prolog_state *state,\r
+                          int tok,\r
+                          const char *ptr,\r
+                          const char *end,\r
+                          const ENCODING *enc);\r
+  unsigned level;\r
+  int role_none;\r
+#ifdef XML_DTD\r
+  unsigned includeLevel;\r
+  int documentEntity;\r
+  int inEntityValue;\r
+#endif /* XML_DTD */\r
+} PROLOG_STATE;\r
+\r
+void XmlPrologStateInit(PROLOG_STATE *);\r
+#ifdef XML_DTD\r
+void XmlPrologStateInitExternalEntity(PROLOG_STATE *);\r
+#endif /* XML_DTD */\r
+\r
+#define XmlTokenRole(state, tok, ptr, end, enc) \\r
+ (((state)->handler)(state, tok, ptr, end, enc))\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* not XmlRole_INCLUDED */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.c
new file mode 100644 (file)
index 0000000..e0e3545
--- /dev/null
@@ -0,0 +1,1651 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#include <stddef.h>\r
+\r
+#ifdef COMPILED_FROM_DSP\r
+#include "winconfig.h"\r
+#elif defined(MACOS_CLASSIC)\r
+#include "macconfig.h"\r
+#elif defined(__amigaos__)\r
+#include "amigaconfig.h"\r
+#elif defined(__WATCOMC__)\r
+#include "watcomconfig.h"\r
+#else\r
+#ifdef HAVE_EXPAT_CONFIG_H\r
+#include <expat_config.h>\r
+#endif\r
+#endif /* ndef COMPILED_FROM_DSP */\r
+\r
+#include "expat_external.h"\r
+#include "internal.h"\r
+#include "xmltok.h"\r
+#include "nametab.h"\r
+\r
+#ifdef XML_DTD\r
+#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok)\r
+#else\r
+#define IGNORE_SECTION_TOK_VTABLE /* as nothing */\r
+#endif\r
+\r
+#define VTABLE1 \\r
+  { PREFIX(prologTok), PREFIX(contentTok), \\r
+    PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \\r
+  { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \\r
+  PREFIX(sameName), \\r
+  PREFIX(nameMatchesAscii), \\r
+  PREFIX(nameLength), \\r
+  PREFIX(skipS), \\r
+  PREFIX(getAtts), \\r
+  PREFIX(charRefNumber), \\r
+  PREFIX(predefinedEntityName), \\r
+  PREFIX(updatePosition), \\r
+  PREFIX(isPublicId)\r
+\r
+#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16)\r
+\r
+#define UCS2_GET_NAMING(pages, hi, lo) \\r
+   (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1 << ((lo) & 0x1F)))\r
+\r
+/* A 2 byte UTF-8 representation splits the characters 11 bits between\r
+   the bottom 5 and 6 bits of the bytes.  We need 8 bits to index into\r
+   pages, 3 bits to add to that index and 5 bits to generate the mask.\r
+*/\r
+#define UTF8_GET_NAMING2(pages, byte) \\r
+    (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \\r
+                      + ((((byte)[0]) & 3) << 1) \\r
+                      + ((((byte)[1]) >> 5) & 1)] \\r
+         & (1 << (((byte)[1]) & 0x1F)))\r
+\r
+/* A 3 byte UTF-8 representation splits the characters 16 bits between\r
+   the bottom 4, 6 and 6 bits of the bytes.  We need 8 bits to index\r
+   into pages, 3 bits to add to that index and 5 bits to generate the\r
+   mask.\r
+*/\r
+#define UTF8_GET_NAMING3(pages, byte) \\r
+  (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \\r
+                             + ((((byte)[1]) >> 2) & 0xF)] \\r
+                       << 3) \\r
+                      + ((((byte)[1]) & 3) << 1) \\r
+                      + ((((byte)[2]) >> 5) & 1)] \\r
+         & (1 << (((byte)[2]) & 0x1F)))\r
+\r
+#define UTF8_GET_NAMING(pages, p, n) \\r
+  ((n) == 2 \\r
+  ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \\r
+  : ((n) == 3 \\r
+     ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \\r
+     : 0))\r
+\r
+/* Detection of invalid UTF-8 sequences is based on Table 3.1B\r
+   of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/\r
+   with the additional restriction of not allowing the Unicode\r
+   code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE).\r
+   Implementation details:\r
+     (A & 0x80) == 0     means A < 0x80\r
+   and\r
+     (A & 0xC0) == 0xC0  means A > 0xBF\r
+*/\r
+\r
+#define UTF8_INVALID2(p) \\r
+  ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0)\r
+\r
+#define UTF8_INVALID3(p) \\r
+  (((p)[2] & 0x80) == 0 \\r
+  || \\r
+  ((*p) == 0xEF && (p)[1] == 0xBF \\r
+    ? \\r
+    (p)[2] > 0xBD \\r
+    : \\r
+    ((p)[2] & 0xC0) == 0xC0) \\r
+  || \\r
+  ((*p) == 0xE0 \\r
+    ? \\r
+    (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \\r
+    : \\r
+    ((p)[1] & 0x80) == 0 \\r
+    || \\r
+    ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0)))\r
+\r
+#define UTF8_INVALID4(p) \\r
+  (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \\r
+  || \\r
+  ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \\r
+  || \\r
+  ((*p) == 0xF0 \\r
+    ? \\r
+    (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \\r
+    : \\r
+    ((p)[1] & 0x80) == 0 \\r
+    || \\r
+    ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0)))\r
+\r
+static int PTRFASTCALL\r
+isNever(const ENCODING *enc, const char *p)\r
+{\r
+  return 0;\r
+}\r
+\r
+static int PTRFASTCALL\r
+utf8_isName2(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_GET_NAMING2(namePages, (const unsigned char *)p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+utf8_isName3(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_GET_NAMING3(namePages, (const unsigned char *)p);\r
+}\r
+\r
+#define utf8_isName4 isNever\r
+\r
+static int PTRFASTCALL\r
+utf8_isNmstrt2(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+utf8_isNmstrt3(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p);\r
+}\r
+\r
+#define utf8_isNmstrt4 isNever\r
+\r
+static int PTRFASTCALL\r
+utf8_isInvalid2(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_INVALID2((const unsigned char *)p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+utf8_isInvalid3(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_INVALID3((const unsigned char *)p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+utf8_isInvalid4(const ENCODING *enc, const char *p)\r
+{\r
+  return UTF8_INVALID4((const unsigned char *)p);\r
+}\r
+\r
+struct normal_encoding {\r
+  ENCODING enc;\r
+  unsigned char type[256];\r
+#ifdef XML_MIN_SIZE\r
+  int (PTRFASTCALL *byteType)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *);\r
+  int (PTRCALL *charMatches)(const ENCODING *, const char *, int);\r
+#endif /* XML_MIN_SIZE */\r
+  int (PTRFASTCALL *isName2)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isName3)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isName4)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *);\r
+  int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *);\r
+};\r
+\r
+#define AS_NORMAL_ENCODING(enc)   ((const struct normal_encoding *) (enc))\r
+\r
+#ifdef XML_MIN_SIZE\r
+\r
+#define STANDARD_VTABLE(E) \\r
+ E ## byteType, \\r
+ E ## isNameMin, \\r
+ E ## isNmstrtMin, \\r
+ E ## byteToAscii, \\r
+ E ## charMatches,\r
+\r
+#else\r
+\r
+#define STANDARD_VTABLE(E) /* as nothing */\r
+\r
+#endif\r
+\r
+#define NORMAL_VTABLE(E) \\r
+ E ## isName2, \\r
+ E ## isName3, \\r
+ E ## isName4, \\r
+ E ## isNmstrt2, \\r
+ E ## isNmstrt3, \\r
+ E ## isNmstrt4, \\r
+ E ## isInvalid2, \\r
+ E ## isInvalid3, \\r
+ E ## isInvalid4\r
+\r
+static int FASTCALL checkCharRefNumber(int);\r
+\r
+#include "xmltok_impl.h"\r
+#include "ascii.h"\r
+\r
+#ifdef XML_MIN_SIZE\r
+#define sb_isNameMin isNever\r
+#define sb_isNmstrtMin isNever\r
+#endif\r
+\r
+#ifdef XML_MIN_SIZE\r
+#define MINBPC(enc) ((enc)->minBytesPerChar)\r
+#else\r
+/* minimum bytes per character */\r
+#define MINBPC(enc) 1\r
+#endif\r
+\r
+#define SB_BYTE_TYPE(enc, p) \\r
+  (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)])\r
+\r
+#ifdef XML_MIN_SIZE\r
+static int PTRFASTCALL\r
+sb_byteType(const ENCODING *enc, const char *p)\r
+{\r
+  return SB_BYTE_TYPE(enc, p);\r
+}\r
+#define BYTE_TYPE(enc, p) \\r
+ (AS_NORMAL_ENCODING(enc)->byteType(enc, p))\r
+#else\r
+#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p)\r
+#endif\r
+\r
+#ifdef XML_MIN_SIZE\r
+#define BYTE_TO_ASCII(enc, p) \\r
+ (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p))\r
+static int PTRFASTCALL\r
+sb_byteToAscii(const ENCODING *enc, const char *p)\r
+{\r
+  return *p;\r
+}\r
+#else\r
+#define BYTE_TO_ASCII(enc, p) (*(p))\r
+#endif\r
+\r
+#define IS_NAME_CHAR(enc, p, n) \\r
+ (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p))\r
+#define IS_NMSTRT_CHAR(enc, p, n) \\r
+ (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p))\r
+#define IS_INVALID_CHAR(enc, p, n) \\r
+ (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p))\r
+\r
+#ifdef XML_MIN_SIZE\r
+#define IS_NAME_CHAR_MINBPC(enc, p) \\r
+ (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p))\r
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) \\r
+ (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p))\r
+#else\r
+#define IS_NAME_CHAR_MINBPC(enc, p) (0)\r
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0)\r
+#endif\r
+\r
+#ifdef XML_MIN_SIZE\r
+#define CHAR_MATCHES(enc, p, c) \\r
+ (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c))\r
+static int PTRCALL\r
+sb_charMatches(const ENCODING *enc, const char *p, int c)\r
+{\r
+  return *p == c;\r
+}\r
+#else\r
+/* c is an ASCII character */\r
+#define CHAR_MATCHES(enc, p, c) (*(p) == c)\r
+#endif\r
+\r
+#define PREFIX(ident) normal_ ## ident\r
+#define XML_TOK_IMPL_C\r
+#include "xmltok_impl.c"\r
+#undef XML_TOK_IMPL_C\r
+\r
+#undef MINBPC\r
+#undef BYTE_TYPE\r
+#undef BYTE_TO_ASCII\r
+#undef CHAR_MATCHES\r
+#undef IS_NAME_CHAR\r
+#undef IS_NAME_CHAR_MINBPC\r
+#undef IS_NMSTRT_CHAR\r
+#undef IS_NMSTRT_CHAR_MINBPC\r
+#undef IS_INVALID_CHAR\r
+\r
+enum {  /* UTF8_cvalN is value of masked first byte of N byte sequence */\r
+  UTF8_cval1 = 0x00,\r
+  UTF8_cval2 = 0xc0,\r
+  UTF8_cval3 = 0xe0,\r
+  UTF8_cval4 = 0xf0\r
+};\r
+\r
+static void PTRCALL\r
+utf8_toUtf8(const ENCODING *enc,\r
+            const char **fromP, const char *fromLim,\r
+            char **toP, const char *toLim)\r
+{\r
+  char *to;\r
+  const char *from;\r
+  if (fromLim - *fromP > toLim - *toP) {\r
+    /* Avoid copying partial characters. */\r
+    for (fromLim = *fromP + (toLim - *toP); fromLim > *fromP; fromLim--)\r
+      if (((unsigned char)fromLim[-1] & 0xc0) != 0x80)\r
+        break;\r
+  }\r
+  for (to = *toP, from = *fromP; from != fromLim; from++, to++)\r
+    *to = *from;\r
+  *fromP = from;\r
+  *toP = to;\r
+}\r
+\r
+static void PTRCALL\r
+utf8_toUtf16(const ENCODING *enc,\r
+             const char **fromP, const char *fromLim,\r
+             unsigned short **toP, const unsigned short *toLim)\r
+{\r
+  unsigned short *to = *toP;\r
+  const char *from = *fromP;\r
+  while (from != fromLim && to != toLim) {\r
+    switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) {\r
+    case BT_LEAD2:\r
+      *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f));\r
+      from += 2;\r
+      break;\r
+    case BT_LEAD3:\r
+      *to++ = (unsigned short)(((from[0] & 0xf) << 12)\r
+                               | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f));\r
+      from += 3;\r
+      break;\r
+    case BT_LEAD4:\r
+      {\r
+        unsigned long n;\r
+        if (to + 1 == toLim)\r
+          goto after;\r
+        n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12)\r
+            | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f);\r
+        n -= 0x10000;\r
+        to[0] = (unsigned short)((n >> 10) | 0xD800);\r
+        to[1] = (unsigned short)((n & 0x3FF) | 0xDC00);\r
+        to += 2;\r
+        from += 4;\r
+      }\r
+      break;\r
+    default:\r
+      *to++ = *from++;\r
+      break;\r
+    }\r
+  }\r
+after:\r
+  *fromP = from;\r
+  *toP = to;\r
+}\r
+\r
+#ifdef XML_NS\r
+static const struct normal_encoding utf8_encoding_ns = {\r
+  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },\r
+  {\r
+#include "asciitab.h"\r
+#include "utf8tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)\r
+};\r
+#endif\r
+\r
+static const struct normal_encoding utf8_encoding = {\r
+  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "asciitab.h"\r
+#undef BT_COLON\r
+#include "utf8tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)\r
+};\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding internal_utf8_encoding_ns = {\r
+  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },\r
+  {\r
+#include "iasciitab.h"\r
+#include "utf8tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding internal_utf8_encoding = {\r
+  { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "iasciitab.h"\r
+#undef BT_COLON\r
+#include "utf8tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)\r
+};\r
+\r
+static void PTRCALL\r
+latin1_toUtf8(const ENCODING *enc,\r
+              const char **fromP, const char *fromLim,\r
+              char **toP, const char *toLim)\r
+{\r
+  for (;;) {\r
+    unsigned char c;\r
+    if (*fromP == fromLim)\r
+      break;\r
+    c = (unsigned char)**fromP;\r
+    if (c & 0x80) {\r
+      if (toLim - *toP < 2)\r
+        break;\r
+      *(*toP)++ = (char)((c >> 6) | UTF8_cval2);\r
+      *(*toP)++ = (char)((c & 0x3f) | 0x80);\r
+      (*fromP)++;\r
+    }\r
+    else {\r
+      if (*toP == toLim)\r
+        break;\r
+      *(*toP)++ = *(*fromP)++;\r
+    }\r
+  }\r
+}\r
+\r
+static void PTRCALL\r
+latin1_toUtf16(const ENCODING *enc,\r
+               const char **fromP, const char *fromLim,\r
+               unsigned short **toP, const unsigned short *toLim)\r
+{\r
+  while (*fromP != fromLim && *toP != toLim)\r
+    *(*toP)++ = (unsigned char)*(*fromP)++;\r
+}\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding latin1_encoding_ns = {\r
+  { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },\r
+  {\r
+#include "asciitab.h"\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding latin1_encoding = {\r
+  { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "asciitab.h"\r
+#undef BT_COLON\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(sb_)\r
+};\r
+\r
+static void PTRCALL\r
+ascii_toUtf8(const ENCODING *enc,\r
+             const char **fromP, const char *fromLim,\r
+             char **toP, const char *toLim)\r
+{\r
+  while (*fromP != fromLim && *toP != toLim)\r
+    *(*toP)++ = *(*fromP)++;\r
+}\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding ascii_encoding_ns = {\r
+  { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },\r
+  {\r
+#include "asciitab.h"\r
+/* BT_NONXML == 0 */\r
+  },\r
+  STANDARD_VTABLE(sb_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding ascii_encoding = {\r
+  { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "asciitab.h"\r
+#undef BT_COLON\r
+/* BT_NONXML == 0 */\r
+  },\r
+  STANDARD_VTABLE(sb_)\r
+};\r
+\r
+static int PTRFASTCALL\r
+unicode_byte_type(char hi, char lo)\r
+{\r
+  switch ((unsigned char)hi) {\r
+  case 0xD8: case 0xD9: case 0xDA: case 0xDB:\r
+    return BT_LEAD4;\r
+  case 0xDC: case 0xDD: case 0xDE: case 0xDF:\r
+    return BT_TRAIL;\r
+  case 0xFF:\r
+    switch ((unsigned char)lo) {\r
+    case 0xFF:\r
+    case 0xFE:\r
+      return BT_NONXML;\r
+    }\r
+    break;\r
+  }\r
+  return BT_NONASCII;\r
+}\r
+\r
+#define DEFINE_UTF16_TO_UTF8(E) \\r
+static void  PTRCALL \\r
+E ## toUtf8(const ENCODING *enc, \\r
+            const char **fromP, const char *fromLim, \\r
+            char **toP, const char *toLim) \\r
+{ \\r
+  const char *from; \\r
+  for (from = *fromP; from != fromLim; from += 2) { \\r
+    int plane; \\r
+    unsigned char lo2; \\r
+    unsigned char lo = GET_LO(from); \\r
+    unsigned char hi = GET_HI(from); \\r
+    switch (hi) { \\r
+    case 0: \\r
+      if (lo < 0x80) { \\r
+        if (*toP == toLim) { \\r
+          *fromP = from; \\r
+          return; \\r
+        } \\r
+        *(*toP)++ = lo; \\r
+        break; \\r
+      } \\r
+      /* fall through */ \\r
+    case 0x1: case 0x2: case 0x3: \\r
+    case 0x4: case 0x5: case 0x6: case 0x7: \\r
+      if (toLim -  *toP < 2) { \\r
+        *fromP = from; \\r
+        return; \\r
+      } \\r
+      *(*toP)++ = ((lo >> 6) | (hi << 2) |  UTF8_cval2); \\r
+      *(*toP)++ = ((lo & 0x3f) | 0x80); \\r
+      break; \\r
+    default: \\r
+      if (toLim -  *toP < 3)  { \\r
+        *fromP = from; \\r
+        return; \\r
+      } \\r
+      /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \\r
+      *(*toP)++ = ((hi >> 4) | UTF8_cval3); \\r
+      *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \\r
+      *(*toP)++ = ((lo & 0x3f) | 0x80); \\r
+      break; \\r
+    case 0xD8: case 0xD9: case 0xDA: case 0xDB: \\r
+      if (toLim -  *toP < 4) { \\r
+        *fromP = from; \\r
+        return; \\r
+      } \\r
+      plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \\r
+      *(*toP)++ = ((plane >> 2) | UTF8_cval4); \\r
+      *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \\r
+      from += 2; \\r
+      lo2 = GET_LO(from); \\r
+      *(*toP)++ = (((lo & 0x3) << 4) \\r
+                   | ((GET_HI(from) & 0x3) << 2) \\r
+                   | (lo2 >> 6) \\r
+                   | 0x80); \\r
+      *(*toP)++ = ((lo2 & 0x3f) | 0x80); \\r
+      break; \\r
+    } \\r
+  } \\r
+  *fromP = from; \\r
+}\r
+\r
+#define DEFINE_UTF16_TO_UTF16(E) \\r
+static void  PTRCALL \\r
+E ## toUtf16(const ENCODING *enc, \\r
+             const char **fromP, const char *fromLim, \\r
+             unsigned short **toP, const unsigned short *toLim) \\r
+{ \\r
+  /* Avoid copying first half only of surrogate */ \\r
+  if (fromLim - *fromP > ((toLim - *toP) << 1) \\r
+      && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) \\r
+    fromLim -= 2; \\r
+  for (; *fromP != fromLim && *toP != toLim; *fromP += 2) \\r
+    *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \\r
+}\r
+\r
+#define SET2(ptr, ch) \\r
+  (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8)))\r
+#define GET_LO(ptr) ((unsigned char)(ptr)[0])\r
+#define GET_HI(ptr) ((unsigned char)(ptr)[1])\r
+\r
+DEFINE_UTF16_TO_UTF8(little2_)\r
+DEFINE_UTF16_TO_UTF16(little2_)\r
+\r
+#undef SET2\r
+#undef GET_LO\r
+#undef GET_HI\r
+\r
+#define SET2(ptr, ch) \\r
+  (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF)))\r
+#define GET_LO(ptr) ((unsigned char)(ptr)[1])\r
+#define GET_HI(ptr) ((unsigned char)(ptr)[0])\r
+\r
+DEFINE_UTF16_TO_UTF8(big2_)\r
+DEFINE_UTF16_TO_UTF16(big2_)\r
+\r
+#undef SET2\r
+#undef GET_LO\r
+#undef GET_HI\r
+\r
+#define LITTLE2_BYTE_TYPE(enc, p) \\r
+ ((p)[1] == 0 \\r
+  ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \\r
+  : unicode_byte_type((p)[1], (p)[0]))\r
+#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1)\r
+#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c)\r
+#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \\r
+  UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])\r
+#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \\r
+  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0])\r
+\r
+#ifdef XML_MIN_SIZE\r
+\r
+static int PTRFASTCALL\r
+little2_byteType(const ENCODING *enc, const char *p)\r
+{\r
+  return LITTLE2_BYTE_TYPE(enc, p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+little2_byteToAscii(const ENCODING *enc, const char *p)\r
+{\r
+  return LITTLE2_BYTE_TO_ASCII(enc, p);\r
+}\r
+\r
+static int PTRCALL\r
+little2_charMatches(const ENCODING *enc, const char *p, int c)\r
+{\r
+  return LITTLE2_CHAR_MATCHES(enc, p, c);\r
+}\r
+\r
+static int PTRFASTCALL\r
+little2_isNameMin(const ENCODING *enc, const char *p)\r
+{\r
+  return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+little2_isNmstrtMin(const ENCODING *enc, const char *p)\r
+{\r
+  return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p);\r
+}\r
+\r
+#undef VTABLE\r
+#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16\r
+\r
+#else /* not XML_MIN_SIZE */\r
+\r
+#undef PREFIX\r
+#define PREFIX(ident) little2_ ## ident\r
+#define MINBPC(enc) 2\r
+/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */\r
+#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p)\r
+#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p)\r
+#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c)\r
+#define IS_NAME_CHAR(enc, p, n) 0\r
+#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p)\r
+#define IS_NMSTRT_CHAR(enc, p, n) (0)\r
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p)\r
+\r
+#define XML_TOK_IMPL_C\r
+#include "xmltok_impl.c"\r
+#undef XML_TOK_IMPL_C\r
+\r
+#undef MINBPC\r
+#undef BYTE_TYPE\r
+#undef BYTE_TO_ASCII\r
+#undef CHAR_MATCHES\r
+#undef IS_NAME_CHAR\r
+#undef IS_NAME_CHAR_MINBPC\r
+#undef IS_NMSTRT_CHAR\r
+#undef IS_NMSTRT_CHAR_MINBPC\r
+#undef IS_INVALID_CHAR\r
+\r
+#endif /* not XML_MIN_SIZE */\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding little2_encoding_ns = {\r
+  { VTABLE, 2, 0,\r
+#if BYTEORDER == 1234\r
+    1\r
+#else\r
+    0\r
+#endif\r
+  },\r
+  {\r
+#include "asciitab.h"\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(little2_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding little2_encoding = {\r
+  { VTABLE, 2, 0,\r
+#if BYTEORDER == 1234\r
+    1\r
+#else\r
+    0\r
+#endif\r
+  },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "asciitab.h"\r
+#undef BT_COLON\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(little2_)\r
+};\r
+\r
+#if BYTEORDER != 4321\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding internal_little2_encoding_ns = {\r
+  { VTABLE, 2, 0, 1 },\r
+  {\r
+#include "iasciitab.h"\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(little2_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding internal_little2_encoding = {\r
+  { VTABLE, 2, 0, 1 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "iasciitab.h"\r
+#undef BT_COLON\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(little2_)\r
+};\r
+\r
+#endif\r
+\r
+\r
+#define BIG2_BYTE_TYPE(enc, p) \\r
+ ((p)[0] == 0 \\r
+  ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \\r
+  : unicode_byte_type((p)[0], (p)[1]))\r
+#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1)\r
+#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c)\r
+#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \\r
+  UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])\r
+#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \\r
+  UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1])\r
+\r
+#ifdef XML_MIN_SIZE\r
+\r
+static int PTRFASTCALL\r
+big2_byteType(const ENCODING *enc, const char *p)\r
+{\r
+  return BIG2_BYTE_TYPE(enc, p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+big2_byteToAscii(const ENCODING *enc, const char *p)\r
+{\r
+  return BIG2_BYTE_TO_ASCII(enc, p);\r
+}\r
+\r
+static int PTRCALL\r
+big2_charMatches(const ENCODING *enc, const char *p, int c)\r
+{\r
+  return BIG2_CHAR_MATCHES(enc, p, c);\r
+}\r
+\r
+static int PTRFASTCALL\r
+big2_isNameMin(const ENCODING *enc, const char *p)\r
+{\r
+  return BIG2_IS_NAME_CHAR_MINBPC(enc, p);\r
+}\r
+\r
+static int PTRFASTCALL\r
+big2_isNmstrtMin(const ENCODING *enc, const char *p)\r
+{\r
+  return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p);\r
+}\r
+\r
+#undef VTABLE\r
+#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16\r
+\r
+#else /* not XML_MIN_SIZE */\r
+\r
+#undef PREFIX\r
+#define PREFIX(ident) big2_ ## ident\r
+#define MINBPC(enc) 2\r
+/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */\r
+#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p)\r
+#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p)\r
+#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c)\r
+#define IS_NAME_CHAR(enc, p, n) 0\r
+#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p)\r
+#define IS_NMSTRT_CHAR(enc, p, n) (0)\r
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p)\r
+\r
+#define XML_TOK_IMPL_C\r
+#include "xmltok_impl.c"\r
+#undef XML_TOK_IMPL_C\r
+\r
+#undef MINBPC\r
+#undef BYTE_TYPE\r
+#undef BYTE_TO_ASCII\r
+#undef CHAR_MATCHES\r
+#undef IS_NAME_CHAR\r
+#undef IS_NAME_CHAR_MINBPC\r
+#undef IS_NMSTRT_CHAR\r
+#undef IS_NMSTRT_CHAR_MINBPC\r
+#undef IS_INVALID_CHAR\r
+\r
+#endif /* not XML_MIN_SIZE */\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding big2_encoding_ns = {\r
+  { VTABLE, 2, 0,\r
+#if BYTEORDER == 4321\r
+  1\r
+#else\r
+  0\r
+#endif\r
+  },\r
+  {\r
+#include "asciitab.h"\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(big2_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding big2_encoding = {\r
+  { VTABLE, 2, 0,\r
+#if BYTEORDER == 4321\r
+  1\r
+#else\r
+  0\r
+#endif\r
+  },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "asciitab.h"\r
+#undef BT_COLON\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(big2_)\r
+};\r
+\r
+#if BYTEORDER != 1234\r
+\r
+#ifdef XML_NS\r
+\r
+static const struct normal_encoding internal_big2_encoding_ns = {\r
+  { VTABLE, 2, 0, 1 },\r
+  {\r
+#include "iasciitab.h"\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(big2_)\r
+};\r
+\r
+#endif\r
+\r
+static const struct normal_encoding internal_big2_encoding = {\r
+  { VTABLE, 2, 0, 1 },\r
+  {\r
+#define BT_COLON BT_NMSTRT\r
+#include "iasciitab.h"\r
+#undef BT_COLON\r
+#include "latin1tab.h"\r
+  },\r
+  STANDARD_VTABLE(big2_)\r
+};\r
+\r
+#endif\r
+\r
+#undef PREFIX\r
+\r
+static int FASTCALL\r
+streqci(const char *s1, const char *s2)\r
+{\r
+  for (;;) {\r
+    char c1 = *s1++;\r
+    char c2 = *s2++;\r
+    if (ASCII_a <= c1 && c1 <= ASCII_z)\r
+      c1 += ASCII_A - ASCII_a;\r
+    if (ASCII_a <= c2 && c2 <= ASCII_z)\r
+      c2 += ASCII_A - ASCII_a;\r
+    if (c1 != c2)\r
+      return 0;\r
+    if (!c1)\r
+      break;\r
+  }\r
+  return 1;\r
+}\r
+\r
+static void PTRCALL\r
+initUpdatePosition(const ENCODING *enc, const char *ptr,\r
+                   const char *end, POSITION *pos)\r
+{\r
+  normal_updatePosition(&utf8_encoding.enc, ptr, end, pos);\r
+}\r
+\r
+static int\r
+toAscii(const ENCODING *enc, const char *ptr, const char *end)\r
+{\r
+  char buf[1];\r
+  char *p = buf;\r
+  XmlUtf8Convert(enc, &ptr, end, &p, p + 1);\r
+  if (p == buf)\r
+    return -1;\r
+  else\r
+    return buf[0];\r
+}\r
+\r
+static int FASTCALL\r
+isSpace(int c)\r
+{\r
+  switch (c) {\r
+  case 0x20:\r
+  case 0xD:\r
+  case 0xA:\r
+  case 0x9:\r
+    return 1;\r
+  }\r
+  return 0;\r
+}\r
+\r
+/* Return 1 if there's just optional white space or there's an S\r
+   followed by name=val.\r
+*/\r
+static int\r
+parsePseudoAttribute(const ENCODING *enc,\r
+                     const char *ptr,\r
+                     const char *end,\r
+                     const char **namePtr,\r
+                     const char **nameEndPtr,\r
+                     const char **valPtr,\r
+                     const char **nextTokPtr)\r
+{\r
+  int c;\r
+  char open;\r
+  if (ptr == end) {\r
+    *namePtr = NULL;\r
+    return 1;\r
+  }\r
+  if (!isSpace(toAscii(enc, ptr, end))) {\r
+    *nextTokPtr = ptr;\r
+    return 0;\r
+  }\r
+  do {\r
+    ptr += enc->minBytesPerChar;\r
+  } while (isSpace(toAscii(enc, ptr, end)));\r
+  if (ptr == end) {\r
+    *namePtr = NULL;\r
+    return 1;\r
+  }\r
+  *namePtr = ptr;\r
+  for (;;) {\r
+    c = toAscii(enc, ptr, end);\r
+    if (c == -1) {\r
+      *nextTokPtr = ptr;\r
+      return 0;\r
+    }\r
+    if (c == ASCII_EQUALS) {\r
+      *nameEndPtr = ptr;\r
+      break;\r
+    }\r
+    if (isSpace(c)) {\r
+      *nameEndPtr = ptr;\r
+      do {\r
+        ptr += enc->minBytesPerChar;\r
+      } while (isSpace(c = toAscii(enc, ptr, end)));\r
+      if (c != ASCII_EQUALS) {\r
+        *nextTokPtr = ptr;\r
+        return 0;\r
+      }\r
+      break;\r
+    }\r
+    ptr += enc->minBytesPerChar;\r
+  }\r
+  if (ptr == *namePtr) {\r
+    *nextTokPtr = ptr;\r
+    return 0;\r
+  }\r
+  ptr += enc->minBytesPerChar;\r
+  c = toAscii(enc, ptr, end);\r
+  while (isSpace(c)) {\r
+    ptr += enc->minBytesPerChar;\r
+    c = toAscii(enc, ptr, end);\r
+  }\r
+  if (c != ASCII_QUOT && c != ASCII_APOS) {\r
+    *nextTokPtr = ptr;\r
+    return 0;\r
+  }\r
+  open = (char)c;\r
+  ptr += enc->minBytesPerChar;\r
+  *valPtr = ptr;\r
+  for (;; ptr += enc->minBytesPerChar) {\r
+    c = toAscii(enc, ptr, end);\r
+    if (c == open)\r
+      break;\r
+    if (!(ASCII_a <= c && c <= ASCII_z)\r
+        && !(ASCII_A <= c && c <= ASCII_Z)\r
+        && !(ASCII_0 <= c && c <= ASCII_9)\r
+        && c != ASCII_PERIOD\r
+        && c != ASCII_MINUS\r
+        && c != ASCII_UNDERSCORE) {\r
+      *nextTokPtr = ptr;\r
+      return 0;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr + enc->minBytesPerChar;\r
+  return 1;\r
+}\r
+\r
+static const char KW_version[] = {\r
+  ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0'\r
+};\r
+\r
+static const char KW_encoding[] = {\r
+  ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0'\r
+};\r
+\r
+static const char KW_standalone[] = {\r
+  ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o,\r
+  ASCII_n, ASCII_e, '\0'\r
+};\r
+\r
+static const char KW_yes[] = {\r
+  ASCII_y, ASCII_e, ASCII_s,  '\0'\r
+};\r
+\r
+static const char KW_no[] = {\r
+  ASCII_n, ASCII_o,  '\0'\r
+};\r
+\r
+static int\r
+doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *,\r
+                                                 const char *,\r
+                                                 const char *),\r
+               int isGeneralTextEntity,\r
+               const ENCODING *enc,\r
+               const char *ptr,\r
+               const char *end,\r
+               const char **badPtr,\r
+               const char **versionPtr,\r
+               const char **versionEndPtr,\r
+               const char **encodingName,\r
+               const ENCODING **encoding,\r
+               int *standalone)\r
+{\r
+  const char *val = NULL;\r
+  const char *name = NULL;\r
+  const char *nameEnd = NULL;\r
+  ptr += 5 * enc->minBytesPerChar;\r
+  end -= 2 * enc->minBytesPerChar;\r
+  if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)\r
+      || !name) {\r
+    *badPtr = ptr;\r
+    return 0;\r
+  }\r
+  if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) {\r
+    if (!isGeneralTextEntity) {\r
+      *badPtr = name;\r
+      return 0;\r
+    }\r
+  }\r
+  else {\r
+    if (versionPtr)\r
+      *versionPtr = val;\r
+    if (versionEndPtr)\r
+      *versionEndPtr = ptr;\r
+    if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {\r
+      *badPtr = ptr;\r
+      return 0;\r
+    }\r
+    if (!name) {\r
+      if (isGeneralTextEntity) {\r
+        /* a TextDecl must have an EncodingDecl */\r
+        *badPtr = ptr;\r
+        return 0;\r
+      }\r
+      return 1;\r
+    }\r
+  }\r
+  if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) {\r
+    int c = toAscii(enc, val, end);\r
+    if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) {\r
+      *badPtr = val;\r
+      return 0;\r
+    }\r
+    if (encodingName)\r
+      *encodingName = val;\r
+    if (encoding)\r
+      *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar);\r
+    if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {\r
+      *badPtr = ptr;\r
+      return 0;\r
+    }\r
+    if (!name)\r
+      return 1;\r
+  }\r
+  if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone)\r
+      || isGeneralTextEntity) {\r
+    *badPtr = name;\r
+    return 0;\r
+  }\r
+  if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) {\r
+    if (standalone)\r
+      *standalone = 1;\r
+  }\r
+  else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) {\r
+    if (standalone)\r
+      *standalone = 0;\r
+  }\r
+  else {\r
+    *badPtr = val;\r
+    return 0;\r
+  }\r
+  while (isSpace(toAscii(enc, ptr, end)))\r
+    ptr += enc->minBytesPerChar;\r
+  if (ptr != end) {\r
+    *badPtr = ptr;\r
+    return 0;\r
+  }\r
+  return 1;\r
+}\r
+\r
+static int FASTCALL\r
+checkCharRefNumber(int result)\r
+{\r
+  switch (result >> 8) {\r
+  case 0xD8: case 0xD9: case 0xDA: case 0xDB:\r
+  case 0xDC: case 0xDD: case 0xDE: case 0xDF:\r
+    return -1;\r
+  case 0:\r
+    if (latin1_encoding.type[result] == BT_NONXML)\r
+      return -1;\r
+    break;\r
+  case 0xFF:\r
+    if (result == 0xFFFE || result == 0xFFFF)\r
+      return -1;\r
+    break;\r
+  }\r
+  return result;\r
+}\r
+\r
+int FASTCALL\r
+XmlUtf8Encode(int c, char *buf)\r
+{\r
+  enum {\r
+    /* minN is minimum legal resulting value for N byte sequence */\r
+    min2 = 0x80,\r
+    min3 = 0x800,\r
+    min4 = 0x10000\r
+  };\r
+\r
+  if (c < 0)\r
+    return 0;\r
+  if (c < min2) {\r
+    buf[0] = (char)(c | UTF8_cval1);\r
+    return 1;\r
+  }\r
+  if (c < min3) {\r
+    buf[0] = (char)((c >> 6) | UTF8_cval2);\r
+    buf[1] = (char)((c & 0x3f) | 0x80);\r
+    return 2;\r
+  }\r
+  if (c < min4) {\r
+    buf[0] = (char)((c >> 12) | UTF8_cval3);\r
+    buf[1] = (char)(((c >> 6) & 0x3f) | 0x80);\r
+    buf[2] = (char)((c & 0x3f) | 0x80);\r
+    return 3;\r
+  }\r
+  if (c < 0x110000) {\r
+    buf[0] = (char)((c >> 18) | UTF8_cval4);\r
+    buf[1] = (char)(((c >> 12) & 0x3f) | 0x80);\r
+    buf[2] = (char)(((c >> 6) & 0x3f) | 0x80);\r
+    buf[3] = (char)((c & 0x3f) | 0x80);\r
+    return 4;\r
+  }\r
+  return 0;\r
+}\r
+\r
+int FASTCALL\r
+XmlUtf16Encode(int charNum, unsigned short *buf)\r
+{\r
+  if (charNum < 0)\r
+    return 0;\r
+  if (charNum < 0x10000) {\r
+    buf[0] = (unsigned short)charNum;\r
+    return 1;\r
+  }\r
+  if (charNum < 0x110000) {\r
+    charNum -= 0x10000;\r
+    buf[0] = (unsigned short)((charNum >> 10) + 0xD800);\r
+    buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00);\r
+    return 2;\r
+  }\r
+  return 0;\r
+}\r
+\r
+struct unknown_encoding {\r
+  struct normal_encoding normal;\r
+  CONVERTER convert;\r
+  void *userData;\r
+  unsigned short utf16[256];\r
+  char utf8[256][4];\r
+};\r
+\r
+#define AS_UNKNOWN_ENCODING(enc)  ((const struct unknown_encoding *) (enc))\r
+\r
+int\r
+XmlSizeOfUnknownEncoding(void)\r
+{\r
+  return sizeof(struct unknown_encoding);\r
+}\r
+\r
+static int PTRFASTCALL\r
+unknown_isName(const ENCODING *enc, const char *p)\r
+{\r
+  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);\r
+  int c = uenc->convert(uenc->userData, p);\r
+  if (c & ~0xFFFF)\r
+    return 0;\r
+  return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF);\r
+}\r
+\r
+static int PTRFASTCALL\r
+unknown_isNmstrt(const ENCODING *enc, const char *p)\r
+{\r
+  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);\r
+  int c = uenc->convert(uenc->userData, p);\r
+  if (c & ~0xFFFF)\r
+    return 0;\r
+  return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF);\r
+}\r
+\r
+static int PTRFASTCALL\r
+unknown_isInvalid(const ENCODING *enc, const char *p)\r
+{\r
+  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);\r
+  int c = uenc->convert(uenc->userData, p);\r
+  return (c & ~0xFFFF) || checkCharRefNumber(c) < 0;\r
+}\r
+\r
+static void PTRCALL\r
+unknown_toUtf8(const ENCODING *enc,\r
+               const char **fromP, const char *fromLim,\r
+               char **toP, const char *toLim)\r
+{\r
+  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);\r
+  char buf[XML_UTF8_ENCODE_MAX];\r
+  for (;;) {\r
+    const char *utf8;\r
+    int n;\r
+    if (*fromP == fromLim)\r
+      break;\r
+    utf8 = uenc->utf8[(unsigned char)**fromP];\r
+    n = *utf8++;\r
+    if (n == 0) {\r
+      int c = uenc->convert(uenc->userData, *fromP);\r
+      n = XmlUtf8Encode(c, buf);\r
+      if (n > toLim - *toP)\r
+        break;\r
+      utf8 = buf;\r
+      *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]\r
+                 - (BT_LEAD2 - 2));\r
+    }\r
+    else {\r
+      if (n > toLim - *toP)\r
+        break;\r
+      (*fromP)++;\r
+    }\r
+    do {\r
+      *(*toP)++ = *utf8++;\r
+    } while (--n != 0);\r
+  }\r
+}\r
+\r
+static void PTRCALL\r
+unknown_toUtf16(const ENCODING *enc,\r
+                const char **fromP, const char *fromLim,\r
+                unsigned short **toP, const unsigned short *toLim)\r
+{\r
+  const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);\r
+  while (*fromP != fromLim && *toP != toLim) {\r
+    unsigned short c = uenc->utf16[(unsigned char)**fromP];\r
+    if (c == 0) {\r
+      c = (unsigned short)\r
+          uenc->convert(uenc->userData, *fromP);\r
+      *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]\r
+                 - (BT_LEAD2 - 2));\r
+    }\r
+    else\r
+      (*fromP)++;\r
+    *(*toP)++ = c;\r
+  }\r
+}\r
+\r
+ENCODING *\r
+XmlInitUnknownEncoding(void *mem,\r
+                       int *table,\r
+                       CONVERTER convert,\r
+                       void *userData)\r
+{\r
+  int i;\r
+  struct unknown_encoding *e = (struct unknown_encoding *)mem;\r
+  for (i = 0; i < (int)sizeof(struct normal_encoding); i++)\r
+    ((char *)mem)[i] = ((char *)&latin1_encoding)[i];\r
+  for (i = 0; i < 128; i++)\r
+    if (latin1_encoding.type[i] != BT_OTHER\r
+        && latin1_encoding.type[i] != BT_NONXML\r
+        && table[i] != i)\r
+      return 0;\r
+  for (i = 0; i < 256; i++) {\r
+    int c = table[i];\r
+    if (c == -1) {\r
+      e->normal.type[i] = BT_MALFORM;\r
+      /* This shouldn't really get used. */\r
+      e->utf16[i] = 0xFFFF;\r
+      e->utf8[i][0] = 1;\r
+      e->utf8[i][1] = 0;\r
+    }\r
+    else if (c < 0) {\r
+      if (c < -4)\r
+        return 0;\r
+      e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2));\r
+      e->utf8[i][0] = 0;\r
+      e->utf16[i] = 0;\r
+    }\r
+    else if (c < 0x80) {\r
+      if (latin1_encoding.type[c] != BT_OTHER\r
+          && latin1_encoding.type[c] != BT_NONXML\r
+          && c != i)\r
+        return 0;\r
+      e->normal.type[i] = latin1_encoding.type[c];\r
+      e->utf8[i][0] = 1;\r
+      e->utf8[i][1] = (char)c;\r
+      e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c);\r
+    }\r
+    else if (checkCharRefNumber(c) < 0) {\r
+      e->normal.type[i] = BT_NONXML;\r
+      /* This shouldn't really get used. */\r
+      e->utf16[i] = 0xFFFF;\r
+      e->utf8[i][0] = 1;\r
+      e->utf8[i][1] = 0;\r
+    }\r
+    else {\r
+      if (c > 0xFFFF)\r
+        return 0;\r
+      if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff))\r
+        e->normal.type[i] = BT_NMSTRT;\r
+      else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff))\r
+        e->normal.type[i] = BT_NAME;\r
+      else\r
+        e->normal.type[i] = BT_OTHER;\r
+      e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1);\r
+      e->utf16[i] = (unsigned short)c;\r
+    }\r
+  }\r
+  e->userData = userData;\r
+  e->convert = convert;\r
+  if (convert) {\r
+    e->normal.isName2 = unknown_isName;\r
+    e->normal.isName3 = unknown_isName;\r
+    e->normal.isName4 = unknown_isName;\r
+    e->normal.isNmstrt2 = unknown_isNmstrt;\r
+    e->normal.isNmstrt3 = unknown_isNmstrt;\r
+    e->normal.isNmstrt4 = unknown_isNmstrt;\r
+    e->normal.isInvalid2 = unknown_isInvalid;\r
+    e->normal.isInvalid3 = unknown_isInvalid;\r
+    e->normal.isInvalid4 = unknown_isInvalid;\r
+  }\r
+  e->normal.enc.utf8Convert = unknown_toUtf8;\r
+  e->normal.enc.utf16Convert = unknown_toUtf16;\r
+  return &(e->normal.enc);\r
+}\r
+\r
+/* If this enumeration is changed, getEncodingIndex and encodings\r
+must also be changed. */\r
+enum {\r
+  UNKNOWN_ENC = -1,\r
+  ISO_8859_1_ENC = 0,\r
+  US_ASCII_ENC,\r
+  UTF_8_ENC,\r
+  UTF_16_ENC,\r
+  UTF_16BE_ENC,\r
+  UTF_16LE_ENC,\r
+  /* must match encodingNames up to here */\r
+  NO_ENC\r
+};\r
+\r
+static const char KW_ISO_8859_1[] = {\r
+  ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9,\r
+  ASCII_MINUS, ASCII_1, '\0'\r
+};\r
+static const char KW_US_ASCII[] = {\r
+  ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I,\r
+  '\0'\r
+};\r
+static const char KW_UTF_8[] =  {\r
+  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0'\r
+};\r
+static const char KW_UTF_16[] = {\r
+  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0'\r
+};\r
+static const char KW_UTF_16BE[] = {\r
+  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E,\r
+  '\0'\r
+};\r
+static const char KW_UTF_16LE[] = {\r
+  ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E,\r
+  '\0'\r
+};\r
+\r
+static int FASTCALL\r
+getEncodingIndex(const char *name)\r
+{\r
+  static const char * const encodingNames[] = {\r
+    KW_ISO_8859_1,\r
+    KW_US_ASCII,\r
+    KW_UTF_8,\r
+    KW_UTF_16,\r
+    KW_UTF_16BE,\r
+    KW_UTF_16LE,\r
+  };\r
+  int i;\r
+  if (name == NULL)\r
+    return NO_ENC;\r
+  for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++)\r
+    if (streqci(name, encodingNames[i]))\r
+      return i;\r
+  return UNKNOWN_ENC;\r
+}\r
+\r
+/* For binary compatibility, we store the index of the encoding\r
+   specified at initialization in the isUtf16 member.\r
+*/\r
+\r
+#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16)\r
+#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i)\r
+\r
+/* This is what detects the encoding.  encodingTable maps from\r
+   encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of\r
+   the external (protocol) specified encoding; state is\r
+   XML_CONTENT_STATE if we're parsing an external text entity, and\r
+   XML_PROLOG_STATE otherwise.\r
+*/\r
+\r
+\r
+static int\r
+initScan(const ENCODING * const *encodingTable,\r
+         const INIT_ENCODING *enc,\r
+         int state,\r
+         const char *ptr,\r
+         const char *end,\r
+         const char **nextTokPtr)\r
+{\r
+  const ENCODING **encPtr;\r
+\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  encPtr = enc->encPtr;\r
+  if (ptr + 1 == end) {\r
+    /* only a single byte available for auto-detection */\r
+#ifndef XML_DTD /* FIXME */\r
+    /* a well-formed document entity must have more than one byte */\r
+    if (state != XML_CONTENT_STATE)\r
+      return XML_TOK_PARTIAL;\r
+#endif\r
+    /* so we're parsing an external text entity... */\r
+    /* if UTF-16 was externally specified, then we need at least 2 bytes */\r
+    switch (INIT_ENC_INDEX(enc)) {\r
+    case UTF_16_ENC:\r
+    case UTF_16LE_ENC:\r
+    case UTF_16BE_ENC:\r
+      return XML_TOK_PARTIAL;\r
+    }\r
+    switch ((unsigned char)*ptr) {\r
+    case 0xFE:\r
+    case 0xFF:\r
+    case 0xEF: /* possibly first byte of UTF-8 BOM */\r
+      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC\r
+          && state == XML_CONTENT_STATE)\r
+        break;\r
+      /* fall through */\r
+    case 0x00:\r
+    case 0x3C:\r
+      return XML_TOK_PARTIAL;\r
+    }\r
+  }\r
+  else {\r
+    switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) {\r
+    case 0xFEFF:\r
+      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC\r
+          && state == XML_CONTENT_STATE)\r
+        break;\r
+      *nextTokPtr = ptr + 2;\r
+      *encPtr = encodingTable[UTF_16BE_ENC];\r
+      return XML_TOK_BOM;\r
+    /* 00 3C is handled in the default case */\r
+    case 0x3C00:\r
+      if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC\r
+           || INIT_ENC_INDEX(enc) == UTF_16_ENC)\r
+          && state == XML_CONTENT_STATE)\r
+        break;\r
+      *encPtr = encodingTable[UTF_16LE_ENC];\r
+      return XmlTok(*encPtr, state, ptr, end, nextTokPtr);\r
+    case 0xFFFE:\r
+      if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC\r
+          && state == XML_CONTENT_STATE)\r
+        break;\r
+      *nextTokPtr = ptr + 2;\r
+      *encPtr = encodingTable[UTF_16LE_ENC];\r
+      return XML_TOK_BOM;\r
+    case 0xEFBB:\r
+      /* Maybe a UTF-8 BOM (EF BB BF) */\r
+      /* If there's an explicitly specified (external) encoding\r
+         of ISO-8859-1 or some flavour of UTF-16\r
+         and this is an external text entity,\r
+         don't look for the BOM,\r
+         because it might be a legal data.\r
+      */\r
+      if (state == XML_CONTENT_STATE) {\r
+        int e = INIT_ENC_INDEX(enc);\r
+        if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC\r
+            || e == UTF_16LE_ENC || e == UTF_16_ENC)\r
+          break;\r
+      }\r
+      if (ptr + 2 == end)\r
+        return XML_TOK_PARTIAL;\r
+      if ((unsigned char)ptr[2] == 0xBF) {\r
+        *nextTokPtr = ptr + 3;\r
+        *encPtr = encodingTable[UTF_8_ENC];\r
+        return XML_TOK_BOM;\r
+      }\r
+      break;\r
+    default:\r
+      if (ptr[0] == '\0') {\r
+        /* 0 isn't a legal data character. Furthermore a document\r
+           entity can only start with ASCII characters.  So the only\r
+           way this can fail to be big-endian UTF-16 is if it is an\r
+           external parsed general entity that's labelled as\r
+           UTF-16LE.\r
+        */\r
+        if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC)\r
+          break;\r
+        *encPtr = encodingTable[UTF_16BE_ENC];\r
+        return XmlTok(*encPtr, state, ptr, end, nextTokPtr);\r
+      }\r
+      else if (ptr[1] == '\0') {\r
+        /* We could recover here in the case:\r
+            - parsing an external entity\r
+            - second byte is 0\r
+            - no externally specified encoding\r
+            - no encoding declaration\r
+           by assuming UTF-16LE.  But we don't, because this would mean when\r
+           presented just with a single byte, we couldn't reliably determine\r
+           whether we needed further bytes.\r
+        */\r
+        if (state == XML_CONTENT_STATE)\r
+          break;\r
+        *encPtr = encodingTable[UTF_16LE_ENC];\r
+        return XmlTok(*encPtr, state, ptr, end, nextTokPtr);\r
+      }\r
+      break;\r
+    }\r
+  }\r
+  *encPtr = encodingTable[INIT_ENC_INDEX(enc)];\r
+  return XmlTok(*encPtr, state, ptr, end, nextTokPtr);\r
+}\r
+\r
+\r
+#define NS(x) x\r
+#define ns(x) x\r
+#define XML_TOK_NS_C\r
+#include "xmltok_ns.c"\r
+#undef XML_TOK_NS_C\r
+#undef NS\r
+#undef ns\r
+\r
+#ifdef XML_NS\r
+\r
+#define NS(x) x ## NS\r
+#define ns(x) x ## _ns\r
+\r
+#define XML_TOK_NS_C\r
+#include "xmltok_ns.c"\r
+#undef XML_TOK_NS_C\r
+\r
+#undef NS\r
+#undef ns\r
+\r
+ENCODING *\r
+XmlInitUnknownEncodingNS(void *mem,\r
+                         int *table,\r
+                         CONVERTER convert,\r
+                         void *userData)\r
+{\r
+  ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData);\r
+  if (enc)\r
+    ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON;\r
+  return enc;\r
+}\r
+\r
+#endif /* XML_NS */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok.h
new file mode 100644 (file)
index 0000000..497611f
--- /dev/null
@@ -0,0 +1,316 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+#ifndef XmlTok_INCLUDED\r
+#define XmlTok_INCLUDED 1\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/* The following token may be returned by XmlContentTok */\r
+#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be\r
+                                    start of illegal ]]> sequence */\r
+/* The following tokens may be returned by both XmlPrologTok and\r
+   XmlContentTok.\r
+*/\r
+#define XML_TOK_NONE -4          /* The string to be scanned is empty */\r
+#define XML_TOK_TRAILING_CR -3   /* A CR at the end of the scan;\r
+                                    might be part of CRLF sequence */\r
+#define XML_TOK_PARTIAL_CHAR -2  /* only part of a multibyte sequence */\r
+#define XML_TOK_PARTIAL -1       /* only part of a token */\r
+#define XML_TOK_INVALID 0\r
+\r
+/* The following tokens are returned by XmlContentTok; some are also\r
+   returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok.\r
+*/\r
+#define XML_TOK_START_TAG_WITH_ATTS 1\r
+#define XML_TOK_START_TAG_NO_ATTS 2\r
+#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag <e/> */\r
+#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4\r
+#define XML_TOK_END_TAG 5\r
+#define XML_TOK_DATA_CHARS 6\r
+#define XML_TOK_DATA_NEWLINE 7\r
+#define XML_TOK_CDATA_SECT_OPEN 8\r
+#define XML_TOK_ENTITY_REF 9\r
+#define XML_TOK_CHAR_REF 10               /* numeric character reference */\r
+\r
+/* The following tokens may be returned by both XmlPrologTok and\r
+   XmlContentTok.\r
+*/\r
+#define XML_TOK_PI 11                     /* processing instruction */\r
+#define XML_TOK_XML_DECL 12               /* XML decl or text decl */\r
+#define XML_TOK_COMMENT 13\r
+#define XML_TOK_BOM 14                    /* Byte order mark */\r
+\r
+/* The following tokens are returned only by XmlPrologTok */\r
+#define XML_TOK_PROLOG_S 15\r
+#define XML_TOK_DECL_OPEN 16              /* <!foo */\r
+#define XML_TOK_DECL_CLOSE 17             /* > */\r
+#define XML_TOK_NAME 18\r
+#define XML_TOK_NMTOKEN 19\r
+#define XML_TOK_POUND_NAME 20             /* #name */\r
+#define XML_TOK_OR 21                     /* | */\r
+#define XML_TOK_PERCENT 22\r
+#define XML_TOK_OPEN_PAREN 23\r
+#define XML_TOK_CLOSE_PAREN 24\r
+#define XML_TOK_OPEN_BRACKET 25\r
+#define XML_TOK_CLOSE_BRACKET 26\r
+#define XML_TOK_LITERAL 27\r
+#define XML_TOK_PARAM_ENTITY_REF 28\r
+#define XML_TOK_INSTANCE_START 29\r
+\r
+/* The following occur only in element type declarations */\r
+#define XML_TOK_NAME_QUESTION 30          /* name? */\r
+#define XML_TOK_NAME_ASTERISK 31          /* name* */\r
+#define XML_TOK_NAME_PLUS 32              /* name+ */\r
+#define XML_TOK_COND_SECT_OPEN 33         /* <![ */\r
+#define XML_TOK_COND_SECT_CLOSE 34        /* ]]> */\r
+#define XML_TOK_CLOSE_PAREN_QUESTION 35   /* )? */\r
+#define XML_TOK_CLOSE_PAREN_ASTERISK 36   /* )* */\r
+#define XML_TOK_CLOSE_PAREN_PLUS 37       /* )+ */\r
+#define XML_TOK_COMMA 38\r
+\r
+/* The following token is returned only by XmlAttributeValueTok */\r
+#define XML_TOK_ATTRIBUTE_VALUE_S 39\r
+\r
+/* The following token is returned only by XmlCdataSectionTok */\r
+#define XML_TOK_CDATA_SECT_CLOSE 40\r
+\r
+/* With namespace processing this is returned by XmlPrologTok for a\r
+   name with a colon.\r
+*/\r
+#define XML_TOK_PREFIXED_NAME 41\r
+\r
+#ifdef XML_DTD\r
+#define XML_TOK_IGNORE_SECT 42\r
+#endif /* XML_DTD */\r
+\r
+#ifdef XML_DTD\r
+#define XML_N_STATES 4\r
+#else /* not XML_DTD */\r
+#define XML_N_STATES 3\r
+#endif /* not XML_DTD */\r
+\r
+#define XML_PROLOG_STATE 0\r
+#define XML_CONTENT_STATE 1\r
+#define XML_CDATA_SECTION_STATE 2\r
+#ifdef XML_DTD\r
+#define XML_IGNORE_SECTION_STATE 3\r
+#endif /* XML_DTD */\r
+\r
+#define XML_N_LITERAL_TYPES 2\r
+#define XML_ATTRIBUTE_VALUE_LITERAL 0\r
+#define XML_ENTITY_VALUE_LITERAL 1\r
+\r
+/* The size of the buffer passed to XmlUtf8Encode must be at least this. */\r
+#define XML_UTF8_ENCODE_MAX 4\r
+/* The size of the buffer passed to XmlUtf16Encode must be at least this. */\r
+#define XML_UTF16_ENCODE_MAX 2\r
+\r
+typedef struct position {\r
+  /* first line and first column are 0 not 1 */\r
+  XML_Size lineNumber;\r
+  XML_Size columnNumber;\r
+} POSITION;\r
+\r
+typedef struct {\r
+  const char *name;\r
+  const char *valuePtr;\r
+  const char *valueEnd;\r
+  char normalized;\r
+} ATTRIBUTE;\r
+\r
+struct encoding;\r
+typedef struct encoding ENCODING;\r
+\r
+typedef int (PTRCALL *SCANNER)(const ENCODING *,\r
+                               const char *,\r
+                               const char *,\r
+                               const char **);\r
+\r
+struct encoding {\r
+  SCANNER scanners[XML_N_STATES];\r
+  SCANNER literalScanners[XML_N_LITERAL_TYPES];\r
+  int (PTRCALL *sameName)(const ENCODING *,\r
+                          const char *,\r
+                          const char *);\r
+  int (PTRCALL *nameMatchesAscii)(const ENCODING *,\r
+                                  const char *,\r
+                                  const char *,\r
+                                  const char *);\r
+  int (PTRFASTCALL *nameLength)(const ENCODING *, const char *);\r
+  const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *);\r
+  int (PTRCALL *getAtts)(const ENCODING *enc,\r
+                         const char *ptr,\r
+                         int attsMax,\r
+                         ATTRIBUTE *atts);\r
+  int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr);\r
+  int (PTRCALL *predefinedEntityName)(const ENCODING *,\r
+                                      const char *,\r
+                                      const char *);\r
+  void (PTRCALL *updatePosition)(const ENCODING *,\r
+                                 const char *ptr,\r
+                                 const char *end,\r
+                                 POSITION *);\r
+  int (PTRCALL *isPublicId)(const ENCODING *enc,\r
+                            const char *ptr,\r
+                            const char *end,\r
+                            const char **badPtr);\r
+  void (PTRCALL *utf8Convert)(const ENCODING *enc,\r
+                              const char **fromP,\r
+                              const char *fromLim,\r
+                              char **toP,\r
+                              const char *toLim);\r
+  void (PTRCALL *utf16Convert)(const ENCODING *enc,\r
+                               const char **fromP,\r
+                               const char *fromLim,\r
+                               unsigned short **toP,\r
+                               const unsigned short *toLim);\r
+  int minBytesPerChar;\r
+  char isUtf8;\r
+  char isUtf16;\r
+};\r
+\r
+/* Scan the string starting at ptr until the end of the next complete\r
+   token, but do not scan past eptr.  Return an integer giving the\r
+   type of token.\r
+\r
+   Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set.\r
+\r
+   Return XML_TOK_PARTIAL when the string does not contain a complete\r
+   token; nextTokPtr will not be set.\r
+\r
+   Return XML_TOK_INVALID when the string does not start a valid\r
+   token; nextTokPtr will be set to point to the character which made\r
+   the token invalid.\r
+\r
+   Otherwise the string starts with a valid token; nextTokPtr will be\r
+   set to point to the character following the end of that token.\r
+\r
+   Each data character counts as a single token, but adjacent data\r
+   characters may be returned together.  Similarly for characters in\r
+   the prolog outside literals, comments and processing instructions.\r
+*/\r
+\r
+\r
+#define XmlTok(enc, state, ptr, end, nextTokPtr) \\r
+  (((enc)->scanners[state])(enc, ptr, end, nextTokPtr))\r
+\r
+#define XmlPrologTok(enc, ptr, end, nextTokPtr) \\r
+   XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr)\r
+\r
+#define XmlContentTok(enc, ptr, end, nextTokPtr) \\r
+   XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr)\r
+\r
+#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \\r
+   XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr)\r
+\r
+#ifdef XML_DTD\r
+\r
+#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \\r
+   XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr)\r
+\r
+#endif /* XML_DTD */\r
+\r
+/* This is used for performing a 2nd-level tokenization on the content\r
+   of a literal that has already been returned by XmlTok.\r
+*/\r
+#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \\r
+  (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr))\r
+\r
+#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \\r
+   XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr)\r
+\r
+#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \\r
+   XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr)\r
+\r
+#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2))\r
+\r
+#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \\r
+  (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2))\r
+\r
+#define XmlNameLength(enc, ptr) \\r
+  (((enc)->nameLength)(enc, ptr))\r
+\r
+#define XmlSkipS(enc, ptr) \\r
+  (((enc)->skipS)(enc, ptr))\r
+\r
+#define XmlGetAttributes(enc, ptr, attsMax, atts) \\r
+  (((enc)->getAtts)(enc, ptr, attsMax, atts))\r
+\r
+#define XmlCharRefNumber(enc, ptr) \\r
+  (((enc)->charRefNumber)(enc, ptr))\r
+\r
+#define XmlPredefinedEntityName(enc, ptr, end) \\r
+  (((enc)->predefinedEntityName)(enc, ptr, end))\r
+\r
+#define XmlUpdatePosition(enc, ptr, end, pos) \\r
+  (((enc)->updatePosition)(enc, ptr, end, pos))\r
+\r
+#define XmlIsPublicId(enc, ptr, end, badPtr) \\r
+  (((enc)->isPublicId)(enc, ptr, end, badPtr))\r
+\r
+#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \\r
+  (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim))\r
+\r
+#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \\r
+  (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim))\r
+\r
+typedef struct {\r
+  ENCODING initEnc;\r
+  const ENCODING **encPtr;\r
+} INIT_ENCODING;\r
+\r
+int XmlParseXmlDecl(int isGeneralTextEntity,\r
+                    const ENCODING *enc,\r
+                    const char *ptr,\r
+                    const char *end,\r
+                    const char **badPtr,\r
+                    const char **versionPtr,\r
+                    const char **versionEndPtr,\r
+                    const char **encodingNamePtr,\r
+                    const ENCODING **namedEncodingPtr,\r
+                    int *standalonePtr);\r
+\r
+int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name);\r
+const ENCODING *XmlGetUtf8InternalEncoding(void);\r
+const ENCODING *XmlGetUtf16InternalEncoding(void);\r
+int FASTCALL XmlUtf8Encode(int charNumber, char *buf);\r
+int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf);\r
+int XmlSizeOfUnknownEncoding(void);\r
+\r
+\r
+typedef int (XMLCALL *CONVERTER) (void *userData, const char *p);\r
+\r
+ENCODING *\r
+XmlInitUnknownEncoding(void *mem,\r
+                       int *table,\r
+                       CONVERTER convert,\r
+                       void *userData);\r
+\r
+int XmlParseXmlDeclNS(int isGeneralTextEntity,\r
+                      const ENCODING *enc,\r
+                      const char *ptr,\r
+                      const char *end,\r
+                      const char **badPtr,\r
+                      const char **versionPtr,\r
+                      const char **versionEndPtr,\r
+                      const char **encodingNamePtr,\r
+                      const ENCODING **namedEncodingPtr,\r
+                      int *standalonePtr);\r
+\r
+int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name);\r
+const ENCODING *XmlGetUtf8InternalEncodingNS(void);\r
+const ENCODING *XmlGetUtf16InternalEncodingNS(void);\r
+ENCODING *\r
+XmlInitUnknownEncodingNS(void *mem,\r
+                         int *table,\r
+                         CONVERTER convert,\r
+                         void *userData);\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* not XmlTok_INCLUDED */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.c
new file mode 100644 (file)
index 0000000..b13afac
--- /dev/null
@@ -0,0 +1,1783 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+/* This file is included! */\r
+#ifdef XML_TOK_IMPL_C\r
+\r
+#ifndef IS_INVALID_CHAR\r
+#define IS_INVALID_CHAR(enc, ptr, n) (0)\r
+#endif\r
+\r
+#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \\r
+    case BT_LEAD ## n: \\r
+      if (end - ptr < n) \\r
+        return XML_TOK_PARTIAL_CHAR; \\r
+      if (IS_INVALID_CHAR(enc, ptr, n)) { \\r
+        *(nextTokPtr) = (ptr); \\r
+        return XML_TOK_INVALID; \\r
+      } \\r
+      ptr += n; \\r
+      break;\r
+\r
+#define INVALID_CASES(ptr, nextTokPtr) \\r
+  INVALID_LEAD_CASE(2, ptr, nextTokPtr) \\r
+  INVALID_LEAD_CASE(3, ptr, nextTokPtr) \\r
+  INVALID_LEAD_CASE(4, ptr, nextTokPtr) \\r
+  case BT_NONXML: \\r
+  case BT_MALFORM: \\r
+  case BT_TRAIL: \\r
+    *(nextTokPtr) = (ptr); \\r
+    return XML_TOK_INVALID;\r
+\r
+#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \\r
+   case BT_LEAD ## n: \\r
+     if (end - ptr < n) \\r
+       return XML_TOK_PARTIAL_CHAR; \\r
+     if (!IS_NAME_CHAR(enc, ptr, n)) { \\r
+       *nextTokPtr = ptr; \\r
+       return XML_TOK_INVALID; \\r
+     } \\r
+     ptr += n; \\r
+     break;\r
+\r
+#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \\r
+  case BT_NONASCII: \\r
+    if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \\r
+      *nextTokPtr = ptr; \\r
+      return XML_TOK_INVALID; \\r
+    } \\r
+  case BT_NMSTRT: \\r
+  case BT_HEX: \\r
+  case BT_DIGIT: \\r
+  case BT_NAME: \\r
+  case BT_MINUS: \\r
+    ptr += MINBPC(enc); \\r
+    break; \\r
+  CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \\r
+  CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \\r
+  CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)\r
+\r
+#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \\r
+   case BT_LEAD ## n: \\r
+     if (end - ptr < n) \\r
+       return XML_TOK_PARTIAL_CHAR; \\r
+     if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \\r
+       *nextTokPtr = ptr; \\r
+       return XML_TOK_INVALID; \\r
+     } \\r
+     ptr += n; \\r
+     break;\r
+\r
+#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \\r
+  case BT_NONASCII: \\r
+    if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \\r
+      *nextTokPtr = ptr; \\r
+      return XML_TOK_INVALID; \\r
+    } \\r
+  case BT_NMSTRT: \\r
+  case BT_HEX: \\r
+    ptr += MINBPC(enc); \\r
+    break; \\r
+  CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \\r
+  CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \\r
+  CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)\r
+\r
+#ifndef PREFIX\r
+#define PREFIX(ident) ident\r
+#endif\r
+\r
+/* ptr points to character following "<!-" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanComment)(const ENCODING *enc, const char *ptr,\r
+                    const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr != end) {\r
+    if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+    ptr += MINBPC(enc);\r
+    while (ptr != end) {\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      INVALID_CASES(ptr, nextTokPtr)\r
+      case BT_MINUS:\r
+        if ((ptr += MINBPC(enc)) == end)\r
+          return XML_TOK_PARTIAL;\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {\r
+          if ((ptr += MINBPC(enc)) == end)\r
+            return XML_TOK_PARTIAL;\r
+          if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_INVALID;\r
+          }\r
+          *nextTokPtr = ptr + MINBPC(enc);\r
+          return XML_TOK_COMMENT;\r
+        }\r
+        break;\r
+      default:\r
+        ptr += MINBPC(enc);\r
+        break;\r
+      }\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following "<!" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanDecl)(const ENCODING *enc, const char *ptr,\r
+                 const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  case BT_MINUS:\r
+    return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_LSQB:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_COND_SECT_OPEN;\r
+  case BT_NMSTRT:\r
+  case BT_HEX:\r
+    ptr += MINBPC(enc);\r
+    break;\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_PERCNT:\r
+      if (ptr + MINBPC(enc) == end)\r
+        return XML_TOK_PARTIAL;\r
+      /* don't allow <!ENTITY% foo "whatever"> */\r
+      switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {\r
+      case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      /* fall through */\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DECL_OPEN;\r
+    case BT_NMSTRT:\r
+    case BT_HEX:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(checkPiTarget)(const ENCODING *enc, const char *ptr,\r
+                      const char *end, int *tokPtr)\r
+{\r
+  int upper = 0;\r
+  *tokPtr = XML_TOK_PI;\r
+  if (end - ptr != MINBPC(enc)*3)\r
+    return 1;\r
+  switch (BYTE_TO_ASCII(enc, ptr)) {\r
+  case ASCII_x:\r
+    break;\r
+  case ASCII_X:\r
+    upper = 1;\r
+    break;\r
+  default:\r
+    return 1;\r
+  }\r
+  ptr += MINBPC(enc);\r
+  switch (BYTE_TO_ASCII(enc, ptr)) {\r
+  case ASCII_m:\r
+    break;\r
+  case ASCII_M:\r
+    upper = 1;\r
+    break;\r
+  default:\r
+    return 1;\r
+  }\r
+  ptr += MINBPC(enc);\r
+  switch (BYTE_TO_ASCII(enc, ptr)) {\r
+  case ASCII_l:\r
+    break;\r
+  case ASCII_L:\r
+    upper = 1;\r
+    break;\r
+  default:\r
+    return 1;\r
+  }\r
+  if (upper)\r
+    return 0;\r
+  *tokPtr = XML_TOK_XML_DECL;\r
+  return 1;\r
+}\r
+\r
+/* ptr points to character following "<?" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanPi)(const ENCODING *enc, const char *ptr,\r
+               const char *end, const char **nextTokPtr)\r
+{\r
+  int tok;\r
+  const char *target = ptr;\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      ptr += MINBPC(enc);\r
+      while (ptr != end) {\r
+        switch (BYTE_TYPE(enc, ptr)) {\r
+        INVALID_CASES(ptr, nextTokPtr)\r
+        case BT_QUEST:\r
+          ptr += MINBPC(enc);\r
+          if (ptr == end)\r
+            return XML_TOK_PARTIAL;\r
+          if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+            *nextTokPtr = ptr + MINBPC(enc);\r
+            return tok;\r
+          }\r
+          break;\r
+        default:\r
+          ptr += MINBPC(enc);\r
+          break;\r
+        }\r
+      }\r
+      return XML_TOK_PARTIAL;\r
+    case BT_QUEST:\r
+      if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        return XML_TOK_PARTIAL;\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return tok;\r
+      }\r
+      /* fall through */\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(scanCdataSection)(const ENCODING *enc, const char *ptr,\r
+                         const char *end, const char **nextTokPtr)\r
+{\r
+  static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A,\r
+                                     ASCII_T, ASCII_A, ASCII_LSQB };\r
+  int i;\r
+  /* CDATA[ */\r
+  if (end - ptr < 6 * MINBPC(enc))\r
+    return XML_TOK_PARTIAL;\r
+  for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {\r
+    if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr;\r
+  return XML_TOK_CDATA_SECT_OPEN;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr,\r
+                        const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  if (MINBPC(enc) > 1) {\r
+    size_t n = end - ptr;\r
+    if (n & (MINBPC(enc) - 1)) {\r
+      n &= ~(MINBPC(enc) - 1);\r
+      if (n == 0)\r
+        return XML_TOK_PARTIAL;\r
+      end = ptr + n;\r
+    }\r
+  }\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  case BT_RSQB:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_PARTIAL;\r
+    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))\r
+      break;\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_PARTIAL;\r
+    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+      ptr -= MINBPC(enc);\r
+      break;\r
+    }\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_CDATA_SECT_CLOSE;\r
+  case BT_CR:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_PARTIAL;\r
+    if (BYTE_TYPE(enc, ptr) == BT_LF)\r
+      ptr += MINBPC(enc);\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_DATA_NEWLINE;\r
+  case BT_LF:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_DATA_NEWLINE;\r
+  INVALID_CASES(ptr, nextTokPtr)\r
+  default:\r
+    ptr += MINBPC(enc);\r
+    break;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: \\r
+      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \\r
+        *nextTokPtr = ptr; \\r
+        return XML_TOK_DATA_CHARS; \\r
+      } \\r
+      ptr += n; \\r
+      break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_NONXML:\r
+    case BT_MALFORM:\r
+    case BT_TRAIL:\r
+    case BT_CR:\r
+    case BT_LF:\r
+    case BT_RSQB:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr;\r
+  return XML_TOK_DATA_CHARS;\r
+}\r
+\r
+/* ptr points to character following "</" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr,\r
+                   const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {\r
+        switch (BYTE_TYPE(enc, ptr)) {\r
+        case BT_S: case BT_CR: case BT_LF:\r
+          break;\r
+        case BT_GT:\r
+          *nextTokPtr = ptr + MINBPC(enc);\r
+          return XML_TOK_END_TAG;\r
+        default:\r
+          *nextTokPtr = ptr;\r
+          return XML_TOK_INVALID;\r
+        }\r
+      }\r
+      return XML_TOK_PARTIAL;\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+      /* no need to check qname syntax here,\r
+         since end-tag must match exactly */\r
+      ptr += MINBPC(enc);\r
+      break;\r
+#endif\r
+    case BT_GT:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_END_TAG;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following "&#X" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr,\r
+                       const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_DIGIT:\r
+    case BT_HEX:\r
+      break;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      case BT_DIGIT:\r
+      case BT_HEX:\r
+        break;\r
+      case BT_SEMI:\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return XML_TOK_CHAR_REF;\r
+      default:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following "&#" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr,\r
+                    const char *end, const char **nextTokPtr)\r
+{\r
+  if (ptr != end) {\r
+    if (CHAR_MATCHES(enc, ptr, ASCII_x))\r
+      return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_DIGIT:\r
+      break;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+    for (ptr += MINBPC(enc); ptr != end; ptr += MINBPC(enc)) {\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      case BT_DIGIT:\r
+        break;\r
+      case BT_SEMI:\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return XML_TOK_CHAR_REF;\r
+      default:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following "&" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,\r
+                const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  case BT_NUM:\r
+    return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_SEMI:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_ENTITY_REF;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following first character of attribute name */\r
+\r
+static int PTRCALL\r
+PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,\r
+                 const char **nextTokPtr)\r
+{\r
+#ifdef XML_NS\r
+  int hadColon = 0;\r
+#endif\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+      if (hadColon) {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      hadColon = 1;\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        return XML_TOK_PARTIAL;\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+      default:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      break;\r
+#endif\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      for (;;) {\r
+        int t;\r
+\r
+        ptr += MINBPC(enc);\r
+        if (ptr == end)\r
+          return XML_TOK_PARTIAL;\r
+        t = BYTE_TYPE(enc, ptr);\r
+        if (t == BT_EQUALS)\r
+          break;\r
+        switch (t) {\r
+        case BT_S:\r
+        case BT_LF:\r
+        case BT_CR:\r
+          break;\r
+        default:\r
+          *nextTokPtr = ptr;\r
+          return XML_TOK_INVALID;\r
+        }\r
+      }\r
+    /* fall through */\r
+    case BT_EQUALS:\r
+      {\r
+        int open;\r
+#ifdef XML_NS\r
+        hadColon = 0;\r
+#endif\r
+        for (;;) {\r
+          ptr += MINBPC(enc);\r
+          if (ptr == end)\r
+            return XML_TOK_PARTIAL;\r
+          open = BYTE_TYPE(enc, ptr);\r
+          if (open == BT_QUOT || open == BT_APOS)\r
+            break;\r
+          switch (open) {\r
+          case BT_S:\r
+          case BT_LF:\r
+          case BT_CR:\r
+            break;\r
+          default:\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_INVALID;\r
+          }\r
+        }\r
+        ptr += MINBPC(enc);\r
+        /* in attribute value */\r
+        for (;;) {\r
+          int t;\r
+          if (ptr == end)\r
+            return XML_TOK_PARTIAL;\r
+          t = BYTE_TYPE(enc, ptr);\r
+          if (t == open)\r
+            break;\r
+          switch (t) {\r
+          INVALID_CASES(ptr, nextTokPtr)\r
+          case BT_AMP:\r
+            {\r
+              int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);\r
+              if (tok <= 0) {\r
+                if (tok == XML_TOK_INVALID)\r
+                  *nextTokPtr = ptr;\r
+                return tok;\r
+              }\r
+              break;\r
+            }\r
+          case BT_LT:\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_INVALID;\r
+          default:\r
+            ptr += MINBPC(enc);\r
+            break;\r
+          }\r
+        }\r
+        ptr += MINBPC(enc);\r
+        if (ptr == end)\r
+          return XML_TOK_PARTIAL;\r
+        switch (BYTE_TYPE(enc, ptr)) {\r
+        case BT_S:\r
+        case BT_CR:\r
+        case BT_LF:\r
+          break;\r
+        case BT_SOL:\r
+          goto sol;\r
+        case BT_GT:\r
+          goto gt;\r
+        default:\r
+          *nextTokPtr = ptr;\r
+          return XML_TOK_INVALID;\r
+        }\r
+        /* ptr points to closing quote */\r
+        for (;;) {\r
+          ptr += MINBPC(enc);\r
+          if (ptr == end)\r
+            return XML_TOK_PARTIAL;\r
+          switch (BYTE_TYPE(enc, ptr)) {\r
+          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+          case BT_S: case BT_CR: case BT_LF:\r
+            continue;\r
+          case BT_GT:\r
+          gt:\r
+            *nextTokPtr = ptr + MINBPC(enc);\r
+            return XML_TOK_START_TAG_WITH_ATTS;\r
+          case BT_SOL:\r
+          sol:\r
+            ptr += MINBPC(enc);\r
+            if (ptr == end)\r
+              return XML_TOK_PARTIAL;\r
+            if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+              *nextTokPtr = ptr;\r
+              return XML_TOK_INVALID;\r
+            }\r
+            *nextTokPtr = ptr + MINBPC(enc);\r
+            return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;\r
+          default:\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_INVALID;\r
+          }\r
+          break;\r
+        }\r
+        break;\r
+      }\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+/* ptr points to character following "<" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,\r
+               const char **nextTokPtr)\r
+{\r
+#ifdef XML_NS\r
+  int hadColon;\r
+#endif\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  case BT_EXCL:\r
+    if ((ptr += MINBPC(enc)) == end)\r
+      return XML_TOK_PARTIAL;\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_MINUS:\r
+      return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+    case BT_LSQB:\r
+      return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc),\r
+                                      end, nextTokPtr);\r
+    }\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  case BT_QUEST:\r
+    return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_SOL:\r
+    return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+#ifdef XML_NS\r
+  hadColon = 0;\r
+#endif\r
+  /* we have a start-tag */\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+      if (hadColon) {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      hadColon = 1;\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        return XML_TOK_PARTIAL;\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+      default:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      break;\r
+#endif\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      {\r
+        ptr += MINBPC(enc);\r
+        while (ptr != end) {\r
+          switch (BYTE_TYPE(enc, ptr)) {\r
+          CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+          case BT_GT:\r
+            goto gt;\r
+          case BT_SOL:\r
+            goto sol;\r
+          case BT_S: case BT_CR: case BT_LF:\r
+            ptr += MINBPC(enc);\r
+            continue;\r
+          default:\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_INVALID;\r
+          }\r
+          return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);\r
+        }\r
+        return XML_TOK_PARTIAL;\r
+      }\r
+    case BT_GT:\r
+    gt:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_START_TAG_NO_ATTS;\r
+    case BT_SOL:\r
+    sol:\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        return XML_TOK_PARTIAL;\r
+      if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_EMPTY_ELEMENT_NO_ATTS;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,\r
+                   const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  if (MINBPC(enc) > 1) {\r
+    size_t n = end - ptr;\r
+    if (n & (MINBPC(enc) - 1)) {\r
+      n &= ~(MINBPC(enc) - 1);\r
+      if (n == 0)\r
+        return XML_TOK_PARTIAL;\r
+      end = ptr + n;\r
+    }\r
+  }\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  case BT_LT:\r
+    return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_AMP:\r
+    return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_CR:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_TRAILING_CR;\r
+    if (BYTE_TYPE(enc, ptr) == BT_LF)\r
+      ptr += MINBPC(enc);\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_DATA_NEWLINE;\r
+  case BT_LF:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_DATA_NEWLINE;\r
+  case BT_RSQB:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_TRAILING_RSQB;\r
+    if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))\r
+      break;\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return XML_TOK_TRAILING_RSQB;\r
+    if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+      ptr -= MINBPC(enc);\r
+      break;\r
+    }\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  INVALID_CASES(ptr, nextTokPtr)\r
+  default:\r
+    ptr += MINBPC(enc);\r
+    break;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: \\r
+      if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \\r
+        *nextTokPtr = ptr; \\r
+        return XML_TOK_DATA_CHARS; \\r
+      } \\r
+      ptr += n; \\r
+      break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_RSQB:\r
+      if (ptr + MINBPC(enc) != end) {\r
+         if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {\r
+           ptr += MINBPC(enc);\r
+           break;\r
+         }\r
+         if (ptr + 2*MINBPC(enc) != end) {\r
+           if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) {\r
+             ptr += MINBPC(enc);\r
+             break;\r
+           }\r
+           *nextTokPtr = ptr + 2*MINBPC(enc);\r
+           return XML_TOK_INVALID;\r
+         }\r
+      }\r
+      /* fall through */\r
+    case BT_AMP:\r
+    case BT_LT:\r
+    case BT_NONXML:\r
+    case BT_MALFORM:\r
+    case BT_TRAIL:\r
+    case BT_CR:\r
+    case BT_LF:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr;\r
+  return XML_TOK_DATA_CHARS;\r
+}\r
+\r
+/* ptr points to character following "%" */\r
+\r
+static int PTRCALL\r
+PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,\r
+                    const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_PERCENT;\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_SEMI:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_PARAM_ENTITY_REF;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,\r
+                      const char **nextTokPtr)\r
+{\r
+  if (ptr == end)\r
+    return XML_TOK_PARTIAL;\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_CR: case BT_LF: case BT_S:\r
+    case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_POUND_NAME;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return -XML_TOK_POUND_NAME;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(scanLit)(int open, const ENCODING *enc,\r
+                const char *ptr, const char *end,\r
+                const char **nextTokPtr)\r
+{\r
+  while (ptr != end) {\r
+    int t = BYTE_TYPE(enc, ptr);\r
+    switch (t) {\r
+    INVALID_CASES(ptr, nextTokPtr)\r
+    case BT_QUOT:\r
+    case BT_APOS:\r
+      ptr += MINBPC(enc);\r
+      if (t != open)\r
+        break;\r
+      if (ptr == end)\r
+        return -XML_TOK_LITERAL;\r
+      *nextTokPtr = ptr;\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      case BT_S: case BT_CR: case BT_LF:\r
+      case BT_GT: case BT_PERCNT: case BT_LSQB:\r
+        return XML_TOK_LITERAL;\r
+      default:\r
+        return XML_TOK_INVALID;\r
+      }\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,\r
+                  const char **nextTokPtr)\r
+{\r
+  int tok;\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  if (MINBPC(enc) > 1) {\r
+    size_t n = end - ptr;\r
+    if (n & (MINBPC(enc) - 1)) {\r
+      n &= ~(MINBPC(enc) - 1);\r
+      if (n == 0)\r
+        return XML_TOK_PARTIAL;\r
+      end = ptr + n;\r
+    }\r
+  }\r
+  switch (BYTE_TYPE(enc, ptr)) {\r
+  case BT_QUOT:\r
+    return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_APOS:\r
+    return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_LT:\r
+    {\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        return XML_TOK_PARTIAL;\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      case BT_EXCL:\r
+        return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+      case BT_QUEST:\r
+        return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+      case BT_NMSTRT:\r
+      case BT_HEX:\r
+      case BT_NONASCII:\r
+      case BT_LEAD2:\r
+      case BT_LEAD3:\r
+      case BT_LEAD4:\r
+        *nextTokPtr = ptr - MINBPC(enc);\r
+        return XML_TOK_INSTANCE_START;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  case BT_CR:\r
+    if (ptr + MINBPC(enc) == end) {\r
+      *nextTokPtr = end;\r
+      /* indicate that this might be part of a CR/LF pair */\r
+      return -XML_TOK_PROLOG_S;\r
+    }\r
+    /* fall through */\r
+  case BT_S: case BT_LF:\r
+    for (;;) {\r
+      ptr += MINBPC(enc);\r
+      if (ptr == end)\r
+        break;\r
+      switch (BYTE_TYPE(enc, ptr)) {\r
+      case BT_S: case BT_LF:\r
+        break;\r
+      case BT_CR:\r
+        /* don't split CR/LF pair */\r
+        if (ptr + MINBPC(enc) != end)\r
+          break;\r
+        /* fall through */\r
+      default:\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_PROLOG_S;\r
+      }\r
+    }\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_PROLOG_S;\r
+  case BT_PERCNT:\r
+    return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+  case BT_COMMA:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_COMMA;\r
+  case BT_LSQB:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_OPEN_BRACKET;\r
+  case BT_RSQB:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return -XML_TOK_CLOSE_BRACKET;\r
+    if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {\r
+      if (ptr + MINBPC(enc) == end)\r
+        return XML_TOK_PARTIAL;\r
+      if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {\r
+        *nextTokPtr = ptr + 2*MINBPC(enc);\r
+        return XML_TOK_COND_SECT_CLOSE;\r
+      }\r
+    }\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_CLOSE_BRACKET;\r
+  case BT_LPAR:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_OPEN_PAREN;\r
+  case BT_RPAR:\r
+    ptr += MINBPC(enc);\r
+    if (ptr == end)\r
+      return -XML_TOK_CLOSE_PAREN;\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_AST:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_CLOSE_PAREN_ASTERISK;\r
+    case BT_QUEST:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_CLOSE_PAREN_QUESTION;\r
+    case BT_PLUS:\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_CLOSE_PAREN_PLUS;\r
+    case BT_CR: case BT_LF: case BT_S:\r
+    case BT_GT: case BT_COMMA: case BT_VERBAR:\r
+    case BT_RPAR:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_CLOSE_PAREN;\r
+    }\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  case BT_VERBAR:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_OR;\r
+  case BT_GT:\r
+    *nextTokPtr = ptr + MINBPC(enc);\r
+    return XML_TOK_DECL_CLOSE;\r
+  case BT_NUM:\r
+    return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+#define LEAD_CASE(n) \\r
+  case BT_LEAD ## n: \\r
+    if (end - ptr < n) \\r
+      return XML_TOK_PARTIAL_CHAR; \\r
+    if (IS_NMSTRT_CHAR(enc, ptr, n)) { \\r
+      ptr += n; \\r
+      tok = XML_TOK_NAME; \\r
+      break; \\r
+    } \\r
+    if (IS_NAME_CHAR(enc, ptr, n)) { \\r
+      ptr += n; \\r
+      tok = XML_TOK_NMTOKEN; \\r
+      break; \\r
+    } \\r
+    *nextTokPtr = ptr; \\r
+    return XML_TOK_INVALID;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+  case BT_NMSTRT:\r
+  case BT_HEX:\r
+    tok = XML_TOK_NAME;\r
+    ptr += MINBPC(enc);\r
+    break;\r
+  case BT_DIGIT:\r
+  case BT_NAME:\r
+  case BT_MINUS:\r
+#ifdef XML_NS\r
+  case BT_COLON:\r
+#endif\r
+    tok = XML_TOK_NMTOKEN;\r
+    ptr += MINBPC(enc);\r
+    break;\r
+  case BT_NONASCII:\r
+    if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {\r
+      ptr += MINBPC(enc);\r
+      tok = XML_TOK_NAME;\r
+      break;\r
+    }\r
+    if (IS_NAME_CHAR_MINBPC(enc, ptr)) {\r
+      ptr += MINBPC(enc);\r
+      tok = XML_TOK_NMTOKEN;\r
+      break;\r
+    }\r
+    /* fall through */\r
+  default:\r
+    *nextTokPtr = ptr;\r
+    return XML_TOK_INVALID;\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+    case BT_GT: case BT_RPAR: case BT_COMMA:\r
+    case BT_VERBAR: case BT_LSQB: case BT_PERCNT:\r
+    case BT_S: case BT_CR: case BT_LF:\r
+      *nextTokPtr = ptr;\r
+      return tok;\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+      ptr += MINBPC(enc);\r
+      switch (tok) {\r
+      case XML_TOK_NAME:\r
+        if (ptr == end)\r
+          return XML_TOK_PARTIAL;\r
+        tok = XML_TOK_PREFIXED_NAME;\r
+        switch (BYTE_TYPE(enc, ptr)) {\r
+        CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)\r
+        default:\r
+          tok = XML_TOK_NMTOKEN;\r
+          break;\r
+        }\r
+        break;\r
+      case XML_TOK_PREFIXED_NAME:\r
+        tok = XML_TOK_NMTOKEN;\r
+        break;\r
+      }\r
+      break;\r
+#endif\r
+    case BT_PLUS:\r
+      if (tok == XML_TOK_NMTOKEN)  {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_NAME_PLUS;\r
+    case BT_AST:\r
+      if (tok == XML_TOK_NMTOKEN)  {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_NAME_ASTERISK;\r
+    case BT_QUEST:\r
+      if (tok == XML_TOK_NMTOKEN)  {\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_INVALID;\r
+      }\r
+      *nextTokPtr = ptr + MINBPC(enc);\r
+      return XML_TOK_NAME_QUESTION;\r
+    default:\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    }\r
+  }\r
+  return -tok;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,\r
+                          const char *end, const char **nextTokPtr)\r
+{\r
+  const char *start;\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  start = ptr;\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: ptr += n; break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_AMP:\r
+      if (ptr == start)\r
+        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_LT:\r
+      /* this is for inside entity references */\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_INVALID;\r
+    case BT_LF:\r
+      if (ptr == start) {\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return XML_TOK_DATA_NEWLINE;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_CR:\r
+      if (ptr == start) {\r
+        ptr += MINBPC(enc);\r
+        if (ptr == end)\r
+          return XML_TOK_TRAILING_CR;\r
+        if (BYTE_TYPE(enc, ptr) == BT_LF)\r
+          ptr += MINBPC(enc);\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_DATA_NEWLINE;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_S:\r
+      if (ptr == start) {\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return XML_TOK_ATTRIBUTE_VALUE_S;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr;\r
+  return XML_TOK_DATA_CHARS;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,\r
+                       const char *end, const char **nextTokPtr)\r
+{\r
+  const char *start;\r
+  if (ptr == end)\r
+    return XML_TOK_NONE;\r
+  start = ptr;\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: ptr += n; break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_AMP:\r
+      if (ptr == start)\r
+        return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_PERCNT:\r
+      if (ptr == start) {\r
+        int tok =  PREFIX(scanPercent)(enc, ptr + MINBPC(enc),\r
+                                       end, nextTokPtr);\r
+        return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_LF:\r
+      if (ptr == start) {\r
+        *nextTokPtr = ptr + MINBPC(enc);\r
+        return XML_TOK_DATA_NEWLINE;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    case BT_CR:\r
+      if (ptr == start) {\r
+        ptr += MINBPC(enc);\r
+        if (ptr == end)\r
+          return XML_TOK_TRAILING_CR;\r
+        if (BYTE_TYPE(enc, ptr) == BT_LF)\r
+          ptr += MINBPC(enc);\r
+        *nextTokPtr = ptr;\r
+        return XML_TOK_DATA_NEWLINE;\r
+      }\r
+      *nextTokPtr = ptr;\r
+      return XML_TOK_DATA_CHARS;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  *nextTokPtr = ptr;\r
+  return XML_TOK_DATA_CHARS;\r
+}\r
+\r
+#ifdef XML_DTD\r
+\r
+static int PTRCALL\r
+PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr,\r
+                         const char *end, const char **nextTokPtr)\r
+{\r
+  int level = 0;\r
+  if (MINBPC(enc) > 1) {\r
+    size_t n = end - ptr;\r
+    if (n & (MINBPC(enc) - 1)) {\r
+      n &= ~(MINBPC(enc) - 1);\r
+      end = ptr + n;\r
+    }\r
+  }\r
+  while (ptr != end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    INVALID_CASES(ptr, nextTokPtr)\r
+    case BT_LT:\r
+      if ((ptr += MINBPC(enc)) == end)\r
+        return XML_TOK_PARTIAL;\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {\r
+        if ((ptr += MINBPC(enc)) == end)\r
+          return XML_TOK_PARTIAL;\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {\r
+          ++level;\r
+          ptr += MINBPC(enc);\r
+        }\r
+      }\r
+      break;\r
+    case BT_RSQB:\r
+      if ((ptr += MINBPC(enc)) == end)\r
+        return XML_TOK_PARTIAL;\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {\r
+        if ((ptr += MINBPC(enc)) == end)\r
+          return XML_TOK_PARTIAL;\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {\r
+          ptr += MINBPC(enc);\r
+          if (level == 0) {\r
+            *nextTokPtr = ptr;\r
+            return XML_TOK_IGNORE_SECT;\r
+          }\r
+          --level;\r
+        }\r
+      }\r
+      break;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+  }\r
+  return XML_TOK_PARTIAL;\r
+}\r
+\r
+#endif /* XML_DTD */\r
+\r
+static int PTRCALL\r
+PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,\r
+                   const char **badPtr)\r
+{\r
+  ptr += MINBPC(enc);\r
+  end -= MINBPC(enc);\r
+  for (; ptr != end; ptr += MINBPC(enc)) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_DIGIT:\r
+    case BT_HEX:\r
+    case BT_MINUS:\r
+    case BT_APOS:\r
+    case BT_LPAR:\r
+    case BT_RPAR:\r
+    case BT_PLUS:\r
+    case BT_COMMA:\r
+    case BT_SOL:\r
+    case BT_EQUALS:\r
+    case BT_QUEST:\r
+    case BT_CR:\r
+    case BT_LF:\r
+    case BT_SEMI:\r
+    case BT_EXCL:\r
+    case BT_AST:\r
+    case BT_PERCNT:\r
+    case BT_NUM:\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+#endif\r
+      break;\r
+    case BT_S:\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {\r
+        *badPtr = ptr;\r
+        return 0;\r
+      }\r
+      break;\r
+    case BT_NAME:\r
+    case BT_NMSTRT:\r
+      if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))\r
+        break;\r
+    default:\r
+      switch (BYTE_TO_ASCII(enc, ptr)) {\r
+      case 0x24: /* $ */\r
+      case 0x40: /* @ */\r
+        break;\r
+      default:\r
+        *badPtr = ptr;\r
+        return 0;\r
+      }\r
+      break;\r
+    }\r
+  }\r
+  return 1;\r
+}\r
+\r
+/* This must only be called for a well-formed start-tag or empty\r
+   element tag.  Returns the number of attributes.  Pointers to the\r
+   first attsMax attributes are stored in atts.\r
+*/\r
+\r
+static int PTRCALL\r
+PREFIX(getAtts)(const ENCODING *enc, const char *ptr,\r
+                int attsMax, ATTRIBUTE *atts)\r
+{\r
+  enum { other, inName, inValue } state = inName;\r
+  int nAtts = 0;\r
+  int open = 0; /* defined when state == inValue;\r
+                   initialization just to shut up compilers */\r
+\r
+  for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define START_NAME \\r
+      if (state == other) { \\r
+        if (nAtts < attsMax) { \\r
+          atts[nAtts].name = ptr; \\r
+          atts[nAtts].normalized = 1; \\r
+        } \\r
+        state = inName; \\r
+      }\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_NONASCII:\r
+    case BT_NMSTRT:\r
+    case BT_HEX:\r
+      START_NAME\r
+      break;\r
+#undef START_NAME\r
+    case BT_QUOT:\r
+      if (state != inValue) {\r
+        if (nAtts < attsMax)\r
+          atts[nAtts].valuePtr = ptr + MINBPC(enc);\r
+        state = inValue;\r
+        open = BT_QUOT;\r
+      }\r
+      else if (open == BT_QUOT) {\r
+        state = other;\r
+        if (nAtts < attsMax)\r
+          atts[nAtts].valueEnd = ptr;\r
+        nAtts++;\r
+      }\r
+      break;\r
+    case BT_APOS:\r
+      if (state != inValue) {\r
+        if (nAtts < attsMax)\r
+          atts[nAtts].valuePtr = ptr + MINBPC(enc);\r
+        state = inValue;\r
+        open = BT_APOS;\r
+      }\r
+      else if (open == BT_APOS) {\r
+        state = other;\r
+        if (nAtts < attsMax)\r
+          atts[nAtts].valueEnd = ptr;\r
+        nAtts++;\r
+      }\r
+      break;\r
+    case BT_AMP:\r
+      if (nAtts < attsMax)\r
+        atts[nAtts].normalized = 0;\r
+      break;\r
+    case BT_S:\r
+      if (state == inName)\r
+        state = other;\r
+      else if (state == inValue\r
+               && nAtts < attsMax\r
+               && atts[nAtts].normalized\r
+               && (ptr == atts[nAtts].valuePtr\r
+                   || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE\r
+                   || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE\r
+                   || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))\r
+        atts[nAtts].normalized = 0;\r
+      break;\r
+    case BT_CR: case BT_LF:\r
+      /* This case ensures that the first attribute name is counted\r
+         Apart from that we could just change state on the quote. */\r
+      if (state == inName)\r
+        state = other;\r
+      else if (state == inValue && nAtts < attsMax)\r
+        atts[nAtts].normalized = 0;\r
+      break;\r
+    case BT_GT:\r
+    case BT_SOL:\r
+      if (state != inValue)\r
+        return nAtts;\r
+      break;\r
+    default:\r
+      break;\r
+    }\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+static int PTRFASTCALL\r
+PREFIX(charRefNumber)(const ENCODING *enc, const char *ptr)\r
+{\r
+  int result = 0;\r
+  /* skip &# */\r
+  ptr += 2*MINBPC(enc);\r
+  if (CHAR_MATCHES(enc, ptr, ASCII_x)) {\r
+    for (ptr += MINBPC(enc);\r
+         !CHAR_MATCHES(enc, ptr, ASCII_SEMI);\r
+         ptr += MINBPC(enc)) {\r
+      int c = BYTE_TO_ASCII(enc, ptr);\r
+      switch (c) {\r
+      case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:\r
+      case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:\r
+        result <<= 4;\r
+        result |= (c - ASCII_0);\r
+        break;\r
+      case ASCII_A: case ASCII_B: case ASCII_C:\r
+      case ASCII_D: case ASCII_E: case ASCII_F:\r
+        result <<= 4;\r
+        result += 10 + (c - ASCII_A);\r
+        break;\r
+      case ASCII_a: case ASCII_b: case ASCII_c:\r
+      case ASCII_d: case ASCII_e: case ASCII_f:\r
+        result <<= 4;\r
+        result += 10 + (c - ASCII_a);\r
+        break;\r
+      }\r
+      if (result >= 0x110000)\r
+        return -1;\r
+    }\r
+  }\r
+  else {\r
+    for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {\r
+      int c = BYTE_TO_ASCII(enc, ptr);\r
+      result *= 10;\r
+      result += (c - ASCII_0);\r
+      if (result >= 0x110000)\r
+        return -1;\r
+    }\r
+  }\r
+  return checkCharRefNumber(result);\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(predefinedEntityName)(const ENCODING *enc, const char *ptr,\r
+                             const char *end)\r
+{\r
+  switch ((end - ptr)/MINBPC(enc)) {\r
+  case 2:\r
+    if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {\r
+      switch (BYTE_TO_ASCII(enc, ptr)) {\r
+      case ASCII_l:\r
+        return ASCII_LT;\r
+      case ASCII_g:\r
+        return ASCII_GT;\r
+      }\r
+    }\r
+    break;\r
+  case 3:\r
+    if (CHAR_MATCHES(enc, ptr, ASCII_a)) {\r
+      ptr += MINBPC(enc);\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_m)) {\r
+        ptr += MINBPC(enc);\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_p))\r
+          return ASCII_AMP;\r
+      }\r
+    }\r
+    break;\r
+  case 4:\r
+    switch (BYTE_TO_ASCII(enc, ptr)) {\r
+    case ASCII_q:\r
+      ptr += MINBPC(enc);\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_u)) {\r
+        ptr += MINBPC(enc);\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {\r
+          ptr += MINBPC(enc);\r
+          if (CHAR_MATCHES(enc, ptr, ASCII_t))\r
+            return ASCII_QUOT;\r
+        }\r
+      }\r
+      break;\r
+    case ASCII_a:\r
+      ptr += MINBPC(enc);\r
+      if (CHAR_MATCHES(enc, ptr, ASCII_p)) {\r
+        ptr += MINBPC(enc);\r
+        if (CHAR_MATCHES(enc, ptr, ASCII_o)) {\r
+          ptr += MINBPC(enc);\r
+          if (CHAR_MATCHES(enc, ptr, ASCII_s))\r
+            return ASCII_APOS;\r
+        }\r
+      }\r
+      break;\r
+    }\r
+  }\r
+  return 0;\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)\r
+{\r
+  for (;;) {\r
+    switch (BYTE_TYPE(enc, ptr1)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: \\r
+      if (*ptr1++ != *ptr2++) \\r
+        return 0;\r
+    LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)\r
+#undef LEAD_CASE\r
+      /* fall through */\r
+      if (*ptr1++ != *ptr2++)\r
+        return 0;\r
+      break;\r
+    case BT_NONASCII:\r
+    case BT_NMSTRT:\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+#endif\r
+    case BT_HEX:\r
+    case BT_DIGIT:\r
+    case BT_NAME:\r
+    case BT_MINUS:\r
+      if (*ptr2++ != *ptr1++)\r
+        return 0;\r
+      if (MINBPC(enc) > 1) {\r
+        if (*ptr2++ != *ptr1++)\r
+          return 0;\r
+        if (MINBPC(enc) > 2) {\r
+          if (*ptr2++ != *ptr1++)\r
+            return 0;\r
+          if (MINBPC(enc) > 3) {\r
+            if (*ptr2++ != *ptr1++)\r
+              return 0;\r
+          }\r
+        }\r
+      }\r
+      break;\r
+    default:\r
+      if (MINBPC(enc) == 1 && *ptr1 == *ptr2)\r
+        return 1;\r
+      switch (BYTE_TYPE(enc, ptr2)) {\r
+      case BT_LEAD2:\r
+      case BT_LEAD3:\r
+      case BT_LEAD4:\r
+      case BT_NONASCII:\r
+      case BT_NMSTRT:\r
+#ifdef XML_NS\r
+      case BT_COLON:\r
+#endif\r
+      case BT_HEX:\r
+      case BT_DIGIT:\r
+      case BT_NAME:\r
+      case BT_MINUS:\r
+        return 0;\r
+      default:\r
+        return 1;\r
+      }\r
+    }\r
+  }\r
+  /* not reached */\r
+}\r
+\r
+static int PTRCALL\r
+PREFIX(nameMatchesAscii)(const ENCODING *enc, const char *ptr1,\r
+                         const char *end1, const char *ptr2)\r
+{\r
+  for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {\r
+    if (ptr1 == end1)\r
+      return 0;\r
+    if (!CHAR_MATCHES(enc, ptr1, *ptr2))\r
+      return 0;\r
+  }\r
+  return ptr1 == end1;\r
+}\r
+\r
+static int PTRFASTCALL\r
+PREFIX(nameLength)(const ENCODING *enc, const char *ptr)\r
+{\r
+  const char *start = ptr;\r
+  for (;;) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: ptr += n; break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_NONASCII:\r
+    case BT_NMSTRT:\r
+#ifdef XML_NS\r
+    case BT_COLON:\r
+#endif\r
+    case BT_HEX:\r
+    case BT_DIGIT:\r
+    case BT_NAME:\r
+    case BT_MINUS:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    default:\r
+      return (int)(ptr - start);\r
+    }\r
+  }\r
+}\r
+\r
+static const char * PTRFASTCALL\r
+PREFIX(skipS)(const ENCODING *enc, const char *ptr)\r
+{\r
+  for (;;) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+    case BT_LF:\r
+    case BT_CR:\r
+    case BT_S:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    default:\r
+      return ptr;\r
+    }\r
+  }\r
+}\r
+\r
+static void PTRCALL\r
+PREFIX(updatePosition)(const ENCODING *enc,\r
+                       const char *ptr,\r
+                       const char *end,\r
+                       POSITION *pos)\r
+{\r
+  while (ptr < end) {\r
+    switch (BYTE_TYPE(enc, ptr)) {\r
+#define LEAD_CASE(n) \\r
+    case BT_LEAD ## n: \\r
+      ptr += n; \\r
+      break;\r
+    LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)\r
+#undef LEAD_CASE\r
+    case BT_LF:\r
+      pos->columnNumber = (XML_Size)-1;\r
+      pos->lineNumber++;\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    case BT_CR:\r
+      pos->lineNumber++;\r
+      ptr += MINBPC(enc);\r
+      if (ptr != end && BYTE_TYPE(enc, ptr) == BT_LF)\r
+        ptr += MINBPC(enc);\r
+      pos->columnNumber = (XML_Size)-1;\r
+      break;\r
+    default:\r
+      ptr += MINBPC(enc);\r
+      break;\r
+    }\r
+    pos->columnNumber++;\r
+  }\r
+}\r
+\r
+#undef DO_LEAD_CASE\r
+#undef MULTIBYTE_CASES\r
+#undef INVALID_CASES\r
+#undef CHECK_NAME_CASE\r
+#undef CHECK_NAME_CASES\r
+#undef CHECK_NMSTRT_CASE\r
+#undef CHECK_NMSTRT_CASES\r
+\r
+#endif /* XML_TOK_IMPL_C */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_impl.h
new file mode 100644 (file)
index 0000000..94c7db6
--- /dev/null
@@ -0,0 +1,46 @@
+/*\r
+Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+See the file COPYING for copying permission.\r
+*/\r
+\r
+enum {\r
+  BT_NONXML,\r
+  BT_MALFORM,\r
+  BT_LT,\r
+  BT_AMP,\r
+  BT_RSQB,\r
+  BT_LEAD2,\r
+  BT_LEAD3,\r
+  BT_LEAD4,\r
+  BT_TRAIL,\r
+  BT_CR,\r
+  BT_LF,\r
+  BT_GT,\r
+  BT_QUOT,\r
+  BT_APOS,\r
+  BT_EQUALS,\r
+  BT_QUEST,\r
+  BT_EXCL,\r
+  BT_SOL,\r
+  BT_SEMI,\r
+  BT_NUM,\r
+  BT_LSQB,\r
+  BT_S,\r
+  BT_NMSTRT,\r
+  BT_COLON,\r
+  BT_HEX,\r
+  BT_DIGIT,\r
+  BT_NAME,\r
+  BT_MINUS,\r
+  BT_OTHER, /* known not to be a name or name start character */\r
+  BT_NONASCII, /* might be a name or name start character */\r
+  BT_PERCNT,\r
+  BT_LPAR,\r
+  BT_RPAR,\r
+  BT_AST,\r
+  BT_PLUS,\r
+  BT_COMMA,\r
+  BT_VERBAR\r
+};\r
+\r
+#include <stddef.h>\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_ns.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/expat/xmltok_ns.c
new file mode 100644 (file)
index 0000000..6f44256
--- /dev/null
@@ -0,0 +1,115 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd\r
+   See the file COPYING for copying permission.\r
+*/\r
+\r
+/* This file is included! */\r
+#ifdef XML_TOK_NS_C\r
+\r
+const ENCODING *\r
+NS(XmlGetUtf8InternalEncoding)(void)\r
+{\r
+  return &ns(internal_utf8_encoding).enc;\r
+}\r
+\r
+const ENCODING *\r
+NS(XmlGetUtf16InternalEncoding)(void)\r
+{\r
+#if BYTEORDER == 1234\r
+  return &ns(internal_little2_encoding).enc;\r
+#elif BYTEORDER == 4321\r
+  return &ns(internal_big2_encoding).enc;\r
+#else\r
+  const short n = 1;\r
+  return (*(const char *)&n\r
+          ? &ns(internal_little2_encoding).enc\r
+          : &ns(internal_big2_encoding).enc);\r
+#endif\r
+}\r
+\r
+static const ENCODING * const NS(encodings)[] = {\r
+  &ns(latin1_encoding).enc,\r
+  &ns(ascii_encoding).enc,\r
+  &ns(utf8_encoding).enc,\r
+  &ns(big2_encoding).enc,\r
+  &ns(big2_encoding).enc,\r
+  &ns(little2_encoding).enc,\r
+  &ns(utf8_encoding).enc /* NO_ENC */\r
+};\r
+\r
+static int PTRCALL\r
+NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,\r
+                   const char **nextTokPtr)\r
+{\r
+  return initScan(NS(encodings), (const INIT_ENCODING *)enc,\r
+                  XML_PROLOG_STATE, ptr, end, nextTokPtr);\r
+}\r
+\r
+static int PTRCALL\r
+NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,\r
+                    const char **nextTokPtr)\r
+{\r
+  return initScan(NS(encodings), (const INIT_ENCODING *)enc,\r
+                  XML_CONTENT_STATE, ptr, end, nextTokPtr);\r
+}\r
+\r
+int\r
+NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,\r
+                    const char *name)\r
+{\r
+  int i = getEncodingIndex(name);\r
+  if (i == UNKNOWN_ENC)\r
+    return 0;\r
+  SET_INIT_ENC_INDEX(p, i);\r
+  p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);\r
+  p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);\r
+  p->initEnc.updatePosition = initUpdatePosition;\r
+  p->encPtr = encPtr;\r
+  *encPtr = &(p->initEnc);\r
+  return 1;\r
+}\r
+\r
+static const ENCODING *\r
+NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end)\r
+{\r
+#define ENCODING_MAX 128\r
+  char buf[ENCODING_MAX];\r
+  char *p = buf;\r
+  int i;\r
+  XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);\r
+  if (ptr != end)\r
+    return 0;\r
+  *p = 0;\r
+  if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)\r
+    return enc;\r
+  i = getEncodingIndex(buf);\r
+  if (i == UNKNOWN_ENC)\r
+    return 0;\r
+  return NS(encodings)[i];\r
+}\r
+\r
+int\r
+NS(XmlParseXmlDecl)(int isGeneralTextEntity,\r
+                    const ENCODING *enc,\r
+                    const char *ptr,\r
+                    const char *end,\r
+                    const char **badPtr,\r
+                    const char **versionPtr,\r
+                    const char **versionEndPtr,\r
+                    const char **encodingName,\r
+                    const ENCODING **encoding,\r
+                    int *standalone)\r
+{\r
+  return doParseXmlDecl(NS(findEncoding),\r
+                        isGeneralTextEntity,\r
+                        enc,\r
+                        ptr,\r
+                        end,\r
+                        badPtr,\r
+                        versionPtr,\r
+                        versionEndPtr,\r
+                        encodingName,\r
+                        encoding,\r
+                        standalone);\r
+}\r
+\r
+#endif /* XML_TOK_NS_C */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/future_builtins.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/future_builtins.c
new file mode 100644 (file)
index 0000000..47696d5
--- /dev/null
@@ -0,0 +1,105 @@
+\r
+/* future_builtins module */\r
+\r
+/* This module provides functions that will be builtins in Python 3.0,\r
+   but that conflict with builtins that already exist in Python\r
+   2.x. */\r
+\r
+\r
+#include "Python.h"\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module provides functions that will be builtins in Python 3.0,\n\\r
+but that conflict with builtins that already exist in Python 2.x.\n\\r
+\n\\r
+Functions:\n\\r
+\n\\r
+ascii(arg) -- Returns the canonical string representation of an object.\n\\r
+filter(pred, iterable) -- Returns an iterator yielding those items of \n\\r
+       iterable for which pred(item) is true.\n\\r
+hex(arg) -- Returns the hexadecimal representation of an integer.\n\\r
+map(func, *iterables) -- Returns an iterator that computes the function \n\\r
+    using arguments from each of the iterables.\n\\r
+oct(arg) -- Returns the octal representation of an integer.\n\\r
+zip(iter1 [,iter2 [...]]) -- Returns a zip object whose .next() method \n\\r
+    returns a tuple where the i-th element comes from the i-th iterable \n\\r
+    argument.\n\\r
+\n\\r
+The typical usage of this module is to replace existing builtins in a\n\\r
+module's namespace:\n \n\\r
+from future_builtins import ascii, filter, map, hex, oct, zip\n");\r
+\r
+static PyObject *\r
+builtin_hex(PyObject *self, PyObject *v)\r
+{\r
+    return PyNumber_ToBase(v, 16);\r
+}\r
+\r
+PyDoc_STRVAR(hex_doc,\r
+"hex(number) -> string\n\\r
+\n\\r
+Return the hexadecimal representation of an integer or long integer.");\r
+\r
+\r
+static PyObject *\r
+builtin_oct(PyObject *self, PyObject *v)\r
+{\r
+    return PyNumber_ToBase(v, 8);\r
+}\r
+\r
+PyDoc_STRVAR(oct_doc,\r
+"oct(number) -> string\n\\r
+\n\\r
+Return the octal representation of an integer or long integer.");\r
+\r
+\r
+static PyObject *\r
+builtin_ascii(PyObject *self, PyObject *v)\r
+{\r
+    return PyObject_Repr(v);\r
+}\r
+\r
+PyDoc_STRVAR(ascii_doc,\r
+"ascii(object) -> string\n\\r
+\n\\r
+Return the same as repr().  In Python 3.x, the repr() result will\n\\r
+contain printable characters unescaped, while the ascii() result\n\\r
+will have such characters backslash-escaped.");\r
+\r
+/* List of functions exported by this module */\r
+\r
+static PyMethodDef module_functions[] = {\r
+    {"hex",             builtin_hex,        METH_O, hex_doc},\r
+    {"oct",             builtin_oct,        METH_O, oct_doc},\r
+    {"ascii",           builtin_ascii,      METH_O, ascii_doc},\r
+    {NULL,              NULL}   /* Sentinel */\r
+};\r
+\r
+\r
+/* Initialize this module. */\r
+\r
+PyMODINIT_FUNC\r
+initfuture_builtins(void)\r
+{\r
+    PyObject *m, *itertools, *iter_func;\r
+    char *it_funcs[] = {"imap", "ifilter", "izip", NULL};\r
+    char **cur_func;\r
+\r
+    m = Py_InitModule3("future_builtins", module_functions, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    itertools = PyImport_ImportModuleNoBlock("itertools");\r
+    if (itertools == NULL)\r
+        return;\r
+\r
+    /* If anything in the following loop fails, we fall through. */\r
+    for (cur_func = it_funcs; *cur_func; ++cur_func){\r
+        iter_func = PyObject_GetAttrString(itertools, *cur_func);\r
+        if (iter_func == NULL ||\r
+            PyModule_AddObject(m, *cur_func+1, iter_func) < 0)\r
+            break;\r
+    }\r
+    Py_DECREF(itertools);\r
+    /* any other initialization needed */\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/gcmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/gcmodule.c
new file mode 100644 (file)
index 0000000..1746887
--- /dev/null
@@ -0,0 +1,1570 @@
+/*\r
+\r
+  Reference Cycle Garbage Collection\r
+  ==================================\r
+\r
+  Neil Schemenauer <nas@arctrix.com>\r
+\r
+  Based on a post on the python-dev list.  Ideas from Guido van Rossum,\r
+  Eric Tiedemann, and various others.\r
+\r
+  http://www.arctrix.com/nas/python/gc/\r
+  http://www.python.org/pipermail/python-dev/2000-March/003869.html\r
+  http://www.python.org/pipermail/python-dev/2000-March/004010.html\r
+  http://www.python.org/pipermail/python-dev/2000-March/004022.html\r
+\r
+  For a highlevel view of the collection process, read the collect\r
+  function.\r
+\r
+*/\r
+\r
+#include "Python.h"\r
+#include "frameobject.h"        /* for PyFrame_ClearFreeList */\r
+\r
+/* Get an object's GC head */\r
+#define AS_GC(o) ((PyGC_Head *)(o)-1)\r
+\r
+/* Get the object given the GC head */\r
+#define FROM_GC(g) ((PyObject *)(((PyGC_Head *)g)+1))\r
+\r
+/*** Global GC state ***/\r
+\r
+struct gc_generation {\r
+    PyGC_Head head;\r
+    int threshold; /* collection threshold */\r
+    int count; /* count of allocations or collections of younger\r
+                  generations */\r
+};\r
+\r
+#define NUM_GENERATIONS 3\r
+#define GEN_HEAD(n) (&generations[n].head)\r
+\r
+/* linked lists of container objects */\r
+static struct gc_generation generations[NUM_GENERATIONS] = {\r
+    /* PyGC_Head,                               threshold,      count */\r
+    {{{GEN_HEAD(0), GEN_HEAD(0), 0}},           700,            0},\r
+    {{{GEN_HEAD(1), GEN_HEAD(1), 0}},           10,             0},\r
+    {{{GEN_HEAD(2), GEN_HEAD(2), 0}},           10,             0},\r
+};\r
+\r
+PyGC_Head *_PyGC_generation0 = GEN_HEAD(0);\r
+\r
+static int enabled = 1; /* automatic collection enabled? */\r
+\r
+/* true if we are currently running the collector */\r
+static int collecting = 0;\r
+\r
+/* list of uncollectable objects */\r
+static PyObject *garbage = NULL;\r
+\r
+/* Python string to use if unhandled exception occurs */\r
+static PyObject *gc_str = NULL;\r
+\r
+/* Python string used to look for __del__ attribute. */\r
+static PyObject *delstr = NULL;\r
+\r
+/* This is the number of objects who survived the last full collection. It\r
+   approximates the number of long lived objects tracked by the GC.\r
+\r
+   (by "full collection", we mean a collection of the oldest generation).\r
+*/\r
+static Py_ssize_t long_lived_total = 0;\r
+\r
+/* This is the number of objects who survived all "non-full" collections,\r
+   and are awaiting to undergo a full collection for the first time.\r
+\r
+*/\r
+static Py_ssize_t long_lived_pending = 0;\r
+\r
+/*\r
+   NOTE: about the counting of long-lived objects.\r
+\r
+   To limit the cost of garbage collection, there are two strategies;\r
+     - make each collection faster, e.g. by scanning fewer objects\r
+     - do less collections\r
+   This heuristic is about the latter strategy.\r
+\r
+   In addition to the various configurable thresholds, we only trigger a\r
+   full collection if the ratio\r
+    long_lived_pending / long_lived_total\r
+   is above a given value (hardwired to 25%).\r
+\r
+   The reason is that, while "non-full" collections (i.e., collections of\r
+   the young and middle generations) will always examine roughly the same\r
+   number of objects -- determined by the aforementioned thresholds --,\r
+   the cost of a full collection is proportional to the total number of\r
+   long-lived objects, which is virtually unbounded.\r
+\r
+   Indeed, it has been remarked that doing a full collection every\r
+   <constant number> of object creations entails a dramatic performance\r
+   degradation in workloads which consist in creating and storing lots of\r
+   long-lived objects (e.g. building a large list of GC-tracked objects would\r
+   show quadratic performance, instead of linear as expected: see issue #4074).\r
+\r
+   Using the above ratio, instead, yields amortized linear performance in\r
+   the total number of objects (the effect of which can be summarized\r
+   thusly: "each full garbage collection is more and more costly as the\r
+   number of objects grows, but we do fewer and fewer of them").\r
+\r
+   This heuristic was suggested by Martin von Löwis on python-dev in\r
+   June 2008. His original analysis and proposal can be found at:\r
+    http://mail.python.org/pipermail/python-dev/2008-June/080579.html\r
+*/\r
+\r
+/*\r
+   NOTE: about untracking of mutable objects.\r
+\r
+   Certain types of container cannot participate in a reference cycle, and\r
+   so do not need to be tracked by the garbage collector. Untracking these\r
+   objects reduces the cost of garbage collections. However, determining\r
+   which objects may be untracked is not free, and the costs must be\r
+   weighed against the benefits for garbage collection.\r
+\r
+   There are two possible strategies for when to untrack a container:\r
+\r
+   i) When the container is created.\r
+   ii) When the container is examined by the garbage collector.\r
+\r
+   Tuples containing only immutable objects (integers, strings etc, and\r
+   recursively, tuples of immutable objects) do not need to be tracked.\r
+   The interpreter creates a large number of tuples, many of which will\r
+   not survive until garbage collection. It is therefore not worthwhile\r
+   to untrack eligible tuples at creation time.\r
+\r
+   Instead, all tuples except the empty tuple are tracked when created.\r
+   During garbage collection it is determined whether any surviving tuples\r
+   can be untracked. A tuple can be untracked if all of its contents are\r
+   already not tracked. Tuples are examined for untracking in all garbage\r
+   collection cycles. It may take more than one cycle to untrack a tuple.\r
+\r
+   Dictionaries containing only immutable objects also do not need to be\r
+   tracked. Dictionaries are untracked when created. If a tracked item is\r
+   inserted into a dictionary (either as a key or value), the dictionary\r
+   becomes tracked. During a full garbage collection (all generations),\r
+   the collector will untrack any dictionaries whose contents are not\r
+   tracked.\r
+\r
+   The module provides the python function is_tracked(obj), which returns\r
+   the CURRENT tracking status of the object. Subsequent garbage\r
+   collections may change the tracking status of the object.\r
+\r
+   Untracking of certain containers was introduced in issue #4688, and\r
+   the algorithm was refined in response to issue #14775.\r
+*/\r
+\r
+/* set for debugging information */\r
+#define DEBUG_STATS             (1<<0) /* print collection statistics */\r
+#define DEBUG_COLLECTABLE       (1<<1) /* print collectable objects */\r
+#define DEBUG_UNCOLLECTABLE     (1<<2) /* print uncollectable objects */\r
+#define DEBUG_INSTANCES         (1<<3) /* print instances */\r
+#define DEBUG_OBJECTS           (1<<4) /* print other objects */\r
+#define DEBUG_SAVEALL           (1<<5) /* save all garbage in gc.garbage */\r
+#define DEBUG_LEAK              DEBUG_COLLECTABLE | \\r
+                DEBUG_UNCOLLECTABLE | \\r
+                DEBUG_INSTANCES | \\r
+                DEBUG_OBJECTS | \\r
+                DEBUG_SAVEALL\r
+static int debug;\r
+static PyObject *tmod = NULL;\r
+\r
+/*--------------------------------------------------------------------------\r
+gc_refs values.\r
+\r
+Between collections, every gc'ed object has one of two gc_refs values:\r
+\r
+GC_UNTRACKED\r
+    The initial state; objects returned by PyObject_GC_Malloc are in this\r
+    state.  The object doesn't live in any generation list, and its\r
+    tp_traverse slot must not be called.\r
+\r
+GC_REACHABLE\r
+    The object lives in some generation list, and its tp_traverse is safe to\r
+    call.  An object transitions to GC_REACHABLE when PyObject_GC_Track\r
+    is called.\r
+\r
+During a collection, gc_refs can temporarily take on other states:\r
+\r
+>= 0\r
+    At the start of a collection, update_refs() copies the true refcount\r
+    to gc_refs, for each object in the generation being collected.\r
+    subtract_refs() then adjusts gc_refs so that it equals the number of\r
+    times an object is referenced directly from outside the generation\r
+    being collected.\r
+    gc_refs remains >= 0 throughout these steps.\r
+\r
+GC_TENTATIVELY_UNREACHABLE\r
+    move_unreachable() then moves objects not reachable (whether directly or\r
+    indirectly) from outside the generation into an "unreachable" set.\r
+    Objects that are found to be reachable have gc_refs set to GC_REACHABLE\r
+    again.  Objects that are found to be unreachable have gc_refs set to\r
+    GC_TENTATIVELY_UNREACHABLE.  It's "tentatively" because the pass doing\r
+    this can't be sure until it ends, and GC_TENTATIVELY_UNREACHABLE may\r
+    transition back to GC_REACHABLE.\r
+\r
+    Only objects with GC_TENTATIVELY_UNREACHABLE still set are candidates\r
+    for collection.  If it's decided not to collect such an object (e.g.,\r
+    it has a __del__ method), its gc_refs is restored to GC_REACHABLE again.\r
+----------------------------------------------------------------------------\r
+*/\r
+#define GC_UNTRACKED                    _PyGC_REFS_UNTRACKED\r
+#define GC_REACHABLE                    _PyGC_REFS_REACHABLE\r
+#define GC_TENTATIVELY_UNREACHABLE      _PyGC_REFS_TENTATIVELY_UNREACHABLE\r
+\r
+#define IS_TRACKED(o) ((AS_GC(o))->gc.gc_refs != GC_UNTRACKED)\r
+#define IS_REACHABLE(o) ((AS_GC(o))->gc.gc_refs == GC_REACHABLE)\r
+#define IS_TENTATIVELY_UNREACHABLE(o) ( \\r
+    (AS_GC(o))->gc.gc_refs == GC_TENTATIVELY_UNREACHABLE)\r
+\r
+/*** list functions ***/\r
+\r
+static void\r
+gc_list_init(PyGC_Head *list)\r
+{\r
+    list->gc.gc_prev = list;\r
+    list->gc.gc_next = list;\r
+}\r
+\r
+static int\r
+gc_list_is_empty(PyGC_Head *list)\r
+{\r
+    return (list->gc.gc_next == list);\r
+}\r
+\r
+#if 0\r
+/* This became unused after gc_list_move() was introduced. */\r
+/* Append `node` to `list`. */\r
+static void\r
+gc_list_append(PyGC_Head *node, PyGC_Head *list)\r
+{\r
+    node->gc.gc_next = list;\r
+    node->gc.gc_prev = list->gc.gc_prev;\r
+    node->gc.gc_prev->gc.gc_next = node;\r
+    list->gc.gc_prev = node;\r
+}\r
+#endif\r
+\r
+/* Remove `node` from the gc list it's currently in. */\r
+static void\r
+gc_list_remove(PyGC_Head *node)\r
+{\r
+    node->gc.gc_prev->gc.gc_next = node->gc.gc_next;\r
+    node->gc.gc_next->gc.gc_prev = node->gc.gc_prev;\r
+    node->gc.gc_next = NULL; /* object is not currently tracked */\r
+}\r
+\r
+/* Move `node` from the gc list it's currently in (which is not explicitly\r
+ * named here) to the end of `list`.  This is semantically the same as\r
+ * gc_list_remove(node) followed by gc_list_append(node, list).\r
+ */\r
+static void\r
+gc_list_move(PyGC_Head *node, PyGC_Head *list)\r
+{\r
+    PyGC_Head *new_prev;\r
+    PyGC_Head *current_prev = node->gc.gc_prev;\r
+    PyGC_Head *current_next = node->gc.gc_next;\r
+    /* Unlink from current list. */\r
+    current_prev->gc.gc_next = current_next;\r
+    current_next->gc.gc_prev = current_prev;\r
+    /* Relink at end of new list. */\r
+    new_prev = node->gc.gc_prev = list->gc.gc_prev;\r
+    new_prev->gc.gc_next = list->gc.gc_prev = node;\r
+    node->gc.gc_next = list;\r
+}\r
+\r
+/* append list `from` onto list `to`; `from` becomes an empty list */\r
+static void\r
+gc_list_merge(PyGC_Head *from, PyGC_Head *to)\r
+{\r
+    PyGC_Head *tail;\r
+    assert(from != to);\r
+    if (!gc_list_is_empty(from)) {\r
+        tail = to->gc.gc_prev;\r
+        tail->gc.gc_next = from->gc.gc_next;\r
+        tail->gc.gc_next->gc.gc_prev = tail;\r
+        to->gc.gc_prev = from->gc.gc_prev;\r
+        to->gc.gc_prev->gc.gc_next = to;\r
+    }\r
+    gc_list_init(from);\r
+}\r
+\r
+static Py_ssize_t\r
+gc_list_size(PyGC_Head *list)\r
+{\r
+    PyGC_Head *gc;\r
+    Py_ssize_t n = 0;\r
+    for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {\r
+        n++;\r
+    }\r
+    return n;\r
+}\r
+\r
+/* Append objects in a GC list to a Python list.\r
+ * Return 0 if all OK, < 0 if error (out of memory for list).\r
+ */\r
+static int\r
+append_objects(PyObject *py_list, PyGC_Head *gc_list)\r
+{\r
+    PyGC_Head *gc;\r
+    for (gc = gc_list->gc.gc_next; gc != gc_list; gc = gc->gc.gc_next) {\r
+        PyObject *op = FROM_GC(gc);\r
+        if (op != py_list) {\r
+            if (PyList_Append(py_list, op)) {\r
+                return -1; /* exception */\r
+            }\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/*** end of list stuff ***/\r
+\r
+\r
+/* Set all gc_refs = ob_refcnt.  After this, gc_refs is > 0 for all objects\r
+ * in containers, and is GC_REACHABLE for all tracked gc objects not in\r
+ * containers.\r
+ */\r
+static void\r
+update_refs(PyGC_Head *containers)\r
+{\r
+    PyGC_Head *gc = containers->gc.gc_next;\r
+    for (; gc != containers; gc = gc->gc.gc_next) {\r
+        assert(gc->gc.gc_refs == GC_REACHABLE);\r
+        gc->gc.gc_refs = Py_REFCNT(FROM_GC(gc));\r
+        /* Python's cyclic gc should never see an incoming refcount\r
+         * of 0:  if something decref'ed to 0, it should have been\r
+         * deallocated immediately at that time.\r
+         * Possible cause (if the assert triggers):  a tp_dealloc\r
+         * routine left a gc-aware object tracked during its teardown\r
+         * phase, and did something-- or allowed something to happen --\r
+         * that called back into Python.  gc can trigger then, and may\r
+         * see the still-tracked dying object.  Before this assert\r
+         * was added, such mistakes went on to allow gc to try to\r
+         * delete the object again.  In a debug build, that caused\r
+         * a mysterious segfault, when _Py_ForgetReference tried\r
+         * to remove the object from the doubly-linked list of all\r
+         * objects a second time.  In a release build, an actual\r
+         * double deallocation occurred, which leads to corruption\r
+         * of the allocator's internal bookkeeping pointers.  That's\r
+         * so serious that maybe this should be a release-build\r
+         * check instead of an assert?\r
+         */\r
+        assert(gc->gc.gc_refs != 0);\r
+    }\r
+}\r
+\r
+/* A traversal callback for subtract_refs. */\r
+static int\r
+visit_decref(PyObject *op, void *data)\r
+{\r
+    assert(op != NULL);\r
+    if (PyObject_IS_GC(op)) {\r
+        PyGC_Head *gc = AS_GC(op);\r
+        /* We're only interested in gc_refs for objects in the\r
+         * generation being collected, which can be recognized\r
+         * because only they have positive gc_refs.\r
+         */\r
+        assert(gc->gc.gc_refs != 0); /* else refcount was too small */\r
+        if (gc->gc.gc_refs > 0)\r
+            gc->gc.gc_refs--;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Subtract internal references from gc_refs.  After this, gc_refs is >= 0\r
+ * for all objects in containers, and is GC_REACHABLE for all tracked gc\r
+ * objects not in containers.  The ones with gc_refs > 0 are directly\r
+ * reachable from outside containers, and so can't be collected.\r
+ */\r
+static void\r
+subtract_refs(PyGC_Head *containers)\r
+{\r
+    traverseproc traverse;\r
+    PyGC_Head *gc = containers->gc.gc_next;\r
+    for (; gc != containers; gc=gc->gc.gc_next) {\r
+        traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;\r
+        (void) traverse(FROM_GC(gc),\r
+                       (visitproc)visit_decref,\r
+                       NULL);\r
+    }\r
+}\r
+\r
+/* A traversal callback for move_unreachable. */\r
+static int\r
+visit_reachable(PyObject *op, PyGC_Head *reachable)\r
+{\r
+    if (PyObject_IS_GC(op)) {\r
+        PyGC_Head *gc = AS_GC(op);\r
+        const Py_ssize_t gc_refs = gc->gc.gc_refs;\r
+\r
+        if (gc_refs == 0) {\r
+            /* This is in move_unreachable's 'young' list, but\r
+             * the traversal hasn't yet gotten to it.  All\r
+             * we need to do is tell move_unreachable that it's\r
+             * reachable.\r
+             */\r
+            gc->gc.gc_refs = 1;\r
+        }\r
+        else if (gc_refs == GC_TENTATIVELY_UNREACHABLE) {\r
+            /* This had gc_refs = 0 when move_unreachable got\r
+             * to it, but turns out it's reachable after all.\r
+             * Move it back to move_unreachable's 'young' list,\r
+             * and move_unreachable will eventually get to it\r
+             * again.\r
+             */\r
+            gc_list_move(gc, reachable);\r
+            gc->gc.gc_refs = 1;\r
+        }\r
+        /* Else there's nothing to do.\r
+         * If gc_refs > 0, it must be in move_unreachable's 'young'\r
+         * list, and move_unreachable will eventually get to it.\r
+         * If gc_refs == GC_REACHABLE, it's either in some other\r
+         * generation so we don't care about it, or move_unreachable\r
+         * already dealt with it.\r
+         * If gc_refs == GC_UNTRACKED, it must be ignored.\r
+         */\r
+         else {\r
+            assert(gc_refs > 0\r
+                   || gc_refs == GC_REACHABLE\r
+                   || gc_refs == GC_UNTRACKED);\r
+         }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Move the unreachable objects from young to unreachable.  After this,\r
+ * all objects in young have gc_refs = GC_REACHABLE, and all objects in\r
+ * unreachable have gc_refs = GC_TENTATIVELY_UNREACHABLE.  All tracked\r
+ * gc objects not in young or unreachable still have gc_refs = GC_REACHABLE.\r
+ * All objects in young after this are directly or indirectly reachable\r
+ * from outside the original young; and all objects in unreachable are\r
+ * not.\r
+ */\r
+static void\r
+move_unreachable(PyGC_Head *young, PyGC_Head *unreachable)\r
+{\r
+    PyGC_Head *gc = young->gc.gc_next;\r
+\r
+    /* Invariants:  all objects "to the left" of us in young have gc_refs\r
+     * = GC_REACHABLE, and are indeed reachable (directly or indirectly)\r
+     * from outside the young list as it was at entry.  All other objects\r
+     * from the original young "to the left" of us are in unreachable now,\r
+     * and have gc_refs = GC_TENTATIVELY_UNREACHABLE.  All objects to the\r
+     * left of us in 'young' now have been scanned, and no objects here\r
+     * or to the right have been scanned yet.\r
+     */\r
+\r
+    while (gc != young) {\r
+        PyGC_Head *next;\r
+\r
+        if (gc->gc.gc_refs) {\r
+            /* gc is definitely reachable from outside the\r
+             * original 'young'.  Mark it as such, and traverse\r
+             * its pointers to find any other objects that may\r
+             * be directly reachable from it.  Note that the\r
+             * call to tp_traverse may append objects to young,\r
+             * so we have to wait until it returns to determine\r
+             * the next object to visit.\r
+             */\r
+            PyObject *op = FROM_GC(gc);\r
+            traverseproc traverse = Py_TYPE(op)->tp_traverse;\r
+            assert(gc->gc.gc_refs > 0);\r
+            gc->gc.gc_refs = GC_REACHABLE;\r
+            (void) traverse(op,\r
+                            (visitproc)visit_reachable,\r
+                            (void *)young);\r
+            next = gc->gc.gc_next;\r
+            if (PyTuple_CheckExact(op)) {\r
+                _PyTuple_MaybeUntrack(op);\r
+            }\r
+        }\r
+        else {\r
+            /* This *may* be unreachable.  To make progress,\r
+             * assume it is.  gc isn't directly reachable from\r
+             * any object we've already traversed, but may be\r
+             * reachable from an object we haven't gotten to yet.\r
+             * visit_reachable will eventually move gc back into\r
+             * young if that's so, and we'll see it again.\r
+             */\r
+            next = gc->gc.gc_next;\r
+            gc_list_move(gc, unreachable);\r
+            gc->gc.gc_refs = GC_TENTATIVELY_UNREACHABLE;\r
+        }\r
+        gc = next;\r
+    }\r
+}\r
+\r
+/* Return true if object has a finalization method.\r
+ * CAUTION:  An instance of an old-style class has to be checked for a\r
+ *__del__ method, and earlier versions of this used to call PyObject_HasAttr,\r
+ * which in turn could call the class's __getattr__ hook (if any).  That\r
+ * could invoke arbitrary Python code, mutating the object graph in arbitrary\r
+ * ways, and that was the source of some excruciatingly subtle bugs.\r
+ */\r
+static int\r
+has_finalizer(PyObject *op)\r
+{\r
+    if (PyInstance_Check(op)) {\r
+        assert(delstr != NULL);\r
+        return _PyInstance_Lookup(op, delstr) != NULL;\r
+    }\r
+    else if (PyType_HasFeature(op->ob_type, Py_TPFLAGS_HEAPTYPE))\r
+        return op->ob_type->tp_del != NULL;\r
+    else if (PyGen_CheckExact(op))\r
+        return PyGen_NeedsFinalizing((PyGenObject *)op);\r
+    else\r
+        return 0;\r
+}\r
+\r
+/* Try to untrack all currently tracked dictionaries */\r
+static void\r
+untrack_dicts(PyGC_Head *head)\r
+{\r
+    PyGC_Head *next, *gc = head->gc.gc_next;\r
+    while (gc != head) {\r
+        PyObject *op = FROM_GC(gc);\r
+        next = gc->gc.gc_next;\r
+        if (PyDict_CheckExact(op))\r
+            _PyDict_MaybeUntrack(op);\r
+        gc = next;\r
+    }\r
+}\r
+\r
+/* Move the objects in unreachable with __del__ methods into `finalizers`.\r
+ * Objects moved into `finalizers` have gc_refs set to GC_REACHABLE; the\r
+ * objects remaining in unreachable are left at GC_TENTATIVELY_UNREACHABLE.\r
+ */\r
+static void\r
+move_finalizers(PyGC_Head *unreachable, PyGC_Head *finalizers)\r
+{\r
+    PyGC_Head *gc;\r
+    PyGC_Head *next;\r
+\r
+    /* March over unreachable.  Move objects with finalizers into\r
+     * `finalizers`.\r
+     */\r
+    for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {\r
+        PyObject *op = FROM_GC(gc);\r
+\r
+        assert(IS_TENTATIVELY_UNREACHABLE(op));\r
+        next = gc->gc.gc_next;\r
+\r
+        if (has_finalizer(op)) {\r
+            gc_list_move(gc, finalizers);\r
+            gc->gc.gc_refs = GC_REACHABLE;\r
+        }\r
+    }\r
+}\r
+\r
+/* A traversal callback for move_finalizer_reachable. */\r
+static int\r
+visit_move(PyObject *op, PyGC_Head *tolist)\r
+{\r
+    if (PyObject_IS_GC(op)) {\r
+        if (IS_TENTATIVELY_UNREACHABLE(op)) {\r
+            PyGC_Head *gc = AS_GC(op);\r
+            gc_list_move(gc, tolist);\r
+            gc->gc.gc_refs = GC_REACHABLE;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Move objects that are reachable from finalizers, from the unreachable set\r
+ * into finalizers set.\r
+ */\r
+static void\r
+move_finalizer_reachable(PyGC_Head *finalizers)\r
+{\r
+    traverseproc traverse;\r
+    PyGC_Head *gc = finalizers->gc.gc_next;\r
+    for (; gc != finalizers; gc = gc->gc.gc_next) {\r
+        /* Note that the finalizers list may grow during this. */\r
+        traverse = Py_TYPE(FROM_GC(gc))->tp_traverse;\r
+        (void) traverse(FROM_GC(gc),\r
+                        (visitproc)visit_move,\r
+                        (void *)finalizers);\r
+    }\r
+}\r
+\r
+/* Clear all weakrefs to unreachable objects, and if such a weakref has a\r
+ * callback, invoke it if necessary.  Note that it's possible for such\r
+ * weakrefs to be outside the unreachable set -- indeed, those are precisely\r
+ * the weakrefs whose callbacks must be invoked.  See gc_weakref.txt for\r
+ * overview & some details.  Some weakrefs with callbacks may be reclaimed\r
+ * directly by this routine; the number reclaimed is the return value.  Other\r
+ * weakrefs with callbacks may be moved into the `old` generation.  Objects\r
+ * moved into `old` have gc_refs set to GC_REACHABLE; the objects remaining in\r
+ * unreachable are left at GC_TENTATIVELY_UNREACHABLE.  When this returns,\r
+ * no object in `unreachable` is weakly referenced anymore.\r
+ */\r
+static int\r
+handle_weakrefs(PyGC_Head *unreachable, PyGC_Head *old)\r
+{\r
+    PyGC_Head *gc;\r
+    PyObject *op;               /* generally FROM_GC(gc) */\r
+    PyWeakReference *wr;        /* generally a cast of op */\r
+    PyGC_Head wrcb_to_call;     /* weakrefs with callbacks to call */\r
+    PyGC_Head *next;\r
+    int num_freed = 0;\r
+\r
+    gc_list_init(&wrcb_to_call);\r
+\r
+    /* Clear all weakrefs to the objects in unreachable.  If such a weakref\r
+     * also has a callback, move it into `wrcb_to_call` if the callback\r
+     * needs to be invoked.  Note that we cannot invoke any callbacks until\r
+     * all weakrefs to unreachable objects are cleared, lest the callback\r
+     * resurrect an unreachable object via a still-active weakref.  We\r
+     * make another pass over wrcb_to_call, invoking callbacks, after this\r
+     * pass completes.\r
+     */\r
+    for (gc = unreachable->gc.gc_next; gc != unreachable; gc = next) {\r
+        PyWeakReference **wrlist;\r
+\r
+        op = FROM_GC(gc);\r
+        assert(IS_TENTATIVELY_UNREACHABLE(op));\r
+        next = gc->gc.gc_next;\r
+\r
+        if (! PyType_SUPPORTS_WEAKREFS(Py_TYPE(op)))\r
+            continue;\r
+\r
+        /* It supports weakrefs.  Does it have any? */\r
+        wrlist = (PyWeakReference **)\r
+                                PyObject_GET_WEAKREFS_LISTPTR(op);\r
+\r
+        /* `op` may have some weakrefs.  March over the list, clear\r
+         * all the weakrefs, and move the weakrefs with callbacks\r
+         * that must be called into wrcb_to_call.\r
+         */\r
+        for (wr = *wrlist; wr != NULL; wr = *wrlist) {\r
+            PyGC_Head *wrasgc;                  /* AS_GC(wr) */\r
+\r
+            /* _PyWeakref_ClearRef clears the weakref but leaves\r
+             * the callback pointer intact.  Obscure:  it also\r
+             * changes *wrlist.\r
+             */\r
+            assert(wr->wr_object == op);\r
+            _PyWeakref_ClearRef(wr);\r
+            assert(wr->wr_object == Py_None);\r
+            if (wr->wr_callback == NULL)\r
+                continue;                       /* no callback */\r
+\r
+    /* Headache time.  `op` is going away, and is weakly referenced by\r
+     * `wr`, which has a callback.  Should the callback be invoked?  If wr\r
+     * is also trash, no:\r
+     *\r
+     * 1. There's no need to call it.  The object and the weakref are\r
+     *    both going away, so it's legitimate to pretend the weakref is\r
+     *    going away first.  The user has to ensure a weakref outlives its\r
+     *    referent if they want a guarantee that the wr callback will get\r
+     *    invoked.\r
+     *\r
+     * 2. It may be catastrophic to call it.  If the callback is also in\r
+     *    cyclic trash (CT), then although the CT is unreachable from\r
+     *    outside the current generation, CT may be reachable from the\r
+     *    callback.  Then the callback could resurrect insane objects.\r
+     *\r
+     * Since the callback is never needed and may be unsafe in this case,\r
+     * wr is simply left in the unreachable set.  Note that because we\r
+     * already called _PyWeakref_ClearRef(wr), its callback will never\r
+     * trigger.\r
+     *\r
+     * OTOH, if wr isn't part of CT, we should invoke the callback:  the\r
+     * weakref outlived the trash.  Note that since wr isn't CT in this\r
+     * case, its callback can't be CT either -- wr acted as an external\r
+     * root to this generation, and therefore its callback did too.  So\r
+     * nothing in CT is reachable from the callback either, so it's hard\r
+     * to imagine how calling it later could create a problem for us.  wr\r
+     * is moved to wrcb_to_call in this case.\r
+     */\r
+            if (IS_TENTATIVELY_UNREACHABLE(wr))\r
+                continue;\r
+            assert(IS_REACHABLE(wr));\r
+\r
+            /* Create a new reference so that wr can't go away\r
+             * before we can process it again.\r
+             */\r
+            Py_INCREF(wr);\r
+\r
+            /* Move wr to wrcb_to_call, for the next pass. */\r
+            wrasgc = AS_GC(wr);\r
+            assert(wrasgc != next); /* wrasgc is reachable, but\r
+                                       next isn't, so they can't\r
+                                       be the same */\r
+            gc_list_move(wrasgc, &wrcb_to_call);\r
+        }\r
+    }\r
+\r
+    /* Invoke the callbacks we decided to honor.  It's safe to invoke them\r
+     * because they can't reference unreachable objects.\r
+     */\r
+    while (! gc_list_is_empty(&wrcb_to_call)) {\r
+        PyObject *temp;\r
+        PyObject *callback;\r
+\r
+        gc = wrcb_to_call.gc.gc_next;\r
+        op = FROM_GC(gc);\r
+        assert(IS_REACHABLE(op));\r
+        assert(PyWeakref_Check(op));\r
+        wr = (PyWeakReference *)op;\r
+        callback = wr->wr_callback;\r
+        assert(callback != NULL);\r
+\r
+        /* copy-paste of weakrefobject.c's handle_callback() */\r
+        temp = PyObject_CallFunctionObjArgs(callback, wr, NULL);\r
+        if (temp == NULL)\r
+            PyErr_WriteUnraisable(callback);\r
+        else\r
+            Py_DECREF(temp);\r
+\r
+        /* Give up the reference we created in the first pass.  When\r
+         * op's refcount hits 0 (which it may or may not do right now),\r
+         * op's tp_dealloc will decref op->wr_callback too.  Note\r
+         * that the refcount probably will hit 0 now, and because this\r
+         * weakref was reachable to begin with, gc didn't already\r
+         * add it to its count of freed objects.  Example:  a reachable\r
+         * weak value dict maps some key to this reachable weakref.\r
+         * The callback removes this key->weakref mapping from the\r
+         * dict, leaving no other references to the weakref (excepting\r
+         * ours).\r
+         */\r
+        Py_DECREF(op);\r
+        if (wrcb_to_call.gc.gc_next == gc) {\r
+            /* object is still alive -- move it */\r
+            gc_list_move(gc, old);\r
+        }\r
+        else\r
+            ++num_freed;\r
+    }\r
+\r
+    return num_freed;\r
+}\r
+\r
+static void\r
+debug_instance(char *msg, PyInstanceObject *inst)\r
+{\r
+    char *cname;\r
+    /* simple version of instance_repr */\r
+    PyObject *classname = inst->in_class->cl_name;\r
+    if (classname != NULL && PyString_Check(classname))\r
+        cname = PyString_AsString(classname);\r
+    else\r
+        cname = "?";\r
+    PySys_WriteStderr("gc: %.100s <%.100s instance at %p>\n",\r
+                      msg, cname, inst);\r
+}\r
+\r
+static void\r
+debug_cycle(char *msg, PyObject *op)\r
+{\r
+    if ((debug & DEBUG_INSTANCES) && PyInstance_Check(op)) {\r
+        debug_instance(msg, (PyInstanceObject *)op);\r
+    }\r
+    else if (debug & DEBUG_OBJECTS) {\r
+        PySys_WriteStderr("gc: %.100s <%.100s %p>\n",\r
+                          msg, Py_TYPE(op)->tp_name, op);\r
+    }\r
+}\r
+\r
+/* Handle uncollectable garbage (cycles with finalizers, and stuff reachable\r
+ * only from such cycles).\r
+ * If DEBUG_SAVEALL, all objects in finalizers are appended to the module\r
+ * garbage list (a Python list), else only the objects in finalizers with\r
+ * __del__ methods are appended to garbage.  All objects in finalizers are\r
+ * merged into the old list regardless.\r
+ * Returns 0 if all OK, <0 on error (out of memory to grow the garbage list).\r
+ * The finalizers list is made empty on a successful return.\r
+ */\r
+static int\r
+handle_finalizers(PyGC_Head *finalizers, PyGC_Head *old)\r
+{\r
+    PyGC_Head *gc = finalizers->gc.gc_next;\r
+\r
+    if (garbage == NULL) {\r
+        garbage = PyList_New(0);\r
+        if (garbage == NULL)\r
+            Py_FatalError("gc couldn't create gc.garbage list");\r
+    }\r
+    for (; gc != finalizers; gc = gc->gc.gc_next) {\r
+        PyObject *op = FROM_GC(gc);\r
+\r
+        if ((debug & DEBUG_SAVEALL) || has_finalizer(op)) {\r
+            if (PyList_Append(garbage, op) < 0)\r
+                return -1;\r
+        }\r
+    }\r
+\r
+    gc_list_merge(finalizers, old);\r
+    return 0;\r
+}\r
+\r
+/* Break reference cycles by clearing the containers involved.  This is\r
+ * tricky business as the lists can be changing and we don't know which\r
+ * objects may be freed.  It is possible I screwed something up here.\r
+ */\r
+static void\r
+delete_garbage(PyGC_Head *collectable, PyGC_Head *old)\r
+{\r
+    inquiry clear;\r
+\r
+    while (!gc_list_is_empty(collectable)) {\r
+        PyGC_Head *gc = collectable->gc.gc_next;\r
+        PyObject *op = FROM_GC(gc);\r
+\r
+        assert(IS_TENTATIVELY_UNREACHABLE(op));\r
+        if (debug & DEBUG_SAVEALL) {\r
+            PyList_Append(garbage, op);\r
+        }\r
+        else {\r
+            if ((clear = Py_TYPE(op)->tp_clear) != NULL) {\r
+                Py_INCREF(op);\r
+                clear(op);\r
+                Py_DECREF(op);\r
+            }\r
+        }\r
+        if (collectable->gc.gc_next == gc) {\r
+            /* object is still alive, move it, it may die later */\r
+            gc_list_move(gc, old);\r
+            gc->gc.gc_refs = GC_REACHABLE;\r
+        }\r
+    }\r
+}\r
+\r
+/* Clear all free lists\r
+ * All free lists are cleared during the collection of the highest generation.\r
+ * Allocated items in the free list may keep a pymalloc arena occupied.\r
+ * Clearing the free lists may give back memory to the OS earlier.\r
+ */\r
+static void\r
+clear_freelists(void)\r
+{\r
+    (void)PyMethod_ClearFreeList();\r
+    (void)PyFrame_ClearFreeList();\r
+    (void)PyCFunction_ClearFreeList();\r
+    (void)PyTuple_ClearFreeList();\r
+#ifdef Py_USING_UNICODE\r
+    (void)PyUnicode_ClearFreeList();\r
+#endif\r
+    (void)PyInt_ClearFreeList();\r
+    (void)PyFloat_ClearFreeList();\r
+}\r
+\r
+static double\r
+get_time(void)\r
+{\r
+    double result = 0;\r
+    if (tmod != NULL) {\r
+        PyObject *f = PyObject_CallMethod(tmod, "time", NULL);\r
+        if (f == NULL) {\r
+            PyErr_Clear();\r
+        }\r
+        else {\r
+            if (PyFloat_Check(f))\r
+                result = PyFloat_AsDouble(f);\r
+            Py_DECREF(f);\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+/* This is the main function.  Read this to understand how the\r
+ * collection process works. */\r
+static Py_ssize_t\r
+collect(int generation)\r
+{\r
+    int i;\r
+    Py_ssize_t m = 0; /* # objects collected */\r
+    Py_ssize_t n = 0; /* # unreachable objects that couldn't be collected */\r
+    PyGC_Head *young; /* the generation we are examining */\r
+    PyGC_Head *old; /* next older generation */\r
+    PyGC_Head unreachable; /* non-problematic unreachable trash */\r
+    PyGC_Head finalizers;  /* objects with, & reachable from, __del__ */\r
+    PyGC_Head *gc;\r
+    double t1 = 0.0;\r
+\r
+    if (delstr == NULL) {\r
+        delstr = PyString_InternFromString("__del__");\r
+        if (delstr == NULL)\r
+            Py_FatalError("gc couldn't allocate \"__del__\"");\r
+    }\r
+\r
+    if (debug & DEBUG_STATS) {\r
+        PySys_WriteStderr("gc: collecting generation %d...\n",\r
+                          generation);\r
+        PySys_WriteStderr("gc: objects in each generation:");\r
+        for (i = 0; i < NUM_GENERATIONS; i++)\r
+            PySys_WriteStderr(" %" PY_FORMAT_SIZE_T "d",\r
+                              gc_list_size(GEN_HEAD(i)));\r
+        t1 = get_time();\r
+        PySys_WriteStderr("\n");\r
+    }\r
+\r
+    /* update collection and allocation counters */\r
+    if (generation+1 < NUM_GENERATIONS)\r
+        generations[generation+1].count += 1;\r
+    for (i = 0; i <= generation; i++)\r
+        generations[i].count = 0;\r
+\r
+    /* merge younger generations with one we are currently collecting */\r
+    for (i = 0; i < generation; i++) {\r
+        gc_list_merge(GEN_HEAD(i), GEN_HEAD(generation));\r
+    }\r
+\r
+    /* handy references */\r
+    young = GEN_HEAD(generation);\r
+    if (generation < NUM_GENERATIONS-1)\r
+        old = GEN_HEAD(generation+1);\r
+    else\r
+        old = young;\r
+\r
+    /* Using ob_refcnt and gc_refs, calculate which objects in the\r
+     * container set are reachable from outside the set (i.e., have a\r
+     * refcount greater than 0 when all the references within the\r
+     * set are taken into account).\r
+     */\r
+    update_refs(young);\r
+    subtract_refs(young);\r
+\r
+    /* Leave everything reachable from outside young in young, and move\r
+     * everything else (in young) to unreachable.\r
+     * NOTE:  This used to move the reachable objects into a reachable\r
+     * set instead.  But most things usually turn out to be reachable,\r
+     * so it's more efficient to move the unreachable things.\r
+     */\r
+    gc_list_init(&unreachable);\r
+    move_unreachable(young, &unreachable);\r
+\r
+    /* Move reachable objects to next generation. */\r
+    if (young != old) {\r
+        if (generation == NUM_GENERATIONS - 2) {\r
+            long_lived_pending += gc_list_size(young);\r
+        }\r
+        gc_list_merge(young, old);\r
+    }\r
+    else {\r
+        /* We only untrack dicts in full collections, to avoid quadratic\r
+           dict build-up. See issue #14775. */\r
+        untrack_dicts(young);\r
+        long_lived_pending = 0;\r
+        long_lived_total = gc_list_size(young);\r
+    }\r
+\r
+    /* All objects in unreachable are trash, but objects reachable from\r
+     * finalizers can't safely be deleted.  Python programmers should take\r
+     * care not to create such things.  For Python, finalizers means\r
+     * instance objects with __del__ methods.  Weakrefs with callbacks\r
+     * can also call arbitrary Python code but they will be dealt with by\r
+     * handle_weakrefs().\r
+     */\r
+    gc_list_init(&finalizers);\r
+    move_finalizers(&unreachable, &finalizers);\r
+    /* finalizers contains the unreachable objects with a finalizer;\r
+     * unreachable objects reachable *from* those are also uncollectable,\r
+     * and we move those into the finalizers list too.\r
+     */\r
+    move_finalizer_reachable(&finalizers);\r
+\r
+    /* Collect statistics on collectable objects found and print\r
+     * debugging information.\r
+     */\r
+    for (gc = unreachable.gc.gc_next; gc != &unreachable;\r
+                    gc = gc->gc.gc_next) {\r
+        m++;\r
+        if (debug & DEBUG_COLLECTABLE) {\r
+            debug_cycle("collectable", FROM_GC(gc));\r
+        }\r
+    }\r
+\r
+    /* Clear weakrefs and invoke callbacks as necessary. */\r
+    m += handle_weakrefs(&unreachable, old);\r
+\r
+    /* Call tp_clear on objects in the unreachable set.  This will cause\r
+     * the reference cycles to be broken.  It may also cause some objects\r
+     * in finalizers to be freed.\r
+     */\r
+    delete_garbage(&unreachable, old);\r
+\r
+    /* Collect statistics on uncollectable objects found and print\r
+     * debugging information. */\r
+    for (gc = finalizers.gc.gc_next;\r
+         gc != &finalizers;\r
+         gc = gc->gc.gc_next) {\r
+        n++;\r
+        if (debug & DEBUG_UNCOLLECTABLE)\r
+            debug_cycle("uncollectable", FROM_GC(gc));\r
+    }\r
+    if (debug & DEBUG_STATS) {\r
+        double t2 = get_time();\r
+        if (m == 0 && n == 0)\r
+            PySys_WriteStderr("gc: done");\r
+        else\r
+            PySys_WriteStderr(\r
+                "gc: done, "\r
+                "%" PY_FORMAT_SIZE_T "d unreachable, "\r
+                "%" PY_FORMAT_SIZE_T "d uncollectable",\r
+                n+m, n);\r
+        if (t1 && t2) {\r
+            PySys_WriteStderr(", %.4fs elapsed", t2-t1);\r
+        }\r
+        PySys_WriteStderr(".\n");\r
+    }\r
+\r
+    /* Append instances in the uncollectable set to a Python\r
+     * reachable list of garbage.  The programmer has to deal with\r
+     * this if they insist on creating this type of structure.\r
+     */\r
+    (void)handle_finalizers(&finalizers, old);\r
+\r
+    /* Clear free list only during the collection of the highest\r
+     * generation */\r
+    if (generation == NUM_GENERATIONS-1) {\r
+        clear_freelists();\r
+    }\r
+\r
+    if (PyErr_Occurred()) {\r
+        if (gc_str == NULL)\r
+            gc_str = PyString_FromString("garbage collection");\r
+        PyErr_WriteUnraisable(gc_str);\r
+        Py_FatalError("unexpected exception during garbage collection");\r
+    }\r
+    return n+m;\r
+}\r
+\r
+static Py_ssize_t\r
+collect_generations(void)\r
+{\r
+    int i;\r
+    Py_ssize_t n = 0;\r
+\r
+    /* Find the oldest generation (highest numbered) where the count\r
+     * exceeds the threshold.  Objects in the that generation and\r
+     * generations younger than it will be collected. */\r
+    for (i = NUM_GENERATIONS-1; i >= 0; i--) {\r
+        if (generations[i].count > generations[i].threshold) {\r
+            /* Avoid quadratic performance degradation in number\r
+               of tracked objects. See comments at the beginning\r
+               of this file, and issue #4074.\r
+            */\r
+            if (i == NUM_GENERATIONS - 1\r
+                && long_lived_pending < long_lived_total / 4)\r
+                continue;\r
+            n = collect(i);\r
+            break;\r
+        }\r
+    }\r
+    return n;\r
+}\r
+\r
+PyDoc_STRVAR(gc_enable__doc__,\r
+"enable() -> None\n"\r
+"\n"\r
+"Enable automatic garbage collection.\n");\r
+\r
+static PyObject *\r
+gc_enable(PyObject *self, PyObject *noargs)\r
+{\r
+    enabled = 1;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(gc_disable__doc__,\r
+"disable() -> None\n"\r
+"\n"\r
+"Disable automatic garbage collection.\n");\r
+\r
+static PyObject *\r
+gc_disable(PyObject *self, PyObject *noargs)\r
+{\r
+    enabled = 0;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(gc_isenabled__doc__,\r
+"isenabled() -> status\n"\r
+"\n"\r
+"Returns true if automatic garbage collection is enabled.\n");\r
+\r
+static PyObject *\r
+gc_isenabled(PyObject *self, PyObject *noargs)\r
+{\r
+    return PyBool_FromLong((long)enabled);\r
+}\r
+\r
+PyDoc_STRVAR(gc_collect__doc__,\r
+"collect([generation]) -> n\n"\r
+"\n"\r
+"With no arguments, run a full collection.  The optional argument\n"\r
+"may be an integer specifying which generation to collect.  A ValueError\n"\r
+"is raised if the generation number is invalid.\n\n"\r
+"The number of unreachable objects is returned.\n");\r
+\r
+static PyObject *\r
+gc_collect(PyObject *self, PyObject *args, PyObject *kws)\r
+{\r
+    static char *keywords[] = {"generation", NULL};\r
+    int genarg = NUM_GENERATIONS - 1;\r
+    Py_ssize_t n;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kws, "|i", keywords, &genarg))\r
+        return NULL;\r
+\r
+    else if (genarg < 0 || genarg >= NUM_GENERATIONS) {\r
+        PyErr_SetString(PyExc_ValueError, "invalid generation");\r
+        return NULL;\r
+    }\r
+\r
+    if (collecting)\r
+        n = 0; /* already collecting, don't do anything */\r
+    else {\r
+        collecting = 1;\r
+        n = collect(genarg);\r
+        collecting = 0;\r
+    }\r
+\r
+    return PyInt_FromSsize_t(n);\r
+}\r
+\r
+PyDoc_STRVAR(gc_set_debug__doc__,\r
+"set_debug(flags) -> None\n"\r
+"\n"\r
+"Set the garbage collection debugging flags. Debugging information is\n"\r
+"written to sys.stderr.\n"\r
+"\n"\r
+"flags is an integer and can have the following bits turned on:\n"\r
+"\n"\r
+"  DEBUG_STATS - Print statistics during collection.\n"\r
+"  DEBUG_COLLECTABLE - Print collectable objects found.\n"\r
+"  DEBUG_UNCOLLECTABLE - Print unreachable but uncollectable objects found.\n"\r
+"  DEBUG_INSTANCES - Print instance objects.\n"\r
+"  DEBUG_OBJECTS - Print objects other than instances.\n"\r
+"  DEBUG_SAVEALL - Save objects to gc.garbage rather than freeing them.\n"\r
+"  DEBUG_LEAK - Debug leaking programs (everything but STATS).\n");\r
+\r
+static PyObject *\r
+gc_set_debug(PyObject *self, PyObject *args)\r
+{\r
+    if (!PyArg_ParseTuple(args, "i:set_debug", &debug))\r
+        return NULL;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_debug__doc__,\r
+"get_debug() -> flags\n"\r
+"\n"\r
+"Get the garbage collection debugging flags.\n");\r
+\r
+static PyObject *\r
+gc_get_debug(PyObject *self, PyObject *noargs)\r
+{\r
+    return Py_BuildValue("i", debug);\r
+}\r
+\r
+PyDoc_STRVAR(gc_set_thresh__doc__,\r
+"set_threshold(threshold0, [threshold1, threshold2]) -> None\n"\r
+"\n"\r
+"Sets the collection thresholds.  Setting threshold0 to zero disables\n"\r
+"collection.\n");\r
+\r
+static PyObject *\r
+gc_set_thresh(PyObject *self, PyObject *args)\r
+{\r
+    int i;\r
+    if (!PyArg_ParseTuple(args, "i|ii:set_threshold",\r
+                          &generations[0].threshold,\r
+                          &generations[1].threshold,\r
+                          &generations[2].threshold))\r
+        return NULL;\r
+    for (i = 2; i < NUM_GENERATIONS; i++) {\r
+        /* generations higher than 2 get the same threshold */\r
+        generations[i].threshold = generations[2].threshold;\r
+    }\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_thresh__doc__,\r
+"get_threshold() -> (threshold0, threshold1, threshold2)\n"\r
+"\n"\r
+"Return the current collection thresholds\n");\r
+\r
+static PyObject *\r
+gc_get_thresh(PyObject *self, PyObject *noargs)\r
+{\r
+    return Py_BuildValue("(iii)",\r
+                         generations[0].threshold,\r
+                         generations[1].threshold,\r
+                         generations[2].threshold);\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_count__doc__,\r
+"get_count() -> (count0, count1, count2)\n"\r
+"\n"\r
+"Return the current collection counts\n");\r
+\r
+static PyObject *\r
+gc_get_count(PyObject *self, PyObject *noargs)\r
+{\r
+    return Py_BuildValue("(iii)",\r
+                         generations[0].count,\r
+                         generations[1].count,\r
+                         generations[2].count);\r
+}\r
+\r
+static int\r
+referrersvisit(PyObject* obj, PyObject *objs)\r
+{\r
+    Py_ssize_t i;\r
+    for (i = 0; i < PyTuple_GET_SIZE(objs); i++)\r
+        if (PyTuple_GET_ITEM(objs, i) == obj)\r
+            return 1;\r
+    return 0;\r
+}\r
+\r
+static int\r
+gc_referrers_for(PyObject *objs, PyGC_Head *list, PyObject *resultlist)\r
+{\r
+    PyGC_Head *gc;\r
+    PyObject *obj;\r
+    traverseproc traverse;\r
+    for (gc = list->gc.gc_next; gc != list; gc = gc->gc.gc_next) {\r
+        obj = FROM_GC(gc);\r
+        traverse = Py_TYPE(obj)->tp_traverse;\r
+        if (obj == objs || obj == resultlist)\r
+            continue;\r
+        if (traverse(obj, (visitproc)referrersvisit, objs)) {\r
+            if (PyList_Append(resultlist, obj) < 0)\r
+                return 0; /* error */\r
+        }\r
+    }\r
+    return 1; /* no error */\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_referrers__doc__,\r
+"get_referrers(*objs) -> list\n\\r
+Return the list of objects that directly refer to any of objs.");\r
+\r
+static PyObject *\r
+gc_get_referrers(PyObject *self, PyObject *args)\r
+{\r
+    int i;\r
+    PyObject *result = PyList_New(0);\r
+    if (!result) return NULL;\r
+\r
+    for (i = 0; i < NUM_GENERATIONS; i++) {\r
+        if (!(gc_referrers_for(args, GEN_HEAD(i), result))) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+/* Append obj to list; return true if error (out of memory), false if OK. */\r
+static int\r
+referentsvisit(PyObject *obj, PyObject *list)\r
+{\r
+    return PyList_Append(list, obj) < 0;\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_referents__doc__,\r
+"get_referents(*objs) -> list\n\\r
+Return the list of objects that are directly referred to by objs.");\r
+\r
+static PyObject *\r
+gc_get_referents(PyObject *self, PyObject *args)\r
+{\r
+    Py_ssize_t i;\r
+    PyObject *result = PyList_New(0);\r
+\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    for (i = 0; i < PyTuple_GET_SIZE(args); i++) {\r
+        traverseproc traverse;\r
+        PyObject *obj = PyTuple_GET_ITEM(args, i);\r
+\r
+        if (! PyObject_IS_GC(obj))\r
+            continue;\r
+        traverse = Py_TYPE(obj)->tp_traverse;\r
+        if (! traverse)\r
+            continue;\r
+        if (traverse(obj, (visitproc)referentsvisit, result)) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(gc_get_objects__doc__,\r
+"get_objects() -> [...]\n"\r
+"\n"\r
+"Return a list of objects tracked by the collector (excluding the list\n"\r
+"returned).\n");\r
+\r
+static PyObject *\r
+gc_get_objects(PyObject *self, PyObject *noargs)\r
+{\r
+    int i;\r
+    PyObject* result;\r
+\r
+    result = PyList_New(0);\r
+    if (result == NULL)\r
+        return NULL;\r
+    for (i = 0; i < NUM_GENERATIONS; i++) {\r
+        if (append_objects(result, GEN_HEAD(i))) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(gc_is_tracked__doc__,\r
+"is_tracked(obj) -> bool\n"\r
+"\n"\r
+"Returns true if the object is tracked by the garbage collector.\n"\r
+"Simple atomic objects will return false.\n"\r
+);\r
+\r
+static PyObject *\r
+gc_is_tracked(PyObject *self, PyObject *obj)\r
+{\r
+    PyObject *result;\r
+\r
+    if (PyObject_IS_GC(obj) && IS_TRACKED(obj))\r
+        result = Py_True;\r
+    else\r
+        result = Py_False;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(gc__doc__,\r
+"This module provides access to the garbage collector for reference cycles.\n"\r
+"\n"\r
+"enable() -- Enable automatic garbage collection.\n"\r
+"disable() -- Disable automatic garbage collection.\n"\r
+"isenabled() -- Returns true if automatic collection is enabled.\n"\r
+"collect() -- Do a full collection right now.\n"\r
+"get_count() -- Return the current collection counts.\n"\r
+"set_debug() -- Set debugging flags.\n"\r
+"get_debug() -- Get debugging flags.\n"\r
+"set_threshold() -- Set the collection thresholds.\n"\r
+"get_threshold() -- Return the current the collection thresholds.\n"\r
+"get_objects() -- Return a list of all objects tracked by the collector.\n"\r
+"is_tracked() -- Returns true if a given object is tracked.\n"\r
+"get_referrers() -- Return the list of objects that refer to an object.\n"\r
+"get_referents() -- Return the list of objects that an object refers to.\n");\r
+\r
+static PyMethodDef GcMethods[] = {\r
+    {"enable",             gc_enable,     METH_NOARGS,  gc_enable__doc__},\r
+    {"disable",            gc_disable,    METH_NOARGS,  gc_disable__doc__},\r
+    {"isenabled",          gc_isenabled,  METH_NOARGS,  gc_isenabled__doc__},\r
+    {"set_debug",          gc_set_debug,  METH_VARARGS, gc_set_debug__doc__},\r
+    {"get_debug",          gc_get_debug,  METH_NOARGS,  gc_get_debug__doc__},\r
+    {"get_count",          gc_get_count,  METH_NOARGS,  gc_get_count__doc__},\r
+    {"set_threshold",  gc_set_thresh, METH_VARARGS, gc_set_thresh__doc__},\r
+    {"get_threshold",  gc_get_thresh, METH_NOARGS,  gc_get_thresh__doc__},\r
+    {"collect",            (PyCFunction)gc_collect,\r
+        METH_VARARGS | METH_KEYWORDS,           gc_collect__doc__},\r
+    {"get_objects",    gc_get_objects,METH_NOARGS,  gc_get_objects__doc__},\r
+    {"is_tracked",     gc_is_tracked, METH_O,       gc_is_tracked__doc__},\r
+    {"get_referrers",  gc_get_referrers, METH_VARARGS,\r
+        gc_get_referrers__doc__},\r
+    {"get_referents",  gc_get_referents, METH_VARARGS,\r
+        gc_get_referents__doc__},\r
+    {NULL,      NULL}           /* Sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+initgc(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule4("gc",\r
+                          GcMethods,\r
+                          gc__doc__,\r
+                          NULL,\r
+                          PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    if (garbage == NULL) {\r
+        garbage = PyList_New(0);\r
+        if (garbage == NULL)\r
+            return;\r
+    }\r
+    Py_INCREF(garbage);\r
+    if (PyModule_AddObject(m, "garbage", garbage) < 0)\r
+        return;\r
+\r
+    /* Importing can't be done in collect() because collect()\r
+     * can be called via PyGC_Collect() in Py_Finalize().\r
+     * This wouldn't be a problem, except that <initialized> is\r
+     * reset to 0 before calling collect which trips up\r
+     * the import and triggers an assertion.\r
+     */\r
+    if (tmod == NULL) {\r
+        tmod = PyImport_ImportModuleNoBlock("time");\r
+        if (tmod == NULL)\r
+            PyErr_Clear();\r
+    }\r
+\r
+#define ADD_INT(NAME) if (PyModule_AddIntConstant(m, #NAME, NAME) < 0) return\r
+    ADD_INT(DEBUG_STATS);\r
+    ADD_INT(DEBUG_COLLECTABLE);\r
+    ADD_INT(DEBUG_UNCOLLECTABLE);\r
+    ADD_INT(DEBUG_INSTANCES);\r
+    ADD_INT(DEBUG_OBJECTS);\r
+    ADD_INT(DEBUG_SAVEALL);\r
+    ADD_INT(DEBUG_LEAK);\r
+#undef ADD_INT\r
+}\r
+\r
+/* API to invoke gc.collect() from C */\r
+Py_ssize_t\r
+PyGC_Collect(void)\r
+{\r
+    Py_ssize_t n;\r
+\r
+    if (collecting)\r
+        n = 0; /* already collecting, don't do anything */\r
+    else {\r
+        collecting = 1;\r
+        n = collect(NUM_GENERATIONS - 1);\r
+        collecting = 0;\r
+    }\r
+\r
+    return n;\r
+}\r
+\r
+/* for debugging */\r
+void\r
+_PyGC_Dump(PyGC_Head *g)\r
+{\r
+    _PyObject_Dump(FROM_GC(g));\r
+}\r
+\r
+/* extension modules might be compiled with GC support so these\r
+   functions must always be available */\r
+\r
+#undef PyObject_GC_Track\r
+#undef PyObject_GC_UnTrack\r
+#undef PyObject_GC_Del\r
+#undef _PyObject_GC_Malloc\r
+\r
+void\r
+PyObject_GC_Track(void *op)\r
+{\r
+    _PyObject_GC_TRACK(op);\r
+}\r
+\r
+/* for binary compatibility with 2.2 */\r
+void\r
+_PyObject_GC_Track(PyObject *op)\r
+{\r
+    PyObject_GC_Track(op);\r
+}\r
+\r
+void\r
+PyObject_GC_UnTrack(void *op)\r
+{\r
+    /* Obscure:  the Py_TRASHCAN mechanism requires that we be able to\r
+     * call PyObject_GC_UnTrack twice on an object.\r
+     */\r
+    if (IS_TRACKED(op))\r
+        _PyObject_GC_UNTRACK(op);\r
+}\r
+\r
+/* for binary compatibility with 2.2 */\r
+void\r
+_PyObject_GC_UnTrack(PyObject *op)\r
+{\r
+    PyObject_GC_UnTrack(op);\r
+}\r
+\r
+PyObject *\r
+_PyObject_GC_Malloc(size_t basicsize)\r
+{\r
+    PyObject *op;\r
+    PyGC_Head *g;\r
+    if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))\r
+        return PyErr_NoMemory();\r
+    g = (PyGC_Head *)PyObject_MALLOC(\r
+        sizeof(PyGC_Head) + basicsize);\r
+    if (g == NULL)\r
+        return PyErr_NoMemory();\r
+    g->gc.gc_refs = GC_UNTRACKED;\r
+    generations[0].count++; /* number of allocated GC objects */\r
+    if (generations[0].count > generations[0].threshold &&\r
+        enabled &&\r
+        generations[0].threshold &&\r
+        !collecting &&\r
+        !PyErr_Occurred()) {\r
+        collecting = 1;\r
+        collect_generations();\r
+        collecting = 0;\r
+    }\r
+    op = FROM_GC(g);\r
+    return op;\r
+}\r
+\r
+PyObject *\r
+_PyObject_GC_New(PyTypeObject *tp)\r
+{\r
+    PyObject *op = _PyObject_GC_Malloc(_PyObject_SIZE(tp));\r
+    if (op != NULL)\r
+        op = PyObject_INIT(op, tp);\r
+    return op;\r
+}\r
+\r
+PyVarObject *\r
+_PyObject_GC_NewVar(PyTypeObject *tp, Py_ssize_t nitems)\r
+{\r
+    const size_t size = _PyObject_VAR_SIZE(tp, nitems);\r
+    PyVarObject *op = (PyVarObject *) _PyObject_GC_Malloc(size);\r
+    if (op != NULL)\r
+        op = PyObject_INIT_VAR(op, tp, nitems);\r
+    return op;\r
+}\r
+\r
+PyVarObject *\r
+_PyObject_GC_Resize(PyVarObject *op, Py_ssize_t nitems)\r
+{\r
+    const size_t basicsize = _PyObject_VAR_SIZE(Py_TYPE(op), nitems);\r
+    PyGC_Head *g = AS_GC(op);\r
+    if (basicsize > PY_SSIZE_T_MAX - sizeof(PyGC_Head))\r
+        return (PyVarObject *)PyErr_NoMemory();\r
+    g = (PyGC_Head *)PyObject_REALLOC(g,  sizeof(PyGC_Head) + basicsize);\r
+    if (g == NULL)\r
+        return (PyVarObject *)PyErr_NoMemory();\r
+    op = (PyVarObject *) FROM_GC(g);\r
+    Py_SIZE(op) = nitems;\r
+    return op;\r
+}\r
+\r
+void\r
+PyObject_GC_Del(void *op)\r
+{\r
+    PyGC_Head *g = AS_GC(op);\r
+    if (IS_TRACKED(op))\r
+        gc_list_remove(g);\r
+    if (generations[0].count > 0) {\r
+        generations[0].count--;\r
+    }\r
+    PyObject_FREE(g);\r
+}\r
+\r
+/* for binary compatibility with 2.2 */\r
+#undef _PyObject_GC_Del\r
+void\r
+_PyObject_GC_Del(PyObject *op)\r
+{\r
+    PyObject_GC_Del(op);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/getbuildinfo.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/getbuildinfo.c
new file mode 100644 (file)
index 0000000..d2529b3
--- /dev/null
@@ -0,0 +1,85 @@
+#include "Python.h"\r
+\r
+#ifndef DONT_HAVE_STDIO_H\r
+#include <stdio.h>\r
+#endif\r
+\r
+#ifndef DATE\r
+#ifdef __DATE__\r
+#define DATE __DATE__\r
+#else\r
+#define DATE "xx/xx/xx"\r
+#endif\r
+#endif\r
+\r
+#ifndef TIME\r
+#ifdef __TIME__\r
+#define TIME __TIME__\r
+#else\r
+#define TIME "xx:xx:xx"\r
+#endif\r
+#endif\r
+\r
+/* on unix, SVNVERSION is passed on the command line.\r
+ * on Windows, the string is interpolated using\r
+ * subwcrev.exe\r
+ */\r
+#ifndef SVNVERSION\r
+#define SVNVERSION "$WCRANGE$$WCMODS?M:$"\r
+#endif\r
+\r
+/* XXX Only unix build process has been tested */\r
+#ifndef HGVERSION\r
+#define HGVERSION ""\r
+#endif\r
+#ifndef HGTAG\r
+#define HGTAG ""\r
+#endif\r
+#ifndef HGBRANCH\r
+#define HGBRANCH ""\r
+#endif\r
+\r
+const char *\r
+Py_GetBuildInfo(void)\r
+{\r
+    static char buildinfo[50 + sizeof(HGVERSION) +\r
+                          ((sizeof(HGTAG) > sizeof(HGBRANCH)) ?\r
+                           sizeof(HGTAG) : sizeof(HGBRANCH))];\r
+    const char *revision = _Py_hgversion();\r
+    const char *sep = *revision ? ":" : "";\r
+    const char *hgid = _Py_hgidentifier();\r
+    if (!(*hgid))\r
+        hgid = "default";\r
+    PyOS_snprintf(buildinfo, sizeof(buildinfo),\r
+                  "%s%s%s, %.20s, %.9s", hgid, sep, revision,\r
+                  DATE, TIME);\r
+    return buildinfo;\r
+}\r
+\r
+const char *\r
+_Py_svnversion(void)\r
+{\r
+    /* the following string can be modified by subwcrev.exe */\r
+    static const char svnversion[] = SVNVERSION;\r
+    if (svnversion[0] != '$')\r
+        return svnversion; /* it was interpolated, or passed on command line */\r
+    return "Unversioned directory";\r
+}\r
+\r
+const char *\r
+_Py_hgversion(void)\r
+{\r
+    return HGVERSION;\r
+}\r
+\r
+const char *\r
+_Py_hgidentifier(void)\r
+{\r
+    const char *hgtag, *hgid;\r
+    hgtag = HGTAG;\r
+    if ((*hgtag) && strcmp(hgtag, "tip") != 0)\r
+        hgid = hgtag;\r
+    else\r
+        hgid = HGBRANCH;\r
+    return hgid;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/itertoolsmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/itertoolsmodule.c
new file mode 100644 (file)
index 0000000..0279a72
--- /dev/null
@@ -0,0 +1,4143 @@
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+/* Itertools module written and maintained\r
+   by Raymond D. Hettinger <python@rcn.com>\r
+   Copyright (c) 2003 Python Software Foundation.\r
+   All rights reserved.\r
+*/\r
+\r
+\r
+/* groupby object ***********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *it;\r
+    PyObject *keyfunc;\r
+    PyObject *tgtkey;\r
+    PyObject *currkey;\r
+    PyObject *currvalue;\r
+} groupbyobject;\r
+\r
+static PyTypeObject groupby_type;\r
+static PyObject *_grouper_create(groupbyobject *, PyObject *);\r
+\r
+static PyObject *\r
+groupby_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwargs[] = {"iterable", "key", NULL};\r
+    groupbyobject *gbo;\r
+    PyObject *it, *keyfunc = Py_None;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:groupby", kwargs,\r
+                                     &it, &keyfunc))\r
+        return NULL;\r
+\r
+    gbo = (groupbyobject *)type->tp_alloc(type, 0);\r
+    if (gbo == NULL)\r
+        return NULL;\r
+    gbo->tgtkey = NULL;\r
+    gbo->currkey = NULL;\r
+    gbo->currvalue = NULL;\r
+    gbo->keyfunc = keyfunc;\r
+    Py_INCREF(keyfunc);\r
+    gbo->it = PyObject_GetIter(it);\r
+    if (gbo->it == NULL) {\r
+        Py_DECREF(gbo);\r
+        return NULL;\r
+    }\r
+    return (PyObject *)gbo;\r
+}\r
+\r
+static void\r
+groupby_dealloc(groupbyobject *gbo)\r
+{\r
+    PyObject_GC_UnTrack(gbo);\r
+    Py_XDECREF(gbo->it);\r
+    Py_XDECREF(gbo->keyfunc);\r
+    Py_XDECREF(gbo->tgtkey);\r
+    Py_XDECREF(gbo->currkey);\r
+    Py_XDECREF(gbo->currvalue);\r
+    Py_TYPE(gbo)->tp_free(gbo);\r
+}\r
+\r
+static int\r
+groupby_traverse(groupbyobject *gbo, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(gbo->it);\r
+    Py_VISIT(gbo->keyfunc);\r
+    Py_VISIT(gbo->tgtkey);\r
+    Py_VISIT(gbo->currkey);\r
+    Py_VISIT(gbo->currvalue);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+groupby_next(groupbyobject *gbo)\r
+{\r
+    PyObject *newvalue, *newkey, *r, *grouper, *tmp;\r
+\r
+    /* skip to next iteration group */\r
+    for (;;) {\r
+        if (gbo->currkey == NULL)\r
+            /* pass */;\r
+        else if (gbo->tgtkey == NULL)\r
+            break;\r
+        else {\r
+            int rcmp;\r
+\r
+            rcmp = PyObject_RichCompareBool(gbo->tgtkey,\r
+                                            gbo->currkey, Py_EQ);\r
+            if (rcmp == -1)\r
+                return NULL;\r
+            else if (rcmp == 0)\r
+                break;\r
+        }\r
+\r
+        newvalue = PyIter_Next(gbo->it);\r
+        if (newvalue == NULL)\r
+            return NULL;\r
+\r
+        if (gbo->keyfunc == Py_None) {\r
+            newkey = newvalue;\r
+            Py_INCREF(newvalue);\r
+        } else {\r
+            newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc,\r
+                                                  newvalue, NULL);\r
+            if (newkey == NULL) {\r
+                Py_DECREF(newvalue);\r
+                return NULL;\r
+            }\r
+        }\r
+\r
+        tmp = gbo->currkey;\r
+        gbo->currkey = newkey;\r
+        Py_XDECREF(tmp);\r
+\r
+        tmp = gbo->currvalue;\r
+        gbo->currvalue = newvalue;\r
+        Py_XDECREF(tmp);\r
+    }\r
+\r
+    Py_INCREF(gbo->currkey);\r
+    tmp = gbo->tgtkey;\r
+    gbo->tgtkey = gbo->currkey;\r
+    Py_XDECREF(tmp);\r
+\r
+    grouper = _grouper_create(gbo, gbo->tgtkey);\r
+    if (grouper == NULL)\r
+        return NULL;\r
+\r
+    r = PyTuple_Pack(2, gbo->currkey, grouper);\r
+    Py_DECREF(grouper);\r
+    return r;\r
+}\r
+\r
+PyDoc_STRVAR(groupby_doc,\r
+"groupby(iterable[, keyfunc]) -> create an iterator which returns\n\\r
+(key, sub-iterator) grouped by each value of key(value).\n");\r
+\r
+static PyTypeObject groupby_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.groupby",                /* tp_name */\r
+    sizeof(groupbyobject),              /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)groupby_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    groupby_doc,                        /* tp_doc */\r
+    (traverseproc)groupby_traverse,     /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)groupby_next,         /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    groupby_new,                        /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* _grouper object (internal) ************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *parent;\r
+    PyObject *tgtkey;\r
+} _grouperobject;\r
+\r
+static PyTypeObject _grouper_type;\r
+\r
+static PyObject *\r
+_grouper_create(groupbyobject *parent, PyObject *tgtkey)\r
+{\r
+    _grouperobject *igo;\r
+\r
+    igo = PyObject_GC_New(_grouperobject, &_grouper_type);\r
+    if (igo == NULL)\r
+        return NULL;\r
+    igo->parent = (PyObject *)parent;\r
+    Py_INCREF(parent);\r
+    igo->tgtkey = tgtkey;\r
+    Py_INCREF(tgtkey);\r
+\r
+    PyObject_GC_Track(igo);\r
+    return (PyObject *)igo;\r
+}\r
+\r
+static void\r
+_grouper_dealloc(_grouperobject *igo)\r
+{\r
+    PyObject_GC_UnTrack(igo);\r
+    Py_DECREF(igo->parent);\r
+    Py_DECREF(igo->tgtkey);\r
+    PyObject_GC_Del(igo);\r
+}\r
+\r
+static int\r
+_grouper_traverse(_grouperobject *igo, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(igo->parent);\r
+    Py_VISIT(igo->tgtkey);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+_grouper_next(_grouperobject *igo)\r
+{\r
+    groupbyobject *gbo = (groupbyobject *)igo->parent;\r
+    PyObject *newvalue, *newkey, *r;\r
+    int rcmp;\r
+\r
+    if (gbo->currvalue == NULL) {\r
+        newvalue = PyIter_Next(gbo->it);\r
+        if (newvalue == NULL)\r
+            return NULL;\r
+\r
+        if (gbo->keyfunc == Py_None) {\r
+            newkey = newvalue;\r
+            Py_INCREF(newvalue);\r
+        } else {\r
+            newkey = PyObject_CallFunctionObjArgs(gbo->keyfunc,\r
+                                                  newvalue, NULL);\r
+            if (newkey == NULL) {\r
+                Py_DECREF(newvalue);\r
+                return NULL;\r
+            }\r
+        }\r
+\r
+        assert(gbo->currkey == NULL);\r
+        gbo->currkey = newkey;\r
+        gbo->currvalue = newvalue;\r
+    }\r
+\r
+    assert(gbo->currkey != NULL);\r
+    rcmp = PyObject_RichCompareBool(igo->tgtkey, gbo->currkey, Py_EQ);\r
+    if (rcmp <= 0)\r
+        /* got any error or current group is end */\r
+        return NULL;\r
+\r
+    r = gbo->currvalue;\r
+    gbo->currvalue = NULL;\r
+    Py_CLEAR(gbo->currkey);\r
+\r
+    return r;\r
+}\r
+\r
+static PyTypeObject _grouper_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools._grouper",               /* tp_name */\r
+    sizeof(_grouperobject),             /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)_grouper_dealloc,       /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */\r
+    0,                                  /* tp_doc */\r
+    (traverseproc)_grouper_traverse,/* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)_grouper_next,        /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    0,                                  /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+\r
+/* tee object and with supporting function and objects ***************/\r
+\r
+/* The teedataobject pre-allocates space for LINKCELLS number of objects.\r
+   To help the object fit neatly inside cache lines (space for 16 to 32\r
+   pointers), the value should be a multiple of 16 minus  space for\r
+   the other structure members including PyHEAD overhead.  The larger the\r
+   value, the less memory overhead per object and the less time spent\r
+   allocating/deallocating new links.  The smaller the number, the less\r
+   wasted space and the more rapid freeing of older data.\r
+*/\r
+#define LINKCELLS 57\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *it;\r
+    int numread;\r
+    PyObject *nextlink;\r
+    PyObject *(values[LINKCELLS]);\r
+} teedataobject;\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    teedataobject *dataobj;\r
+    int index;\r
+    PyObject *weakreflist;\r
+} teeobject;\r
+\r
+static PyTypeObject teedataobject_type;\r
+\r
+static PyObject *\r
+teedataobject_new(PyObject *it)\r
+{\r
+    teedataobject *tdo;\r
+\r
+    tdo = PyObject_GC_New(teedataobject, &teedataobject_type);\r
+    if (tdo == NULL)\r
+        return NULL;\r
+\r
+    tdo->numread = 0;\r
+    tdo->nextlink = NULL;\r
+    Py_INCREF(it);\r
+    tdo->it = it;\r
+    PyObject_GC_Track(tdo);\r
+    return (PyObject *)tdo;\r
+}\r
+\r
+static PyObject *\r
+teedataobject_jumplink(teedataobject *tdo)\r
+{\r
+    if (tdo->nextlink == NULL)\r
+        tdo->nextlink = teedataobject_new(tdo->it);\r
+    Py_XINCREF(tdo->nextlink);\r
+    return tdo->nextlink;\r
+}\r
+\r
+static PyObject *\r
+teedataobject_getitem(teedataobject *tdo, int i)\r
+{\r
+    PyObject *value;\r
+\r
+    assert(i < LINKCELLS);\r
+    if (i < tdo->numread)\r
+        value = tdo->values[i];\r
+    else {\r
+        /* this is the lead iterator, so fetch more data */\r
+        assert(i == tdo->numread);\r
+        value = PyIter_Next(tdo->it);\r
+        if (value == NULL)\r
+            return NULL;\r
+        tdo->numread++;\r
+        tdo->values[i] = value;\r
+    }\r
+    Py_INCREF(value);\r
+    return value;\r
+}\r
+\r
+static int\r
+teedataobject_traverse(teedataobject *tdo, visitproc visit, void * arg)\r
+{\r
+    int i;\r
+    Py_VISIT(tdo->it);\r
+    for (i = 0; i < tdo->numread; i++)\r
+        Py_VISIT(tdo->values[i]);\r
+    Py_VISIT(tdo->nextlink);\r
+    return 0;\r
+}\r
+\r
+static void\r
+teedataobject_safe_decref(PyObject *obj)\r
+{\r
+    while (obj && Py_TYPE(obj) == &teedataobject_type &&\r
+           Py_REFCNT(obj) == 1) {\r
+        PyObject *nextlink = ((teedataobject *)obj)->nextlink;\r
+        ((teedataobject *)obj)->nextlink = NULL;\r
+        Py_DECREF(obj);\r
+        obj = nextlink;\r
+    }\r
+    Py_XDECREF(obj);\r
+}\r
+\r
+static int\r
+teedataobject_clear(teedataobject *tdo)\r
+{\r
+    int i;\r
+    PyObject *tmp;\r
+\r
+    Py_CLEAR(tdo->it);\r
+    for (i=0 ; i<tdo->numread ; i++)\r
+        Py_CLEAR(tdo->values[i]);\r
+    tmp = tdo->nextlink;\r
+    tdo->nextlink = NULL;\r
+    teedataobject_safe_decref(tmp);\r
+    return 0;\r
+}\r
+\r
+static void\r
+teedataobject_dealloc(teedataobject *tdo)\r
+{\r
+    PyObject_GC_UnTrack(tdo);\r
+    teedataobject_clear(tdo);\r
+    PyObject_GC_Del(tdo);\r
+}\r
+\r
+PyDoc_STRVAR(teedataobject_doc, "Data container common to multiple tee objects.");\r
+\r
+static PyTypeObject teedataobject_type = {\r
+    PyVarObject_HEAD_INIT(0, 0)         /* Must fill in type value later */\r
+    "itertools.tee_dataobject",                 /* tp_name */\r
+    sizeof(teedataobject),                      /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)teedataobject_dealloc,          /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */\r
+    teedataobject_doc,                          /* tp_doc */\r
+    (traverseproc)teedataobject_traverse,       /* tp_traverse */\r
+    (inquiry)teedataobject_clear,               /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    0,                                          /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    0,                                          /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    0,                                          /* tp_init */\r
+    0,                                          /* tp_alloc */\r
+    0,                                          /* tp_new */\r
+    PyObject_GC_Del,                            /* tp_free */\r
+};\r
+\r
+\r
+static PyTypeObject tee_type;\r
+\r
+static PyObject *\r
+tee_next(teeobject *to)\r
+{\r
+    PyObject *value, *link;\r
+\r
+    if (to->index >= LINKCELLS) {\r
+        link = teedataobject_jumplink(to->dataobj);\r
+        if (link == NULL)\r
+            return NULL;\r
+        Py_DECREF(to->dataobj);\r
+        to->dataobj = (teedataobject *)link;\r
+        to->index = 0;\r
+    }\r
+    value = teedataobject_getitem(to->dataobj, to->index);\r
+    if (value == NULL)\r
+        return NULL;\r
+    to->index++;\r
+    return value;\r
+}\r
+\r
+static int\r
+tee_traverse(teeobject *to, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT((PyObject *)to->dataobj);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+tee_copy(teeobject *to)\r
+{\r
+    teeobject *newto;\r
+\r
+    newto = PyObject_GC_New(teeobject, &tee_type);\r
+    if (newto == NULL)\r
+        return NULL;\r
+    Py_INCREF(to->dataobj);\r
+    newto->dataobj = to->dataobj;\r
+    newto->index = to->index;\r
+    newto->weakreflist = NULL;\r
+    PyObject_GC_Track(newto);\r
+    return (PyObject *)newto;\r
+}\r
+\r
+PyDoc_STRVAR(teecopy_doc, "Returns an independent iterator.");\r
+\r
+static PyObject *\r
+tee_fromiterable(PyObject *iterable)\r
+{\r
+    teeobject *to;\r
+    PyObject *it = NULL;\r
+\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+    if (PyObject_TypeCheck(it, &tee_type)) {\r
+        to = (teeobject *)tee_copy((teeobject *)it);\r
+        goto done;\r
+    }\r
+\r
+    to = PyObject_GC_New(teeobject, &tee_type);\r
+    if (to == NULL)\r
+        goto done;\r
+    to->dataobj = (teedataobject *)teedataobject_new(it);\r
+    if (!to->dataobj) {\r
+        PyObject_GC_Del(to);\r
+        to = NULL;\r
+        goto done;\r
+    }\r
+\r
+    to->index = 0;\r
+    to->weakreflist = NULL;\r
+    PyObject_GC_Track(to);\r
+done:\r
+    Py_XDECREF(it);\r
+    return (PyObject *)to;\r
+}\r
+\r
+static PyObject *\r
+tee_new(PyTypeObject *type, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *iterable;\r
+\r
+    if (!PyArg_UnpackTuple(args, "tee", 1, 1, &iterable))\r
+        return NULL;\r
+    return tee_fromiterable(iterable);\r
+}\r
+\r
+static int\r
+tee_clear(teeobject *to)\r
+{\r
+    if (to->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *) to);\r
+    Py_CLEAR(to->dataobj);\r
+    return 0;\r
+}\r
+\r
+static void\r
+tee_dealloc(teeobject *to)\r
+{\r
+    PyObject_GC_UnTrack(to);\r
+    tee_clear(to);\r
+    PyObject_GC_Del(to);\r
+}\r
+\r
+PyDoc_STRVAR(teeobject_doc,\r
+"Iterator wrapped to make it copyable");\r
+\r
+static PyMethodDef tee_methods[] = {\r
+    {"__copy__",        (PyCFunction)tee_copy,  METH_NOARGS, teecopy_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+static PyTypeObject tee_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.tee",                    /* tp_name */\r
+    sizeof(teeobject),                  /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)tee_dealloc,            /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    0,                                  /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */\r
+    teeobject_doc,                      /* tp_doc */\r
+    (traverseproc)tee_traverse,         /* tp_traverse */\r
+    (inquiry)tee_clear,                 /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    offsetof(teeobject, weakreflist),           /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)tee_next,             /* tp_iternext */\r
+    tee_methods,                        /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    tee_new,                            /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+static PyObject *\r
+tee(PyObject *self, PyObject *args)\r
+{\r
+    Py_ssize_t i, n=2;\r
+    PyObject *it, *iterable, *copyable, *result;\r
+\r
+    if (!PyArg_ParseTuple(args, "O|n", &iterable, &n))\r
+        return NULL;\r
+    if (n < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "n must be >= 0");\r
+        return NULL;\r
+    }\r
+    result = PyTuple_New(n);\r
+    if (result == NULL)\r
+        return NULL;\r
+    if (n == 0)\r
+        return result;\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL) {\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+    if (!PyObject_HasAttrString(it, "__copy__")) {\r
+        copyable = tee_fromiterable(it);\r
+        Py_DECREF(it);\r
+        if (copyable == NULL) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+    } else\r
+        copyable = it;\r
+    PyTuple_SET_ITEM(result, 0, copyable);\r
+    for (i=1 ; i<n ; i++) {\r
+        copyable = PyObject_CallMethod(copyable, "__copy__", NULL);\r
+        if (copyable == NULL) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(result, i, copyable);\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(tee_doc,\r
+"tee(iterable, n=2) --> tuple of n independent iterators.");\r
+\r
+\r
+/* cycle object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *it;\r
+    PyObject *saved;\r
+    int firstpass;\r
+} cycleobject;\r
+\r
+static PyTypeObject cycle_type;\r
+\r
+static PyObject *\r
+cycle_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *it;\r
+    PyObject *iterable;\r
+    PyObject *saved;\r
+    cycleobject *lz;\r
+\r
+    if (type == &cycle_type && !_PyArg_NoKeywords("cycle()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "cycle", 1, 1, &iterable))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(iterable);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    saved = PyList_New(0);\r
+    if (saved == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+\r
+    /* create cycleobject structure */\r
+    lz = (cycleobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        Py_DECREF(saved);\r
+        return NULL;\r
+    }\r
+    lz->it = it;\r
+    lz->saved = saved;\r
+    lz->firstpass = 0;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+cycle_dealloc(cycleobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->saved);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+cycle_traverse(cycleobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->saved);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+cycle_next(cycleobject *lz)\r
+{\r
+    PyObject *item;\r
+    PyObject *it;\r
+    PyObject *tmp;\r
+\r
+    while (1) {\r
+        item = PyIter_Next(lz->it);\r
+        if (item != NULL) {\r
+            if (!lz->firstpass && PyList_Append(lz->saved, item)) {\r
+                Py_DECREF(item);\r
+                return NULL;\r
+            }\r
+            return item;\r
+        }\r
+        if (PyErr_Occurred()) {\r
+            if (PyErr_ExceptionMatches(PyExc_StopIteration))\r
+                PyErr_Clear();\r
+            else\r
+                return NULL;\r
+        }\r
+        if (PyList_Size(lz->saved) == 0)\r
+            return NULL;\r
+        it = PyObject_GetIter(lz->saved);\r
+        if (it == NULL)\r
+            return NULL;\r
+        tmp = lz->it;\r
+        lz->it = it;\r
+        lz->firstpass = 1;\r
+        Py_DECREF(tmp);\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(cycle_doc,\r
+"cycle(iterable) --> cycle object\n\\r
+\n\\r
+Return elements from the iterable until it is exhausted.\n\\r
+Then repeat the sequence indefinitely.");\r
+\r
+static PyTypeObject cycle_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.cycle",                  /* tp_name */\r
+    sizeof(cycleobject),                /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)cycle_dealloc,          /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    cycle_doc,                          /* tp_doc */\r
+    (traverseproc)cycle_traverse,       /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)cycle_next,           /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    cycle_new,                          /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* dropwhile object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *func;\r
+    PyObject *it;\r
+    long         start;\r
+} dropwhileobject;\r
+\r
+static PyTypeObject dropwhile_type;\r
+\r
+static PyObject *\r
+dropwhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *func, *seq;\r
+    PyObject *it;\r
+    dropwhileobject *lz;\r
+\r
+    if (type == &dropwhile_type && !_PyArg_NoKeywords("dropwhile()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "dropwhile", 2, 2, &func, &seq))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create dropwhileobject structure */\r
+    lz = (dropwhileobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+    lz->it = it;\r
+    lz->start = 0;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+dropwhile_dealloc(dropwhileobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->func);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+dropwhile_traverse(dropwhileobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+dropwhile_next(dropwhileobject *lz)\r
+{\r
+    PyObject *item, *good;\r
+    PyObject *it = lz->it;\r
+    long ok;\r
+    PyObject *(*iternext)(PyObject *);\r
+\r
+    iternext = *Py_TYPE(it)->tp_iternext;\r
+    for (;;) {\r
+        item = iternext(it);\r
+        if (item == NULL)\r
+            return NULL;\r
+        if (lz->start == 1)\r
+            return item;\r
+\r
+        good = PyObject_CallFunctionObjArgs(lz->func, item, NULL);\r
+        if (good == NULL) {\r
+            Py_DECREF(item);\r
+            return NULL;\r
+        }\r
+        ok = PyObject_IsTrue(good);\r
+        Py_DECREF(good);\r
+        if (ok == 0) {\r
+            lz->start = 1;\r
+            return item;\r
+        }\r
+        Py_DECREF(item);\r
+        if (ok < 0)\r
+            return NULL;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(dropwhile_doc,\r
+"dropwhile(predicate, iterable) --> dropwhile object\n\\r
+\n\\r
+Drop items from the iterable while predicate(item) is true.\n\\r
+Afterwards, return every element until the iterable is exhausted.");\r
+\r
+static PyTypeObject dropwhile_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.dropwhile",              /* tp_name */\r
+    sizeof(dropwhileobject),            /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)dropwhile_dealloc,      /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    dropwhile_doc,                      /* tp_doc */\r
+    (traverseproc)dropwhile_traverse,    /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)dropwhile_next,       /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    dropwhile_new,                      /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* takewhile object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *func;\r
+    PyObject *it;\r
+    long         stop;\r
+} takewhileobject;\r
+\r
+static PyTypeObject takewhile_type;\r
+\r
+static PyObject *\r
+takewhile_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *func, *seq;\r
+    PyObject *it;\r
+    takewhileobject *lz;\r
+\r
+    if (type == &takewhile_type && !_PyArg_NoKeywords("takewhile()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "takewhile", 2, 2, &func, &seq))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create takewhileobject structure */\r
+    lz = (takewhileobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+    lz->it = it;\r
+    lz->stop = 0;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+takewhile_dealloc(takewhileobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->func);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+takewhile_traverse(takewhileobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+takewhile_next(takewhileobject *lz)\r
+{\r
+    PyObject *item, *good;\r
+    PyObject *it = lz->it;\r
+    long ok;\r
+\r
+    if (lz->stop == 1)\r
+        return NULL;\r
+\r
+    item = (*Py_TYPE(it)->tp_iternext)(it);\r
+    if (item == NULL)\r
+        return NULL;\r
+\r
+    good = PyObject_CallFunctionObjArgs(lz->func, item, NULL);\r
+    if (good == NULL) {\r
+        Py_DECREF(item);\r
+        return NULL;\r
+    }\r
+    ok = PyObject_IsTrue(good);\r
+    Py_DECREF(good);\r
+    if (ok > 0)\r
+        return item;\r
+    Py_DECREF(item);\r
+    if (ok == 0)\r
+        lz->stop = 1;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(takewhile_doc,\r
+"takewhile(predicate, iterable) --> takewhile object\n\\r
+\n\\r
+Return successive entries from an iterable as long as the \n\\r
+predicate evaluates to true for each entry.");\r
+\r
+static PyTypeObject takewhile_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.takewhile",              /* tp_name */\r
+    sizeof(takewhileobject),            /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)takewhile_dealloc,      /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    takewhile_doc,                      /* tp_doc */\r
+    (traverseproc)takewhile_traverse,    /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)takewhile_next,       /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    takewhile_new,                      /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* islice object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *it;\r
+    Py_ssize_t next;\r
+    Py_ssize_t stop;\r
+    Py_ssize_t step;\r
+    Py_ssize_t cnt;\r
+} isliceobject;\r
+\r
+static PyTypeObject islice_type;\r
+\r
+static PyObject *\r
+islice_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *seq;\r
+    Py_ssize_t start=0, stop=-1, step=1;\r
+    PyObject *it, *a1=NULL, *a2=NULL, *a3=NULL;\r
+    Py_ssize_t numargs;\r
+    isliceobject *lz;\r
+\r
+    if (type == &islice_type && !_PyArg_NoKeywords("islice()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "islice", 2, 4, &seq, &a1, &a2, &a3))\r
+        return NULL;\r
+\r
+    numargs = PyTuple_Size(args);\r
+    if (numargs == 2) {\r
+        if (a1 != Py_None) {\r
+            stop = PyInt_AsSsize_t(a1);\r
+            if (stop == -1) {\r
+                if (PyErr_Occurred())\r
+                    PyErr_Clear();\r
+                PyErr_SetString(PyExc_ValueError,\r
+                    "Stop argument for islice() must be None or an integer: 0 <= x <= maxint.");\r
+                return NULL;\r
+            }\r
+        }\r
+    } else {\r
+        if (a1 != Py_None)\r
+            start = PyInt_AsSsize_t(a1);\r
+        if (start == -1 && PyErr_Occurred())\r
+            PyErr_Clear();\r
+        if (a2 != Py_None) {\r
+            stop = PyInt_AsSsize_t(a2);\r
+            if (stop == -1) {\r
+                if (PyErr_Occurred())\r
+                    PyErr_Clear();\r
+                PyErr_SetString(PyExc_ValueError,\r
+                   "Stop argument for islice() must be None or an integer: 0 <= x <= maxint.");\r
+                return NULL;\r
+            }\r
+        }\r
+    }\r
+    if (start<0 || stop<-1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+           "Indices for islice() must be None or an integer: 0 <= x <= maxint.");\r
+        return NULL;\r
+    }\r
+\r
+    if (a3 != NULL) {\r
+        if (a3 != Py_None)\r
+            step = PyInt_AsSsize_t(a3);\r
+        if (step == -1 && PyErr_Occurred())\r
+            PyErr_Clear();\r
+    }\r
+    if (step<1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+           "Step for islice() must be a positive integer or None.");\r
+        return NULL;\r
+    }\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create isliceobject structure */\r
+    lz = (isliceobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    lz->it = it;\r
+    lz->next = start;\r
+    lz->stop = stop;\r
+    lz->step = step;\r
+    lz->cnt = 0L;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+islice_dealloc(isliceobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+islice_traverse(isliceobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+islice_next(isliceobject *lz)\r
+{\r
+    PyObject *item;\r
+    PyObject *it = lz->it;\r
+    Py_ssize_t stop = lz->stop;\r
+    Py_ssize_t oldnext;\r
+    PyObject *(*iternext)(PyObject *);\r
+\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    iternext = *Py_TYPE(it)->tp_iternext;\r
+    while (lz->cnt < lz->next) {\r
+        item = iternext(it);\r
+        if (item == NULL)\r
+            goto empty;\r
+        Py_DECREF(item);\r
+        lz->cnt++;\r
+    }\r
+    if (stop != -1 && lz->cnt >= stop)\r
+        goto empty;\r
+    item = iternext(it);\r
+    if (item == NULL)\r
+        goto empty;\r
+    lz->cnt++;\r
+    oldnext = lz->next;\r
+    /* The (size_t) cast below avoids the danger of undefined\r
+       behaviour from signed integer overflow. */\r
+    lz->next += (size_t)lz->step;\r
+    if (lz->next < oldnext || (stop != -1 && lz->next > stop))\r
+        lz->next = stop;\r
+    return item;\r
+\r
+empty:\r
+    Py_CLEAR(lz->it);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(islice_doc,\r
+"islice(iterable, [start,] stop [, step]) --> islice object\n\\r
+\n\\r
+Return an iterator whose next() method returns selected values from an\n\\r
+iterable.  If start is specified, will skip all preceding elements;\n\\r
+otherwise, start defaults to zero.  Step defaults to one.  If\n\\r
+specified as another value, step determines how many values are \n\\r
+skipped between successive calls.  Works like a slice() on a list\n\\r
+but returns an iterator.");\r
+\r
+static PyTypeObject islice_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.islice",                 /* tp_name */\r
+    sizeof(isliceobject),               /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)islice_dealloc,         /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    islice_doc,                         /* tp_doc */\r
+    (traverseproc)islice_traverse,      /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)islice_next,          /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    islice_new,                         /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* starmap object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *func;\r
+    PyObject *it;\r
+} starmapobject;\r
+\r
+static PyTypeObject starmap_type;\r
+\r
+static PyObject *\r
+starmap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *func, *seq;\r
+    PyObject *it;\r
+    starmapobject *lz;\r
+\r
+    if (type == &starmap_type && !_PyArg_NoKeywords("starmap()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "starmap", 2, 2, &func, &seq))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create starmapobject structure */\r
+    lz = (starmapobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+    lz->it = it;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+starmap_dealloc(starmapobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->func);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+starmap_traverse(starmapobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+starmap_next(starmapobject *lz)\r
+{\r
+    PyObject *args;\r
+    PyObject *result;\r
+    PyObject *it = lz->it;\r
+\r
+    args = (*Py_TYPE(it)->tp_iternext)(it);\r
+    if (args == NULL)\r
+        return NULL;\r
+    if (!PyTuple_CheckExact(args)) {\r
+        PyObject *newargs = PySequence_Tuple(args);\r
+        Py_DECREF(args);\r
+        if (newargs == NULL)\r
+            return NULL;\r
+        args = newargs;\r
+    }\r
+    result = PyObject_Call(lz->func, args, NULL);\r
+    Py_DECREF(args);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(starmap_doc,\r
+"starmap(function, sequence) --> starmap object\n\\r
+\n\\r
+Return an iterator whose values are returned from the function evaluated\n\\r
+with a argument tuple taken from the given sequence.");\r
+\r
+static PyTypeObject starmap_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.starmap",                /* tp_name */\r
+    sizeof(starmapobject),              /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)starmap_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    starmap_doc,                        /* tp_doc */\r
+    (traverseproc)starmap_traverse,     /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)starmap_next,         /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    starmap_new,                        /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* imap object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *iters;\r
+    PyObject *func;\r
+} imapobject;\r
+\r
+static PyTypeObject imap_type;\r
+\r
+static PyObject *\r
+imap_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *it, *iters, *func;\r
+    imapobject *lz;\r
+    Py_ssize_t numargs, i;\r
+\r
+    if (type == &imap_type && !_PyArg_NoKeywords("imap()", kwds))\r
+        return NULL;\r
+\r
+    numargs = PyTuple_Size(args);\r
+    if (numargs < 2) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+           "imap() must have at least two arguments.");\r
+        return NULL;\r
+    }\r
+\r
+    iters = PyTuple_New(numargs-1);\r
+    if (iters == NULL)\r
+        return NULL;\r
+\r
+    for (i=1 ; i<numargs ; i++) {\r
+        /* Get iterator. */\r
+        it = PyObject_GetIter(PyTuple_GET_ITEM(args, i));\r
+        if (it == NULL) {\r
+            Py_DECREF(iters);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(iters, i-1, it);\r
+    }\r
+\r
+    /* create imapobject structure */\r
+    lz = (imapobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(iters);\r
+        return NULL;\r
+    }\r
+    lz->iters = iters;\r
+    func = PyTuple_GET_ITEM(args, 0);\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+imap_dealloc(imapobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->iters);\r
+    Py_XDECREF(lz->func);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+imap_traverse(imapobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->iters);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+/*\r
+imap() is an iterator version of __builtins__.map() except that it does\r
+not have the None fill-in feature.  That was intentionally left out for\r
+the following reasons:\r
+\r
+  1) Itertools are designed to be easily combined and chained together.\r
+     Having all tools stop with the shortest input is a unifying principle\r
+     that makes it easier to combine finite iterators (supplying data) with\r
+     infinite iterators like count() and repeat() (for supplying sequential\r
+     or constant arguments to a function).\r
+\r
+  2) In typical use cases for combining itertools, having one finite data\r
+     supplier run out before another is likely to be an error condition which\r
+     should not pass silently by automatically supplying None.\r
+\r
+  3) The use cases for automatic None fill-in are rare -- not many functions\r
+     do something useful when a parameter suddenly switches type and becomes\r
+     None.\r
+\r
+  4) If a need does arise, it can be met by __builtins__.map() or by\r
+     writing:  chain(iterable, repeat(None)).\r
+\r
+  5) Similar toolsets in Haskell and SML do not have automatic None fill-in.\r
+*/\r
+\r
+static PyObject *\r
+imap_next(imapobject *lz)\r
+{\r
+    PyObject *val;\r
+    PyObject *argtuple;\r
+    PyObject *result;\r
+    Py_ssize_t numargs, i;\r
+\r
+    numargs = PyTuple_Size(lz->iters);\r
+    argtuple = PyTuple_New(numargs);\r
+    if (argtuple == NULL)\r
+        return NULL;\r
+\r
+    for (i=0 ; i<numargs ; i++) {\r
+        val = PyIter_Next(PyTuple_GET_ITEM(lz->iters, i));\r
+        if (val == NULL) {\r
+            Py_DECREF(argtuple);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(argtuple, i, val);\r
+    }\r
+    if (lz->func == Py_None)\r
+        return argtuple;\r
+    result = PyObject_Call(lz->func, argtuple, NULL);\r
+    Py_DECREF(argtuple);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(imap_doc,\r
+"imap(func, *iterables) --> imap object\n\\r
+\n\\r
+Make an iterator that computes the function using arguments from\n\\r
+each of the iterables.  Like map() except that it returns\n\\r
+an iterator instead of a list and that it stops when the shortest\n\\r
+iterable is exhausted instead of filling in None for shorter\n\\r
+iterables.");\r
+\r
+static PyTypeObject imap_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.imap",                   /* tp_name */\r
+    sizeof(imapobject),                 /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)imap_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    imap_doc,                           /* tp_doc */\r
+    (traverseproc)imap_traverse,        /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)imap_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    imap_new,                           /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* chain object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *source;                   /* Iterator over input iterables */\r
+    PyObject *active;                   /* Currently running input iterator */\r
+} chainobject;\r
+\r
+static PyTypeObject chain_type;\r
+\r
+static PyObject *\r
+chain_new_internal(PyTypeObject *type, PyObject *source)\r
+{\r
+    chainobject *lz;\r
+\r
+    lz = (chainobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(source);\r
+        return NULL;\r
+    }\r
+\r
+    lz->source = source;\r
+    lz->active = NULL;\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static PyObject *\r
+chain_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *source;\r
+\r
+    if (type == &chain_type && !_PyArg_NoKeywords("chain()", kwds))\r
+        return NULL;\r
+\r
+    source = PyObject_GetIter(args);\r
+    if (source == NULL)\r
+        return NULL;\r
+\r
+    return chain_new_internal(type, source);\r
+}\r
+\r
+static PyObject *\r
+chain_new_from_iterable(PyTypeObject *type, PyObject *arg)\r
+{\r
+    PyObject *source;\r
+\r
+    source = PyObject_GetIter(arg);\r
+    if (source == NULL)\r
+        return NULL;\r
+\r
+    return chain_new_internal(type, source);\r
+}\r
+\r
+static void\r
+chain_dealloc(chainobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->active);\r
+    Py_XDECREF(lz->source);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+chain_traverse(chainobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->source);\r
+    Py_VISIT(lz->active);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+chain_next(chainobject *lz)\r
+{\r
+    PyObject *item;\r
+\r
+    if (lz->source == NULL)\r
+        return NULL;                                    /* already stopped */\r
+\r
+    if (lz->active == NULL) {\r
+        PyObject *iterable = PyIter_Next(lz->source);\r
+        if (iterable == NULL) {\r
+            Py_CLEAR(lz->source);\r
+            return NULL;                                /* no more input sources */\r
+        }\r
+        lz->active = PyObject_GetIter(iterable);\r
+        Py_DECREF(iterable);\r
+        if (lz->active == NULL) {\r
+            Py_CLEAR(lz->source);\r
+            return NULL;                                /* input not iterable */\r
+        }\r
+    }\r
+    item = PyIter_Next(lz->active);\r
+    if (item != NULL)\r
+        return item;\r
+    if (PyErr_Occurred()) {\r
+        if (PyErr_ExceptionMatches(PyExc_StopIteration))\r
+            PyErr_Clear();\r
+        else\r
+            return NULL;                                /* input raised an exception */\r
+    }\r
+    Py_CLEAR(lz->active);\r
+    return chain_next(lz);                      /* recurse and use next active */\r
+}\r
+\r
+PyDoc_STRVAR(chain_doc,\r
+"chain(*iterables) --> chain object\n\\r
+\n\\r
+Return a chain object whose .next() method returns elements from the\n\\r
+first iterable until it is exhausted, then elements from the next\n\\r
+iterable, until all of the iterables are exhausted.");\r
+\r
+PyDoc_STRVAR(chain_from_iterable_doc,\r
+"chain.from_iterable(iterable) --> chain object\n\\r
+\n\\r
+Alternate chain() contructor taking a single iterable argument\n\\r
+that evaluates lazily.");\r
+\r
+static PyMethodDef chain_methods[] = {\r
+    {"from_iterable", (PyCFunction) chain_new_from_iterable,            METH_O | METH_CLASS,\r
+        chain_from_iterable_doc},\r
+    {NULL,              NULL}   /* sentinel */\r
+};\r
+\r
+static PyTypeObject chain_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.chain",                  /* tp_name */\r
+    sizeof(chainobject),                /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)chain_dealloc,          /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    chain_doc,                          /* tp_doc */\r
+    (traverseproc)chain_traverse,       /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)chain_next,           /* tp_iternext */\r
+    chain_methods,                      /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    chain_new,                          /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* product object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *pools;                    /* tuple of pool tuples */\r
+    Py_ssize_t *indices;            /* one index per pool */\r
+    PyObject *result;               /* most recently returned result tuple */\r
+    int stopped;                    /* set to 1 when the product iterator is exhausted */\r
+} productobject;\r
+\r
+static PyTypeObject product_type;\r
+\r
+static PyObject *\r
+product_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    productobject *lz;\r
+    Py_ssize_t nargs, npools, repeat=1;\r
+    PyObject *pools = NULL;\r
+    Py_ssize_t *indices = NULL;\r
+    Py_ssize_t i;\r
+\r
+    if (kwds != NULL) {\r
+        char *kwlist[] = {"repeat", 0};\r
+        PyObject *tmpargs = PyTuple_New(0);\r
+        if (tmpargs == NULL)\r
+            return NULL;\r
+        if (!PyArg_ParseTupleAndKeywords(tmpargs, kwds, "|n:product", kwlist, &repeat)) {\r
+            Py_DECREF(tmpargs);\r
+            return NULL;\r
+        }\r
+        Py_DECREF(tmpargs);\r
+        if (repeat < 0) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "repeat argument cannot be negative");\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    assert(PyTuple_CheckExact(args));\r
+    if (repeat == 0) {\r
+        nargs = 0;\r
+    } else {\r
+        nargs = PyTuple_GET_SIZE(args);\r
+        if ((size_t)nargs > PY_SSIZE_T_MAX/sizeof(Py_ssize_t)/repeat) {\r
+            PyErr_SetString(PyExc_OverflowError, "repeat argument too large");\r
+            return NULL;\r
+        }\r
+    }\r
+    npools = nargs * repeat;\r
+\r
+    indices = PyMem_New(Py_ssize_t, npools);\r
+    if (indices == NULL) {\r
+        PyErr_NoMemory();\r
+        goto error;\r
+    }\r
+\r
+    pools = PyTuple_New(npools);\r
+    if (pools == NULL)\r
+        goto error;\r
+\r
+    for (i=0; i < nargs ; ++i) {\r
+        PyObject *item = PyTuple_GET_ITEM(args, i);\r
+        PyObject *pool = PySequence_Tuple(item);\r
+        if (pool == NULL)\r
+            goto error;\r
+        PyTuple_SET_ITEM(pools, i, pool);\r
+        indices[i] = 0;\r
+    }\r
+    for ( ; i < npools; ++i) {\r
+        PyObject *pool = PyTuple_GET_ITEM(pools, i - nargs);\r
+        Py_INCREF(pool);\r
+        PyTuple_SET_ITEM(pools, i, pool);\r
+        indices[i] = 0;\r
+    }\r
+\r
+    /* create productobject structure */\r
+    lz = (productobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL)\r
+        goto error;\r
+\r
+    lz->pools = pools;\r
+    lz->indices = indices;\r
+    lz->result = NULL;\r
+    lz->stopped = 0;\r
+\r
+    return (PyObject *)lz;\r
+\r
+error:\r
+    if (indices != NULL)\r
+        PyMem_Free(indices);\r
+    Py_XDECREF(pools);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+product_dealloc(productobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->pools);\r
+    Py_XDECREF(lz->result);\r
+    if (lz->indices != NULL)\r
+        PyMem_Free(lz->indices);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+product_traverse(productobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->pools);\r
+    Py_VISIT(lz->result);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+product_next(productobject *lz)\r
+{\r
+    PyObject *pool;\r
+    PyObject *elem;\r
+    PyObject *oldelem;\r
+    PyObject *pools = lz->pools;\r
+    PyObject *result = lz->result;\r
+    Py_ssize_t npools = PyTuple_GET_SIZE(pools);\r
+    Py_ssize_t i;\r
+\r
+    if (lz->stopped)\r
+        return NULL;\r
+\r
+    if (result == NULL) {\r
+        /* On the first pass, return an initial tuple filled with the\r
+           first element from each pool. */\r
+        result = PyTuple_New(npools);\r
+        if (result == NULL)\r
+            goto empty;\r
+        lz->result = result;\r
+        for (i=0; i < npools; i++) {\r
+            pool = PyTuple_GET_ITEM(pools, i);\r
+            if (PyTuple_GET_SIZE(pool) == 0)\r
+                goto empty;\r
+            elem = PyTuple_GET_ITEM(pool, 0);\r
+            Py_INCREF(elem);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+        }\r
+    } else {\r
+        Py_ssize_t *indices = lz->indices;\r
+\r
+        /* Copy the previous result tuple or re-use it if available */\r
+        if (Py_REFCNT(result) > 1) {\r
+            PyObject *old_result = result;\r
+            result = PyTuple_New(npools);\r
+            if (result == NULL)\r
+                goto empty;\r
+            lz->result = result;\r
+            for (i=0; i < npools; i++) {\r
+                elem = PyTuple_GET_ITEM(old_result, i);\r
+                Py_INCREF(elem);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+            }\r
+            Py_DECREF(old_result);\r
+        }\r
+        /* Now, we've got the only copy so we can update it in-place */\r
+        assert (npools==0 || Py_REFCNT(result) == 1);\r
+\r
+        /* Update the pool indices right-to-left.  Only advance to the\r
+           next pool when the previous one rolls-over */\r
+        for (i=npools-1 ; i >= 0 ; i--) {\r
+            pool = PyTuple_GET_ITEM(pools, i);\r
+            indices[i]++;\r
+            if (indices[i] == PyTuple_GET_SIZE(pool)) {\r
+                /* Roll-over and advance to next pool */\r
+                indices[i] = 0;\r
+                elem = PyTuple_GET_ITEM(pool, 0);\r
+                Py_INCREF(elem);\r
+                oldelem = PyTuple_GET_ITEM(result, i);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+                Py_DECREF(oldelem);\r
+            } else {\r
+                /* No rollover. Just increment and stop here. */\r
+                elem = PyTuple_GET_ITEM(pool, indices[i]);\r
+                Py_INCREF(elem);\r
+                oldelem = PyTuple_GET_ITEM(result, i);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+                Py_DECREF(oldelem);\r
+                break;\r
+            }\r
+        }\r
+\r
+        /* If i is negative, then the indices have all rolled-over\r
+           and we're done. */\r
+        if (i < 0)\r
+            goto empty;\r
+    }\r
+\r
+    Py_INCREF(result);\r
+    return result;\r
+\r
+empty:\r
+    lz->stopped = 1;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(product_doc,\r
+"product(*iterables) --> product object\n\\r
+\n\\r
+Cartesian product of input iterables.  Equivalent to nested for-loops.\n\n\\r
+For example, product(A, B) returns the same as:  ((x,y) for x in A for y in B).\n\\r
+The leftmost iterators are in the outermost for-loop, so the output tuples\n\\r
+cycle in a manner similar to an odometer (with the rightmost element changing\n\\r
+on every iteration).\n\n\\r
+To compute the product of an iterable with itself, specify the number\n\\r
+of repetitions with the optional repeat keyword argument. For example,\n\\r
+product(A, repeat=4) means the same as product(A, A, A, A).\n\n\\r
+product('ab', range(3)) --> ('a',0) ('a',1) ('a',2) ('b',0) ('b',1) ('b',2)\n\\r
+product((0,1), (0,1), (0,1)) --> (0,0,0) (0,0,1) (0,1,0) (0,1,1) (1,0,0) ...");\r
+\r
+static PyTypeObject product_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.product",                /* tp_name */\r
+    sizeof(productobject),      /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)product_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    product_doc,                        /* tp_doc */\r
+    (traverseproc)product_traverse,     /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)product_next,         /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    product_new,                        /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* combinations object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *pool;                     /* input converted to a tuple */\r
+    Py_ssize_t *indices;            /* one index per result element */\r
+    PyObject *result;               /* most recently returned result tuple */\r
+    Py_ssize_t r;                       /* size of result tuple */\r
+    int stopped;                        /* set to 1 when the combinations iterator is exhausted */\r
+} combinationsobject;\r
+\r
+static PyTypeObject combinations_type;\r
+\r
+static PyObject *\r
+combinations_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    combinationsobject *co;\r
+    Py_ssize_t n;\r
+    Py_ssize_t r;\r
+    PyObject *pool = NULL;\r
+    PyObject *iterable = NULL;\r
+    Py_ssize_t *indices = NULL;\r
+    Py_ssize_t i;\r
+    static char *kwargs[] = {"iterable", "r", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:combinations", kwargs,\r
+                                     &iterable, &r))\r
+        return NULL;\r
+\r
+    pool = PySequence_Tuple(iterable);\r
+    if (pool == NULL)\r
+        goto error;\r
+    n = PyTuple_GET_SIZE(pool);\r
+    if (r < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "r must be non-negative");\r
+        goto error;\r
+    }\r
+\r
+    indices = PyMem_New(Py_ssize_t, r);\r
+    if (indices == NULL) {\r
+        PyErr_NoMemory();\r
+        goto error;\r
+    }\r
+\r
+    for (i=0 ; i<r ; i++)\r
+        indices[i] = i;\r
+\r
+    /* create combinationsobject structure */\r
+    co = (combinationsobject *)type->tp_alloc(type, 0);\r
+    if (co == NULL)\r
+        goto error;\r
+\r
+    co->pool = pool;\r
+    co->indices = indices;\r
+    co->result = NULL;\r
+    co->r = r;\r
+    co->stopped = r > n ? 1 : 0;\r
+\r
+    return (PyObject *)co;\r
+\r
+error:\r
+    if (indices != NULL)\r
+        PyMem_Free(indices);\r
+    Py_XDECREF(pool);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+combinations_dealloc(combinationsobject *co)\r
+{\r
+    PyObject_GC_UnTrack(co);\r
+    Py_XDECREF(co->pool);\r
+    Py_XDECREF(co->result);\r
+    if (co->indices != NULL)\r
+        PyMem_Free(co->indices);\r
+    Py_TYPE(co)->tp_free(co);\r
+}\r
+\r
+static int\r
+combinations_traverse(combinationsobject *co, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(co->pool);\r
+    Py_VISIT(co->result);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+combinations_next(combinationsobject *co)\r
+{\r
+    PyObject *elem;\r
+    PyObject *oldelem;\r
+    PyObject *pool = co->pool;\r
+    Py_ssize_t *indices = co->indices;\r
+    PyObject *result = co->result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(pool);\r
+    Py_ssize_t r = co->r;\r
+    Py_ssize_t i, j, index;\r
+\r
+    if (co->stopped)\r
+        return NULL;\r
+\r
+    if (result == NULL) {\r
+        /* On the first pass, initialize result tuple using the indices */\r
+        result = PyTuple_New(r);\r
+        if (result == NULL)\r
+            goto empty;\r
+        co->result = result;\r
+        for (i=0; i<r ; i++) {\r
+            index = indices[i];\r
+            elem = PyTuple_GET_ITEM(pool, index);\r
+            Py_INCREF(elem);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+        }\r
+    } else {\r
+        /* Copy the previous result tuple or re-use it if available */\r
+        if (Py_REFCNT(result) > 1) {\r
+            PyObject *old_result = result;\r
+            result = PyTuple_New(r);\r
+            if (result == NULL)\r
+                goto empty;\r
+            co->result = result;\r
+            for (i=0; i<r ; i++) {\r
+                elem = PyTuple_GET_ITEM(old_result, i);\r
+                Py_INCREF(elem);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+            }\r
+            Py_DECREF(old_result);\r
+        }\r
+        /* Now, we've got the only copy so we can update it in-place\r
+         * CPython's empty tuple is a singleton and cached in\r
+         * PyTuple's freelist.\r
+         */\r
+        assert(r == 0 || Py_REFCNT(result) == 1);\r
+\r
+        /* Scan indices right-to-left until finding one that is not\r
+           at its maximum (i + n - r). */\r
+        for (i=r-1 ; i >= 0 && indices[i] == i+n-r ; i--)\r
+            ;\r
+\r
+        /* If i is negative, then the indices are all at\r
+           their maximum value and we're done. */\r
+        if (i < 0)\r
+            goto empty;\r
+\r
+        /* Increment the current index which we know is not at its\r
+           maximum.  Then move back to the right setting each index\r
+           to its lowest possible value (one higher than the index\r
+           to its left -- this maintains the sort order invariant). */\r
+        indices[i]++;\r
+        for (j=i+1 ; j<r ; j++)\r
+            indices[j] = indices[j-1] + 1;\r
+\r
+        /* Update the result tuple for the new indices\r
+           starting with i, the leftmost index that changed */\r
+        for ( ; i<r ; i++) {\r
+            index = indices[i];\r
+            elem = PyTuple_GET_ITEM(pool, index);\r
+            Py_INCREF(elem);\r
+            oldelem = PyTuple_GET_ITEM(result, i);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+            Py_DECREF(oldelem);\r
+        }\r
+    }\r
+\r
+    Py_INCREF(result);\r
+    return result;\r
+\r
+empty:\r
+    co->stopped = 1;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(combinations_doc,\r
+"combinations(iterable, r) --> combinations object\n\\r
+\n\\r
+Return successive r-length combinations of elements in the iterable.\n\n\\r
+combinations(range(4), 3) --> (0,1,2), (0,1,3), (0,2,3), (1,2,3)");\r
+\r
+static PyTypeObject combinations_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.combinations",                   /* tp_name */\r
+    sizeof(combinationsobject),         /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)combinations_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    combinations_doc,                           /* tp_doc */\r
+    (traverseproc)combinations_traverse,        /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)combinations_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    combinations_new,                           /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* combinations with replacement object *******************************************/\r
+\r
+/* Equivalent to:\r
+\r
+        def combinations_with_replacement(iterable, r):\r
+            "combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC"\r
+            # number items returned:  (n+r-1)! / r! / (n-1)!\r
+            pool = tuple(iterable)\r
+            n = len(pool)\r
+            indices = [0] * r\r
+            yield tuple(pool[i] for i in indices)\r
+            while 1:\r
+                for i in reversed(range(r)):\r
+                    if indices[i] != n - 1:\r
+                        break\r
+                else:\r
+                    return\r
+                indices[i:] = [indices[i] + 1] * (r - i)\r
+                yield tuple(pool[i] for i in indices)\r
+\r
+        def combinations_with_replacement2(iterable, r):\r
+            'Alternate version that filters from product()'\r
+            pool = tuple(iterable)\r
+            n = len(pool)\r
+            for indices in product(range(n), repeat=r):\r
+                if sorted(indices) == list(indices):\r
+                    yield tuple(pool[i] for i in indices)\r
+*/\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *pool;                     /* input converted to a tuple */\r
+    Py_ssize_t *indices;    /* one index per result element */\r
+    PyObject *result;       /* most recently returned result tuple */\r
+    Py_ssize_t r;                       /* size of result tuple */\r
+    int stopped;                        /* set to 1 when the cwr iterator is exhausted */\r
+} cwrobject;\r
+\r
+static PyTypeObject cwr_type;\r
+\r
+static PyObject *\r
+cwr_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    cwrobject *co;\r
+    Py_ssize_t n;\r
+    Py_ssize_t r;\r
+    PyObject *pool = NULL;\r
+    PyObject *iterable = NULL;\r
+    Py_ssize_t *indices = NULL;\r
+    Py_ssize_t i;\r
+    static char *kwargs[] = {"iterable", "r", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "On:combinations_with_replacement", kwargs,\r
+                                     &iterable, &r))\r
+        return NULL;\r
+\r
+    pool = PySequence_Tuple(iterable);\r
+    if (pool == NULL)\r
+        goto error;\r
+    n = PyTuple_GET_SIZE(pool);\r
+    if (r < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "r must be non-negative");\r
+        goto error;\r
+    }\r
+\r
+    indices = PyMem_New(Py_ssize_t, r);\r
+    if (indices == NULL) {\r
+        PyErr_NoMemory();\r
+        goto error;\r
+    }\r
+\r
+    for (i=0 ; i<r ; i++)\r
+        indices[i] = 0;\r
+\r
+    /* create cwrobject structure */\r
+    co = (cwrobject *)type->tp_alloc(type, 0);\r
+    if (co == NULL)\r
+        goto error;\r
+\r
+    co->pool = pool;\r
+    co->indices = indices;\r
+    co->result = NULL;\r
+    co->r = r;\r
+    co->stopped = !n && r;\r
+\r
+    return (PyObject *)co;\r
+\r
+error:\r
+    if (indices != NULL)\r
+        PyMem_Free(indices);\r
+    Py_XDECREF(pool);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+cwr_dealloc(cwrobject *co)\r
+{\r
+    PyObject_GC_UnTrack(co);\r
+    Py_XDECREF(co->pool);\r
+    Py_XDECREF(co->result);\r
+    if (co->indices != NULL)\r
+        PyMem_Free(co->indices);\r
+    Py_TYPE(co)->tp_free(co);\r
+}\r
+\r
+static int\r
+cwr_traverse(cwrobject *co, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(co->pool);\r
+    Py_VISIT(co->result);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+cwr_next(cwrobject *co)\r
+{\r
+    PyObject *elem;\r
+    PyObject *oldelem;\r
+    PyObject *pool = co->pool;\r
+    Py_ssize_t *indices = co->indices;\r
+    PyObject *result = co->result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(pool);\r
+    Py_ssize_t r = co->r;\r
+    Py_ssize_t i, j, index;\r
+\r
+    if (co->stopped)\r
+        return NULL;\r
+\r
+    if (result == NULL) {\r
+        /* On the first pass, initialize result tuple using the indices */\r
+        result = PyTuple_New(r);\r
+        if (result == NULL)\r
+            goto empty;\r
+        co->result = result;\r
+        for (i=0; i<r ; i++) {\r
+            index = indices[i];\r
+            elem = PyTuple_GET_ITEM(pool, index);\r
+            Py_INCREF(elem);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+        }\r
+    } else {\r
+        /* Copy the previous result tuple or re-use it if available */\r
+        if (Py_REFCNT(result) > 1) {\r
+            PyObject *old_result = result;\r
+            result = PyTuple_New(r);\r
+            if (result == NULL)\r
+                goto empty;\r
+            co->result = result;\r
+            for (i=0; i<r ; i++) {\r
+                elem = PyTuple_GET_ITEM(old_result, i);\r
+                Py_INCREF(elem);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+            }\r
+            Py_DECREF(old_result);\r
+        }\r
+        /* Now, we've got the only copy so we can update it in-place CPython's\r
+           empty tuple is a singleton and cached in PyTuple's freelist. */\r
+        assert(r == 0 || Py_REFCNT(result) == 1);\r
+\r
+    /* Scan indices right-to-left until finding one that is not\r
+     * at its maximum (n-1). */\r
+        for (i=r-1 ; i >= 0 && indices[i] == n-1; i--)\r
+            ;\r
+\r
+        /* If i is negative, then the indices are all at\r
+       their maximum value and we're done. */\r
+        if (i < 0)\r
+            goto empty;\r
+\r
+        /* Increment the current index which we know is not at its\r
+       maximum.  Then set all to the right to the same value. */\r
+        indices[i]++;\r
+        for (j=i+1 ; j<r ; j++)\r
+            indices[j] = indices[j-1];\r
+\r
+        /* Update the result tuple for the new indices\r
+           starting with i, the leftmost index that changed */\r
+        for ( ; i<r ; i++) {\r
+            index = indices[i];\r
+            elem = PyTuple_GET_ITEM(pool, index);\r
+            Py_INCREF(elem);\r
+            oldelem = PyTuple_GET_ITEM(result, i);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+            Py_DECREF(oldelem);\r
+        }\r
+    }\r
+\r
+    Py_INCREF(result);\r
+    return result;\r
+\r
+empty:\r
+    co->stopped = 1;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(cwr_doc,\r
+"combinations_with_replacement(iterable, r) --> combinations_with_replacement object\n\\r
+\n\\r
+Return successive r-length combinations of elements in the iterable\n\\r
+allowing individual elements to have successive repeats.\n\\r
+combinations_with_replacement('ABC', 2) --> AA AB AC BB BC CC");\r
+\r
+static PyTypeObject cwr_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.combinations_with_replacement",                  /* tp_name */\r
+    sizeof(cwrobject),                  /* tp_basicsize */\r
+    0,                                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)cwr_dealloc,            /* tp_dealloc */\r
+    0,                                                  /* tp_print */\r
+    0,                                                  /* tp_getattr */\r
+    0,                                                  /* tp_setattr */\r
+    0,                                                  /* tp_compare */\r
+    0,                                                  /* tp_repr */\r
+    0,                                                  /* tp_as_number */\r
+    0,                                                  /* tp_as_sequence */\r
+    0,                                                  /* tp_as_mapping */\r
+    0,                                                  /* tp_hash */\r
+    0,                                                  /* tp_call */\r
+    0,                                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                                  /* tp_setattro */\r
+    0,                                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    cwr_doc,                                    /* tp_doc */\r
+    (traverseproc)cwr_traverse,         /* tp_traverse */\r
+    0,                                                  /* tp_clear */\r
+    0,                                                  /* tp_richcompare */\r
+    0,                                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)cwr_next,     /* tp_iternext */\r
+    0,                                                  /* tp_methods */\r
+    0,                                                  /* tp_members */\r
+    0,                                                  /* tp_getset */\r
+    0,                                                  /* tp_base */\r
+    0,                                                  /* tp_dict */\r
+    0,                                                  /* tp_descr_get */\r
+    0,                                                  /* tp_descr_set */\r
+    0,                                                  /* tp_dictoffset */\r
+    0,                                                  /* tp_init */\r
+    0,                                                  /* tp_alloc */\r
+    cwr_new,                                    /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* permutations object ************************************************************\r
+\r
+def permutations(iterable, r=None):\r
+    'permutations(range(3), 2) --> (0,1) (0,2) (1,0) (1,2) (2,0) (2,1)'\r
+    pool = tuple(iterable)\r
+    n = len(pool)\r
+    r = n if r is None else r\r
+    indices = range(n)\r
+    cycles = range(n-r+1, n+1)[::-1]\r
+    yield tuple(pool[i] for i in indices[:r])\r
+    while n:\r
+    for i in reversed(range(r)):\r
+        cycles[i] -= 1\r
+        if cycles[i] == 0:\r
+        indices[i:] = indices[i+1:] + indices[i:i+1]\r
+        cycles[i] = n - i\r
+        else:\r
+        j = cycles[i]\r
+        indices[i], indices[-j] = indices[-j], indices[i]\r
+        yield tuple(pool[i] for i in indices[:r])\r
+        break\r
+    else:\r
+        return\r
+*/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *pool;                     /* input converted to a tuple */\r
+    Py_ssize_t *indices;            /* one index per element in the pool */\r
+    Py_ssize_t *cycles;                 /* one rollover counter per element in the result */\r
+    PyObject *result;               /* most recently returned result tuple */\r
+    Py_ssize_t r;                       /* size of result tuple */\r
+    int stopped;                        /* set to 1 when the permutations iterator is exhausted */\r
+} permutationsobject;\r
+\r
+static PyTypeObject permutations_type;\r
+\r
+static PyObject *\r
+permutations_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    permutationsobject *po;\r
+    Py_ssize_t n;\r
+    Py_ssize_t r;\r
+    PyObject *robj = Py_None;\r
+    PyObject *pool = NULL;\r
+    PyObject *iterable = NULL;\r
+    Py_ssize_t *indices = NULL;\r
+    Py_ssize_t *cycles = NULL;\r
+    Py_ssize_t i;\r
+    static char *kwargs[] = {"iterable", "r", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|O:permutations", kwargs,\r
+                                     &iterable, &robj))\r
+        return NULL;\r
+\r
+    pool = PySequence_Tuple(iterable);\r
+    if (pool == NULL)\r
+        goto error;\r
+    n = PyTuple_GET_SIZE(pool);\r
+\r
+    r = n;\r
+    if (robj != Py_None) {\r
+        r = PyInt_AsSsize_t(robj);\r
+        if (r == -1 && PyErr_Occurred())\r
+            goto error;\r
+    }\r
+    if (r < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "r must be non-negative");\r
+        goto error;\r
+    }\r
+\r
+    indices = PyMem_New(Py_ssize_t, n);\r
+    cycles = PyMem_New(Py_ssize_t, r);\r
+    if (indices == NULL || cycles == NULL) {\r
+        PyErr_NoMemory();\r
+        goto error;\r
+    }\r
+\r
+    for (i=0 ; i<n ; i++)\r
+        indices[i] = i;\r
+    for (i=0 ; i<r ; i++)\r
+        cycles[i] = n - i;\r
+\r
+    /* create permutationsobject structure */\r
+    po = (permutationsobject *)type->tp_alloc(type, 0);\r
+    if (po == NULL)\r
+        goto error;\r
+\r
+    po->pool = pool;\r
+    po->indices = indices;\r
+    po->cycles = cycles;\r
+    po->result = NULL;\r
+    po->r = r;\r
+    po->stopped = r > n ? 1 : 0;\r
+\r
+    return (PyObject *)po;\r
+\r
+error:\r
+    if (indices != NULL)\r
+        PyMem_Free(indices);\r
+    if (cycles != NULL)\r
+        PyMem_Free(cycles);\r
+    Py_XDECREF(pool);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+permutations_dealloc(permutationsobject *po)\r
+{\r
+    PyObject_GC_UnTrack(po);\r
+    Py_XDECREF(po->pool);\r
+    Py_XDECREF(po->result);\r
+    PyMem_Free(po->indices);\r
+    PyMem_Free(po->cycles);\r
+    Py_TYPE(po)->tp_free(po);\r
+}\r
+\r
+static int\r
+permutations_traverse(permutationsobject *po, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(po->pool);\r
+    Py_VISIT(po->result);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+permutations_next(permutationsobject *po)\r
+{\r
+    PyObject *elem;\r
+    PyObject *oldelem;\r
+    PyObject *pool = po->pool;\r
+    Py_ssize_t *indices = po->indices;\r
+    Py_ssize_t *cycles = po->cycles;\r
+    PyObject *result = po->result;\r
+    Py_ssize_t n = PyTuple_GET_SIZE(pool);\r
+    Py_ssize_t r = po->r;\r
+    Py_ssize_t i, j, k, index;\r
+\r
+    if (po->stopped)\r
+        return NULL;\r
+\r
+    if (result == NULL) {\r
+        /* On the first pass, initialize result tuple using the indices */\r
+        result = PyTuple_New(r);\r
+        if (result == NULL)\r
+            goto empty;\r
+        po->result = result;\r
+        for (i=0; i<r ; i++) {\r
+            index = indices[i];\r
+            elem = PyTuple_GET_ITEM(pool, index);\r
+            Py_INCREF(elem);\r
+            PyTuple_SET_ITEM(result, i, elem);\r
+        }\r
+    } else {\r
+        if (n == 0)\r
+            goto empty;\r
+\r
+        /* Copy the previous result tuple or re-use it if available */\r
+        if (Py_REFCNT(result) > 1) {\r
+            PyObject *old_result = result;\r
+            result = PyTuple_New(r);\r
+            if (result == NULL)\r
+                goto empty;\r
+            po->result = result;\r
+            for (i=0; i<r ; i++) {\r
+                elem = PyTuple_GET_ITEM(old_result, i);\r
+                Py_INCREF(elem);\r
+                PyTuple_SET_ITEM(result, i, elem);\r
+            }\r
+            Py_DECREF(old_result);\r
+        }\r
+        /* Now, we've got the only copy so we can update it in-place */\r
+        assert(r == 0 || Py_REFCNT(result) == 1);\r
+\r
+        /* Decrement rightmost cycle, moving leftward upon zero rollover */\r
+        for (i=r-1 ; i>=0 ; i--) {\r
+            cycles[i] -= 1;\r
+            if (cycles[i] == 0) {\r
+                /* rotatation: indices[i:] = indices[i+1:] + indices[i:i+1] */\r
+                index = indices[i];\r
+                for (j=i ; j<n-1 ; j++)\r
+                    indices[j] = indices[j+1];\r
+                indices[n-1] = index;\r
+                cycles[i] = n - i;\r
+            } else {\r
+                j = cycles[i];\r
+                index = indices[i];\r
+                indices[i] = indices[n-j];\r
+                indices[n-j] = index;\r
+\r
+                for (k=i; k<r ; k++) {\r
+                    /* start with i, the leftmost element that changed */\r
+                    /* yield tuple(pool[k] for k in indices[:r]) */\r
+                    index = indices[k];\r
+                    elem = PyTuple_GET_ITEM(pool, index);\r
+                    Py_INCREF(elem);\r
+                    oldelem = PyTuple_GET_ITEM(result, k);\r
+                    PyTuple_SET_ITEM(result, k, elem);\r
+                    Py_DECREF(oldelem);\r
+                }\r
+                break;\r
+            }\r
+        }\r
+        /* If i is negative, then the cycles have all\r
+           rolled-over and we're done. */\r
+        if (i < 0)\r
+            goto empty;\r
+    }\r
+    Py_INCREF(result);\r
+    return result;\r
+\r
+empty:\r
+    po->stopped = 1;\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(permutations_doc,\r
+"permutations(iterable[, r]) --> permutations object\n\\r
+\n\\r
+Return successive r-length permutations of elements in the iterable.\n\n\\r
+permutations(range(3), 2) --> (0,1), (0,2), (1,0), (1,2), (2,0), (2,1)");\r
+\r
+static PyTypeObject permutations_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.permutations",                   /* tp_name */\r
+    sizeof(permutationsobject),         /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)permutations_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    permutations_doc,                           /* tp_doc */\r
+    (traverseproc)permutations_traverse,        /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)permutations_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    permutations_new,                           /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* compress object ************************************************************/\r
+\r
+/* Equivalent to:\r
+\r
+    def compress(data, selectors):\r
+        "compress('ABCDEF', [1,0,1,0,1,1]) --> A C E F"\r
+        return (d for d, s in izip(data, selectors) if s)\r
+*/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *data;\r
+    PyObject *selectors;\r
+} compressobject;\r
+\r
+static PyTypeObject compress_type;\r
+\r
+static PyObject *\r
+compress_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *seq1, *seq2;\r
+    PyObject *data=NULL, *selectors=NULL;\r
+    compressobject *lz;\r
+    static char *kwargs[] = {"data", "selectors", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "OO:compress", kwargs, &seq1, &seq2))\r
+        return NULL;\r
+\r
+    data = PyObject_GetIter(seq1);\r
+    if (data == NULL)\r
+        goto fail;\r
+    selectors = PyObject_GetIter(seq2);\r
+    if (selectors == NULL)\r
+        goto fail;\r
+\r
+    /* create compressobject structure */\r
+    lz = (compressobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL)\r
+        goto fail;\r
+    lz->data = data;\r
+    lz->selectors = selectors;\r
+    return (PyObject *)lz;\r
+\r
+fail:\r
+    Py_XDECREF(data);\r
+    Py_XDECREF(selectors);\r
+    return NULL;\r
+}\r
+\r
+static void\r
+compress_dealloc(compressobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->data);\r
+    Py_XDECREF(lz->selectors);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+compress_traverse(compressobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->data);\r
+    Py_VISIT(lz->selectors);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+compress_next(compressobject *lz)\r
+{\r
+    PyObject *data = lz->data, *selectors = lz->selectors;\r
+    PyObject *datum, *selector;\r
+    PyObject *(*datanext)(PyObject *) = *Py_TYPE(data)->tp_iternext;\r
+    PyObject *(*selectornext)(PyObject *) = *Py_TYPE(selectors)->tp_iternext;\r
+    int ok;\r
+\r
+    while (1) {\r
+        /* Steps:  get datum, get selector, evaluate selector.\r
+           Order is important (to match the pure python version\r
+           in terms of which input gets a chance to raise an\r
+           exception first).\r
+        */\r
+\r
+        datum = datanext(data);\r
+        if (datum == NULL)\r
+            return NULL;\r
+\r
+        selector = selectornext(selectors);\r
+        if (selector == NULL) {\r
+            Py_DECREF(datum);\r
+            return NULL;\r
+        }\r
+\r
+        ok = PyObject_IsTrue(selector);\r
+        Py_DECREF(selector);\r
+        if (ok == 1)\r
+            return datum;\r
+        Py_DECREF(datum);\r
+        if (ok == -1)\r
+            return NULL;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(compress_doc,\r
+"compress(data, selectors) --> iterator over selected data\n\\r
+\n\\r
+Return data elements corresponding to true selector elements.\n\\r
+Forms a shorter iterator from selected data elements using the\n\\r
+selectors to choose the data elements.");\r
+\r
+static PyTypeObject compress_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.compress",               /* tp_name */\r
+    sizeof(compressobject),             /* tp_basicsize */\r
+    0,                                                          /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)compress_dealloc,       /* tp_dealloc */\r
+    0,                                                                  /* tp_print */\r
+    0,                                                                  /* tp_getattr */\r
+    0,                                                                  /* tp_setattr */\r
+    0,                                                                  /* tp_compare */\r
+    0,                                                                  /* tp_repr */\r
+    0,                                                                  /* tp_as_number */\r
+    0,                                                                  /* tp_as_sequence */\r
+    0,                                                                  /* tp_as_mapping */\r
+    0,                                                                  /* tp_hash */\r
+    0,                                                                  /* tp_call */\r
+    0,                                                                  /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                                                  /* tp_setattro */\r
+    0,                                                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,                    /* tp_flags */\r
+    compress_doc,                                       /* tp_doc */\r
+    (traverseproc)compress_traverse,            /* tp_traverse */\r
+    0,                                                                  /* tp_clear */\r
+    0,                                                                  /* tp_richcompare */\r
+    0,                                                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                                  /* tp_iter */\r
+    (iternextfunc)compress_next,        /* tp_iternext */\r
+    0,                                                                  /* tp_methods */\r
+    0,                                                                  /* tp_members */\r
+    0,                                                                  /* tp_getset */\r
+    0,                                                                  /* tp_base */\r
+    0,                                                                  /* tp_dict */\r
+    0,                                                                  /* tp_descr_get */\r
+    0,                                                                  /* tp_descr_set */\r
+    0,                                                                  /* tp_dictoffset */\r
+    0,                                                                  /* tp_init */\r
+    0,                                                                  /* tp_alloc */\r
+    compress_new,                                       /* tp_new */\r
+    PyObject_GC_Del,                                    /* tp_free */\r
+};\r
+\r
+\r
+/* ifilter object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *func;\r
+    PyObject *it;\r
+} ifilterobject;\r
+\r
+static PyTypeObject ifilter_type;\r
+\r
+static PyObject *\r
+ifilter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *func, *seq;\r
+    PyObject *it;\r
+    ifilterobject *lz;\r
+\r
+    if (type == &ifilter_type && !_PyArg_NoKeywords("ifilter()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "ifilter", 2, 2, &func, &seq))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create ifilterobject structure */\r
+    lz = (ifilterobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+    lz->it = it;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+ifilter_dealloc(ifilterobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->func);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+ifilter_traverse(ifilterobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+ifilter_next(ifilterobject *lz)\r
+{\r
+    PyObject *item;\r
+    PyObject *it = lz->it;\r
+    long ok;\r
+    PyObject *(*iternext)(PyObject *);\r
+\r
+    iternext = *Py_TYPE(it)->tp_iternext;\r
+    for (;;) {\r
+        item = iternext(it);\r
+        if (item == NULL)\r
+            return NULL;\r
+\r
+        if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) {\r
+            ok = PyObject_IsTrue(item);\r
+        } else {\r
+            PyObject *good;\r
+            good = PyObject_CallFunctionObjArgs(lz->func,\r
+                                                item, NULL);\r
+            if (good == NULL) {\r
+                Py_DECREF(item);\r
+                return NULL;\r
+            }\r
+            ok = PyObject_IsTrue(good);\r
+            Py_DECREF(good);\r
+        }\r
+        if (ok > 0)\r
+            return item;\r
+        Py_DECREF(item);\r
+        if (ok < 0)\r
+            return NULL;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(ifilter_doc,\r
+"ifilter(function or None, sequence) --> ifilter object\n\\r
+\n\\r
+Return those items of sequence for which function(item) is true.\n\\r
+If function is None, return the items that are true.");\r
+\r
+static PyTypeObject ifilter_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.ifilter",                /* tp_name */\r
+    sizeof(ifilterobject),              /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)ifilter_dealloc,        /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    ifilter_doc,                        /* tp_doc */\r
+    (traverseproc)ifilter_traverse,     /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)ifilter_next,         /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    ifilter_new,                        /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* ifilterfalse object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *func;\r
+    PyObject *it;\r
+} ifilterfalseobject;\r
+\r
+static PyTypeObject ifilterfalse_type;\r
+\r
+static PyObject *\r
+ifilterfalse_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *func, *seq;\r
+    PyObject *it;\r
+    ifilterfalseobject *lz;\r
+\r
+    if (type == &ifilterfalse_type &&\r
+        !_PyArg_NoKeywords("ifilterfalse()", kwds))\r
+        return NULL;\r
+\r
+    if (!PyArg_UnpackTuple(args, "ifilterfalse", 2, 2, &func, &seq))\r
+        return NULL;\r
+\r
+    /* Get iterator. */\r
+    it = PyObject_GetIter(seq);\r
+    if (it == NULL)\r
+        return NULL;\r
+\r
+    /* create ifilterfalseobject structure */\r
+    lz = (ifilterfalseobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(it);\r
+        return NULL;\r
+    }\r
+    Py_INCREF(func);\r
+    lz->func = func;\r
+    lz->it = it;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+ifilterfalse_dealloc(ifilterfalseobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->func);\r
+    Py_XDECREF(lz->it);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+ifilterfalse_traverse(ifilterfalseobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->it);\r
+    Py_VISIT(lz->func);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+ifilterfalse_next(ifilterfalseobject *lz)\r
+{\r
+    PyObject *item;\r
+    PyObject *it = lz->it;\r
+    long ok;\r
+    PyObject *(*iternext)(PyObject *);\r
+\r
+    iternext = *Py_TYPE(it)->tp_iternext;\r
+    for (;;) {\r
+        item = iternext(it);\r
+        if (item == NULL)\r
+            return NULL;\r
+\r
+        if (lz->func == Py_None || lz->func == (PyObject *)&PyBool_Type) {\r
+            ok = PyObject_IsTrue(item);\r
+        } else {\r
+            PyObject *good;\r
+            good = PyObject_CallFunctionObjArgs(lz->func,\r
+                                                item, NULL);\r
+            if (good == NULL) {\r
+                Py_DECREF(item);\r
+                return NULL;\r
+            }\r
+            ok = PyObject_IsTrue(good);\r
+            Py_DECREF(good);\r
+        }\r
+        if (ok == 0)\r
+            return item;\r
+        Py_DECREF(item);\r
+        if (ok < 0)\r
+            return NULL;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(ifilterfalse_doc,\r
+"ifilterfalse(function or None, sequence) --> ifilterfalse object\n\\r
+\n\\r
+Return those items of sequence for which function(item) is false.\n\\r
+If function is None, return the items that are false.");\r
+\r
+static PyTypeObject ifilterfalse_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.ifilterfalse",           /* tp_name */\r
+    sizeof(ifilterfalseobject),         /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)ifilterfalse_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    ifilterfalse_doc,                   /* tp_doc */\r
+    (traverseproc)ifilterfalse_traverse,        /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)ifilterfalse_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    ifilterfalse_new,                   /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* count object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t cnt;\r
+    PyObject *long_cnt;\r
+    PyObject *long_step;\r
+} countobject;\r
+\r
+/* Counting logic and invariants:\r
+\r
+fast_mode:  when cnt an integer < PY_SSIZE_T_MAX and no step is specified.\r
+\r
+    assert(cnt != PY_SSIZE_T_MAX && long_cnt == NULL && long_step==PyInt(1));\r
+    Advances with:  cnt += 1\r
+    When count hits Y_SSIZE_T_MAX, switch to slow_mode.\r
+\r
+slow_mode:  when cnt == PY_SSIZE_T_MAX, step is not int(1), or cnt is a float.\r
+\r
+    assert(cnt == PY_SSIZE_T_MAX && long_cnt != NULL && long_step != NULL);\r
+    All counting is done with python objects (no overflows or underflows).\r
+    Advances with:  long_cnt += long_step\r
+    Step may be zero -- effectively a slow version of repeat(cnt).\r
+    Either long_cnt or long_step may be a float, Fraction, or Decimal.\r
+*/\r
+\r
+static PyTypeObject count_type;\r
+\r
+static PyObject *\r
+count_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    countobject *lz;\r
+    int slow_mode = 0;\r
+    Py_ssize_t cnt = 0;\r
+    PyObject *long_cnt = NULL;\r
+    PyObject *long_step = NULL;\r
+    static char *kwlist[] = {"start", "step", 0};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:count",\r
+                    kwlist, &long_cnt, &long_step))\r
+        return NULL;\r
+\r
+    if ((long_cnt != NULL && !PyNumber_Check(long_cnt)) ||\r
+        (long_step != NULL && !PyNumber_Check(long_step))) {\r
+                    PyErr_SetString(PyExc_TypeError, "a number is required");\r
+                    return NULL;\r
+    }\r
+\r
+    if (long_cnt != NULL) {\r
+        cnt = PyInt_AsSsize_t(long_cnt);\r
+        if ((cnt == -1 && PyErr_Occurred()) || !PyInt_Check(long_cnt)) {\r
+            PyErr_Clear();\r
+            slow_mode = 1;\r
+        }\r
+        Py_INCREF(long_cnt);\r
+    } else {\r
+        cnt = 0;\r
+        long_cnt = PyInt_FromLong(0);\r
+    }\r
+\r
+    /* If not specified, step defaults to 1 */\r
+    if (long_step == NULL) {\r
+        long_step = PyInt_FromLong(1);\r
+        if (long_step == NULL) {\r
+            Py_DECREF(long_cnt);\r
+            return NULL;\r
+        }\r
+    } else\r
+        Py_INCREF(long_step);\r
+\r
+    assert(long_cnt != NULL && long_step != NULL);\r
+\r
+    /* Fast mode only works when the step is 1 */\r
+    if (!PyInt_Check(long_step) ||\r
+        PyInt_AS_LONG(long_step) != 1) {\r
+            slow_mode = 1;\r
+    }\r
+\r
+    if (slow_mode)\r
+        cnt = PY_SSIZE_T_MAX;\r
+    else\r
+        Py_CLEAR(long_cnt);\r
+\r
+    assert((cnt != PY_SSIZE_T_MAX && long_cnt == NULL && !slow_mode) ||\r
+           (cnt == PY_SSIZE_T_MAX && long_cnt != NULL && slow_mode));\r
+    assert(slow_mode ||\r
+           (PyInt_Check(long_step) && PyInt_AS_LONG(long_step) == 1));\r
+\r
+    /* create countobject structure */\r
+    lz = (countobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_XDECREF(long_cnt);\r
+        return NULL;\r
+    }\r
+    lz->cnt = cnt;\r
+    lz->long_cnt = long_cnt;\r
+    lz->long_step = long_step;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+count_dealloc(countobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->long_cnt);\r
+    Py_XDECREF(lz->long_step);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+count_traverse(countobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->long_cnt);\r
+    Py_VISIT(lz->long_step);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+count_nextlong(countobject *lz)\r
+{\r
+    PyObject *long_cnt;\r
+    PyObject *stepped_up;\r
+\r
+    long_cnt = lz->long_cnt;\r
+    if (long_cnt == NULL) {\r
+        /* Switch to slow_mode */\r
+        long_cnt = PyInt_FromSsize_t(PY_SSIZE_T_MAX);\r
+        if (long_cnt == NULL)\r
+            return NULL;\r
+    }\r
+    assert(lz->cnt == PY_SSIZE_T_MAX && long_cnt != NULL);\r
+\r
+    stepped_up = PyNumber_Add(long_cnt, lz->long_step);\r
+    if (stepped_up == NULL)\r
+        return NULL;\r
+    lz->long_cnt = stepped_up;\r
+    return long_cnt;\r
+}\r
+\r
+static PyObject *\r
+count_next(countobject *lz)\r
+{\r
+    if (lz->cnt == PY_SSIZE_T_MAX)\r
+        return count_nextlong(lz);\r
+    return PyInt_FromSsize_t(lz->cnt++);\r
+}\r
+\r
+static PyObject *\r
+count_repr(countobject *lz)\r
+{\r
+    PyObject *cnt_repr, *step_repr = NULL;\r
+    PyObject *result = NULL;\r
+\r
+    if (lz->cnt != PY_SSIZE_T_MAX)\r
+                return PyString_FromFormat("count(%zd)", lz->cnt);\r
+\r
+    cnt_repr = PyObject_Repr(lz->long_cnt);\r
+    if (cnt_repr == NULL)\r
+        return NULL;\r
+\r
+    if (PyInt_Check(lz->long_step) && PyInt_AS_LONG(lz->long_step) == 1) {\r
+                    /* Don't display step when it is an integer equal to 1 */\r
+            result = PyString_FromFormat("count(%s)",\r
+                                                                     PyString_AS_STRING(cnt_repr));\r
+    } else {\r
+        step_repr = PyObject_Repr(lz->long_step);\r
+        if (step_repr != NULL)\r
+            result = PyString_FromFormat("count(%s, %s)",\r
+                                                                    PyString_AS_STRING(cnt_repr),\r
+                                                                    PyString_AS_STRING(step_repr));\r
+    }\r
+    Py_DECREF(cnt_repr);\r
+    Py_XDECREF(step_repr);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+count_reduce(countobject *lz)\r
+{\r
+    if (lz->cnt == PY_SSIZE_T_MAX)\r
+        return Py_BuildValue("O(OO)", Py_TYPE(lz), lz->long_cnt, lz->long_step);\r
+    return Py_BuildValue("O(n)", Py_TYPE(lz), lz->cnt);\r
+}\r
+\r
+PyDoc_STRVAR(count_reduce_doc, "Return state information for pickling.");\r
+\r
+static PyMethodDef count_methods[] = {\r
+    {"__reduce__",      (PyCFunction)count_reduce,      METH_NOARGS,\r
+     count_reduce_doc},\r
+    {NULL,              NULL}   /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(count_doc,\r
+                         "count(start=0, step=1) --> count object\n\\r
+\n\\r
+Return a count object whose .next() method returns consecutive values.\n\\r
+Equivalent to:\n\n\\r
+    def count(firstval=0, step=1):\n\\r
+        x = firstval\n\\r
+        while 1:\n\\r
+            yield x\n\\r
+            x += step\n");\r
+\r
+static PyTypeObject count_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.count",                  /* tp_name */\r
+    sizeof(countobject),                /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)count_dealloc,          /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    (reprfunc)count_repr,               /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,                    /* tp_flags */\r
+    count_doc,                          /* tp_doc */\r
+    (traverseproc)count_traverse,                               /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)count_next,           /* tp_iternext */\r
+    count_methods,                              /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    count_new,                          /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* izip object ************************************************************/\r
+\r
+#include "Python.h"\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t          tuplesize;\r
+    PyObject *ittuple;                  /* tuple of iterators */\r
+    PyObject *result;\r
+} izipobject;\r
+\r
+static PyTypeObject izip_type;\r
+\r
+static PyObject *\r
+izip_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    izipobject *lz;\r
+    Py_ssize_t i;\r
+    PyObject *ittuple;  /* tuple of iterators */\r
+    PyObject *result;\r
+    Py_ssize_t tuplesize = PySequence_Length(args);\r
+\r
+    if (type == &izip_type && !_PyArg_NoKeywords("izip()", kwds))\r
+        return NULL;\r
+\r
+    /* args must be a tuple */\r
+    assert(PyTuple_Check(args));\r
+\r
+    /* obtain iterators */\r
+    ittuple = PyTuple_New(tuplesize);\r
+    if (ittuple == NULL)\r
+        return NULL;\r
+    for (i=0; i < tuplesize; ++i) {\r
+        PyObject *item = PyTuple_GET_ITEM(args, i);\r
+        PyObject *it = PyObject_GetIter(item);\r
+        if (it == NULL) {\r
+            if (PyErr_ExceptionMatches(PyExc_TypeError))\r
+                PyErr_Format(PyExc_TypeError,\r
+                    "izip argument #%zd must support iteration",\r
+                    i+1);\r
+            Py_DECREF(ittuple);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(ittuple, i, it);\r
+    }\r
+\r
+    /* create a result holder */\r
+    result = PyTuple_New(tuplesize);\r
+    if (result == NULL) {\r
+        Py_DECREF(ittuple);\r
+        return NULL;\r
+    }\r
+    for (i=0 ; i < tuplesize ; i++) {\r
+        Py_INCREF(Py_None);\r
+        PyTuple_SET_ITEM(result, i, Py_None);\r
+    }\r
+\r
+    /* create izipobject structure */\r
+    lz = (izipobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(ittuple);\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+    lz->ittuple = ittuple;\r
+    lz->tuplesize = tuplesize;\r
+    lz->result = result;\r
+\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+izip_dealloc(izipobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->ittuple);\r
+    Py_XDECREF(lz->result);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+izip_traverse(izipobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->ittuple);\r
+    Py_VISIT(lz->result);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+izip_next(izipobject *lz)\r
+{\r
+    Py_ssize_t i;\r
+    Py_ssize_t tuplesize = lz->tuplesize;\r
+    PyObject *result = lz->result;\r
+    PyObject *it;\r
+    PyObject *item;\r
+    PyObject *olditem;\r
+\r
+    if (tuplesize == 0)\r
+        return NULL;\r
+    if (Py_REFCNT(result) == 1) {\r
+        Py_INCREF(result);\r
+        for (i=0 ; i < tuplesize ; i++) {\r
+            it = PyTuple_GET_ITEM(lz->ittuple, i);\r
+            item = (*Py_TYPE(it)->tp_iternext)(it);\r
+            if (item == NULL) {\r
+                Py_DECREF(result);\r
+                return NULL;\r
+            }\r
+            olditem = PyTuple_GET_ITEM(result, i);\r
+            PyTuple_SET_ITEM(result, i, item);\r
+            Py_DECREF(olditem);\r
+        }\r
+    } else {\r
+        result = PyTuple_New(tuplesize);\r
+        if (result == NULL)\r
+            return NULL;\r
+        for (i=0 ; i < tuplesize ; i++) {\r
+            it = PyTuple_GET_ITEM(lz->ittuple, i);\r
+            item = (*Py_TYPE(it)->tp_iternext)(it);\r
+            if (item == NULL) {\r
+                Py_DECREF(result);\r
+                return NULL;\r
+            }\r
+            PyTuple_SET_ITEM(result, i, item);\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(izip_doc,\r
+"izip(iter1 [,iter2 [...]]) --> izip object\n\\r
+\n\\r
+Return a izip object whose .next() method returns a tuple where\n\\r
+the i-th element comes from the i-th iterable argument.  The .next()\n\\r
+method continues until the shortest iterable in the argument sequence\n\\r
+is exhausted and then it raises StopIteration.  Works like the zip()\n\\r
+function but consumes less memory by returning an iterator instead of\n\\r
+a list.");\r
+\r
+static PyTypeObject izip_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.izip",                   /* tp_name */\r
+    sizeof(izipobject),                 /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)izip_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    izip_doc,                           /* tp_doc */\r
+    (traverseproc)izip_traverse,    /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)izip_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    izip_new,                           /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+\r
+/* repeat object ************************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *element;\r
+    Py_ssize_t cnt;\r
+} repeatobject;\r
+\r
+static PyTypeObject repeat_type;\r
+\r
+static PyObject *\r
+repeat_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    repeatobject *ro;\r
+    PyObject *element;\r
+    Py_ssize_t cnt = -1, n_kwds = 0;\r
+    static char *kwargs[] = {"object", "times", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "O|n:repeat", kwargs,\r
+                                     &element, &cnt))\r
+        return NULL;\r
+\r
+    if (kwds != NULL)\r
+        n_kwds = PyDict_Size(kwds);\r
+    /* Does user supply times argument? */\r
+    if ((PyTuple_Size(args) + n_kwds == 2) && cnt < 0)\r
+        cnt = 0;\r
+\r
+    ro = (repeatobject *)type->tp_alloc(type, 0);\r
+    if (ro == NULL)\r
+        return NULL;\r
+    Py_INCREF(element);\r
+    ro->element = element;\r
+    ro->cnt = cnt;\r
+    return (PyObject *)ro;\r
+}\r
+\r
+static void\r
+repeat_dealloc(repeatobject *ro)\r
+{\r
+    PyObject_GC_UnTrack(ro);\r
+    Py_XDECREF(ro->element);\r
+    Py_TYPE(ro)->tp_free(ro);\r
+}\r
+\r
+static int\r
+repeat_traverse(repeatobject *ro, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(ro->element);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+repeat_next(repeatobject *ro)\r
+{\r
+    if (ro->cnt == 0)\r
+        return NULL;\r
+    if (ro->cnt > 0)\r
+        ro->cnt--;\r
+    Py_INCREF(ro->element);\r
+    return ro->element;\r
+}\r
+\r
+static PyObject *\r
+repeat_repr(repeatobject *ro)\r
+{\r
+    PyObject *result, *objrepr;\r
+\r
+    objrepr = PyObject_Repr(ro->element);\r
+    if (objrepr == NULL)\r
+        return NULL;\r
+\r
+    if (ro->cnt == -1)\r
+        result = PyString_FromFormat("repeat(%s)",\r
+            PyString_AS_STRING(objrepr));\r
+    else\r
+        result = PyString_FromFormat("repeat(%s, %zd)",\r
+            PyString_AS_STRING(objrepr), ro->cnt);\r
+    Py_DECREF(objrepr);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+repeat_len(repeatobject *ro)\r
+{\r
+    if (ro->cnt == -1) {\r
+        PyErr_SetString(PyExc_TypeError, "len() of unsized object");\r
+        return NULL;\r
+    }\r
+    return PyInt_FromSize_t(ro->cnt);\r
+}\r
+\r
+PyDoc_STRVAR(length_hint_doc, "Private method returning an estimate of len(list(it)).");\r
+\r
+static PyMethodDef repeat_methods[] = {\r
+    {"__length_hint__", (PyCFunction)repeat_len, METH_NOARGS, length_hint_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyDoc_STRVAR(repeat_doc,\r
+"repeat(object [,times]) -> create an iterator which returns the object\n\\r
+for the specified number of times.  If not specified, returns the object\n\\r
+endlessly.");\r
+\r
+static PyTypeObject repeat_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.repeat",                 /* tp_name */\r
+    sizeof(repeatobject),               /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)repeat_dealloc,         /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    (reprfunc)repeat_repr,              /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    repeat_doc,                         /* tp_doc */\r
+    (traverseproc)repeat_traverse,      /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)repeat_next,          /* tp_iternext */\r
+    repeat_methods,                     /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    repeat_new,                         /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+/* iziplongest object ************************************************************/\r
+\r
+#include "Python.h"\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t tuplesize;\r
+    Py_ssize_t numactive;\r
+    PyObject *ittuple;                  /* tuple of iterators */\r
+    PyObject *result;\r
+    PyObject *fillvalue;\r
+} iziplongestobject;\r
+\r
+static PyTypeObject iziplongest_type;\r
+\r
+static PyObject *\r
+izip_longest_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    iziplongestobject *lz;\r
+    Py_ssize_t i;\r
+    PyObject *ittuple;  /* tuple of iterators */\r
+    PyObject *result;\r
+    PyObject *fillvalue = Py_None;\r
+    Py_ssize_t tuplesize = PySequence_Length(args);\r
+\r
+    if (kwds != NULL && PyDict_CheckExact(kwds) && PyDict_Size(kwds) > 0) {\r
+        fillvalue = PyDict_GetItemString(kwds, "fillvalue");\r
+        if (fillvalue == NULL  ||  PyDict_Size(kwds) > 1) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                "izip_longest() got an unexpected keyword argument");\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    /* args must be a tuple */\r
+    assert(PyTuple_Check(args));\r
+\r
+    /* obtain iterators */\r
+    ittuple = PyTuple_New(tuplesize);\r
+    if (ittuple == NULL)\r
+        return NULL;\r
+    for (i=0; i < tuplesize; ++i) {\r
+        PyObject *item = PyTuple_GET_ITEM(args, i);\r
+        PyObject *it = PyObject_GetIter(item);\r
+        if (it == NULL) {\r
+            if (PyErr_ExceptionMatches(PyExc_TypeError))\r
+                PyErr_Format(PyExc_TypeError,\r
+                    "izip_longest argument #%zd must support iteration",\r
+                    i+1);\r
+            Py_DECREF(ittuple);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(ittuple, i, it);\r
+    }\r
+\r
+    /* create a result holder */\r
+    result = PyTuple_New(tuplesize);\r
+    if (result == NULL) {\r
+        Py_DECREF(ittuple);\r
+        return NULL;\r
+    }\r
+    for (i=0 ; i < tuplesize ; i++) {\r
+        Py_INCREF(Py_None);\r
+        PyTuple_SET_ITEM(result, i, Py_None);\r
+    }\r
+\r
+    /* create iziplongestobject structure */\r
+    lz = (iziplongestobject *)type->tp_alloc(type, 0);\r
+    if (lz == NULL) {\r
+        Py_DECREF(ittuple);\r
+        Py_DECREF(result);\r
+        return NULL;\r
+    }\r
+    lz->ittuple = ittuple;\r
+    lz->tuplesize = tuplesize;\r
+    lz->numactive = tuplesize;\r
+    lz->result = result;\r
+    Py_INCREF(fillvalue);\r
+    lz->fillvalue = fillvalue;\r
+    return (PyObject *)lz;\r
+}\r
+\r
+static void\r
+izip_longest_dealloc(iziplongestobject *lz)\r
+{\r
+    PyObject_GC_UnTrack(lz);\r
+    Py_XDECREF(lz->ittuple);\r
+    Py_XDECREF(lz->result);\r
+    Py_XDECREF(lz->fillvalue);\r
+    Py_TYPE(lz)->tp_free(lz);\r
+}\r
+\r
+static int\r
+izip_longest_traverse(iziplongestobject *lz, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(lz->ittuple);\r
+    Py_VISIT(lz->result);\r
+    Py_VISIT(lz->fillvalue);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+izip_longest_next(iziplongestobject *lz)\r
+{\r
+    Py_ssize_t i;\r
+    Py_ssize_t tuplesize = lz->tuplesize;\r
+    PyObject *result = lz->result;\r
+    PyObject *it;\r
+    PyObject *item;\r
+    PyObject *olditem;\r
+\r
+    if (tuplesize == 0)\r
+        return NULL;\r
+    if (lz->numactive == 0)\r
+        return NULL;\r
+    if (Py_REFCNT(result) == 1) {\r
+        Py_INCREF(result);\r
+        for (i=0 ; i < tuplesize ; i++) {\r
+            it = PyTuple_GET_ITEM(lz->ittuple, i);\r
+            if (it == NULL) {\r
+                Py_INCREF(lz->fillvalue);\r
+                item = lz->fillvalue;\r
+            } else {\r
+                item = PyIter_Next(it);\r
+                if (item == NULL) {\r
+                    lz->numactive -= 1;\r
+                    if (lz->numactive == 0 || PyErr_Occurred()) {\r
+                        lz->numactive = 0;\r
+                        Py_DECREF(result);\r
+                        return NULL;\r
+                    } else {\r
+                        Py_INCREF(lz->fillvalue);\r
+                        item = lz->fillvalue;\r
+                        PyTuple_SET_ITEM(lz->ittuple, i, NULL);\r
+                        Py_DECREF(it);\r
+                    }\r
+                }\r
+            }\r
+            olditem = PyTuple_GET_ITEM(result, i);\r
+            PyTuple_SET_ITEM(result, i, item);\r
+            Py_DECREF(olditem);\r
+        }\r
+    } else {\r
+        result = PyTuple_New(tuplesize);\r
+        if (result == NULL)\r
+            return NULL;\r
+        for (i=0 ; i < tuplesize ; i++) {\r
+            it = PyTuple_GET_ITEM(lz->ittuple, i);\r
+            if (it == NULL) {\r
+                Py_INCREF(lz->fillvalue);\r
+                item = lz->fillvalue;\r
+            } else {\r
+                item = PyIter_Next(it);\r
+                if (item == NULL) {\r
+                    lz->numactive -= 1;\r
+                    if (lz->numactive == 0 || PyErr_Occurred()) {\r
+                        lz->numactive = 0;\r
+                        Py_DECREF(result);\r
+                        return NULL;\r
+                    } else {\r
+                        Py_INCREF(lz->fillvalue);\r
+                        item = lz->fillvalue;\r
+                        PyTuple_SET_ITEM(lz->ittuple, i, NULL);\r
+                        Py_DECREF(it);\r
+                    }\r
+                }\r
+            }\r
+            PyTuple_SET_ITEM(result, i, item);\r
+        }\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(izip_longest_doc,\r
+"izip_longest(iter1 [,iter2 [...]], [fillvalue=None]) --> izip_longest object\n\\r
+\n\\r
+Return an izip_longest object whose .next() method returns a tuple where\n\\r
+the i-th element comes from the i-th iterable argument.  The .next()\n\\r
+method continues until the longest iterable in the argument sequence\n\\r
+is exhausted and then it raises StopIteration.  When the shorter iterables\n\\r
+are exhausted, the fillvalue is substituted in their place.  The fillvalue\n\\r
+defaults to None or can be specified by a keyword argument.\n\\r
+");\r
+\r
+static PyTypeObject iziplongest_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "itertools.izip_longest",           /* tp_name */\r
+    sizeof(iziplongestobject),          /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)izip_longest_dealloc,           /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    0,                                  /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC |\r
+        Py_TPFLAGS_BASETYPE,            /* tp_flags */\r
+    izip_longest_doc,                           /* tp_doc */\r
+    (traverseproc)izip_longest_traverse,    /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    PyObject_SelfIter,                  /* tp_iter */\r
+    (iternextfunc)izip_longest_next,            /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    izip_longest_new,                           /* tp_new */\r
+    PyObject_GC_Del,                    /* tp_free */\r
+};\r
+\r
+/* module level code ********************************************************/\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"Functional tools for creating and using iterators.\n\\r
+\n\\r
+Infinite iterators:\n\\r
+count([n]) --> n, n+1, n+2, ...\n\\r
+cycle(p) --> p0, p1, ... plast, p0, p1, ...\n\\r
+repeat(elem [,n]) --> elem, elem, elem, ... endlessly or up to n times\n\\r
+\n\\r
+Iterators terminating on the shortest input sequence:\n\\r
+chain(p, q, ...) --> p0, p1, ... plast, q0, q1, ... \n\\r
+compress(data, selectors) --> (d[0] if s[0]), (d[1] if s[1]), ...\n\\r
+dropwhile(pred, seq) --> seq[n], seq[n+1], starting when pred fails\n\\r
+groupby(iterable[, keyfunc]) --> sub-iterators grouped by value of keyfunc(v)\n\\r
+ifilter(pred, seq) --> elements of seq where pred(elem) is True\n\\r
+ifilterfalse(pred, seq) --> elements of seq where pred(elem) is False\n\\r
+islice(seq, [start,] stop [, step]) --> elements from\n\\r
+       seq[start:stop:step]\n\\r
+imap(fun, p, q, ...) --> fun(p0, q0), fun(p1, q1), ...\n\\r
+starmap(fun, seq) --> fun(*seq[0]), fun(*seq[1]), ...\n\\r
+tee(it, n=2) --> (it1, it2 , ... itn) splits one iterator into n\n\\r
+takewhile(pred, seq) --> seq[0], seq[1], until pred fails\n\\r
+izip(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\\r
+izip_longest(p, q, ...) --> (p[0], q[0]), (p[1], q[1]), ... \n\\r
+\n\\r
+Combinatoric generators:\n\\r
+product(p, q, ... [repeat=1]) --> cartesian product\n\\r
+permutations(p[, r])\n\\r
+combinations(p, r)\n\\r
+combinations_with_replacement(p, r)\n\\r
+");\r
+\r
+\r
+static PyMethodDef module_methods[] = {\r
+    {"tee",     (PyCFunction)tee,       METH_VARARGS, tee_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+inititertools(void)\r
+{\r
+    int i;\r
+    PyObject *m;\r
+    char *name;\r
+    PyTypeObject *typelist[] = {\r
+        &combinations_type,\r
+        &cwr_type,\r
+        &cycle_type,\r
+        &dropwhile_type,\r
+        &takewhile_type,\r
+        &islice_type,\r
+        &starmap_type,\r
+        &imap_type,\r
+        &chain_type,\r
+        &compress_type,\r
+        &ifilter_type,\r
+        &ifilterfalse_type,\r
+        &count_type,\r
+        &izip_type,\r
+        &iziplongest_type,\r
+        &permutations_type,\r
+        &product_type,\r
+        &repeat_type,\r
+        &groupby_type,\r
+        NULL\r
+    };\r
+\r
+    Py_TYPE(&teedataobject_type) = &PyType_Type;\r
+    m = Py_InitModule3("itertools", module_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    for (i=0 ; typelist[i] != NULL ; i++) {\r
+        if (PyType_Ready(typelist[i]) < 0)\r
+            return;\r
+        name = strchr(typelist[i]->tp_name, '.');\r
+        assert (name != NULL);\r
+        Py_INCREF(typelist[i]);\r
+        PyModule_AddObject(m, name+1, (PyObject *)typelist[i]);\r
+    }\r
+\r
+    if (PyType_Ready(&teedataobject_type) < 0)\r
+        return;\r
+    if (PyType_Ready(&tee_type) < 0)\r
+        return;\r
+    if (PyType_Ready(&_grouper_type) < 0)\r
+        return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/mathmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/mathmodule.c
new file mode 100644 (file)
index 0000000..99dcf39
--- /dev/null
@@ -0,0 +1,1634 @@
+/* Math module -- standard C math library functions, pi and e */\r
+\r
+/* Here are some comments from Tim Peters, extracted from the\r
+   discussion attached to http://bugs.python.org/issue1640.  They\r
+   describe the general aims of the math module with respect to\r
+   special values, IEEE-754 floating-point exceptions, and Python\r
+   exceptions.\r
+\r
+These are the "spirit of 754" rules:\r
+\r
+1. If the mathematical result is a real number, but of magnitude too\r
+large to approximate by a machine float, overflow is signaled and the\r
+result is an infinity (with the appropriate sign).\r
+\r
+2. If the mathematical result is a real number, but of magnitude too\r
+small to approximate by a machine float, underflow is signaled and the\r
+result is a zero (with the appropriate sign).\r
+\r
+3. At a singularity (a value x such that the limit of f(y) as y\r
+approaches x exists and is an infinity), "divide by zero" is signaled\r
+and the result is an infinity (with the appropriate sign).  This is\r
+complicated a little by that the left-side and right-side limits may\r
+not be the same; e.g., 1/x approaches +inf or -inf as x approaches 0\r
+from the positive or negative directions.  In that specific case, the\r
+sign of the zero determines the result of 1/0.\r
+\r
+4. At a point where a function has no defined result in the extended\r
+reals (i.e., the reals plus an infinity or two), invalid operation is\r
+signaled and a NaN is returned.\r
+\r
+And these are what Python has historically /tried/ to do (but not\r
+always successfully, as platform libm behavior varies a lot):\r
+\r
+For #1, raise OverflowError.\r
+\r
+For #2, return a zero (with the appropriate sign if that happens by\r
+accident ;-)).\r
+\r
+For #3 and #4, raise ValueError.  It may have made sense to raise\r
+Python's ZeroDivisionError in #3, but historically that's only been\r
+raised for division by zero and mod by zero.\r
+\r
+*/\r
+\r
+/*\r
+   In general, on an IEEE-754 platform the aim is to follow the C99\r
+   standard, including Annex 'F', whenever possible.  Where the\r
+   standard recommends raising the 'divide-by-zero' or 'invalid'\r
+   floating-point exceptions, Python should raise a ValueError.  Where\r
+   the standard recommends raising 'overflow', Python should raise an\r
+   OverflowError.  In all other circumstances a value should be\r
+   returned.\r
+ */\r
+\r
+#include "Python.h"\r
+#include "_math.h"\r
+\r
+#ifdef _OSF_SOURCE\r
+/* OSF1 5.1 doesn't make this available with XOPEN_SOURCE_EXTENDED defined */\r
+extern double copysign(double, double);\r
+#endif\r
+\r
+/*\r
+   sin(pi*x), giving accurate results for all finite x (especially x\r
+   integral or close to an integer).  This is here for use in the\r
+   reflection formula for the gamma function.  It conforms to IEEE\r
+   754-2008 for finite arguments, but not for infinities or nans.\r
+*/\r
+\r
+static const double pi = 3.141592653589793238462643383279502884197;\r
+static const double sqrtpi = 1.772453850905516027298167483341145182798;\r
+\r
+static double\r
+sinpi(double x)\r
+{\r
+    double y, r;\r
+    int n;\r
+    /* this function should only ever be called for finite arguments */\r
+    assert(Py_IS_FINITE(x));\r
+    y = fmod(fabs(x), 2.0);\r
+    n = (int)round(2.0*y);\r
+    assert(0 <= n && n <= 4);\r
+    switch (n) {\r
+    case 0:\r
+        r = sin(pi*y);\r
+        break;\r
+    case 1:\r
+        r = cos(pi*(y-0.5));\r
+        break;\r
+    case 2:\r
+        /* N.B. -sin(pi*(y-1.0)) is *not* equivalent: it would give\r
+           -0.0 instead of 0.0 when y == 1.0. */\r
+        r = sin(pi*(1.0-y));\r
+        break;\r
+    case 3:\r
+        r = -cos(pi*(y-1.5));\r
+        break;\r
+    case 4:\r
+        r = sin(pi*(y-2.0));\r
+        break;\r
+    default:\r
+        assert(0);  /* should never get here */\r
+        r = -1.23e200; /* silence gcc warning */\r
+    }\r
+    return copysign(1.0, x)*r;\r
+}\r
+\r
+/* Implementation of the real gamma function.  In extensive but non-exhaustive\r
+   random tests, this function proved accurate to within <= 10 ulps across the\r
+   entire float domain.  Note that accuracy may depend on the quality of the\r
+   system math functions, the pow function in particular.  Special cases\r
+   follow C99 annex F.  The parameters and method are tailored to platforms\r
+   whose double format is the IEEE 754 binary64 format.\r
+\r
+   Method: for x > 0.0 we use the Lanczos approximation with parameters N=13\r
+   and g=6.024680040776729583740234375; these parameters are amongst those\r
+   used by the Boost library.  Following Boost (again), we re-express the\r
+   Lanczos sum as a rational function, and compute it that way.  The\r
+   coefficients below were computed independently using MPFR, and have been\r
+   double-checked against the coefficients in the Boost source code.\r
+\r
+   For x < 0.0 we use the reflection formula.\r
+\r
+   There's one minor tweak that deserves explanation: Lanczos' formula for\r
+   Gamma(x) involves computing pow(x+g-0.5, x-0.5) / exp(x+g-0.5).  For many x\r
+   values, x+g-0.5 can be represented exactly.  However, in cases where it\r
+   can't be represented exactly the small error in x+g-0.5 can be magnified\r
+   significantly by the pow and exp calls, especially for large x.  A cheap\r
+   correction is to multiply by (1 + e*g/(x+g-0.5)), where e is the error\r
+   involved in the computation of x+g-0.5 (that is, e = computed value of\r
+   x+g-0.5 - exact value of x+g-0.5).  Here's the proof:\r
+\r
+   Correction factor\r
+   -----------------\r
+   Write x+g-0.5 = y-e, where y is exactly representable as an IEEE 754\r
+   double, and e is tiny.  Then:\r
+\r
+     pow(x+g-0.5,x-0.5)/exp(x+g-0.5) = pow(y-e, x-0.5)/exp(y-e)\r
+     = pow(y, x-0.5)/exp(y) * C,\r
+\r
+   where the correction_factor C is given by\r
+\r
+     C = pow(1-e/y, x-0.5) * exp(e)\r
+\r
+   Since e is tiny, pow(1-e/y, x-0.5) ~ 1-(x-0.5)*e/y, and exp(x) ~ 1+e, so:\r
+\r
+     C ~ (1-(x-0.5)*e/y) * (1+e) ~ 1 + e*(y-(x-0.5))/y\r
+\r
+   But y-(x-0.5) = g+e, and g+e ~ g.  So we get C ~ 1 + e*g/y, and\r
+\r
+     pow(x+g-0.5,x-0.5)/exp(x+g-0.5) ~ pow(y, x-0.5)/exp(y) * (1 + e*g/y),\r
+\r
+   Note that for accuracy, when computing r*C it's better to do\r
+\r
+     r + e*g/y*r;\r
+\r
+   than\r
+\r
+     r * (1 + e*g/y);\r
+\r
+   since the addition in the latter throws away most of the bits of\r
+   information in e*g/y.\r
+*/\r
+\r
+#define LANCZOS_N 13\r
+static const double lanczos_g = 6.024680040776729583740234375;\r
+static const double lanczos_g_minus_half = 5.524680040776729583740234375;\r
+static const double lanczos_num_coeffs[LANCZOS_N] = {\r
+    23531376880.410759688572007674451636754734846804940,\r
+    42919803642.649098768957899047001988850926355848959,\r
+    35711959237.355668049440185451547166705960488635843,\r
+    17921034426.037209699919755754458931112671403265390,\r
+    6039542586.3520280050642916443072979210699388420708,\r
+    1439720407.3117216736632230727949123939715485786772,\r
+    248874557.86205415651146038641322942321632125127801,\r
+    31426415.585400194380614231628318205362874684987640,\r
+    2876370.6289353724412254090516208496135991145378768,\r
+    186056.26539522349504029498971604569928220784236328,\r
+    8071.6720023658162106380029022722506138218516325024,\r
+    210.82427775157934587250973392071336271166969580291,\r
+    2.5066282746310002701649081771338373386264310793408\r
+};\r
+\r
+/* denominator is x*(x+1)*...*(x+LANCZOS_N-2) */\r
+static const double lanczos_den_coeffs[LANCZOS_N] = {\r
+    0.0, 39916800.0, 120543840.0, 150917976.0, 105258076.0, 45995730.0,\r
+    13339535.0, 2637558.0, 357423.0, 32670.0, 1925.0, 66.0, 1.0};\r
+\r
+/* gamma values for small positive integers, 1 though NGAMMA_INTEGRAL */\r
+#define NGAMMA_INTEGRAL 23\r
+static const double gamma_integral[NGAMMA_INTEGRAL] = {\r
+    1.0, 1.0, 2.0, 6.0, 24.0, 120.0, 720.0, 5040.0, 40320.0, 362880.0,\r
+    3628800.0, 39916800.0, 479001600.0, 6227020800.0, 87178291200.0,\r
+    1307674368000.0, 20922789888000.0, 355687428096000.0,\r
+    6402373705728000.0, 121645100408832000.0, 2432902008176640000.0,\r
+    51090942171709440000.0, 1124000727777607680000.0,\r
+};\r
+\r
+/* Lanczos' sum L_g(x), for positive x */\r
+\r
+static double\r
+lanczos_sum(double x)\r
+{\r
+    double num = 0.0, den = 0.0;\r
+    int i;\r
+    assert(x > 0.0);\r
+    /* evaluate the rational function lanczos_sum(x).  For large\r
+       x, the obvious algorithm risks overflow, so we instead\r
+       rescale the denominator and numerator of the rational\r
+       function by x**(1-LANCZOS_N) and treat this as a\r
+       rational function in 1/x.  This also reduces the error for\r
+       larger x values.  The choice of cutoff point (5.0 below) is\r
+       somewhat arbitrary; in tests, smaller cutoff values than\r
+       this resulted in lower accuracy. */\r
+    if (x < 5.0) {\r
+        for (i = LANCZOS_N; --i >= 0; ) {\r
+            num = num * x + lanczos_num_coeffs[i];\r
+            den = den * x + lanczos_den_coeffs[i];\r
+        }\r
+    }\r
+    else {\r
+        for (i = 0; i < LANCZOS_N; i++) {\r
+            num = num / x + lanczos_num_coeffs[i];\r
+            den = den / x + lanczos_den_coeffs[i];\r
+        }\r
+    }\r
+    return num/den;\r
+}\r
+\r
+static double\r
+m_tgamma(double x)\r
+{\r
+    double absx, r, y, z, sqrtpow;\r
+\r
+    /* special cases */\r
+    if (!Py_IS_FINITE(x)) {\r
+        if (Py_IS_NAN(x) || x > 0.0)\r
+            return x;  /* tgamma(nan) = nan, tgamma(inf) = inf */\r
+        else {\r
+            errno = EDOM;\r
+            return Py_NAN;  /* tgamma(-inf) = nan, invalid */\r
+        }\r
+    }\r
+    if (x == 0.0) {\r
+        errno = EDOM;\r
+        return 1.0/x; /* tgamma(+-0.0) = +-inf, divide-by-zero */\r
+    }\r
+\r
+    /* integer arguments */\r
+    if (x == floor(x)) {\r
+        if (x < 0.0) {\r
+            errno = EDOM;  /* tgamma(n) = nan, invalid for */\r
+            return Py_NAN; /* negative integers n */\r
+        }\r
+        if (x <= NGAMMA_INTEGRAL)\r
+            return gamma_integral[(int)x - 1];\r
+    }\r
+    absx = fabs(x);\r
+\r
+    /* tiny arguments:  tgamma(x) ~ 1/x for x near 0 */\r
+    if (absx < 1e-20) {\r
+        r = 1.0/x;\r
+        if (Py_IS_INFINITY(r))\r
+            errno = ERANGE;\r
+        return r;\r
+    }\r
+\r
+    /* large arguments: assuming IEEE 754 doubles, tgamma(x) overflows for\r
+       x > 200, and underflows to +-0.0 for x < -200, not a negative\r
+       integer. */\r
+    if (absx > 200.0) {\r
+        if (x < 0.0) {\r
+            return 0.0/sinpi(x);\r
+        }\r
+        else {\r
+            errno = ERANGE;\r
+            return Py_HUGE_VAL;\r
+        }\r
+    }\r
+\r
+    y = absx + lanczos_g_minus_half;\r
+    /* compute error in sum */\r
+    if (absx > lanczos_g_minus_half) {\r
+        /* note: the correction can be foiled by an optimizing\r
+           compiler that (incorrectly) thinks that an expression like\r
+           a + b - a - b can be optimized to 0.0.  This shouldn't\r
+           happen in a standards-conforming compiler. */\r
+        double q = y - absx;\r
+        z = q - lanczos_g_minus_half;\r
+    }\r
+    else {\r
+        double q = y - lanczos_g_minus_half;\r
+        z = q - absx;\r
+    }\r
+    z = z * lanczos_g / y;\r
+    if (x < 0.0) {\r
+        r = -pi / sinpi(absx) / absx * exp(y) / lanczos_sum(absx);\r
+        r -= z * r;\r
+        if (absx < 140.0) {\r
+            r /= pow(y, absx - 0.5);\r
+        }\r
+        else {\r
+            sqrtpow = pow(y, absx / 2.0 - 0.25);\r
+            r /= sqrtpow;\r
+            r /= sqrtpow;\r
+        }\r
+    }\r
+    else {\r
+        r = lanczos_sum(absx) / exp(y);\r
+        r += z * r;\r
+        if (absx < 140.0) {\r
+            r *= pow(y, absx - 0.5);\r
+        }\r
+        else {\r
+            sqrtpow = pow(y, absx / 2.0 - 0.25);\r
+            r *= sqrtpow;\r
+            r *= sqrtpow;\r
+        }\r
+    }\r
+    if (Py_IS_INFINITY(r))\r
+        errno = ERANGE;\r
+    return r;\r
+}\r
+\r
+/*\r
+   lgamma:  natural log of the absolute value of the Gamma function.\r
+   For large arguments, Lanczos' formula works extremely well here.\r
+*/\r
+\r
+static double\r
+m_lgamma(double x)\r
+{\r
+    double r, absx;\r
+\r
+    /* special cases */\r
+    if (!Py_IS_FINITE(x)) {\r
+        if (Py_IS_NAN(x))\r
+            return x;  /* lgamma(nan) = nan */\r
+        else\r
+            return Py_HUGE_VAL; /* lgamma(+-inf) = +inf */\r
+    }\r
+\r
+    /* integer arguments */\r
+    if (x == floor(x) && x <= 2.0) {\r
+        if (x <= 0.0) {\r
+            errno = EDOM;  /* lgamma(n) = inf, divide-by-zero for */\r
+            return Py_HUGE_VAL; /* integers n <= 0 */\r
+        }\r
+        else {\r
+            return 0.0; /* lgamma(1) = lgamma(2) = 0.0 */\r
+        }\r
+    }\r
+\r
+    absx = fabs(x);\r
+    /* tiny arguments: lgamma(x) ~ -log(fabs(x)) for small x */\r
+    if (absx < 1e-20)\r
+        return -log(absx);\r
+\r
+    /* Lanczos' formula */\r
+    if (x > 0.0) {\r
+        /* we could save a fraction of a ulp in accuracy by having a\r
+           second set of numerator coefficients for lanczos_sum that\r
+           absorbed the exp(-lanczos_g) term, and throwing out the\r
+           lanczos_g subtraction below; it's probably not worth it. */\r
+        r = log(lanczos_sum(x)) - lanczos_g +\r
+            (x-0.5)*(log(x+lanczos_g-0.5)-1);\r
+    }\r
+    else {\r
+        r = log(pi) - log(fabs(sinpi(absx))) - log(absx) -\r
+            (log(lanczos_sum(absx)) - lanczos_g +\r
+             (absx-0.5)*(log(absx+lanczos_g-0.5)-1));\r
+    }\r
+    if (Py_IS_INFINITY(r))\r
+        errno = ERANGE;\r
+    return r;\r
+}\r
+\r
+/*\r
+   Implementations of the error function erf(x) and the complementary error\r
+   function erfc(x).\r
+\r
+   Method: following 'Numerical Recipes' by Flannery, Press et. al. (2nd ed.,\r
+   Cambridge University Press), we use a series approximation for erf for\r
+   small x, and a continued fraction approximation for erfc(x) for larger x;\r
+   combined with the relations erf(-x) = -erf(x) and erfc(x) = 1.0 - erf(x),\r
+   this gives us erf(x) and erfc(x) for all x.\r
+\r
+   The series expansion used is:\r
+\r
+      erf(x) = x*exp(-x*x)/sqrt(pi) * [\r
+                     2/1 + 4/3 x**2 + 8/15 x**4 + 16/105 x**6 + ...]\r
+\r
+   The coefficient of x**(2k-2) here is 4**k*factorial(k)/factorial(2*k).\r
+   This series converges well for smallish x, but slowly for larger x.\r
+\r
+   The continued fraction expansion used is:\r
+\r
+      erfc(x) = x*exp(-x*x)/sqrt(pi) * [1/(0.5 + x**2 -) 0.5/(2.5 + x**2 - )\r
+                              3.0/(4.5 + x**2 - ) 7.5/(6.5 + x**2 - ) ...]\r
+\r
+   after the first term, the general term has the form:\r
+\r
+      k*(k-0.5)/(2*k+0.5 + x**2 - ...).\r
+\r
+   This expansion converges fast for larger x, but convergence becomes\r
+   infinitely slow as x approaches 0.0.  The (somewhat naive) continued\r
+   fraction evaluation algorithm used below also risks overflow for large x;\r
+   but for large x, erfc(x) == 0.0 to within machine precision.  (For\r
+   example, erfc(30.0) is approximately 2.56e-393).\r
+\r
+   Parameters: use series expansion for abs(x) < ERF_SERIES_CUTOFF and\r
+   continued fraction expansion for ERF_SERIES_CUTOFF <= abs(x) <\r
+   ERFC_CONTFRAC_CUTOFF.  ERFC_SERIES_TERMS and ERFC_CONTFRAC_TERMS are the\r
+   numbers of terms to use for the relevant expansions.  */\r
+\r
+#define ERF_SERIES_CUTOFF 1.5\r
+#define ERF_SERIES_TERMS 25\r
+#define ERFC_CONTFRAC_CUTOFF 30.0\r
+#define ERFC_CONTFRAC_TERMS 50\r
+\r
+/*\r
+   Error function, via power series.\r
+\r
+   Given a finite float x, return an approximation to erf(x).\r
+   Converges reasonably fast for small x.\r
+*/\r
+\r
+static double\r
+m_erf_series(double x)\r
+{\r
+    double x2, acc, fk, result;\r
+    int i, saved_errno;\r
+\r
+    x2 = x * x;\r
+    acc = 0.0;\r
+    fk = (double)ERF_SERIES_TERMS + 0.5;\r
+    for (i = 0; i < ERF_SERIES_TERMS; i++) {\r
+        acc = 2.0 + x2 * acc / fk;\r
+        fk -= 1.0;\r
+    }\r
+    /* Make sure the exp call doesn't affect errno;\r
+       see m_erfc_contfrac for more. */\r
+    saved_errno = errno;\r
+    result = acc * x * exp(-x2) / sqrtpi;\r
+    errno = saved_errno;\r
+    return result;\r
+}\r
+\r
+/*\r
+   Complementary error function, via continued fraction expansion.\r
+\r
+   Given a positive float x, return an approximation to erfc(x).  Converges\r
+   reasonably fast for x large (say, x > 2.0), and should be safe from\r
+   overflow if x and nterms are not too large.  On an IEEE 754 machine, with x\r
+   <= 30.0, we're safe up to nterms = 100.  For x >= 30.0, erfc(x) is smaller\r
+   than the smallest representable nonzero float.  */\r
+\r
+static double\r
+m_erfc_contfrac(double x)\r
+{\r
+    double x2, a, da, p, p_last, q, q_last, b, result;\r
+    int i, saved_errno;\r
+\r
+    if (x >= ERFC_CONTFRAC_CUTOFF)\r
+        return 0.0;\r
+\r
+    x2 = x*x;\r
+    a = 0.0;\r
+    da = 0.5;\r
+    p = 1.0; p_last = 0.0;\r
+    q = da + x2; q_last = 1.0;\r
+    for (i = 0; i < ERFC_CONTFRAC_TERMS; i++) {\r
+        double temp;\r
+        a += da;\r
+        da += 2.0;\r
+        b = da + x2;\r
+        temp = p; p = b*p - a*p_last; p_last = temp;\r
+        temp = q; q = b*q - a*q_last; q_last = temp;\r
+    }\r
+    /* Issue #8986: On some platforms, exp sets errno on underflow to zero;\r
+       save the current errno value so that we can restore it later. */\r
+    saved_errno = errno;\r
+    result = p / q * x * exp(-x2) / sqrtpi;\r
+    errno = saved_errno;\r
+    return result;\r
+}\r
+\r
+/* Error function erf(x), for general x */\r
+\r
+static double\r
+m_erf(double x)\r
+{\r
+    double absx, cf;\r
+\r
+    if (Py_IS_NAN(x))\r
+        return x;\r
+    absx = fabs(x);\r
+    if (absx < ERF_SERIES_CUTOFF)\r
+        return m_erf_series(x);\r
+    else {\r
+        cf = m_erfc_contfrac(absx);\r
+        return x > 0.0 ? 1.0 - cf : cf - 1.0;\r
+    }\r
+}\r
+\r
+/* Complementary error function erfc(x), for general x. */\r
+\r
+static double\r
+m_erfc(double x)\r
+{\r
+    double absx, cf;\r
+\r
+    if (Py_IS_NAN(x))\r
+        return x;\r
+    absx = fabs(x);\r
+    if (absx < ERF_SERIES_CUTOFF)\r
+        return 1.0 - m_erf_series(x);\r
+    else {\r
+        cf = m_erfc_contfrac(absx);\r
+        return x > 0.0 ? cf : 2.0 - cf;\r
+    }\r
+}\r
+\r
+/*\r
+   wrapper for atan2 that deals directly with special cases before\r
+   delegating to the platform libm for the remaining cases.  This\r
+   is necessary to get consistent behaviour across platforms.\r
+   Windows, FreeBSD and alpha Tru64 are amongst platforms that don't\r
+   always follow C99.\r
+*/\r
+\r
+static double\r
+m_atan2(double y, double x)\r
+{\r
+    if (Py_IS_NAN(x) || Py_IS_NAN(y))\r
+        return Py_NAN;\r
+    if (Py_IS_INFINITY(y)) {\r
+        if (Py_IS_INFINITY(x)) {\r
+            if (copysign(1., x) == 1.)\r
+                /* atan2(+-inf, +inf) == +-pi/4 */\r
+                return copysign(0.25*Py_MATH_PI, y);\r
+            else\r
+                /* atan2(+-inf, -inf) == +-pi*3/4 */\r
+                return copysign(0.75*Py_MATH_PI, y);\r
+        }\r
+        /* atan2(+-inf, x) == +-pi/2 for finite x */\r
+        return copysign(0.5*Py_MATH_PI, y);\r
+    }\r
+    if (Py_IS_INFINITY(x) || y == 0.) {\r
+        if (copysign(1., x) == 1.)\r
+            /* atan2(+-y, +inf) = atan2(+-0, +x) = +-0. */\r
+            return copysign(0., y);\r
+        else\r
+            /* atan2(+-y, -inf) = atan2(+-0., -x) = +-pi. */\r
+            return copysign(Py_MATH_PI, y);\r
+    }\r
+    return atan2(y, x);\r
+}\r
+\r
+/*\r
+    Various platforms (Solaris, OpenBSD) do nonstandard things for log(0),\r
+    log(-ve), log(NaN).  Here are wrappers for log and log10 that deal with\r
+    special values directly, passing positive non-special values through to\r
+    the system log/log10.\r
+ */\r
+\r
+static double\r
+m_log(double x)\r
+{\r
+    if (Py_IS_FINITE(x)) {\r
+        if (x > 0.0)\r
+            return log(x);\r
+        errno = EDOM;\r
+        if (x == 0.0)\r
+            return -Py_HUGE_VAL; /* log(0) = -inf */\r
+        else\r
+            return Py_NAN; /* log(-ve) = nan */\r
+    }\r
+    else if (Py_IS_NAN(x))\r
+        return x; /* log(nan) = nan */\r
+    else if (x > 0.0)\r
+        return x; /* log(inf) = inf */\r
+    else {\r
+        errno = EDOM;\r
+        return Py_NAN; /* log(-inf) = nan */\r
+    }\r
+}\r
+\r
+static double\r
+m_log10(double x)\r
+{\r
+    if (Py_IS_FINITE(x)) {\r
+        if (x > 0.0)\r
+            return log10(x);\r
+        errno = EDOM;\r
+        if (x == 0.0)\r
+            return -Py_HUGE_VAL; /* log10(0) = -inf */\r
+        else\r
+            return Py_NAN; /* log10(-ve) = nan */\r
+    }\r
+    else if (Py_IS_NAN(x))\r
+        return x; /* log10(nan) = nan */\r
+    else if (x > 0.0)\r
+        return x; /* log10(inf) = inf */\r
+    else {\r
+        errno = EDOM;\r
+        return Py_NAN; /* log10(-inf) = nan */\r
+    }\r
+}\r
+\r
+\r
+/* Call is_error when errno != 0, and where x is the result libm\r
+ * returned.  is_error will usually set up an exception and return\r
+ * true (1), but may return false (0) without setting up an exception.\r
+ */\r
+static int\r
+is_error(double x)\r
+{\r
+    int result = 1;     /* presumption of guilt */\r
+    assert(errno);      /* non-zero errno is a precondition for calling */\r
+    if (errno == EDOM)\r
+        PyErr_SetString(PyExc_ValueError, "math domain error");\r
+\r
+    else if (errno == ERANGE) {\r
+        /* ANSI C generally requires libm functions to set ERANGE\r
+         * on overflow, but also generally *allows* them to set\r
+         * ERANGE on underflow too.  There's no consistency about\r
+         * the latter across platforms.\r
+         * Alas, C99 never requires that errno be set.\r
+         * Here we suppress the underflow errors (libm functions\r
+         * should return a zero on underflow, and +- HUGE_VAL on\r
+         * overflow, so testing the result for zero suffices to\r
+         * distinguish the cases).\r
+         *\r
+         * On some platforms (Ubuntu/ia64) it seems that errno can be\r
+         * set to ERANGE for subnormal results that do *not* underflow\r
+         * to zero.  So to be safe, we'll ignore ERANGE whenever the\r
+         * function result is less than one in absolute value.\r
+         */\r
+        if (fabs(x) < 1.0)\r
+            result = 0;\r
+        else\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                            "math range error");\r
+    }\r
+    else\r
+        /* Unexpected math error */\r
+        PyErr_SetFromErrno(PyExc_ValueError);\r
+    return result;\r
+}\r
+\r
+/*\r
+   math_1 is used to wrap a libm function f that takes a double\r
+   arguments and returns a double.\r
+\r
+   The error reporting follows these rules, which are designed to do\r
+   the right thing on C89/C99 platforms and IEEE 754/non IEEE 754\r
+   platforms.\r
+\r
+   - a NaN result from non-NaN inputs causes ValueError to be raised\r
+   - an infinite result from finite inputs causes OverflowError to be\r
+     raised if can_overflow is 1, or raises ValueError if can_overflow\r
+     is 0.\r
+   - if the result is finite and errno == EDOM then ValueError is\r
+     raised\r
+   - if the result is finite and nonzero and errno == ERANGE then\r
+     OverflowError is raised\r
+\r
+   The last rule is used to catch overflow on platforms which follow\r
+   C89 but for which HUGE_VAL is not an infinity.\r
+\r
+   For the majority of one-argument functions these rules are enough\r
+   to ensure that Python's functions behave as specified in 'Annex F'\r
+   of the C99 standard, with the 'invalid' and 'divide-by-zero'\r
+   floating-point exceptions mapping to Python's ValueError and the\r
+   'overflow' floating-point exception mapping to OverflowError.\r
+   math_1 only works for functions that don't have singularities *and*\r
+   the possibility of overflow; fortunately, that covers everything we\r
+   care about right now.\r
+*/\r
+\r
+static PyObject *\r
+math_1(PyObject *arg, double (*func) (double), int can_overflow)\r
+{\r
+    double x, r;\r
+    x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_1", return 0);\r
+    r = (*func)(x);\r
+    PyFPE_END_PROTECT(r);\r
+    if (Py_IS_NAN(r)) {\r
+        if (!Py_IS_NAN(x))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    else if (Py_IS_INFINITY(r)) {\r
+        if (Py_IS_FINITE(x))\r
+            errno = can_overflow ? ERANGE : EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    else\r
+        return PyFloat_FromDouble(r);\r
+}\r
+\r
+/* variant of math_1, to be used when the function being wrapped is known to\r
+   set errno properly (that is, errno = EDOM for invalid or divide-by-zero,\r
+   errno = ERANGE for overflow). */\r
+\r
+static PyObject *\r
+math_1a(PyObject *arg, double (*func) (double))\r
+{\r
+    double x, r;\r
+    x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_1a", return 0);\r
+    r = (*func)(x);\r
+    PyFPE_END_PROTECT(r);\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    return PyFloat_FromDouble(r);\r
+}\r
+\r
+/*\r
+   math_2 is used to wrap a libm function f that takes two double\r
+   arguments and returns a double.\r
+\r
+   The error reporting follows these rules, which are designed to do\r
+   the right thing on C89/C99 platforms and IEEE 754/non IEEE 754\r
+   platforms.\r
+\r
+   - a NaN result from non-NaN inputs causes ValueError to be raised\r
+   - an infinite result from finite inputs causes OverflowError to be\r
+     raised.\r
+   - if the result is finite and errno == EDOM then ValueError is\r
+     raised\r
+   - if the result is finite and nonzero and errno == ERANGE then\r
+     OverflowError is raised\r
+\r
+   The last rule is used to catch overflow on platforms which follow\r
+   C89 but for which HUGE_VAL is not an infinity.\r
+\r
+   For most two-argument functions (copysign, fmod, hypot, atan2)\r
+   these rules are enough to ensure that Python's functions behave as\r
+   specified in 'Annex F' of the C99 standard, with the 'invalid' and\r
+   'divide-by-zero' floating-point exceptions mapping to Python's\r
+   ValueError and the 'overflow' floating-point exception mapping to\r
+   OverflowError.\r
+*/\r
+\r
+static PyObject *\r
+math_2(PyObject *args, double (*func) (double, double), char *funcname)\r
+{\r
+    PyObject *ox, *oy;\r
+    double x, y, r;\r
+    if (! PyArg_UnpackTuple(args, funcname, 2, 2, &ox, &oy))\r
+        return NULL;\r
+    x = PyFloat_AsDouble(ox);\r
+    y = PyFloat_AsDouble(oy);\r
+    if ((x == -1.0 || y == -1.0) && PyErr_Occurred())\r
+        return NULL;\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_2", return 0);\r
+    r = (*func)(x, y);\r
+    PyFPE_END_PROTECT(r);\r
+    if (Py_IS_NAN(r)) {\r
+        if (!Py_IS_NAN(x) && !Py_IS_NAN(y))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    else if (Py_IS_INFINITY(r)) {\r
+        if (Py_IS_FINITE(x) && Py_IS_FINITE(y))\r
+            errno = ERANGE;\r
+        else\r
+            errno = 0;\r
+    }\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    else\r
+        return PyFloat_FromDouble(r);\r
+}\r
+\r
+#define FUNC1(funcname, func, can_overflow, docstring)                  \\r
+    static PyObject * math_##funcname(PyObject *self, PyObject *args) { \\r
+        return math_1(args, func, can_overflow);                            \\r
+    }\\r
+    PyDoc_STRVAR(math_##funcname##_doc, docstring);\r
+\r
+#define FUNC1A(funcname, func, docstring)                               \\r
+    static PyObject * math_##funcname(PyObject *self, PyObject *args) { \\r
+        return math_1a(args, func);                                     \\r
+    }\\r
+    PyDoc_STRVAR(math_##funcname##_doc, docstring);\r
+\r
+#define FUNC2(funcname, func, docstring) \\r
+    static PyObject * math_##funcname(PyObject *self, PyObject *args) { \\r
+        return math_2(args, func, #funcname); \\r
+    }\\r
+    PyDoc_STRVAR(math_##funcname##_doc, docstring);\r
+\r
+FUNC1(acos, acos, 0,\r
+      "acos(x)\n\nReturn the arc cosine (measured in radians) of x.")\r
+FUNC1(acosh, m_acosh, 0,\r
+      "acosh(x)\n\nReturn the inverse hyperbolic cosine of x.")\r
+FUNC1(asin, asin, 0,\r
+      "asin(x)\n\nReturn the arc sine (measured in radians) of x.")\r
+FUNC1(asinh, m_asinh, 0,\r
+      "asinh(x)\n\nReturn the inverse hyperbolic sine of x.")\r
+FUNC1(atan, atan, 0,\r
+      "atan(x)\n\nReturn the arc tangent (measured in radians) of x.")\r
+FUNC2(atan2, m_atan2,\r
+      "atan2(y, x)\n\nReturn the arc tangent (measured in radians) of y/x.\n"\r
+      "Unlike atan(y/x), the signs of both x and y are considered.")\r
+FUNC1(atanh, m_atanh, 0,\r
+      "atanh(x)\n\nReturn the inverse hyperbolic tangent of x.")\r
+FUNC1(ceil, ceil, 0,\r
+      "ceil(x)\n\nReturn the ceiling of x as a float.\n"\r
+      "This is the smallest integral value >= x.")\r
+FUNC2(copysign, copysign,\r
+      "copysign(x, y)\n\nReturn x with the sign of y.")\r
+FUNC1(cos, cos, 0,\r
+      "cos(x)\n\nReturn the cosine of x (measured in radians).")\r
+FUNC1(cosh, cosh, 1,\r
+      "cosh(x)\n\nReturn the hyperbolic cosine of x.")\r
+FUNC1A(erf, m_erf,\r
+       "erf(x)\n\nError function at x.")\r
+FUNC1A(erfc, m_erfc,\r
+       "erfc(x)\n\nComplementary error function at x.")\r
+FUNC1(exp, exp, 1,\r
+      "exp(x)\n\nReturn e raised to the power of x.")\r
+FUNC1(expm1, m_expm1, 1,\r
+      "expm1(x)\n\nReturn exp(x)-1.\n"\r
+      "This function avoids the loss of precision involved in the direct "\r
+      "evaluation of exp(x)-1 for small x.")\r
+FUNC1(fabs, fabs, 0,\r
+      "fabs(x)\n\nReturn the absolute value of the float x.")\r
+FUNC1(floor, floor, 0,\r
+      "floor(x)\n\nReturn the floor of x as a float.\n"\r
+      "This is the largest integral value <= x.")\r
+FUNC1A(gamma, m_tgamma,\r
+      "gamma(x)\n\nGamma function at x.")\r
+FUNC1A(lgamma, m_lgamma,\r
+      "lgamma(x)\n\nNatural logarithm of absolute value of Gamma function at x.")\r
+FUNC1(log1p, m_log1p, 1,\r
+      "log1p(x)\n\nReturn the natural logarithm of 1+x (base e).\n"\r
+      "The result is computed in a way which is accurate for x near zero.")\r
+FUNC1(sin, sin, 0,\r
+      "sin(x)\n\nReturn the sine of x (measured in radians).")\r
+FUNC1(sinh, sinh, 1,\r
+      "sinh(x)\n\nReturn the hyperbolic sine of x.")\r
+FUNC1(sqrt, sqrt, 0,\r
+      "sqrt(x)\n\nReturn the square root of x.")\r
+FUNC1(tan, tan, 0,\r
+      "tan(x)\n\nReturn the tangent of x (measured in radians).")\r
+FUNC1(tanh, tanh, 0,\r
+      "tanh(x)\n\nReturn the hyperbolic tangent of x.")\r
+\r
+/* Precision summation function as msum() by Raymond Hettinger in\r
+   <http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/393090>,\r
+   enhanced with the exact partials sum and roundoff from Mark\r
+   Dickinson's post at <http://bugs.python.org/file10357/msum4.py>.\r
+   See those links for more details, proofs and other references.\r
+\r
+   Note 1: IEEE 754R floating point semantics are assumed,\r
+   but the current implementation does not re-establish special\r
+   value semantics across iterations (i.e. handling -Inf + Inf).\r
+\r
+   Note 2:  No provision is made for intermediate overflow handling;\r
+   therefore, sum([1e+308, 1e-308, 1e+308]) returns 1e+308 while\r
+   sum([1e+308, 1e+308, 1e-308]) raises an OverflowError due to the\r
+   overflow of the first partial sum.\r
+\r
+   Note 3: The intermediate values lo, yr, and hi are declared volatile so\r
+   aggressive compilers won't algebraically reduce lo to always be exactly 0.0.\r
+   Also, the volatile declaration forces the values to be stored in memory as\r
+   regular doubles instead of extended long precision (80-bit) values.  This\r
+   prevents double rounding because any addition or subtraction of two doubles\r
+   can be resolved exactly into double-sized hi and lo values.  As long as the\r
+   hi value gets forced into a double before yr and lo are computed, the extra\r
+   bits in downstream extended precision operations (x87 for example) will be\r
+   exactly zero and therefore can be losslessly stored back into a double,\r
+   thereby preventing double rounding.\r
+\r
+   Note 4: A similar implementation is in Modules/cmathmodule.c.\r
+   Be sure to update both when making changes.\r
+\r
+   Note 5: The signature of math.fsum() differs from __builtin__.sum()\r
+   because the start argument doesn't make sense in the context of\r
+   accurate summation.  Since the partials table is collapsed before\r
+   returning a result, sum(seq2, start=sum(seq1)) may not equal the\r
+   accurate result returned by sum(itertools.chain(seq1, seq2)).\r
+*/\r
+\r
+#define NUM_PARTIALS  32  /* initial partials array size, on stack */\r
+\r
+/* Extend the partials array p[] by doubling its size. */\r
+static int                          /* non-zero on error */\r
+_fsum_realloc(double **p_ptr, Py_ssize_t  n,\r
+             double  *ps,    Py_ssize_t *m_ptr)\r
+{\r
+    void *v = NULL;\r
+    Py_ssize_t m = *m_ptr;\r
+\r
+    m += m;  /* double */\r
+    if (n < m && m < (PY_SSIZE_T_MAX / sizeof(double))) {\r
+        double *p = *p_ptr;\r
+        if (p == ps) {\r
+            v = PyMem_Malloc(sizeof(double) * m);\r
+            if (v != NULL)\r
+                memcpy(v, ps, sizeof(double) * n);\r
+        }\r
+        else\r
+            v = PyMem_Realloc(p, sizeof(double) * m);\r
+    }\r
+    if (v == NULL) {        /* size overflow or no memory */\r
+        PyErr_SetString(PyExc_MemoryError, "math.fsum partials");\r
+        return 1;\r
+    }\r
+    *p_ptr = (double*) v;\r
+    *m_ptr = m;\r
+    return 0;\r
+}\r
+\r
+/* Full precision summation of a sequence of floats.\r
+\r
+   def msum(iterable):\r
+       partials = []  # sorted, non-overlapping partial sums\r
+       for x in iterable:\r
+           i = 0\r
+           for y in partials:\r
+               if abs(x) < abs(y):\r
+                   x, y = y, x\r
+               hi = x + y\r
+               lo = y - (hi - x)\r
+               if lo:\r
+                   partials[i] = lo\r
+                   i += 1\r
+               x = hi\r
+           partials[i:] = [x]\r
+       return sum_exact(partials)\r
+\r
+   Rounded x+y stored in hi with the roundoff stored in lo.  Together hi+lo\r
+   are exactly equal to x+y.  The inner loop applies hi/lo summation to each\r
+   partial so that the list of partial sums remains exact.\r
+\r
+   Sum_exact() adds the partial sums exactly and correctly rounds the final\r
+   result (using the round-half-to-even rule).  The items in partials remain\r
+   non-zero, non-special, non-overlapping and strictly increasing in\r
+   magnitude, but possibly not all having the same sign.\r
+\r
+   Depends on IEEE 754 arithmetic guarantees and half-even rounding.\r
+*/\r
+\r
+static PyObject*\r
+math_fsum(PyObject *self, PyObject *seq)\r
+{\r
+    PyObject *item, *iter, *sum = NULL;\r
+    Py_ssize_t i, j, n = 0, m = NUM_PARTIALS;\r
+    double x, y, t, ps[NUM_PARTIALS], *p = ps;\r
+    double xsave, special_sum = 0.0, inf_sum = 0.0;\r
+    volatile double hi, yr, lo;\r
+\r
+    iter = PyObject_GetIter(seq);\r
+    if (iter == NULL)\r
+        return NULL;\r
+\r
+    PyFPE_START_PROTECT("fsum", Py_DECREF(iter); return NULL)\r
+\r
+    for(;;) {           /* for x in iterable */\r
+        assert(0 <= n && n <= m);\r
+        assert((m == NUM_PARTIALS && p == ps) ||\r
+               (m >  NUM_PARTIALS && p != NULL));\r
+\r
+        item = PyIter_Next(iter);\r
+        if (item == NULL) {\r
+            if (PyErr_Occurred())\r
+                goto _fsum_error;\r
+            break;\r
+        }\r
+        x = PyFloat_AsDouble(item);\r
+        Py_DECREF(item);\r
+        if (PyErr_Occurred())\r
+            goto _fsum_error;\r
+\r
+        xsave = x;\r
+        for (i = j = 0; j < n; j++) {       /* for y in partials */\r
+            y = p[j];\r
+            if (fabs(x) < fabs(y)) {\r
+                t = x; x = y; y = t;\r
+            }\r
+            hi = x + y;\r
+            yr = hi - x;\r
+            lo = y - yr;\r
+            if (lo != 0.0)\r
+                p[i++] = lo;\r
+            x = hi;\r
+        }\r
+\r
+        n = i;                              /* ps[i:] = [x] */\r
+        if (x != 0.0) {\r
+            if (! Py_IS_FINITE(x)) {\r
+                /* a nonfinite x could arise either as\r
+                   a result of intermediate overflow, or\r
+                   as a result of a nan or inf in the\r
+                   summands */\r
+                if (Py_IS_FINITE(xsave)) {\r
+                    PyErr_SetString(PyExc_OverflowError,\r
+                          "intermediate overflow in fsum");\r
+                    goto _fsum_error;\r
+                }\r
+                if (Py_IS_INFINITY(xsave))\r
+                    inf_sum += xsave;\r
+                special_sum += xsave;\r
+                /* reset partials */\r
+                n = 0;\r
+            }\r
+            else if (n >= m && _fsum_realloc(&p, n, ps, &m))\r
+                goto _fsum_error;\r
+            else\r
+                p[n++] = x;\r
+        }\r
+    }\r
+\r
+    if (special_sum != 0.0) {\r
+        if (Py_IS_NAN(inf_sum))\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "-inf + inf in fsum");\r
+        else\r
+            sum = PyFloat_FromDouble(special_sum);\r
+        goto _fsum_error;\r
+    }\r
+\r
+    hi = 0.0;\r
+    if (n > 0) {\r
+        hi = p[--n];\r
+        /* sum_exact(ps, hi) from the top, stop when the sum becomes\r
+           inexact. */\r
+        while (n > 0) {\r
+            x = hi;\r
+            y = p[--n];\r
+            assert(fabs(y) < fabs(x));\r
+            hi = x + y;\r
+            yr = hi - x;\r
+            lo = y - yr;\r
+            if (lo != 0.0)\r
+                break;\r
+        }\r
+        /* Make half-even rounding work across multiple partials.\r
+           Needed so that sum([1e-16, 1, 1e16]) will round-up the last\r
+           digit to two instead of down to zero (the 1e-16 makes the 1\r
+           slightly closer to two).  With a potential 1 ULP rounding\r
+           error fixed-up, math.fsum() can guarantee commutativity. */\r
+        if (n > 0 && ((lo < 0.0 && p[n-1] < 0.0) ||\r
+                      (lo > 0.0 && p[n-1] > 0.0))) {\r
+            y = lo * 2.0;\r
+            x = hi + y;\r
+            yr = x - hi;\r
+            if (y == yr)\r
+                hi = x;\r
+        }\r
+    }\r
+    sum = PyFloat_FromDouble(hi);\r
+\r
+_fsum_error:\r
+    PyFPE_END_PROTECT(hi)\r
+    Py_DECREF(iter);\r
+    if (p != ps)\r
+        PyMem_Free(p);\r
+    return sum;\r
+}\r
+\r
+#undef NUM_PARTIALS\r
+\r
+PyDoc_STRVAR(math_fsum_doc,\r
+"fsum(iterable)\n\n\\r
+Return an accurate floating point sum of values in the iterable.\n\\r
+Assumes IEEE-754 floating point arithmetic.");\r
+\r
+static PyObject *\r
+math_factorial(PyObject *self, PyObject *arg)\r
+{\r
+    long i, x;\r
+    PyObject *result, *iobj, *newresult;\r
+\r
+    if (PyFloat_Check(arg)) {\r
+        PyObject *lx;\r
+        double dx = PyFloat_AS_DOUBLE((PyFloatObject *)arg);\r
+        if (!(Py_IS_FINITE(dx) && dx == floor(dx))) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                "factorial() only accepts integral values");\r
+            return NULL;\r
+        }\r
+        lx = PyLong_FromDouble(dx);\r
+        if (lx == NULL)\r
+            return NULL;\r
+        x = PyLong_AsLong(lx);\r
+        Py_DECREF(lx);\r
+    }\r
+    else\r
+        x = PyInt_AsLong(arg);\r
+\r
+    if (x == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    if (x < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+            "factorial() not defined for negative values");\r
+        return NULL;\r
+    }\r
+\r
+    result = (PyObject *)PyInt_FromLong(1);\r
+    if (result == NULL)\r
+        return NULL;\r
+    for (i=1 ; i<=x ; i++) {\r
+        iobj = (PyObject *)PyInt_FromLong(i);\r
+        if (iobj == NULL)\r
+            goto error;\r
+        newresult = PyNumber_Multiply(result, iobj);\r
+        Py_DECREF(iobj);\r
+        if (newresult == NULL)\r
+            goto error;\r
+        Py_DECREF(result);\r
+        result = newresult;\r
+    }\r
+    return result;\r
+\r
+error:\r
+    Py_DECREF(result);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(math_factorial_doc,\r
+"factorial(x) -> Integral\n"\r
+"\n"\r
+"Find x!. Raise a ValueError if x is negative or non-integral.");\r
+\r
+static PyObject *\r
+math_trunc(PyObject *self, PyObject *number)\r
+{\r
+    return PyObject_CallMethod(number, "__trunc__", NULL);\r
+}\r
+\r
+PyDoc_STRVAR(math_trunc_doc,\r
+"trunc(x:Real) -> Integral\n"\r
+"\n"\r
+"Truncates x to the nearest Integral toward 0. Uses the __trunc__ magic method.");\r
+\r
+static PyObject *\r
+math_frexp(PyObject *self, PyObject *arg)\r
+{\r
+    int i;\r
+    double x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    /* deal with special cases directly, to sidestep platform\r
+       differences */\r
+    if (Py_IS_NAN(x) || Py_IS_INFINITY(x) || !x) {\r
+        i = 0;\r
+    }\r
+    else {\r
+        PyFPE_START_PROTECT("in math_frexp", return 0);\r
+        x = frexp(x, &i);\r
+        PyFPE_END_PROTECT(x);\r
+    }\r
+    return Py_BuildValue("(di)", x, i);\r
+}\r
+\r
+PyDoc_STRVAR(math_frexp_doc,\r
+"frexp(x)\n"\r
+"\n"\r
+"Return the mantissa and exponent of x, as pair (m, e).\n"\r
+"m is a float and e is an int, such that x = m * 2.**e.\n"\r
+"If x is 0, m and e are both 0.  Else 0.5 <= abs(m) < 1.0.");\r
+\r
+static PyObject *\r
+math_ldexp(PyObject *self, PyObject *args)\r
+{\r
+    double x, r;\r
+    PyObject *oexp;\r
+    long exp;\r
+    int overflow;\r
+    if (! PyArg_ParseTuple(args, "dO:ldexp", &x, &oexp))\r
+        return NULL;\r
+\r
+    if (PyLong_Check(oexp) || PyInt_Check(oexp)) {\r
+        /* on overflow, replace exponent with either LONG_MAX\r
+           or LONG_MIN, depending on the sign. */\r
+        exp = PyLong_AsLongAndOverflow(oexp, &overflow);\r
+        if (exp == -1 && PyErr_Occurred())\r
+            return NULL;\r
+        if (overflow)\r
+            exp = overflow < 0 ? LONG_MIN : LONG_MAX;\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "Expected an int or long as second argument "\r
+                        "to ldexp.");\r
+        return NULL;\r
+    }\r
+\r
+    if (x == 0. || !Py_IS_FINITE(x)) {\r
+        /* NaNs, zeros and infinities are returned unchanged */\r
+        r = x;\r
+        errno = 0;\r
+    } else if (exp > INT_MAX) {\r
+        /* overflow */\r
+        r = copysign(Py_HUGE_VAL, x);\r
+        errno = ERANGE;\r
+    } else if (exp < INT_MIN) {\r
+        /* underflow to +-0 */\r
+        r = copysign(0., x);\r
+        errno = 0;\r
+    } else {\r
+        errno = 0;\r
+        PyFPE_START_PROTECT("in math_ldexp", return 0);\r
+        r = ldexp(x, (int)exp);\r
+        PyFPE_END_PROTECT(r);\r
+        if (Py_IS_INFINITY(r))\r
+            errno = ERANGE;\r
+    }\r
+\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    return PyFloat_FromDouble(r);\r
+}\r
+\r
+PyDoc_STRVAR(math_ldexp_doc,\r
+"ldexp(x, i)\n\n\\r
+Return x * (2**i).");\r
+\r
+static PyObject *\r
+math_modf(PyObject *self, PyObject *arg)\r
+{\r
+    double y, x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    /* some platforms don't do the right thing for NaNs and\r
+       infinities, so we take care of special cases directly. */\r
+    if (!Py_IS_FINITE(x)) {\r
+        if (Py_IS_INFINITY(x))\r
+            return Py_BuildValue("(dd)", copysign(0., x), x);\r
+        else if (Py_IS_NAN(x))\r
+            return Py_BuildValue("(dd)", x, x);\r
+    }\r
+\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_modf", return 0);\r
+    x = modf(x, &y);\r
+    PyFPE_END_PROTECT(x);\r
+    return Py_BuildValue("(dd)", x, y);\r
+}\r
+\r
+PyDoc_STRVAR(math_modf_doc,\r
+"modf(x)\n"\r
+"\n"\r
+"Return the fractional and integer parts of x.  Both results carry the sign\n"\r
+"of x and are floats.");\r
+\r
+/* A decent logarithm is easy to compute even for huge longs, but libm can't\r
+   do that by itself -- loghelper can.  func is log or log10, and name is\r
+   "log" or "log10".  Note that overflow of the result isn't possible: a long\r
+   can contain no more than INT_MAX * SHIFT bits, so has value certainly less\r
+   than 2**(2**64 * 2**16) == 2**2**80, and log2 of that is 2**80, which is\r
+   small enough to fit in an IEEE single.  log and log10 are even smaller.\r
+   However, intermediate overflow is possible for a long if the number of bits\r
+   in that long is larger than PY_SSIZE_T_MAX. */\r
+\r
+static PyObject*\r
+loghelper(PyObject* arg, double (*func)(double), char *funcname)\r
+{\r
+    /* If it is long, do it ourselves. */\r
+    if (PyLong_Check(arg)) {\r
+        double x, result;\r
+        Py_ssize_t e;\r
+\r
+        /* Negative or zero inputs give a ValueError. */\r
+        if (Py_SIZE(arg) <= 0) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "math domain error");\r
+            return NULL;\r
+        }\r
+\r
+        x = PyLong_AsDouble(arg);\r
+        if (x == -1.0 && PyErr_Occurred()) {\r
+            if (!PyErr_ExceptionMatches(PyExc_OverflowError))\r
+                return NULL;\r
+            /* Here the conversion to double overflowed, but it's possible\r
+               to compute the log anyway.  Clear the exception and continue. */\r
+            PyErr_Clear();\r
+            x = _PyLong_Frexp((PyLongObject *)arg, &e);\r
+            if (x == -1.0 && PyErr_Occurred())\r
+                return NULL;\r
+            /* Value is ~= x * 2**e, so the log ~= log(x) + log(2) * e. */\r
+            result = func(x) + func(2.0) * e;\r
+        }\r
+        else\r
+            /* Successfully converted x to a double. */\r
+            result = func(x);\r
+        return PyFloat_FromDouble(result);\r
+    }\r
+\r
+    /* Else let libm handle it by itself. */\r
+    return math_1(arg, func, 0);\r
+}\r
+\r
+static PyObject *\r
+math_log(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *arg;\r
+    PyObject *base = NULL;\r
+    PyObject *num, *den;\r
+    PyObject *ans;\r
+\r
+    if (!PyArg_UnpackTuple(args, "log", 1, 2, &arg, &base))\r
+        return NULL;\r
+\r
+    num = loghelper(arg, m_log, "log");\r
+    if (num == NULL || base == NULL)\r
+        return num;\r
+\r
+    den = loghelper(base, m_log, "log");\r
+    if (den == NULL) {\r
+        Py_DECREF(num);\r
+        return NULL;\r
+    }\r
+\r
+    ans = PyNumber_Divide(num, den);\r
+    Py_DECREF(num);\r
+    Py_DECREF(den);\r
+    return ans;\r
+}\r
+\r
+PyDoc_STRVAR(math_log_doc,\r
+"log(x[, base])\n\n\\r
+Return the logarithm of x to the given base.\n\\r
+If the base not specified, returns the natural logarithm (base e) of x.");\r
+\r
+static PyObject *\r
+math_log10(PyObject *self, PyObject *arg)\r
+{\r
+    return loghelper(arg, m_log10, "log10");\r
+}\r
+\r
+PyDoc_STRVAR(math_log10_doc,\r
+"log10(x)\n\nReturn the base 10 logarithm of x.");\r
+\r
+static PyObject *\r
+math_fmod(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ox, *oy;\r
+    double r, x, y;\r
+    if (! PyArg_UnpackTuple(args, "fmod", 2, 2, &ox, &oy))\r
+        return NULL;\r
+    x = PyFloat_AsDouble(ox);\r
+    y = PyFloat_AsDouble(oy);\r
+    if ((x == -1.0 || y == -1.0) && PyErr_Occurred())\r
+        return NULL;\r
+    /* fmod(x, +/-Inf) returns x for finite x. */\r
+    if (Py_IS_INFINITY(y) && Py_IS_FINITE(x))\r
+        return PyFloat_FromDouble(x);\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_fmod", return 0);\r
+    r = fmod(x, y);\r
+    PyFPE_END_PROTECT(r);\r
+    if (Py_IS_NAN(r)) {\r
+        if (!Py_IS_NAN(x) && !Py_IS_NAN(y))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    else\r
+        return PyFloat_FromDouble(r);\r
+}\r
+\r
+PyDoc_STRVAR(math_fmod_doc,\r
+"fmod(x, y)\n\nReturn fmod(x, y), according to platform C."\r
+"  x % y may differ.");\r
+\r
+static PyObject *\r
+math_hypot(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ox, *oy;\r
+    double r, x, y;\r
+    if (! PyArg_UnpackTuple(args, "hypot", 2, 2, &ox, &oy))\r
+        return NULL;\r
+    x = PyFloat_AsDouble(ox);\r
+    y = PyFloat_AsDouble(oy);\r
+    if ((x == -1.0 || y == -1.0) && PyErr_Occurred())\r
+        return NULL;\r
+    /* hypot(x, +/-Inf) returns Inf, even if x is a NaN. */\r
+    if (Py_IS_INFINITY(x))\r
+        return PyFloat_FromDouble(fabs(x));\r
+    if (Py_IS_INFINITY(y))\r
+        return PyFloat_FromDouble(fabs(y));\r
+    errno = 0;\r
+    PyFPE_START_PROTECT("in math_hypot", return 0);\r
+    r = hypot(x, y);\r
+    PyFPE_END_PROTECT(r);\r
+    if (Py_IS_NAN(r)) {\r
+        if (!Py_IS_NAN(x) && !Py_IS_NAN(y))\r
+            errno = EDOM;\r
+        else\r
+            errno = 0;\r
+    }\r
+    else if (Py_IS_INFINITY(r)) {\r
+        if (Py_IS_FINITE(x) && Py_IS_FINITE(y))\r
+            errno = ERANGE;\r
+        else\r
+            errno = 0;\r
+    }\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    else\r
+        return PyFloat_FromDouble(r);\r
+}\r
+\r
+PyDoc_STRVAR(math_hypot_doc,\r
+"hypot(x, y)\n\nReturn the Euclidean distance, sqrt(x*x + y*y).");\r
+\r
+/* pow can't use math_2, but needs its own wrapper: the problem is\r
+   that an infinite result can arise either as a result of overflow\r
+   (in which case OverflowError should be raised) or as a result of\r
+   e.g. 0.**-5. (for which ValueError needs to be raised.)\r
+*/\r
+\r
+static PyObject *\r
+math_pow(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ox, *oy;\r
+    double r, x, y;\r
+    int odd_y;\r
+\r
+    if (! PyArg_UnpackTuple(args, "pow", 2, 2, &ox, &oy))\r
+        return NULL;\r
+    x = PyFloat_AsDouble(ox);\r
+    y = PyFloat_AsDouble(oy);\r
+    if ((x == -1.0 || y == -1.0) && PyErr_Occurred())\r
+        return NULL;\r
+\r
+    /* deal directly with IEEE specials, to cope with problems on various\r
+       platforms whose semantics don't exactly match C99 */\r
+    r = 0.; /* silence compiler warning */\r
+    if (!Py_IS_FINITE(x) || !Py_IS_FINITE(y)) {\r
+        errno = 0;\r
+        if (Py_IS_NAN(x))\r
+            r = y == 0. ? 1. : x; /* NaN**0 = 1 */\r
+        else if (Py_IS_NAN(y))\r
+            r = x == 1. ? 1. : y; /* 1**NaN = 1 */\r
+        else if (Py_IS_INFINITY(x)) {\r
+            odd_y = Py_IS_FINITE(y) && fmod(fabs(y), 2.0) == 1.0;\r
+            if (y > 0.)\r
+                r = odd_y ? x : fabs(x);\r
+            else if (y == 0.)\r
+                r = 1.;\r
+            else /* y < 0. */\r
+                r = odd_y ? copysign(0., x) : 0.;\r
+        }\r
+        else if (Py_IS_INFINITY(y)) {\r
+            if (fabs(x) == 1.0)\r
+                r = 1.;\r
+            else if (y > 0. && fabs(x) > 1.0)\r
+                r = y;\r
+            else if (y < 0. && fabs(x) < 1.0) {\r
+                r = -y; /* result is +inf */\r
+                if (x == 0.) /* 0**-inf: divide-by-zero */\r
+                    errno = EDOM;\r
+            }\r
+            else\r
+                r = 0.;\r
+        }\r
+    }\r
+    else {\r
+        /* let libm handle finite**finite */\r
+        errno = 0;\r
+        PyFPE_START_PROTECT("in math_pow", return 0);\r
+        r = pow(x, y);\r
+        PyFPE_END_PROTECT(r);\r
+        /* a NaN result should arise only from (-ve)**(finite\r
+           non-integer); in this case we want to raise ValueError. */\r
+        if (!Py_IS_FINITE(r)) {\r
+            if (Py_IS_NAN(r)) {\r
+                errno = EDOM;\r
+            }\r
+            /*\r
+               an infinite result here arises either from:\r
+               (A) (+/-0.)**negative (-> divide-by-zero)\r
+               (B) overflow of x**y with x and y finite\r
+            */\r
+            else if (Py_IS_INFINITY(r)) {\r
+                if (x == 0.)\r
+                    errno = EDOM;\r
+                else\r
+                    errno = ERANGE;\r
+            }\r
+        }\r
+    }\r
+\r
+    if (errno && is_error(r))\r
+        return NULL;\r
+    else\r
+        return PyFloat_FromDouble(r);\r
+}\r
+\r
+PyDoc_STRVAR(math_pow_doc,\r
+"pow(x, y)\n\nReturn x**y (x to the power of y).");\r
+\r
+static const double degToRad = Py_MATH_PI / 180.0;\r
+static const double radToDeg = 180.0 / Py_MATH_PI;\r
+\r
+static PyObject *\r
+math_degrees(PyObject *self, PyObject *arg)\r
+{\r
+    double x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyFloat_FromDouble(x * radToDeg);\r
+}\r
+\r
+PyDoc_STRVAR(math_degrees_doc,\r
+"degrees(x)\n\n\\r
+Convert angle x from radians to degrees.");\r
+\r
+static PyObject *\r
+math_radians(PyObject *self, PyObject *arg)\r
+{\r
+    double x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyFloat_FromDouble(x * degToRad);\r
+}\r
+\r
+PyDoc_STRVAR(math_radians_doc,\r
+"radians(x)\n\n\\r
+Convert angle x from degrees to radians.");\r
+\r
+static PyObject *\r
+math_isnan(PyObject *self, PyObject *arg)\r
+{\r
+    double x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyBool_FromLong((long)Py_IS_NAN(x));\r
+}\r
+\r
+PyDoc_STRVAR(math_isnan_doc,\r
+"isnan(x) -> bool\n\n\\r
+Check if float x is not a number (NaN).");\r
+\r
+static PyObject *\r
+math_isinf(PyObject *self, PyObject *arg)\r
+{\r
+    double x = PyFloat_AsDouble(arg);\r
+    if (x == -1.0 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyBool_FromLong((long)Py_IS_INFINITY(x));\r
+}\r
+\r
+PyDoc_STRVAR(math_isinf_doc,\r
+"isinf(x) -> bool\n\n\\r
+Check if float x is infinite (positive or negative).");\r
+\r
+static PyMethodDef math_methods[] = {\r
+    {"acos",            math_acos,      METH_O,         math_acos_doc},\r
+    {"acosh",           math_acosh,     METH_O,         math_acosh_doc},\r
+    {"asin",            math_asin,      METH_O,         math_asin_doc},\r
+    {"asinh",           math_asinh,     METH_O,         math_asinh_doc},\r
+    {"atan",            math_atan,      METH_O,         math_atan_doc},\r
+    {"atan2",           math_atan2,     METH_VARARGS,   math_atan2_doc},\r
+    {"atanh",           math_atanh,     METH_O,         math_atanh_doc},\r
+    {"ceil",            math_ceil,      METH_O,         math_ceil_doc},\r
+    {"copysign",        math_copysign,  METH_VARARGS,   math_copysign_doc},\r
+    {"cos",             math_cos,       METH_O,         math_cos_doc},\r
+    {"cosh",            math_cosh,      METH_O,         math_cosh_doc},\r
+    {"degrees",         math_degrees,   METH_O,         math_degrees_doc},\r
+    {"erf",             math_erf,       METH_O,         math_erf_doc},\r
+    {"erfc",            math_erfc,      METH_O,         math_erfc_doc},\r
+    {"exp",             math_exp,       METH_O,         math_exp_doc},\r
+    {"expm1",           math_expm1,     METH_O,         math_expm1_doc},\r
+    {"fabs",            math_fabs,      METH_O,         math_fabs_doc},\r
+    {"factorial",       math_factorial, METH_O,         math_factorial_doc},\r
+    {"floor",           math_floor,     METH_O,         math_floor_doc},\r
+    {"fmod",            math_fmod,      METH_VARARGS,   math_fmod_doc},\r
+    {"frexp",           math_frexp,     METH_O,         math_frexp_doc},\r
+    {"fsum",            math_fsum,      METH_O,         math_fsum_doc},\r
+    {"gamma",           math_gamma,     METH_O,         math_gamma_doc},\r
+    {"hypot",           math_hypot,     METH_VARARGS,   math_hypot_doc},\r
+    {"isinf",           math_isinf,     METH_O,         math_isinf_doc},\r
+    {"isnan",           math_isnan,     METH_O,         math_isnan_doc},\r
+    {"ldexp",           math_ldexp,     METH_VARARGS,   math_ldexp_doc},\r
+    {"lgamma",          math_lgamma,    METH_O,         math_lgamma_doc},\r
+    {"log",             math_log,       METH_VARARGS,   math_log_doc},\r
+    {"log1p",           math_log1p,     METH_O,         math_log1p_doc},\r
+    {"log10",           math_log10,     METH_O,         math_log10_doc},\r
+    {"modf",            math_modf,      METH_O,         math_modf_doc},\r
+    {"pow",             math_pow,       METH_VARARGS,   math_pow_doc},\r
+    {"radians",         math_radians,   METH_O,         math_radians_doc},\r
+    {"sin",             math_sin,       METH_O,         math_sin_doc},\r
+    {"sinh",            math_sinh,      METH_O,         math_sinh_doc},\r
+    {"sqrt",            math_sqrt,      METH_O,         math_sqrt_doc},\r
+    {"tan",             math_tan,       METH_O,         math_tan_doc},\r
+    {"tanh",            math_tanh,      METH_O,         math_tanh_doc},\r
+    {"trunc",           math_trunc,     METH_O,         math_trunc_doc},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module is always available.  It provides access to the\n"\r
+"mathematical functions defined by the C standard.");\r
+\r
+PyMODINIT_FUNC\r
+initmath(void)\r
+{\r
+    PyObject *m;\r
+\r
+    m = Py_InitModule3("math", math_methods, module_doc);\r
+    if (m == NULL)\r
+        goto finally;\r
+\r
+    PyModule_AddObject(m, "pi", PyFloat_FromDouble(Py_MATH_PI));\r
+    PyModule_AddObject(m, "e", PyFloat_FromDouble(Py_MATH_E));\r
+\r
+    finally:\r
+    return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/md5.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/md5.c
new file mode 100644 (file)
index 0000000..53dbbc6
--- /dev/null
@@ -0,0 +1,394 @@
+/*\r
+  Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.\r
+\r
+  This software is provided 'as-is', without any express or implied\r
+  warranty.  In no event will the authors be held liable for any damages\r
+  arising from the use of this software.\r
+\r
+  Permission is granted to anyone to use this software for any purpose,\r
+  including commercial applications, and to alter it and redistribute it\r
+  freely, subject to the following restrictions:\r
+\r
+  1. The origin of this software must not be misrepresented; you must not\r
+     claim that you wrote the original software. If you use this software\r
+     in a product, an acknowledgment in the product documentation would be\r
+     appreciated but is not required.\r
+  2. Altered source versions must be plainly marked as such, and must not be\r
+     misrepresented as being the original software.\r
+  3. This notice may not be removed or altered from any source distribution.\r
+\r
+  L. Peter Deutsch\r
+  ghost@aladdin.com\r
+\r
+ */\r
+/* $Id: md5.c,v 1.6 2002/04/13 19:20:28 lpd Exp $ */\r
+/*\r
+  Independent implementation of MD5 (RFC 1321).\r
+\r
+  This code implements the MD5 Algorithm defined in RFC 1321, whose\r
+  text is available at\r
+        http://www.ietf.org/rfc/rfc1321.txt\r
+  The code is derived from the text of the RFC, including the test suite\r
+  (section A.5) but excluding the rest of Appendix A.  It does not include\r
+  any code or documentation that is identified in the RFC as being\r
+  copyrighted.\r
+\r
+  The original and principal author of md5.c is L. Peter Deutsch\r
+  <ghost@aladdin.com>.  Other authors are noted in the change history\r
+  that follows (in reverse chronological order):\r
+\r
+  2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order\r
+        either statically or dynamically; added missing #include <string.h>\r
+        in library.\r
+  2002-03-11 lpd Corrected argument list for main(), and added int return\r
+        type, in test program and T value program.\r
+  2002-02-21 lpd Added missing #include <stdio.h> in test program.\r
+  2000-07-03 lpd Patched to eliminate warnings about "constant is\r
+        unsigned in ANSI C, signed in traditional"; made test program\r
+        self-checking.\r
+  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.\r
+  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).\r
+  1999-05-03 lpd Original version.\r
+ */\r
+\r
+#include "md5.h"\r
+#include <string.h>\r
+#include <limits.h>\r
+\r
+#undef BYTE_ORDER       /* 1 = big-endian, -1 = little-endian, 0 = unknown */\r
+#ifdef ARCH_IS_BIG_ENDIAN\r
+#  define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1)\r
+#else\r
+#  define BYTE_ORDER 0\r
+#endif\r
+\r
+#define T_MASK ((md5_word_t)~0)\r
+#define T1 /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)\r
+#define T2 /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)\r
+#define T3    0x242070db\r
+#define T4 /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)\r
+#define T5 /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)\r
+#define T6    0x4787c62a\r
+#define T7 /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)\r
+#define T8 /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)\r
+#define T9    0x698098d8\r
+#define T10 /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)\r
+#define T11 /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)\r
+#define T12 /* 0x895cd7be */ (T_MASK ^ 0x76a32841)\r
+#define T13    0x6b901122\r
+#define T14 /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)\r
+#define T15 /* 0xa679438e */ (T_MASK ^ 0x5986bc71)\r
+#define T16    0x49b40821\r
+#define T17 /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)\r
+#define T18 /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)\r
+#define T19    0x265e5a51\r
+#define T20 /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)\r
+#define T21 /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)\r
+#define T22    0x02441453\r
+#define T23 /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)\r
+#define T24 /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)\r
+#define T25    0x21e1cde6\r
+#define T26 /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)\r
+#define T27 /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)\r
+#define T28    0x455a14ed\r
+#define T29 /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)\r
+#define T30 /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)\r
+#define T31    0x676f02d9\r
+#define T32 /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)\r
+#define T33 /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)\r
+#define T34 /* 0x8771f681 */ (T_MASK ^ 0x788e097e)\r
+#define T35    0x6d9d6122\r
+#define T36 /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)\r
+#define T37 /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)\r
+#define T38    0x4bdecfa9\r
+#define T39 /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)\r
+#define T40 /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)\r
+#define T41    0x289b7ec6\r
+#define T42 /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)\r
+#define T43 /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)\r
+#define T44    0x04881d05\r
+#define T45 /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)\r
+#define T46 /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)\r
+#define T47    0x1fa27cf8\r
+#define T48 /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)\r
+#define T49 /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)\r
+#define T50    0x432aff97\r
+#define T51 /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)\r
+#define T52 /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)\r
+#define T53    0x655b59c3\r
+#define T54 /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)\r
+#define T55 /* 0xffeff47d */ (T_MASK ^ 0x00100b82)\r
+#define T56 /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)\r
+#define T57    0x6fa87e4f\r
+#define T58 /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)\r
+#define T59 /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)\r
+#define T60    0x4e0811a1\r
+#define T61 /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)\r
+#define T62 /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)\r
+#define T63    0x2ad7d2bb\r
+#define T64 /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)\r
+\r
+\r
+static void\r
+md5_process(md5_state_t *pms, const md5_byte_t *data /*[64]*/)\r
+{\r
+    md5_word_t\r
+        a = pms->abcd[0], b = pms->abcd[1],\r
+        c = pms->abcd[2], d = pms->abcd[3];\r
+    md5_word_t t;\r
+#if BYTE_ORDER > 0\r
+    /* Define storage only for big-endian CPUs. */\r
+    md5_word_t X[16];\r
+#else\r
+    /* Define storage for little-endian or both types of CPUs. */\r
+    md5_word_t xbuf[16];\r
+    const md5_word_t *X;\r
+#endif\r
+\r
+    {\r
+#if BYTE_ORDER == 0\r
+        /*\r
+         * Determine dynamically whether this is a big-endian or\r
+         * little-endian machine, since we can use a more efficient\r
+         * algorithm on the latter.\r
+         */\r
+        static const int w = 1;\r
+\r
+        if (*((const md5_byte_t *)&w)) /* dynamic little-endian */\r
+#endif\r
+#if BYTE_ORDER <= 0             /* little-endian */\r
+        {\r
+            /*\r
+             * On little-endian machines, we can process properly aligned\r
+             * data without copying it.\r
+             */\r
+            if (!((data - (const md5_byte_t *)0) & 3)) {\r
+                /* data are properly aligned */\r
+                X = (const md5_word_t *)data;\r
+            } else {\r
+                /* not aligned */\r
+                memcpy(xbuf, data, 64);\r
+                X = xbuf;\r
+            }\r
+        }\r
+#endif\r
+#if BYTE_ORDER == 0\r
+        else                    /* dynamic big-endian */\r
+#endif\r
+#if BYTE_ORDER >= 0             /* big-endian */\r
+        {\r
+            /*\r
+             * On big-endian machines, we must arrange the bytes in the\r
+             * right order.\r
+             */\r
+            const md5_byte_t *xp = data;\r
+            int i;\r
+\r
+#  if BYTE_ORDER == 0\r
+            X = xbuf;           /* (dynamic only) */\r
+#  else\r
+#    define xbuf X              /* (static only) */\r
+#  endif\r
+            for (i = 0; i < 16; ++i, xp += 4)\r
+                xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);\r
+        }\r
+#endif\r
+    }\r
+\r
+#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))\r
+\r
+    /* Round 1. */\r
+    /* Let [abcd k s i] denote the operation\r
+       a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */\r
+#define F(x, y, z) (((x) & (y)) | (~(x) & (z)))\r
+#define SET(a, b, c, d, k, s, Ti)\\r
+  t = a + F(b,c,d) + X[k] + Ti;\\r
+  a = ROTATE_LEFT(t, s) + b\r
+    /* Do the following 16 operations. */\r
+    SET(a, b, c, d,  0,  7,  T1);\r
+    SET(d, a, b, c,  1, 12,  T2);\r
+    SET(c, d, a, b,  2, 17,  T3);\r
+    SET(b, c, d, a,  3, 22,  T4);\r
+    SET(a, b, c, d,  4,  7,  T5);\r
+    SET(d, a, b, c,  5, 12,  T6);\r
+    SET(c, d, a, b,  6, 17,  T7);\r
+    SET(b, c, d, a,  7, 22,  T8);\r
+    SET(a, b, c, d,  8,  7,  T9);\r
+    SET(d, a, b, c,  9, 12, T10);\r
+    SET(c, d, a, b, 10, 17, T11);\r
+    SET(b, c, d, a, 11, 22, T12);\r
+    SET(a, b, c, d, 12,  7, T13);\r
+    SET(d, a, b, c, 13, 12, T14);\r
+    SET(c, d, a, b, 14, 17, T15);\r
+    SET(b, c, d, a, 15, 22, T16);\r
+#undef SET\r
+\r
+     /* Round 2. */\r
+     /* Let [abcd k s i] denote the operation\r
+          a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */\r
+#define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))\r
+#define SET(a, b, c, d, k, s, Ti)\\r
+  t = a + G(b,c,d) + X[k] + Ti;\\r
+  a = ROTATE_LEFT(t, s) + b\r
+     /* Do the following 16 operations. */\r
+    SET(a, b, c, d,  1,  5, T17);\r
+    SET(d, a, b, c,  6,  9, T18);\r
+    SET(c, d, a, b, 11, 14, T19);\r
+    SET(b, c, d, a,  0, 20, T20);\r
+    SET(a, b, c, d,  5,  5, T21);\r
+    SET(d, a, b, c, 10,  9, T22);\r
+    SET(c, d, a, b, 15, 14, T23);\r
+    SET(b, c, d, a,  4, 20, T24);\r
+    SET(a, b, c, d,  9,  5, T25);\r
+    SET(d, a, b, c, 14,  9, T26);\r
+    SET(c, d, a, b,  3, 14, T27);\r
+    SET(b, c, d, a,  8, 20, T28);\r
+    SET(a, b, c, d, 13,  5, T29);\r
+    SET(d, a, b, c,  2,  9, T30);\r
+    SET(c, d, a, b,  7, 14, T31);\r
+    SET(b, c, d, a, 12, 20, T32);\r
+#undef SET\r
+\r
+     /* Round 3. */\r
+     /* Let [abcd k s t] denote the operation\r
+          a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */\r
+#define H(x, y, z) ((x) ^ (y) ^ (z))\r
+#define SET(a, b, c, d, k, s, Ti)\\r
+  t = a + H(b,c,d) + X[k] + Ti;\\r
+  a = ROTATE_LEFT(t, s) + b\r
+     /* Do the following 16 operations. */\r
+    SET(a, b, c, d,  5,  4, T33);\r
+    SET(d, a, b, c,  8, 11, T34);\r
+    SET(c, d, a, b, 11, 16, T35);\r
+    SET(b, c, d, a, 14, 23, T36);\r
+    SET(a, b, c, d,  1,  4, T37);\r
+    SET(d, a, b, c,  4, 11, T38);\r
+    SET(c, d, a, b,  7, 16, T39);\r
+    SET(b, c, d, a, 10, 23, T40);\r
+    SET(a, b, c, d, 13,  4, T41);\r
+    SET(d, a, b, c,  0, 11, T42);\r
+    SET(c, d, a, b,  3, 16, T43);\r
+    SET(b, c, d, a,  6, 23, T44);\r
+    SET(a, b, c, d,  9,  4, T45);\r
+    SET(d, a, b, c, 12, 11, T46);\r
+    SET(c, d, a, b, 15, 16, T47);\r
+    SET(b, c, d, a,  2, 23, T48);\r
+#undef SET\r
+\r
+     /* Round 4. */\r
+     /* Let [abcd k s t] denote the operation\r
+          a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */\r
+#define I(x, y, z) ((y) ^ ((x) | ~(z)))\r
+#define SET(a, b, c, d, k, s, Ti)\\r
+  t = a + I(b,c,d) + X[k] + Ti;\\r
+  a = ROTATE_LEFT(t, s) + b\r
+     /* Do the following 16 operations. */\r
+    SET(a, b, c, d,  0,  6, T49);\r
+    SET(d, a, b, c,  7, 10, T50);\r
+    SET(c, d, a, b, 14, 15, T51);\r
+    SET(b, c, d, a,  5, 21, T52);\r
+    SET(a, b, c, d, 12,  6, T53);\r
+    SET(d, a, b, c,  3, 10, T54);\r
+    SET(c, d, a, b, 10, 15, T55);\r
+    SET(b, c, d, a,  1, 21, T56);\r
+    SET(a, b, c, d,  8,  6, T57);\r
+    SET(d, a, b, c, 15, 10, T58);\r
+    SET(c, d, a, b,  6, 15, T59);\r
+    SET(b, c, d, a, 13, 21, T60);\r
+    SET(a, b, c, d,  4,  6, T61);\r
+    SET(d, a, b, c, 11, 10, T62);\r
+    SET(c, d, a, b,  2, 15, T63);\r
+    SET(b, c, d, a,  9, 21, T64);\r
+#undef SET\r
+\r
+     /* Then perform the following additions. (That is increment each\r
+        of the four registers by the value it had before this block\r
+        was started.) */\r
+    pms->abcd[0] += a;\r
+    pms->abcd[1] += b;\r
+    pms->abcd[2] += c;\r
+    pms->abcd[3] += d;\r
+}\r
+\r
+void\r
+md5_init(md5_state_t *pms)\r
+{\r
+    pms->count[0] = pms->count[1] = 0;\r
+    pms->abcd[0] = 0x67452301;\r
+    pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;\r
+    pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;\r
+    pms->abcd[3] = 0x10325476;\r
+}\r
+\r
+void\r
+md5_append(md5_state_t *pms, const md5_byte_t *data, unsigned int nbytes)\r
+{\r
+    const md5_byte_t *p = data;\r
+    unsigned int left = nbytes;\r
+    unsigned int offset = (pms->count[0] >> 3) & 63;\r
+    md5_word_t nbits = (md5_word_t)(nbytes << 3);\r
+\r
+    if (nbytes <= 0)\r
+        return;\r
+\r
+    /* this special case is handled recursively */\r
+    if (nbytes > INT_MAX - offset) {\r
+        unsigned int overlap;\r
+\r
+        /* handle the append in two steps to prevent overflow */\r
+        overlap = 64 - offset;\r
+\r
+        md5_append(pms, data, overlap);\r
+        md5_append(pms, data + overlap, nbytes - overlap);\r
+        return;\r
+    }\r
+\r
+    /* Update the message length. */\r
+    pms->count[1] += nbytes >> 29;\r
+    pms->count[0] += nbits;\r
+    if (pms->count[0] < nbits)\r
+        pms->count[1]++;\r
+\r
+    /* Process an initial partial block. */\r
+    if (offset) {\r
+        unsigned int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);\r
+\r
+        memcpy(pms->buf + offset, p, copy);\r
+        if (offset + copy < 64)\r
+            return;\r
+        p += copy;\r
+        left -= copy;\r
+        md5_process(pms, pms->buf);\r
+    }\r
+\r
+    /* Process full blocks. */\r
+    for (; left >= 64; p += 64, left -= 64)\r
+        md5_process(pms, p);\r
+\r
+    /* Process a final partial block. */\r
+    if (left)\r
+        memcpy(pms->buf, p, left);\r
+}\r
+\r
+void\r
+md5_finish(md5_state_t *pms, md5_byte_t digest[16])\r
+{\r
+    static const md5_byte_t pad[64] = {\r
+        0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\r
+        0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\r
+    };\r
+    md5_byte_t data[8];\r
+    int i;\r
+\r
+    /* Save the length before padding. */\r
+    for (i = 0; i < 8; ++i)\r
+        data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));\r
+    /* Pad to 56 bytes mod 64. */\r
+    md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);\r
+    /* Append the length. */\r
+    md5_append(pms, data, 8);\r
+    for (i = 0; i < 16; ++i)\r
+        digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/md5.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/md5.h
new file mode 100644 (file)
index 0000000..55560b3
--- /dev/null
@@ -0,0 +1,91 @@
+/*\r
+  Copyright (C) 1999, 2002 Aladdin Enterprises.  All rights reserved.\r
+\r
+  This software is provided 'as-is', without any express or implied\r
+  warranty.  In no event will the authors be held liable for any damages\r
+  arising from the use of this software.\r
+\r
+  Permission is granted to anyone to use this software for any purpose,\r
+  including commercial applications, and to alter it and redistribute it\r
+  freely, subject to the following restrictions:\r
+\r
+  1. The origin of this software must not be misrepresented; you must not\r
+     claim that you wrote the original software. If you use this software\r
+     in a product, an acknowledgment in the product documentation would be\r
+     appreciated but is not required.\r
+  2. Altered source versions must be plainly marked as such, and must not be\r
+     misrepresented as being the original software.\r
+  3. This notice may not be removed or altered from any source distribution.\r
+\r
+  L. Peter Deutsch\r
+  ghost@aladdin.com\r
+\r
+ */\r
+/* $Id$ */\r
+/*\r
+  Independent implementation of MD5 (RFC 1321).\r
+\r
+  This code implements the MD5 Algorithm defined in RFC 1321, whose\r
+  text is available at\r
+       http://www.ietf.org/rfc/rfc1321.txt\r
+  The code is derived from the text of the RFC, including the test suite\r
+  (section A.5) but excluding the rest of Appendix A.  It does not include\r
+  any code or documentation that is identified in the RFC as being\r
+  copyrighted.\r
+\r
+  The original and principal author of md5.h is L. Peter Deutsch\r
+  <ghost@aladdin.com>.  Other authors are noted in the change history\r
+  that follows (in reverse chronological order):\r
+\r
+  2002-04-13 lpd Removed support for non-ANSI compilers; removed\r
+       references to Ghostscript; clarified derivation from RFC 1321;\r
+       now handles byte order either statically or dynamically.\r
+  1999-11-04 lpd Edited comments slightly for automatic TOC extraction.\r
+  1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5);\r
+       added conditionalization for C++ compilation from Martin\r
+       Purschke <purschke@bnl.gov>.\r
+  1999-05-03 lpd Original version.\r
+ */\r
+\r
+#ifndef md5_INCLUDED\r
+#  define md5_INCLUDED\r
+\r
+/*\r
+ * This package supports both compile-time and run-time determination of CPU\r
+ * byte order.  If ARCH_IS_BIG_ENDIAN is defined as 0, the code will be\r
+ * compiled to run only on little-endian CPUs; if ARCH_IS_BIG_ENDIAN is\r
+ * defined as non-zero, the code will be compiled to run only on big-endian\r
+ * CPUs; if ARCH_IS_BIG_ENDIAN is not defined, the code will be compiled to\r
+ * run on either big- or little-endian CPUs, but will run slightly less\r
+ * efficiently on either one than if ARCH_IS_BIG_ENDIAN is defined.\r
+ */\r
+\r
+typedef unsigned char md5_byte_t; /* 8-bit byte */\r
+typedef unsigned int md5_word_t; /* 32-bit word */\r
+\r
+/* Define the state of the MD5 Algorithm. */\r
+typedef struct md5_state_s {\r
+    md5_word_t count[2];       /* message length in bits, lsw first */\r
+    md5_word_t abcd[4];                /* digest buffer */\r
+    md5_byte_t buf[64];                /* accumulate block */\r
+} md5_state_t;\r
+\r
+#ifdef __cplusplus\r
+extern "C" \r
+{\r
+#endif\r
+\r
+/* Initialize the algorithm. */\r
+void md5_init(md5_state_t *pms);\r
+\r
+/* Append a string to the message. */\r
+void md5_append(md5_state_t *pms, const md5_byte_t *data, unsigned int nbytes);\r
+\r
+/* Finish the message and return the digest. */\r
+void md5_finish(md5_state_t *pms, md5_byte_t digest[16]);\r
+\r
+#ifdef __cplusplus\r
+}  /* end extern "C" */\r
+#endif\r
+\r
+#endif /* md5_INCLUDED */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/md5module.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/md5module.c
new file mode 100644 (file)
index 0000000..04c969d
--- /dev/null
@@ -0,0 +1,339 @@
+\r
+/* MD5 module */\r
+\r
+/* This module provides an interface to the RSA Data Security,\r
+   Inc. MD5 Message-Digest Algorithm, described in RFC 1321.\r
+   It requires the files md5c.c and md5.h (which are slightly changed\r
+   from the versions in the RFC to avoid the "global.h" file.) */\r
+\r
+\r
+/* MD5 objects */\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "md5.h"\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    md5_state_t         md5;            /* the context holder */\r
+} md5object;\r
+\r
+static PyTypeObject MD5type;\r
+\r
+#define is_md5object(v)         ((v)->ob_type == &MD5type)\r
+\r
+static md5object *\r
+newmd5object(void)\r
+{\r
+    md5object *md5p;\r
+\r
+    md5p = PyObject_New(md5object, &MD5type);\r
+    if (md5p == NULL)\r
+        return NULL;\r
+\r
+    md5_init(&md5p->md5);       /* actual initialisation */\r
+    return md5p;\r
+}\r
+\r
+\r
+/* MD5 methods */\r
+\r
+static void\r
+md5_dealloc(md5object *md5p)\r
+{\r
+    PyObject_Del(md5p);\r
+}\r
+\r
+\r
+/* MD5 methods-as-attributes */\r
+\r
+static PyObject *\r
+md5_update(md5object *self, PyObject *args)\r
+{\r
+    Py_buffer view;\r
+    Py_ssize_t n;\r
+    unsigned char *buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:update", &view))\r
+        return NULL;\r
+\r
+    n = view.len;\r
+    buf = (unsigned char *) view.buf;\r
+    while (n > 0) {\r
+        Py_ssize_t nbytes;\r
+        if (n > INT_MAX)\r
+            nbytes = INT_MAX;\r
+        else\r
+            nbytes = n;\r
+        md5_append(&self->md5, buf,\r
+                   Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int));\r
+        buf += nbytes;\r
+        n -= nbytes;\r
+    }\r
+\r
+    PyBuffer_Release(&view);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(update_doc,\r
+"update (arg)\n\\r
+\n\\r
+Update the md5 object with the string arg. Repeated calls are\n\\r
+equivalent to a single call with the concatenation of all the\n\\r
+arguments.");\r
+\r
+\r
+static PyObject *\r
+md5_digest(md5object *self)\r
+{\r
+    md5_state_t mdContext;\r
+    unsigned char aDigest[16];\r
+\r
+    /* make a temporary copy, and perform the final */\r
+    mdContext = self->md5;\r
+    md5_finish(&mdContext, aDigest);\r
+\r
+    return PyString_FromStringAndSize((char *)aDigest, 16);\r
+}\r
+\r
+PyDoc_STRVAR(digest_doc,\r
+"digest() -> string\n\\r
+\n\\r
+Return the digest of the strings passed to the update() method so\n\\r
+far. This is a 16-byte string which may contain non-ASCII characters,\n\\r
+including null bytes.");\r
+\r
+\r
+static PyObject *\r
+md5_hexdigest(md5object *self)\r
+{\r
+    md5_state_t mdContext;\r
+    unsigned char digest[16];\r
+    unsigned char hexdigest[32];\r
+    int i, j;\r
+\r
+    /* make a temporary copy, and perform the final */\r
+    mdContext = self->md5;\r
+    md5_finish(&mdContext, digest);\r
+\r
+    /* Make hex version of the digest */\r
+    for(i=j=0; i<16; i++) {\r
+        char c;\r
+        c = (digest[i] >> 4) & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hexdigest[j++] = c;\r
+        c = (digest[i] & 0xf);\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hexdigest[j++] = c;\r
+    }\r
+    return PyString_FromStringAndSize((char*)hexdigest, 32);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(hexdigest_doc,\r
+"hexdigest() -> string\n\\r
+\n\\r
+Like digest(), but returns the digest as a string of hexadecimal digits.");\r
+\r
+\r
+static PyObject *\r
+md5_copy(md5object *self)\r
+{\r
+    md5object *md5p;\r
+\r
+    if ((md5p = newmd5object()) == NULL)\r
+        return NULL;\r
+\r
+    md5p->md5 = self->md5;\r
+\r
+    return (PyObject *)md5p;\r
+}\r
+\r
+PyDoc_STRVAR(copy_doc,\r
+"copy() -> md5 object\n\\r
+\n\\r
+Return a copy (``clone'') of the md5 object.");\r
+\r
+\r
+static PyMethodDef md5_methods[] = {\r
+    {"update",    (PyCFunction)md5_update,    METH_VARARGS, update_doc},\r
+    {"digest",    (PyCFunction)md5_digest,    METH_NOARGS,  digest_doc},\r
+    {"hexdigest", (PyCFunction)md5_hexdigest, METH_NOARGS,  hexdigest_doc},\r
+    {"copy",      (PyCFunction)md5_copy,      METH_NOARGS,  copy_doc},\r
+    {NULL, NULL}                             /* sentinel */\r
+};\r
+\r
+static PyObject *\r
+md5_get_block_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(64);\r
+}\r
+\r
+static PyObject *\r
+md5_get_digest_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(16);\r
+}\r
+\r
+static PyObject *\r
+md5_get_name(PyObject *self, void *closure)\r
+{\r
+    return PyString_FromStringAndSize("MD5", 3);\r
+}\r
+\r
+static PyGetSetDef md5_getseters[] = {\r
+    {"digest_size",\r
+     (getter)md5_get_digest_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"block_size",\r
+     (getter)md5_get_block_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"name",\r
+     (getter)md5_get_name, NULL,\r
+     NULL,\r
+     NULL},\r
+    /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
+     * the old sha module also supported 'digestsize'.  ugh. */\r
+    {"digestsize",\r
+     (getter)md5_get_digest_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module implements the interface to RSA's MD5 message digest\n\\r
+algorithm (see also Internet RFC 1321). Its use is quite\n\\r
+straightforward: use the new() to create an md5 object. You can now\n\\r
+feed this object with arbitrary strings using the update() method, and\n\\r
+at any point you can ask it for the digest (a strong kind of 128-bit\n\\r
+checksum, a.k.a. ``fingerprint'') of the concatenation of the strings\n\\r
+fed to it so far using the digest() method.\n\\r
+\n\\r
+Functions:\n\\r
+\n\\r
+new([arg]) -- return a new md5 object, initialized with arg if provided\n\\r
+md5([arg]) -- DEPRECATED, same as new, but for compatibility\n\\r
+\n\\r
+Special Objects:\n\\r
+\n\\r
+MD5Type -- type object for md5 objects");\r
+\r
+PyDoc_STRVAR(md5type_doc,\r
+"An md5 represents the object used to calculate the MD5 checksum of a\n\\r
+string of information.\n\\r
+\n\\r
+Methods:\n\\r
+\n\\r
+update() -- updates the current digest with an additional string\n\\r
+digest() -- return the current digest value\n\\r
+hexdigest() -- return the current digest as a string of hexadecimal digits\n\\r
+copy() -- return a copy of the current md5 object");\r
+\r
+static PyTypeObject MD5type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_md5.md5",                   /*tp_name*/\r
+    sizeof(md5object),            /*tp_size*/\r
+    0,                            /*tp_itemsize*/\r
+    /* methods */\r
+    (destructor)md5_dealloc,  /*tp_dealloc*/\r
+    0,                            /*tp_print*/\r
+    0,                        /*tp_getattr*/\r
+    0,                            /*tp_setattr*/\r
+    0,                            /*tp_compare*/\r
+    0,                            /*tp_repr*/\r
+    0,                            /*tp_as_number*/\r
+    0,                        /*tp_as_sequence*/\r
+    0,                            /*tp_as_mapping*/\r
+    0,                            /*tp_hash*/\r
+    0,                            /*tp_call*/\r
+    0,                            /*tp_str*/\r
+    0,                            /*tp_getattro*/\r
+    0,                            /*tp_setattro*/\r
+    0,                            /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT,           /*tp_flags*/\r
+    md5type_doc,                  /*tp_doc*/\r
+    0,                        /*tp_traverse*/\r
+    0,                            /*tp_clear*/\r
+    0,                            /*tp_richcompare*/\r
+    0,                            /*tp_weaklistoffset*/\r
+    0,                            /*tp_iter*/\r
+    0,                            /*tp_iternext*/\r
+    md5_methods,                  /*tp_methods*/\r
+    0,                            /*tp_members*/\r
+    md5_getseters,            /*tp_getset*/\r
+};\r
+\r
+\r
+/* MD5 functions */\r
+\r
+static PyObject *\r
+MD5_new(PyObject *self, PyObject *args)\r
+{\r
+    md5object *md5p;\r
+    Py_buffer view = { 0 };\r
+    Py_ssize_t n;\r
+    unsigned char *buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "|s*:new", &view))\r
+        return NULL;\r
+\r
+    if ((md5p = newmd5object()) == NULL) {\r
+        PyBuffer_Release(&view);\r
+        return NULL;\r
+    }\r
+\r
+    n = view.len;\r
+    buf = (unsigned char *) view.buf;\r
+    while (n > 0) {\r
+        Py_ssize_t nbytes;\r
+        if (n > INT_MAX)\r
+            nbytes = INT_MAX;\r
+        else\r
+            nbytes = n;\r
+        md5_append(&md5p->md5, buf,\r
+                   Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int));\r
+        buf += nbytes;\r
+        n -= nbytes;\r
+    }\r
+    PyBuffer_Release(&view);\r
+\r
+    return (PyObject *)md5p;\r
+}\r
+\r
+PyDoc_STRVAR(new_doc,\r
+"new([arg]) -> md5 object\n\\r
+\n\\r
+Return a new md5 object. If arg is present, the method call update(arg)\n\\r
+is made.");\r
+\r
+\r
+/* List of functions exported by this module */\r
+\r
+static PyMethodDef md5_functions[] = {\r
+    {"new",             (PyCFunction)MD5_new, METH_VARARGS, new_doc},\r
+    {NULL,              NULL}   /* Sentinel */\r
+};\r
+\r
+\r
+/* Initialize this module. */\r
+\r
+PyMODINIT_FUNC\r
+init_md5(void)\r
+{\r
+    PyObject *m, *d;\r
+\r
+    Py_TYPE(&MD5type) = &PyType_Type;\r
+    if (PyType_Ready(&MD5type) < 0)\r
+        return;\r
+    m = Py_InitModule3("_md5", md5_functions, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+    d = PyModule_GetDict(m);\r
+    PyDict_SetItemString(d, "MD5Type", (PyObject *)&MD5type);\r
+    PyModule_AddIntConstant(m, "digest_size", 16);\r
+    /* No need to check the error here, the caller will do that */\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/operator.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/operator.c
new file mode 100644 (file)
index 0000000..92d4a1f
--- /dev/null
@@ -0,0 +1,930 @@
+\r
+#include "Python.h"\r
+\r
+PyDoc_STRVAR(operator_doc,\r
+"Operator interface.\n\\r
+\n\\r
+This module exports a set of functions implemented in C corresponding\n\\r
+to the intrinsic operators of Python.  For example, operator.add(x, y)\n\\r
+is equivalent to the expression x+y.  The function names are those\n\\r
+used for special methods; variants without leading and trailing\n\\r
+'__' are also provided for convenience.");\r
+\r
+#define spam1(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \\r
+  return AOP(a1); }\r
+\r
+#define spam2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  return AOP(a1,a2); }\r
+\r
+#define spamoi(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1; int a2; \\r
+  if(! PyArg_ParseTuple(a,"Oi:" #OP,&a1,&a2)) return NULL; \\r
+  return AOP(a1,a2); }\r
+\r
+#define spam2n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  if(-1 == AOP(a1,a2)) return NULL; \\r
+  Py_INCREF(Py_None); \\r
+  return Py_None; }\r
+\r
+#define spam3n(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2, *a3; \\r
+  if(! PyArg_UnpackTuple(a,#OP,3,3,&a1,&a2,&a3)) return NULL; \\r
+  if(-1 == AOP(a1,a2,a3)) return NULL; \\r
+  Py_INCREF(Py_None); \\r
+  return Py_None; }\r
+\r
+#define spami(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a1) { \\r
+  long r; \\r
+  if(-1 == (r=AOP(a1))) return NULL; \\r
+  return PyBool_FromLong(r); }\r
+\r
+#define spami2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; long r; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  if(-1 == (r=AOP(a1,a2))) return NULL; \\r
+  return PyInt_FromLong(r); }\r
+\r
+#define spamn2(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; Py_ssize_t r; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  if(-1 == (r=AOP(a1,a2))) return NULL; \\r
+  return PyInt_FromSsize_t(r); }\r
+\r
+#define spami2b(OP,AOP) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; long r; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  if(-1 == (r=AOP(a1,a2))) return NULL; \\r
+  return PyBool_FromLong(r); }\r
+\r
+#define spamrc(OP,A) static PyObject *OP(PyObject *s, PyObject *a) { \\r
+  PyObject *a1, *a2; \\r
+  if(! PyArg_UnpackTuple(a,#OP,2,2,&a1,&a2)) return NULL; \\r
+  return PyObject_RichCompare(a1,a2,A); }\r
+\r
+/* Deprecated operators that need warnings. */\r
+static int\r
+op_isCallable(PyObject *x)\r
+{\r
+    if (PyErr_WarnPy3k("operator.isCallable() is not supported in 3.x. "\r
+                       "Use hasattr(obj, '__call__').", 1) < 0)\r
+        return -1;\r
+    return PyCallable_Check(x);\r
+}\r
+\r
+static int\r
+op_sequenceIncludes(PyObject *seq, PyObject* ob)\r
+{\r
+    if (PyErr_WarnPy3k("operator.sequenceIncludes() is not supported "\r
+                       "in 3.x. Use operator.contains().", 1) < 0)\r
+        return -1;\r
+    return PySequence_Contains(seq, ob);\r
+}\r
+\r
+spami(isCallable       , op_isCallable)\r
+spami(isNumberType     , PyNumber_Check)\r
+spami(truth            , PyObject_IsTrue)\r
+spam2(op_add           , PyNumber_Add)\r
+spam2(op_sub           , PyNumber_Subtract)\r
+spam2(op_mul           , PyNumber_Multiply)\r
+spam2(op_div           , PyNumber_Divide)\r
+spam2(op_floordiv      , PyNumber_FloorDivide)\r
+spam2(op_truediv       , PyNumber_TrueDivide)\r
+spam2(op_mod           , PyNumber_Remainder)\r
+spam1(op_neg           , PyNumber_Negative)\r
+spam1(op_pos           , PyNumber_Positive)\r
+spam1(op_abs           , PyNumber_Absolute)\r
+spam1(op_inv           , PyNumber_Invert)\r
+spam1(op_invert        , PyNumber_Invert)\r
+spam2(op_lshift        , PyNumber_Lshift)\r
+spam2(op_rshift        , PyNumber_Rshift)\r
+spami(op_not_          , PyObject_Not)\r
+spam2(op_and_          , PyNumber_And)\r
+spam2(op_xor           , PyNumber_Xor)\r
+spam2(op_or_           , PyNumber_Or)\r
+spam2(op_iadd          , PyNumber_InPlaceAdd)\r
+spam2(op_isub          , PyNumber_InPlaceSubtract)\r
+spam2(op_imul          , PyNumber_InPlaceMultiply)\r
+spam2(op_idiv          , PyNumber_InPlaceDivide)\r
+spam2(op_ifloordiv     , PyNumber_InPlaceFloorDivide)\r
+spam2(op_itruediv      , PyNumber_InPlaceTrueDivide)\r
+spam2(op_imod          , PyNumber_InPlaceRemainder)\r
+spam2(op_ilshift       , PyNumber_InPlaceLshift)\r
+spam2(op_irshift       , PyNumber_InPlaceRshift)\r
+spam2(op_iand          , PyNumber_InPlaceAnd)\r
+spam2(op_ixor          , PyNumber_InPlaceXor)\r
+spam2(op_ior           , PyNumber_InPlaceOr)\r
+spami(isSequenceType   , PySequence_Check)\r
+spam2(op_concat        , PySequence_Concat)\r
+spamoi(op_repeat       , PySequence_Repeat)\r
+spam2(op_iconcat       , PySequence_InPlaceConcat)\r
+spamoi(op_irepeat      , PySequence_InPlaceRepeat)\r
+spami2b(op_contains     , PySequence_Contains)\r
+spami2b(sequenceIncludes, op_sequenceIncludes)\r
+spamn2(indexOf         , PySequence_Index)\r
+spamn2(countOf         , PySequence_Count)\r
+spami(isMappingType    , PyMapping_Check)\r
+spam2(op_getitem       , PyObject_GetItem)\r
+spam2n(op_delitem       , PyObject_DelItem)\r
+spam3n(op_setitem      , PyObject_SetItem)\r
+spamrc(op_lt           , Py_LT)\r
+spamrc(op_le           , Py_LE)\r
+spamrc(op_eq           , Py_EQ)\r
+spamrc(op_ne           , Py_NE)\r
+spamrc(op_gt           , Py_GT)\r
+spamrc(op_ge           , Py_GE)\r
+\r
+static PyObject*\r
+op_pow(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1, *a2;\r
+    if (PyArg_UnpackTuple(a,"pow", 2, 2, &a1, &a2))\r
+        return PyNumber_Power(a1, a2, Py_None);\r
+    return NULL;\r
+}\r
+\r
+static PyObject*\r
+op_ipow(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1, *a2;\r
+    if (PyArg_UnpackTuple(a,"ipow", 2, 2, &a1, &a2))\r
+        return PyNumber_InPlacePower(a1, a2, Py_None);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+op_index(PyObject *s, PyObject *a)\r
+{\r
+    return PyNumber_Index(a);\r
+}\r
+\r
+static PyObject*\r
+is_(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1, *a2, *result = NULL;\r
+    if (PyArg_UnpackTuple(a,"is_", 2, 2, &a1, &a2)) {\r
+        result = (a1 == a2) ? Py_True : Py_False;\r
+        Py_INCREF(result);\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject*\r
+is_not(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1, *a2, *result = NULL;\r
+    if (PyArg_UnpackTuple(a,"is_not", 2, 2, &a1, &a2)) {\r
+        result = (a1 != a2) ? Py_True : Py_False;\r
+        Py_INCREF(result);\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject*\r
+op_getslice(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1;\r
+    Py_ssize_t a2, a3;\r
+\r
+    if (!PyArg_ParseTuple(a, "Onn:getslice", &a1, &a2, &a3))\r
+        return NULL;\r
+    return PySequence_GetSlice(a1, a2, a3);\r
+}\r
+\r
+static PyObject*\r
+op_setslice(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1, *a4;\r
+    Py_ssize_t a2, a3;\r
+\r
+    if (!PyArg_ParseTuple(a, "OnnO:setslice", &a1, &a2, &a3, &a4))\r
+        return NULL;\r
+\r
+    if (-1 == PySequence_SetSlice(a1, a2, a3, a4))\r
+        return NULL;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyObject*\r
+op_delslice(PyObject *s, PyObject *a)\r
+{\r
+    PyObject *a1;\r
+    Py_ssize_t a2, a3;\r
+\r
+    if (!PyArg_ParseTuple(a, "Onn:delslice", &a1, &a2, &a3))\r
+        return NULL;\r
+\r
+    if (-1 == PySequence_DelSlice(a1, a2, a3))\r
+        return NULL;\r
+\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+#undef spam1\r
+#undef spam2\r
+#undef spam1o\r
+#undef spam1o\r
+#define spam1(OP,DOC) {#OP, OP, METH_VARARGS, PyDoc_STR(DOC)},\r
+#define spam2(OP,ALTOP,DOC) {#OP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)}, \\r
+                           {#ALTOP, op_##OP, METH_VARARGS, PyDoc_STR(DOC)},\r
+#define spam1o(OP,DOC) {#OP, OP, METH_O, PyDoc_STR(DOC)},\r
+#define spam2o(OP,ALTOP,DOC) {#OP, op_##OP, METH_O, PyDoc_STR(DOC)}, \\r
+                           {#ALTOP, op_##OP, METH_O, PyDoc_STR(DOC)},\r
+\r
+\r
+\r
+/* compare_digest **********************************************************/\r
+\r
+/*\r
+ * timing safe compare\r
+ *\r
+ * Returns 1 of the strings are equal.\r
+ * In case of len(a) != len(b) the function tries to keep the timing\r
+ * dependent on the length of b. CPU cache locally may still alter timing\r
+ * a bit.\r
+ */\r
+static int\r
+_tscmp(const unsigned char *a, const unsigned char *b,\r
+        Py_ssize_t len_a, Py_ssize_t len_b)\r
+{\r
+    /* The volatile type declarations make sure that the compiler has no\r
+     * chance to optimize and fold the code in any way that may change\r
+     * the timing.\r
+     */\r
+    volatile Py_ssize_t length;\r
+    volatile const unsigned char *left;\r
+    volatile const unsigned char *right;\r
+    Py_ssize_t i;\r
+    unsigned char result;\r
+\r
+    /* loop count depends on length of b */\r
+    length = len_b;\r
+    left = NULL;\r
+    right = b;\r
+\r
+    /* don't use else here to keep the amount of CPU instructions constant,\r
+     * volatile forces re-evaluation\r
+     *  */\r
+    if (len_a == length) {\r
+        left = *((volatile const unsigned char**)&a);\r
+        result = 0;\r
+    }\r
+    if (len_a != length) {\r
+        left = b;\r
+        result = 1;\r
+    }\r
+\r
+    for (i=0; i < length; i++) {\r
+        result |= *left++ ^ *right++;\r
+    }\r
+\r
+    return (result == 0);\r
+}\r
+\r
+PyDoc_STRVAR(compare_digest__doc__,\r
+"compare_digest(a, b) -> bool\n"\r
+"\n"\r
+"Return 'a == b'.  This function uses an approach designed to prevent\n"\r
+"timing analysis, making it appropriate for cryptography.\n"\r
+"a and b must both be of the same type: either str (ASCII only),\n"\r
+"or any type that supports the buffer protocol (e.g. bytes).\n"\r
+"\n"\r
+"Note: If a and b are of different lengths, or if an error occurs,\n"\r
+"a timing attack could theoretically reveal information about the\n"\r
+"types and lengths of a and b--but not their values.\n");\r
+\r
+static PyObject*\r
+compare_digest(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *a, *b;\r
+    int rc;\r
+\r
+    if (!PyArg_ParseTuple(args, "OO:compare_digest", &a, &b)) {\r
+        return NULL;\r
+    }\r
+\r
+    /* Unicode string */\r
+    if (PyUnicode_Check(a) && PyUnicode_Check(b)) {\r
+        rc = _tscmp((const unsigned char *)PyUnicode_AS_DATA(a),\r
+                    (const unsigned char *)PyUnicode_AS_DATA(b),\r
+                    PyUnicode_GET_DATA_SIZE(a),\r
+                    PyUnicode_GET_DATA_SIZE(b));\r
+    }\r
+    /* fallback to buffer interface for bytes, bytesarray and other */\r
+    else {\r
+        Py_buffer view_a;\r
+        Py_buffer view_b;\r
+\r
+        if (PyObject_CheckBuffer(a) == 0 && PyObject_CheckBuffer(b) == 0) {\r
+            PyErr_Format(PyExc_TypeError,\r
+                         "unsupported operand types(s) or combination of types: "\r
+                         "'%.100s' and '%.100s'",\r
+                         Py_TYPE(a)->tp_name, Py_TYPE(b)->tp_name);\r
+            return NULL;\r
+        }\r
+\r
+        if (PyObject_GetBuffer(a, &view_a, PyBUF_SIMPLE) == -1) {\r
+            return NULL;\r
+        }\r
+        if (view_a.ndim > 1) {\r
+            PyErr_SetString(PyExc_BufferError,\r
+                            "Buffer must be single dimension");\r
+            PyBuffer_Release(&view_a);\r
+            return NULL;\r
+        }\r
+\r
+        if (PyObject_GetBuffer(b, &view_b, PyBUF_SIMPLE) == -1) {\r
+            PyBuffer_Release(&view_a);\r
+            return NULL;\r
+        }\r
+        if (view_b.ndim > 1) {\r
+            PyErr_SetString(PyExc_BufferError,\r
+                            "Buffer must be single dimension");\r
+            PyBuffer_Release(&view_a);\r
+            PyBuffer_Release(&view_b);\r
+            return NULL;\r
+        }\r
+\r
+        rc = _tscmp((const unsigned char*)view_a.buf,\r
+                    (const unsigned char*)view_b.buf,\r
+                    view_a.len,\r
+                    view_b.len);\r
+\r
+        PyBuffer_Release(&view_a);\r
+        PyBuffer_Release(&view_b);\r
+    }\r
+\r
+    return PyBool_FromLong(rc);\r
+}\r
+\r
+static struct PyMethodDef operator_methods[] = {\r
+\r
+spam1o(isCallable,\r
+ "isCallable(a) -- Same as callable(a).")\r
+spam1o(isNumberType,\r
+ "isNumberType(a) -- Return True if a has a numeric type, False otherwise.")\r
+spam1o(isSequenceType,\r
+ "isSequenceType(a) -- Return True if a has a sequence type, False otherwise.")\r
+spam1o(truth,\r
+ "truth(a) -- Return True if a is true, False otherwise.")\r
+spam2(contains,__contains__,\r
+ "contains(a, b) -- Same as b in a (note reversed operands).")\r
+spam1(sequenceIncludes,\r
+ "sequenceIncludes(a, b) -- Same as b in a (note reversed operands; deprecated).")\r
+spam1(indexOf,\r
+ "indexOf(a, b) -- Return the first index of b in a.")\r
+spam1(countOf,\r
+ "countOf(a, b) -- Return the number of times b occurs in a.")\r
+spam1o(isMappingType,\r
+ "isMappingType(a) -- Return True if a has a mapping type, False otherwise.")\r
+\r
+spam1(is_, "is_(a, b) -- Same as a is b.")\r
+spam1(is_not, "is_not(a, b) -- Same as a is not b.")\r
+spam2o(index, __index__, "index(a) -- Same as a.__index__()")\r
+spam2(add,__add__, "add(a, b) -- Same as a + b.")\r
+spam2(sub,__sub__, "sub(a, b) -- Same as a - b.")\r
+spam2(mul,__mul__, "mul(a, b) -- Same as a * b.")\r
+spam2(div,__div__, "div(a, b) -- Same as a / b when __future__.division is not in effect.")\r
+spam2(floordiv,__floordiv__, "floordiv(a, b) -- Same as a // b.")\r
+spam2(truediv,__truediv__, "truediv(a, b) -- Same as a / b when __future__.division is in effect.")\r
+spam2(mod,__mod__, "mod(a, b) -- Same as a % b.")\r
+spam2o(neg,__neg__, "neg(a) -- Same as -a.")\r
+spam2o(pos,__pos__, "pos(a) -- Same as +a.")\r
+spam2o(abs,__abs__, "abs(a) -- Same as abs(a).")\r
+spam2o(inv,__inv__, "inv(a) -- Same as ~a.")\r
+spam2o(invert,__invert__, "invert(a) -- Same as ~a.")\r
+spam2(lshift,__lshift__, "lshift(a, b) -- Same as a << b.")\r
+spam2(rshift,__rshift__, "rshift(a, b) -- Same as a >> b.")\r
+spam2o(not_,__not__, "not_(a) -- Same as not a.")\r
+spam2(and_,__and__, "and_(a, b) -- Same as a & b.")\r
+spam2(xor,__xor__, "xor(a, b) -- Same as a ^ b.")\r
+spam2(or_,__or__, "or_(a, b) -- Same as a | b.")\r
+spam2(iadd,__iadd__, "a = iadd(a, b) -- Same as a += b.")\r
+spam2(isub,__isub__, "a = isub(a, b) -- Same as a -= b.")\r
+spam2(imul,__imul__, "a = imul(a, b) -- Same as a *= b.")\r
+spam2(idiv,__idiv__, "a = idiv(a, b) -- Same as a /= b when __future__.division is not in effect.")\r
+spam2(ifloordiv,__ifloordiv__, "a = ifloordiv(a, b) -- Same as a //= b.")\r
+spam2(itruediv,__itruediv__, "a = itruediv(a, b) -- Same as a /= b when __future__.division is in effect.")\r
+spam2(imod,__imod__, "a = imod(a, b) -- Same as a %= b.")\r
+spam2(ilshift,__ilshift__, "a = ilshift(a, b) -- Same as a <<= b.")\r
+spam2(irshift,__irshift__, "a = irshift(a, b) -- Same as a >>= b.")\r
+spam2(iand,__iand__, "a = iand(a, b) -- Same as a &= b.")\r
+spam2(ixor,__ixor__, "a = ixor(a, b) -- Same as a ^= b.")\r
+spam2(ior,__ior__, "a = ior(a, b) -- Same as a |= b.")\r
+spam2(concat,__concat__,\r
+ "concat(a, b) -- Same as a + b, for a and b sequences.")\r
+spam2(repeat,__repeat__,\r
+ "repeat(a, b) -- Return a * b, where a is a sequence, and b is an integer.")\r
+spam2(iconcat,__iconcat__,\r
+ "a = iconcat(a, b) -- Same as a += b, for a and b sequences.")\r
+spam2(irepeat,__irepeat__,\r
+ "a = irepeat(a, b) -- Same as a *= b, where a is a sequence, and b is an integer.")\r
+spam2(getitem,__getitem__,\r
+ "getitem(a, b) -- Same as a[b].")\r
+spam2(setitem,__setitem__,\r
+ "setitem(a, b, c) -- Same as a[b] = c.")\r
+spam2(delitem,__delitem__,\r
+ "delitem(a, b) -- Same as del a[b].")\r
+spam2(pow,__pow__, "pow(a, b) -- Same as a ** b.")\r
+spam2(ipow,__ipow__, "a = ipow(a, b) -- Same as a **= b.")\r
+spam2(getslice,__getslice__,\r
+ "getslice(a, b, c) -- Same as a[b:c].")\r
+spam2(setslice,__setslice__,\r
+"setslice(a, b, c, d) -- Same as a[b:c] = d.")\r
+spam2(delslice,__delslice__,\r
+"delslice(a, b, c) -- Same as del a[b:c].")\r
+spam2(lt,__lt__, "lt(a, b) -- Same as a<b.")\r
+spam2(le,__le__, "le(a, b) -- Same as a<=b.")\r
+spam2(eq,__eq__, "eq(a, b) -- Same as a==b.")\r
+spam2(ne,__ne__, "ne(a, b) -- Same as a!=b.")\r
+spam2(gt,__gt__, "gt(a, b) -- Same as a>b.")\r
+spam2(ge,__ge__, "ge(a, b) -- Same as a>=b.")\r
+\r
+    {"_compare_digest", (PyCFunction)compare_digest, METH_VARARGS,\r
+     compare_digest__doc__},\r
+    {NULL,              NULL}           /* sentinel */\r
+\r
+};\r
+\r
+/* itemgetter object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t nitems;\r
+    PyObject *item;\r
+} itemgetterobject;\r
+\r
+static PyTypeObject itemgetter_type;\r
+\r
+static PyObject *\r
+itemgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    itemgetterobject *ig;\r
+    PyObject *item;\r
+    Py_ssize_t nitems;\r
+\r
+    if (!_PyArg_NoKeywords("itemgetter()", kwds))\r
+        return NULL;\r
+\r
+    nitems = PyTuple_GET_SIZE(args);\r
+    if (nitems <= 1) {\r
+        if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &item))\r
+            return NULL;\r
+    } else\r
+        item = args;\r
+\r
+    /* create itemgetterobject structure */\r
+    ig = PyObject_GC_New(itemgetterobject, &itemgetter_type);\r
+    if (ig == NULL)\r
+        return NULL;\r
+\r
+    Py_INCREF(item);\r
+    ig->item = item;\r
+    ig->nitems = nitems;\r
+\r
+    PyObject_GC_Track(ig);\r
+    return (PyObject *)ig;\r
+}\r
+\r
+static void\r
+itemgetter_dealloc(itemgetterobject *ig)\r
+{\r
+    PyObject_GC_UnTrack(ig);\r
+    Py_XDECREF(ig->item);\r
+    PyObject_GC_Del(ig);\r
+}\r
+\r
+static int\r
+itemgetter_traverse(itemgetterobject *ig, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(ig->item);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+itemgetter_call(itemgetterobject *ig, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *obj, *result;\r
+    Py_ssize_t i, nitems=ig->nitems;\r
+\r
+    if (!PyArg_UnpackTuple(args, "itemgetter", 1, 1, &obj))\r
+        return NULL;\r
+    if (nitems == 1)\r
+        return PyObject_GetItem(obj, ig->item);\r
+\r
+    assert(PyTuple_Check(ig->item));\r
+    assert(PyTuple_GET_SIZE(ig->item) == nitems);\r
+\r
+    result = PyTuple_New(nitems);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    for (i=0 ; i < nitems ; i++) {\r
+        PyObject *item, *val;\r
+        item = PyTuple_GET_ITEM(ig->item, i);\r
+        val = PyObject_GetItem(obj, item);\r
+        if (val == NULL) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(result, i, val);\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(itemgetter_doc,\r
+"itemgetter(item, ...) --> itemgetter object\n\\r
+\n\\r
+Return a callable object that fetches the given item(s) from its operand.\n\\r
+After f = itemgetter(2), the call f(r) returns r[2].\n\\r
+After g = itemgetter(2, 5, 3), the call g(r) returns (r[2], r[5], r[3])");\r
+\r
+static PyTypeObject itemgetter_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "operator.itemgetter",              /* tp_name */\r
+    sizeof(itemgetterobject),           /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)itemgetter_dealloc,     /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    (ternaryfunc)itemgetter_call,       /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */\r
+    itemgetter_doc,                     /* tp_doc */\r
+    (traverseproc)itemgetter_traverse,          /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    itemgetter_new,                     /* tp_new */\r
+    0,                                  /* tp_free */\r
+};\r
+\r
+\r
+/* attrgetter object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    Py_ssize_t nattrs;\r
+    PyObject *attr;\r
+} attrgetterobject;\r
+\r
+static PyTypeObject attrgetter_type;\r
+\r
+static PyObject *\r
+attrgetter_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    attrgetterobject *ag;\r
+    PyObject *attr;\r
+    Py_ssize_t nattrs;\r
+\r
+    if (!_PyArg_NoKeywords("attrgetter()", kwds))\r
+        return NULL;\r
+\r
+    nattrs = PyTuple_GET_SIZE(args);\r
+    if (nattrs <= 1) {\r
+        if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &attr))\r
+            return NULL;\r
+    } else\r
+        attr = args;\r
+\r
+    /* create attrgetterobject structure */\r
+    ag = PyObject_GC_New(attrgetterobject, &attrgetter_type);\r
+    if (ag == NULL)\r
+        return NULL;\r
+\r
+    Py_INCREF(attr);\r
+    ag->attr = attr;\r
+    ag->nattrs = nattrs;\r
+\r
+    PyObject_GC_Track(ag);\r
+    return (PyObject *)ag;\r
+}\r
+\r
+static void\r
+attrgetter_dealloc(attrgetterobject *ag)\r
+{\r
+    PyObject_GC_UnTrack(ag);\r
+    Py_XDECREF(ag->attr);\r
+    PyObject_GC_Del(ag);\r
+}\r
+\r
+static int\r
+attrgetter_traverse(attrgetterobject *ag, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(ag->attr);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+dotted_getattr(PyObject *obj, PyObject *attr)\r
+{\r
+    char *s, *p;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    if (PyUnicode_Check(attr)) {\r
+        attr = _PyUnicode_AsDefaultEncodedString(attr, NULL);\r
+        if (attr == NULL)\r
+            return NULL;\r
+    }\r
+#endif\r
+\r
+    if (!PyString_Check(attr)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "attribute name must be a string");\r
+        return NULL;\r
+    }\r
+\r
+    s = PyString_AS_STRING(attr);\r
+    Py_INCREF(obj);\r
+    for (;;) {\r
+        PyObject *newobj, *str;\r
+        p = strchr(s, '.');\r
+        str = p ? PyString_FromStringAndSize(s, (p-s)) :\r
+              PyString_FromString(s);\r
+        if (str == NULL) {\r
+            Py_DECREF(obj);\r
+            return NULL;\r
+        }\r
+        newobj = PyObject_GetAttr(obj, str);\r
+        Py_DECREF(str);\r
+        Py_DECREF(obj);\r
+        if (newobj == NULL)\r
+            return NULL;\r
+        obj = newobj;\r
+        if (p == NULL) break;\r
+        s = p+1;\r
+    }\r
+\r
+    return obj;\r
+}\r
+\r
+static PyObject *\r
+attrgetter_call(attrgetterobject *ag, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *obj, *result;\r
+    Py_ssize_t i, nattrs=ag->nattrs;\r
+\r
+    if (!PyArg_UnpackTuple(args, "attrgetter", 1, 1, &obj))\r
+        return NULL;\r
+    if (ag->nattrs == 1)\r
+        return dotted_getattr(obj, ag->attr);\r
+\r
+    assert(PyTuple_Check(ag->attr));\r
+    assert(PyTuple_GET_SIZE(ag->attr) == nattrs);\r
+\r
+    result = PyTuple_New(nattrs);\r
+    if (result == NULL)\r
+        return NULL;\r
+\r
+    for (i=0 ; i < nattrs ; i++) {\r
+        PyObject *attr, *val;\r
+        attr = PyTuple_GET_ITEM(ag->attr, i);\r
+        val = dotted_getattr(obj, attr);\r
+        if (val == NULL) {\r
+            Py_DECREF(result);\r
+            return NULL;\r
+        }\r
+        PyTuple_SET_ITEM(result, i, val);\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(attrgetter_doc,\r
+"attrgetter(attr, ...) --> attrgetter object\n\\r
+\n\\r
+Return a callable object that fetches the given attribute(s) from its operand.\n\\r
+After f = attrgetter('name'), the call f(r) returns r.name.\n\\r
+After g = attrgetter('name', 'date'), the call g(r) returns (r.name, r.date).\n\\r
+After h = attrgetter('name.first', 'name.last'), the call h(r) returns\n\\r
+(r.name.first, r.name.last).");\r
+\r
+static PyTypeObject attrgetter_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "operator.attrgetter",              /* tp_name */\r
+    sizeof(attrgetterobject),           /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)attrgetter_dealloc,     /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    (ternaryfunc)attrgetter_call,       /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,            /* tp_flags */\r
+    attrgetter_doc,                     /* tp_doc */\r
+    (traverseproc)attrgetter_traverse,          /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    attrgetter_new,                     /* tp_new */\r
+    0,                                  /* tp_free */\r
+};\r
+\r
+\r
+/* methodcaller object **********************************************************/\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject *name;\r
+    PyObject *args;\r
+    PyObject *kwds;\r
+} methodcallerobject;\r
+\r
+static PyTypeObject methodcaller_type;\r
+\r
+static PyObject *\r
+methodcaller_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    methodcallerobject *mc;\r
+    PyObject *name, *newargs;\r
+\r
+    if (PyTuple_GET_SIZE(args) < 1) {\r
+        PyErr_SetString(PyExc_TypeError, "methodcaller needs at least "\r
+                        "one argument, the method name");\r
+        return NULL;\r
+    }\r
+\r
+    /* create methodcallerobject structure */\r
+    mc = PyObject_GC_New(methodcallerobject, &methodcaller_type);\r
+    if (mc == NULL)\r
+        return NULL;\r
+\r
+    newargs = PyTuple_GetSlice(args, 1, PyTuple_GET_SIZE(args));\r
+    if (newargs == NULL) {\r
+        Py_DECREF(mc);\r
+        return NULL;\r
+    }\r
+    mc->args = newargs;\r
+\r
+    name = PyTuple_GET_ITEM(args, 0);\r
+    Py_INCREF(name);\r
+    mc->name = name;\r
+\r
+    Py_XINCREF(kwds);\r
+    mc->kwds = kwds;\r
+\r
+    PyObject_GC_Track(mc);\r
+    return (PyObject *)mc;\r
+}\r
+\r
+static void\r
+methodcaller_dealloc(methodcallerobject *mc)\r
+{\r
+    PyObject_GC_UnTrack(mc);\r
+    Py_XDECREF(mc->name);\r
+    Py_XDECREF(mc->args);\r
+    Py_XDECREF(mc->kwds);\r
+    PyObject_GC_Del(mc);\r
+}\r
+\r
+static int\r
+methodcaller_traverse(methodcallerobject *mc, visitproc visit, void *arg)\r
+{\r
+    Py_VISIT(mc->args);\r
+    Py_VISIT(mc->kwds);\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+methodcaller_call(methodcallerobject *mc, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *method, *obj, *result;\r
+\r
+    if (!PyArg_UnpackTuple(args, "methodcaller", 1, 1, &obj))\r
+        return NULL;\r
+    method = PyObject_GetAttr(obj, mc->name);\r
+    if (method == NULL)\r
+        return NULL;\r
+    result = PyObject_Call(method, mc->args, mc->kwds);\r
+    Py_DECREF(method);\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(methodcaller_doc,\r
+"methodcaller(name, ...) --> methodcaller object\n\\r
+\n\\r
+Return a callable object that calls the given method on its operand.\n\\r
+After f = methodcaller('name'), the call f(r) returns r.name().\n\\r
+After g = methodcaller('name', 'date', foo=1), the call g(r) returns\n\\r
+r.name('date', foo=1).");\r
+\r
+static PyTypeObject methodcaller_type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "operator.methodcaller",            /* tp_name */\r
+    sizeof(methodcallerobject),         /* tp_basicsize */\r
+    0,                                  /* tp_itemsize */\r
+    /* methods */\r
+    (destructor)methodcaller_dealloc, /* tp_dealloc */\r
+    0,                                  /* tp_print */\r
+    0,                                  /* tp_getattr */\r
+    0,                                  /* tp_setattr */\r
+    0,                                  /* tp_compare */\r
+    0,                                  /* tp_repr */\r
+    0,                                  /* tp_as_number */\r
+    0,                                  /* tp_as_sequence */\r
+    0,                                  /* tp_as_mapping */\r
+    0,                                  /* tp_hash */\r
+    (ternaryfunc)methodcaller_call,     /* tp_call */\r
+    0,                                  /* tp_str */\r
+    PyObject_GenericGetAttr,            /* tp_getattro */\r
+    0,                                  /* tp_setattro */\r
+    0,                                  /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */\r
+    methodcaller_doc,                           /* tp_doc */\r
+    (traverseproc)methodcaller_traverse,        /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    0,                                  /* tp_methods */\r
+    0,                                  /* tp_members */\r
+    0,                                  /* tp_getset */\r
+    0,                                  /* tp_base */\r
+    0,                                  /* tp_dict */\r
+    0,                                  /* tp_descr_get */\r
+    0,                                  /* tp_descr_set */\r
+    0,                                  /* tp_dictoffset */\r
+    0,                                  /* tp_init */\r
+    0,                                  /* tp_alloc */\r
+    methodcaller_new,                   /* tp_new */\r
+    0,                                  /* tp_free */\r
+};\r
+\r
+\r
+/* Initialization function for the module (*must* be called initoperator) */\r
+\r
+PyMODINIT_FUNC\r
+initoperator(void)\r
+{\r
+    PyObject *m;\r
+\r
+    /* Create the module and add the functions */\r
+    m = Py_InitModule4("operator", operator_methods, operator_doc,\r
+                   (PyObject*)NULL, PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    if (PyType_Ready(&itemgetter_type) < 0)\r
+        return;\r
+    Py_INCREF(&itemgetter_type);\r
+    PyModule_AddObject(m, "itemgetter", (PyObject *)&itemgetter_type);\r
+\r
+    if (PyType_Ready(&attrgetter_type) < 0)\r
+        return;\r
+    Py_INCREF(&attrgetter_type);\r
+    PyModule_AddObject(m, "attrgetter", (PyObject *)&attrgetter_type);\r
+\r
+    if (PyType_Ready(&methodcaller_type) < 0)\r
+        return;\r
+    Py_INCREF(&methodcaller_type);\r
+    PyModule_AddObject(m, "methodcaller", (PyObject *)&methodcaller_type);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/parsermodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/parsermodule.c
new file mode 100644 (file)
index 0000000..6e3f1c8
--- /dev/null
@@ -0,0 +1,3493 @@
+/*  parsermodule.c\r
+ *\r
+ *  Copyright 1995-1996 by Fred L. Drake, Jr. and Virginia Polytechnic\r
+ *  Institute and State University, Blacksburg, Virginia, USA.\r
+ *  Portions copyright 1991-1995 by Stichting Mathematisch Centrum,\r
+ *  Amsterdam, The Netherlands.  Copying is permitted under the terms\r
+ *  associated with the main Python distribution, with the additional\r
+ *  restriction that this additional notice be included and maintained\r
+ *  on all distributed copies.\r
+ *\r
+ *  This module serves to replace the original parser module written\r
+ *  by Guido.  The functionality is not matched precisely, but the\r
+ *  original may be implemented on top of this.  This is desirable\r
+ *  since the source of the text to be parsed is now divorced from\r
+ *  this interface.\r
+ *\r
+ *  Unlike the prior interface, the ability to give a parse tree\r
+ *  produced by Python code as a tuple to the compiler is enabled by\r
+ *  this module.  See the documentation for more details.\r
+ *\r
+ *  I've added some annotations that help with the lint code-checking\r
+ *  program, but they're not complete by a long shot.  The real errors\r
+ *  that lint detects are gone, but there are still warnings with\r
+ *  Py_[X]DECREF() and Py_[X]INCREF() macros.  The lint annotations\r
+ *  look like "NOTE(...)".\r
+ */\r
+\r
+#include "Python.h"                     /* general Python API             */\r
+#include "Python-ast.h"                 /* mod_ty */\r
+#include "graminit.h"                   /* symbols defined in the grammar */\r
+#include "node.h"                       /* internal parser structure      */\r
+#include "errcode.h"                    /* error codes for PyNode_*()     */\r
+#include "token.h"                      /* token definitions              */\r
+#include "grammar.h"\r
+#include "parsetok.h"\r
+                                        /* ISTERMINAL() / ISNONTERMINAL() */\r
+#include "compile.h"\r
+#undef Yield\r
+#include "ast.h"\r
+#include "pyarena.h"\r
+\r
+extern grammar _PyParser_Grammar; /* From graminit.c */\r
+\r
+#ifdef lint\r
+#include <note.h>\r
+#else\r
+#define NOTE(x)\r
+#endif\r
+\r
+/*  String constants used to initialize module attributes.\r
+ *\r
+ */\r
+static char parser_copyright_string[] =\r
+"Copyright 1995-1996 by Virginia Polytechnic Institute & State\n\\r
+University, Blacksburg, Virginia, USA, and Fred L. Drake, Jr., Reston,\n\\r
+Virginia, USA.  Portions copyright 1991-1995 by Stichting Mathematisch\n\\r
+Centrum, Amsterdam, The Netherlands.";\r
+\r
+\r
+PyDoc_STRVAR(parser_doc_string,\r
+"This is an interface to Python's internal parser.");\r
+\r
+static char parser_version_string[] = "0.5";\r
+\r
+\r
+typedef PyObject* (*SeqMaker) (Py_ssize_t length);\r
+typedef int (*SeqInserter) (PyObject* sequence,\r
+                            Py_ssize_t index,\r
+                            PyObject* element);\r
+\r
+/*  The function below is copyrighted by Stichting Mathematisch Centrum.  The\r
+ *  original copyright statement is included below, and continues to apply\r
+ *  in full to the function immediately following.  All other material is\r
+ *  original, copyrighted by Fred L. Drake, Jr. and Virginia Polytechnic\r
+ *  Institute and State University.  Changes were made to comply with the\r
+ *  new naming conventions.  Added arguments to provide support for creating\r
+ *  lists as well as tuples, and optionally including the line numbers.\r
+ */\r
+\r
+\r
+static PyObject*\r
+node2tuple(node *n,                     /* node to convert               */\r
+           SeqMaker mkseq,              /* create sequence               */\r
+           SeqInserter addelem,         /* func. to add elem. in seq.    */\r
+           int lineno,                  /* include line numbers?         */\r
+           int col_offset)              /* include column offsets?       */\r
+{\r
+    if (n == NULL) {\r
+        Py_INCREF(Py_None);\r
+        return (Py_None);\r
+    }\r
+    if (ISNONTERMINAL(TYPE(n))) {\r
+        int i;\r
+        PyObject *v;\r
+        PyObject *w;\r
+\r
+        v = mkseq(1 + NCH(n) + (TYPE(n) == encoding_decl));\r
+        if (v == NULL)\r
+            return (v);\r
+        w = PyInt_FromLong(TYPE(n));\r
+        if (w == NULL) {\r
+            Py_DECREF(v);\r
+            return ((PyObject*) NULL);\r
+        }\r
+        (void) addelem(v, 0, w);\r
+        for (i = 0; i < NCH(n); i++) {\r
+            w = node2tuple(CHILD(n, i), mkseq, addelem, lineno, col_offset);\r
+            if (w == NULL) {\r
+                Py_DECREF(v);\r
+                return ((PyObject*) NULL);\r
+            }\r
+            (void) addelem(v, i+1, w);\r
+        }\r
+\r
+        if (TYPE(n) == encoding_decl)\r
+            (void) addelem(v, i+1, PyString_FromString(STR(n)));\r
+        return (v);\r
+    }\r
+    else if (ISTERMINAL(TYPE(n))) {\r
+        PyObject *result = mkseq(2 + lineno + col_offset);\r
+        if (result != NULL) {\r
+            (void) addelem(result, 0, PyInt_FromLong(TYPE(n)));\r
+            (void) addelem(result, 1, PyString_FromString(STR(n)));\r
+            if (lineno == 1)\r
+                (void) addelem(result, 2, PyInt_FromLong(n->n_lineno));\r
+            if (col_offset == 1)\r
+                (void) addelem(result, 3, PyInt_FromLong(n->n_col_offset));\r
+        }\r
+        return (result);\r
+    }\r
+    else {\r
+        PyErr_SetString(PyExc_SystemError,\r
+                        "unrecognized parse tree node type");\r
+        return ((PyObject*) NULL);\r
+    }\r
+}\r
+/*\r
+ *  End of material copyrighted by Stichting Mathematisch Centrum.\r
+ */\r
+\r
+\r
+\r
+/*  There are two types of intermediate objects we're interested in:\r
+ *  'eval' and 'exec' types.  These constants can be used in the st_type\r
+ *  field of the object type to identify which any given object represents.\r
+ *  These should probably go in an external header to allow other extensions\r
+ *  to use them, but then, we really should be using C++ too.  ;-)\r
+ */\r
+\r
+#define PyST_EXPR  1\r
+#define PyST_SUITE 2\r
+\r
+\r
+/*  These are the internal objects and definitions required to implement the\r
+ *  ST type.  Most of the internal names are more reminiscent of the 'old'\r
+ *  naming style, but the code uses the new naming convention.\r
+ */\r
+\r
+static PyObject*\r
+parser_error = 0;\r
+\r
+\r
+typedef struct {\r
+    PyObject_HEAD                       /* standard object header           */\r
+    node* st_node;                      /* the node* returned by the parser */\r
+    int   st_type;                      /* EXPR or SUITE ?                  */\r
+    PyCompilerFlags st_flags;           /* Parser and compiler flags        */\r
+} PyST_Object;\r
+\r
+\r
+static void parser_free(PyST_Object *st);\r
+static PyObject* parser_sizeof(PyST_Object *, void *);\r
+static int parser_compare(PyST_Object *left, PyST_Object *right);\r
+static PyObject *parser_getattr(PyObject *self, char *name);\r
+static PyObject* parser_compilest(PyST_Object *, PyObject *, PyObject *);\r
+static PyObject* parser_isexpr(PyST_Object *, PyObject *, PyObject *);\r
+static PyObject* parser_issuite(PyST_Object *, PyObject *, PyObject *);\r
+static PyObject* parser_st2list(PyST_Object *, PyObject *, PyObject *);\r
+static PyObject* parser_st2tuple(PyST_Object *, PyObject *, PyObject *);\r
+\r
+#define PUBLIC_METHOD_TYPE (METH_VARARGS|METH_KEYWORDS)\r
+\r
+static PyMethodDef\r
+parser_methods[] = {\r
+    {"compile",         (PyCFunction)parser_compilest,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Compile this ST object into a code object.")},\r
+    {"isexpr",          (PyCFunction)parser_isexpr,     PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Determines if this ST object was created from an expression.")},\r
+    {"issuite",         (PyCFunction)parser_issuite,    PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Determines if this ST object was created from a suite.")},\r
+    {"tolist",          (PyCFunction)parser_st2list,    PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a list-tree representation of this ST.")},\r
+    {"totuple",         (PyCFunction)parser_st2tuple,   PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a tuple-tree representation of this ST.")},\r
+    {"__sizeof__",      (PyCFunction)parser_sizeof,     METH_NOARGS,\r
+        PyDoc_STR("Returns size in memory, in bytes.")},\r
+    {NULL, NULL, 0, NULL}\r
+};\r
+\r
+static\r
+PyTypeObject PyST_Type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "parser.st",                        /* tp_name              */\r
+    (int) sizeof(PyST_Object),          /* tp_basicsize         */\r
+    0,                                  /* tp_itemsize          */\r
+    (destructor)parser_free,            /* tp_dealloc           */\r
+    0,                                  /* tp_print             */\r
+    parser_getattr,                     /* tp_getattr           */\r
+    0,                                  /* tp_setattr           */\r
+    (cmpfunc)parser_compare,            /* tp_compare           */\r
+    0,                                  /* tp_repr              */\r
+    0,                                  /* tp_as_number         */\r
+    0,                                  /* tp_as_sequence       */\r
+    0,                                  /* tp_as_mapping        */\r
+    0,                                  /* tp_hash              */\r
+    0,                                  /* tp_call              */\r
+    0,                                  /* tp_str               */\r
+    0,                                  /* tp_getattro          */\r
+    0,                                  /* tp_setattro          */\r
+\r
+    /* Functions to access object as input/output buffer */\r
+    0,                                  /* tp_as_buffer         */\r
+\r
+    Py_TPFLAGS_DEFAULT,                 /* tp_flags             */\r
+\r
+    /* __doc__ */\r
+    "Intermediate representation of a Python parse tree.",\r
+    0,                                  /* tp_traverse */\r
+    0,                                  /* tp_clear */\r
+    0,                                  /* tp_richcompare */\r
+    0,                                  /* tp_weaklistoffset */\r
+    0,                                  /* tp_iter */\r
+    0,                                  /* tp_iternext */\r
+    parser_methods,                     /* tp_methods */\r
+};  /* PyST_Type */\r
+\r
+\r
+static int\r
+parser_compare_nodes(node *left, node *right)\r
+{\r
+    int j;\r
+\r
+    if (TYPE(left) < TYPE(right))\r
+        return (-1);\r
+\r
+    if (TYPE(right) < TYPE(left))\r
+        return (1);\r
+\r
+    if (ISTERMINAL(TYPE(left)))\r
+        return (strcmp(STR(left), STR(right)));\r
+\r
+    if (NCH(left) < NCH(right))\r
+        return (-1);\r
+\r
+    if (NCH(right) < NCH(left))\r
+        return (1);\r
+\r
+    for (j = 0; j < NCH(left); ++j) {\r
+        int v = parser_compare_nodes(CHILD(left, j), CHILD(right, j));\r
+\r
+        if (v != 0)\r
+            return (v);\r
+    }\r
+    return (0);\r
+}\r
+\r
+\r
+/*  int parser_compare(PyST_Object* left, PyST_Object* right)\r
+ *\r
+ *  Comparison function used by the Python operators ==, !=, <, >, <=, >=\r
+ *  This really just wraps a call to parser_compare_nodes() with some easy\r
+ *  checks and protection code.\r
+ *\r
+ */\r
+static int\r
+parser_compare(PyST_Object *left, PyST_Object *right)\r
+{\r
+    if (left == right)\r
+        return (0);\r
+\r
+    if ((left == 0) || (right == 0))\r
+        return (-1);\r
+\r
+    return (parser_compare_nodes(left->st_node, right->st_node));\r
+}\r
+\r
+\r
+/*  parser_newstobject(node* st)\r
+ *\r
+ *  Allocates a new Python object representing an ST.  This is simply the\r
+ *  'wrapper' object that holds a node* and allows it to be passed around in\r
+ *  Python code.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_newstobject(node *st, int type)\r
+{\r
+    PyST_Object* o = PyObject_New(PyST_Object, &PyST_Type);\r
+\r
+    if (o != 0) {\r
+        o->st_node = st;\r
+        o->st_type = type;\r
+        o->st_flags.cf_flags = 0;\r
+    }\r
+    else {\r
+        PyNode_Free(st);\r
+    }\r
+    return ((PyObject*)o);\r
+}\r
+\r
+\r
+/*  void parser_free(PyST_Object* st)\r
+ *\r
+ *  This is called by a del statement that reduces the reference count to 0.\r
+ *\r
+ */\r
+static void\r
+parser_free(PyST_Object *st)\r
+{\r
+    PyNode_Free(st->st_node);\r
+    PyObject_Del(st);\r
+}\r
+\r
+\r
+/*  parser_st2tuple(PyObject* self, PyObject* args, PyObject* kw)\r
+ *\r
+ *  This provides conversion from a node* to a tuple object that can be\r
+ *  returned to the Python-level caller.  The ST object is not modified.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_st2tuple(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *line_option = 0;\r
+    PyObject *col_option = 0;\r
+    PyObject *res = 0;\r
+    int ok;\r
+\r
+    static char *keywords[] = {"ast", "line_info", "col_info", NULL};\r
+\r
+    if (self == NULL) {\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2tuple", keywords,\r
+                                         &PyST_Type, &self, &line_option,\r
+                                         &col_option);\r
+    }\r
+    else\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:totuple", &keywords[1],\r
+                                         &line_option, &col_option);\r
+    if (ok != 0) {\r
+        int lineno = 0;\r
+        int col_offset = 0;\r
+        if (line_option != NULL) {\r
+            lineno = PyObject_IsTrue(line_option);\r
+            if (lineno < 0)\r
+                return NULL;\r
+        }\r
+        if (col_option != NULL) {\r
+            col_offset = PyObject_IsTrue(col_option);\r
+            if (col_offset < 0)\r
+                return NULL;\r
+        }\r
+        /*\r
+         *  Convert ST into a tuple representation.  Use Guido's function,\r
+         *  since it's known to work already.\r
+         */\r
+        res = node2tuple(((PyST_Object*)self)->st_node,\r
+                         PyTuple_New, PyTuple_SetItem, lineno, col_offset);\r
+    }\r
+    return (res);\r
+}\r
+\r
+static PyObject*\r
+parser_ast2tuple(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    if (PyErr_WarnPy3k("ast2tuple is removed in 3.x; use st2tuple", 1) < 0)\r
+        return NULL;\r
+    return parser_st2tuple(self, args, kw);\r
+}\r
+\r
+\r
+/*  parser_st2list(PyObject* self, PyObject* args, PyObject* kw)\r
+ *\r
+ *  This provides conversion from a node* to a list object that can be\r
+ *  returned to the Python-level caller.  The ST object is not modified.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_st2list(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *line_option = 0;\r
+    PyObject *col_option = 0;\r
+    PyObject *res = 0;\r
+    int ok;\r
+\r
+    static char *keywords[] = {"ast", "line_info", "col_info", NULL};\r
+\r
+    if (self == NULL)\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|OO:st2list", keywords,\r
+                                         &PyST_Type, &self, &line_option,\r
+                                         &col_option);\r
+    else\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "|OO:tolist", &keywords[1],\r
+                                         &line_option, &col_option);\r
+    if (ok) {\r
+        int lineno = 0;\r
+        int col_offset = 0;\r
+        if (line_option != 0) {\r
+            lineno = PyObject_IsTrue(line_option);\r
+            if (lineno < 0)\r
+                return NULL;\r
+        }\r
+        if (col_option != 0) {\r
+            col_offset = PyObject_IsTrue(col_option);\r
+            if (col_offset < 0)\r
+                return NULL;\r
+        }\r
+        /*\r
+         *  Convert ST into a tuple representation.  Use Guido's function,\r
+         *  since it's known to work already.\r
+         */\r
+        res = node2tuple(self->st_node,\r
+                         PyList_New, PyList_SetItem, lineno, col_offset);\r
+    }\r
+    return (res);\r
+}\r
+\r
+static PyObject*\r
+parser_ast2list(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    if (PyErr_WarnPy3k("ast2list is removed in 3.x; use st2list", 1) < 0)\r
+        return NULL;\r
+    return parser_st2list(self, args, kw);\r
+}\r
+\r
+\r
+/*  parser_compilest(PyObject* self, PyObject* args)\r
+ *\r
+ *  This function creates code objects from the parse tree represented by\r
+ *  the passed-in data object.  An optional file name is passed in as well.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_compilest(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject*     res = 0;\r
+    PyArena*      arena;\r
+    mod_ty        mod;\r
+    char*         str = "<syntax-tree>";\r
+    int ok;\r
+\r
+    static char *keywords[] = {"ast", "filename", NULL};\r
+\r
+    if (self == NULL)\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "O!|s:compilest", keywords,\r
+                                         &PyST_Type, &self, &str);\r
+    else\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "|s:compile", &keywords[1],\r
+                                         &str);\r
+\r
+    if (ok) {\r
+        arena = PyArena_New();\r
+        if (arena) {\r
+           mod = PyAST_FromNode(self->st_node, &(self->st_flags), str, arena);\r
+           if (mod) {\r
+               res = (PyObject *)PyAST_Compile(mod, str, &(self->st_flags), arena);\r
+           }\r
+           PyArena_Free(arena);\r
+        }\r
+    }\r
+\r
+    return (res);\r
+}\r
+\r
+static PyObject*\r
+parser_compileast(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    if (PyErr_WarnPy3k("compileast is removed in 3.x; use compilest", 1) < 0)\r
+        return NULL;\r
+    return parser_compilest(self, args, kw);\r
+}\r
+\r
+\r
+/*  PyObject* parser_isexpr(PyObject* self, PyObject* args)\r
+ *  PyObject* parser_issuite(PyObject* self, PyObject* args)\r
+ *\r
+ *  Checks the passed-in ST object to determine if it is an expression or\r
+ *  a statement suite, respectively.  The return is a Python truth value.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_isexpr(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject* res = 0;\r
+    int ok;\r
+\r
+    static char *keywords[] = {"ast", NULL};\r
+\r
+    if (self == NULL)\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:isexpr", keywords,\r
+                                         &PyST_Type, &self);\r
+    else\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, ":isexpr", &keywords[1]);\r
+\r
+    if (ok) {\r
+        /* Check to see if the ST represents an expression or not. */\r
+        res = (self->st_type == PyST_EXPR) ? Py_True : Py_False;\r
+        Py_INCREF(res);\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static PyObject*\r
+parser_issuite(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject* res = 0;\r
+    int ok;\r
+\r
+    static char *keywords[] = {"ast", NULL};\r
+\r
+    if (self == NULL)\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, "O!:issuite", keywords,\r
+                                         &PyST_Type, &self);\r
+    else\r
+        ok = PyArg_ParseTupleAndKeywords(args, kw, ":issuite", &keywords[1]);\r
+\r
+    if (ok) {\r
+        /* Check to see if the ST represents an expression or not. */\r
+        res = (self->st_type == PyST_EXPR) ? Py_False : Py_True;\r
+        Py_INCREF(res);\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static PyObject*\r
+parser_getattr(PyObject *self, char *name)\r
+{\r
+    return (Py_FindMethod(parser_methods, self, name));\r
+}\r
+\r
+\r
+/*  err_string(char* message)\r
+ *\r
+ *  Sets the error string for an exception of type ParserError.\r
+ *\r
+ */\r
+static void\r
+err_string(char *message)\r
+{\r
+    PyErr_SetString(parser_error, message);\r
+}\r
+\r
+\r
+/*  PyObject* parser_do_parse(PyObject* args, int type)\r
+ *\r
+ *  Internal function to actually execute the parse and return the result if\r
+ *  successful or set an exception if not.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_do_parse(PyObject *args, PyObject *kw, char *argspec, int type)\r
+{\r
+    char*     string = 0;\r
+    PyObject* res    = 0;\r
+    int flags        = 0;\r
+    perrdetail err;\r
+\r
+    static char *keywords[] = {"source", NULL};\r
+\r
+    if (PyArg_ParseTupleAndKeywords(args, kw, argspec, keywords, &string)) {\r
+        node* n = PyParser_ParseStringFlagsFilenameEx(string, NULL,\r
+                                                       &_PyParser_Grammar,\r
+                                                      (type == PyST_EXPR)\r
+                                                      ? eval_input : file_input,\r
+                                                      &err, &flags);\r
+\r
+        if (n) {\r
+            res = parser_newstobject(n, type);\r
+            if (res)\r
+                ((PyST_Object *)res)->st_flags.cf_flags = flags & PyCF_MASK;\r
+        }\r
+        else\r
+            PyParser_SetError(&err);\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  PyObject* parser_expr(PyObject* self, PyObject* args)\r
+ *  PyObject* parser_suite(PyObject* self, PyObject* args)\r
+ *\r
+ *  External interfaces to the parser itself.  Which is called determines if\r
+ *  the parser attempts to recognize an expression ('eval' form) or statement\r
+ *  suite ('exec' form).  The real work is done by parser_do_parse() above.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_expr(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    NOTE(ARGUNUSED(self))\r
+    return (parser_do_parse(args, kw, "s:expr", PyST_EXPR));\r
+}\r
+\r
+\r
+static PyObject*\r
+parser_suite(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    NOTE(ARGUNUSED(self))\r
+    return (parser_do_parse(args, kw, "s:suite", PyST_SUITE));\r
+}\r
+\r
+\r
+\r
+/*  This is the messy part of the code.  Conversion from a tuple to an ST\r
+ *  object requires that the input tuple be valid without having to rely on\r
+ *  catching an exception from the compiler.  This is done to allow the\r
+ *  compiler itself to remain fast, since most of its input will come from\r
+ *  the parser directly, and therefore be known to be syntactically correct.\r
+ *  This validation is done to ensure that we don't core dump the compile\r
+ *  phase, returning an exception instead.\r
+ *\r
+ *  Two aspects can be broken out in this code:  creating a node tree from\r
+ *  the tuple passed in, and verifying that it is indeed valid.  It may be\r
+ *  advantageous to expand the number of ST types to include funcdefs and\r
+ *  lambdadefs to take advantage of the optimizer, recognizing those STs\r
+ *  here.  They are not necessary, and not quite as useful in a raw form.\r
+ *  For now, let's get expressions and suites working reliably.\r
+ */\r
+\r
+\r
+static node* build_node_tree(PyObject *tuple);\r
+static int   validate_expr_tree(node *tree);\r
+static int   validate_file_input(node *tree);\r
+static int   validate_encoding_decl(node *tree);\r
+\r
+/*  PyObject* parser_tuple2st(PyObject* self, PyObject* args)\r
+ *\r
+ *  This is the public function, called from the Python code.  It receives a\r
+ *  single tuple object from the caller, and creates an ST object if the\r
+ *  tuple can be validated.  It does this by checking the first code of the\r
+ *  tuple, and, if acceptable, builds the internal representation.  If this\r
+ *  step succeeds, the internal representation is validated as fully as\r
+ *  possible with the various validate_*() routines defined below.\r
+ *\r
+ *  This function must be changed if support is to be added for PyST_FRAGMENT\r
+ *  ST objects.\r
+ *\r
+ */\r
+static PyObject*\r
+parser_tuple2st(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    NOTE(ARGUNUSED(self))\r
+    PyObject *st = 0;\r
+    PyObject *tuple;\r
+    node *tree;\r
+\r
+    static char *keywords[] = {"sequence", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "O:sequence2st", keywords,\r
+                                     &tuple))\r
+        return (0);\r
+    if (!PySequence_Check(tuple)) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "sequence2st() requires a single sequence argument");\r
+        return (0);\r
+    }\r
+    /*\r
+     *  Convert the tree to the internal form before checking it.\r
+     */\r
+    tree = build_node_tree(tuple);\r
+    if (tree != 0) {\r
+        int start_sym = TYPE(tree);\r
+        if (start_sym == eval_input) {\r
+            /*  Might be an eval form.  */\r
+            if (validate_expr_tree(tree))\r
+                st = parser_newstobject(tree, PyST_EXPR);\r
+            else\r
+                PyNode_Free(tree);\r
+        }\r
+        else if (start_sym == file_input) {\r
+            /*  This looks like an exec form so far.  */\r
+            if (validate_file_input(tree))\r
+                st = parser_newstobject(tree, PyST_SUITE);\r
+            else\r
+                PyNode_Free(tree);\r
+        }\r
+        else if (start_sym == encoding_decl) {\r
+            /* This looks like an encoding_decl so far. */\r
+            if (validate_encoding_decl(tree))\r
+                st = parser_newstobject(tree, PyST_SUITE);\r
+            else\r
+                PyNode_Free(tree);\r
+        }\r
+        else {\r
+            /*  This is a fragment, at best. */\r
+            PyNode_Free(tree);\r
+            err_string("parse tree does not use a valid start symbol");\r
+        }\r
+    }\r
+    /*  Make sure we raise an exception on all errors.  We should never\r
+     *  get this, but we'd do well to be sure something is done.\r
+     */\r
+    if (st == NULL && !PyErr_Occurred())\r
+        err_string("unspecified ST error occurred");\r
+\r
+    return st;\r
+}\r
+\r
+static PyObject*\r
+parser_tuple2ast(PyST_Object *self, PyObject *args, PyObject *kw)\r
+{\r
+    if (PyErr_WarnPy3k("tuple2ast is removed in 3.x; use tuple2st", 1) < 0)\r
+        return NULL;\r
+    return parser_tuple2st(self, args, kw);\r
+}\r
+\r
+static PyObject *\r
+parser_sizeof(PyST_Object *st, void *unused)\r
+{\r
+    Py_ssize_t res;\r
+\r
+    res = sizeof(PyST_Object) + _PyNode_SizeOf(st->st_node);\r
+    return PyLong_FromSsize_t(res);\r
+}\r
+\r
+\r
+/*  node* build_node_children()\r
+ *\r
+ *  Iterate across the children of the current non-terminal node and build\r
+ *  their structures.  If successful, return the root of this portion of\r
+ *  the tree, otherwise, 0.  Any required exception will be specified already,\r
+ *  and no memory will have been deallocated.\r
+ *\r
+ */\r
+static node*\r
+build_node_children(PyObject *tuple, node *root, int *line_num)\r
+{\r
+    Py_ssize_t len = PyObject_Size(tuple);\r
+    Py_ssize_t i;\r
+    int  err;\r
+\r
+    for (i = 1; i < len; ++i) {\r
+        /* elem must always be a sequence, however simple */\r
+        PyObject* elem = PySequence_GetItem(tuple, i);\r
+        int ok = elem != NULL;\r
+        long  type = 0;\r
+        char *strn = 0;\r
+\r
+        if (ok)\r
+            ok = PySequence_Check(elem);\r
+        if (ok) {\r
+            PyObject *temp = PySequence_GetItem(elem, 0);\r
+            if (temp == NULL)\r
+                ok = 0;\r
+            else {\r
+                ok = PyInt_Check(temp);\r
+                if (ok)\r
+                    type = PyInt_AS_LONG(temp);\r
+                Py_DECREF(temp);\r
+            }\r
+        }\r
+        if (!ok) {\r
+            PyObject *err = Py_BuildValue("os", elem,\r
+                                          "Illegal node construct.");\r
+            PyErr_SetObject(parser_error, err);\r
+            Py_XDECREF(err);\r
+            Py_XDECREF(elem);\r
+            return (0);\r
+        }\r
+        if (ISTERMINAL(type)) {\r
+            Py_ssize_t len = PyObject_Size(elem);\r
+            PyObject *temp;\r
+\r
+            if ((len != 2) && (len != 3)) {\r
+                err_string("terminal nodes must have 2 or 3 entries");\r
+                return 0;\r
+            }\r
+            temp = PySequence_GetItem(elem, 1);\r
+            if (temp == NULL)\r
+                return 0;\r
+            if (!PyString_Check(temp)) {\r
+                PyErr_Format(parser_error,\r
+                             "second item in terminal node must be a string,"\r
+                             " found %s",\r
+                             Py_TYPE(temp)->tp_name);\r
+                Py_DECREF(temp);\r
+                return 0;\r
+            }\r
+            if (len == 3) {\r
+                PyObject *o = PySequence_GetItem(elem, 2);\r
+                if (o != NULL) {\r
+                    if (PyInt_Check(o))\r
+                        *line_num = PyInt_AS_LONG(o);\r
+                    else {\r
+                        PyErr_Format(parser_error,\r
+                                     "third item in terminal node must be an"\r
+                                     " integer, found %s",\r
+                                     Py_TYPE(temp)->tp_name);\r
+                        Py_DECREF(o);\r
+                        Py_DECREF(temp);\r
+                        return 0;\r
+                    }\r
+                    Py_DECREF(o);\r
+                }\r
+            }\r
+            len = PyString_GET_SIZE(temp) + 1;\r
+            strn = (char *)PyObject_MALLOC(len);\r
+            if (strn != NULL)\r
+                (void) memcpy(strn, PyString_AS_STRING(temp), len);\r
+            Py_DECREF(temp);\r
+        }\r
+        else if (!ISNONTERMINAL(type)) {\r
+            /*\r
+             *  It has to be one or the other; this is an error.\r
+             *  Raise an exception.\r
+             */\r
+            PyObject *err = Py_BuildValue("os", elem, "unknown node type.");\r
+            PyErr_SetObject(parser_error, err);\r
+            Py_XDECREF(err);\r
+            Py_XDECREF(elem);\r
+            return (0);\r
+        }\r
+        err = PyNode_AddChild(root, type, strn, *line_num, 0);\r
+        if (err == E_NOMEM) {\r
+            PyObject_FREE(strn);\r
+            return (node *) PyErr_NoMemory();\r
+        }\r
+        if (err == E_OVERFLOW) {\r
+            PyObject_FREE(strn);\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "unsupported number of child nodes");\r
+            return NULL;\r
+        }\r
+\r
+        if (ISNONTERMINAL(type)) {\r
+            node* new_child = CHILD(root, i - 1);\r
+\r
+            if (new_child != build_node_children(elem, new_child, line_num)) {\r
+                Py_XDECREF(elem);\r
+                return (0);\r
+            }\r
+        }\r
+        else if (type == NEWLINE) {     /* It's true:  we increment the     */\r
+            ++(*line_num);              /* line number *after* the newline! */\r
+        }\r
+        Py_XDECREF(elem);\r
+    }\r
+    return root;\r
+}\r
+\r
+\r
+static node*\r
+build_node_tree(PyObject *tuple)\r
+{\r
+    node* res = 0;\r
+    PyObject *temp = PySequence_GetItem(tuple, 0);\r
+    long num = -1;\r
+\r
+    if (temp != NULL)\r
+        num = PyInt_AsLong(temp);\r
+    Py_XDECREF(temp);\r
+    if (ISTERMINAL(num)) {\r
+        /*\r
+         *  The tuple is simple, but it doesn't start with a start symbol.\r
+         *  Raise an exception now and be done with it.\r
+         */\r
+        tuple = Py_BuildValue("os", tuple,\r
+                    "Illegal syntax-tree; cannot start with terminal symbol.");\r
+        PyErr_SetObject(parser_error, tuple);\r
+        Py_XDECREF(tuple);\r
+    }\r
+    else if (ISNONTERMINAL(num)) {\r
+        /*\r
+         *  Not efficient, but that can be handled later.\r
+         */\r
+        int line_num = 0;\r
+        PyObject *encoding = NULL;\r
+\r
+        if (num == encoding_decl) {\r
+            encoding = PySequence_GetItem(tuple, 2);\r
+            /* tuple isn't borrowed anymore here, need to DECREF */\r
+            tuple = PySequence_GetSlice(tuple, 0, 2);\r
+        }\r
+        res = PyNode_New(num);\r
+        if (res != NULL) {\r
+            if (res != build_node_children(tuple, res, &line_num)) {\r
+                PyNode_Free(res);\r
+                res = NULL;\r
+            }\r
+            if (res && encoding) {\r
+                Py_ssize_t len;\r
+                len = PyString_GET_SIZE(encoding) + 1;\r
+                res->n_str = (char *)PyObject_MALLOC(len);\r
+                if (res->n_str != NULL)\r
+                    (void) memcpy(res->n_str, PyString_AS_STRING(encoding), len);\r
+                Py_DECREF(encoding);\r
+                Py_DECREF(tuple);\r
+            }\r
+        }\r
+    }\r
+    else {\r
+        /*  The tuple is illegal -- if the number is neither TERMINAL nor\r
+         *  NONTERMINAL, we can't use it.  Not sure the implementation\r
+         *  allows this condition, but the API doesn't preclude it.\r
+         */\r
+        PyObject *err = Py_BuildValue("os", tuple,\r
+                                      "Illegal component tuple.");\r
+        PyErr_SetObject(parser_error, err);\r
+        Py_XDECREF(err);\r
+    }\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*\r
+ *  Validation routines used within the validation section:\r
+ */\r
+static int validate_terminal(node *terminal, int type, char *string);\r
+\r
+#define validate_ampersand(ch)  validate_terminal(ch,      AMPER, "&")\r
+#define validate_circumflex(ch) validate_terminal(ch, CIRCUMFLEX, "^")\r
+#define validate_colon(ch)      validate_terminal(ch,      COLON, ":")\r
+#define validate_comma(ch)      validate_terminal(ch,      COMMA, ",")\r
+#define validate_dedent(ch)     validate_terminal(ch,     DEDENT, "")\r
+#define validate_equal(ch)      validate_terminal(ch,      EQUAL, "=")\r
+#define validate_indent(ch)     validate_terminal(ch,     INDENT, (char*)NULL)\r
+#define validate_lparen(ch)     validate_terminal(ch,       LPAR, "(")\r
+#define validate_newline(ch)    validate_terminal(ch,    NEWLINE, (char*)NULL)\r
+#define validate_rparen(ch)     validate_terminal(ch,       RPAR, ")")\r
+#define validate_semi(ch)       validate_terminal(ch,       SEMI, ";")\r
+#define validate_star(ch)       validate_terminal(ch,       STAR, "*")\r
+#define validate_vbar(ch)       validate_terminal(ch,       VBAR, "|")\r
+#define validate_doublestar(ch) validate_terminal(ch, DOUBLESTAR, "**")\r
+#define validate_dot(ch)        validate_terminal(ch,        DOT, ".")\r
+#define validate_at(ch)         validate_terminal(ch,         AT, "@")\r
+#define validate_name(ch, str)  validate_terminal(ch,       NAME, str)\r
+\r
+#define VALIDATER(n)    static int validate_##n(node *tree)\r
+\r
+VALIDATER(node);                VALIDATER(small_stmt);\r
+VALIDATER(class);               VALIDATER(node);\r
+VALIDATER(parameters);          VALIDATER(suite);\r
+VALIDATER(testlist);            VALIDATER(varargslist);\r
+VALIDATER(fpdef);               VALIDATER(fplist);\r
+VALIDATER(stmt);                VALIDATER(simple_stmt);\r
+VALIDATER(expr_stmt);           VALIDATER(power);\r
+VALIDATER(print_stmt);          VALIDATER(del_stmt);\r
+VALIDATER(return_stmt);         VALIDATER(list_iter);\r
+VALIDATER(raise_stmt);          VALIDATER(import_stmt);\r
+VALIDATER(import_name);         VALIDATER(import_from);\r
+VALIDATER(global_stmt);         VALIDATER(list_if);\r
+VALIDATER(assert_stmt);         VALIDATER(list_for);\r
+VALIDATER(exec_stmt);           VALIDATER(compound_stmt);\r
+VALIDATER(while);               VALIDATER(for);\r
+VALIDATER(try);                 VALIDATER(except_clause);\r
+VALIDATER(test);                VALIDATER(and_test);\r
+VALIDATER(not_test);            VALIDATER(comparison);\r
+VALIDATER(comp_op);             VALIDATER(expr);\r
+VALIDATER(xor_expr);            VALIDATER(and_expr);\r
+VALIDATER(shift_expr);          VALIDATER(arith_expr);\r
+VALIDATER(term);                VALIDATER(factor);\r
+VALIDATER(atom);                VALIDATER(lambdef);\r
+VALIDATER(trailer);             VALIDATER(subscript);\r
+VALIDATER(subscriptlist);       VALIDATER(sliceop);\r
+VALIDATER(exprlist);            VALIDATER(dictorsetmaker);\r
+VALIDATER(arglist);             VALIDATER(argument);\r
+VALIDATER(listmaker);           VALIDATER(yield_stmt);\r
+VALIDATER(testlist1);           VALIDATER(comp_for);\r
+VALIDATER(comp_iter);           VALIDATER(comp_if);\r
+VALIDATER(testlist_comp);       VALIDATER(yield_expr);\r
+VALIDATER(yield_or_testlist);   VALIDATER(or_test);\r
+VALIDATER(old_test);            VALIDATER(old_lambdef);\r
+\r
+#undef VALIDATER\r
+\r
+#define is_even(n)      (((n) & 1) == 0)\r
+#define is_odd(n)       (((n) & 1) == 1)\r
+\r
+\r
+static int\r
+validate_ntype(node *n, int t)\r
+{\r
+    if (TYPE(n) != t) {\r
+        PyErr_Format(parser_error, "Expected node type %d, got %d.",\r
+                     t, TYPE(n));\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+\r
+/*  Verifies that the number of child nodes is exactly 'num', raising\r
+ *  an exception if it isn't.  The exception message does not indicate\r
+ *  the exact number of nodes, allowing this to be used to raise the\r
+ *  "right" exception when the wrong number of nodes is present in a\r
+ *  specific variant of a statement's syntax.  This is commonly used\r
+ *  in that fashion.\r
+ */\r
+static int\r
+validate_numnodes(node *n, int num, const char *const name)\r
+{\r
+    if (NCH(n) != num) {\r
+        PyErr_Format(parser_error,\r
+                     "Illegal number of children for %s node.", name);\r
+        return 0;\r
+    }\r
+    return 1;\r
+}\r
+\r
+\r
+static int\r
+validate_terminal(node *terminal, int type, char *string)\r
+{\r
+    int res = (validate_ntype(terminal, type)\r
+               && ((string == 0) || (strcmp(string, STR(terminal)) == 0)));\r
+\r
+    if (!res && !PyErr_Occurred()) {\r
+        PyErr_Format(parser_error,\r
+                     "Illegal terminal: expected \"%s\"", string);\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  X (',' X) [',']\r
+ */\r
+static int\r
+validate_repeating_list(node *tree, int ntype, int (*vfunc)(node *),\r
+                        const char *const name)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (nch && validate_ntype(tree, ntype)\r
+               && vfunc(CHILD(tree, 0)));\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        (void) validate_numnodes(tree, 1, name);\r
+    else {\r
+        if (is_even(nch))\r
+            res = validate_comma(CHILD(tree, --nch));\r
+        if (res && nch > 1) {\r
+            int pos = 1;\r
+            for ( ; res && pos < nch; pos += 2)\r
+                res = (validate_comma(CHILD(tree, pos))\r
+                       && vfunc(CHILD(tree, pos + 1)));\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  validate_class()\r
+ *\r
+ *  classdef:\r
+ *      'class' NAME ['(' testlist ')'] ':' suite\r
+ */\r
+static int\r
+validate_class(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, classdef) &&\r
+                ((nch == 4) || (nch == 6) || (nch == 7)));\r
+\r
+    if (res) {\r
+        res = (validate_name(CHILD(tree, 0), "class")\r
+               && validate_ntype(CHILD(tree, 1), NAME)\r
+               && validate_colon(CHILD(tree, nch - 2))\r
+               && validate_suite(CHILD(tree, nch - 1)));\r
+    }\r
+    else {\r
+        (void) validate_numnodes(tree, 4, "class");\r
+    }\r
+\r
+    if (res) {\r
+        if (nch == 7) {\r
+                res = ((validate_lparen(CHILD(tree, 2)) &&\r
+                        validate_testlist(CHILD(tree, 3)) &&\r
+                        validate_rparen(CHILD(tree, 4))));\r
+        }\r
+        else if (nch == 6) {\r
+                res = (validate_lparen(CHILD(tree,2)) &&\r
+                        validate_rparen(CHILD(tree,3)));\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  if_stmt:\r
+ *      'if' test ':' suite ('elif' test ':' suite)* ['else' ':' suite]\r
+ */\r
+static int\r
+validate_if(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, if_stmt)\r
+               && (nch >= 4)\r
+               && validate_name(CHILD(tree, 0), "if")\r
+               && validate_test(CHILD(tree, 1))\r
+               && validate_colon(CHILD(tree, 2))\r
+               && validate_suite(CHILD(tree, 3)));\r
+\r
+    if (res && ((nch % 4) == 3)) {\r
+        /*  ... 'else' ':' suite  */\r
+        res = (validate_name(CHILD(tree, nch - 3), "else")\r
+               && validate_colon(CHILD(tree, nch - 2))\r
+               && validate_suite(CHILD(tree, nch - 1)));\r
+        nch -= 3;\r
+    }\r
+    else if (!res && !PyErr_Occurred())\r
+        (void) validate_numnodes(tree, 4, "if");\r
+    if ((nch % 4) != 0)\r
+        /* Will catch the case for nch < 4 */\r
+        res = validate_numnodes(tree, 0, "if");\r
+    else if (res && (nch > 4)) {\r
+        /*  ... ('elif' test ':' suite)+ ...  */\r
+        int j = 4;\r
+        while ((j < nch) && res) {\r
+            res = (validate_name(CHILD(tree, j), "elif")\r
+                   && validate_colon(CHILD(tree, j + 2))\r
+                   && validate_test(CHILD(tree, j + 1))\r
+                   && validate_suite(CHILD(tree, j + 3)));\r
+            j += 4;\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  parameters:\r
+ *      '(' [varargslist] ')'\r
+ *\r
+ */\r
+static int\r
+validate_parameters(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, parameters) && ((nch == 2) || (nch == 3));\r
+\r
+    if (res) {\r
+        res = (validate_lparen(CHILD(tree, 0))\r
+               && validate_rparen(CHILD(tree, nch - 1)));\r
+        if (res && (nch == 3))\r
+            res = validate_varargslist(CHILD(tree, 1));\r
+    }\r
+    else {\r
+        (void) validate_numnodes(tree, 2, "parameters");\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  validate_suite()\r
+ *\r
+ *  suite:\r
+ *      simple_stmt\r
+ *    | NEWLINE INDENT stmt+ DEDENT\r
+ */\r
+static int\r
+validate_suite(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, suite) && ((nch == 1) || (nch >= 4)));\r
+\r
+    if (res && (nch == 1))\r
+        res = validate_simple_stmt(CHILD(tree, 0));\r
+    else if (res) {\r
+        /*  NEWLINE INDENT stmt+ DEDENT  */\r
+        res = (validate_newline(CHILD(tree, 0))\r
+               && validate_indent(CHILD(tree, 1))\r
+               && validate_stmt(CHILD(tree, 2))\r
+               && validate_dedent(CHILD(tree, nch - 1)));\r
+\r
+        if (res && (nch > 4)) {\r
+            int i = 3;\r
+            --nch;                      /* forget the DEDENT     */\r
+            for ( ; res && (i < nch); ++i)\r
+                res = validate_stmt(CHILD(tree, i));\r
+        }\r
+        else if (nch < 4)\r
+            res = validate_numnodes(tree, 4, "suite");\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_testlist(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, testlist,\r
+                                    validate_test, "testlist"));\r
+}\r
+\r
+\r
+static int\r
+validate_testlist1(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, testlist1,\r
+                                    validate_test, "testlist1"));\r
+}\r
+\r
+\r
+static int\r
+validate_testlist_safe(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, testlist_safe,\r
+                                    validate_old_test, "testlist_safe"));\r
+}\r
+\r
+\r
+/* '*' NAME [',' '**' NAME] | '**' NAME\r
+ */\r
+static int\r
+validate_varargslist_trailer(node *tree, int start)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = 0;\r
+    int sym;\r
+\r
+    if (nch <= start) {\r
+        err_string("expected variable argument trailer for varargslist");\r
+        return 0;\r
+    }\r
+    sym = TYPE(CHILD(tree, start));\r
+    if (sym == STAR) {\r
+        /*\r
+         *  ('*' NAME [',' '**' NAME]\r
+         */\r
+        if (nch-start == 2)\r
+            res = validate_name(CHILD(tree, start+1), NULL);\r
+        else if (nch-start == 5)\r
+            res = (validate_name(CHILD(tree, start+1), NULL)\r
+                   && validate_comma(CHILD(tree, start+2))\r
+                   && validate_doublestar(CHILD(tree, start+3))\r
+                   && validate_name(CHILD(tree, start+4), NULL));\r
+    }\r
+    else if (sym == DOUBLESTAR) {\r
+        /*\r
+         *  '**' NAME\r
+         */\r
+        if (nch-start == 2)\r
+            res = validate_name(CHILD(tree, start+1), NULL);\r
+    }\r
+    if (!res)\r
+        err_string("illegal variable argument trailer for varargslist");\r
+    return res;\r
+}\r
+\r
+\r
+/*  validate_varargslist()\r
+ *\r
+ *  varargslist:\r
+ *      (fpdef ['=' test] ',')*\r
+ *           ('*' NAME [',' '**' NAME]\r
+ *         | '**' NAME)\r
+ *    | fpdef ['=' test] (',' fpdef ['=' test])* [',']\r
+ *\r
+ */\r
+static int\r
+validate_varargslist(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, varargslist) && (nch != 0);\r
+    int sym;\r
+\r
+    if (!res)\r
+        return 0;\r
+    if (nch < 1) {\r
+        err_string("varargslist missing child nodes");\r
+        return 0;\r
+    }\r
+    sym = TYPE(CHILD(tree, 0));\r
+    if (sym == STAR || sym == DOUBLESTAR)\r
+        /* whole thing matches:\r
+         *      '*' NAME [',' '**' NAME] | '**' NAME\r
+         */\r
+        res = validate_varargslist_trailer(tree, 0);\r
+    else if (sym == fpdef) {\r
+        int i = 0;\r
+\r
+        sym = TYPE(CHILD(tree, nch-1));\r
+        if (sym == NAME) {\r
+            /*\r
+             *   (fpdef ['=' test] ',')+\r
+             *       ('*' NAME [',' '**' NAME]\r
+             *     | '**' NAME)\r
+             */\r
+            /* skip over (fpdef ['=' test] ',')+ */\r
+            while (res && (i+2 <= nch)) {\r
+                res = validate_fpdef(CHILD(tree, i));\r
+                ++i;\r
+                if (res && TYPE(CHILD(tree, i)) == EQUAL && (i+2 <= nch)) {\r
+                    res = (validate_equal(CHILD(tree, i))\r
+                           && validate_test(CHILD(tree, i+1)));\r
+                    if (res)\r
+                        i += 2;\r
+                }\r
+                if (res && i < nch) {\r
+                    res = validate_comma(CHILD(tree, i));\r
+                    ++i;\r
+                    if (res && i < nch\r
+                        && (TYPE(CHILD(tree, i)) == DOUBLESTAR\r
+                            || TYPE(CHILD(tree, i)) == STAR))\r
+                        break;\r
+                }\r
+            }\r
+            /* ... '*' NAME [',' '**' NAME] | '**' NAME\r
+             * i --^^^\r
+             */\r
+            if (res)\r
+                res = validate_varargslist_trailer(tree, i);\r
+        }\r
+        else {\r
+            /*\r
+             *  fpdef ['=' test] (',' fpdef ['=' test])* [',']\r
+             */\r
+            /* strip trailing comma node */\r
+            if (sym == COMMA) {\r
+                res = validate_comma(CHILD(tree, nch-1));\r
+                if (!res)\r
+                    return 0;\r
+                --nch;\r
+            }\r
+            /*\r
+             *  fpdef ['=' test] (',' fpdef ['=' test])*\r
+             */\r
+            res = validate_fpdef(CHILD(tree, 0));\r
+            ++i;\r
+            if (res && (i+2 <= nch) && TYPE(CHILD(tree, i)) == EQUAL) {\r
+                res = (validate_equal(CHILD(tree, i))\r
+                       && validate_test(CHILD(tree, i+1)));\r
+                i += 2;\r
+            }\r
+            /*\r
+             *  ... (',' fpdef ['=' test])*\r
+             *  i ---^^^\r
+             */\r
+            while (res && (nch - i) >= 2) {\r
+                res = (validate_comma(CHILD(tree, i))\r
+                       && validate_fpdef(CHILD(tree, i+1)));\r
+                i += 2;\r
+                if (res && (nch - i) >= 2 && TYPE(CHILD(tree, i)) == EQUAL) {\r
+                    res = (validate_equal(CHILD(tree, i))\r
+                           && validate_test(CHILD(tree, i+1)));\r
+                    i += 2;\r
+                }\r
+            }\r
+            if (res && nch - i != 0) {\r
+                res = 0;\r
+                err_string("illegal formation for varargslist");\r
+            }\r
+        }\r
+    }\r
+    return res;\r
+}\r
+\r
+\r
+/*  list_iter:  list_for | list_if\r
+ */\r
+static int\r
+validate_list_iter(node *tree)\r
+{\r
+    int res = (validate_ntype(tree, list_iter)\r
+               && validate_numnodes(tree, 1, "list_iter"));\r
+    if (res && TYPE(CHILD(tree, 0)) == list_for)\r
+        res = validate_list_for(CHILD(tree, 0));\r
+    else\r
+        res = validate_list_if(CHILD(tree, 0));\r
+\r
+    return res;\r
+}\r
+\r
+/*  comp_iter:  comp_for | comp_if\r
+ */\r
+static int\r
+validate_comp_iter(node *tree)\r
+{\r
+    int res = (validate_ntype(tree, comp_iter)\r
+               && validate_numnodes(tree, 1, "comp_iter"));\r
+    if (res && TYPE(CHILD(tree, 0)) == comp_for)\r
+        res = validate_comp_for(CHILD(tree, 0));\r
+    else\r
+        res = validate_comp_if(CHILD(tree, 0));\r
+\r
+    return res;\r
+}\r
+\r
+/*  list_for:  'for' exprlist 'in' testlist [list_iter]\r
+ */\r
+static int\r
+validate_list_for(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res;\r
+\r
+    if (nch == 5)\r
+        res = validate_list_iter(CHILD(tree, 4));\r
+    else\r
+        res = validate_numnodes(tree, 4, "list_for");\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "for")\r
+               && validate_exprlist(CHILD(tree, 1))\r
+               && validate_name(CHILD(tree, 2), "in")\r
+               && validate_testlist_safe(CHILD(tree, 3)));\r
+\r
+    return res;\r
+}\r
+\r
+/*  comp_for:  'for' exprlist 'in' test [comp_iter]\r
+ */\r
+static int\r
+validate_comp_for(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res;\r
+\r
+    if (nch == 5)\r
+        res = validate_comp_iter(CHILD(tree, 4));\r
+    else\r
+        res = validate_numnodes(tree, 4, "comp_for");\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "for")\r
+               && validate_exprlist(CHILD(tree, 1))\r
+               && validate_name(CHILD(tree, 2), "in")\r
+               && validate_or_test(CHILD(tree, 3)));\r
+\r
+    return res;\r
+}\r
+\r
+/*  list_if:  'if' old_test [list_iter]\r
+ */\r
+static int\r
+validate_list_if(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res;\r
+\r
+    if (nch == 3)\r
+        res = validate_list_iter(CHILD(tree, 2));\r
+    else\r
+        res = validate_numnodes(tree, 2, "list_if");\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "if")\r
+               && validate_old_test(CHILD(tree, 1)));\r
+\r
+    return res;\r
+}\r
+\r
+/*  comp_if:  'if' old_test [comp_iter]\r
+ */\r
+static int\r
+validate_comp_if(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res;\r
+\r
+    if (nch == 3)\r
+        res = validate_comp_iter(CHILD(tree, 2));\r
+    else\r
+        res = validate_numnodes(tree, 2, "comp_if");\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "if")\r
+               && validate_old_test(CHILD(tree, 1)));\r
+\r
+    return res;\r
+}\r
+\r
+/*  validate_fpdef()\r
+ *\r
+ *  fpdef:\r
+ *      NAME\r
+ *    | '(' fplist ')'\r
+ */\r
+static int\r
+validate_fpdef(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, fpdef);\r
+\r
+    if (res) {\r
+        if (nch == 1)\r
+            res = validate_ntype(CHILD(tree, 0), NAME);\r
+        else if (nch == 3)\r
+            res = (validate_lparen(CHILD(tree, 0))\r
+                   && validate_fplist(CHILD(tree, 1))\r
+                   && validate_rparen(CHILD(tree, 2)));\r
+        else\r
+            res = validate_numnodes(tree, 1, "fpdef");\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_fplist(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, fplist,\r
+                                    validate_fpdef, "fplist"));\r
+}\r
+\r
+\r
+/*  simple_stmt | compound_stmt\r
+ *\r
+ */\r
+static int\r
+validate_stmt(node *tree)\r
+{\r
+    int res = (validate_ntype(tree, stmt)\r
+               && validate_numnodes(tree, 1, "stmt"));\r
+\r
+    if (res) {\r
+        tree = CHILD(tree, 0);\r
+\r
+        if (TYPE(tree) == simple_stmt)\r
+            res = validate_simple_stmt(tree);\r
+        else\r
+            res = validate_compound_stmt(tree);\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  small_stmt (';' small_stmt)* [';'] NEWLINE\r
+ *\r
+ */\r
+static int\r
+validate_simple_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, simple_stmt)\r
+               && (nch >= 2)\r
+               && validate_small_stmt(CHILD(tree, 0))\r
+               && validate_newline(CHILD(tree, nch - 1)));\r
+\r
+    if (nch < 2)\r
+        res = validate_numnodes(tree, 2, "simple_stmt");\r
+    --nch;                              /* forget the NEWLINE    */\r
+    if (res && is_even(nch))\r
+        res = validate_semi(CHILD(tree, --nch));\r
+    if (res && (nch > 2)) {\r
+        int i;\r
+\r
+        for (i = 1; res && (i < nch); i += 2)\r
+            res = (validate_semi(CHILD(tree, i))\r
+                   && validate_small_stmt(CHILD(tree, i + 1)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_small_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_numnodes(tree, 1, "small_stmt");\r
+\r
+    if (res) {\r
+        int ntype = TYPE(CHILD(tree, 0));\r
+\r
+        if (  (ntype == expr_stmt)\r
+              || (ntype == print_stmt)\r
+              || (ntype == del_stmt)\r
+              || (ntype == pass_stmt)\r
+              || (ntype == flow_stmt)\r
+              || (ntype == import_stmt)\r
+              || (ntype == global_stmt)\r
+              || (ntype == assert_stmt)\r
+              || (ntype == exec_stmt))\r
+            res = validate_node(CHILD(tree, 0));\r
+        else {\r
+            res = 0;\r
+            err_string("illegal small_stmt child type");\r
+        }\r
+    }\r
+    else if (nch == 1) {\r
+        res = 0;\r
+        PyErr_Format(parser_error,\r
+                     "Unrecognized child node of small_stmt: %d.",\r
+                     TYPE(CHILD(tree, 0)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  compound_stmt:\r
+ *      if_stmt | while_stmt | for_stmt | try_stmt | with_stmt | funcdef | classdef | decorated\r
+ */\r
+static int\r
+validate_compound_stmt(node *tree)\r
+{\r
+    int res = (validate_ntype(tree, compound_stmt)\r
+               && validate_numnodes(tree, 1, "compound_stmt"));\r
+    int ntype;\r
+\r
+    if (!res)\r
+        return (0);\r
+\r
+    tree = CHILD(tree, 0);\r
+    ntype = TYPE(tree);\r
+    if (  (ntype == if_stmt)\r
+          || (ntype == while_stmt)\r
+          || (ntype == for_stmt)\r
+          || (ntype == try_stmt)\r
+          || (ntype == with_stmt)\r
+          || (ntype == funcdef)\r
+          || (ntype == classdef)\r
+          || (ntype == decorated))\r
+        res = validate_node(tree);\r
+    else {\r
+        res = 0;\r
+        PyErr_Format(parser_error,\r
+                     "Illegal compound statement type: %d.", TYPE(tree));\r
+    }\r
+    return (res);\r
+}\r
+\r
+static int\r
+validate_yield_or_testlist(node *tree)\r
+{\r
+        if (TYPE(tree) == yield_expr)\r
+                return validate_yield_expr(tree);\r
+        else\r
+                return validate_testlist(tree);\r
+}\r
+\r
+static int\r
+validate_expr_stmt(node *tree)\r
+{\r
+    int j;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, expr_stmt)\r
+               && is_odd(nch)\r
+               && validate_testlist(CHILD(tree, 0)));\r
+\r
+    if (res && nch == 3\r
+        && TYPE(CHILD(tree, 1)) == augassign) {\r
+        res = validate_numnodes(CHILD(tree, 1), 1, "augassign")\r
+                && validate_yield_or_testlist(CHILD(tree, 2));\r
+\r
+        if (res) {\r
+            char *s = STR(CHILD(CHILD(tree, 1), 0));\r
+\r
+            res = (strcmp(s, "+=") == 0\r
+                   || strcmp(s, "-=") == 0\r
+                   || strcmp(s, "*=") == 0\r
+                   || strcmp(s, "/=") == 0\r
+                   || strcmp(s, "//=") == 0\r
+                   || strcmp(s, "%=") == 0\r
+                   || strcmp(s, "&=") == 0\r
+                   || strcmp(s, "|=") == 0\r
+                   || strcmp(s, "^=") == 0\r
+                   || strcmp(s, "<<=") == 0\r
+                   || strcmp(s, ">>=") == 0\r
+                   || strcmp(s, "**=") == 0);\r
+            if (!res)\r
+                err_string("illegal augmented assignment operator");\r
+        }\r
+    }\r
+    else {\r
+        for (j = 1; res && (j < nch); j += 2)\r
+            res = validate_equal(CHILD(tree, j))\r
+                   && validate_yield_or_testlist(CHILD(tree, j + 1));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  print_stmt:\r
+ *\r
+ *      'print' ( [ test (',' test)* [','] ]\r
+ *              | '>>' test [ (',' test)+ [','] ] )\r
+ */\r
+static int\r
+validate_print_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, print_stmt)\r
+               && (nch > 0)\r
+               && validate_name(CHILD(tree, 0), "print"));\r
+\r
+    if (res && nch > 1) {\r
+        int sym = TYPE(CHILD(tree, 1));\r
+        int i = 1;\r
+        int allow_trailing_comma = 1;\r
+\r
+        if (sym == test)\r
+            res = validate_test(CHILD(tree, i++));\r
+        else {\r
+            if (nch < 3)\r
+                res = validate_numnodes(tree, 3, "print_stmt");\r
+            else {\r
+                res = (validate_ntype(CHILD(tree, i), RIGHTSHIFT)\r
+                       && validate_test(CHILD(tree, i+1)));\r
+                i += 2;\r
+                allow_trailing_comma = 0;\r
+            }\r
+        }\r
+        if (res) {\r
+            /*  ... (',' test)* [',']  */\r
+            while (res && i+2 <= nch) {\r
+                res = (validate_comma(CHILD(tree, i))\r
+                       && validate_test(CHILD(tree, i+1)));\r
+                allow_trailing_comma = 1;\r
+                i += 2;\r
+            }\r
+            if (res && !allow_trailing_comma)\r
+                res = validate_numnodes(tree, i, "print_stmt");\r
+            else if (res && i < nch)\r
+                res = validate_comma(CHILD(tree, i));\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_del_stmt(node *tree)\r
+{\r
+    return (validate_numnodes(tree, 2, "del_stmt")\r
+            && validate_name(CHILD(tree, 0), "del")\r
+            && validate_exprlist(CHILD(tree, 1)));\r
+}\r
+\r
+\r
+static int\r
+validate_return_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, return_stmt)\r
+               && ((nch == 1) || (nch == 2))\r
+               && validate_name(CHILD(tree, 0), "return"));\r
+\r
+    if (res && (nch == 2))\r
+        res = validate_testlist(CHILD(tree, 1));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_raise_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, raise_stmt)\r
+               && ((nch == 1) || (nch == 2) || (nch == 4) || (nch == 6)));\r
+\r
+    if (res) {\r
+        res = validate_name(CHILD(tree, 0), "raise");\r
+        if (res && (nch >= 2))\r
+            res = validate_test(CHILD(tree, 1));\r
+        if (res && nch > 2) {\r
+            res = (validate_comma(CHILD(tree, 2))\r
+                   && validate_test(CHILD(tree, 3)));\r
+            if (res && (nch > 4))\r
+                res = (validate_comma(CHILD(tree, 4))\r
+                       && validate_test(CHILD(tree, 5)));\r
+        }\r
+    }\r
+    else\r
+        (void) validate_numnodes(tree, 2, "raise");\r
+    if (res && (nch == 4))\r
+        res = (validate_comma(CHILD(tree, 2))\r
+               && validate_test(CHILD(tree, 3)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/* yield_expr: 'yield' [testlist]\r
+ */\r
+static int\r
+validate_yield_expr(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, yield_expr)\r
+               && ((nch == 1) || (nch == 2))\r
+               && validate_name(CHILD(tree, 0), "yield"));\r
+\r
+    if (res && (nch == 2))\r
+        res = validate_testlist(CHILD(tree, 1));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/* yield_stmt: yield_expr\r
+ */\r
+static int\r
+validate_yield_stmt(node *tree)\r
+{\r
+    return (validate_ntype(tree, yield_stmt)\r
+            && validate_numnodes(tree, 1, "yield_stmt")\r
+            && validate_yield_expr(CHILD(tree, 0)));\r
+}\r
+\r
+\r
+static int\r
+validate_import_as_name(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = validate_ntype(tree, import_as_name);\r
+\r
+    if (ok) {\r
+        if (nch == 1)\r
+            ok = validate_name(CHILD(tree, 0), NULL);\r
+        else if (nch == 3)\r
+            ok = (validate_name(CHILD(tree, 0), NULL)\r
+                  && validate_name(CHILD(tree, 1), "as")\r
+                  && validate_name(CHILD(tree, 2), NULL));\r
+        else\r
+            ok = validate_numnodes(tree, 3, "import_as_name");\r
+    }\r
+    return ok;\r
+}\r
+\r
+\r
+/* dotted_name:  NAME ("." NAME)*\r
+ */\r
+static int\r
+validate_dotted_name(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, dotted_name)\r
+               && is_odd(nch)\r
+               && validate_name(CHILD(tree, 0), NULL));\r
+    int i;\r
+\r
+    for (i = 1; res && (i < nch); i += 2) {\r
+        res = (validate_dot(CHILD(tree, i))\r
+               && validate_name(CHILD(tree, i+1), NULL));\r
+    }\r
+    return res;\r
+}\r
+\r
+\r
+/* dotted_as_name:  dotted_name [NAME NAME]\r
+ */\r
+static int\r
+validate_dotted_as_name(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, dotted_as_name);\r
+\r
+    if (res) {\r
+        if (nch == 1)\r
+            res = validate_dotted_name(CHILD(tree, 0));\r
+        else if (nch == 3)\r
+            res = (validate_dotted_name(CHILD(tree, 0))\r
+                   && validate_name(CHILD(tree, 1), "as")\r
+                   && validate_name(CHILD(tree, 2), NULL));\r
+        else {\r
+            res = 0;\r
+            err_string("illegal number of children for dotted_as_name");\r
+        }\r
+    }\r
+    return res;\r
+}\r
+\r
+\r
+/* dotted_as_name (',' dotted_as_name)* */\r
+static int\r
+validate_dotted_as_names(node *tree)\r
+{\r
+        int nch = NCH(tree);\r
+        int res = is_odd(nch) && validate_dotted_as_name(CHILD(tree, 0));\r
+        int i;\r
+\r
+        for (i = 1; res && (i < nch); i += 2)\r
+            res = (validate_comma(CHILD(tree, i))\r
+                   && validate_dotted_as_name(CHILD(tree, i + 1)));\r
+        return (res);\r
+}\r
+\r
+\r
+/* import_as_name (',' import_as_name)* [','] */\r
+static int\r
+validate_import_as_names(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_import_as_name(CHILD(tree, 0));\r
+    int i;\r
+\r
+    for (i = 1; res && (i + 1 < nch); i += 2)\r
+        res = (validate_comma(CHILD(tree, i))\r
+               && validate_import_as_name(CHILD(tree, i + 1)));\r
+    return (res);\r
+}\r
+\r
+\r
+/* 'import' dotted_as_names */\r
+static int\r
+validate_import_name(node *tree)\r
+{\r
+        return (validate_ntype(tree, import_name)\r
+                && validate_numnodes(tree, 2, "import_name")\r
+                && validate_name(CHILD(tree, 0), "import")\r
+                && validate_dotted_as_names(CHILD(tree, 1)));\r
+}\r
+\r
+/* Helper function to count the number of leading dots in\r
+ * 'from ...module import name'\r
+ */\r
+static int\r
+count_from_dots(node *tree)\r
+{\r
+        int i;\r
+        for (i = 1; i < NCH(tree); i++)\r
+                if (TYPE(CHILD(tree, i)) != DOT)\r
+                        break;\r
+        return i-1;\r
+}\r
+\r
+/* import_from: ('from' ('.'* dotted_name | '.'+)\r
+ *               'import' ('*' | '(' import_as_names ')' | import_as_names))\r
+ */\r
+static int\r
+validate_import_from(node *tree)\r
+{\r
+        int nch = NCH(tree);\r
+        int ndots = count_from_dots(tree);\r
+        int havename = (TYPE(CHILD(tree, ndots + 1)) == dotted_name);\r
+        int offset = ndots + havename;\r
+        int res = validate_ntype(tree, import_from)\r
+                && (offset >= 1)\r
+                && (nch >= 3 + offset)\r
+                && validate_name(CHILD(tree, 0), "from")\r
+                && (!havename || validate_dotted_name(CHILD(tree, ndots + 1)))\r
+                && validate_name(CHILD(tree, offset + 1), "import");\r
+\r
+        if (res && TYPE(CHILD(tree, offset + 2)) == LPAR)\r
+            res = ((nch == offset + 5)\r
+                   && validate_lparen(CHILD(tree, offset + 2))\r
+                   && validate_import_as_names(CHILD(tree, offset + 3))\r
+                   && validate_rparen(CHILD(tree, offset + 4)));\r
+        else if (res && TYPE(CHILD(tree, offset + 2)) != STAR)\r
+            res = validate_import_as_names(CHILD(tree, offset + 2));\r
+        return (res);\r
+}\r
+\r
+\r
+/* import_stmt: import_name | import_from */\r
+static int\r
+validate_import_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_numnodes(tree, 1, "import_stmt");\r
+\r
+    if (res) {\r
+        int ntype = TYPE(CHILD(tree, 0));\r
+\r
+        if (ntype == import_name || ntype == import_from)\r
+            res = validate_node(CHILD(tree, 0));\r
+        else {\r
+            res = 0;\r
+            err_string("illegal import_stmt child type");\r
+        }\r
+    }\r
+    else if (nch == 1) {\r
+        res = 0;\r
+        PyErr_Format(parser_error,\r
+                     "Unrecognized child node of import_stmt: %d.",\r
+                     TYPE(CHILD(tree, 0)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+\r
+\r
+static int\r
+validate_global_stmt(node *tree)\r
+{\r
+    int j;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, global_stmt)\r
+               && is_even(nch) && (nch >= 2));\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("illegal global statement");\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "global")\r
+               && validate_ntype(CHILD(tree, 1), NAME));\r
+    for (j = 2; res && (j < nch); j += 2)\r
+        res = (validate_comma(CHILD(tree, j))\r
+               && validate_ntype(CHILD(tree, j + 1), NAME));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  exec_stmt:\r
+ *\r
+ *  'exec' expr ['in' test [',' test]]\r
+ */\r
+static int\r
+validate_exec_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, exec_stmt)\r
+               && ((nch == 2) || (nch == 4) || (nch == 6))\r
+               && validate_name(CHILD(tree, 0), "exec")\r
+               && validate_expr(CHILD(tree, 1)));\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("illegal exec statement");\r
+    if (res && (nch > 2))\r
+        res = (validate_name(CHILD(tree, 2), "in")\r
+               && validate_test(CHILD(tree, 3)));\r
+    if (res && (nch == 6))\r
+        res = (validate_comma(CHILD(tree, 4))\r
+               && validate_test(CHILD(tree, 5)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  assert_stmt:\r
+ *\r
+ *  'assert' test [',' test]\r
+ */\r
+static int\r
+validate_assert_stmt(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, assert_stmt)\r
+               && ((nch == 2) || (nch == 4))\r
+               && (validate_name(CHILD(tree, 0), "assert"))\r
+               && validate_test(CHILD(tree, 1)));\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("illegal assert statement");\r
+    if (res && (nch > 2))\r
+        res = (validate_comma(CHILD(tree, 2))\r
+               && validate_test(CHILD(tree, 3)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_while(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, while_stmt)\r
+               && ((nch == 4) || (nch == 7))\r
+               && validate_name(CHILD(tree, 0), "while")\r
+               && validate_test(CHILD(tree, 1))\r
+               && validate_colon(CHILD(tree, 2))\r
+               && validate_suite(CHILD(tree, 3)));\r
+\r
+    if (res && (nch == 7))\r
+        res = (validate_name(CHILD(tree, 4), "else")\r
+               && validate_colon(CHILD(tree, 5))\r
+               && validate_suite(CHILD(tree, 6)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_for(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, for_stmt)\r
+               && ((nch == 6) || (nch == 9))\r
+               && validate_name(CHILD(tree, 0), "for")\r
+               && validate_exprlist(CHILD(tree, 1))\r
+               && validate_name(CHILD(tree, 2), "in")\r
+               && validate_testlist(CHILD(tree, 3))\r
+               && validate_colon(CHILD(tree, 4))\r
+               && validate_suite(CHILD(tree, 5)));\r
+\r
+    if (res && (nch == 9))\r
+        res = (validate_name(CHILD(tree, 6), "else")\r
+               && validate_colon(CHILD(tree, 7))\r
+               && validate_suite(CHILD(tree, 8)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  try_stmt:\r
+ *      'try' ':' suite (except_clause ':' suite)+ ['else' ':' suite]\r
+                                                   ['finally' ':' suite]\r
+ *    | 'try' ':' suite 'finally' ':' suite\r
+ *\r
+ */\r
+static int\r
+validate_try(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int pos = 3;\r
+    int res = (validate_ntype(tree, try_stmt)\r
+               && (nch >= 6) && ((nch % 3) == 0));\r
+\r
+    if (res)\r
+        res = (validate_name(CHILD(tree, 0), "try")\r
+               && validate_colon(CHILD(tree, 1))\r
+               && validate_suite(CHILD(tree, 2))\r
+               && validate_colon(CHILD(tree, nch - 2))\r
+               && validate_suite(CHILD(tree, nch - 1)));\r
+    else if (!PyErr_Occurred()) {\r
+        const char* name = "except";\r
+        if (TYPE(CHILD(tree, nch - 3)) != except_clause)\r
+            name = STR(CHILD(tree, nch - 3));\r
+\r
+        PyErr_Format(parser_error,\r
+                     "Illegal number of children for try/%s node.", name);\r
+    }\r
+    /* Handle try/finally statement */\r
+    if (res && (TYPE(CHILD(tree, pos)) == NAME) &&\r
+        (strcmp(STR(CHILD(tree, pos)), "finally") == 0)) {\r
+        res = (validate_numnodes(tree, 6, "try/finally")\r
+               && validate_colon(CHILD(tree, 4))\r
+               && validate_suite(CHILD(tree, 5)));\r
+        return (res);\r
+    }\r
+    /* try/except statement: skip past except_clause sections */\r
+    while (res && pos < nch && (TYPE(CHILD(tree, pos)) == except_clause)) {\r
+        res = (validate_except_clause(CHILD(tree, pos))\r
+               && validate_colon(CHILD(tree, pos + 1))\r
+               && validate_suite(CHILD(tree, pos + 2)));\r
+        pos += 3;\r
+    }\r
+    /* skip else clause */\r
+    if (res && pos < nch && (TYPE(CHILD(tree, pos)) == NAME) &&\r
+        (strcmp(STR(CHILD(tree, pos)), "else") == 0)) {\r
+        res = (validate_colon(CHILD(tree, pos + 1))\r
+               && validate_suite(CHILD(tree, pos + 2)));\r
+        pos += 3;\r
+    }\r
+    if (res && pos < nch) {\r
+        /* last clause must be a finally */\r
+        res = (validate_name(CHILD(tree, pos), "finally")\r
+               && validate_numnodes(tree, pos + 3, "try/except/finally")\r
+               && validate_colon(CHILD(tree, pos + 1))\r
+               && validate_suite(CHILD(tree, pos + 2)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_except_clause(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, except_clause)\r
+               && ((nch == 1) || (nch == 2) || (nch == 4))\r
+               && validate_name(CHILD(tree, 0), "except"));\r
+\r
+    if (res && (nch > 1))\r
+        res = validate_test(CHILD(tree, 1));\r
+    if (res && (nch == 4)) {\r
+        if (TYPE(CHILD(tree, 2)) == NAME)\r
+            res = validate_name(CHILD(tree, 2), "as");\r
+        else\r
+            res = validate_comma(CHILD(tree, 2));\r
+        res = res && validate_test(CHILD(tree, 3));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_test(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, test) && is_odd(nch);\r
+\r
+    if (res && (TYPE(CHILD(tree, 0)) == lambdef))\r
+        res = ((nch == 1)\r
+               && validate_lambdef(CHILD(tree, 0)));\r
+    else if (res) {\r
+        res = validate_or_test(CHILD(tree, 0));\r
+        res = (res && (nch == 1 || (nch == 5 &&\r
+            validate_name(CHILD(tree, 1), "if") &&\r
+            validate_or_test(CHILD(tree, 2)) &&\r
+            validate_name(CHILD(tree, 3), "else") &&\r
+            validate_test(CHILD(tree, 4)))));\r
+    }\r
+    return (res);\r
+}\r
+\r
+static int\r
+validate_old_test(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, old_test) && (nch == 1);\r
+\r
+    if (res && (TYPE(CHILD(tree, 0)) == old_lambdef))\r
+        res = (validate_old_lambdef(CHILD(tree, 0)));\r
+    else if (res) {\r
+        res = (validate_or_test(CHILD(tree, 0)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+static int\r
+validate_or_test(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, or_test) && is_odd(nch);\r
+\r
+    if (res) {\r
+        int pos;\r
+        res = validate_and_test(CHILD(tree, 0));\r
+        for (pos = 1; res && (pos < nch); pos += 2)\r
+            res = (validate_name(CHILD(tree, pos), "or")\r
+                   && validate_and_test(CHILD(tree, pos + 1)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_and_test(node *tree)\r
+{\r
+    int pos;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, and_test)\r
+               && is_odd(nch)\r
+               && validate_not_test(CHILD(tree, 0)));\r
+\r
+    for (pos = 1; res && (pos < nch); pos += 2)\r
+        res = (validate_name(CHILD(tree, pos), "and")\r
+               && validate_not_test(CHILD(tree, 0)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_not_test(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, not_test) && ((nch == 1) || (nch == 2));\r
+\r
+    if (res) {\r
+        if (nch == 2)\r
+            res = (validate_name(CHILD(tree, 0), "not")\r
+                   && validate_not_test(CHILD(tree, 1)));\r
+        else if (nch == 1)\r
+            res = validate_comparison(CHILD(tree, 0));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_comparison(node *tree)\r
+{\r
+    int pos;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, comparison)\r
+               && is_odd(nch)\r
+               && validate_expr(CHILD(tree, 0)));\r
+\r
+    for (pos = 1; res && (pos < nch); pos += 2)\r
+        res = (validate_comp_op(CHILD(tree, pos))\r
+               && validate_expr(CHILD(tree, pos + 1)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_comp_op(node *tree)\r
+{\r
+    int res = 0;\r
+    int nch = NCH(tree);\r
+\r
+    if (!validate_ntype(tree, comp_op))\r
+        return (0);\r
+    if (nch == 1) {\r
+        /*\r
+         *  Only child will be a terminal with a well-defined symbolic name\r
+         *  or a NAME with a string of either 'is' or 'in'\r
+         */\r
+        tree = CHILD(tree, 0);\r
+        switch (TYPE(tree)) {\r
+            case LESS:\r
+            case GREATER:\r
+            case EQEQUAL:\r
+            case EQUAL:\r
+            case LESSEQUAL:\r
+            case GREATEREQUAL:\r
+            case NOTEQUAL:\r
+              res = 1;\r
+              break;\r
+            case NAME:\r
+              res = ((strcmp(STR(tree), "in") == 0)\r
+                     || (strcmp(STR(tree), "is") == 0));\r
+              if (!res) {\r
+                  PyErr_Format(parser_error,\r
+                               "illegal operator '%s'", STR(tree));\r
+              }\r
+              break;\r
+          default:\r
+              err_string("illegal comparison operator type");\r
+              break;\r
+        }\r
+    }\r
+    else if ((res = validate_numnodes(tree, 2, "comp_op")) != 0) {\r
+        res = (validate_ntype(CHILD(tree, 0), NAME)\r
+               && validate_ntype(CHILD(tree, 1), NAME)\r
+               && (((strcmp(STR(CHILD(tree, 0)), "is") == 0)\r
+                    && (strcmp(STR(CHILD(tree, 1)), "not") == 0))\r
+                   || ((strcmp(STR(CHILD(tree, 0)), "not") == 0)\r
+                       && (strcmp(STR(CHILD(tree, 1)), "in") == 0))));\r
+        if (!res && !PyErr_Occurred())\r
+            err_string("unknown comparison operator");\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_expr(node *tree)\r
+{\r
+    int j;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, expr)\r
+               && is_odd(nch)\r
+               && validate_xor_expr(CHILD(tree, 0)));\r
+\r
+    for (j = 2; res && (j < nch); j += 2)\r
+        res = (validate_xor_expr(CHILD(tree, j))\r
+               && validate_vbar(CHILD(tree, j - 1)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_xor_expr(node *tree)\r
+{\r
+    int j;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, xor_expr)\r
+               && is_odd(nch)\r
+               && validate_and_expr(CHILD(tree, 0)));\r
+\r
+    for (j = 2; res && (j < nch); j += 2)\r
+        res = (validate_circumflex(CHILD(tree, j - 1))\r
+               && validate_and_expr(CHILD(tree, j)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_and_expr(node *tree)\r
+{\r
+    int pos;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, and_expr)\r
+               && is_odd(nch)\r
+               && validate_shift_expr(CHILD(tree, 0)));\r
+\r
+    for (pos = 1; res && (pos < nch); pos += 2)\r
+        res = (validate_ampersand(CHILD(tree, pos))\r
+               && validate_shift_expr(CHILD(tree, pos + 1)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_chain_two_ops(node *tree, int (*termvalid)(node *), int op1, int op2)\r
+ {\r
+    int pos = 1;\r
+    int nch = NCH(tree);\r
+    int res = (is_odd(nch)\r
+               && (*termvalid)(CHILD(tree, 0)));\r
+\r
+    for ( ; res && (pos < nch); pos += 2) {\r
+        if (TYPE(CHILD(tree, pos)) != op1)\r
+            res = validate_ntype(CHILD(tree, pos), op2);\r
+        if (res)\r
+            res = (*termvalid)(CHILD(tree, pos + 1));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_shift_expr(node *tree)\r
+{\r
+    return (validate_ntype(tree, shift_expr)\r
+            && validate_chain_two_ops(tree, validate_arith_expr,\r
+                                      LEFTSHIFT, RIGHTSHIFT));\r
+}\r
+\r
+\r
+static int\r
+validate_arith_expr(node *tree)\r
+{\r
+    return (validate_ntype(tree, arith_expr)\r
+            && validate_chain_two_ops(tree, validate_term, PLUS, MINUS));\r
+}\r
+\r
+\r
+static int\r
+validate_term(node *tree)\r
+{\r
+    int pos = 1;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, term)\r
+               && is_odd(nch)\r
+               && validate_factor(CHILD(tree, 0)));\r
+\r
+    for ( ; res && (pos < nch); pos += 2)\r
+        res = (((TYPE(CHILD(tree, pos)) == STAR)\r
+               || (TYPE(CHILD(tree, pos)) == SLASH)\r
+               || (TYPE(CHILD(tree, pos)) == DOUBLESLASH)\r
+               || (TYPE(CHILD(tree, pos)) == PERCENT))\r
+               && validate_factor(CHILD(tree, pos + 1)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  factor:\r
+ *\r
+ *  factor: ('+'|'-'|'~') factor | power\r
+ */\r
+static int\r
+validate_factor(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, factor)\r
+               && (((nch == 2)\r
+                    && ((TYPE(CHILD(tree, 0)) == PLUS)\r
+                        || (TYPE(CHILD(tree, 0)) == MINUS)\r
+                        || (TYPE(CHILD(tree, 0)) == TILDE))\r
+                    && validate_factor(CHILD(tree, 1)))\r
+                   || ((nch == 1)\r
+                       && validate_power(CHILD(tree, 0)))));\r
+    return (res);\r
+}\r
+\r
+\r
+/*  power:\r
+ *\r
+ *  power: atom trailer* ('**' factor)*\r
+ */\r
+static int\r
+validate_power(node *tree)\r
+{\r
+    int pos = 1;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, power) && (nch >= 1)\r
+               && validate_atom(CHILD(tree, 0)));\r
+\r
+    while (res && (pos < nch) && (TYPE(CHILD(tree, pos)) == trailer))\r
+        res = validate_trailer(CHILD(tree, pos++));\r
+    if (res && (pos < nch)) {\r
+        if (!is_even(nch - pos)) {\r
+            err_string("illegal number of nodes for 'power'");\r
+            return (0);\r
+        }\r
+        for ( ; res && (pos < (nch - 1)); pos += 2)\r
+            res = (validate_doublestar(CHILD(tree, pos))\r
+                   && validate_factor(CHILD(tree, pos + 1)));\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_atom(node *tree)\r
+{\r
+    int pos;\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, atom);\r
+\r
+    if (res && nch < 1)\r
+        res = validate_numnodes(tree, nch+1, "atom");\r
+    if (res) {\r
+        switch (TYPE(CHILD(tree, 0))) {\r
+          case LPAR:\r
+            res = ((nch <= 3)\r
+                   && (validate_rparen(CHILD(tree, nch - 1))));\r
+\r
+            if (res && (nch == 3)) {\r
+                if (TYPE(CHILD(tree, 1))==yield_expr)\r
+                        res = validate_yield_expr(CHILD(tree, 1));\r
+                else\r
+                        res = validate_testlist_comp(CHILD(tree, 1));\r
+            }\r
+            break;\r
+          case LSQB:\r
+            if (nch == 2)\r
+                res = validate_ntype(CHILD(tree, 1), RSQB);\r
+            else if (nch == 3)\r
+                res = (validate_listmaker(CHILD(tree, 1))\r
+                       && validate_ntype(CHILD(tree, 2), RSQB));\r
+            else {\r
+                res = 0;\r
+                err_string("illegal list display atom");\r
+            }\r
+            break;\r
+          case LBRACE:\r
+            res = ((nch <= 3)\r
+                   && validate_ntype(CHILD(tree, nch - 1), RBRACE));\r
+\r
+            if (res && (nch == 3))\r
+                res = validate_dictorsetmaker(CHILD(tree, 1));\r
+            break;\r
+          case BACKQUOTE:\r
+            res = ((nch == 3)\r
+                   && validate_testlist1(CHILD(tree, 1))\r
+                   && validate_ntype(CHILD(tree, 2), BACKQUOTE));\r
+            break;\r
+          case NAME:\r
+          case NUMBER:\r
+            res = (nch == 1);\r
+            break;\r
+          case STRING:\r
+            for (pos = 1; res && (pos < nch); ++pos)\r
+                res = validate_ntype(CHILD(tree, pos), STRING);\r
+            break;\r
+          default:\r
+            res = 0;\r
+            break;\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  listmaker:\r
+ *    test ( list_for | (',' test)* [','] )\r
+ */\r
+static int\r
+validate_listmaker(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = nch;\r
+\r
+    if (nch == 0)\r
+        err_string("missing child nodes of listmaker");\r
+    else\r
+        ok = validate_test(CHILD(tree, 0));\r
+\r
+    /*\r
+     *  list_for | (',' test)* [',']\r
+     */\r
+    if (nch == 2 && TYPE(CHILD(tree, 1)) == list_for)\r
+        ok = validate_list_for(CHILD(tree, 1));\r
+    else {\r
+        /*  (',' test)* [',']  */\r
+        int i = 1;\r
+        while (ok && nch - i >= 2) {\r
+            ok = (validate_comma(CHILD(tree, i))\r
+                  && validate_test(CHILD(tree, i+1)));\r
+            i += 2;\r
+        }\r
+        if (ok && i == nch-1)\r
+            ok = validate_comma(CHILD(tree, i));\r
+        else if (i != nch) {\r
+            ok = 0;\r
+            err_string("illegal trailing nodes for listmaker");\r
+        }\r
+    }\r
+    return ok;\r
+}\r
+\r
+/*  testlist_comp:\r
+ *    test ( comp_for | (',' test)* [','] )\r
+ */\r
+static int\r
+validate_testlist_comp(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = nch;\r
+\r
+    if (nch == 0)\r
+        err_string("missing child nodes of testlist_comp");\r
+    else {\r
+        ok = validate_test(CHILD(tree, 0));\r
+    }\r
+\r
+    /*\r
+     *  comp_for | (',' test)* [',']\r
+     */\r
+    if (nch == 2 && TYPE(CHILD(tree, 1)) == comp_for)\r
+        ok = validate_comp_for(CHILD(tree, 1));\r
+    else {\r
+        /*  (',' test)* [',']  */\r
+        int i = 1;\r
+        while (ok && nch - i >= 2) {\r
+            ok = (validate_comma(CHILD(tree, i))\r
+                  && validate_test(CHILD(tree, i+1)));\r
+            i += 2;\r
+        }\r
+        if (ok && i == nch-1)\r
+            ok = validate_comma(CHILD(tree, i));\r
+        else if (i != nch) {\r
+            ok = 0;\r
+            err_string("illegal trailing nodes for testlist_comp");\r
+        }\r
+    }\r
+    return ok;\r
+}\r
+\r
+/*  decorator:\r
+ *    '@' dotted_name [ '(' [arglist] ')' ] NEWLINE\r
+ */\r
+static int\r
+validate_decorator(node *tree)\r
+{\r
+    int ok;\r
+    int nch = NCH(tree);\r
+    ok = (validate_ntype(tree, decorator) &&\r
+          (nch == 3 || nch == 5 || nch == 6) &&\r
+          validate_at(CHILD(tree, 0)) &&\r
+          validate_dotted_name(CHILD(tree, 1)) &&\r
+          validate_newline(RCHILD(tree, -1)));\r
+\r
+    if (ok && nch != 3) {\r
+        ok = (validate_lparen(CHILD(tree, 2)) &&\r
+              validate_rparen(RCHILD(tree, -2)));\r
+\r
+        if (ok && nch == 6)\r
+            ok = validate_arglist(CHILD(tree, 3));\r
+    }\r
+\r
+    return ok;\r
+}\r
+\r
+/*  decorators:\r
+ *    decorator+\r
+ */\r
+static int\r
+validate_decorators(node *tree)\r
+{\r
+    int i, nch, ok;\r
+    nch = NCH(tree);\r
+    ok = validate_ntype(tree, decorators) && nch >= 1;\r
+\r
+    for (i = 0; ok && i < nch; ++i)\r
+        ok = validate_decorator(CHILD(tree, i));\r
+\r
+    return ok;\r
+}\r
+\r
+/*  with_item:\r
+ *   test ['as' expr]\r
+ */\r
+static int\r
+validate_with_item(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = (validate_ntype(tree, with_item)\r
+              && (nch == 1 || nch == 3)\r
+              && validate_test(CHILD(tree, 0)));\r
+    if (ok && nch == 3)\r
+        ok = (validate_name(CHILD(tree, 1), "as")\r
+              && validate_expr(CHILD(tree, 2)));\r
+    return ok;\r
+}\r
+\r
+/*  with_stmt:\r
+ *    0      1          ...             -2   -1\r
+ *   'with' with_item (',' with_item)* ':' suite\r
+ */\r
+static int\r
+validate_with_stmt(node *tree)\r
+{\r
+    int i;\r
+    int nch = NCH(tree);\r
+    int ok = (validate_ntype(tree, with_stmt)\r
+        && (nch % 2 == 0)\r
+        && validate_name(CHILD(tree, 0), "with")\r
+        && validate_colon(RCHILD(tree, -2))\r
+        && validate_suite(RCHILD(tree, -1)));\r
+    for (i = 1; ok && i < nch - 2; i += 2)\r
+        ok = validate_with_item(CHILD(tree, i));\r
+    return ok;\r
+}\r
+\r
+/*  funcdef:\r
+ *\r
+ *     -5   -4         -3  -2    -1\r
+ *  'def' NAME parameters ':' suite\r
+ */\r
+static int\r
+validate_funcdef(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = (validate_ntype(tree, funcdef)\r
+               && (nch == 5)\r
+               && validate_name(RCHILD(tree, -5), "def")\r
+               && validate_ntype(RCHILD(tree, -4), NAME)\r
+               && validate_colon(RCHILD(tree, -2))\r
+               && validate_parameters(RCHILD(tree, -3))\r
+               && validate_suite(RCHILD(tree, -1)));\r
+    return ok;\r
+}\r
+\r
+\r
+/* decorated\r
+ *   decorators (classdef | funcdef)\r
+ */\r
+static int\r
+validate_decorated(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = (validate_ntype(tree, decorated)\r
+              && (nch == 2)\r
+              && validate_decorators(RCHILD(tree, -2)));\r
+    if (TYPE(RCHILD(tree, -1)) == funcdef)\r
+        ok = ok && validate_funcdef(RCHILD(tree, -1));\r
+    else\r
+        ok = ok && validate_class(RCHILD(tree, -1));\r
+    return ok;\r
+}\r
+\r
+static int\r
+validate_lambdef(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, lambdef)\r
+               && ((nch == 3) || (nch == 4))\r
+               && validate_name(CHILD(tree, 0), "lambda")\r
+               && validate_colon(CHILD(tree, nch - 2))\r
+               && validate_test(CHILD(tree, nch - 1)));\r
+\r
+    if (res && (nch == 4))\r
+        res = validate_varargslist(CHILD(tree, 1));\r
+    else if (!res && !PyErr_Occurred())\r
+        (void) validate_numnodes(tree, 3, "lambdef");\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_old_lambdef(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, old_lambdef)\r
+               && ((nch == 3) || (nch == 4))\r
+               && validate_name(CHILD(tree, 0), "lambda")\r
+               && validate_colon(CHILD(tree, nch - 2))\r
+               && validate_test(CHILD(tree, nch - 1)));\r
+\r
+    if (res && (nch == 4))\r
+        res = validate_varargslist(CHILD(tree, 1));\r
+    else if (!res && !PyErr_Occurred())\r
+        (void) validate_numnodes(tree, 3, "old_lambdef");\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  arglist:\r
+ *\r
+ *  (argument ',')* (argument [','] | '*' test [',' '**' test] | '**' test)\r
+ */\r
+static int\r
+validate_arglist(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int i = 0;\r
+    int ok = 1;\r
+\r
+    if (nch <= 0)\r
+        /* raise the right error from having an invalid number of children */\r
+        return validate_numnodes(tree, nch + 1, "arglist");\r
+\r
+    if (nch > 1) {\r
+        for (i=0; i<nch; i++) {\r
+            if (TYPE(CHILD(tree, i)) == argument) {\r
+                node *ch = CHILD(tree, i);\r
+                if (NCH(ch) == 2 && TYPE(CHILD(ch, 1)) == comp_for) {\r
+                    err_string("need '(', ')' for generator expression");\r
+                    return 0;\r
+                }\r
+            }\r
+        }\r
+    }\r
+\r
+    while (ok && nch-i >= 2) {\r
+        /* skip leading (argument ',') */\r
+        ok = (validate_argument(CHILD(tree, i))\r
+              && validate_comma(CHILD(tree, i+1)));\r
+        if (ok)\r
+            i += 2;\r
+        else\r
+            PyErr_Clear();\r
+    }\r
+    ok = 1;\r
+    if (nch-i > 0) {\r
+        /*\r
+         * argument | '*' test [',' '**' test] | '**' test\r
+         */\r
+        int sym = TYPE(CHILD(tree, i));\r
+\r
+        if (sym == argument) {\r
+            ok = validate_argument(CHILD(tree, i));\r
+            if (ok && i+1 != nch) {\r
+                err_string("illegal arglist specification"\r
+                           " (extra stuff on end)");\r
+                ok = 0;\r
+            }\r
+        }\r
+        else if (sym == STAR) {\r
+            ok = validate_star(CHILD(tree, i));\r
+            if (ok && (nch-i == 2))\r
+                ok = validate_test(CHILD(tree, i+1));\r
+            else if (ok && (nch-i == 5))\r
+                ok = (validate_test(CHILD(tree, i+1))\r
+                      && validate_comma(CHILD(tree, i+2))\r
+                      && validate_doublestar(CHILD(tree, i+3))\r
+                      && validate_test(CHILD(tree, i+4)));\r
+            else {\r
+                err_string("illegal use of '*' in arglist");\r
+                ok = 0;\r
+            }\r
+        }\r
+        else if (sym == DOUBLESTAR) {\r
+            if (nch-i == 2)\r
+                ok = (validate_doublestar(CHILD(tree, i))\r
+                      && validate_test(CHILD(tree, i+1)));\r
+            else {\r
+                err_string("illegal use of '**' in arglist");\r
+                ok = 0;\r
+            }\r
+        }\r
+        else {\r
+            err_string("illegal arglist specification");\r
+            ok = 0;\r
+        }\r
+    }\r
+    return (ok);\r
+}\r
+\r
+\r
+\r
+/*  argument:\r
+ *\r
+ *  [test '='] test [comp_for]\r
+ */\r
+static int\r
+validate_argument(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, argument)\r
+               && ((nch == 1) || (nch == 2) || (nch == 3))\r
+               && validate_test(CHILD(tree, 0)));\r
+\r
+    if (res && (nch == 2))\r
+        res = validate_comp_for(CHILD(tree, 1));\r
+    else if (res && (nch == 3))\r
+        res = (validate_equal(CHILD(tree, 1))\r
+               && validate_test(CHILD(tree, 2)));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+\r
+/*  trailer:\r
+ *\r
+ *  '(' [arglist] ')' | '[' subscriptlist ']' | '.' NAME\r
+ */\r
+static int\r
+validate_trailer(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, trailer) && ((nch == 2) || (nch == 3));\r
+\r
+    if (res) {\r
+        switch (TYPE(CHILD(tree, 0))) {\r
+          case LPAR:\r
+            res = validate_rparen(CHILD(tree, nch - 1));\r
+            if (res && (nch == 3))\r
+                res = validate_arglist(CHILD(tree, 1));\r
+            break;\r
+          case LSQB:\r
+            res = (validate_numnodes(tree, 3, "trailer")\r
+                   && validate_subscriptlist(CHILD(tree, 1))\r
+                   && validate_ntype(CHILD(tree, 2), RSQB));\r
+            break;\r
+          case DOT:\r
+            res = (validate_numnodes(tree, 2, "trailer")\r
+                   && validate_ntype(CHILD(tree, 1), NAME));\r
+            break;\r
+          default:\r
+            res = 0;\r
+            break;\r
+        }\r
+    }\r
+    else {\r
+        (void) validate_numnodes(tree, 2, "trailer");\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+/*  subscriptlist:\r
+ *\r
+ *  subscript (',' subscript)* [',']\r
+ */\r
+static int\r
+validate_subscriptlist(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, subscriptlist,\r
+                                    validate_subscript, "subscriptlist"));\r
+}\r
+\r
+\r
+/*  subscript:\r
+ *\r
+ *  '.' '.' '.' | test | [test] ':' [test] [sliceop]\r
+ */\r
+static int\r
+validate_subscript(node *tree)\r
+{\r
+    int offset = 0;\r
+    int nch = NCH(tree);\r
+    int res = validate_ntype(tree, subscript) && (nch >= 1) && (nch <= 4);\r
+\r
+    if (!res) {\r
+        if (!PyErr_Occurred())\r
+            err_string("invalid number of arguments for subscript node");\r
+        return (0);\r
+    }\r
+    if (TYPE(CHILD(tree, 0)) == DOT)\r
+        /* take care of ('.' '.' '.') possibility */\r
+        return (validate_numnodes(tree, 3, "subscript")\r
+                && validate_dot(CHILD(tree, 0))\r
+                && validate_dot(CHILD(tree, 1))\r
+                && validate_dot(CHILD(tree, 2)));\r
+    if (nch == 1) {\r
+        if (TYPE(CHILD(tree, 0)) == test)\r
+            res = validate_test(CHILD(tree, 0));\r
+        else\r
+            res = validate_colon(CHILD(tree, 0));\r
+        return (res);\r
+    }\r
+    /*  Must be [test] ':' [test] [sliceop],\r
+     *  but at least one of the optional components will\r
+     *  be present, but we don't know which yet.\r
+     */\r
+    if ((TYPE(CHILD(tree, 0)) != COLON) || (nch == 4)) {\r
+        res = validate_test(CHILD(tree, 0));\r
+        offset = 1;\r
+    }\r
+    if (res)\r
+        res = validate_colon(CHILD(tree, offset));\r
+    if (res) {\r
+        int rem = nch - ++offset;\r
+        if (rem) {\r
+            if (TYPE(CHILD(tree, offset)) == test) {\r
+                res = validate_test(CHILD(tree, offset));\r
+                ++offset;\r
+                --rem;\r
+            }\r
+            if (res && rem)\r
+                res = validate_sliceop(CHILD(tree, offset));\r
+        }\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_sliceop(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = ((nch == 1) || validate_numnodes(tree, 2, "sliceop"))\r
+              && validate_ntype(tree, sliceop);\r
+    if (!res && !PyErr_Occurred()) {\r
+        res = validate_numnodes(tree, 1, "sliceop");\r
+    }\r
+    if (res)\r
+        res = validate_colon(CHILD(tree, 0));\r
+    if (res && (nch == 2))\r
+        res = validate_test(CHILD(tree, 1));\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_exprlist(node *tree)\r
+{\r
+    return (validate_repeating_list(tree, exprlist,\r
+                                    validate_expr, "exprlist"));\r
+}\r
+\r
+\r
+/*\r
+ * dictorsetmaker:\r
+ *\r
+ * (test ':' test (comp_for | (',' test ':' test)* [','])) |\r
+ * (test (comp_for | (',' test)* [',']))\r
+ */\r
+static int\r
+validate_dictorsetmaker(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int ok = validate_ntype(tree, dictorsetmaker);\r
+    int i = 0;\r
+    int check_trailing_comma = 0;\r
+\r
+    assert(nch > 0);\r
+\r
+    if (ok && (nch == 1 || TYPE(CHILD(tree, 1)) == COMMA)) {\r
+        /* We got a set:\r
+         *     test (',' test)* [',']\r
+         */\r
+        ok = validate_test(CHILD(tree, i++));\r
+        while (ok && nch - i >= 2) {\r
+            ok = (validate_comma(CHILD(tree, i))\r
+                   && validate_test(CHILD(tree, i+1)));\r
+            i += 2;\r
+        }\r
+        check_trailing_comma = 1;\r
+    }\r
+    else if (ok && TYPE(CHILD(tree, 1)) == comp_for) {\r
+        /* We got a set comprehension:\r
+         *     test comp_for\r
+         */\r
+        ok = (validate_test(CHILD(tree, 0))\r
+              && validate_comp_for(CHILD(tree, 1)));\r
+    }\r
+    else if (ok && NCH(tree) > 3 && TYPE(CHILD(tree, 3)) == comp_for) {\r
+        /* We got a dict comprehension:\r
+         *     test ':' test comp_for\r
+         */\r
+        ok = (validate_test(CHILD(tree, 0))\r
+              && validate_colon(CHILD(tree, 1))\r
+              && validate_test(CHILD(tree, 2))\r
+              && validate_comp_for(CHILD(tree, 3)));\r
+    }\r
+    else if (ok) {\r
+        /* We got a dict:\r
+         *     test ':' test (',' test ':' test)* [',']\r
+         */\r
+        if (nch >= 3) {\r
+            ok = (validate_test(CHILD(tree, i))\r
+                  && validate_colon(CHILD(tree, i+1))\r
+                  && validate_test(CHILD(tree, i+2)));\r
+            i += 3;\r
+        }\r
+        else {\r
+            ok = 0;\r
+            err_string("illegal number of nodes for dictorsetmaker");\r
+        }\r
+\r
+        while (ok && nch - i >= 4) {\r
+            ok = (validate_comma(CHILD(tree, i))\r
+                  && validate_test(CHILD(tree, i+1))\r
+                  && validate_colon(CHILD(tree, i+2))\r
+                  && validate_test(CHILD(tree, i+3)));\r
+            i += 4;\r
+        }\r
+        check_trailing_comma = 1;\r
+    }\r
+    if (ok && check_trailing_comma) {\r
+        if (i == nch-1)\r
+            ok = validate_comma(CHILD(tree, i));\r
+        else if (i != nch) {\r
+            ok = 0;\r
+            err_string("illegal trailing nodes for dictorsetmaker");\r
+        }\r
+    }\r
+\r
+    return ok;\r
+}\r
+\r
+\r
+static int\r
+validate_eval_input(node *tree)\r
+{\r
+    int pos;\r
+    int nch = NCH(tree);\r
+    int res = (validate_ntype(tree, eval_input)\r
+               && (nch >= 2)\r
+               && validate_testlist(CHILD(tree, 0))\r
+               && validate_ntype(CHILD(tree, nch - 1), ENDMARKER));\r
+\r
+    for (pos = 1; res && (pos < (nch - 1)); ++pos)\r
+        res = validate_ntype(CHILD(tree, pos), NEWLINE);\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_node(node *tree)\r
+{\r
+    int   nch  = 0;                     /* num. children on current node  */\r
+    int   res  = 1;                     /* result value                   */\r
+    node* next = 0;                     /* node to process after this one */\r
+\r
+    while (res && (tree != 0)) {\r
+        nch  = NCH(tree);\r
+        next = 0;\r
+        switch (TYPE(tree)) {\r
+            /*\r
+             *  Definition nodes.\r
+             */\r
+          case funcdef:\r
+            res = validate_funcdef(tree);\r
+            break;\r
+          case with_stmt:\r
+            res = validate_with_stmt(tree);\r
+            break;\r
+          case classdef:\r
+            res = validate_class(tree);\r
+            break;\r
+          case decorated:\r
+            res = validate_decorated(tree);\r
+            break;\r
+            /*\r
+             *  "Trivial" parse tree nodes.\r
+             *  (Why did I call these trivial?)\r
+             */\r
+          case stmt:\r
+            res = validate_stmt(tree);\r
+            break;\r
+          case small_stmt:\r
+            /*\r
+             *  expr_stmt | print_stmt | del_stmt | pass_stmt | flow_stmt\r
+             *  | import_stmt | global_stmt | exec_stmt | assert_stmt\r
+             */\r
+            res = validate_small_stmt(tree);\r
+            break;\r
+          case flow_stmt:\r
+            res  = (validate_numnodes(tree, 1, "flow_stmt")\r
+                    && ((TYPE(CHILD(tree, 0)) == break_stmt)\r
+                        || (TYPE(CHILD(tree, 0)) == continue_stmt)\r
+                        || (TYPE(CHILD(tree, 0)) == yield_stmt)\r
+                        || (TYPE(CHILD(tree, 0)) == return_stmt)\r
+                        || (TYPE(CHILD(tree, 0)) == raise_stmt)));\r
+            if (res)\r
+                next = CHILD(tree, 0);\r
+            else if (nch == 1)\r
+                err_string("illegal flow_stmt type");\r
+            break;\r
+          case yield_stmt:\r
+            res = validate_yield_stmt(tree);\r
+            break;\r
+            /*\r
+             *  Compound statements.\r
+             */\r
+          case simple_stmt:\r
+            res = validate_simple_stmt(tree);\r
+            break;\r
+          case compound_stmt:\r
+            res = validate_compound_stmt(tree);\r
+            break;\r
+            /*\r
+             *  Fundamental statements.\r
+             */\r
+          case expr_stmt:\r
+            res = validate_expr_stmt(tree);\r
+            break;\r
+          case print_stmt:\r
+            res = validate_print_stmt(tree);\r
+            break;\r
+          case del_stmt:\r
+            res = validate_del_stmt(tree);\r
+            break;\r
+          case pass_stmt:\r
+            res = (validate_numnodes(tree, 1, "pass")\r
+                   && validate_name(CHILD(tree, 0), "pass"));\r
+            break;\r
+          case break_stmt:\r
+            res = (validate_numnodes(tree, 1, "break")\r
+                   && validate_name(CHILD(tree, 0), "break"));\r
+            break;\r
+          case continue_stmt:\r
+            res = (validate_numnodes(tree, 1, "continue")\r
+                   && validate_name(CHILD(tree, 0), "continue"));\r
+            break;\r
+          case return_stmt:\r
+            res = validate_return_stmt(tree);\r
+            break;\r
+          case raise_stmt:\r
+            res = validate_raise_stmt(tree);\r
+            break;\r
+          case import_stmt:\r
+            res = validate_import_stmt(tree);\r
+            break;\r
+          case import_name:\r
+            res = validate_import_name(tree);\r
+            break;\r
+          case import_from:\r
+            res = validate_import_from(tree);\r
+            break;\r
+          case global_stmt:\r
+            res = validate_global_stmt(tree);\r
+            break;\r
+          case exec_stmt:\r
+            res = validate_exec_stmt(tree);\r
+            break;\r
+          case assert_stmt:\r
+            res = validate_assert_stmt(tree);\r
+            break;\r
+          case if_stmt:\r
+            res = validate_if(tree);\r
+            break;\r
+          case while_stmt:\r
+            res = validate_while(tree);\r
+            break;\r
+          case for_stmt:\r
+            res = validate_for(tree);\r
+            break;\r
+          case try_stmt:\r
+            res = validate_try(tree);\r
+            break;\r
+          case suite:\r
+            res = validate_suite(tree);\r
+            break;\r
+            /*\r
+             *  Expression nodes.\r
+             */\r
+          case testlist:\r
+            res = validate_testlist(tree);\r
+            break;\r
+          case yield_expr:\r
+            res = validate_yield_expr(tree);\r
+            break;\r
+          case testlist1:\r
+            res = validate_testlist1(tree);\r
+            break;\r
+          case test:\r
+            res = validate_test(tree);\r
+            break;\r
+          case and_test:\r
+            res = validate_and_test(tree);\r
+            break;\r
+          case not_test:\r
+            res = validate_not_test(tree);\r
+            break;\r
+          case comparison:\r
+            res = validate_comparison(tree);\r
+            break;\r
+          case exprlist:\r
+            res = validate_exprlist(tree);\r
+            break;\r
+          case comp_op:\r
+            res = validate_comp_op(tree);\r
+            break;\r
+          case expr:\r
+            res = validate_expr(tree);\r
+            break;\r
+          case xor_expr:\r
+            res = validate_xor_expr(tree);\r
+            break;\r
+          case and_expr:\r
+            res = validate_and_expr(tree);\r
+            break;\r
+          case shift_expr:\r
+            res = validate_shift_expr(tree);\r
+            break;\r
+          case arith_expr:\r
+            res = validate_arith_expr(tree);\r
+            break;\r
+          case term:\r
+            res = validate_term(tree);\r
+            break;\r
+          case factor:\r
+            res = validate_factor(tree);\r
+            break;\r
+          case power:\r
+            res = validate_power(tree);\r
+            break;\r
+          case atom:\r
+            res = validate_atom(tree);\r
+            break;\r
+\r
+          default:\r
+            /* Hopefully never reached! */\r
+            err_string("unrecognized node type");\r
+            res = 0;\r
+            break;\r
+        }\r
+        tree = next;\r
+    }\r
+    return (res);\r
+}\r
+\r
+\r
+static int\r
+validate_expr_tree(node *tree)\r
+{\r
+    int res = validate_eval_input(tree);\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("could not validate expression tuple");\r
+\r
+    return (res);\r
+}\r
+\r
+\r
+/*  file_input:\r
+ *      (NEWLINE | stmt)* ENDMARKER\r
+ */\r
+static int\r
+validate_file_input(node *tree)\r
+{\r
+    int j;\r
+    int nch = NCH(tree) - 1;\r
+    int res = ((nch >= 0)\r
+               && validate_ntype(CHILD(tree, nch), ENDMARKER));\r
+\r
+    for (j = 0; res && (j < nch); ++j) {\r
+        if (TYPE(CHILD(tree, j)) == stmt)\r
+            res = validate_stmt(CHILD(tree, j));\r
+        else\r
+            res = validate_newline(CHILD(tree, j));\r
+    }\r
+    /*  This stays in to prevent any internal failures from getting to the\r
+     *  user.  Hopefully, this won't be needed.  If a user reports getting\r
+     *  this, we have some debugging to do.\r
+     */\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("VALIDATION FAILURE: report this to the maintainer!");\r
+\r
+    return (res);\r
+}\r
+\r
+static int\r
+validate_encoding_decl(node *tree)\r
+{\r
+    int nch = NCH(tree);\r
+    int res = ((nch == 1)\r
+        && validate_file_input(CHILD(tree, 0)));\r
+\r
+    if (!res && !PyErr_Occurred())\r
+        err_string("Error Parsing encoding_decl");\r
+\r
+    return res;\r
+}\r
+\r
+static PyObject*\r
+pickle_constructor = NULL;\r
+\r
+\r
+static PyObject*\r
+parser__pickler(PyObject *self, PyObject *args)\r
+{\r
+    NOTE(ARGUNUSED(self))\r
+    PyObject *result = NULL;\r
+    PyObject *st = NULL;\r
+    PyObject *empty_dict = NULL;\r
+\r
+    if (PyArg_ParseTuple(args, "O!:_pickler", &PyST_Type, &st)) {\r
+        PyObject *newargs;\r
+        PyObject *tuple;\r
+\r
+        if ((empty_dict = PyDict_New()) == NULL)\r
+            goto finally;\r
+        if ((newargs = Py_BuildValue("Oi", st, 1)) == NULL)\r
+            goto finally;\r
+        tuple = parser_st2tuple((PyST_Object*)NULL, newargs, empty_dict);\r
+        if (tuple != NULL) {\r
+            result = Py_BuildValue("O(O)", pickle_constructor, tuple);\r
+            Py_DECREF(tuple);\r
+        }\r
+        Py_DECREF(empty_dict);\r
+        Py_DECREF(newargs);\r
+    }\r
+  finally:\r
+    Py_XDECREF(empty_dict);\r
+\r
+    return (result);\r
+}\r
+\r
+\r
+/*  Functions exported by this module.  Most of this should probably\r
+ *  be converted into an ST object with methods, but that is better\r
+ *  done directly in Python, allowing subclasses to be created directly.\r
+ *  We'd really have to write a wrapper around it all anyway to allow\r
+ *  inheritance.\r
+ */\r
+static PyMethodDef parser_functions[] =  {\r
+    {"ast2tuple",       (PyCFunction)parser_ast2tuple, PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a tuple-tree representation of an ST.")},\r
+    {"ast2list",        (PyCFunction)parser_ast2list,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a list-tree representation of an ST.")},\r
+    {"compileast",      (PyCFunction)parser_compileast,PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Compiles an ST object into a code object.")},\r
+    {"compilest",      (PyCFunction)parser_compilest,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Compiles an ST object into a code object.")},\r
+    {"expr",            (PyCFunction)parser_expr,      PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from an expression.")},\r
+    {"isexpr",          (PyCFunction)parser_isexpr,    PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Determines if an ST object was created from an expression.")},\r
+    {"issuite",         (PyCFunction)parser_issuite,   PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Determines if an ST object was created from a suite.")},\r
+    {"suite",           (PyCFunction)parser_suite,     PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from a suite.")},\r
+    {"sequence2ast",    (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from a tree representation.")},\r
+    {"sequence2st",     (PyCFunction)parser_tuple2st,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from a tree representation.")},\r
+    {"st2tuple",        (PyCFunction)parser_st2tuple,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a tuple-tree representation of an ST.")},\r
+    {"st2list",         (PyCFunction)parser_st2list,   PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates a list-tree representation of an ST.")},\r
+    {"tuple2ast",       (PyCFunction)parser_tuple2ast, PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from a tree representation.")},\r
+    {"tuple2st",        (PyCFunction)parser_tuple2st,  PUBLIC_METHOD_TYPE,\r
+        PyDoc_STR("Creates an ST object from a tree representation.")},\r
+\r
+    /* private stuff: support pickle module */\r
+    {"_pickler",        (PyCFunction)parser__pickler,  METH_VARARGS,\r
+        PyDoc_STR("Returns the pickle magic to allow ST objects to be pickled.")},\r
+\r
+    {NULL, NULL, 0, NULL}\r
+    };\r
+\r
+\r
+PyMODINIT_FUNC initparser(void);  /* supply a prototype */\r
+\r
+PyMODINIT_FUNC\r
+initparser(void)\r
+{\r
+    PyObject *module, *copyreg;\r
+\r
+    Py_TYPE(&PyST_Type) = &PyType_Type;\r
+    module = Py_InitModule("parser", parser_functions);\r
+    if (module == NULL)\r
+        return;\r
+\r
+    if (parser_error == 0)\r
+        parser_error = PyErr_NewException("parser.ParserError", NULL, NULL);\r
+\r
+    if (parser_error == 0)\r
+        /* caller will check PyErr_Occurred() */\r
+        return;\r
+    /* CAUTION:  The code next used to skip bumping the refcount on\r
+     * parser_error.  That's a disaster if initparser() gets called more\r
+     * than once.  By incref'ing, we ensure that each module dict that\r
+     * gets created owns its reference to the shared parser_error object,\r
+     * and the file static parser_error vrbl owns a reference too.\r
+     */\r
+    Py_INCREF(parser_error);\r
+    if (PyModule_AddObject(module, "ParserError", parser_error) != 0)\r
+        return;\r
+\r
+    Py_INCREF(&PyST_Type);\r
+    PyModule_AddObject(module, "ASTType", (PyObject*)&PyST_Type);\r
+    Py_INCREF(&PyST_Type);\r
+    PyModule_AddObject(module, "STType", (PyObject*)&PyST_Type);\r
+\r
+    PyModule_AddStringConstant(module, "__copyright__",\r
+                               parser_copyright_string);\r
+    PyModule_AddStringConstant(module, "__doc__",\r
+                               parser_doc_string);\r
+    PyModule_AddStringConstant(module, "__version__",\r
+                               parser_version_string);\r
+\r
+    /* Register to support pickling.\r
+     * If this fails, the import of this module will fail because an\r
+     * exception will be raised here; should we clear the exception?\r
+     */\r
+    copyreg = PyImport_ImportModuleNoBlock("copy_reg");\r
+    if (copyreg != NULL) {\r
+        PyObject *func, *pickler;\r
+\r
+        func = PyObject_GetAttrString(copyreg, "pickle");\r
+        pickle_constructor = PyObject_GetAttrString(module, "sequence2st");\r
+        pickler = PyObject_GetAttrString(module, "_pickler");\r
+        Py_XINCREF(pickle_constructor);\r
+        if ((func != NULL) && (pickle_constructor != NULL)\r
+            && (pickler != NULL)) {\r
+            PyObject *res;\r
+\r
+            res = PyObject_CallFunctionObjArgs(func, &PyST_Type, pickler,\r
+                                               pickle_constructor, NULL);\r
+            Py_XDECREF(res);\r
+        }\r
+        Py_XDECREF(func);\r
+        Py_XDECREF(pickle_constructor);\r
+        Py_XDECREF(pickler);\r
+        Py_DECREF(copyreg);\r
+    }\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/pyexpat.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/pyexpat.c
new file mode 100644 (file)
index 0000000..093eb82
--- /dev/null
@@ -0,0 +1,2143 @@
+#include "Python.h"\r
+#include <ctype.h>\r
+\r
+#include "frameobject.h"\r
+#include "expat.h"\r
+\r
+#include "pyexpat.h"\r
+\r
+#define XML_COMBINED_VERSION (10000*XML_MAJOR_VERSION+100*XML_MINOR_VERSION+XML_MICRO_VERSION)\r
+\r
+#ifndef PyDoc_STRVAR\r
+\r
+/*\r
+ * fdrake says:\r
+ * Don't change the PyDoc_STR macro definition to (str), because\r
+ * '''the parentheses cause compile failures\r
+ * ("non-constant static initializer" or something like that)\r
+ * on some platforms (Irix?)'''\r
+ */\r
+#define PyDoc_STR(str)         str\r
+#define PyDoc_VAR(name)        static char name[]\r
+#define PyDoc_STRVAR(name,str) PyDoc_VAR(name) = PyDoc_STR(str)\r
+#endif\r
+\r
+#if (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 2)\r
+/* In Python 2.0 and  2.1, disabling Unicode was not possible. */\r
+#define Py_USING_UNICODE\r
+#else\r
+#define FIX_TRACE\r
+#endif\r
+\r
+enum HandlerTypes {\r
+    StartElement,\r
+    EndElement,\r
+    ProcessingInstruction,\r
+    CharacterData,\r
+    UnparsedEntityDecl,\r
+    NotationDecl,\r
+    StartNamespaceDecl,\r
+    EndNamespaceDecl,\r
+    Comment,\r
+    StartCdataSection,\r
+    EndCdataSection,\r
+    Default,\r
+    DefaultHandlerExpand,\r
+    NotStandalone,\r
+    ExternalEntityRef,\r
+    StartDoctypeDecl,\r
+    EndDoctypeDecl,\r
+    EntityDecl,\r
+    XmlDecl,\r
+    ElementDecl,\r
+    AttlistDecl,\r
+#if XML_COMBINED_VERSION >= 19504\r
+    SkippedEntity,\r
+#endif\r
+    _DummyDecl\r
+};\r
+\r
+static PyObject *ErrorObject;\r
+\r
+/* ----------------------------------------------------- */\r
+\r
+/* Declarations for objects of type xmlparser */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+\r
+    XML_Parser itself;\r
+    int returns_unicode;        /* True if Unicode strings are returned;\r
+                                   if false, UTF-8 strings are returned */\r
+    int ordered_attributes;     /* Return attributes as a list. */\r
+    int specified_attributes;   /* Report only specified attributes. */\r
+    int in_callback;            /* Is a callback active? */\r
+    int ns_prefixes;            /* Namespace-triplets mode? */\r
+    XML_Char *buffer;           /* Buffer used when accumulating characters */\r
+                                /* NULL if not enabled */\r
+    int buffer_size;            /* Size of buffer, in XML_Char units */\r
+    int buffer_used;            /* Buffer units in use */\r
+    PyObject *intern;           /* Dictionary to intern strings */\r
+    PyObject **handlers;\r
+} xmlparseobject;\r
+\r
+#define CHARACTER_DATA_BUFFER_SIZE 8192\r
+\r
+static PyTypeObject Xmlparsetype;\r
+\r
+typedef void (*xmlhandlersetter)(XML_Parser self, void *meth);\r
+typedef void* xmlhandler;\r
+\r
+struct HandlerInfo {\r
+    const char *name;\r
+    xmlhandlersetter setter;\r
+    xmlhandler handler;\r
+    PyCodeObject *tb_code;\r
+    PyObject *nameobj;\r
+};\r
+\r
+static struct HandlerInfo handler_info[64];\r
+\r
+/* Set an integer attribute on the error object; return true on success,\r
+ * false on an exception.\r
+ */\r
+static int\r
+set_error_attr(PyObject *err, char *name, int value)\r
+{\r
+    PyObject *v = PyInt_FromLong(value);\r
+\r
+    if (v == NULL || PyObject_SetAttrString(err, name, v) == -1) {\r
+        Py_XDECREF(v);\r
+        return 0;\r
+    }\r
+    Py_DECREF(v);\r
+    return 1;\r
+}\r
+\r
+/* Build and set an Expat exception, including positioning\r
+ * information.  Always returns NULL.\r
+ */\r
+static PyObject *\r
+set_error(xmlparseobject *self, enum XML_Error code)\r
+{\r
+    PyObject *err;\r
+    char buffer[256];\r
+    XML_Parser parser = self->itself;\r
+    int lineno = XML_GetErrorLineNumber(parser);\r
+    int column = XML_GetErrorColumnNumber(parser);\r
+\r
+    /* There is no risk of overflowing this buffer, since\r
+       even for 64-bit integers, there is sufficient space. */\r
+    sprintf(buffer, "%.200s: line %i, column %i",\r
+            XML_ErrorString(code), lineno, column);\r
+    err = PyObject_CallFunction(ErrorObject, "s", buffer);\r
+    if (  err != NULL\r
+          && set_error_attr(err, "code", code)\r
+          && set_error_attr(err, "offset", column)\r
+          && set_error_attr(err, "lineno", lineno)) {\r
+        PyErr_SetObject(ErrorObject, err);\r
+    }\r
+    Py_XDECREF(err);\r
+    return NULL;\r
+}\r
+\r
+static int\r
+have_handler(xmlparseobject *self, int type)\r
+{\r
+    PyObject *handler = self->handlers[type];\r
+    return handler != NULL;\r
+}\r
+\r
+static PyObject *\r
+get_handler_name(struct HandlerInfo *hinfo)\r
+{\r
+    PyObject *name = hinfo->nameobj;\r
+    if (name == NULL) {\r
+        name = PyString_FromString(hinfo->name);\r
+        hinfo->nameobj = name;\r
+    }\r
+    Py_XINCREF(name);\r
+    return name;\r
+}\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+/* Convert a string of XML_Chars into a Unicode string.\r
+   Returns None if str is a null pointer. */\r
+\r
+static PyObject *\r
+conv_string_to_unicode(const XML_Char *str)\r
+{\r
+    /* XXX currently this code assumes that XML_Char is 8-bit,\r
+       and hence in UTF-8.  */\r
+    /* UTF-8 from Expat, Unicode desired */\r
+    if (str == NULL) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    return PyUnicode_DecodeUTF8(str, strlen(str), "strict");\r
+}\r
+\r
+static PyObject *\r
+conv_string_len_to_unicode(const XML_Char *str, int len)\r
+{\r
+    /* XXX currently this code assumes that XML_Char is 8-bit,\r
+       and hence in UTF-8.  */\r
+    /* UTF-8 from Expat, Unicode desired */\r
+    if (str == NULL) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    return PyUnicode_DecodeUTF8((const char *)str, len, "strict");\r
+}\r
+#endif\r
+\r
+/* Convert a string of XML_Chars into an 8-bit Python string.\r
+   Returns None if str is a null pointer. */\r
+\r
+static PyObject *\r
+conv_string_to_utf8(const XML_Char *str)\r
+{\r
+    /* XXX currently this code assumes that XML_Char is 8-bit,\r
+       and hence in UTF-8.  */\r
+    /* UTF-8 from Expat, UTF-8 desired */\r
+    if (str == NULL) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    return PyString_FromString(str);\r
+}\r
+\r
+static PyObject *\r
+conv_string_len_to_utf8(const XML_Char *str, int len)\r
+{\r
+    /* XXX currently this code assumes that XML_Char is 8-bit,\r
+       and hence in UTF-8.  */\r
+    /* UTF-8 from Expat, UTF-8 desired */\r
+    if (str == NULL) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    return PyString_FromStringAndSize((const char *)str, len);\r
+}\r
+\r
+/* Callback routines */\r
+\r
+static void clear_handlers(xmlparseobject *self, int initial);\r
+\r
+/* This handler is used when an error has been detected, in the hope\r
+   that actual parsing can be terminated early.  This will only help\r
+   if an external entity reference is encountered. */\r
+static int\r
+error_external_entity_ref_handler(XML_Parser parser,\r
+                                  const XML_Char *context,\r
+                                  const XML_Char *base,\r
+                                  const XML_Char *systemId,\r
+                                  const XML_Char *publicId)\r
+{\r
+    return 0;\r
+}\r
+\r
+/* Dummy character data handler used when an error (exception) has\r
+   been detected, and the actual parsing can be terminated early.\r
+   This is needed since character data handler can't be safely removed\r
+   from within the character data handler, but can be replaced.  It is\r
+   used only from the character data handler trampoline, and must be\r
+   used right after `flag_error()` is called. */\r
+static void\r
+noop_character_data_handler(void *userData, const XML_Char *data, int len)\r
+{\r
+    /* Do nothing. */\r
+}\r
+\r
+static void\r
+flag_error(xmlparseobject *self)\r
+{\r
+    clear_handlers(self, 0);\r
+    XML_SetExternalEntityRefHandler(self->itself,\r
+                                    error_external_entity_ref_handler);\r
+}\r
+\r
+static PyCodeObject*\r
+getcode(enum HandlerTypes slot, char* func_name, int lineno)\r
+{\r
+    if (handler_info[slot].tb_code == NULL) {\r
+        handler_info[slot].tb_code =\r
+            PyCode_NewEmpty(__FILE__, func_name, lineno);\r
+    }\r
+    return handler_info[slot].tb_code;\r
+}\r
+\r
+#ifdef FIX_TRACE\r
+static int\r
+trace_frame(PyThreadState *tstate, PyFrameObject *f, int code, PyObject *val)\r
+{\r
+    int result = 0;\r
+    if (!tstate->use_tracing || tstate->tracing)\r
+        return 0;\r
+    if (tstate->c_profilefunc != NULL) {\r
+        tstate->tracing++;\r
+        result = tstate->c_profilefunc(tstate->c_profileobj,\r
+                                       f, code , val);\r
+        tstate->use_tracing = ((tstate->c_tracefunc != NULL)\r
+                               || (tstate->c_profilefunc != NULL));\r
+        tstate->tracing--;\r
+        if (result)\r
+            return result;\r
+    }\r
+    if (tstate->c_tracefunc != NULL) {\r
+        tstate->tracing++;\r
+        result = tstate->c_tracefunc(tstate->c_traceobj,\r
+                                     f, code , val);\r
+        tstate->use_tracing = ((tstate->c_tracefunc != NULL)\r
+                               || (tstate->c_profilefunc != NULL));\r
+        tstate->tracing--;\r
+    }\r
+    return result;\r
+}\r
+\r
+static int\r
+trace_frame_exc(PyThreadState *tstate, PyFrameObject *f)\r
+{\r
+    PyObject *type, *value, *traceback, *arg;\r
+    int err;\r
+\r
+    if (tstate->c_tracefunc == NULL)\r
+        return 0;\r
+\r
+    PyErr_Fetch(&type, &value, &traceback);\r
+    if (value == NULL) {\r
+        value = Py_None;\r
+        Py_INCREF(value);\r
+    }\r
+#if PY_VERSION_HEX < 0x02040000\r
+    arg = Py_BuildValue("(OOO)", type, value, traceback);\r
+#else\r
+    arg = PyTuple_Pack(3, type, value, traceback);\r
+#endif\r
+    if (arg == NULL) {\r
+        PyErr_Restore(type, value, traceback);\r
+        return 0;\r
+    }\r
+    err = trace_frame(tstate, f, PyTrace_EXCEPTION, arg);\r
+    Py_DECREF(arg);\r
+    if (err == 0)\r
+        PyErr_Restore(type, value, traceback);\r
+    else {\r
+        Py_XDECREF(type);\r
+        Py_XDECREF(value);\r
+        Py_XDECREF(traceback);\r
+    }\r
+    return err;\r
+}\r
+#endif\r
+\r
+static PyObject*\r
+call_with_frame(PyCodeObject *c, PyObject* func, PyObject* args,\r
+                xmlparseobject *self)\r
+{\r
+    PyThreadState *tstate = PyThreadState_GET();\r
+    PyFrameObject *f;\r
+    PyObject *res;\r
+\r
+    if (c == NULL)\r
+        return NULL;\r
+\r
+    f = PyFrame_New(tstate, c, PyEval_GetGlobals(), NULL);\r
+    if (f == NULL)\r
+        return NULL;\r
+    tstate->frame = f;\r
+#ifdef FIX_TRACE\r
+    if (trace_frame(tstate, f, PyTrace_CALL, Py_None) < 0) {\r
+        return NULL;\r
+    }\r
+#endif\r
+    res = PyEval_CallObject(func, args);\r
+    if (res == NULL) {\r
+        if (tstate->curexc_traceback == NULL)\r
+            PyTraceBack_Here(f);\r
+        XML_StopParser(self->itself, XML_FALSE);\r
+#ifdef FIX_TRACE\r
+        if (trace_frame_exc(tstate, f) < 0) {\r
+            return NULL;\r
+        }\r
+    }\r
+    else {\r
+        if (trace_frame(tstate, f, PyTrace_RETURN, res) < 0) {\r
+            Py_XDECREF(res);\r
+            res = NULL;\r
+        }\r
+    }\r
+#else\r
+    }\r
+#endif\r
+    tstate->frame = f->f_back;\r
+    Py_DECREF(f);\r
+    return res;\r
+}\r
+\r
+#ifndef Py_USING_UNICODE\r
+#define STRING_CONV_FUNC conv_string_to_utf8\r
+#else\r
+/* Python 2.0 and later versions, when built with Unicode support */\r
+#define STRING_CONV_FUNC (self->returns_unicode \\r
+                          ? conv_string_to_unicode : conv_string_to_utf8)\r
+#endif\r
+\r
+static PyObject*\r
+string_intern(xmlparseobject *self, const char* str)\r
+{\r
+    PyObject *result = STRING_CONV_FUNC(str);\r
+    PyObject *value;\r
+    /* result can be NULL if the unicode conversion failed. */\r
+    if (!result)\r
+        return result;\r
+    if (!self->intern)\r
+        return result;\r
+    value = PyDict_GetItem(self->intern, result);\r
+    if (!value) {\r
+        if (PyDict_SetItem(self->intern, result, result) == 0)\r
+            return result;\r
+        else\r
+            return NULL;\r
+    }\r
+    Py_INCREF(value);\r
+    Py_DECREF(result);\r
+    return value;\r
+}\r
+\r
+/* Return 0 on success, -1 on exception.\r
+ * flag_error() will be called before return if needed.\r
+ */\r
+static int\r
+call_character_handler(xmlparseobject *self, const XML_Char *buffer, int len)\r
+{\r
+    PyObject *args;\r
+    PyObject *temp;\r
+\r
+    if (!have_handler(self, CharacterData))\r
+        return -1;\r
+\r
+    args = PyTuple_New(1);\r
+    if (args == NULL)\r
+        return -1;\r
+#ifdef Py_USING_UNICODE\r
+    temp = (self->returns_unicode\r
+            ? conv_string_len_to_unicode(buffer, len)\r
+            : conv_string_len_to_utf8(buffer, len));\r
+#else\r
+    temp = conv_string_len_to_utf8(buffer, len);\r
+#endif\r
+    if (temp == NULL) {\r
+        Py_DECREF(args);\r
+        flag_error(self);\r
+        XML_SetCharacterDataHandler(self->itself,\r
+                                    noop_character_data_handler);\r
+        return -1;\r
+    }\r
+    PyTuple_SET_ITEM(args, 0, temp);\r
+    /* temp is now a borrowed reference; consider it unused. */\r
+    self->in_callback = 1;\r
+    temp = call_with_frame(getcode(CharacterData, "CharacterData", __LINE__),\r
+                           self->handlers[CharacterData], args, self);\r
+    /* temp is an owned reference again, or NULL */\r
+    self->in_callback = 0;\r
+    Py_DECREF(args);\r
+    if (temp == NULL) {\r
+        flag_error(self);\r
+        XML_SetCharacterDataHandler(self->itself,\r
+                                    noop_character_data_handler);\r
+        return -1;\r
+    }\r
+    Py_DECREF(temp);\r
+    return 0;\r
+}\r
+\r
+static int\r
+flush_character_buffer(xmlparseobject *self)\r
+{\r
+    int rc;\r
+    if (self->buffer == NULL || self->buffer_used == 0)\r
+        return 0;\r
+    rc = call_character_handler(self, self->buffer, self->buffer_used);\r
+    self->buffer_used = 0;\r
+    return rc;\r
+}\r
+\r
+static void\r
+my_CharacterDataHandler(void *userData, const XML_Char *data, int len)\r
+{\r
+    xmlparseobject *self = (xmlparseobject *) userData;\r
+    if (self->buffer == NULL)\r
+        call_character_handler(self, data, len);\r
+    else {\r
+        if ((self->buffer_used + len) > self->buffer_size) {\r
+            if (flush_character_buffer(self) < 0)\r
+                return;\r
+            /* handler might have changed; drop the rest on the floor\r
+             * if there isn't a handler anymore\r
+             */\r
+            if (!have_handler(self, CharacterData))\r
+                return;\r
+        }\r
+        if (len > self->buffer_size) {\r
+            call_character_handler(self, data, len);\r
+            self->buffer_used = 0;\r
+        }\r
+        else {\r
+            memcpy(self->buffer + self->buffer_used,\r
+                   data, len * sizeof(XML_Char));\r
+            self->buffer_used += len;\r
+        }\r
+    }\r
+}\r
+\r
+static void\r
+my_StartElementHandler(void *userData,\r
+                       const XML_Char *name, const XML_Char *atts[])\r
+{\r
+    xmlparseobject *self = (xmlparseobject *)userData;\r
+\r
+    if (have_handler(self, StartElement)) {\r
+        PyObject *container, *rv, *args;\r
+        int i, max;\r
+\r
+        if (flush_character_buffer(self) < 0)\r
+            return;\r
+        /* Set max to the number of slots filled in atts[]; max/2 is\r
+         * the number of attributes we need to process.\r
+         */\r
+        if (self->specified_attributes) {\r
+            max = XML_GetSpecifiedAttributeCount(self->itself);\r
+        }\r
+        else {\r
+            max = 0;\r
+            while (atts[max] != NULL)\r
+                max += 2;\r
+        }\r
+        /* Build the container. */\r
+        if (self->ordered_attributes)\r
+            container = PyList_New(max);\r
+        else\r
+            container = PyDict_New();\r
+        if (container == NULL) {\r
+            flag_error(self);\r
+            return;\r
+        }\r
+        for (i = 0; i < max; i += 2) {\r
+            PyObject *n = string_intern(self, (XML_Char *) atts[i]);\r
+            PyObject *v;\r
+            if (n == NULL) {\r
+                flag_error(self);\r
+                Py_DECREF(container);\r
+                return;\r
+            }\r
+            v = STRING_CONV_FUNC((XML_Char *) atts[i+1]);\r
+            if (v == NULL) {\r
+                flag_error(self);\r
+                Py_DECREF(container);\r
+                Py_DECREF(n);\r
+                return;\r
+            }\r
+            if (self->ordered_attributes) {\r
+                PyList_SET_ITEM(container, i, n);\r
+                PyList_SET_ITEM(container, i+1, v);\r
+            }\r
+            else if (PyDict_SetItem(container, n, v)) {\r
+                flag_error(self);\r
+                Py_DECREF(n);\r
+                Py_DECREF(v);\r
+                return;\r
+            }\r
+            else {\r
+                Py_DECREF(n);\r
+                Py_DECREF(v);\r
+            }\r
+        }\r
+        args = string_intern(self, name);\r
+        if (args != NULL)\r
+            args = Py_BuildValue("(NN)", args, container);\r
+        if (args == NULL) {\r
+            Py_DECREF(container);\r
+            return;\r
+        }\r
+        /* Container is now a borrowed reference; ignore it. */\r
+        self->in_callback = 1;\r
+        rv = call_with_frame(getcode(StartElement, "StartElement", __LINE__),\r
+                             self->handlers[StartElement], args, self);\r
+        self->in_callback = 0;\r
+        Py_DECREF(args);\r
+        if (rv == NULL) {\r
+            flag_error(self);\r
+            return;\r
+        }\r
+        Py_DECREF(rv);\r
+    }\r
+}\r
+\r
+#define RC_HANDLER(RC, NAME, PARAMS, INIT, PARAM_FORMAT, CONVERSION, \\r
+                RETURN, GETUSERDATA) \\r
+static RC \\r
+my_##NAME##Handler PARAMS {\\r
+    xmlparseobject *self = GETUSERDATA ; \\r
+    PyObject *args = NULL; \\r
+    PyObject *rv = NULL; \\r
+    INIT \\r
+\\r
+    if (have_handler(self, NAME)) { \\r
+        if (flush_character_buffer(self) < 0) \\r
+            return RETURN; \\r
+        args = Py_BuildValue PARAM_FORMAT ;\\r
+        if (!args) { flag_error(self); return RETURN;} \\r
+        self->in_callback = 1; \\r
+        rv = call_with_frame(getcode(NAME,#NAME,__LINE__), \\r
+                             self->handlers[NAME], args, self); \\r
+        self->in_callback = 0; \\r
+        Py_DECREF(args); \\r
+        if (rv == NULL) { \\r
+            flag_error(self); \\r
+            return RETURN; \\r
+        } \\r
+        CONVERSION \\r
+        Py_DECREF(rv); \\r
+    } \\r
+    return RETURN; \\r
+}\r
+\r
+#define VOID_HANDLER(NAME, PARAMS, PARAM_FORMAT) \\r
+        RC_HANDLER(void, NAME, PARAMS, ;, PARAM_FORMAT, ;, ;,\\r
+        (xmlparseobject *)userData)\r
+\r
+#define INT_HANDLER(NAME, PARAMS, PARAM_FORMAT)\\r
+        RC_HANDLER(int, NAME, PARAMS, int rc=0;, PARAM_FORMAT, \\r
+                        rc = PyInt_AsLong(rv);, rc, \\r
+        (xmlparseobject *)userData)\r
+\r
+VOID_HANDLER(EndElement,\r
+             (void *userData, const XML_Char *name),\r
+             ("(N)", string_intern(self, name)))\r
+\r
+VOID_HANDLER(ProcessingInstruction,\r
+             (void *userData,\r
+              const XML_Char *target,\r
+              const XML_Char *data),\r
+             ("(NO&)", string_intern(self, target), STRING_CONV_FUNC,data))\r
+\r
+VOID_HANDLER(UnparsedEntityDecl,\r
+             (void *userData,\r
+              const XML_Char *entityName,\r
+              const XML_Char *base,\r
+              const XML_Char *systemId,\r
+              const XML_Char *publicId,\r
+              const XML_Char *notationName),\r
+             ("(NNNNN)",\r
+              string_intern(self, entityName), string_intern(self, base),\r
+              string_intern(self, systemId), string_intern(self, publicId),\r
+              string_intern(self, notationName)))\r
+\r
+#ifndef Py_USING_UNICODE\r
+VOID_HANDLER(EntityDecl,\r
+             (void *userData,\r
+              const XML_Char *entityName,\r
+              int is_parameter_entity,\r
+              const XML_Char *value,\r
+              int value_length,\r
+              const XML_Char *base,\r
+              const XML_Char *systemId,\r
+              const XML_Char *publicId,\r
+              const XML_Char *notationName),\r
+             ("NiNNNNN",\r
+              string_intern(self, entityName), is_parameter_entity,\r
+              conv_string_len_to_utf8(value, value_length),\r
+              string_intern(self, base), string_intern(self, systemId),\r
+              string_intern(self, publicId),\r
+              string_intern(self, notationName)))\r
+#else\r
+VOID_HANDLER(EntityDecl,\r
+             (void *userData,\r
+              const XML_Char *entityName,\r
+              int is_parameter_entity,\r
+              const XML_Char *value,\r
+              int value_length,\r
+              const XML_Char *base,\r
+              const XML_Char *systemId,\r
+              const XML_Char *publicId,\r
+              const XML_Char *notationName),\r
+             ("NiNNNNN",\r
+              string_intern(self, entityName), is_parameter_entity,\r
+              (self->returns_unicode\r
+               ? conv_string_len_to_unicode(value, value_length)\r
+               : conv_string_len_to_utf8(value, value_length)),\r
+              string_intern(self, base), string_intern(self, systemId),\r
+              string_intern(self, publicId),\r
+              string_intern(self, notationName)))\r
+#endif\r
+\r
+VOID_HANDLER(XmlDecl,\r
+             (void *userData,\r
+              const XML_Char *version,\r
+              const XML_Char *encoding,\r
+              int standalone),\r
+             ("(O&O&i)",\r
+              STRING_CONV_FUNC,version, STRING_CONV_FUNC,encoding,\r
+              standalone))\r
+\r
+static PyObject *\r
+conv_content_model(XML_Content * const model,\r
+                   PyObject *(*conv_string)(const XML_Char *))\r
+{\r
+    PyObject *result = NULL;\r
+    PyObject *children = PyTuple_New(model->numchildren);\r
+    int i;\r
+\r
+    if (children != NULL) {\r
+        assert(model->numchildren < INT_MAX);\r
+        for (i = 0; i < (int)model->numchildren; ++i) {\r
+            PyObject *child = conv_content_model(&model->children[i],\r
+                                                 conv_string);\r
+            if (child == NULL) {\r
+                Py_XDECREF(children);\r
+                return NULL;\r
+            }\r
+            PyTuple_SET_ITEM(children, i, child);\r
+        }\r
+        result = Py_BuildValue("(iiO&N)",\r
+                               model->type, model->quant,\r
+                               conv_string,model->name, children);\r
+    }\r
+    return result;\r
+}\r
+\r
+static void\r
+my_ElementDeclHandler(void *userData,\r
+                      const XML_Char *name,\r
+                      XML_Content *model)\r
+{\r
+    xmlparseobject *self = (xmlparseobject *)userData;\r
+    PyObject *args = NULL;\r
+\r
+    if (have_handler(self, ElementDecl)) {\r
+        PyObject *rv = NULL;\r
+        PyObject *modelobj, *nameobj;\r
+\r
+        if (flush_character_buffer(self) < 0)\r
+            goto finally;\r
+#ifdef Py_USING_UNICODE\r
+        modelobj = conv_content_model(model,\r
+                                      (self->returns_unicode\r
+                                       ? conv_string_to_unicode\r
+                                       : conv_string_to_utf8));\r
+#else\r
+        modelobj = conv_content_model(model, conv_string_to_utf8);\r
+#endif\r
+        if (modelobj == NULL) {\r
+            flag_error(self);\r
+            goto finally;\r
+        }\r
+        nameobj = string_intern(self, name);\r
+        if (nameobj == NULL) {\r
+            Py_DECREF(modelobj);\r
+            flag_error(self);\r
+            goto finally;\r
+        }\r
+        args = Py_BuildValue("NN", nameobj, modelobj);\r
+        if (args == NULL) {\r
+            Py_DECREF(modelobj);\r
+            flag_error(self);\r
+            goto finally;\r
+        }\r
+        self->in_callback = 1;\r
+        rv = call_with_frame(getcode(ElementDecl, "ElementDecl", __LINE__),\r
+                             self->handlers[ElementDecl], args, self);\r
+        self->in_callback = 0;\r
+        if (rv == NULL) {\r
+            flag_error(self);\r
+            goto finally;\r
+        }\r
+        Py_DECREF(rv);\r
+    }\r
+ finally:\r
+    Py_XDECREF(args);\r
+    XML_FreeContentModel(self->itself, model);\r
+    return;\r
+}\r
+\r
+VOID_HANDLER(AttlistDecl,\r
+             (void *userData,\r
+              const XML_Char *elname,\r
+              const XML_Char *attname,\r
+              const XML_Char *att_type,\r
+              const XML_Char *dflt,\r
+              int isrequired),\r
+             ("(NNO&O&i)",\r
+              string_intern(self, elname), string_intern(self, attname),\r
+              STRING_CONV_FUNC,att_type, STRING_CONV_FUNC,dflt,\r
+              isrequired))\r
+\r
+#if XML_COMBINED_VERSION >= 19504\r
+VOID_HANDLER(SkippedEntity,\r
+             (void *userData,\r
+              const XML_Char *entityName,\r
+              int is_parameter_entity),\r
+             ("Ni",\r
+              string_intern(self, entityName), is_parameter_entity))\r
+#endif\r
+\r
+VOID_HANDLER(NotationDecl,\r
+                (void *userData,\r
+                        const XML_Char *notationName,\r
+                        const XML_Char *base,\r
+                        const XML_Char *systemId,\r
+                        const XML_Char *publicId),\r
+                ("(NNNN)",\r
+                 string_intern(self, notationName), string_intern(self, base),\r
+                 string_intern(self, systemId), string_intern(self, publicId)))\r
+\r
+VOID_HANDLER(StartNamespaceDecl,\r
+                (void *userData,\r
+                      const XML_Char *prefix,\r
+                      const XML_Char *uri),\r
+                ("(NN)",\r
+                 string_intern(self, prefix), string_intern(self, uri)))\r
+\r
+VOID_HANDLER(EndNamespaceDecl,\r
+                (void *userData,\r
+                    const XML_Char *prefix),\r
+                ("(N)", string_intern(self, prefix)))\r
+\r
+VOID_HANDLER(Comment,\r
+               (void *userData, const XML_Char *data),\r
+                ("(O&)", STRING_CONV_FUNC,data))\r
+\r
+VOID_HANDLER(StartCdataSection,\r
+               (void *userData),\r
+                ("()"))\r
+\r
+VOID_HANDLER(EndCdataSection,\r
+               (void *userData),\r
+                ("()"))\r
+\r
+#ifndef Py_USING_UNICODE\r
+VOID_HANDLER(Default,\r
+              (void *userData, const XML_Char *s, int len),\r
+              ("(N)", conv_string_len_to_utf8(s,len)))\r
+\r
+VOID_HANDLER(DefaultHandlerExpand,\r
+              (void *userData, const XML_Char *s, int len),\r
+              ("(N)", conv_string_len_to_utf8(s,len)))\r
+#else\r
+VOID_HANDLER(Default,\r
+              (void *userData, const XML_Char *s, int len),\r
+              ("(N)", (self->returns_unicode\r
+                       ? conv_string_len_to_unicode(s,len)\r
+                       : conv_string_len_to_utf8(s,len))))\r
+\r
+VOID_HANDLER(DefaultHandlerExpand,\r
+              (void *userData, const XML_Char *s, int len),\r
+              ("(N)", (self->returns_unicode\r
+                       ? conv_string_len_to_unicode(s,len)\r
+                       : conv_string_len_to_utf8(s,len))))\r
+#endif\r
+\r
+INT_HANDLER(NotStandalone,\r
+                (void *userData),\r
+                ("()"))\r
+\r
+RC_HANDLER(int, ExternalEntityRef,\r
+                (XML_Parser parser,\r
+                    const XML_Char *context,\r
+                    const XML_Char *base,\r
+                    const XML_Char *systemId,\r
+                    const XML_Char *publicId),\r
+                int rc=0;,\r
+                ("(O&NNN)",\r
+                 STRING_CONV_FUNC,context, string_intern(self, base),\r
+                 string_intern(self, systemId), string_intern(self, publicId)),\r
+                rc = PyInt_AsLong(rv);, rc,\r
+                XML_GetUserData(parser))\r
+\r
+/* XXX UnknownEncodingHandler */\r
+\r
+VOID_HANDLER(StartDoctypeDecl,\r
+             (void *userData, const XML_Char *doctypeName,\r
+              const XML_Char *sysid, const XML_Char *pubid,\r
+              int has_internal_subset),\r
+             ("(NNNi)", string_intern(self, doctypeName),\r
+              string_intern(self, sysid), string_intern(self, pubid),\r
+              has_internal_subset))\r
+\r
+VOID_HANDLER(EndDoctypeDecl, (void *userData), ("()"))\r
+\r
+/* ---------------------------------------------------------------- */\r
+\r
+static PyObject *\r
+get_parse_result(xmlparseobject *self, int rv)\r
+{\r
+    if (PyErr_Occurred()) {\r
+        return NULL;\r
+    }\r
+    if (rv == 0) {\r
+        return set_error(self, XML_GetErrorCode(self->itself));\r
+    }\r
+    if (flush_character_buffer(self) < 0) {\r
+        return NULL;\r
+    }\r
+    return PyInt_FromLong(rv);\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_Parse__doc__,\r
+"Parse(data[, isfinal])\n\\r
+Parse XML data.  `isfinal' should be true at end of input.");\r
+\r
+static PyObject *\r
+xmlparse_Parse(xmlparseobject *self, PyObject *args)\r
+{\r
+    char *s;\r
+    int slen;\r
+    int isFinal = 0;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|i:Parse", &s, &slen, &isFinal))\r
+        return NULL;\r
+\r
+    return get_parse_result(self, XML_Parse(self->itself, s, slen, isFinal));\r
+}\r
+\r
+/* File reading copied from cPickle */\r
+\r
+#define BUF_SIZE 2048\r
+\r
+static int\r
+readinst(char *buf, int buf_size, PyObject *meth)\r
+{\r
+    PyObject *arg = NULL;\r
+    PyObject *bytes = NULL;\r
+    PyObject *str = NULL;\r
+    int len = -1;\r
+\r
+    if ((bytes = PyInt_FromLong(buf_size)) == NULL)\r
+        goto finally;\r
+\r
+    if ((arg = PyTuple_New(1)) == NULL) {\r
+        Py_DECREF(bytes);\r
+        goto finally;\r
+    }\r
+\r
+    PyTuple_SET_ITEM(arg, 0, bytes);\r
+\r
+#if PY_VERSION_HEX < 0x02020000\r
+    str = PyObject_CallObject(meth, arg);\r
+#else\r
+    str = PyObject_Call(meth, arg, NULL);\r
+#endif\r
+    if (str == NULL)\r
+        goto finally;\r
+\r
+    /* XXX what to do if it returns a Unicode string? */\r
+    if (!PyString_Check(str)) {\r
+        PyErr_Format(PyExc_TypeError,\r
+                     "read() did not return a string object (type=%.400s)",\r
+                     Py_TYPE(str)->tp_name);\r
+        goto finally;\r
+    }\r
+    len = PyString_GET_SIZE(str);\r
+    if (len > buf_size) {\r
+        PyErr_Format(PyExc_ValueError,\r
+                     "read() returned too much data: "\r
+                     "%i bytes requested, %i returned",\r
+                     buf_size, len);\r
+        goto finally;\r
+    }\r
+    memcpy(buf, PyString_AsString(str), len);\r
+finally:\r
+    Py_XDECREF(arg);\r
+    Py_XDECREF(str);\r
+    return len;\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_ParseFile__doc__,\r
+"ParseFile(file)\n\\r
+Parse XML data from file-like object.");\r
+\r
+static PyObject *\r
+xmlparse_ParseFile(xmlparseobject *self, PyObject *f)\r
+{\r
+    int rv = 1;\r
+    PyObject *readmethod = NULL;\r
+\r
+    readmethod = PyObject_GetAttrString(f, "read");\r
+    if (readmethod == NULL) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "argument must have 'read' attribute");\r
+        return NULL;\r
+\r
+    }\r
+    for (;;) {\r
+        int bytes_read;\r
+        void *buf = XML_GetBuffer(self->itself, BUF_SIZE);\r
+        if (buf == NULL) {\r
+            Py_XDECREF(readmethod);\r
+            return get_parse_result(self, 0);\r
+        }\r
+\r
+        bytes_read = readinst(buf, BUF_SIZE, readmethod);\r
+        if (bytes_read < 0) {\r
+            Py_XDECREF(readmethod);\r
+            return NULL;\r
+        }\r
+\r
+        rv = XML_ParseBuffer(self->itself, bytes_read, bytes_read == 0);\r
+        if (PyErr_Occurred()) {\r
+            Py_XDECREF(readmethod);\r
+            return NULL;\r
+        }\r
+\r
+        if (!rv || bytes_read == 0)\r
+            break;\r
+    }\r
+    Py_XDECREF(readmethod);\r
+    return get_parse_result(self, rv);\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_SetBase__doc__,\r
+"SetBase(base_url)\n\\r
+Set the base URL for the parser.");\r
+\r
+static PyObject *\r
+xmlparse_SetBase(xmlparseobject *self, PyObject *args)\r
+{\r
+    char *base;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:SetBase", &base))\r
+        return NULL;\r
+    if (!XML_SetBase(self->itself, base)) {\r
+        return PyErr_NoMemory();\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_GetBase__doc__,\r
+"GetBase() -> url\n\\r
+Return base URL string for the parser.");\r
+\r
+static PyObject *\r
+xmlparse_GetBase(xmlparseobject *self, PyObject *unused)\r
+{\r
+    return Py_BuildValue("z", XML_GetBase(self->itself));\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_GetInputContext__doc__,\r
+"GetInputContext() -> string\n\\r
+Return the untranslated text of the input that caused the current event.\n\\r
+If the event was generated by a large amount of text (such as a start tag\n\\r
+for an element with many attributes), not all of the text may be available.");\r
+\r
+static PyObject *\r
+xmlparse_GetInputContext(xmlparseobject *self, PyObject *unused)\r
+{\r
+    if (self->in_callback) {\r
+        int offset, size;\r
+        const char *buffer\r
+            = XML_GetInputContext(self->itself, &offset, &size);\r
+\r
+        if (buffer != NULL)\r
+            return PyString_FromStringAndSize(buffer + offset,\r
+                                              size - offset);\r
+        else\r
+            Py_RETURN_NONE;\r
+    }\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_ExternalEntityParserCreate__doc__,\r
+"ExternalEntityParserCreate(context[, encoding])\n\\r
+Create a parser for parsing an external entity based on the\n\\r
+information passed to the ExternalEntityRefHandler.");\r
+\r
+static PyObject *\r
+xmlparse_ExternalEntityParserCreate(xmlparseobject *self, PyObject *args)\r
+{\r
+    char *context;\r
+    char *encoding = NULL;\r
+    xmlparseobject *new_parser;\r
+    int i;\r
+\r
+    if (!PyArg_ParseTuple(args, "z|s:ExternalEntityParserCreate",\r
+                          &context, &encoding)) {\r
+        return NULL;\r
+    }\r
+\r
+#ifndef Py_TPFLAGS_HAVE_GC\r
+    /* Python versions 2.0 and 2.1 */\r
+    new_parser = PyObject_New(xmlparseobject, &Xmlparsetype);\r
+#else\r
+    /* Python versions 2.2 and later */\r
+    new_parser = PyObject_GC_New(xmlparseobject, &Xmlparsetype);\r
+#endif\r
+\r
+    if (new_parser == NULL)\r
+        return NULL;\r
+    new_parser->buffer_size = self->buffer_size;\r
+    new_parser->buffer_used = 0;\r
+    if (self->buffer != NULL) {\r
+        new_parser->buffer = malloc(new_parser->buffer_size);\r
+        if (new_parser->buffer == NULL) {\r
+#ifndef Py_TPFLAGS_HAVE_GC\r
+            /* Code for versions 2.0 and 2.1 */\r
+            PyObject_Del(new_parser);\r
+#else\r
+            /* Code for versions 2.2 and later. */\r
+            PyObject_GC_Del(new_parser);\r
+#endif\r
+            return PyErr_NoMemory();\r
+        }\r
+    }\r
+    else\r
+        new_parser->buffer = NULL;\r
+    new_parser->returns_unicode = self->returns_unicode;\r
+    new_parser->ordered_attributes = self->ordered_attributes;\r
+    new_parser->specified_attributes = self->specified_attributes;\r
+    new_parser->in_callback = 0;\r
+    new_parser->ns_prefixes = self->ns_prefixes;\r
+    new_parser->itself = XML_ExternalEntityParserCreate(self->itself, context,\r
+                                                        encoding);\r
+    new_parser->handlers = 0;\r
+    new_parser->intern = self->intern;\r
+    Py_XINCREF(new_parser->intern);\r
+#ifdef Py_TPFLAGS_HAVE_GC\r
+    PyObject_GC_Track(new_parser);\r
+#else\r
+    PyObject_GC_Init(new_parser);\r
+#endif\r
+\r
+    if (!new_parser->itself) {\r
+        Py_DECREF(new_parser);\r
+        return PyErr_NoMemory();\r
+    }\r
+\r
+    XML_SetUserData(new_parser->itself, (void *)new_parser);\r
+\r
+    /* allocate and clear handlers first */\r
+    for (i = 0; handler_info[i].name != NULL; i++)\r
+        /* do nothing */;\r
+\r
+    new_parser->handlers = malloc(sizeof(PyObject *) * i);\r
+    if (!new_parser->handlers) {\r
+        Py_DECREF(new_parser);\r
+        return PyErr_NoMemory();\r
+    }\r
+    clear_handlers(new_parser, 1);\r
+\r
+    /* then copy handlers from self */\r
+    for (i = 0; handler_info[i].name != NULL; i++) {\r
+        PyObject *handler = self->handlers[i];\r
+        if (handler != NULL) {\r
+            Py_INCREF(handler);\r
+            new_parser->handlers[i] = handler;\r
+            handler_info[i].setter(new_parser->itself,\r
+                                   handler_info[i].handler);\r
+        }\r
+    }\r
+    return (PyObject *)new_parser;\r
+}\r
+\r
+PyDoc_STRVAR(xmlparse_SetParamEntityParsing__doc__,\r
+"SetParamEntityParsing(flag) -> success\n\\r
+Controls parsing of parameter entities (including the external DTD\n\\r
+subset). Possible flag values are XML_PARAM_ENTITY_PARSING_NEVER,\n\\r
+XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE and\n\\r
+XML_PARAM_ENTITY_PARSING_ALWAYS. Returns true if setting the flag\n\\r
+was successful.");\r
+\r
+static PyObject*\r
+xmlparse_SetParamEntityParsing(xmlparseobject *p, PyObject* args)\r
+{\r
+    int flag;\r
+    if (!PyArg_ParseTuple(args, "i", &flag))\r
+        return NULL;\r
+    flag = XML_SetParamEntityParsing(p->itself, flag);\r
+    return PyInt_FromLong(flag);\r
+}\r
+\r
+\r
+#if XML_COMBINED_VERSION >= 19505\r
+PyDoc_STRVAR(xmlparse_UseForeignDTD__doc__,\r
+"UseForeignDTD([flag])\n\\r
+Allows the application to provide an artificial external subset if one is\n\\r
+not specified as part of the document instance.  This readily allows the\n\\r
+use of a 'default' document type controlled by the application, while still\n\\r
+getting the advantage of providing document type information to the parser.\n\\r
+'flag' defaults to True if not provided.");\r
+\r
+static PyObject *\r
+xmlparse_UseForeignDTD(xmlparseobject *self, PyObject *args)\r
+{\r
+    PyObject *flagobj = NULL;\r
+    int flag = 1;\r
+    enum XML_Error rc;\r
+    if (!PyArg_ParseTuple(args, "|O:UseForeignDTD", &flagobj))\r
+        return NULL;\r
+    if (flagobj != NULL) {\r
+        flag = PyObject_IsTrue(flagobj);\r
+        if (flag < 0)\r
+            return NULL;\r
+    }\r
+    rc = XML_UseForeignDTD(self->itself, flag ? XML_TRUE : XML_FALSE);\r
+    if (rc != XML_ERROR_NONE) {\r
+        return set_error(self, rc);\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+#endif\r
+\r
+static struct PyMethodDef xmlparse_methods[] = {\r
+    {"Parse",     (PyCFunction)xmlparse_Parse,\r
+                  METH_VARARGS, xmlparse_Parse__doc__},\r
+    {"ParseFile", (PyCFunction)xmlparse_ParseFile,\r
+                  METH_O,       xmlparse_ParseFile__doc__},\r
+    {"SetBase",   (PyCFunction)xmlparse_SetBase,\r
+                  METH_VARARGS, xmlparse_SetBase__doc__},\r
+    {"GetBase",   (PyCFunction)xmlparse_GetBase,\r
+                  METH_NOARGS, xmlparse_GetBase__doc__},\r
+    {"ExternalEntityParserCreate", (PyCFunction)xmlparse_ExternalEntityParserCreate,\r
+                  METH_VARARGS, xmlparse_ExternalEntityParserCreate__doc__},\r
+    {"SetParamEntityParsing", (PyCFunction)xmlparse_SetParamEntityParsing,\r
+                  METH_VARARGS, xmlparse_SetParamEntityParsing__doc__},\r
+    {"GetInputContext", (PyCFunction)xmlparse_GetInputContext,\r
+                  METH_NOARGS, xmlparse_GetInputContext__doc__},\r
+#if XML_COMBINED_VERSION >= 19505\r
+    {"UseForeignDTD", (PyCFunction)xmlparse_UseForeignDTD,\r
+                  METH_VARARGS, xmlparse_UseForeignDTD__doc__},\r
+#endif\r
+    {NULL,        NULL}         /* sentinel */\r
+};\r
+\r
+/* ---------- */\r
+\r
+\r
+#ifdef Py_USING_UNICODE\r
+\r
+/* pyexpat international encoding support.\r
+   Make it as simple as possible.\r
+*/\r
+\r
+static char template_buffer[257];\r
+PyObject *template_string = NULL;\r
+\r
+static void\r
+init_template_buffer(void)\r
+{\r
+    int i;\r
+    for (i = 0; i < 256; i++) {\r
+        template_buffer[i] = i;\r
+    }\r
+    template_buffer[256] = 0;\r
+}\r
+\r
+static int\r
+PyUnknownEncodingHandler(void *encodingHandlerData,\r
+                         const XML_Char *name,\r
+                         XML_Encoding *info)\r
+{\r
+    PyUnicodeObject *_u_string = NULL;\r
+    int result = 0;\r
+    int i;\r
+\r
+    /* Yes, supports only 8bit encodings */\r
+    _u_string = (PyUnicodeObject *)\r
+        PyUnicode_Decode(template_buffer, 256, name, "replace");\r
+\r
+    if (_u_string == NULL)\r
+        return result;\r
+\r
+    if (PyUnicode_GET_SIZE(_u_string) != 256) {\r
+        Py_DECREF(_u_string);\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "multi-byte encodings are not supported");\r
+        return result;\r
+    }\r
+\r
+    for (i = 0; i < 256; i++) {\r
+        /* Stupid to access directly, but fast */\r
+        Py_UNICODE c = _u_string->str[i];\r
+        if (c == Py_UNICODE_REPLACEMENT_CHARACTER)\r
+            info->map[i] = -1;\r
+        else\r
+            info->map[i] = c;\r
+    }\r
+    info->data = NULL;\r
+    info->convert = NULL;\r
+    info->release = NULL;\r
+    result = 1;\r
+    Py_DECREF(_u_string);\r
+    return result;\r
+}\r
+\r
+#endif\r
+\r
+static PyObject *\r
+newxmlparseobject(char *encoding, char *namespace_separator, PyObject *intern)\r
+{\r
+    int i;\r
+    xmlparseobject *self;\r
+\r
+#ifdef Py_TPFLAGS_HAVE_GC\r
+    /* Code for versions 2.2 and later */\r
+    self = PyObject_GC_New(xmlparseobject, &Xmlparsetype);\r
+#else\r
+    self = PyObject_New(xmlparseobject, &Xmlparsetype);\r
+#endif\r
+    if (self == NULL)\r
+        return NULL;\r
+\r
+#ifdef Py_USING_UNICODE\r
+    self->returns_unicode = 1;\r
+#else\r
+    self->returns_unicode = 0;\r
+#endif\r
+\r
+    self->buffer = NULL;\r
+    self->buffer_size = CHARACTER_DATA_BUFFER_SIZE;\r
+    self->buffer_used = 0;\r
+    self->ordered_attributes = 0;\r
+    self->specified_attributes = 0;\r
+    self->in_callback = 0;\r
+    self->ns_prefixes = 0;\r
+    self->handlers = NULL;\r
+    if (namespace_separator != NULL) {\r
+        self->itself = XML_ParserCreateNS(encoding, *namespace_separator);\r
+    }\r
+    else {\r
+        self->itself = XML_ParserCreate(encoding);\r
+    }\r
+#if ((XML_MAJOR_VERSION >= 2) && (XML_MINOR_VERSION >= 1)) || defined(XML_HAS_SET_HASH_SALT)\r
+    /* This feature was added upstream in libexpat 2.1.0.  Our expat copy\r
+     * has a backport of this feature where we also define XML_HAS_SET_HASH_SALT\r
+     * to indicate that we can still use it. */\r
+    XML_SetHashSalt(self->itself,\r
+                    (unsigned long)_Py_HashSecret.prefix);\r
+#endif\r
+    self->intern = intern;\r
+    Py_XINCREF(self->intern);\r
+#ifdef Py_TPFLAGS_HAVE_GC\r
+    PyObject_GC_Track(self);\r
+#else\r
+    PyObject_GC_Init(self);\r
+#endif\r
+    if (self->itself == NULL) {\r
+        PyErr_SetString(PyExc_RuntimeError,\r
+                        "XML_ParserCreate failed");\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    XML_SetUserData(self->itself, (void *)self);\r
+#ifdef Py_USING_UNICODE\r
+    XML_SetUnknownEncodingHandler(self->itself,\r
+                  (XML_UnknownEncodingHandler) PyUnknownEncodingHandler, NULL);\r
+#endif\r
+\r
+    for (i = 0; handler_info[i].name != NULL; i++)\r
+        /* do nothing */;\r
+\r
+    self->handlers = malloc(sizeof(PyObject *) * i);\r
+    if (!self->handlers) {\r
+        Py_DECREF(self);\r
+        return PyErr_NoMemory();\r
+    }\r
+    clear_handlers(self, 1);\r
+\r
+    return (PyObject*)self;\r
+}\r
+\r
+\r
+static void\r
+xmlparse_dealloc(xmlparseobject *self)\r
+{\r
+    int i;\r
+#ifdef Py_TPFLAGS_HAVE_GC\r
+    PyObject_GC_UnTrack(self);\r
+#else\r
+    PyObject_GC_Fini(self);\r
+#endif\r
+    if (self->itself != NULL)\r
+        XML_ParserFree(self->itself);\r
+    self->itself = NULL;\r
+\r
+    if (self->handlers != NULL) {\r
+        PyObject *temp;\r
+        for (i = 0; handler_info[i].name != NULL; i++) {\r
+            temp = self->handlers[i];\r
+            self->handlers[i] = NULL;\r
+            Py_XDECREF(temp);\r
+        }\r
+        free(self->handlers);\r
+        self->handlers = NULL;\r
+    }\r
+    if (self->buffer != NULL) {\r
+        free(self->buffer);\r
+        self->buffer = NULL;\r
+    }\r
+    Py_XDECREF(self->intern);\r
+#ifndef Py_TPFLAGS_HAVE_GC\r
+    /* Code for versions 2.0 and 2.1 */\r
+    PyObject_Del(self);\r
+#else\r
+    /* Code for versions 2.2 and later. */\r
+    PyObject_GC_Del(self);\r
+#endif\r
+}\r
+\r
+static int\r
+handlername2int(const char *name)\r
+{\r
+    int i;\r
+    for (i = 0; handler_info[i].name != NULL; i++) {\r
+        if (strcmp(name, handler_info[i].name) == 0) {\r
+            return i;\r
+        }\r
+    }\r
+    return -1;\r
+}\r
+\r
+static PyObject *\r
+get_pybool(int istrue)\r
+{\r
+    PyObject *result = istrue ? Py_True : Py_False;\r
+    Py_INCREF(result);\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+xmlparse_getattr(xmlparseobject *self, char *name)\r
+{\r
+    int handlernum = handlername2int(name);\r
+\r
+    if (handlernum != -1) {\r
+        PyObject *result = self->handlers[handlernum];\r
+        if (result == NULL)\r
+            result = Py_None;\r
+        Py_INCREF(result);\r
+        return result;\r
+    }\r
+    if (name[0] == 'E') {\r
+        if (strcmp(name, "ErrorCode") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetErrorCode(self->itself));\r
+        if (strcmp(name, "ErrorLineNumber") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetErrorLineNumber(self->itself));\r
+        if (strcmp(name, "ErrorColumnNumber") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetErrorColumnNumber(self->itself));\r
+        if (strcmp(name, "ErrorByteIndex") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetErrorByteIndex(self->itself));\r
+    }\r
+    if (name[0] == 'C') {\r
+        if (strcmp(name, "CurrentLineNumber") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetCurrentLineNumber(self->itself));\r
+        if (strcmp(name, "CurrentColumnNumber") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetCurrentColumnNumber(self->itself));\r
+        if (strcmp(name, "CurrentByteIndex") == 0)\r
+            return PyInt_FromLong((long)\r
+                                  XML_GetCurrentByteIndex(self->itself));\r
+    }\r
+    if (name[0] == 'b') {\r
+        if (strcmp(name, "buffer_size") == 0)\r
+            return PyInt_FromLong((long) self->buffer_size);\r
+        if (strcmp(name, "buffer_text") == 0)\r
+            return get_pybool(self->buffer != NULL);\r
+        if (strcmp(name, "buffer_used") == 0)\r
+            return PyInt_FromLong((long) self->buffer_used);\r
+    }\r
+    if (strcmp(name, "namespace_prefixes") == 0)\r
+        return get_pybool(self->ns_prefixes);\r
+    if (strcmp(name, "ordered_attributes") == 0)\r
+        return get_pybool(self->ordered_attributes);\r
+    if (strcmp(name, "returns_unicode") == 0)\r
+        return get_pybool((long) self->returns_unicode);\r
+    if (strcmp(name, "specified_attributes") == 0)\r
+        return get_pybool((long) self->specified_attributes);\r
+    if (strcmp(name, "intern") == 0) {\r
+        if (self->intern == NULL) {\r
+            Py_INCREF(Py_None);\r
+            return Py_None;\r
+        }\r
+        else {\r
+            Py_INCREF(self->intern);\r
+            return self->intern;\r
+        }\r
+    }\r
+\r
+#define APPEND(list, str)                               \\r
+        do {                                            \\r
+                PyObject *o = PyString_FromString(str); \\r
+                if (o != NULL)                          \\r
+                        PyList_Append(list, o);         \\r
+                Py_XDECREF(o);                          \\r
+        } while (0)\r
+\r
+    if (strcmp(name, "__members__") == 0) {\r
+        int i;\r
+        PyObject *rc = PyList_New(0);\r
+        if (!rc)\r
+                return NULL;\r
+        for (i = 0; handler_info[i].name != NULL; i++) {\r
+            PyObject *o = get_handler_name(&handler_info[i]);\r
+            if (o != NULL)\r
+                PyList_Append(rc, o);\r
+            Py_XDECREF(o);\r
+        }\r
+        APPEND(rc, "ErrorCode");\r
+        APPEND(rc, "ErrorLineNumber");\r
+        APPEND(rc, "ErrorColumnNumber");\r
+        APPEND(rc, "ErrorByteIndex");\r
+        APPEND(rc, "CurrentLineNumber");\r
+        APPEND(rc, "CurrentColumnNumber");\r
+        APPEND(rc, "CurrentByteIndex");\r
+        APPEND(rc, "buffer_size");\r
+        APPEND(rc, "buffer_text");\r
+        APPEND(rc, "buffer_used");\r
+        APPEND(rc, "namespace_prefixes");\r
+        APPEND(rc, "ordered_attributes");\r
+        APPEND(rc, "returns_unicode");\r
+        APPEND(rc, "specified_attributes");\r
+        APPEND(rc, "intern");\r
+\r
+#undef APPEND\r
+        return rc;\r
+    }\r
+    return Py_FindMethod(xmlparse_methods, (PyObject *)self, name);\r
+}\r
+\r
+static int\r
+sethandler(xmlparseobject *self, const char *name, PyObject* v)\r
+{\r
+    int handlernum = handlername2int(name);\r
+    if (handlernum >= 0) {\r
+        xmlhandler c_handler = NULL;\r
+        PyObject *temp = self->handlers[handlernum];\r
+\r
+        if (v == Py_None) {\r
+            /* If this is the character data handler, and a character\r
+               data handler is already active, we need to be more\r
+               careful.  What we can safely do is replace the existing\r
+               character data handler callback function with a no-op\r
+               function that will refuse to call Python.  The downside\r
+               is that this doesn't completely remove the character\r
+               data handler from the C layer if there's any callback\r
+               active, so Expat does a little more work than it\r
+               otherwise would, but that's really an odd case.  A more\r
+               elaborate system of handlers and state could remove the\r
+               C handler more effectively. */\r
+            if (handlernum == CharacterData && self->in_callback)\r
+                c_handler = noop_character_data_handler;\r
+            v = NULL;\r
+        }\r
+        else if (v != NULL) {\r
+            Py_INCREF(v);\r
+            c_handler = handler_info[handlernum].handler;\r
+        }\r
+        self->handlers[handlernum] = v;\r
+        Py_XDECREF(temp);\r
+        handler_info[handlernum].setter(self->itself, c_handler);\r
+        return 1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static int\r
+xmlparse_setattr(xmlparseobject *self, char *name, PyObject *v)\r
+{\r
+    /* Set attribute 'name' to value 'v'. v==NULL means delete */\r
+    if (v == NULL) {\r
+        PyErr_SetString(PyExc_RuntimeError, "Cannot delete attribute");\r
+        return -1;\r
+    }\r
+    if (strcmp(name, "buffer_text") == 0) {\r
+        int b = PyObject_IsTrue(v);\r
+        if (b < 0)\r
+            return -1;\r
+        if (b) {\r
+            if (self->buffer == NULL) {\r
+                self->buffer = malloc(self->buffer_size);\r
+                if (self->buffer == NULL) {\r
+                    PyErr_NoMemory();\r
+                    return -1;\r
+                }\r
+                self->buffer_used = 0;\r
+            }\r
+        }\r
+        else if (self->buffer != NULL) {\r
+            if (flush_character_buffer(self) < 0)\r
+                return -1;\r
+            free(self->buffer);\r
+            self->buffer = NULL;\r
+        }\r
+        return 0;\r
+    }\r
+    if (strcmp(name, "namespace_prefixes") == 0) {\r
+        int b = PyObject_IsTrue(v);\r
+        if (b < 0)\r
+            return -1;\r
+        self->ns_prefixes = b;\r
+        XML_SetReturnNSTriplet(self->itself, self->ns_prefixes);\r
+        return 0;\r
+    }\r
+    if (strcmp(name, "ordered_attributes") == 0) {\r
+        int b = PyObject_IsTrue(v);\r
+        if (b < 0)\r
+            return -1;\r
+        self->ordered_attributes = b;\r
+        return 0;\r
+    }\r
+    if (strcmp(name, "returns_unicode") == 0) {\r
+        int b = PyObject_IsTrue(v);\r
+        if (b < 0)\r
+            return -1;\r
+#ifndef Py_USING_UNICODE\r
+        if (b) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "Unicode support not available");\r
+            return -1;\r
+        }\r
+#endif\r
+        self->returns_unicode = b;\r
+        return 0;\r
+    }\r
+    if (strcmp(name, "specified_attributes") == 0) {\r
+        int b = PyObject_IsTrue(v);\r
+        if (b < 0)\r
+            return -1;\r
+        self->specified_attributes = b;\r
+        return 0;\r
+    }\r
+\r
+    if (strcmp(name, "buffer_size") == 0) {\r
+      long new_buffer_size;\r
+      if (!PyInt_Check(v)) {\r
+        PyErr_SetString(PyExc_TypeError, "buffer_size must be an integer");\r
+        return -1;\r
+      }\r
+\r
+      new_buffer_size=PyInt_AS_LONG(v);\r
+      /* trivial case -- no change */\r
+      if (new_buffer_size == self->buffer_size) {\r
+        return 0;\r
+      }\r
+\r
+      if (new_buffer_size <= 0) {\r
+        PyErr_SetString(PyExc_ValueError, "buffer_size must be greater than zero");\r
+        return -1;\r
+      }\r
+\r
+      /* check maximum */\r
+      if (new_buffer_size > INT_MAX) {\r
+        char errmsg[100];\r
+        sprintf(errmsg, "buffer_size must not be greater than %i", INT_MAX);\r
+        PyErr_SetString(PyExc_ValueError, errmsg);\r
+        return -1;\r
+      }\r
+\r
+      if (self->buffer != NULL) {\r
+        /* there is already a buffer */\r
+        if (self->buffer_used != 0) {\r
+          flush_character_buffer(self);\r
+        }\r
+        /* free existing buffer */\r
+        free(self->buffer);\r
+      }\r
+      self->buffer = malloc(new_buffer_size);\r
+      if (self->buffer == NULL) {\r
+        PyErr_NoMemory();\r
+        return -1;\r
+      }\r
+      self->buffer_size = new_buffer_size;\r
+      return 0;\r
+    }\r
+\r
+    if (strcmp(name, "CharacterDataHandler") == 0) {\r
+        /* If we're changing the character data handler, flush all\r
+         * cached data with the old handler.  Not sure there's a\r
+         * "right" thing to do, though, but this probably won't\r
+         * happen.\r
+         */\r
+        if (flush_character_buffer(self) < 0)\r
+            return -1;\r
+    }\r
+    if (sethandler(self, name, v)) {\r
+        return 0;\r
+    }\r
+    PyErr_SetString(PyExc_AttributeError, name);\r
+    return -1;\r
+}\r
+\r
+#ifdef WITH_CYCLE_GC\r
+static int\r
+xmlparse_traverse(xmlparseobject *op, visitproc visit, void *arg)\r
+{\r
+    int i;\r
+    for (i = 0; handler_info[i].name != NULL; i++)\r
+        Py_VISIT(op->handlers[i]);\r
+    return 0;\r
+}\r
+\r
+static int\r
+xmlparse_clear(xmlparseobject *op)\r
+{\r
+    clear_handlers(op, 0);\r
+    Py_CLEAR(op->intern);\r
+    return 0;\r
+}\r
+#endif\r
+\r
+PyDoc_STRVAR(Xmlparsetype__doc__, "XML parser");\r
+\r
+static PyTypeObject Xmlparsetype = {\r
+        PyVarObject_HEAD_INIT(NULL, 0)\r
+        "pyexpat.xmlparser",            /*tp_name*/\r
+        sizeof(xmlparseobject) + PyGC_HEAD_SIZE,/*tp_basicsize*/\r
+        0,                              /*tp_itemsize*/\r
+        /* methods */\r
+        (destructor)xmlparse_dealloc,   /*tp_dealloc*/\r
+        (printfunc)0,           /*tp_print*/\r
+        (getattrfunc)xmlparse_getattr,  /*tp_getattr*/\r
+        (setattrfunc)xmlparse_setattr,  /*tp_setattr*/\r
+        (cmpfunc)0,             /*tp_compare*/\r
+        (reprfunc)0,            /*tp_repr*/\r
+        0,                      /*tp_as_number*/\r
+        0,              /*tp_as_sequence*/\r
+        0,              /*tp_as_mapping*/\r
+        (hashfunc)0,            /*tp_hash*/\r
+        (ternaryfunc)0,         /*tp_call*/\r
+        (reprfunc)0,            /*tp_str*/\r
+        0,              /* tp_getattro */\r
+        0,              /* tp_setattro */\r
+        0,              /* tp_as_buffer */\r
+#ifdef Py_TPFLAGS_HAVE_GC\r
+        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC, /*tp_flags*/\r
+#else\r
+        Py_TPFLAGS_DEFAULT | Py_TPFLAGS_GC, /*tp_flags*/\r
+#endif\r
+        Xmlparsetype__doc__, /* tp_doc - Documentation string */\r
+#ifdef WITH_CYCLE_GC\r
+        (traverseproc)xmlparse_traverse,        /* tp_traverse */\r
+        (inquiry)xmlparse_clear         /* tp_clear */\r
+#else\r
+        0, 0\r
+#endif\r
+};\r
+\r
+/* End of code for xmlparser objects */\r
+/* -------------------------------------------------------- */\r
+\r
+PyDoc_STRVAR(pyexpat_ParserCreate__doc__,\r
+"ParserCreate([encoding[, namespace_separator]]) -> parser\n\\r
+Return a new XML parser object.");\r
+\r
+static PyObject *\r
+pyexpat_ParserCreate(PyObject *notused, PyObject *args, PyObject *kw)\r
+{\r
+    char *encoding = NULL;\r
+    char *namespace_separator = NULL;\r
+    PyObject *intern = NULL;\r
+    PyObject *result;\r
+    int intern_decref = 0;\r
+    static char *kwlist[] = {"encoding", "namespace_separator",\r
+                                   "intern", NULL};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kw, "|zzO:ParserCreate", kwlist,\r
+                                     &encoding, &namespace_separator, &intern))\r
+        return NULL;\r
+    if (namespace_separator != NULL\r
+        && strlen(namespace_separator) > 1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "namespace_separator must be at most one"\r
+                        " character, omitted, or None");\r
+        return NULL;\r
+    }\r
+    /* Explicitly passing None means no interning is desired.\r
+       Not passing anything means that a new dictionary is used. */\r
+    if (intern == Py_None)\r
+        intern = NULL;\r
+    else if (intern == NULL) {\r
+        intern = PyDict_New();\r
+        if (!intern)\r
+            return NULL;\r
+        intern_decref = 1;\r
+    }\r
+    else if (!PyDict_Check(intern)) {\r
+        PyErr_SetString(PyExc_TypeError, "intern must be a dictionary");\r
+        return NULL;\r
+    }\r
+\r
+    result = newxmlparseobject(encoding, namespace_separator, intern);\r
+    if (intern_decref) {\r
+        Py_DECREF(intern);\r
+    }\r
+    return result;\r
+}\r
+\r
+PyDoc_STRVAR(pyexpat_ErrorString__doc__,\r
+"ErrorString(errno) -> string\n\\r
+Returns string error for given number.");\r
+\r
+static PyObject *\r
+pyexpat_ErrorString(PyObject *self, PyObject *args)\r
+{\r
+    long code = 0;\r
+\r
+    if (!PyArg_ParseTuple(args, "l:ErrorString", &code))\r
+        return NULL;\r
+    return Py_BuildValue("z", XML_ErrorString((int)code));\r
+}\r
+\r
+/* List of methods defined in the module */\r
+\r
+static struct PyMethodDef pyexpat_methods[] = {\r
+    {"ParserCreate",    (PyCFunction)pyexpat_ParserCreate,\r
+     METH_VARARGS|METH_KEYWORDS, pyexpat_ParserCreate__doc__},\r
+    {"ErrorString",     (PyCFunction)pyexpat_ErrorString,\r
+     METH_VARARGS,      pyexpat_ErrorString__doc__},\r
+\r
+    {NULL,       (PyCFunction)NULL, 0, NULL}            /* sentinel */\r
+};\r
+\r
+/* Module docstring */\r
+\r
+PyDoc_STRVAR(pyexpat_module_documentation,\r
+"Python wrapper for Expat parser.");\r
+\r
+/* Initialization function for the module */\r
+\r
+#ifndef MODULE_NAME\r
+#define MODULE_NAME "pyexpat"\r
+#endif\r
+\r
+#ifndef MODULE_INITFUNC\r
+#define MODULE_INITFUNC initpyexpat\r
+#endif\r
+\r
+#ifndef PyMODINIT_FUNC\r
+#   ifdef MS_WINDOWS\r
+#       define PyMODINIT_FUNC __declspec(dllexport) void\r
+#   else\r
+#       define PyMODINIT_FUNC void\r
+#   endif\r
+#endif\r
+\r
+PyMODINIT_FUNC MODULE_INITFUNC(void);  /* avoid compiler warnings */\r
+\r
+PyMODINIT_FUNC\r
+MODULE_INITFUNC(void)\r
+{\r
+    PyObject *m, *d;\r
+    PyObject *errmod_name = PyString_FromString(MODULE_NAME ".errors");\r
+    PyObject *errors_module;\r
+    PyObject *modelmod_name;\r
+    PyObject *model_module;\r
+    PyObject *sys_modules;\r
+    PyObject *version;\r
+    static struct PyExpat_CAPI capi;\r
+    PyObject* capi_object;\r
+\r
+    if (errmod_name == NULL)\r
+        return;\r
+    modelmod_name = PyString_FromString(MODULE_NAME ".model");\r
+    if (modelmod_name == NULL)\r
+        return;\r
+\r
+    Py_TYPE(&Xmlparsetype) = &PyType_Type;\r
+\r
+    /* Create the module and add the functions */\r
+    m = Py_InitModule3(MODULE_NAME, pyexpat_methods,\r
+                       pyexpat_module_documentation);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Add some symbolic constants to the module */\r
+    if (ErrorObject == NULL) {\r
+        ErrorObject = PyErr_NewException("xml.parsers.expat.ExpatError",\r
+                                         NULL, NULL);\r
+        if (ErrorObject == NULL)\r
+            return;\r
+    }\r
+    Py_INCREF(ErrorObject);\r
+    PyModule_AddObject(m, "error", ErrorObject);\r
+    Py_INCREF(ErrorObject);\r
+    PyModule_AddObject(m, "ExpatError", ErrorObject);\r
+    Py_INCREF(&Xmlparsetype);\r
+    PyModule_AddObject(m, "XMLParserType", (PyObject *) &Xmlparsetype);\r
+\r
+    version = PyString_FromString(PY_VERSION);\r
+    if (!version)\r
+        return;\r
+    PyModule_AddObject(m, "__version__", version);\r
+    PyModule_AddStringConstant(m, "EXPAT_VERSION",\r
+                               (char *) XML_ExpatVersion());\r
+    {\r
+        XML_Expat_Version info = XML_ExpatVersionInfo();\r
+        PyModule_AddObject(m, "version_info",\r
+                           Py_BuildValue("(iii)", info.major,\r
+                                         info.minor, info.micro));\r
+    }\r
+#ifdef Py_USING_UNICODE\r
+    init_template_buffer();\r
+#endif\r
+    /* XXX When Expat supports some way of figuring out how it was\r
+       compiled, this should check and set native_encoding\r
+       appropriately.\r
+    */\r
+    PyModule_AddStringConstant(m, "native_encoding", "UTF-8");\r
+\r
+    sys_modules = PySys_GetObject("modules");\r
+    d = PyModule_GetDict(m);\r
+    errors_module = PyDict_GetItem(d, errmod_name);\r
+    if (errors_module == NULL) {\r
+        errors_module = PyModule_New(MODULE_NAME ".errors");\r
+        if (errors_module != NULL) {\r
+            PyDict_SetItem(sys_modules, errmod_name, errors_module);\r
+            /* gives away the reference to errors_module */\r
+            PyModule_AddObject(m, "errors", errors_module);\r
+        }\r
+    }\r
+    Py_DECREF(errmod_name);\r
+    model_module = PyDict_GetItem(d, modelmod_name);\r
+    if (model_module == NULL) {\r
+        model_module = PyModule_New(MODULE_NAME ".model");\r
+        if (model_module != NULL) {\r
+            PyDict_SetItem(sys_modules, modelmod_name, model_module);\r
+            /* gives away the reference to model_module */\r
+            PyModule_AddObject(m, "model", model_module);\r
+        }\r
+    }\r
+    Py_DECREF(modelmod_name);\r
+    if (errors_module == NULL || model_module == NULL)\r
+        /* Don't core dump later! */\r
+        return;\r
+\r
+#if XML_COMBINED_VERSION > 19505\r
+    {\r
+        const XML_Feature *features = XML_GetFeatureList();\r
+        PyObject *list = PyList_New(0);\r
+        if (list == NULL)\r
+            /* just ignore it */\r
+            PyErr_Clear();\r
+        else {\r
+            int i = 0;\r
+            for (; features[i].feature != XML_FEATURE_END; ++i) {\r
+                int ok;\r
+                PyObject *item = Py_BuildValue("si", features[i].name,\r
+                                               features[i].value);\r
+                if (item == NULL) {\r
+                    Py_DECREF(list);\r
+                    list = NULL;\r
+                    break;\r
+                }\r
+                ok = PyList_Append(list, item);\r
+                Py_DECREF(item);\r
+                if (ok < 0) {\r
+                    PyErr_Clear();\r
+                    break;\r
+                }\r
+            }\r
+            if (list != NULL)\r
+                PyModule_AddObject(m, "features", list);\r
+        }\r
+    }\r
+#endif\r
+\r
+#define MYCONST(name) \\r
+    PyModule_AddStringConstant(errors_module, #name, \\r
+                               (char*)XML_ErrorString(name))\r
+\r
+    MYCONST(XML_ERROR_NO_MEMORY);\r
+    MYCONST(XML_ERROR_SYNTAX);\r
+    MYCONST(XML_ERROR_NO_ELEMENTS);\r
+    MYCONST(XML_ERROR_INVALID_TOKEN);\r
+    MYCONST(XML_ERROR_UNCLOSED_TOKEN);\r
+    MYCONST(XML_ERROR_PARTIAL_CHAR);\r
+    MYCONST(XML_ERROR_TAG_MISMATCH);\r
+    MYCONST(XML_ERROR_DUPLICATE_ATTRIBUTE);\r
+    MYCONST(XML_ERROR_JUNK_AFTER_DOC_ELEMENT);\r
+    MYCONST(XML_ERROR_PARAM_ENTITY_REF);\r
+    MYCONST(XML_ERROR_UNDEFINED_ENTITY);\r
+    MYCONST(XML_ERROR_RECURSIVE_ENTITY_REF);\r
+    MYCONST(XML_ERROR_ASYNC_ENTITY);\r
+    MYCONST(XML_ERROR_BAD_CHAR_REF);\r
+    MYCONST(XML_ERROR_BINARY_ENTITY_REF);\r
+    MYCONST(XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF);\r
+    MYCONST(XML_ERROR_MISPLACED_XML_PI);\r
+    MYCONST(XML_ERROR_UNKNOWN_ENCODING);\r
+    MYCONST(XML_ERROR_INCORRECT_ENCODING);\r
+    MYCONST(XML_ERROR_UNCLOSED_CDATA_SECTION);\r
+    MYCONST(XML_ERROR_EXTERNAL_ENTITY_HANDLING);\r
+    MYCONST(XML_ERROR_NOT_STANDALONE);\r
+    MYCONST(XML_ERROR_UNEXPECTED_STATE);\r
+    MYCONST(XML_ERROR_ENTITY_DECLARED_IN_PE);\r
+    MYCONST(XML_ERROR_FEATURE_REQUIRES_XML_DTD);\r
+    MYCONST(XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING);\r
+    /* Added in Expat 1.95.7. */\r
+    MYCONST(XML_ERROR_UNBOUND_PREFIX);\r
+    /* Added in Expat 1.95.8. */\r
+    MYCONST(XML_ERROR_UNDECLARING_PREFIX);\r
+    MYCONST(XML_ERROR_INCOMPLETE_PE);\r
+    MYCONST(XML_ERROR_XML_DECL);\r
+    MYCONST(XML_ERROR_TEXT_DECL);\r
+    MYCONST(XML_ERROR_PUBLICID);\r
+    MYCONST(XML_ERROR_SUSPENDED);\r
+    MYCONST(XML_ERROR_NOT_SUSPENDED);\r
+    MYCONST(XML_ERROR_ABORTED);\r
+    MYCONST(XML_ERROR_FINISHED);\r
+    MYCONST(XML_ERROR_SUSPEND_PE);\r
+\r
+    PyModule_AddStringConstant(errors_module, "__doc__",\r
+                               "Constants used to describe error conditions.");\r
+\r
+#undef MYCONST\r
+\r
+#define MYCONST(c) PyModule_AddIntConstant(m, #c, c)\r
+    MYCONST(XML_PARAM_ENTITY_PARSING_NEVER);\r
+    MYCONST(XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE);\r
+    MYCONST(XML_PARAM_ENTITY_PARSING_ALWAYS);\r
+#undef MYCONST\r
+\r
+#define MYCONST(c) PyModule_AddIntConstant(model_module, #c, c)\r
+    PyModule_AddStringConstant(model_module, "__doc__",\r
+                     "Constants used to interpret content model information.");\r
+\r
+    MYCONST(XML_CTYPE_EMPTY);\r
+    MYCONST(XML_CTYPE_ANY);\r
+    MYCONST(XML_CTYPE_MIXED);\r
+    MYCONST(XML_CTYPE_NAME);\r
+    MYCONST(XML_CTYPE_CHOICE);\r
+    MYCONST(XML_CTYPE_SEQ);\r
+\r
+    MYCONST(XML_CQUANT_NONE);\r
+    MYCONST(XML_CQUANT_OPT);\r
+    MYCONST(XML_CQUANT_REP);\r
+    MYCONST(XML_CQUANT_PLUS);\r
+#undef MYCONST\r
+\r
+    /* initialize pyexpat dispatch table */\r
+    capi.size = sizeof(capi);\r
+    capi.magic = PyExpat_CAPI_MAGIC;\r
+    capi.MAJOR_VERSION = XML_MAJOR_VERSION;\r
+    capi.MINOR_VERSION = XML_MINOR_VERSION;\r
+    capi.MICRO_VERSION = XML_MICRO_VERSION;\r
+    capi.ErrorString = XML_ErrorString;\r
+    capi.GetErrorCode = XML_GetErrorCode;\r
+    capi.GetErrorColumnNumber = XML_GetErrorColumnNumber;\r
+    capi.GetErrorLineNumber = XML_GetErrorLineNumber;\r
+    capi.Parse = XML_Parse;\r
+    capi.ParserCreate_MM = XML_ParserCreate_MM;\r
+    capi.ParserFree = XML_ParserFree;\r
+    capi.SetCharacterDataHandler = XML_SetCharacterDataHandler;\r
+    capi.SetCommentHandler = XML_SetCommentHandler;\r
+    capi.SetDefaultHandlerExpand = XML_SetDefaultHandlerExpand;\r
+    capi.SetElementHandler = XML_SetElementHandler;\r
+    capi.SetNamespaceDeclHandler = XML_SetNamespaceDeclHandler;\r
+    capi.SetProcessingInstructionHandler = XML_SetProcessingInstructionHandler;\r
+    capi.SetUnknownEncodingHandler = XML_SetUnknownEncodingHandler;\r
+    capi.SetUserData = XML_SetUserData;\r
+\r
+    /* export using capsule */\r
+    capi_object = PyCapsule_New(&capi, PyExpat_CAPSULE_NAME, NULL);\r
+    if (capi_object)\r
+        PyModule_AddObject(m, "expat_CAPI", capi_object);\r
+}\r
+\r
+static void\r
+clear_handlers(xmlparseobject *self, int initial)\r
+{\r
+    int i = 0;\r
+    PyObject *temp;\r
+\r
+    for (; handler_info[i].name != NULL; i++) {\r
+        if (initial)\r
+            self->handlers[i] = NULL;\r
+        else {\r
+            temp = self->handlers[i];\r
+            self->handlers[i] = NULL;\r
+            Py_XDECREF(temp);\r
+            handler_info[i].setter(self->itself, NULL);\r
+        }\r
+    }\r
+}\r
+\r
+static struct HandlerInfo handler_info[] = {\r
+    {"StartElementHandler",\r
+     (xmlhandlersetter)XML_SetStartElementHandler,\r
+     (xmlhandler)my_StartElementHandler},\r
+    {"EndElementHandler",\r
+     (xmlhandlersetter)XML_SetEndElementHandler,\r
+     (xmlhandler)my_EndElementHandler},\r
+    {"ProcessingInstructionHandler",\r
+     (xmlhandlersetter)XML_SetProcessingInstructionHandler,\r
+     (xmlhandler)my_ProcessingInstructionHandler},\r
+    {"CharacterDataHandler",\r
+     (xmlhandlersetter)XML_SetCharacterDataHandler,\r
+     (xmlhandler)my_CharacterDataHandler},\r
+    {"UnparsedEntityDeclHandler",\r
+     (xmlhandlersetter)XML_SetUnparsedEntityDeclHandler,\r
+     (xmlhandler)my_UnparsedEntityDeclHandler},\r
+    {"NotationDeclHandler",\r
+     (xmlhandlersetter)XML_SetNotationDeclHandler,\r
+     (xmlhandler)my_NotationDeclHandler},\r
+    {"StartNamespaceDeclHandler",\r
+     (xmlhandlersetter)XML_SetStartNamespaceDeclHandler,\r
+     (xmlhandler)my_StartNamespaceDeclHandler},\r
+    {"EndNamespaceDeclHandler",\r
+     (xmlhandlersetter)XML_SetEndNamespaceDeclHandler,\r
+     (xmlhandler)my_EndNamespaceDeclHandler},\r
+    {"CommentHandler",\r
+     (xmlhandlersetter)XML_SetCommentHandler,\r
+     (xmlhandler)my_CommentHandler},\r
+    {"StartCdataSectionHandler",\r
+     (xmlhandlersetter)XML_SetStartCdataSectionHandler,\r
+     (xmlhandler)my_StartCdataSectionHandler},\r
+    {"EndCdataSectionHandler",\r
+     (xmlhandlersetter)XML_SetEndCdataSectionHandler,\r
+     (xmlhandler)my_EndCdataSectionHandler},\r
+    {"DefaultHandler",\r
+     (xmlhandlersetter)XML_SetDefaultHandler,\r
+     (xmlhandler)my_DefaultHandler},\r
+    {"DefaultHandlerExpand",\r
+     (xmlhandlersetter)XML_SetDefaultHandlerExpand,\r
+     (xmlhandler)my_DefaultHandlerExpandHandler},\r
+    {"NotStandaloneHandler",\r
+     (xmlhandlersetter)XML_SetNotStandaloneHandler,\r
+     (xmlhandler)my_NotStandaloneHandler},\r
+    {"ExternalEntityRefHandler",\r
+     (xmlhandlersetter)XML_SetExternalEntityRefHandler,\r
+     (xmlhandler)my_ExternalEntityRefHandler},\r
+    {"StartDoctypeDeclHandler",\r
+     (xmlhandlersetter)XML_SetStartDoctypeDeclHandler,\r
+     (xmlhandler)my_StartDoctypeDeclHandler},\r
+    {"EndDoctypeDeclHandler",\r
+     (xmlhandlersetter)XML_SetEndDoctypeDeclHandler,\r
+     (xmlhandler)my_EndDoctypeDeclHandler},\r
+    {"EntityDeclHandler",\r
+     (xmlhandlersetter)XML_SetEntityDeclHandler,\r
+     (xmlhandler)my_EntityDeclHandler},\r
+    {"XmlDeclHandler",\r
+     (xmlhandlersetter)XML_SetXmlDeclHandler,\r
+     (xmlhandler)my_XmlDeclHandler},\r
+    {"ElementDeclHandler",\r
+     (xmlhandlersetter)XML_SetElementDeclHandler,\r
+     (xmlhandler)my_ElementDeclHandler},\r
+    {"AttlistDeclHandler",\r
+     (xmlhandlersetter)XML_SetAttlistDeclHandler,\r
+     (xmlhandler)my_AttlistDeclHandler},\r
+#if XML_COMBINED_VERSION >= 19504\r
+    {"SkippedEntityHandler",\r
+     (xmlhandlersetter)XML_SetSkippedEntityHandler,\r
+     (xmlhandler)my_SkippedEntityHandler},\r
+#endif\r
+\r
+    {NULL, NULL, NULL} /* sentinel */\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/python.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/python.c
new file mode 100644 (file)
index 0000000..a7446e7
--- /dev/null
@@ -0,0 +1,24 @@
+/* Minimal main program -- everything is loaded from the library */\r
+\r
+#include "Python.h"\r
+\r
+#ifdef __FreeBSD__\r
+#include <floatingpoint.h>\r
+#endif\r
+\r
+int\r
+main(int argc, char **argv)\r
+{\r
+       /* 754 requires that FP exceptions run in "no stop" mode by default,\r
+        * and until C vendors implement C99's ways to control FP exceptions,\r
+        * Python requires non-stop mode.  Alas, some platforms enable FP\r
+        * exceptions by default.  Here we disable them.\r
+        */\r
+#ifdef __FreeBSD__\r
+       fp_except_t m;\r
+\r
+       m = fpgetmask();\r
+       fpsetmask(m & ~FP_X_OFL);\r
+#endif\r
+       return Py_Main(argc, argv);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/sha256module.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/sha256module.c
new file mode 100644 (file)
index 0000000..9fe72f9
--- /dev/null
@@ -0,0 +1,706 @@
+/* SHA256 module */\r
+\r
+/* This module provides an interface to NIST's SHA-256 and SHA-224 Algorithms */\r
+\r
+/* See below for information about the original code this module was\r
+   based upon. Additional work performed by:\r
+\r
+   Andrew Kuchling (amk@amk.ca)\r
+   Greg Stein (gstein@lyra.org)\r
+   Trevor Perrin (trevp@trevp.net)\r
+\r
+   Copyright (C) 2005   Gregory P. Smith (greg@krypto.org)\r
+   Licensed to PSF under a Contributor Agreement.\r
+\r
+*/\r
+\r
+/* SHA objects */\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+\r
+/* Endianness testing and definitions */\r
+#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
+        if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
+\r
+#define PCT_LITTLE_ENDIAN 1\r
+#define PCT_BIG_ENDIAN 0\r
+\r
+/* Some useful types */\r
+\r
+typedef unsigned char SHA_BYTE;\r
+\r
+#if SIZEOF_INT == 4\r
+typedef unsigned int SHA_INT32; /* 32-bit integer */\r
+#else\r
+/* not defined. compilation will die. */\r
+#endif\r
+\r
+/* The SHA block size and message digest sizes, in bytes */\r
+\r
+#define SHA_BLOCKSIZE    64\r
+#define SHA_DIGESTSIZE  32\r
+\r
+/* The structure for storing SHA info */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    SHA_INT32 digest[8];                /* Message digest */\r
+    SHA_INT32 count_lo, count_hi;       /* 64-bit bit count */\r
+    SHA_BYTE data[SHA_BLOCKSIZE];       /* SHA data buffer */\r
+    int Endianness;\r
+    int local;                          /* unprocessed amount in data */\r
+    int digestsize;\r
+} SHAobject;\r
+\r
+/* When run on a little-endian CPU we need to perform byte reversal on an\r
+   array of longwords. */\r
+\r
+static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)\r
+{\r
+    SHA_INT32 value;\r
+\r
+    if ( Endianness == PCT_BIG_ENDIAN )\r
+        return;\r
+\r
+    byteCount /= sizeof(*buffer);\r
+    while (byteCount--) {\r
+        value = *buffer;\r
+        value = ( ( value & 0xFF00FF00L ) >> 8  ) | \\r
+                ( ( value & 0x00FF00FFL ) << 8 );\r
+        *buffer++ = ( value << 16 ) | ( value >> 16 );\r
+    }\r
+}\r
+\r
+static void SHAcopy(SHAobject *src, SHAobject *dest)\r
+{\r
+    dest->Endianness = src->Endianness;\r
+    dest->local = src->local;\r
+    dest->digestsize = src->digestsize;\r
+    dest->count_lo = src->count_lo;\r
+    dest->count_hi = src->count_hi;\r
+    memcpy(dest->digest, src->digest, sizeof(src->digest));\r
+    memcpy(dest->data, src->data, sizeof(src->data));\r
+}\r
+\r
+\r
+/* ------------------------------------------------------------------------\r
+ *\r
+ * This code for the SHA-256 algorithm was noted as public domain. The\r
+ * original headers are pasted below.\r
+ *\r
+ * Several changes have been made to make it more compatible with the\r
+ * Python environment and desired interface.\r
+ *\r
+ */\r
+\r
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis\r
+ *\r
+ * LibTomCrypt is a library that provides various cryptographic\r
+ * algorithms in a highly modular and flexible manner.\r
+ *\r
+ * The library is free for all purposes without any express\r
+ * gurantee it works.\r
+ *\r
+ * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org\r
+ */\r
+\r
+\r
+/* SHA256 by Tom St Denis */\r
+\r
+/* Various logical functions */\r
+#define ROR(x, y)\\r
+( ((((unsigned long)(x)&0xFFFFFFFFUL)>>(unsigned long)((y)&31)) | \\r
+((unsigned long)(x)<<(unsigned long)(32-((y)&31)))) & 0xFFFFFFFFUL)\r
+#define Ch(x,y,z)       (z ^ (x & (y ^ z)))\r
+#define Maj(x,y,z)      (((x | y) & z) | (x & y))\r
+#define S(x, n)         ROR((x),(n))\r
+#define R(x, n)         (((x)&0xFFFFFFFFUL)>>(n))\r
+#define Sigma0(x)       (S(x, 2) ^ S(x, 13) ^ S(x, 22))\r
+#define Sigma1(x)       (S(x, 6) ^ S(x, 11) ^ S(x, 25))\r
+#define Gamma0(x)       (S(x, 7) ^ S(x, 18) ^ R(x, 3))\r
+#define Gamma1(x)       (S(x, 17) ^ S(x, 19) ^ R(x, 10))\r
+\r
+\r
+static void\r
+sha_transform(SHAobject *sha_info)\r
+{\r
+    int i;\r
+        SHA_INT32 S[8], W[64], t0, t1;\r
+\r
+    memcpy(W, sha_info->data, sizeof(sha_info->data));\r
+    longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
+\r
+    for (i = 16; i < 64; ++i) {\r
+                W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];\r
+    }\r
+    for (i = 0; i < 8; ++i) {\r
+        S[i] = sha_info->digest[i];\r
+    }\r
+\r
+    /* Compress */\r
+#define RND(a,b,c,d,e,f,g,h,i,ki)                    \\r
+     t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];   \\r
+     t1 = Sigma0(a) + Maj(a, b, c);                  \\r
+     d += t0;                                        \\r
+     h  = t0 + t1;\r
+\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,0x428a2f98);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,0x71374491);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,0xb5c0fbcf);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,0xe9b5dba5);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,0x3956c25b);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,0x59f111f1);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,0x923f82a4);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,0xab1c5ed5);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,0xd807aa98);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,0x12835b01);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,0x243185be);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,0x550c7dc3);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,0x72be5d74);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,0x80deb1fe);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,0x9bdc06a7);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,0xc19bf174);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,0xe49b69c1);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,0xefbe4786);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,0x0fc19dc6);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,0x240ca1cc);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,0x2de92c6f);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,0x4a7484aa);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,0x5cb0a9dc);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,0x76f988da);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,0x983e5152);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,0xa831c66d);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,0xb00327c8);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,0xbf597fc7);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,0xc6e00bf3);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,0xd5a79147);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,0x06ca6351);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,0x14292967);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,0x27b70a85);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,0x2e1b2138);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,0x4d2c6dfc);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,0x53380d13);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,0x650a7354);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,0x766a0abb);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,0x81c2c92e);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,0x92722c85);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,0xa2bfe8a1);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,0xa81a664b);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,0xc24b8b70);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,0xc76c51a3);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,0xd192e819);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,0xd6990624);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,0xf40e3585);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,0x106aa070);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,0x19a4c116);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,0x1e376c08);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,0x2748774c);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,0x34b0bcb5);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,0x391c0cb3);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,0x4ed8aa4a);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,0x5b9cca4f);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,0x682e6ff3);\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,0x748f82ee);\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,0x78a5636f);\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,0x84c87814);\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,0x8cc70208);\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,0x90befffa);\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,0xa4506ceb);\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,0xbef9a3f7);\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,0xc67178f2);\r
+\r
+#undef RND\r
+\r
+    /* feedback */\r
+    for (i = 0; i < 8; i++) {\r
+        sha_info->digest[i] = sha_info->digest[i] + S[i];\r
+    }\r
+\r
+}\r
+\r
+\r
+\r
+/* initialize the SHA digest */\r
+\r
+static void\r
+sha_init(SHAobject *sha_info)\r
+{\r
+    TestEndianness(sha_info->Endianness)\r
+    sha_info->digest[0] = 0x6A09E667L;\r
+    sha_info->digest[1] = 0xBB67AE85L;\r
+    sha_info->digest[2] = 0x3C6EF372L;\r
+    sha_info->digest[3] = 0xA54FF53AL;\r
+    sha_info->digest[4] = 0x510E527FL;\r
+    sha_info->digest[5] = 0x9B05688CL;\r
+    sha_info->digest[6] = 0x1F83D9ABL;\r
+    sha_info->digest[7] = 0x5BE0CD19L;\r
+    sha_info->count_lo = 0L;\r
+    sha_info->count_hi = 0L;\r
+    sha_info->local = 0;\r
+    sha_info->digestsize = 32;\r
+}\r
+\r
+static void\r
+sha224_init(SHAobject *sha_info)\r
+{\r
+    TestEndianness(sha_info->Endianness)\r
+    sha_info->digest[0] = 0xc1059ed8L;\r
+    sha_info->digest[1] = 0x367cd507L;\r
+    sha_info->digest[2] = 0x3070dd17L;\r
+    sha_info->digest[3] = 0xf70e5939L;\r
+    sha_info->digest[4] = 0xffc00b31L;\r
+    sha_info->digest[5] = 0x68581511L;\r
+    sha_info->digest[6] = 0x64f98fa7L;\r
+    sha_info->digest[7] = 0xbefa4fa4L;\r
+    sha_info->count_lo = 0L;\r
+    sha_info->count_hi = 0L;\r
+    sha_info->local = 0;\r
+    sha_info->digestsize = 28;\r
+}\r
+\r
+\r
+/* update the SHA digest */\r
+\r
+static void\r
+sha_update(SHAobject *sha_info, SHA_BYTE *buffer, int count)\r
+{\r
+    int i;\r
+    SHA_INT32 clo;\r
+\r
+    clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
+    if (clo < sha_info->count_lo) {\r
+        ++sha_info->count_hi;\r
+    }\r
+    sha_info->count_lo = clo;\r
+    sha_info->count_hi += (SHA_INT32) count >> 29;\r
+    if (sha_info->local) {\r
+        i = SHA_BLOCKSIZE - sha_info->local;\r
+        if (i > count) {\r
+            i = count;\r
+        }\r
+        memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
+        count -= i;\r
+        buffer += i;\r
+        sha_info->local += i;\r
+        if (sha_info->local == SHA_BLOCKSIZE) {\r
+            sha_transform(sha_info);\r
+        }\r
+        else {\r
+            return;\r
+        }\r
+    }\r
+    while (count >= SHA_BLOCKSIZE) {\r
+        memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
+        buffer += SHA_BLOCKSIZE;\r
+        count -= SHA_BLOCKSIZE;\r
+        sha_transform(sha_info);\r
+    }\r
+    memcpy(sha_info->data, buffer, count);\r
+    sha_info->local = count;\r
+}\r
+\r
+/* finish computing the SHA digest */\r
+\r
+static void\r
+sha_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)\r
+{\r
+    int count;\r
+    SHA_INT32 lo_bit_count, hi_bit_count;\r
+\r
+    lo_bit_count = sha_info->count_lo;\r
+    hi_bit_count = sha_info->count_hi;\r
+    count = (int) ((lo_bit_count >> 3) & 0x3f);\r
+    ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
+    if (count > SHA_BLOCKSIZE - 8) {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - count);\r
+        sha_transform(sha_info);\r
+        memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);\r
+    }\r
+    else {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - 8 - count);\r
+    }\r
+\r
+    /* GJS: note that we add the hi/lo in big-endian. sha_transform will\r
+       swap these values into host-order. */\r
+    sha_info->data[56] = (hi_bit_count >> 24) & 0xff;\r
+    sha_info->data[57] = (hi_bit_count >> 16) & 0xff;\r
+    sha_info->data[58] = (hi_bit_count >>  8) & 0xff;\r
+    sha_info->data[59] = (hi_bit_count >>  0) & 0xff;\r
+    sha_info->data[60] = (lo_bit_count >> 24) & 0xff;\r
+    sha_info->data[61] = (lo_bit_count >> 16) & 0xff;\r
+    sha_info->data[62] = (lo_bit_count >>  8) & 0xff;\r
+    sha_info->data[63] = (lo_bit_count >>  0) & 0xff;\r
+    sha_transform(sha_info);\r
+    digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
+    digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
+    digest[ 2] = (unsigned char) ((sha_info->digest[0] >>  8) & 0xff);\r
+    digest[ 3] = (unsigned char) ((sha_info->digest[0]      ) & 0xff);\r
+    digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
+    digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
+    digest[ 6] = (unsigned char) ((sha_info->digest[1] >>  8) & 0xff);\r
+    digest[ 7] = (unsigned char) ((sha_info->digest[1]      ) & 0xff);\r
+    digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
+    digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
+    digest[10] = (unsigned char) ((sha_info->digest[2] >>  8) & 0xff);\r
+    digest[11] = (unsigned char) ((sha_info->digest[2]      ) & 0xff);\r
+    digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
+    digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
+    digest[14] = (unsigned char) ((sha_info->digest[3] >>  8) & 0xff);\r
+    digest[15] = (unsigned char) ((sha_info->digest[3]      ) & 0xff);\r
+    digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
+    digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
+    digest[18] = (unsigned char) ((sha_info->digest[4] >>  8) & 0xff);\r
+    digest[19] = (unsigned char) ((sha_info->digest[4]      ) & 0xff);\r
+    digest[20] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);\r
+    digest[21] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);\r
+    digest[22] = (unsigned char) ((sha_info->digest[5] >>  8) & 0xff);\r
+    digest[23] = (unsigned char) ((sha_info->digest[5]      ) & 0xff);\r
+    digest[24] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);\r
+    digest[25] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);\r
+    digest[26] = (unsigned char) ((sha_info->digest[6] >>  8) & 0xff);\r
+    digest[27] = (unsigned char) ((sha_info->digest[6]      ) & 0xff);\r
+    digest[28] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);\r
+    digest[29] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);\r
+    digest[30] = (unsigned char) ((sha_info->digest[7] >>  8) & 0xff);\r
+    digest[31] = (unsigned char) ((sha_info->digest[7]      ) & 0xff);\r
+}\r
+\r
+/*\r
+ * End of copied SHA code.\r
+ *\r
+ * ------------------------------------------------------------------------\r
+ */\r
+\r
+static PyTypeObject SHA224type;\r
+static PyTypeObject SHA256type;\r
+\r
+\r
+static SHAobject *\r
+newSHA224object(void)\r
+{\r
+    return (SHAobject *)PyObject_New(SHAobject, &SHA224type);\r
+}\r
+\r
+static SHAobject *\r
+newSHA256object(void)\r
+{\r
+    return (SHAobject *)PyObject_New(SHAobject, &SHA256type);\r
+}\r
+\r
+/* Internal methods for a hash object */\r
+\r
+static void\r
+SHA_dealloc(PyObject *ptr)\r
+{\r
+    PyObject_Del(ptr);\r
+}\r
+\r
+\r
+/* External methods for a hash object */\r
+\r
+PyDoc_STRVAR(SHA256_copy__doc__, "Return a copy of the hash object.");\r
+\r
+static PyObject *\r
+SHA256_copy(SHAobject *self, PyObject *unused)\r
+{\r
+    SHAobject *newobj;\r
+\r
+    if (Py_TYPE(self) == &SHA256type) {\r
+        if ( (newobj = newSHA256object())==NULL)\r
+            return NULL;\r
+    } else {\r
+        if ( (newobj = newSHA224object())==NULL)\r
+            return NULL;\r
+    }\r
+\r
+    SHAcopy(self, newobj);\r
+    return (PyObject *)newobj;\r
+}\r
+\r
+PyDoc_STRVAR(SHA256_digest__doc__,\r
+"Return the digest value as a string of binary data.");\r
+\r
+static PyObject *\r
+SHA256_digest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+\r
+    SHAcopy(self, &temp);\r
+    sha_final(digest, &temp);\r
+    return PyString_FromStringAndSize((const char *)digest, self->digestsize);\r
+}\r
+\r
+PyDoc_STRVAR(SHA256_hexdigest__doc__,\r
+"Return the digest value as a string of hexadecimal digits.");\r
+\r
+static PyObject *\r
+SHA256_hexdigest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+    PyObject *retval;\r
+    char *hex_digest;\r
+    int i, j;\r
+\r
+    /* Get the raw (binary) digest value */\r
+    SHAcopy(self, &temp);\r
+    sha_final(digest, &temp);\r
+\r
+    /* Create a new string */\r
+    retval = PyString_FromStringAndSize(NULL, self->digestsize * 2);\r
+    if (!retval)\r
+            return NULL;\r
+    hex_digest = PyString_AsString(retval);\r
+    if (!hex_digest) {\r
+            Py_DECREF(retval);\r
+            return NULL;\r
+    }\r
+\r
+    /* Make hex version of the digest */\r
+    for(i=j=0; i<self->digestsize; i++) {\r
+        char c;\r
+        c = (digest[i] >> 4) & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+        c = (digest[i] & 0xf);\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+    }\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(SHA256_update__doc__,\r
+"Update this hash object's state with the provided string.");\r
+\r
+static PyObject *\r
+SHA256_update(SHAobject *self, PyObject *args)\r
+{\r
+    Py_buffer buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:update", &buf))\r
+        return NULL;\r
+\r
+    sha_update(self, buf.buf, buf.len);\r
+\r
+    PyBuffer_Release(&buf);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyMethodDef SHA_methods[] = {\r
+    {"copy",      (PyCFunction)SHA256_copy,      METH_NOARGS,  SHA256_copy__doc__},\r
+    {"digest",    (PyCFunction)SHA256_digest,    METH_NOARGS,  SHA256_digest__doc__},\r
+    {"hexdigest", (PyCFunction)SHA256_hexdigest, METH_NOARGS,  SHA256_hexdigest__doc__},\r
+    {"update",    (PyCFunction)SHA256_update,    METH_VARARGS, SHA256_update__doc__},\r
+    {NULL,        NULL}         /* sentinel */\r
+};\r
+\r
+static PyObject *\r
+SHA256_get_block_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(SHA_BLOCKSIZE);\r
+}\r
+\r
+static PyObject *\r
+SHA256_get_name(PyObject *self, void *closure)\r
+{\r
+    if (((SHAobject *)self)->digestsize == 32)\r
+        return PyString_FromStringAndSize("SHA256", 6);\r
+    else\r
+        return PyString_FromStringAndSize("SHA224", 6);\r
+}\r
+\r
+static PyGetSetDef SHA_getseters[] = {\r
+    {"block_size",\r
+     (getter)SHA256_get_block_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"name",\r
+     (getter)SHA256_get_name, NULL,\r
+     NULL,\r
+     NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyMemberDef SHA_members[] = {\r
+    {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
+    /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
+     * the old sha module also supported 'digestsize'.  ugh. */\r
+    {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyTypeObject SHA224type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_sha256.sha224",   /*tp_name*/\r
+    sizeof(SHAobject),  /*tp_size*/\r
+    0,                  /*tp_itemsize*/\r
+    /* methods */\r
+    SHA_dealloc,        /*tp_dealloc*/\r
+    0,                  /*tp_print*/\r
+    0,                  /*tp_getattr*/\r
+    0,                  /*tp_setattr*/\r
+    0,                  /*tp_compare*/\r
+    0,                  /*tp_repr*/\r
+    0,                  /*tp_as_number*/\r
+    0,                  /*tp_as_sequence*/\r
+    0,                  /*tp_as_mapping*/\r
+    0,                  /*tp_hash*/\r
+    0,                  /*tp_call*/\r
+    0,                  /*tp_str*/\r
+    0,                  /*tp_getattro*/\r
+    0,                  /*tp_setattro*/\r
+    0,                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
+    0,                  /*tp_doc*/\r
+    0,                  /*tp_traverse*/\r
+    0,                  /*tp_clear*/\r
+    0,                  /*tp_richcompare*/\r
+    0,                  /*tp_weaklistoffset*/\r
+    0,                  /*tp_iter*/\r
+    0,                  /*tp_iternext*/\r
+    SHA_methods,        /* tp_methods */\r
+    SHA_members,        /* tp_members */\r
+    SHA_getseters,      /* tp_getset */\r
+};\r
+\r
+static PyTypeObject SHA256type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_sha256.sha256",   /*tp_name*/\r
+    sizeof(SHAobject),  /*tp_size*/\r
+    0,                  /*tp_itemsize*/\r
+    /* methods */\r
+    SHA_dealloc,        /*tp_dealloc*/\r
+    0,                  /*tp_print*/\r
+    0,                  /*tp_getattr*/\r
+    0,                  /*tp_setattr*/\r
+    0,                  /*tp_compare*/\r
+    0,                  /*tp_repr*/\r
+    0,                  /*tp_as_number*/\r
+    0,                  /*tp_as_sequence*/\r
+    0,                  /*tp_as_mapping*/\r
+    0,                  /*tp_hash*/\r
+    0,                  /*tp_call*/\r
+    0,                  /*tp_str*/\r
+    0,                  /*tp_getattro*/\r
+    0,                  /*tp_setattro*/\r
+    0,                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
+    0,                  /*tp_doc*/\r
+    0,                  /*tp_traverse*/\r
+    0,                  /*tp_clear*/\r
+    0,                  /*tp_richcompare*/\r
+    0,                  /*tp_weaklistoffset*/\r
+    0,                  /*tp_iter*/\r
+    0,                  /*tp_iternext*/\r
+    SHA_methods,        /* tp_methods */\r
+    SHA_members,        /* tp_members */\r
+    SHA_getseters,      /* tp_getset */\r
+};\r
+\r
+\r
+/* The single module-level function: new() */\r
+\r
+PyDoc_STRVAR(SHA256_new__doc__,\r
+"Return a new SHA-256 hash object; optionally initialized with a string.");\r
+\r
+static PyObject *\r
+SHA256_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
+{\r
+    static char *kwlist[] = {"string", NULL};\r
+    SHAobject *new;\r
+    Py_buffer buf = { 0 };\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
+                                     &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    if ((new = newSHA256object()) == NULL) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    sha_init(new);\r
+\r
+    if (PyErr_Occurred()) {\r
+        Py_DECREF(new);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    if (buf.len > 0) {\r
+        sha_update(new, buf.buf, buf.len);\r
+    }\r
+    PyBuffer_Release(&buf);\r
+\r
+    return (PyObject *)new;\r
+}\r
+\r
+PyDoc_STRVAR(SHA224_new__doc__,\r
+"Return a new SHA-224 hash object; optionally initialized with a string.");\r
+\r
+static PyObject *\r
+SHA224_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
+{\r
+    static char *kwlist[] = {"string", NULL};\r
+    SHAobject *new;\r
+    Py_buffer buf = { 0 };\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
+                                     &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    if ((new = newSHA224object()) == NULL) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    sha224_init(new);\r
+\r
+    if (PyErr_Occurred()) {\r
+        Py_DECREF(new);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    if (buf.len > 0) {\r
+        sha_update(new, buf.buf, buf.len);\r
+    }\r
+    PyBuffer_Release(&buf);\r
+\r
+    return (PyObject *)new;\r
+}\r
+\r
+\r
+/* List of functions exported by this module */\r
+\r
+static struct PyMethodDef SHA_functions[] = {\r
+    {"sha256", (PyCFunction)SHA256_new, METH_VARARGS|METH_KEYWORDS, SHA256_new__doc__},\r
+    {"sha224", (PyCFunction)SHA224_new, METH_VARARGS|METH_KEYWORDS, SHA224_new__doc__},\r
+    {NULL,      NULL}            /* Sentinel */\r
+};\r
+\r
+\r
+/* Initialize this module. */\r
+\r
+#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
+\r
+PyMODINIT_FUNC\r
+init_sha256(void)\r
+{\r
+    PyObject *m;\r
+\r
+    Py_TYPE(&SHA224type) = &PyType_Type;\r
+    if (PyType_Ready(&SHA224type) < 0)\r
+        return;\r
+    Py_TYPE(&SHA256type) = &PyType_Type;\r
+    if (PyType_Ready(&SHA256type) < 0)\r
+        return;\r
+    m = Py_InitModule("_sha256", SHA_functions);\r
+    if (m == NULL)\r
+        return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/sha512module.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/sha512module.c
new file mode 100644 (file)
index 0000000..79537e6
--- /dev/null
@@ -0,0 +1,774 @@
+/* SHA512 module */\r
+\r
+/* This module provides an interface to NIST's SHA-512 and SHA-384 Algorithms */\r
+\r
+/* See below for information about the original code this module was\r
+   based upon. Additional work performed by:\r
+\r
+   Andrew Kuchling (amk@amk.ca)\r
+   Greg Stein (gstein@lyra.org)\r
+   Trevor Perrin (trevp@trevp.net)\r
+\r
+   Copyright (C) 2005   Gregory P. Smith (greg@krypto.org)\r
+   Licensed to PSF under a Contributor Agreement.\r
+\r
+*/\r
+\r
+/* SHA objects */\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+#ifdef PY_LONG_LONG /* If no PY_LONG_LONG, don't compile anything! */\r
+\r
+/* Endianness testing and definitions */\r
+#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
+        if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
+\r
+#define PCT_LITTLE_ENDIAN 1\r
+#define PCT_BIG_ENDIAN 0\r
+\r
+/* Some useful types */\r
+\r
+typedef unsigned char SHA_BYTE;\r
+\r
+#if SIZEOF_INT == 4\r
+typedef unsigned int SHA_INT32; /* 32-bit integer */\r
+typedef unsigned PY_LONG_LONG SHA_INT64;        /* 64-bit integer */\r
+#else\r
+/* not defined. compilation will die. */\r
+#endif\r
+\r
+/* The SHA block size and message digest sizes, in bytes */\r
+\r
+#define SHA_BLOCKSIZE   128\r
+#define SHA_DIGESTSIZE  64\r
+\r
+/* The structure for storing SHA info */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    SHA_INT64 digest[8];                /* Message digest */\r
+    SHA_INT32 count_lo, count_hi;       /* 64-bit bit count */\r
+    SHA_BYTE data[SHA_BLOCKSIZE];       /* SHA data buffer */\r
+    int Endianness;\r
+    int local;                          /* unprocessed amount in data */\r
+    int digestsize;\r
+} SHAobject;\r
+\r
+/* When run on a little-endian CPU we need to perform byte reversal on an\r
+   array of longwords. */\r
+\r
+static void longReverse(SHA_INT64 *buffer, int byteCount, int Endianness)\r
+{\r
+    SHA_INT64 value;\r
+\r
+    if ( Endianness == PCT_BIG_ENDIAN )\r
+        return;\r
+\r
+    byteCount /= sizeof(*buffer);\r
+    while (byteCount--) {\r
+        value = *buffer;\r
+\r
+                ((unsigned char*)buffer)[0] = (unsigned char)(value >> 56) & 0xff;\r
+                ((unsigned char*)buffer)[1] = (unsigned char)(value >> 48) & 0xff;\r
+                ((unsigned char*)buffer)[2] = (unsigned char)(value >> 40) & 0xff;\r
+                ((unsigned char*)buffer)[3] = (unsigned char)(value >> 32) & 0xff;\r
+                ((unsigned char*)buffer)[4] = (unsigned char)(value >> 24) & 0xff;\r
+                ((unsigned char*)buffer)[5] = (unsigned char)(value >> 16) & 0xff;\r
+                ((unsigned char*)buffer)[6] = (unsigned char)(value >>  8) & 0xff;\r
+                ((unsigned char*)buffer)[7] = (unsigned char)(value      ) & 0xff;\r
+\r
+                buffer++;\r
+    }\r
+}\r
+\r
+static void SHAcopy(SHAobject *src, SHAobject *dest)\r
+{\r
+    dest->Endianness = src->Endianness;\r
+    dest->local = src->local;\r
+    dest->digestsize = src->digestsize;\r
+    dest->count_lo = src->count_lo;\r
+    dest->count_hi = src->count_hi;\r
+    memcpy(dest->digest, src->digest, sizeof(src->digest));\r
+    memcpy(dest->data, src->data, sizeof(src->data));\r
+}\r
+\r
+\r
+/* ------------------------------------------------------------------------\r
+ *\r
+ * This code for the SHA-512 algorithm was noted as public domain. The\r
+ * original headers are pasted below.\r
+ *\r
+ * Several changes have been made to make it more compatible with the\r
+ * Python environment and desired interface.\r
+ *\r
+ */\r
+\r
+/* LibTomCrypt, modular cryptographic library -- Tom St Denis\r
+ *\r
+ * LibTomCrypt is a library that provides various cryptographic\r
+ * algorithms in a highly modular and flexible manner.\r
+ *\r
+ * The library is free for all purposes without any express\r
+ * gurantee it works.\r
+ *\r
+ * Tom St Denis, tomstdenis@iahu.ca, http://libtomcrypt.org\r
+ */\r
+\r
+\r
+/* SHA512 by Tom St Denis */\r
+\r
+/* Various logical functions */\r
+#define ROR64(x, y) \\r
+    ( ((((x) & Py_ULL(0xFFFFFFFFFFFFFFFF))>>((unsigned PY_LONG_LONG)(y) & 63)) | \\r
+      ((x)<<((unsigned PY_LONG_LONG)(64-((y) & 63))))) & Py_ULL(0xFFFFFFFFFFFFFFFF))\r
+#define Ch(x,y,z)       (z ^ (x & (y ^ z)))\r
+#define Maj(x,y,z)      (((x | y) & z) | (x & y))\r
+#define S(x, n)         ROR64((x),(n))\r
+#define R(x, n)         (((x) & Py_ULL(0xFFFFFFFFFFFFFFFF)) >> ((unsigned PY_LONG_LONG)n))\r
+#define Sigma0(x)       (S(x, 28) ^ S(x, 34) ^ S(x, 39))\r
+#define Sigma1(x)       (S(x, 14) ^ S(x, 18) ^ S(x, 41))\r
+#define Gamma0(x)       (S(x, 1) ^ S(x, 8) ^ R(x, 7))\r
+#define Gamma1(x)       (S(x, 19) ^ S(x, 61) ^ R(x, 6))\r
+\r
+\r
+static void\r
+sha512_transform(SHAobject *sha_info)\r
+{\r
+    int i;\r
+    SHA_INT64 S[8], W[80], t0, t1;\r
+\r
+    memcpy(W, sha_info->data, sizeof(sha_info->data));\r
+    longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
+\r
+    for (i = 16; i < 80; ++i) {\r
+                W[i] = Gamma1(W[i - 2]) + W[i - 7] + Gamma0(W[i - 15]) + W[i - 16];\r
+    }\r
+    for (i = 0; i < 8; ++i) {\r
+        S[i] = sha_info->digest[i];\r
+    }\r
+\r
+    /* Compress */\r
+#define RND(a,b,c,d,e,f,g,h,i,ki)                    \\r
+     t0 = h + Sigma1(e) + Ch(e, f, g) + ki + W[i];   \\r
+     t1 = Sigma0(a) + Maj(a, b, c);                  \\r
+     d += t0;                                        \\r
+     h  = t0 + t1;\r
+\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],0,Py_ULL(0x428a2f98d728ae22));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],1,Py_ULL(0x7137449123ef65cd));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],2,Py_ULL(0xb5c0fbcfec4d3b2f));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],3,Py_ULL(0xe9b5dba58189dbbc));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],4,Py_ULL(0x3956c25bf348b538));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],5,Py_ULL(0x59f111f1b605d019));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],6,Py_ULL(0x923f82a4af194f9b));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],7,Py_ULL(0xab1c5ed5da6d8118));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],8,Py_ULL(0xd807aa98a3030242));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],9,Py_ULL(0x12835b0145706fbe));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],10,Py_ULL(0x243185be4ee4b28c));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],11,Py_ULL(0x550c7dc3d5ffb4e2));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],12,Py_ULL(0x72be5d74f27b896f));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],13,Py_ULL(0x80deb1fe3b1696b1));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],14,Py_ULL(0x9bdc06a725c71235));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],15,Py_ULL(0xc19bf174cf692694));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],16,Py_ULL(0xe49b69c19ef14ad2));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],17,Py_ULL(0xefbe4786384f25e3));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],18,Py_ULL(0x0fc19dc68b8cd5b5));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],19,Py_ULL(0x240ca1cc77ac9c65));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],20,Py_ULL(0x2de92c6f592b0275));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],21,Py_ULL(0x4a7484aa6ea6e483));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],22,Py_ULL(0x5cb0a9dcbd41fbd4));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],23,Py_ULL(0x76f988da831153b5));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],24,Py_ULL(0x983e5152ee66dfab));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],25,Py_ULL(0xa831c66d2db43210));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],26,Py_ULL(0xb00327c898fb213f));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],27,Py_ULL(0xbf597fc7beef0ee4));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],28,Py_ULL(0xc6e00bf33da88fc2));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],29,Py_ULL(0xd5a79147930aa725));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],30,Py_ULL(0x06ca6351e003826f));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],31,Py_ULL(0x142929670a0e6e70));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],32,Py_ULL(0x27b70a8546d22ffc));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],33,Py_ULL(0x2e1b21385c26c926));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],34,Py_ULL(0x4d2c6dfc5ac42aed));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],35,Py_ULL(0x53380d139d95b3df));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],36,Py_ULL(0x650a73548baf63de));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],37,Py_ULL(0x766a0abb3c77b2a8));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],38,Py_ULL(0x81c2c92e47edaee6));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],39,Py_ULL(0x92722c851482353b));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],40,Py_ULL(0xa2bfe8a14cf10364));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],41,Py_ULL(0xa81a664bbc423001));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],42,Py_ULL(0xc24b8b70d0f89791));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],43,Py_ULL(0xc76c51a30654be30));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],44,Py_ULL(0xd192e819d6ef5218));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],45,Py_ULL(0xd69906245565a910));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],46,Py_ULL(0xf40e35855771202a));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],47,Py_ULL(0x106aa07032bbd1b8));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],48,Py_ULL(0x19a4c116b8d2d0c8));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],49,Py_ULL(0x1e376c085141ab53));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],50,Py_ULL(0x2748774cdf8eeb99));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],51,Py_ULL(0x34b0bcb5e19b48a8));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],52,Py_ULL(0x391c0cb3c5c95a63));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],53,Py_ULL(0x4ed8aa4ae3418acb));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],54,Py_ULL(0x5b9cca4f7763e373));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],55,Py_ULL(0x682e6ff3d6b2b8a3));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],56,Py_ULL(0x748f82ee5defb2fc));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],57,Py_ULL(0x78a5636f43172f60));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],58,Py_ULL(0x84c87814a1f0ab72));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],59,Py_ULL(0x8cc702081a6439ec));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],60,Py_ULL(0x90befffa23631e28));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],61,Py_ULL(0xa4506cebde82bde9));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],62,Py_ULL(0xbef9a3f7b2c67915));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],63,Py_ULL(0xc67178f2e372532b));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],64,Py_ULL(0xca273eceea26619c));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],65,Py_ULL(0xd186b8c721c0c207));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],66,Py_ULL(0xeada7dd6cde0eb1e));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],67,Py_ULL(0xf57d4f7fee6ed178));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],68,Py_ULL(0x06f067aa72176fba));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],69,Py_ULL(0x0a637dc5a2c898a6));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],70,Py_ULL(0x113f9804bef90dae));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],71,Py_ULL(0x1b710b35131c471b));\r
+    RND(S[0],S[1],S[2],S[3],S[4],S[5],S[6],S[7],72,Py_ULL(0x28db77f523047d84));\r
+    RND(S[7],S[0],S[1],S[2],S[3],S[4],S[5],S[6],73,Py_ULL(0x32caab7b40c72493));\r
+    RND(S[6],S[7],S[0],S[1],S[2],S[3],S[4],S[5],74,Py_ULL(0x3c9ebe0a15c9bebc));\r
+    RND(S[5],S[6],S[7],S[0],S[1],S[2],S[3],S[4],75,Py_ULL(0x431d67c49c100d4c));\r
+    RND(S[4],S[5],S[6],S[7],S[0],S[1],S[2],S[3],76,Py_ULL(0x4cc5d4becb3e42b6));\r
+    RND(S[3],S[4],S[5],S[6],S[7],S[0],S[1],S[2],77,Py_ULL(0x597f299cfc657e2a));\r
+    RND(S[2],S[3],S[4],S[5],S[6],S[7],S[0],S[1],78,Py_ULL(0x5fcb6fab3ad6faec));\r
+    RND(S[1],S[2],S[3],S[4],S[5],S[6],S[7],S[0],79,Py_ULL(0x6c44198c4a475817));\r
+\r
+#undef RND\r
+\r
+    /* feedback */\r
+    for (i = 0; i < 8; i++) {\r
+        sha_info->digest[i] = sha_info->digest[i] + S[i];\r
+    }\r
+\r
+}\r
+\r
+\r
+\r
+/* initialize the SHA digest */\r
+\r
+static void\r
+sha512_init(SHAobject *sha_info)\r
+{\r
+    TestEndianness(sha_info->Endianness)\r
+    sha_info->digest[0] = Py_ULL(0x6a09e667f3bcc908);\r
+    sha_info->digest[1] = Py_ULL(0xbb67ae8584caa73b);\r
+    sha_info->digest[2] = Py_ULL(0x3c6ef372fe94f82b);\r
+    sha_info->digest[3] = Py_ULL(0xa54ff53a5f1d36f1);\r
+    sha_info->digest[4] = Py_ULL(0x510e527fade682d1);\r
+    sha_info->digest[5] = Py_ULL(0x9b05688c2b3e6c1f);\r
+    sha_info->digest[6] = Py_ULL(0x1f83d9abfb41bd6b);\r
+    sha_info->digest[7] = Py_ULL(0x5be0cd19137e2179);\r
+    sha_info->count_lo = 0L;\r
+    sha_info->count_hi = 0L;\r
+    sha_info->local = 0;\r
+    sha_info->digestsize = 64;\r
+}\r
+\r
+static void\r
+sha384_init(SHAobject *sha_info)\r
+{\r
+    TestEndianness(sha_info->Endianness)\r
+    sha_info->digest[0] = Py_ULL(0xcbbb9d5dc1059ed8);\r
+    sha_info->digest[1] = Py_ULL(0x629a292a367cd507);\r
+    sha_info->digest[2] = Py_ULL(0x9159015a3070dd17);\r
+    sha_info->digest[3] = Py_ULL(0x152fecd8f70e5939);\r
+    sha_info->digest[4] = Py_ULL(0x67332667ffc00b31);\r
+    sha_info->digest[5] = Py_ULL(0x8eb44a8768581511);\r
+    sha_info->digest[6] = Py_ULL(0xdb0c2e0d64f98fa7);\r
+    sha_info->digest[7] = Py_ULL(0x47b5481dbefa4fa4);\r
+    sha_info->count_lo = 0L;\r
+    sha_info->count_hi = 0L;\r
+    sha_info->local = 0;\r
+    sha_info->digestsize = 48;\r
+}\r
+\r
+\r
+/* update the SHA digest */\r
+\r
+static void\r
+sha512_update(SHAobject *sha_info, SHA_BYTE *buffer, int count)\r
+{\r
+    int i;\r
+    SHA_INT32 clo;\r
+\r
+    clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
+    if (clo < sha_info->count_lo) {\r
+        ++sha_info->count_hi;\r
+    }\r
+    sha_info->count_lo = clo;\r
+    sha_info->count_hi += (SHA_INT32) count >> 29;\r
+    if (sha_info->local) {\r
+        i = SHA_BLOCKSIZE - sha_info->local;\r
+        if (i > count) {\r
+            i = count;\r
+        }\r
+        memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
+        count -= i;\r
+        buffer += i;\r
+        sha_info->local += i;\r
+        if (sha_info->local == SHA_BLOCKSIZE) {\r
+            sha512_transform(sha_info);\r
+        }\r
+        else {\r
+            return;\r
+        }\r
+    }\r
+    while (count >= SHA_BLOCKSIZE) {\r
+        memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
+        buffer += SHA_BLOCKSIZE;\r
+        count -= SHA_BLOCKSIZE;\r
+        sha512_transform(sha_info);\r
+    }\r
+    memcpy(sha_info->data, buffer, count);\r
+    sha_info->local = count;\r
+}\r
+\r
+/* finish computing the SHA digest */\r
+\r
+static void\r
+sha512_final(unsigned char digest[SHA_DIGESTSIZE], SHAobject *sha_info)\r
+{\r
+    int count;\r
+    SHA_INT32 lo_bit_count, hi_bit_count;\r
+\r
+    lo_bit_count = sha_info->count_lo;\r
+    hi_bit_count = sha_info->count_hi;\r
+    count = (int) ((lo_bit_count >> 3) & 0x7f);\r
+    ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
+    if (count > SHA_BLOCKSIZE - 16) {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - count);\r
+        sha512_transform(sha_info);\r
+        memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 16);\r
+    }\r
+    else {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - 16 - count);\r
+    }\r
+\r
+    /* GJS: note that we add the hi/lo in big-endian. sha512_transform will\r
+       swap these values into host-order. */\r
+    sha_info->data[112] = 0;\r
+    sha_info->data[113] = 0;\r
+    sha_info->data[114] = 0;\r
+    sha_info->data[115] = 0;\r
+    sha_info->data[116] = 0;\r
+    sha_info->data[117] = 0;\r
+    sha_info->data[118] = 0;\r
+    sha_info->data[119] = 0;\r
+    sha_info->data[120] = (hi_bit_count >> 24) & 0xff;\r
+    sha_info->data[121] = (hi_bit_count >> 16) & 0xff;\r
+    sha_info->data[122] = (hi_bit_count >>  8) & 0xff;\r
+    sha_info->data[123] = (hi_bit_count >>  0) & 0xff;\r
+    sha_info->data[124] = (lo_bit_count >> 24) & 0xff;\r
+    sha_info->data[125] = (lo_bit_count >> 16) & 0xff;\r
+    sha_info->data[126] = (lo_bit_count >>  8) & 0xff;\r
+    sha_info->data[127] = (lo_bit_count >>  0) & 0xff;\r
+    sha512_transform(sha_info);\r
+    digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 56) & 0xff);\r
+    digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 48) & 0xff);\r
+    digest[ 2] = (unsigned char) ((sha_info->digest[0] >> 40) & 0xff);\r
+    digest[ 3] = (unsigned char) ((sha_info->digest[0] >> 32) & 0xff);\r
+    digest[ 4] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
+    digest[ 5] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
+    digest[ 6] = (unsigned char) ((sha_info->digest[0] >>  8) & 0xff);\r
+    digest[ 7] = (unsigned char) ((sha_info->digest[0]      ) & 0xff);\r
+    digest[ 8] = (unsigned char) ((sha_info->digest[1] >> 56) & 0xff);\r
+    digest[ 9] = (unsigned char) ((sha_info->digest[1] >> 48) & 0xff);\r
+    digest[10] = (unsigned char) ((sha_info->digest[1] >> 40) & 0xff);\r
+    digest[11] = (unsigned char) ((sha_info->digest[1] >> 32) & 0xff);\r
+    digest[12] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
+    digest[13] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
+    digest[14] = (unsigned char) ((sha_info->digest[1] >>  8) & 0xff);\r
+    digest[15] = (unsigned char) ((sha_info->digest[1]      ) & 0xff);\r
+    digest[16] = (unsigned char) ((sha_info->digest[2] >> 56) & 0xff);\r
+    digest[17] = (unsigned char) ((sha_info->digest[2] >> 48) & 0xff);\r
+    digest[18] = (unsigned char) ((sha_info->digest[2] >> 40) & 0xff);\r
+    digest[19] = (unsigned char) ((sha_info->digest[2] >> 32) & 0xff);\r
+    digest[20] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
+    digest[21] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
+    digest[22] = (unsigned char) ((sha_info->digest[2] >>  8) & 0xff);\r
+    digest[23] = (unsigned char) ((sha_info->digest[2]      ) & 0xff);\r
+    digest[24] = (unsigned char) ((sha_info->digest[3] >> 56) & 0xff);\r
+    digest[25] = (unsigned char) ((sha_info->digest[3] >> 48) & 0xff);\r
+    digest[26] = (unsigned char) ((sha_info->digest[3] >> 40) & 0xff);\r
+    digest[27] = (unsigned char) ((sha_info->digest[3] >> 32) & 0xff);\r
+    digest[28] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
+    digest[29] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
+    digest[30] = (unsigned char) ((sha_info->digest[3] >>  8) & 0xff);\r
+    digest[31] = (unsigned char) ((sha_info->digest[3]      ) & 0xff);\r
+    digest[32] = (unsigned char) ((sha_info->digest[4] >> 56) & 0xff);\r
+    digest[33] = (unsigned char) ((sha_info->digest[4] >> 48) & 0xff);\r
+    digest[34] = (unsigned char) ((sha_info->digest[4] >> 40) & 0xff);\r
+    digest[35] = (unsigned char) ((sha_info->digest[4] >> 32) & 0xff);\r
+    digest[36] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
+    digest[37] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
+    digest[38] = (unsigned char) ((sha_info->digest[4] >>  8) & 0xff);\r
+    digest[39] = (unsigned char) ((sha_info->digest[4]      ) & 0xff);\r
+    digest[40] = (unsigned char) ((sha_info->digest[5] >> 56) & 0xff);\r
+    digest[41] = (unsigned char) ((sha_info->digest[5] >> 48) & 0xff);\r
+    digest[42] = (unsigned char) ((sha_info->digest[5] >> 40) & 0xff);\r
+    digest[43] = (unsigned char) ((sha_info->digest[5] >> 32) & 0xff);\r
+    digest[44] = (unsigned char) ((sha_info->digest[5] >> 24) & 0xff);\r
+    digest[45] = (unsigned char) ((sha_info->digest[5] >> 16) & 0xff);\r
+    digest[46] = (unsigned char) ((sha_info->digest[5] >>  8) & 0xff);\r
+    digest[47] = (unsigned char) ((sha_info->digest[5]      ) & 0xff);\r
+    digest[48] = (unsigned char) ((sha_info->digest[6] >> 56) & 0xff);\r
+    digest[49] = (unsigned char) ((sha_info->digest[6] >> 48) & 0xff);\r
+    digest[50] = (unsigned char) ((sha_info->digest[6] >> 40) & 0xff);\r
+    digest[51] = (unsigned char) ((sha_info->digest[6] >> 32) & 0xff);\r
+    digest[52] = (unsigned char) ((sha_info->digest[6] >> 24) & 0xff);\r
+    digest[53] = (unsigned char) ((sha_info->digest[6] >> 16) & 0xff);\r
+    digest[54] = (unsigned char) ((sha_info->digest[6] >>  8) & 0xff);\r
+    digest[55] = (unsigned char) ((sha_info->digest[6]      ) & 0xff);\r
+    digest[56] = (unsigned char) ((sha_info->digest[7] >> 56) & 0xff);\r
+    digest[57] = (unsigned char) ((sha_info->digest[7] >> 48) & 0xff);\r
+    digest[58] = (unsigned char) ((sha_info->digest[7] >> 40) & 0xff);\r
+    digest[59] = (unsigned char) ((sha_info->digest[7] >> 32) & 0xff);\r
+    digest[60] = (unsigned char) ((sha_info->digest[7] >> 24) & 0xff);\r
+    digest[61] = (unsigned char) ((sha_info->digest[7] >> 16) & 0xff);\r
+    digest[62] = (unsigned char) ((sha_info->digest[7] >>  8) & 0xff);\r
+    digest[63] = (unsigned char) ((sha_info->digest[7]      ) & 0xff);\r
+}\r
+\r
+/*\r
+ * End of copied SHA code.\r
+ *\r
+ * ------------------------------------------------------------------------\r
+ */\r
+\r
+static PyTypeObject SHA384type;\r
+static PyTypeObject SHA512type;\r
+\r
+\r
+static SHAobject *\r
+newSHA384object(void)\r
+{\r
+    return (SHAobject *)PyObject_New(SHAobject, &SHA384type);\r
+}\r
+\r
+static SHAobject *\r
+newSHA512object(void)\r
+{\r
+    return (SHAobject *)PyObject_New(SHAobject, &SHA512type);\r
+}\r
+\r
+/* Internal methods for a hash object */\r
+\r
+static void\r
+SHA512_dealloc(PyObject *ptr)\r
+{\r
+    PyObject_Del(ptr);\r
+}\r
+\r
+\r
+/* External methods for a hash object */\r
+\r
+PyDoc_STRVAR(SHA512_copy__doc__, "Return a copy of the hash object.");\r
+\r
+static PyObject *\r
+SHA512_copy(SHAobject *self, PyObject *unused)\r
+{\r
+    SHAobject *newobj;\r
+\r
+    if (((PyObject*)self)->ob_type == &SHA512type) {\r
+        if ( (newobj = newSHA512object())==NULL)\r
+            return NULL;\r
+    } else {\r
+        if ( (newobj = newSHA384object())==NULL)\r
+            return NULL;\r
+    }\r
+\r
+    SHAcopy(self, newobj);\r
+    return (PyObject *)newobj;\r
+}\r
+\r
+PyDoc_STRVAR(SHA512_digest__doc__,\r
+"Return the digest value as a string of binary data.");\r
+\r
+static PyObject *\r
+SHA512_digest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+\r
+    SHAcopy(self, &temp);\r
+    sha512_final(digest, &temp);\r
+    return PyString_FromStringAndSize((const char *)digest, self->digestsize);\r
+}\r
+\r
+PyDoc_STRVAR(SHA512_hexdigest__doc__,\r
+"Return the digest value as a string of hexadecimal digits.");\r
+\r
+static PyObject *\r
+SHA512_hexdigest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+    PyObject *retval;\r
+    char *hex_digest;\r
+    int i, j;\r
+\r
+    /* Get the raw (binary) digest value */\r
+    SHAcopy(self, &temp);\r
+    sha512_final(digest, &temp);\r
+\r
+    /* Create a new string */\r
+    retval = PyString_FromStringAndSize(NULL, self->digestsize * 2);\r
+    if (!retval)\r
+            return NULL;\r
+    hex_digest = PyString_AsString(retval);\r
+    if (!hex_digest) {\r
+            Py_DECREF(retval);\r
+            return NULL;\r
+    }\r
+\r
+    /* Make hex version of the digest */\r
+    for (i=j=0; i<self->digestsize; i++) {\r
+        char c;\r
+        c = (digest[i] >> 4) & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+        c = (digest[i] & 0xf);\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+    }\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(SHA512_update__doc__,\r
+"Update this hash object's state with the provided string.");\r
+\r
+static PyObject *\r
+SHA512_update(SHAobject *self, PyObject *args)\r
+{\r
+    Py_buffer buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:update", &buf))\r
+        return NULL;\r
+\r
+    sha512_update(self, buf.buf, buf.len);\r
+\r
+    PyBuffer_Release(&buf);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyMethodDef SHA_methods[] = {\r
+    {"copy",      (PyCFunction)SHA512_copy,      METH_NOARGS, SHA512_copy__doc__},\r
+    {"digest",    (PyCFunction)SHA512_digest,    METH_NOARGS, SHA512_digest__doc__},\r
+    {"hexdigest", (PyCFunction)SHA512_hexdigest, METH_NOARGS, SHA512_hexdigest__doc__},\r
+    {"update",    (PyCFunction)SHA512_update,    METH_VARARGS, SHA512_update__doc__},\r
+    {NULL,        NULL}         /* sentinel */\r
+};\r
+\r
+static PyObject *\r
+SHA512_get_block_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(SHA_BLOCKSIZE);\r
+}\r
+\r
+static PyObject *\r
+SHA512_get_name(PyObject *self, void *closure)\r
+{\r
+    if (((SHAobject *)self)->digestsize == 64)\r
+        return PyString_FromStringAndSize("SHA512", 6);\r
+    else\r
+        return PyString_FromStringAndSize("SHA384", 6);\r
+}\r
+\r
+static PyGetSetDef SHA_getseters[] = {\r
+    {"block_size",\r
+     (getter)SHA512_get_block_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"name",\r
+     (getter)SHA512_get_name, NULL,\r
+     NULL,\r
+     NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyMemberDef SHA_members[] = {\r
+    {"digest_size", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
+    /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
+     * the old sha module also supported 'digestsize'.  ugh. */\r
+    {"digestsize", T_INT, offsetof(SHAobject, digestsize), READONLY, NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyTypeObject SHA384type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_sha512.sha384",   /*tp_name*/\r
+    sizeof(SHAobject),  /*tp_size*/\r
+    0,                  /*tp_itemsize*/\r
+    /* methods */\r
+    SHA512_dealloc,     /*tp_dealloc*/\r
+    0,                  /*tp_print*/\r
+    0,                  /*tp_getattr*/\r
+    0,                  /*tp_setattr*/\r
+    0,                  /*tp_compare*/\r
+    0,                  /*tp_repr*/\r
+    0,                  /*tp_as_number*/\r
+    0,                  /*tp_as_sequence*/\r
+    0,                  /*tp_as_mapping*/\r
+    0,                  /*tp_hash*/\r
+    0,                  /*tp_call*/\r
+    0,                  /*tp_str*/\r
+    0,                  /*tp_getattro*/\r
+    0,                  /*tp_setattro*/\r
+    0,                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
+    0,                  /*tp_doc*/\r
+    0,                  /*tp_traverse*/\r
+    0,                  /*tp_clear*/\r
+    0,                  /*tp_richcompare*/\r
+    0,                  /*tp_weaklistoffset*/\r
+    0,                  /*tp_iter*/\r
+    0,                  /*tp_iternext*/\r
+    SHA_methods,        /* tp_methods */\r
+    SHA_members,        /* tp_members */\r
+    SHA_getseters,      /* tp_getset */\r
+};\r
+\r
+static PyTypeObject SHA512type = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_sha512.sha512",   /*tp_name*/\r
+    sizeof(SHAobject),  /*tp_size*/\r
+    0,                  /*tp_itemsize*/\r
+    /* methods */\r
+    SHA512_dealloc,     /*tp_dealloc*/\r
+    0,                  /*tp_print*/\r
+    0,                  /*tp_getattr*/\r
+    0,                  /*tp_setattr*/\r
+    0,                  /*tp_compare*/\r
+    0,                  /*tp_repr*/\r
+    0,                  /*tp_as_number*/\r
+    0,                  /*tp_as_sequence*/\r
+    0,                  /*tp_as_mapping*/\r
+    0,                  /*tp_hash*/\r
+    0,                  /*tp_call*/\r
+    0,                  /*tp_str*/\r
+    0,                  /*tp_getattro*/\r
+    0,                  /*tp_setattro*/\r
+    0,                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
+    0,                  /*tp_doc*/\r
+    0,                  /*tp_traverse*/\r
+    0,                  /*tp_clear*/\r
+    0,                  /*tp_richcompare*/\r
+    0,                  /*tp_weaklistoffset*/\r
+    0,                  /*tp_iter*/\r
+    0,                  /*tp_iternext*/\r
+    SHA_methods,        /* tp_methods */\r
+    SHA_members,        /* tp_members */\r
+    SHA_getseters,      /* tp_getset */\r
+};\r
+\r
+\r
+/* The single module-level function: new() */\r
+\r
+PyDoc_STRVAR(SHA512_new__doc__,\r
+"Return a new SHA-512 hash object; optionally initialized with a string.");\r
+\r
+static PyObject *\r
+SHA512_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
+{\r
+    static char *kwlist[] = {"string", NULL};\r
+    SHAobject *new;\r
+    Py_buffer buf = { 0 };\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
+                                     &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    if ((new = newSHA512object()) == NULL) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    sha512_init(new);\r
+\r
+    if (PyErr_Occurred()) {\r
+        Py_DECREF(new);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    if (buf.len > 0) {\r
+        sha512_update(new, buf.buf, buf.len);\r
+    }\r
+    PyBuffer_Release(&buf);\r
+\r
+    return (PyObject *)new;\r
+}\r
+\r
+PyDoc_STRVAR(SHA384_new__doc__,\r
+"Return a new SHA-384 hash object; optionally initialized with a string.");\r
+\r
+static PyObject *\r
+SHA384_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
+{\r
+    static char *kwlist[] = {"string", NULL};\r
+    SHAobject *new;\r
+    Py_buffer buf = { 0 };\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
+                                     &buf)) {\r
+        return NULL;\r
+    }\r
+\r
+    if ((new = newSHA384object()) == NULL) {\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+\r
+    sha384_init(new);\r
+\r
+    if (PyErr_Occurred()) {\r
+        Py_DECREF(new);\r
+        PyBuffer_Release(&buf);\r
+        return NULL;\r
+    }\r
+    if (buf.len > 0) {\r
+        sha512_update(new, buf.buf, buf.len);\r
+    }\r
+    PyBuffer_Release(&buf);\r
+\r
+    return (PyObject *)new;\r
+}\r
+\r
+\r
+/* List of functions exported by this module */\r
+\r
+static struct PyMethodDef SHA_functions[] = {\r
+    {"sha512", (PyCFunction)SHA512_new, METH_VARARGS|METH_KEYWORDS, SHA512_new__doc__},\r
+    {"sha384", (PyCFunction)SHA384_new, METH_VARARGS|METH_KEYWORDS, SHA384_new__doc__},\r
+    {NULL,      NULL}            /* Sentinel */\r
+};\r
+\r
+\r
+/* Initialize this module. */\r
+\r
+#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
+\r
+PyMODINIT_FUNC\r
+init_sha512(void)\r
+{\r
+    PyObject *m;\r
+\r
+    Py_TYPE(&SHA384type) = &PyType_Type;\r
+    if (PyType_Ready(&SHA384type) < 0)\r
+        return;\r
+    Py_TYPE(&SHA512type) = &PyType_Type;\r
+    if (PyType_Ready(&SHA512type) < 0)\r
+        return;\r
+    m = Py_InitModule("_sha512", SHA_functions);\r
+    if (m == NULL)\r
+        return;\r
+}\r
+\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/shamodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/shamodule.c
new file mode 100644 (file)
index 0000000..f634b5b
--- /dev/null
@@ -0,0 +1,623 @@
+/* SHA module */\r
+\r
+/* This module provides an interface to NIST's Secure Hash Algorithm */\r
+\r
+/* See below for information about the original code this module was\r
+   based upon. Additional work performed by:\r
+\r
+   Andrew Kuchling (amk@amk.ca)\r
+   Greg Stein (gstein@lyra.org)\r
+\r
+   Copyright (C) 2005   Gregory P. Smith (greg@krypto.org)\r
+   Licensed to PSF under a Contributor Agreement.\r
+\r
+*/\r
+\r
+/* SHA objects */\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+\r
+/* Endianness testing and definitions */\r
+#define TestEndianness(variable) {int i=1; variable=PCT_BIG_ENDIAN;\\r
+        if (*((char*)&i)==1) variable=PCT_LITTLE_ENDIAN;}\r
+\r
+#define PCT_LITTLE_ENDIAN 1\r
+#define PCT_BIG_ENDIAN 0\r
+\r
+/* Some useful types */\r
+\r
+typedef unsigned char SHA_BYTE;\r
+\r
+#if SIZEOF_INT == 4\r
+typedef unsigned int SHA_INT32; /* 32-bit integer */\r
+#else\r
+/* not defined. compilation will die. */\r
+#endif\r
+\r
+/* The SHA block size and message digest sizes, in bytes */\r
+\r
+#define SHA_BLOCKSIZE    64\r
+#define SHA_DIGESTSIZE  20\r
+\r
+/* The structure for storing SHS info */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    SHA_INT32 digest[5];                /* Message digest */\r
+    SHA_INT32 count_lo, count_hi;       /* 64-bit bit count */\r
+    SHA_BYTE data[SHA_BLOCKSIZE];       /* SHA data buffer */\r
+    int Endianness;\r
+    int local;                          /* unprocessed amount in data */\r
+} SHAobject;\r
+\r
+/* When run on a little-endian CPU we need to perform byte reversal on an\r
+   array of longwords. */\r
+\r
+static void longReverse(SHA_INT32 *buffer, int byteCount, int Endianness)\r
+{\r
+    SHA_INT32 value;\r
+\r
+    if ( Endianness == PCT_BIG_ENDIAN )\r
+        return;\r
+\r
+    byteCount /= sizeof(*buffer);\r
+    while (byteCount--) {\r
+        value = *buffer;\r
+        value = ( ( value & 0xFF00FF00L ) >> 8  ) | \\r
+                ( ( value & 0x00FF00FFL ) << 8 );\r
+        *buffer++ = ( value << 16 ) | ( value >> 16 );\r
+    }\r
+}\r
+\r
+static void SHAcopy(SHAobject *src, SHAobject *dest)\r
+{\r
+    dest->Endianness = src->Endianness;\r
+    dest->local = src->local;\r
+    dest->count_lo = src->count_lo;\r
+    dest->count_hi = src->count_hi;\r
+    memcpy(dest->digest, src->digest, sizeof(src->digest));\r
+    memcpy(dest->data, src->data, sizeof(src->data));\r
+}\r
+\r
+\r
+/* ------------------------------------------------------------------------\r
+ *\r
+ * This code for the SHA algorithm was noted as public domain. The original\r
+ * headers are pasted below.\r
+ *\r
+ * Several changes have been made to make it more compatible with the\r
+ * Python environment and desired interface.\r
+ *\r
+ */\r
+\r
+/* NIST Secure Hash Algorithm */\r
+/* heavily modified by Uwe Hollerbach <uh@alumni.caltech edu> */\r
+/* from Peter C. Gutmann's implementation as found in */\r
+/* Applied Cryptography by Bruce Schneier */\r
+/* Further modifications to include the "UNRAVEL" stuff, below */\r
+\r
+/* This code is in the public domain */\r
+\r
+/* UNRAVEL should be fastest & biggest */\r
+/* UNROLL_LOOPS should be just as big, but slightly slower */\r
+/* both undefined should be smallest and slowest */\r
+\r
+#define UNRAVEL\r
+/* #define UNROLL_LOOPS */\r
+\r
+/* The SHA f()-functions.  The f1 and f3 functions can be optimized to\r
+   save one boolean operation each - thanks to Rich Schroeppel,\r
+   rcs@cs.arizona.edu for discovering this */\r
+\r
+/*#define f1(x,y,z)     ((x & y) | (~x & z))            // Rounds  0-19 */\r
+#define f1(x,y,z)       (z ^ (x & (y ^ z)))             /* Rounds  0-19 */\r
+#define f2(x,y,z)       (x ^ y ^ z)                     /* Rounds 20-39 */\r
+/*#define f3(x,y,z)     ((x & y) | (x & z) | (y & z))   // Rounds 40-59 */\r
+#define f3(x,y,z)       ((x & y) | (z & (x | y)))       /* Rounds 40-59 */\r
+#define f4(x,y,z)       (x ^ y ^ z)                     /* Rounds 60-79 */\r
+\r
+/* SHA constants */\r
+\r
+#define CONST1          0x5a827999L                     /* Rounds  0-19 */\r
+#define CONST2          0x6ed9eba1L                     /* Rounds 20-39 */\r
+#define CONST3          0x8f1bbcdcL                     /* Rounds 40-59 */\r
+#define CONST4          0xca62c1d6L                     /* Rounds 60-79 */\r
+\r
+/* 32-bit rotate */\r
+\r
+#define R32(x,n)        ((x << n) | (x >> (32 - n)))\r
+\r
+/* the generic case, for when the overall rotation is not unraveled */\r
+\r
+#define FG(n)   \\r
+    T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n;  \\r
+    E = D; D = C; C = R32(B,30); B = A; A = T\r
+\r
+/* specific cases, for when the overall rotation is unraveled */\r
+\r
+#define FA(n)   \\r
+    T = R32(A,5) + f##n(B,C,D) + E + *WP++ + CONST##n; B = R32(B,30)\r
+\r
+#define FB(n)   \\r
+    E = R32(T,5) + f##n(A,B,C) + D + *WP++ + CONST##n; A = R32(A,30)\r
+\r
+#define FC(n)   \\r
+    D = R32(E,5) + f##n(T,A,B) + C + *WP++ + CONST##n; T = R32(T,30)\r
+\r
+#define FD(n)   \\r
+    C = R32(D,5) + f##n(E,T,A) + B + *WP++ + CONST##n; E = R32(E,30)\r
+\r
+#define FE(n)   \\r
+    B = R32(C,5) + f##n(D,E,T) + A + *WP++ + CONST##n; D = R32(D,30)\r
+\r
+#define FT(n)   \\r
+    A = R32(B,5) + f##n(C,D,E) + T + *WP++ + CONST##n; C = R32(C,30)\r
+\r
+/* do SHA transformation */\r
+\r
+static void\r
+sha_transform(SHAobject *sha_info)\r
+{\r
+    int i;\r
+    SHA_INT32 T, A, B, C, D, E, W[80], *WP;\r
+\r
+    memcpy(W, sha_info->data, sizeof(sha_info->data));\r
+    longReverse(W, (int)sizeof(sha_info->data), sha_info->Endianness);\r
+\r
+    for (i = 16; i < 80; ++i) {\r
+        W[i] = W[i-3] ^ W[i-8] ^ W[i-14] ^ W[i-16];\r
+\r
+        /* extra rotation fix */\r
+        W[i] = R32(W[i], 1);\r
+    }\r
+    A = sha_info->digest[0];\r
+    B = sha_info->digest[1];\r
+    C = sha_info->digest[2];\r
+    D = sha_info->digest[3];\r
+    E = sha_info->digest[4];\r
+    WP = W;\r
+#ifdef UNRAVEL\r
+    FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1); FC(1); FD(1);\r
+    FE(1); FT(1); FA(1); FB(1); FC(1); FD(1); FE(1); FT(1); FA(1); FB(1);\r
+    FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2); FE(2); FT(2);\r
+    FA(2); FB(2); FC(2); FD(2); FE(2); FT(2); FA(2); FB(2); FC(2); FD(2);\r
+    FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3); FA(3); FB(3);\r
+    FC(3); FD(3); FE(3); FT(3); FA(3); FB(3); FC(3); FD(3); FE(3); FT(3);\r
+    FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4); FC(4); FD(4);\r
+    FE(4); FT(4); FA(4); FB(4); FC(4); FD(4); FE(4); FT(4); FA(4); FB(4);\r
+    sha_info->digest[0] += E;\r
+    sha_info->digest[1] += T;\r
+    sha_info->digest[2] += A;\r
+    sha_info->digest[3] += B;\r
+    sha_info->digest[4] += C;\r
+#else /* !UNRAVEL */\r
+#ifdef UNROLL_LOOPS\r
+    FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);\r
+    FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1); FG(1);\r
+    FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);\r
+    FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2); FG(2);\r
+    FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);\r
+    FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3); FG(3);\r
+    FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);\r
+    FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4); FG(4);\r
+#else /* !UNROLL_LOOPS */\r
+    for (i =  0; i < 20; ++i) { FG(1); }\r
+    for (i = 20; i < 40; ++i) { FG(2); }\r
+    for (i = 40; i < 60; ++i) { FG(3); }\r
+    for (i = 60; i < 80; ++i) { FG(4); }\r
+#endif /* !UNROLL_LOOPS */\r
+    sha_info->digest[0] += A;\r
+    sha_info->digest[1] += B;\r
+    sha_info->digest[2] += C;\r
+    sha_info->digest[3] += D;\r
+    sha_info->digest[4] += E;\r
+#endif /* !UNRAVEL */\r
+}\r
+\r
+/* initialize the SHA digest */\r
+\r
+static void\r
+sha_init(SHAobject *sha_info)\r
+{\r
+    TestEndianness(sha_info->Endianness)\r
+\r
+    sha_info->digest[0] = 0x67452301L;\r
+    sha_info->digest[1] = 0xefcdab89L;\r
+    sha_info->digest[2] = 0x98badcfeL;\r
+    sha_info->digest[3] = 0x10325476L;\r
+    sha_info->digest[4] = 0xc3d2e1f0L;\r
+    sha_info->count_lo = 0L;\r
+    sha_info->count_hi = 0L;\r
+    sha_info->local = 0;\r
+}\r
+\r
+/* update the SHA digest */\r
+\r
+static void\r
+sha_update(SHAobject *sha_info, SHA_BYTE *buffer, unsigned int count)\r
+{\r
+    unsigned int i;\r
+    SHA_INT32 clo;\r
+\r
+    clo = sha_info->count_lo + ((SHA_INT32) count << 3);\r
+    if (clo < sha_info->count_lo) {\r
+        ++sha_info->count_hi;\r
+    }\r
+    sha_info->count_lo = clo;\r
+    sha_info->count_hi += (SHA_INT32) count >> 29;\r
+    if (sha_info->local) {\r
+        i = SHA_BLOCKSIZE - sha_info->local;\r
+        if (i > count) {\r
+            i = count;\r
+        }\r
+        memcpy(((SHA_BYTE *) sha_info->data) + sha_info->local, buffer, i);\r
+        count -= i;\r
+        buffer += i;\r
+        sha_info->local += i;\r
+        if (sha_info->local == SHA_BLOCKSIZE) {\r
+            sha_transform(sha_info);\r
+        }\r
+        else {\r
+            return;\r
+        }\r
+    }\r
+    while (count >= SHA_BLOCKSIZE) {\r
+        memcpy(sha_info->data, buffer, SHA_BLOCKSIZE);\r
+        buffer += SHA_BLOCKSIZE;\r
+        count -= SHA_BLOCKSIZE;\r
+        sha_transform(sha_info);\r
+    }\r
+    memcpy(sha_info->data, buffer, count);\r
+    sha_info->local = count;\r
+}\r
+\r
+/* finish computing the SHA digest */\r
+\r
+static void\r
+sha_final(unsigned char digest[20], SHAobject *sha_info)\r
+{\r
+    int count;\r
+    SHA_INT32 lo_bit_count, hi_bit_count;\r
+\r
+    lo_bit_count = sha_info->count_lo;\r
+    hi_bit_count = sha_info->count_hi;\r
+    count = (int) ((lo_bit_count >> 3) & 0x3f);\r
+    ((SHA_BYTE *) sha_info->data)[count++] = 0x80;\r
+    if (count > SHA_BLOCKSIZE - 8) {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - count);\r
+        sha_transform(sha_info);\r
+        memset((SHA_BYTE *) sha_info->data, 0, SHA_BLOCKSIZE - 8);\r
+    }\r
+    else {\r
+        memset(((SHA_BYTE *) sha_info->data) + count, 0,\r
+               SHA_BLOCKSIZE - 8 - count);\r
+    }\r
+\r
+    /* GJS: note that we add the hi/lo in big-endian. sha_transform will\r
+       swap these values into host-order. */\r
+    sha_info->data[56] = (hi_bit_count >> 24) & 0xff;\r
+    sha_info->data[57] = (hi_bit_count >> 16) & 0xff;\r
+    sha_info->data[58] = (hi_bit_count >>  8) & 0xff;\r
+    sha_info->data[59] = (hi_bit_count >>  0) & 0xff;\r
+    sha_info->data[60] = (lo_bit_count >> 24) & 0xff;\r
+    sha_info->data[61] = (lo_bit_count >> 16) & 0xff;\r
+    sha_info->data[62] = (lo_bit_count >>  8) & 0xff;\r
+    sha_info->data[63] = (lo_bit_count >>  0) & 0xff;\r
+    sha_transform(sha_info);\r
+    digest[ 0] = (unsigned char) ((sha_info->digest[0] >> 24) & 0xff);\r
+    digest[ 1] = (unsigned char) ((sha_info->digest[0] >> 16) & 0xff);\r
+    digest[ 2] = (unsigned char) ((sha_info->digest[0] >>  8) & 0xff);\r
+    digest[ 3] = (unsigned char) ((sha_info->digest[0]      ) & 0xff);\r
+    digest[ 4] = (unsigned char) ((sha_info->digest[1] >> 24) & 0xff);\r
+    digest[ 5] = (unsigned char) ((sha_info->digest[1] >> 16) & 0xff);\r
+    digest[ 6] = (unsigned char) ((sha_info->digest[1] >>  8) & 0xff);\r
+    digest[ 7] = (unsigned char) ((sha_info->digest[1]      ) & 0xff);\r
+    digest[ 8] = (unsigned char) ((sha_info->digest[2] >> 24) & 0xff);\r
+    digest[ 9] = (unsigned char) ((sha_info->digest[2] >> 16) & 0xff);\r
+    digest[10] = (unsigned char) ((sha_info->digest[2] >>  8) & 0xff);\r
+    digest[11] = (unsigned char) ((sha_info->digest[2]      ) & 0xff);\r
+    digest[12] = (unsigned char) ((sha_info->digest[3] >> 24) & 0xff);\r
+    digest[13] = (unsigned char) ((sha_info->digest[3] >> 16) & 0xff);\r
+    digest[14] = (unsigned char) ((sha_info->digest[3] >>  8) & 0xff);\r
+    digest[15] = (unsigned char) ((sha_info->digest[3]      ) & 0xff);\r
+    digest[16] = (unsigned char) ((sha_info->digest[4] >> 24) & 0xff);\r
+    digest[17] = (unsigned char) ((sha_info->digest[4] >> 16) & 0xff);\r
+    digest[18] = (unsigned char) ((sha_info->digest[4] >>  8) & 0xff);\r
+    digest[19] = (unsigned char) ((sha_info->digest[4]      ) & 0xff);\r
+}\r
+\r
+/*\r
+ * End of copied SHA code.\r
+ *\r
+ * ------------------------------------------------------------------------\r
+ */\r
+\r
+static PyTypeObject SHAtype;\r
+\r
+\r
+static SHAobject *\r
+newSHAobject(void)\r
+{\r
+    return (SHAobject *)PyObject_New(SHAobject, &SHAtype);\r
+}\r
+\r
+/* Internal methods for a hashing object */\r
+\r
+static void\r
+SHA_dealloc(PyObject *ptr)\r
+{\r
+    PyObject_Del(ptr);\r
+}\r
+\r
+\r
+/* External methods for a hashing object */\r
+\r
+PyDoc_STRVAR(SHA_copy__doc__, "Return a copy of the hashing object.");\r
+\r
+static PyObject *\r
+SHA_copy(SHAobject *self, PyObject *unused)\r
+{\r
+    SHAobject *newobj;\r
+\r
+    if ( (newobj = newSHAobject())==NULL)\r
+        return NULL;\r
+\r
+    SHAcopy(self, newobj);\r
+    return (PyObject *)newobj;\r
+}\r
+\r
+PyDoc_STRVAR(SHA_digest__doc__,\r
+"Return the digest value as a string of binary data.");\r
+\r
+static PyObject *\r
+SHA_digest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+\r
+    SHAcopy(self, &temp);\r
+    sha_final(digest, &temp);\r
+    return PyString_FromStringAndSize((const char *)digest, sizeof(digest));\r
+}\r
+\r
+PyDoc_STRVAR(SHA_hexdigest__doc__,\r
+"Return the digest value as a string of hexadecimal digits.");\r
+\r
+static PyObject *\r
+SHA_hexdigest(SHAobject *self, PyObject *unused)\r
+{\r
+    unsigned char digest[SHA_DIGESTSIZE];\r
+    SHAobject temp;\r
+    PyObject *retval;\r
+    char *hex_digest;\r
+    int i, j;\r
+\r
+    /* Get the raw (binary) digest value */\r
+    SHAcopy(self, &temp);\r
+    sha_final(digest, &temp);\r
+\r
+    /* Create a new string */\r
+    retval = PyString_FromStringAndSize(NULL, sizeof(digest) * 2);\r
+    if (!retval)\r
+            return NULL;\r
+    hex_digest = PyString_AsString(retval);\r
+    if (!hex_digest) {\r
+            Py_DECREF(retval);\r
+            return NULL;\r
+    }\r
+\r
+    /* Make hex version of the digest */\r
+    for(i=j=0; i<sizeof(digest); i++) {\r
+        char c;\r
+        c = (digest[i] >> 4) & 0xf;\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+        c = (digest[i] & 0xf);\r
+        c = (c>9) ? c+'a'-10 : c + '0';\r
+        hex_digest[j++] = c;\r
+    }\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(SHA_update__doc__,\r
+"Update this hashing object's state with the provided string.");\r
+\r
+static PyObject *\r
+SHA_update(SHAobject *self, PyObject *args)\r
+{\r
+    Py_buffer view;\r
+    Py_ssize_t n;\r
+    unsigned char *buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*:update", &view))\r
+        return NULL;\r
+\r
+    n = view.len;\r
+    buf = (unsigned char *) view.buf;\r
+    while (n > 0) {\r
+        Py_ssize_t nbytes;\r
+        if (n > INT_MAX)\r
+            nbytes = INT_MAX;\r
+        else\r
+            nbytes = n;\r
+        sha_update(self, buf,\r
+                   Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int));\r
+        buf += nbytes;\r
+        n -= nbytes;\r
+    }\r
+\r
+    PyBuffer_Release(&view);\r
+    Py_RETURN_NONE;\r
+}\r
+\r
+static PyMethodDef SHA_methods[] = {\r
+    {"copy",      (PyCFunction)SHA_copy,      METH_NOARGS,  SHA_copy__doc__},\r
+    {"digest",    (PyCFunction)SHA_digest,    METH_NOARGS,  SHA_digest__doc__},\r
+    {"hexdigest", (PyCFunction)SHA_hexdigest, METH_NOARGS,  SHA_hexdigest__doc__},\r
+    {"update",    (PyCFunction)SHA_update,    METH_VARARGS, SHA_update__doc__},\r
+    {NULL,        NULL}         /* sentinel */\r
+};\r
+\r
+static PyObject *\r
+SHA_get_block_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(SHA_BLOCKSIZE);\r
+}\r
+\r
+static PyObject *\r
+SHA_get_digest_size(PyObject *self, void *closure)\r
+{\r
+    return PyInt_FromLong(SHA_DIGESTSIZE);\r
+}\r
+\r
+static PyObject *\r
+SHA_get_name(PyObject *self, void *closure)\r
+{\r
+    return PyString_FromStringAndSize("SHA1", 4);\r
+}\r
+\r
+static PyGetSetDef SHA_getseters[] = {\r
+    {"digest_size",\r
+     (getter)SHA_get_digest_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"block_size",\r
+     (getter)SHA_get_block_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {"name",\r
+     (getter)SHA_get_name, NULL,\r
+     NULL,\r
+     NULL},\r
+    /* the old md5 and sha modules support 'digest_size' as in PEP 247.\r
+     * the old sha module also supported 'digestsize'.  ugh. */\r
+    {"digestsize",\r
+     (getter)SHA_get_digest_size, NULL,\r
+     NULL,\r
+     NULL},\r
+    {NULL}  /* Sentinel */\r
+};\r
+\r
+static PyTypeObject SHAtype = {\r
+    PyVarObject_HEAD_INIT(NULL, 0)\r
+    "_sha.sha",         /*tp_name*/\r
+    sizeof(SHAobject),  /*tp_size*/\r
+    0,                  /*tp_itemsize*/\r
+    /* methods */\r
+    SHA_dealloc,        /*tp_dealloc*/\r
+    0,                  /*tp_print*/\r
+    0,                  /*tp_getattr*/\r
+    0,                  /*tp_setattr*/\r
+    0,                  /*tp_compare*/\r
+    0,                  /*tp_repr*/\r
+    0,                  /*tp_as_number*/\r
+    0,                  /*tp_as_sequence*/\r
+    0,                  /*tp_as_mapping*/\r
+    0,                  /*tp_hash*/\r
+    0,                  /*tp_call*/\r
+    0,                  /*tp_str*/\r
+    0,                  /*tp_getattro*/\r
+    0,                  /*tp_setattro*/\r
+    0,                  /*tp_as_buffer*/\r
+    Py_TPFLAGS_DEFAULT, /*tp_flags*/\r
+    0,                  /*tp_doc*/\r
+    0,                  /*tp_traverse*/\r
+    0,                  /*tp_clear*/\r
+    0,                  /*tp_richcompare*/\r
+    0,                  /*tp_weaklistoffset*/\r
+    0,                  /*tp_iter*/\r
+    0,                  /*tp_iternext*/\r
+    SHA_methods,        /* tp_methods */\r
+    0,                  /* tp_members */\r
+    SHA_getseters,      /* tp_getset */\r
+};\r
+\r
+\r
+/* The single module-level function: new() */\r
+\r
+PyDoc_STRVAR(SHA_new__doc__,\r
+"Return a new SHA hashing object.  An optional string argument\n\\r
+may be provided; if present, this string will be automatically\n\\r
+hashed.");\r
+\r
+static PyObject *\r
+SHA_new(PyObject *self, PyObject *args, PyObject *kwdict)\r
+{\r
+    static char *kwlist[] = {"string", NULL};\r
+    SHAobject *new;\r
+    Py_buffer view = { 0 };\r
+    Py_ssize_t n;\r
+    unsigned char *buf;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|s*:new", kwlist,\r
+                                     &view)) {\r
+        return NULL;\r
+    }\r
+\r
+    if ((new = newSHAobject()) == NULL) {\r
+        PyBuffer_Release(&view);\r
+        return NULL;\r
+    }\r
+\r
+    sha_init(new);\r
+\r
+    if (PyErr_Occurred()) {\r
+        Py_DECREF(new);\r
+        PyBuffer_Release(&view);\r
+        return NULL;\r
+    }\r
+\r
+    n = view.len;\r
+    buf = (unsigned char *) view.buf;\r
+    while (n > 0) {\r
+        Py_ssize_t nbytes;\r
+        if (n > INT_MAX)\r
+            nbytes = INT_MAX;\r
+        else\r
+            nbytes = n;\r
+        sha_update(new, buf,\r
+                   Py_SAFE_DOWNCAST(nbytes, Py_ssize_t, unsigned int));\r
+        buf += nbytes;\r
+        n -= nbytes;\r
+    }\r
+\r
+    PyBuffer_Release(&view);\r
+\r
+    return (PyObject *)new;\r
+}\r
+\r
+\r
+/* List of functions exported by this module */\r
+\r
+static struct PyMethodDef SHA_functions[] = {\r
+    {"new", (PyCFunction)SHA_new, METH_VARARGS|METH_KEYWORDS, SHA_new__doc__},\r
+    {NULL,      NULL}            /* Sentinel */\r
+};\r
+\r
+\r
+/* Initialize this module. */\r
+\r
+#define insint(n,v) { PyModule_AddIntConstant(m,n,v); }\r
+\r
+PyMODINIT_FUNC\r
+init_sha(void)\r
+{\r
+    PyObject *m;\r
+\r
+    Py_TYPE(&SHAtype) = &PyType_Type;\r
+    if (PyType_Ready(&SHAtype) < 0)\r
+        return;\r
+    m = Py_InitModule("_sha", SHA_functions);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Add some symbolic constants to the module */\r
+    insint("blocksize", 1);  /* For future use, in case some hash\r
+                                functions require an integral number of\r
+                                blocks */\r
+    insint("digestsize", 20);\r
+    insint("digest_size", 20);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/signalmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/signalmodule.c
new file mode 100644 (file)
index 0000000..d7beb80
--- /dev/null
@@ -0,0 +1,1011 @@
+\r
+/* Signal module -- many thanks to Lance Ellinghaus */\r
+\r
+/* XXX Signals should be recorded per thread, now we have thread state. */\r
+\r
+#include "Python.h"\r
+#include "intrcheck.h"\r
+\r
+#ifdef MS_WINDOWS\r
+#include <Windows.h>\r
+#ifdef HAVE_PROCESS_H\r
+#include <process.h>\r
+#endif\r
+#endif\r
+\r
+#ifdef HAVE_SIGNAL_H\r
+#include <signal.h>\r
+#endif\r
+#ifdef HAVE_SYS_STAT_H\r
+#include <sys/stat.h>\r
+#endif\r
+#ifdef HAVE_SYS_TIME_H\r
+#include <sys/time.h>\r
+#endif\r
+\r
+#ifndef SIG_ERR\r
+#define SIG_ERR ((PyOS_sighandler_t)(-1))\r
+#endif\r
+\r
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
+#define NSIG 12\r
+#include <process.h>\r
+#endif\r
+\r
+#ifndef NSIG\r
+# if defined(_NSIG)\r
+#  define NSIG _NSIG            /* For BSD/SysV */\r
+# elif defined(_SIGMAX)\r
+#  define NSIG (_SIGMAX + 1)    /* For QNX */\r
+# elif defined(SIGMAX)\r
+#  define NSIG (SIGMAX + 1)     /* For djgpp */\r
+# else\r
+#  define NSIG 64               /* Use a reasonable default value */\r
+# endif\r
+#endif\r
+\r
+\r
+/*\r
+   NOTES ON THE INTERACTION BETWEEN SIGNALS AND THREADS\r
+\r
+   When threads are supported, we want the following semantics:\r
+\r
+   - only the main thread can set a signal handler\r
+   - any thread can get a signal handler\r
+   - signals are only delivered to the main thread\r
+\r
+   I.e. we don't support "synchronous signals" like SIGFPE (catching\r
+   this doesn't make much sense in Python anyway) nor do we support\r
+   signals as a means of inter-thread communication, since not all\r
+   thread implementations support that (at least our thread library\r
+   doesn't).\r
+\r
+   We still have the problem that in some implementations signals\r
+   generated by the keyboard (e.g. SIGINT) are delivered to all\r
+   threads (e.g. SGI), while in others (e.g. Solaris) such signals are\r
+   delivered to one random thread (an intermediate possibility would\r
+   be to deliver it to the main thread -- POSIX?).  For now, we have\r
+   a working implementation that works in all three cases -- the\r
+   handler ignores signals if getpid() isn't the same as in the main\r
+   thread.  XXX This is a hack.\r
+\r
+   GNU pth is a user-space threading library, and as such, all threads\r
+   run within the same process. In this case, if the currently running\r
+   thread is not the main_thread, send the signal to the main_thread.\r
+*/\r
+\r
+#ifdef WITH_THREAD\r
+#include <sys/types.h> /* For pid_t */\r
+#include "pythread.h"\r
+static long main_thread;\r
+static pid_t main_pid;\r
+#endif\r
+\r
+static struct {\r
+    int tripped;\r
+    PyObject *func;\r
+} Handlers[NSIG];\r
+\r
+static sig_atomic_t wakeup_fd = -1;\r
+\r
+/* Speed up sigcheck() when none tripped */\r
+static volatile sig_atomic_t is_tripped = 0;\r
+\r
+static PyObject *DefaultHandler;\r
+static PyObject *IgnoreHandler;\r
+static PyObject *IntHandler;\r
+\r
+/* On Solaris 8, gcc will produce a warning that the function\r
+   declaration is not a prototype. This is caused by the definition of\r
+   SIG_DFL as (void (*)())0; the correct declaration would have been\r
+   (void (*)(int))0. */\r
+\r
+static PyOS_sighandler_t old_siginthandler = SIG_DFL;\r
+\r
+#ifdef HAVE_GETITIMER\r
+static PyObject *ItimerError;\r
+\r
+/* auxiliary functions for setitimer/getitimer */\r
+static void\r
+timeval_from_double(double d, struct timeval *tv)\r
+{\r
+    tv->tv_sec = floor(d);\r
+    tv->tv_usec = fmod(d, 1.0) * 1000000.0;\r
+}\r
+\r
+Py_LOCAL_INLINE(double)\r
+double_from_timeval(struct timeval *tv)\r
+{\r
+    return tv->tv_sec + (double)(tv->tv_usec / 1000000.0);\r
+}\r
+\r
+static PyObject *\r
+itimer_retval(struct itimerval *iv)\r
+{\r
+    PyObject *r, *v;\r
+\r
+    r = PyTuple_New(2);\r
+    if (r == NULL)\r
+    return NULL;\r
+\r
+    if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_value)))) {\r
+    Py_DECREF(r);\r
+    return NULL;\r
+    }\r
+\r
+    PyTuple_SET_ITEM(r, 0, v);\r
+\r
+    if(!(v = PyFloat_FromDouble(double_from_timeval(&iv->it_interval)))) {\r
+    Py_DECREF(r);\r
+    return NULL;\r
+    }\r
+\r
+    PyTuple_SET_ITEM(r, 1, v);\r
+\r
+    return r;\r
+}\r
+#endif\r
+\r
+static PyObject *\r
+signal_default_int_handler(PyObject *self, PyObject *args)\r
+{\r
+    PyErr_SetNone(PyExc_KeyboardInterrupt);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(default_int_handler_doc,\r
+"default_int_handler(...)\n\\r
+\n\\r
+The default handler for SIGINT installed by Python.\n\\r
+It raises KeyboardInterrupt.");\r
+\r
+\r
+static int\r
+checksignals_witharg(void * unused)\r
+{\r
+    return PyErr_CheckSignals();\r
+}\r
+\r
+static void\r
+trip_signal(int sig_num)\r
+{\r
+    Handlers[sig_num].tripped = 1;\r
+    if (is_tripped)\r
+        return;\r
+    /* Set is_tripped after setting .tripped, as it gets\r
+       cleared in PyErr_CheckSignals() before .tripped. */\r
+    is_tripped = 1;\r
+    Py_AddPendingCall(checksignals_witharg, NULL);\r
+    if (wakeup_fd != -1)\r
+        write(wakeup_fd, "\0", 1);\r
+}\r
+\r
+static void\r
+signal_handler(int sig_num)\r
+{\r
+    int save_errno = errno;\r
+\r
+#if defined(WITH_THREAD) && defined(WITH_PTH)\r
+    if (PyThread_get_thread_ident() != main_thread) {\r
+        pth_raise(*(pth_t *) main_thread, sig_num);\r
+    }\r
+    else\r
+#endif\r
+    {\r
+#ifdef WITH_THREAD\r
+    /* See NOTES section above */\r
+    if (getpid() == main_pid)\r
+#endif\r
+    {\r
+        trip_signal(sig_num);\r
+    }\r
+\r
+#ifndef HAVE_SIGACTION\r
+#ifdef SIGCHLD\r
+    /* To avoid infinite recursion, this signal remains\r
+       reset until explicit re-instated.\r
+       Don't clear the 'func' field as it is our pointer\r
+       to the Python handler... */\r
+    if (sig_num != SIGCHLD)\r
+#endif\r
+    /* If the handler was not set up with sigaction, reinstall it.  See\r
+     * Python/pythonrun.c for the implementation of PyOS_setsig which\r
+     * makes this true.  See also issue8354. */\r
+    PyOS_setsig(sig_num, signal_handler);\r
+#endif\r
+    }\r
+\r
+    /* Issue #10311: asynchronously executing signal handlers should not\r
+       mutate errno under the feet of unsuspecting C code. */\r
+    errno = save_errno;\r
+}\r
+\r
+\r
+#ifdef HAVE_ALARM\r
+static PyObject *\r
+signal_alarm(PyObject *self, PyObject *args)\r
+{\r
+    int t;\r
+    if (!PyArg_ParseTuple(args, "i:alarm", &t))\r
+        return NULL;\r
+    /* alarm() returns the number of seconds remaining */\r
+    return PyInt_FromLong((long)alarm(t));\r
+}\r
+\r
+PyDoc_STRVAR(alarm_doc,\r
+"alarm(seconds)\n\\r
+\n\\r
+Arrange for SIGALRM to arrive after the given number of seconds.");\r
+#endif\r
+\r
+#ifdef HAVE_PAUSE\r
+static PyObject *\r
+signal_pause(PyObject *self)\r
+{\r
+    Py_BEGIN_ALLOW_THREADS\r
+    (void)pause();\r
+    Py_END_ALLOW_THREADS\r
+    /* make sure that any exceptions that got raised are propagated\r
+     * back into Python\r
+     */\r
+    if (PyErr_CheckSignals())\r
+        return NULL;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+PyDoc_STRVAR(pause_doc,\r
+"pause()\n\\r
+\n\\r
+Wait until a signal arrives.");\r
+\r
+#endif\r
+\r
+\r
+static PyObject *\r
+signal_signal(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *obj;\r
+    int sig_num;\r
+    PyObject *old_handler;\r
+    void (*func)(int);\r
+    if (!PyArg_ParseTuple(args, "iO:signal", &sig_num, &obj))\r
+        return NULL;\r
+#ifdef MS_WINDOWS\r
+    /* Validate that sig_num is one of the allowable signals */\r
+    switch (sig_num) {\r
+        case SIGABRT: break;\r
+#ifdef SIGBREAK\r
+        /* Issue #10003: SIGBREAK is not documented as permitted, but works\r
+           and corresponds to CTRL_BREAK_EVENT. */\r
+        case SIGBREAK: break;\r
+#endif\r
+        case SIGFPE: break;\r
+        case SIGILL: break;\r
+        case SIGINT: break;\r
+        case SIGSEGV: break;\r
+        case SIGTERM: break;\r
+        default:\r
+            PyErr_SetString(PyExc_ValueError, "invalid signal value");\r
+            return NULL;\r
+    }\r
+#endif\r
+#ifdef WITH_THREAD\r
+    if (PyThread_get_thread_ident() != main_thread) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "signal only works in main thread");\r
+        return NULL;\r
+    }\r
+#endif\r
+    if (sig_num < 1 || sig_num >= NSIG) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "signal number out of range");\r
+        return NULL;\r
+    }\r
+    if (obj == IgnoreHandler)\r
+        func = SIG_IGN;\r
+    else if (obj == DefaultHandler)\r
+        func = SIG_DFL;\r
+    else if (!PyCallable_Check(obj)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+"signal handler must be signal.SIG_IGN, signal.SIG_DFL, or a callable object");\r
+                return NULL;\r
+    }\r
+    else\r
+        func = signal_handler;\r
+    if (PyOS_setsig(sig_num, func) == SIG_ERR) {\r
+        PyErr_SetFromErrno(PyExc_RuntimeError);\r
+        return NULL;\r
+    }\r
+    old_handler = Handlers[sig_num].func;\r
+    Handlers[sig_num].tripped = 0;\r
+    Py_INCREF(obj);\r
+    Handlers[sig_num].func = obj;\r
+    if (old_handler != NULL)\r
+        return old_handler;\r
+    else\r
+        Py_RETURN_NONE;\r
+}\r
+\r
+PyDoc_STRVAR(signal_doc,\r
+"signal(sig, action) -> action\n\\r
+\n\\r
+Set the action for the given signal.  The action can be SIG_DFL,\n\\r
+SIG_IGN, or a callable Python object.  The previous action is\n\\r
+returned.  See getsignal() for possible return values.\n\\r
+\n\\r
+*** IMPORTANT NOTICE ***\n\\r
+A signal handler function is called with two arguments:\n\\r
+the first is the signal number, the second is the interrupted stack frame.");\r
+\r
+\r
+static PyObject *\r
+signal_getsignal(PyObject *self, PyObject *args)\r
+{\r
+    int sig_num;\r
+    PyObject *old_handler;\r
+    if (!PyArg_ParseTuple(args, "i:getsignal", &sig_num))\r
+        return NULL;\r
+    if (sig_num < 1 || sig_num >= NSIG) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "signal number out of range");\r
+        return NULL;\r
+    }\r
+    old_handler = Handlers[sig_num].func;\r
+    if (old_handler != NULL) {\r
+        Py_INCREF(old_handler);\r
+        return old_handler;\r
+    }\r
+    else {\r
+        Py_RETURN_NONE;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(getsignal_doc,\r
+"getsignal(sig) -> action\n\\r
+\n\\r
+Return the current action for the given signal.  The return value can be:\n\\r
+SIG_IGN -- if the signal is being ignored\n\\r
+SIG_DFL -- if the default action for the signal is in effect\n\\r
+None -- if an unknown handler is in effect\n\\r
+anything else -- the callable Python object used as a handler");\r
+\r
+#ifdef HAVE_SIGINTERRUPT\r
+PyDoc_STRVAR(siginterrupt_doc,\r
+"siginterrupt(sig, flag) -> None\n\\r
+change system call restart behaviour: if flag is False, system calls\n\\r
+will be restarted when interrupted by signal sig, else system calls\n\\r
+will be interrupted.");\r
+\r
+static PyObject *\r
+signal_siginterrupt(PyObject *self, PyObject *args)\r
+{\r
+    int sig_num;\r
+    int flag;\r
+\r
+    if (!PyArg_ParseTuple(args, "ii:siginterrupt", &sig_num, &flag))\r
+        return NULL;\r
+    if (sig_num < 1 || sig_num >= NSIG) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "signal number out of range");\r
+        return NULL;\r
+    }\r
+    if (siginterrupt(sig_num, flag)<0) {\r
+        PyErr_SetFromErrno(PyExc_RuntimeError);\r
+        return NULL;\r
+    }\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+#endif\r
+\r
+static PyObject *\r
+signal_set_wakeup_fd(PyObject *self, PyObject *args)\r
+{\r
+    struct stat buf;\r
+    int fd, old_fd;\r
+    if (!PyArg_ParseTuple(args, "i:set_wakeup_fd", &fd))\r
+        return NULL;\r
+#ifdef WITH_THREAD\r
+    if (PyThread_get_thread_ident() != main_thread) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "set_wakeup_fd only works in main thread");\r
+        return NULL;\r
+    }\r
+#endif\r
+    if (fd != -1 && (!_PyVerify_fd(fd) || fstat(fd, &buf) != 0)) {\r
+        PyErr_SetString(PyExc_ValueError, "invalid fd");\r
+        return NULL;\r
+    }\r
+    old_fd = wakeup_fd;\r
+    wakeup_fd = fd;\r
+    return PyLong_FromLong(old_fd);\r
+}\r
+\r
+PyDoc_STRVAR(set_wakeup_fd_doc,\r
+"set_wakeup_fd(fd) -> fd\n\\r
+\n\\r
+Sets the fd to be written to (with '\\0') when a signal\n\\r
+comes in.  A library can use this to wakeup select or poll.\n\\r
+The previous fd is returned.\n\\r
+\n\\r
+The fd must be non-blocking.");\r
+\r
+/* C API for the same, without all the error checking */\r
+int\r
+PySignal_SetWakeupFd(int fd)\r
+{\r
+    int old_fd = wakeup_fd;\r
+    if (fd < 0)\r
+        fd = -1;\r
+    wakeup_fd = fd;\r
+    return old_fd;\r
+}\r
+\r
+\r
+#ifdef HAVE_SETITIMER\r
+static PyObject *\r
+signal_setitimer(PyObject *self, PyObject *args)\r
+{\r
+    double first;\r
+    double interval = 0;\r
+    int which;\r
+    struct itimerval new, old;\r
+\r
+    if(!PyArg_ParseTuple(args, "id|d:setitimer", &which, &first, &interval))\r
+    return NULL;\r
+\r
+    timeval_from_double(first, &new.it_value);\r
+    timeval_from_double(interval, &new.it_interval);\r
+    /* Let OS check "which" value */\r
+    if (setitimer(which, &new, &old) != 0) {\r
+    PyErr_SetFromErrno(ItimerError);\r
+    return NULL;\r
+    }\r
+\r
+    return itimer_retval(&old);\r
+}\r
+\r
+PyDoc_STRVAR(setitimer_doc,\r
+"setitimer(which, seconds[, interval])\n\\r
+\n\\r
+Sets given itimer (one of ITIMER_REAL, ITIMER_VIRTUAL\n\\r
+or ITIMER_PROF) to fire after value seconds and after\n\\r
+that every interval seconds.\n\\r
+The itimer can be cleared by setting seconds to zero.\n\\r
+\n\\r
+Returns old values as a tuple: (delay, interval).");\r
+#endif\r
+\r
+\r
+#ifdef HAVE_GETITIMER\r
+static PyObject *\r
+signal_getitimer(PyObject *self, PyObject *args)\r
+{\r
+    int which;\r
+    struct itimerval old;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:getitimer", &which))\r
+    return NULL;\r
+\r
+    if (getitimer(which, &old) != 0) {\r
+    PyErr_SetFromErrno(ItimerError);\r
+    return NULL;\r
+    }\r
+\r
+    return itimer_retval(&old);\r
+}\r
+\r
+PyDoc_STRVAR(getitimer_doc,\r
+"getitimer(which)\n\\r
+\n\\r
+Returns current value of given itimer.");\r
+#endif\r
+\r
+\r
+/* List of functions defined in the module */\r
+static PyMethodDef signal_methods[] = {\r
+#ifdef HAVE_ALARM\r
+    {"alarm",                   signal_alarm, METH_VARARGS, alarm_doc},\r
+#endif\r
+#ifdef HAVE_SETITIMER\r
+    {"setitimer",       signal_setitimer, METH_VARARGS, setitimer_doc},\r
+#endif\r
+#ifdef HAVE_GETITIMER\r
+    {"getitimer",       signal_getitimer, METH_VARARGS, getitimer_doc},\r
+#endif\r
+    {"signal",                  signal_signal, METH_VARARGS, signal_doc},\r
+    {"getsignal",               signal_getsignal, METH_VARARGS, getsignal_doc},\r
+    {"set_wakeup_fd",           signal_set_wakeup_fd, METH_VARARGS, set_wakeup_fd_doc},\r
+#ifdef HAVE_SIGINTERRUPT\r
+    {"siginterrupt",            signal_siginterrupt, METH_VARARGS, siginterrupt_doc},\r
+#endif\r
+#ifdef HAVE_PAUSE\r
+    {"pause",                   (PyCFunction)signal_pause,\r
+     METH_NOARGS,pause_doc},\r
+#endif\r
+    {"default_int_handler", signal_default_int_handler,\r
+     METH_VARARGS, default_int_handler_doc},\r
+    {NULL,                      NULL}           /* sentinel */\r
+};\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module provides mechanisms to use signal handlers in Python.\n\\r
+\n\\r
+Functions:\n\\r
+\n\\r
+alarm() -- cause SIGALRM after a specified time [Unix only]\n\\r
+setitimer() -- cause a signal (described below) after a specified\n\\r
+               float time and the timer may restart then [Unix only]\n\\r
+getitimer() -- get current value of timer [Unix only]\n\\r
+signal() -- set the action for a given signal\n\\r
+getsignal() -- get the signal action for a given signal\n\\r
+pause() -- wait until a signal arrives [Unix only]\n\\r
+default_int_handler() -- default SIGINT handler\n\\r
+\n\\r
+signal constants:\n\\r
+SIG_DFL -- used to refer to the system default handler\n\\r
+SIG_IGN -- used to ignore the signal\n\\r
+NSIG -- number of defined signals\n\\r
+SIGINT, SIGTERM, etc. -- signal numbers\n\\r
+\n\\r
+itimer constants:\n\\r
+ITIMER_REAL -- decrements in real time, and delivers SIGALRM upon\n\\r
+               expiration\n\\r
+ITIMER_VIRTUAL -- decrements only when the process is executing,\n\\r
+               and delivers SIGVTALRM upon expiration\n\\r
+ITIMER_PROF -- decrements both when the process is executing and\n\\r
+               when the system is executing on behalf of the process.\n\\r
+               Coupled with ITIMER_VIRTUAL, this timer is usually\n\\r
+               used to profile the time spent by the application\n\\r
+               in user and kernel space. SIGPROF is delivered upon\n\\r
+               expiration.\n\\r
+\n\n\\r
+*** IMPORTANT NOTICE ***\n\\r
+A signal handler function is called with two arguments:\n\\r
+the first is the signal number, the second is the interrupted stack frame.");\r
+\r
+PyMODINIT_FUNC\r
+initsignal(void)\r
+{\r
+    PyObject *m, *d, *x;\r
+    int i;\r
+\r
+#ifdef WITH_THREAD\r
+    main_thread = PyThread_get_thread_ident();\r
+    main_pid = getpid();\r
+#endif\r
+\r
+    /* Create the module and add the functions */\r
+    m = Py_InitModule3("signal", signal_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Add some symbolic constants to the module */\r
+    d = PyModule_GetDict(m);\r
+\r
+    x = DefaultHandler = PyLong_FromVoidPtr((void *)SIG_DFL);\r
+    if (!x || PyDict_SetItemString(d, "SIG_DFL", x) < 0)\r
+        goto finally;\r
+\r
+    x = IgnoreHandler = PyLong_FromVoidPtr((void *)SIG_IGN);\r
+    if (!x || PyDict_SetItemString(d, "SIG_IGN", x) < 0)\r
+        goto finally;\r
+\r
+    x = PyInt_FromLong((long)NSIG);\r
+    if (!x || PyDict_SetItemString(d, "NSIG", x) < 0)\r
+        goto finally;\r
+    Py_DECREF(x);\r
+\r
+    x = IntHandler = PyDict_GetItemString(d, "default_int_handler");\r
+    if (!x)\r
+        goto finally;\r
+    Py_INCREF(IntHandler);\r
+\r
+    Handlers[0].tripped = 0;\r
+    for (i = 1; i < NSIG; i++) {\r
+        void (*t)(int);\r
+        t = PyOS_getsig(i);\r
+        Handlers[i].tripped = 0;\r
+        if (t == SIG_DFL)\r
+            Handlers[i].func = DefaultHandler;\r
+        else if (t == SIG_IGN)\r
+            Handlers[i].func = IgnoreHandler;\r
+        else\r
+            Handlers[i].func = Py_None; /* None of our business */\r
+        Py_INCREF(Handlers[i].func);\r
+    }\r
+    if (Handlers[SIGINT].func == DefaultHandler) {\r
+        /* Install default int handler */\r
+        Py_INCREF(IntHandler);\r
+        Py_DECREF(Handlers[SIGINT].func);\r
+        Handlers[SIGINT].func = IntHandler;\r
+        old_siginthandler = PyOS_setsig(SIGINT, signal_handler);\r
+    }\r
+\r
+#ifdef SIGHUP\r
+    x = PyInt_FromLong(SIGHUP);\r
+    PyDict_SetItemString(d, "SIGHUP", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGINT\r
+    x = PyInt_FromLong(SIGINT);\r
+    PyDict_SetItemString(d, "SIGINT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGBREAK\r
+    x = PyInt_FromLong(SIGBREAK);\r
+    PyDict_SetItemString(d, "SIGBREAK", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGQUIT\r
+    x = PyInt_FromLong(SIGQUIT);\r
+    PyDict_SetItemString(d, "SIGQUIT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGILL\r
+    x = PyInt_FromLong(SIGILL);\r
+    PyDict_SetItemString(d, "SIGILL", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGTRAP\r
+    x = PyInt_FromLong(SIGTRAP);\r
+    PyDict_SetItemString(d, "SIGTRAP", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGIOT\r
+    x = PyInt_FromLong(SIGIOT);\r
+    PyDict_SetItemString(d, "SIGIOT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGABRT\r
+    x = PyInt_FromLong(SIGABRT);\r
+    PyDict_SetItemString(d, "SIGABRT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGEMT\r
+    x = PyInt_FromLong(SIGEMT);\r
+    PyDict_SetItemString(d, "SIGEMT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGFPE\r
+    x = PyInt_FromLong(SIGFPE);\r
+    PyDict_SetItemString(d, "SIGFPE", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGKILL\r
+    x = PyInt_FromLong(SIGKILL);\r
+    PyDict_SetItemString(d, "SIGKILL", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGBUS\r
+    x = PyInt_FromLong(SIGBUS);\r
+    PyDict_SetItemString(d, "SIGBUS", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGSEGV\r
+    x = PyInt_FromLong(SIGSEGV);\r
+    PyDict_SetItemString(d, "SIGSEGV", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGSYS\r
+    x = PyInt_FromLong(SIGSYS);\r
+    PyDict_SetItemString(d, "SIGSYS", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGPIPE\r
+    x = PyInt_FromLong(SIGPIPE);\r
+    PyDict_SetItemString(d, "SIGPIPE", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGALRM\r
+    x = PyInt_FromLong(SIGALRM);\r
+    PyDict_SetItemString(d, "SIGALRM", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGTERM\r
+    x = PyInt_FromLong(SIGTERM);\r
+    PyDict_SetItemString(d, "SIGTERM", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGUSR1\r
+    x = PyInt_FromLong(SIGUSR1);\r
+    PyDict_SetItemString(d, "SIGUSR1", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGUSR2\r
+    x = PyInt_FromLong(SIGUSR2);\r
+    PyDict_SetItemString(d, "SIGUSR2", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGCLD\r
+    x = PyInt_FromLong(SIGCLD);\r
+    PyDict_SetItemString(d, "SIGCLD", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGCHLD\r
+    x = PyInt_FromLong(SIGCHLD);\r
+    PyDict_SetItemString(d, "SIGCHLD", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGPWR\r
+    x = PyInt_FromLong(SIGPWR);\r
+    PyDict_SetItemString(d, "SIGPWR", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGIO\r
+    x = PyInt_FromLong(SIGIO);\r
+    PyDict_SetItemString(d, "SIGIO", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGURG\r
+    x = PyInt_FromLong(SIGURG);\r
+    PyDict_SetItemString(d, "SIGURG", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGWINCH\r
+    x = PyInt_FromLong(SIGWINCH);\r
+    PyDict_SetItemString(d, "SIGWINCH", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGPOLL\r
+    x = PyInt_FromLong(SIGPOLL);\r
+    PyDict_SetItemString(d, "SIGPOLL", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGSTOP\r
+    x = PyInt_FromLong(SIGSTOP);\r
+    PyDict_SetItemString(d, "SIGSTOP", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGTSTP\r
+    x = PyInt_FromLong(SIGTSTP);\r
+    PyDict_SetItemString(d, "SIGTSTP", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGCONT\r
+    x = PyInt_FromLong(SIGCONT);\r
+    PyDict_SetItemString(d, "SIGCONT", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGTTIN\r
+    x = PyInt_FromLong(SIGTTIN);\r
+    PyDict_SetItemString(d, "SIGTTIN", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGTTOU\r
+    x = PyInt_FromLong(SIGTTOU);\r
+    PyDict_SetItemString(d, "SIGTTOU", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGVTALRM\r
+    x = PyInt_FromLong(SIGVTALRM);\r
+    PyDict_SetItemString(d, "SIGVTALRM", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGPROF\r
+    x = PyInt_FromLong(SIGPROF);\r
+    PyDict_SetItemString(d, "SIGPROF", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGXCPU\r
+    x = PyInt_FromLong(SIGXCPU);\r
+    PyDict_SetItemString(d, "SIGXCPU", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGXFSZ\r
+    x = PyInt_FromLong(SIGXFSZ);\r
+    PyDict_SetItemString(d, "SIGXFSZ", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGRTMIN\r
+    x = PyInt_FromLong(SIGRTMIN);\r
+    PyDict_SetItemString(d, "SIGRTMIN", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGRTMAX\r
+    x = PyInt_FromLong(SIGRTMAX);\r
+    PyDict_SetItemString(d, "SIGRTMAX", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+#ifdef SIGINFO\r
+    x = PyInt_FromLong(SIGINFO);\r
+    PyDict_SetItemString(d, "SIGINFO", x);\r
+    Py_XDECREF(x);\r
+#endif\r
+\r
+#ifdef ITIMER_REAL\r
+    x = PyLong_FromLong(ITIMER_REAL);\r
+    PyDict_SetItemString(d, "ITIMER_REAL", x);\r
+    Py_DECREF(x);\r
+#endif\r
+#ifdef ITIMER_VIRTUAL\r
+    x = PyLong_FromLong(ITIMER_VIRTUAL);\r
+    PyDict_SetItemString(d, "ITIMER_VIRTUAL", x);\r
+    Py_DECREF(x);\r
+#endif\r
+#ifdef ITIMER_PROF\r
+    x = PyLong_FromLong(ITIMER_PROF);\r
+    PyDict_SetItemString(d, "ITIMER_PROF", x);\r
+    Py_DECREF(x);\r
+#endif\r
+\r
+#if defined (HAVE_SETITIMER) || defined (HAVE_GETITIMER)\r
+    ItimerError = PyErr_NewException("signal.ItimerError",\r
+     PyExc_IOError, NULL);\r
+    if (ItimerError != NULL)\r
+    PyDict_SetItemString(d, "ItimerError", ItimerError);\r
+#endif\r
+\r
+#ifdef CTRL_C_EVENT\r
+    x = PyInt_FromLong(CTRL_C_EVENT);\r
+    PyDict_SetItemString(d, "CTRL_C_EVENT", x);\r
+    Py_DECREF(x);\r
+#endif\r
+\r
+#ifdef CTRL_BREAK_EVENT\r
+    x = PyInt_FromLong(CTRL_BREAK_EVENT);\r
+    PyDict_SetItemString(d, "CTRL_BREAK_EVENT", x);\r
+    Py_DECREF(x);\r
+#endif\r
+\r
+    if (!PyErr_Occurred())\r
+        return;\r
+\r
+    /* Check for errors */\r
+  finally:\r
+    return;\r
+}\r
+\r
+static void\r
+finisignal(void)\r
+{\r
+    int i;\r
+    PyObject *func;\r
+\r
+    PyOS_setsig(SIGINT, old_siginthandler);\r
+    old_siginthandler = SIG_DFL;\r
+\r
+    for (i = 1; i < NSIG; i++) {\r
+        func = Handlers[i].func;\r
+        Handlers[i].tripped = 0;\r
+        Handlers[i].func = NULL;\r
+        if (i != SIGINT && func != NULL && func != Py_None &&\r
+            func != DefaultHandler && func != IgnoreHandler)\r
+            PyOS_setsig(i, SIG_DFL);\r
+        Py_XDECREF(func);\r
+    }\r
+\r
+    Py_XDECREF(IntHandler);\r
+    IntHandler = NULL;\r
+    Py_XDECREF(DefaultHandler);\r
+    DefaultHandler = NULL;\r
+    Py_XDECREF(IgnoreHandler);\r
+    IgnoreHandler = NULL;\r
+}\r
+\r
+\r
+/* Declared in pyerrors.h */\r
+int\r
+PyErr_CheckSignals(void)\r
+{\r
+    int i;\r
+    PyObject *f;\r
+\r
+    if (!is_tripped)\r
+        return 0;\r
+\r
+#ifdef WITH_THREAD\r
+    if (PyThread_get_thread_ident() != main_thread)\r
+        return 0;\r
+#endif\r
+\r
+    /*\r
+     * The is_tripped variable is meant to speed up the calls to\r
+     * PyErr_CheckSignals (both directly or via pending calls) when no\r
+     * signal has arrived. This variable is set to 1 when a signal arrives\r
+     * and it is set to 0 here, when we know some signals arrived. This way\r
+     * we can run the registered handlers with no signals blocked.\r
+     *\r
+     * NOTE: with this approach we can have a situation where is_tripped is\r
+     *       1 but we have no more signals to handle (Handlers[i].tripped\r
+     *       is 0 for every signal i). This won't do us any harm (except\r
+     *       we're gonna spent some cycles for nothing). This happens when\r
+     *       we receive a signal i after we zero is_tripped and before we\r
+     *       check Handlers[i].tripped.\r
+     */\r
+    is_tripped = 0;\r
+\r
+    if (!(f = (PyObject *)PyEval_GetFrame()))\r
+        f = Py_None;\r
+\r
+    for (i = 1; i < NSIG; i++) {\r
+        if (Handlers[i].tripped) {\r
+            PyObject *result = NULL;\r
+            PyObject *arglist = Py_BuildValue("(iO)", i, f);\r
+            Handlers[i].tripped = 0;\r
+\r
+            if (arglist) {\r
+                result = PyEval_CallObject(Handlers[i].func,\r
+                                           arglist);\r
+                Py_DECREF(arglist);\r
+            }\r
+            if (!result)\r
+                return -1;\r
+\r
+            Py_DECREF(result);\r
+        }\r
+    }\r
+\r
+    return 0;\r
+}\r
+\r
+\r
+/* Replacements for intrcheck.c functionality\r
+ * Declared in pyerrors.h\r
+ */\r
+void\r
+PyErr_SetInterrupt(void)\r
+{\r
+    trip_signal(SIGINT);\r
+}\r
+\r
+void\r
+PyOS_InitInterrupts(void)\r
+{\r
+    initsignal();\r
+    _PyImport_FixupExtension("signal", "signal");\r
+}\r
+\r
+void\r
+PyOS_FiniInterrupts(void)\r
+{\r
+    finisignal();\r
+}\r
+\r
+int\r
+PyOS_InterruptOccurred(void)\r
+{\r
+    if (Handlers[SIGINT].tripped) {\r
+#ifdef WITH_THREAD\r
+        if (PyThread_get_thread_ident() != main_thread)\r
+            return 0;\r
+#endif\r
+        Handlers[SIGINT].tripped = 0;\r
+        return 1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+static void\r
+_clear_pending_signals(void)\r
+{\r
+    int i;\r
+    if (!is_tripped)\r
+        return;\r
+    is_tripped = 0;\r
+    for (i = 1; i < NSIG; ++i) {\r
+        Handlers[i].tripped = 0;\r
+    }\r
+}\r
+\r
+void\r
+PyOS_AfterFork(void)\r
+{\r
+    /* Clear the signal flags after forking so that they aren't handled\r
+     * in both processes if they came in just before the fork() but before\r
+     * the interpreter had an opportunity to call the handlers.  issue9535. */\r
+    _clear_pending_signals();\r
+#ifdef WITH_THREAD\r
+    /* PyThread_ReInitTLS() must be called early, to make sure that the TLS API\r
+     * can be called safely. */\r
+    PyThread_ReInitTLS();\r
+    PyEval_ReInitThreads();\r
+    main_thread = PyThread_get_thread_ident();\r
+    main_pid = getpid();\r
+    _PyImport_ReInitLock();\r
+#endif\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.c
new file mode 100644 (file)
index 0000000..834025c
--- /dev/null
@@ -0,0 +1,5556 @@
+/* Socket module */\r
+\r
+/*\r
+\r
+This module provides an interface to Berkeley socket IPC.\r
+\r
+Limitations:\r
+\r
+- Only AF_INET, AF_INET6 and AF_UNIX address families are supported in a\r
+  portable manner, though AF_PACKET, AF_NETLINK and AF_TIPC are supported\r
+  under Linux.\r
+- No read/write operations (use sendall/recv or makefile instead).\r
+- Additional restrictions apply on some non-Unix platforms (compensated\r
+  for by socket.py).\r
+\r
+Module interface:\r
+\r
+- socket.error: exception raised for socket specific errors\r
+- socket.gaierror: exception raised for getaddrinfo/getnameinfo errors,\r
+    a subclass of socket.error\r
+- socket.herror: exception raised for gethostby* errors,\r
+    a subclass of socket.error\r
+- socket.fromfd(fd, family, type[, proto]) --> new socket object (created\r
+    from an existing file descriptor)\r
+- socket.gethostbyname(hostname) --> host IP address (string: 'dd.dd.dd.dd')\r
+- socket.gethostbyaddr(IP address) --> (hostname, [alias, ...], [IP addr, ...])\r
+- socket.gethostname() --> host name (string: 'spam' or 'spam.domain.com')\r
+- socket.getprotobyname(protocolname) --> protocol number\r
+- socket.getservbyname(servicename[, protocolname]) --> port number\r
+- socket.getservbyport(portnumber[, protocolname]) --> service name\r
+- socket.socket([family[, type [, proto]]]) --> new socket object\r
+- socket.socketpair([family[, type [, proto]]]) --> (socket, socket)\r
+- socket.ntohs(16 bit value) --> new int object\r
+- socket.ntohl(32 bit value) --> new int object\r
+- socket.htons(16 bit value) --> new int object\r
+- socket.htonl(32 bit value) --> new int object\r
+- socket.getaddrinfo(host, port [, family, socktype, proto, flags])\r
+    --> List of (family, socktype, proto, canonname, sockaddr)\r
+- socket.getnameinfo(sockaddr, flags) --> (host, port)\r
+- socket.AF_INET, socket.SOCK_STREAM, etc.: constants from <socket.h>\r
+- socket.has_ipv6: boolean value indicating if IPv6 is supported\r
+- socket.inet_aton(IP address) -> 32-bit packed IP representation\r
+- socket.inet_ntoa(packed IP) -> IP address string\r
+- socket.getdefaulttimeout() -> None | float\r
+- socket.setdefaulttimeout(None | float)\r
+- an Internet socket address is a pair (hostname, port)\r
+  where hostname can be anything recognized by gethostbyname()\r
+  (including the dd.dd.dd.dd notation) and port is in host byte order\r
+- where a hostname is returned, the dd.dd.dd.dd notation is used\r
+- a UNIX domain socket address is a string specifying the pathname\r
+- an AF_PACKET socket address is a tuple containing a string\r
+  specifying the ethernet interface and an integer specifying\r
+  the Ethernet protocol number to be received. For example:\r
+  ("eth0",0x1234).  Optional 3rd,4th,5th elements in the tuple\r
+  specify packet-type and ha-type/addr.\r
+- an AF_TIPC socket address is expressed as\r
+ (addr_type, v1, v2, v3 [, scope]); where addr_type can be one of:\r
+    TIPC_ADDR_NAMESEQ, TIPC_ADDR_NAME, and TIPC_ADDR_ID;\r
+  and scope can be one of:\r
+    TIPC_ZONE_SCOPE, TIPC_CLUSTER_SCOPE, and TIPC_NODE_SCOPE.\r
+  The meaning of v1, v2 and v3 depends on the value of addr_type:\r
+    if addr_type is TIPC_ADDR_NAME:\r
+        v1 is the server type\r
+        v2 is the port identifier\r
+        v3 is ignored\r
+    if addr_type is TIPC_ADDR_NAMESEQ:\r
+        v1 is the server type\r
+        v2 is the lower port number\r
+        v3 is the upper port number\r
+    if addr_type is TIPC_ADDR_ID:\r
+        v1 is the node\r
+        v2 is the ref\r
+        v3 is ignored\r
+\r
+\r
+Local naming conventions:\r
+\r
+- names starting with sock_ are socket object methods\r
+- names starting with socket_ are module-level functions\r
+- names starting with PySocket are exported through socketmodule.h\r
+\r
+*/\r
+\r
+#ifdef __APPLE__\r
+  /*\r
+   * inet_aton is not available on OSX 10.3, yet we want to use a binary\r
+   * that was build on 10.4 or later to work on that release, weak linking\r
+   * comes to the rescue.\r
+   */\r
+# pragma weak inet_aton\r
+#endif\r
+\r
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "timefuncs.h"\r
+\r
+#ifndef INVALID_SOCKET /* MS defines this */\r
+#define INVALID_SOCKET (-1)\r
+#endif\r
+\r
+#undef MAX\r
+#define MAX(x, y) ((x) < (y) ? (y) : (x))\r
+\r
+/* Socket object documentation */\r
+PyDoc_STRVAR(sock_doc,\r
+"socket([family[, type[, proto]]]) -> socket object\n\\r
+\n\\r
+Open a socket of the given type.  The family argument specifies the\n\\r
+address family; it defaults to AF_INET.  The type argument specifies\n\\r
+whether this is a stream (SOCK_STREAM, this is the default)\n\\r
+or datagram (SOCK_DGRAM) socket.  The protocol argument defaults to 0,\n\\r
+specifying the default protocol.  Keyword arguments are accepted.\n\\r
+\n\\r
+A socket object represents one endpoint of a network connection.\n\\r
+\n\\r
+Methods of socket objects (keyword arguments not allowed):\n\\r
+\n\\r
+accept() -- accept a connection, returning new socket and client address\n\\r
+bind(addr) -- bind the socket to a local address\n\\r
+close() -- close the socket\n\\r
+connect(addr) -- connect the socket to a remote address\n\\r
+connect_ex(addr) -- connect, return an error code instead of an exception\n\\r
+dup() -- return a new socket object identical to the current one [*]\n\\r
+fileno() -- return underlying file descriptor\n\\r
+getpeername() -- return remote address [*]\n\\r
+getsockname() -- return local address\n\\r
+getsockopt(level, optname[, buflen]) -- get socket options\n\\r
+gettimeout() -- return timeout or None\n\\r
+listen(n) -- start listening for incoming connections\n\\r
+makefile([mode, [bufsize]]) -- return a file object for the socket [*]\n\\r
+recv(buflen[, flags]) -- receive data\n\\r
+recv_into(buffer[, nbytes[, flags]]) -- receive data (into a buffer)\n\\r
+recvfrom(buflen[, flags]) -- receive data and sender\'s address\n\\r
+recvfrom_into(buffer[, nbytes, [, flags])\n\\r
+  -- receive data and sender\'s address (into a buffer)\n\\r
+sendall(data[, flags]) -- send all data\n\\r
+send(data[, flags]) -- send data, may not send all of it\n\\r
+sendto(data[, flags], addr) -- send data to a given address\n\\r
+setblocking(0 | 1) -- set or clear the blocking I/O flag\n\\r
+setsockopt(level, optname, value) -- set socket options\n\\r
+settimeout(None | float) -- set or clear the timeout\n\\r
+shutdown(how) -- shut down traffic in one or both directions\n\\r
+\n\\r
+ [*] not available on all platforms!");\r
+\r
+/* XXX This is a terrible mess of platform-dependent preprocessor hacks.\r
+   I hope some day someone can clean this up please... */\r
+\r
+/* Hacks for gethostbyname_r().  On some non-Linux platforms, the configure\r
+   script doesn't get this right, so we hardcode some platform checks below.\r
+   On the other hand, not all Linux versions agree, so there the settings\r
+   computed by the configure script are needed! */\r
+\r
+#ifndef linux\r
+# undef HAVE_GETHOSTBYNAME_R_3_ARG\r
+# undef HAVE_GETHOSTBYNAME_R_5_ARG\r
+# undef HAVE_GETHOSTBYNAME_R_6_ARG\r
+#endif\r
+\r
+#ifndef WITH_THREAD\r
+# undef HAVE_GETHOSTBYNAME_R\r
+#endif\r
+\r
+#ifdef HAVE_GETHOSTBYNAME_R\r
+# if defined(_AIX) || defined(__osf__)\r
+#  define HAVE_GETHOSTBYNAME_R_3_ARG\r
+# elif defined(__sun) || defined(__sgi)\r
+#  define HAVE_GETHOSTBYNAME_R_5_ARG\r
+# elif defined(linux)\r
+/* Rely on the configure script */\r
+# else\r
+#  undef HAVE_GETHOSTBYNAME_R\r
+# endif\r
+#endif\r
+\r
+#if !defined(HAVE_GETHOSTBYNAME_R) && defined(WITH_THREAD) && \\r
+    !defined(MS_WINDOWS)\r
+# define USE_GETHOSTBYNAME_LOCK\r
+#endif\r
+\r
+/* To use __FreeBSD_version */\r
+#ifdef HAVE_SYS_PARAM_H\r
+#include <sys/param.h>\r
+#endif\r
+/* On systems on which getaddrinfo() is believed to not be thread-safe,\r
+   (this includes the getaddrinfo emulation) protect access with a lock. */\r
+#if defined(WITH_THREAD) && (defined(__APPLE__) || \\r
+    (defined(__FreeBSD__) && __FreeBSD_version+0 < 503000) || \\r
+    defined(__OpenBSD__) || defined(__NetBSD__) || \\r
+    defined(__VMS) || !defined(HAVE_GETADDRINFO))\r
+#define USE_GETADDRINFO_LOCK\r
+#endif\r
+\r
+#ifdef USE_GETADDRINFO_LOCK\r
+#define ACQUIRE_GETADDRINFO_LOCK PyThread_acquire_lock(netdb_lock, 1);\r
+#define RELEASE_GETADDRINFO_LOCK PyThread_release_lock(netdb_lock);\r
+#else\r
+#define ACQUIRE_GETADDRINFO_LOCK\r
+#define RELEASE_GETADDRINFO_LOCK\r
+#endif\r
+\r
+#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
+# include "pythread.h"\r
+#endif\r
+\r
+#if defined(PYCC_VACPP)\r
+# include <types.h>\r
+# include <io.h>\r
+# include <sys/ioctl.h>\r
+# include <utils.h>\r
+# include <ctype.h>\r
+#endif\r
+\r
+#if defined(__VMS)\r
+#  include <ioctl.h>\r
+#endif\r
+\r
+#if defined(PYOS_OS2)\r
+# define  INCL_DOS\r
+# define  INCL_DOSERRORS\r
+# define  INCL_NOPMAPI\r
+# include <os2.h>\r
+#endif\r
+\r
+#if defined(__sgi) && _COMPILER_VERSION>700 && !_SGIAPI\r
+/* make sure that the reentrant (gethostbyaddr_r etc)\r
+   functions are declared correctly if compiling with\r
+   MIPSPro 7.x in ANSI C mode (default) */\r
+\r
+/* XXX Using _SGIAPI is the wrong thing,\r
+   but I don't know what the right thing is. */\r
+#undef _SGIAPI /* to avoid warning */\r
+#define _SGIAPI 1\r
+\r
+#undef _XOPEN_SOURCE\r
+#include <sys/socket.h>\r
+#include <sys/types.h>\r
+#include <netinet/in.h>\r
+#ifdef _SS_ALIGNSIZE\r
+#define HAVE_GETADDRINFO 1\r
+#define HAVE_GETNAMEINFO 1\r
+#endif\r
+\r
+#define HAVE_INET_PTON\r
+#include <netdb.h>\r
+#endif\r
+\r
+/* Irix 6.5 fails to define this variable at all. This is needed\r
+   for both GCC and SGI's compiler. I'd say that the SGI headers\r
+   are just busted. Same thing for Solaris. */\r
+#if (defined(__sgi) || defined(sun)) && !defined(INET_ADDRSTRLEN)\r
+#define INET_ADDRSTRLEN 16\r
+#endif\r
+\r
+/* Generic includes */\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif\r
+\r
+/* Generic socket object definitions and includes */\r
+#define PySocket_BUILDING_SOCKET\r
+#include "socketmodule.h"\r
+\r
+/* Addressing includes */\r
+\r
+#ifndef MS_WINDOWS\r
+\r
+/* Non-MS WINDOWS includes */\r
+# include <netdb.h>\r
+\r
+/* Headers needed for inet_ntoa() and inet_addr() */\r
+# ifdef __BEOS__\r
+#  include <net/netdb.h>\r
+# elif defined(PYOS_OS2) && defined(PYCC_VACPP)\r
+#  include <netdb.h>\r
+typedef size_t socklen_t;\r
+# else\r
+#   include <arpa/inet.h>\r
+# endif\r
+\r
+# ifndef RISCOS\r
+#  include <fcntl.h>\r
+# else\r
+#  include <sys/ioctl.h>\r
+#  include <socklib.h>\r
+#  define NO_DUP\r
+int h_errno; /* not used */\r
+#  define INET_ADDRSTRLEN 16\r
+# endif\r
+\r
+#else\r
+\r
+/* MS_WINDOWS includes */\r
+# ifdef HAVE_FCNTL_H\r
+#  include <fcntl.h>\r
+# endif\r
+\r
+#endif\r
+\r
+#include <stddef.h>\r
+\r
+#ifndef offsetof\r
+# define offsetof(type, member) ((size_t)(&((type *)0)->member))\r
+#endif\r
+\r
+#ifndef O_NONBLOCK\r
+# define O_NONBLOCK O_NDELAY\r
+#endif\r
+\r
+/* include Python's addrinfo.h unless it causes trouble */\r
+#if defined(__sgi) && _COMPILER_VERSION>700 && defined(_SS_ALIGNSIZE)\r
+  /* Do not include addinfo.h on some newer IRIX versions.\r
+   * _SS_ALIGNSIZE is defined in sys/socket.h by 6.5.21,\r
+   * for example, but not by 6.5.10.\r
+   */\r
+#elif defined(_MSC_VER) && _MSC_VER>1201\r
+  /* Do not include addrinfo.h for MSVC7 or greater. 'addrinfo' and\r
+   * EAI_* constants are defined in (the already included) ws2tcpip.h.\r
+   */\r
+#else\r
+#  include "addrinfo.h"\r
+#endif\r
+\r
+#ifndef HAVE_INET_PTON\r
+#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)\r
+int inet_pton(int af, const char *src, void *dst);\r
+const char *inet_ntop(int af, const void *src, char *dst, socklen_t size);\r
+#endif\r
+#endif\r
+\r
+#ifdef __APPLE__\r
+/* On OS X, getaddrinfo returns no error indication of lookup\r
+   failure, so we must use the emulation instead of the libinfo\r
+   implementation. Unfortunately, performing an autoconf test\r
+   for this bug would require DNS access for the machine performing\r
+   the configuration, which is not acceptable. Therefore, we\r
+   determine the bug just by checking for __APPLE__. If this bug\r
+   gets ever fixed, perhaps checking for sys/version.h would be\r
+   appropriate, which is 10/0 on the system with the bug. */\r
+#ifndef HAVE_GETNAMEINFO\r
+/* This bug seems to be fixed in Jaguar. Ths easiest way I could\r
+   Find to check for Jaguar is that it has getnameinfo(), which\r
+   older releases don't have */\r
+#undef HAVE_GETADDRINFO\r
+#endif\r
+\r
+#ifdef HAVE_INET_ATON\r
+#define USE_INET_ATON_WEAKLINK\r
+#endif\r
+\r
+#endif\r
+\r
+/* I know this is a bad practice, but it is the easiest... */\r
+#if !defined(HAVE_GETADDRINFO)\r
+/* avoid clashes with the C library definition of the symbol. */\r
+#define getaddrinfo fake_getaddrinfo\r
+#define gai_strerror fake_gai_strerror\r
+#define freeaddrinfo fake_freeaddrinfo\r
+#include "getaddrinfo.c"\r
+#endif\r
+#if !defined(HAVE_GETNAMEINFO)\r
+#define getnameinfo fake_getnameinfo\r
+#include "getnameinfo.c"\r
+#endif\r
+\r
+#if defined(MS_WINDOWS) || defined(__BEOS__)\r
+/* BeOS suffers from the same socket dichotomy as Win32... - [cjh] */\r
+/* seem to be a few differences in the API */\r
+#define SOCKETCLOSE closesocket\r
+#define NO_DUP /* Actually it exists on NT 3.5, but what the heck... */\r
+#endif\r
+\r
+#ifdef MS_WIN32\r
+#define EAFNOSUPPORT WSAEAFNOSUPPORT\r
+#define snprintf _snprintf\r
+#endif\r
+\r
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
+#define SOCKETCLOSE soclose\r
+#define NO_DUP /* Sockets are Not Actual File Handles under OS/2 */\r
+#endif\r
+\r
+#ifndef SOCKETCLOSE\r
+#define SOCKETCLOSE close\r
+#endif\r
+\r
+#if (defined(HAVE_BLUETOOTH_H) || defined(HAVE_BLUETOOTH_BLUETOOTH_H)) && !defined(__NetBSD__) && !defined(__DragonFly__)\r
+#define USE_BLUETOOTH 1\r
+#if defined(__FreeBSD__)\r
+#define BTPROTO_L2CAP BLUETOOTH_PROTO_L2CAP\r
+#define BTPROTO_RFCOMM BLUETOOTH_PROTO_RFCOMM\r
+#define BTPROTO_HCI BLUETOOTH_PROTO_HCI\r
+#define SOL_HCI SOL_HCI_RAW\r
+#define HCI_FILTER SO_HCI_RAW_FILTER\r
+#define sockaddr_l2 sockaddr_l2cap\r
+#define sockaddr_rc sockaddr_rfcomm\r
+#define hci_dev hci_node\r
+#define _BT_L2_MEMB(sa, memb) ((sa)->l2cap_##memb)\r
+#define _BT_RC_MEMB(sa, memb) ((sa)->rfcomm_##memb)\r
+#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)\r
+#elif defined(__NetBSD__) || defined(__DragonFly__)\r
+#define sockaddr_l2 sockaddr_bt\r
+#define sockaddr_rc sockaddr_bt\r
+#define sockaddr_hci sockaddr_bt\r
+#define sockaddr_sco sockaddr_bt\r
+#define SOL_HCI BTPROTO_HCI\r
+#define HCI_DATA_DIR SO_HCI_DIRECTION\r
+#define _BT_L2_MEMB(sa, memb) ((sa)->bt_##memb)\r
+#define _BT_RC_MEMB(sa, memb) ((sa)->bt_##memb)\r
+#define _BT_HCI_MEMB(sa, memb) ((sa)->bt_##memb)\r
+#define _BT_SCO_MEMB(sa, memb) ((sa)->bt_##memb)\r
+#else\r
+#define _BT_L2_MEMB(sa, memb) ((sa)->l2_##memb)\r
+#define _BT_RC_MEMB(sa, memb) ((sa)->rc_##memb)\r
+#define _BT_HCI_MEMB(sa, memb) ((sa)->hci_##memb)\r
+#define _BT_SCO_MEMB(sa, memb) ((sa)->sco_##memb)\r
+#endif\r
+#endif\r
+\r
+#ifdef __VMS\r
+/* TCP/IP Services for VMS uses a maximum send/recv buffer length */\r
+#define SEGMENT_SIZE (32 * 1024 -1)\r
+#endif\r
+\r
+#define SAS2SA(x)       ((struct sockaddr *)(x))\r
+\r
+/*\r
+ * Constants for getnameinfo()\r
+ */\r
+#if !defined(NI_MAXHOST)\r
+#define NI_MAXHOST 1025\r
+#endif\r
+#if !defined(NI_MAXSERV)\r
+#define NI_MAXSERV 32\r
+#endif\r
+\r
+/* XXX There's a problem here: *static* functions are not supposed to have\r
+   a Py prefix (or use CapitalizedWords).  Later... */\r
+\r
+/* Global variable holding the exception type for errors detected\r
+   by this module (but not argument type or memory errors, etc.). */\r
+static PyObject *socket_error;\r
+static PyObject *socket_herror;\r
+static PyObject *socket_gaierror;\r
+static PyObject *socket_timeout;\r
+\r
+#ifdef RISCOS\r
+/* Global variable which is !=0 if Python is running in a RISC OS taskwindow */\r
+static int taskwindow;\r
+#endif\r
+\r
+/* A forward reference to the socket type object.\r
+   The sock_type variable contains pointers to various functions,\r
+   some of which call new_sockobject(), which uses sock_type, so\r
+   there has to be a circular reference. */\r
+static PyTypeObject sock_type;\r
+\r
+#if defined(HAVE_POLL_H)\r
+#include <poll.h>\r
+#elif defined(HAVE_SYS_POLL_H)\r
+#include <sys/poll.h>\r
+#endif\r
+\r
+#ifdef HAVE_POLL\r
+/* Instead of select(), we'll use poll() since poll() works on any fd. */\r
+#define IS_SELECTABLE(s) 1\r
+/* Can we call select() with this socket without a buffer overrun? */\r
+#else\r
+/* If there's no timeout left, we don't have to call select, so it's a safe,\r
+ * little white lie. */\r
+#define IS_SELECTABLE(s) (_PyIsSelectable_fd((s)->sock_fd) || (s)->sock_timeout <= 0.0)\r
+#endif\r
+\r
+static PyObject*\r
+select_error(void)\r
+{\r
+    PyErr_SetString(socket_error, "unable to select on socket");\r
+    return NULL;\r
+}\r
+\r
+#ifdef MS_WINDOWS\r
+#ifndef WSAEAGAIN\r
+#define WSAEAGAIN WSAEWOULDBLOCK\r
+#endif\r
+#define CHECK_ERRNO(expected) \\r
+    (WSAGetLastError() == WSA ## expected)\r
+#else\r
+#define CHECK_ERRNO(expected) \\r
+    (errno == expected)\r
+#endif\r
+\r
+/* Convenience function to raise an error according to errno\r
+   and return a NULL pointer from a function. */\r
+\r
+static PyObject *\r
+set_error(void)\r
+{\r
+#ifdef MS_WINDOWS\r
+    int err_no = WSAGetLastError();\r
+    /* PyErr_SetExcFromWindowsErr() invokes FormatMessage() which\r
+       recognizes the error codes used by both GetLastError() and\r
+       WSAGetLastError */\r
+    if (err_no)\r
+        return PyErr_SetExcFromWindowsErr(socket_error, err_no);\r
+#endif\r
+\r
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
+    if (sock_errno() != NO_ERROR) {\r
+        APIRET rc;\r
+        ULONG  msglen;\r
+        char outbuf[100];\r
+        int myerrorcode = sock_errno();\r
+\r
+        /* Retrieve socket-related error message from MPTN.MSG file */\r
+        rc = DosGetMessage(NULL, 0, outbuf, sizeof(outbuf),\r
+                           myerrorcode - SOCBASEERR + 26,\r
+                           "mptn.msg",\r
+                           &msglen);\r
+        if (rc == NO_ERROR) {\r
+            PyObject *v;\r
+\r
+            /* OS/2 doesn't guarantee a terminator */\r
+            outbuf[msglen] = '\0';\r
+            if (strlen(outbuf) > 0) {\r
+                /* If non-empty msg, trim CRLF */\r
+                char *lastc = &outbuf[ strlen(outbuf)-1 ];\r
+                while (lastc > outbuf &&\r
+                       isspace(Py_CHARMASK(*lastc))) {\r
+                    /* Trim trailing whitespace (CRLF) */\r
+                    *lastc-- = '\0';\r
+                }\r
+            }\r
+            v = Py_BuildValue("(is)", myerrorcode, outbuf);\r
+            if (v != NULL) {\r
+                PyErr_SetObject(socket_error, v);\r
+                Py_DECREF(v);\r
+            }\r
+            return NULL;\r
+        }\r
+    }\r
+#endif\r
+\r
+#if defined(RISCOS)\r
+    if (_inet_error.errnum != NULL) {\r
+        PyObject *v;\r
+        v = Py_BuildValue("(is)", errno, _inet_err());\r
+        if (v != NULL) {\r
+            PyErr_SetObject(socket_error, v);\r
+            Py_DECREF(v);\r
+        }\r
+        return NULL;\r
+    }\r
+#endif\r
+\r
+    return PyErr_SetFromErrno(socket_error);\r
+}\r
+\r
+\r
+static PyObject *\r
+set_herror(int h_error)\r
+{\r
+    PyObject *v;\r
+\r
+#ifdef HAVE_HSTRERROR\r
+    v = Py_BuildValue("(is)", h_error, (char *)hstrerror(h_error));\r
+#else\r
+    v = Py_BuildValue("(is)", h_error, "host not found");\r
+#endif\r
+    if (v != NULL) {\r
+        PyErr_SetObject(socket_herror, v);\r
+        Py_DECREF(v);\r
+    }\r
+\r
+    return NULL;\r
+}\r
+\r
+\r
+static PyObject *\r
+set_gaierror(int error)\r
+{\r
+    PyObject *v;\r
+\r
+#ifdef EAI_SYSTEM\r
+    /* EAI_SYSTEM is not available on Windows XP. */\r
+    if (error == EAI_SYSTEM)\r
+        return set_error();\r
+#endif\r
+\r
+#ifdef HAVE_GAI_STRERROR\r
+    v = Py_BuildValue("(is)", error, gai_strerror(error));\r
+#else\r
+    v = Py_BuildValue("(is)", error, "getaddrinfo failed");\r
+#endif\r
+    if (v != NULL) {\r
+        PyErr_SetObject(socket_gaierror, v);\r
+        Py_DECREF(v);\r
+    }\r
+\r
+    return NULL;\r
+}\r
+\r
+#ifdef __VMS\r
+/* Function to send in segments */\r
+static int\r
+sendsegmented(int sock_fd, char *buf, int len, int flags)\r
+{\r
+    int n = 0;\r
+    int remaining = len;\r
+\r
+    while (remaining > 0) {\r
+        unsigned int segment;\r
+\r
+        segment = (remaining >= SEGMENT_SIZE ? SEGMENT_SIZE : remaining);\r
+        n = send(sock_fd, buf, segment, flags);\r
+        if (n < 0) {\r
+            return n;\r
+        }\r
+        remaining -= segment;\r
+        buf += segment;\r
+    } /* end while */\r
+\r
+    return len;\r
+}\r
+#endif\r
+\r
+/* Function to perform the setting of socket blocking mode\r
+   internally. block = (1 | 0). */\r
+static int\r
+internal_setblocking(PySocketSockObject *s, int block)\r
+{\r
+#ifndef RISCOS\r
+#ifndef MS_WINDOWS\r
+    int delay_flag;\r
+#endif\r
+#endif\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+#ifdef __BEOS__\r
+    block = !block;\r
+    setsockopt(s->sock_fd, SOL_SOCKET, SO_NONBLOCK,\r
+               (void *)(&block), sizeof(int));\r
+#else\r
+#ifndef RISCOS\r
+#ifndef MS_WINDOWS\r
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
+    block = !block;\r
+    ioctl(s->sock_fd, FIONBIO, (caddr_t)&block, sizeof(block));\r
+#elif defined(__VMS)\r
+    block = !block;\r
+    ioctl(s->sock_fd, FIONBIO, (unsigned int *)&block);\r
+#else  /* !PYOS_OS2 && !__VMS */\r
+    delay_flag = fcntl(s->sock_fd, F_GETFL, 0);\r
+    if (block)\r
+        delay_flag &= (~O_NONBLOCK);\r
+    else\r
+        delay_flag |= O_NONBLOCK;\r
+    fcntl(s->sock_fd, F_SETFL, delay_flag);\r
+#endif /* !PYOS_OS2 */\r
+#else /* MS_WINDOWS */\r
+    block = !block;\r
+    ioctlsocket(s->sock_fd, FIONBIO, (u_long*)&block);\r
+#endif /* MS_WINDOWS */\r
+#else /* RISCOS */\r
+    block = !block;\r
+    socketioctl(s->sock_fd, FIONBIO, (u_long*)&block);\r
+#endif /* RISCOS */\r
+#endif /* __BEOS__ */\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* Since these don't return anything */\r
+    return 1;\r
+}\r
+\r
+/* Do a select()/poll() on the socket, if necessary (sock_timeout > 0).\r
+   The argument writing indicates the direction.\r
+   This does not raise an exception; we'll let our caller do that\r
+   after they've reacquired the interpreter lock.\r
+   Returns 1 on timeout, -1 on error, 0 otherwise. */\r
+static int\r
+internal_select_ex(PySocketSockObject *s, int writing, double interval)\r
+{\r
+    int n;\r
+\r
+    /* Nothing to do unless we're in timeout mode (not non-blocking) */\r
+    if (s->sock_timeout <= 0.0)\r
+        return 0;\r
+\r
+    /* Guard against closed socket */\r
+    if (s->sock_fd < 0)\r
+        return 0;\r
+\r
+    /* Handling this condition here simplifies the select loops */\r
+    if (interval < 0.0)\r
+        return 1;\r
+\r
+    /* Prefer poll, if available, since you can poll() any fd\r
+     * which can't be done with select(). */\r
+#ifdef HAVE_POLL\r
+    {\r
+        struct pollfd pollfd;\r
+        int timeout;\r
+\r
+        pollfd.fd = s->sock_fd;\r
+        pollfd.events = writing ? POLLOUT : POLLIN;\r
+\r
+        /* s->sock_timeout is in seconds, timeout in ms */\r
+        timeout = (int)(interval * 1000 + 0.5);\r
+        n = poll(&pollfd, 1, timeout);\r
+    }\r
+#else\r
+    {\r
+        /* Construct the arguments to select */\r
+        fd_set fds;\r
+        struct timeval tv;\r
+        tv.tv_sec = (int)interval;\r
+        tv.tv_usec = (int)((interval - tv.tv_sec) * 1e6);\r
+        FD_ZERO(&fds);\r
+        FD_SET(s->sock_fd, &fds);\r
+\r
+        /* See if the socket is ready */\r
+        if (writing)\r
+            n = select(s->sock_fd+1, NULL, &fds, NULL, &tv);\r
+        else\r
+            n = select(s->sock_fd+1, &fds, NULL, NULL, &tv);\r
+    }\r
+#endif\r
+\r
+    if (n < 0)\r
+        return -1;\r
+    if (n == 0)\r
+        return 1;\r
+    return 0;\r
+}\r
+\r
+static int\r
+internal_select(PySocketSockObject *s, int writing)\r
+{\r
+    return internal_select_ex(s, writing, s->sock_timeout);\r
+}\r
+\r
+/*\r
+   Two macros for automatic retry of select() in case of false positives\r
+   (for example, select() could indicate a socket is ready for reading\r
+    but the data then discarded by the OS because of a wrong checksum).\r
+   Here is an example of use:\r
+\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    timeout = internal_select_ex(s, 0, interval);\r
+    if (!timeout)\r
+        outlen = recv(s->sock_fd, cbuf, len, flags);\r
+    Py_END_ALLOW_THREADS\r
+    if (timeout == 1) {\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return -1;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+*/\r
+#define BEGIN_SELECT_LOOP(s) \\r
+    { \\r
+        double deadline, interval = s->sock_timeout; \\r
+        int has_timeout = s->sock_timeout > 0.0; \\r
+        if (has_timeout) { \\r
+            deadline = _PyTime_FloatTime() + s->sock_timeout; \\r
+        } \\r
+        while (1) { \\r
+            errno = 0;\r
+\r
+#define END_SELECT_LOOP(s) \\r
+            if (!has_timeout || \\r
+                (!CHECK_ERRNO(EWOULDBLOCK) && !CHECK_ERRNO(EAGAIN))) \\r
+                break; \\r
+            interval = deadline - _PyTime_FloatTime(); \\r
+        } \\r
+    }\r
+\r
+/* Initialize a new socket object. */\r
+\r
+static double defaulttimeout = -1.0; /* Default timeout for new sockets */\r
+\r
+PyMODINIT_FUNC\r
+init_sockobject(PySocketSockObject *s,\r
+                SOCKET_T fd, int family, int type, int proto)\r
+{\r
+#ifdef RISCOS\r
+    int block = 1;\r
+#endif\r
+    s->sock_fd = fd;\r
+    s->sock_family = family;\r
+    s->sock_type = type;\r
+    s->sock_proto = proto;\r
+    s->sock_timeout = defaulttimeout;\r
+\r
+    s->errorhandler = &set_error;\r
+\r
+    if (defaulttimeout >= 0.0)\r
+        internal_setblocking(s, 0);\r
+\r
+#ifdef RISCOS\r
+    if (taskwindow)\r
+        socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);\r
+#endif\r
+}\r
+\r
+\r
+/* Create a new socket object.\r
+   This just creates the object and initializes it.\r
+   If the creation fails, return NULL and set an exception (implicit\r
+   in NEWOBJ()). */\r
+\r
+static PySocketSockObject *\r
+new_sockobject(SOCKET_T fd, int family, int type, int proto)\r
+{\r
+    PySocketSockObject *s;\r
+    s = (PySocketSockObject *)\r
+        PyType_GenericNew(&sock_type, NULL, NULL);\r
+    if (s != NULL)\r
+        init_sockobject(s, fd, family, type, proto);\r
+    return s;\r
+}\r
+\r
+\r
+/* Lock to allow python interpreter to continue, but only allow one\r
+   thread to be in gethostbyname or getaddrinfo */\r
+#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
+static PyThread_type_lock netdb_lock;\r
+#endif\r
+\r
+\r
+/* Convert a string specifying a host name or one of a few symbolic\r
+   names to a numeric IP address.  This usually calls gethostbyname()\r
+   to do the work; the names "" and "<broadcast>" are special.\r
+   Return the length (IPv4 should be 4 bytes), or negative if\r
+   an error occurred; then an exception is raised. */\r
+\r
+static int\r
+setipaddr(char *name, struct sockaddr *addr_ret, size_t addr_ret_size, int af)\r
+{\r
+    struct addrinfo hints, *res;\r
+    int error;\r
+    int d1, d2, d3, d4;\r
+    char ch;\r
+\r
+    memset((void *) addr_ret, '\0', sizeof(*addr_ret));\r
+    if (name[0] == '\0') {\r
+        int siz;\r
+        memset(&hints, 0, sizeof(hints));\r
+        hints.ai_family = af;\r
+        hints.ai_socktype = SOCK_DGRAM;         /*dummy*/\r
+        hints.ai_flags = AI_PASSIVE;\r
+        Py_BEGIN_ALLOW_THREADS\r
+        ACQUIRE_GETADDRINFO_LOCK\r
+        error = getaddrinfo(NULL, "0", &hints, &res);\r
+        Py_END_ALLOW_THREADS\r
+        /* We assume that those thread-unsafe getaddrinfo() versions\r
+           *are* safe regarding their return value, ie. that a\r
+           subsequent call to getaddrinfo() does not destroy the\r
+           outcome of the first call. */\r
+        RELEASE_GETADDRINFO_LOCK\r
+        if (error) {\r
+            set_gaierror(error);\r
+            return -1;\r
+        }\r
+        switch (res->ai_family) {\r
+        case AF_INET:\r
+            siz = 4;\r
+            break;\r
+#ifdef ENABLE_IPV6\r
+        case AF_INET6:\r
+            siz = 16;\r
+            break;\r
+#endif\r
+        default:\r
+            freeaddrinfo(res);\r
+            PyErr_SetString(socket_error,\r
+                "unsupported address family");\r
+            return -1;\r
+        }\r
+        if (res->ai_next) {\r
+            freeaddrinfo(res);\r
+            PyErr_SetString(socket_error,\r
+                "wildcard resolved to multiple address");\r
+            return -1;\r
+        }\r
+        if (res->ai_addrlen < addr_ret_size)\r
+            addr_ret_size = res->ai_addrlen;\r
+        memcpy(addr_ret, res->ai_addr, addr_ret_size);\r
+        freeaddrinfo(res);\r
+        return siz;\r
+    }\r
+    if (name[0] == '<' && strcmp(name, "<broadcast>") == 0) {\r
+        struct sockaddr_in *sin;\r
+        if (af != AF_INET && af != AF_UNSPEC) {\r
+            PyErr_SetString(socket_error,\r
+                "address family mismatched");\r
+            return -1;\r
+        }\r
+        sin = (struct sockaddr_in *)addr_ret;\r
+        memset((void *) sin, '\0', sizeof(*sin));\r
+        sin->sin_family = AF_INET;\r
+#ifdef HAVE_SOCKADDR_SA_LEN\r
+        sin->sin_len = sizeof(*sin);\r
+#endif\r
+        sin->sin_addr.s_addr = INADDR_BROADCAST;\r
+        return sizeof(sin->sin_addr);\r
+    }\r
+    if (sscanf(name, "%d.%d.%d.%d%c", &d1, &d2, &d3, &d4, &ch) == 4 &&\r
+        0 <= d1 && d1 <= 255 && 0 <= d2 && d2 <= 255 &&\r
+        0 <= d3 && d3 <= 255 && 0 <= d4 && d4 <= 255) {\r
+        struct sockaddr_in *sin;\r
+        sin = (struct sockaddr_in *)addr_ret;\r
+        sin->sin_addr.s_addr = htonl(\r
+            ((long) d1 << 24) | ((long) d2 << 16) |\r
+            ((long) d3 << 8) | ((long) d4 << 0));\r
+        sin->sin_family = AF_INET;\r
+#ifdef HAVE_SOCKADDR_SA_LEN\r
+        sin->sin_len = sizeof(*sin);\r
+#endif\r
+        return 4;\r
+    }\r
+    memset(&hints, 0, sizeof(hints));\r
+    hints.ai_family = af;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    ACQUIRE_GETADDRINFO_LOCK\r
+    error = getaddrinfo(name, NULL, &hints, &res);\r
+#if defined(__digital__) && defined(__unix__)\r
+    if (error == EAI_NONAME && af == AF_UNSPEC) {\r
+        /* On Tru64 V5.1, numeric-to-addr conversion fails\r
+           if no address family is given. Assume IPv4 for now.*/\r
+        hints.ai_family = AF_INET;\r
+        error = getaddrinfo(name, NULL, &hints, &res);\r
+    }\r
+#endif\r
+    Py_END_ALLOW_THREADS\r
+    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */\r
+    if (error) {\r
+        set_gaierror(error);\r
+        return -1;\r
+    }\r
+    if (res->ai_addrlen < addr_ret_size)\r
+        addr_ret_size = res->ai_addrlen;\r
+    memcpy((char *) addr_ret, res->ai_addr, addr_ret_size);\r
+    freeaddrinfo(res);\r
+    switch (addr_ret->sa_family) {\r
+    case AF_INET:\r
+        return 4;\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+        return 16;\r
+#endif\r
+    default:\r
+        PyErr_SetString(socket_error, "unknown address family");\r
+        return -1;\r
+    }\r
+}\r
+\r
+\r
+/* Create a string object representing an IP address.\r
+   This is always a string of the form 'dd.dd.dd.dd' (with variable\r
+   size numbers). */\r
+\r
+static PyObject *\r
+makeipaddr(struct sockaddr *addr, int addrlen)\r
+{\r
+    char buf[NI_MAXHOST];\r
+    int error;\r
+\r
+    error = getnameinfo(addr, addrlen, buf, sizeof(buf), NULL, 0,\r
+        NI_NUMERICHOST);\r
+    if (error) {\r
+        set_gaierror(error);\r
+        return NULL;\r
+    }\r
+    return PyString_FromString(buf);\r
+}\r
+\r
+\r
+#ifdef USE_BLUETOOTH\r
+/* Convert a string representation of a Bluetooth address into a numeric\r
+   address.  Returns the length (6), or raises an exception and returns -1 if\r
+   an error occurred. */\r
+\r
+static int\r
+setbdaddr(char *name, bdaddr_t *bdaddr)\r
+{\r
+    unsigned int b0, b1, b2, b3, b4, b5;\r
+    char ch;\r
+    int n;\r
+\r
+    n = sscanf(name, "%X:%X:%X:%X:%X:%X%c",\r
+               &b5, &b4, &b3, &b2, &b1, &b0, &ch);\r
+    if (n == 6 && (b0 | b1 | b2 | b3 | b4 | b5) < 256) {\r
+        bdaddr->b[0] = b0;\r
+        bdaddr->b[1] = b1;\r
+        bdaddr->b[2] = b2;\r
+        bdaddr->b[3] = b3;\r
+        bdaddr->b[4] = b4;\r
+        bdaddr->b[5] = b5;\r
+        return 6;\r
+    } else {\r
+        PyErr_SetString(socket_error, "bad bluetooth address");\r
+        return -1;\r
+    }\r
+}\r
+\r
+/* Create a string representation of the Bluetooth address.  This is always a\r
+   string of the form 'XX:XX:XX:XX:XX:XX' where XX is a two digit hexadecimal\r
+   value (zero padded if necessary). */\r
+\r
+static PyObject *\r
+makebdaddr(bdaddr_t *bdaddr)\r
+{\r
+    char buf[(6 * 2) + 5 + 1];\r
+\r
+    sprintf(buf, "%02X:%02X:%02X:%02X:%02X:%02X",\r
+        bdaddr->b[5], bdaddr->b[4], bdaddr->b[3],\r
+        bdaddr->b[2], bdaddr->b[1], bdaddr->b[0]);\r
+    return PyString_FromString(buf);\r
+}\r
+#endif\r
+\r
+\r
+/* Create an object representing the given socket address,\r
+   suitable for passing it back to bind(), connect() etc.\r
+   The family field of the sockaddr structure is inspected\r
+   to determine what kind of address it really is. */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+makesockaddr(int sockfd, struct sockaddr *addr, int addrlen, int proto)\r
+{\r
+    if (addrlen == 0) {\r
+        /* No address -- may be recvfrom() from known socket */\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+\r
+#ifdef __BEOS__\r
+    /* XXX: BeOS version of accept() doesn't set family correctly */\r
+    addr->sa_family = AF_INET;\r
+#endif\r
+\r
+    switch (addr->sa_family) {\r
+\r
+    case AF_INET:\r
+    {\r
+        struct sockaddr_in *a;\r
+        PyObject *addrobj = makeipaddr(addr, sizeof(*a));\r
+        PyObject *ret = NULL;\r
+        if (addrobj) {\r
+            a = (struct sockaddr_in *)addr;\r
+            ret = Py_BuildValue("Oi", addrobj, ntohs(a->sin_port));\r
+            Py_DECREF(addrobj);\r
+        }\r
+        return ret;\r
+    }\r
+\r
+#if defined(AF_UNIX)\r
+    case AF_UNIX:\r
+    {\r
+        struct sockaddr_un *a = (struct sockaddr_un *) addr;\r
+#ifdef linux\r
+        if (a->sun_path[0] == 0) {  /* Linux abstract namespace */\r
+            addrlen -= offsetof(struct sockaddr_un, sun_path);\r
+            return PyString_FromStringAndSize(a->sun_path,\r
+                                              addrlen);\r
+        }\r
+        else\r
+#endif /* linux */\r
+        {\r
+            /* regular NULL-terminated string */\r
+            return PyString_FromString(a->sun_path);\r
+        }\r
+    }\r
+#endif /* AF_UNIX */\r
+\r
+#if defined(AF_NETLINK)\r
+       case AF_NETLINK:\r
+       {\r
+           struct sockaddr_nl *a = (struct sockaddr_nl *) addr;\r
+           return Py_BuildValue("II", a->nl_pid, a->nl_groups);\r
+       }\r
+#endif /* AF_NETLINK */\r
+\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+    {\r
+        struct sockaddr_in6 *a;\r
+        PyObject *addrobj = makeipaddr(addr, sizeof(*a));\r
+        PyObject *ret = NULL;\r
+        if (addrobj) {\r
+            a = (struct sockaddr_in6 *)addr;\r
+            ret = Py_BuildValue("OiII",\r
+                                addrobj,\r
+                                ntohs(a->sin6_port),\r
+                                ntohl(a->sin6_flowinfo),\r
+                                a->sin6_scope_id);\r
+            Py_DECREF(addrobj);\r
+        }\r
+        return ret;\r
+    }\r
+#endif\r
+\r
+#ifdef USE_BLUETOOTH\r
+    case AF_BLUETOOTH:\r
+        switch (proto) {\r
+\r
+        case BTPROTO_L2CAP:\r
+        {\r
+            struct sockaddr_l2 *a = (struct sockaddr_l2 *) addr;\r
+            PyObject *addrobj = makebdaddr(&_BT_L2_MEMB(a, bdaddr));\r
+            PyObject *ret = NULL;\r
+            if (addrobj) {\r
+                ret = Py_BuildValue("Oi",\r
+                                    addrobj,\r
+                                    _BT_L2_MEMB(a, psm));\r
+                Py_DECREF(addrobj);\r
+            }\r
+            return ret;\r
+        }\r
+\r
+        case BTPROTO_RFCOMM:\r
+        {\r
+            struct sockaddr_rc *a = (struct sockaddr_rc *) addr;\r
+            PyObject *addrobj = makebdaddr(&_BT_RC_MEMB(a, bdaddr));\r
+            PyObject *ret = NULL;\r
+            if (addrobj) {\r
+                ret = Py_BuildValue("Oi",\r
+                                    addrobj,\r
+                                    _BT_RC_MEMB(a, channel));\r
+                Py_DECREF(addrobj);\r
+            }\r
+            return ret;\r
+        }\r
+\r
+        case BTPROTO_HCI:\r
+        {\r
+            struct sockaddr_hci *a = (struct sockaddr_hci *) addr;\r
+#if defined(__NetBSD__) || defined(__DragonFly__)\r
+            return makebdaddr(&_BT_HCI_MEMB(a, bdaddr));\r
+#else\r
+            PyObject *ret = NULL;\r
+            ret = Py_BuildValue("i", _BT_HCI_MEMB(a, dev));\r
+            return ret;\r
+#endif\r
+        }\r
+\r
+#if !defined(__FreeBSD__)\r
+        case BTPROTO_SCO:\r
+        {\r
+            struct sockaddr_sco *a = (struct sockaddr_sco *) addr;\r
+            return makebdaddr(&_BT_SCO_MEMB(a, bdaddr));\r
+        }\r
+#endif\r
+\r
+        default:\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "Unknown Bluetooth protocol");\r
+            return NULL;\r
+        }\r
+#endif\r
+\r
+#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFNAME)\r
+    case AF_PACKET:\r
+    {\r
+        struct sockaddr_ll *a = (struct sockaddr_ll *)addr;\r
+        char *ifname = "";\r
+        struct ifreq ifr;\r
+        /* need to look up interface name give index */\r
+        if (a->sll_ifindex) {\r
+            ifr.ifr_ifindex = a->sll_ifindex;\r
+            if (ioctl(sockfd, SIOCGIFNAME, &ifr) == 0)\r
+                ifname = ifr.ifr_name;\r
+        }\r
+        return Py_BuildValue("shbhs#",\r
+                             ifname,\r
+                             ntohs(a->sll_protocol),\r
+                             a->sll_pkttype,\r
+                             a->sll_hatype,\r
+                             a->sll_addr,\r
+                             a->sll_halen);\r
+    }\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_TIPC_H\r
+    case AF_TIPC:\r
+    {\r
+        struct sockaddr_tipc *a = (struct sockaddr_tipc *) addr;\r
+        if (a->addrtype == TIPC_ADDR_NAMESEQ) {\r
+            return Py_BuildValue("IIIII",\r
+                            a->addrtype,\r
+                            a->addr.nameseq.type,\r
+                            a->addr.nameseq.lower,\r
+                            a->addr.nameseq.upper,\r
+                            a->scope);\r
+        } else if (a->addrtype == TIPC_ADDR_NAME) {\r
+            return Py_BuildValue("IIIII",\r
+                            a->addrtype,\r
+                            a->addr.name.name.type,\r
+                            a->addr.name.name.instance,\r
+                            a->addr.name.name.instance,\r
+                            a->scope);\r
+        } else if (a->addrtype == TIPC_ADDR_ID) {\r
+            return Py_BuildValue("IIIII",\r
+                            a->addrtype,\r
+                            a->addr.id.node,\r
+                            a->addr.id.ref,\r
+                            0,\r
+                            a->scope);\r
+        } else {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "Invalid address type");\r
+            return NULL;\r
+        }\r
+    }\r
+#endif\r
+\r
+    /* More cases here... */\r
+\r
+    default:\r
+        /* If we don't know the address family, don't raise an\r
+           exception -- return it as a tuple. */\r
+        return Py_BuildValue("is#",\r
+                             addr->sa_family,\r
+                             addr->sa_data,\r
+                             sizeof(addr->sa_data));\r
+\r
+    }\r
+}\r
+\r
+\r
+/* Parse a socket address argument according to the socket object's\r
+   address family.  Return 1 if the address was in the proper format,\r
+   0 of not.  The address is returned through addr_ret, its length\r
+   through len_ret. */\r
+\r
+static int\r
+getsockaddrarg(PySocketSockObject *s, PyObject *args,\r
+               struct sockaddr *addr_ret, int *len_ret)\r
+{\r
+    switch (s->sock_family) {\r
+\r
+#if defined(AF_UNIX)\r
+    case AF_UNIX:\r
+    {\r
+        struct sockaddr_un* addr;\r
+        char *path;\r
+        int len;\r
+        if (!PyArg_Parse(args, "t#", &path, &len))\r
+            return 0;\r
+\r
+        addr = (struct sockaddr_un*)addr_ret;\r
+#ifdef linux\r
+        if (len > 0 && path[0] == 0) {\r
+            /* Linux abstract namespace extension */\r
+            if (len > sizeof addr->sun_path) {\r
+                PyErr_SetString(socket_error,\r
+                                "AF_UNIX path too long");\r
+                return 0;\r
+            }\r
+        }\r
+        else\r
+#endif /* linux */\r
+        {\r
+            /* regular NULL-terminated string */\r
+            if (len >= sizeof addr->sun_path) {\r
+                PyErr_SetString(socket_error,\r
+                                "AF_UNIX path too long");\r
+                return 0;\r
+            }\r
+            addr->sun_path[len] = 0;\r
+        }\r
+        addr->sun_family = s->sock_family;\r
+        memcpy(addr->sun_path, path, len);\r
+#if defined(PYOS_OS2)\r
+        *len_ret = sizeof(*addr);\r
+#else\r
+        *len_ret = len + offsetof(struct sockaddr_un, sun_path);\r
+#endif\r
+        return 1;\r
+    }\r
+#endif /* AF_UNIX */\r
+\r
+#if defined(AF_NETLINK)\r
+    case AF_NETLINK:\r
+    {\r
+        struct sockaddr_nl* addr;\r
+        int pid, groups;\r
+        addr = (struct sockaddr_nl *)addr_ret;\r
+        if (!PyTuple_Check(args)) {\r
+            PyErr_Format(\r
+                PyExc_TypeError,\r
+                "getsockaddrarg: "\r
+                "AF_NETLINK address must be tuple, not %.500s",\r
+                Py_TYPE(args)->tp_name);\r
+            return 0;\r
+        }\r
+        if (!PyArg_ParseTuple(args, "II:getsockaddrarg", &pid, &groups))\r
+            return 0;\r
+        addr->nl_family = AF_NETLINK;\r
+        addr->nl_pid = pid;\r
+        addr->nl_groups = groups;\r
+        *len_ret = sizeof(*addr);\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+    case AF_INET:\r
+    {\r
+        struct sockaddr_in* addr;\r
+        char *host;\r
+        int port, result;\r
+        if (!PyTuple_Check(args)) {\r
+            PyErr_Format(\r
+                PyExc_TypeError,\r
+                "getsockaddrarg: "\r
+                "AF_INET address must be tuple, not %.500s",\r
+                Py_TYPE(args)->tp_name);\r
+            return 0;\r
+        }\r
+        if (!PyArg_ParseTuple(args, "eti:getsockaddrarg",\r
+                              "idna", &host, &port))\r
+            return 0;\r
+        addr=(struct sockaddr_in*)addr_ret;\r
+        result = setipaddr(host, (struct sockaddr *)addr,\r
+                           sizeof(*addr),  AF_INET);\r
+        PyMem_Free(host);\r
+        if (result < 0)\r
+            return 0;\r
+        if (port < 0 || port > 0xffff) {\r
+            PyErr_SetString(\r
+                PyExc_OverflowError,\r
+                "getsockaddrarg: port must be 0-65535.");\r
+            return 0;\r
+        }\r
+        addr->sin_family = AF_INET;\r
+        addr->sin_port = htons((short)port);\r
+        *len_ret = sizeof *addr;\r
+        return 1;\r
+    }\r
+\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+    {\r
+        struct sockaddr_in6* addr;\r
+        char *host;\r
+        int port, result;\r
+        unsigned int flowinfo, scope_id;\r
+        flowinfo = scope_id = 0;\r
+        if (!PyTuple_Check(args)) {\r
+            PyErr_Format(\r
+                PyExc_TypeError,\r
+                "getsockaddrarg: "\r
+                "AF_INET6 address must be tuple, not %.500s",\r
+                Py_TYPE(args)->tp_name);\r
+            return 0;\r
+        }\r
+        if (!PyArg_ParseTuple(args, "eti|II",\r
+                              "idna", &host, &port, &flowinfo,\r
+                              &scope_id)) {\r
+            return 0;\r
+        }\r
+        addr = (struct sockaddr_in6*)addr_ret;\r
+        result = setipaddr(host, (struct sockaddr *)addr,\r
+                           sizeof(*addr), AF_INET6);\r
+        PyMem_Free(host);\r
+        if (result < 0)\r
+            return 0;\r
+        if (port < 0 || port > 0xffff) {\r
+            PyErr_SetString(\r
+                PyExc_OverflowError,\r
+                "getsockaddrarg: port must be 0-65535.");\r
+            return 0;\r
+        }\r
+        if (flowinfo > 0xfffff) {\r
+            PyErr_SetString(\r
+                PyExc_OverflowError,\r
+                "getsockaddrarg: flowinfo must be 0-1048575.");\r
+            return 0;\r
+        }\r
+        addr->sin6_family = s->sock_family;\r
+        addr->sin6_port = htons((short)port);\r
+        addr->sin6_flowinfo = htonl(flowinfo);\r
+        addr->sin6_scope_id = scope_id;\r
+        *len_ret = sizeof *addr;\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+#ifdef USE_BLUETOOTH\r
+    case AF_BLUETOOTH:\r
+    {\r
+        switch (s->sock_proto) {\r
+        case BTPROTO_L2CAP:\r
+        {\r
+            struct sockaddr_l2 *addr;\r
+            char *straddr;\r
+\r
+            addr = (struct sockaddr_l2 *)addr_ret;\r
+            memset(addr, 0, sizeof(struct sockaddr_l2));\r
+            _BT_L2_MEMB(addr, family) = AF_BLUETOOTH;\r
+            if (!PyArg_ParseTuple(args, "si", &straddr,\r
+                                  &_BT_L2_MEMB(addr, psm))) {\r
+                PyErr_SetString(socket_error, "getsockaddrarg: "\r
+                                "wrong format");\r
+                return 0;\r
+            }\r
+            if (setbdaddr(straddr, &_BT_L2_MEMB(addr, bdaddr)) < 0)\r
+                return 0;\r
+\r
+            *len_ret = sizeof *addr;\r
+            return 1;\r
+        }\r
+        case BTPROTO_RFCOMM:\r
+        {\r
+            struct sockaddr_rc *addr;\r
+            char *straddr;\r
+\r
+            addr = (struct sockaddr_rc *)addr_ret;\r
+            _BT_RC_MEMB(addr, family) = AF_BLUETOOTH;\r
+            if (!PyArg_ParseTuple(args, "si", &straddr,\r
+                                  &_BT_RC_MEMB(addr, channel))) {\r
+                PyErr_SetString(socket_error, "getsockaddrarg: "\r
+                                "wrong format");\r
+                return 0;\r
+            }\r
+            if (setbdaddr(straddr, &_BT_RC_MEMB(addr, bdaddr)) < 0)\r
+                return 0;\r
+\r
+            *len_ret = sizeof *addr;\r
+            return 1;\r
+        }\r
+        case BTPROTO_HCI:\r
+        {\r
+            struct sockaddr_hci *addr = (struct sockaddr_hci *)addr_ret;\r
+#if defined(__NetBSD__) || defined(__DragonFly__)\r
+                       char *straddr = PyBytes_AS_STRING(args);\r
+\r
+                       _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;\r
+            if (straddr == NULL) {\r
+                PyErr_SetString(socket_error, "getsockaddrarg: "\r
+                    "wrong format");\r
+                return 0;\r
+            }\r
+            if (setbdaddr(straddr, &_BT_HCI_MEMB(addr, bdaddr)) < 0)\r
+                return 0;\r
+#else\r
+            _BT_HCI_MEMB(addr, family) = AF_BLUETOOTH;\r
+            if (!PyArg_ParseTuple(args, "i", &_BT_HCI_MEMB(addr, dev))) {\r
+                PyErr_SetString(socket_error, "getsockaddrarg: "\r
+                                "wrong format");\r
+                return 0;\r
+            }\r
+#endif\r
+            *len_ret = sizeof *addr;\r
+            return 1;\r
+        }\r
+#if !defined(__FreeBSD__)\r
+        case BTPROTO_SCO:\r
+        {\r
+            struct sockaddr_sco *addr;\r
+            char *straddr;\r
+\r
+            addr = (struct sockaddr_sco *)addr_ret;\r
+            _BT_SCO_MEMB(addr, family) = AF_BLUETOOTH;\r
+            straddr = PyString_AsString(args);\r
+            if (straddr == NULL) {\r
+                PyErr_SetString(socket_error, "getsockaddrarg: "\r
+                                "wrong format");\r
+                return 0;\r
+            }\r
+            if (setbdaddr(straddr, &_BT_SCO_MEMB(addr, bdaddr)) < 0)\r
+                return 0;\r
+\r
+            *len_ret = sizeof *addr;\r
+            return 1;\r
+        }\r
+#endif\r
+        default:\r
+            PyErr_SetString(socket_error, "getsockaddrarg: unknown Bluetooth protocol");\r
+            return 0;\r
+        }\r
+    }\r
+#endif\r
+\r
+#if defined(HAVE_NETPACKET_PACKET_H) && defined(SIOCGIFINDEX)\r
+    case AF_PACKET:\r
+    {\r
+        struct sockaddr_ll* addr;\r
+        struct ifreq ifr;\r
+        char *interfaceName;\r
+        int protoNumber;\r
+        int hatype = 0;\r
+        int pkttype = 0;\r
+        char *haddr = NULL;\r
+        unsigned int halen = 0;\r
+\r
+        if (!PyTuple_Check(args)) {\r
+            PyErr_Format(\r
+                PyExc_TypeError,\r
+                "getsockaddrarg: "\r
+                "AF_PACKET address must be tuple, not %.500s",\r
+                Py_TYPE(args)->tp_name);\r
+            return 0;\r
+        }\r
+        if (!PyArg_ParseTuple(args, "si|iis#", &interfaceName,\r
+                              &protoNumber, &pkttype, &hatype,\r
+                              &haddr, &halen))\r
+            return 0;\r
+        strncpy(ifr.ifr_name, interfaceName, sizeof(ifr.ifr_name));\r
+        ifr.ifr_name[(sizeof(ifr.ifr_name))-1] = '\0';\r
+        if (ioctl(s->sock_fd, SIOCGIFINDEX, &ifr) < 0) {\r
+            s->errorhandler();\r
+            return 0;\r
+        }\r
+        if (halen > 8) {\r
+          PyErr_SetString(PyExc_ValueError,\r
+                          "Hardware address must be 8 bytes or less");\r
+          return 0;\r
+        }\r
+        if (protoNumber < 0 || protoNumber > 0xffff) {\r
+            PyErr_SetString(\r
+                PyExc_OverflowError,\r
+                "getsockaddrarg: protoNumber must be 0-65535.");\r
+            return 0;\r
+        }\r
+        addr = (struct sockaddr_ll*)addr_ret;\r
+        addr->sll_family = AF_PACKET;\r
+        addr->sll_protocol = htons((short)protoNumber);\r
+        addr->sll_ifindex = ifr.ifr_ifindex;\r
+        addr->sll_pkttype = pkttype;\r
+        addr->sll_hatype = hatype;\r
+        if (halen != 0) {\r
+          memcpy(&addr->sll_addr, haddr, halen);\r
+        }\r
+        addr->sll_halen = halen;\r
+        *len_ret = sizeof *addr;\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_TIPC_H\r
+    case AF_TIPC:\r
+    {\r
+        unsigned int atype, v1, v2, v3;\r
+        unsigned int scope = TIPC_CLUSTER_SCOPE;\r
+        struct sockaddr_tipc *addr;\r
+\r
+        if (!PyTuple_Check(args)) {\r
+            PyErr_Format(\r
+                PyExc_TypeError,\r
+                "getsockaddrarg: "\r
+                "AF_TIPC address must be tuple, not %.500s",\r
+                Py_TYPE(args)->tp_name);\r
+            return 0;\r
+        }\r
+\r
+        if (!PyArg_ParseTuple(args,\r
+                                "IIII|I;Invalid TIPC address format",\r
+                                &atype, &v1, &v2, &v3, &scope))\r
+            return 0;\r
+\r
+        addr = (struct sockaddr_tipc *) addr_ret;\r
+        memset(addr, 0, sizeof(struct sockaddr_tipc));\r
+\r
+        addr->family = AF_TIPC;\r
+        addr->scope = scope;\r
+        addr->addrtype = atype;\r
+\r
+        if (atype == TIPC_ADDR_NAMESEQ) {\r
+            addr->addr.nameseq.type = v1;\r
+            addr->addr.nameseq.lower = v2;\r
+            addr->addr.nameseq.upper = v3;\r
+        } else if (atype == TIPC_ADDR_NAME) {\r
+            addr->addr.name.name.type = v1;\r
+            addr->addr.name.name.instance = v2;\r
+        } else if (atype == TIPC_ADDR_ID) {\r
+            addr->addr.id.node = v1;\r
+            addr->addr.id.ref = v2;\r
+        } else {\r
+            /* Shouldn't happen */\r
+            PyErr_SetString(PyExc_TypeError, "Invalid address type");\r
+            return 0;\r
+        }\r
+\r
+        *len_ret = sizeof(*addr);\r
+\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+    /* More cases here... */\r
+\r
+    default:\r
+        PyErr_SetString(socket_error, "getsockaddrarg: bad family");\r
+        return 0;\r
+\r
+    }\r
+}\r
+\r
+\r
+/* Get the address length according to the socket object's address family.\r
+   Return 1 if the family is known, 0 otherwise.  The length is returned\r
+   through len_ret. */\r
+\r
+static int\r
+getsockaddrlen(PySocketSockObject *s, socklen_t *len_ret)\r
+{\r
+    switch (s->sock_family) {\r
+\r
+#if defined(AF_UNIX)\r
+    case AF_UNIX:\r
+    {\r
+        *len_ret = sizeof (struct sockaddr_un);\r
+        return 1;\r
+    }\r
+#endif /* AF_UNIX */\r
+#if defined(AF_NETLINK)\r
+       case AF_NETLINK:\r
+       {\r
+           *len_ret = sizeof (struct sockaddr_nl);\r
+           return 1;\r
+       }\r
+#endif\r
+\r
+    case AF_INET:\r
+    {\r
+        *len_ret = sizeof (struct sockaddr_in);\r
+        return 1;\r
+    }\r
+\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+    {\r
+        *len_ret = sizeof (struct sockaddr_in6);\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+#ifdef USE_BLUETOOTH\r
+    case AF_BLUETOOTH:\r
+    {\r
+        switch(s->sock_proto)\r
+        {\r
+\r
+        case BTPROTO_L2CAP:\r
+            *len_ret = sizeof (struct sockaddr_l2);\r
+            return 1;\r
+        case BTPROTO_RFCOMM:\r
+            *len_ret = sizeof (struct sockaddr_rc);\r
+            return 1;\r
+        case BTPROTO_HCI:\r
+            *len_ret = sizeof (struct sockaddr_hci);\r
+            return 1;\r
+#if !defined(__FreeBSD__)\r
+        case BTPROTO_SCO:\r
+            *len_ret = sizeof (struct sockaddr_sco);\r
+            return 1;\r
+#endif\r
+        default:\r
+            PyErr_SetString(socket_error, "getsockaddrlen: "\r
+                            "unknown BT protocol");\r
+            return 0;\r
+\r
+        }\r
+    }\r
+#endif\r
+\r
+#ifdef HAVE_NETPACKET_PACKET_H\r
+    case AF_PACKET:\r
+    {\r
+        *len_ret = sizeof (struct sockaddr_ll);\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_TIPC_H\r
+    case AF_TIPC:\r
+    {\r
+        *len_ret = sizeof (struct sockaddr_tipc);\r
+        return 1;\r
+    }\r
+#endif\r
+\r
+    /* More cases here... */\r
+\r
+    default:\r
+        PyErr_SetString(socket_error, "getsockaddrlen: bad family");\r
+        return 0;\r
+\r
+    }\r
+}\r
+\r
+\r
+/* s.accept() method */\r
+\r
+static PyObject *\r
+sock_accept(PySocketSockObject *s)\r
+{\r
+    sock_addr_t addrbuf;\r
+    SOCKET_T newfd;\r
+    socklen_t addrlen;\r
+    PyObject *sock = NULL;\r
+    PyObject *addr = NULL;\r
+    PyObject *res = NULL;\r
+    int timeout;\r
+\r
+    if (!getsockaddrlen(s, &addrlen))\r
+        return NULL;\r
+    memset(&addrbuf, 0, addrlen);\r
+\r
+    newfd = INVALID_SOCKET;\r
+\r
+    if (!IS_SELECTABLE(s))\r
+        return select_error();\r
+\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    timeout = internal_select_ex(s, 0, interval);\r
+    if (!timeout)\r
+        newfd = accept(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (timeout == 1) {\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return NULL;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+\r
+    if (newfd == INVALID_SOCKET)\r
+        return s->errorhandler();\r
+\r
+    /* Create the new object with unspecified family,\r
+       to avoid calls to bind() etc. on it. */\r
+    sock = (PyObject *) new_sockobject(newfd,\r
+                                       s->sock_family,\r
+                                       s->sock_type,\r
+                                       s->sock_proto);\r
+\r
+    if (sock == NULL) {\r
+        SOCKETCLOSE(newfd);\r
+        goto finally;\r
+    }\r
+    addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),\r
+                        addrlen, s->sock_proto);\r
+    if (addr == NULL)\r
+        goto finally;\r
+\r
+    res = PyTuple_Pack(2, sock, addr);\r
+\r
+finally:\r
+    Py_XDECREF(sock);\r
+    Py_XDECREF(addr);\r
+    return res;\r
+}\r
+\r
+PyDoc_STRVAR(accept_doc,\r
+"accept() -> (socket object, address info)\n\\r
+\n\\r
+Wait for an incoming connection.  Return a new socket representing the\n\\r
+connection, and the address of the client.  For IP sockets, the address\n\\r
+info is a pair (hostaddr, port).");\r
+\r
+/* s.setblocking(flag) method.  Argument:\r
+   False -- non-blocking mode; same as settimeout(0)\r
+   True -- blocking mode; same as settimeout(None)\r
+*/\r
+\r
+static PyObject *\r
+sock_setblocking(PySocketSockObject *s, PyObject *arg)\r
+{\r
+    long block;\r
+\r
+    block = PyInt_AsLong(arg);\r
+    if (block == -1 && PyErr_Occurred())\r
+        return NULL;\r
+\r
+    s->sock_timeout = block ? -1.0 : 0.0;\r
+    internal_setblocking(s, block);\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(setblocking_doc,\r
+"setblocking(flag)\n\\r
+\n\\r
+Set the socket to blocking (flag is true) or non-blocking (false).\n\\r
+setblocking(True) is equivalent to settimeout(None);\n\\r
+setblocking(False) is equivalent to settimeout(0.0).");\r
+\r
+/* s.settimeout(timeout) method.  Argument:\r
+   None -- no timeout, blocking mode; same as setblocking(True)\r
+   0.0  -- non-blocking mode; same as setblocking(False)\r
+   > 0  -- timeout mode; operations time out after timeout seconds\r
+   < 0  -- illegal; raises an exception\r
+*/\r
+static PyObject *\r
+sock_settimeout(PySocketSockObject *s, PyObject *arg)\r
+{\r
+    double timeout;\r
+\r
+    if (arg == Py_None)\r
+        timeout = -1.0;\r
+    else {\r
+        timeout = PyFloat_AsDouble(arg);\r
+        if (timeout < 0.0) {\r
+            if (!PyErr_Occurred())\r
+                PyErr_SetString(PyExc_ValueError,\r
+                                "Timeout value out of range");\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    s->sock_timeout = timeout;\r
+    internal_setblocking(s, timeout < 0.0);\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(settimeout_doc,\r
+"settimeout(timeout)\n\\r
+\n\\r
+Set a timeout on socket operations.  'timeout' can be a float,\n\\r
+giving in seconds, or None.  Setting a timeout of None disables\n\\r
+the timeout feature and is equivalent to setblocking(1).\n\\r
+Setting a timeout of zero is the same as setblocking(0).");\r
+\r
+/* s.gettimeout() method.\r
+   Returns the timeout associated with a socket. */\r
+static PyObject *\r
+sock_gettimeout(PySocketSockObject *s)\r
+{\r
+    if (s->sock_timeout < 0.0) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    else\r
+        return PyFloat_FromDouble(s->sock_timeout);\r
+}\r
+\r
+PyDoc_STRVAR(gettimeout_doc,\r
+"gettimeout() -> timeout\n\\r
+\n\\r
+Returns the timeout in seconds (float) associated with socket \n\\r
+operations. A timeout of None indicates that timeouts on socket \n\\r
+operations are disabled.");\r
+\r
+#ifdef RISCOS\r
+/* s.sleeptaskw(1 | 0) method */\r
+\r
+static PyObject *\r
+sock_sleeptaskw(PySocketSockObject *s,PyObject *arg)\r
+{\r
+    int block;\r
+    block = PyInt_AsLong(arg);\r
+    if (block == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    socketioctl(s->sock_fd, 0x80046679, (u_long*)&block);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+PyDoc_STRVAR(sleeptaskw_doc,\r
+"sleeptaskw(flag)\n\\r
+\n\\r
+Allow sleeps in taskwindows.");\r
+#endif\r
+\r
+\r
+/* s.setsockopt() method.\r
+   With an integer third argument, sets an integer option.\r
+   With a string third argument, sets an option from a buffer;\r
+   use optional built-in module 'struct' to encode the string. */\r
+\r
+static PyObject *\r
+sock_setsockopt(PySocketSockObject *s, PyObject *args)\r
+{\r
+    int level;\r
+    int optname;\r
+    int res;\r
+    char *buf;\r
+    int buflen;\r
+    int flag;\r
+\r
+    if (PyArg_ParseTuple(args, "iii:setsockopt",\r
+                         &level, &optname, &flag)) {\r
+        buf = (char *) &flag;\r
+        buflen = sizeof flag;\r
+    }\r
+    else {\r
+        PyErr_Clear();\r
+        if (!PyArg_ParseTuple(args, "iis#:setsockopt",\r
+                              &level, &optname, &buf, &buflen))\r
+            return NULL;\r
+    }\r
+    res = setsockopt(s->sock_fd, level, optname, (void *)buf, buflen);\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(setsockopt_doc,\r
+"setsockopt(level, option, value)\n\\r
+\n\\r
+Set a socket option.  See the Unix manual for level and option.\n\\r
+The value argument can either be an integer or a string.");\r
+\r
+\r
+/* s.getsockopt() method.\r
+   With two arguments, retrieves an integer option.\r
+   With a third integer argument, retrieves a string buffer of that size;\r
+   use optional built-in module 'struct' to decode the string. */\r
+\r
+static PyObject *\r
+sock_getsockopt(PySocketSockObject *s, PyObject *args)\r
+{\r
+    int level;\r
+    int optname;\r
+    int res;\r
+    PyObject *buf;\r
+    socklen_t buflen = 0;\r
+\r
+#ifdef __BEOS__\r
+    /* We have incomplete socket support. */\r
+    PyErr_SetString(socket_error, "getsockopt not supported");\r
+    return NULL;\r
+#else\r
+\r
+    if (!PyArg_ParseTuple(args, "ii|i:getsockopt",\r
+                          &level, &optname, &buflen))\r
+        return NULL;\r
+\r
+    if (buflen == 0) {\r
+        int flag = 0;\r
+        socklen_t flagsize = sizeof flag;\r
+        res = getsockopt(s->sock_fd, level, optname,\r
+                         (void *)&flag, &flagsize);\r
+        if (res < 0)\r
+            return s->errorhandler();\r
+        return PyInt_FromLong(flag);\r
+    }\r
+#ifdef __VMS\r
+    /* socklen_t is unsigned so no negative test is needed,\r
+       test buflen == 0 is previously done */\r
+    if (buflen > 1024) {\r
+#else\r
+    if (buflen <= 0 || buflen > 1024) {\r
+#endif\r
+        PyErr_SetString(socket_error,\r
+                        "getsockopt buflen out of range");\r
+        return NULL;\r
+    }\r
+    buf = PyString_FromStringAndSize((char *)NULL, buflen);\r
+    if (buf == NULL)\r
+        return NULL;\r
+    res = getsockopt(s->sock_fd, level, optname,\r
+                     (void *)PyString_AS_STRING(buf), &buflen);\r
+    if (res < 0) {\r
+        Py_DECREF(buf);\r
+        return s->errorhandler();\r
+    }\r
+    _PyString_Resize(&buf, buflen);\r
+    return buf;\r
+#endif /* __BEOS__ */\r
+}\r
+\r
+PyDoc_STRVAR(getsockopt_doc,\r
+"getsockopt(level, option[, buffersize]) -> value\n\\r
+\n\\r
+Get a socket option.  See the Unix manual for level and option.\n\\r
+If a nonzero buffersize argument is given, the return value is a\n\\r
+string of that length; otherwise it is an integer.");\r
+\r
+\r
+/* s.bind(sockaddr) method */\r
+\r
+static PyObject *\r
+sock_bind(PySocketSockObject *s, PyObject *addro)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int addrlen;\r
+    int res;\r
+\r
+    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = bind(s->sock_fd, SAS2SA(&addrbuf), addrlen);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(bind_doc,\r
+"bind(address)\n\\r
+\n\\r
+Bind the socket to a local address.  For IP sockets, the address is a\n\\r
+pair (host, port); the host must refer to the local host. For raw packet\n\\r
+sockets the address is a tuple (ifname, proto [,pkttype [,hatype]])");\r
+\r
+\r
+/* s.close() method.\r
+   Set the file descriptor to -1 so operations tried subsequently\r
+   will surely fail. */\r
+\r
+static PyObject *\r
+sock_close(PySocketSockObject *s)\r
+{\r
+    SOCKET_T fd;\r
+\r
+    if ((fd = s->sock_fd) != -1) {\r
+        s->sock_fd = -1;\r
+        Py_BEGIN_ALLOW_THREADS\r
+        (void) SOCKETCLOSE(fd);\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(close_doc,\r
+"close()\n\\r
+\n\\r
+Close the socket.  It cannot be used after this call.");\r
+\r
+static int\r
+internal_connect(PySocketSockObject *s, struct sockaddr *addr, int addrlen,\r
+                 int *timeoutp)\r
+{\r
+    int res, timeout;\r
+\r
+    timeout = 0;\r
+    res = connect(s->sock_fd, addr, addrlen);\r
+\r
+#ifdef MS_WINDOWS\r
+\r
+    if (s->sock_timeout > 0.0) {\r
+        if (res < 0 && WSAGetLastError() == WSAEWOULDBLOCK &&\r
+            IS_SELECTABLE(s)) {\r
+            /* This is a mess.  Best solution: trust select */\r
+            fd_set fds;\r
+            fd_set fds_exc;\r
+            struct timeval tv;\r
+            tv.tv_sec = (int)s->sock_timeout;\r
+            tv.tv_usec = (int)((s->sock_timeout - tv.tv_sec) * 1e6);\r
+            FD_ZERO(&fds);\r
+            FD_SET(s->sock_fd, &fds);\r
+            FD_ZERO(&fds_exc);\r
+            FD_SET(s->sock_fd, &fds_exc);\r
+            res = select(s->sock_fd+1, NULL, &fds, &fds_exc, &tv);\r
+            if (res == 0) {\r
+                res = WSAEWOULDBLOCK;\r
+                timeout = 1;\r
+            } else if (res > 0) {\r
+                if (FD_ISSET(s->sock_fd, &fds))\r
+                    /* The socket is in the writeable set - this\r
+                       means connected */\r
+                    res = 0;\r
+                else {\r
+                    /* As per MS docs, we need to call getsockopt()\r
+                       to get the underlying error */\r
+                    int res_size = sizeof res;\r
+                    /* It must be in the exception set */\r
+                    assert(FD_ISSET(s->sock_fd, &fds_exc));\r
+                    if (0 == getsockopt(s->sock_fd, SOL_SOCKET, SO_ERROR,\r
+                                        (char *)&res, &res_size))\r
+                        /* getsockopt also clears WSAGetLastError,\r
+                           so reset it back. */\r
+                        WSASetLastError(res);\r
+                    else\r
+                        res = WSAGetLastError();\r
+                }\r
+            }\r
+            /* else if (res < 0) an error occurred */\r
+        }\r
+    }\r
+\r
+    if (res < 0)\r
+        res = WSAGetLastError();\r
+\r
+#else\r
+\r
+    if (s->sock_timeout > 0.0) {\r
+        if (res < 0 && errno == EINPROGRESS && IS_SELECTABLE(s)) {\r
+            timeout = internal_select(s, 1);\r
+            if (timeout == 0) {\r
+                /* Bug #1019808: in case of an EINPROGRESS,\r
+                   use getsockopt(SO_ERROR) to get the real\r
+                   error. */\r
+                socklen_t res_size = sizeof res;\r
+                (void)getsockopt(s->sock_fd, SOL_SOCKET,\r
+                                 SO_ERROR, &res, &res_size);\r
+                if (res == EISCONN)\r
+                    res = 0;\r
+                errno = res;\r
+            }\r
+            else if (timeout == -1) {\r
+                res = errno;            /* had error */\r
+            }\r
+            else\r
+                res = EWOULDBLOCK;                      /* timed out */\r
+        }\r
+    }\r
+\r
+    if (res < 0)\r
+        res = errno;\r
+\r
+#endif\r
+    *timeoutp = timeout;\r
+\r
+    return res;\r
+}\r
+\r
+/* s.connect(sockaddr) method */\r
+\r
+static PyObject *\r
+sock_connect(PySocketSockObject *s, PyObject *addro)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int addrlen;\r
+    int res;\r
+    int timeout;\r
+\r
+    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
+        return NULL;\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (timeout == 1) {\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return NULL;\r
+    }\r
+    if (res != 0)\r
+        return s->errorhandler();\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(connect_doc,\r
+"connect(address)\n\\r
+\n\\r
+Connect the socket to a remote address.  For IP sockets, the address\n\\r
+is a pair (host, port).");\r
+\r
+\r
+/* s.connect_ex(sockaddr) method */\r
+\r
+static PyObject *\r
+sock_connect_ex(PySocketSockObject *s, PyObject *addro)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int addrlen;\r
+    int res;\r
+    int timeout;\r
+\r
+    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen))\r
+        return NULL;\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = internal_connect(s, SAS2SA(&addrbuf), addrlen, &timeout);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* Signals are not errors (though they may raise exceptions).  Adapted\r
+       from PyErr_SetFromErrnoWithFilenameObject(). */\r
+#ifdef EINTR\r
+    if (res == EINTR && PyErr_CheckSignals())\r
+        return NULL;\r
+#endif\r
+\r
+    return PyInt_FromLong((long) res);\r
+}\r
+\r
+PyDoc_STRVAR(connect_ex_doc,\r
+"connect_ex(address) -> errno\n\\r
+\n\\r
+This is like connect(address), but returns an error code (the errno value)\n\\r
+instead of raising an exception when an error occurs.");\r
+\r
+\r
+/* s.fileno() method */\r
+\r
+static PyObject *\r
+sock_fileno(PySocketSockObject *s)\r
+{\r
+#if SIZEOF_SOCKET_T <= SIZEOF_LONG\r
+    return PyInt_FromLong((long) s->sock_fd);\r
+#else\r
+    return PyLong_FromLongLong((PY_LONG_LONG)s->sock_fd);\r
+#endif\r
+}\r
+\r
+PyDoc_STRVAR(fileno_doc,\r
+"fileno() -> integer\n\\r
+\n\\r
+Return the integer file descriptor of the socket.");\r
+\r
+\r
+#ifndef NO_DUP\r
+/* s.dup() method */\r
+\r
+static PyObject *\r
+sock_dup(PySocketSockObject *s)\r
+{\r
+    SOCKET_T newfd;\r
+    PyObject *sock;\r
+\r
+    newfd = dup(s->sock_fd);\r
+    if (newfd < 0)\r
+        return s->errorhandler();\r
+    sock = (PyObject *) new_sockobject(newfd,\r
+                                       s->sock_family,\r
+                                       s->sock_type,\r
+                                       s->sock_proto);\r
+    if (sock == NULL)\r
+        SOCKETCLOSE(newfd);\r
+    return sock;\r
+}\r
+\r
+PyDoc_STRVAR(dup_doc,\r
+"dup() -> socket object\n\\r
+\n\\r
+Return a new socket object connected to the same system resource.");\r
+\r
+#endif\r
+\r
+\r
+/* s.getsockname() method */\r
+\r
+static PyObject *\r
+sock_getsockname(PySocketSockObject *s)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int res;\r
+    socklen_t addrlen;\r
+\r
+    if (!getsockaddrlen(s, &addrlen))\r
+        return NULL;\r
+    memset(&addrbuf, 0, addrlen);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = getsockname(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,\r
+                        s->sock_proto);\r
+}\r
+\r
+PyDoc_STRVAR(getsockname_doc,\r
+"getsockname() -> address info\n\\r
+\n\\r
+Return the address of the local endpoint.  For IP sockets, the address\n\\r
+info is a pair (hostaddr, port).");\r
+\r
+\r
+#ifdef HAVE_GETPEERNAME         /* Cray APP doesn't have this :-( */\r
+/* s.getpeername() method */\r
+\r
+static PyObject *\r
+sock_getpeername(PySocketSockObject *s)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int res;\r
+    socklen_t addrlen;\r
+\r
+    if (!getsockaddrlen(s, &addrlen))\r
+        return NULL;\r
+    memset(&addrbuf, 0, addrlen);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = getpeername(s->sock_fd, SAS2SA(&addrbuf), &addrlen);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    return makesockaddr(s->sock_fd, SAS2SA(&addrbuf), addrlen,\r
+                        s->sock_proto);\r
+}\r
+\r
+PyDoc_STRVAR(getpeername_doc,\r
+"getpeername() -> address info\n\\r
+\n\\r
+Return the address of the remote endpoint.  For IP sockets, the address\n\\r
+info is a pair (hostaddr, port).");\r
+\r
+#endif /* HAVE_GETPEERNAME */\r
+\r
+\r
+/* s.listen(n) method */\r
+\r
+static PyObject *\r
+sock_listen(PySocketSockObject *s, PyObject *arg)\r
+{\r
+    int backlog;\r
+    int res;\r
+\r
+    backlog = _PyInt_AsInt(arg);\r
+    if (backlog == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    /* To avoid problems on systems that don't allow a negative backlog\r
+     * (which doesn't make sense anyway) we force a minimum value of 0. */\r
+    if (backlog < 0)\r
+        backlog = 0;\r
+    res = listen(s->sock_fd, backlog);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(listen_doc,\r
+"listen(backlog)\n\\r
+\n\\r
+Enable a server to accept connections.  The backlog argument must be at\n\\r
+least 0 (if it is lower, it is set to 0); it specifies the number of\n\\r
+unaccepted connections that the system will allow before refusing new\n\\r
+connections.");\r
+\r
+\r
+#ifndef NO_DUP\r
+/* s.makefile(mode) method.\r
+   Create a new open file object referring to a dupped version of\r
+   the socket's file descriptor.  (The dup() call is necessary so\r
+   that the open file and socket objects may be closed independent\r
+   of each other.)\r
+   The mode argument specifies 'r' or 'w' passed to fdopen(). */\r
+\r
+static PyObject *\r
+sock_makefile(PySocketSockObject *s, PyObject *args)\r
+{\r
+    extern int fclose(FILE *);\r
+    char *mode = "r";\r
+    int bufsize = -1;\r
+#ifdef MS_WIN32\r
+    Py_intptr_t fd;\r
+#else\r
+    int fd;\r
+#endif\r
+    FILE *fp;\r
+    PyObject *f;\r
+#ifdef __VMS\r
+    char *mode_r = "r";\r
+    char *mode_w = "w";\r
+#endif\r
+\r
+    if (!PyArg_ParseTuple(args, "|si:makefile", &mode, &bufsize))\r
+        return NULL;\r
+#ifdef __VMS\r
+    if (strcmp(mode,"rb") == 0) {\r
+        mode = mode_r;\r
+    }\r
+    else {\r
+        if (strcmp(mode,"wb") == 0) {\r
+            mode = mode_w;\r
+        }\r
+    }\r
+#endif\r
+#ifdef MS_WIN32\r
+    if (((fd = _open_osfhandle(s->sock_fd, _O_BINARY)) < 0) ||\r
+        ((fd = dup(fd)) < 0) || ((fp = fdopen(fd, mode)) == NULL))\r
+#else\r
+    if ((fd = dup(s->sock_fd)) < 0 || (fp = fdopen(fd, mode)) == NULL)\r
+#endif\r
+    {\r
+        if (fd >= 0)\r
+            SOCKETCLOSE(fd);\r
+        return s->errorhandler();\r
+    }\r
+    f = PyFile_FromFile(fp, "<socket>", mode, fclose);\r
+    if (f != NULL)\r
+        PyFile_SetBufSize(f, bufsize);\r
+    return f;\r
+}\r
+\r
+PyDoc_STRVAR(makefile_doc,\r
+"makefile([mode[, buffersize]]) -> file object\n\\r
+\n\\r
+Return a regular file object corresponding to the socket.\n\\r
+The mode and buffersize arguments are as for the built-in open() function.");\r
+\r
+#endif /* NO_DUP */\r
+\r
+/*\r
+ * This is the guts of the recv() and recv_into() methods, which reads into a\r
+ * char buffer.  If you have any inc/dec ref to do to the objects that contain\r
+ * the buffer, do it in the caller.  This function returns the number of bytes\r
+ * successfully read.  If there was an error, it returns -1.  Note that it is\r
+ * also possible that we return a number of bytes smaller than the request\r
+ * bytes.\r
+ */\r
+static ssize_t\r
+sock_recv_guts(PySocketSockObject *s, char* cbuf, int len, int flags)\r
+{\r
+    ssize_t outlen = -1;\r
+    int timeout;\r
+#ifdef __VMS\r
+    int remaining;\r
+    char *read_buf;\r
+#endif\r
+\r
+    if (!IS_SELECTABLE(s)) {\r
+        select_error();\r
+        return -1;\r
+    }\r
+\r
+#ifndef __VMS\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    timeout = internal_select_ex(s, 0, interval);\r
+    if (!timeout)\r
+        outlen = recv(s->sock_fd, cbuf, len, flags);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (timeout == 1) {\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return -1;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+    if (outlen < 0) {\r
+        /* Note: the call to errorhandler() ALWAYS indirectly returned\r
+           NULL, so ignore its return value */\r
+        s->errorhandler();\r
+        return -1;\r
+    }\r
+#else\r
+    read_buf = cbuf;\r
+    remaining = len;\r
+    while (remaining != 0) {\r
+        unsigned int segment;\r
+        int nread = -1;\r
+\r
+        segment = remaining /SEGMENT_SIZE;\r
+        if (segment != 0) {\r
+            segment = SEGMENT_SIZE;\r
+        }\r
+        else {\r
+            segment = remaining;\r
+        }\r
+\r
+        BEGIN_SELECT_LOOP(s)\r
+        Py_BEGIN_ALLOW_THREADS\r
+        timeout = internal_select_ex(s, 0, interval);\r
+        if (!timeout)\r
+            nread = recv(s->sock_fd, read_buf, segment, flags);\r
+        Py_END_ALLOW_THREADS\r
+\r
+        if (timeout == 1) {\r
+            PyErr_SetString(socket_timeout, "timed out");\r
+            return -1;\r
+        }\r
+        END_SELECT_LOOP(s)\r
+\r
+        if (nread < 0) {\r
+            s->errorhandler();\r
+            return -1;\r
+        }\r
+        if (nread != remaining) {\r
+            read_buf += nread;\r
+            break;\r
+        }\r
+\r
+        remaining -= segment;\r
+        read_buf += segment;\r
+    }\r
+    outlen = read_buf - cbuf;\r
+#endif /* !__VMS */\r
+\r
+    return outlen;\r
+}\r
+\r
+\r
+/* s.recv(nbytes [,flags]) method */\r
+\r
+static PyObject *\r
+sock_recv(PySocketSockObject *s, PyObject *args)\r
+{\r
+    int recvlen, flags = 0;\r
+    ssize_t outlen;\r
+    PyObject *buf;\r
+\r
+    if (!PyArg_ParseTuple(args, "i|i:recv", &recvlen, &flags))\r
+        return NULL;\r
+\r
+    if (recvlen < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "negative buffersize in recv");\r
+        return NULL;\r
+    }\r
+\r
+    /* Allocate a new string. */\r
+    buf = PyString_FromStringAndSize((char *) 0, recvlen);\r
+    if (buf == NULL)\r
+        return NULL;\r
+\r
+    /* Call the guts */\r
+    outlen = sock_recv_guts(s, PyString_AS_STRING(buf), recvlen, flags);\r
+    if (outlen < 0) {\r
+        /* An error occurred, release the string and return an\r
+           error. */\r
+        Py_DECREF(buf);\r
+        return NULL;\r
+    }\r
+    if (outlen != recvlen) {\r
+        /* We did not read as many bytes as we anticipated, resize the\r
+           string if possible and be successful. */\r
+        if (_PyString_Resize(&buf, outlen) < 0)\r
+            /* Oopsy, not so successful after all. */\r
+            return NULL;\r
+    }\r
+\r
+    return buf;\r
+}\r
+\r
+PyDoc_STRVAR(recv_doc,\r
+"recv(buffersize[, flags]) -> data\n\\r
+\n\\r
+Receive up to buffersize bytes from the socket.  For the optional flags\n\\r
+argument, see the Unix manual.  When no data is available, block until\n\\r
+at least one byte is available or until the remote end is closed.  When\n\\r
+the remote end is closed and all data is read, return the empty string.");\r
+\r
+\r
+/* s.recv_into(buffer, [nbytes [,flags]]) method */\r
+\r
+static PyObject*\r
+sock_recv_into(PySocketSockObject *s, PyObject *args, PyObject *kwds)\r
+{\r
+    static char *kwlist[] = {"buffer", "nbytes", "flags", 0};\r
+\r
+    int recvlen = 0, flags = 0;\r
+    ssize_t readlen;\r
+    Py_buffer buf;\r
+    Py_ssize_t buflen;\r
+\r
+    /* Get the buffer's memory */\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recv_into", kwlist,\r
+                                     &buf, &recvlen, &flags))\r
+        return NULL;\r
+    buflen = buf.len;\r
+    assert(buf.buf != 0 && buflen > 0);\r
+\r
+    if (recvlen < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "negative buffersize in recv_into");\r
+        goto error;\r
+    }\r
+    if (recvlen == 0) {\r
+        /* If nbytes was not specified, use the buffer's length */\r
+        recvlen = buflen;\r
+    }\r
+\r
+    /* Check if the buffer is large enough */\r
+    if (buflen < recvlen) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "buffer too small for requested bytes");\r
+        goto error;\r
+    }\r
+\r
+    /* Call the guts */\r
+    readlen = sock_recv_guts(s, buf.buf, recvlen, flags);\r
+    if (readlen < 0) {\r
+        /* Return an error. */\r
+        goto error;\r
+    }\r
+\r
+    PyBuffer_Release(&buf);\r
+    /* Return the number of bytes read.  Note that we do not do anything\r
+       special here in the case that readlen < recvlen. */\r
+    return PyInt_FromSsize_t(readlen);\r
+\r
+error:\r
+    PyBuffer_Release(&buf);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(recv_into_doc,\r
+"recv_into(buffer, [nbytes[, flags]]) -> nbytes_read\n\\r
+\n\\r
+A version of recv() that stores its data into a buffer rather than creating \n\\r
+a new string.  Receive up to buffersize bytes from the socket.  If buffersize \n\\r
+is not specified (or 0), receive up to the size available in the given buffer.\n\\r
+\n\\r
+See recv() for documentation about the flags.");\r
+\r
+\r
+/*\r
+ * This is the guts of the recvfrom() and recvfrom_into() methods, which reads\r
+ * into a char buffer.  If you have any inc/def ref to do to the objects that\r
+ * contain the buffer, do it in the caller.  This function returns the number\r
+ * of bytes successfully read.  If there was an error, it returns -1.  Note\r
+ * that it is also possible that we return a number of bytes smaller than the\r
+ * request bytes.\r
+ *\r
+ * 'addr' is a return value for the address object.  Note that you must decref\r
+ * it yourself.\r
+ */\r
+static ssize_t\r
+sock_recvfrom_guts(PySocketSockObject *s, char* cbuf, int len, int flags,\r
+                   PyObject** addr)\r
+{\r
+    sock_addr_t addrbuf;\r
+    int timeout;\r
+    ssize_t n = -1;\r
+    socklen_t addrlen;\r
+\r
+    *addr = NULL;\r
+\r
+    if (!getsockaddrlen(s, &addrlen))\r
+        return -1;\r
+\r
+    if (!IS_SELECTABLE(s)) {\r
+        select_error();\r
+        return -1;\r
+    }\r
+\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    memset(&addrbuf, 0, addrlen);\r
+    timeout = internal_select_ex(s, 0, interval);\r
+    if (!timeout) {\r
+#ifndef MS_WINDOWS\r
+#if defined(PYOS_OS2) && !defined(PYCC_GCC)\r
+        n = recvfrom(s->sock_fd, cbuf, len, flags,\r
+                     SAS2SA(&addrbuf), &addrlen);\r
+#else\r
+        n = recvfrom(s->sock_fd, cbuf, len, flags,\r
+                     (void *) &addrbuf, &addrlen);\r
+#endif\r
+#else\r
+        n = recvfrom(s->sock_fd, cbuf, len, flags,\r
+                     SAS2SA(&addrbuf), &addrlen);\r
+#endif\r
+    }\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (timeout == 1) {\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return -1;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+    if (n < 0) {\r
+        s->errorhandler();\r
+        return -1;\r
+    }\r
+\r
+    if (!(*addr = makesockaddr(s->sock_fd, SAS2SA(&addrbuf),\r
+                               addrlen, s->sock_proto)))\r
+        return -1;\r
+\r
+    return n;\r
+}\r
+\r
+/* s.recvfrom(nbytes [,flags]) method */\r
+\r
+static PyObject *\r
+sock_recvfrom(PySocketSockObject *s, PyObject *args)\r
+{\r
+    PyObject *buf = NULL;\r
+    PyObject *addr = NULL;\r
+    PyObject *ret = NULL;\r
+    int recvlen, flags = 0;\r
+    ssize_t outlen;\r
+\r
+    if (!PyArg_ParseTuple(args, "i|i:recvfrom", &recvlen, &flags))\r
+        return NULL;\r
+\r
+    if (recvlen < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "negative buffersize in recvfrom");\r
+        return NULL;\r
+    }\r
+\r
+    buf = PyString_FromStringAndSize((char *) 0, recvlen);\r
+    if (buf == NULL)\r
+        return NULL;\r
+\r
+    outlen = sock_recvfrom_guts(s, PyString_AS_STRING(buf),\r
+                                recvlen, flags, &addr);\r
+    if (outlen < 0) {\r
+        goto finally;\r
+    }\r
+\r
+    if (outlen != recvlen) {\r
+        /* We did not read as many bytes as we anticipated, resize the\r
+           string if possible and be successful. */\r
+        if (_PyString_Resize(&buf, outlen) < 0)\r
+            /* Oopsy, not so successful after all. */\r
+            goto finally;\r
+    }\r
+\r
+    ret = PyTuple_Pack(2, buf, addr);\r
+\r
+finally:\r
+    Py_XDECREF(buf);\r
+    Py_XDECREF(addr);\r
+    return ret;\r
+}\r
+\r
+PyDoc_STRVAR(recvfrom_doc,\r
+"recvfrom(buffersize[, flags]) -> (data, address info)\n\\r
+\n\\r
+Like recv(buffersize, flags) but also return the sender's address info.");\r
+\r
+\r
+/* s.recvfrom_into(buffer[, nbytes [,flags]]) method */\r
+\r
+static PyObject *\r
+sock_recvfrom_into(PySocketSockObject *s, PyObject *args, PyObject* kwds)\r
+{\r
+    static char *kwlist[] = {"buffer", "nbytes", "flags", 0};\r
+\r
+    int recvlen = 0, flags = 0;\r
+    ssize_t readlen;\r
+    Py_buffer buf;\r
+    int buflen;\r
+\r
+    PyObject *addr = NULL;\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds, "w*|ii:recvfrom_into",\r
+                                     kwlist, &buf,\r
+                                     &recvlen, &flags))\r
+        return NULL;\r
+    buflen = buf.len;\r
+\r
+    if (recvlen < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "negative buffersize in recvfrom_into");\r
+        goto error;\r
+    }\r
+    if (recvlen == 0) {\r
+        /* If nbytes was not specified, use the buffer's length */\r
+        recvlen = buflen;\r
+    } else if (recvlen > buflen) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "nbytes is greater than the length of the buffer");\r
+        goto error;\r
+    }\r
+\r
+    readlen = sock_recvfrom_guts(s, buf.buf, recvlen, flags, &addr);\r
+    if (readlen < 0) {\r
+        /* Return an error */\r
+        goto error;\r
+    }\r
+\r
+    PyBuffer_Release(&buf);\r
+    /* Return the number of bytes read and the address.  Note that we do\r
+       not do anything special here in the case that readlen < recvlen. */\r
+    return Py_BuildValue("lN", readlen, addr);\r
+\r
+error:\r
+    Py_XDECREF(addr);\r
+    PyBuffer_Release(&buf);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(recvfrom_into_doc,\r
+"recvfrom_into(buffer[, nbytes[, flags]]) -> (nbytes, address info)\n\\r
+\n\\r
+Like recv_into(buffer[, nbytes[, flags]]) but also return the sender's address info.");\r
+\r
+\r
+/* s.send(data [,flags]) method */\r
+\r
+static PyObject *\r
+sock_send(PySocketSockObject *s, PyObject *args)\r
+{\r
+    char *buf;\r
+    int len, n = -1, flags = 0, timeout;\r
+    Py_buffer pbuf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|i:send", &pbuf, &flags))\r
+        return NULL;\r
+\r
+    if (!IS_SELECTABLE(s)) {\r
+        PyBuffer_Release(&pbuf);\r
+        return select_error();\r
+    }\r
+    buf = pbuf.buf;\r
+    len = pbuf.len;\r
+\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    timeout = internal_select_ex(s, 1, interval);\r
+    if (!timeout)\r
+#ifdef __VMS\r
+        n = sendsegmented(s->sock_fd, buf, len, flags);\r
+#else\r
+        n = send(s->sock_fd, buf, len, flags);\r
+#endif\r
+    Py_END_ALLOW_THREADS\r
+    if (timeout == 1) {\r
+        PyBuffer_Release(&pbuf);\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return NULL;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+\r
+    PyBuffer_Release(&pbuf);\r
+    if (n < 0)\r
+        return s->errorhandler();\r
+    return PyInt_FromLong((long)n);\r
+}\r
+\r
+PyDoc_STRVAR(send_doc,\r
+"send(data[, flags]) -> count\n\\r
+\n\\r
+Send a data string to the socket.  For the optional flags\n\\r
+argument, see the Unix manual.  Return the number of bytes\n\\r
+sent; this may be less than len(data) if the network is busy.");\r
+\r
+\r
+/* s.sendall(data [,flags]) method */\r
+\r
+static PyObject *\r
+sock_sendall(PySocketSockObject *s, PyObject *args)\r
+{\r
+    char *buf;\r
+    int len, n = -1, flags = 0, timeout, saved_errno;\r
+    Py_buffer pbuf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s*|i:sendall", &pbuf, &flags))\r
+        return NULL;\r
+    buf = pbuf.buf;\r
+    len = pbuf.len;\r
+\r
+    if (!IS_SELECTABLE(s)) {\r
+        PyBuffer_Release(&pbuf);\r
+        return select_error();\r
+    }\r
+\r
+    do {\r
+        BEGIN_SELECT_LOOP(s)\r
+        Py_BEGIN_ALLOW_THREADS\r
+        timeout = internal_select_ex(s, 1, interval);\r
+        n = -1;\r
+        if (!timeout) {\r
+#ifdef __VMS\r
+            n = sendsegmented(s->sock_fd, buf, len, flags);\r
+#else\r
+            n = send(s->sock_fd, buf, len, flags);\r
+#endif\r
+        }\r
+        Py_END_ALLOW_THREADS\r
+        if (timeout == 1) {\r
+            PyBuffer_Release(&pbuf);\r
+            PyErr_SetString(socket_timeout, "timed out");\r
+            return NULL;\r
+        }\r
+        END_SELECT_LOOP(s)\r
+        /* PyErr_CheckSignals() might change errno */\r
+        saved_errno = errno;\r
+        /* We must run our signal handlers before looping again.\r
+           send() can return a successful partial write when it is\r
+           interrupted, so we can't restrict ourselves to EINTR. */\r
+        if (PyErr_CheckSignals()) {\r
+            PyBuffer_Release(&pbuf);\r
+            return NULL;\r
+        }\r
+        if (n < 0) {\r
+            /* If interrupted, try again */\r
+            if (saved_errno == EINTR)\r
+                continue;\r
+            else\r
+                break;\r
+        }\r
+        buf += n;\r
+        len -= n;\r
+    } while (len > 0);\r
+    PyBuffer_Release(&pbuf);\r
+\r
+    if (n < 0)\r
+        return s->errorhandler();\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(sendall_doc,\r
+"sendall(data[, flags])\n\\r
+\n\\r
+Send a data string to the socket.  For the optional flags\n\\r
+argument, see the Unix manual.  This calls send() repeatedly\n\\r
+until all data is sent.  If an error occurs, it's impossible\n\\r
+to tell how much data has been sent.");\r
+\r
+\r
+/* s.sendto(data, [flags,] sockaddr) method */\r
+\r
+static PyObject *\r
+sock_sendto(PySocketSockObject *s, PyObject *args)\r
+{\r
+    Py_buffer pbuf;\r
+    PyObject *addro;\r
+    char *buf;\r
+    Py_ssize_t len;\r
+    sock_addr_t addrbuf;\r
+    int addrlen, flags, timeout;\r
+    long n = -1;\r
+    int arglen;\r
+\r
+    flags = 0;\r
+    arglen = PyTuple_Size(args);\r
+    switch(arglen) {\r
+        case 2:\r
+            PyArg_ParseTuple(args, "s*O:sendto", &pbuf, &addro);\r
+            break;\r
+        case 3:\r
+            PyArg_ParseTuple(args, "s*iO:sendto", &pbuf, &flags, &addro);\r
+            break;\r
+        default:\r
+            PyErr_Format(PyExc_TypeError, "sendto() takes 2 or 3"\r
+                         " arguments (%d given)", arglen);\r
+    }\r
+    if (PyErr_Occurred())\r
+        return NULL;\r
+\r
+    buf = pbuf.buf;\r
+    len = pbuf.len;\r
+\r
+    if (!IS_SELECTABLE(s)) {\r
+        PyBuffer_Release(&pbuf);\r
+        return select_error();\r
+    }\r
+\r
+    if (!getsockaddrarg(s, addro, SAS2SA(&addrbuf), &addrlen)) {\r
+        PyBuffer_Release(&pbuf);\r
+        return NULL;\r
+    }\r
+\r
+    BEGIN_SELECT_LOOP(s)\r
+    Py_BEGIN_ALLOW_THREADS\r
+    timeout = internal_select_ex(s, 1, interval);\r
+    if (!timeout)\r
+        n = sendto(s->sock_fd, buf, len, flags, SAS2SA(&addrbuf), addrlen);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (timeout == 1) {\r
+        PyBuffer_Release(&pbuf);\r
+        PyErr_SetString(socket_timeout, "timed out");\r
+        return NULL;\r
+    }\r
+    END_SELECT_LOOP(s)\r
+    PyBuffer_Release(&pbuf);\r
+    if (n < 0)\r
+        return s->errorhandler();\r
+    return PyInt_FromLong((long)n);\r
+}\r
+\r
+PyDoc_STRVAR(sendto_doc,\r
+"sendto(data[, flags], address) -> count\n\\r
+\n\\r
+Like send(data, flags) but allows specifying the destination address.\n\\r
+For IP sockets, the address is a pair (hostaddr, port).");\r
+\r
+\r
+/* s.shutdown(how) method */\r
+\r
+static PyObject *\r
+sock_shutdown(PySocketSockObject *s, PyObject *arg)\r
+{\r
+    int how;\r
+    int res;\r
+\r
+    how = _PyInt_AsInt(arg);\r
+    if (how == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = shutdown(s->sock_fd, how);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return s->errorhandler();\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(shutdown_doc,\r
+"shutdown(flag)\n\\r
+\n\\r
+Shut down the reading side of the socket (flag == SHUT_RD), the writing side\n\\r
+of the socket (flag == SHUT_WR), or both ends (flag == SHUT_RDWR).");\r
+\r
+#if defined(MS_WINDOWS) && defined(SIO_RCVALL)\r
+static PyObject*\r
+sock_ioctl(PySocketSockObject *s, PyObject *arg)\r
+{\r
+    unsigned long cmd = SIO_RCVALL;\r
+    PyObject *argO;\r
+    DWORD recv;\r
+\r
+    if (!PyArg_ParseTuple(arg, "kO:ioctl", &cmd, &argO))\r
+        return NULL;\r
+\r
+    switch (cmd) {\r
+    case SIO_RCVALL: {\r
+        unsigned int option = RCVALL_ON;\r
+        if (!PyArg_ParseTuple(arg, "kI:ioctl", &cmd, &option))\r
+            return NULL;\r
+        if (WSAIoctl(s->sock_fd, cmd, &option, sizeof(option),\r
+                         NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {\r
+            return set_error();\r
+        }\r
+        return PyLong_FromUnsignedLong(recv); }\r
+    case SIO_KEEPALIVE_VALS: {\r
+        struct tcp_keepalive ka;\r
+        if (!PyArg_ParseTuple(arg, "k(kkk):ioctl", &cmd,\r
+                        &ka.onoff, &ka.keepalivetime, &ka.keepaliveinterval))\r
+            return NULL;\r
+        if (WSAIoctl(s->sock_fd, cmd, &ka, sizeof(ka),\r
+                         NULL, 0, &recv, NULL, NULL) == SOCKET_ERROR) {\r
+            return set_error();\r
+        }\r
+        return PyLong_FromUnsignedLong(recv); }\r
+    default:\r
+        PyErr_Format(PyExc_ValueError, "invalid ioctl command %d", cmd);\r
+        return NULL;\r
+    }\r
+}\r
+PyDoc_STRVAR(sock_ioctl_doc,\r
+"ioctl(cmd, option) -> long\n\\r
+\n\\r
+Control the socket with WSAIoctl syscall. Currently supported 'cmd' values are\n\\r
+SIO_RCVALL:  'option' must be one of the socket.RCVALL_* constants.\n\\r
+SIO_KEEPALIVE_VALS:  'option' is a tuple of (onoff, timeout, interval).");\r
+\r
+#endif\r
+\r
+/* List of methods for socket objects */\r
+\r
+static PyMethodDef sock_methods[] = {\r
+    {"accept",            (PyCFunction)sock_accept, METH_NOARGS,\r
+                      accept_doc},\r
+    {"bind",              (PyCFunction)sock_bind, METH_O,\r
+                      bind_doc},\r
+    {"close",             (PyCFunction)sock_close, METH_NOARGS,\r
+                      close_doc},\r
+    {"connect",           (PyCFunction)sock_connect, METH_O,\r
+                      connect_doc},\r
+    {"connect_ex",        (PyCFunction)sock_connect_ex, METH_O,\r
+                      connect_ex_doc},\r
+#ifndef NO_DUP\r
+    {"dup",               (PyCFunction)sock_dup, METH_NOARGS,\r
+                      dup_doc},\r
+#endif\r
+    {"fileno",            (PyCFunction)sock_fileno, METH_NOARGS,\r
+                      fileno_doc},\r
+#ifdef HAVE_GETPEERNAME\r
+    {"getpeername",       (PyCFunction)sock_getpeername,\r
+                      METH_NOARGS, getpeername_doc},\r
+#endif\r
+    {"getsockname",       (PyCFunction)sock_getsockname,\r
+                      METH_NOARGS, getsockname_doc},\r
+    {"getsockopt",        (PyCFunction)sock_getsockopt, METH_VARARGS,\r
+                      getsockopt_doc},\r
+#if defined(MS_WINDOWS) && defined(SIO_RCVALL)\r
+    {"ioctl",             (PyCFunction)sock_ioctl, METH_VARARGS,\r
+                      sock_ioctl_doc},\r
+#endif\r
+    {"listen",            (PyCFunction)sock_listen, METH_O,\r
+                      listen_doc},\r
+#ifndef NO_DUP\r
+    {"makefile",          (PyCFunction)sock_makefile, METH_VARARGS,\r
+                      makefile_doc},\r
+#endif\r
+    {"recv",              (PyCFunction)sock_recv, METH_VARARGS,\r
+                      recv_doc},\r
+    {"recv_into",         (PyCFunction)sock_recv_into, METH_VARARGS | METH_KEYWORDS,\r
+                      recv_into_doc},\r
+    {"recvfrom",          (PyCFunction)sock_recvfrom, METH_VARARGS,\r
+                      recvfrom_doc},\r
+    {"recvfrom_into",  (PyCFunction)sock_recvfrom_into, METH_VARARGS | METH_KEYWORDS,\r
+                      recvfrom_into_doc},\r
+    {"send",              (PyCFunction)sock_send, METH_VARARGS,\r
+                      send_doc},\r
+    {"sendall",           (PyCFunction)sock_sendall, METH_VARARGS,\r
+                      sendall_doc},\r
+    {"sendto",            (PyCFunction)sock_sendto, METH_VARARGS,\r
+                      sendto_doc},\r
+    {"setblocking",       (PyCFunction)sock_setblocking, METH_O,\r
+                      setblocking_doc},\r
+    {"settimeout",    (PyCFunction)sock_settimeout, METH_O,\r
+                      settimeout_doc},\r
+    {"gettimeout",    (PyCFunction)sock_gettimeout, METH_NOARGS,\r
+                      gettimeout_doc},\r
+    {"setsockopt",        (PyCFunction)sock_setsockopt, METH_VARARGS,\r
+                      setsockopt_doc},\r
+    {"shutdown",          (PyCFunction)sock_shutdown, METH_O,\r
+                      shutdown_doc},\r
+#ifdef RISCOS\r
+    {"sleeptaskw",        (PyCFunction)sock_sleeptaskw, METH_O,\r
+                      sleeptaskw_doc},\r
+#endif\r
+    {NULL,                      NULL}           /* sentinel */\r
+};\r
+\r
+/* SockObject members */\r
+static PyMemberDef sock_memberlist[] = {\r
+       {"family", T_INT, offsetof(PySocketSockObject, sock_family), READONLY, "the socket family"},\r
+       {"type", T_INT, offsetof(PySocketSockObject, sock_type), READONLY, "the socket type"},\r
+       {"proto", T_INT, offsetof(PySocketSockObject, sock_proto), READONLY, "the socket protocol"},\r
+       {"timeout", T_DOUBLE, offsetof(PySocketSockObject, sock_timeout), READONLY, "the socket timeout"},\r
+       {0},\r
+};\r
+\r
+/* Deallocate a socket object in response to the last Py_DECREF().\r
+   First close the file description. */\r
+\r
+static void\r
+sock_dealloc(PySocketSockObject *s)\r
+{\r
+    if (s->sock_fd != -1)\r
+        (void) SOCKETCLOSE(s->sock_fd);\r
+    if (s->weakreflist != NULL)\r
+        PyObject_ClearWeakRefs((PyObject *)s);\r
+    Py_TYPE(s)->tp_free((PyObject *)s);\r
+}\r
+\r
+\r
+static PyObject *\r
+sock_repr(PySocketSockObject *s)\r
+{\r
+    char buf[512];\r
+    long sock_fd;\r
+    /* On Windows, this test is needed because SOCKET_T is unsigned */\r
+    if (s->sock_fd == INVALID_SOCKET) {\r
+        sock_fd = -1;\r
+    }\r
+#if SIZEOF_SOCKET_T > SIZEOF_LONG\r
+    else if (s->sock_fd > LONG_MAX) {\r
+        /* this can occur on Win64, and actually there is a special\r
+           ugly printf formatter for decimal pointer length integer\r
+           printing, only bother if necessary*/\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "no printf formatter to display "\r
+                        "the socket descriptor in decimal");\r
+        return NULL;\r
+    }\r
+#endif\r
+    else\r
+        sock_fd = (long)s->sock_fd;\r
+    PyOS_snprintf(\r
+        buf, sizeof(buf),\r
+        "<socket object, fd=%ld, family=%d, type=%d, protocol=%d>",\r
+        sock_fd, s->sock_family,\r
+        s->sock_type,\r
+        s->sock_proto);\r
+    return PyString_FromString(buf);\r
+}\r
+\r
+\r
+/* Create a new, uninitialized socket object. */\r
+\r
+static PyObject *\r
+sock_new(PyTypeObject *type, PyObject *args, PyObject *kwds)\r
+{\r
+    PyObject *new;\r
+\r
+    new = type->tp_alloc(type, 0);\r
+    if (new != NULL) {\r
+        ((PySocketSockObject *)new)->sock_fd = -1;\r
+        ((PySocketSockObject *)new)->sock_timeout = -1.0;\r
+        ((PySocketSockObject *)new)->errorhandler = &set_error;\r
+        ((PySocketSockObject *)new)->weakreflist = NULL;\r
+    }\r
+    return new;\r
+}\r
+\r
+\r
+/* Initialize a new socket object. */\r
+\r
+/*ARGSUSED*/\r
+static int\r
+sock_initobj(PyObject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    PySocketSockObject *s = (PySocketSockObject *)self;\r
+    SOCKET_T fd;\r
+    int family = AF_INET, type = SOCK_STREAM, proto = 0;\r
+    static char *keywords[] = {"family", "type", "proto", 0};\r
+\r
+    if (!PyArg_ParseTupleAndKeywords(args, kwds,\r
+                                     "|iii:socket", keywords,\r
+                                     &family, &type, &proto))\r
+        return -1;\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    fd = socket(family, type, proto);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    if (fd == INVALID_SOCKET) {\r
+        set_error();\r
+        return -1;\r
+    }\r
+    init_sockobject(s, fd, family, type, proto);\r
+\r
+    return 0;\r
+\r
+}\r
+\r
+\r
+/* Type object for socket objects. */\r
+\r
+static PyTypeObject sock_type = {\r
+    PyVarObject_HEAD_INIT(0, 0)         /* Must fill in type value later */\r
+    "_socket.socket",                           /* tp_name */\r
+    sizeof(PySocketSockObject),                 /* tp_basicsize */\r
+    0,                                          /* tp_itemsize */\r
+    (destructor)sock_dealloc,                   /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    (reprfunc)sock_repr,                        /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */\r
+    sock_doc,                                   /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    offsetof(PySocketSockObject, weakreflist),  /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    sock_methods,                               /* tp_methods */\r
+    sock_memberlist,                            /* tp_members */\r
+    0,                                          /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    sock_initobj,                               /* tp_init */\r
+    PyType_GenericAlloc,                        /* tp_alloc */\r
+    sock_new,                                   /* tp_new */\r
+    PyObject_Del,                               /* tp_free */\r
+};\r
+\r
+\r
+/* Python interface to gethostname(). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_gethostname(PyObject *self, PyObject *unused)\r
+{\r
+    char buf[1024];\r
+    int res;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    res = gethostname(buf, (int) sizeof buf - 1);\r
+    Py_END_ALLOW_THREADS\r
+    if (res < 0)\r
+        return set_error();\r
+    buf[sizeof buf - 1] = '\0';\r
+    return PyString_FromString(buf);\r
+}\r
+\r
+PyDoc_STRVAR(gethostname_doc,\r
+"gethostname() -> string\n\\r
+\n\\r
+Return the current host name.");\r
+\r
+\r
+/* Python interface to gethostbyname(name). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_gethostbyname(PyObject *self, PyObject *args)\r
+{\r
+    char *name;\r
+    sock_addr_t addrbuf;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:gethostbyname", &name))\r
+        return NULL;\r
+    if (setipaddr(name, SAS2SA(&addrbuf),  sizeof(addrbuf), AF_INET) < 0)\r
+        return NULL;\r
+    return makeipaddr(SAS2SA(&addrbuf), sizeof(struct sockaddr_in));\r
+}\r
+\r
+PyDoc_STRVAR(gethostbyname_doc,\r
+"gethostbyname(host) -> address\n\\r
+\n\\r
+Return the IP address (a string of the form '255.255.255.255') for a host.");\r
+\r
+\r
+/* Convenience function common to gethostbyname_ex and gethostbyaddr */\r
+\r
+static PyObject *\r
+gethost_common(struct hostent *h, struct sockaddr *addr, int alen, int af)\r
+{\r
+    char **pch;\r
+    PyObject *rtn_tuple = (PyObject *)NULL;\r
+    PyObject *name_list = (PyObject *)NULL;\r
+    PyObject *addr_list = (PyObject *)NULL;\r
+    PyObject *tmp;\r
+\r
+    if (h == NULL) {\r
+        /* Let's get real error message to return */\r
+#ifndef RISCOS\r
+        set_herror(h_errno);\r
+#else\r
+        PyErr_SetString(socket_error, "host not found");\r
+#endif\r
+        return NULL;\r
+    }\r
+\r
+    if (h->h_addrtype != af) {\r
+        /* Let's get real error message to return */\r
+        PyErr_SetString(socket_error,\r
+                        (char *)strerror(EAFNOSUPPORT));\r
+\r
+        return NULL;\r
+    }\r
+\r
+    switch (af) {\r
+\r
+    case AF_INET:\r
+        if (alen < sizeof(struct sockaddr_in))\r
+            return NULL;\r
+        break;\r
+\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+        if (alen < sizeof(struct sockaddr_in6))\r
+            return NULL;\r
+        break;\r
+#endif\r
+\r
+    }\r
+\r
+    if ((name_list = PyList_New(0)) == NULL)\r
+        goto err;\r
+\r
+    if ((addr_list = PyList_New(0)) == NULL)\r
+        goto err;\r
+\r
+    /* SF #1511317: h_aliases can be NULL */\r
+    if (h->h_aliases) {\r
+        for (pch = h->h_aliases; *pch != NULL; pch++) {\r
+            int status;\r
+            tmp = PyString_FromString(*pch);\r
+            if (tmp == NULL)\r
+                goto err;\r
+\r
+            status = PyList_Append(name_list, tmp);\r
+            Py_DECREF(tmp);\r
+\r
+            if (status)\r
+                goto err;\r
+        }\r
+    }\r
+\r
+    for (pch = h->h_addr_list; *pch != NULL; pch++) {\r
+        int status;\r
+\r
+        switch (af) {\r
+\r
+        case AF_INET:\r
+            {\r
+            struct sockaddr_in sin;\r
+            memset(&sin, 0, sizeof(sin));\r
+            sin.sin_family = af;\r
+#ifdef HAVE_SOCKADDR_SA_LEN\r
+            sin.sin_len = sizeof(sin);\r
+#endif\r
+            memcpy(&sin.sin_addr, *pch, sizeof(sin.sin_addr));\r
+            tmp = makeipaddr((struct sockaddr *)&sin, sizeof(sin));\r
+\r
+            if (pch == h->h_addr_list && alen >= sizeof(sin))\r
+                memcpy((char *) addr, &sin, sizeof(sin));\r
+            break;\r
+            }\r
+\r
+#ifdef ENABLE_IPV6\r
+        case AF_INET6:\r
+            {\r
+            struct sockaddr_in6 sin6;\r
+            memset(&sin6, 0, sizeof(sin6));\r
+            sin6.sin6_family = af;\r
+#ifdef HAVE_SOCKADDR_SA_LEN\r
+            sin6.sin6_len = sizeof(sin6);\r
+#endif\r
+            memcpy(&sin6.sin6_addr, *pch, sizeof(sin6.sin6_addr));\r
+            tmp = makeipaddr((struct sockaddr *)&sin6,\r
+                sizeof(sin6));\r
+\r
+            if (pch == h->h_addr_list && alen >= sizeof(sin6))\r
+                memcpy((char *) addr, &sin6, sizeof(sin6));\r
+            break;\r
+            }\r
+#endif\r
+\r
+        default:                /* can't happen */\r
+            PyErr_SetString(socket_error,\r
+                            "unsupported address family");\r
+            return NULL;\r
+        }\r
+\r
+        if (tmp == NULL)\r
+            goto err;\r
+\r
+        status = PyList_Append(addr_list, tmp);\r
+        Py_DECREF(tmp);\r
+\r
+        if (status)\r
+            goto err;\r
+    }\r
+\r
+    rtn_tuple = Py_BuildValue("sOO", h->h_name, name_list, addr_list);\r
+\r
+ err:\r
+    Py_XDECREF(name_list);\r
+    Py_XDECREF(addr_list);\r
+    return rtn_tuple;\r
+}\r
+\r
+\r
+/* Python interface to gethostbyname_ex(name). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_gethostbyname_ex(PyObject *self, PyObject *args)\r
+{\r
+    char *name;\r
+    struct hostent *h;\r
+#ifdef ENABLE_IPV6\r
+    struct sockaddr_storage addr;\r
+#else\r
+    struct sockaddr_in addr;\r
+#endif\r
+    struct sockaddr *sa;\r
+    PyObject *ret;\r
+#ifdef HAVE_GETHOSTBYNAME_R\r
+    struct hostent hp_allocated;\r
+#ifdef HAVE_GETHOSTBYNAME_R_3_ARG\r
+    struct hostent_data data;\r
+#else\r
+    char buf[16384];\r
+    int buf_len = (sizeof buf) - 1;\r
+    int errnop;\r
+#endif\r
+#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
+    int result;\r
+#endif\r
+#endif /* HAVE_GETHOSTBYNAME_R */\r
+\r
+    if (!PyArg_ParseTuple(args, "s:gethostbyname_ex", &name))\r
+        return NULL;\r
+    if (setipaddr(name, (struct sockaddr *)&addr, sizeof(addr), AF_INET) < 0)\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+#ifdef HAVE_GETHOSTBYNAME_R\r
+#if   defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
+    result = gethostbyname_r(name, &hp_allocated, buf, buf_len,\r
+                             &h, &errnop);\r
+#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)\r
+    h = gethostbyname_r(name, &hp_allocated, buf, buf_len, &errnop);\r
+#else /* HAVE_GETHOSTBYNAME_R_3_ARG */\r
+    memset((void *) &data, '\0', sizeof(data));\r
+    result = gethostbyname_r(name, &hp_allocated, &data);\r
+    h = (result != 0) ? NULL : &hp_allocated;\r
+#endif\r
+#else /* not HAVE_GETHOSTBYNAME_R */\r
+#ifdef USE_GETHOSTBYNAME_LOCK\r
+    PyThread_acquire_lock(netdb_lock, 1);\r
+#endif\r
+    h = gethostbyname(name);\r
+#endif /* HAVE_GETHOSTBYNAME_R */\r
+    Py_END_ALLOW_THREADS\r
+    /* Some C libraries would require addr.__ss_family instead of\r
+       addr.ss_family.\r
+       Therefore, we cast the sockaddr_storage into sockaddr to\r
+       access sa_family. */\r
+    sa = (struct sockaddr*)&addr;\r
+    ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr),\r
+                         sa->sa_family);\r
+#ifdef USE_GETHOSTBYNAME_LOCK\r
+    PyThread_release_lock(netdb_lock);\r
+#endif\r
+    return ret;\r
+}\r
+\r
+PyDoc_STRVAR(ghbn_ex_doc,\r
+"gethostbyname_ex(host) -> (name, aliaslist, addresslist)\n\\r
+\n\\r
+Return the true host name, a list of aliases, and a list of IP addresses,\n\\r
+for a host.  The host argument is a string giving a host name or IP number.");\r
+\r
+\r
+/* Python interface to gethostbyaddr(IP). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_gethostbyaddr(PyObject *self, PyObject *args)\r
+{\r
+#ifdef ENABLE_IPV6\r
+    struct sockaddr_storage addr;\r
+#else\r
+    struct sockaddr_in addr;\r
+#endif\r
+    struct sockaddr *sa = (struct sockaddr *)&addr;\r
+    char *ip_num;\r
+    struct hostent *h;\r
+    PyObject *ret;\r
+#ifdef HAVE_GETHOSTBYNAME_R\r
+    struct hostent hp_allocated;\r
+#ifdef HAVE_GETHOSTBYNAME_R_3_ARG\r
+    struct hostent_data data;\r
+#else\r
+    /* glibcs up to 2.10 assume that the buf argument to\r
+       gethostbyaddr_r is 8-byte aligned, which at least llvm-gcc\r
+       does not ensure. The attribute below instructs the compiler\r
+       to maintain this alignment. */\r
+    char buf[16384] Py_ALIGNED(8);\r
+    int buf_len = (sizeof buf) - 1;\r
+    int errnop;\r
+#endif\r
+#if defined(HAVE_GETHOSTBYNAME_R_3_ARG) || defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
+    int result;\r
+#endif\r
+#endif /* HAVE_GETHOSTBYNAME_R */\r
+    char *ap;\r
+    int al;\r
+    int af;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:gethostbyaddr", &ip_num))\r
+        return NULL;\r
+    af = AF_UNSPEC;\r
+    if (setipaddr(ip_num, sa, sizeof(addr), af) < 0)\r
+        return NULL;\r
+    af = sa->sa_family;\r
+    ap = NULL;\r
+    switch (af) {\r
+    case AF_INET:\r
+        ap = (char *)&((struct sockaddr_in *)sa)->sin_addr;\r
+        al = sizeof(((struct sockaddr_in *)sa)->sin_addr);\r
+        break;\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+        ap = (char *)&((struct sockaddr_in6 *)sa)->sin6_addr;\r
+        al = sizeof(((struct sockaddr_in6 *)sa)->sin6_addr);\r
+        break;\r
+#endif\r
+    default:\r
+        PyErr_SetString(socket_error, "unsupported address family");\r
+        return NULL;\r
+    }\r
+    Py_BEGIN_ALLOW_THREADS\r
+#ifdef HAVE_GETHOSTBYNAME_R\r
+#if   defined(HAVE_GETHOSTBYNAME_R_6_ARG)\r
+    result = gethostbyaddr_r(ap, al, af,\r
+        &hp_allocated, buf, buf_len,\r
+        &h, &errnop);\r
+#elif defined(HAVE_GETHOSTBYNAME_R_5_ARG)\r
+    h = gethostbyaddr_r(ap, al, af,\r
+                        &hp_allocated, buf, buf_len, &errnop);\r
+#else /* HAVE_GETHOSTBYNAME_R_3_ARG */\r
+    memset((void *) &data, '\0', sizeof(data));\r
+    result = gethostbyaddr_r(ap, al, af, &hp_allocated, &data);\r
+    h = (result != 0) ? NULL : &hp_allocated;\r
+#endif\r
+#else /* not HAVE_GETHOSTBYNAME_R */\r
+#ifdef USE_GETHOSTBYNAME_LOCK\r
+    PyThread_acquire_lock(netdb_lock, 1);\r
+#endif\r
+    h = gethostbyaddr(ap, al, af);\r
+#endif /* HAVE_GETHOSTBYNAME_R */\r
+    Py_END_ALLOW_THREADS\r
+    ret = gethost_common(h, (struct sockaddr *)&addr, sizeof(addr), af);\r
+#ifdef USE_GETHOSTBYNAME_LOCK\r
+    PyThread_release_lock(netdb_lock);\r
+#endif\r
+    return ret;\r
+}\r
+\r
+PyDoc_STRVAR(gethostbyaddr_doc,\r
+"gethostbyaddr(host) -> (name, aliaslist, addresslist)\n\\r
+\n\\r
+Return the true host name, a list of aliases, and a list of IP addresses,\n\\r
+for a host.  The host argument is a string giving a host name or IP number.");\r
+\r
+\r
+/* Python interface to getservbyname(name).\r
+   This only returns the port number, since the other info is already\r
+   known or not useful (like the list of aliases). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_getservbyname(PyObject *self, PyObject *args)\r
+{\r
+    char *name, *proto=NULL;\r
+    struct servent *sp;\r
+    if (!PyArg_ParseTuple(args, "s|s:getservbyname", &name, &proto))\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    sp = getservbyname(name, proto);\r
+    Py_END_ALLOW_THREADS\r
+    if (sp == NULL) {\r
+        PyErr_SetString(socket_error, "service/proto not found");\r
+        return NULL;\r
+    }\r
+    return PyInt_FromLong((long) ntohs(sp->s_port));\r
+}\r
+\r
+PyDoc_STRVAR(getservbyname_doc,\r
+"getservbyname(servicename[, protocolname]) -> integer\n\\r
+\n\\r
+Return a port number from a service name and protocol name.\n\\r
+The optional protocol name, if given, should be 'tcp' or 'udp',\n\\r
+otherwise any protocol will match.");\r
+\r
+\r
+/* Python interface to getservbyport(port).\r
+   This only returns the service name, since the other info is already\r
+   known or not useful (like the list of aliases). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_getservbyport(PyObject *self, PyObject *args)\r
+{\r
+    int port;\r
+    char *proto=NULL;\r
+    struct servent *sp;\r
+    if (!PyArg_ParseTuple(args, "i|s:getservbyport", &port, &proto))\r
+        return NULL;\r
+    if (port < 0 || port > 0xffff) {\r
+        PyErr_SetString(\r
+            PyExc_OverflowError,\r
+            "getservbyport: port must be 0-65535.");\r
+        return NULL;\r
+    }\r
+    Py_BEGIN_ALLOW_THREADS\r
+    sp = getservbyport(htons((short)port), proto);\r
+    Py_END_ALLOW_THREADS\r
+    if (sp == NULL) {\r
+        PyErr_SetString(socket_error, "port/proto not found");\r
+        return NULL;\r
+    }\r
+    return PyString_FromString(sp->s_name);\r
+}\r
+\r
+PyDoc_STRVAR(getservbyport_doc,\r
+"getservbyport(port[, protocolname]) -> string\n\\r
+\n\\r
+Return the service name from a port number and protocol name.\n\\r
+The optional protocol name, if given, should be 'tcp' or 'udp',\n\\r
+otherwise any protocol will match.");\r
+\r
+/* Python interface to getprotobyname(name).\r
+   This only returns the protocol number, since the other info is\r
+   already known or not useful (like the list of aliases). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_getprotobyname(PyObject *self, PyObject *args)\r
+{\r
+    char *name;\r
+    struct protoent *sp;\r
+#ifdef __BEOS__\r
+/* Not available in BeOS yet. - [cjh] */\r
+    PyErr_SetString(socket_error, "getprotobyname not supported");\r
+    return NULL;\r
+#else\r
+    if (!PyArg_ParseTuple(args, "s:getprotobyname", &name))\r
+        return NULL;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    sp = getprotobyname(name);\r
+    Py_END_ALLOW_THREADS\r
+    if (sp == NULL) {\r
+        PyErr_SetString(socket_error, "protocol not found");\r
+        return NULL;\r
+    }\r
+    return PyInt_FromLong((long) sp->p_proto);\r
+#endif\r
+}\r
+\r
+PyDoc_STRVAR(getprotobyname_doc,\r
+"getprotobyname(name) -> integer\n\\r
+\n\\r
+Return the protocol number for the named protocol.  (Rarely used.)");\r
+\r
+\r
+#ifdef HAVE_SOCKETPAIR\r
+/* Create a pair of sockets using the socketpair() function.\r
+   Arguments as for socket() except the default family is AF_UNIX if\r
+   defined on the platform; otherwise, the default is AF_INET. */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_socketpair(PyObject *self, PyObject *args)\r
+{\r
+    PySocketSockObject *s0 = NULL, *s1 = NULL;\r
+    SOCKET_T sv[2];\r
+    int family, type = SOCK_STREAM, proto = 0;\r
+    PyObject *res = NULL;\r
+\r
+#if defined(AF_UNIX)\r
+    family = AF_UNIX;\r
+#else\r
+    family = AF_INET;\r
+#endif\r
+    if (!PyArg_ParseTuple(args, "|iii:socketpair",\r
+                          &family, &type, &proto))\r
+        return NULL;\r
+    /* Create a pair of socket fds */\r
+    if (socketpair(family, type, proto, sv) < 0)\r
+        return set_error();\r
+    s0 = new_sockobject(sv[0], family, type, proto);\r
+    if (s0 == NULL)\r
+        goto finally;\r
+    s1 = new_sockobject(sv[1], family, type, proto);\r
+    if (s1 == NULL)\r
+        goto finally;\r
+    res = PyTuple_Pack(2, s0, s1);\r
+\r
+finally:\r
+    if (res == NULL) {\r
+        if (s0 == NULL)\r
+            SOCKETCLOSE(sv[0]);\r
+        if (s1 == NULL)\r
+            SOCKETCLOSE(sv[1]);\r
+    }\r
+    Py_XDECREF(s0);\r
+    Py_XDECREF(s1);\r
+    return res;\r
+}\r
+\r
+PyDoc_STRVAR(socketpair_doc,\r
+"socketpair([family[, type[, proto]]]) -> (socket object, socket object)\n\\r
+\n\\r
+Create a pair of socket objects from the sockets returned by the platform\n\\r
+socketpair() function.\n\\r
+The arguments are the same as for socket() except the default family is\n\\r
+AF_UNIX if defined on the platform; otherwise, the default is AF_INET.");\r
+\r
+#endif /* HAVE_SOCKETPAIR */\r
+\r
+\r
+#ifndef NO_DUP\r
+/* Create a socket object from a numeric file description.\r
+   Useful e.g. if stdin is a socket.\r
+   Additional arguments as for socket(). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_fromfd(PyObject *self, PyObject *args)\r
+{\r
+    PySocketSockObject *s;\r
+    SOCKET_T fd;\r
+    int family, type, proto = 0;\r
+    if (!PyArg_ParseTuple(args, "iii|i:fromfd",\r
+                          &fd, &family, &type, &proto))\r
+        return NULL;\r
+    /* Dup the fd so it and the socket can be closed independently */\r
+    fd = dup(fd);\r
+    if (fd < 0)\r
+        return set_error();\r
+    s = new_sockobject(fd, family, type, proto);\r
+    return (PyObject *) s;\r
+}\r
+\r
+PyDoc_STRVAR(fromfd_doc,\r
+"fromfd(fd, family, type[, proto]) -> socket object\n\\r
+\n\\r
+Create a socket object from a duplicate of the given\n\\r
+file descriptor.\n\\r
+The remaining arguments are the same as for socket().");\r
+\r
+#endif /* NO_DUP */\r
+\r
+\r
+static PyObject *\r
+socket_ntohs(PyObject *self, PyObject *args)\r
+{\r
+    int x1, x2;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:ntohs", &x1)) {\r
+        return NULL;\r
+    }\r
+    if (x1 < 0) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "can't convert negative number to unsigned long");\r
+        return NULL;\r
+    }\r
+    x2 = (unsigned int)ntohs((unsigned short)x1);\r
+    return PyInt_FromLong(x2);\r
+}\r
+\r
+PyDoc_STRVAR(ntohs_doc,\r
+"ntohs(integer) -> integer\n\\r
+\n\\r
+Convert a 16-bit integer from network to host byte order.");\r
+\r
+\r
+static PyObject *\r
+socket_ntohl(PyObject *self, PyObject *arg)\r
+{\r
+    unsigned long x;\r
+\r
+    if (PyInt_Check(arg)) {\r
+        x = PyInt_AS_LONG(arg);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return NULL;\r
+        if ((long)x < 0) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+              "can't convert negative number to unsigned long");\r
+            return NULL;\r
+        }\r
+    }\r
+    else if (PyLong_Check(arg)) {\r
+        x = PyLong_AsUnsignedLong(arg);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return NULL;\r
+#if SIZEOF_LONG > 4\r
+        {\r
+            unsigned long y;\r
+            /* only want the trailing 32 bits */\r
+            y = x & 0xFFFFFFFFUL;\r
+            if (y ^ x)\r
+                return PyErr_Format(PyExc_OverflowError,\r
+                            "long int larger than 32 bits");\r
+            x = y;\r
+        }\r
+#endif\r
+    }\r
+    else\r
+        return PyErr_Format(PyExc_TypeError,\r
+                            "expected int/long, %s found",\r
+                            Py_TYPE(arg)->tp_name);\r
+    if (x == (unsigned long) -1 && PyErr_Occurred())\r
+        return NULL;\r
+    return PyLong_FromUnsignedLong(ntohl(x));\r
+}\r
+\r
+PyDoc_STRVAR(ntohl_doc,\r
+"ntohl(integer) -> integer\n\\r
+\n\\r
+Convert a 32-bit integer from network to host byte order.");\r
+\r
+\r
+static PyObject *\r
+socket_htons(PyObject *self, PyObject *args)\r
+{\r
+    int x1, x2;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:htons", &x1)) {\r
+        return NULL;\r
+    }\r
+    if (x1 < 0) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+            "can't convert negative number to unsigned long");\r
+        return NULL;\r
+    }\r
+    x2 = (unsigned int)htons((unsigned short)x1);\r
+    return PyInt_FromLong(x2);\r
+}\r
+\r
+PyDoc_STRVAR(htons_doc,\r
+"htons(integer) -> integer\n\\r
+\n\\r
+Convert a 16-bit integer from host to network byte order.");\r
+\r
+\r
+static PyObject *\r
+socket_htonl(PyObject *self, PyObject *arg)\r
+{\r
+    unsigned long x;\r
+\r
+    if (PyInt_Check(arg)) {\r
+        x = PyInt_AS_LONG(arg);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return NULL;\r
+        if ((long)x < 0) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+              "can't convert negative number to unsigned long");\r
+            return NULL;\r
+        }\r
+    }\r
+    else if (PyLong_Check(arg)) {\r
+        x = PyLong_AsUnsignedLong(arg);\r
+        if (x == (unsigned long) -1 && PyErr_Occurred())\r
+            return NULL;\r
+#if SIZEOF_LONG > 4\r
+        {\r
+            unsigned long y;\r
+            /* only want the trailing 32 bits */\r
+            y = x & 0xFFFFFFFFUL;\r
+            if (y ^ x)\r
+                return PyErr_Format(PyExc_OverflowError,\r
+                            "long int larger than 32 bits");\r
+            x = y;\r
+        }\r
+#endif\r
+    }\r
+    else\r
+        return PyErr_Format(PyExc_TypeError,\r
+                            "expected int/long, %s found",\r
+                            Py_TYPE(arg)->tp_name);\r
+    return PyLong_FromUnsignedLong(htonl((unsigned long)x));\r
+}\r
+\r
+PyDoc_STRVAR(htonl_doc,\r
+"htonl(integer) -> integer\n\\r
+\n\\r
+Convert a 32-bit integer from host to network byte order.");\r
+\r
+/* socket.inet_aton() and socket.inet_ntoa() functions. */\r
+\r
+PyDoc_STRVAR(inet_aton_doc,\r
+"inet_aton(string) -> packed 32-bit IP representation\n\\r
+\n\\r
+Convert an IP address in string format (123.45.67.89) to the 32-bit packed\n\\r
+binary format used in low-level network functions.");\r
+\r
+static PyObject*\r
+socket_inet_aton(PyObject *self, PyObject *args)\r
+{\r
+#ifndef INADDR_NONE\r
+#define INADDR_NONE (-1)\r
+#endif\r
+#ifdef HAVE_INET_ATON\r
+    struct in_addr buf;\r
+#endif\r
+\r
+#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)\r
+#if (SIZEOF_INT != 4)\r
+#error "Not sure if in_addr_t exists and int is not 32-bits."\r
+#endif\r
+    /* Have to use inet_addr() instead */\r
+    unsigned int packed_addr;\r
+#endif\r
+    char *ip_addr;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:inet_aton", &ip_addr))\r
+        return NULL;\r
+\r
+\r
+#ifdef HAVE_INET_ATON\r
+\r
+#ifdef USE_INET_ATON_WEAKLINK\r
+    if (inet_aton != NULL) {\r
+#endif\r
+    if (inet_aton(ip_addr, &buf))\r
+        return PyString_FromStringAndSize((char *)(&buf),\r
+                                          sizeof(buf));\r
+\r
+    PyErr_SetString(socket_error,\r
+                    "illegal IP address string passed to inet_aton");\r
+    return NULL;\r
+\r
+#ifdef USE_INET_ATON_WEAKLINK\r
+   } else {\r
+#endif\r
+\r
+#endif\r
+\r
+#if !defined(HAVE_INET_ATON) || defined(USE_INET_ATON_WEAKLINK)\r
+\r
+    /* special-case this address as inet_addr might return INADDR_NONE\r
+     * for this */\r
+    if (strcmp(ip_addr, "255.255.255.255") == 0) {\r
+        packed_addr = 0xFFFFFFFF;\r
+    } else {\r
+\r
+        packed_addr = inet_addr(ip_addr);\r
+\r
+        if (packed_addr == INADDR_NONE) {               /* invalid address */\r
+            PyErr_SetString(socket_error,\r
+                "illegal IP address string passed to inet_aton");\r
+            return NULL;\r
+        }\r
+    }\r
+    return PyString_FromStringAndSize((char *) &packed_addr,\r
+                                      sizeof(packed_addr));\r
+\r
+#ifdef USE_INET_ATON_WEAKLINK\r
+   }\r
+#endif\r
+\r
+#endif\r
+}\r
+\r
+PyDoc_STRVAR(inet_ntoa_doc,\r
+"inet_ntoa(packed_ip) -> ip_address_string\n\\r
+\n\\r
+Convert an IP address from 32-bit packed binary format to string format");\r
+\r
+static PyObject*\r
+socket_inet_ntoa(PyObject *self, PyObject *args)\r
+{\r
+    char *packed_str;\r
+    int addr_len;\r
+    struct in_addr packed_addr;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#:inet_ntoa", &packed_str, &addr_len)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (addr_len != sizeof(packed_addr)) {\r
+        PyErr_SetString(socket_error,\r
+            "packed IP wrong length for inet_ntoa");\r
+        return NULL;\r
+    }\r
+\r
+    memcpy(&packed_addr, packed_str, addr_len);\r
+\r
+    return PyString_FromString(inet_ntoa(packed_addr));\r
+}\r
+\r
+#ifdef HAVE_INET_PTON\r
+\r
+PyDoc_STRVAR(inet_pton_doc,\r
+"inet_pton(af, ip) -> packed IP address string\n\\r
+\n\\r
+Convert an IP address from string format to a packed string suitable\n\\r
+for use with low-level network functions.");\r
+\r
+static PyObject *\r
+socket_inet_pton(PyObject *self, PyObject *args)\r
+{\r
+    int af;\r
+    char* ip;\r
+    int retval;\r
+#ifdef ENABLE_IPV6\r
+    char packed[MAX(sizeof(struct in_addr), sizeof(struct in6_addr))];\r
+#else\r
+    char packed[sizeof(struct in_addr)];\r
+#endif\r
+    if (!PyArg_ParseTuple(args, "is:inet_pton", &af, &ip)) {\r
+        return NULL;\r
+    }\r
+\r
+#if !defined(ENABLE_IPV6) && defined(AF_INET6)\r
+    if(af == AF_INET6) {\r
+        PyErr_SetString(socket_error,\r
+                        "can't use AF_INET6, IPv6 is disabled");\r
+        return NULL;\r
+    }\r
+#endif\r
+\r
+    retval = inet_pton(af, ip, packed);\r
+    if (retval < 0) {\r
+        PyErr_SetFromErrno(socket_error);\r
+        return NULL;\r
+    } else if (retval == 0) {\r
+        PyErr_SetString(socket_error,\r
+            "illegal IP address string passed to inet_pton");\r
+        return NULL;\r
+    } else if (af == AF_INET) {\r
+        return PyString_FromStringAndSize(packed,\r
+            sizeof(struct in_addr));\r
+#ifdef ENABLE_IPV6\r
+    } else if (af == AF_INET6) {\r
+        return PyString_FromStringAndSize(packed,\r
+            sizeof(struct in6_addr));\r
+#endif\r
+    } else {\r
+        PyErr_SetString(socket_error, "unknown address family");\r
+        return NULL;\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(inet_ntop_doc,\r
+"inet_ntop(af, packed_ip) -> string formatted IP address\n\\r
+\n\\r
+Convert a packed IP address of the given family to string format.");\r
+\r
+static PyObject *\r
+socket_inet_ntop(PyObject *self, PyObject *args)\r
+{\r
+    int af;\r
+    char* packed;\r
+    int len;\r
+    const char* retval;\r
+#ifdef ENABLE_IPV6\r
+    char ip[MAX(INET_ADDRSTRLEN, INET6_ADDRSTRLEN) + 1];\r
+#else\r
+    char ip[INET_ADDRSTRLEN + 1];\r
+#endif\r
+\r
+    /* Guarantee NUL-termination for PyString_FromString() below */\r
+    memset((void *) &ip[0], '\0', sizeof(ip));\r
+\r
+    if (!PyArg_ParseTuple(args, "is#:inet_ntop", &af, &packed, &len)) {\r
+        return NULL;\r
+    }\r
+\r
+    if (af == AF_INET) {\r
+        if (len != sizeof(struct in_addr)) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                "invalid length of packed IP address string");\r
+            return NULL;\r
+        }\r
+#ifdef ENABLE_IPV6\r
+    } else if (af == AF_INET6) {\r
+        if (len != sizeof(struct in6_addr)) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                "invalid length of packed IP address string");\r
+            return NULL;\r
+        }\r
+#endif\r
+    } else {\r
+        PyErr_Format(PyExc_ValueError,\r
+            "unknown address family %d", af);\r
+        return NULL;\r
+    }\r
+\r
+    retval = inet_ntop(af, packed, ip, sizeof(ip));\r
+    if (!retval) {\r
+        PyErr_SetFromErrno(socket_error);\r
+        return NULL;\r
+    } else {\r
+        return PyString_FromString(retval);\r
+    }\r
+\r
+    /* NOTREACHED */\r
+    PyErr_SetString(PyExc_RuntimeError, "invalid handling of inet_ntop");\r
+    return NULL;\r
+}\r
+\r
+#endif /* HAVE_INET_PTON */\r
+\r
+/* Python interface to getaddrinfo(host, port). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_getaddrinfo(PyObject *self, PyObject *args)\r
+{\r
+    struct addrinfo hints, *res;\r
+    struct addrinfo *res0 = NULL;\r
+    PyObject *hobj = NULL;\r
+    PyObject *pobj = (PyObject *)NULL;\r
+    char pbuf[30];\r
+    char *hptr, *pptr;\r
+    int family, socktype, protocol, flags;\r
+    int error;\r
+    PyObject *all = (PyObject *)NULL;\r
+    PyObject *single = (PyObject *)NULL;\r
+    PyObject *idna = NULL;\r
+\r
+    family = socktype = protocol = flags = 0;\r
+    family = AF_UNSPEC;\r
+    if (!PyArg_ParseTuple(args, "OO|iiii:getaddrinfo",\r
+                          &hobj, &pobj, &family, &socktype,\r
+                          &protocol, &flags)) {\r
+        return NULL;\r
+    }\r
+    if (hobj == Py_None) {\r
+        hptr = NULL;\r
+    } else if (PyUnicode_Check(hobj)) {\r
+        idna = PyObject_CallMethod(hobj, "encode", "s", "idna");\r
+        if (!idna)\r
+            return NULL;\r
+        hptr = PyString_AsString(idna);\r
+    } else if (PyString_Check(hobj)) {\r
+        hptr = PyString_AsString(hobj);\r
+    } else {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "getaddrinfo() argument 1 must be string or None");\r
+        return NULL;\r
+    }\r
+    if (PyInt_Check(pobj) || PyLong_Check(pobj)) {\r
+        long value = PyLong_AsLong(pobj);\r
+        if (value == -1 && PyErr_Occurred())\r
+            return NULL;\r
+        PyOS_snprintf(pbuf, sizeof(pbuf), "%ld", value);\r
+        pptr = pbuf;\r
+    } else if (PyString_Check(pobj)) {\r
+        pptr = PyString_AsString(pobj);\r
+    } else if (pobj == Py_None) {\r
+        pptr = (char *)NULL;\r
+    } else {\r
+        PyErr_SetString(socket_error,\r
+                        "getaddrinfo() argument 2 must be integer or string");\r
+        goto err;\r
+    }\r
+#if defined(__APPLE__) && defined(AI_NUMERICSERV)\r
+    if ((flags & AI_NUMERICSERV) && (pptr == NULL || (pptr[0] == '0' && pptr[1] == 0))) {\r
+        /* On OSX upto at least OSX 10.8 getaddrinfo crashes\r
+        * if AI_NUMERICSERV is set and the servname is NULL or "0".\r
+        * This workaround avoids a segfault in libsystem.\r
+        */\r
+        pptr = "00";\r
+    }\r
+#endif\r
+    memset(&hints, 0, sizeof(hints));\r
+    hints.ai_family = family;\r
+    hints.ai_socktype = socktype;\r
+    hints.ai_protocol = protocol;\r
+    hints.ai_flags = flags;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    ACQUIRE_GETADDRINFO_LOCK\r
+    error = getaddrinfo(hptr, pptr, &hints, &res0);\r
+    Py_END_ALLOW_THREADS\r
+    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */\r
+    if (error) {\r
+        set_gaierror(error);\r
+        goto err;\r
+    }\r
+\r
+    all = PyList_New(0);\r
+    if (all == NULL)\r
+        goto err;\r
+    for (res = res0; res; res = res->ai_next) {\r
+        PyObject *addr =\r
+            makesockaddr(-1, res->ai_addr, res->ai_addrlen, protocol);\r
+        if (addr == NULL)\r
+            goto err;\r
+        single = Py_BuildValue("iiisO", res->ai_family,\r
+            res->ai_socktype, res->ai_protocol,\r
+            res->ai_canonname ? res->ai_canonname : "",\r
+            addr);\r
+        Py_DECREF(addr);\r
+        if (single == NULL)\r
+            goto err;\r
+\r
+        if (PyList_Append(all, single))\r
+            goto err;\r
+        Py_XDECREF(single);\r
+    }\r
+    Py_XDECREF(idna);\r
+    if (res0)\r
+        freeaddrinfo(res0);\r
+    return all;\r
+ err:\r
+    Py_XDECREF(single);\r
+    Py_XDECREF(all);\r
+    Py_XDECREF(idna);\r
+    if (res0)\r
+        freeaddrinfo(res0);\r
+    return (PyObject *)NULL;\r
+}\r
+\r
+PyDoc_STRVAR(getaddrinfo_doc,\r
+"getaddrinfo(host, port [, family, socktype, proto, flags])\n\\r
+    -> list of (family, socktype, proto, canonname, sockaddr)\n\\r
+\n\\r
+Resolve host and port into addrinfo struct.");\r
+\r
+/* Python interface to getnameinfo(sa, flags). */\r
+\r
+/*ARGSUSED*/\r
+static PyObject *\r
+socket_getnameinfo(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *sa = (PyObject *)NULL;\r
+    int flags;\r
+    char *hostp;\r
+    int port;\r
+    unsigned int flowinfo, scope_id;\r
+    char hbuf[NI_MAXHOST], pbuf[NI_MAXSERV];\r
+    struct addrinfo hints, *res = NULL;\r
+    int error;\r
+    PyObject *ret = (PyObject *)NULL;\r
+\r
+    flags = flowinfo = scope_id = 0;\r
+    if (!PyArg_ParseTuple(args, "Oi:getnameinfo", &sa, &flags))\r
+        return NULL;\r
+    if (!PyTuple_Check(sa)) {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "getnameinfo() argument 1 must be a tuple");\r
+        return NULL;\r
+    }\r
+    if (!PyArg_ParseTuple(sa, "si|II",\r
+                          &hostp, &port, &flowinfo, &scope_id))\r
+        return NULL;\r
+    if (flowinfo > 0xfffff) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "getsockaddrarg: flowinfo must be 0-1048575.");\r
+        return NULL;\r
+    }\r
+    PyOS_snprintf(pbuf, sizeof(pbuf), "%d", port);\r
+    memset(&hints, 0, sizeof(hints));\r
+    hints.ai_family = AF_UNSPEC;\r
+    hints.ai_socktype = SOCK_DGRAM;     /* make numeric port happy */\r
+    Py_BEGIN_ALLOW_THREADS\r
+    ACQUIRE_GETADDRINFO_LOCK\r
+    error = getaddrinfo(hostp, pbuf, &hints, &res);\r
+    Py_END_ALLOW_THREADS\r
+    RELEASE_GETADDRINFO_LOCK  /* see comment in setipaddr() */\r
+    if (error) {\r
+        set_gaierror(error);\r
+        goto fail;\r
+    }\r
+    if (res->ai_next) {\r
+        PyErr_SetString(socket_error,\r
+            "sockaddr resolved to multiple addresses");\r
+        goto fail;\r
+    }\r
+    switch (res->ai_family) {\r
+    case AF_INET:\r
+        {\r
+        if (PyTuple_GET_SIZE(sa) != 2) {\r
+            PyErr_SetString(socket_error,\r
+                "IPv4 sockaddr must be 2 tuple");\r
+            goto fail;\r
+        }\r
+        break;\r
+        }\r
+#ifdef ENABLE_IPV6\r
+    case AF_INET6:\r
+        {\r
+        struct sockaddr_in6 *sin6;\r
+        sin6 = (struct sockaddr_in6 *)res->ai_addr;\r
+        sin6->sin6_flowinfo = htonl(flowinfo);\r
+        sin6->sin6_scope_id = scope_id;\r
+        break;\r
+        }\r
+#endif\r
+    }\r
+    error = getnameinfo(res->ai_addr, res->ai_addrlen,\r
+                    hbuf, sizeof(hbuf), pbuf, sizeof(pbuf), flags);\r
+    if (error) {\r
+        set_gaierror(error);\r
+        goto fail;\r
+    }\r
+    ret = Py_BuildValue("ss", hbuf, pbuf);\r
+\r
+fail:\r
+    if (res)\r
+        freeaddrinfo(res);\r
+    return ret;\r
+}\r
+\r
+PyDoc_STRVAR(getnameinfo_doc,\r
+"getnameinfo(sockaddr, flags) --> (host, port)\n\\r
+\n\\r
+Get host and port for a sockaddr.");\r
+\r
+\r
+/* Python API to getting and setting the default timeout value. */\r
+\r
+static PyObject *\r
+socket_getdefaulttimeout(PyObject *self)\r
+{\r
+    if (defaulttimeout < 0.0) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    else\r
+        return PyFloat_FromDouble(defaulttimeout);\r
+}\r
+\r
+PyDoc_STRVAR(getdefaulttimeout_doc,\r
+"getdefaulttimeout() -> timeout\n\\r
+\n\\r
+Returns the default timeout in seconds (float) for new socket objects.\n\\r
+A value of None indicates that new socket objects have no timeout.\n\\r
+When the socket module is first imported, the default is None.");\r
+\r
+static PyObject *\r
+socket_setdefaulttimeout(PyObject *self, PyObject *arg)\r
+{\r
+    double timeout;\r
+\r
+    if (arg == Py_None)\r
+        timeout = -1.0;\r
+    else {\r
+        timeout = PyFloat_AsDouble(arg);\r
+        if (timeout < 0.0) {\r
+            if (!PyErr_Occurred())\r
+                PyErr_SetString(PyExc_ValueError,\r
+                                "Timeout value out of range");\r
+            return NULL;\r
+        }\r
+    }\r
+\r
+    defaulttimeout = timeout;\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(setdefaulttimeout_doc,\r
+"setdefaulttimeout(timeout)\n\\r
+\n\\r
+Set the default timeout in seconds (float) for new socket objects.\n\\r
+A value of None indicates that new socket objects have no timeout.\n\\r
+When the socket module is first imported, the default is None.");\r
+\r
+\r
+/* List of functions exported by this module. */\r
+\r
+static PyMethodDef socket_methods[] = {\r
+    {"gethostbyname",           socket_gethostbyname,\r
+     METH_VARARGS, gethostbyname_doc},\r
+    {"gethostbyname_ex",        socket_gethostbyname_ex,\r
+     METH_VARARGS, ghbn_ex_doc},\r
+    {"gethostbyaddr",           socket_gethostbyaddr,\r
+     METH_VARARGS, gethostbyaddr_doc},\r
+    {"gethostname",             socket_gethostname,\r
+     METH_NOARGS,  gethostname_doc},\r
+    {"getservbyname",           socket_getservbyname,\r
+     METH_VARARGS, getservbyname_doc},\r
+    {"getservbyport",           socket_getservbyport,\r
+     METH_VARARGS, getservbyport_doc},\r
+    {"getprotobyname",          socket_getprotobyname,\r
+     METH_VARARGS, getprotobyname_doc},\r
+#ifndef NO_DUP\r
+    {"fromfd",                  socket_fromfd,\r
+     METH_VARARGS, fromfd_doc},\r
+#endif\r
+#ifdef HAVE_SOCKETPAIR\r
+    {"socketpair",              socket_socketpair,\r
+     METH_VARARGS, socketpair_doc},\r
+#endif\r
+    {"ntohs",                   socket_ntohs,\r
+     METH_VARARGS, ntohs_doc},\r
+    {"ntohl",                   socket_ntohl,\r
+     METH_O, ntohl_doc},\r
+    {"htons",                   socket_htons,\r
+     METH_VARARGS, htons_doc},\r
+    {"htonl",                   socket_htonl,\r
+     METH_O, htonl_doc},\r
+    {"inet_aton",               socket_inet_aton,\r
+     METH_VARARGS, inet_aton_doc},\r
+    {"inet_ntoa",               socket_inet_ntoa,\r
+     METH_VARARGS, inet_ntoa_doc},\r
+#ifdef HAVE_INET_PTON\r
+    {"inet_pton",               socket_inet_pton,\r
+     METH_VARARGS, inet_pton_doc},\r
+    {"inet_ntop",               socket_inet_ntop,\r
+     METH_VARARGS, inet_ntop_doc},\r
+#endif\r
+    {"getaddrinfo",             socket_getaddrinfo,\r
+     METH_VARARGS, getaddrinfo_doc},\r
+    {"getnameinfo",             socket_getnameinfo,\r
+     METH_VARARGS, getnameinfo_doc},\r
+    {"getdefaulttimeout",       (PyCFunction)socket_getdefaulttimeout,\r
+     METH_NOARGS, getdefaulttimeout_doc},\r
+    {"setdefaulttimeout",       socket_setdefaulttimeout,\r
+     METH_O, setdefaulttimeout_doc},\r
+    {NULL,                      NULL}            /* Sentinel */\r
+};\r
+\r
+\r
+#ifdef RISCOS\r
+#define OS_INIT_DEFINED\r
+\r
+static int\r
+os_init(void)\r
+{\r
+    _kernel_swi_regs r;\r
+\r
+    r.r[0] = 0;\r
+    _kernel_swi(0x43380, &r, &r);\r
+    taskwindow = r.r[0];\r
+\r
+    return 1;\r
+}\r
+\r
+#endif /* RISCOS */\r
+\r
+\r
+#ifdef MS_WINDOWS\r
+#define OS_INIT_DEFINED\r
+\r
+/* Additional initialization and cleanup for Windows */\r
+\r
+static void\r
+os_cleanup(void)\r
+{\r
+    WSACleanup();\r
+}\r
+\r
+static int\r
+os_init(void)\r
+{\r
+    WSADATA WSAData;\r
+    int ret;\r
+    char buf[100];\r
+    ret = WSAStartup(0x0101, &WSAData);\r
+    switch (ret) {\r
+    case 0:     /* No error */\r
+        Py_AtExit(os_cleanup);\r
+        return 1; /* Success */\r
+    case WSASYSNOTREADY:\r
+        PyErr_SetString(PyExc_ImportError,\r
+                        "WSAStartup failed: network not ready");\r
+        break;\r
+    case WSAVERNOTSUPPORTED:\r
+    case WSAEINVAL:\r
+        PyErr_SetString(\r
+            PyExc_ImportError,\r
+            "WSAStartup failed: requested version not supported");\r
+        break;\r
+    default:\r
+        PyOS_snprintf(buf, sizeof(buf),\r
+                      "WSAStartup failed: error code %d", ret);\r
+        PyErr_SetString(PyExc_ImportError, buf);\r
+        break;\r
+    }\r
+    return 0; /* Failure */\r
+}\r
+\r
+#endif /* MS_WINDOWS */\r
+\r
+\r
+#ifdef PYOS_OS2\r
+#define OS_INIT_DEFINED\r
+\r
+/* Additional initialization for OS/2 */\r
+\r
+static int\r
+os_init(void)\r
+{\r
+#ifndef PYCC_GCC\r
+    char reason[64];\r
+    int rc = sock_init();\r
+\r
+    if (rc == 0) {\r
+        return 1; /* Success */\r
+    }\r
+\r
+    PyOS_snprintf(reason, sizeof(reason),\r
+                  "OS/2 TCP/IP Error# %d", sock_errno());\r
+    PyErr_SetString(PyExc_ImportError, reason);\r
+\r
+    return 0;  /* Failure */\r
+#else\r
+    /* No need to initialize sockets with GCC/EMX */\r
+    return 1; /* Success */\r
+#endif\r
+}\r
+\r
+#endif /* PYOS_OS2 */\r
+\r
+\r
+#ifndef OS_INIT_DEFINED\r
+static int\r
+os_init(void)\r
+{\r
+    return 1; /* Success */\r
+}\r
+#endif\r
+\r
+\r
+/* C API table - always add new things to the end for binary\r
+   compatibility. */\r
+static\r
+PySocketModule_APIObject PySocketModuleAPI =\r
+{\r
+    &sock_type,\r
+    NULL\r
+};\r
+\r
+\r
+/* Initialize the _socket module.\r
+\r
+   This module is actually called "_socket", and there's a wrapper\r
+   "socket.py" which implements some additional functionality.  On some\r
+   platforms (e.g. Windows and OS/2), socket.py also implements a\r
+   wrapper for the socket type that provides missing functionality such\r
+   as makefile(), dup() and fromfd().  The import of "_socket" may fail\r
+   with an ImportError exception if os-specific initialization fails.\r
+   On Windows, this does WINSOCK initialization.  When WINSOCK is\r
+   initialized successfully, a call to WSACleanup() is scheduled to be\r
+   made at exit time.\r
+*/\r
+\r
+PyDoc_STRVAR(socket_doc,\r
+"Implementation module for socket operations.\n\\r
+\n\\r
+See the socket module for documentation.");\r
+\r
+PyMODINIT_FUNC\r
+init_socket(void)\r
+{\r
+    PyObject *m, *has_ipv6;\r
+\r
+    if (!os_init())\r
+        return;\r
+\r
+    Py_TYPE(&sock_type) = &PyType_Type;\r
+    m = Py_InitModule3(PySocket_MODULE_NAME,\r
+                       socket_methods,\r
+                       socket_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    socket_error = PyErr_NewException("socket.error",\r
+                                      PyExc_IOError, NULL);\r
+    if (socket_error == NULL)\r
+        return;\r
+    PySocketModuleAPI.error = socket_error;\r
+    Py_INCREF(socket_error);\r
+    PyModule_AddObject(m, "error", socket_error);\r
+    socket_herror = PyErr_NewException("socket.herror",\r
+                                       socket_error, NULL);\r
+    if (socket_herror == NULL)\r
+        return;\r
+    Py_INCREF(socket_herror);\r
+    PyModule_AddObject(m, "herror", socket_herror);\r
+    socket_gaierror = PyErr_NewException("socket.gaierror", socket_error,\r
+        NULL);\r
+    if (socket_gaierror == NULL)\r
+        return;\r
+    Py_INCREF(socket_gaierror);\r
+    PyModule_AddObject(m, "gaierror", socket_gaierror);\r
+    socket_timeout = PyErr_NewException("socket.timeout",\r
+                                        socket_error, NULL);\r
+    if (socket_timeout == NULL)\r
+        return;\r
+    Py_INCREF(socket_timeout);\r
+    PyModule_AddObject(m, "timeout", socket_timeout);\r
+    Py_INCREF((PyObject *)&sock_type);\r
+    if (PyModule_AddObject(m, "SocketType",\r
+                           (PyObject *)&sock_type) != 0)\r
+        return;\r
+    Py_INCREF((PyObject *)&sock_type);\r
+    if (PyModule_AddObject(m, "socket",\r
+                           (PyObject *)&sock_type) != 0)\r
+        return;\r
+\r
+#ifdef ENABLE_IPV6\r
+    has_ipv6 = Py_True;\r
+#else\r
+    has_ipv6 = Py_False;\r
+#endif\r
+    Py_INCREF(has_ipv6);\r
+    PyModule_AddObject(m, "has_ipv6", has_ipv6);\r
+\r
+    /* Export C API */\r
+    if (PyModule_AddObject(m, PySocket_CAPI_NAME,\r
+           PyCapsule_New(&PySocketModuleAPI, PySocket_CAPSULE_NAME, NULL)\r
+                             ) != 0)\r
+        return;\r
+\r
+    /* Address families (we only support AF_INET and AF_UNIX) */\r
+#ifdef AF_UNSPEC\r
+    PyModule_AddIntConstant(m, "AF_UNSPEC", AF_UNSPEC);\r
+#endif\r
+    PyModule_AddIntConstant(m, "AF_INET", AF_INET);\r
+#ifdef AF_INET6\r
+    PyModule_AddIntConstant(m, "AF_INET6", AF_INET6);\r
+#endif /* AF_INET6 */\r
+#if defined(AF_UNIX)\r
+    PyModule_AddIntConstant(m, "AF_UNIX", AF_UNIX);\r
+#endif /* AF_UNIX */\r
+#ifdef AF_AX25\r
+    /* Amateur Radio AX.25 */\r
+    PyModule_AddIntConstant(m, "AF_AX25", AF_AX25);\r
+#endif\r
+#ifdef AF_IPX\r
+    PyModule_AddIntConstant(m, "AF_IPX", AF_IPX); /* Novell IPX */\r
+#endif\r
+#ifdef AF_APPLETALK\r
+    /* Appletalk DDP */\r
+    PyModule_AddIntConstant(m, "AF_APPLETALK", AF_APPLETALK);\r
+#endif\r
+#ifdef AF_NETROM\r
+    /* Amateur radio NetROM */\r
+    PyModule_AddIntConstant(m, "AF_NETROM", AF_NETROM);\r
+#endif\r
+#ifdef AF_BRIDGE\r
+    /* Multiprotocol bridge */\r
+    PyModule_AddIntConstant(m, "AF_BRIDGE", AF_BRIDGE);\r
+#endif\r
+#ifdef AF_ATMPVC\r
+    /* ATM PVCs */\r
+    PyModule_AddIntConstant(m, "AF_ATMPVC", AF_ATMPVC);\r
+#endif\r
+#ifdef AF_AAL5\r
+    /* Reserved for Werner's ATM */\r
+    PyModule_AddIntConstant(m, "AF_AAL5", AF_AAL5);\r
+#endif\r
+#ifdef AF_X25\r
+    /* Reserved for X.25 project */\r
+    PyModule_AddIntConstant(m, "AF_X25", AF_X25);\r
+#endif\r
+#ifdef AF_INET6\r
+    PyModule_AddIntConstant(m, "AF_INET6", AF_INET6); /* IP version 6 */\r
+#endif\r
+#ifdef AF_ROSE\r
+    /* Amateur Radio X.25 PLP */\r
+    PyModule_AddIntConstant(m, "AF_ROSE", AF_ROSE);\r
+#endif\r
+#ifdef AF_DECnet\r
+    /* Reserved for DECnet project */\r
+    PyModule_AddIntConstant(m, "AF_DECnet", AF_DECnet);\r
+#endif\r
+#ifdef AF_NETBEUI\r
+    /* Reserved for 802.2LLC project */\r
+    PyModule_AddIntConstant(m, "AF_NETBEUI", AF_NETBEUI);\r
+#endif\r
+#ifdef AF_SECURITY\r
+    /* Security callback pseudo AF */\r
+    PyModule_AddIntConstant(m, "AF_SECURITY", AF_SECURITY);\r
+#endif\r
+#ifdef AF_KEY\r
+    /* PF_KEY key management API */\r
+    PyModule_AddIntConstant(m, "AF_KEY", AF_KEY);\r
+#endif\r
+#ifdef AF_NETLINK\r
+    /*  */\r
+    PyModule_AddIntConstant(m, "AF_NETLINK", AF_NETLINK);\r
+    PyModule_AddIntConstant(m, "NETLINK_ROUTE", NETLINK_ROUTE);\r
+#ifdef NETLINK_SKIP\r
+    PyModule_AddIntConstant(m, "NETLINK_SKIP", NETLINK_SKIP);\r
+#endif\r
+#ifdef NETLINK_W1\r
+    PyModule_AddIntConstant(m, "NETLINK_W1", NETLINK_W1);\r
+#endif\r
+    PyModule_AddIntConstant(m, "NETLINK_USERSOCK", NETLINK_USERSOCK);\r
+    PyModule_AddIntConstant(m, "NETLINK_FIREWALL", NETLINK_FIREWALL);\r
+#ifdef NETLINK_TCPDIAG\r
+    PyModule_AddIntConstant(m, "NETLINK_TCPDIAG", NETLINK_TCPDIAG);\r
+#endif\r
+#ifdef NETLINK_NFLOG\r
+    PyModule_AddIntConstant(m, "NETLINK_NFLOG", NETLINK_NFLOG);\r
+#endif\r
+#ifdef NETLINK_XFRM\r
+    PyModule_AddIntConstant(m, "NETLINK_XFRM", NETLINK_XFRM);\r
+#endif\r
+#ifdef NETLINK_ARPD\r
+    PyModule_AddIntConstant(m, "NETLINK_ARPD", NETLINK_ARPD);\r
+#endif\r
+#ifdef NETLINK_ROUTE6\r
+    PyModule_AddIntConstant(m, "NETLINK_ROUTE6", NETLINK_ROUTE6);\r
+#endif\r
+    PyModule_AddIntConstant(m, "NETLINK_IP6_FW", NETLINK_IP6_FW);\r
+#ifdef NETLINK_DNRTMSG\r
+    PyModule_AddIntConstant(m, "NETLINK_DNRTMSG", NETLINK_DNRTMSG);\r
+#endif\r
+#ifdef NETLINK_TAPBASE\r
+    PyModule_AddIntConstant(m, "NETLINK_TAPBASE", NETLINK_TAPBASE);\r
+#endif\r
+#endif /* AF_NETLINK */\r
+#ifdef AF_ROUTE\r
+    /* Alias to emulate 4.4BSD */\r
+    PyModule_AddIntConstant(m, "AF_ROUTE", AF_ROUTE);\r
+#endif\r
+#ifdef AF_ASH\r
+    /* Ash */\r
+    PyModule_AddIntConstant(m, "AF_ASH", AF_ASH);\r
+#endif\r
+#ifdef AF_ECONET\r
+    /* Acorn Econet */\r
+    PyModule_AddIntConstant(m, "AF_ECONET", AF_ECONET);\r
+#endif\r
+#ifdef AF_ATMSVC\r
+    /* ATM SVCs */\r
+    PyModule_AddIntConstant(m, "AF_ATMSVC", AF_ATMSVC);\r
+#endif\r
+#ifdef AF_SNA\r
+    /* Linux SNA Project (nutters!) */\r
+    PyModule_AddIntConstant(m, "AF_SNA", AF_SNA);\r
+#endif\r
+#ifdef AF_IRDA\r
+    /* IRDA sockets */\r
+    PyModule_AddIntConstant(m, "AF_IRDA", AF_IRDA);\r
+#endif\r
+#ifdef AF_PPPOX\r
+    /* PPPoX sockets */\r
+    PyModule_AddIntConstant(m, "AF_PPPOX", AF_PPPOX);\r
+#endif\r
+#ifdef AF_WANPIPE\r
+    /* Wanpipe API Sockets */\r
+    PyModule_AddIntConstant(m, "AF_WANPIPE", AF_WANPIPE);\r
+#endif\r
+#ifdef AF_LLC\r
+    /* Linux LLC */\r
+    PyModule_AddIntConstant(m, "AF_LLC", AF_LLC);\r
+#endif\r
+\r
+#ifdef USE_BLUETOOTH\r
+    PyModule_AddIntConstant(m, "AF_BLUETOOTH", AF_BLUETOOTH);\r
+    PyModule_AddIntConstant(m, "BTPROTO_L2CAP", BTPROTO_L2CAP);\r
+    PyModule_AddIntConstant(m, "BTPROTO_HCI", BTPROTO_HCI);\r
+    PyModule_AddIntConstant(m, "SOL_HCI", SOL_HCI);\r
+#if !defined(__NetBSD__) && !defined(__DragonFly__)\r
+    PyModule_AddIntConstant(m, "HCI_FILTER", HCI_FILTER);\r
+#endif\r
+#if !defined(__FreeBSD__)\r
+#if !defined(__NetBSD__) && !defined(__DragonFly__)\r
+    PyModule_AddIntConstant(m, "HCI_TIME_STAMP", HCI_TIME_STAMP);\r
+#endif\r
+    PyModule_AddIntConstant(m, "HCI_DATA_DIR", HCI_DATA_DIR);\r
+    PyModule_AddIntConstant(m, "BTPROTO_SCO", BTPROTO_SCO);\r
+#endif\r
+    PyModule_AddIntConstant(m, "BTPROTO_RFCOMM", BTPROTO_RFCOMM);\r
+    PyModule_AddStringConstant(m, "BDADDR_ANY", "00:00:00:00:00:00");\r
+    PyModule_AddStringConstant(m, "BDADDR_LOCAL", "00:00:00:FF:FF:FF");\r
+#endif\r
+\r
+#ifdef AF_PACKET\r
+    PyModule_AddIntMacro(m, AF_PACKET);\r
+#endif\r
+#ifdef PF_PACKET\r
+    PyModule_AddIntMacro(m, PF_PACKET);\r
+#endif\r
+#ifdef PACKET_HOST\r
+    PyModule_AddIntMacro(m, PACKET_HOST);\r
+#endif\r
+#ifdef PACKET_BROADCAST\r
+    PyModule_AddIntMacro(m, PACKET_BROADCAST);\r
+#endif\r
+#ifdef PACKET_MULTICAST\r
+    PyModule_AddIntMacro(m, PACKET_MULTICAST);\r
+#endif\r
+#ifdef PACKET_OTHERHOST\r
+    PyModule_AddIntMacro(m, PACKET_OTHERHOST);\r
+#endif\r
+#ifdef PACKET_OUTGOING\r
+    PyModule_AddIntMacro(m, PACKET_OUTGOING);\r
+#endif\r
+#ifdef PACKET_LOOPBACK\r
+    PyModule_AddIntMacro(m, PACKET_LOOPBACK);\r
+#endif\r
+#ifdef PACKET_FASTROUTE\r
+    PyModule_AddIntMacro(m, PACKET_FASTROUTE);\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_TIPC_H\r
+    PyModule_AddIntConstant(m, "AF_TIPC", AF_TIPC);\r
+\r
+    /* for addresses */\r
+    PyModule_AddIntConstant(m, "TIPC_ADDR_NAMESEQ", TIPC_ADDR_NAMESEQ);\r
+    PyModule_AddIntConstant(m, "TIPC_ADDR_NAME", TIPC_ADDR_NAME);\r
+    PyModule_AddIntConstant(m, "TIPC_ADDR_ID", TIPC_ADDR_ID);\r
+\r
+    PyModule_AddIntConstant(m, "TIPC_ZONE_SCOPE", TIPC_ZONE_SCOPE);\r
+    PyModule_AddIntConstant(m, "TIPC_CLUSTER_SCOPE", TIPC_CLUSTER_SCOPE);\r
+    PyModule_AddIntConstant(m, "TIPC_NODE_SCOPE", TIPC_NODE_SCOPE);\r
+\r
+    /* for setsockopt() */\r
+    PyModule_AddIntConstant(m, "SOL_TIPC", SOL_TIPC);\r
+    PyModule_AddIntConstant(m, "TIPC_IMPORTANCE", TIPC_IMPORTANCE);\r
+    PyModule_AddIntConstant(m, "TIPC_SRC_DROPPABLE", TIPC_SRC_DROPPABLE);\r
+    PyModule_AddIntConstant(m, "TIPC_DEST_DROPPABLE",\r
+                    TIPC_DEST_DROPPABLE);\r
+    PyModule_AddIntConstant(m, "TIPC_CONN_TIMEOUT", TIPC_CONN_TIMEOUT);\r
+\r
+    PyModule_AddIntConstant(m, "TIPC_LOW_IMPORTANCE",\r
+                    TIPC_LOW_IMPORTANCE);\r
+    PyModule_AddIntConstant(m, "TIPC_MEDIUM_IMPORTANCE",\r
+                    TIPC_MEDIUM_IMPORTANCE);\r
+    PyModule_AddIntConstant(m, "TIPC_HIGH_IMPORTANCE",\r
+                    TIPC_HIGH_IMPORTANCE);\r
+    PyModule_AddIntConstant(m, "TIPC_CRITICAL_IMPORTANCE",\r
+                    TIPC_CRITICAL_IMPORTANCE);\r
+\r
+    /* for subscriptions */\r
+    PyModule_AddIntConstant(m, "TIPC_SUB_PORTS", TIPC_SUB_PORTS);\r
+    PyModule_AddIntConstant(m, "TIPC_SUB_SERVICE", TIPC_SUB_SERVICE);\r
+#ifdef TIPC_SUB_CANCEL\r
+    /* doesn't seem to be available everywhere */\r
+    PyModule_AddIntConstant(m, "TIPC_SUB_CANCEL", TIPC_SUB_CANCEL);\r
+#endif\r
+    PyModule_AddIntConstant(m, "TIPC_WAIT_FOREVER", TIPC_WAIT_FOREVER);\r
+    PyModule_AddIntConstant(m, "TIPC_PUBLISHED", TIPC_PUBLISHED);\r
+    PyModule_AddIntConstant(m, "TIPC_WITHDRAWN", TIPC_WITHDRAWN);\r
+    PyModule_AddIntConstant(m, "TIPC_SUBSCR_TIMEOUT", TIPC_SUBSCR_TIMEOUT);\r
+    PyModule_AddIntConstant(m, "TIPC_CFG_SRV", TIPC_CFG_SRV);\r
+    PyModule_AddIntConstant(m, "TIPC_TOP_SRV", TIPC_TOP_SRV);\r
+#endif\r
+\r
+    /* Socket types */\r
+    PyModule_AddIntConstant(m, "SOCK_STREAM", SOCK_STREAM);\r
+    PyModule_AddIntConstant(m, "SOCK_DGRAM", SOCK_DGRAM);\r
+#ifndef __BEOS__\r
+/* We have incomplete socket support. */\r
+    PyModule_AddIntConstant(m, "SOCK_RAW", SOCK_RAW);\r
+    PyModule_AddIntConstant(m, "SOCK_SEQPACKET", SOCK_SEQPACKET);\r
+#if defined(SOCK_RDM)\r
+    PyModule_AddIntConstant(m, "SOCK_RDM", SOCK_RDM);\r
+#endif\r
+#endif\r
+\r
+#ifdef  SO_DEBUG\r
+    PyModule_AddIntConstant(m, "SO_DEBUG", SO_DEBUG);\r
+#endif\r
+#ifdef  SO_ACCEPTCONN\r
+    PyModule_AddIntConstant(m, "SO_ACCEPTCONN", SO_ACCEPTCONN);\r
+#endif\r
+#ifdef  SO_REUSEADDR\r
+    PyModule_AddIntConstant(m, "SO_REUSEADDR", SO_REUSEADDR);\r
+#endif\r
+#ifdef SO_EXCLUSIVEADDRUSE\r
+    PyModule_AddIntConstant(m, "SO_EXCLUSIVEADDRUSE", SO_EXCLUSIVEADDRUSE);\r
+#endif\r
+\r
+#ifdef  SO_KEEPALIVE\r
+    PyModule_AddIntConstant(m, "SO_KEEPALIVE", SO_KEEPALIVE);\r
+#endif\r
+#ifdef  SO_DONTROUTE\r
+    PyModule_AddIntConstant(m, "SO_DONTROUTE", SO_DONTROUTE);\r
+#endif\r
+#ifdef  SO_BROADCAST\r
+    PyModule_AddIntConstant(m, "SO_BROADCAST", SO_BROADCAST);\r
+#endif\r
+#ifdef  SO_USELOOPBACK\r
+    PyModule_AddIntConstant(m, "SO_USELOOPBACK", SO_USELOOPBACK);\r
+#endif\r
+#ifdef  SO_LINGER\r
+    PyModule_AddIntConstant(m, "SO_LINGER", SO_LINGER);\r
+#endif\r
+#ifdef  SO_OOBINLINE\r
+    PyModule_AddIntConstant(m, "SO_OOBINLINE", SO_OOBINLINE);\r
+#endif\r
+#ifdef  SO_REUSEPORT\r
+    PyModule_AddIntConstant(m, "SO_REUSEPORT", SO_REUSEPORT);\r
+#endif\r
+#ifdef  SO_SNDBUF\r
+    PyModule_AddIntConstant(m, "SO_SNDBUF", SO_SNDBUF);\r
+#endif\r
+#ifdef  SO_RCVBUF\r
+    PyModule_AddIntConstant(m, "SO_RCVBUF", SO_RCVBUF);\r
+#endif\r
+#ifdef  SO_SNDLOWAT\r
+    PyModule_AddIntConstant(m, "SO_SNDLOWAT", SO_SNDLOWAT);\r
+#endif\r
+#ifdef  SO_RCVLOWAT\r
+    PyModule_AddIntConstant(m, "SO_RCVLOWAT", SO_RCVLOWAT);\r
+#endif\r
+#ifdef  SO_SNDTIMEO\r
+    PyModule_AddIntConstant(m, "SO_SNDTIMEO", SO_SNDTIMEO);\r
+#endif\r
+#ifdef  SO_RCVTIMEO\r
+    PyModule_AddIntConstant(m, "SO_RCVTIMEO", SO_RCVTIMEO);\r
+#endif\r
+#ifdef  SO_ERROR\r
+    PyModule_AddIntConstant(m, "SO_ERROR", SO_ERROR);\r
+#endif\r
+#ifdef  SO_TYPE\r
+    PyModule_AddIntConstant(m, "SO_TYPE", SO_TYPE);\r
+#endif\r
+#ifdef SO_SETFIB\r
+    PyModule_AddIntConstant(m, "SO_SETFIB", SO_SETFIB);\r
+#endif\r
+\r
+    /* Maximum number of connections for "listen" */\r
+#ifdef  SOMAXCONN\r
+    PyModule_AddIntConstant(m, "SOMAXCONN", SOMAXCONN);\r
+#else\r
+    PyModule_AddIntConstant(m, "SOMAXCONN", 5); /* Common value */\r
+#endif\r
+\r
+    /* Flags for send, recv */\r
+#ifdef  MSG_OOB\r
+    PyModule_AddIntConstant(m, "MSG_OOB", MSG_OOB);\r
+#endif\r
+#ifdef  MSG_PEEK\r
+    PyModule_AddIntConstant(m, "MSG_PEEK", MSG_PEEK);\r
+#endif\r
+#ifdef  MSG_DONTROUTE\r
+    PyModule_AddIntConstant(m, "MSG_DONTROUTE", MSG_DONTROUTE);\r
+#endif\r
+#ifdef  MSG_DONTWAIT\r
+    PyModule_AddIntConstant(m, "MSG_DONTWAIT", MSG_DONTWAIT);\r
+#endif\r
+#ifdef  MSG_EOR\r
+    PyModule_AddIntConstant(m, "MSG_EOR", MSG_EOR);\r
+#endif\r
+#ifdef  MSG_TRUNC\r
+    PyModule_AddIntConstant(m, "MSG_TRUNC", MSG_TRUNC);\r
+#endif\r
+#ifdef  MSG_CTRUNC\r
+    PyModule_AddIntConstant(m, "MSG_CTRUNC", MSG_CTRUNC);\r
+#endif\r
+#ifdef  MSG_WAITALL\r
+    PyModule_AddIntConstant(m, "MSG_WAITALL", MSG_WAITALL);\r
+#endif\r
+#ifdef  MSG_BTAG\r
+    PyModule_AddIntConstant(m, "MSG_BTAG", MSG_BTAG);\r
+#endif\r
+#ifdef  MSG_ETAG\r
+    PyModule_AddIntConstant(m, "MSG_ETAG", MSG_ETAG);\r
+#endif\r
+\r
+    /* Protocol level and numbers, usable for [gs]etsockopt */\r
+#ifdef  SOL_SOCKET\r
+    PyModule_AddIntConstant(m, "SOL_SOCKET", SOL_SOCKET);\r
+#endif\r
+#ifdef  SOL_IP\r
+    PyModule_AddIntConstant(m, "SOL_IP", SOL_IP);\r
+#else\r
+    PyModule_AddIntConstant(m, "SOL_IP", 0);\r
+#endif\r
+#ifdef  SOL_IPX\r
+    PyModule_AddIntConstant(m, "SOL_IPX", SOL_IPX);\r
+#endif\r
+#ifdef  SOL_AX25\r
+    PyModule_AddIntConstant(m, "SOL_AX25", SOL_AX25);\r
+#endif\r
+#ifdef  SOL_ATALK\r
+    PyModule_AddIntConstant(m, "SOL_ATALK", SOL_ATALK);\r
+#endif\r
+#ifdef  SOL_NETROM\r
+    PyModule_AddIntConstant(m, "SOL_NETROM", SOL_NETROM);\r
+#endif\r
+#ifdef  SOL_ROSE\r
+    PyModule_AddIntConstant(m, "SOL_ROSE", SOL_ROSE);\r
+#endif\r
+#ifdef  SOL_TCP\r
+    PyModule_AddIntConstant(m, "SOL_TCP", SOL_TCP);\r
+#else\r
+    PyModule_AddIntConstant(m, "SOL_TCP", 6);\r
+#endif\r
+#ifdef  SOL_UDP\r
+    PyModule_AddIntConstant(m, "SOL_UDP", SOL_UDP);\r
+#else\r
+    PyModule_AddIntConstant(m, "SOL_UDP", 17);\r
+#endif\r
+#ifdef  IPPROTO_IP\r
+    PyModule_AddIntConstant(m, "IPPROTO_IP", IPPROTO_IP);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPROTO_IP", 0);\r
+#endif\r
+#ifdef  IPPROTO_HOPOPTS\r
+    PyModule_AddIntConstant(m, "IPPROTO_HOPOPTS", IPPROTO_HOPOPTS);\r
+#endif\r
+#ifdef  IPPROTO_ICMP\r
+    PyModule_AddIntConstant(m, "IPPROTO_ICMP", IPPROTO_ICMP);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPROTO_ICMP", 1);\r
+#endif\r
+#ifdef  IPPROTO_IGMP\r
+    PyModule_AddIntConstant(m, "IPPROTO_IGMP", IPPROTO_IGMP);\r
+#endif\r
+#ifdef  IPPROTO_GGP\r
+    PyModule_AddIntConstant(m, "IPPROTO_GGP", IPPROTO_GGP);\r
+#endif\r
+#ifdef  IPPROTO_IPV4\r
+    PyModule_AddIntConstant(m, "IPPROTO_IPV4", IPPROTO_IPV4);\r
+#endif\r
+#ifdef  IPPROTO_IPV6\r
+    PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);\r
+#endif\r
+#ifdef  IPPROTO_IPIP\r
+    PyModule_AddIntConstant(m, "IPPROTO_IPIP", IPPROTO_IPIP);\r
+#endif\r
+#ifdef  IPPROTO_TCP\r
+    PyModule_AddIntConstant(m, "IPPROTO_TCP", IPPROTO_TCP);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPROTO_TCP", 6);\r
+#endif\r
+#ifdef  IPPROTO_EGP\r
+    PyModule_AddIntConstant(m, "IPPROTO_EGP", IPPROTO_EGP);\r
+#endif\r
+#ifdef  IPPROTO_PUP\r
+    PyModule_AddIntConstant(m, "IPPROTO_PUP", IPPROTO_PUP);\r
+#endif\r
+#ifdef  IPPROTO_UDP\r
+    PyModule_AddIntConstant(m, "IPPROTO_UDP", IPPROTO_UDP);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPROTO_UDP", 17);\r
+#endif\r
+#ifdef  IPPROTO_IDP\r
+    PyModule_AddIntConstant(m, "IPPROTO_IDP", IPPROTO_IDP);\r
+#endif\r
+#ifdef  IPPROTO_HELLO\r
+    PyModule_AddIntConstant(m, "IPPROTO_HELLO", IPPROTO_HELLO);\r
+#endif\r
+#ifdef  IPPROTO_ND\r
+    PyModule_AddIntConstant(m, "IPPROTO_ND", IPPROTO_ND);\r
+#endif\r
+#ifdef  IPPROTO_TP\r
+    PyModule_AddIntConstant(m, "IPPROTO_TP", IPPROTO_TP);\r
+#endif\r
+#ifdef  IPPROTO_IPV6\r
+    PyModule_AddIntConstant(m, "IPPROTO_IPV6", IPPROTO_IPV6);\r
+#endif\r
+#ifdef  IPPROTO_ROUTING\r
+    PyModule_AddIntConstant(m, "IPPROTO_ROUTING", IPPROTO_ROUTING);\r
+#endif\r
+#ifdef  IPPROTO_FRAGMENT\r
+    PyModule_AddIntConstant(m, "IPPROTO_FRAGMENT", IPPROTO_FRAGMENT);\r
+#endif\r
+#ifdef  IPPROTO_RSVP\r
+    PyModule_AddIntConstant(m, "IPPROTO_RSVP", IPPROTO_RSVP);\r
+#endif\r
+#ifdef  IPPROTO_GRE\r
+    PyModule_AddIntConstant(m, "IPPROTO_GRE", IPPROTO_GRE);\r
+#endif\r
+#ifdef  IPPROTO_ESP\r
+    PyModule_AddIntConstant(m, "IPPROTO_ESP", IPPROTO_ESP);\r
+#endif\r
+#ifdef  IPPROTO_AH\r
+    PyModule_AddIntConstant(m, "IPPROTO_AH", IPPROTO_AH);\r
+#endif\r
+#ifdef  IPPROTO_MOBILE\r
+    PyModule_AddIntConstant(m, "IPPROTO_MOBILE", IPPROTO_MOBILE);\r
+#endif\r
+#ifdef  IPPROTO_ICMPV6\r
+    PyModule_AddIntConstant(m, "IPPROTO_ICMPV6", IPPROTO_ICMPV6);\r
+#endif\r
+#ifdef  IPPROTO_NONE\r
+    PyModule_AddIntConstant(m, "IPPROTO_NONE", IPPROTO_NONE);\r
+#endif\r
+#ifdef  IPPROTO_DSTOPTS\r
+    PyModule_AddIntConstant(m, "IPPROTO_DSTOPTS", IPPROTO_DSTOPTS);\r
+#endif\r
+#ifdef  IPPROTO_XTP\r
+    PyModule_AddIntConstant(m, "IPPROTO_XTP", IPPROTO_XTP);\r
+#endif\r
+#ifdef  IPPROTO_EON\r
+    PyModule_AddIntConstant(m, "IPPROTO_EON", IPPROTO_EON);\r
+#endif\r
+#ifdef  IPPROTO_PIM\r
+    PyModule_AddIntConstant(m, "IPPROTO_PIM", IPPROTO_PIM);\r
+#endif\r
+#ifdef  IPPROTO_IPCOMP\r
+    PyModule_AddIntConstant(m, "IPPROTO_IPCOMP", IPPROTO_IPCOMP);\r
+#endif\r
+#ifdef  IPPROTO_VRRP\r
+    PyModule_AddIntConstant(m, "IPPROTO_VRRP", IPPROTO_VRRP);\r
+#endif\r
+#ifdef  IPPROTO_BIP\r
+    PyModule_AddIntConstant(m, "IPPROTO_BIP", IPPROTO_BIP);\r
+#endif\r
+/**/\r
+#ifdef  IPPROTO_RAW\r
+    PyModule_AddIntConstant(m, "IPPROTO_RAW", IPPROTO_RAW);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPROTO_RAW", 255);\r
+#endif\r
+#ifdef  IPPROTO_MAX\r
+    PyModule_AddIntConstant(m, "IPPROTO_MAX", IPPROTO_MAX);\r
+#endif\r
+\r
+    /* Some port configuration */\r
+#ifdef  IPPORT_RESERVED\r
+    PyModule_AddIntConstant(m, "IPPORT_RESERVED", IPPORT_RESERVED);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPORT_RESERVED", 1024);\r
+#endif\r
+#ifdef  IPPORT_USERRESERVED\r
+    PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", IPPORT_USERRESERVED);\r
+#else\r
+    PyModule_AddIntConstant(m, "IPPORT_USERRESERVED", 5000);\r
+#endif\r
+\r
+    /* Some reserved IP v.4 addresses */\r
+#ifdef  INADDR_ANY\r
+    PyModule_AddIntConstant(m, "INADDR_ANY", INADDR_ANY);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_ANY", 0x00000000);\r
+#endif\r
+#ifdef  INADDR_BROADCAST\r
+    PyModule_AddIntConstant(m, "INADDR_BROADCAST", INADDR_BROADCAST);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_BROADCAST", 0xffffffff);\r
+#endif\r
+#ifdef  INADDR_LOOPBACK\r
+    PyModule_AddIntConstant(m, "INADDR_LOOPBACK", INADDR_LOOPBACK);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_LOOPBACK", 0x7F000001);\r
+#endif\r
+#ifdef  INADDR_UNSPEC_GROUP\r
+    PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", INADDR_UNSPEC_GROUP);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_UNSPEC_GROUP", 0xe0000000);\r
+#endif\r
+#ifdef  INADDR_ALLHOSTS_GROUP\r
+    PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP",\r
+                            INADDR_ALLHOSTS_GROUP);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_ALLHOSTS_GROUP", 0xe0000001);\r
+#endif\r
+#ifdef  INADDR_MAX_LOCAL_GROUP\r
+    PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP",\r
+                            INADDR_MAX_LOCAL_GROUP);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_MAX_LOCAL_GROUP", 0xe00000ff);\r
+#endif\r
+#ifdef  INADDR_NONE\r
+    PyModule_AddIntConstant(m, "INADDR_NONE", INADDR_NONE);\r
+#else\r
+    PyModule_AddIntConstant(m, "INADDR_NONE", 0xffffffff);\r
+#endif\r
+\r
+    /* IPv4 [gs]etsockopt options */\r
+#ifdef  IP_OPTIONS\r
+    PyModule_AddIntConstant(m, "IP_OPTIONS", IP_OPTIONS);\r
+#endif\r
+#ifdef  IP_HDRINCL\r
+    PyModule_AddIntConstant(m, "IP_HDRINCL", IP_HDRINCL);\r
+#endif\r
+#ifdef  IP_TOS\r
+    PyModule_AddIntConstant(m, "IP_TOS", IP_TOS);\r
+#endif\r
+#ifdef  IP_TTL\r
+    PyModule_AddIntConstant(m, "IP_TTL", IP_TTL);\r
+#endif\r
+#ifdef  IP_RECVOPTS\r
+    PyModule_AddIntConstant(m, "IP_RECVOPTS", IP_RECVOPTS);\r
+#endif\r
+#ifdef  IP_RECVRETOPTS\r
+    PyModule_AddIntConstant(m, "IP_RECVRETOPTS", IP_RECVRETOPTS);\r
+#endif\r
+#ifdef  IP_RECVDSTADDR\r
+    PyModule_AddIntConstant(m, "IP_RECVDSTADDR", IP_RECVDSTADDR);\r
+#endif\r
+#ifdef  IP_RETOPTS\r
+    PyModule_AddIntConstant(m, "IP_RETOPTS", IP_RETOPTS);\r
+#endif\r
+#ifdef  IP_MULTICAST_IF\r
+    PyModule_AddIntConstant(m, "IP_MULTICAST_IF", IP_MULTICAST_IF);\r
+#endif\r
+#ifdef  IP_MULTICAST_TTL\r
+    PyModule_AddIntConstant(m, "IP_MULTICAST_TTL", IP_MULTICAST_TTL);\r
+#endif\r
+#ifdef  IP_MULTICAST_LOOP\r
+    PyModule_AddIntConstant(m, "IP_MULTICAST_LOOP", IP_MULTICAST_LOOP);\r
+#endif\r
+#ifdef  IP_ADD_MEMBERSHIP\r
+    PyModule_AddIntConstant(m, "IP_ADD_MEMBERSHIP", IP_ADD_MEMBERSHIP);\r
+#endif\r
+#ifdef  IP_DROP_MEMBERSHIP\r
+    PyModule_AddIntConstant(m, "IP_DROP_MEMBERSHIP", IP_DROP_MEMBERSHIP);\r
+#endif\r
+#ifdef  IP_DEFAULT_MULTICAST_TTL\r
+    PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_TTL",\r
+                            IP_DEFAULT_MULTICAST_TTL);\r
+#endif\r
+#ifdef  IP_DEFAULT_MULTICAST_LOOP\r
+    PyModule_AddIntConstant(m, "IP_DEFAULT_MULTICAST_LOOP",\r
+                            IP_DEFAULT_MULTICAST_LOOP);\r
+#endif\r
+#ifdef  IP_MAX_MEMBERSHIPS\r
+    PyModule_AddIntConstant(m, "IP_MAX_MEMBERSHIPS", IP_MAX_MEMBERSHIPS);\r
+#endif\r
+\r
+    /* IPv6 [gs]etsockopt options, defined in RFC2553 */\r
+#ifdef  IPV6_JOIN_GROUP\r
+    PyModule_AddIntConstant(m, "IPV6_JOIN_GROUP", IPV6_JOIN_GROUP);\r
+#endif\r
+#ifdef  IPV6_LEAVE_GROUP\r
+    PyModule_AddIntConstant(m, "IPV6_LEAVE_GROUP", IPV6_LEAVE_GROUP);\r
+#endif\r
+#ifdef  IPV6_MULTICAST_HOPS\r
+    PyModule_AddIntConstant(m, "IPV6_MULTICAST_HOPS", IPV6_MULTICAST_HOPS);\r
+#endif\r
+#ifdef  IPV6_MULTICAST_IF\r
+    PyModule_AddIntConstant(m, "IPV6_MULTICAST_IF", IPV6_MULTICAST_IF);\r
+#endif\r
+#ifdef  IPV6_MULTICAST_LOOP\r
+    PyModule_AddIntConstant(m, "IPV6_MULTICAST_LOOP", IPV6_MULTICAST_LOOP);\r
+#endif\r
+#ifdef  IPV6_UNICAST_HOPS\r
+    PyModule_AddIntConstant(m, "IPV6_UNICAST_HOPS", IPV6_UNICAST_HOPS);\r
+#endif\r
+    /* Additional IPV6 socket options, defined in RFC 3493 */\r
+#ifdef IPV6_V6ONLY\r
+    PyModule_AddIntConstant(m, "IPV6_V6ONLY", IPV6_V6ONLY);\r
+#endif\r
+    /* Advanced IPV6 socket options, from RFC 3542 */\r
+#ifdef IPV6_CHECKSUM\r
+    PyModule_AddIntConstant(m, "IPV6_CHECKSUM", IPV6_CHECKSUM);\r
+#endif\r
+#ifdef IPV6_DONTFRAG\r
+    PyModule_AddIntConstant(m, "IPV6_DONTFRAG", IPV6_DONTFRAG);\r
+#endif\r
+#ifdef IPV6_DSTOPTS\r
+    PyModule_AddIntConstant(m, "IPV6_DSTOPTS", IPV6_DSTOPTS);\r
+#endif\r
+#ifdef IPV6_HOPLIMIT\r
+    PyModule_AddIntConstant(m, "IPV6_HOPLIMIT", IPV6_HOPLIMIT);\r
+#endif\r
+#ifdef IPV6_HOPOPTS\r
+    PyModule_AddIntConstant(m, "IPV6_HOPOPTS", IPV6_HOPOPTS);\r
+#endif\r
+#ifdef IPV6_NEXTHOP\r
+    PyModule_AddIntConstant(m, "IPV6_NEXTHOP", IPV6_NEXTHOP);\r
+#endif\r
+#ifdef IPV6_PATHMTU\r
+    PyModule_AddIntConstant(m, "IPV6_PATHMTU", IPV6_PATHMTU);\r
+#endif\r
+#ifdef IPV6_PKTINFO\r
+    PyModule_AddIntConstant(m, "IPV6_PKTINFO", IPV6_PKTINFO);\r
+#endif\r
+#ifdef IPV6_RECVDSTOPTS\r
+    PyModule_AddIntConstant(m, "IPV6_RECVDSTOPTS", IPV6_RECVDSTOPTS);\r
+#endif\r
+#ifdef IPV6_RECVHOPLIMIT\r
+    PyModule_AddIntConstant(m, "IPV6_RECVHOPLIMIT", IPV6_RECVHOPLIMIT);\r
+#endif\r
+#ifdef IPV6_RECVHOPOPTS\r
+    PyModule_AddIntConstant(m, "IPV6_RECVHOPOPTS", IPV6_RECVHOPOPTS);\r
+#endif\r
+#ifdef IPV6_RECVPKTINFO\r
+    PyModule_AddIntConstant(m, "IPV6_RECVPKTINFO", IPV6_RECVPKTINFO);\r
+#endif\r
+#ifdef IPV6_RECVRTHDR\r
+    PyModule_AddIntConstant(m, "IPV6_RECVRTHDR", IPV6_RECVRTHDR);\r
+#endif\r
+#ifdef IPV6_RECVTCLASS\r
+    PyModule_AddIntConstant(m, "IPV6_RECVTCLASS", IPV6_RECVTCLASS);\r
+#endif\r
+#ifdef IPV6_RTHDR\r
+    PyModule_AddIntConstant(m, "IPV6_RTHDR", IPV6_RTHDR);\r
+#endif\r
+#ifdef IPV6_RTHDRDSTOPTS\r
+    PyModule_AddIntConstant(m, "IPV6_RTHDRDSTOPTS", IPV6_RTHDRDSTOPTS);\r
+#endif\r
+#ifdef IPV6_RTHDR_TYPE_0\r
+    PyModule_AddIntConstant(m, "IPV6_RTHDR_TYPE_0", IPV6_RTHDR_TYPE_0);\r
+#endif\r
+#ifdef IPV6_RECVPATHMTU\r
+    PyModule_AddIntConstant(m, "IPV6_RECVPATHMTU", IPV6_RECVPATHMTU);\r
+#endif\r
+#ifdef IPV6_TCLASS\r
+    PyModule_AddIntConstant(m, "IPV6_TCLASS", IPV6_TCLASS);\r
+#endif\r
+#ifdef IPV6_USE_MIN_MTU\r
+    PyModule_AddIntConstant(m, "IPV6_USE_MIN_MTU", IPV6_USE_MIN_MTU);\r
+#endif\r
+\r
+    /* TCP options */\r
+#ifdef  TCP_NODELAY\r
+    PyModule_AddIntConstant(m, "TCP_NODELAY", TCP_NODELAY);\r
+#endif\r
+#ifdef  TCP_MAXSEG\r
+    PyModule_AddIntConstant(m, "TCP_MAXSEG", TCP_MAXSEG);\r
+#endif\r
+#ifdef  TCP_CORK\r
+    PyModule_AddIntConstant(m, "TCP_CORK", TCP_CORK);\r
+#endif\r
+#ifdef  TCP_KEEPIDLE\r
+    PyModule_AddIntConstant(m, "TCP_KEEPIDLE", TCP_KEEPIDLE);\r
+#endif\r
+#ifdef  TCP_KEEPINTVL\r
+    PyModule_AddIntConstant(m, "TCP_KEEPINTVL", TCP_KEEPINTVL);\r
+#endif\r
+#ifdef  TCP_KEEPCNT\r
+    PyModule_AddIntConstant(m, "TCP_KEEPCNT", TCP_KEEPCNT);\r
+#endif\r
+#ifdef  TCP_SYNCNT\r
+    PyModule_AddIntConstant(m, "TCP_SYNCNT", TCP_SYNCNT);\r
+#endif\r
+#ifdef  TCP_LINGER2\r
+    PyModule_AddIntConstant(m, "TCP_LINGER2", TCP_LINGER2);\r
+#endif\r
+#ifdef  TCP_DEFER_ACCEPT\r
+    PyModule_AddIntConstant(m, "TCP_DEFER_ACCEPT", TCP_DEFER_ACCEPT);\r
+#endif\r
+#ifdef  TCP_WINDOW_CLAMP\r
+    PyModule_AddIntConstant(m, "TCP_WINDOW_CLAMP", TCP_WINDOW_CLAMP);\r
+#endif\r
+#ifdef  TCP_INFO\r
+    PyModule_AddIntConstant(m, "TCP_INFO", TCP_INFO);\r
+#endif\r
+#ifdef  TCP_QUICKACK\r
+    PyModule_AddIntConstant(m, "TCP_QUICKACK", TCP_QUICKACK);\r
+#endif\r
+\r
+\r
+    /* IPX options */\r
+#ifdef  IPX_TYPE\r
+    PyModule_AddIntConstant(m, "IPX_TYPE", IPX_TYPE);\r
+#endif\r
+\r
+    /* get{addr,name}info parameters */\r
+#ifdef EAI_ADDRFAMILY\r
+    PyModule_AddIntConstant(m, "EAI_ADDRFAMILY", EAI_ADDRFAMILY);\r
+#endif\r
+#ifdef EAI_AGAIN\r
+    PyModule_AddIntConstant(m, "EAI_AGAIN", EAI_AGAIN);\r
+#endif\r
+#ifdef EAI_BADFLAGS\r
+    PyModule_AddIntConstant(m, "EAI_BADFLAGS", EAI_BADFLAGS);\r
+#endif\r
+#ifdef EAI_FAIL\r
+    PyModule_AddIntConstant(m, "EAI_FAIL", EAI_FAIL);\r
+#endif\r
+#ifdef EAI_FAMILY\r
+    PyModule_AddIntConstant(m, "EAI_FAMILY", EAI_FAMILY);\r
+#endif\r
+#ifdef EAI_MEMORY\r
+    PyModule_AddIntConstant(m, "EAI_MEMORY", EAI_MEMORY);\r
+#endif\r
+#ifdef EAI_NODATA\r
+    PyModule_AddIntConstant(m, "EAI_NODATA", EAI_NODATA);\r
+#endif\r
+#ifdef EAI_NONAME\r
+    PyModule_AddIntConstant(m, "EAI_NONAME", EAI_NONAME);\r
+#endif\r
+#ifdef EAI_OVERFLOW\r
+    PyModule_AddIntConstant(m, "EAI_OVERFLOW", EAI_OVERFLOW);\r
+#endif\r
+#ifdef EAI_SERVICE\r
+    PyModule_AddIntConstant(m, "EAI_SERVICE", EAI_SERVICE);\r
+#endif\r
+#ifdef EAI_SOCKTYPE\r
+    PyModule_AddIntConstant(m, "EAI_SOCKTYPE", EAI_SOCKTYPE);\r
+#endif\r
+#ifdef EAI_SYSTEM\r
+    PyModule_AddIntConstant(m, "EAI_SYSTEM", EAI_SYSTEM);\r
+#endif\r
+#ifdef EAI_BADHINTS\r
+    PyModule_AddIntConstant(m, "EAI_BADHINTS", EAI_BADHINTS);\r
+#endif\r
+#ifdef EAI_PROTOCOL\r
+    PyModule_AddIntConstant(m, "EAI_PROTOCOL", EAI_PROTOCOL);\r
+#endif\r
+#ifdef EAI_MAX\r
+    PyModule_AddIntConstant(m, "EAI_MAX", EAI_MAX);\r
+#endif\r
+#ifdef AI_PASSIVE\r
+    PyModule_AddIntConstant(m, "AI_PASSIVE", AI_PASSIVE);\r
+#endif\r
+#ifdef AI_CANONNAME\r
+    PyModule_AddIntConstant(m, "AI_CANONNAME", AI_CANONNAME);\r
+#endif\r
+#ifdef AI_NUMERICHOST\r
+    PyModule_AddIntConstant(m, "AI_NUMERICHOST", AI_NUMERICHOST);\r
+#endif\r
+#ifdef AI_NUMERICSERV\r
+    PyModule_AddIntConstant(m, "AI_NUMERICSERV", AI_NUMERICSERV);\r
+#endif\r
+#ifdef AI_MASK\r
+    PyModule_AddIntConstant(m, "AI_MASK", AI_MASK);\r
+#endif\r
+#ifdef AI_ALL\r
+    PyModule_AddIntConstant(m, "AI_ALL", AI_ALL);\r
+#endif\r
+#ifdef AI_V4MAPPED_CFG\r
+    PyModule_AddIntConstant(m, "AI_V4MAPPED_CFG", AI_V4MAPPED_CFG);\r
+#endif\r
+#ifdef AI_ADDRCONFIG\r
+    PyModule_AddIntConstant(m, "AI_ADDRCONFIG", AI_ADDRCONFIG);\r
+#endif\r
+#ifdef AI_V4MAPPED\r
+    PyModule_AddIntConstant(m, "AI_V4MAPPED", AI_V4MAPPED);\r
+#endif\r
+#ifdef AI_DEFAULT\r
+    PyModule_AddIntConstant(m, "AI_DEFAULT", AI_DEFAULT);\r
+#endif\r
+#ifdef NI_MAXHOST\r
+    PyModule_AddIntConstant(m, "NI_MAXHOST", NI_MAXHOST);\r
+#endif\r
+#ifdef NI_MAXSERV\r
+    PyModule_AddIntConstant(m, "NI_MAXSERV", NI_MAXSERV);\r
+#endif\r
+#ifdef NI_NOFQDN\r
+    PyModule_AddIntConstant(m, "NI_NOFQDN", NI_NOFQDN);\r
+#endif\r
+#ifdef NI_NUMERICHOST\r
+    PyModule_AddIntConstant(m, "NI_NUMERICHOST", NI_NUMERICHOST);\r
+#endif\r
+#ifdef NI_NAMEREQD\r
+    PyModule_AddIntConstant(m, "NI_NAMEREQD", NI_NAMEREQD);\r
+#endif\r
+#ifdef NI_NUMERICSERV\r
+    PyModule_AddIntConstant(m, "NI_NUMERICSERV", NI_NUMERICSERV);\r
+#endif\r
+#ifdef NI_DGRAM\r
+    PyModule_AddIntConstant(m, "NI_DGRAM", NI_DGRAM);\r
+#endif\r
+\r
+    /* shutdown() parameters */\r
+#ifdef SHUT_RD\r
+    PyModule_AddIntConstant(m, "SHUT_RD", SHUT_RD);\r
+#elif defined(SD_RECEIVE)\r
+    PyModule_AddIntConstant(m, "SHUT_RD", SD_RECEIVE);\r
+#else\r
+    PyModule_AddIntConstant(m, "SHUT_RD", 0);\r
+#endif\r
+#ifdef SHUT_WR\r
+    PyModule_AddIntConstant(m, "SHUT_WR", SHUT_WR);\r
+#elif defined(SD_SEND)\r
+    PyModule_AddIntConstant(m, "SHUT_WR", SD_SEND);\r
+#else\r
+    PyModule_AddIntConstant(m, "SHUT_WR", 1);\r
+#endif\r
+#ifdef SHUT_RDWR\r
+    PyModule_AddIntConstant(m, "SHUT_RDWR", SHUT_RDWR);\r
+#elif defined(SD_BOTH)\r
+    PyModule_AddIntConstant(m, "SHUT_RDWR", SD_BOTH);\r
+#else\r
+    PyModule_AddIntConstant(m, "SHUT_RDWR", 2);\r
+#endif\r
+\r
+#ifdef SIO_RCVALL\r
+    {\r
+        DWORD codes[] = {SIO_RCVALL, SIO_KEEPALIVE_VALS};\r
+        const char *names[] = {"SIO_RCVALL", "SIO_KEEPALIVE_VALS"};\r
+        int i;\r
+        for(i = 0; i<sizeof(codes)/sizeof(*codes); ++i) {\r
+            PyObject *tmp;\r
+            tmp = PyLong_FromUnsignedLong(codes[i]);\r
+            if (tmp == NULL)\r
+                return;\r
+            PyModule_AddObject(m, names[i], tmp);\r
+        }\r
+    }\r
+    PyModule_AddIntConstant(m, "RCVALL_OFF", RCVALL_OFF);\r
+    PyModule_AddIntConstant(m, "RCVALL_ON", RCVALL_ON);\r
+    PyModule_AddIntConstant(m, "RCVALL_SOCKETLEVELONLY", RCVALL_SOCKETLEVELONLY);\r
+#ifdef RCVALL_IPLEVEL\r
+    PyModule_AddIntConstant(m, "RCVALL_IPLEVEL", RCVALL_IPLEVEL);\r
+#endif\r
+#ifdef RCVALL_MAX\r
+    PyModule_AddIntConstant(m, "RCVALL_MAX", RCVALL_MAX);\r
+#endif\r
+#endif /* _MSTCPIP_ */\r
+\r
+    /* Initialize gethostbyname lock */\r
+#if defined(USE_GETHOSTBYNAME_LOCK) || defined(USE_GETADDRINFO_LOCK)\r
+    netdb_lock = PyThread_allocate_lock();\r
+#endif\r
+}\r
+\r
+\r
+#ifndef HAVE_INET_PTON\r
+#if !defined(NTDDI_VERSION) || (NTDDI_VERSION < NTDDI_LONGHORN)\r
+\r
+/* Simplistic emulation code for inet_pton that only works for IPv4 */\r
+/* These are not exposed because they do not set errno properly */\r
+\r
+int\r
+inet_pton(int af, const char *src, void *dst)\r
+{\r
+    if (af == AF_INET) {\r
+#if (SIZEOF_INT != 4)\r
+#error "Not sure if in_addr_t exists and int is not 32-bits."\r
+#endif\r
+        unsigned int packed_addr;\r
+        packed_addr = inet_addr(src);\r
+        if (packed_addr == INADDR_NONE)\r
+            return 0;\r
+        memcpy(dst, &packed_addr, 4);\r
+        return 1;\r
+    }\r
+    /* Should set errno to EAFNOSUPPORT */\r
+    return -1;\r
+}\r
+\r
+const char *\r
+inet_ntop(int af, const void *src, char *dst, socklen_t size)\r
+{\r
+    if (af == AF_INET) {\r
+        struct in_addr packed_addr;\r
+        if (size < 16)\r
+            /* Should set errno to ENOSPC. */\r
+            return NULL;\r
+        memcpy(&packed_addr, src, sizeof(packed_addr));\r
+        return strncpy(dst, inet_ntoa(packed_addr), size);\r
+    }\r
+    /* Should set errno to EAFNOSUPPORT */\r
+    return NULL;\r
+}\r
+\r
+#endif\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/socketmodule.h
new file mode 100644 (file)
index 0000000..1c9e5af
--- /dev/null
@@ -0,0 +1,251 @@
+/* Socket module header file */\r
+\r
+/* Includes needed for the sockaddr_* symbols below */\r
+#ifndef MS_WINDOWS\r
+#ifdef __VMS\r
+#   include <socket.h>\r
+# else\r
+#   include <sys/socket.h>\r
+# endif\r
+# include <netinet/in.h>\r
+# if !(defined(__BEOS__) || defined(__CYGWIN__) || (defined(PYOS_OS2) && defined(PYCC_VACPP)))\r
+#  include <netinet/tcp.h>\r
+# endif\r
+\r
+#else /* MS_WINDOWS */\r
+# include <winsock2.h>\r
+# include <ws2tcpip.h>\r
+/* VC6 is shipped with old platform headers, and does not have MSTcpIP.h\r
+ * Separate SDKs have all the functions we want, but older ones don't have\r
+ * any version information.\r
+ * I use SIO_GET_MULTICAST_FILTER to detect a decent SDK.\r
+ */\r
+# ifdef SIO_GET_MULTICAST_FILTER\r
+#  include <MSTcpIP.h> /* for SIO_RCVALL */\r
+#  define HAVE_ADDRINFO\r
+#  define HAVE_SOCKADDR_STORAGE\r
+#  define HAVE_GETADDRINFO\r
+#  define HAVE_GETNAMEINFO\r
+#  define ENABLE_IPV6\r
+# else\r
+typedef int socklen_t;\r
+# endif /* IPPROTO_IPV6 */\r
+#endif /* MS_WINDOWS */\r
+\r
+#ifdef HAVE_SYS_UN_H\r
+# include <sys/un.h>\r
+#else\r
+# undef AF_UNIX\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_NETLINK_H\r
+# ifdef HAVE_ASM_TYPES_H\r
+#  include <asm/types.h>\r
+# endif\r
+# include <linux/netlink.h>\r
+#else\r
+#  undef AF_NETLINK\r
+#endif\r
+\r
+#ifdef HAVE_BLUETOOTH_BLUETOOTH_H\r
+#include <bluetooth/bluetooth.h>\r
+#include <bluetooth/rfcomm.h>\r
+#include <bluetooth/l2cap.h>\r
+#include <bluetooth/sco.h>\r
+#include <bluetooth/hci.h>\r
+#endif\r
+\r
+#ifdef HAVE_BLUETOOTH_H\r
+#include <bluetooth.h>\r
+#endif\r
+\r
+#ifdef HAVE_NETPACKET_PACKET_H\r
+# include <sys/ioctl.h>\r
+# include <net/if.h>\r
+# include <netpacket/packet.h>\r
+#endif\r
+\r
+#ifdef HAVE_LINUX_TIPC_H\r
+# include <linux/tipc.h>\r
+#endif\r
+\r
+#ifndef Py__SOCKET_H\r
+#define Py__SOCKET_H\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+/* Python module and C API name */\r
+#define PySocket_MODULE_NAME    "_socket"\r
+#define PySocket_CAPI_NAME      "CAPI"\r
+#define PySocket_CAPSULE_NAME  (PySocket_MODULE_NAME "." PySocket_CAPI_NAME)\r
+\r
+/* Abstract the socket file descriptor type */\r
+#ifdef MS_WINDOWS\r
+typedef SOCKET SOCKET_T;\r
+#       ifdef MS_WIN64\r
+#               define SIZEOF_SOCKET_T 8\r
+#       else\r
+#               define SIZEOF_SOCKET_T 4\r
+#       endif\r
+#else\r
+typedef int SOCKET_T;\r
+#       define SIZEOF_SOCKET_T SIZEOF_INT\r
+#endif\r
+\r
+/* Socket address */\r
+typedef union sock_addr {\r
+    struct sockaddr_in in;\r
+#ifdef AF_UNIX\r
+    struct sockaddr_un un;\r
+#endif\r
+#ifdef AF_NETLINK\r
+    struct sockaddr_nl nl;\r
+#endif\r
+#ifdef ENABLE_IPV6\r
+    struct sockaddr_in6 in6;\r
+    struct sockaddr_storage storage;\r
+#endif\r
+#ifdef HAVE_BLUETOOTH_BLUETOOTH_H\r
+    struct sockaddr_l2 bt_l2;\r
+    struct sockaddr_rc bt_rc;\r
+    struct sockaddr_sco bt_sco;\r
+    struct sockaddr_hci bt_hci;\r
+#endif\r
+#ifdef HAVE_NETPACKET_PACKET_H\r
+    struct sockaddr_ll ll;\r
+#endif\r
+} sock_addr_t;\r
+\r
+/* The object holding a socket.  It holds some extra information,\r
+   like the address family, which is used to decode socket address\r
+   arguments properly. */\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    SOCKET_T sock_fd;           /* Socket file descriptor */\r
+    int sock_family;            /* Address family, e.g., AF_INET */\r
+    int sock_type;              /* Socket type, e.g., SOCK_STREAM */\r
+    int sock_proto;             /* Protocol type, usually 0 */\r
+    PyObject *(*errorhandler)(void); /* Error handler; checks\r
+                                        errno, returns NULL and\r
+                                        sets a Python exception */\r
+    double sock_timeout;                 /* Operation timeout in seconds;\r
+                                        0.0 means non-blocking */\r
+    PyObject *weakreflist;\r
+} PySocketSockObject;\r
+\r
+/* --- C API ----------------------------------------------------*/\r
+\r
+/* Short explanation of what this C API export mechanism does\r
+   and how it works:\r
+\r
+    The _ssl module needs access to the type object defined in\r
+    the _socket module. Since cross-DLL linking introduces a lot of\r
+    problems on many platforms, the "trick" is to wrap the\r
+    C API of a module in a struct which then gets exported to\r
+    other modules via a PyCapsule.\r
+\r
+    The code in socketmodule.c defines this struct (which currently\r
+    only contains the type object reference, but could very\r
+    well also include other C APIs needed by other modules)\r
+    and exports it as PyCapsule via the module dictionary\r
+    under the name "CAPI".\r
+\r
+    Other modules can now include the socketmodule.h file\r
+    which defines the needed C APIs to import and set up\r
+    a static copy of this struct in the importing module.\r
+\r
+    After initialization, the importing module can then\r
+    access the C APIs from the _socket module by simply\r
+    referring to the static struct, e.g.\r
+\r
+    Load _socket module and its C API; this sets up the global\r
+    PySocketModule:\r
+\r
+    if (PySocketModule_ImportModuleAndAPI())\r
+        return;\r
+\r
+\r
+    Now use the C API as if it were defined in the using\r
+    module:\r
+\r
+    if (!PyArg_ParseTuple(args, "O!|zz:ssl",\r
+\r
+                          PySocketModule.Sock_Type,\r
+\r
+                          (PyObject*)&Sock,\r
+                          &key_file, &cert_file))\r
+        return NULL;\r
+\r
+    Support could easily be extended to export more C APIs/symbols\r
+    this way. Currently, only the type object is exported,\r
+    other candidates would be socket constructors and socket\r
+    access functions.\r
+\r
+*/\r
+\r
+/* C API for usage by other Python modules */\r
+typedef struct {\r
+    PyTypeObject *Sock_Type;\r
+    PyObject *error;\r
+} PySocketModule_APIObject;\r
+\r
+/* XXX The net effect of the following appears to be to define a function\r
+   XXX named PySocketModule_APIObject in _ssl.c.  It's unclear why it isn't\r
+   XXX defined there directly.\r
+\r
+   >>> It's defined here because other modules might also want to use\r
+   >>> the C API.\r
+\r
+*/\r
+#ifndef PySocket_BUILDING_SOCKET\r
+\r
+/* --- C API ----------------------------------------------------*/\r
+\r
+/* Interfacestructure to C API for other modules.\r
+   Call PySocketModule_ImportModuleAndAPI() to initialize this\r
+   structure. After that usage is simple:\r
+\r
+   if (!PyArg_ParseTuple(args, "O!|zz:ssl",\r
+                         &PySocketModule.Sock_Type, (PyObject*)&Sock,\r
+                         &key_file, &cert_file))\r
+     return NULL;\r
+   ...\r
+*/\r
+\r
+static\r
+PySocketModule_APIObject PySocketModule;\r
+\r
+/* You *must* call this before using any of the functions in\r
+   PySocketModule and check its outcome; otherwise all accesses will\r
+   result in a segfault. Returns 0 on success. */\r
+\r
+#ifndef DPRINTF\r
+# define DPRINTF if (0) printf\r
+#endif\r
+\r
+static\r
+int PySocketModule_ImportModuleAndAPI(void)\r
+{\r
+    void *api;\r
+\r
+  DPRINTF(" Loading capsule %s\n", PySocket_CAPSULE_NAME);\r
+  api = PyCapsule_Import(PySocket_CAPSULE_NAME, 1);\r
+    if (api == NULL)\r
+        goto onError;\r
+    memcpy(&PySocketModule, api, sizeof(PySocketModule));\r
+    DPRINTF(" API object loaded and initialized.\n");\r
+    return 0;\r
+\r
+ onError:\r
+    DPRINTF(" not found.\n");\r
+    return -1;\r
+}\r
+\r
+#endif /* !PySocket_BUILDING_SOCKET */\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+#endif /* !Py__SOCKET_H */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/sre.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/sre.h
new file mode 100644 (file)
index 0000000..fd66f47
--- /dev/null
@@ -0,0 +1,104 @@
+/*\r
+ * Secret Labs' Regular Expression Engine\r
+ *\r
+ * regular expression matching engine\r
+ *\r
+ * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.\r
+ *\r
+ * See the _sre.c file for information on usage and redistribution.\r
+ */\r
+\r
+#ifndef SRE_INCLUDED\r
+#define SRE_INCLUDED\r
+\r
+#include "sre_constants.h"\r
+\r
+/* size of a code word (must be unsigned short or larger, and\r
+   large enough to hold a UCS4 character) */\r
+#ifdef Py_USING_UNICODE\r
+# define SRE_CODE Py_UCS4\r
+# if SIZEOF_SIZE_T > 4\r
+#  define SRE_MAXREPEAT (~(SRE_CODE)0)\r
+# else\r
+#  define SRE_MAXREPEAT ((SRE_CODE)PY_SSIZE_T_MAX)\r
+# endif\r
+#else\r
+# define SRE_CODE unsigned int\r
+# if SIZEOF_SIZE_T > SIZEOF_INT\r
+#  define SRE_MAXREPEAT (~(SRE_CODE)0)\r
+# else\r
+#  define SRE_MAXREPEAT ((SRE_CODE)PY_SSIZE_T_MAX)\r
+# endif\r
+#endif\r
+\r
+typedef struct {\r
+    PyObject_VAR_HEAD\r
+    Py_ssize_t groups; /* must be first! */\r
+    PyObject* groupindex;\r
+    PyObject* indexgroup;\r
+    /* compatibility */\r
+    PyObject* pattern; /* pattern source (or None) */\r
+    int flags; /* flags used when compiling pattern source */\r
+    PyObject *weakreflist; /* List of weak references */\r
+    /* pattern code */\r
+    Py_ssize_t codesize;\r
+    SRE_CODE code[1];\r
+} PatternObject;\r
+\r
+#define PatternObject_GetCode(o) (((PatternObject*)(o))->code)\r
+\r
+typedef struct {\r
+    PyObject_VAR_HEAD\r
+    PyObject* string; /* link to the target string (must be first) */\r
+    PyObject* regs; /* cached list of matching spans */\r
+    PatternObject* pattern; /* link to the regex (pattern) object */\r
+    Py_ssize_t pos, endpos; /* current target slice */\r
+    Py_ssize_t lastindex; /* last index marker seen by the engine (-1 if none) */\r
+    Py_ssize_t groups; /* number of groups (start/end marks) */\r
+    Py_ssize_t mark[1];\r
+} MatchObject;\r
+\r
+typedef unsigned int (*SRE_TOLOWER_HOOK)(unsigned int ch);\r
+\r
+/* FIXME: <fl> shouldn't be a constant, really... */\r
+#define SRE_MARK_SIZE 200\r
+\r
+typedef struct SRE_REPEAT_T {\r
+    Py_ssize_t count;\r
+    SRE_CODE* pattern; /* points to REPEAT operator arguments */\r
+    void* last_ptr; /* helper to check for infinite loops */\r
+    struct SRE_REPEAT_T *prev; /* points to previous repeat context */\r
+} SRE_REPEAT;\r
+\r
+typedef struct {\r
+    /* string pointers */\r
+    void* ptr; /* current position (also end of current slice) */\r
+    void* beginning; /* start of original string */\r
+    void* start; /* start of current slice */\r
+    void* end; /* end of original string */\r
+    /* attributes for the match object */\r
+    PyObject* string;\r
+    Py_ssize_t pos, endpos;\r
+    /* character size */\r
+    int charsize;\r
+    /* registers */\r
+    Py_ssize_t lastindex;\r
+    Py_ssize_t lastmark;\r
+    void* mark[SRE_MARK_SIZE];\r
+    /* dynamically allocated stuff */\r
+    char* data_stack;\r
+    size_t data_stack_size;\r
+    size_t data_stack_base;\r
+    /* current repeat context */\r
+    SRE_REPEAT *repeat;\r
+    /* hooks */\r
+    SRE_TOLOWER_HOOK lower;\r
+} SRE_STATE;\r
+\r
+typedef struct {\r
+    PyObject_HEAD\r
+    PyObject* pattern;\r
+    SRE_STATE state;\r
+} ScannerObject;\r
+\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/sre_constants.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/sre_constants.h
new file mode 100644 (file)
index 0000000..c0e2f0d
--- /dev/null
@@ -0,0 +1,86 @@
+/*\r
+ * Secret Labs' Regular Expression Engine\r
+ *\r
+ * regular expression matching engine\r
+ *\r
+ * NOTE: This file is generated by sre_constants.py.  If you need\r
+ * to change anything in here, edit sre_constants.py and run it.\r
+ *\r
+ * Copyright (c) 1997-2001 by Secret Labs AB.  All rights reserved.\r
+ *\r
+ * See the _sre.c file for information on usage and redistribution.\r
+ */\r
+\r
+#define SRE_MAGIC 20031017\r
+#define SRE_OP_FAILURE 0\r
+#define SRE_OP_SUCCESS 1\r
+#define SRE_OP_ANY 2\r
+#define SRE_OP_ANY_ALL 3\r
+#define SRE_OP_ASSERT 4\r
+#define SRE_OP_ASSERT_NOT 5\r
+#define SRE_OP_AT 6\r
+#define SRE_OP_BRANCH 7\r
+#define SRE_OP_CALL 8\r
+#define SRE_OP_CATEGORY 9\r
+#define SRE_OP_CHARSET 10\r
+#define SRE_OP_BIGCHARSET 11\r
+#define SRE_OP_GROUPREF 12\r
+#define SRE_OP_GROUPREF_EXISTS 13\r
+#define SRE_OP_GROUPREF_IGNORE 14\r
+#define SRE_OP_IN 15\r
+#define SRE_OP_IN_IGNORE 16\r
+#define SRE_OP_INFO 17\r
+#define SRE_OP_JUMP 18\r
+#define SRE_OP_LITERAL 19\r
+#define SRE_OP_LITERAL_IGNORE 20\r
+#define SRE_OP_MARK 21\r
+#define SRE_OP_MAX_UNTIL 22\r
+#define SRE_OP_MIN_UNTIL 23\r
+#define SRE_OP_NOT_LITERAL 24\r
+#define SRE_OP_NOT_LITERAL_IGNORE 25\r
+#define SRE_OP_NEGATE 26\r
+#define SRE_OP_RANGE 27\r
+#define SRE_OP_REPEAT 28\r
+#define SRE_OP_REPEAT_ONE 29\r
+#define SRE_OP_SUBPATTERN 30\r
+#define SRE_OP_MIN_REPEAT_ONE 31\r
+#define SRE_AT_BEGINNING 0\r
+#define SRE_AT_BEGINNING_LINE 1\r
+#define SRE_AT_BEGINNING_STRING 2\r
+#define SRE_AT_BOUNDARY 3\r
+#define SRE_AT_NON_BOUNDARY 4\r
+#define SRE_AT_END 5\r
+#define SRE_AT_END_LINE 6\r
+#define SRE_AT_END_STRING 7\r
+#define SRE_AT_LOC_BOUNDARY 8\r
+#define SRE_AT_LOC_NON_BOUNDARY 9\r
+#define SRE_AT_UNI_BOUNDARY 10\r
+#define SRE_AT_UNI_NON_BOUNDARY 11\r
+#define SRE_CATEGORY_DIGIT 0\r
+#define SRE_CATEGORY_NOT_DIGIT 1\r
+#define SRE_CATEGORY_SPACE 2\r
+#define SRE_CATEGORY_NOT_SPACE 3\r
+#define SRE_CATEGORY_WORD 4\r
+#define SRE_CATEGORY_NOT_WORD 5\r
+#define SRE_CATEGORY_LINEBREAK 6\r
+#define SRE_CATEGORY_NOT_LINEBREAK 7\r
+#define SRE_CATEGORY_LOC_WORD 8\r
+#define SRE_CATEGORY_LOC_NOT_WORD 9\r
+#define SRE_CATEGORY_UNI_DIGIT 10\r
+#define SRE_CATEGORY_UNI_NOT_DIGIT 11\r
+#define SRE_CATEGORY_UNI_SPACE 12\r
+#define SRE_CATEGORY_UNI_NOT_SPACE 13\r
+#define SRE_CATEGORY_UNI_WORD 14\r
+#define SRE_CATEGORY_UNI_NOT_WORD 15\r
+#define SRE_CATEGORY_UNI_LINEBREAK 16\r
+#define SRE_CATEGORY_UNI_NOT_LINEBREAK 17\r
+#define SRE_FLAG_TEMPLATE 1\r
+#define SRE_FLAG_IGNORECASE 2\r
+#define SRE_FLAG_LOCALE 4\r
+#define SRE_FLAG_MULTILINE 8\r
+#define SRE_FLAG_DOTALL 16\r
+#define SRE_FLAG_UNICODE 32\r
+#define SRE_FLAG_VERBOSE 64\r
+#define SRE_INFO_PREFIX 1\r
+#define SRE_INFO_LITERAL 2\r
+#define SRE_INFO_CHARSET 4\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/stropmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/stropmodule.c
new file mode 100644 (file)
index 0000000..cdc6cb8
--- /dev/null
@@ -0,0 +1,1272 @@
+/* strop module */\r
+\r
+#define PY_SSIZE_T_CLEAN\r
+#include "Python.h"\r
+#include <ctype.h>\r
+\r
+PyDoc_STRVAR(strop_module__doc__,\r
+"Common string manipulations, optimized for speed.\n"\r
+"\n"\r
+"Always use \"import string\" rather than referencing\n"\r
+"this module directly.");\r
+\r
+/* XXX This file assumes that the <ctype.h> is*() functions\r
+   XXX are defined for all 8-bit characters! */\r
+\r
+#define WARN if (PyErr_Warn(PyExc_DeprecationWarning, \\r
+               "strop functions are obsolete; use string methods")) \\r
+         return NULL\r
+\r
+/* The lstrip(), rstrip() and strip() functions are implemented\r
+   in do_strip(), which uses an additional parameter to indicate what\r
+   type of strip should occur. */\r
+\r
+#define LEFTSTRIP 0\r
+#define RIGHTSTRIP 1\r
+#define BOTHSTRIP 2\r
+\r
+\r
+static PyObject *\r
+split_whitespace(char *s, Py_ssize_t len, Py_ssize_t maxsplit)\r
+{\r
+    Py_ssize_t i = 0, j;\r
+    int err;\r
+    Py_ssize_t countsplit = 0;\r
+    PyObject* item;\r
+    PyObject *list = PyList_New(0);\r
+\r
+    if (list == NULL)\r
+        return NULL;\r
+\r
+    while (i < len) {\r
+        while (i < len && isspace(Py_CHARMASK(s[i]))) {\r
+            i = i+1;\r
+        }\r
+        j = i;\r
+        while (i < len && !isspace(Py_CHARMASK(s[i]))) {\r
+            i = i+1;\r
+        }\r
+        if (j < i) {\r
+            item = PyString_FromStringAndSize(s+j, i-j);\r
+            if (item == NULL)\r
+                goto finally;\r
+\r
+            err = PyList_Append(list, item);\r
+            Py_DECREF(item);\r
+            if (err < 0)\r
+                goto finally;\r
+\r
+            countsplit++;\r
+            while (i < len && isspace(Py_CHARMASK(s[i]))) {\r
+                i = i+1;\r
+            }\r
+            if (maxsplit && (countsplit >= maxsplit) && i < len) {\r
+                item = PyString_FromStringAndSize(\r
+                    s+i, len - i);\r
+                if (item == NULL)\r
+                    goto finally;\r
+\r
+                err = PyList_Append(list, item);\r
+                Py_DECREF(item);\r
+                if (err < 0)\r
+                    goto finally;\r
+\r
+                i = len;\r
+            }\r
+        }\r
+    }\r
+    return list;\r
+  finally:\r
+    Py_DECREF(list);\r
+    return NULL;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(splitfields__doc__,\r
+"split(s [,sep [,maxsplit]]) -> list of strings\n"\r
+"splitfields(s [,sep [,maxsplit]]) -> list of strings\n"\r
+"\n"\r
+"Return a list of the words in the string s, using sep as the\n"\r
+"delimiter string.  If maxsplit is nonzero, splits into at most\n"\r
+"maxsplit words.  If sep is not specified, any whitespace string\n"\r
+"is a separator.  Maxsplit defaults to 0.\n"\r
+"\n"\r
+"(split and splitfields are synonymous)");\r
+\r
+static PyObject *\r
+strop_splitfields(PyObject *self, PyObject *args)\r
+{\r
+    Py_ssize_t len, n, i, j, err;\r
+    Py_ssize_t splitcount, maxsplit;\r
+    char *s, *sub;\r
+    PyObject *list, *item;\r
+\r
+    WARN;\r
+    sub = NULL;\r
+    n = 0;\r
+    splitcount = 0;\r
+    maxsplit = 0;\r
+    if (!PyArg_ParseTuple(args, "t#|z#n:split", &s, &len, &sub, &n, &maxsplit))\r
+        return NULL;\r
+    if (sub == NULL)\r
+        return split_whitespace(s, len, maxsplit);\r
+    if (n == 0) {\r
+        PyErr_SetString(PyExc_ValueError, "empty separator");\r
+        return NULL;\r
+    }\r
+\r
+    list = PyList_New(0);\r
+    if (list == NULL)\r
+        return NULL;\r
+\r
+    i = j = 0;\r
+    while (i+n <= len) {\r
+        if (s[i] == sub[0] && (n == 1 || memcmp(s+i, sub, n) == 0)) {\r
+            item = PyString_FromStringAndSize(s+j, i-j);\r
+            if (item == NULL)\r
+                goto fail;\r
+            err = PyList_Append(list, item);\r
+            Py_DECREF(item);\r
+            if (err < 0)\r
+                goto fail;\r
+            i = j = i + n;\r
+            splitcount++;\r
+            if (maxsplit && (splitcount >= maxsplit))\r
+                break;\r
+        }\r
+        else\r
+            i++;\r
+    }\r
+    item = PyString_FromStringAndSize(s+j, len-j);\r
+    if (item == NULL)\r
+        goto fail;\r
+    err = PyList_Append(list, item);\r
+    Py_DECREF(item);\r
+    if (err < 0)\r
+        goto fail;\r
+\r
+    return list;\r
+\r
+ fail:\r
+    Py_DECREF(list);\r
+    return NULL;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(joinfields__doc__,\r
+"join(list [,sep]) -> string\n"\r
+"joinfields(list [,sep]) -> string\n"\r
+"\n"\r
+"Return a string composed of the words in list, with\n"\r
+"intervening occurrences of sep.  Sep defaults to a single\n"\r
+"space.\n"\r
+"\n"\r
+"(join and joinfields are synonymous)");\r
+\r
+static PyObject *\r
+strop_joinfields(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *seq;\r
+    char *sep = NULL;\r
+    Py_ssize_t seqlen, seplen = 0;\r
+    Py_ssize_t i, reslen = 0, slen = 0, sz = 100;\r
+    PyObject *res = NULL;\r
+    char* p = NULL;\r
+    ssizeargfunc getitemfunc;\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "O|t#:join", &seq, &sep, &seplen))\r
+        return NULL;\r
+    if (sep == NULL) {\r
+        sep = " ";\r
+        seplen = 1;\r
+    }\r
+\r
+    seqlen = PySequence_Size(seq);\r
+    if (seqlen < 0 && PyErr_Occurred())\r
+        return NULL;\r
+\r
+    if (seqlen == 1) {\r
+        /* Optimization if there's only one item */\r
+        PyObject *item = PySequence_GetItem(seq, 0);\r
+        if (item && !PyString_Check(item)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                     "first argument must be sequence of strings");\r
+            Py_DECREF(item);\r
+            return NULL;\r
+        }\r
+        return item;\r
+    }\r
+\r
+    if (!(res = PyString_FromStringAndSize((char*)NULL, sz)))\r
+        return NULL;\r
+    p = PyString_AsString(res);\r
+\r
+    /* optimize for lists, since it's the most common case.  all others\r
+     * (tuples and arbitrary sequences) just use the sequence abstract\r
+     * interface.\r
+     */\r
+    if (PyList_Check(seq)) {\r
+        for (i = 0; i < seqlen; i++) {\r
+            PyObject *item = PyList_GET_ITEM(seq, i);\r
+            if (!PyString_Check(item)) {\r
+                PyErr_SetString(PyExc_TypeError,\r
+                "first argument must be sequence of strings");\r
+                Py_DECREF(res);\r
+                return NULL;\r
+            }\r
+            slen = PyString_GET_SIZE(item);\r
+            if (slen > PY_SSIZE_T_MAX - reslen ||\r
+                seplen > PY_SSIZE_T_MAX - reslen - seplen) {\r
+                PyErr_SetString(PyExc_OverflowError,\r
+                                "input too long");\r
+                Py_DECREF(res);\r
+                return NULL;\r
+            }\r
+            while (reslen + slen + seplen >= sz) {\r
+                if (_PyString_Resize(&res, sz * 2) < 0)\r
+                    return NULL;\r
+                sz *= 2;\r
+                p = PyString_AsString(res) + reslen;\r
+            }\r
+            if (i > 0) {\r
+                memcpy(p, sep, seplen);\r
+                p += seplen;\r
+                reslen += seplen;\r
+            }\r
+            memcpy(p, PyString_AS_STRING(item), slen);\r
+            p += slen;\r
+            reslen += slen;\r
+        }\r
+        _PyString_Resize(&res, reslen);\r
+        return res;\r
+    }\r
+\r
+    if (seq->ob_type->tp_as_sequence == NULL ||\r
+             (getitemfunc = seq->ob_type->tp_as_sequence->sq_item) == NULL)\r
+    {\r
+        PyErr_SetString(PyExc_TypeError,\r
+                        "first argument must be a sequence");\r
+        return NULL;\r
+    }\r
+    /* This is now type safe */\r
+    for (i = 0; i < seqlen; i++) {\r
+        PyObject *item = getitemfunc(seq, i);\r
+        if (!item || !PyString_Check(item)) {\r
+            PyErr_SetString(PyExc_TypeError,\r
+                     "first argument must be sequence of strings");\r
+            Py_DECREF(res);\r
+            Py_XDECREF(item);\r
+            return NULL;\r
+        }\r
+        slen = PyString_GET_SIZE(item);\r
+        if (slen > PY_SSIZE_T_MAX - reslen ||\r
+            seplen > PY_SSIZE_T_MAX - reslen - seplen) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                            "input too long");\r
+            Py_DECREF(res);\r
+            Py_XDECREF(item);\r
+            return NULL;\r
+        }\r
+        while (reslen + slen + seplen >= sz) {\r
+            if (_PyString_Resize(&res, sz * 2) < 0) {\r
+                Py_DECREF(item);\r
+                return NULL;\r
+            }\r
+            sz *= 2;\r
+            p = PyString_AsString(res) + reslen;\r
+        }\r
+        if (i > 0) {\r
+            memcpy(p, sep, seplen);\r
+            p += seplen;\r
+            reslen += seplen;\r
+        }\r
+        memcpy(p, PyString_AS_STRING(item), slen);\r
+        p += slen;\r
+        reslen += slen;\r
+        Py_DECREF(item);\r
+    }\r
+    _PyString_Resize(&res, reslen);\r
+    return res;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(find__doc__,\r
+"find(s, sub [,start [,end]]) -> in\n"\r
+"\n"\r
+"Return the lowest index in s where substring sub is found,\n"\r
+"such that sub is contained within s[start,end].  Optional\n"\r
+"arguments start and end are interpreted as in slice notation.\n"\r
+"\n"\r
+"Return -1 on failure.");\r
+\r
+static PyObject *\r
+strop_find(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *sub;\r
+    Py_ssize_t len, n, i = 0, last = PY_SSIZE_T_MAX;\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "t#t#|nn:find", &s, &len, &sub, &n, &i, &last))\r
+        return NULL;\r
+\r
+    if (last > len)\r
+        last = len;\r
+    if (last < 0)\r
+        last += len;\r
+    if (last < 0)\r
+        last = 0;\r
+    if (i < 0)\r
+        i += len;\r
+    if (i < 0)\r
+        i = 0;\r
+\r
+    if (n == 0 && i <= last)\r
+        return PyInt_FromLong((long)i);\r
+\r
+    last -= n;\r
+    for (; i <= last; ++i)\r
+        if (s[i] == sub[0] &&\r
+            (n == 1 || memcmp(&s[i+1], &sub[1], n-1) == 0))\r
+            return PyInt_FromLong((long)i);\r
+\r
+    return PyInt_FromLong(-1L);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(rfind__doc__,\r
+"rfind(s, sub [,start [,end]]) -> int\n"\r
+"\n"\r
+"Return the highest index in s where substring sub is found,\n"\r
+"such that sub is contained within s[start,end].  Optional\n"\r
+"arguments start and end are interpreted as in slice notation.\n"\r
+"\n"\r
+"Return -1 on failure.");\r
+\r
+static PyObject *\r
+strop_rfind(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *sub;\r
+    Py_ssize_t len, n, j;\r
+    Py_ssize_t i = 0, last = PY_SSIZE_T_MAX;\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "t#t#|nn:rfind", &s, &len, &sub, &n, &i, &last))\r
+        return NULL;\r
+\r
+    if (last > len)\r
+        last = len;\r
+    if (last < 0)\r
+        last += len;\r
+    if (last < 0)\r
+        last = 0;\r
+    if (i < 0)\r
+        i += len;\r
+    if (i < 0)\r
+        i = 0;\r
+\r
+    if (n == 0 && i <= last)\r
+        return PyInt_FromLong((long)last);\r
+\r
+    for (j = last-n; j >= i; --j)\r
+        if (s[j] == sub[0] &&\r
+            (n == 1 || memcmp(&s[j+1], &sub[1], n-1) == 0))\r
+            return PyInt_FromLong((long)j);\r
+\r
+    return PyInt_FromLong(-1L);\r
+}\r
+\r
+\r
+static PyObject *\r
+do_strip(PyObject *args, int striptype)\r
+{\r
+    char *s;\r
+    Py_ssize_t len, i, j;\r
+\r
+\r
+    if (PyString_AsStringAndSize(args, &s, &len))\r
+        return NULL;\r
+\r
+    i = 0;\r
+    if (striptype != RIGHTSTRIP) {\r
+        while (i < len && isspace(Py_CHARMASK(s[i]))) {\r
+            i++;\r
+        }\r
+    }\r
+\r
+    j = len;\r
+    if (striptype != LEFTSTRIP) {\r
+        do {\r
+            j--;\r
+        } while (j >= i && isspace(Py_CHARMASK(s[j])));\r
+        j++;\r
+    }\r
+\r
+    if (i == 0 && j == len) {\r
+        Py_INCREF(args);\r
+        return args;\r
+    }\r
+    else\r
+        return PyString_FromStringAndSize(s+i, j-i);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(strip__doc__,\r
+"strip(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s with leading and trailing\n"\r
+"whitespace removed.");\r
+\r
+static PyObject *\r
+strop_strip(PyObject *self, PyObject *args)\r
+{\r
+    WARN;\r
+    return do_strip(args, BOTHSTRIP);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(lstrip__doc__,\r
+"lstrip(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s with leading whitespace removed.");\r
+\r
+static PyObject *\r
+strop_lstrip(PyObject *self, PyObject *args)\r
+{\r
+    WARN;\r
+    return do_strip(args, LEFTSTRIP);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(rstrip__doc__,\r
+"rstrip(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s with trailing whitespace removed.");\r
+\r
+static PyObject *\r
+strop_rstrip(PyObject *self, PyObject *args)\r
+{\r
+    WARN;\r
+    return do_strip(args, RIGHTSTRIP);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(lower__doc__,\r
+"lower(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s converted to lowercase.");\r
+\r
+static PyObject *\r
+strop_lower(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *s_new;\r
+    Py_ssize_t i, n;\r
+    PyObject *newstr;\r
+    int changed;\r
+\r
+    WARN;\r
+    if (PyString_AsStringAndSize(args, &s, &n))\r
+        return NULL;\r
+    newstr = PyString_FromStringAndSize(NULL, n);\r
+    if (newstr == NULL)\r
+        return NULL;\r
+    s_new = PyString_AsString(newstr);\r
+    changed = 0;\r
+    for (i = 0; i < n; i++) {\r
+        int c = Py_CHARMASK(*s++);\r
+        if (isupper(c)) {\r
+            changed = 1;\r
+            *s_new = tolower(c);\r
+        } else\r
+            *s_new = c;\r
+        s_new++;\r
+    }\r
+    if (!changed) {\r
+        Py_DECREF(newstr);\r
+        Py_INCREF(args);\r
+        return args;\r
+    }\r
+    return newstr;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(upper__doc__,\r
+"upper(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s converted to uppercase.");\r
+\r
+static PyObject *\r
+strop_upper(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *s_new;\r
+    Py_ssize_t i, n;\r
+    PyObject *newstr;\r
+    int changed;\r
+\r
+    WARN;\r
+    if (PyString_AsStringAndSize(args, &s, &n))\r
+        return NULL;\r
+    newstr = PyString_FromStringAndSize(NULL, n);\r
+    if (newstr == NULL)\r
+        return NULL;\r
+    s_new = PyString_AsString(newstr);\r
+    changed = 0;\r
+    for (i = 0; i < n; i++) {\r
+        int c = Py_CHARMASK(*s++);\r
+        if (islower(c)) {\r
+            changed = 1;\r
+            *s_new = toupper(c);\r
+        } else\r
+            *s_new = c;\r
+        s_new++;\r
+    }\r
+    if (!changed) {\r
+        Py_DECREF(newstr);\r
+        Py_INCREF(args);\r
+        return args;\r
+    }\r
+    return newstr;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(capitalize__doc__,\r
+"capitalize(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s with only its first character\n"\r
+"capitalized.");\r
+\r
+static PyObject *\r
+strop_capitalize(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *s_new;\r
+    Py_ssize_t i, n;\r
+    PyObject *newstr;\r
+    int changed;\r
+\r
+    WARN;\r
+    if (PyString_AsStringAndSize(args, &s, &n))\r
+        return NULL;\r
+    newstr = PyString_FromStringAndSize(NULL, n);\r
+    if (newstr == NULL)\r
+        return NULL;\r
+    s_new = PyString_AsString(newstr);\r
+    changed = 0;\r
+    if (0 < n) {\r
+        int c = Py_CHARMASK(*s++);\r
+        if (islower(c)) {\r
+            changed = 1;\r
+            *s_new = toupper(c);\r
+        } else\r
+            *s_new = c;\r
+        s_new++;\r
+    }\r
+    for (i = 1; i < n; i++) {\r
+        int c = Py_CHARMASK(*s++);\r
+        if (isupper(c)) {\r
+            changed = 1;\r
+            *s_new = tolower(c);\r
+        } else\r
+            *s_new = c;\r
+        s_new++;\r
+    }\r
+    if (!changed) {\r
+        Py_DECREF(newstr);\r
+        Py_INCREF(args);\r
+        return args;\r
+    }\r
+    return newstr;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(expandtabs__doc__,\r
+"expandtabs(string, [tabsize]) -> string\n"\r
+"\n"\r
+"Expand tabs in a string, i.e. replace them by one or more spaces,\n"\r
+"depending on the current column and the given tab size (default 8).\n"\r
+"The column number is reset to zero after each newline occurring in the\n"\r
+"string.  This doesn't understand other non-printing characters.");\r
+\r
+static PyObject *\r
+strop_expandtabs(PyObject *self, PyObject *args)\r
+{\r
+    /* Original by Fredrik Lundh */\r
+    char* e;\r
+    char* p;\r
+    char* q;\r
+    Py_ssize_t i, j;\r
+    PyObject* out;\r
+    char* string;\r
+    Py_ssize_t stringlen;\r
+    int tabsize = 8;\r
+\r
+    WARN;\r
+    /* Get arguments */\r
+    if (!PyArg_ParseTuple(args, "s#|i:expandtabs", &string, &stringlen, &tabsize))\r
+        return NULL;\r
+    if (tabsize < 1) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "tabsize must be at least 1");\r
+        return NULL;\r
+    }\r
+\r
+    /* First pass: determine size of output string */\r
+    i = j = 0; /* j: current column; i: total of previous lines */\r
+    e = string + stringlen;\r
+    for (p = string; p < e; p++) {\r
+        if (*p == '\t') {\r
+            Py_ssize_t incr = tabsize - (j%tabsize);\r
+            if (j > PY_SSIZE_T_MAX - incr)\r
+                goto overflow;\r
+            j += incr;\r
+        } else {\r
+            if (j > PY_SSIZE_T_MAX - 1)\r
+                goto overflow;\r
+            j++;\r
+            if (*p == '\n') {\r
+                if (i > PY_SSIZE_T_MAX - j)\r
+                    goto overflow;\r
+                i += j;\r
+                j = 0;\r
+            }\r
+        }\r
+    }\r
+\r
+    if (i > PY_SSIZE_T_MAX - j)\r
+        goto overflow;\r
+\r
+    /* Second pass: create output string and fill it */\r
+    out = PyString_FromStringAndSize(NULL, i+j);\r
+    if (out == NULL)\r
+        return NULL;\r
+\r
+    i = 0;\r
+    q = PyString_AS_STRING(out);\r
+\r
+    for (p = string; p < e; p++) {\r
+        if (*p == '\t') {\r
+            j = tabsize - (i%tabsize);\r
+            i += j;\r
+            while (j-- > 0)\r
+                *q++ = ' ';\r
+        } else {\r
+            *q++ = *p;\r
+            i++;\r
+            if (*p == '\n')\r
+                i = 0;\r
+        }\r
+    }\r
+\r
+    return out;\r
+  overflow:\r
+    PyErr_SetString(PyExc_OverflowError, "result is too long");\r
+    return NULL;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(count__doc__,\r
+"count(s, sub[, start[, end]]) -> int\n"\r
+"\n"\r
+"Return the number of occurrences of substring sub in string\n"\r
+"s[start:end].  Optional arguments start and end are\n"\r
+"interpreted as in slice notation.");\r
+\r
+static PyObject *\r
+strop_count(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *sub;\r
+    Py_ssize_t len, n;\r
+    Py_ssize_t i = 0, last = PY_SSIZE_T_MAX;\r
+    Py_ssize_t m, r;\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "t#t#|nn:count", &s, &len, &sub, &n, &i, &last))\r
+        return NULL;\r
+    if (last > len)\r
+        last = len;\r
+    if (last < 0)\r
+        last += len;\r
+    if (last < 0)\r
+        last = 0;\r
+    if (i < 0)\r
+        i += len;\r
+    if (i < 0)\r
+        i = 0;\r
+    m = last + 1 - n;\r
+    if (n == 0)\r
+        return PyInt_FromLong((long) (m-i));\r
+\r
+    r = 0;\r
+    while (i < m) {\r
+        if (!memcmp(s+i, sub, n)) {\r
+            r++;\r
+            i += n;\r
+        } else {\r
+            i++;\r
+        }\r
+    }\r
+    return PyInt_FromLong((long) r);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(swapcase__doc__,\r
+"swapcase(s) -> string\n"\r
+"\n"\r
+"Return a copy of the string s with upper case characters\n"\r
+"converted to lowercase and vice versa.");\r
+\r
+static PyObject *\r
+strop_swapcase(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *s_new;\r
+    Py_ssize_t i, n;\r
+    PyObject *newstr;\r
+    int changed;\r
+\r
+    WARN;\r
+    if (PyString_AsStringAndSize(args, &s, &n))\r
+        return NULL;\r
+    newstr = PyString_FromStringAndSize(NULL, n);\r
+    if (newstr == NULL)\r
+        return NULL;\r
+    s_new = PyString_AsString(newstr);\r
+    changed = 0;\r
+    for (i = 0; i < n; i++) {\r
+        int c = Py_CHARMASK(*s++);\r
+        if (islower(c)) {\r
+            changed = 1;\r
+            *s_new = toupper(c);\r
+        }\r
+        else if (isupper(c)) {\r
+            changed = 1;\r
+            *s_new = tolower(c);\r
+        }\r
+        else\r
+            *s_new = c;\r
+        s_new++;\r
+    }\r
+    if (!changed) {\r
+        Py_DECREF(newstr);\r
+        Py_INCREF(args);\r
+        return args;\r
+    }\r
+    return newstr;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(atoi__doc__,\r
+"atoi(s [,base]) -> int\n"\r
+"\n"\r
+"Return the integer represented by the string s in the given\n"\r
+"base, which defaults to 10.  The string s must consist of one\n"\r
+"or more digits, possibly preceded by a sign.  If base is 0, it\n"\r
+"is chosen from the leading characters of s, 0 for octal, 0x or\n"\r
+"0X for hexadecimal.  If base is 16, a preceding 0x or 0X is\n"\r
+"accepted.");\r
+\r
+static PyObject *\r
+strop_atoi(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *end;\r
+    int base = 10;\r
+    long x;\r
+    char buffer[256]; /* For errors */\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "s|i:atoi", &s, &base))\r
+        return NULL;\r
+\r
+    if ((base != 0 && base < 2) || base > 36) {\r
+        PyErr_SetString(PyExc_ValueError, "invalid base for atoi()");\r
+        return NULL;\r
+    }\r
+\r
+    while (*s && isspace(Py_CHARMASK(*s)))\r
+        s++;\r
+    errno = 0;\r
+    if (base == 0 && s[0] == '0')\r
+        x = (long) PyOS_strtoul(s, &end, base);\r
+    else\r
+        x = PyOS_strtol(s, &end, base);\r
+    if (end == s || !isalnum(Py_CHARMASK(end[-1])))\r
+        goto bad;\r
+    while (*end && isspace(Py_CHARMASK(*end)))\r
+        end++;\r
+    if (*end != '\0') {\r
+  bad:\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "invalid literal for atoi(): %.200s", s);\r
+        PyErr_SetString(PyExc_ValueError, buffer);\r
+        return NULL;\r
+    }\r
+    else if (errno != 0) {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "atoi() literal too large: %.200s", s);\r
+        PyErr_SetString(PyExc_ValueError, buffer);\r
+        return NULL;\r
+    }\r
+    return PyInt_FromLong(x);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(atol__doc__,\r
+"atol(s [,base]) -> long\n"\r
+"\n"\r
+"Return the long integer represented by the string s in the\n"\r
+"given base, which defaults to 10.  The string s must consist\n"\r
+"of one or more digits, possibly preceded by a sign.  If base\n"\r
+"is 0, it is chosen from the leading characters of s, 0 for\n"\r
+"octal, 0x or 0X for hexadecimal.  If base is 16, a preceding\n"\r
+"0x or 0X is accepted.  A trailing L or l is not accepted,\n"\r
+"unless base is 0.");\r
+\r
+static PyObject *\r
+strop_atol(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *end;\r
+    int base = 10;\r
+    PyObject *x;\r
+    char buffer[256]; /* For errors */\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "s|i:atol", &s, &base))\r
+        return NULL;\r
+\r
+    if ((base != 0 && base < 2) || base > 36) {\r
+        PyErr_SetString(PyExc_ValueError, "invalid base for atol()");\r
+        return NULL;\r
+    }\r
+\r
+    while (*s && isspace(Py_CHARMASK(*s)))\r
+        s++;\r
+    if (s[0] == '\0') {\r
+        PyErr_SetString(PyExc_ValueError, "empty string for atol()");\r
+        return NULL;\r
+    }\r
+    x = PyLong_FromString(s, &end, base);\r
+    if (x == NULL)\r
+        return NULL;\r
+    if (base == 0 && (*end == 'l' || *end == 'L'))\r
+        end++;\r
+    while (*end && isspace(Py_CHARMASK(*end)))\r
+        end++;\r
+    if (*end != '\0') {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "invalid literal for atol(): %.200s", s);\r
+        PyErr_SetString(PyExc_ValueError, buffer);\r
+        Py_DECREF(x);\r
+        return NULL;\r
+    }\r
+    return x;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(atof__doc__,\r
+"atof(s) -> float\n"\r
+"\n"\r
+"Return the floating point number represented by the string s.");\r
+\r
+static PyObject *\r
+strop_atof(PyObject *self, PyObject *args)\r
+{\r
+    char *s, *end;\r
+    double x;\r
+    char buffer[256]; /* For errors */\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "s:atof", &s))\r
+        return NULL;\r
+    while (*s && isspace(Py_CHARMASK(*s)))\r
+        s++;\r
+    if (s[0] == '\0') {\r
+        PyErr_SetString(PyExc_ValueError, "empty string for atof()");\r
+        return NULL;\r
+    }\r
+\r
+    PyFPE_START_PROTECT("strop_atof", return 0)\r
+    x = PyOS_string_to_double(s, &end, PyExc_OverflowError);\r
+    PyFPE_END_PROTECT(x)\r
+    if (x == -1 && PyErr_Occurred())\r
+        return NULL;\r
+    while (*end && isspace(Py_CHARMASK(*end)))\r
+        end++;\r
+    if (*end != '\0') {\r
+        PyOS_snprintf(buffer, sizeof(buffer),\r
+                      "invalid literal for atof(): %.200s", s);\r
+        PyErr_SetString(PyExc_ValueError, buffer);\r
+        return NULL;\r
+    }\r
+    return PyFloat_FromDouble(x);\r
+}\r
+\r
+\r
+PyDoc_STRVAR(maketrans__doc__,\r
+"maketrans(frm, to) -> string\n"\r
+"\n"\r
+"Return a translation table (a string of 256 bytes long)\n"\r
+"suitable for use in string.translate.  The strings frm and to\n"\r
+"must be of the same length.");\r
+\r
+static PyObject *\r
+strop_maketrans(PyObject *self, PyObject *args)\r
+{\r
+    unsigned char *c, *from=NULL, *to=NULL;\r
+    Py_ssize_t i, fromlen=0, tolen=0;\r
+    PyObject *result;\r
+\r
+    if (!PyArg_ParseTuple(args, "t#t#:maketrans", &from, &fromlen, &to, &tolen))\r
+        return NULL;\r
+\r
+    if (fromlen != tolen) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "maketrans arguments must have same length");\r
+        return NULL;\r
+    }\r
+\r
+    result = PyString_FromStringAndSize((char *)NULL, 256);\r
+    if (result == NULL)\r
+        return NULL;\r
+    c = (unsigned char *) PyString_AS_STRING((PyStringObject *)result);\r
+    for (i = 0; i < 256; i++)\r
+        c[i]=(unsigned char)i;\r
+    for (i = 0; i < fromlen; i++)\r
+        c[from[i]]=to[i];\r
+\r
+    return result;\r
+}\r
+\r
+\r
+PyDoc_STRVAR(translate__doc__,\r
+"translate(s,table [,deletechars]) -> string\n"\r
+"\n"\r
+"Return a copy of the string s, where all characters occurring\n"\r
+"in the optional argument deletechars are removed, and the\n"\r
+"remaining characters have been mapped through the given\n"\r
+"translation table, which must be a string of length 256.");\r
+\r
+static PyObject *\r
+strop_translate(PyObject *self, PyObject *args)\r
+{\r
+    register char *input, *table, *output;\r
+    Py_ssize_t i;\r
+    int c, changed = 0;\r
+    PyObject *input_obj;\r
+    char *table1, *output_start, *del_table=NULL;\r
+    Py_ssize_t inlen, tablen, dellen = 0;\r
+    PyObject *result;\r
+    int trans_table[256];\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "St#|t#:translate", &input_obj,\r
+                          &table1, &tablen, &del_table, &dellen))\r
+        return NULL;\r
+    if (tablen != 256) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                      "translation table must be 256 characters long");\r
+        return NULL;\r
+    }\r
+\r
+    table = table1;\r
+    inlen = PyString_GET_SIZE(input_obj);\r
+    result = PyString_FromStringAndSize((char *)NULL, inlen);\r
+    if (result == NULL)\r
+        return NULL;\r
+    output_start = output = PyString_AsString(result);\r
+    input = PyString_AsString(input_obj);\r
+\r
+    if (dellen == 0) {\r
+        /* If no deletions are required, use faster code */\r
+        for (i = inlen; --i >= 0; ) {\r
+            c = Py_CHARMASK(*input++);\r
+            if (Py_CHARMASK((*output++ = table[c])) != c)\r
+                changed = 1;\r
+        }\r
+        if (changed)\r
+            return result;\r
+        Py_DECREF(result);\r
+        Py_INCREF(input_obj);\r
+        return input_obj;\r
+    }\r
+\r
+    for (i = 0; i < 256; i++)\r
+        trans_table[i] = Py_CHARMASK(table[i]);\r
+\r
+    for (i = 0; i < dellen; i++)\r
+        trans_table[(int) Py_CHARMASK(del_table[i])] = -1;\r
+\r
+    for (i = inlen; --i >= 0; ) {\r
+        c = Py_CHARMASK(*input++);\r
+        if (trans_table[c] != -1)\r
+            if (Py_CHARMASK(*output++ = (char)trans_table[c]) == c)\r
+                continue;\r
+        changed = 1;\r
+    }\r
+    if (!changed) {\r
+        Py_DECREF(result);\r
+        Py_INCREF(input_obj);\r
+        return input_obj;\r
+    }\r
+    /* Fix the size of the resulting string */\r
+    if (inlen > 0)\r
+        _PyString_Resize(&result, output - output_start);\r
+    return result;\r
+}\r
+\r
+\r
+/* What follows is used for implementing replace().  Perry Stoll. */\r
+\r
+/*\r
+  mymemfind\r
+\r
+  strstr replacement for arbitrary blocks of memory.\r
+\r
+  Locates the first occurrence in the memory pointed to by MEM of the\r
+  contents of memory pointed to by PAT.  Returns the index into MEM if\r
+  found, or -1 if not found.  If len of PAT is greater than length of\r
+  MEM, the function returns -1.\r
+*/\r
+static Py_ssize_t\r
+mymemfind(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len)\r
+{\r
+    register Py_ssize_t ii;\r
+\r
+    /* pattern can not occur in the last pat_len-1 chars */\r
+    len -= pat_len;\r
+\r
+    for (ii = 0; ii <= len; ii++) {\r
+        if (mem[ii] == pat[0] &&\r
+            (pat_len == 1 ||\r
+             memcmp(&mem[ii+1], &pat[1], pat_len-1) == 0)) {\r
+            return ii;\r
+        }\r
+    }\r
+    return -1;\r
+}\r
+\r
+/*\r
+  mymemcnt\r
+\r
+   Return the number of distinct times PAT is found in MEM.\r
+   meaning mem=1111 and pat==11 returns 2.\r
+       mem=11111 and pat==11 also return 2.\r
+ */\r
+static Py_ssize_t\r
+mymemcnt(const char *mem, Py_ssize_t len, const char *pat, Py_ssize_t pat_len)\r
+{\r
+    register Py_ssize_t offset = 0;\r
+    Py_ssize_t nfound = 0;\r
+\r
+    while (len >= 0) {\r
+        offset = mymemfind(mem, len, pat, pat_len);\r
+        if (offset == -1)\r
+            break;\r
+        mem += offset + pat_len;\r
+        len -= offset + pat_len;\r
+        nfound++;\r
+    }\r
+    return nfound;\r
+}\r
+\r
+/*\r
+   mymemreplace\r
+\r
+   Return a string in which all occurrences of PAT in memory STR are\r
+   replaced with SUB.\r
+\r
+   If length of PAT is less than length of STR or there are no occurrences\r
+   of PAT in STR, then the original string is returned. Otherwise, a new\r
+   string is allocated here and returned.\r
+\r
+   on return, out_len is:\r
+       the length of output string, or\r
+       -1 if the input string is returned, or\r
+       unchanged if an error occurs (no memory).\r
+\r
+   return value is:\r
+       the new string allocated locally, or\r
+       NULL if an error occurred.\r
+*/\r
+static char *\r
+mymemreplace(const char *str, Py_ssize_t len,           /* input string */\r
+         const char *pat, Py_ssize_t pat_len,           /* pattern string to find */\r
+         const char *sub, Py_ssize_t sub_len,           /* substitution string */\r
+         Py_ssize_t count,                              /* number of replacements */\r
+         Py_ssize_t *out_len)\r
+{\r
+    char *out_s;\r
+    char *new_s;\r
+    Py_ssize_t nfound, offset, new_len;\r
+\r
+    if (len == 0 || pat_len > len)\r
+        goto return_same;\r
+\r
+    /* find length of output string */\r
+    nfound = mymemcnt(str, len, pat, pat_len);\r
+    if (count < 0)\r
+        count = PY_SSIZE_T_MAX;\r
+    else if (nfound > count)\r
+        nfound = count;\r
+    if (nfound == 0)\r
+        goto return_same;\r
+\r
+    new_len = len + nfound*(sub_len - pat_len);\r
+    if (new_len == 0) {\r
+        /* Have to allocate something for the caller to free(). */\r
+        out_s = (char *)PyMem_MALLOC(1);\r
+        if (out_s == NULL)\r
+            return NULL;\r
+        out_s[0] = '\0';\r
+    }\r
+    else {\r
+        assert(new_len > 0);\r
+        new_s = (char *)PyMem_MALLOC(new_len);\r
+        if (new_s == NULL)\r
+            return NULL;\r
+        out_s = new_s;\r
+\r
+        for (; count > 0 && len > 0; --count) {\r
+            /* find index of next instance of pattern */\r
+            offset = mymemfind(str, len, pat, pat_len);\r
+            if (offset == -1)\r
+                break;\r
+\r
+            /* copy non matching part of input string */\r
+            memcpy(new_s, str, offset);\r
+            str += offset + pat_len;\r
+            len -= offset + pat_len;\r
+\r
+            /* copy substitute into the output string */\r
+            new_s += offset;\r
+            memcpy(new_s, sub, sub_len);\r
+            new_s += sub_len;\r
+        }\r
+        /* copy any remaining values into output string */\r
+        if (len > 0)\r
+            memcpy(new_s, str, len);\r
+    }\r
+    *out_len = new_len;\r
+    return out_s;\r
+\r
+  return_same:\r
+    *out_len = -1;\r
+    return (char *)str; /* cast away const */\r
+}\r
+\r
+\r
+PyDoc_STRVAR(replace__doc__,\r
+"replace (str, old, new[, maxsplit]) -> string\n"\r
+"\n"\r
+"Return a copy of string str with all occurrences of substring\n"\r
+"old replaced by new. If the optional argument maxsplit is\n"\r
+"given, only the first maxsplit occurrences are replaced.");\r
+\r
+static PyObject *\r
+strop_replace(PyObject *self, PyObject *args)\r
+{\r
+    char *str, *pat,*sub,*new_s;\r
+    Py_ssize_t len,pat_len,sub_len,out_len;\r
+    Py_ssize_t count = -1;\r
+    PyObject *newstr;\r
+\r
+    WARN;\r
+    if (!PyArg_ParseTuple(args, "t#t#t#|n:replace",\r
+                          &str, &len, &pat, &pat_len, &sub, &sub_len,\r
+                          &count))\r
+        return NULL;\r
+    if (pat_len <= 0) {\r
+        PyErr_SetString(PyExc_ValueError, "empty pattern string");\r
+        return NULL;\r
+    }\r
+    /* CAUTION:  strop treats a replace count of 0 as infinity, unlke\r
+     * current (2.1) string.py and string methods.  Preserve this for\r
+     * ... well, hard to say for what <wink>.\r
+     */\r
+    if (count == 0)\r
+        count = -1;\r
+    new_s = mymemreplace(str,len,pat,pat_len,sub,sub_len,count,&out_len);\r
+    if (new_s == NULL) {\r
+        PyErr_NoMemory();\r
+        return NULL;\r
+    }\r
+    if (out_len == -1) {\r
+        /* we're returning another reference to the input string */\r
+        newstr = PyTuple_GetItem(args, 0);\r
+        Py_XINCREF(newstr);\r
+    }\r
+    else {\r
+        newstr = PyString_FromStringAndSize(new_s, out_len);\r
+        PyMem_FREE(new_s);\r
+    }\r
+    return newstr;\r
+}\r
+\r
+\r
+/* List of functions defined in the module */\r
+\r
+static PyMethodDef\r
+strop_methods[] = {\r
+    {"atof",            strop_atof,        METH_VARARGS, atof__doc__},\r
+    {"atoi",            strop_atoi,        METH_VARARGS, atoi__doc__},\r
+    {"atol",            strop_atol,        METH_VARARGS, atol__doc__},\r
+    {"capitalize",      strop_capitalize,  METH_O,       capitalize__doc__},\r
+    {"count",           strop_count,       METH_VARARGS, count__doc__},\r
+    {"expandtabs",      strop_expandtabs,  METH_VARARGS, expandtabs__doc__},\r
+    {"find",            strop_find,        METH_VARARGS, find__doc__},\r
+    {"join",            strop_joinfields,  METH_VARARGS, joinfields__doc__},\r
+    {"joinfields",      strop_joinfields,  METH_VARARGS, joinfields__doc__},\r
+    {"lstrip",          strop_lstrip,      METH_O,       lstrip__doc__},\r
+    {"lower",           strop_lower,       METH_O,       lower__doc__},\r
+    {"maketrans",       strop_maketrans,   METH_VARARGS, maketrans__doc__},\r
+    {"replace",         strop_replace,     METH_VARARGS, replace__doc__},\r
+    {"rfind",           strop_rfind,       METH_VARARGS, rfind__doc__},\r
+    {"rstrip",          strop_rstrip,      METH_O,       rstrip__doc__},\r
+    {"split",           strop_splitfields, METH_VARARGS, splitfields__doc__},\r
+    {"splitfields",     strop_splitfields, METH_VARARGS, splitfields__doc__},\r
+    {"strip",           strop_strip,       METH_O,       strip__doc__},\r
+    {"swapcase",        strop_swapcase,    METH_O,       swapcase__doc__},\r
+    {"translate",       strop_translate,   METH_VARARGS, translate__doc__},\r
+    {"upper",           strop_upper,       METH_O,       upper__doc__},\r
+    {NULL,              NULL}   /* sentinel */\r
+};\r
+\r
+\r
+PyMODINIT_FUNC\r
+initstrop(void)\r
+{\r
+    PyObject *m, *s;\r
+    char buf[256];\r
+    int c, n;\r
+    m = Py_InitModule4("strop", strop_methods, strop_module__doc__,\r
+                       (PyObject*)NULL, PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Create 'whitespace' object */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (isspace(c))\r
+            buf[n++] = c;\r
+    }\r
+    s = PyString_FromStringAndSize(buf, n);\r
+    if (s)\r
+        PyModule_AddObject(m, "whitespace", s);\r
+\r
+    /* Create 'lowercase' object */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (islower(c))\r
+            buf[n++] = c;\r
+    }\r
+    s = PyString_FromStringAndSize(buf, n);\r
+    if (s)\r
+        PyModule_AddObject(m, "lowercase", s);\r
+\r
+    /* Create 'uppercase' object */\r
+    n = 0;\r
+    for (c = 0; c < 256; c++) {\r
+        if (isupper(c))\r
+            buf[n++] = c;\r
+    }\r
+    s = PyString_FromStringAndSize(buf, n);\r
+    if (s)\r
+        PyModule_AddObject(m, "uppercase", s);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/symtablemodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/symtablemodule.c
new file mode 100644 (file)
index 0000000..a4f60a1
--- /dev/null
@@ -0,0 +1,86 @@
+#include "Python.h"\r
+\r
+#include "code.h"\r
+#include "compile.h"\r
+#include "Python-ast.h"\r
+#include "symtable.h"\r
+\r
+static PyObject *\r
+symtable_symtable(PyObject *self, PyObject *args)\r
+{\r
+    struct symtable *st;\r
+    PyObject *t;\r
+\r
+    char *str;\r
+    char *filename;\r
+    char *startstr;\r
+    int start;\r
+\r
+    if (!PyArg_ParseTuple(args, "sss:symtable", &str, &filename,\r
+                          &startstr))\r
+        return NULL;\r
+    if (strcmp(startstr, "exec") == 0)\r
+        start = Py_file_input;\r
+    else if (strcmp(startstr, "eval") == 0)\r
+        start = Py_eval_input;\r
+    else if (strcmp(startstr, "single") == 0)\r
+        start = Py_single_input;\r
+    else {\r
+        PyErr_SetString(PyExc_ValueError,\r
+           "symtable() arg 3 must be 'exec' or 'eval' or 'single'");\r
+        return NULL;\r
+    }\r
+    st = Py_SymtableString(str, filename, start);\r
+    if (st == NULL)\r
+        return NULL;\r
+    t = (PyObject *)st->st_top;\r
+    Py_INCREF(t);\r
+    PyMem_Free((void *)st->st_future);\r
+    PySymtable_Free(st);\r
+    return t;\r
+}\r
+\r
+static PyMethodDef symtable_methods[] = {\r
+    {"symtable",        symtable_symtable,      METH_VARARGS,\r
+     PyDoc_STR("Return symbol and scope dictionaries"\r
+               " used internally by compiler.")},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+init_symtable(void)\r
+{\r
+    PyObject *m;\r
+\r
+    if (PyType_Ready(&PySTEntry_Type) < 0)\r
+        return;\r
+\r
+    m = Py_InitModule("_symtable", symtable_methods);\r
+    if (m == NULL)\r
+        return;\r
+    PyModule_AddIntConstant(m, "USE", USE);\r
+    PyModule_AddIntConstant(m, "DEF_GLOBAL", DEF_GLOBAL);\r
+    PyModule_AddIntConstant(m, "DEF_LOCAL", DEF_LOCAL);\r
+    PyModule_AddIntConstant(m, "DEF_PARAM", DEF_PARAM);\r
+    PyModule_AddIntConstant(m, "DEF_FREE", DEF_FREE);\r
+    PyModule_AddIntConstant(m, "DEF_FREE_CLASS", DEF_FREE_CLASS);\r
+    PyModule_AddIntConstant(m, "DEF_IMPORT", DEF_IMPORT);\r
+    PyModule_AddIntConstant(m, "DEF_BOUND", DEF_BOUND);\r
+\r
+    PyModule_AddIntConstant(m, "TYPE_FUNCTION", FunctionBlock);\r
+    PyModule_AddIntConstant(m, "TYPE_CLASS", ClassBlock);\r
+    PyModule_AddIntConstant(m, "TYPE_MODULE", ModuleBlock);\r
+\r
+    PyModule_AddIntConstant(m, "OPT_IMPORT_STAR", OPT_IMPORT_STAR);\r
+    PyModule_AddIntConstant(m, "OPT_EXEC", OPT_EXEC);\r
+    PyModule_AddIntConstant(m, "OPT_BARE_EXEC", OPT_BARE_EXEC);\r
+\r
+    PyModule_AddIntConstant(m, "LOCAL", LOCAL);\r
+    PyModule_AddIntConstant(m, "GLOBAL_EXPLICIT", GLOBAL_EXPLICIT);\r
+    PyModule_AddIntConstant(m, "GLOBAL_IMPLICIT", GLOBAL_IMPLICIT);\r
+    PyModule_AddIntConstant(m, "FREE", FREE);\r
+    PyModule_AddIntConstant(m, "CELL", CELL);\r
+\r
+    PyModule_AddIntConstant(m, "SCOPE_OFF", SCOPE_OFF);\r
+    PyModule_AddIntConstant(m, "SCOPE_MASK", SCOPE_MASK);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/timemodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/timemodule.c
new file mode 100644 (file)
index 0000000..a4e64c2
--- /dev/null
@@ -0,0 +1,1064 @@
+\r
+/* Time module */\r
+\r
+#include "Python.h"\r
+#include "structseq.h"\r
+#include "timefuncs.h"\r
+\r
+#ifdef __APPLE__\r
+#if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_FTIME)\r
+  /*\r
+   * floattime falls back to ftime when getttimeofday fails because the latter\r
+   * might fail on some platforms. This fallback is unwanted on MacOSX because\r
+   * that makes it impossible to use a binary build on OSX 10.4 on earlier\r
+   * releases of the OS. Therefore claim we don't support ftime.\r
+   */\r
+# undef HAVE_FTIME\r
+#endif\r
+#endif\r
+\r
+#include <ctype.h>\r
+\r
+#ifdef HAVE_SYS_TYPES_H\r
+#include <sys/types.h>\r
+#endif /* HAVE_SYS_TYPES_H */\r
+\r
+#ifdef QUICKWIN\r
+#include <io.h>\r
+#endif\r
+\r
+#ifdef HAVE_FTIME\r
+#include <sys/timeb.h>\r
+#if !defined(MS_WINDOWS) && !defined(PYOS_OS2)\r
+extern int ftime(struct timeb *);\r
+#endif /* MS_WINDOWS */\r
+#endif /* HAVE_FTIME */\r
+\r
+#if defined(__WATCOMC__) && !defined(__QNX__)\r
+#include <i86.h>\r
+#else\r
+#ifdef MS_WINDOWS\r
+#define WIN32_LEAN_AND_MEAN\r
+#include <windows.h>\r
+#include "pythread.h"\r
+\r
+/* helper to allow us to interrupt sleep() on Windows*/\r
+static HANDLE hInterruptEvent = NULL;\r
+static BOOL WINAPI PyCtrlHandler(DWORD dwCtrlType)\r
+{\r
+    SetEvent(hInterruptEvent);\r
+    /* allow other default handlers to be called.\r
+       Default Python handler will setup the\r
+       KeyboardInterrupt exception.\r
+    */\r
+    return FALSE;\r
+}\r
+static long main_thread;\r
+\r
+\r
+#if defined(__BORLANDC__)\r
+/* These overrides not needed for Win32 */\r
+#define timezone _timezone\r
+#define tzname _tzname\r
+#define daylight _daylight\r
+#endif /* __BORLANDC__ */\r
+#endif /* MS_WINDOWS */\r
+#endif /* !__WATCOMC__ || __QNX__ */\r
+\r
+#if defined(MS_WINDOWS) && !defined(__BORLANDC__)\r
+/* Win32 has better clock replacement; we have our own version below. */\r
+#undef HAVE_CLOCK\r
+#endif /* MS_WINDOWS && !defined(__BORLANDC__) */\r
+\r
+#if defined(PYOS_OS2)\r
+#define INCL_DOS\r
+#define INCL_ERRORS\r
+#include <os2.h>\r
+#endif\r
+\r
+#if defined(PYCC_VACPP)\r
+#include <sys/time.h>\r
+#endif\r
+\r
+#ifdef __BEOS__\r
+#include <time.h>\r
+/* For bigtime_t, snooze(). - [cjh] */\r
+#include <support/SupportDefs.h>\r
+#include <kernel/OS.h>\r
+#endif\r
+\r
+#ifdef RISCOS\r
+extern int riscos_sleep(double);\r
+#endif\r
+\r
+/* Forward declarations */\r
+static int floatsleep(double);\r
+static double floattime(void);\r
+\r
+/* For Y2K check */\r
+static PyObject *moddict = NULL;\r
+\r
+/* Exposed in timefuncs.h. */\r
+time_t\r
+_PyTime_DoubleToTimet(double x)\r
+{\r
+    time_t result;\r
+    double diff;\r
+\r
+    result = (time_t)x;\r
+    /* How much info did we lose?  time_t may be an integral or\r
+     * floating type, and we don't know which.  If it's integral,\r
+     * we don't know whether C truncates, rounds, returns the floor,\r
+     * etc.  If we lost a second or more, the C rounding is\r
+     * unreasonable, or the input just doesn't fit in a time_t;\r
+     * call it an error regardless.  Note that the original cast to\r
+     * time_t can cause a C error too, but nothing we can do to\r
+     * worm around that.\r
+     */\r
+    diff = x - (double)result;\r
+    if (diff <= -1.0 || diff >= 1.0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "timestamp out of range for platform time_t");\r
+        result = (time_t)-1;\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyObject *\r
+time_time(PyObject *self, PyObject *unused)\r
+{\r
+    double secs;\r
+    secs = floattime();\r
+    if (secs == 0.0) {\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return NULL;\r
+    }\r
+    return PyFloat_FromDouble(secs);\r
+}\r
+\r
+PyDoc_STRVAR(time_doc,\r
+"time() -> floating point number\n\\r
+\n\\r
+Return the current time in seconds since the Epoch.\n\\r
+Fractions of a second may be present if the system clock provides them.");\r
+\r
+#ifdef HAVE_CLOCK\r
+\r
+#ifndef CLOCKS_PER_SEC\r
+#ifdef CLK_TCK\r
+#define CLOCKS_PER_SEC CLK_TCK\r
+#else\r
+#define CLOCKS_PER_SEC 1000000\r
+#endif\r
+#endif\r
+\r
+static PyObject *\r
+time_clock(PyObject *self, PyObject *unused)\r
+{\r
+    return PyFloat_FromDouble(((double)clock()) / CLOCKS_PER_SEC);\r
+}\r
+#endif /* HAVE_CLOCK */\r
+\r
+#if defined(MS_WINDOWS) && !defined(__BORLANDC__)\r
+/* Due to Mark Hammond and Tim Peters */\r
+static PyObject *\r
+time_clock(PyObject *self, PyObject *unused)\r
+{\r
+    static LARGE_INTEGER ctrStart;\r
+    static double divisor = 0.0;\r
+    LARGE_INTEGER now;\r
+    double diff;\r
+\r
+    if (divisor == 0.0) {\r
+        LARGE_INTEGER freq;\r
+        QueryPerformanceCounter(&ctrStart);\r
+        if (!QueryPerformanceFrequency(&freq) || freq.QuadPart == 0) {\r
+            /* Unlikely to happen - this works on all intel\r
+               machines at least!  Revert to clock() */\r
+            return PyFloat_FromDouble(((double)clock()) /\r
+                                      CLOCKS_PER_SEC);\r
+        }\r
+        divisor = (double)freq.QuadPart;\r
+    }\r
+    QueryPerformanceCounter(&now);\r
+    diff = (double)(now.QuadPart - ctrStart.QuadPart);\r
+    return PyFloat_FromDouble(diff / divisor);\r
+}\r
+\r
+#define HAVE_CLOCK /* So it gets included in the methods */\r
+#endif /* MS_WINDOWS && !defined(__BORLANDC__) */\r
+\r
+#ifdef HAVE_CLOCK\r
+PyDoc_STRVAR(clock_doc,\r
+"clock() -> floating point number\n\\r
+\n\\r
+Return the CPU time or real time since the start of the process or since\n\\r
+the first call to clock().  This has as much precision as the system\n\\r
+records.");\r
+#endif\r
+\r
+static PyObject *\r
+time_sleep(PyObject *self, PyObject *args)\r
+{\r
+    double secs;\r
+    if (!PyArg_ParseTuple(args, "d:sleep", &secs))\r
+        return NULL;\r
+    if (floatsleep(secs) != 0)\r
+        return NULL;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(sleep_doc,\r
+"sleep(seconds)\n\\r
+\n\\r
+Delay execution for a given number of seconds.  The argument may be\n\\r
+a floating point number for subsecond precision.");\r
+\r
+static PyStructSequence_Field struct_time_type_fields[] = {\r
+    {"tm_year", "year, for example, 1993"},\r
+    {"tm_mon", "month of year, range [1, 12]"},\r
+    {"tm_mday", "day of month, range [1, 31]"},\r
+    {"tm_hour", "hours, range [0, 23]"},\r
+    {"tm_min", "minutes, range [0, 59]"},\r
+    {"tm_sec", "seconds, range [0, 61])"},\r
+    {"tm_wday", "day of week, range [0, 6], Monday is 0"},\r
+    {"tm_yday", "day of year, range [1, 366]"},\r
+    {"tm_isdst", "1 if summer time is in effect, 0 if not, and -1 if unknown"},\r
+    {0}\r
+};\r
+\r
+static PyStructSequence_Desc struct_time_type_desc = {\r
+    "time.struct_time",\r
+    "The time value as returned by gmtime(), localtime(), and strptime(), and\n"\r
+    " accepted by asctime(), mktime() and strftime().  May be considered as a\n"\r
+    " sequence of 9 integers.\n\n"\r
+    " Note that several fields' values are not the same as those defined by\n"\r
+    " the C language standard for struct tm.  For example, the value of the\n"\r
+    " field tm_year is the actual year, not year - 1900.  See individual\n"\r
+    " fields' descriptions for details.",\r
+    struct_time_type_fields,\r
+    9,\r
+};\r
+\r
+static int initialized;\r
+static PyTypeObject StructTimeType;\r
+\r
+static PyObject *\r
+tmtotuple(struct tm *p)\r
+{\r
+    PyObject *v = PyStructSequence_New(&StructTimeType);\r
+    if (v == NULL)\r
+        return NULL;\r
+\r
+#define SET(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))\r
+\r
+    SET(0, p->tm_year + 1900);\r
+    SET(1, p->tm_mon + 1);         /* Want January == 1 */\r
+    SET(2, p->tm_mday);\r
+    SET(3, p->tm_hour);\r
+    SET(4, p->tm_min);\r
+    SET(5, p->tm_sec);\r
+    SET(6, (p->tm_wday + 6) % 7); /* Want Monday == 0 */\r
+    SET(7, p->tm_yday + 1);        /* Want January, 1 == 1 */\r
+    SET(8, p->tm_isdst);\r
+#undef SET\r
+    if (PyErr_Occurred()) {\r
+        Py_XDECREF(v);\r
+        return NULL;\r
+    }\r
+\r
+    return v;\r
+}\r
+\r
+static PyObject *\r
+time_convert(double when, struct tm * (*function)(const time_t *))\r
+{\r
+    struct tm *p;\r
+    time_t whent = _PyTime_DoubleToTimet(when);\r
+\r
+    if (whent == (time_t)-1 && PyErr_Occurred())\r
+        return NULL;\r
+    errno = 0;\r
+    p = function(&whent);\r
+    if (p == NULL) {\r
+#ifdef EINVAL\r
+        if (errno == 0)\r
+            errno = EINVAL;\r
+#endif\r
+        return PyErr_SetFromErrno(PyExc_ValueError);\r
+    }\r
+    return tmtotuple(p);\r
+}\r
+\r
+/* Parse arg tuple that can contain an optional float-or-None value;\r
+   format needs to be "|O:name".\r
+   Returns non-zero on success (parallels PyArg_ParseTuple).\r
+*/\r
+static int\r
+parse_time_double_args(PyObject *args, char *format, double *pwhen)\r
+{\r
+    PyObject *ot = NULL;\r
+\r
+    if (!PyArg_ParseTuple(args, format, &ot))\r
+        return 0;\r
+    if (ot == NULL || ot == Py_None)\r
+        *pwhen = floattime();\r
+    else {\r
+        double when = PyFloat_AsDouble(ot);\r
+        if (PyErr_Occurred())\r
+            return 0;\r
+        *pwhen = when;\r
+    }\r
+    return 1;\r
+}\r
+\r
+static PyObject *\r
+time_gmtime(PyObject *self, PyObject *args)\r
+{\r
+    double when;\r
+    if (!parse_time_double_args(args, "|O:gmtime", &when))\r
+        return NULL;\r
+    return time_convert(when, gmtime);\r
+}\r
+\r
+PyDoc_STRVAR(gmtime_doc,\r
+"gmtime([seconds]) -> (tm_year, tm_mon, tm_mday, tm_hour, tm_min,\n\\r
+                       tm_sec, tm_wday, tm_yday, tm_isdst)\n\\r
+\n\\r
+Convert seconds since the Epoch to a time tuple expressing UTC (a.k.a.\n\\r
+GMT).  When 'seconds' is not passed in, convert the current time instead.");\r
+\r
+static PyObject *\r
+time_localtime(PyObject *self, PyObject *args)\r
+{\r
+    double when;\r
+    if (!parse_time_double_args(args, "|O:localtime", &when))\r
+        return NULL;\r
+    return time_convert(when, localtime);\r
+}\r
+\r
+PyDoc_STRVAR(localtime_doc,\r
+"localtime([seconds]) -> (tm_year,tm_mon,tm_mday,tm_hour,tm_min,\n\\r
+                          tm_sec,tm_wday,tm_yday,tm_isdst)\n\\r
+\n\\r
+Convert seconds since the Epoch to a time tuple expressing local time.\n\\r
+When 'seconds' is not passed in, convert the current time instead.");\r
+\r
+static int\r
+gettmarg(PyObject *args, struct tm *p)\r
+{\r
+    int y;\r
+    memset((void *) p, '\0', sizeof(struct tm));\r
+\r
+    if (!PyArg_Parse(args, "(iiiiiiiii)",\r
+                     &y,\r
+                     &p->tm_mon,\r
+                     &p->tm_mday,\r
+                     &p->tm_hour,\r
+                     &p->tm_min,\r
+                     &p->tm_sec,\r
+                     &p->tm_wday,\r
+                     &p->tm_yday,\r
+                     &p->tm_isdst))\r
+        return 0;\r
+    if (y < 1900) {\r
+        PyObject *accept = PyDict_GetItemString(moddict,\r
+                                                "accept2dyear");\r
+        if (accept == NULL || !PyInt_Check(accept) ||\r
+            PyInt_AsLong(accept) == 0) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "year >= 1900 required");\r
+            return 0;\r
+        }\r
+        if (69 <= y && y <= 99)\r
+            y += 1900;\r
+        else if (0 <= y && y <= 68)\r
+            y += 2000;\r
+        else {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "year out of range");\r
+            return 0;\r
+        }\r
+    }\r
+    p->tm_year = y - 1900;\r
+    p->tm_mon--;\r
+    p->tm_wday = (p->tm_wday + 1) % 7;\r
+    p->tm_yday--;\r
+    return 1;\r
+}\r
+\r
+#ifdef HAVE_STRFTIME\r
+static PyObject *\r
+time_strftime(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *tup = NULL;\r
+    struct tm buf;\r
+    const char *fmt;\r
+    size_t fmtlen, buflen;\r
+    char *outbuf = 0;\r
+    size_t i;\r
+\r
+    memset((void *) &buf, '\0', sizeof(buf));\r
+\r
+    if (!PyArg_ParseTuple(args, "s|O:strftime", &fmt, &tup))\r
+        return NULL;\r
+\r
+    if (tup == NULL) {\r
+        time_t tt = time(NULL);\r
+        buf = *localtime(&tt);\r
+    } else if (!gettmarg(tup, &buf))\r
+        return NULL;\r
+\r
+    /* Checks added to make sure strftime() does not crash Python by\r
+       indexing blindly into some array for a textual representation\r
+       by some bad index (fixes bug #897625).\r
+\r
+        Also support values of zero from Python code for arguments in which\r
+        that is out of range by forcing that value to the lowest value that\r
+        is valid (fixed bug #1520914).\r
+\r
+        Valid ranges based on what is allowed in struct tm:\r
+\r
+        - tm_year: [0, max(int)] (1)\r
+        - tm_mon: [0, 11] (2)\r
+        - tm_mday: [1, 31]\r
+        - tm_hour: [0, 23]\r
+        - tm_min: [0, 59]\r
+        - tm_sec: [0, 60]\r
+        - tm_wday: [0, 6] (1)\r
+        - tm_yday: [0, 365] (2)\r
+        - tm_isdst: [-max(int), max(int)]\r
+\r
+        (1) gettmarg() handles bounds-checking.\r
+        (2) Python's acceptable range is one greater than the range in C,\r
+        thus need to check against automatic decrement by gettmarg().\r
+    */\r
+    if (buf.tm_mon == -1)\r
+        buf.tm_mon = 0;\r
+    else if (buf.tm_mon < 0 || buf.tm_mon > 11) {\r
+        PyErr_SetString(PyExc_ValueError, "month out of range");\r
+            return NULL;\r
+    }\r
+    if (buf.tm_mday == 0)\r
+        buf.tm_mday = 1;\r
+    else if (buf.tm_mday < 0 || buf.tm_mday > 31) {\r
+        PyErr_SetString(PyExc_ValueError, "day of month out of range");\r
+            return NULL;\r
+    }\r
+    if (buf.tm_hour < 0 || buf.tm_hour > 23) {\r
+        PyErr_SetString(PyExc_ValueError, "hour out of range");\r
+        return NULL;\r
+    }\r
+    if (buf.tm_min < 0 || buf.tm_min > 59) {\r
+        PyErr_SetString(PyExc_ValueError, "minute out of range");\r
+        return NULL;\r
+    }\r
+    if (buf.tm_sec < 0 || buf.tm_sec > 61) {\r
+        PyErr_SetString(PyExc_ValueError, "seconds out of range");\r
+        return NULL;\r
+    }\r
+    /* tm_wday does not need checking of its upper-bound since taking\r
+    ``% 7`` in gettmarg() automatically restricts the range. */\r
+    if (buf.tm_wday < 0) {\r
+        PyErr_SetString(PyExc_ValueError, "day of week out of range");\r
+        return NULL;\r
+    }\r
+    if (buf.tm_yday == -1)\r
+        buf.tm_yday = 0;\r
+    else if (buf.tm_yday < 0 || buf.tm_yday > 365) {\r
+        PyErr_SetString(PyExc_ValueError, "day of year out of range");\r
+        return NULL;\r
+    }\r
+    /* Normalize tm_isdst just in case someone foolishly implements %Z\r
+       based on the assumption that tm_isdst falls within the range of\r
+       [-1, 1] */\r
+    if (buf.tm_isdst < -1)\r
+        buf.tm_isdst = -1;\r
+    else if (buf.tm_isdst > 1)\r
+        buf.tm_isdst = 1;\r
+\r
+#ifdef MS_WINDOWS\r
+    /* check that the format string contains only valid directives */\r
+    for(outbuf = strchr(fmt, '%');\r
+        outbuf != NULL;\r
+        outbuf = strchr(outbuf+2, '%'))\r
+    {\r
+        if (outbuf[1]=='#')\r
+            ++outbuf; /* not documented by python, */\r
+        if (outbuf[1]=='\0' ||\r
+            !strchr("aAbBcdHIjmMpSUwWxXyYzZ%", outbuf[1]))\r
+        {\r
+            PyErr_SetString(PyExc_ValueError, "Invalid format string");\r
+            return 0;\r
+        }\r
+    }\r
+#endif\r
+\r
+    fmtlen = strlen(fmt);\r
+\r
+    /* I hate these functions that presume you know how big the output\r
+     * will be ahead of time...\r
+     */\r
+    for (i = 1024; ; i += i) {\r
+        outbuf = (char *)malloc(i);\r
+        if (outbuf == NULL) {\r
+            return PyErr_NoMemory();\r
+        }\r
+        buflen = strftime(outbuf, i, fmt, &buf);\r
+        if (buflen > 0 || i >= 256 * fmtlen) {\r
+            /* If the buffer is 256 times as long as the format,\r
+               it's probably not failing for lack of room!\r
+               More likely, the format yields an empty result,\r
+               e.g. an empty format, or %Z when the timezone\r
+               is unknown. */\r
+            PyObject *ret;\r
+            ret = PyString_FromStringAndSize(outbuf, buflen);\r
+            free(outbuf);\r
+            return ret;\r
+        }\r
+        free(outbuf);\r
+#if defined _MSC_VER && _MSC_VER >= 1400 && defined(__STDC_SECURE_LIB__)\r
+        /* VisualStudio .NET 2005 does this properly */\r
+        if (buflen == 0 && errno == EINVAL) {\r
+            PyErr_SetString(PyExc_ValueError, "Invalid format string");\r
+            return 0;\r
+        }\r
+#endif\r
+\r
+    }\r
+}\r
+\r
+PyDoc_STRVAR(strftime_doc,\r
+"strftime(format[, tuple]) -> string\n\\r
+\n\\r
+Convert a time tuple to a string according to a format specification.\n\\r
+See the library reference manual for formatting codes. When the time tuple\n\\r
+is not present, current time as returned by localtime() is used.");\r
+#endif /* HAVE_STRFTIME */\r
+\r
+static PyObject *\r
+time_strptime(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *strptime_module = PyImport_ImportModuleNoBlock("_strptime");\r
+    PyObject *strptime_result;\r
+\r
+    if (!strptime_module)\r
+        return NULL;\r
+    strptime_result = PyObject_CallMethod(strptime_module,\r
+                                            "_strptime_time", "O", args);\r
+    Py_DECREF(strptime_module);\r
+    return strptime_result;\r
+}\r
+\r
+PyDoc_STRVAR(strptime_doc,\r
+"strptime(string, format) -> struct_time\n\\r
+\n\\r
+Parse a string to a time tuple according to a format specification.\n\\r
+See the library reference manual for formatting codes (same as strftime()).");\r
+\r
+\r
+static PyObject *\r
+time_asctime(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *tup = NULL;\r
+    struct tm buf;\r
+    char *p;\r
+    if (!PyArg_UnpackTuple(args, "asctime", 0, 1, &tup))\r
+        return NULL;\r
+    if (tup == NULL) {\r
+        time_t tt = time(NULL);\r
+        buf = *localtime(&tt);\r
+    } else if (!gettmarg(tup, &buf))\r
+        return NULL;\r
+    p = asctime(&buf);\r
+    if (p == NULL) {\r
+        PyErr_SetString(PyExc_ValueError, "invalid time");\r
+        return NULL;\r
+    }\r
+    if (p[24] == '\n')\r
+        p[24] = '\0';\r
+    return PyString_FromString(p);\r
+}\r
+\r
+PyDoc_STRVAR(asctime_doc,\r
+"asctime([tuple]) -> string\n\\r
+\n\\r
+Convert a time tuple to a string, e.g. 'Sat Jun 06 16:26:11 1998'.\n\\r
+When the time tuple is not present, current time as returned by localtime()\n\\r
+is used.");\r
+\r
+static PyObject *\r
+time_ctime(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ot = NULL;\r
+    time_t tt;\r
+    char *p;\r
+\r
+    if (!PyArg_UnpackTuple(args, "ctime", 0, 1, &ot))\r
+        return NULL;\r
+    if (ot == NULL || ot == Py_None)\r
+        tt = time(NULL);\r
+    else {\r
+        double dt = PyFloat_AsDouble(ot);\r
+        if (PyErr_Occurred())\r
+            return NULL;\r
+        tt = _PyTime_DoubleToTimet(dt);\r
+        if (tt == (time_t)-1 && PyErr_Occurred())\r
+            return NULL;\r
+    }\r
+    p = ctime(&tt);\r
+    if (p == NULL) {\r
+        PyErr_SetString(PyExc_ValueError, "unconvertible time");\r
+        return NULL;\r
+    }\r
+    if (p[24] == '\n')\r
+        p[24] = '\0';\r
+    return PyString_FromString(p);\r
+}\r
+\r
+PyDoc_STRVAR(ctime_doc,\r
+"ctime(seconds) -> string\n\\r
+\n\\r
+Convert a time in seconds since the Epoch to a string in local time.\n\\r
+This is equivalent to asctime(localtime(seconds)). When the time tuple is\n\\r
+not present, current time as returned by localtime() is used.");\r
+\r
+#ifdef HAVE_MKTIME\r
+static PyObject *\r
+time_mktime(PyObject *self, PyObject *tup)\r
+{\r
+    struct tm buf;\r
+    time_t tt;\r
+    if (!gettmarg(tup, &buf))\r
+        return NULL;\r
+    buf.tm_wday = -1;  /* sentinel; original value ignored */\r
+    tt = mktime(&buf);\r
+    /* Return value of -1 does not necessarily mean an error, but tm_wday\r
+     * cannot remain set to -1 if mktime succeeded. */\r
+    if (tt == (time_t)(-1) && buf.tm_wday == -1) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "mktime argument out of range");\r
+        return NULL;\r
+    }\r
+    return PyFloat_FromDouble((double)tt);\r
+}\r
+\r
+PyDoc_STRVAR(mktime_doc,\r
+"mktime(tuple) -> floating point number\n\\r
+\n\\r
+Convert a time tuple in local time to seconds since the Epoch.");\r
+#endif /* HAVE_MKTIME */\r
+\r
+#ifdef HAVE_WORKING_TZSET\r
+static void inittimezone(PyObject *module);\r
+\r
+static PyObject *\r
+time_tzset(PyObject *self, PyObject *unused)\r
+{\r
+    PyObject* m;\r
+\r
+    m = PyImport_ImportModuleNoBlock("time");\r
+    if (m == NULL) {\r
+        return NULL;\r
+    }\r
+\r
+    tzset();\r
+\r
+    /* Reset timezone, altzone, daylight and tzname */\r
+    inittimezone(m);\r
+    Py_DECREF(m);\r
+\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(tzset_doc,\r
+"tzset()\n\\r
+\n\\r
+Initialize, or reinitialize, the local timezone to the value stored in\n\\r
+os.environ['TZ']. The TZ environment variable should be specified in\n\\r
+standard Unix timezone format as documented in the tzset man page\n\\r
+(eg. 'US/Eastern', 'Europe/Amsterdam'). Unknown timezones will silently\n\\r
+fall back to UTC. If the TZ environment variable is not set, the local\n\\r
+timezone is set to the systems best guess of wallclock time.\n\\r
+Changing the TZ environment variable without calling tzset *may* change\n\\r
+the local timezone used by methods such as localtime, but this behaviour\n\\r
+should not be relied on.");\r
+#endif /* HAVE_WORKING_TZSET */\r
+\r
+static void\r
+inittimezone(PyObject *m) {\r
+    /* This code moved from inittime wholesale to allow calling it from\r
+    time_tzset. In the future, some parts of it can be moved back\r
+    (for platforms that don't HAVE_WORKING_TZSET, when we know what they\r
+    are), and the extraneous calls to tzset(3) should be removed.\r
+    I haven't done this yet, as I don't want to change this code as\r
+    little as possible when introducing the time.tzset and time.tzsetwall\r
+    methods. This should simply be a method of doing the following once,\r
+    at the top of this function and removing the call to tzset() from\r
+    time_tzset():\r
+\r
+        #ifdef HAVE_TZSET\r
+        tzset()\r
+        #endif\r
+\r
+    And I'm lazy and hate C so nyer.\r
+     */\r
+#if defined(HAVE_TZNAME) && !defined(__GLIBC__) && !defined(__CYGWIN__)\r
+    tzset();\r
+#ifdef PYOS_OS2\r
+    PyModule_AddIntConstant(m, "timezone", _timezone);\r
+#else /* !PYOS_OS2 */\r
+    PyModule_AddIntConstant(m, "timezone", timezone);\r
+#endif /* PYOS_OS2 */\r
+#ifdef HAVE_ALTZONE\r
+    PyModule_AddIntConstant(m, "altzone", altzone);\r
+#else\r
+#ifdef PYOS_OS2\r
+    PyModule_AddIntConstant(m, "altzone", _timezone-3600);\r
+#else /* !PYOS_OS2 */\r
+    PyModule_AddIntConstant(m, "altzone", timezone-3600);\r
+#endif /* PYOS_OS2 */\r
+#endif\r
+    PyModule_AddIntConstant(m, "daylight", daylight);\r
+    PyModule_AddObject(m, "tzname",\r
+                       Py_BuildValue("(zz)", tzname[0], tzname[1]));\r
+#else /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/\r
+#ifdef HAVE_STRUCT_TM_TM_ZONE\r
+    {\r
+#define YEAR ((time_t)((365 * 24 + 6) * 3600))\r
+        time_t t;\r
+        struct tm *p;\r
+        long janzone, julyzone;\r
+        char janname[10], julyname[10];\r
+        t = (time((time_t *)0) / YEAR) * YEAR;\r
+        p = localtime(&t);\r
+        janzone = -p->tm_gmtoff;\r
+        strncpy(janname, p->tm_zone ? p->tm_zone : "   ", 9);\r
+        janname[9] = '\0';\r
+        t += YEAR/2;\r
+        p = localtime(&t);\r
+        julyzone = -p->tm_gmtoff;\r
+        strncpy(julyname, p->tm_zone ? p->tm_zone : "   ", 9);\r
+        julyname[9] = '\0';\r
+\r
+        if( janzone < julyzone ) {\r
+            /* DST is reversed in the southern hemisphere */\r
+            PyModule_AddIntConstant(m, "timezone", julyzone);\r
+            PyModule_AddIntConstant(m, "altzone", janzone);\r
+            PyModule_AddIntConstant(m, "daylight",\r
+                                    janzone != julyzone);\r
+            PyModule_AddObject(m, "tzname",\r
+                               Py_BuildValue("(zz)",\r
+                                             julyname, janname));\r
+        } else {\r
+            PyModule_AddIntConstant(m, "timezone", janzone);\r
+            PyModule_AddIntConstant(m, "altzone", julyzone);\r
+            PyModule_AddIntConstant(m, "daylight",\r
+                                    janzone != julyzone);\r
+            PyModule_AddObject(m, "tzname",\r
+                               Py_BuildValue("(zz)",\r
+                                             janname, julyname));\r
+        }\r
+    }\r
+#else\r
+#endif /* HAVE_STRUCT_TM_TM_ZONE */\r
+#ifdef __CYGWIN__\r
+    tzset();\r
+    PyModule_AddIntConstant(m, "timezone", _timezone);\r
+    PyModule_AddIntConstant(m, "altzone", _timezone-3600);\r
+    PyModule_AddIntConstant(m, "daylight", _daylight);\r
+    PyModule_AddObject(m, "tzname",\r
+                       Py_BuildValue("(zz)", _tzname[0], _tzname[1]));\r
+#endif /* __CYGWIN__ */\r
+#endif /* !HAVE_TZNAME || __GLIBC__ || __CYGWIN__*/\r
+}\r
+\r
+\r
+static PyMethodDef time_methods[] = {\r
+    {"time",            time_time, METH_NOARGS, time_doc},\r
+#ifdef HAVE_CLOCK\r
+    {"clock",           time_clock, METH_NOARGS, clock_doc},\r
+#endif\r
+    {"sleep",           time_sleep, METH_VARARGS, sleep_doc},\r
+    {"gmtime",          time_gmtime, METH_VARARGS, gmtime_doc},\r
+    {"localtime",       time_localtime, METH_VARARGS, localtime_doc},\r
+    {"asctime",         time_asctime, METH_VARARGS, asctime_doc},\r
+    {"ctime",           time_ctime, METH_VARARGS, ctime_doc},\r
+#ifdef HAVE_MKTIME\r
+    {"mktime",          time_mktime, METH_O, mktime_doc},\r
+#endif\r
+#ifdef HAVE_STRFTIME\r
+    {"strftime",        time_strftime, METH_VARARGS, strftime_doc},\r
+#endif\r
+    {"strptime",        time_strptime, METH_VARARGS, strptime_doc},\r
+#ifdef HAVE_WORKING_TZSET\r
+    {"tzset",           time_tzset, METH_NOARGS, tzset_doc},\r
+#endif\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+\r
+PyDoc_STRVAR(module_doc,\r
+"This module provides various functions to manipulate time values.\n\\r
+\n\\r
+There are two standard representations of time.  One is the number\n\\r
+of seconds since the Epoch, in UTC (a.k.a. GMT).  It may be an integer\n\\r
+or a floating point number (to represent fractions of seconds).\n\\r
+The Epoch is system-defined; on Unix, it is generally January 1st, 1970.\n\\r
+The actual value can be retrieved by calling gmtime(0).\n\\r
+\n\\r
+The other representation is a tuple of 9 integers giving local time.\n\\r
+The tuple items are:\n\\r
+  year (four digits, e.g. 1998)\n\\r
+  month (1-12)\n\\r
+  day (1-31)\n\\r
+  hours (0-23)\n\\r
+  minutes (0-59)\n\\r
+  seconds (0-59)\n\\r
+  weekday (0-6, Monday is 0)\n\\r
+  Julian day (day in the year, 1-366)\n\\r
+  DST (Daylight Savings Time) flag (-1, 0 or 1)\n\\r
+If the DST flag is 0, the time is given in the regular time zone;\n\\r
+if it is 1, the time is given in the DST time zone;\n\\r
+if it is -1, mktime() should guess based on the date and time.\n\\r
+\n\\r
+Variables:\n\\r
+\n\\r
+timezone -- difference in seconds between UTC and local standard time\n\\r
+altzone -- difference in  seconds between UTC and local DST time\n\\r
+daylight -- whether local time should reflect DST\n\\r
+tzname -- tuple of (standard time zone name, DST time zone name)\n\\r
+\n\\r
+Functions:\n\\r
+\n\\r
+time() -- return current time in seconds since the Epoch as a float\n\\r
+clock() -- return CPU time since process start as a float\n\\r
+sleep() -- delay for a number of seconds given as a float\n\\r
+gmtime() -- convert seconds since Epoch to UTC tuple\n\\r
+localtime() -- convert seconds since Epoch to local time tuple\n\\r
+asctime() -- convert time tuple to string\n\\r
+ctime() -- convert time in seconds to string\n\\r
+mktime() -- convert local time tuple to seconds since Epoch\n\\r
+strftime() -- convert time tuple to string according to format specification\n\\r
+strptime() -- parse string to time tuple according to format specification\n\\r
+tzset() -- change the local timezone");\r
+\r
+\r
+PyMODINIT_FUNC\r
+inittime(void)\r
+{\r
+    PyObject *m;\r
+    char *p;\r
+    m = Py_InitModule3("time", time_methods, module_doc);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    /* Accept 2-digit dates unless PYTHONY2K is set and non-empty */\r
+    p = Py_GETENV("PYTHONY2K");\r
+    PyModule_AddIntConstant(m, "accept2dyear", (long) (!p || !*p));\r
+    /* If an embedded interpreter is shutdown and reinitialized the old\r
+       moddict was not decrefed on shutdown and the next import of this\r
+       module leads to a leak.  Conditionally decref here to prevent that.\r
+    */\r
+    Py_XDECREF(moddict);\r
+    /* Squirrel away the module's dictionary for the y2k check */\r
+    moddict = PyModule_GetDict(m);\r
+    Py_INCREF(moddict);\r
+\r
+    /* Set, or reset, module variables like time.timezone */\r
+    inittimezone(m);\r
+\r
+#ifdef MS_WINDOWS\r
+    /* Helper to allow interrupts for Windows.\r
+       If Ctrl+C event delivered while not sleeping\r
+       it will be ignored.\r
+    */\r
+    main_thread = PyThread_get_thread_ident();\r
+    hInterruptEvent = CreateEvent(NULL, TRUE, FALSE, NULL);\r
+    SetConsoleCtrlHandler( PyCtrlHandler, TRUE);\r
+#endif /* MS_WINDOWS */\r
+    if (!initialized) {\r
+        PyStructSequence_InitType(&StructTimeType,\r
+                                  &struct_time_type_desc);\r
+    }\r
+    Py_INCREF(&StructTimeType);\r
+    PyModule_AddObject(m, "struct_time", (PyObject*) &StructTimeType);\r
+    initialized = 1;\r
+}\r
+\r
+\r
+/* Implement floattime() for various platforms */\r
+\r
+static double\r
+floattime(void)\r
+{\r
+    /* There are three ways to get the time:\r
+      (1) gettimeofday() -- resolution in microseconds\r
+      (2) ftime() -- resolution in milliseconds\r
+      (3) time() -- resolution in seconds\r
+      In all cases the return value is a float in seconds.\r
+      Since on some systems (e.g. SCO ODT 3.0) gettimeofday() may\r
+      fail, so we fall back on ftime() or time().\r
+      Note: clock resolution does not imply clock accuracy! */\r
+#ifdef HAVE_GETTIMEOFDAY\r
+    {\r
+        struct timeval t;\r
+#ifdef GETTIMEOFDAY_NO_TZ\r
+        if (gettimeofday(&t) == 0)\r
+            return (double)t.tv_sec + t.tv_usec*0.000001;\r
+#else /* !GETTIMEOFDAY_NO_TZ */\r
+        if (gettimeofday(&t, (struct timezone *)NULL) == 0)\r
+            return (double)t.tv_sec + t.tv_usec*0.000001;\r
+#endif /* !GETTIMEOFDAY_NO_TZ */\r
+    }\r
+\r
+#endif /* !HAVE_GETTIMEOFDAY */\r
+    {\r
+#if defined(HAVE_FTIME)\r
+        struct timeb t;\r
+        ftime(&t);\r
+        return (double)t.time + (double)t.millitm * (double)0.001;\r
+#else /* !HAVE_FTIME */\r
+        time_t secs;\r
+        time(&secs);\r
+        return (double)secs;\r
+#endif /* !HAVE_FTIME */\r
+    }\r
+}\r
+\r
+\r
+/* Implement floatsleep() for various platforms.\r
+   When interrupted (or when another error occurs), return -1 and\r
+   set an exception; else return 0. */\r
+\r
+static int\r
+floatsleep(double secs)\r
+{\r
+/* XXX Should test for MS_WINDOWS first! */\r
+#if defined(HAVE_SELECT) && !defined(__BEOS__) && !defined(__EMX__)\r
+    struct timeval t;\r
+    double frac;\r
+    frac = fmod(secs, 1.0);\r
+    secs = floor(secs);\r
+    t.tv_sec = (long)secs;\r
+    t.tv_usec = (long)(frac*1000000.0);\r
+    Py_BEGIN_ALLOW_THREADS\r
+    if (select(0, (fd_set *)0, (fd_set *)0, (fd_set *)0, &t) != 0) {\r
+#ifdef EINTR\r
+        if (errno != EINTR) {\r
+#else\r
+        if (1) {\r
+#endif\r
+            Py_BLOCK_THREADS\r
+            PyErr_SetFromErrno(PyExc_IOError);\r
+            return -1;\r
+        }\r
+    }\r
+    Py_END_ALLOW_THREADS\r
+#elif defined(__WATCOMC__) && !defined(__QNX__)\r
+    /* XXX Can't interrupt this sleep */\r
+    Py_BEGIN_ALLOW_THREADS\r
+    delay((int)(secs * 1000 + 0.5));  /* delay() uses milliseconds */\r
+    Py_END_ALLOW_THREADS\r
+#elif defined(MS_WINDOWS)\r
+    {\r
+        double millisecs = secs * 1000.0;\r
+        unsigned long ul_millis;\r
+\r
+        if (millisecs > (double)ULONG_MAX) {\r
+            PyErr_SetString(PyExc_OverflowError,\r
+                            "sleep length is too large");\r
+            return -1;\r
+        }\r
+        Py_BEGIN_ALLOW_THREADS\r
+        /* Allow sleep(0) to maintain win32 semantics, and as decreed\r
+         * by Guido, only the main thread can be interrupted.\r
+         */\r
+        ul_millis = (unsigned long)millisecs;\r
+        if (ul_millis == 0 ||\r
+            main_thread != PyThread_get_thread_ident())\r
+            Sleep(ul_millis);\r
+        else {\r
+            DWORD rc;\r
+            ResetEvent(hInterruptEvent);\r
+            rc = WaitForSingleObject(hInterruptEvent, ul_millis);\r
+            if (rc == WAIT_OBJECT_0) {\r
+                /* Yield to make sure real Python signal\r
+                 * handler called.\r
+                 */\r
+                Sleep(1);\r
+                Py_BLOCK_THREADS\r
+                errno = EINTR;\r
+                PyErr_SetFromErrno(PyExc_IOError);\r
+                return -1;\r
+            }\r
+        }\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+#elif defined(PYOS_OS2)\r
+    /* This Sleep *IS* Interruptable by Exceptions */\r
+    Py_BEGIN_ALLOW_THREADS\r
+    if (DosSleep(secs * 1000) != NO_ERROR) {\r
+        Py_BLOCK_THREADS\r
+        PyErr_SetFromErrno(PyExc_IOError);\r
+        return -1;\r
+    }\r
+    Py_END_ALLOW_THREADS\r
+#elif defined(__BEOS__)\r
+    /* This sleep *CAN BE* interrupted. */\r
+    {\r
+        if( secs <= 0.0 ) {\r
+            return;\r
+        }\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        /* BeOS snooze() is in microseconds... */\r
+        if( snooze( (bigtime_t)( secs * 1000.0 * 1000.0 ) ) == B_INTERRUPTED ) {\r
+            Py_BLOCK_THREADS\r
+            PyErr_SetFromErrno( PyExc_IOError );\r
+            return -1;\r
+        }\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+#elif defined(RISCOS)\r
+    if (secs <= 0.0)\r
+        return 0;\r
+    Py_BEGIN_ALLOW_THREADS\r
+    /* This sleep *CAN BE* interrupted. */\r
+    if ( riscos_sleep(secs) )\r
+        return -1;\r
+    Py_END_ALLOW_THREADS\r
+#elif defined(PLAN9)\r
+    {\r
+        double millisecs = secs * 1000.0;\r
+        if (millisecs > (double)LONG_MAX) {\r
+            PyErr_SetString(PyExc_OverflowError, "sleep length is too large");\r
+            return -1;\r
+        }\r
+        /* This sleep *CAN BE* interrupted. */\r
+        Py_BEGIN_ALLOW_THREADS\r
+        if(sleep((long)millisecs) < 0){\r
+            Py_BLOCK_THREADS\r
+            PyErr_SetFromErrno(PyExc_IOError);\r
+            return -1;\r
+        }\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+#else\r
+    /* XXX Can't interrupt this sleep */\r
+    Py_BEGIN_ALLOW_THREADS\r
+    sleep((int)secs);\r
+    Py_END_ALLOW_THREADS\r
+#endif\r
+\r
+    return 0;\r
+}\r
+\r
+/* export floattime to socketmodule.c */\r
+PyAPI_FUNC(double)\r
+_PyTime_FloatTime(void)\r
+{\r
+    return floattime();\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata.c
new file mode 100644 (file)
index 0000000..0880bd2
--- /dev/null
@@ -0,0 +1,1287 @@
+/* ------------------------------------------------------------------------\r
+\r
+   unicodedata -- Provides access to the Unicode 5.2 data base.\r
+\r
+   Data was extracted from the Unicode 5.2 UnicodeData.txt file.\r
+\r
+   Written by Marc-Andre Lemburg (mal@lemburg.com).\r
+   Modified for Python 2.0 by Fredrik Lundh (fredrik@pythonware.com)\r
+   Modified by Martin v. Löwis (martin@v.loewis.de)\r
+\r
+   Copyright (c) Corporation for National Research Initiatives.\r
+\r
+   ------------------------------------------------------------------------ */\r
+\r
+#include "Python.h"\r
+#include "ucnhash.h"\r
+#include "structmember.h"\r
+\r
+/* character properties */\r
+\r
+typedef struct {\r
+    const unsigned char category;       /* index into\r
+                                           _PyUnicode_CategoryNames */\r
+    const unsigned char combining;      /* combining class value 0 - 255 */\r
+    const unsigned char bidirectional;  /* index into\r
+                                           _PyUnicode_BidirectionalNames */\r
+    const unsigned char mirrored;       /* true if mirrored in bidir mode */\r
+    const unsigned char east_asian_width;       /* index into\r
+                                                   _PyUnicode_EastAsianWidth */\r
+    const unsigned char normalization_quick_check; /* see is_normalized() */\r
+} _PyUnicode_DatabaseRecord;\r
+\r
+typedef struct change_record {\r
+    /* sequence of fields should be the same as in merge_old_version */\r
+    const unsigned char bidir_changed;\r
+    const unsigned char category_changed;\r
+    const unsigned char decimal_changed;\r
+    const unsigned char mirrored_changed;\r
+    const double numeric_changed;\r
+} change_record;\r
+\r
+/* data file generated by Tools/unicode/makeunicodedata.py */\r
+#include "unicodedata_db.h"\r
+\r
+static const _PyUnicode_DatabaseRecord*\r
+_getrecord_ex(Py_UCS4 code)\r
+{\r
+    int index;\r
+    if (code >= 0x110000)\r
+        index = 0;\r
+    else {\r
+        index = index1[(code>>SHIFT)];\r
+        index = index2[(index<<SHIFT)+(code&((1<<SHIFT)-1))];\r
+    }\r
+\r
+    return &_PyUnicode_Database_Records[index];\r
+}\r
+\r
+/* ------------- Previous-version API ------------------------------------- */\r
+typedef struct previous_version {\r
+    PyObject_HEAD\r
+    const char *name;\r
+    const change_record* (*getrecord)(Py_UCS4);\r
+    Py_UCS4 (*normalization)(Py_UCS4);\r
+} PreviousDBVersion;\r
+\r
+#define get_old_record(self, v)    ((((PreviousDBVersion*)self)->getrecord)(v))\r
+\r
+static PyMemberDef DB_members[] = {\r
+        {"unidata_version", T_STRING, offsetof(PreviousDBVersion, name), READONLY},\r
+        {NULL}\r
+};\r
+\r
+/* forward declaration */\r
+static PyTypeObject UCD_Type;\r
+\r
+static PyObject*\r
+new_previous_version(const char*name, const change_record* (*getrecord)(Py_UCS4),\r
+                     Py_UCS4 (*normalization)(Py_UCS4))\r
+{\r
+        PreviousDBVersion *self;\r
+        self = PyObject_New(PreviousDBVersion, &UCD_Type);\r
+        if (self == NULL)\r
+                return NULL;\r
+        self->name = name;\r
+        self->getrecord = getrecord;\r
+        self->normalization = normalization;\r
+        return (PyObject*)self;\r
+}\r
+\r
+\r
+static Py_UCS4 getuchar(PyUnicodeObject *obj)\r
+{\r
+    Py_UNICODE *v = PyUnicode_AS_UNICODE(obj);\r
+\r
+    if (PyUnicode_GET_SIZE(obj) == 1)\r
+        return *v;\r
+#ifndef Py_UNICODE_WIDE\r
+    else if ((PyUnicode_GET_SIZE(obj) == 2) &&\r
+             (0xD800 <= v[0] && v[0] <= 0xDBFF) &&\r
+             (0xDC00 <= v[1] && v[1] <= 0xDFFF))\r
+        return (((v[0] & 0x3FF)<<10) | (v[1] & 0x3FF)) + 0x10000;\r
+#endif\r
+    PyErr_SetString(PyExc_TypeError,\r
+                    "need a single Unicode character as parameter");\r
+    return (Py_UCS4)-1;\r
+}\r
+\r
+/* --- Module API --------------------------------------------------------- */\r
+\r
+PyDoc_STRVAR(unicodedata_decimal__doc__,\r
+"decimal(unichr[, default])\n\\r
+\n\\r
+Returns the decimal value assigned to the Unicode character unichr\n\\r
+as integer. If no such value is defined, default is returned, or, if\n\\r
+not given, ValueError is raised.");\r
+\r
+static PyObject *\r
+unicodedata_decimal(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    PyObject *defobj = NULL;\r
+    int have_old = 0;\r
+    long rc;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!|O:decimal", &PyUnicode_Type, &v, &defobj))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0) {\r
+            /* unassigned */\r
+            have_old = 1;\r
+            rc = -1;\r
+        }\r
+        else if (old->decimal_changed != 0xFF) {\r
+            have_old = 1;\r
+            rc = old->decimal_changed;\r
+        }\r
+    }\r
+\r
+    if (!have_old)\r
+        rc = Py_UNICODE_TODECIMAL(c);\r
+    if (rc < 0) {\r
+        if (defobj == NULL) {\r
+            PyErr_SetString(PyExc_ValueError,\r
+                            "not a decimal");\r
+            return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(defobj);\r
+            return defobj;\r
+        }\r
+    }\r
+    return PyInt_FromLong(rc);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_digit__doc__,\r
+"digit(unichr[, default])\n\\r
+\n\\r
+Returns the digit value assigned to the Unicode character unichr as\n\\r
+integer. If no such value is defined, default is returned, or, if\n\\r
+not given, ValueError is raised.");\r
+\r
+static PyObject *\r
+unicodedata_digit(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    PyObject *defobj = NULL;\r
+    long rc;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!|O:digit", &PyUnicode_Type, &v, &defobj))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    rc = Py_UNICODE_TODIGIT(c);\r
+    if (rc < 0) {\r
+        if (defobj == NULL) {\r
+            PyErr_SetString(PyExc_ValueError, "not a digit");\r
+            return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(defobj);\r
+            return defobj;\r
+        }\r
+    }\r
+    return PyInt_FromLong(rc);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_numeric__doc__,\r
+"numeric(unichr[, default])\n\\r
+\n\\r
+Returns the numeric value assigned to the Unicode character unichr\n\\r
+as float. If no such value is defined, default is returned, or, if\n\\r
+not given, ValueError is raised.");\r
+\r
+static PyObject *\r
+unicodedata_numeric(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    PyObject *defobj = NULL;\r
+    int have_old = 0;\r
+    double rc;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!|O:numeric", &PyUnicode_Type, &v, &defobj))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0) {\r
+            /* unassigned */\r
+            have_old = 1;\r
+            rc = -1.0;\r
+        }\r
+        else if (old->decimal_changed != 0xFF) {\r
+            have_old = 1;\r
+            rc = old->decimal_changed;\r
+        }\r
+    }\r
+\r
+    if (!have_old)\r
+        rc = Py_UNICODE_TONUMERIC(c);\r
+    if (rc == -1.0) {\r
+        if (defobj == NULL) {\r
+            PyErr_SetString(PyExc_ValueError, "not a numeric character");\r
+            return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(defobj);\r
+            return defobj;\r
+        }\r
+    }\r
+    return PyFloat_FromDouble(rc);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_category__doc__,\r
+"category(unichr)\n\\r
+\n\\r
+Returns the general category assigned to the Unicode character\n\\r
+unichr as string.");\r
+\r
+static PyObject *\r
+unicodedata_category(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    int index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:category",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    index = (int) _getrecord_ex(c)->category;\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed != 0xFF)\r
+            index = old->category_changed;\r
+    }\r
+    return PyString_FromString(_PyUnicode_CategoryNames[index]);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_bidirectional__doc__,\r
+"bidirectional(unichr)\n\\r
+\n\\r
+Returns the bidirectional class assigned to the Unicode character\n\\r
+unichr as string. If no such value is defined, an empty string is\n\\r
+returned.");\r
+\r
+static PyObject *\r
+unicodedata_bidirectional(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    int index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:bidirectional",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    index = (int) _getrecord_ex(c)->bidirectional;\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0)\r
+            index = 0; /* unassigned */\r
+        else if (old->bidir_changed != 0xFF)\r
+            index = old->bidir_changed;\r
+    }\r
+    return PyString_FromString(_PyUnicode_BidirectionalNames[index]);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_combining__doc__,\r
+"combining(unichr)\n\\r
+\n\\r
+Returns the canonical combining class assigned to the Unicode\n\\r
+character unichr as integer. Returns 0 if no combining class is\n\\r
+defined.");\r
+\r
+static PyObject *\r
+unicodedata_combining(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    int index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:combining",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    index = (int) _getrecord_ex(c)->combining;\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0)\r
+            index = 0; /* unassigned */\r
+    }\r
+    return PyInt_FromLong(index);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_mirrored__doc__,\r
+"mirrored(unichr)\n\\r
+\n\\r
+Returns the mirrored property assigned to the Unicode character\n\\r
+unichr as integer. Returns 1 if the character has been identified as\n\\r
+a \"mirrored\" character in bidirectional text, 0 otherwise.");\r
+\r
+static PyObject *\r
+unicodedata_mirrored(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    int index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:mirrored",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    index = (int) _getrecord_ex(c)->mirrored;\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0)\r
+            index = 0; /* unassigned */\r
+        else if (old->mirrored_changed != 0xFF)\r
+            index = old->mirrored_changed;\r
+    }\r
+    return PyInt_FromLong(index);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_east_asian_width__doc__,\r
+"east_asian_width(unichr)\n\\r
+\n\\r
+Returns the east asian width assigned to the Unicode character\n\\r
+unichr as string.");\r
+\r
+static PyObject *\r
+unicodedata_east_asian_width(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    int index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:east_asian_width",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+    index = (int) _getrecord_ex(c)->east_asian_width;\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0)\r
+            index = 0; /* unassigned */\r
+    }\r
+    return PyString_FromString(_PyUnicode_EastAsianWidthNames[index]);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_decomposition__doc__,\r
+"decomposition(unichr)\n\\r
+\n\\r
+Returns the character decomposition mapping assigned to the Unicode\n\\r
+character unichr as string. An empty string is returned in case no\n\\r
+such mapping is defined.");\r
+\r
+static PyObject *\r
+unicodedata_decomposition(PyObject *self, PyObject *args)\r
+{\r
+    PyUnicodeObject *v;\r
+    char decomp[256];\r
+    int code, index, count, i;\r
+    unsigned int prefix_index;\r
+    Py_UCS4 c;\r
+\r
+    if (!PyArg_ParseTuple(args, "O!:decomposition",\r
+                          &PyUnicode_Type, &v))\r
+        return NULL;\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+\r
+    code = (int)c;\r
+\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, c);\r
+        if (old->category_changed == 0)\r
+            return PyString_FromString(""); /* unassigned */\r
+    }\r
+\r
+    if (code < 0 || code >= 0x110000)\r
+        index = 0;\r
+    else {\r
+        index = decomp_index1[(code>>DECOMP_SHIFT)];\r
+        index = decomp_index2[(index<<DECOMP_SHIFT)+\r
+                             (code&((1<<DECOMP_SHIFT)-1))];\r
+    }\r
+\r
+    /* high byte is number of hex bytes (usually one or two), low byte\r
+       is prefix code (from*/\r
+    count = decomp_data[index] >> 8;\r
+\r
+    /* XXX: could allocate the PyString up front instead\r
+       (strlen(prefix) + 5 * count + 1 bytes) */\r
+\r
+    /* Based on how index is calculated above and decomp_data is generated\r
+       from Tools/unicode/makeunicodedata.py, it should not be possible\r
+       to overflow decomp_prefix. */\r
+    prefix_index = decomp_data[index] & 255;\r
+    assert(prefix_index < (sizeof(decomp_prefix)/sizeof(*decomp_prefix)));\r
+\r
+    /* copy prefix */\r
+    i = strlen(decomp_prefix[prefix_index]);\r
+    memcpy(decomp, decomp_prefix[prefix_index], i);\r
+\r
+    while (count-- > 0) {\r
+        if (i)\r
+            decomp[i++] = ' ';\r
+        assert((size_t)i < sizeof(decomp));\r
+        PyOS_snprintf(decomp + i, sizeof(decomp) - i, "%04X",\r
+                      decomp_data[++index]);\r
+        i += strlen(decomp + i);\r
+    }\r
+\r
+    decomp[i] = '\0';\r
+\r
+    return PyString_FromString(decomp);\r
+}\r
+\r
+static void\r
+get_decomp_record(PyObject *self, Py_UCS4 code, int *index, int *prefix, int *count)\r
+{\r
+    if (code >= 0x110000) {\r
+        *index = 0;\r
+    } else if (self && get_old_record(self, code)->category_changed==0) {\r
+        /* unassigned in old version */\r
+        *index = 0;\r
+    }\r
+    else {\r
+        *index = decomp_index1[(code>>DECOMP_SHIFT)];\r
+        *index = decomp_index2[(*index<<DECOMP_SHIFT)+\r
+                               (code&((1<<DECOMP_SHIFT)-1))];\r
+    }\r
+\r
+    /* high byte is number of hex bytes (usually one or two), low byte\r
+       is prefix code (from*/\r
+    *count = decomp_data[*index] >> 8;\r
+    *prefix = decomp_data[*index] & 255;\r
+\r
+    (*index)++;\r
+}\r
+\r
+#define SBase   0xAC00\r
+#define LBase   0x1100\r
+#define VBase   0x1161\r
+#define TBase   0x11A7\r
+#define LCount  19\r
+#define VCount  21\r
+#define TCount  28\r
+#define NCount  (VCount*TCount)\r
+#define SCount  (LCount*NCount)\r
+\r
+static PyObject*\r
+nfd_nfkd(PyObject *self, PyObject *input, int k)\r
+{\r
+    PyObject *result;\r
+    Py_UNICODE *i, *end, *o;\r
+    /* Longest decomposition in Unicode 3.2: U+FDFA */\r
+    Py_UNICODE stack[20];\r
+    Py_ssize_t space, isize;\r
+    int index, prefix, count, stackptr;\r
+    unsigned char prev, cur;\r
+\r
+    stackptr = 0;\r
+    isize = PyUnicode_GET_SIZE(input);\r
+    space = isize;\r
+    /* Overallocate at most 10 characters. */\r
+    if (space > 10) {\r
+        if (space <= PY_SSIZE_T_MAX - 10)\r
+            space += 10;\r
+    }\r
+    else {\r
+        space *= 2;\r
+    }\r
+    result = PyUnicode_FromUnicode(NULL, space);\r
+    if (!result)\r
+        return NULL;\r
+    i = PyUnicode_AS_UNICODE(input);\r
+    end = i + isize;\r
+    o = PyUnicode_AS_UNICODE(result);\r
+\r
+    while (i < end) {\r
+        stack[stackptr++] = *i++;\r
+        while(stackptr) {\r
+            Py_UNICODE code = stack[--stackptr];\r
+            /* Hangul Decomposition adds three characters in\r
+               a single step, so we need at least that much room. */\r
+            if (space < 3) {\r
+                Py_ssize_t newsize = PyString_GET_SIZE(result) + 10;\r
+                space += 10;\r
+                if (PyUnicode_Resize(&result, newsize) == -1)\r
+                    return NULL;\r
+                o = PyUnicode_AS_UNICODE(result) + newsize - space;\r
+            }\r
+            /* Hangul Decomposition. */\r
+            if (SBase <= code && code < (SBase+SCount)) {\r
+                int SIndex = code - SBase;\r
+                int L = LBase + SIndex / NCount;\r
+                int V = VBase + (SIndex % NCount) / TCount;\r
+                int T = TBase + SIndex % TCount;\r
+                *o++ = L;\r
+                *o++ = V;\r
+                space -= 2;\r
+                if (T != TBase) {\r
+                    *o++ = T;\r
+                    space --;\r
+                }\r
+                continue;\r
+            }\r
+            /* normalization changes */\r
+            if (self) {\r
+                Py_UCS4 value = ((PreviousDBVersion*)self)->normalization(code);\r
+                if (value != 0) {\r
+                    stack[stackptr++] = value;\r
+                    continue;\r
+                }\r
+            }\r
+\r
+            /* Other decompositions. */\r
+            get_decomp_record(self, code, &index, &prefix, &count);\r
+\r
+            /* Copy character if it is not decomposable, or has a\r
+               compatibility decomposition, but we do NFD. */\r
+            if (!count || (prefix && !k)) {\r
+                *o++ = code;\r
+                space--;\r
+                continue;\r
+            }\r
+            /* Copy decomposition onto the stack, in reverse\r
+               order.  */\r
+            while(count) {\r
+                code = decomp_data[index + (--count)];\r
+                stack[stackptr++] = code;\r
+            }\r
+        }\r
+    }\r
+\r
+    /* Drop overallocation. Cannot fail. */\r
+    PyUnicode_Resize(&result, PyUnicode_GET_SIZE(result) - space);\r
+\r
+    /* Sort canonically. */\r
+    i = PyUnicode_AS_UNICODE(result);\r
+    prev = _getrecord_ex(*i)->combining;\r
+    end = i + PyUnicode_GET_SIZE(result);\r
+    for (i++; i < end; i++) {\r
+        cur = _getrecord_ex(*i)->combining;\r
+        if (prev == 0 || cur == 0 || prev <= cur) {\r
+            prev = cur;\r
+            continue;\r
+        }\r
+        /* Non-canonical order. Need to switch *i with previous. */\r
+        o = i - 1;\r
+        while (1) {\r
+            Py_UNICODE tmp = o[1];\r
+            o[1] = o[0];\r
+            o[0] = tmp;\r
+            o--;\r
+            if (o < PyUnicode_AS_UNICODE(result))\r
+                break;\r
+            prev = _getrecord_ex(*o)->combining;\r
+            if (prev == 0 || prev <= cur)\r
+                break;\r
+        }\r
+        prev = _getrecord_ex(*i)->combining;\r
+    }\r
+    return result;\r
+}\r
+\r
+static int\r
+find_nfc_index(PyObject *self, struct reindex* nfc, Py_UNICODE code)\r
+{\r
+    int index;\r
+    for (index = 0; nfc[index].start; index++) {\r
+        int start = nfc[index].start;\r
+        if (code < start)\r
+            return -1;\r
+        if (code <= start + nfc[index].count) {\r
+            int delta = code - start;\r
+            return nfc[index].index + delta;\r
+        }\r
+    }\r
+    return -1;\r
+}\r
+\r
+static PyObject*\r
+nfc_nfkc(PyObject *self, PyObject *input, int k)\r
+{\r
+    PyObject *result;\r
+    Py_UNICODE *i, *i1, *o, *end;\r
+    int f,l,index,index1,comb;\r
+    Py_UNICODE code;\r
+    Py_UNICODE *skipped[20];\r
+    int cskipped = 0;\r
+\r
+    result = nfd_nfkd(self, input, k);\r
+    if (!result)\r
+        return NULL;\r
+\r
+    /* We are going to modify result in-place.\r
+       If nfd_nfkd is changed to sometimes return the input,\r
+       this code needs to be reviewed. */\r
+    assert(result != input);\r
+\r
+    i = PyUnicode_AS_UNICODE(result);\r
+    end = i + PyUnicode_GET_SIZE(result);\r
+    o = PyUnicode_AS_UNICODE(result);\r
+\r
+  again:\r
+    while (i < end) {\r
+      for (index = 0; index < cskipped; index++) {\r
+          if (skipped[index] == i) {\r
+              /* *i character is skipped.\r
+                 Remove from list. */\r
+              skipped[index] = skipped[cskipped-1];\r
+              cskipped--;\r
+              i++;\r
+              goto again; /* continue while */\r
+          }\r
+      }\r
+      /* Hangul Composition. We don't need to check for <LV,T>\r
+         pairs, since we always have decomposed data. */\r
+      if (LBase <= *i && *i < (LBase+LCount) &&\r
+          i + 1 < end &&\r
+          VBase <= i[1] && i[1] <= (VBase+VCount)) {\r
+          int LIndex, VIndex;\r
+          LIndex = i[0] - LBase;\r
+          VIndex = i[1] - VBase;\r
+          code = SBase + (LIndex*VCount+VIndex)*TCount;\r
+          i+=2;\r
+          if (i < end &&\r
+              TBase <= *i && *i <= (TBase+TCount)) {\r
+              code += *i-TBase;\r
+              i++;\r
+          }\r
+          *o++ = code;\r
+          continue;\r
+      }\r
+\r
+      f = find_nfc_index(self, nfc_first, *i);\r
+      if (f == -1) {\r
+          *o++ = *i++;\r
+          continue;\r
+      }\r
+      /* Find next unblocked character. */\r
+      i1 = i+1;\r
+      comb = 0;\r
+      while (i1 < end) {\r
+          int comb1 = _getrecord_ex(*i1)->combining;\r
+          if (comb) {\r
+              if (comb1 == 0)\r
+                  break;\r
+              if (comb >= comb1) {\r
+                  /* Character is blocked. */\r
+                  i1++;\r
+                  continue;\r
+              }\r
+          }\r
+          l = find_nfc_index(self, nfc_last, *i1);\r
+          /* *i1 cannot be combined with *i. If *i1\r
+             is a starter, we don't need to look further.\r
+             Otherwise, record the combining class. */\r
+          if (l == -1) {\r
+            not_combinable:\r
+              if (comb1 == 0)\r
+                  break;\r
+              comb = comb1;\r
+              i1++;\r
+              continue;\r
+          }\r
+          index = f*TOTAL_LAST + l;\r
+          index1 = comp_index[index >> COMP_SHIFT];\r
+          code = comp_data[(index1<<COMP_SHIFT)+\r
+                           (index&((1<<COMP_SHIFT)-1))];\r
+          if (code == 0)\r
+              goto not_combinable;\r
+\r
+          /* Replace the original character. */\r
+          *i = code;\r
+          /* Mark the second character unused. */\r
+          assert(cskipped < 20);\r
+          skipped[cskipped++] = i1;\r
+          i1++;\r
+          f = find_nfc_index(self, nfc_first, *i);\r
+          if (f == -1)\r
+              break;\r
+      }\r
+      *o++ = *i++;\r
+    }\r
+    if (o != end)\r
+        PyUnicode_Resize(&result, o - PyUnicode_AS_UNICODE(result));\r
+    return result;\r
+}\r
+\r
+/* Return 1 if the input is certainly normalized, 0 if it might not be. */\r
+static int\r
+is_normalized(PyObject *self, PyObject *input, int nfc, int k)\r
+{\r
+    Py_UNICODE *i, *end;\r
+    unsigned char prev_combining = 0, quickcheck_mask;\r
+\r
+    /* An older version of the database is requested, quickchecks must be\r
+       disabled. */\r
+    if (self != NULL)\r
+        return 0;\r
+\r
+    /* The two quickcheck bits at this shift mean 0=Yes, 1=Maybe, 2=No,\r
+       as described in http://unicode.org/reports/tr15/#Annex8. */\r
+    quickcheck_mask = 3 << ((nfc ? 4 : 0) + (k ? 2 : 0));\r
+\r
+    i = PyUnicode_AS_UNICODE(input);\r
+    end = i + PyUnicode_GET_SIZE(input);\r
+    while (i < end) {\r
+        const _PyUnicode_DatabaseRecord *record = _getrecord_ex(*i++);\r
+        unsigned char combining = record->combining;\r
+        unsigned char quickcheck = record->normalization_quick_check;\r
+\r
+        if (quickcheck & quickcheck_mask)\r
+            return 0; /* this string might need normalization */\r
+        if (combining && prev_combining > combining)\r
+            return 0; /* non-canonical sort order, not normalized */\r
+        prev_combining = combining;\r
+    }\r
+    return 1; /* certainly normalized */\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_normalize__doc__,\r
+"normalize(form, unistr)\n\\r
+\n\\r
+Return the normal form 'form' for the Unicode string unistr.  Valid\n\\r
+values for form are 'NFC', 'NFKC', 'NFD', and 'NFKD'.");\r
+\r
+static PyObject*\r
+unicodedata_normalize(PyObject *self, PyObject *args)\r
+{\r
+    char *form;\r
+    PyObject *input;\r
+\r
+    if(!PyArg_ParseTuple(args, "sO!:normalize",\r
+                         &form, &PyUnicode_Type, &input))\r
+        return NULL;\r
+\r
+    if (PyUnicode_GetSize(input) == 0) {\r
+        /* Special case empty input strings, since resizing\r
+           them  later would cause internal errors. */\r
+        Py_INCREF(input);\r
+        return input;\r
+    }\r
+\r
+    if (strcmp(form, "NFC") == 0) {\r
+        if (is_normalized(self, input, 1, 0)) {\r
+            Py_INCREF(input);\r
+            return input;\r
+        }\r
+        return nfc_nfkc(self, input, 0);\r
+    }\r
+    if (strcmp(form, "NFKC") == 0) {\r
+        if (is_normalized(self, input, 1, 1)) {\r
+            Py_INCREF(input);\r
+            return input;\r
+        }\r
+        return nfc_nfkc(self, input, 1);\r
+    }\r
+    if (strcmp(form, "NFD") == 0) {\r
+        if (is_normalized(self, input, 0, 0)) {\r
+            Py_INCREF(input);\r
+            return input;\r
+        }\r
+        return nfd_nfkd(self, input, 0);\r
+    }\r
+    if (strcmp(form, "NFKD") == 0) {\r
+        if (is_normalized(self, input, 0, 1)) {\r
+            Py_INCREF(input);\r
+            return input;\r
+        }\r
+        return nfd_nfkd(self, input, 1);\r
+    }\r
+    PyErr_SetString(PyExc_ValueError, "invalid normalization form");\r
+    return NULL;\r
+}\r
+\r
+/* -------------------------------------------------------------------- */\r
+/* unicode character name tables */\r
+\r
+/* data file generated by Tools/unicode/makeunicodedata.py */\r
+#include "unicodename_db.h"\r
+\r
+/* -------------------------------------------------------------------- */\r
+/* database code (cut and pasted from the unidb package) */\r
+\r
+static unsigned long\r
+_gethash(const char *s, int len, int scale)\r
+{\r
+    int i;\r
+    unsigned long h = 0;\r
+    unsigned long ix;\r
+    for (i = 0; i < len; i++) {\r
+        h = (h * scale) + (unsigned char) Py_TOUPPER(Py_CHARMASK(s[i]));\r
+        ix = h & 0xff000000;\r
+        if (ix)\r
+            h = (h ^ ((ix>>24) & 0xff)) & 0x00ffffff;\r
+    }\r
+    return h;\r
+}\r
+\r
+static char *hangul_syllables[][3] = {\r
+    { "G",  "A",   ""   },\r
+    { "GG", "AE",  "G"  },\r
+    { "N",  "YA",  "GG" },\r
+    { "D",  "YAE", "GS" },\r
+    { "DD", "EO",  "N", },\r
+    { "R",  "E",   "NJ" },\r
+    { "M",  "YEO", "NH" },\r
+    { "B",  "YE",  "D"  },\r
+    { "BB", "O",   "L"  },\r
+    { "S",  "WA",  "LG" },\r
+    { "SS", "WAE", "LM" },\r
+    { "",   "OE",  "LB" },\r
+    { "J",  "YO",  "LS" },\r
+    { "JJ", "U",   "LT" },\r
+    { "C",  "WEO", "LP" },\r
+    { "K",  "WE",  "LH" },\r
+    { "T",  "WI",  "M"  },\r
+    { "P",  "YU",  "B"  },\r
+    { "H",  "EU",  "BS" },\r
+    { 0,    "YI",  "S"  },\r
+    { 0,    "I",   "SS" },\r
+    { 0,    0,     "NG" },\r
+    { 0,    0,     "J"  },\r
+    { 0,    0,     "C"  },\r
+    { 0,    0,     "K"  },\r
+    { 0,    0,     "T"  },\r
+    { 0,    0,     "P"  },\r
+    { 0,    0,     "H"  }\r
+};\r
+\r
+static int\r
+is_unified_ideograph(Py_UCS4 code)\r
+{\r
+    return (\r
+        (0x3400 <= code && code <= 0x4DB5) || /* CJK Ideograph Extension A */\r
+        (0x4E00 <= code && code <= 0x9FCB) || /* CJK Ideograph, Unicode 5.2 */\r
+        (0x20000 <= code && code <= 0x2A6D6) || /* CJK Ideograph Extension B */\r
+        (0x2A700 <= code && code <= 0x2B734));  /* CJK Ideograph Extension C */\r
+}\r
+\r
+static int\r
+_getucname(PyObject *self, Py_UCS4 code, char* buffer, int buflen)\r
+{\r
+    int offset;\r
+    int i;\r
+    int word;\r
+    unsigned char* w;\r
+\r
+    if (code >= 0x110000)\r
+        return 0;\r
+\r
+    if (self) {\r
+        const change_record *old = get_old_record(self, code);\r
+        if (old->category_changed == 0) {\r
+            /* unassigned */\r
+            return 0;\r
+        }\r
+    }\r
+\r
+    if (SBase <= code && code < SBase+SCount) {\r
+        /* Hangul syllable. */\r
+        int SIndex = code - SBase;\r
+        int L = SIndex / NCount;\r
+        int V = (SIndex % NCount) / TCount;\r
+        int T = SIndex % TCount;\r
+\r
+        if (buflen < 27)\r
+            /* Worst case: HANGUL SYLLABLE <10chars>. */\r
+            return 0;\r
+        strcpy(buffer, "HANGUL SYLLABLE ");\r
+        buffer += 16;\r
+        strcpy(buffer, hangul_syllables[L][0]);\r
+        buffer += strlen(hangul_syllables[L][0]);\r
+        strcpy(buffer, hangul_syllables[V][1]);\r
+        buffer += strlen(hangul_syllables[V][1]);\r
+        strcpy(buffer, hangul_syllables[T][2]);\r
+        buffer += strlen(hangul_syllables[T][2]);\r
+        *buffer = '\0';\r
+        return 1;\r
+    }\r
+\r
+    if (is_unified_ideograph(code)) {\r
+        if (buflen < 28)\r
+            /* Worst case: CJK UNIFIED IDEOGRAPH-20000 */\r
+            return 0;\r
+        sprintf(buffer, "CJK UNIFIED IDEOGRAPH-%X", code);\r
+        return 1;\r
+    }\r
+\r
+    /* get offset into phrasebook */\r
+    offset = phrasebook_offset1[(code>>phrasebook_shift)];\r
+    offset = phrasebook_offset2[(offset<<phrasebook_shift) +\r
+                               (code&((1<<phrasebook_shift)-1))];\r
+    if (!offset)\r
+        return 0;\r
+\r
+    i = 0;\r
+\r
+    for (;;) {\r
+        /* get word index */\r
+        word = phrasebook[offset] - phrasebook_short;\r
+        if (word >= 0) {\r
+            word = (word << 8) + phrasebook[offset+1];\r
+            offset += 2;\r
+        } else\r
+            word = phrasebook[offset++];\r
+        if (i) {\r
+            if (i > buflen)\r
+                return 0; /* buffer overflow */\r
+            buffer[i++] = ' ';\r
+        }\r
+        /* copy word string from lexicon.  the last character in the\r
+           word has bit 7 set.  the last word in a string ends with\r
+           0x80 */\r
+        w = lexicon + lexicon_offset[word];\r
+        while (*w < 128) {\r
+            if (i >= buflen)\r
+                return 0; /* buffer overflow */\r
+            buffer[i++] = *w++;\r
+        }\r
+        if (i >= buflen)\r
+            return 0; /* buffer overflow */\r
+        buffer[i++] = *w & 127;\r
+        if (*w == 128)\r
+            break; /* end of word */\r
+    }\r
+\r
+    return 1;\r
+}\r
+\r
+static int\r
+_cmpname(PyObject *self, int code, const char* name, int namelen)\r
+{\r
+    /* check if code corresponds to the given name */\r
+    int i;\r
+    char buffer[NAME_MAXLEN];\r
+    if (!_getucname(self, code, buffer, sizeof(buffer)))\r
+        return 0;\r
+    for (i = 0; i < namelen; i++) {\r
+        if (Py_TOUPPER(Py_CHARMASK(name[i])) != buffer[i])\r
+            return 0;\r
+    }\r
+    return buffer[namelen] == '\0';\r
+}\r
+\r
+static void\r
+find_syllable(const char *str, int *len, int *pos, int count, int column)\r
+{\r
+    int i, len1;\r
+    *len = -1;\r
+    for (i = 0; i < count; i++) {\r
+        char *s = hangul_syllables[i][column];\r
+        len1 = strlen(s);\r
+        if (len1 <= *len)\r
+            continue;\r
+        if (strncmp(str, s, len1) == 0) {\r
+            *len = len1;\r
+            *pos = i;\r
+        }\r
+    }\r
+    if (*len == -1) {\r
+        *len = 0;\r
+    }\r
+}\r
+\r
+static int\r
+_getcode(PyObject* self, const char* name, int namelen, Py_UCS4* code)\r
+{\r
+    unsigned int h, v;\r
+    unsigned int mask = code_size-1;\r
+    unsigned int i, incr;\r
+\r
+    /* Check for hangul syllables. */\r
+    if (strncmp(name, "HANGUL SYLLABLE ", 16) == 0) {\r
+        int len, L = -1, V = -1, T = -1;\r
+        const char *pos = name + 16;\r
+        find_syllable(pos, &len, &L, LCount, 0);\r
+        pos += len;\r
+        find_syllable(pos, &len, &V, VCount, 1);\r
+        pos += len;\r
+        find_syllable(pos, &len, &T, TCount, 2);\r
+        pos += len;\r
+        if (L != -1 && V != -1 && T != -1 && pos-name == namelen) {\r
+            *code = SBase + (L*VCount+V)*TCount + T;\r
+            return 1;\r
+        }\r
+        /* Otherwise, it's an illegal syllable name. */\r
+        return 0;\r
+    }\r
+\r
+    /* Check for unified ideographs. */\r
+    if (strncmp(name, "CJK UNIFIED IDEOGRAPH-", 22) == 0) {\r
+        /* Four or five hexdigits must follow. */\r
+        v = 0;\r
+        name += 22;\r
+        namelen -= 22;\r
+        if (namelen != 4 && namelen != 5)\r
+            return 0;\r
+        while (namelen--) {\r
+            v *= 16;\r
+            if (*name >= '0' && *name <= '9')\r
+                v += *name - '0';\r
+            else if (*name >= 'A' && *name <= 'F')\r
+                v += *name - 'A' + 10;\r
+            else\r
+                return 0;\r
+            name++;\r
+        }\r
+        if (!is_unified_ideograph(v))\r
+            return 0;\r
+        *code = v;\r
+        return 1;\r
+    }\r
+\r
+    /* the following is the same as python's dictionary lookup, with\r
+       only minor changes.  see the makeunicodedata script for more\r
+       details */\r
+\r
+    h = (unsigned int) _gethash(name, namelen, code_magic);\r
+    i = (~h) & mask;\r
+    v = code_hash[i];\r
+    if (!v)\r
+        return 0;\r
+    if (_cmpname(self, v, name, namelen)) {\r
+        *code = v;\r
+        return 1;\r
+    }\r
+    incr = (h ^ (h >> 3)) & mask;\r
+    if (!incr)\r
+        incr = mask;\r
+    for (;;) {\r
+        i = (i + incr) & mask;\r
+        v = code_hash[i];\r
+        if (!v)\r
+            return 0;\r
+        if (_cmpname(self, v, name, namelen)) {\r
+            *code = v;\r
+            return 1;\r
+        }\r
+        incr = incr << 1;\r
+        if (incr > mask)\r
+            incr = incr ^ code_poly;\r
+    }\r
+}\r
+\r
+static const _PyUnicode_Name_CAPI hashAPI =\r
+{\r
+    sizeof(_PyUnicode_Name_CAPI),\r
+    _getucname,\r
+    _getcode\r
+};\r
+\r
+/* -------------------------------------------------------------------- */\r
+/* Python bindings */\r
+\r
+PyDoc_STRVAR(unicodedata_name__doc__,\r
+"name(unichr[, default])\n\\r
+Returns the name assigned to the Unicode character unichr as a\n\\r
+string. If no name is defined, default is returned, or, if not\n\\r
+given, ValueError is raised.");\r
+\r
+static PyObject *\r
+unicodedata_name(PyObject* self, PyObject* args)\r
+{\r
+    char name[NAME_MAXLEN];\r
+    Py_UCS4 c;\r
+\r
+    PyUnicodeObject* v;\r
+    PyObject* defobj = NULL;\r
+    if (!PyArg_ParseTuple(args, "O!|O:name", &PyUnicode_Type, &v, &defobj))\r
+        return NULL;\r
+\r
+    c = getuchar(v);\r
+    if (c == (Py_UCS4)-1)\r
+        return NULL;\r
+\r
+    if (!_getucname(self, c, name, sizeof(name))) {\r
+        if (defobj == NULL) {\r
+            PyErr_SetString(PyExc_ValueError, "no such name");\r
+            return NULL;\r
+        }\r
+        else {\r
+            Py_INCREF(defobj);\r
+            return defobj;\r
+        }\r
+    }\r
+\r
+    return Py_BuildValue("s", name);\r
+}\r
+\r
+PyDoc_STRVAR(unicodedata_lookup__doc__,\r
+"lookup(name)\n\\r
+\n\\r
+Look up character by name.  If a character with the\n\\r
+given name is found, return the corresponding Unicode\n\\r
+character.  If not found, KeyError is raised.");\r
+\r
+static PyObject *\r
+unicodedata_lookup(PyObject* self, PyObject* args)\r
+{\r
+    Py_UCS4 code;\r
+    Py_UNICODE str[2];\r
+\r
+    char* name;\r
+    int namelen;\r
+    if (!PyArg_ParseTuple(args, "s#:lookup", &name, &namelen))\r
+        return NULL;\r
+\r
+    if (!_getcode(self, name, namelen, &code)) {\r
+        PyErr_Format(PyExc_KeyError, "undefined character name '%s'",\r
+                     name);\r
+        return NULL;\r
+    }\r
+\r
+#ifndef Py_UNICODE_WIDE\r
+    if (code >= 0x10000) {\r
+        str[0] = 0xd800 + ((code - 0x10000) >> 10);\r
+        str[1] = 0xdc00 + ((code - 0x10000) & 0x3ff);\r
+        return PyUnicode_FromUnicode(str, 2);\r
+    }\r
+#endif\r
+    str[0] = (Py_UNICODE) code;\r
+    return PyUnicode_FromUnicode(str, 1);\r
+}\r
+\r
+/* XXX Add doc strings. */\r
+\r
+static PyMethodDef unicodedata_functions[] = {\r
+    {"decimal", unicodedata_decimal, METH_VARARGS, unicodedata_decimal__doc__},\r
+    {"digit", unicodedata_digit, METH_VARARGS, unicodedata_digit__doc__},\r
+    {"numeric", unicodedata_numeric, METH_VARARGS, unicodedata_numeric__doc__},\r
+    {"category", unicodedata_category, METH_VARARGS,\r
+                 unicodedata_category__doc__},\r
+    {"bidirectional", unicodedata_bidirectional, METH_VARARGS,\r
+                      unicodedata_bidirectional__doc__},\r
+    {"combining", unicodedata_combining, METH_VARARGS,\r
+                  unicodedata_combining__doc__},\r
+    {"mirrored", unicodedata_mirrored, METH_VARARGS,\r
+                 unicodedata_mirrored__doc__},\r
+    {"east_asian_width", unicodedata_east_asian_width, METH_VARARGS,\r
+                         unicodedata_east_asian_width__doc__},\r
+    {"decomposition", unicodedata_decomposition, METH_VARARGS,\r
+                      unicodedata_decomposition__doc__},\r
+    {"name", unicodedata_name, METH_VARARGS, unicodedata_name__doc__},\r
+    {"lookup", unicodedata_lookup, METH_VARARGS, unicodedata_lookup__doc__},\r
+    {"normalize", unicodedata_normalize, METH_VARARGS,\r
+                  unicodedata_normalize__doc__},\r
+    {NULL, NULL}                /* sentinel */\r
+};\r
+\r
+static PyTypeObject UCD_Type = {\r
+        /* The ob_type field must be initialized in the module init function\r
+         * to be portable to Windows without using C++. */\r
+        PyVarObject_HEAD_INIT(NULL, 0)\r
+        "unicodedata.UCD",              /*tp_name*/\r
+        sizeof(PreviousDBVersion),      /*tp_basicsize*/\r
+        0,                      /*tp_itemsize*/\r
+        /* methods */\r
+        (destructor)PyObject_Del, /*tp_dealloc*/\r
+        0,                      /*tp_print*/\r
+        0,                      /*tp_getattr*/\r
+        0,                      /*tp_setattr*/\r
+        0,                      /*tp_compare*/\r
+        0,                      /*tp_repr*/\r
+        0,                      /*tp_as_number*/\r
+        0,                      /*tp_as_sequence*/\r
+        0,                      /*tp_as_mapping*/\r
+        0,                      /*tp_hash*/\r
+        0,                      /*tp_call*/\r
+        0,                      /*tp_str*/\r
+        PyObject_GenericGetAttr,/*tp_getattro*/\r
+        0,                      /*tp_setattro*/\r
+        0,                      /*tp_as_buffer*/\r
+        Py_TPFLAGS_DEFAULT,     /*tp_flags*/\r
+        0,                      /*tp_doc*/\r
+        0,                      /*tp_traverse*/\r
+        0,                      /*tp_clear*/\r
+        0,                      /*tp_richcompare*/\r
+        0,                      /*tp_weaklistoffset*/\r
+        0,                      /*tp_iter*/\r
+        0,                      /*tp_iternext*/\r
+        unicodedata_functions,  /*tp_methods*/\r
+        DB_members,             /*tp_members*/\r
+        0,                      /*tp_getset*/\r
+        0,                      /*tp_base*/\r
+        0,                      /*tp_dict*/\r
+        0,                      /*tp_descr_get*/\r
+        0,                      /*tp_descr_set*/\r
+        0,                      /*tp_dictoffset*/\r
+        0,                      /*tp_init*/\r
+        0,                      /*tp_alloc*/\r
+        0,                      /*tp_new*/\r
+        0,                      /*tp_free*/\r
+        0,                      /*tp_is_gc*/\r
+};\r
+\r
+PyDoc_STRVAR(unicodedata_docstring,\r
+"This module provides access to the Unicode Character Database which\n\\r
+defines character properties for all Unicode characters. The data in\n\\r
+this database is based on the UnicodeData.txt file version\n\\r
+5.2.0 which is publically available from ftp://ftp.unicode.org/.\n\\r
+\n\\r
+The module uses the same names and symbols as defined by the\n\\r
+UnicodeData File Format 5.2.0 (see\n\\r
+http://www.unicode.org/reports/tr44/tr44-4.html).");\r
+\r
+PyMODINIT_FUNC\r
+initunicodedata(void)\r
+{\r
+    PyObject *m, *v;\r
+\r
+    Py_TYPE(&UCD_Type) = &PyType_Type;\r
+\r
+    m = Py_InitModule3(\r
+        "unicodedata", unicodedata_functions, unicodedata_docstring);\r
+    if (!m)\r
+        return;\r
+\r
+    PyModule_AddStringConstant(m, "unidata_version", UNIDATA_VERSION);\r
+    Py_INCREF(&UCD_Type);\r
+    PyModule_AddObject(m, "UCD", (PyObject*)&UCD_Type);\r
+\r
+    /* Previous versions */\r
+    v = new_previous_version("3.2.0", get_change_3_2_0, normalization_3_2_0);\r
+    if (v != NULL)\r
+        PyModule_AddObject(m, "ucd_3_2_0", v);\r
+\r
+    /* Export C API */\r
+    v = PyCapsule_New((void *)&hashAPI, PyUnicodeData_CAPSULE_NAME, NULL);\r
+    if (v != NULL)\r
+        PyModule_AddObject(m, "ucnhash_CAPI", v);\r
+}\r
+\r
+/*\r
+Local variables:\r
+c-basic-offset: 4\r
+indent-tabs-mode: nil\r
+End:\r
+*/\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata_db.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodedata_db.h
new file mode 100644 (file)
index 0000000..3558c24
--- /dev/null
@@ -0,0 +1,6202 @@
+/* this file was generated by Tools/unicode/makeunicodedata.py 2.6 */\r
+\r
+#define UNIDATA_VERSION "5.2.0"\r
+/* a list of unique database records */\r
+const _PyUnicode_DatabaseRecord _PyUnicode_Database_Records[] = {\r
+    {0, 0, 0, 0, 0, 0},\r
+    {13, 0, 15, 0, 5, 0},\r
+    {13, 0, 17, 0, 5, 0},\r
+    {13, 0, 16, 0, 5, 0},\r
+    {13, 0, 18, 0, 5, 0},\r
+    {10, 0, 18, 0, 3, 0},\r
+    {26, 0, 19, 0, 3, 0},\r
+    {26, 0, 11, 0, 3, 0},\r
+    {28, 0, 11, 0, 3, 0},\r
+    {22, 0, 19, 1, 3, 0},\r
+    {23, 0, 19, 1, 3, 0},\r
+    {27, 0, 10, 0, 3, 0},\r
+    {26, 0, 13, 0, 3, 0},\r
+    {21, 0, 10, 0, 3, 0},\r
+    {7, 0, 9, 0, 3, 0},\r
+    {27, 0, 19, 1, 3, 0},\r
+    {27, 0, 19, 0, 3, 0},\r
+    {1, 0, 1, 0, 3, 0},\r
+    {29, 0, 19, 0, 3, 0},\r
+    {20, 0, 19, 0, 3, 0},\r
+    {2, 0, 1, 0, 3, 0},\r
+    {10, 0, 13, 0, 5, 136},\r
+    {26, 0, 19, 0, 4, 0},\r
+    {28, 0, 11, 0, 4, 0},\r
+    {30, 0, 19, 0, 3, 0},\r
+    {30, 0, 19, 0, 4, 0},\r
+    {29, 0, 19, 0, 4, 136},\r
+    {30, 0, 19, 0, 5, 0},\r
+    {2, 0, 1, 0, 4, 136},\r
+    {24, 0, 19, 1, 5, 0},\r
+    {14, 0, 15, 0, 4, 0},\r
+    {29, 0, 19, 0, 3, 136},\r
+    {30, 0, 11, 0, 4, 0},\r
+    {27, 0, 11, 0, 4, 0},\r
+    {9, 0, 9, 0, 4, 136},\r
+    {2, 0, 1, 0, 5, 136},\r
+    {25, 0, 19, 1, 5, 0},\r
+    {9, 0, 19, 0, 4, 136},\r
+    {1, 0, 1, 0, 5, 10},\r
+    {1, 0, 1, 0, 4, 0},\r
+    {27, 0, 19, 0, 4, 0},\r
+    {2, 0, 1, 0, 4, 0},\r
+    {2, 0, 1, 0, 4, 10},\r
+    {2, 0, 1, 0, 5, 10},\r
+    {1, 0, 1, 0, 5, 0},\r
+    {1, 0, 1, 0, 4, 136},\r
+    {2, 0, 1, 0, 5, 0},\r
+    {19, 0, 1, 0, 5, 0},\r
+    {1, 0, 1, 0, 5, 136},\r
+    {3, 0, 1, 0, 5, 136},\r
+    {18, 0, 1, 0, 5, 136},\r
+    {18, 0, 19, 0, 5, 0},\r
+    {18, 0, 1, 0, 5, 0},\r
+    {29, 0, 19, 0, 5, 0},\r
+    {29, 0, 19, 0, 4, 0},\r
+    {18, 0, 19, 0, 4, 0},\r
+    {18, 0, 1, 0, 4, 0},\r
+    {29, 0, 19, 0, 5, 136},\r
+    {4, 230, 14, 0, 4, 80},\r
+    {4, 230, 14, 0, 4, 0},\r
+    {4, 232, 14, 0, 4, 0},\r
+    {4, 220, 14, 0, 4, 0},\r
+    {4, 216, 14, 0, 4, 80},\r
+    {4, 202, 14, 0, 4, 0},\r
+    {4, 220, 14, 0, 4, 80},\r
+    {4, 202, 14, 0, 4, 80},\r
+    {4, 1, 14, 0, 4, 0},\r
+    {4, 1, 14, 0, 4, 80},\r
+    {4, 230, 14, 0, 4, 170},\r
+    {4, 240, 14, 0, 4, 80},\r
+    {4, 0, 14, 0, 4, 0},\r
+    {4, 233, 14, 0, 4, 0},\r
+    {4, 234, 14, 0, 4, 0},\r
+    {18, 0, 19, 0, 5, 170},\r
+    {26, 0, 19, 0, 5, 170},\r
+    {29, 0, 19, 0, 5, 138},\r
+    {1, 0, 1, 0, 5, 138},\r
+    {27, 0, 19, 0, 5, 0},\r
+    {1, 0, 1, 0, 4, 10},\r
+    {30, 0, 1, 0, 5, 0},\r
+    {4, 230, 14, 0, 5, 0},\r
+    {6, 0, 14, 0, 5, 0},\r
+    {26, 0, 1, 0, 5, 0},\r
+    {21, 0, 19, 0, 5, 0},\r
+    {4, 220, 14, 0, 5, 0},\r
+    {4, 222, 14, 0, 5, 0},\r
+    {4, 228, 14, 0, 5, 0},\r
+    {4, 10, 14, 0, 5, 0},\r
+    {4, 11, 14, 0, 5, 0},\r
+    {4, 12, 14, 0, 5, 0},\r
+    {4, 13, 14, 0, 5, 0},\r
+    {4, 14, 14, 0, 5, 0},\r
+    {4, 15, 14, 0, 5, 0},\r
+    {4, 16, 14, 0, 5, 0},\r
+    {4, 17, 14, 0, 5, 0},\r
+    {4, 18, 14, 0, 5, 0},\r
+    {4, 19, 14, 0, 5, 0},\r
+    {4, 20, 14, 0, 5, 0},\r
+    {4, 21, 14, 0, 5, 0},\r
+    {4, 22, 14, 0, 5, 0},\r
+    {21, 0, 4, 0, 5, 0},\r
+    {4, 23, 14, 0, 5, 0},\r
+    {26, 0, 4, 0, 5, 0},\r
+    {4, 24, 14, 0, 5, 0},\r
+    {4, 25, 14, 0, 5, 0},\r
+    {19, 0, 4, 0, 5, 0},\r
+    {14, 0, 12, 0, 5, 0},\r
+    {27, 0, 5, 0, 5, 0},\r
+    {26, 0, 11, 0, 5, 0},\r
+    {28, 0, 5, 0, 5, 0},\r
+    {26, 0, 13, 0, 5, 0},\r
+    {26, 0, 5, 0, 5, 0},\r
+    {4, 30, 14, 0, 5, 0},\r
+    {4, 31, 14, 0, 5, 0},\r
+    {4, 32, 14, 0, 5, 0},\r
+    {19, 0, 5, 0, 5, 0},\r
+    {19, 0, 5, 0, 5, 10},\r
+    {18, 0, 5, 0, 5, 0},\r
+    {4, 27, 14, 0, 5, 0},\r
+    {4, 28, 14, 0, 5, 0},\r
+    {4, 29, 14, 0, 5, 0},\r
+    {4, 33, 14, 0, 5, 0},\r
+    {4, 34, 14, 0, 5, 0},\r
+    {4, 230, 14, 0, 5, 80},\r
+    {4, 220, 14, 0, 5, 80},\r
+    {7, 0, 12, 0, 5, 0},\r
+    {26, 0, 12, 0, 5, 0},\r
+    {4, 35, 14, 0, 5, 0},\r
+    {19, 0, 5, 0, 5, 136},\r
+    {7, 0, 9, 0, 5, 0},\r
+    {30, 0, 5, 0, 5, 0},\r
+    {14, 0, 15, 0, 5, 0},\r
+    {4, 36, 14, 0, 5, 0},\r
+    {4, 0, 14, 0, 5, 0},\r
+    {7, 0, 4, 0, 5, 0},\r
+    {18, 0, 4, 0, 5, 0},\r
+    {26, 0, 19, 0, 5, 0},\r
+    {5, 0, 1, 0, 5, 0},\r
+    {19, 0, 1, 0, 5, 10},\r
+    {4, 7, 14, 0, 5, 80},\r
+    {4, 9, 14, 0, 5, 0},\r
+    {19, 0, 1, 0, 5, 170},\r
+    {7, 0, 1, 0, 5, 0},\r
+    {4, 7, 14, 0, 5, 0},\r
+    {5, 0, 1, 0, 5, 80},\r
+    {5, 0, 1, 0, 5, 10},\r
+    {28, 0, 11, 0, 5, 0},\r
+    {9, 0, 1, 0, 5, 0},\r
+    {4, 0, 14, 0, 5, 80},\r
+    {4, 0, 14, 0, 5, 10},\r
+    {4, 84, 14, 0, 5, 0},\r
+    {4, 91, 14, 0, 5, 80},\r
+    {9, 0, 19, 0, 5, 0},\r
+    {4, 0, 1, 0, 5, 0},\r
+    {4, 9, 14, 0, 5, 80},\r
+    {19, 0, 1, 0, 5, 136},\r
+    {4, 103, 14, 0, 5, 0},\r
+    {4, 107, 14, 0, 5, 0},\r
+    {4, 118, 14, 0, 5, 0},\r
+    {4, 122, 14, 0, 5, 0},\r
+    {26, 0, 1, 0, 5, 136},\r
+    {4, 216, 14, 0, 5, 0},\r
+    {22, 0, 19, 1, 5, 0},\r
+    {23, 0, 19, 1, 5, 0},\r
+    {4, 129, 14, 0, 5, 0},\r
+    {4, 130, 14, 0, 5, 0},\r
+    {4, 0, 14, 0, 5, 170},\r
+    {4, 132, 14, 0, 5, 0},\r
+    {4, 0, 14, 0, 5, 136},\r
+    {19, 0, 1, 0, 2, 0},\r
+    {19, 0, 1, 0, 5, 80},\r
+    {10, 0, 18, 0, 5, 0},\r
+    {8, 0, 1, 0, 5, 0},\r
+    {14, 0, 1, 0, 5, 0},\r
+    {5, 9, 1, 0, 5, 0},\r
+    {4, 1, 14, 0, 5, 0},\r
+    {4, 234, 14, 0, 5, 0},\r
+    {4, 214, 14, 0, 5, 0},\r
+    {4, 202, 14, 0, 5, 0},\r
+    {2, 0, 1, 0, 5, 138},\r
+    {2, 0, 1, 0, 5, 170},\r
+    {3, 0, 1, 0, 5, 10},\r
+    {1, 0, 1, 0, 5, 170},\r
+    {29, 0, 19, 0, 5, 170},\r
+    {10, 0, 18, 0, 5, 170},\r
+    {10, 0, 18, 0, 5, 136},\r
+    {14, 0, 4, 0, 5, 0},\r
+    {21, 0, 19, 0, 4, 0},\r
+    {21, 0, 19, 0, 5, 136},\r
+    {26, 0, 19, 0, 5, 136},\r
+    {24, 0, 19, 0, 4, 0},\r
+    {25, 0, 19, 0, 4, 0},\r
+    {22, 0, 19, 0, 5, 0},\r
+    {24, 0, 19, 0, 5, 0},\r
+    {26, 0, 19, 0, 4, 136},\r
+    {11, 0, 18, 0, 5, 0},\r
+    {12, 0, 16, 0, 5, 0},\r
+    {14, 0, 2, 0, 5, 0},\r
+    {14, 0, 6, 0, 5, 0},\r
+    {14, 0, 8, 0, 5, 0},\r
+    {14, 0, 3, 0, 5, 0},\r
+    {14, 0, 7, 0, 5, 0},\r
+    {26, 0, 11, 0, 4, 0},\r
+    {26, 0, 11, 0, 4, 136},\r
+    {26, 0, 11, 0, 5, 136},\r
+    {20, 0, 19, 0, 5, 0},\r
+    {27, 0, 13, 0, 5, 0},\r
+    {9, 0, 9, 0, 5, 136},\r
+    {27, 0, 10, 0, 5, 136},\r
+    {27, 0, 19, 0, 5, 136},\r
+    {22, 0, 19, 1, 5, 136},\r
+    {23, 0, 19, 1, 5, 136},\r
+    {18, 0, 1, 0, 4, 136},\r
+    {28, 0, 11, 0, 5, 136},\r
+    {28, 0, 11, 0, 1, 0},\r
+    {30, 0, 19, 0, 5, 136},\r
+    {30, 0, 19, 0, 4, 136},\r
+    {1, 0, 1, 0, 4, 170},\r
+    {30, 0, 11, 0, 5, 0},\r
+    {27, 0, 19, 1, 5, 136},\r
+    {9, 0, 19, 0, 5, 136},\r
+    {8, 0, 1, 0, 4, 136},\r
+    {8, 0, 1, 0, 5, 136},\r
+    {27, 0, 19, 0, 5, 10},\r
+    {30, 0, 19, 0, 5, 10},\r
+    {27, 0, 19, 1, 5, 0},\r
+    {27, 0, 19, 1, 4, 0},\r
+    {27, 0, 19, 1, 5, 10},\r
+    {27, 0, 10, 0, 5, 0},\r
+    {27, 0, 11, 0, 5, 0},\r
+    {27, 0, 19, 1, 4, 136},\r
+    {27, 0, 19, 1, 4, 10},\r
+    {22, 0, 19, 1, 2, 170},\r
+    {23, 0, 19, 1, 2, 170},\r
+    {30, 0, 1, 0, 4, 136},\r
+    {9, 0, 19, 0, 4, 0},\r
+    {27, 0, 19, 1, 5, 170},\r
+    {30, 0, 19, 0, 2, 0},\r
+    {30, 0, 19, 0, 2, 136},\r
+    {10, 0, 18, 0, 0, 136},\r
+    {26, 0, 19, 0, 2, 0},\r
+    {18, 0, 1, 0, 2, 0},\r
+    {8, 0, 1, 0, 2, 0},\r
+    {22, 0, 19, 1, 2, 0},\r
+    {23, 0, 19, 1, 2, 0},\r
+    {21, 0, 19, 0, 2, 0},\r
+    {22, 0, 19, 0, 2, 0},\r
+    {23, 0, 19, 0, 2, 0},\r
+    {4, 218, 14, 0, 2, 0},\r
+    {4, 228, 14, 0, 2, 0},\r
+    {4, 232, 14, 0, 2, 0},\r
+    {4, 222, 14, 0, 2, 0},\r
+    {4, 224, 14, 0, 2, 0},\r
+    {8, 0, 1, 0, 2, 136},\r
+    {19, 0, 1, 0, 2, 10},\r
+    {4, 8, 14, 0, 2, 80},\r
+    {29, 0, 19, 0, 2, 136},\r
+    {18, 0, 1, 0, 2, 10},\r
+    {19, 0, 1, 0, 2, 136},\r
+    {30, 0, 1, 0, 2, 0},\r
+    {9, 0, 1, 0, 2, 136},\r
+    {30, 0, 1, 0, 2, 136},\r
+    {30, 0, 1, 0, 4, 0},\r
+    {9, 0, 19, 0, 2, 136},\r
+    {29, 0, 1, 0, 5, 0},\r
+    {15, 0, 1, 0, 5, 0},\r
+    {16, 0, 1, 0, 4, 0},\r
+    {19, 0, 1, 0, 2, 170},\r
+    {19, 0, 4, 0, 5, 170},\r
+    {4, 26, 14, 0, 5, 0},\r
+    {19, 0, 4, 0, 5, 136},\r
+    {23, 0, 19, 0, 5, 0},\r
+    {28, 0, 5, 0, 5, 136},\r
+    {26, 0, 19, 0, 2, 136},\r
+    {22, 0, 19, 0, 2, 136},\r
+    {23, 0, 19, 0, 2, 136},\r
+    {21, 0, 19, 0, 2, 136},\r
+    {20, 0, 19, 0, 2, 136},\r
+    {26, 0, 13, 0, 2, 136},\r
+    {22, 0, 19, 1, 2, 136},\r
+    {23, 0, 19, 1, 2, 136},\r
+    {26, 0, 11, 0, 2, 136},\r
+    {27, 0, 10, 0, 2, 136},\r
+    {21, 0, 10, 0, 2, 136},\r
+    {27, 0, 19, 1, 2, 136},\r
+    {27, 0, 19, 0, 2, 136},\r
+    {28, 0, 11, 0, 2, 136},\r
+    {26, 0, 19, 0, 0, 136},\r
+    {26, 0, 11, 0, 0, 136},\r
+    {28, 0, 11, 0, 0, 136},\r
+    {22, 0, 19, 1, 0, 136},\r
+    {23, 0, 19, 1, 0, 136},\r
+    {27, 0, 10, 0, 0, 136},\r
+    {26, 0, 13, 0, 0, 136},\r
+    {21, 0, 10, 0, 0, 136},\r
+    {7, 0, 9, 0, 0, 136},\r
+    {27, 0, 19, 1, 0, 136},\r
+    {27, 0, 19, 0, 0, 136},\r
+    {1, 0, 1, 0, 0, 136},\r
+    {29, 0, 19, 0, 0, 136},\r
+    {20, 0, 19, 0, 0, 136},\r
+    {2, 0, 1, 0, 0, 136},\r
+    {26, 0, 19, 0, 1, 136},\r
+    {22, 0, 19, 1, 1, 136},\r
+    {23, 0, 19, 1, 1, 136},\r
+    {19, 0, 1, 0, 1, 136},\r
+    {18, 0, 1, 0, 1, 136},\r
+    {30, 0, 19, 0, 0, 136},\r
+    {30, 0, 19, 0, 1, 136},\r
+    {27, 0, 19, 0, 1, 136},\r
+    {14, 0, 19, 0, 5, 0},\r
+    {8, 0, 19, 0, 5, 0},\r
+    {9, 0, 4, 0, 5, 0},\r
+    {9, 0, 12, 0, 5, 0},\r
+    {30, 0, 1, 0, 5, 170},\r
+    {5, 216, 1, 0, 5, 0},\r
+    {5, 226, 1, 0, 5, 0},\r
+    {27, 0, 1, 0, 5, 136},\r
+    {7, 0, 9, 0, 5, 136},\r
+    {30, 0, 1, 0, 5, 136},\r
+};\r
+\r
+/* Reindexing of NFC first characters. */\r
+#define TOTAL_FIRST 370\r
+#define TOTAL_LAST 55\r
+struct reindex{int start;short count,index;};\r
+static struct reindex nfc_first[] = {\r
+  { 60, 2, 0},\r
+  { 65, 15, 3},\r
+  { 82, 8, 19},\r
+  { 97, 15, 28},\r
+  { 114, 8, 44},\r
+  { 168, 0, 53},\r
+  { 194, 0, 54},\r
+  { 196, 3, 55},\r
+  { 202, 0, 59},\r
+  { 207, 0, 60},\r
+  { 212, 2, 61},\r
+  { 216, 0, 64},\r
+  { 220, 0, 65},\r
+  { 226, 0, 66},\r
+  { 228, 3, 67},\r
+  { 234, 0, 71},\r
+  { 239, 0, 72},\r
+  { 244, 2, 73},\r
+  { 248, 0, 76},\r
+  { 252, 0, 77},\r
+  { 258, 1, 78},\r
+  { 274, 1, 80},\r
+  { 332, 1, 82},\r
+  { 346, 1, 84},\r
+  { 352, 1, 86},\r
+  { 360, 3, 88},\r
+  { 383, 0, 92},\r
+  { 416, 1, 93},\r
+  { 431, 1, 95},\r
+  { 439, 0, 97},\r
+  { 490, 1, 98},\r
+  { 550, 3, 100},\r
+  { 558, 1, 104},\r
+  { 658, 0, 106},\r
+  { 913, 0, 107},\r
+  { 917, 0, 108},\r
+  { 919, 0, 109},\r
+  { 921, 0, 110},\r
+  { 927, 0, 111},\r
+  { 929, 0, 112},\r
+  { 933, 0, 113},\r
+  { 937, 0, 114},\r
+  { 940, 0, 115},\r
+  { 942, 0, 116},\r
+  { 945, 0, 117},\r
+  { 949, 0, 118},\r
+  { 951, 0, 119},\r
+  { 953, 0, 120},\r
+  { 959, 0, 121},\r
+  { 961, 0, 122},\r
+  { 965, 0, 123},\r
+  { 969, 2, 124},\r
+  { 974, 0, 127},\r
+  { 978, 0, 128},\r
+  { 1030, 0, 129},\r
+  { 1040, 0, 130},\r
+  { 1043, 0, 131},\r
+  { 1045, 3, 132},\r
+  { 1050, 0, 136},\r
+  { 1054, 0, 137},\r
+  { 1059, 0, 138},\r
+  { 1063, 0, 139},\r
+  { 1067, 0, 140},\r
+  { 1069, 0, 141},\r
+  { 1072, 0, 142},\r
+  { 1075, 0, 143},\r
+  { 1077, 3, 144},\r
+  { 1082, 0, 148},\r
+  { 1086, 0, 149},\r
+  { 1091, 0, 150},\r
+  { 1095, 0, 151},\r
+  { 1099, 0, 152},\r
+  { 1101, 0, 153},\r
+  { 1110, 0, 154},\r
+  { 1140, 1, 155},\r
+  { 1240, 1, 157},\r
+  { 1256, 1, 159},\r
+  { 1575, 0, 161},\r
+  { 1608, 0, 162},\r
+  { 1610, 0, 163},\r
+  { 1729, 0, 164},\r
+  { 1746, 0, 165},\r
+  { 1749, 0, 166},\r
+  { 2344, 0, 167},\r
+  { 2352, 0, 168},\r
+  { 2355, 0, 169},\r
+  { 2503, 0, 170},\r
+  { 2887, 0, 171},\r
+  { 2962, 0, 172},\r
+  { 3014, 1, 173},\r
+  { 3142, 0, 175},\r
+  { 3263, 0, 176},\r
+  { 3270, 0, 177},\r
+  { 3274, 0, 178},\r
+  { 3398, 1, 179},\r
+  { 3545, 0, 181},\r
+  { 3548, 0, 182},\r
+  { 4133, 0, 183},\r
+  { 6917, 0, 184},\r
+  { 6919, 0, 185},\r
+  { 6921, 0, 186},\r
+  { 6923, 0, 187},\r
+  { 6925, 0, 188},\r
+  { 6929, 0, 189},\r
+  { 6970, 0, 190},\r
+  { 6972, 0, 191},\r
+  { 6974, 1, 192},\r
+  { 6978, 0, 194},\r
+  { 7734, 1, 195},\r
+  { 7770, 1, 197},\r
+  { 7778, 1, 199},\r
+  { 7840, 1, 201},\r
+  { 7864, 1, 203},\r
+  { 7884, 1, 205},\r
+  { 7936, 17, 207},\r
+  { 7960, 1, 225},\r
+  { 7968, 17, 227},\r
+  { 7992, 1, 245},\r
+  { 8000, 1, 247},\r
+  { 8008, 1, 249},\r
+  { 8016, 1, 251},\r
+  { 8025, 0, 253},\r
+  { 8032, 16, 254},\r
+  { 8052, 0, 271},\r
+  { 8060, 0, 272},\r
+  { 8118, 0, 273},\r
+  { 8127, 0, 274},\r
+  { 8134, 0, 275},\r
+  { 8182, 0, 276},\r
+  { 8190, 0, 277},\r
+  { 8592, 0, 278},\r
+  { 8594, 0, 279},\r
+  { 8596, 0, 280},\r
+  { 8656, 0, 281},\r
+  { 8658, 0, 282},\r
+  { 8660, 0, 283},\r
+  { 8707, 0, 284},\r
+  { 8712, 0, 285},\r
+  { 8715, 0, 286},\r
+  { 8739, 0, 287},\r
+  { 8741, 0, 288},\r
+  { 8764, 0, 289},\r
+  { 8771, 0, 290},\r
+  { 8773, 0, 291},\r
+  { 8776, 0, 292},\r
+  { 8781, 0, 293},\r
+  { 8801, 0, 294},\r
+  { 8804, 1, 295},\r
+  { 8818, 1, 297},\r
+  { 8822, 1, 299},\r
+  { 8826, 3, 301},\r
+  { 8834, 1, 305},\r
+  { 8838, 1, 307},\r
+  { 8849, 1, 309},\r
+  { 8866, 0, 311},\r
+  { 8872, 1, 312},\r
+  { 8875, 0, 314},\r
+  { 8882, 3, 315},\r
+  { 12358, 0, 319},\r
+  { 12363, 0, 320},\r
+  { 12365, 0, 321},\r
+  { 12367, 0, 322},\r
+  { 12369, 0, 323},\r
+  { 12371, 0, 324},\r
+  { 12373, 0, 325},\r
+  { 12375, 0, 326},\r
+  { 12377, 0, 327},\r
+  { 12379, 0, 328},\r
+  { 12381, 0, 329},\r
+  { 12383, 0, 330},\r
+  { 12385, 0, 331},\r
+  { 12388, 0, 332},\r
+  { 12390, 0, 333},\r
+  { 12392, 0, 334},\r
+  { 12399, 0, 335},\r
+  { 12402, 0, 336},\r
+  { 12405, 0, 337},\r
+  { 12408, 0, 338},\r
+  { 12411, 0, 339},\r
+  { 12445, 0, 340},\r
+  { 12454, 0, 341},\r
+  { 12459, 0, 342},\r
+  { 12461, 0, 343},\r
+  { 12463, 0, 344},\r
+  { 12465, 0, 345},\r
+  { 12467, 0, 346},\r
+  { 12469, 0, 347},\r
+  { 12471, 0, 348},\r
+  { 12473, 0, 349},\r
+  { 12475, 0, 350},\r
+  { 12477, 0, 351},\r
+  { 12479, 0, 352},\r
+  { 12481, 0, 353},\r
+  { 12484, 0, 354},\r
+  { 12486, 0, 355},\r
+  { 12488, 0, 356},\r
+  { 12495, 0, 357},\r
+  { 12498, 0, 358},\r
+  { 12501, 0, 359},\r
+  { 12504, 0, 360},\r
+  { 12507, 0, 361},\r
+  { 12527, 3, 362},\r
+  { 12541, 0, 366},\r
+  { 69785, 0, 367},\r
+  { 69787, 0, 368},\r
+  { 69797, 0, 369},\r
+  {0,0,0}\r
+};\r
+\r
+static struct reindex nfc_last[] = {\r
+  { 768, 4, 0},\r
+  { 774, 6, 5},\r
+  { 783, 0, 12},\r
+  { 785, 0, 13},\r
+  { 787, 1, 14},\r
+  { 795, 0, 16},\r
+  { 803, 5, 17},\r
+  { 813, 1, 23},\r
+  { 816, 1, 25},\r
+  { 824, 0, 27},\r
+  { 834, 0, 28},\r
+  { 837, 0, 29},\r
+  { 1619, 2, 30},\r
+  { 2364, 0, 33},\r
+  { 2494, 0, 34},\r
+  { 2519, 0, 35},\r
+  { 2878, 0, 36},\r
+  { 2902, 1, 37},\r
+  { 3006, 0, 39},\r
+  { 3031, 0, 40},\r
+  { 3158, 0, 41},\r
+  { 3266, 0, 42},\r
+  { 3285, 1, 43},\r
+  { 3390, 0, 45},\r
+  { 3415, 0, 46},\r
+  { 3530, 0, 47},\r
+  { 3535, 0, 48},\r
+  { 3551, 0, 49},\r
+  { 4142, 0, 50},\r
+  { 6965, 0, 51},\r
+  { 12441, 1, 52},\r
+  { 69818, 0, 54},\r
+  {0,0,0}\r
+};\r
+\r
+/* string literals */\r
+const char *_PyUnicode_CategoryNames[] = {\r
+    "Cn",\r
+    "Lu",\r
+    "Ll",\r
+    "Lt",\r
+    "Mn",\r
+    "Mc",\r
+    "Me",\r
+    "Nd",\r
+    "Nl",\r
+    "No",\r
+    "Zs",\r
+    "Zl",\r
+    "Zp",\r
+    "Cc",\r
+    "Cf",\r
+    "Cs",\r
+    "Co",\r
+    "Cn",\r
+    "Lm",\r
+    "Lo",\r
+    "Pc",\r
+    "Pd",\r
+    "Ps",\r
+    "Pe",\r
+    "Pi",\r
+    "Pf",\r
+    "Po",\r
+    "Sm",\r
+    "Sc",\r
+    "Sk",\r
+    "So",\r
+    NULL\r
+};\r
+const char *_PyUnicode_BidirectionalNames[] = {\r
+    "",\r
+    "L",\r
+    "LRE",\r
+    "LRO",\r
+    "R",\r
+    "AL",\r
+    "RLE",\r
+    "RLO",\r
+    "PDF",\r
+    "EN",\r
+    "ES",\r
+    "ET",\r
+    "AN",\r
+    "CS",\r
+    "NSM",\r
+    "BN",\r
+    "B",\r
+    "S",\r
+    "WS",\r
+    "ON",\r
+    NULL\r
+};\r
+const char *_PyUnicode_EastAsianWidthNames[] = {\r
+    "F",\r
+    "H",\r
+    "W",\r
+    "Na",\r
+    "A",\r
+    "N",\r
+    NULL\r
+};\r
+static const char *decomp_prefix[] = {\r
+    "",\r
+    "<noBreak>",\r
+    "<compat>",\r
+    "<super>",\r
+    "<fraction>",\r
+    "<sub>",\r
+    "<font>",\r
+    "<circle>",\r
+    "<wide>",\r
+    "<vertical>",\r
+    "<square>",\r
+    "<isolated>",\r
+    "<final>",\r
+    "<initial>",\r
+    "<medial>",\r
+    "<small>",\r
+    "<narrow>",\r
+    NULL\r
+};\r
+/* index tables for the database records */\r
+#define SHIFT 7\r
+static unsigned char index1[] = {\r
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, \r
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, \r
+    39, 40, 41, 41, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, \r
+    55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, \r
+    73, 74, 75, 76, 77, 78, 78, 79, 80, 81, 82, 83, 17, 84, 85, 86, 87, 88, \r
+    89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 101, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 102, \r
+    103, 100, 100, 100, 100, 100, 100, 100, 100, 104, 41, 41, 105, 106, 107, \r
+    108, 109, 110, 111, 112, 113, 114, 17, 115, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, \r
+    116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 116, 117, 118, 118, \r
+    118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, 118, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 120, 120, 121, 122, 123, 124, \r
+    125, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 17, 136, 137, \r
+    138, 139, 140, 17, 17, 17, 17, 17, 17, 141, 17, 142, 17, 143, 17, 144, \r
+    17, 145, 17, 17, 17, 146, 17, 17, 17, 17, 147, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 41, 41, 41, 41, 41, 41, 148, 17, 149, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 41, 41, 41, 41, 41, 41, 41, 41, 150, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 78, 151, \r
+    152, 153, 154, 17, 155, 17, 156, 157, 158, 159, 160, 161, 162, 163, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 164, 165, 166, 167, 168, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 169, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, \r
+    100, 100, 100, 100, 100, 100, 100, 100, 170, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 120, 120, 120, \r
+    120, 171, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 172, 17, 173, 174, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 175, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, \r
+    119, 119, 175, \r
+};\r
+\r
+static unsigned short index2[] = {\r
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \r
+    1, 1, 1, 1, 3, 3, 3, 2, 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, \r
+    12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20, 20, 20, 20, 20, \r
+    20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, \r
+    20, 20, 9, 16, 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \r
+    1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 21, 22, 8, 8, 23, 8, 24, \r
+    25, 26, 27, 28, 29, 16, 30, 25, 31, 32, 33, 34, 34, 26, 35, 25, 22, 26, \r
+    34, 28, 36, 37, 37, 37, 22, 38, 38, 38, 38, 38, 38, 39, 38, 38, 38, 38, \r
+    38, 38, 38, 38, 38, 39, 38, 38, 38, 38, 38, 38, 40, 39, 38, 38, 38, 38, \r
+    38, 39, 41, 42, 42, 43, 43, 43, 43, 41, 43, 42, 42, 42, 43, 42, 42, 43, \r
+    43, 41, 43, 42, 42, 43, 43, 43, 40, 41, 42, 42, 43, 42, 43, 41, 43, 38, \r
+    42, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 41, 38, \r
+    42, 38, 43, 38, 43, 38, 43, 38, 42, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 39, 41, 38, 43, 38, 42, 38, 43, 38, 43, 38, 41, 45, 28, 38, 43, 38, \r
+    43, 41, 38, 43, 38, 43, 38, 43, 45, 28, 39, 41, 38, 42, 38, 43, 38, 42, \r
+    28, 39, 41, 38, 42, 38, 43, 38, 43, 39, 41, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 39, 41, 38, 43, 38, 42, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 38, 43, 38, 43, 38, 43, \r
+    35, 46, 44, 44, 46, 44, 46, 44, 44, 46, 44, 44, 44, 46, 46, 44, 44, 44, \r
+    44, 46, 44, 44, 46, 44, 44, 44, 46, 46, 46, 44, 44, 46, 44, 38, 43, 44, \r
+    46, 44, 46, 44, 44, 46, 44, 46, 46, 44, 46, 44, 38, 43, 44, 44, 44, 46, \r
+    44, 46, 44, 44, 46, 46, 47, 44, 46, 46, 46, 47, 47, 47, 47, 48, 49, 35, \r
+    48, 49, 35, 48, 49, 35, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42, 38, 42, \r
+    38, 42, 38, 42, 46, 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 43, 48, 49, 35, 38, 43, 44, 44, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 44, \r
+    46, 44, 46, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 46, 46, 46, 46, 46, 46, 44, 44, 46, 44, 44, 46, 46, 44, 46, 44, 44, \r
+    44, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 41, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 41, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 47, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, \r
+    50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 52, 52, 52, 53, \r
+    53, 54, 53, 51, 55, 51, 55, 55, 55, 51, 55, 51, 51, 56, 52, 53, 53, 53, \r
+    53, 53, 53, 26, 26, 26, 26, 57, 26, 53, 54, 50, 50, 50, 50, 50, 53, 53, \r
+    53, 53, 53, 53, 53, 51, 53, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, \r
+    53, 53, 53, 53, 53, 53, 53, 58, 58, 58, 58, 58, 59, 58, 58, 58, 58, 58, \r
+    58, 58, 59, 59, 58, 59, 58, 59, 58, 58, 60, 61, 61, 61, 61, 60, 62, 61, \r
+    61, 61, 61, 61, 63, 63, 64, 64, 64, 64, 65, 65, 61, 61, 61, 61, 64, 64, \r
+    61, 64, 64, 61, 61, 66, 66, 66, 66, 67, 61, 61, 61, 61, 59, 59, 59, 68, \r
+    68, 58, 68, 68, 69, 59, 61, 61, 61, 59, 59, 59, 61, 61, 70, 59, 59, 59, \r
+    61, 61, 61, 61, 59, 60, 61, 61, 59, 71, 72, 72, 71, 72, 72, 71, 59, 59, \r
+    59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 44, 46, 44, 46, 73, 53, 44, \r
+    46, 0, 0, 50, 46, 46, 46, 74, 0, 0, 0, 0, 0, 57, 75, 38, 74, 38, 38, 38, \r
+    0, 38, 0, 38, 38, 43, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, \r
+    39, 39, 39, 39, 0, 39, 39, 39, 39, 39, 39, 39, 38, 38, 43, 43, 43, 43, \r
+    43, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, \r
+    46, 41, 41, 41, 41, 41, 41, 41, 43, 43, 43, 43, 43, 44, 35, 35, 48, 76, \r
+    76, 35, 35, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 35, 35, 35, 46, 48, 35, 77, 44, \r
+    46, 48, 44, 46, 46, 44, 44, 44, 38, 78, 44, 38, 44, 44, 44, 38, 44, 44, \r
+    44, 44, 38, 38, 38, 44, 39, 39, 39, 39, 39, 39, 39, 39, 39, 78, 39, 39, \r
+    39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, \r
+    39, 39, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41, 41, 41, 41, 41, 41, \r
+    41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 43, 42, \r
+    46, 43, 46, 46, 46, 43, 46, 46, 46, 46, 43, 43, 43, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 79, 80, 80, 80, 80, 80, \r
+    81, 81, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, \r
+    38, 43, 38, 43, 44, 46, 38, 43, 44, 46, 38, 43, 38, 43, 38, 43, 44, 46, \r
+    38, 43, 38, 43, 38, 43, 44, 46, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, \r
+    38, 43, 44, 46, 38, 43, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 0, 0, 52, 82, 82, 82, 82, 82, 82, 0, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 35, \r
+    0, 82, 83, 0, 0, 0, 0, 0, 0, 84, 80, 80, 80, 80, 84, 80, 80, 80, 85, 84, \r
+    80, 80, 80, 80, 80, 80, 84, 84, 84, 84, 84, 84, 80, 80, 84, 80, 80, 85, \r
+    86, 80, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 96, 97, 98, 99, 100, 101, \r
+    102, 103, 104, 102, 80, 84, 102, 95, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, \r
+    105, 105, 105, 102, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 106, 106, \r
+    106, 0, 0, 77, 77, 107, 108, 108, 109, 110, 111, 27, 27, 80, 80, 80, 80, \r
+    80, 80, 80, 80, 112, 113, 114, 111, 0, 0, 111, 111, 0, 115, 116, 116, \r
+    116, 116, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    117, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 118, 119, 120, \r
+    112, 113, 114, 121, 122, 123, 123, 124, 84, 80, 80, 80, 80, 80, 84, 80, \r
+    80, 0, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 108, 126, 126, \r
+    111, 115, 115, 127, 115, 115, 115, 115, 128, 128, 128, 128, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 116, \r
+    115, 116, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 116, 111, 115, 80, 80, 80, 80, 80, 80, 80, 106, 81, \r
+    80, 80, 80, 80, 84, 80, 117, 117, 80, 80, 27, 84, 80, 80, 84, 115, 115, \r
+    129, 129, 129, 129, 129, 129, 129, 129, 129, 129, 115, 115, 115, 130, \r
+    130, 115, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, 111, \r
+    111, 111, 0, 131, 115, 132, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 80, 84, 80, 80, 84, 80, 80, 84, 84, \r
+    84, 80, 84, 84, 80, 84, 80, 80, 80, 84, 80, 84, 80, 84, 80, 84, 80, 80, \r
+    0, 0, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, 115, \r
+    115, 115, 115, 115, 115, 115, 133, 133, 133, 133, 133, 133, 133, 133, \r
+    133, 133, 133, 115, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 134, 134, \r
+    134, 134, 134, 134, 134, 134, 134, 134, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 80, 80, \r
+    80, 80, 80, 80, 80, 84, 80, 135, 135, 27, 136, 136, 136, 135, 0, 0, 0, 0, \r
+    0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 80, 80, 80, 80, 135, 80, 80, 80, \r
+    80, 80, 80, 80, 80, 80, 135, 80, 80, 80, 135, 80, 80, 80, 80, 80, 0, 0, \r
+    102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, 102, \r
+    102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 133, 133, 133, 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 138, 47, 47, 47, 47, 47, 47, 47, 138, 47, 47, \r
+    138, 47, 47, 47, 47, 47, 0, 0, 139, 47, 137, 137, 137, 133, 133, 133, \r
+    133, 133, 133, 133, 133, 137, 137, 137, 137, 140, 137, 0, 47, 80, 84, 80, \r
+    80, 133, 0, 0, 141, 141, 141, 141, 141, 141, 141, 141, 47, 47, 133, 133, \r
+    82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 82, 52, 47, 0, \r
+    0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 133, 137, 137, 0, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, \r
+    47, 47, 47, 47, 47, 0, 47, 0, 0, 0, 47, 47, 47, 47, 0, 0, 143, 47, 144, \r
+    137, 137, 133, 133, 133, 133, 0, 0, 137, 137, 0, 0, 145, 145, 140, 47, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 141, 141, 0, 141, 47, 47, 133, 133, \r
+    0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 146, 146, \r
+    147, 147, 147, 147, 147, 147, 79, 146, 0, 0, 0, 0, 0, 133, 133, 137, 0, \r
+    47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 47, 141, 0, 47, 141, 0, 47, 47, 0, 0, 143, 0, \r
+    137, 137, 137, 133, 133, 0, 0, 0, 0, 133, 133, 0, 0, 133, 133, 140, 0, 0, \r
+    0, 133, 0, 0, 0, 0, 0, 0, 0, 141, 141, 141, 47, 0, 141, 0, 0, 0, 0, 0, 0, \r
+    0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 133, 133, 47, 47, \r
+    47, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, 137, 0, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, \r
+    47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 137, \r
+    137, 137, 133, 133, 133, 133, 133, 0, 133, 133, 137, 0, 137, 137, 140, 0, \r
+    0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, \r
+    0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 146, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 137, 137, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 0, 0, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 144, 133, 137, \r
+    133, 133, 133, 133, 0, 0, 137, 145, 0, 0, 145, 145, 140, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 148, 144, 0, 0, 0, 0, 141, 141, 0, 47, 47, 47, 133, 133, 0, 0, \r
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 79, 47, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 47, 0, 47, 47, 47, 47, 47, 47, 0, \r
+    0, 0, 47, 47, 47, 0, 47, 47, 138, 47, 0, 0, 0, 47, 47, 0, 47, 0, 47, 47, \r
+    0, 0, 0, 47, 47, 0, 0, 0, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 144, 137, 133, 137, 137, 0, 0, 0, \r
+    137, 137, 137, 0, 145, 145, 145, 140, 0, 0, 47, 0, 0, 0, 0, 0, 0, 144, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 147, 147, 147, 27, 27, 27, 27, 27, 27, 146, 27, 0, 0, 0, \r
+    0, 0, 0, 137, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, \r
+    47, 47, 47, 47, 0, 0, 0, 47, 133, 133, 133, 137, 137, 137, 137, 0, 133, \r
+    133, 149, 0, 133, 133, 133, 140, 0, 0, 0, 0, 0, 0, 0, 150, 151, 0, 47, \r
+    47, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, \r
+    152, 152, 79, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, \r
+    47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 0, 47, 47, 47, 47, 47, 0, 0, 143, 47, 137, 153, 145, 137, 144, 137, \r
+    137, 0, 153, 145, 145, 0, 145, 145, 133, 140, 0, 0, 0, 0, 0, 0, 0, 144, \r
+    144, 0, 0, 0, 0, 0, 0, 0, 47, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, \r
+    142, 142, 142, 142, 142, 142, 142, 0, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, \r
+    47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 144, 137, 137, 133, 133, 133, 133, \r
+    0, 137, 137, 137, 0, 145, 145, 145, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 144, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 133, 133, 0, 0, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 142, 142, 147, 147, 147, 147, 147, 147, 0, 0, 0, 79, 47, \r
+    47, 47, 47, 47, 47, 0, 0, 137, 137, 0, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 0, 0, 154, 0, 0, 0, 0, 144, 137, 137, 133, 133, 133, 0, 133, \r
+    0, 137, 137, 145, 137, 145, 145, 145, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 133, 47, 155, 133, 133, \r
+    133, 133, 156, 156, 140, 0, 0, 0, 0, 146, 47, 47, 47, 47, 47, 47, 52, \r
+    133, 157, 157, 157, 157, 133, 133, 133, 82, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 142, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, \r
+    0, 47, 0, 0, 47, 47, 0, 47, 0, 0, 47, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 0, 47, 0, 47, 0, 0, 47, 47, \r
+    0, 47, 47, 47, 47, 133, 47, 155, 133, 133, 133, 133, 158, 158, 0, 133, \r
+    133, 47, 0, 0, 47, 47, 47, 47, 47, 0, 52, 0, 159, 159, 159, 159, 133, \r
+    133, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 155, \r
+    155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 79, 79, 79, 82, 82, 82, 82, 82, 82, \r
+    82, 82, 160, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 84, 84, 79, 79, \r
+    79, 79, 79, 79, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 147, \r
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 79, 84, 79, 84, 79, 161, \r
+    162, 163, 162, 163, 137, 137, 47, 47, 47, 141, 47, 47, 47, 47, 0, 47, 47, \r
+    47, 47, 141, 47, 47, 47, 47, 141, 47, 47, 47, 47, 141, 47, 47, 47, 47, \r
+    141, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 141, 47, 47, 47, 0, \r
+    0, 0, 0, 164, 165, 166, 167, 166, 166, 168, 166, 168, 165, 165, 165, 165, \r
+    133, 137, 165, 166, 80, 80, 140, 82, 80, 80, 47, 47, 47, 47, 0, 0, 0, 0, \r
+    133, 133, 133, 166, 133, 133, 133, 133, 0, 133, 133, 133, 133, 166, 133, \r
+    133, 133, 133, 166, 133, 133, 133, 133, 166, 133, 133, 133, 133, 166, \r
+    133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 166, 133, \r
+    133, 133, 0, 79, 79, 79, 79, 79, 79, 79, 79, 84, 79, 79, 79, 79, 79, 79, \r
+    0, 79, 79, 82, 82, 82, 82, 82, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 138, 47, 47, 47, 47, 137, 137, 133, 148, 133, \r
+    133, 137, 133, 133, 133, 133, 133, 143, 137, 140, 140, 137, 137, 133, \r
+    133, 47, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 82, 82, 82, \r
+    82, 82, 82, 47, 47, 47, 47, 47, 47, 137, 137, 133, 133, 47, 47, 47, 47, \r
+    133, 133, 133, 47, 137, 137, 137, 47, 47, 137, 137, 137, 137, 137, 137, \r
+    137, 47, 47, 47, 133, 133, 133, 133, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 133, 137, 137, 133, 133, 137, 137, 137, 137, 137, 137, \r
+    84, 47, 137, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 137, 137, \r
+    137, 133, 79, 79, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 82, 50, 0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 47, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, \r
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, \r
+    170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, 170, \r
+    170, 170, 170, 170, 170, 170, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 169, 169, 169, 169, 169, 169, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, \r
+    47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, \r
+    0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, \r
+    47, 47, 47, 47, 0, 47, 0, 47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 0, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 80, \r
+    79, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147, 147, 147, 147, \r
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 0, 0, 0, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 171, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 162, 163, 0, 0, 0, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 82, 82, 82, 172, 172, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, \r
+    47, 133, 133, 140, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 133, 133, 140, 82, \r
+    82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, \r
+    0, 133, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 173, 173, 137, 133, 133, 133, \r
+    133, 133, 133, 133, 137, 137, 137, 137, 137, 137, 137, 137, 133, 137, \r
+    137, 133, 133, 133, 133, 133, 133, 133, 133, 133, 140, 133, 82, 82, 82, \r
+    52, 82, 82, 82, 146, 47, 80, 0, 0, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 0, 0, 0, 0, 0, 0, 152, 152, 152, 152, 152, 152, 152, 152, \r
+    152, 152, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 136, 136, 83, 136, 136, \r
+    136, 136, 133, 133, 133, 171, 0, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 52, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 86, 47, \r
+    0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 0, 0, 133, 133, 133, 137, 137, 137, 137, 133, 133, 137, 137, \r
+    137, 0, 0, 0, 0, 137, 137, 133, 137, 137, 137, 137, 137, 137, 85, 80, 84, \r
+    0, 0, 0, 0, 27, 0, 0, 0, 136, 136, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 47, \r
+    47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 0, 0, 0, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, \r
+    137, 137, 137, 137, 137, 137, 137, 47, 47, 47, 47, 47, 47, 47, 137, 137, \r
+    0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    0, 0, 0, 136, 136, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 80, 84, 137, 137, 137, 0, 0, 82, 82, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 133, 137, \r
+    133, 133, 133, 133, 133, 133, 133, 0, 140, 137, 133, 137, 137, 133, 133, \r
+    133, 133, 133, 133, 133, 133, 137, 137, 137, 137, 137, 137, 133, 133, 80, \r
+    80, 80, 80, 80, 80, 80, 80, 0, 0, 84, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 0, 0, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 0, 0, 0, 0, 0, 0, 82, 82, 82, 82, 82, 82, 82, 52, 82, 82, 82, \r
+    82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 133, 133, 133, 133, 137, 47, \r
+    138, 47, 138, 47, 138, 47, 138, 47, 138, 47, 47, 47, 138, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 143, 144, 133, 133, 133, 133, \r
+    133, 145, 133, 145, 137, 137, 145, 145, 133, 145, 174, 47, 47, 47, 47, \r
+    47, 47, 47, 0, 0, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    82, 82, 82, 82, 82, 82, 82, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 80, \r
+    84, 80, 80, 80, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, \r
+    0, 133, 133, 137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 133, \r
+    133, 133, 133, 137, 137, 133, 133, 174, 0, 0, 0, 47, 47, 142, 142, 142, \r
+    142, 142, 142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 137, 137, 137, 137, 137, 137, 137, 137, 133, \r
+    133, 133, 133, 133, 133, 133, 133, 137, 137, 133, 143, 0, 0, 0, 82, 82, \r
+    82, 82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 0, \r
+    47, 47, 47, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 52, 52, 52, 52, 52, 82, 82, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 80, 80, 80, 82, 175, 84, 84, 84, 84, 84, 80, 80, 84, \r
+    84, 84, 84, 80, 137, 175, 175, 175, 175, 175, 175, 175, 47, 47, 47, 47, \r
+    84, 47, 47, 47, 47, 137, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, \r
+    50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, \r
+    50, 50, 50, 50, 52, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, \r
+    50, 50, 50, 50, 50, 50, 35, 35, 35, 35, 35, 35, 35, 35, 35, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 50, 50, 50, 50, 50, 50, 50, 50, 50, \r
+    50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, \r
+    50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 80, 80, 84, 80, 80, 80, 80, 80, \r
+    80, 80, 84, 80, 80, 176, 177, 84, 178, 80, 80, 80, 80, 80, 80, 80, 80, \r
+    80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 84, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 43, 43, 43, 43, 35, 179, 46, 46, 44, 46, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, \r
+    43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 38, 43, 44, 46, 44, 46, 44, \r
+    46, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, \r
+    43, 43, 43, 43, 43, 0, 0, 38, 38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, \r
+    43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, \r
+    43, 43, 38, 38, 38, 38, 38, 38, 38, 38, 43, 43, 43, 43, 43, 43, 0, 0, 38, \r
+    38, 38, 38, 38, 38, 0, 0, 43, 43, 43, 43, 43, 43, 43, 43, 0, 38, 0, 38, \r
+    0, 38, 0, 38, 43, 43, 43, 43, 43, 43, 43, 43, 38, 38, 38, 38, 38, 38, 38, \r
+    38, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 43, 180, 0, 0, \r
+    43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, \r
+    43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, \r
+    43, 43, 43, 43, 43, 43, 43, 43, 181, 181, 181, 181, 181, 181, 181, 181, \r
+    43, 43, 43, 43, 43, 0, 43, 43, 38, 38, 38, 182, 181, 57, 180, 57, 57, 75, \r
+    43, 43, 43, 0, 43, 43, 38, 182, 38, 182, 181, 75, 75, 75, 43, 43, 43, \r
+    180, 0, 0, 43, 43, 38, 38, 38, 182, 0, 75, 75, 75, 43, 43, 43, 180, 43, \r
+    43, 43, 43, 38, 38, 38, 182, 38, 75, 183, 183, 0, 0, 43, 43, 43, 0, 43, \r
+    43, 38, 182, 38, 182, 181, 183, 57, 0, 184, 184, 185, 185, 185, 185, 185, \r
+    185, 185, 185, 185, 131, 131, 131, 173, 186, 187, 188, 83, 187, 187, 187, \r
+    22, 189, 190, 191, 192, 193, 190, 191, 192, 193, 22, 22, 22, 136, 194, \r
+    194, 194, 22, 195, 196, 197, 198, 199, 200, 201, 21, 202, 108, 202, 203, \r
+    204, 22, 189, 189, 136, 29, 36, 22, 189, 136, 194, 205, 205, 136, 136, \r
+    136, 206, 162, 163, 189, 189, 189, 136, 136, 136, 136, 136, 136, 136, \r
+    136, 77, 136, 205, 136, 136, 189, 136, 136, 136, 136, 136, 136, 136, 185, \r
+    131, 131, 131, 131, 131, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, \r
+    207, 50, 0, 0, 34, 207, 207, 207, 207, 207, 208, 208, 209, 210, 211, 212, \r
+    207, 34, 34, 34, 34, 207, 207, 207, 207, 207, 208, 208, 209, 210, 211, 0, \r
+    50, 50, 50, 50, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 146, 146, 146, 146, \r
+    146, 146, 146, 146, 213, 214, 146, 146, 23, 146, 146, 146, 146, 146, 146, \r
+    146, 146, 146, 146, 146, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 175, 175, 80, 80, 80, 80, 175, 175, \r
+    175, 80, 80, 81, 81, 81, 81, 80, 81, 81, 81, 175, 175, 80, 84, 80, 175, \r
+    175, 84, 84, 84, 84, 80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    215, 215, 48, 216, 27, 216, 215, 48, 27, 216, 35, 48, 48, 48, 35, 35, 48, \r
+    48, 48, 28, 27, 48, 216, 27, 27, 48, 48, 48, 48, 48, 27, 27, 215, 216, \r
+    216, 27, 48, 27, 217, 27, 48, 27, 182, 217, 48, 48, 218, 35, 48, 48, 44, \r
+    48, 35, 155, 155, 155, 155, 35, 27, 215, 35, 35, 48, 48, 219, 77, 77, 77, \r
+    77, 48, 35, 35, 35, 35, 27, 77, 27, 27, 46, 79, 220, 220, 220, 37, 37, \r
+    220, 220, 220, 220, 220, 220, 37, 37, 37, 37, 220, 221, 221, 221, 221, \r
+    221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 221, 221, \r
+    221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, \r
+    172, 172, 172, 44, 46, 172, 172, 172, 172, 37, 0, 0, 0, 0, 0, 0, 40, 40, \r
+    40, 40, 40, 25, 25, 25, 25, 25, 223, 223, 27, 27, 27, 27, 77, 27, 27, 77, \r
+    27, 27, 77, 27, 27, 27, 27, 27, 27, 27, 223, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 224, 223, 223, 27, 27, 40, 27, 40, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 40, 225, 226, 226, 227, 77, 77, 40, 226, 227, 225, 226, 227, \r
+    225, 77, 40, 77, 226, 228, 229, 77, 226, 225, 77, 77, 77, 226, 225, 225, \r
+    226, 40, 226, 226, 225, 225, 40, 227, 40, 227, 40, 40, 40, 40, 226, 230, \r
+    219, 226, 219, 219, 225, 225, 225, 40, 40, 40, 40, 77, 225, 77, 225, 226, \r
+    226, 225, 225, 225, 227, 225, 225, 227, 225, 225, 227, 226, 227, 225, \r
+    225, 226, 77, 77, 77, 77, 77, 226, 225, 225, 225, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 225, 231, 40, 227, 77, 226, 226, 226, 226, 225, 225, 226, \r
+    226, 77, 223, 231, 231, 227, 227, 225, 225, 227, 227, 225, 225, 227, 227, \r
+    225, 225, 225, 225, 225, 225, 227, 227, 226, 226, 227, 227, 226, 226, \r
+    227, 227, 225, 225, 225, 77, 77, 225, 225, 225, 225, 77, 77, 40, 77, 77, \r
+    225, 40, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, 40, 225, 225, 225, \r
+    225, 225, 225, 227, 227, 227, 227, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 77, 77, 77, 77, 77, 225, 226, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 225, 225, 225, 225, 225, 77, 77, 225, 225, 77, 77, 77, 77, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 227, 227, 227, 227, 225, 225, \r
+    225, 225, 225, 225, 227, 227, 227, 227, 77, 77, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 225, 225, 225, 225, 27, 27, 27, 27, 27, 27, 25, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 225, 225, 27, 27, 27, 27, 27, \r
+    27, 27, 232, 233, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 27, 77, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 79, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 77, 77, 77, 77, 77, 77, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, \r
+    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, \r
+    37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 34, 34, 34, 34, 34, 34, 34, \r
+    34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 220, 235, 235, 235, 235, 235, 235, 235, 235, 235, \r
+    235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 27, 27, 27, 27, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 27, 27, 25, \r
+    25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, \r
+    25, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, \r
+    40, 27, 27, 27, 27, 25, 25, 27, 27, 25, 40, 27, 27, 27, 27, 25, 25, 25, \r
+    27, 27, 25, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 25, 25, 25, 25, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 25, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 27, 27, 27, 27, 27, 25, 25, 27, 27, 25, 27, 27, 27, 27, 25, 25, 27, \r
+    27, 27, 27, 25, 25, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 25, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 25, 25, 25, 27, 25, 25, 25, 25, \r
+    27, 25, 25, 27, 40, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 79, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 25, 27, 27, 27, 27, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 0, 25, 0, 0, 0, 0, 25, 25, \r
+    25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, \r
+    25, 25, 25, 25, 0, 27, 27, 27, 27, 0, 27, 27, 27, 27, 0, 0, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 25, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 0, 27, 0, 27, 27, 27, 27, 0, 0, 0, 27, 25, \r
+    27, 27, 27, 27, 27, 27, 27, 0, 0, 27, 27, 27, 27, 27, 27, 27, 162, 163, \r
+    162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 235, 235, \r
+    235, 235, 235, 235, 235, 235, 235, 235, 152, 152, 152, 152, 152, 152, \r
+    152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 152, 27, \r
+    0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 0, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 0, 225, 77, 77, 225, 225, 162, 163, 77, 225, 225, 77, \r
+    0, 225, 0, 0, 0, 77, 77, 77, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, \r
+    225, 225, 77, 77, 77, 225, 225, 225, 225, 9, 10, 9, 10, 9, 10, 9, 10, \r
+    162, 163, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 162, 163, 9, 10, 162, 163, 162, 163, 162, \r
+    163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 162, 163, 77, 77, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 77, 77, 77, 225, \r
+    77, 77, 77, 77, 77, 77, 77, 225, 225, 225, 225, 225, 225, 77, 77, 77, \r
+    225, 77, 77, 77, 77, 225, 225, 225, 225, 225, 77, 225, 225, 77, 77, 162, \r
+    163, 162, 163, 225, 77, 77, 77, 77, 225, 77, 225, 225, 225, 77, 77, 225, \r
+    225, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 225, 225, 225, \r
+    225, 77, 77, 162, 163, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    225, 225, 219, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 77, 225, 225, 225, 225, 77, 77, 225, 77, 225, \r
+    77, 77, 225, 77, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, 225, 77, \r
+    77, 77, 77, 77, 77, 225, 225, 225, 77, 77, 77, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 225, 225, 77, 77, 77, 77, 225, \r
+    225, 225, 225, 77, 225, 225, 77, 77, 225, 219, 209, 209, 77, 77, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 77, \r
+    77, 225, 225, 225, 225, 225, 225, 225, 225, 77, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, 225, \r
+    225, 225, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 236, 77, 225, 77, \r
+    77, 77, 225, 225, 225, 225, 225, 77, 77, 77, 77, 77, 225, 225, 225, 77, \r
+    77, 77, 77, 225, 77, 77, 77, 225, 225, 225, 225, 225, 77, 225, 77, 77, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 77, 77, 77, 77, 77, 77, \r
+    77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 27, 27, 77, \r
+    77, 77, 77, 77, 77, 0, 0, 0, 27, 27, 27, 27, 27, 25, 25, 25, 25, 25, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 0, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 44, 46, \r
+    44, 44, 44, 46, 46, 44, 46, 44, 46, 44, 46, 44, 44, 44, 44, 46, 44, 46, \r
+    46, 44, 46, 46, 46, 46, 46, 46, 35, 50, 44, 44, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 46, 27, 27, 27, 27, 27, 27, 44, 46, 44, 46, 80, 80, 80, \r
+    0, 0, 0, 0, 0, 0, 0, 136, 136, 136, 136, 152, 136, 136, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, \r
+    47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 0, \r
+    47, 47, 47, 47, 47, 47, 47, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, \r
+    80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, \r
+    80, 80, 80, 80, 136, 136, 29, 36, 29, 36, 136, 136, 136, 29, 36, 136, 29, \r
+    36, 136, 136, 136, 136, 136, 136, 136, 136, 136, 83, 136, 136, 83, 136, \r
+    29, 36, 136, 136, 29, 36, 162, 163, 162, 163, 162, 163, 162, 163, 136, \r
+    136, 136, 136, 136, 51, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 0, 237, 237, 237, 237, 238, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, 238, \r
+    238, 238, 238, 238, 238, 238, 238, 238, 238, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 0, 0, 0, 0, 239, 240, 240, 240, \r
+    237, 241, 169, 242, 243, 244, 243, 244, 243, 244, 243, 244, 243, 244, \r
+    237, 237, 243, 244, 243, 244, 243, 244, 243, 244, 245, 246, 247, 247, \r
+    237, 242, 242, 242, 242, 242, 242, 242, 242, 242, 248, 249, 250, 251, \r
+    252, 252, 245, 241, 241, 241, 241, 241, 238, 237, 253, 253, 253, 241, \r
+    169, 240, 237, 27, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, \r
+    169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 169, 254, 169, \r
+    254, 169, 254, 169, 169, 169, 169, 169, 169, 254, 254, 169, 254, 254, \r
+    169, 254, 254, 169, 254, 254, 169, 254, 254, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 254, 169, 169, 0, 0, 255, 255, 256, 256, 241, 257, 258, \r
+    245, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 254, 169, \r
+    254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, 254, 169, \r
+    254, 169, 254, 169, 254, 169, 254, 169, 169, 254, 169, 254, 169, 254, \r
+    169, 169, 169, 169, 169, 169, 254, 254, 169, 254, 254, 169, 254, 254, \r
+    169, 254, 254, 169, 254, 254, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    254, 169, 169, 254, 254, 254, 254, 240, 241, 241, 257, 258, 0, 0, 0, 0, \r
+    0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 258, \r
+    258, 258, 258, 258, 258, 258, 258, 258, 258, 258, 0, 259, 259, 260, 260, \r
+    260, 260, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 238, 238, 0, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 262, 262, 262, 262, 262, 262, 262, 262, 238, 263, 263, 263, \r
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 238, 238, \r
+    238, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 263, 263, 263, 263, 263, \r
+    263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 238, 238, 238, 238, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 238, 238, 238, 238, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 238, 238, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 238, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 241, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 0, 0, 0, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, \r
+    237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 52, 52, 52, 52, 52, \r
+    82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 52, 136, 136, \r
+    136, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 142, \r
+    142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 0, 0, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, \r
+    46, 47, 80, 81, 81, 81, 136, 0, 0, 0, 0, 0, 0, 0, 0, 80, 80, 136, 51, 44, \r
+    46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, \r
+    46, 44, 46, 44, 46, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 80, 80, 82, 82, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, \r
+    53, 53, 53, 53, 53, 51, 51, 51, 51, 51, 51, 51, 51, 51, 53, 53, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 46, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 44, 46, \r
+    44, 46, 44, 46, 50, 46, 46, 46, 46, 46, 46, 46, 46, 44, 46, 44, 46, 44, \r
+    44, 46, 44, 46, 44, 46, 44, 46, 44, 46, 51, 264, 264, 44, 46, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 133, 47, 47, \r
+    47, 140, 47, 47, 47, 47, 133, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 137, 133, 133, 137, \r
+    27, 27, 27, 27, 0, 0, 0, 0, 147, 147, 147, 147, 147, 147, 79, 79, 146, \r
+    218, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 136, 136, 136, 136, 0, 0, 0, 0, 0, 0, 0, 0, 137, 137, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 137, 137, 137, \r
+    137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 137, 140, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 82, 82, 142, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, \r
+    80, 80, 80, 80, 80, 80, 47, 47, 47, 47, 47, 47, 82, 82, 82, 47, 0, 0, 0, \r
+    0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 133, 133, 133, 133, 133, 84, 84, 84, 82, 82, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 133, 137, \r
+    174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 133, 133, 133, 137, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 143, 137, 137, 133, 133, 133, \r
+    133, 137, 137, 133, 137, 137, 137, 174, 82, 82, 82, 82, 82, 82, 82, 82, \r
+    82, 82, 82, 82, 82, 0, 52, 142, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 0, 0, 0, 0, 82, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 133, \r
+    133, 133, 133, 133, 133, 137, 137, 133, 133, 137, 137, 133, 133, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 47, 47, 47, 133, 47, 47, 47, 47, 47, 47, 47, 47, 133, \r
+    137, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, 142, 142, 0, 0, 82, \r
+    82, 82, 82, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 52, 47, 47, 47, 47, 47, 47, 79, 79, 79, 47, 137, 0, 0, 0, 0, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 80, 47, 80, 80, 84, 47, 47, 80, \r
+    80, 47, 47, 47, 47, 47, 80, 80, 47, 80, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 52, 82, 82, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 137, 137, 133, \r
+    137, 137, 133, 137, 137, 82, 137, 140, 0, 0, 142, 142, 142, 142, 142, \r
+    142, 142, 142, 142, 142, 0, 0, 0, 0, 0, 0, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, 254, \r
+    254, 254, 254, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 0, 0, 0, 0, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, \r
+    265, 265, 265, 265, 265, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 169, 169, 267, 169, 267, \r
+    169, 169, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 169, 267, \r
+    169, 267, 169, 169, 267, 267, 169, 169, 169, 267, 267, 267, 267, 0, 0, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 0, 0, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 35, 35, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35, 35, 35, 35, 35, 0, 0, 0, 0, 0, \r
+    268, 269, 268, 270, 270, 270, 270, 270, 270, 270, 270, 270, 208, 268, \r
+    268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 268, 0, 268, 268, \r
+    268, 268, 268, 0, 268, 0, 268, 268, 0, 268, 268, 0, 268, 268, 268, 268, \r
+    268, 268, 268, 268, 268, 270, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 192, 271, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 272, 27, 0, 0, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 273, 273, 273, 273, 273, 273, 273, 274, 275, \r
+    273, 0, 0, 0, 0, 0, 0, 80, 80, 80, 80, 80, 80, 80, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 273, 276, 276, 277, 277, 274, 275, 274, 275, 274, 275, 274, 275, \r
+    274, 275, 274, 275, 274, 275, 274, 275, 240, 240, 274, 275, 273, 273, \r
+    273, 273, 277, 277, 277, 278, 273, 278, 0, 273, 278, 273, 273, 276, 279, \r
+    280, 279, 280, 279, 280, 281, 273, 273, 282, 283, 284, 284, 285, 0, 273, \r
+    286, 281, 273, 0, 0, 0, 0, 128, 128, 128, 115, 128, 0, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, \r
+    128, 128, 128, 128, 128, 128, 0, 0, 131, 0, 287, 287, 288, 289, 288, 287, \r
+    287, 290, 291, 287, 292, 293, 294, 293, 293, 295, 295, 295, 295, 295, \r
+    295, 295, 295, 295, 295, 293, 287, 296, 297, 296, 287, 287, 298, 298, \r
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 298, \r
+    298, 298, 298, 298, 298, 298, 298, 298, 298, 298, 290, 287, 291, 299, \r
+    300, 299, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, \r
+    301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, 301, \r
+    290, 297, 291, 297, 290, 291, 302, 303, 304, 302, 302, 305, 305, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 306, 305, 305, 305, 305, 305, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 306, 306, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, \r
+    305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, \r
+    305, 305, 0, 0, 0, 305, 305, 305, 305, 305, 305, 0, 0, 305, 305, 305, \r
+    305, 305, 305, 0, 0, 305, 305, 305, 305, 305, 305, 0, 0, 305, 305, 305, \r
+    0, 0, 0, 289, 289, 297, 299, 307, 289, 289, 0, 308, 309, 309, 309, 309, \r
+    308, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 310, 310, 310, 27, 25, 0, 0, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 0, 47, 47, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 82, 136, 79, 0, 0, 0, 0, 147, 147, \r
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, \r
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, \r
+    147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, \r
+    147, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, 311, 311, 311, 311, \r
+    311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, \r
+    311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, \r
+    311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, 311, \r
+    311, 311, 311, 311, 311, 311, 311, 152, 152, 152, 152, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 152, 0, 0, 0, 0, 0, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 84, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 147, 147, 147, 147, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 172, 47, 47, 47, 47, 47, 47, 47, 47, 172, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 82, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, \r
+    0, 47, 47, 47, 47, 47, 47, 47, 47, 82, 172, 172, 172, 172, 172, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, \r
+    46, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 0, 0, 142, 142, 142, 142, 142, 142, 142, 142, \r
+    142, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, \r
+    105, 105, 0, 0, 105, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 0, 105, 105, 0, 0, 0, 105, 0, 0, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 0, 102, 312, 312, 312, 312, 312, 312, \r
+    312, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    312, 312, 312, 312, 312, 312, 0, 0, 0, 136, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 105, 133, 133, 133, 0, 133, 133, 0, 0, 0, 0, 0, \r
+    133, 84, 133, 80, 105, 105, 105, 105, 0, 105, 105, 105, 0, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 0, 0, 0, 0, 80, 175, \r
+    84, 0, 0, 0, 0, 140, 312, 312, 312, 312, 312, 312, 312, 312, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 102, 102, 102, 102, 102, 102, 102, 102, 102, 0, 0, 0, 0, 0, \r
+    0, 0, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 312, 312, 102, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 0, 0, 0, 136, 136, 136, 136, 136, 136, 136, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 0, 0, 312, 312, 312, 312, 312, 312, 312, 312, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 312, 312, 312, 312, 312, 312, \r
+    312, 312, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, 105, \r
+    105, 105, 105, 105, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 313, 313, 313, 313, \r
+    313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, \r
+    313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, 0, 133, 133, \r
+    137, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 138, 47, 138, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 138, 47, 47, 47, 47, 137, 137, 137, 133, 133, 133, \r
+    133, 137, 137, 140, 139, 82, 82, 173, 82, 82, 82, 82, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, 172, \r
+    172, 172, 172, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 82, 82, 82, \r
+    82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, \r
+    47, 47, 47, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 314, 314, 314, 314, 314, \r
+    314, 314, 315, 315, 175, 175, 175, 79, 79, 79, 316, 315, 315, 315, 315, \r
+    315, 131, 131, 131, 131, 131, 131, 131, 131, 84, 84, 84, 84, 84, 84, 84, \r
+    84, 79, 79, 80, 80, 80, 80, 80, 84, 84, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 80, 80, 80, 80, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 314, 314, 314, 314, 314, 314, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, 79, \r
+    79, 79, 79, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 80, 80, 80, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, \r
+    147, 147, 147, 147, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 0, 48, 48, 0, 0, 48, 0, 0, 48, \r
+    48, 0, 0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, \r
+    35, 0, 35, 0, 35, 35, 35, 35, 35, 35, 35, 0, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 48, 48, 0, 48, 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    0, 48, 48, 48, 48, 48, 48, 48, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, \r
+    0, 48, 48, 48, 48, 0, 48, 48, 48, 48, 48, 0, 48, 0, 0, 0, 48, 48, 48, 48, \r
+    48, 48, 48, 0, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 0, 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 317, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    219, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 317, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 219, 35, 35, 35, 35, 35, 35, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    317, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 219, 35, 35, 35, 35, 35, 35, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 317, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 219, 35, 35, 35, 35, 35, \r
+    35, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 317, 35, 35, 35, 35, 35, 35, 35, 35, 35, \r
+    35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 219, 35, \r
+    35, 35, 35, 35, 35, 48, 35, 0, 0, 318, 318, 318, 318, 318, 318, 318, 318, \r
+    318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, \r
+    318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, \r
+    318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, \r
+    27, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, 34, 34, 34, 34, \r
+    34, 34, 34, 0, 0, 0, 0, 0, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, 234, \r
+    234, 234, 234, 234, 234, 234, 234, 319, 0, 0, 234, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 234, 0, 234, 0, 0, 234, 0, 0, 0, 234, 0, 0, 0, 234, 234, 234, \r
+    234, 234, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, \r
+    262, 262, 0, 0, 262, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 262, 262, 262, 0, \r
+    0, 234, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, \r
+    261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 261, 261, 261, 261, 261, 261, 261, 261, 261, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, \r
+    169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 169, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, 267, \r
+    267, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, 131, \r
+    131, 131, 131, 131, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, \r
+    70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, \r
+    266, 266, 266, 0, 0, \r
+};\r
+\r
+/* decomposition data */\r
+static unsigned int decomp_data[] = {\r
+    0, 257, 32, 514, 32, 776, 259, 97, 514, 32, 772, 259, 50, 259, 51, 514, \r
+    32, 769, 258, 956, 514, 32, 807, 259, 49, 259, 111, 772, 49, 8260, 52, \r
+    772, 49, 8260, 50, 772, 51, 8260, 52, 512, 65, 768, 512, 65, 769, 512, \r
+    65, 770, 512, 65, 771, 512, 65, 776, 512, 65, 778, 512, 67, 807, 512, 69, \r
+    768, 512, 69, 769, 512, 69, 770, 512, 69, 776, 512, 73, 768, 512, 73, \r
+    769, 512, 73, 770, 512, 73, 776, 512, 78, 771, 512, 79, 768, 512, 79, \r
+    769, 512, 79, 770, 512, 79, 771, 512, 79, 776, 512, 85, 768, 512, 85, \r
+    769, 512, 85, 770, 512, 85, 776, 512, 89, 769, 512, 97, 768, 512, 97, \r
+    769, 512, 97, 770, 512, 97, 771, 512, 97, 776, 512, 97, 778, 512, 99, \r
+    807, 512, 101, 768, 512, 101, 769, 512, 101, 770, 512, 101, 776, 512, \r
+    105, 768, 512, 105, 769, 512, 105, 770, 512, 105, 776, 512, 110, 771, \r
+    512, 111, 768, 512, 111, 769, 512, 111, 770, 512, 111, 771, 512, 111, \r
+    776, 512, 117, 768, 512, 117, 769, 512, 117, 770, 512, 117, 776, 512, \r
+    121, 769, 512, 121, 776, 512, 65, 772, 512, 97, 772, 512, 65, 774, 512, \r
+    97, 774, 512, 65, 808, 512, 97, 808, 512, 67, 769, 512, 99, 769, 512, 67, \r
+    770, 512, 99, 770, 512, 67, 775, 512, 99, 775, 512, 67, 780, 512, 99, \r
+    780, 512, 68, 780, 512, 100, 780, 512, 69, 772, 512, 101, 772, 512, 69, \r
+    774, 512, 101, 774, 512, 69, 775, 512, 101, 775, 512, 69, 808, 512, 101, \r
+    808, 512, 69, 780, 512, 101, 780, 512, 71, 770, 512, 103, 770, 512, 71, \r
+    774, 512, 103, 774, 512, 71, 775, 512, 103, 775, 512, 71, 807, 512, 103, \r
+    807, 512, 72, 770, 512, 104, 770, 512, 73, 771, 512, 105, 771, 512, 73, \r
+    772, 512, 105, 772, 512, 73, 774, 512, 105, 774, 512, 73, 808, 512, 105, \r
+    808, 512, 73, 775, 514, 73, 74, 514, 105, 106, 512, 74, 770, 512, 106, \r
+    770, 512, 75, 807, 512, 107, 807, 512, 76, 769, 512, 108, 769, 512, 76, \r
+    807, 512, 108, 807, 512, 76, 780, 512, 108, 780, 514, 76, 183, 514, 108, \r
+    183, 512, 78, 769, 512, 110, 769, 512, 78, 807, 512, 110, 807, 512, 78, \r
+    780, 512, 110, 780, 514, 700, 110, 512, 79, 772, 512, 111, 772, 512, 79, \r
+    774, 512, 111, 774, 512, 79, 779, 512, 111, 779, 512, 82, 769, 512, 114, \r
+    769, 512, 82, 807, 512, 114, 807, 512, 82, 780, 512, 114, 780, 512, 83, \r
+    769, 512, 115, 769, 512, 83, 770, 512, 115, 770, 512, 83, 807, 512, 115, \r
+    807, 512, 83, 780, 512, 115, 780, 512, 84, 807, 512, 116, 807, 512, 84, \r
+    780, 512, 116, 780, 512, 85, 771, 512, 117, 771, 512, 85, 772, 512, 117, \r
+    772, 512, 85, 774, 512, 117, 774, 512, 85, 778, 512, 117, 778, 512, 85, \r
+    779, 512, 117, 779, 512, 85, 808, 512, 117, 808, 512, 87, 770, 512, 119, \r
+    770, 512, 89, 770, 512, 121, 770, 512, 89, 776, 512, 90, 769, 512, 122, \r
+    769, 512, 90, 775, 512, 122, 775, 512, 90, 780, 512, 122, 780, 258, 115, \r
+    512, 79, 795, 512, 111, 795, 512, 85, 795, 512, 117, 795, 514, 68, 381, \r
+    514, 68, 382, 514, 100, 382, 514, 76, 74, 514, 76, 106, 514, 108, 106, \r
+    514, 78, 74, 514, 78, 106, 514, 110, 106, 512, 65, 780, 512, 97, 780, \r
+    512, 73, 780, 512, 105, 780, 512, 79, 780, 512, 111, 780, 512, 85, 780, \r
+    512, 117, 780, 512, 220, 772, 512, 252, 772, 512, 220, 769, 512, 252, \r
+    769, 512, 220, 780, 512, 252, 780, 512, 220, 768, 512, 252, 768, 512, \r
+    196, 772, 512, 228, 772, 512, 550, 772, 512, 551, 772, 512, 198, 772, \r
+    512, 230, 772, 512, 71, 780, 512, 103, 780, 512, 75, 780, 512, 107, 780, \r
+    512, 79, 808, 512, 111, 808, 512, 490, 772, 512, 491, 772, 512, 439, 780, \r
+    512, 658, 780, 512, 106, 780, 514, 68, 90, 514, 68, 122, 514, 100, 122, \r
+    512, 71, 769, 512, 103, 769, 512, 78, 768, 512, 110, 768, 512, 197, 769, \r
+    512, 229, 769, 512, 198, 769, 512, 230, 769, 512, 216, 769, 512, 248, \r
+    769, 512, 65, 783, 512, 97, 783, 512, 65, 785, 512, 97, 785, 512, 69, \r
+    783, 512, 101, 783, 512, 69, 785, 512, 101, 785, 512, 73, 783, 512, 105, \r
+    783, 512, 73, 785, 512, 105, 785, 512, 79, 783, 512, 111, 783, 512, 79, \r
+    785, 512, 111, 785, 512, 82, 783, 512, 114, 783, 512, 82, 785, 512, 114, \r
+    785, 512, 85, 783, 512, 117, 783, 512, 85, 785, 512, 117, 785, 512, 83, \r
+    806, 512, 115, 806, 512, 84, 806, 512, 116, 806, 512, 72, 780, 512, 104, \r
+    780, 512, 65, 775, 512, 97, 775, 512, 69, 807, 512, 101, 807, 512, 214, \r
+    772, 512, 246, 772, 512, 213, 772, 512, 245, 772, 512, 79, 775, 512, 111, \r
+    775, 512, 558, 772, 512, 559, 772, 512, 89, 772, 512, 121, 772, 259, 104, \r
+    259, 614, 259, 106, 259, 114, 259, 633, 259, 635, 259, 641, 259, 119, \r
+    259, 121, 514, 32, 774, 514, 32, 775, 514, 32, 778, 514, 32, 808, 514, \r
+    32, 771, 514, 32, 779, 259, 611, 259, 108, 259, 115, 259, 120, 259, 661, \r
+    256, 768, 256, 769, 256, 787, 512, 776, 769, 256, 697, 514, 32, 837, 256, \r
+    59, 514, 32, 769, 512, 168, 769, 512, 913, 769, 256, 183, 512, 917, 769, \r
+    512, 919, 769, 512, 921, 769, 512, 927, 769, 512, 933, 769, 512, 937, \r
+    769, 512, 970, 769, 512, 921, 776, 512, 933, 776, 512, 945, 769, 512, \r
+    949, 769, 512, 951, 769, 512, 953, 769, 512, 971, 769, 512, 953, 776, \r
+    512, 965, 776, 512, 959, 769, 512, 965, 769, 512, 969, 769, 258, 946, \r
+    258, 952, 258, 933, 512, 978, 769, 512, 978, 776, 258, 966, 258, 960, \r
+    258, 954, 258, 961, 258, 962, 258, 920, 258, 949, 258, 931, 512, 1045, \r
+    768, 512, 1045, 776, 512, 1043, 769, 512, 1030, 776, 512, 1050, 769, 512, \r
+    1048, 768, 512, 1059, 774, 512, 1048, 774, 512, 1080, 774, 512, 1077, \r
+    768, 512, 1077, 776, 512, 1075, 769, 512, 1110, 776, 512, 1082, 769, 512, \r
+    1080, 768, 512, 1091, 774, 512, 1140, 783, 512, 1141, 783, 512, 1046, \r
+    774, 512, 1078, 774, 512, 1040, 774, 512, 1072, 774, 512, 1040, 776, 512, \r
+    1072, 776, 512, 1045, 774, 512, 1077, 774, 512, 1240, 776, 512, 1241, \r
+    776, 512, 1046, 776, 512, 1078, 776, 512, 1047, 776, 512, 1079, 776, 512, \r
+    1048, 772, 512, 1080, 772, 512, 1048, 776, 512, 1080, 776, 512, 1054, \r
+    776, 512, 1086, 776, 512, 1256, 776, 512, 1257, 776, 512, 1069, 776, 512, \r
+    1101, 776, 512, 1059, 772, 512, 1091, 772, 512, 1059, 776, 512, 1091, \r
+    776, 512, 1059, 779, 512, 1091, 779, 512, 1063, 776, 512, 1095, 776, 512, \r
+    1067, 776, 512, 1099, 776, 514, 1381, 1410, 512, 1575, 1619, 512, 1575, \r
+    1620, 512, 1608, 1620, 512, 1575, 1621, 512, 1610, 1620, 514, 1575, 1652, \r
+    514, 1608, 1652, 514, 1735, 1652, 514, 1610, 1652, 512, 1749, 1620, 512, \r
+    1729, 1620, 512, 1746, 1620, 512, 2344, 2364, 512, 2352, 2364, 512, 2355, \r
+    2364, 512, 2325, 2364, 512, 2326, 2364, 512, 2327, 2364, 512, 2332, 2364, \r
+    512, 2337, 2364, 512, 2338, 2364, 512, 2347, 2364, 512, 2351, 2364, 512, \r
+    2503, 2494, 512, 2503, 2519, 512, 2465, 2492, 512, 2466, 2492, 512, 2479, \r
+    2492, 512, 2610, 2620, 512, 2616, 2620, 512, 2582, 2620, 512, 2583, 2620, \r
+    512, 2588, 2620, 512, 2603, 2620, 512, 2887, 2902, 512, 2887, 2878, 512, \r
+    2887, 2903, 512, 2849, 2876, 512, 2850, 2876, 512, 2962, 3031, 512, 3014, \r
+    3006, 512, 3015, 3006, 512, 3014, 3031, 512, 3142, 3158, 512, 3263, 3285, \r
+    512, 3270, 3285, 512, 3270, 3286, 512, 3270, 3266, 512, 3274, 3285, 512, \r
+    3398, 3390, 512, 3399, 3390, 512, 3398, 3415, 512, 3545, 3530, 512, 3545, \r
+    3535, 512, 3548, 3530, 512, 3545, 3551, 514, 3661, 3634, 514, 3789, 3762, \r
+    514, 3755, 3737, 514, 3755, 3745, 257, 3851, 512, 3906, 4023, 512, 3916, \r
+    4023, 512, 3921, 4023, 512, 3926, 4023, 512, 3931, 4023, 512, 3904, 4021, \r
+    512, 3953, 3954, 512, 3953, 3956, 512, 4018, 3968, 514, 4018, 3969, 512, \r
+    4019, 3968, 514, 4019, 3969, 512, 3953, 3968, 512, 3986, 4023, 512, 3996, \r
+    4023, 512, 4001, 4023, 512, 4006, 4023, 512, 4011, 4023, 512, 3984, 4021, \r
+    512, 4133, 4142, 259, 4316, 512, 6917, 6965, 512, 6919, 6965, 512, 6921, \r
+    6965, 512, 6923, 6965, 512, 6925, 6965, 512, 6929, 6965, 512, 6970, 6965, \r
+    512, 6972, 6965, 512, 6974, 6965, 512, 6975, 6965, 512, 6978, 6965, 259, \r
+    65, 259, 198, 259, 66, 259, 68, 259, 69, 259, 398, 259, 71, 259, 72, 259, \r
+    73, 259, 74, 259, 75, 259, 76, 259, 77, 259, 78, 259, 79, 259, 546, 259, \r
+    80, 259, 82, 259, 84, 259, 85, 259, 87, 259, 97, 259, 592, 259, 593, 259, \r
+    7426, 259, 98, 259, 100, 259, 101, 259, 601, 259, 603, 259, 604, 259, \r
+    103, 259, 107, 259, 109, 259, 331, 259, 111, 259, 596, 259, 7446, 259, \r
+    7447, 259, 112, 259, 116, 259, 117, 259, 7453, 259, 623, 259, 118, 259, \r
+    7461, 259, 946, 259, 947, 259, 948, 259, 966, 259, 967, 261, 105, 261, \r
+    114, 261, 117, 261, 118, 261, 946, 261, 947, 261, 961, 261, 966, 261, \r
+    967, 259, 1085, 259, 594, 259, 99, 259, 597, 259, 240, 259, 604, 259, \r
+    102, 259, 607, 259, 609, 259, 613, 259, 616, 259, 617, 259, 618, 259, \r
+    7547, 259, 669, 259, 621, 259, 7557, 259, 671, 259, 625, 259, 624, 259, \r
+    626, 259, 627, 259, 628, 259, 629, 259, 632, 259, 642, 259, 643, 259, \r
+    427, 259, 649, 259, 650, 259, 7452, 259, 651, 259, 652, 259, 122, 259, \r
+    656, 259, 657, 259, 658, 259, 952, 512, 65, 805, 512, 97, 805, 512, 66, \r
+    775, 512, 98, 775, 512, 66, 803, 512, 98, 803, 512, 66, 817, 512, 98, \r
+    817, 512, 199, 769, 512, 231, 769, 512, 68, 775, 512, 100, 775, 512, 68, \r
+    803, 512, 100, 803, 512, 68, 817, 512, 100, 817, 512, 68, 807, 512, 100, \r
+    807, 512, 68, 813, 512, 100, 813, 512, 274, 768, 512, 275, 768, 512, 274, \r
+    769, 512, 275, 769, 512, 69, 813, 512, 101, 813, 512, 69, 816, 512, 101, \r
+    816, 512, 552, 774, 512, 553, 774, 512, 70, 775, 512, 102, 775, 512, 71, \r
+    772, 512, 103, 772, 512, 72, 775, 512, 104, 775, 512, 72, 803, 512, 104, \r
+    803, 512, 72, 776, 512, 104, 776, 512, 72, 807, 512, 104, 807, 512, 72, \r
+    814, 512, 104, 814, 512, 73, 816, 512, 105, 816, 512, 207, 769, 512, 239, \r
+    769, 512, 75, 769, 512, 107, 769, 512, 75, 803, 512, 107, 803, 512, 75, \r
+    817, 512, 107, 817, 512, 76, 803, 512, 108, 803, 512, 7734, 772, 512, \r
+    7735, 772, 512, 76, 817, 512, 108, 817, 512, 76, 813, 512, 108, 813, 512, \r
+    77, 769, 512, 109, 769, 512, 77, 775, 512, 109, 775, 512, 77, 803, 512, \r
+    109, 803, 512, 78, 775, 512, 110, 775, 512, 78, 803, 512, 110, 803, 512, \r
+    78, 817, 512, 110, 817, 512, 78, 813, 512, 110, 813, 512, 213, 769, 512, \r
+    245, 769, 512, 213, 776, 512, 245, 776, 512, 332, 768, 512, 333, 768, \r
+    512, 332, 769, 512, 333, 769, 512, 80, 769, 512, 112, 769, 512, 80, 775, \r
+    512, 112, 775, 512, 82, 775, 512, 114, 775, 512, 82, 803, 512, 114, 803, \r
+    512, 7770, 772, 512, 7771, 772, 512, 82, 817, 512, 114, 817, 512, 83, \r
+    775, 512, 115, 775, 512, 83, 803, 512, 115, 803, 512, 346, 775, 512, 347, \r
+    775, 512, 352, 775, 512, 353, 775, 512, 7778, 775, 512, 7779, 775, 512, \r
+    84, 775, 512, 116, 775, 512, 84, 803, 512, 116, 803, 512, 84, 817, 512, \r
+    116, 817, 512, 84, 813, 512, 116, 813, 512, 85, 804, 512, 117, 804, 512, \r
+    85, 816, 512, 117, 816, 512, 85, 813, 512, 117, 813, 512, 360, 769, 512, \r
+    361, 769, 512, 362, 776, 512, 363, 776, 512, 86, 771, 512, 118, 771, 512, \r
+    86, 803, 512, 118, 803, 512, 87, 768, 512, 119, 768, 512, 87, 769, 512, \r
+    119, 769, 512, 87, 776, 512, 119, 776, 512, 87, 775, 512, 119, 775, 512, \r
+    87, 803, 512, 119, 803, 512, 88, 775, 512, 120, 775, 512, 88, 776, 512, \r
+    120, 776, 512, 89, 775, 512, 121, 775, 512, 90, 770, 512, 122, 770, 512, \r
+    90, 803, 512, 122, 803, 512, 90, 817, 512, 122, 817, 512, 104, 817, 512, \r
+    116, 776, 512, 119, 778, 512, 121, 778, 514, 97, 702, 512, 383, 775, 512, \r
+    65, 803, 512, 97, 803, 512, 65, 777, 512, 97, 777, 512, 194, 769, 512, \r
+    226, 769, 512, 194, 768, 512, 226, 768, 512, 194, 777, 512, 226, 777, \r
+    512, 194, 771, 512, 226, 771, 512, 7840, 770, 512, 7841, 770, 512, 258, \r
+    769, 512, 259, 769, 512, 258, 768, 512, 259, 768, 512, 258, 777, 512, \r
+    259, 777, 512, 258, 771, 512, 259, 771, 512, 7840, 774, 512, 7841, 774, \r
+    512, 69, 803, 512, 101, 803, 512, 69, 777, 512, 101, 777, 512, 69, 771, \r
+    512, 101, 771, 512, 202, 769, 512, 234, 769, 512, 202, 768, 512, 234, \r
+    768, 512, 202, 777, 512, 234, 777, 512, 202, 771, 512, 234, 771, 512, \r
+    7864, 770, 512, 7865, 770, 512, 73, 777, 512, 105, 777, 512, 73, 803, \r
+    512, 105, 803, 512, 79, 803, 512, 111, 803, 512, 79, 777, 512, 111, 777, \r
+    512, 212, 769, 512, 244, 769, 512, 212, 768, 512, 244, 768, 512, 212, \r
+    777, 512, 244, 777, 512, 212, 771, 512, 244, 771, 512, 7884, 770, 512, \r
+    7885, 770, 512, 416, 769, 512, 417, 769, 512, 416, 768, 512, 417, 768, \r
+    512, 416, 777, 512, 417, 777, 512, 416, 771, 512, 417, 771, 512, 416, \r
+    803, 512, 417, 803, 512, 85, 803, 512, 117, 803, 512, 85, 777, 512, 117, \r
+    777, 512, 431, 769, 512, 432, 769, 512, 431, 768, 512, 432, 768, 512, \r
+    431, 777, 512, 432, 777, 512, 431, 771, 512, 432, 771, 512, 431, 803, \r
+    512, 432, 803, 512, 89, 768, 512, 121, 768, 512, 89, 803, 512, 121, 803, \r
+    512, 89, 777, 512, 121, 777, 512, 89, 771, 512, 121, 771, 512, 945, 787, \r
+    512, 945, 788, 512, 7936, 768, 512, 7937, 768, 512, 7936, 769, 512, 7937, \r
+    769, 512, 7936, 834, 512, 7937, 834, 512, 913, 787, 512, 913, 788, 512, \r
+    7944, 768, 512, 7945, 768, 512, 7944, 769, 512, 7945, 769, 512, 7944, \r
+    834, 512, 7945, 834, 512, 949, 787, 512, 949, 788, 512, 7952, 768, 512, \r
+    7953, 768, 512, 7952, 769, 512, 7953, 769, 512, 917, 787, 512, 917, 788, \r
+    512, 7960, 768, 512, 7961, 768, 512, 7960, 769, 512, 7961, 769, 512, 951, \r
+    787, 512, 951, 788, 512, 7968, 768, 512, 7969, 768, 512, 7968, 769, 512, \r
+    7969, 769, 512, 7968, 834, 512, 7969, 834, 512, 919, 787, 512, 919, 788, \r
+    512, 7976, 768, 512, 7977, 768, 512, 7976, 769, 512, 7977, 769, 512, \r
+    7976, 834, 512, 7977, 834, 512, 953, 787, 512, 953, 788, 512, 7984, 768, \r
+    512, 7985, 768, 512, 7984, 769, 512, 7985, 769, 512, 7984, 834, 512, \r
+    7985, 834, 512, 921, 787, 512, 921, 788, 512, 7992, 768, 512, 7993, 768, \r
+    512, 7992, 769, 512, 7993, 769, 512, 7992, 834, 512, 7993, 834, 512, 959, \r
+    787, 512, 959, 788, 512, 8000, 768, 512, 8001, 768, 512, 8000, 769, 512, \r
+    8001, 769, 512, 927, 787, 512, 927, 788, 512, 8008, 768, 512, 8009, 768, \r
+    512, 8008, 769, 512, 8009, 769, 512, 965, 787, 512, 965, 788, 512, 8016, \r
+    768, 512, 8017, 768, 512, 8016, 769, 512, 8017, 769, 512, 8016, 834, 512, \r
+    8017, 834, 512, 933, 788, 512, 8025, 768, 512, 8025, 769, 512, 8025, 834, \r
+    512, 969, 787, 512, 969, 788, 512, 8032, 768, 512, 8033, 768, 512, 8032, \r
+    769, 512, 8033, 769, 512, 8032, 834, 512, 8033, 834, 512, 937, 787, 512, \r
+    937, 788, 512, 8040, 768, 512, 8041, 768, 512, 8040, 769, 512, 8041, 769, \r
+    512, 8040, 834, 512, 8041, 834, 512, 945, 768, 256, 940, 512, 949, 768, \r
+    256, 941, 512, 951, 768, 256, 942, 512, 953, 768, 256, 943, 512, 959, \r
+    768, 256, 972, 512, 965, 768, 256, 973, 512, 969, 768, 256, 974, 512, \r
+    7936, 837, 512, 7937, 837, 512, 7938, 837, 512, 7939, 837, 512, 7940, \r
+    837, 512, 7941, 837, 512, 7942, 837, 512, 7943, 837, 512, 7944, 837, 512, \r
+    7945, 837, 512, 7946, 837, 512, 7947, 837, 512, 7948, 837, 512, 7949, \r
+    837, 512, 7950, 837, 512, 7951, 837, 512, 7968, 837, 512, 7969, 837, 512, \r
+    7970, 837, 512, 7971, 837, 512, 7972, 837, 512, 7973, 837, 512, 7974, \r
+    837, 512, 7975, 837, 512, 7976, 837, 512, 7977, 837, 512, 7978, 837, 512, \r
+    7979, 837, 512, 7980, 837, 512, 7981, 837, 512, 7982, 837, 512, 7983, \r
+    837, 512, 8032, 837, 512, 8033, 837, 512, 8034, 837, 512, 8035, 837, 512, \r
+    8036, 837, 512, 8037, 837, 512, 8038, 837, 512, 8039, 837, 512, 8040, \r
+    837, 512, 8041, 837, 512, 8042, 837, 512, 8043, 837, 512, 8044, 837, 512, \r
+    8045, 837, 512, 8046, 837, 512, 8047, 837, 512, 945, 774, 512, 945, 772, \r
+    512, 8048, 837, 512, 945, 837, 512, 940, 837, 512, 945, 834, 512, 8118, \r
+    837, 512, 913, 774, 512, 913, 772, 512, 913, 768, 256, 902, 512, 913, \r
+    837, 514, 32, 787, 256, 953, 514, 32, 787, 514, 32, 834, 512, 168, 834, \r
+    512, 8052, 837, 512, 951, 837, 512, 942, 837, 512, 951, 834, 512, 8134, \r
+    837, 512, 917, 768, 256, 904, 512, 919, 768, 256, 905, 512, 919, 837, \r
+    512, 8127, 768, 512, 8127, 769, 512, 8127, 834, 512, 953, 774, 512, 953, \r
+    772, 512, 970, 768, 256, 912, 512, 953, 834, 512, 970, 834, 512, 921, \r
+    774, 512, 921, 772, 512, 921, 768, 256, 906, 512, 8190, 768, 512, 8190, \r
+    769, 512, 8190, 834, 512, 965, 774, 512, 965, 772, 512, 971, 768, 256, \r
+    944, 512, 961, 787, 512, 961, 788, 512, 965, 834, 512, 971, 834, 512, \r
+    933, 774, 512, 933, 772, 512, 933, 768, 256, 910, 512, 929, 788, 512, \r
+    168, 768, 256, 901, 256, 96, 512, 8060, 837, 512, 969, 837, 512, 974, \r
+    837, 512, 969, 834, 512, 8182, 837, 512, 927, 768, 256, 908, 512, 937, \r
+    768, 256, 911, 512, 937, 837, 256, 180, 514, 32, 788, 256, 8194, 256, \r
+    8195, 258, 32, 258, 32, 258, 32, 258, 32, 258, 32, 257, 32, 258, 32, 258, \r
+    32, 258, 32, 257, 8208, 514, 32, 819, 258, 46, 514, 46, 46, 770, 46, 46, \r
+    46, 257, 32, 514, 8242, 8242, 770, 8242, 8242, 8242, 514, 8245, 8245, \r
+    770, 8245, 8245, 8245, 514, 33, 33, 514, 32, 773, 514, 63, 63, 514, 63, \r
+    33, 514, 33, 63, 1026, 8242, 8242, 8242, 8242, 258, 32, 259, 48, 259, \r
+    105, 259, 52, 259, 53, 259, 54, 259, 55, 259, 56, 259, 57, 259, 43, 259, \r
+    8722, 259, 61, 259, 40, 259, 41, 259, 110, 261, 48, 261, 49, 261, 50, \r
+    261, 51, 261, 52, 261, 53, 261, 54, 261, 55, 261, 56, 261, 57, 261, 43, \r
+    261, 8722, 261, 61, 261, 40, 261, 41, 261, 97, 261, 101, 261, 111, 261, \r
+    120, 261, 601, 514, 82, 115, 770, 97, 47, 99, 770, 97, 47, 115, 262, 67, \r
+    514, 176, 67, 770, 99, 47, 111, 770, 99, 47, 117, 258, 400, 514, 176, 70, \r
+    262, 103, 262, 72, 262, 72, 262, 72, 262, 104, 262, 295, 262, 73, 262, \r
+    73, 262, 76, 262, 108, 262, 78, 514, 78, 111, 262, 80, 262, 81, 262, 82, \r
+    262, 82, 262, 82, 515, 83, 77, 770, 84, 69, 76, 515, 84, 77, 262, 90, \r
+    256, 937, 262, 90, 256, 75, 256, 197, 262, 66, 262, 67, 262, 101, 262, \r
+    69, 262, 70, 262, 77, 262, 111, 258, 1488, 258, 1489, 258, 1490, 258, \r
+    1491, 262, 105, 770, 70, 65, 88, 262, 960, 262, 947, 262, 915, 262, 928, \r
+    262, 8721, 262, 68, 262, 100, 262, 101, 262, 105, 262, 106, 772, 49, \r
+    8260, 55, 772, 49, 8260, 57, 1028, 49, 8260, 49, 48, 772, 49, 8260, 51, \r
+    772, 50, 8260, 51, 772, 49, 8260, 53, 772, 50, 8260, 53, 772, 51, 8260, \r
+    53, 772, 52, 8260, 53, 772, 49, 8260, 54, 772, 53, 8260, 54, 772, 49, \r
+    8260, 56, 772, 51, 8260, 56, 772, 53, 8260, 56, 772, 55, 8260, 56, 516, \r
+    49, 8260, 258, 73, 514, 73, 73, 770, 73, 73, 73, 514, 73, 86, 258, 86, \r
+    514, 86, 73, 770, 86, 73, 73, 1026, 86, 73, 73, 73, 514, 73, 88, 258, 88, \r
+    514, 88, 73, 770, 88, 73, 73, 258, 76, 258, 67, 258, 68, 258, 77, 258, \r
+    105, 514, 105, 105, 770, 105, 105, 105, 514, 105, 118, 258, 118, 514, \r
+    118, 105, 770, 118, 105, 105, 1026, 118, 105, 105, 105, 514, 105, 120, \r
+    258, 120, 514, 120, 105, 770, 120, 105, 105, 258, 108, 258, 99, 258, 100, \r
+    258, 109, 772, 48, 8260, 51, 512, 8592, 824, 512, 8594, 824, 512, 8596, \r
+    824, 512, 8656, 824, 512, 8660, 824, 512, 8658, 824, 512, 8707, 824, 512, \r
+    8712, 824, 512, 8715, 824, 512, 8739, 824, 512, 8741, 824, 514, 8747, \r
+    8747, 770, 8747, 8747, 8747, 514, 8750, 8750, 770, 8750, 8750, 8750, 512, \r
+    8764, 824, 512, 8771, 824, 512, 8773, 824, 512, 8776, 824, 512, 61, 824, \r
+    512, 8801, 824, 512, 8781, 824, 512, 60, 824, 512, 62, 824, 512, 8804, \r
+    824, 512, 8805, 824, 512, 8818, 824, 512, 8819, 824, 512, 8822, 824, 512, \r
+    8823, 824, 512, 8826, 824, 512, 8827, 824, 512, 8834, 824, 512, 8835, \r
+    824, 512, 8838, 824, 512, 8839, 824, 512, 8866, 824, 512, 8872, 824, 512, \r
+    8873, 824, 512, 8875, 824, 512, 8828, 824, 512, 8829, 824, 512, 8849, \r
+    824, 512, 8850, 824, 512, 8882, 824, 512, 8883, 824, 512, 8884, 824, 512, \r
+    8885, 824, 256, 12296, 256, 12297, 263, 49, 263, 50, 263, 51, 263, 52, \r
+    263, 53, 263, 54, 263, 55, 263, 56, 263, 57, 519, 49, 48, 519, 49, 49, \r
+    519, 49, 50, 519, 49, 51, 519, 49, 52, 519, 49, 53, 519, 49, 54, 519, 49, \r
+    55, 519, 49, 56, 519, 49, 57, 519, 50, 48, 770, 40, 49, 41, 770, 40, 50, \r
+    41, 770, 40, 51, 41, 770, 40, 52, 41, 770, 40, 53, 41, 770, 40, 54, 41, \r
+    770, 40, 55, 41, 770, 40, 56, 41, 770, 40, 57, 41, 1026, 40, 49, 48, 41, \r
+    1026, 40, 49, 49, 41, 1026, 40, 49, 50, 41, 1026, 40, 49, 51, 41, 1026, \r
+    40, 49, 52, 41, 1026, 40, 49, 53, 41, 1026, 40, 49, 54, 41, 1026, 40, 49, \r
+    55, 41, 1026, 40, 49, 56, 41, 1026, 40, 49, 57, 41, 1026, 40, 50, 48, 41, \r
+    514, 49, 46, 514, 50, 46, 514, 51, 46, 514, 52, 46, 514, 53, 46, 514, 54, \r
+    46, 514, 55, 46, 514, 56, 46, 514, 57, 46, 770, 49, 48, 46, 770, 49, 49, \r
+    46, 770, 49, 50, 46, 770, 49, 51, 46, 770, 49, 52, 46, 770, 49, 53, 46, \r
+    770, 49, 54, 46, 770, 49, 55, 46, 770, 49, 56, 46, 770, 49, 57, 46, 770, \r
+    50, 48, 46, 770, 40, 97, 41, 770, 40, 98, 41, 770, 40, 99, 41, 770, 40, \r
+    100, 41, 770, 40, 101, 41, 770, 40, 102, 41, 770, 40, 103, 41, 770, 40, \r
+    104, 41, 770, 40, 105, 41, 770, 40, 106, 41, 770, 40, 107, 41, 770, 40, \r
+    108, 41, 770, 40, 109, 41, 770, 40, 110, 41, 770, 40, 111, 41, 770, 40, \r
+    112, 41, 770, 40, 113, 41, 770, 40, 114, 41, 770, 40, 115, 41, 770, 40, \r
+    116, 41, 770, 40, 117, 41, 770, 40, 118, 41, 770, 40, 119, 41, 770, 40, \r
+    120, 41, 770, 40, 121, 41, 770, 40, 122, 41, 263, 65, 263, 66, 263, 67, \r
+    263, 68, 263, 69, 263, 70, 263, 71, 263, 72, 263, 73, 263, 74, 263, 75, \r
+    263, 76, 263, 77, 263, 78, 263, 79, 263, 80, 263, 81, 263, 82, 263, 83, \r
+    263, 84, 263, 85, 263, 86, 263, 87, 263, 88, 263, 89, 263, 90, 263, 97, \r
+    263, 98, 263, 99, 263, 100, 263, 101, 263, 102, 263, 103, 263, 104, 263, \r
+    105, 263, 106, 263, 107, 263, 108, 263, 109, 263, 110, 263, 111, 263, \r
+    112, 263, 113, 263, 114, 263, 115, 263, 116, 263, 117, 263, 118, 263, \r
+    119, 263, 120, 263, 121, 263, 122, 263, 48, 1026, 8747, 8747, 8747, 8747, \r
+    770, 58, 58, 61, 514, 61, 61, 770, 61, 61, 61, 512, 10973, 824, 261, 106, \r
+    259, 86, 259, 11617, 258, 27597, 258, 40863, 258, 19968, 258, 20008, 258, \r
+    20022, 258, 20031, 258, 20057, 258, 20101, 258, 20108, 258, 20128, 258, \r
+    20154, 258, 20799, 258, 20837, 258, 20843, 258, 20866, 258, 20886, 258, \r
+    20907, 258, 20960, 258, 20981, 258, 20992, 258, 21147, 258, 21241, 258, \r
+    21269, 258, 21274, 258, 21304, 258, 21313, 258, 21340, 258, 21353, 258, \r
+    21378, 258, 21430, 258, 21448, 258, 21475, 258, 22231, 258, 22303, 258, \r
+    22763, 258, 22786, 258, 22794, 258, 22805, 258, 22823, 258, 22899, 258, \r
+    23376, 258, 23424, 258, 23544, 258, 23567, 258, 23586, 258, 23608, 258, \r
+    23662, 258, 23665, 258, 24027, 258, 24037, 258, 24049, 258, 24062, 258, \r
+    24178, 258, 24186, 258, 24191, 258, 24308, 258, 24318, 258, 24331, 258, \r
+    24339, 258, 24400, 258, 24417, 258, 24435, 258, 24515, 258, 25096, 258, \r
+    25142, 258, 25163, 258, 25903, 258, 25908, 258, 25991, 258, 26007, 258, \r
+    26020, 258, 26041, 258, 26080, 258, 26085, 258, 26352, 258, 26376, 258, \r
+    26408, 258, 27424, 258, 27490, 258, 27513, 258, 27571, 258, 27595, 258, \r
+    27604, 258, 27611, 258, 27663, 258, 27668, 258, 27700, 258, 28779, 258, \r
+    29226, 258, 29238, 258, 29243, 258, 29247, 258, 29255, 258, 29273, 258, \r
+    29275, 258, 29356, 258, 29572, 258, 29577, 258, 29916, 258, 29926, 258, \r
+    29976, 258, 29983, 258, 29992, 258, 30000, 258, 30091, 258, 30098, 258, \r
+    30326, 258, 30333, 258, 30382, 258, 30399, 258, 30446, 258, 30683, 258, \r
+    30690, 258, 30707, 258, 31034, 258, 31160, 258, 31166, 258, 31348, 258, \r
+    31435, 258, 31481, 258, 31859, 258, 31992, 258, 32566, 258, 32593, 258, \r
+    32650, 258, 32701, 258, 32769, 258, 32780, 258, 32786, 258, 32819, 258, \r
+    32895, 258, 32905, 258, 33251, 258, 33258, 258, 33267, 258, 33276, 258, \r
+    33292, 258, 33307, 258, 33311, 258, 33390, 258, 33394, 258, 33400, 258, \r
+    34381, 258, 34411, 258, 34880, 258, 34892, 258, 34915, 258, 35198, 258, \r
+    35211, 258, 35282, 258, 35328, 258, 35895, 258, 35910, 258, 35925, 258, \r
+    35960, 258, 35997, 258, 36196, 258, 36208, 258, 36275, 258, 36523, 258, \r
+    36554, 258, 36763, 258, 36784, 258, 36789, 258, 37009, 258, 37193, 258, \r
+    37318, 258, 37324, 258, 37329, 258, 38263, 258, 38272, 258, 38428, 258, \r
+    38582, 258, 38585, 258, 38632, 258, 38737, 258, 38750, 258, 38754, 258, \r
+    38761, 258, 38859, 258, 38893, 258, 38899, 258, 38913, 258, 39080, 258, \r
+    39131, 258, 39135, 258, 39318, 258, 39321, 258, 39340, 258, 39592, 258, \r
+    39640, 258, 39647, 258, 39717, 258, 39727, 258, 39730, 258, 39740, 258, \r
+    39770, 258, 40165, 258, 40565, 258, 40575, 258, 40613, 258, 40635, 258, \r
+    40643, 258, 40653, 258, 40657, 258, 40697, 258, 40701, 258, 40718, 258, \r
+    40723, 258, 40736, 258, 40763, 258, 40778, 258, 40786, 258, 40845, 258, \r
+    40860, 258, 40864, 264, 32, 258, 12306, 258, 21313, 258, 21316, 258, \r
+    21317, 512, 12363, 12441, 512, 12365, 12441, 512, 12367, 12441, 512, \r
+    12369, 12441, 512, 12371, 12441, 512, 12373, 12441, 512, 12375, 12441, \r
+    512, 12377, 12441, 512, 12379, 12441, 512, 12381, 12441, 512, 12383, \r
+    12441, 512, 12385, 12441, 512, 12388, 12441, 512, 12390, 12441, 512, \r
+    12392, 12441, 512, 12399, 12441, 512, 12399, 12442, 512, 12402, 12441, \r
+    512, 12402, 12442, 512, 12405, 12441, 512, 12405, 12442, 512, 12408, \r
+    12441, 512, 12408, 12442, 512, 12411, 12441, 512, 12411, 12442, 512, \r
+    12358, 12441, 514, 32, 12441, 514, 32, 12442, 512, 12445, 12441, 521, \r
+    12424, 12426, 512, 12459, 12441, 512, 12461, 12441, 512, 12463, 12441, \r
+    512, 12465, 12441, 512, 12467, 12441, 512, 12469, 12441, 512, 12471, \r
+    12441, 512, 12473, 12441, 512, 12475, 12441, 512, 12477, 12441, 512, \r
+    12479, 12441, 512, 12481, 12441, 512, 12484, 12441, 512, 12486, 12441, \r
+    512, 12488, 12441, 512, 12495, 12441, 512, 12495, 12442, 512, 12498, \r
+    12441, 512, 12498, 12442, 512, 12501, 12441, 512, 12501, 12442, 512, \r
+    12504, 12441, 512, 12504, 12442, 512, 12507, 12441, 512, 12507, 12442, \r
+    512, 12454, 12441, 512, 12527, 12441, 512, 12528, 12441, 512, 12529, \r
+    12441, 512, 12530, 12441, 512, 12541, 12441, 521, 12467, 12488, 258, \r
+    4352, 258, 4353, 258, 4522, 258, 4354, 258, 4524, 258, 4525, 258, 4355, \r
+    258, 4356, 258, 4357, 258, 4528, 258, 4529, 258, 4530, 258, 4531, 258, \r
+    4532, 258, 4533, 258, 4378, 258, 4358, 258, 4359, 258, 4360, 258, 4385, \r
+    258, 4361, 258, 4362, 258, 4363, 258, 4364, 258, 4365, 258, 4366, 258, \r
+    4367, 258, 4368, 258, 4369, 258, 4370, 258, 4449, 258, 4450, 258, 4451, \r
+    258, 4452, 258, 4453, 258, 4454, 258, 4455, 258, 4456, 258, 4457, 258, \r
+    4458, 258, 4459, 258, 4460, 258, 4461, 258, 4462, 258, 4463, 258, 4464, \r
+    258, 4465, 258, 4466, 258, 4467, 258, 4468, 258, 4469, 258, 4448, 258, \r
+    4372, 258, 4373, 258, 4551, 258, 4552, 258, 4556, 258, 4558, 258, 4563, \r
+    258, 4567, 258, 4569, 258, 4380, 258, 4573, 258, 4575, 258, 4381, 258, \r
+    4382, 258, 4384, 258, 4386, 258, 4387, 258, 4391, 258, 4393, 258, 4395, \r
+    258, 4396, 258, 4397, 258, 4398, 258, 4399, 258, 4402, 258, 4406, 258, \r
+    4416, 258, 4423, 258, 4428, 258, 4593, 258, 4594, 258, 4439, 258, 4440, \r
+    258, 4441, 258, 4484, 258, 4485, 258, 4488, 258, 4497, 258, 4498, 258, \r
+    4500, 258, 4510, 258, 4513, 259, 19968, 259, 20108, 259, 19977, 259, \r
+    22235, 259, 19978, 259, 20013, 259, 19979, 259, 30002, 259, 20057, 259, \r
+    19993, 259, 19969, 259, 22825, 259, 22320, 259, 20154, 770, 40, 4352, 41, \r
+    770, 40, 4354, 41, 770, 40, 4355, 41, 770, 40, 4357, 41, 770, 40, 4358, \r
+    41, 770, 40, 4359, 41, 770, 40, 4361, 41, 770, 40, 4363, 41, 770, 40, \r
+    4364, 41, 770, 40, 4366, 41, 770, 40, 4367, 41, 770, 40, 4368, 41, 770, \r
+    40, 4369, 41, 770, 40, 4370, 41, 1026, 40, 4352, 4449, 41, 1026, 40, \r
+    4354, 4449, 41, 1026, 40, 4355, 4449, 41, 1026, 40, 4357, 4449, 41, 1026, \r
+    40, 4358, 4449, 41, 1026, 40, 4359, 4449, 41, 1026, 40, 4361, 4449, 41, \r
+    1026, 40, 4363, 4449, 41, 1026, 40, 4364, 4449, 41, 1026, 40, 4366, 4449, \r
+    41, 1026, 40, 4367, 4449, 41, 1026, 40, 4368, 4449, 41, 1026, 40, 4369, \r
+    4449, 41, 1026, 40, 4370, 4449, 41, 1026, 40, 4364, 4462, 41, 1794, 40, \r
+    4363, 4457, 4364, 4453, 4523, 41, 1538, 40, 4363, 4457, 4370, 4462, 41, \r
+    770, 40, 19968, 41, 770, 40, 20108, 41, 770, 40, 19977, 41, 770, 40, \r
+    22235, 41, 770, 40, 20116, 41, 770, 40, 20845, 41, 770, 40, 19971, 41, \r
+    770, 40, 20843, 41, 770, 40, 20061, 41, 770, 40, 21313, 41, 770, 40, \r
+    26376, 41, 770, 40, 28779, 41, 770, 40, 27700, 41, 770, 40, 26408, 41, \r
+    770, 40, 37329, 41, 770, 40, 22303, 41, 770, 40, 26085, 41, 770, 40, \r
+    26666, 41, 770, 40, 26377, 41, 770, 40, 31038, 41, 770, 40, 21517, 41, \r
+    770, 40, 29305, 41, 770, 40, 36001, 41, 770, 40, 31069, 41, 770, 40, \r
+    21172, 41, 770, 40, 20195, 41, 770, 40, 21628, 41, 770, 40, 23398, 41, \r
+    770, 40, 30435, 41, 770, 40, 20225, 41, 770, 40, 36039, 41, 770, 40, \r
+    21332, 41, 770, 40, 31085, 41, 770, 40, 20241, 41, 770, 40, 33258, 41, \r
+    770, 40, 33267, 41, 263, 21839, 263, 24188, 263, 25991, 263, 31631, 778, \r
+    80, 84, 69, 519, 50, 49, 519, 50, 50, 519, 50, 51, 519, 50, 52, 519, 50, \r
+    53, 519, 50, 54, 519, 50, 55, 519, 50, 56, 519, 50, 57, 519, 51, 48, 519, \r
+    51, 49, 519, 51, 50, 519, 51, 51, 519, 51, 52, 519, 51, 53, 263, 4352, \r
+    263, 4354, 263, 4355, 263, 4357, 263, 4358, 263, 4359, 263, 4361, 263, \r
+    4363, 263, 4364, 263, 4366, 263, 4367, 263, 4368, 263, 4369, 263, 4370, \r
+    519, 4352, 4449, 519, 4354, 4449, 519, 4355, 4449, 519, 4357, 4449, 519, \r
+    4358, 4449, 519, 4359, 4449, 519, 4361, 4449, 519, 4363, 4449, 519, 4364, \r
+    4449, 519, 4366, 4449, 519, 4367, 4449, 519, 4368, 4449, 519, 4369, 4449, \r
+    519, 4370, 4449, 1287, 4366, 4449, 4535, 4352, 4457, 1031, 4364, 4462, \r
+    4363, 4468, 519, 4363, 4462, 263, 19968, 263, 20108, 263, 19977, 263, \r
+    22235, 263, 20116, 263, 20845, 263, 19971, 263, 20843, 263, 20061, 263, \r
+    21313, 263, 26376, 263, 28779, 263, 27700, 263, 26408, 263, 37329, 263, \r
+    22303, 263, 26085, 263, 26666, 263, 26377, 263, 31038, 263, 21517, 263, \r
+    29305, 263, 36001, 263, 31069, 263, 21172, 263, 31192, 263, 30007, 263, \r
+    22899, 263, 36969, 263, 20778, 263, 21360, 263, 27880, 263, 38917, 263, \r
+    20241, 263, 20889, 263, 27491, 263, 19978, 263, 20013, 263, 19979, 263, \r
+    24038, 263, 21491, 263, 21307, 263, 23447, 263, 23398, 263, 30435, 263, \r
+    20225, 263, 36039, 263, 21332, 263, 22812, 519, 51, 54, 519, 51, 55, 519, \r
+    51, 56, 519, 51, 57, 519, 52, 48, 519, 52, 49, 519, 52, 50, 519, 52, 51, \r
+    519, 52, 52, 519, 52, 53, 519, 52, 54, 519, 52, 55, 519, 52, 56, 519, 52, \r
+    57, 519, 53, 48, 514, 49, 26376, 514, 50, 26376, 514, 51, 26376, 514, 52, \r
+    26376, 514, 53, 26376, 514, 54, 26376, 514, 55, 26376, 514, 56, 26376, \r
+    514, 57, 26376, 770, 49, 48, 26376, 770, 49, 49, 26376, 770, 49, 50, \r
+    26376, 522, 72, 103, 778, 101, 114, 103, 522, 101, 86, 778, 76, 84, 68, \r
+    263, 12450, 263, 12452, 263, 12454, 263, 12456, 263, 12458, 263, 12459, \r
+    263, 12461, 263, 12463, 263, 12465, 263, 12467, 263, 12469, 263, 12471, \r
+    263, 12473, 263, 12475, 263, 12477, 263, 12479, 263, 12481, 263, 12484, \r
+    263, 12486, 263, 12488, 263, 12490, 263, 12491, 263, 12492, 263, 12493, \r
+    263, 12494, 263, 12495, 263, 12498, 263, 12501, 263, 12504, 263, 12507, \r
+    263, 12510, 263, 12511, 263, 12512, 263, 12513, 263, 12514, 263, 12516, \r
+    263, 12518, 263, 12520, 263, 12521, 263, 12522, 263, 12523, 263, 12524, \r
+    263, 12525, 263, 12527, 263, 12528, 263, 12529, 263, 12530, 1034, 12450, \r
+    12497, 12540, 12488, 1034, 12450, 12523, 12501, 12449, 1034, 12450, \r
+    12531, 12506, 12450, 778, 12450, 12540, 12523, 1034, 12452, 12491, 12531, \r
+    12464, 778, 12452, 12531, 12481, 778, 12454, 12457, 12531, 1290, 12456, \r
+    12473, 12463, 12540, 12489, 1034, 12456, 12540, 12459, 12540, 778, 12458, \r
+    12531, 12473, 778, 12458, 12540, 12512, 778, 12459, 12452, 12522, 1034, \r
+    12459, 12521, 12483, 12488, 1034, 12459, 12525, 12522, 12540, 778, 12460, \r
+    12525, 12531, 778, 12460, 12531, 12510, 522, 12462, 12460, 778, 12462, \r
+    12491, 12540, 1034, 12461, 12517, 12522, 12540, 1034, 12462, 12523, \r
+    12480, 12540, 522, 12461, 12525, 1290, 12461, 12525, 12464, 12521, 12512, \r
+    1546, 12461, 12525, 12513, 12540, 12488, 12523, 1290, 12461, 12525, \r
+    12527, 12483, 12488, 778, 12464, 12521, 12512, 1290, 12464, 12521, 12512, \r
+    12488, 12531, 1290, 12463, 12523, 12476, 12452, 12525, 1034, 12463, \r
+    12525, 12540, 12493, 778, 12465, 12540, 12473, 778, 12467, 12523, 12490, \r
+    778, 12467, 12540, 12509, 1034, 12469, 12452, 12463, 12523, 1290, 12469, \r
+    12531, 12481, 12540, 12512, 1034, 12471, 12522, 12531, 12464, 778, 12475, \r
+    12531, 12481, 778, 12475, 12531, 12488, 778, 12480, 12540, 12473, 522, \r
+    12487, 12471, 522, 12489, 12523, 522, 12488, 12531, 522, 12490, 12494, \r
+    778, 12494, 12483, 12488, 778, 12495, 12452, 12484, 1290, 12497, 12540, \r
+    12475, 12531, 12488, 778, 12497, 12540, 12484, 1034, 12496, 12540, 12524, \r
+    12523, 1290, 12500, 12450, 12473, 12488, 12523, 778, 12500, 12463, 12523, \r
+    522, 12500, 12467, 522, 12499, 12523, 1290, 12501, 12449, 12521, 12483, \r
+    12489, 1034, 12501, 12451, 12540, 12488, 1290, 12502, 12483, 12471, \r
+    12455, 12523, 778, 12501, 12521, 12531, 1290, 12504, 12463, 12479, 12540, \r
+    12523, 522, 12506, 12477, 778, 12506, 12491, 12498, 778, 12504, 12523, \r
+    12484, 778, 12506, 12531, 12473, 778, 12506, 12540, 12472, 778, 12505, \r
+    12540, 12479, 1034, 12509, 12452, 12531, 12488, 778, 12508, 12523, 12488, \r
+    522, 12507, 12531, 778, 12509, 12531, 12489, 778, 12507, 12540, 12523, \r
+    778, 12507, 12540, 12531, 1034, 12510, 12452, 12463, 12525, 778, 12510, \r
+    12452, 12523, 778, 12510, 12483, 12495, 778, 12510, 12523, 12463, 1290, \r
+    12510, 12531, 12471, 12519, 12531, 1034, 12511, 12463, 12525, 12531, 522, \r
+    12511, 12522, 1290, 12511, 12522, 12496, 12540, 12523, 522, 12513, 12460, \r
+    1034, 12513, 12460, 12488, 12531, 1034, 12513, 12540, 12488, 12523, 778, \r
+    12516, 12540, 12489, 778, 12516, 12540, 12523, 778, 12518, 12450, 12531, \r
+    1034, 12522, 12483, 12488, 12523, 522, 12522, 12521, 778, 12523, 12500, \r
+    12540, 1034, 12523, 12540, 12502, 12523, 522, 12524, 12512, 1290, 12524, \r
+    12531, 12488, 12466, 12531, 778, 12527, 12483, 12488, 514, 48, 28857, \r
+    514, 49, 28857, 514, 50, 28857, 514, 51, 28857, 514, 52, 28857, 514, 53, \r
+    28857, 514, 54, 28857, 514, 55, 28857, 514, 56, 28857, 514, 57, 28857, \r
+    770, 49, 48, 28857, 770, 49, 49, 28857, 770, 49, 50, 28857, 770, 49, 51, \r
+    28857, 770, 49, 52, 28857, 770, 49, 53, 28857, 770, 49, 54, 28857, 770, \r
+    49, 55, 28857, 770, 49, 56, 28857, 770, 49, 57, 28857, 770, 50, 48, \r
+    28857, 770, 50, 49, 28857, 770, 50, 50, 28857, 770, 50, 51, 28857, 770, \r
+    50, 52, 28857, 778, 104, 80, 97, 522, 100, 97, 522, 65, 85, 778, 98, 97, \r
+    114, 522, 111, 86, 522, 112, 99, 522, 100, 109, 778, 100, 109, 178, 778, \r
+    100, 109, 179, 522, 73, 85, 522, 24179, 25104, 522, 26157, 21644, 522, \r
+    22823, 27491, 522, 26126, 27835, 1034, 26666, 24335, 20250, 31038, 522, \r
+    112, 65, 522, 110, 65, 522, 956, 65, 522, 109, 65, 522, 107, 65, 522, 75, \r
+    66, 522, 77, 66, 522, 71, 66, 778, 99, 97, 108, 1034, 107, 99, 97, 108, \r
+    522, 112, 70, 522, 110, 70, 522, 956, 70, 522, 956, 103, 522, 109, 103, \r
+    522, 107, 103, 522, 72, 122, 778, 107, 72, 122, 778, 77, 72, 122, 778, \r
+    71, 72, 122, 778, 84, 72, 122, 522, 956, 8467, 522, 109, 8467, 522, 100, \r
+    8467, 522, 107, 8467, 522, 102, 109, 522, 110, 109, 522, 956, 109, 522, \r
+    109, 109, 522, 99, 109, 522, 107, 109, 778, 109, 109, 178, 778, 99, 109, \r
+    178, 522, 109, 178, 778, 107, 109, 178, 778, 109, 109, 179, 778, 99, 109, \r
+    179, 522, 109, 179, 778, 107, 109, 179, 778, 109, 8725, 115, 1034, 109, \r
+    8725, 115, 178, 522, 80, 97, 778, 107, 80, 97, 778, 77, 80, 97, 778, 71, \r
+    80, 97, 778, 114, 97, 100, 1290, 114, 97, 100, 8725, 115, 1546, 114, 97, \r
+    100, 8725, 115, 178, 522, 112, 115, 522, 110, 115, 522, 956, 115, 522, \r
+    109, 115, 522, 112, 86, 522, 110, 86, 522, 956, 86, 522, 109, 86, 522, \r
+    107, 86, 522, 77, 86, 522, 112, 87, 522, 110, 87, 522, 956, 87, 522, 109, \r
+    87, 522, 107, 87, 522, 77, 87, 522, 107, 937, 522, 77, 937, 1034, 97, 46, \r
+    109, 46, 522, 66, 113, 522, 99, 99, 522, 99, 100, 1034, 67, 8725, 107, \r
+    103, 778, 67, 111, 46, 522, 100, 66, 522, 71, 121, 522, 104, 97, 522, 72, \r
+    80, 522, 105, 110, 522, 75, 75, 522, 75, 77, 522, 107, 116, 522, 108, \r
+    109, 522, 108, 110, 778, 108, 111, 103, 522, 108, 120, 522, 109, 98, 778, \r
+    109, 105, 108, 778, 109, 111, 108, 522, 80, 72, 1034, 112, 46, 109, 46, \r
+    778, 80, 80, 77, 522, 80, 82, 522, 115, 114, 522, 83, 118, 522, 87, 98, \r
+    778, 86, 8725, 109, 778, 65, 8725, 109, 514, 49, 26085, 514, 50, 26085, \r
+    514, 51, 26085, 514, 52, 26085, 514, 53, 26085, 514, 54, 26085, 514, 55, \r
+    26085, 514, 56, 26085, 514, 57, 26085, 770, 49, 48, 26085, 770, 49, 49, \r
+    26085, 770, 49, 50, 26085, 770, 49, 51, 26085, 770, 49, 52, 26085, 770, \r
+    49, 53, 26085, 770, 49, 54, 26085, 770, 49, 55, 26085, 770, 49, 56, \r
+    26085, 770, 49, 57, 26085, 770, 50, 48, 26085, 770, 50, 49, 26085, 770, \r
+    50, 50, 26085, 770, 50, 51, 26085, 770, 50, 52, 26085, 770, 50, 53, \r
+    26085, 770, 50, 54, 26085, 770, 50, 55, 26085, 770, 50, 56, 26085, 770, \r
+    50, 57, 26085, 770, 51, 48, 26085, 770, 51, 49, 26085, 778, 103, 97, 108, \r
+    259, 42863, 256, 35912, 256, 26356, 256, 36554, 256, 36040, 256, 28369, \r
+    256, 20018, 256, 21477, 256, 40860, 256, 40860, 256, 22865, 256, 37329, \r
+    256, 21895, 256, 22856, 256, 25078, 256, 30313, 256, 32645, 256, 34367, \r
+    256, 34746, 256, 35064, 256, 37007, 256, 27138, 256, 27931, 256, 28889, \r
+    256, 29662, 256, 33853, 256, 37226, 256, 39409, 256, 20098, 256, 21365, \r
+    256, 27396, 256, 29211, 256, 34349, 256, 40478, 256, 23888, 256, 28651, \r
+    256, 34253, 256, 35172, 256, 25289, 256, 33240, 256, 34847, 256, 24266, \r
+    256, 26391, 256, 28010, 256, 29436, 256, 37070, 256, 20358, 256, 20919, \r
+    256, 21214, 256, 25796, 256, 27347, 256, 29200, 256, 30439, 256, 32769, \r
+    256, 34310, 256, 34396, 256, 36335, 256, 38706, 256, 39791, 256, 40442, \r
+    256, 30860, 256, 31103, 256, 32160, 256, 33737, 256, 37636, 256, 40575, \r
+    256, 35542, 256, 22751, 256, 24324, 256, 31840, 256, 32894, 256, 29282, \r
+    256, 30922, 256, 36034, 256, 38647, 256, 22744, 256, 23650, 256, 27155, \r
+    256, 28122, 256, 28431, 256, 32047, 256, 32311, 256, 38475, 256, 21202, \r
+    256, 32907, 256, 20956, 256, 20940, 256, 31260, 256, 32190, 256, 33777, \r
+    256, 38517, 256, 35712, 256, 25295, 256, 27138, 256, 35582, 256, 20025, \r
+    256, 23527, 256, 24594, 256, 29575, 256, 30064, 256, 21271, 256, 30971, \r
+    256, 20415, 256, 24489, 256, 19981, 256, 27852, 256, 25976, 256, 32034, \r
+    256, 21443, 256, 22622, 256, 30465, 256, 33865, 256, 35498, 256, 27578, \r
+    256, 36784, 256, 27784, 256, 25342, 256, 33509, 256, 25504, 256, 30053, \r
+    256, 20142, 256, 20841, 256, 20937, 256, 26753, 256, 31975, 256, 33391, \r
+    256, 35538, 256, 37327, 256, 21237, 256, 21570, 256, 22899, 256, 24300, \r
+    256, 26053, 256, 28670, 256, 31018, 256, 38317, 256, 39530, 256, 40599, \r
+    256, 40654, 256, 21147, 256, 26310, 256, 27511, 256, 36706, 256, 24180, \r
+    256, 24976, 256, 25088, 256, 25754, 256, 28451, 256, 29001, 256, 29833, \r
+    256, 31178, 256, 32244, 256, 32879, 256, 36646, 256, 34030, 256, 36899, \r
+    256, 37706, 256, 21015, 256, 21155, 256, 21693, 256, 28872, 256, 35010, \r
+    256, 35498, 256, 24265, 256, 24565, 256, 25467, 256, 27566, 256, 31806, \r
+    256, 29557, 256, 20196, 256, 22265, 256, 23527, 256, 23994, 256, 24604, \r
+    256, 29618, 256, 29801, 256, 32666, 256, 32838, 256, 37428, 256, 38646, \r
+    256, 38728, 256, 38936, 256, 20363, 256, 31150, 256, 37300, 256, 38584, \r
+    256, 24801, 256, 20102, 256, 20698, 256, 23534, 256, 23615, 256, 26009, \r
+    256, 27138, 256, 29134, 256, 30274, 256, 34044, 256, 36988, 256, 40845, \r
+    256, 26248, 256, 38446, 256, 21129, 256, 26491, 256, 26611, 256, 27969, \r
+    256, 28316, 256, 29705, 256, 30041, 256, 30827, 256, 32016, 256, 39006, \r
+    256, 20845, 256, 25134, 256, 38520, 256, 20523, 256, 23833, 256, 28138, \r
+    256, 36650, 256, 24459, 256, 24900, 256, 26647, 256, 29575, 256, 38534, \r
+    256, 21033, 256, 21519, 256, 23653, 256, 26131, 256, 26446, 256, 26792, \r
+    256, 27877, 256, 29702, 256, 30178, 256, 32633, 256, 35023, 256, 35041, \r
+    256, 37324, 256, 38626, 256, 21311, 256, 28346, 256, 21533, 256, 29136, \r
+    256, 29848, 256, 34298, 256, 38563, 256, 40023, 256, 40607, 256, 26519, \r
+    256, 28107, 256, 33256, 256, 31435, 256, 31520, 256, 31890, 256, 29376, \r
+    256, 28825, 256, 35672, 256, 20160, 256, 33590, 256, 21050, 256, 20999, \r
+    256, 24230, 256, 25299, 256, 31958, 256, 23429, 256, 27934, 256, 26292, \r
+    256, 36667, 256, 34892, 256, 38477, 256, 35211, 256, 24275, 256, 20800, \r
+    256, 21952, 256, 22618, 256, 26228, 256, 20958, 256, 29482, 256, 30410, \r
+    256, 31036, 256, 31070, 256, 31077, 256, 31119, 256, 38742, 256, 31934, \r
+    256, 32701, 256, 34322, 256, 35576, 256, 36920, 256, 37117, 256, 39151, \r
+    256, 39164, 256, 39208, 256, 40372, 256, 20398, 256, 20711, 256, 20813, \r
+    256, 21193, 256, 21220, 256, 21329, 256, 21917, 256, 22022, 256, 22120, \r
+    256, 22592, 256, 22696, 256, 23652, 256, 23662, 256, 24724, 256, 24936, \r
+    256, 24974, 256, 25074, 256, 25935, 256, 26082, 256, 26257, 256, 26757, \r
+    256, 28023, 256, 28186, 256, 28450, 256, 29038, 256, 29227, 256, 29730, \r
+    256, 30865, 256, 31038, 256, 31049, 256, 31048, 256, 31056, 256, 31062, \r
+    256, 31069, 256, 31117, 256, 31118, 256, 31296, 256, 31361, 256, 31680, \r
+    256, 32244, 256, 32265, 256, 32321, 256, 32626, 256, 32773, 256, 33261, \r
+    256, 33401, 256, 33401, 256, 33879, 256, 35088, 256, 35222, 256, 35585, \r
+    256, 35641, 256, 36051, 256, 36104, 256, 36790, 256, 36920, 256, 38627, \r
+    256, 38911, 256, 38971, 256, 24693, 256, 148206, 256, 33304, 256, 20006, \r
+    256, 20917, 256, 20840, 256, 20352, 256, 20805, 256, 20864, 256, 21191, \r
+    256, 21242, 256, 21917, 256, 21845, 256, 21913, 256, 21986, 256, 22618, \r
+    256, 22707, 256, 22852, 256, 22868, 256, 23138, 256, 23336, 256, 24274, \r
+    256, 24281, 256, 24425, 256, 24493, 256, 24792, 256, 24910, 256, 24840, \r
+    256, 24974, 256, 24928, 256, 25074, 256, 25140, 256, 25540, 256, 25628, \r
+    256, 25682, 256, 25942, 256, 26228, 256, 26391, 256, 26395, 256, 26454, \r
+    256, 27513, 256, 27578, 256, 27969, 256, 28379, 256, 28363, 256, 28450, \r
+    256, 28702, 256, 29038, 256, 30631, 256, 29237, 256, 29359, 256, 29482, \r
+    256, 29809, 256, 29958, 256, 30011, 256, 30237, 256, 30239, 256, 30410, \r
+    256, 30427, 256, 30452, 256, 30538, 256, 30528, 256, 30924, 256, 31409, \r
+    256, 31680, 256, 31867, 256, 32091, 256, 32244, 256, 32574, 256, 32773, \r
+    256, 33618, 256, 33775, 256, 34681, 256, 35137, 256, 35206, 256, 35222, \r
+    256, 35519, 256, 35576, 256, 35531, 256, 35585, 256, 35582, 256, 35565, \r
+    256, 35641, 256, 35722, 256, 36104, 256, 36664, 256, 36978, 256, 37273, \r
+    256, 37494, 256, 38524, 256, 38627, 256, 38742, 256, 38875, 256, 38911, \r
+    256, 38923, 256, 38971, 256, 39698, 256, 40860, 256, 141386, 256, 141380, \r
+    256, 144341, 256, 15261, 256, 16408, 256, 16441, 256, 152137, 256, \r
+    154832, 256, 163539, 256, 40771, 256, 40846, 514, 102, 102, 514, 102, \r
+    105, 514, 102, 108, 770, 102, 102, 105, 770, 102, 102, 108, 514, 383, \r
+    116, 514, 115, 116, 514, 1396, 1398, 514, 1396, 1381, 514, 1396, 1387, \r
+    514, 1406, 1398, 514, 1396, 1389, 512, 1497, 1460, 512, 1522, 1463, 262, \r
+    1506, 262, 1488, 262, 1491, 262, 1492, 262, 1499, 262, 1500, 262, 1501, \r
+    262, 1512, 262, 1514, 262, 43, 512, 1513, 1473, 512, 1513, 1474, 512, \r
+    64329, 1473, 512, 64329, 1474, 512, 1488, 1463, 512, 1488, 1464, 512, \r
+    1488, 1468, 512, 1489, 1468, 512, 1490, 1468, 512, 1491, 1468, 512, 1492, \r
+    1468, 512, 1493, 1468, 512, 1494, 1468, 512, 1496, 1468, 512, 1497, 1468, \r
+    512, 1498, 1468, 512, 1499, 1468, 512, 1500, 1468, 512, 1502, 1468, 512, \r
+    1504, 1468, 512, 1505, 1468, 512, 1507, 1468, 512, 1508, 1468, 512, 1510, \r
+    1468, 512, 1511, 1468, 512, 1512, 1468, 512, 1513, 1468, 512, 1514, 1468, \r
+    512, 1493, 1465, 512, 1489, 1471, 512, 1499, 1471, 512, 1508, 1471, 514, \r
+    1488, 1500, 267, 1649, 268, 1649, 267, 1659, 268, 1659, 269, 1659, 270, \r
+    1659, 267, 1662, 268, 1662, 269, 1662, 270, 1662, 267, 1664, 268, 1664, \r
+    269, 1664, 270, 1664, 267, 1658, 268, 1658, 269, 1658, 270, 1658, 267, \r
+    1663, 268, 1663, 269, 1663, 270, 1663, 267, 1657, 268, 1657, 269, 1657, \r
+    270, 1657, 267, 1700, 268, 1700, 269, 1700, 270, 1700, 267, 1702, 268, \r
+    1702, 269, 1702, 270, 1702, 267, 1668, 268, 1668, 269, 1668, 270, 1668, \r
+    267, 1667, 268, 1667, 269, 1667, 270, 1667, 267, 1670, 268, 1670, 269, \r
+    1670, 270, 1670, 267, 1671, 268, 1671, 269, 1671, 270, 1671, 267, 1677, \r
+    268, 1677, 267, 1676, 268, 1676, 267, 1678, 268, 1678, 267, 1672, 268, \r
+    1672, 267, 1688, 268, 1688, 267, 1681, 268, 1681, 267, 1705, 268, 1705, \r
+    269, 1705, 270, 1705, 267, 1711, 268, 1711, 269, 1711, 270, 1711, 267, \r
+    1715, 268, 1715, 269, 1715, 270, 1715, 267, 1713, 268, 1713, 269, 1713, \r
+    270, 1713, 267, 1722, 268, 1722, 267, 1723, 268, 1723, 269, 1723, 270, \r
+    1723, 267, 1728, 268, 1728, 267, 1729, 268, 1729, 269, 1729, 270, 1729, \r
+    267, 1726, 268, 1726, 269, 1726, 270, 1726, 267, 1746, 268, 1746, 267, \r
+    1747, 268, 1747, 267, 1709, 268, 1709, 269, 1709, 270, 1709, 267, 1735, \r
+    268, 1735, 267, 1734, 268, 1734, 267, 1736, 268, 1736, 267, 1655, 267, \r
+    1739, 268, 1739, 267, 1733, 268, 1733, 267, 1737, 268, 1737, 267, 1744, \r
+    268, 1744, 269, 1744, 270, 1744, 269, 1609, 270, 1609, 523, 1574, 1575, \r
+    524, 1574, 1575, 523, 1574, 1749, 524, 1574, 1749, 523, 1574, 1608, 524, \r
+    1574, 1608, 523, 1574, 1735, 524, 1574, 1735, 523, 1574, 1734, 524, 1574, \r
+    1734, 523, 1574, 1736, 524, 1574, 1736, 523, 1574, 1744, 524, 1574, 1744, \r
+    525, 1574, 1744, 523, 1574, 1609, 524, 1574, 1609, 525, 1574, 1609, 267, \r
+    1740, 268, 1740, 269, 1740, 270, 1740, 523, 1574, 1580, 523, 1574, 1581, \r
+    523, 1574, 1605, 523, 1574, 1609, 523, 1574, 1610, 523, 1576, 1580, 523, \r
+    1576, 1581, 523, 1576, 1582, 523, 1576, 1605, 523, 1576, 1609, 523, 1576, \r
+    1610, 523, 1578, 1580, 523, 1578, 1581, 523, 1578, 1582, 523, 1578, 1605, \r
+    523, 1578, 1609, 523, 1578, 1610, 523, 1579, 1580, 523, 1579, 1605, 523, \r
+    1579, 1609, 523, 1579, 1610, 523, 1580, 1581, 523, 1580, 1605, 523, 1581, \r
+    1580, 523, 1581, 1605, 523, 1582, 1580, 523, 1582, 1581, 523, 1582, 1605, \r
+    523, 1587, 1580, 523, 1587, 1581, 523, 1587, 1582, 523, 1587, 1605, 523, \r
+    1589, 1581, 523, 1589, 1605, 523, 1590, 1580, 523, 1590, 1581, 523, 1590, \r
+    1582, 523, 1590, 1605, 523, 1591, 1581, 523, 1591, 1605, 523, 1592, 1605, \r
+    523, 1593, 1580, 523, 1593, 1605, 523, 1594, 1580, 523, 1594, 1605, 523, \r
+    1601, 1580, 523, 1601, 1581, 523, 1601, 1582, 523, 1601, 1605, 523, 1601, \r
+    1609, 523, 1601, 1610, 523, 1602, 1581, 523, 1602, 1605, 523, 1602, 1609, \r
+    523, 1602, 1610, 523, 1603, 1575, 523, 1603, 1580, 523, 1603, 1581, 523, \r
+    1603, 1582, 523, 1603, 1604, 523, 1603, 1605, 523, 1603, 1609, 523, 1603, \r
+    1610, 523, 1604, 1580, 523, 1604, 1581, 523, 1604, 1582, 523, 1604, 1605, \r
+    523, 1604, 1609, 523, 1604, 1610, 523, 1605, 1580, 523, 1605, 1581, 523, \r
+    1605, 1582, 523, 1605, 1605, 523, 1605, 1609, 523, 1605, 1610, 523, 1606, \r
+    1580, 523, 1606, 1581, 523, 1606, 1582, 523, 1606, 1605, 523, 1606, 1609, \r
+    523, 1606, 1610, 523, 1607, 1580, 523, 1607, 1605, 523, 1607, 1609, 523, \r
+    1607, 1610, 523, 1610, 1580, 523, 1610, 1581, 523, 1610, 1582, 523, 1610, \r
+    1605, 523, 1610, 1609, 523, 1610, 1610, 523, 1584, 1648, 523, 1585, 1648, \r
+    523, 1609, 1648, 779, 32, 1612, 1617, 779, 32, 1613, 1617, 779, 32, 1614, \r
+    1617, 779, 32, 1615, 1617, 779, 32, 1616, 1617, 779, 32, 1617, 1648, 524, \r
+    1574, 1585, 524, 1574, 1586, 524, 1574, 1605, 524, 1574, 1606, 524, 1574, \r
+    1609, 524, 1574, 1610, 524, 1576, 1585, 524, 1576, 1586, 524, 1576, 1605, \r
+    524, 1576, 1606, 524, 1576, 1609, 524, 1576, 1610, 524, 1578, 1585, 524, \r
+    1578, 1586, 524, 1578, 1605, 524, 1578, 1606, 524, 1578, 1609, 524, 1578, \r
+    1610, 524, 1579, 1585, 524, 1579, 1586, 524, 1579, 1605, 524, 1579, 1606, \r
+    524, 1579, 1609, 524, 1579, 1610, 524, 1601, 1609, 524, 1601, 1610, 524, \r
+    1602, 1609, 524, 1602, 1610, 524, 1603, 1575, 524, 1603, 1604, 524, 1603, \r
+    1605, 524, 1603, 1609, 524, 1603, 1610, 524, 1604, 1605, 524, 1604, 1609, \r
+    524, 1604, 1610, 524, 1605, 1575, 524, 1605, 1605, 524, 1606, 1585, 524, \r
+    1606, 1586, 524, 1606, 1605, 524, 1606, 1606, 524, 1606, 1609, 524, 1606, \r
+    1610, 524, 1609, 1648, 524, 1610, 1585, 524, 1610, 1586, 524, 1610, 1605, \r
+    524, 1610, 1606, 524, 1610, 1609, 524, 1610, 1610, 525, 1574, 1580, 525, \r
+    1574, 1581, 525, 1574, 1582, 525, 1574, 1605, 525, 1574, 1607, 525, 1576, \r
+    1580, 525, 1576, 1581, 525, 1576, 1582, 525, 1576, 1605, 525, 1576, 1607, \r
+    525, 1578, 1580, 525, 1578, 1581, 525, 1578, 1582, 525, 1578, 1605, 525, \r
+    1578, 1607, 525, 1579, 1605, 525, 1580, 1581, 525, 1580, 1605, 525, 1581, \r
+    1580, 525, 1581, 1605, 525, 1582, 1580, 525, 1582, 1605, 525, 1587, 1580, \r
+    525, 1587, 1581, 525, 1587, 1582, 525, 1587, 1605, 525, 1589, 1581, 525, \r
+    1589, 1582, 525, 1589, 1605, 525, 1590, 1580, 525, 1590, 1581, 525, 1590, \r
+    1582, 525, 1590, 1605, 525, 1591, 1581, 525, 1592, 1605, 525, 1593, 1580, \r
+    525, 1593, 1605, 525, 1594, 1580, 525, 1594, 1605, 525, 1601, 1580, 525, \r
+    1601, 1581, 525, 1601, 1582, 525, 1601, 1605, 525, 1602, 1581, 525, 1602, \r
+    1605, 525, 1603, 1580, 525, 1603, 1581, 525, 1603, 1582, 525, 1603, 1604, \r
+    525, 1603, 1605, 525, 1604, 1580, 525, 1604, 1581, 525, 1604, 1582, 525, \r
+    1604, 1605, 525, 1604, 1607, 525, 1605, 1580, 525, 1605, 1581, 525, 1605, \r
+    1582, 525, 1605, 1605, 525, 1606, 1580, 525, 1606, 1581, 525, 1606, 1582, \r
+    525, 1606, 1605, 525, 1606, 1607, 525, 1607, 1580, 525, 1607, 1605, 525, \r
+    1607, 1648, 525, 1610, 1580, 525, 1610, 1581, 525, 1610, 1582, 525, 1610, \r
+    1605, 525, 1610, 1607, 526, 1574, 1605, 526, 1574, 1607, 526, 1576, 1605, \r
+    526, 1576, 1607, 526, 1578, 1605, 526, 1578, 1607, 526, 1579, 1605, 526, \r
+    1579, 1607, 526, 1587, 1605, 526, 1587, 1607, 526, 1588, 1605, 526, 1588, \r
+    1607, 526, 1603, 1604, 526, 1603, 1605, 526, 1604, 1605, 526, 1606, 1605, \r
+    526, 1606, 1607, 526, 1610, 1605, 526, 1610, 1607, 782, 1600, 1614, 1617, \r
+    782, 1600, 1615, 1617, 782, 1600, 1616, 1617, 523, 1591, 1609, 523, 1591, \r
+    1610, 523, 1593, 1609, 523, 1593, 1610, 523, 1594, 1609, 523, 1594, 1610, \r
+    523, 1587, 1609, 523, 1587, 1610, 523, 1588, 1609, 523, 1588, 1610, 523, \r
+    1581, 1609, 523, 1581, 1610, 523, 1580, 1609, 523, 1580, 1610, 523, 1582, \r
+    1609, 523, 1582, 1610, 523, 1589, 1609, 523, 1589, 1610, 523, 1590, 1609, \r
+    523, 1590, 1610, 523, 1588, 1580, 523, 1588, 1581, 523, 1588, 1582, 523, \r
+    1588, 1605, 523, 1588, 1585, 523, 1587, 1585, 523, 1589, 1585, 523, 1590, \r
+    1585, 524, 1591, 1609, 524, 1591, 1610, 524, 1593, 1609, 524, 1593, 1610, \r
+    524, 1594, 1609, 524, 1594, 1610, 524, 1587, 1609, 524, 1587, 1610, 524, \r
+    1588, 1609, 524, 1588, 1610, 524, 1581, 1609, 524, 1581, 1610, 524, 1580, \r
+    1609, 524, 1580, 1610, 524, 1582, 1609, 524, 1582, 1610, 524, 1589, 1609, \r
+    524, 1589, 1610, 524, 1590, 1609, 524, 1590, 1610, 524, 1588, 1580, 524, \r
+    1588, 1581, 524, 1588, 1582, 524, 1588, 1605, 524, 1588, 1585, 524, 1587, \r
+    1585, 524, 1589, 1585, 524, 1590, 1585, 525, 1588, 1580, 525, 1588, 1581, \r
+    525, 1588, 1582, 525, 1588, 1605, 525, 1587, 1607, 525, 1588, 1607, 525, \r
+    1591, 1605, 526, 1587, 1580, 526, 1587, 1581, 526, 1587, 1582, 526, 1588, \r
+    1580, 526, 1588, 1581, 526, 1588, 1582, 526, 1591, 1605, 526, 1592, 1605, \r
+    524, 1575, 1611, 523, 1575, 1611, 781, 1578, 1580, 1605, 780, 1578, 1581, \r
+    1580, 781, 1578, 1581, 1580, 781, 1578, 1581, 1605, 781, 1578, 1582, \r
+    1605, 781, 1578, 1605, 1580, 781, 1578, 1605, 1581, 781, 1578, 1605, \r
+    1582, 780, 1580, 1605, 1581, 781, 1580, 1605, 1581, 780, 1581, 1605, \r
+    1610, 780, 1581, 1605, 1609, 781, 1587, 1581, 1580, 781, 1587, 1580, \r
+    1581, 780, 1587, 1580, 1609, 780, 1587, 1605, 1581, 781, 1587, 1605, \r
+    1581, 781, 1587, 1605, 1580, 780, 1587, 1605, 1605, 781, 1587, 1605, \r
+    1605, 780, 1589, 1581, 1581, 781, 1589, 1581, 1581, 780, 1589, 1605, \r
+    1605, 780, 1588, 1581, 1605, 781, 1588, 1581, 1605, 780, 1588, 1580, \r
+    1610, 780, 1588, 1605, 1582, 781, 1588, 1605, 1582, 780, 1588, 1605, \r
+    1605, 781, 1588, 1605, 1605, 780, 1590, 1581, 1609, 780, 1590, 1582, \r
+    1605, 781, 1590, 1582, 1605, 780, 1591, 1605, 1581, 781, 1591, 1605, \r
+    1581, 781, 1591, 1605, 1605, 780, 1591, 1605, 1610, 780, 1593, 1580, \r
+    1605, 780, 1593, 1605, 1605, 781, 1593, 1605, 1605, 780, 1593, 1605, \r
+    1609, 780, 1594, 1605, 1605, 780, 1594, 1605, 1610, 780, 1594, 1605, \r
+    1609, 780, 1601, 1582, 1605, 781, 1601, 1582, 1605, 780, 1602, 1605, \r
+    1581, 780, 1602, 1605, 1605, 780, 1604, 1581, 1605, 780, 1604, 1581, \r
+    1610, 780, 1604, 1581, 1609, 781, 1604, 1580, 1580, 780, 1604, 1580, \r
+    1580, 780, 1604, 1582, 1605, 781, 1604, 1582, 1605, 780, 1604, 1605, \r
+    1581, 781, 1604, 1605, 1581, 781, 1605, 1581, 1580, 781, 1605, 1581, \r
+    1605, 780, 1605, 1581, 1610, 781, 1605, 1580, 1581, 781, 1605, 1580, \r
+    1605, 781, 1605, 1582, 1580, 781, 1605, 1582, 1605, 781, 1605, 1580, \r
+    1582, 781, 1607, 1605, 1580, 781, 1607, 1605, 1605, 781, 1606, 1581, \r
+    1605, 780, 1606, 1581, 1609, 780, 1606, 1580, 1605, 781, 1606, 1580, \r
+    1605, 780, 1606, 1580, 1609, 780, 1606, 1605, 1610, 780, 1606, 1605, \r
+    1609, 780, 1610, 1605, 1605, 781, 1610, 1605, 1605, 780, 1576, 1582, \r
+    1610, 780, 1578, 1580, 1610, 780, 1578, 1580, 1609, 780, 1578, 1582, \r
+    1610, 780, 1578, 1582, 1609, 780, 1578, 1605, 1610, 780, 1578, 1605, \r
+    1609, 780, 1580, 1605, 1610, 780, 1580, 1581, 1609, 780, 1580, 1605, \r
+    1609, 780, 1587, 1582, 1609, 780, 1589, 1581, 1610, 780, 1588, 1581, \r
+    1610, 780, 1590, 1581, 1610, 780, 1604, 1580, 1610, 780, 1604, 1605, \r
+    1610, 780, 1610, 1581, 1610, 780, 1610, 1580, 1610, 780, 1610, 1605, \r
+    1610, 780, 1605, 1605, 1610, 780, 1602, 1605, 1610, 780, 1606, 1581, \r
+    1610, 781, 1602, 1605, 1581, 781, 1604, 1581, 1605, 780, 1593, 1605, \r
+    1610, 780, 1603, 1605, 1610, 781, 1606, 1580, 1581, 780, 1605, 1582, \r
+    1610, 781, 1604, 1580, 1605, 780, 1603, 1605, 1605, 780, 1604, 1580, \r
+    1605, 780, 1606, 1580, 1581, 780, 1580, 1581, 1610, 780, 1581, 1580, \r
+    1610, 780, 1605, 1580, 1610, 780, 1601, 1605, 1610, 780, 1576, 1581, \r
+    1610, 781, 1603, 1605, 1605, 781, 1593, 1580, 1605, 781, 1589, 1605, \r
+    1605, 780, 1587, 1582, 1610, 780, 1606, 1580, 1610, 779, 1589, 1604, \r
+    1746, 779, 1602, 1604, 1746, 1035, 1575, 1604, 1604, 1607, 1035, 1575, \r
+    1603, 1576, 1585, 1035, 1605, 1581, 1605, 1583, 1035, 1589, 1604, 1593, \r
+    1605, 1035, 1585, 1587, 1608, 1604, 1035, 1593, 1604, 1610, 1607, 1035, \r
+    1608, 1587, 1604, 1605, 779, 1589, 1604, 1609, 4619, 1589, 1604, 1609, \r
+    32, 1575, 1604, 1604, 1607, 32, 1593, 1604, 1610, 1607, 32, 1608, 1587, \r
+    1604, 1605, 2059, 1580, 1604, 32, 1580, 1604, 1575, 1604, 1607, 1035, \r
+    1585, 1740, 1575, 1604, 265, 44, 265, 12289, 265, 12290, 265, 58, 265, \r
+    59, 265, 33, 265, 63, 265, 12310, 265, 12311, 265, 8230, 265, 8229, 265, \r
+    8212, 265, 8211, 265, 95, 265, 95, 265, 40, 265, 41, 265, 123, 265, 125, \r
+    265, 12308, 265, 12309, 265, 12304, 265, 12305, 265, 12298, 265, 12299, \r
+    265, 12296, 265, 12297, 265, 12300, 265, 12301, 265, 12302, 265, 12303, \r
+    265, 91, 265, 93, 258, 8254, 258, 8254, 258, 8254, 258, 8254, 258, 95, \r
+    258, 95, 258, 95, 271, 44, 271, 12289, 271, 46, 271, 59, 271, 58, 271, \r
+    63, 271, 33, 271, 8212, 271, 40, 271, 41, 271, 123, 271, 125, 271, 12308, \r
+    271, 12309, 271, 35, 271, 38, 271, 42, 271, 43, 271, 45, 271, 60, 271, \r
+    62, 271, 61, 271, 92, 271, 36, 271, 37, 271, 64, 523, 32, 1611, 526, \r
+    1600, 1611, 523, 32, 1612, 523, 32, 1613, 523, 32, 1614, 526, 1600, 1614, \r
+    523, 32, 1615, 526, 1600, 1615, 523, 32, 1616, 526, 1600, 1616, 523, 32, \r
+    1617, 526, 1600, 1617, 523, 32, 1618, 526, 1600, 1618, 267, 1569, 267, \r
+    1570, 268, 1570, 267, 1571, 268, 1571, 267, 1572, 268, 1572, 267, 1573, \r
+    268, 1573, 267, 1574, 268, 1574, 269, 1574, 270, 1574, 267, 1575, 268, \r
+    1575, 267, 1576, 268, 1576, 269, 1576, 270, 1576, 267, 1577, 268, 1577, \r
+    267, 1578, 268, 1578, 269, 1578, 270, 1578, 267, 1579, 268, 1579, 269, \r
+    1579, 270, 1579, 267, 1580, 268, 1580, 269, 1580, 270, 1580, 267, 1581, \r
+    268, 1581, 269, 1581, 270, 1581, 267, 1582, 268, 1582, 269, 1582, 270, \r
+    1582, 267, 1583, 268, 1583, 267, 1584, 268, 1584, 267, 1585, 268, 1585, \r
+    267, 1586, 268, 1586, 267, 1587, 268, 1587, 269, 1587, 270, 1587, 267, \r
+    1588, 268, 1588, 269, 1588, 270, 1588, 267, 1589, 268, 1589, 269, 1589, \r
+    270, 1589, 267, 1590, 268, 1590, 269, 1590, 270, 1590, 267, 1591, 268, \r
+    1591, 269, 1591, 270, 1591, 267, 1592, 268, 1592, 269, 1592, 270, 1592, \r
+    267, 1593, 268, 1593, 269, 1593, 270, 1593, 267, 1594, 268, 1594, 269, \r
+    1594, 270, 1594, 267, 1601, 268, 1601, 269, 1601, 270, 1601, 267, 1602, \r
+    268, 1602, 269, 1602, 270, 1602, 267, 1603, 268, 1603, 269, 1603, 270, \r
+    1603, 267, 1604, 268, 1604, 269, 1604, 270, 1604, 267, 1605, 268, 1605, \r
+    269, 1605, 270, 1605, 267, 1606, 268, 1606, 269, 1606, 270, 1606, 267, \r
+    1607, 268, 1607, 269, 1607, 270, 1607, 267, 1608, 268, 1608, 267, 1609, \r
+    268, 1609, 267, 1610, 268, 1610, 269, 1610, 270, 1610, 523, 1604, 1570, \r
+    524, 1604, 1570, 523, 1604, 1571, 524, 1604, 1571, 523, 1604, 1573, 524, \r
+    1604, 1573, 523, 1604, 1575, 524, 1604, 1575, 264, 33, 264, 34, 264, 35, \r
+    264, 36, 264, 37, 264, 38, 264, 39, 264, 40, 264, 41, 264, 42, 264, 43, \r
+    264, 44, 264, 45, 264, 46, 264, 47, 264, 48, 264, 49, 264, 50, 264, 51, \r
+    264, 52, 264, 53, 264, 54, 264, 55, 264, 56, 264, 57, 264, 58, 264, 59, \r
+    264, 60, 264, 61, 264, 62, 264, 63, 264, 64, 264, 65, 264, 66, 264, 67, \r
+    264, 68, 264, 69, 264, 70, 264, 71, 264, 72, 264, 73, 264, 74, 264, 75, \r
+    264, 76, 264, 77, 264, 78, 264, 79, 264, 80, 264, 81, 264, 82, 264, 83, \r
+    264, 84, 264, 85, 264, 86, 264, 87, 264, 88, 264, 89, 264, 90, 264, 91, \r
+    264, 92, 264, 93, 264, 94, 264, 95, 264, 96, 264, 97, 264, 98, 264, 99, \r
+    264, 100, 264, 101, 264, 102, 264, 103, 264, 104, 264, 105, 264, 106, \r
+    264, 107, 264, 108, 264, 109, 264, 110, 264, 111, 264, 112, 264, 113, \r
+    264, 114, 264, 115, 264, 116, 264, 117, 264, 118, 264, 119, 264, 120, \r
+    264, 121, 264, 122, 264, 123, 264, 124, 264, 125, 264, 126, 264, 10629, \r
+    264, 10630, 272, 12290, 272, 12300, 272, 12301, 272, 12289, 272, 12539, \r
+    272, 12530, 272, 12449, 272, 12451, 272, 12453, 272, 12455, 272, 12457, \r
+    272, 12515, 272, 12517, 272, 12519, 272, 12483, 272, 12540, 272, 12450, \r
+    272, 12452, 272, 12454, 272, 12456, 272, 12458, 272, 12459, 272, 12461, \r
+    272, 12463, 272, 12465, 272, 12467, 272, 12469, 272, 12471, 272, 12473, \r
+    272, 12475, 272, 12477, 272, 12479, 272, 12481, 272, 12484, 272, 12486, \r
+    272, 12488, 272, 12490, 272, 12491, 272, 12492, 272, 12493, 272, 12494, \r
+    272, 12495, 272, 12498, 272, 12501, 272, 12504, 272, 12507, 272, 12510, \r
+    272, 12511, 272, 12512, 272, 12513, 272, 12514, 272, 12516, 272, 12518, \r
+    272, 12520, 272, 12521, 272, 12522, 272, 12523, 272, 12524, 272, 12525, \r
+    272, 12527, 272, 12531, 272, 12441, 272, 12442, 272, 12644, 272, 12593, \r
+    272, 12594, 272, 12595, 272, 12596, 272, 12597, 272, 12598, 272, 12599, \r
+    272, 12600, 272, 12601, 272, 12602, 272, 12603, 272, 12604, 272, 12605, \r
+    272, 12606, 272, 12607, 272, 12608, 272, 12609, 272, 12610, 272, 12611, \r
+    272, 12612, 272, 12613, 272, 12614, 272, 12615, 272, 12616, 272, 12617, \r
+    272, 12618, 272, 12619, 272, 12620, 272, 12621, 272, 12622, 272, 12623, \r
+    272, 12624, 272, 12625, 272, 12626, 272, 12627, 272, 12628, 272, 12629, \r
+    272, 12630, 272, 12631, 272, 12632, 272, 12633, 272, 12634, 272, 12635, \r
+    272, 12636, 272, 12637, 272, 12638, 272, 12639, 272, 12640, 272, 12641, \r
+    272, 12642, 272, 12643, 264, 162, 264, 163, 264, 172, 264, 175, 264, 166, \r
+    264, 165, 264, 8361, 272, 9474, 272, 8592, 272, 8593, 272, 8594, 272, \r
+    8595, 272, 9632, 272, 9675, 512, 69785, 69818, 512, 69787, 69818, 512, \r
+    69797, 69818, 512, 119127, 119141, 512, 119128, 119141, 512, 119135, \r
+    119150, 512, 119135, 119151, 512, 119135, 119152, 512, 119135, 119153, \r
+    512, 119135, 119154, 512, 119225, 119141, 512, 119226, 119141, 512, \r
+    119227, 119150, 512, 119228, 119150, 512, 119227, 119151, 512, 119228, \r
+    119151, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, \r
+    262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, \r
+    262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, \r
+    262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, \r
+    262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, \r
+    262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, \r
+    262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, \r
+    262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, \r
+    262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, \r
+    262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, \r
+    262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, \r
+    102, 262, 103, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, \r
+    110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, \r
+    117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, \r
+    262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, \r
+    262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, \r
+    262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, \r
+    262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, \r
+    104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, \r
+    111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, \r
+    118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 67, 262, 68, \r
+    262, 71, 262, 74, 262, 75, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, \r
+    262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, \r
+    262, 98, 262, 99, 262, 100, 262, 102, 262, 104, 262, 105, 262, 106, 262, \r
+    107, 262, 108, 262, 109, 262, 110, 262, 112, 262, 113, 262, 114, 262, \r
+    115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, \r
+    122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, \r
+    72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, \r
+    80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, \r
+    88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, \r
+    102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, \r
+    109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, \r
+    116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, \r
+    262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 74, 262, 75, 262, 76, \r
+    262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 83, 262, 84, 262, 85, \r
+    262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, \r
+    262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, \r
+    262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, \r
+    262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, \r
+    262, 122, 262, 65, 262, 66, 262, 68, 262, 69, 262, 70, 262, 71, 262, 73, \r
+    262, 74, 262, 75, 262, 76, 262, 77, 262, 79, 262, 83, 262, 84, 262, 85, \r
+    262, 86, 262, 87, 262, 88, 262, 89, 262, 97, 262, 98, 262, 99, 262, 100, \r
+    262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, \r
+    262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, \r
+    262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, \r
+    262, 122, 262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, \r
+    262, 72, 262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, \r
+    262, 80, 262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, \r
+    262, 88, 262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, \r
+    262, 102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, \r
+    262, 109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, \r
+    262, 116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, \r
+    262, 65, 262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, \r
+    262, 73, 262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, \r
+    262, 81, 262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, \r
+    262, 89, 262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, \r
+    102, 262, 103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, \r
+    109, 262, 110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, \r
+    116, 262, 117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, \r
+    262, 66, 262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, \r
+    262, 74, 262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, \r
+    262, 82, 262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, \r
+    262, 90, 262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, \r
+    103, 262, 104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, \r
+    110, 262, 111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, \r
+    117, 262, 118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, \r
+    262, 67, 262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, \r
+    262, 75, 262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, \r
+    262, 83, 262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, \r
+    262, 97, 262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, \r
+    104, 262, 105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, \r
+    111, 262, 112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, \r
+    118, 262, 119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, \r
+    262, 68, 262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, \r
+    262, 76, 262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, \r
+    262, 84, 262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, \r
+    262, 98, 262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, \r
+    105, 262, 106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, \r
+    112, 262, 113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, \r
+    119, 262, 120, 262, 121, 262, 122, 262, 65, 262, 66, 262, 67, 262, 68, \r
+    262, 69, 262, 70, 262, 71, 262, 72, 262, 73, 262, 74, 262, 75, 262, 76, \r
+    262, 77, 262, 78, 262, 79, 262, 80, 262, 81, 262, 82, 262, 83, 262, 84, \r
+    262, 85, 262, 86, 262, 87, 262, 88, 262, 89, 262, 90, 262, 97, 262, 98, \r
+    262, 99, 262, 100, 262, 101, 262, 102, 262, 103, 262, 104, 262, 105, 262, \r
+    106, 262, 107, 262, 108, 262, 109, 262, 110, 262, 111, 262, 112, 262, \r
+    113, 262, 114, 262, 115, 262, 116, 262, 117, 262, 118, 262, 119, 262, \r
+    120, 262, 121, 262, 122, 262, 305, 262, 567, 262, 913, 262, 914, 262, \r
+    915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, \r
+    922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, \r
+    929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, \r
+    936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, \r
+    949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, \r
+    956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, \r
+    963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, \r
+    8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, \r
+    913, 262, 914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, \r
+    920, 262, 921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, \r
+    927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, \r
+    934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, \r
+    947, 262, 948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, \r
+    954, 262, 955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, \r
+    961, 262, 962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, \r
+    968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, \r
+    1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, 916, 262, 917, 262, \r
+    918, 262, 919, 262, 920, 262, 921, 262, 922, 262, 923, 262, 924, 262, \r
+    925, 262, 926, 262, 927, 262, 928, 262, 929, 262, 1012, 262, 931, 262, \r
+    932, 262, 933, 262, 934, 262, 935, 262, 936, 262, 937, 262, 8711, 262, \r
+    945, 262, 946, 262, 947, 262, 948, 262, 949, 262, 950, 262, 951, 262, \r
+    952, 262, 953, 262, 954, 262, 955, 262, 956, 262, 957, 262, 958, 262, \r
+    959, 262, 960, 262, 961, 262, 962, 262, 963, 262, 964, 262, 965, 262, \r
+    966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, 1013, 262, 977, 262, \r
+    1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, 914, 262, 915, 262, \r
+    916, 262, 917, 262, 918, 262, 919, 262, 920, 262, 921, 262, 922, 262, \r
+    923, 262, 924, 262, 925, 262, 926, 262, 927, 262, 928, 262, 929, 262, \r
+    1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, 935, 262, 936, 262, \r
+    937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, 948, 262, 949, 262, \r
+    950, 262, 951, 262, 952, 262, 953, 262, 954, 262, 955, 262, 956, 262, \r
+    957, 262, 958, 262, 959, 262, 960, 262, 961, 262, 962, 262, 963, 262, \r
+    964, 262, 965, 262, 966, 262, 967, 262, 968, 262, 969, 262, 8706, 262, \r
+    1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, 982, 262, 913, 262, \r
+    914, 262, 915, 262, 916, 262, 917, 262, 918, 262, 919, 262, 920, 262, \r
+    921, 262, 922, 262, 923, 262, 924, 262, 925, 262, 926, 262, 927, 262, \r
+    928, 262, 929, 262, 1012, 262, 931, 262, 932, 262, 933, 262, 934, 262, \r
+    935, 262, 936, 262, 937, 262, 8711, 262, 945, 262, 946, 262, 947, 262, \r
+    948, 262, 949, 262, 950, 262, 951, 262, 952, 262, 953, 262, 954, 262, \r
+    955, 262, 956, 262, 957, 262, 958, 262, 959, 262, 960, 262, 961, 262, \r
+    962, 262, 963, 262, 964, 262, 965, 262, 966, 262, 967, 262, 968, 262, \r
+    969, 262, 8706, 262, 1013, 262, 977, 262, 1008, 262, 981, 262, 1009, 262, \r
+    982, 262, 988, 262, 989, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, \r
+    262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, \r
+    262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 262, 48, \r
+    262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, 262, 55, 262, 56, \r
+    262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, 262, 53, 262, 54, \r
+    262, 55, 262, 56, 262, 57, 262, 48, 262, 49, 262, 50, 262, 51, 262, 52, \r
+    262, 53, 262, 54, 262, 55, 262, 56, 262, 57, 514, 48, 46, 514, 48, 44, \r
+    514, 49, 44, 514, 50, 44, 514, 51, 44, 514, 52, 44, 514, 53, 44, 514, 54, \r
+    44, 514, 55, 44, 514, 56, 44, 514, 57, 44, 770, 40, 65, 41, 770, 40, 66, \r
+    41, 770, 40, 67, 41, 770, 40, 68, 41, 770, 40, 69, 41, 770, 40, 70, 41, \r
+    770, 40, 71, 41, 770, 40, 72, 41, 770, 40, 73, 41, 770, 40, 74, 41, 770, \r
+    40, 75, 41, 770, 40, 76, 41, 770, 40, 77, 41, 770, 40, 78, 41, 770, 40, \r
+    79, 41, 770, 40, 80, 41, 770, 40, 81, 41, 770, 40, 82, 41, 770, 40, 83, \r
+    41, 770, 40, 84, 41, 770, 40, 85, 41, 770, 40, 86, 41, 770, 40, 87, 41, \r
+    770, 40, 88, 41, 770, 40, 89, 41, 770, 40, 90, 41, 770, 12308, 83, 12309, \r
+    263, 67, 263, 82, 519, 67, 68, 519, 87, 90, 266, 66, 266, 78, 266, 80, \r
+    266, 83, 266, 87, 522, 72, 86, 522, 77, 86, 522, 83, 68, 522, 83, 83, \r
+    778, 80, 80, 86, 522, 68, 74, 522, 12411, 12363, 266, 25163, 266, 23383, \r
+    266, 21452, 266, 12487, 266, 20108, 266, 22810, 266, 35299, 266, 22825, \r
+    266, 20132, 266, 26144, 266, 28961, 266, 26009, 266, 21069, 266, 24460, \r
+    266, 20877, 266, 26032, 266, 21021, 266, 32066, 266, 29983, 266, 36009, \r
+    266, 22768, 266, 21561, 266, 28436, 266, 25237, 266, 25429, 266, 19968, \r
+    266, 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, \r
+    266, 36208, 266, 25171, 770, 12308, 26412, 12309, 770, 12308, 19977, \r
+    12309, 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, \r
+    28857, 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, \r
+    12308, 21213, 12309, 770, 12308, 25943, 12309, 256, 20029, 256, 20024, \r
+    256, 20033, 256, 131362, 256, 20320, 256, 20398, 256, 20411, 256, 20482, \r
+    256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, 132666, \r
+    256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 132380, 256, 13497, \r
+    256, 20839, 256, 20877, 256, 132427, 256, 20887, 256, 20900, 256, 20172, \r
+    256, 20908, 256, 20917, 256, 168415, 256, 20981, 256, 20995, 256, 13535, \r
+    256, 21051, 256, 21062, 256, 21106, 256, 21111, 256, 13589, 256, 21191, \r
+    256, 21193, 256, 21220, 256, 21242, 256, 21253, 256, 21254, 256, 21271, \r
+    256, 21321, 256, 21329, 256, 21338, 256, 21363, 256, 21373, 256, 21375, \r
+    256, 21375, 256, 21375, 256, 133676, 256, 28784, 256, 21450, 256, 21471, \r
+    256, 133987, 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, \r
+    256, 21576, 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, \r
+    256, 21859, 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, \r
+    256, 21954, 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, \r
+    256, 20999, 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, \r
+    256, 22578, 256, 22577, 256, 22700, 256, 136420, 256, 22770, 256, 22775, \r
+    256, 22790, 256, 22810, 256, 22818, 256, 22882, 256, 136872, 256, 136938, \r
+    256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, \r
+    256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 137672, 256, 23491, \r
+    256, 23512, 256, 23527, 256, 23539, 256, 138008, 256, 23551, 256, 23558, \r
+    256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, \r
+    256, 23693, 256, 138724, 256, 23875, 256, 138726, 256, 23918, 256, 23915, \r
+    256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061, 256, 24104, \r
+    256, 24125, 256, 24169, 256, 14434, 256, 139651, 256, 14460, 256, 24240, \r
+    256, 24243, 256, 24246, 256, 24266, 256, 172946, 256, 24318, 256, 140081, \r
+    256, 140081, 256, 33281, 256, 24354, 256, 24354, 256, 14535, 256, 144056, \r
+    256, 156122, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, \r
+    256, 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, \r
+    256, 141012, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, \r
+    256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, \r
+    256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, \r
+    256, 25300, 256, 25424, 256, 142092, 256, 25405, 256, 25340, 256, 25448, \r
+    256, 25475, 256, 25572, 256, 142321, 256, 25634, 256, 25541, 256, 25513, \r
+    256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, \r
+    256, 25935, 256, 25964, 256, 143370, 256, 26083, 256, 26360, 256, 26185, \r
+    256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, \r
+    256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, \r
+    256, 26401, 256, 26462, 256, 26451, 256, 144323, 256, 15177, 256, 26618, \r
+    256, 26501, 256, 26706, 256, 26757, 256, 144493, 256, 26766, 256, 26655, \r
+    256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, 256, 27304, \r
+    256, 145059, 256, 27355, 256, 15384, 256, 27425, 256, 145575, 256, 27476, \r
+    256, 15438, 256, 27506, 256, 27551, 256, 27578, 256, 27579, 256, 146061, \r
+    256, 138507, 256, 146170, 256, 27726, 256, 146620, 256, 27839, 256, \r
+    27853, 256, 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, \r
+    28009, 256, 28024, 256, 28037, 256, 146718, 256, 27956, 256, 28207, 256, \r
+    28270, 256, 15667, 256, 28363, 256, 28359, 256, 147153, 256, 28153, 256, \r
+    28526, 256, 147294, 256, 147342, 256, 28614, 256, 28729, 256, 28702, 256, \r
+    28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, \r
+    132389, 256, 28997, 256, 148067, 256, 29084, 256, 148395, 256, 29224, \r
+    256, 29237, 256, 29264, 256, 149000, 256, 29312, 256, 29333, 256, 149301, \r
+    256, 149524, 256, 29562, 256, 29579, 256, 16044, 256, 29605, 256, 16056, \r
+    256, 16056, 256, 29767, 256, 29788, 256, 29809, 256, 29829, 256, 29898, \r
+    256, 16155, 256, 29988, 256, 150582, 256, 30014, 256, 150674, 256, 30064, \r
+    256, 139679, 256, 30224, 256, 151457, 256, 151480, 256, 151620, 256, \r
+    16380, 256, 16392, 256, 30452, 256, 151795, 256, 151794, 256, 151833, \r
+    256, 151859, 256, 30494, 256, 30495, 256, 30495, 256, 30538, 256, 16441, \r
+    256, 30603, 256, 16454, 256, 16534, 256, 152605, 256, 30798, 256, 30860, \r
+    256, 30924, 256, 16611, 256, 153126, 256, 31062, 256, 153242, 256, \r
+    153285, 256, 31119, 256, 31211, 256, 16687, 256, 31296, 256, 31306, 256, \r
+    31311, 256, 153980, 256, 154279, 256, 154279, 256, 31470, 256, 16898, \r
+    256, 154539, 256, 31686, 256, 31689, 256, 16935, 256, 154752, 256, 31954, \r
+    256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 155526, 256, 32099, \r
+    256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 156200, \r
+    256, 156231, 256, 17241, 256, 156377, 256, 32634, 256, 156478, 256, \r
+    32661, 256, 32762, 256, 32773, 256, 156890, 256, 156963, 256, 32864, 256, \r
+    157096, 256, 32880, 256, 144223, 256, 17365, 256, 32946, 256, 33027, 256, \r
+    17419, 256, 33086, 256, 23221, 256, 157607, 256, 157621, 256, 144275, \r
+    256, 144284, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, \r
+    256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, \r
+    256, 33510, 256, 158524, 256, 33509, 256, 33565, 256, 33635, 256, 33709, \r
+    256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, \r
+    256, 33740, 256, 33756, 256, 158774, 256, 159083, 256, 158933, 256, \r
+    17707, 256, 34033, 256, 34035, 256, 34070, 256, 160714, 256, 34148, 256, \r
+    159532, 256, 17757, 256, 17761, 256, 159665, 256, 159954, 256, 17771, \r
+    256, 34384, 256, 34396, 256, 34407, 256, 34409, 256, 34473, 256, 34440, \r
+    256, 34574, 256, 34530, 256, 34681, 256, 34600, 256, 34667, 256, 34694, \r
+    256, 17879, 256, 34785, 256, 34817, 256, 17913, 256, 34912, 256, 34915, \r
+    256, 161383, 256, 35031, 256, 35038, 256, 17973, 256, 35066, 256, 13499, \r
+    256, 161966, 256, 162150, 256, 18110, 256, 18119, 256, 35488, 256, 35565, \r
+    256, 35722, 256, 35925, 256, 162984, 256, 36011, 256, 36033, 256, 36123, \r
+    256, 36215, 256, 163631, 256, 133124, 256, 36299, 256, 36284, 256, 36336, \r
+    256, 133342, 256, 36564, 256, 36664, 256, 165330, 256, 165357, 256, \r
+    37012, 256, 37105, 256, 37137, 256, 165678, 256, 37147, 256, 37432, 256, \r
+    37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 166906, 256, \r
+    38283, 256, 18837, 256, 38327, 256, 167287, 256, 18918, 256, 38595, 256, \r
+    23986, 256, 38691, 256, 168261, 256, 168474, 256, 19054, 256, 19062, 256, \r
+    38880, 256, 168970, 256, 19122, 256, 169110, 256, 38923, 256, 38923, 256, \r
+    38953, 256, 169398, 256, 39138, 256, 19251, 256, 39209, 256, 39335, 256, \r
+    39362, 256, 39422, 256, 19406, 256, 170800, 256, 39698, 256, 40000, 256, \r
+    40189, 256, 19662, 256, 19693, 256, 40295, 256, 172238, 256, 19704, 256, \r
+    172293, 256, 172558, 256, 172689, 256, 40635, 256, 19798, 256, 40697, \r
+    256, 40702, 256, 40709, 256, 40719, 256, 40726, 256, 40763, 256, 173568, \r
+};\r
+\r
+/* index tables for the decomposition data */\r
+#define DECOMP_SHIFT 8\r
+static unsigned char decomp_index1[] = {\r
+    0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 16, 7, 17, 18, 19, 20, 21, 22, 23, 24, 7, 7, 7, 7, 7, 25, \r
+    7, 26, 27, 28, 29, 30, 31, 32, 33, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 34, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 35, 36, 37, 38, 39, 40, \r
+    41, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 42, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 43, 7, 7, 44, 45, \r
+    46, 47, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 48, 49, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 50, 51, 52, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+};\r
+\r
+static unsigned short decomp_index2[] = {\r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \r
+    3, 0, 6, 0, 0, 0, 0, 8, 0, 0, 11, 13, 15, 18, 0, 0, 20, 23, 25, 0, 27, \r
+    31, 35, 0, 39, 42, 45, 48, 51, 54, 0, 57, 60, 63, 66, 69, 72, 75, 78, 81, \r
+    0, 84, 87, 90, 93, 96, 99, 0, 0, 102, 105, 108, 111, 114, 0, 0, 117, 120, \r
+    123, 126, 129, 132, 0, 135, 138, 141, 144, 147, 150, 153, 156, 159, 0, \r
+    162, 165, 168, 171, 174, 177, 0, 0, 180, 183, 186, 189, 192, 0, 195, 198, \r
+    201, 204, 207, 210, 213, 216, 219, 222, 225, 228, 231, 234, 237, 240, \r
+    243, 0, 0, 246, 249, 252, 255, 258, 261, 264, 267, 270, 273, 276, 279, \r
+    282, 285, 288, 291, 294, 297, 300, 303, 0, 0, 306, 309, 312, 315, 318, \r
+    321, 324, 327, 330, 0, 333, 336, 339, 342, 345, 348, 0, 351, 354, 357, \r
+    360, 363, 366, 369, 372, 0, 0, 375, 378, 381, 384, 387, 390, 393, 0, 0, \r
+    396, 399, 402, 405, 408, 411, 0, 0, 414, 417, 420, 423, 426, 429, 432, \r
+    435, 438, 441, 444, 447, 450, 453, 456, 459, 462, 465, 0, 0, 468, 471, \r
+    474, 477, 480, 483, 486, 489, 492, 495, 498, 501, 504, 507, 510, 513, \r
+    516, 519, 522, 525, 528, 531, 534, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 542, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 545, 548, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 551, 554, 557, 560, 563, 566, 569, 572, \r
+    575, 578, 581, 584, 587, 590, 593, 596, 599, 602, 605, 608, 611, 614, \r
+    617, 620, 623, 0, 626, 629, 632, 635, 638, 641, 0, 0, 644, 647, 650, 653, \r
+    656, 659, 662, 665, 668, 671, 674, 677, 680, 683, 686, 689, 0, 0, 692, \r
+    695, 698, 701, 704, 707, 710, 713, 716, 719, 722, 725, 728, 731, 734, \r
+    737, 740, 743, 746, 749, 752, 755, 758, 761, 764, 767, 770, 773, 776, \r
+    779, 782, 785, 788, 791, 794, 797, 0, 0, 800, 803, 0, 0, 0, 0, 0, 0, 806, \r
+    809, 812, 815, 818, 821, 824, 827, 830, 833, 836, 839, 842, 845, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 848, 850, 852, 854, 856, 858, 860, 862, 864, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 866, \r
+    869, 872, 875, 878, 881, 0, 0, 884, 886, 888, 890, 892, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 894, 896, 0, 898, 900, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 903, 0, 0, 0, 0, \r
+    0, 905, 0, 0, 0, 908, 0, 0, 0, 0, 0, 910, 913, 916, 919, 921, 924, 927, \r
+    0, 930, 0, 933, 936, 939, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 942, 945, 948, 951, 954, 957, 960, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 963, 966, \r
+    969, 972, 975, 0, 978, 980, 982, 984, 987, 990, 992, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 994, 996, 998, 0, \r
+    1000, 1002, 0, 0, 0, 1004, 0, 0, 0, 0, 0, 0, 1006, 1009, 0, 1012, 0, 0, \r
+    0, 1015, 0, 0, 0, 0, 1018, 1021, 1024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    1027, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1030, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1033, 1036, 0, 1039, 0, 0, 0, 1042, 0, 0, 0, \r
+    0, 1045, 1048, 1051, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 1054, 1057, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1060, 1063, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 1066, 1069, 1072, 1075, 0, 0, 1078, 1081, 0, 0, 1084, 1087, \r
+    1090, 1093, 1096, 1099, 0, 0, 1102, 1105, 1108, 1111, 1114, 1117, 0, 0, \r
+    1120, 1123, 1126, 1129, 1132, 1135, 1138, 1141, 1144, 1147, 1150, 1153, \r
+    0, 0, 1156, 1159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 1162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1165, 1168, 1171, 1174, \r
+    1177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 1180, 1183, 1186, 1189, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1192, 0, 1195, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1201, 0, 0, 0, \r
+    0, 0, 0, 0, 1204, 0, 0, 1207, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1210, \r
+    1213, 1216, 1219, 1222, 1225, 1228, 1231, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 1234, 1237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1240, 1243, \r
+    0, 1246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1249, 0, 0, 1252, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 1255, 1258, 1261, 0, 0, 1264, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1267, 0, 0, 1270, 1273, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 1276, 1279, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1282, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 1285, 1288, 1291, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1297, 0, 0, 0, 0, 0, 0, 1300, 1303, 0, \r
+    1306, 1309, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1312, 1315, 1318, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1321, 0, 1324, 1327, 1330, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1333, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1336, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1339, 1342, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1345, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    1347, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1350, 0, 0, 0, 0, 1353, 0, 0, 0, 0, \r
+    1356, 0, 0, 0, 0, 1359, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1362, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 1365, 0, 1368, 1371, 1374, 1377, 1380, 0, 0, 0, 0, \r
+    0, 0, 0, 1383, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1386, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 1389, 0, 0, 0, 0, 1392, 0, 0, 0, 0, 1395, 0, \r
+    0, 0, 0, 1398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1401, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 1404, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 1407, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1409, 0, 1412, 0, \r
+    1415, 0, 1418, 0, 1421, 0, 0, 0, 1424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 1427, 0, 1430, 0, 0, 1433, 1436, 0, 1439, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1442, 1444, 1446, 0, 1448, 1450, 1452, \r
+    1454, 1456, 1458, 1460, 1462, 1464, 1466, 1468, 0, 1470, 1472, 1474, \r
+    1476, 1478, 1480, 1482, 1484, 1486, 1488, 1490, 1492, 1494, 1496, 1498, \r
+    1500, 1502, 1504, 0, 1506, 1508, 1510, 1512, 1514, 1516, 1518, 1520, \r
+    1522, 1524, 1526, 1528, 1530, 1532, 1534, 1536, 1538, 1540, 1542, 1544, \r
+    1546, 1548, 1550, 1552, 1554, 1556, 1558, 1560, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 1562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1564, 1566, 1568, \r
+    1570, 1572, 1574, 1576, 1578, 1580, 1582, 1584, 1586, 1588, 1590, 1592, \r
+    1594, 1596, 1598, 1600, 1602, 1604, 1606, 1608, 1610, 1612, 1614, 1616, \r
+    1618, 1620, 1622, 1624, 1626, 1628, 1630, 1632, 1634, 1636, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1638, 1641, 1644, 1647, 1650, 1653, \r
+    1656, 1659, 1662, 1665, 1668, 1671, 1674, 1677, 1680, 1683, 1686, 1689, \r
+    1692, 1695, 1698, 1701, 1704, 1707, 1710, 1713, 1716, 1719, 1722, 1725, \r
+    1728, 1731, 1734, 1737, 1740, 1743, 1746, 1749, 1752, 1755, 1758, 1761, \r
+    1764, 1767, 1770, 1773, 1776, 1779, 1782, 1785, 1788, 1791, 1794, 1797, \r
+    1800, 1803, 1806, 1809, 1812, 1815, 1818, 1821, 1824, 1827, 1830, 1833, \r
+    1836, 1839, 1842, 1845, 1848, 1851, 1854, 1857, 1860, 1863, 1866, 1869, \r
+    1872, 1875, 1878, 1881, 1884, 1887, 1890, 1893, 1896, 1899, 1902, 1905, \r
+    1908, 1911, 1914, 1917, 1920, 1923, 1926, 1929, 1932, 1935, 1938, 1941, \r
+    1944, 1947, 1950, 1953, 1956, 1959, 1962, 1965, 1968, 1971, 1974, 1977, \r
+    1980, 1983, 1986, 1989, 1992, 1995, 1998, 2001, 2004, 2007, 2010, 2013, \r
+    2016, 2019, 2022, 2025, 2028, 2031, 2034, 2037, 2040, 2043, 2046, 2049, \r
+    2052, 2055, 2058, 2061, 2064, 2067, 2070, 2073, 2076, 2079, 2082, 2085, \r
+    2088, 2091, 2094, 2097, 2100, 2103, 0, 0, 0, 0, 2106, 2109, 2112, 2115, \r
+    2118, 2121, 2124, 2127, 2130, 2133, 2136, 2139, 2142, 2145, 2148, 2151, \r
+    2154, 2157, 2160, 2163, 2166, 2169, 2172, 2175, 2178, 2181, 2184, 2187, \r
+    2190, 2193, 2196, 2199, 2202, 2205, 2208, 2211, 2214, 2217, 2220, 2223, \r
+    2226, 2229, 2232, 2235, 2238, 2241, 2244, 2247, 2250, 2253, 2256, 2259, \r
+    2262, 2265, 2268, 2271, 2274, 2277, 2280, 2283, 2286, 2289, 2292, 2295, \r
+    2298, 2301, 2304, 2307, 2310, 2313, 2316, 2319, 2322, 2325, 2328, 2331, \r
+    2334, 2337, 2340, 2343, 2346, 2349, 2352, 2355, 2358, 2361, 2364, 2367, \r
+    2370, 2373, 0, 0, 0, 0, 0, 0, 2376, 2379, 2382, 2385, 2388, 2391, 2394, \r
+    2397, 2400, 2403, 2406, 2409, 2412, 2415, 2418, 2421, 2424, 2427, 2430, \r
+    2433, 2436, 2439, 0, 0, 2442, 2445, 2448, 2451, 2454, 2457, 0, 0, 2460, \r
+    2463, 2466, 2469, 2472, 2475, 2478, 2481, 2484, 2487, 2490, 2493, 2496, \r
+    2499, 2502, 2505, 2508, 2511, 2514, 2517, 2520, 2523, 2526, 2529, 2532, \r
+    2535, 2538, 2541, 2544, 2547, 2550, 2553, 2556, 2559, 2562, 2565, 2568, \r
+    2571, 0, 0, 2574, 2577, 2580, 2583, 2586, 2589, 0, 0, 2592, 2595, 2598, \r
+    2601, 2604, 2607, 2610, 2613, 0, 2616, 0, 2619, 0, 2622, 0, 2625, 2628, \r
+    2631, 2634, 2637, 2640, 2643, 2646, 2649, 2652, 2655, 2658, 2661, 2664, \r
+    2667, 2670, 2673, 2676, 2679, 2681, 2684, 2686, 2689, 2691, 2694, 2696, \r
+    2699, 2701, 2704, 2706, 2709, 0, 0, 2711, 2714, 2717, 2720, 2723, 2726, \r
+    2729, 2732, 2735, 2738, 2741, 2744, 2747, 2750, 2753, 2756, 2759, 2762, \r
+    2765, 2768, 2771, 2774, 2777, 2780, 2783, 2786, 2789, 2792, 2795, 2798, \r
+    2801, 2804, 2807, 2810, 2813, 2816, 2819, 2822, 2825, 2828, 2831, 2834, \r
+    2837, 2840, 2843, 2846, 2849, 2852, 2855, 2858, 2861, 2864, 2867, 0, \r
+    2870, 2873, 2876, 2879, 2882, 2885, 2887, 2890, 2893, 2895, 2898, 2901, \r
+    2904, 2907, 2910, 0, 2913, 2916, 2919, 2922, 2924, 2927, 2929, 2932, \r
+    2935, 2938, 2941, 2944, 2947, 2950, 0, 0, 2952, 2955, 2958, 2961, 2964, \r
+    2967, 0, 2969, 2972, 2975, 2978, 2981, 2984, 2987, 2989, 2992, 2995, \r
+    2998, 3001, 3004, 3007, 3010, 3012, 3015, 3018, 3020, 0, 0, 3022, 3025, \r
+    3028, 0, 3031, 3034, 3037, 3040, 3042, 3045, 3047, 3050, 3052, 0, 3055, \r
+    3057, 3059, 3061, 3063, 3065, 3067, 3069, 3071, 3073, 3075, 0, 0, 0, 0, \r
+    0, 0, 3077, 0, 0, 0, 0, 0, 3079, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    3082, 3084, 3087, 0, 0, 0, 0, 0, 0, 0, 0, 3091, 0, 0, 0, 3093, 3096, 0, \r
+    3100, 3103, 0, 0, 0, 0, 3107, 0, 3110, 0, 0, 0, 0, 0, 0, 0, 0, 3113, \r
+    3116, 3119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3122, 0, 0, 0, 0, 0, \r
+    0, 0, 3127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3129, 3131, \r
+    0, 0, 3133, 3135, 3137, 3139, 3141, 3143, 3145, 3147, 3149, 3151, 3153, \r
+    3155, 3157, 3159, 3161, 3163, 3165, 3167, 3169, 3171, 3173, 3175, 3177, \r
+    3179, 3181, 3183, 3185, 0, 3187, 3189, 3191, 3193, 3195, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3197, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 3200, 3204, 3208, 3210, 0, 3213, 3217, 3221, 0, \r
+    3223, 3226, 3228, 3230, 3232, 3234, 3236, 3238, 3240, 3242, 3244, 0, \r
+    3246, 3248, 0, 0, 3251, 3253, 3255, 3257, 3259, 0, 0, 3261, 3264, 3268, \r
+    0, 3271, 0, 3273, 0, 3275, 0, 3277, 3279, 3281, 3283, 0, 3285, 3287, \r
+    3289, 0, 3291, 3293, 3295, 3297, 3299, 3301, 3303, 0, 3305, 3309, 3311, \r
+    3313, 3315, 3317, 0, 0, 0, 0, 3319, 3321, 3323, 3325, 3327, 0, 0, 0, 0, \r
+    0, 0, 3329, 3333, 3337, 3342, 3346, 3350, 3354, 3358, 3362, 3366, 3370, \r
+    3374, 3378, 3382, 3386, 3390, 3393, 3395, 3398, 3402, 3405, 3407, 3410, \r
+    3414, 3419, 3422, 3424, 3427, 3431, 3433, 3435, 3437, 3439, 3441, 3444, \r
+    3448, 3451, 3453, 3456, 3460, 3465, 3468, 3470, 3473, 3477, 3479, 3481, \r
+    3483, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3485, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 3489, 3492, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 3495, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3498, 3501, 3504, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3507, 0, \r
+    0, 0, 0, 3510, 0, 0, 3513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 3516, 0, 3519, 0, 0, 0, 0, 0, 3522, 3525, 0, \r
+    3529, 3532, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3536, 0, 0, \r
+    3539, 0, 0, 3542, 0, 3545, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 3548, 0, 3551, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3554, \r
+    3557, 3560, 3563, 3566, 0, 0, 3569, 3572, 0, 0, 3575, 3578, 0, 0, 0, 0, \r
+    0, 0, 3581, 3584, 0, 0, 3587, 3590, 0, 0, 3593, 3596, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 3599, 3602, 3605, 3608, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3611, 3614, 3617, 3620, 0, 0, 0, 0, \r
+    0, 0, 3623, 3626, 3629, 3632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3635, \r
+    3637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    3639, 3641, 3643, 3645, 3647, 3649, 3651, 3653, 3655, 3657, 3660, 3663, \r
+    3666, 3669, 3672, 3675, 3678, 3681, 3684, 3687, 3690, 3694, 3698, 3702, \r
+    3706, 3710, 3714, 3718, 3722, 3726, 3731, 3736, 3741, 3746, 3751, 3756, \r
+    3761, 3766, 3771, 3776, 3781, 3784, 3787, 3790, 3793, 3796, 3799, 3802, \r
+    3805, 3808, 3812, 3816, 3820, 3824, 3828, 3832, 3836, 3840, 3844, 3848, \r
+    3852, 3856, 3860, 3864, 3868, 3872, 3876, 3880, 3884, 3888, 3892, 3896, \r
+    3900, 3904, 3908, 3912, 3916, 3920, 3924, 3928, 3932, 3936, 3940, 3944, \r
+    3948, 3952, 3956, 3958, 3960, 3962, 3964, 3966, 3968, 3970, 3972, 3974, \r
+    3976, 3978, 3980, 3982, 3984, 3986, 3988, 3990, 3992, 3994, 3996, 3998, \r
+    4000, 4002, 4004, 4006, 4008, 4010, 4012, 4014, 4016, 4018, 4020, 4022, \r
+    4024, 4026, 4028, 4030, 4032, 4034, 4036, 4038, 4040, 4042, 4044, 4046, \r
+    4048, 4050, 4052, 4054, 4056, 4058, 4060, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    4062, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 4067, 4071, 4074, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4078, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4081, 4083, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4085, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4087, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    4089, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4091, 4093, 4095, 4097, 4099, \r
+    4101, 4103, 4105, 4107, 4109, 4111, 4113, 4115, 4117, 4119, 4121, 4123, \r
+    4125, 4127, 4129, 4131, 4133, 4135, 4137, 4139, 4141, 4143, 4145, 4147, \r
+    4149, 4151, 4153, 4155, 4157, 4159, 4161, 4163, 4165, 4167, 4169, 4171, \r
+    4173, 4175, 4177, 4179, 4181, 4183, 4185, 4187, 4189, 4191, 4193, 4195, \r
+    4197, 4199, 4201, 4203, 4205, 4207, 4209, 4211, 4213, 4215, 4217, 4219, \r
+    4221, 4223, 4225, 4227, 4229, 4231, 4233, 4235, 4237, 4239, 4241, 4243, \r
+    4245, 4247, 4249, 4251, 4253, 4255, 4257, 4259, 4261, 4263, 4265, 4267, \r
+    4269, 4271, 4273, 4275, 4277, 4279, 4281, 4283, 4285, 4287, 4289, 4291, \r
+    4293, 4295, 4297, 4299, 4301, 4303, 4305, 4307, 4309, 4311, 4313, 4315, \r
+    4317, 4319, 4321, 4323, 4325, 4327, 4329, 4331, 4333, 4335, 4337, 4339, \r
+    4341, 4343, 4345, 4347, 4349, 4351, 4353, 4355, 4357, 4359, 4361, 4363, \r
+    4365, 4367, 4369, 4371, 4373, 4375, 4377, 4379, 4381, 4383, 4385, 4387, \r
+    4389, 4391, 4393, 4395, 4397, 4399, 4401, 4403, 4405, 4407, 4409, 4411, \r
+    4413, 4415, 4417, 4419, 4421, 4423, 4425, 4427, 4429, 4431, 4433, 4435, \r
+    4437, 4439, 4441, 4443, 4445, 4447, 4449, 4451, 4453, 4455, 4457, 4459, \r
+    4461, 4463, 4465, 4467, 4469, 4471, 4473, 4475, 4477, 4479, 4481, 4483, \r
+    4485, 4487, 4489, 4491, 4493, 4495, 4497, 4499, 4501, 4503, 4505, 4507, \r
+    4509, 4511, 4513, 4515, 4517, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 4519, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4521, 0, 4523, 4525, 4527, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4529, 0, 4532, 0, 4535, 0, 4538, \r
+    0, 4541, 0, 4544, 0, 4547, 0, 4550, 0, 4553, 0, 4556, 0, 4559, 0, 4562, \r
+    0, 0, 4565, 0, 4568, 0, 4571, 0, 0, 0, 0, 0, 0, 4574, 4577, 0, 4580, \r
+    4583, 0, 4586, 4589, 0, 4592, 4595, 0, 4598, 4601, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4604, 0, 0, 0, 0, 0, 0, \r
+    4607, 4610, 0, 4613, 4616, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4619, 0, \r
+    4622, 0, 4625, 0, 4628, 0, 4631, 0, 4634, 0, 4637, 0, 4640, 0, 4643, 0, \r
+    4646, 0, 4649, 0, 4652, 0, 0, 4655, 0, 4658, 0, 4661, 0, 0, 0, 0, 0, 0, \r
+    4664, 4667, 0, 4670, 4673, 0, 4676, 4679, 0, 4682, 4685, 0, 4688, 4691, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4694, \r
+    0, 0, 4697, 4700, 4703, 4706, 0, 0, 0, 4709, 4712, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4715, 4717, 4719, \r
+    4721, 4723, 4725, 4727, 4729, 4731, 4733, 4735, 4737, 4739, 4741, 4743, \r
+    4745, 4747, 4749, 4751, 4753, 4755, 4757, 4759, 4761, 4763, 4765, 4767, \r
+    4769, 4771, 4773, 4775, 4777, 4779, 4781, 4783, 4785, 4787, 4789, 4791, \r
+    4793, 4795, 4797, 4799, 4801, 4803, 4805, 4807, 4809, 4811, 4813, 4815, \r
+    4817, 4819, 4821, 4823, 4825, 4827, 4829, 4831, 4833, 4835, 4837, 4839, \r
+    4841, 4843, 4845, 4847, 4849, 4851, 4853, 4855, 4857, 4859, 4861, 4863, \r
+    4865, 4867, 4869, 4871, 4873, 4875, 4877, 4879, 4881, 4883, 4885, 4887, \r
+    4889, 4891, 4893, 4895, 4897, 4899, 4901, 0, 0, 0, 4903, 4905, 4907, \r
+    4909, 4911, 4913, 4915, 4917, 4919, 4921, 4923, 4925, 4927, 4929, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4931, \r
+    4935, 4939, 4943, 4947, 4951, 4955, 4959, 4963, 4967, 4971, 4975, 4979, \r
+    4983, 4987, 4992, 4997, 5002, 5007, 5012, 5017, 5022, 5027, 5032, 5037, \r
+    5042, 5047, 5052, 5057, 5062, 5070, 0, 5077, 5081, 5085, 5089, 5093, \r
+    5097, 5101, 5105, 5109, 5113, 5117, 5121, 5125, 5129, 5133, 5137, 5141, \r
+    5145, 5149, 5153, 5157, 5161, 5165, 5169, 5173, 5177, 5181, 5185, 5189, \r
+    5193, 5197, 5201, 5205, 5209, 5213, 5217, 5221, 5223, 5225, 5227, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 5229, 5233, 5236, 5239, 5242, 5245, 5248, 5251, 5254, \r
+    5257, 5260, 5263, 5266, 5269, 5272, 5275, 5278, 5280, 5282, 5284, 5286, \r
+    5288, 5290, 5292, 5294, 5296, 5298, 5300, 5302, 5304, 5306, 5309, 5312, \r
+    5315, 5318, 5321, 5324, 5327, 5330, 5333, 5336, 5339, 5342, 5345, 5348, \r
+    5354, 5359, 0, 5362, 5364, 5366, 5368, 5370, 5372, 5374, 5376, 5378, \r
+    5380, 5382, 5384, 5386, 5388, 5390, 5392, 5394, 5396, 5398, 5400, 5402, \r
+    5404, 5406, 5408, 5410, 5412, 5414, 5416, 5418, 5420, 5422, 5424, 5426, \r
+    5428, 5430, 5432, 5434, 5436, 5438, 5440, 5442, 5444, 5446, 5448, 5450, \r
+    5452, 5454, 5456, 5458, 5460, 5463, 5466, 5469, 5472, 5475, 5478, 5481, \r
+    5484, 5487, 5490, 5493, 5496, 5499, 5502, 5505, 5508, 5511, 5514, 5517, \r
+    5520, 5523, 5526, 5529, 5532, 5536, 5540, 5544, 5547, 5551, 5554, 5558, \r
+    5560, 5562, 5564, 5566, 5568, 5570, 5572, 5574, 5576, 5578, 5580, 5582, \r
+    5584, 5586, 5588, 5590, 5592, 5594, 5596, 5598, 5600, 5602, 5604, 5606, \r
+    5608, 5610, 5612, 5614, 5616, 5618, 5620, 5622, 5624, 5626, 5628, 5630, \r
+    5632, 5634, 5636, 5638, 5640, 5642, 5644, 5646, 5648, 5650, 0, 5652, \r
+    5657, 5662, 5667, 5671, 5676, 5680, 5684, 5690, 5695, 5699, 5703, 5707, \r
+    5712, 5717, 5721, 5725, 5728, 5732, 5737, 5742, 5745, 5751, 5758, 5764, \r
+    5768, 5774, 5780, 5785, 5789, 5793, 5797, 5802, 5808, 5813, 5817, 5821, \r
+    5825, 5828, 5831, 5834, 5837, 5841, 5845, 5851, 5855, 5860, 5866, 5870, \r
+    5873, 5876, 5882, 5887, 5893, 5897, 5903, 5906, 5910, 5914, 5918, 5922, \r
+    5926, 5931, 5935, 5938, 5942, 5946, 5950, 5955, 5959, 5963, 5967, 5973, \r
+    5978, 5981, 5987, 5990, 5995, 6000, 6004, 6008, 6012, 6017, 6020, 6024, \r
+    6029, 6032, 6038, 6042, 6045, 6048, 6051, 6054, 6057, 6060, 6063, 6066, \r
+    6069, 6072, 6076, 6080, 6084, 6088, 6092, 6096, 6100, 6104, 6108, 6112, \r
+    6116, 6120, 6124, 6128, 6132, 6136, 6139, 6142, 6146, 6149, 6152, 6155, \r
+    6159, 6163, 6166, 6169, 6172, 6175, 6178, 6183, 6186, 6189, 6192, 6195, \r
+    6198, 6201, 6204, 6207, 6211, 6216, 6219, 6222, 6225, 6228, 6231, 6234, \r
+    6237, 6241, 6245, 6249, 6253, 6256, 6259, 6262, 6265, 6268, 6271, 6274, \r
+    6277, 6280, 6283, 6287, 6291, 6294, 6298, 6302, 6306, 6309, 6313, 6317, \r
+    6322, 6325, 6329, 6333, 6337, 6341, 6347, 6354, 6357, 6360, 6363, 6366, \r
+    6369, 6372, 6375, 6378, 6381, 6384, 6387, 6390, 6393, 6396, 6399, 6402, \r
+    6405, 6408, 6413, 6416, 6419, 6422, 6427, 6431, 6434, 6437, 6440, 6443, \r
+    6446, 6449, 6452, 6455, 6458, 6461, 6465, 6468, 6471, 6475, 6479, 6482, \r
+    6487, 6491, 6494, 6497, 6500, 6503, 6507, 6511, 6514, 6517, 6520, 6523, \r
+    6526, 6529, 6532, 6535, 6538, 6542, 6546, 6550, 6554, 6558, 6562, 6566, \r
+    6570, 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602, 6606, 6610, 6614, \r
+    6618, 6622, 6626, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6630, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    6632, 6634, 6636, 6638, 6640, 6642, 6644, 6646, 6648, 6650, 6652, 6654, \r
+    6656, 6658, 6660, 6662, 6664, 6666, 6668, 6670, 6672, 6674, 6676, 6678, \r
+    6680, 6682, 6684, 6686, 6688, 6690, 6692, 6694, 6696, 6698, 6700, 6702, \r
+    6704, 6706, 6708, 6710, 6712, 6714, 6716, 6718, 6720, 6722, 6724, 6726, \r
+    6728, 6730, 6732, 6734, 6736, 6738, 6740, 6742, 6744, 6746, 6748, 6750, \r
+    6752, 6754, 6756, 6758, 6760, 6762, 6764, 6766, 6768, 6770, 6772, 6774, \r
+    6776, 6778, 6780, 6782, 6784, 6786, 6788, 6790, 6792, 6794, 6796, 6798, \r
+    6800, 6802, 6804, 6806, 6808, 6810, 6812, 6814, 6816, 6818, 6820, 6822, \r
+    6824, 6826, 6828, 6830, 6832, 6834, 6836, 6838, 6840, 6842, 6844, 6846, \r
+    6848, 6850, 6852, 6854, 6856, 6858, 6860, 6862, 6864, 6866, 6868, 6870, \r
+    6872, 6874, 6876, 6878, 6880, 6882, 6884, 6886, 6888, 6890, 6892, 6894, \r
+    6896, 6898, 6900, 6902, 6904, 6906, 6908, 6910, 6912, 6914, 6916, 6918, \r
+    6920, 6922, 6924, 6926, 6928, 6930, 6932, 6934, 6936, 6938, 6940, 6942, \r
+    6944, 6946, 6948, 6950, 6952, 6954, 6956, 6958, 6960, 6962, 6964, 6966, \r
+    6968, 6970, 6972, 6974, 6976, 6978, 6980, 6982, 6984, 6986, 6988, 6990, \r
+    6992, 6994, 6996, 6998, 7000, 7002, 7004, 7006, 7008, 7010, 7012, 7014, \r
+    7016, 7018, 7020, 7022, 7024, 7026, 7028, 7030, 7032, 7034, 7036, 7038, \r
+    7040, 7042, 7044, 7046, 7048, 7050, 7052, 7054, 7056, 7058, 7060, 7062, \r
+    7064, 7066, 7068, 7070, 7072, 7074, 7076, 7078, 7080, 7082, 7084, 7086, \r
+    7088, 7090, 7092, 7094, 7096, 7098, 7100, 7102, 7104, 7106, 7108, 7110, \r
+    7112, 7114, 7116, 7118, 7120, 7122, 7124, 7126, 7128, 7130, 7132, 7134, \r
+    7136, 7138, 7140, 7142, 7144, 7146, 7148, 7150, 7152, 7154, 7156, 7158, \r
+    7160, 7162, 7164, 7166, 7168, 7170, 0, 0, 7172, 0, 7174, 0, 0, 7176, \r
+    7178, 7180, 7182, 7184, 7186, 7188, 7190, 7192, 7194, 0, 7196, 0, 7198, \r
+    0, 0, 7200, 7202, 0, 0, 0, 7204, 7206, 7208, 7210, 0, 0, 7212, 7214, \r
+    7216, 7218, 7220, 7222, 7224, 7226, 7228, 7230, 7232, 7234, 7236, 7238, \r
+    7240, 7242, 7244, 7246, 7248, 7250, 7252, 7254, 7256, 7258, 7260, 7262, \r
+    7264, 7266, 7268, 7270, 7272, 7274, 7276, 7278, 7280, 7282, 7284, 7286, \r
+    7288, 7290, 7292, 7294, 7296, 7298, 7300, 7302, 7304, 7306, 7308, 7310, \r
+    7312, 7314, 7316, 7318, 7320, 7322, 7324, 7326, 7328, 7330, 7332, 7334, \r
+    0, 0, 7336, 7338, 7340, 7342, 7344, 7346, 7348, 7350, 7352, 7354, 7356, \r
+    7358, 7360, 7362, 7364, 7366, 7368, 7370, 7372, 7374, 7376, 7378, 7380, \r
+    7382, 7384, 7386, 7388, 7390, 7392, 7394, 7396, 7398, 7400, 7402, 7404, \r
+    7406, 7408, 7410, 7412, 7414, 7416, 7418, 7420, 7422, 7424, 7426, 7428, \r
+    7430, 7432, 7434, 7436, 7438, 7440, 7442, 7444, 7446, 7448, 7450, 7452, \r
+    7454, 7456, 7458, 7460, 7462, 7464, 7466, 7468, 7470, 7472, 7474, 7476, \r
+    7478, 7480, 7482, 7484, 7486, 7488, 7490, 7492, 7494, 7496, 7498, 7500, \r
+    7502, 7504, 7506, 7508, 7510, 7512, 7514, 7516, 7518, 7520, 7522, 7524, \r
+    7526, 7528, 7530, 7532, 7534, 7536, 7538, 7540, 7542, 7544, 7546, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7548, 7551, 7554, 7557, 7561, 7565, \r
+    7568, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7571, 7574, 7577, 7580, 7583, \r
+    0, 0, 0, 0, 0, 7586, 0, 7589, 7592, 7594, 7596, 7598, 7600, 7602, 7604, \r
+    7606, 7608, 7610, 7612, 7615, 7618, 7621, 7624, 7627, 7630, 7633, 7636, \r
+    7639, 7642, 7645, 7648, 0, 7651, 7654, 7657, 7660, 7663, 0, 7666, 0, \r
+    7669, 7672, 0, 7675, 7678, 0, 7681, 7684, 7687, 7690, 7693, 7696, 7699, \r
+    7702, 7705, 7708, 7711, 7713, 7715, 7717, 7719, 7721, 7723, 7725, 7727, \r
+    7729, 7731, 7733, 7735, 7737, 7739, 7741, 7743, 7745, 7747, 7749, 7751, \r
+    7753, 7755, 7757, 7759, 7761, 7763, 7765, 7767, 7769, 7771, 7773, 7775, \r
+    7777, 7779, 7781, 7783, 7785, 7787, 7789, 7791, 7793, 7795, 7797, 7799, \r
+    7801, 7803, 7805, 7807, 7809, 7811, 7813, 7815, 7817, 7819, 7821, 7823, \r
+    7825, 7827, 7829, 7831, 7833, 7835, 7837, 7839, 7841, 7843, 7845, 7847, \r
+    7849, 7851, 7853, 7855, 7857, 7859, 7861, 7863, 7865, 7867, 7869, 7871, \r
+    7873, 7875, 7877, 7879, 7881, 7883, 7885, 7887, 7889, 7891, 7893, 7895, \r
+    7897, 7899, 7901, 7903, 7905, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7907, 7909, \r
+    7911, 7913, 7915, 7917, 7919, 7921, 7923, 7925, 7927, 7929, 7931, 7933, \r
+    7935, 7937, 7939, 7941, 7943, 7945, 7947, 7949, 7951, 7953, 7956, 7959, \r
+    7962, 7965, 7968, 7971, 7974, 7977, 7980, 7983, 7986, 7989, 7992, 7995, \r
+    7998, 8001, 8004, 8007, 8009, 8011, 8013, 8015, 8018, 8021, 8024, 8027, \r
+    8030, 8033, 8036, 8039, 8042, 8045, 8048, 8051, 8054, 8057, 8060, 8063, \r
+    8066, 8069, 8072, 8075, 8078, 8081, 8084, 8087, 8090, 8093, 8096, 8099, \r
+    8102, 8105, 8108, 8111, 8114, 8117, 8120, 8123, 8126, 8129, 8132, 8135, \r
+    8138, 8141, 8144, 8147, 8150, 8153, 8156, 8159, 8162, 8165, 8168, 8171, \r
+    8174, 8177, 8180, 8183, 8186, 8189, 8192, 8195, 8198, 8201, 8204, 8207, \r
+    8210, 8213, 8216, 8219, 8222, 8225, 8228, 8231, 8234, 8237, 8240, 8243, \r
+    8246, 8249, 8252, 8255, 8258, 8261, 8264, 8267, 8270, 8273, 8276, 8279, \r
+    8282, 8285, 8288, 8291, 8294, 8297, 8301, 8305, 8309, 8313, 8317, 8321, \r
+    8324, 8327, 8330, 8333, 8336, 8339, 8342, 8345, 8348, 8351, 8354, 8357, \r
+    8360, 8363, 8366, 8369, 8372, 8375, 8378, 8381, 8384, 8387, 8390, 8393, \r
+    8396, 8399, 8402, 8405, 8408, 8411, 8414, 8417, 8420, 8423, 8426, 8429, \r
+    8432, 8435, 8438, 8441, 8444, 8447, 8450, 8453, 8456, 8459, 8462, 8465, \r
+    8468, 8471, 8474, 8477, 8480, 8483, 8486, 8489, 8492, 8495, 8498, 8501, \r
+    8504, 8507, 8510, 8513, 8516, 8519, 8522, 8525, 8528, 8531, 8534, 8537, \r
+    8540, 8543, 8546, 8549, 8552, 8555, 8558, 8561, 8564, 8567, 8570, 8573, \r
+    8576, 8579, 8582, 8585, 8588, 8591, 8594, 8597, 8600, 8603, 8606, 8609, \r
+    8612, 8615, 8618, 8621, 8624, 8627, 8630, 8633, 8636, 8639, 8642, 8645, \r
+    8648, 8651, 8654, 8657, 8660, 8663, 8666, 8669, 8672, 8675, 8678, 8681, \r
+    8684, 8687, 8690, 8693, 8696, 8699, 8702, 8705, 8708, 8711, 8714, 8717, \r
+    8720, 8723, 8726, 8729, 8732, 8735, 8738, 8741, 8744, 8747, 8751, 8755, \r
+    8759, 8762, 8765, 8768, 8771, 8774, 8777, 8780, 8783, 8786, 8789, 8792, \r
+    8795, 8798, 8801, 8804, 8807, 8810, 8813, 8816, 8819, 8822, 8825, 8828, \r
+    8831, 8834, 8837, 8840, 8843, 8846, 8849, 8852, 8855, 8858, 8861, 8864, \r
+    8867, 8870, 8873, 8876, 8879, 8882, 8885, 8888, 8891, 8894, 8897, 8900, \r
+    8903, 8906, 8909, 8912, 8915, 8918, 8921, 8924, 8927, 8930, 8933, 8936, \r
+    8939, 8942, 8945, 8948, 8951, 8954, 8957, 8960, 8963, 8966, 8969, 8972, \r
+    8975, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8978, 8982, \r
+    8986, 8990, 8994, 8998, 9002, 9006, 9010, 9014, 9018, 9022, 9026, 9030, \r
+    9034, 9038, 9042, 9046, 9050, 9054, 9058, 9062, 9066, 9070, 9074, 9078, \r
+    9082, 9086, 9090, 9094, 9098, 9102, 9106, 9110, 9114, 9118, 9122, 9126, \r
+    9130, 9134, 9138, 9142, 9146, 9150, 9154, 9158, 9162, 9166, 9170, 9174, \r
+    9178, 9182, 9186, 9190, 9194, 9198, 9202, 9206, 9210, 9214, 9218, 9222, \r
+    9226, 9230, 0, 0, 9234, 9238, 9242, 9246, 9250, 9254, 9258, 9262, 9266, \r
+    9270, 9274, 9278, 9282, 9286, 9290, 9294, 9298, 9302, 9306, 9310, 9314, \r
+    9318, 9322, 9326, 9330, 9334, 9338, 9342, 9346, 9350, 9354, 9358, 9362, \r
+    9366, 9370, 9374, 9378, 9382, 9386, 9390, 9394, 9398, 9402, 9406, 9410, \r
+    9414, 9418, 9422, 9426, 9430, 9434, 9438, 9442, 9446, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9450, 9454, 9458, 9463, 9468, 9473, 9478, \r
+    9483, 9488, 9493, 9497, 9516, 9525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 9530, 9532, 9534, 9536, 9538, 9540, 9542, 9544, \r
+    9546, 9548, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 9550, 9552, 9554, 9556, 9558, 9560, 9562, 9564, 9566, 9568, 9570, \r
+    9572, 9574, 9576, 9578, 9580, 9582, 9584, 9586, 9588, 9590, 0, 0, 9592, \r
+    9594, 9596, 9598, 9600, 9602, 9604, 9606, 9608, 9610, 9612, 9614, 0, \r
+    9616, 9618, 9620, 9622, 9624, 9626, 9628, 9630, 9632, 9634, 9636, 9638, \r
+    9640, 9642, 9644, 9646, 9648, 9650, 9652, 0, 9654, 9656, 9658, 9660, 0, \r
+    0, 0, 0, 9662, 9665, 9668, 0, 9671, 0, 9674, 9677, 9680, 9683, 9686, \r
+    9689, 9692, 9695, 9698, 9701, 9704, 9706, 9708, 9710, 9712, 9714, 9716, \r
+    9718, 9720, 9722, 9724, 9726, 9728, 9730, 9732, 9734, 9736, 9738, 9740, \r
+    9742, 9744, 9746, 9748, 9750, 9752, 9754, 9756, 9758, 9760, 9762, 9764, \r
+    9766, 9768, 9770, 9772, 9774, 9776, 9778, 9780, 9782, 9784, 9786, 9788, \r
+    9790, 9792, 9794, 9796, 9798, 9800, 9802, 9804, 9806, 9808, 9810, 9812, \r
+    9814, 9816, 9818, 9820, 9822, 9824, 9826, 9828, 9830, 9832, 9834, 9836, \r
+    9838, 9840, 9842, 9844, 9846, 9848, 9850, 9852, 9854, 9856, 9858, 9860, \r
+    9862, 9864, 9866, 9868, 9870, 9872, 9874, 9876, 9878, 9880, 9882, 9884, \r
+    9886, 9888, 9890, 9892, 9894, 9896, 9898, 9900, 9902, 9904, 9906, 9908, \r
+    9910, 9912, 9914, 9916, 9918, 9920, 9922, 9924, 9926, 9928, 9930, 9932, \r
+    9934, 9936, 9938, 9941, 9944, 9947, 9950, 9953, 9956, 9959, 0, 0, 0, 0, \r
+    9962, 9964, 9966, 9968, 9970, 9972, 9974, 9976, 9978, 9980, 9982, 9984, \r
+    9986, 9988, 9990, 9992, 9994, 9996, 9998, 10000, 10002, 10004, 10006, \r
+    10008, 10010, 10012, 10014, 10016, 10018, 10020, 10022, 10024, 10026, \r
+    10028, 10030, 10032, 10034, 10036, 10038, 10040, 10042, 10044, 10046, \r
+    10048, 10050, 10052, 10054, 10056, 10058, 10060, 10062, 10064, 10066, \r
+    10068, 10070, 10072, 10074, 10076, 10078, 10080, 10082, 10084, 10086, \r
+    10088, 10090, 10092, 10094, 10096, 10098, 10100, 10102, 10104, 10106, \r
+    10108, 10110, 10112, 10114, 10116, 10118, 10120, 10122, 10124, 10126, \r
+    10128, 10130, 10132, 10134, 10136, 10138, 10140, 10142, 10144, 10146, \r
+    10148, 10150, 10152, 10154, 10156, 10158, 10160, 10162, 10164, 10166, \r
+    10168, 10170, 10172, 10174, 10176, 10178, 10180, 10182, 10184, 10186, \r
+    10188, 10190, 10192, 10194, 10196, 10198, 10200, 10202, 10204, 10206, \r
+    10208, 10210, 10212, 10214, 10216, 10218, 10220, 10222, 10224, 10226, \r
+    10228, 10230, 10232, 10234, 10236, 10238, 10240, 10242, 10244, 10246, \r
+    10248, 10250, 10252, 10254, 10256, 10258, 10260, 10262, 10264, 10266, \r
+    10268, 10270, 10272, 10274, 10276, 10278, 10280, 10282, 10284, 10286, \r
+    10288, 10290, 10292, 10294, 10296, 10298, 10300, 10302, 10304, 10306, \r
+    10308, 10310, 10312, 10314, 10316, 10318, 10320, 10322, 10324, 10326, \r
+    10328, 10330, 10332, 10334, 10336, 10338, 10340, 0, 0, 0, 10342, 10344, \r
+    10346, 10348, 10350, 10352, 0, 0, 10354, 10356, 10358, 10360, 10362, \r
+    10364, 0, 0, 10366, 10368, 10370, 10372, 10374, 10376, 0, 0, 10378, \r
+    10380, 10382, 0, 0, 0, 10384, 10386, 10388, 10390, 10392, 10394, 10396, \r
+    0, 10398, 10400, 10402, 10404, 10406, 10408, 10410, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10412, 0, \r
+    10415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10418, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 10421, 10424, 10427, 10430, 10433, 10436, 10439, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10442, 10445, 10448, 10451, 10454, 10457, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10460, 10462, 10464, 10466, \r
+    10468, 10470, 10472, 10474, 10476, 10478, 10480, 10482, 10484, 10486, \r
+    10488, 10490, 10492, 10494, 10496, 10498, 10500, 10502, 10504, 10506, \r
+    10508, 10510, 10512, 10514, 10516, 10518, 10520, 10522, 10524, 10526, \r
+    10528, 10530, 10532, 10534, 10536, 10538, 10540, 10542, 10544, 10546, \r
+    10548, 10550, 10552, 10554, 10556, 10558, 10560, 10562, 10564, 10566, \r
+    10568, 10570, 10572, 10574, 10576, 10578, 10580, 10582, 10584, 10586, \r
+    10588, 10590, 10592, 10594, 10596, 10598, 10600, 10602, 10604, 10606, \r
+    10608, 10610, 10612, 10614, 10616, 10618, 10620, 10622, 10624, 10626, \r
+    10628, 0, 10630, 10632, 10634, 10636, 10638, 10640, 10642, 10644, 10646, \r
+    10648, 10650, 10652, 10654, 10656, 10658, 10660, 10662, 10664, 10666, \r
+    10668, 10670, 10672, 10674, 10676, 10678, 10680, 10682, 10684, 10686, \r
+    10688, 10690, 10692, 10694, 10696, 10698, 10700, 10702, 10704, 10706, \r
+    10708, 10710, 10712, 10714, 10716, 10718, 10720, 10722, 10724, 10726, \r
+    10728, 10730, 10732, 10734, 10736, 10738, 10740, 10742, 10744, 10746, \r
+    10748, 10750, 10752, 10754, 10756, 10758, 10760, 10762, 10764, 10766, \r
+    10768, 10770, 0, 10772, 10774, 0, 0, 10776, 0, 0, 10778, 10780, 0, 0, \r
+    10782, 10784, 10786, 10788, 0, 10790, 10792, 10794, 10796, 10798, 10800, \r
+    10802, 10804, 10806, 10808, 10810, 10812, 0, 10814, 0, 10816, 10818, \r
+    10820, 10822, 10824, 10826, 10828, 0, 10830, 10832, 10834, 10836, 10838, \r
+    10840, 10842, 10844, 10846, 10848, 10850, 10852, 10854, 10856, 10858, \r
+    10860, 10862, 10864, 10866, 10868, 10870, 10872, 10874, 10876, 10878, \r
+    10880, 10882, 10884, 10886, 10888, 10890, 10892, 10894, 10896, 10898, \r
+    10900, 10902, 10904, 10906, 10908, 10910, 10912, 10914, 10916, 10918, \r
+    10920, 10922, 10924, 10926, 10928, 10930, 10932, 10934, 10936, 10938, \r
+    10940, 10942, 10944, 10946, 10948, 10950, 10952, 10954, 10956, 10958, 0, \r
+    10960, 10962, 10964, 10966, 0, 0, 10968, 10970, 10972, 10974, 10976, \r
+    10978, 10980, 10982, 0, 10984, 10986, 10988, 10990, 10992, 10994, 10996, \r
+    0, 10998, 11000, 11002, 11004, 11006, 11008, 11010, 11012, 11014, 11016, \r
+    11018, 11020, 11022, 11024, 11026, 11028, 11030, 11032, 11034, 11036, \r
+    11038, 11040, 11042, 11044, 11046, 11048, 11050, 11052, 0, 11054, 11056, \r
+    11058, 11060, 0, 11062, 11064, 11066, 11068, 11070, 0, 11072, 0, 0, 0, \r
+    11074, 11076, 11078, 11080, 11082, 11084, 11086, 0, 11088, 11090, 11092, \r
+    11094, 11096, 11098, 11100, 11102, 11104, 11106, 11108, 11110, 11112, \r
+    11114, 11116, 11118, 11120, 11122, 11124, 11126, 11128, 11130, 11132, \r
+    11134, 11136, 11138, 11140, 11142, 11144, 11146, 11148, 11150, 11152, \r
+    11154, 11156, 11158, 11160, 11162, 11164, 11166, 11168, 11170, 11172, \r
+    11174, 11176, 11178, 11180, 11182, 11184, 11186, 11188, 11190, 11192, \r
+    11194, 11196, 11198, 11200, 11202, 11204, 11206, 11208, 11210, 11212, \r
+    11214, 11216, 11218, 11220, 11222, 11224, 11226, 11228, 11230, 11232, \r
+    11234, 11236, 11238, 11240, 11242, 11244, 11246, 11248, 11250, 11252, \r
+    11254, 11256, 11258, 11260, 11262, 11264, 11266, 11268, 11270, 11272, \r
+    11274, 11276, 11278, 11280, 11282, 11284, 11286, 11288, 11290, 11292, \r
+    11294, 11296, 11298, 11300, 11302, 11304, 11306, 11308, 11310, 11312, \r
+    11314, 11316, 11318, 11320, 11322, 11324, 11326, 11328, 11330, 11332, \r
+    11334, 11336, 11338, 11340, 11342, 11344, 11346, 11348, 11350, 11352, \r
+    11354, 11356, 11358, 11360, 11362, 11364, 11366, 11368, 11370, 11372, \r
+    11374, 11376, 11378, 11380, 11382, 11384, 11386, 11388, 11390, 11392, \r
+    11394, 11396, 11398, 11400, 11402, 11404, 11406, 11408, 11410, 11412, \r
+    11414, 11416, 11418, 11420, 11422, 11424, 11426, 11428, 11430, 11432, \r
+    11434, 11436, 11438, 11440, 11442, 11444, 11446, 11448, 11450, 11452, \r
+    11454, 11456, 11458, 11460, 11462, 11464, 11466, 11468, 11470, 11472, \r
+    11474, 11476, 11478, 11480, 11482, 11484, 11486, 11488, 11490, 11492, \r
+    11494, 11496, 11498, 11500, 11502, 11504, 11506, 11508, 11510, 11512, \r
+    11514, 11516, 11518, 11520, 11522, 11524, 11526, 11528, 11530, 11532, \r
+    11534, 11536, 11538, 11540, 11542, 11544, 11546, 11548, 11550, 11552, \r
+    11554, 11556, 11558, 11560, 11562, 11564, 11566, 11568, 11570, 11572, \r
+    11574, 11576, 11578, 11580, 11582, 11584, 11586, 11588, 11590, 11592, \r
+    11594, 11596, 11598, 11600, 11602, 11604, 11606, 11608, 11610, 11612, \r
+    11614, 11616, 11618, 11620, 11622, 11624, 11626, 11628, 11630, 11632, \r
+    11634, 11636, 11638, 11640, 11642, 11644, 11646, 11648, 11650, 11652, \r
+    11654, 11656, 11658, 11660, 11662, 11664, 11666, 11668, 11670, 11672, \r
+    11674, 11676, 11678, 11680, 11682, 11684, 11686, 11688, 11690, 11692, \r
+    11694, 11696, 11698, 11700, 11702, 11704, 11706, 11708, 11710, 11712, \r
+    11714, 11716, 11718, 11720, 11722, 11724, 11726, 11728, 11730, 11732, \r
+    11734, 11736, 11738, 11740, 11742, 11744, 11746, 11748, 11750, 11752, \r
+    11754, 11756, 11758, 11760, 11762, 11764, 11766, 0, 0, 11768, 11770, \r
+    11772, 11774, 11776, 11778, 11780, 11782, 11784, 11786, 11788, 11790, \r
+    11792, 11794, 11796, 11798, 11800, 11802, 11804, 11806, 11808, 11810, \r
+    11812, 11814, 11816, 11818, 11820, 11822, 11824, 11826, 11828, 11830, \r
+    11832, 11834, 11836, 11838, 11840, 11842, 11844, 11846, 11848, 11850, \r
+    11852, 11854, 11856, 11858, 11860, 11862, 11864, 11866, 11868, 11870, \r
+    11872, 11874, 11876, 11878, 11880, 11882, 11884, 11886, 11888, 11890, \r
+    11892, 11894, 11896, 11898, 11900, 11902, 11904, 11906, 11908, 11910, \r
+    11912, 11914, 11916, 11918, 11920, 11922, 11924, 11926, 11928, 11930, \r
+    11932, 11934, 11936, 11938, 11940, 11942, 11944, 11946, 11948, 11950, \r
+    11952, 11954, 11956, 11958, 11960, 11962, 11964, 11966, 11968, 11970, \r
+    11972, 11974, 11976, 11978, 11980, 11982, 11984, 11986, 11988, 11990, \r
+    11992, 11994, 11996, 11998, 12000, 12002, 12004, 12006, 12008, 12010, \r
+    12012, 12014, 12016, 12018, 12020, 12022, 12024, 12026, 12028, 12030, \r
+    12032, 12034, 12036, 12038, 12040, 12042, 12044, 12046, 12048, 12050, \r
+    12052, 12054, 12056, 12058, 12060, 12062, 12064, 12066, 12068, 12070, \r
+    12072, 12074, 12076, 12078, 12080, 12082, 12084, 12086, 12088, 12090, \r
+    12092, 12094, 12096, 12098, 12100, 12102, 12104, 12106, 12108, 12110, \r
+    12112, 12114, 12116, 12118, 12120, 12122, 12124, 12126, 12128, 12130, \r
+    12132, 12134, 12136, 12138, 12140, 12142, 12144, 12146, 12148, 12150, \r
+    12152, 12154, 12156, 12158, 12160, 12162, 12164, 12166, 12168, 12170, \r
+    12172, 12174, 12176, 12178, 12180, 12182, 12184, 12186, 12188, 12190, \r
+    12192, 12194, 12196, 12198, 12200, 12202, 12204, 12206, 12208, 12210, \r
+    12212, 12214, 12216, 12218, 12220, 12222, 12224, 12226, 12228, 12230, \r
+    12232, 12234, 12236, 12238, 12240, 12242, 12244, 12246, 12248, 12250, \r
+    12252, 12254, 12256, 12258, 12260, 12262, 12264, 12266, 12268, 12270, \r
+    12272, 12274, 12276, 12278, 12280, 12282, 12284, 12286, 12288, 12290, \r
+    12292, 12294, 12296, 12298, 12300, 12302, 12304, 12306, 12308, 12310, \r
+    12312, 12314, 12316, 12318, 12320, 12322, 12324, 12326, 12328, 12330, \r
+    12332, 12334, 12336, 12338, 12340, 12342, 12344, 12346, 12348, 12350, 0, \r
+    0, 12352, 12354, 12356, 12358, 12360, 12362, 12364, 12366, 12368, 12370, \r
+    12372, 12374, 12376, 12378, 12380, 12382, 12384, 12386, 12388, 12390, \r
+    12392, 12394, 12396, 12398, 12400, 12402, 12404, 12406, 12408, 12410, \r
+    12412, 12414, 12416, 12418, 12420, 12422, 12424, 12426, 12428, 12430, \r
+    12432, 12434, 12436, 12438, 12440, 12442, 12444, 12446, 12448, 12450, \r
+    12452, 12455, 12458, 12461, 12464, 12467, 12470, 12473, 12476, 12479, \r
+    12482, 0, 0, 0, 0, 0, 12485, 12489, 12493, 12497, 12501, 12505, 12509, \r
+    12513, 12517, 12521, 12525, 12529, 12533, 12537, 12541, 12545, 12549, \r
+    12553, 12557, 12561, 12565, 12569, 12573, 12577, 12581, 12585, 12589, \r
+    12593, 12595, 12597, 12600, 0, 0, 12603, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    12605, 0, 12607, 0, 0, 12609, 0, 0, 0, 12611, 0, 0, 0, 12613, 12616, \r
+    12619, 12622, 12625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    12629, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12632, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12635, 12637, 12639, 12641, 12643, 12645, \r
+    12647, 12649, 12651, 12653, 12655, 12657, 12659, 12661, 12663, 12665, \r
+    12667, 12669, 12671, 12673, 12675, 12677, 12679, 12681, 12683, 12685, \r
+    12687, 12689, 12691, 12693, 12695, 12697, 12699, 12701, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 12703, 12707, 12711, 12715, 12719, 12723, 12727, \r
+    12731, 12735, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12739, 12741, \r
+    12743, 12745, 12747, 12749, 12751, 12753, 12755, 12757, 12759, 12761, \r
+    12763, 12765, 12767, 12769, 12771, 12773, 12775, 12777, 12779, 12781, \r
+    12783, 12785, 12787, 12789, 12791, 12793, 12795, 12797, 12799, 12801, \r
+    12803, 12805, 12807, 12809, 12811, 12813, 12815, 12817, 12819, 12821, \r
+    12823, 12825, 12827, 12829, 12831, 12833, 12835, 12837, 12839, 12841, \r
+    12843, 12845, 12847, 12849, 12851, 12853, 12855, 12857, 12859, 12861, \r
+    12863, 12865, 12867, 12869, 12871, 12873, 12875, 12877, 12879, 12881, \r
+    12883, 12885, 12887, 12889, 12891, 12893, 12895, 12897, 12899, 12901, \r
+    12903, 12905, 12907, 12909, 12911, 12913, 12915, 12917, 12919, 12921, \r
+    12923, 12925, 12927, 12929, 12931, 12933, 12935, 12937, 12939, 12941, \r
+    12943, 12945, 12947, 12949, 12951, 12953, 12955, 12957, 12959, 12961, \r
+    12963, 12965, 12967, 12969, 12971, 12973, 12975, 12977, 12979, 12981, \r
+    12983, 12985, 12987, 12989, 12991, 12993, 12995, 12997, 12999, 13001, \r
+    13003, 13005, 13007, 13009, 13011, 13013, 13015, 13017, 13019, 13021, \r
+    13023, 13025, 13027, 13029, 13031, 13033, 13035, 13037, 13039, 13041, \r
+    13043, 13045, 13047, 13049, 13051, 13053, 13055, 13057, 13059, 13061, \r
+    13063, 13065, 13067, 13069, 13071, 13073, 13075, 13077, 13079, 13081, \r
+    13083, 13085, 13087, 13089, 13091, 13093, 13095, 13097, 13099, 13101, \r
+    13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, \r
+    13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141, \r
+    13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, \r
+    13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 13181, \r
+    13183, 13185, 13187, 13189, 13191, 13193, 13195, 13197, 13199, 13201, \r
+    13203, 13205, 13207, 13209, 13211, 13213, 13215, 13217, 13219, 13221, \r
+    13223, 13225, 13227, 13229, 13231, 13233, 13235, 13237, 13239, 13241, \r
+    13243, 13245, 13247, 13249, 13251, 13253, 13255, 13257, 13259, 13261, \r
+    13263, 13265, 13267, 13269, 13271, 13273, 13275, 13277, 13279, 13281, \r
+    13283, 13285, 13287, 13289, 13291, 13293, 13295, 13297, 13299, 13301, \r
+    13303, 13305, 13307, 13309, 13311, 13313, 13315, 13317, 13319, 13321, \r
+    13323, 13325, 13327, 13329, 13331, 13333, 13335, 13337, 13339, 13341, \r
+    13343, 13345, 13347, 13349, 13351, 13353, 13355, 13357, 13359, 13361, \r
+    13363, 13365, 13367, 13369, 13371, 13373, 13375, 13377, 13379, 13381, \r
+    13383, 13385, 13387, 13389, 13391, 13393, 13395, 13397, 13399, 13401, \r
+    13403, 13405, 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13421, \r
+    13423, 13425, 13427, 13429, 13431, 13433, 13435, 13437, 13439, 13441, \r
+    13443, 13445, 13447, 13449, 13451, 13453, 13455, 13457, 13459, 13461, \r
+    13463, 13465, 13467, 13469, 13471, 13473, 13475, 13477, 13479, 13481, \r
+    13483, 13485, 13487, 13489, 13491, 13493, 13495, 13497, 13499, 13501, \r
+    13503, 13505, 13507, 13509, 13511, 13513, 13515, 13517, 13519, 13521, \r
+    13523, 13525, 13527, 13529, 13531, 13533, 13535, 13537, 13539, 13541, \r
+    13543, 13545, 13547, 13549, 13551, 13553, 13555, 13557, 13559, 13561, \r
+    13563, 13565, 13567, 13569, 13571, 13573, 13575, 13577, 13579, 13581, \r
+    13583, 13585, 13587, 13589, 13591, 13593, 13595, 13597, 13599, 13601, \r
+    13603, 13605, 13607, 13609, 13611, 13613, 13615, 13617, 13619, 13621, \r
+    13623, 13625, 13627, 13629, 13631, 13633, 13635, 13637, 13639, 13641, \r
+    13643, 13645, 13647, 13649, 13651, 13653, 13655, 13657, 13659, 13661, \r
+    13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, \r
+    13683, 13685, 13687, 13689, 13691, 13693, 13695, 13697, 13699, 13701, \r
+    13703, 13705, 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13721, \r
+    13723, 13725, 13727, 13729, 13731, 13733, 13735, 13737, 13739, 13741, \r
+    13743, 13745, 13747, 13749, 13751, 13753, 13755, 13757, 13759, 13761, \r
+    13763, 13765, 13767, 13769, 13771, 13773, 13775, 13777, 13779, 13781, \r
+    13783, 13785, 13787, 13789, 13791, 13793, 13795, 13797, 13799, 13801, \r
+    13803, 13805, 13807, 13809, 13811, 13813, 13815, 13817, 13819, 13821, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+};\r
+\r
+/* NFC pairs */\r
+#define COMP_SHIFT 2\r
+static unsigned short comp_index[] = {\r
+    0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 4, 5, 6, 7, 8, 9, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 11, 0, 12, 0, 0, 0, 0, 0, 0, 0, 13, 14, \r
+    15, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 19, 20, 21, 22, 0, 0, 0, \r
+    0, 0, 0, 23, 24, 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 31, 32, 33, 0, 0, 34, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    35, 36, 37, 38, 39, 40, 0, 0, 0, 0, 0, 0, 0, 41, 42, 43, 44, 45, 46, 47, \r
+    0, 0, 0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 0, \r
+    50, 0, 51, 52, 53, 0, 0, 0, 0, 0, 0, 54, 0, 0, 55, 56, 57, 58, 59, 0, 0, \r
+    0, 0, 0, 0, 60, 61, 0, 0, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 64, 65, 0, \r
+    66, 67, 68, 0, 0, 0, 0, 0, 0, 69, 70, 71, 72, 73, 74, 75, 0, 0, 0, 0, 0, \r
+    0, 0, 76, 0, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 78, 79, 0, 80, 81, 82, \r
+    83, 0, 0, 0, 0, 0, 0, 0, 84, 85, 86, 0, 87, 88, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 89, 90, 0, 91, 92, 93, 0, 0, 0, 0, 0, 0, 94, 95, 96, 97, 98, 99, 100, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 101, 0, 0, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103, \r
+    104, 0, 0, 105, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 107, 108, 109, 0, 110, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111, 112, \r
+    0, 113, 114, 0, 115, 0, 0, 0, 0, 0, 0, 0, 116, 117, 118, 119, 120, 121, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 0, 0, 123, 0, 124, 0, 0, 0, 0, 0, 0, 125, \r
+    126, 127, 128, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 131, 132, 133, \r
+    134, 0, 0, 0, 0, 0, 0, 0, 135, 136, 137, 138, 139, 140, 141, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 143, 144, 145, 146, 0, \r
+    147, 0, 0, 0, 0, 0, 0, 0, 0, 148, 149, 150, 151, 152, 153, 154, 0, 0, 0, \r
+    0, 0, 0, 0, 155, 156, 157, 158, 159, 160, 161, 0, 0, 0, 0, 0, 0, 0, 162, \r
+    0, 163, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 165, 166, 167, 0, 168, \r
+    0, 0, 0, 0, 0, 0, 169, 0, 0, 170, 171, 172, 173, 0, 0, 0, 0, 0, 0, 0, \r
+    174, 175, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 177, 178, 179, 180, 0, 181, \r
+    182, 183, 0, 0, 0, 0, 0, 0, 184, 185, 186, 187, 188, 0, 189, 0, 0, 0, 0, \r
+    0, 0, 0, 190, 191, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, 194, \r
+    195, 196, 197, 198, 0, 0, 0, 0, 0, 0, 0, 199, 200, 201, 0, 202, 203, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 204, 205, 206, 207, 208, 209, 0, 0, 0, 0, 0, 0, \r
+    210, 211, 212, 213, 214, 215, 216, 0, 0, 0, 0, 0, 0, 0, 217, 0, 0, 0, \r
+    218, 0, 0, 0, 0, 0, 0, 0, 0, 219, 220, 221, 222, 0, 223, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, 227, 0, \r
+    228, 0, 0, 0, 0, 0, 0, 0, 0, 0, 229, 230, 231, 0, 232, 0, 233, 0, 0, 0, \r
+    0, 0, 0, 234, 235, 0, 0, 0, 0, 0, 236, 0, 0, 0, 0, 0, 0, 237, 238, 239, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 241, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 242, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 243, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 245, 246, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    248, 249, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 251, 252, 253, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 257, 0, 258, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 259, 260, 261, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 262, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 263, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    264, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 265, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 266, 267, 268, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 269, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 270, 271, 272, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 273, 274, 275, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 277, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 278, 279, \r
+    0, 280, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 282, 283, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 284, 285, 286, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 287, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 288, 289, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    290, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 291, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 292, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 293, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 294, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    295, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 296, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 297, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 298, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    300, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 301, 302, 303, 0, 0, 304, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 305, 306, 307, 0, 308, 0, 0, 0, 0, 0, 0, 0, 0, 0, 309, \r
+    310, 311, 0, 312, 0, 0, 0, 0, 0, 0, 0, 0, 0, 313, 0, 314, 0, 315, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 316, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 317, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 319, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 321, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 322, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 323, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    324, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 325, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 326, 327, 0, 328, 329, 0, 0, 330, 0, 0, 0, 0, 0, 0, 331, 0, \r
+    0, 332, 0, 0, 0, 0, 0, 0, 0, 0, 0, 333, 334, 0, 0, 335, 0, 0, 0, 336, 0, \r
+    0, 0, 0, 0, 337, 338, 339, 0, 340, 0, 0, 0, 0, 0, 0, 0, 0, 0, 341, 0, 0, \r
+    342, 343, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 344, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 345, 346, 347, 0, 348, 0, 0, 0, 0, 0, 0, 0, 0, 0, 349, 0, 0, 0, \r
+    350, 0, 0, 351, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 352, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 353, 0, 0, 0, 0, 0, 354, 355, 356, 0, 357, 0, \r
+    0, 358, 359, 0, 0, 0, 0, 0, 360, 0, 0, 0, 361, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    362, 0, 0, 363, 364, 0, 0, 365, 0, 0, 0, 0, 0, 0, 366, 367, 0, 368, 0, 0, \r
+    0, 369, 0, 0, 0, 0, 0, 370, 371, 0, 0, 372, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 374, 375, 376, 377, 378, 0, 0, \r
+    379, 0, 0, 0, 0, 0, 0, 380, 0, 0, 381, 0, 0, 0, 382, 0, 0, 0, 0, 0, 383, \r
+    384, 0, 0, 0, 0, 0, 385, 0, 0, 0, 0, 0, 0, 386, 0, 0, 0, 0, 0, 0, 387, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 388, 0, 0, 0, 0, 0, 0, 389, 390, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 391, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 392, 393, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 394, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 395, 396, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 397, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 398, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 399, 400, 401, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 402, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 403, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 404, \r
+    405, 406, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 408, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 409, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 410, 411, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    412, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 413, 414, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 415, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 416, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 417, 418, 419, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 420, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 421, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 422, 423, 424, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    425, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 426, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 427, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 428, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    430, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 433, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 434, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 435, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 436, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 437, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 438, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 439, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 440, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 441, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 443, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 444, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 446, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 447, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 448, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 449, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 450, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 451, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 452, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 453, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 454, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 455, 456, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 457, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 458, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 459, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 460, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 461, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 462, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 463, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 464, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 465, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 466, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 467, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 468, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 469, 0, \r
+    470, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 471, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 473, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    475, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 476, 477, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 478, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 480, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    481, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 482, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 483, 0, 0, 0, 0, 0, 0, 484, 0, 0, 0, 0, 0, 0, 485, 0, 0, 0, \r
+    0, 0, 0, 486, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 489, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 491, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 492, 0, 0, 0, 0, 0, 0, \r
+    493, 0, 0, 0, 0, 0, 0, 494, 0, 0, 0, 0, 0, 0, 495, 0, 0, 0, 0, 0, 0, 496, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 497, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 498, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 499, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 500, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 501, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 502, 0, 0, 0, 0, 0, 0, 503, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 504, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 505, \r
+    506, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 507, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 508, 0, 0, 0, 0, 0, 0, 509, 0, 0, 0, 0, 0, 0, 510, 0, 0, 0, \r
+    0, 0, 0, 511, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 512, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 513, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 514, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 515, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 516, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 517, 0, 0, 0, 0, 0, 0, \r
+    518, 0, 0, 0, 0, 0, 0, 519, 0, 0, 0, 0, 0, 0, 520, 0, 0, 0, 0, 0, 0, 521, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 522, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 524, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 525, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 526, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 527, 0, 0, 0, 0, 0, 0, 528, 0, 0, 0, 0, \r
+    0, 0, 529, 0, 0, 0, 0, 0, 0, 530, 0, 0, 0, 0, 0, 0, 531, 0, 0, 0, 0, 0, \r
+    532, 533, 0, 0, 0, 0, 0, 534, 0, 0, 0, 0, 0, 0, 535, 0, 0, 0, 0, 0, 0, \r
+    536, 0, 0, 0, 0, 0, 0, 537, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 538, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 539, 540, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 541, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 542, 0, 0, 0, 0, 0, \r
+    0, 543, 0, 0, 0, 0, 0, 0, 544, 0, 0, 0, 0, 0, 0, 545, 0, 0, 0, 0, 0, 546, \r
+    547, 0, 0, 0, 0, 0, 548, 0, 0, 0, 0, 0, 0, 549, 0, 0, 0, 0, 0, 0, 550, 0, \r
+    0, 0, 0, 0, 0, 551, 0, 0, 0, 0, 0, 0, 552, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 553, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 554, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 555, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 556, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 557, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 558, 0, 0, 0, 0, 0, 559, 0, 0, 0, 0, 0, 0, 560, 0, 0, 0, 0, 0, 0, \r
+    561, 0, 0, 0, 0, 0, 0, 562, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 563, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 564, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 565, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 566, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 567, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 568, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 569, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 570, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 571, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 572, 0, 0, 0, 0, 0, 573, 0, 0, 0, 0, 0, 0, 574, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 575, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 576, 0, 0, 0, 0, 0, 577, 578, 0, 0, 0, 0, 0, 579, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 580, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 581, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 582, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    583, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 584, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 585, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 586, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 587, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    588, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 589, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 591, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 592, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    593, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 594, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 595, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 596, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 597, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 598, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 599, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 600, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 601, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 602, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 603, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 604, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 605, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 606, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 607, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 609, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 611, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 612, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 613, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 614, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    615, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 616, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 617, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 618, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 619, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    620, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 621, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    623, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 624, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 625, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 626, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 627, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    628, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 629, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 630, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 631, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 632, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    633, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 634, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 635, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 636, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 637, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    638, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 639, 640, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 641, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 642, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 643, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 645, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 646, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 647, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 648, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    649, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 650, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 652, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 653, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    654, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 655, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 656, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 657, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 658, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    659, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 660, 661, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 662, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 663, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    665, 666, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 667, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 668, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 669, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 670, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    671, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 672, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 673, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 674, \r
+};\r
+\r
+static unsigned int comp_data[] = {\r
+    0, 0, 0, 0, 0, 0, 0, 8814, 0, 0, 8800, 0, 0, 8815, 0, 0, 0, 192, 193, \r
+    194, 195, 256, 258, 550, 196, 7842, 197, 0, 461, 512, 514, 0, 0, 0, 7840, \r
+    0, 7680, 0, 0, 260, 0, 0, 7682, 0, 0, 7684, 0, 0, 0, 0, 7686, 0, 262, \r
+    264, 0, 0, 0, 266, 0, 0, 0, 0, 268, 0, 199, 0, 0, 0, 7690, 0, 0, 0, 0, \r
+    270, 0, 0, 0, 0, 0, 7692, 0, 0, 0, 7696, 0, 7698, 0, 0, 7694, 0, 0, 0, 0, \r
+    200, 201, 202, 7868, 274, 276, 278, 203, 7866, 0, 0, 282, 516, 518, 0, 0, \r
+    0, 7864, 0, 0, 0, 552, 280, 7704, 0, 7706, 0, 0, 0, 7710, 0, 500, 284, 0, \r
+    7712, 286, 288, 0, 0, 0, 0, 486, 0, 290, 0, 0, 0, 292, 0, 0, 0, 7714, \r
+    7718, 0, 0, 0, 542, 0, 0, 0, 0, 0, 7716, 0, 0, 0, 7720, 0, 0, 7722, 0, 0, \r
+    204, 205, 206, 296, 298, 300, 304, 207, 7880, 0, 0, 463, 520, 522, 0, 0, \r
+    0, 7882, 0, 0, 0, 0, 302, 0, 0, 7724, 0, 0, 0, 308, 0, 7728, 0, 0, 0, 0, \r
+    0, 488, 0, 7730, 0, 0, 0, 310, 0, 0, 0, 0, 7732, 0, 0, 0, 0, 0, 313, 0, \r
+    317, 0, 0, 0, 0, 0, 7734, 0, 0, 0, 315, 0, 7740, 0, 0, 7738, 0, 0, 0, 0, \r
+    0, 7742, 0, 0, 0, 0, 7744, 0, 0, 7746, 0, 504, 323, 0, 209, 0, 0, 7748, \r
+    0, 0, 0, 0, 327, 0, 7750, 0, 0, 0, 325, 0, 7754, 0, 0, 7752, 0, 0, 0, 0, \r
+    210, 211, 212, 213, 332, 334, 558, 214, 7886, 0, 336, 465, 524, 526, 0, \r
+    0, 416, 7884, 0, 0, 0, 0, 490, 0, 0, 0, 0, 0, 7764, 7766, 0, 0, 0, 0, 0, \r
+    340, 0, 0, 0, 0, 7768, 344, 528, 530, 0, 0, 0, 7770, 0, 0, 0, 342, 0, 0, \r
+    0, 0, 7774, 0, 346, 348, 0, 0, 0, 7776, 0, 0, 0, 0, 352, 0, 7778, 0, 0, \r
+    536, 350, 0, 0, 0, 7786, 0, 0, 0, 0, 356, 0, 7788, 0, 0, 538, 354, 0, \r
+    7792, 0, 0, 7790, 0, 0, 0, 0, 217, 218, 219, 360, 362, 364, 0, 220, 7910, \r
+    366, 368, 467, 532, 534, 0, 0, 431, 7908, 7794, 0, 0, 0, 370, 7798, 0, \r
+    7796, 7804, 0, 0, 0, 0, 0, 7806, 0, 7808, 7810, 372, 0, 0, 0, 7814, 7812, \r
+    0, 7816, 0, 0, 0, 7818, 7820, 0, 0, 0, 7922, 221, 374, 7928, 562, 0, \r
+    7822, 376, 7926, 0, 0, 0, 0, 7924, 0, 0, 377, 7824, 0, 0, 0, 379, 381, 0, \r
+    0, 0, 0, 0, 7826, 0, 0, 0, 0, 7828, 224, 225, 226, 227, 257, 259, 551, \r
+    228, 7843, 229, 0, 462, 513, 515, 0, 0, 0, 7841, 0, 7681, 0, 0, 261, 0, \r
+    0, 7683, 0, 0, 7685, 0, 0, 0, 0, 7687, 0, 0, 0, 0, 0, 263, 265, 0, 0, 0, \r
+    267, 0, 0, 0, 0, 269, 0, 0, 0, 0, 0, 231, 0, 0, 0, 7691, 271, 0, 0, 0, 0, \r
+    0, 7693, 0, 0, 0, 7697, 0, 7699, 0, 0, 7695, 232, 233, 234, 7869, 275, \r
+    277, 279, 235, 7867, 0, 0, 283, 517, 519, 0, 0, 0, 7865, 0, 0, 0, 553, \r
+    281, 7705, 0, 7707, 0, 0, 0, 7711, 0, 0, 0, 0, 0, 501, 285, 0, 7713, 287, \r
+    289, 0, 0, 0, 0, 487, 0, 0, 0, 0, 0, 291, 0, 0, 0, 293, 0, 0, 0, 7715, \r
+    7719, 0, 0, 0, 543, 0, 0, 0, 0, 0, 7717, 0, 0, 0, 7721, 0, 0, 7723, 0, \r
+    7830, 236, 237, 238, 297, 299, 301, 0, 239, 7881, 0, 0, 464, 521, 523, 0, \r
+    0, 0, 7883, 0, 0, 0, 0, 303, 0, 0, 7725, 0, 0, 0, 309, 0, 0, 0, 0, 496, \r
+    0, 0, 0, 0, 7729, 0, 489, 0, 0, 0, 0, 0, 7731, 0, 0, 0, 311, 7733, 0, 0, \r
+    0, 0, 0, 314, 0, 318, 0, 0, 0, 0, 0, 7735, 0, 0, 0, 316, 0, 7741, 0, 0, \r
+    7739, 0, 7743, 0, 0, 0, 0, 7745, 0, 0, 7747, 0, 0, 0, 0, 0, 505, 324, 0, \r
+    241, 0, 0, 7749, 0, 0, 0, 0, 328, 0, 7751, 0, 0, 0, 326, 0, 7755, 0, 0, \r
+    7753, 0, 0, 0, 0, 242, 243, 244, 245, 333, 335, 559, 246, 7887, 0, 337, \r
+    466, 525, 527, 0, 0, 417, 7885, 491, 0, 0, 0, 0, 0, 7765, 0, 0, 0, 0, \r
+    7767, 0, 341, 0, 0, 0, 0, 7769, 0, 0, 0, 0, 345, 529, 531, 0, 0, 0, 7771, \r
+    0, 0, 0, 343, 0, 0, 0, 0, 7775, 0, 347, 349, 0, 0, 0, 7777, 0, 0, 0, 0, \r
+    353, 0, 7779, 0, 0, 537, 351, 0, 0, 0, 7787, 7831, 0, 0, 0, 357, 0, 0, 0, \r
+    0, 0, 7789, 0, 0, 539, 355, 0, 7793, 0, 0, 7791, 0, 0, 0, 0, 249, 250, \r
+    251, 361, 363, 365, 0, 252, 7911, 367, 369, 468, 533, 535, 0, 0, 432, \r
+    7909, 7795, 0, 0, 0, 371, 7799, 0, 7797, 0, 0, 0, 0, 7805, 0, 7807, 0, 0, \r
+    0, 0, 0, 7809, 7811, 373, 0, 0, 0, 7815, 7813, 0, 7832, 0, 0, 0, 7817, 0, \r
+    0, 0, 7819, 7821, 0, 0, 0, 7923, 253, 375, 7929, 563, 0, 7823, 255, 7927, \r
+    7833, 0, 0, 0, 7925, 0, 0, 378, 7825, 0, 0, 0, 380, 0, 0, 0, 0, 382, 0, \r
+    7827, 0, 0, 0, 0, 7829, 0, 0, 0, 0, 8173, 901, 0, 0, 0, 0, 0, 0, 8129, 0, \r
+    0, 7846, 7844, 0, 7850, 0, 0, 0, 0, 7848, 0, 0, 478, 0, 0, 0, 506, 0, 0, \r
+    508, 0, 0, 482, 0, 0, 0, 7688, 0, 7872, 7870, 0, 7876, 0, 0, 0, 0, 7874, \r
+    0, 0, 0, 7726, 0, 0, 0, 0, 0, 7890, 7888, 0, 7894, 0, 0, 0, 0, 7892, 0, \r
+    0, 0, 7756, 0, 0, 556, 0, 0, 7758, 0, 0, 0, 554, 0, 0, 0, 510, 0, 0, 0, \r
+    0, 0, 475, 471, 0, 0, 469, 0, 0, 473, 0, 0, 0, 7847, 7845, 0, 7851, 0, 0, \r
+    0, 0, 7849, 0, 0, 479, 0, 0, 0, 507, 0, 0, 509, 0, 0, 483, 0, 0, 0, 7689, \r
+    0, 7873, 7871, 0, 7877, 0, 0, 0, 0, 7875, 0, 0, 0, 7727, 0, 0, 0, 0, 0, \r
+    7891, 7889, 0, 7895, 0, 0, 0, 0, 7893, 0, 0, 0, 7757, 0, 0, 557, 0, 0, \r
+    7759, 0, 0, 0, 555, 0, 0, 0, 511, 0, 0, 0, 0, 0, 476, 472, 0, 0, 470, 0, \r
+    0, 474, 0, 0, 0, 7856, 7854, 0, 7860, 0, 0, 0, 0, 7858, 0, 0, 7857, 7855, \r
+    0, 7861, 0, 0, 0, 0, 7859, 0, 0, 7700, 7702, 0, 0, 0, 0, 0, 7701, 7703, \r
+    0, 0, 0, 0, 0, 7760, 7762, 0, 7761, 7763, 0, 0, 0, 7780, 0, 0, 7781, 0, \r
+    0, 7782, 0, 0, 0, 0, 0, 0, 7783, 0, 7800, 0, 0, 7801, 0, 0, 0, 0, 7802, \r
+    0, 0, 7803, 0, 0, 0, 0, 0, 7835, 0, 0, 0, 0, 7900, 7898, 0, 7904, 0, 0, \r
+    0, 0, 7902, 7906, 0, 0, 0, 0, 0, 7901, 7899, 0, 7905, 0, 0, 0, 0, 7903, \r
+    0, 0, 0, 0, 7907, 0, 7914, 7912, 0, 7918, 0, 0, 0, 0, 7916, 0, 0, 0, 0, \r
+    7920, 0, 7915, 7913, 0, 7919, 7917, 0, 0, 0, 0, 7921, 0, 0, 0, 0, 494, 0, \r
+    0, 0, 492, 0, 0, 493, 0, 0, 480, 0, 0, 0, 0, 0, 0, 481, 0, 0, 0, 7708, 0, \r
+    0, 7709, 0, 560, 0, 0, 0, 0, 0, 0, 561, 0, 495, 0, 0, 0, 8122, 902, 0, 0, \r
+    8121, 8120, 0, 0, 0, 0, 7944, 7945, 0, 0, 0, 0, 0, 8124, 0, 8136, 904, 0, \r
+    0, 0, 0, 7960, 7961, 0, 0, 0, 8138, 905, 0, 0, 0, 0, 7976, 7977, 0, 8140, \r
+    0, 0, 0, 0, 0, 8154, 906, 0, 0, 8153, 8152, 0, 938, 0, 0, 7992, 7993, 0, \r
+    0, 0, 8184, 908, 0, 0, 0, 0, 8008, 8009, 0, 0, 0, 0, 0, 0, 8172, 0, 0, 0, \r
+    8170, 910, 0, 0, 8169, 8168, 0, 939, 0, 0, 0, 8025, 0, 0, 0, 8186, 911, \r
+    8040, 8041, 0, 0, 0, 0, 0, 8188, 0, 0, 8116, 0, 0, 8132, 0, 0, 0, 0, 0, \r
+    8048, 940, 0, 0, 8113, 8112, 0, 0, 0, 0, 7936, 7937, 0, 0, 0, 0, 8118, \r
+    8115, 0, 0, 0, 0, 0, 8050, 941, 7952, 7953, 0, 0, 0, 8052, 942, 0, 0, 0, \r
+    0, 7968, 7969, 0, 0, 0, 0, 8134, 8131, 0, 8054, 943, 0, 0, 8145, 8144, 0, \r
+    970, 0, 0, 7984, 7985, 8150, 0, 0, 0, 0, 0, 0, 8056, 972, 0, 0, 0, 0, \r
+    8000, 8001, 0, 8164, 8165, 0, 0, 0, 8058, 973, 0, 0, 8161, 8160, 0, 971, \r
+    0, 0, 0, 0, 0, 0, 8016, 8017, 0, 0, 0, 0, 8166, 0, 0, 8060, 974, 0, 0, 0, \r
+    0, 8032, 8033, 8182, 8179, 0, 0, 0, 0, 0, 8146, 912, 0, 0, 0, 0, 0, 0, \r
+    8151, 0, 0, 8162, 944, 0, 0, 8167, 0, 0, 0, 8180, 0, 0, 979, 0, 0, 0, 0, \r
+    0, 980, 0, 0, 1031, 0, 0, 0, 0, 1232, 0, 1234, 0, 0, 0, 0, 1027, 0, 1024, \r
+    0, 0, 0, 0, 1238, 0, 1025, 1217, 0, 1244, 0, 0, 1246, 0, 0, 0, 1037, 0, \r
+    0, 0, 1250, 1049, 0, 1252, 0, 0, 0, 0, 1036, 0, 0, 0, 0, 1254, 0, 0, 0, \r
+    1262, 1038, 0, 1264, 0, 0, 1266, 0, 0, 0, 1268, 0, 0, 0, 0, 0, 0, 1272, \r
+    0, 0, 1260, 0, 0, 0, 0, 1233, 0, 1235, 0, 0, 0, 0, 1107, 0, 1104, 0, 0, \r
+    0, 0, 1239, 0, 1105, 1218, 0, 1245, 0, 0, 1247, 0, 0, 0, 1117, 0, 0, 0, \r
+    1251, 1081, 0, 1253, 0, 0, 0, 0, 1116, 0, 0, 0, 0, 1255, 0, 0, 0, 1263, \r
+    1118, 0, 1265, 0, 0, 1267, 0, 0, 0, 1269, 0, 0, 0, 0, 0, 0, 1273, 0, 0, \r
+    1261, 0, 0, 1111, 0, 0, 0, 1142, 0, 0, 1143, 0, 0, 0, 0, 0, 1242, 0, 0, \r
+    1243, 0, 0, 1258, 0, 0, 0, 0, 0, 0, 1259, 0, 1570, 1571, 1573, 0, 1572, \r
+    0, 0, 1574, 0, 0, 0, 0, 0, 0, 1730, 0, 0, 1747, 0, 0, 1728, 0, 0, 0, 0, \r
+    2345, 0, 0, 2353, 0, 0, 2356, 0, 0, 0, 2507, 2508, 0, 0, 0, 2891, 2888, \r
+    2892, 2964, 0, 0, 0, 0, 0, 3018, 3020, 0, 3019, 0, 0, 0, 0, 3144, 0, 0, \r
+    0, 0, 3264, 0, 3274, 3271, 3272, 0, 3275, 0, 0, 0, 0, 3402, 3404, 0, \r
+    3403, 0, 0, 0, 0, 3546, 3548, 3550, 0, 0, 0, 0, 3549, 0, 0, 0, 0, 0, \r
+    4134, 0, 0, 0, 6918, 0, 0, 6920, 0, 0, 6922, 0, 0, 6924, 0, 0, 0, 0, 0, \r
+    0, 6926, 0, 0, 6930, 0, 0, 6971, 0, 0, 6973, 0, 0, 0, 0, 0, 0, 6976, 0, \r
+    0, 6977, 0, 0, 6979, 0, 0, 0, 7736, 0, 0, 7737, 0, 0, 0, 0, 0, 0, 7772, \r
+    0, 0, 7773, 0, 0, 0, 0, 7784, 0, 0, 7785, 0, 0, 7852, 0, 0, 7862, 0, 0, \r
+    0, 7853, 0, 0, 7863, 0, 0, 0, 7878, 0, 0, 7879, 0, 0, 7896, 0, 0, 7897, \r
+    0, 0, 0, 0, 7938, 7940, 0, 0, 7942, 8064, 0, 7939, 7941, 0, 0, 7943, \r
+    8065, 0, 0, 8066, 0, 0, 0, 0, 0, 0, 8067, 0, 0, 8068, 0, 0, 8069, 0, 0, \r
+    8070, 0, 0, 0, 0, 0, 0, 8071, 0, 7946, 7948, 0, 0, 7950, 8072, 0, 7947, \r
+    7949, 0, 0, 7951, 8073, 0, 0, 8074, 0, 0, 0, 0, 0, 0, 8075, 0, 0, 8076, \r
+    0, 0, 8077, 0, 0, 8078, 0, 0, 0, 0, 0, 0, 8079, 0, 7954, 7956, 0, 7955, \r
+    7957, 0, 0, 0, 0, 0, 7962, 7964, 0, 0, 0, 0, 0, 7963, 7965, 0, 7970, \r
+    7972, 0, 0, 7974, 8080, 0, 7971, 7973, 0, 0, 7975, 8081, 0, 0, 8082, 0, \r
+    0, 0, 0, 0, 0, 8083, 0, 0, 8084, 0, 0, 8085, 0, 0, 8086, 0, 0, 0, 0, 0, \r
+    0, 8087, 0, 7978, 7980, 0, 0, 7982, 8088, 0, 7979, 7981, 0, 0, 7983, \r
+    8089, 0, 0, 8090, 0, 0, 0, 0, 0, 0, 8091, 0, 0, 8092, 0, 0, 8093, 0, 0, \r
+    8094, 0, 0, 0, 0, 0, 0, 8095, 0, 7986, 7988, 0, 0, 7990, 0, 0, 7987, \r
+    7989, 0, 0, 7991, 0, 0, 0, 0, 0, 0, 7994, 7996, 0, 0, 0, 0, 0, 0, 7998, \r
+    0, 0, 7995, 7997, 0, 0, 7999, 0, 0, 8002, 8004, 0, 8003, 8005, 0, 0, 0, \r
+    0, 0, 8010, 8012, 0, 0, 0, 0, 0, 8011, 8013, 0, 8018, 8020, 0, 0, 8022, \r
+    0, 0, 8019, 8021, 0, 0, 8023, 0, 0, 0, 0, 0, 0, 8027, 8029, 0, 0, 0, 0, \r
+    0, 0, 8031, 0, 0, 8034, 8036, 0, 0, 8038, 8096, 0, 8035, 8037, 0, 0, \r
+    8039, 8097, 0, 0, 8098, 0, 0, 8099, 0, 0, 0, 0, 0, 0, 8100, 0, 0, 8101, \r
+    0, 0, 8102, 0, 0, 8103, 0, 0, 0, 0, 0, 8042, 8044, 0, 0, 8046, 8104, 0, \r
+    8043, 8045, 0, 0, 8047, 8105, 0, 0, 8106, 0, 0, 8107, 0, 0, 0, 0, 0, 0, \r
+    8108, 0, 0, 8109, 0, 0, 8110, 0, 0, 8111, 0, 0, 0, 0, 0, 0, 8114, 0, 0, \r
+    8130, 0, 0, 8178, 0, 0, 8119, 0, 0, 0, 0, 0, 8141, 8142, 0, 0, 8143, 0, \r
+    0, 0, 8135, 0, 0, 8183, 0, 0, 0, 0, 0, 8157, 8158, 0, 0, 0, 0, 0, 0, \r
+    8159, 0, 8602, 0, 0, 8603, 0, 0, 0, 0, 0, 0, 8622, 0, 0, 8653, 0, 0, \r
+    8655, 0, 0, 8654, 0, 0, 0, 0, 0, 0, 8708, 0, 0, 8713, 0, 0, 8716, 0, 0, \r
+    8740, 0, 0, 0, 0, 0, 0, 8742, 0, 0, 8769, 0, 0, 8772, 0, 0, 8775, 0, 0, \r
+    0, 0, 0, 0, 8777, 0, 0, 8813, 0, 0, 8802, 0, 0, 8816, 0, 0, 0, 0, 0, 0, \r
+    8817, 0, 0, 8820, 0, 0, 8821, 0, 0, 8824, 0, 0, 0, 0, 0, 0, 8825, 0, 0, \r
+    8832, 0, 0, 8833, 0, 0, 8928, 0, 0, 0, 0, 0, 0, 8929, 0, 0, 8836, 0, 0, \r
+    8837, 0, 0, 8840, 0, 0, 0, 0, 0, 0, 8841, 0, 0, 8930, 0, 0, 8931, 0, 0, \r
+    8876, 0, 0, 0, 0, 0, 0, 8877, 0, 0, 8878, 0, 0, 8879, 0, 0, 8938, 0, 0, \r
+    0, 0, 0, 0, 8939, 0, 0, 8940, 0, 0, 8941, 0, 0, 0, 12436, 0, 0, 12364, 0, \r
+    0, 0, 0, 0, 0, 12366, 0, 0, 12368, 0, 0, 12370, 0, 0, 12372, 0, 0, 0, 0, \r
+    0, 0, 12374, 0, 0, 12376, 0, 0, 12378, 0, 0, 12380, 0, 0, 0, 0, 0, 0, \r
+    12382, 0, 0, 12384, 0, 0, 12386, 0, 0, 12389, 0, 0, 0, 0, 0, 0, 12391, 0, \r
+    0, 12393, 0, 0, 12400, 12401, 0, 12403, 12404, 0, 0, 0, 0, 0, 12406, \r
+    12407, 0, 0, 0, 0, 0, 12409, 12410, 0, 12412, 12413, 0, 12446, 0, 0, 0, \r
+    0, 0, 0, 12532, 0, 0, 12460, 0, 0, 12462, 0, 0, 12464, 0, 0, 0, 0, 0, 0, \r
+    12466, 0, 0, 12468, 0, 0, 12470, 0, 0, 12472, 0, 0, 0, 0, 0, 0, 12474, 0, \r
+    0, 12476, 0, 0, 12478, 0, 0, 12480, 0, 0, 0, 0, 0, 0, 12482, 0, 0, 12485, \r
+    0, 0, 12487, 0, 0, 12489, 0, 0, 0, 0, 0, 0, 12496, 12497, 0, 0, 0, 0, 0, \r
+    12499, 12500, 0, 12502, 12503, 0, 12505, 12506, 0, 0, 0, 0, 0, 12508, \r
+    12509, 0, 0, 0, 0, 0, 12535, 0, 0, 12536, 0, 0, 12537, 0, 0, 0, 0, 0, 0, \r
+    12538, 0, 0, 12542, 0, 0, 0, 0, 69786, 0, 0, 69788, 0, 0, 69803, \r
+};\r
+\r
+static const change_record change_records_3_2_0[] = {\r
+       { 255, 255, 255, 255, 0 },\r
+       { 11, 255, 255, 255, 0 },\r
+       { 10, 255, 255, 255, 0 },\r
+       { 19, 21, 255, 255, 0 },\r
+       { 255, 255, 2, 255, 0 },\r
+       { 255, 255, 3, 255, 0 },\r
+       { 255, 255, 1, 255, 0 },\r
+       { 255, 0, 255, 255, 0 },\r
+       { 255, 2, 255, 255, 0 },\r
+       { 255, 29, 255, 255, 0 },\r
+       { 255, 26, 255, 255, 0 },\r
+       { 5, 255, 255, 255, 0 },\r
+       { 255, 255, 255, 255, 1.0 },\r
+       { 255, 255, 255, 255, 2.0 },\r
+       { 255, 255, 255, 255, 3.0 },\r
+       { 255, 255, 255, 255, 4.0 },\r
+       { 255, 255, 255, 255, -1 },\r
+       { 14, 255, 255, 255, 0 },\r
+       { 255, 255, 255, 0, 0 },\r
+       { 255, 7, 1, 255, 0 },\r
+       { 255, 7, 2, 255, 0 },\r
+       { 255, 7, 3, 255, 0 },\r
+       { 255, 7, 4, 255, 0 },\r
+       { 255, 7, 5, 255, 0 },\r
+       { 255, 7, 6, 255, 0 },\r
+       { 255, 7, 7, 255, 0 },\r
+       { 255, 7, 8, 255, 0 },\r
+       { 255, 7, 9, 255, 0 },\r
+       { 255, 5, 255, 255, 0 },\r
+       { 15, 14, 255, 255, 0 },\r
+       { 255, 10, 255, 255, 0 },\r
+       { 18, 255, 255, 255, 0 },\r
+       { 19, 255, 255, 255, 0 },\r
+       { 255, 255, 0, 255, 0 },\r
+       { 255, 255, 4, 255, 0 },\r
+       { 255, 255, 5, 255, 0 },\r
+       { 255, 255, 6, 255, 0 },\r
+       { 255, 255, 7, 255, 0 },\r
+       { 255, 255, 8, 255, 0 },\r
+       { 255, 255, 9, 255, 0 },\r
+       { 19, 30, 255, 255, 0 },\r
+       { 255, 8, 255, 255, 0 },\r
+       { 255, 22, 255, 255, 0 },\r
+       { 255, 23, 255, 255, 0 },\r
+       { 9, 255, 255, 255, 0 },\r
+       { 255, 20, 255, 255, 0 },\r
+       { 255, 255, 255, 255, 1e+16 },\r
+       { 255, 255, 255, 255, 1e+20 },\r
+       { 255, 19, 255, 255, 0 },\r
+       { 15, 255, 255, 255, 0 },\r
+       { 255, 19, 255, 255, -1 },\r
+       { 1, 255, 255, 0, 0 },\r
+};\r
+static unsigned char changes_3_2_0_index[] = {\r
+    0, 1, 2, 2, 3, 4, 5, 6, 2, 7, 8, 9, 10, 11, 12, 13, 14, 2, 15, 16, 17, \r
+    18, 19, 20, 21, 22, 23, 2, 2, 2, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, \r
+    34, 2, 2, 2, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, \r
+    49, 2, 50, 2, 2, 51, 52, 53, 54, 55, 2, 2, 56, 57, 58, 2, 2, 59, 60, 61, \r
+    62, 63, 63, 2, 2, 2, 2, 64, 2, 65, 66, 67, 68, 69, 2, 2, 2, 2, 70, 71, \r
+    72, 73, 74, 75, 76, 77, 78, 2, 2, 2, 2, 2, 2, 79, 2, 2, 2, 2, 2, 80, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 81, 2, 82, 2, 2, 2, 2, 2, 2, 2, 2, 83, \r
+    84, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 86, 87, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 88, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 89, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 91, 92, 2, 2, 2, 2, 2, 2, 2, 2, 93, 48, 48, \r
+    94, 95, 48, 96, 97, 98, 99, 100, 101, 102, 2, 103, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 105, 106, 107, 108, 109, 2, 2, 2, 2, 110, 111, 2, 112, 113, 114, \r
+    115, 116, 117, 2, 118, 119, 120, 121, 122, 2, 2, 2, 2, 2, 2, 123, 2, 124, \r
+    2, 125, 2, 126, 2, 127, 2, 2, 2, 128, 2, 2, 2, 2, 129, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    48, 48, 48, 48, 48, 48, 130, 2, 131, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 132, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    133, 2, 134, 2, 135, 2, 2, 136, 2, 2, 2, 137, 138, 139, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 140, 141, 142, 143, \r
+    144, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 145, 146, 90, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    79, 147, 2, 148, 149, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 151, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 152, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 153, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, \r
+    48, 154, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 150, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 48, \r
+    155, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+    2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, \r
+};\r
+\r
+static unsigned char changes_3_2_0_data[] = {\r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 4, 5, 0, 0, 0, 0, 0, 6, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 9, 0, 7, 7, 0, 0, 0, 7, 7, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 12, 13, 14, 15, 16, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, \r
+    17, 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, \r
+    7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 7, 7, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 0, 0, 0, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 31, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 8, 0, \r
+    0, 34, 35, 36, 37, 38, 39, 1, 1, 0, 0, 0, 8, 33, 6, 4, 5, 34, 35, 36, 37, \r
+    38, 39, 1, 1, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, \r
+    7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 41, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 42, 43, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, \r
+    44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 44, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 46, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, \r
+    0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 0, \r
+    0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, 18, 18, 18, 18, 0, 0, 0, 1, 1, 18, \r
+    18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 2, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 49, 49, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 50, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 7, 7, 0, 0, 0, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 0, \r
+    0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 51, \r
+    0, 0, 0, 0, 0, 0, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 7, 0, \r
+    0, 0, 7, 0, 0, 0, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, \r
+    0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 7, 0, 7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, \r
+    7, 7, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, \r
+    7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+};\r
+\r
+static const change_record* get_change_3_2_0(Py_UCS4 n)\r
+{\r
+       int index;\r
+       if (n >= 0x110000) index = 0;\r
+       else {\r
+               index = changes_3_2_0_index[n>>7];\r
+               index = changes_3_2_0_data[(index<<7)+(n & 127)];\r
+       }\r
+       return change_records_3_2_0+index;\r
+}\r
+\r
+static Py_UCS4 normalization_3_2_0(Py_UCS4 n)\r
+{\r
+       switch(n) {\r
+       case 0x2f868: return 0x2136A;\r
+       case 0x2f874: return 0x5F33;\r
+       case 0x2f91f: return 0x43AB;\r
+       case 0x2f95f: return 0x7AAE;\r
+       case 0x2f9bf: return 0x4D57;\r
+       default: return 0;\r
+       }\r
+}\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodename_db.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/unicodename_db.h
new file mode 100644 (file)
index 0000000..5f70051
--- /dev/null
@@ -0,0 +1,17259 @@
+/* this file was generated by Tools/unicode/makeunicodedata.py 2.6 */\r
+\r
+#define NAME_MAXLEN 256\r
+\r
+/* lexicon */\r
+static unsigned char lexicon[] = {\r
+    76, 69, 84, 84, 69, 210, 87, 73, 84, 200, 83, 77, 65, 76, 204, 83, 89, \r
+    76, 76, 65, 66, 76, 197, 83, 73, 71, 206, 67, 65, 80, 73, 84, 65, 204, \r
+    76, 65, 84, 73, 206, 89, 201, 67, 74, 203, 69, 71, 89, 80, 84, 73, 65, \r
+    206, 72, 73, 69, 82, 79, 71, 76, 89, 80, 200, 65, 82, 65, 66, 73, 195, \r
+    67, 79, 77, 80, 65, 84, 73, 66, 73, 76, 73, 84, 217, 77, 65, 84, 72, 69, \r
+    77, 65, 84, 73, 67, 65, 204, 67, 85, 78, 69, 73, 70, 79, 82, 205, 83, 89, \r
+    77, 66, 79, 204, 70, 79, 82, 77, 128, 67, 65, 78, 65, 68, 73, 65, 206, \r
+    83, 89, 76, 76, 65, 66, 73, 67, 211, 68, 73, 71, 73, 212, 66, 79, 76, \r
+    196, 72, 65, 78, 71, 85, 204, 71, 82, 69, 69, 203, 76, 73, 71, 65, 84, \r
+    85, 82, 197, 65, 78, 196, 77, 85, 83, 73, 67, 65, 204, 84, 73, 77, 69, \r
+    211, 69, 84, 72, 73, 79, 80, 73, 195, 86, 79, 87, 69, 204, 73, 84, 65, \r
+    76, 73, 195, 67, 89, 82, 73, 76, 76, 73, 195, 82, 65, 68, 73, 67, 65, \r
+    204, 83, 65, 78, 83, 45, 83, 69, 82, 73, 198, 67, 73, 82, 67, 76, 69, \r
+    196, 70, 79, 210, 67, 79, 77, 66, 73, 78, 73, 78, 199, 84, 65, 201, 86, \r
+    65, 201, 70, 73, 78, 65, 204, 83, 81, 85, 65, 82, 197, 86, 65, 82, 73, \r
+    65, 84, 73, 79, 206, 76, 69, 70, 212, 66, 82, 65, 73, 76, 76, 197, 80, \r
+    65, 84, 84, 69, 82, 206, 82, 73, 71, 72, 212, 66, 89, 90, 65, 78, 84, 73, \r
+    78, 197, 73, 83, 79, 76, 65, 84, 69, 196, 194, 65, 66, 79, 86, 69, 128, \r
+    68, 79, 85, 66, 76, 197, 75, 65, 84, 65, 75, 65, 78, 193, 75, 65, 78, 71, \r
+    88, 201, 78, 85, 77, 66, 69, 210, 83, 73, 71, 78, 128, 66, 69, 76, 79, \r
+    87, 128, 76, 73, 78, 69, 65, 210, 77, 79, 68, 73, 70, 73, 69, 210, 84, \r
+    73, 66, 69, 84, 65, 206, 65, 128, 68, 79, 212, 77, 69, 69, 205, 77, 89, \r
+    65, 78, 77, 65, 210, 67, 65, 82, 82, 73, 69, 210, 65, 82, 82, 79, 87, \r
+    128, 73, 78, 73, 84, 73, 65, 204, 87, 72, 73, 84, 197, 85, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 204, 89, 69, 200, 65, 66, 79, 86, 197, 73, 128, 79, \r
+    128, 67, 79, 80, 84, 73, 195, 65, 82, 82, 79, 215, 77, 79, 78, 71, 79, \r
+    76, 73, 65, 206, 77, 65, 82, 75, 128, 75, 72, 77, 69, 210, 68, 69, 86, \r
+    65, 78, 65, 71, 65, 82, 201, 84, 73, 76, 197, 80, 65, 82, 69, 78, 84, 72, \r
+    69, 83, 73, 90, 69, 196, 84, 72, 65, 205, 66, 76, 65, 67, 203, 74, 79, \r
+    78, 71, 83, 69, 79, 78, 199, 66, 79, 216, 72, 69, 66, 82, 69, 215, 80, \r
+    76, 85, 211, 68, 82, 65, 87, 73, 78, 71, 211, 82, 73, 71, 72, 84, 87, 65, \r
+    82, 68, 211, 67, 72, 79, 83, 69, 79, 78, 199, 83, 84, 82, 79, 75, 69, \r
+    128, 72, 65, 76, 70, 87, 73, 68, 84, 200, 66, 65, 76, 73, 78, 69, 83, \r
+    197, 71, 69, 79, 82, 71, 73, 65, 206, 72, 79, 79, 75, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 205, 73, 68, 69, 79, 71, 82, 65, 80, 72, 73, 195, 65, 76, \r
+    69, 198, 83, 89, 77, 66, 79, 76, 128, 84, 79, 128, 83, 67, 82, 73, 80, \r
+    212, 84, 87, 79, 128, 79, 86, 69, 210, 213, 72, 69, 65, 86, 217, 79, 78, \r
+    69, 128, 85, 208, 76, 79, 215, 70, 85, 76, 76, 87, 73, 68, 84, 200, 72, \r
+    65, 200, 68, 79, 87, 206, 69, 81, 85, 65, 204, 66, 82, 65, 67, 75, 69, \r
+    84, 128, 72, 73, 71, 200, 79, 198, 84, 65, 199, 68, 79, 77, 73, 78, 207, \r
+    78, 85, 77, 69, 82, 73, 195, 70, 82, 65, 75, 84, 85, 210, 74, 85, 78, 71, \r
+    83, 69, 79, 78, 199, 77, 65, 76, 65, 89, 65, 76, 65, 205, 84, 87, 207, \r
+    71, 76, 65, 71, 79, 76, 73, 84, 73, 195, 67, 72, 65, 82, 65, 67, 84, 69, \r
+    210, 76, 69, 70, 84, 87, 65, 82, 68, 211, 77, 69, 68, 73, 65, 204, 84, \r
+    69, 76, 85, 71, 213, 66, 69, 78, 71, 65, 76, 201, 79, 78, 197, 65, 82, \r
+    77, 69, 78, 73, 65, 206, 74, 65, 86, 65, 78, 69, 83, 197, 74, 69, 69, \r
+    205, 66, 65, 82, 128, 72, 73, 82, 65, 71, 65, 78, 193, 87, 69, 83, 84, \r
+    45, 67, 82, 69, 197, 73, 68, 69, 79, 71, 82, 65, 80, 200, 66, 65, 77, 85, \r
+    205, 84, 72, 65, 201, 75, 65, 78, 78, 65, 68, 193, 67, 72, 69, 82, 79, \r
+    75, 69, 197, 72, 65, 76, 198, 84, 79, 78, 197, 78, 69, 215, 79, 82, 73, \r
+    89, 193, 84, 72, 82, 69, 197, 67, 72, 65, 205, 71, 85, 74, 65, 82, 65, \r
+    84, 201, 76, 85, 197, 70, 79, 85, 82, 128, 72, 65, 128, 82, 85, 78, 73, \r
+    195, 83, 65, 85, 82, 65, 83, 72, 84, 82, 193, 84, 69, 84, 82, 65, 71, 82, \r
+    65, 205, 84, 72, 82, 69, 69, 128, 68, 69, 83, 69, 82, 69, 212, 83, 73, \r
+    78, 72, 65, 76, 193, 71, 85, 82, 77, 85, 75, 72, 201, 77, 65, 82, 203, \r
+    78, 79, 84, 65, 84, 73, 79, 206, 83, 89, 82, 73, 65, 195, 86, 79, 67, 65, \r
+    76, 73, 195, 65, 67, 85, 84, 69, 128, 76, 69, 80, 67, 72, 193, 76, 73, \r
+    71, 72, 212, 76, 79, 78, 199, 84, 85, 82, 75, 73, 195, 68, 79, 85, 66, \r
+    76, 69, 45, 83, 84, 82, 85, 67, 203, 70, 73, 86, 69, 128, 75, 65, 128, \r
+    84, 65, 77, 73, 204, 86, 73, 69, 212, 65, 80, 204, 70, 85, 78, 67, 84, \r
+    73, 79, 78, 65, 204, 72, 65, 77, 90, 193, 83, 73, 88, 128, 84, 69, 76, \r
+    69, 71, 82, 65, 80, 200, 89, 65, 128, 69, 73, 71, 72, 84, 128, 72, 79, \r
+    82, 73, 90, 79, 78, 84, 65, 204, 80, 65, 128, 68, 79, 84, 211, 78, 73, \r
+    78, 69, 128, 83, 69, 86, 69, 78, 128, 66, 65, 82, 194, 68, 65, 83, 73, \r
+    193, 75, 65, 73, 84, 72, 201, 76, 73, 77, 66, 213, 77, 65, 128, 77, 65, \r
+    75, 83, 85, 82, 193, 83, 128, 84, 207, 66, 79, 80, 79, 77, 79, 70, 207, \r
+    75, 72, 65, 82, 79, 83, 72, 84, 72, 201, 76, 65, 207, 82, 65, 128, 83, \r
+    81, 85, 65, 82, 69, 196, 72, 69, 88, 65, 71, 82, 65, 205, 75, 193, 78, \r
+    65, 128, 80, 83, 73, 76, 201, 82, 69, 86, 69, 82, 83, 69, 196, 77, 79, \r
+    78, 79, 83, 80, 65, 67, 197, 78, 79, 212, 83, 65, 77, 65, 82, 73, 84, 65, \r
+    206, 83, 84, 82, 79, 75, 197, 84, 85, 82, 78, 69, 196, 86, 128, 90, 90, \r
+    89, 88, 128, 90, 90, 89, 84, 128, 90, 90, 89, 82, 88, 128, 90, 90, 89, \r
+    82, 128, 90, 90, 89, 80, 128, 90, 90, 89, 128, 90, 90, 85, 88, 128, 90, \r
+    90, 85, 82, 88, 128, 90, 90, 85, 82, 128, 90, 90, 85, 80, 128, 90, 90, \r
+    85, 128, 90, 90, 79, 88, 128, 90, 90, 79, 80, 128, 90, 90, 79, 128, 90, \r
+    90, 73, 88, 128, 90, 90, 73, 84, 128, 90, 90, 73, 80, 128, 90, 90, 73, \r
+    69, 88, 128, 90, 90, 73, 69, 84, 128, 90, 90, 73, 69, 80, 128, 90, 90, \r
+    73, 69, 128, 90, 90, 73, 128, 90, 90, 69, 88, 128, 90, 90, 69, 80, 128, \r
+    90, 90, 69, 69, 128, 90, 90, 69, 128, 90, 90, 65, 88, 128, 90, 90, 65, \r
+    84, 128, 90, 90, 65, 80, 128, 90, 90, 65, 65, 128, 90, 90, 65, 128, 90, \r
+    89, 71, 79, 83, 128, 90, 87, 65, 82, 65, 75, 65, 89, 128, 90, 87, 65, \r
+    128, 90, 85, 84, 128, 90, 85, 79, 88, 128, 90, 85, 79, 80, 128, 90, 85, \r
+    79, 128, 90, 85, 77, 128, 90, 85, 66, 85, 82, 128, 90, 85, 53, 128, 90, \r
+    85, 181, 90, 82, 65, 128, 90, 81, 65, 80, 72, 193, 90, 79, 84, 128, 90, \r
+    79, 79, 128, 90, 79, 65, 128, 90, 76, 65, 77, 193, 90, 76, 65, 128, 90, \r
+    76, 193, 90, 74, 69, 128, 90, 73, 90, 50, 128, 90, 73, 81, 65, 65, 128, \r
+    90, 73, 78, 79, 82, 128, 90, 73, 76, 68, 69, 128, 90, 73, 71, 90, 65, \r
+    199, 90, 73, 71, 128, 90, 73, 68, 193, 90, 73, 66, 128, 90, 73, 194, 90, \r
+    73, 51, 128, 90, 201, 90, 72, 89, 88, 128, 90, 72, 89, 84, 128, 90, 72, \r
+    89, 82, 88, 128, 90, 72, 89, 82, 128, 90, 72, 89, 80, 128, 90, 72, 89, \r
+    128, 90, 72, 87, 69, 128, 90, 72, 87, 65, 128, 90, 72, 85, 88, 128, 90, \r
+    72, 85, 84, 128, 90, 72, 85, 82, 88, 128, 90, 72, 85, 82, 128, 90, 72, \r
+    85, 80, 128, 90, 72, 85, 79, 88, 128, 90, 72, 85, 79, 80, 128, 90, 72, \r
+    85, 79, 128, 90, 72, 85, 128, 90, 72, 79, 88, 128, 90, 72, 79, 84, 128, \r
+    90, 72, 79, 80, 128, 90, 72, 79, 79, 128, 90, 72, 79, 128, 90, 72, 73, \r
+    86, 69, 84, 69, 128, 90, 72, 73, 128, 90, 72, 69, 88, 128, 90, 72, 69, \r
+    84, 128, 90, 72, 69, 80, 128, 90, 72, 69, 69, 128, 90, 72, 69, 128, 90, \r
+    72, 197, 90, 72, 65, 88, 128, 90, 72, 65, 84, 128, 90, 72, 65, 82, 128, \r
+    90, 72, 65, 80, 128, 90, 72, 65, 73, 78, 128, 90, 72, 65, 65, 128, 90, \r
+    72, 65, 128, 90, 72, 128, 90, 69, 84, 65, 128, 90, 69, 82, 79, 128, 90, \r
+    69, 82, 207, 90, 69, 78, 128, 90, 69, 77, 76, 89, 65, 128, 90, 69, 77, \r
+    76, 74, 65, 128, 90, 69, 50, 128, 90, 197, 90, 65, 89, 78, 128, 90, 65, \r
+    89, 73, 78, 128, 90, 65, 89, 73, 206, 90, 65, 86, 73, 89, 65, 78, 73, \r
+    128, 90, 65, 84, 65, 128, 90, 65, 82, 81, 65, 128, 90, 65, 81, 69, 198, \r
+    90, 65, 77, 88, 128, 90, 65, 204, 90, 65, 73, 78, 128, 90, 65, 73, 206, \r
+    90, 65, 73, 128, 90, 65, 72, 128, 90, 65, 200, 90, 65, 71, 128, 90, 65, \r
+    69, 70, 128, 90, 48, 49, 54, 72, 128, 90, 48, 49, 54, 71, 128, 90, 48, \r
+    49, 54, 70, 128, 90, 48, 49, 54, 69, 128, 90, 48, 49, 54, 68, 128, 90, \r
+    48, 49, 54, 67, 128, 90, 48, 49, 54, 66, 128, 90, 48, 49, 54, 65, 128, \r
+    90, 48, 49, 54, 128, 90, 48, 49, 53, 73, 128, 90, 48, 49, 53, 72, 128, \r
+    90, 48, 49, 53, 71, 128, 90, 48, 49, 53, 70, 128, 90, 48, 49, 53, 69, \r
+    128, 90, 48, 49, 53, 68, 128, 90, 48, 49, 53, 67, 128, 90, 48, 49, 53, \r
+    66, 128, 90, 48, 49, 53, 65, 128, 90, 48, 49, 53, 128, 90, 48, 49, 52, \r
+    128, 90, 48, 49, 51, 128, 90, 48, 49, 50, 128, 90, 48, 49, 49, 128, 90, \r
+    48, 49, 48, 128, 90, 48, 48, 57, 128, 90, 48, 48, 56, 128, 90, 48, 48, \r
+    55, 128, 90, 48, 48, 54, 128, 90, 48, 48, 53, 65, 128, 90, 48, 48, 53, \r
+    128, 90, 48, 48, 52, 65, 128, 90, 48, 48, 52, 128, 90, 48, 48, 51, 66, \r
+    128, 90, 48, 48, 51, 65, 128, 90, 48, 48, 51, 128, 90, 48, 48, 50, 68, \r
+    128, 90, 48, 48, 50, 67, 128, 90, 48, 48, 50, 66, 128, 90, 48, 48, 50, \r
+    65, 128, 90, 48, 48, 50, 128, 90, 48, 48, 49, 128, 90, 128, 218, 89, 89, \r
+    88, 128, 89, 89, 84, 128, 89, 89, 82, 88, 128, 89, 89, 82, 128, 89, 89, \r
+    80, 128, 89, 89, 69, 128, 89, 89, 65, 128, 89, 89, 128, 89, 87, 79, 79, \r
+    128, 89, 87, 79, 128, 89, 87, 73, 73, 128, 89, 87, 73, 128, 89, 87, 69, \r
+    128, 89, 87, 65, 65, 128, 89, 87, 65, 128, 89, 86, 128, 89, 85, 88, 128, \r
+    89, 85, 85, 75, 65, 76, 69, 65, 80, 73, 78, 84, 85, 128, 89, 85, 84, 128, \r
+    89, 85, 83, 128, 89, 85, 211, 89, 85, 82, 88, 128, 89, 85, 82, 128, 89, \r
+    85, 81, 128, 89, 85, 80, 128, 89, 85, 79, 88, 128, 89, 85, 79, 84, 128, \r
+    89, 85, 79, 80, 128, 89, 85, 79, 128, 89, 85, 68, 72, 128, 89, 85, 68, \r
+    200, 89, 85, 65, 78, 128, 89, 85, 45, 89, 69, 79, 128, 89, 85, 45, 89, \r
+    69, 128, 89, 85, 45, 85, 128, 89, 85, 45, 79, 128, 89, 85, 45, 73, 128, \r
+    89, 85, 45, 69, 79, 128, 89, 85, 45, 69, 128, 89, 85, 45, 65, 69, 128, \r
+    89, 85, 45, 65, 128, 89, 85, 128, 89, 213, 89, 80, 83, 73, 76, 73, 128, \r
+    89, 80, 79, 82, 82, 79, 73, 128, 89, 80, 79, 75, 82, 73, 83, 73, 83, 128, \r
+    89, 80, 79, 75, 82, 73, 83, 73, 211, 89, 80, 79, 71, 69, 71, 82, 65, 77, \r
+    77, 69, 78, 73, 128, 89, 79, 89, 128, 89, 79, 88, 128, 89, 79, 85, 84, \r
+    72, 70, 85, 76, 78, 69, 83, 83, 128, 89, 79, 85, 84, 72, 70, 85, 204, 89, \r
+    79, 84, 128, 89, 79, 82, 73, 128, 89, 79, 81, 128, 89, 79, 80, 128, 89, \r
+    79, 79, 128, 89, 79, 77, 79, 128, 89, 79, 71, 72, 128, 89, 79, 68, 72, \r
+    128, 89, 79, 68, 128, 89, 79, 196, 89, 79, 65, 128, 89, 79, 45, 89, 69, \r
+    79, 128, 89, 79, 45, 89, 65, 69, 128, 89, 79, 45, 89, 65, 128, 89, 79, \r
+    45, 79, 128, 89, 79, 45, 73, 128, 89, 79, 45, 69, 79, 128, 89, 79, 45, \r
+    65, 69, 128, 89, 79, 45, 65, 128, 89, 79, 128, 89, 207, 89, 73, 90, 69, \r
+    84, 128, 89, 73, 88, 128, 89, 73, 87, 78, 128, 89, 73, 84, 128, 89, 73, \r
+    80, 128, 89, 73, 78, 71, 128, 89, 73, 73, 128, 89, 73, 199, 89, 73, 69, \r
+    88, 128, 89, 73, 69, 84, 128, 89, 73, 69, 80, 128, 89, 73, 69, 128, 89, \r
+    73, 68, 68, 73, 83, 200, 89, 73, 45, 85, 128, 89, 73, 128, 89, 70, 69, \r
+    83, 73, 83, 128, 89, 70, 69, 83, 73, 211, 89, 70, 69, 206, 89, 69, 89, \r
+    128, 89, 69, 87, 128, 89, 69, 84, 73, 86, 128, 89, 69, 83, 84, 85, 128, \r
+    89, 69, 83, 73, 69, 85, 78, 71, 45, 83, 73, 79, 83, 128, 89, 69, 83, 73, \r
+    69, 85, 78, 71, 45, 80, 65, 78, 83, 73, 79, 83, 128, 89, 69, 83, 73, 69, \r
+    85, 78, 71, 45, 77, 73, 69, 85, 77, 128, 89, 69, 83, 73, 69, 85, 78, 71, \r
+    45, 72, 73, 69, 85, 72, 128, 89, 69, 83, 73, 69, 85, 78, 71, 128, 89, 69, \r
+    82, 85, 128, 89, 69, 82, 213, 89, 69, 82, 73, 128, 89, 69, 82, 65, 200, \r
+    89, 69, 82, 128, 89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 89, 69, \r
+    79, 45, 89, 65, 128, 89, 69, 79, 45, 85, 128, 89, 69, 79, 45, 79, 128, \r
+    89, 69, 78, 73, 83, 69, 201, 89, 69, 78, 65, 80, 128, 89, 69, 206, 89, \r
+    69, 76, 76, 79, 87, 128, 89, 69, 72, 128, 89, 69, 69, 128, 89, 69, 65, \r
+    210, 89, 69, 65, 128, 89, 65, 90, 90, 128, 89, 65, 90, 72, 128, 89, 65, \r
+    90, 128, 89, 65, 89, 65, 78, 78, 65, 128, 89, 65, 89, 128, 89, 65, 87, \r
+    128, 89, 65, 86, 128, 89, 65, 84, 84, 128, 89, 65, 84, 73, 128, 89, 65, \r
+    84, 72, 128, 89, 65, 84, 128, 89, 65, 83, 83, 128, 89, 65, 83, 72, 128, \r
+    89, 65, 83, 128, 89, 65, 82, 82, 128, 89, 65, 82, 128, 89, 65, 210, 89, \r
+    65, 81, 128, 89, 65, 80, 128, 89, 65, 78, 71, 128, 89, 65, 78, 199, 89, \r
+    65, 78, 128, 89, 65, 77, 79, 75, 128, 89, 65, 77, 65, 75, 75, 65, 78, \r
+    128, 89, 65, 77, 128, 89, 65, 76, 128, 89, 65, 75, 72, 72, 128, 89, 65, \r
+    75, 72, 128, 89, 65, 75, 65, 83, 72, 128, 89, 65, 75, 128, 89, 65, 74, \r
+    85, 82, 86, 69, 68, 73, 195, 89, 65, 74, 128, 89, 65, 72, 72, 128, 89, \r
+    65, 72, 128, 89, 65, 71, 78, 128, 89, 65, 71, 72, 72, 128, 89, 65, 71, \r
+    72, 128, 89, 65, 71, 128, 89, 65, 70, 128, 89, 65, 68, 72, 128, 89, 65, \r
+    68, 68, 72, 128, 89, 65, 68, 68, 128, 89, 65, 68, 128, 89, 65, 67, 72, \r
+    128, 89, 65, 66, 72, 128, 89, 65, 66, 128, 89, 65, 65, 82, 85, 128, 89, \r
+    65, 65, 73, 128, 89, 65, 65, 68, 79, 128, 89, 65, 65, 128, 89, 65, 45, \r
+    89, 79, 128, 89, 65, 45, 85, 128, 89, 65, 45, 79, 128, 89, 48, 48, 56, \r
+    128, 89, 48, 48, 55, 128, 89, 48, 48, 54, 128, 89, 48, 48, 53, 128, 89, \r
+    48, 48, 52, 128, 89, 48, 48, 51, 128, 89, 48, 48, 50, 128, 89, 48, 48, \r
+    49, 65, 128, 89, 48, 48, 49, 128, 89, 45, 67, 82, 69, 197, 88, 89, 88, \r
+    128, 88, 89, 85, 128, 88, 89, 84, 128, 88, 89, 82, 88, 128, 88, 89, 82, \r
+    128, 88, 89, 80, 128, 88, 89, 79, 128, 88, 89, 73, 128, 88, 89, 69, 69, \r
+    128, 88, 89, 69, 128, 88, 89, 65, 65, 128, 88, 89, 65, 128, 88, 89, 128, \r
+    88, 87, 73, 128, 88, 87, 69, 69, 128, 88, 87, 69, 128, 88, 87, 65, 65, \r
+    128, 88, 87, 65, 128, 88, 86, 69, 128, 88, 86, 65, 128, 88, 85, 79, 88, \r
+    128, 88, 85, 79, 128, 88, 85, 128, 88, 83, 72, 65, 65, 89, 65, 84, 72, \r
+    73, 89, 65, 128, 88, 79, 88, 128, 88, 79, 84, 128, 88, 79, 82, 128, 88, \r
+    79, 80, 128, 88, 79, 65, 128, 88, 79, 128, 88, 73, 88, 128, 88, 73, 84, \r
+    128, 88, 73, 82, 79, 206, 88, 73, 80, 128, 88, 73, 69, 88, 128, 88, 73, \r
+    69, 84, 128, 88, 73, 69, 80, 128, 88, 73, 69, 128, 88, 73, 128, 88, 71, \r
+    128, 88, 69, 83, 84, 69, 211, 88, 69, 72, 128, 88, 69, 69, 128, 88, 69, \r
+    128, 88, 65, 78, 128, 88, 65, 65, 128, 88, 65, 128, 88, 48, 48, 56, 65, \r
+    128, 88, 48, 48, 56, 128, 88, 48, 48, 55, 128, 88, 48, 48, 54, 65, 128, \r
+    88, 48, 48, 54, 128, 88, 48, 48, 53, 128, 88, 48, 48, 52, 66, 128, 88, \r
+    48, 48, 52, 65, 128, 88, 48, 48, 52, 128, 88, 48, 48, 51, 128, 88, 48, \r
+    48, 50, 128, 88, 48, 48, 49, 128, 87, 90, 128, 87, 89, 78, 78, 128, 87, \r
+    89, 78, 206, 87, 86, 128, 87, 85, 79, 88, 128, 87, 85, 79, 80, 128, 87, \r
+    85, 79, 128, 87, 85, 78, 74, 207, 87, 85, 78, 128, 87, 85, 76, 85, 128, \r
+    87, 85, 76, 213, 87, 85, 69, 128, 87, 85, 128, 87, 82, 79, 78, 71, 128, \r
+    87, 82, 73, 84, 73, 78, 199, 87, 82, 69, 65, 84, 200, 87, 82, 65, 80, \r
+    128, 87, 79, 88, 128, 87, 79, 82, 75, 128, 87, 79, 82, 203, 87, 79, 82, \r
+    68, 83, 80, 65, 67, 69, 128, 87, 79, 82, 196, 87, 79, 80, 128, 87, 79, \r
+    79, 78, 128, 87, 79, 79, 76, 128, 87, 79, 79, 68, 83, 45, 67, 82, 69, \r
+    197, 87, 79, 79, 68, 128, 87, 79, 78, 128, 87, 79, 206, 87, 79, 77, 65, \r
+    78, 128, 87, 79, 76, 79, 83, 79, 128, 87, 79, 69, 128, 87, 79, 65, 128, \r
+    87, 73, 84, 72, 79, 85, 212, 87, 73, 78, 84, 69, 82, 128, 87, 73, 78, 74, \r
+    65, 128, 87, 73, 78, 69, 128, 87, 73, 78, 68, 85, 128, 87, 73, 78, 68, \r
+    128, 87, 73, 78, 128, 87, 73, 71, 78, 89, 65, 78, 128, 87, 73, 71, 71, \r
+    76, 217, 87, 73, 68, 69, 45, 72, 69, 65, 68, 69, 196, 87, 73, 68, 197, \r
+    87, 73, 65, 78, 71, 87, 65, 65, 75, 128, 87, 73, 65, 78, 71, 128, 87, 72, \r
+    79, 76, 197, 87, 72, 73, 84, 69, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, \r
+    87, 72, 73, 84, 69, 128, 87, 72, 69, 69, 76, 69, 196, 87, 72, 69, 69, 76, \r
+    67, 72, 65, 73, 210, 87, 72, 69, 69, 76, 128, 87, 72, 69, 69, 204, 87, \r
+    72, 69, 65, 84, 128, 87, 71, 128, 87, 69, 88, 128, 87, 69, 83, 84, 69, \r
+    82, 206, 87, 69, 83, 84, 128, 87, 69, 83, 212, 87, 69, 80, 128, 87, 69, \r
+    79, 128, 87, 69, 78, 128, 87, 69, 76, 76, 128, 87, 69, 73, 71, 72, 212, \r
+    87, 69, 69, 78, 128, 87, 69, 68, 71, 69, 45, 84, 65, 73, 76, 69, 196, 87, \r
+    69, 65, 80, 79, 78, 128, 87, 66, 128, 87, 65, 89, 128, 87, 65, 217, 87, \r
+    65, 88, 128, 87, 65, 87, 45, 65, 89, 73, 78, 45, 82, 69, 83, 72, 128, 87, \r
+    65, 87, 128, 87, 65, 215, 87, 65, 86, 217, 87, 65, 86, 69, 128, 87, 65, \r
+    86, 197, 87, 65, 85, 128, 87, 65, 84, 84, 79, 128, 87, 65, 84, 69, 82, \r
+    128, 87, 65, 84, 69, 210, 87, 65, 84, 67, 72, 128, 87, 65, 84, 128, 87, \r
+    65, 83, 84, 73, 78, 71, 128, 87, 65, 83, 83, 65, 76, 76, 65, 77, 128, 87, \r
+    65, 83, 76, 65, 128, 87, 65, 83, 76, 193, 87, 65, 83, 65, 76, 76, 65, 77, \r
+    128, 87, 65, 83, 65, 76, 76, 65, 205, 87, 65, 82, 78, 73, 78, 199, 87, \r
+    65, 80, 128, 87, 65, 78, 68, 69, 82, 69, 82, 128, 87, 65, 78, 128, 87, \r
+    65, 76, 76, 128, 87, 65, 76, 75, 128, 87, 65, 76, 203, 87, 65, 73, 84, \r
+    73, 78, 71, 128, 87, 65, 73, 128, 87, 65, 69, 78, 128, 87, 65, 69, 128, \r
+    87, 65, 65, 86, 85, 128, 87, 48, 50, 53, 128, 87, 48, 50, 52, 65, 128, \r
+    87, 48, 50, 52, 128, 87, 48, 50, 51, 128, 87, 48, 50, 50, 128, 87, 48, \r
+    50, 49, 128, 87, 48, 50, 48, 128, 87, 48, 49, 57, 128, 87, 48, 49, 56, \r
+    65, 128, 87, 48, 49, 56, 128, 87, 48, 49, 55, 65, 128, 87, 48, 49, 55, \r
+    128, 87, 48, 49, 54, 128, 87, 48, 49, 53, 128, 87, 48, 49, 52, 65, 128, \r
+    87, 48, 49, 52, 128, 87, 48, 49, 51, 128, 87, 48, 49, 50, 128, 87, 48, \r
+    49, 49, 128, 87, 48, 49, 48, 65, 128, 87, 48, 49, 48, 128, 87, 48, 48, \r
+    57, 65, 128, 87, 48, 48, 57, 128, 87, 48, 48, 56, 128, 87, 48, 48, 55, \r
+    128, 87, 48, 48, 54, 128, 87, 48, 48, 53, 128, 87, 48, 48, 52, 128, 87, \r
+    48, 48, 51, 65, 128, 87, 48, 48, 51, 128, 87, 48, 48, 50, 128, 87, 48, \r
+    48, 49, 128, 86, 90, 77, 69, 84, 128, 86, 89, 88, 128, 86, 89, 84, 128, \r
+    86, 89, 82, 88, 128, 86, 89, 82, 128, 86, 89, 80, 128, 86, 89, 128, 86, \r
+    87, 65, 128, 86, 85, 88, 128, 86, 85, 84, 128, 86, 85, 82, 88, 128, 86, \r
+    85, 82, 128, 86, 85, 80, 128, 86, 85, 76, 71, 65, 210, 86, 82, 65, 67, \r
+    72, 89, 128, 86, 79, 88, 128, 86, 79, 87, 69, 76, 45, 67, 65, 82, 82, 73, \r
+    69, 210, 86, 79, 87, 128, 86, 79, 85, 128, 86, 79, 84, 128, 86, 79, 80, \r
+    128, 86, 79, 79, 128, 86, 79, 76, 85, 77, 197, 86, 79, 76, 84, 65, 71, \r
+    197, 86, 79, 73, 196, 86, 79, 73, 67, 73, 78, 71, 128, 86, 79, 73, 67, \r
+    69, 76, 69, 83, 211, 86, 79, 73, 67, 69, 196, 86, 79, 67, 65, 204, 86, \r
+    79, 128, 86, 73, 88, 128, 86, 73, 84, 128, 86, 73, 83, 73, 71, 79, 84, \r
+    72, 73, 195, 86, 73, 83, 65, 82, 71, 65, 89, 65, 128, 86, 73, 83, 65, 82, \r
+    71, 65, 128, 86, 73, 83, 65, 82, 71, 193, 86, 73, 82, 73, 65, 77, 128, \r
+    86, 73, 82, 71, 79, 128, 86, 73, 82, 71, 65, 128, 86, 73, 82, 65, 77, 65, \r
+    128, 86, 73, 80, 128, 86, 73, 78, 69, 128, 86, 73, 78, 128, 86, 73, 76, \r
+    76, 65, 71, 69, 128, 86, 73, 69, 88, 128, 86, 73, 69, 87, 68, 65, 84, \r
+    193, 86, 73, 69, 84, 128, 86, 73, 69, 80, 128, 86, 73, 69, 128, 86, 73, \r
+    68, 65, 128, 86, 73, 67, 84, 79, 82, 217, 86, 73, 128, 86, 69, 88, 128, \r
+    86, 69, 87, 128, 86, 69, 215, 86, 69, 83, 84, 65, 128, 86, 69, 83, 83, \r
+    69, 204, 86, 69, 82, 217, 86, 69, 82, 84, 73, 67, 65, 76, 76, 89, 128, \r
+    86, 69, 82, 84, 73, 67, 65, 76, 76, 217, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 54, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, \r
+    45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 52, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 51, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 54, 45, 48, 50, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 54, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 54, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, \r
+    45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 53, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 52, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 53, 45, 48, 51, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 53, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 53, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 53, \r
+    45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 54, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 53, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 52, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 52, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 52, 45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, \r
+    45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 52, 45, 48, 48, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 54, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 53, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 51, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 51, 45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, \r
+    45, 48, 50, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 49, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 51, 45, 48, 48, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 54, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 50, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 50, 45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, \r
+    45, 48, 51, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 50, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 49, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 50, 45, 48, 48, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 49, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 49, 45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, \r
+    45, 48, 52, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 51, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 50, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 49, 45, 48, 49, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 49, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 48, 45, 48, 54, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, \r
+    45, 48, 53, 128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 52, \r
+    128, 86, 69, 82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 51, 128, 86, 69, \r
+    82, 84, 73, 67, 65, 76, 45, 48, 48, 45, 48, 50, 128, 86, 69, 82, 84, 73, \r
+    67, 65, 76, 45, 48, 48, 45, 48, 49, 128, 86, 69, 82, 84, 73, 67, 65, 76, \r
+    45, 48, 48, 45, 48, 48, 128, 86, 69, 82, 84, 73, 67, 65, 76, 128, 86, 69, \r
+    82, 83, 73, 67, 76, 69, 128, 86, 69, 82, 83, 197, 86, 69, 82, 71, 69, \r
+    128, 86, 69, 80, 128, 86, 69, 78, 68, 128, 86, 69, 72, 128, 86, 69, 200, \r
+    86, 69, 69, 128, 86, 69, 197, 86, 69, 68, 69, 128, 86, 69, 67, 84, 79, \r
+    210, 86, 65, 89, 65, 78, 78, 65, 128, 86, 65, 88, 128, 86, 65, 86, 128, \r
+    86, 65, 214, 86, 65, 84, 72, 89, 128, 86, 65, 84, 128, 86, 65, 83, 84, \r
+    78, 69, 83, 211, 86, 65, 83, 73, 83, 128, 86, 65, 82, 89, 211, 86, 65, \r
+    82, 73, 75, 65, 128, 86, 65, 82, 73, 65, 78, 212, 86, 65, 82, 73, 65, \r
+    128, 86, 65, 82, 73, 193, 86, 65, 82, 69, 73, 65, 201, 86, 65, 82, 69, \r
+    73, 193, 86, 65, 80, 128, 86, 65, 78, 69, 128, 86, 65, 77, 65, 71, 79, \r
+    77, 85, 75, 72, 65, 128, 86, 65, 77, 65, 71, 79, 77, 85, 75, 72, 193, 86, \r
+    65, 76, 76, 69, 89, 128, 86, 65, 65, 86, 85, 128, 86, 65, 65, 128, 86, \r
+    48, 52, 48, 65, 128, 86, 48, 52, 48, 128, 86, 48, 51, 57, 128, 86, 48, \r
+    51, 56, 128, 86, 48, 51, 55, 65, 128, 86, 48, 51, 55, 128, 86, 48, 51, \r
+    54, 128, 86, 48, 51, 53, 128, 86, 48, 51, 52, 128, 86, 48, 51, 51, 65, \r
+    128, 86, 48, 51, 51, 128, 86, 48, 51, 50, 128, 86, 48, 51, 49, 65, 128, \r
+    86, 48, 51, 49, 128, 86, 48, 51, 48, 65, 128, 86, 48, 51, 48, 128, 86, \r
+    48, 50, 57, 65, 128, 86, 48, 50, 57, 128, 86, 48, 50, 56, 65, 128, 86, \r
+    48, 50, 56, 128, 86, 48, 50, 55, 128, 86, 48, 50, 54, 128, 86, 48, 50, \r
+    53, 128, 86, 48, 50, 52, 128, 86, 48, 50, 51, 65, 128, 86, 48, 50, 51, \r
+    128, 86, 48, 50, 50, 128, 86, 48, 50, 49, 128, 86, 48, 50, 48, 76, 128, \r
+    86, 48, 50, 48, 75, 128, 86, 48, 50, 48, 74, 128, 86, 48, 50, 48, 73, \r
+    128, 86, 48, 50, 48, 72, 128, 86, 48, 50, 48, 71, 128, 86, 48, 50, 48, \r
+    70, 128, 86, 48, 50, 48, 69, 128, 86, 48, 50, 48, 68, 128, 86, 48, 50, \r
+    48, 67, 128, 86, 48, 50, 48, 66, 128, 86, 48, 50, 48, 65, 128, 86, 48, \r
+    50, 48, 128, 86, 48, 49, 57, 128, 86, 48, 49, 56, 128, 86, 48, 49, 55, \r
+    128, 86, 48, 49, 54, 128, 86, 48, 49, 53, 128, 86, 48, 49, 52, 128, 86, \r
+    48, 49, 51, 128, 86, 48, 49, 50, 66, 128, 86, 48, 49, 50, 65, 128, 86, \r
+    48, 49, 50, 128, 86, 48, 49, 49, 67, 128, 86, 48, 49, 49, 66, 128, 86, \r
+    48, 49, 49, 65, 128, 86, 48, 49, 49, 128, 86, 48, 49, 48, 128, 86, 48, \r
+    48, 57, 128, 86, 48, 48, 56, 128, 86, 48, 48, 55, 66, 128, 86, 48, 48, \r
+    55, 65, 128, 86, 48, 48, 55, 128, 86, 48, 48, 54, 128, 86, 48, 48, 53, \r
+    128, 86, 48, 48, 52, 128, 86, 48, 48, 51, 128, 86, 48, 48, 50, 65, 128, \r
+    86, 48, 48, 50, 128, 86, 48, 48, 49, 73, 128, 86, 48, 48, 49, 72, 128, \r
+    86, 48, 48, 49, 71, 128, 86, 48, 48, 49, 70, 128, 86, 48, 48, 49, 69, \r
+    128, 86, 48, 48, 49, 68, 128, 86, 48, 48, 49, 67, 128, 86, 48, 48, 49, \r
+    66, 128, 86, 48, 48, 49, 65, 128, 86, 48, 48, 49, 128, 85, 90, 85, 128, \r
+    85, 90, 51, 128, 85, 90, 179, 85, 89, 65, 78, 78, 65, 128, 85, 89, 128, \r
+    85, 85, 89, 65, 78, 78, 65, 128, 85, 85, 85, 85, 128, 85, 85, 85, 51, \r
+    128, 85, 85, 85, 50, 128, 85, 85, 69, 128, 85, 84, 85, 75, 73, 128, 85, \r
+    83, 83, 85, 51, 128, 85, 83, 83, 85, 128, 85, 83, 72, 88, 128, 85, 83, \r
+    72, 85, 77, 88, 128, 85, 83, 72, 50, 128, 85, 83, 72, 128, 85, 83, 200, \r
+    85, 83, 69, 196, 85, 83, 69, 128, 85, 82, 85, 218, 85, 82, 85, 83, 128, \r
+    85, 82, 85, 68, 65, 128, 85, 82, 85, 68, 193, 85, 82, 85, 128, 85, 82, \r
+    213, 85, 82, 78, 128, 85, 82, 73, 51, 128, 85, 82, 73, 128, 85, 82, 65, \r
+    78, 85, 83, 128, 85, 82, 65, 128, 85, 82, 52, 128, 85, 82, 50, 128, 85, \r
+    82, 178, 85, 80, 87, 65, 82, 68, 83, 128, 85, 80, 87, 65, 82, 68, 211, \r
+    85, 80, 87, 65, 82, 68, 128, 85, 80, 87, 65, 82, 196, 85, 80, 84, 85, 82, \r
+    78, 128, 85, 80, 83, 73, 76, 79, 78, 128, 85, 80, 83, 73, 76, 79, 206, \r
+    85, 80, 82, 73, 71, 72, 212, 85, 80, 80, 69, 210, 85, 80, 65, 68, 72, 77, \r
+    65, 78, 73, 89, 65, 128, 85, 80, 45, 80, 79, 73, 78, 84, 73, 78, 199, 85, \r
+    79, 78, 128, 85, 78, 78, 128, 85, 78, 77, 65, 82, 82, 73, 69, 196, 85, \r
+    78, 73, 86, 69, 82, 83, 65, 204, 85, 78, 73, 84, 89, 128, 85, 78, 73, 84, \r
+    128, 85, 78, 73, 212, 85, 78, 73, 79, 78, 128, 85, 78, 73, 79, 206, 85, \r
+    78, 73, 70, 73, 69, 196, 85, 78, 68, 207, 85, 78, 68, 69, 82, 84, 73, 69, \r
+    128, 85, 78, 68, 69, 82, 76, 73, 78, 197, 85, 78, 68, 69, 82, 68, 79, 84, \r
+    128, 85, 78, 68, 69, 82, 66, 65, 82, 128, 85, 78, 68, 69, 210, 85, 78, \r
+    67, 73, 193, 85, 78, 65, 83, 80, 73, 82, 65, 84, 69, 68, 128, 85, 78, 65, \r
+    80, 128, 85, 78, 65, 128, 85, 206, 85, 77, 85, 77, 128, 85, 77, 85, 205, \r
+    85, 77, 66, 82, 69, 76, 76, 65, 128, 85, 77, 66, 82, 69, 76, 76, 193, 85, \r
+    77, 66, 73, 78, 128, 85, 75, 85, 128, 85, 75, 82, 65, 73, 78, 73, 65, \r
+    206, 85, 75, 65, 82, 65, 128, 85, 75, 65, 82, 193, 85, 75, 128, 85, 73, \r
+    76, 76, 69, 65, 78, 78, 128, 85, 73, 71, 72, 85, 210, 85, 71, 65, 82, 73, \r
+    84, 73, 195, 85, 69, 89, 128, 85, 69, 69, 128, 85, 69, 65, 128, 85, 68, \r
+    85, 71, 128, 85, 68, 65, 84, 84, 65, 128, 85, 68, 65, 84, 84, 193, 85, \r
+    68, 65, 65, 84, 128, 85, 68, 128, 85, 196, 85, 67, 128, 85, 66, 85, 70, \r
+    73, 76, 73, 128, 85, 66, 72, 65, 89, 65, 84, 207, 85, 66, 65, 68, 65, 77, \r
+    65, 128, 85, 66, 128, 85, 65, 84, 72, 128, 85, 65, 128, 85, 178, 85, 48, \r
+    52, 50, 128, 85, 48, 52, 49, 128, 85, 48, 52, 48, 128, 85, 48, 51, 57, \r
+    128, 85, 48, 51, 56, 128, 85, 48, 51, 55, 128, 85, 48, 51, 54, 128, 85, \r
+    48, 51, 53, 128, 85, 48, 51, 52, 128, 85, 48, 51, 51, 128, 85, 48, 51, \r
+    50, 65, 128, 85, 48, 51, 50, 128, 85, 48, 51, 49, 128, 85, 48, 51, 48, \r
+    128, 85, 48, 50, 57, 65, 128, 85, 48, 50, 57, 128, 85, 48, 50, 56, 128, \r
+    85, 48, 50, 55, 128, 85, 48, 50, 54, 128, 85, 48, 50, 53, 128, 85, 48, \r
+    50, 52, 128, 85, 48, 50, 51, 65, 128, 85, 48, 50, 51, 128, 85, 48, 50, \r
+    50, 128, 85, 48, 50, 49, 128, 85, 48, 50, 48, 128, 85, 48, 49, 57, 128, \r
+    85, 48, 49, 56, 128, 85, 48, 49, 55, 128, 85, 48, 49, 54, 128, 85, 48, \r
+    49, 53, 128, 85, 48, 49, 52, 128, 85, 48, 49, 51, 128, 85, 48, 49, 50, \r
+    128, 85, 48, 49, 49, 128, 85, 48, 49, 48, 128, 85, 48, 48, 57, 128, 85, \r
+    48, 48, 56, 128, 85, 48, 48, 55, 128, 85, 48, 48, 54, 66, 128, 85, 48, \r
+    48, 54, 65, 128, 85, 48, 48, 54, 128, 85, 48, 48, 53, 128, 85, 48, 48, \r
+    52, 128, 85, 48, 48, 51, 128, 85, 48, 48, 50, 128, 85, 48, 48, 49, 128, \r
+    85, 45, 73, 45, 73, 128, 85, 45, 69, 79, 45, 69, 85, 128, 84, 90, 85, \r
+    128, 84, 90, 79, 65, 128, 84, 90, 79, 128, 84, 90, 73, 210, 84, 90, 73, \r
+    128, 84, 90, 69, 69, 128, 84, 90, 69, 128, 84, 90, 65, 65, 128, 84, 90, \r
+    65, 128, 84, 90, 128, 84, 89, 210, 84, 89, 80, 69, 45, 183, 84, 89, 80, \r
+    69, 45, 182, 84, 89, 80, 69, 45, 181, 84, 89, 80, 69, 45, 180, 84, 89, \r
+    80, 69, 45, 179, 84, 89, 80, 69, 45, 178, 84, 89, 80, 69, 45, 177, 84, \r
+    89, 80, 197, 84, 89, 79, 128, 84, 89, 73, 128, 84, 89, 69, 128, 84, 89, \r
+    65, 128, 84, 87, 79, 79, 128, 84, 87, 79, 45, 87, 65, 217, 84, 87, 79, \r
+    45, 76, 73, 78, 197, 84, 87, 79, 45, 72, 69, 65, 68, 69, 196, 84, 87, 73, \r
+    73, 128, 84, 87, 73, 128, 84, 87, 69, 78, 84, 89, 45, 84, 87, 79, 128, \r
+    84, 87, 69, 78, 84, 89, 45, 84, 72, 82, 69, 69, 128, 84, 87, 69, 78, 84, \r
+    89, 45, 83, 73, 88, 128, 84, 87, 69, 78, 84, 89, 45, 83, 69, 86, 69, 78, \r
+    128, 84, 87, 69, 78, 84, 89, 45, 79, 78, 69, 128, 84, 87, 69, 78, 84, 89, \r
+    45, 78, 73, 78, 69, 128, 84, 87, 69, 78, 84, 89, 45, 70, 79, 85, 82, 128, \r
+    84, 87, 69, 78, 84, 89, 45, 70, 73, 86, 69, 128, 84, 87, 69, 78, 84, 89, \r
+    45, 69, 73, 71, 72, 84, 200, 84, 87, 69, 78, 84, 89, 45, 69, 73, 71, 72, \r
+    84, 128, 84, 87, 69, 78, 84, 89, 128, 84, 87, 69, 78, 84, 217, 84, 87, \r
+    69, 76, 86, 69, 128, 84, 87, 69, 76, 86, 197, 84, 87, 69, 128, 84, 87, \r
+    65, 65, 128, 84, 87, 65, 128, 84, 86, 82, 73, 68, 79, 128, 84, 86, 73, \r
+    77, 65, 68, 85, 210, 84, 85, 88, 128, 84, 85, 85, 77, 85, 128, 84, 85, \r
+    84, 69, 89, 65, 83, 65, 84, 128, 84, 85, 84, 128, 84, 85, 82, 88, 128, \r
+    84, 85, 82, 85, 128, 84, 85, 82, 84, 76, 69, 128, 84, 85, 82, 79, 50, \r
+    128, 84, 85, 82, 78, 83, 84, 73, 76, 69, 128, 84, 85, 82, 206, 84, 85, \r
+    82, 66, 65, 78, 128, 84, 85, 82, 128, 84, 85, 80, 128, 84, 85, 79, 88, \r
+    128, 84, 85, 79, 84, 128, 84, 85, 79, 80, 128, 84, 85, 79, 128, 84, 85, \r
+    78, 78, 89, 128, 84, 85, 77, 69, 84, 69, 83, 128, 84, 85, 77, 128, 84, \r
+    85, 75, 87, 69, 78, 84, 73, 83, 128, 84, 85, 75, 128, 84, 85, 71, 82, 73, \r
+    203, 84, 85, 71, 50, 128, 84, 85, 71, 178, 84, 85, 65, 82, 69, 199, 84, \r
+    84, 85, 68, 68, 65, 71, 128, 84, 84, 85, 68, 68, 65, 65, 71, 128, 84, 84, \r
+    85, 128, 84, 84, 84, 72, 65, 128, 84, 84, 83, 85, 128, 84, 84, 83, 79, \r
+    128, 84, 84, 83, 73, 128, 84, 84, 83, 69, 69, 128, 84, 84, 83, 69, 128, \r
+    84, 84, 83, 65, 128, 84, 84, 73, 128, 84, 84, 72, 87, 69, 128, 84, 84, \r
+    72, 79, 79, 128, 84, 84, 72, 79, 128, 84, 84, 72, 73, 128, 84, 84, 72, \r
+    69, 128, 84, 84, 72, 65, 65, 128, 84, 84, 72, 128, 84, 84, 69, 72, 69, \r
+    72, 128, 84, 84, 69, 72, 69, 200, 84, 84, 69, 72, 128, 84, 84, 69, 200, \r
+    84, 84, 69, 69, 128, 84, 84, 69, 128, 84, 84, 65, 89, 65, 78, 78, 65, \r
+    128, 84, 84, 65, 65, 128, 84, 84, 50, 128, 84, 83, 87, 69, 128, 84, 83, \r
+    87, 65, 128, 84, 83, 86, 128, 84, 83, 83, 69, 128, 84, 83, 72, 85, 71, \r
+    83, 128, 84, 83, 72, 79, 79, 75, 128, 84, 83, 72, 79, 79, 203, 84, 83, \r
+    72, 69, 83, 128, 84, 83, 72, 69, 71, 128, 84, 83, 72, 69, 199, 84, 83, \r
+    72, 69, 128, 84, 83, 72, 65, 128, 84, 83, 69, 82, 69, 128, 84, 83, 65, \r
+    68, 73, 128, 84, 83, 65, 68, 201, 84, 83, 65, 65, 68, 73, 89, 128, 84, \r
+    83, 65, 65, 128, 84, 83, 193, 84, 82, 89, 66, 76, 73, 79, 206, 84, 82, \r
+    85, 84, 72, 128, 84, 82, 85, 78, 75, 128, 84, 82, 85, 78, 67, 65, 84, 69, \r
+    196, 84, 82, 85, 69, 128, 84, 82, 85, 67, 75, 128, 84, 82, 79, 77, 73, \r
+    75, 79, 83, 89, 78, 65, 71, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 80, \r
+    83, 73, 70, 73, 83, 84, 79, 78, 128, 84, 82, 79, 77, 73, 75, 79, 80, 65, \r
+    82, 65, 75, 65, 76, 69, 83, 77, 65, 128, 84, 82, 79, 77, 73, 75, 79, 78, \r
+    128, 84, 82, 79, 77, 73, 75, 79, 206, 84, 82, 79, 77, 73, 75, 79, 76, 89, \r
+    71, 73, 83, 77, 65, 128, 84, 82, 79, 75, 85, 84, 65, 83, 84, 201, 84, 82, \r
+    79, 69, 90, 69, 78, 73, 65, 206, 84, 82, 73, 84, 79, 211, 84, 82, 73, 84, \r
+    73, 77, 79, 82, 73, 79, 78, 128, 84, 82, 73, 83, 73, 77, 79, 85, 128, 84, \r
+    82, 73, 83, 69, 77, 69, 128, 84, 82, 73, 80, 79, 68, 128, 84, 82, 73, 80, \r
+    76, 73, 128, 84, 82, 73, 80, 76, 197, 84, 82, 73, 79, 206, 84, 82, 73, \r
+    73, 83, 65, 80, 128, 84, 82, 73, 71, 82, 65, 77, 77, 79, 211, 84, 82, 73, \r
+    71, 82, 65, 205, 84, 82, 73, 71, 79, 82, 71, 79, 78, 128, 84, 82, 73, 70, \r
+    79, 78, 73, 65, 83, 128, 84, 82, 73, 70, 79, 76, 73, 65, 84, 197, 84, 82, \r
+    73, 67, 79, 76, 79, 78, 128, 84, 82, 73, 65, 78, 71, 85, 76, 65, 210, 84, \r
+    82, 73, 65, 78, 71, 76, 69, 45, 82, 79, 85, 78, 196, 84, 82, 73, 65, 78, \r
+    71, 76, 69, 45, 72, 69, 65, 68, 69, 196, 84, 82, 73, 65, 78, 71, 76, 69, \r
+    128, 84, 82, 73, 65, 78, 71, 76, 197, 84, 82, 73, 65, 128, 84, 82, 73, \r
+    128, 84, 82, 69, 83, 73, 76, 76, 79, 128, 84, 82, 69, 77, 79, 76, 79, 45, \r
+    51, 128, 84, 82, 69, 77, 79, 76, 79, 45, 50, 128, 84, 82, 69, 77, 79, 76, \r
+    79, 45, 49, 128, 84, 82, 69, 69, 128, 84, 82, 69, 197, 84, 82, 69, 65, \r
+    68, 73, 78, 71, 128, 84, 82, 65, 80, 69, 90, 73, 85, 77, 128, 84, 82, 65, \r
+    78, 83, 86, 69, 82, 83, 65, 204, 84, 82, 65, 78, 83, 80, 79, 83, 73, 84, \r
+    73, 79, 206, 84, 82, 65, 78, 83, 77, 73, 83, 83, 73, 79, 78, 128, 84, 82, \r
+    65, 78, 83, 77, 73, 83, 83, 73, 79, 206, 84, 82, 65, 70, 70, 73, 67, 128, \r
+    84, 82, 65, 68, 197, 84, 82, 65, 67, 75, 128, 84, 82, 128, 84, 79, 88, \r
+    128, 84, 79, 85, 82, 78, 79, 73, 211, 84, 79, 84, 65, 204, 84, 79, 84, \r
+    128, 84, 79, 82, 84, 79, 73, 83, 197, 84, 79, 82, 67, 85, 76, 85, 83, \r
+    128, 84, 79, 82, 67, 85, 76, 85, 211, 84, 79, 80, 66, 65, 82, 128, 84, \r
+    79, 80, 45, 76, 73, 71, 72, 84, 69, 196, 84, 79, 80, 128, 84, 79, 208, \r
+    84, 79, 79, 84, 72, 128, 84, 79, 79, 128, 84, 79, 78, 79, 83, 128, 84, \r
+    79, 78, 71, 85, 69, 128, 84, 79, 78, 71, 128, 84, 79, 78, 69, 45, 54, \r
+    128, 84, 79, 78, 69, 45, 53, 128, 84, 79, 78, 69, 45, 52, 128, 84, 79, \r
+    78, 69, 45, 51, 128, 84, 79, 78, 69, 45, 50, 128, 84, 79, 78, 69, 45, 49, \r
+    128, 84, 79, 78, 69, 128, 84, 79, 78, 65, 204, 84, 79, 76, 79, 78, 71, \r
+    128, 84, 79, 71, 69, 84, 72, 69, 82, 128, 84, 79, 68, 207, 84, 79, 65, \r
+    78, 68, 65, 75, 72, 73, 65, 84, 128, 84, 79, 65, 128, 84, 78, 128, 84, \r
+    76, 86, 128, 84, 76, 85, 128, 84, 76, 79, 128, 84, 76, 73, 128, 84, 76, \r
+    72, 87, 69, 128, 84, 76, 72, 85, 128, 84, 76, 72, 79, 79, 128, 84, 76, \r
+    72, 79, 128, 84, 76, 72, 73, 128, 84, 76, 72, 69, 69, 128, 84, 76, 72, \r
+    69, 128, 84, 76, 72, 65, 128, 84, 76, 69, 69, 128, 84, 76, 65, 128, 84, \r
+    74, 69, 128, 84, 73, 88, 128, 84, 73, 87, 78, 128, 84, 73, 87, 65, 218, \r
+    84, 73, 84, 76, 79, 128, 84, 73, 84, 128, 84, 73, 82, 89, 65, 75, 128, \r
+    84, 73, 82, 84, 193, 84, 73, 82, 79, 78, 73, 65, 206, 84, 73, 82, 128, \r
+    84, 73, 210, 84, 73, 80, 80, 73, 128, 84, 73, 80, 69, 72, 65, 128, 84, \r
+    73, 80, 128, 84, 73, 208, 84, 73, 78, 89, 128, 84, 73, 78, 217, 84, 73, \r
+    78, 78, 69, 128, 84, 73, 78, 65, 71, 77, 65, 128, 84, 73, 77, 69, 83, \r
+    128, 84, 73, 77, 69, 128, 84, 73, 76, 68, 69, 128, 84, 73, 76, 68, 197, \r
+    84, 73, 76, 128, 84, 73, 204, 84, 73, 75, 69, 85, 84, 45, 84, 72, 73, 69, \r
+    85, 84, 72, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 45, 75, 73, \r
+    89, 69, 79, 75, 128, 84, 73, 75, 69, 85, 84, 45, 83, 73, 79, 83, 128, 84, \r
+    73, 75, 69, 85, 84, 45, 82, 73, 69, 85, 76, 128, 84, 73, 75, 69, 85, 84, \r
+    45, 80, 73, 69, 85, 80, 128, 84, 73, 75, 69, 85, 84, 45, 77, 73, 69, 85, \r
+    77, 128, 84, 73, 75, 69, 85, 84, 45, 75, 73, 89, 69, 79, 75, 128, 84, 73, \r
+    75, 69, 85, 84, 45, 67, 73, 69, 85, 67, 128, 84, 73, 75, 69, 85, 84, 45, \r
+    67, 72, 73, 69, 85, 67, 72, 128, 84, 73, 75, 69, 85, 84, 128, 84, 73, 75, \r
+    69, 85, 212, 84, 73, 73, 128, 84, 73, 71, 72, 212, 84, 73, 71, 69, 82, \r
+    128, 84, 73, 70, 73, 78, 65, 71, 200, 84, 73, 69, 88, 128, 84, 73, 69, \r
+    80, 128, 84, 73, 197, 84, 73, 67, 75, 128, 84, 73, 67, 203, 84, 73, 65, \r
+    82, 65, 128, 84, 72, 90, 128, 84, 72, 89, 79, 79, 205, 84, 72, 87, 79, \r
+    79, 128, 84, 72, 87, 79, 128, 84, 72, 87, 73, 73, 128, 84, 72, 87, 73, \r
+    128, 84, 72, 87, 69, 69, 128, 84, 72, 87, 65, 65, 128, 84, 72, 87, 65, \r
+    128, 84, 72, 85, 82, 211, 84, 72, 85, 82, 73, 83, 65, 218, 84, 72, 85, \r
+    78, 71, 128, 84, 72, 85, 78, 68, 69, 82, 83, 84, 79, 82, 77, 128, 84, 72, \r
+    85, 78, 68, 69, 82, 128, 84, 72, 85, 78, 68, 69, 210, 84, 72, 85, 128, \r
+    84, 72, 82, 79, 85, 71, 72, 128, 84, 72, 82, 79, 85, 71, 200, 84, 72, 82, \r
+    69, 69, 45, 80, 69, 82, 45, 69, 205, 84, 72, 82, 69, 69, 45, 76, 73, 78, \r
+    197, 84, 72, 82, 69, 69, 45, 196, 84, 72, 82, 69, 65, 68, 128, 84, 72, \r
+    79, 85, 83, 65, 78, 68, 211, 84, 72, 79, 85, 83, 65, 78, 68, 128, 84, 72, \r
+    79, 85, 83, 65, 78, 196, 84, 72, 79, 85, 128, 84, 72, 79, 82, 78, 128, \r
+    84, 72, 79, 82, 206, 84, 72, 79, 78, 71, 128, 84, 72, 79, 65, 128, 84, \r
+    72, 207, 84, 72, 73, 85, 84, 72, 128, 84, 72, 73, 84, 65, 128, 84, 72, \r
+    73, 82, 84, 89, 45, 83, 69, 67, 79, 78, 196, 84, 72, 73, 82, 84, 89, 45, \r
+    79, 78, 69, 128, 84, 72, 73, 82, 84, 89, 128, 84, 72, 73, 82, 84, 217, \r
+    84, 72, 73, 82, 84, 69, 69, 78, 128, 84, 72, 73, 82, 84, 69, 69, 206, 84, \r
+    72, 73, 82, 68, 83, 128, 84, 72, 73, 82, 68, 211, 84, 72, 73, 82, 68, \r
+    128, 84, 72, 73, 82, 196, 84, 72, 73, 206, 84, 72, 73, 73, 128, 84, 72, \r
+    73, 71, 72, 128, 84, 72, 73, 69, 85, 84, 200, 84, 72, 69, 89, 128, 84, \r
+    72, 69, 84, 72, 69, 128, 84, 72, 69, 84, 72, 128, 84, 72, 69, 84, 65, \r
+    128, 84, 72, 69, 84, 193, 84, 72, 69, 83, 80, 73, 65, 206, 84, 72, 69, \r
+    83, 69, 79, 83, 128, 84, 72, 69, 83, 69, 79, 211, 84, 72, 69, 211, 84, \r
+    72, 69, 82, 77, 79, 68, 89, 78, 65, 77, 73, 67, 128, 84, 72, 69, 82, 69, \r
+    70, 79, 82, 69, 128, 84, 72, 69, 82, 197, 84, 72, 69, 206, 84, 72, 69, \r
+    77, 65, 84, 73, 83, 77, 79, 211, 84, 72, 69, 77, 65, 128, 84, 72, 69, 77, \r
+    193, 84, 72, 69, 72, 128, 84, 72, 69, 200, 84, 72, 69, 69, 128, 84, 72, \r
+    197, 84, 72, 65, 87, 128, 84, 72, 65, 78, 84, 72, 65, 75, 72, 65, 84, \r
+    128, 84, 72, 65, 78, 78, 65, 128, 84, 72, 65, 78, 128, 84, 72, 65, 206, \r
+    84, 72, 65, 76, 128, 84, 72, 65, 204, 84, 72, 65, 72, 65, 78, 128, 84, \r
+    72, 65, 65, 78, 193, 84, 72, 65, 65, 76, 85, 128, 84, 72, 45, 67, 82, 69, \r
+    197, 84, 69, 88, 84, 128, 84, 69, 88, 128, 84, 69, 86, 73, 82, 128, 84, \r
+    69, 84, 82, 65, 83, 73, 77, 79, 85, 128, 84, 69, 84, 82, 65, 83, 69, 77, \r
+    69, 128, 84, 69, 84, 82, 65, 80, 76, 73, 128, 84, 69, 84, 82, 65, 70, 79, \r
+    78, 73, 65, 83, 128, 84, 69, 84, 72, 128, 84, 69, 84, 200, 84, 69, 84, \r
+    65, 82, 84, 79, 211, 84, 69, 84, 65, 82, 84, 73, 77, 79, 82, 73, 79, 78, \r
+    128, 84, 69, 84, 128, 84, 69, 212, 84, 69, 83, 83, 69, 82, 65, 128, 84, \r
+    69, 83, 83, 69, 82, 193, 84, 69, 83, 83, 65, 82, 79, 206, 84, 69, 83, \r
+    200, 84, 69, 82, 77, 73, 78, 65, 84, 79, 82, 128, 84, 69, 80, 128, 84, \r
+    69, 78, 85, 84, 79, 128, 84, 69, 78, 85, 128, 84, 69, 78, 213, 84, 69, \r
+    78, 84, 72, 128, 84, 69, 78, 84, 128, 84, 69, 78, 211, 84, 69, 78, 71, \r
+    197, 84, 69, 78, 128, 84, 69, 206, 84, 69, 77, 80, 85, 211, 84, 69, 76, \r
+    85, 128, 84, 69, 76, 79, 85, 211, 84, 69, 76, 73, 83, 72, 193, 84, 69, \r
+    76, 69, 80, 72, 79, 78, 69, 128, 84, 69, 76, 69, 80, 72, 79, 78, 197, 84, \r
+    69, 76, 69, 73, 65, 128, 84, 69, 73, 87, 83, 128, 84, 69, 71, 69, 72, \r
+    128, 84, 69, 197, 84, 69, 68, 85, 78, 71, 128, 84, 69, 65, 82, 68, 82, \r
+    79, 80, 45, 83, 80, 79, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, \r
+    83, 72, 65, 78, 75, 69, 196, 84, 69, 65, 82, 68, 82, 79, 80, 45, 66, 65, \r
+    82, 66, 69, 196, 84, 69, 45, 85, 128, 84, 67, 72, 69, 72, 69, 72, 128, \r
+    84, 67, 72, 69, 72, 69, 200, 84, 67, 72, 69, 72, 128, 84, 67, 72, 69, \r
+    200, 84, 67, 72, 69, 128, 84, 195, 84, 65, 89, 128, 84, 65, 88, 128, 84, \r
+    65, 87, 69, 76, 76, 69, 77, 69, 212, 84, 65, 87, 65, 128, 84, 65, 87, \r
+    128, 84, 65, 86, 73, 89, 65, 78, 73, 128, 84, 65, 86, 128, 84, 65, 214, \r
+    84, 65, 85, 82, 85, 83, 128, 84, 65, 85, 128, 84, 65, 213, 84, 65, 84, \r
+    87, 69, 69, 76, 128, 84, 65, 84, 87, 69, 69, 204, 84, 65, 84, 84, 79, 79, \r
+    69, 196, 84, 65, 84, 128, 84, 65, 82, 85, 78, 71, 128, 84, 65, 82, 128, \r
+    84, 65, 80, 69, 82, 128, 84, 65, 80, 197, 84, 65, 80, 128, 84, 65, 79, \r
+    128, 84, 65, 78, 78, 69, 196, 84, 65, 78, 199, 84, 65, 78, 128, 84, 65, \r
+    77, 73, 78, 71, 128, 84, 65, 77, 128, 84, 65, 76, 76, 128, 84, 65, 76, \r
+    204, 84, 65, 76, 73, 78, 71, 128, 84, 65, 76, 73, 78, 199, 84, 65, 76, \r
+    69, 78, 84, 83, 128, 84, 65, 76, 69, 78, 212, 84, 65, 75, 72, 65, 76, 76, \r
+    85, 83, 128, 84, 65, 75, 69, 128, 84, 65, 75, 52, 128, 84, 65, 75, 128, \r
+    84, 65, 73, 83, 89, 79, 85, 128, 84, 65, 73, 76, 76, 69, 83, 211, 84, 65, \r
+    73, 76, 128, 84, 65, 73, 204, 84, 65, 72, 128, 84, 65, 200, 84, 65, 71, \r
+    66, 65, 78, 87, 193, 84, 65, 71, 65, 76, 79, 199, 84, 65, 71, 128, 84, \r
+    65, 69, 128, 84, 65, 67, 75, 128, 84, 65, 67, 203, 84, 65, 66, 85, 76, \r
+    65, 84, 73, 79, 78, 128, 84, 65, 66, 76, 69, 128, 84, 65, 66, 128, 84, \r
+    65, 194, 84, 65, 65, 76, 85, 74, 193, 84, 65, 65, 73, 128, 84, 65, 65, \r
+    70, 128, 84, 65, 50, 128, 84, 65, 45, 82, 79, 76, 128, 84, 48, 51, 54, \r
+    128, 84, 48, 51, 53, 128, 84, 48, 51, 52, 128, 84, 48, 51, 51, 65, 128, \r
+    84, 48, 51, 51, 128, 84, 48, 51, 50, 65, 128, 84, 48, 51, 50, 128, 84, \r
+    48, 51, 49, 128, 84, 48, 51, 48, 128, 84, 48, 50, 57, 128, 84, 48, 50, \r
+    56, 128, 84, 48, 50, 55, 128, 84, 48, 50, 54, 128, 84, 48, 50, 53, 128, \r
+    84, 48, 50, 52, 128, 84, 48, 50, 51, 128, 84, 48, 50, 50, 128, 84, 48, \r
+    50, 49, 128, 84, 48, 50, 48, 128, 84, 48, 49, 57, 128, 84, 48, 49, 56, \r
+    128, 84, 48, 49, 55, 128, 84, 48, 49, 54, 65, 128, 84, 48, 49, 54, 128, \r
+    84, 48, 49, 53, 128, 84, 48, 49, 52, 128, 84, 48, 49, 51, 128, 84, 48, \r
+    49, 50, 128, 84, 48, 49, 49, 65, 128, 84, 48, 49, 49, 128, 84, 48, 49, \r
+    48, 128, 84, 48, 48, 57, 65, 128, 84, 48, 48, 57, 128, 84, 48, 48, 56, \r
+    65, 128, 84, 48, 48, 56, 128, 84, 48, 48, 55, 65, 128, 84, 48, 48, 55, \r
+    128, 84, 48, 48, 54, 128, 84, 48, 48, 53, 128, 84, 48, 48, 52, 128, 84, \r
+    48, 48, 51, 65, 128, 84, 48, 48, 51, 128, 84, 48, 48, 50, 128, 84, 48, \r
+    48, 49, 128, 83, 90, 90, 128, 83, 90, 87, 71, 128, 83, 90, 87, 65, 128, \r
+    83, 90, 85, 128, 83, 90, 79, 128, 83, 90, 73, 128, 83, 90, 69, 69, 128, \r
+    83, 90, 69, 128, 83, 90, 65, 65, 128, 83, 90, 65, 128, 83, 90, 128, 83, \r
+    89, 88, 128, 83, 89, 84, 128, 83, 89, 82, 88, 128, 83, 89, 82, 77, 65, \r
+    84, 73, 75, 73, 128, 83, 89, 82, 77, 65, 128, 83, 89, 82, 128, 83, 89, \r
+    80, 128, 83, 89, 79, 85, 87, 65, 128, 83, 89, 78, 69, 86, 77, 65, 128, \r
+    83, 89, 78, 68, 69, 83, 77, 79, 211, 83, 89, 78, 67, 72, 82, 79, 78, 79, \r
+    85, 211, 83, 89, 78, 65, 71, 77, 193, 83, 89, 78, 65, 70, 73, 128, 83, \r
+    89, 77, 77, 69, 84, 82, 89, 128, 83, 89, 77, 77, 69, 84, 82, 73, 195, 83, \r
+    89, 77, 66, 79, 76, 45, 57, 128, 83, 89, 77, 66, 79, 76, 45, 56, 128, 83, \r
+    89, 77, 66, 79, 76, 45, 55, 128, 83, 89, 77, 66, 79, 76, 45, 54, 128, 83, \r
+    89, 77, 66, 79, 76, 45, 53, 52, 128, 83, 89, 77, 66, 79, 76, 45, 53, 51, \r
+    128, 83, 89, 77, 66, 79, 76, 45, 53, 50, 128, 83, 89, 77, 66, 79, 76, 45, \r
+    53, 49, 128, 83, 89, 77, 66, 79, 76, 45, 53, 48, 128, 83, 89, 77, 66, 79, \r
+    76, 45, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 57, 128, 83, 89, 77, 66, \r
+    79, 76, 45, 52, 56, 128, 83, 89, 77, 66, 79, 76, 45, 52, 55, 128, 83, 89, \r
+    77, 66, 79, 76, 45, 52, 53, 128, 83, 89, 77, 66, 79, 76, 45, 52, 51, 128, \r
+    83, 89, 77, 66, 79, 76, 45, 52, 50, 128, 83, 89, 77, 66, 79, 76, 45, 52, \r
+    48, 128, 83, 89, 77, 66, 79, 76, 45, 52, 128, 83, 89, 77, 66, 79, 76, 45, \r
+    51, 57, 128, 83, 89, 77, 66, 79, 76, 45, 51, 56, 128, 83, 89, 77, 66, 79, \r
+    76, 45, 51, 55, 128, 83, 89, 77, 66, 79, 76, 45, 51, 54, 128, 83, 89, 77, \r
+    66, 79, 76, 45, 51, 50, 128, 83, 89, 77, 66, 79, 76, 45, 51, 48, 128, 83, \r
+    89, 77, 66, 79, 76, 45, 51, 128, 83, 89, 77, 66, 79, 76, 45, 50, 57, 128, \r
+    83, 89, 77, 66, 79, 76, 45, 50, 55, 128, 83, 89, 77, 66, 79, 76, 45, 50, \r
+    54, 128, 83, 89, 77, 66, 79, 76, 45, 50, 53, 128, 83, 89, 77, 66, 79, 76, \r
+    45, 50, 52, 128, 83, 89, 77, 66, 79, 76, 45, 50, 51, 128, 83, 89, 77, 66, \r
+    79, 76, 45, 50, 50, 128, 83, 89, 77, 66, 79, 76, 45, 50, 49, 128, 83, 89, \r
+    77, 66, 79, 76, 45, 50, 48, 128, 83, 89, 77, 66, 79, 76, 45, 50, 128, 83, \r
+    89, 77, 66, 79, 76, 45, 49, 57, 128, 83, 89, 77, 66, 79, 76, 45, 49, 56, \r
+    128, 83, 89, 77, 66, 79, 76, 45, 49, 55, 128, 83, 89, 77, 66, 79, 76, 45, \r
+    49, 54, 128, 83, 89, 77, 66, 79, 76, 45, 49, 53, 128, 83, 89, 77, 66, 79, \r
+    76, 45, 49, 52, 128, 83, 89, 77, 66, 79, 76, 45, 49, 51, 128, 83, 89, 77, \r
+    66, 79, 76, 45, 49, 50, 128, 83, 89, 77, 66, 79, 76, 45, 49, 49, 128, 83, \r
+    89, 77, 66, 79, 76, 45, 49, 48, 128, 83, 89, 77, 66, 79, 76, 45, 49, 128, \r
+    83, 89, 76, 79, 84, 201, 83, 89, 65, 128, 83, 89, 128, 83, 87, 90, 128, \r
+    83, 87, 85, 78, 199, 83, 87, 79, 82, 68, 83, 128, 83, 87, 79, 82, 68, \r
+    128, 83, 87, 79, 79, 128, 83, 87, 79, 128, 83, 87, 73, 73, 128, 83, 87, \r
+    73, 128, 83, 87, 71, 128, 83, 87, 69, 69, 84, 128, 83, 87, 65, 83, 200, \r
+    83, 87, 65, 80, 80, 73, 78, 71, 128, 83, 87, 65, 65, 128, 83, 87, 128, \r
+    83, 86, 65, 83, 84, 201, 83, 86, 65, 82, 73, 84, 65, 128, 83, 86, 65, 82, \r
+    73, 84, 193, 83, 85, 88, 128, 83, 85, 85, 128, 83, 85, 84, 128, 83, 85, \r
+    83, 80, 69, 78, 83, 73, 79, 206, 83, 85, 82, 88, 128, 83, 85, 82, 82, 79, \r
+    85, 78, 68, 128, 83, 85, 82, 82, 79, 85, 78, 196, 83, 85, 82, 70, 65, 67, \r
+    197, 83, 85, 82, 69, 128, 83, 85, 82, 65, 78, 71, 128, 83, 85, 82, 57, \r
+    128, 83, 85, 82, 128, 83, 85, 210, 83, 85, 80, 82, 65, 76, 73, 78, 69, \r
+    65, 210, 83, 85, 80, 69, 82, 86, 73, 83, 69, 128, 83, 85, 80, 69, 82, 83, \r
+    69, 84, 128, 83, 85, 80, 69, 82, 83, 69, 212, 83, 85, 80, 69, 82, 83, 67, \r
+    82, 73, 80, 212, 83, 85, 80, 69, 82, 73, 77, 80, 79, 83, 69, 196, 83, 85, \r
+    80, 69, 82, 70, 73, 88, 69, 196, 83, 85, 80, 128, 83, 85, 79, 88, 128, \r
+    83, 85, 79, 80, 128, 83, 85, 79, 128, 83, 85, 78, 71, 128, 83, 85, 78, \r
+    68, 65, 78, 69, 83, 197, 83, 85, 78, 128, 83, 85, 206, 83, 85, 77, 77, \r
+    69, 82, 128, 83, 85, 77, 77, 65, 84, 73, 79, 78, 128, 83, 85, 77, 77, 65, \r
+    84, 73, 79, 206, 83, 85, 77, 65, 83, 72, 128, 83, 85, 77, 128, 83, 85, \r
+    75, 85, 78, 128, 83, 85, 75, 85, 206, 83, 85, 75, 85, 128, 83, 85, 75, \r
+    213, 83, 85, 73, 84, 65, 66, 76, 69, 128, 83, 85, 73, 84, 128, 83, 85, \r
+    72, 85, 82, 128, 83, 85, 68, 50, 128, 83, 85, 68, 128, 83, 85, 67, 67, \r
+    69, 69, 68, 83, 128, 83, 85, 67, 67, 69, 69, 68, 211, 83, 85, 67, 67, 69, \r
+    69, 68, 128, 83, 85, 67, 67, 69, 69, 196, 83, 85, 66, 85, 78, 73, 84, \r
+    128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 73, 79, 206, 83, 85, 66, 83, 84, \r
+    73, 84, 85, 84, 69, 128, 83, 85, 66, 83, 84, 73, 84, 85, 84, 197, 83, 85, \r
+    66, 83, 69, 84, 128, 83, 85, 66, 83, 69, 212, 83, 85, 66, 83, 67, 82, 73, \r
+    80, 212, 83, 85, 66, 80, 85, 78, 67, 84, 73, 83, 128, 83, 85, 66, 76, 73, \r
+    78, 69, 65, 210, 83, 85, 66, 74, 79, 73, 78, 69, 196, 83, 85, 66, 74, 69, \r
+    67, 84, 128, 83, 85, 66, 73, 84, 79, 128, 83, 85, 66, 71, 82, 79, 85, 80, \r
+    128, 83, 85, 66, 71, 82, 79, 85, 208, 83, 85, 65, 128, 83, 213, 83, 84, \r
+    87, 65, 128, 83, 84, 85, 68, 89, 128, 83, 84, 82, 79, 75, 69, 83, 128, \r
+    83, 84, 82, 79, 75, 69, 211, 83, 84, 82, 79, 75, 69, 45, 57, 128, 83, 84, \r
+    82, 79, 75, 69, 45, 56, 128, 83, 84, 82, 79, 75, 69, 45, 55, 128, 83, 84, \r
+    82, 79, 75, 69, 45, 54, 128, 83, 84, 82, 79, 75, 69, 45, 53, 128, 83, 84, \r
+    82, 79, 75, 69, 45, 52, 128, 83, 84, 82, 79, 75, 69, 45, 51, 128, 83, 84, \r
+    82, 79, 75, 69, 45, 50, 128, 83, 84, 82, 79, 75, 69, 45, 49, 49, 128, 83, \r
+    84, 82, 79, 75, 69, 45, 49, 48, 128, 83, 84, 82, 79, 75, 69, 45, 49, 128, \r
+    83, 84, 82, 73, 80, 69, 128, 83, 84, 82, 73, 75, 69, 84, 72, 82, 79, 85, \r
+    71, 72, 128, 83, 84, 82, 73, 68, 69, 128, 83, 84, 82, 73, 67, 84, 76, \r
+    217, 83, 84, 82, 69, 84, 67, 72, 69, 196, 83, 84, 82, 69, 83, 211, 83, \r
+    84, 82, 69, 78, 71, 84, 72, 128, 83, 84, 82, 65, 84, 73, 65, 206, 83, 84, \r
+    82, 65, 73, 78, 69, 82, 128, 83, 84, 82, 65, 73, 71, 72, 84, 78, 69, 83, \r
+    83, 128, 83, 84, 82, 65, 73, 71, 72, 212, 83, 84, 82, 65, 73, 70, 128, \r
+    83, 84, 82, 65, 71, 71, 73, 83, 77, 65, 84, 65, 128, 83, 84, 79, 86, 69, \r
+    128, 83, 84, 79, 80, 80, 73, 78, 71, 128, 83, 84, 79, 80, 80, 65, 71, 69, \r
+    128, 83, 84, 79, 80, 128, 83, 84, 79, 208, 83, 84, 79, 78, 69, 128, 83, \r
+    84, 79, 67, 75, 128, 83, 84, 73, 77, 77, 69, 128, 83, 84, 73, 76, 204, \r
+    83, 84, 73, 76, 197, 83, 84, 73, 71, 77, 65, 128, 83, 84, 69, 80, 128, \r
+    83, 84, 69, 77, 128, 83, 84, 69, 205, 83, 84, 69, 65, 77, 128, 83, 84, \r
+    65, 86, 82, 79, 85, 128, 83, 84, 65, 86, 82, 79, 83, 128, 83, 84, 65, 86, \r
+    82, 79, 211, 83, 84, 65, 85, 82, 79, 83, 128, 83, 84, 65, 84, 69, 82, 83, \r
+    128, 83, 84, 65, 82, 212, 83, 84, 65, 82, 75, 128, 83, 84, 65, 82, 128, \r
+    83, 84, 65, 210, 83, 84, 65, 78, 68, 83, 84, 73, 76, 76, 128, 83, 84, 65, \r
+    78, 68, 65, 82, 196, 83, 84, 65, 78, 68, 128, 83, 84, 65, 78, 128, 83, \r
+    84, 65, 76, 76, 73, 79, 78, 128, 83, 84, 65, 70, 70, 128, 83, 84, 65, 70, \r
+    198, 83, 84, 65, 67, 67, 65, 84, 79, 128, 83, 84, 65, 67, 67, 65, 84, 73, \r
+    83, 83, 73, 77, 79, 128, 83, 84, 50, 128, 83, 83, 89, 88, 128, 83, 83, \r
+    89, 84, 128, 83, 83, 89, 82, 88, 128, 83, 83, 89, 82, 128, 83, 83, 89, \r
+    80, 128, 83, 83, 89, 128, 83, 83, 85, 88, 128, 83, 83, 85, 84, 128, 83, \r
+    83, 85, 80, 128, 83, 83, 79, 88, 128, 83, 83, 79, 84, 128, 83, 83, 79, \r
+    80, 128, 83, 83, 79, 128, 83, 83, 73, 88, 128, 83, 83, 73, 84, 128, 83, \r
+    83, 73, 80, 128, 83, 83, 73, 69, 88, 128, 83, 83, 73, 69, 80, 128, 83, \r
+    83, 73, 69, 128, 83, 83, 73, 128, 83, 83, 72, 69, 128, 83, 83, 69, 88, \r
+    128, 83, 83, 69, 80, 128, 83, 83, 69, 69, 128, 83, 83, 65, 88, 128, 83, \r
+    83, 65, 84, 128, 83, 83, 65, 80, 128, 83, 83, 65, 78, 71, 89, 69, 79, 82, \r
+    73, 78, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, \r
+    84, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 84, 73, 75, 69, 85, \r
+    84, 128, 83, 83, 65, 78, 71, 84, 72, 73, 69, 85, 84, 72, 128, 83, 83, 65, \r
+    78, 71, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 83, 83, 65, 78, \r
+    71, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 83, \r
+    73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 83, 73, \r
+    79, 83, 128, 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 45, 75, 72, 73, 69, \r
+    85, 75, 72, 128, 83, 83, 65, 78, 71, 82, 73, 69, 85, 76, 128, 83, 83, 65, \r
+    78, 71, 80, 73, 69, 85, 80, 128, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, \r
+    128, 83, 83, 65, 78, 71, 77, 73, 69, 85, 77, 128, 83, 83, 65, 78, 71, 75, \r
+    73, 89, 69, 79, 75, 128, 83, 83, 65, 78, 71, 73, 69, 85, 78, 71, 128, 83, \r
+    83, 65, 78, 71, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, \r
+    85, 67, 45, 72, 73, 69, 85, 72, 128, 83, 83, 65, 78, 71, 67, 73, 69, 85, \r
+    67, 128, 83, 83, 65, 78, 71, 65, 82, 65, 69, 65, 128, 83, 83, 65, 65, \r
+    128, 83, 83, 65, 128, 83, 82, 128, 83, 81, 85, 73, 83, 200, 83, 81, 85, \r
+    73, 82, 82, 69, 204, 83, 81, 85, 73, 71, 71, 76, 197, 83, 81, 85, 65, \r
+    212, 83, 81, 85, 65, 82, 69, 83, 128, 83, 81, 85, 65, 82, 69, 68, 128, \r
+    83, 81, 85, 65, 82, 69, 128, 83, 80, 87, 65, 128, 83, 80, 85, 78, 71, \r
+    211, 83, 80, 82, 79, 85, 84, 128, 83, 80, 82, 73, 78, 71, 83, 128, 83, \r
+    80, 82, 73, 78, 71, 128, 83, 80, 82, 69, 67, 72, 71, 69, 83, 65, 78, 199, \r
+    83, 80, 79, 84, 128, 83, 80, 79, 79, 78, 128, 83, 80, 76, 73, 84, 84, 73, \r
+    78, 199, 83, 80, 73, 82, 73, 84, 85, 211, 83, 80, 73, 82, 73, 84, 128, \r
+    83, 80, 73, 82, 73, 212, 83, 80, 73, 82, 65, 78, 84, 128, 83, 80, 73, 82, \r
+    65, 76, 128, 83, 80, 73, 68, 69, 82, 217, 83, 80, 73, 67, 69, 128, 83, \r
+    80, 72, 69, 82, 73, 67, 65, 204, 83, 80, 69, 83, 77, 73, 76, 207, 83, 80, \r
+    69, 69, 67, 72, 128, 83, 80, 69, 67, 73, 65, 76, 128, 83, 80, 69, 65, 82, \r
+    128, 83, 80, 65, 84, 72, 73, 128, 83, 80, 65, 82, 75, 76, 69, 128, 83, \r
+    80, 65, 68, 197, 83, 80, 65, 67, 73, 78, 199, 83, 80, 128, 83, 79, 89, \r
+    128, 83, 79, 87, 73, 76, 207, 83, 79, 87, 128, 83, 79, 85, 84, 72, 45, \r
+    83, 76, 65, 86, 69, 217, 83, 79, 85, 84, 200, 83, 79, 85, 82, 67, 69, \r
+    128, 83, 79, 85, 78, 68, 128, 83, 79, 85, 78, 196, 83, 79, 85, 78, 65, \r
+    80, 128, 83, 79, 85, 128, 83, 79, 79, 128, 83, 79, 78, 71, 128, 83, 79, \r
+    78, 128, 83, 79, 76, 73, 68, 85, 83, 128, 83, 79, 76, 73, 68, 85, 211, \r
+    83, 79, 71, 68, 73, 65, 206, 83, 79, 70, 84, 87, 65, 82, 69, 45, 70, 85, \r
+    78, 67, 84, 73, 79, 206, 83, 79, 70, 212, 83, 79, 198, 83, 79, 67, 73, \r
+    69, 84, 89, 128, 83, 79, 67, 67, 69, 210, 83, 79, 65, 128, 83, 207, 83, \r
+    78, 79, 87, 77, 65, 78, 128, 83, 78, 79, 87, 77, 65, 206, 83, 78, 79, 87, \r
+    70, 76, 65, 75, 69, 128, 83, 78, 79, 87, 128, 83, 78, 79, 85, 84, 128, \r
+    83, 78, 79, 85, 212, 83, 78, 65, 208, 83, 78, 65, 75, 69, 128, 83, 78, \r
+    65, 75, 197, 83, 78, 193, 83, 77, 73, 76, 73, 78, 199, 83, 77, 73, 76, \r
+    69, 128, 83, 77, 69, 65, 82, 128, 83, 77, 65, 83, 200, 83, 77, 65, 76, \r
+    76, 69, 210, 83, 77, 65, 76, 76, 128, 83, 76, 85, 82, 128, 83, 76, 79, \r
+    87, 76, 89, 128, 83, 76, 79, 215, 83, 76, 79, 86, 79, 128, 83, 76, 79, \r
+    80, 73, 78, 199, 83, 76, 79, 80, 69, 128, 83, 76, 73, 78, 71, 128, 83, \r
+    76, 73, 68, 73, 78, 71, 128, 83, 76, 73, 67, 69, 128, 83, 76, 65, 86, 79, \r
+    78, 73, 195, 83, 76, 65, 86, 69, 128, 83, 76, 65, 83, 72, 128, 83, 76, \r
+    65, 83, 200, 83, 76, 65, 78, 84, 69, 196, 83, 75, 87, 65, 128, 83, 75, \r
+    87, 128, 83, 75, 85, 76, 204, 83, 75, 76, 73, 82, 79, 206, 83, 75, 73, \r
+    78, 128, 83, 75, 73, 69, 82, 128, 83, 75, 69, 87, 69, 196, 83, 75, 65, \r
+    84, 69, 128, 83, 75, 128, 83, 74, 69, 128, 83, 73, 88, 84, 89, 45, 70, \r
+    79, 85, 82, 84, 200, 83, 73, 88, 84, 89, 128, 83, 73, 88, 84, 217, 83, \r
+    73, 88, 84, 72, 83, 128, 83, 73, 88, 84, 72, 211, 83, 73, 88, 84, 72, \r
+    128, 83, 73, 88, 84, 69, 69, 78, 84, 72, 83, 128, 83, 73, 88, 84, 69, 69, \r
+    78, 84, 72, 128, 83, 73, 88, 84, 69, 69, 78, 84, 200, 83, 73, 88, 84, 69, \r
+    69, 78, 128, 83, 73, 88, 84, 69, 69, 206, 83, 73, 88, 45, 83, 84, 82, 73, \r
+    78, 199, 83, 73, 88, 45, 80, 69, 82, 45, 69, 205, 83, 73, 88, 45, 76, 73, \r
+    78, 197, 83, 73, 216, 83, 73, 84, 69, 128, 83, 73, 82, 73, 78, 71, 85, \r
+    128, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 83, 73, 79, 83, \r
+    45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 82, 73, \r
+    69, 85, 76, 128, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 45, 75, 73, 89, \r
+    69, 79, 75, 128, 83, 73, 79, 83, 45, 80, 72, 73, 69, 85, 80, 72, 128, 83, \r
+    73, 79, 83, 45, 80, 65, 78, 83, 73, 79, 83, 128, 83, 73, 79, 83, 45, 78, \r
+    73, 69, 85, 78, 128, 83, 73, 79, 83, 45, 77, 73, 69, 85, 77, 128, 83, 73, \r
+    79, 83, 45, 75, 72, 73, 69, 85, 75, 72, 128, 83, 73, 79, 83, 45, 75, 65, \r
+    80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, 83, 73, 79, 83, 45, 73, \r
+    69, 85, 78, 71, 128, 83, 73, 79, 83, 45, 72, 73, 69, 85, 72, 128, 83, 73, \r
+    79, 83, 45, 67, 73, 69, 85, 67, 128, 83, 73, 79, 83, 45, 67, 72, 73, 69, \r
+    85, 67, 72, 128, 83, 73, 79, 211, 83, 73, 78, 75, 73, 78, 71, 128, 83, \r
+    73, 78, 71, 76, 69, 45, 76, 73, 78, 197, 83, 73, 78, 71, 76, 69, 128, 83, \r
+    73, 78, 71, 76, 197, 83, 73, 78, 71, 65, 65, 84, 128, 83, 73, 78, 197, \r
+    83, 73, 78, 68, 72, 201, 83, 73, 206, 83, 73, 77, 80, 76, 73, 70, 73, 69, \r
+    196, 83, 73, 77, 73, 76, 65, 82, 128, 83, 73, 77, 73, 76, 65, 210, 83, \r
+    73, 77, 65, 78, 83, 73, 211, 83, 73, 77, 65, 128, 83, 73, 76, 75, 128, \r
+    83, 73, 76, 73, 81, 85, 193, 83, 73, 76, 65, 51, 128, 83, 73, 75, 73, \r
+    128, 83, 73, 75, 50, 128, 83, 73, 75, 178, 83, 73, 73, 128, 83, 73, 71, \r
+    78, 83, 128, 83, 73, 71, 77, 65, 128, 83, 73, 71, 77, 193, 83, 73, 71, \r
+    69, 204, 83, 73, 71, 52, 128, 83, 73, 71, 180, 83, 73, 71, 128, 83, 73, \r
+    68, 69, 87, 65, 89, 211, 83, 73, 67, 75, 78, 69, 83, 83, 128, 83, 73, 67, \r
+    75, 76, 69, 128, 83, 73, 66, 197, 83, 201, 83, 72, 89, 88, 128, 83, 72, \r
+    89, 84, 128, 83, 72, 89, 82, 88, 128, 83, 72, 89, 82, 128, 83, 72, 89, \r
+    80, 128, 83, 72, 89, 69, 128, 83, 72, 89, 65, 128, 83, 72, 89, 128, 83, \r
+    72, 87, 79, 89, 128, 83, 72, 87, 79, 79, 128, 83, 72, 87, 79, 128, 83, \r
+    72, 87, 73, 73, 128, 83, 72, 87, 73, 128, 83, 72, 87, 69, 128, 83, 72, \r
+    87, 65, 65, 128, 83, 72, 87, 65, 128, 83, 72, 85, 88, 128, 83, 72, 85, \r
+    84, 128, 83, 72, 85, 82, 88, 128, 83, 72, 85, 82, 128, 83, 72, 85, 80, \r
+    128, 83, 72, 85, 79, 88, 128, 83, 72, 85, 79, 80, 128, 83, 72, 85, 79, \r
+    128, 83, 72, 85, 70, 70, 76, 197, 83, 72, 85, 66, 85, 82, 128, 83, 72, \r
+    85, 50, 128, 83, 72, 85, 178, 83, 72, 85, 128, 83, 72, 213, 83, 72, 84, \r
+    65, 80, 73, 67, 128, 83, 72, 84, 65, 128, 83, 72, 82, 73, 78, 69, 128, \r
+    83, 72, 79, 89, 128, 83, 72, 79, 88, 128, 83, 72, 79, 85, 76, 68, 69, 82, \r
+    69, 196, 83, 72, 79, 84, 128, 83, 72, 79, 82, 84, 83, 128, 83, 72, 79, \r
+    82, 84, 211, 83, 72, 79, 82, 84, 69, 78, 69, 82, 128, 83, 72, 79, 82, 84, \r
+    45, 84, 87, 73, 71, 45, 89, 82, 128, 83, 72, 79, 82, 84, 45, 84, 87, 73, \r
+    71, 45, 84, 89, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 83, 79, \r
+    204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, 45, 79, 83, 211, 83, 72, 79, \r
+    82, 84, 45, 84, 87, 73, 71, 45, 78, 65, 85, 196, 83, 72, 79, 82, 84, 45, \r
+    84, 87, 73, 71, 45, 77, 65, 68, 210, 83, 72, 79, 82, 84, 45, 84, 87, 73, \r
+    71, 45, 72, 65, 71, 65, 76, 204, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, \r
+    45, 66, 74, 65, 82, 75, 65, 206, 83, 72, 79, 82, 84, 45, 84, 87, 73, 71, \r
+    45, 65, 210, 83, 72, 79, 82, 84, 128, 83, 72, 79, 82, 212, 83, 72, 79, \r
+    80, 128, 83, 72, 79, 79, 84, 128, 83, 72, 79, 79, 128, 83, 72, 79, 71, \r
+    201, 83, 72, 79, 199, 83, 72, 79, 197, 83, 72, 79, 65, 128, 83, 72, 79, \r
+    128, 83, 72, 73, 89, 89, 65, 65, 76, 65, 65, 128, 83, 72, 73, 84, 65, \r
+    128, 83, 72, 73, 84, 193, 83, 72, 73, 82, 128, 83, 72, 73, 210, 83, 72, \r
+    73, 80, 128, 83, 72, 73, 78, 84, 207, 83, 72, 73, 78, 73, 71, 128, 83, \r
+    72, 73, 78, 128, 83, 72, 73, 206, 83, 72, 73, 77, 65, 128, 83, 72, 73, \r
+    77, 193, 83, 72, 73, 77, 128, 83, 72, 73, 205, 83, 72, 73, 73, 78, 128, \r
+    83, 72, 73, 73, 128, 83, 72, 73, 70, 212, 83, 72, 73, 69, 76, 68, 128, \r
+    83, 72, 73, 68, 128, 83, 72, 73, 196, 83, 72, 73, 128, 83, 72, 72, 65, \r
+    128, 83, 72, 69, 88, 128, 83, 72, 69, 86, 65, 128, 83, 72, 69, 85, 88, \r
+    128, 83, 72, 69, 84, 128, 83, 72, 69, 83, 72, 76, 65, 77, 128, 83, 72, \r
+    69, 83, 72, 73, 71, 128, 83, 72, 69, 83, 72, 73, 199, 83, 72, 69, 83, 72, \r
+    50, 128, 83, 72, 69, 83, 72, 128, 83, 72, 69, 81, 69, 204, 83, 72, 69, \r
+    80, 128, 83, 72, 69, 78, 128, 83, 72, 69, 76, 76, 128, 83, 72, 69, 76, \r
+    204, 83, 72, 69, 76, 70, 128, 83, 72, 69, 73, 128, 83, 72, 69, 71, 57, \r
+    128, 83, 72, 69, 69, 80, 128, 83, 72, 69, 69, 78, 85, 128, 83, 72, 69, \r
+    69, 78, 128, 83, 72, 69, 69, 206, 83, 72, 69, 69, 128, 83, 72, 69, 45, \r
+    71, 79, 65, 84, 128, 83, 72, 197, 83, 72, 67, 72, 65, 128, 83, 72, 65, \r
+    89, 128, 83, 72, 65, 88, 128, 83, 72, 65, 86, 73, 89, 65, 78, 73, 128, \r
+    83, 72, 65, 86, 73, 65, 206, 83, 72, 65, 84, 128, 83, 72, 65, 82, 85, \r
+    128, 83, 72, 65, 82, 213, 83, 72, 65, 82, 80, 128, 83, 72, 65, 82, 208, \r
+    83, 72, 65, 82, 65, 128, 83, 72, 65, 82, 50, 128, 83, 72, 65, 82, 178, \r
+    83, 72, 65, 80, 73, 78, 71, 128, 83, 72, 65, 80, 69, 83, 128, 83, 72, 65, \r
+    80, 128, 83, 72, 65, 78, 71, 128, 83, 72, 65, 78, 128, 83, 72, 65, 206, \r
+    83, 72, 65, 77, 82, 79, 67, 75, 128, 83, 72, 65, 76, 83, 72, 69, 76, 69, \r
+    84, 128, 83, 72, 65, 75, 84, 73, 128, 83, 72, 65, 68, 79, 87, 69, 196, \r
+    83, 72, 65, 68, 69, 128, 83, 72, 65, 68, 68, 65, 128, 83, 72, 65, 68, 68, \r
+    193, 83, 72, 65, 68, 128, 83, 72, 65, 196, 83, 72, 65, 66, 54, 128, 83, \r
+    72, 65, 65, 128, 83, 72, 65, 54, 128, 83, 72, 65, 51, 128, 83, 72, 65, \r
+    179, 83, 71, 82, 193, 83, 71, 79, 210, 83, 71, 65, 215, 83, 71, 65, 194, \r
+    83, 71, 128, 83, 69, 88, 84, 85, 76, 193, 83, 69, 88, 84, 73, 76, 69, \r
+    128, 83, 69, 88, 84, 65, 78, 211, 83, 69, 86, 69, 82, 65, 78, 67, 69, \r
+    128, 83, 69, 86, 69, 78, 84, 89, 128, 83, 69, 86, 69, 78, 84, 217, 83, \r
+    69, 86, 69, 78, 84, 72, 128, 83, 69, 86, 69, 78, 84, 69, 69, 78, 128, 83, \r
+    69, 86, 69, 78, 84, 69, 69, 206, 83, 69, 86, 69, 206, 83, 69, 85, 88, \r
+    128, 83, 69, 83, 84, 69, 82, 84, 73, 85, 211, 83, 69, 83, 81, 85, 73, 81, \r
+    85, 65, 68, 82, 65, 84, 69, 128, 83, 69, 83, 65, 77, 197, 83, 69, 82, 86, \r
+    73, 67, 197, 83, 69, 82, 73, 70, 83, 128, 83, 69, 82, 73, 70, 211, 83, \r
+    69, 80, 84, 69, 77, 66, 69, 82, 128, 83, 69, 80, 65, 82, 65, 84, 79, 82, \r
+    128, 83, 69, 80, 65, 82, 65, 84, 79, 210, 83, 69, 78, 84, 79, 128, 83, \r
+    69, 78, 84, 73, 128, 83, 69, 77, 85, 78, 67, 73, 193, 83, 69, 77, 75, 65, \r
+    84, 72, 128, 83, 69, 77, 75, 128, 83, 69, 77, 73, 86, 79, 87, 69, 204, \r
+    83, 69, 77, 73, 83, 79, 70, 212, 83, 69, 77, 73, 83, 69, 88, 84, 73, 76, \r
+    69, 128, 83, 69, 77, 73, 77, 73, 78, 73, 77, 193, 83, 69, 77, 73, 68, 73, \r
+    82, 69, 67, 212, 83, 69, 77, 73, 67, 79, 76, 79, 78, 128, 83, 69, 77, 73, \r
+    67, 79, 76, 79, 206, 83, 69, 77, 73, 67, 73, 82, 67, 85, 76, 65, 210, 83, \r
+    69, 77, 73, 67, 73, 82, 67, 76, 197, 83, 69, 77, 73, 66, 82, 69, 86, 73, \r
+    211, 83, 69, 77, 73, 45, 86, 79, 73, 67, 69, 196, 83, 69, 76, 70, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 57, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 57, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 55, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 54, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 57, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 52, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 51, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 49, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 57, 48, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 57, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 56, 56, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 54, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 56, 53, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 51, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 56, 50, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 56, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 56, 48, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 55, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 56, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 55, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 53, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 50, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 55, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 55, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 54, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 55, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 54, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    54, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 52, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 54, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    54, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 54, 49, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 57, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, \r
+    55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 54, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, \r
+    52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 51, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, \r
+    49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 53, 48, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 57, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 56, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 54, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 53, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 51, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 50, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 48, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 52, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 56, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 55, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 53, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 52, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 50, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 49, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 51, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 55, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 50, 53, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 53, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 52, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 50, 53, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    50, 53, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 49, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 53, 48, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 57, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 56, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 50, 52, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    50, 52, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 53, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 52, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 50, 52, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, \r
+    50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 52, 49, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 50, 52, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 57, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 56, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 50, 51, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, \r
+    54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 53, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 50, 51, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 50, 51, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 50, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 51, 49, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 50, 51, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, \r
+    51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 57, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 50, 50, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 50, 50, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 54, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 53, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 50, 50, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, \r
+    50, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 50, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 50, 50, 49, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 50, 50, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 50, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 57, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 50, 49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, \r
+    49, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 54, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 50, 49, 53, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 50, 49, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 51, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 50, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 50, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    50, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 49, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 50, 48, 57, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 50, 48, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 55, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 54, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 50, 48, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    50, 48, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 51, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 50, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 50, 48, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, \r
+    48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 50, 48, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, \r
+    57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 56, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 57, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 57, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 53, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 52, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 57, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    57, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 57, 49, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 57, 48, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 57, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 56, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 56, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    56, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 53, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 56, 52, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 56, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 50, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 56, 49, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 49, 56, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 57, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 55, 56, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 55, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 54, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 53, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 49, 55, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 55, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 50, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 55, 49, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 49, 55, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 55, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 57, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 49, 54, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 54, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 54, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 53, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 49, 54, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, \r
+    51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 50, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 54, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 54, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 54, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 57, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 49, 53, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, \r
+    55, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 54, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 53, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 53, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 51, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 50, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 53, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    53, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 53, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 52, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 52, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 55, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 54, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 52, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    52, 52, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 51, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 52, 50, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 52, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 48, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 52, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 51, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    51, 56, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 55, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 51, 54, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 51, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 52, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 51, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 49, 51, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 51, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 48, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 50, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 56, \r
+    128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 55, 128, 83, 69, 76, 69, \r
+    67, 84, 79, 82, 45, 49, 50, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 50, 53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 52, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 51, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 49, 50, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, \r
+    49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 50, 48, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, \r
+    49, 49, 57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 56, 128, 83, \r
+    69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 55, 128, 83, 69, 76, 69, 67, 84, \r
+    79, 82, 45, 49, 49, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, \r
+    53, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 52, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 49, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 49, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 49, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 49, 48, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 49, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, \r
+    57, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 56, 128, 83, 69, 76, \r
+    69, 67, 84, 79, 82, 45, 49, 48, 55, 128, 83, 69, 76, 69, 67, 84, 79, 82, \r
+    45, 49, 48, 54, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 53, 128, \r
+    83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 52, 128, 83, 69, 76, 69, 67, \r
+    84, 79, 82, 45, 49, 48, 51, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, \r
+    48, 50, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 48, 49, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 82, 45, 49, 48, 48, 128, 83, 69, 76, 69, 67, 84, 79, \r
+    82, 45, 49, 48, 128, 83, 69, 76, 69, 67, 84, 79, 82, 45, 49, 128, 83, 69, \r
+    76, 69, 67, 84, 79, 210, 83, 69, 73, 83, 77, 65, 128, 83, 69, 73, 83, 77, \r
+    193, 83, 69, 72, 128, 83, 69, 71, 79, 76, 128, 83, 69, 71, 78, 79, 128, \r
+    83, 69, 71, 77, 69, 78, 84, 128, 83, 69, 69, 78, 85, 128, 83, 69, 69, 78, \r
+    128, 83, 69, 69, 206, 83, 69, 67, 84, 79, 82, 128, 83, 69, 67, 84, 73, \r
+    79, 78, 128, 83, 69, 67, 84, 73, 79, 206, 83, 69, 67, 82, 69, 84, 128, \r
+    83, 69, 67, 79, 78, 68, 128, 83, 69, 66, 65, 84, 66, 69, 73, 212, 83, 69, \r
+    65, 76, 128, 83, 69, 65, 71, 85, 76, 204, 83, 68, 79, 78, 199, 83, 68, \r
+    128, 83, 67, 87, 65, 128, 83, 67, 82, 85, 80, 76, 69, 128, 83, 67, 82, \r
+    73, 80, 84, 128, 83, 67, 82, 69, 69, 78, 128, 83, 67, 82, 69, 69, 206, \r
+    83, 67, 79, 82, 80, 73, 85, 83, 128, 83, 67, 73, 83, 83, 79, 82, 83, 128, \r
+    83, 67, 72, 87, 65, 128, 83, 67, 72, 87, 193, 83, 67, 72, 82, 79, 69, 68, \r
+    69, 82, 128, 83, 67, 72, 79, 79, 76, 128, 83, 67, 72, 79, 76, 65, 82, \r
+    128, 83, 67, 72, 69, 77, 193, 83, 67, 65, 78, 68, 73, 67, 85, 83, 128, \r
+    83, 67, 65, 78, 68, 73, 67, 85, 211, 83, 67, 65, 206, 83, 67, 65, 76, 69, \r
+    83, 128, 83, 66, 85, 194, 83, 66, 82, 85, 204, 83, 65, 89, 73, 83, 201, \r
+    83, 65, 89, 65, 78, 78, 65, 128, 83, 65, 89, 128, 83, 65, 88, 73, 77, 65, \r
+    84, 65, 128, 83, 65, 87, 65, 78, 128, 83, 65, 87, 128, 83, 65, 85, 73, \r
+    76, 128, 83, 65, 84, 85, 82, 78, 128, 83, 65, 84, 75, 65, 65, 78, 75, 85, \r
+    85, 128, 83, 65, 84, 75, 65, 65, 78, 128, 83, 65, 83, 65, 75, 128, 83, \r
+    65, 82, 73, 128, 83, 65, 82, 193, 83, 65, 82, 128, 83, 65, 80, 65, 128, \r
+    83, 65, 78, 89, 79, 79, 71, 193, 83, 65, 78, 89, 65, 75, 193, 83, 65, 78, \r
+    84, 73, 73, 77, 85, 128, 83, 65, 78, 78, 89, 65, 128, 83, 65, 78, 71, 65, \r
+    50, 128, 83, 65, 78, 65, 72, 128, 83, 65, 78, 128, 83, 65, 77, 89, 79, \r
+    203, 83, 65, 77, 80, 73, 128, 83, 65, 77, 80, 72, 65, 79, 128, 83, 65, \r
+    77, 75, 65, 128, 83, 65, 77, 69, 75, 72, 128, 83, 65, 77, 69, 75, 200, \r
+    83, 65, 77, 66, 65, 128, 83, 65, 77, 128, 83, 65, 76, 84, 73, 82, 69, \r
+    128, 83, 65, 76, 84, 73, 76, 76, 79, 128, 83, 65, 76, 84, 128, 83, 65, \r
+    76, 76, 65, 76, 76, 65, 72, 79, 213, 83, 65, 76, 76, 193, 83, 65, 76, 65, \r
+    205, 83, 65, 76, 65, 128, 83, 65, 76, 128, 83, 65, 75, 79, 84, 128, 83, \r
+    65, 74, 68, 65, 72, 128, 83, 65, 73, 76, 66, 79, 65, 84, 128, 83, 65, 73, \r
+    76, 128, 83, 65, 73, 75, 85, 82, 85, 128, 83, 65, 71, 73, 84, 84, 65, 82, \r
+    73, 85, 83, 128, 83, 65, 71, 65, 128, 83, 65, 71, 128, 83, 65, 199, 83, \r
+    65, 70, 72, 65, 128, 83, 65, 68, 72, 69, 128, 83, 65, 68, 69, 128, 83, \r
+    65, 68, 128, 83, 65, 196, 83, 65, 67, 82, 73, 70, 73, 67, 73, 65, 204, \r
+    83, 65, 65, 73, 128, 83, 65, 65, 68, 72, 85, 128, 83, 65, 45, 73, 128, \r
+    83, 48, 52, 54, 128, 83, 48, 52, 53, 128, 83, 48, 52, 52, 128, 83, 48, \r
+    52, 51, 128, 83, 48, 52, 50, 128, 83, 48, 52, 49, 128, 83, 48, 52, 48, \r
+    128, 83, 48, 51, 57, 128, 83, 48, 51, 56, 128, 83, 48, 51, 55, 128, 83, \r
+    48, 51, 54, 128, 83, 48, 51, 53, 65, 128, 83, 48, 51, 53, 128, 83, 48, \r
+    51, 52, 128, 83, 48, 51, 51, 128, 83, 48, 51, 50, 128, 83, 48, 51, 49, \r
+    128, 83, 48, 51, 48, 128, 83, 48, 50, 57, 128, 83, 48, 50, 56, 128, 83, \r
+    48, 50, 55, 128, 83, 48, 50, 54, 66, 128, 83, 48, 50, 54, 65, 128, 83, \r
+    48, 50, 54, 128, 83, 48, 50, 53, 128, 83, 48, 50, 52, 128, 83, 48, 50, \r
+    51, 128, 83, 48, 50, 50, 128, 83, 48, 50, 49, 128, 83, 48, 50, 48, 128, \r
+    83, 48, 49, 57, 128, 83, 48, 49, 56, 128, 83, 48, 49, 55, 65, 128, 83, \r
+    48, 49, 55, 128, 83, 48, 49, 54, 128, 83, 48, 49, 53, 128, 83, 48, 49, \r
+    52, 66, 128, 83, 48, 49, 52, 65, 128, 83, 48, 49, 52, 128, 83, 48, 49, \r
+    51, 128, 83, 48, 49, 50, 128, 83, 48, 49, 49, 128, 83, 48, 49, 48, 128, \r
+    83, 48, 48, 57, 128, 83, 48, 48, 56, 128, 83, 48, 48, 55, 128, 83, 48, \r
+    48, 54, 65, 128, 83, 48, 48, 54, 128, 83, 48, 48, 53, 128, 83, 48, 48, \r
+    52, 128, 83, 48, 48, 51, 128, 83, 48, 48, 50, 65, 128, 83, 48, 48, 50, \r
+    128, 83, 48, 48, 49, 128, 83, 45, 87, 128, 83, 45, 83, 72, 65, 80, 69, \r
+    196, 82, 89, 89, 128, 82, 89, 88, 128, 82, 89, 84, 128, 82, 89, 82, 88, \r
+    128, 82, 89, 82, 128, 82, 89, 80, 128, 82, 89, 65, 128, 82, 87, 79, 79, \r
+    128, 82, 87, 79, 128, 82, 87, 73, 73, 128, 82, 87, 73, 128, 82, 87, 69, \r
+    69, 128, 82, 87, 69, 128, 82, 87, 65, 72, 65, 128, 82, 87, 65, 65, 128, \r
+    82, 87, 65, 128, 82, 85, 88, 128, 82, 85, 85, 66, 85, 82, 85, 128, 82, \r
+    85, 84, 128, 82, 85, 83, 73, 128, 82, 85, 82, 88, 128, 82, 85, 82, 128, \r
+    82, 85, 80, 73, 73, 128, 82, 85, 80, 69, 197, 82, 85, 80, 128, 82, 85, \r
+    79, 88, 128, 82, 85, 79, 80, 128, 82, 85, 79, 128, 82, 85, 78, 79, 85, \r
+    84, 128, 82, 85, 78, 128, 82, 85, 77, 201, 82, 85, 77, 65, 201, 82, 85, \r
+    77, 128, 82, 85, 205, 82, 85, 76, 69, 45, 68, 69, 76, 65, 89, 69, 68, \r
+    128, 82, 85, 76, 69, 128, 82, 85, 75, 75, 65, 75, 72, 65, 128, 82, 85, \r
+    73, 83, 128, 82, 85, 194, 82, 85, 65, 128, 82, 84, 72, 65, 78, 199, 82, \r
+    84, 65, 71, 83, 128, 82, 84, 65, 71, 211, 82, 82, 89, 88, 128, 82, 82, \r
+    89, 84, 128, 82, 82, 89, 82, 88, 128, 82, 82, 89, 82, 128, 82, 82, 89, \r
+    80, 128, 82, 82, 89, 128, 82, 82, 85, 88, 128, 82, 82, 85, 84, 128, 82, \r
+    82, 85, 82, 88, 128, 82, 82, 85, 82, 128, 82, 82, 85, 80, 128, 82, 82, \r
+    85, 79, 88, 128, 82, 82, 85, 79, 128, 82, 82, 85, 128, 82, 82, 79, 88, \r
+    128, 82, 82, 79, 84, 128, 82, 82, 79, 80, 128, 82, 82, 79, 128, 82, 82, \r
+    69, 88, 128, 82, 82, 69, 84, 128, 82, 82, 69, 80, 128, 82, 82, 69, 72, \r
+    128, 82, 82, 69, 200, 82, 82, 69, 128, 82, 82, 65, 88, 128, 82, 82, 65, \r
+    128, 82, 79, 85, 78, 68, 69, 196, 82, 79, 85, 78, 68, 45, 84, 73, 80, 80, \r
+    69, 196, 82, 79, 84, 85, 78, 68, 65, 128, 82, 79, 84, 65, 84, 69, 196, \r
+    82, 79, 83, 72, 128, 82, 79, 83, 69, 84, 84, 69, 128, 82, 79, 79, 84, \r
+    128, 82, 79, 79, 75, 128, 82, 79, 79, 70, 128, 82, 79, 79, 128, 82, 79, \r
+    77, 65, 206, 82, 79, 196, 82, 79, 67, 128, 82, 79, 66, 65, 84, 128, 82, \r
+    79, 65, 82, 128, 82, 79, 65, 128, 82, 78, 89, 73, 78, 199, 82, 78, 79, \r
+    79, 78, 128, 82, 78, 79, 79, 206, 82, 78, 65, 205, 82, 74, 69, 211, 82, \r
+    74, 69, 128, 82, 74, 197, 82, 73, 86, 69, 82, 128, 82, 73, 84, 85, 65, \r
+    76, 128, 82, 73, 84, 84, 79, 82, 85, 128, 82, 73, 84, 83, 73, 128, 82, \r
+    73, 83, 73, 78, 199, 82, 73, 83, 72, 128, 82, 73, 82, 65, 128, 82, 73, \r
+    80, 128, 82, 73, 78, 71, 211, 82, 73, 78, 70, 79, 82, 90, 65, 78, 68, 79, \r
+    128, 82, 73, 206, 82, 73, 75, 82, 73, 75, 128, 82, 73, 73, 128, 82, 73, \r
+    71, 86, 69, 68, 73, 195, 82, 73, 71, 72, 84, 87, 65, 82, 68, 83, 128, 82, \r
+    73, 71, 72, 84, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 84, 79, 45, 76, \r
+    69, 70, 212, 82, 73, 71, 72, 84, 45, 83, 73, 68, 197, 82, 73, 71, 72, 84, \r
+    45, 83, 72, 65, 68, 79, 87, 69, 196, 82, 73, 71, 72, 84, 45, 83, 72, 65, \r
+    68, 69, 196, 82, 73, 71, 72, 84, 45, 80, 79, 73, 78, 84, 73, 78, 199, 82, \r
+    73, 71, 72, 84, 45, 72, 65, 78, 196, 82, 73, 71, 72, 84, 45, 70, 65, 67, \r
+    73, 78, 199, 82, 73, 71, 72, 84, 128, 82, 73, 69, 85, 76, 45, 89, 69, 83, \r
+    73, 69, 85, 78, 71, 128, 82, 73, 69, 85, 76, 45, 89, 69, 79, 82, 73, 78, \r
+    72, 73, 69, 85, 72, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, \r
+    89, 69, 79, 82, 73, 78, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, \r
+    84, 73, 75, 69, 85, 84, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, \r
+    45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 84, 72, 73, 69, \r
+    85, 84, 72, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 84, 73, 75, \r
+    69, 85, 84, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 83, 73, 79, \r
+    83, 128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, \r
+    128, 82, 73, 69, 85, 76, 45, 83, 83, 65, 78, 71, 75, 73, 89, 69, 79, 75, \r
+    128, 82, 73, 69, 85, 76, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, \r
+    80, 73, 69, 85, 80, 45, 84, 73, 75, 69, 85, 84, 128, 82, 73, 69, 85, 76, \r
+    45, 80, 73, 69, 85, 80, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, \r
+    80, 73, 69, 85, 80, 45, 80, 72, 73, 69, 85, 80, 72, 128, 82, 73, 69, 85, \r
+    76, 45, 80, 73, 69, 85, 80, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, \r
+    76, 45, 80, 73, 69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 80, 72, 73, 69, \r
+    85, 80, 72, 128, 82, 73, 69, 85, 76, 45, 80, 65, 78, 83, 73, 79, 83, 128, \r
+    82, 73, 69, 85, 76, 45, 78, 73, 69, 85, 78, 128, 82, 73, 69, 85, 76, 45, \r
+    77, 73, 69, 85, 77, 45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 77, \r
+    73, 69, 85, 77, 45, 75, 73, 89, 69, 79, 75, 128, 82, 73, 69, 85, 76, 45, \r
+    77, 73, 69, 85, 77, 45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, \r
+    77, 73, 69, 85, 77, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, \r
+    45, 83, 73, 79, 83, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, 75, \r
+    45, 72, 73, 69, 85, 72, 128, 82, 73, 69, 85, 76, 45, 75, 73, 89, 69, 79, \r
+    75, 128, 82, 73, 69, 85, 76, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, \r
+    69, 85, 80, 128, 82, 73, 69, 85, 76, 45, 72, 73, 69, 85, 72, 128, 82, 73, \r
+    69, 85, 76, 45, 67, 73, 69, 85, 67, 128, 82, 73, 69, 85, 204, 82, 73, 69, \r
+    76, 128, 82, 73, 69, 69, 128, 82, 73, 67, 69, 77, 128, 82, 73, 67, 69, \r
+    128, 82, 73, 65, 204, 82, 72, 79, 84, 73, 195, 82, 72, 79, 128, 82, 72, \r
+    207, 82, 72, 65, 128, 82, 71, 89, 73, 78, 71, 83, 128, 82, 71, 89, 65, \r
+    78, 128, 82, 71, 89, 193, 82, 69, 86, 79, 76, 85, 84, 73, 79, 78, 128, \r
+    82, 69, 86, 77, 65, 128, 82, 69, 86, 73, 65, 128, 82, 69, 86, 69, 82, 83, \r
+    69, 68, 128, 82, 69, 86, 69, 82, 83, 197, 82, 69, 85, 88, 128, 82, 69, \r
+    84, 85, 82, 78, 128, 82, 69, 84, 85, 82, 206, 82, 69, 84, 82, 79, 70, 76, \r
+    69, 216, 82, 69, 84, 82, 69, 65, 84, 128, 82, 69, 83, 85, 80, 73, 78, 85, \r
+    83, 128, 82, 69, 83, 84, 82, 73, 67, 84, 69, 196, 82, 69, 83, 84, 128, \r
+    82, 69, 83, 80, 79, 78, 83, 69, 128, 82, 69, 83, 79, 85, 82, 67, 69, 128, \r
+    82, 69, 83, 79, 76, 85, 84, 73, 79, 78, 128, 82, 69, 83, 73, 83, 84, 65, \r
+    78, 67, 69, 128, 82, 69, 83, 73, 68, 69, 78, 67, 69, 128, 82, 69, 83, \r
+    200, 82, 69, 82, 69, 78, 71, 71, 65, 78, 128, 82, 69, 82, 69, 75, 65, 78, \r
+    128, 82, 69, 80, 82, 69, 83, 69, 78, 84, 128, 82, 69, 80, 76, 65, 67, 69, \r
+    77, 69, 78, 212, 82, 69, 80, 69, 65, 84, 69, 196, 82, 69, 80, 69, 65, 84, \r
+    128, 82, 69, 80, 69, 65, 212, 82, 69, 80, 65, 128, 82, 69, 80, 193, 82, \r
+    69, 78, 84, 79, 71, 69, 78, 128, 82, 69, 78, 128, 82, 69, 77, 85, 128, \r
+    82, 69, 76, 73, 71, 73, 79, 78, 128, 82, 69, 76, 69, 65, 83, 69, 128, 82, \r
+    69, 76, 65, 84, 73, 79, 78, 65, 204, 82, 69, 76, 65, 84, 73, 79, 78, 128, \r
+    82, 69, 76, 65, 65, 128, 82, 69, 74, 65, 78, 199, 82, 69, 73, 196, 82, \r
+    69, 71, 73, 83, 84, 69, 82, 69, 196, 82, 69, 70, 69, 82, 69, 78, 67, 197, \r
+    82, 69, 68, 85, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 82, 69, 67, 89, \r
+    67, 76, 73, 78, 199, 82, 69, 67, 89, 67, 76, 69, 196, 82, 69, 67, 84, 73, \r
+    76, 73, 78, 69, 65, 210, 82, 69, 67, 84, 65, 78, 71, 85, 76, 65, 210, 82, \r
+    69, 67, 84, 65, 78, 71, 76, 69, 128, 82, 69, 67, 84, 65, 78, 71, 76, 197, \r
+    82, 69, 67, 79, 82, 68, 73, 78, 199, 82, 69, 67, 79, 82, 68, 69, 82, 128, \r
+    82, 69, 67, 79, 82, 196, 82, 69, 67, 69, 80, 84, 73, 86, 197, 82, 69, 65, \r
+    72, 77, 85, 75, 128, 82, 69, 65, 67, 72, 128, 82, 68, 207, 82, 68, 69, \r
+    204, 82, 66, 65, 83, 193, 82, 65, 89, 83, 128, 82, 65, 89, 65, 78, 78, \r
+    65, 128, 82, 65, 89, 128, 82, 65, 84, 73, 79, 128, 82, 65, 84, 72, 65, \r
+    128, 82, 65, 84, 72, 193, 82, 65, 84, 65, 128, 82, 65, 84, 128, 82, 65, \r
+    83, 87, 65, 68, 73, 128, 82, 65, 83, 79, 85, 204, 82, 65, 83, 72, 65, \r
+    128, 82, 65, 80, 73, 83, 77, 65, 128, 82, 65, 78, 71, 197, 82, 65, 78, \r
+    65, 128, 82, 65, 78, 128, 82, 65, 77, 211, 82, 65, 77, 66, 65, 84, 128, \r
+    82, 65, 77, 128, 82, 65, 75, 72, 65, 78, 71, 128, 82, 65, 73, 83, 69, \r
+    196, 82, 65, 73, 78, 128, 82, 65, 73, 206, 82, 65, 73, 68, 207, 82, 65, \r
+    73, 68, 65, 128, 82, 65, 73, 128, 82, 65, 72, 77, 65, 84, 85, 76, 76, 65, \r
+    200, 82, 65, 70, 69, 128, 82, 65, 69, 128, 82, 65, 68, 73, 79, 65, 67, \r
+    84, 73, 86, 197, 82, 65, 68, 201, 82, 65, 68, 128, 82, 65, 196, 82, 65, \r
+    66, 128, 82, 65, 65, 73, 128, 82, 65, 65, 128, 82, 65, 51, 128, 82, 65, \r
+    50, 128, 82, 48, 50, 57, 128, 82, 48, 50, 56, 128, 82, 48, 50, 55, 128, \r
+    82, 48, 50, 54, 128, 82, 48, 50, 53, 128, 82, 48, 50, 52, 128, 82, 48, \r
+    50, 51, 128, 82, 48, 50, 50, 128, 82, 48, 50, 49, 128, 82, 48, 50, 48, \r
+    128, 82, 48, 49, 57, 128, 82, 48, 49, 56, 128, 82, 48, 49, 55, 128, 82, \r
+    48, 49, 54, 65, 128, 82, 48, 49, 54, 128, 82, 48, 49, 53, 128, 82, 48, \r
+    49, 52, 128, 82, 48, 49, 51, 128, 82, 48, 49, 50, 128, 82, 48, 49, 49, \r
+    128, 82, 48, 49, 48, 65, 128, 82, 48, 49, 48, 128, 82, 48, 48, 57, 128, \r
+    82, 48, 48, 56, 128, 82, 48, 48, 55, 128, 82, 48, 48, 54, 128, 82, 48, \r
+    48, 53, 128, 82, 48, 48, 52, 128, 82, 48, 48, 51, 66, 128, 82, 48, 48, \r
+    51, 65, 128, 82, 48, 48, 51, 128, 82, 48, 48, 50, 65, 128, 82, 48, 48, \r
+    50, 128, 82, 48, 48, 49, 128, 82, 45, 67, 82, 69, 197, 81, 89, 88, 128, \r
+    81, 89, 85, 128, 81, 89, 84, 128, 81, 89, 82, 88, 128, 81, 89, 82, 128, \r
+    81, 89, 80, 128, 81, 89, 79, 128, 81, 89, 73, 128, 81, 89, 69, 69, 128, \r
+    81, 89, 69, 128, 81, 89, 65, 65, 128, 81, 89, 65, 128, 81, 89, 128, 81, \r
+    87, 73, 128, 81, 87, 69, 69, 128, 81, 87, 69, 128, 81, 87, 65, 65, 128, \r
+    81, 87, 65, 128, 81, 85, 88, 128, 81, 85, 86, 128, 81, 85, 85, 86, 128, \r
+    81, 85, 85, 128, 81, 85, 84, 128, 81, 85, 83, 72, 83, 72, 65, 89, 65, \r
+    128, 81, 85, 82, 88, 128, 81, 85, 82, 128, 81, 85, 80, 128, 81, 85, 79, \r
+    88, 128, 81, 85, 79, 84, 197, 81, 85, 79, 84, 65, 84, 73, 79, 206, 81, \r
+    85, 79, 84, 128, 81, 85, 79, 80, 128, 81, 85, 79, 128, 81, 85, 75, 128, \r
+    81, 85, 73, 78, 68, 73, 67, 69, 83, 73, 77, 193, 81, 85, 73, 78, 67, 85, \r
+    78, 88, 128, 81, 85, 73, 78, 65, 82, 73, 85, 211, 81, 85, 73, 76, 76, \r
+    128, 81, 85, 73, 128, 81, 85, 70, 128, 81, 85, 69, 83, 84, 73, 79, 78, \r
+    69, 196, 81, 85, 69, 83, 84, 73, 79, 78, 128, 81, 85, 69, 83, 84, 73, 79, \r
+    206, 81, 85, 69, 69, 78, 128, 81, 85, 69, 128, 81, 85, 66, 85, 84, 83, \r
+    128, 81, 85, 65, 84, 69, 82, 78, 73, 79, 206, 81, 85, 65, 82, 84, 69, 82, \r
+    83, 128, 81, 85, 65, 82, 84, 69, 82, 211, 81, 85, 65, 82, 84, 69, 82, \r
+    128, 81, 85, 65, 82, 84, 69, 210, 81, 85, 65, 78, 84, 73, 84, 217, 81, \r
+    85, 65, 68, 82, 85, 80, 76, 197, 81, 85, 65, 68, 82, 65, 78, 84, 128, 81, \r
+    85, 65, 68, 82, 65, 78, 212, 81, 85, 65, 68, 128, 81, 85, 65, 196, 81, \r
+    85, 65, 128, 81, 85, 128, 81, 208, 81, 79, 88, 128, 81, 79, 84, 128, 81, \r
+    79, 80, 72, 128, 81, 79, 80, 65, 128, 81, 79, 80, 128, 81, 79, 79, 128, \r
+    81, 79, 207, 81, 79, 70, 128, 81, 79, 198, 81, 79, 65, 128, 81, 79, 128, \r
+    81, 78, 128, 81, 73, 88, 128, 81, 73, 84, 83, 65, 128, 81, 73, 84, 128, \r
+    81, 73, 80, 128, 81, 73, 73, 128, 81, 73, 69, 88, 128, 81, 73, 69, 84, \r
+    128, 81, 73, 69, 80, 128, 81, 73, 69, 128, 81, 73, 128, 81, 72, 87, 73, \r
+    128, 81, 72, 87, 69, 69, 128, 81, 72, 87, 69, 128, 81, 72, 87, 65, 65, \r
+    128, 81, 72, 87, 65, 128, 81, 72, 85, 128, 81, 72, 79, 128, 81, 72, 73, \r
+    128, 81, 72, 69, 69, 128, 81, 72, 69, 128, 81, 72, 65, 65, 128, 81, 72, \r
+    65, 128, 81, 69, 84, 65, 78, 65, 128, 81, 69, 69, 128, 81, 69, 128, 81, \r
+    65, 85, 128, 81, 65, 84, 65, 78, 128, 81, 65, 82, 78, 69, 217, 81, 65, \r
+    82, 128, 81, 65, 81, 128, 81, 65, 80, 72, 128, 81, 65, 77, 65, 84, 83, \r
+    128, 81, 65, 77, 65, 84, 211, 81, 65, 76, 193, 81, 65, 73, 82, 84, 72, \r
+    82, 65, 128, 81, 65, 73, 128, 81, 65, 70, 128, 81, 65, 198, 81, 65, 68, \r
+    77, 65, 128, 81, 65, 65, 73, 128, 81, 65, 65, 70, 85, 128, 81, 65, 65, \r
+    70, 128, 81, 48, 48, 55, 128, 81, 48, 48, 54, 128, 81, 48, 48, 53, 128, \r
+    81, 48, 48, 52, 128, 81, 48, 48, 51, 128, 81, 48, 48, 50, 128, 81, 48, \r
+    48, 49, 128, 209, 80, 90, 128, 80, 89, 88, 128, 80, 89, 84, 128, 80, 89, \r
+    82, 88, 128, 80, 89, 82, 128, 80, 89, 80, 128, 80, 89, 128, 80, 87, 79, \r
+    89, 128, 80, 87, 79, 79, 128, 80, 87, 79, 128, 80, 87, 207, 80, 87, 73, \r
+    73, 128, 80, 87, 73, 128, 80, 87, 69, 69, 128, 80, 87, 69, 128, 80, 87, \r
+    65, 65, 128, 80, 87, 128, 80, 86, 128, 80, 85, 88, 128, 80, 85, 84, 128, \r
+    80, 85, 83, 72, 80, 73, 75, 65, 128, 80, 85, 83, 72, 73, 78, 199, 80, 85, \r
+    82, 88, 128, 80, 85, 82, 73, 84, 89, 128, 80, 85, 82, 128, 80, 85, 80, \r
+    128, 80, 85, 79, 88, 128, 80, 85, 79, 80, 128, 80, 85, 79, 128, 80, 85, \r
+    78, 71, 128, 80, 85, 78, 67, 84, 85, 65, 84, 73, 79, 78, 128, 80, 85, 78, \r
+    67, 84, 85, 65, 84, 73, 79, 206, 80, 85, 77, 80, 128, 80, 85, 69, 128, \r
+    80, 85, 65, 69, 128, 80, 85, 50, 128, 80, 85, 128, 80, 84, 72, 65, 72, \r
+    193, 80, 84, 69, 128, 80, 83, 73, 70, 73, 83, 84, 79, 83, 89, 78, 65, 71, \r
+    77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 80, 65, 82, 65, 75, 65, 76, \r
+    69, 83, 77, 65, 128, 80, 83, 73, 70, 73, 83, 84, 79, 206, 80, 83, 73, 70, \r
+    73, 83, 84, 79, 76, 89, 71, 73, 83, 77, 65, 128, 80, 83, 73, 128, 80, 83, \r
+    128, 80, 82, 79, 86, 69, 128, 80, 82, 79, 84, 79, 86, 65, 82, 89, 211, \r
+    80, 82, 79, 84, 79, 211, 80, 82, 79, 83, 71, 69, 71, 82, 65, 77, 77, 69, \r
+    78, 73, 128, 80, 82, 79, 80, 79, 82, 84, 73, 79, 78, 65, 204, 80, 82, 79, \r
+    80, 79, 82, 84, 73, 79, 78, 128, 80, 82, 79, 80, 69, 82, 84, 217, 80, 82, \r
+    79, 80, 69, 76, 76, 69, 210, 80, 82, 79, 79, 70, 128, 80, 82, 79, 76, 79, \r
+    78, 71, 69, 196, 80, 82, 79, 76, 65, 84, 73, 79, 78, 197, 80, 82, 79, 74, \r
+    69, 67, 84, 73, 86, 69, 128, 80, 82, 79, 74, 69, 67, 84, 73, 79, 78, 128, \r
+    80, 82, 79, 71, 82, 69, 83, 83, 128, 80, 82, 79, 70, 79, 85, 78, 68, 128, \r
+    80, 82, 79, 68, 85, 67, 84, 128, 80, 82, 79, 68, 85, 67, 212, 80, 82, 73, \r
+    86, 65, 84, 69, 128, 80, 82, 73, 83, 72, 84, 72, 65, 77, 65, 84, 82, 193, \r
+    80, 82, 73, 78, 84, 128, 80, 82, 73, 78, 212, 80, 82, 73, 77, 69, 128, \r
+    80, 82, 73, 77, 197, 80, 82, 69, 86, 73, 79, 85, 211, 80, 82, 69, 83, 69, \r
+    78, 84, 65, 84, 73, 79, 206, 80, 82, 69, 83, 67, 82, 73, 80, 84, 73, 79, \r
+    206, 80, 82, 69, 80, 79, 78, 68, 69, 82, 65, 78, 67, 69, 128, 80, 82, 69, \r
+    78, 75, 72, 65, 128, 80, 82, 69, 70, 65, 67, 197, 80, 82, 69, 67, 69, 68, \r
+    73, 78, 199, 80, 82, 69, 67, 69, 68, 69, 83, 128, 80, 82, 69, 67, 69, 68, \r
+    69, 211, 80, 82, 69, 67, 69, 68, 69, 196, 80, 82, 69, 67, 69, 68, 69, \r
+    128, 80, 82, 69, 67, 69, 68, 197, 80, 82, 65, 77, 45, 80, 73, 73, 128, \r
+    80, 82, 65, 77, 45, 80, 73, 201, 80, 82, 65, 77, 45, 77, 85, 79, 89, 128, \r
+    80, 82, 65, 77, 45, 77, 85, 79, 217, 80, 82, 65, 77, 45, 66, 85, 79, 78, \r
+    128, 80, 82, 65, 77, 45, 66, 85, 79, 206, 80, 82, 65, 77, 45, 66, 69, 73, \r
+    128, 80, 82, 65, 77, 45, 66, 69, 201, 80, 82, 65, 77, 128, 80, 82, 65, \r
+    205, 80, 82, 128, 80, 80, 86, 128, 80, 80, 77, 128, 80, 80, 65, 128, 80, \r
+    79, 89, 128, 80, 79, 88, 128, 80, 79, 87, 69, 82, 211, 80, 79, 87, 69, \r
+    82, 128, 80, 79, 85, 78, 196, 80, 79, 83, 84, 80, 79, 83, 73, 84, 73, 79, \r
+    206, 80, 79, 83, 84, 65, 204, 80, 79, 83, 83, 69, 83, 83, 73, 79, 78, \r
+    128, 80, 79, 82, 82, 69, 67, 84, 85, 83, 128, 80, 79, 82, 82, 69, 67, 84, \r
+    85, 211, 80, 79, 80, 128, 80, 79, 208, 80, 79, 79, 128, 80, 79, 78, 68, \r
+    79, 128, 80, 79, 76, 201, 80, 79, 76, 69, 128, 80, 79, 75, 82, 89, 84, \r
+    73, 69, 128, 80, 79, 75, 79, 74, 73, 128, 80, 79, 73, 78, 84, 79, 128, \r
+    80, 79, 73, 78, 84, 69, 82, 128, 80, 79, 73, 78, 84, 69, 196, 80, 79, 73, \r
+    78, 84, 128, 80, 79, 73, 78, 212, 80, 79, 69, 84, 82, 217, 80, 79, 69, \r
+    84, 73, 195, 80, 79, 68, 65, 84, 85, 83, 128, 80, 79, 65, 128, 80, 79, \r
+    128, 80, 207, 80, 78, 69, 85, 77, 65, 84, 65, 128, 80, 76, 85, 84, 79, \r
+    128, 80, 76, 85, 83, 45, 77, 73, 78, 85, 211, 80, 76, 85, 83, 128, 80, \r
+    76, 85, 77, 69, 196, 80, 76, 85, 77, 128, 80, 76, 85, 75, 128, 80, 76, \r
+    79, 87, 128, 80, 76, 79, 80, 72, 85, 128, 80, 76, 69, 84, 72, 82, 79, 78, \r
+    128, 80, 76, 65, 83, 84, 73, 67, 83, 128, 80, 76, 65, 78, 69, 128, 80, \r
+    76, 65, 78, 197, 80, 76, 65, 78, 67, 203, 80, 76, 65, 75, 128, 80, 76, \r
+    65, 71, 73, 79, 211, 80, 76, 65, 67, 69, 72, 79, 76, 68, 69, 210, 80, 76, \r
+    65, 67, 197, 80, 76, 65, 128, 80, 73, 90, 90, 73, 67, 65, 84, 79, 128, \r
+    80, 73, 88, 128, 80, 73, 87, 82, 128, 80, 73, 84, 67, 72, 70, 79, 82, 75, \r
+    128, 80, 73, 84, 67, 72, 70, 79, 82, 203, 80, 73, 84, 128, 80, 73, 83, \r
+    69, 76, 69, 72, 128, 80, 73, 83, 67, 69, 83, 128, 80, 73, 82, 73, 71, \r
+    128, 80, 73, 82, 73, 199, 80, 73, 80, 73, 78, 71, 128, 80, 73, 80, 128, \r
+    80, 73, 78, 87, 72, 69, 69, 204, 80, 73, 76, 67, 82, 79, 215, 80, 73, 75, \r
+    85, 82, 85, 128, 80, 73, 75, 79, 128, 80, 73, 71, 128, 80, 73, 69, 88, \r
+    128, 80, 73, 69, 85, 80, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, \r
+    85, 80, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 80, 73, 69, 85, 80, \r
+    45, 83, 73, 79, 83, 45, 84, 73, 75, 69, 85, 84, 128, 80, 73, 69, 85, 80, \r
+    45, 83, 73, 79, 83, 45, 84, 72, 73, 69, 85, 84, 72, 128, 80, 73, 69, 85, \r
+    80, 45, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 73, 69, 85, 80, \r
+    45, 83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 80, 73, 69, 85, 80, \r
+    45, 83, 73, 79, 83, 45, 67, 73, 69, 85, 67, 128, 80, 73, 69, 85, 80, 45, \r
+    82, 73, 69, 85, 76, 45, 80, 72, 73, 69, 85, 80, 72, 128, 80, 73, 69, 85, \r
+    80, 45, 82, 73, 69, 85, 76, 128, 80, 73, 69, 85, 80, 45, 78, 73, 69, 85, \r
+    78, 128, 80, 73, 69, 85, 80, 45, 77, 73, 69, 85, 77, 128, 80, 73, 69, 85, \r
+    80, 45, 75, 72, 73, 69, 85, 75, 72, 128, 80, 73, 69, 85, 80, 45, 67, 73, \r
+    69, 85, 67, 128, 80, 73, 69, 85, 80, 45, 67, 72, 73, 69, 85, 67, 72, 128, \r
+    80, 73, 69, 85, 208, 80, 73, 69, 80, 128, 80, 73, 69, 67, 69, 128, 80, \r
+    73, 69, 128, 80, 73, 67, 75, 128, 80, 73, 65, 83, 85, 84, 79, 82, 85, \r
+    128, 80, 73, 65, 83, 77, 193, 80, 73, 65, 78, 79, 128, 80, 201, 80, 72, \r
+    87, 65, 128, 80, 72, 85, 84, 72, 65, 79, 128, 80, 72, 85, 210, 80, 72, \r
+    85, 78, 71, 128, 80, 72, 82, 65, 83, 69, 128, 80, 72, 79, 69, 78, 73, 67, \r
+    73, 65, 206, 80, 72, 79, 65, 128, 80, 72, 79, 128, 80, 72, 207, 80, 72, \r
+    78, 65, 69, 203, 80, 72, 73, 78, 84, 72, 85, 128, 80, 72, 73, 76, 73, 80, \r
+    80, 73, 78, 197, 80, 72, 73, 69, 85, 80, 72, 45, 84, 72, 73, 69, 85, 84, \r
+    72, 128, 80, 72, 73, 69, 85, 80, 72, 45, 83, 73, 79, 83, 128, 80, 72, 73, \r
+    69, 85, 80, 72, 45, 80, 73, 69, 85, 80, 128, 80, 72, 73, 69, 85, 80, 72, \r
+    45, 72, 73, 69, 85, 72, 128, 80, 72, 73, 69, 85, 80, 200, 80, 72, 73, \r
+    128, 80, 72, 201, 80, 72, 69, 69, 128, 80, 72, 69, 128, 80, 72, 65, 82, \r
+    89, 78, 71, 69, 65, 204, 80, 72, 65, 82, 128, 80, 72, 65, 78, 128, 80, \r
+    72, 65, 77, 128, 80, 72, 65, 73, 83, 84, 79, 211, 80, 72, 65, 71, 83, 45, \r
+    80, 193, 80, 72, 65, 65, 82, 75, 65, 65, 128, 80, 72, 65, 65, 128, 80, \r
+    72, 65, 128, 80, 71, 128, 80, 70, 128, 80, 69, 85, 88, 128, 80, 69, 84, \r
+    65, 83, 84, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 80, 69, 84, 65, 83, \r
+    84, 73, 128, 80, 69, 84, 65, 83, 77, 65, 128, 80, 69, 84, 65, 76, 76, 69, \r
+    196, 80, 69, 83, 79, 128, 80, 69, 83, 207, 80, 69, 83, 72, 50, 128, 80, \r
+    69, 83, 69, 84, 193, 80, 69, 211, 80, 69, 82, 84, 72, 207, 80, 69, 82, \r
+    83, 80, 69, 67, 84, 73, 86, 69, 128, 80, 69, 82, 83, 79, 78, 128, 80, 69, \r
+    82, 83, 79, 206, 80, 69, 82, 83, 73, 65, 206, 80, 69, 82, 80, 69, 78, 68, \r
+    73, 67, 85, 76, 65, 82, 128, 80, 69, 82, 80, 69, 78, 68, 73, 67, 85, 76, \r
+    65, 210, 80, 69, 82, 77, 65, 78, 69, 78, 212, 80, 69, 82, 73, 83, 80, 79, \r
+    77, 69, 78, 73, 128, 80, 69, 82, 73, 83, 80, 79, 77, 69, 78, 201, 80, 69, \r
+    82, 70, 69, 67, 84, 85, 205, 80, 69, 82, 70, 69, 67, 84, 65, 128, 80, 69, \r
+    82, 70, 69, 67, 84, 193, 80, 69, 82, 67, 85, 83, 83, 73, 86, 69, 128, 80, \r
+    69, 82, 67, 69, 78, 212, 80, 69, 80, 69, 84, 128, 80, 69, 80, 69, 212, \r
+    80, 69, 79, 82, 84, 200, 80, 69, 78, 84, 65, 83, 69, 77, 69, 128, 80, 69, \r
+    78, 84, 65, 71, 79, 78, 128, 80, 69, 78, 83, 85, 128, 80, 69, 78, 78, \r
+    217, 80, 69, 78, 73, 72, 73, 128, 80, 69, 78, 71, 75, 65, 76, 128, 80, \r
+    69, 78, 69, 84, 82, 65, 84, 73, 79, 78, 128, 80, 69, 78, 67, 73, 76, 128, \r
+    80, 69, 76, 65, 83, 84, 79, 78, 128, 80, 69, 76, 65, 83, 84, 79, 206, 80, \r
+    69, 73, 84, 72, 128, 80, 69, 72, 69, 72, 128, 80, 69, 72, 69, 200, 80, \r
+    69, 72, 128, 80, 69, 200, 80, 69, 69, 90, 73, 128, 80, 69, 69, 80, 128, \r
+    80, 69, 69, 128, 80, 69, 68, 69, 83, 84, 82, 73, 65, 78, 128, 80, 69, 68, \r
+    69, 83, 84, 65, 76, 128, 80, 69, 68, 69, 83, 84, 65, 204, 80, 69, 68, 65, \r
+    204, 80, 69, 65, 67, 69, 128, 80, 69, 65, 67, 197, 80, 68, 128, 80, 67, \r
+    128, 80, 65, 90, 69, 82, 128, 80, 65, 89, 69, 82, 79, 75, 128, 80, 65, \r
+    89, 65, 78, 78, 65, 128, 80, 65, 89, 128, 80, 65, 88, 128, 80, 65, 87, \r
+    78, 128, 80, 65, 215, 80, 65, 86, 73, 89, 65, 78, 73, 128, 80, 65, 84, \r
+    84, 69, 82, 78, 128, 80, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 80, 65, \r
+    84, 200, 80, 65, 84, 65, 75, 128, 80, 65, 84, 65, 72, 128, 80, 65, 84, \r
+    128, 80, 65, 83, 85, 81, 128, 80, 65, 83, 83, 73, 86, 69, 45, 80, 85, 76, \r
+    76, 45, 85, 80, 45, 79, 85, 84, 80, 85, 212, 80, 65, 83, 83, 73, 86, 69, \r
+    45, 80, 85, 76, 76, 45, 68, 79, 87, 78, 45, 79, 85, 84, 80, 85, 212, 80, \r
+    65, 83, 72, 84, 65, 128, 80, 65, 83, 69, 81, 128, 80, 65, 82, 84, 78, 69, \r
+    82, 83, 72, 73, 208, 80, 65, 82, 84, 73, 65, 76, 76, 89, 45, 82, 69, 67, \r
+    89, 67, 76, 69, 196, 80, 65, 82, 84, 73, 65, 204, 80, 65, 82, 84, 72, 73, \r
+    65, 206, 80, 65, 82, 212, 80, 65, 82, 73, 67, 72, 79, 78, 128, 80, 65, \r
+    82, 69, 83, 84, 73, 71, 77, 69, 78, 79, 206, 80, 65, 82, 69, 82, 69, 78, \r
+    128, 80, 65, 82, 69, 78, 84, 72, 69, 83, 73, 83, 128, 80, 65, 82, 69, 78, \r
+    84, 72, 69, 83, 73, 211, 80, 65, 82, 65, 80, 72, 82, 65, 83, 197, 80, 65, \r
+    82, 65, 76, 76, 69, 76, 79, 71, 82, 65, 77, 128, 80, 65, 82, 65, 76, 76, \r
+    69, 76, 128, 80, 65, 82, 65, 76, 76, 69, 204, 80, 65, 82, 65, 75, 76, 73, \r
+    84, 73, 75, 73, 128, 80, 65, 82, 65, 75, 76, 73, 84, 73, 75, 201, 80, 65, \r
+    82, 65, 75, 65, 76, 69, 83, 77, 193, 80, 65, 82, 65, 71, 82, 65, 80, 72, \r
+    79, 83, 128, 80, 65, 82, 65, 71, 82, 65, 80, 72, 128, 80, 65, 82, 65, 71, \r
+    82, 65, 80, 200, 80, 65, 82, 65, 128, 80, 65, 82, 128, 80, 65, 80, 89, \r
+    82, 85, 83, 128, 80, 65, 80, 69, 210, 80, 65, 80, 128, 80, 65, 208, 80, \r
+    65, 207, 80, 65, 78, 89, 85, 75, 85, 128, 80, 65, 78, 89, 73, 75, 85, \r
+    128, 80, 65, 78, 89, 69, 67, 69, 75, 128, 80, 65, 78, 89, 65, 78, 71, 71, \r
+    65, 128, 80, 65, 78, 89, 65, 75, 82, 65, 128, 80, 65, 78, 84, 73, 128, \r
+    80, 65, 78, 83, 73, 79, 83, 45, 80, 73, 69, 85, 80, 128, 80, 65, 78, 83, \r
+    73, 79, 83, 45, 75, 65, 80, 89, 69, 79, 85, 78, 80, 73, 69, 85, 80, 128, \r
+    80, 65, 78, 79, 76, 79, 78, 71, 128, 80, 65, 78, 71, 87, 73, 83, 65, 68, \r
+    128, 80, 65, 78, 71, 82, 65, 78, 71, 75, 69, 80, 128, 80, 65, 78, 71, 76, \r
+    65, 89, 65, 82, 128, 80, 65, 78, 71, 75, 79, 78, 128, 80, 65, 78, 71, 75, \r
+    65, 84, 128, 80, 65, 78, 71, 72, 85, 76, 85, 128, 80, 65, 78, 71, 128, \r
+    80, 65, 78, 69, 85, 76, 69, 85, 78, 71, 128, 80, 65, 78, 65, 69, 76, 65, \r
+    69, 78, 71, 128, 80, 65, 78, 128, 80, 65, 77, 85, 78, 71, 75, 65, 72, \r
+    128, 80, 65, 77, 85, 68, 80, 79, 68, 128, 80, 65, 77, 80, 72, 89, 76, 73, \r
+    65, 206, 80, 65, 77, 73, 78, 71, 75, 65, 76, 128, 80, 65, 77, 69, 80, 69, \r
+    84, 128, 80, 65, 77, 69, 78, 69, 78, 71, 128, 80, 65, 77, 65, 68, 65, \r
+    128, 80, 65, 77, 65, 65, 69, 72, 128, 80, 65, 76, 85, 84, 65, 128, 80, \r
+    65, 76, 79, 67, 72, 75, 65, 128, 80, 65, 76, 205, 80, 65, 76, 76, 65, 87, \r
+    65, 128, 80, 65, 76, 76, 65, 83, 128, 80, 65, 76, 65, 85, 78, 199, 80, \r
+    65, 76, 65, 84, 65, 76, 73, 90, 69, 196, 80, 65, 76, 65, 84, 65, 76, 73, \r
+    90, 65, 84, 73, 79, 78, 128, 80, 65, 76, 65, 84, 65, 204, 80, 65, 73, 89, \r
+    65, 78, 78, 79, 73, 128, 80, 65, 73, 82, 84, 72, 82, 65, 128, 80, 65, 73, \r
+    82, 69, 196, 80, 65, 72, 76, 65, 86, 201, 80, 65, 68, 77, 193, 80, 65, \r
+    68, 193, 80, 65, 68, 128, 80, 65, 67, 75, 73, 78, 71, 128, 80, 65, 65, \r
+    84, 85, 128, 80, 65, 65, 83, 69, 78, 84, 79, 128, 80, 65, 65, 73, 128, \r
+    80, 65, 65, 45, 80, 73, 76, 76, 65, 128, 80, 65, 65, 128, 80, 50, 128, \r
+    80, 48, 49, 49, 128, 80, 48, 49, 48, 128, 80, 48, 48, 57, 128, 80, 48, \r
+    48, 56, 128, 80, 48, 48, 55, 128, 80, 48, 48, 54, 128, 80, 48, 48, 53, \r
+    128, 80, 48, 48, 52, 128, 80, 48, 48, 51, 65, 128, 80, 48, 48, 51, 128, \r
+    80, 48, 48, 50, 128, 80, 48, 48, 49, 65, 128, 80, 48, 48, 49, 128, 79, \r
+    89, 82, 65, 78, 73, 83, 77, 193, 79, 89, 65, 78, 78, 65, 128, 79, 88, 73, \r
+    65, 128, 79, 88, 73, 193, 79, 88, 69, 73, 65, 201, 79, 88, 69, 73, 193, \r
+    79, 86, 69, 82, 82, 73, 68, 69, 128, 79, 86, 69, 82, 76, 79, 78, 199, 79, \r
+    86, 69, 82, 76, 73, 78, 69, 128, 79, 86, 69, 82, 76, 65, 89, 128, 79, 86, \r
+    69, 82, 76, 65, 80, 80, 73, 78, 199, 79, 86, 69, 82, 76, 65, 73, 68, 128, \r
+    79, 86, 69, 82, 66, 65, 82, 128, 79, 86, 65, 204, 79, 86, 128, 79, 85, \r
+    84, 76, 73, 78, 69, 196, 79, 85, 84, 76, 73, 78, 69, 128, 79, 85, 84, 69, \r
+    210, 79, 85, 78, 75, 73, 193, 79, 85, 78, 67, 197, 79, 84, 85, 128, 79, \r
+    84, 84, 65, 86, 193, 79, 84, 84, 128, 79, 84, 72, 65, 76, 65, 206, 79, \r
+    84, 72, 65, 76, 128, 79, 83, 77, 65, 78, 89, 193, 79, 82, 84, 72, 79, 71, \r
+    79, 78, 65, 204, 79, 82, 84, 72, 79, 68, 79, 216, 79, 82, 78, 65, 84, \r
+    197, 79, 82, 78, 65, 77, 69, 78, 84, 128, 79, 82, 78, 65, 77, 69, 78, \r
+    212, 79, 82, 75, 72, 79, 206, 79, 82, 73, 71, 73, 78, 65, 204, 79, 82, \r
+    73, 71, 73, 78, 128, 79, 82, 68, 73, 78, 65, 204, 79, 82, 67, 72, 73, 68, \r
+    128, 79, 80, 84, 73, 79, 206, 79, 80, 80, 82, 69, 83, 83, 73, 79, 78, \r
+    128, 79, 80, 80, 79, 83, 73, 84, 73, 79, 78, 128, 79, 80, 80, 79, 83, 73, \r
+    78, 199, 79, 80, 80, 79, 83, 69, 128, 79, 80, 69, 82, 65, 84, 79, 82, \r
+    128, 79, 80, 69, 82, 65, 84, 79, 210, 79, 80, 69, 78, 73, 78, 199, 79, \r
+    80, 69, 78, 45, 80, 128, 79, 80, 69, 78, 45, 79, 85, 84, 76, 73, 78, 69, \r
+    196, 79, 80, 69, 78, 45, 72, 69, 65, 68, 69, 196, 79, 80, 69, 78, 45, 67, \r
+    73, 82, 67, 85, 73, 84, 45, 79, 85, 84, 80, 85, 212, 79, 80, 69, 206, 79, \r
+    79, 90, 69, 128, 79, 79, 89, 65, 78, 78, 65, 128, 79, 79, 85, 128, 79, \r
+    79, 77, 85, 128, 79, 79, 66, 79, 79, 70, 73, 76, 73, 128, 79, 78, 85, \r
+    128, 79, 78, 83, 85, 128, 79, 78, 78, 128, 79, 78, 75, 65, 82, 128, 79, \r
+    78, 69, 83, 69, 76, 70, 128, 79, 78, 69, 45, 87, 65, 217, 79, 78, 69, 45, \r
+    76, 73, 78, 197, 79, 78, 65, 80, 128, 79, 77, 73, 83, 83, 73, 79, 206, \r
+    79, 77, 73, 67, 82, 79, 78, 128, 79, 77, 73, 67, 82, 79, 206, 79, 77, 69, \r
+    71, 65, 128, 79, 77, 69, 71, 193, 79, 77, 65, 76, 79, 78, 128, 79, 77, \r
+    128, 79, 76, 73, 86, 69, 128, 79, 76, 73, 71, 79, 206, 79, 76, 68, 128, \r
+    79, 75, 84, 207, 79, 75, 65, 82, 65, 128, 79, 75, 65, 82, 193, 79, 74, \r
+    73, 66, 87, 65, 217, 79, 74, 69, 79, 78, 128, 79, 73, 76, 128, 79, 72, \r
+    77, 128, 79, 72, 205, 79, 72, 128, 79, 71, 79, 78, 69, 75, 128, 79, 71, \r
+    79, 78, 69, 203, 79, 71, 72, 65, 205, 79, 69, 75, 128, 79, 68, 196, 79, \r
+    67, 84, 79, 66, 69, 82, 128, 79, 67, 210, 79, 67, 67, 76, 85, 83, 73, 79, \r
+    78, 128, 79, 66, 83, 84, 82, 85, 67, 84, 73, 79, 78, 128, 79, 66, 79, 76, \r
+    211, 79, 66, 79, 204, 79, 66, 79, 70, 73, 76, 73, 128, 79, 66, 76, 73, \r
+    81, 85, 197, 79, 66, 74, 69, 67, 212, 79, 66, 69, 76, 85, 83, 128, 79, \r
+    66, 69, 76, 79, 83, 128, 79, 66, 128, 79, 65, 89, 128, 79, 65, 75, 128, \r
+    79, 65, 66, 79, 65, 70, 73, 76, 73, 128, 79, 193, 79, 48, 53, 49, 128, \r
+    79, 48, 53, 48, 66, 128, 79, 48, 53, 48, 65, 128, 79, 48, 53, 48, 128, \r
+    79, 48, 52, 57, 128, 79, 48, 52, 56, 128, 79, 48, 52, 55, 128, 79, 48, \r
+    52, 54, 128, 79, 48, 52, 53, 128, 79, 48, 52, 52, 128, 79, 48, 52, 51, \r
+    128, 79, 48, 52, 50, 128, 79, 48, 52, 49, 128, 79, 48, 52, 48, 128, 79, \r
+    48, 51, 57, 128, 79, 48, 51, 56, 128, 79, 48, 51, 55, 128, 79, 48, 51, \r
+    54, 68, 128, 79, 48, 51, 54, 67, 128, 79, 48, 51, 54, 66, 128, 79, 48, \r
+    51, 54, 65, 128, 79, 48, 51, 54, 128, 79, 48, 51, 53, 128, 79, 48, 51, \r
+    52, 128, 79, 48, 51, 51, 65, 128, 79, 48, 51, 51, 128, 79, 48, 51, 50, \r
+    128, 79, 48, 51, 49, 128, 79, 48, 51, 48, 65, 128, 79, 48, 51, 48, 128, \r
+    79, 48, 50, 57, 65, 128, 79, 48, 50, 57, 128, 79, 48, 50, 56, 128, 79, \r
+    48, 50, 55, 128, 79, 48, 50, 54, 128, 79, 48, 50, 53, 65, 128, 79, 48, \r
+    50, 53, 128, 79, 48, 50, 52, 65, 128, 79, 48, 50, 52, 128, 79, 48, 50, \r
+    51, 128, 79, 48, 50, 50, 128, 79, 48, 50, 49, 128, 79, 48, 50, 48, 65, \r
+    128, 79, 48, 50, 48, 128, 79, 48, 49, 57, 65, 128, 79, 48, 49, 57, 128, \r
+    79, 48, 49, 56, 128, 79, 48, 49, 55, 128, 79, 48, 49, 54, 128, 79, 48, \r
+    49, 53, 128, 79, 48, 49, 52, 128, 79, 48, 49, 51, 128, 79, 48, 49, 50, \r
+    128, 79, 48, 49, 49, 128, 79, 48, 49, 48, 67, 128, 79, 48, 49, 48, 66, \r
+    128, 79, 48, 49, 48, 65, 128, 79, 48, 49, 48, 128, 79, 48, 48, 57, 128, \r
+    79, 48, 48, 56, 128, 79, 48, 48, 55, 128, 79, 48, 48, 54, 70, 128, 79, \r
+    48, 48, 54, 69, 128, 79, 48, 48, 54, 68, 128, 79, 48, 48, 54, 67, 128, \r
+    79, 48, 48, 54, 66, 128, 79, 48, 48, 54, 65, 128, 79, 48, 48, 54, 128, \r
+    79, 48, 48, 53, 65, 128, 79, 48, 48, 53, 128, 79, 48, 48, 52, 128, 79, \r
+    48, 48, 51, 128, 79, 48, 48, 50, 128, 79, 48, 48, 49, 65, 128, 79, 48, \r
+    48, 49, 128, 79, 45, 89, 69, 128, 79, 45, 79, 45, 73, 128, 79, 45, 69, \r
+    128, 78, 90, 89, 88, 128, 78, 90, 89, 84, 128, 78, 90, 89, 82, 88, 128, \r
+    78, 90, 89, 82, 128, 78, 90, 89, 80, 128, 78, 90, 89, 128, 78, 90, 85, \r
+    88, 128, 78, 90, 85, 82, 88, 128, 78, 90, 85, 82, 128, 78, 90, 85, 80, \r
+    128, 78, 90, 85, 79, 88, 128, 78, 90, 85, 79, 128, 78, 90, 85, 128, 78, \r
+    90, 79, 88, 128, 78, 90, 79, 80, 128, 78, 90, 73, 88, 128, 78, 90, 73, \r
+    84, 128, 78, 90, 73, 80, 128, 78, 90, 73, 69, 88, 128, 78, 90, 73, 69, \r
+    80, 128, 78, 90, 73, 69, 128, 78, 90, 73, 128, 78, 90, 69, 88, 128, 78, \r
+    90, 69, 128, 78, 90, 65, 88, 128, 78, 90, 65, 84, 128, 78, 90, 65, 80, \r
+    128, 78, 90, 65, 128, 78, 89, 87, 65, 128, 78, 89, 85, 88, 128, 78, 89, \r
+    85, 84, 128, 78, 89, 85, 80, 128, 78, 89, 85, 79, 88, 128, 78, 89, 85, \r
+    79, 80, 128, 78, 89, 85, 79, 128, 78, 89, 85, 128, 78, 89, 79, 88, 128, \r
+    78, 89, 79, 84, 128, 78, 89, 79, 80, 128, 78, 89, 79, 79, 128, 78, 89, \r
+    79, 65, 128, 78, 89, 79, 128, 78, 89, 74, 65, 128, 78, 89, 73, 88, 128, \r
+    78, 89, 73, 84, 128, 78, 89, 73, 211, 78, 89, 73, 80, 128, 78, 89, 73, \r
+    78, 45, 68, 79, 128, 78, 89, 73, 69, 88, 128, 78, 89, 73, 69, 84, 128, \r
+    78, 89, 73, 69, 80, 128, 78, 89, 73, 69, 128, 78, 89, 73, 128, 78, 89, \r
+    201, 78, 89, 69, 212, 78, 89, 69, 72, 128, 78, 89, 69, 200, 78, 89, 69, \r
+    69, 128, 78, 89, 69, 128, 78, 89, 196, 78, 89, 67, 65, 128, 78, 89, 65, \r
+    65, 128, 78, 87, 79, 79, 128, 78, 87, 79, 128, 78, 87, 73, 73, 128, 78, \r
+    87, 73, 128, 78, 87, 69, 128, 78, 87, 65, 65, 128, 78, 87, 65, 128, 78, \r
+    87, 128, 78, 86, 128, 78, 85, 88, 128, 78, 85, 85, 78, 128, 78, 85, 84, \r
+    73, 76, 76, 85, 128, 78, 85, 84, 128, 78, 85, 82, 88, 128, 78, 85, 82, \r
+    128, 78, 85, 80, 128, 78, 85, 79, 88, 128, 78, 85, 79, 80, 128, 78, 85, \r
+    79, 128, 78, 85, 78, 85, 90, 128, 78, 85, 78, 85, 218, 78, 85, 78, 71, \r
+    128, 78, 85, 78, 65, 86, 85, 212, 78, 85, 78, 65, 86, 73, 203, 78, 85, \r
+    78, 128, 78, 85, 206, 78, 85, 77, 69, 82, 207, 78, 85, 77, 69, 82, 65, \r
+    84, 79, 210, 78, 85, 77, 69, 82, 65, 204, 78, 85, 77, 66, 69, 82, 128, \r
+    78, 85, 77, 128, 78, 85, 76, 76, 128, 78, 85, 76, 204, 78, 85, 75, 84, \r
+    65, 128, 78, 85, 69, 78, 71, 128, 78, 85, 69, 128, 78, 85, 66, 73, 65, \r
+    206, 78, 85, 65, 69, 128, 78, 85, 49, 49, 128, 78, 85, 48, 50, 50, 65, \r
+    128, 78, 85, 48, 50, 50, 128, 78, 85, 48, 50, 49, 128, 78, 85, 48, 50, \r
+    48, 128, 78, 85, 48, 49, 57, 128, 78, 85, 48, 49, 56, 65, 128, 78, 85, \r
+    48, 49, 56, 128, 78, 85, 48, 49, 55, 128, 78, 85, 48, 49, 54, 128, 78, \r
+    85, 48, 49, 53, 128, 78, 85, 48, 49, 52, 128, 78, 85, 48, 49, 51, 128, \r
+    78, 85, 48, 49, 50, 128, 78, 85, 48, 49, 49, 65, 128, 78, 85, 48, 49, 49, \r
+    128, 78, 85, 48, 49, 48, 65, 128, 78, 85, 48, 49, 48, 128, 78, 85, 48, \r
+    48, 57, 128, 78, 85, 48, 48, 56, 128, 78, 85, 48, 48, 55, 128, 78, 85, \r
+    48, 48, 54, 128, 78, 85, 48, 48, 53, 128, 78, 85, 48, 48, 52, 128, 78, \r
+    85, 48, 48, 51, 128, 78, 85, 48, 48, 50, 128, 78, 85, 48, 48, 49, 128, \r
+    78, 84, 85, 85, 128, 78, 84, 69, 69, 128, 78, 83, 72, 65, 128, 78, 82, \r
+    89, 88, 128, 78, 82, 89, 84, 128, 78, 82, 89, 82, 88, 128, 78, 82, 89, \r
+    82, 128, 78, 82, 89, 80, 128, 78, 82, 89, 128, 78, 82, 85, 88, 128, 78, \r
+    82, 85, 84, 128, 78, 82, 85, 82, 88, 128, 78, 82, 85, 82, 128, 78, 82, \r
+    85, 80, 128, 78, 82, 85, 128, 78, 82, 79, 88, 128, 78, 82, 79, 80, 128, \r
+    78, 82, 79, 128, 78, 82, 69, 88, 128, 78, 82, 69, 84, 128, 78, 82, 69, \r
+    80, 128, 78, 82, 69, 128, 78, 82, 65, 88, 128, 78, 82, 65, 84, 128, 78, \r
+    82, 65, 80, 128, 78, 82, 65, 128, 78, 79, 89, 128, 78, 79, 88, 128, 78, \r
+    79, 86, 69, 77, 66, 69, 82, 128, 78, 79, 84, 84, 79, 128, 78, 79, 84, 69, \r
+    83, 128, 78, 79, 84, 69, 72, 69, 65, 68, 128, 78, 79, 84, 69, 72, 69, 65, \r
+    196, 78, 79, 84, 69, 128, 78, 79, 84, 197, 78, 79, 84, 67, 72, 69, 196, \r
+    78, 79, 84, 67, 72, 128, 78, 79, 84, 128, 78, 79, 83, 69, 128, 78, 79, \r
+    82, 84, 72, 87, 69, 83, 212, 78, 79, 82, 84, 200, 78, 79, 82, 77, 65, \r
+    204, 78, 79, 210, 78, 79, 80, 128, 78, 79, 79, 78, 85, 128, 78, 79, 79, \r
+    128, 78, 79, 78, 70, 79, 82, 75, 73, 78, 71, 128, 78, 79, 78, 45, 74, 79, \r
+    73, 78, 69, 82, 128, 78, 79, 78, 45, 66, 82, 69, 65, 75, 73, 78, 199, 78, \r
+    79, 77, 73, 78, 65, 204, 78, 79, 75, 72, 85, 75, 128, 78, 79, 68, 69, \r
+    128, 78, 79, 65, 128, 78, 79, 45, 66, 82, 69, 65, 203, 78, 78, 79, 128, \r
+    78, 78, 78, 65, 128, 78, 78, 71, 79, 79, 128, 78, 78, 71, 79, 128, 78, \r
+    78, 71, 73, 73, 128, 78, 78, 71, 73, 128, 78, 78, 71, 65, 65, 128, 78, \r
+    78, 71, 65, 128, 78, 78, 71, 128, 78, 77, 128, 78, 76, 48, 50, 48, 128, \r
+    78, 76, 48, 49, 57, 128, 78, 76, 48, 49, 56, 128, 78, 76, 48, 49, 55, 65, \r
+    128, 78, 76, 48, 49, 55, 128, 78, 76, 48, 49, 54, 128, 78, 76, 48, 49, \r
+    53, 128, 78, 76, 48, 49, 52, 128, 78, 76, 48, 49, 51, 128, 78, 76, 48, \r
+    49, 50, 128, 78, 76, 48, 49, 49, 128, 78, 76, 48, 49, 48, 128, 78, 76, \r
+    48, 48, 57, 128, 78, 76, 48, 48, 56, 128, 78, 76, 48, 48, 55, 128, 78, \r
+    76, 48, 48, 54, 128, 78, 76, 48, 48, 53, 65, 128, 78, 76, 48, 48, 53, \r
+    128, 78, 76, 48, 48, 52, 128, 78, 76, 48, 48, 51, 128, 78, 76, 48, 48, \r
+    50, 128, 78, 76, 48, 48, 49, 128, 78, 75, 207, 78, 74, 89, 88, 128, 78, \r
+    74, 89, 84, 128, 78, 74, 89, 82, 88, 128, 78, 74, 89, 82, 128, 78, 74, \r
+    89, 80, 128, 78, 74, 89, 128, 78, 74, 85, 88, 128, 78, 74, 85, 82, 88, \r
+    128, 78, 74, 85, 82, 128, 78, 74, 85, 80, 128, 78, 74, 85, 79, 88, 128, \r
+    78, 74, 85, 79, 128, 78, 74, 85, 65, 69, 128, 78, 74, 85, 128, 78, 74, \r
+    79, 88, 128, 78, 74, 79, 84, 128, 78, 74, 79, 80, 128, 78, 74, 79, 79, \r
+    128, 78, 74, 79, 128, 78, 74, 73, 88, 128, 78, 74, 73, 84, 128, 78, 74, \r
+    73, 80, 128, 78, 74, 73, 69, 88, 128, 78, 74, 73, 69, 84, 128, 78, 74, \r
+    73, 69, 80, 128, 78, 74, 73, 69, 128, 78, 74, 73, 128, 78, 74, 69, 69, \r
+    128, 78, 74, 69, 128, 78, 74, 65, 69, 77, 76, 73, 128, 78, 74, 65, 69, \r
+    77, 128, 78, 74, 128, 78, 73, 88, 128, 78, 73, 83, 65, 71, 128, 78, 73, \r
+    82, 85, 71, 85, 128, 78, 73, 80, 128, 78, 73, 78, 84, 72, 128, 78, 73, \r
+    78, 69, 84, 89, 128, 78, 73, 78, 69, 84, 217, 78, 73, 78, 69, 84, 69, 69, \r
+    78, 128, 78, 73, 78, 69, 84, 69, 69, 206, 78, 73, 78, 197, 78, 73, 78, \r
+    68, 65, 50, 128, 78, 73, 78, 68, 65, 178, 78, 73, 77, 128, 78, 73, 205, \r
+    78, 73, 75, 72, 65, 72, 73, 84, 128, 78, 73, 75, 65, 72, 73, 84, 128, 78, \r
+    73, 73, 128, 78, 73, 72, 83, 72, 86, 65, 83, 65, 128, 78, 73, 71, 73, 68, \r
+    65, 77, 73, 78, 128, 78, 73, 71, 73, 68, 65, 69, 83, 72, 128, 78, 73, 71, \r
+    72, 84, 128, 78, 73, 71, 71, 65, 72, 73, 84, 65, 128, 78, 73, 69, 88, \r
+    128, 78, 73, 69, 85, 78, 45, 84, 73, 75, 69, 85, 84, 128, 78, 73, 69, 85, \r
+    78, 45, 84, 72, 73, 69, 85, 84, 72, 128, 78, 73, 69, 85, 78, 45, 83, 73, \r
+    79, 83, 128, 78, 73, 69, 85, 78, 45, 82, 73, 69, 85, 76, 128, 78, 73, 69, \r
+    85, 78, 45, 80, 73, 69, 85, 80, 128, 78, 73, 69, 85, 78, 45, 80, 65, 78, \r
+    83, 73, 79, 83, 128, 78, 73, 69, 85, 78, 45, 75, 73, 89, 69, 79, 75, 128, \r
+    78, 73, 69, 85, 78, 45, 72, 73, 69, 85, 72, 128, 78, 73, 69, 85, 78, 45, \r
+    67, 73, 69, 85, 67, 128, 78, 73, 69, 85, 78, 45, 67, 72, 73, 69, 85, 67, \r
+    72, 128, 78, 73, 69, 85, 206, 78, 73, 69, 80, 128, 78, 73, 69, 128, 78, \r
+    73, 66, 128, 78, 73, 65, 128, 78, 73, 50, 128, 78, 72, 85, 69, 128, 78, \r
+    72, 74, 65, 128, 78, 72, 65, 128, 78, 72, 128, 78, 71, 89, 69, 128, 78, \r
+    71, 86, 69, 128, 78, 71, 85, 79, 88, 128, 78, 71, 85, 79, 84, 128, 78, \r
+    71, 85, 79, 128, 78, 71, 79, 88, 128, 78, 71, 79, 85, 128, 78, 71, 79, \r
+    213, 78, 71, 79, 84, 128, 78, 71, 79, 80, 128, 78, 71, 79, 78, 128, 78, \r
+    71, 79, 69, 72, 128, 78, 71, 79, 69, 200, 78, 71, 207, 78, 71, 75, 87, \r
+    65, 69, 78, 128, 78, 71, 75, 65, 128, 78, 71, 73, 69, 88, 128, 78, 71, \r
+    73, 69, 80, 128, 78, 71, 73, 69, 128, 78, 71, 71, 85, 128, 78, 71, 71, \r
+    79, 79, 128, 78, 71, 71, 79, 128, 78, 71, 71, 73, 128, 78, 71, 71, 69, \r
+    78, 128, 78, 71, 71, 69, 69, 128, 78, 71, 71, 69, 128, 78, 71, 71, 128, \r
+    78, 71, 69, 88, 128, 78, 71, 69, 80, 128, 78, 71, 69, 78, 128, 78, 71, \r
+    69, 65, 68, 65, 76, 128, 78, 71, 69, 128, 78, 71, 65, 88, 128, 78, 71, \r
+    65, 84, 128, 78, 71, 65, 211, 78, 71, 65, 80, 128, 78, 71, 65, 78, 128, \r
+    78, 71, 65, 73, 128, 78, 71, 65, 65, 73, 128, 78, 71, 193, 78, 70, 128, \r
+    78, 69, 88, 212, 78, 69, 88, 128, 78, 69, 87, 76, 73, 78, 69, 128, 78, \r
+    69, 85, 84, 82, 65, 204, 78, 69, 85, 84, 69, 82, 128, 78, 69, 84, 128, \r
+    78, 69, 212, 78, 69, 83, 84, 69, 196, 78, 69, 81, 85, 68, 65, 65, 128, \r
+    78, 69, 80, 84, 85, 78, 69, 128, 78, 69, 80, 128, 78, 69, 79, 128, 78, \r
+    69, 207, 78, 69, 78, 65, 78, 79, 128, 78, 69, 78, 128, 78, 69, 73, 84, \r
+    72, 69, 210, 78, 69, 71, 65, 84, 73, 86, 197, 78, 69, 71, 65, 84, 73, 79, \r
+    206, 78, 69, 71, 65, 84, 69, 196, 78, 69, 69, 128, 78, 69, 66, 69, 78, \r
+    83, 84, 73, 77, 77, 69, 128, 78, 68, 85, 88, 128, 78, 68, 85, 84, 128, \r
+    78, 68, 85, 82, 88, 128, 78, 68, 85, 82, 128, 78, 68, 85, 80, 128, 78, \r
+    68, 79, 88, 128, 78, 68, 79, 84, 128, 78, 68, 79, 80, 128, 78, 68, 79, \r
+    79, 128, 78, 68, 79, 76, 197, 78, 68, 73, 88, 128, 78, 68, 73, 84, 128, \r
+    78, 68, 73, 80, 128, 78, 68, 73, 69, 88, 128, 78, 68, 73, 69, 128, 78, \r
+    68, 73, 128, 78, 68, 69, 88, 128, 78, 68, 69, 80, 128, 78, 68, 69, 69, \r
+    128, 78, 68, 69, 128, 78, 68, 65, 88, 128, 78, 68, 65, 84, 128, 78, 68, \r
+    65, 80, 128, 78, 68, 65, 65, 128, 78, 66, 89, 88, 128, 78, 66, 89, 84, \r
+    128, 78, 66, 89, 82, 88, 128, 78, 66, 89, 82, 128, 78, 66, 89, 80, 128, \r
+    78, 66, 89, 128, 78, 66, 85, 88, 128, 78, 66, 85, 84, 128, 78, 66, 85, \r
+    82, 88, 128, 78, 66, 85, 82, 128, 78, 66, 85, 80, 128, 78, 66, 85, 128, \r
+    78, 66, 79, 88, 128, 78, 66, 79, 84, 128, 78, 66, 79, 80, 128, 78, 66, \r
+    79, 128, 78, 66, 73, 88, 128, 78, 66, 73, 84, 128, 78, 66, 73, 80, 128, \r
+    78, 66, 73, 69, 88, 128, 78, 66, 73, 69, 80, 128, 78, 66, 73, 69, 128, \r
+    78, 66, 73, 128, 78, 66, 65, 88, 128, 78, 66, 65, 84, 128, 78, 66, 65, \r
+    80, 128, 78, 66, 65, 128, 78, 65, 89, 65, 78, 78, 65, 128, 78, 65, 89, \r
+    128, 78, 65, 88, 73, 65, 206, 78, 65, 88, 128, 78, 65, 85, 84, 72, 83, \r
+    128, 78, 65, 85, 68, 73, 218, 78, 65, 84, 85, 82, 65, 204, 78, 65, 84, \r
+    73, 79, 78, 65, 204, 78, 65, 83, 75, 65, 80, 201, 78, 65, 83, 72, 73, \r
+    128, 78, 65, 83, 65, 76, 73, 90, 65, 84, 73, 79, 206, 78, 65, 82, 82, 79, \r
+    215, 78, 65, 82, 128, 78, 65, 79, 211, 78, 65, 78, 71, 77, 79, 78, 84, \r
+    72, 79, 128, 78, 65, 78, 68, 128, 78, 65, 78, 65, 128, 78, 65, 77, 69, \r
+    128, 78, 65, 77, 197, 78, 65, 77, 50, 128, 78, 65, 77, 128, 78, 65, 73, \r
+    82, 193, 78, 65, 71, 82, 201, 78, 65, 71, 65, 82, 128, 78, 65, 71, 65, \r
+    128, 78, 65, 71, 193, 78, 65, 71, 128, 78, 65, 199, 78, 65, 66, 76, 65, \r
+    128, 78, 65, 65, 83, 73, 75, 89, 65, 89, 65, 128, 78, 65, 65, 75, 83, 73, \r
+    75, 89, 65, 89, 65, 128, 78, 65, 65, 73, 128, 78, 65, 65, 128, 78, 65, \r
+    193, 78, 65, 50, 128, 78, 48, 52, 50, 128, 78, 48, 52, 49, 128, 78, 48, \r
+    52, 48, 128, 78, 48, 51, 57, 128, 78, 48, 51, 56, 128, 78, 48, 51, 55, \r
+    65, 128, 78, 48, 51, 55, 128, 78, 48, 51, 54, 128, 78, 48, 51, 53, 65, \r
+    128, 78, 48, 51, 53, 128, 78, 48, 51, 52, 65, 128, 78, 48, 51, 52, 128, \r
+    78, 48, 51, 51, 65, 128, 78, 48, 51, 51, 128, 78, 48, 51, 50, 128, 78, \r
+    48, 51, 49, 128, 78, 48, 51, 48, 128, 78, 48, 50, 57, 128, 78, 48, 50, \r
+    56, 128, 78, 48, 50, 55, 128, 78, 48, 50, 54, 128, 78, 48, 50, 53, 65, \r
+    128, 78, 48, 50, 53, 128, 78, 48, 50, 52, 128, 78, 48, 50, 51, 128, 78, \r
+    48, 50, 50, 128, 78, 48, 50, 49, 128, 78, 48, 50, 48, 128, 78, 48, 49, \r
+    57, 128, 78, 48, 49, 56, 66, 128, 78, 48, 49, 56, 65, 128, 78, 48, 49, \r
+    56, 128, 78, 48, 49, 55, 128, 78, 48, 49, 54, 128, 78, 48, 49, 53, 128, \r
+    78, 48, 49, 52, 128, 78, 48, 49, 51, 128, 78, 48, 49, 50, 128, 78, 48, \r
+    49, 49, 128, 78, 48, 49, 48, 128, 78, 48, 48, 57, 128, 78, 48, 48, 56, \r
+    128, 78, 48, 48, 55, 128, 78, 48, 48, 54, 128, 78, 48, 48, 53, 128, 78, \r
+    48, 48, 52, 128, 78, 48, 48, 51, 128, 78, 48, 48, 50, 128, 78, 48, 48, \r
+    49, 128, 78, 45, 67, 82, 69, 197, 78, 45, 65, 82, 217, 77, 89, 88, 128, \r
+    77, 89, 84, 128, 77, 89, 83, 76, 73, 84, 69, 128, 77, 89, 80, 128, 77, \r
+    89, 65, 128, 77, 89, 193, 77, 89, 128, 77, 87, 79, 79, 128, 77, 87, 79, \r
+    128, 77, 87, 73, 73, 128, 77, 87, 73, 128, 77, 87, 69, 69, 128, 77, 87, \r
+    69, 128, 77, 87, 65, 65, 128, 77, 87, 65, 128, 77, 87, 128, 77, 215, 77, \r
+    86, 128, 77, 214, 77, 85, 88, 128, 77, 85, 85, 83, 73, 75, 65, 84, 79, \r
+    65, 78, 128, 77, 85, 85, 82, 68, 72, 65, 74, 193, 77, 85, 84, 128, 77, \r
+    85, 83, 73, 67, 128, 77, 85, 83, 73, 195, 77, 85, 83, 72, 51, 128, 77, \r
+    85, 83, 72, 179, 77, 85, 83, 72, 128, 77, 85, 83, 200, 77, 85, 82, 88, \r
+    128, 77, 85, 82, 71, 85, 50, 128, 77, 85, 82, 69, 128, 77, 85, 82, 68, \r
+    65, 128, 77, 85, 82, 68, 193, 77, 85, 82, 128, 77, 85, 81, 68, 65, 77, \r
+    128, 77, 85, 80, 128, 77, 85, 79, 88, 128, 77, 85, 79, 84, 128, 77, 85, \r
+    79, 80, 128, 77, 85, 79, 128, 77, 85, 78, 83, 85, 66, 128, 77, 85, 78, \r
+    65, 72, 128, 77, 85, 76, 84, 73, 83, 69, 84, 128, 77, 85, 76, 84, 73, 83, \r
+    69, 212, 77, 85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 78, 128, 77, \r
+    85, 76, 84, 73, 80, 76, 73, 67, 65, 84, 73, 79, 206, 77, 85, 76, 84, 73, \r
+    80, 76, 197, 77, 85, 76, 84, 73, 79, 67, 85, 76, 65, 210, 77, 85, 76, 84, \r
+    73, 77, 65, 80, 128, 77, 85, 76, 84, 201, 77, 85, 75, 80, 72, 82, 69, 78, \r
+    71, 128, 77, 85, 73, 78, 128, 77, 85, 71, 128, 77, 85, 199, 77, 85, 69, \r
+    128, 77, 85, 67, 200, 77, 85, 67, 65, 65, 68, 128, 77, 85, 65, 78, 128, \r
+    77, 85, 45, 71, 65, 65, 72, 76, 65, 193, 77, 213, 77, 83, 128, 77, 80, \r
+    65, 128, 77, 79, 88, 128, 77, 79, 86, 69, 196, 77, 79, 85, 84, 72, 128, \r
+    77, 79, 85, 84, 200, 77, 79, 85, 78, 84, 65, 73, 78, 128, 77, 79, 85, 78, \r
+    68, 128, 77, 79, 85, 78, 196, 77, 79, 84, 72, 69, 82, 128, 77, 79, 84, \r
+    128, 77, 79, 82, 84, 65, 82, 128, 77, 79, 82, 80, 72, 79, 76, 79, 71, 73, \r
+    67, 65, 204, 77, 79, 82, 78, 73, 78, 71, 128, 77, 79, 80, 128, 77, 79, \r
+    79, 83, 69, 45, 67, 82, 69, 197, 77, 79, 79, 78, 128, 77, 79, 79, 206, \r
+    77, 79, 79, 128, 77, 79, 78, 84, 72, 128, 77, 79, 78, 84, 200, 77, 79, \r
+    78, 79, 83, 84, 65, 66, 76, 197, 77, 79, 78, 79, 71, 82, 65, 80, 200, 77, \r
+    79, 78, 79, 71, 82, 65, 77, 77, 79, 211, 77, 79, 78, 79, 71, 82, 65, 205, \r
+    77, 79, 78, 79, 70, 79, 78, 73, 65, 83, 128, 77, 79, 78, 79, 67, 85, 76, \r
+    65, 210, 77, 79, 206, 77, 79, 76, 128, 77, 79, 72, 65, 77, 77, 65, 196, \r
+    77, 79, 68, 85, 76, 207, 77, 79, 68, 69, 83, 84, 89, 128, 77, 79, 68, 69, \r
+    76, 83, 128, 77, 79, 68, 69, 76, 128, 77, 79, 65, 128, 77, 207, 77, 78, \r
+    89, 65, 205, 77, 78, 65, 83, 128, 77, 77, 128, 77, 205, 77, 76, 65, 128, \r
+    77, 76, 128, 77, 73, 88, 128, 77, 73, 84, 128, 77, 73, 212, 77, 73, 83, \r
+    82, 65, 128, 77, 73, 82, 73, 66, 65, 65, 82, 85, 128, 77, 73, 82, 73, \r
+    128, 77, 73, 82, 69, 68, 128, 77, 73, 80, 128, 77, 73, 78, 89, 128, 77, \r
+    73, 78, 85, 83, 45, 79, 82, 45, 80, 76, 85, 211, 77, 73, 78, 85, 83, 128, \r
+    77, 73, 78, 73, 83, 84, 69, 82, 128, 77, 73, 78, 73, 77, 65, 128, 77, 73, \r
+    77, 69, 128, 77, 73, 77, 128, 77, 73, 76, 76, 73, 79, 78, 211, 77, 73, \r
+    76, 76, 69, 84, 128, 77, 73, 76, 76, 197, 77, 73, 76, 204, 77, 73, 76, \r
+    128, 77, 73, 75, 85, 82, 79, 78, 128, 77, 73, 75, 82, 79, 206, 77, 73, \r
+    75, 82, 73, 128, 77, 73, 73, 78, 128, 77, 73, 73, 128, 77, 73, 199, 77, \r
+    73, 69, 88, 128, 77, 73, 69, 85, 77, 45, 84, 73, 75, 69, 85, 84, 128, 77, \r
+    73, 69, 85, 77, 45, 83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 77, 73, 69, \r
+    85, 77, 45, 83, 83, 65, 78, 71, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, \r
+    77, 45, 82, 73, 69, 85, 76, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, \r
+    80, 45, 83, 73, 79, 83, 128, 77, 73, 69, 85, 77, 45, 80, 73, 69, 85, 80, \r
+    128, 77, 73, 69, 85, 77, 45, 80, 65, 78, 83, 73, 79, 83, 128, 77, 73, 69, \r
+    85, 77, 45, 78, 73, 69, 85, 78, 128, 77, 73, 69, 85, 77, 45, 67, 73, 69, \r
+    85, 67, 128, 77, 73, 69, 85, 77, 45, 67, 72, 73, 69, 85, 67, 72, 128, 77, \r
+    73, 69, 85, 205, 77, 73, 69, 80, 128, 77, 73, 69, 128, 77, 73, 68, 76, \r
+    73, 78, 197, 77, 73, 68, 68, 76, 69, 45, 87, 69, 76, 83, 200, 77, 73, 68, \r
+    68, 76, 197, 77, 73, 196, 77, 73, 67, 82, 207, 77, 73, 128, 77, 72, 90, \r
+    128, 77, 72, 128, 77, 71, 85, 88, 128, 77, 71, 85, 84, 128, 77, 71, 85, \r
+    82, 88, 128, 77, 71, 85, 82, 128, 77, 71, 85, 80, 128, 77, 71, 85, 79, \r
+    88, 128, 77, 71, 85, 79, 80, 128, 77, 71, 85, 79, 128, 77, 71, 85, 128, \r
+    77, 71, 79, 88, 128, 77, 71, 79, 84, 128, 77, 71, 79, 80, 128, 77, 71, \r
+    79, 128, 77, 71, 207, 77, 71, 73, 69, 88, 128, 77, 71, 73, 69, 128, 77, \r
+    71, 69, 88, 128, 77, 71, 69, 80, 128, 77, 71, 69, 128, 77, 71, 66, 85, \r
+    128, 77, 71, 66, 79, 79, 128, 77, 71, 66, 79, 128, 77, 71, 66, 73, 128, \r
+    77, 71, 66, 69, 69, 128, 77, 71, 66, 69, 128, 77, 71, 66, 65, 128, 77, \r
+    71, 65, 88, 128, 77, 71, 65, 84, 128, 77, 71, 65, 80, 128, 77, 71, 65, \r
+    128, 77, 71, 128, 77, 69, 90, 90, 79, 128, 77, 69, 88, 128, 77, 69, 84, \r
+    82, 73, 67, 65, 204, 77, 69, 84, 82, 73, 65, 128, 77, 69, 84, 82, 69, 84, \r
+    69, 211, 77, 69, 84, 79, 66, 69, 76, 85, 83, 128, 77, 69, 84, 69, 71, \r
+    128, 77, 69, 84, 65, 76, 128, 77, 69, 84, 193, 77, 69, 83, 83, 69, 78, \r
+    73, 65, 206, 77, 69, 83, 79, 128, 77, 69, 83, 73, 128, 77, 69, 83, 72, \r
+    128, 77, 69, 82, 75, 72, 65, 128, 77, 69, 82, 75, 72, 193, 77, 69, 82, \r
+    73, 128, 77, 69, 82, 71, 69, 128, 77, 69, 82, 67, 85, 82, 89, 128, 77, \r
+    69, 78, 68, 85, 84, 128, 77, 69, 78, 128, 77, 69, 206, 77, 69, 77, 66, \r
+    69, 82, 83, 72, 73, 80, 128, 77, 69, 77, 66, 69, 82, 128, 77, 69, 77, 66, \r
+    69, 210, 77, 69, 77, 45, 81, 79, 80, 72, 128, 77, 69, 77, 128, 77, 69, \r
+    205, 77, 69, 76, 79, 78, 128, 77, 69, 76, 79, 68, 73, 195, 77, 69, 76, \r
+    73, 75, 128, 77, 69, 73, 90, 73, 128, 77, 69, 71, 65, 84, 79, 78, 128, \r
+    77, 69, 71, 65, 76, 73, 128, 77, 69, 69, 84, 79, 82, 85, 128, 77, 69, 69, \r
+    84, 69, 201, 77, 69, 69, 84, 128, 77, 69, 69, 77, 85, 128, 77, 69, 69, \r
+    77, 128, 77, 69, 69, 69, 69, 128, 77, 69, 69, 128, 77, 69, 68, 73, 85, \r
+    77, 128, 77, 69, 68, 73, 85, 205, 77, 69, 68, 73, 67, 73, 78, 69, 128, \r
+    77, 69, 65, 84, 128, 77, 69, 65, 83, 85, 82, 69, 196, 77, 69, 65, 83, 85, \r
+    82, 69, 128, 77, 69, 65, 83, 85, 82, 197, 77, 68, 85, 206, 77, 67, 72, \r
+    213, 77, 66, 85, 128, 77, 66, 79, 79, 128, 77, 66, 79, 128, 77, 66, 73, \r
+    128, 77, 66, 69, 78, 128, 77, 66, 69, 69, 128, 77, 66, 69, 128, 77, 66, \r
+    65, 65, 128, 77, 66, 52, 128, 77, 66, 51, 128, 77, 66, 50, 128, 77, 66, \r
+    128, 77, 194, 77, 65, 89, 69, 203, 77, 65, 89, 65, 78, 78, 65, 128, 77, \r
+    65, 89, 128, 77, 65, 88, 73, 77, 65, 128, 77, 65, 88, 128, 77, 65, 84, \r
+    84, 79, 67, 75, 128, 77, 65, 84, 82, 73, 88, 128, 77, 65, 84, 69, 82, 73, \r
+    65, 76, 83, 128, 77, 65, 84, 128, 77, 65, 83, 213, 77, 65, 83, 83, 73, \r
+    78, 71, 128, 77, 65, 83, 79, 82, 193, 77, 65, 83, 72, 70, 65, 65, 84, \r
+    128, 77, 65, 83, 72, 50, 128, 77, 65, 83, 67, 85, 76, 73, 78, 197, 77, \r
+    65, 82, 85, 75, 85, 128, 77, 65, 82, 84, 89, 82, 73, 193, 77, 65, 82, 82, \r
+    89, 73, 78, 199, 77, 65, 82, 82, 73, 65, 71, 197, 77, 65, 82, 75, 69, 82, \r
+    128, 77, 65, 82, 75, 45, 52, 128, 77, 65, 82, 75, 45, 51, 128, 77, 65, \r
+    82, 75, 45, 50, 128, 77, 65, 82, 75, 45, 49, 128, 77, 65, 82, 69, 128, \r
+    77, 65, 82, 67, 72, 128, 77, 65, 82, 67, 65, 84, 79, 45, 83, 84, 65, 67, \r
+    67, 65, 84, 79, 128, 77, 65, 82, 67, 65, 84, 79, 128, 77, 65, 82, 66, 85, \r
+    84, 65, 128, 77, 65, 82, 66, 85, 84, 193, 77, 65, 82, 128, 77, 65, 81, \r
+    65, 70, 128, 77, 65, 80, 73, 81, 128, 77, 65, 208, 77, 65, 78, 83, 89, \r
+    79, 78, 128, 77, 65, 78, 78, 65, 218, 77, 65, 78, 78, 65, 128, 77, 65, \r
+    78, 71, 65, 76, 65, 77, 128, 77, 65, 78, 67, 72, 213, 77, 65, 78, 65, 67, \r
+    76, 69, 83, 128, 77, 65, 76, 84, 69, 83, 197, 77, 65, 76, 69, 128, 77, \r
+    65, 76, 197, 77, 65, 76, 65, 75, 79, 206, 77, 65, 75, 83, 85, 82, 65, \r
+    128, 77, 65, 73, 89, 65, 77, 79, 75, 128, 77, 65, 73, 84, 65, 73, 75, 72, \r
+    85, 128, 77, 65, 73, 82, 85, 128, 77, 65, 73, 77, 85, 65, 78, 128, 77, \r
+    65, 73, 77, 65, 76, 65, 73, 128, 77, 65, 73, 75, 85, 82, 79, 128, 77, 65, \r
+    73, 68, 69, 78, 128, 77, 65, 72, 74, 79, 78, 199, 77, 65, 72, 72, 65, \r
+    128, 77, 65, 72, 65, 80, 82, 65, 78, 65, 128, 77, 65, 72, 65, 80, 65, 75, \r
+    72, 128, 77, 65, 72, 65, 65, 80, 82, 65, 65, 78, 193, 77, 65, 72, 128, \r
+    77, 65, 68, 89, 65, 128, 77, 65, 68, 85, 128, 77, 65, 68, 68, 65, 200, \r
+    77, 65, 68, 68, 65, 128, 77, 65, 68, 68, 193, 77, 65, 67, 82, 79, 78, 45, \r
+    71, 82, 65, 86, 69, 128, 77, 65, 67, 82, 79, 78, 45, 66, 82, 69, 86, 69, \r
+    128, 77, 65, 67, 82, 79, 78, 45, 65, 67, 85, 84, 69, 128, 77, 65, 67, 82, \r
+    79, 78, 128, 77, 65, 67, 82, 79, 206, 77, 65, 65, 73, 128, 77, 65, 65, \r
+    128, 77, 65, 50, 128, 77, 48, 52, 52, 128, 77, 48, 52, 51, 128, 77, 48, \r
+    52, 50, 128, 77, 48, 52, 49, 128, 77, 48, 52, 48, 65, 128, 77, 48, 52, \r
+    48, 128, 77, 48, 51, 57, 128, 77, 48, 51, 56, 128, 77, 48, 51, 55, 128, \r
+    77, 48, 51, 54, 128, 77, 48, 51, 53, 128, 77, 48, 51, 52, 128, 77, 48, \r
+    51, 51, 66, 128, 77, 48, 51, 51, 65, 128, 77, 48, 51, 51, 128, 77, 48, \r
+    51, 50, 128, 77, 48, 51, 49, 65, 128, 77, 48, 51, 49, 128, 77, 48, 51, \r
+    48, 128, 77, 48, 50, 57, 128, 77, 48, 50, 56, 65, 128, 77, 48, 50, 56, \r
+    128, 77, 48, 50, 55, 128, 77, 48, 50, 54, 128, 77, 48, 50, 53, 128, 77, \r
+    48, 50, 52, 65, 128, 77, 48, 50, 52, 128, 77, 48, 50, 51, 128, 77, 48, \r
+    50, 50, 65, 128, 77, 48, 50, 50, 128, 77, 48, 50, 49, 128, 77, 48, 50, \r
+    48, 128, 77, 48, 49, 57, 128, 77, 48, 49, 56, 128, 77, 48, 49, 55, 65, \r
+    128, 77, 48, 49, 55, 128, 77, 48, 49, 54, 65, 128, 77, 48, 49, 54, 128, \r
+    77, 48, 49, 53, 65, 128, 77, 48, 49, 53, 128, 77, 48, 49, 52, 128, 77, \r
+    48, 49, 51, 128, 77, 48, 49, 50, 72, 128, 77, 48, 49, 50, 71, 128, 77, \r
+    48, 49, 50, 70, 128, 77, 48, 49, 50, 69, 128, 77, 48, 49, 50, 68, 128, \r
+    77, 48, 49, 50, 67, 128, 77, 48, 49, 50, 66, 128, 77, 48, 49, 50, 65, \r
+    128, 77, 48, 49, 50, 128, 77, 48, 49, 49, 128, 77, 48, 49, 48, 65, 128, \r
+    77, 48, 49, 48, 128, 77, 48, 48, 57, 128, 77, 48, 48, 56, 128, 77, 48, \r
+    48, 55, 128, 77, 48, 48, 54, 128, 77, 48, 48, 53, 128, 77, 48, 48, 52, \r
+    128, 77, 48, 48, 51, 65, 128, 77, 48, 48, 51, 128, 77, 48, 48, 50, 128, \r
+    77, 48, 48, 49, 66, 128, 77, 48, 48, 49, 65, 128, 77, 48, 48, 49, 128, \r
+    76, 218, 76, 89, 89, 128, 76, 89, 88, 128, 76, 89, 84, 128, 76, 89, 82, \r
+    88, 128, 76, 89, 82, 128, 76, 89, 80, 128, 76, 89, 68, 73, 65, 206, 76, \r
+    89, 67, 73, 65, 206, 76, 88, 128, 76, 87, 79, 79, 128, 76, 87, 79, 128, \r
+    76, 87, 73, 73, 128, 76, 87, 73, 128, 76, 87, 69, 128, 76, 87, 65, 65, \r
+    128, 76, 87, 65, 128, 76, 85, 88, 128, 76, 85, 84, 128, 76, 85, 82, 88, \r
+    128, 76, 85, 80, 128, 76, 85, 79, 88, 128, 76, 85, 79, 84, 128, 76, 85, \r
+    79, 80, 128, 76, 85, 79, 128, 76, 85, 78, 71, 83, 73, 128, 76, 85, 78, \r
+    65, 84, 197, 76, 85, 205, 76, 85, 76, 128, 76, 85, 73, 83, 128, 76, 85, \r
+    72, 85, 82, 128, 76, 85, 72, 128, 76, 85, 71, 65, 76, 128, 76, 85, 71, \r
+    65, 204, 76, 85, 69, 128, 76, 85, 51, 128, 76, 85, 50, 128, 76, 85, 178, \r
+    76, 79, 90, 69, 78, 71, 69, 128, 76, 79, 90, 69, 78, 71, 197, 76, 79, 88, \r
+    128, 76, 79, 87, 69, 210, 76, 79, 87, 45, 185, 76, 79, 85, 82, 69, 128, \r
+    76, 79, 84, 85, 83, 128, 76, 79, 84, 128, 76, 79, 82, 82, 65, 73, 78, 69, \r
+    128, 76, 79, 81, 128, 76, 79, 80, 128, 76, 79, 79, 84, 128, 76, 79, 79, \r
+    80, 128, 76, 79, 79, 128, 76, 79, 78, 83, 85, 77, 128, 76, 79, 78, 71, \r
+    65, 128, 76, 79, 78, 71, 193, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, \r
+    45, 89, 82, 128, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 83, 79, \r
+    204, 76, 79, 78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 79, 83, 211, 76, 79, \r
+    78, 71, 45, 66, 82, 65, 78, 67, 72, 45, 77, 65, 68, 210, 76, 79, 78, 71, \r
+    45, 66, 82, 65, 78, 67, 72, 45, 72, 65, 71, 65, 76, 204, 76, 79, 78, 71, \r
+    45, 66, 82, 65, 78, 67, 72, 45, 65, 210, 76, 79, 76, 76, 128, 76, 79, 71, \r
+    210, 76, 79, 71, 79, 84, 89, 80, 197, 76, 79, 71, 79, 71, 82, 65, 205, \r
+    76, 79, 71, 128, 76, 79, 67, 65, 84, 73, 86, 69, 128, 76, 79, 67, 65, 84, \r
+    73, 79, 206, 76, 79, 65, 128, 76, 78, 128, 76, 77, 128, 76, 76, 76, 65, \r
+    128, 76, 74, 85, 68, 73, 74, 69, 128, 76, 74, 69, 128, 76, 74, 128, 76, \r
+    73, 88, 128, 76, 73, 87, 78, 128, 76, 73, 86, 82, 197, 76, 73, 84, 84, \r
+    76, 197, 76, 73, 84, 82, 193, 76, 73, 84, 128, 76, 73, 83, 213, 76, 73, \r
+    83, 72, 128, 76, 73, 82, 193, 76, 73, 81, 85, 73, 196, 76, 73, 80, 128, \r
+    76, 73, 78, 75, 73, 78, 199, 76, 73, 78, 203, 76, 73, 78, 71, 83, 65, \r
+    128, 76, 73, 78, 69, 83, 128, 76, 73, 78, 69, 211, 76, 73, 78, 69, 45, \r
+    57, 128, 76, 73, 78, 69, 45, 55, 128, 76, 73, 78, 69, 45, 51, 128, 76, \r
+    73, 78, 69, 45, 49, 128, 76, 73, 77, 77, 85, 52, 128, 76, 73, 77, 77, 85, \r
+    50, 128, 76, 73, 77, 77, 85, 128, 76, 73, 77, 77, 213, 76, 73, 77, 73, \r
+    84, 69, 196, 76, 73, 77, 73, 84, 65, 84, 73, 79, 78, 128, 76, 73, 77, 73, \r
+    84, 128, 76, 73, 76, 89, 128, 76, 73, 76, 73, 84, 72, 128, 76, 73, 76, \r
+    128, 76, 73, 73, 128, 76, 73, 71, 72, 84, 78, 73, 78, 71, 128, 76, 73, \r
+    71, 72, 84, 72, 79, 85, 83, 69, 128, 76, 73, 71, 72, 84, 128, 76, 73, 70, \r
+    69, 128, 76, 73, 69, 88, 128, 76, 73, 69, 84, 128, 76, 73, 69, 80, 128, \r
+    76, 73, 69, 128, 76, 73, 68, 128, 76, 73, 66, 82, 65, 128, 76, 73, 65, \r
+    66, 73, 76, 73, 84, 217, 76, 72, 73, 73, 128, 76, 72, 65, 86, 73, 89, 65, \r
+    78, 73, 128, 76, 72, 65, 199, 76, 72, 65, 65, 128, 76, 72, 128, 76, 69, \r
+    90, 72, 128, 76, 69, 88, 128, 76, 69, 86, 69, 204, 76, 69, 84, 84, 69, \r
+    82, 128, 76, 69, 83, 83, 69, 210, 76, 69, 83, 83, 45, 84, 72, 65, 78, \r
+    128, 76, 69, 83, 83, 45, 84, 72, 65, 206, 76, 69, 80, 128, 76, 69, 79, \r
+    128, 76, 69, 78, 84, 73, 67, 85, 76, 65, 210, 76, 69, 78, 73, 83, 128, \r
+    76, 69, 78, 71, 84, 72, 69, 78, 69, 82, 128, 76, 69, 78, 71, 84, 200, 76, \r
+    69, 78, 71, 65, 128, 76, 69, 78, 71, 193, 76, 69, 77, 79, 73, 128, 76, \r
+    69, 76, 69, 84, 128, 76, 69, 76, 69, 212, 76, 69, 203, 76, 69, 73, 77, \r
+    77, 65, 128, 76, 69, 73, 77, 77, 193, 76, 69, 71, 83, 128, 76, 69, 71, \r
+    73, 79, 78, 128, 76, 69, 71, 69, 84, 79, 211, 76, 69, 71, 128, 76, 69, \r
+    70, 84, 87, 65, 82, 68, 83, 128, 76, 69, 70, 84, 45, 84, 79, 45, 82, 73, \r
+    71, 72, 212, 76, 69, 70, 84, 45, 83, 84, 69, 205, 76, 69, 70, 84, 45, 83, \r
+    73, 68, 197, 76, 69, 70, 84, 45, 83, 72, 65, 68, 69, 196, 76, 69, 70, 84, \r
+    45, 80, 79, 73, 78, 84, 73, 78, 199, 76, 69, 70, 84, 45, 72, 65, 78, 196, \r
+    76, 69, 70, 84, 45, 70, 65, 67, 73, 78, 199, 76, 69, 70, 84, 128, 76, 69, \r
+    69, 75, 128, 76, 69, 69, 69, 69, 128, 76, 69, 65, 84, 72, 69, 82, 128, \r
+    76, 69, 65, 70, 128, 76, 69, 65, 68, 69, 82, 128, 76, 68, 65, 78, 128, \r
+    76, 68, 50, 128, 76, 67, 201, 76, 67, 197, 76, 65, 90, 217, 76, 65, 89, \r
+    65, 78, 78, 65, 128, 76, 65, 88, 128, 76, 65, 215, 76, 65, 85, 76, 65, \r
+    128, 76, 65, 85, 75, 65, 218, 76, 65, 84, 73, 78, 65, 84, 197, 76, 65, \r
+    84, 73, 75, 128, 76, 65, 84, 69, 82, 65, 204, 76, 65, 84, 197, 76, 65, \r
+    84, 128, 76, 65, 83, 212, 76, 65, 82, 89, 78, 71, 69, 65, 204, 76, 65, \r
+    82, 71, 69, 210, 76, 65, 82, 71, 197, 76, 65, 80, 128, 76, 65, 78, 71, \r
+    85, 65, 71, 197, 76, 65, 78, 69, 83, 128, 76, 65, 77, 69, 68, 72, 128, \r
+    76, 65, 77, 69, 68, 128, 76, 65, 77, 69, 196, 76, 65, 77, 69, 128, 76, \r
+    65, 77, 197, 76, 65, 77, 68, 65, 128, 76, 65, 77, 68, 128, 76, 65, 77, \r
+    66, 68, 193, 76, 65, 77, 65, 68, 72, 128, 76, 65, 76, 128, 76, 65, 204, \r
+    76, 65, 75, 75, 72, 65, 78, 71, 89, 65, 79, 128, 76, 65, 74, 65, 78, 89, \r
+    65, 76, 65, 78, 128, 76, 65, 201, 76, 65, 72, 83, 72, 85, 128, 76, 65, \r
+    71, 85, 83, 128, 76, 65, 71, 213, 76, 65, 71, 65, 82, 128, 76, 65, 71, \r
+    65, 210, 76, 65, 71, 65, 66, 128, 76, 65, 71, 65, 194, 76, 65, 69, 86, \r
+    128, 76, 65, 69, 128, 76, 65, 67, 75, 128, 76, 65, 67, 65, 128, 76, 65, \r
+    66, 79, 85, 82, 73, 78, 71, 128, 76, 65, 66, 79, 82, 128, 76, 65, 66, 73, \r
+    65, 76, 73, 90, 65, 84, 73, 79, 206, 76, 65, 66, 65, 84, 128, 76, 65, 65, \r
+    78, 128, 76, 65, 65, 77, 85, 128, 76, 65, 65, 73, 128, 76, 48, 48, 54, \r
+    65, 128, 76, 48, 48, 50, 65, 128, 76, 45, 84, 89, 80, 197, 76, 45, 83, \r
+    72, 65, 80, 69, 196, 75, 89, 85, 82, 73, 73, 128, 75, 89, 85, 128, 75, \r
+    89, 79, 128, 75, 89, 76, 73, 83, 77, 65, 128, 75, 89, 73, 128, 75, 89, \r
+    69, 69, 128, 75, 89, 69, 128, 75, 89, 65, 84, 72, 79, 211, 75, 89, 65, \r
+    65, 128, 75, 89, 65, 128, 75, 88, 87, 73, 128, 75, 88, 87, 69, 69, 128, \r
+    75, 88, 87, 69, 128, 75, 88, 87, 65, 65, 128, 75, 88, 87, 65, 128, 75, \r
+    88, 85, 128, 75, 88, 79, 128, 75, 88, 73, 128, 75, 88, 69, 69, 128, 75, \r
+    88, 69, 128, 75, 88, 65, 65, 128, 75, 88, 65, 128, 75, 87, 85, 51, 49, \r
+    56, 128, 75, 87, 79, 79, 128, 75, 87, 79, 128, 75, 87, 73, 73, 128, 75, \r
+    87, 73, 128, 75, 87, 69, 69, 128, 75, 87, 69, 128, 75, 87, 65, 89, 128, \r
+    75, 87, 65, 65, 128, 75, 86, 65, 128, 75, 86, 128, 75, 85, 88, 128, 75, \r
+    85, 85, 72, 128, 75, 85, 84, 128, 75, 85, 83, 77, 65, 128, 75, 85, 83, \r
+    72, 85, 50, 128, 75, 85, 82, 88, 128, 75, 85, 82, 85, 90, 69, 73, 82, 79, \r
+    128, 75, 85, 82, 84, 128, 75, 85, 82, 79, 79, 78, 69, 128, 75, 85, 82, \r
+    128, 75, 85, 210, 75, 85, 80, 128, 75, 85, 79, 88, 128, 75, 85, 79, 80, \r
+    128, 75, 85, 79, 128, 75, 85, 78, 71, 128, 75, 85, 78, 68, 68, 65, 76, \r
+    73, 89, 65, 128, 75, 85, 76, 128, 75, 85, 204, 75, 85, 55, 128, 75, 85, \r
+    52, 128, 75, 85, 180, 75, 85, 51, 128, 75, 85, 179, 75, 84, 128, 75, 83, \r
+    83, 65, 128, 75, 83, 73, 128, 75, 82, 69, 77, 65, 83, 84, 73, 128, 75, \r
+    82, 65, 84, 73, 77, 79, 89, 80, 79, 82, 82, 79, 79, 78, 128, 75, 82, 65, \r
+    84, 73, 77, 79, 75, 79, 85, 70, 73, 83, 77, 65, 128, 75, 82, 65, 84, 73, \r
+    77, 65, 84, 65, 128, 75, 82, 65, 84, 73, 77, 193, 75, 80, 85, 128, 75, \r
+    80, 79, 79, 128, 75, 80, 79, 128, 75, 80, 73, 128, 75, 80, 69, 78, 128, \r
+    75, 80, 69, 69, 128, 75, 80, 69, 128, 75, 80, 65, 78, 128, 75, 80, 65, \r
+    128, 75, 79, 88, 128, 75, 79, 86, 85, 85, 128, 75, 79, 84, 79, 128, 75, \r
+    79, 82, 85, 78, 65, 128, 75, 79, 82, 79, 78, 73, 83, 128, 75, 79, 82, 69, \r
+    65, 206, 75, 79, 82, 65, 78, 73, 195, 75, 79, 81, 78, 68, 79, 78, 128, \r
+    75, 79, 80, 80, 65, 128, 75, 79, 80, 128, 75, 79, 79, 80, 79, 128, 75, \r
+    79, 79, 77, 85, 85, 84, 128, 75, 79, 79, 128, 75, 79, 78, 84, 69, 86, 77, \r
+    65, 128, 75, 79, 78, 84, 69, 86, 77, 193, 75, 79, 77, 201, 75, 79, 77, \r
+    66, 85, 86, 65, 128, 75, 79, 77, 66, 85, 86, 193, 75, 79, 77, 66, 213, \r
+    75, 79, 75, 128, 75, 79, 203, 75, 79, 73, 128, 75, 79, 201, 75, 79, 72, \r
+    128, 75, 79, 71, 72, 79, 77, 128, 75, 79, 69, 84, 128, 75, 79, 65, 128, \r
+    75, 78, 73, 71, 72, 84, 128, 75, 78, 73, 70, 69, 128, 75, 78, 73, 70, \r
+    197, 75, 77, 128, 75, 205, 75, 76, 73, 84, 79, 78, 128, 75, 76, 65, 83, \r
+    77, 65, 128, 75, 76, 65, 83, 77, 193, 75, 76, 65, 128, 75, 76, 128, 75, \r
+    75, 85, 128, 75, 75, 79, 128, 75, 75, 73, 128, 75, 75, 69, 69, 128, 75, \r
+    75, 69, 128, 75, 75, 65, 128, 75, 75, 128, 75, 74, 69, 128, 75, 73, 89, \r
+    69, 79, 75, 45, 84, 73, 75, 69, 85, 84, 128, 75, 73, 89, 69, 79, 75, 45, \r
+    83, 73, 79, 83, 45, 75, 73, 89, 69, 79, 75, 128, 75, 73, 89, 69, 79, 75, \r
+    45, 82, 73, 69, 85, 76, 128, 75, 73, 89, 69, 79, 75, 45, 80, 73, 69, 85, \r
+    80, 128, 75, 73, 89, 69, 79, 75, 45, 78, 73, 69, 85, 78, 128, 75, 73, 89, \r
+    69, 79, 75, 45, 75, 72, 73, 69, 85, 75, 72, 128, 75, 73, 89, 69, 79, 75, \r
+    45, 67, 72, 73, 69, 85, 67, 72, 128, 75, 73, 89, 69, 79, 203, 75, 73, 88, \r
+    128, 75, 73, 84, 128, 75, 73, 83, 73, 77, 53, 128, 75, 73, 83, 73, 77, \r
+    181, 75, 73, 83, 72, 128, 75, 73, 83, 65, 76, 128, 75, 73, 82, 79, 87, \r
+    65, 84, 84, 79, 128, 75, 73, 82, 79, 77, 69, 69, 84, 79, 82, 85, 128, 75, \r
+    73, 82, 79, 71, 85, 82, 65, 77, 85, 128, 75, 73, 82, 79, 128, 75, 73, 82, \r
+    71, 72, 73, 218, 75, 73, 80, 128, 75, 73, 208, 75, 73, 78, 83, 72, 73, \r
+    80, 128, 75, 73, 78, 68, 69, 82, 71, 65, 82, 84, 69, 78, 128, 75, 73, 73, \r
+    128, 75, 73, 72, 128, 75, 73, 69, 88, 128, 75, 73, 69, 80, 128, 75, 73, \r
+    69, 128, 75, 73, 68, 128, 75, 73, 196, 75, 73, 67, 75, 128, 75, 72, 90, \r
+    128, 75, 72, 87, 65, 73, 128, 75, 72, 85, 69, 78, 45, 76, 85, 197, 75, \r
+    72, 85, 69, 206, 75, 72, 85, 65, 84, 128, 75, 72, 79, 85, 128, 75, 72, \r
+    79, 212, 75, 72, 79, 78, 128, 75, 72, 79, 77, 85, 84, 128, 75, 72, 79, \r
+    128, 75, 72, 207, 75, 72, 73, 84, 128, 75, 72, 73, 69, 85, 75, 200, 75, \r
+    72, 73, 128, 75, 72, 72, 79, 128, 75, 72, 72, 65, 128, 75, 72, 69, 84, \r
+    72, 128, 75, 72, 69, 73, 128, 75, 72, 69, 69, 128, 75, 72, 69, 128, 75, \r
+    72, 65, 82, 128, 75, 72, 65, 80, 72, 128, 75, 72, 65, 78, 199, 75, 72, \r
+    65, 78, 68, 193, 75, 72, 65, 78, 128, 75, 72, 65, 77, 84, 201, 75, 72, \r
+    65, 75, 65, 83, 83, 73, 65, 206, 75, 72, 65, 73, 128, 75, 72, 65, 72, \r
+    128, 75, 72, 65, 200, 75, 72, 65, 65, 128, 75, 71, 128, 75, 69, 89, 67, \r
+    65, 80, 128, 75, 69, 89, 66, 79, 65, 82, 68, 128, 75, 69, 89, 128, 75, \r
+    69, 217, 75, 69, 88, 128, 75, 69, 85, 88, 128, 75, 69, 84, 84, 201, 75, \r
+    69, 83, 72, 50, 128, 75, 69, 82, 69, 84, 128, 75, 69, 79, 87, 128, 75, \r
+    69, 78, 84, 73, 77, 65, 84, 65, 128, 75, 69, 78, 84, 73, 77, 65, 84, 193, \r
+    75, 69, 78, 84, 73, 77, 193, 75, 69, 78, 65, 84, 128, 75, 69, 78, 128, \r
+    75, 69, 77, 80, 85, 76, 128, 75, 69, 77, 80, 85, 204, 75, 69, 77, 80, 76, \r
+    73, 128, 75, 69, 77, 80, 76, 201, 75, 69, 77, 80, 72, 82, 69, 78, 71, \r
+    128, 75, 69, 77, 66, 65, 78, 71, 128, 75, 69, 76, 86, 73, 206, 75, 69, \r
+    72, 69, 72, 128, 75, 69, 72, 69, 200, 75, 69, 72, 128, 75, 69, 70, 85, \r
+    76, 65, 128, 75, 69, 69, 83, 85, 128, 75, 69, 69, 80, 73, 78, 199, 75, \r
+    69, 69, 78, 71, 128, 75, 67, 65, 76, 128, 75, 66, 128, 75, 65, 90, 65, \r
+    75, 200, 75, 65, 89, 65, 78, 78, 65, 128, 75, 65, 89, 65, 200, 75, 65, \r
+    88, 128, 75, 65, 87, 73, 128, 75, 65, 86, 89, 75, 65, 128, 75, 65, 85, \r
+    78, 65, 128, 75, 65, 85, 206, 75, 65, 84, 79, 128, 75, 65, 84, 72, 73, \r
+    83, 84, 73, 128, 75, 65, 84, 72, 65, 75, 193, 75, 65, 84, 65, 86, 65, 83, \r
+    77, 65, 128, 75, 65, 84, 65, 86, 193, 75, 65, 84, 65, 75, 65, 78, 65, 45, \r
+    72, 73, 82, 65, 71, 65, 78, 193, 75, 65, 83, 82, 65, 84, 65, 78, 128, 75, \r
+    65, 83, 82, 65, 84, 65, 206, 75, 65, 83, 82, 65, 128, 75, 65, 83, 82, \r
+    193, 75, 65, 83, 75, 65, 76, 128, 75, 65, 83, 75, 65, 204, 75, 65, 83, \r
+    72, 77, 73, 82, 201, 75, 65, 82, 83, 72, 65, 78, 65, 128, 75, 65, 82, 79, \r
+    82, 73, 73, 128, 75, 65, 82, 69, 206, 75, 65, 82, 65, 84, 84, 79, 128, \r
+    75, 65, 82, 65, 78, 128, 75, 65, 80, 89, 69, 79, 85, 78, 83, 83, 65, 78, \r
+    71, 80, 73, 69, 85, 80, 128, 75, 65, 80, 89, 69, 79, 85, 78, 82, 73, 69, \r
+    85, 76, 128, 75, 65, 80, 89, 69, 79, 85, 78, 80, 72, 73, 69, 85, 80, 72, \r
+    128, 75, 65, 80, 89, 69, 79, 85, 78, 77, 73, 69, 85, 77, 128, 75, 65, 80, \r
+    80, 65, 128, 75, 65, 80, 80, 193, 75, 65, 80, 79, 128, 75, 65, 80, 72, \r
+    128, 75, 65, 80, 65, 76, 128, 75, 65, 80, 65, 128, 75, 65, 80, 128, 75, \r
+    65, 78, 84, 65, 74, 193, 75, 65, 78, 71, 128, 75, 65, 78, 199, 75, 65, \r
+    78, 65, 75, 79, 128, 75, 65, 77, 52, 128, 75, 65, 77, 50, 128, 75, 65, \r
+    75, 79, 128, 75, 65, 75, 65, 66, 65, 84, 128, 75, 65, 75, 128, 75, 65, \r
+    203, 75, 65, 73, 82, 73, 128, 75, 65, 73, 128, 75, 65, 201, 75, 65, 70, \r
+    128, 75, 65, 198, 75, 65, 68, 53, 128, 75, 65, 68, 181, 75, 65, 68, 52, \r
+    128, 75, 65, 68, 51, 128, 75, 65, 68, 179, 75, 65, 68, 50, 128, 75, 65, \r
+    66, 193, 75, 65, 66, 128, 75, 65, 65, 73, 128, 75, 65, 65, 70, 85, 128, \r
+    75, 65, 65, 70, 128, 75, 65, 50, 128, 75, 65, 178, 75, 48, 48, 56, 128, \r
+    75, 48, 48, 55, 128, 75, 48, 48, 54, 128, 75, 48, 48, 53, 128, 75, 48, \r
+    48, 52, 128, 75, 48, 48, 51, 128, 75, 48, 48, 50, 128, 75, 48, 48, 49, \r
+    128, 74, 87, 65, 128, 74, 85, 85, 128, 74, 85, 84, 128, 74, 85, 80, 73, \r
+    84, 69, 82, 128, 74, 85, 79, 84, 128, 74, 85, 79, 80, 128, 74, 85, 78, \r
+    79, 128, 74, 85, 78, 69, 128, 74, 85, 76, 89, 128, 74, 85, 69, 85, 73, \r
+    128, 74, 85, 68, 71, 69, 128, 74, 85, 68, 69, 79, 45, 83, 80, 65, 78, 73, \r
+    83, 200, 74, 79, 89, 79, 85, 211, 74, 79, 89, 128, 74, 79, 212, 74, 79, \r
+    78, 71, 128, 74, 79, 78, 193, 74, 79, 75, 69, 82, 128, 74, 79, 73, 78, \r
+    69, 68, 128, 74, 79, 73, 78, 128, 74, 79, 65, 128, 74, 74, 89, 88, 128, \r
+    74, 74, 89, 84, 128, 74, 74, 89, 80, 128, 74, 74, 89, 128, 74, 74, 85, \r
+    88, 128, 74, 74, 85, 84, 128, 74, 74, 85, 82, 88, 128, 74, 74, 85, 82, \r
+    128, 74, 74, 85, 80, 128, 74, 74, 85, 79, 88, 128, 74, 74, 85, 79, 80, \r
+    128, 74, 74, 85, 79, 128, 74, 74, 85, 128, 74, 74, 79, 88, 128, 74, 74, \r
+    79, 84, 128, 74, 74, 79, 80, 128, 74, 74, 79, 128, 74, 74, 73, 88, 128, \r
+    74, 74, 73, 84, 128, 74, 74, 73, 80, 128, 74, 74, 73, 69, 88, 128, 74, \r
+    74, 73, 69, 84, 128, 74, 74, 73, 69, 80, 128, 74, 74, 73, 69, 128, 74, \r
+    74, 73, 128, 74, 74, 69, 69, 128, 74, 74, 69, 128, 74, 74, 65, 128, 74, \r
+    73, 76, 128, 74, 73, 72, 86, 65, 77, 85, 76, 73, 89, 65, 128, 74, 73, 65, \r
+    128, 74, 72, 79, 128, 74, 72, 69, 72, 128, 74, 72, 65, 78, 128, 74, 72, \r
+    65, 77, 128, 74, 72, 65, 128, 74, 69, 85, 128, 74, 69, 82, 85, 83, 65, \r
+    76, 69, 77, 128, 74, 69, 82, 65, 206, 74, 69, 82, 65, 128, 74, 69, 82, \r
+    128, 74, 69, 72, 128, 74, 69, 200, 74, 69, 71, 79, 71, 65, 78, 128, 74, \r
+    69, 69, 77, 128, 74, 65, 89, 65, 78, 78, 65, 128, 74, 65, 86, 73, 89, 65, \r
+    78, 73, 128, 74, 65, 82, 128, 74, 65, 80, 65, 78, 69, 83, 197, 74, 65, \r
+    78, 85, 65, 82, 89, 128, 74, 65, 76, 76, 65, 74, 65, 76, 65, 76, 79, 85, \r
+    72, 79, 85, 128, 74, 65, 68, 69, 128, 74, 65, 65, 128, 74, 45, 83, 73, \r
+    77, 80, 76, 73, 70, 73, 69, 196, 202, 73, 90, 72, 73, 84, 83, 65, 128, \r
+    73, 90, 72, 73, 84, 83, 193, 73, 90, 72, 69, 128, 73, 89, 69, 75, 128, \r
+    73, 89, 65, 78, 78, 65, 128, 73, 85, 74, 65, 128, 73, 85, 128, 73, 84, \r
+    69, 82, 65, 84, 73, 79, 206, 73, 84, 69, 77, 128, 73, 83, 83, 72, 65, 82, \r
+    128, 73, 83, 211, 73, 83, 79, 78, 128, 73, 83, 79, 206, 73, 83, 69, 78, \r
+    45, 73, 83, 69, 78, 128, 73, 83, 65, 75, 73, 193, 73, 83, 45, 80, 73, 76, \r
+    76, 65, 128, 73, 82, 85, 89, 65, 78, 78, 65, 128, 73, 82, 85, 85, 89, 65, \r
+    78, 78, 65, 128, 73, 79, 84, 73, 70, 73, 69, 196, 73, 79, 84, 65, 84, 69, \r
+    196, 73, 79, 84, 65, 128, 73, 79, 84, 193, 73, 79, 82, 128, 73, 79, 68, \r
+    72, 65, 68, 72, 128, 73, 78, 86, 73, 83, 73, 66, 76, 197, 73, 78, 86, 69, \r
+    82, 84, 69, 68, 128, 73, 78, 86, 69, 82, 84, 69, 196, 73, 78, 86, 69, 82, \r
+    83, 197, 73, 78, 84, 73, 128, 73, 78, 84, 69, 82, 83, 89, 76, 76, 65, 66, \r
+    73, 195, 73, 78, 84, 69, 82, 83, 69, 67, 84, 73, 79, 78, 128, 73, 78, 84, \r
+    69, 82, 83, 69, 67, 84, 73, 79, 206, 73, 78, 84, 69, 82, 83, 69, 67, 84, \r
+    73, 78, 199, 73, 78, 84, 69, 82, 82, 79, 66, 65, 78, 71, 128, 73, 78, 84, \r
+    69, 82, 80, 79, 76, 65, 84, 73, 79, 206, 73, 78, 84, 69, 82, 76, 79, 67, \r
+    75, 69, 196, 73, 78, 84, 69, 82, 76, 73, 78, 69, 65, 210, 73, 78, 84, 69, \r
+    82, 73, 79, 210, 73, 78, 84, 69, 82, 69, 83, 212, 73, 78, 84, 69, 82, 67, \r
+    65, 76, 65, 84, 69, 128, 73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 78, 128, \r
+    73, 78, 84, 69, 71, 82, 65, 84, 73, 79, 206, 73, 78, 84, 69, 71, 82, 65, \r
+    76, 128, 73, 78, 84, 69, 71, 82, 65, 204, 73, 78, 83, 85, 76, 65, 210, \r
+    73, 78, 83, 84, 82, 85, 77, 69, 78, 84, 65, 204, 73, 78, 83, 73, 68, 69, \r
+    128, 73, 78, 83, 69, 82, 84, 73, 79, 206, 73, 78, 83, 69, 67, 84, 128, \r
+    73, 78, 83, 67, 82, 73, 80, 84, 73, 79, 78, 65, 204, 73, 78, 78, 79, 67, \r
+    69, 78, 67, 69, 128, 73, 78, 78, 78, 128, 73, 78, 78, 69, 82, 128, 73, \r
+    78, 78, 69, 210, 73, 78, 78, 128, 73, 78, 73, 78, 71, 85, 128, 73, 78, \r
+    73, 128, 73, 78, 72, 73, 66, 73, 212, 73, 78, 72, 69, 82, 69, 78, 212, \r
+    73, 78, 71, 87, 65, 90, 128, 73, 78, 70, 79, 82, 77, 65, 84, 73, 79, 206, \r
+    73, 78, 70, 76, 85, 69, 78, 67, 69, 128, 73, 78, 70, 73, 78, 73, 84, 89, \r
+    128, 73, 78, 70, 73, 78, 73, 84, 217, 73, 78, 68, 85, 83, 84, 82, 73, 65, \r
+    204, 73, 78, 68, 73, 82, 69, 67, 212, 73, 78, 68, 73, 67, 65, 84, 79, 82, \r
+    128, 73, 78, 68, 73, 195, 73, 78, 68, 69, 88, 128, 73, 78, 68, 69, 80, \r
+    69, 78, 68, 69, 78, 212, 73, 78, 67, 82, 69, 77, 69, 78, 84, 128, 73, 78, \r
+    67, 82, 69, 65, 83, 69, 211, 73, 78, 67, 82, 69, 65, 83, 69, 128, 73, 78, \r
+    67, 79, 77, 80, 76, 69, 84, 197, 73, 78, 67, 76, 85, 68, 73, 78, 199, 73, \r
+    78, 67, 72, 128, 73, 78, 65, 80, 128, 73, 78, 45, 65, 76, 65, 70, 128, \r
+    73, 77, 80, 69, 82, 73, 65, 204, 73, 77, 80, 69, 82, 70, 69, 67, 84, 85, \r
+    205, 73, 77, 80, 69, 82, 70, 69, 67, 84, 65, 128, 73, 77, 80, 69, 82, 70, \r
+    69, 67, 84, 193, 73, 77, 73, 83, 69, 79, 211, 73, 77, 73, 78, 51, 128, \r
+    73, 77, 73, 78, 128, 73, 77, 73, 206, 73, 77, 73, 70, 84, 72, 79, 82, 79, \r
+    78, 128, 73, 77, 73, 70, 84, 72, 79, 82, 65, 128, 73, 77, 73, 70, 79, 78, \r
+    79, 78, 128, 73, 77, 73, 68, 73, 65, 82, 71, 79, 78, 128, 73, 77, 65, 71, \r
+    197, 73, 76, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 89, 128, 73, 76, \r
+    85, 85, 89, 65, 78, 78, 65, 128, 73, 76, 85, 84, 128, 73, 76, 73, 77, 77, \r
+    85, 52, 128, 73, 76, 73, 77, 77, 85, 51, 128, 73, 76, 73, 77, 77, 85, \r
+    128, 73, 76, 73, 77, 77, 213, 73, 76, 50, 128, 73, 75, 65, 82, 65, 128, \r
+    73, 75, 65, 82, 193, 73, 74, 128, 73, 73, 89, 65, 78, 78, 65, 128, 73, \r
+    71, 73, 128, 73, 71, 201, 73, 71, 71, 87, 83, 128, 73, 70, 73, 78, 128, \r
+    73, 69, 85, 78, 71, 45, 84, 73, 75, 69, 85, 84, 128, 73, 69, 85, 78, 71, \r
+    45, 84, 72, 73, 69, 85, 84, 72, 128, 73, 69, 85, 78, 71, 45, 83, 83, 65, \r
+    78, 71, 75, 73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, 82, 73, 69, \r
+    85, 76, 128, 73, 69, 85, 78, 71, 45, 80, 73, 69, 85, 80, 128, 73, 69, 85, \r
+    78, 71, 45, 80, 72, 73, 69, 85, 80, 72, 128, 73, 69, 85, 78, 71, 45, 75, \r
+    73, 89, 69, 79, 75, 128, 73, 69, 85, 78, 71, 45, 75, 72, 73, 69, 85, 75, \r
+    72, 128, 73, 69, 85, 78, 71, 45, 67, 73, 69, 85, 67, 128, 73, 69, 85, 78, \r
+    71, 45, 67, 72, 73, 69, 85, 67, 72, 128, 73, 69, 85, 78, 199, 73, 68, 76, \r
+    69, 128, 73, 68, 73, 77, 128, 73, 68, 73, 205, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 68, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 67, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 66, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 65, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 57, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 56, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 55, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    54, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 54, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    53, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 53, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 52, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    51, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 51, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 50, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 65, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, \r
+    48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 65, 48, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 70, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 69, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 68, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 65, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 55, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 54, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 53, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 52, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 69, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 67, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 56, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 50, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 67, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 65, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 54, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 49, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 56, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, \r
+    48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 52, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 70, 57, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 70, 57, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 57, 48, \r
+    52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 68, 55, 48, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 56, 67, 65, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 56, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 55, 68, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 55, 54, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 53, \r
+    49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 49, 50, 49, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 55, 48, 66, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 54, 70, 49, 52, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 54, 55, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 54, 54, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, \r
+    66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 57, 57, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 53, 53, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 54, 51, 53, 53, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 54, 51, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 54, 50, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, \r
+    53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 54, 50, 52, 66, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 70, 56, 67, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 53, 68, 69, 54, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 53, 66, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 53, 66, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, \r
+    50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 57, 49, 65, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 56, 70, 48, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 53, 52, 51, 57, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 53, 51, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 53, 51, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, \r
+    68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 52, 68, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 53, 50, 49, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 53, 49, 56, 68, 128, 73, 68, 69, 79, 71, 82, \r
+    65, 80, 72, 45, 52, 69, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 52, 69, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, \r
+    50, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 57, 128, \r
+    73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 52, 69, 48, 48, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 68, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 65, 49, 67, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 65, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 65, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 65, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, \r
+    49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 55, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 54, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 49, 52, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 65, 49, 51, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 65, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 65, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 65, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, \r
+    48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 69, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 68, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 67, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 66, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 65, 48, 65, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 65, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 65, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 65, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, \r
+    48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 53, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 52, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 65, 48, 50, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 65, 48, 49, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 65, 48, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 70, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 70, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    70, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 67, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 66, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 65, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 57, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 70, 56, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 70, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 70, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 70, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    70, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 51, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 50, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 70, 48, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 69, 70, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 69, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 69, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 69, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    69, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 65, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 57, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 56, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 55, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 69, 54, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 69, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 69, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 69, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    69, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 49, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 69, 48, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 69, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 68, 68, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 68, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 68, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 68, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    68, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 56, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 55, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 54, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 68, 53, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 68, 52, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 68, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 68, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 68, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    68, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 70, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 69, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 67, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 67, 66, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 67, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 67, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 67, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    67, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 54, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 53, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 52, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 67, 51, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 67, 50, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 67, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 67, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 66, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    66, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 68, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 67, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 65, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 66, 57, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 66, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 66, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 66, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    66, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 52, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 51, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 50, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 66, 49, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 66, 48, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 65, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 65, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 65, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    65, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 66, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 65, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 56, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 65, 55, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 65, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 65, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 65, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    65, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 50, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 49, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 65, 48, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 70, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 57, 69, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 57, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 57, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 57, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    57, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 57, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 56, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 54, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 57, 53, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 57, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 57, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 57, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    57, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 57, 48, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 70, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 69, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 68, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 56, 67, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 56, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 56, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 56, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    56, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 55, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 54, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 56, 52, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 56, 51, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 56, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 56, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 56, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    55, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 69, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 68, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 67, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 66, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 55, 65, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 55, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 55, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 55, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    55, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 53, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 52, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 55, 50, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 55, 49, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 55, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 54, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 54, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    54, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 67, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 66, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 65, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 57, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 54, 56, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 54, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 54, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 54, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    54, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 51, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 50, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 54, 48, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 53, 70, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 53, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 53, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 53, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    53, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 65, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 57, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 56, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 55, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 53, 54, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 53, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 53, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 53, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    53, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 49, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 53, 48, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 69, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 52, 68, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 52, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 52, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 52, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    52, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 56, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 55, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 54, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 52, 53, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 52, 52, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 52, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 52, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 52, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    52, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 70, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 69, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 67, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 51, 66, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 51, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 51, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 51, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    51, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 54, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 53, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 52, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 51, 51, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 51, 50, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 51, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 51, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 50, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    50, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 68, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 67, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 65, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 50, 57, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 50, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 50, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 50, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    50, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 52, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 51, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 50, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 50, 49, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 50, 48, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 49, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 49, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 49, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    49, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 66, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 65, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 56, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 49, 55, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 49, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 49, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 49, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    49, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 50, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 49, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 49, 48, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 70, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 48, 69, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 48, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 48, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 48, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    48, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 57, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 56, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 54, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 57, 48, 53, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 57, 48, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 57, 48, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 57, 48, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, \r
+    48, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 57, 48, 48, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 70, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 69, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 68, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 70, 67, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 70, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 70, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 70, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    70, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 55, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 54, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 70, 52, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 70, 51, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 70, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 70, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 70, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    69, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 69, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 68, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 67, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 66, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 69, 65, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 69, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 69, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 69, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    69, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 53, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 52, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 69, 50, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 69, 49, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 69, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 68, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 68, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    68, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 67, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 66, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 65, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 57, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 68, 56, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 68, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 68, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 68, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    68, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 51, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 50, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 68, 48, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 67, 70, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 67, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 67, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 67, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    67, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 65, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 57, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 56, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 55, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 67, 54, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 67, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 67, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 67, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    67, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 49, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 67, 48, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 69, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 66, 68, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 66, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 66, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 66, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    66, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 56, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 55, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 54, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 66, 53, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 66, 52, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 66, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 66, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 66, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    66, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 70, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 69, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 67, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 65, 66, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 65, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 65, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 65, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    65, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 54, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 53, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 52, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 65, 51, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 65, 50, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 65, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 65, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 57, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    57, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 68, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 67, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 65, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 57, 57, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 57, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 57, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 57, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    57, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 52, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 51, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 50, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 57, 49, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 57, 48, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 56, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 56, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 56, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    56, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 66, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 65, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 57, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 56, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 56, 55, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 56, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 56, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 56, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    56, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 50, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 49, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 56, 48, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 70, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 55, 69, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 55, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 55, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 55, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    55, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 57, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 56, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 55, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 54, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 55, 53, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 55, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 55, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 55, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    55, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 55, 48, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 70, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 69, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 68, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 54, 67, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 54, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 54, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 54, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    54, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 55, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 54, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 53, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 54, 52, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 54, 51, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 54, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 54, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 54, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    53, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 69, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 68, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 67, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 66, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 53, 65, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 53, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 53, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 53, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    53, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 53, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 52, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 51, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 53, 50, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 53, 49, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 53, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 52, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 52, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    52, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 67, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 66, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 65, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 57, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 52, 56, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 52, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 52, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 52, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    52, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 51, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 50, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 49, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 52, 48, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 51, 70, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 51, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 51, 68, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 51, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    51, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 65, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 57, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 56, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 55, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 51, 54, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 51, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 51, 52, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 51, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    51, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 49, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 51, 48, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 70, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 69, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 50, 68, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 50, 67, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 50, 66, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 50, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    50, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 56, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 55, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 54, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 50, 53, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 50, 52, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 50, 51, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 50, 50, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 50, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    50, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 70, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 69, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 68, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 67, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 49, 66, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 49, 65, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 49, 57, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 49, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    49, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 54, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 53, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 52, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 49, 51, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 49, 50, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 49, 49, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 49, 48, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 48, 70, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    48, 69, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 68, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 67, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 66, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 65, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 48, 57, 128, 73, 68, 69, 79, 71, 82, 65, \r
+    80, 72, 45, 50, 70, 56, 48, 56, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, \r
+    45, 50, 70, 56, 48, 55, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, \r
+    70, 56, 48, 54, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, \r
+    48, 53, 128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 52, \r
+    128, 73, 68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 51, 128, 73, \r
+    68, 69, 79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 50, 128, 73, 68, 69, \r
+    79, 71, 82, 65, 80, 72, 45, 50, 70, 56, 48, 49, 128, 73, 68, 69, 79, 71, \r
+    82, 65, 80, 72, 45, 50, 70, 56, 48, 48, 128, 73, 68, 69, 78, 84, 73, 70, \r
+    73, 67, 65, 84, 73, 79, 78, 128, 73, 68, 69, 78, 84, 73, 67, 65, 204, 73, \r
+    67, 72, 79, 85, 128, 73, 67, 72, 79, 83, 128, 73, 67, 72, 73, 77, 65, 84, \r
+    79, 83, 128, 73, 67, 72, 65, 68, 73, 78, 128, 73, 67, 69, 76, 65, 78, 68, \r
+    73, 67, 45, 89, 82, 128, 73, 66, 73, 70, 73, 76, 73, 128, 73, 65, 85, 68, \r
+    65, 128, 73, 48, 49, 53, 128, 73, 48, 49, 52, 128, 73, 48, 49, 51, 128, \r
+    73, 48, 49, 50, 128, 73, 48, 49, 49, 65, 128, 73, 48, 49, 49, 128, 73, \r
+    48, 49, 48, 65, 128, 73, 48, 49, 48, 128, 73, 48, 48, 57, 65, 128, 73, \r
+    48, 48, 57, 128, 73, 48, 48, 56, 128, 73, 48, 48, 55, 128, 73, 48, 48, \r
+    54, 128, 73, 48, 48, 53, 65, 128, 73, 48, 48, 53, 128, 73, 48, 48, 52, \r
+    128, 73, 48, 48, 51, 128, 73, 48, 48, 50, 128, 73, 48, 48, 49, 128, 73, \r
+    45, 89, 85, 128, 73, 45, 89, 79, 128, 73, 45, 89, 69, 79, 128, 73, 45, \r
+    89, 69, 128, 73, 45, 89, 65, 69, 128, 73, 45, 89, 65, 45, 79, 128, 73, \r
+    45, 89, 65, 128, 73, 45, 79, 45, 73, 128, 73, 45, 79, 128, 73, 45, 69, \r
+    85, 128, 73, 45, 66, 69, 65, 77, 128, 73, 45, 65, 82, 65, 69, 65, 128, \r
+    73, 45, 65, 128, 72, 90, 90, 90, 71, 128, 72, 90, 90, 90, 128, 72, 90, \r
+    90, 80, 128, 72, 90, 90, 128, 72, 90, 87, 71, 128, 72, 90, 87, 128, 72, \r
+    90, 84, 128, 72, 90, 71, 128, 72, 89, 83, 84, 69, 82, 69, 83, 73, 211, \r
+    72, 89, 80, 79, 68, 73, 65, 83, 84, 79, 76, 69, 128, 72, 89, 80, 72, 69, \r
+    78, 65, 84, 73, 79, 206, 72, 89, 80, 72, 69, 78, 45, 77, 73, 78, 85, 83, \r
+    128, 72, 89, 80, 72, 69, 78, 128, 72, 89, 80, 72, 69, 206, 72, 88, 87, \r
+    71, 128, 72, 88, 85, 79, 88, 128, 72, 88, 85, 79, 84, 128, 72, 88, 85, \r
+    79, 80, 128, 72, 88, 85, 79, 128, 72, 88, 79, 88, 128, 72, 88, 79, 84, \r
+    128, 72, 88, 79, 80, 128, 72, 88, 79, 128, 72, 88, 73, 88, 128, 72, 88, \r
+    73, 84, 128, 72, 88, 73, 80, 128, 72, 88, 73, 69, 88, 128, 72, 88, 73, \r
+    69, 84, 128, 72, 88, 73, 69, 80, 128, 72, 88, 73, 69, 128, 72, 88, 73, \r
+    128, 72, 88, 69, 88, 128, 72, 88, 69, 80, 128, 72, 88, 69, 128, 72, 88, \r
+    65, 88, 128, 72, 88, 65, 84, 128, 72, 88, 65, 80, 128, 72, 88, 65, 128, \r
+    72, 87, 85, 128, 72, 87, 65, 73, 82, 128, 72, 86, 128, 72, 85, 82, 65, \r
+    78, 128, 72, 85, 79, 84, 128, 72, 85, 78, 68, 82, 69, 68, 128, 72, 85, \r
+    78, 68, 82, 69, 196, 72, 85, 78, 128, 72, 85, 77, 65, 78, 128, 72, 85, \r
+    77, 65, 206, 72, 85, 76, 50, 128, 72, 85, 73, 73, 84, 79, 128, 72, 85, \r
+    66, 50, 128, 72, 85, 66, 178, 72, 85, 66, 128, 72, 85, 65, 82, 65, 68, \r
+    68, 79, 128, 72, 82, 89, 86, 78, 73, 193, 72, 80, 87, 71, 128, 72, 80, \r
+    65, 128, 72, 80, 128, 72, 79, 85, 82, 71, 76, 65, 83, 83, 128, 72, 79, \r
+    85, 210, 72, 79, 84, 65, 128, 72, 79, 82, 83, 69, 128, 72, 79, 82, 73, \r
+    90, 79, 78, 84, 65, 76, 76, 217, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, \r
+    45, 48, 54, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, \r
+    48, 54, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, \r
+    54, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, \r
+    45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, \r
+    48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, \r
+    49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 54, 45, 48, 48, \r
+    128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 54, 128, \r
+    72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 53, 128, 72, \r
+    79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 52, 128, 72, 79, \r
+    82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 51, 128, 72, 79, 82, \r
+    73, 90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 50, 128, 72, 79, 82, 73, \r
+    90, 79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 49, 128, 72, 79, 82, 73, 90, \r
+    79, 78, 84, 65, 76, 45, 48, 53, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, \r
+    78, 84, 65, 76, 45, 48, 52, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, \r
+    84, 65, 76, 45, 48, 52, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, \r
+    65, 76, 45, 48, 52, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, \r
+    76, 45, 48, 52, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, \r
+    45, 48, 52, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, \r
+    48, 52, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, \r
+    52, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, \r
+    45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, \r
+    48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, \r
+    52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 51, \r
+    128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 50, 128, \r
+    72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 49, 128, 72, \r
+    79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 51, 45, 48, 48, 128, 72, 79, \r
+    82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 54, 128, 72, 79, 82, \r
+    73, 90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 53, 128, 72, 79, 82, 73, \r
+    90, 79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 52, 128, 72, 79, 82, 73, 90, \r
+    79, 78, 84, 65, 76, 45, 48, 50, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, \r
+    78, 84, 65, 76, 45, 48, 50, 45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, \r
+    84, 65, 76, 45, 48, 50, 45, 48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, \r
+    65, 76, 45, 48, 50, 45, 48, 48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, \r
+    76, 45, 48, 49, 45, 48, 54, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, \r
+    45, 48, 49, 45, 48, 53, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, \r
+    48, 49, 45, 48, 52, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, \r
+    49, 45, 48, 51, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, \r
+    45, 48, 50, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, \r
+    48, 49, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 49, 45, 48, \r
+    48, 128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 54, \r
+    128, 72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 53, 128, \r
+    72, 79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 52, 128, 72, \r
+    79, 82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 51, 128, 72, 79, \r
+    82, 73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 50, 128, 72, 79, 82, \r
+    73, 90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 49, 128, 72, 79, 82, 73, \r
+    90, 79, 78, 84, 65, 76, 45, 48, 48, 45, 48, 48, 128, 72, 79, 82, 73, 90, \r
+    79, 78, 84, 65, 76, 128, 72, 79, 82, 73, 128, 72, 79, 82, 193, 72, 79, \r
+    79, 82, 85, 128, 72, 79, 79, 78, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, \r
+    67, 128, 72, 79, 77, 79, 84, 72, 69, 84, 73, 195, 72, 79, 76, 69, 128, \r
+    72, 79, 76, 68, 73, 78, 199, 72, 79, 76, 65, 77, 128, 72, 79, 76, 65, \r
+    205, 72, 79, 75, 65, 128, 72, 79, 73, 128, 72, 79, 69, 128, 72, 78, 85, \r
+    84, 128, 72, 78, 85, 79, 88, 128, 72, 78, 85, 79, 128, 72, 78, 79, 88, \r
+    128, 72, 78, 79, 84, 128, 72, 78, 79, 80, 128, 72, 78, 73, 88, 128, 72, \r
+    78, 73, 84, 128, 72, 78, 73, 80, 128, 72, 78, 73, 69, 88, 128, 72, 78, \r
+    73, 69, 84, 128, 72, 78, 73, 69, 80, 128, 72, 78, 73, 69, 128, 72, 78, \r
+    73, 128, 72, 78, 69, 88, 128, 72, 78, 69, 80, 128, 72, 78, 69, 128, 72, \r
+    78, 65, 88, 128, 72, 78, 65, 84, 128, 72, 78, 65, 80, 128, 72, 78, 65, \r
+    128, 72, 77, 89, 88, 128, 72, 77, 89, 82, 88, 128, 72, 77, 89, 82, 128, \r
+    72, 77, 89, 80, 128, 72, 77, 89, 128, 72, 77, 85, 88, 128, 72, 77, 85, \r
+    84, 128, 72, 77, 85, 82, 88, 128, 72, 77, 85, 82, 128, 72, 77, 85, 80, \r
+    128, 72, 77, 85, 79, 88, 128, 72, 77, 85, 79, 80, 128, 72, 77, 85, 79, \r
+    128, 72, 77, 85, 128, 72, 77, 79, 88, 128, 72, 77, 79, 84, 128, 72, 77, \r
+    79, 80, 128, 72, 77, 79, 128, 72, 77, 73, 88, 128, 72, 77, 73, 84, 128, \r
+    72, 77, 73, 80, 128, 72, 77, 73, 69, 88, 128, 72, 77, 73, 69, 80, 128, \r
+    72, 77, 73, 69, 128, 72, 77, 73, 128, 72, 77, 69, 128, 72, 77, 65, 88, \r
+    128, 72, 77, 65, 84, 128, 72, 77, 65, 80, 128, 72, 77, 65, 128, 72, 76, \r
+    89, 88, 128, 72, 76, 89, 84, 128, 72, 76, 89, 82, 88, 128, 72, 76, 89, \r
+    82, 128, 72, 76, 89, 80, 128, 72, 76, 89, 128, 72, 76, 85, 88, 128, 72, \r
+    76, 85, 84, 128, 72, 76, 85, 82, 88, 128, 72, 76, 85, 82, 128, 72, 76, \r
+    85, 80, 128, 72, 76, 85, 79, 88, 128, 72, 76, 85, 79, 80, 128, 72, 76, \r
+    85, 79, 128, 72, 76, 85, 128, 72, 76, 79, 88, 128, 72, 76, 79, 80, 128, \r
+    72, 76, 79, 128, 72, 76, 73, 88, 128, 72, 76, 73, 84, 128, 72, 76, 73, \r
+    80, 128, 72, 76, 73, 69, 88, 128, 72, 76, 73, 69, 80, 128, 72, 76, 73, \r
+    69, 128, 72, 76, 73, 128, 72, 76, 69, 88, 128, 72, 76, 69, 80, 128, 72, \r
+    76, 69, 128, 72, 76, 65, 88, 128, 72, 76, 65, 84, 128, 72, 76, 65, 80, \r
+    128, 72, 76, 65, 128, 72, 75, 128, 72, 73, 90, 66, 128, 72, 73, 83, 84, \r
+    79, 82, 73, 195, 72, 73, 82, 73, 81, 128, 72, 73, 71, 72, 45, 82, 69, 86, \r
+    69, 82, 83, 69, 68, 45, 185, 72, 73, 69, 88, 128, 72, 73, 69, 85, 72, 45, \r
+    83, 73, 79, 83, 128, 72, 73, 69, 85, 72, 45, 82, 73, 69, 85, 76, 128, 72, \r
+    73, 69, 85, 72, 45, 80, 73, 69, 85, 80, 128, 72, 73, 69, 85, 72, 45, 78, \r
+    73, 69, 85, 78, 128, 72, 73, 69, 85, 72, 45, 77, 73, 69, 85, 77, 128, 72, \r
+    73, 69, 85, 200, 72, 73, 69, 128, 72, 73, 68, 73, 78, 199, 72, 73, 68, \r
+    69, 84, 128, 72, 73, 68, 69, 128, 72, 72, 87, 65, 128, 72, 72, 85, 128, \r
+    72, 72, 73, 128, 72, 72, 69, 69, 128, 72, 72, 69, 128, 72, 72, 65, 65, \r
+    128, 72, 71, 128, 72, 69, 88, 73, 70, 79, 82, 205, 72, 69, 88, 65, 71, \r
+    79, 78, 128, 72, 69, 82, 85, 84, 85, 128, 72, 69, 82, 85, 128, 72, 69, \r
+    82, 77, 73, 84, 73, 65, 206, 72, 69, 82, 77, 73, 79, 78, 73, 65, 206, 72, \r
+    69, 82, 77, 69, 83, 128, 72, 69, 82, 65, 69, 85, 205, 72, 69, 78, 71, \r
+    128, 72, 69, 78, 199, 72, 69, 77, 80, 128, 72, 69, 76, 77, 69, 84, 128, \r
+    72, 69, 76, 77, 69, 212, 72, 69, 76, 205, 72, 69, 75, 85, 84, 65, 65, 82, \r
+    85, 128, 72, 69, 73, 83, 69, 73, 128, 72, 69, 65, 86, 89, 128, 72, 69, \r
+    65, 86, 69, 78, 76, 217, 72, 69, 65, 86, 69, 78, 128, 72, 69, 65, 86, 69, \r
+    206, 72, 69, 65, 82, 84, 128, 72, 69, 65, 82, 212, 72, 69, 65, 68, 83, \r
+    84, 82, 79, 75, 69, 128, 72, 69, 65, 68, 83, 84, 79, 78, 197, 72, 69, 65, \r
+    68, 73, 78, 71, 128, 72, 66, 65, 83, 65, 45, 69, 83, 65, 83, 193, 72, 66, \r
+    65, 83, 193, 72, 65, 89, 65, 78, 78, 65, 128, 72, 65, 86, 69, 128, 72, \r
+    65, 85, 80, 84, 83, 84, 73, 77, 77, 69, 128, 72, 65, 84, 72, 73, 128, 72, \r
+    65, 84, 69, 128, 72, 65, 84, 65, 198, 72, 65, 83, 69, 210, 72, 65, 83, \r
+    65, 78, 84, 65, 128, 72, 65, 82, 80, 79, 79, 78, 128, 72, 65, 82, 80, 79, \r
+    79, 206, 72, 65, 82, 77, 79, 78, 73, 67, 128, 72, 65, 82, 75, 76, 69, 65, \r
+    206, 72, 65, 82, 68, 78, 69, 83, 83, 128, 72, 65, 82, 196, 72, 65, 78, \r
+    85, 78, 79, 207, 72, 65, 78, 71, 90, 72, 79, 213, 72, 65, 78, 68, 83, \r
+    128, 72, 65, 78, 68, 76, 69, 83, 128, 72, 65, 78, 68, 128, 72, 65, 78, \r
+    45, 65, 75, 65, 84, 128, 72, 65, 77, 90, 65, 128, 72, 65, 77, 77, 69, \r
+    210, 72, 65, 76, 70, 128, 72, 65, 76, 66, 69, 82, 68, 128, 72, 65, 76, \r
+    65, 78, 84, 65, 128, 72, 65, 73, 84, 85, 128, 72, 65, 73, 82, 128, 72, \r
+    65, 71, 76, 65, 218, 72, 65, 71, 76, 128, 72, 65, 70, 85, 75, 72, 65, \r
+    128, 72, 65, 70, 85, 75, 72, 128, 72, 65, 69, 71, 204, 72, 65, 69, 128, \r
+    72, 65, 65, 82, 85, 128, 72, 65, 65, 77, 128, 72, 65, 193, 72, 65, 45, \r
+    72, 65, 128, 72, 48, 48, 56, 128, 72, 48, 48, 55, 128, 72, 48, 48, 54, \r
+    65, 128, 72, 48, 48, 54, 128, 72, 48, 48, 53, 128, 72, 48, 48, 52, 128, \r
+    72, 48, 48, 51, 128, 72, 48, 48, 50, 128, 72, 48, 48, 49, 128, 72, 45, \r
+    84, 89, 80, 197, 71, 89, 85, 128, 71, 89, 79, 78, 128, 71, 89, 79, 128, \r
+    71, 89, 73, 128, 71, 89, 70, 213, 71, 89, 69, 69, 128, 71, 89, 65, 83, \r
+    128, 71, 89, 65, 65, 128, 71, 89, 65, 128, 71, 89, 128, 71, 87, 85, 128, \r
+    71, 87, 73, 128, 71, 87, 69, 69, 128, 71, 87, 69, 128, 71, 87, 65, 65, \r
+    128, 71, 87, 65, 128, 71, 86, 128, 71, 85, 82, 85, 83, 72, 128, 71, 85, \r
+    82, 85, 78, 128, 71, 85, 82, 65, 77, 85, 84, 79, 78, 128, 71, 85, 82, 55, \r
+    128, 71, 85, 78, 85, 128, 71, 85, 78, 213, 71, 85, 77, 128, 71, 85, 205, \r
+    71, 85, 76, 128, 71, 85, 199, 71, 85, 69, 72, 128, 71, 85, 69, 200, 71, \r
+    85, 68, 128, 71, 85, 196, 71, 85, 65, 82, 68, 69, 68, 78, 69, 83, 83, \r
+    128, 71, 85, 65, 82, 65, 78, 201, 71, 85, 178, 71, 84, 69, 210, 71, 83, \r
+    85, 77, 128, 71, 83, 85, 205, 71, 82, 213, 71, 82, 79, 85, 78, 68, 128, \r
+    71, 82, 79, 78, 84, 72, 73, 83, 77, 65, 84, 65, 128, 71, 82, 69, 71, 79, \r
+    82, 73, 65, 206, 71, 82, 69, 69, 206, 71, 82, 69, 65, 84, 78, 69, 83, 83, \r
+    128, 71, 82, 69, 65, 84, 69, 82, 45, 84, 72, 65, 78, 128, 71, 82, 69, 65, \r
+    84, 69, 82, 45, 84, 72, 65, 206, 71, 82, 69, 65, 84, 69, 210, 71, 82, 69, \r
+    65, 212, 71, 82, 65, 86, 69, 89, 65, 82, 196, 71, 82, 65, 86, 69, 45, 77, \r
+    65, 67, 82, 79, 78, 128, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 45, \r
+    71, 82, 65, 86, 69, 128, 71, 82, 65, 86, 197, 71, 82, 65, 84, 69, 82, \r
+    128, 71, 82, 65, 83, 83, 128, 71, 82, 65, 83, 211, 71, 82, 65, 80, 72, \r
+    69, 77, 197, 71, 82, 65, 77, 77, 193, 71, 82, 65, 73, 78, 128, 71, 82, \r
+    65, 67, 69, 128, 71, 82, 65, 67, 197, 71, 80, 65, 128, 71, 79, 82, 84, \r
+    72, 77, 73, 75, 79, 206, 71, 79, 82, 84, 128, 71, 79, 82, 71, 79, 84, 69, \r
+    82, 73, 128, 71, 79, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, \r
+    71, 79, 82, 71, 79, 206, 71, 79, 82, 71, 73, 128, 71, 79, 82, 65, 128, \r
+    71, 79, 78, 71, 128, 71, 79, 76, 68, 128, 71, 79, 75, 128, 71, 79, 73, \r
+    78, 199, 71, 79, 65, 76, 128, 71, 79, 65, 204, 71, 79, 65, 128, 71, 78, \r
+    89, 73, 83, 128, 71, 78, 65, 86, 73, 89, 65, 78, 73, 128, 71, 76, 79, 84, \r
+    84, 65, 204, 71, 76, 73, 83, 83, 65, 78, 68, 207, 71, 76, 69, 73, 67, \r
+    200, 71, 76, 65, 71, 79, 76, 73, 128, 71, 76, 65, 128, 71, 74, 69, 128, \r
+    71, 73, 88, 128, 71, 73, 84, 128, 71, 73, 83, 72, 128, 71, 73, 83, 200, \r
+    71, 73, 83, 65, 76, 128, 71, 73, 82, 85, 68, 65, 65, 128, 71, 73, 82, 51, \r
+    128, 71, 73, 82, 179, 71, 73, 82, 50, 128, 71, 73, 82, 178, 71, 73, 80, \r
+    128, 71, 73, 78, 73, 73, 128, 71, 73, 77, 69, 76, 128, 71, 73, 77, 69, \r
+    204, 71, 73, 77, 128, 71, 73, 71, 65, 128, 71, 73, 69, 84, 128, 71, 73, \r
+    68, 73, 77, 128, 71, 73, 66, 65, 128, 71, 73, 52, 128, 71, 73, 180, 71, \r
+    72, 90, 128, 71, 72, 87, 65, 128, 71, 72, 85, 78, 78, 65, 128, 71, 72, \r
+    85, 78, 78, 193, 71, 72, 85, 128, 71, 72, 79, 85, 128, 71, 72, 79, 83, \r
+    84, 128, 71, 72, 79, 128, 71, 72, 73, 128, 71, 72, 72, 65, 128, 71, 72, \r
+    69, 69, 128, 71, 72, 69, 128, 71, 72, 197, 71, 72, 65, 89, 78, 128, 71, \r
+    72, 65, 78, 128, 71, 72, 65, 77, 65, 76, 128, 71, 72, 65, 73, 78, 85, \r
+    128, 71, 72, 65, 73, 78, 128, 71, 72, 65, 73, 206, 71, 72, 65, 68, 128, \r
+    71, 72, 65, 128, 71, 71, 87, 73, 128, 71, 71, 87, 69, 69, 128, 71, 71, \r
+    87, 69, 128, 71, 71, 87, 65, 65, 128, 71, 71, 87, 65, 128, 71, 71, 85, \r
+    88, 128, 71, 71, 85, 84, 128, 71, 71, 85, 82, 88, 128, 71, 71, 85, 82, \r
+    128, 71, 71, 85, 80, 128, 71, 71, 85, 79, 88, 128, 71, 71, 85, 79, 84, \r
+    128, 71, 71, 85, 79, 80, 128, 71, 71, 85, 79, 128, 71, 71, 79, 88, 128, \r
+    71, 71, 79, 84, 128, 71, 71, 79, 80, 128, 71, 71, 73, 88, 128, 71, 71, \r
+    73, 84, 128, 71, 71, 73, 69, 88, 128, 71, 71, 73, 69, 80, 128, 71, 71, \r
+    73, 69, 128, 71, 71, 69, 88, 128, 71, 71, 69, 84, 128, 71, 71, 69, 80, \r
+    128, 71, 71, 65, 88, 128, 71, 71, 65, 84, 128, 71, 71, 65, 80, 128, 71, \r
+    71, 65, 65, 128, 71, 69, 84, 193, 71, 69, 83, 72, 85, 128, 71, 69, 83, \r
+    72, 84, 73, 78, 128, 71, 69, 83, 72, 84, 73, 206, 71, 69, 83, 72, 50, \r
+    128, 71, 69, 82, 83, 72, 65, 89, 73, 77, 128, 71, 69, 82, 77, 65, 206, \r
+    71, 69, 82, 69, 83, 72, 128, 71, 69, 82, 69, 83, 200, 71, 69, 79, 77, 69, \r
+    84, 82, 73, 67, 65, 76, 76, 217, 71, 69, 79, 77, 69, 84, 82, 73, 195, 71, \r
+    69, 78, 84, 76, 197, 71, 69, 78, 73, 84, 73, 86, 69, 128, 71, 69, 78, 73, \r
+    75, 201, 71, 69, 78, 69, 82, 73, 195, 71, 69, 77, 73, 78, 73, 128, 71, \r
+    69, 77, 73, 78, 65, 84, 73, 79, 206, 71, 69, 68, 79, 76, 65, 128, 71, 69, \r
+    68, 69, 128, 71, 69, 66, 207, 71, 69, 66, 193, 71, 69, 65, 82, 128, 71, \r
+    69, 65, 210, 71, 68, 65, 78, 128, 71, 67, 73, 71, 128, 71, 67, 65, 206, \r
+    71, 66, 79, 78, 128, 71, 66, 69, 78, 128, 71, 66, 65, 75, 85, 82, 85, 78, \r
+    69, 78, 128, 71, 66, 128, 71, 65, 89, 65, 78, 85, 75, 73, 84, 84, 65, \r
+    128, 71, 65, 89, 65, 78, 78, 65, 128, 71, 65, 89, 128, 71, 65, 85, 78, \r
+    84, 76, 69, 84, 128, 71, 65, 84, 72, 69, 82, 73, 78, 71, 128, 71, 65, 84, \r
+    72, 69, 82, 73, 78, 199, 71, 65, 84, 69, 128, 71, 65, 83, 72, 65, 78, \r
+    128, 71, 65, 82, 83, 72, 85, 78, 73, 128, 71, 65, 82, 79, 78, 128, 71, \r
+    65, 82, 77, 69, 78, 84, 128, 71, 65, 82, 51, 128, 71, 65, 80, 80, 69, \r
+    196, 71, 65, 208, 71, 65, 78, 77, 65, 128, 71, 65, 78, 71, 73, 65, 128, \r
+    71, 65, 78, 68, 193, 71, 65, 78, 50, 128, 71, 65, 78, 178, 71, 65, 77, \r
+    77, 65, 128, 71, 65, 77, 76, 65, 128, 71, 65, 77, 76, 128, 71, 65, 77, \r
+    65, 78, 128, 71, 65, 77, 65, 76, 128, 71, 65, 77, 65, 204, 71, 65, 77, \r
+    128, 71, 65, 71, 128, 71, 65, 70, 128, 71, 65, 198, 71, 65, 69, 84, 84, \r
+    65, 45, 80, 73, 76, 76, 65, 128, 71, 65, 68, 79, 76, 128, 71, 65, 68, \r
+    128, 71, 65, 196, 71, 65, 66, 65, 128, 71, 65, 66, 193, 71, 65, 65, 70, \r
+    85, 128, 71, 65, 178, 71, 48, 53, 52, 128, 71, 48, 53, 51, 128, 71, 48, \r
+    53, 50, 128, 71, 48, 53, 49, 128, 71, 48, 53, 48, 128, 71, 48, 52, 57, \r
+    128, 71, 48, 52, 56, 128, 71, 48, 52, 55, 128, 71, 48, 52, 54, 128, 71, \r
+    48, 52, 53, 65, 128, 71, 48, 52, 53, 128, 71, 48, 52, 52, 128, 71, 48, \r
+    52, 51, 65, 128, 71, 48, 52, 51, 128, 71, 48, 52, 50, 128, 71, 48, 52, \r
+    49, 128, 71, 48, 52, 48, 128, 71, 48, 51, 57, 128, 71, 48, 51, 56, 128, \r
+    71, 48, 51, 55, 65, 128, 71, 48, 51, 55, 128, 71, 48, 51, 54, 65, 128, \r
+    71, 48, 51, 54, 128, 71, 48, 51, 53, 128, 71, 48, 51, 52, 128, 71, 48, \r
+    51, 51, 128, 71, 48, 51, 50, 128, 71, 48, 51, 49, 128, 71, 48, 51, 48, \r
+    128, 71, 48, 50, 57, 128, 71, 48, 50, 56, 128, 71, 48, 50, 55, 128, 71, \r
+    48, 50, 54, 65, 128, 71, 48, 50, 54, 128, 71, 48, 50, 53, 128, 71, 48, \r
+    50, 52, 128, 71, 48, 50, 51, 128, 71, 48, 50, 50, 128, 71, 48, 50, 49, \r
+    128, 71, 48, 50, 48, 65, 128, 71, 48, 50, 48, 128, 71, 48, 49, 57, 128, \r
+    71, 48, 49, 56, 128, 71, 48, 49, 55, 128, 71, 48, 49, 54, 128, 71, 48, \r
+    49, 53, 128, 71, 48, 49, 52, 128, 71, 48, 49, 51, 128, 71, 48, 49, 50, \r
+    128, 71, 48, 49, 49, 65, 128, 71, 48, 49, 49, 128, 71, 48, 49, 48, 128, \r
+    71, 48, 48, 57, 128, 71, 48, 48, 56, 128, 71, 48, 48, 55, 66, 128, 71, \r
+    48, 48, 55, 65, 128, 71, 48, 48, 55, 128, 71, 48, 48, 54, 65, 128, 71, \r
+    48, 48, 54, 128, 71, 48, 48, 53, 128, 71, 48, 48, 52, 128, 71, 48, 48, \r
+    51, 128, 71, 48, 48, 50, 128, 71, 48, 48, 49, 128, 70, 89, 88, 128, 70, \r
+    89, 84, 128, 70, 89, 80, 128, 70, 89, 65, 128, 70, 89, 128, 70, 87, 73, \r
+    128, 70, 87, 69, 69, 128, 70, 87, 69, 128, 70, 87, 65, 65, 128, 70, 87, \r
+    65, 128, 70, 85, 88, 128, 70, 85, 84, 128, 70, 85, 83, 69, 128, 70, 85, \r
+    83, 193, 70, 85, 82, 88, 128, 70, 85, 82, 128, 70, 85, 80, 128, 70, 85, \r
+    78, 69, 82, 65, 204, 70, 85, 78, 67, 84, 73, 79, 78, 128, 70, 85, 76, 76, \r
+    78, 69, 83, 83, 128, 70, 85, 76, 204, 70, 85, 69, 204, 70, 84, 72, 79, \r
+    82, 193, 70, 82, 79, 87, 78, 73, 78, 199, 70, 82, 79, 87, 78, 128, 70, \r
+    82, 79, 78, 84, 45, 84, 73, 76, 84, 69, 196, 70, 82, 79, 205, 70, 82, 79, \r
+    71, 128, 70, 82, 73, 84, 85, 128, 70, 82, 73, 67, 65, 84, 73, 86, 69, \r
+    128, 70, 82, 69, 84, 66, 79, 65, 82, 68, 128, 70, 82, 69, 78, 67, 200, \r
+    70, 82, 69, 197, 70, 82, 65, 78, 195, 70, 82, 65, 77, 69, 128, 70, 82, \r
+    65, 71, 82, 65, 78, 84, 128, 70, 82, 65, 71, 77, 69, 78, 84, 128, 70, 82, \r
+    65, 67, 84, 73, 79, 206, 70, 79, 88, 128, 70, 79, 85, 82, 84, 69, 69, 78, \r
+    128, 70, 79, 85, 82, 84, 69, 69, 206, 70, 79, 85, 82, 45, 83, 84, 82, 73, \r
+    78, 199, 70, 79, 85, 82, 45, 80, 69, 82, 45, 69, 205, 70, 79, 85, 82, 45, \r
+    76, 73, 78, 197, 70, 79, 85, 210, 70, 79, 85, 78, 84, 65, 73, 78, 128, \r
+    70, 79, 83, 84, 69, 82, 73, 78, 71, 128, 70, 79, 82, 84, 89, 128, 70, 79, \r
+    82, 84, 217, 70, 79, 82, 84, 69, 128, 70, 79, 82, 77, 211, 70, 79, 82, \r
+    77, 65, 84, 84, 73, 78, 71, 128, 70, 79, 82, 75, 69, 196, 70, 79, 82, 67, \r
+    69, 83, 128, 70, 79, 82, 67, 69, 128, 70, 79, 80, 128, 70, 79, 79, 84, \r
+    83, 84, 79, 79, 76, 128, 70, 79, 79, 84, 78, 79, 84, 197, 70, 79, 79, 84, \r
+    128, 70, 79, 79, 128, 70, 79, 78, 71, 77, 65, 78, 128, 70, 79, 77, 128, \r
+    70, 79, 76, 76, 89, 128, 70, 79, 76, 76, 79, 87, 73, 78, 71, 128, 70, 79, \r
+    128, 70, 77, 128, 70, 76, 89, 128, 70, 76, 85, 84, 69, 128, 70, 76, 79, \r
+    87, 69, 82, 128, 70, 76, 79, 87, 69, 210, 70, 76, 79, 85, 82, 73, 83, 72, \r
+    128, 70, 76, 79, 82, 69, 84, 84, 69, 128, 70, 76, 79, 82, 65, 204, 70, \r
+    76, 79, 79, 82, 128, 70, 76, 73, 80, 128, 70, 76, 73, 71, 72, 84, 128, \r
+    70, 76, 69, 88, 85, 83, 128, 70, 76, 69, 85, 82, 45, 68, 69, 45, 76, 73, \r
+    83, 128, 70, 76, 65, 84, 84, 69, 78, 69, 196, 70, 76, 65, 84, 78, 69, 83, \r
+    83, 128, 70, 76, 65, 84, 128, 70, 76, 65, 212, 70, 76, 65, 71, 45, 53, \r
+    128, 70, 76, 65, 71, 45, 52, 128, 70, 76, 65, 71, 45, 51, 128, 70, 76, \r
+    65, 71, 45, 50, 128, 70, 76, 65, 71, 45, 49, 128, 70, 76, 65, 71, 128, \r
+    70, 76, 65, 199, 70, 76, 65, 128, 70, 76, 128, 70, 73, 88, 69, 68, 45, \r
+    70, 79, 82, 205, 70, 73, 88, 128, 70, 73, 86, 69, 45, 76, 73, 78, 197, \r
+    70, 73, 86, 197, 70, 73, 84, 65, 128, 70, 73, 84, 128, 70, 73, 83, 72, \r
+    72, 79, 79, 75, 128, 70, 73, 83, 72, 72, 79, 79, 203, 70, 73, 83, 72, 69, \r
+    89, 69, 128, 70, 73, 83, 72, 128, 70, 73, 83, 200, 70, 73, 82, 83, 212, \r
+    70, 73, 82, 69, 128, 70, 73, 80, 128, 70, 73, 78, 73, 84, 197, 70, 73, \r
+    78, 71, 69, 82, 78, 65, 73, 76, 83, 128, 70, 73, 78, 71, 69, 82, 69, 196, \r
+    70, 73, 78, 65, 78, 67, 73, 65, 76, 128, 70, 73, 76, 76, 69, 82, 128, 70, \r
+    73, 76, 76, 69, 196, 70, 73, 76, 76, 128, 70, 73, 76, 204, 70, 73, 76, \r
+    197, 70, 73, 73, 128, 70, 73, 71, 85, 82, 69, 45, 51, 128, 70, 73, 71, \r
+    85, 82, 69, 45, 50, 128, 70, 73, 71, 85, 82, 69, 45, 49, 128, 70, 73, 71, \r
+    85, 82, 197, 70, 73, 71, 72, 84, 128, 70, 73, 70, 84, 89, 128, 70, 73, \r
+    70, 84, 217, 70, 73, 70, 84, 72, 83, 128, 70, 73, 70, 84, 72, 128, 70, \r
+    73, 70, 84, 69, 69, 78, 128, 70, 73, 70, 84, 69, 69, 206, 70, 73, 69, 76, \r
+    68, 128, 70, 72, 84, 79, 82, 193, 70, 70, 76, 128, 70, 70, 73, 128, 70, \r
+    69, 83, 84, 73, 86, 65, 76, 128, 70, 69, 82, 82, 89, 128, 70, 69, 82, 77, \r
+    65, 84, 65, 128, 70, 69, 82, 77, 65, 84, 193, 70, 69, 79, 200, 70, 69, \r
+    78, 199, 70, 69, 78, 67, 69, 128, 70, 69, 77, 73, 78, 73, 78, 197, 70, \r
+    69, 77, 65, 76, 69, 128, 70, 69, 77, 65, 76, 197, 70, 69, 76, 76, 79, 87, \r
+    83, 72, 73, 80, 128, 70, 69, 73, 128, 70, 69, 72, 213, 70, 69, 72, 128, \r
+    70, 69, 200, 70, 69, 69, 78, 71, 128, 70, 69, 69, 68, 128, 70, 69, 69, \r
+    196, 70, 69, 69, 128, 70, 69, 66, 82, 85, 65, 82, 89, 128, 70, 69, 65, \r
+    84, 72, 69, 82, 128, 70, 69, 65, 84, 72, 69, 210, 70, 69, 65, 82, 78, \r
+    128, 70, 65, 89, 65, 78, 78, 65, 128, 70, 65, 88, 128, 70, 65, 84, 72, \r
+    69, 82, 128, 70, 65, 84, 72, 65, 84, 65, 78, 128, 70, 65, 84, 72, 65, 84, \r
+    65, 206, 70, 65, 84, 72, 65, 128, 70, 65, 84, 72, 193, 70, 65, 84, 128, \r
+    70, 65, 82, 83, 201, 70, 65, 80, 128, 70, 65, 78, 71, 128, 70, 65, 78, \r
+    69, 82, 79, 83, 73, 211, 70, 65, 78, 128, 70, 65, 77, 73, 76, 89, 128, \r
+    70, 65, 76, 76, 73, 78, 199, 70, 65, 73, 76, 85, 82, 69, 128, 70, 65, 73, \r
+    72, 85, 128, 70, 65, 72, 82, 69, 78, 72, 69, 73, 84, 128, 70, 65, 67, 84, \r
+    79, 210, 70, 65, 67, 83, 73, 77, 73, 76, 197, 70, 65, 67, 69, 45, 54, \r
+    128, 70, 65, 67, 69, 45, 53, 128, 70, 65, 67, 69, 45, 52, 128, 70, 65, \r
+    67, 69, 45, 51, 128, 70, 65, 67, 69, 45, 50, 128, 70, 65, 67, 69, 45, 49, \r
+    128, 70, 65, 65, 77, 65, 69, 128, 70, 65, 65, 73, 128, 70, 65, 65, 70, \r
+    85, 128, 70, 65, 65, 128, 70, 48, 53, 51, 128, 70, 48, 53, 50, 128, 70, \r
+    48, 53, 49, 67, 128, 70, 48, 53, 49, 66, 128, 70, 48, 53, 49, 65, 128, \r
+    70, 48, 53, 49, 128, 70, 48, 53, 48, 128, 70, 48, 52, 57, 128, 70, 48, \r
+    52, 56, 128, 70, 48, 52, 55, 65, 128, 70, 48, 52, 55, 128, 70, 48, 52, \r
+    54, 65, 128, 70, 48, 52, 54, 128, 70, 48, 52, 53, 65, 128, 70, 48, 52, \r
+    53, 128, 70, 48, 52, 52, 128, 70, 48, 52, 51, 128, 70, 48, 52, 50, 128, \r
+    70, 48, 52, 49, 128, 70, 48, 52, 48, 128, 70, 48, 51, 57, 128, 70, 48, \r
+    51, 56, 65, 128, 70, 48, 51, 56, 128, 70, 48, 51, 55, 65, 128, 70, 48, \r
+    51, 55, 128, 70, 48, 51, 54, 128, 70, 48, 51, 53, 128, 70, 48, 51, 52, \r
+    128, 70, 48, 51, 51, 128, 70, 48, 51, 50, 128, 70, 48, 51, 49, 65, 128, \r
+    70, 48, 51, 49, 128, 70, 48, 51, 48, 128, 70, 48, 50, 57, 128, 70, 48, \r
+    50, 56, 128, 70, 48, 50, 55, 128, 70, 48, 50, 54, 128, 70, 48, 50, 53, \r
+    128, 70, 48, 50, 52, 128, 70, 48, 50, 51, 128, 70, 48, 50, 50, 128, 70, \r
+    48, 50, 49, 65, 128, 70, 48, 50, 49, 128, 70, 48, 50, 48, 128, 70, 48, \r
+    49, 57, 128, 70, 48, 49, 56, 128, 70, 48, 49, 55, 128, 70, 48, 49, 54, \r
+    128, 70, 48, 49, 53, 128, 70, 48, 49, 52, 128, 70, 48, 49, 51, 65, 128, \r
+    70, 48, 49, 51, 128, 70, 48, 49, 50, 128, 70, 48, 49, 49, 128, 70, 48, \r
+    49, 48, 128, 70, 48, 48, 57, 128, 70, 48, 48, 56, 128, 70, 48, 48, 55, \r
+    128, 70, 48, 48, 54, 128, 70, 48, 48, 53, 128, 70, 48, 48, 52, 128, 70, \r
+    48, 48, 51, 128, 70, 48, 48, 50, 128, 70, 48, 48, 49, 65, 128, 70, 48, \r
+    48, 49, 128, 69, 90, 200, 69, 90, 69, 78, 128, 69, 90, 69, 206, 69, 90, \r
+    128, 69, 89, 66, 69, 89, 70, 73, 76, 73, 128, 69, 89, 65, 78, 78, 65, \r
+    128, 69, 88, 84, 82, 65, 45, 76, 79, 215, 69, 88, 84, 82, 65, 45, 72, 73, \r
+    71, 200, 69, 88, 84, 69, 78, 83, 73, 79, 78, 128, 69, 88, 84, 69, 78, 68, \r
+    69, 196, 69, 88, 80, 79, 78, 69, 78, 212, 69, 88, 79, 128, 69, 88, 207, \r
+    69, 88, 73, 83, 84, 83, 128, 69, 88, 73, 83, 84, 128, 69, 88, 72, 65, 85, \r
+    83, 84, 73, 79, 78, 128, 69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 78, 128, \r
+    69, 88, 67, 76, 65, 77, 65, 84, 73, 79, 206, 69, 88, 67, 69, 83, 83, 128, \r
+    69, 88, 67, 69, 76, 76, 69, 78, 84, 128, 69, 87, 69, 128, 69, 86, 69, 78, \r
+    73, 78, 71, 128, 69, 85, 82, 79, 45, 67, 85, 82, 82, 69, 78, 67, 217, 69, \r
+    85, 82, 207, 69, 85, 76, 69, 210, 69, 85, 45, 85, 128, 69, 85, 45, 79, \r
+    128, 69, 85, 45, 69, 85, 128, 69, 85, 45, 69, 79, 128, 69, 85, 45, 69, \r
+    128, 69, 85, 45, 65, 128, 69, 84, 78, 65, 72, 84, 65, 128, 69, 84, 72, \r
+    69, 204, 69, 84, 69, 82, 79, 206, 69, 84, 69, 82, 78, 73, 84, 89, 128, \r
+    69, 83, 85, 75, 85, 85, 68, 79, 128, 69, 83, 84, 73, 77, 65, 84, 69, 83, \r
+    128, 69, 83, 84, 73, 77, 65, 84, 69, 196, 69, 83, 72, 69, 51, 128, 69, \r
+    83, 72, 50, 49, 128, 69, 83, 72, 178, 69, 83, 72, 49, 54, 128, 69, 83, \r
+    67, 65, 80, 69, 128, 69, 83, 45, 84, 69, 128, 69, 82, 82, 79, 82, 45, 66, \r
+    65, 82, 82, 69, 196, 69, 82, 82, 128, 69, 82, 73, 78, 50, 128, 69, 82, \r
+    71, 128, 69, 82, 65, 83, 197, 69, 81, 85, 73, 86, 65, 76, 69, 78, 212, \r
+    69, 81, 85, 73, 68, 128, 69, 81, 85, 73, 65, 78, 71, 85, 76, 65, 210, 69, \r
+    81, 85, 65, 76, 83, 128, 69, 81, 85, 65, 76, 211, 69, 81, 85, 65, 76, \r
+    128, 69, 80, 83, 73, 76, 79, 78, 128, 69, 80, 83, 73, 76, 79, 206, 69, \r
+    80, 73, 71, 82, 65, 80, 72, 73, 195, 69, 80, 73, 68, 65, 85, 82, 69, 65, \r
+    206, 69, 80, 69, 78, 84, 72, 69, 84, 73, 195, 69, 80, 69, 71, 69, 82, 77, \r
+    65, 128, 69, 79, 76, 72, 88, 128, 69, 79, 72, 128, 69, 78, 89, 128, 69, \r
+    78, 86, 69, 76, 79, 80, 69, 128, 69, 78, 85, 77, 69, 82, 65, 84, 73, 79, \r
+    206, 69, 78, 84, 82, 89, 45, 50, 128, 69, 78, 84, 82, 89, 45, 49, 128, \r
+    69, 78, 84, 82, 89, 128, 69, 78, 84, 72, 85, 83, 73, 65, 83, 77, 128, 69, \r
+    78, 84, 69, 82, 80, 82, 73, 83, 69, 128, 69, 78, 84, 69, 82, 73, 78, 199, \r
+    69, 78, 84, 69, 82, 128, 69, 78, 84, 69, 210, 69, 78, 81, 85, 73, 82, 89, \r
+    128, 69, 78, 79, 211, 69, 78, 78, 128, 69, 78, 76, 65, 82, 71, 69, 77, \r
+    69, 78, 84, 128, 69, 78, 68, 79, 70, 79, 78, 79, 78, 128, 69, 78, 68, 73, \r
+    78, 199, 69, 78, 68, 69, 80, 128, 69, 78, 68, 69, 65, 86, 79, 85, 82, \r
+    128, 69, 78, 196, 69, 78, 67, 79, 85, 78, 84, 69, 82, 83, 128, 69, 78, \r
+    67, 76, 79, 83, 85, 82, 69, 128, 69, 78, 67, 76, 79, 83, 73, 78, 199, 69, \r
+    78, 67, 128, 69, 78, 65, 82, 88, 73, 211, 69, 78, 65, 82, 77, 79, 78, 73, \r
+    79, 211, 69, 77, 80, 84, 217, 69, 77, 80, 72, 65, 84, 73, 195, 69, 77, \r
+    80, 72, 65, 83, 73, 211, 69, 77, 66, 82, 79, 73, 68, 69, 82, 89, 128, 69, \r
+    77, 66, 69, 76, 76, 73, 83, 72, 77, 69, 78, 84, 128, 69, 77, 66, 69, 68, \r
+    68, 73, 78, 71, 128, 69, 76, 84, 128, 69, 76, 76, 73, 80, 83, 73, 83, \r
+    128, 69, 76, 76, 73, 80, 83, 69, 128, 69, 76, 73, 70, 73, 128, 69, 76, \r
+    69, 86, 69, 78, 128, 69, 76, 69, 86, 69, 206, 69, 76, 69, 77, 69, 78, \r
+    212, 69, 76, 69, 67, 84, 82, 73, 67, 65, 204, 69, 76, 69, 67, 84, 82, 73, \r
+    195, 69, 76, 65, 70, 82, 79, 78, 128, 69, 75, 83, 84, 82, 69, 80, 84, 79, \r
+    78, 128, 69, 75, 83, 128, 69, 75, 70, 79, 78, 73, 84, 73, 75, 79, 78, \r
+    128, 69, 75, 65, 82, 65, 128, 69, 74, 69, 67, 212, 69, 73, 83, 128, 69, \r
+    73, 71, 72, 84, 89, 128, 69, 73, 71, 72, 84, 217, 69, 73, 71, 72, 84, 72, \r
+    83, 128, 69, 73, 71, 72, 84, 72, 211, 69, 73, 71, 72, 84, 72, 128, 69, \r
+    73, 71, 72, 84, 69, 69, 78, 128, 69, 73, 71, 72, 84, 69, 69, 206, 69, 73, \r
+    69, 128, 69, 72, 87, 65, 218, 69, 71, 89, 80, 84, 79, 76, 79, 71, 73, 67, \r
+    65, 204, 69, 71, 73, 82, 128, 69, 71, 71, 128, 69, 69, 89, 65, 78, 78, \r
+    65, 128, 69, 69, 75, 65, 65, 128, 69, 69, 66, 69, 69, 70, 73, 76, 73, \r
+    128, 69, 68, 73, 84, 79, 82, 73, 65, 204, 69, 68, 73, 78, 128, 69, 68, \r
+    68, 128, 69, 67, 200, 69, 66, 69, 70, 73, 76, 73, 128, 69, 65, 83, 84, \r
+    69, 82, 206, 69, 65, 83, 212, 69, 65, 82, 84, 72, 76, 217, 69, 65, 82, \r
+    84, 72, 128, 69, 65, 82, 84, 200, 69, 65, 82, 76, 217, 69, 65, 77, 72, \r
+    65, 78, 67, 72, 79, 76, 76, 128, 69, 65, 71, 76, 69, 128, 69, 65, 68, 72, \r
+    65, 68, 72, 128, 69, 65, 66, 72, 65, 68, 72, 128, 69, 178, 69, 48, 51, \r
+    56, 128, 69, 48, 51, 55, 128, 69, 48, 51, 54, 128, 69, 48, 51, 52, 65, \r
+    128, 69, 48, 51, 52, 128, 69, 48, 51, 51, 128, 69, 48, 51, 50, 128, 69, \r
+    48, 51, 49, 128, 69, 48, 51, 48, 128, 69, 48, 50, 57, 128, 69, 48, 50, \r
+    56, 65, 128, 69, 48, 50, 56, 128, 69, 48, 50, 55, 128, 69, 48, 50, 54, \r
+    128, 69, 48, 50, 53, 128, 69, 48, 50, 52, 128, 69, 48, 50, 51, 128, 69, \r
+    48, 50, 50, 128, 69, 48, 50, 49, 128, 69, 48, 50, 48, 65, 128, 69, 48, \r
+    50, 48, 128, 69, 48, 49, 57, 128, 69, 48, 49, 56, 128, 69, 48, 49, 55, \r
+    65, 128, 69, 48, 49, 55, 128, 69, 48, 49, 54, 65, 128, 69, 48, 49, 54, \r
+    128, 69, 48, 49, 53, 128, 69, 48, 49, 52, 128, 69, 48, 49, 51, 128, 69, \r
+    48, 49, 50, 128, 69, 48, 49, 49, 128, 69, 48, 49, 48, 128, 69, 48, 48, \r
+    57, 65, 128, 69, 48, 48, 57, 128, 69, 48, 48, 56, 65, 128, 69, 48, 48, \r
+    56, 128, 69, 48, 48, 55, 128, 69, 48, 48, 54, 128, 69, 48, 48, 53, 128, \r
+    69, 48, 48, 52, 128, 69, 48, 48, 51, 128, 69, 48, 48, 50, 128, 69, 48, \r
+    48, 49, 128, 68, 90, 90, 69, 128, 68, 90, 87, 69, 128, 68, 90, 85, 128, \r
+    68, 90, 79, 128, 68, 90, 74, 69, 128, 68, 90, 73, 128, 68, 90, 72, 69, \r
+    128, 68, 90, 72, 65, 128, 68, 90, 69, 76, 79, 128, 68, 90, 69, 69, 128, \r
+    68, 90, 69, 128, 68, 90, 65, 128, 68, 90, 128, 68, 218, 68, 89, 79, 128, \r
+    68, 89, 207, 68, 89, 69, 72, 128, 68, 89, 69, 200, 68, 87, 79, 128, 68, \r
+    87, 69, 128, 68, 87, 65, 128, 68, 86, 73, 83, 86, 65, 82, 65, 128, 68, \r
+    86, 128, 68, 85, 84, 73, 69, 83, 128, 68, 85, 82, 65, 84, 73, 79, 78, \r
+    128, 68, 85, 82, 50, 128, 68, 85, 80, 79, 78, 68, 73, 85, 211, 68, 85, \r
+    79, 88, 128, 68, 85, 79, 128, 68, 85, 78, 52, 128, 68, 85, 78, 51, 128, \r
+    68, 85, 78, 179, 68, 85, 78, 128, 68, 85, 77, 128, 68, 85, 76, 128, 68, \r
+    85, 204, 68, 85, 72, 128, 68, 85, 71, 85, 68, 128, 68, 85, 66, 50, 128, \r
+    68, 85, 66, 128, 68, 85, 194, 68, 213, 68, 82, 89, 128, 68, 82, 217, 68, \r
+    82, 85, 77, 128, 68, 82, 85, 205, 68, 82, 79, 80, 83, 128, 68, 82, 79, \r
+    80, 45, 83, 72, 65, 68, 79, 87, 69, 196, 68, 82, 73, 86, 69, 128, 68, 82, \r
+    73, 86, 197, 68, 82, 73, 204, 68, 82, 65, 85, 71, 72, 84, 211, 68, 82, \r
+    65, 71, 79, 78, 128, 68, 82, 65, 70, 84, 73, 78, 199, 68, 82, 65, 67, 72, \r
+    77, 65, 83, 128, 68, 82, 65, 67, 72, 77, 65, 128, 68, 82, 65, 67, 72, 77, \r
+    193, 68, 79, 87, 78, 87, 65, 82, 68, 83, 128, 68, 79, 87, 78, 87, 65, 82, \r
+    68, 211, 68, 79, 87, 78, 45, 80, 79, 73, 78, 84, 73, 78, 199, 68, 79, 87, \r
+    78, 128, 68, 79, 86, 69, 128, 68, 79, 85, 66, 84, 128, 68, 79, 85, 66, \r
+    76, 69, 196, 68, 79, 85, 66, 76, 69, 45, 76, 73, 78, 197, 68, 79, 85, 66, \r
+    76, 69, 45, 69, 78, 68, 69, 196, 68, 79, 85, 66, 76, 69, 128, 68, 79, 84, \r
+    84, 69, 68, 45, 80, 128, 68, 79, 84, 84, 69, 68, 45, 78, 128, 68, 79, 84, \r
+    84, 69, 68, 45, 76, 128, 68, 79, 84, 84, 69, 68, 128, 68, 79, 84, 84, 69, \r
+    196, 68, 79, 84, 83, 45, 56, 128, 68, 79, 84, 83, 45, 55, 56, 128, 68, \r
+    79, 84, 83, 45, 55, 128, 68, 79, 84, 83, 45, 54, 56, 128, 68, 79, 84, 83, \r
+    45, 54, 55, 56, 128, 68, 79, 84, 83, 45, 54, 55, 128, 68, 79, 84, 83, 45, \r
+    54, 128, 68, 79, 84, 83, 45, 53, 56, 128, 68, 79, 84, 83, 45, 53, 55, 56, \r
+    128, 68, 79, 84, 83, 45, 53, 55, 128, 68, 79, 84, 83, 45, 53, 54, 56, \r
+    128, 68, 79, 84, 83, 45, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 53, 54, \r
+    55, 128, 68, 79, 84, 83, 45, 53, 54, 128, 68, 79, 84, 83, 45, 53, 128, \r
+    68, 79, 84, 83, 45, 52, 56, 128, 68, 79, 84, 83, 45, 52, 55, 56, 128, 68, \r
+    79, 84, 83, 45, 52, 55, 128, 68, 79, 84, 83, 45, 52, 54, 56, 128, 68, 79, \r
+    84, 83, 45, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 52, 54, 55, 128, 68, \r
+    79, 84, 83, 45, 52, 54, 128, 68, 79, 84, 83, 45, 52, 53, 56, 128, 68, 79, \r
+    84, 83, 45, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 52, 53, 55, 128, 68, \r
+    79, 84, 83, 45, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 52, \r
+    53, 54, 128, 68, 79, 84, 83, 45, 52, 53, 128, 68, 79, 84, 83, 45, 52, \r
+    128, 68, 79, 84, 83, 45, 51, 56, 128, 68, 79, 84, 83, 45, 51, 55, 56, \r
+    128, 68, 79, 84, 83, 45, 51, 55, 128, 68, 79, 84, 83, 45, 51, 54, 56, \r
+    128, 68, 79, 84, 83, 45, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 54, \r
+    55, 128, 68, 79, 84, 83, 45, 51, 54, 128, 68, 79, 84, 83, 45, 51, 53, 56, \r
+    128, 68, 79, 84, 83, 45, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, \r
+    55, 128, 68, 79, 84, 83, 45, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 51, \r
+    53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 53, 54, 55, 128, 68, 79, 84, \r
+    83, 45, 51, 53, 54, 128, 68, 79, 84, 83, 45, 51, 53, 128, 68, 79, 84, 83, \r
+    45, 51, 52, 56, 128, 68, 79, 84, 83, 45, 51, 52, 55, 56, 128, 68, 79, 84, \r
+    83, 45, 51, 52, 55, 128, 68, 79, 84, 83, 45, 51, 52, 54, 56, 128, 68, 79, \r
+    84, 83, 45, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 54, 55, \r
+    128, 68, 79, 84, 83, 45, 51, 52, 54, 128, 68, 79, 84, 83, 45, 51, 52, 53, \r
+    56, 128, 68, 79, 84, 83, 45, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, \r
+    51, 52, 53, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 56, 128, 68, 79, \r
+    84, 83, 45, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 51, 52, 53, \r
+    54, 55, 128, 68, 79, 84, 83, 45, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, \r
+    51, 52, 53, 128, 68, 79, 84, 83, 45, 51, 52, 128, 68, 79, 84, 83, 45, 51, \r
+    128, 68, 79, 84, 83, 45, 50, 56, 128, 68, 79, 84, 83, 45, 50, 55, 56, \r
+    128, 68, 79, 84, 83, 45, 50, 55, 128, 68, 79, 84, 83, 45, 50, 54, 56, \r
+    128, 68, 79, 84, 83, 45, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 54, \r
+    55, 128, 68, 79, 84, 83, 45, 50, 54, 128, 68, 79, 84, 83, 45, 50, 53, 56, \r
+    128, 68, 79, 84, 83, 45, 50, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, \r
+    55, 128, 68, 79, 84, 83, 45, 50, 53, 54, 56, 128, 68, 79, 84, 83, 45, 50, \r
+    53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 53, 54, 55, 128, 68, 79, 84, \r
+    83, 45, 50, 53, 54, 128, 68, 79, 84, 83, 45, 50, 53, 128, 68, 79, 84, 83, \r
+    45, 50, 52, 56, 128, 68, 79, 84, 83, 45, 50, 52, 55, 56, 128, 68, 79, 84, \r
+    83, 45, 50, 52, 55, 128, 68, 79, 84, 83, 45, 50, 52, 54, 56, 128, 68, 79, \r
+    84, 83, 45, 50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 54, 55, \r
+    128, 68, 79, 84, 83, 45, 50, 52, 54, 128, 68, 79, 84, 83, 45, 50, 52, 53, \r
+    56, 128, 68, 79, 84, 83, 45, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, \r
+    50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 56, 128, 68, 79, \r
+    84, 83, 45, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 52, 53, \r
+    54, 55, 128, 68, 79, 84, 83, 45, 50, 52, 53, 54, 128, 68, 79, 84, 83, 45, \r
+    50, 52, 53, 128, 68, 79, 84, 83, 45, 50, 52, 128, 68, 79, 84, 83, 45, 50, \r
+    51, 56, 128, 68, 79, 84, 83, 45, 50, 51, 55, 56, 128, 68, 79, 84, 83, 45, \r
+    50, 51, 55, 128, 68, 79, 84, 83, 45, 50, 51, 54, 56, 128, 68, 79, 84, 83, \r
+    45, 50, 51, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 54, 55, 128, 68, \r
+    79, 84, 83, 45, 50, 51, 54, 128, 68, 79, 84, 83, 45, 50, 51, 53, 56, 128, \r
+    68, 79, 84, 83, 45, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, \r
+    53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 56, 128, 68, 79, 84, 83, \r
+    45, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 55, \r
+    128, 68, 79, 84, 83, 45, 50, 51, 53, 54, 128, 68, 79, 84, 83, 45, 50, 51, \r
+    53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 56, 128, 68, 79, 84, 83, 45, 50, \r
+    51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 55, 128, 68, 79, 84, \r
+    83, 45, 50, 51, 52, 54, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, \r
+    50, 51, 52, 54, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 56, 128, 68, 79, \r
+    84, 83, 45, 50, 51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, \r
+    53, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, \r
+    83, 45, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 50, 51, 52, \r
+    53, 54, 55, 128, 68, 79, 84, 83, 45, 50, 51, 52, 53, 54, 128, 68, 79, 84, \r
+    83, 45, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 50, 51, 52, 128, 68, 79, \r
+    84, 83, 45, 50, 51, 128, 68, 79, 84, 83, 45, 50, 128, 68, 79, 84, 83, 45, \r
+    49, 56, 128, 68, 79, 84, 83, 45, 49, 55, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    55, 128, 68, 79, 84, 83, 45, 49, 54, 56, 128, 68, 79, 84, 83, 45, 49, 54, \r
+    55, 56, 128, 68, 79, 84, 83, 45, 49, 54, 55, 128, 68, 79, 84, 83, 45, 49, \r
+    54, 128, 68, 79, 84, 83, 45, 49, 53, 56, 128, 68, 79, 84, 83, 45, 49, 53, \r
+    55, 56, 128, 68, 79, 84, 83, 45, 49, 53, 55, 128, 68, 79, 84, 83, 45, 49, \r
+    53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 53, 54, 55, 56, 128, 68, 79, 84, \r
+    83, 45, 49, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 53, 54, 128, 68, 79, \r
+    84, 83, 45, 49, 53, 128, 68, 79, 84, 83, 45, 49, 52, 56, 128, 68, 79, 84, \r
+    83, 45, 49, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 55, 128, 68, 79, \r
+    84, 83, 45, 49, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 56, \r
+    128, 68, 79, 84, 83, 45, 49, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 52, \r
+    54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 55, 128, 68, 79, 84, \r
+    83, 45, 49, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 49, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, \r
+    49, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 52, 53, 128, 68, 79, 84, 83, \r
+    45, 49, 52, 128, 68, 79, 84, 83, 45, 49, 51, 56, 128, 68, 79, 84, 83, 45, \r
+    49, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 55, 128, 68, 79, 84, 83, \r
+    45, 49, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 54, 55, 56, 128, 68, \r
+    79, 84, 83, 45, 49, 51, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 54, 128, \r
+    68, 79, 84, 83, 45, 49, 51, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, \r
+    55, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 55, 128, 68, 79, 84, 83, 45, \r
+    49, 51, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 56, 128, \r
+    68, 79, 84, 83, 45, 49, 51, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, \r
+    53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 53, 128, 68, 79, 84, 83, 45, 49, \r
+    51, 52, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 55, 56, 128, 68, 79, 84, \r
+    83, 45, 49, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 56, 128, \r
+    68, 79, 84, 83, 45, 49, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 51, 52, 54, 128, 68, 79, 84, \r
+    83, 45, 49, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 55, 128, 68, 79, 84, 83, 45, \r
+    49, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 54, 55, 128, 68, 79, 84, 83, \r
+    45, 49, 51, 52, 53, 54, 128, 68, 79, 84, 83, 45, 49, 51, 52, 53, 128, 68, \r
+    79, 84, 83, 45, 49, 51, 52, 128, 68, 79, 84, 83, 45, 49, 51, 128, 68, 79, \r
+    84, 83, 45, 49, 50, 56, 128, 68, 79, 84, 83, 45, 49, 50, 55, 56, 128, 68, \r
+    79, 84, 83, 45, 49, 50, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 56, 128, \r
+    68, 79, 84, 83, 45, 49, 50, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, \r
+    54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 54, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, 53, 55, 56, 128, 68, 79, 84, \r
+    83, 45, 49, 50, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 56, 128, \r
+    68, 79, 84, 83, 45, 49, 50, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 53, 54, 128, 68, 79, 84, \r
+    83, 45, 49, 50, 53, 128, 68, 79, 84, 83, 45, 49, 50, 52, 56, 128, 68, 79, \r
+    84, 83, 45, 49, 50, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 55, \r
+    128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 54, 55, 128, 68, \r
+    79, 84, 83, 45, 49, 50, 52, 54, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, \r
+    56, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 55, 56, 128, 68, 79, 84, 83, \r
+    45, 49, 50, 52, 53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 56, \r
+    128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, \r
+    45, 49, 50, 52, 53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 54, \r
+    128, 68, 79, 84, 83, 45, 49, 50, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, \r
+    52, 128, 68, 79, 84, 83, 45, 49, 50, 51, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 51, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 55, 128, 68, 79, 84, \r
+    83, 45, 49, 50, 51, 54, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, \r
+    56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 54, 55, 128, 68, 79, 84, 83, 45, \r
+    49, 50, 51, 54, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 56, 128, 68, 79, \r
+    84, 83, 45, 49, 50, 51, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, \r
+    53, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 56, 128, 68, 79, 84, \r
+    83, 45, 49, 50, 51, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, \r
+    53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 53, 54, 128, 68, 79, 84, \r
+    83, 45, 49, 50, 51, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 56, 128, \r
+    68, 79, 84, 83, 45, 49, 50, 51, 52, 55, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 51, 52, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 56, 128, 68, \r
+    79, 84, 83, 45, 49, 50, 51, 52, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, \r
+    50, 51, 52, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 54, 128, 68, \r
+    79, 84, 83, 45, 49, 50, 51, 52, 53, 56, 128, 68, 79, 84, 83, 45, 49, 50, \r
+    51, 52, 53, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 55, 128, \r
+    68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 56, 128, 68, 79, 84, 83, 45, \r
+    49, 50, 51, 52, 53, 54, 55, 56, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, \r
+    53, 54, 55, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, 53, 54, 128, 68, 79, \r
+    84, 83, 45, 49, 50, 51, 52, 53, 128, 68, 79, 84, 83, 45, 49, 50, 51, 52, \r
+    128, 68, 79, 84, 83, 45, 49, 50, 51, 128, 68, 79, 84, 83, 45, 49, 50, \r
+    128, 68, 79, 84, 83, 45, 49, 128, 68, 79, 84, 83, 128, 68, 79, 84, 76, \r
+    69, 83, 211, 68, 79, 82, 85, 128, 68, 79, 79, 82, 128, 68, 79, 79, 78, \r
+    71, 128, 68, 79, 78, 71, 128, 68, 79, 77, 65, 73, 206, 68, 79, 76, 76, \r
+    65, 210, 68, 79, 76, 73, 85, 77, 128, 68, 79, 75, 77, 65, 73, 128, 68, \r
+    79, 73, 84, 128, 68, 79, 71, 128, 68, 79, 69, 211, 68, 79, 68, 69, 75, \r
+    65, 84, 65, 128, 68, 79, 66, 82, 79, 128, 68, 79, 65, 67, 72, 65, 83, 72, \r
+    77, 69, 69, 128, 68, 79, 65, 67, 72, 65, 83, 72, 77, 69, 197, 68, 79, 65, \r
+    128, 68, 79, 45, 79, 128, 68, 77, 128, 68, 205, 68, 76, 85, 128, 68, 76, \r
+    79, 128, 68, 76, 73, 128, 68, 76, 69, 69, 128, 68, 76, 65, 128, 68, 76, \r
+    128, 68, 75, 65, 82, 128, 68, 75, 65, 210, 68, 74, 69, 82, 86, 73, 128, \r
+    68, 74, 69, 82, 86, 128, 68, 74, 69, 128, 68, 74, 65, 128, 68, 74, 128, \r
+    68, 73, 86, 79, 82, 67, 197, 68, 73, 86, 73, 83, 73, 79, 78, 128, 68, 73, \r
+    86, 73, 83, 73, 79, 206, 68, 73, 86, 73, 78, 65, 84, 73, 79, 78, 128, 68, \r
+    73, 86, 73, 68, 69, 83, 128, 68, 73, 86, 73, 68, 69, 82, 128, 68, 73, 86, \r
+    73, 68, 69, 196, 68, 73, 86, 73, 68, 69, 128, 68, 73, 86, 73, 68, 197, \r
+    68, 73, 86, 69, 82, 71, 69, 78, 67, 69, 128, 68, 73, 84, 84, 207, 68, 73, \r
+    83, 84, 79, 82, 84, 73, 79, 78, 128, 68, 73, 83, 84, 73, 78, 71, 85, 73, \r
+    83, 72, 128, 68, 73, 83, 80, 69, 82, 83, 73, 79, 78, 128, 68, 73, 83, 73, \r
+    77, 79, 85, 128, 68, 73, 83, 72, 128, 68, 73, 83, 67, 79, 78, 84, 73, 78, \r
+    85, 79, 85, 211, 68, 73, 83, 195, 68, 73, 83, 65, 66, 76, 69, 196, 68, \r
+    73, 82, 71, 193, 68, 73, 82, 69, 67, 84, 76, 217, 68, 73, 82, 69, 67, 84, \r
+    73, 79, 78, 65, 204, 68, 73, 80, 84, 69, 128, 68, 73, 80, 80, 69, 82, \r
+    128, 68, 73, 80, 76, 79, 85, 78, 128, 68, 73, 80, 76, 73, 128, 68, 73, \r
+    80, 76, 201, 68, 73, 78, 71, 66, 65, 212, 68, 73, 206, 68, 73, 77, 77, \r
+    73, 78, 71, 128, 68, 73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 51, 128, 68, \r
+    73, 77, 73, 78, 85, 84, 73, 79, 78, 45, 50, 128, 68, 73, 77, 73, 78, 85, \r
+    84, 73, 79, 78, 45, 49, 128, 68, 73, 77, 73, 78, 73, 83, 72, 77, 69, 78, \r
+    84, 128, 68, 73, 77, 73, 68, 73, 193, 68, 73, 77, 69, 78, 83, 73, 79, 78, \r
+    65, 204, 68, 73, 77, 69, 78, 83, 73, 79, 206, 68, 73, 77, 50, 128, 68, \r
+    73, 76, 128, 68, 73, 71, 82, 65, 80, 72, 128, 68, 73, 71, 82, 65, 80, \r
+    200, 68, 73, 71, 82, 65, 77, 77, 79, 211, 68, 73, 71, 82, 65, 77, 77, \r
+    193, 68, 73, 71, 82, 65, 205, 68, 73, 71, 79, 82, 71, 79, 78, 128, 68, \r
+    73, 71, 79, 82, 71, 79, 206, 68, 73, 71, 65, 77, 77, 65, 128, 68, 73, 71, \r
+    193, 68, 73, 70, 84, 79, 71, 71, 79, 211, 68, 73, 70, 79, 78, 73, 65, 83, \r
+    128, 68, 73, 70, 70, 73, 67, 85, 76, 84, 217, 68, 73, 70, 70, 73, 67, 85, \r
+    76, 84, 73, 69, 83, 128, 68, 73, 70, 70, 69, 82, 69, 78, 84, 73, 65, 76, \r
+    128, 68, 73, 70, 70, 69, 82, 69, 78, 67, 197, 68, 73, 70, 65, 84, 128, \r
+    68, 73, 69, 83, 73, 83, 128, 68, 73, 69, 83, 73, 211, 68, 73, 69, 80, \r
+    128, 68, 73, 197, 68, 73, 66, 128, 68, 73, 65, 84, 79, 78, 79, 206, 68, \r
+    73, 65, 84, 79, 78, 73, 75, 201, 68, 73, 65, 83, 84, 79, 76, 201, 68, 73, \r
+    65, 77, 79, 78, 68, 128, 68, 73, 65, 77, 79, 78, 196, 68, 73, 65, 77, 69, \r
+    84, 69, 210, 68, 73, 65, 76, 89, 84, 73, 75, 65, 128, 68, 73, 65, 76, 89, \r
+    84, 73, 75, 193, 68, 73, 65, 76, 69, 67, 84, 45, 208, 68, 73, 65, 71, 79, \r
+    78, 65, 76, 128, 68, 73, 65, 71, 79, 78, 65, 204, 68, 73, 65, 69, 82, 69, \r
+    83, 73, 90, 69, 196, 68, 73, 65, 69, 82, 69, 83, 73, 83, 128, 68, 73, 65, \r
+    69, 82, 69, 83, 73, 211, 68, 72, 79, 85, 128, 68, 72, 79, 79, 128, 68, \r
+    72, 79, 128, 68, 72, 73, 128, 68, 72, 72, 85, 128, 68, 72, 72, 79, 79, \r
+    128, 68, 72, 72, 79, 128, 68, 72, 72, 73, 128, 68, 72, 72, 69, 69, 128, \r
+    68, 72, 72, 69, 128, 68, 72, 72, 65, 128, 68, 72, 69, 69, 128, 68, 72, \r
+    65, 82, 77, 65, 128, 68, 72, 65, 76, 69, 84, 72, 128, 68, 72, 65, 76, 65, \r
+    84, 72, 128, 68, 72, 65, 76, 128, 68, 72, 65, 68, 72, 69, 128, 68, 72, \r
+    65, 65, 76, 85, 128, 68, 72, 65, 128, 68, 69, 90, 200, 68, 69, 89, 84, \r
+    69, 82, 79, 213, 68, 69, 89, 84, 69, 82, 79, 211, 68, 69, 88, 73, 65, \r
+    128, 68, 69, 86, 73, 67, 197, 68, 69, 86, 69, 76, 79, 80, 77, 69, 78, 84, \r
+    128, 68, 69, 85, 78, 71, 128, 68, 69, 83, 73, 128, 68, 69, 83, 67, 82, \r
+    73, 80, 84, 73, 79, 206, 68, 69, 83, 67, 69, 78, 68, 73, 78, 199, 68, 69, \r
+    83, 67, 69, 78, 68, 69, 82, 128, 68, 69, 82, 69, 84, 45, 72, 73, 68, 69, \r
+    84, 128, 68, 69, 82, 69, 84, 128, 68, 69, 80, 65, 82, 84, 85, 82, 69, \r
+    128, 68, 69, 80, 65, 82, 84, 73, 78, 199, 68, 69, 78, 84, 73, 83, 84, 82, \r
+    217, 68, 69, 78, 84, 65, 204, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 82, \r
+    128, 68, 69, 78, 79, 77, 73, 78, 65, 84, 79, 210, 68, 69, 78, 78, 69, 78, \r
+    128, 68, 69, 78, 71, 128, 68, 69, 78, 197, 68, 69, 78, 65, 82, 73, 85, \r
+    211, 68, 69, 76, 84, 65, 128, 68, 69, 76, 84, 193, 68, 69, 76, 84, 128, \r
+    68, 69, 76, 80, 72, 73, 195, 68, 69, 76, 73, 86, 69, 82, 65, 78, 67, 69, \r
+    128, 68, 69, 76, 73, 77, 73, 84, 69, 82, 128, 68, 69, 76, 73, 77, 73, 84, \r
+    69, 210, 68, 69, 76, 69, 84, 69, 128, 68, 69, 76, 69, 84, 197, 68, 69, \r
+    75, 65, 128, 68, 69, 75, 128, 68, 69, 73, 128, 68, 69, 72, 73, 128, 68, \r
+    69, 71, 82, 69, 197, 68, 69, 70, 73, 78, 73, 84, 73, 79, 78, 128, 68, 69, \r
+    70, 69, 67, 84, 73, 86, 69, 78, 69, 83, 211, 68, 69, 69, 82, 128, 68, 69, \r
+    69, 76, 128, 68, 69, 67, 82, 69, 83, 67, 69, 78, 68, 79, 128, 68, 69, 67, \r
+    82, 69, 65, 83, 69, 128, 68, 69, 67, 73, 83, 73, 86, 69, 78, 69, 83, 83, \r
+    128, 68, 69, 67, 73, 77, 65, 204, 68, 69, 67, 69, 77, 66, 69, 82, 128, \r
+    68, 69, 67, 65, 89, 69, 68, 128, 68, 69, 66, 73, 212, 68, 69, 65, 84, 72, \r
+    128, 68, 69, 65, 68, 128, 68, 68, 87, 65, 128, 68, 68, 85, 88, 128, 68, \r
+    68, 85, 84, 128, 68, 68, 85, 82, 88, 128, 68, 68, 85, 82, 128, 68, 68, \r
+    85, 80, 128, 68, 68, 85, 79, 88, 128, 68, 68, 85, 79, 80, 128, 68, 68, \r
+    85, 79, 128, 68, 68, 85, 128, 68, 68, 79, 88, 128, 68, 68, 79, 84, 128, \r
+    68, 68, 79, 80, 128, 68, 68, 79, 65, 128, 68, 68, 73, 88, 128, 68, 68, \r
+    73, 84, 128, 68, 68, 73, 80, 128, 68, 68, 73, 69, 88, 128, 68, 68, 73, \r
+    69, 80, 128, 68, 68, 73, 69, 128, 68, 68, 73, 128, 68, 68, 72, 79, 128, \r
+    68, 68, 72, 65, 128, 68, 68, 69, 88, 128, 68, 68, 69, 80, 128, 68, 68, \r
+    69, 69, 128, 68, 68, 69, 128, 68, 68, 68, 72, 65, 128, 68, 68, 68, 65, \r
+    128, 68, 68, 65, 89, 65, 78, 78, 65, 128, 68, 68, 65, 88, 128, 68, 68, \r
+    65, 84, 128, 68, 68, 65, 80, 128, 68, 68, 65, 76, 128, 68, 68, 65, 204, \r
+    68, 68, 65, 72, 65, 76, 128, 68, 68, 65, 72, 65, 204, 68, 68, 65, 65, \r
+    128, 68, 194, 68, 65, 217, 68, 65, 86, 73, 89, 65, 78, 73, 128, 68, 65, \r
+    86, 73, 68, 128, 68, 65, 84, 197, 68, 65, 83, 73, 65, 128, 68, 65, 83, \r
+    72, 69, 196, 68, 65, 83, 72, 128, 68, 65, 83, 200, 68, 65, 83, 69, 73, \r
+    65, 128, 68, 65, 82, 84, 128, 68, 65, 82, 75, 69, 78, 73, 78, 71, 128, \r
+    68, 65, 82, 75, 69, 78, 73, 78, 199, 68, 65, 82, 203, 68, 65, 82, 71, 65, \r
+    128, 68, 65, 82, 65, 52, 128, 68, 65, 82, 65, 51, 128, 68, 65, 82, 128, \r
+    68, 65, 80, 45, 80, 82, 65, 205, 68, 65, 80, 45, 80, 73, 201, 68, 65, 80, \r
+    45, 77, 85, 79, 217, 68, 65, 80, 45, 66, 85, 79, 206, 68, 65, 80, 45, 66, \r
+    69, 201, 68, 65, 208, 68, 65, 78, 84, 65, 74, 193, 68, 65, 78, 71, 128, \r
+    68, 65, 78, 199, 68, 65, 78, 68, 65, 128, 68, 65, 77, 80, 128, 68, 65, \r
+    77, 208, 68, 65, 77, 77, 65, 84, 65, 78, 128, 68, 65, 77, 77, 65, 84, 65, \r
+    206, 68, 65, 77, 77, 65, 128, 68, 65, 77, 77, 193, 68, 65, 77, 65, 82, \r
+    85, 128, 68, 65, 76, 69, 84, 72, 128, 68, 65, 76, 69, 84, 128, 68, 65, \r
+    76, 69, 212, 68, 65, 76, 68, 65, 128, 68, 65, 76, 65, 84, 72, 128, 68, \r
+    65, 76, 65, 84, 200, 68, 65, 76, 65, 84, 128, 68, 65, 73, 82, 128, 68, \r
+    65, 73, 78, 71, 128, 68, 65, 72, 89, 65, 65, 85, 83, 72, 45, 50, 128, 68, \r
+    65, 72, 89, 65, 65, 85, 83, 72, 128, 68, 65, 71, 83, 128, 68, 65, 71, 71, \r
+    69, 82, 128, 68, 65, 71, 69, 83, 72, 128, 68, 65, 71, 69, 83, 200, 68, \r
+    65, 71, 66, 65, 83, 73, 78, 78, 65, 128, 68, 65, 71, 65, 218, 68, 65, 71, \r
+    65, 76, 71, 65, 128, 68, 65, 199, 68, 65, 69, 78, 71, 128, 68, 65, 69, \r
+    199, 68, 65, 68, 128, 68, 65, 196, 68, 65, 65, 83, 85, 128, 68, 65, 65, \r
+    68, 72, 85, 128, 68, 48, 54, 55, 72, 128, 68, 48, 54, 55, 71, 128, 68, \r
+    48, 54, 55, 70, 128, 68, 48, 54, 55, 69, 128, 68, 48, 54, 55, 68, 128, \r
+    68, 48, 54, 55, 67, 128, 68, 48, 54, 55, 66, 128, 68, 48, 54, 55, 65, \r
+    128, 68, 48, 54, 55, 128, 68, 48, 54, 54, 128, 68, 48, 54, 53, 128, 68, \r
+    48, 54, 52, 128, 68, 48, 54, 51, 128, 68, 48, 54, 50, 128, 68, 48, 54, \r
+    49, 128, 68, 48, 54, 48, 128, 68, 48, 53, 57, 128, 68, 48, 53, 56, 128, \r
+    68, 48, 53, 55, 128, 68, 48, 53, 54, 128, 68, 48, 53, 53, 128, 68, 48, \r
+    53, 52, 65, 128, 68, 48, 53, 52, 128, 68, 48, 53, 51, 128, 68, 48, 53, \r
+    50, 65, 128, 68, 48, 53, 50, 128, 68, 48, 53, 49, 128, 68, 48, 53, 48, \r
+    73, 128, 68, 48, 53, 48, 72, 128, 68, 48, 53, 48, 71, 128, 68, 48, 53, \r
+    48, 70, 128, 68, 48, 53, 48, 69, 128, 68, 48, 53, 48, 68, 128, 68, 48, \r
+    53, 48, 67, 128, 68, 48, 53, 48, 66, 128, 68, 48, 53, 48, 65, 128, 68, \r
+    48, 53, 48, 128, 68, 48, 52, 57, 128, 68, 48, 52, 56, 65, 128, 68, 48, \r
+    52, 56, 128, 68, 48, 52, 55, 128, 68, 48, 52, 54, 65, 128, 68, 48, 52, \r
+    54, 128, 68, 48, 52, 53, 128, 68, 48, 52, 52, 128, 68, 48, 52, 51, 128, \r
+    68, 48, 52, 50, 128, 68, 48, 52, 49, 128, 68, 48, 52, 48, 128, 68, 48, \r
+    51, 57, 128, 68, 48, 51, 56, 128, 68, 48, 51, 55, 128, 68, 48, 51, 54, \r
+    128, 68, 48, 51, 53, 128, 68, 48, 51, 52, 65, 128, 68, 48, 51, 52, 128, \r
+    68, 48, 51, 51, 128, 68, 48, 51, 50, 128, 68, 48, 51, 49, 65, 128, 68, \r
+    48, 51, 49, 128, 68, 48, 51, 48, 128, 68, 48, 50, 57, 128, 68, 48, 50, \r
+    56, 128, 68, 48, 50, 55, 65, 128, 68, 48, 50, 55, 128, 68, 48, 50, 54, \r
+    128, 68, 48, 50, 53, 128, 68, 48, 50, 52, 128, 68, 48, 50, 51, 128, 68, \r
+    48, 50, 50, 128, 68, 48, 50, 49, 128, 68, 48, 50, 48, 128, 68, 48, 49, \r
+    57, 128, 68, 48, 49, 56, 128, 68, 48, 49, 55, 128, 68, 48, 49, 54, 128, \r
+    68, 48, 49, 53, 128, 68, 48, 49, 52, 128, 68, 48, 49, 51, 128, 68, 48, \r
+    49, 50, 128, 68, 48, 49, 49, 128, 68, 48, 49, 48, 128, 68, 48, 48, 57, \r
+    128, 68, 48, 48, 56, 65, 128, 68, 48, 48, 56, 128, 68, 48, 48, 55, 128, \r
+    68, 48, 48, 54, 128, 68, 48, 48, 53, 128, 68, 48, 48, 52, 128, 68, 48, \r
+    48, 51, 128, 68, 48, 48, 50, 128, 68, 48, 48, 49, 128, 67, 89, 88, 128, \r
+    67, 89, 84, 128, 67, 89, 82, 88, 128, 67, 89, 82, 69, 78, 65, 73, 195, \r
+    67, 89, 82, 128, 67, 89, 80, 82, 73, 79, 212, 67, 89, 80, 69, 82, 85, 83, \r
+    128, 67, 89, 80, 128, 67, 89, 76, 73, 78, 68, 82, 73, 67, 73, 84, 89, \r
+    128, 67, 89, 65, 128, 67, 89, 128, 67, 87, 79, 79, 128, 67, 87, 79, 128, \r
+    67, 87, 73, 73, 128, 67, 87, 73, 128, 67, 87, 69, 79, 82, 84, 72, 128, \r
+    67, 87, 69, 128, 67, 87, 65, 65, 128, 67, 85, 88, 128, 67, 85, 84, 128, \r
+    67, 85, 212, 67, 85, 83, 84, 79, 77, 69, 210, 67, 85, 82, 88, 128, 67, \r
+    85, 82, 86, 73, 78, 199, 67, 85, 82, 86, 69, 196, 67, 85, 82, 86, 69, \r
+    128, 67, 85, 82, 86, 197, 67, 85, 82, 82, 69, 78, 84, 128, 67, 85, 82, \r
+    82, 69, 78, 212, 67, 85, 82, 76, 217, 67, 85, 82, 76, 128, 67, 85, 82, \r
+    128, 67, 85, 80, 128, 67, 85, 208, 67, 85, 79, 88, 128, 67, 85, 79, 80, \r
+    128, 67, 85, 79, 128, 67, 85, 205, 67, 85, 66, 69, 68, 128, 67, 85, 66, \r
+    197, 67, 85, 65, 84, 82, 73, 76, 76, 79, 128, 67, 85, 65, 84, 82, 73, 76, \r
+    76, 207, 67, 85, 128, 67, 82, 89, 80, 84, 79, 71, 82, 65, 77, 77, 73, \r
+    195, 67, 82, 85, 90, 69, 73, 82, 207, 67, 82, 79, 83, 83, 73, 78, 199, \r
+    67, 82, 79, 83, 83, 72, 65, 84, 67, 200, 67, 82, 79, 83, 83, 69, 68, 45, \r
+    84, 65, 73, 76, 128, 67, 82, 79, 83, 83, 69, 196, 67, 82, 79, 83, 83, 66, \r
+    79, 78, 69, 83, 128, 67, 82, 79, 83, 83, 128, 67, 82, 79, 83, 211, 67, \r
+    82, 79, 80, 128, 67, 82, 79, 73, 88, 128, 67, 82, 69, 83, 67, 69, 78, 84, \r
+    128, 67, 82, 69, 83, 67, 69, 78, 212, 67, 82, 69, 68, 73, 212, 67, 82, \r
+    69, 65, 84, 73, 86, 197, 67, 79, 88, 128, 67, 79, 87, 128, 67, 79, 86, \r
+    69, 82, 128, 67, 79, 85, 78, 84, 73, 78, 199, 67, 79, 85, 78, 84, 69, 82, \r
+    83, 73, 78, 75, 128, 67, 79, 85, 78, 84, 69, 82, 66, 79, 82, 69, 128, 67, \r
+    79, 85, 78, 67, 73, 204, 67, 79, 84, 128, 67, 79, 82, 82, 69, 83, 80, 79, \r
+    78, 68, 211, 67, 79, 82, 82, 69, 67, 84, 128, 67, 79, 82, 80, 83, 69, \r
+    128, 67, 79, 82, 80, 79, 82, 65, 84, 73, 79, 78, 128, 67, 79, 82, 79, 78, \r
+    73, 83, 128, 67, 79, 82, 78, 69, 82, 83, 128, 67, 79, 82, 78, 69, 82, \r
+    128, 67, 79, 82, 78, 69, 210, 67, 79, 80, 89, 82, 73, 71, 72, 84, 128, \r
+    67, 79, 80, 89, 82, 73, 71, 72, 212, 67, 79, 80, 89, 128, 67, 79, 80, 82, \r
+    79, 68, 85, 67, 84, 128, 67, 79, 80, 128, 67, 79, 79, 128, 67, 79, 78, \r
+    86, 69, 82, 71, 73, 78, 199, 67, 79, 78, 84, 82, 79, 204, 67, 79, 78, 84, \r
+    82, 65, 82, 73, 69, 84, 89, 128, 67, 79, 78, 84, 82, 65, 67, 84, 73, 79, \r
+    78, 128, 67, 79, 78, 84, 79, 85, 82, 69, 196, 67, 79, 78, 84, 79, 85, \r
+    210, 67, 79, 78, 84, 69, 78, 84, 73, 79, 78, 128, 67, 79, 78, 84, 69, 77, \r
+    80, 76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 84, 65, 73, 78, 211, 67, 79, \r
+    78, 84, 65, 73, 78, 73, 78, 199, 67, 79, 78, 84, 65, 73, 206, 67, 79, 78, \r
+    84, 65, 67, 84, 128, 67, 79, 78, 83, 84, 65, 78, 84, 128, 67, 79, 78, 83, \r
+    84, 65, 78, 212, 67, 79, 78, 83, 84, 65, 78, 67, 89, 128, 67, 79, 78, 83, \r
+    79, 78, 65, 78, 212, 67, 79, 78, 83, 69, 67, 85, 84, 73, 86, 197, 67, 79, \r
+    78, 74, 85, 78, 67, 84, 73, 79, 78, 128, 67, 79, 78, 74, 85, 71, 65, 84, \r
+    197, 67, 79, 78, 74, 79, 73, 78, 73, 78, 199, 67, 79, 78, 73, 67, 65, \r
+    204, 67, 79, 78, 71, 82, 85, 69, 78, 212, 67, 79, 78, 71, 82, 65, 84, 85, \r
+    76, 65, 84, 73, 79, 78, 128, 67, 79, 78, 70, 76, 73, 67, 84, 128, 67, 79, \r
+    78, 67, 65, 86, 69, 45, 83, 73, 68, 69, 196, 67, 79, 78, 67, 65, 86, 69, \r
+    45, 80, 79, 73, 78, 84, 69, 196, 67, 79, 78, 128, 67, 79, 77, 80, 79, 83, \r
+    73, 84, 73, 79, 78, 128, 67, 79, 77, 80, 79, 83, 73, 84, 73, 79, 206, 67, \r
+    79, 77, 80, 76, 73, 65, 78, 67, 69, 128, 67, 79, 77, 80, 76, 69, 84, 73, \r
+    79, 78, 128, 67, 79, 77, 80, 76, 69, 84, 69, 68, 128, 67, 79, 77, 80, 76, \r
+    69, 77, 69, 78, 84, 128, 67, 79, 77, 80, 65, 82, 69, 128, 67, 79, 77, 77, \r
+    79, 206, 67, 79, 77, 77, 69, 82, 67, 73, 65, 204, 67, 79, 77, 77, 65, \r
+    128, 67, 79, 77, 77, 193, 67, 79, 77, 73, 78, 199, 67, 79, 77, 69, 84, \r
+    128, 67, 79, 77, 66, 128, 67, 79, 76, 85, 77, 78, 128, 67, 79, 76, 79, \r
+    82, 128, 67, 79, 76, 76, 128, 67, 79, 70, 70, 73, 78, 128, 67, 79, 69, \r
+    78, 71, 128, 67, 79, 68, 65, 128, 67, 79, 65, 128, 67, 79, 128, 67, 77, \r
+    128, 67, 205, 67, 76, 85, 83, 84, 69, 210, 67, 76, 85, 66, 45, 83, 80, \r
+    79, 75, 69, 196, 67, 76, 85, 66, 128, 67, 76, 85, 194, 67, 76, 79, 85, \r
+    68, 128, 67, 76, 79, 85, 196, 67, 76, 79, 84, 72, 69, 83, 128, 67, 76, \r
+    79, 84, 72, 128, 67, 76, 79, 83, 69, 78, 69, 83, 83, 128, 67, 76, 79, 83, \r
+    69, 68, 128, 67, 76, 79, 83, 69, 196, 67, 76, 79, 83, 197, 67, 76, 79, \r
+    67, 75, 87, 73, 83, 197, 67, 76, 73, 86, 73, 83, 128, 67, 76, 73, 78, 71, \r
+    73, 78, 199, 67, 76, 73, 77, 65, 67, 85, 83, 128, 67, 76, 73, 70, 70, \r
+    128, 67, 76, 73, 67, 75, 128, 67, 76, 69, 70, 45, 50, 128, 67, 76, 69, \r
+    70, 45, 49, 128, 67, 76, 69, 70, 128, 67, 76, 69, 198, 67, 76, 69, 65, \r
+    210, 67, 76, 65, 87, 128, 67, 76, 65, 78, 128, 67, 73, 88, 128, 67, 73, \r
+    86, 73, 76, 73, 65, 78, 128, 67, 73, 84, 128, 67, 73, 82, 67, 85, 77, 70, \r
+    76, 69, 88, 128, 67, 73, 82, 67, 85, 77, 70, 76, 69, 216, 67, 73, 82, 67, \r
+    85, 76, 65, 84, 73, 79, 206, 67, 73, 82, 67, 76, 69, 83, 128, 67, 73, 82, \r
+    67, 76, 69, 128, 67, 73, 80, 128, 67, 73, 73, 128, 67, 73, 69, 88, 128, \r
+    67, 73, 69, 85, 67, 45, 83, 83, 65, 78, 71, 80, 73, 69, 85, 80, 128, 67, \r
+    73, 69, 85, 67, 45, 80, 73, 69, 85, 80, 128, 67, 73, 69, 85, 67, 45, 73, \r
+    69, 85, 78, 71, 128, 67, 73, 69, 85, 195, 67, 73, 69, 84, 128, 67, 73, \r
+    69, 80, 128, 67, 73, 69, 128, 67, 73, 128, 67, 72, 89, 88, 128, 67, 72, \r
+    89, 84, 128, 67, 72, 89, 82, 88, 128, 67, 72, 89, 82, 128, 67, 72, 89, \r
+    80, 128, 67, 72, 85, 88, 128, 67, 72, 85, 82, 88, 128, 67, 72, 85, 82, \r
+    67, 72, 128, 67, 72, 85, 82, 128, 67, 72, 85, 80, 128, 67, 72, 85, 79, \r
+    88, 128, 67, 72, 85, 79, 84, 128, 67, 72, 85, 79, 80, 128, 67, 72, 85, \r
+    79, 128, 67, 72, 85, 76, 65, 128, 67, 72, 85, 128, 67, 72, 82, 89, 83, \r
+    65, 78, 84, 72, 69, 77, 85, 77, 128, 67, 72, 82, 79, 78, 79, 85, 128, 67, \r
+    72, 82, 79, 78, 79, 78, 128, 67, 72, 82, 79, 77, 193, 67, 72, 82, 79, \r
+    193, 67, 72, 82, 73, 86, 73, 128, 67, 72, 79, 88, 128, 67, 72, 79, 84, \r
+    128, 67, 72, 79, 82, 69, 86, 77, 193, 67, 72, 79, 80, 128, 67, 72, 79, \r
+    75, 69, 128, 67, 72, 79, 69, 128, 67, 72, 79, 65, 128, 67, 72, 79, 128, \r
+    67, 72, 207, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 83, 73, \r
+    79, 83, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 83, 65, 78, 71, 67, 73, \r
+    69, 85, 67, 128, 67, 72, 73, 84, 85, 69, 85, 77, 83, 73, 79, 83, 128, 67, \r
+    72, 73, 84, 85, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 72, 73, 84, 85, \r
+    69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 72, 73, 82, 79, 78, 128, \r
+    67, 72, 73, 82, 69, 84, 128, 67, 72, 73, 78, 71, 128, 67, 72, 73, 78, 69, \r
+    83, 197, 67, 72, 73, 78, 128, 67, 72, 73, 76, 76, 213, 67, 72, 73, 76, \r
+    68, 128, 67, 72, 73, 76, 128, 67, 72, 73, 75, 201, 67, 72, 73, 69, 85, \r
+    67, 72, 45, 75, 72, 73, 69, 85, 75, 72, 128, 67, 72, 73, 69, 85, 67, 72, \r
+    45, 72, 73, 69, 85, 72, 128, 67, 72, 73, 69, 85, 67, 200, 67, 72, 73, \r
+    128, 67, 72, 201, 67, 72, 72, 65, 128, 67, 72, 69, 88, 128, 67, 72, 69, \r
+    86, 82, 79, 206, 67, 72, 69, 84, 128, 67, 72, 69, 83, 211, 67, 72, 69, \r
+    80, 128, 67, 72, 69, 206, 67, 72, 69, 73, 78, 65, 80, 128, 67, 72, 69, \r
+    73, 75, 72, 69, 73, 128, 67, 72, 69, 69, 128, 67, 72, 69, 67, 75, 128, \r
+    67, 72, 69, 67, 203, 67, 72, 197, 67, 72, 65, 88, 128, 67, 72, 65, 86, \r
+    73, 89, 65, 78, 73, 128, 67, 72, 65, 84, 84, 65, 87, 65, 128, 67, 72, 65, \r
+    84, 128, 67, 72, 65, 82, 73, 79, 84, 128, 67, 72, 65, 82, 73, 79, 212, \r
+    67, 72, 65, 82, 65, 67, 84, 69, 82, 83, 128, 67, 72, 65, 82, 65, 67, 84, \r
+    69, 82, 128, 67, 72, 65, 82, 128, 67, 72, 65, 80, 128, 67, 72, 65, 78, \r
+    71, 69, 128, 67, 72, 65, 78, 71, 128, 67, 72, 65, 78, 128, 67, 72, 65, \r
+    77, 75, 79, 128, 67, 72, 65, 77, 73, 76, 79, 78, 128, 67, 72, 65, 77, 73, \r
+    76, 73, 128, 67, 72, 65, 73, 82, 128, 67, 72, 65, 73, 78, 83, 128, 67, \r
+    72, 65, 68, 65, 128, 67, 72, 65, 196, 67, 72, 65, 65, 128, 67, 69, 88, \r
+    128, 67, 69, 82, 69, 83, 128, 67, 69, 82, 69, 75, 128, 67, 69, 82, 45, \r
+    87, 65, 128, 67, 69, 80, 128, 67, 69, 79, 78, 71, 67, 72, 73, 69, 85, 77, \r
+    83, 83, 65, 78, 71, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, 72, 73, \r
+    69, 85, 77, 83, 83, 65, 78, 71, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, \r
+    71, 67, 72, 73, 69, 85, 77, 83, 73, 79, 83, 128, 67, 69, 79, 78, 71, 67, \r
+    72, 73, 69, 85, 77, 67, 73, 69, 85, 67, 128, 67, 69, 79, 78, 71, 67, 72, \r
+    73, 69, 85, 77, 67, 72, 73, 69, 85, 67, 72, 128, 67, 69, 78, 84, 85, 82, \r
+    73, 65, 204, 67, 69, 78, 84, 82, 69, 76, 73, 78, 197, 67, 69, 78, 84, 82, \r
+    69, 196, 67, 69, 78, 84, 82, 69, 128, 67, 69, 78, 84, 82, 197, 67, 69, \r
+    78, 128, 67, 69, 76, 83, 73, 85, 83, 128, 67, 69, 73, 82, 84, 128, 67, \r
+    69, 73, 76, 73, 78, 71, 128, 67, 69, 69, 128, 67, 69, 68, 73, 76, 76, 65, \r
+    128, 67, 69, 68, 73, 76, 76, 193, 67, 69, 68, 201, 67, 69, 67, 69, 75, \r
+    128, 67, 69, 67, 65, 75, 128, 67, 69, 67, 65, 203, 67, 69, 65, 76, 67, \r
+    128, 67, 67, 85, 128, 67, 67, 79, 128, 67, 67, 73, 128, 67, 67, 72, 85, \r
+    128, 67, 67, 72, 79, 128, 67, 67, 72, 73, 128, 67, 67, 72, 69, 69, 128, \r
+    67, 67, 72, 69, 128, 67, 67, 72, 65, 65, 128, 67, 67, 72, 65, 128, 67, \r
+    67, 69, 69, 128, 67, 67, 69, 128, 67, 67, 65, 65, 128, 67, 67, 65, 128, \r
+    67, 65, 89, 78, 128, 67, 65, 89, 65, 78, 78, 65, 128, 67, 65, 88, 128, \r
+    67, 65, 86, 69, 128, 67, 65, 85, 84, 73, 79, 206, 67, 65, 85, 76, 68, 82, \r
+    79, 78, 128, 67, 65, 85, 68, 65, 128, 67, 65, 84, 65, 87, 65, 128, 67, \r
+    65, 84, 128, 67, 65, 83, 84, 76, 69, 128, 67, 65, 82, 89, 83, 84, 73, 65, \r
+    206, 67, 65, 82, 84, 128, 67, 65, 82, 82, 73, 65, 71, 197, 67, 65, 82, \r
+    80, 69, 78, 84, 82, 217, 67, 65, 82, 79, 78, 128, 67, 65, 82, 79, 206, \r
+    67, 65, 82, 73, 203, 67, 65, 82, 73, 65, 206, 67, 65, 82, 69, 84, 128, \r
+    67, 65, 82, 69, 212, 67, 65, 82, 197, 67, 65, 82, 128, 67, 65, 210, 67, \r
+    65, 80, 84, 73, 86, 69, 128, 67, 65, 80, 82, 73, 67, 79, 82, 78, 128, 67, \r
+    65, 80, 79, 128, 67, 65, 80, 73, 84, 65, 76, 128, 67, 65, 78, 84, 73, 76, \r
+    76, 65, 84, 73, 79, 206, 67, 65, 78, 199, 67, 65, 78, 68, 82, 65, 66, 73, \r
+    78, 68, 85, 128, 67, 65, 78, 68, 82, 65, 66, 73, 78, 68, 213, 67, 65, 78, \r
+    68, 82, 65, 128, 67, 65, 78, 68, 82, 193, 67, 65, 78, 67, 69, 82, 128, \r
+    67, 65, 78, 67, 69, 76, 76, 65, 84, 73, 79, 206, 67, 65, 78, 67, 69, 76, \r
+    128, 67, 65, 78, 67, 69, 204, 67, 65, 78, 128, 67, 65, 77, 78, 85, 195, \r
+    67, 65, 76, 89, 65, 128, 67, 65, 76, 89, 193, 67, 65, 76, 76, 128, 67, \r
+    65, 76, 67, 128, 67, 65, 75, 82, 65, 128, 67, 65, 69, 83, 85, 82, 65, \r
+    128, 67, 65, 68, 85, 67, 69, 85, 83, 128, 67, 65, 68, 193, 67, 65, 65, \r
+    78, 71, 128, 67, 65, 65, 73, 128, 67, 193, 67, 48, 50, 52, 128, 67, 48, \r
+    50, 51, 128, 67, 48, 50, 50, 128, 67, 48, 50, 49, 128, 67, 48, 50, 48, \r
+    128, 67, 48, 49, 57, 128, 67, 48, 49, 56, 128, 67, 48, 49, 55, 128, 67, \r
+    48, 49, 54, 128, 67, 48, 49, 53, 128, 67, 48, 49, 52, 128, 67, 48, 49, \r
+    51, 128, 67, 48, 49, 50, 128, 67, 48, 49, 49, 128, 67, 48, 49, 48, 65, \r
+    128, 67, 48, 49, 48, 128, 67, 48, 48, 57, 128, 67, 48, 48, 56, 128, 67, \r
+    48, 48, 55, 128, 67, 48, 48, 54, 128, 67, 48, 48, 53, 128, 67, 48, 48, \r
+    52, 128, 67, 48, 48, 51, 128, 67, 48, 48, 50, 67, 128, 67, 48, 48, 50, \r
+    66, 128, 67, 48, 48, 50, 65, 128, 67, 48, 48, 50, 128, 67, 48, 48, 49, \r
+    128, 67, 45, 83, 73, 77, 80, 76, 73, 70, 73, 69, 196, 67, 45, 51, 57, \r
+    128, 67, 45, 49, 56, 128, 66, 90, 85, 78, 199, 66, 90, 72, 201, 66, 89, \r
+    69, 76, 79, 82, 85, 83, 83, 73, 65, 78, 45, 85, 75, 82, 65, 73, 78, 73, \r
+    65, 206, 66, 217, 66, 88, 71, 128, 66, 87, 73, 128, 66, 87, 69, 69, 128, \r
+    66, 87, 69, 128, 66, 87, 65, 128, 66, 85, 85, 77, 73, 83, 72, 128, 66, \r
+    85, 212, 66, 85, 83, 83, 89, 69, 82, 85, 128, 66, 85, 82, 213, 66, 85, \r
+    82, 50, 128, 66, 85, 210, 66, 85, 79, 88, 128, 66, 85, 79, 80, 128, 66, \r
+    85, 79, 128, 66, 85, 77, 80, 217, 66, 85, 76, 85, 71, 128, 66, 85, 76, \r
+    85, 199, 66, 85, 76, 76, 83, 69, 89, 69, 128, 66, 85, 76, 76, 211, 66, \r
+    85, 76, 76, 69, 84, 128, 66, 85, 76, 76, 69, 212, 66, 85, 76, 76, 128, \r
+    66, 85, 75, 89, 128, 66, 85, 72, 73, 196, 66, 85, 71, 73, 78, 69, 83, \r
+    197, 66, 85, 67, 75, 76, 69, 128, 66, 83, 84, 65, 82, 128, 66, 83, 75, \r
+    85, 210, 66, 83, 75, 65, 173, 66, 83, 68, 85, 211, 66, 82, 85, 83, 72, \r
+    128, 66, 82, 85, 83, 200, 66, 82, 79, 78, 90, 69, 128, 66, 82, 79, 75, \r
+    69, 206, 66, 82, 79, 65, 196, 66, 82, 73, 83, 84, 76, 69, 128, 66, 82, \r
+    73, 68, 71, 197, 66, 82, 69, 86, 73, 83, 128, 66, 82, 69, 86, 69, 45, 77, \r
+    65, 67, 82, 79, 78, 128, 66, 82, 69, 86, 197, 66, 82, 69, 65, 84, 200, \r
+    66, 82, 69, 65, 75, 84, 72, 82, 79, 85, 71, 72, 128, 66, 82, 68, 193, 66, \r
+    82, 65, 78, 67, 72, 73, 78, 199, 66, 82, 65, 78, 67, 72, 128, 66, 82, 65, \r
+    78, 67, 200, 66, 82, 65, 75, 67, 69, 84, 128, 66, 82, 65, 67, 75, 69, 84, \r
+    69, 196, 66, 82, 65, 67, 75, 69, 212, 66, 82, 65, 67, 69, 128, 66, 81, \r
+    128, 66, 79, 87, 84, 73, 69, 128, 66, 79, 87, 84, 73, 197, 66, 79, 87, \r
+    128, 66, 79, 215, 66, 79, 85, 78, 68, 65, 82, 217, 66, 79, 84, 84, 79, \r
+    77, 45, 76, 73, 71, 72, 84, 69, 196, 66, 79, 84, 84, 79, 77, 128, 66, 79, \r
+    84, 84, 79, 205, 66, 79, 82, 85, 84, 79, 128, 66, 79, 79, 77, 69, 82, 65, \r
+    78, 71, 128, 66, 79, 78, 69, 128, 66, 79, 76, 212, 66, 79, 68, 89, 128, \r
+    66, 79, 65, 82, 128, 66, 79, 65, 128, 66, 76, 85, 69, 128, 66, 76, 79, \r
+    79, 68, 128, 66, 76, 79, 67, 75, 128, 66, 76, 69, 78, 68, 69, 196, 66, \r
+    76, 65, 78, 75, 128, 66, 76, 65, 78, 203, 66, 76, 65, 68, 197, 66, 76, \r
+    65, 67, 75, 70, 79, 79, 212, 66, 76, 65, 67, 75, 45, 76, 69, 84, 84, 69, \r
+    210, 66, 76, 65, 67, 75, 45, 70, 69, 65, 84, 72, 69, 82, 69, 196, 66, 76, \r
+    65, 67, 75, 128, 66, 75, 65, 173, 66, 73, 84, 84, 69, 82, 128, 66, 73, \r
+    84, 73, 78, 199, 66, 73, 83, 77, 73, 76, 76, 65, 200, 66, 73, 83, 72, 79, \r
+    80, 128, 66, 73, 83, 69, 67, 84, 73, 78, 199, 66, 73, 83, 65, 72, 128, \r
+    66, 73, 82, 85, 128, 66, 73, 82, 71, 65, 128, 66, 73, 82, 68, 128, 66, \r
+    73, 79, 72, 65, 90, 65, 82, 196, 66, 73, 78, 79, 67, 85, 76, 65, 210, 66, \r
+    73, 78, 68, 73, 78, 199, 66, 73, 78, 68, 73, 128, 66, 73, 78, 65, 82, \r
+    217, 66, 73, 76, 65, 66, 73, 65, 204, 66, 73, 71, 128, 66, 73, 199, 66, \r
+    73, 69, 84, 128, 66, 73, 68, 69, 78, 84, 65, 204, 66, 73, 66, 76, 69, 45, \r
+    67, 82, 69, 197, 66, 73, 66, 128, 66, 201, 66, 72, 85, 128, 66, 72, 79, \r
+    79, 128, 66, 72, 79, 128, 66, 72, 73, 128, 66, 72, 69, 84, 72, 128, 66, \r
+    72, 69, 69, 128, 66, 72, 69, 128, 66, 72, 65, 77, 128, 66, 72, 65, 128, \r
+    66, 69, 89, 89, 65, 76, 128, 66, 69, 88, 128, 66, 69, 86, 69, 82, 65, 71, \r
+    69, 128, 66, 69, 84, 87, 69, 69, 78, 128, 66, 69, 84, 87, 69, 69, 206, \r
+    66, 69, 84, 72, 128, 66, 69, 84, 65, 128, 66, 69, 84, 193, 66, 69, 84, \r
+    128, 66, 69, 212, 66, 69, 83, 73, 68, 197, 66, 69, 82, 75, 65, 78, 65, \r
+    206, 66, 69, 82, 66, 69, 210, 66, 69, 80, 128, 66, 69, 79, 82, 195, 66, \r
+    69, 78, 90, 69, 78, 197, 66, 69, 78, 68, 69, 128, 66, 69, 78, 68, 128, \r
+    66, 69, 206, 66, 69, 76, 84, 128, 66, 69, 76, 212, 66, 69, 76, 79, 215, \r
+    66, 69, 76, 76, 128, 66, 69, 76, 204, 66, 69, 76, 71, 84, 72, 79, 210, \r
+    66, 69, 73, 84, 72, 128, 66, 69, 72, 73, 78, 196, 66, 69, 72, 69, 72, \r
+    128, 66, 69, 72, 69, 200, 66, 69, 72, 128, 66, 69, 200, 66, 69, 71, 73, \r
+    78, 78, 73, 78, 71, 128, 66, 69, 71, 73, 206, 66, 69, 70, 79, 82, 197, \r
+    66, 69, 69, 84, 65, 128, 66, 69, 69, 72, 73, 86, 69, 128, 66, 69, 69, 72, \r
+    128, 66, 69, 69, 200, 66, 69, 67, 65, 85, 83, 69, 128, 66, 69, 65, 86, \r
+    69, 210, 66, 69, 65, 84, 128, 66, 69, 65, 78, 128, 66, 69, 65, 77, 69, \r
+    196, 66, 67, 65, 68, 128, 66, 67, 65, 196, 66, 66, 89, 88, 128, 66, 66, \r
+    89, 84, 128, 66, 66, 89, 80, 128, 66, 66, 89, 128, 66, 66, 85, 88, 128, \r
+    66, 66, 85, 84, 128, 66, 66, 85, 82, 88, 128, 66, 66, 85, 82, 128, 66, \r
+    66, 85, 80, 128, 66, 66, 85, 79, 88, 128, 66, 66, 85, 79, 80, 128, 66, \r
+    66, 85, 79, 128, 66, 66, 85, 128, 66, 66, 79, 88, 128, 66, 66, 79, 84, \r
+    128, 66, 66, 79, 80, 128, 66, 66, 79, 128, 66, 66, 73, 88, 128, 66, 66, \r
+    73, 84, 128, 66, 66, 73, 80, 128, 66, 66, 73, 69, 88, 128, 66, 66, 73, \r
+    69, 84, 128, 66, 66, 73, 69, 80, 128, 66, 66, 73, 69, 128, 66, 66, 73, \r
+    128, 66, 66, 69, 88, 128, 66, 66, 69, 80, 128, 66, 66, 69, 128, 66, 66, \r
+    65, 88, 128, 66, 66, 65, 84, 128, 66, 66, 65, 80, 128, 66, 66, 65, 128, \r
+    66, 65, 89, 65, 78, 78, 65, 128, 66, 65, 85, 128, 66, 65, 84, 72, 84, 85, \r
+    66, 128, 66, 65, 84, 72, 65, 77, 65, 83, 65, 84, 128, 66, 65, 83, 83, 65, \r
+    128, 66, 65, 83, 72, 75, 73, 210, 66, 65, 83, 72, 128, 66, 65, 83, 69, \r
+    66, 65, 76, 76, 128, 66, 65, 83, 69, 128, 66, 65, 83, 197, 66, 65, 82, \r
+    83, 128, 66, 65, 82, 82, 73, 69, 82, 128, 66, 65, 82, 82, 69, 75, 72, \r
+    128, 66, 65, 82, 82, 69, 69, 128, 66, 65, 82, 82, 69, 197, 66, 65, 82, \r
+    76, 73, 78, 69, 128, 66, 65, 82, 76, 69, 89, 128, 66, 65, 82, 73, 89, 79, \r
+    79, 83, 65, 78, 128, 66, 65, 82, 65, 50, 128, 66, 65, 210, 66, 65, 78, \r
+    84, 79, 67, 128, 66, 65, 78, 203, 66, 65, 78, 68, 128, 66, 65, 78, 50, \r
+    128, 66, 65, 78, 178, 66, 65, 77, 66, 79, 79, 83, 128, 66, 65, 77, 66, \r
+    79, 79, 128, 66, 65, 76, 85, 68, 65, 128, 66, 65, 76, 76, 79, 212, 66, \r
+    65, 76, 76, 79, 79, 78, 45, 83, 80, 79, 75, 69, 196, 66, 65, 76, 65, 71, \r
+    128, 66, 65, 76, 128, 66, 65, 204, 66, 65, 73, 82, 75, 65, 78, 128, 66, \r
+    65, 73, 77, 65, 73, 128, 66, 65, 72, 84, 128, 66, 65, 72, 73, 82, 71, 79, \r
+    77, 85, 75, 72, 65, 128, 66, 65, 72, 65, 82, 50, 128, 66, 65, 71, 65, \r
+    128, 66, 65, 71, 51, 128, 66, 65, 199, 66, 65, 68, 71, 69, 82, 128, 66, \r
+    65, 68, 128, 66, 65, 67, 75, 83, 80, 65, 67, 69, 128, 66, 65, 67, 75, 83, \r
+    76, 65, 83, 72, 128, 66, 65, 67, 75, 83, 76, 65, 83, 200, 66, 65, 67, 75, \r
+    45, 84, 73, 76, 84, 69, 196, 66, 65, 67, 75, 128, 66, 65, 67, 203, 66, \r
+    65, 65, 82, 69, 82, 85, 128, 66, 51, 48, 53, 128, 66, 50, 53, 57, 128, \r
+    66, 50, 53, 56, 128, 66, 50, 53, 55, 128, 66, 50, 53, 54, 128, 66, 50, \r
+    53, 53, 128, 66, 50, 53, 180, 66, 50, 53, 51, 128, 66, 50, 53, 50, 128, \r
+    66, 50, 53, 49, 128, 66, 50, 53, 48, 128, 66, 50, 52, 57, 128, 66, 50, \r
+    52, 56, 128, 66, 50, 52, 183, 66, 50, 52, 54, 128, 66, 50, 52, 53, 128, \r
+    66, 50, 52, 179, 66, 50, 52, 178, 66, 50, 52, 177, 66, 50, 52, 176, 66, \r
+    50, 51, 54, 128, 66, 50, 51, 52, 128, 66, 50, 51, 179, 66, 50, 51, 50, \r
+    128, 66, 50, 51, 177, 66, 50, 51, 176, 66, 50, 50, 57, 128, 66, 50, 50, \r
+    56, 128, 66, 50, 50, 55, 128, 66, 50, 50, 54, 128, 66, 50, 50, 181, 66, \r
+    50, 50, 50, 128, 66, 50, 50, 49, 128, 66, 50, 50, 176, 66, 50, 49, 57, \r
+    128, 66, 50, 49, 56, 128, 66, 50, 49, 55, 128, 66, 50, 49, 54, 128, 66, \r
+    50, 49, 53, 128, 66, 50, 49, 52, 128, 66, 50, 49, 51, 128, 66, 50, 49, \r
+    50, 128, 66, 50, 49, 49, 128, 66, 50, 49, 48, 128, 66, 50, 48, 57, 128, \r
+    66, 50, 48, 56, 128, 66, 50, 48, 55, 128, 66, 50, 48, 54, 128, 66, 50, \r
+    48, 53, 128, 66, 50, 48, 52, 128, 66, 50, 48, 51, 128, 66, 50, 48, 50, \r
+    128, 66, 50, 48, 49, 128, 66, 50, 48, 48, 128, 66, 49, 57, 177, 66, 49, \r
+    57, 48, 128, 66, 49, 56, 57, 128, 66, 49, 56, 53, 128, 66, 49, 56, 52, \r
+    128, 66, 49, 56, 51, 128, 66, 49, 56, 50, 128, 66, 49, 56, 49, 128, 66, \r
+    49, 56, 48, 128, 66, 49, 55, 57, 128, 66, 49, 55, 56, 128, 66, 49, 55, \r
+    55, 128, 66, 49, 55, 182, 66, 49, 55, 52, 128, 66, 49, 55, 179, 66, 49, \r
+    55, 50, 128, 66, 49, 55, 49, 128, 66, 49, 55, 48, 128, 66, 49, 54, 57, \r
+    128, 66, 49, 54, 56, 128, 66, 49, 54, 55, 128, 66, 49, 54, 54, 128, 66, \r
+    49, 54, 53, 128, 66, 49, 54, 52, 128, 66, 49, 54, 179, 66, 49, 54, 178, \r
+    66, 49, 54, 49, 128, 66, 49, 54, 48, 128, 66, 49, 53, 185, 66, 49, 53, \r
+    56, 128, 66, 49, 53, 55, 128, 66, 49, 53, 182, 66, 49, 53, 53, 128, 66, \r
+    49, 53, 52, 128, 66, 49, 53, 51, 128, 66, 49, 53, 50, 128, 66, 49, 53, \r
+    177, 66, 49, 53, 48, 128, 66, 49, 52, 54, 128, 66, 49, 52, 181, 66, 49, \r
+    52, 50, 128, 66, 49, 52, 177, 66, 49, 52, 176, 66, 49, 51, 181, 66, 49, \r
+    51, 179, 66, 49, 51, 50, 128, 66, 49, 51, 177, 66, 49, 51, 176, 66, 49, \r
+    50, 184, 66, 49, 50, 183, 66, 49, 50, 181, 66, 49, 50, 179, 66, 49, 50, \r
+    178, 66, 49, 50, 177, 66, 49, 50, 176, 66, 49, 48, 57, 205, 66, 49, 48, \r
+    57, 198, 66, 49, 48, 56, 205, 66, 49, 48, 56, 198, 66, 49, 48, 55, 205, \r
+    66, 49, 48, 55, 198, 66, 49, 48, 54, 205, 66, 49, 48, 54, 198, 66, 49, \r
+    48, 53, 205, 66, 49, 48, 53, 198, 66, 49, 48, 181, 66, 49, 48, 180, 66, \r
+    49, 48, 178, 66, 49, 48, 176, 66, 48, 57, 177, 66, 48, 57, 176, 66, 48, \r
+    56, 57, 128, 66, 48, 56, 183, 66, 48, 56, 54, 128, 66, 48, 56, 181, 66, \r
+    48, 56, 51, 128, 66, 48, 56, 50, 128, 66, 48, 56, 177, 66, 48, 56, 176, \r
+    66, 48, 55, 57, 128, 66, 48, 55, 184, 66, 48, 55, 183, 66, 48, 55, 182, \r
+    66, 48, 55, 181, 66, 48, 55, 180, 66, 48, 55, 179, 66, 48, 55, 178, 66, \r
+    48, 55, 177, 66, 48, 55, 176, 66, 48, 54, 185, 66, 48, 54, 184, 66, 48, \r
+    54, 183, 66, 48, 54, 182, 66, 48, 54, 181, 66, 48, 54, 52, 128, 66, 48, \r
+    54, 51, 128, 66, 48, 54, 178, 66, 48, 54, 177, 66, 48, 54, 176, 66, 48, \r
+    53, 185, 66, 48, 53, 184, 66, 48, 53, 183, 66, 48, 53, 54, 128, 66, 48, \r
+    53, 181, 66, 48, 53, 180, 66, 48, 53, 179, 66, 48, 53, 178, 66, 48, 53, \r
+    177, 66, 48, 53, 176, 66, 48, 52, 57, 128, 66, 48, 52, 184, 66, 48, 52, \r
+    55, 128, 66, 48, 52, 182, 66, 48, 52, 181, 66, 48, 52, 180, 66, 48, 52, \r
+    179, 66, 48, 52, 178, 66, 48, 52, 177, 66, 48, 52, 176, 66, 48, 51, 185, \r
+    66, 48, 51, 184, 66, 48, 51, 183, 66, 48, 51, 182, 66, 48, 51, 52, 128, \r
+    66, 48, 51, 179, 66, 48, 51, 178, 66, 48, 51, 177, 66, 48, 51, 176, 66, \r
+    48, 50, 185, 66, 48, 50, 184, 66, 48, 50, 183, 66, 48, 50, 182, 66, 48, \r
+    50, 181, 66, 48, 50, 180, 66, 48, 50, 179, 66, 48, 50, 50, 128, 66, 48, \r
+    50, 177, 66, 48, 50, 176, 66, 48, 49, 57, 128, 66, 48, 49, 56, 128, 66, \r
+    48, 49, 183, 66, 48, 49, 182, 66, 48, 49, 181, 66, 48, 49, 180, 66, 48, \r
+    49, 179, 66, 48, 49, 178, 66, 48, 49, 177, 66, 48, 49, 176, 66, 48, 48, \r
+    57, 128, 66, 48, 48, 185, 66, 48, 48, 56, 128, 66, 48, 48, 184, 66, 48, \r
+    48, 55, 128, 66, 48, 48, 183, 66, 48, 48, 54, 128, 66, 48, 48, 182, 66, \r
+    48, 48, 53, 65, 128, 66, 48, 48, 53, 128, 66, 48, 48, 181, 66, 48, 48, \r
+    52, 128, 66, 48, 48, 180, 66, 48, 48, 51, 128, 66, 48, 48, 179, 66, 48, \r
+    48, 50, 128, 66, 48, 48, 178, 66, 48, 48, 49, 128, 66, 48, 48, 177, 65, \r
+    90, 85, 128, 65, 89, 69, 210, 65, 89, 66, 128, 65, 89, 65, 72, 128, 65, \r
+    88, 69, 128, 65, 87, 69, 128, 65, 86, 69, 83, 84, 65, 206, 65, 86, 69, \r
+    82, 65, 71, 197, 65, 86, 65, 75, 82, 65, 72, 65, 83, 65, 78, 89, 65, 128, \r
+    65, 86, 65, 71, 82, 65, 72, 65, 128, 65, 85, 89, 65, 78, 78, 65, 128, 65, \r
+    85, 84, 85, 77, 78, 128, 65, 85, 83, 84, 82, 65, 204, 65, 85, 82, 65, 77, \r
+    65, 90, 68, 65, 65, 72, 65, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, \r
+    45, 50, 128, 65, 85, 82, 65, 77, 65, 90, 68, 65, 65, 128, 65, 85, 78, 78, \r
+    128, 65, 85, 71, 85, 83, 84, 128, 65, 85, 71, 77, 69, 78, 84, 65, 84, 73, \r
+    79, 206, 65, 85, 69, 128, 65, 84, 84, 73, 195, 65, 84, 84, 72, 65, 67, \r
+    65, 78, 128, 65, 84, 84, 69, 78, 84, 73, 79, 78, 128, 65, 84, 84, 65, \r
+    203, 65, 84, 79, 205, 65, 84, 78, 65, 200, 65, 84, 77, 65, 65, 85, 128, \r
+    65, 84, 73, 89, 65, 128, 65, 84, 72, 65, 82, 86, 65, 86, 69, 68, 73, 195, \r
+    65, 84, 72, 65, 80, 65, 83, 67, 65, 206, 65, 83, 89, 85, 82, 193, 65, 83, \r
+    89, 77, 80, 84, 79, 84, 73, 67, 65, 76, 76, 217, 65, 83, 84, 82, 79, 76, \r
+    79, 71, 73, 67, 65, 204, 65, 83, 84, 69, 82, 73, 83, 77, 128, 65, 83, 84, \r
+    69, 82, 73, 83, 75, 211, 65, 83, 84, 69, 82, 73, 83, 75, 128, 65, 83, 84, \r
+    69, 82, 73, 83, 203, 65, 83, 84, 69, 82, 73, 83, 67, 85, 83, 128, 65, 83, \r
+    83, 89, 82, 73, 65, 206, 65, 83, 83, 69, 82, 84, 73, 79, 78, 128, 65, 83, \r
+    80, 73, 82, 65, 84, 69, 196, 65, 83, 80, 69, 82, 128, 65, 83, 72, 71, 65, \r
+    66, 128, 65, 83, 72, 57, 128, 65, 83, 72, 178, 65, 83, 67, 69, 78, 84, \r
+    128, 65, 83, 67, 69, 78, 68, 73, 78, 199, 65, 83, 65, 76, 50, 128, 65, \r
+    82, 85, 72, 85, 65, 128, 65, 82, 84, 65, 66, 197, 65, 82, 83, 69, 79, 83, \r
+    128, 65, 82, 83, 69, 79, 211, 65, 82, 82, 79, 87, 83, 128, 65, 82, 82, \r
+    79, 87, 72, 69, 65, 68, 128, 65, 82, 82, 79, 87, 72, 69, 65, 196, 65, 82, \r
+    82, 79, 87, 45, 84, 65, 73, 76, 128, 65, 82, 82, 73, 86, 69, 128, 65, 82, \r
+    82, 65, 89, 128, 65, 82, 80, 69, 71, 71, 73, 65, 84, 207, 65, 82, 79, 85, \r
+    83, 73, 78, 199, 65, 82, 79, 85, 82, 193, 65, 82, 79, 85, 78, 68, 45, 80, \r
+    82, 79, 70, 73, 76, 69, 128, 65, 82, 79, 85, 78, 196, 65, 82, 77, 89, \r
+    128, 65, 82, 77, 79, 85, 82, 128, 65, 82, 205, 65, 82, 76, 65, 85, 199, \r
+    65, 82, 75, 84, 73, 75, 207, 65, 82, 75, 65, 66, 128, 65, 82, 75, 65, 65, \r
+    78, 85, 128, 65, 82, 73, 83, 84, 69, 82, 65, 128, 65, 82, 73, 83, 84, 69, \r
+    82, 193, 65, 82, 73, 69, 83, 128, 65, 82, 71, 79, 84, 69, 82, 73, 128, \r
+    65, 82, 71, 79, 83, 89, 78, 84, 72, 69, 84, 79, 78, 128, 65, 82, 71, 73, \r
+    128, 65, 82, 69, 80, 65, 128, 65, 82, 68, 72, 65, 86, 73, 83, 65, 82, 71, \r
+    65, 128, 65, 82, 67, 72, 65, 73, 79, 78, 128, 65, 82, 67, 72, 65, 73, 79, \r
+    206, 65, 82, 67, 72, 65, 73, 195, 65, 82, 67, 200, 65, 82, 67, 128, 65, \r
+    82, 195, 65, 82, 65, 77, 65, 73, 195, 65, 82, 65, 69, 65, 69, 128, 65, \r
+    82, 65, 69, 65, 45, 85, 128, 65, 82, 65, 69, 65, 45, 73, 128, 65, 82, 65, \r
+    69, 65, 45, 69, 79, 128, 65, 82, 65, 69, 65, 45, 69, 128, 65, 82, 65, 69, \r
+    65, 45, 65, 128, 65, 82, 65, 68, 128, 65, 82, 65, 196, 65, 82, 65, 66, \r
+    73, 67, 45, 73, 78, 68, 73, 195, 65, 82, 65, 66, 73, 65, 206, 65, 82, 45, \r
+    82, 65, 72, 77, 65, 206, 65, 82, 45, 82, 65, 72, 69, 69, 77, 128, 65, 81, \r
+    85, 65, 82, 73, 85, 83, 128, 65, 80, 85, 206, 65, 80, 82, 73, 76, 128, \r
+    65, 80, 80, 82, 79, 88, 73, 77, 65, 84, 69, 76, 217, 65, 80, 80, 82, 79, \r
+    88, 73, 77, 65, 84, 69, 128, 65, 80, 80, 82, 79, 65, 67, 72, 69, 211, 65, \r
+    80, 80, 82, 79, 65, 67, 72, 128, 65, 80, 80, 76, 73, 67, 65, 84, 73, 79, \r
+    78, 128, 65, 80, 79, 84, 72, 69, 83, 128, 65, 80, 79, 84, 72, 69, 77, 65, \r
+    128, 65, 80, 79, 83, 84, 82, 79, 80, 72, 69, 128, 65, 80, 79, 83, 84, 82, \r
+    79, 70, 79, 83, 128, 65, 80, 79, 83, 84, 82, 79, 70, 79, 211, 65, 80, 79, \r
+    83, 84, 82, 79, 70, 79, 201, 65, 80, 79, 68, 69, 88, 73, 65, 128, 65, 80, \r
+    79, 68, 69, 82, 77, 193, 65, 80, 76, 79, 85, 78, 128, 65, 80, 76, 201, \r
+    65, 80, 73, 78, 128, 65, 80, 69, 83, 207, 65, 80, 65, 82, 84, 128, 65, \r
+    80, 65, 65, 84, 79, 128, 65, 78, 85, 83, 86, 65, 82, 65, 89, 65, 128, 65, \r
+    78, 85, 83, 86, 65, 82, 65, 128, 65, 78, 85, 83, 86, 65, 82, 193, 65, 78, \r
+    85, 68, 65, 84, 84, 65, 128, 65, 78, 85, 68, 65, 84, 84, 193, 65, 78, 84, \r
+    73, 82, 69, 83, 84, 82, 73, 67, 84, 73, 79, 78, 128, 65, 78, 84, 73, 75, \r
+    69, 78, 79, 77, 65, 128, 65, 78, 84, 73, 75, 69, 78, 79, 75, 89, 76, 73, \r
+    83, 77, 65, 128, 65, 78, 84, 73, 70, 79, 78, 73, 65, 128, 65, 78, 84, 73, \r
+    67, 76, 79, 67, 75, 87, 73, 83, 69, 45, 82, 79, 84, 65, 84, 69, 196, 65, \r
+    78, 84, 73, 67, 76, 79, 67, 75, 87, 73, 83, 197, 65, 78, 84, 65, 82, 71, \r
+    79, 77, 85, 75, 72, 65, 128, 65, 78, 83, 85, 218, 65, 78, 83, 72, 69, \r
+    128, 65, 78, 80, 69, 65, 128, 65, 78, 207, 65, 78, 78, 85, 73, 84, 217, \r
+    65, 78, 78, 79, 84, 65, 84, 73, 79, 206, 65, 78, 78, 65, 65, 85, 128, 65, \r
+    78, 75, 72, 128, 65, 78, 72, 85, 128, 65, 78, 71, 85, 76, 65, 82, 128, \r
+    65, 78, 71, 83, 84, 82, 79, 205, 65, 78, 71, 75, 72, 65, 78, 75, 72, 85, \r
+    128, 65, 78, 71, 69, 68, 128, 65, 78, 68, 65, 80, 128, 65, 78, 67, 79, \r
+    82, 65, 128, 65, 78, 67, 72, 79, 82, 128, 65, 78, 65, 84, 82, 73, 67, 72, \r
+    73, 83, 77, 65, 128, 65, 78, 65, 80, 128, 65, 77, 80, 83, 128, 65, 77, \r
+    80, 69, 82, 83, 65, 78, 68, 128, 65, 77, 79, 85, 78, 212, 65, 77, 66, \r
+    193, 65, 77, 65, 82, 128, 65, 77, 65, 210, 65, 77, 65, 76, 71, 65, 77, \r
+    65, 84, 73, 79, 206, 65, 76, 86, 69, 79, 76, 65, 210, 65, 76, 84, 69, 82, \r
+    78, 65, 84, 73, 86, 197, 65, 76, 84, 69, 82, 78, 65, 84, 73, 79, 206, 65, \r
+    76, 84, 69, 82, 78, 65, 84, 197, 65, 76, 84, 65, 128, 65, 76, 80, 72, 65, \r
+    128, 65, 76, 80, 72, 193, 65, 76, 80, 65, 80, 82, 65, 78, 65, 128, 65, \r
+    76, 80, 65, 80, 82, 65, 65, 78, 193, 65, 76, 80, 65, 128, 65, 76, 77, 79, \r
+    83, 212, 65, 76, 76, 79, 128, 65, 76, 76, 73, 65, 78, 67, 69, 128, 65, \r
+    76, 76, 201, 65, 76, 76, 65, 200, 65, 76, 73, 71, 78, 69, 196, 65, 76, \r
+    73, 70, 85, 128, 65, 76, 71, 73, 218, 65, 76, 70, 65, 128, 65, 76, 69, \r
+    85, 212, 65, 76, 69, 80, 72, 128, 65, 76, 69, 77, 66, 73, 67, 128, 65, \r
+    76, 69, 70, 128, 65, 76, 65, 89, 72, 69, 128, 65, 76, 65, 89, 72, 197, \r
+    65, 76, 65, 80, 72, 128, 65, 76, 45, 76, 65, 75, 85, 78, 65, 128, 65, 75, \r
+    84, 73, 69, 83, 69, 76, 83, 75, 65, 66, 128, 65, 75, 72, 77, 73, 77, 73, \r
+    195, 65, 75, 66, 65, 210, 65, 75, 65, 82, 65, 128, 65, 75, 65, 82, 193, \r
+    65, 73, 89, 65, 78, 78, 65, 128, 65, 73, 86, 73, 76, 73, 203, 65, 73, 84, \r
+    79, 206, 65, 73, 82, 80, 76, 65, 78, 69, 128, 65, 73, 78, 78, 128, 65, \r
+    73, 76, 77, 128, 65, 73, 75, 65, 82, 65, 128, 65, 73, 72, 86, 85, 83, \r
+    128, 65, 72, 83, 68, 65, 128, 65, 72, 83, 65, 128, 65, 72, 65, 71, 71, \r
+    65, 210, 65, 72, 65, 68, 128, 65, 71, 85, 78, 71, 128, 65, 71, 79, 71, \r
+    201, 65, 71, 71, 82, 65, 86, 65, 84, 73, 79, 78, 128, 65, 71, 71, 82, 65, \r
+    86, 65, 84, 69, 196, 65, 71, 65, 73, 78, 128, 65, 70, 84, 69, 210, 65, \r
+    70, 83, 65, 65, 81, 128, 65, 70, 82, 73, 67, 65, 206, 65, 70, 79, 82, 69, \r
+    77, 69, 78, 84, 73, 79, 78, 69, 68, 128, 65, 70, 71, 72, 65, 78, 201, 65, \r
+    69, 89, 65, 78, 78, 65, 128, 65, 69, 89, 128, 65, 69, 84, 128, 65, 69, \r
+    83, 67, 85, 76, 65, 80, 73, 85, 83, 128, 65, 69, 83, 67, 128, 65, 69, 83, \r
+    128, 65, 69, 82, 128, 65, 69, 76, 65, 45, 80, 73, 76, 76, 65, 128, 65, \r
+    69, 76, 128, 65, 69, 75, 128, 65, 69, 71, 69, 65, 206, 65, 69, 71, 128, \r
+    65, 69, 69, 89, 65, 78, 78, 65, 128, 65, 69, 69, 128, 65, 69, 68, 65, 45, \r
+    80, 73, 76, 76, 65, 128, 65, 69, 68, 128, 65, 69, 66, 128, 65, 197, 65, \r
+    68, 86, 65, 78, 67, 69, 128, 65, 68, 69, 71, 128, 65, 68, 69, 199, 65, \r
+    68, 68, 82, 69, 83, 83, 69, 196, 65, 68, 68, 65, 75, 128, 65, 68, 65, \r
+    203, 65, 67, 85, 84, 69, 45, 77, 65, 67, 82, 79, 78, 128, 65, 67, 85, 84, \r
+    69, 45, 71, 82, 65, 86, 69, 45, 65, 67, 85, 84, 69, 128, 65, 67, 85, 84, \r
+    197, 65, 67, 84, 85, 65, 76, 76, 217, 65, 67, 84, 73, 86, 65, 84, 197, \r
+    65, 67, 82, 79, 80, 72, 79, 78, 73, 195, 65, 67, 75, 78, 79, 87, 76, 69, \r
+    68, 71, 69, 128, 65, 67, 67, 85, 77, 85, 76, 65, 84, 73, 79, 78, 128, 65, \r
+    67, 67, 79, 85, 78, 212, 65, 67, 67, 69, 78, 84, 45, 83, 84, 65, 67, 67, \r
+    65, 84, 79, 128, 65, 67, 67, 69, 78, 84, 128, 65, 67, 67, 69, 78, 212, \r
+    65, 67, 65, 68, 69, 77, 217, 65, 66, 89, 83, 77, 65, 204, 65, 66, 85, 78, \r
+    68, 65, 78, 67, 69, 128, 65, 66, 75, 72, 65, 83, 73, 65, 206, 65, 66, 66, \r
+    82, 69, 86, 73, 65, 84, 73, 79, 206, 65, 66, 65, 70, 73, 76, 73, 128, 65, \r
+    66, 178, 65, 65, 89, 65, 78, 78, 65, 128, 65, 65, 89, 128, 65, 65, 87, \r
+    128, 65, 65, 79, 128, 65, 65, 74, 128, 65, 65, 66, 65, 65, 70, 73, 76, \r
+    73, 128, 65, 65, 48, 51, 50, 128, 65, 65, 48, 51, 49, 128, 65, 65, 48, \r
+    51, 48, 128, 65, 65, 48, 50, 57, 128, 65, 65, 48, 50, 56, 128, 65, 65, \r
+    48, 50, 55, 128, 65, 65, 48, 50, 54, 128, 65, 65, 48, 50, 53, 128, 65, \r
+    65, 48, 50, 52, 128, 65, 65, 48, 50, 51, 128, 65, 65, 48, 50, 50, 128, \r
+    65, 65, 48, 50, 49, 128, 65, 65, 48, 50, 48, 128, 65, 65, 48, 49, 57, \r
+    128, 65, 65, 48, 49, 56, 128, 65, 65, 48, 49, 55, 128, 65, 65, 48, 49, \r
+    54, 128, 65, 65, 48, 49, 53, 128, 65, 65, 48, 49, 52, 128, 65, 65, 48, \r
+    49, 51, 128, 65, 65, 48, 49, 50, 128, 65, 65, 48, 49, 49, 128, 65, 65, \r
+    48, 49, 48, 128, 65, 65, 48, 48, 57, 128, 65, 65, 48, 48, 56, 128, 65, \r
+    65, 48, 48, 55, 66, 128, 65, 65, 48, 48, 55, 65, 128, 65, 65, 48, 48, 55, \r
+    128, 65, 65, 48, 48, 54, 128, 65, 65, 48, 48, 53, 128, 65, 65, 48, 48, \r
+    52, 128, 65, 65, 48, 48, 51, 128, 65, 65, 48, 48, 50, 128, 65, 65, 48, \r
+    48, 49, 128, 65, 48, 55, 48, 128, 65, 48, 54, 57, 128, 65, 48, 54, 56, \r
+    128, 65, 48, 54, 55, 128, 65, 48, 54, 54, 128, 65, 48, 54, 53, 128, 65, \r
+    48, 54, 52, 128, 65, 48, 54, 51, 128, 65, 48, 54, 50, 128, 65, 48, 54, \r
+    49, 128, 65, 48, 54, 48, 128, 65, 48, 53, 57, 128, 65, 48, 53, 56, 128, \r
+    65, 48, 53, 55, 128, 65, 48, 53, 54, 128, 65, 48, 53, 53, 128, 65, 48, \r
+    53, 52, 128, 65, 48, 53, 51, 128, 65, 48, 53, 50, 128, 65, 48, 53, 49, \r
+    128, 65, 48, 53, 48, 128, 65, 48, 52, 57, 128, 65, 48, 52, 56, 128, 65, \r
+    48, 52, 55, 128, 65, 48, 52, 54, 128, 65, 48, 52, 53, 65, 128, 65, 48, \r
+    52, 53, 128, 65, 48, 52, 52, 128, 65, 48, 52, 51, 65, 128, 65, 48, 52, \r
+    51, 128, 65, 48, 52, 50, 65, 128, 65, 48, 52, 50, 128, 65, 48, 52, 49, \r
+    128, 65, 48, 52, 48, 65, 128, 65, 48, 52, 48, 128, 65, 48, 51, 57, 128, \r
+    65, 48, 51, 56, 128, 65, 48, 51, 55, 128, 65, 48, 51, 54, 128, 65, 48, \r
+    51, 53, 128, 65, 48, 51, 52, 128, 65, 48, 51, 51, 128, 65, 48, 51, 50, \r
+    65, 128, 65, 48, 49, 55, 65, 128, 65, 48, 49, 52, 65, 128, 65, 48, 48, \r
+    54, 66, 128, 65, 48, 48, 54, 65, 128, 65, 48, 48, 53, 65, 128, 65, 45, \r
+    69, 85, 128, 45, 85, 205, 45, 80, 72, 82, 85, 128, 45, 75, 72, 89, 85, \r
+    196, 45, 75, 72, 89, 73, 76, 128, 45, 68, 90, 85, 196, 45, 67, 72, 65, \r
+    210, 45, 67, 72, 65, 76, 128, \r
+};\r
+\r
+static unsigned int lexicon_offset[] = {\r
+    0, 0, 6, 10, 15, 23, 27, 34, 39, 41, 44, 52, 62, 68, 81, 93, 102, 108, \r
+    113, 121, 130, 135, 139, 145, 150, 158, 161, 168, 173, 181, 186, 192, \r
+    200, 207, 217, 224, 227, 236, 239, 242, 247, 253, 262, 266, 273, 280, \r
+    285, 294, 136, 302, 303, 309, 315, 323, 329, 335, 340, 346, 352, 360, \r
+    367, 369, 372, 376, 383, 390, 396, 403, 408, 410, 418, 421, 426, 307, \r
+    428, 430, 436, 441, 450, 455, 460, 470, 474, 487, 491, 496, 505, 508, \r
+    514, 518, 526, 536, 544, 551, 560, 568, 576, 581, 589, 600, 604, 611, \r
+    614, 620, 624, 628, 629, 634, 638, 640, 643, 652, 322, 655, 659, 664, \r
+    672, 676, 678, 681, 687, 694, 701, 710, 719, 722, 732, 741, 750, 756, \r
+    762, 769, 772, 780, 788, 792, 796, 804, 813, 822, 827, 831, 686, 838, \r
+    846, 850, 854, 857, 862, 867, 871, 879, 794, 609, 882, 887, 225, 890, \r
+    895, 905, 914, 920, 927, 934, 942, 946, 954, 960, 967, 973, 979, 984, \r
+    988, 994, 1007, 1012, 1015, 1020, 22, 1024, 1027, 1037, 1042, 1046, 1055, \r
+    1058, 1064, 1074, 1077, 111, 1081, 1086, 1092, 1096, 1101, 1107, 1112, \r
+    1115, 1122, 1124, 1126, 1134, 1144, 1147, 1150, 1157, 1165, 338, 1167, \r
+    1170, 1175, 1183, 1192, 1195, 1204, 1210, 1216, 1218, 1223, 1228, 1234, \r
+    1239, 1244, 1248, 1253, 1259, 1264, 1269, 1273, 1278, 1283, 1287, 1292, \r
+    1297, 1302, 1308, 1314, 1320, 1325, 1329, 1334, 1339, 1344, 1348, 1353, \r
+    1358, 1363, 1368, 1219, 1224, 1229, 1235, 1240, 1372, 1245, 1378, 1387, \r
+    1249, 1391, 1254, 1260, 1265, 1395, 1400, 1405, 1409, 1413, 1419, 1423, \r
+    1270, 1426, 1430, 1274, 1436, 1279, 1440, 1444, 1284, 1448, 1453, 1457, \r
+    1460, 1464, 1288, 1293, 1469, 1298, 1475, 1481, 1487, 1493, 1303, 1315, \r
+    1321, 1497, 1501, 1505, 1508, 1326, 1512, 1514, 1519, 1524, 1530, 1535, \r
+    1540, 1544, 1549, 1554, 1559, 1564, 1570, 1575, 1580, 1586, 1592, 1597, \r
+    1601, 1606, 1611, 1616, 1621, 1625, 1633, 1637, 1642, 1647, 1652, 1657, \r
+    1661, 1664, 1669, 1674, 1679, 1684, 1690, 1695, 1699, 1330, 1702, 1707, \r
+    1712, 1335, 1716, 1720, 1727, 1340, 1734, 1345, 1738, 1740, 1745, 1751, \r
+    1349, 1756, 1765, 1354, 1770, 1776, 1359, 1781, 1786, 1789, 1794, 1798, \r
+    1802, 1806, 1809, 1813, 1364, 1369, 1040, 1818, 1824, 1830, 1836, 1842, \r
+    1848, 1854, 1860, 1866, 1871, 1877, 1883, 1889, 1895, 1901, 1907, 1913, \r
+    1919, 1925, 1930, 1935, 1940, 1945, 1950, 1955, 1960, 1965, 1970, 1975, \r
+    1981, 1986, 1992, 1997, 2003, 2009, 2014, 2020, 2026, 2032, 2038, 2043, \r
+    2048, 2050, 2051, 2055, 2059, 2064, 2068, 2072, 2076, 2080, 2083, 2088, \r
+    2092, 2097, 2101, 2105, 2110, 2114, 2117, 2121, 2135, 2139, 2143, 2146, \r
+    2151, 2155, 2159, 2163, 2168, 2173, 2178, 2182, 2187, 2191, 2196, 2203, \r
+    2209, 2214, 2219, 2224, 2230, 2235, 2241, 2246, 2249, 1236, 2251, 2258, \r
+    2266, 2276, 2285, 2299, 2303, 2307, 2320, 2328, 2332, 2337, 2341, 2345, \r
+    2349, 2354, 2359, 2364, 2368, 2371, 2375, 2382, 2389, 2395, 2400, 2405, \r
+    2411, 2417, 2422, 2425, 1742, 2427, 2433, 2437, 2442, 2446, 2450, 1747, \r
+    1753, 2455, 2459, 2462, 2467, 2472, 2477, 2481, 2488, 2493, 2496, 2503, \r
+    2509, 2513, 2517, 2521, 2527, 2533, 2547, 2564, 2579, 2594, 2603, 2608, \r
+    2612, 2617, 2622, 2626, 2638, 2645, 2651, 2199, 2657, 2664, 2670, 2673, \r
+    2680, 2684, 2688, 2692, 2073, 2696, 2701, 2706, 2710, 2718, 2722, 2726, \r
+    2730, 2735, 2740, 2745, 2749, 2754, 2759, 2763, 2768, 2772, 2775, 2779, \r
+    2783, 2788, 2792, 2796, 2802, 2811, 2815, 2819, 2825, 2830, 2837, 2841, \r
+    2851, 2855, 2860, 2864, 2869, 2875, 2880, 2884, 2385, 2888, 2893, 2899, \r
+    2904, 2908, 2913, 2918, 2922, 2928, 2933, 2939, 2943, 2949, 2954, 2959, \r
+    2964, 2969, 2974, 2979, 2984, 2989, 2994, 3000, 3005, 1246, 80, 3011, \r
+    3015, 3019, 3023, 3028, 3032, 3036, 3040, 3044, 3049, 3053, 3058, 3062, \r
+    3065, 3069, 3074, 3078, 3083, 3087, 3091, 3095, 3100, 3104, 3107, 3120, \r
+    3124, 3128, 3132, 3136, 3140, 3143, 3147, 3151, 3156, 3160, 3165, 3170, \r
+    3175, 3179, 3182, 3185, 3191, 3195, 3199, 3202, 3206, 3210, 3213, 3219, \r
+    3224, 3229, 3235, 3240, 3245, 3251, 3257, 3262, 3267, 3272, 1044, 507, \r
+    3277, 3280, 3285, 3289, 3292, 3297, 3302, 3306, 3311, 3315, 3320, 3324, \r
+    3328, 3331, 3337, 3344, 3350, 3355, 3359, 3364, 3368, 3378, 3382, 3386, \r
+    3391, 3396, 3406, 2084, 3411, 3415, 3418, 3424, 3431, 3435, 621, 720, \r
+    3439, 3446, 3453, 3459, 3464, 3470, 3475, 2093, 3479, 3487, 555, 3493, \r
+    3504, 3508, 3518, 2098, 3524, 3529, 3544, 3550, 3557, 3567, 3573, 3578, \r
+    3584, 3587, 3591, 3598, 3603, 3607, 3611, 3615, 3619, 3624, 3630, 3070, \r
+    3635, 3647, 1546, 3654, 3657, 3661, 3664, 3668, 3682, 3686, 3689, 3693, \r
+    3698, 3702, 3706, 3712, 3718, 3723, 3729, 3733, 3741, 3751, 3757, 3762, \r
+    3771, 3779, 3786, 3790, 3799, 3803, 3808, 3813, 3817, 3825, 3829, 3834, \r
+    3838, 2106, 1388, 3844, 3849, 3855, 3860, 3865, 3870, 3875, 3880, 3885, \r
+    3891, 3896, 3902, 3907, 3912, 3917, 3923, 3928, 3933, 3938, 3943, 3949, \r
+    3954, 3960, 3965, 3970, 3975, 3980, 3985, 3990, 3996, 4001, 4006, 344, \r
+    440, 4011, 4017, 4021, 4025, 4030, 4034, 4038, 4041, 4045, 4049, 4053, \r
+    4058, 4062, 4066, 3841, 4072, 4079, 4083, 4096, 4100, 4104, 4108, 4112, \r
+    4116, 4122, 4129, 4133, 4141, 4150, 4156, 4161, 4164, 4168, 4172, 4182, \r
+    4192, 4200, 4207, 4214, 4220, 4226, 4233, 4237, 4242, 4246, 4254, 4259, \r
+    4267, 4272, 4277, 4281, 4286, 4293, 4296, 4300, 4304, 4307, 4313, 4319, \r
+    4323, 4334, 4344, 4359, 4374, 4389, 4404, 4419, 4434, 4449, 4464, 4479, \r
+    4494, 4509, 4524, 4539, 4554, 4569, 4584, 4599, 4614, 4629, 4644, 4659, \r
+    4674, 4689, 4704, 4719, 4734, 4749, 4764, 4779, 4794, 4809, 4824, 4839, \r
+    4854, 4869, 4884, 4899, 4914, 4929, 4944, 4959, 4974, 4989, 5004, 5019, \r
+    5034, 5049, 5064, 5079, 5088, 5097, 5102, 5108, 5112, 5117, 5121, 5124, \r
+    5128, 2846, 5131, 5136, 306, 424, 5142, 5150, 5154, 5158, 5161, 5167, \r
+    5171, 5179, 5185, 5190, 5197, 5204, 5210, 5215, 5222, 5228, 5232, 5237, \r
+    5249, 5260, 5267, 5273, 3092, 5277, 5283, 5288, 5293, 5298, 5304, 5309, \r
+    5314, 5319, 5324, 5330, 5335, 5340, 5346, 5351, 5357, 5362, 5368, 5373, \r
+    5379, 5384, 5389, 5394, 5399, 5404, 5410, 5415, 5420, 5425, 5431, 5437, \r
+    5443, 5449, 5455, 5461, 5467, 5473, 5479, 5485, 5491, 5497, 5502, 5507, \r
+    5512, 5517, 5522, 5527, 5532, 5537, 5543, 5549, 5554, 5560, 5566, 5572, \r
+    5577, 5582, 5587, 5592, 5598, 5604, 5609, 5614, 5619, 5624, 5629, 5635, \r
+    5640, 5646, 5652, 5658, 5664, 5670, 5676, 5682, 5688, 5694, 5160, 5699, \r
+    5703, 5707, 5710, 5717, 5720, 5728, 5733, 5738, 5729, 5743, 5730, 5747, \r
+    5753, 5759, 5764, 5769, 5776, 5781, 5785, 5788, 5792, 2140, 516, 5796, \r
+    5800, 5805, 5811, 5816, 5820, 5823, 5827, 5832, 5836, 5843, 5847, 5851, \r
+    5855, 884, 699, 5858, 5866, 5873, 5880, 5886, 5893, 5901, 5908, 5915, \r
+    5920, 5932, 1266, 1396, 1401, 5943, 1406, 5947, 5951, 5960, 5969, 5975, \r
+    5980, 5984, 5990, 5995, 6002, 6006, 6015, 6024, 6033, 6042, 6047, 6052, \r
+    6064, 6069, 3312, 6073, 6075, 6080, 6084, 6093, 6101, 1410, 825, 3316, \r
+    3321, 6107, 6111, 6120, 6126, 6131, 6134, 6143, 2591, 6149, 6157, 6161, \r
+    6165, 3325, 6169, 6174, 6181, 6187, 6193, 6196, 6198, 6201, 6209, 6217, \r
+    6225, 6228, 6233, 5740, 6236, 6238, 6243, 6248, 6253, 6258, 6263, 6268, \r
+    6273, 6278, 6283, 6288, 6294, 6299, 6304, 6309, 6315, 6320, 6325, 6330, \r
+    6335, 6340, 6345, 6351, 6356, 6361, 6366, 6371, 6376, 6381, 6386, 6391, \r
+    6396, 6401, 6406, 6411, 6416, 6421, 6426, 6431, 6436, 6442, 6448, 6453, \r
+    6458, 6463, 6468, 6473, 2197, 2204, 2210, 6478, 6484, 2236, 2242, 6492, \r
+    6496, 6501, 6505, 6509, 6513, 6518, 6522, 6527, 6531, 6534, 6537, 6543, \r
+    6549, 6555, 6561, 6567, 6573, 6579, 6583, 6587, 6591, 6595, 6599, 6604, \r
+    6611, 6619, 6629, 6634, 6638, 6649, 6662, 6673, 6686, 6697, 6709, 6721, \r
+    6733, 6746, 6759, 6766, 6772, 6779, 6785, 6789, 6794, 6798, 6805, 6813, \r
+    6817, 6823, 6833, 6837, 6842, 6847, 6854, 6860, 5888, 6870, 6874, 6881, \r
+    698, 6885, 6889, 6894, 6899, 6904, 6908, 6914, 6922, 6926, 6936, 6940, \r
+    6946, 6951, 6955, 2132, 6961, 6969, 6978, 6982, 6988, 6993, 6998, 7003, \r
+    7009, 7014, 3708, 7019, 7023, 7029, 7035, 7040, 7045, 7050, 6983, 7056, \r
+    7060, 7067, 7073, 7078, 7082, 7087, 7091, 7100, 6177, 6184, 7105, 2732, \r
+    7109, 7114, 7119, 6989, 7123, 6994, 6999, 7128, 7135, 7142, 7148, 7154, \r
+    7160, 7165, 7170, 7175, 7004, 7010, 7181, 7187, 7192, 7200, 7015, 7205, \r
+    1079, 7208, 7216, 7222, 7228, 7237, 7242, 7248, 7263, 7280, 7299, 7308, \r
+    7316, 7331, 7341, 7351, 7357, 7369, 7378, 7386, 7393, 7400, 7406, 7411, \r
+    7419, 7429, 7436, 7446, 7456, 7466, 7475, 7485, 7499, 7514, 7523, 7531, \r
+    7536, 7540, 7549, 7559, 7569, 7579, 7584, 7588, 7597, 7607, 7618, 7631, \r
+    7644, 7656, 7664, 7669, 7675, 7678, 7682, 7690, 7695, 7699, 7707, 7716, \r
+    7724, 7731, 7742, 7746, 7749, 7755, 7759, 7765, 7772, 7777, 7784, 7791, \r
+    7798, 7805, 7812, 7819, 7824, 7276, 7829, 7836, 7845, 7849, 7861, 7865, \r
+    7868, 7872, 7876, 7880, 7884, 7890, 7895, 7901, 7906, 7911, 7917, 7922, \r
+    7927, 6850, 7932, 7936, 7940, 7944, 7949, 7954, 7960, 7964, 7971, 7976, \r
+    7984, 7988, 7991, 7997, 8004, 8008, 8011, 8016, 8020, 3736, 8026, 8034, \r
+    8040, 6865, 8045, 8051, 8056, 8060, 8063, 8078, 8097, 8109, 8122, 8135, \r
+    8148, 8162, 8175, 8190, 8197, 8203, 8207, 8212, 8218, 8226, 8231, 6011, \r
+    8236, 8239, 8244, 8248, 2737, 877, 8254, 8258, 8264, 8270, 8275, 8281, \r
+    8286, 7024, 8292, 8298, 8303, 8308, 8316, 8322, 8335, 8343, 8350, 8354, \r
+    8362, 8369, 8381, 8391, 8398, 8405, 8414, 8423, 8431, 8436, 8442, 7030, \r
+    8447, 8453, 7036, 8458, 8461, 8468, 8474, 8487, 8498, 8505, 8511, 8520, \r
+    8528, 8535, 8541, 8547, 8552, 8556, 8561, 8070, 8567, 7041, 8574, 8579, \r
+    8586, 8592, 8598, 8603, 8611, 8619, 8626, 8630, 8644, 8654, 8659, 8663, \r
+    8674, 8680, 8685, 8690, 8694, 7046, 8699, 8702, 8707, 8719, 8726, 8731, \r
+    8735, 8740, 8744, 8751, 8757, 7051, 6984, 8764, 2742, 8, 8771, 8776, \r
+    8780, 8786, 8797, 8807, 8816, 8828, 8833, 8837, 8845, 8859, 8863, 8866, \r
+    8874, 8881, 8889, 8893, 8904, 8908, 8915, 8920, 8924, 8930, 8935, 8939, \r
+    8944, 8948, 8951, 8957, 8962, 8968, 8975, 8985, 8994, 9001, 7061, 7068, \r
+    7074, 7079, 9007, 7083, 9013, 9016, 9023, 9038, 9054, 9069, 970, 406, \r
+    9074, 9082, 9089, 9095, 9100, 9105, 7092, 9107, 9111, 9115, 9125, 9130, \r
+    9134, 9143, 9147, 9150, 9157, 9161, 9164, 9172, 9179, 9187, 9191, 9198, \r
+    9202, 9208, 9212, 9216, 9220, 9226, 9230, 9234, 9241, 9245, 9250, 9254, \r
+    9261, 9267, 9275, 9281, 9291, 9296, 9301, 9305, 9313, 3641, 9321, 9326, \r
+    9330, 9334, 9337, 9345, 9352, 9356, 9360, 9365, 9369, 9380, 9386, 9390, \r
+    9393, 9400, 9405, 7101, 9410, 9414, 1704, 4265, 9421, 9426, 9431, 9436, \r
+    9442, 9447, 9453, 9458, 9463, 9468, 9473, 9478, 9483, 9488, 9493, 9498, \r
+    9503, 9508, 9513, 9518, 9523, 9528, 9533, 9539, 9544, 9549, 9554, 9559, \r
+    9564, 9570, 9575, 9580, 9586, 9591, 9597, 9602, 9608, 9613, 9618, 9623, \r
+    9628, 9634, 9639, 9644, 670, 134, 9649, 9653, 9658, 9663, 9667, 9671, \r
+    9675, 9680, 9684, 9689, 9693, 9696, 9700, 9704, 9709, 9719, 9725, 9729, \r
+    9733, 9740, 9748, 9757, 9768, 9775, 9782, 9791, 9800, 9809, 9818, 9827, \r
+    9836, 9846, 9856, 9866, 9876, 9886, 9895, 9905, 9915, 9925, 9935, 9945, \r
+    9955, 9965, 9974, 9984, 9994, 10004, 10014, 10024, 10034, 10043, 10053, \r
+    10063, 10073, 10083, 10093, 10103, 10113, 10123, 10133, 10142, 10152, \r
+    10162, 10172, 10182, 10192, 10202, 10212, 10222, 10232, 10242, 10251, \r
+    10257, 10261, 10264, 10268, 10273, 10280, 10286, 10291, 10295, 10300, \r
+    10304, 10308, 7110, 10314, 10319, 10328, 7115, 10333, 10336, 10342, \r
+    10350, 7120, 10357, 10361, 10365, 10369, 10379, 10384, 10393, 10401, \r
+    10408, 10413, 10420, 10425, 10429, 10432, 10443, 10453, 10462, 10470, \r
+    10481, 10493, 10503, 10507, 10512, 10517, 10521, 10526, 10535, 10539, \r
+    10542, 10549, 10559, 10568, 10575, 10579, 10585, 10590, 10595, 10599, \r
+    10608, 10613, 10619, 10624, 10628, 10637, 10645, 10653, 10660, 10668, \r
+    10680, 10691, 10701, 10708, 10714, 10723, 10734, 10743, 10752, 10760, \r
+    10767, 10776, 10784, 5761, 10788, 10790, 10795, 10801, 10809, 10816, \r
+    10825, 10834, 10843, 10852, 10861, 10870, 10879, 10888, 10898, 10908, \r
+    10917, 10924, 10938, 10945, 10953, 10962, 10968, 10977, 10985, 10994, \r
+    11007, 11015, 11022, 11035, 11041, 11050, 11059, 11064, 11068, 11074, \r
+    11080, 11087, 6864, 11092, 11097, 11104, 11109, 11114, 11118, 11124, \r
+    11132, 11140, 11147, 11155, 11163, 11168, 11174, 11179, 11183, 11194, \r
+    11202, 11208, 11213, 11222, 11228, 11233, 11242, 11256, 3600, 11260, \r
+    11265, 11270, 11276, 11281, 11286, 11290, 11295, 11300, 5760, 11305, \r
+    11310, 11315, 11320, 11324, 11329, 11334, 11339, 11345, 11351, 11356, \r
+    11360, 11365, 11370, 11375, 7124, 11380, 11385, 11390, 11395, 11412, \r
+    11430, 11442, 11455, 11472, 11488, 11505, 11515, 11534, 11545, 11556, \r
+    11567, 11578, 11590, 11601, 11612, 11629, 11640, 11651, 11656, 2317, \r
+    11660, 11663, 11669, 11677, 11685, 11690, 11698, 11706, 11713, 11718, \r
+    11724, 11731, 11739, 11746, 11758, 11763, 9032, 11769, 11778, 11786, \r
+    11793, 11799, 11807, 11814, 11821, 11827, 11836, 11844, 11851, 11859, \r
+    11865, 11872, 11880, 11885, 3372, 1187, 11892, 11895, 11306, 11899, \r
+    11905, 11909, 11921, 11926, 11933, 11939, 11944, 11951, 11311, 11316, \r
+    11955, 11959, 11964, 11968, 11976, 11983, 11990, 12007, 12011, 12014, \r
+    12022, 12028, 3428, 12032, 12034, 12042, 12049, 12059, 12064, 12070, \r
+    12075, 12079, 12085, 12090, 12093, 12100, 12106, 12112, 12117, 12124, \r
+    12130, 12135, 12142, 12146, 12152, 12159, 12165, 12171, 12179, 12185, \r
+    12193, 12199, 12205, 12210, 12217, 12222, 12226, 12231, 12238, 12243, \r
+    12249, 12255, 12261, 12264, 12268, 12280, 12286, 12291, 12298, 12304, \r
+    12310, 12321, 12331, 12340, 12348, 12355, 12365, 12375, 12383, 12386, \r
+    11330, 12391, 11335, 11460, 12399, 12412, 12427, 12438, 11477, 12456, \r
+    12469, 12482, 12493, 8085, 12504, 12517, 12536, 12547, 12558, 12569, \r
+    2542, 12582, 12586, 12594, 12605, 12612, 12618, 12626, 12630, 12636, \r
+    12639, 12649, 12657, 12664, 12672, 12677, 12682, 12689, 12695, 12700, \r
+    12705, 12709, 12713, 12719, 12725, 12730, 12735, 12740, 12744, 11340, \r
+    11346, 11352, 12748, 12756, 12765, 12772, 7000, 12776, 12778, 12783, \r
+    12788, 12794, 12799, 12804, 12809, 12814, 12818, 12824, 12830, 12835, \r
+    12841, 12846, 12851, 12857, 12862, 12867, 12872, 12878, 12883, 12888, \r
+    12894, 12900, 12905, 12912, 12919, 12924, 12928, 12932, 12935, 12943, \r
+    12948, 12955, 12960, 12965, 12975, 12980, 12987, 12993, 13003, 13017, \r
+    13031, 13045, 13059, 13074, 13089, 13106, 13124, 13137, 13143, 13148, \r
+    13153, 13159, 13164, 13169, 13173, 13177, 13182, 13186, 13197, 13203, \r
+    13208, 13213, 13217, 13222, 13228, 13235, 13240, 13244, 13250, 13255, \r
+    13260, 13264, 13270, 13275, 13280, 13287, 13292, 13296, 13300, 13305, \r
+    13310, 13316, 13322, 13327, 13336, 13344, 13351, 13358, 13364, 13370, \r
+    13375, 13380, 13386, 13391, 13397, 13402, 13408, 13414, 13421, 13427, \r
+    13432, 13437, 7166, 13446, 13449, 13455, 13460, 13465, 13475, 13482, \r
+    13487, 13493, 13498, 13504, 13509, 13515, 13521, 13526, 13534, 13541, \r
+    13546, 13552, 13557, 13561, 13570, 13581, 13588, 13596, 13602, 13609, \r
+    13615, 13620, 13624, 13630, 13635, 13640, 13645, 7171, 5777, 2756, 13649, \r
+    13653, 13657, 13661, 13665, 13668, 13675, 13683, 11366, 13690, 13700, \r
+    13708, 13715, 13723, 13733, 13742, 13747, 10458, 10467, 13752, 13762, \r
+    13777, 13783, 13790, 13797, 13803, 13813, 13823, 11371, 13832, 13838, \r
+    13844, 13852, 13860, 13865, 13874, 13882, 13894, 13904, 13914, 13924, \r
+    13933, 13945, 13955, 13965, 13976, 13981, 13993, 14005, 14017, 14029, \r
+    14041, 14053, 14065, 14077, 14089, 14101, 14112, 14124, 14136, 14148, \r
+    14160, 14172, 14184, 14196, 14208, 14220, 14232, 14243, 14255, 14267, \r
+    14279, 14291, 14303, 14315, 14327, 14339, 14351, 14363, 14374, 14386, \r
+    14398, 14410, 14422, 14434, 14446, 14458, 14470, 14482, 14494, 14505, \r
+    14517, 14529, 14541, 14553, 14565, 14577, 14589, 14601, 14613, 14625, \r
+    14636, 14648, 14660, 14672, 14684, 14696, 14708, 14720, 14732, 14744, \r
+    14756, 14767, 14779, 14791, 14803, 14815, 14827, 14839, 14851, 14863, \r
+    14875, 14887, 14898, 14910, 14922, 14934, 14946, 14959, 14972, 14985, \r
+    14998, 15011, 15024, 15037, 15049, 15062, 15075, 15088, 15101, 15114, \r
+    15127, 15140, 15153, 15166, 15179, 15191, 15204, 15217, 15230, 15243, \r
+    15256, 15269, 15282, 15295, 15308, 15321, 15333, 15346, 15359, 15372, \r
+    15385, 15398, 15411, 15424, 15437, 15450, 15463, 15475, 15488, 15501, \r
+    15514, 15527, 15540, 15553, 15566, 15579, 15592, 15605, 15617, 15630, \r
+    15643, 15656, 15669, 15682, 15695, 15708, 15721, 15734, 15747, 15759, \r
+    15770, 15783, 15796, 15809, 15822, 15835, 15848, 15861, 15874, 15887, \r
+    15900, 15912, 15925, 15938, 15951, 15964, 15977, 15990, 16003, 16016, \r
+    16029, 16042, 16054, 16067, 16080, 16093, 16106, 16119, 16132, 16145, \r
+    16158, 16171, 16184, 16196, 16209, 16222, 16235, 16248, 16261, 16274, \r
+    16287, 16300, 16313, 16326, 16338, 16351, 16364, 16377, 16390, 16403, \r
+    16416, 16429, 16442, 16455, 16468, 16480, 16493, 16506, 16519, 16532, \r
+    16545, 16558, 16571, 16584, 16597, 16610, 16622, 16635, 16648, 16661, \r
+    16674, 16687, 16700, 16713, 16726, 16739, 16752, 16764, 16777, 16790, \r
+    16803, 16816, 16829, 16842, 16855, 16868, 16881, 16894, 16906, 16919, \r
+    16932, 16945, 16958, 16971, 16984, 16997, 17010, 17023, 17036, 17048, \r
+    17061, 17074, 17087, 17100, 17113, 17126, 17139, 17152, 17165, 17178, \r
+    17190, 17201, 17209, 17216, 17222, 17226, 17232, 17238, 17246, 17252, \r
+    17257, 7005, 17261, 17268, 17276, 17283, 17290, 8481, 17297, 17306, \r
+    17311, 5793, 17318, 17323, 17326, 17331, 17339, 17346, 17353, 17359, \r
+    17368, 17377, 17383, 17388, 17398, 17405, 17413, 17419, 17429, 17438, \r
+    17442, 17449, 17453, 17458, 17464, 17472, 17476, 11381, 17485, 17491, \r
+    17495, 17501, 17508, 17519, 6829, 17527, 17533, 17538, 17542, 17546, \r
+    7415, 17551, 17559, 17566, 17575, 17582, 17589, 17595, 17599, 17605, \r
+    17611, 17619, 17625, 17632, 17638, 17644, 17648, 17656, 17665, 17670, \r
+    17681, 17686, 17691, 17696, 5966, 17700, 17706, 17713, 17722, 17727, \r
+    17735, 17747, 17752, 17756, 17759, 17765, 17771, 17776, 17780, 17783, \r
+    17794, 17799, 7201, 17806, 7016, 7206, 17811, 17816, 17821, 17826, 17831, \r
+    17836, 17841, 17846, 17851, 17856, 17861, 17866, 17872, 17877, 17882, \r
+    17887, 17892, 17897, 17902, 17907, 17912, 17917, 17923, 17929, 17934, \r
+    17939, 17944, 17949, 17954, 17959, 17964, 17969, 17974, 17980, 17985, \r
+    17990, 17995, 18001, 18007, 18012, 18017, 18022, 18027, 18032, 18037, \r
+    18042, 18047, 18053, 18058, 18063, 18068, 18073, 18079, 18084, 18089, \r
+    18093, 129, 18101, 18105, 18109, 18113, 18118, 18122, 18126, 9788, 18130, \r
+    18135, 18139, 18144, 18148, 18153, 18157, 18163, 18168, 18172, 18176, \r
+    18184, 18188, 18193, 18198, 18202, 18208, 18213, 18217, 18222, 18227, \r
+    18231, 18238, 18242, 18246, 18251, 18255, 18258, 18271, 18276, 18285, \r
+    7238, 18290, 18293, 2605, 2610, 18297, 18303, 18309, 18314, 18319, 18324, \r
+    18330, 18335, 18340, 18344, 18349, 18354, 18360, 18365, 18370, 18376, \r
+    18381, 18385, 18390, 18395, 18400, 18404, 18409, 18414, 18419, 18424, \r
+    18428, 18432, 18437, 2765, 18386, 18441, 18448, 7494, 18460, 18468, \r
+    18391, 18475, 18480, 18396, 18488, 18493, 18498, 18503, 18507, 18512, \r
+    18515, 18519, 18525, 18530, 6856, 1709, 1714, 18534, 18540, 18546, 18551, \r
+    18555, 18559, 18563, 18566, 18572, 18579, 18587, 18593, 18599, 18604, \r
+    18609, 18613, 11741, 12361, 18618, 18630, 18633, 18640, 18644, 18652, \r
+    18663, 18672, 18685, 18695, 18709, 18721, 18735, 18745, 18757, 18763, \r
+    18778, 18802, 18820, 18839, 18852, 18866, 18884, 18900, 18917, 18935, \r
+    18946, 18965, 18982, 19002, 19020, 19032, 19046, 19060, 19072, 19089, \r
+    19108, 19126, 19138, 19156, 19175, 11520, 19188, 19208, 19220, 8116, \r
+    19232, 19237, 19242, 19247, 19253, 19258, 2334, 19262, 19268, 19272, \r
+    19275, 19279, 19287, 19293, 18405, 19297, 19308, 19314, 19320, 19329, \r
+    19336, 19341, 19348, 19354, 19363, 19371, 19381, 19391, 19396, 19405, \r
+    19414, 19425, 19436, 3677, 19446, 19450, 19460, 19468, 19478, 19489, \r
+    19497, 19504, 19510, 19515, 18415, 19519, 19528, 19532, 19537, 19546, \r
+    19554, 19564, 19573, 19579, 19585, 18420, 18425, 19589, 19599, 916, \r
+    19608, 11702, 1154, 19622, 19631, 19639, 19650, 19661, 19671, 19680, \r
+    19689, 19698, 19704, 19713, 19721, 7178, 19727, 19730, 19734, 19739, \r
+    19744, 19752, 18433, 19756, 19762, 19768, 19773, 19778, 19782, 19790, \r
+    19796, 19802, 3351, 19810, 19815, 19820, 19824, 19828, 19835, 19839, \r
+    19847, 19853, 19858, 19862, 19867, 19873, 19877, 19888, 19893, 19897, \r
+    19908, 19912, 19916, 19919, 19923, 19928, 19932, 19936, 903, 19940, \r
+    19945, 19950, 19955, 19960, 19965, 19970, 19975, 19980, 19985, 19990, \r
+    19995, 20000, 20005, 20011, 20016, 20021, 20026, 20031, 20036, 20041, \r
+    20047, 20052, 20057, 20062, 20067, 20072, 20077, 20082, 20088, 20094, \r
+    20099, 20105, 20110, 20115, 5, 20121, 20125, 20129, 20133, 20138, 20142, \r
+    20146, 20150, 20154, 20159, 20163, 20168, 20172, 20175, 20179, 20184, \r
+    20188, 20193, 20197, 20201, 20205, 20210, 20214, 20218, 20228, 20233, \r
+    20237, 20241, 20246, 20251, 20260, 20265, 20270, 20274, 20278, 20290, \r
+    20299, 20308, 20314, 20318, 20322, 20332, 20341, 20349, 20355, 20359, \r
+    20366, 20376, 20385, 20393, 20401, 20408, 20416, 20425, 20434, 20442, \r
+    20447, 20451, 20455, 20458, 20460, 20464, 20468, 20473, 20478, 20482, \r
+    20486, 20489, 20493, 20496, 20500, 20503, 20506, 20510, 20516, 20520, \r
+    20524, 20528, 20533, 20538, 20543, 20547, 20550, 20555, 20561, 20566, \r
+    20572, 20577, 20581, 20585, 20589, 20594, 20598, 20603, 20607, 20614, \r
+    20618, 20621, 20625, 20631, 20637, 20641, 20645, 20650, 20657, 20663, \r
+    20667, 20676, 20680, 20684, 20687, 20693, 20698, 20704, 1471, 1773, \r
+    20709, 20714, 20719, 20724, 20729, 20734, 20739, 2157, 20744, 20745, \r
+    20748, 20752, 20756, 20761, 20765, 20769, 20772, 20777, 20782, 20786, \r
+    20789, 20794, 20798, 20803, 20807, 11714, 20812, 20815, 20818, 20822, \r
+    20826, 20835, 20842, 20847, 20854, 20858, 20862, 20867, 20872, 20876, \r
+    20881, 20893, 20904, 20909, 20913, 20918, 20922, 20925, 20931, 5894, \r
+    2252, 20935, 20951, 7270, 20971, 20980, 20996, 21000, 21003, 21009, \r
+    21019, 21025, 21040, 21052, 21063, 21071, 21080, 21086, 21095, 21105, \r
+    21116, 21127, 21136, 21145, 21153, 21160, 21168, 21181, 21187, 21192, \r
+    21198, 21203, 21211, 21223, 21235, 21249, 21257, 21264, 21273, 21282, \r
+    21290, 21298, 21306, 21313, 21322, 21330, 21340, 21349, 21359, 21368, \r
+    21377, 21385, 21390, 21394, 21397, 21401, 21405, 21409, 21413, 21417, \r
+    21423, 21429, 11759, 21434, 21446, 21452, 7623, 21463, 21473, 21482, \r
+    21486, 21489, 21493, 21499, 21503, 21508, 21517, 21524, 5935, 21531, \r
+    21539, 21546, 21552, 21557, 21563, 21569, 21577, 21581, 21584, 21586, \r
+    21402, 21595, 21601, 21611, 21616, 21622, 21627, 21632, 21637, 21644, \r
+    21653, 21662, 21668, 21673, 21679, 21684, 21691, 21702, 21707, 21711, \r
+    21721, 21725, 21730, 21740, 21749, 21753, 21761, 21768, 21774, 21779, \r
+    21786, 21790, 10323, 21798, 21805, 21812, 18204, 21327, 21817, 21821, \r
+    18952, 21826, 21840, 21856, 21874, 21893, 21910, 21928, 18971, 21945, \r
+    21965, 18988, 21977, 21989, 12443, 22001, 19008, 22015, 22027, 8129, \r
+    22041, 22046, 22051, 22057, 22061, 22066, 22076, 22082, 7994, 22088, \r
+    22090, 22095, 22103, 22107, 21640, 22113, 22120, 22130, 22135, 22139, \r
+    22142, 22148, 22156, 22166, 22182, 22195, 22209, 12461, 22223, 22230, \r
+    22234, 22237, 22242, 22246, 22256, 22261, 22266, 22271, 22279, 22287, \r
+    22296, 22301, 12466, 22305, 22308, 22311, 22316, 22332, 22340, 22348, \r
+    22356, 22361, 22365, 22371, 22377, 22380, 22386, 22398, 22405, 22411, \r
+    22418, 22432, 22445, 22454, 22466, 22477, 22486, 22495, 22503, 22514, \r
+    5917, 22521, 22527, 22532, 22538, 22548, 22557, 22563, 22568, 22575, \r
+    22583, 22595, 22602, 22611, 22619, 22625, 22631, 22636, 22640, 22643, \r
+    22649, 22654, 22658, 22669, 22678, 22686, 22691, 22697, 10921, 6581, \r
+    22702, 22705, 22708, 22714, 22722, 22730, 22734, 22738, 22743, 22746, \r
+    22755, 22763, 22774, 22778, 22784, 22790, 22794, 22800, 22822, 22846, \r
+    22853, 22859, 22870, 22888, 22895, 22903, 22907, 22916, 22929, 22937, \r
+    22949, 22960, 22970, 22984, 22993, 23001, 23013, 7287, 23024, 23035, \r
+    23047, 23057, 23066, 23071, 23075, 23083, 23088, 23092, 23095, 23098, \r
+    23106, 23114, 23123, 23133, 23142, 23148, 23162, 2556, 23184, 23193, \r
+    23203, 23215, 23225, 23233, 23241, 23250, 23255, 23266, 23277, 23281, \r
+    23291, 23300, 23310, 23320, 23328, 23337, 23344, 23352, 23359, 23368, \r
+    23372, 23380, 23387, 23394, 23405, 23420, 23427, 23437, 23446, 23452, \r
+    11054, 23459, 23464, 23468, 23472, 23480, 23486, 23495, 23500, 23510, \r
+    19517, 23514, 23517, 23522, 23527, 23532, 23537, 23542, 23547, 23552, \r
+    23557, 23563, 23568, 23573, 23579, 1242, 639, 23584, 23593, 2300, 23600, \r
+    23605, 23609, 23615, 1275, 506, 343, 23620, 23629, 23637, 23646, 23654, \r
+    23665, 23674, 23682, 23686, 23689, 23697, 23705, 11727, 23710, 23716, \r
+    4101, 23721, 23725, 23731, 23735, 23742, 1437, 23748, 7355, 23755, 23765, \r
+    23773, 23779, 23788, 23796, 23802, 23810, 23817, 23824, 1478, 2338, \r
+    23831, 23837, 23848, 23859, 23867, 23874, 23883, 23891, 23898, 23905, \r
+    23918, 23929, 23948, 1280, 23952, 23957, 23965, 3387, 23969, 23974, 1441, \r
+    20487, 23984, 23988, 23993, 23997, 3333, 24003, 24011, 24018, 24026, \r
+    3388, 260, 24031, 24039, 24047, 24054, 24060, 24065, 24072, 24075, 24081, \r
+    21504, 24087, 106, 24091, 24095, 24101, 24106, 24113, 24119, 2263, 24123, \r
+    24127, 24130, 24133, 24140, 24146, 18500, 24151, 3432, 13175, 24155, \r
+    24158, 24166, 24169, 24179, 24191, 24196, 24200, 24208, 24215, 24221, \r
+    24228, 24235, 24238, 24242, 24246, 1445, 24256, 24258, 24263, 24269, \r
+    24275, 24280, 24285, 24290, 24295, 24300, 24305, 24310, 24315, 24320, \r
+    24325, 24330, 24335, 24340, 24345, 24351, 24357, 24363, 24369, 24374, \r
+    24379, 24384, 24390, 24395, 24400, 24405, 24411, 24416, 24422, 24427, \r
+    24432, 24437, 24442, 24448, 24453, 24459, 24464, 24469, 24474, 24479, \r
+    24485, 24490, 24496, 24501, 24506, 24511, 24516, 24521, 24526, 24531, \r
+    24536, 24541, 24547, 24553, 24559, 24564, 24569, 24574, 24579, 24585, \r
+    24591, 24597, 24603, 24609, 24615, 24620, 24626, 24631, 24636, 24641, \r
+    24646, 24652, 2376, 24657, 2383, 2390, 2647, 24662, 2396, 2406, 24668, \r
+    24672, 24677, 24682, 24688, 24693, 24698, 24702, 24707, 24713, 24718, \r
+    24723, 24729, 24734, 24738, 24743, 24748, 24753, 24758, 24763, 24769, \r
+    24775, 24780, 24784, 24789, 24793, 24798, 24803, 24808, 24812, 24817, \r
+    24822, 24827, 24832, 24838, 24844, 24849, 24853, 24858, 24863, 24868, \r
+    24873, 24878, 24882, 24887, 24892, 24897, 24901, 24906, 24914, 24920, \r
+    24926, 24932, 24937, 24941, 24944, 24948, 24953, 24957, 24962, 24966, \r
+    24969, 24974, 17578, 23752, 24979, 24984, 24988, 24993, 24997, 25001, \r
+    25006, 25010, 25013, 25016, 25020, 25025, 25033, 25037, 25042, 25046, \r
+    25050, 25055, 25060, 25064, 25070, 25075, 25080, 25087, 25094, 25098, \r
+    25101, 25107, 25116, 25123, 25130, 25134, 25139, 25143, 25149, 25155, \r
+    25159, 25165, 25170, 25175, 25182, 25188, 25194, 25200, 25206, 25213, \r
+    25219, 25225, 25231, 25237, 25243, 25249, 25255, 25262, 25268, 25275, \r
+    25281, 25287, 25293, 25299, 25305, 25311, 25317, 25323, 25329, 8917, \r
+    25335, 25340, 25345, 12716, 25350, 25355, 25360, 25366, 25371, 25376, \r
+    25380, 25385, 25390, 25396, 25401, 25406, 25410, 25415, 25420, 25424, \r
+    25429, 25434, 25439, 25443, 25448, 25453, 25458, 25462, 25466, 12060, \r
+    25470, 25479, 25485, 25491, 25500, 25508, 25513, 25517, 25524, 25530, \r
+    25534, 25539, 25548, 25553, 1477, 25559, 25562, 25566, 18541, 18547, \r
+    25572, 25576, 25587, 25598, 25610, 25617, 25624, 25629, 25633, 17235, \r
+    685, 17577, 25641, 25645, 25650, 25656, 25661, 25667, 25672, 25678, \r
+    25683, 8022, 2714, 3282, 25687, 25690, 25696, 25702, 25708, 25715, 25721, \r
+    25727, 25733, 25739, 25745, 25751, 25757, 25763, 25769, 25775, 25781, \r
+    25787, 25794, 25800, 25806, 25812, 25818, 25824, 25827, 25832, 25837, \r
+    25843, 25848, 25853, 25857, 25862, 25868, 25873, 25878, 25884, 25889, \r
+    25895, 25899, 25904, 25909, 25914, 25919, 25923, 25928, 25933, 25938, \r
+    25944, 25950, 25956, 25961, 25965, 25970, 25974, 25982, 3455, 25988, \r
+    25991, 5976, 25995, 26001, 26008, 5985, 26012, 26018, 26025, 26031, \r
+    26040, 26048, 26052, 26059, 26065, 26069, 26072, 26081, 26089, 26093, \r
+    26103, 26113, 26123, 26129, 26139, 26144, 26157, 26171, 26182, 26194, \r
+    26206, 26220, 26233, 26245, 26257, 11561, 26271, 26276, 26281, 26285, \r
+    26289, 26293, 1762, 22475, 26297, 26302, 26307, 26311, 26314, 26319, \r
+    26324, 26330, 26336, 7767, 12395, 26341, 26346, 26351, 26355, 26360, \r
+    25651, 26365, 26370, 26376, 25657, 26381, 26384, 26392, 25662, 26397, \r
+    26403, 26409, 25668, 26414, 26419, 26425, 26430, 26435, 26441, 26447, \r
+    23128, 26452, 26456, 26461, 26466, 26471, 26479, 26483, 26488, 26493, \r
+    26497, 26502, 26507, 26512, 25673, 25679, 26518, 2452, 234, 26521, 26524, \r
+    26528, 26532, 26540, 26547, 26554, 26558, 26561, 26567, 26575, 26583, \r
+    26587, 26591, 26594, 26601, 26605, 26612, 26620, 26628, 26635, 26639, \r
+    635, 292, 26651, 26656, 26661, 26667, 26672, 3466, 26677, 26682, 26687, \r
+    26692, 26697, 18626, 26702, 26707, 26712, 26717, 26723, 26728, 26732, \r
+    26737, 26742, 26747, 26751, 26756, 26761, 26766, 18464, 3472, 26771, \r
+    26776, 26781, 26787, 26792, 26797, 26801, 26806, 26811, 26817, 26822, \r
+    26827, 26831, 26836, 26841, 26846, 26850, 26855, 26860, 26865, 26871, \r
+    26877, 26882, 26886, 26891, 26896, 26901, 26905, 26913, 26917, 26923, \r
+    26927, 26934, 13070, 26940, 26947, 26955, 26962, 26968, 26980, 26986, \r
+    2666, 26990, 26596, 26994, 27005, 27010, 27015, 27020, 27024, 27029, \r
+    18552, 27033, 17591, 27038, 27043, 27049, 27054, 27058, 27062, 27065, \r
+    27071, 27082, 27094, 27099, 27103, 27106, 321, 27110, 27115, 27120, \r
+    27125, 27130, 27135, 27141, 27146, 27151, 27157, 27162, 27168, 27173, \r
+    27179, 27184, 27189, 27194, 27199, 27204, 27209, 27214, 27219, 27225, \r
+    27230, 27235, 27240, 27245, 27250, 27255, 27260, 27266, 27272, 27277, \r
+    27282, 27287, 27292, 27297, 27302, 27307, 27312, 27317, 27322, 27327, \r
+    27332, 27337, 27342, 27347, 27352, 27357, 27362, 27368, 26, 27373, 27377, \r
+    27381, 27389, 27393, 27397, 27400, 27403, 27408, 27412, 27417, 27421, \r
+    27426, 27430, 27435, 27439, 27442, 27444, 27447, 27449, 27453, 27465, \r
+    27474, 27478, 27484, 27489, 27495, 27500, 27505, 27509, 27514, 27521, \r
+    27526, 27532, 27537, 27541, 27548, 21335, 21345, 27552, 27557, 27562, \r
+    27567, 27571, 27578, 6076, 27584, 27593, 27601, 27616, 27630, 27638, \r
+    27649, 27658, 27663, 5243, 27673, 27678, 27682, 27685, 27689, 27693, \r
+    27700, 27705, 6820, 27715, 27717, 27720, 27724, 27728, 27733, 27739, \r
+    27744, 27753, 27759, 27764, 27771, 27775, 27782, 27795, 27803, 27807, \r
+    27817, 27822, 27826, 27830, 27836, 27841, 27851, 27860, 27871, 27879, \r
+    27890, 27899, 27902, 27906, 27914, 27920, 27928, 27935, 27941, 2351, \r
+    27945, 27947, 27952, 27957, 27960, 27962, 27966, 27969, 27973, 27977, \r
+    27980, 27986, 27996, 28001, 28007, 28011, 28016, 28029, 21606, 28035, \r
+    28044, 13898, 26109, 28051, 28056, 28060, 28068, 28075, 28080, 28084, \r
+    28088, 28096, 28102, 28108, 28113, 28117, 28120, 28125, 28138, 28154, \r
+    19078, 28171, 28183, 28200, 28212, 28226, 19095, 19114, 28238, 28250, \r
+    2573, 28264, 28269, 28274, 28278, 28285, 28297, 28303, 28306, 28311, \r
+    18244, 28314, 28318, 28321, 28326, 28331, 28337, 28342, 28347, 28353, \r
+    28359, 28364, 28368, 28373, 28378, 28383, 28387, 28390, 28396, 28401, \r
+    28406, 28411, 28415, 28420, 28426, 28431, 28436, 28442, 28447, 28452, \r
+    28457, 28462, 28467, 28471, 28474, 28480, 28484, 28492, 28499, 28507, \r
+    28517, 28523, 28529, 28533, 28542, 28547, 28552, 8036, 28557, 28564, \r
+    28570, 28575, 28581, 28589, 28596, 28600, 28603, 28614, 28621, 28627, \r
+    28636, 28640, 28643, 28649, 28656, 28662, 28668, 28676, 24055, 28683, \r
+    28691, 28697, 28702, 28708, 28713, 28719, 28723, 28730, 28736, 21619, \r
+    28745, 28750, 28758, 28766, 7383, 4120, 28773, 28777, 28781, 28785, \r
+    28790, 28794, 28798, 28803, 28808, 28812, 17640, 28817, 28821, 28825, \r
+    28829, 28832, 28834, 28839, 28847, 28851, 28858, 28862, 28870, 28877, \r
+    28887, 28891, 28895, 28903, 28909, 28918, 10570, 28924, 28933, 28940, \r
+    28948, 28956, 28964, 28971, 28978, 28985, 28992, 28999, 29004, 29010, \r
+    29027, 29035, 29043, 29050, 380, 29054, 29060, 27654, 29066, 29069, \r
+    29077, 29083, 29089, 29098, 29104, 3420, 12046, 29113, 29120, 29125, \r
+    29129, 29136, 29144, 29153, 29163, 29169, 29177, 29186, 29194, 18248, \r
+    29201, 29208, 29214, 29224, 29233, 29244, 29248, 29254, 29259, 29265, \r
+    29271, 29276, 29289, 29302, 29315, 29322, 29328, 29333, 29337, 1451, \r
+    29341, 29346, 29351, 29356, 29361, 29367, 29372, 29377, 29382, 29387, \r
+    29392, 29397, 29402, 29408, 29414, 29419, 29424, 29430, 29435, 29440, \r
+    29445, 29451, 29456, 29461, 29466, 29471, 29477, 29482, 29487, 29493, \r
+    29498, 29503, 29508, 29513, 29518, 29524, 29529, 29535, 29540, 29546, \r
+    29551, 29556, 29561, 29567, 29573, 29579, 29585, 29591, 29597, 29603, \r
+    29609, 29614, 29619, 29625, 29630, 29635, 29640, 29645, 29650, 29655, \r
+    29660, 29666, 29671, 29676, 29682, 29688, 101, 29693, 29695, 29699, \r
+    29703, 29707, 29712, 29716, 7323, 29720, 29726, 4331, 29732, 29735, \r
+    29740, 29744, 29749, 29753, 29757, 29762, 7869, 29766, 29770, 29774, \r
+    12131, 29779, 29783, 29788, 29793, 29798, 29802, 29809, 21623, 29815, \r
+    29818, 29822, 29827, 29833, 29837, 29843, 29848, 29852, 29856, 29860, \r
+    3317, 3322, 24194, 29863, 29871, 29878, 29882, 29887, 342, 29892, 29898, \r
+    29904, 29908, 29917, 29921, 29925, 29930, 29935, 29939, 29946, 29952, \r
+    29957, 29972, 29987, 30002, 30018, 30036, 7831, 30050, 30055, 30059, \r
+    30067, 27788, 30075, 30079, 30088, 30096, 7546, 11842, 30100, 30103, \r
+    30106, 6089, 3621, 30111, 30119, 30123, 30126, 30130, 30135, 30140, \r
+    30146, 30151, 30155, 30159, 30164, 30168, 30174, 30178, 30185, 30189, \r
+    9256, 30196, 30202, 30207, 30214, 30221, 30228, 23641, 6020, 30235, \r
+    30242, 30249, 30255, 30260, 30267, 30278, 30284, 30289, 30296, 30300, \r
+    30304, 30314, 30325, 30331, 30336, 30341, 30346, 30351, 30355, 30359, \r
+    30365, 2255, 767, 7891, 7896, 7902, 30374, 7907, 7912, 7918, 30379, \r
+    30389, 30393, 7923, 30398, 30401, 30406, 30410, 30415, 30422, 30428, \r
+    30438, 4146, 30447, 30451, 30455, 30465, 30471, 30482, 30488, 30494, \r
+    30499, 30505, 30511, 30516, 30519, 30526, 30532, 30537, 30544, 30551, \r
+    30555, 30565, 30578, 30587, 30596, 30607, 30620, 30629, 30640, 30645, \r
+    30650, 7928, 30656, 30664, 30669, 5094, 21, 30676, 30681, 13284, 30685, \r
+    30688, 30691, 23219, 30695, 23650, 30703, 30707, 30710, 30716, 30722, \r
+    30730, 30736, 30743, 30747, 30751, 23383, 30755, 30764, 30770, 30775, \r
+    30779, 30787, 21669, 30793, 30800, 30806, 30811, 30816, 30820, 30826, \r
+    30831, 30837, 3747, 716, 30844, 30848, 30851, 12054, 30863, 29182, 30874, \r
+    30877, 30884, 30890, 30894, 30900, 30905, 30911, 30916, 30921, 30925, \r
+    30930, 30935, 30945, 30951, 30964, 30970, 30975, 30981, 13193, 1454, 932, \r
+    25770, 25776, 30986, 25782, 25795, 25801, 25807, 30992, 25813, 25819, \r
+    30998, 31004, 14, 31012, 31019, 31023, 31027, 31035, 31039, 31044, 31048, \r
+    31055, 31060, 31064, 31069, 31075, 31080, 31086, 31091, 31095, 31099, \r
+    31103, 31108, 31112, 31117, 31121, 31128, 31133, 31137, 31142, 31146, \r
+    31151, 31155, 31160, 12218, 12223, 31165, 31169, 31172, 31176, 31181, \r
+    31185, 31191, 31198, 31203, 31213, 31218, 31226, 31230, 31233, 31237, \r
+    31242, 31247, 31251, 31256, 10581, 31267, 31271, 31274, 31278, 31282, \r
+    31285, 31289, 6108, 10597, 31292, 31295, 31300, 31304, 31313, 31329, \r
+    31345, 31355, 23138, 31362, 31366, 31371, 31375, 31379, 31384, 31389, \r
+    31393, 31398, 31402, 31406, 22323, 31412, 17702, 31417, 31424, 31432, \r
+    31438, 31445, 31453, 31459, 31463, 31469, 31477, 31481, 31490, 7304, \r
+    31498, 31502, 31510, 31517, 31522, 31526, 31529, 31533, 31536, 31540, \r
+    31547, 31552, 21814, 25825, 31556, 31563, 31569, 31574, 31577, 31579, \r
+    31586, 31593, 31599, 31603, 31606, 31610, 31614, 31618, 31623, 31627, \r
+    31631, 31634, 31638, 31652, 19144, 31671, 31684, 31697, 31710, 19162, \r
+    31725, 8090, 31740, 31746, 31750, 31754, 31761, 31767, 31772, 31778, \r
+    31788, 31800, 31811, 31816, 31823, 31827, 31830, 12589, 31838, 12239, \r
+    31851, 31855, 31859, 31864, 31869, 31873, 31877, 31880, 5750, 23022, \r
+    31885, 31889, 31895, 31904, 31909, 29159, 31915, 31920, 31924, 31929, \r
+    31936, 31940, 31943, 11526, 31948, 31955, 939, 31959, 31964, 31969, \r
+    31975, 31980, 31985, 31989, 31994, 32000, 32005, 32011, 32016, 32022, \r
+    32032, 32037, 32042, 32046, 5245, 5257, 32051, 32054, 32061, 32070, \r
+    32074, 32077, 32081, 32086, 668, 32091, 32097, 23211, 32103, 32108, \r
+    32118, 32127, 32134, 32140, 32144, 32151, 32157, 32164, 32170, 32180, \r
+    32188, 32194, 32200, 32205, 32209, 32216, 32222, 32229, 31619, 548, 1208, \r
+    32235, 32240, 32243, 32249, 32257, 1383, 32262, 32266, 32271, 32278, \r
+    32284, 32288, 32293, 32302, 32309, 32319, 32325, 23237, 32342, 32351, \r
+    32359, 32365, 32370, 32377, 32383, 32391, 32400, 32408, 32413, 32421, \r
+    32427, 32446, 12522, 32460, 32476, 32490, 32496, 32501, 32506, 32511, \r
+    32517, 32522, 32526, 32533, 32538, 32542, 319, 2807, 32549, 32554, 22579, \r
+    32380, 32559, 32564, 32572, 32576, 32579, 32585, 32589, 23287, 32592, \r
+    32596, 32599, 32604, 32608, 32613, 32618, 32622, 32627, 32631, 17511, \r
+    17522, 32635, 32640, 32646, 22292, 32651, 32655, 12702, 32658, 32663, \r
+    32668, 32673, 32678, 32683, 32688, 32693, 453, 43, 25828, 25833, 25838, \r
+    25844, 25849, 25854, 32698, 25858, 32702, 32706, 25863, 25869, 32710, \r
+    25874, 25879, 32718, 32723, 25885, 32728, 32733, 32738, 32743, 32749, \r
+    32755, 25896, 32768, 32774, 25900, 25905, 32778, 25910, 25915, 32781, \r
+    32786, 32790, 25591, 32796, 10746, 32803, 32808, 25920, 32812, 32817, \r
+    32822, 32827, 32831, 32836, 32841, 32847, 32852, 32857, 32863, 32869, \r
+    32874, 32878, 32883, 32888, 32893, 32897, 32902, 32907, 32912, 32918, \r
+    32924, 32930, 32935, 32939, 32944, 32948, 25924, 25929, 25934, 32952, \r
+    32956, 25939, 25945, 25951, 25957, 32968, 21521, 32972, 32976, 32981, \r
+    32986, 32991, 32995, 32999, 33009, 33014, 33019, 33023, 33027, 33030, \r
+    33038, 25966, 1461, 33043, 33051, 33060, 33064, 33072, 33080, 33096, \r
+    33101, 1731, 9398, 33105, 2853, 33117, 33118, 33126, 33133, 33138, 33143, \r
+    7197, 1043, 7950, 33150, 33155, 33158, 33167, 1294, 33172, 33179, 33182, \r
+    33187, 18600, 2485, 33191, 8312, 33201, 33207, 2273, 2283, 33216, 33225, \r
+    27997, 7985, 3565, 29063, 1299, 33235, 33243, 33250, 33255, 33259, 33263, \r
+    19759, 8012, 33271, 33280, 33289, 33297, 33304, 33309, 33322, 33335, \r
+    33347, 33359, 33371, 33384, 33395, 33406, 33414, 33422, 33434, 33446, \r
+    33457, 33466, 33474, 33481, 33493, 33500, 33509, 33516, 33529, 33539, \r
+    33544, 33550, 33555, 33559, 33566, 33570, 33577, 33585, 2451, 33592, \r
+    33603, 33613, 33622, 33630, 33640, 33648, 33658, 33663, 33669, 33680, \r
+    33690, 33699, 33708, 33718, 33727, 33732, 33737, 1687, 37, 33745, 33753, \r
+    33764, 33775, 33785, 33792, 33798, 33803, 33807, 33818, 33828, 33837, \r
+    33848, 13257, 13262, 33853, 33862, 33867, 33877, 33882, 33890, 33898, \r
+    33905, 33911, 8057, 1018, 33915, 33921, 33926, 33929, 2094, 31856, 33937, \r
+    33941, 33944, 1494, 33950, 11019, 1304, 33955, 33968, 33982, 2536, 34000, \r
+    34012, 34024, 2550, 2567, 34038, 34051, 2582, 34065, 34077, 2597, 34091, \r
+    1310, 1316, 1322, 8237, 34096, 34101, 34106, 34110, 34125, 34140, 34155, \r
+    34170, 34185, 34200, 34215, 34230, 34245, 34260, 34275, 34290, 34305, \r
+    34320, 34335, 34350, 34365, 34380, 34395, 34410, 34425, 34440, 34455, \r
+    34470, 34485, 34500, 34515, 34530, 34545, 34560, 34575, 34590, 34605, \r
+    34620, 34635, 34650, 34665, 34680, 34695, 34710, 34725, 34740, 34755, \r
+    34770, 34785, 34800, 34815, 34830, 34845, 34860, 34875, 34890, 34905, \r
+    34920, 34935, 34950, 34965, 34980, 34995, 35010, 35025, 35040, 35055, \r
+    35070, 35085, 35100, 35115, 35130, 35145, 35160, 35175, 35190, 35205, \r
+    35220, 35235, 35250, 35265, 35280, 35295, 35310, 35325, 35340, 35355, \r
+    35370, 35385, 35400, 35415, 35430, 35445, 35460, 35475, 35490, 35505, \r
+    35520, 35535, 35550, 35565, 35580, 35595, 35610, 35625, 35640, 35655, \r
+    35670, 35685, 35700, 35715, 35730, 35745, 35760, 35775, 35790, 35805, \r
+    35820, 35835, 35850, 35865, 35880, 35895, 35910, 35925, 35940, 35955, \r
+    35970, 35985, 36000, 36015, 36030, 36045, 36060, 36075, 36090, 36105, \r
+    36120, 36135, 36150, 36165, 36180, 36195, 36210, 36225, 36240, 36255, \r
+    36270, 36285, 36300, 36315, 36330, 36345, 36360, 36375, 36390, 36405, \r
+    36420, 36435, 36450, 36465, 36480, 36495, 36510, 36525, 36540, 36555, \r
+    36570, 36585, 36600, 36615, 36630, 36645, 36660, 36675, 36690, 36705, \r
+    36720, 36735, 36750, 36765, 36780, 36795, 36810, 36825, 36840, 36855, \r
+    36870, 36885, 36900, 36915, 36930, 36945, 36960, 36975, 36990, 37005, \r
+    37020, 37035, 37050, 37065, 37080, 37095, 37110, 37125, 37140, 37155, \r
+    37170, 37185, 37200, 37215, 37230, 37245, 37260, 37275, 37290, 37305, \r
+    37320, 37335, 37350, 37365, 37380, 37395, 37410, 37425, 37440, 37455, \r
+    37470, 37485, 37500, 37515, 37530, 37545, 37560, 37575, 37590, 37605, \r
+    37620, 37635, 37650, 37665, 37680, 37695, 37710, 37725, 37740, 37755, \r
+    37770, 37785, 37800, 37815, 37830, 37845, 37860, 37875, 37890, 37905, \r
+    37920, 37935, 37950, 37965, 37980, 37995, 38010, 38025, 38040, 38055, \r
+    38070, 38085, 38100, 38115, 38130, 38145, 38160, 38175, 38190, 38205, \r
+    38220, 38235, 38250, 38265, 38280, 38295, 38310, 38325, 38340, 38355, \r
+    38370, 38385, 38400, 38415, 38430, 38445, 38460, 38475, 38490, 38505, \r
+    38520, 38535, 38550, 38565, 38580, 38595, 38610, 38625, 38640, 38655, \r
+    38670, 38685, 38700, 38715, 38730, 38745, 38760, 38775, 38790, 38805, \r
+    38820, 38835, 38850, 38865, 38880, 38895, 38910, 38925, 38940, 38955, \r
+    38970, 38985, 39000, 39015, 39030, 39045, 39060, 39075, 39090, 39105, \r
+    39120, 39135, 39150, 39165, 39180, 39195, 39210, 39225, 39240, 39255, \r
+    39270, 39285, 39300, 39315, 39330, 39345, 39360, 39375, 39390, 39405, \r
+    39420, 39435, 39450, 39465, 39480, 39495, 39510, 39525, 39540, 39555, \r
+    39570, 39585, 39600, 39615, 39630, 39645, 39660, 39675, 39690, 39705, \r
+    39720, 39735, 39750, 39765, 39780, 39795, 39810, 39825, 39840, 39855, \r
+    39870, 39885, 39900, 39915, 39930, 39945, 39960, 39975, 39990, 40005, \r
+    40020, 40035, 40050, 40065, 40080, 40095, 40110, 40125, 40140, 40155, \r
+    40170, 40185, 40200, 40215, 40230, 40245, 40260, 40275, 40290, 40305, \r
+    40320, 40335, 40350, 40365, 40380, 40395, 40410, 40425, 40440, 40455, \r
+    40470, 40485, 40500, 40515, 40530, 40545, 40560, 40575, 40590, 40605, \r
+    40620, 40635, 40650, 40665, 40680, 40695, 40710, 40725, 40740, 40755, \r
+    40770, 40785, 40800, 40815, 40830, 40845, 40860, 40875, 40890, 40905, \r
+    40920, 40935, 40950, 40965, 40980, 40995, 41010, 41025, 41040, 41055, \r
+    41070, 41085, 41100, 41115, 41130, 41145, 41160, 41175, 41190, 41205, \r
+    41220, 41235, 41250, 41265, 41280, 41295, 41310, 41325, 41340, 41355, \r
+    41370, 41385, 41400, 41415, 41430, 41445, 41460, 41475, 41490, 41505, \r
+    41520, 41535, 41550, 41565, 41580, 41595, 41610, 41625, 41640, 41655, \r
+    41670, 41685, 41700, 41715, 41730, 41745, 41761, 41777, 41793, 41809, \r
+    41825, 41841, 41857, 41873, 41889, 41905, 41921, 41937, 41953, 41969, \r
+    41985, 42001, 42017, 42033, 42049, 42065, 42081, 42097, 42113, 42129, \r
+    42145, 42161, 42177, 42193, 42209, 42225, 42241, 42257, 42273, 42289, \r
+    42305, 42321, 42337, 42353, 42369, 42385, 42401, 42417, 42433, 42449, \r
+    42465, 42481, 42497, 42513, 42529, 42545, 42561, 42577, 42593, 42609, \r
+    42625, 42641, 42657, 42673, 42689, 42705, 42721, 42737, 42753, 42769, \r
+    42785, 42801, 42817, 42833, 42849, 42865, 42881, 42897, 42913, 42929, \r
+    42945, 42961, 42977, 42993, 43009, 43025, 43041, 43057, 43073, 43089, \r
+    43105, 43121, 43137, 43153, 43169, 43185, 43201, 43217, 43233, 43249, \r
+    43265, 43281, 43297, 43313, 43329, 43345, 43361, 43377, 43393, 43409, \r
+    43425, 43441, 43457, 43473, 43489, 43505, 43521, 43537, 43553, 43569, \r
+    43585, 43601, 43617, 43633, 43649, 43665, 43681, 43697, 43713, 43729, \r
+    43745, 43761, 43777, 43793, 43809, 43825, 43841, 43857, 43873, 43889, \r
+    43905, 43921, 43937, 43953, 43969, 43985, 44001, 44017, 44033, 44049, \r
+    44065, 44081, 44097, 44113, 44129, 44145, 44161, 44177, 44193, 44209, \r
+    44225, 44241, 44257, 44273, 44289, 44305, 44321, 44337, 44353, 44369, \r
+    44385, 44401, 44417, 44433, 44449, 44465, 44481, 44497, 44513, 44529, \r
+    44545, 44561, 44577, 44593, 44609, 44625, 44641, 44657, 44673, 44689, \r
+    44705, 44721, 44737, 44753, 44769, 44785, 44801, 44817, 44833, 44849, \r
+    44865, 44881, 44897, 44913, 44929, 44945, 44961, 44977, 44993, 45009, \r
+    45025, 45041, 45057, 45073, 45089, 45105, 45121, 45137, 45153, 45169, \r
+    45185, 45201, 45217, 45233, 45249, 45265, 45281, 45297, 45313, 45329, \r
+    45345, 45361, 45377, 45393, 45409, 45425, 45441, 45457, 45473, 45489, \r
+    45505, 45521, 45537, 45553, 45569, 45585, 45601, 45617, 45633, 45649, \r
+    45665, 45681, 45697, 45713, 45729, 45745, 45761, 45777, 45793, 45809, \r
+    45825, 45841, 45857, 45873, 45889, 45905, 45921, 45937, 45953, 45969, \r
+    45985, 46001, 46017, 46033, 46049, 46065, 46081, 46097, 46113, 46129, \r
+    46145, 46161, 46177, 46193, 46209, 46225, 46241, 46257, 46273, 46289, \r
+    46305, 46321, 46337, 46353, 46369, 46385, 46401, 46417, 46433, 46449, \r
+    46465, 46481, 46497, 46513, 46529, 46545, 46561, 46577, 46593, 46609, \r
+    46625, 46641, 46657, 46673, 46689, 46705, 46721, 46737, 46753, 46769, \r
+    46785, 46801, 46817, 46833, 46849, 46865, 46881, 46897, 46913, 46929, \r
+    46945, 46961, 46977, 46993, 47009, 47025, 47041, 47057, 47073, 47089, \r
+    47105, 47121, 47137, 47153, 47169, 47185, 47201, 47217, 47233, 47249, \r
+    47265, 47281, 47297, 47313, 47329, 47345, 47361, 47377, 47393, 47409, \r
+    47425, 47441, 47457, 47473, 47489, 47505, 47521, 47537, 47553, 47569, \r
+    47585, 47601, 47617, 47633, 47649, 47665, 47681, 47697, 47713, 47729, \r
+    47745, 47761, 47777, 47793, 47809, 47825, 47841, 47857, 47873, 47889, \r
+    47905, 47921, 47937, 47953, 47969, 47985, 48001, 48017, 48033, 48049, \r
+    48065, 48081, 48097, 48113, 48129, 48145, 48161, 48177, 48193, 48209, \r
+    48225, 48241, 48257, 48273, 48289, 48305, 48321, 48337, 48353, 48369, \r
+    48385, 48401, 48417, 48433, 48449, 48465, 48481, 48497, 48513, 48529, \r
+    48545, 48561, 48577, 48593, 48609, 48625, 48641, 48657, 48673, 48689, \r
+    48705, 48721, 48737, 48753, 48769, 48785, 48801, 48817, 48833, 48849, \r
+    48865, 48881, 48897, 48913, 48929, 48945, 48961, 48977, 48993, 49009, \r
+    49025, 49041, 49057, 49073, 49089, 49105, 49121, 49137, 49153, 49169, \r
+    49185, 49201, 49217, 49233, 49249, 49265, 49281, 49297, 49313, 49329, \r
+    49345, 49361, 49377, 49393, 49409, 49425, 49441, 49457, 49473, 49489, \r
+    49505, 49521, 49537, 49553, 49569, 49585, 49601, 49617, 49633, 49649, \r
+    49665, 49681, 49697, 49713, 49729, 49745, 49761, 49777, 49793, 49809, \r
+    49825, 49841, 49857, 49873, 49889, 49905, 49921, 49937, 49953, 49969, \r
+    49985, 50001, 50017, 50033, 50049, 50065, 50081, 50097, 50113, 50129, \r
+    50145, 50161, 50177, 50193, 50209, 50225, 50241, 50257, 50273, 50289, \r
+    50305, 50321, 50337, 50353, 50369, 50385, 50401, 50417, 50432, 50441, \r
+    50447, 50453, 50463, 50471, 11823, 13787, 7661, 50484, 1502, 50492, \r
+    22665, 5207, 50498, 50503, 50508, 50513, 50518, 50524, 50529, 50535, \r
+    50540, 50546, 50551, 50556, 50561, 50566, 50572, 50577, 50582, 50587, \r
+    50592, 50597, 50602, 50607, 50613, 50618, 50624, 50631, 2489, 50636, \r
+    50642, 6480, 50646, 50651, 50658, 50666, 40, 50670, 50676, 50681, 50686, \r
+    50690, 50695, 50699, 50703, 8255, 50707, 50717, 50730, 50741, 50754, \r
+    50761, 50767, 50772, 50778, 50784, 50790, 50795, 50800, 50805, 50810, \r
+    50814, 50819, 50824, 50829, 50835, 50841, 50847, 50852, 50856, 50861, \r
+    50866, 50870, 50875, 50880, 50885, 50889, 8271, 8282, 8287, 1545, 50893, \r
+    1550, 50899, 50902, 1581, 50908, 1587, 1593, 8317, 50913, 50921, 50928, \r
+    50932, 50938, 50943, 25620, 50948, 50955, 50960, 50964, 50968, 1598, \r
+    12933, 12944, 50977, 50984, 50989, 50993, 12956, 1602, 30319, 50996, \r
+    51006, 51010, 1607, 31921, 51015, 8437, 8443, 51021, 51033, 51050, 51067, \r
+    51084, 51101, 51118, 51135, 51152, 51169, 51186, 51203, 51220, 51237, \r
+    51254, 51271, 51288, 51305, 51322, 51339, 51356, 51373, 51390, 51407, \r
+    51424, 51441, 51458, 51475, 51492, 51509, 51526, 51543, 51560, 51577, \r
+    51594, 51611, 51628, 51645, 51662, 51679, 51696, 51713, 51730, 51747, \r
+    51764, 51781, 51798, 51815, 51832, 51849, 51866, 51877, 51882, 1612, \r
+    51886, 51892, 7144, 1617, 22912, 51897, 51908, 51918, 51923, 51930, \r
+    51936, 51941, 51946, 51950, 8454, 1622, 8459, 51954, 51959, 51965, 51970, \r
+    51975, 51980, 51985, 51990, 51995, 52000, 52006, 52012, 52018, 52023, \r
+    52027, 52032, 52037, 52041, 52046, 52051, 52056, 52060, 52065, 52071, \r
+    52076, 52081, 52085, 52090, 52095, 52101, 52106, 52111, 52117, 52123, \r
+    52128, 52132, 52137, 52142, 52147, 52151, 52156, 52161, 52166, 52172, \r
+    52178, 52183, 52187, 52191, 52196, 52201, 52206, 24124, 52210, 52215, \r
+    52220, 52226, 52231, 52236, 52240, 52245, 52250, 52256, 52261, 52266, \r
+    52272, 52278, 52283, 52287, 52292, 52297, 52301, 52306, 52311, 52316, \r
+    52322, 52328, 52333, 52337, 52342, 52347, 52351, 52356, 52361, 52366, \r
+    52370, 52373, 26077, 52378, 52386, 13218, 13236, 8557, 52392, 8562, \r
+    52407, 52412, 52423, 52435, 52447, 52459, 2588, 52471, 52476, 52480, \r
+    52486, 52492, 1634, 940, 52497, 52502, 31960, 52506, 52510, 52515, 52519, \r
+    13301, 52524, 52527, 52535, 1638, 8587, 8593, 1643, 52543, 52550, 52555, \r
+    52564, 52574, 52581, 1648, 52588, 52593, 13376, 52597, 52602, 52609, \r
+    52615, 52619, 52629, 13398, 7063, 7070, 1653, 52636, 52642, 52650, 52657, \r
+    52663, 52669, 52674, 52685, 52694, 3498, 25495, 25504, 13438, 1658, 1662, \r
+    52702, 52713, 52718, 1665, 52726, 52731, 52743, 52749, 52754, 1670, \r
+    52759, 52764, 52772, 52780, 52787, 52796, 52804, 52813, 1675, 1680, \r
+    52817, 52824, 13547, 52832, 52838, 52846, 52851, 8727, 52860, 52866, \r
+    52872, 52877, 52885, 8736, 8741, 52893, 52899, 3563, 32038, 52904, 52910, \r
+    52915, 52923, 52930, 52935, 52939, 52945, 1691, 52950, 52953, 977, 52959, \r
+    52964, 52969, 52975, 52980, 52985, 52990, 52995, 53000, 53005, 1700, 9, \r
+    53011, 53015, 53020, 53024, 53028, 53032, 26315, 53037, 53042, 53047, \r
+    53051, 53054, 53058, 53062, 53067, 53071, 53076, 53080, 28322, 28327, \r
+    28332, 53083, 53090, 53096, 31804, 53106, 28338, 28343, 26325, 26331, \r
+    28354, 26337, 53111, 53116, 53120, 53124, 53127, 53131, 53134, 53139, \r
+    53143, 53147, 53150, 53162, 27517, 53169, 12396, 760, 53172, 53176, \r
+    53181, 53185, 10779, 53188, 53195, 53208, 53217, 53222, 53232, 53245, \r
+    53257, 53264, 53269, 53278, 53291, 29283, 53309, 53314, 53321, 53327, \r
+    53332, 53340, 22979, 585, 53346, 53352, 53358, 53363, 26342, 4176, 26356, \r
+    53367, 53377, 53382, 53392, 53407, 53413, 53419, 26361, 25652, 53424, \r
+    53429, 53434, 53438, 53443, 53448, 53452, 4217, 26382, 53456, 53462, 337, \r
+    53472, 53479, 53488, 53494, 53502, 53506, 53510, 53514, 53518, 53523, \r
+    53527, 53533, 53541, 53546, 53550, 53555, 53559, 53563, 53569, 53575, \r
+    53580, 53584, 26398, 53589, 26404, 26410, 53594, 53600, 53605, 53609, \r
+    25669, 13167, 53612, 53616, 53621, 53628, 53634, 53638, 53643, 53649, \r
+    53653, 53657, 53662, 53667, 53671, 53674, 53680, 53685, 53692, 53699, \r
+    53705, 53710, 53715, 53719, 53724, 53730, 53735, 53741, 53746, 53751, \r
+    53756, 53762, 53767, 53772, 53778, 53784, 53790, 26415, 53795, 53800, \r
+    53805, 26426, 53810, 53815, 53820, 53826, 53832, 26431, 53837, 53842, \r
+    53847, 26442, 26448, 53852, 53857, 53862, 53867, 23129, 26453, 26457, \r
+    53872, 53843, 53876, 53882, 53890, 53897, 53903, 53913, 53919, 53926, \r
+    8214, 26462, 53932, 53945, 53954, 53960, 53969, 53975, 19524, 53982, \r
+    53989, 26443, 53999, 54006, 54011, 54015, 54019, 54024, 4251, 54028, \r
+    54033, 54038, 28416, 28421, 54042, 28427, 28432, 54047, 28437, 28443, \r
+    54052, 28448, 54063, 54066, 54078, 54086, 26484, 54090, 54099, 54109, \r
+    54118, 26489, 54123, 54130, 54139, 54145, 54153, 27045, 4069, 54158, \r
+    26498, 54164, 54167, 54173, 54180, 54185, 54190, 19456, 54194, 54200, \r
+    54206, 54211, 54217, 54223, 54228, 765, 29092, 29839, 29845, 54232, \r
+    54236, 54240, 54243, 54256, 54262, 54266, 54269, 54274, 27708, 54278, \r
+    25674, 17585, 54284, 4197, 4205, 6948, 54287, 54292, 54297, 54302, 54307, \r
+    54312, 54317, 54322, 54327, 54332, 54338, 54343, 54348, 54354, 54359, \r
+    54364, 54369, 54374, 54379, 54384, 54390, 54395, 54401, 54406, 54411, \r
+    54416, 54421, 54426, 54431, 54436, 54441, 54446, 54451, 54457, 54462, \r
+    54467, 54472, 54477, 54482, 54487, 54493, 54498, 54503, 54508, 54513, \r
+    54518, 54523, 54528, 54533, 54538, 54544, 54549, 54554, 54559, 54564, \r
+    54570, 54576, 54581, 54587, 54592, 54597, 54602, 54607, 54612, 1495, 235, \r
+    54617, 54621, 54625, 54629, 54633, 54636, 54640, 54645, 54649, 54654, \r
+    54658, 54662, 54666, 54671, 54675, 54680, 54684, 54688, 54695, 11999, \r
+    54704, 54713, 54717, 20701, 54721, 54727, 54735, 54741, 54753, 54757, \r
+    54762, 54768, 54778, 54788, 54794, 54798, 54803, 54809, 54818, 54827, \r
+    54835, 12274, 54839, 54848, 54856, 54867, 54878, 54887, 54891, 54900, \r
+    54910, 54916, 54921, 54927, 54932, 98, 25579, 54943, 21735, 54949, 54956, \r
+    54962, 54966, 54976, 54984, 54989, 54993, 55001, 55005, 55011, 55021, \r
+    1132, 55024, 55027, 55031, 55037, 55044, 55050, 55059, 55068, 55074, \r
+    55080, 55085, 55092, 55099, 55112, 55121, 55130, 55135, 55139, 55146, \r
+    55153, 55160, 55167, 55174, 55179, 55183, 55187, 55190, 55200, 55204, \r
+    55213, 55217, 55222, 55226, 55235, 55243, 55251, 55256, 55260, 55265, \r
+    55270, 55274, 55280, 55292, 55300, 55310, 55317, 55323, 55328, 55332, \r
+    55336, 55340, 55349, 55358, 55367, 55373, 55379, 55385, 55390, 55397, \r
+    55403, 55411, 55418, 9779, 55424, 55430, 55434, 11225, 55438, 55447, \r
+    55453, 55461, 55468, 55472, 55476, 55482, 55490, 55497, 55503, 55514, \r
+    55518, 55522, 55526, 55529, 55535, 55540, 55544, 55548, 55557, 55565, \r
+    55572, 19890, 31572, 55578, 55586, 55590, 55597, 55606, 55614, 55620, \r
+    55625, 55629, 55634, 55638, 55643, 55652, 55656, 55663, 55670, 55678, \r
+    55684, 55695, 55701, 55710, 55717, 55724, 55731, 55738, 55745, 34285, \r
+    55752, 55759, 55764, 55770, 37407, 55774, 55779, 55784, 55790, 55796, \r
+    55802, 55807, 55812, 55817, 55822, 55828, 55833, 55839, 55844, 55850, \r
+    55855, 55860, 55865, 55870, 55875, 55880, 55885, 55891, 55896, 55902, \r
+    55907, 55912, 55917, 55922, 55927, 55932, 55938, 55943, 55948, 55953, \r
+    55958, 55963, 55968, 55973, 55978, 55983, 55988, 55994, 55999, 56004, \r
+    56009, 56014, 56019, 56024, 56029, 56034, 56040, 56045, 56050, 56055, \r
+    56060, 56065, 56070, 56075, 56080, 56085, 56090, 56095, 56100, 56106, \r
+    1816, 216, 30402, 56111, 56114, 56119, 56123, 55247, 56126, 56136, 56143, \r
+    56152, 56162, 56172, 56180, 56188, 56192, 56195, 56202, 56208, 56219, \r
+    56231, 56242, 56249, 1305, 19361, 56259, 2518, 56263, 1087, 13743, 30918, \r
+    56271, 56284, 56288, 56293, 56298, 56303, 56309, 56315, 56320, 6489, \r
+    56325, 56333, 8588, 56338, 56344, 1703, 8600, 669, 56353, 56362, 56372, \r
+    22357, 56381, 56387, 13353, 56393, 56397, 3678, 8890, 56403, 52708, \r
+    56410, 6919, 171, 11159, 56416, 56428, 56432, 56438, 22932, 56442, 8878, \r
+    2623, 4, 56447, 56457, 56463, 56474, 56481, 56487, 56493, 56501, 56508, \r
+    56518, 56528, 56538, 1317, 56547, 56553, 2646, 2652, 6486, 2200, 56557, \r
+    56561, 56570, 56581, 56589, 56597, 56603, 56614, 56625, 56633, 56639, \r
+    8931, 56644, 56652, 56656, 56660, 23273, 56672, 56682, 56688, 56694, \r
+    56704, 56707, 56718, 56728, 56737, 56741, 56748, 1089, 2511, 56758, \r
+    56763, 56771, 56779, 56790, 56804, 11111, 374, 56814, 56818, 56827, \r
+    56835, 56841, 56848, 56854, 56861, 56871, 56879, 3570, 184, 56887, 56898, \r
+    56902, 56914, 23120, 148, 56920, 56925, 56929, 56936, 56942, 56950, \r
+    56957, 6740, 56964, 56973, 3625, 56981, 13399, 56985, 2681, 419, 56990, \r
+    57003, 57008, 1815, 602, 57012, 3631, 57020, 57026, 917, 57036, 57045, \r
+    57050, 11847, 57054, 37617, 57057, 3580, 19507, 57065, 57072, 19549, \r
+    57076, 57083, 57089, 57094, 11861, 57099, 57111, 57117, 57125, 2693, \r
+    1735, 57133, 57135, 57140, 57145, 57150, 57156, 57161, 57166, 57171, \r
+    57176, 57181, 57186, 57192, 57197, 57202, 57207, 57212, 57217, 57222, \r
+    57227, 57232, 57238, 57243, 57248, 57253, 57259, 57264, 57270, 57275, \r
+    57280, 57285, 57290, 57295, 57300, 57305, 57311, 57316, 57322, 57327, \r
+    57332, 57337, 57342, 57347, 57352, 57357, 57362, 57367, 57372, 57376, \r
+    57380, 57385, 57389, 57394, 57399, 57405, 57410, 57414, 57418, 57421, \r
+    57423, 57427, 57430, 57435, 57439, 57443, 57447, 57451, 57460, 26652, \r
+    57463, 26657, 26662, 57470, 57479, 26668, 57484, 26673, 57493, 57498, \r
+    9018, 57502, 57507, 57512, 57516, 57520, 57524, 57528, 57531, 57535, \r
+    6170, 57541, 57546, 57550, 3467, 57553, 57555, 57559, 57562, 57567, \r
+    57571, 57577, 57590, 57596, 57601, 57605, 57613, 57620, 57628, 57637, \r
+    57645, 26678, 57652, 57662, 57671, 57684, 57689, 57694, 57700, 57707, \r
+    57718, 57730, 57737, 57746, 57755, 57764, 57771, 57777, 57784, 57792, \r
+    57799, 57807, 57816, 57824, 57831, 57839, 57848, 57856, 57865, 57875, \r
+    57884, 57892, 57899, 57907, 57916, 57924, 57933, 57943, 57952, 57960, \r
+    57969, 57979, 57988, 57998, 58009, 58019, 58028, 58036, 58043, 58051, \r
+    58060, 58068, 58077, 58087, 58096, 58104, 58113, 58123, 58132, 58142, \r
+    58153, 58163, 58172, 58180, 58189, 58199, 58208, 58218, 58229, 58239, \r
+    58248, 58258, 58269, 58279, 58290, 58302, 58313, 58323, 58332, 58340, \r
+    58347, 58355, 58364, 58372, 58381, 58391, 58400, 58408, 58417, 58427, \r
+    58436, 58446, 58457, 58467, 58476, 58484, 58493, 58503, 58512, 58522, \r
+    58533, 58543, 58552, 58562, 58573, 58583, 58594, 58606, 58617, 58627, \r
+    58636, 58644, 58653, 58663, 58672, 58682, 58693, 58703, 58712, 58722, \r
+    58733, 58743, 58754, 58766, 58777, 58787, 58796, 58806, 58817, 58827, \r
+    58838, 58850, 58861, 58871, 58882, 58894, 58905, 58917, 58930, 58942, \r
+    58953, 58963, 58972, 58980, 58987, 58995, 59004, 59012, 59021, 59031, \r
+    59040, 59048, 59057, 59067, 59076, 59086, 59097, 59107, 59116, 59124, \r
+    59133, 59143, 59152, 59162, 59173, 59183, 59192, 59202, 59213, 59223, \r
+    59234, 59246, 59257, 59267, 59276, 59284, 59293, 59303, 59312, 59322, \r
+    59333, 59343, 59352, 59362, 59373, 59383, 59394, 59406, 59417, 59427, \r
+    59436, 59446, 59457, 59467, 59478, 59490, 59501, 59511, 59522, 59534, \r
+    59545, 59557, 59570, 59582, 59593, 59603, 59612, 59620, 59629, 59639, \r
+    59648, 59658, 59669, 59679, 59688, 59698, 59709, 59719, 59730, 59742, \r
+    59753, 59763, 59772, 59782, 59793, 59803, 59814, 59826, 59837, 59847, \r
+    59858, 59870, 59881, 59893, 59906, 59918, 59929, 59939, 59948, 59958, \r
+    59969, 59979, 59990, 60002, 60013, 60023, 60034, 60046, 60057, 60069, \r
+    60082, 60094, 60105, 60115, 60126, 60138, 60149, 60161, 60174, 60186, \r
+    60197, 60209, 60222, 60234, 60247, 60261, 60274, 60286, 60297, 60307, \r
+    60316, 60324, 60331, 60336, 6029, 60343, 26688, 60348, 60353, 26693, \r
+    60359, 17319, 31449, 60364, 60370, 60376, 60383, 60390, 60395, 60399, \r
+    60403, 60412, 60418, 60430, 60441, 60445, 2936, 6004, 60450, 60453, \r
+    60455, 60459, 60463, 60467, 34097, 60472, 60476, 60479, 60484, 60488, \r
+    60495, 60501, 60505, 60509, 26703, 60512, 60519, 60528, 60536, 60547, \r
+    60555, 60563, 60570, 60577, 60583, 60594, 26708, 60599, 60610, 60622, \r
+    60633, 60641, 2484, 60646, 60659, 60663, 60671, 60676, 60684, 13908, \r
+    60695, 60701, 60708, 60716, 60722, 26713, 60727, 7592, 50467, 60734, \r
+    60737, 60745, 60758, 60771, 60784, 60797, 60804, 60815, 60824, 34102, \r
+    34107, 60829, 60833, 60841, 60848, 60857, 60865, 60871, 60880, 60888, \r
+    60896, 60900, 60909, 60918, 60928, 60941, 60954, 60964, 26718, 60970, \r
+    60977, 60983, 26724, 60988, 60991, 60995, 61003, 61012, 33840, 61020, \r
+    61028, 61035, 61043, 61053, 61062, 61071, 61080, 61088, 61099, 61109, \r
+    7184, 17802, 61118, 61123, 61128, 61132, 61136, 61141, 61147, 61152, \r
+    61157, 61163, 61168, 61173, 17767, 61178, 61185, 61193, 61201, 61206, \r
+    61213, 61220, 61224, 61228, 61236, 61244, 26733, 61250, 61256, 61268, \r
+    61274, 61279, 61290, 61300, 61310, 61322, 61328, 61338, 26738, 61347, \r
+    61356, 61362, 61374, 61385, 61392, 61397, 61401, 61409, 61415, 61420, \r
+    61425, 61432, 61444, 61454, 61463, 61470, 27937, 19731, 61476, 61481, \r
+    61485, 61489, 61494, 61500, 61511, 61524, 61529, 26743, 61534, 61546, \r
+    61555, 61568, 61575, 61584, 61592, 61597, 61603, 1484, 61608, 61613, \r
+    61618, 61623, 61629, 61634, 61639, 61645, 61651, 61656, 61660, 61665, \r
+    61670, 61675, 50973, 61680, 61685, 61690, 61695, 61701, 61707, 61712, \r
+    61716, 61721, 61726, 61731, 61736, 61741, 61745, 61751, 61756, 61765, \r
+    61770, 61775, 61780, 61785, 61789, 61796, 61802, 13605, 13612, 37872, \r
+    61807, 61757, 61809, 26752, 61812, 61821, 61827, 4263, 26757, 61831, \r
+    61837, 61843, 61848, 61852, 61859, 61864, 61874, 61883, 61887, 61893, \r
+    61899, 61905, 61909, 61917, 61924, 61932, 61940, 26762, 61947, 61950, \r
+    61957, 61962, 61966, 61972, 61977, 61981, 61990, 61998, 62004, 62009, \r
+    27544, 62016, 62023, 62029, 62034, 62040, 62047, 62053, 26475, 22688, \r
+    62059, 62064, 62070, 62082, 61790, 61797, 62092, 62097, 62104, 62111, \r
+    62117, 62128, 62133, 6965, 62141, 62144, 62150, 62154, 62158, 62161, \r
+    62167, 26571, 4283, 836, 10621, 62174, 62180, 62186, 62192, 62198, 62204, \r
+    62210, 62216, 62222, 62227, 62232, 62237, 62242, 62247, 62252, 62257, \r
+    62262, 62267, 62272, 62277, 62282, 62287, 62293, 62298, 62303, 62309, \r
+    62314, 62319, 62325, 62331, 62337, 62343, 62349, 62355, 62361, 62367, \r
+    62373, 62378, 62383, 62389, 62394, 62399, 62405, 62410, 62415, 62420, \r
+    62425, 62430, 62435, 62440, 62445, 62450, 62455, 62460, 62465, 62471, \r
+    62476, 62481, 62486, 62492, 62497, 62502, 62507, 62512, 62518, 62523, \r
+    62528, 62533, 62538, 62543, 62548, 62553, 62558, 62563, 62568, 62573, \r
+    62578, 62583, 62588, 62593, 62598, 62603, 62608, 62613, 62619, 62624, \r
+    62629, 62634, 62639, 62644, 62649, 62654, 1846, 138, 62659, 62663, 62667, \r
+    62672, 62680, 62684, 62691, 62699, 62703, 62716, 62720, 62723, 62728, \r
+    62732, 62737, 62741, 62749, 62753, 17327, 62758, 62762, 62766, 62769, \r
+    62777, 62782, 62789, 62795, 62801, 62806, 62814, 56276, 62821, 62826, \r
+    62831, 62835, 62839, 62842, 62847, 62852, 62856, 62859, 62865, 62869, \r
+    62879, 62888, 62891, 62904, 62912, 62920, 62930, 62943, 62950, 62961, \r
+    62967, 62972, 62977, 62983, 62992, 61536, 63000, 63006, 63014, 63018, \r
+    63022, 63028, 63036, 63048, 63060, 63067, 63071, 63082, 63090, 63097, \r
+    63109, 63117, 63125, 63132, 63138, 63148, 63157, 63162, 63172, 63176, \r
+    63180, 63190, 63197, 63209, 63221, 63230, 60649, 63237, 63248, 63262, \r
+    63270, 63280, 63287, 63295, 63304, 63312, 63322, 63331, 63342, 63354, \r
+    63363, 63373, 63380, 63389, 63404, 63413, 63426, 63441, 63445, 63457, \r
+    63468, 63479, 63490, 63500, 63511, 63519, 63525, 63535, 63541, 63546, \r
+    63552, 63558, 63563, 63570, 7469, 13928, 63576, 63581, 63588, 63594, \r
+    63599, 63603, 63606, 63609, 63611, 63618, 63629, 63634, 63638, 63644, \r
+    63649, 63657, 56720, 56730, 63663, 63673, 63680, 63686, 63691, 63700, \r
+    63707, 63715, 63724, 63730, 63736, 63743, 63750, 63755, 63759, 63764, \r
+    63769, 63774, 63778, 62711, 63787, 63791, 63802, 63812, 13937, 63823, \r
+    63831, 13949, 63838, 22598, 63842, 63846, 63851, 63868, 63880, 8169, \r
+    63892, 63897, 63902, 63907, 63911, 63914, 63919, 63924, 63930, 63935, \r
+    4075, 17378, 63940, 63945, 63951, 63958, 63963, 63968, 63974, 63980, \r
+    63986, 63991, 63997, 64001, 64015, 64023, 64031, 64037, 64042, 64049, \r
+    64054, 64059, 64067, 64072, 64078, 64083, 64088, 64092, 64095, 64113, \r
+    64132, 64145, 64159, 64175, 64182, 64189, 64195, 64202, 64207, 64213, \r
+    64219, 64224, 64229, 64245, 8182, 64259, 64266, 64270, 64273, 64278, \r
+    64283, 64290, 64295, 64300, 64305, 64309, 64317, 9090, 64326, 64331, \r
+    64337, 9101, 64342, 64345, 64350, 64360, 64369, 64374, 64382, 64389, \r
+    64400, 64410, 64415, 64420, 64427, 64433, 64438, 64445, 64454, 64462, \r
+    64468, 64475, 64481, 64485, 13451, 2910, 64490, 64494, 64500, 64506, \r
+    64513, 64517, 64538, 64560, 64576, 64593, 64612, 64621, 64631, 64638, \r
+    64645, 22517, 64651, 64655, 64663, 64669, 64677, 64681, 64689, 64696, \r
+    64700, 64706, 64712, 64717, 3375, 34302, 64723, 64727, 64731, 64735, \r
+    64740, 64745, 64750, 64756, 64761, 64767, 64772, 64777, 64781, 64786, \r
+    34317, 64790, 64795, 64803, 64807, 64812, 64819, 64828, 64834, 64841, \r
+    64845, 64852, 64861, 64866, 64874, 64883, 64889, 64894, 64899, 64905, \r
+    64911, 64916, 64920, 64924, 64927, 64935, 64945, 64950, 32057, 64958, \r
+    64970, 64974, 64986, 64997, 65004, 65010, 65017, 65029, 65036, 65042, \r
+    17439, 65046, 65052, 65058, 65063, 65068, 5084, 65073, 65079, 65087, \r
+    65096, 65100, 65106, 64782, 24971, 65111, 65113, 65118, 65123, 65128, \r
+    65133, 65138, 65143, 65148, 65153, 65158, 65163, 65168, 65173, 65178, \r
+    65183, 65189, 65194, 65199, 65204, 65209, 65214, 65219, 65224, 65229, \r
+    65235, 65241, 65247, 65252, 65257, 65269, 65274, 1852, 67, 65279, 65284, \r
+    26772, 26777, 26782, 26788, 26793, 65288, 26798, 65310, 65312, 65316, \r
+    65320, 65325, 65329, 26802, 65333, 26807, 65341, 65344, 26812, 18179, \r
+    65353, 65357, 1415, 65362, 26823, 65365, 65370, 21354, 21364, 65375, \r
+    65379, 65384, 65390, 65395, 65404, 65409, 65416, 65422, 65427, 65432, \r
+    65437, 65445, 26828, 1110, 65452, 65458, 65463, 65468, 65473, 65479, \r
+    65484, 65491, 65497, 65502, 65510, 65516, 13959, 65523, 29296, 65536, \r
+    65541, 65547, 65560, 65564, 65573, 65580, 65586, 65594, 65603, 65610, \r
+    65616, 26832, 65619, 65626, 65632, 65636, 65639, 65647, 65661, 65668, \r
+    26837, 65674, 26842, 65681, 28422, 65691, 65696, 65700, 17717, 65705, \r
+    65710, 26847, 54013, 65714, 65719, 65725, 65731, 65738, 65744, 65749, \r
+    65754, 65763, 65775, 65790, 27067, 65796, 13117, 26851, 65800, 65807, \r
+    26856, 65813, 65822, 65829, 65838, 65844, 65849, 65855, 26861, 65860, \r
+    65869, 65878, 65885, 65891, 65897, 65905, 65909, 26866, 65912, 26872, \r
+    26878, 65917, 65925, 65935, 26883, 65939, 65941, 65945, 65950, 65954, \r
+    65958, 65964, 65969, 65973, 65978, 2915, 65982, 65989, 65993, 66002, \r
+    66010, 66017, 66022, 66027, 66031, 66035, 66038, 66044, 66052, 66058, \r
+    66062, 66067, 66074, 66080, 28799, 66085, 66088, 66093, 66097, 66102, \r
+    66107, 66111, 66119, 21373, 21382, 66125, 66131, 66137, 66142, 66146, \r
+    66149, 66159, 66164, 66170, 66176, 66184, 66189, 28438, 66193, 66201, \r
+    66207, 66212, 66217, 50653, 28444, 66223, 66228, 66232, 66237, 66242, \r
+    66247, 66251, 66256, 66261, 66267, 66272, 66277, 66283, 66289, 66294, \r
+    66298, 66303, 66308, 66313, 66317, 66322, 66327, 66332, 66338, 66344, \r
+    66350, 66355, 66359, 66364, 66369, 66373, 66378, 66383, 66388, 66392, \r
+    26887, 66400, 66404, 66412, 18521, 66423, 66429, 66436, 66441, 66450, \r
+    66455, 66459, 66464, 66472, 66480, 66487, 56422, 66493, 66501, 66508, \r
+    66519, 66525, 26897, 66528, 66535, 32183, 66539, 66544, 66549, 6877, \r
+    66553, 66561, 66568, 66575, 66581, 66445, 66595, 66601, 66605, 66608, \r
+    66616, 66623, 66628, 66641, 66648, 66653, 66658, 66661, 66668, 66672, \r
+    66682, 66692, 66701, 66712, 66717, 66721, 28813, 17641, 32629, 66729, \r
+    66734, 66739, 66744, 66749, 66754, 66759, 66763, 66768, 66773, 66778, \r
+    66783, 66788, 66793, 66797, 66802, 66807, 66811, 66815, 66819, 66823, \r
+    66828, 66833, 66837, 66842, 66846, 66850, 66855, 66860, 66865, 66870, \r
+    66874, 66879, 66884, 66888, 66893, 66898, 66903, 66908, 66913, 66918, \r
+    66923, 66928, 66933, 66938, 66943, 66948, 66953, 66958, 66963, 66968, \r
+    66973, 66978, 66983, 66988, 66992, 66997, 67002, 67007, 67012, 67017, \r
+    67022, 67027, 67032, 67037, 67042, 67047, 67051, 67056, 67060, 67065, \r
+    67070, 67075, 67080, 67085, 67090, 67095, 67100, 67105, 67109, 67113, \r
+    67118, 67123, 67127, 67132, 67137, 67141, 67146, 67151, 67156, 67161, \r
+    67165, 67170, 67175, 67179, 67184, 67188, 67192, 67196, 67200, 67205, \r
+    67209, 67213, 67217, 67221, 67225, 67229, 67233, 67237, 67241, 67246, \r
+    67251, 67256, 67261, 67266, 67271, 67276, 67281, 67286, 67291, 67295, \r
+    67299, 67303, 67307, 67311, 67315, 67320, 67324, 67329, 67333, 67338, \r
+    67343, 67347, 67351, 67356, 67360, 67364, 67368, 67372, 67376, 67380, \r
+    67384, 67388, 67392, 67396, 67400, 67404, 67408, 67412, 67417, 67422, \r
+    67426, 67430, 67434, 67438, 67442, 67446, 67451, 67455, 67459, 67463, \r
+    67467, 67471, 67475, 67480, 67484, 67489, 67493, 67497, 67501, 67505, \r
+    67509, 67513, 67517, 67521, 67525, 67529, 67533, 67538, 67542, 67546, \r
+    67550, 67554, 67558, 67562, 67566, 67570, 67574, 67578, 67582, 67587, \r
+    67591, 67595, 67600, 67605, 67609, 67613, 67617, 67621, 67625, 67629, \r
+    67633, 67637, 67642, 67646, 67651, 67655, 67660, 67664, 67669, 67673, \r
+    67679, 67684, 67688, 67693, 67697, 67702, 67706, 67711, 67715, 67720, \r
+    1503, 67724, 1741, 1746, 67728, 67732, 2711, 67736, 1384, 67741, 1350, \r
+    67745, 67749, 67756, 67763, 67777, 2727, 5159, 67786, 67794, 67801, \r
+    67808, 67821, 67834, 67845, 67850, 67857, 67869, 3703, 9162, 67873, \r
+    67878, 67887, 67897, 67902, 67906, 67911, 67918, 67924, 67936, 1355, \r
+    11688, 67946, 67952, 67966, 67978, 67987, 67996, 68005, 68013, 68024, \r
+    68032, 3742, 68042, 68051, 68057, 68064, 28919, 68069, 2755, 10316, \r
+    68073, 68080, 6828, 68089, 2760, 26495, 68095, 68102, 68108, 68115, \r
+    68121, 68128, 68138, 68147, 68158, 68165, 68171, 68181, 68189, 68195, \r
+    68210, 68216, 68221, 68228, 68231, 68237, 68244, 68250, 68258, 68267, \r
+    68275, 68281, 68290, 33842, 68304, 68309, 11709, 68315, 68328, 68337, \r
+    68345, 68352, 68356, 68360, 68363, 68370, 68377, 68385, 68393, 68402, \r
+    68410, 11645, 68418, 68423, 68427, 68439, 68446, 68455, 793, 68465, 2776, \r
+    68474, 68478, 68484, 68497, 68509, 68519, 68528, 68540, 68548, 68557, \r
+    68568, 68579, 68589, 68599, 68608, 68616, 8811, 68623, 68627, 68632, \r
+    68637, 68643, 1360, 9217, 68650, 68661, 68670, 68678, 68687, 68695, \r
+    68711, 68722, 68738, 68748, 68769, 68782, 68795, 68800, 68806, 22084, \r
+    68812, 68815, 68822, 68832, 6139, 68839, 68844, 68849, 68857, 7517, 7526, \r
+    68865, 68876, 2784, 2789, 68882, 8419, 68888, 68895, 68902, 68915, 2193, \r
+    50, 68920, 68925, 68935, 68941, 68945, 68950, 68954, 2812, 68966, 68974, \r
+    68985, 68996, 69005, 69010, 69016, 69021, 69031, 69041, 69046, 69052, \r
+    69057, 69066, 17674, 69070, 3804, 12, 69075, 69082, 766, 69088, 69093, \r
+    52873, 69098, 69103, 69109, 69117, 69122, 69129, 69135, 30869, 33740, \r
+    69141, 2816, 32, 69151, 69164, 69172, 69177, 69183, 2838, 25639, 69188, \r
+    69196, 69203, 69208, 50895, 53694, 69217, 1686, 1795, 69222, 69227, \r
+    69234, 1799, 237, 69241, 69247, 69252, 69259, 1803, 69264, 69270, 69275, \r
+    69287, 4250, 69297, 1810, 69303, 69308, 69315, 69322, 69337, 69344, \r
+    69352, 69356, 69360, 69372, 69377, 69381, 23272, 3830, 69385, 69396, \r
+    69400, 69404, 69410, 69414, 69423, 69427, 69438, 69442, 2238, 69446, \r
+    69448, 2935, 7189, 69456, 69461, 69465, 69474, 69480, 2905, 13622, 69484, \r
+    69497, 69515, 69520, 69528, 69536, 69546, 69558, 69571, 69578, 69594, \r
+    69601, 69607, 958, 69614, 69621, 69631, 69640, 69652, 34706, 69660, 2919, \r
+    9391, 69663, 69671, 69675, 2923, 69679, 17523, 52946, 3514, 69683, 2929, \r
+    69687, 69697, 69703, 69709, 69715, 69721, 69727, 69733, 69739, 69745, \r
+    69751, 69757, 69763, 69769, 69775, 69781, 69787, 69793, 69799, 69805, \r
+    69811, 69817, 69823, 69829, 69835, 69841, 69847, 69854, 69861, 69867, \r
+    69873, 69879, 69885, 69891, 69897, 1365, 12692, 9411, 69903, 69908, \r
+    69913, 69918, 69923, 69928, 69933, 69938, 69943, 69948, 69953, 69958, \r
+    69963, 69968, 69973, 69978, 69983, 69988, 69993, 69998, 70003, 70008, \r
+    70013, 70018, 70023, 70028, 70034, 70039, 70044, 70050, 70055, 70061, \r
+    70066, 70071, 70077, 70082, 70087, 70092, 70097, 70102, 70107, 70112, \r
+    70117, 69698, 69704, 69710, 69716, 69722, 69728, 69734, 69740, 69746, \r
+    69752, 69758, 69764, 69770, 69776, 69782, 70123, 69788, 69794, 69800, \r
+    70129, 69806, 69812, 69818, 69824, 69830, 69836, 69842, 69862, 70135, \r
+    70141, 69868, 70147, 69874, 69880, 69886, 69892, 69898, 2950, 2955, \r
+    70153, 70158, 70161, 70167, 70173, 70180, 70185, 70190, 2243, \r
+};\r
+\r
+/* code->name phrasebook */\r
+#define phrasebook_shift 7\r
+#define phrasebook_short 216\r
+static unsigned char phrasebook[] = {\r
+    0, 223, 254, 246, 95, 78, 228, 69, 78, 54, 55, 248, 155, 55, 229, 169, \r
+    55, 254, 134, 254, 79, 42, 229, 229, 45, 229, 229, 253, 251, 88, 55, 250, \r
+    168, 242, 120, 245, 90, 223, 136, 224, 17, 20, 217, 84, 20, 107, 20, 103, \r
+    20, 160, 20, 154, 20, 174, 20, 182, 20, 191, 20, 185, 20, 190, 250, 175, \r
+    225, 67, 235, 87, 55, 246, 154, 55, 244, 30, 55, 228, 82, 78, 250, 167, \r
+    253, 244, 7, 6, 1, 60, 7, 6, 1, 253, 204, 7, 6, 1, 251, 202, 7, 6, 1, \r
+    250, 46, 7, 6, 1, 73, 7, 6, 1, 246, 74, 7, 6, 1, 245, 67, 7, 6, 1, 243, \r
+    225, 7, 6, 1, 72, 7, 6, 1, 237, 126, 7, 6, 1, 237, 17, 7, 6, 1, 153, 7, \r
+    6, 1, 189, 7, 6, 1, 207, 7, 6, 1, 74, 7, 6, 1, 230, 59, 7, 6, 1, 228, \r
+    163, 7, 6, 1, 152, 7, 6, 1, 198, 7, 6, 1, 222, 201, 7, 6, 1, 68, 7, 6, 1, \r
+    216, 216, 7, 6, 1, 219, 40, 7, 6, 1, 218, 151, 7, 6, 1, 218, 90, 7, 6, 1, \r
+    217, 157, 42, 40, 115, 227, 160, 224, 17, 45, 40, 115, 250, 217, 255, 0, \r
+    109, 235, 43, 244, 37, 255, 0, 7, 3, 1, 60, 7, 3, 1, 253, 204, 7, 3, 1, \r
+    251, 202, 7, 3, 1, 250, 46, 7, 3, 1, 73, 7, 3, 1, 246, 74, 7, 3, 1, 245, \r
+    67, 7, 3, 1, 243, 225, 7, 3, 1, 72, 7, 3, 1, 237, 126, 7, 3, 1, 237, 17, \r
+    7, 3, 1, 153, 7, 3, 1, 189, 7, 3, 1, 207, 7, 3, 1, 74, 7, 3, 1, 230, 59, \r
+    7, 3, 1, 228, 163, 7, 3, 1, 152, 7, 3, 1, 198, 7, 3, 1, 222, 201, 7, 3, \r
+    1, 68, 7, 3, 1, 216, 216, 7, 3, 1, 219, 40, 7, 3, 1, 218, 151, 7, 3, 1, \r
+    218, 90, 7, 3, 1, 217, 157, 42, 250, 79, 115, 69, 235, 43, 45, 250, 79, \r
+    115, 221, 179, 231, 203, 223, 254, 237, 170, 246, 95, 78, 251, 86, 55, \r
+    229, 11, 55, 250, 78, 55, 218, 19, 55, 252, 1, 135, 226, 87, 55, 249, 13, \r
+    250, 126, 55, 245, 215, 230, 103, 237, 211, 235, 112, 51, 254, 120, 228, \r
+    69, 78, 212, 55, 224, 21, 242, 121, 227, 198, 55, 234, 115, 249, 77, 55, \r
+    229, 42, 55, 223, 59, 103, 223, 59, 160, 254, 248, 255, 0, 233, 195, 55, \r
+    229, 73, 55, 233, 193, 248, 145, 251, 92, 223, 59, 107, 234, 58, 230, \r
+    103, 237, 211, 227, 106, 51, 254, 120, 228, 69, 78, 219, 55, 245, 108, \r
+    131, 228, 89, 219, 55, 245, 108, 131, 243, 194, 219, 55, 245, 108, 148, \r
+    228, 87, 237, 170, 228, 82, 78, 7, 6, 1, 112, 2, 244, 36, 7, 6, 1, 112, \r
+    2, 168, 7, 6, 1, 112, 2, 250, 216, 7, 6, 1, 112, 2, 221, 179, 7, 6, 1, \r
+    112, 2, 249, 13, 7, 6, 1, 112, 2, 227, 94, 50, 7, 6, 1, 254, 234, 7, 6, \r
+    1, 251, 203, 2, 251, 92, 7, 6, 1, 178, 2, 244, 36, 7, 6, 1, 178, 2, 168, \r
+    7, 6, 1, 178, 2, 250, 216, 7, 6, 1, 178, 2, 249, 13, 7, 6, 1, 242, 107, \r
+    2, 244, 36, 7, 6, 1, 242, 107, 2, 168, 7, 6, 1, 242, 107, 2, 250, 216, 7, \r
+    6, 1, 242, 107, 2, 249, 13, 7, 6, 1, 246, 118, 7, 6, 1, 233, 34, 2, 221, \r
+    179, 7, 6, 1, 142, 2, 244, 36, 7, 6, 1, 142, 2, 168, 7, 6, 1, 142, 2, \r
+    250, 216, 7, 6, 1, 142, 2, 221, 179, 7, 6, 1, 142, 2, 249, 13, 233, 84, \r
+    55, 7, 6, 1, 142, 2, 92, 7, 6, 1, 105, 2, 244, 36, 7, 6, 1, 105, 2, 168, \r
+    7, 6, 1, 105, 2, 250, 216, 7, 6, 1, 105, 2, 249, 13, 7, 6, 1, 218, 91, 2, \r
+    168, 7, 6, 1, 221, 234, 7, 3, 1, 225, 1, 198, 7, 3, 1, 112, 2, 244, 36, \r
+    7, 3, 1, 112, 2, 168, 7, 3, 1, 112, 2, 250, 216, 7, 3, 1, 112, 2, 221, \r
+    179, 7, 3, 1, 112, 2, 249, 13, 7, 3, 1, 112, 2, 227, 94, 50, 7, 3, 1, \r
+    254, 234, 7, 3, 1, 251, 203, 2, 251, 92, 7, 3, 1, 178, 2, 244, 36, 7, 3, \r
+    1, 178, 2, 168, 7, 3, 1, 178, 2, 250, 216, 7, 3, 1, 178, 2, 249, 13, 7, \r
+    3, 1, 242, 107, 2, 244, 36, 7, 3, 1, 242, 107, 2, 168, 7, 3, 1, 242, 107, \r
+    2, 250, 216, 7, 3, 1, 242, 107, 2, 249, 13, 7, 3, 1, 246, 118, 7, 3, 1, \r
+    233, 34, 2, 221, 179, 7, 3, 1, 142, 2, 244, 36, 7, 3, 1, 142, 2, 168, 7, \r
+    3, 1, 142, 2, 250, 216, 7, 3, 1, 142, 2, 221, 179, 7, 3, 1, 142, 2, 249, \r
+    13, 248, 188, 55, 7, 3, 1, 142, 2, 92, 7, 3, 1, 105, 2, 244, 36, 7, 3, 1, \r
+    105, 2, 168, 7, 3, 1, 105, 2, 250, 216, 7, 3, 1, 105, 2, 249, 13, 7, 3, \r
+    1, 218, 91, 2, 168, 7, 3, 1, 221, 234, 7, 3, 1, 218, 91, 2, 249, 13, 7, \r
+    6, 1, 112, 2, 234, 115, 7, 3, 1, 112, 2, 234, 115, 7, 6, 1, 112, 2, 252, \r
+    8, 7, 3, 1, 112, 2, 252, 8, 7, 6, 1, 112, 2, 230, 162, 7, 3, 1, 112, 2, \r
+    230, 162, 7, 6, 1, 251, 203, 2, 168, 7, 3, 1, 251, 203, 2, 168, 7, 6, 1, \r
+    251, 203, 2, 250, 216, 7, 3, 1, 251, 203, 2, 250, 216, 7, 6, 1, 251, 203, \r
+    2, 61, 50, 7, 3, 1, 251, 203, 2, 61, 50, 7, 6, 1, 251, 203, 2, 251, 130, \r
+    7, 3, 1, 251, 203, 2, 251, 130, 7, 6, 1, 250, 47, 2, 251, 130, 7, 3, 1, \r
+    250, 47, 2, 251, 130, 7, 6, 1, 250, 47, 2, 92, 7, 3, 1, 250, 47, 2, 92, \r
+    7, 6, 1, 178, 2, 234, 115, 7, 3, 1, 178, 2, 234, 115, 7, 6, 1, 178, 2, \r
+    252, 8, 7, 3, 1, 178, 2, 252, 8, 7, 6, 1, 178, 2, 61, 50, 7, 3, 1, 178, \r
+    2, 61, 50, 7, 6, 1, 178, 2, 230, 162, 7, 3, 1, 178, 2, 230, 162, 7, 6, 1, \r
+    178, 2, 251, 130, 7, 3, 1, 178, 2, 251, 130, 7, 6, 1, 245, 68, 2, 250, \r
+    216, 7, 3, 1, 245, 68, 2, 250, 216, 7, 6, 1, 245, 68, 2, 252, 8, 7, 3, 1, \r
+    245, 68, 2, 252, 8, 7, 6, 1, 245, 68, 2, 61, 50, 7, 3, 1, 245, 68, 2, 61, \r
+    50, 7, 6, 1, 245, 68, 2, 251, 92, 7, 3, 1, 245, 68, 2, 251, 92, 7, 6, 1, \r
+    243, 226, 2, 250, 216, 7, 3, 1, 243, 226, 2, 250, 216, 7, 6, 1, 243, 226, \r
+    2, 92, 7, 3, 1, 243, 226, 2, 92, 7, 6, 1, 242, 107, 2, 221, 179, 7, 3, 1, \r
+    242, 107, 2, 221, 179, 7, 6, 1, 242, 107, 2, 234, 115, 7, 3, 1, 242, 107, \r
+    2, 234, 115, 7, 6, 1, 242, 107, 2, 252, 8, 7, 3, 1, 242, 107, 2, 252, 8, \r
+    7, 6, 1, 242, 107, 2, 230, 162, 7, 3, 1, 242, 107, 2, 230, 162, 7, 6, 1, \r
+    242, 107, 2, 61, 50, 7, 3, 1, 248, 144, 72, 7, 6, 24, 237, 253, 7, 3, 24, \r
+    237, 253, 7, 6, 1, 237, 127, 2, 250, 216, 7, 3, 1, 237, 127, 2, 250, 216, \r
+    7, 6, 1, 237, 18, 2, 251, 92, 7, 3, 1, 237, 18, 2, 251, 92, 7, 3, 1, 236, \r
+    17, 7, 6, 1, 235, 202, 2, 168, 7, 3, 1, 235, 202, 2, 168, 7, 6, 1, 235, \r
+    202, 2, 251, 92, 7, 3, 1, 235, 202, 2, 251, 92, 7, 6, 1, 235, 202, 2, \r
+    251, 130, 7, 3, 1, 235, 202, 2, 251, 130, 7, 6, 1, 235, 202, 2, 233, 193, \r
+    248, 145, 7, 3, 1, 235, 202, 2, 233, 193, 248, 145, 7, 6, 1, 235, 202, 2, \r
+    92, 7, 3, 1, 235, 202, 2, 92, 7, 6, 1, 233, 34, 2, 168, 7, 3, 1, 233, 34, \r
+    2, 168, 7, 6, 1, 233, 34, 2, 251, 92, 7, 3, 1, 233, 34, 2, 251, 92, 7, 6, \r
+    1, 233, 34, 2, 251, 130, 7, 3, 1, 233, 34, 2, 251, 130, 7, 3, 1, 233, 34, \r
+    228, 246, 251, 213, 254, 79, 7, 6, 1, 246, 185, 7, 3, 1, 246, 185, 7, 6, \r
+    1, 142, 2, 234, 115, 7, 3, 1, 142, 2, 234, 115, 7, 6, 1, 142, 2, 252, 8, \r
+    7, 3, 1, 142, 2, 252, 8, 7, 6, 1, 142, 2, 51, 168, 7, 3, 1, 142, 2, 51, \r
+    168, 7, 6, 24, 230, 167, 7, 3, 24, 230, 167, 7, 6, 1, 228, 39, 2, 168, 7, \r
+    3, 1, 228, 39, 2, 168, 7, 6, 1, 228, 39, 2, 251, 92, 7, 3, 1, 228, 39, 2, \r
+    251, 92, 7, 6, 1, 228, 39, 2, 251, 130, 7, 3, 1, 228, 39, 2, 251, 130, 7, \r
+    6, 1, 226, 235, 2, 168, 7, 3, 1, 226, 235, 2, 168, 7, 6, 1, 226, 235, 2, \r
+    250, 216, 7, 3, 1, 226, 235, 2, 250, 216, 7, 6, 1, 226, 235, 2, 251, 92, \r
+    7, 3, 1, 226, 235, 2, 251, 92, 7, 6, 1, 226, 235, 2, 251, 130, 7, 3, 1, \r
+    226, 235, 2, 251, 130, 7, 6, 1, 222, 202, 2, 251, 92, 7, 3, 1, 222, 202, \r
+    2, 251, 92, 7, 6, 1, 222, 202, 2, 251, 130, 7, 3, 1, 222, 202, 2, 251, \r
+    130, 7, 6, 1, 222, 202, 2, 92, 7, 3, 1, 222, 202, 2, 92, 7, 6, 1, 105, 2, \r
+    221, 179, 7, 3, 1, 105, 2, 221, 179, 7, 6, 1, 105, 2, 234, 115, 7, 3, 1, \r
+    105, 2, 234, 115, 7, 6, 1, 105, 2, 252, 8, 7, 3, 1, 105, 2, 252, 8, 7, 6, \r
+    1, 105, 2, 227, 94, 50, 7, 3, 1, 105, 2, 227, 94, 50, 7, 6, 1, 105, 2, \r
+    51, 168, 7, 3, 1, 105, 2, 51, 168, 7, 6, 1, 105, 2, 230, 162, 7, 3, 1, \r
+    105, 2, 230, 162, 7, 6, 1, 219, 41, 2, 250, 216, 7, 3, 1, 219, 41, 2, \r
+    250, 216, 7, 6, 1, 218, 91, 2, 250, 216, 7, 3, 1, 218, 91, 2, 250, 216, \r
+    7, 6, 1, 218, 91, 2, 249, 13, 7, 6, 1, 217, 158, 2, 168, 7, 3, 1, 217, \r
+    158, 2, 168, 7, 6, 1, 217, 158, 2, 61, 50, 7, 3, 1, 217, 158, 2, 61, 50, \r
+    7, 6, 1, 217, 158, 2, 251, 130, 7, 3, 1, 217, 158, 2, 251, 130, 7, 3, 1, \r
+    171, 198, 7, 3, 1, 49, 2, 92, 7, 6, 1, 49, 2, 96, 7, 6, 1, 49, 2, 221, \r
+    117, 7, 3, 1, 49, 2, 221, 117, 7, 6, 1, 145, 182, 7, 3, 1, 145, 182, 7, \r
+    6, 1, 230, 119, 74, 7, 6, 1, 251, 203, 2, 96, 7, 3, 1, 251, 203, 2, 96, \r
+    7, 6, 1, 254, 212, 250, 46, 7, 6, 1, 250, 47, 2, 96, 7, 6, 1, 250, 47, 2, \r
+    221, 117, 7, 3, 1, 250, 47, 2, 221, 117, 7, 3, 1, 215, 249, 62, 7, 6, 1, \r
+    210, 73, 7, 6, 1, 226, 104, 7, 6, 1, 230, 119, 73, 7, 6, 1, 246, 75, 2, \r
+    96, 7, 3, 1, 246, 75, 2, 96, 7, 6, 1, 245, 68, 2, 96, 7, 6, 1, 244, 231, \r
+    7, 3, 1, 242, 154, 7, 6, 1, 237, 162, 7, 6, 1, 242, 107, 2, 92, 7, 6, 1, \r
+    237, 18, 2, 96, 7, 3, 1, 237, 18, 2, 96, 7, 3, 1, 235, 202, 2, 135, 7, 3, \r
+    1, 235, 158, 2, 92, 7, 6, 1, 215, 189, 7, 6, 1, 233, 34, 2, 42, 96, 7, 3, \r
+    1, 233, 34, 2, 171, 45, 235, 106, 7, 6, 1, 142, 2, 233, 193, 221, 179, 7, \r
+    6, 1, 142, 2, 242, 189, 7, 3, 1, 142, 2, 242, 189, 7, 6, 1, 230, 158, 7, \r
+    3, 1, 230, 158, 7, 6, 1, 230, 60, 2, 96, 7, 3, 1, 230, 60, 2, 96, 7, 1, \r
+    217, 202, 7, 6, 1, 145, 103, 7, 3, 1, 145, 103, 7, 6, 1, 246, 133, 7, 1, \r
+    210, 246, 134, 234, 247, 7, 3, 1, 222, 202, 2, 230, 29, 96, 7, 6, 1, 222, \r
+    202, 2, 96, 7, 3, 1, 222, 202, 2, 96, 7, 6, 1, 222, 202, 2, 227, 164, 96, \r
+    7, 6, 1, 105, 2, 242, 189, 7, 3, 1, 105, 2, 242, 189, 7, 6, 1, 220, 57, \r
+    7, 6, 1, 220, 11, 2, 96, 7, 6, 1, 218, 91, 2, 96, 7, 3, 1, 218, 91, 2, \r
+    96, 7, 6, 1, 217, 158, 2, 92, 7, 3, 1, 217, 158, 2, 92, 7, 6, 1, 246, 76, \r
+    7, 6, 1, 246, 77, 227, 159, 7, 3, 1, 246, 77, 227, 159, 7, 3, 1, 246, 77, \r
+    2, 222, 135, 7, 1, 124, 2, 92, 7, 6, 1, 145, 174, 7, 3, 1, 145, 174, 7, \r
+    1, 237, 170, 244, 73, 223, 137, 2, 92, 7, 1, 218, 154, 7, 1, 249, 55, \r
+    250, 204, 7, 1, 235, 139, 250, 204, 7, 1, 254, 141, 250, 204, 7, 1, 227, \r
+    164, 250, 204, 7, 6, 1, 247, 76, 2, 251, 130, 7, 6, 1, 250, 47, 2, 3, 1, \r
+    217, 158, 2, 251, 130, 7, 3, 1, 247, 76, 2, 251, 130, 7, 6, 1, 235, 21, \r
+    7, 6, 1, 235, 202, 2, 3, 1, 237, 126, 7, 3, 1, 235, 21, 7, 6, 1, 232, 19, \r
+    7, 6, 1, 233, 34, 2, 3, 1, 237, 126, 7, 3, 1, 232, 19, 7, 6, 1, 112, 2, \r
+    251, 130, 7, 3, 1, 112, 2, 251, 130, 7, 6, 1, 242, 107, 2, 251, 130, 7, \r
+    3, 1, 242, 107, 2, 251, 130, 7, 6, 1, 142, 2, 251, 130, 7, 3, 1, 142, 2, \r
+    251, 130, 7, 6, 1, 105, 2, 251, 130, 7, 3, 1, 105, 2, 251, 130, 7, 6, 1, \r
+    105, 2, 249, 14, 25, 234, 115, 7, 3, 1, 105, 2, 249, 14, 25, 234, 115, 7, \r
+    6, 1, 105, 2, 249, 14, 25, 168, 7, 3, 1, 105, 2, 249, 14, 25, 168, 7, 6, \r
+    1, 105, 2, 249, 14, 25, 251, 130, 7, 3, 1, 105, 2, 249, 14, 25, 251, 130, \r
+    7, 6, 1, 105, 2, 249, 14, 25, 244, 36, 7, 3, 1, 105, 2, 249, 14, 25, 244, \r
+    36, 7, 3, 1, 215, 73, 7, 6, 1, 112, 2, 249, 14, 25, 234, 115, 7, 3, 1, \r
+    112, 2, 249, 14, 25, 234, 115, 7, 6, 1, 112, 2, 61, 71, 25, 234, 115, 7, \r
+    3, 1, 112, 2, 61, 71, 25, 234, 115, 7, 6, 1, 254, 235, 2, 234, 115, 7, 3, \r
+    1, 254, 235, 2, 234, 115, 7, 6, 1, 245, 68, 2, 92, 7, 3, 1, 245, 68, 2, \r
+    92, 7, 6, 1, 245, 68, 2, 251, 130, 7, 3, 1, 245, 68, 2, 251, 130, 7, 6, \r
+    1, 237, 18, 2, 251, 130, 7, 3, 1, 237, 18, 2, 251, 130, 7, 6, 1, 142, 2, \r
+    230, 162, 7, 3, 1, 142, 2, 230, 162, 7, 6, 1, 142, 2, 230, 163, 25, 234, \r
+    115, 7, 3, 1, 142, 2, 230, 163, 25, 234, 115, 7, 6, 1, 246, 77, 2, 251, \r
+    130, 7, 3, 1, 246, 77, 2, 251, 130, 7, 3, 1, 237, 127, 2, 251, 130, 7, 6, \r
+    1, 247, 75, 7, 6, 1, 250, 47, 2, 3, 1, 217, 157, 7, 3, 1, 247, 75, 7, 6, \r
+    1, 245, 68, 2, 168, 7, 3, 1, 245, 68, 2, 168, 7, 6, 1, 242, 152, 7, 6, 1, \r
+    218, 154, 7, 6, 1, 233, 34, 2, 244, 36, 7, 3, 1, 233, 34, 2, 244, 36, 7, \r
+    6, 1, 112, 2, 227, 94, 71, 25, 168, 7, 3, 1, 112, 2, 227, 94, 71, 25, \r
+    168, 7, 6, 1, 254, 235, 2, 168, 7, 3, 1, 254, 235, 2, 168, 7, 6, 1, 142, \r
+    2, 214, 25, 168, 7, 3, 1, 142, 2, 214, 25, 168, 7, 6, 1, 112, 2, 51, 244, \r
+    36, 7, 3, 1, 112, 2, 51, 244, 36, 7, 6, 1, 112, 2, 237, 170, 252, 8, 7, \r
+    3, 1, 112, 2, 237, 170, 252, 8, 7, 6, 1, 178, 2, 51, 244, 36, 7, 3, 1, \r
+    178, 2, 51, 244, 36, 7, 6, 1, 178, 2, 237, 170, 252, 8, 7, 3, 1, 178, 2, \r
+    237, 170, 252, 8, 7, 6, 1, 242, 107, 2, 51, 244, 36, 7, 3, 1, 242, 107, \r
+    2, 51, 244, 36, 7, 6, 1, 242, 107, 2, 237, 170, 252, 8, 7, 3, 1, 242, \r
+    107, 2, 237, 170, 252, 8, 7, 6, 1, 142, 2, 51, 244, 36, 7, 3, 1, 142, 2, \r
+    51, 244, 36, 7, 6, 1, 142, 2, 237, 170, 252, 8, 7, 3, 1, 142, 2, 237, \r
+    170, 252, 8, 7, 6, 1, 228, 39, 2, 51, 244, 36, 7, 3, 1, 228, 39, 2, 51, \r
+    244, 36, 7, 6, 1, 228, 39, 2, 237, 170, 252, 8, 7, 3, 1, 228, 39, 2, 237, \r
+    170, 252, 8, 7, 6, 1, 105, 2, 51, 244, 36, 7, 3, 1, 105, 2, 51, 244, 36, \r
+    7, 6, 1, 105, 2, 237, 170, 252, 8, 7, 3, 1, 105, 2, 237, 170, 252, 8, 7, \r
+    6, 1, 226, 235, 2, 250, 169, 56, 7, 3, 1, 226, 235, 2, 250, 169, 56, 7, \r
+    6, 1, 222, 202, 2, 250, 169, 56, 7, 3, 1, 222, 202, 2, 250, 169, 56, 7, \r
+    6, 1, 217, 218, 7, 3, 1, 217, 218, 7, 6, 1, 243, 226, 2, 251, 130, 7, 3, \r
+    1, 243, 226, 2, 251, 130, 7, 6, 1, 233, 34, 2, 171, 45, 235, 106, 7, 3, \r
+    1, 250, 47, 2, 250, 80, 7, 6, 1, 230, 86, 7, 3, 1, 230, 86, 7, 6, 1, 217, \r
+    158, 2, 96, 7, 3, 1, 217, 158, 2, 96, 7, 6, 1, 112, 2, 61, 50, 7, 3, 1, \r
+    112, 2, 61, 50, 7, 6, 1, 178, 2, 251, 92, 7, 3, 1, 178, 2, 251, 92, 7, 6, \r
+    1, 142, 2, 249, 14, 25, 234, 115, 7, 3, 1, 142, 2, 249, 14, 25, 234, 115, \r
+    7, 6, 1, 142, 2, 221, 180, 25, 234, 115, 7, 3, 1, 142, 2, 221, 180, 25, \r
+    234, 115, 7, 6, 1, 142, 2, 61, 50, 7, 3, 1, 142, 2, 61, 50, 7, 6, 1, 142, \r
+    2, 61, 71, 25, 234, 115, 7, 3, 1, 142, 2, 61, 71, 25, 234, 115, 7, 6, 1, \r
+    218, 91, 2, 234, 115, 7, 3, 1, 218, 91, 2, 234, 115, 7, 3, 1, 235, 202, \r
+    2, 250, 80, 7, 3, 1, 233, 34, 2, 250, 80, 7, 3, 1, 222, 202, 2, 250, 80, \r
+    7, 3, 1, 248, 144, 237, 126, 7, 3, 1, 249, 135, 248, 233, 7, 3, 1, 228, \r
+    99, 248, 233, 7, 6, 1, 112, 2, 92, 7, 6, 1, 251, 203, 2, 92, 7, 3, 1, \r
+    251, 203, 2, 92, 7, 6, 1, 235, 202, 2, 135, 7, 6, 1, 222, 202, 2, 249, \r
+    11, 92, 7, 3, 1, 226, 235, 2, 223, 33, 222, 135, 7, 3, 1, 217, 158, 2, \r
+    223, 33, 222, 135, 7, 6, 1, 244, 73, 223, 136, 7, 3, 1, 244, 73, 223, \r
+    136, 7, 6, 1, 49, 2, 92, 7, 6, 1, 105, 135, 7, 6, 1, 215, 216, 216, 7, 6, \r
+    1, 178, 2, 92, 7, 3, 1, 178, 2, 92, 7, 6, 1, 237, 127, 2, 92, 7, 3, 1, \r
+    237, 127, 2, 92, 7, 6, 1, 3, 228, 164, 2, 242, 247, 222, 135, 7, 3, 1, \r
+    228, 164, 2, 242, 247, 222, 135, 7, 6, 1, 228, 39, 2, 92, 7, 3, 1, 228, \r
+    39, 2, 92, 7, 6, 1, 218, 91, 2, 92, 7, 3, 1, 218, 91, 2, 92, 7, 3, 1, \r
+    215, 60, 7, 3, 1, 254, 146, 7, 3, 1, 215, 254, 146, 7, 3, 1, 49, 2, 96, \r
+    7, 3, 1, 230, 119, 74, 7, 3, 1, 251, 203, 2, 250, 80, 7, 3, 1, 250, 47, \r
+    2, 222, 135, 7, 3, 1, 250, 47, 2, 96, 7, 3, 1, 210, 73, 7, 3, 1, 226, \r
+    104, 7, 3, 1, 226, 105, 2, 96, 7, 3, 1, 230, 119, 73, 7, 3, 1, 210, 230, \r
+    119, 73, 7, 3, 1, 210, 230, 119, 178, 2, 96, 7, 3, 1, 250, 197, 210, 230, \r
+    119, 73, 7, 3, 1, 248, 144, 237, 127, 2, 92, 7, 3, 1, 245, 68, 2, 96, 7, \r
+    3, 1, 102, 245, 67, 7, 1, 3, 6, 245, 67, 7, 3, 1, 244, 231, 7, 3, 1, 227, \r
+    237, 242, 189, 7, 3, 1, 215, 243, 225, 7, 3, 1, 243, 226, 2, 96, 7, 3, 1, \r
+    243, 137, 2, 96, 7, 3, 1, 242, 107, 2, 92, 7, 3, 1, 237, 162, 7, 1, 3, 6, \r
+    72, 7, 3, 1, 235, 202, 2, 233, 193, 221, 179, 7, 3, 1, 235, 202, 2, 252, \r
+    116, 7, 3, 1, 235, 202, 2, 227, 164, 96, 7, 3, 1, 235, 81, 7, 3, 1, 215, \r
+    189, 7, 3, 1, 215, 234, 187, 2, 171, 235, 106, 7, 3, 1, 234, 187, 2, 96, \r
+    7, 3, 1, 233, 34, 2, 42, 96, 7, 3, 1, 233, 34, 2, 227, 164, 96, 7, 1, 3, \r
+    6, 207, 7, 3, 1, 252, 196, 74, 7, 1, 3, 6, 230, 167, 7, 3, 1, 250, 197, \r
+    230, 143, 7, 3, 1, 229, 129, 7, 3, 1, 215, 152, 7, 3, 1, 215, 228, 39, 2, \r
+    171, 235, 106, 7, 3, 1, 215, 228, 39, 2, 96, 7, 3, 1, 228, 39, 2, 171, \r
+    235, 106, 7, 3, 1, 228, 39, 2, 222, 135, 7, 3, 1, 228, 39, 2, 245, 173, \r
+    7, 3, 1, 210, 228, 39, 2, 245, 173, 7, 1, 3, 6, 152, 7, 1, 3, 6, 237, \r
+    170, 152, 7, 3, 1, 226, 235, 2, 96, 7, 3, 1, 246, 133, 7, 3, 1, 248, 144, \r
+    237, 127, 2, 214, 25, 96, 7, 3, 1, 223, 224, 210, 246, 133, 7, 3, 1, 246, \r
+    134, 2, 250, 80, 7, 3, 1, 215, 222, 201, 7, 3, 1, 222, 202, 2, 227, 164, \r
+    96, 7, 3, 1, 105, 135, 7, 3, 1, 220, 57, 7, 3, 1, 220, 11, 2, 96, 7, 3, \r
+    1, 215, 216, 216, 7, 3, 1, 215, 219, 40, 7, 3, 1, 215, 218, 90, 7, 1, 3, \r
+    6, 218, 90, 7, 3, 1, 217, 158, 2, 227, 164, 96, 7, 3, 1, 217, 158, 2, \r
+    250, 80, 7, 3, 1, 246, 76, 7, 3, 1, 246, 77, 2, 250, 80, 7, 1, 244, 73, \r
+    223, 136, 7, 1, 229, 133, 219, 70, 245, 100, 7, 1, 237, 170, 244, 73, \r
+    223, 136, 7, 1, 223, 124, 251, 202, 7, 1, 252, 74, 250, 204, 7, 1, 3, 6, \r
+    253, 204, 7, 3, 1, 250, 197, 230, 119, 73, 7, 1, 3, 6, 245, 68, 2, 96, 7, \r
+    1, 3, 6, 243, 225, 7, 3, 1, 237, 127, 2, 250, 97, 7, 3, 1, 215, 237, 17, \r
+    7, 1, 3, 6, 153, 7, 3, 1, 228, 164, 2, 96, 7, 1, 244, 73, 223, 137, 2, \r
+    92, 7, 1, 210, 244, 73, 223, 137, 2, 92, 7, 3, 1, 247, 76, 248, 233, 7, \r
+    3, 1, 249, 37, 248, 233, 7, 3, 1, 247, 76, 248, 234, 2, 250, 80, 7, 3, 1, \r
+    221, 57, 248, 233, 7, 3, 1, 222, 55, 248, 233, 7, 3, 1, 222, 94, 248, \r
+    234, 2, 250, 80, 7, 3, 1, 245, 213, 248, 233, 7, 3, 1, 234, 233, 248, \r
+    233, 7, 3, 1, 234, 188, 248, 233, 7, 1, 252, 74, 229, 168, 7, 1, 252, 81, \r
+    229, 168, 7, 3, 1, 215, 243, 226, 2, 245, 173, 7, 3, 1, 215, 243, 226, 2, \r
+    245, 174, 25, 222, 135, 58, 1, 3, 243, 225, 58, 1, 3, 243, 226, 2, 96, \r
+    58, 1, 3, 237, 126, 58, 1, 3, 152, 58, 1, 3, 215, 152, 58, 1, 3, 215, \r
+    228, 39, 2, 96, 58, 1, 3, 6, 237, 170, 152, 58, 1, 3, 219, 40, 58, 1, 3, \r
+    218, 90, 58, 1, 228, 235, 58, 1, 51, 228, 235, 58, 1, 215, 250, 168, 58, \r
+    1, 254, 79, 58, 1, 210, 250, 168, 58, 1, 45, 144, 227, 93, 58, 1, 42, \r
+    144, 227, 93, 58, 1, 244, 73, 223, 136, 58, 1, 210, 244, 73, 223, 136, \r
+    58, 1, 42, 254, 20, 58, 1, 45, 254, 20, 58, 1, 108, 254, 20, 58, 1, 113, \r
+    254, 20, 58, 1, 250, 217, 255, 0, 251, 130, 58, 1, 69, 235, 43, 58, 1, \r
+    234, 115, 58, 1, 254, 248, 255, 0, 58, 1, 244, 37, 255, 0, 58, 1, 109, \r
+    69, 235, 43, 58, 1, 109, 234, 115, 58, 1, 109, 244, 37, 255, 0, 58, 1, \r
+    109, 254, 248, 255, 0, 58, 1, 221, 87, 250, 175, 58, 1, 144, 221, 87, \r
+    250, 175, 58, 1, 251, 83, 45, 144, 227, 93, 58, 1, 251, 83, 42, 144, 227, \r
+    93, 58, 1, 108, 222, 143, 58, 1, 113, 222, 143, 58, 1, 88, 55, 58, 1, \r
+    233, 155, 55, 252, 8, 61, 50, 227, 94, 50, 230, 162, 3, 221, 179, 51, \r
+    254, 248, 255, 0, 58, 1, 227, 148, 96, 58, 1, 250, 101, 255, 0, 58, 1, 3, \r
+    244, 231, 58, 1, 3, 153, 58, 1, 3, 198, 58, 1, 3, 218, 151, 58, 1, 3, \r
+    210, 244, 73, 223, 136, 58, 1, 246, 85, 145, 135, 58, 1, 116, 145, 135, \r
+    58, 1, 233, 194, 145, 135, 58, 1, 109, 145, 135, 58, 1, 246, 84, 145, \r
+    135, 58, 1, 217, 241, 249, 52, 145, 78, 58, 1, 218, 46, 249, 52, 145, 78, \r
+    58, 1, 219, 68, 58, 1, 220, 84, 58, 1, 51, 254, 79, 58, 1, 109, 113, 254, \r
+    20, 58, 1, 109, 108, 254, 20, 58, 1, 109, 42, 254, 20, 58, 1, 109, 45, \r
+    254, 20, 58, 1, 109, 227, 93, 58, 1, 233, 193, 244, 37, 255, 0, 58, 1, \r
+    233, 193, 51, 244, 37, 255, 0, 58, 1, 233, 193, 51, 254, 248, 255, 0, 58, \r
+    1, 109, 221, 179, 58, 1, 227, 241, 250, 175, 58, 1, 252, 131, 116, 221, \r
+    132, 58, 1, 246, 190, 116, 221, 132, 58, 1, 252, 131, 109, 221, 132, 58, \r
+    1, 246, 190, 109, 221, 132, 58, 1, 224, 237, 58, 1, 230, 119, 224, 237, \r
+    58, 1, 109, 42, 65, 36, 244, 37, 255, 0, 36, 254, 248, 255, 0, 36, 250, \r
+    217, 255, 0, 36, 221, 179, 36, 234, 115, 36, 230, 73, 36, 252, 8, 36, 61, \r
+    50, 36, 249, 13, 36, 242, 247, 50, 36, 227, 94, 50, 36, 51, 254, 248, \r
+    255, 0, 36, 251, 130, 36, 69, 235, 44, 50, 36, 51, 69, 235, 44, 50, 36, \r
+    51, 244, 37, 255, 0, 36, 251, 146, 36, 237, 170, 252, 8, 36, 215, 250, \r
+    169, 50, 36, 250, 169, 50, 36, 210, 250, 169, 50, 36, 250, 169, 71, 227, \r
+    109, 36, 244, 37, 255, 1, 56, 36, 254, 248, 255, 1, 56, 36, 42, 222, 144, \r
+    56, 36, 45, 222, 144, 56, 36, 42, 254, 120, 50, 36, 242, 189, 36, 42, \r
+    144, 227, 94, 56, 36, 108, 222, 144, 56, 36, 113, 222, 144, 56, 36, 88, \r
+    5, 56, 36, 233, 155, 5, 56, 36, 230, 27, 242, 247, 56, 36, 227, 164, 242, \r
+    247, 56, 36, 61, 56, 36, 249, 14, 56, 36, 227, 94, 56, 36, 250, 169, 56, \r
+    36, 251, 92, 36, 230, 162, 36, 69, 235, 44, 56, 36, 252, 4, 56, 36, 237, \r
+    170, 51, 254, 50, 56, 36, 251, 131, 56, 36, 250, 217, 255, 1, 56, 36, \r
+    252, 9, 56, 36, 237, 170, 252, 9, 56, 36, 221, 180, 56, 36, 234, 116, 56, \r
+    36, 109, 235, 43, 36, 51, 109, 235, 43, 36, 221, 180, 230, 74, 36, 224, \r
+    192, 214, 230, 74, 36, 171, 214, 230, 74, 36, 224, 192, 224, 18, 230, 74, \r
+    36, 171, 224, 18, 230, 74, 36, 45, 144, 227, 94, 56, 36, 237, 170, 252, \r
+    4, 56, 36, 40, 56, 36, 226, 93, 56, 36, 218, 152, 50, 36, 69, 221, 179, \r
+    36, 51, 230, 73, 36, 244, 37, 145, 78, 36, 254, 248, 145, 78, 36, 23, \r
+    229, 163, 36, 23, 236, 33, 36, 23, 249, 8, 221, 123, 36, 23, 217, 207, \r
+    36, 252, 4, 50, 36, 246, 154, 5, 56, 36, 51, 69, 235, 44, 56, 36, 42, \r
+    254, 120, 56, 36, 212, 221, 180, 50, 36, 242, 251, 50, 36, 254, 151, 114, \r
+    199, 50, 36, 42, 45, 76, 56, 36, 220, 53, 76, 56, 36, 244, 41, 237, 54, \r
+    36, 45, 254, 21, 50, 36, 42, 144, 227, 94, 50, 36, 245, 210, 36, 218, \r
+    152, 56, 36, 42, 254, 21, 56, 36, 45, 254, 21, 56, 36, 45, 254, 21, 25, \r
+    108, 254, 21, 56, 36, 45, 144, 227, 94, 50, 36, 61, 71, 227, 109, 36, \r
+    253, 252, 56, 36, 51, 227, 94, 56, 36, 217, 33, 50, 36, 51, 252, 9, 56, \r
+    36, 51, 252, 8, 36, 51, 234, 115, 36, 51, 234, 116, 56, 36, 51, 221, 179, \r
+    36, 51, 237, 170, 252, 8, 36, 51, 90, 76, 56, 36, 7, 3, 1, 60, 36, 7, 3, \r
+    1, 73, 36, 7, 3, 1, 72, 36, 7, 3, 1, 74, 36, 7, 3, 1, 68, 36, 7, 3, 1, \r
+    251, 202, 36, 7, 3, 1, 250, 46, 36, 7, 3, 1, 243, 225, 36, 7, 3, 1, 189, \r
+    36, 7, 3, 1, 152, 36, 7, 3, 1, 222, 201, 36, 7, 3, 1, 216, 216, 36, 7, 3, \r
+    1, 218, 151, 23, 6, 1, 243, 127, 23, 3, 1, 243, 127, 23, 6, 1, 254, 49, \r
+    226, 142, 23, 3, 1, 254, 49, 226, 142, 23, 231, 107, 55, 23, 234, 237, \r
+    231, 107, 55, 23, 6, 1, 230, 15, 248, 240, 23, 3, 1, 230, 15, 248, 240, \r
+    23, 217, 207, 23, 3, 210, 234, 218, 224, 128, 100, 23, 3, 247, 143, 234, \r
+    218, 224, 128, 100, 23, 3, 210, 247, 143, 234, 218, 224, 128, 100, 23, \r
+    228, 82, 78, 23, 221, 123, 23, 249, 8, 221, 123, 23, 6, 1, 254, 147, 2, \r
+    221, 123, 23, 254, 110, 222, 73, 23, 6, 1, 246, 157, 2, 221, 123, 23, 6, \r
+    1, 246, 122, 2, 221, 123, 23, 6, 1, 237, 163, 2, 221, 123, 23, 6, 1, 230, \r
+    142, 2, 221, 123, 23, 6, 1, 220, 58, 2, 221, 123, 23, 6, 1, 230, 144, 2, \r
+    221, 123, 23, 3, 1, 237, 163, 2, 249, 8, 25, 221, 123, 23, 6, 1, 254, \r
+    146, 23, 6, 1, 252, 102, 23, 6, 1, 244, 231, 23, 6, 1, 249, 62, 23, 6, 1, \r
+    246, 156, 23, 6, 1, 217, 83, 23, 6, 1, 246, 121, 23, 6, 1, 222, 6, 23, 6, \r
+    1, 237, 162, 23, 6, 1, 236, 221, 23, 6, 1, 235, 156, 23, 6, 1, 233, 99, \r
+    23, 6, 1, 231, 144, 23, 6, 1, 218, 130, 23, 6, 1, 230, 141, 23, 6, 1, \r
+    229, 108, 23, 6, 1, 227, 149, 23, 6, 1, 224, 127, 23, 6, 1, 222, 105, 23, \r
+    6, 1, 220, 57, 23, 6, 1, 229, 129, 23, 6, 1, 251, 31, 23, 6, 1, 228, 212, \r
+    23, 6, 1, 230, 143, 23, 6, 1, 237, 163, 2, 249, 7, 23, 6, 1, 220, 58, 2, \r
+    249, 7, 23, 3, 1, 254, 147, 2, 221, 123, 23, 3, 1, 246, 157, 2, 221, 123, \r
+    23, 3, 1, 246, 122, 2, 221, 123, 23, 3, 1, 237, 163, 2, 221, 123, 23, 3, \r
+    1, 220, 58, 2, 249, 8, 25, 221, 123, 23, 3, 1, 254, 146, 23, 3, 1, 252, \r
+    102, 23, 3, 1, 244, 231, 23, 3, 1, 249, 62, 23, 3, 1, 246, 156, 23, 3, 1, \r
+    217, 83, 23, 3, 1, 246, 121, 23, 3, 1, 222, 6, 23, 3, 1, 237, 162, 23, 3, \r
+    1, 236, 221, 23, 3, 1, 235, 156, 23, 3, 1, 233, 99, 23, 3, 1, 231, 144, \r
+    23, 3, 1, 218, 130, 23, 3, 1, 230, 141, 23, 3, 1, 229, 108, 23, 3, 1, \r
+    227, 149, 23, 3, 1, 39, 224, 127, 23, 3, 1, 224, 127, 23, 3, 1, 222, 105, \r
+    23, 3, 1, 220, 57, 23, 3, 1, 229, 129, 23, 3, 1, 251, 31, 23, 3, 1, 228, \r
+    212, 23, 3, 1, 230, 143, 23, 3, 1, 237, 163, 2, 249, 7, 23, 3, 1, 220, \r
+    58, 2, 249, 7, 23, 3, 1, 230, 142, 2, 221, 123, 23, 3, 1, 220, 58, 2, \r
+    221, 123, 23, 3, 1, 230, 144, 2, 221, 123, 23, 6, 236, 244, 100, 23, 252, \r
+    103, 100, 23, 222, 7, 100, 23, 220, 58, 2, 242, 247, 100, 23, 220, 58, 2, \r
+    254, 248, 25, 242, 247, 100, 23, 220, 58, 2, 249, 14, 25, 242, 247, 100, \r
+    23, 229, 130, 100, 23, 229, 109, 100, 23, 236, 244, 100, 23, 1, 254, 49, \r
+    236, 37, 23, 3, 1, 254, 49, 236, 37, 23, 1, 223, 144, 23, 3, 1, 223, 144, \r
+    23, 1, 248, 240, 23, 3, 1, 248, 240, 23, 1, 236, 37, 23, 3, 1, 236, 37, \r
+    23, 1, 226, 142, 23, 3, 1, 226, 142, 75, 6, 1, 224, 238, 75, 3, 1, 224, \r
+    238, 75, 6, 1, 245, 219, 75, 3, 1, 245, 219, 75, 6, 1, 236, 135, 75, 3, \r
+    1, 236, 135, 75, 6, 1, 242, 242, 75, 3, 1, 242, 242, 75, 6, 1, 244, 226, \r
+    75, 3, 1, 244, 226, 75, 6, 1, 224, 211, 75, 3, 1, 224, 211, 75, 6, 1, \r
+    249, 75, 75, 3, 1, 249, 75, 23, 236, 222, 100, 23, 227, 150, 100, 23, \r
+    234, 218, 224, 128, 100, 23, 1, 217, 212, 23, 6, 222, 7, 100, 23, 234, \r
+    218, 246, 157, 100, 23, 210, 234, 218, 246, 157, 100, 23, 6, 1, 224, 200, \r
+    23, 3, 1, 224, 200, 23, 6, 234, 218, 224, 128, 100, 23, 6, 1, 226, 140, \r
+    23, 3, 1, 226, 140, 23, 227, 150, 2, 214, 100, 23, 6, 210, 234, 218, 224, \r
+    128, 100, 23, 6, 247, 143, 234, 218, 224, 128, 100, 23, 6, 210, 247, 143, \r
+    234, 218, 224, 128, 100, 31, 6, 1, 238, 27, 2, 244, 36, 31, 6, 1, 237, \r
+    166, 31, 6, 1, 248, 182, 31, 6, 1, 244, 78, 31, 6, 1, 220, 99, 238, 26, \r
+    31, 6, 1, 247, 73, 31, 6, 1, 251, 211, 72, 31, 6, 1, 217, 250, 31, 6, 1, \r
+    237, 114, 31, 6, 1, 235, 20, 31, 6, 1, 232, 15, 31, 6, 1, 221, 46, 31, 6, \r
+    1, 236, 76, 31, 6, 1, 242, 107, 2, 244, 36, 31, 6, 1, 224, 192, 68, 31, \r
+    6, 1, 247, 69, 31, 6, 1, 60, 31, 6, 1, 252, 144, 31, 6, 1, 219, 165, 31, \r
+    6, 1, 244, 116, 31, 6, 1, 249, 92, 31, 6, 1, 238, 26, 31, 6, 1, 217, 72, \r
+    31, 6, 1, 217, 92, 31, 6, 1, 72, 31, 6, 1, 224, 192, 72, 31, 6, 1, 175, \r
+    31, 6, 1, 246, 217, 31, 6, 1, 246, 205, 31, 6, 1, 246, 197, 31, 6, 1, 74, \r
+    31, 6, 1, 229, 198, 31, 6, 1, 246, 148, 31, 6, 1, 246, 138, 31, 6, 1, \r
+    222, 87, 31, 6, 1, 68, 31, 6, 1, 246, 244, 31, 6, 1, 155, 31, 6, 1, 221, \r
+    50, 31, 6, 1, 251, 46, 31, 6, 1, 225, 25, 31, 6, 1, 224, 248, 31, 6, 1, \r
+    243, 181, 55, 31, 6, 1, 218, 7, 31, 6, 1, 224, 21, 55, 31, 6, 1, 73, 31, \r
+    6, 1, 217, 200, 31, 6, 1, 184, 31, 3, 1, 60, 31, 3, 1, 252, 144, 31, 3, \r
+    1, 219, 165, 31, 3, 1, 244, 116, 31, 3, 1, 249, 92, 31, 3, 1, 238, 26, \r
+    31, 3, 1, 217, 72, 31, 3, 1, 217, 92, 31, 3, 1, 72, 31, 3, 1, 224, 192, \r
+    72, 31, 3, 1, 175, 31, 3, 1, 246, 217, 31, 3, 1, 246, 205, 31, 3, 1, 246, \r
+    197, 31, 3, 1, 74, 31, 3, 1, 229, 198, 31, 3, 1, 246, 148, 31, 3, 1, 246, \r
+    138, 31, 3, 1, 222, 87, 31, 3, 1, 68, 31, 3, 1, 246, 244, 31, 3, 1, 155, \r
+    31, 3, 1, 221, 50, 31, 3, 1, 251, 46, 31, 3, 1, 225, 25, 31, 3, 1, 224, \r
+    248, 31, 3, 1, 243, 181, 55, 31, 3, 1, 218, 7, 31, 3, 1, 224, 21, 55, 31, \r
+    3, 1, 73, 31, 3, 1, 217, 200, 31, 3, 1, 184, 31, 3, 1, 238, 27, 2, 244, \r
+    36, 31, 3, 1, 237, 166, 31, 3, 1, 248, 182, 31, 3, 1, 244, 78, 31, 3, 1, \r
+    220, 99, 238, 26, 31, 3, 1, 247, 73, 31, 3, 1, 251, 211, 72, 31, 3, 1, \r
+    217, 250, 31, 3, 1, 237, 114, 31, 3, 1, 235, 20, 31, 3, 1, 232, 15, 31, \r
+    3, 1, 221, 46, 31, 3, 1, 236, 76, 31, 3, 1, 242, 107, 2, 244, 36, 31, 3, \r
+    1, 224, 192, 68, 31, 3, 1, 247, 69, 31, 6, 1, 230, 143, 31, 3, 1, 230, \r
+    143, 31, 6, 1, 218, 36, 31, 3, 1, 218, 36, 31, 6, 1, 237, 160, 73, 31, 3, \r
+    1, 237, 160, 73, 31, 6, 1, 235, 25, 217, 178, 31, 3, 1, 235, 25, 217, \r
+    178, 31, 6, 1, 237, 160, 235, 25, 217, 178, 31, 3, 1, 237, 160, 235, 25, \r
+    217, 178, 31, 6, 1, 252, 76, 217, 178, 31, 3, 1, 252, 76, 217, 178, 31, \r
+    6, 1, 237, 160, 252, 76, 217, 178, 31, 3, 1, 237, 160, 252, 76, 217, 178, \r
+    31, 6, 1, 236, 11, 31, 3, 1, 236, 11, 31, 6, 1, 228, 212, 31, 3, 1, 228, \r
+    212, 31, 6, 1, 245, 171, 31, 3, 1, 245, 171, 31, 6, 1, 237, 128, 31, 3, \r
+    1, 237, 128, 31, 6, 1, 237, 129, 2, 51, 244, 37, 255, 0, 31, 3, 1, 237, \r
+    129, 2, 51, 244, 37, 255, 0, 31, 6, 1, 220, 102, 31, 3, 1, 220, 102, 31, \r
+    6, 1, 227, 57, 230, 143, 31, 3, 1, 227, 57, 230, 143, 31, 6, 1, 230, 144, \r
+    2, 221, 160, 31, 3, 1, 230, 144, 2, 221, 160, 31, 6, 1, 230, 92, 31, 3, \r
+    1, 230, 92, 31, 6, 1, 236, 37, 31, 3, 1, 236, 37, 31, 221, 230, 55, 36, \r
+    31, 221, 160, 36, 31, 230, 28, 36, 31, 193, 229, 39, 36, 31, 209, 229, \r
+    39, 36, 31, 229, 25, 36, 31, 242, 162, 221, 230, 55, 36, 31, 233, 162, \r
+    55, 31, 6, 1, 224, 192, 242, 107, 2, 222, 135, 31, 3, 1, 224, 192, 242, \r
+    107, 2, 222, 135, 31, 6, 1, 225, 63, 55, 31, 3, 1, 225, 63, 55, 31, 6, 1, \r
+    246, 149, 2, 221, 202, 31, 3, 1, 246, 149, 2, 221, 202, 31, 6, 1, 244, \r
+    117, 2, 220, 56, 31, 3, 1, 244, 117, 2, 220, 56, 31, 6, 1, 244, 117, 2, \r
+    92, 31, 3, 1, 244, 117, 2, 92, 31, 6, 1, 244, 117, 2, 233, 193, 96, 31, \r
+    3, 1, 244, 117, 2, 233, 193, 96, 31, 6, 1, 217, 73, 2, 249, 48, 31, 3, 1, \r
+    217, 73, 2, 249, 48, 31, 6, 1, 217, 93, 2, 249, 48, 31, 3, 1, 217, 93, 2, \r
+    249, 48, 31, 6, 1, 206, 2, 249, 48, 31, 3, 1, 206, 2, 249, 48, 31, 6, 1, \r
+    206, 2, 69, 92, 31, 3, 1, 206, 2, 69, 92, 31, 6, 1, 206, 2, 92, 31, 3, 1, \r
+    206, 2, 92, 31, 6, 1, 252, 186, 175, 31, 3, 1, 252, 186, 175, 31, 6, 1, \r
+    246, 198, 2, 249, 48, 31, 3, 1, 246, 198, 2, 249, 48, 31, 6, 24, 246, \r
+    198, 244, 116, 31, 3, 24, 246, 198, 244, 116, 31, 6, 1, 229, 199, 2, 233, \r
+    193, 96, 31, 3, 1, 229, 199, 2, 233, 193, 96, 31, 6, 1, 255, 6, 155, 31, \r
+    3, 1, 255, 6, 155, 31, 6, 1, 246, 139, 2, 249, 48, 31, 3, 1, 246, 139, 2, \r
+    249, 48, 31, 6, 1, 222, 88, 2, 249, 48, 31, 3, 1, 222, 88, 2, 249, 48, \r
+    31, 6, 1, 223, 130, 68, 31, 3, 1, 223, 130, 68, 31, 6, 1, 223, 130, 105, \r
+    2, 92, 31, 3, 1, 223, 130, 105, 2, 92, 31, 6, 1, 243, 214, 2, 249, 48, \r
+    31, 3, 1, 243, 214, 2, 249, 48, 31, 6, 24, 222, 88, 221, 50, 31, 3, 24, \r
+    222, 88, 221, 50, 31, 6, 1, 251, 47, 2, 249, 48, 31, 3, 1, 251, 47, 2, \r
+    249, 48, 31, 6, 1, 251, 47, 2, 69, 92, 31, 3, 1, 251, 47, 2, 69, 92, 31, \r
+    6, 1, 224, 222, 31, 3, 1, 224, 222, 31, 6, 1, 255, 6, 251, 46, 31, 3, 1, \r
+    255, 6, 251, 46, 31, 6, 1, 255, 6, 251, 47, 2, 249, 48, 31, 3, 1, 255, 6, \r
+    251, 47, 2, 249, 48, 31, 1, 230, 22, 31, 6, 1, 217, 73, 2, 252, 8, 31, 3, \r
+    1, 217, 73, 2, 252, 8, 31, 6, 1, 206, 2, 96, 31, 3, 1, 206, 2, 96, 31, 6, \r
+    1, 246, 218, 2, 222, 135, 31, 3, 1, 246, 218, 2, 222, 135, 31, 6, 1, 246, \r
+    198, 2, 96, 31, 3, 1, 246, 198, 2, 96, 31, 6, 1, 246, 198, 2, 222, 135, \r
+    31, 3, 1, 246, 198, 2, 222, 135, 31, 6, 1, 236, 144, 251, 46, 31, 3, 1, \r
+    236, 144, 251, 46, 31, 6, 1, 246, 206, 2, 222, 135, 31, 3, 1, 246, 206, \r
+    2, 222, 135, 31, 3, 1, 230, 22, 31, 6, 1, 112, 2, 252, 8, 31, 3, 1, 112, \r
+    2, 252, 8, 31, 6, 1, 112, 2, 249, 13, 31, 3, 1, 112, 2, 249, 13, 31, 6, \r
+    24, 112, 238, 26, 31, 3, 24, 112, 238, 26, 31, 6, 1, 238, 27, 2, 252, 8, \r
+    31, 3, 1, 238, 27, 2, 252, 8, 31, 6, 1, 226, 104, 31, 3, 1, 226, 104, 31, \r
+    6, 1, 226, 105, 2, 249, 13, 31, 3, 1, 226, 105, 2, 249, 13, 31, 6, 1, \r
+    217, 73, 2, 249, 13, 31, 3, 1, 217, 73, 2, 249, 13, 31, 6, 1, 217, 93, 2, \r
+    249, 13, 31, 3, 1, 217, 93, 2, 249, 13, 31, 6, 1, 255, 6, 247, 73, 31, 3, \r
+    1, 255, 6, 247, 73, 31, 6, 1, 242, 107, 2, 234, 115, 31, 3, 1, 242, 107, \r
+    2, 234, 115, 31, 6, 1, 242, 107, 2, 249, 13, 31, 3, 1, 242, 107, 2, 249, \r
+    13, 31, 6, 1, 142, 2, 249, 13, 31, 3, 1, 142, 2, 249, 13, 31, 6, 1, 252, \r
+    196, 74, 31, 3, 1, 252, 196, 74, 31, 6, 1, 252, 196, 142, 2, 249, 13, 31, \r
+    3, 1, 252, 196, 142, 2, 249, 13, 31, 6, 1, 178, 2, 249, 13, 31, 3, 1, \r
+    178, 2, 249, 13, 31, 6, 1, 105, 2, 234, 115, 31, 3, 1, 105, 2, 234, 115, \r
+    31, 6, 1, 105, 2, 249, 13, 31, 3, 1, 105, 2, 249, 13, 31, 6, 1, 105, 2, \r
+    51, 168, 31, 3, 1, 105, 2, 51, 168, 31, 6, 1, 251, 47, 2, 249, 13, 31, 3, \r
+    1, 251, 47, 2, 249, 13, 31, 6, 1, 244, 117, 2, 249, 48, 31, 3, 1, 244, \r
+    117, 2, 249, 48, 31, 6, 1, 218, 8, 2, 249, 13, 31, 3, 1, 218, 8, 2, 249, \r
+    13, 31, 6, 1, 244, 117, 2, 214, 25, 96, 31, 3, 1, 244, 117, 2, 214, 25, \r
+    96, 31, 6, 1, 243, 214, 2, 96, 31, 3, 1, 243, 214, 2, 96, 31, 6, 1, 243, \r
+    214, 2, 92, 31, 3, 1, 243, 214, 2, 92, 31, 6, 1, 236, 45, 249, 92, 31, 3, \r
+    1, 236, 45, 249, 92, 31, 6, 1, 236, 45, 248, 182, 31, 3, 1, 236, 45, 248, \r
+    182, 31, 6, 1, 236, 45, 217, 25, 31, 3, 1, 236, 45, 217, 25, 31, 6, 1, \r
+    236, 45, 247, 67, 31, 3, 1, 236, 45, 247, 67, 31, 6, 1, 236, 45, 235, 20, \r
+    31, 3, 1, 236, 45, 235, 20, 31, 6, 1, 236, 45, 232, 15, 31, 3, 1, 236, \r
+    45, 232, 15, 31, 6, 1, 236, 45, 224, 67, 31, 3, 1, 236, 45, 224, 67, 31, \r
+    6, 1, 236, 45, 221, 156, 31, 3, 1, 236, 45, 221, 156, 31, 6, 1, 210, 217, \r
+    92, 31, 3, 1, 210, 217, 92, 31, 6, 1, 246, 218, 2, 96, 31, 3, 1, 246, \r
+    218, 2, 96, 31, 6, 1, 235, 79, 31, 3, 1, 235, 79, 31, 6, 1, 227, 151, 31, \r
+    3, 1, 227, 151, 31, 6, 1, 218, 65, 31, 3, 1, 218, 65, 31, 6, 1, 228, 155, \r
+    31, 3, 1, 228, 155, 31, 6, 1, 218, 227, 31, 3, 1, 218, 227, 31, 6, 1, \r
+    254, 165, 175, 31, 3, 1, 254, 165, 175, 31, 6, 1, 246, 218, 2, 233, 193, \r
+    96, 31, 3, 1, 246, 218, 2, 233, 193, 96, 31, 6, 1, 246, 198, 2, 233, 193, \r
+    96, 31, 3, 1, 246, 198, 2, 233, 193, 96, 31, 6, 1, 229, 199, 2, 249, 48, \r
+    31, 3, 1, 229, 199, 2, 249, 48, 132, 6, 1, 253, 209, 132, 6, 1, 252, 114, \r
+    132, 6, 1, 244, 93, 132, 6, 1, 249, 207, 132, 6, 1, 246, 254, 132, 6, 1, \r
+    217, 114, 132, 6, 1, 246, 239, 132, 6, 1, 246, 123, 132, 6, 1, 101, 132, \r
+    6, 1, 217, 72, 132, 6, 1, 237, 200, 132, 6, 1, 235, 23, 132, 6, 1, 218, \r
+    133, 132, 6, 1, 251, 169, 132, 6, 1, 236, 168, 132, 6, 1, 243, 4, 132, 6, \r
+    1, 237, 123, 132, 6, 1, 244, 124, 132, 6, 1, 251, 42, 132, 6, 1, 233, \r
+    251, 132, 6, 1, 217, 250, 132, 6, 1, 231, 174, 132, 6, 1, 225, 25, 132, \r
+    6, 1, 219, 72, 132, 6, 1, 251, 69, 132, 6, 1, 229, 187, 132, 6, 1, 237, \r
+    100, 132, 6, 1, 203, 132, 6, 1, 226, 77, 132, 6, 1, 219, 96, 132, 6, 1, \r
+    221, 158, 132, 6, 1, 227, 196, 132, 6, 1, 250, 182, 132, 6, 1, 217, 236, \r
+    132, 6, 1, 229, 61, 132, 6, 1, 236, 178, 132, 6, 1, 230, 161, 132, 6, 1, \r
+    245, 221, 132, 58, 1, 42, 144, 227, 93, 132, 254, 79, 132, 246, 201, 78, \r
+    132, 246, 95, 78, 132, 250, 168, 132, 228, 82, 78, 132, 255, 7, 78, 132, \r
+    3, 1, 253, 209, 132, 3, 1, 252, 114, 132, 3, 1, 244, 93, 132, 3, 1, 249, \r
+    207, 132, 3, 1, 246, 254, 132, 3, 1, 217, 114, 132, 3, 1, 246, 239, 132, \r
+    3, 1, 246, 123, 132, 3, 1, 101, 132, 3, 1, 217, 72, 132, 3, 1, 237, 200, \r
+    132, 3, 1, 235, 23, 132, 3, 1, 218, 133, 132, 3, 1, 251, 169, 132, 3, 1, \r
+    236, 168, 132, 3, 1, 243, 4, 132, 3, 1, 237, 123, 132, 3, 1, 244, 124, \r
+    132, 3, 1, 251, 42, 132, 3, 1, 233, 251, 132, 3, 1, 217, 250, 132, 3, 1, \r
+    231, 174, 132, 3, 1, 225, 25, 132, 3, 1, 219, 72, 132, 3, 1, 251, 69, \r
+    132, 3, 1, 229, 187, 132, 3, 1, 237, 100, 132, 3, 1, 203, 132, 3, 1, 226, \r
+    77, 132, 3, 1, 219, 96, 132, 3, 1, 221, 158, 132, 3, 1, 227, 196, 132, 3, \r
+    1, 250, 182, 132, 3, 1, 217, 236, 132, 3, 1, 229, 61, 132, 3, 1, 236, \r
+    178, 132, 3, 1, 230, 161, 132, 3, 1, 245, 221, 132, 3, 24, 246, 255, 217, \r
+    236, 132, 245, 90, 223, 136, 132, 242, 121, 87, 255, 1, 246, 116, 87, \r
+    255, 1, 226, 78, 87, 255, 1, 225, 12, 87, 255, 1, 217, 102, 228, 138, 87, \r
+    255, 1, 217, 102, 244, 246, 87, 255, 1, 221, 168, 87, 255, 1, 227, 158, \r
+    87, 255, 1, 217, 101, 87, 255, 1, 229, 219, 87, 255, 1, 218, 0, 87, 255, \r
+    1, 222, 41, 87, 255, 1, 244, 171, 87, 255, 1, 244, 172, 233, 70, 87, 255, \r
+    1, 244, 169, 87, 255, 1, 228, 139, 229, 242, 87, 255, 1, 222, 70, 244, \r
+    185, 87, 255, 1, 229, 202, 87, 255, 1, 253, 239, 243, 206, 87, 255, 1, \r
+    233, 79, 87, 255, 1, 234, 104, 87, 255, 1, 233, 245, 87, 255, 1, 233, \r
+    246, 236, 179, 87, 255, 1, 249, 153, 87, 255, 1, 228, 150, 87, 255, 1, \r
+    222, 70, 228, 134, 87, 255, 1, 218, 10, 252, 115, 217, 217, 87, 255, 1, \r
+    230, 149, 87, 255, 1, 237, 241, 87, 255, 1, 249, 76, 87, 255, 1, 217, 31, \r
+    87, 164, 234, 54, 250, 221, 87, 229, 32, 224, 224, 87, 229, 32, 243, 172, \r
+    226, 78, 87, 229, 32, 243, 172, 229, 214, 87, 229, 32, 243, 172, 228, \r
+    143, 87, 229, 32, 243, 94, 87, 229, 32, 221, 48, 87, 229, 32, 226, 78, \r
+    87, 229, 32, 229, 214, 87, 229, 32, 228, 143, 87, 229, 32, 242, 254, 87, \r
+    229, 32, 242, 255, 243, 174, 35, 219, 169, 87, 229, 32, 228, 85, 87, 229, \r
+    32, 249, 194, 156, 234, 77, 87, 229, 32, 233, 237, 87, 228, 197, 234, 76, \r
+    87, 229, 32, 227, 248, 87, 228, 197, 229, 220, 87, 229, 32, 224, 210, \r
+    248, 145, 87, 229, 32, 224, 113, 248, 145, 87, 228, 197, 224, 22, 229, \r
+    216, 87, 164, 220, 60, 248, 145, 87, 164, 234, 237, 248, 145, 87, 228, \r
+    197, 231, 104, 243, 205, 87, 229, 32, 228, 144, 228, 138, 87, 1, 254, \r
+    168, 87, 1, 252, 104, 87, 1, 244, 91, 87, 1, 249, 177, 87, 1, 243, 162, \r
+    87, 1, 219, 169, 87, 1, 217, 95, 87, 1, 243, 128, 87, 1, 222, 50, 87, 1, \r
+    217, 220, 87, 1, 39, 236, 246, 87, 1, 236, 246, 87, 1, 235, 152, 87, 1, \r
+    39, 234, 1, 87, 1, 234, 1, 87, 1, 39, 231, 103, 87, 1, 231, 103, 87, 1, \r
+    226, 145, 87, 1, 253, 207, 87, 1, 39, 229, 198, 87, 1, 229, 198, 87, 1, \r
+    39, 221, 51, 87, 1, 221, 51, 87, 1, 228, 107, 87, 1, 227, 174, 87, 1, \r
+    224, 209, 87, 1, 222, 102, 87, 24, 217, 248, 51, 219, 169, 87, 24, 217, \r
+    248, 219, 170, 217, 220, 87, 24, 217, 248, 51, 217, 220, 87, 228, 197, \r
+    244, 171, 87, 228, 197, 244, 169, 12, 54, 55, 12, 5, 226, 139, 12, 245, \r
+    132, 234, 63, 12, 5, 226, 167, 254, 63, 250, 89, 227, 64, 254, 63, 245, \r
+    110, 227, 64, 12, 227, 222, 254, 63, 229, 170, 233, 164, 55, 254, 63, \r
+    229, 170, 222, 66, 221, 232, 55, 254, 214, 55, 12, 250, 168, 12, 249, \r
+    141, 225, 54, 12, 229, 34, 219, 154, 55, 12, 5, 233, 147, 12, 5, 226, \r
+    152, 254, 170, 218, 245, 12, 5, 254, 170, 254, 0, 12, 5, 227, 247, 254, \r
+    169, 12, 5, 227, 251, 254, 155, 254, 116, 12, 5, 222, 128, 12, 3, 116, \r
+    222, 137, 12, 3, 116, 24, 99, 2, 235, 161, 2, 218, 21, 12, 3, 116, 217, \r
+    106, 12, 3, 245, 238, 12, 3, 249, 172, 12, 3, 236, 206, 12, 225, 67, 12, \r
+    221, 78, 61, 228, 197, 78, 12, 228, 82, 78, 12, 1, 243, 192, 12, 1, 99, \r
+    2, 234, 111, 50, 12, 1, 99, 2, 181, 50, 12, 1, 218, 234, 2, 181, 50, 12, \r
+    1, 99, 2, 181, 56, 12, 1, 70, 2, 181, 50, 12, 1, 254, 168, 12, 1, 252, \r
+    128, 12, 1, 222, 78, 234, 72, 12, 1, 222, 77, 12, 1, 222, 19, 12, 1, 237, \r
+    112, 12, 1, 243, 202, 12, 1, 236, 146, 12, 1, 249, 183, 12, 1, 222, 29, \r
+    12, 1, 227, 196, 12, 1, 217, 106, 12, 1, 226, 82, 12, 1, 224, 242, 12, 1, \r
+    226, 170, 12, 1, 249, 202, 12, 1, 222, 137, 12, 1, 217, 109, 12, 1, 254, \r
+    191, 12, 1, 244, 122, 12, 1, 236, 177, 2, 124, 188, 50, 12, 1, 236, 177, \r
+    2, 148, 188, 56, 12, 1, 245, 241, 70, 2, 237, 170, 216, 216, 12, 1, 245, \r
+    241, 70, 2, 124, 188, 50, 12, 1, 245, 241, 70, 2, 148, 188, 50, 12, 222, \r
+    107, 12, 1, 245, 221, 12, 1, 228, 148, 12, 1, 236, 246, 12, 1, 235, 160, \r
+    12, 1, 234, 14, 12, 1, 231, 193, 12, 1, 243, 146, 12, 1, 218, 233, 12, 1, \r
+    99, 234, 92, 12, 1, 218, 21, 12, 245, 236, 12, 249, 170, 12, 236, 204, \r
+    12, 245, 238, 12, 249, 172, 12, 236, 206, 12, 225, 16, 12, 223, 75, 12, \r
+    234, 109, 50, 12, 181, 50, 12, 181, 56, 12, 223, 94, 254, 168, 12, 237, \r
+    170, 249, 172, 12, 164, 231, 194, 244, 107, 12, 216, 255, 12, 29, 5, 3, \r
+    220, 11, 50, 12, 29, 5, 237, 170, 3, 220, 11, 50, 12, 29, 5, 61, 56, 12, \r
+    210, 249, 172, 12, 245, 239, 2, 124, 248, 143, 254, 63, 20, 217, 84, 254, \r
+    63, 20, 107, 254, 63, 20, 103, 254, 63, 20, 160, 254, 63, 20, 154, 254, \r
+    63, 20, 174, 254, 63, 20, 182, 254, 63, 20, 191, 254, 63, 20, 185, 254, \r
+    63, 20, 190, 12, 229, 169, 55, 12, 249, 86, 225, 54, 12, 221, 230, 225, \r
+    54, 12, 245, 170, 229, 30, 223, 156, 12, 1, 248, 144, 252, 128, 12, 1, \r
+    248, 144, 228, 148, 12, 1, 223, 59, 254, 168, 12, 1, 99, 218, 246, 12, 1, \r
+    99, 2, 218, 235, 181, 50, 12, 1, 99, 2, 218, 235, 181, 56, 12, 1, 116, \r
+    243, 192, 12, 1, 116, 181, 254, 168, 12, 1, 116, 181, 218, 233, 12, 1, \r
+    105, 2, 181, 50, 12, 1, 116, 181, 218, 21, 12, 1, 221, 23, 12, 1, 221, \r
+    21, 12, 1, 252, 135, 12, 1, 222, 78, 2, 227, 93, 12, 1, 222, 78, 2, 148, \r
+    188, 71, 247, 129, 12, 1, 229, 187, 12, 1, 222, 75, 12, 1, 252, 126, 12, \r
+    1, 111, 2, 181, 50, 12, 1, 111, 2, 124, 188, 69, 50, 12, 1, 231, 70, 12, \r
+    1, 247, 79, 12, 1, 111, 2, 148, 188, 50, 12, 1, 222, 91, 12, 1, 222, 89, \r
+    12, 1, 249, 127, 12, 1, 249, 184, 2, 227, 93, 12, 1, 249, 184, 2, 61, 56, \r
+    12, 1, 249, 184, 2, 61, 252, 118, 25, 3, 222, 137, 12, 1, 249, 189, 12, \r
+    1, 249, 129, 12, 1, 247, 103, 12, 1, 249, 184, 2, 148, 188, 71, 247, 129, \r
+    12, 1, 249, 184, 2, 245, 116, 188, 50, 12, 1, 227, 48, 12, 1, 227, 197, \r
+    2, 3, 216, 216, 12, 1, 227, 197, 2, 227, 93, 12, 1, 227, 197, 2, 61, 56, \r
+    12, 1, 227, 197, 2, 3, 220, 11, 56, 12, 1, 227, 197, 2, 61, 252, 118, 25, \r
+    61, 50, 12, 1, 227, 197, 2, 124, 188, 50, 12, 1, 237, 109, 12, 1, 227, \r
+    197, 2, 245, 116, 188, 50, 12, 1, 226, 83, 2, 61, 252, 118, 25, 61, 50, \r
+    12, 1, 226, 83, 2, 148, 188, 56, 12, 1, 226, 83, 2, 148, 188, 252, 118, \r
+    25, 148, 188, 50, 12, 1, 226, 171, 2, 124, 188, 56, 12, 1, 226, 171, 2, \r
+    148, 188, 50, 12, 1, 222, 138, 2, 148, 188, 50, 12, 1, 254, 192, 2, 148, \r
+    188, 50, 12, 1, 248, 144, 245, 221, 12, 1, 245, 222, 2, 61, 233, 104, 56, \r
+    12, 1, 245, 222, 2, 61, 56, 12, 1, 219, 158, 12, 1, 245, 222, 2, 148, \r
+    188, 56, 12, 1, 229, 185, 12, 1, 228, 149, 2, 61, 50, 12, 1, 228, 149, 2, \r
+    148, 188, 50, 12, 1, 236, 176, 12, 1, 223, 33, 236, 246, 12, 1, 236, 247, \r
+    2, 227, 93, 12, 1, 236, 247, 2, 61, 50, 12, 1, 232, 117, 12, 1, 236, 247, \r
+    2, 148, 188, 56, 12, 1, 244, 243, 12, 1, 244, 244, 2, 227, 93, 12, 1, \r
+    232, 82, 12, 1, 244, 244, 2, 124, 188, 56, 12, 1, 244, 9, 12, 1, 244, \r
+    244, 2, 148, 188, 50, 12, 1, 235, 161, 2, 3, 216, 216, 12, 1, 235, 161, \r
+    2, 61, 50, 12, 1, 235, 161, 2, 148, 188, 50, 12, 1, 235, 161, 2, 148, \r
+    188, 56, 12, 1, 231, 194, 2, 61, 56, 12, 1, 231, 194, 244, 107, 12, 1, \r
+    227, 78, 12, 1, 231, 194, 2, 227, 93, 12, 1, 231, 194, 2, 148, 188, 50, \r
+    12, 1, 243, 147, 248, 163, 12, 1, 222, 92, 2, 61, 50, 12, 1, 243, 147, 2, \r
+    70, 50, 12, 1, 243, 147, 244, 65, 12, 1, 243, 147, 244, 66, 2, 181, 50, \r
+    12, 1, 222, 78, 234, 73, 244, 65, 12, 1, 218, 234, 2, 227, 93, 12, 1, \r
+    236, 98, 230, 167, 12, 1, 230, 167, 12, 1, 68, 12, 1, 217, 200, 12, 1, \r
+    236, 98, 217, 200, 12, 1, 218, 234, 2, 124, 188, 50, 12, 1, 219, 165, 12, \r
+    1, 245, 241, 218, 21, 12, 1, 70, 2, 222, 135, 12, 1, 70, 2, 3, 216, 216, \r
+    12, 1, 218, 234, 2, 61, 50, 12, 1, 73, 12, 1, 70, 2, 148, 188, 56, 12, 1, \r
+    70, 252, 194, 12, 1, 70, 252, 195, 2, 181, 50, 12, 245, 90, 223, 136, 12, \r
+    1, 254, 234, 12, 3, 116, 24, 226, 171, 2, 235, 161, 2, 99, 234, 92, 12, \r
+    3, 116, 24, 228, 149, 2, 235, 161, 2, 99, 234, 92, 12, 3, 116, 62, 66, \r
+    17, 12, 3, 116, 235, 161, 254, 168, 12, 3, 116, 237, 112, 12, 3, 116, \r
+    148, 248, 143, 12, 3, 116, 226, 82, 12, 246, 190, 117, 253, 211, 12, 223, \r
+    154, 117, 227, 20, 246, 218, 243, 91, 12, 3, 116, 227, 55, 217, 84, 12, \r
+    3, 116, 220, 59, 227, 207, 217, 84, 12, 3, 116, 248, 144, 243, 160, 117, \r
+    236, 146, 12, 3, 116, 62, 47, 17, 12, 3, 109, 226, 82, 12, 3, 116, 234, \r
+    110, 12, 3, 218, 233, 12, 3, 218, 21, 12, 3, 116, 218, 21, 12, 3, 116, \r
+    231, 193, 12, 229, 57, 117, 226, 159, 12, 246, 199, 251, 85, 109, 223, \r
+    136, 12, 246, 199, 251, 85, 116, 223, 136, 12, 227, 55, 116, 223, 137, 2, \r
+    245, 186, 251, 84, 12, 3, 109, 234, 14, 12, 1, 249, 184, 2, 237, 170, \r
+    216, 216, 12, 1, 227, 197, 2, 237, 170, 216, 216, 246, 87, 254, 63, 20, \r
+    217, 84, 246, 87, 254, 63, 20, 107, 246, 87, 254, 63, 20, 103, 246, 87, \r
+    254, 63, 20, 160, 246, 87, 254, 63, 20, 154, 246, 87, 254, 63, 20, 174, \r
+    246, 87, 254, 63, 20, 182, 246, 87, 254, 63, 20, 191, 246, 87, 254, 63, \r
+    20, 185, 246, 87, 254, 63, 20, 190, 12, 1, 224, 243, 2, 61, 56, 12, 1, \r
+    249, 203, 2, 61, 56, 12, 1, 244, 123, 2, 61, 56, 12, 5, 224, 112, 254, \r
+    134, 12, 5, 224, 112, 229, 13, 233, 251, 12, 1, 243, 147, 2, 237, 170, \r
+    216, 216, 166, 246, 190, 117, 229, 240, 166, 223, 55, 245, 90, 223, 136, \r
+    166, 223, 96, 245, 90, 223, 136, 166, 223, 55, 250, 175, 166, 223, 96, \r
+    250, 175, 166, 186, 250, 175, 166, 250, 176, 224, 64, 235, 115, 166, 250, \r
+    176, 224, 64, 227, 109, 166, 223, 55, 250, 176, 224, 64, 235, 115, 166, \r
+    223, 96, 250, 176, 224, 64, 227, 109, 166, 250, 134, 166, 243, 179, 230, \r
+    179, 166, 243, 179, 233, 236, 166, 243, 179, 253, 253, 166, 255, 7, 78, \r
+    166, 1, 254, 171, 166, 1, 223, 59, 254, 171, 166, 1, 252, 101, 166, 1, \r
+    244, 235, 166, 1, 244, 236, 244, 216, 166, 1, 249, 180, 166, 1, 248, 144, \r
+    249, 181, 227, 89, 166, 1, 243, 162, 166, 1, 218, 233, 166, 1, 217, 106, \r
+    166, 1, 243, 126, 166, 1, 222, 46, 166, 1, 222, 47, 244, 216, 166, 1, \r
+    217, 188, 166, 1, 217, 189, 243, 162, 166, 1, 236, 224, 166, 1, 235, 159, \r
+    166, 1, 233, 161, 166, 1, 231, 103, 166, 1, 225, 60, 166, 1, 39, 225, 60, \r
+    166, 1, 73, 166, 1, 229, 198, 166, 1, 210, 229, 198, 166, 1, 226, 168, \r
+    166, 1, 228, 142, 166, 1, 227, 89, 166, 1, 224, 209, 166, 1, 222, 100, \r
+    166, 1, 229, 159, 252, 90, 166, 1, 229, 159, 244, 120, 166, 1, 229, 159, \r
+    249, 32, 166, 228, 203, 50, 166, 228, 203, 56, 166, 228, 203, 247, 142, \r
+    166, 217, 15, 50, 166, 217, 15, 56, 166, 217, 15, 247, 142, 166, 227, \r
+    219, 50, 166, 227, 219, 56, 166, 247, 143, 217, 22, 242, 241, 166, 247, \r
+    143, 217, 22, 254, 117, 166, 243, 165, 50, 166, 243, 165, 56, 166, 243, \r
+    164, 247, 142, 166, 246, 136, 50, 166, 246, 136, 56, 166, 226, 250, 166, \r
+    245, 215, 248, 145, 166, 228, 63, 166, 227, 17, 166, 124, 69, 188, 50, \r
+    166, 124, 69, 188, 56, 166, 148, 188, 50, 166, 148, 188, 56, 166, 230, \r
+    177, 235, 44, 50, 166, 230, 177, 235, 44, 56, 166, 233, 58, 166, 252, \r
+    193, 166, 1, 224, 19, 217, 78, 166, 1, 224, 19, 236, 139, 166, 1, 224, \r
+    19, 245, 231, 12, 1, 252, 129, 2, 148, 188, 242, 191, 56, 12, 1, 252, \r
+    129, 2, 61, 252, 118, 25, 148, 188, 50, 12, 1, 252, 129, 2, 148, 188, \r
+    229, 28, 220, 53, 56, 12, 1, 252, 129, 2, 148, 188, 229, 28, 220, 53, \r
+    252, 118, 25, 124, 188, 50, 12, 1, 252, 129, 2, 124, 188, 252, 118, 25, \r
+    61, 50, 12, 1, 252, 129, 2, 237, 170, 3, 220, 11, 56, 12, 1, 252, 129, 2, \r
+    3, 216, 216, 12, 1, 111, 2, 124, 188, 50, 12, 1, 111, 2, 148, 188, 229, \r
+    28, 220, 53, 56, 12, 1, 249, 184, 2, 124, 188, 219, 102, 252, 118, 25, 3, \r
+    222, 137, 12, 1, 249, 184, 2, 237, 170, 3, 220, 11, 56, 12, 1, 227, 197, \r
+    2, 92, 12, 1, 226, 83, 2, 245, 116, 188, 50, 12, 1, 254, 192, 2, 124, \r
+    188, 50, 12, 1, 254, 192, 2, 148, 188, 229, 28, 247, 130, 50, 12, 1, 254, \r
+    192, 2, 124, 188, 219, 102, 50, 12, 1, 245, 222, 2, 124, 188, 56, 12, 1, \r
+    245, 222, 2, 148, 188, 229, 28, 220, 53, 56, 12, 1, 236, 177, 2, 61, 50, \r
+    12, 1, 236, 177, 2, 148, 188, 50, 12, 1, 236, 177, 2, 148, 188, 229, 28, \r
+    220, 53, 56, 12, 1, 62, 2, 61, 50, 12, 1, 62, 2, 61, 56, 12, 1, 231, 194, \r
+    2, 124, 188, 56, 12, 1, 231, 194, 2, 3, 222, 137, 12, 1, 231, 194, 2, 3, \r
+    216, 216, 12, 1, 235, 161, 2, 135, 12, 1, 227, 197, 2, 124, 188, 219, \r
+    102, 50, 12, 1, 227, 197, 2, 181, 50, 12, 1, 226, 83, 2, 124, 188, 219, \r
+    102, 50, 12, 1, 111, 2, 3, 12, 1, 222, 138, 56, 12, 1, 111, 2, 3, 12, 1, \r
+    222, 138, 25, 124, 248, 143, 12, 1, 226, 83, 2, 3, 12, 1, 222, 138, 25, \r
+    124, 248, 143, 12, 1, 227, 197, 2, 3, 12, 1, 222, 138, 25, 124, 248, 143, \r
+    12, 1, 111, 2, 3, 12, 1, 222, 138, 50, 12, 1, 99, 2, 246, 87, 254, 63, \r
+    20, 124, 50, 12, 1, 99, 2, 246, 87, 254, 63, 20, 148, 50, 12, 1, 245, \r
+    241, 70, 2, 246, 87, 254, 63, 20, 124, 50, 12, 1, 245, 241, 70, 2, 246, \r
+    87, 254, 63, 20, 148, 50, 12, 1, 245, 241, 70, 2, 246, 87, 254, 63, 20, \r
+    245, 116, 56, 12, 1, 218, 234, 2, 246, 87, 254, 63, 20, 124, 50, 12, 1, \r
+    218, 234, 2, 246, 87, 254, 63, 20, 148, 50, 12, 1, 70, 252, 195, 2, 246, \r
+    87, 254, 63, 20, 124, 50, 12, 1, 70, 252, 195, 2, 246, 87, 254, 63, 20, \r
+    148, 50, 12, 1, 111, 2, 246, 87, 254, 63, 20, 245, 116, 56, 12, 1, 226, \r
+    83, 2, 246, 87, 254, 63, 20, 245, 116, 50, 12, 1, 226, 83, 2, 237, 170, \r
+    216, 216, 12, 1, 236, 247, 2, 124, 188, 50, 222, 32, 1, 243, 211, 222, \r
+    32, 1, 224, 251, 222, 32, 1, 231, 192, 222, 32, 1, 228, 0, 222, 32, 1, \r
+    252, 236, 222, 32, 1, 235, 76, 222, 32, 1, 237, 3, 222, 32, 1, 254, 160, \r
+    222, 32, 1, 219, 187, 222, 32, 1, 234, 13, 222, 32, 1, 246, 6, 222, 32, \r
+    1, 249, 35, 222, 32, 1, 222, 34, 222, 32, 1, 235, 185, 222, 32, 1, 244, \r
+    252, 222, 32, 1, 244, 71, 222, 32, 1, 226, 81, 222, 32, 1, 249, 139, 222, \r
+    32, 1, 217, 98, 222, 32, 1, 222, 101, 222, 32, 1, 218, 76, 222, 32, 1, \r
+    229, 209, 222, 32, 1, 237, 116, 222, 32, 1, 251, 49, 222, 32, 1, 221, 28, \r
+    222, 32, 1, 243, 120, 222, 32, 1, 236, 148, 222, 32, 1, 222, 33, 222, 32, \r
+    1, 217, 113, 222, 32, 1, 224, 241, 222, 32, 1, 226, 174, 222, 32, 1, 249, \r
+    205, 222, 32, 1, 101, 222, 32, 1, 217, 21, 222, 32, 1, 254, 189, 222, 32, \r
+    1, 244, 121, 222, 32, 1, 228, 152, 222, 32, 1, 219, 5, 222, 32, 255, 8, \r
+    222, 32, 255, 23, 222, 32, 242, 68, 222, 32, 246, 249, 222, 32, 220, 118, \r
+    222, 32, 230, 126, 222, 32, 247, 1, 222, 32, 246, 82, 222, 32, 230, 176, \r
+    222, 32, 230, 184, 222, 32, 223, 75, 222, 32, 1, 232, 235, 231, 242, 20, \r
+    217, 84, 231, 242, 20, 107, 231, 242, 20, 103, 231, 242, 20, 160, 231, \r
+    242, 20, 154, 231, 242, 20, 174, 231, 242, 20, 182, 231, 242, 20, 191, \r
+    231, 242, 20, 185, 231, 242, 20, 190, 231, 242, 1, 60, 231, 242, 1, 246, \r
+    250, 231, 242, 1, 72, 231, 242, 1, 73, 231, 242, 1, 68, 231, 242, 1, 230, \r
+    127, 231, 242, 1, 74, 231, 242, 1, 249, 195, 231, 242, 1, 207, 231, 242, \r
+    1, 252, 237, 231, 242, 1, 187, 231, 242, 1, 222, 155, 231, 242, 1, 237, \r
+    123, 231, 242, 1, 251, 69, 231, 242, 1, 249, 207, 231, 242, 1, 203, 231, \r
+    242, 1, 227, 52, 231, 242, 1, 226, 177, 231, 242, 1, 244, 204, 231, 242, \r
+    1, 246, 8, 231, 242, 1, 175, 231, 242, 1, 235, 188, 231, 242, 1, 232, \r
+    238, 218, 184, 231, 242, 1, 196, 231, 242, 1, 231, 77, 231, 242, 1, 208, \r
+    231, 242, 1, 155, 231, 242, 1, 219, 7, 231, 242, 1, 184, 231, 242, 1, \r
+    231, 78, 218, 184, 231, 242, 1, 237, 52, 237, 123, 231, 242, 1, 237, 52, \r
+    251, 69, 231, 242, 1, 237, 52, 203, 231, 242, 36, 224, 192, 116, 221, \r
+    132, 231, 242, 36, 224, 192, 109, 221, 132, 231, 242, 36, 224, 192, 227, \r
+    88, 221, 132, 231, 242, 36, 171, 249, 47, 221, 132, 231, 242, 36, 171, \r
+    116, 221, 132, 231, 242, 36, 171, 109, 221, 132, 231, 242, 36, 171, 227, \r
+    88, 221, 132, 231, 242, 36, 232, 209, 78, 231, 242, 36, 51, 61, 50, 231, \r
+    242, 116, 145, 254, 79, 231, 242, 109, 145, 254, 79, 231, 242, 16, 230, \r
+    128, 249, 58, 231, 242, 16, 244, 203, 231, 242, 250, 168, 231, 242, 246, \r
+    95, 78, 231, 242, 235, 166, 213, 1, 254, 173, 213, 1, 252, 60, 213, 1, \r
+    244, 234, 213, 1, 249, 182, 213, 1, 237, 133, 213, 1, 252, 236, 213, 1, \r
+    217, 87, 213, 1, 237, 140, 213, 1, 221, 161, 213, 1, 217, 177, 213, 1, \r
+    237, 4, 213, 1, 235, 183, 213, 1, 233, 161, 213, 1, 231, 103, 213, 1, \r
+    224, 110, 213, 1, 237, 223, 213, 1, 245, 203, 213, 1, 221, 53, 213, 1, \r
+    228, 79, 213, 1, 227, 89, 213, 1, 225, 9, 213, 1, 222, 151, 213, 164, \r
+    237, 223, 213, 164, 237, 222, 213, 164, 230, 172, 213, 164, 249, 193, \r
+    213, 58, 1, 246, 160, 217, 177, 213, 164, 246, 160, 217, 177, 213, 29, 5, \r
+    171, 73, 213, 29, 5, 73, 213, 29, 5, 230, 72, 255, 58, 213, 29, 5, 171, \r
+    255, 58, 213, 29, 5, 255, 58, 213, 29, 5, 230, 72, 60, 213, 29, 5, 171, \r
+    60, 213, 29, 5, 60, 213, 58, 1, 224, 192, 60, 213, 29, 5, 224, 192, 60, \r
+    213, 29, 5, 171, 68, 213, 29, 5, 68, 213, 58, 1, 72, 213, 29, 5, 171, 72, \r
+    213, 29, 5, 72, 213, 29, 5, 74, 213, 29, 5, 223, 75, 213, 164, 232, 128, \r
+    213, 228, 197, 232, 128, 213, 228, 197, 254, 211, 213, 228, 197, 254, \r
+    122, 213, 228, 197, 252, 181, 213, 228, 197, 253, 240, 213, 228, 197, \r
+    224, 201, 213, 255, 7, 78, 213, 228, 197, 234, 4, 228, 113, 213, 228, \r
+    197, 217, 29, 213, 228, 197, 228, 113, 213, 228, 197, 217, 112, 213, 228, \r
+    197, 220, 233, 213, 228, 197, 254, 36, 213, 228, 197, 224, 22, 234, 55, \r
+    213, 228, 197, 254, 113, 80, 5, 237, 170, 251, 146, 80, 5, 251, 146, 80, \r
+    5, 254, 95, 80, 5, 219, 77, 80, 1, 224, 192, 60, 80, 1, 60, 80, 1, 255, \r
+    58, 80, 1, 72, 80, 1, 237, 255, 80, 1, 68, 80, 1, 220, 23, 80, 1, 167, \r
+    152, 80, 1, 167, 153, 80, 1, 251, 149, 73, 80, 1, 224, 192, 73, 80, 1, \r
+    73, 80, 1, 254, 196, 80, 1, 251, 149, 74, 80, 1, 224, 192, 74, 80, 1, 74, \r
+    80, 1, 253, 232, 80, 1, 175, 80, 1, 236, 149, 80, 1, 245, 0, 80, 1, 244, \r
+    125, 80, 1, 232, 115, 80, 1, 251, 169, 80, 1, 251, 69, 80, 1, 237, 123, \r
+    80, 1, 237, 103, 80, 1, 231, 77, 80, 1, 221, 29, 80, 1, 221, 19, 80, 1, \r
+    249, 132, 80, 1, 249, 116, 80, 1, 231, 217, 80, 1, 222, 155, 80, 1, 222, \r
+    35, 80, 1, 249, 207, 80, 1, 249, 36, 80, 1, 208, 80, 1, 231, 208, 80, 1, \r
+    187, 80, 1, 229, 141, 80, 1, 252, 237, 80, 1, 252, 94, 80, 1, 196, 80, 1, \r
+    184, 80, 1, 203, 80, 1, 227, 52, 80, 1, 235, 188, 80, 1, 235, 17, 80, 1, \r
+    235, 16, 80, 1, 219, 189, 80, 1, 225, 25, 80, 1, 223, 218, 80, 1, 226, \r
+    177, 80, 1, 155, 80, 5, 231, 112, 80, 5, 253, 219, 80, 29, 5, 255, 58, \r
+    80, 29, 5, 72, 80, 29, 5, 237, 255, 80, 29, 5, 68, 80, 29, 5, 220, 23, \r
+    80, 29, 5, 167, 152, 80, 29, 5, 167, 227, 53, 80, 29, 5, 251, 149, 73, \r
+    80, 29, 5, 224, 192, 73, 80, 29, 5, 73, 80, 29, 5, 254, 196, 80, 29, 5, \r
+    251, 149, 74, 80, 29, 5, 224, 192, 74, 80, 29, 5, 74, 80, 29, 5, 253, \r
+    232, 80, 5, 219, 82, 80, 29, 5, 228, 232, 73, 80, 230, 146, 80, 223, 125, \r
+    5, 220, 112, 80, 223, 125, 5, 254, 97, 80, 244, 37, 255, 0, 80, 254, 248, \r
+    255, 0, 80, 29, 5, 251, 149, 171, 73, 80, 1, 228, 155, 80, 1, 236, 133, \r
+    80, 1, 244, 114, 80, 1, 217, 114, 80, 1, 249, 121, 80, 1, 227, 151, 80, \r
+    1, 246, 8, 80, 1, 217, 165, 80, 1, 167, 227, 53, 80, 1, 167, 235, 18, 80, \r
+    29, 5, 167, 153, 80, 29, 5, 167, 235, 18, 80, 249, 167, 80, 51, 249, 167, \r
+    80, 20, 217, 84, 80, 20, 107, 80, 20, 103, 80, 20, 160, 80, 20, 154, 80, \r
+    20, 174, 80, 20, 182, 80, 20, 191, 80, 20, 185, 80, 20, 190, 80, 255, 7, \r
+    55, 80, 5, 116, 223, 253, 248, 145, 80, 1, 251, 149, 60, 80, 1, 217, 80, \r
+    80, 1, 106, 184, 80, 1, 244, 160, 80, 1, 237, 87, 80, 1, 244, 73, 223, \r
+    136, 80, 1, 249, 122, 80, 1, 252, 178, 130, 5, 251, 146, 130, 5, 254, 95, \r
+    130, 5, 219, 77, 130, 1, 60, 130, 1, 255, 58, 130, 1, 72, 130, 1, 237, \r
+    255, 130, 1, 68, 130, 1, 220, 23, 130, 1, 167, 152, 130, 1, 167, 153, \r
+    130, 1, 73, 130, 1, 254, 196, 130, 1, 74, 130, 1, 253, 232, 130, 1, 175, \r
+    130, 1, 236, 149, 130, 1, 245, 0, 130, 1, 244, 125, 130, 1, 232, 115, \r
+    130, 1, 251, 169, 130, 1, 251, 69, 130, 1, 237, 123, 130, 1, 237, 103, \r
+    130, 1, 231, 77, 130, 1, 221, 29, 130, 1, 221, 19, 130, 1, 249, 132, 130, \r
+    1, 249, 116, 130, 1, 231, 217, 130, 1, 222, 155, 130, 1, 222, 35, 130, 1, \r
+    249, 207, 130, 1, 249, 36, 130, 1, 208, 130, 1, 187, 130, 1, 229, 141, \r
+    130, 1, 252, 237, 130, 1, 252, 94, 130, 1, 196, 130, 1, 184, 130, 1, 203, \r
+    130, 1, 235, 188, 130, 1, 225, 25, 130, 1, 223, 218, 130, 1, 226, 177, \r
+    130, 1, 155, 130, 5, 231, 112, 130, 5, 253, 219, 130, 29, 5, 255, 58, \r
+    130, 29, 5, 72, 130, 29, 5, 237, 255, 130, 29, 5, 68, 130, 29, 5, 220, \r
+    23, 130, 29, 5, 167, 152, 130, 29, 5, 167, 227, 53, 130, 29, 5, 73, 130, \r
+    29, 5, 254, 196, 130, 29, 5, 74, 130, 29, 5, 253, 232, 130, 5, 219, 82, \r
+    130, 1, 236, 141, 222, 155, 130, 253, 233, 235, 94, 78, 130, 1, 227, 52, \r
+    130, 1, 227, 151, 130, 1, 217, 165, 130, 1, 167, 227, 53, 130, 1, 167, \r
+    235, 18, 130, 29, 5, 167, 153, 130, 29, 5, 167, 235, 18, 130, 20, 217, \r
+    84, 130, 20, 107, 130, 20, 103, 130, 20, 160, 130, 20, 154, 130, 20, 174, \r
+    130, 20, 182, 130, 20, 191, 130, 20, 185, 130, 20, 190, 130, 1, 228, 3, \r
+    2, 233, 193, 249, 10, 130, 1, 228, 3, 2, 234, 237, 249, 10, 130, 227, 4, \r
+    78, 130, 227, 4, 55, 130, 250, 78, 231, 106, 107, 130, 250, 78, 231, 106, \r
+    103, 130, 250, 78, 231, 106, 160, 130, 250, 78, 231, 106, 154, 130, 250, \r
+    78, 231, 106, 131, 235, 88, 222, 28, 222, 23, 249, 56, 130, 250, 78, 249, \r
+    57, 224, 77, 130, 237, 141, 130, 244, 227, 78, 163, 5, 254, 243, 252, 72, \r
+    163, 5, 252, 72, 163, 5, 219, 77, 163, 1, 60, 163, 1, 255, 58, 163, 1, \r
+    72, 163, 1, 237, 255, 163, 1, 68, 163, 1, 220, 23, 163, 1, 246, 250, 163, \r
+    1, 254, 196, 163, 1, 230, 127, 163, 1, 253, 232, 163, 1, 175, 163, 1, \r
+    236, 149, 163, 1, 245, 0, 163, 1, 244, 125, 163, 1, 232, 115, 163, 1, \r
+    251, 169, 163, 1, 251, 69, 163, 1, 237, 123, 163, 1, 237, 103, 163, 1, \r
+    231, 77, 163, 1, 221, 29, 163, 1, 221, 19, 163, 1, 249, 132, 163, 1, 249, \r
+    116, 163, 1, 231, 217, 163, 1, 222, 155, 163, 1, 222, 35, 163, 1, 249, \r
+    207, 163, 1, 249, 36, 163, 1, 208, 163, 1, 187, 163, 1, 229, 141, 163, 1, \r
+    252, 237, 163, 1, 252, 94, 163, 1, 196, 163, 1, 184, 163, 1, 203, 163, 1, \r
+    235, 188, 163, 1, 235, 17, 163, 1, 219, 189, 163, 1, 225, 25, 163, 1, \r
+    226, 177, 163, 1, 155, 163, 5, 231, 112, 163, 29, 5, 255, 58, 163, 29, 5, \r
+    72, 163, 29, 5, 237, 255, 163, 29, 5, 68, 163, 29, 5, 220, 23, 163, 29, \r
+    5, 246, 250, 163, 29, 5, 254, 196, 163, 29, 5, 230, 127, 163, 29, 5, 253, \r
+    232, 163, 5, 219, 82, 163, 5, 220, 114, 163, 1, 236, 133, 163, 1, 244, \r
+    114, 163, 1, 217, 114, 163, 1, 227, 52, 163, 1, 246, 8, 163, 20, 217, 84, \r
+    163, 20, 107, 163, 20, 103, 163, 20, 160, 163, 20, 154, 163, 20, 174, \r
+    163, 20, 182, 163, 20, 191, 163, 20, 185, 163, 20, 190, 163, 221, 167, \r
+    163, 254, 242, 163, 237, 155, 163, 220, 46, 163, 246, 224, 230, 132, 163, \r
+    5, 218, 54, 150, 5, 251, 146, 150, 5, 254, 95, 150, 5, 219, 77, 150, 1, \r
+    60, 150, 1, 255, 58, 150, 1, 72, 150, 1, 237, 255, 150, 1, 68, 150, 1, \r
+    220, 23, 150, 1, 167, 152, 150, 1, 167, 153, 150, 29, 251, 149, 73, 150, \r
+    1, 73, 150, 1, 254, 196, 150, 29, 251, 149, 74, 150, 1, 74, 150, 1, 253, \r
+    232, 150, 1, 175, 150, 1, 236, 149, 150, 1, 245, 0, 150, 1, 244, 125, \r
+    150, 1, 232, 115, 150, 1, 251, 169, 150, 1, 251, 69, 150, 1, 237, 123, \r
+    150, 1, 237, 103, 150, 1, 231, 77, 150, 1, 221, 29, 150, 1, 221, 19, 150, \r
+    1, 249, 132, 150, 1, 249, 116, 150, 1, 231, 217, 150, 1, 222, 155, 150, \r
+    1, 222, 35, 150, 1, 249, 207, 150, 1, 249, 36, 150, 1, 208, 150, 1, 187, \r
+    150, 1, 229, 141, 150, 1, 252, 237, 150, 1, 252, 94, 150, 1, 196, 150, 1, \r
+    184, 150, 1, 203, 150, 1, 235, 188, 150, 1, 235, 17, 150, 1, 219, 189, \r
+    150, 1, 225, 25, 150, 1, 223, 218, 150, 1, 226, 177, 150, 1, 155, 150, 5, \r
+    231, 112, 150, 5, 253, 219, 150, 29, 5, 255, 58, 150, 29, 5, 72, 150, 29, \r
+    5, 237, 255, 150, 29, 5, 68, 150, 29, 5, 220, 23, 150, 29, 5, 167, 152, \r
+    150, 29, 5, 167, 227, 53, 150, 29, 5, 251, 149, 73, 150, 29, 5, 73, 150, \r
+    29, 5, 254, 196, 150, 29, 5, 251, 149, 74, 150, 29, 5, 74, 150, 29, 5, \r
+    253, 232, 150, 5, 219, 82, 150, 230, 146, 150, 1, 167, 227, 53, 150, 1, \r
+    167, 235, 18, 150, 29, 5, 167, 153, 150, 29, 5, 167, 235, 18, 150, 20, \r
+    217, 84, 150, 20, 107, 150, 20, 103, 150, 20, 160, 150, 20, 154, 150, 20, \r
+    174, 150, 20, 182, 150, 20, 191, 150, 20, 185, 150, 20, 190, 150, 227, 4, \r
+    55, 147, 5, 251, 146, 147, 5, 254, 95, 147, 5, 219, 77, 147, 1, 60, 147, \r
+    1, 255, 58, 147, 1, 72, 147, 1, 237, 255, 147, 1, 68, 147, 1, 220, 23, \r
+    147, 1, 167, 152, 147, 1, 167, 153, 147, 1, 73, 147, 1, 254, 196, 147, 1, \r
+    74, 147, 1, 253, 232, 147, 1, 175, 147, 1, 236, 149, 147, 1, 245, 0, 147, \r
+    1, 244, 125, 147, 1, 232, 115, 147, 1, 251, 169, 147, 1, 251, 69, 147, 1, \r
+    237, 123, 147, 1, 237, 103, 147, 1, 231, 77, 147, 1, 221, 29, 147, 1, \r
+    221, 19, 147, 1, 249, 132, 147, 1, 249, 116, 147, 1, 231, 217, 147, 1, \r
+    222, 155, 147, 1, 222, 35, 147, 1, 249, 207, 147, 1, 249, 36, 147, 1, \r
+    208, 147, 1, 187, 147, 1, 229, 141, 147, 1, 252, 237, 147, 1, 252, 94, \r
+    147, 1, 196, 147, 1, 184, 147, 1, 203, 147, 1, 235, 188, 147, 1, 235, 17, \r
+    147, 1, 219, 189, 147, 1, 225, 25, 147, 1, 223, 218, 147, 1, 226, 177, \r
+    147, 1, 155, 147, 5, 231, 112, 147, 5, 253, 219, 147, 29, 5, 255, 58, \r
+    147, 29, 5, 72, 147, 29, 5, 237, 255, 147, 29, 5, 68, 147, 29, 5, 220, \r
+    23, 147, 29, 5, 167, 152, 147, 29, 5, 167, 227, 53, 147, 29, 5, 73, 147, \r
+    29, 5, 254, 196, 147, 29, 5, 74, 147, 29, 5, 253, 232, 147, 5, 219, 82, \r
+    147, 254, 197, 235, 94, 78, 147, 253, 233, 235, 94, 78, 147, 1, 227, 52, \r
+    147, 1, 227, 151, 147, 1, 217, 165, 147, 1, 167, 227, 53, 147, 1, 167, \r
+    235, 18, 147, 29, 5, 167, 153, 147, 29, 5, 167, 235, 18, 147, 20, 217, \r
+    84, 147, 20, 107, 147, 20, 103, 147, 20, 160, 147, 20, 154, 147, 20, 174, \r
+    147, 20, 182, 147, 20, 191, 147, 20, 185, 147, 20, 190, 147, 237, 141, \r
+    147, 1, 219, 7, 176, 5, 254, 95, 176, 5, 219, 77, 176, 1, 60, 176, 1, \r
+    255, 58, 176, 1, 72, 176, 1, 237, 255, 176, 1, 68, 176, 1, 220, 23, 176, \r
+    1, 73, 176, 1, 246, 250, 176, 1, 254, 196, 176, 1, 74, 176, 1, 230, 127, \r
+    176, 1, 253, 232, 176, 1, 175, 176, 1, 232, 115, 176, 1, 251, 169, 176, \r
+    1, 237, 123, 176, 1, 231, 77, 176, 1, 221, 29, 176, 1, 231, 217, 176, 1, \r
+    222, 155, 176, 1, 208, 176, 1, 231, 208, 176, 1, 187, 176, 1, 196, 176, \r
+    1, 184, 176, 1, 203, 176, 1, 227, 52, 176, 1, 235, 188, 176, 1, 235, 17, \r
+    176, 1, 235, 16, 176, 1, 219, 189, 176, 1, 225, 25, 176, 1, 223, 218, \r
+    176, 1, 226, 177, 176, 1, 155, 176, 29, 5, 255, 58, 176, 29, 5, 72, 176, \r
+    29, 5, 237, 255, 176, 29, 5, 68, 176, 29, 5, 220, 23, 176, 29, 5, 73, \r
+    176, 29, 5, 246, 250, 176, 29, 5, 254, 196, 176, 29, 5, 74, 176, 29, 5, \r
+    230, 127, 176, 29, 5, 253, 232, 176, 5, 219, 82, 176, 230, 146, 176, 253, \r
+    233, 235, 94, 78, 176, 20, 217, 84, 176, 20, 107, 176, 20, 103, 176, 20, \r
+    160, 176, 20, 154, 176, 20, 174, 176, 20, 182, 176, 20, 191, 176, 20, \r
+    185, 176, 20, 190, 176, 54, 222, 65, 176, 54, 131, 242, 161, 176, 54, \r
+    131, 221, 231, 176, 249, 137, 55, 176, 233, 121, 55, 176, 218, 23, 55, \r
+    176, 249, 89, 55, 176, 250, 107, 55, 176, 254, 14, 71, 55, 176, 227, 4, \r
+    55, 176, 54, 55, 129, 5, 251, 146, 129, 5, 254, 95, 129, 5, 219, 77, 129, \r
+    1, 60, 129, 1, 255, 58, 129, 1, 72, 129, 1, 237, 255, 129, 1, 68, 129, 1, \r
+    220, 23, 129, 1, 167, 152, 129, 1, 167, 153, 129, 1, 73, 129, 1, 246, \r
+    250, 129, 1, 254, 196, 129, 1, 74, 129, 1, 230, 127, 129, 1, 253, 232, \r
+    129, 1, 175, 129, 1, 236, 149, 129, 1, 245, 0, 129, 1, 244, 125, 129, 1, \r
+    232, 115, 129, 1, 251, 169, 129, 1, 251, 69, 129, 1, 237, 123, 129, 1, \r
+    237, 103, 129, 1, 231, 77, 129, 1, 221, 29, 129, 1, 221, 19, 129, 1, 249, \r
+    132, 129, 1, 249, 116, 129, 1, 231, 217, 129, 1, 222, 155, 129, 1, 222, \r
+    35, 129, 1, 249, 207, 129, 1, 249, 36, 129, 1, 208, 129, 1, 187, 129, 1, \r
+    229, 141, 129, 1, 252, 237, 129, 1, 252, 94, 129, 1, 196, 129, 1, 184, \r
+    129, 1, 203, 129, 1, 227, 52, 129, 1, 235, 188, 129, 1, 235, 17, 129, 1, \r
+    219, 189, 129, 1, 225, 25, 129, 1, 223, 218, 129, 1, 226, 177, 129, 1, \r
+    155, 129, 5, 253, 219, 129, 29, 5, 255, 58, 129, 29, 5, 72, 129, 29, 5, \r
+    237, 255, 129, 29, 5, 68, 129, 29, 5, 220, 23, 129, 29, 5, 167, 152, 129, \r
+    29, 5, 167, 227, 53, 129, 29, 5, 73, 129, 29, 5, 246, 250, 129, 29, 5, \r
+    254, 196, 129, 29, 5, 74, 129, 29, 5, 230, 127, 129, 29, 5, 253, 232, \r
+    129, 5, 219, 82, 129, 235, 94, 78, 129, 254, 197, 235, 94, 78, 129, 1, \r
+    221, 55, 129, 1, 247, 74, 129, 1, 167, 227, 53, 129, 1, 167, 235, 18, \r
+    129, 29, 5, 167, 153, 129, 29, 5, 167, 235, 18, 129, 20, 217, 84, 129, \r
+    20, 107, 129, 20, 103, 129, 20, 160, 129, 20, 154, 129, 20, 174, 129, 20, \r
+    182, 129, 20, 191, 129, 20, 185, 129, 20, 190, 129, 245, 108, 20, 217, \r
+    85, 35, 230, 169, 229, 9, 117, 154, 129, 245, 108, 20, 131, 35, 230, 169, \r
+    229, 9, 117, 154, 129, 245, 108, 20, 124, 35, 230, 169, 229, 9, 117, 154, \r
+    129, 245, 108, 20, 148, 35, 230, 169, 229, 9, 117, 154, 129, 245, 108, \r
+    20, 131, 35, 246, 104, 229, 9, 117, 154, 129, 245, 108, 20, 124, 35, 246, \r
+    104, 229, 9, 117, 154, 129, 245, 108, 20, 148, 35, 246, 104, 229, 9, 117, \r
+    154, 129, 5, 220, 229, 141, 5, 254, 95, 141, 5, 219, 77, 141, 1, 60, 141, \r
+    1, 255, 58, 141, 1, 72, 141, 1, 237, 255, 141, 1, 68, 141, 1, 220, 23, \r
+    141, 1, 167, 152, 141, 1, 167, 153, 141, 1, 73, 141, 1, 246, 250, 141, 1, \r
+    254, 196, 141, 1, 74, 141, 1, 230, 127, 141, 1, 253, 232, 141, 1, 175, \r
+    141, 1, 236, 149, 141, 1, 245, 0, 141, 1, 244, 125, 141, 1, 232, 115, \r
+    141, 1, 251, 169, 141, 1, 251, 69, 141, 1, 237, 123, 141, 1, 237, 103, \r
+    141, 1, 231, 77, 141, 1, 221, 29, 141, 1, 221, 19, 141, 1, 249, 132, 141, \r
+    1, 249, 116, 141, 1, 231, 217, 141, 1, 222, 155, 141, 1, 222, 35, 141, 1, \r
+    249, 207, 141, 1, 249, 36, 141, 1, 208, 141, 1, 187, 141, 1, 229, 141, \r
+    141, 1, 252, 237, 141, 1, 252, 94, 141, 1, 196, 141, 1, 184, 141, 1, 203, \r
+    141, 1, 227, 52, 141, 1, 235, 188, 141, 1, 235, 17, 141, 1, 219, 189, \r
+    141, 1, 225, 25, 141, 1, 223, 218, 141, 1, 226, 177, 141, 1, 155, 141, 5, \r
+    231, 112, 141, 5, 253, 219, 141, 29, 5, 255, 58, 141, 29, 5, 72, 141, 29, \r
+    5, 237, 255, 141, 29, 5, 68, 141, 29, 5, 220, 23, 141, 29, 5, 167, 152, \r
+    141, 29, 5, 167, 227, 53, 141, 29, 5, 73, 141, 29, 5, 246, 250, 141, 29, \r
+    5, 254, 196, 141, 29, 5, 74, 141, 29, 5, 230, 127, 141, 29, 5, 253, 232, \r
+    141, 5, 219, 82, 141, 235, 94, 78, 141, 254, 197, 235, 94, 78, 141, 1, \r
+    246, 8, 141, 1, 167, 227, 53, 141, 1, 167, 235, 18, 141, 29, 5, 167, 153, \r
+    141, 29, 5, 167, 235, 18, 141, 20, 217, 84, 141, 20, 107, 141, 20, 103, \r
+    141, 20, 160, 141, 20, 154, 141, 20, 174, 141, 20, 182, 141, 20, 191, \r
+    141, 20, 185, 141, 20, 190, 141, 5, 237, 92, 141, 5, 220, 61, 123, 5, \r
+    254, 95, 123, 5, 219, 77, 123, 1, 60, 123, 1, 255, 58, 123, 1, 72, 123, \r
+    1, 237, 255, 123, 1, 68, 123, 1, 220, 23, 123, 1, 167, 152, 123, 1, 167, \r
+    153, 123, 1, 73, 123, 1, 246, 250, 123, 1, 254, 196, 123, 1, 74, 123, 1, \r
+    230, 127, 123, 1, 253, 232, 123, 1, 175, 123, 1, 236, 149, 123, 1, 245, \r
+    0, 123, 1, 244, 125, 123, 1, 232, 115, 123, 1, 251, 169, 123, 1, 251, 69, \r
+    123, 1, 237, 123, 123, 1, 237, 103, 123, 1, 231, 77, 123, 1, 221, 29, \r
+    123, 1, 221, 19, 123, 1, 249, 132, 123, 1, 249, 116, 123, 1, 231, 217, \r
+    123, 1, 222, 155, 123, 1, 222, 35, 123, 1, 249, 207, 123, 1, 249, 36, \r
+    123, 1, 208, 123, 1, 187, 123, 1, 229, 141, 123, 1, 252, 237, 123, 1, \r
+    252, 94, 123, 1, 196, 123, 1, 184, 123, 1, 203, 123, 1, 227, 52, 123, 1, \r
+    235, 188, 123, 1, 235, 17, 123, 1, 235, 16, 123, 1, 219, 189, 123, 1, \r
+    225, 25, 123, 1, 223, 218, 123, 1, 226, 177, 123, 1, 155, 123, 5, 253, \r
+    219, 123, 29, 5, 255, 58, 123, 29, 5, 72, 123, 29, 5, 237, 255, 123, 29, \r
+    5, 68, 123, 29, 5, 220, 23, 123, 29, 5, 167, 152, 123, 29, 5, 167, 227, \r
+    53, 123, 29, 5, 73, 123, 29, 5, 246, 250, 123, 29, 5, 254, 196, 123, 29, \r
+    5, 74, 123, 29, 5, 230, 127, 123, 29, 5, 253, 232, 123, 5, 219, 82, 123, \r
+    253, 233, 235, 94, 78, 123, 1, 167, 227, 53, 123, 1, 167, 235, 18, 123, \r
+    29, 5, 167, 153, 123, 29, 5, 167, 235, 18, 123, 20, 217, 84, 123, 20, \r
+    107, 123, 20, 103, 123, 20, 160, 123, 20, 154, 123, 20, 174, 123, 20, \r
+    182, 123, 20, 191, 123, 20, 185, 123, 20, 190, 123, 54, 222, 65, 123, 54, \r
+    131, 242, 161, 123, 54, 131, 221, 231, 123, 245, 108, 131, 228, 89, 123, \r
+    245, 108, 131, 243, 194, 123, 245, 108, 148, 228, 87, 123, 249, 141, 78, \r
+    123, 1, 251, 23, 231, 218, 123, 1, 251, 23, 207, 123, 1, 251, 23, 227, \r
+    53, 123, 1, 251, 23, 153, 123, 1, 251, 23, 235, 18, 123, 1, 251, 23, 237, \r
+    17, 162, 5, 254, 94, 162, 5, 219, 76, 162, 1, 253, 210, 162, 1, 255, 13, \r
+    162, 1, 254, 215, 162, 1, 254, 229, 162, 1, 237, 132, 162, 1, 237, 254, \r
+    162, 1, 220, 15, 162, 1, 220, 17, 162, 1, 237, 153, 162, 1, 237, 154, \r
+    162, 1, 237, 240, 162, 1, 237, 242, 162, 1, 246, 83, 162, 1, 246, 246, \r
+    162, 1, 254, 184, 162, 1, 230, 62, 162, 1, 230, 122, 162, 1, 253, 222, \r
+    162, 1, 254, 149, 236, 189, 162, 1, 234, 105, 236, 189, 162, 1, 254, 149, \r
+    244, 207, 162, 1, 234, 105, 244, 207, 162, 1, 236, 228, 232, 232, 162, 1, \r
+    226, 135, 244, 207, 162, 1, 254, 149, 251, 117, 162, 1, 234, 105, 251, \r
+    117, 162, 1, 254, 149, 237, 115, 162, 1, 234, 105, 237, 115, 162, 1, 222, \r
+    149, 232, 232, 162, 1, 222, 149, 226, 134, 232, 233, 162, 1, 226, 135, \r
+    237, 115, 162, 1, 254, 149, 221, 27, 162, 1, 234, 105, 221, 27, 162, 1, \r
+    254, 149, 249, 123, 162, 1, 234, 105, 249, 123, 162, 1, 233, 56, 232, \r
+    198, 162, 1, 226, 135, 249, 123, 162, 1, 254, 149, 222, 95, 162, 1, 234, \r
+    105, 222, 95, 162, 1, 254, 149, 249, 136, 162, 1, 234, 105, 249, 136, \r
+    162, 1, 249, 164, 232, 198, 162, 1, 226, 135, 249, 136, 162, 1, 254, 149, \r
+    229, 204, 162, 1, 234, 105, 229, 204, 162, 1, 254, 149, 252, 179, 162, 1, \r
+    234, 105, 252, 179, 162, 1, 234, 44, 162, 1, 254, 136, 252, 179, 162, 1, \r
+    218, 29, 162, 1, 227, 221, 162, 1, 249, 164, 235, 131, 162, 1, 219, 167, \r
+    162, 1, 222, 149, 226, 117, 162, 1, 233, 56, 226, 117, 162, 1, 249, 164, \r
+    226, 117, 162, 1, 243, 166, 162, 1, 233, 56, 235, 131, 162, 1, 245, 233, \r
+    162, 5, 254, 174, 162, 29, 5, 254, 224, 162, 29, 5, 236, 158, 254, 231, \r
+    162, 29, 5, 248, 241, 254, 231, 162, 29, 5, 236, 158, 237, 150, 162, 29, \r
+    5, 248, 241, 237, 150, 162, 29, 5, 236, 158, 230, 42, 162, 29, 5, 248, \r
+    241, 230, 42, 162, 29, 5, 244, 245, 162, 29, 5, 236, 46, 162, 29, 5, 248, \r
+    241, 236, 46, 162, 29, 5, 236, 48, 249, 73, 162, 29, 5, 236, 47, 243, \r
+    212, 254, 224, 162, 29, 5, 236, 47, 243, 212, 248, 241, 254, 224, 162, \r
+    29, 5, 236, 47, 243, 212, 244, 206, 162, 29, 5, 244, 206, 162, 29, 5, \r
+    248, 241, 244, 245, 162, 29, 5, 248, 241, 244, 206, 162, 228, 197, 235, \r
+    254, 140, 126, 236, 58, 236, 243, 140, 126, 236, 126, 236, 145, 140, 126, \r
+    236, 126, 236, 119, 140, 126, 236, 126, 236, 116, 140, 126, 236, 126, \r
+    236, 123, 140, 126, 236, 126, 227, 240, 140, 126, 232, 85, 232, 74, 140, \r
+    126, 251, 12, 251, 60, 140, 126, 251, 12, 251, 20, 140, 126, 251, 12, \r
+    251, 59, 140, 126, 224, 27, 224, 26, 140, 126, 251, 12, 251, 9, 140, 126, \r
+    217, 232, 217, 239, 140, 126, 248, 168, 251, 66, 140, 126, 199, 229, 213, \r
+    140, 126, 221, 240, 222, 27, 140, 126, 221, 240, 232, 215, 140, 126, 221, \r
+    240, 229, 111, 140, 126, 231, 205, 232, 134, 140, 126, 248, 168, 249, 74, \r
+    140, 126, 199, 222, 116, 140, 126, 221, 240, 221, 219, 140, 126, 221, \r
+    240, 222, 31, 140, 126, 221, 240, 221, 237, 140, 126, 231, 205, 231, 144, \r
+    140, 126, 252, 42, 252, 220, 140, 126, 229, 38, 229, 58, 140, 126, 229, \r
+    119, 229, 113, 140, 126, 245, 140, 246, 8, 140, 126, 229, 119, 229, 135, \r
+    140, 126, 245, 140, 245, 245, 140, 126, 229, 119, 226, 143, 140, 126, \r
+    233, 137, 196, 140, 126, 217, 232, 218, 55, 140, 126, 227, 76, 227, 21, \r
+    140, 126, 227, 22, 140, 126, 235, 13, 235, 36, 140, 126, 234, 231, 140, \r
+    126, 218, 188, 219, 3, 140, 126, 224, 27, 226, 155, 140, 126, 224, 27, \r
+    227, 0, 140, 126, 224, 27, 223, 102, 140, 126, 243, 5, 243, 95, 140, 126, \r
+    235, 13, 250, 252, 140, 126, 142, 254, 123, 140, 126, 243, 5, 231, 200, \r
+    140, 126, 230, 30, 140, 126, 226, 130, 60, 140, 126, 234, 100, 243, 190, \r
+    140, 126, 226, 130, 255, 58, 140, 126, 226, 130, 254, 140, 140, 126, 226, \r
+    130, 72, 140, 126, 226, 130, 237, 255, 140, 126, 226, 130, 220, 110, 140, \r
+    126, 226, 130, 220, 108, 140, 126, 226, 130, 68, 140, 126, 226, 130, 220, \r
+    23, 140, 126, 229, 121, 140, 250, 78, 16, 252, 221, 140, 126, 226, 130, \r
+    73, 140, 126, 226, 130, 254, 234, 140, 126, 226, 130, 74, 140, 126, 226, \r
+    130, 254, 197, 234, 96, 140, 126, 226, 130, 254, 197, 234, 97, 140, 126, \r
+    235, 164, 140, 126, 234, 93, 140, 126, 234, 94, 140, 126, 234, 100, 246, \r
+    223, 140, 126, 234, 100, 221, 239, 140, 126, 234, 100, 221, 93, 140, 126, \r
+    234, 100, 251, 50, 140, 126, 222, 25, 140, 126, 232, 36, 140, 126, 218, \r
+    49, 140, 126, 245, 135, 140, 20, 217, 84, 140, 20, 107, 140, 20, 103, \r
+    140, 20, 160, 140, 20, 154, 140, 20, 174, 140, 20, 182, 140, 20, 191, \r
+    140, 20, 185, 140, 20, 190, 140, 126, 254, 121, 140, 126, 236, 124, 202, \r
+    1, 236, 57, 202, 1, 236, 126, 223, 66, 202, 1, 236, 126, 222, 121, 202, \r
+    1, 232, 84, 202, 1, 250, 182, 202, 1, 224, 27, 222, 121, 202, 1, 231, 56, \r
+    202, 1, 248, 167, 202, 1, 101, 202, 1, 221, 240, 223, 66, 202, 1, 221, \r
+    240, 222, 121, 202, 1, 231, 204, 202, 1, 252, 41, 202, 1, 229, 37, 202, \r
+    1, 229, 119, 223, 66, 202, 1, 245, 140, 222, 121, 202, 1, 229, 119, 222, \r
+    121, 202, 1, 245, 140, 223, 66, 202, 1, 233, 136, 202, 1, 217, 231, 202, \r
+    1, 235, 13, 235, 36, 202, 1, 235, 13, 234, 246, 202, 1, 218, 187, 202, 1, \r
+    224, 27, 223, 66, 202, 1, 243, 5, 223, 66, 202, 1, 74, 202, 1, 243, 5, \r
+    222, 121, 202, 246, 208, 202, 29, 5, 60, 202, 29, 5, 234, 100, 236, 233, \r
+    202, 29, 5, 255, 58, 202, 29, 5, 254, 140, 202, 29, 5, 72, 202, 29, 5, \r
+    237, 255, 202, 29, 5, 218, 90, 202, 29, 5, 217, 166, 202, 29, 5, 68, 202, \r
+    29, 5, 220, 23, 202, 29, 5, 234, 100, 236, 44, 202, 225, 62, 5, 235, 12, \r
+    202, 225, 62, 5, 231, 56, 202, 29, 5, 73, 202, 29, 5, 246, 237, 202, 29, \r
+    5, 74, 202, 29, 5, 253, 212, 202, 29, 5, 254, 196, 202, 236, 58, 235, \r
+    188, 202, 145, 234, 100, 246, 223, 202, 145, 234, 100, 221, 239, 202, \r
+    145, 234, 100, 221, 205, 202, 145, 234, 100, 251, 123, 202, 251, 151, 78, \r
+    202, 232, 43, 202, 20, 217, 84, 202, 20, 107, 202, 20, 103, 202, 20, 160, \r
+    202, 20, 154, 202, 20, 174, 202, 20, 182, 202, 20, 191, 202, 20, 185, \r
+    202, 20, 190, 202, 243, 5, 231, 204, 202, 243, 5, 233, 136, 59, 4, 230, \r
+    146, 59, 164, 244, 19, 217, 243, 233, 213, 221, 61, 60, 59, 164, 244, 19, \r
+    217, 243, 233, 213, 255, 144, 227, 80, 252, 146, 196, 59, 164, 244, 19, \r
+    217, 243, 233, 213, 255, 144, 244, 19, 221, 45, 196, 59, 164, 66, 217, \r
+    243, 233, 213, 234, 27, 196, 59, 164, 250, 194, 217, 243, 233, 213, 225, \r
+    31, 196, 59, 164, 251, 135, 217, 243, 233, 213, 229, 112, 225, 19, 196, \r
+    59, 164, 217, 243, 233, 213, 221, 45, 225, 19, 196, 59, 164, 226, 115, \r
+    225, 18, 59, 164, 251, 251, 217, 243, 233, 212, 59, 164, 252, 55, 224, \r
+    197, 217, 243, 233, 212, 59, 164, 237, 173, 221, 44, 59, 164, 249, 68, \r
+    221, 45, 251, 250, 59, 164, 225, 18, 59, 164, 231, 60, 225, 18, 59, 164, \r
+    221, 45, 225, 18, 59, 164, 231, 60, 221, 45, 225, 18, 59, 164, 227, 96, \r
+    251, 39, 223, 229, 225, 18, 59, 164, 227, 154, 244, 44, 225, 18, 59, 164, \r
+    251, 135, 255, 148, 227, 26, 234, 26, 171, 251, 154, 59, 164, 244, 19, \r
+    221, 44, 59, 235, 5, 5, 251, 67, 227, 25, 59, 235, 5, 5, 235, 77, 227, \r
+    25, 59, 253, 248, 5, 225, 28, 244, 194, 255, 149, 227, 25, 59, 253, 248, \r
+    5, 255, 146, 187, 59, 253, 248, 5, 226, 95, 221, 40, 59, 5, 227, 218, \r
+    248, 179, 244, 193, 59, 5, 227, 218, 248, 179, 244, 70, 59, 5, 227, 218, \r
+    248, 179, 244, 20, 59, 5, 227, 218, 232, 230, 244, 193, 59, 5, 227, 218, \r
+    232, 230, 244, 70, 59, 5, 227, 218, 248, 179, 227, 218, 232, 229, 59, 20, \r
+    217, 84, 59, 20, 107, 59, 20, 103, 59, 20, 160, 59, 20, 154, 59, 20, 174, \r
+    59, 20, 182, 59, 20, 191, 59, 20, 185, 59, 20, 190, 59, 20, 144, 107, 59, \r
+    20, 144, 103, 59, 20, 144, 160, 59, 20, 144, 154, 59, 20, 144, 174, 59, \r
+    20, 144, 182, 59, 20, 144, 191, 59, 20, 144, 185, 59, 20, 144, 190, 59, \r
+    20, 144, 217, 84, 59, 164, 251, 253, 227, 25, 59, 164, 232, 109, 251, \r
+    204, 231, 68, 217, 23, 59, 164, 251, 135, 255, 148, 227, 26, 251, 205, \r
+    233, 172, 251, 154, 59, 164, 232, 109, 251, 204, 225, 29, 227, 25, 59, \r
+    164, 251, 47, 233, 212, 59, 164, 221, 56, 255, 145, 59, 164, 244, 8, 227, \r
+    26, 243, 228, 59, 164, 244, 8, 227, 26, 243, 234, 59, 164, 254, 124, 236, \r
+    140, 243, 228, 59, 164, 254, 124, 236, 140, 243, 234, 59, 5, 218, 42, \r
+    221, 43, 59, 5, 234, 75, 221, 43, 59, 1, 175, 59, 1, 236, 149, 59, 1, \r
+    245, 0, 59, 1, 244, 125, 59, 1, 232, 115, 59, 1, 251, 169, 59, 1, 251, \r
+    69, 59, 1, 237, 123, 59, 1, 231, 77, 59, 1, 221, 29, 59, 1, 221, 19, 59, \r
+    1, 249, 132, 59, 1, 249, 116, 59, 1, 231, 217, 59, 1, 222, 155, 59, 1, \r
+    222, 35, 59, 1, 249, 207, 59, 1, 249, 36, 59, 1, 208, 59, 1, 187, 59, 1, \r
+    229, 141, 59, 1, 252, 237, 59, 1, 252, 94, 59, 1, 196, 59, 1, 221, 55, \r
+    59, 1, 221, 47, 59, 1, 247, 74, 59, 1, 247, 70, 59, 1, 219, 7, 59, 1, \r
+    217, 80, 59, 1, 217, 114, 59, 1, 255, 151, 59, 1, 184, 59, 1, 203, 59, 1, \r
+    235, 188, 59, 1, 225, 25, 59, 1, 223, 218, 59, 1, 226, 177, 59, 1, 155, \r
+    59, 1, 60, 59, 1, 236, 10, 59, 1, 245, 167, 203, 59, 1, 236, 74, 59, 1, \r
+    227, 52, 59, 29, 5, 255, 58, 59, 29, 5, 72, 59, 29, 5, 237, 255, 59, 29, \r
+    5, 68, 59, 29, 5, 220, 23, 59, 29, 5, 167, 152, 59, 29, 5, 167, 227, 53, \r
+    59, 29, 5, 167, 153, 59, 29, 5, 167, 235, 18, 59, 29, 5, 73, 59, 29, 5, \r
+    246, 250, 59, 29, 5, 74, 59, 29, 5, 230, 127, 59, 5, 227, 81, 223, 104, \r
+    232, 116, 227, 75, 59, 5, 227, 80, 252, 145, 59, 29, 5, 210, 72, 59, 29, \r
+    5, 210, 237, 255, 59, 5, 231, 68, 217, 24, 232, 236, 249, 207, 59, 5, \r
+    224, 37, 235, 124, 59, 164, 243, 196, 59, 164, 230, 21, 59, 5, 235, 127, \r
+    227, 25, 59, 5, 218, 46, 227, 25, 59, 5, 235, 128, 221, 56, 251, 154, 59, \r
+    5, 234, 28, 251, 154, 59, 5, 244, 22, 251, 155, 227, 152, 59, 5, 244, 22, \r
+    234, 20, 227, 152, 59, 223, 97, 1, 175, 59, 223, 97, 1, 236, 149, 59, \r
+    223, 97, 1, 245, 0, 59, 223, 97, 1, 244, 125, 59, 223, 97, 1, 232, 115, \r
+    59, 223, 97, 1, 251, 169, 59, 223, 97, 1, 251, 69, 59, 223, 97, 1, 237, \r
+    123, 59, 223, 97, 1, 231, 77, 59, 223, 97, 1, 221, 29, 59, 223, 97, 1, \r
+    221, 19, 59, 223, 97, 1, 249, 132, 59, 223, 97, 1, 249, 116, 59, 223, 97, \r
+    1, 231, 217, 59, 223, 97, 1, 222, 155, 59, 223, 97, 1, 222, 35, 59, 223, \r
+    97, 1, 249, 207, 59, 223, 97, 1, 249, 36, 59, 223, 97, 1, 208, 59, 223, \r
+    97, 1, 187, 59, 223, 97, 1, 229, 141, 59, 223, 97, 1, 252, 237, 59, 223, \r
+    97, 1, 252, 94, 59, 223, 97, 1, 196, 59, 223, 97, 1, 221, 55, 59, 223, \r
+    97, 1, 221, 47, 59, 223, 97, 1, 247, 74, 59, 223, 97, 1, 247, 70, 59, \r
+    223, 97, 1, 219, 7, 59, 223, 97, 1, 217, 80, 59, 223, 97, 1, 217, 114, \r
+    59, 223, 97, 1, 255, 151, 59, 223, 97, 1, 184, 59, 223, 97, 1, 203, 59, \r
+    223, 97, 1, 235, 188, 59, 223, 97, 1, 225, 25, 59, 223, 97, 1, 223, 218, \r
+    59, 223, 97, 1, 226, 177, 59, 223, 97, 1, 155, 59, 223, 97, 1, 60, 59, \r
+    223, 97, 1, 236, 10, 59, 223, 97, 1, 245, 167, 219, 7, 59, 223, 97, 1, \r
+    245, 167, 184, 59, 223, 97, 1, 245, 167, 203, 59, 236, 8, 227, 23, 236, \r
+    149, 59, 236, 8, 227, 23, 236, 150, 251, 205, 233, 172, 251, 154, 59, \r
+    251, 144, 5, 106, 252, 140, 59, 251, 144, 5, 170, 252, 140, 59, 251, 144, \r
+    5, 251, 145, 222, 86, 59, 251, 144, 5, 226, 114, 255, 150, 59, 16, 247, \r
+    121, 251, 248, 59, 16, 227, 217, 227, 82, 59, 16, 230, 35, 244, 192, 59, \r
+    16, 227, 217, 227, 83, 227, 154, 244, 43, 59, 16, 229, 112, 187, 59, 16, \r
+    231, 190, 251, 248, 59, 16, 231, 190, 251, 249, 231, 60, 255, 147, 59, \r
+    16, 231, 190, 251, 249, 244, 21, 255, 147, 59, 16, 231, 190, 251, 249, \r
+    251, 205, 255, 147, 59, 5, 227, 218, 232, 230, 227, 218, 248, 178, 59, 5, \r
+    227, 218, 232, 230, 244, 20, 59, 164, 251, 252, 224, 197, 244, 104, 233, \r
+    213, 227, 153, 59, 164, 233, 138, 217, 243, 244, 104, 233, 213, 227, 153, \r
+    59, 164, 231, 60, 221, 44, 59, 164, 66, 252, 12, 227, 77, 217, 243, 233, \r
+    213, 234, 27, 196, 59, 164, 250, 194, 252, 12, 227, 77, 217, 243, 233, \r
+    213, 225, 31, 196, 227, 108, 223, 38, 55, 235, 114, 223, 38, 55, 227, \r
+    108, 223, 38, 5, 2, 248, 143, 235, 114, 223, 38, 5, 2, 248, 143, 63, 1, \r
+    175, 63, 1, 236, 149, 63, 1, 245, 0, 63, 1, 244, 125, 63, 1, 232, 115, \r
+    63, 1, 251, 169, 63, 1, 251, 69, 63, 1, 237, 123, 63, 1, 237, 103, 63, 1, \r
+    231, 77, 63, 1, 231, 206, 63, 1, 221, 29, 63, 1, 221, 19, 63, 1, 249, \r
+    132, 63, 1, 249, 116, 63, 1, 231, 217, 63, 1, 222, 155, 63, 1, 222, 35, \r
+    63, 1, 249, 207, 63, 1, 249, 36, 63, 1, 208, 63, 1, 187, 63, 1, 229, 141, \r
+    63, 1, 252, 237, 63, 1, 252, 94, 63, 1, 196, 63, 1, 184, 63, 1, 203, 63, \r
+    1, 235, 188, 63, 1, 219, 7, 63, 1, 226, 177, 63, 1, 155, 63, 1, 235, 17, \r
+    63, 1, 60, 63, 1, 225, 10, 60, 63, 1, 72, 63, 1, 237, 255, 63, 1, 68, 63, \r
+    1, 220, 23, 63, 1, 73, 63, 1, 233, 128, 73, 63, 1, 74, 63, 1, 253, 232, \r
+    63, 29, 5, 222, 123, 255, 58, 63, 29, 5, 255, 58, 63, 29, 5, 72, 63, 29, \r
+    5, 237, 255, 63, 29, 5, 68, 63, 29, 5, 220, 23, 63, 29, 5, 73, 63, 29, 5, \r
+    254, 196, 63, 29, 5, 233, 128, 237, 255, 63, 29, 5, 233, 128, 74, 63, 29, \r
+    5, 178, 50, 63, 5, 254, 95, 63, 5, 61, 56, 63, 5, 219, 77, 63, 5, 219, \r
+    82, 63, 5, 254, 11, 63, 250, 147, 5, 128, 184, 63, 250, 147, 5, 128, 203, \r
+    63, 250, 147, 5, 128, 219, 7, 63, 250, 147, 5, 128, 155, 63, 1, 244, 32, \r
+    226, 177, 63, 20, 217, 84, 63, 20, 107, 63, 20, 103, 63, 20, 160, 63, 20, \r
+    154, 63, 20, 174, 63, 20, 182, 63, 20, 191, 63, 20, 185, 63, 20, 190, 63, \r
+    5, 235, 25, 226, 86, 63, 5, 226, 86, 63, 16, 235, 9, 63, 16, 250, 163, \r
+    63, 16, 254, 213, 63, 16, 244, 178, 63, 1, 225, 25, 63, 1, 223, 218, 63, \r
+    1, 167, 152, 63, 1, 167, 227, 53, 63, 1, 167, 153, 63, 1, 167, 235, 18, \r
+    63, 29, 5, 167, 152, 63, 29, 5, 167, 227, 53, 63, 29, 5, 167, 153, 63, \r
+    29, 5, 167, 235, 18, 63, 1, 233, 128, 232, 115, 63, 1, 233, 128, 237, \r
+    103, 63, 1, 233, 128, 252, 178, 63, 1, 233, 128, 252, 174, 63, 250, 147, \r
+    5, 233, 128, 128, 208, 63, 250, 147, 5, 233, 128, 128, 196, 63, 250, 147, \r
+    5, 233, 128, 128, 235, 188, 63, 1, 225, 30, 236, 213, 225, 25, 63, 29, 5, \r
+    225, 30, 236, 213, 246, 115, 63, 145, 164, 225, 30, 236, 213, 243, 170, \r
+    63, 145, 164, 225, 30, 236, 213, 236, 185, 229, 118, 63, 1, 218, 215, \r
+    228, 175, 236, 213, 222, 35, 63, 1, 218, 215, 228, 175, 236, 213, 228, \r
+    181, 63, 29, 5, 218, 215, 228, 175, 236, 213, 246, 115, 63, 29, 5, 218, \r
+    215, 228, 175, 236, 213, 220, 110, 63, 5, 218, 215, 228, 175, 236, 213, \r
+    221, 131, 63, 5, 218, 215, 228, 175, 236, 213, 221, 130, 63, 5, 218, 215, \r
+    228, 175, 236, 213, 221, 129, 63, 5, 218, 215, 228, 175, 236, 213, 221, \r
+    128, 63, 5, 218, 215, 228, 175, 236, 213, 221, 127, 63, 1, 247, 4, 228, \r
+    175, 236, 213, 231, 217, 63, 1, 247, 4, 228, 175, 236, 213, 217, 173, 63, \r
+    1, 247, 4, 228, 175, 236, 213, 244, 106, 63, 29, 5, 244, 188, 236, 213, \r
+    72, 63, 29, 5, 236, 190, 230, 167, 63, 29, 5, 236, 190, 68, 63, 29, 5, \r
+    236, 190, 246, 250, 63, 1, 225, 10, 175, 63, 1, 225, 10, 236, 149, 63, 1, \r
+    225, 10, 245, 0, 63, 1, 225, 10, 251, 169, 63, 1, 225, 10, 217, 114, 63, \r
+    1, 225, 10, 231, 77, 63, 1, 225, 10, 249, 207, 63, 1, 225, 10, 208, 63, \r
+    1, 225, 10, 229, 141, 63, 1, 225, 10, 246, 8, 63, 1, 225, 10, 252, 237, \r
+    63, 1, 225, 10, 222, 35, 63, 1, 225, 10, 155, 63, 250, 147, 5, 225, 10, \r
+    128, 219, 7, 63, 29, 5, 225, 10, 255, 58, 63, 29, 5, 225, 10, 73, 63, 29, \r
+    5, 225, 10, 178, 50, 63, 29, 5, 225, 10, 39, 218, 90, 63, 5, 225, 10, \r
+    221, 130, 63, 5, 225, 10, 221, 129, 63, 5, 225, 10, 221, 127, 63, 5, 225, \r
+    10, 221, 126, 63, 5, 225, 10, 250, 115, 221, 130, 63, 5, 225, 10, 250, \r
+    115, 221, 129, 63, 5, 225, 10, 250, 115, 246, 200, 221, 132, 63, 1, 227, \r
+    12, 230, 26, 246, 8, 63, 5, 227, 12, 230, 26, 221, 127, 63, 225, 10, 20, \r
+    217, 84, 63, 225, 10, 20, 107, 63, 225, 10, 20, 103, 63, 225, 10, 20, \r
+    160, 63, 225, 10, 20, 154, 63, 225, 10, 20, 174, 63, 225, 10, 20, 182, \r
+    63, 225, 10, 20, 191, 63, 225, 10, 20, 185, 63, 225, 10, 20, 190, 63, 5, \r
+    236, 143, 221, 131, 63, 5, 236, 143, 221, 129, 63, 29, 5, 254, 186, 60, \r
+    63, 29, 5, 254, 186, 254, 196, 63, 16, 225, 10, 107, 63, 16, 225, 10, \r
+    246, 94, 95, 6, 1, 254, 131, 95, 6, 1, 252, 209, 95, 6, 1, 244, 230, 95, \r
+    6, 1, 248, 153, 95, 6, 1, 246, 197, 95, 6, 1, 219, 85, 95, 6, 1, 217, 87, \r
+    95, 6, 1, 222, 119, 95, 6, 1, 237, 223, 95, 6, 1, 236, 233, 95, 6, 1, \r
+    235, 143, 95, 6, 1, 234, 86, 95, 6, 1, 232, 211, 95, 6, 1, 230, 138, 95, \r
+    6, 1, 229, 243, 95, 6, 1, 217, 76, 95, 6, 1, 227, 249, 95, 6, 1, 226, \r
+    140, 95, 6, 1, 222, 112, 95, 6, 1, 220, 87, 95, 6, 1, 229, 134, 95, 6, 1, \r
+    236, 138, 95, 6, 1, 244, 119, 95, 6, 1, 228, 140, 95, 6, 1, 224, 209, 95, \r
+    6, 1, 251, 22, 95, 6, 1, 251, 154, 95, 6, 1, 237, 91, 95, 6, 1, 250, 224, \r
+    95, 6, 1, 251, 56, 95, 6, 1, 218, 136, 95, 6, 1, 237, 101, 95, 6, 1, 243, \r
+    208, 95, 6, 1, 243, 162, 95, 6, 1, 243, 108, 95, 6, 1, 218, 227, 95, 6, \r
+    1, 243, 182, 95, 6, 1, 243, 2, 95, 1, 254, 131, 95, 1, 252, 209, 95, 1, \r
+    244, 230, 95, 1, 248, 153, 95, 1, 246, 197, 95, 1, 219, 85, 95, 1, 217, \r
+    87, 95, 1, 222, 119, 95, 1, 237, 223, 95, 1, 236, 233, 95, 1, 235, 143, \r
+    95, 1, 234, 86, 95, 1, 232, 211, 95, 1, 230, 138, 95, 1, 229, 243, 95, 1, \r
+    217, 76, 95, 1, 227, 249, 95, 1, 226, 140, 95, 1, 222, 112, 95, 1, 220, \r
+    87, 95, 1, 229, 134, 95, 1, 236, 138, 95, 1, 244, 119, 95, 1, 228, 140, \r
+    95, 1, 224, 209, 95, 1, 251, 22, 95, 1, 251, 154, 95, 1, 237, 91, 95, 1, \r
+    250, 224, 95, 1, 251, 56, 95, 1, 218, 136, 95, 1, 237, 101, 95, 1, 243, \r
+    208, 95, 1, 243, 162, 95, 1, 243, 108, 95, 1, 218, 227, 95, 1, 243, 182, \r
+    95, 1, 243, 2, 95, 1, 245, 203, 95, 1, 217, 233, 95, 1, 246, 210, 95, 1, \r
+    215, 244, 230, 95, 1, 254, 191, 95, 229, 241, 225, 54, 58, 1, 95, 232, \r
+    211, 22, 91, 236, 86, 22, 91, 223, 211, 22, 91, 232, 55, 22, 91, 221, \r
+    192, 22, 91, 223, 200, 22, 91, 227, 140, 22, 91, 233, 187, 22, 91, 229, \r
+    99, 22, 91, 223, 208, 22, 91, 224, 104, 22, 91, 223, 205, 22, 91, 238, \r
+    22, 22, 91, 250, 230, 22, 91, 223, 215, 22, 91, 251, 29, 22, 91, 236, \r
+    128, 22, 91, 222, 0, 22, 91, 229, 127, 22, 91, 243, 106, 22, 91, 232, 51, \r
+    22, 91, 223, 209, 22, 91, 232, 45, 22, 91, 232, 49, 22, 91, 221, 189, 22, \r
+    91, 227, 128, 22, 91, 223, 207, 22, 91, 227, 138, 22, 91, 236, 217, 22, \r
+    91, 233, 180, 22, 91, 236, 220, 22, 91, 229, 94, 22, 91, 229, 92, 22, 91, \r
+    229, 80, 22, 91, 229, 88, 22, 91, 229, 86, 22, 91, 229, 83, 22, 91, 229, \r
+    85, 22, 91, 229, 82, 22, 91, 229, 87, 22, 91, 229, 97, 22, 91, 229, 98, \r
+    22, 91, 229, 81, 22, 91, 229, 91, 22, 91, 236, 218, 22, 91, 236, 216, 22, \r
+    91, 224, 97, 22, 91, 224, 95, 22, 91, 224, 87, 22, 91, 224, 90, 22, 91, \r
+    224, 96, 22, 91, 224, 92, 22, 91, 224, 91, 22, 91, 224, 89, 22, 91, 224, \r
+    100, 22, 91, 224, 102, 22, 91, 224, 103, 22, 91, 224, 98, 22, 91, 224, \r
+    88, 22, 91, 224, 93, 22, 91, 224, 101, 22, 91, 251, 15, 22, 91, 251, 13, \r
+    22, 91, 251, 78, 22, 91, 251, 76, 22, 91, 230, 1, 22, 91, 238, 17, 22, \r
+    91, 238, 8, 22, 91, 238, 16, 22, 91, 238, 13, 22, 91, 238, 11, 22, 91, \r
+    238, 15, 22, 91, 223, 212, 22, 91, 238, 20, 22, 91, 238, 21, 22, 91, 238, \r
+    9, 22, 91, 238, 14, 22, 91, 218, 6, 22, 91, 250, 229, 22, 91, 251, 16, \r
+    22, 91, 251, 14, 22, 91, 251, 79, 22, 91, 251, 77, 22, 91, 251, 27, 22, \r
+    91, 251, 28, 22, 91, 251, 17, 22, 91, 251, 80, 22, 91, 229, 125, 22, 91, \r
+    236, 219, 22, 91, 223, 213, 22, 91, 218, 12, 22, 91, 236, 77, 22, 91, \r
+    232, 47, 22, 91, 232, 53, 22, 91, 232, 52, 22, 91, 221, 186, 22, 91, 245, \r
+    185, 22, 122, 245, 185, 22, 122, 60, 22, 122, 254, 234, 22, 122, 184, 22, \r
+    122, 218, 65, 22, 122, 246, 168, 22, 122, 73, 22, 122, 218, 16, 22, 122, \r
+    218, 25, 22, 122, 74, 22, 122, 219, 7, 22, 122, 219, 4, 22, 122, 230, \r
+    167, 22, 122, 217, 231, 22, 122, 68, 22, 122, 218, 219, 22, 122, 218, \r
+    227, 22, 122, 218, 204, 22, 122, 217, 200, 22, 122, 246, 115, 22, 122, \r
+    217, 250, 22, 122, 72, 22, 122, 255, 142, 22, 122, 255, 141, 22, 122, \r
+    218, 79, 22, 122, 218, 77, 22, 122, 246, 166, 22, 122, 246, 165, 22, 122, \r
+    246, 167, 22, 122, 218, 15, 22, 122, 218, 14, 22, 122, 231, 13, 22, 122, \r
+    231, 14, 22, 122, 231, 7, 22, 122, 231, 12, 22, 122, 231, 10, 22, 122, \r
+    217, 225, 22, 122, 217, 224, 22, 122, 217, 223, 22, 122, 217, 226, 22, \r
+    122, 217, 227, 22, 122, 220, 179, 22, 122, 220, 178, 22, 122, 220, 177, \r
+    22, 122, 220, 174, 22, 122, 220, 175, 22, 122, 217, 199, 22, 122, 217, \r
+    196, 22, 122, 217, 197, 22, 122, 217, 191, 22, 122, 217, 192, 22, 122, \r
+    217, 193, 22, 122, 217, 195, 22, 122, 246, 109, 22, 122, 246, 111, 22, \r
+    122, 217, 249, 22, 122, 242, 106, 22, 122, 242, 98, 22, 122, 242, 101, \r
+    22, 122, 242, 99, 22, 122, 242, 103, 22, 122, 242, 105, 22, 122, 254, 60, \r
+    22, 122, 254, 57, 22, 122, 254, 55, 22, 122, 254, 56, 22, 122, 223, 216, \r
+    22, 122, 255, 143, 22, 122, 218, 78, 22, 122, 218, 13, 22, 122, 231, 9, \r
+    22, 122, 231, 8, 22, 85, 236, 86, 22, 85, 223, 211, 22, 85, 236, 79, 22, \r
+    85, 232, 55, 22, 85, 232, 53, 22, 85, 232, 52, 22, 85, 221, 192, 22, 85, \r
+    227, 140, 22, 85, 227, 135, 22, 85, 227, 132, 22, 85, 227, 125, 22, 85, \r
+    227, 120, 22, 85, 227, 115, 22, 85, 227, 126, 22, 85, 227, 138, 22, 85, \r
+    233, 187, 22, 85, 229, 99, 22, 85, 229, 88, 22, 85, 224, 104, 22, 85, \r
+    223, 205, 22, 85, 238, 22, 22, 85, 250, 230, 22, 85, 251, 29, 22, 85, \r
+    236, 128, 22, 85, 222, 0, 22, 85, 229, 127, 22, 85, 243, 106, 22, 85, \r
+    236, 80, 22, 85, 236, 78, 22, 85, 232, 51, 22, 85, 232, 45, 22, 85, 232, \r
+    47, 22, 85, 232, 50, 22, 85, 232, 46, 22, 85, 221, 189, 22, 85, 221, 186, \r
+    22, 85, 227, 133, 22, 85, 227, 128, 22, 85, 227, 114, 22, 85, 227, 113, \r
+    22, 85, 223, 207, 22, 85, 227, 130, 22, 85, 227, 129, 22, 85, 227, 122, \r
+    22, 85, 227, 124, 22, 85, 227, 137, 22, 85, 227, 117, 22, 85, 227, 127, \r
+    22, 85, 227, 136, 22, 85, 227, 112, 22, 85, 233, 183, 22, 85, 233, 178, \r
+    22, 85, 233, 180, 22, 85, 233, 177, 22, 85, 233, 175, 22, 85, 233, 181, \r
+    22, 85, 233, 186, 22, 85, 233, 184, 22, 85, 236, 220, 22, 85, 229, 90, \r
+    22, 85, 229, 91, 22, 85, 229, 96, 22, 85, 236, 218, 22, 85, 224, 97, 22, \r
+    85, 224, 87, 22, 85, 224, 90, 22, 85, 224, 92, 22, 85, 230, 1, 22, 85, \r
+    238, 17, 22, 85, 238, 10, 22, 85, 223, 212, 22, 85, 238, 18, 22, 85, 218, \r
+    6, 22, 85, 218, 2, 22, 85, 218, 3, 22, 85, 229, 125, 22, 85, 236, 219, \r
+    22, 85, 243, 104, 22, 85, 243, 102, 22, 85, 243, 105, 22, 85, 243, 103, \r
+    22, 85, 218, 12, 22, 85, 236, 82, 22, 85, 236, 81, 22, 85, 236, 85, 22, \r
+    85, 236, 83, 22, 85, 236, 84, 22, 85, 223, 209, 28, 4, 155, 28, 4, 242, \r
+    173, 28, 4, 243, 112, 28, 4, 243, 211, 28, 4, 243, 148, 28, 4, 243, 162, \r
+    28, 4, 243, 4, 28, 4, 243, 3, 28, 4, 235, 188, 28, 4, 234, 231, 28, 4, \r
+    235, 67, 28, 4, 235, 187, 28, 4, 235, 118, 28, 4, 235, 122, 28, 4, 235, \r
+    12, 28, 4, 234, 206, 28, 4, 243, 121, 28, 4, 243, 115, 28, 4, 243, 117, \r
+    28, 4, 243, 120, 28, 4, 243, 118, 28, 4, 243, 119, 28, 4, 243, 116, 28, \r
+    4, 243, 114, 28, 4, 196, 28, 4, 233, 99, 28, 4, 233, 196, 28, 4, 234, \r
+    118, 28, 4, 234, 16, 28, 4, 234, 25, 28, 4, 233, 136, 28, 4, 233, 49, 28, \r
+    4, 222, 212, 28, 4, 222, 206, 28, 4, 222, 208, 28, 4, 222, 211, 28, 4, \r
+    222, 209, 28, 4, 222, 210, 28, 4, 222, 207, 28, 4, 222, 205, 28, 4, 203, \r
+    28, 4, 227, 22, 28, 4, 227, 147, 28, 4, 228, 0, 28, 4, 227, 200, 28, 4, \r
+    227, 216, 28, 4, 227, 75, 28, 4, 226, 252, 28, 4, 226, 177, 28, 4, 223, \r
+    103, 28, 4, 224, 140, 28, 4, 226, 175, 28, 4, 226, 84, 28, 4, 226, 94, \r
+    28, 4, 224, 26, 28, 4, 223, 36, 28, 4, 225, 25, 28, 4, 224, 170, 28, 4, \r
+    224, 221, 28, 4, 225, 21, 28, 4, 224, 244, 28, 4, 224, 246, 28, 4, 224, \r
+    200, 28, 4, 224, 157, 28, 4, 228, 155, 28, 4, 228, 98, 28, 4, 228, 121, \r
+    28, 4, 228, 154, 28, 4, 228, 135, 28, 4, 228, 136, 28, 4, 228, 110, 28, \r
+    4, 228, 109, 28, 4, 228, 57, 28, 4, 228, 53, 28, 4, 228, 56, 28, 4, 228, \r
+    54, 28, 4, 228, 55, 28, 4, 228, 133, 28, 4, 228, 127, 28, 4, 228, 129, \r
+    28, 4, 228, 132, 28, 4, 228, 130, 28, 4, 228, 131, 28, 4, 228, 128, 28, \r
+    4, 228, 126, 28, 4, 228, 122, 28, 4, 228, 125, 28, 4, 228, 123, 28, 4, \r
+    228, 124, 28, 4, 252, 237, 28, 4, 251, 248, 28, 4, 252, 84, 28, 4, 252, \r
+    236, 28, 4, 252, 137, 28, 4, 252, 144, 28, 4, 252, 41, 28, 4, 251, 218, \r
+    28, 4, 219, 189, 28, 4, 219, 56, 28, 4, 219, 94, 28, 4, 219, 188, 28, 4, \r
+    219, 160, 28, 4, 219, 165, 28, 4, 219, 72, 28, 4, 219, 49, 28, 4, 222, \r
+    155, 28, 4, 221, 0, 28, 4, 221, 205, 28, 4, 222, 152, 28, 4, 222, 80, 28, \r
+    4, 222, 87, 28, 4, 101, 28, 4, 220, 225, 28, 4, 251, 169, 28, 4, 250, 92, \r
+    28, 4, 250, 235, 28, 4, 251, 168, 28, 4, 251, 91, 28, 4, 251, 99, 28, 4, \r
+    250, 182, 28, 4, 250, 66, 28, 4, 218, 138, 28, 4, 218, 114, 28, 4, 218, \r
+    130, 28, 4, 218, 137, 28, 4, 218, 134, 28, 4, 218, 135, 28, 4, 218, 121, \r
+    28, 4, 218, 120, 28, 4, 218, 109, 28, 4, 218, 105, 28, 4, 218, 108, 28, \r
+    4, 218, 106, 28, 4, 218, 107, 28, 4, 208, 28, 4, 231, 144, 28, 4, 232, \r
+    62, 28, 4, 232, 235, 28, 4, 232, 139, 28, 4, 232, 141, 28, 4, 231, 204, \r
+    28, 4, 231, 85, 28, 4, 231, 77, 28, 4, 231, 50, 28, 4, 231, 67, 28, 4, \r
+    231, 76, 28, 4, 231, 72, 28, 4, 231, 73, 28, 4, 231, 56, 28, 4, 231, 43, \r
+    28, 4, 244, 73, 60, 28, 4, 244, 73, 68, 28, 4, 244, 73, 72, 28, 4, 244, \r
+    73, 255, 58, 28, 4, 244, 73, 246, 250, 28, 4, 244, 73, 73, 28, 4, 244, \r
+    73, 74, 28, 4, 244, 73, 219, 7, 28, 4, 175, 28, 4, 236, 7, 28, 4, 236, \r
+    113, 28, 4, 237, 5, 28, 4, 236, 183, 28, 4, 236, 184, 28, 4, 236, 57, 28, \r
+    4, 236, 56, 28, 4, 235, 234, 28, 4, 235, 229, 28, 4, 235, 233, 28, 4, \r
+    235, 230, 28, 4, 235, 231, 28, 4, 235, 224, 28, 4, 235, 218, 28, 4, 235, \r
+    220, 28, 4, 235, 223, 28, 4, 235, 221, 28, 4, 235, 222, 28, 4, 235, 219, \r
+    28, 4, 235, 217, 28, 4, 235, 213, 28, 4, 235, 216, 28, 4, 235, 214, 28, \r
+    4, 235, 215, 28, 4, 219, 7, 28, 4, 218, 165, 28, 4, 218, 204, 28, 4, 219, \r
+    6, 28, 4, 218, 224, 28, 4, 218, 227, 28, 4, 218, 187, 28, 4, 218, 186, \r
+    28, 4, 229, 133, 60, 28, 4, 229, 133, 68, 28, 4, 229, 133, 72, 28, 4, \r
+    229, 133, 255, 58, 28, 4, 229, 133, 246, 250, 28, 4, 229, 133, 73, 28, 4, \r
+    229, 133, 74, 28, 4, 217, 114, 28, 4, 217, 13, 28, 4, 217, 42, 28, 4, \r
+    217, 113, 28, 4, 217, 90, 28, 4, 217, 92, 28, 4, 217, 21, 28, 4, 217, 0, \r
+    28, 4, 217, 80, 28, 4, 217, 60, 28, 4, 217, 67, 28, 4, 217, 79, 28, 4, \r
+    217, 71, 28, 4, 217, 72, 28, 4, 217, 65, 28, 4, 217, 51, 28, 4, 184, 28, \r
+    4, 217, 200, 28, 4, 217, 250, 28, 4, 218, 76, 28, 4, 218, 22, 28, 4, 218, \r
+    25, 28, 4, 217, 231, 28, 4, 217, 222, 28, 4, 249, 207, 28, 4, 247, 111, \r
+    28, 4, 249, 15, 28, 4, 249, 206, 28, 4, 249, 82, 28, 4, 249, 92, 28, 4, \r
+    248, 167, 28, 4, 247, 83, 28, 4, 249, 132, 28, 4, 249, 102, 28, 4, 249, \r
+    114, 28, 4, 249, 131, 28, 4, 249, 119, 28, 4, 249, 120, 28, 4, 249, 107, \r
+    28, 4, 249, 93, 28, 4, 237, 123, 28, 4, 237, 43, 28, 4, 237, 98, 28, 4, \r
+    237, 122, 28, 4, 237, 113, 28, 4, 237, 114, 28, 4, 237, 59, 28, 4, 237, \r
+    25, 28, 4, 245, 0, 28, 4, 244, 17, 28, 4, 244, 103, 28, 4, 244, 253, 28, \r
+    4, 244, 184, 28, 4, 244, 191, 28, 4, 244, 68, 28, 4, 244, 67, 28, 4, 243, \r
+    243, 28, 4, 243, 239, 28, 4, 243, 242, 28, 4, 243, 240, 28, 4, 243, 241, \r
+    28, 4, 244, 160, 28, 4, 244, 140, 28, 4, 244, 150, 28, 4, 244, 159, 28, \r
+    4, 244, 154, 28, 4, 244, 155, 28, 4, 244, 144, 28, 4, 244, 129, 28, 4, \r
+    222, 35, 28, 4, 221, 223, 28, 4, 222, 2, 28, 4, 222, 34, 28, 4, 222, 21, \r
+    28, 4, 222, 22, 28, 4, 221, 239, 28, 4, 221, 216, 28, 4, 251, 69, 28, 4, \r
+    250, 253, 28, 4, 251, 31, 28, 4, 251, 68, 28, 4, 251, 43, 28, 4, 251, 46, \r
+    28, 4, 251, 11, 28, 4, 250, 242, 28, 4, 229, 141, 28, 4, 229, 114, 28, 4, \r
+    229, 129, 28, 4, 229, 140, 28, 4, 229, 131, 28, 4, 229, 132, 28, 4, 229, \r
+    118, 28, 4, 229, 110, 28, 4, 221, 55, 28, 4, 221, 36, 28, 4, 221, 39, 28, \r
+    4, 221, 54, 28, 4, 221, 49, 28, 4, 221, 50, 28, 4, 221, 38, 28, 4, 221, \r
+    34, 28, 4, 220, 188, 28, 4, 220, 180, 28, 4, 220, 184, 28, 4, 220, 187, \r
+    28, 4, 220, 185, 28, 4, 220, 186, 28, 4, 220, 182, 28, 4, 220, 181, 28, \r
+    4, 246, 8, 28, 4, 245, 92, 28, 4, 245, 203, 28, 4, 246, 7, 28, 4, 245, \r
+    226, 28, 4, 245, 231, 28, 4, 245, 139, 28, 4, 245, 78, 28, 4, 187, 28, 4, \r
+    228, 202, 28, 4, 229, 108, 28, 4, 230, 43, 28, 4, 229, 191, 28, 4, 229, \r
+    198, 28, 4, 229, 37, 28, 4, 228, 181, 28, 4, 226, 242, 28, 4, 233, 39, \r
+    28, 4, 245, 72, 28, 36, 244, 183, 78, 28, 226, 87, 78, 28, 218, 173, 28, \r
+    245, 90, 223, 136, 28, 250, 168, 28, 225, 67, 28, 250, 175, 28, 228, 242, \r
+    250, 175, 28, 228, 82, 78, 28, 229, 241, 225, 54, 28, 20, 107, 28, 20, \r
+    103, 28, 20, 160, 28, 20, 154, 28, 20, 174, 28, 20, 182, 28, 20, 191, 28, \r
+    20, 185, 28, 20, 190, 28, 54, 222, 65, 28, 54, 220, 219, 28, 54, 221, \r
+    245, 28, 54, 245, 119, 28, 54, 245, 196, 28, 54, 224, 69, 28, 54, 225, \r
+    38, 28, 54, 246, 227, 28, 54, 232, 27, 28, 54, 242, 161, 28, 54, 222, 66, \r
+    221, 231, 28, 4, 226, 91, 233, 49, 28, 4, 233, 45, 28, 4, 233, 46, 28, 4, \r
+    233, 47, 28, 4, 226, 91, 251, 218, 28, 4, 251, 215, 28, 4, 251, 216, 28, \r
+    4, 251, 217, 28, 4, 226, 91, 245, 78, 28, 4, 245, 74, 28, 4, 245, 75, 28, \r
+    4, 245, 76, 28, 4, 226, 91, 228, 181, 28, 4, 228, 177, 28, 4, 228, 178, \r
+    28, 4, 228, 179, 28, 221, 133, 164, 217, 234, 28, 221, 133, 164, 249, 50, \r
+    28, 221, 133, 164, 227, 97, 28, 221, 133, 164, 224, 192, 227, 97, 28, \r
+    221, 133, 164, 248, 248, 28, 221, 133, 164, 236, 167, 28, 221, 133, 164, \r
+    251, 19, 28, 221, 133, 164, 243, 110, 28, 221, 133, 164, 249, 49, 28, \r
+    221, 133, 164, 235, 245, 143, 1, 60, 143, 1, 73, 143, 1, 72, 143, 1, 74, \r
+    143, 1, 68, 143, 1, 216, 216, 143, 1, 245, 0, 143, 1, 175, 143, 1, 244, \r
+    191, 143, 1, 244, 103, 143, 1, 244, 68, 143, 1, 244, 17, 143, 1, 243, \r
+    244, 143, 1, 155, 143, 1, 243, 162, 143, 1, 243, 112, 143, 1, 243, 4, \r
+    143, 1, 242, 173, 143, 1, 242, 154, 143, 1, 235, 188, 143, 1, 235, 122, \r
+    143, 1, 235, 67, 143, 1, 235, 12, 143, 1, 234, 231, 143, 1, 234, 207, \r
+    143, 1, 196, 143, 1, 234, 25, 143, 1, 233, 196, 143, 1, 233, 136, 143, 1, \r
+    233, 99, 143, 1, 208, 143, 1, 243, 26, 143, 1, 232, 224, 143, 1, 232, \r
+    141, 143, 1, 232, 62, 143, 1, 231, 204, 143, 1, 231, 144, 143, 1, 231, \r
+    87, 143, 1, 228, 97, 143, 1, 228, 84, 143, 1, 228, 78, 143, 1, 228, 72, \r
+    143, 1, 228, 61, 143, 1, 228, 59, 143, 1, 226, 177, 143, 1, 198, 143, 1, \r
+    226, 94, 143, 1, 224, 140, 143, 1, 224, 26, 143, 1, 223, 103, 143, 1, \r
+    223, 41, 143, 1, 249, 207, 143, 1, 222, 155, 143, 1, 249, 92, 143, 1, \r
+    222, 87, 143, 1, 249, 15, 143, 1, 221, 205, 143, 1, 248, 167, 143, 1, \r
+    247, 111, 143, 1, 247, 85, 143, 1, 248, 176, 143, 1, 221, 155, 143, 1, \r
+    221, 154, 143, 1, 221, 144, 143, 1, 221, 143, 143, 1, 221, 142, 143, 1, \r
+    221, 141, 143, 1, 221, 55, 143, 1, 221, 50, 143, 1, 221, 39, 143, 1, 221, \r
+    38, 143, 1, 221, 36, 143, 1, 221, 35, 143, 1, 219, 7, 143, 1, 218, 227, \r
+    143, 1, 218, 204, 143, 1, 218, 187, 143, 1, 218, 165, 143, 1, 218, 156, \r
+    143, 1, 184, 143, 1, 218, 25, 143, 1, 217, 250, 143, 1, 217, 231, 143, 1, \r
+    217, 200, 143, 1, 217, 174, 18, 19, 242, 121, 18, 19, 73, 18, 19, 255, \r
+    22, 18, 19, 72, 18, 19, 237, 255, 18, 19, 74, 18, 19, 230, 127, 18, 19, \r
+    218, 89, 230, 127, 18, 19, 64, 246, 250, 18, 19, 64, 72, 18, 19, 60, 18, \r
+    19, 255, 58, 18, 19, 218, 227, 18, 19, 137, 218, 227, 18, 19, 218, 204, \r
+    18, 19, 137, 218, 204, 18, 19, 218, 196, 18, 19, 137, 218, 196, 18, 19, \r
+    218, 187, 18, 19, 137, 218, 187, 18, 19, 218, 180, 18, 19, 137, 218, 180, \r
+    18, 19, 232, 207, 218, 180, 18, 19, 219, 7, 18, 19, 137, 219, 7, 18, 19, \r
+    219, 6, 18, 19, 137, 219, 6, 18, 19, 232, 207, 219, 6, 18, 19, 254, 196, \r
+    18, 19, 218, 89, 219, 40, 18, 19, 244, 73, 223, 136, 18, 19, 39, 168, 18, \r
+    19, 39, 244, 36, 18, 19, 39, 252, 29, 144, 227, 93, 18, 19, 39, 221, 120, \r
+    144, 227, 93, 18, 19, 39, 45, 144, 227, 93, 18, 19, 39, 227, 93, 18, 19, \r
+    39, 51, 168, 18, 19, 39, 51, 224, 192, 69, 223, 107, 18, 19, 39, 233, \r
+    193, 248, 145, 18, 19, 39, 224, 192, 186, 92, 18, 19, 39, 229, 43, 18, \r
+    19, 39, 113, 222, 143, 18, 19, 246, 197, 18, 19, 237, 223, 18, 19, 230, \r
+    138, 18, 19, 254, 131, 18, 19, 229, 198, 18, 19, 230, 41, 18, 19, 229, \r
+    108, 18, 19, 229, 76, 18, 19, 229, 37, 18, 19, 229, 21, 18, 19, 218, 89, \r
+    229, 21, 18, 19, 64, 243, 148, 18, 19, 64, 243, 112, 18, 19, 187, 18, 19, \r
+    230, 43, 18, 19, 228, 179, 18, 19, 137, 228, 179, 18, 19, 228, 177, 18, \r
+    19, 137, 228, 177, 18, 19, 228, 176, 18, 19, 137, 228, 176, 18, 19, 228, \r
+    174, 18, 19, 137, 228, 174, 18, 19, 228, 173, 18, 19, 137, 228, 173, 18, \r
+    19, 228, 181, 18, 19, 137, 228, 181, 18, 19, 228, 180, 18, 19, 137, 228, \r
+    180, 18, 19, 218, 89, 228, 180, 18, 19, 230, 59, 18, 19, 137, 230, 59, \r
+    18, 19, 64, 243, 225, 18, 19, 222, 87, 18, 19, 222, 150, 18, 19, 221, \r
+    205, 18, 19, 221, 194, 18, 19, 101, 18, 19, 221, 122, 18, 19, 218, 89, \r
+    221, 122, 18, 19, 64, 249, 82, 18, 19, 64, 249, 15, 18, 19, 222, 155, 18, \r
+    19, 222, 152, 18, 19, 220, 223, 18, 19, 137, 220, 223, 18, 19, 220, 208, \r
+    18, 19, 137, 220, 208, 18, 19, 220, 207, 18, 19, 137, 220, 207, 18, 19, \r
+    103, 18, 19, 137, 103, 18, 19, 220, 203, 18, 19, 137, 220, 203, 18, 19, \r
+    220, 225, 18, 19, 137, 220, 225, 18, 19, 220, 224, 18, 19, 137, 220, 224, \r
+    18, 19, 232, 207, 220, 224, 18, 19, 222, 201, 18, 19, 221, 26, 18, 19, \r
+    221, 12, 18, 19, 221, 11, 18, 19, 221, 29, 18, 19, 236, 184, 18, 19, 237, \r
+    2, 18, 19, 236, 113, 18, 19, 236, 105, 18, 19, 236, 57, 18, 19, 236, 41, \r
+    18, 19, 218, 89, 236, 41, 18, 19, 175, 18, 19, 237, 5, 18, 19, 235, 231, \r
+    18, 19, 137, 235, 231, 18, 19, 235, 229, 18, 19, 137, 235, 229, 18, 19, \r
+    235, 228, 18, 19, 137, 235, 228, 18, 19, 235, 227, 18, 19, 137, 235, 227, \r
+    18, 19, 235, 226, 18, 19, 137, 235, 226, 18, 19, 235, 234, 18, 19, 137, \r
+    235, 234, 18, 19, 235, 233, 18, 19, 137, 235, 233, 18, 19, 232, 207, 235, \r
+    233, 18, 19, 237, 17, 18, 19, 235, 235, 18, 19, 224, 5, 236, 178, 18, 19, \r
+    224, 5, 236, 106, 18, 19, 224, 5, 236, 53, 18, 19, 224, 5, 236, 245, 18, \r
+    19, 251, 99, 18, 19, 251, 167, 18, 19, 250, 235, 18, 19, 250, 225, 18, \r
+    19, 250, 182, 18, 19, 250, 130, 18, 19, 218, 89, 250, 130, 18, 19, 251, \r
+    169, 18, 19, 251, 168, 18, 19, 250, 64, 18, 19, 137, 250, 64, 18, 19, \r
+    250, 62, 18, 19, 137, 250, 62, 18, 19, 250, 61, 18, 19, 137, 250, 61, 18, \r
+    19, 250, 60, 18, 19, 137, 250, 60, 18, 19, 250, 59, 18, 19, 137, 250, 59, \r
+    18, 19, 250, 66, 18, 19, 137, 250, 66, 18, 19, 250, 65, 18, 19, 137, 250, \r
+    65, 18, 19, 232, 207, 250, 65, 18, 19, 251, 202, 18, 19, 226, 116, 222, \r
+    37, 18, 19, 234, 25, 18, 19, 234, 117, 18, 19, 233, 196, 18, 19, 233, \r
+    171, 18, 19, 233, 136, 18, 19, 233, 119, 18, 19, 218, 89, 233, 119, 18, \r
+    19, 196, 18, 19, 234, 118, 18, 19, 233, 47, 18, 19, 137, 233, 47, 18, 19, \r
+    233, 45, 18, 19, 137, 233, 45, 18, 19, 233, 44, 18, 19, 137, 233, 44, 18, \r
+    19, 233, 43, 18, 19, 137, 233, 43, 18, 19, 233, 42, 18, 19, 137, 233, 42, \r
+    18, 19, 233, 49, 18, 19, 137, 233, 49, 18, 19, 233, 48, 18, 19, 137, 233, \r
+    48, 18, 19, 232, 207, 233, 48, 18, 19, 189, 18, 19, 137, 189, 18, 19, \r
+    233, 199, 18, 19, 253, 243, 189, 18, 19, 226, 116, 189, 18, 19, 232, 141, \r
+    18, 19, 232, 234, 18, 19, 232, 62, 18, 19, 232, 38, 18, 19, 231, 204, 18, \r
+    19, 231, 195, 18, 19, 218, 89, 231, 195, 18, 19, 208, 18, 19, 232, 235, \r
+    18, 19, 231, 83, 18, 19, 137, 231, 83, 18, 19, 231, 85, 18, 19, 137, 231, \r
+    85, 18, 19, 231, 84, 18, 19, 137, 231, 84, 18, 19, 232, 207, 231, 84, 18, \r
+    19, 207, 18, 19, 64, 232, 117, 18, 19, 232, 67, 18, 19, 235, 122, 18, 19, \r
+    235, 186, 18, 19, 235, 67, 18, 19, 235, 55, 18, 19, 235, 12, 18, 19, 234, \r
+    248, 18, 19, 218, 89, 234, 248, 18, 19, 235, 188, 18, 19, 235, 187, 18, \r
+    19, 234, 204, 18, 19, 137, 234, 204, 18, 19, 234, 203, 18, 19, 137, 234, \r
+    203, 18, 19, 234, 202, 18, 19, 137, 234, 202, 18, 19, 234, 201, 18, 19, \r
+    137, 234, 201, 18, 19, 234, 200, 18, 19, 137, 234, 200, 18, 19, 234, 206, \r
+    18, 19, 137, 234, 206, 18, 19, 234, 205, 18, 19, 137, 234, 205, 18, 19, \r
+    153, 18, 19, 137, 153, 18, 19, 128, 153, 18, 19, 226, 94, 18, 19, 226, \r
+    173, 18, 19, 224, 140, 18, 19, 224, 125, 18, 19, 224, 26, 18, 19, 224, \r
+    14, 18, 19, 218, 89, 224, 14, 18, 19, 226, 177, 18, 19, 226, 175, 18, 19, \r
+    223, 32, 18, 19, 137, 223, 32, 18, 19, 223, 29, 18, 19, 137, 223, 29, 18, \r
+    19, 223, 28, 18, 19, 137, 223, 28, 18, 19, 223, 27, 18, 19, 137, 223, 27, \r
+    18, 19, 223, 26, 18, 19, 137, 223, 26, 18, 19, 223, 36, 18, 19, 137, 223, \r
+    36, 18, 19, 223, 35, 18, 19, 137, 223, 35, 18, 19, 232, 207, 223, 35, 18, \r
+    19, 198, 18, 19, 253, 243, 198, 18, 19, 223, 37, 18, 19, 252, 50, 198, \r
+    18, 19, 233, 116, 224, 66, 18, 19, 232, 207, 224, 59, 18, 19, 232, 207, \r
+    226, 233, 18, 19, 232, 207, 223, 228, 18, 19, 232, 207, 223, 105, 18, 19, \r
+    232, 207, 224, 58, 18, 19, 232, 207, 226, 97, 18, 19, 224, 246, 18, 19, \r
+    224, 221, 18, 19, 224, 216, 18, 19, 224, 200, 18, 19, 224, 195, 18, 19, \r
+    225, 25, 18, 19, 225, 21, 18, 19, 224, 155, 18, 19, 137, 224, 155, 18, \r
+    19, 224, 154, 18, 19, 137, 224, 154, 18, 19, 224, 153, 18, 19, 137, 224, \r
+    153, 18, 19, 224, 152, 18, 19, 137, 224, 152, 18, 19, 224, 151, 18, 19, \r
+    137, 224, 151, 18, 19, 224, 157, 18, 19, 137, 224, 157, 18, 19, 224, 156, \r
+    18, 19, 137, 224, 156, 18, 19, 225, 27, 18, 19, 218, 25, 18, 19, 218, 74, \r
+    18, 19, 217, 250, 18, 19, 217, 242, 18, 19, 217, 231, 18, 19, 217, 216, \r
+    18, 19, 218, 89, 217, 216, 18, 19, 184, 18, 19, 218, 76, 18, 19, 217, \r
+    171, 18, 19, 137, 217, 171, 18, 19, 217, 170, 18, 19, 137, 217, 170, 18, \r
+    19, 217, 169, 18, 19, 137, 217, 169, 18, 19, 217, 168, 18, 19, 137, 217, \r
+    168, 18, 19, 217, 167, 18, 19, 137, 217, 167, 18, 19, 217, 173, 18, 19, \r
+    137, 217, 173, 18, 19, 217, 172, 18, 19, 137, 217, 172, 18, 19, 232, 207, \r
+    217, 172, 18, 19, 218, 90, 18, 19, 252, 82, 218, 90, 18, 19, 137, 218, \r
+    90, 18, 19, 226, 116, 217, 250, 18, 19, 227, 216, 18, 19, 228, 38, 227, \r
+    216, 18, 19, 137, 235, 122, 18, 19, 227, 255, 18, 19, 227, 147, 18, 19, \r
+    227, 98, 18, 19, 227, 75, 18, 19, 227, 67, 18, 19, 137, 235, 12, 18, 19, \r
+    203, 18, 19, 228, 0, 18, 19, 137, 235, 188, 18, 19, 226, 251, 18, 19, \r
+    137, 226, 251, 18, 19, 152, 18, 19, 137, 152, 18, 19, 128, 152, 18, 19, \r
+    245, 231, 18, 19, 246, 5, 18, 19, 245, 203, 18, 19, 245, 190, 18, 19, \r
+    245, 139, 18, 19, 245, 134, 18, 19, 246, 8, 18, 19, 246, 7, 18, 19, 245, \r
+    77, 18, 19, 137, 245, 77, 18, 19, 246, 74, 18, 19, 222, 22, 18, 19, 233, \r
+    32, 222, 22, 18, 19, 222, 2, 18, 19, 233, 32, 222, 2, 18, 19, 221, 254, \r
+    18, 19, 233, 32, 221, 254, 18, 19, 221, 239, 18, 19, 221, 236, 18, 19, \r
+    222, 35, 18, 19, 222, 34, 18, 19, 221, 215, 18, 19, 137, 221, 215, 18, \r
+    19, 222, 37, 18, 19, 221, 17, 18, 19, 221, 16, 18, 19, 221, 15, 18, 19, \r
+    221, 19, 18, 19, 221, 20, 18, 19, 220, 201, 18, 19, 220, 200, 18, 19, \r
+    220, 199, 18, 19, 220, 202, 18, 19, 231, 102, 243, 162, 18, 19, 231, 102, \r
+    243, 112, 18, 19, 231, 102, 243, 97, 18, 19, 231, 102, 243, 4, 18, 19, \r
+    231, 102, 242, 248, 18, 19, 231, 102, 155, 18, 19, 231, 102, 243, 211, \r
+    18, 19, 231, 102, 243, 225, 18, 19, 231, 101, 243, 225, 18, 19, 243, 90, \r
+    18, 19, 228, 151, 18, 19, 228, 121, 18, 19, 228, 116, 18, 19, 228, 110, \r
+    18, 19, 228, 105, 18, 19, 228, 155, 18, 19, 228, 154, 18, 19, 228, 163, \r
+    18, 19, 221, 151, 18, 19, 221, 149, 18, 19, 221, 148, 18, 19, 221, 152, \r
+    18, 19, 137, 227, 216, 18, 19, 137, 227, 147, 18, 19, 137, 227, 75, 18, \r
+    19, 137, 203, 18, 19, 232, 113, 18, 19, 232, 92, 18, 19, 232, 88, 18, 19, \r
+    232, 84, 18, 19, 232, 80, 18, 19, 232, 115, 18, 19, 232, 114, 18, 19, \r
+    232, 117, 18, 19, 231, 215, 18, 19, 226, 116, 224, 246, 18, 19, 226, 116, \r
+    224, 221, 18, 19, 226, 116, 224, 200, 18, 19, 226, 116, 225, 25, 18, 19, \r
+    218, 178, 222, 22, 18, 19, 218, 178, 222, 2, 18, 19, 218, 178, 221, 239, \r
+    18, 19, 218, 178, 222, 35, 18, 19, 218, 178, 222, 37, 18, 19, 235, 73, \r
+    18, 19, 235, 72, 18, 19, 235, 71, 18, 19, 235, 70, 18, 19, 235, 79, 18, \r
+    19, 235, 78, 18, 19, 235, 80, 18, 19, 222, 36, 222, 22, 18, 19, 222, 36, \r
+    222, 2, 18, 19, 222, 36, 221, 254, 18, 19, 222, 36, 221, 239, 18, 19, \r
+    222, 36, 221, 236, 18, 19, 222, 36, 222, 35, 18, 19, 222, 36, 222, 34, \r
+    18, 19, 222, 36, 222, 37, 18, 19, 254, 185, 253, 204, 18, 19, 252, 50, \r
+    73, 18, 19, 252, 50, 72, 18, 19, 252, 50, 74, 18, 19, 252, 50, 60, 18, \r
+    19, 252, 50, 218, 227, 18, 19, 252, 50, 218, 204, 18, 19, 252, 50, 218, \r
+    187, 18, 19, 252, 50, 219, 7, 18, 19, 252, 50, 232, 141, 18, 19, 252, 50, \r
+    232, 62, 18, 19, 252, 50, 231, 204, 18, 19, 252, 50, 208, 18, 19, 252, \r
+    50, 236, 184, 18, 19, 252, 50, 236, 113, 18, 19, 252, 50, 236, 57, 18, \r
+    19, 252, 50, 175, 18, 19, 226, 116, 243, 162, 18, 19, 226, 116, 243, 112, \r
+    18, 19, 226, 116, 243, 4, 18, 19, 226, 116, 155, 18, 19, 64, 244, 109, \r
+    18, 19, 64, 244, 112, 18, 19, 64, 244, 116, 18, 19, 64, 244, 115, 18, 19, \r
+    64, 244, 113, 18, 19, 64, 244, 125, 18, 19, 64, 227, 22, 18, 19, 64, 227, \r
+    75, 18, 19, 64, 227, 216, 18, 19, 64, 227, 200, 18, 19, 64, 227, 147, 18, \r
+    19, 64, 203, 18, 19, 64, 218, 165, 18, 19, 64, 218, 187, 18, 19, 64, 218, \r
+    227, 18, 19, 64, 218, 224, 18, 19, 64, 218, 204, 18, 19, 64, 219, 7, 18, \r
+    19, 64, 242, 147, 18, 19, 64, 242, 148, 18, 19, 64, 242, 151, 18, 19, 64, \r
+    242, 150, 18, 19, 64, 242, 149, 18, 19, 64, 242, 153, 18, 19, 64, 221, \r
+    223, 18, 19, 64, 221, 239, 18, 19, 64, 222, 22, 18, 19, 64, 222, 21, 18, \r
+    19, 64, 222, 2, 18, 19, 64, 222, 35, 18, 19, 64, 221, 3, 18, 19, 64, 221, \r
+    11, 18, 19, 64, 221, 26, 18, 19, 64, 221, 25, 18, 19, 64, 221, 12, 18, \r
+    19, 64, 221, 29, 18, 19, 64, 228, 202, 18, 19, 64, 229, 37, 18, 19, 64, \r
+    229, 198, 18, 19, 64, 229, 191, 18, 19, 64, 229, 108, 18, 19, 64, 187, \r
+    18, 19, 64, 230, 59, 18, 19, 64, 244, 17, 18, 19, 64, 244, 68, 18, 19, \r
+    64, 244, 191, 18, 19, 64, 244, 184, 18, 19, 64, 244, 103, 18, 19, 64, \r
+    245, 0, 18, 19, 64, 236, 120, 18, 19, 64, 236, 125, 18, 19, 64, 236, 137, \r
+    18, 19, 64, 236, 136, 18, 19, 64, 236, 130, 18, 19, 64, 236, 149, 18, 19, \r
+    64, 236, 69, 18, 19, 64, 236, 70, 18, 19, 64, 236, 73, 18, 19, 64, 236, \r
+    72, 18, 19, 64, 236, 71, 18, 19, 64, 236, 74, 18, 19, 64, 236, 75, 18, \r
+    19, 64, 231, 144, 18, 19, 64, 231, 204, 18, 19, 64, 232, 141, 18, 19, 64, \r
+    232, 139, 18, 19, 64, 232, 62, 18, 19, 64, 208, 18, 19, 64, 233, 99, 18, \r
+    19, 64, 233, 136, 18, 19, 64, 234, 25, 18, 19, 64, 234, 16, 18, 19, 64, \r
+    233, 196, 18, 19, 64, 196, 18, 19, 64, 217, 200, 18, 19, 64, 217, 231, \r
+    18, 19, 64, 218, 25, 18, 19, 64, 218, 22, 18, 19, 64, 217, 250, 18, 19, \r
+    64, 184, 18, 19, 64, 237, 43, 18, 19, 226, 116, 237, 43, 18, 19, 64, 237, \r
+    59, 18, 19, 64, 237, 114, 18, 19, 64, 237, 113, 18, 19, 64, 237, 98, 18, \r
+    19, 226, 116, 237, 98, 18, 19, 64, 237, 123, 18, 19, 64, 237, 72, 18, 19, \r
+    64, 237, 76, 18, 19, 64, 237, 86, 18, 19, 64, 237, 85, 18, 19, 64, 237, \r
+    84, 18, 19, 64, 237, 87, 18, 19, 64, 234, 231, 18, 19, 64, 235, 12, 18, \r
+    19, 64, 235, 122, 18, 19, 64, 235, 118, 18, 19, 64, 235, 67, 18, 19, 64, \r
+    235, 188, 18, 19, 64, 248, 171, 18, 19, 64, 248, 172, 18, 19, 64, 248, \r
+    175, 18, 19, 64, 248, 174, 18, 19, 64, 248, 173, 18, 19, 64, 248, 176, \r
+    18, 19, 64, 235, 69, 18, 19, 64, 235, 71, 18, 19, 64, 235, 75, 18, 19, \r
+    64, 235, 74, 18, 19, 64, 235, 73, 18, 19, 64, 235, 79, 18, 19, 64, 221, \r
+    146, 18, 19, 64, 221, 148, 18, 19, 64, 221, 151, 18, 19, 64, 221, 150, \r
+    18, 19, 64, 221, 149, 18, 19, 64, 221, 152, 18, 19, 64, 221, 142, 18, 19, \r
+    64, 221, 143, 18, 19, 64, 221, 154, 18, 19, 64, 221, 153, 18, 19, 64, \r
+    221, 144, 18, 19, 64, 221, 155, 18, 19, 64, 217, 13, 18, 19, 64, 217, 21, \r
+    18, 19, 64, 217, 92, 18, 19, 64, 217, 90, 18, 19, 64, 217, 42, 18, 19, \r
+    64, 217, 114, 18, 19, 64, 217, 157, 18, 19, 64, 66, 217, 157, 18, 19, 64, \r
+    247, 65, 18, 19, 64, 247, 66, 18, 19, 64, 247, 73, 18, 19, 64, 247, 72, \r
+    18, 19, 64, 247, 68, 18, 19, 64, 247, 74, 18, 19, 64, 223, 103, 18, 19, \r
+    64, 224, 26, 18, 19, 64, 226, 94, 18, 19, 64, 226, 84, 18, 19, 64, 224, \r
+    140, 18, 19, 64, 226, 177, 18, 19, 64, 224, 170, 18, 19, 64, 224, 200, \r
+    18, 19, 64, 224, 246, 18, 19, 64, 224, 244, 18, 19, 64, 224, 221, 18, 19, \r
+    64, 225, 25, 18, 19, 64, 225, 27, 18, 19, 64, 221, 36, 18, 19, 64, 221, \r
+    38, 18, 19, 64, 221, 50, 18, 19, 64, 221, 49, 18, 19, 64, 221, 39, 18, \r
+    19, 64, 221, 55, 18, 19, 64, 250, 253, 18, 19, 64, 251, 11, 18, 19, 64, \r
+    251, 46, 18, 19, 64, 251, 43, 18, 19, 64, 251, 31, 18, 19, 64, 251, 69, \r
+    18, 19, 64, 221, 5, 18, 19, 64, 221, 6, 18, 19, 64, 221, 9, 18, 19, 64, \r
+    221, 8, 18, 19, 64, 221, 7, 18, 19, 64, 221, 10, 18, 19, 251, 32, 55, 18, \r
+    19, 245, 90, 223, 136, 18, 19, 228, 147, 18, 19, 232, 112, 18, 19, 231, \r
+    212, 18, 19, 231, 211, 18, 19, 231, 210, 18, 19, 231, 209, 18, 19, 231, \r
+    214, 18, 19, 231, 213, 18, 19, 218, 178, 221, 213, 18, 19, 218, 178, 221, \r
+    212, 18, 19, 218, 178, 221, 211, 18, 19, 218, 178, 221, 210, 18, 19, 218, \r
+    178, 221, 209, 18, 19, 218, 178, 221, 216, 18, 19, 218, 178, 221, 215, \r
+    18, 19, 218, 178, 39, 222, 37, 18, 19, 252, 50, 219, 40, 230, 164, 223, \r
+    255, 78, 230, 164, 1, 252, 122, 230, 164, 1, 234, 222, 230, 164, 1, 245, \r
+    230, 230, 164, 1, 226, 161, 230, 164, 1, 232, 25, 230, 164, 1, 220, 122, \r
+    230, 164, 1, 249, 185, 230, 164, 1, 221, 173, 230, 164, 1, 250, 177, 230, \r
+    164, 1, 251, 89, 230, 164, 1, 233, 91, 230, 164, 1, 244, 53, 230, 164, 1, \r
+    232, 105, 230, 164, 1, 223, 131, 230, 164, 1, 227, 18, 230, 164, 1, 254, \r
+    193, 230, 164, 1, 230, 131, 230, 164, 1, 220, 50, 230, 164, 1, 247, 14, \r
+    230, 164, 1, 237, 165, 230, 164, 1, 247, 15, 230, 164, 1, 230, 105, 230, \r
+    164, 1, 220, 103, 230, 164, 1, 238, 5, 230, 164, 1, 247, 12, 230, 164, 1, \r
+    229, 184, 230, 164, 245, 229, 78, 230, 164, 210, 245, 229, 78, 157, 1, \r
+    245, 220, 245, 212, 245, 232, 246, 74, 157, 1, 216, 216, 157, 1, 220, 36, \r
+    220, 51, 68, 157, 1, 217, 202, 157, 1, 218, 90, 157, 1, 219, 40, 157, 1, \r
+    221, 218, 221, 217, 221, 234, 157, 1, 246, 118, 157, 1, 254, 106, 60, \r
+    157, 1, 230, 94, 74, 157, 1, 255, 3, 60, 157, 1, 254, 219, 157, 1, 234, \r
+    254, 74, 157, 1, 224, 185, 74, 157, 1, 74, 157, 1, 230, 167, 157, 1, 230, \r
+    138, 157, 1, 227, 244, 227, 253, 227, 195, 152, 157, 1, 236, 195, 157, 1, \r
+    251, 87, 157, 1, 236, 196, 237, 17, 157, 1, 245, 67, 157, 1, 246, 185, \r
+    157, 1, 244, 187, 243, 231, 245, 67, 157, 1, 244, 220, 157, 1, 218, 160, \r
+    218, 155, 219, 40, 157, 1, 243, 203, 243, 225, 157, 1, 243, 207, 243, \r
+    225, 157, 1, 235, 0, 243, 225, 157, 1, 224, 188, 243, 225, 157, 1, 232, \r
+    203, 231, 74, 232, 204, 207, 157, 1, 224, 186, 207, 157, 1, 247, 140, \r
+    157, 1, 237, 148, 237, 152, 237, 142, 72, 157, 1, 73, 157, 1, 237, 106, \r
+    237, 126, 157, 1, 244, 173, 157, 1, 235, 1, 254, 234, 157, 1, 224, 190, \r
+    60, 157, 1, 237, 135, 246, 164, 157, 1, 229, 155, 229, 173, 230, 59, 157, \r
+    1, 254, 162, 246, 163, 157, 1, 224, 3, 198, 157, 1, 224, 129, 234, 253, \r
+    198, 157, 1, 224, 184, 198, 157, 1, 251, 202, 157, 1, 217, 157, 157, 1, \r
+    221, 159, 221, 166, 220, 190, 222, 201, 157, 1, 224, 183, 222, 201, 157, \r
+    1, 250, 46, 157, 1, 252, 107, 252, 110, 252, 56, 253, 204, 157, 1, 224, \r
+    189, 253, 204, 157, 1, 247, 139, 157, 1, 230, 115, 157, 1, 246, 238, 246, \r
+    240, 73, 157, 1, 234, 81, 234, 87, 189, 157, 1, 234, 255, 189, 157, 1, \r
+    224, 187, 189, 157, 1, 235, 136, 235, 171, 235, 4, 153, 157, 1, 247, 141, \r
+    157, 1, 237, 203, 157, 1, 237, 204, 157, 1, 249, 196, 249, 201, 250, 46, \r
+    157, 1, 230, 90, 246, 117, 74, 157, 1, 247, 11, 157, 1, 237, 164, 157, 1, \r
+    250, 63, 157, 1, 251, 160, 157, 1, 251, 98, 157, 1, 223, 161, 157, 1, \r
+    234, 252, 157, 1, 224, 182, 157, 1, 242, 64, 157, 1, 228, 163, 157, 1, \r
+    218, 151, 157, 224, 109, 228, 196, 157, 233, 85, 228, 196, 157, 250, 101, \r
+    228, 196, 157, 254, 33, 100, 157, 220, 227, 100, 157, 252, 121, 100, 222, \r
+    140, 1, 60, 222, 140, 1, 72, 222, 140, 1, 68, 222, 140, 1, 175, 222, 140, \r
+    1, 245, 0, 222, 140, 1, 232, 115, 222, 140, 1, 222, 155, 222, 140, 1, \r
+    249, 207, 222, 140, 1, 208, 222, 140, 1, 187, 222, 140, 1, 252, 237, 222, \r
+    140, 1, 196, 222, 140, 1, 184, 222, 140, 1, 235, 188, 222, 140, 1, 219, \r
+    7, 222, 140, 1, 226, 177, 222, 140, 1, 155, 222, 140, 29, 5, 72, 222, \r
+    140, 29, 5, 68, 222, 140, 5, 219, 82, 243, 184, 1, 60, 243, 184, 1, 72, \r
+    243, 184, 1, 68, 243, 184, 1, 175, 243, 184, 1, 245, 0, 243, 184, 1, 232, \r
+    115, 243, 184, 1, 222, 155, 243, 184, 1, 249, 207, 243, 184, 1, 208, 243, \r
+    184, 1, 187, 243, 184, 1, 252, 237, 243, 184, 1, 196, 243, 184, 1, 184, \r
+    243, 184, 1, 203, 243, 184, 1, 235, 188, 243, 184, 1, 219, 7, 243, 184, \r
+    1, 226, 177, 243, 184, 1, 155, 243, 184, 29, 5, 72, 243, 184, 29, 5, 68, \r
+    243, 184, 5, 230, 14, 229, 122, 224, 109, 228, 196, 229, 122, 51, 228, \r
+    196, 251, 245, 1, 60, 251, 245, 1, 72, 251, 245, 1, 68, 251, 245, 1, 175, \r
+    251, 245, 1, 245, 0, 251, 245, 1, 232, 115, 251, 245, 1, 222, 155, 251, \r
+    245, 1, 249, 207, 251, 245, 1, 208, 251, 245, 1, 187, 251, 245, 1, 252, \r
+    237, 251, 245, 1, 196, 251, 245, 1, 184, 251, 245, 1, 203, 251, 245, 1, \r
+    235, 188, 251, 245, 1, 219, 7, 251, 245, 1, 226, 177, 251, 245, 1, 155, \r
+    251, 245, 29, 5, 72, 251, 245, 29, 5, 68, 222, 139, 1, 60, 222, 139, 1, \r
+    72, 222, 139, 1, 68, 222, 139, 1, 175, 222, 139, 1, 245, 0, 222, 139, 1, \r
+    232, 115, 222, 139, 1, 222, 155, 222, 139, 1, 249, 207, 222, 139, 1, 208, \r
+    222, 139, 1, 187, 222, 139, 1, 252, 237, 222, 139, 1, 196, 222, 139, 1, \r
+    184, 222, 139, 1, 235, 188, 222, 139, 1, 219, 7, 222, 139, 1, 226, 177, \r
+    222, 139, 29, 5, 72, 222, 139, 29, 5, 68, 79, 1, 175, 79, 1, 236, 149, \r
+    79, 1, 236, 57, 79, 1, 236, 125, 79, 1, 232, 84, 79, 1, 251, 169, 79, 1, \r
+    251, 69, 79, 1, 250, 182, 79, 1, 251, 11, 79, 1, 231, 56, 79, 1, 249, \r
+    207, 79, 1, 221, 19, 79, 1, 248, 167, 79, 1, 221, 15, 79, 1, 231, 207, \r
+    79, 1, 222, 155, 79, 1, 222, 35, 79, 1, 101, 79, 1, 221, 239, 79, 1, 231, \r
+    204, 79, 1, 252, 237, 79, 1, 229, 141, 79, 1, 229, 37, 79, 1, 229, 118, \r
+    79, 1, 233, 136, 79, 1, 217, 231, 79, 1, 227, 75, 79, 1, 235, 12, 79, 1, \r
+    219, 72, 79, 1, 225, 25, 79, 1, 223, 182, 79, 1, 226, 177, 79, 1, 155, \r
+    79, 1, 235, 188, 79, 1, 228, 155, 79, 237, 214, 29, 228, 141, 79, 237, \r
+    214, 29, 228, 154, 79, 237, 214, 29, 228, 121, 79, 237, 214, 29, 228, \r
+    116, 79, 237, 214, 29, 228, 98, 79, 237, 214, 29, 228, 73, 79, 237, 214, \r
+    29, 228, 61, 79, 237, 214, 29, 228, 60, 79, 237, 214, 29, 226, 243, 79, \r
+    237, 214, 29, 226, 236, 79, 237, 214, 29, 234, 198, 79, 237, 214, 29, \r
+    234, 189, 79, 237, 214, 29, 228, 136, 79, 237, 214, 29, 228, 147, 79, \r
+    237, 214, 29, 228, 106, 220, 198, 107, 79, 237, 214, 29, 228, 106, 220, \r
+    198, 103, 79, 237, 214, 29, 228, 137, 79, 29, 237, 202, 254, 69, 79, 29, \r
+    237, 202, 255, 58, 79, 29, 5, 255, 58, 79, 29, 5, 72, 79, 29, 5, 237, \r
+    255, 79, 29, 5, 218, 90, 79, 29, 5, 217, 166, 79, 29, 5, 68, 79, 29, 5, \r
+    220, 23, 79, 29, 5, 220, 123, 79, 29, 5, 230, 167, 79, 29, 5, 184, 79, \r
+    29, 5, 238, 26, 79, 29, 5, 73, 79, 29, 5, 254, 234, 79, 29, 5, 254, 196, \r
+    79, 29, 5, 230, 127, 79, 29, 5, 253, 232, 79, 5, 232, 37, 79, 5, 227, \r
+    214, 79, 5, 217, 176, 79, 5, 233, 55, 79, 5, 221, 80, 79, 5, 252, 203, \r
+    79, 5, 227, 71, 79, 5, 221, 138, 79, 5, 236, 239, 79, 5, 254, 198, 79, 5, \r
+    226, 141, 226, 137, 79, 5, 219, 79, 79, 5, 250, 179, 79, 5, 252, 183, 79, \r
+    5, 236, 142, 79, 5, 252, 199, 79, 5, 251, 156, 229, 77, 235, 239, 79, 5, \r
+    235, 100, 221, 122, 79, 5, 252, 96, 79, 5, 229, 120, 233, 97, 79, 5, 236, \r
+    40, 79, 250, 78, 16, 227, 142, 79, 5, 253, 218, 79, 5, 253, 235, 79, 20, \r
+    217, 84, 79, 20, 107, 79, 20, 103, 79, 20, 160, 79, 20, 154, 79, 20, 174, \r
+    79, 20, 182, 79, 20, 191, 79, 20, 185, 79, 20, 190, 79, 16, 235, 100, \r
+    253, 237, 224, 16, 79, 16, 235, 100, 253, 237, 233, 72, 79, 16, 235, 100, \r
+    253, 237, 229, 76, 79, 16, 235, 100, 253, 237, 252, 123, 79, 16, 235, \r
+    100, 253, 237, 251, 233, 79, 16, 235, 100, 253, 237, 229, 1, 79, 16, 235, \r
+    100, 253, 237, 228, 251, 79, 16, 235, 100, 253, 237, 228, 249, 79, 16, \r
+    235, 100, 253, 237, 228, 255, 79, 16, 235, 100, 253, 237, 228, 253, 77, \r
+    252, 66, 77, 246, 208, 77, 250, 168, 77, 245, 90, 223, 136, 77, 250, 175, \r
+    77, 245, 116, 248, 143, 77, 221, 137, 224, 21, 242, 121, 77, 224, 139, 4, \r
+    252, 26, 234, 63, 77, 234, 84, 250, 168, 77, 234, 84, 245, 90, 223, 136, \r
+    77, 232, 23, 77, 245, 103, 41, 226, 74, 107, 77, 245, 103, 41, 226, 74, \r
+    103, 77, 245, 103, 41, 226, 74, 160, 77, 29, 225, 54, 77, 20, 217, 84, \r
+    77, 20, 107, 77, 20, 103, 77, 20, 160, 77, 20, 154, 77, 20, 174, 77, 20, \r
+    182, 77, 20, 191, 77, 20, 185, 77, 20, 190, 77, 1, 60, 77, 1, 73, 77, 1, \r
+    72, 77, 1, 74, 77, 1, 68, 77, 1, 230, 167, 77, 1, 220, 110, 77, 1, 246, \r
+    250, 77, 1, 208, 77, 1, 254, 123, 77, 1, 252, 237, 77, 1, 187, 77, 1, \r
+    228, 155, 77, 1, 245, 0, 77, 1, 196, 77, 1, 235, 188, 77, 1, 226, 177, \r
+    77, 1, 225, 25, 77, 1, 222, 155, 77, 1, 249, 207, 77, 1, 251, 69, 77, 1, \r
+    237, 123, 77, 1, 184, 77, 1, 203, 77, 1, 219, 7, 77, 1, 246, 8, 77, 1, \r
+    175, 77, 1, 236, 149, 77, 1, 221, 55, 77, 1, 217, 114, 77, 1, 243, 211, \r
+    77, 1, 217, 14, 77, 1, 235, 79, 77, 1, 217, 67, 77, 1, 251, 31, 77, 1, \r
+    221, 137, 171, 29, 55, 77, 1, 221, 137, 73, 77, 1, 221, 137, 72, 77, 1, \r
+    221, 137, 74, 77, 1, 221, 137, 68, 77, 1, 221, 137, 230, 167, 77, 1, 221, \r
+    137, 220, 110, 77, 1, 221, 137, 254, 123, 77, 1, 221, 137, 252, 237, 77, \r
+    1, 221, 137, 187, 77, 1, 221, 137, 228, 155, 77, 1, 221, 137, 245, 0, 77, \r
+    1, 221, 137, 196, 77, 1, 221, 137, 222, 155, 77, 1, 221, 137, 249, 207, \r
+    77, 1, 221, 137, 251, 69, 77, 1, 221, 137, 237, 123, 77, 1, 221, 137, \r
+    221, 55, 77, 1, 221, 137, 184, 77, 1, 221, 137, 219, 7, 77, 1, 221, 137, \r
+    175, 77, 1, 221, 137, 244, 253, 77, 1, 221, 137, 243, 211, 77, 1, 221, \r
+    137, 237, 97, 77, 1, 221, 137, 232, 60, 77, 1, 221, 137, 247, 74, 77, 1, \r
+    224, 139, 73, 77, 1, 224, 139, 72, 77, 1, 224, 139, 237, 133, 77, 1, 224, \r
+    139, 220, 110, 77, 1, 224, 139, 68, 77, 1, 224, 139, 254, 123, 77, 1, \r
+    224, 139, 175, 77, 1, 224, 139, 245, 0, 77, 1, 224, 139, 155, 77, 1, 224, \r
+    139, 187, 77, 1, 224, 139, 225, 25, 77, 1, 224, 139, 222, 155, 77, 1, \r
+    224, 139, 249, 207, 77, 1, 224, 139, 237, 123, 77, 1, 224, 139, 246, 8, \r
+    77, 1, 224, 139, 244, 253, 77, 1, 224, 139, 243, 211, 77, 1, 224, 139, \r
+    221, 55, 77, 1, 224, 139, 217, 114, 77, 1, 224, 139, 228, 0, 77, 1, 224, \r
+    139, 251, 69, 77, 1, 224, 139, 217, 80, 77, 1, 234, 84, 72, 77, 1, 234, \r
+    84, 175, 77, 1, 234, 84, 203, 77, 1, 234, 84, 246, 8, 77, 1, 234, 84, \r
+    217, 80, 77, 1, 254, 161, 244, 238, 254, 96, 107, 77, 1, 254, 161, 244, \r
+    238, 219, 78, 107, 77, 1, 254, 161, 244, 238, 249, 174, 77, 1, 254, 161, \r
+    244, 238, 220, 120, 77, 1, 254, 161, 244, 238, 237, 170, 220, 120, 77, 1, \r
+    254, 161, 244, 238, 252, 212, 77, 1, 254, 161, 244, 238, 148, 252, 212, \r
+    77, 1, 254, 161, 244, 238, 60, 77, 1, 254, 161, 244, 238, 72, 77, 1, 254, \r
+    161, 244, 238, 175, 77, 1, 254, 161, 244, 238, 232, 115, 77, 1, 254, 161, \r
+    244, 238, 251, 169, 77, 1, 254, 161, 244, 238, 221, 29, 77, 1, 254, 161, \r
+    244, 238, 221, 19, 77, 1, 254, 161, 244, 238, 249, 132, 77, 1, 254, 161, \r
+    244, 238, 231, 217, 77, 1, 254, 161, 244, 238, 222, 155, 77, 1, 254, 161, \r
+    244, 238, 249, 207, 77, 1, 254, 161, 244, 238, 187, 77, 1, 254, 161, 244, \r
+    238, 229, 141, 77, 1, 254, 161, 244, 238, 223, 218, 77, 1, 254, 161, 244, \r
+    238, 217, 80, 77, 1, 254, 161, 244, 238, 217, 114, 77, 1, 254, 161, 244, \r
+    238, 254, 202, 77, 1, 221, 137, 254, 161, 244, 238, 222, 155, 77, 1, 221, \r
+    137, 254, 161, 244, 238, 217, 80, 77, 1, 234, 84, 254, 161, 244, 238, \r
+    244, 125, 77, 1, 234, 84, 254, 161, 244, 238, 232, 115, 77, 1, 234, 84, \r
+    254, 161, 244, 238, 251, 169, 77, 1, 234, 84, 254, 161, 244, 238, 237, \r
+    103, 77, 1, 234, 84, 254, 161, 244, 238, 221, 29, 77, 1, 234, 84, 254, \r
+    161, 244, 238, 249, 116, 77, 1, 234, 84, 254, 161, 244, 238, 222, 155, \r
+    77, 1, 234, 84, 254, 161, 244, 238, 249, 36, 77, 1, 234, 84, 254, 161, \r
+    244, 238, 223, 218, 77, 1, 234, 84, 254, 161, 244, 238, 250, 57, 77, 1, \r
+    234, 84, 254, 161, 244, 238, 217, 80, 77, 1, 234, 84, 254, 161, 244, 238, \r
+    217, 114, 77, 1, 254, 161, 244, 238, 144, 68, 77, 1, 254, 161, 244, 238, \r
+    144, 184, 77, 1, 234, 84, 254, 161, 244, 238, 252, 94, 77, 1, 254, 161, \r
+    244, 238, 249, 197, 77, 1, 234, 84, 254, 161, 244, 238, 235, 79, 18, 19, \r
+    230, 63, 18, 19, 253, 212, 18, 19, 255, 14, 18, 19, 218, 229, 18, 19, \r
+    229, 7, 18, 19, 229, 205, 18, 19, 228, 172, 18, 19, 222, 96, 18, 19, 236, \r
+    191, 18, 19, 235, 232, 18, 19, 234, 45, 18, 19, 231, 172, 18, 19, 232, \r
+    199, 18, 19, 235, 132, 18, 19, 224, 1, 18, 19, 226, 118, 18, 19, 224, \r
+    175, 18, 19, 224, 249, 18, 19, 224, 150, 18, 19, 217, 208, 18, 19, 218, \r
+    30, 18, 19, 227, 222, 18, 19, 231, 82, 18, 19, 230, 155, 231, 82, 18, 19, \r
+    231, 81, 18, 19, 230, 155, 231, 81, 18, 19, 231, 80, 18, 19, 230, 155, \r
+    231, 80, 18, 19, 231, 79, 18, 19, 230, 155, 231, 79, 18, 19, 226, 248, \r
+    18, 19, 226, 247, 18, 19, 226, 246, 18, 19, 226, 245, 18, 19, 226, 244, \r
+    18, 19, 226, 252, 18, 19, 230, 155, 230, 59, 18, 19, 230, 155, 222, 201, \r
+    18, 19, 230, 155, 237, 17, 18, 19, 230, 155, 251, 202, 18, 19, 230, 155, \r
+    189, 18, 19, 230, 155, 207, 18, 19, 230, 155, 198, 18, 19, 230, 155, 225, \r
+    27, 18, 19, 247, 4, 219, 40, 18, 19, 218, 215, 219, 40, 18, 19, 39, 3, \r
+    227, 93, 18, 19, 39, 227, 241, 248, 145, 18, 19, 228, 38, 226, 249, 18, \r
+    19, 137, 234, 248, 18, 19, 137, 235, 187, 18, 19, 221, 214, 18, 19, 221, \r
+    216, 18, 19, 221, 13, 18, 19, 221, 14, 18, 19, 221, 18, 18, 19, 221, 145, \r
+    18, 19, 221, 147, 18, 19, 226, 116, 224, 155, 18, 19, 226, 116, 224, 195, \r
+    18, 19, 226, 116, 242, 248, 18, 19, 64, 243, 238, 18, 19, 64, 249, 60, \r
+    244, 184, 18, 19, 64, 244, 253, 18, 19, 64, 243, 243, 18, 19, 226, 116, \r
+    237, 27, 18, 19, 64, 237, 25, 18, 19, 252, 139, 249, 60, 153, 18, 19, \r
+    252, 139, 249, 60, 152, 18, 19, 64, 249, 55, 198, 195, 219, 59, 235, 84, \r
+    195, 1, 175, 195, 1, 236, 149, 195, 1, 245, 0, 195, 1, 244, 125, 195, 1, \r
+    232, 115, 195, 1, 251, 169, 195, 1, 251, 69, 195, 1, 237, 123, 195, 1, \r
+    237, 103, 195, 1, 218, 47, 195, 1, 222, 155, 195, 1, 222, 35, 195, 1, \r
+    249, 207, 195, 1, 249, 36, 195, 1, 208, 195, 1, 187, 195, 1, 229, 141, \r
+    195, 1, 252, 237, 195, 1, 252, 94, 195, 1, 196, 195, 1, 184, 195, 1, 203, \r
+    195, 1, 235, 188, 195, 1, 219, 7, 195, 1, 225, 25, 195, 1, 223, 218, 195, \r
+    1, 226, 177, 195, 1, 155, 195, 29, 5, 60, 195, 29, 5, 72, 195, 29, 5, 68, \r
+    195, 29, 5, 246, 250, 195, 29, 5, 254, 196, 195, 29, 5, 230, 127, 195, \r
+    29, 5, 253, 232, 195, 29, 5, 73, 195, 29, 5, 74, 195, 223, 97, 1, 184, \r
+    195, 223, 97, 1, 203, 195, 223, 97, 1, 219, 7, 195, 3, 1, 175, 195, 3, 1, \r
+    232, 115, 195, 3, 1, 254, 95, 195, 3, 1, 222, 155, 195, 3, 1, 208, 195, \r
+    3, 1, 187, 195, 3, 1, 196, 195, 3, 1, 203, 195, 3, 1, 235, 188, 195, 5, \r
+    233, 89, 195, 5, 236, 173, 195, 5, 226, 176, 195, 5, 234, 248, 195, 246, \r
+    95, 78, 195, 228, 82, 78, 195, 20, 217, 84, 195, 20, 107, 195, 20, 103, \r
+    195, 20, 160, 195, 20, 154, 195, 20, 174, 195, 20, 182, 195, 20, 191, \r
+    195, 20, 185, 195, 20, 190, 37, 235, 123, 1, 175, 37, 235, 123, 1, 218, \r
+    138, 37, 235, 123, 1, 232, 115, 37, 235, 123, 1, 221, 55, 37, 235, 123, \r
+    1, 226, 177, 37, 235, 123, 1, 184, 37, 235, 123, 1, 222, 155, 37, 235, \r
+    123, 1, 222, 35, 37, 235, 123, 1, 235, 188, 37, 235, 123, 1, 187, 37, \r
+    235, 123, 1, 229, 141, 37, 235, 123, 1, 196, 37, 235, 123, 1, 246, 8, 37, \r
+    235, 123, 1, 219, 189, 37, 235, 123, 1, 155, 37, 235, 123, 1, 228, 155, \r
+    37, 235, 123, 1, 236, 149, 37, 235, 123, 1, 221, 47, 37, 235, 123, 1, \r
+    208, 37, 235, 123, 1, 60, 37, 235, 123, 1, 72, 37, 235, 123, 1, 246, 250, \r
+    37, 235, 123, 1, 246, 239, 37, 235, 123, 1, 68, 37, 235, 123, 1, 230, \r
+    127, 37, 235, 123, 1, 74, 37, 235, 123, 1, 220, 110, 37, 235, 123, 1, 73, \r
+    37, 235, 123, 1, 253, 231, 37, 235, 123, 1, 254, 196, 37, 235, 123, 1, \r
+    221, 130, 37, 235, 123, 1, 221, 129, 37, 235, 123, 1, 221, 128, 37, 235, \r
+    123, 1, 221, 127, 37, 235, 123, 1, 221, 126, 146, 37, 151, 1, 116, 228, \r
+    155, 146, 37, 151, 1, 109, 228, 155, 146, 37, 151, 1, 116, 175, 146, 37, \r
+    151, 1, 116, 218, 138, 146, 37, 151, 1, 116, 232, 115, 146, 37, 151, 1, \r
+    109, 175, 146, 37, 151, 1, 109, 218, 138, 146, 37, 151, 1, 109, 232, 115, \r
+    146, 37, 151, 1, 116, 221, 55, 146, 37, 151, 1, 116, 226, 177, 146, 37, \r
+    151, 1, 116, 184, 146, 37, 151, 1, 109, 221, 55, 146, 37, 151, 1, 109, \r
+    226, 177, 146, 37, 151, 1, 109, 184, 146, 37, 151, 1, 116, 222, 155, 146, \r
+    37, 151, 1, 116, 222, 35, 146, 37, 151, 1, 116, 208, 146, 37, 151, 1, \r
+    109, 222, 155, 146, 37, 151, 1, 109, 222, 35, 146, 37, 151, 1, 109, 208, \r
+    146, 37, 151, 1, 116, 187, 146, 37, 151, 1, 116, 229, 141, 146, 37, 151, \r
+    1, 116, 196, 146, 37, 151, 1, 109, 187, 146, 37, 151, 1, 109, 229, 141, \r
+    146, 37, 151, 1, 109, 196, 146, 37, 151, 1, 116, 246, 8, 146, 37, 151, 1, \r
+    116, 219, 189, 146, 37, 151, 1, 116, 235, 188, 146, 37, 151, 1, 109, 246, \r
+    8, 146, 37, 151, 1, 109, 219, 189, 146, 37, 151, 1, 109, 235, 188, 146, \r
+    37, 151, 1, 116, 155, 146, 37, 151, 1, 116, 249, 207, 146, 37, 151, 1, \r
+    116, 252, 237, 146, 37, 151, 1, 109, 155, 146, 37, 151, 1, 109, 249, 207, \r
+    146, 37, 151, 1, 109, 252, 237, 146, 37, 151, 1, 116, 235, 236, 146, 37, \r
+    151, 1, 116, 218, 111, 146, 37, 151, 1, 109, 235, 236, 146, 37, 151, 1, \r
+    109, 218, 111, 146, 37, 151, 1, 116, 223, 102, 146, 37, 151, 1, 109, 223, \r
+    102, 146, 37, 151, 29, 5, 29, 224, 181, 146, 37, 151, 29, 5, 255, 58, \r
+    146, 37, 151, 29, 5, 237, 255, 146, 37, 151, 29, 5, 68, 146, 37, 151, 29, \r
+    5, 220, 23, 146, 37, 151, 29, 5, 73, 146, 37, 151, 29, 5, 254, 234, 146, \r
+    37, 151, 29, 5, 74, 146, 37, 151, 29, 5, 230, 185, 146, 37, 151, 29, 5, \r
+    220, 110, 146, 37, 151, 29, 5, 253, 212, 146, 37, 151, 29, 5, 255, 14, \r
+    146, 37, 151, 29, 5, 220, 16, 146, 37, 151, 29, 5, 230, 63, 146, 37, 151, \r
+    29, 5, 230, 182, 146, 37, 151, 29, 5, 220, 107, 146, 37, 151, 29, 5, 237, \r
+    133, 146, 37, 151, 1, 39, 216, 216, 146, 37, 151, 1, 39, 232, 117, 146, \r
+    37, 151, 1, 39, 207, 146, 37, 151, 1, 39, 189, 146, 37, 151, 1, 39, 237, \r
+    17, 146, 37, 151, 1, 39, 250, 46, 146, 37, 151, 1, 39, 253, 204, 146, 37, \r
+    151, 145, 234, 67, 146, 37, 151, 145, 234, 66, 146, 37, 151, 20, 217, 84, \r
+    146, 37, 151, 20, 107, 146, 37, 151, 20, 103, 146, 37, 151, 20, 160, 146, \r
+    37, 151, 20, 154, 146, 37, 151, 20, 174, 146, 37, 151, 20, 182, 146, 37, \r
+    151, 20, 191, 146, 37, 151, 20, 185, 146, 37, 151, 20, 190, 146, 37, 151, \r
+    83, 20, 107, 146, 37, 151, 5, 235, 177, 146, 37, 151, 5, 235, 176, 79, \r
+    16, 229, 211, 79, 16, 233, 73, 236, 55, 79, 16, 229, 77, 236, 55, 79, 16, \r
+    252, 124, 236, 55, 79, 16, 251, 234, 236, 55, 79, 16, 229, 2, 236, 55, \r
+    79, 16, 228, 252, 236, 55, 79, 16, 228, 250, 236, 55, 79, 16, 229, 0, \r
+    236, 55, 79, 16, 228, 254, 236, 55, 79, 16, 249, 163, 236, 55, 79, 16, \r
+    249, 159, 236, 55, 79, 16, 249, 158, 236, 55, 79, 16, 249, 161, 236, 55, \r
+    79, 16, 249, 160, 236, 55, 79, 16, 249, 157, 236, 55, 79, 16, 220, 230, \r
+    79, 16, 233, 73, 227, 70, 79, 16, 229, 77, 227, 70, 79, 16, 252, 124, \r
+    227, 70, 79, 16, 251, 234, 227, 70, 79, 16, 229, 2, 227, 70, 79, 16, 228, \r
+    252, 227, 70, 79, 16, 228, 250, 227, 70, 79, 16, 229, 0, 227, 70, 79, 16, \r
+    228, 254, 227, 70, 79, 16, 249, 163, 227, 70, 79, 16, 249, 159, 227, 70, \r
+    79, 16, 249, 158, 227, 70, 79, 16, 249, 161, 227, 70, 79, 16, 249, 160, \r
+    227, 70, 79, 16, 249, 157, 227, 70, 251, 246, 1, 175, 251, 246, 1, 245, \r
+    0, 251, 246, 1, 232, 115, 251, 246, 1, 232, 87, 251, 246, 1, 187, 251, \r
+    246, 1, 252, 237, 251, 246, 1, 196, 251, 246, 1, 233, 102, 251, 246, 1, \r
+    222, 155, 251, 246, 1, 249, 207, 251, 246, 1, 208, 251, 246, 1, 231, 171, \r
+    251, 246, 1, 251, 169, 251, 246, 1, 237, 123, 251, 246, 1, 231, 77, 251, \r
+    246, 1, 231, 75, 251, 246, 1, 184, 251, 246, 1, 203, 251, 246, 1, 235, \r
+    188, 251, 246, 1, 219, 189, 251, 246, 1, 226, 177, 251, 246, 1, 60, 251, \r
+    246, 1, 155, 251, 246, 29, 5, 72, 251, 246, 29, 5, 68, 251, 246, 29, 5, \r
+    73, 251, 246, 29, 5, 74, 251, 246, 29, 5, 254, 234, 251, 246, 230, 24, \r
+    251, 246, 246, 190, 117, 226, 86, 37, 83, 1, 116, 175, 37, 83, 1, 116, \r
+    236, 149, 37, 83, 1, 116, 235, 224, 37, 83, 1, 109, 175, 37, 83, 1, 109, \r
+    235, 224, 37, 83, 1, 109, 236, 149, 37, 83, 1, 232, 115, 37, 83, 1, 116, \r
+    251, 169, 37, 83, 1, 116, 251, 69, 37, 83, 1, 109, 251, 169, 37, 83, 1, \r
+    109, 226, 177, 37, 83, 1, 109, 251, 69, 37, 83, 1, 231, 77, 37, 83, 1, \r
+    227, 227, 37, 83, 1, 116, 227, 225, 37, 83, 1, 249, 207, 37, 83, 1, 109, \r
+    227, 225, 37, 83, 1, 227, 235, 37, 83, 1, 116, 222, 155, 37, 83, 1, 116, \r
+    222, 35, 37, 83, 1, 109, 222, 155, 37, 83, 1, 109, 222, 35, 37, 83, 1, \r
+    208, 37, 83, 1, 252, 237, 37, 83, 1, 116, 187, 37, 83, 1, 116, 229, 141, \r
+    37, 83, 1, 116, 246, 8, 37, 83, 1, 109, 187, 37, 83, 1, 109, 246, 8, 37, \r
+    83, 1, 109, 229, 141, 37, 83, 1, 196, 37, 83, 1, 109, 184, 37, 83, 1, \r
+    116, 184, 37, 83, 1, 203, 37, 83, 1, 227, 19, 37, 83, 1, 235, 188, 37, \r
+    83, 1, 234, 227, 37, 83, 1, 219, 7, 37, 83, 1, 116, 225, 25, 37, 83, 1, \r
+    116, 223, 218, 37, 83, 1, 116, 226, 177, 37, 83, 1, 116, 155, 37, 83, 1, \r
+    235, 17, 37, 83, 1, 60, 37, 83, 1, 109, 155, 37, 83, 1, 72, 37, 83, 1, \r
+    237, 255, 37, 83, 1, 68, 37, 83, 1, 220, 23, 37, 83, 1, 246, 250, 37, 83, \r
+    1, 230, 127, 37, 83, 1, 235, 177, 37, 83, 1, 244, 32, 226, 177, 37, 83, \r
+    250, 147, 5, 128, 203, 37, 83, 250, 147, 5, 128, 235, 188, 37, 83, 250, \r
+    147, 5, 235, 189, 222, 118, 235, 167, 37, 83, 5, 234, 100, 236, 230, 235, \r
+    167, 37, 83, 250, 147, 5, 39, 232, 115, 37, 83, 250, 147, 5, 109, 187, \r
+    37, 83, 250, 147, 5, 116, 227, 226, 156, 109, 187, 37, 83, 250, 147, 5, \r
+    196, 37, 83, 250, 147, 5, 252, 237, 37, 83, 250, 147, 5, 226, 177, 37, \r
+    83, 5, 226, 158, 37, 83, 29, 5, 60, 37, 83, 29, 5, 234, 100, 226, 127, \r
+    37, 83, 29, 5, 255, 58, 37, 83, 29, 5, 222, 123, 255, 58, 37, 83, 29, 5, \r
+    72, 37, 83, 29, 5, 237, 255, 37, 83, 29, 5, 220, 110, 37, 83, 29, 5, 220, \r
+    22, 37, 83, 29, 5, 68, 37, 83, 29, 5, 220, 23, 37, 83, 29, 5, 74, 37, 83, \r
+    29, 5, 230, 186, 56, 37, 83, 29, 5, 230, 63, 37, 83, 29, 5, 73, 37, 83, \r
+    29, 5, 254, 234, 37, 83, 29, 5, 230, 127, 37, 83, 29, 5, 254, 196, 37, \r
+    83, 29, 5, 83, 254, 196, 37, 83, 29, 5, 230, 186, 50, 37, 83, 5, 234, \r
+    100, 236, 229, 37, 83, 5, 221, 131, 37, 83, 5, 221, 130, 37, 83, 5, 236, \r
+    118, 221, 129, 37, 83, 5, 236, 118, 221, 128, 37, 83, 5, 236, 118, 221, \r
+    127, 37, 83, 5, 228, 3, 243, 210, 37, 83, 5, 234, 100, 226, 148, 37, 83, \r
+    5, 236, 117, 236, 215, 37, 83, 36, 250, 93, 248, 145, 37, 83, 242, 243, \r
+    20, 217, 84, 37, 83, 242, 243, 20, 107, 37, 83, 242, 243, 20, 103, 37, \r
+    83, 242, 243, 20, 160, 37, 83, 242, 243, 20, 154, 37, 83, 242, 243, 20, \r
+    174, 37, 83, 242, 243, 20, 182, 37, 83, 242, 243, 20, 191, 37, 83, 242, \r
+    243, 20, 185, 37, 83, 242, 243, 20, 190, 37, 83, 83, 20, 217, 84, 37, 83, \r
+    83, 20, 107, 37, 83, 83, 20, 103, 37, 83, 83, 20, 160, 37, 83, 83, 20, \r
+    154, 37, 83, 83, 20, 174, 37, 83, 83, 20, 182, 37, 83, 83, 20, 191, 37, \r
+    83, 83, 20, 185, 37, 83, 83, 20, 190, 37, 83, 5, 218, 203, 37, 83, 5, \r
+    218, 202, 37, 83, 5, 226, 121, 37, 83, 5, 236, 163, 37, 83, 5, 242, 180, \r
+    37, 83, 5, 248, 157, 37, 83, 5, 210, 227, 59, 227, 235, 37, 83, 5, 234, \r
+    100, 218, 48, 37, 83, 5, 237, 1, 37, 83, 5, 237, 0, 37, 83, 5, 226, 126, \r
+    37, 83, 5, 226, 125, 37, 83, 5, 243, 186, 37, 83, 5, 251, 166, 94, 5, \r
+    220, 97, 227, 144, 94, 5, 220, 97, 251, 148, 94, 5, 251, 95, 94, 5, 223, \r
+    51, 94, 5, 252, 64, 94, 1, 254, 180, 94, 1, 254, 181, 222, 82, 94, 1, \r
+    237, 251, 94, 1, 237, 252, 222, 82, 94, 1, 220, 100, 94, 1, 220, 101, \r
+    222, 82, 94, 1, 228, 3, 227, 183, 94, 1, 228, 3, 227, 184, 222, 82, 94, \r
+    1, 235, 189, 235, 95, 94, 1, 235, 189, 235, 96, 222, 82, 94, 1, 246, 222, \r
+    94, 1, 254, 194, 94, 1, 230, 153, 94, 1, 230, 154, 222, 82, 94, 1, 175, \r
+    94, 1, 206, 234, 103, 94, 1, 245, 0, 94, 1, 245, 1, 244, 58, 94, 1, 232, \r
+    115, 94, 1, 251, 169, 94, 1, 251, 170, 235, 179, 94, 1, 237, 123, 94, 1, \r
+    237, 124, 237, 107, 94, 1, 231, 77, 94, 1, 222, 156, 235, 138, 94, 1, \r
+    222, 156, 233, 68, 234, 103, 94, 1, 249, 208, 233, 68, 254, 148, 94, 1, \r
+    249, 208, 233, 68, 234, 103, 94, 1, 232, 238, 227, 238, 94, 1, 222, 155, \r
+    94, 1, 222, 156, 222, 99, 94, 1, 249, 207, 94, 1, 249, 208, 234, 108, 94, \r
+    1, 208, 94, 1, 187, 94, 1, 230, 44, 236, 225, 94, 1, 252, 237, 94, 1, \r
+    252, 238, 236, 174, 94, 1, 196, 94, 1, 184, 94, 1, 203, 94, 1, 235, 188, \r
+    94, 1, 219, 7, 94, 1, 226, 178, 226, 164, 94, 1, 226, 178, 226, 132, 94, \r
+    1, 226, 177, 94, 1, 155, 94, 5, 227, 177, 94, 29, 5, 222, 82, 94, 29, 5, \r
+    220, 96, 94, 29, 5, 220, 97, 226, 129, 94, 29, 5, 223, 77, 94, 29, 5, \r
+    223, 78, 237, 243, 94, 29, 5, 228, 3, 227, 183, 94, 29, 5, 228, 3, 227, \r
+    184, 222, 82, 94, 29, 5, 235, 189, 235, 95, 94, 29, 5, 235, 189, 235, 96, \r
+    222, 82, 94, 29, 5, 222, 124, 94, 29, 5, 222, 125, 227, 183, 94, 29, 5, \r
+    222, 125, 222, 82, 94, 29, 5, 222, 125, 227, 184, 222, 82, 94, 29, 5, \r
+    229, 171, 94, 29, 5, 229, 172, 222, 82, 94, 254, 240, 254, 239, 94, 1, \r
+    236, 247, 226, 128, 94, 1, 236, 122, 226, 128, 94, 1, 220, 183, 226, 128, \r
+    94, 1, 246, 245, 226, 128, 94, 1, 219, 166, 226, 128, 94, 1, 217, 105, \r
+    226, 128, 94, 1, 253, 246, 226, 128, 94, 20, 217, 84, 94, 20, 107, 94, \r
+    20, 103, 94, 20, 160, 94, 20, 154, 94, 20, 174, 94, 20, 182, 94, 20, 191, \r
+    94, 20, 185, 94, 20, 190, 94, 229, 254, 94, 230, 19, 94, 218, 193, 94, \r
+    251, 132, 230, 13, 94, 251, 132, 224, 122, 94, 251, 132, 229, 228, 94, \r
+    230, 18, 94, 26, 16, 248, 151, 94, 26, 16, 249, 59, 94, 26, 16, 247, 97, \r
+    94, 26, 16, 249, 165, 94, 26, 16, 249, 166, 223, 51, 94, 26, 16, 248, \r
+    218, 94, 26, 16, 249, 200, 94, 26, 16, 249, 44, 94, 26, 16, 249, 186, 94, \r
+    26, 16, 249, 166, 244, 186, 94, 26, 16, 36, 222, 79, 94, 26, 16, 36, 246, \r
+    188, 94, 26, 16, 36, 236, 169, 94, 26, 16, 36, 236, 171, 94, 26, 16, 36, \r
+    237, 111, 94, 26, 16, 36, 236, 170, 2, 237, 111, 94, 26, 16, 36, 236, \r
+    172, 2, 237, 111, 94, 26, 16, 36, 252, 112, 94, 26, 16, 36, 244, 61, 94, \r
+    26, 16, 227, 107, 230, 119, 247, 107, 94, 26, 16, 227, 107, 230, 119, \r
+    249, 198, 94, 26, 16, 227, 107, 250, 197, 220, 251, 94, 26, 16, 227, 107, \r
+    250, 197, 222, 131, 94, 26, 16, 235, 113, 230, 119, 230, 9, 94, 26, 16, \r
+    235, 113, 230, 119, 228, 195, 94, 26, 16, 235, 113, 250, 197, 229, 54, \r
+    94, 26, 16, 235, 113, 250, 197, 229, 46, 94, 26, 16, 235, 113, 230, 119, \r
+    229, 72, 223, 67, 5, 229, 251, 223, 67, 5, 230, 5, 223, 67, 5, 230, 3, \r
+    223, 67, 1, 60, 223, 67, 1, 72, 223, 67, 1, 68, 223, 67, 1, 254, 234, \r
+    223, 67, 1, 74, 223, 67, 1, 73, 223, 67, 1, 246, 115, 223, 67, 1, 175, \r
+    223, 67, 1, 228, 155, 223, 67, 1, 245, 0, 223, 67, 1, 232, 115, 223, 67, \r
+    1, 251, 169, 223, 67, 1, 237, 123, 223, 67, 1, 217, 114, 223, 67, 1, 231, \r
+    77, 223, 67, 1, 222, 155, 223, 67, 1, 249, 207, 223, 67, 1, 208, 223, 67, \r
+    1, 187, 223, 67, 1, 246, 8, 223, 67, 1, 219, 189, 223, 67, 1, 252, 237, \r
+    223, 67, 1, 196, 223, 67, 1, 184, 223, 67, 1, 203, 223, 67, 1, 235, 188, \r
+    223, 67, 1, 219, 7, 223, 67, 1, 226, 177, 223, 67, 1, 218, 138, 223, 67, \r
+    1, 155, 223, 67, 250, 147, 5, 230, 16, 223, 67, 250, 147, 5, 229, 253, \r
+    223, 67, 250, 147, 5, 229, 250, 223, 67, 29, 5, 230, 8, 223, 67, 29, 5, \r
+    229, 249, 223, 67, 29, 5, 230, 11, 223, 67, 29, 5, 230, 2, 223, 67, 29, \r
+    5, 230, 17, 223, 67, 29, 5, 230, 10, 223, 67, 5, 230, 20, 223, 67, 1, \r
+    236, 149, 223, 67, 1, 223, 20, 223, 67, 20, 217, 84, 223, 67, 20, 107, \r
+    223, 67, 20, 103, 223, 67, 20, 160, 223, 67, 20, 154, 223, 67, 20, 174, \r
+    223, 67, 20, 182, 223, 67, 20, 191, 223, 67, 20, 185, 223, 67, 20, 190, \r
+    169, 1, 175, 169, 1, 236, 67, 169, 1, 236, 149, 169, 1, 245, 0, 169, 1, \r
+    244, 77, 169, 1, 232, 115, 169, 1, 251, 169, 169, 1, 251, 69, 169, 1, \r
+    237, 123, 169, 1, 231, 77, 169, 1, 222, 155, 169, 1, 222, 35, 169, 1, \r
+    249, 207, 169, 1, 208, 169, 1, 187, 169, 1, 229, 58, 169, 1, 229, 141, \r
+    169, 1, 246, 8, 169, 1, 245, 165, 169, 1, 252, 237, 169, 1, 252, 54, 169, \r
+    1, 196, 169, 1, 233, 142, 169, 1, 221, 55, 169, 1, 221, 47, 169, 1, 247, \r
+    74, 169, 1, 184, 169, 1, 203, 169, 1, 235, 188, 169, 1, 155, 169, 1, 243, \r
+    89, 169, 1, 219, 189, 169, 1, 226, 177, 169, 1, 225, 25, 169, 1, 219, 7, \r
+    169, 1, 60, 169, 223, 97, 1, 184, 169, 223, 97, 1, 203, 169, 29, 5, 255, \r
+    58, 169, 29, 5, 72, 169, 29, 5, 74, 169, 29, 5, 230, 127, 169, 29, 5, 68, \r
+    169, 29, 5, 220, 23, 169, 29, 5, 73, 169, 250, 147, 5, 237, 17, 169, 250, \r
+    147, 5, 189, 169, 250, 147, 5, 153, 169, 250, 147, 5, 207, 169, 250, 147, \r
+    5, 230, 59, 169, 250, 147, 5, 152, 169, 250, 147, 5, 222, 201, 169, 250, \r
+    147, 5, 231, 62, 169, 250, 147, 5, 236, 229, 169, 5, 227, 236, 169, 5, \r
+    231, 112, 169, 228, 197, 222, 154, 169, 228, 197, 231, 69, 221, 208, 222, \r
+    154, 169, 228, 197, 251, 74, 169, 228, 197, 221, 42, 251, 74, 169, 228, \r
+    197, 221, 41, 169, 20, 217, 84, 169, 20, 107, 169, 20, 103, 169, 20, 160, \r
+    169, 20, 154, 169, 20, 174, 169, 20, 182, 169, 20, 191, 169, 20, 185, \r
+    169, 20, 190, 169, 1, 221, 29, 169, 1, 221, 19, 169, 1, 249, 132, 230, \r
+    151, 251, 26, 20, 217, 84, 230, 151, 251, 26, 20, 107, 230, 151, 251, 26, \r
+    20, 103, 230, 151, 251, 26, 20, 160, 230, 151, 251, 26, 20, 154, 230, \r
+    151, 251, 26, 20, 174, 230, 151, 251, 26, 20, 182, 230, 151, 251, 26, 20, \r
+    191, 230, 151, 251, 26, 20, 185, 230, 151, 251, 26, 20, 190, 230, 151, \r
+    251, 26, 1, 235, 188, 230, 151, 251, 26, 1, 253, 244, 230, 151, 251, 26, \r
+    1, 254, 209, 230, 151, 251, 26, 1, 254, 123, 230, 151, 251, 26, 1, 254, \r
+    175, 230, 151, 251, 26, 1, 235, 187, 230, 151, 251, 26, 1, 255, 20, 230, \r
+    151, 251, 26, 1, 255, 21, 230, 151, 251, 26, 1, 255, 19, 230, 151, 251, \r
+    26, 1, 255, 15, 230, 151, 251, 26, 1, 235, 67, 230, 151, 251, 26, 1, 237, \r
+    151, 230, 151, 251, 26, 1, 238, 0, 230, 151, 251, 26, 1, 237, 167, 230, \r
+    151, 251, 26, 1, 237, 156, 230, 151, 251, 26, 1, 234, 231, 230, 151, 251, \r
+    26, 1, 220, 117, 230, 151, 251, 26, 1, 220, 115, 230, 151, 251, 26, 1, \r
+    220, 68, 230, 151, 251, 26, 1, 220, 16, 230, 151, 251, 26, 1, 235, 122, \r
+    230, 151, 251, 26, 1, 246, 162, 230, 151, 251, 26, 1, 246, 253, 230, 151, \r
+    251, 26, 1, 246, 197, 230, 151, 251, 26, 1, 246, 142, 230, 151, 251, 26, \r
+    1, 235, 12, 230, 151, 251, 26, 1, 230, 89, 230, 151, 251, 26, 1, 230, \r
+    181, 230, 151, 251, 26, 1, 230, 79, 230, 151, 251, 26, 1, 230, 161, 230, \r
+    151, 251, 26, 233, 100, 221, 1, 230, 151, 251, 26, 244, 251, 221, 2, 230, \r
+    151, 251, 26, 233, 98, 221, 2, 230, 151, 251, 26, 227, 193, 230, 151, \r
+    251, 26, 229, 139, 230, 151, 251, 26, 254, 201, 230, 151, 251, 26, 228, \r
+    197, 233, 96, 230, 151, 251, 26, 228, 197, 51, 233, 96, 219, 162, 145, \r
+    236, 211, 219, 162, 145, 225, 2, 219, 162, 145, 228, 241, 219, 162, 5, \r
+    232, 39, 219, 162, 5, 218, 56, 233, 191, 223, 39, 219, 162, 145, 218, 56, \r
+    254, 206, 237, 214, 223, 39, 219, 162, 145, 218, 56, 237, 214, 223, 39, \r
+    219, 162, 145, 218, 56, 236, 199, 237, 214, 223, 39, 219, 162, 145, 251, \r
+    149, 56, 219, 162, 145, 218, 56, 236, 199, 237, 214, 223, 40, 226, 106, \r
+    219, 162, 145, 51, 223, 39, 219, 162, 145, 221, 78, 223, 39, 219, 162, \r
+    145, 236, 199, 254, 97, 219, 162, 145, 61, 56, 219, 162, 145, 124, 188, \r
+    56, 219, 162, 145, 148, 188, 56, 219, 162, 145, 227, 99, 236, 210, 237, \r
+    214, 223, 39, 219, 162, 145, 253, 242, 237, 214, 223, 39, 219, 162, 5, \r
+    219, 78, 223, 39, 219, 162, 5, 219, 78, 220, 112, 219, 162, 5, 210, 219, \r
+    78, 220, 112, 219, 162, 5, 219, 78, 254, 97, 219, 162, 5, 210, 219, 78, \r
+    254, 97, 219, 162, 5, 219, 78, 220, 113, 2, 222, 135, 219, 162, 5, 219, \r
+    78, 254, 98, 2, 222, 135, 219, 162, 5, 254, 96, 254, 105, 219, 162, 5, \r
+    254, 96, 252, 222, 219, 162, 5, 254, 96, 219, 184, 219, 162, 5, 254, 96, \r
+    219, 185, 2, 222, 135, 219, 162, 5, 221, 162, 219, 162, 5, 243, 123, 171, \r
+    254, 95, 219, 162, 5, 171, 254, 95, 219, 162, 5, 227, 24, 171, 254, 95, \r
+    219, 162, 5, 254, 96, 220, 119, 233, 90, 219, 162, 5, 254, 46, 7, 1, 3, \r
+    6, 60, 7, 1, 3, 6, 254, 234, 7, 3, 1, 215, 254, 234, 7, 1, 3, 6, 252, \r
+    196, 253, 204, 7, 1, 3, 6, 251, 202, 7, 1, 3, 6, 250, 46, 7, 1, 3, 6, \r
+    246, 118, 7, 1, 3, 6, 73, 7, 3, 1, 215, 230, 119, 73, 7, 3, 1, 215, 72, \r
+    7, 1, 3, 6, 237, 126, 7, 1, 3, 6, 237, 17, 7, 1, 3, 6, 235, 202, 2, 92, \r
+    7, 1, 3, 6, 189, 7, 1, 3, 6, 210, 207, 7, 1, 3, 6, 74, 7, 1, 3, 6, 230, \r
+    119, 74, 7, 3, 1, 224, 136, 74, 7, 3, 1, 224, 136, 230, 119, 74, 7, 3, 1, \r
+    224, 136, 142, 2, 92, 7, 3, 1, 215, 230, 167, 7, 1, 3, 6, 230, 86, 7, 3, \r
+    1, 221, 120, 144, 74, 7, 3, 1, 252, 29, 144, 74, 7, 1, 3, 6, 230, 59, 7, \r
+    1, 3, 6, 210, 152, 7, 1, 3, 6, 215, 152, 7, 1, 3, 6, 222, 201, 7, 1, 3, \r
+    6, 68, 7, 3, 1, 224, 136, 68, 7, 3, 1, 224, 136, 249, 12, 68, 7, 3, 1, \r
+    224, 136, 215, 189, 7, 1, 3, 6, 216, 216, 7, 1, 3, 6, 219, 40, 7, 1, 3, \r
+    6, 217, 157, 7, 1, 3, 6, 246, 76, 7, 1, 219, 70, 235, 144, 223, 241, 7, \r
+    1, 254, 191, 23, 1, 3, 6, 244, 231, 23, 1, 3, 6, 235, 156, 23, 1, 3, 6, \r
+    229, 108, 23, 1, 3, 6, 227, 149, 23, 1, 3, 6, 228, 212, 31, 1, 3, 6, 246, \r
+    217, 58, 1, 6, 60, 58, 1, 6, 254, 234, 58, 1, 6, 253, 204, 58, 1, 6, 252, \r
+    196, 253, 204, 58, 1, 6, 250, 46, 58, 1, 6, 73, 58, 1, 6, 210, 73, 58, 1, \r
+    6, 245, 67, 58, 1, 6, 243, 225, 58, 1, 6, 72, 58, 1, 6, 237, 126, 58, 1, \r
+    6, 237, 17, 58, 1, 6, 153, 58, 1, 6, 189, 58, 1, 6, 207, 58, 1, 6, 210, \r
+    207, 58, 1, 6, 74, 58, 1, 6, 230, 86, 58, 1, 6, 230, 59, 58, 1, 6, 152, \r
+    58, 1, 6, 222, 201, 58, 1, 6, 68, 58, 1, 6, 219, 40, 58, 1, 3, 60, 58, 1, \r
+    3, 215, 60, 58, 1, 3, 254, 146, 58, 1, 3, 215, 254, 234, 58, 1, 3, 253, \r
+    204, 58, 1, 3, 250, 46, 58, 1, 3, 73, 58, 1, 3, 226, 104, 58, 1, 3, 230, \r
+    119, 73, 58, 1, 3, 215, 230, 119, 73, 58, 1, 3, 245, 67, 58, 1, 3, 215, \r
+    72, 58, 1, 3, 237, 17, 58, 1, 3, 189, 58, 1, 3, 246, 185, 58, 1, 3, 74, \r
+    58, 1, 3, 230, 119, 74, 58, 1, 3, 221, 120, 144, 74, 58, 1, 3, 252, 29, \r
+    144, 74, 58, 1, 3, 230, 59, 58, 1, 3, 222, 201, 58, 1, 3, 68, 58, 1, 3, \r
+    224, 136, 68, 58, 1, 3, 215, 189, 58, 1, 3, 216, 216, 58, 1, 3, 254, 191, \r
+    58, 1, 3, 252, 102, 58, 1, 3, 23, 244, 231, 58, 1, 3, 249, 62, 58, 1, 3, \r
+    23, 229, 129, 58, 1, 3, 251, 31, 7, 223, 94, 3, 1, 72, 7, 223, 94, 3, 1, \r
+    152, 7, 223, 94, 3, 1, 68, 7, 223, 94, 3, 1, 216, 216, 23, 223, 94, 3, 1, \r
+    252, 102, 23, 223, 94, 3, 1, 244, 231, 23, 223, 94, 3, 1, 227, 149, 23, \r
+    223, 94, 3, 1, 229, 129, 23, 223, 94, 3, 1, 251, 31, 7, 3, 1, 220, 110, \r
+    7, 3, 1, 49, 2, 233, 193, 221, 179, 7, 3, 1, 250, 47, 2, 233, 193, 221, \r
+    179, 7, 3, 1, 246, 75, 2, 233, 193, 221, 179, 7, 3, 1, 234, 187, 2, 233, \r
+    193, 221, 179, 7, 3, 1, 233, 34, 2, 233, 193, 221, 179, 7, 3, 1, 230, 60, \r
+    2, 233, 193, 221, 179, 7, 3, 1, 228, 39, 2, 233, 193, 221, 179, 7, 3, 1, \r
+    228, 39, 2, 245, 174, 25, 233, 193, 221, 179, 7, 3, 1, 226, 235, 2, 233, \r
+    193, 221, 179, 7, 3, 1, 222, 202, 2, 233, 193, 221, 179, 7, 3, 1, 217, \r
+    158, 2, 233, 193, 221, 179, 7, 3, 1, 215, 245, 67, 58, 1, 31, 246, 197, \r
+    7, 3, 1, 237, 188, 245, 67, 7, 3, 1, 222, 38, 2, 223, 121, 7, 3, 6, 1, \r
+    242, 107, 2, 92, 7, 3, 1, 237, 163, 2, 92, 7, 3, 1, 230, 60, 2, 92, 7, 3, \r
+    6, 1, 105, 2, 92, 7, 3, 1, 220, 58, 2, 92, 7, 3, 1, 49, 2, 230, 29, 96, \r
+    7, 3, 1, 250, 47, 2, 230, 29, 96, 7, 3, 1, 246, 75, 2, 230, 29, 96, 7, 3, \r
+    1, 245, 68, 2, 230, 29, 96, 7, 3, 1, 237, 18, 2, 230, 29, 96, 7, 3, 1, \r
+    235, 202, 2, 230, 29, 96, 7, 3, 1, 234, 187, 2, 230, 29, 96, 7, 3, 1, \r
+    233, 34, 2, 230, 29, 96, 7, 3, 1, 230, 60, 2, 230, 29, 96, 7, 3, 1, 228, \r
+    39, 2, 230, 29, 96, 7, 3, 1, 226, 235, 2, 230, 29, 96, 7, 3, 1, 246, 134, \r
+    2, 230, 29, 96, 7, 3, 1, 220, 11, 2, 230, 29, 96, 7, 3, 1, 218, 152, 2, \r
+    230, 29, 96, 7, 3, 1, 217, 158, 2, 230, 29, 96, 7, 3, 1, 112, 2, 227, \r
+    164, 96, 7, 3, 1, 254, 147, 2, 227, 164, 96, 7, 3, 1, 250, 47, 2, 242, \r
+    247, 25, 222, 135, 7, 3, 1, 178, 2, 227, 164, 96, 7, 3, 1, 230, 119, 178, \r
+    2, 227, 164, 96, 7, 3, 1, 210, 230, 119, 178, 2, 227, 164, 96, 7, 3, 1, \r
+    226, 105, 2, 227, 164, 96, 7, 3, 1, 242, 107, 2, 227, 164, 96, 7, 3, 1, \r
+    230, 119, 142, 2, 227, 164, 96, 7, 3, 1, 246, 134, 2, 227, 164, 96, 7, 3, \r
+    1, 105, 2, 227, 164, 96, 7, 3, 1, 246, 77, 2, 227, 164, 96, 58, 1, 3, \r
+    215, 254, 146, 58, 1, 3, 251, 202, 58, 1, 3, 251, 203, 2, 250, 80, 58, 1, \r
+    3, 246, 118, 58, 1, 3, 210, 230, 119, 73, 58, 1, 3, 246, 74, 58, 1, 3, \r
+    248, 144, 237, 127, 2, 92, 58, 1, 3, 102, 245, 67, 58, 1, 3, 215, 243, \r
+    225, 58, 1, 3, 242, 107, 2, 92, 58, 1, 3, 237, 162, 58, 1, 3, 6, 72, 58, \r
+    1, 3, 6, 242, 107, 2, 92, 58, 1, 3, 237, 127, 2, 250, 97, 58, 1, 3, 235, \r
+    202, 2, 227, 164, 96, 58, 1, 3, 235, 202, 2, 230, 29, 96, 58, 1, 3, 6, \r
+    153, 58, 1, 3, 234, 187, 2, 96, 58, 1, 3, 215, 234, 187, 2, 171, 235, \r
+    106, 58, 1, 3, 233, 34, 2, 42, 96, 58, 1, 3, 233, 34, 2, 227, 164, 96, \r
+    58, 1, 3, 6, 207, 58, 1, 3, 252, 196, 74, 58, 1, 3, 229, 129, 58, 1, 3, \r
+    226, 235, 2, 96, 58, 1, 3, 246, 133, 58, 1, 3, 222, 202, 2, 230, 29, 96, \r
+    58, 1, 3, 105, 135, 58, 1, 3, 220, 57, 58, 1, 3, 6, 68, 58, 1, 3, 220, \r
+    11, 2, 96, 58, 1, 3, 215, 216, 216, 58, 1, 3, 217, 157, 58, 1, 3, 217, \r
+    158, 2, 227, 164, 96, 58, 1, 3, 217, 158, 2, 250, 80, 58, 1, 3, 246, 76, \r
+    58, 1, 3, 222, 6, 36, 247, 143, 244, 37, 255, 0, 36, 247, 143, 254, 248, \r
+    255, 0, 36, 224, 36, 56, 36, 223, 45, 78, 36, 234, 114, 36, 244, 34, 36, \r
+    234, 112, 36, 254, 246, 36, 244, 35, 36, 254, 247, 36, 7, 3, 1, 228, 39, \r
+    56, 36, 252, 7, 36, 234, 113, 36, 51, 250, 217, 50, 36, 230, 163, 50, 36, \r
+    217, 33, 56, 36, 237, 152, 56, 36, 220, 51, 50, 36, 220, 35, 50, 36, 7, \r
+    3, 1, 245, 154, 230, 119, 112, 50, 36, 7, 3, 1, 254, 234, 36, 7, 3, 1, \r
+    254, 93, 36, 7, 3, 1, 253, 220, 36, 7, 3, 1, 251, 203, 251, 92, 36, 7, 3, \r
+    1, 237, 188, 250, 46, 36, 7, 3, 1, 246, 118, 36, 7, 3, 1, 245, 67, 36, 7, \r
+    1, 3, 6, 245, 67, 36, 7, 3, 1, 237, 17, 36, 7, 3, 1, 153, 36, 7, 1, 3, 6, \r
+    153, 36, 7, 1, 3, 6, 189, 36, 7, 3, 1, 207, 36, 7, 1, 3, 6, 207, 36, 7, \r
+    1, 3, 6, 152, 36, 7, 3, 1, 228, 39, 227, 58, 36, 7, 3, 1, 198, 36, 7, 3, \r
+    1, 171, 198, 36, 7, 3, 1, 217, 157, 36, 254, 151, 114, 199, 56, 36, 42, \r
+    254, 21, 50, 36, 45, 254, 21, 25, 113, 254, 21, 56, 7, 6, 1, 112, 2, 227, \r
+    94, 56, 7, 3, 1, 112, 2, 227, 94, 56, 7, 6, 1, 49, 2, 61, 50, 7, 3, 1, \r
+    49, 2, 61, 50, 7, 6, 1, 49, 2, 61, 56, 7, 3, 1, 49, 2, 61, 56, 7, 6, 1, \r
+    49, 2, 235, 44, 56, 7, 3, 1, 49, 2, 235, 44, 56, 7, 6, 1, 251, 203, 2, \r
+    251, 93, 25, 168, 7, 3, 1, 251, 203, 2, 251, 93, 25, 168, 7, 6, 1, 250, \r
+    47, 2, 61, 50, 7, 3, 1, 250, 47, 2, 61, 50, 7, 6, 1, 250, 47, 2, 61, 56, \r
+    7, 3, 1, 250, 47, 2, 61, 56, 7, 6, 1, 250, 47, 2, 235, 44, 56, 7, 3, 1, \r
+    250, 47, 2, 235, 44, 56, 7, 6, 1, 250, 47, 2, 251, 92, 7, 3, 1, 250, 47, \r
+    2, 251, 92, 7, 6, 1, 250, 47, 2, 250, 217, 56, 7, 3, 1, 250, 47, 2, 250, \r
+    217, 56, 7, 6, 1, 178, 2, 234, 116, 25, 244, 36, 7, 3, 1, 178, 2, 234, \r
+    116, 25, 244, 36, 7, 6, 1, 178, 2, 234, 116, 25, 168, 7, 3, 1, 178, 2, \r
+    234, 116, 25, 168, 7, 6, 1, 178, 2, 250, 217, 56, 7, 3, 1, 178, 2, 250, \r
+    217, 56, 7, 6, 1, 178, 2, 221, 180, 56, 7, 3, 1, 178, 2, 221, 180, 56, 7, \r
+    6, 1, 178, 2, 251, 93, 25, 252, 8, 7, 3, 1, 178, 2, 251, 93, 25, 252, 8, \r
+    7, 6, 1, 246, 75, 2, 61, 50, 7, 3, 1, 246, 75, 2, 61, 50, 7, 6, 1, 245, \r
+    68, 2, 234, 115, 7, 3, 1, 245, 68, 2, 234, 115, 7, 6, 1, 243, 226, 2, 61, \r
+    50, 7, 3, 1, 243, 226, 2, 61, 50, 7, 6, 1, 243, 226, 2, 61, 56, 7, 3, 1, \r
+    243, 226, 2, 61, 56, 7, 6, 1, 243, 226, 2, 249, 13, 7, 3, 1, 243, 226, 2, \r
+    249, 13, 7, 6, 1, 243, 226, 2, 251, 92, 7, 3, 1, 243, 226, 2, 251, 92, 7, \r
+    6, 1, 243, 226, 2, 252, 9, 56, 7, 3, 1, 243, 226, 2, 252, 9, 56, 7, 6, 1, \r
+    242, 107, 2, 221, 180, 56, 7, 3, 1, 242, 107, 2, 221, 180, 56, 7, 6, 1, \r
+    242, 107, 2, 249, 14, 25, 168, 7, 3, 1, 242, 107, 2, 249, 14, 25, 168, 7, \r
+    6, 1, 237, 18, 2, 168, 7, 3, 1, 237, 18, 2, 168, 7, 6, 1, 237, 18, 2, 61, \r
+    56, 7, 3, 1, 237, 18, 2, 61, 56, 7, 6, 1, 237, 18, 2, 235, 44, 56, 7, 3, \r
+    1, 237, 18, 2, 235, 44, 56, 7, 6, 1, 235, 202, 2, 61, 56, 7, 3, 1, 235, \r
+    202, 2, 61, 56, 7, 6, 1, 235, 202, 2, 61, 252, 118, 25, 234, 115, 7, 3, \r
+    1, 235, 202, 2, 61, 252, 118, 25, 234, 115, 7, 6, 1, 235, 202, 2, 235, \r
+    44, 56, 7, 3, 1, 235, 202, 2, 235, 44, 56, 7, 6, 1, 235, 202, 2, 250, \r
+    217, 56, 7, 3, 1, 235, 202, 2, 250, 217, 56, 7, 6, 1, 234, 187, 2, 168, \r
+    7, 3, 1, 234, 187, 2, 168, 7, 6, 1, 234, 187, 2, 61, 50, 7, 3, 1, 234, \r
+    187, 2, 61, 50, 7, 6, 1, 234, 187, 2, 61, 56, 7, 3, 1, 234, 187, 2, 61, \r
+    56, 7, 6, 1, 233, 34, 2, 61, 50, 7, 3, 1, 233, 34, 2, 61, 50, 7, 6, 1, \r
+    233, 34, 2, 61, 56, 7, 3, 1, 233, 34, 2, 61, 56, 7, 6, 1, 233, 34, 2, \r
+    235, 44, 56, 7, 3, 1, 233, 34, 2, 235, 44, 56, 7, 6, 1, 233, 34, 2, 250, \r
+    217, 56, 7, 3, 1, 233, 34, 2, 250, 217, 56, 7, 6, 1, 142, 2, 221, 180, \r
+    25, 168, 7, 3, 1, 142, 2, 221, 180, 25, 168, 7, 6, 1, 142, 2, 221, 180, \r
+    25, 249, 13, 7, 3, 1, 142, 2, 221, 180, 25, 249, 13, 7, 6, 1, 142, 2, \r
+    234, 116, 25, 244, 36, 7, 3, 1, 142, 2, 234, 116, 25, 244, 36, 7, 6, 1, \r
+    142, 2, 234, 116, 25, 168, 7, 3, 1, 142, 2, 234, 116, 25, 168, 7, 6, 1, \r
+    230, 60, 2, 168, 7, 3, 1, 230, 60, 2, 168, 7, 6, 1, 230, 60, 2, 61, 50, \r
+    7, 3, 1, 230, 60, 2, 61, 50, 7, 6, 1, 228, 39, 2, 61, 50, 7, 3, 1, 228, \r
+    39, 2, 61, 50, 7, 6, 1, 228, 39, 2, 61, 56, 7, 3, 1, 228, 39, 2, 61, 56, \r
+    7, 6, 1, 228, 39, 2, 61, 252, 118, 25, 234, 115, 7, 3, 1, 228, 39, 2, 61, \r
+    252, 118, 25, 234, 115, 7, 6, 1, 228, 39, 2, 235, 44, 56, 7, 3, 1, 228, \r
+    39, 2, 235, 44, 56, 7, 6, 1, 226, 235, 2, 61, 50, 7, 3, 1, 226, 235, 2, \r
+    61, 50, 7, 6, 1, 226, 235, 2, 61, 56, 7, 3, 1, 226, 235, 2, 61, 56, 7, 6, \r
+    1, 226, 235, 2, 254, 248, 25, 61, 50, 7, 3, 1, 226, 235, 2, 254, 248, 25, \r
+    61, 50, 7, 6, 1, 226, 235, 2, 251, 131, 25, 61, 50, 7, 3, 1, 226, 235, 2, \r
+    251, 131, 25, 61, 50, 7, 6, 1, 226, 235, 2, 61, 252, 118, 25, 61, 50, 7, \r
+    3, 1, 226, 235, 2, 61, 252, 118, 25, 61, 50, 7, 6, 1, 222, 202, 2, 61, \r
+    50, 7, 3, 1, 222, 202, 2, 61, 50, 7, 6, 1, 222, 202, 2, 61, 56, 7, 3, 1, \r
+    222, 202, 2, 61, 56, 7, 6, 1, 222, 202, 2, 235, 44, 56, 7, 3, 1, 222, \r
+    202, 2, 235, 44, 56, 7, 6, 1, 222, 202, 2, 250, 217, 56, 7, 3, 1, 222, \r
+    202, 2, 250, 217, 56, 7, 6, 1, 105, 2, 249, 14, 56, 7, 3, 1, 105, 2, 249, \r
+    14, 56, 7, 6, 1, 105, 2, 221, 180, 56, 7, 3, 1, 105, 2, 221, 180, 56, 7, \r
+    6, 1, 105, 2, 250, 217, 56, 7, 3, 1, 105, 2, 250, 217, 56, 7, 6, 1, 105, \r
+    2, 221, 180, 25, 168, 7, 3, 1, 105, 2, 221, 180, 25, 168, 7, 6, 1, 105, \r
+    2, 234, 116, 25, 249, 13, 7, 3, 1, 105, 2, 234, 116, 25, 249, 13, 7, 6, \r
+    1, 220, 11, 2, 221, 179, 7, 3, 1, 220, 11, 2, 221, 179, 7, 6, 1, 220, 11, \r
+    2, 61, 56, 7, 3, 1, 220, 11, 2, 61, 56, 7, 6, 1, 219, 41, 2, 244, 36, 7, \r
+    3, 1, 219, 41, 2, 244, 36, 7, 6, 1, 219, 41, 2, 168, 7, 3, 1, 219, 41, 2, \r
+    168, 7, 6, 1, 219, 41, 2, 249, 13, 7, 3, 1, 219, 41, 2, 249, 13, 7, 6, 1, \r
+    219, 41, 2, 61, 50, 7, 3, 1, 219, 41, 2, 61, 50, 7, 6, 1, 219, 41, 2, 61, \r
+    56, 7, 3, 1, 219, 41, 2, 61, 56, 7, 6, 1, 218, 152, 2, 61, 50, 7, 3, 1, \r
+    218, 152, 2, 61, 50, 7, 6, 1, 218, 152, 2, 249, 13, 7, 3, 1, 218, 152, 2, \r
+    249, 13, 7, 6, 1, 218, 91, 2, 61, 50, 7, 3, 1, 218, 91, 2, 61, 50, 7, 6, \r
+    1, 217, 158, 2, 250, 216, 7, 3, 1, 217, 158, 2, 250, 216, 7, 6, 1, 217, \r
+    158, 2, 61, 56, 7, 3, 1, 217, 158, 2, 61, 56, 7, 6, 1, 217, 158, 2, 235, \r
+    44, 56, 7, 3, 1, 217, 158, 2, 235, 44, 56, 7, 3, 1, 243, 226, 2, 235, 44, \r
+    56, 7, 3, 1, 222, 202, 2, 249, 13, 7, 3, 1, 219, 41, 2, 227, 94, 50, 7, \r
+    3, 1, 218, 91, 2, 227, 94, 50, 7, 3, 1, 112, 2, 45, 144, 227, 93, 7, 3, \r
+    1, 171, 226, 235, 2, 61, 50, 7, 3, 1, 171, 226, 235, 2, 249, 11, 92, 7, \r
+    3, 1, 171, 226, 235, 2, 116, 92, 7, 6, 1, 225, 1, 198, 7, 3, 1, 249, 62, \r
+    7, 6, 1, 112, 2, 61, 56, 7, 3, 1, 112, 2, 61, 56, 7, 6, 1, 112, 2, 242, \r
+    247, 50, 7, 3, 1, 112, 2, 242, 247, 50, 7, 6, 1, 112, 2, 250, 217, 25, \r
+    168, 7, 3, 1, 112, 2, 250, 217, 25, 168, 7, 6, 1, 112, 2, 250, 217, 25, \r
+    244, 36, 7, 3, 1, 112, 2, 250, 217, 25, 244, 36, 7, 6, 1, 112, 2, 250, \r
+    217, 25, 242, 247, 50, 7, 3, 1, 112, 2, 250, 217, 25, 242, 247, 50, 7, 6, \r
+    1, 112, 2, 250, 217, 25, 221, 179, 7, 3, 1, 112, 2, 250, 217, 25, 221, \r
+    179, 7, 6, 1, 112, 2, 250, 217, 25, 61, 56, 7, 3, 1, 112, 2, 250, 217, \r
+    25, 61, 56, 7, 6, 1, 112, 2, 252, 9, 25, 168, 7, 3, 1, 112, 2, 252, 9, \r
+    25, 168, 7, 6, 1, 112, 2, 252, 9, 25, 244, 36, 7, 3, 1, 112, 2, 252, 9, \r
+    25, 244, 36, 7, 6, 1, 112, 2, 252, 9, 25, 242, 247, 50, 7, 3, 1, 112, 2, \r
+    252, 9, 25, 242, 247, 50, 7, 6, 1, 112, 2, 252, 9, 25, 221, 179, 7, 3, 1, \r
+    112, 2, 252, 9, 25, 221, 179, 7, 6, 1, 112, 2, 252, 9, 25, 61, 56, 7, 3, \r
+    1, 112, 2, 252, 9, 25, 61, 56, 7, 6, 1, 178, 2, 61, 56, 7, 3, 1, 178, 2, \r
+    61, 56, 7, 6, 1, 178, 2, 242, 247, 50, 7, 3, 1, 178, 2, 242, 247, 50, 7, \r
+    6, 1, 178, 2, 221, 179, 7, 3, 1, 178, 2, 221, 179, 7, 6, 1, 178, 2, 250, \r
+    217, 25, 168, 7, 3, 1, 178, 2, 250, 217, 25, 168, 7, 6, 1, 178, 2, 250, \r
+    217, 25, 244, 36, 7, 3, 1, 178, 2, 250, 217, 25, 244, 36, 7, 6, 1, 178, \r
+    2, 250, 217, 25, 242, 247, 50, 7, 3, 1, 178, 2, 250, 217, 25, 242, 247, \r
+    50, 7, 6, 1, 178, 2, 250, 217, 25, 221, 179, 7, 3, 1, 178, 2, 250, 217, \r
+    25, 221, 179, 7, 6, 1, 178, 2, 250, 217, 25, 61, 56, 7, 3, 1, 178, 2, \r
+    250, 217, 25, 61, 56, 7, 6, 1, 242, 107, 2, 242, 247, 50, 7, 3, 1, 242, \r
+    107, 2, 242, 247, 50, 7, 6, 1, 242, 107, 2, 61, 56, 7, 3, 1, 242, 107, 2, \r
+    61, 56, 7, 6, 1, 142, 2, 61, 56, 7, 3, 1, 142, 2, 61, 56, 7, 6, 1, 142, \r
+    2, 242, 247, 50, 7, 3, 1, 142, 2, 242, 247, 50, 7, 6, 1, 142, 2, 250, \r
+    217, 25, 168, 7, 3, 1, 142, 2, 250, 217, 25, 168, 7, 6, 1, 142, 2, 250, \r
+    217, 25, 244, 36, 7, 3, 1, 142, 2, 250, 217, 25, 244, 36, 7, 6, 1, 142, \r
+    2, 250, 217, 25, 242, 247, 50, 7, 3, 1, 142, 2, 250, 217, 25, 242, 247, \r
+    50, 7, 6, 1, 142, 2, 250, 217, 25, 221, 179, 7, 3, 1, 142, 2, 250, 217, \r
+    25, 221, 179, 7, 6, 1, 142, 2, 250, 217, 25, 61, 56, 7, 3, 1, 142, 2, \r
+    250, 217, 25, 61, 56, 7, 6, 1, 142, 2, 242, 190, 25, 168, 7, 3, 1, 142, \r
+    2, 242, 190, 25, 168, 7, 6, 1, 142, 2, 242, 190, 25, 244, 36, 7, 3, 1, \r
+    142, 2, 242, 190, 25, 244, 36, 7, 6, 1, 142, 2, 242, 190, 25, 242, 247, \r
+    50, 7, 3, 1, 142, 2, 242, 190, 25, 242, 247, 50, 7, 6, 1, 142, 2, 242, \r
+    190, 25, 221, 179, 7, 3, 1, 142, 2, 242, 190, 25, 221, 179, 7, 6, 1, 142, \r
+    2, 242, 190, 25, 61, 56, 7, 3, 1, 142, 2, 242, 190, 25, 61, 56, 7, 6, 1, \r
+    105, 2, 61, 56, 7, 3, 1, 105, 2, 61, 56, 7, 6, 1, 105, 2, 242, 247, 50, \r
+    7, 3, 1, 105, 2, 242, 247, 50, 7, 6, 1, 105, 2, 242, 190, 25, 168, 7, 3, \r
+    1, 105, 2, 242, 190, 25, 168, 7, 6, 1, 105, 2, 242, 190, 25, 244, 36, 7, \r
+    3, 1, 105, 2, 242, 190, 25, 244, 36, 7, 6, 1, 105, 2, 242, 190, 25, 242, \r
+    247, 50, 7, 3, 1, 105, 2, 242, 190, 25, 242, 247, 50, 7, 6, 1, 105, 2, \r
+    242, 190, 25, 221, 179, 7, 3, 1, 105, 2, 242, 190, 25, 221, 179, 7, 6, 1, \r
+    105, 2, 242, 190, 25, 61, 56, 7, 3, 1, 105, 2, 242, 190, 25, 61, 56, 7, \r
+    6, 1, 218, 91, 2, 244, 36, 7, 3, 1, 218, 91, 2, 244, 36, 7, 6, 1, 218, \r
+    91, 2, 61, 56, 7, 3, 1, 218, 91, 2, 61, 56, 7, 6, 1, 218, 91, 2, 242, \r
+    247, 50, 7, 3, 1, 218, 91, 2, 242, 247, 50, 7, 6, 1, 218, 91, 2, 221, \r
+    179, 7, 3, 1, 218, 91, 2, 221, 179, 7, 6, 1, 233, 192, 235, 18, 7, 3, 1, \r
+    233, 192, 235, 18, 7, 6, 1, 233, 192, 216, 216, 7, 3, 1, 233, 192, 216, \r
+    216, 7, 6, 1, 218, 91, 2, 234, 247, 7, 3, 1, 218, 91, 2, 234, 247, 23, 3, \r
+    1, 254, 147, 2, 228, 206, 23, 3, 1, 254, 147, 2, 249, 144, 23, 3, 1, 254, \r
+    147, 2, 209, 25, 219, 178, 23, 3, 1, 254, 147, 2, 193, 25, 219, 178, 23, \r
+    3, 1, 254, 147, 2, 209, 25, 230, 64, 23, 3, 1, 254, 147, 2, 193, 25, 230, \r
+    64, 23, 3, 1, 254, 147, 2, 209, 25, 229, 163, 23, 3, 1, 254, 147, 2, 193, \r
+    25, 229, 163, 23, 6, 1, 254, 147, 2, 228, 206, 23, 6, 1, 254, 147, 2, \r
+    249, 144, 23, 6, 1, 254, 147, 2, 209, 25, 219, 178, 23, 6, 1, 254, 147, \r
+    2, 193, 25, 219, 178, 23, 6, 1, 254, 147, 2, 209, 25, 230, 64, 23, 6, 1, \r
+    254, 147, 2, 193, 25, 230, 64, 23, 6, 1, 254, 147, 2, 209, 25, 229, 163, \r
+    23, 6, 1, 254, 147, 2, 193, 25, 229, 163, 23, 3, 1, 246, 157, 2, 228, \r
+    206, 23, 3, 1, 246, 157, 2, 249, 144, 23, 3, 1, 246, 157, 2, 209, 25, \r
+    219, 178, 23, 3, 1, 246, 157, 2, 193, 25, 219, 178, 23, 3, 1, 246, 157, \r
+    2, 209, 25, 230, 64, 23, 3, 1, 246, 157, 2, 193, 25, 230, 64, 23, 6, 1, \r
+    246, 157, 2, 228, 206, 23, 6, 1, 246, 157, 2, 249, 144, 23, 6, 1, 246, \r
+    157, 2, 209, 25, 219, 178, 23, 6, 1, 246, 157, 2, 193, 25, 219, 178, 23, \r
+    6, 1, 246, 157, 2, 209, 25, 230, 64, 23, 6, 1, 246, 157, 2, 193, 25, 230, \r
+    64, 23, 3, 1, 246, 122, 2, 228, 206, 23, 3, 1, 246, 122, 2, 249, 144, 23, \r
+    3, 1, 246, 122, 2, 209, 25, 219, 178, 23, 3, 1, 246, 122, 2, 193, 25, \r
+    219, 178, 23, 3, 1, 246, 122, 2, 209, 25, 230, 64, 23, 3, 1, 246, 122, 2, \r
+    193, 25, 230, 64, 23, 3, 1, 246, 122, 2, 209, 25, 229, 163, 23, 3, 1, \r
+    246, 122, 2, 193, 25, 229, 163, 23, 6, 1, 246, 122, 2, 228, 206, 23, 6, \r
+    1, 246, 122, 2, 249, 144, 23, 6, 1, 246, 122, 2, 209, 25, 219, 178, 23, \r
+    6, 1, 246, 122, 2, 193, 25, 219, 178, 23, 6, 1, 246, 122, 2, 209, 25, \r
+    230, 64, 23, 6, 1, 246, 122, 2, 193, 25, 230, 64, 23, 6, 1, 246, 122, 2, \r
+    209, 25, 229, 163, 23, 6, 1, 246, 122, 2, 193, 25, 229, 163, 23, 3, 1, \r
+    237, 163, 2, 228, 206, 23, 3, 1, 237, 163, 2, 249, 144, 23, 3, 1, 237, \r
+    163, 2, 209, 25, 219, 178, 23, 3, 1, 237, 163, 2, 193, 25, 219, 178, 23, \r
+    3, 1, 237, 163, 2, 209, 25, 230, 64, 23, 3, 1, 237, 163, 2, 193, 25, 230, \r
+    64, 23, 3, 1, 237, 163, 2, 209, 25, 229, 163, 23, 3, 1, 237, 163, 2, 193, \r
+    25, 229, 163, 23, 6, 1, 237, 163, 2, 228, 206, 23, 6, 1, 237, 163, 2, \r
+    249, 144, 23, 6, 1, 237, 163, 2, 209, 25, 219, 178, 23, 6, 1, 237, 163, \r
+    2, 193, 25, 219, 178, 23, 6, 1, 237, 163, 2, 209, 25, 230, 64, 23, 6, 1, \r
+    237, 163, 2, 193, 25, 230, 64, 23, 6, 1, 237, 163, 2, 209, 25, 229, 163, \r
+    23, 6, 1, 237, 163, 2, 193, 25, 229, 163, 23, 3, 1, 230, 142, 2, 228, \r
+    206, 23, 3, 1, 230, 142, 2, 249, 144, 23, 3, 1, 230, 142, 2, 209, 25, \r
+    219, 178, 23, 3, 1, 230, 142, 2, 193, 25, 219, 178, 23, 3, 1, 230, 142, \r
+    2, 209, 25, 230, 64, 23, 3, 1, 230, 142, 2, 193, 25, 230, 64, 23, 6, 1, \r
+    230, 142, 2, 228, 206, 23, 6, 1, 230, 142, 2, 249, 144, 23, 6, 1, 230, \r
+    142, 2, 209, 25, 219, 178, 23, 6, 1, 230, 142, 2, 193, 25, 219, 178, 23, \r
+    6, 1, 230, 142, 2, 209, 25, 230, 64, 23, 6, 1, 230, 142, 2, 193, 25, 230, \r
+    64, 23, 3, 1, 220, 58, 2, 228, 206, 23, 3, 1, 220, 58, 2, 249, 144, 23, \r
+    3, 1, 220, 58, 2, 209, 25, 219, 178, 23, 3, 1, 220, 58, 2, 193, 25, 219, \r
+    178, 23, 3, 1, 220, 58, 2, 209, 25, 230, 64, 23, 3, 1, 220, 58, 2, 193, \r
+    25, 230, 64, 23, 3, 1, 220, 58, 2, 209, 25, 229, 163, 23, 3, 1, 220, 58, \r
+    2, 193, 25, 229, 163, 23, 6, 1, 220, 58, 2, 249, 144, 23, 6, 1, 220, 58, \r
+    2, 193, 25, 219, 178, 23, 6, 1, 220, 58, 2, 193, 25, 230, 64, 23, 6, 1, \r
+    220, 58, 2, 193, 25, 229, 163, 23, 3, 1, 230, 144, 2, 228, 206, 23, 3, 1, \r
+    230, 144, 2, 249, 144, 23, 3, 1, 230, 144, 2, 209, 25, 219, 178, 23, 3, \r
+    1, 230, 144, 2, 193, 25, 219, 178, 23, 3, 1, 230, 144, 2, 209, 25, 230, \r
+    64, 23, 3, 1, 230, 144, 2, 193, 25, 230, 64, 23, 3, 1, 230, 144, 2, 209, \r
+    25, 229, 163, 23, 3, 1, 230, 144, 2, 193, 25, 229, 163, 23, 6, 1, 230, \r
+    144, 2, 228, 206, 23, 6, 1, 230, 144, 2, 249, 144, 23, 6, 1, 230, 144, 2, \r
+    209, 25, 219, 178, 23, 6, 1, 230, 144, 2, 193, 25, 219, 178, 23, 6, 1, \r
+    230, 144, 2, 209, 25, 230, 64, 23, 6, 1, 230, 144, 2, 193, 25, 230, 64, \r
+    23, 6, 1, 230, 144, 2, 209, 25, 229, 163, 23, 6, 1, 230, 144, 2, 193, 25, \r
+    229, 163, 23, 3, 1, 254, 147, 2, 219, 178, 23, 3, 1, 254, 147, 2, 230, \r
+    64, 23, 3, 1, 246, 157, 2, 219, 178, 23, 3, 1, 246, 157, 2, 230, 64, 23, \r
+    3, 1, 246, 122, 2, 219, 178, 23, 3, 1, 246, 122, 2, 230, 64, 23, 3, 1, \r
+    237, 163, 2, 219, 178, 23, 3, 1, 237, 163, 2, 230, 64, 23, 3, 1, 230, \r
+    142, 2, 219, 178, 23, 3, 1, 230, 142, 2, 230, 64, 23, 3, 1, 220, 58, 2, \r
+    219, 178, 23, 3, 1, 220, 58, 2, 230, 64, 23, 3, 1, 230, 144, 2, 219, 178, \r
+    23, 3, 1, 230, 144, 2, 230, 64, 23, 3, 1, 254, 147, 2, 209, 25, 217, 207, \r
+    23, 3, 1, 254, 147, 2, 193, 25, 217, 207, 23, 3, 1, 254, 147, 2, 209, 25, \r
+    219, 179, 25, 217, 207, 23, 3, 1, 254, 147, 2, 193, 25, 219, 179, 25, \r
+    217, 207, 23, 3, 1, 254, 147, 2, 209, 25, 230, 65, 25, 217, 207, 23, 3, \r
+    1, 254, 147, 2, 193, 25, 230, 65, 25, 217, 207, 23, 3, 1, 254, 147, 2, \r
+    209, 25, 229, 164, 25, 217, 207, 23, 3, 1, 254, 147, 2, 193, 25, 229, \r
+    164, 25, 217, 207, 23, 6, 1, 254, 147, 2, 209, 25, 228, 217, 23, 6, 1, \r
+    254, 147, 2, 193, 25, 228, 217, 23, 6, 1, 254, 147, 2, 209, 25, 219, 179, \r
+    25, 228, 217, 23, 6, 1, 254, 147, 2, 193, 25, 219, 179, 25, 228, 217, 23, \r
+    6, 1, 254, 147, 2, 209, 25, 230, 65, 25, 228, 217, 23, 6, 1, 254, 147, 2, \r
+    193, 25, 230, 65, 25, 228, 217, 23, 6, 1, 254, 147, 2, 209, 25, 229, 164, \r
+    25, 228, 217, 23, 6, 1, 254, 147, 2, 193, 25, 229, 164, 25, 228, 217, 23, \r
+    3, 1, 246, 122, 2, 209, 25, 217, 207, 23, 3, 1, 246, 122, 2, 193, 25, \r
+    217, 207, 23, 3, 1, 246, 122, 2, 209, 25, 219, 179, 25, 217, 207, 23, 3, \r
+    1, 246, 122, 2, 193, 25, 219, 179, 25, 217, 207, 23, 3, 1, 246, 122, 2, \r
+    209, 25, 230, 65, 25, 217, 207, 23, 3, 1, 246, 122, 2, 193, 25, 230, 65, \r
+    25, 217, 207, 23, 3, 1, 246, 122, 2, 209, 25, 229, 164, 25, 217, 207, 23, \r
+    3, 1, 246, 122, 2, 193, 25, 229, 164, 25, 217, 207, 23, 6, 1, 246, 122, \r
+    2, 209, 25, 228, 217, 23, 6, 1, 246, 122, 2, 193, 25, 228, 217, 23, 6, 1, \r
+    246, 122, 2, 209, 25, 219, 179, 25, 228, 217, 23, 6, 1, 246, 122, 2, 193, \r
+    25, 219, 179, 25, 228, 217, 23, 6, 1, 246, 122, 2, 209, 25, 230, 65, 25, \r
+    228, 217, 23, 6, 1, 246, 122, 2, 193, 25, 230, 65, 25, 228, 217, 23, 6, \r
+    1, 246, 122, 2, 209, 25, 229, 164, 25, 228, 217, 23, 6, 1, 246, 122, 2, \r
+    193, 25, 229, 164, 25, 228, 217, 23, 3, 1, 230, 144, 2, 209, 25, 217, \r
+    207, 23, 3, 1, 230, 144, 2, 193, 25, 217, 207, 23, 3, 1, 230, 144, 2, \r
+    209, 25, 219, 179, 25, 217, 207, 23, 3, 1, 230, 144, 2, 193, 25, 219, \r
+    179, 25, 217, 207, 23, 3, 1, 230, 144, 2, 209, 25, 230, 65, 25, 217, 207, \r
+    23, 3, 1, 230, 144, 2, 193, 25, 230, 65, 25, 217, 207, 23, 3, 1, 230, \r
+    144, 2, 209, 25, 229, 164, 25, 217, 207, 23, 3, 1, 230, 144, 2, 193, 25, \r
+    229, 164, 25, 217, 207, 23, 6, 1, 230, 144, 2, 209, 25, 228, 217, 23, 6, \r
+    1, 230, 144, 2, 193, 25, 228, 217, 23, 6, 1, 230, 144, 2, 209, 25, 219, \r
+    179, 25, 228, 217, 23, 6, 1, 230, 144, 2, 193, 25, 219, 179, 25, 228, \r
+    217, 23, 6, 1, 230, 144, 2, 209, 25, 230, 65, 25, 228, 217, 23, 6, 1, \r
+    230, 144, 2, 193, 25, 230, 65, 25, 228, 217, 23, 6, 1, 230, 144, 2, 209, \r
+    25, 229, 164, 25, 228, 217, 23, 6, 1, 230, 144, 2, 193, 25, 229, 164, 25, \r
+    228, 217, 23, 3, 1, 254, 147, 2, 219, 57, 23, 3, 1, 254, 147, 2, 234, \r
+    115, 23, 3, 1, 254, 147, 2, 219, 179, 25, 217, 207, 23, 3, 1, 254, 147, \r
+    2, 217, 207, 23, 3, 1, 254, 147, 2, 230, 65, 25, 217, 207, 23, 3, 1, 254, \r
+    147, 2, 229, 163, 23, 3, 1, 254, 147, 2, 229, 164, 25, 217, 207, 23, 6, \r
+    1, 254, 147, 2, 219, 57, 23, 6, 1, 254, 147, 2, 234, 115, 23, 6, 1, 254, \r
+    147, 2, 219, 178, 23, 6, 1, 254, 147, 2, 230, 64, 23, 6, 1, 254, 147, 2, \r
+    228, 217, 23, 236, 33, 23, 228, 217, 23, 228, 206, 23, 229, 163, 23, 249, \r
+    8, 25, 229, 163, 23, 3, 1, 246, 122, 2, 219, 179, 25, 217, 207, 23, 3, 1, \r
+    246, 122, 2, 217, 207, 23, 3, 1, 246, 122, 2, 230, 65, 25, 217, 207, 23, \r
+    3, 1, 246, 122, 2, 229, 163, 23, 3, 1, 246, 122, 2, 229, 164, 25, 217, \r
+    207, 23, 6, 1, 246, 157, 2, 219, 178, 23, 6, 1, 246, 157, 2, 230, 64, 23, \r
+    6, 1, 246, 122, 2, 219, 178, 23, 6, 1, 246, 122, 2, 230, 64, 23, 6, 1, \r
+    246, 122, 2, 228, 217, 23, 209, 25, 219, 178, 23, 209, 25, 230, 64, 23, \r
+    209, 25, 229, 163, 23, 3, 1, 237, 163, 2, 219, 57, 23, 3, 1, 237, 163, 2, \r
+    234, 115, 23, 3, 1, 237, 163, 2, 249, 8, 25, 219, 178, 23, 3, 1, 237, \r
+    163, 2, 249, 8, 25, 230, 64, 23, 3, 1, 237, 163, 2, 229, 163, 23, 3, 1, \r
+    237, 163, 2, 249, 8, 25, 229, 163, 23, 6, 1, 237, 163, 2, 219, 57, 23, 6, \r
+    1, 237, 163, 2, 234, 115, 23, 6, 1, 237, 163, 2, 219, 178, 23, 6, 1, 237, \r
+    163, 2, 230, 64, 23, 193, 25, 219, 178, 23, 193, 25, 230, 64, 23, 193, \r
+    25, 229, 163, 23, 3, 1, 220, 58, 2, 219, 57, 23, 3, 1, 220, 58, 2, 234, \r
+    115, 23, 3, 1, 220, 58, 2, 249, 8, 25, 219, 178, 23, 3, 1, 220, 58, 2, \r
+    249, 8, 25, 230, 64, 23, 3, 1, 227, 150, 2, 228, 206, 23, 3, 1, 227, 150, \r
+    2, 249, 144, 23, 3, 1, 220, 58, 2, 229, 163, 23, 3, 1, 220, 58, 2, 249, \r
+    8, 25, 229, 163, 23, 6, 1, 220, 58, 2, 219, 57, 23, 6, 1, 220, 58, 2, \r
+    234, 115, 23, 6, 1, 220, 58, 2, 219, 178, 23, 6, 1, 220, 58, 2, 230, 64, \r
+    23, 6, 1, 227, 150, 2, 249, 144, 23, 249, 8, 25, 219, 178, 23, 249, 8, \r
+    25, 230, 64, 23, 219, 178, 23, 3, 1, 230, 144, 2, 219, 179, 25, 217, 207, \r
+    23, 3, 1, 230, 144, 2, 217, 207, 23, 3, 1, 230, 144, 2, 230, 65, 25, 217, \r
+    207, 23, 3, 1, 230, 144, 2, 229, 163, 23, 3, 1, 230, 144, 2, 229, 164, \r
+    25, 217, 207, 23, 6, 1, 230, 142, 2, 219, 178, 23, 6, 1, 230, 142, 2, \r
+    230, 64, 23, 6, 1, 230, 144, 2, 219, 178, 23, 6, 1, 230, 144, 2, 230, 64, \r
+    23, 6, 1, 230, 144, 2, 228, 217, 23, 230, 64, 23, 249, 144, 246, 198, \r
+    228, 95, 246, 206, 228, 95, 246, 198, 223, 254, 246, 206, 223, 254, 221, \r
+    226, 223, 254, 245, 114, 223, 254, 224, 80, 223, 254, 245, 194, 223, 254, \r
+    228, 197, 223, 254, 221, 253, 223, 254, 243, 201, 223, 254, 217, 85, 218, \r
+    199, 223, 254, 217, 85, 218, 199, 231, 197, 217, 85, 218, 199, 237, 54, \r
+    235, 108, 78, 227, 102, 78, 242, 121, 231, 198, 242, 121, 245, 194, 249, \r
+    146, 246, 198, 249, 146, 246, 206, 249, 146, 186, 135, 51, 69, 235, 43, \r
+    51, 109, 235, 43, 42, 224, 109, 228, 69, 78, 45, 224, 109, 228, 69, 78, \r
+    224, 109, 234, 238, 228, 69, 78, 224, 109, 243, 98, 228, 69, 78, 42, 51, \r
+    228, 69, 78, 45, 51, 228, 69, 78, 51, 234, 238, 228, 69, 78, 51, 243, 98, \r
+    228, 69, 78, 249, 192, 51, 249, 192, 251, 241, 221, 87, 251, 241, 131, \r
+    61, 235, 121, 124, 61, 235, 121, 186, 246, 208, 242, 119, 229, 31, 235, \r
+    44, 225, 54, 229, 241, 225, 54, 235, 108, 246, 204, 227, 102, 246, 204, \r
+    229, 20, 248, 209, 245, 123, 235, 108, 230, 71, 227, 102, 230, 71, 232, \r
+    210, 231, 203, 223, 254, 229, 170, 233, 164, 55, 229, 170, 222, 66, 221, \r
+    232, 55, 228, 235, 51, 228, 235, 221, 78, 228, 235, 210, 228, 235, 210, \r
+    51, 228, 235, 210, 221, 78, 228, 235, 251, 134, 224, 109, 235, 112, 254, \r
+    120, 228, 69, 78, 224, 109, 227, 106, 254, 120, 228, 69, 78, 227, 199, \r
+    78, 51, 246, 95, 78, 237, 177, 230, 73, 220, 78, 126, 221, 200, 251, 135, \r
+    237, 191, 229, 31, 253, 249, 242, 122, 251, 241, 245, 108, 224, 55, 42, \r
+    40, 252, 18, 2, 228, 77, 45, 40, 252, 18, 2, 228, 77, 51, 228, 82, 78, \r
+    228, 82, 246, 95, 78, 246, 95, 228, 82, 78, 221, 164, 5, 246, 123, 210, \r
+    229, 73, 55, 84, 127, 251, 241, 84, 90, 251, 241, 109, 253, 251, 210, \r
+    225, 67, 250, 198, 220, 63, 124, 253, 250, 254, 159, 219, 101, 250, 167, \r
+    233, 155, 55, 223, 23, 249, 146, 237, 170, 220, 78, 245, 145, 228, 197, \r
+    78, 148, 61, 228, 196, 228, 92, 228, 235, 245, 116, 61, 228, 196, 245, \r
+    170, 61, 228, 196, 124, 61, 228, 196, 245, 116, 61, 78, 247, 143, 250, \r
+    100, 221, 86, 69, 245, 116, 248, 143, 234, 18, 14, 223, 254, 218, 174, \r
+    237, 54, 245, 88, 254, 76, 237, 168, 221, 176, 237, 168, 225, 54, 237, \r
+    168, 229, 43, 237, 201, 222, 228, 223, 34, 254, 250, 222, 228, 223, 34, \r
+    237, 201, 12, 245, 124, 225, 5, 254, 250, 12, 245, 124, 225, 5, 232, 206, \r
+    20, 225, 6, 231, 199, 20, 225, 6, 223, 59, 217, 84, 223, 59, 7, 3, 1, 72, \r
+    223, 59, 154, 223, 59, 174, 223, 59, 182, 223, 59, 191, 223, 59, 185, \r
+    223, 59, 190, 223, 59, 88, 55, 223, 59, 233, 154, 223, 59, 246, 154, 55, \r
+    223, 59, 42, 229, 229, 223, 59, 45, 229, 229, 223, 59, 7, 3, 1, 207, 223, \r
+    94, 217, 84, 223, 94, 107, 223, 94, 103, 223, 94, 160, 223, 94, 154, 223, \r
+    94, 174, 223, 94, 182, 223, 94, 191, 223, 94, 185, 223, 94, 190, 223, 94, \r
+    88, 55, 223, 94, 233, 154, 223, 94, 246, 154, 55, 223, 94, 42, 229, 229, \r
+    223, 94, 45, 229, 229, 7, 223, 94, 3, 1, 60, 7, 223, 94, 3, 1, 73, 7, \r
+    223, 94, 3, 1, 74, 7, 223, 94, 3, 1, 218, 151, 7, 223, 94, 3, 1, 226, \r
+    104, 246, 106, 55, 250, 176, 55, 250, 94, 55, 245, 102, 245, 104, 55, \r
+    235, 30, 55, 233, 165, 55, 232, 223, 55, 229, 153, 55, 227, 4, 55, 218, \r
+    182, 55, 146, 224, 232, 55, 248, 152, 55, 246, 107, 55, 236, 100, 55, \r
+    220, 252, 55, 247, 127, 55, 244, 170, 229, 177, 55, 229, 151, 55, 244, \r
+    14, 55, 253, 224, 55, 242, 176, 55, 251, 94, 55, 235, 24, 221, 111, 55, \r
+    223, 246, 55, 222, 64, 55, 36, 42, 243, 177, 50, 36, 45, 243, 177, 50, \r
+    36, 171, 69, 235, 44, 230, 74, 36, 224, 192, 69, 235, 44, 230, 74, 36, \r
+    254, 104, 76, 50, 36, 250, 199, 76, 50, 36, 42, 76, 50, 36, 45, 76, 50, \r
+    36, 227, 94, 230, 74, 36, 250, 199, 227, 94, 230, 74, 36, 254, 104, 227, \r
+    94, 230, 74, 36, 148, 188, 50, 36, 245, 116, 188, 50, 36, 246, 193, 250, \r
+    221, 36, 246, 193, 223, 227, 36, 246, 193, 249, 4, 36, 246, 193, 250, \r
+    222, 252, 230, 36, 42, 45, 76, 50, 36, 246, 193, 226, 100, 36, 246, 193, \r
+    236, 152, 36, 246, 193, 220, 55, 229, 28, 221, 90, 36, 227, 160, 224, 18, \r
+    230, 74, 36, 51, 69, 214, 230, 74, 36, 254, 111, 100, 36, 221, 78, 220, \r
+    80, 36, 218, 201, 252, 4, 50, 36, 127, 76, 230, 74, 36, 171, 51, 224, 18, \r
+    230, 74, 36, 90, 243, 177, 2, 192, 247, 129, 36, 127, 243, 177, 2, 192, \r
+    247, 129, 36, 42, 76, 56, 36, 45, 76, 56, 36, 253, 252, 50, 254, 254, \r
+    230, 165, 254, 241, 199, 222, 23, 223, 98, 173, 6, 251, 202, 249, 77, \r
+    251, 88, 251, 85, 235, 44, 100, 251, 136, 230, 165, 251, 165, 220, 86, \r
+    246, 108, 250, 144, 226, 98, 249, 77, 245, 250, 102, 3, 245, 67, 102, 6, \r
+    243, 225, 252, 51, 6, 243, 225, 173, 6, 243, 225, 229, 53, 250, 144, 229, \r
+    53, 250, 145, 104, 124, 229, 108, 102, 6, 72, 252, 51, 6, 72, 102, 6, \r
+    153, 102, 3, 153, 235, 202, 49, 252, 201, 100, 173, 6, 207, 231, 105, 55, \r
+    224, 9, 227, 210, 250, 125, 102, 6, 230, 59, 173, 6, 230, 59, 173, 6, \r
+    228, 163, 102, 6, 152, 252, 51, 6, 152, 173, 6, 152, 228, 239, 222, 129, \r
+    227, 169, 225, 50, 78, 222, 72, 55, 221, 107, 164, 55, 219, 153, 173, 6, \r
+    217, 157, 230, 85, 55, 230, 160, 55, 237, 170, 230, 160, 55, 252, 51, 6, \r
+    217, 157, 215, 23, 3, 1, 237, 162, 236, 175, 55, 254, 118, 55, 102, 6, \r
+    253, 204, 252, 51, 6, 251, 202, 246, 126, 100, 102, 3, 73, 102, 6, 73, \r
+    102, 6, 246, 74, 215, 6, 246, 74, 102, 6, 189, 102, 3, 74, 99, 100, 252, \r
+    105, 100, 244, 92, 100, 249, 178, 100, 237, 205, 224, 7, 227, 59, 6, 228, \r
+    163, 245, 252, 55, 173, 3, 229, 108, 173, 3, 244, 231, 173, 6, 244, 231, \r
+    173, 6, 229, 108, 173, 233, 33, 223, 71, 215, 33, 6, 245, 67, 215, 33, 6, \r
+    153, 210, 33, 6, 153, 215, 33, 6, 218, 90, 173, 30, 6, 250, 46, 173, 30, \r
+    3, 250, 46, 173, 30, 3, 73, 173, 30, 3, 72, 173, 30, 3, 237, 126, 228, \r
+    220, 235, 43, 215, 254, 134, 229, 170, 55, 254, 177, 215, 3, 246, 74, 16, \r
+    35, 213, 224, 7, 219, 55, 245, 108, 131, 225, 40, 219, 55, 245, 108, 131, \r
+    232, 26, 219, 55, 245, 108, 131, 222, 61, 219, 55, 245, 108, 131, 221, \r
+    251, 219, 55, 245, 108, 124, 221, 249, 219, 55, 245, 108, 131, 245, 199, \r
+    219, 55, 245, 108, 124, 245, 198, 219, 55, 245, 108, 148, 245, 198, 219, \r
+    55, 245, 108, 245, 116, 245, 198, 219, 55, 245, 108, 131, 224, 73, 219, \r
+    55, 245, 108, 245, 170, 224, 71, 219, 55, 245, 108, 131, 246, 231, 219, \r
+    55, 245, 108, 148, 246, 229, 219, 55, 245, 108, 245, 170, 246, 229, 219, \r
+    55, 245, 108, 225, 43, 246, 229, 245, 108, 231, 106, 107, 227, 68, 231, \r
+    107, 107, 227, 68, 231, 107, 103, 227, 68, 231, 107, 160, 227, 68, 231, \r
+    107, 154, 227, 68, 231, 107, 174, 227, 68, 231, 107, 182, 227, 68, 231, \r
+    107, 191, 227, 68, 231, 107, 185, 227, 68, 231, 107, 190, 227, 68, 231, \r
+    107, 222, 65, 227, 68, 231, 107, 246, 211, 227, 68, 231, 107, 220, 221, \r
+    227, 68, 231, 107, 245, 196, 227, 68, 231, 107, 131, 242, 161, 227, 68, \r
+    231, 107, 245, 170, 242, 161, 227, 68, 231, 107, 131, 221, 231, 3, 227, \r
+    68, 231, 107, 107, 3, 227, 68, 231, 107, 103, 3, 227, 68, 231, 107, 160, \r
+    3, 227, 68, 231, 107, 154, 3, 227, 68, 231, 107, 174, 3, 227, 68, 231, \r
+    107, 182, 3, 227, 68, 231, 107, 191, 3, 227, 68, 231, 107, 185, 3, 227, \r
+    68, 231, 107, 190, 3, 227, 68, 231, 107, 222, 65, 3, 227, 68, 231, 107, \r
+    246, 211, 3, 227, 68, 231, 107, 220, 221, 3, 227, 68, 231, 107, 245, 196, \r
+    3, 227, 68, 231, 107, 131, 242, 161, 3, 227, 68, 231, 107, 245, 170, 242, \r
+    161, 3, 227, 68, 231, 107, 131, 221, 231, 227, 68, 231, 107, 131, 221, \r
+    232, 251, 203, 250, 46, 227, 68, 231, 107, 245, 170, 221, 231, 227, 68, \r
+    231, 107, 222, 66, 221, 231, 227, 68, 231, 107, 210, 131, 242, 161, 7, 3, \r
+    1, 210, 251, 202, 227, 68, 231, 107, 224, 82, 235, 140, 17, 227, 68, 231, \r
+    107, 245, 197, 247, 10, 17, 227, 68, 231, 107, 245, 197, 221, 231, 227, \r
+    68, 231, 107, 131, 242, 162, 221, 231, 219, 55, 245, 108, 217, 85, 221, \r
+    249, 127, 65, 220, 53, 65, 90, 65, 247, 130, 65, 42, 45, 65, 108, 113, \r
+    65, 231, 187, 218, 217, 65, 231, 187, 247, 5, 65, 224, 6, 247, 5, 65, \r
+    224, 6, 218, 217, 65, 127, 76, 2, 92, 90, 76, 2, 92, 127, 218, 237, 65, \r
+    90, 218, 237, 65, 127, 124, 243, 158, 65, 220, 53, 124, 243, 158, 65, 90, \r
+    124, 243, 158, 65, 247, 130, 124, 243, 158, 65, 127, 76, 2, 222, 135, 90, \r
+    76, 2, 222, 135, 127, 76, 245, 97, 135, 220, 53, 76, 245, 97, 135, 90, \r
+    76, 245, 97, 135, 247, 130, 76, 245, 97, 135, 108, 113, 76, 2, 252, 189, \r
+    127, 76, 2, 96, 90, 76, 2, 96, 127, 76, 2, 234, 247, 90, 76, 2, 234, 247, \r
+    42, 45, 218, 237, 65, 42, 45, 76, 2, 92, 247, 130, 217, 33, 65, 220, 53, \r
+    76, 2, 221, 170, 235, 107, 220, 53, 76, 2, 221, 170, 227, 100, 247, 130, \r
+    76, 2, 221, 170, 235, 107, 247, 130, 76, 2, 221, 170, 227, 100, 90, 76, \r
+    2, 250, 124, 247, 129, 247, 130, 76, 2, 250, 124, 235, 107, 254, 104, \r
+    221, 120, 225, 70, 65, 250, 199, 221, 120, 225, 70, 65, 231, 187, 218, \r
+    217, 76, 199, 171, 135, 127, 76, 199, 252, 201, 104, 90, 76, 199, 135, \r
+    254, 104, 230, 119, 250, 222, 65, 250, 199, 230, 119, 250, 222, 65, 127, \r
+    243, 177, 2, 192, 220, 52, 127, 243, 177, 2, 192, 247, 129, 220, 53, 243, \r
+    177, 2, 192, 227, 100, 220, 53, 243, 177, 2, 192, 235, 107, 90, 243, 177, \r
+    2, 192, 220, 52, 90, 243, 177, 2, 192, 247, 129, 247, 130, 243, 177, 2, \r
+    192, 227, 100, 247, 130, 243, 177, 2, 192, 235, 107, 90, 76, 104, 127, \r
+    65, 220, 53, 76, 127, 117, 247, 130, 65, 127, 76, 104, 90, 65, 127, 230, \r
+    32, 254, 19, 220, 53, 230, 32, 254, 19, 90, 230, 32, 254, 19, 247, 130, \r
+    230, 32, 254, 19, 127, 243, 177, 104, 90, 243, 176, 90, 243, 177, 104, \r
+    127, 243, 176, 127, 51, 76, 2, 92, 42, 45, 51, 76, 2, 92, 90, 51, 76, 2, \r
+    92, 127, 51, 65, 220, 53, 51, 65, 90, 51, 65, 247, 130, 51, 65, 42, 45, \r
+    51, 65, 108, 113, 51, 65, 231, 187, 218, 217, 51, 65, 231, 187, 247, 5, \r
+    51, 65, 224, 6, 247, 5, 51, 65, 224, 6, 218, 217, 51, 65, 127, 221, 78, \r
+    65, 90, 221, 78, 65, 127, 223, 223, 65, 90, 223, 223, 65, 220, 53, 76, 2, \r
+    51, 92, 247, 130, 76, 2, 51, 92, 127, 249, 145, 65, 220, 53, 249, 145, \r
+    65, 90, 249, 145, 65, 247, 130, 249, 145, 65, 127, 76, 199, 135, 90, 76, \r
+    199, 135, 127, 67, 65, 220, 53, 67, 65, 90, 67, 65, 247, 130, 67, 65, \r
+    220, 53, 67, 76, 245, 97, 135, 220, 53, 67, 76, 230, 139, 229, 193, 220, \r
+    53, 67, 76, 230, 139, 229, 194, 2, 186, 135, 220, 53, 67, 76, 230, 139, \r
+    229, 194, 2, 69, 135, 220, 53, 67, 51, 65, 220, 53, 67, 51, 76, 230, 139, \r
+    229, 193, 90, 67, 76, 245, 97, 218, 254, 231, 187, 218, 217, 76, 199, \r
+    250, 123, 224, 6, 247, 5, 76, 199, 250, 123, 108, 113, 67, 65, 45, 76, 2, \r
+    3, 250, 221, 247, 130, 76, 127, 117, 220, 53, 65, 148, 90, 254, 19, 127, \r
+    76, 2, 69, 92, 90, 76, 2, 69, 92, 42, 45, 76, 2, 69, 92, 127, 76, 2, 51, \r
+    69, 92, 90, 76, 2, 51, 69, 92, 42, 45, 76, 2, 51, 69, 92, 127, 230, 117, \r
+    65, 90, 230, 117, 65, 42, 45, 230, 117, 65, 35, 254, 157, 250, 164, 229, \r
+    223, 248, 246, 222, 14, 246, 91, 222, 14, 248, 160, 212, 246, 92, 246, \r
+    199, 225, 45, 237, 215, 232, 231, 246, 213, 230, 165, 212, 254, 132, 246, \r
+    213, 230, 165, 3, 246, 213, 230, 165, 250, 140, 254, 14, 233, 254, 248, \r
+    160, 212, 250, 142, 254, 14, 233, 254, 3, 250, 140, 254, 14, 233, 254, \r
+    246, 190, 117, 228, 222, 233, 33, 228, 229, 233, 33, 250, 128, 233, 33, \r
+    223, 71, 233, 155, 55, 233, 153, 55, 61, 229, 43, 248, 188, 224, 55, 225, \r
+    46, 233, 154, 253, 252, 230, 112, 227, 94, 230, 112, 251, 242, 230, 112, \r
+    40, 227, 64, 250, 89, 227, 64, 245, 110, 227, 64, 228, 218, 101, 237, \r
+    207, 45, 254, 119, 254, 119, 234, 22, 254, 119, 223, 245, 254, 119, 248, \r
+    190, 248, 160, 212, 248, 193, 229, 234, 101, 212, 229, 234, 101, 235, 7, \r
+    254, 126, 235, 7, 230, 105, 237, 174, 220, 74, 237, 186, 51, 237, 186, \r
+    221, 78, 237, 186, 250, 136, 237, 186, 223, 49, 237, 186, 219, 65, 237, \r
+    186, 250, 199, 237, 186, 250, 199, 250, 136, 237, 186, 254, 104, 250, \r
+    136, 237, 186, 222, 13, 252, 138, 227, 224, 228, 219, 61, 233, 154, 246, \r
+    96, 244, 176, 228, 219, 242, 250, 221, 180, 230, 112, 210, 221, 179, 237, \r
+    170, 235, 129, 198, 224, 111, 218, 236, 218, 168, 228, 229, 212, 221, \r
+    179, 233, 155, 221, 179, 253, 247, 114, 101, 212, 253, 247, 114, 101, \r
+    254, 72, 114, 101, 254, 72, 251, 222, 212, 254, 249, 114, 101, 232, 135, \r
+    254, 72, 231, 190, 254, 249, 114, 101, 254, 151, 114, 101, 212, 254, 151, \r
+    114, 101, 254, 151, 114, 156, 114, 101, 221, 78, 221, 179, 254, 158, 114, \r
+    101, 246, 150, 101, 244, 175, 246, 150, 101, 248, 247, 252, 99, 254, 74, \r
+    222, 23, 235, 51, 244, 175, 114, 101, 254, 72, 114, 199, 156, 222, 23, \r
+    237, 237, 230, 165, 237, 237, 117, 156, 254, 72, 114, 101, 250, 176, 246, \r
+    153, 246, 154, 250, 175, 227, 94, 237, 224, 114, 101, 227, 94, 114, 101, \r
+    250, 117, 101, 246, 125, 246, 152, 101, 223, 157, 246, 153, 249, 63, 114, \r
+    101, 114, 199, 251, 213, 249, 78, 234, 22, 251, 212, 228, 80, 114, 101, \r
+    212, 114, 101, 242, 59, 101, 212, 242, 59, 101, 223, 123, 246, 150, 101, \r
+    235, 87, 156, 114, 101, 244, 30, 156, 114, 101, 235, 87, 104, 114, 101, \r
+    244, 30, 104, 114, 101, 235, 87, 251, 222, 212, 114, 101, 244, 30, 251, \r
+    222, 212, 114, 101, 233, 95, 235, 86, 233, 95, 244, 29, 252, 99, 212, \r
+    246, 150, 101, 212, 235, 86, 212, 244, 29, 232, 135, 235, 87, 231, 190, \r
+    114, 101, 232, 135, 244, 30, 231, 190, 114, 101, 235, 87, 156, 246, 150, \r
+    101, 244, 30, 156, 246, 150, 101, 232, 135, 235, 87, 231, 190, 246, 150, \r
+    101, 232, 135, 244, 30, 231, 190, 246, 150, 101, 235, 87, 156, 244, 29, \r
+    244, 30, 156, 235, 86, 232, 135, 235, 87, 231, 190, 244, 29, 232, 135, \r
+    244, 30, 231, 190, 235, 86, 228, 244, 223, 84, 228, 245, 156, 114, 101, \r
+    223, 85, 156, 114, 101, 228, 245, 156, 246, 150, 101, 223, 85, 156, 246, \r
+    150, 101, 248, 160, 212, 228, 247, 248, 160, 212, 223, 86, 223, 93, 230, \r
+    165, 223, 58, 230, 165, 212, 112, 223, 93, 230, 165, 212, 112, 223, 58, \r
+    230, 165, 223, 93, 117, 156, 114, 101, 223, 58, 117, 156, 114, 101, 232, \r
+    135, 112, 223, 93, 117, 231, 190, 114, 101, 232, 135, 112, 223, 58, 117, \r
+    231, 190, 114, 101, 223, 93, 117, 2, 212, 114, 101, 223, 58, 117, 2, 212, \r
+    114, 101, 233, 81, 233, 82, 233, 83, 233, 82, 220, 74, 40, 237, 237, 230, \r
+    165, 40, 230, 101, 230, 165, 40, 237, 237, 117, 156, 114, 101, 40, 230, \r
+    101, 117, 156, 114, 101, 40, 251, 143, 40, 250, 82, 34, 229, 43, 34, 233, \r
+    154, 34, 221, 176, 34, 248, 188, 224, 55, 34, 61, 230, 112, 34, 227, 94, \r
+    230, 112, 34, 253, 252, 230, 112, 34, 246, 153, 34, 249, 146, 204, 229, \r
+    43, 204, 233, 154, 204, 221, 176, 204, 61, 230, 112, 45, 222, 143, 42, \r
+    222, 143, 113, 222, 143, 108, 222, 143, 253, 255, 233, 133, 221, 62, 245, \r
+    128, 221, 78, 69, 252, 201, 45, 220, 236, 51, 69, 252, 201, 51, 45, 220, \r
+    236, 248, 160, 212, 228, 214, 212, 221, 62, 248, 160, 212, 245, 129, 232, \r
+    138, 51, 69, 252, 201, 51, 45, 220, 236, 228, 245, 220, 82, 227, 192, \r
+    223, 85, 220, 82, 227, 192, 231, 188, 223, 101, 230, 165, 250, 140, 254, \r
+    14, 231, 188, 223, 100, 231, 188, 223, 101, 117, 156, 114, 101, 250, 140, \r
+    254, 14, 231, 188, 223, 101, 156, 114, 101, 230, 101, 230, 165, 237, 237, \r
+    230, 165, 233, 87, 243, 131, 250, 150, 234, 49, 237, 183, 218, 118, 232, \r
+    216, 231, 189, 45, 254, 120, 2, 254, 51, 45, 221, 90, 233, 33, 235, 7, \r
+    254, 126, 233, 33, 235, 7, 230, 105, 233, 33, 237, 174, 233, 33, 220, 74, \r
+    249, 5, 230, 112, 61, 230, 112, 223, 157, 230, 112, 248, 188, 221, 176, \r
+    252, 22, 42, 231, 188, 245, 251, 225, 66, 228, 229, 45, 231, 188, 245, \r
+    251, 225, 66, 228, 229, 42, 225, 66, 228, 229, 45, 225, 66, 228, 229, \r
+    210, 221, 180, 246, 153, 250, 79, 235, 7, 230, 105, 250, 79, 235, 7, 254, \r
+    126, 51, 223, 92, 51, 223, 57, 51, 237, 174, 51, 220, 74, 229, 62, 114, \r
+    25, 229, 234, 101, 235, 87, 2, 248, 145, 244, 30, 2, 248, 145, 219, 100, \r
+    233, 95, 235, 86, 219, 100, 233, 95, 244, 29, 235, 87, 114, 199, 156, \r
+    244, 29, 244, 30, 114, 199, 156, 235, 86, 114, 199, 156, 235, 86, 114, \r
+    199, 156, 244, 29, 114, 199, 156, 228, 244, 114, 199, 156, 223, 84, 248, \r
+    160, 212, 228, 248, 156, 246, 155, 248, 160, 212, 223, 87, 156, 246, 155, \r
+    212, 40, 237, 237, 117, 156, 114, 101, 212, 40, 230, 101, 117, 156, 114, \r
+    101, 40, 237, 237, 117, 156, 212, 114, 101, 40, 230, 101, 117, 156, 212, \r
+    114, 101, 235, 87, 251, 222, 212, 246, 150, 101, 244, 30, 251, 222, 212, \r
+    246, 150, 101, 228, 245, 251, 222, 212, 246, 150, 101, 223, 85, 251, 222, \r
+    212, 246, 150, 101, 212, 231, 188, 223, 101, 230, 165, 248, 160, 212, \r
+    250, 142, 254, 14, 231, 188, 223, 100, 212, 231, 188, 223, 101, 117, 156, \r
+    114, 101, 248, 160, 212, 250, 142, 254, 14, 231, 188, 223, 101, 156, 246, \r
+    155, 69, 246, 208, 233, 191, 186, 246, 208, 108, 45, 249, 11, 246, 208, \r
+    113, 45, 249, 11, 246, 208, 246, 213, 117, 2, 171, 186, 92, 246, 213, \r
+    117, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 3, 246, 213, 117, \r
+    2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 246, 213, 117, 2, 61, \r
+    50, 246, 213, 117, 2, 230, 77, 3, 246, 213, 117, 2, 230, 77, 246, 213, \r
+    117, 2, 220, 81, 246, 213, 117, 2, 124, 186, 223, 107, 250, 140, 2, 171, \r
+    186, 92, 250, 140, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 3, \r
+    250, 140, 2, 69, 252, 201, 253, 245, 246, 190, 117, 186, 92, 250, 140, 2, \r
+    230, 77, 3, 250, 140, 2, 230, 77, 217, 158, 165, 252, 226, 233, 253, 249, \r
+    6, 55, 246, 215, 65, 242, 182, 108, 254, 20, 113, 254, 20, 228, 225, 229, \r
+    156, 218, 235, 235, 43, 42, 251, 90, 45, 251, 90, 42, 245, 149, 45, 245, \r
+    149, 252, 29, 45, 250, 102, 252, 29, 42, 250, 102, 221, 120, 45, 250, \r
+    102, 221, 120, 42, 250, 102, 210, 212, 55, 40, 234, 234, 254, 51, 226, \r
+    80, 226, 85, 222, 72, 227, 211, 229, 16, 237, 211, 219, 88, 223, 227, \r
+    229, 57, 117, 237, 182, 55, 215, 212, 55, 218, 242, 242, 183, 221, 120, \r
+    42, 250, 123, 221, 120, 45, 250, 123, 252, 29, 42, 250, 123, 252, 29, 45, \r
+    250, 123, 221, 120, 144, 237, 186, 252, 29, 144, 237, 186, 245, 95, 224, \r
+    39, 108, 254, 21, 252, 100, 124, 186, 252, 191, 230, 107, 236, 154, 246, \r
+    146, 199, 222, 23, 227, 109, 218, 152, 237, 224, 112, 227, 209, 252, 21, \r
+    236, 153, 235, 112, 254, 120, 115, 227, 106, 254, 120, 115, 246, 146, \r
+    199, 222, 23, 235, 115, 252, 111, 227, 93, 250, 56, 254, 158, 254, 28, \r
+    222, 227, 221, 112, 227, 9, 248, 228, 230, 102, 250, 152, 222, 113, 224, \r
+    49, 250, 114, 250, 113, 179, 180, 16, 242, 104, 179, 180, 16, 223, 221, \r
+    228, 95, 179, 180, 16, 228, 96, 246, 155, 179, 180, 16, 228, 96, 248, \r
+    193, 179, 180, 16, 228, 96, 249, 4, 179, 180, 16, 228, 96, 237, 47, 179, \r
+    180, 16, 228, 96, 250, 221, 179, 180, 16, 250, 222, 223, 142, 179, 180, \r
+    16, 250, 222, 237, 47, 179, 180, 16, 224, 56, 135, 179, 180, 16, 252, \r
+    231, 135, 179, 180, 16, 228, 96, 224, 55, 179, 180, 16, 228, 96, 252, \r
+    230, 179, 180, 16, 228, 96, 235, 86, 179, 180, 16, 228, 96, 244, 29, 179, \r
+    180, 16, 127, 219, 183, 179, 180, 16, 90, 219, 183, 179, 180, 16, 228, \r
+    96, 127, 65, 179, 180, 16, 228, 96, 90, 65, 179, 180, 16, 250, 222, 252, \r
+    230, 179, 180, 16, 113, 222, 144, 220, 81, 179, 180, 16, 249, 63, 223, \r
+    142, 179, 180, 16, 228, 96, 113, 251, 134, 179, 180, 16, 228, 96, 249, \r
+    62, 179, 180, 16, 113, 222, 144, 237, 47, 179, 180, 16, 220, 53, 219, \r
+    183, 179, 180, 16, 228, 96, 220, 53, 65, 179, 180, 16, 108, 222, 144, \r
+    230, 77, 179, 180, 16, 249, 72, 223, 142, 179, 180, 16, 228, 96, 108, \r
+    251, 134, 179, 180, 16, 228, 96, 249, 71, 179, 180, 16, 108, 222, 144, \r
+    237, 47, 179, 180, 16, 247, 130, 219, 183, 179, 180, 16, 228, 96, 247, \r
+    130, 65, 179, 180, 16, 228, 68, 220, 81, 179, 180, 16, 249, 63, 220, 81, \r
+    179, 180, 16, 249, 5, 220, 81, 179, 180, 16, 237, 48, 220, 81, 179, 180, \r
+    16, 250, 222, 220, 81, 179, 180, 16, 108, 224, 198, 237, 47, 179, 180, \r
+    16, 228, 68, 228, 95, 179, 180, 16, 250, 222, 223, 156, 179, 180, 16, \r
+    228, 96, 250, 175, 179, 180, 16, 108, 222, 144, 249, 13, 179, 180, 16, \r
+    249, 72, 249, 13, 179, 180, 16, 223, 157, 249, 13, 179, 180, 16, 237, 48, \r
+    249, 13, 179, 180, 16, 250, 222, 249, 13, 179, 180, 16, 113, 224, 198, \r
+    223, 142, 179, 180, 16, 42, 224, 198, 223, 142, 179, 180, 16, 221, 180, \r
+    249, 13, 179, 180, 16, 244, 30, 249, 13, 179, 180, 16, 250, 169, 135, \r
+    179, 180, 16, 249, 72, 221, 179, 179, 180, 16, 217, 32, 179, 180, 16, \r
+    223, 143, 221, 179, 179, 180, 16, 225, 68, 220, 81, 179, 180, 16, 228, \r
+    96, 212, 246, 155, 179, 180, 16, 228, 96, 228, 81, 179, 180, 16, 113, \r
+    251, 135, 221, 179, 179, 180, 16, 108, 251, 135, 221, 179, 179, 180, 16, \r
+    237, 162, 179, 180, 16, 227, 149, 179, 180, 16, 230, 143, 179, 180, 16, \r
+    254, 147, 220, 81, 179, 180, 16, 246, 157, 220, 81, 179, 180, 16, 237, \r
+    163, 220, 81, 179, 180, 16, 230, 144, 220, 81, 179, 180, 16, 254, 146, \r
+    212, 251, 45, 78, 45, 254, 120, 2, 247, 130, 217, 33, 65, 224, 177, 230, \r
+    119, 252, 21, 252, 120, 100, 69, 235, 44, 2, 233, 193, 248, 145, 237, \r
+    191, 100, 250, 137, 220, 79, 100, 248, 204, 220, 79, 100, 246, 201, 100, \r
+    250, 160, 100, 67, 40, 2, 251, 85, 69, 235, 43, 246, 179, 100, 254, 142, \r
+    236, 155, 100, 243, 142, 100, 34, 186, 252, 201, 2, 231, 183, 34, 221, \r
+    91, 247, 132, 252, 1, 250, 222, 2, 231, 186, 65, 220, 77, 100, 233, 122, \r
+    100, 242, 117, 100, 230, 118, 243, 224, 100, 230, 118, 235, 200, 100, \r
+    229, 218, 100, 229, 217, 100, 248, 210, 250, 77, 16, 245, 124, 103, 224, \r
+    20, 100, 179, 180, 16, 228, 95, 249, 86, 225, 55, 236, 155, 100, 228, \r
+    237, 230, 34, 232, 120, 230, 34, 228, 234, 226, 101, 100, 250, 209, 226, \r
+    101, 100, 42, 229, 230, 220, 60, 96, 42, 229, 230, 246, 86, 42, 229, 230, \r
+    234, 237, 96, 45, 229, 230, 220, 60, 96, 45, 229, 230, 246, 86, 45, 229, \r
+    230, 234, 237, 96, 42, 40, 252, 18, 220, 60, 250, 123, 42, 40, 252, 18, \r
+    246, 86, 42, 40, 252, 18, 234, 237, 250, 123, 45, 40, 252, 18, 220, 60, \r
+    250, 123, 45, 40, 252, 18, 246, 86, 45, 40, 252, 18, 234, 237, 250, 123, \r
+    42, 250, 79, 252, 18, 220, 60, 96, 42, 250, 79, 252, 18, 233, 193, 229, \r
+    102, 42, 250, 79, 252, 18, 234, 237, 96, 250, 79, 252, 18, 246, 86, 45, \r
+    250, 79, 252, 18, 220, 60, 96, 45, 250, 79, 252, 18, 233, 193, 229, 102, \r
+    45, 250, 79, 252, 18, 234, 237, 96, 237, 187, 246, 86, 186, 235, 44, 246, \r
+    86, 220, 60, 42, 156, 234, 237, 45, 250, 79, 252, 18, 226, 86, 220, 60, \r
+    45, 156, 234, 237, 42, 250, 79, 252, 18, 226, 86, 223, 72, 221, 119, 223, \r
+    72, 252, 28, 221, 120, 40, 115, 252, 29, 40, 115, 252, 29, 40, 252, 18, \r
+    104, 221, 120, 40, 115, 32, 16, 252, 28, 42, 69, 86, 235, 43, 45, 69, 86, \r
+    235, 43, 186, 226, 112, 235, 42, 186, 226, 112, 235, 41, 186, 226, 112, \r
+    235, 40, 186, 226, 112, 235, 39, 249, 54, 16, 170, 69, 25, 221, 120, 227, \r
+    109, 249, 54, 16, 170, 69, 25, 252, 29, 227, 109, 249, 54, 16, 170, 69, \r
+    2, 250, 221, 249, 54, 16, 170, 113, 25, 186, 2, 250, 221, 249, 54, 16, \r
+    170, 108, 25, 186, 2, 250, 221, 249, 54, 16, 170, 69, 2, 221, 90, 249, \r
+    54, 16, 170, 113, 25, 186, 2, 221, 90, 249, 54, 16, 170, 108, 25, 186, 2, \r
+    221, 90, 249, 54, 16, 170, 69, 25, 218, 236, 249, 54, 16, 170, 113, 25, \r
+    186, 2, 218, 236, 249, 54, 16, 170, 108, 25, 186, 2, 218, 236, 249, 54, \r
+    16, 170, 113, 25, 242, 241, 249, 54, 16, 170, 108, 25, 242, 241, 249, 54, \r
+    16, 170, 69, 25, 221, 120, 235, 115, 249, 54, 16, 170, 69, 25, 252, 29, \r
+    235, 115, 40, 245, 133, 227, 163, 100, 246, 225, 100, 69, 235, 44, 246, \r
+    86, 233, 233, 252, 8, 233, 233, 171, 104, 224, 191, 233, 233, 224, 192, \r
+    104, 235, 2, 233, 233, 171, 104, 124, 224, 179, 233, 233, 124, 224, 180, \r
+    104, 235, 2, 233, 233, 124, 224, 180, 237, 55, 233, 233, 221, 75, 233, \r
+    233, 222, 43, 233, 233, 229, 174, 247, 9, 244, 24, 245, 81, 221, 120, \r
+    229, 229, 252, 29, 229, 229, 221, 120, 250, 79, 115, 252, 29, 250, 79, \r
+    115, 221, 120, 221, 114, 224, 236, 115, 252, 29, 221, 114, 224, 236, 115, \r
+    67, 221, 101, 252, 111, 227, 94, 2, 250, 221, 223, 129, 245, 155, 255, 3, \r
+    250, 76, 246, 214, 237, 174, 249, 86, 246, 88, 100, 16, 35, 231, 110, 16, \r
+    35, 223, 154, 117, 243, 157, 16, 35, 223, 154, 117, 222, 39, 16, 35, 246, \r
+    190, 117, 222, 39, 16, 35, 246, 190, 117, 221, 104, 16, 35, 246, 181, 16, \r
+    35, 254, 252, 16, 35, 252, 119, 16, 35, 252, 229, 16, 35, 186, 222, 145, \r
+    16, 35, 235, 44, 245, 224, 16, 35, 69, 222, 145, 16, 35, 245, 124, 245, \r
+    224, 16, 35, 251, 128, 227, 162, 16, 35, 224, 217, 230, 83, 16, 35, 224, \r
+    217, 237, 223, 16, 35, 249, 142, 235, 34, 246, 135, 16, 35, 249, 42, 250, \r
+    132, 107, 16, 35, 249, 42, 250, 132, 103, 16, 35, 249, 42, 250, 132, 160, \r
+    16, 35, 249, 42, 250, 132, 154, 16, 35, 232, 136, 254, 252, 16, 35, 222, \r
+    224, 238, 28, 16, 35, 246, 190, 117, 221, 105, 252, 45, 16, 35, 251, 152, \r
+    16, 35, 246, 190, 117, 234, 17, 16, 35, 223, 90, 16, 35, 246, 135, 16, \r
+    35, 245, 189, 225, 54, 16, 35, 244, 23, 225, 54, 16, 35, 227, 212, 225, \r
+    54, 16, 35, 220, 73, 225, 54, 16, 35, 223, 254, 16, 35, 249, 69, 252, 48, \r
+    100, 230, 119, 252, 21, 16, 35, 232, 122, 16, 35, 249, 70, 245, 124, 103, \r
+    16, 35, 223, 91, 245, 124, 103, 230, 171, 96, 230, 171, 251, 64, 230, \r
+    171, 245, 127, 230, 171, 237, 170, 245, 127, 230, 171, 252, 117, 251, \r
+    247, 230, 171, 252, 25, 221, 200, 230, 171, 252, 15, 252, 204, 242, 58, \r
+    230, 171, 254, 135, 117, 251, 44, 230, 171, 249, 146, 230, 171, 250, 70, \r
+    254, 254, 231, 108, 230, 171, 51, 252, 230, 34, 20, 107, 34, 20, 103, 34, \r
+    20, 160, 34, 20, 154, 34, 20, 174, 34, 20, 182, 34, 20, 191, 34, 20, 185, \r
+    34, 20, 190, 34, 54, 222, 65, 34, 54, 246, 211, 34, 54, 220, 221, 34, 54, \r
+    221, 247, 34, 54, 245, 111, 34, 54, 245, 200, 34, 54, 224, 77, 34, 54, \r
+    225, 41, 34, 54, 246, 233, 34, 54, 232, 29, 34, 54, 220, 219, 82, 20, \r
+    107, 82, 20, 103, 82, 20, 160, 82, 20, 154, 82, 20, 174, 82, 20, 182, 82, \r
+    20, 191, 82, 20, 185, 82, 20, 190, 82, 54, 222, 65, 82, 54, 246, 211, 82, \r
+    54, 220, 221, 82, 54, 221, 247, 82, 54, 245, 111, 82, 54, 245, 200, 82, \r
+    54, 224, 77, 82, 54, 225, 41, 82, 54, 246, 233, 82, 54, 232, 29, 82, 54, \r
+    220, 219, 20, 131, 245, 90, 223, 136, 20, 124, 245, 90, 223, 136, 20, \r
+    148, 245, 90, 223, 136, 20, 245, 116, 245, 90, 223, 136, 20, 245, 170, \r
+    245, 90, 223, 136, 20, 224, 82, 245, 90, 223, 136, 20, 225, 43, 245, 90, \r
+    223, 136, 20, 246, 235, 245, 90, 223, 136, 20, 232, 31, 245, 90, 223, \r
+    136, 54, 222, 66, 245, 90, 223, 136, 54, 246, 212, 245, 90, 223, 136, 54, \r
+    220, 222, 245, 90, 223, 136, 54, 221, 248, 245, 90, 223, 136, 54, 245, \r
+    112, 245, 90, 223, 136, 54, 245, 201, 245, 90, 223, 136, 54, 224, 78, \r
+    245, 90, 223, 136, 54, 225, 42, 245, 90, 223, 136, 54, 246, 234, 245, 90, \r
+    223, 136, 54, 232, 30, 245, 90, 223, 136, 54, 220, 220, 245, 90, 223, \r
+    136, 82, 7, 3, 1, 60, 82, 7, 3, 1, 253, 204, 82, 7, 3, 1, 251, 202, 82, \r
+    7, 3, 1, 250, 46, 82, 7, 3, 1, 73, 82, 7, 3, 1, 246, 74, 82, 7, 3, 1, \r
+    245, 67, 82, 7, 3, 1, 243, 225, 82, 7, 3, 1, 72, 82, 7, 3, 1, 237, 126, \r
+    82, 7, 3, 1, 237, 17, 82, 7, 3, 1, 153, 82, 7, 3, 1, 189, 82, 7, 3, 1, \r
+    207, 82, 7, 3, 1, 74, 82, 7, 3, 1, 230, 59, 82, 7, 3, 1, 228, 163, 82, 7, \r
+    3, 1, 152, 82, 7, 3, 1, 198, 82, 7, 3, 1, 222, 201, 82, 7, 3, 1, 68, 82, \r
+    7, 3, 1, 216, 216, 82, 7, 3, 1, 219, 40, 82, 7, 3, 1, 218, 151, 82, 7, 3, \r
+    1, 218, 90, 82, 7, 3, 1, 217, 157, 34, 7, 6, 1, 60, 34, 7, 6, 1, 253, \r
+    204, 34, 7, 6, 1, 251, 202, 34, 7, 6, 1, 250, 46, 34, 7, 6, 1, 73, 34, 7, \r
+    6, 1, 246, 74, 34, 7, 6, 1, 245, 67, 34, 7, 6, 1, 243, 225, 34, 7, 6, 1, \r
+    72, 34, 7, 6, 1, 237, 126, 34, 7, 6, 1, 237, 17, 34, 7, 6, 1, 153, 34, 7, \r
+    6, 1, 189, 34, 7, 6, 1, 207, 34, 7, 6, 1, 74, 34, 7, 6, 1, 230, 59, 34, \r
+    7, 6, 1, 228, 163, 34, 7, 6, 1, 152, 34, 7, 6, 1, 198, 34, 7, 6, 1, 222, \r
+    201, 34, 7, 6, 1, 68, 34, 7, 6, 1, 216, 216, 34, 7, 6, 1, 219, 40, 34, 7, \r
+    6, 1, 218, 151, 34, 7, 6, 1, 218, 90, 34, 7, 6, 1, 217, 157, 34, 7, 3, 1, \r
+    60, 34, 7, 3, 1, 253, 204, 34, 7, 3, 1, 251, 202, 34, 7, 3, 1, 250, 46, \r
+    34, 7, 3, 1, 73, 34, 7, 3, 1, 246, 74, 34, 7, 3, 1, 245, 67, 34, 7, 3, 1, \r
+    243, 225, 34, 7, 3, 1, 72, 34, 7, 3, 1, 237, 126, 34, 7, 3, 1, 237, 17, \r
+    34, 7, 3, 1, 153, 34, 7, 3, 1, 189, 34, 7, 3, 1, 207, 34, 7, 3, 1, 74, \r
+    34, 7, 3, 1, 230, 59, 34, 7, 3, 1, 228, 163, 34, 7, 3, 1, 152, 34, 7, 3, \r
+    1, 198, 34, 7, 3, 1, 222, 201, 34, 7, 3, 1, 68, 34, 7, 3, 1, 216, 216, \r
+    34, 7, 3, 1, 219, 40, 34, 7, 3, 1, 218, 151, 34, 7, 3, 1, 218, 90, 34, 7, \r
+    3, 1, 217, 157, 34, 20, 217, 84, 232, 136, 34, 54, 246, 211, 232, 136, \r
+    34, 54, 220, 221, 232, 136, 34, 54, 221, 247, 232, 136, 34, 54, 245, 111, \r
+    232, 136, 34, 54, 245, 200, 232, 136, 34, 54, 224, 77, 232, 136, 34, 54, \r
+    225, 41, 232, 136, 34, 54, 246, 233, 232, 136, 34, 54, 232, 29, 232, 136, \r
+    34, 54, 220, 219, 51, 34, 20, 107, 51, 34, 20, 103, 51, 34, 20, 160, 51, \r
+    34, 20, 154, 51, 34, 20, 174, 51, 34, 20, 182, 51, 34, 20, 191, 51, 34, \r
+    20, 185, 51, 34, 20, 190, 51, 34, 54, 222, 65, 232, 136, 34, 20, 217, 84, \r
+    86, 89, 170, 242, 241, 86, 89, 106, 242, 241, 86, 89, 170, 219, 152, 86, \r
+    89, 106, 219, 152, 86, 89, 170, 221, 78, 249, 147, 242, 241, 86, 89, 106, \r
+    221, 78, 249, 147, 242, 241, 86, 89, 170, 221, 78, 249, 147, 219, 152, \r
+    86, 89, 106, 221, 78, 249, 147, 219, 152, 86, 89, 170, 228, 92, 249, 147, \r
+    242, 241, 86, 89, 106, 228, 92, 249, 147, 242, 241, 86, 89, 170, 228, 92, \r
+    249, 147, 219, 152, 86, 89, 106, 228, 92, 249, 147, 219, 152, 86, 89, \r
+    170, 113, 25, 227, 109, 86, 89, 113, 170, 25, 45, 243, 149, 86, 89, 113, \r
+    106, 25, 45, 235, 58, 86, 89, 106, 113, 25, 227, 109, 86, 89, 170, 113, \r
+    25, 235, 115, 86, 89, 113, 170, 25, 42, 243, 149, 86, 89, 113, 106, 25, \r
+    42, 235, 58, 86, 89, 106, 113, 25, 235, 115, 86, 89, 170, 108, 25, 227, \r
+    109, 86, 89, 108, 170, 25, 45, 243, 149, 86, 89, 108, 106, 25, 45, 235, \r
+    58, 86, 89, 106, 108, 25, 227, 109, 86, 89, 170, 108, 25, 235, 115, 86, \r
+    89, 108, 170, 25, 42, 243, 149, 86, 89, 108, 106, 25, 42, 235, 58, 86, \r
+    89, 106, 108, 25, 235, 115, 86, 89, 170, 69, 25, 227, 109, 86, 89, 69, \r
+    170, 25, 45, 243, 149, 86, 89, 108, 106, 25, 45, 113, 235, 58, 86, 89, \r
+    113, 106, 25, 45, 108, 235, 58, 86, 89, 69, 106, 25, 45, 235, 58, 86, 89, \r
+    113, 170, 25, 45, 108, 243, 149, 86, 89, 108, 170, 25, 45, 113, 243, 149, \r
+    86, 89, 106, 69, 25, 227, 109, 86, 89, 170, 69, 25, 235, 115, 86, 89, 69, \r
+    170, 25, 42, 243, 149, 86, 89, 108, 106, 25, 42, 113, 235, 58, 86, 89, \r
+    113, 106, 25, 42, 108, 235, 58, 86, 89, 69, 106, 25, 42, 235, 58, 86, 89, \r
+    113, 170, 25, 42, 108, 243, 149, 86, 89, 108, 170, 25, 42, 113, 243, 149, \r
+    86, 89, 106, 69, 25, 235, 115, 86, 89, 170, 113, 25, 242, 241, 86, 89, \r
+    42, 106, 25, 45, 113, 235, 58, 86, 89, 45, 106, 25, 42, 113, 235, 58, 86, \r
+    89, 113, 170, 25, 186, 243, 149, 86, 89, 113, 106, 25, 186, 235, 58, 86, \r
+    89, 45, 170, 25, 42, 113, 243, 149, 86, 89, 42, 170, 25, 45, 113, 243, \r
+    149, 86, 89, 106, 113, 25, 242, 241, 86, 89, 170, 108, 25, 242, 241, 86, \r
+    89, 42, 106, 25, 45, 108, 235, 58, 86, 89, 45, 106, 25, 42, 108, 235, 58, \r
+    86, 89, 108, 170, 25, 186, 243, 149, 86, 89, 108, 106, 25, 186, 235, 58, \r
+    86, 89, 45, 170, 25, 42, 108, 243, 149, 86, 89, 42, 170, 25, 45, 108, \r
+    243, 149, 86, 89, 106, 108, 25, 242, 241, 86, 89, 170, 69, 25, 242, 241, \r
+    86, 89, 42, 106, 25, 45, 69, 235, 58, 86, 89, 45, 106, 25, 42, 69, 235, \r
+    58, 86, 89, 69, 170, 25, 186, 243, 149, 86, 89, 108, 106, 25, 113, 186, \r
+    235, 58, 86, 89, 113, 106, 25, 108, 186, 235, 58, 86, 89, 69, 106, 25, \r
+    186, 235, 58, 86, 89, 42, 108, 106, 25, 45, 113, 235, 58, 86, 89, 45, \r
+    108, 106, 25, 42, 113, 235, 58, 86, 89, 42, 113, 106, 25, 45, 108, 235, \r
+    58, 86, 89, 45, 113, 106, 25, 42, 108, 235, 58, 86, 89, 113, 170, 25, \r
+    108, 186, 243, 149, 86, 89, 108, 170, 25, 113, 186, 243, 149, 86, 89, 45, \r
+    170, 25, 42, 69, 243, 149, 86, 89, 42, 170, 25, 45, 69, 243, 149, 86, 89, \r
+    106, 69, 25, 242, 241, 86, 89, 170, 51, 249, 147, 242, 241, 86, 89, 106, \r
+    51, 249, 147, 242, 241, 86, 89, 170, 51, 249, 147, 219, 152, 86, 89, 106, \r
+    51, 249, 147, 219, 152, 86, 89, 51, 242, 241, 86, 89, 51, 219, 152, 86, \r
+    89, 113, 224, 109, 25, 45, 247, 138, 86, 89, 113, 51, 25, 45, 224, 108, \r
+    86, 89, 51, 113, 25, 227, 109, 86, 89, 113, 224, 109, 25, 42, 247, 138, \r
+    86, 89, 113, 51, 25, 42, 224, 108, 86, 89, 51, 113, 25, 235, 115, 86, 89, \r
+    108, 224, 109, 25, 45, 247, 138, 86, 89, 108, 51, 25, 45, 224, 108, 86, \r
+    89, 51, 108, 25, 227, 109, 86, 89, 108, 224, 109, 25, 42, 247, 138, 86, \r
+    89, 108, 51, 25, 42, 224, 108, 86, 89, 51, 108, 25, 235, 115, 86, 89, 69, \r
+    224, 109, 25, 45, 247, 138, 86, 89, 69, 51, 25, 45, 224, 108, 86, 89, 51, \r
+    69, 25, 227, 109, 86, 89, 69, 224, 109, 25, 42, 247, 138, 86, 89, 69, 51, \r
+    25, 42, 224, 108, 86, 89, 51, 69, 25, 235, 115, 86, 89, 113, 224, 109, \r
+    25, 186, 247, 138, 86, 89, 113, 51, 25, 186, 224, 108, 86, 89, 51, 113, \r
+    25, 242, 241, 86, 89, 108, 224, 109, 25, 186, 247, 138, 86, 89, 108, 51, \r
+    25, 186, 224, 108, 86, 89, 51, 108, 25, 242, 241, 86, 89, 69, 224, 109, \r
+    25, 186, 247, 138, 86, 89, 69, 51, 25, 186, 224, 108, 86, 89, 51, 69, 25, \r
+    242, 241, 86, 89, 170, 254, 52, 113, 25, 227, 109, 86, 89, 170, 254, 52, \r
+    113, 25, 235, 115, 86, 89, 170, 254, 52, 108, 25, 235, 115, 86, 89, 170, \r
+    254, 52, 108, 25, 227, 109, 86, 89, 170, 249, 11, 220, 60, 45, 199, 234, \r
+    237, 235, 115, 86, 89, 170, 249, 11, 220, 60, 42, 199, 234, 237, 227, \r
+    109, 86, 89, 170, 249, 11, 250, 100, 86, 89, 170, 235, 115, 86, 89, 170, \r
+    220, 63, 86, 89, 170, 227, 109, 86, 89, 170, 247, 132, 86, 89, 106, 235, \r
+    115, 86, 89, 106, 220, 63, 86, 89, 106, 227, 109, 86, 89, 106, 247, 132, \r
+    86, 89, 170, 42, 25, 106, 227, 109, 86, 89, 170, 108, 25, 106, 247, 132, \r
+    86, 89, 106, 42, 25, 170, 227, 109, 86, 89, 106, 108, 25, 170, 247, 132, \r
+    220, 60, 144, 252, 45, 234, 237, 131, 246, 232, 252, 45, 234, 237, 131, \r
+    228, 90, 252, 45, 234, 237, 148, 246, 230, 252, 45, 234, 237, 144, 252, \r
+    45, 234, 237, 245, 170, 246, 230, 252, 45, 234, 237, 148, 228, 88, 252, \r
+    45, 234, 237, 225, 43, 246, 230, 252, 45, 245, 90, 252, 45, 42, 225, 43, \r
+    246, 230, 252, 45, 42, 148, 228, 88, 252, 45, 42, 245, 170, 246, 230, \r
+    252, 45, 42, 144, 252, 45, 42, 148, 246, 230, 252, 45, 42, 131, 228, 90, \r
+    252, 45, 42, 131, 246, 232, 252, 45, 45, 144, 252, 45, 170, 225, 15, 234, \r
+    18, 225, 15, 249, 152, 225, 15, 220, 60, 131, 246, 232, 252, 45, 45, 131, \r
+    246, 232, 252, 45, 228, 94, 234, 237, 235, 115, 228, 94, 234, 237, 227, \r
+    109, 228, 94, 220, 60, 235, 115, 228, 94, 220, 60, 42, 25, 234, 237, 42, \r
+    25, 234, 237, 227, 109, 228, 94, 220, 60, 42, 25, 234, 237, 227, 109, \r
+    228, 94, 220, 60, 42, 25, 220, 60, 45, 25, 234, 237, 235, 115, 228, 94, \r
+    220, 60, 42, 25, 220, 60, 45, 25, 234, 237, 227, 109, 228, 94, 220, 60, \r
+    227, 109, 228, 94, 220, 60, 45, 25, 234, 237, 235, 115, 228, 94, 220, 60, \r
+    45, 25, 234, 237, 42, 25, 234, 237, 227, 109, 84, 223, 227, 67, 223, 227, \r
+    67, 40, 2, 227, 55, 250, 122, 67, 40, 250, 141, 84, 3, 223, 227, 40, 2, \r
+    186, 245, 187, 40, 2, 69, 245, 187, 40, 2, 230, 95, 250, 96, 245, 187, \r
+    40, 2, 220, 60, 42, 199, 234, 237, 45, 245, 187, 40, 2, 220, 60, 45, 199, \r
+    234, 237, 42, 245, 187, 40, 2, 249, 11, 250, 96, 245, 187, 84, 3, 223, \r
+    227, 67, 3, 223, 227, 84, 227, 208, 67, 227, 208, 84, 69, 227, 208, 67, \r
+    69, 227, 208, 84, 229, 232, 67, 229, 232, 84, 220, 62, 221, 90, 67, 220, \r
+    62, 221, 90, 84, 220, 62, 3, 221, 90, 67, 220, 62, 3, 221, 90, 84, 227, \r
+    106, 221, 90, 67, 227, 106, 221, 90, 84, 227, 106, 3, 221, 90, 67, 227, \r
+    106, 3, 221, 90, 84, 227, 106, 229, 29, 67, 227, 106, 229, 29, 84, 247, \r
+    131, 221, 90, 67, 247, 131, 221, 90, 84, 247, 131, 3, 221, 90, 67, 247, \r
+    131, 3, 221, 90, 84, 235, 112, 221, 90, 67, 235, 112, 221, 90, 84, 235, \r
+    112, 3, 221, 90, 67, 235, 112, 3, 221, 90, 84, 235, 112, 229, 29, 67, \r
+    235, 112, 229, 29, 84, 249, 4, 67, 249, 4, 67, 249, 5, 250, 141, 84, 3, \r
+    249, 4, 245, 175, 234, 234, 67, 250, 221, 247, 143, 250, 221, 250, 222, \r
+    2, 69, 245, 187, 251, 239, 84, 250, 221, 250, 222, 2, 42, 144, 252, 53, \r
+    250, 222, 2, 45, 144, 252, 53, 250, 222, 2, 234, 237, 144, 252, 53, 250, \r
+    222, 2, 220, 60, 144, 252, 53, 250, 222, 2, 220, 60, 45, 228, 94, 252, \r
+    53, 250, 222, 2, 254, 158, 251, 222, 220, 60, 42, 228, 94, 252, 53, 42, \r
+    144, 84, 250, 221, 45, 144, 84, 250, 221, 237, 171, 251, 241, 237, 171, \r
+    67, 250, 221, 220, 60, 144, 237, 171, 67, 250, 221, 234, 237, 144, 237, \r
+    171, 67, 250, 221, 220, 60, 42, 228, 94, 250, 219, 254, 51, 220, 60, 45, \r
+    228, 94, 250, 219, 254, 51, 234, 237, 45, 228, 94, 250, 219, 254, 51, \r
+    234, 237, 42, 228, 94, 250, 219, 254, 51, 220, 60, 144, 250, 221, 234, \r
+    237, 144, 250, 221, 84, 234, 237, 45, 221, 90, 84, 234, 237, 42, 221, 90, \r
+    84, 220, 60, 42, 221, 90, 84, 220, 60, 45, 221, 90, 67, 251, 241, 40, 2, \r
+    42, 144, 252, 53, 40, 2, 45, 144, 252, 53, 40, 2, 220, 60, 42, 249, 11, \r
+    144, 252, 53, 40, 2, 234, 237, 45, 249, 11, 144, 252, 53, 67, 40, 2, 69, \r
+    252, 63, 235, 43, 67, 220, 62, 221, 91, 2, 248, 145, 220, 62, 221, 91, 2, \r
+    42, 144, 252, 53, 220, 62, 221, 91, 2, 45, 144, 252, 53, 235, 146, 250, \r
+    221, 67, 40, 2, 220, 60, 42, 228, 93, 67, 40, 2, 234, 237, 42, 228, 93, \r
+    67, 40, 2, 234, 237, 45, 228, 93, 67, 40, 2, 220, 60, 45, 228, 93, 67, \r
+    250, 222, 2, 220, 60, 42, 228, 93, 67, 250, 222, 2, 234, 237, 42, 228, \r
+    93, 67, 250, 222, 2, 234, 237, 45, 228, 93, 67, 250, 222, 2, 220, 60, 45, \r
+    228, 93, 220, 60, 42, 221, 90, 220, 60, 45, 221, 90, 234, 237, 42, 221, \r
+    90, 67, 234, 18, 223, 227, 84, 234, 18, 223, 227, 67, 234, 18, 3, 223, \r
+    227, 84, 234, 18, 3, 223, 227, 234, 237, 45, 221, 90, 84, 223, 69, 2, \r
+    227, 220, 250, 189, 220, 91, 224, 28, 250, 171, 84, 223, 156, 67, 223, \r
+    156, 235, 56, 221, 220, 223, 68, 254, 10, 231, 201, 249, 47, 231, 201, \r
+    250, 149, 230, 109, 84, 222, 71, 67, 222, 71, 252, 213, 252, 21, 252, \r
+    213, 86, 2, 251, 44, 252, 213, 86, 2, 218, 151, 226, 149, 220, 92, 2, \r
+    227, 243, 247, 117, 242, 187, 252, 98, 67, 224, 196, 229, 102, 84, 224, \r
+    196, 229, 102, 225, 11, 210, 227, 59, 245, 148, 243, 154, 251, 241, 84, \r
+    42, 229, 28, 237, 213, 84, 45, 229, 28, 237, 213, 67, 42, 229, 28, 237, \r
+    213, 67, 108, 229, 28, 237, 213, 67, 45, 229, 28, 237, 213, 67, 113, 229, \r
+    28, 237, 213, 224, 60, 25, 250, 99, 251, 120, 55, 227, 250, 55, 252, 69, \r
+    55, 251, 164, 254, 115, 230, 96, 250, 100, 251, 32, 227, 149, 250, 101, \r
+    117, 234, 243, 250, 101, 117, 237, 105, 223, 157, 25, 250, 104, 245, 241, \r
+    100, 254, 238, 225, 13, 243, 193, 25, 224, 138, 229, 197, 100, 217, 241, \r
+    218, 45, 221, 82, 35, 243, 151, 221, 82, 35, 235, 165, 221, 82, 35, 245, \r
+    179, 221, 82, 35, 221, 221, 221, 82, 35, 218, 194, 221, 82, 35, 218, 240, \r
+    221, 82, 35, 233, 107, 221, 82, 35, 247, 8, 218, 211, 117, 249, 30, 67, \r
+    245, 94, 246, 3, 67, 224, 38, 246, 3, 84, 224, 38, 246, 3, 67, 223, 69, \r
+    2, 227, 220, 245, 178, 228, 90, 233, 117, 235, 142, 228, 90, 233, 117, \r
+    233, 249, 245, 217, 55, 247, 8, 234, 90, 55, 237, 31, 226, 124, 220, 45, \r
+    232, 129, 229, 41, 254, 39, 222, 104, 244, 182, 251, 150, 235, 90, 219, \r
+    80, 235, 65, 226, 102, 226, 163, 251, 140, 254, 68, 229, 66, 67, 251, 37, \r
+    236, 102, 67, 251, 37, 228, 83, 67, 251, 37, 227, 65, 67, 251, 37, 252, \r
+    62, 67, 251, 37, 236, 59, 67, 251, 37, 229, 207, 84, 251, 37, 236, 102, \r
+    84, 251, 37, 228, 83, 84, 251, 37, 227, 65, 84, 251, 37, 252, 62, 84, \r
+    251, 37, 236, 59, 84, 251, 37, 229, 207, 84, 223, 252, 223, 80, 67, 243, \r
+    154, 223, 80, 67, 249, 5, 223, 80, 84, 250, 188, 223, 80, 67, 223, 252, \r
+    223, 80, 84, 243, 154, 223, 80, 84, 249, 5, 223, 80, 67, 250, 188, 223, \r
+    80, 242, 187, 223, 231, 228, 90, 231, 180, 246, 232, 231, 180, 252, 142, \r
+    246, 232, 231, 177, 252, 142, 224, 76, 231, 177, 233, 59, 245, 157, 55, \r
+    233, 59, 232, 205, 55, 233, 59, 225, 1, 55, 218, 217, 166, 250, 100, 247, \r
+    5, 166, 250, 100, 220, 70, 227, 204, 100, 227, 204, 16, 35, 220, 197, \r
+    229, 50, 227, 204, 16, 35, 220, 196, 229, 50, 227, 204, 16, 35, 220, 195, \r
+    229, 50, 227, 204, 16, 35, 220, 194, 229, 50, 227, 204, 16, 35, 220, 193, \r
+    229, 50, 227, 204, 16, 35, 220, 192, 229, 50, 227, 204, 16, 35, 220, 191, \r
+    229, 50, 227, 204, 16, 35, 244, 180, 234, 50, 84, 220, 70, 227, 204, 100, \r
+    227, 205, 229, 245, 100, 229, 222, 229, 245, 100, 229, 162, 229, 245, 55, \r
+    218, 209, 100, 248, 254, 246, 2, 248, 254, 246, 1, 248, 254, 246, 0, 248, \r
+    254, 245, 255, 248, 254, 245, 254, 248, 254, 245, 253, 67, 250, 222, 2, \r
+    61, 227, 109, 67, 250, 222, 2, 124, 248, 143, 84, 250, 222, 2, 67, 61, \r
+    227, 109, 84, 250, 222, 2, 124, 67, 248, 143, 233, 125, 35, 218, 45, 233, \r
+    125, 35, 217, 240, 248, 237, 35, 244, 31, 218, 45, 248, 237, 35, 235, 85, \r
+    217, 240, 248, 237, 35, 235, 85, 218, 45, 248, 237, 35, 244, 31, 217, \r
+    240, 67, 245, 163, 84, 245, 163, 243, 193, 25, 229, 104, 254, 128, 250, \r
+    98, 223, 24, 223, 164, 117, 254, 218, 226, 113, 254, 167, 245, 144, 244, \r
+    189, 223, 164, 117, 243, 133, 253, 238, 100, 245, 153, 230, 80, 67, 223, \r
+    156, 148, 235, 38, 250, 131, 227, 109, 148, 235, 38, 250, 131, 235, 115, \r
+    218, 250, 55, 116, 219, 66, 55, 247, 135, 245, 217, 55, 247, 135, 234, \r
+    90, 55, 237, 179, 245, 217, 25, 234, 90, 55, 234, 90, 25, 245, 217, 55, \r
+    234, 90, 2, 214, 55, 234, 90, 2, 214, 25, 234, 90, 25, 245, 217, 55, 69, \r
+    234, 90, 2, 214, 55, 186, 234, 90, 2, 214, 55, 234, 18, 67, 250, 221, \r
+    234, 18, 84, 250, 221, 234, 18, 3, 67, 250, 221, 234, 62, 100, 248, 186, \r
+    100, 220, 69, 229, 221, 100, 250, 178, 245, 86, 220, 42, 232, 124, 251, \r
+    72, 230, 25, 237, 37, 219, 98, 251, 18, 84, 233, 118, 235, 53, 225, 34, \r
+    225, 64, 228, 75, 225, 48, 224, 24, 252, 215, 252, 188, 204, 236, 154, \r
+    67, 247, 122, 234, 86, 67, 247, 122, 236, 102, 84, 247, 122, 234, 86, 84, \r
+    247, 122, 236, 102, 224, 29, 218, 189, 224, 31, 223, 69, 252, 125, 250, \r
+    189, 227, 242, 84, 224, 28, 221, 222, 250, 190, 25, 227, 242, 215, 67, \r
+    224, 196, 229, 102, 215, 84, 224, 196, 229, 102, 67, 249, 5, 237, 224, \r
+    223, 227, 250, 95, 235, 149, 248, 206, 251, 137, 229, 104, 251, 138, 224, \r
+    51, 243, 141, 2, 67, 250, 100, 34, 250, 95, 235, 149, 251, 65, 231, 205, \r
+    246, 174, 254, 144, 230, 135, 42, 218, 230, 221, 106, 84, 220, 204, 42, \r
+    218, 230, 221, 106, 67, 220, 204, 42, 218, 230, 221, 106, 84, 42, 235, \r
+    150, 233, 248, 67, 42, 235, 150, 233, 248, 247, 120, 224, 46, 55, 106, \r
+    67, 247, 131, 221, 90, 42, 250, 197, 246, 174, 204, 226, 149, 245, 247, \r
+    249, 11, 237, 224, 67, 250, 222, 237, 224, 84, 223, 227, 84, 221, 63, \r
+    227, 167, 42, 246, 173, 227, 167, 42, 246, 172, 106, 250, 222, 2, 214, \r
+    25, 124, 188, 50, 84, 250, 101, 230, 139, 224, 218, 224, 207, 224, 174, \r
+    250, 245, 251, 125, 243, 93, 224, 83, 244, 190, 218, 189, 242, 171, 244, \r
+    190, 2, 243, 188, 234, 79, 16, 35, 235, 57, 233, 107, 220, 92, 230, 139, \r
+    244, 24, 245, 117, 245, 164, 237, 224, 242, 252, 245, 209, 226, 160, 40, \r
+    245, 116, 250, 122, 224, 63, 242, 66, 224, 65, 229, 158, 2, 252, 215, \r
+    222, 62, 237, 118, 252, 204, 100, 243, 156, 244, 33, 100, 245, 91, 228, \r
+    198, 250, 83, 230, 139, 84, 223, 227, 67, 245, 164, 2, 186, 233, 193, 84, \r
+    223, 120, 220, 60, 252, 49, 226, 103, 84, 226, 103, 234, 237, 252, 49, \r
+    226, 103, 67, 226, 103, 222, 72, 235, 10, 55, 222, 114, 247, 119, 254, \r
+    187, 246, 170, 219, 93, 243, 189, 218, 167, 243, 189, 234, 237, 45, 229, \r
+    181, 229, 181, 220, 60, 45, 229, 181, 67, 232, 59, 84, 232, 59, 251, 45, \r
+    78, 106, 251, 45, 78, 233, 84, 218, 151, 106, 233, 84, 218, 151, 252, \r
+    213, 218, 151, 106, 252, 213, 218, 151, 230, 80, 23, 250, 100, 106, 23, \r
+    250, 100, 230, 119, 251, 85, 250, 100, 106, 230, 119, 251, 85, 250, 100, \r
+    7, 250, 100, 225, 14, 67, 7, 250, 100, 230, 80, 7, 250, 100, 234, 88, \r
+    250, 100, 223, 157, 117, 249, 140, 245, 116, 222, 83, 253, 251, 245, 116, \r
+    252, 214, 253, 251, 106, 245, 116, 252, 214, 253, 251, 245, 116, 250, \r
+    186, 253, 251, 84, 245, 116, 229, 30, 223, 156, 67, 245, 116, 229, 30, \r
+    223, 156, 223, 125, 230, 80, 67, 223, 156, 34, 67, 223, 156, 230, 119, \r
+    251, 85, 84, 223, 156, 84, 251, 85, 67, 223, 156, 230, 80, 84, 223, 156, \r
+    106, 230, 80, 84, 223, 156, 229, 71, 223, 156, 225, 14, 67, 223, 156, \r
+    106, 253, 251, 230, 119, 251, 85, 253, 251, 246, 235, 223, 236, 253, 251, \r
+    246, 235, 229, 30, 84, 223, 156, 246, 235, 229, 30, 229, 71, 223, 156, \r
+    224, 82, 229, 30, 84, 223, 156, 246, 235, 229, 30, 227, 206, 84, 223, \r
+    156, 106, 246, 235, 229, 30, 227, 206, 84, 223, 156, 220, 222, 229, 30, \r
+    84, 223, 156, 224, 78, 229, 30, 253, 251, 222, 83, 253, 251, 230, 119, \r
+    251, 85, 222, 83, 253, 251, 106, 222, 83, 253, 251, 224, 82, 229, 149, \r
+    84, 25, 67, 245, 147, 84, 245, 147, 67, 245, 147, 246, 235, 229, 149, \r
+    230, 80, 84, 245, 147, 34, 230, 119, 251, 85, 246, 235, 229, 30, 223, \r
+    156, 106, 222, 83, 229, 71, 253, 251, 224, 30, 221, 195, 221, 85, 224, \r
+    30, 106, 251, 35, 224, 30, 223, 251, 106, 223, 251, 252, 214, 253, 251, \r
+    246, 235, 222, 83, 228, 221, 253, 251, 106, 246, 235, 222, 83, 228, 221, \r
+    253, 251, 225, 14, 67, 250, 221, 234, 237, 45, 247, 118, 67, 223, 227, \r
+    220, 60, 45, 247, 118, 67, 223, 227, 234, 237, 45, 225, 14, 67, 223, 227, \r
+    220, 60, 45, 225, 14, 67, 223, 227, 84, 249, 5, 233, 155, 67, 218, 151, \r
+    106, 246, 95, 164, 100, 170, 69, 135, 234, 18, 69, 135, 106, 69, 135, \r
+    106, 224, 109, 215, 250, 169, 228, 69, 164, 230, 98, 106, 224, 109, 250, \r
+    169, 228, 69, 164, 230, 98, 106, 51, 215, 250, 169, 228, 69, 164, 230, \r
+    98, 106, 51, 250, 169, 228, 69, 164, 230, 98, 250, 73, 223, 147, 229, \r
+    241, 5, 230, 98, 106, 246, 95, 164, 230, 98, 106, 243, 154, 246, 95, 164, \r
+    230, 98, 106, 84, 243, 153, 227, 59, 106, 84, 243, 154, 251, 241, 245, \r
+    148, 243, 153, 227, 59, 245, 148, 243, 154, 251, 241, 234, 18, 42, 229, \r
+    230, 230, 98, 234, 18, 45, 229, 230, 230, 98, 234, 18, 245, 154, 42, 229, \r
+    230, 230, 98, 234, 18, 245, 154, 45, 229, 230, 230, 98, 234, 18, 235, \r
+    112, 254, 120, 252, 18, 230, 98, 234, 18, 227, 106, 254, 120, 252, 18, \r
+    230, 98, 106, 235, 112, 254, 120, 228, 69, 164, 230, 98, 106, 227, 106, \r
+    254, 120, 228, 69, 164, 230, 98, 106, 235, 112, 254, 120, 252, 18, 230, \r
+    98, 106, 227, 106, 254, 120, 252, 18, 230, 98, 170, 42, 221, 114, 224, \r
+    236, 252, 18, 230, 98, 170, 45, 221, 114, 224, 236, 252, 18, 230, 98, \r
+    234, 18, 42, 250, 79, 252, 18, 230, 98, 234, 18, 45, 250, 79, 252, 18, \r
+    230, 98, 248, 217, 232, 136, 34, 20, 107, 248, 217, 232, 136, 34, 20, \r
+    103, 248, 217, 232, 136, 34, 20, 160, 248, 217, 232, 136, 34, 20, 154, \r
+    248, 217, 232, 136, 34, 20, 174, 248, 217, 232, 136, 34, 20, 182, 248, \r
+    217, 232, 136, 34, 20, 191, 248, 217, 232, 136, 34, 20, 185, 248, 217, \r
+    232, 136, 34, 20, 190, 248, 217, 232, 136, 34, 54, 222, 65, 248, 217, 34, \r
+    33, 20, 107, 248, 217, 34, 33, 20, 103, 248, 217, 34, 33, 20, 160, 248, \r
+    217, 34, 33, 20, 154, 248, 217, 34, 33, 20, 174, 248, 217, 34, 33, 20, \r
+    182, 248, 217, 34, 33, 20, 191, 248, 217, 34, 33, 20, 185, 248, 217, 34, \r
+    33, 20, 190, 248, 217, 34, 33, 54, 222, 65, 248, 217, 232, 136, 34, 33, \r
+    20, 107, 248, 217, 232, 136, 34, 33, 20, 103, 248, 217, 232, 136, 34, 33, \r
+    20, 160, 248, 217, 232, 136, 34, 33, 20, 154, 248, 217, 232, 136, 34, 33, \r
+    20, 174, 248, 217, 232, 136, 34, 33, 20, 182, 248, 217, 232, 136, 34, 33, \r
+    20, 191, 248, 217, 232, 136, 34, 33, 20, 185, 248, 217, 232, 136, 34, 33, \r
+    20, 190, 248, 217, 232, 136, 34, 33, 54, 222, 65, 106, 218, 200, 90, 65, \r
+    106, 224, 6, 247, 5, 65, 106, 90, 65, 106, 231, 187, 247, 5, 65, 247, \r
+    124, 229, 32, 90, 65, 106, 227, 56, 90, 65, 221, 89, 90, 65, 106, 221, \r
+    89, 90, 65, 249, 145, 221, 89, 90, 65, 106, 249, 145, 221, 89, 90, 65, \r
+    84, 90, 65, 221, 228, 221, 118, 90, 254, 20, 221, 228, 252, 27, 90, 254, \r
+    20, 84, 90, 254, 20, 106, 84, 250, 73, 247, 130, 25, 90, 65, 106, 84, \r
+    250, 73, 220, 53, 25, 90, 65, 223, 224, 84, 90, 65, 106, 250, 157, 84, \r
+    90, 65, 227, 105, 67, 90, 65, 235, 111, 67, 90, 65, 252, 232, 225, 14, \r
+    67, 90, 65, 245, 96, 225, 14, 67, 90, 65, 106, 234, 237, 227, 104, 67, \r
+    90, 65, 106, 220, 60, 227, 104, 67, 90, 65, 231, 182, 234, 237, 227, 104, \r
+    67, 90, 65, 231, 182, 220, 60, 227, 104, 67, 90, 65, 34, 106, 67, 90, 65, \r
+    218, 206, 90, 65, 252, 52, 224, 6, 247, 5, 65, 252, 52, 90, 65, 252, 52, \r
+    231, 187, 247, 5, 65, 106, 252, 52, 224, 6, 247, 5, 65, 106, 252, 52, 90, \r
+    65, 106, 252, 52, 231, 187, 247, 5, 65, 222, 85, 90, 65, 106, 222, 84, \r
+    90, 65, 218, 225, 90, 65, 106, 218, 225, 90, 65, 230, 116, 90, 65, 148, \r
+    248, 227, 254, 119, 67, 221, 91, 250, 141, 3, 67, 221, 90, 229, 160, 230, \r
+    119, 223, 92, 230, 119, 223, 57, 42, 226, 234, 252, 226, 249, 67, 45, \r
+    226, 234, 252, 226, 249, 67, 156, 2, 61, 237, 190, 227, 160, 224, 18, \r
+    228, 243, 223, 92, 223, 58, 228, 243, 224, 17, 69, 252, 201, 2, 186, 92, \r
+    171, 248, 187, 67, 249, 5, 2, 251, 83, 248, 145, 25, 2, 248, 145, 246, \r
+    213, 117, 230, 114, 220, 52, 234, 237, 45, 250, 124, 2, 248, 145, 220, \r
+    60, 42, 250, 124, 2, 248, 145, 42, 230, 82, 237, 57, 45, 230, 82, 237, \r
+    57, 245, 90, 230, 82, 237, 57, 235, 146, 108, 222, 143, 235, 146, 113, \r
+    222, 143, 42, 25, 45, 51, 220, 236, 42, 25, 45, 222, 143, 42, 233, 87, \r
+    171, 45, 222, 143, 171, 42, 222, 143, 108, 222, 144, 2, 250, 222, 50, \r
+    234, 235, 248, 192, 251, 213, 186, 227, 16, 67, 250, 156, 249, 4, 67, \r
+    250, 156, 249, 5, 2, 127, 221, 202, 67, 250, 156, 249, 5, 2, 90, 221, \r
+    202, 67, 40, 2, 127, 221, 202, 67, 40, 2, 90, 221, 202, 14, 42, 67, 40, \r
+    115, 14, 45, 67, 40, 115, 14, 42, 254, 120, 115, 14, 45, 254, 120, 115, \r
+    14, 42, 51, 254, 120, 115, 14, 45, 51, 254, 120, 115, 14, 42, 67, 221, \r
+    114, 224, 236, 115, 14, 45, 67, 221, 114, 224, 236, 115, 14, 42, 245, \r
+    154, 229, 229, 14, 45, 245, 154, 229, 229, 220, 53, 228, 92, 65, 247, \r
+    130, 228, 92, 65, 254, 104, 244, 222, 250, 222, 65, 250, 199, 244, 222, \r
+    250, 222, 65, 45, 76, 2, 34, 229, 43, 171, 127, 65, 171, 90, 65, 171, 42, \r
+    45, 65, 171, 127, 51, 65, 171, 90, 51, 65, 171, 42, 45, 51, 65, 171, 127, \r
+    76, 245, 97, 135, 171, 90, 76, 245, 97, 135, 171, 127, 51, 76, 245, 97, \r
+    135, 171, 90, 51, 76, 245, 97, 135, 171, 90, 223, 223, 65, 43, 44, 252, \r
+    47, 43, 44, 248, 142, 43, 44, 248, 14, 43, 44, 248, 141, 43, 44, 247, \r
+    206, 43, 44, 248, 77, 43, 44, 248, 13, 43, 44, 248, 140, 43, 44, 247, \r
+    174, 43, 44, 248, 45, 43, 44, 247, 237, 43, 44, 248, 108, 43, 44, 247, \r
+    205, 43, 44, 248, 76, 43, 44, 248, 12, 43, 44, 248, 139, 43, 44, 247, \r
+    158, 43, 44, 248, 29, 43, 44, 247, 221, 43, 44, 248, 92, 43, 44, 247, \r
+    189, 43, 44, 248, 60, 43, 44, 247, 252, 43, 44, 248, 123, 43, 44, 247, \r
+    173, 43, 44, 248, 44, 43, 44, 247, 236, 43, 44, 248, 107, 43, 44, 247, \r
+    204, 43, 44, 248, 75, 43, 44, 248, 11, 43, 44, 248, 138, 43, 44, 247, \r
+    150, 43, 44, 248, 21, 43, 44, 247, 213, 43, 44, 248, 84, 43, 44, 247, \r
+    181, 43, 44, 248, 52, 43, 44, 247, 244, 43, 44, 248, 115, 43, 44, 247, \r
+    165, 43, 44, 248, 36, 43, 44, 247, 228, 43, 44, 248, 99, 43, 44, 247, \r
+    196, 43, 44, 248, 67, 43, 44, 248, 3, 43, 44, 248, 130, 43, 44, 247, 157, \r
+    43, 44, 248, 28, 43, 44, 247, 220, 43, 44, 248, 91, 43, 44, 247, 188, 43, \r
+    44, 248, 59, 43, 44, 247, 251, 43, 44, 248, 122, 43, 44, 247, 172, 43, \r
+    44, 248, 43, 43, 44, 247, 235, 43, 44, 248, 106, 43, 44, 247, 203, 43, \r
+    44, 248, 74, 43, 44, 248, 10, 43, 44, 248, 137, 43, 44, 247, 146, 43, 44, \r
+    248, 17, 43, 44, 247, 209, 43, 44, 248, 80, 43, 44, 247, 177, 43, 44, \r
+    248, 48, 43, 44, 247, 240, 43, 44, 248, 111, 43, 44, 247, 161, 43, 44, \r
+    248, 32, 43, 44, 247, 224, 43, 44, 248, 95, 43, 44, 247, 192, 43, 44, \r
+    248, 63, 43, 44, 247, 255, 43, 44, 248, 126, 43, 44, 247, 153, 43, 44, \r
+    248, 24, 43, 44, 247, 216, 43, 44, 248, 87, 43, 44, 247, 184, 43, 44, \r
+    248, 55, 43, 44, 247, 247, 43, 44, 248, 118, 43, 44, 247, 168, 43, 44, \r
+    248, 39, 43, 44, 247, 231, 43, 44, 248, 102, 43, 44, 247, 199, 43, 44, \r
+    248, 70, 43, 44, 248, 6, 43, 44, 248, 133, 43, 44, 247, 149, 43, 44, 248, \r
+    20, 43, 44, 247, 212, 43, 44, 248, 83, 43, 44, 247, 180, 43, 44, 248, 51, \r
+    43, 44, 247, 243, 43, 44, 248, 114, 43, 44, 247, 164, 43, 44, 248, 35, \r
+    43, 44, 247, 227, 43, 44, 248, 98, 43, 44, 247, 195, 43, 44, 248, 66, 43, \r
+    44, 248, 2, 43, 44, 248, 129, 43, 44, 247, 156, 43, 44, 248, 27, 43, 44, \r
+    247, 219, 43, 44, 248, 90, 43, 44, 247, 187, 43, 44, 248, 58, 43, 44, \r
+    247, 250, 43, 44, 248, 121, 43, 44, 247, 171, 43, 44, 248, 42, 43, 44, \r
+    247, 234, 43, 44, 248, 105, 43, 44, 247, 202, 43, 44, 248, 73, 43, 44, \r
+    248, 9, 43, 44, 248, 136, 43, 44, 247, 144, 43, 44, 248, 15, 43, 44, 247, \r
+    207, 43, 44, 248, 78, 43, 44, 247, 175, 43, 44, 248, 46, 43, 44, 247, \r
+    238, 43, 44, 248, 109, 43, 44, 247, 159, 43, 44, 248, 30, 43, 44, 247, \r
+    222, 43, 44, 248, 93, 43, 44, 247, 190, 43, 44, 248, 61, 43, 44, 247, \r
+    253, 43, 44, 248, 124, 43, 44, 247, 151, 43, 44, 248, 22, 43, 44, 247, \r
+    214, 43, 44, 248, 85, 43, 44, 247, 182, 43, 44, 248, 53, 43, 44, 247, \r
+    245, 43, 44, 248, 116, 43, 44, 247, 166, 43, 44, 248, 37, 43, 44, 247, \r
+    229, 43, 44, 248, 100, 43, 44, 247, 197, 43, 44, 248, 68, 43, 44, 248, 4, \r
+    43, 44, 248, 131, 43, 44, 247, 147, 43, 44, 248, 18, 43, 44, 247, 210, \r
+    43, 44, 248, 81, 43, 44, 247, 178, 43, 44, 248, 49, 43, 44, 247, 241, 43, \r
+    44, 248, 112, 43, 44, 247, 162, 43, 44, 248, 33, 43, 44, 247, 225, 43, \r
+    44, 248, 96, 43, 44, 247, 193, 43, 44, 248, 64, 43, 44, 248, 0, 43, 44, \r
+    248, 127, 43, 44, 247, 154, 43, 44, 248, 25, 43, 44, 247, 217, 43, 44, \r
+    248, 88, 43, 44, 247, 185, 43, 44, 248, 56, 43, 44, 247, 248, 43, 44, \r
+    248, 119, 43, 44, 247, 169, 43, 44, 248, 40, 43, 44, 247, 232, 43, 44, \r
+    248, 103, 43, 44, 247, 200, 43, 44, 248, 71, 43, 44, 248, 7, 43, 44, 248, \r
+    134, 43, 44, 247, 145, 43, 44, 248, 16, 43, 44, 247, 208, 43, 44, 248, \r
+    79, 43, 44, 247, 176, 43, 44, 248, 47, 43, 44, 247, 239, 43, 44, 248, \r
+    110, 43, 44, 247, 160, 43, 44, 248, 31, 43, 44, 247, 223, 43, 44, 248, \r
+    94, 43, 44, 247, 191, 43, 44, 248, 62, 43, 44, 247, 254, 43, 44, 248, \r
+    125, 43, 44, 247, 152, 43, 44, 248, 23, 43, 44, 247, 215, 43, 44, 248, \r
+    86, 43, 44, 247, 183, 43, 44, 248, 54, 43, 44, 247, 246, 43, 44, 248, \r
+    117, 43, 44, 247, 167, 43, 44, 248, 38, 43, 44, 247, 230, 43, 44, 248, \r
+    101, 43, 44, 247, 198, 43, 44, 248, 69, 43, 44, 248, 5, 43, 44, 248, 132, \r
+    43, 44, 247, 148, 43, 44, 248, 19, 43, 44, 247, 211, 43, 44, 248, 82, 43, \r
+    44, 247, 179, 43, 44, 248, 50, 43, 44, 247, 242, 43, 44, 248, 113, 43, \r
+    44, 247, 163, 43, 44, 248, 34, 43, 44, 247, 226, 43, 44, 248, 97, 43, 44, \r
+    247, 194, 43, 44, 248, 65, 43, 44, 248, 1, 43, 44, 248, 128, 43, 44, 247, \r
+    155, 43, 44, 248, 26, 43, 44, 247, 218, 43, 44, 248, 89, 43, 44, 247, \r
+    186, 43, 44, 248, 57, 43, 44, 247, 249, 43, 44, 248, 120, 43, 44, 247, \r
+    170, 43, 44, 248, 41, 43, 44, 247, 233, 43, 44, 248, 104, 43, 44, 247, \r
+    201, 43, 44, 248, 72, 43, 44, 248, 8, 43, 44, 248, 135, 90, 220, 206, 76, \r
+    2, 69, 92, 90, 220, 206, 76, 2, 51, 69, 92, 127, 51, 76, 2, 69, 92, 90, \r
+    51, 76, 2, 69, 92, 42, 45, 51, 76, 2, 69, 92, 90, 220, 206, 76, 245, 97, \r
+    135, 127, 51, 76, 245, 97, 135, 90, 51, 76, 245, 97, 135, 247, 130, 76, \r
+    2, 186, 92, 220, 53, 76, 2, 186, 92, 220, 53, 221, 78, 65, 247, 130, 221, \r
+    78, 65, 127, 51, 249, 147, 65, 90, 51, 249, 147, 65, 127, 221, 78, 249, \r
+    147, 65, 90, 221, 78, 249, 147, 65, 90, 220, 206, 221, 78, 249, 147, 65, \r
+    90, 76, 2, 247, 143, 223, 146, 220, 53, 76, 199, 135, 247, 130, 76, 199, \r
+    135, 90, 76, 2, 222, 136, 2, 69, 92, 90, 76, 2, 222, 136, 2, 51, 69, 92, \r
+    90, 220, 206, 76, 2, 222, 135, 90, 220, 206, 76, 2, 222, 136, 2, 69, 92, \r
+    90, 220, 206, 76, 2, 222, 136, 2, 51, 69, 92, 127, 254, 22, 90, 254, 22, \r
+    127, 51, 254, 22, 90, 51, 254, 22, 127, 76, 199, 84, 249, 4, 90, 76, 199, \r
+    84, 249, 4, 127, 76, 245, 97, 252, 201, 199, 84, 249, 4, 90, 76, 245, 97, \r
+    252, 201, 199, 84, 249, 4, 231, 187, 218, 217, 25, 224, 6, 247, 5, 65, \r
+    231, 187, 247, 5, 25, 224, 6, 218, 217, 65, 231, 187, 218, 217, 76, 2, \r
+    96, 231, 187, 247, 5, 76, 2, 96, 224, 6, 247, 5, 76, 2, 96, 224, 6, 218, \r
+    217, 76, 2, 96, 231, 187, 218, 217, 76, 25, 231, 187, 247, 5, 65, 231, \r
+    187, 247, 5, 76, 25, 224, 6, 247, 5, 65, 224, 6, 247, 5, 76, 25, 224, 6, \r
+    218, 217, 65, 224, 6, 218, 217, 76, 25, 231, 187, 218, 217, 65, 227, 88, \r
+    249, 11, 250, 95, 245, 247, 249, 10, 245, 247, 249, 11, 250, 95, 227, 88, \r
+    249, 10, 224, 6, 247, 5, 76, 250, 95, 231, 187, 247, 5, 65, 231, 187, \r
+    247, 5, 76, 250, 95, 224, 6, 247, 5, 65, 245, 247, 249, 11, 250, 95, 231, \r
+    187, 247, 5, 65, 227, 88, 249, 11, 250, 95, 224, 6, 247, 5, 65, 231, 187, \r
+    247, 5, 76, 250, 95, 231, 187, 218, 217, 65, 231, 187, 218, 217, 76, 250, \r
+    95, 231, 187, 247, 5, 65, 218, 237, 76, 229, 28, 248, 208, 227, 109, 76, \r
+    229, 28, 90, 222, 15, 250, 72, 220, 52, 76, 229, 28, 90, 222, 15, 250, \r
+    72, 247, 129, 76, 229, 28, 247, 130, 222, 15, 250, 72, 235, 107, 76, 229, \r
+    28, 247, 130, 222, 15, 250, 72, 227, 100, 227, 103, 254, 52, 250, 199, \r
+    65, 235, 110, 254, 52, 254, 104, 65, 221, 120, 254, 52, 254, 104, 65, \r
+    252, 29, 254, 52, 254, 104, 65, 221, 120, 254, 52, 250, 199, 76, 2, 233, \r
+    154, 221, 120, 254, 52, 254, 104, 76, 2, 229, 43, 234, 237, 45, 225, 69, \r
+    250, 199, 65, 234, 237, 42, 225, 69, 254, 104, 65, 254, 104, 250, 197, \r
+    250, 222, 65, 250, 199, 250, 197, 250, 222, 65, 90, 76, 71, 224, 192, \r
+    127, 65, 127, 76, 71, 224, 192, 90, 65, 224, 192, 90, 76, 71, 127, 65, \r
+    90, 76, 2, 88, 56, 127, 76, 2, 88, 56, 90, 76, 221, 225, 218, 151, 42, \r
+    45, 76, 221, 225, 3, 250, 221, 220, 53, 220, 206, 76, 245, 97, 3, 250, \r
+    221, 42, 192, 108, 45, 192, 113, 243, 176, 42, 192, 113, 45, 192, 108, \r
+    243, 176, 108, 192, 45, 113, 192, 42, 243, 176, 108, 192, 42, 113, 192, \r
+    45, 243, 176, 42, 192, 108, 45, 192, 108, 243, 176, 108, 192, 45, 113, \r
+    192, 45, 243, 176, 42, 192, 113, 45, 192, 113, 243, 176, 108, 192, 42, \r
+    113, 192, 42, 243, 176, 127, 243, 177, 2, 192, 108, 199, 135, 90, 243, \r
+    177, 2, 192, 108, 199, 135, 220, 53, 243, 177, 2, 192, 45, 199, 135, 247, \r
+    130, 243, 177, 2, 192, 45, 199, 135, 127, 243, 177, 2, 192, 113, 199, \r
+    135, 90, 243, 177, 2, 192, 113, 199, 135, 220, 53, 243, 177, 2, 192, 42, \r
+    199, 135, 247, 130, 243, 177, 2, 192, 42, 199, 135, 127, 243, 177, 2, \r
+    192, 108, 245, 97, 135, 90, 243, 177, 2, 192, 108, 245, 97, 135, 220, 53, \r
+    243, 177, 2, 192, 45, 245, 97, 135, 247, 130, 243, 177, 2, 192, 45, 245, \r
+    97, 135, 127, 243, 177, 2, 192, 113, 245, 97, 135, 90, 243, 177, 2, 192, \r
+    113, 245, 97, 135, 220, 53, 243, 177, 2, 192, 42, 245, 97, 135, 247, 130, \r
+    243, 177, 2, 192, 42, 245, 97, 135, 127, 243, 177, 2, 192, 108, 71, 127, \r
+    243, 177, 2, 192, 247, 132, 220, 53, 243, 177, 2, 192, 42, 252, 106, 220, \r
+    53, 243, 177, 2, 192, 227, 109, 90, 243, 177, 2, 192, 108, 71, 90, 243, \r
+    177, 2, 192, 247, 132, 247, 130, 243, 177, 2, 192, 42, 252, 106, 247, \r
+    130, 243, 177, 2, 192, 227, 109, 127, 243, 177, 2, 192, 108, 71, 90, 243, \r
+    177, 2, 192, 220, 63, 127, 243, 177, 2, 192, 113, 71, 90, 243, 177, 2, \r
+    192, 247, 132, 90, 243, 177, 2, 192, 108, 71, 127, 243, 177, 2, 192, 220, \r
+    63, 90, 243, 177, 2, 192, 113, 71, 127, 243, 177, 2, 192, 247, 132, 127, \r
+    243, 177, 2, 192, 108, 71, 171, 249, 146, 127, 243, 177, 2, 192, 113, \r
+    252, 118, 171, 249, 146, 90, 243, 177, 2, 192, 108, 71, 171, 249, 146, \r
+    90, 243, 177, 2, 192, 113, 252, 118, 171, 249, 146, 220, 53, 243, 177, 2, \r
+    192, 42, 252, 106, 247, 130, 243, 177, 2, 192, 227, 109, 247, 130, 243, \r
+    177, 2, 192, 42, 252, 106, 220, 53, 243, 177, 2, 192, 227, 109, 45, 51, \r
+    76, 2, 227, 55, 243, 159, 246, 154, 5, 71, 90, 65, 221, 180, 230, 113, \r
+    71, 90, 65, 127, 76, 71, 221, 180, 230, 112, 90, 76, 71, 221, 180, 230, \r
+    112, 90, 76, 71, 254, 151, 114, 101, 235, 87, 71, 127, 65, 127, 76, 221, \r
+    225, 235, 86, 244, 30, 71, 90, 65, 223, 93, 71, 90, 65, 127, 76, 221, \r
+    225, 223, 92, 223, 58, 71, 127, 65, 42, 245, 177, 222, 135, 45, 245, 177, \r
+    222, 135, 108, 245, 177, 222, 135, 113, 245, 177, 222, 135, 221, 78, 69, \r
+    252, 201, 249, 67, 217, 158, 165, 223, 234, 217, 158, 165, 220, 198, 250, \r
+    175, 42, 67, 250, 79, 115, 45, 67, 250, 79, 115, 42, 67, 229, 229, 45, \r
+    67, 229, 229, 217, 158, 165, 42, 237, 237, 115, 217, 158, 165, 45, 237, \r
+    237, 115, 217, 158, 165, 42, 252, 71, 115, 217, 158, 165, 45, 252, 71, \r
+    115, 42, 40, 252, 18, 2, 220, 81, 45, 40, 252, 18, 2, 220, 81, 42, 40, \r
+    252, 18, 2, 221, 203, 237, 224, 221, 120, 250, 123, 45, 40, 252, 18, 2, \r
+    221, 203, 237, 224, 252, 29, 250, 123, 42, 40, 252, 18, 2, 221, 203, 237, \r
+    224, 252, 29, 250, 123, 45, 40, 252, 18, 2, 221, 203, 237, 224, 221, 120, \r
+    250, 123, 42, 254, 120, 252, 18, 2, 248, 145, 45, 254, 120, 252, 18, 2, \r
+    248, 145, 42, 254, 52, 235, 87, 115, 45, 254, 52, 244, 30, 115, 51, 42, \r
+    254, 52, 244, 30, 115, 51, 45, 254, 52, 235, 87, 115, 42, 84, 221, 114, \r
+    224, 236, 115, 45, 84, 221, 114, 224, 236, 115, 247, 143, 245, 214, 69, \r
+    217, 33, 235, 43, 234, 22, 254, 120, 230, 114, 235, 115, 45, 254, 120, \r
+    219, 177, 2, 223, 227, 234, 22, 45, 254, 120, 2, 248, 145, 254, 120, 2, \r
+    226, 235, 237, 190, 254, 248, 254, 119, 223, 245, 254, 120, 230, 114, \r
+    235, 115, 223, 245, 254, 120, 230, 114, 220, 63, 215, 254, 119, 210, 254, \r
+    119, 254, 120, 2, 220, 81, 210, 254, 120, 2, 220, 81, 230, 177, 254, 120, \r
+    230, 114, 220, 63, 230, 177, 254, 120, 230, 114, 247, 132, 234, 22, 254, \r
+    120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 108, 25, 227, \r
+    109, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, \r
+    229, 28, 108, 25, 235, 115, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, \r
+    187, 237, 224, 76, 229, 28, 113, 25, 227, 109, 234, 22, 254, 120, 2, 230, \r
+    119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 113, 25, 235, 115, 234, \r
+    22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 45, \r
+    25, 220, 63, 234, 22, 254, 120, 2, 230, 119, 254, 32, 246, 187, 237, 224, \r
+    76, 229, 28, 42, 25, 220, 63, 234, 22, 254, 120, 2, 230, 119, 254, 32, \r
+    246, 187, 237, 224, 76, 229, 28, 45, 25, 247, 132, 234, 22, 254, 120, 2, \r
+    230, 119, 254, 32, 246, 187, 237, 224, 76, 229, 28, 42, 25, 247, 132, \r
+    210, 246, 199, 225, 45, 246, 199, 225, 46, 2, 230, 77, 246, 199, 225, 46, \r
+    2, 3, 250, 222, 50, 246, 199, 225, 46, 2, 45, 76, 50, 246, 199, 225, 46, \r
+    2, 42, 76, 50, 250, 222, 2, 186, 135, 34, 69, 135, 34, 229, 233, 34, 227, \r
+    160, 224, 17, 34, 229, 160, 250, 222, 248, 192, 251, 213, 186, 252, 201, \r
+    25, 221, 120, 144, 248, 192, 251, 213, 69, 135, 250, 222, 2, 223, 60, \r
+    218, 151, 34, 254, 103, 248, 188, 55, 108, 76, 221, 225, 250, 221, 34, \r
+    67, 251, 241, 34, 251, 241, 34, 235, 86, 34, 244, 29, 250, 222, 2, 3, \r
+    250, 222, 199, 222, 23, 227, 109, 250, 222, 2, 124, 186, 223, 108, 199, \r
+    222, 23, 227, 109, 204, 227, 88, 249, 11, 224, 55, 204, 245, 247, 249, \r
+    11, 224, 55, 204, 253, 251, 204, 3, 250, 221, 204, 223, 227, 124, 237, \r
+    56, 223, 225, 221, 91, 2, 61, 50, 221, 91, 2, 220, 81, 226, 235, 237, \r
+    224, 221, 90, 221, 91, 2, 225, 52, 253, 245, 252, 28, 45, 221, 91, 71, \r
+    42, 221, 90, 42, 221, 91, 252, 106, 69, 135, 69, 252, 201, 252, 106, 45, \r
+    221, 90, 252, 23, 2, 42, 144, 252, 53, 252, 23, 2, 45, 144, 252, 53, 84, \r
+    252, 22, 27, 2, 42, 144, 252, 53, 27, 2, 45, 144, 252, 53, 67, 242, 183, \r
+    84, 242, 183, 42, 218, 198, 245, 214, 45, 218, 198, 245, 214, 42, 51, \r
+    218, 198, 245, 214, 45, 51, 218, 198, 245, 214, 237, 218, 237, 207, 221, \r
+    201, 104, 237, 207, 237, 208, 232, 138, 2, 69, 135, 247, 137, 233, 87, \r
+    40, 2, 250, 135, 230, 81, 237, 216, 254, 13, 224, 166, 228, 229, 246, \r
+    154, 5, 25, 224, 57, 229, 233, 246, 154, 5, 25, 224, 57, 229, 234, 2, \r
+    221, 180, 50, 242, 59, 199, 25, 224, 57, 229, 233, 244, 75, 223, 155, \r
+    222, 12, 247, 131, 221, 91, 2, 42, 144, 252, 53, 247, 131, 221, 91, 2, \r
+    45, 144, 252, 53, 84, 249, 5, 2, 113, 65, 84, 234, 234, 67, 250, 222, 2, \r
+    113, 65, 84, 250, 222, 2, 113, 65, 246, 141, 67, 223, 227, 246, 141, 84, \r
+    223, 227, 246, 141, 67, 249, 4, 246, 141, 84, 249, 4, 246, 141, 67, 250, \r
+    221, 246, 141, 84, 250, 221, 227, 15, 227, 160, 224, 18, 230, 112, 224, \r
+    18, 2, 230, 77, 227, 160, 224, 18, 2, 186, 92, 252, 76, 224, 17, 252, 76, \r
+    227, 160, 224, 17, 51, 229, 43, 221, 78, 229, 43, 235, 112, 250, 73, 254, \r
+    120, 115, 227, 106, 250, 73, 254, 120, 115, 221, 171, 233, 152, 233, 33, \r
+    34, 61, 230, 112, 233, 33, 34, 88, 230, 112, 233, 33, 34, 27, 230, 112, \r
+    233, 33, 220, 75, 230, 113, 2, 248, 145, 233, 33, 220, 75, 230, 113, 2, \r
+    229, 43, 233, 33, 40, 237, 175, 230, 112, 233, 33, 40, 220, 75, 230, 112, \r
+    124, 235, 7, 25, 230, 112, 124, 235, 7, 156, 230, 112, 233, 33, 27, 230, \r
+    112, 233, 131, 124, 223, 74, 223, 72, 2, 237, 186, 228, 92, 237, 187, \r
+    230, 112, 245, 181, 229, 225, 237, 186, 237, 187, 2, 51, 92, 237, 187, \r
+    253, 217, 2, 224, 55, 250, 218, 245, 87, 254, 104, 237, 184, 235, 44, \r
+    237, 185, 2, 227, 207, 229, 212, 254, 29, 229, 24, 235, 44, 237, 185, 2, \r
+    225, 69, 229, 212, 254, 29, 229, 24, 235, 44, 237, 185, 212, 237, 219, \r
+    222, 23, 229, 24, 237, 187, 254, 29, 112, 229, 32, 230, 112, 228, 86, \r
+    237, 187, 230, 112, 237, 187, 2, 127, 76, 2, 96, 237, 187, 2, 27, 55, \r
+    237, 187, 2, 237, 174, 237, 187, 2, 220, 74, 237, 187, 2, 230, 77, 237, \r
+    187, 2, 220, 81, 237, 57, 235, 146, 42, 221, 91, 230, 112, 217, 158, 165, \r
+    226, 109, 250, 159, 217, 158, 165, 226, 109, 229, 69, 217, 158, 165, 226, \r
+    109, 228, 226, 88, 5, 2, 3, 250, 222, 50, 88, 5, 2, 250, 217, 255, 1, 50, \r
+    88, 5, 2, 221, 180, 50, 88, 5, 2, 61, 56, 88, 5, 2, 221, 180, 56, 88, 5, \r
+    2, 223, 94, 103, 88, 5, 2, 84, 221, 90, 233, 155, 5, 2, 250, 169, 50, \r
+    233, 155, 5, 2, 61, 56, 233, 155, 5, 2, 245, 247, 248, 143, 233, 155, 5, \r
+    2, 227, 88, 248, 143, 88, 5, 237, 224, 42, 144, 250, 221, 88, 5, 237, \r
+    224, 45, 144, 250, 221, 219, 164, 156, 250, 101, 228, 229, 233, 84, 5, 2, \r
+    61, 50, 233, 84, 5, 2, 220, 81, 225, 66, 228, 230, 2, 252, 29, 250, 196, \r
+    224, 41, 228, 229, 233, 84, 5, 237, 224, 42, 144, 250, 221, 233, 84, 5, \r
+    237, 224, 45, 144, 250, 221, 34, 233, 84, 5, 2, 250, 217, 255, 0, 233, \r
+    84, 5, 237, 224, 51, 250, 221, 34, 248, 188, 55, 88, 5, 237, 224, 221, \r
+    90, 233, 155, 5, 237, 224, 221, 90, 233, 84, 5, 237, 224, 221, 90, 237, \r
+    181, 228, 229, 227, 101, 237, 181, 228, 229, 217, 158, 165, 227, 191, \r
+    250, 159, 254, 139, 156, 250, 128, 237, 175, 2, 248, 145, 220, 75, 2, \r
+    233, 155, 55, 220, 75, 2, 230, 77, 237, 175, 2, 230, 77, 237, 175, 2, \r
+    235, 7, 254, 126, 220, 75, 2, 235, 7, 230, 105, 220, 75, 71, 237, 174, \r
+    237, 175, 71, 220, 74, 220, 75, 71, 252, 201, 71, 237, 174, 237, 175, 71, \r
+    252, 201, 71, 220, 74, 220, 75, 252, 106, 25, 237, 56, 2, 220, 74, 237, \r
+    175, 252, 106, 25, 237, 56, 2, 237, 174, 250, 197, 220, 75, 2, 225, 51, \r
+    250, 197, 237, 175, 2, 225, 51, 51, 40, 237, 174, 51, 40, 220, 74, 250, \r
+    197, 220, 75, 2, 225, 52, 25, 224, 41, 228, 229, 235, 7, 25, 2, 61, 50, \r
+    235, 7, 156, 2, 61, 50, 51, 235, 7, 254, 126, 51, 235, 7, 230, 105, 124, \r
+    237, 176, 235, 7, 254, 126, 124, 237, 176, 235, 7, 230, 105, 224, 48, \r
+    235, 146, 230, 105, 224, 48, 235, 146, 254, 126, 235, 7, 156, 230, 75, \r
+    235, 7, 254, 126, 235, 7, 25, 2, 233, 193, 223, 146, 235, 7, 156, 2, 233, \r
+    193, 223, 146, 235, 7, 25, 2, 186, 249, 146, 235, 7, 156, 2, 186, 249, \r
+    146, 235, 7, 25, 2, 51, 230, 77, 235, 7, 25, 2, 220, 81, 235, 7, 25, 2, \r
+    51, 220, 81, 3, 219, 161, 2, 220, 81, 235, 7, 156, 2, 51, 230, 77, 235, \r
+    7, 156, 2, 51, 220, 81, 217, 158, 165, 248, 154, 254, 99, 217, 158, 165, \r
+    227, 234, 254, 99, 246, 154, 5, 2, 61, 56, 242, 59, 2, 61, 50, 221, 78, \r
+    186, 252, 201, 2, 51, 69, 92, 221, 78, 186, 252, 201, 2, 221, 78, 69, 92, \r
+    221, 180, 230, 113, 2, 61, 50, 221, 180, 230, 113, 2, 227, 88, 248, 143, \r
+    224, 116, 233, 155, 224, 115, 250, 153, 2, 61, 50, 246, 154, 2, 253, 251, \r
+    254, 151, 114, 199, 2, 250, 217, 255, 0, 254, 72, 114, 156, 114, 101, \r
+    246, 154, 5, 71, 88, 55, 88, 5, 71, 246, 154, 55, 246, 154, 5, 71, 221, \r
+    180, 230, 112, 51, 250, 176, 246, 155, 124, 250, 148, 246, 154, 224, 126, \r
+    148, 250, 148, 246, 154, 224, 126, 246, 154, 5, 2, 124, 188, 71, 25, 124, \r
+    188, 56, 246, 150, 2, 245, 116, 188, 50, 235, 87, 2, 250, 222, 237, 190, \r
+    244, 30, 2, 250, 222, 237, 190, 235, 87, 2, 228, 82, 164, 50, 244, 30, 2, \r
+    228, 82, 164, 50, 235, 87, 156, 224, 57, 114, 101, 244, 30, 156, 224, 57, \r
+    114, 101, 235, 87, 156, 224, 57, 114, 199, 2, 61, 237, 190, 244, 30, 156, \r
+    224, 57, 114, 199, 2, 61, 237, 190, 235, 87, 156, 224, 57, 114, 199, 2, \r
+    61, 50, 244, 30, 156, 224, 57, 114, 199, 2, 61, 50, 235, 87, 156, 224, \r
+    57, 114, 199, 2, 61, 71, 227, 109, 244, 30, 156, 224, 57, 114, 199, 2, \r
+    61, 71, 235, 115, 235, 87, 156, 254, 73, 244, 30, 156, 254, 73, 235, 87, \r
+    25, 224, 107, 212, 114, 101, 244, 30, 25, 224, 107, 212, 114, 101, 235, \r
+    87, 25, 212, 254, 73, 244, 30, 25, 212, 254, 73, 235, 87, 71, 247, 136, \r
+    114, 71, 244, 29, 244, 30, 71, 247, 136, 114, 71, 235, 86, 235, 87, 71, \r
+    224, 116, 156, 246, 155, 244, 30, 71, 224, 116, 156, 246, 155, 235, 87, \r
+    71, 224, 116, 71, 244, 29, 244, 30, 71, 224, 116, 71, 235, 86, 235, 87, \r
+    71, 244, 30, 71, 247, 136, 246, 155, 244, 30, 71, 235, 87, 71, 247, 136, \r
+    246, 155, 235, 87, 71, 224, 57, 114, 71, 244, 30, 71, 224, 57, 246, 155, \r
+    244, 30, 71, 224, 57, 114, 71, 235, 87, 71, 224, 57, 246, 155, 224, 57, \r
+    114, 199, 156, 235, 86, 224, 57, 114, 199, 156, 244, 29, 224, 57, 114, \r
+    199, 156, 235, 87, 2, 61, 237, 190, 224, 57, 114, 199, 156, 244, 30, 2, \r
+    61, 237, 190, 247, 136, 114, 199, 156, 235, 86, 247, 136, 114, 199, 156, \r
+    244, 29, 247, 136, 224, 57, 114, 199, 156, 235, 86, 247, 136, 224, 57, \r
+    114, 199, 156, 244, 29, 224, 116, 156, 235, 86, 224, 116, 156, 244, 29, \r
+    224, 116, 71, 235, 87, 71, 246, 154, 55, 224, 116, 71, 244, 30, 71, 246, \r
+    154, 55, 51, 232, 127, 235, 86, 51, 232, 127, 244, 29, 51, 232, 127, 235, \r
+    87, 2, 220, 81, 244, 30, 230, 75, 235, 86, 244, 30, 252, 106, 235, 86, \r
+    235, 87, 250, 197, 251, 213, 250, 74, 244, 30, 250, 197, 251, 213, 250, \r
+    74, 235, 87, 250, 197, 251, 213, 250, 75, 71, 224, 57, 246, 155, 244, 30, \r
+    250, 197, 251, 213, 250, 75, 71, 224, 57, 246, 155, 224, 42, 222, 27, \r
+    235, 145, 222, 27, 224, 42, 222, 28, 156, 114, 101, 235, 145, 222, 28, \r
+    156, 114, 101, 246, 154, 5, 2, 251, 236, 50, 228, 245, 71, 224, 107, 246, \r
+    154, 55, 223, 85, 71, 224, 107, 246, 154, 55, 228, 245, 71, 224, 107, \r
+    212, 114, 101, 223, 85, 71, 224, 107, 212, 114, 101, 228, 245, 71, 246, \r
+    154, 55, 223, 85, 71, 246, 154, 55, 228, 245, 71, 212, 114, 101, 223, 85, \r
+    71, 212, 114, 101, 228, 245, 71, 254, 151, 114, 101, 223, 85, 71, 254, \r
+    151, 114, 101, 228, 245, 71, 212, 254, 151, 114, 101, 223, 85, 71, 212, \r
+    254, 151, 114, 101, 51, 228, 244, 51, 223, 84, 223, 93, 2, 248, 145, 223, \r
+    58, 2, 248, 145, 223, 93, 2, 88, 5, 56, 223, 58, 2, 88, 5, 56, 223, 93, \r
+    2, 233, 84, 5, 56, 223, 58, 2, 233, 84, 5, 56, 223, 93, 117, 156, 114, \r
+    199, 2, 61, 50, 223, 58, 117, 156, 114, 199, 2, 61, 50, 223, 93, 117, 71, \r
+    246, 154, 55, 223, 58, 117, 71, 246, 154, 55, 223, 93, 117, 71, 221, 180, \r
+    230, 112, 223, 58, 117, 71, 221, 180, 230, 112, 223, 93, 117, 71, 254, \r
+    151, 114, 101, 223, 58, 117, 71, 254, 151, 114, 101, 223, 93, 117, 71, \r
+    212, 114, 101, 223, 58, 117, 71, 212, 114, 101, 40, 42, 230, 119, 86, \r
+    230, 112, 40, 45, 230, 119, 86, 230, 112, 250, 197, 223, 92, 250, 197, \r
+    223, 57, 250, 197, 223, 93, 156, 114, 101, 250, 197, 223, 58, 156, 114, \r
+    101, 223, 93, 71, 223, 57, 223, 58, 71, 223, 92, 223, 93, 71, 223, 92, \r
+    223, 58, 71, 223, 57, 223, 58, 252, 106, 223, 92, 223, 58, 252, 106, 25, \r
+    237, 56, 251, 213, 249, 147, 2, 223, 92, 246, 213, 117, 230, 114, 247, \r
+    129, 229, 63, 2, 222, 81, 221, 119, 221, 102, 237, 174, 245, 125, 231, \r
+    196, 224, 192, 42, 222, 143, 224, 192, 113, 222, 143, 224, 192, 108, 222, \r
+    143, 229, 161, 2, 198, 69, 252, 201, 221, 78, 45, 220, 236, 51, 69, 252, \r
+    201, 42, 220, 236, 69, 252, 201, 51, 42, 220, 236, 51, 69, 252, 201, 51, \r
+    42, 220, 236, 171, 249, 147, 245, 97, 42, 233, 255, 117, 51, 219, 152, \r
+    224, 192, 113, 222, 144, 2, 230, 77, 224, 192, 108, 222, 144, 2, 220, 81, \r
+    224, 192, 108, 222, 144, 71, 224, 192, 113, 222, 143, 51, 113, 222, 143, \r
+    51, 108, 222, 143, 51, 214, 212, 55, 210, 51, 214, 212, 55, 248, 160, \r
+    212, 248, 194, 2, 210, 232, 137, 224, 55, 69, 235, 44, 2, 250, 222, 50, \r
+    69, 235, 44, 2, 250, 222, 56, 113, 222, 144, 2, 250, 222, 56, 229, 234, \r
+    2, 186, 92, 229, 234, 2, 221, 180, 230, 112, 221, 78, 69, 252, 201, 252, \r
+    73, 227, 192, 221, 78, 69, 252, 201, 2, 186, 92, 221, 78, 250, 176, 230, \r
+    112, 221, 78, 232, 127, 235, 86, 221, 78, 232, 127, 244, 29, 247, 136, \r
+    224, 57, 235, 87, 156, 114, 101, 247, 136, 224, 57, 244, 30, 156, 114, \r
+    101, 221, 78, 224, 18, 252, 73, 227, 192, 235, 146, 221, 78, 69, 252, \r
+    201, 230, 112, 51, 224, 18, 230, 112, 67, 69, 135, 233, 33, 67, 69, 135, \r
+    231, 187, 247, 5, 67, 65, 231, 187, 218, 217, 67, 65, 224, 6, 247, 5, 67, \r
+    65, 224, 6, 218, 217, 67, 65, 42, 45, 67, 65, 127, 84, 65, 220, 53, 84, \r
+    65, 247, 130, 84, 65, 231, 187, 247, 5, 84, 65, 231, 187, 218, 217, 84, \r
+    65, 224, 6, 247, 5, 84, 65, 224, 6, 218, 217, 84, 65, 42, 45, 84, 65, \r
+    108, 113, 84, 65, 90, 76, 2, 221, 170, 247, 129, 90, 76, 2, 221, 170, \r
+    220, 52, 127, 76, 2, 221, 170, 247, 129, 127, 76, 2, 221, 170, 220, 52, \r
+    40, 2, 221, 120, 144, 252, 53, 40, 2, 252, 29, 144, 252, 53, 40, 2, 220, \r
+    60, 45, 249, 11, 144, 252, 53, 40, 2, 234, 237, 42, 249, 11, 144, 252, \r
+    53, 249, 5, 2, 42, 144, 252, 53, 249, 5, 2, 45, 144, 252, 53, 249, 5, 2, \r
+    221, 120, 144, 252, 53, 249, 5, 2, 252, 29, 144, 252, 53, 247, 143, 223, \r
+    227, 84, 235, 146, 223, 227, 67, 235, 146, 223, 227, 84, 219, 100, 3, \r
+    223, 227, 67, 219, 100, 3, 223, 227, 84, 229, 175, 67, 229, 175, 67, 243, \r
+    124, 84, 243, 124, 186, 84, 243, 124, 84, 235, 146, 250, 221, 84, 234, \r
+    18, 249, 4, 67, 234, 18, 249, 4, 84, 234, 18, 234, 234, 67, 234, 18, 234, \r
+    234, 84, 3, 249, 4, 84, 3, 234, 234, 67, 3, 234, 234, 84, 186, 246, 209, \r
+    67, 186, 246, 209, 84, 69, 246, 209, 67, 69, 246, 209, 42, 76, 2, 3, 250, \r
+    221, 148, 127, 254, 19, 42, 76, 2, 34, 229, 43, 171, 127, 223, 223, 65, \r
+    127, 220, 206, 76, 2, 69, 92, 127, 220, 206, 76, 2, 51, 69, 92, 127, 220, \r
+    206, 76, 245, 97, 135, 127, 220, 206, 221, 78, 249, 147, 65, 127, 76, 2, \r
+    247, 143, 223, 146, 127, 76, 2, 222, 136, 2, 69, 92, 127, 76, 2, 222, \r
+    136, 2, 51, 69, 92, 127, 220, 206, 76, 2, 222, 135, 127, 220, 206, 76, 2, \r
+    222, 136, 2, 69, 92, 127, 220, 206, 76, 2, 222, 136, 2, 51, 69, 92, 127, \r
+    76, 221, 225, 218, 151, 218, 237, 76, 229, 28, 248, 208, 235, 115, 246, \r
+    154, 5, 71, 127, 65, 227, 160, 221, 180, 230, 113, 71, 127, 65, 127, 76, \r
+    71, 227, 160, 254, 151, 114, 101, 90, 76, 221, 225, 244, 29, 90, 76, 221, \r
+    225, 223, 57, 127, 228, 92, 65, 90, 228, 92, 65, 227, 160, 221, 180, 230, \r
+    113, 71, 90, 65, 90, 76, 71, 227, 160, 254, 151, 114, 101, 221, 180, 230, \r
+    113, 71, 127, 65, 127, 76, 71, 254, 151, 114, 101, 127, 76, 71, 227, 160, \r
+    221, 180, 230, 112, 90, 76, 71, 227, 160, 221, 180, 230, 112, 67, 234, \r
+    18, 223, 156, 84, 3, 223, 156, 67, 3, 223, 156, 84, 227, 106, 229, 175, \r
+    67, 227, 106, 229, 175, 106, 235, 146, 250, 221, 106, 230, 78, 2, 230, \r
+    78, 237, 190, 106, 250, 222, 2, 250, 222, 237, 190, 106, 250, 221, 106, \r
+    34, 226, 149, 125, 6, 1, 253, 205, 125, 6, 1, 251, 244, 125, 6, 1, 219, \r
+    163, 125, 6, 1, 244, 76, 125, 6, 1, 248, 162, 125, 6, 1, 218, 1, 125, 6, \r
+    1, 217, 66, 125, 6, 1, 247, 71, 125, 6, 1, 217, 89, 125, 6, 1, 237, 130, \r
+    125, 6, 1, 66, 237, 130, 125, 6, 1, 72, 125, 6, 1, 248, 180, 125, 6, 1, \r
+    236, 238, 125, 6, 1, 235, 19, 125, 6, 1, 233, 37, 125, 6, 1, 232, 208, \r
+    125, 6, 1, 230, 129, 125, 6, 1, 229, 26, 125, 6, 1, 227, 87, 125, 6, 1, \r
+    224, 47, 125, 6, 1, 220, 226, 125, 6, 1, 220, 98, 125, 6, 1, 245, 99, \r
+    125, 6, 1, 243, 130, 125, 6, 1, 230, 87, 125, 6, 1, 229, 198, 125, 6, 1, \r
+    224, 173, 125, 6, 1, 221, 39, 125, 6, 1, 251, 3, 125, 6, 1, 225, 25, 125, \r
+    6, 1, 218, 7, 125, 6, 1, 218, 9, 125, 6, 1, 218, 34, 125, 6, 1, 223, 243, \r
+    155, 125, 6, 1, 217, 200, 125, 6, 1, 3, 217, 178, 125, 6, 1, 3, 217, 179, \r
+    2, 222, 135, 125, 6, 1, 217, 231, 125, 6, 1, 237, 161, 3, 217, 178, 125, \r
+    6, 1, 252, 76, 217, 178, 125, 6, 1, 237, 161, 252, 76, 217, 178, 125, 6, \r
+    1, 245, 171, 125, 6, 1, 237, 128, 125, 6, 1, 224, 172, 125, 6, 1, 221, \r
+    70, 60, 125, 6, 1, 235, 137, 233, 37, 125, 3, 1, 253, 205, 125, 3, 1, \r
+    251, 244, 125, 3, 1, 219, 163, 125, 3, 1, 244, 76, 125, 3, 1, 248, 162, \r
+    125, 3, 1, 218, 1, 125, 3, 1, 217, 66, 125, 3, 1, 247, 71, 125, 3, 1, \r
+    217, 89, 125, 3, 1, 237, 130, 125, 3, 1, 66, 237, 130, 125, 3, 1, 72, \r
+    125, 3, 1, 248, 180, 125, 3, 1, 236, 238, 125, 3, 1, 235, 19, 125, 3, 1, \r
+    233, 37, 125, 3, 1, 232, 208, 125, 3, 1, 230, 129, 125, 3, 1, 229, 26, \r
+    125, 3, 1, 227, 87, 125, 3, 1, 224, 47, 125, 3, 1, 220, 226, 125, 3, 1, \r
+    220, 98, 125, 3, 1, 245, 99, 125, 3, 1, 243, 130, 125, 3, 1, 230, 87, \r
+    125, 3, 1, 229, 198, 125, 3, 1, 224, 173, 125, 3, 1, 221, 39, 125, 3, 1, \r
+    251, 3, 125, 3, 1, 225, 25, 125, 3, 1, 218, 7, 125, 3, 1, 218, 9, 125, 3, \r
+    1, 218, 34, 125, 3, 1, 223, 243, 155, 125, 3, 1, 217, 200, 125, 3, 1, 3, \r
+    217, 178, 125, 3, 1, 3, 217, 179, 2, 222, 135, 125, 3, 1, 217, 231, 125, \r
+    3, 1, 237, 161, 3, 217, 178, 125, 3, 1, 252, 76, 217, 178, 125, 3, 1, \r
+    237, 161, 252, 76, 217, 178, 125, 3, 1, 245, 171, 125, 3, 1, 237, 128, \r
+    125, 3, 1, 224, 172, 125, 3, 1, 221, 70, 60, 125, 3, 1, 235, 137, 233, \r
+    37, 7, 6, 1, 235, 202, 2, 51, 135, 7, 3, 1, 235, 202, 2, 51, 135, 7, 6, \r
+    1, 235, 202, 2, 233, 193, 221, 179, 7, 6, 1, 230, 60, 2, 92, 7, 6, 1, \r
+    228, 39, 2, 222, 135, 7, 3, 1, 112, 2, 92, 7, 3, 1, 222, 202, 2, 249, 11, \r
+    92, 7, 6, 1, 243, 226, 2, 249, 48, 7, 3, 1, 243, 226, 2, 249, 48, 7, 6, \r
+    1, 237, 18, 2, 249, 48, 7, 3, 1, 237, 18, 2, 249, 48, 7, 6, 1, 217, 158, \r
+    2, 249, 48, 7, 3, 1, 217, 158, 2, 249, 48, 7, 6, 1, 254, 146, 7, 6, 1, \r
+    234, 187, 2, 96, 7, 6, 1, 215, 60, 7, 6, 1, 215, 254, 146, 7, 3, 1, 220, \r
+    11, 2, 45, 96, 7, 6, 1, 219, 41, 2, 96, 7, 3, 1, 219, 41, 2, 96, 7, 3, 1, \r
+    220, 11, 2, 250, 80, 7, 6, 1, 144, 243, 225, 7, 3, 1, 144, 243, 225, 7, \r
+    3, 1, 222, 133, 229, 129, 7, 3, 1, 178, 2, 231, 183, 7, 3, 1, 215, 228, \r
+    39, 2, 222, 135, 7, 3, 1, 142, 2, 109, 227, 94, 237, 190, 7, 1, 3, 6, \r
+    215, 73, 7, 223, 94, 3, 1, 237, 126, 58, 1, 6, 216, 216, 7, 6, 1, 226, \r
+    235, 2, 223, 33, 222, 135, 7, 6, 1, 217, 158, 2, 223, 33, 222, 135, 75, \r
+    6, 1, 254, 163, 75, 3, 1, 254, 163, 75, 6, 1, 219, 92, 75, 3, 1, 219, 92, \r
+    75, 6, 1, 244, 231, 75, 3, 1, 244, 231, 75, 6, 1, 249, 179, 75, 3, 1, \r
+    249, 179, 75, 6, 1, 246, 236, 75, 3, 1, 246, 236, 75, 6, 1, 224, 11, 75, \r
+    3, 1, 224, 11, 75, 6, 1, 217, 99, 75, 3, 1, 217, 99, 75, 6, 1, 243, 171, \r
+    75, 3, 1, 243, 171, 75, 6, 1, 222, 4, 75, 3, 1, 222, 4, 75, 6, 1, 242, \r
+    70, 75, 3, 1, 242, 70, 75, 6, 1, 236, 226, 75, 3, 1, 236, 226, 75, 6, 1, \r
+    235, 135, 75, 3, 1, 235, 135, 75, 6, 1, 233, 196, 75, 3, 1, 233, 196, 75, \r
+    6, 1, 232, 62, 75, 3, 1, 232, 62, 75, 6, 1, 236, 11, 75, 3, 1, 236, 11, \r
+    75, 6, 1, 74, 75, 3, 1, 74, 75, 6, 1, 229, 108, 75, 3, 1, 229, 108, 75, \r
+    6, 1, 227, 75, 75, 3, 1, 227, 75, 75, 6, 1, 224, 118, 75, 3, 1, 224, 118, \r
+    75, 6, 1, 222, 105, 75, 3, 1, 222, 105, 75, 6, 1, 220, 123, 75, 3, 1, \r
+    220, 123, 75, 6, 1, 245, 203, 75, 3, 1, 245, 203, 75, 6, 1, 236, 130, 75, \r
+    3, 1, 236, 130, 75, 6, 1, 228, 212, 75, 3, 1, 228, 212, 75, 6, 1, 230, \r
+    123, 75, 3, 1, 230, 123, 75, 6, 1, 249, 9, 254, 168, 75, 3, 1, 249, 9, \r
+    254, 168, 75, 6, 1, 48, 75, 254, 191, 75, 3, 1, 48, 75, 254, 191, 75, 6, \r
+    1, 250, 93, 246, 236, 75, 3, 1, 250, 93, 246, 236, 75, 6, 1, 249, 9, 236, \r
+    226, 75, 3, 1, 249, 9, 236, 226, 75, 6, 1, 249, 9, 232, 62, 75, 3, 1, \r
+    249, 9, 232, 62, 75, 6, 1, 250, 93, 232, 62, 75, 3, 1, 250, 93, 232, 62, \r
+    75, 6, 1, 48, 75, 230, 123, 75, 3, 1, 48, 75, 230, 123, 75, 6, 1, 226, \r
+    142, 75, 3, 1, 226, 142, 75, 6, 1, 250, 98, 224, 238, 75, 3, 1, 250, 98, \r
+    224, 238, 75, 6, 1, 48, 75, 224, 238, 75, 3, 1, 48, 75, 224, 238, 75, 6, \r
+    1, 48, 75, 246, 133, 75, 3, 1, 48, 75, 246, 133, 75, 6, 1, 254, 178, 236, \r
+    135, 75, 3, 1, 254, 178, 236, 135, 75, 6, 1, 249, 9, 242, 242, 75, 3, 1, \r
+    249, 9, 242, 242, 75, 6, 1, 48, 75, 242, 242, 75, 3, 1, 48, 75, 242, 242, \r
+    75, 6, 1, 48, 75, 155, 75, 3, 1, 48, 75, 155, 75, 6, 1, 235, 201, 155, \r
+    75, 3, 1, 235, 201, 155, 75, 6, 1, 48, 75, 243, 145, 75, 3, 1, 48, 75, \r
+    243, 145, 75, 6, 1, 48, 75, 243, 173, 75, 3, 1, 48, 75, 243, 173, 75, 6, \r
+    1, 48, 75, 244, 226, 75, 3, 1, 48, 75, 244, 226, 75, 6, 1, 48, 75, 248, \r
+    183, 75, 3, 1, 48, 75, 248, 183, 75, 6, 1, 48, 75, 224, 211, 75, 3, 1, \r
+    48, 75, 224, 211, 75, 6, 1, 48, 231, 115, 224, 211, 75, 3, 1, 48, 231, \r
+    115, 224, 211, 75, 6, 1, 48, 231, 115, 232, 92, 75, 3, 1, 48, 231, 115, \r
+    232, 92, 75, 6, 1, 48, 231, 115, 231, 67, 75, 3, 1, 48, 231, 115, 231, \r
+    67, 75, 6, 1, 48, 231, 115, 218, 238, 75, 3, 1, 48, 231, 115, 218, 238, \r
+    75, 16, 236, 243, 75, 16, 233, 197, 227, 75, 75, 16, 229, 109, 227, 75, \r
+    75, 16, 223, 152, 75, 16, 222, 106, 227, 75, 75, 16, 236, 131, 227, 75, \r
+    75, 16, 224, 212, 224, 118, 75, 6, 1, 250, 93, 224, 238, 75, 3, 1, 250, \r
+    93, 224, 238, 75, 6, 1, 250, 93, 244, 226, 75, 3, 1, 250, 93, 244, 226, \r
+    75, 36, 232, 63, 50, 75, 36, 223, 238, 254, 2, 75, 36, 223, 238, 235, 92, \r
+    75, 48, 231, 115, 245, 90, 223, 136, 75, 48, 231, 115, 248, 210, 228, 82, \r
+    78, 75, 48, 231, 115, 237, 210, 228, 82, 78, 75, 48, 231, 115, 219, 154, \r
+    248, 191, 75, 245, 108, 131, 243, 194, 75, 245, 90, 223, 136, 75, 233, \r
+    113, 248, 191, 95, 3, 1, 254, 131, 95, 3, 1, 252, 209, 95, 3, 1, 244, \r
+    230, 95, 3, 1, 248, 153, 95, 3, 1, 246, 197, 95, 3, 1, 219, 85, 95, 3, 1, \r
+    217, 87, 95, 3, 1, 222, 119, 95, 3, 1, 237, 223, 95, 3, 1, 236, 233, 95, \r
+    3, 1, 235, 143, 95, 3, 1, 234, 86, 95, 3, 1, 232, 211, 95, 3, 1, 230, \r
+    138, 95, 3, 1, 229, 243, 95, 3, 1, 217, 76, 95, 3, 1, 227, 249, 95, 3, 1, \r
+    226, 140, 95, 3, 1, 222, 112, 95, 3, 1, 220, 87, 95, 3, 1, 229, 134, 95, \r
+    3, 1, 236, 138, 95, 3, 1, 244, 119, 95, 3, 1, 228, 140, 95, 3, 1, 224, \r
+    209, 95, 3, 1, 251, 22, 95, 3, 1, 251, 154, 95, 3, 1, 237, 91, 95, 3, 1, \r
+    250, 224, 95, 3, 1, 251, 56, 95, 3, 1, 218, 136, 95, 3, 1, 237, 101, 95, \r
+    3, 1, 243, 208, 95, 3, 1, 243, 162, 95, 3, 1, 243, 108, 95, 3, 1, 218, \r
+    227, 95, 3, 1, 243, 182, 95, 3, 1, 243, 2, 221, 197, 1, 184, 221, 197, 1, \r
+    218, 72, 221, 197, 1, 218, 71, 221, 197, 1, 218, 63, 221, 197, 1, 218, \r
+    61, 221, 197, 1, 252, 108, 255, 2, 218, 57, 221, 197, 1, 218, 57, 221, \r
+    197, 1, 218, 69, 221, 197, 1, 218, 66, 221, 197, 1, 218, 68, 221, 197, 1, \r
+    218, 67, 221, 197, 1, 217, 254, 221, 197, 1, 218, 64, 221, 197, 1, 218, \r
+    55, 221, 197, 1, 220, 255, 218, 55, 221, 197, 1, 218, 52, 221, 197, 1, \r
+    218, 59, 221, 197, 1, 252, 108, 255, 2, 218, 59, 221, 197, 1, 220, 255, \r
+    218, 59, 221, 197, 1, 218, 58, 221, 197, 1, 218, 76, 221, 197, 1, 218, \r
+    53, 221, 197, 1, 220, 255, 218, 53, 221, 197, 1, 218, 43, 221, 197, 1, \r
+    220, 255, 218, 43, 221, 197, 1, 217, 250, 221, 197, 1, 218, 27, 221, 197, \r
+    1, 254, 200, 218, 27, 221, 197, 1, 220, 255, 218, 27, 221, 197, 1, 218, \r
+    51, 221, 197, 1, 218, 50, 221, 197, 1, 218, 47, 221, 197, 1, 220, 255, \r
+    218, 60, 221, 197, 1, 220, 255, 218, 45, 221, 197, 1, 218, 44, 221, 197, \r
+    1, 217, 200, 221, 197, 1, 218, 41, 221, 197, 1, 218, 40, 221, 197, 1, \r
+    218, 62, 221, 197, 1, 220, 255, 218, 62, 221, 197, 1, 253, 208, 218, 62, \r
+    221, 197, 1, 218, 39, 221, 197, 1, 218, 37, 221, 197, 1, 218, 38, 221, \r
+    197, 1, 218, 36, 221, 197, 1, 218, 35, 221, 197, 1, 218, 70, 221, 197, 1, \r
+    218, 33, 221, 197, 1, 218, 32, 221, 197, 1, 218, 31, 221, 197, 1, 218, \r
+    30, 221, 197, 1, 218, 28, 221, 197, 1, 222, 98, 218, 28, 221, 197, 1, \r
+    218, 26, 221, 197, 58, 1, 235, 182, 78, 28, 4, 235, 11, 28, 4, 233, 135, \r
+    28, 4, 227, 73, 28, 4, 224, 25, 28, 4, 224, 199, 28, 4, 252, 40, 28, 4, \r
+    221, 139, 28, 4, 250, 181, 28, 4, 231, 202, 28, 4, 231, 55, 28, 4, 244, \r
+    73, 230, 185, 28, 4, 217, 20, 28, 4, 248, 165, 28, 4, 249, 106, 28, 4, \r
+    237, 58, 28, 4, 221, 238, 28, 4, 251, 10, 28, 4, 229, 117, 28, 4, 229, \r
+    36, 28, 4, 244, 130, 28, 4, 244, 126, 28, 4, 244, 127, 28, 4, 244, 128, \r
+    28, 4, 223, 218, 28, 4, 223, 178, 28, 4, 223, 189, 28, 4, 223, 217, 28, \r
+    4, 223, 193, 28, 4, 223, 194, 28, 4, 223, 182, 28, 4, 251, 114, 28, 4, \r
+    251, 101, 28, 4, 251, 103, 28, 4, 251, 113, 28, 4, 251, 111, 28, 4, 251, \r
+    112, 28, 4, 251, 102, 28, 4, 216, 247, 28, 4, 216, 227, 28, 4, 216, 238, \r
+    28, 4, 216, 246, 28, 4, 216, 241, 28, 4, 216, 242, 28, 4, 216, 230, 28, \r
+    4, 251, 110, 28, 4, 251, 104, 28, 4, 251, 106, 28, 4, 251, 109, 28, 4, \r
+    251, 107, 28, 4, 251, 108, 28, 4, 251, 105, 28, 4, 228, 51, 28, 4, 228, \r
+    41, 28, 4, 228, 47, 28, 4, 228, 50, 28, 4, 228, 48, 28, 4, 228, 49, 28, \r
+    4, 228, 46, 28, 4, 235, 212, 28, 4, 235, 204, 28, 4, 235, 207, 28, 4, \r
+    235, 211, 28, 4, 235, 208, 28, 4, 235, 209, 28, 4, 235, 205, 28, 4, 218, \r
+    103, 28, 4, 218, 93, 28, 4, 218, 99, 28, 4, 218, 102, 28, 4, 218, 100, \r
+    28, 4, 218, 101, 28, 4, 218, 98, 28, 4, 243, 236, 28, 4, 243, 227, 28, 4, \r
+    243, 230, 28, 4, 243, 235, 28, 4, 243, 232, 28, 4, 243, 233, 28, 4, 243, \r
+    229, 36, 31, 1, 252, 144, 36, 31, 1, 219, 165, 36, 31, 1, 244, 116, 36, \r
+    31, 1, 249, 92, 36, 31, 1, 217, 72, 36, 31, 1, 217, 92, 36, 31, 1, 175, \r
+    36, 31, 1, 246, 217, 36, 31, 1, 246, 205, 36, 31, 1, 246, 197, 36, 31, 1, \r
+    74, 36, 31, 1, 229, 198, 36, 31, 1, 246, 148, 36, 31, 1, 246, 138, 36, \r
+    31, 1, 222, 87, 36, 31, 1, 155, 36, 31, 1, 221, 50, 36, 31, 1, 251, 46, \r
+    36, 31, 1, 225, 25, 36, 31, 1, 224, 248, 36, 31, 1, 245, 171, 36, 31, 1, \r
+    246, 137, 36, 31, 1, 60, 36, 31, 1, 238, 26, 36, 31, 1, 248, 181, 36, 31, \r
+    1, 233, 123, 220, 102, 36, 31, 1, 218, 36, 36, 31, 1, 217, 200, 36, 31, \r
+    1, 237, 160, 60, 36, 31, 1, 235, 25, 217, 178, 36, 31, 1, 252, 76, 217, \r
+    178, 36, 31, 1, 237, 160, 252, 76, 217, 178, 45, 254, 120, 223, 89, 234, \r
+    63, 45, 254, 120, 247, 143, 223, 89, 234, 63, 42, 223, 89, 115, 45, 223, \r
+    89, 115, 42, 247, 143, 223, 89, 115, 45, 247, 143, 223, 89, 115, 227, \r
+    241, 237, 178, 234, 63, 227, 241, 247, 143, 237, 178, 234, 63, 247, 143, \r
+    221, 103, 234, 63, 42, 221, 103, 115, 45, 221, 103, 115, 227, 241, 223, \r
+    227, 42, 227, 241, 230, 140, 115, 45, 227, 241, 230, 140, 115, 246, 251, \r
+    250, 121, 229, 239, 245, 126, 229, 239, 210, 245, 126, 229, 239, 242, \r
+    118, 247, 143, 230, 180, 247, 130, 254, 127, 220, 53, 254, 127, 247, 143, \r
+    227, 106, 254, 119, 51, 230, 177, 242, 121, 237, 170, 237, 177, 230, 23, \r
+    252, 14, 242, 122, 2, 249, 13, 221, 180, 2, 227, 94, 50, 42, 109, 229, \r
+    231, 115, 45, 109, 229, 231, 115, 221, 180, 2, 61, 50, 221, 180, 2, 61, \r
+    56, 42, 69, 252, 201, 2, 228, 77, 45, 69, 252, 201, 2, 228, 77, 221, 120, \r
+    42, 144, 115, 221, 120, 45, 144, 115, 252, 29, 42, 144, 115, 252, 29, 45, \r
+    144, 115, 42, 224, 136, 105, 115, 45, 224, 136, 105, 115, 42, 51, 229, \r
+    229, 45, 51, 229, 229, 124, 188, 104, 131, 61, 228, 196, 131, 61, 104, \r
+    124, 188, 228, 196, 204, 245, 116, 61, 228, 196, 245, 170, 61, 78, 210, \r
+    228, 82, 78, 69, 221, 179, 227, 94, 229, 31, 218, 174, 225, 55, 233, 193, \r
+    248, 145, 9, 32, 227, 181, 9, 32, 250, 203, 9, 32, 226, 90, 107, 9, 32, \r
+    226, 90, 103, 9, 32, 226, 90, 160, 9, 32, 229, 157, 9, 32, 252, 21, 9, \r
+    32, 222, 146, 9, 32, 236, 61, 107, 9, 32, 236, 61, 103, 9, 32, 248, 189, \r
+    9, 32, 226, 92, 9, 32, 3, 107, 9, 32, 3, 103, 9, 32, 235, 155, 107, 9, \r
+    32, 235, 155, 103, 9, 32, 235, 155, 160, 9, 32, 235, 155, 154, 9, 32, \r
+    224, 35, 9, 32, 221, 229, 9, 32, 224, 33, 107, 9, 32, 224, 33, 103, 9, \r
+    32, 243, 154, 107, 9, 32, 243, 154, 103, 9, 32, 243, 189, 9, 32, 227, \r
+    233, 9, 32, 251, 8, 9, 32, 223, 68, 9, 32, 233, 117, 9, 32, 249, 90, 9, \r
+    32, 233, 110, 9, 32, 250, 213, 9, 32, 218, 241, 107, 9, 32, 218, 241, \r
+    103, 9, 32, 245, 179, 9, 32, 229, 208, 107, 9, 32, 229, 208, 103, 9, 32, \r
+    224, 114, 144, 221, 99, 221, 60, 9, 32, 250, 110, 9, 32, 248, 159, 9, 32, \r
+    237, 121, 9, 32, 252, 36, 117, 250, 192, 9, 32, 246, 81, 9, 32, 223, 240, \r
+    107, 9, 32, 223, 240, 103, 9, 32, 252, 211, 9, 32, 224, 119, 9, 32, 251, \r
+    199, 224, 119, 9, 32, 232, 126, 107, 9, 32, 232, 126, 103, 9, 32, 232, \r
+    126, 160, 9, 32, 232, 126, 154, 9, 32, 233, 243, 9, 32, 224, 240, 9, 32, \r
+    227, 239, 9, 32, 246, 100, 9, 32, 230, 150, 9, 32, 251, 255, 107, 9, 32, \r
+    251, 255, 103, 9, 32, 234, 21, 9, 32, 233, 112, 9, 32, 244, 40, 107, 9, \r
+    32, 244, 40, 103, 9, 32, 244, 40, 160, 9, 32, 221, 196, 9, 32, 250, 191, \r
+    9, 32, 218, 217, 107, 9, 32, 218, 217, 103, 9, 32, 251, 199, 226, 84, 9, \r
+    32, 224, 114, 242, 189, 9, 32, 242, 189, 9, 32, 251, 199, 223, 247, 9, \r
+    32, 251, 199, 224, 235, 9, 32, 245, 133, 9, 32, 251, 199, 251, 127, 9, \r
+    32, 224, 114, 218, 255, 9, 32, 219, 0, 107, 9, 32, 219, 0, 103, 9, 32, \r
+    250, 214, 9, 32, 251, 199, 244, 62, 9, 32, 171, 107, 9, 32, 171, 103, 9, \r
+    32, 251, 199, 235, 2, 9, 32, 251, 199, 244, 213, 9, 32, 233, 109, 107, 9, \r
+    32, 233, 109, 103, 9, 32, 227, 242, 9, 32, 252, 43, 9, 32, 251, 199, 222, \r
+    117, 235, 119, 9, 32, 251, 199, 235, 120, 9, 32, 251, 199, 218, 194, 9, \r
+    32, 251, 199, 245, 142, 9, 32, 247, 3, 107, 9, 32, 247, 3, 103, 9, 32, \r
+    247, 3, 160, 9, 32, 251, 199, 247, 2, 9, 32, 243, 159, 9, 32, 251, 199, \r
+    242, 188, 9, 32, 252, 35, 9, 32, 244, 111, 9, 32, 251, 199, 245, 176, 9, \r
+    32, 251, 199, 252, 67, 9, 32, 251, 199, 226, 151, 9, 32, 224, 114, 218, \r
+    212, 9, 32, 224, 114, 218, 20, 9, 32, 251, 199, 245, 98, 9, 32, 237, 125, \r
+    246, 103, 9, 32, 251, 199, 246, 103, 9, 32, 237, 125, 221, 121, 9, 32, \r
+    251, 199, 221, 121, 9, 32, 237, 125, 247, 123, 9, 32, 251, 199, 247, 123, \r
+    9, 32, 220, 234, 9, 32, 237, 125, 220, 234, 9, 32, 251, 199, 220, 234, \r
+    53, 32, 107, 53, 32, 235, 43, 53, 32, 248, 145, 53, 32, 224, 55, 53, 32, \r
+    226, 89, 53, 32, 96, 53, 32, 103, 53, 32, 235, 64, 53, 32, 234, 86, 53, \r
+    32, 235, 103, 53, 32, 246, 178, 53, 32, 185, 53, 32, 113, 252, 21, 53, \r
+    32, 250, 111, 53, 32, 242, 65, 53, 32, 222, 146, 53, 32, 230, 119, 252, \r
+    21, 53, 32, 236, 60, 53, 32, 229, 10, 53, 32, 218, 169, 53, 32, 223, 235, \r
+    53, 32, 45, 230, 119, 252, 21, 53, 32, 243, 109, 246, 192, 53, 32, 222, \r
+    65, 53, 32, 248, 189, 53, 32, 226, 92, 53, 32, 250, 203, 53, 32, 228, \r
+    231, 53, 32, 254, 208, 53, 32, 233, 105, 53, 32, 246, 192, 53, 32, 247, \r
+    8, 53, 32, 226, 108, 53, 32, 244, 68, 53, 32, 244, 69, 224, 45, 53, 32, \r
+    246, 102, 53, 32, 252, 75, 53, 32, 218, 183, 53, 32, 251, 24, 53, 32, \r
+    227, 66, 53, 32, 237, 220, 53, 32, 224, 43, 53, 32, 235, 154, 53, 32, \r
+    250, 119, 53, 32, 223, 230, 53, 32, 233, 107, 53, 32, 227, 84, 53, 32, \r
+    218, 171, 53, 32, 230, 134, 53, 32, 220, 239, 53, 32, 247, 113, 53, 32, \r
+    224, 192, 221, 229, 53, 32, 247, 143, 250, 203, 53, 32, 171, 223, 122, \r
+    53, 32, 124, 243, 187, 53, 32, 224, 194, 53, 32, 252, 24, 53, 32, 224, \r
+    32, 53, 32, 252, 3, 53, 32, 223, 145, 53, 32, 243, 153, 53, 32, 243, 195, \r
+    53, 32, 248, 148, 53, 32, 243, 189, 53, 32, 252, 14, 53, 32, 227, 233, \r
+    53, 32, 226, 99, 53, 32, 248, 212, 53, 32, 253, 213, 53, 32, 223, 227, \r
+    53, 32, 231, 184, 53, 32, 223, 68, 53, 32, 226, 118, 53, 32, 233, 117, \r
+    53, 32, 221, 98, 53, 32, 235, 178, 53, 32, 223, 136, 53, 32, 249, 90, 53, \r
+    32, 218, 226, 53, 32, 248, 168, 231, 184, 53, 32, 250, 165, 53, 32, 245, \r
+    84, 53, 32, 250, 211, 53, 32, 223, 148, 53, 32, 218, 240, 53, 32, 245, \r
+    179, 53, 32, 250, 210, 53, 32, 245, 235, 53, 32, 51, 218, 151, 53, 32, \r
+    144, 221, 99, 221, 60, 53, 32, 224, 52, 53, 32, 245, 243, 53, 32, 250, \r
+    110, 53, 32, 248, 159, 53, 32, 228, 228, 53, 32, 237, 121, 53, 32, 234, \r
+    3, 53, 32, 221, 178, 53, 32, 223, 31, 53, 32, 235, 59, 53, 32, 220, 33, \r
+    53, 32, 245, 202, 53, 32, 252, 36, 117, 250, 192, 53, 32, 224, 137, 53, \r
+    32, 247, 143, 222, 62, 53, 32, 218, 207, 53, 32, 224, 62, 53, 32, 248, \r
+    202, 53, 32, 246, 81, 53, 32, 223, 249, 53, 32, 65, 53, 32, 223, 138, 53, \r
+    32, 223, 239, 53, 32, 221, 108, 53, 32, 244, 45, 53, 32, 251, 119, 53, \r
+    32, 223, 160, 53, 32, 252, 211, 53, 32, 227, 145, 53, 32, 224, 119, 53, \r
+    32, 237, 117, 53, 32, 232, 125, 53, 32, 224, 240, 53, 32, 245, 228, 53, \r
+    32, 230, 150, 53, 32, 254, 126, 53, 32, 229, 47, 53, 32, 247, 11, 53, 32, \r
+    251, 254, 53, 32, 234, 21, 53, 32, 233, 156, 53, 32, 225, 73, 53, 32, \r
+    254, 23, 53, 32, 233, 112, 53, 32, 221, 124, 53, 32, 230, 111, 53, 32, \r
+    252, 38, 53, 32, 223, 134, 53, 32, 250, 174, 53, 32, 244, 39, 53, 32, \r
+    221, 196, 53, 32, 237, 192, 53, 32, 252, 44, 53, 32, 219, 0, 246, 192, \r
+    53, 32, 250, 191, 53, 32, 218, 216, 53, 32, 226, 84, 53, 32, 242, 189, \r
+    53, 32, 223, 247, 53, 32, 219, 186, 53, 32, 252, 141, 53, 32, 229, 78, \r
+    53, 32, 252, 227, 53, 32, 224, 235, 53, 32, 227, 202, 53, 32, 227, 10, \r
+    53, 32, 245, 133, 53, 32, 252, 37, 53, 32, 251, 127, 53, 32, 252, 58, 53, \r
+    32, 233, 114, 53, 32, 218, 255, 53, 32, 250, 214, 53, 32, 218, 192, 53, \r
+    32, 248, 199, 53, 32, 219, 86, 53, 32, 244, 62, 53, 32, 235, 2, 53, 32, \r
+    244, 213, 53, 32, 233, 108, 53, 32, 224, 54, 53, 32, 224, 192, 222, 134, \r
+    252, 67, 53, 32, 227, 242, 53, 32, 252, 43, 53, 32, 218, 166, 53, 32, \r
+    246, 3, 53, 32, 235, 119, 53, 32, 222, 117, 235, 119, 53, 32, 235, 116, \r
+    53, 32, 224, 8, 53, 32, 235, 120, 53, 32, 218, 194, 53, 32, 245, 142, 53, \r
+    32, 247, 2, 53, 32, 243, 159, 53, 32, 245, 106, 53, 32, 242, 188, 53, 32, \r
+    252, 35, 53, 32, 222, 122, 53, 32, 243, 200, 53, 32, 245, 195, 53, 32, \r
+    226, 172, 218, 192, 53, 32, 251, 121, 53, 32, 244, 111, 53, 32, 245, 176, \r
+    53, 32, 252, 67, 53, 32, 226, 151, 53, 32, 249, 80, 53, 32, 218, 212, 53, \r
+    32, 243, 139, 53, 32, 218, 20, 53, 32, 233, 163, 53, 32, 252, 53, 53, 32, \r
+    246, 202, 53, 32, 245, 98, 53, 32, 221, 76, 53, 32, 247, 115, 53, 32, \r
+    227, 228, 53, 32, 231, 185, 53, 32, 246, 103, 53, 32, 221, 121, 53, 32, \r
+    247, 123, 53, 32, 220, 234, 53, 32, 245, 143, 98, 249, 46, 126, 42, 199, \r
+    227, 109, 98, 249, 46, 126, 71, 199, 56, 98, 249, 46, 126, 42, 199, 233, \r
+    193, 25, 227, 109, 98, 249, 46, 126, 71, 199, 233, 193, 25, 56, 98, 249, \r
+    46, 126, 245, 90, 223, 47, 98, 249, 46, 126, 223, 48, 245, 97, 50, 98, \r
+    249, 46, 126, 223, 48, 245, 97, 56, 98, 249, 46, 126, 223, 48, 245, 97, \r
+    235, 115, 98, 249, 46, 126, 223, 48, 245, 97, 220, 60, 235, 115, 98, 249, \r
+    46, 126, 223, 48, 245, 97, 220, 60, 227, 109, 98, 249, 46, 126, 223, 48, \r
+    245, 97, 234, 237, 235, 115, 98, 249, 46, 126, 230, 76, 98, 223, 254, 98, \r
+    250, 168, 98, 245, 90, 223, 136, 248, 196, 78, 237, 118, 237, 209, 223, \r
+    159, 100, 98, 237, 138, 78, 98, 250, 194, 78, 98, 54, 217, 84, 42, 254, \r
+    120, 115, 45, 254, 120, 115, 42, 51, 254, 120, 115, 45, 51, 254, 120, \r
+    115, 42, 250, 124, 115, 45, 250, 124, 115, 42, 67, 250, 124, 115, 45, 67, \r
+    250, 124, 115, 42, 84, 235, 91, 115, 45, 84, 235, 91, 115, 229, 14, 78, \r
+    244, 163, 78, 42, 221, 114, 224, 236, 115, 45, 221, 114, 224, 236, 115, \r
+    42, 67, 235, 91, 115, 45, 67, 235, 91, 115, 42, 67, 221, 114, 224, 236, \r
+    115, 45, 67, 221, 114, 224, 236, 115, 42, 67, 40, 115, 45, 67, 40, 115, \r
+    218, 237, 249, 146, 210, 51, 228, 236, 228, 69, 78, 51, 228, 236, 228, \r
+    69, 78, 109, 51, 228, 236, 228, 69, 78, 229, 14, 164, 246, 3, 243, 185, \r
+    231, 107, 107, 243, 185, 231, 107, 103, 243, 185, 231, 107, 160, 243, \r
+    185, 231, 107, 154, 243, 185, 231, 107, 174, 243, 185, 231, 107, 182, \r
+    243, 185, 231, 107, 191, 243, 185, 231, 107, 185, 243, 185, 231, 107, \r
+    190, 98, 235, 83, 145, 78, 98, 227, 88, 145, 78, 98, 249, 52, 145, 78, \r
+    98, 246, 177, 145, 78, 22, 224, 109, 61, 145, 78, 22, 51, 61, 145, 78, \r
+    218, 235, 249, 146, 69, 236, 232, 227, 182, 78, 69, 236, 232, 227, 182, \r
+    2, 219, 70, 224, 9, 78, 69, 236, 232, 227, 182, 164, 220, 60, 243, 194, \r
+    69, 236, 232, 227, 182, 2, 219, 70, 224, 9, 164, 220, 60, 243, 194, 69, \r
+    236, 232, 227, 182, 164, 234, 237, 243, 194, 34, 229, 14, 78, 98, 183, \r
+    235, 44, 245, 225, 225, 55, 100, 243, 185, 231, 107, 222, 65, 243, 185, \r
+    231, 107, 220, 219, 243, 185, 231, 107, 221, 245, 69, 98, 237, 138, 78, \r
+    234, 52, 78, 229, 225, 254, 143, 78, 98, 41, 237, 211, 98, 144, 245, 188, \r
+    223, 254, 136, 1, 3, 60, 136, 1, 60, 136, 1, 3, 72, 136, 1, 72, 136, 1, \r
+    3, 68, 136, 1, 68, 136, 1, 3, 73, 136, 1, 73, 136, 1, 3, 74, 136, 1, 74, \r
+    136, 1, 175, 136, 1, 245, 0, 136, 1, 236, 113, 136, 1, 244, 103, 136, 1, \r
+    236, 7, 136, 1, 244, 17, 136, 1, 236, 184, 136, 1, 244, 191, 136, 1, 236, \r
+    57, 136, 1, 244, 68, 136, 1, 226, 177, 136, 1, 217, 114, 136, 1, 224, \r
+    140, 136, 1, 217, 42, 136, 1, 223, 103, 136, 1, 217, 13, 136, 1, 226, 94, \r
+    136, 1, 217, 92, 136, 1, 224, 26, 136, 1, 217, 21, 136, 1, 222, 155, 136, \r
+    1, 249, 207, 136, 1, 221, 205, 136, 1, 249, 15, 136, 1, 3, 221, 0, 136, \r
+    1, 221, 0, 136, 1, 247, 111, 136, 1, 222, 87, 136, 1, 249, 92, 136, 1, \r
+    101, 136, 1, 248, 167, 136, 1, 208, 136, 1, 232, 62, 136, 1, 231, 144, \r
+    136, 1, 232, 141, 136, 1, 231, 204, 136, 1, 155, 136, 1, 252, 237, 136, \r
+    1, 187, 136, 1, 243, 112, 136, 1, 252, 84, 136, 1, 229, 108, 136, 1, 242, \r
+    173, 136, 1, 251, 248, 136, 1, 228, 202, 136, 1, 243, 162, 136, 1, 252, \r
+    144, 136, 1, 229, 198, 136, 1, 243, 4, 136, 1, 252, 41, 136, 1, 229, 37, \r
+    136, 1, 196, 136, 1, 233, 196, 136, 1, 233, 99, 136, 1, 234, 25, 136, 1, \r
+    233, 136, 136, 1, 3, 184, 136, 1, 184, 136, 1, 3, 217, 200, 136, 1, 217, \r
+    200, 136, 1, 3, 217, 231, 136, 1, 217, 231, 136, 1, 203, 136, 1, 227, \r
+    147, 136, 1, 227, 22, 136, 1, 227, 216, 136, 1, 227, 75, 136, 1, 3, 219, \r
+    7, 136, 1, 219, 7, 136, 1, 218, 204, 136, 1, 218, 227, 136, 1, 218, 187, \r
+    136, 1, 207, 136, 1, 219, 56, 136, 1, 3, 175, 136, 1, 3, 236, 184, 36, \r
+    236, 202, 219, 70, 224, 9, 78, 36, 236, 202, 225, 72, 224, 9, 78, 236, \r
+    202, 219, 70, 224, 9, 78, 236, 202, 225, 72, 224, 9, 78, 136, 237, 138, \r
+    78, 136, 219, 70, 237, 138, 78, 136, 248, 234, 217, 213, 236, 202, 51, \r
+    242, 121, 52, 1, 3, 60, 52, 1, 60, 52, 1, 3, 72, 52, 1, 72, 52, 1, 3, 68, \r
+    52, 1, 68, 52, 1, 3, 73, 52, 1, 73, 52, 1, 3, 74, 52, 1, 74, 52, 1, 175, \r
+    52, 1, 245, 0, 52, 1, 236, 113, 52, 1, 244, 103, 52, 1, 236, 7, 52, 1, \r
+    244, 17, 52, 1, 236, 184, 52, 1, 244, 191, 52, 1, 236, 57, 52, 1, 244, \r
+    68, 52, 1, 226, 177, 52, 1, 217, 114, 52, 1, 224, 140, 52, 1, 217, 42, \r
+    52, 1, 223, 103, 52, 1, 217, 13, 52, 1, 226, 94, 52, 1, 217, 92, 52, 1, \r
+    224, 26, 52, 1, 217, 21, 52, 1, 222, 155, 52, 1, 249, 207, 52, 1, 221, \r
+    205, 52, 1, 249, 15, 52, 1, 3, 221, 0, 52, 1, 221, 0, 52, 1, 247, 111, \r
+    52, 1, 222, 87, 52, 1, 249, 92, 52, 1, 101, 52, 1, 248, 167, 52, 1, 208, \r
+    52, 1, 232, 62, 52, 1, 231, 144, 52, 1, 232, 141, 52, 1, 231, 204, 52, 1, \r
+    155, 52, 1, 252, 237, 52, 1, 187, 52, 1, 243, 112, 52, 1, 252, 84, 52, 1, \r
+    229, 108, 52, 1, 242, 173, 52, 1, 251, 248, 52, 1, 228, 202, 52, 1, 243, \r
+    162, 52, 1, 252, 144, 52, 1, 229, 198, 52, 1, 243, 4, 52, 1, 252, 41, 52, \r
+    1, 229, 37, 52, 1, 196, 52, 1, 233, 196, 52, 1, 233, 99, 52, 1, 234, 25, \r
+    52, 1, 233, 136, 52, 1, 3, 184, 52, 1, 184, 52, 1, 3, 217, 200, 52, 1, \r
+    217, 200, 52, 1, 3, 217, 231, 52, 1, 217, 231, 52, 1, 203, 52, 1, 227, \r
+    147, 52, 1, 227, 22, 52, 1, 227, 216, 52, 1, 227, 75, 52, 1, 3, 219, 7, \r
+    52, 1, 219, 7, 52, 1, 218, 204, 52, 1, 218, 227, 52, 1, 218, 187, 52, 1, \r
+    207, 52, 1, 219, 56, 52, 1, 3, 175, 52, 1, 3, 236, 184, 52, 1, 219, 189, \r
+    52, 1, 219, 94, 52, 1, 219, 165, 52, 1, 219, 72, 52, 233, 193, 248, 145, \r
+    236, 202, 228, 223, 224, 9, 78, 52, 237, 138, 78, 52, 219, 70, 237, 138, \r
+    78, 52, 248, 234, 236, 30, 200, 1, 253, 204, 200, 1, 230, 59, 200, 1, \r
+    189, 200, 1, 246, 74, 200, 1, 250, 46, 200, 1, 222, 201, 200, 1, 207, \r
+    200, 1, 153, 200, 1, 245, 67, 200, 1, 237, 17, 200, 1, 243, 225, 200, 1, \r
+    237, 126, 200, 1, 228, 163, 200, 1, 218, 151, 200, 1, 217, 81, 200, 1, \r
+    251, 70, 200, 1, 225, 27, 200, 1, 152, 200, 1, 217, 157, 200, 1, 251, \r
+    202, 200, 1, 198, 200, 1, 60, 200, 1, 74, 200, 1, 73, 200, 1, 246, 239, \r
+    200, 1, 254, 196, 200, 1, 246, 237, 200, 1, 253, 232, 200, 1, 230, 86, \r
+    200, 1, 254, 131, 200, 1, 246, 197, 200, 1, 254, 123, 200, 1, 246, 185, \r
+    200, 1, 246, 148, 200, 1, 72, 200, 1, 68, 200, 1, 237, 137, 200, 1, 216, \r
+    216, 200, 1, 232, 117, 200, 1, 244, 72, 200, 1, 238, 0, 22, 1, 236, 86, \r
+    22, 1, 223, 211, 22, 1, 236, 79, 22, 1, 232, 55, 22, 1, 232, 53, 22, 1, \r
+    232, 52, 22, 1, 221, 192, 22, 1, 223, 200, 22, 1, 227, 140, 22, 1, 227, \r
+    135, 22, 1, 227, 132, 22, 1, 227, 125, 22, 1, 227, 120, 22, 1, 227, 115, \r
+    22, 1, 227, 126, 22, 1, 227, 138, 22, 1, 233, 187, 22, 1, 229, 99, 22, 1, \r
+    223, 208, 22, 1, 229, 88, 22, 1, 224, 104, 22, 1, 223, 205, 22, 1, 238, \r
+    22, 22, 1, 250, 230, 22, 1, 223, 215, 22, 1, 251, 29, 22, 1, 236, 128, \r
+    22, 1, 222, 0, 22, 1, 229, 127, 22, 1, 243, 106, 22, 1, 60, 22, 1, 254, \r
+    234, 22, 1, 184, 22, 1, 218, 65, 22, 1, 246, 168, 22, 1, 73, 22, 1, 218, \r
+    16, 22, 1, 218, 25, 22, 1, 74, 22, 1, 219, 7, 22, 1, 219, 4, 22, 1, 230, \r
+    167, 22, 1, 217, 231, 22, 1, 68, 22, 1, 218, 219, 22, 1, 218, 227, 22, 1, \r
+    218, 204, 22, 1, 217, 200, 22, 1, 246, 115, 22, 1, 217, 250, 22, 1, 72, \r
+    22, 245, 185, 22, 1, 223, 209, 22, 1, 232, 45, 22, 1, 232, 47, 22, 1, \r
+    232, 50, 22, 1, 227, 133, 22, 1, 227, 114, 22, 1, 227, 122, 22, 1, 227, \r
+    127, 22, 1, 227, 112, 22, 1, 233, 180, 22, 1, 233, 177, 22, 1, 233, 181, \r
+    22, 1, 236, 220, 22, 1, 229, 94, 22, 1, 229, 80, 22, 1, 229, 86, 22, 1, \r
+    229, 83, 22, 1, 229, 97, 22, 1, 229, 81, 22, 1, 236, 218, 22, 1, 236, \r
+    216, 22, 1, 224, 97, 22, 1, 224, 95, 22, 1, 224, 87, 22, 1, 224, 92, 22, \r
+    1, 224, 102, 22, 1, 230, 1, 22, 1, 223, 212, 22, 1, 218, 6, 22, 1, 218, \r
+    2, 22, 1, 218, 3, 22, 1, 236, 219, 22, 1, 223, 213, 22, 1, 218, 12, 22, \r
+    1, 217, 225, 22, 1, 217, 224, 22, 1, 217, 227, 22, 1, 217, 191, 22, 1, \r
+    217, 192, 22, 1, 217, 195, 22, 1, 254, 60, 22, 1, 254, 54, 98, 254, 112, \r
+    235, 33, 78, 98, 254, 112, 227, 160, 78, 98, 254, 112, 131, 78, 98, 254, \r
+    112, 124, 78, 98, 254, 112, 148, 78, 98, 254, 112, 245, 116, 78, 98, 254, \r
+    112, 221, 120, 78, 98, 254, 112, 233, 193, 78, 98, 254, 112, 252, 29, 78, \r
+    98, 254, 112, 245, 178, 78, 98, 254, 112, 226, 90, 78, 98, 254, 112, 221, \r
+    252, 78, 98, 254, 112, 245, 110, 78, 98, 254, 112, 243, 152, 78, 98, 254, \r
+    112, 247, 9, 78, 98, 254, 112, 234, 87, 78, 200, 1, 251, 248, 200, 1, \r
+    217, 42, 200, 1, 237, 98, 200, 1, 244, 17, 200, 1, 246, 250, 200, 1, 246, \r
+    183, 200, 1, 230, 127, 200, 1, 230, 131, 200, 1, 237, 156, 200, 1, 254, \r
+    114, 200, 1, 237, 198, 200, 1, 220, 68, 200, 1, 237, 238, 200, 1, 232, \r
+    101, 200, 1, 254, 190, 200, 1, 253, 228, 200, 1, 254, 140, 200, 1, 230, \r
+    146, 200, 1, 230, 133, 200, 1, 237, 195, 200, 39, 1, 230, 59, 200, 39, 1, \r
+    222, 201, 200, 39, 1, 237, 17, 200, 39, 1, 243, 225, 9, 214, 222, 201, 9, \r
+    214, 218, 213, 9, 214, 218, 131, 9, 214, 251, 214, 9, 214, 223, 37, 9, \r
+    214, 242, 111, 9, 214, 242, 115, 9, 214, 242, 179, 9, 214, 242, 112, 9, \r
+    214, 222, 204, 9, 214, 242, 114, 9, 214, 242, 110, 9, 214, 242, 177, 9, \r
+    214, 242, 113, 9, 214, 242, 109, 9, 214, 207, 9, 214, 243, 225, 9, 214, \r
+    198, 9, 214, 230, 59, 9, 214, 224, 0, 9, 214, 250, 46, 9, 214, 242, 116, \r
+    9, 214, 243, 122, 9, 214, 222, 213, 9, 214, 223, 22, 9, 214, 223, 168, 9, \r
+    214, 225, 32, 9, 214, 229, 200, 9, 214, 228, 165, 9, 214, 221, 140, 9, \r
+    214, 222, 203, 9, 214, 223, 30, 9, 214, 242, 123, 9, 214, 242, 108, 9, \r
+    214, 229, 143, 9, 214, 228, 163, 52, 1, 3, 236, 7, 52, 1, 3, 224, 140, \r
+    52, 1, 3, 223, 103, 52, 1, 3, 101, 52, 1, 3, 231, 144, 52, 1, 3, 155, 52, \r
+    1, 3, 243, 112, 52, 1, 3, 242, 173, 52, 1, 3, 243, 162, 52, 1, 3, 243, 4, \r
+    52, 1, 3, 233, 99, 52, 1, 3, 203, 52, 1, 3, 227, 147, 52, 1, 3, 227, 22, \r
+    52, 1, 3, 227, 216, 52, 1, 3, 227, 75, 82, 22, 236, 86, 82, 22, 232, 55, \r
+    82, 22, 221, 192, 82, 22, 227, 140, 82, 22, 233, 187, 82, 22, 229, 99, \r
+    82, 22, 224, 104, 82, 22, 238, 22, 82, 22, 250, 230, 82, 22, 251, 29, 82, \r
+    22, 236, 128, 82, 22, 222, 0, 82, 22, 229, 127, 82, 22, 243, 106, 82, 22, \r
+    236, 87, 60, 82, 22, 232, 56, 60, 82, 22, 221, 193, 60, 82, 22, 227, 141, \r
+    60, 82, 22, 233, 188, 60, 82, 22, 229, 100, 60, 82, 22, 224, 105, 60, 82, \r
+    22, 238, 23, 60, 82, 22, 250, 231, 60, 82, 22, 251, 30, 60, 82, 22, 236, \r
+    129, 60, 82, 22, 222, 1, 60, 82, 22, 229, 128, 60, 82, 22, 243, 107, 60, \r
+    82, 22, 250, 231, 68, 82, 236, 34, 126, 230, 156, 82, 236, 34, 126, 142, \r
+    242, 173, 82, 138, 107, 82, 138, 103, 82, 138, 160, 82, 138, 154, 82, \r
+    138, 174, 82, 138, 182, 82, 138, 191, 82, 138, 185, 82, 138, 190, 82, \r
+    138, 222, 65, 82, 138, 233, 117, 82, 138, 245, 179, 82, 138, 218, 240, \r
+    82, 138, 218, 179, 82, 138, 233, 238, 82, 138, 247, 8, 82, 138, 223, 68, \r
+    82, 138, 223, 139, 82, 138, 243, 168, 82, 138, 224, 23, 82, 138, 232, \r
+    218, 82, 138, 223, 248, 82, 138, 245, 184, 82, 138, 250, 154, 82, 138, \r
+    235, 181, 82, 138, 227, 178, 82, 138, 251, 159, 82, 138, 223, 106, 82, \r
+    138, 223, 56, 82, 138, 246, 176, 82, 138, 227, 170, 82, 138, 254, 153, \r
+    82, 138, 245, 208, 82, 138, 227, 168, 82, 138, 225, 73, 82, 138, 227, \r
+    215, 34, 138, 228, 81, 34, 138, 236, 103, 34, 138, 226, 107, 34, 138, \r
+    236, 30, 34, 54, 222, 66, 230, 139, 84, 223, 227, 34, 54, 220, 220, 230, \r
+    139, 84, 223, 227, 34, 54, 221, 246, 230, 139, 84, 223, 227, 34, 54, 245, \r
+    120, 230, 139, 84, 223, 227, 34, 54, 245, 197, 230, 139, 84, 223, 227, \r
+    34, 54, 224, 70, 230, 139, 84, 223, 227, 34, 54, 225, 39, 230, 139, 84, \r
+    223, 227, 34, 54, 246, 228, 230, 139, 84, 223, 227, 229, 221, 55, 34, 54, \r
+    220, 220, 107, 34, 54, 220, 220, 103, 34, 54, 220, 220, 160, 34, 54, 220, \r
+    220, 154, 34, 54, 220, 220, 174, 34, 54, 220, 220, 182, 34, 54, 220, 220, \r
+    191, 34, 54, 220, 220, 185, 34, 54, 220, 220, 190, 34, 54, 221, 245, 34, \r
+    54, 221, 246, 107, 34, 54, 221, 246, 103, 34, 54, 221, 246, 160, 34, 54, \r
+    221, 246, 154, 34, 54, 221, 246, 174, 34, 22, 236, 86, 34, 22, 232, 55, \r
+    34, 22, 221, 192, 34, 22, 227, 140, 34, 22, 233, 187, 34, 22, 229, 99, \r
+    34, 22, 224, 104, 34, 22, 238, 22, 34, 22, 250, 230, 34, 22, 251, 29, 34, \r
+    22, 236, 128, 34, 22, 222, 0, 34, 22, 229, 127, 34, 22, 243, 106, 34, 22, \r
+    236, 87, 60, 34, 22, 232, 56, 60, 34, 22, 221, 193, 60, 34, 22, 227, 141, \r
+    60, 34, 22, 233, 188, 60, 34, 22, 229, 100, 60, 34, 22, 224, 105, 60, 34, \r
+    22, 238, 23, 60, 34, 22, 250, 231, 60, 34, 22, 251, 30, 60, 34, 22, 236, \r
+    129, 60, 34, 22, 222, 1, 60, 34, 22, 229, 128, 60, 34, 22, 243, 107, 60, \r
+    34, 236, 34, 126, 251, 61, 34, 236, 34, 126, 237, 40, 34, 22, 238, 23, \r
+    68, 236, 34, 223, 159, 100, 34, 138, 107, 34, 138, 103, 34, 138, 160, 34, \r
+    138, 154, 34, 138, 174, 34, 138, 182, 34, 138, 191, 34, 138, 185, 34, \r
+    138, 190, 34, 138, 222, 65, 34, 138, 233, 117, 34, 138, 245, 179, 34, \r
+    138, 218, 240, 34, 138, 218, 179, 34, 138, 233, 238, 34, 138, 247, 8, 34, \r
+    138, 223, 68, 34, 138, 223, 139, 34, 138, 243, 168, 34, 138, 224, 23, 34, \r
+    138, 232, 218, 34, 138, 223, 248, 34, 138, 245, 184, 34, 138, 250, 154, \r
+    34, 138, 235, 181, 34, 138, 226, 88, 34, 138, 234, 89, 34, 138, 245, 216, \r
+    34, 138, 223, 79, 34, 138, 246, 97, 34, 138, 228, 233, 34, 138, 253, 236, \r
+    34, 138, 237, 139, 34, 138, 227, 168, 34, 138, 250, 127, 34, 138, 250, \r
+    118, 34, 138, 243, 99, 34, 138, 251, 84, 34, 138, 234, 239, 34, 138, 235, \r
+    115, 34, 138, 227, 109, 34, 138, 234, 19, 34, 138, 227, 189, 34, 138, \r
+    223, 106, 34, 138, 223, 56, 34, 138, 246, 176, 34, 138, 227, 170, 34, \r
+    138, 254, 153, 34, 138, 232, 42, 34, 54, 221, 246, 182, 34, 54, 221, 246, \r
+    191, 34, 54, 221, 246, 185, 34, 54, 221, 246, 190, 34, 54, 245, 119, 34, \r
+    54, 245, 120, 107, 34, 54, 245, 120, 103, 34, 54, 245, 120, 160, 34, 54, \r
+    245, 120, 154, 34, 54, 245, 120, 174, 34, 54, 245, 120, 182, 34, 54, 245, \r
+    120, 191, 34, 54, 245, 120, 185, 34, 54, 245, 120, 190, 34, 54, 245, 196, \r
+    98, 183, 16, 35, 237, 119, 98, 183, 16, 35, 245, 227, 98, 183, 16, 35, \r
+    234, 69, 98, 183, 16, 35, 254, 71, 98, 183, 16, 35, 234, 45, 98, 183, 16, \r
+    35, 237, 38, 98, 183, 16, 35, 237, 39, 98, 183, 16, 35, 253, 229, 98, \r
+    183, 16, 35, 225, 53, 98, 183, 16, 35, 230, 170, 98, 183, 16, 35, 231, \r
+    175, 98, 183, 16, 35, 249, 87, 40, 243, 122, 40, 246, 144, 40, 246, 105, \r
+    235, 49, 235, 66, 55, 34, 52, 60, 34, 52, 72, 34, 52, 68, 34, 52, 73, 34, \r
+    52, 74, 34, 52, 175, 34, 52, 236, 113, 34, 52, 236, 7, 34, 52, 236, 184, \r
+    34, 52, 236, 57, 34, 52, 226, 177, 34, 52, 224, 140, 34, 52, 223, 103, \r
+    34, 52, 226, 94, 34, 52, 224, 26, 34, 52, 222, 155, 34, 52, 221, 205, 34, \r
+    52, 221, 0, 34, 52, 222, 87, 34, 52, 101, 34, 52, 208, 34, 52, 232, 62, \r
+    34, 52, 231, 144, 34, 52, 232, 141, 34, 52, 231, 204, 34, 52, 155, 34, \r
+    52, 243, 112, 34, 52, 242, 173, 34, 52, 243, 162, 34, 52, 243, 4, 34, 52, \r
+    196, 34, 52, 233, 196, 34, 52, 233, 99, 34, 52, 234, 25, 34, 52, 233, \r
+    136, 34, 52, 184, 34, 52, 217, 200, 34, 52, 217, 231, 34, 52, 203, 34, \r
+    52, 227, 147, 34, 52, 227, 22, 34, 52, 227, 216, 34, 52, 227, 75, 34, 52, \r
+    219, 7, 34, 52, 218, 204, 34, 52, 218, 227, 34, 52, 218, 187, 40, 254, \r
+    91, 40, 254, 15, 40, 254, 108, 40, 255, 16, 40, 237, 199, 40, 237, 172, \r
+    40, 220, 66, 40, 246, 124, 40, 246, 248, 40, 230, 130, 40, 230, 125, 40, \r
+    236, 242, 40, 236, 214, 40, 236, 212, 40, 244, 217, 40, 244, 225, 40, \r
+    244, 94, 40, 244, 90, 40, 235, 203, 40, 244, 84, 40, 236, 97, 40, 236, \r
+    96, 40, 236, 95, 40, 236, 94, 40, 243, 251, 40, 243, 250, 40, 235, 244, \r
+    40, 235, 246, 40, 236, 180, 40, 236, 32, 40, 236, 39, 40, 226, 162, 40, \r
+    226, 136, 40, 224, 85, 40, 225, 58, 40, 225, 57, 40, 249, 204, 40, 249, \r
+    45, 40, 248, 146, 40, 221, 134, 40, 232, 214, 40, 231, 176, 40, 243, 199, \r
+    40, 230, 40, 40, 230, 39, 40, 252, 235, 40, 229, 105, 40, 229, 74, 40, \r
+    229, 75, 40, 252, 65, 40, 242, 172, 40, 242, 168, 40, 251, 223, 40, 242, \r
+    155, 40, 243, 143, 40, 229, 150, 40, 229, 178, 40, 243, 129, 40, 229, \r
+    176, 40, 229, 189, 40, 252, 133, 40, 229, 27, 40, 252, 31, 40, 242, 249, \r
+    40, 229, 22, 40, 242, 245, 40, 242, 246, 40, 234, 98, 40, 234, 95, 40, \r
+    234, 102, 40, 234, 59, 40, 234, 80, 40, 233, 167, 40, 233, 149, 40, 233, \r
+    148, 40, 234, 9, 40, 234, 7, 40, 234, 10, 40, 218, 75, 40, 218, 73, 40, \r
+    217, 190, 40, 227, 86, 40, 227, 90, 40, 227, 3, 40, 226, 254, 40, 227, \r
+    188, 40, 227, 186, 40, 218, 239, 98, 183, 16, 35, 242, 184, 217, 84, 98, \r
+    183, 16, 35, 242, 184, 107, 98, 183, 16, 35, 242, 184, 103, 98, 183, 16, \r
+    35, 242, 184, 160, 98, 183, 16, 35, 242, 184, 154, 98, 183, 16, 35, 242, \r
+    184, 174, 98, 183, 16, 35, 242, 184, 182, 98, 183, 16, 35, 242, 184, 191, \r
+    98, 183, 16, 35, 242, 184, 185, 98, 183, 16, 35, 242, 184, 190, 98, 183, \r
+    16, 35, 242, 184, 222, 65, 98, 183, 16, 35, 242, 184, 246, 211, 98, 183, \r
+    16, 35, 242, 184, 220, 221, 98, 183, 16, 35, 242, 184, 221, 247, 98, 183, \r
+    16, 35, 242, 184, 245, 111, 98, 183, 16, 35, 242, 184, 245, 200, 98, 183, \r
+    16, 35, 242, 184, 224, 77, 98, 183, 16, 35, 242, 184, 225, 41, 98, 183, \r
+    16, 35, 242, 184, 246, 233, 98, 183, 16, 35, 242, 184, 232, 29, 98, 183, \r
+    16, 35, 242, 184, 220, 219, 98, 183, 16, 35, 242, 184, 220, 213, 98, 183, \r
+    16, 35, 242, 184, 220, 209, 98, 183, 16, 35, 242, 184, 220, 210, 98, 183, \r
+    16, 35, 242, 184, 220, 215, 40, 242, 178, 40, 249, 207, 40, 253, 232, 40, \r
+    135, 40, 230, 79, 40, 229, 201, 40, 248, 169, 40, 248, 170, 223, 226, 40, \r
+    248, 170, 250, 88, 40, 237, 137, 40, 246, 147, 232, 219, 243, 144, 40, \r
+    246, 147, 232, 219, 222, 221, 40, 246, 147, 232, 219, 222, 132, 40, 246, \r
+    147, 232, 219, 234, 6, 40, 250, 120, 40, 230, 44, 254, 133, 40, 208, 40, \r
+    233, 100, 60, 40, 196, 40, 175, 40, 236, 187, 40, 234, 41, 40, 244, 205, \r
+    40, 251, 161, 40, 236, 186, 40, 229, 144, 40, 232, 119, 40, 233, 100, \r
+    246, 74, 40, 233, 100, 245, 67, 40, 233, 230, 40, 236, 151, 40, 242, 116, \r
+    40, 236, 115, 40, 233, 198, 40, 244, 105, 40, 221, 207, 40, 233, 100, \r
+    153, 40, 233, 143, 40, 248, 177, 40, 236, 68, 40, 245, 141, 40, 231, 219, \r
+    40, 233, 100, 189, 40, 233, 140, 40, 250, 183, 40, 236, 62, 40, 233, 141, \r
+    223, 226, 40, 250, 184, 223, 226, 40, 234, 187, 223, 226, 40, 236, 63, \r
+    223, 226, 40, 233, 141, 250, 88, 40, 250, 184, 250, 88, 40, 234, 187, \r
+    250, 88, 40, 236, 63, 250, 88, 40, 234, 187, 104, 198, 40, 234, 187, 104, \r
+    226, 235, 223, 226, 40, 187, 40, 236, 26, 40, 233, 102, 40, 244, 48, 40, \r
+    227, 252, 40, 227, 253, 104, 198, 40, 227, 253, 104, 226, 235, 223, 226, \r
+    40, 228, 213, 40, 231, 148, 40, 233, 100, 198, 40, 233, 101, 40, 228, \r
+    183, 40, 231, 87, 40, 233, 100, 216, 216, 40, 233, 52, 40, 235, 237, 40, \r
+    233, 53, 234, 9, 40, 228, 182, 40, 231, 86, 40, 233, 100, 219, 40, 40, \r
+    233, 50, 40, 235, 235, 40, 233, 51, 234, 9, 40, 237, 18, 230, 159, 40, \r
+    234, 187, 230, 159, 40, 254, 140, 40, 252, 20, 40, 251, 115, 40, 251, \r
+    100, 40, 251, 203, 104, 236, 151, 40, 250, 182, 40, 249, 134, 40, 243, \r
+    237, 40, 155, 40, 242, 179, 40, 237, 223, 40, 236, 75, 40, 236, 63, 251, \r
+    142, 40, 236, 9, 40, 235, 15, 40, 235, 14, 40, 235, 8, 40, 234, 199, 40, \r
+    234, 42, 224, 43, 40, 233, 166, 40, 233, 129, 40, 229, 142, 40, 229, 40, \r
+    40, 229, 5, 40, 229, 3, 40, 223, 220, 40, 223, 41, 40, 218, 228, 40, 220, \r
+    11, 104, 189, 40, 112, 104, 189, 98, 183, 16, 35, 249, 137, 107, 98, 183, \r
+    16, 35, 249, 137, 103, 98, 183, 16, 35, 249, 137, 160, 98, 183, 16, 35, \r
+    249, 137, 154, 98, 183, 16, 35, 249, 137, 174, 98, 183, 16, 35, 249, 137, \r
+    182, 98, 183, 16, 35, 249, 137, 191, 98, 183, 16, 35, 249, 137, 185, 98, \r
+    183, 16, 35, 249, 137, 190, 98, 183, 16, 35, 249, 137, 222, 65, 98, 183, \r
+    16, 35, 249, 137, 246, 211, 98, 183, 16, 35, 249, 137, 220, 221, 98, 183, \r
+    16, 35, 249, 137, 221, 247, 98, 183, 16, 35, 249, 137, 245, 111, 98, 183, \r
+    16, 35, 249, 137, 245, 200, 98, 183, 16, 35, 249, 137, 224, 77, 98, 183, \r
+    16, 35, 249, 137, 225, 41, 98, 183, 16, 35, 249, 137, 246, 233, 98, 183, \r
+    16, 35, 249, 137, 232, 29, 98, 183, 16, 35, 249, 137, 220, 219, 98, 183, \r
+    16, 35, 249, 137, 220, 213, 98, 183, 16, 35, 249, 137, 220, 209, 98, 183, \r
+    16, 35, 249, 137, 220, 210, 98, 183, 16, 35, 249, 137, 220, 215, 98, 183, \r
+    16, 35, 249, 137, 220, 216, 98, 183, 16, 35, 249, 137, 220, 211, 98, 183, \r
+    16, 35, 249, 137, 220, 212, 98, 183, 16, 35, 249, 137, 220, 218, 98, 183, \r
+    16, 35, 249, 137, 220, 214, 98, 183, 16, 35, 249, 137, 221, 245, 98, 183, \r
+    16, 35, 249, 137, 221, 244, 40, 244, 240, 205, 35, 222, 23, 250, 108, \r
+    243, 151, 205, 35, 222, 23, 227, 213, 247, 8, 205, 35, 248, 244, 253, \r
+    245, 222, 23, 252, 130, 205, 35, 217, 211, 245, 137, 205, 35, 219, 1, \r
+    205, 35, 250, 155, 205, 35, 222, 23, 254, 30, 205, 35, 242, 253, 221, \r
+    136, 205, 35, 3, 222, 120, 205, 35, 221, 100, 205, 35, 229, 196, 205, 35, \r
+    223, 158, 205, 35, 245, 218, 205, 35, 244, 32, 229, 15, 205, 35, 233, \r
+    132, 205, 35, 246, 175, 205, 35, 245, 138, 205, 35, 218, 172, 230, 139, \r
+    222, 23, 249, 88, 205, 35, 254, 75, 205, 35, 250, 139, 205, 35, 252, 59, \r
+    221, 224, 205, 35, 244, 46, 205, 35, 223, 237, 254, 90, 205, 35, 227, \r
+    162, 205, 35, 237, 194, 205, 35, 244, 32, 222, 120, 205, 35, 233, 106, \r
+    250, 122, 205, 35, 244, 32, 228, 240, 205, 35, 222, 23, 255, 4, 218, 240, \r
+    205, 35, 222, 23, 250, 201, 245, 179, 205, 35, 237, 206, 205, 35, 247, \r
+    90, 205, 35, 227, 165, 205, 35, 244, 32, 229, 10, 205, 35, 228, 227, 205, \r
+    35, 249, 151, 117, 222, 23, 235, 58, 205, 35, 222, 23, 245, 246, 205, 35, \r
+    230, 109, 205, 35, 230, 173, 205, 35, 249, 66, 205, 35, 249, 84, 205, 35, \r
+    237, 217, 205, 35, 252, 11, 205, 35, 250, 170, 199, 234, 12, 205, 35, \r
+    244, 212, 221, 136, 205, 35, 228, 187, 220, 54, 205, 35, 230, 108, 205, \r
+    35, 222, 23, 218, 221, 205, 35, 227, 156, 205, 35, 222, 23, 251, 121, \r
+    205, 35, 222, 23, 254, 26, 221, 221, 205, 35, 222, 23, 236, 181, 223, \r
+    141, 233, 107, 205, 35, 249, 43, 205, 35, 222, 23, 234, 61, 234, 99, 205, \r
+    35, 255, 5, 205, 35, 222, 23, 218, 252, 205, 35, 222, 23, 244, 177, 218, \r
+    194, 205, 35, 222, 23, 237, 44, 235, 165, 205, 35, 248, 200, 205, 35, \r
+    235, 50, 205, 35, 237, 197, 221, 59, 205, 35, 3, 228, 240, 205, 35, 254, \r
+    210, 250, 162, 205, 35, 252, 132, 250, 162, 8, 4, 237, 140, 8, 4, 237, \r
+    134, 8, 4, 72, 8, 4, 237, 159, 8, 4, 238, 24, 8, 4, 238, 7, 8, 4, 238, \r
+    26, 8, 4, 238, 25, 8, 4, 253, 244, 8, 4, 253, 214, 8, 4, 60, 8, 4, 254, \r
+    92, 8, 4, 220, 64, 8, 4, 220, 67, 8, 4, 220, 65, 8, 4, 230, 92, 8, 4, \r
+    230, 68, 8, 4, 74, 8, 4, 230, 120, 8, 4, 246, 98, 8, 4, 73, 8, 4, 218, \r
+    165, 8, 4, 252, 60, 8, 4, 252, 57, 8, 4, 252, 84, 8, 4, 252, 68, 8, 4, \r
+    252, 78, 8, 4, 252, 77, 8, 4, 252, 80, 8, 4, 252, 79, 8, 4, 252, 184, 8, \r
+    4, 252, 180, 8, 4, 252, 237, 8, 4, 252, 202, 8, 4, 251, 231, 8, 4, 251, \r
+    235, 8, 4, 251, 232, 8, 4, 252, 30, 8, 4, 252, 21, 8, 4, 252, 41, 8, 4, \r
+    252, 32, 8, 4, 252, 97, 8, 4, 252, 144, 8, 4, 252, 109, 8, 4, 251, 221, \r
+    8, 4, 251, 219, 8, 4, 251, 248, 8, 4, 251, 230, 8, 4, 251, 224, 8, 4, \r
+    251, 228, 8, 4, 251, 207, 8, 4, 251, 206, 8, 4, 251, 212, 8, 4, 251, 210, \r
+    8, 4, 251, 208, 8, 4, 251, 209, 8, 4, 229, 64, 8, 4, 229, 60, 8, 4, 229, \r
+    108, 8, 4, 229, 70, 8, 4, 229, 79, 8, 4, 229, 103, 8, 4, 229, 101, 8, 4, \r
+    229, 215, 8, 4, 229, 206, 8, 4, 187, 8, 4, 229, 246, 8, 4, 228, 192, 8, \r
+    4, 228, 194, 8, 4, 228, 193, 8, 4, 229, 12, 8, 4, 229, 8, 8, 4, 229, 37, \r
+    8, 4, 229, 19, 8, 4, 228, 185, 8, 4, 228, 184, 8, 4, 228, 202, 8, 4, 228, \r
+    191, 8, 4, 228, 188, 8, 4, 228, 190, 8, 4, 228, 167, 8, 4, 228, 166, 8, \r
+    4, 228, 171, 8, 4, 228, 170, 8, 4, 228, 168, 8, 4, 228, 169, 8, 4, 252, \r
+    165, 8, 4, 252, 164, 8, 4, 252, 171, 8, 4, 252, 166, 8, 4, 252, 168, 8, \r
+    4, 252, 167, 8, 4, 252, 170, 8, 4, 252, 169, 8, 4, 252, 176, 8, 4, 252, \r
+    175, 8, 4, 252, 178, 8, 4, 252, 177, 8, 4, 252, 156, 8, 4, 252, 158, 8, \r
+    4, 252, 157, 8, 4, 252, 161, 8, 4, 252, 160, 8, 4, 252, 163, 8, 4, 252, \r
+    162, 8, 4, 252, 172, 8, 4, 252, 174, 8, 4, 252, 173, 8, 4, 252, 152, 8, \r
+    4, 252, 151, 8, 4, 252, 159, 8, 4, 252, 155, 8, 4, 252, 153, 8, 4, 252, \r
+    154, 8, 4, 252, 148, 8, 4, 252, 147, 8, 4, 252, 150, 8, 4, 252, 149, 8, \r
+    4, 232, 188, 8, 4, 232, 187, 8, 4, 232, 193, 8, 4, 232, 189, 8, 4, 232, \r
+    190, 8, 4, 232, 192, 8, 4, 232, 191, 8, 4, 232, 195, 8, 4, 232, 194, 8, \r
+    4, 232, 197, 8, 4, 232, 196, 8, 4, 232, 184, 8, 4, 232, 183, 8, 4, 232, \r
+    186, 8, 4, 232, 185, 8, 4, 232, 178, 8, 4, 232, 177, 8, 4, 232, 182, 8, \r
+    4, 232, 181, 8, 4, 232, 179, 8, 4, 232, 180, 8, 4, 232, 172, 8, 4, 232, \r
+    171, 8, 4, 232, 176, 8, 4, 232, 175, 8, 4, 232, 173, 8, 4, 232, 174, 8, \r
+    4, 243, 46, 8, 4, 243, 45, 8, 4, 243, 51, 8, 4, 243, 47, 8, 4, 243, 48, \r
+    8, 4, 243, 50, 8, 4, 243, 49, 8, 4, 243, 54, 8, 4, 243, 53, 8, 4, 243, \r
+    56, 8, 4, 243, 55, 8, 4, 243, 37, 8, 4, 243, 39, 8, 4, 243, 38, 8, 4, \r
+    243, 42, 8, 4, 243, 41, 8, 4, 243, 44, 8, 4, 243, 43, 8, 4, 243, 33, 8, \r
+    4, 243, 32, 8, 4, 243, 40, 8, 4, 243, 36, 8, 4, 243, 34, 8, 4, 243, 35, \r
+    8, 4, 243, 27, 8, 4, 243, 31, 8, 4, 243, 30, 8, 4, 243, 28, 8, 4, 243, \r
+    29, 8, 4, 233, 145, 8, 4, 233, 144, 8, 4, 233, 196, 8, 4, 233, 151, 8, 4, \r
+    233, 173, 8, 4, 233, 190, 8, 4, 233, 189, 8, 4, 234, 51, 8, 4, 234, 47, \r
+    8, 4, 196, 8, 4, 234, 78, 8, 4, 233, 75, 8, 4, 233, 74, 8, 4, 233, 77, 8, \r
+    4, 233, 76, 8, 4, 233, 111, 8, 4, 233, 103, 8, 4, 233, 136, 8, 4, 233, \r
+    115, 8, 4, 233, 232, 8, 4, 234, 25, 8, 4, 233, 57, 8, 4, 233, 54, 8, 4, \r
+    233, 99, 8, 4, 233, 71, 8, 4, 233, 64, 8, 4, 233, 69, 8, 4, 233, 36, 8, \r
+    4, 233, 35, 8, 4, 233, 41, 8, 4, 233, 38, 8, 4, 245, 172, 8, 4, 245, 168, \r
+    8, 4, 245, 203, 8, 4, 245, 180, 8, 4, 245, 240, 8, 4, 245, 234, 8, 4, \r
+    246, 8, 8, 4, 245, 242, 8, 4, 245, 109, 8, 4, 245, 139, 8, 4, 245, 130, \r
+    8, 4, 245, 80, 8, 4, 245, 79, 8, 4, 245, 92, 8, 4, 245, 85, 8, 4, 245, \r
+    83, 8, 4, 245, 84, 8, 4, 245, 70, 8, 4, 245, 69, 8, 4, 245, 73, 8, 4, \r
+    245, 71, 8, 4, 219, 74, 8, 4, 219, 73, 8, 4, 219, 94, 8, 4, 219, 83, 8, \r
+    4, 219, 89, 8, 4, 219, 87, 8, 4, 219, 91, 8, 4, 219, 90, 8, 4, 219, 172, \r
+    8, 4, 219, 168, 8, 4, 219, 189, 8, 4, 219, 182, 8, 4, 219, 62, 8, 4, 219, \r
+    58, 8, 4, 219, 72, 8, 4, 219, 63, 8, 4, 219, 95, 8, 4, 219, 156, 8, 4, \r
+    219, 51, 8, 4, 219, 50, 8, 4, 219, 56, 8, 4, 219, 54, 8, 4, 219, 52, 8, \r
+    4, 219, 53, 8, 4, 219, 44, 8, 4, 219, 43, 8, 4, 219, 48, 8, 4, 219, 47, \r
+    8, 4, 219, 45, 8, 4, 219, 46, 8, 4, 248, 197, 8, 4, 248, 185, 8, 4, 249, \r
+    15, 8, 4, 248, 216, 8, 4, 248, 249, 8, 4, 248, 253, 8, 4, 248, 252, 8, 4, \r
+    249, 143, 8, 4, 249, 138, 8, 4, 249, 207, 8, 4, 249, 162, 8, 4, 247, 95, \r
+    8, 4, 247, 96, 8, 4, 248, 145, 8, 4, 247, 128, 8, 4, 248, 167, 8, 4, 248, \r
+    147, 8, 4, 249, 41, 8, 4, 249, 92, 8, 4, 249, 53, 8, 4, 247, 88, 8, 4, \r
+    247, 86, 8, 4, 247, 111, 8, 4, 247, 94, 8, 4, 247, 89, 8, 4, 247, 92, 8, \r
+    4, 221, 161, 8, 4, 221, 157, 8, 4, 221, 205, 8, 4, 221, 169, 8, 4, 221, \r
+    198, 8, 4, 221, 200, 8, 4, 221, 199, 8, 4, 222, 110, 8, 4, 222, 97, 8, 4, \r
+    222, 155, 8, 4, 222, 115, 8, 4, 220, 244, 8, 4, 220, 243, 8, 4, 220, 246, \r
+    8, 4, 220, 245, 8, 4, 221, 113, 8, 4, 221, 110, 8, 4, 101, 8, 4, 221, \r
+    119, 8, 4, 222, 40, 8, 4, 222, 87, 8, 4, 222, 57, 8, 4, 220, 231, 8, 4, \r
+    220, 228, 8, 4, 221, 0, 8, 4, 220, 242, 8, 4, 220, 232, 8, 4, 220, 240, \r
+    8, 4, 249, 109, 8, 4, 249, 108, 8, 4, 249, 114, 8, 4, 249, 110, 8, 4, \r
+    249, 111, 8, 4, 249, 113, 8, 4, 249, 112, 8, 4, 249, 125, 8, 4, 249, 124, \r
+    8, 4, 249, 132, 8, 4, 249, 126, 8, 4, 249, 99, 8, 4, 249, 101, 8, 4, 249, \r
+    100, 8, 4, 249, 104, 8, 4, 249, 103, 8, 4, 249, 107, 8, 4, 249, 105, 8, \r
+    4, 249, 117, 8, 4, 249, 120, 8, 4, 249, 118, 8, 4, 249, 95, 8, 4, 249, \r
+    94, 8, 4, 249, 102, 8, 4, 249, 98, 8, 4, 249, 96, 8, 4, 249, 97, 8, 4, \r
+    232, 156, 8, 4, 232, 155, 8, 4, 232, 160, 8, 4, 232, 157, 8, 4, 232, 158, \r
+    8, 4, 232, 159, 8, 4, 232, 166, 8, 4, 232, 165, 8, 4, 232, 169, 8, 4, \r
+    232, 167, 8, 4, 232, 150, 8, 4, 232, 149, 8, 4, 232, 154, 8, 4, 232, 151, \r
+    8, 4, 232, 161, 8, 4, 232, 164, 8, 4, 232, 162, 8, 4, 232, 144, 8, 4, \r
+    232, 143, 8, 4, 232, 148, 8, 4, 232, 147, 8, 4, 232, 145, 8, 4, 232, 146, \r
+    8, 4, 243, 13, 8, 4, 243, 12, 8, 4, 243, 19, 8, 4, 243, 14, 8, 4, 243, \r
+    16, 8, 4, 243, 15, 8, 4, 243, 18, 8, 4, 243, 17, 8, 4, 243, 24, 8, 4, \r
+    243, 23, 8, 4, 243, 26, 8, 4, 243, 25, 8, 4, 243, 7, 8, 4, 243, 8, 8, 4, \r
+    243, 10, 8, 4, 243, 9, 8, 4, 243, 11, 8, 4, 243, 20, 8, 4, 243, 22, 8, 4, \r
+    243, 21, 8, 4, 243, 6, 8, 4, 232, 21, 8, 4, 232, 20, 8, 4, 232, 62, 8, 4, \r
+    232, 24, 8, 4, 232, 44, 8, 4, 232, 58, 8, 4, 232, 57, 8, 4, 232, 201, 8, \r
+    4, 208, 8, 4, 232, 212, 8, 4, 231, 95, 8, 4, 231, 97, 8, 4, 231, 96, 8, \r
+    4, 231, 184, 8, 4, 231, 173, 8, 4, 231, 204, 8, 4, 231, 191, 8, 4, 232, \r
+    121, 8, 4, 232, 141, 8, 4, 232, 130, 8, 4, 231, 91, 8, 4, 231, 88, 8, 4, \r
+    231, 144, 8, 4, 231, 94, 8, 4, 231, 92, 8, 4, 231, 93, 8, 4, 243, 77, 8, \r
+    4, 243, 76, 8, 4, 243, 82, 8, 4, 243, 78, 8, 4, 243, 79, 8, 4, 243, 81, \r
+    8, 4, 243, 80, 8, 4, 243, 87, 8, 4, 243, 86, 8, 4, 243, 89, 8, 4, 243, \r
+    88, 8, 4, 243, 69, 8, 4, 243, 71, 8, 4, 243, 70, 8, 4, 243, 73, 8, 4, \r
+    243, 75, 8, 4, 243, 74, 8, 4, 243, 83, 8, 4, 243, 85, 8, 4, 243, 84, 8, \r
+    4, 243, 65, 8, 4, 243, 64, 8, 4, 243, 72, 8, 4, 243, 68, 8, 4, 243, 66, \r
+    8, 4, 243, 67, 8, 4, 243, 59, 8, 4, 243, 58, 8, 4, 243, 63, 8, 4, 243, \r
+    62, 8, 4, 243, 60, 8, 4, 243, 61, 8, 4, 235, 27, 8, 4, 235, 22, 8, 4, \r
+    235, 67, 8, 4, 235, 32, 8, 4, 235, 61, 8, 4, 235, 60, 8, 4, 235, 63, 8, \r
+    4, 235, 62, 8, 4, 235, 141, 8, 4, 235, 133, 8, 4, 235, 188, 8, 4, 235, \r
+    147, 8, 4, 234, 214, 8, 4, 234, 213, 8, 4, 234, 216, 8, 4, 234, 215, 8, \r
+    4, 234, 242, 8, 4, 234, 236, 8, 4, 235, 12, 8, 4, 234, 245, 8, 4, 235, \r
+    82, 8, 4, 235, 122, 8, 4, 235, 89, 8, 4, 234, 209, 8, 4, 234, 208, 8, 4, \r
+    234, 231, 8, 4, 234, 212, 8, 4, 234, 210, 8, 4, 234, 211, 8, 4, 234, 191, \r
+    8, 4, 234, 190, 8, 4, 234, 198, 8, 4, 234, 194, 8, 4, 234, 192, 8, 4, \r
+    234, 193, 8, 4, 244, 80, 8, 4, 244, 79, 8, 4, 244, 103, 8, 4, 244, 89, 8, \r
+    4, 244, 96, 8, 4, 244, 95, 8, 4, 244, 98, 8, 4, 244, 97, 8, 4, 244, 214, \r
+    8, 4, 244, 209, 8, 4, 245, 0, 8, 4, 244, 223, 8, 4, 244, 0, 8, 4, 243, \r
+    255, 8, 4, 244, 2, 8, 4, 244, 1, 8, 4, 244, 51, 8, 4, 244, 49, 8, 4, 244, \r
+    68, 8, 4, 244, 59, 8, 4, 244, 164, 8, 4, 244, 162, 8, 4, 244, 191, 8, 4, \r
+    244, 174, 8, 4, 243, 246, 8, 4, 243, 245, 8, 4, 244, 17, 8, 4, 243, 254, \r
+    8, 4, 243, 247, 8, 4, 243, 253, 8, 4, 236, 89, 8, 4, 236, 88, 8, 4, 236, \r
+    113, 8, 4, 236, 99, 8, 4, 236, 107, 8, 4, 236, 109, 8, 4, 236, 108, 8, 4, \r
+    236, 203, 8, 4, 236, 192, 8, 4, 175, 8, 4, 236, 227, 8, 4, 235, 250, 8, \r
+    4, 235, 252, 8, 4, 235, 251, 8, 4, 236, 31, 8, 4, 236, 27, 8, 4, 236, 57, \r
+    8, 4, 236, 38, 8, 4, 236, 159, 8, 4, 236, 156, 8, 4, 236, 184, 8, 4, 236, \r
+    162, 8, 4, 235, 240, 8, 4, 235, 238, 8, 4, 236, 7, 8, 4, 235, 249, 8, 4, \r
+    235, 243, 8, 4, 235, 247, 8, 4, 244, 146, 8, 4, 244, 145, 8, 4, 244, 150, \r
+    8, 4, 244, 147, 8, 4, 244, 149, 8, 4, 244, 148, 8, 4, 244, 157, 8, 4, \r
+    244, 156, 8, 4, 244, 160, 8, 4, 244, 158, 8, 4, 244, 137, 8, 4, 244, 136, \r
+    8, 4, 244, 139, 8, 4, 244, 138, 8, 4, 244, 142, 8, 4, 244, 141, 8, 4, \r
+    244, 144, 8, 4, 244, 143, 8, 4, 244, 152, 8, 4, 244, 151, 8, 4, 244, 155, \r
+    8, 4, 244, 153, 8, 4, 244, 132, 8, 4, 244, 131, 8, 4, 244, 140, 8, 4, \r
+    244, 135, 8, 4, 244, 133, 8, 4, 244, 134, 8, 4, 233, 214, 8, 4, 233, 215, \r
+    8, 4, 233, 227, 8, 4, 233, 226, 8, 4, 233, 229, 8, 4, 233, 228, 8, 4, \r
+    233, 205, 8, 4, 233, 207, 8, 4, 233, 206, 8, 4, 233, 210, 8, 4, 233, 209, \r
+    8, 4, 233, 212, 8, 4, 233, 211, 8, 4, 233, 216, 8, 4, 233, 218, 8, 4, \r
+    233, 217, 8, 4, 233, 201, 8, 4, 233, 200, 8, 4, 233, 208, 8, 4, 233, 204, \r
+    8, 4, 233, 202, 8, 4, 233, 203, 8, 4, 242, 133, 8, 4, 242, 132, 8, 4, \r
+    242, 139, 8, 4, 242, 134, 8, 4, 242, 136, 8, 4, 242, 135, 8, 4, 242, 138, \r
+    8, 4, 242, 137, 8, 4, 242, 144, 8, 4, 242, 143, 8, 4, 242, 146, 8, 4, \r
+    242, 145, 8, 4, 242, 125, 8, 4, 242, 124, 8, 4, 242, 127, 8, 4, 242, 126, \r
+    8, 4, 242, 129, 8, 4, 242, 128, 8, 4, 242, 131, 8, 4, 242, 130, 8, 4, \r
+    242, 140, 8, 4, 242, 142, 8, 4, 242, 141, 8, 4, 232, 89, 8, 4, 232, 91, \r
+    8, 4, 232, 90, 8, 4, 232, 108, 8, 4, 232, 107, 8, 4, 232, 115, 8, 4, 232, \r
+    110, 8, 4, 232, 71, 8, 4, 232, 70, 8, 4, 232, 72, 8, 4, 232, 78, 8, 4, \r
+    232, 75, 8, 4, 232, 84, 8, 4, 232, 79, 8, 4, 232, 102, 8, 4, 232, 106, 8, \r
+    4, 232, 103, 8, 4, 243, 92, 8, 4, 243, 100, 8, 4, 243, 108, 8, 4, 243, \r
+    173, 8, 4, 243, 167, 8, 4, 155, 8, 4, 243, 183, 8, 4, 242, 157, 8, 4, \r
+    242, 156, 8, 4, 242, 159, 8, 4, 242, 158, 8, 4, 242, 186, 8, 4, 242, 181, \r
+    8, 4, 243, 4, 8, 4, 242, 244, 8, 4, 243, 125, 8, 4, 243, 162, 8, 4, 243, \r
+    135, 8, 4, 218, 243, 8, 4, 218, 231, 8, 4, 219, 7, 8, 4, 218, 251, 8, 4, \r
+    218, 157, 8, 4, 218, 159, 8, 4, 218, 158, 8, 4, 218, 170, 8, 4, 218, 187, \r
+    8, 4, 218, 175, 8, 4, 218, 214, 8, 4, 218, 227, 8, 4, 218, 218, 8, 4, \r
+    217, 28, 8, 4, 217, 27, 8, 4, 217, 42, 8, 4, 217, 30, 8, 4, 217, 35, 8, \r
+    4, 217, 37, 8, 4, 217, 36, 8, 4, 217, 100, 8, 4, 217, 97, 8, 4, 217, 114, \r
+    8, 4, 217, 103, 8, 4, 217, 6, 8, 4, 217, 8, 8, 4, 217, 7, 8, 4, 217, 17, \r
+    8, 4, 217, 16, 8, 4, 217, 21, 8, 4, 217, 18, 8, 4, 217, 82, 8, 4, 217, \r
+    92, 8, 4, 217, 86, 8, 4, 217, 2, 8, 4, 217, 1, 8, 4, 217, 13, 8, 4, 217, \r
+    5, 8, 4, 217, 3, 8, 4, 217, 4, 8, 4, 216, 249, 8, 4, 216, 248, 8, 4, 216, \r
+    254, 8, 4, 216, 252, 8, 4, 216, 250, 8, 4, 216, 251, 8, 4, 250, 215, 8, \r
+    4, 250, 212, 8, 4, 250, 235, 8, 4, 250, 223, 8, 4, 250, 232, 8, 4, 250, \r
+    226, 8, 4, 250, 234, 8, 4, 250, 233, 8, 4, 251, 124, 8, 4, 251, 118, 8, \r
+    4, 251, 169, 8, 4, 251, 143, 8, 4, 250, 84, 8, 4, 250, 86, 8, 4, 250, 85, \r
+    8, 4, 250, 116, 8, 4, 250, 109, 8, 4, 250, 182, 8, 4, 250, 129, 8, 4, \r
+    251, 71, 8, 4, 251, 99, 8, 4, 251, 75, 8, 4, 250, 68, 8, 4, 250, 67, 8, \r
+    4, 250, 92, 8, 4, 250, 82, 8, 4, 250, 71, 8, 4, 250, 81, 8, 4, 250, 49, \r
+    8, 4, 250, 48, 8, 4, 250, 58, 8, 4, 250, 55, 8, 4, 250, 50, 8, 4, 250, \r
+    52, 8, 4, 216, 232, 8, 4, 216, 231, 8, 4, 216, 238, 8, 4, 216, 233, 8, 4, \r
+    216, 235, 8, 4, 216, 234, 8, 4, 216, 237, 8, 4, 216, 236, 8, 4, 216, 244, \r
+    8, 4, 216, 243, 8, 4, 216, 247, 8, 4, 216, 245, 8, 4, 216, 228, 8, 4, \r
+    216, 230, 8, 4, 216, 229, 8, 4, 216, 239, 8, 4, 216, 242, 8, 4, 216, 240, \r
+    8, 4, 216, 223, 8, 4, 216, 227, 8, 4, 216, 226, 8, 4, 216, 224, 8, 4, \r
+    216, 225, 8, 4, 216, 218, 8, 4, 216, 217, 8, 4, 216, 222, 8, 4, 216, 221, \r
+    8, 4, 216, 219, 8, 4, 216, 220, 8, 4, 231, 31, 8, 4, 231, 30, 8, 4, 231, \r
+    36, 8, 4, 231, 32, 8, 4, 231, 33, 8, 4, 231, 35, 8, 4, 231, 34, 8, 4, \r
+    231, 40, 8, 4, 231, 39, 8, 4, 231, 42, 8, 4, 231, 41, 8, 4, 231, 25, 8, \r
+    4, 231, 26, 8, 4, 231, 28, 8, 4, 231, 29, 8, 4, 231, 37, 8, 4, 231, 38, \r
+    8, 4, 231, 21, 8, 4, 231, 27, 8, 4, 231, 24, 8, 4, 231, 22, 8, 4, 231, \r
+    23, 8, 4, 231, 16, 8, 4, 231, 15, 8, 4, 231, 20, 8, 4, 231, 19, 8, 4, \r
+    231, 17, 8, 4, 231, 18, 8, 4, 224, 84, 8, 4, 182, 8, 4, 224, 140, 8, 4, \r
+    224, 86, 8, 4, 224, 133, 8, 4, 224, 135, 8, 4, 224, 134, 8, 4, 226, 127, \r
+    8, 4, 226, 120, 8, 4, 226, 177, 8, 4, 226, 133, 8, 4, 223, 63, 8, 4, 223, \r
+    65, 8, 4, 223, 64, 8, 4, 224, 12, 8, 4, 224, 2, 8, 4, 224, 26, 8, 4, 224, \r
+    13, 8, 4, 225, 36, 8, 4, 226, 94, 8, 4, 225, 56, 8, 4, 223, 44, 8, 4, \r
+    223, 42, 8, 4, 223, 103, 8, 4, 223, 62, 8, 4, 223, 46, 8, 4, 223, 53, 8, \r
+    4, 222, 215, 8, 4, 222, 214, 8, 4, 223, 21, 8, 4, 222, 220, 8, 4, 222, \r
+    216, 8, 4, 222, 219, 8, 4, 223, 184, 8, 4, 223, 183, 8, 4, 223, 189, 8, \r
+    4, 223, 185, 8, 4, 223, 186, 8, 4, 223, 188, 8, 4, 223, 187, 8, 4, 223, \r
+    196, 8, 4, 223, 195, 8, 4, 223, 218, 8, 4, 223, 197, 8, 4, 223, 180, 8, \r
+    4, 223, 179, 8, 4, 223, 182, 8, 4, 223, 181, 8, 4, 223, 191, 8, 4, 223, \r
+    194, 8, 4, 223, 192, 8, 4, 223, 176, 8, 4, 223, 175, 8, 4, 223, 178, 8, \r
+    4, 223, 177, 8, 4, 223, 170, 8, 4, 223, 169, 8, 4, 223, 174, 8, 4, 223, \r
+    173, 8, 4, 223, 171, 8, 4, 223, 172, 8, 4, 217, 75, 8, 4, 217, 74, 8, 4, \r
+    217, 80, 8, 4, 217, 77, 8, 4, 217, 57, 8, 4, 217, 59, 8, 4, 217, 58, 8, \r
+    4, 217, 62, 8, 4, 217, 61, 8, 4, 217, 65, 8, 4, 217, 63, 8, 4, 217, 69, \r
+    8, 4, 217, 68, 8, 4, 217, 72, 8, 4, 217, 70, 8, 4, 217, 53, 8, 4, 217, \r
+    52, 8, 4, 217, 60, 8, 4, 217, 56, 8, 4, 217, 54, 8, 4, 217, 55, 8, 4, \r
+    217, 45, 8, 4, 217, 44, 8, 4, 217, 49, 8, 4, 217, 48, 8, 4, 217, 46, 8, \r
+    4, 217, 47, 8, 4, 251, 51, 8, 4, 251, 48, 8, 4, 251, 69, 8, 4, 251, 57, \r
+    8, 4, 250, 249, 8, 4, 250, 248, 8, 4, 250, 251, 8, 4, 250, 250, 8, 4, \r
+    251, 5, 8, 4, 251, 4, 8, 4, 251, 11, 8, 4, 251, 7, 8, 4, 251, 36, 8, 4, \r
+    251, 34, 8, 4, 251, 46, 8, 4, 251, 38, 8, 4, 250, 243, 8, 4, 250, 253, 8, \r
+    4, 250, 247, 8, 4, 250, 244, 8, 4, 250, 246, 8, 4, 250, 237, 8, 4, 250, \r
+    236, 8, 4, 250, 241, 8, 4, 250, 240, 8, 4, 250, 238, 8, 4, 250, 239, 8, \r
+    4, 227, 51, 8, 4, 227, 52, 8, 4, 227, 38, 8, 4, 227, 39, 8, 4, 227, 42, \r
+    8, 4, 227, 41, 8, 4, 227, 44, 8, 4, 227, 43, 8, 4, 227, 46, 8, 4, 227, \r
+    45, 8, 4, 227, 50, 8, 4, 227, 47, 8, 4, 227, 34, 8, 4, 227, 33, 8, 4, \r
+    227, 40, 8, 4, 227, 37, 8, 4, 227, 35, 8, 4, 227, 36, 8, 4, 227, 28, 8, \r
+    4, 227, 27, 8, 4, 227, 32, 8, 4, 227, 31, 8, 4, 227, 29, 8, 4, 227, 30, \r
+    8, 4, 231, 169, 8, 4, 231, 168, 8, 4, 231, 171, 8, 4, 231, 170, 8, 4, \r
+    231, 161, 8, 4, 231, 163, 8, 4, 231, 162, 8, 4, 231, 165, 8, 4, 231, 164, \r
+    8, 4, 231, 167, 8, 4, 231, 166, 8, 4, 231, 156, 8, 4, 231, 155, 8, 4, \r
+    231, 160, 8, 4, 231, 159, 8, 4, 231, 157, 8, 4, 231, 158, 8, 4, 231, 150, \r
+    8, 4, 231, 149, 8, 4, 231, 154, 8, 4, 231, 153, 8, 4, 231, 151, 8, 4, \r
+    231, 152, 8, 4, 224, 253, 8, 4, 224, 250, 8, 4, 225, 25, 8, 4, 225, 7, 8, \r
+    4, 224, 163, 8, 4, 224, 165, 8, 4, 224, 164, 8, 4, 224, 178, 8, 4, 224, \r
+    176, 8, 4, 224, 200, 8, 4, 224, 193, 8, 4, 224, 226, 8, 4, 224, 223, 8, \r
+    4, 224, 246, 8, 4, 224, 233, 8, 4, 224, 159, 8, 4, 224, 158, 8, 4, 224, \r
+    170, 8, 4, 224, 162, 8, 4, 224, 160, 8, 4, 224, 161, 8, 4, 224, 143, 8, \r
+    4, 224, 142, 8, 4, 224, 149, 8, 4, 224, 146, 8, 4, 224, 144, 8, 4, 224, \r
+    145, 8, 4, 227, 228, 8, 4, 227, 223, 8, 4, 203, 8, 4, 227, 233, 8, 4, \r
+    227, 6, 8, 4, 227, 8, 8, 4, 227, 7, 8, 4, 227, 60, 8, 4, 227, 54, 8, 4, \r
+    227, 75, 8, 4, 227, 63, 8, 4, 227, 155, 8, 4, 227, 216, 8, 4, 227, 185, \r
+    8, 4, 226, 255, 8, 4, 226, 253, 8, 4, 227, 22, 8, 4, 227, 5, 8, 4, 227, \r
+    1, 8, 4, 227, 2, 8, 4, 226, 238, 8, 4, 226, 237, 8, 4, 226, 243, 8, 4, \r
+    226, 241, 8, 4, 226, 239, 8, 4, 226, 240, 8, 4, 237, 89, 8, 4, 237, 88, \r
+    8, 4, 237, 98, 8, 4, 237, 90, 8, 4, 237, 94, 8, 4, 237, 93, 8, 4, 237, \r
+    96, 8, 4, 237, 95, 8, 4, 237, 34, 8, 4, 237, 33, 8, 4, 237, 36, 8, 4, \r
+    237, 35, 8, 4, 237, 47, 8, 4, 237, 46, 8, 4, 237, 59, 8, 4, 237, 49, 8, \r
+    4, 237, 28, 8, 4, 237, 26, 8, 4, 237, 43, 8, 4, 237, 32, 8, 4, 237, 29, \r
+    8, 4, 237, 30, 8, 4, 237, 20, 8, 4, 237, 19, 8, 4, 237, 24, 8, 4, 237, \r
+    23, 8, 4, 237, 21, 8, 4, 237, 22, 8, 4, 228, 114, 8, 4, 228, 112, 8, 4, \r
+    228, 121, 8, 4, 228, 115, 8, 4, 228, 118, 8, 4, 228, 117, 8, 4, 228, 120, \r
+    8, 4, 228, 119, 8, 4, 228, 70, 8, 4, 228, 67, 8, 4, 228, 72, 8, 4, 228, \r
+    71, 8, 4, 228, 101, 8, 4, 228, 100, 8, 4, 228, 110, 8, 4, 228, 104, 8, 4, \r
+    228, 62, 8, 4, 228, 58, 8, 4, 228, 98, 8, 4, 228, 66, 8, 4, 228, 64, 8, \r
+    4, 228, 65, 8, 4, 228, 42, 8, 4, 228, 40, 8, 4, 228, 52, 8, 4, 228, 45, \r
+    8, 4, 228, 43, 8, 4, 228, 44, 8, 4, 237, 78, 8, 4, 237, 77, 8, 4, 237, \r
+    84, 8, 4, 237, 79, 8, 4, 237, 81, 8, 4, 237, 80, 8, 4, 237, 83, 8, 4, \r
+    237, 82, 8, 4, 237, 69, 8, 4, 237, 71, 8, 4, 237, 70, 8, 4, 237, 74, 8, \r
+    4, 237, 73, 8, 4, 237, 76, 8, 4, 237, 75, 8, 4, 237, 65, 8, 4, 237, 64, \r
+    8, 4, 237, 72, 8, 4, 237, 68, 8, 4, 237, 66, 8, 4, 237, 67, 8, 4, 237, \r
+    61, 8, 4, 237, 60, 8, 4, 237, 63, 8, 4, 237, 62, 8, 4, 232, 7, 8, 4, 232, \r
+    6, 8, 4, 232, 13, 8, 4, 232, 8, 8, 4, 232, 10, 8, 4, 232, 9, 8, 4, 232, \r
+    12, 8, 4, 232, 11, 8, 4, 231, 253, 8, 4, 231, 254, 8, 4, 232, 2, 8, 4, \r
+    232, 1, 8, 4, 232, 5, 8, 4, 232, 3, 8, 4, 231, 249, 8, 4, 232, 0, 8, 4, \r
+    231, 252, 8, 4, 231, 250, 8, 4, 231, 251, 8, 4, 231, 244, 8, 4, 231, 243, \r
+    8, 4, 231, 248, 8, 4, 231, 247, 8, 4, 231, 245, 8, 4, 231, 246, 8, 4, \r
+    231, 59, 8, 4, 231, 58, 8, 4, 231, 67, 8, 4, 231, 61, 8, 4, 231, 64, 8, \r
+    4, 231, 63, 8, 4, 231, 66, 8, 4, 231, 65, 8, 4, 231, 47, 8, 4, 231, 49, \r
+    8, 4, 231, 48, 8, 4, 231, 52, 8, 4, 231, 51, 8, 4, 231, 56, 8, 4, 231, \r
+    53, 8, 4, 231, 45, 8, 4, 231, 44, 8, 4, 231, 50, 8, 4, 231, 46, 8, 4, \r
+    218, 123, 8, 4, 218, 122, 8, 4, 218, 130, 8, 4, 218, 125, 8, 4, 218, 127, \r
+    8, 4, 218, 126, 8, 4, 218, 129, 8, 4, 218, 128, 8, 4, 218, 112, 8, 4, \r
+    218, 113, 8, 4, 218, 117, 8, 4, 218, 116, 8, 4, 218, 121, 8, 4, 218, 119, \r
+    8, 4, 218, 94, 8, 4, 218, 92, 8, 4, 218, 104, 8, 4, 218, 97, 8, 4, 218, \r
+    95, 8, 4, 218, 96, 8, 4, 217, 237, 8, 4, 217, 235, 8, 4, 217, 250, 8, 4, \r
+    217, 238, 8, 4, 217, 245, 8, 4, 217, 244, 8, 4, 217, 247, 8, 4, 217, 246, \r
+    8, 4, 217, 185, 8, 4, 217, 184, 8, 4, 217, 187, 8, 4, 217, 186, 8, 4, \r
+    217, 212, 8, 4, 217, 209, 8, 4, 217, 231, 8, 4, 217, 215, 8, 4, 217, 177, \r
+    8, 4, 217, 175, 8, 4, 217, 200, 8, 4, 217, 183, 8, 4, 217, 180, 8, 4, \r
+    217, 181, 8, 4, 217, 160, 8, 4, 217, 159, 8, 4, 217, 166, 8, 4, 217, 163, \r
+    8, 4, 217, 161, 8, 4, 217, 162, 8, 32, 228, 101, 8, 32, 235, 67, 8, 32, \r
+    236, 89, 8, 32, 231, 61, 8, 32, 250, 55, 8, 32, 223, 189, 8, 32, 244, \r
+    143, 8, 32, 244, 174, 8, 32, 233, 196, 8, 32, 242, 133, 8, 32, 234, 193, \r
+    8, 32, 252, 152, 8, 32, 233, 115, 8, 32, 217, 231, 8, 32, 228, 185, 8, \r
+    32, 242, 127, 8, 32, 222, 110, 8, 32, 245, 0, 8, 32, 217, 5, 8, 32, 250, \r
+    49, 8, 32, 249, 97, 8, 32, 251, 228, 8, 32, 244, 139, 8, 32, 231, 53, 8, \r
+    32, 221, 0, 8, 32, 230, 120, 8, 32, 237, 65, 8, 32, 217, 17, 8, 32, 228, \r
+    167, 8, 32, 243, 44, 8, 32, 217, 237, 8, 32, 219, 53, 8, 32, 224, 149, 8, \r
+    32, 219, 156, 8, 32, 217, 114, 8, 32, 237, 59, 8, 32, 231, 24, 8, 32, \r
+    237, 63, 8, 32, 244, 51, 8, 32, 237, 83, 8, 32, 218, 187, 8, 32, 247, \r
+    111, 8, 32, 224, 161, 8, 32, 235, 63, 8, 32, 250, 58, 8, 32, 250, 85, 8, \r
+    32, 250, 223, 8, 32, 242, 130, 8, 32, 224, 253, 8, 32, 217, 4, 8, 32, \r
+    224, 193, 8, 32, 251, 46, 8, 32, 216, 235, 8, 32, 232, 192, 8, 32, 236, \r
+    184, 235, 28, 1, 252, 237, 235, 28, 1, 187, 235, 28, 1, 229, 141, 235, \r
+    28, 1, 249, 207, 235, 28, 1, 222, 155, 235, 28, 1, 222, 35, 235, 28, 1, \r
+    245, 0, 235, 28, 1, 175, 235, 28, 1, 236, 149, 235, 28, 1, 237, 123, 235, \r
+    28, 1, 251, 169, 235, 28, 1, 251, 69, 235, 28, 1, 247, 74, 235, 28, 1, \r
+    221, 55, 235, 28, 1, 221, 47, 235, 28, 1, 196, 235, 28, 1, 208, 235, 28, \r
+    1, 235, 188, 235, 28, 1, 226, 177, 235, 28, 1, 217, 80, 235, 28, 1, 217, \r
+    114, 235, 28, 1, 232, 115, 235, 28, 1, 155, 235, 28, 1, 218, 138, 235, \r
+    28, 1, 243, 121, 235, 28, 1, 246, 8, 235, 28, 1, 219, 7, 235, 28, 1, 225, \r
+    25, 235, 28, 1, 184, 235, 28, 1, 244, 125, 235, 28, 1, 60, 235, 28, 1, \r
+    254, 234, 235, 28, 1, 73, 235, 28, 1, 246, 115, 235, 28, 1, 72, 235, 28, \r
+    1, 74, 235, 28, 1, 68, 235, 28, 1, 220, 110, 235, 28, 1, 220, 105, 235, \r
+    28, 1, 230, 167, 235, 28, 1, 145, 233, 40, 221, 205, 235, 28, 1, 145, \r
+    232, 238, 229, 37, 235, 28, 1, 145, 233, 40, 250, 57, 235, 28, 1, 145, \r
+    233, 40, 252, 41, 235, 28, 1, 145, 233, 40, 208, 235, 28, 1, 145, 233, \r
+    40, 237, 104, 235, 28, 228, 197, 250, 168, 235, 28, 228, 197, 245, 90, \r
+    223, 136, 38, 4, 246, 250, 38, 4, 246, 247, 38, 4, 243, 148, 38, 4, 218, \r
+    224, 38, 4, 218, 223, 38, 4, 229, 191, 38, 4, 252, 91, 38, 4, 252, 137, \r
+    38, 4, 234, 34, 38, 4, 236, 23, 38, 4, 233, 223, 38, 4, 244, 201, 38, 4, \r
+    245, 226, 38, 4, 219, 160, 38, 4, 222, 80, 38, 4, 222, 21, 38, 4, 249, \r
+    28, 38, 4, 249, 25, 38, 4, 235, 118, 38, 4, 227, 200, 38, 4, 249, 82, 38, \r
+    4, 232, 163, 38, 4, 226, 84, 38, 4, 224, 244, 38, 4, 217, 90, 38, 4, 217, \r
+    71, 38, 4, 251, 91, 38, 4, 237, 113, 38, 4, 232, 14, 38, 4, 218, 22, 38, \r
+    4, 236, 183, 38, 4, 232, 98, 38, 4, 244, 184, 38, 4, 234, 16, 38, 4, 232, \r
+    139, 38, 4, 231, 72, 38, 4, 72, 38, 4, 237, 223, 38, 4, 243, 112, 38, 4, \r
+    243, 96, 38, 4, 218, 204, 38, 4, 218, 195, 38, 4, 229, 108, 38, 4, 252, \r
+    89, 38, 4, 252, 84, 38, 4, 234, 32, 38, 4, 236, 21, 38, 4, 233, 222, 38, \r
+    4, 244, 199, 38, 4, 245, 203, 38, 4, 219, 94, 38, 4, 221, 205, 38, 4, \r
+    222, 2, 38, 4, 249, 20, 38, 4, 249, 24, 38, 4, 235, 67, 38, 4, 227, 147, \r
+    38, 4, 249, 15, 38, 4, 232, 160, 38, 4, 224, 140, 38, 4, 224, 221, 38, 4, \r
+    217, 42, 38, 4, 217, 67, 38, 4, 250, 235, 38, 4, 237, 98, 38, 4, 232, 13, \r
+    38, 4, 217, 250, 38, 4, 236, 113, 38, 4, 232, 96, 38, 4, 244, 103, 38, 4, \r
+    233, 196, 38, 4, 232, 62, 38, 4, 231, 67, 38, 4, 60, 38, 4, 254, 131, 38, \r
+    4, 232, 111, 38, 4, 155, 38, 4, 243, 191, 38, 4, 219, 7, 38, 4, 218, 253, \r
+    38, 4, 187, 38, 4, 252, 94, 38, 4, 252, 237, 38, 4, 234, 37, 38, 4, 236, \r
+    26, 38, 4, 236, 25, 38, 4, 233, 225, 38, 4, 244, 204, 38, 4, 246, 8, 38, \r
+    4, 219, 189, 38, 4, 222, 155, 38, 4, 222, 35, 38, 4, 249, 36, 38, 4, 249, \r
+    27, 38, 4, 235, 188, 38, 4, 203, 38, 4, 249, 207, 38, 4, 232, 169, 38, 4, \r
+    226, 177, 38, 4, 225, 25, 38, 4, 217, 114, 38, 4, 217, 80, 38, 4, 251, \r
+    169, 38, 4, 237, 123, 38, 4, 232, 18, 38, 4, 184, 38, 4, 175, 38, 4, 236, \r
+    233, 38, 4, 232, 100, 38, 4, 245, 0, 38, 4, 196, 38, 4, 208, 38, 4, 231, \r
+    77, 38, 4, 230, 127, 38, 4, 230, 124, 38, 4, 242, 248, 38, 4, 218, 180, \r
+    38, 4, 218, 176, 38, 4, 229, 21, 38, 4, 252, 87, 38, 4, 252, 34, 38, 4, \r
+    234, 30, 38, 4, 236, 19, 38, 4, 233, 220, 38, 4, 244, 196, 38, 4, 245, \r
+    134, 38, 4, 219, 64, 38, 4, 221, 122, 38, 4, 221, 236, 38, 4, 249, 18, \r
+    38, 4, 249, 22, 38, 4, 234, 248, 38, 4, 227, 67, 38, 4, 248, 150, 38, 4, \r
+    232, 152, 38, 4, 224, 14, 38, 4, 224, 195, 38, 4, 217, 19, 38, 4, 217, \r
+    64, 38, 4, 250, 130, 38, 4, 237, 50, 38, 4, 232, 4, 38, 4, 217, 216, 38, \r
+    4, 236, 41, 38, 4, 232, 94, 38, 4, 244, 60, 38, 4, 233, 119, 38, 4, 231, \r
+    195, 38, 4, 231, 54, 38, 4, 68, 38, 4, 220, 87, 38, 4, 242, 173, 38, 4, \r
+    242, 163, 38, 4, 218, 165, 38, 4, 218, 161, 38, 4, 228, 202, 38, 4, 252, \r
+    86, 38, 4, 251, 248, 38, 4, 234, 29, 38, 4, 236, 18, 38, 4, 233, 219, 38, \r
+    4, 244, 195, 38, 4, 245, 92, 38, 4, 219, 56, 38, 4, 221, 0, 38, 4, 221, \r
+    223, 38, 4, 249, 16, 38, 4, 249, 21, 38, 4, 234, 231, 38, 4, 227, 22, 38, \r
+    4, 247, 111, 38, 4, 232, 148, 38, 4, 223, 103, 38, 4, 224, 170, 38, 4, \r
+    217, 13, 38, 4, 217, 60, 38, 4, 250, 92, 38, 4, 237, 43, 38, 4, 232, 0, \r
+    38, 4, 217, 200, 38, 4, 236, 7, 38, 4, 232, 93, 38, 4, 244, 17, 38, 4, \r
+    233, 99, 38, 4, 231, 144, 38, 4, 231, 50, 38, 4, 74, 38, 4, 230, 138, 38, \r
+    4, 232, 81, 38, 4, 243, 4, 38, 4, 242, 249, 38, 4, 218, 187, 38, 4, 218, \r
+    181, 38, 4, 229, 37, 38, 4, 252, 88, 38, 4, 252, 41, 38, 4, 234, 31, 38, \r
+    4, 236, 20, 38, 4, 233, 221, 38, 4, 244, 198, 38, 4, 244, 197, 38, 4, \r
+    245, 139, 38, 4, 219, 72, 38, 4, 101, 38, 4, 221, 239, 38, 4, 249, 19, \r
+    38, 4, 249, 23, 38, 4, 235, 12, 38, 4, 227, 75, 38, 4, 248, 167, 38, 4, \r
+    232, 154, 38, 4, 224, 26, 38, 4, 224, 200, 38, 4, 217, 21, 38, 4, 217, \r
+    65, 38, 4, 250, 182, 38, 4, 237, 59, 38, 4, 232, 5, 38, 4, 217, 231, 38, \r
+    4, 236, 57, 38, 4, 232, 95, 38, 4, 244, 68, 38, 4, 233, 136, 38, 4, 231, \r
+    204, 38, 4, 231, 56, 38, 4, 73, 38, 4, 246, 197, 38, 4, 232, 104, 38, 4, \r
+    243, 162, 38, 4, 243, 138, 38, 4, 218, 227, 38, 4, 218, 220, 38, 4, 229, \r
+    198, 38, 4, 252, 92, 38, 4, 252, 144, 38, 4, 234, 35, 38, 4, 236, 24, 38, \r
+    4, 236, 22, 38, 4, 233, 224, 38, 4, 244, 202, 38, 4, 244, 200, 38, 4, \r
+    245, 231, 38, 4, 219, 165, 38, 4, 222, 87, 38, 4, 222, 22, 38, 4, 249, \r
+    29, 38, 4, 249, 26, 38, 4, 235, 122, 38, 4, 227, 216, 38, 4, 249, 92, 38, \r
+    4, 232, 164, 38, 4, 226, 94, 38, 4, 224, 246, 38, 4, 217, 92, 38, 4, 217, \r
+    72, 38, 4, 251, 99, 38, 4, 237, 114, 38, 4, 232, 15, 38, 4, 218, 25, 38, \r
+    4, 236, 184, 38, 4, 232, 99, 38, 4, 232, 97, 38, 4, 244, 191, 38, 4, 244, \r
+    181, 38, 4, 234, 25, 38, 4, 232, 141, 38, 4, 231, 73, 38, 4, 232, 117, \r
+    38, 4, 235, 93, 38, 250, 168, 38, 245, 90, 223, 136, 38, 228, 82, 78, 38, \r
+    4, 232, 153, 246, 8, 38, 4, 232, 153, 175, 38, 4, 232, 153, 224, 14, 38, \r
+    16, 245, 223, 38, 16, 236, 182, 38, 16, 221, 174, 38, 16, 232, 38, 38, \r
+    16, 252, 205, 38, 16, 246, 7, 38, 16, 222, 152, 38, 16, 249, 165, 38, 16, \r
+    248, 149, 38, 16, 235, 253, 38, 16, 221, 125, 38, 16, 248, 166, 38, 16, \r
+    237, 51, 38, 20, 217, 84, 38, 20, 107, 38, 20, 103, 38, 20, 160, 38, 20, \r
+    154, 38, 20, 174, 38, 20, 182, 38, 20, 191, 38, 20, 185, 38, 20, 190, 38, \r
+    4, 232, 153, 196, 38, 4, 232, 153, 248, 167, 31, 6, 1, 217, 88, 31, 3, 1, \r
+    217, 88, 31, 6, 1, 247, 71, 31, 3, 1, 247, 71, 31, 6, 1, 210, 247, 73, \r
+    31, 3, 1, 210, 247, 73, 31, 6, 1, 237, 162, 31, 3, 1, 237, 162, 31, 6, 1, \r
+    248, 181, 31, 3, 1, 248, 181, 31, 6, 1, 233, 123, 220, 102, 31, 3, 1, \r
+    233, 123, 220, 102, 31, 6, 1, 252, 2, 230, 143, 31, 3, 1, 252, 2, 230, \r
+    143, 31, 6, 1, 232, 123, 218, 11, 31, 3, 1, 232, 123, 218, 11, 31, 6, 1, \r
+    218, 8, 2, 252, 234, 218, 11, 31, 3, 1, 218, 8, 2, 252, 234, 218, 11, 31, \r
+    6, 1, 237, 160, 218, 36, 31, 3, 1, 237, 160, 218, 36, 31, 6, 1, 210, 217, \r
+    200, 31, 3, 1, 210, 217, 200, 31, 6, 1, 237, 160, 60, 31, 3, 1, 237, 160, \r
+    60, 31, 6, 1, 250, 197, 235, 25, 217, 178, 31, 3, 1, 250, 197, 235, 25, \r
+    217, 178, 31, 6, 1, 252, 46, 217, 178, 31, 3, 1, 252, 46, 217, 178, 31, \r
+    6, 1, 237, 160, 250, 197, 235, 25, 217, 178, 31, 3, 1, 237, 160, 250, \r
+    197, 235, 25, 217, 178, 31, 6, 1, 217, 233, 31, 3, 1, 217, 233, 31, 6, 1, \r
+    224, 21, 249, 92, 31, 3, 1, 224, 21, 249, 92, 31, 6, 1, 224, 21, 246, \r
+    217, 31, 3, 1, 224, 21, 246, 217, 31, 6, 1, 224, 21, 246, 205, 31, 3, 1, \r
+    224, 21, 246, 205, 31, 6, 1, 233, 127, 74, 31, 3, 1, 233, 127, 74, 31, 6, \r
+    1, 252, 70, 74, 31, 3, 1, 252, 70, 74, 31, 6, 1, 51, 233, 127, 74, 31, 3, \r
+    1, 51, 233, 127, 74, 31, 1, 233, 86, 74, 36, 31, 219, 42, 36, 31, 222, \r
+    66, 233, 162, 55, 36, 31, 242, 162, 233, 162, 55, 36, 31, 221, 232, 233, \r
+    162, 55, 224, 53, 253, 251, 36, 31, 236, 194, 36, 31, 229, 203, 31, 236, \r
+    194, 31, 229, 203, 31, 6, 1, 247, 82, 31, 3, 1, 247, 82, 31, 6, 1, 247, \r
+    64, 31, 3, 1, 247, 64, 31, 6, 1, 217, 50, 31, 3, 1, 217, 50, 31, 6, 1, \r
+    251, 108, 31, 3, 1, 251, 108, 31, 6, 1, 247, 63, 31, 3, 1, 247, 63, 31, \r
+    6, 1, 222, 88, 2, 233, 193, 96, 31, 3, 1, 222, 88, 2, 233, 193, 96, 31, \r
+    6, 1, 220, 223, 31, 3, 1, 220, 223, 31, 6, 1, 221, 33, 31, 3, 1, 221, 33, \r
+    31, 6, 1, 221, 37, 31, 3, 1, 221, 37, 31, 6, 1, 222, 93, 31, 3, 1, 222, \r
+    93, 31, 6, 1, 242, 151, 31, 3, 1, 242, 151, 31, 6, 1, 224, 155, 31, 3, 1, \r
+    224, 155, 139, 1, 60, 139, 1, 175, 139, 1, 68, 139, 1, 236, 7, 139, 1, \r
+    246, 250, 139, 1, 227, 200, 139, 1, 222, 142, 139, 1, 74, 139, 1, 231, \r
+    67, 139, 1, 72, 139, 1, 235, 188, 139, 1, 187, 139, 1, 227, 98, 139, 1, \r
+    227, 143, 139, 1, 235, 117, 139, 1, 234, 15, 139, 1, 222, 152, 139, 1, \r
+    232, 168, 139, 1, 232, 17, 139, 1, 189, 139, 1, 223, 43, 139, 1, 233, 99, \r
+    139, 1, 224, 216, 139, 1, 224, 140, 139, 1, 224, 225, 139, 1, 225, 44, \r
+    139, 1, 235, 208, 139, 1, 236, 159, 139, 1, 231, 116, 139, 1, 231, 144, \r
+    139, 1, 231, 255, 139, 1, 217, 214, 139, 1, 224, 170, 139, 1, 217, 182, \r
+    139, 1, 184, 139, 1, 231, 147, 139, 1, 236, 157, 139, 1, 229, 145, 139, \r
+    1, 232, 14, 139, 1, 231, 146, 139, 1, 228, 199, 139, 1, 218, 164, 139, 1, \r
+    229, 191, 139, 1, 245, 226, 139, 1, 227, 22, 139, 1, 234, 231, 139, 1, \r
+    233, 196, 139, 1, 232, 62, 139, 1, 227, 161, 139, 1, 227, 249, 139, 1, \r
+    236, 168, 139, 1, 232, 86, 139, 1, 232, 100, 139, 1, 232, 115, 139, 1, \r
+    224, 200, 139, 1, 228, 200, 139, 1, 245, 92, 139, 1, 245, 136, 139, 1, \r
+    219, 7, 139, 1, 208, 139, 1, 235, 67, 139, 1, 229, 108, 139, 1, 234, 244, \r
+    139, 1, 236, 57, 139, 1, 234, 33, 139, 1, 227, 187, 139, 1, 233, 251, \r
+    139, 1, 196, 139, 1, 221, 205, 139, 1, 236, 113, 139, 1, 233, 136, 139, \r
+    1, 234, 36, 139, 1, 222, 50, 139, 1, 236, 26, 139, 1, 222, 65, 139, 1, \r
+    231, 145, 139, 1, 226, 147, 139, 1, 246, 4, 139, 1, 236, 28, 139, 1, 236, \r
+    54, 139, 36, 164, 236, 36, 139, 36, 164, 220, 250, 139, 232, 16, 139, \r
+    245, 90, 223, 136, 139, 250, 175, 139, 250, 168, 139, 225, 67, 139, 228, \r
+    82, 78, 58, 1, 251, 21, 145, 217, 241, 229, 72, 58, 1, 251, 21, 145, 218, \r
+    46, 229, 72, 58, 1, 251, 21, 145, 217, 241, 225, 8, 58, 1, 251, 21, 145, \r
+    218, 46, 225, 8, 58, 1, 251, 21, 145, 217, 241, 228, 98, 58, 1, 251, 21, \r
+    145, 218, 46, 228, 98, 58, 1, 251, 21, 145, 217, 241, 227, 22, 58, 1, \r
+    251, 21, 145, 218, 46, 227, 22, 58, 1, 246, 85, 247, 143, 145, 135, 58, \r
+    1, 116, 247, 143, 145, 135, 58, 1, 233, 194, 247, 143, 145, 135, 58, 1, \r
+    109, 247, 143, 145, 135, 58, 1, 246, 84, 247, 143, 145, 135, 58, 1, 246, \r
+    85, 247, 143, 235, 109, 145, 135, 58, 1, 116, 247, 143, 235, 109, 145, \r
+    135, 58, 1, 233, 194, 247, 143, 235, 109, 145, 135, 58, 1, 109, 247, 143, \r
+    235, 109, 145, 135, 58, 1, 246, 84, 247, 143, 235, 109, 145, 135, 58, 1, \r
+    246, 85, 235, 109, 145, 135, 58, 1, 116, 235, 109, 145, 135, 58, 1, 233, \r
+    194, 235, 109, 145, 135, 58, 1, 109, 235, 109, 145, 135, 58, 1, 246, 84, \r
+    235, 109, 145, 135, 58, 1, 61, 69, 135, 58, 1, 61, 224, 55, 58, 1, 61, \r
+    186, 135, 58, 1, 234, 237, 45, 250, 124, 254, 119, 58, 1, 227, 241, 108, \r
+    65, 58, 1, 227, 241, 113, 65, 58, 1, 227, 241, 246, 95, 78, 58, 1, 227, \r
+    241, 237, 170, 246, 95, 78, 58, 1, 109, 237, 170, 246, 95, 78, 58, 1, \r
+    223, 125, 25, 116, 221, 132, 58, 1, 223, 125, 25, 109, 221, 132, 7, 6, 1, \r
+    246, 241, 254, 168, 7, 3, 1, 246, 241, 254, 168, 7, 6, 1, 246, 241, 254, \r
+    191, 7, 3, 1, 246, 241, 254, 191, 7, 6, 1, 243, 136, 7, 3, 1, 243, 136, \r
+    7, 6, 1, 220, 189, 7, 3, 1, 220, 189, 7, 6, 1, 221, 94, 7, 3, 1, 221, 94, \r
+    7, 6, 1, 250, 90, 7, 3, 1, 250, 90, 7, 6, 1, 250, 91, 2, 250, 168, 7, 3, \r
+    1, 250, 91, 2, 250, 168, 7, 1, 3, 6, 246, 74, 7, 1, 3, 6, 198, 7, 6, 1, \r
+    255, 58, 7, 3, 1, 255, 58, 7, 6, 1, 254, 93, 7, 3, 1, 254, 93, 7, 6, 1, \r
+    253, 232, 7, 3, 1, 253, 232, 7, 6, 1, 253, 220, 7, 3, 1, 253, 220, 7, 6, \r
+    1, 253, 221, 2, 186, 135, 7, 3, 1, 253, 221, 2, 186, 135, 7, 6, 1, 253, \r
+    212, 7, 3, 1, 253, 212, 7, 6, 1, 210, 251, 203, 2, 248, 145, 7, 3, 1, \r
+    210, 251, 203, 2, 248, 145, 7, 6, 1, 237, 18, 2, 92, 7, 3, 1, 237, 18, 2, \r
+    92, 7, 6, 1, 237, 18, 2, 249, 11, 92, 7, 3, 1, 237, 18, 2, 249, 11, 92, \r
+    7, 6, 1, 237, 18, 2, 214, 25, 249, 11, 92, 7, 3, 1, 237, 18, 2, 214, 25, \r
+    249, 11, 92, 7, 6, 1, 252, 1, 153, 7, 3, 1, 252, 1, 153, 7, 6, 1, 235, \r
+    202, 2, 116, 92, 7, 3, 1, 235, 202, 2, 116, 92, 7, 6, 1, 142, 2, 171, \r
+    214, 230, 74, 7, 3, 1, 142, 2, 171, 214, 230, 74, 7, 6, 1, 142, 2, 234, \r
+    247, 7, 3, 1, 142, 2, 234, 247, 7, 6, 1, 230, 127, 7, 3, 1, 230, 127, 7, \r
+    6, 1, 230, 60, 2, 214, 221, 225, 249, 48, 7, 3, 1, 230, 60, 2, 214, 221, \r
+    225, 249, 48, 7, 6, 1, 230, 60, 2, 245, 146, 7, 3, 1, 230, 60, 2, 245, \r
+    146, 7, 6, 1, 230, 60, 2, 223, 222, 222, 135, 7, 3, 1, 230, 60, 2, 223, \r
+    222, 222, 135, 7, 6, 1, 228, 164, 2, 214, 221, 225, 249, 48, 7, 3, 1, \r
+    228, 164, 2, 214, 221, 225, 249, 48, 7, 6, 1, 228, 164, 2, 249, 11, 92, \r
+    7, 3, 1, 228, 164, 2, 249, 11, 92, 7, 6, 1, 228, 39, 227, 58, 7, 3, 1, \r
+    228, 39, 227, 58, 7, 6, 1, 227, 14, 227, 58, 7, 3, 1, 227, 14, 227, 58, \r
+    7, 6, 1, 220, 11, 2, 249, 11, 92, 7, 3, 1, 220, 11, 2, 249, 11, 92, 7, 6, \r
+    1, 219, 48, 7, 3, 1, 219, 48, 7, 6, 1, 219, 75, 217, 157, 7, 3, 1, 219, \r
+    75, 217, 157, 7, 6, 1, 221, 235, 2, 92, 7, 3, 1, 221, 235, 2, 92, 7, 6, \r
+    1, 221, 235, 2, 214, 221, 225, 249, 48, 7, 3, 1, 221, 235, 2, 214, 221, \r
+    225, 249, 48, 7, 6, 1, 219, 157, 7, 3, 1, 219, 157, 7, 6, 1, 246, 123, 7, \r
+    3, 1, 246, 123, 7, 6, 1, 237, 151, 7, 3, 1, 237, 151, 7, 6, 1, 250, 158, \r
+    7, 3, 1, 250, 158, 58, 1, 220, 34, 7, 3, 1, 247, 102, 7, 3, 1, 234, 219, \r
+    7, 3, 1, 233, 80, 7, 3, 1, 231, 109, 7, 3, 1, 227, 13, 7, 1, 3, 6, 227, \r
+    13, 7, 3, 1, 220, 249, 7, 3, 1, 220, 94, 7, 6, 1, 237, 188, 250, 46, 7, \r
+    3, 1, 237, 188, 250, 46, 7, 6, 1, 237, 188, 246, 74, 7, 3, 1, 237, 188, \r
+    246, 74, 7, 6, 1, 237, 188, 245, 67, 7, 6, 1, 215, 237, 188, 245, 67, 7, \r
+    3, 1, 215, 237, 188, 245, 67, 7, 6, 1, 215, 153, 7, 3, 1, 215, 153, 7, 6, \r
+    1, 237, 188, 152, 7, 3, 1, 237, 188, 152, 7, 6, 1, 237, 188, 198, 7, 3, \r
+    1, 237, 188, 198, 7, 6, 1, 237, 188, 222, 201, 7, 3, 1, 237, 188, 222, \r
+    201, 58, 1, 109, 250, 217, 255, 0, 58, 1, 250, 175, 58, 1, 224, 192, 246, \r
+    154, 55, 7, 6, 1, 226, 150, 7, 3, 1, 226, 150, 7, 246, 158, 1, 210, 246, \r
+    74, 7, 246, 158, 1, 210, 230, 59, 7, 246, 158, 1, 237, 170, 189, 7, 246, \r
+    158, 1, 242, 107, 234, 250, 7, 246, 158, 1, 254, 49, 189, 223, 19, 232, \r
+    225, 1, 60, 223, 19, 232, 225, 1, 72, 223, 19, 232, 225, 5, 247, 84, 223, \r
+    19, 232, 225, 1, 68, 223, 19, 232, 225, 1, 73, 223, 19, 232, 225, 1, 74, \r
+    223, 19, 232, 225, 5, 243, 175, 223, 19, 232, 225, 1, 236, 57, 223, 19, \r
+    232, 225, 1, 236, 125, 223, 19, 232, 225, 1, 244, 68, 223, 19, 232, 225, \r
+    1, 244, 112, 223, 19, 232, 225, 5, 254, 95, 223, 19, 232, 225, 1, 250, \r
+    182, 223, 19, 232, 225, 1, 251, 11, 223, 19, 232, 225, 1, 237, 59, 223, \r
+    19, 232, 225, 1, 237, 99, 223, 19, 232, 225, 1, 221, 11, 223, 19, 232, \r
+    225, 1, 221, 15, 223, 19, 232, 225, 1, 249, 107, 223, 19, 232, 225, 1, \r
+    249, 115, 223, 19, 232, 225, 1, 101, 223, 19, 232, 225, 1, 221, 239, 223, \r
+    19, 232, 225, 1, 248, 167, 223, 19, 232, 225, 1, 249, 19, 223, 19, 232, \r
+    225, 1, 231, 204, 223, 19, 232, 225, 1, 229, 37, 223, 19, 232, 225, 1, \r
+    229, 118, 223, 19, 232, 225, 1, 252, 41, 223, 19, 232, 225, 1, 252, 88, \r
+    223, 19, 232, 225, 1, 233, 136, 223, 19, 232, 225, 1, 227, 75, 223, 19, \r
+    232, 225, 1, 235, 12, 223, 19, 232, 225, 1, 227, 44, 223, 19, 232, 225, \r
+    1, 224, 26, 223, 19, 232, 225, 1, 243, 4, 223, 19, 232, 225, 29, 5, 60, \r
+    223, 19, 232, 225, 29, 5, 72, 223, 19, 232, 225, 29, 5, 68, 223, 19, 232, \r
+    225, 29, 5, 73, 223, 19, 232, 225, 29, 5, 230, 127, 223, 19, 232, 225, \r
+    229, 33, 234, 67, 223, 19, 232, 225, 229, 33, 234, 66, 223, 19, 232, 225, \r
+    229, 33, 234, 65, 223, 19, 232, 225, 229, 33, 234, 64, 231, 187, 237, \r
+    212, 245, 108, 131, 228, 89, 231, 187, 237, 212, 245, 108, 131, 243, 194, \r
+    231, 187, 237, 212, 245, 108, 148, 228, 87, 231, 187, 237, 212, 245, 108, \r
+    131, 224, 75, 231, 187, 237, 212, 245, 108, 131, 246, 231, 231, 187, 237, \r
+    212, 245, 108, 148, 224, 74, 231, 187, 237, 212, 228, 90, 78, 231, 187, \r
+    237, 212, 229, 56, 78, 231, 187, 237, 212, 227, 4, 78, 231, 187, 237, \r
+    212, 228, 91, 78, 229, 138, 1, 175, 229, 138, 1, 236, 149, 229, 138, 1, \r
+    245, 0, 229, 138, 1, 232, 115, 229, 138, 1, 251, 169, 229, 138, 1, 251, \r
+    69, 229, 138, 1, 237, 123, 229, 138, 1, 231, 77, 229, 138, 1, 222, 155, \r
+    229, 138, 1, 222, 35, 229, 138, 1, 249, 207, 229, 138, 1, 208, 229, 138, \r
+    1, 187, 229, 138, 1, 229, 141, 229, 138, 1, 252, 237, 229, 138, 1, 196, \r
+    229, 138, 1, 221, 55, 229, 138, 1, 221, 47, 229, 138, 1, 247, 74, 229, \r
+    138, 1, 219, 7, 229, 138, 1, 217, 80, 229, 138, 1, 217, 114, 229, 138, 1, \r
+    3, 60, 229, 138, 1, 184, 229, 138, 1, 203, 229, 138, 1, 235, 188, 229, \r
+    138, 1, 225, 25, 229, 138, 1, 226, 177, 229, 138, 1, 155, 229, 138, 1, \r
+    60, 229, 138, 1, 72, 229, 138, 1, 68, 229, 138, 1, 73, 229, 138, 1, 74, \r
+    229, 138, 1, 228, 155, 229, 138, 1, 218, 138, 229, 138, 1, 246, 8, 229, \r
+    138, 1, 244, 160, 229, 138, 1, 246, 250, 229, 138, 223, 97, 1, 219, 7, \r
+    229, 138, 223, 97, 1, 184, 229, 138, 1, 221, 29, 229, 138, 1, 221, 19, \r
+    229, 138, 1, 249, 132, 229, 138, 1, 231, 217, 229, 138, 1, 254, 144, 184, \r
+    229, 138, 1, 219, 69, 225, 25, 229, 138, 1, 219, 70, 155, 229, 138, 1, \r
+    254, 1, 246, 8, 229, 138, 223, 97, 1, 203, 229, 138, 223, 61, 1, 203, \r
+    229, 138, 1, 251, 146, 229, 138, 224, 109, 243, 160, 78, 229, 138, 51, \r
+    243, 160, 78, 229, 138, 164, 225, 18, 229, 138, 164, 51, 225, 18, 158, 5, \r
+    254, 95, 158, 5, 219, 77, 158, 1, 60, 158, 1, 255, 58, 158, 1, 72, 158, \r
+    1, 237, 255, 158, 1, 68, 158, 1, 220, 23, 158, 1, 167, 152, 158, 1, 167, \r
+    227, 53, 158, 1, 167, 153, 158, 1, 167, 235, 18, 158, 1, 73, 158, 1, 246, \r
+    250, 158, 1, 254, 196, 158, 1, 74, 158, 1, 230, 127, 158, 1, 253, 232, \r
+    158, 1, 175, 158, 1, 236, 149, 158, 1, 245, 0, 158, 1, 244, 125, 158, 1, \r
+    232, 115, 158, 1, 251, 169, 158, 1, 251, 69, 158, 1, 237, 123, 158, 1, \r
+    237, 103, 158, 1, 231, 77, 158, 1, 221, 29, 158, 1, 221, 19, 158, 1, 249, \r
+    132, 158, 1, 249, 116, 158, 1, 231, 217, 158, 1, 222, 155, 158, 1, 222, \r
+    35, 158, 1, 249, 207, 158, 1, 249, 36, 158, 1, 208, 158, 1, 187, 158, 1, \r
+    229, 141, 158, 1, 252, 237, 158, 1, 252, 94, 158, 1, 196, 158, 1, 184, \r
+    158, 1, 203, 158, 1, 235, 188, 158, 1, 219, 189, 158, 1, 225, 25, 158, 1, \r
+    223, 218, 158, 1, 226, 177, 158, 1, 155, 158, 1, 235, 17, 158, 250, 147, \r
+    5, 243, 209, 158, 29, 5, 255, 58, 158, 29, 5, 72, 158, 29, 5, 237, 255, \r
+    158, 29, 5, 68, 158, 29, 5, 220, 23, 158, 29, 5, 167, 152, 158, 29, 5, \r
+    167, 227, 53, 158, 29, 5, 167, 153, 158, 29, 5, 167, 235, 18, 158, 29, 5, \r
+    73, 158, 29, 5, 246, 250, 158, 29, 5, 254, 196, 158, 29, 5, 74, 158, 29, \r
+    5, 230, 127, 158, 29, 5, 253, 232, 158, 5, 219, 82, 158, 249, 167, 158, \r
+    51, 249, 167, 158, 20, 217, 84, 158, 20, 107, 158, 20, 103, 158, 20, 160, \r
+    158, 20, 154, 158, 20, 174, 158, 20, 182, 158, 20, 191, 158, 20, 185, \r
+    158, 20, 190, 36, 80, 20, 217, 84, 36, 80, 20, 107, 36, 80, 20, 103, 36, \r
+    80, 20, 160, 36, 80, 20, 154, 36, 80, 20, 174, 36, 80, 20, 182, 36, 80, \r
+    20, 191, 36, 80, 20, 185, 36, 80, 20, 190, 36, 80, 1, 60, 36, 80, 1, 68, \r
+    36, 80, 1, 175, 36, 80, 1, 208, 36, 80, 1, 187, 36, 80, 1, 203, 36, 80, \r
+    1, 219, 94, 36, 80, 5, 253, 219, 80, 5, 223, 253, 251, 146, 80, 5, 251, \r
+    147, 219, 82, 80, 5, 51, 251, 147, 219, 82, 80, 5, 251, 147, 103, 80, 5, \r
+    251, 147, 160, 80, 5, 251, 147, 253, 219, 80, 5, 228, 186, 80, 244, 224, \r
+    245, 185, 80, 251, 134, 80, 243, 155, 236, 190, 235, 68, 20, 217, 84, \r
+    236, 190, 235, 68, 20, 107, 236, 190, 235, 68, 20, 103, 236, 190, 235, \r
+    68, 20, 160, 236, 190, 235, 68, 20, 154, 236, 190, 235, 68, 20, 174, 236, \r
+    190, 235, 68, 20, 182, 236, 190, 235, 68, 20, 191, 236, 190, 235, 68, 20, \r
+    185, 236, 190, 235, 68, 20, 190, 236, 190, 235, 68, 1, 175, 236, 190, \r
+    235, 68, 1, 236, 149, 236, 190, 235, 68, 1, 245, 0, 236, 190, 235, 68, 1, \r
+    232, 115, 236, 190, 235, 68, 1, 226, 177, 236, 190, 235, 68, 1, 225, 25, \r
+    236, 190, 235, 68, 1, 217, 114, 236, 190, 235, 68, 1, 231, 77, 236, 190, \r
+    235, 68, 1, 222, 155, 236, 190, 235, 68, 1, 242, 175, 236, 190, 235, 68, \r
+    1, 208, 236, 190, 235, 68, 1, 187, 236, 190, 235, 68, 1, 229, 141, 236, \r
+    190, 235, 68, 1, 196, 236, 190, 235, 68, 1, 249, 207, 236, 190, 235, 68, \r
+    1, 252, 237, 236, 190, 235, 68, 1, 203, 236, 190, 235, 68, 1, 184, 236, \r
+    190, 235, 68, 1, 235, 188, 236, 190, 235, 68, 1, 219, 7, 236, 190, 235, \r
+    68, 1, 222, 35, 236, 190, 235, 68, 1, 155, 236, 190, 235, 68, 1, 219, \r
+    189, 236, 190, 235, 68, 1, 251, 169, 236, 190, 235, 68, 1, 60, 236, 190, \r
+    235, 68, 1, 230, 167, 236, 190, 235, 68, 1, 72, 236, 190, 235, 68, 1, \r
+    230, 127, 236, 190, 235, 68, 29, 220, 110, 236, 190, 235, 68, 29, 73, \r
+    236, 190, 235, 68, 29, 68, 236, 190, 235, 68, 29, 246, 250, 236, 190, \r
+    235, 68, 29, 74, 236, 190, 235, 68, 145, 229, 48, 236, 190, 235, 68, 145, \r
+    251, 157, 236, 190, 235, 68, 145, 251, 158, 229, 48, 236, 190, 235, 68, \r
+    5, 250, 62, 236, 190, 235, 68, 5, 224, 148, 227, 194, 1, 175, 227, 194, \r
+    1, 245, 0, 227, 194, 1, 232, 115, 227, 194, 1, 222, 155, 227, 194, 1, \r
+    249, 207, 227, 194, 1, 208, 227, 194, 1, 187, 227, 194, 1, 252, 237, 227, \r
+    194, 1, 196, 227, 194, 1, 251, 169, 227, 194, 1, 237, 123, 227, 194, 1, \r
+    231, 77, 227, 194, 1, 226, 177, 227, 194, 1, 203, 227, 194, 1, 235, 188, \r
+    227, 194, 1, 184, 227, 194, 1, 219, 7, 227, 194, 1, 155, 227, 194, 1, \r
+    234, 37, 227, 194, 1, 232, 100, 227, 194, 1, 232, 169, 227, 194, 1, 231, \r
+    57, 227, 194, 1, 60, 227, 194, 29, 5, 72, 227, 194, 29, 5, 68, 227, 194, \r
+    29, 5, 73, 227, 194, 29, 5, 254, 196, 227, 194, 29, 5, 74, 227, 194, 29, \r
+    5, 253, 232, 227, 194, 29, 5, 246, 115, 227, 194, 29, 5, 247, 16, 227, \r
+    194, 250, 147, 5, 232, 117, 227, 194, 250, 147, 5, 207, 227, 194, 250, \r
+    147, 5, 152, 227, 194, 250, 147, 5, 243, 225, 227, 194, 219, 82, 227, \r
+    194, 226, 87, 78, 22, 91, 221, 188, 22, 91, 221, 187, 22, 91, 221, 185, \r
+    22, 91, 221, 190, 22, 91, 227, 135, 22, 91, 227, 119, 22, 91, 227, 114, \r
+    22, 91, 227, 116, 22, 91, 227, 132, 22, 91, 227, 125, 22, 91, 227, 118, \r
+    22, 91, 227, 137, 22, 91, 227, 120, 22, 91, 227, 139, 22, 91, 227, 136, \r
+    22, 91, 233, 183, 22, 91, 233, 174, 22, 91, 233, 177, 22, 91, 229, 84, \r
+    22, 91, 229, 95, 22, 91, 229, 96, 22, 91, 223, 203, 22, 91, 238, 12, 22, \r
+    91, 238, 19, 22, 91, 223, 214, 22, 91, 223, 201, 22, 91, 229, 126, 22, \r
+    91, 243, 101, 22, 91, 223, 198, 133, 5, 229, 252, 133, 5, 251, 96, 133, \r
+    5, 235, 130, 133, 5, 218, 197, 133, 1, 60, 133, 1, 242, 107, 236, 193, \r
+    133, 1, 72, 133, 1, 237, 255, 133, 1, 68, 133, 1, 230, 44, 251, 73, 133, \r
+    1, 232, 116, 235, 98, 133, 1, 232, 116, 235, 99, 227, 229, 133, 1, 73, \r
+    133, 1, 254, 196, 133, 1, 74, 133, 1, 175, 133, 1, 206, 226, 128, 133, 1, \r
+    206, 233, 67, 133, 1, 245, 0, 133, 1, 245, 1, 233, 67, 133, 1, 232, 115, \r
+    133, 1, 251, 169, 133, 1, 251, 170, 233, 67, 133, 1, 237, 123, 133, 1, \r
+    231, 78, 233, 67, 133, 1, 237, 124, 234, 103, 133, 1, 231, 77, 133, 1, \r
+    221, 29, 133, 1, 221, 30, 234, 103, 133, 1, 249, 132, 133, 1, 249, 133, \r
+    234, 103, 133, 1, 232, 238, 233, 67, 133, 1, 222, 155, 133, 1, 222, 156, \r
+    233, 67, 133, 1, 249, 207, 133, 1, 249, 208, 234, 103, 133, 1, 208, 133, \r
+    1, 187, 133, 1, 230, 44, 233, 67, 133, 1, 252, 237, 133, 1, 252, 238, \r
+    233, 67, 133, 1, 196, 133, 1, 184, 133, 1, 203, 133, 1, 228, 3, 254, 203, \r
+    133, 1, 235, 188, 133, 1, 219, 7, 133, 1, 226, 178, 233, 67, 133, 1, 226, \r
+    178, 234, 103, 133, 1, 226, 177, 133, 1, 155, 133, 5, 251, 97, 222, 68, \r
+    133, 29, 5, 222, 111, 133, 29, 5, 221, 135, 133, 29, 5, 218, 162, 133, \r
+    29, 5, 218, 163, 234, 5, 133, 29, 5, 223, 77, 133, 29, 5, 223, 78, 233, \r
+    250, 133, 29, 5, 222, 124, 133, 29, 5, 248, 207, 233, 66, 133, 29, 5, \r
+    229, 171, 133, 250, 147, 5, 236, 161, 133, 250, 147, 5, 229, 179, 133, \r
+    250, 147, 5, 251, 162, 133, 230, 6, 133, 42, 227, 176, 133, 45, 227, 176, \r
+    133, 230, 36, 254, 125, 133, 230, 36, 234, 107, 133, 230, 36, 234, 223, \r
+    133, 230, 36, 218, 193, 133, 230, 36, 230, 7, 133, 230, 36, 235, 35, 133, \r
+    230, 36, 234, 217, 133, 230, 36, 254, 239, 133, 230, 36, 254, 240, 254, \r
+    239, 133, 230, 36, 229, 65, 133, 215, 230, 36, 229, 65, 133, 230, 4, 133, \r
+    20, 217, 84, 133, 20, 107, 133, 20, 103, 133, 20, 160, 133, 20, 154, 133, \r
+    20, 174, 133, 20, 182, 133, 20, 191, 133, 20, 185, 133, 20, 190, 133, \r
+    230, 36, 221, 163, 220, 248, 133, 230, 36, 237, 147, 149, 1, 60, 149, 1, \r
+    72, 149, 1, 68, 149, 1, 73, 149, 1, 254, 196, 149, 1, 74, 149, 1, 175, \r
+    149, 1, 236, 149, 149, 1, 245, 0, 149, 1, 244, 125, 149, 1, 232, 73, 149, \r
+    1, 232, 115, 149, 1, 251, 69, 149, 1, 251, 33, 149, 1, 237, 123, 149, 1, \r
+    237, 103, 149, 1, 232, 64, 149, 1, 232, 66, 149, 1, 232, 65, 149, 1, 222, \r
+    155, 149, 1, 222, 35, 149, 1, 249, 207, 149, 1, 249, 36, 149, 1, 231, \r
+    114, 149, 1, 208, 149, 1, 249, 132, 149, 1, 187, 149, 1, 229, 6, 149, 1, \r
+    229, 141, 149, 1, 252, 237, 149, 1, 252, 94, 149, 1, 233, 94, 149, 1, \r
+    196, 149, 1, 252, 178, 149, 1, 184, 149, 1, 203, 149, 1, 235, 188, 149, \r
+    1, 219, 189, 149, 1, 223, 218, 149, 1, 226, 177, 149, 1, 155, 149, 29, 5, \r
+    255, 58, 149, 29, 5, 72, 149, 29, 5, 237, 255, 149, 29, 5, 246, 237, 149, \r
+    29, 5, 68, 149, 29, 5, 230, 167, 149, 29, 5, 74, 149, 29, 5, 254, 196, \r
+    149, 29, 5, 253, 232, 149, 29, 5, 220, 110, 149, 250, 147, 5, 184, 149, \r
+    250, 147, 5, 203, 149, 250, 147, 5, 235, 188, 149, 250, 147, 5, 219, 7, \r
+    149, 1, 39, 237, 17, 149, 1, 39, 245, 67, 149, 1, 39, 232, 117, 149, 250, \r
+    147, 5, 39, 232, 117, 149, 1, 39, 251, 70, 149, 1, 39, 222, 201, 149, 1, \r
+    39, 207, 149, 1, 39, 230, 59, 149, 1, 39, 218, 90, 149, 1, 39, 152, 149, \r
+    1, 39, 153, 149, 1, 39, 223, 219, 149, 250, 147, 5, 39, 189, 149, 250, \r
+    147, 5, 39, 243, 225, 149, 20, 217, 84, 149, 20, 107, 149, 20, 103, 149, \r
+    20, 160, 149, 20, 154, 149, 20, 174, 149, 20, 182, 149, 20, 191, 149, 20, \r
+    185, 149, 20, 190, 149, 228, 197, 223, 242, 149, 228, 197, 249, 167, 149, \r
+    228, 197, 51, 249, 167, 149, 228, 197, 221, 78, 249, 167, 63, 1, 236, \r
+    143, 245, 0, 63, 1, 236, 143, 251, 169, 63, 1, 236, 143, 251, 69, 63, 1, \r
+    236, 143, 237, 123, 63, 1, 236, 143, 237, 103, 63, 1, 236, 143, 231, 77, \r
+    63, 1, 236, 143, 221, 29, 63, 1, 236, 143, 221, 19, 63, 1, 236, 143, 249, \r
+    132, 63, 1, 236, 143, 249, 116, 63, 1, 236, 143, 249, 36, 63, 1, 236, \r
+    143, 208, 63, 1, 236, 143, 226, 177, 63, 1, 236, 143, 155, 63, 1, 236, \r
+    143, 243, 121, 63, 1, 236, 143, 246, 8, 63, 58, 1, 236, 143, 227, 201, \r
+    63, 1, 236, 143, 218, 138, 63, 1, 236, 143, 217, 114, 63, 1, 236, 143, \r
+    203, 63, 235, 6, 236, 143, 230, 182, 63, 235, 6, 236, 143, 228, 111, 63, \r
+    235, 6, 236, 143, 243, 57, 63, 16, 254, 186, 246, 94, 63, 16, 254, 186, \r
+    107, 63, 16, 254, 186, 103, 63, 1, 254, 186, 203, 63, 5, 229, 248, 236, \r
+    213, 221, 132, 37, 177, 1, 109, 236, 57, 37, 177, 1, 116, 236, 57, 37, \r
+    177, 1, 109, 236, 125, 37, 177, 1, 116, 236, 125, 37, 177, 1, 109, 236, \r
+    132, 37, 177, 1, 116, 236, 132, 37, 177, 1, 109, 244, 68, 37, 177, 1, \r
+    116, 244, 68, 37, 177, 1, 109, 232, 84, 37, 177, 1, 116, 232, 84, 37, \r
+    177, 1, 109, 250, 182, 37, 177, 1, 116, 250, 182, 37, 177, 1, 109, 251, \r
+    11, 37, 177, 1, 116, 251, 11, 37, 177, 1, 109, 224, 26, 37, 177, 1, 116, \r
+    224, 26, 37, 177, 1, 109, 231, 56, 37, 177, 1, 116, 231, 56, 37, 177, 1, \r
+    109, 248, 167, 37, 177, 1, 116, 248, 167, 37, 177, 1, 109, 101, 37, 177, \r
+    1, 116, 101, 37, 177, 1, 109, 221, 239, 37, 177, 1, 116, 221, 239, 37, \r
+    177, 1, 109, 231, 204, 37, 177, 1, 116, 231, 204, 37, 177, 1, 109, 252, \r
+    41, 37, 177, 1, 116, 252, 41, 37, 177, 1, 109, 229, 37, 37, 177, 1, 116, \r
+    229, 37, 37, 177, 1, 109, 229, 118, 37, 177, 1, 116, 229, 118, 37, 177, \r
+    1, 109, 245, 139, 37, 177, 1, 116, 245, 139, 37, 177, 1, 109, 233, 136, \r
+    37, 177, 1, 116, 233, 136, 37, 177, 1, 109, 217, 231, 37, 177, 1, 116, \r
+    217, 231, 37, 177, 1, 109, 227, 75, 37, 177, 1, 116, 227, 75, 37, 177, 1, \r
+    109, 235, 12, 37, 177, 1, 116, 235, 12, 37, 177, 1, 109, 219, 72, 37, \r
+    177, 1, 116, 219, 72, 37, 177, 1, 109, 243, 4, 37, 177, 1, 116, 243, 4, \r
+    37, 177, 1, 109, 74, 37, 177, 1, 116, 74, 37, 177, 234, 100, 236, 229, \r
+    37, 177, 29, 255, 58, 37, 177, 29, 72, 37, 177, 29, 220, 110, 37, 177, \r
+    29, 68, 37, 177, 29, 73, 37, 177, 29, 74, 37, 177, 234, 100, 236, 127, \r
+    37, 177, 29, 242, 72, 37, 177, 29, 220, 109, 37, 177, 29, 220, 123, 37, \r
+    177, 29, 253, 231, 37, 177, 29, 253, 212, 37, 177, 29, 254, 131, 37, 177, \r
+    29, 254, 140, 37, 177, 145, 234, 100, 246, 223, 37, 177, 145, 234, 100, \r
+    231, 113, 37, 177, 145, 234, 100, 221, 239, 37, 177, 145, 234, 100, 224, \r
+    15, 37, 177, 16, 236, 44, 37, 177, 16, 231, 113, 37, 177, 16, 226, 148, \r
+    37, 177, 16, 243, 5, 243, 1, 37, 177, 16, 236, 52, 236, 51, 234, 11, 234, \r
+    43, 1, 236, 49, 234, 11, 234, 43, 1, 226, 148, 234, 11, 234, 43, 1, 235, \r
+    167, 234, 11, 234, 43, 1, 233, 145, 234, 11, 234, 43, 1, 187, 234, 11, \r
+    234, 43, 1, 208, 234, 11, 234, 43, 1, 251, 25, 234, 11, 234, 43, 1, 221, \r
+    181, 234, 11, 234, 43, 1, 236, 121, 234, 11, 234, 43, 1, 232, 76, 234, \r
+    11, 234, 43, 1, 221, 233, 234, 11, 234, 43, 1, 219, 2, 234, 11, 234, 43, \r
+    1, 218, 45, 234, 11, 234, 43, 1, 242, 167, 234, 11, 234, 43, 1, 220, 87, \r
+    234, 11, 234, 43, 1, 72, 234, 11, 234, 43, 1, 229, 136, 234, 11, 234, 43, \r
+    1, 253, 241, 234, 11, 234, 43, 1, 244, 63, 234, 11, 234, 43, 1, 237, 102, \r
+    234, 11, 234, 43, 1, 227, 246, 234, 11, 234, 43, 1, 252, 237, 234, 11, \r
+    234, 43, 1, 237, 91, 234, 11, 234, 43, 1, 248, 232, 234, 11, 234, 43, 1, \r
+    244, 110, 234, 11, 234, 43, 1, 249, 17, 234, 11, 234, 43, 1, 252, 93, \r
+    234, 11, 234, 43, 1, 236, 50, 234, 249, 234, 11, 234, 43, 1, 235, 168, \r
+    234, 249, 234, 11, 234, 43, 1, 233, 146, 234, 249, 234, 11, 234, 43, 1, \r
+    230, 44, 234, 249, 234, 11, 234, 43, 1, 232, 238, 234, 249, 234, 11, 234, \r
+    43, 1, 221, 182, 234, 249, 234, 11, 234, 43, 1, 232, 77, 234, 249, 234, \r
+    11, 234, 43, 1, 242, 107, 234, 249, 234, 11, 234, 43, 29, 5, 230, 137, \r
+    234, 11, 234, 43, 29, 5, 237, 221, 234, 11, 234, 43, 29, 5, 254, 130, \r
+    234, 11, 234, 43, 29, 5, 218, 18, 234, 11, 234, 43, 29, 5, 224, 10, 234, \r
+    11, 234, 43, 29, 5, 220, 85, 234, 11, 234, 43, 29, 5, 251, 40, 234, 11, \r
+    234, 43, 29, 5, 231, 100, 234, 11, 234, 43, 251, 41, 234, 11, 234, 43, \r
+    234, 220, 237, 131, 234, 11, 234, 43, 254, 70, 237, 131, 234, 11, 234, \r
+    43, 20, 217, 84, 234, 11, 234, 43, 20, 107, 234, 11, 234, 43, 20, 103, \r
+    234, 11, 234, 43, 20, 160, 234, 11, 234, 43, 20, 154, 234, 11, 234, 43, \r
+    20, 174, 234, 11, 234, 43, 20, 182, 234, 11, 234, 43, 20, 191, 234, 11, \r
+    234, 43, 20, 185, 234, 11, 234, 43, 20, 190, 22, 122, 231, 6, 22, 122, \r
+    231, 11, 22, 122, 217, 230, 22, 122, 217, 229, 22, 122, 217, 228, 22, \r
+    122, 220, 173, 22, 122, 220, 176, 22, 122, 217, 198, 22, 122, 217, 194, \r
+    22, 122, 246, 114, 22, 122, 246, 112, 22, 122, 246, 113, 22, 122, 246, \r
+    110, 22, 122, 242, 97, 22, 122, 242, 96, 22, 122, 242, 94, 22, 122, 242, \r
+    95, 22, 122, 242, 100, 22, 122, 242, 93, 22, 122, 242, 92, 22, 122, 242, \r
+    102, 22, 122, 254, 59, 22, 122, 254, 58, 22, 85, 232, 48, 22, 85, 232, \r
+    54, 22, 85, 223, 200, 22, 85, 223, 199, 22, 85, 221, 187, 22, 85, 221, \r
+    185, 22, 85, 221, 184, 22, 85, 221, 190, 22, 85, 221, 191, 22, 85, 221, \r
+    183, 22, 85, 227, 119, 22, 85, 227, 134, 22, 85, 223, 206, 22, 85, 227, \r
+    131, 22, 85, 227, 121, 22, 85, 227, 123, 22, 85, 227, 110, 22, 85, 227, \r
+    111, 22, 85, 236, 217, 22, 85, 233, 182, 22, 85, 233, 176, 22, 85, 223, \r
+    210, 22, 85, 233, 179, 22, 85, 233, 185, 22, 85, 229, 80, 22, 85, 229, \r
+    89, 22, 85, 229, 93, 22, 85, 223, 208, 22, 85, 229, 83, 22, 85, 229, 97, \r
+    22, 85, 229, 98, 22, 85, 224, 96, 22, 85, 224, 99, 22, 85, 223, 204, 22, \r
+    85, 223, 202, 22, 85, 224, 94, 22, 85, 224, 102, 22, 85, 224, 103, 22, \r
+    85, 224, 88, 22, 85, 224, 101, 22, 85, 229, 255, 22, 85, 230, 0, 22, 85, \r
+    218, 4, 22, 85, 218, 5, 22, 85, 250, 228, 22, 85, 250, 227, 22, 85, 223, \r
+    215, 22, 85, 229, 124, 22, 85, 229, 123, 9, 13, 239, 244, 9, 13, 239, \r
+    243, 9, 13, 239, 242, 9, 13, 239, 241, 9, 13, 239, 240, 9, 13, 239, 239, \r
+    9, 13, 239, 238, 9, 13, 239, 237, 9, 13, 239, 236, 9, 13, 239, 235, 9, \r
+    13, 239, 234, 9, 13, 239, 233, 9, 13, 239, 232, 9, 13, 239, 231, 9, 13, \r
+    239, 230, 9, 13, 239, 229, 9, 13, 239, 228, 9, 13, 239, 227, 9, 13, 239, \r
+    226, 9, 13, 239, 225, 9, 13, 239, 224, 9, 13, 239, 223, 9, 13, 239, 222, \r
+    9, 13, 239, 221, 9, 13, 239, 220, 9, 13, 239, 219, 9, 13, 239, 218, 9, \r
+    13, 239, 217, 9, 13, 239, 216, 9, 13, 239, 215, 9, 13, 239, 214, 9, 13, \r
+    239, 213, 9, 13, 239, 212, 9, 13, 239, 211, 9, 13, 239, 210, 9, 13, 239, \r
+    209, 9, 13, 239, 208, 9, 13, 239, 207, 9, 13, 239, 206, 9, 13, 239, 205, \r
+    9, 13, 239, 204, 9, 13, 239, 203, 9, 13, 239, 202, 9, 13, 239, 201, 9, \r
+    13, 239, 200, 9, 13, 239, 199, 9, 13, 239, 198, 9, 13, 239, 197, 9, 13, \r
+    239, 196, 9, 13, 239, 195, 9, 13, 239, 194, 9, 13, 239, 193, 9, 13, 239, \r
+    192, 9, 13, 239, 191, 9, 13, 239, 190, 9, 13, 239, 189, 9, 13, 239, 188, \r
+    9, 13, 239, 187, 9, 13, 239, 186, 9, 13, 239, 185, 9, 13, 239, 184, 9, \r
+    13, 239, 183, 9, 13, 239, 182, 9, 13, 239, 181, 9, 13, 239, 180, 9, 13, \r
+    239, 179, 9, 13, 239, 178, 9, 13, 239, 177, 9, 13, 239, 176, 9, 13, 239, \r
+    175, 9, 13, 239, 174, 9, 13, 239, 173, 9, 13, 239, 172, 9, 13, 239, 171, \r
+    9, 13, 239, 170, 9, 13, 239, 169, 9, 13, 239, 168, 9, 13, 239, 167, 9, \r
+    13, 239, 166, 9, 13, 239, 165, 9, 13, 239, 164, 9, 13, 239, 163, 9, 13, \r
+    239, 162, 9, 13, 239, 161, 9, 13, 239, 160, 9, 13, 239, 159, 9, 13, 239, \r
+    158, 9, 13, 239, 157, 9, 13, 239, 156, 9, 13, 239, 155, 9, 13, 239, 154, \r
+    9, 13, 239, 153, 9, 13, 239, 152, 9, 13, 239, 151, 9, 13, 239, 150, 9, \r
+    13, 239, 149, 9, 13, 239, 148, 9, 13, 239, 147, 9, 13, 239, 146, 9, 13, \r
+    239, 145, 9, 13, 239, 144, 9, 13, 239, 143, 9, 13, 239, 142, 9, 13, 239, \r
+    141, 9, 13, 239, 140, 9, 13, 239, 139, 9, 13, 239, 138, 9, 13, 239, 137, \r
+    9, 13, 239, 136, 9, 13, 239, 135, 9, 13, 239, 134, 9, 13, 239, 133, 9, \r
+    13, 239, 132, 9, 13, 239, 131, 9, 13, 239, 130, 9, 13, 239, 129, 9, 13, \r
+    239, 128, 9, 13, 239, 127, 9, 13, 239, 126, 9, 13, 239, 125, 9, 13, 239, \r
+    124, 9, 13, 239, 123, 9, 13, 239, 122, 9, 13, 239, 121, 9, 13, 239, 120, \r
+    9, 13, 239, 119, 9, 13, 239, 118, 9, 13, 239, 117, 9, 13, 239, 116, 9, \r
+    13, 239, 115, 9, 13, 239, 114, 9, 13, 239, 113, 9, 13, 239, 112, 9, 13, \r
+    239, 111, 9, 13, 239, 110, 9, 13, 239, 109, 9, 13, 239, 108, 9, 13, 239, \r
+    107, 9, 13, 239, 106, 9, 13, 239, 105, 9, 13, 239, 104, 9, 13, 239, 103, \r
+    9, 13, 239, 102, 9, 13, 239, 101, 9, 13, 239, 100, 9, 13, 239, 99, 9, 13, \r
+    239, 98, 9, 13, 239, 97, 9, 13, 239, 96, 9, 13, 239, 95, 9, 13, 239, 94, \r
+    9, 13, 239, 93, 9, 13, 239, 92, 9, 13, 239, 91, 9, 13, 239, 90, 9, 13, \r
+    239, 89, 9, 13, 239, 88, 9, 13, 239, 87, 9, 13, 239, 86, 9, 13, 239, 85, \r
+    9, 13, 239, 84, 9, 13, 239, 83, 9, 13, 239, 82, 9, 13, 239, 81, 9, 13, \r
+    239, 80, 9, 13, 239, 79, 9, 13, 239, 78, 9, 13, 239, 77, 9, 13, 239, 76, \r
+    9, 13, 239, 75, 9, 13, 239, 74, 9, 13, 239, 73, 9, 13, 239, 72, 9, 13, \r
+    239, 71, 9, 13, 239, 70, 9, 13, 239, 69, 9, 13, 239, 68, 9, 13, 239, 67, \r
+    9, 13, 239, 66, 9, 13, 239, 65, 9, 13, 239, 64, 9, 13, 239, 63, 9, 13, \r
+    239, 62, 9, 13, 239, 61, 9, 13, 239, 60, 9, 13, 239, 59, 9, 13, 239, 58, \r
+    9, 13, 239, 57, 9, 13, 239, 56, 9, 13, 239, 55, 9, 13, 239, 54, 9, 13, \r
+    239, 53, 9, 13, 239, 52, 9, 13, 239, 51, 9, 13, 239, 50, 9, 13, 239, 49, \r
+    9, 13, 239, 48, 9, 13, 239, 47, 9, 13, 239, 46, 9, 13, 239, 45, 9, 13, \r
+    239, 44, 9, 13, 239, 43, 9, 13, 239, 42, 9, 13, 239, 41, 9, 13, 239, 40, \r
+    9, 13, 239, 39, 9, 13, 239, 38, 9, 13, 239, 37, 9, 13, 239, 36, 9, 13, \r
+    239, 35, 9, 13, 239, 34, 9, 13, 239, 33, 9, 13, 239, 32, 9, 13, 239, 31, \r
+    9, 13, 239, 30, 9, 13, 239, 29, 9, 13, 239, 28, 9, 13, 239, 27, 9, 13, \r
+    239, 26, 9, 13, 239, 25, 9, 13, 239, 24, 9, 13, 239, 23, 9, 13, 239, 22, \r
+    9, 13, 239, 21, 9, 13, 239, 20, 9, 13, 239, 19, 9, 13, 239, 18, 9, 13, \r
+    239, 17, 9, 13, 239, 16, 9, 13, 239, 15, 9, 13, 239, 14, 9, 13, 239, 13, \r
+    9, 13, 239, 12, 9, 13, 239, 11, 9, 13, 239, 10, 9, 13, 239, 9, 9, 13, \r
+    239, 8, 9, 13, 239, 7, 9, 13, 239, 6, 9, 13, 239, 5, 9, 13, 239, 4, 9, \r
+    13, 239, 3, 9, 13, 239, 2, 9, 13, 239, 1, 9, 13, 239, 0, 9, 13, 238, 255, \r
+    9, 13, 238, 254, 9, 13, 238, 253, 9, 13, 238, 252, 9, 13, 238, 251, 9, \r
+    13, 238, 250, 9, 13, 238, 249, 9, 13, 238, 248, 9, 13, 238, 247, 9, 13, \r
+    238, 246, 9, 13, 238, 245, 9, 13, 238, 244, 9, 13, 238, 243, 9, 13, 238, \r
+    242, 9, 13, 238, 241, 9, 13, 238, 240, 9, 13, 238, 239, 9, 13, 238, 238, \r
+    9, 13, 238, 237, 9, 13, 238, 236, 9, 13, 238, 235, 9, 13, 238, 234, 9, \r
+    13, 238, 233, 9, 13, 238, 232, 9, 13, 238, 231, 9, 13, 238, 230, 9, 13, \r
+    238, 229, 9, 13, 238, 228, 9, 13, 238, 227, 9, 13, 238, 226, 9, 13, 238, \r
+    225, 9, 13, 238, 224, 9, 13, 238, 223, 9, 13, 238, 222, 9, 13, 238, 221, \r
+    9, 13, 238, 220, 9, 13, 238, 219, 9, 13, 238, 218, 9, 13, 238, 217, 9, \r
+    13, 238, 216, 9, 13, 238, 215, 9, 13, 238, 214, 9, 13, 238, 213, 9, 13, \r
+    238, 212, 9, 13, 238, 211, 9, 13, 238, 210, 9, 13, 238, 209, 9, 13, 238, \r
+    208, 9, 13, 238, 207, 9, 13, 238, 206, 9, 13, 238, 205, 9, 13, 238, 204, \r
+    9, 13, 238, 203, 9, 13, 238, 202, 9, 13, 238, 201, 9, 13, 238, 200, 9, \r
+    13, 238, 199, 9, 13, 238, 198, 9, 13, 238, 197, 9, 13, 238, 196, 9, 13, \r
+    238, 195, 9, 13, 238, 194, 9, 13, 238, 193, 9, 13, 238, 192, 9, 13, 238, \r
+    191, 9, 13, 238, 190, 9, 13, 238, 189, 9, 13, 238, 188, 9, 13, 238, 187, \r
+    9, 13, 238, 186, 9, 13, 238, 185, 9, 13, 238, 184, 9, 13, 238, 183, 9, \r
+    13, 238, 182, 9, 13, 238, 181, 9, 13, 238, 180, 9, 13, 238, 179, 9, 13, \r
+    238, 178, 9, 13, 238, 177, 9, 13, 238, 176, 9, 13, 238, 175, 9, 13, 238, \r
+    174, 9, 13, 238, 173, 9, 13, 238, 172, 9, 13, 238, 171, 9, 13, 238, 170, \r
+    9, 13, 238, 169, 9, 13, 238, 168, 9, 13, 238, 167, 9, 13, 238, 166, 9, \r
+    13, 238, 165, 9, 13, 238, 164, 9, 13, 238, 163, 9, 13, 238, 162, 9, 13, \r
+    238, 161, 9, 13, 238, 160, 9, 13, 238, 159, 9, 13, 238, 158, 9, 13, 238, \r
+    157, 9, 13, 238, 156, 9, 13, 238, 155, 9, 13, 238, 154, 9, 13, 238, 153, \r
+    9, 13, 238, 152, 9, 13, 238, 151, 9, 13, 238, 150, 9, 13, 238, 149, 9, \r
+    13, 238, 148, 9, 13, 238, 147, 9, 13, 238, 146, 9, 13, 238, 145, 9, 13, \r
+    238, 144, 9, 13, 238, 143, 9, 13, 238, 142, 9, 13, 238, 141, 9, 13, 238, \r
+    140, 9, 13, 238, 139, 9, 13, 238, 138, 9, 13, 238, 137, 9, 13, 238, 136, \r
+    9, 13, 238, 135, 9, 13, 238, 134, 9, 13, 238, 133, 9, 13, 238, 132, 9, \r
+    13, 238, 131, 9, 13, 238, 130, 9, 13, 238, 129, 9, 13, 238, 128, 9, 13, \r
+    238, 127, 9, 13, 238, 126, 9, 13, 238, 125, 9, 13, 238, 124, 9, 13, 238, \r
+    123, 9, 13, 238, 122, 9, 13, 238, 121, 9, 13, 238, 120, 9, 13, 238, 119, \r
+    9, 13, 238, 118, 9, 13, 238, 117, 9, 13, 238, 116, 9, 13, 238, 115, 9, \r
+    13, 238, 114, 9, 13, 238, 113, 9, 13, 238, 112, 9, 13, 238, 111, 9, 13, \r
+    238, 110, 9, 13, 238, 109, 9, 13, 238, 108, 9, 13, 238, 107, 9, 13, 238, \r
+    106, 9, 13, 238, 105, 9, 13, 238, 104, 9, 13, 238, 103, 9, 13, 238, 102, \r
+    9, 13, 238, 101, 9, 13, 238, 100, 9, 13, 238, 99, 9, 13, 238, 98, 9, 13, \r
+    238, 97, 9, 13, 238, 96, 9, 13, 238, 95, 9, 13, 238, 94, 9, 13, 238, 93, \r
+    9, 13, 238, 92, 9, 13, 238, 91, 9, 13, 238, 90, 9, 13, 238, 89, 9, 13, \r
+    238, 88, 9, 13, 238, 87, 9, 13, 238, 86, 9, 13, 238, 85, 9, 13, 238, 84, \r
+    9, 13, 238, 83, 9, 13, 238, 82, 9, 13, 238, 81, 9, 13, 238, 80, 9, 13, \r
+    238, 79, 9, 13, 238, 78, 9, 13, 238, 77, 9, 13, 238, 76, 9, 13, 238, 75, \r
+    9, 13, 238, 74, 9, 13, 238, 73, 9, 13, 238, 72, 9, 13, 238, 71, 9, 13, \r
+    238, 70, 9, 13, 238, 69, 9, 13, 238, 68, 9, 13, 238, 67, 9, 13, 238, 66, \r
+    9, 13, 238, 65, 9, 13, 238, 64, 9, 13, 238, 63, 9, 13, 238, 62, 9, 13, \r
+    238, 61, 9, 13, 238, 60, 9, 13, 238, 59, 9, 13, 238, 58, 9, 13, 238, 57, \r
+    9, 13, 238, 56, 9, 13, 238, 55, 9, 13, 238, 54, 9, 13, 238, 53, 9, 13, \r
+    238, 52, 9, 13, 238, 51, 9, 13, 238, 50, 9, 13, 238, 49, 9, 13, 238, 48, \r
+    9, 13, 238, 47, 9, 13, 238, 46, 9, 13, 238, 45, 9, 13, 238, 44, 9, 13, \r
+    238, 43, 9, 13, 238, 42, 9, 13, 238, 41, 9, 13, 238, 40, 9, 13, 238, 39, \r
+    9, 13, 238, 38, 9, 13, 238, 37, 9, 13, 238, 36, 9, 13, 238, 35, 9, 13, \r
+    238, 34, 9, 13, 238, 33, 9, 13, 238, 32, 9, 13, 238, 31, 7, 3, 24, 245, \r
+    207, 7, 3, 24, 245, 203, 7, 3, 24, 245, 166, 7, 3, 24, 245, 206, 7, 3, \r
+    24, 245, 205, 7, 3, 24, 171, 226, 235, 222, 201, 7, 3, 24, 223, 168, 132, \r
+    3, 24, 233, 252, 231, 174, 132, 3, 24, 233, 252, 246, 254, 132, 3, 24, \r
+    233, 252, 237, 200, 132, 3, 24, 219, 97, 231, 174, 132, 3, 24, 233, 252, \r
+    218, 133, 87, 1, 217, 221, 2, 243, 94, 87, 229, 32, 237, 42, 219, 176, \r
+    87, 24, 217, 248, 217, 221, 217, 221, 229, 214, 87, 1, 254, 142, 253, \r
+    207, 87, 1, 218, 201, 254, 168, 87, 1, 218, 201, 249, 177, 87, 1, 218, \r
+    201, 243, 162, 87, 1, 218, 201, 236, 246, 87, 1, 218, 201, 235, 152, 87, \r
+    1, 218, 201, 39, 234, 1, 87, 1, 218, 201, 227, 174, 87, 1, 218, 201, 222, \r
+    102, 87, 1, 254, 142, 88, 55, 87, 1, 224, 210, 2, 224, 210, 248, 145, 87, \r
+    1, 224, 210, 2, 224, 113, 248, 145, 87, 1, 224, 210, 2, 249, 194, 25, \r
+    224, 210, 248, 145, 87, 1, 224, 210, 2, 249, 194, 25, 224, 113, 248, 145, \r
+    87, 1, 99, 2, 229, 214, 87, 1, 99, 2, 228, 143, 87, 1, 99, 2, 234, 77, \r
+    87, 1, 252, 105, 2, 249, 193, 87, 1, 244, 92, 2, 249, 193, 87, 1, 249, \r
+    178, 2, 249, 193, 87, 1, 243, 163, 2, 234, 77, 87, 1, 219, 170, 2, 249, \r
+    193, 87, 1, 217, 96, 2, 249, 193, 87, 1, 222, 51, 2, 249, 193, 87, 1, \r
+    217, 221, 2, 249, 193, 87, 1, 39, 236, 247, 2, 249, 193, 87, 1, 236, 247, \r
+    2, 249, 193, 87, 1, 235, 153, 2, 249, 193, 87, 1, 234, 2, 2, 249, 193, \r
+    87, 1, 231, 104, 2, 249, 193, 87, 1, 226, 146, 2, 249, 193, 87, 1, 39, \r
+    229, 199, 2, 249, 193, 87, 1, 229, 199, 2, 249, 193, 87, 1, 221, 52, 2, \r
+    249, 193, 87, 1, 228, 108, 2, 249, 193, 87, 1, 227, 175, 2, 249, 193, 87, \r
+    1, 224, 210, 2, 249, 193, 87, 1, 222, 103, 2, 249, 193, 87, 1, 219, 170, \r
+    2, 242, 254, 87, 1, 252, 105, 2, 227, 248, 87, 1, 236, 247, 2, 227, 248, \r
+    87, 1, 229, 199, 2, 227, 248, 87, 24, 99, 235, 152, 12, 1, 99, 218, 247, \r
+    47, 17, 12, 1, 99, 218, 247, 39, 17, 12, 1, 252, 136, 47, 17, 12, 1, 252, \r
+    136, 39, 17, 12, 1, 252, 136, 66, 17, 12, 1, 252, 136, 128, 17, 12, 1, \r
+    229, 188, 47, 17, 12, 1, 229, 188, 39, 17, 12, 1, 229, 188, 66, 17, 12, \r
+    1, 229, 188, 128, 17, 12, 1, 252, 127, 47, 17, 12, 1, 252, 127, 39, 17, \r
+    12, 1, 252, 127, 66, 17, 12, 1, 252, 127, 128, 17, 12, 1, 221, 22, 47, \r
+    17, 12, 1, 221, 22, 39, 17, 12, 1, 221, 22, 66, 17, 12, 1, 221, 22, 128, \r
+    17, 12, 1, 222, 76, 47, 17, 12, 1, 222, 76, 39, 17, 12, 1, 222, 76, 66, \r
+    17, 12, 1, 222, 76, 128, 17, 12, 1, 221, 24, 47, 17, 12, 1, 221, 24, 39, \r
+    17, 12, 1, 221, 24, 66, 17, 12, 1, 221, 24, 128, 17, 12, 1, 219, 159, 47, \r
+    17, 12, 1, 219, 159, 39, 17, 12, 1, 219, 159, 66, 17, 12, 1, 219, 159, \r
+    128, 17, 12, 1, 229, 186, 47, 17, 12, 1, 229, 186, 39, 17, 12, 1, 229, \r
+    186, 66, 17, 12, 1, 229, 186, 128, 17, 12, 1, 247, 80, 47, 17, 12, 1, \r
+    247, 80, 39, 17, 12, 1, 247, 80, 66, 17, 12, 1, 247, 80, 128, 17, 12, 1, \r
+    231, 71, 47, 17, 12, 1, 231, 71, 39, 17, 12, 1, 231, 71, 66, 17, 12, 1, \r
+    231, 71, 128, 17, 12, 1, 222, 92, 47, 17, 12, 1, 222, 92, 39, 17, 12, 1, \r
+    222, 92, 66, 17, 12, 1, 222, 92, 128, 17, 12, 1, 222, 90, 47, 17, 12, 1, \r
+    222, 90, 39, 17, 12, 1, 222, 90, 66, 17, 12, 1, 222, 90, 128, 17, 12, 1, \r
+    249, 130, 47, 17, 12, 1, 249, 130, 39, 17, 12, 1, 249, 190, 47, 17, 12, \r
+    1, 249, 190, 39, 17, 12, 1, 247, 104, 47, 17, 12, 1, 247, 104, 39, 17, \r
+    12, 1, 249, 128, 47, 17, 12, 1, 249, 128, 39, 17, 12, 1, 237, 110, 47, \r
+    17, 12, 1, 237, 110, 39, 17, 12, 1, 227, 49, 47, 17, 12, 1, 227, 49, 39, \r
+    17, 12, 1, 236, 177, 47, 17, 12, 1, 236, 177, 39, 17, 12, 1, 236, 177, \r
+    66, 17, 12, 1, 236, 177, 128, 17, 12, 1, 244, 244, 47, 17, 12, 1, 244, \r
+    244, 39, 17, 12, 1, 244, 244, 66, 17, 12, 1, 244, 244, 128, 17, 12, 1, \r
+    244, 10, 47, 17, 12, 1, 244, 10, 39, 17, 12, 1, 244, 10, 66, 17, 12, 1, \r
+    244, 10, 128, 17, 12, 1, 232, 83, 47, 17, 12, 1, 232, 83, 39, 17, 12, 1, \r
+    232, 83, 66, 17, 12, 1, 232, 83, 128, 17, 12, 1, 231, 194, 244, 108, 47, \r
+    17, 12, 1, 231, 194, 244, 108, 39, 17, 12, 1, 227, 79, 47, 17, 12, 1, \r
+    227, 79, 39, 17, 12, 1, 227, 79, 66, 17, 12, 1, 227, 79, 128, 17, 12, 1, \r
+    243, 147, 2, 70, 71, 47, 17, 12, 1, 243, 147, 2, 70, 71, 39, 17, 12, 1, \r
+    243, 147, 244, 66, 47, 17, 12, 1, 243, 147, 244, 66, 39, 17, 12, 1, 243, \r
+    147, 244, 66, 66, 17, 12, 1, 243, 147, 244, 66, 128, 17, 12, 1, 243, 147, \r
+    248, 164, 47, 17, 12, 1, 243, 147, 248, 164, 39, 17, 12, 1, 243, 147, \r
+    248, 164, 66, 17, 12, 1, 243, 147, 248, 164, 128, 17, 12, 1, 70, 252, \r
+    195, 47, 17, 12, 1, 70, 252, 195, 39, 17, 12, 1, 70, 252, 195, 2, 181, \r
+    71, 47, 17, 12, 1, 70, 252, 195, 2, 181, 71, 39, 17, 12, 1, 232, 118, 47, \r
+    17, 12, 1, 232, 118, 39, 17, 12, 1, 232, 118, 66, 17, 12, 1, 232, 118, \r
+    128, 17, 12, 1, 105, 47, 17, 12, 1, 105, 39, 17, 12, 1, 230, 168, 47, 17, \r
+    12, 1, 230, 168, 39, 17, 12, 1, 217, 201, 47, 17, 12, 1, 217, 201, 39, \r
+    17, 12, 1, 105, 2, 181, 71, 47, 17, 12, 1, 219, 166, 47, 17, 12, 1, 219, \r
+    166, 39, 17, 12, 1, 236, 98, 230, 168, 47, 17, 12, 1, 236, 98, 230, 168, \r
+    39, 17, 12, 1, 236, 98, 217, 201, 47, 17, 12, 1, 236, 98, 217, 201, 39, \r
+    17, 12, 1, 178, 47, 17, 12, 1, 178, 39, 17, 12, 1, 178, 66, 17, 12, 1, \r
+    178, 128, 17, 12, 1, 220, 104, 236, 188, 236, 98, 99, 197, 66, 17, 12, 1, \r
+    220, 104, 236, 188, 236, 98, 99, 197, 128, 17, 12, 24, 70, 2, 181, 71, 2, \r
+    99, 47, 17, 12, 24, 70, 2, 181, 71, 2, 99, 39, 17, 12, 24, 70, 2, 181, \r
+    71, 2, 254, 235, 47, 17, 12, 24, 70, 2, 181, 71, 2, 254, 235, 39, 17, 12, \r
+    24, 70, 2, 181, 71, 2, 218, 234, 47, 17, 12, 24, 70, 2, 181, 71, 2, 218, \r
+    234, 39, 17, 12, 24, 70, 2, 181, 71, 2, 105, 47, 17, 12, 24, 70, 2, 181, \r
+    71, 2, 105, 39, 17, 12, 24, 70, 2, 181, 71, 2, 230, 168, 47, 17, 12, 24, \r
+    70, 2, 181, 71, 2, 230, 168, 39, 17, 12, 24, 70, 2, 181, 71, 2, 217, 201, \r
+    47, 17, 12, 24, 70, 2, 181, 71, 2, 217, 201, 39, 17, 12, 24, 70, 2, 181, \r
+    71, 2, 178, 47, 17, 12, 24, 70, 2, 181, 71, 2, 178, 39, 17, 12, 24, 70, \r
+    2, 181, 71, 2, 178, 66, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, \r
+    99, 197, 47, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, 99, 197, \r
+    39, 17, 12, 24, 220, 104, 236, 98, 70, 2, 181, 71, 2, 99, 197, 66, 17, \r
+    12, 1, 245, 241, 70, 47, 17, 12, 1, 245, 241, 70, 39, 17, 12, 1, 245, \r
+    241, 70, 66, 17, 12, 1, 245, 241, 70, 128, 17, 12, 24, 70, 2, 181, 71, 2, \r
+    134, 47, 17, 12, 24, 70, 2, 181, 71, 2, 111, 47, 17, 12, 24, 70, 2, 181, \r
+    71, 2, 62, 47, 17, 12, 24, 70, 2, 181, 71, 2, 99, 197, 47, 17, 12, 24, \r
+    70, 2, 181, 71, 2, 70, 47, 17, 12, 24, 252, 129, 2, 134, 47, 17, 12, 24, \r
+    252, 129, 2, 111, 47, 17, 12, 24, 252, 129, 2, 236, 147, 47, 17, 12, 24, \r
+    252, 129, 2, 62, 47, 17, 12, 24, 252, 129, 2, 99, 197, 47, 17, 12, 24, \r
+    252, 129, 2, 70, 47, 17, 12, 24, 222, 78, 2, 134, 47, 17, 12, 24, 222, \r
+    78, 2, 111, 47, 17, 12, 24, 222, 78, 2, 236, 147, 47, 17, 12, 24, 222, \r
+    78, 2, 62, 47, 17, 12, 24, 222, 78, 2, 99, 197, 47, 17, 12, 24, 222, 78, \r
+    2, 70, 47, 17, 12, 24, 222, 20, 2, 134, 47, 17, 12, 24, 222, 20, 2, 62, \r
+    47, 17, 12, 24, 222, 20, 2, 99, 197, 47, 17, 12, 24, 222, 20, 2, 70, 47, \r
+    17, 12, 24, 134, 2, 111, 47, 17, 12, 24, 134, 2, 62, 47, 17, 12, 24, 111, \r
+    2, 134, 47, 17, 12, 24, 111, 2, 62, 47, 17, 12, 24, 236, 147, 2, 134, 47, \r
+    17, 12, 24, 236, 147, 2, 111, 47, 17, 12, 24, 236, 147, 2, 62, 47, 17, \r
+    12, 24, 226, 83, 2, 134, 47, 17, 12, 24, 226, 83, 2, 111, 47, 17, 12, 24, \r
+    226, 83, 2, 236, 147, 47, 17, 12, 24, 226, 83, 2, 62, 47, 17, 12, 24, \r
+    226, 171, 2, 111, 47, 17, 12, 24, 226, 171, 2, 62, 47, 17, 12, 24, 249, \r
+    203, 2, 134, 47, 17, 12, 24, 249, 203, 2, 111, 47, 17, 12, 24, 249, 203, \r
+    2, 236, 147, 47, 17, 12, 24, 249, 203, 2, 62, 47, 17, 12, 24, 222, 138, \r
+    2, 111, 47, 17, 12, 24, 222, 138, 2, 62, 47, 17, 12, 24, 217, 110, 2, 62, \r
+    47, 17, 12, 24, 254, 192, 2, 134, 47, 17, 12, 24, 254, 192, 2, 62, 47, \r
+    17, 12, 24, 244, 123, 2, 134, 47, 17, 12, 24, 244, 123, 2, 62, 47, 17, \r
+    12, 24, 245, 222, 2, 134, 47, 17, 12, 24, 245, 222, 2, 111, 47, 17, 12, \r
+    24, 245, 222, 2, 236, 147, 47, 17, 12, 24, 245, 222, 2, 62, 47, 17, 12, \r
+    24, 245, 222, 2, 99, 197, 47, 17, 12, 24, 245, 222, 2, 70, 47, 17, 12, \r
+    24, 228, 149, 2, 111, 47, 17, 12, 24, 228, 149, 2, 62, 47, 17, 12, 24, \r
+    228, 149, 2, 99, 197, 47, 17, 12, 24, 228, 149, 2, 70, 47, 17, 12, 24, \r
+    236, 247, 2, 99, 47, 17, 12, 24, 236, 247, 2, 134, 47, 17, 12, 24, 236, \r
+    247, 2, 111, 47, 17, 12, 24, 236, 247, 2, 236, 147, 47, 17, 12, 24, 236, \r
+    247, 2, 235, 161, 47, 17, 12, 24, 236, 247, 2, 62, 47, 17, 12, 24, 236, \r
+    247, 2, 99, 197, 47, 17, 12, 24, 236, 247, 2, 70, 47, 17, 12, 24, 235, \r
+    161, 2, 134, 47, 17, 12, 24, 235, 161, 2, 111, 47, 17, 12, 24, 235, 161, \r
+    2, 236, 147, 47, 17, 12, 24, 235, 161, 2, 62, 47, 17, 12, 24, 235, 161, \r
+    2, 99, 197, 47, 17, 12, 24, 235, 161, 2, 70, 47, 17, 12, 24, 62, 2, 134, \r
+    47, 17, 12, 24, 62, 2, 111, 47, 17, 12, 24, 62, 2, 236, 147, 47, 17, 12, \r
+    24, 62, 2, 62, 47, 17, 12, 24, 62, 2, 99, 197, 47, 17, 12, 24, 62, 2, 70, \r
+    47, 17, 12, 24, 231, 194, 2, 134, 47, 17, 12, 24, 231, 194, 2, 111, 47, \r
+    17, 12, 24, 231, 194, 2, 236, 147, 47, 17, 12, 24, 231, 194, 2, 62, 47, \r
+    17, 12, 24, 231, 194, 2, 99, 197, 47, 17, 12, 24, 231, 194, 2, 70, 47, \r
+    17, 12, 24, 243, 147, 2, 134, 47, 17, 12, 24, 243, 147, 2, 62, 47, 17, \r
+    12, 24, 243, 147, 2, 99, 197, 47, 17, 12, 24, 243, 147, 2, 70, 47, 17, \r
+    12, 24, 70, 2, 134, 47, 17, 12, 24, 70, 2, 111, 47, 17, 12, 24, 70, 2, \r
+    236, 147, 47, 17, 12, 24, 70, 2, 62, 47, 17, 12, 24, 70, 2, 99, 197, 47, \r
+    17, 12, 24, 70, 2, 70, 47, 17, 12, 24, 222, 30, 2, 223, 59, 99, 47, 17, \r
+    12, 24, 227, 197, 2, 223, 59, 99, 47, 17, 12, 24, 99, 197, 2, 223, 59, \r
+    99, 47, 17, 12, 24, 225, 17, 2, 249, 171, 47, 17, 12, 24, 225, 17, 2, \r
+    236, 205, 47, 17, 12, 24, 225, 17, 2, 245, 239, 47, 17, 12, 24, 225, 17, \r
+    2, 249, 173, 47, 17, 12, 24, 225, 17, 2, 236, 207, 47, 17, 12, 24, 225, \r
+    17, 2, 223, 59, 99, 47, 17, 12, 24, 70, 2, 181, 71, 2, 227, 197, 39, 17, \r
+    12, 24, 70, 2, 181, 71, 2, 217, 107, 39, 17, 12, 24, 70, 2, 181, 71, 2, \r
+    62, 39, 17, 12, 24, 70, 2, 181, 71, 2, 231, 194, 39, 17, 12, 24, 70, 2, \r
+    181, 71, 2, 99, 197, 39, 17, 12, 24, 70, 2, 181, 71, 2, 70, 39, 17, 12, \r
+    24, 252, 129, 2, 227, 197, 39, 17, 12, 24, 252, 129, 2, 217, 107, 39, 17, \r
+    12, 24, 252, 129, 2, 62, 39, 17, 12, 24, 252, 129, 2, 231, 194, 39, 17, \r
+    12, 24, 252, 129, 2, 99, 197, 39, 17, 12, 24, 252, 129, 2, 70, 39, 17, \r
+    12, 24, 222, 78, 2, 227, 197, 39, 17, 12, 24, 222, 78, 2, 217, 107, 39, \r
+    17, 12, 24, 222, 78, 2, 62, 39, 17, 12, 24, 222, 78, 2, 231, 194, 39, 17, \r
+    12, 24, 222, 78, 2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 70, 39, 17, 12, \r
+    24, 222, 20, 2, 227, 197, 39, 17, 12, 24, 222, 20, 2, 217, 107, 39, 17, \r
+    12, 24, 222, 20, 2, 62, 39, 17, 12, 24, 222, 20, 2, 231, 194, 39, 17, 12, \r
+    24, 222, 20, 2, 99, 197, 39, 17, 12, 24, 222, 20, 2, 70, 39, 17, 12, 24, \r
+    245, 222, 2, 99, 197, 39, 17, 12, 24, 245, 222, 2, 70, 39, 17, 12, 24, \r
+    228, 149, 2, 99, 197, 39, 17, 12, 24, 228, 149, 2, 70, 39, 17, 12, 24, \r
+    236, 247, 2, 99, 39, 17, 12, 24, 236, 247, 2, 235, 161, 39, 17, 12, 24, \r
+    236, 247, 2, 62, 39, 17, 12, 24, 236, 247, 2, 99, 197, 39, 17, 12, 24, \r
+    236, 247, 2, 70, 39, 17, 12, 24, 235, 161, 2, 62, 39, 17, 12, 24, 235, \r
+    161, 2, 99, 197, 39, 17, 12, 24, 235, 161, 2, 70, 39, 17, 12, 24, 62, 2, \r
+    99, 39, 17, 12, 24, 62, 2, 62, 39, 17, 12, 24, 231, 194, 2, 227, 197, 39, \r
+    17, 12, 24, 231, 194, 2, 217, 107, 39, 17, 12, 24, 231, 194, 2, 62, 39, \r
+    17, 12, 24, 231, 194, 2, 231, 194, 39, 17, 12, 24, 231, 194, 2, 99, 197, \r
+    39, 17, 12, 24, 231, 194, 2, 70, 39, 17, 12, 24, 99, 197, 2, 223, 59, 99, \r
+    39, 17, 12, 24, 70, 2, 227, 197, 39, 17, 12, 24, 70, 2, 217, 107, 39, 17, \r
+    12, 24, 70, 2, 62, 39, 17, 12, 24, 70, 2, 231, 194, 39, 17, 12, 24, 70, \r
+    2, 99, 197, 39, 17, 12, 24, 70, 2, 70, 39, 17, 12, 24, 70, 2, 181, 71, 2, \r
+    134, 66, 17, 12, 24, 70, 2, 181, 71, 2, 111, 66, 17, 12, 24, 70, 2, 181, \r
+    71, 2, 236, 147, 66, 17, 12, 24, 70, 2, 181, 71, 2, 62, 66, 17, 12, 24, \r
+    70, 2, 181, 71, 2, 243, 147, 66, 17, 12, 24, 252, 129, 2, 134, 66, 17, \r
+    12, 24, 252, 129, 2, 111, 66, 17, 12, 24, 252, 129, 2, 236, 147, 66, 17, \r
+    12, 24, 252, 129, 2, 62, 66, 17, 12, 24, 252, 129, 2, 243, 147, 66, 17, \r
+    12, 24, 222, 78, 2, 134, 66, 17, 12, 24, 222, 78, 2, 111, 66, 17, 12, 24, \r
+    222, 78, 2, 236, 147, 66, 17, 12, 24, 222, 78, 2, 62, 66, 17, 12, 24, \r
+    222, 78, 2, 243, 147, 66, 17, 12, 24, 222, 20, 2, 62, 66, 17, 12, 24, \r
+    134, 2, 111, 66, 17, 12, 24, 134, 2, 62, 66, 17, 12, 24, 111, 2, 134, 66, \r
+    17, 12, 24, 111, 2, 62, 66, 17, 12, 24, 236, 147, 2, 134, 66, 17, 12, 24, \r
+    236, 147, 2, 62, 66, 17, 12, 24, 226, 83, 2, 134, 66, 17, 12, 24, 226, \r
+    83, 2, 111, 66, 17, 12, 24, 226, 83, 2, 236, 147, 66, 17, 12, 24, 226, \r
+    83, 2, 62, 66, 17, 12, 24, 226, 171, 2, 111, 66, 17, 12, 24, 226, 171, 2, \r
+    236, 147, 66, 17, 12, 24, 226, 171, 2, 62, 66, 17, 12, 24, 249, 203, 2, \r
+    134, 66, 17, 12, 24, 249, 203, 2, 111, 66, 17, 12, 24, 249, 203, 2, 236, \r
+    147, 66, 17, 12, 24, 249, 203, 2, 62, 66, 17, 12, 24, 222, 138, 2, 111, \r
+    66, 17, 12, 24, 217, 110, 2, 62, 66, 17, 12, 24, 254, 192, 2, 134, 66, \r
+    17, 12, 24, 254, 192, 2, 62, 66, 17, 12, 24, 244, 123, 2, 134, 66, 17, \r
+    12, 24, 244, 123, 2, 62, 66, 17, 12, 24, 245, 222, 2, 134, 66, 17, 12, \r
+    24, 245, 222, 2, 111, 66, 17, 12, 24, 245, 222, 2, 236, 147, 66, 17, 12, \r
+    24, 245, 222, 2, 62, 66, 17, 12, 24, 228, 149, 2, 111, 66, 17, 12, 24, \r
+    228, 149, 2, 62, 66, 17, 12, 24, 236, 247, 2, 134, 66, 17, 12, 24, 236, \r
+    247, 2, 111, 66, 17, 12, 24, 236, 247, 2, 236, 147, 66, 17, 12, 24, 236, \r
+    247, 2, 235, 161, 66, 17, 12, 24, 236, 247, 2, 62, 66, 17, 12, 24, 235, \r
+    161, 2, 134, 66, 17, 12, 24, 235, 161, 2, 111, 66, 17, 12, 24, 235, 161, \r
+    2, 236, 147, 66, 17, 12, 24, 235, 161, 2, 62, 66, 17, 12, 24, 235, 161, \r
+    2, 243, 147, 66, 17, 12, 24, 62, 2, 134, 66, 17, 12, 24, 62, 2, 111, 66, \r
+    17, 12, 24, 62, 2, 236, 147, 66, 17, 12, 24, 62, 2, 62, 66, 17, 12, 24, \r
+    231, 194, 2, 134, 66, 17, 12, 24, 231, 194, 2, 111, 66, 17, 12, 24, 231, \r
+    194, 2, 236, 147, 66, 17, 12, 24, 231, 194, 2, 62, 66, 17, 12, 24, 231, \r
+    194, 2, 243, 147, 66, 17, 12, 24, 243, 147, 2, 134, 66, 17, 12, 24, 243, \r
+    147, 2, 62, 66, 17, 12, 24, 243, 147, 2, 223, 59, 99, 66, 17, 12, 24, 70, \r
+    2, 134, 66, 17, 12, 24, 70, 2, 111, 66, 17, 12, 24, 70, 2, 236, 147, 66, \r
+    17, 12, 24, 70, 2, 62, 66, 17, 12, 24, 70, 2, 243, 147, 66, 17, 12, 24, \r
+    70, 2, 181, 71, 2, 62, 128, 17, 12, 24, 70, 2, 181, 71, 2, 243, 147, 128, \r
+    17, 12, 24, 252, 129, 2, 62, 128, 17, 12, 24, 252, 129, 2, 243, 147, 128, \r
+    17, 12, 24, 222, 78, 2, 62, 128, 17, 12, 24, 222, 78, 2, 243, 147, 128, \r
+    17, 12, 24, 222, 20, 2, 62, 128, 17, 12, 24, 222, 20, 2, 243, 147, 128, \r
+    17, 12, 24, 226, 83, 2, 62, 128, 17, 12, 24, 226, 83, 2, 243, 147, 128, \r
+    17, 12, 24, 224, 243, 2, 62, 128, 17, 12, 24, 224, 243, 2, 243, 147, 128, \r
+    17, 12, 24, 236, 247, 2, 235, 161, 128, 17, 12, 24, 236, 247, 2, 62, 128, \r
+    17, 12, 24, 235, 161, 2, 62, 128, 17, 12, 24, 231, 194, 2, 62, 128, 17, \r
+    12, 24, 231, 194, 2, 243, 147, 128, 17, 12, 24, 70, 2, 62, 128, 17, 12, \r
+    24, 70, 2, 243, 147, 128, 17, 12, 24, 225, 17, 2, 245, 239, 128, 17, 12, \r
+    24, 225, 17, 2, 249, 173, 128, 17, 12, 24, 225, 17, 2, 236, 207, 128, 17, \r
+    12, 24, 222, 138, 2, 99, 197, 47, 17, 12, 24, 222, 138, 2, 70, 47, 17, \r
+    12, 24, 254, 192, 2, 99, 197, 47, 17, 12, 24, 254, 192, 2, 70, 47, 17, \r
+    12, 24, 244, 123, 2, 99, 197, 47, 17, 12, 24, 244, 123, 2, 70, 47, 17, \r
+    12, 24, 226, 83, 2, 99, 197, 47, 17, 12, 24, 226, 83, 2, 70, 47, 17, 12, \r
+    24, 224, 243, 2, 99, 197, 47, 17, 12, 24, 224, 243, 2, 70, 47, 17, 12, \r
+    24, 111, 2, 99, 197, 47, 17, 12, 24, 111, 2, 70, 47, 17, 12, 24, 134, 2, \r
+    99, 197, 47, 17, 12, 24, 134, 2, 70, 47, 17, 12, 24, 236, 147, 2, 99, \r
+    197, 47, 17, 12, 24, 236, 147, 2, 70, 47, 17, 12, 24, 226, 171, 2, 99, \r
+    197, 47, 17, 12, 24, 226, 171, 2, 70, 47, 17, 12, 24, 249, 203, 2, 99, \r
+    197, 47, 17, 12, 24, 249, 203, 2, 70, 47, 17, 12, 24, 224, 243, 2, 134, \r
+    47, 17, 12, 24, 224, 243, 2, 111, 47, 17, 12, 24, 224, 243, 2, 236, 147, \r
+    47, 17, 12, 24, 224, 243, 2, 62, 47, 17, 12, 24, 224, 243, 2, 227, 197, \r
+    47, 17, 12, 24, 226, 83, 2, 227, 197, 47, 17, 12, 24, 226, 171, 2, 227, \r
+    197, 47, 17, 12, 24, 249, 203, 2, 227, 197, 47, 17, 12, 24, 222, 138, 2, \r
+    99, 197, 39, 17, 12, 24, 222, 138, 2, 70, 39, 17, 12, 24, 254, 192, 2, \r
+    99, 197, 39, 17, 12, 24, 254, 192, 2, 70, 39, 17, 12, 24, 244, 123, 2, \r
+    99, 197, 39, 17, 12, 24, 244, 123, 2, 70, 39, 17, 12, 24, 226, 83, 2, 99, \r
+    197, 39, 17, 12, 24, 226, 83, 2, 70, 39, 17, 12, 24, 224, 243, 2, 99, \r
+    197, 39, 17, 12, 24, 224, 243, 2, 70, 39, 17, 12, 24, 111, 2, 99, 197, \r
+    39, 17, 12, 24, 111, 2, 70, 39, 17, 12, 24, 134, 2, 99, 197, 39, 17, 12, \r
+    24, 134, 2, 70, 39, 17, 12, 24, 236, 147, 2, 99, 197, 39, 17, 12, 24, \r
+    236, 147, 2, 70, 39, 17, 12, 24, 226, 171, 2, 99, 197, 39, 17, 12, 24, \r
+    226, 171, 2, 70, 39, 17, 12, 24, 249, 203, 2, 99, 197, 39, 17, 12, 24, \r
+    249, 203, 2, 70, 39, 17, 12, 24, 224, 243, 2, 134, 39, 17, 12, 24, 224, \r
+    243, 2, 111, 39, 17, 12, 24, 224, 243, 2, 236, 147, 39, 17, 12, 24, 224, \r
+    243, 2, 62, 39, 17, 12, 24, 224, 243, 2, 227, 197, 39, 17, 12, 24, 226, \r
+    83, 2, 227, 197, 39, 17, 12, 24, 226, 171, 2, 227, 197, 39, 17, 12, 24, \r
+    249, 203, 2, 227, 197, 39, 17, 12, 24, 224, 243, 2, 134, 66, 17, 12, 24, \r
+    224, 243, 2, 111, 66, 17, 12, 24, 224, 243, 2, 236, 147, 66, 17, 12, 24, \r
+    224, 243, 2, 62, 66, 17, 12, 24, 226, 83, 2, 243, 147, 66, 17, 12, 24, \r
+    224, 243, 2, 243, 147, 66, 17, 12, 24, 222, 138, 2, 62, 66, 17, 12, 24, \r
+    226, 83, 2, 134, 128, 17, 12, 24, 226, 83, 2, 111, 128, 17, 12, 24, 226, \r
+    83, 2, 236, 147, 128, 17, 12, 24, 224, 243, 2, 134, 128, 17, 12, 24, 224, \r
+    243, 2, 111, 128, 17, 12, 24, 224, 243, 2, 236, 147, 128, 17, 12, 24, \r
+    222, 138, 2, 62, 128, 17, 12, 24, 217, 110, 2, 62, 128, 17, 12, 24, 99, \r
+    2, 245, 237, 39, 17, 12, 24, 99, 2, 245, 237, 47, 17, 230, 97, 42, 229, \r
+    229, 230, 97, 45, 229, 229, 12, 24, 222, 78, 2, 134, 2, 62, 66, 17, 12, \r
+    24, 222, 78, 2, 111, 2, 134, 39, 17, 12, 24, 222, 78, 2, 111, 2, 134, 66, \r
+    17, 12, 24, 222, 78, 2, 111, 2, 62, 66, 17, 12, 24, 222, 78, 2, 236, 147, \r
+    2, 62, 66, 17, 12, 24, 222, 78, 2, 62, 2, 134, 66, 17, 12, 24, 222, 78, \r
+    2, 62, 2, 111, 66, 17, 12, 24, 222, 78, 2, 62, 2, 236, 147, 66, 17, 12, \r
+    24, 134, 2, 62, 2, 111, 39, 17, 12, 24, 134, 2, 62, 2, 111, 66, 17, 12, \r
+    24, 111, 2, 62, 2, 70, 39, 17, 12, 24, 111, 2, 62, 2, 99, 197, 39, 17, \r
+    12, 24, 226, 83, 2, 111, 2, 134, 66, 17, 12, 24, 226, 83, 2, 134, 2, 111, \r
+    66, 17, 12, 24, 226, 83, 2, 134, 2, 99, 197, 39, 17, 12, 24, 226, 83, 2, \r
+    62, 2, 111, 39, 17, 12, 24, 226, 83, 2, 62, 2, 111, 66, 17, 12, 24, 226, \r
+    83, 2, 62, 2, 134, 66, 17, 12, 24, 226, 83, 2, 62, 2, 62, 39, 17, 12, 24, \r
+    226, 83, 2, 62, 2, 62, 66, 17, 12, 24, 226, 171, 2, 111, 2, 111, 39, 17, \r
+    12, 24, 226, 171, 2, 111, 2, 111, 66, 17, 12, 24, 226, 171, 2, 62, 2, 62, \r
+    39, 17, 12, 24, 224, 243, 2, 111, 2, 62, 39, 17, 12, 24, 224, 243, 2, \r
+    111, 2, 62, 66, 17, 12, 24, 224, 243, 2, 134, 2, 70, 39, 17, 12, 24, 224, \r
+    243, 2, 62, 2, 236, 147, 39, 17, 12, 24, 224, 243, 2, 62, 2, 236, 147, \r
+    66, 17, 12, 24, 224, 243, 2, 62, 2, 62, 39, 17, 12, 24, 224, 243, 2, 62, \r
+    2, 62, 66, 17, 12, 24, 249, 203, 2, 111, 2, 99, 197, 39, 17, 12, 24, 249, \r
+    203, 2, 236, 147, 2, 62, 39, 17, 12, 24, 249, 203, 2, 236, 147, 2, 62, \r
+    66, 17, 12, 24, 222, 138, 2, 62, 2, 111, 39, 17, 12, 24, 222, 138, 2, 62, \r
+    2, 111, 66, 17, 12, 24, 222, 138, 2, 62, 2, 62, 66, 17, 12, 24, 222, 138, \r
+    2, 62, 2, 70, 39, 17, 12, 24, 254, 192, 2, 134, 2, 62, 39, 17, 12, 24, \r
+    254, 192, 2, 62, 2, 62, 39, 17, 12, 24, 254, 192, 2, 62, 2, 62, 66, 17, \r
+    12, 24, 254, 192, 2, 62, 2, 99, 197, 39, 17, 12, 24, 244, 123, 2, 62, 2, \r
+    62, 39, 17, 12, 24, 244, 123, 2, 62, 2, 70, 39, 17, 12, 24, 244, 123, 2, \r
+    62, 2, 99, 197, 39, 17, 12, 24, 245, 222, 2, 236, 147, 2, 62, 39, 17, 12, \r
+    24, 245, 222, 2, 236, 147, 2, 62, 66, 17, 12, 24, 228, 149, 2, 62, 2, \r
+    111, 39, 17, 12, 24, 228, 149, 2, 62, 2, 62, 39, 17, 12, 24, 235, 161, 2, \r
+    111, 2, 62, 39, 17, 12, 24, 235, 161, 2, 111, 2, 70, 39, 17, 12, 24, 235, \r
+    161, 2, 111, 2, 99, 197, 39, 17, 12, 24, 235, 161, 2, 134, 2, 134, 66, \r
+    17, 12, 24, 235, 161, 2, 134, 2, 134, 39, 17, 12, 24, 235, 161, 2, 236, \r
+    147, 2, 62, 39, 17, 12, 24, 235, 161, 2, 236, 147, 2, 62, 66, 17, 12, 24, \r
+    235, 161, 2, 62, 2, 111, 39, 17, 12, 24, 235, 161, 2, 62, 2, 111, 66, 17, \r
+    12, 24, 62, 2, 111, 2, 134, 66, 17, 12, 24, 62, 2, 111, 2, 62, 66, 17, \r
+    12, 24, 62, 2, 111, 2, 70, 39, 17, 12, 24, 62, 2, 134, 2, 111, 66, 17, \r
+    12, 24, 62, 2, 134, 2, 62, 66, 17, 12, 24, 62, 2, 236, 147, 2, 134, 66, \r
+    17, 12, 24, 62, 2, 236, 147, 2, 62, 66, 17, 12, 24, 62, 2, 134, 2, 236, \r
+    147, 66, 17, 12, 24, 243, 147, 2, 62, 2, 134, 66, 17, 12, 24, 243, 147, \r
+    2, 62, 2, 62, 66, 17, 12, 24, 231, 194, 2, 111, 2, 62, 66, 17, 12, 24, \r
+    231, 194, 2, 111, 2, 99, 197, 39, 17, 12, 24, 231, 194, 2, 134, 2, 62, \r
+    39, 17, 12, 24, 231, 194, 2, 134, 2, 62, 66, 17, 12, 24, 231, 194, 2, \r
+    134, 2, 99, 197, 39, 17, 12, 24, 231, 194, 2, 62, 2, 70, 39, 17, 12, 24, \r
+    231, 194, 2, 62, 2, 99, 197, 39, 17, 12, 24, 70, 2, 62, 2, 62, 39, 17, \r
+    12, 24, 70, 2, 62, 2, 62, 66, 17, 12, 24, 252, 129, 2, 236, 147, 2, 70, \r
+    39, 17, 12, 24, 222, 78, 2, 134, 2, 70, 39, 17, 12, 24, 222, 78, 2, 134, \r
+    2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 236, 147, 2, 70, 39, 17, 12, 24, \r
+    222, 78, 2, 236, 147, 2, 99, 197, 39, 17, 12, 24, 222, 78, 2, 62, 2, 70, \r
+    39, 17, 12, 24, 222, 78, 2, 62, 2, 99, 197, 39, 17, 12, 24, 134, 2, 62, \r
+    2, 70, 39, 17, 12, 24, 134, 2, 111, 2, 99, 197, 39, 17, 12, 24, 134, 2, \r
+    62, 2, 99, 197, 39, 17, 12, 24, 226, 83, 2, 236, 147, 2, 99, 197, 39, 17, \r
+    12, 24, 226, 171, 2, 111, 2, 70, 39, 17, 12, 24, 224, 243, 2, 111, 2, 70, \r
+    39, 17, 12, 24, 249, 203, 2, 111, 2, 70, 39, 17, 12, 24, 235, 161, 2, \r
+    134, 2, 70, 39, 17, 12, 24, 235, 161, 2, 62, 2, 70, 39, 17, 12, 24, 70, \r
+    2, 111, 2, 70, 39, 17, 12, 24, 70, 2, 134, 2, 70, 39, 17, 12, 24, 70, 2, \r
+    62, 2, 70, 39, 17, 12, 24, 62, 2, 62, 2, 70, 39, 17, 12, 24, 228, 149, 2, \r
+    62, 2, 70, 39, 17, 12, 24, 231, 194, 2, 111, 2, 70, 39, 17, 12, 24, 228, \r
+    149, 2, 62, 2, 111, 66, 17, 12, 24, 235, 161, 2, 111, 2, 62, 66, 17, 12, \r
+    24, 254, 192, 2, 62, 2, 70, 39, 17, 12, 24, 236, 247, 2, 62, 2, 70, 39, \r
+    17, 12, 24, 231, 194, 2, 134, 2, 111, 66, 17, 12, 24, 62, 2, 236, 147, 2, \r
+    70, 39, 17, 12, 24, 235, 161, 2, 134, 2, 62, 66, 17, 12, 24, 236, 247, 2, \r
+    62, 2, 62, 39, 17, 12, 24, 235, 161, 2, 134, 2, 62, 39, 17, 12, 24, 231, \r
+    194, 2, 134, 2, 111, 39, 17, 12, 24, 134, 2, 111, 2, 70, 39, 17, 12, 24, \r
+    111, 2, 134, 2, 70, 39, 17, 12, 24, 62, 2, 134, 2, 70, 39, 17, 12, 24, \r
+    245, 222, 2, 62, 2, 70, 39, 17, 12, 24, 252, 129, 2, 111, 2, 70, 39, 17, \r
+    12, 24, 236, 247, 2, 62, 2, 62, 66, 17, 12, 24, 254, 192, 2, 134, 2, 62, \r
+    66, 17, 12, 24, 226, 171, 2, 62, 2, 62, 66, 17, 12, 24, 226, 83, 2, 236, \r
+    147, 2, 70, 39, 17, 12, 24, 231, 194, 2, 134, 2, 70, 39, 17, 12, 24, 226, \r
+    153, 220, 32, 254, 14, 236, 35, 223, 137, 5, 47, 17, 12, 24, 228, 145, \r
+    220, 32, 254, 14, 236, 35, 223, 137, 5, 47, 17, 12, 24, 254, 156, 47, 17, \r
+    12, 24, 254, 179, 47, 17, 12, 24, 233, 130, 47, 17, 12, 24, 226, 154, 47, \r
+    17, 12, 24, 227, 230, 47, 17, 12, 24, 254, 170, 47, 17, 12, 24, 218, 249, \r
+    47, 17, 12, 24, 226, 153, 47, 17, 12, 24, 226, 152, 254, 170, 218, 248, \r
+    12, 24, 237, 120, 227, 146, 55, 12, 24, 252, 61, 254, 65, 254, 66, 41, \r
+    226, 73, 41, 225, 218, 41, 225, 150, 41, 225, 139, 41, 225, 128, 41, 225, \r
+    117, 41, 225, 106, 41, 225, 95, 41, 225, 84, 41, 226, 72, 41, 226, 61, \r
+    41, 226, 50, 41, 226, 39, 41, 226, 28, 41, 226, 17, 41, 226, 6, 228, 238, \r
+    245, 124, 35, 69, 250, 168, 228, 238, 245, 124, 35, 69, 98, 250, 168, \r
+    228, 238, 245, 124, 35, 69, 98, 245, 90, 223, 136, 228, 238, 245, 124, \r
+    35, 69, 250, 175, 228, 238, 245, 124, 35, 69, 225, 67, 228, 238, 245, \r
+    124, 35, 69, 246, 95, 78, 228, 238, 245, 124, 35, 69, 228, 82, 78, 228, \r
+    238, 245, 124, 35, 69, 42, 67, 235, 91, 115, 228, 238, 245, 124, 35, 69, \r
+    45, 67, 235, 91, 252, 16, 228, 238, 245, 124, 35, 69, 186, 246, 208, 36, \r
+    24, 42, 243, 194, 36, 24, 45, 243, 194, 36, 51, 221, 180, 42, 243, 194, \r
+    36, 51, 221, 180, 45, 243, 194, 36, 234, 116, 42, 243, 194, 36, 234, 116, \r
+    45, 243, 194, 36, 250, 151, 234, 115, 228, 238, 245, 124, 35, 69, 124, \r
+    61, 235, 121, 228, 238, 245, 124, 35, 69, 246, 206, 249, 146, 228, 238, \r
+    245, 124, 35, 69, 246, 198, 249, 146, 228, 238, 245, 124, 35, 69, 109, \r
+    235, 43, 228, 238, 245, 124, 35, 69, 218, 235, 109, 235, 43, 228, 238, \r
+    245, 124, 35, 69, 42, 229, 229, 228, 238, 245, 124, 35, 69, 45, 229, 229, \r
+    228, 238, 245, 124, 35, 69, 42, 250, 79, 115, 228, 238, 245, 124, 35, 69, \r
+    45, 250, 79, 115, 228, 238, 245, 124, 35, 69, 42, 221, 114, 224, 236, \r
+    115, 228, 238, 245, 124, 35, 69, 45, 221, 114, 224, 236, 115, 228, 238, \r
+    245, 124, 35, 69, 42, 84, 235, 91, 115, 228, 238, 245, 124, 35, 69, 45, \r
+    84, 235, 91, 115, 228, 238, 245, 124, 35, 69, 42, 51, 254, 120, 115, 228, \r
+    238, 245, 124, 35, 69, 45, 51, 254, 120, 115, 228, 238, 245, 124, 35, 69, \r
+    42, 254, 120, 115, 228, 238, 245, 124, 35, 69, 45, 254, 120, 115, 228, \r
+    238, 245, 124, 35, 69, 42, 250, 124, 115, 228, 238, 245, 124, 35, 69, 45, \r
+    250, 124, 115, 228, 238, 245, 124, 35, 69, 42, 67, 250, 124, 115, 228, \r
+    238, 245, 124, 35, 69, 45, 67, 250, 124, 115, 225, 49, 248, 145, 67, 225, \r
+    49, 248, 145, 228, 238, 245, 124, 35, 69, 42, 40, 115, 228, 238, 245, \r
+    124, 35, 69, 45, 40, 115, 249, 145, 230, 73, 251, 82, 230, 73, 218, 235, \r
+    230, 73, 51, 218, 235, 230, 73, 249, 145, 109, 235, 43, 251, 82, 109, \r
+    235, 43, 218, 235, 109, 235, 43, 3, 250, 168, 3, 98, 250, 168, 3, 245, \r
+    90, 223, 136, 3, 225, 67, 3, 250, 175, 3, 228, 82, 78, 3, 246, 95, 78, 3, \r
+    246, 206, 249, 146, 3, 42, 229, 229, 3, 45, 229, 229, 3, 42, 250, 79, \r
+    115, 3, 45, 250, 79, 115, 3, 42, 221, 114, 224, 236, 115, 3, 45, 221, \r
+    114, 224, 236, 115, 3, 54, 55, 3, 254, 134, 3, 253, 251, 3, 88, 55, 3, \r
+    242, 120, 3, 235, 87, 55, 3, 244, 30, 55, 3, 246, 154, 55, 3, 227, 160, \r
+    224, 17, 3, 248, 155, 55, 3, 229, 169, 55, 3, 250, 167, 253, 244, 12, \r
+    245, 237, 47, 17, 12, 222, 108, 2, 245, 237, 50, 12, 249, 171, 47, 17, \r
+    12, 222, 136, 245, 107, 12, 236, 205, 47, 17, 12, 245, 239, 47, 17, 12, \r
+    245, 239, 128, 17, 12, 249, 173, 47, 17, 12, 249, 173, 128, 17, 12, 236, \r
+    207, 47, 17, 12, 236, 207, 128, 17, 12, 225, 17, 47, 17, 12, 225, 17, \r
+    128, 17, 12, 223, 76, 47, 17, 12, 223, 76, 128, 17, 12, 1, 181, 47, 17, \r
+    12, 1, 99, 2, 234, 111, 71, 47, 17, 12, 1, 99, 2, 234, 111, 71, 39, 17, \r
+    12, 1, 99, 2, 181, 71, 47, 17, 12, 1, 99, 2, 181, 71, 39, 17, 12, 1, 218, \r
+    234, 2, 181, 71, 47, 17, 12, 1, 218, 234, 2, 181, 71, 39, 17, 12, 1, 99, \r
+    2, 181, 252, 118, 47, 17, 12, 1, 99, 2, 181, 252, 118, 39, 17, 12, 1, 70, \r
+    2, 181, 71, 47, 17, 12, 1, 70, 2, 181, 71, 39, 17, 12, 1, 70, 2, 181, 71, \r
+    66, 17, 12, 1, 70, 2, 181, 71, 128, 17, 12, 1, 99, 47, 17, 12, 1, 99, 39, \r
+    17, 12, 1, 252, 129, 47, 17, 12, 1, 252, 129, 39, 17, 12, 1, 252, 129, \r
+    66, 17, 12, 1, 252, 129, 128, 17, 12, 1, 222, 78, 234, 73, 47, 17, 12, 1, \r
+    222, 78, 234, 73, 39, 17, 12, 1, 222, 78, 47, 17, 12, 1, 222, 78, 39, 17, \r
+    12, 1, 222, 78, 66, 17, 12, 1, 222, 78, 128, 17, 12, 1, 222, 20, 47, 17, \r
+    12, 1, 222, 20, 39, 17, 12, 1, 222, 20, 66, 17, 12, 1, 222, 20, 128, 17, \r
+    12, 1, 134, 47, 17, 12, 1, 134, 39, 17, 12, 1, 134, 66, 17, 12, 1, 134, \r
+    128, 17, 12, 1, 111, 47, 17, 12, 1, 111, 39, 17, 12, 1, 111, 66, 17, 12, \r
+    1, 111, 128, 17, 12, 1, 236, 147, 47, 17, 12, 1, 236, 147, 39, 17, 12, 1, \r
+    236, 147, 66, 17, 12, 1, 236, 147, 128, 17, 12, 1, 249, 184, 47, 17, 12, \r
+    1, 249, 184, 39, 17, 12, 1, 222, 30, 47, 17, 12, 1, 222, 30, 39, 17, 12, \r
+    1, 227, 197, 47, 17, 12, 1, 227, 197, 39, 17, 12, 1, 217, 107, 47, 17, \r
+    12, 1, 217, 107, 39, 17, 12, 1, 226, 83, 47, 17, 12, 1, 226, 83, 39, 17, \r
+    12, 1, 226, 83, 66, 17, 12, 1, 226, 83, 128, 17, 12, 1, 224, 243, 47, 17, \r
+    12, 1, 224, 243, 39, 17, 12, 1, 224, 243, 66, 17, 12, 1, 224, 243, 128, \r
+    17, 12, 1, 226, 171, 47, 17, 12, 1, 226, 171, 39, 17, 12, 1, 226, 171, \r
+    66, 17, 12, 1, 226, 171, 128, 17, 12, 1, 249, 203, 47, 17, 12, 1, 249, \r
+    203, 39, 17, 12, 1, 249, 203, 66, 17, 12, 1, 249, 203, 128, 17, 12, 1, \r
+    222, 138, 47, 17, 12, 1, 222, 138, 39, 17, 12, 1, 222, 138, 66, 17, 12, \r
+    1, 222, 138, 128, 17, 12, 1, 217, 110, 47, 17, 12, 1, 217, 110, 39, 17, \r
+    12, 1, 217, 110, 66, 17, 12, 1, 217, 110, 128, 17, 12, 1, 254, 192, 47, \r
+    17, 12, 1, 254, 192, 39, 17, 12, 1, 254, 192, 66, 17, 12, 1, 254, 192, \r
+    128, 17, 12, 1, 244, 123, 47, 17, 12, 1, 244, 123, 39, 17, 12, 1, 244, \r
+    123, 66, 17, 12, 1, 244, 123, 128, 17, 12, 1, 245, 222, 47, 17, 12, 1, \r
+    245, 222, 39, 17, 12, 1, 245, 222, 66, 17, 12, 1, 245, 222, 128, 17, 12, \r
+    1, 228, 149, 47, 17, 12, 1, 228, 149, 39, 17, 12, 1, 228, 149, 66, 17, \r
+    12, 1, 228, 149, 128, 17, 12, 1, 236, 247, 47, 17, 12, 1, 236, 247, 39, \r
+    17, 12, 1, 236, 247, 66, 17, 12, 1, 236, 247, 128, 17, 12, 1, 235, 161, \r
+    47, 17, 12, 1, 235, 161, 39, 17, 12, 1, 235, 161, 66, 17, 12, 1, 235, \r
+    161, 128, 17, 12, 1, 62, 47, 17, 12, 1, 62, 39, 17, 12, 1, 62, 66, 17, \r
+    12, 1, 62, 128, 17, 12, 1, 231, 194, 47, 17, 12, 1, 231, 194, 39, 17, 12, \r
+    1, 231, 194, 66, 17, 12, 1, 231, 194, 128, 17, 12, 1, 243, 147, 47, 17, \r
+    12, 1, 243, 147, 39, 17, 12, 1, 243, 147, 66, 17, 12, 1, 243, 147, 128, \r
+    17, 12, 1, 218, 234, 47, 17, 12, 1, 218, 234, 39, 17, 12, 1, 99, 197, 47, \r
+    17, 12, 1, 99, 197, 39, 17, 12, 1, 70, 47, 17, 12, 1, 70, 39, 17, 12, 1, \r
+    70, 66, 17, 12, 1, 70, 128, 17, 12, 24, 235, 161, 2, 99, 2, 234, 111, 71, \r
+    47, 17, 12, 24, 235, 161, 2, 99, 2, 234, 111, 71, 39, 17, 12, 24, 235, \r
+    161, 2, 99, 2, 181, 71, 47, 17, 12, 24, 235, 161, 2, 99, 2, 181, 71, 39, \r
+    17, 12, 24, 235, 161, 2, 99, 2, 181, 252, 118, 47, 17, 12, 24, 235, 161, \r
+    2, 99, 2, 181, 252, 118, 39, 17, 12, 24, 235, 161, 2, 99, 47, 17, 12, 24, \r
+    235, 161, 2, 99, 39, 17, 217, 85, 218, 199, 231, 203, 223, 254, 110, 246, \r
+    95, 78, 110, 228, 69, 78, 110, 54, 55, 110, 248, 155, 55, 110, 229, 169, \r
+    55, 110, 254, 134, 110, 254, 79, 110, 42, 229, 229, 110, 45, 229, 229, \r
+    110, 253, 251, 110, 88, 55, 110, 250, 168, 110, 242, 120, 110, 245, 90, \r
+    223, 136, 110, 224, 17, 110, 20, 217, 84, 110, 20, 107, 110, 20, 103, \r
+    110, 20, 160, 110, 20, 154, 110, 20, 174, 110, 20, 182, 110, 20, 191, \r
+    110, 20, 185, 110, 20, 190, 110, 250, 175, 110, 225, 67, 110, 235, 87, \r
+    55, 110, 246, 154, 55, 110, 244, 30, 55, 110, 228, 82, 78, 110, 250, 167, \r
+    253, 244, 110, 7, 6, 1, 60, 110, 7, 6, 1, 253, 204, 110, 7, 6, 1, 251, \r
+    202, 110, 7, 6, 1, 250, 46, 110, 7, 6, 1, 73, 110, 7, 6, 1, 246, 74, 110, \r
+    7, 6, 1, 245, 67, 110, 7, 6, 1, 243, 225, 110, 7, 6, 1, 72, 110, 7, 6, 1, \r
+    237, 126, 110, 7, 6, 1, 237, 17, 110, 7, 6, 1, 153, 110, 7, 6, 1, 189, \r
+    110, 7, 6, 1, 207, 110, 7, 6, 1, 74, 110, 7, 6, 1, 230, 59, 110, 7, 6, 1, \r
+    228, 163, 110, 7, 6, 1, 152, 110, 7, 6, 1, 198, 110, 7, 6, 1, 222, 201, \r
+    110, 7, 6, 1, 68, 110, 7, 6, 1, 216, 216, 110, 7, 6, 1, 219, 40, 110, 7, \r
+    6, 1, 218, 151, 110, 7, 6, 1, 218, 90, 110, 7, 6, 1, 217, 157, 110, 42, \r
+    40, 115, 110, 227, 160, 224, 17, 110, 45, 40, 115, 110, 250, 217, 255, 0, \r
+    110, 109, 235, 43, 110, 244, 37, 255, 0, 110, 7, 3, 1, 60, 110, 7, 3, 1, \r
+    253, 204, 110, 7, 3, 1, 251, 202, 110, 7, 3, 1, 250, 46, 110, 7, 3, 1, \r
+    73, 110, 7, 3, 1, 246, 74, 110, 7, 3, 1, 245, 67, 110, 7, 3, 1, 243, 225, \r
+    110, 7, 3, 1, 72, 110, 7, 3, 1, 237, 126, 110, 7, 3, 1, 237, 17, 110, 7, \r
+    3, 1, 153, 110, 7, 3, 1, 189, 110, 7, 3, 1, 207, 110, 7, 3, 1, 74, 110, \r
+    7, 3, 1, 230, 59, 110, 7, 3, 1, 228, 163, 110, 7, 3, 1, 152, 110, 7, 3, \r
+    1, 198, 110, 7, 3, 1, 222, 201, 110, 7, 3, 1, 68, 110, 7, 3, 1, 216, 216, \r
+    110, 7, 3, 1, 219, 40, 110, 7, 3, 1, 218, 151, 110, 7, 3, 1, 218, 90, \r
+    110, 7, 3, 1, 217, 157, 110, 42, 250, 79, 115, 110, 69, 235, 43, 110, 45, \r
+    250, 79, 115, 110, 221, 179, 110, 42, 67, 229, 229, 110, 45, 67, 229, \r
+    229, 93, 98, 245, 90, 223, 136, 93, 42, 250, 124, 115, 93, 45, 250, 124, \r
+    115, 93, 98, 250, 168, 93, 52, 233, 193, 248, 145, 93, 52, 1, 218, 187, \r
+    93, 52, 1, 3, 60, 93, 52, 1, 3, 72, 93, 52, 1, 3, 68, 93, 52, 1, 3, 73, \r
+    93, 52, 1, 3, 74, 93, 52, 1, 3, 184, 93, 52, 1, 3, 217, 200, 93, 52, 1, \r
+    3, 217, 231, 93, 52, 1, 3, 221, 0, 93, 236, 202, 228, 223, 224, 9, 78, \r
+    93, 52, 1, 60, 93, 52, 1, 72, 93, 52, 1, 68, 93, 52, 1, 73, 93, 52, 1, \r
+    74, 93, 52, 1, 175, 93, 52, 1, 236, 113, 93, 52, 1, 236, 7, 93, 52, 1, \r
+    236, 184, 93, 52, 1, 236, 57, 93, 52, 1, 226, 177, 93, 52, 1, 224, 140, \r
+    93, 52, 1, 223, 103, 93, 52, 1, 226, 94, 93, 52, 1, 224, 26, 93, 52, 1, \r
+    222, 155, 93, 52, 1, 221, 205, 93, 52, 1, 221, 0, 93, 52, 1, 222, 87, 93, \r
+    52, 1, 101, 93, 52, 1, 208, 93, 52, 1, 232, 62, 93, 52, 1, 231, 144, 93, \r
+    52, 1, 232, 141, 93, 52, 1, 231, 204, 93, 52, 1, 155, 93, 52, 1, 243, \r
+    112, 93, 52, 1, 242, 173, 93, 52, 1, 243, 162, 93, 52, 1, 243, 4, 93, 52, \r
+    1, 196, 93, 52, 1, 233, 196, 93, 52, 1, 233, 99, 93, 52, 1, 234, 25, 93, \r
+    52, 1, 233, 136, 93, 52, 1, 184, 93, 52, 1, 217, 200, 93, 52, 1, 217, \r
+    231, 93, 52, 1, 203, 93, 52, 1, 227, 147, 93, 52, 1, 227, 22, 93, 52, 1, \r
+    227, 216, 93, 52, 1, 227, 75, 93, 52, 1, 219, 7, 93, 52, 1, 207, 93, 52, \r
+    219, 70, 224, 9, 78, 93, 52, 225, 72, 224, 9, 78, 93, 22, 245, 185, 93, \r
+    22, 1, 236, 86, 93, 22, 1, 223, 211, 93, 22, 1, 236, 79, 93, 22, 1, 232, \r
+    55, 93, 22, 1, 232, 53, 93, 22, 1, 232, 52, 93, 22, 1, 221, 192, 93, 22, \r
+    1, 223, 200, 93, 22, 1, 227, 140, 93, 22, 1, 227, 135, 93, 22, 1, 227, \r
+    132, 93, 22, 1, 227, 125, 93, 22, 1, 227, 120, 93, 22, 1, 227, 115, 93, \r
+    22, 1, 227, 126, 93, 22, 1, 227, 138, 93, 22, 1, 233, 187, 93, 22, 1, \r
+    229, 99, 93, 22, 1, 223, 208, 93, 22, 1, 229, 88, 93, 22, 1, 224, 104, \r
+    93, 22, 1, 223, 205, 93, 22, 1, 238, 22, 93, 22, 1, 250, 230, 93, 22, 1, \r
+    223, 215, 93, 22, 1, 251, 29, 93, 22, 1, 236, 128, 93, 22, 1, 222, 0, 93, \r
+    22, 1, 229, 127, 93, 22, 1, 243, 106, 93, 22, 1, 60, 93, 22, 1, 254, 234, \r
+    93, 22, 1, 184, 93, 22, 1, 218, 65, 93, 22, 1, 246, 168, 93, 22, 1, 73, \r
+    93, 22, 1, 218, 16, 93, 22, 1, 218, 25, 93, 22, 1, 74, 93, 22, 1, 219, 7, \r
+    93, 22, 1, 219, 4, 93, 22, 1, 230, 167, 93, 22, 1, 217, 231, 93, 22, 1, \r
+    68, 93, 22, 1, 218, 219, 93, 22, 1, 218, 227, 93, 22, 1, 218, 204, 93, \r
+    22, 1, 217, 200, 93, 22, 1, 246, 115, 93, 22, 1, 217, 250, 93, 22, 1, 72, \r
+    110, 251, 86, 55, 110, 229, 11, 55, 110, 212, 55, 110, 234, 115, 110, \r
+    252, 1, 135, 110, 218, 19, 55, 110, 218, 182, 55, 93, 245, 122, 170, 219, \r
+    152, 93, 127, 65, 93, 220, 53, 65, 93, 90, 65, 93, 247, 130, 65, 93, 84, \r
+    223, 227, 93, 67, 250, 221, 237, 180, 254, 112, 254, 128, 237, 180, 254, \r
+    112, 225, 54, 237, 180, 254, 112, 222, 56, 230, 178, 227, 179, 251, 55, \r
+    227, 179, 251, 55, 57, 49, 4, 253, 188, 60, 57, 49, 4, 253, 157, 73, 57, \r
+    49, 4, 253, 166, 72, 57, 49, 4, 253, 134, 74, 57, 49, 4, 253, 184, 68, \r
+    57, 49, 4, 253, 203, 249, 207, 57, 49, 4, 253, 150, 249, 92, 57, 49, 4, \r
+    253, 190, 249, 15, 57, 49, 4, 253, 180, 248, 167, 57, 49, 4, 253, 144, \r
+    247, 111, 57, 49, 4, 253, 138, 237, 123, 57, 49, 4, 253, 149, 237, 114, \r
+    57, 49, 4, 253, 159, 237, 59, 57, 49, 4, 253, 130, 237, 43, 57, 49, 4, \r
+    253, 118, 175, 57, 49, 4, 253, 151, 236, 184, 57, 49, 4, 253, 128, 236, \r
+    113, 57, 49, 4, 253, 125, 236, 57, 57, 49, 4, 253, 114, 236, 7, 57, 49, \r
+    4, 253, 115, 196, 57, 49, 4, 253, 181, 234, 25, 57, 49, 4, 253, 122, 233, \r
+    196, 57, 49, 4, 253, 179, 233, 136, 57, 49, 4, 253, 171, 233, 99, 57, 49, \r
+    4, 253, 192, 208, 57, 49, 4, 253, 170, 232, 141, 57, 49, 4, 253, 164, \r
+    232, 62, 57, 49, 4, 253, 143, 231, 204, 57, 49, 4, 253, 140, 231, 144, \r
+    57, 49, 4, 253, 199, 187, 57, 49, 4, 253, 123, 229, 198, 57, 49, 4, 253, \r
+    156, 229, 108, 57, 49, 4, 253, 183, 229, 37, 57, 49, 4, 253, 145, 228, \r
+    202, 57, 49, 4, 253, 178, 228, 155, 57, 49, 4, 253, 117, 228, 136, 57, \r
+    49, 4, 253, 173, 228, 121, 57, 49, 4, 253, 162, 228, 110, 57, 49, 4, 253, \r
+    135, 203, 57, 49, 4, 253, 167, 227, 216, 57, 49, 4, 253, 142, 227, 147, \r
+    57, 49, 4, 253, 201, 227, 75, 57, 49, 4, 253, 168, 227, 22, 57, 49, 4, \r
+    253, 163, 226, 177, 57, 49, 4, 253, 186, 226, 94, 57, 49, 4, 253, 154, \r
+    224, 140, 57, 49, 4, 253, 182, 224, 26, 57, 49, 4, 253, 137, 223, 103, \r
+    57, 49, 4, 253, 136, 222, 155, 57, 49, 4, 253, 197, 222, 87, 57, 49, 4, \r
+    253, 158, 221, 205, 57, 49, 4, 253, 195, 101, 57, 49, 4, 253, 126, 221, \r
+    0, 57, 49, 4, 253, 141, 219, 7, 57, 49, 4, 253, 120, 218, 227, 57, 49, 4, \r
+    253, 155, 218, 204, 57, 49, 4, 253, 153, 218, 187, 57, 49, 4, 253, 177, \r
+    217, 114, 57, 49, 4, 253, 121, 217, 92, 57, 49, 4, 253, 174, 217, 21, 57, \r
+    49, 4, 253, 169, 255, 60, 57, 49, 4, 253, 152, 255, 59, 57, 49, 4, 253, \r
+    111, 253, 232, 57, 49, 4, 253, 124, 247, 82, 57, 49, 4, 253, 107, 247, \r
+    81, 57, 49, 4, 253, 147, 231, 85, 57, 49, 4, 253, 165, 228, 201, 57, 49, \r
+    4, 253, 133, 228, 204, 57, 49, 4, 253, 119, 228, 2, 57, 49, 4, 253, 161, \r
+    228, 1, 57, 49, 4, 253, 127, 227, 74, 57, 49, 4, 253, 129, 222, 153, 57, \r
+    49, 4, 253, 109, 220, 223, 57, 49, 4, 253, 106, 103, 57, 49, 16, 253, \r
+    176, 57, 49, 16, 253, 175, 57, 49, 16, 253, 172, 57, 49, 16, 253, 160, \r
+    57, 49, 16, 253, 148, 57, 49, 16, 253, 146, 57, 49, 16, 253, 139, 57, 49, \r
+    16, 253, 132, 57, 49, 16, 253, 131, 57, 49, 16, 253, 116, 57, 49, 16, \r
+    253, 113, 57, 49, 16, 253, 112, 57, 49, 16, 253, 110, 57, 49, 16, 253, \r
+    108, 57, 49, 97, 253, 105, 234, 86, 57, 49, 97, 253, 104, 218, 183, 57, \r
+    49, 97, 253, 103, 249, 80, 57, 49, 97, 253, 102, 246, 151, 57, 49, 97, \r
+    253, 101, 234, 68, 57, 49, 97, 253, 100, 223, 162, 57, 49, 97, 253, 99, \r
+    246, 100, 57, 49, 97, 253, 98, 227, 239, 57, 49, 97, 253, 97, 224, 245, \r
+    57, 49, 97, 253, 96, 243, 161, 57, 49, 97, 253, 95, 224, 4, 57, 49, 97, \r
+    253, 94, 252, 39, 57, 49, 97, 253, 93, 250, 110, 57, 49, 97, 253, 92, \r
+    251, 243, 57, 49, 97, 253, 91, 218, 212, 57, 49, 97, 253, 90, 252, 198, \r
+    57, 49, 97, 253, 89, 230, 147, 57, 49, 97, 253, 88, 223, 244, 57, 49, 97, \r
+    253, 87, 250, 54, 57, 49, 233, 125, 253, 86, 236, 223, 57, 49, 233, 125, \r
+    253, 85, 236, 231, 57, 49, 97, 253, 84, 230, 157, 57, 49, 97, 253, 83, \r
+    218, 192, 57, 49, 97, 253, 82, 57, 49, 233, 125, 253, 81, 254, 44, 57, \r
+    49, 233, 125, 253, 80, 233, 247, 57, 49, 97, 253, 79, 252, 0, 57, 49, 97, \r
+    253, 78, 244, 62, 57, 49, 97, 253, 77, 57, 49, 97, 253, 76, 218, 177, 57, \r
+    49, 97, 253, 75, 57, 49, 97, 253, 74, 57, 49, 97, 253, 73, 242, 189, 57, \r
+    49, 97, 253, 72, 57, 49, 97, 253, 71, 57, 49, 97, 253, 70, 57, 49, 233, \r
+    125, 253, 68, 220, 235, 57, 49, 97, 253, 67, 57, 49, 97, 253, 66, 57, 49, \r
+    97, 253, 65, 250, 192, 57, 49, 97, 253, 64, 57, 49, 97, 253, 63, 57, 49, \r
+    97, 253, 62, 244, 218, 57, 49, 97, 253, 61, 254, 31, 57, 49, 97, 253, 60, \r
+    57, 49, 97, 253, 59, 57, 49, 97, 253, 58, 57, 49, 97, 253, 57, 57, 49, \r
+    97, 253, 56, 57, 49, 97, 253, 55, 57, 49, 97, 253, 54, 57, 49, 97, 253, \r
+    53, 57, 49, 97, 253, 52, 57, 49, 97, 253, 51, 233, 120, 57, 49, 97, 253, \r
+    50, 57, 49, 97, 253, 49, 221, 98, 57, 49, 97, 253, 48, 57, 49, 97, 253, \r
+    47, 57, 49, 97, 253, 46, 57, 49, 97, 253, 45, 57, 49, 97, 253, 44, 57, \r
+    49, 97, 253, 43, 57, 49, 97, 253, 42, 57, 49, 97, 253, 41, 57, 49, 97, \r
+    253, 40, 57, 49, 97, 253, 39, 57, 49, 97, 253, 38, 57, 49, 97, 253, 37, \r
+    243, 140, 57, 49, 97, 253, 16, 245, 131, 57, 49, 97, 253, 13, 252, 182, \r
+    57, 49, 97, 253, 8, 223, 249, 57, 49, 97, 253, 7, 65, 57, 49, 97, 253, 6, \r
+    57, 49, 97, 253, 5, 223, 25, 57, 49, 97, 253, 4, 57, 49, 97, 253, 3, 57, \r
+    49, 97, 253, 2, 218, 208, 251, 52, 57, 49, 97, 253, 1, 251, 52, 57, 49, \r
+    97, 253, 0, 251, 53, 245, 105, 57, 49, 97, 252, 255, 218, 210, 57, 49, \r
+    97, 252, 254, 57, 49, 97, 252, 253, 57, 49, 233, 125, 252, 252, 248, 211, \r
+    57, 49, 97, 252, 251, 57, 49, 97, 252, 250, 57, 49, 97, 252, 248, 57, 49, \r
+    97, 252, 247, 57, 49, 97, 252, 246, 57, 49, 97, 252, 245, 249, 149, 57, \r
+    49, 97, 252, 244, 57, 49, 97, 252, 243, 57, 49, 97, 252, 242, 57, 49, 97, \r
+    252, 241, 57, 49, 97, 252, 240, 57, 49, 97, 219, 99, 253, 69, 57, 49, 97, \r
+    219, 99, 253, 36, 57, 49, 97, 219, 99, 253, 35, 57, 49, 97, 219, 99, 253, \r
+    34, 57, 49, 97, 219, 99, 253, 33, 57, 49, 97, 219, 99, 253, 32, 57, 49, \r
+    97, 219, 99, 253, 31, 57, 49, 97, 219, 99, 253, 30, 57, 49, 97, 219, 99, \r
+    253, 29, 57, 49, 97, 219, 99, 253, 28, 57, 49, 97, 219, 99, 253, 27, 57, \r
+    49, 97, 219, 99, 253, 26, 57, 49, 97, 219, 99, 253, 25, 57, 49, 97, 219, \r
+    99, 253, 24, 57, 49, 97, 219, 99, 253, 23, 57, 49, 97, 219, 99, 253, 22, \r
+    57, 49, 97, 219, 99, 253, 21, 57, 49, 97, 219, 99, 253, 20, 57, 49, 97, \r
+    219, 99, 253, 19, 57, 49, 97, 219, 99, 253, 18, 57, 49, 97, 219, 99, 253, \r
+    17, 57, 49, 97, 219, 99, 253, 15, 57, 49, 97, 219, 99, 253, 14, 57, 49, \r
+    97, 219, 99, 253, 12, 57, 49, 97, 219, 99, 253, 11, 57, 49, 97, 219, 99, \r
+    253, 10, 57, 49, 97, 219, 99, 253, 9, 57, 49, 97, 219, 99, 252, 249, 57, \r
+    49, 97, 219, 99, 252, 239, 254, 227, 218, 174, 225, 55, 235, 43, 254, \r
+    227, 218, 174, 225, 55, 248, 145, 254, 227, 251, 45, 78, 254, 227, 54, \r
+    107, 254, 227, 54, 103, 254, 227, 54, 160, 254, 227, 54, 154, 254, 227, \r
+    54, 174, 254, 227, 54, 182, 254, 227, 54, 191, 254, 227, 54, 185, 254, \r
+    227, 54, 190, 254, 227, 54, 222, 65, 254, 227, 54, 220, 219, 254, 227, \r
+    54, 221, 245, 254, 227, 54, 245, 119, 254, 227, 54, 245, 196, 254, 227, \r
+    54, 224, 69, 254, 227, 54, 225, 38, 254, 227, 54, 246, 227, 254, 227, 54, \r
+    232, 27, 254, 227, 54, 131, 242, 161, 254, 227, 54, 124, 242, 161, 254, \r
+    227, 54, 148, 242, 161, 254, 227, 54, 245, 116, 242, 161, 254, 227, 54, \r
+    245, 170, 242, 161, 254, 227, 54, 224, 82, 242, 161, 254, 227, 54, 225, \r
+    43, 242, 161, 254, 227, 54, 246, 235, 242, 161, 254, 227, 54, 232, 31, \r
+    242, 161, 254, 227, 54, 131, 221, 231, 254, 227, 54, 124, 221, 231, 254, \r
+    227, 54, 148, 221, 231, 254, 227, 54, 245, 116, 221, 231, 254, 227, 54, \r
+    245, 170, 221, 231, 254, 227, 54, 224, 82, 221, 231, 254, 227, 54, 225, \r
+    43, 221, 231, 254, 227, 54, 246, 235, 221, 231, 254, 227, 54, 232, 31, \r
+    221, 231, 254, 227, 54, 222, 66, 221, 231, 254, 227, 54, 220, 220, 221, \r
+    231, 254, 227, 54, 221, 246, 221, 231, 254, 227, 54, 245, 120, 221, 231, \r
+    254, 227, 54, 245, 197, 221, 231, 254, 227, 54, 224, 70, 221, 231, 254, \r
+    227, 54, 225, 39, 221, 231, 254, 227, 54, 246, 228, 221, 231, 254, 227, \r
+    54, 232, 28, 221, 231, 254, 227, 218, 222, 252, 190, 220, 72, 254, 227, \r
+    218, 222, 245, 178, 223, 88, 254, 227, 218, 222, 226, 90, 223, 88, 254, \r
+    227, 218, 222, 221, 252, 223, 88, 254, 227, 218, 222, 245, 110, 223, 88, \r
+    254, 227, 247, 114, 234, 24, 245, 178, 223, 88, 254, 227, 235, 31, 234, \r
+    24, 245, 178, 223, 88, 254, 227, 234, 24, 226, 90, 223, 88, 254, 227, \r
+    234, 24, 221, 252, 223, 88, 23, 254, 251, 253, 234, 131, 228, 89, 23, \r
+    254, 251, 253, 234, 131, 243, 194, 23, 254, 251, 253, 234, 131, 247, 126, \r
+    23, 254, 251, 253, 234, 174, 23, 254, 251, 253, 234, 245, 196, 23, 254, \r
+    251, 253, 234, 245, 170, 242, 161, 23, 254, 251, 253, 234, 245, 170, 221, \r
+    231, 23, 254, 251, 253, 234, 245, 197, 221, 231, 23, 254, 251, 253, 234, \r
+    245, 170, 222, 126, 23, 254, 251, 253, 234, 222, 66, 222, 126, 23, 254, \r
+    251, 253, 234, 245, 197, 222, 126, 23, 254, 251, 253, 234, 131, 242, 162, \r
+    222, 126, 23, 254, 251, 253, 234, 245, 170, 242, 162, 222, 126, 23, 254, \r
+    251, 253, 234, 131, 221, 232, 222, 126, 23, 254, 251, 253, 234, 245, 170, \r
+    221, 232, 222, 126, 23, 254, 251, 253, 234, 245, 170, 223, 153, 23, 254, \r
+    251, 253, 234, 222, 66, 223, 153, 23, 254, 251, 253, 234, 245, 197, 223, \r
+    153, 23, 254, 251, 253, 234, 131, 242, 162, 223, 153, 23, 254, 251, 253, \r
+    234, 245, 170, 242, 162, 223, 153, 23, 254, 251, 253, 234, 131, 221, 232, \r
+    223, 153, 23, 254, 251, 253, 234, 222, 66, 221, 232, 223, 153, 23, 254, \r
+    251, 253, 234, 245, 197, 221, 232, 223, 153, 23, 254, 251, 253, 234, 222, \r
+    66, 233, 139, 23, 254, 251, 243, 134, 131, 229, 49, 23, 254, 251, 222, 8, \r
+    107, 23, 254, 251, 243, 132, 107, 23, 254, 251, 246, 159, 103, 23, 254, \r
+    251, 222, 8, 103, 23, 254, 251, 250, 51, 124, 247, 125, 23, 254, 251, \r
+    246, 159, 124, 247, 125, 23, 254, 251, 221, 71, 174, 23, 254, 251, 221, \r
+    71, 222, 65, 23, 254, 251, 221, 71, 222, 66, 254, 144, 17, 23, 254, 251, \r
+    243, 132, 222, 65, 23, 254, 251, 233, 240, 222, 65, 23, 254, 251, 222, 8, \r
+    222, 65, 23, 254, 251, 222, 8, 221, 245, 23, 254, 251, 221, 71, 245, 196, \r
+    23, 254, 251, 221, 71, 245, 197, 254, 144, 17, 23, 254, 251, 243, 132, \r
+    245, 196, 23, 254, 251, 222, 8, 245, 196, 23, 254, 251, 222, 8, 131, 242, \r
+    161, 23, 254, 251, 222, 8, 148, 242, 161, 23, 254, 251, 246, 159, 245, \r
+    170, 242, 161, 23, 254, 251, 221, 71, 245, 170, 242, 161, 23, 254, 251, \r
+    222, 8, 245, 170, 242, 161, 23, 254, 251, 251, 126, 245, 170, 242, 161, \r
+    23, 254, 251, 232, 200, 245, 170, 242, 161, 23, 254, 251, 222, 8, 131, \r
+    221, 231, 23, 254, 251, 222, 8, 245, 170, 221, 231, 23, 254, 251, 249, \r
+    65, 245, 170, 233, 139, 23, 254, 251, 223, 127, 245, 197, 233, 139, 23, \r
+    131, 144, 55, 23, 131, 144, 5, 254, 144, 17, 23, 124, 221, 250, 55, 23, \r
+    148, 228, 88, 55, 23, 218, 23, 55, 23, 222, 127, 55, 23, 247, 127, 55, \r
+    23, 230, 175, 55, 23, 124, 230, 174, 55, 23, 148, 230, 174, 55, 23, 245, \r
+    116, 230, 174, 55, 23, 245, 170, 230, 174, 55, 23, 233, 235, 55, 23, 235, \r
+    210, 252, 190, 55, 23, 235, 26, 55, 23, 230, 84, 55, 23, 218, 132, 55, \r
+    23, 254, 16, 55, 23, 254, 27, 55, 23, 244, 42, 55, 23, 221, 58, 252, 190, \r
+    55, 23, 217, 85, 55, 227, 68, 225, 35, 55, 227, 68, 220, 83, 55, 227, 68, \r
+    225, 59, 55, 227, 68, 225, 33, 55, 227, 68, 248, 226, 225, 33, 55, 227, \r
+    68, 224, 120, 55, 227, 68, 249, 61, 55, 227, 68, 228, 76, 55, 227, 68, \r
+    225, 47, 55, 227, 68, 247, 93, 55, 227, 68, 254, 14, 55, 227, 68, 251, \r
+    81, 55, 229, 137, 248, 205, 5, 229, 192, 229, 137, 248, 205, 5, 229, 44, \r
+    243, 159, 229, 137, 248, 205, 5, 222, 109, 243, 159, 229, 137, 248, 205, \r
+    5, 251, 139, 229, 137, 248, 205, 5, 251, 24, 229, 137, 248, 205, 5, 218, \r
+    183, 229, 137, 248, 205, 5, 243, 140, 229, 137, 248, 205, 5, 244, 210, \r
+    229, 137, 248, 205, 5, 221, 204, 229, 137, 248, 205, 5, 65, 229, 137, \r
+    248, 205, 5, 252, 24, 229, 137, 248, 205, 5, 224, 218, 229, 137, 248, \r
+    205, 5, 250, 187, 229, 137, 248, 205, 5, 234, 85, 229, 137, 248, 205, 5, \r
+    234, 48, 229, 137, 248, 205, 5, 226, 122, 229, 137, 248, 205, 5, 235, 64, \r
+    229, 137, 248, 205, 5, 252, 33, 229, 137, 248, 205, 5, 251, 129, 229, 51, \r
+    229, 137, 248, 205, 5, 248, 156, 229, 137, 248, 205, 5, 250, 172, 229, \r
+    137, 248, 205, 5, 224, 50, 229, 137, 248, 205, 5, 250, 173, 229, 137, \r
+    248, 205, 5, 252, 134, 229, 137, 248, 205, 5, 224, 206, 229, 137, 248, \r
+    205, 5, 242, 189, 229, 137, 248, 205, 5, 243, 111, 229, 137, 248, 205, 5, \r
+    251, 240, 235, 106, 229, 137, 248, 205, 5, 251, 124, 229, 137, 248, 205, \r
+    5, 227, 239, 229, 137, 248, 205, 5, 247, 13, 229, 137, 248, 205, 5, 247, \r
+    133, 229, 137, 248, 205, 5, 220, 247, 229, 137, 248, 205, 5, 252, 137, \r
+    229, 137, 248, 205, 5, 229, 52, 221, 98, 229, 137, 248, 205, 5, 219, 84, \r
+    229, 137, 248, 205, 5, 229, 244, 229, 137, 248, 205, 5, 227, 62, 229, \r
+    137, 248, 205, 5, 235, 52, 229, 137, 248, 205, 5, 230, 69, 252, 233, 229, \r
+    137, 248, 205, 5, 245, 143, 229, 137, 248, 205, 5, 244, 38, 229, 137, \r
+    248, 205, 5, 223, 128, 229, 137, 248, 205, 5, 3, 253, 213, 229, 137, 248, \r
+    205, 5, 218, 235, 252, 206, 229, 137, 248, 205, 5, 36, 230, 177, 92, 234, \r
+    197, 1, 60, 234, 197, 1, 73, 234, 197, 1, 253, 204, 234, 197, 1, 252, 95, \r
+    234, 197, 1, 245, 67, 234, 197, 1, 250, 46, 234, 197, 1, 72, 234, 197, 1, \r
+    219, 40, 234, 197, 1, 217, 157, 234, 197, 1, 222, 37, 234, 197, 1, 237, \r
+    126, 234, 197, 1, 237, 17, 234, 197, 1, 228, 163, 234, 197, 1, 153, 234, \r
+    197, 1, 189, 234, 197, 1, 207, 234, 197, 1, 233, 140, 234, 197, 1, 231, \r
+    218, 234, 197, 1, 68, 234, 197, 1, 230, 59, 234, 197, 1, 236, 75, 234, \r
+    197, 1, 152, 234, 197, 1, 198, 234, 197, 1, 222, 201, 234, 197, 1, 221, \r
+    32, 234, 197, 1, 254, 131, 234, 197, 1, 246, 197, 234, 197, 1, 243, 225, \r
+    234, 197, 1, 218, 151, 251, 133, 1, 60, 251, 133, 1, 230, 45, 251, 133, \r
+    1, 250, 46, 251, 133, 1, 153, 251, 133, 1, 220, 21, 251, 133, 1, 152, \r
+    251, 133, 1, 235, 126, 251, 133, 1, 255, 60, 251, 133, 1, 228, 163, 251, \r
+    133, 1, 253, 204, 251, 133, 1, 189, 251, 133, 1, 74, 251, 133, 1, 249, \r
+    209, 251, 133, 1, 222, 201, 251, 133, 1, 225, 27, 251, 133, 1, 225, 26, \r
+    251, 133, 1, 198, 251, 133, 1, 251, 201, 251, 133, 1, 68, 251, 133, 1, \r
+    231, 218, 251, 133, 1, 218, 151, 251, 133, 1, 207, 251, 133, 1, 221, 31, \r
+    251, 133, 1, 230, 59, 251, 133, 1, 223, 219, 251, 133, 1, 72, 251, 133, \r
+    1, 73, 251, 133, 1, 220, 18, 251, 133, 1, 237, 17, 251, 133, 1, 237, 8, \r
+    251, 133, 1, 232, 170, 251, 133, 1, 220, 23, 251, 133, 1, 245, 67, 251, \r
+    133, 1, 245, 2, 251, 133, 1, 223, 168, 251, 133, 1, 223, 167, 251, 133, \r
+    1, 232, 117, 251, 133, 1, 237, 255, 251, 133, 1, 251, 200, 251, 133, 1, \r
+    221, 32, 251, 133, 1, 220, 20, 251, 133, 1, 227, 53, 251, 133, 1, 234, \r
+    41, 251, 133, 1, 234, 40, 251, 133, 1, 234, 39, 251, 133, 1, 234, 38, \r
+    251, 133, 1, 235, 125, 251, 133, 1, 247, 17, 251, 133, 1, 220, 19, 48, \r
+    30, 1, 60, 48, 30, 1, 252, 144, 48, 30, 1, 236, 184, 48, 30, 1, 249, 92, \r
+    48, 30, 1, 73, 48, 30, 1, 219, 165, 48, 30, 1, 217, 92, 48, 30, 1, 243, \r
+    162, 48, 30, 1, 222, 22, 48, 30, 1, 72, 48, 30, 1, 175, 48, 30, 1, 246, \r
+    217, 48, 30, 1, 246, 205, 48, 30, 1, 246, 197, 48, 30, 1, 246, 133, 48, \r
+    30, 1, 74, 48, 30, 1, 229, 198, 48, 30, 1, 224, 246, 48, 30, 1, 236, 7, \r
+    48, 30, 1, 246, 148, 48, 30, 1, 246, 138, 48, 30, 1, 222, 87, 48, 30, 1, \r
+    68, 48, 30, 1, 246, 220, 48, 30, 1, 229, 132, 48, 30, 1, 236, 137, 48, \r
+    30, 1, 246, 244, 48, 30, 1, 246, 140, 48, 30, 1, 251, 46, 48, 30, 1, 237, \r
+    255, 48, 30, 1, 220, 23, 48, 30, 231, 107, 107, 48, 30, 231, 107, 174, \r
+    48, 30, 231, 107, 222, 65, 48, 30, 231, 107, 245, 196, 244, 50, 1, 254, \r
+    199, 244, 50, 1, 252, 219, 244, 50, 1, 244, 100, 244, 50, 1, 249, 191, \r
+    244, 50, 1, 254, 195, 244, 50, 1, 228, 146, 244, 50, 1, 237, 136, 244, \r
+    50, 1, 243, 204, 244, 50, 1, 221, 241, 244, 50, 1, 246, 226, 244, 50, 1, \r
+    235, 241, 244, 50, 1, 235, 170, 244, 50, 1, 234, 82, 244, 50, 1, 232, \r
+    202, 244, 50, 1, 237, 108, 244, 50, 1, 220, 37, 244, 50, 1, 230, 31, 244, \r
+    50, 1, 232, 27, 244, 50, 1, 227, 245, 244, 50, 1, 226, 123, 244, 50, 1, \r
+    222, 74, 244, 50, 1, 218, 191, 244, 50, 1, 245, 249, 244, 50, 1, 238, 3, \r
+    244, 50, 1, 242, 152, 244, 50, 1, 230, 91, 244, 50, 1, 232, 31, 242, 161, \r
+    220, 106, 1, 254, 150, 220, 106, 1, 252, 102, 220, 106, 1, 244, 232, 220, \r
+    106, 1, 236, 149, 220, 106, 1, 249, 62, 220, 106, 1, 243, 4, 220, 106, 1, \r
+    218, 187, 220, 106, 1, 217, 83, 220, 106, 1, 242, 185, 220, 106, 1, 222, \r
+    50, 220, 106, 1, 217, 220, 220, 106, 1, 236, 246, 220, 106, 1, 224, 209, \r
+    220, 106, 1, 235, 156, 220, 106, 1, 234, 1, 220, 106, 1, 249, 33, 220, \r
+    106, 1, 231, 103, 220, 106, 1, 217, 13, 220, 106, 1, 226, 144, 220, 106, \r
+    1, 254, 191, 220, 106, 1, 228, 202, 220, 106, 1, 226, 169, 220, 106, 1, \r
+    228, 103, 220, 106, 1, 227, 231, 220, 106, 1, 222, 26, 220, 106, 1, 244, \r
+    122, 220, 106, 1, 101, 220, 106, 1, 72, 220, 106, 1, 68, 220, 106, 1, \r
+    223, 178, 220, 106, 218, 174, 248, 191, 48, 229, 159, 5, 60, 48, 229, \r
+    159, 5, 72, 48, 229, 159, 5, 68, 48, 229, 159, 5, 175, 48, 229, 159, 5, \r
+    236, 7, 48, 229, 159, 5, 245, 0, 48, 229, 159, 5, 244, 17, 48, 229, 159, \r
+    5, 218, 138, 48, 229, 159, 5, 251, 169, 48, 229, 159, 5, 237, 123, 48, \r
+    229, 159, 5, 237, 98, 48, 229, 159, 5, 222, 155, 48, 229, 159, 5, 221, 0, \r
+    48, 229, 159, 5, 249, 207, 48, 229, 159, 5, 249, 15, 48, 229, 159, 5, \r
+    247, 111, 48, 229, 159, 5, 222, 35, 48, 229, 159, 5, 187, 48, 229, 159, \r
+    5, 252, 237, 48, 229, 159, 5, 246, 8, 48, 229, 159, 5, 208, 48, 229, 159, \r
+    5, 231, 144, 48, 229, 159, 5, 196, 48, 229, 159, 5, 233, 196, 48, 229, \r
+    159, 5, 233, 99, 48, 229, 159, 5, 184, 48, 229, 159, 5, 219, 189, 48, \r
+    229, 159, 5, 219, 94, 48, 229, 159, 5, 203, 48, 229, 159, 5, 227, 22, 48, \r
+    229, 159, 5, 235, 188, 48, 229, 159, 5, 226, 177, 48, 229, 159, 5, 217, \r
+    114, 48, 229, 159, 5, 225, 25, 48, 229, 159, 5, 223, 218, 48, 229, 159, \r
+    5, 155, 48, 229, 159, 5, 253, 227, 48, 229, 159, 5, 253, 226, 48, 229, \r
+    159, 5, 253, 225, 48, 229, 159, 5, 218, 115, 48, 229, 159, 5, 249, 188, \r
+    48, 229, 159, 5, 249, 187, 48, 229, 159, 5, 252, 224, 48, 229, 159, 5, \r
+    251, 220, 48, 229, 159, 218, 174, 248, 191, 48, 229, 159, 54, 107, 48, \r
+    229, 159, 54, 103, 48, 229, 159, 54, 222, 65, 48, 229, 159, 54, 220, 219, \r
+    48, 229, 159, 54, 242, 161, 161, 6, 1, 171, 72, 161, 6, 1, 171, 73, 161, \r
+    6, 1, 171, 60, 161, 6, 1, 171, 254, 202, 161, 6, 1, 171, 74, 161, 6, 1, \r
+    171, 230, 127, 161, 6, 1, 224, 192, 72, 161, 6, 1, 224, 192, 73, 161, 6, \r
+    1, 224, 192, 60, 161, 6, 1, 224, 192, 254, 202, 161, 6, 1, 224, 192, 74, \r
+    161, 6, 1, 224, 192, 230, 127, 161, 6, 1, 253, 212, 161, 6, 1, 230, 70, \r
+    161, 6, 1, 218, 165, 161, 6, 1, 218, 22, 161, 6, 1, 243, 225, 161, 6, 1, \r
+    229, 191, 161, 6, 1, 252, 137, 161, 6, 1, 222, 80, 161, 6, 1, 249, 82, \r
+    161, 6, 1, 251, 43, 161, 6, 1, 237, 113, 161, 6, 1, 236, 191, 161, 6, 1, \r
+    244, 208, 161, 6, 1, 246, 244, 161, 6, 1, 219, 160, 161, 6, 1, 246, 118, \r
+    161, 6, 1, 222, 21, 161, 6, 1, 246, 138, 161, 6, 1, 217, 90, 161, 6, 1, \r
+    246, 133, 161, 6, 1, 217, 71, 161, 6, 1, 246, 148, 161, 6, 1, 246, 217, \r
+    161, 6, 1, 246, 205, 161, 6, 1, 246, 197, 161, 6, 1, 246, 185, 161, 6, 1, \r
+    230, 158, 161, 6, 1, 246, 101, 161, 3, 1, 171, 72, 161, 3, 1, 171, 73, \r
+    161, 3, 1, 171, 60, 161, 3, 1, 171, 254, 202, 161, 3, 1, 171, 74, 161, 3, \r
+    1, 171, 230, 127, 161, 3, 1, 224, 192, 72, 161, 3, 1, 224, 192, 73, 161, \r
+    3, 1, 224, 192, 60, 161, 3, 1, 224, 192, 254, 202, 161, 3, 1, 224, 192, \r
+    74, 161, 3, 1, 224, 192, 230, 127, 161, 3, 1, 253, 212, 161, 3, 1, 230, \r
+    70, 161, 3, 1, 218, 165, 161, 3, 1, 218, 22, 161, 3, 1, 243, 225, 161, 3, \r
+    1, 229, 191, 161, 3, 1, 252, 137, 161, 3, 1, 222, 80, 161, 3, 1, 249, 82, \r
+    161, 3, 1, 251, 43, 161, 3, 1, 237, 113, 161, 3, 1, 236, 191, 161, 3, 1, \r
+    244, 208, 161, 3, 1, 246, 244, 161, 3, 1, 219, 160, 161, 3, 1, 246, 118, \r
+    161, 3, 1, 222, 21, 161, 3, 1, 246, 138, 161, 3, 1, 217, 90, 161, 3, 1, \r
+    246, 133, 161, 3, 1, 217, 71, 161, 3, 1, 246, 148, 161, 3, 1, 246, 217, \r
+    161, 3, 1, 246, 205, 161, 3, 1, 246, 197, 161, 3, 1, 246, 185, 161, 3, 1, \r
+    230, 158, 161, 3, 1, 246, 101, 224, 252, 1, 229, 190, 224, 252, 1, 221, \r
+    113, 224, 252, 1, 236, 112, 224, 252, 1, 245, 226, 224, 252, 1, 221, 255, \r
+    224, 252, 1, 224, 26, 224, 252, 1, 223, 50, 224, 252, 1, 250, 245, 224, \r
+    252, 1, 218, 24, 224, 252, 1, 242, 160, 224, 252, 1, 252, 83, 224, 252, \r
+    1, 249, 91, 224, 252, 1, 244, 242, 224, 252, 1, 219, 60, 224, 252, 1, \r
+    222, 3, 224, 252, 1, 217, 19, 224, 252, 1, 234, 23, 224, 252, 1, 237, 41, \r
+    224, 252, 1, 218, 185, 224, 252, 1, 243, 213, 224, 252, 1, 235, 3, 224, \r
+    252, 1, 233, 160, 224, 252, 1, 238, 6, 224, 252, 1, 246, 243, 224, 252, \r
+    1, 254, 7, 224, 252, 1, 254, 237, 224, 252, 1, 230, 138, 224, 252, 1, \r
+    218, 177, 224, 252, 1, 230, 83, 224, 252, 1, 254, 202, 224, 252, 1, 227, \r
+    72, 224, 252, 1, 231, 103, 224, 252, 1, 247, 2, 224, 252, 1, 254, 207, \r
+    224, 252, 1, 242, 65, 224, 252, 1, 220, 63, 224, 252, 1, 230, 183, 224, \r
+    252, 1, 230, 121, 224, 252, 1, 230, 157, 224, 252, 1, 253, 215, 224, 252, \r
+    1, 254, 45, 224, 252, 1, 230, 105, 224, 252, 1, 254, 188, 224, 252, 1, \r
+    246, 142, 224, 252, 1, 254, 24, 224, 252, 1, 247, 11, 224, 252, 1, 242, \r
+    71, 224, 252, 1, 217, 255, 230, 93, 1, 254, 168, 230, 93, 1, 252, 237, \r
+    230, 93, 1, 222, 155, 230, 93, 1, 237, 123, 230, 93, 1, 218, 138, 230, \r
+    93, 1, 236, 149, 230, 93, 1, 249, 81, 230, 93, 1, 203, 230, 93, 1, 226, \r
+    177, 230, 93, 1, 224, 215, 230, 93, 1, 249, 36, 230, 93, 1, 251, 116, \r
+    230, 93, 1, 245, 0, 230, 93, 1, 246, 8, 230, 93, 1, 228, 153, 230, 93, 1, \r
+    237, 4, 230, 93, 1, 235, 184, 230, 93, 1, 233, 170, 230, 93, 1, 231, 89, \r
+    230, 93, 1, 218, 233, 230, 93, 1, 155, 230, 93, 1, 184, 230, 93, 1, 60, \r
+    230, 93, 1, 73, 230, 93, 1, 72, 230, 93, 1, 74, 230, 93, 1, 68, 230, 93, \r
+    1, 255, 58, 230, 93, 1, 246, 250, 230, 93, 1, 230, 127, 230, 93, 20, 217, \r
+    84, 230, 93, 20, 107, 230, 93, 20, 103, 230, 93, 20, 160, 230, 93, 20, \r
+    154, 230, 93, 20, 174, 230, 93, 20, 182, 230, 93, 20, 191, 230, 93, 20, \r
+    185, 230, 93, 20, 190, 250, 53, 4, 60, 250, 53, 4, 73, 250, 53, 4, 72, \r
+    250, 53, 4, 74, 250, 53, 4, 68, 250, 53, 4, 237, 123, 250, 53, 4, 237, \r
+    59, 250, 53, 4, 175, 250, 53, 4, 236, 184, 250, 53, 4, 236, 113, 250, 53, \r
+    4, 236, 57, 250, 53, 4, 236, 7, 250, 53, 4, 235, 188, 250, 53, 4, 235, \r
+    122, 250, 53, 4, 235, 67, 250, 53, 4, 235, 12, 250, 53, 4, 234, 231, 250, \r
+    53, 4, 196, 250, 53, 4, 234, 25, 250, 53, 4, 233, 196, 250, 53, 4, 233, \r
+    136, 250, 53, 4, 233, 99, 250, 53, 4, 208, 250, 53, 4, 232, 141, 250, 53, \r
+    4, 232, 62, 250, 53, 4, 231, 204, 250, 53, 4, 231, 144, 250, 53, 4, 187, \r
+    250, 53, 4, 229, 198, 250, 53, 4, 229, 108, 250, 53, 4, 229, 37, 250, 53, \r
+    4, 228, 202, 250, 53, 4, 203, 250, 53, 4, 227, 216, 250, 53, 4, 227, 147, \r
+    250, 53, 4, 227, 75, 250, 53, 4, 227, 22, 250, 53, 4, 226, 177, 250, 53, \r
+    4, 226, 94, 250, 53, 4, 224, 140, 250, 53, 4, 224, 26, 250, 53, 4, 223, \r
+    103, 250, 53, 4, 222, 155, 250, 53, 4, 222, 87, 250, 53, 4, 221, 205, \r
+    250, 53, 4, 101, 250, 53, 4, 221, 0, 250, 53, 4, 219, 7, 250, 53, 4, 218, \r
+    227, 250, 53, 4, 218, 204, 250, 53, 4, 218, 187, 250, 53, 4, 218, 138, \r
+    250, 53, 4, 218, 135, 250, 53, 4, 217, 114, 250, 53, 4, 217, 21, 237, \r
+    225, 254, 53, 1, 254, 166, 237, 225, 254, 53, 1, 252, 101, 237, 225, 254, \r
+    53, 1, 244, 91, 237, 225, 254, 53, 1, 249, 176, 237, 225, 254, 53, 1, \r
+    243, 162, 237, 225, 254, 53, 1, 218, 233, 237, 225, 254, 53, 1, 217, 95, \r
+    237, 225, 254, 53, 1, 243, 126, 237, 225, 254, 53, 1, 222, 46, 237, 225, \r
+    254, 53, 1, 217, 219, 237, 225, 254, 53, 1, 236, 224, 237, 225, 254, 53, \r
+    1, 235, 151, 237, 225, 254, 53, 1, 234, 1, 237, 225, 254, 53, 1, 231, \r
+    103, 237, 225, 254, 53, 1, 226, 145, 237, 225, 254, 53, 1, 253, 207, 237, \r
+    225, 254, 53, 1, 229, 198, 237, 225, 254, 53, 1, 226, 168, 237, 225, 254, \r
+    53, 1, 228, 102, 237, 225, 254, 53, 1, 227, 174, 237, 225, 254, 53, 1, \r
+    224, 209, 237, 225, 254, 53, 1, 222, 100, 237, 225, 254, 53, 226, 87, 55, \r
+    237, 225, 254, 53, 54, 107, 237, 225, 254, 53, 54, 103, 237, 225, 254, \r
+    53, 54, 160, 237, 225, 254, 53, 54, 222, 65, 237, 225, 254, 53, 54, 220, \r
+    219, 237, 225, 254, 53, 54, 131, 242, 161, 237, 225, 254, 53, 54, 131, \r
+    221, 231, 237, 225, 254, 53, 54, 222, 66, 221, 231, 229, 116, 1, 254, \r
+    164, 229, 116, 1, 252, 104, 229, 116, 1, 244, 233, 229, 116, 1, 249, 64, \r
+    229, 116, 1, 243, 162, 229, 116, 1, 218, 238, 229, 116, 1, 217, 108, 229, \r
+    116, 1, 243, 128, 229, 116, 1, 222, 50, 229, 116, 1, 217, 220, 229, 116, \r
+    1, 236, 246, 229, 116, 1, 235, 157, 229, 116, 1, 234, 1, 229, 116, 1, \r
+    231, 103, 229, 116, 1, 225, 61, 229, 116, 1, 254, 191, 229, 116, 1, 229, \r
+    198, 229, 116, 1, 226, 169, 229, 116, 1, 228, 107, 229, 116, 1, 227, 61, \r
+    229, 116, 1, 224, 209, 229, 116, 1, 222, 105, 229, 116, 54, 107, 229, \r
+    116, 54, 222, 65, 229, 116, 54, 220, 219, 229, 116, 54, 131, 242, 161, \r
+    229, 116, 54, 103, 229, 116, 54, 160, 229, 116, 218, 174, 225, 54, 234, \r
+    196, 1, 60, 234, 196, 1, 253, 204, 234, 196, 1, 245, 67, 234, 196, 1, \r
+    250, 46, 234, 196, 1, 73, 234, 196, 1, 216, 216, 234, 196, 1, 72, 234, \r
+    196, 1, 218, 90, 234, 196, 1, 237, 17, 234, 196, 1, 153, 234, 196, 1, \r
+    189, 234, 196, 1, 207, 234, 196, 1, 74, 234, 196, 1, 152, 234, 196, 1, \r
+    223, 219, 234, 196, 1, 222, 201, 234, 196, 1, 68, 234, 196, 1, 246, 74, \r
+    234, 196, 1, 228, 163, 234, 196, 1, 198, 234, 196, 1, 221, 32, 234, 196, \r
+    1, 254, 131, 234, 196, 1, 246, 197, 234, 196, 1, 234, 198, 234, 196, 1, \r
+    231, 218, 234, 196, 1, 251, 202, 234, 196, 221, 87, 78, 201, 1, 60, 201, \r
+    29, 5, 72, 201, 29, 5, 68, 201, 29, 5, 167, 152, 201, 29, 5, 73, 201, 29, \r
+    5, 74, 201, 29, 235, 94, 78, 201, 5, 51, 227, 94, 56, 201, 5, 254, 95, \r
+    201, 5, 219, 77, 201, 1, 175, 201, 1, 236, 149, 201, 1, 245, 0, 201, 1, \r
+    244, 125, 201, 1, 251, 169, 201, 1, 251, 69, 201, 1, 237, 123, 201, 1, \r
+    231, 77, 201, 1, 221, 29, 201, 1, 221, 19, 201, 1, 249, 132, 201, 1, 249, \r
+    116, 201, 1, 231, 217, 201, 1, 222, 155, 201, 1, 222, 35, 201, 1, 249, \r
+    207, 201, 1, 249, 36, 201, 1, 208, 201, 1, 187, 201, 1, 229, 141, 201, 1, \r
+    252, 237, 201, 1, 252, 94, 201, 1, 196, 201, 1, 184, 201, 1, 203, 201, 1, \r
+    235, 188, 201, 1, 219, 189, 201, 1, 225, 25, 201, 1, 223, 218, 201, 1, \r
+    226, 177, 201, 1, 217, 114, 201, 1, 155, 201, 1, 236, 74, 201, 1, 221, 4, \r
+    201, 5, 252, 201, 50, 201, 5, 251, 122, 201, 5, 61, 56, 201, 219, 82, \r
+    201, 20, 107, 201, 20, 103, 201, 20, 160, 201, 20, 154, 201, 54, 222, 65, \r
+    201, 54, 220, 219, 201, 54, 131, 242, 161, 201, 54, 131, 221, 231, 201, \r
+    228, 197, 248, 145, 201, 228, 197, 3, 250, 221, 201, 228, 197, 250, 221, \r
+    201, 228, 197, 250, 105, 135, 201, 228, 197, 234, 83, 201, 228, 197, 234, \r
+    241, 201, 228, 197, 249, 167, 201, 228, 197, 51, 249, 167, 201, 228, 197, \r
+    235, 37, 48, 224, 6, 254, 64, 1, 243, 162, 48, 224, 6, 254, 64, 1, 235, \r
+    151, 48, 224, 6, 254, 64, 1, 243, 126, 48, 224, 6, 254, 64, 1, 234, 1, \r
+    48, 224, 6, 254, 64, 1, 228, 102, 48, 224, 6, 254, 64, 1, 218, 233, 48, \r
+    224, 6, 254, 64, 1, 224, 209, 48, 224, 6, 254, 64, 1, 227, 174, 48, 224, \r
+    6, 254, 64, 1, 252, 101, 48, 224, 6, 254, 64, 1, 222, 100, 48, 224, 6, \r
+    254, 64, 1, 226, 127, 48, 224, 6, 254, 64, 1, 236, 224, 48, 224, 6, 254, \r
+    64, 1, 231, 103, 48, 224, 6, 254, 64, 1, 236, 134, 48, 224, 6, 254, 64, \r
+    1, 226, 168, 48, 224, 6, 254, 64, 1, 226, 145, 48, 224, 6, 254, 64, 1, \r
+    245, 231, 48, 224, 6, 254, 64, 1, 254, 168, 48, 224, 6, 254, 64, 1, 253, \r
+    206, 48, 224, 6, 254, 64, 1, 249, 34, 48, 224, 6, 254, 64, 1, 244, 91, \r
+    48, 224, 6, 254, 64, 1, 249, 176, 48, 224, 6, 254, 64, 1, 244, 118, 48, \r
+    224, 6, 254, 64, 1, 222, 46, 48, 224, 6, 254, 64, 1, 217, 94, 48, 224, 6, \r
+    254, 64, 1, 249, 31, 48, 224, 6, 254, 64, 1, 217, 219, 48, 224, 6, 254, \r
+    64, 1, 222, 24, 48, 224, 6, 254, 64, 1, 222, 5, 48, 224, 6, 254, 64, 54, \r
+    107, 48, 224, 6, 254, 64, 54, 245, 196, 48, 224, 6, 254, 64, 120, 237, \r
+    211, 253, 216, 1, 60, 253, 216, 1, 255, 58, 253, 216, 1, 254, 93, 253, \r
+    216, 1, 255, 17, 253, 216, 1, 254, 131, 253, 216, 1, 255, 18, 253, 216, \r
+    1, 254, 234, 253, 216, 1, 254, 230, 253, 216, 1, 73, 253, 216, 1, 246, \r
+    250, 253, 216, 1, 74, 253, 216, 1, 230, 127, 253, 216, 1, 72, 253, 216, \r
+    1, 237, 255, 253, 216, 1, 68, 253, 216, 1, 220, 23, 253, 216, 1, 236, \r
+    184, 253, 216, 1, 218, 135, 253, 216, 1, 218, 101, 253, 216, 1, 218, 110, \r
+    253, 216, 1, 244, 191, 253, 216, 1, 244, 155, 253, 216, 1, 244, 116, 253, \r
+    216, 1, 251, 99, 253, 216, 1, 237, 114, 253, 216, 1, 222, 87, 253, 216, \r
+    1, 222, 22, 253, 216, 1, 249, 92, 253, 216, 1, 249, 29, 253, 216, 1, 221, \r
+    26, 253, 216, 1, 229, 198, 253, 216, 1, 245, 231, 253, 216, 1, 252, 144, \r
+    253, 216, 1, 252, 92, 253, 216, 1, 232, 106, 253, 216, 1, 232, 68, 253, \r
+    216, 1, 232, 69, 253, 216, 1, 232, 141, 253, 216, 1, 231, 73, 253, 216, \r
+    1, 231, 216, 253, 216, 1, 234, 25, 253, 216, 1, 243, 52, 253, 216, 1, \r
+    217, 164, 253, 216, 1, 218, 25, 253, 216, 1, 219, 165, 253, 216, 1, 227, \r
+    216, 253, 216, 1, 235, 122, 253, 216, 1, 226, 94, 253, 216, 1, 217, 92, \r
+    253, 216, 1, 224, 246, 253, 216, 1, 217, 72, 253, 216, 1, 224, 147, 253, \r
+    216, 1, 223, 190, 253, 216, 1, 243, 162, 253, 216, 255, 7, 78, 221, 172, \r
+    124, 188, 104, 131, 61, 228, 196, 3, 124, 188, 104, 131, 61, 228, 196, \r
+    235, 146, 124, 188, 104, 131, 61, 228, 196, 235, 146, 131, 61, 104, 124, \r
+    188, 228, 196, 235, 146, 124, 227, 92, 104, 131, 227, 94, 228, 196, 235, \r
+    146, 131, 227, 94, 104, 124, 227, 92, 228, 196, 237, 193, 229, 224, 1, \r
+    254, 166, 237, 193, 229, 224, 1, 252, 101, 237, 193, 229, 224, 1, 244, \r
+    91, 237, 193, 229, 224, 1, 249, 176, 237, 193, 229, 224, 1, 243, 162, \r
+    237, 193, 229, 224, 1, 218, 233, 237, 193, 229, 224, 1, 217, 95, 237, \r
+    193, 229, 224, 1, 243, 126, 237, 193, 229, 224, 1, 222, 46, 237, 193, \r
+    229, 224, 1, 217, 219, 237, 193, 229, 224, 1, 236, 224, 237, 193, 229, \r
+    224, 1, 235, 151, 237, 193, 229, 224, 1, 234, 1, 237, 193, 229, 224, 1, \r
+    231, 103, 237, 193, 229, 224, 1, 226, 145, 237, 193, 229, 224, 1, 253, \r
+    207, 237, 193, 229, 224, 1, 229, 198, 237, 193, 229, 224, 1, 226, 168, \r
+    237, 193, 229, 224, 1, 228, 102, 237, 193, 229, 224, 1, 227, 174, 237, \r
+    193, 229, 224, 1, 224, 209, 237, 193, 229, 224, 1, 222, 100, 237, 193, \r
+    229, 224, 54, 107, 237, 193, 229, 224, 54, 103, 237, 193, 229, 224, 54, \r
+    160, 237, 193, 229, 224, 54, 154, 237, 193, 229, 224, 54, 222, 65, 237, \r
+    193, 229, 224, 54, 220, 219, 237, 193, 229, 224, 54, 131, 242, 161, 237, \r
+    193, 229, 224, 54, 131, 221, 231, 237, 193, 230, 33, 1, 254, 166, 237, \r
+    193, 230, 33, 1, 252, 101, 237, 193, 230, 33, 1, 244, 91, 237, 193, 230, \r
+    33, 1, 249, 176, 237, 193, 230, 33, 1, 243, 162, 237, 193, 230, 33, 1, \r
+    218, 232, 237, 193, 230, 33, 1, 217, 95, 237, 193, 230, 33, 1, 243, 126, \r
+    237, 193, 230, 33, 1, 222, 46, 237, 193, 230, 33, 1, 217, 219, 237, 193, \r
+    230, 33, 1, 236, 224, 237, 193, 230, 33, 1, 235, 151, 237, 193, 230, 33, \r
+    1, 234, 0, 237, 193, 230, 33, 1, 231, 103, 237, 193, 230, 33, 1, 226, \r
+    145, 237, 193, 230, 33, 1, 229, 198, 237, 193, 230, 33, 1, 226, 168, 237, \r
+    193, 230, 33, 1, 224, 209, 237, 193, 230, 33, 1, 222, 100, 237, 193, 230, \r
+    33, 54, 107, 237, 193, 230, 33, 54, 103, 237, 193, 230, 33, 54, 160, 237, \r
+    193, 230, 33, 54, 154, 237, 193, 230, 33, 54, 222, 65, 237, 193, 230, 33, \r
+    54, 220, 219, 237, 193, 230, 33, 54, 131, 242, 161, 237, 193, 230, 33, \r
+    54, 131, 221, 231, 48, 172, 1, 230, 100, 60, 48, 172, 1, 218, 17, 60, 48, \r
+    172, 1, 218, 17, 254, 234, 48, 172, 1, 230, 100, 72, 48, 172, 1, 218, 17, \r
+    72, 48, 172, 1, 218, 17, 73, 48, 172, 1, 230, 100, 74, 48, 172, 1, 230, \r
+    100, 230, 167, 48, 172, 1, 218, 17, 230, 167, 48, 172, 1, 230, 100, 255, \r
+    11, 48, 172, 1, 218, 17, 255, 11, 48, 172, 1, 230, 100, 254, 233, 48, \r
+    172, 1, 218, 17, 254, 233, 48, 172, 1, 230, 100, 254, 209, 48, 172, 1, \r
+    218, 17, 254, 209, 48, 172, 1, 230, 100, 254, 228, 48, 172, 1, 218, 17, \r
+    254, 228, 48, 172, 1, 230, 100, 254, 244, 48, 172, 1, 218, 17, 254, 244, \r
+    48, 172, 1, 230, 100, 254, 232, 48, 172, 1, 230, 100, 246, 80, 48, 172, \r
+    1, 218, 17, 246, 80, 48, 172, 1, 230, 100, 253, 212, 48, 172, 1, 218, 17, \r
+    253, 212, 48, 172, 1, 230, 100, 254, 216, 48, 172, 1, 218, 17, 254, 216, \r
+    48, 172, 1, 230, 100, 254, 226, 48, 172, 1, 218, 17, 254, 226, 48, 172, \r
+    1, 230, 100, 230, 166, 48, 172, 1, 218, 17, 230, 166, 48, 172, 1, 230, \r
+    100, 254, 175, 48, 172, 1, 218, 17, 254, 175, 48, 172, 1, 230, 100, 254, \r
+    225, 48, 172, 1, 230, 100, 246, 207, 48, 172, 1, 230, 100, 246, 205, 48, \r
+    172, 1, 230, 100, 254, 131, 48, 172, 1, 230, 100, 254, 223, 48, 172, 1, \r
+    218, 17, 254, 223, 48, 172, 1, 230, 100, 246, 180, 48, 172, 1, 218, 17, \r
+    246, 180, 48, 172, 1, 230, 100, 246, 194, 48, 172, 1, 218, 17, 246, 194, \r
+    48, 172, 1, 230, 100, 246, 169, 48, 172, 1, 218, 17, 246, 169, 48, 172, \r
+    1, 218, 17, 254, 123, 48, 172, 1, 230, 100, 246, 185, 48, 172, 1, 218, \r
+    17, 254, 222, 48, 172, 1, 230, 100, 246, 162, 48, 172, 1, 230, 100, 230, \r
+    120, 48, 172, 1, 230, 100, 242, 67, 48, 172, 1, 230, 100, 247, 0, 48, \r
+    172, 1, 218, 17, 247, 0, 48, 172, 1, 230, 100, 254, 69, 48, 172, 1, 218, \r
+    17, 254, 69, 48, 172, 1, 230, 100, 237, 158, 48, 172, 1, 218, 17, 237, \r
+    158, 48, 172, 1, 230, 100, 230, 106, 48, 172, 1, 218, 17, 230, 106, 48, \r
+    172, 1, 230, 100, 254, 67, 48, 172, 1, 218, 17, 254, 67, 48, 172, 1, 230, \r
+    100, 254, 221, 48, 172, 1, 230, 100, 254, 13, 48, 172, 1, 230, 100, 254, \r
+    220, 48, 172, 1, 230, 100, 254, 7, 48, 172, 1, 218, 17, 254, 7, 48, 172, \r
+    1, 230, 100, 246, 133, 48, 172, 1, 218, 17, 246, 133, 48, 172, 1, 230, \r
+    100, 253, 244, 48, 172, 1, 218, 17, 253, 244, 48, 172, 1, 230, 100, 254, \r
+    217, 48, 172, 1, 218, 17, 254, 217, 48, 172, 1, 230, 100, 230, 92, 48, \r
+    172, 1, 230, 100, 252, 187, 227, 11, 20, 107, 227, 11, 20, 103, 227, 11, \r
+    20, 160, 227, 11, 20, 154, 227, 11, 20, 174, 227, 11, 20, 182, 227, 11, \r
+    20, 191, 227, 11, 20, 185, 227, 11, 20, 190, 227, 11, 54, 222, 65, 227, \r
+    11, 54, 220, 219, 227, 11, 54, 221, 245, 227, 11, 54, 245, 119, 227, 11, \r
+    54, 245, 196, 227, 11, 54, 224, 69, 227, 11, 54, 225, 38, 227, 11, 54, \r
+    246, 227, 227, 11, 54, 232, 27, 227, 11, 54, 131, 242, 161, 227, 11, 54, \r
+    124, 242, 161, 227, 11, 54, 148, 242, 161, 227, 11, 54, 245, 116, 242, \r
+    161, 227, 11, 54, 245, 170, 242, 161, 227, 11, 54, 224, 82, 242, 161, \r
+    227, 11, 54, 225, 43, 242, 161, 227, 11, 54, 246, 235, 242, 161, 227, 11, \r
+    54, 232, 31, 242, 161, 227, 11, 245, 108, 131, 243, 194, 227, 11, 245, \r
+    108, 131, 228, 89, 227, 11, 245, 108, 131, 221, 251, 227, 11, 245, 108, \r
+    124, 221, 249, 194, 5, 251, 146, 194, 5, 254, 95, 194, 5, 219, 77, 194, \r
+    1, 60, 194, 1, 255, 58, 194, 1, 72, 194, 1, 237, 255, 194, 1, 68, 194, 1, \r
+    220, 23, 194, 1, 73, 194, 1, 254, 196, 194, 1, 74, 194, 1, 253, 232, 194, \r
+    1, 175, 194, 1, 236, 149, 194, 1, 245, 0, 194, 1, 244, 125, 194, 1, 232, \r
+    115, 194, 1, 251, 169, 194, 1, 251, 69, 194, 1, 237, 123, 194, 1, 237, \r
+    103, 194, 1, 231, 77, 194, 1, 221, 29, 194, 1, 221, 19, 194, 1, 249, 132, \r
+    194, 1, 249, 121, 194, 1, 249, 116, 194, 1, 227, 151, 194, 1, 231, 217, \r
+    194, 1, 222, 155, 194, 1, 222, 35, 194, 1, 249, 207, 194, 1, 249, 36, \r
+    194, 1, 208, 194, 1, 187, 194, 1, 229, 141, 194, 1, 252, 237, 194, 1, \r
+    252, 94, 194, 1, 196, 194, 1, 184, 194, 1, 203, 194, 1, 235, 188, 194, 1, \r
+    219, 189, 194, 1, 225, 25, 194, 1, 223, 218, 194, 1, 226, 177, 194, 1, \r
+    155, 194, 29, 5, 255, 58, 194, 29, 5, 72, 194, 29, 5, 237, 255, 194, 29, \r
+    5, 68, 194, 29, 5, 220, 23, 194, 29, 5, 73, 194, 29, 5, 254, 196, 194, \r
+    29, 5, 74, 194, 29, 5, 253, 232, 194, 5, 219, 82, 194, 5, 231, 112, 194, \r
+    255, 7, 55, 194, 246, 171, 55, 194, 54, 55, 194, 226, 87, 78, 194, 51, \r
+    226, 87, 78, 194, 249, 167, 194, 51, 249, 167, 15, 5, 60, 15, 5, 112, 27, \r
+    60, 15, 5, 112, 27, 252, 228, 15, 5, 112, 27, 244, 229, 222, 59, 15, 5, \r
+    112, 27, 155, 15, 5, 112, 27, 238, 1, 15, 5, 112, 27, 235, 173, 244, 3, \r
+    15, 5, 112, 27, 233, 62, 15, 5, 112, 27, 226, 165, 15, 5, 255, 60, 15, 5, \r
+    255, 11, 15, 5, 255, 12, 27, 254, 5, 15, 5, 255, 12, 27, 247, 100, 244, \r
+    3, 15, 5, 255, 12, 27, 244, 240, 15, 5, 255, 12, 27, 244, 229, 222, 59, \r
+    15, 5, 255, 12, 27, 155, 15, 5, 255, 12, 27, 238, 2, 244, 3, 15, 5, 255, \r
+    12, 27, 237, 231, 15, 5, 255, 12, 27, 235, 174, 15, 5, 255, 12, 27, 224, \r
+    231, 15, 5, 255, 12, 27, 105, 88, 105, 88, 68, 15, 5, 255, 12, 244, 3, \r
+    15, 5, 255, 9, 15, 5, 255, 10, 27, 252, 216, 15, 5, 255, 10, 27, 244, \r
+    229, 222, 59, 15, 5, 255, 10, 27, 234, 26, 88, 246, 197, 15, 5, 255, 10, \r
+    27, 225, 23, 15, 5, 255, 10, 27, 222, 130, 15, 5, 254, 244, 15, 5, 254, \r
+    182, 15, 5, 254, 183, 27, 246, 143, 15, 5, 254, 183, 27, 224, 203, 88, \r
+    244, 81, 15, 5, 254, 175, 15, 5, 254, 176, 27, 254, 175, 15, 5, 254, 176, \r
+    27, 248, 229, 15, 5, 254, 176, 27, 244, 81, 15, 5, 254, 176, 27, 155, 15, \r
+    5, 254, 176, 27, 236, 251, 15, 5, 254, 176, 27, 236, 113, 15, 5, 254, \r
+    176, 27, 224, 246, 15, 5, 254, 176, 27, 220, 30, 15, 5, 254, 172, 15, 5, \r
+    254, 166, 15, 5, 254, 137, 15, 5, 254, 138, 27, 224, 246, 15, 5, 254, \r
+    131, 15, 5, 254, 132, 104, 254, 131, 15, 5, 254, 132, 148, 221, 176, 15, \r
+    5, 254, 132, 88, 232, 228, 230, 110, 254, 132, 88, 232, 227, 15, 5, 254, \r
+    132, 88, 232, 228, 223, 226, 15, 5, 254, 107, 15, 5, 254, 88, 15, 5, 254, \r
+    61, 15, 5, 254, 62, 27, 235, 247, 15, 5, 254, 35, 15, 5, 254, 12, 15, 5, \r
+    254, 7, 15, 5, 254, 8, 217, 38, 222, 59, 15, 5, 254, 8, 236, 254, 222, \r
+    59, 15, 5, 254, 8, 104, 254, 8, 220, 254, 104, 220, 254, 220, 254, 104, \r
+    220, 254, 229, 246, 15, 5, 254, 8, 104, 254, 8, 104, 254, 7, 15, 5, 254, \r
+    8, 104, 254, 8, 104, 254, 8, 250, 95, 254, 8, 104, 254, 8, 104, 254, 7, \r
+    15, 5, 254, 5, 15, 5, 254, 3, 15, 5, 252, 237, 15, 5, 252, 228, 15, 5, \r
+    252, 225, 15, 5, 252, 223, 15, 5, 252, 217, 15, 5, 252, 218, 104, 252, \r
+    217, 15, 5, 252, 216, 15, 5, 135, 15, 5, 252, 200, 15, 5, 252, 84, 15, 5, \r
+    252, 85, 27, 60, 15, 5, 252, 85, 27, 244, 220, 15, 5, 252, 85, 27, 238, \r
+    2, 244, 3, 15, 5, 251, 248, 15, 5, 251, 249, 104, 251, 249, 255, 11, 15, \r
+    5, 251, 249, 104, 251, 249, 220, 87, 15, 5, 251, 249, 250, 95, 251, 248, \r
+    15, 5, 251, 237, 15, 5, 251, 238, 104, 251, 237, 15, 5, 251, 228, 15, 5, \r
+    251, 227, 15, 5, 249, 207, 15, 5, 249, 198, 15, 5, 249, 199, 236, 91, 27, \r
+    112, 88, 234, 57, 15, 5, 249, 199, 236, 91, 27, 254, 137, 15, 5, 249, \r
+    199, 236, 91, 27, 252, 216, 15, 5, 249, 199, 236, 91, 27, 252, 84, 15, 5, \r
+    249, 199, 236, 91, 27, 245, 0, 15, 5, 249, 199, 236, 91, 27, 245, 1, 88, \r
+    234, 57, 15, 5, 249, 199, 236, 91, 27, 244, 103, 15, 5, 249, 199, 236, \r
+    91, 27, 244, 87, 15, 5, 249, 199, 236, 91, 27, 244, 11, 15, 5, 249, 199, \r
+    236, 91, 27, 155, 15, 5, 249, 199, 236, 91, 27, 237, 156, 15, 5, 249, \r
+    199, 236, 91, 27, 237, 157, 88, 234, 231, 15, 5, 249, 199, 236, 91, 27, \r
+    236, 240, 15, 5, 249, 199, 236, 91, 27, 235, 188, 15, 5, 249, 199, 236, \r
+    91, 27, 234, 231, 15, 5, 249, 199, 236, 91, 27, 234, 232, 88, 234, 56, \r
+    15, 5, 249, 199, 236, 91, 27, 234, 219, 15, 5, 249, 199, 236, 91, 27, \r
+    232, 141, 15, 5, 249, 199, 236, 91, 27, 229, 247, 88, 229, 246, 15, 5, \r
+    249, 199, 236, 91, 27, 224, 140, 15, 5, 249, 199, 236, 91, 27, 222, 130, \r
+    15, 5, 249, 199, 236, 91, 27, 220, 125, 88, 244, 87, 15, 5, 249, 199, \r
+    236, 91, 27, 220, 30, 15, 5, 249, 175, 15, 5, 249, 156, 15, 5, 249, 155, \r
+    15, 5, 249, 154, 15, 5, 249, 15, 15, 5, 248, 255, 15, 5, 248, 230, 15, 5, \r
+    248, 231, 27, 224, 246, 15, 5, 248, 229, 15, 5, 248, 219, 15, 5, 248, \r
+    220, 236, 209, 105, 244, 4, 248, 202, 15, 5, 248, 202, 15, 5, 247, 111, \r
+    15, 5, 247, 112, 104, 247, 111, 15, 5, 247, 112, 244, 3, 15, 5, 247, 112, \r
+    224, 228, 15, 5, 247, 109, 15, 5, 247, 110, 27, 246, 130, 15, 5, 247, \r
+    108, 15, 5, 247, 107, 15, 5, 247, 106, 15, 5, 247, 105, 15, 5, 247, 101, \r
+    15, 5, 247, 99, 15, 5, 247, 100, 244, 3, 15, 5, 247, 100, 244, 4, 244, 3, \r
+    15, 5, 247, 98, 15, 5, 247, 91, 15, 5, 73, 15, 5, 178, 27, 229, 246, 15, \r
+    5, 178, 104, 178, 231, 104, 104, 231, 103, 15, 5, 247, 17, 15, 5, 247, \r
+    18, 27, 112, 88, 243, 214, 88, 249, 207, 15, 5, 247, 18, 27, 244, 220, \r
+    15, 5, 247, 18, 27, 233, 196, 15, 5, 247, 18, 27, 226, 156, 15, 5, 247, \r
+    18, 27, 224, 246, 15, 5, 247, 18, 27, 68, 15, 5, 246, 252, 15, 5, 246, \r
+    242, 15, 5, 246, 217, 15, 5, 246, 197, 15, 5, 246, 198, 27, 244, 228, 15, \r
+    5, 246, 198, 27, 244, 229, 222, 59, 15, 5, 246, 198, 27, 234, 25, 15, 5, \r
+    246, 198, 250, 95, 246, 197, 15, 5, 246, 198, 230, 110, 246, 197, 15, 5, \r
+    246, 198, 223, 226, 15, 5, 246, 145, 15, 5, 246, 143, 15, 5, 246, 130, \r
+    15, 5, 246, 78, 15, 5, 246, 79, 27, 60, 15, 5, 246, 79, 27, 112, 88, 235, \r
+    162, 15, 5, 246, 79, 27, 112, 88, 235, 163, 27, 235, 162, 15, 5, 246, 79, \r
+    27, 254, 131, 15, 5, 246, 79, 27, 252, 228, 15, 5, 246, 79, 27, 247, 100, \r
+    244, 3, 15, 5, 246, 79, 27, 247, 100, 244, 4, 244, 3, 15, 5, 246, 79, 27, \r
+    155, 15, 5, 246, 79, 27, 243, 214, 244, 3, 15, 5, 246, 79, 27, 238, 2, \r
+    244, 3, 15, 5, 246, 79, 27, 236, 208, 15, 5, 246, 79, 27, 236, 209, 223, \r
+    226, 15, 5, 246, 79, 27, 236, 5, 15, 5, 246, 79, 27, 235, 188, 15, 5, \r
+    246, 79, 27, 235, 163, 27, 235, 162, 15, 5, 246, 79, 27, 235, 67, 15, 5, \r
+    246, 79, 27, 234, 231, 15, 5, 246, 79, 27, 220, 124, 15, 5, 246, 79, 27, \r
+    220, 115, 15, 5, 245, 0, 15, 5, 245, 1, 244, 3, 15, 5, 244, 254, 15, 5, \r
+    244, 255, 27, 112, 88, 249, 208, 88, 155, 15, 5, 244, 255, 27, 112, 88, \r
+    155, 15, 5, 244, 255, 27, 112, 88, 238, 1, 15, 5, 244, 255, 27, 255, 10, \r
+    222, 60, 88, 222, 147, 15, 5, 244, 255, 27, 254, 131, 15, 5, 244, 255, \r
+    27, 254, 7, 15, 5, 244, 255, 27, 254, 6, 88, 244, 240, 15, 5, 244, 255, \r
+    27, 252, 228, 15, 5, 244, 255, 27, 252, 201, 88, 203, 15, 5, 244, 255, \r
+    27, 251, 228, 15, 5, 244, 255, 27, 251, 229, 88, 203, 15, 5, 244, 255, \r
+    27, 249, 207, 15, 5, 244, 255, 27, 249, 15, 15, 5, 244, 255, 27, 248, \r
+    231, 27, 224, 246, 15, 5, 244, 255, 27, 247, 109, 15, 5, 244, 255, 27, \r
+    246, 217, 15, 5, 244, 255, 27, 246, 218, 88, 235, 188, 15, 5, 244, 255, \r
+    27, 246, 197, 15, 5, 244, 255, 27, 246, 198, 27, 244, 229, 222, 59, 15, \r
+    5, 244, 255, 27, 244, 229, 222, 59, 15, 5, 244, 255, 27, 244, 220, 15, 5, \r
+    244, 255, 27, 244, 103, 15, 5, 244, 255, 27, 244, 101, 15, 5, 244, 255, \r
+    27, 244, 102, 88, 60, 15, 5, 244, 255, 27, 244, 88, 88, 223, 103, 15, 5, \r
+    244, 255, 27, 243, 214, 88, 234, 232, 88, 246, 130, 15, 5, 244, 255, 27, \r
+    243, 197, 15, 5, 244, 255, 27, 243, 198, 88, 235, 188, 15, 5, 244, 255, \r
+    27, 243, 113, 88, 235, 67, 15, 5, 244, 255, 27, 242, 169, 15, 5, 244, \r
+    255, 27, 238, 2, 244, 3, 15, 5, 244, 255, 27, 237, 146, 88, 242, 174, 88, \r
+    254, 7, 15, 5, 244, 255, 27, 236, 240, 15, 5, 244, 255, 27, 236, 208, 15, \r
+    5, 244, 255, 27, 236, 110, 15, 5, 244, 255, 27, 236, 111, 88, 235, 162, \r
+    15, 5, 244, 255, 27, 236, 6, 88, 254, 131, 15, 5, 244, 255, 27, 235, 188, \r
+    15, 5, 244, 255, 27, 234, 26, 88, 246, 197, 15, 5, 244, 255, 27, 233, \r
+    196, 15, 5, 244, 255, 27, 231, 103, 15, 5, 244, 255, 27, 231, 104, 104, \r
+    231, 103, 15, 5, 244, 255, 27, 187, 15, 5, 244, 255, 27, 226, 156, 15, 5, \r
+    244, 255, 27, 226, 131, 15, 5, 244, 255, 27, 224, 246, 15, 5, 244, 255, \r
+    27, 224, 247, 88, 220, 240, 15, 5, 244, 255, 27, 224, 219, 15, 5, 244, \r
+    255, 27, 223, 74, 15, 5, 244, 255, 27, 222, 130, 15, 5, 244, 255, 27, 68, \r
+    15, 5, 244, 255, 27, 220, 115, 15, 5, 244, 255, 27, 220, 116, 88, 247, \r
+    111, 15, 5, 244, 255, 104, 244, 254, 15, 5, 244, 249, 15, 5, 244, 250, \r
+    250, 95, 244, 249, 15, 5, 244, 247, 15, 5, 244, 248, 104, 244, 248, 244, \r
+    221, 104, 244, 220, 15, 5, 244, 240, 15, 5, 244, 241, 244, 248, 104, 244, \r
+    248, 244, 221, 104, 244, 220, 15, 5, 244, 239, 15, 5, 244, 237, 15, 5, \r
+    244, 230, 15, 5, 244, 228, 15, 5, 244, 229, 222, 59, 15, 5, 244, 229, \r
+    104, 244, 228, 15, 5, 244, 229, 250, 95, 244, 228, 15, 5, 244, 220, 15, \r
+    5, 244, 219, 15, 5, 244, 215, 15, 5, 244, 166, 15, 5, 244, 167, 27, 235, \r
+    247, 15, 5, 244, 103, 15, 5, 244, 104, 27, 73, 15, 5, 244, 104, 27, 68, \r
+    15, 5, 244, 104, 250, 95, 244, 103, 15, 5, 244, 101, 15, 5, 244, 102, \r
+    104, 244, 101, 15, 5, 244, 102, 250, 95, 244, 101, 15, 5, 244, 99, 15, 5, \r
+    244, 87, 15, 5, 244, 88, 244, 3, 15, 5, 244, 85, 15, 5, 244, 86, 27, 112, \r
+    88, 238, 1, 15, 5, 244, 86, 27, 244, 229, 222, 59, 15, 5, 244, 86, 27, \r
+    238, 1, 15, 5, 244, 86, 27, 234, 232, 88, 238, 1, 15, 5, 244, 86, 27, \r
+    187, 15, 5, 244, 83, 15, 5, 244, 81, 15, 5, 244, 82, 250, 95, 244, 81, \r
+    15, 5, 244, 82, 27, 252, 228, 15, 5, 244, 82, 27, 222, 130, 15, 5, 244, \r
+    82, 222, 59, 15, 5, 244, 17, 15, 5, 244, 18, 250, 95, 244, 17, 15, 5, \r
+    244, 15, 15, 5, 244, 16, 27, 236, 240, 15, 5, 244, 16, 27, 236, 241, 27, \r
+    238, 2, 244, 3, 15, 5, 244, 16, 27, 231, 103, 15, 5, 244, 16, 27, 226, \r
+    157, 88, 220, 253, 15, 5, 244, 16, 244, 3, 15, 5, 244, 11, 15, 5, 244, \r
+    12, 27, 112, 88, 235, 247, 15, 5, 244, 12, 27, 235, 247, 15, 5, 244, 12, \r
+    104, 244, 12, 234, 225, 15, 5, 244, 7, 15, 5, 244, 5, 15, 5, 244, 6, 27, \r
+    224, 246, 15, 5, 243, 253, 15, 5, 243, 252, 15, 5, 243, 249, 15, 5, 243, \r
+    248, 15, 5, 155, 15, 5, 243, 214, 222, 59, 15, 5, 243, 214, 244, 3, 15, \r
+    5, 243, 197, 15, 5, 243, 112, 15, 5, 243, 113, 27, 254, 7, 15, 5, 243, \r
+    113, 27, 254, 5, 15, 5, 243, 113, 27, 252, 228, 15, 5, 243, 113, 27, 248, \r
+    202, 15, 5, 243, 113, 27, 244, 247, 15, 5, 243, 113, 27, 236, 104, 15, 5, \r
+    243, 113, 27, 231, 103, 15, 5, 243, 113, 27, 224, 246, 15, 5, 243, 113, \r
+    27, 68, 15, 5, 242, 173, 15, 5, 242, 169, 15, 5, 242, 170, 27, 254, 131, \r
+    15, 5, 242, 170, 27, 243, 197, 15, 5, 242, 170, 27, 236, 208, 15, 5, 242, \r
+    170, 27, 235, 29, 15, 5, 242, 170, 27, 220, 115, 15, 5, 242, 166, 15, 5, \r
+    72, 15, 5, 242, 107, 60, 15, 5, 242, 69, 15, 5, 238, 29, 15, 5, 238, 30, \r
+    104, 238, 30, 251, 228, 15, 5, 238, 30, 104, 238, 30, 223, 226, 15, 5, \r
+    238, 4, 15, 5, 238, 1, 15, 5, 238, 2, 248, 255, 15, 5, 238, 2, 227, 147, \r
+    15, 5, 238, 2, 104, 238, 2, 224, 205, 104, 224, 205, 220, 116, 104, 220, \r
+    115, 15, 5, 238, 2, 244, 3, 15, 5, 237, 249, 15, 5, 237, 250, 27, 244, \r
+    229, 222, 59, 15, 5, 237, 248, 15, 5, 237, 238, 15, 5, 237, 239, 27, 222, \r
+    130, 15, 5, 237, 239, 250, 95, 237, 238, 15, 5, 237, 239, 230, 110, 237, \r
+    238, 15, 5, 237, 239, 223, 226, 15, 5, 237, 231, 15, 5, 237, 223, 15, 5, \r
+    237, 156, 15, 5, 237, 145, 15, 5, 175, 15, 5, 206, 27, 60, 15, 5, 206, \r
+    27, 254, 244, 15, 5, 206, 27, 254, 245, 88, 236, 5, 15, 5, 206, 27, 254, \r
+    5, 15, 5, 206, 27, 252, 228, 15, 5, 206, 27, 252, 216, 15, 5, 206, 27, \r
+    135, 15, 5, 206, 27, 252, 84, 15, 5, 206, 27, 246, 143, 15, 5, 206, 27, \r
+    246, 130, 15, 5, 206, 27, 245, 0, 15, 5, 206, 27, 244, 240, 15, 5, 206, \r
+    27, 244, 229, 222, 59, 15, 5, 206, 27, 244, 220, 15, 5, 206, 27, 244, \r
+    221, 88, 225, 24, 88, 60, 15, 5, 206, 27, 244, 103, 15, 5, 206, 27, 244, \r
+    87, 15, 5, 206, 27, 244, 82, 88, 226, 131, 15, 5, 206, 27, 244, 82, 250, \r
+    95, 244, 81, 15, 5, 206, 27, 244, 17, 15, 5, 206, 27, 243, 252, 15, 5, \r
+    206, 27, 238, 1, 15, 5, 206, 27, 237, 238, 15, 5, 206, 27, 236, 240, 15, \r
+    5, 206, 27, 236, 113, 15, 5, 206, 27, 236, 110, 15, 5, 206, 27, 235, 67, \r
+    15, 5, 206, 27, 234, 231, 15, 5, 206, 27, 234, 25, 15, 5, 206, 27, 234, \r
+    26, 88, 247, 111, 15, 5, 206, 27, 234, 26, 88, 244, 103, 15, 5, 206, 27, \r
+    234, 26, 88, 222, 87, 15, 5, 206, 27, 233, 196, 15, 5, 206, 27, 233, 197, \r
+    88, 231, 98, 15, 5, 206, 27, 232, 141, 15, 5, 206, 27, 231, 103, 15, 5, \r
+    206, 27, 229, 108, 15, 5, 206, 27, 227, 22, 15, 5, 206, 27, 226, 177, 15, \r
+    5, 206, 27, 226, 131, 15, 5, 206, 27, 225, 25, 15, 5, 206, 27, 224, 246, \r
+    15, 5, 206, 27, 224, 219, 15, 5, 206, 27, 224, 170, 15, 5, 206, 27, 224, \r
+    132, 15, 5, 206, 27, 223, 81, 15, 5, 206, 27, 222, 112, 15, 5, 206, 27, \r
+    68, 15, 5, 206, 27, 220, 124, 15, 5, 206, 27, 220, 115, 15, 5, 206, 27, \r
+    220, 90, 27, 187, 15, 5, 206, 27, 220, 30, 15, 5, 206, 27, 217, 42, 15, \r
+    5, 237, 6, 15, 5, 237, 7, 250, 95, 237, 6, 15, 5, 236, 255, 15, 5, 236, \r
+    253, 15, 5, 236, 251, 15, 5, 236, 250, 15, 5, 236, 248, 15, 5, 236, 249, \r
+    104, 236, 248, 15, 5, 236, 240, 15, 5, 236, 241, 27, 238, 2, 244, 3, 15, \r
+    5, 236, 236, 15, 5, 236, 237, 27, 252, 228, 15, 5, 236, 237, 250, 95, \r
+    236, 236, 15, 5, 236, 235, 15, 5, 236, 234, 15, 5, 236, 208, 15, 5, 236, \r
+    209, 235, 175, 27, 105, 104, 235, 175, 27, 68, 15, 5, 236, 209, 104, 236, \r
+    209, 235, 175, 27, 105, 104, 235, 175, 27, 68, 15, 5, 236, 160, 15, 5, \r
+    236, 113, 15, 5, 236, 114, 27, 252, 228, 15, 5, 236, 114, 27, 68, 15, 5, \r
+    236, 114, 27, 220, 115, 15, 5, 236, 110, 15, 5, 236, 104, 15, 5, 236, 93, \r
+    15, 5, 236, 92, 15, 5, 236, 90, 15, 5, 236, 91, 104, 236, 90, 15, 5, 236, \r
+    7, 15, 5, 236, 8, 104, 243, 113, 27, 254, 6, 236, 8, 104, 243, 113, 27, \r
+    254, 5, 15, 5, 236, 5, 15, 5, 236, 3, 15, 5, 236, 4, 219, 177, 17, 15, 5, \r
+    236, 2, 15, 5, 236, 0, 15, 5, 236, 1, 244, 3, 15, 5, 235, 255, 15, 5, \r
+    235, 247, 15, 5, 235, 248, 230, 110, 235, 247, 15, 5, 235, 242, 15, 5, \r
+    235, 225, 15, 5, 235, 188, 15, 5, 235, 174, 15, 5, 235, 175, 27, 60, 15, \r
+    5, 235, 175, 27, 112, 88, 249, 208, 88, 155, 15, 5, 235, 175, 27, 112, \r
+    88, 244, 220, 15, 5, 235, 175, 27, 112, 88, 235, 162, 15, 5, 235, 175, \r
+    27, 254, 175, 15, 5, 235, 175, 27, 254, 131, 15, 5, 235, 175, 27, 254, 8, \r
+    217, 38, 222, 59, 15, 5, 235, 175, 27, 252, 228, 15, 5, 235, 175, 27, \r
+    252, 84, 15, 5, 235, 175, 27, 249, 156, 15, 5, 235, 175, 27, 246, 197, \r
+    15, 5, 235, 175, 27, 245, 0, 15, 5, 235, 175, 27, 244, 220, 15, 5, 235, \r
+    175, 27, 244, 11, 15, 5, 235, 175, 27, 244, 12, 88, 244, 11, 15, 5, 235, \r
+    175, 27, 155, 15, 5, 235, 175, 27, 243, 197, 15, 5, 235, 175, 27, 243, \r
+    113, 27, 231, 103, 15, 5, 235, 175, 27, 238, 2, 244, 3, 15, 5, 235, 175, \r
+    27, 237, 238, 15, 5, 235, 175, 27, 237, 239, 88, 155, 15, 5, 235, 175, \r
+    27, 237, 239, 88, 234, 231, 15, 5, 235, 175, 27, 236, 113, 15, 5, 235, \r
+    175, 27, 236, 104, 15, 5, 235, 175, 27, 236, 5, 15, 5, 235, 175, 27, 236, \r
+    0, 15, 5, 235, 175, 27, 236, 1, 88, 243, 113, 88, 60, 15, 5, 235, 175, \r
+    27, 235, 174, 15, 5, 235, 175, 27, 235, 29, 15, 5, 235, 175, 27, 234, \r
+    231, 15, 5, 235, 175, 27, 234, 221, 15, 5, 235, 175, 27, 234, 25, 15, 5, \r
+    235, 175, 27, 234, 26, 88, 246, 197, 15, 5, 235, 175, 27, 233, 62, 15, 5, \r
+    235, 175, 27, 232, 141, 15, 5, 235, 175, 27, 224, 247, 88, 223, 74, 15, \r
+    5, 235, 175, 27, 224, 203, 88, 244, 82, 88, 246, 143, 15, 5, 235, 175, \r
+    27, 224, 203, 88, 244, 82, 222, 59, 15, 5, 235, 175, 27, 224, 168, 15, 5, \r
+    235, 175, 27, 224, 169, 88, 224, 168, 15, 5, 235, 175, 27, 223, 74, 15, \r
+    5, 235, 175, 27, 222, 141, 15, 5, 235, 175, 27, 222, 130, 15, 5, 235, \r
+    175, 27, 222, 88, 88, 112, 88, 223, 104, 88, 208, 15, 5, 235, 175, 27, \r
+    68, 15, 5, 235, 175, 27, 105, 88, 60, 15, 5, 235, 175, 27, 105, 88, 105, \r
+    88, 68, 15, 5, 235, 175, 27, 220, 125, 88, 254, 7, 15, 5, 235, 175, 27, \r
+    220, 115, 15, 5, 235, 175, 27, 220, 30, 15, 5, 235, 175, 223, 226, 15, 5, \r
+    235, 172, 15, 5, 235, 173, 27, 224, 246, 15, 5, 235, 173, 27, 224, 247, \r
+    88, 223, 74, 15, 5, 235, 173, 244, 3, 15, 5, 235, 173, 244, 4, 104, 235, \r
+    173, 244, 4, 224, 246, 15, 5, 235, 169, 15, 5, 235, 162, 15, 5, 235, 163, \r
+    27, 235, 162, 15, 5, 235, 160, 15, 5, 235, 161, 27, 235, 247, 15, 5, 235, \r
+    161, 27, 235, 248, 88, 227, 22, 15, 5, 235, 67, 15, 5, 235, 54, 15, 5, \r
+    235, 46, 15, 5, 235, 29, 15, 5, 234, 231, 15, 5, 234, 232, 27, 252, 228, \r
+    15, 5, 234, 229, 15, 5, 234, 230, 27, 254, 175, 15, 5, 234, 230, 27, 252, \r
+    228, 15, 5, 234, 230, 27, 246, 130, 15, 5, 234, 230, 27, 246, 131, 222, \r
+    59, 15, 5, 234, 230, 27, 244, 229, 222, 59, 15, 5, 234, 230, 27, 243, \r
+    113, 27, 252, 228, 15, 5, 234, 230, 27, 237, 238, 15, 5, 234, 230, 27, \r
+    236, 253, 15, 5, 234, 230, 27, 236, 251, 15, 5, 234, 230, 27, 236, 252, \r
+    88, 254, 7, 15, 5, 234, 230, 27, 236, 113, 15, 5, 234, 230, 27, 235, 189, \r
+    88, 254, 7, 15, 5, 234, 230, 27, 235, 174, 15, 5, 234, 230, 27, 234, 26, \r
+    88, 246, 197, 15, 5, 234, 230, 27, 232, 141, 15, 5, 234, 230, 27, 231, \r
+    144, 15, 5, 234, 230, 27, 224, 141, 88, 254, 7, 15, 5, 234, 230, 27, 224, \r
+    124, 88, 251, 248, 15, 5, 234, 230, 27, 220, 253, 15, 5, 234, 230, 222, \r
+    59, 15, 5, 234, 230, 250, 95, 234, 229, 15, 5, 234, 230, 230, 110, 234, \r
+    229, 15, 5, 234, 230, 223, 226, 15, 5, 234, 230, 224, 228, 15, 5, 234, \r
+    228, 15, 5, 234, 225, 15, 5, 234, 226, 104, 234, 225, 15, 5, 234, 226, \r
+    230, 110, 234, 225, 15, 5, 234, 226, 224, 228, 15, 5, 234, 224, 15, 5, \r
+    234, 221, 15, 5, 234, 219, 15, 5, 234, 220, 104, 234, 219, 15, 5, 234, \r
+    220, 104, 234, 220, 244, 221, 104, 244, 220, 15, 5, 196, 15, 5, 234, 120, \r
+    27, 222, 130, 15, 5, 234, 120, 244, 3, 15, 5, 234, 119, 15, 5, 234, 106, \r
+    15, 5, 234, 74, 15, 5, 234, 57, 15, 5, 234, 56, 15, 5, 234, 25, 15, 5, \r
+    233, 244, 15, 5, 233, 196, 15, 5, 233, 159, 15, 5, 233, 99, 15, 5, 233, \r
+    100, 104, 233, 99, 15, 5, 233, 92, 15, 5, 233, 93, 244, 3, 15, 5, 233, \r
+    78, 15, 5, 233, 65, 15, 5, 233, 62, 15, 5, 233, 63, 27, 60, 15, 5, 233, \r
+    63, 27, 235, 247, 15, 5, 233, 63, 27, 217, 114, 15, 5, 233, 63, 104, 233, \r
+    62, 15, 5, 233, 63, 104, 233, 63, 27, 112, 88, 208, 15, 5, 233, 63, 250, \r
+    95, 233, 62, 15, 5, 233, 60, 15, 5, 233, 61, 27, 60, 15, 5, 233, 61, 27, \r
+    112, 88, 249, 15, 15, 5, 233, 61, 27, 249, 15, 15, 5, 233, 61, 244, 3, \r
+    15, 5, 208, 15, 5, 232, 237, 15, 5, 232, 227, 15, 5, 232, 228, 237, 169, \r
+    15, 5, 232, 228, 27, 224, 171, 222, 59, 15, 5, 232, 228, 230, 110, 232, \r
+    227, 15, 5, 232, 226, 15, 5, 232, 222, 231, 90, 15, 5, 232, 221, 15, 5, \r
+    232, 220, 15, 5, 232, 141, 15, 5, 232, 142, 27, 60, 15, 5, 232, 142, 27, \r
+    220, 115, 15, 5, 232, 142, 224, 228, 15, 5, 232, 62, 15, 5, 232, 63, 27, \r
+    73, 15, 5, 232, 61, 15, 5, 232, 34, 15, 5, 232, 35, 27, 244, 229, 222, \r
+    59, 15, 5, 232, 35, 27, 244, 221, 88, 244, 229, 222, 59, 15, 5, 232, 32, \r
+    15, 5, 232, 33, 27, 254, 131, 15, 5, 232, 33, 27, 254, 7, 15, 5, 232, 33, \r
+    27, 254, 8, 88, 254, 7, 15, 5, 232, 33, 27, 244, 11, 15, 5, 232, 33, 27, \r
+    234, 26, 88, 244, 229, 222, 59, 15, 5, 232, 33, 27, 232, 141, 15, 5, 232, \r
+    33, 27, 231, 103, 15, 5, 232, 33, 27, 224, 246, 15, 5, 232, 33, 27, 224, \r
+    247, 88, 112, 254, 131, 15, 5, 232, 33, 27, 224, 247, 88, 254, 7, 15, 5, \r
+    232, 33, 27, 224, 247, 88, 254, 8, 88, 254, 7, 15, 5, 232, 33, 27, 220, \r
+    125, 88, 254, 7, 15, 5, 232, 33, 27, 220, 30, 15, 5, 232, 22, 15, 5, 231, \r
+    144, 15, 5, 231, 117, 15, 5, 231, 103, 15, 5, 231, 104, 235, 173, 27, \r
+    244, 220, 15, 5, 231, 104, 235, 173, 27, 234, 57, 15, 5, 231, 104, 235, \r
+    173, 27, 226, 156, 15, 5, 231, 104, 235, 173, 27, 226, 157, 104, 231, \r
+    104, 235, 173, 27, 226, 156, 15, 5, 231, 104, 235, 173, 27, 220, 30, 15, \r
+    5, 231, 104, 222, 59, 15, 5, 231, 104, 104, 231, 103, 15, 5, 231, 104, \r
+    250, 95, 231, 103, 15, 5, 231, 104, 250, 95, 231, 104, 235, 173, 104, \r
+    235, 172, 15, 5, 231, 98, 15, 5, 231, 99, 255, 10, 27, 254, 3, 15, 5, \r
+    231, 99, 255, 10, 27, 252, 84, 15, 5, 231, 99, 255, 10, 27, 247, 107, 15, \r
+    5, 231, 99, 255, 10, 27, 244, 11, 15, 5, 231, 99, 255, 10, 27, 238, 2, \r
+    244, 3, 15, 5, 231, 99, 255, 10, 27, 236, 251, 15, 5, 231, 99, 255, 10, \r
+    27, 235, 188, 15, 5, 231, 99, 255, 10, 27, 232, 141, 15, 5, 231, 99, 255, \r
+    10, 27, 224, 121, 15, 5, 231, 99, 255, 10, 27, 220, 124, 15, 5, 231, 99, \r
+    236, 91, 27, 252, 84, 15, 5, 231, 99, 236, 91, 27, 252, 85, 68, 15, 5, \r
+    187, 15, 5, 230, 37, 15, 5, 230, 12, 15, 5, 229, 246, 15, 5, 229, 152, \r
+    15, 5, 229, 108, 15, 5, 229, 109, 27, 60, 15, 5, 229, 109, 27, 255, 11, \r
+    15, 5, 229, 109, 27, 252, 84, 15, 5, 229, 109, 27, 251, 248, 15, 5, 229, \r
+    109, 27, 73, 15, 5, 229, 109, 27, 72, 15, 5, 229, 109, 27, 242, 69, 15, \r
+    5, 229, 109, 27, 68, 15, 5, 229, 109, 27, 220, 124, 15, 5, 229, 109, 250, \r
+    95, 229, 108, 15, 5, 229, 67, 15, 5, 229, 68, 27, 236, 236, 15, 5, 229, \r
+    68, 27, 220, 115, 15, 5, 229, 68, 27, 217, 114, 15, 5, 229, 68, 230, 110, \r
+    229, 67, 15, 5, 203, 15, 5, 227, 254, 15, 5, 227, 147, 15, 5, 227, 22, \r
+    15, 5, 226, 177, 15, 5, 226, 166, 231, 90, 15, 5, 226, 165, 15, 5, 226, \r
+    166, 27, 60, 15, 5, 226, 166, 27, 247, 111, 15, 5, 226, 166, 27, 247, \r
+    109, 15, 5, 226, 166, 27, 155, 15, 5, 226, 166, 27, 236, 240, 15, 5, 226, \r
+    166, 27, 235, 247, 15, 5, 226, 166, 27, 234, 219, 15, 5, 226, 166, 27, \r
+    233, 196, 15, 5, 226, 166, 27, 231, 103, 15, 5, 226, 166, 27, 226, 156, \r
+    15, 5, 226, 166, 27, 224, 219, 15, 5, 226, 166, 27, 222, 147, 15, 5, 226, \r
+    166, 27, 220, 124, 15, 5, 226, 166, 27, 220, 121, 15, 5, 226, 166, 27, \r
+    220, 94, 15, 5, 226, 166, 27, 220, 50, 15, 5, 226, 166, 27, 220, 30, 15, \r
+    5, 226, 166, 104, 226, 165, 15, 5, 226, 166, 244, 3, 15, 5, 226, 156, 15, \r
+    5, 226, 157, 235, 175, 27, 254, 5, 15, 5, 226, 138, 15, 5, 226, 131, 15, \r
+    5, 225, 25, 15, 5, 225, 23, 15, 5, 225, 24, 27, 60, 15, 5, 225, 24, 27, \r
+    252, 228, 15, 5, 225, 24, 27, 244, 81, 15, 5, 225, 24, 27, 232, 141, 15, \r
+    5, 225, 24, 27, 224, 168, 15, 5, 225, 24, 27, 220, 240, 15, 5, 225, 24, \r
+    27, 68, 15, 5, 225, 24, 27, 105, 88, 60, 15, 5, 225, 22, 15, 5, 225, 20, \r
+    15, 5, 225, 3, 15, 5, 224, 246, 15, 5, 224, 247, 242, 173, 15, 5, 224, \r
+    247, 104, 224, 247, 244, 248, 104, 244, 248, 244, 221, 104, 244, 220, 15, \r
+    5, 224, 247, 104, 224, 247, 222, 148, 104, 222, 148, 244, 221, 104, 244, \r
+    220, 15, 5, 224, 239, 15, 5, 224, 234, 15, 5, 224, 231, 15, 5, 224, 230, \r
+    15, 5, 224, 227, 15, 5, 224, 219, 15, 5, 224, 220, 27, 60, 15, 5, 224, \r
+    220, 27, 237, 238, 15, 5, 224, 213, 15, 5, 224, 214, 27, 60, 15, 5, 224, \r
+    214, 27, 252, 217, 15, 5, 224, 214, 27, 251, 237, 15, 5, 224, 214, 27, \r
+    248, 219, 15, 5, 224, 214, 27, 244, 220, 15, 5, 224, 214, 27, 238, 1, 15, \r
+    5, 224, 214, 27, 238, 2, 244, 3, 15, 5, 224, 214, 27, 235, 242, 15, 5, \r
+    224, 214, 27, 234, 221, 15, 5, 224, 214, 27, 233, 92, 15, 5, 224, 214, \r
+    27, 226, 156, 15, 5, 224, 208, 15, 5, 224, 204, 15, 5, 224, 205, 222, 59, \r
+    15, 5, 224, 205, 104, 224, 205, 251, 229, 104, 251, 228, 15, 5, 224, 202, \r
+    15, 5, 224, 170, 15, 5, 224, 171, 104, 237, 170, 224, 170, 15, 5, 224, \r
+    168, 15, 5, 224, 167, 15, 5, 224, 140, 15, 5, 224, 141, 244, 3, 15, 5, \r
+    224, 132, 15, 5, 224, 130, 15, 5, 224, 131, 104, 224, 131, 224, 168, 15, \r
+    5, 224, 123, 15, 5, 224, 121, 15, 5, 223, 103, 15, 5, 223, 104, 104, 223, \r
+    103, 15, 5, 223, 83, 15, 5, 223, 82, 15, 5, 223, 81, 15, 5, 223, 74, 15, \r
+    5, 223, 73, 15, 5, 223, 53, 15, 5, 223, 52, 15, 5, 222, 155, 15, 5, 222, \r
+    156, 253, 251, 15, 5, 222, 156, 27, 243, 112, 15, 5, 222, 156, 27, 233, \r
+    196, 15, 5, 222, 156, 244, 3, 15, 5, 222, 147, 15, 5, 222, 148, 104, 222, \r
+    148, 232, 63, 104, 232, 63, 248, 203, 104, 248, 202, 15, 5, 222, 148, \r
+    223, 226, 15, 5, 222, 141, 15, 5, 118, 27, 252, 84, 15, 5, 118, 27, 244, \r
+    11, 15, 5, 118, 27, 224, 246, 15, 5, 118, 27, 224, 170, 15, 5, 118, 27, \r
+    220, 253, 15, 5, 118, 27, 220, 115, 15, 5, 222, 130, 15, 5, 222, 112, 15, \r
+    5, 222, 87, 15, 5, 222, 88, 244, 3, 15, 5, 221, 205, 15, 5, 221, 206, \r
+    222, 59, 15, 5, 221, 181, 15, 5, 221, 165, 15, 5, 221, 166, 27, 222, 130, \r
+    15, 5, 221, 166, 104, 221, 165, 15, 5, 221, 166, 104, 221, 166, 244, 248, \r
+    104, 244, 248, 244, 221, 104, 244, 220, 15, 5, 221, 0, 15, 5, 220, 253, \r
+    15, 5, 220, 251, 15, 5, 220, 249, 15, 5, 220, 240, 15, 5, 220, 241, 104, \r
+    220, 241, 217, 115, 104, 217, 114, 15, 5, 68, 15, 5, 105, 244, 11, 15, 5, \r
+    105, 105, 68, 15, 5, 105, 104, 105, 230, 44, 104, 230, 44, 244, 221, 104, \r
+    244, 220, 15, 5, 105, 104, 105, 223, 54, 104, 223, 53, 15, 5, 105, 104, \r
+    105, 105, 210, 104, 105, 227, 159, 15, 5, 220, 124, 15, 5, 220, 121, 15, \r
+    5, 220, 115, 15, 5, 220, 116, 235, 242, 15, 5, 220, 116, 27, 252, 228, \r
+    15, 5, 220, 116, 27, 233, 196, 15, 5, 220, 116, 27, 105, 88, 105, 88, 68, \r
+    15, 5, 220, 116, 27, 105, 88, 105, 88, 105, 244, 3, 15, 5, 220, 116, 244, \r
+    3, 15, 5, 220, 116, 224, 228, 15, 5, 220, 116, 224, 229, 27, 252, 228, \r
+    15, 5, 220, 111, 15, 5, 220, 94, 15, 5, 220, 95, 27, 235, 174, 15, 5, \r
+    220, 95, 27, 234, 26, 88, 249, 207, 15, 5, 220, 95, 27, 225, 23, 15, 5, \r
+    220, 95, 27, 68, 15, 5, 220, 93, 15, 5, 220, 89, 15, 5, 220, 90, 27, 236, \r
+    208, 15, 5, 220, 90, 27, 187, 15, 5, 220, 87, 15, 5, 220, 88, 244, 3, 15, \r
+    5, 220, 50, 15, 5, 220, 51, 250, 95, 220, 50, 15, 5, 220, 51, 224, 228, \r
+    15, 5, 220, 48, 15, 5, 220, 49, 27, 112, 88, 155, 15, 5, 220, 49, 27, \r
+    112, 88, 208, 15, 5, 220, 49, 27, 254, 175, 15, 5, 220, 49, 27, 155, 15, \r
+    5, 220, 49, 27, 231, 103, 15, 5, 220, 49, 27, 220, 124, 15, 5, 220, 49, \r
+    27, 220, 125, 88, 254, 7, 15, 5, 220, 49, 27, 220, 125, 88, 252, 84, 15, \r
+    5, 220, 47, 15, 5, 220, 44, 15, 5, 220, 43, 15, 5, 220, 40, 15, 5, 220, \r
+    41, 27, 60, 15, 5, 220, 41, 27, 254, 3, 15, 5, 220, 41, 27, 135, 15, 5, \r
+    220, 41, 27, 247, 101, 15, 5, 220, 41, 27, 245, 0, 15, 5, 220, 41, 27, \r
+    244, 240, 15, 5, 220, 41, 27, 244, 229, 222, 59, 15, 5, 220, 41, 27, 244, \r
+    220, 15, 5, 220, 41, 27, 244, 17, 15, 5, 220, 41, 27, 155, 15, 5, 220, \r
+    41, 27, 238, 1, 15, 5, 220, 41, 27, 237, 238, 15, 5, 220, 41, 27, 237, \r
+    145, 15, 5, 220, 41, 27, 236, 113, 15, 5, 220, 41, 27, 234, 219, 15, 5, \r
+    220, 41, 27, 233, 159, 15, 5, 220, 41, 27, 187, 15, 5, 220, 41, 27, 224, \r
+    246, 15, 5, 220, 41, 27, 224, 130, 15, 5, 220, 41, 27, 221, 0, 15, 5, \r
+    220, 41, 27, 105, 88, 244, 11, 15, 5, 220, 41, 27, 220, 115, 15, 5, 220, \r
+    41, 27, 220, 38, 15, 5, 220, 38, 15, 5, 220, 39, 27, 68, 15, 5, 220, 30, \r
+    15, 5, 220, 31, 27, 60, 15, 5, 220, 31, 27, 236, 7, 15, 5, 220, 31, 27, \r
+    235, 247, 15, 5, 220, 31, 27, 222, 130, 15, 5, 220, 27, 15, 5, 220, 29, \r
+    15, 5, 220, 28, 15, 5, 220, 24, 15, 5, 220, 13, 15, 5, 220, 14, 27, 236, \r
+    208, 15, 5, 220, 12, 15, 5, 217, 114, 15, 5, 217, 115, 222, 59, 15, 5, \r
+    217, 115, 204, 27, 235, 247, 15, 5, 217, 111, 15, 5, 217, 104, 15, 5, \r
+    217, 91, 15, 5, 217, 42, 15, 5, 217, 43, 104, 217, 42, 15, 5, 217, 41, \r
+    15, 5, 217, 39, 15, 5, 217, 40, 236, 254, 222, 59, 15, 5, 217, 34, 15, 5, \r
+    217, 26, 15, 5, 217, 13, 15, 5, 217, 11, 15, 5, 217, 12, 27, 60, 15, 5, \r
+    217, 10, 15, 5, 217, 9, 15, 120, 5, 124, 254, 7, 15, 120, 5, 148, 254, 7, \r
+    15, 120, 5, 245, 116, 254, 7, 15, 120, 5, 245, 170, 254, 7, 15, 120, 5, \r
+    224, 82, 254, 7, 15, 120, 5, 225, 43, 254, 7, 15, 120, 5, 246, 235, 254, \r
+    7, 15, 120, 5, 232, 31, 254, 7, 15, 120, 5, 148, 248, 202, 15, 120, 5, \r
+    245, 116, 248, 202, 15, 120, 5, 245, 170, 248, 202, 15, 120, 5, 224, 82, \r
+    248, 202, 15, 120, 5, 225, 43, 248, 202, 15, 120, 5, 246, 235, 248, 202, \r
+    15, 120, 5, 232, 31, 248, 202, 15, 120, 5, 245, 116, 68, 15, 120, 5, 245, \r
+    170, 68, 15, 120, 5, 224, 82, 68, 15, 120, 5, 225, 43, 68, 15, 120, 5, \r
+    246, 235, 68, 15, 120, 5, 232, 31, 68, 15, 120, 5, 131, 244, 168, 15, \r
+    120, 5, 124, 244, 168, 15, 120, 5, 148, 244, 168, 15, 120, 5, 245, 116, \r
+    244, 168, 15, 120, 5, 245, 170, 244, 168, 15, 120, 5, 224, 82, 244, 168, \r
+    15, 120, 5, 225, 43, 244, 168, 15, 120, 5, 246, 235, 244, 168, 15, 120, \r
+    5, 232, 31, 244, 168, 15, 120, 5, 131, 244, 165, 15, 120, 5, 124, 244, \r
+    165, 15, 120, 5, 148, 244, 165, 15, 120, 5, 245, 116, 244, 165, 15, 120, \r
+    5, 245, 170, 244, 165, 15, 120, 5, 124, 225, 3, 15, 120, 5, 148, 225, 3, \r
+    15, 120, 5, 148, 225, 4, 219, 177, 17, 15, 120, 5, 245, 116, 225, 3, 15, \r
+    120, 5, 245, 170, 225, 3, 15, 120, 5, 224, 82, 225, 3, 15, 120, 5, 225, \r
+    43, 225, 3, 15, 120, 5, 246, 235, 225, 3, 15, 120, 5, 232, 31, 225, 3, \r
+    15, 120, 5, 131, 224, 254, 15, 120, 5, 124, 224, 254, 15, 120, 5, 148, \r
+    224, 254, 15, 120, 5, 148, 224, 255, 219, 177, 17, 15, 120, 5, 245, 116, \r
+    224, 254, 15, 120, 5, 245, 170, 224, 254, 15, 120, 5, 225, 4, 27, 244, \r
+    241, 88, 248, 202, 15, 120, 5, 225, 4, 27, 244, 241, 88, 233, 159, 15, \r
+    120, 5, 131, 251, 225, 15, 120, 5, 124, 251, 225, 15, 120, 5, 148, 251, \r
+    225, 15, 120, 5, 148, 251, 226, 219, 177, 17, 15, 120, 5, 245, 116, 251, \r
+    225, 15, 120, 5, 245, 170, 251, 225, 15, 120, 5, 148, 219, 177, 245, 124, \r
+    246, 132, 15, 120, 5, 148, 219, 177, 245, 124, 246, 129, 15, 120, 5, 245, \r
+    116, 219, 177, 245, 124, 235, 47, 15, 120, 5, 245, 116, 219, 177, 245, \r
+    124, 235, 45, 15, 120, 5, 245, 116, 219, 177, 245, 124, 235, 48, 60, 15, \r
+    120, 5, 245, 116, 219, 177, 245, 124, 235, 48, 253, 204, 15, 120, 5, 224, \r
+    82, 219, 177, 245, 124, 254, 4, 15, 120, 5, 225, 43, 219, 177, 245, 124, \r
+    237, 230, 15, 120, 5, 225, 43, 219, 177, 245, 124, 237, 232, 60, 15, 120, \r
+    5, 225, 43, 219, 177, 245, 124, 237, 232, 253, 204, 15, 120, 5, 246, 235, \r
+    219, 177, 245, 124, 220, 26, 15, 120, 5, 246, 235, 219, 177, 245, 124, \r
+    220, 25, 15, 120, 5, 232, 31, 219, 177, 245, 124, 237, 246, 15, 120, 5, \r
+    232, 31, 219, 177, 245, 124, 237, 245, 15, 120, 5, 232, 31, 219, 177, \r
+    245, 124, 237, 244, 15, 120, 5, 232, 31, 219, 177, 245, 124, 237, 247, \r
+    60, 15, 120, 5, 124, 254, 8, 222, 59, 15, 120, 5, 148, 254, 8, 222, 59, \r
+    15, 120, 5, 245, 116, 254, 8, 222, 59, 15, 120, 5, 245, 170, 254, 8, 222, \r
+    59, 15, 120, 5, 224, 82, 254, 8, 222, 59, 15, 120, 5, 131, 252, 207, 15, \r
+    120, 5, 124, 252, 207, 15, 120, 5, 148, 252, 207, 15, 120, 5, 245, 116, \r
+    252, 207, 15, 120, 5, 245, 116, 252, 208, 219, 177, 17, 15, 120, 5, 245, \r
+    170, 252, 207, 15, 120, 5, 245, 170, 252, 208, 219, 177, 17, 15, 120, 5, \r
+    232, 40, 15, 120, 5, 232, 41, 15, 120, 5, 131, 246, 128, 15, 120, 5, 124, \r
+    246, 128, 15, 120, 5, 131, 221, 252, 248, 202, 15, 120, 5, 124, 221, 250, \r
+    248, 202, 15, 120, 5, 245, 170, 224, 72, 248, 202, 15, 120, 5, 131, 221, \r
+    252, 219, 177, 245, 124, 60, 15, 120, 5, 124, 221, 250, 219, 177, 245, \r
+    124, 60, 15, 120, 5, 131, 246, 232, 254, 7, 15, 120, 5, 131, 228, 90, \r
+    254, 7, 15, 120, 5, 48, 253, 254, 131, 224, 73, 15, 120, 5, 48, 253, 254, \r
+    131, 228, 89, 15, 228, 197, 5, 48, 253, 254, 218, 174, 248, 191, 15, 228, \r
+    197, 5, 69, 250, 175, 15, 228, 197, 5, 249, 11, 250, 175, 15, 228, 197, \r
+    5, 249, 11, 221, 86, 10, 11, 255, 140, 10, 11, 255, 139, 10, 11, 255, \r
+    138, 10, 11, 255, 137, 10, 11, 255, 136, 10, 11, 255, 135, 10, 11, 255, \r
+    134, 10, 11, 255, 133, 10, 11, 255, 132, 10, 11, 255, 131, 10, 11, 255, \r
+    130, 10, 11, 255, 129, 10, 11, 255, 128, 10, 11, 255, 127, 10, 11, 255, \r
+    126, 10, 11, 255, 125, 10, 11, 255, 124, 10, 11, 255, 123, 10, 11, 255, \r
+    122, 10, 11, 255, 121, 10, 11, 255, 120, 10, 11, 255, 119, 10, 11, 255, \r
+    118, 10, 11, 255, 117, 10, 11, 255, 116, 10, 11, 255, 115, 10, 11, 255, \r
+    114, 10, 11, 255, 113, 10, 11, 255, 112, 10, 11, 255, 111, 10, 11, 255, \r
+    110, 10, 11, 255, 109, 10, 11, 255, 108, 10, 11, 255, 107, 10, 11, 255, \r
+    106, 10, 11, 255, 105, 10, 11, 255, 104, 10, 11, 255, 103, 10, 11, 255, \r
+    102, 10, 11, 255, 101, 10, 11, 255, 100, 10, 11, 255, 99, 10, 11, 255, \r
+    98, 10, 11, 255, 97, 10, 11, 255, 96, 10, 11, 255, 95, 10, 11, 255, 94, \r
+    10, 11, 255, 93, 10, 11, 255, 92, 10, 11, 255, 91, 10, 11, 255, 90, 10, \r
+    11, 255, 89, 10, 11, 255, 88, 10, 11, 255, 87, 10, 11, 255, 86, 10, 11, \r
+    255, 85, 10, 11, 255, 84, 10, 11, 255, 83, 10, 11, 255, 82, 10, 11, 255, \r
+    81, 10, 11, 255, 80, 10, 11, 255, 79, 10, 11, 255, 78, 10, 11, 255, 77, \r
+    10, 11, 255, 76, 10, 11, 255, 75, 10, 11, 255, 74, 10, 11, 255, 73, 10, \r
+    11, 255, 72, 10, 11, 255, 71, 10, 11, 255, 70, 10, 11, 255, 69, 10, 11, \r
+    255, 68, 10, 11, 255, 67, 10, 11, 255, 66, 10, 11, 255, 65, 10, 11, 255, \r
+    64, 10, 11, 255, 63, 10, 11, 255, 62, 10, 11, 255, 61, 10, 11, 253, 202, \r
+    10, 11, 253, 200, 10, 11, 253, 198, 10, 11, 253, 196, 10, 11, 253, 194, \r
+    10, 11, 253, 193, 10, 11, 253, 191, 10, 11, 253, 189, 10, 11, 253, 187, \r
+    10, 11, 253, 185, 10, 11, 251, 198, 10, 11, 251, 197, 10, 11, 251, 196, \r
+    10, 11, 251, 195, 10, 11, 251, 194, 10, 11, 251, 193, 10, 11, 251, 192, \r
+    10, 11, 251, 191, 10, 11, 251, 190, 10, 11, 251, 189, 10, 11, 251, 188, \r
+    10, 11, 251, 187, 10, 11, 251, 186, 10, 11, 251, 185, 10, 11, 251, 184, \r
+    10, 11, 251, 183, 10, 11, 251, 182, 10, 11, 251, 181, 10, 11, 251, 180, \r
+    10, 11, 251, 179, 10, 11, 251, 178, 10, 11, 251, 177, 10, 11, 251, 176, \r
+    10, 11, 251, 175, 10, 11, 251, 174, 10, 11, 251, 173, 10, 11, 251, 172, \r
+    10, 11, 251, 171, 10, 11, 250, 45, 10, 11, 250, 44, 10, 11, 250, 43, 10, \r
+    11, 250, 42, 10, 11, 250, 41, 10, 11, 250, 40, 10, 11, 250, 39, 10, 11, \r
+    250, 38, 10, 11, 250, 37, 10, 11, 250, 36, 10, 11, 250, 35, 10, 11, 250, \r
+    34, 10, 11, 250, 33, 10, 11, 250, 32, 10, 11, 250, 31, 10, 11, 250, 30, \r
+    10, 11, 250, 29, 10, 11, 250, 28, 10, 11, 250, 27, 10, 11, 250, 26, 10, \r
+    11, 250, 25, 10, 11, 250, 24, 10, 11, 250, 23, 10, 11, 250, 22, 10, 11, \r
+    250, 21, 10, 11, 250, 20, 10, 11, 250, 19, 10, 11, 250, 18, 10, 11, 250, \r
+    17, 10, 11, 250, 16, 10, 11, 250, 15, 10, 11, 250, 14, 10, 11, 250, 13, \r
+    10, 11, 250, 12, 10, 11, 250, 11, 10, 11, 250, 10, 10, 11, 250, 9, 10, \r
+    11, 250, 8, 10, 11, 250, 7, 10, 11, 250, 6, 10, 11, 250, 5, 10, 11, 250, \r
+    4, 10, 11, 250, 3, 10, 11, 250, 2, 10, 11, 250, 1, 10, 11, 250, 0, 10, \r
+    11, 249, 255, 10, 11, 249, 254, 10, 11, 249, 253, 10, 11, 249, 252, 10, \r
+    11, 249, 251, 10, 11, 249, 250, 10, 11, 249, 249, 10, 11, 249, 248, 10, \r
+    11, 249, 247, 10, 11, 249, 246, 10, 11, 249, 245, 10, 11, 249, 244, 10, \r
+    11, 249, 243, 10, 11, 249, 242, 10, 11, 249, 241, 10, 11, 249, 240, 10, \r
+    11, 249, 239, 10, 11, 249, 238, 10, 11, 249, 237, 10, 11, 249, 236, 10, \r
+    11, 249, 235, 10, 11, 249, 234, 10, 11, 249, 233, 10, 11, 249, 232, 10, \r
+    11, 249, 231, 10, 11, 249, 230, 10, 11, 249, 229, 10, 11, 249, 228, 10, \r
+    11, 249, 227, 10, 11, 249, 226, 10, 11, 249, 225, 10, 11, 249, 224, 10, \r
+    11, 249, 223, 10, 11, 249, 222, 10, 11, 249, 221, 10, 11, 249, 220, 10, \r
+    11, 249, 219, 10, 11, 249, 218, 10, 11, 249, 217, 10, 11, 249, 216, 10, \r
+    11, 249, 215, 10, 11, 249, 214, 10, 11, 249, 213, 10, 11, 249, 212, 10, \r
+    11, 249, 211, 10, 11, 249, 210, 10, 11, 247, 62, 10, 11, 247, 61, 10, 11, \r
+    247, 60, 10, 11, 247, 59, 10, 11, 247, 58, 10, 11, 247, 57, 10, 11, 247, \r
+    56, 10, 11, 247, 55, 10, 11, 247, 54, 10, 11, 247, 53, 10, 11, 247, 52, \r
+    10, 11, 247, 51, 10, 11, 247, 50, 10, 11, 247, 49, 10, 11, 247, 48, 10, \r
+    11, 247, 47, 10, 11, 247, 46, 10, 11, 247, 45, 10, 11, 247, 44, 10, 11, \r
+    247, 43, 10, 11, 247, 42, 10, 11, 247, 41, 10, 11, 247, 40, 10, 11, 247, \r
+    39, 10, 11, 247, 38, 10, 11, 247, 37, 10, 11, 247, 36, 10, 11, 247, 35, \r
+    10, 11, 247, 34, 10, 11, 247, 33, 10, 11, 247, 32, 10, 11, 247, 31, 10, \r
+    11, 247, 30, 10, 11, 247, 29, 10, 11, 247, 28, 10, 11, 247, 27, 10, 11, \r
+    247, 26, 10, 11, 247, 25, 10, 11, 247, 24, 10, 11, 247, 23, 10, 11, 247, \r
+    22, 10, 11, 247, 21, 10, 11, 247, 20, 10, 11, 247, 19, 10, 11, 246, 73, \r
+    10, 11, 246, 72, 10, 11, 246, 71, 10, 11, 246, 70, 10, 11, 246, 69, 10, \r
+    11, 246, 68, 10, 11, 246, 67, 10, 11, 246, 66, 10, 11, 246, 65, 10, 11, \r
+    246, 64, 10, 11, 246, 63, 10, 11, 246, 62, 10, 11, 246, 61, 10, 11, 246, \r
+    60, 10, 11, 246, 59, 10, 11, 246, 58, 10, 11, 246, 57, 10, 11, 246, 56, \r
+    10, 11, 246, 55, 10, 11, 246, 54, 10, 11, 246, 53, 10, 11, 246, 52, 10, \r
+    11, 246, 51, 10, 11, 246, 50, 10, 11, 246, 49, 10, 11, 246, 48, 10, 11, \r
+    246, 47, 10, 11, 246, 46, 10, 11, 246, 45, 10, 11, 246, 44, 10, 11, 246, \r
+    43, 10, 11, 246, 42, 10, 11, 246, 41, 10, 11, 246, 40, 10, 11, 246, 39, \r
+    10, 11, 246, 38, 10, 11, 246, 37, 10, 11, 246, 36, 10, 11, 246, 35, 10, \r
+    11, 246, 34, 10, 11, 246, 33, 10, 11, 246, 32, 10, 11, 246, 31, 10, 11, \r
+    246, 30, 10, 11, 246, 29, 10, 11, 246, 28, 10, 11, 246, 27, 10, 11, 246, \r
+    26, 10, 11, 246, 25, 10, 11, 246, 24, 10, 11, 246, 23, 10, 11, 246, 22, \r
+    10, 11, 246, 21, 10, 11, 246, 20, 10, 11, 246, 19, 10, 11, 246, 18, 10, \r
+    11, 246, 17, 10, 11, 246, 16, 10, 11, 246, 15, 10, 11, 246, 14, 10, 11, \r
+    246, 13, 10, 11, 246, 12, 10, 11, 246, 11, 10, 11, 246, 10, 10, 11, 246, \r
+    9, 10, 11, 245, 66, 10, 11, 245, 65, 10, 11, 245, 64, 10, 11, 245, 63, \r
+    10, 11, 245, 62, 10, 11, 245, 61, 10, 11, 245, 60, 10, 11, 245, 59, 10, \r
+    11, 245, 58, 10, 11, 245, 57, 10, 11, 245, 56, 10, 11, 245, 55, 10, 11, \r
+    245, 54, 10, 11, 245, 53, 10, 11, 245, 52, 10, 11, 245, 51, 10, 11, 245, \r
+    50, 10, 11, 245, 49, 10, 11, 245, 48, 10, 11, 245, 47, 10, 11, 245, 46, \r
+    10, 11, 245, 45, 10, 11, 245, 44, 10, 11, 245, 43, 10, 11, 245, 42, 10, \r
+    11, 245, 41, 10, 11, 245, 40, 10, 11, 245, 39, 10, 11, 245, 38, 10, 11, \r
+    245, 37, 10, 11, 245, 36, 10, 11, 245, 35, 10, 11, 245, 34, 10, 11, 245, \r
+    33, 10, 11, 245, 32, 10, 11, 245, 31, 10, 11, 245, 30, 10, 11, 245, 29, \r
+    10, 11, 245, 28, 10, 11, 245, 27, 10, 11, 245, 26, 10, 11, 245, 25, 10, \r
+    11, 245, 24, 10, 11, 245, 23, 10, 11, 245, 22, 10, 11, 245, 21, 10, 11, \r
+    245, 20, 10, 11, 245, 19, 10, 11, 245, 18, 10, 11, 245, 17, 10, 11, 245, \r
+    16, 10, 11, 245, 15, 10, 11, 245, 14, 10, 11, 245, 13, 10, 11, 245, 12, \r
+    10, 11, 245, 11, 10, 11, 245, 10, 10, 11, 245, 9, 10, 11, 245, 8, 10, 11, \r
+    245, 7, 10, 11, 245, 6, 10, 11, 245, 5, 10, 11, 245, 4, 10, 11, 245, 3, \r
+    10, 11, 243, 223, 10, 11, 243, 222, 10, 11, 243, 221, 10, 11, 243, 220, \r
+    10, 11, 243, 219, 10, 11, 243, 218, 10, 11, 243, 217, 10, 11, 243, 216, \r
+    10, 11, 243, 215, 10, 11, 242, 91, 10, 11, 242, 90, 10, 11, 242, 89, 10, \r
+    11, 242, 88, 10, 11, 242, 87, 10, 11, 242, 86, 10, 11, 242, 85, 10, 11, \r
+    242, 84, 10, 11, 242, 83, 10, 11, 242, 82, 10, 11, 242, 81, 10, 11, 242, \r
+    80, 10, 11, 242, 79, 10, 11, 242, 78, 10, 11, 242, 77, 10, 11, 242, 76, \r
+    10, 11, 242, 75, 10, 11, 242, 74, 10, 11, 242, 73, 10, 11, 237, 16, 10, \r
+    11, 237, 15, 10, 11, 237, 14, 10, 11, 237, 13, 10, 11, 237, 12, 10, 11, \r
+    237, 11, 10, 11, 237, 10, 10, 11, 237, 9, 10, 11, 235, 199, 10, 11, 235, \r
+    198, 10, 11, 235, 197, 10, 11, 235, 196, 10, 11, 235, 195, 10, 11, 235, \r
+    194, 10, 11, 235, 193, 10, 11, 235, 192, 10, 11, 235, 191, 10, 11, 235, \r
+    190, 10, 11, 234, 186, 10, 11, 234, 185, 10, 11, 234, 184, 10, 11, 234, \r
+    183, 10, 11, 234, 182, 10, 11, 234, 181, 10, 11, 234, 180, 10, 11, 234, \r
+    179, 10, 11, 234, 178, 10, 11, 234, 177, 10, 11, 234, 176, 10, 11, 234, \r
+    175, 10, 11, 234, 174, 10, 11, 234, 173, 10, 11, 234, 172, 10, 11, 234, \r
+    171, 10, 11, 234, 170, 10, 11, 234, 169, 10, 11, 234, 168, 10, 11, 234, \r
+    167, 10, 11, 234, 166, 10, 11, 234, 165, 10, 11, 234, 164, 10, 11, 234, \r
+    163, 10, 11, 234, 162, 10, 11, 234, 161, 10, 11, 234, 160, 10, 11, 234, \r
+    159, 10, 11, 234, 158, 10, 11, 234, 157, 10, 11, 234, 156, 10, 11, 234, \r
+    155, 10, 11, 234, 154, 10, 11, 234, 153, 10, 11, 234, 152, 10, 11, 234, \r
+    151, 10, 11, 234, 150, 10, 11, 234, 149, 10, 11, 234, 148, 10, 11, 234, \r
+    147, 10, 11, 234, 146, 10, 11, 234, 145, 10, 11, 234, 144, 10, 11, 234, \r
+    143, 10, 11, 234, 142, 10, 11, 234, 141, 10, 11, 234, 140, 10, 11, 234, \r
+    139, 10, 11, 234, 138, 10, 11, 234, 137, 10, 11, 234, 136, 10, 11, 234, \r
+    135, 10, 11, 234, 134, 10, 11, 234, 133, 10, 11, 234, 132, 10, 11, 234, \r
+    131, 10, 11, 234, 130, 10, 11, 234, 129, 10, 11, 234, 128, 10, 11, 234, \r
+    127, 10, 11, 234, 126, 10, 11, 234, 125, 10, 11, 234, 124, 10, 11, 234, \r
+    123, 10, 11, 234, 122, 10, 11, 234, 121, 10, 11, 233, 31, 10, 11, 233, \r
+    30, 10, 11, 233, 29, 10, 11, 233, 28, 10, 11, 233, 27, 10, 11, 233, 26, \r
+    10, 11, 233, 25, 10, 11, 233, 24, 10, 11, 233, 23, 10, 11, 233, 22, 10, \r
+    11, 233, 21, 10, 11, 233, 20, 10, 11, 233, 19, 10, 11, 233, 18, 10, 11, \r
+    233, 17, 10, 11, 233, 16, 10, 11, 233, 15, 10, 11, 233, 14, 10, 11, 233, \r
+    13, 10, 11, 233, 12, 10, 11, 233, 11, 10, 11, 233, 10, 10, 11, 233, 9, \r
+    10, 11, 233, 8, 10, 11, 233, 7, 10, 11, 233, 6, 10, 11, 233, 5, 10, 11, \r
+    233, 4, 10, 11, 233, 3, 10, 11, 233, 2, 10, 11, 233, 1, 10, 11, 233, 0, \r
+    10, 11, 232, 255, 10, 11, 232, 254, 10, 11, 232, 253, 10, 11, 232, 252, \r
+    10, 11, 232, 251, 10, 11, 232, 250, 10, 11, 232, 249, 10, 11, 232, 248, \r
+    10, 11, 232, 247, 10, 11, 232, 246, 10, 11, 232, 245, 10, 11, 232, 244, \r
+    10, 11, 232, 243, 10, 11, 232, 242, 10, 11, 232, 241, 10, 11, 232, 240, \r
+    10, 11, 232, 239, 10, 11, 231, 241, 10, 11, 231, 240, 10, 11, 231, 239, \r
+    10, 11, 231, 238, 10, 11, 231, 237, 10, 11, 231, 236, 10, 11, 231, 235, \r
+    10, 11, 231, 234, 10, 11, 231, 233, 10, 11, 231, 232, 10, 11, 231, 231, \r
+    10, 11, 231, 230, 10, 11, 231, 229, 10, 11, 231, 228, 10, 11, 231, 227, \r
+    10, 11, 231, 226, 10, 11, 231, 225, 10, 11, 231, 224, 10, 11, 231, 223, \r
+    10, 11, 231, 222, 10, 11, 231, 221, 10, 11, 231, 220, 10, 11, 231, 143, \r
+    10, 11, 231, 142, 10, 11, 231, 141, 10, 11, 231, 140, 10, 11, 231, 139, \r
+    10, 11, 231, 138, 10, 11, 231, 137, 10, 11, 231, 136, 10, 11, 231, 135, \r
+    10, 11, 231, 134, 10, 11, 231, 133, 10, 11, 231, 132, 10, 11, 231, 131, \r
+    10, 11, 231, 130, 10, 11, 231, 129, 10, 11, 231, 128, 10, 11, 231, 127, \r
+    10, 11, 231, 126, 10, 11, 231, 125, 10, 11, 231, 124, 10, 11, 231, 123, \r
+    10, 11, 231, 122, 10, 11, 231, 121, 10, 11, 231, 120, 10, 11, 231, 119, \r
+    10, 11, 231, 118, 10, 11, 231, 5, 10, 11, 231, 4, 10, 11, 231, 3, 10, 11, \r
+    231, 2, 10, 11, 231, 1, 10, 11, 231, 0, 10, 11, 230, 255, 10, 11, 230, \r
+    254, 10, 11, 230, 253, 10, 11, 230, 252, 10, 11, 230, 251, 10, 11, 230, \r
+    250, 10, 11, 230, 249, 10, 11, 230, 248, 10, 11, 230, 247, 10, 11, 230, \r
+    246, 10, 11, 230, 245, 10, 11, 230, 244, 10, 11, 230, 243, 10, 11, 230, \r
+    242, 10, 11, 230, 241, 10, 11, 230, 240, 10, 11, 230, 239, 10, 11, 230, \r
+    238, 10, 11, 230, 237, 10, 11, 230, 236, 10, 11, 230, 235, 10, 11, 230, \r
+    234, 10, 11, 230, 233, 10, 11, 230, 232, 10, 11, 230, 231, 10, 11, 230, \r
+    230, 10, 11, 230, 229, 10, 11, 230, 228, 10, 11, 230, 227, 10, 11, 230, \r
+    226, 10, 11, 230, 225, 10, 11, 230, 224, 10, 11, 230, 223, 10, 11, 230, \r
+    222, 10, 11, 230, 221, 10, 11, 230, 220, 10, 11, 230, 219, 10, 11, 230, \r
+    218, 10, 11, 230, 217, 10, 11, 230, 216, 10, 11, 230, 215, 10, 11, 230, \r
+    214, 10, 11, 230, 213, 10, 11, 230, 212, 10, 11, 230, 211, 10, 11, 230, \r
+    210, 10, 11, 230, 209, 10, 11, 230, 208, 10, 11, 230, 207, 10, 11, 230, \r
+    206, 10, 11, 230, 205, 10, 11, 230, 204, 10, 11, 230, 203, 10, 11, 230, \r
+    202, 10, 11, 230, 201, 10, 11, 230, 200, 10, 11, 230, 199, 10, 11, 230, \r
+    198, 10, 11, 230, 197, 10, 11, 230, 196, 10, 11, 230, 195, 10, 11, 230, \r
+    194, 10, 11, 230, 193, 10, 11, 230, 192, 10, 11, 230, 191, 10, 11, 230, \r
+    190, 10, 11, 230, 189, 10, 11, 230, 188, 10, 11, 230, 187, 10, 11, 230, \r
+    58, 10, 11, 230, 57, 10, 11, 230, 56, 10, 11, 230, 55, 10, 11, 230, 54, \r
+    10, 11, 230, 53, 10, 11, 230, 52, 10, 11, 230, 51, 10, 11, 230, 50, 10, \r
+    11, 230, 49, 10, 11, 230, 48, 10, 11, 230, 47, 10, 11, 230, 46, 10, 11, \r
+    228, 162, 10, 11, 228, 161, 10, 11, 228, 160, 10, 11, 228, 159, 10, 11, \r
+    228, 158, 10, 11, 228, 157, 10, 11, 228, 156, 10, 11, 228, 37, 10, 11, \r
+    228, 36, 10, 11, 228, 35, 10, 11, 228, 34, 10, 11, 228, 33, 10, 11, 228, \r
+    32, 10, 11, 228, 31, 10, 11, 228, 30, 10, 11, 228, 29, 10, 11, 228, 28, \r
+    10, 11, 228, 27, 10, 11, 228, 26, 10, 11, 228, 25, 10, 11, 228, 24, 10, \r
+    11, 228, 23, 10, 11, 228, 22, 10, 11, 228, 21, 10, 11, 228, 20, 10, 11, \r
+    228, 19, 10, 11, 228, 18, 10, 11, 228, 17, 10, 11, 228, 16, 10, 11, 228, \r
+    15, 10, 11, 228, 14, 10, 11, 228, 13, 10, 11, 228, 12, 10, 11, 228, 11, \r
+    10, 11, 228, 10, 10, 11, 228, 9, 10, 11, 228, 8, 10, 11, 228, 7, 10, 11, \r
+    228, 6, 10, 11, 228, 5, 10, 11, 228, 4, 10, 11, 226, 232, 10, 11, 226, \r
+    231, 10, 11, 226, 230, 10, 11, 226, 229, 10, 11, 226, 228, 10, 11, 226, \r
+    227, 10, 11, 226, 226, 10, 11, 226, 225, 10, 11, 226, 224, 10, 11, 226, \r
+    223, 10, 11, 226, 222, 10, 11, 226, 221, 10, 11, 226, 220, 10, 11, 226, \r
+    219, 10, 11, 226, 218, 10, 11, 226, 217, 10, 11, 226, 216, 10, 11, 226, \r
+    215, 10, 11, 226, 214, 10, 11, 226, 213, 10, 11, 226, 212, 10, 11, 226, \r
+    211, 10, 11, 226, 210, 10, 11, 226, 209, 10, 11, 226, 208, 10, 11, 226, \r
+    207, 10, 11, 226, 206, 10, 11, 226, 205, 10, 11, 226, 204, 10, 11, 226, \r
+    203, 10, 11, 226, 202, 10, 11, 226, 201, 10, 11, 226, 200, 10, 11, 226, \r
+    199, 10, 11, 226, 198, 10, 11, 226, 197, 10, 11, 226, 196, 10, 11, 226, \r
+    195, 10, 11, 226, 194, 10, 11, 226, 193, 10, 11, 226, 192, 10, 11, 226, \r
+    191, 10, 11, 226, 190, 10, 11, 226, 189, 10, 11, 226, 188, 10, 11, 226, \r
+    187, 10, 11, 226, 186, 10, 11, 226, 185, 10, 11, 226, 184, 10, 11, 226, \r
+    183, 10, 11, 226, 182, 10, 11, 226, 181, 10, 11, 226, 180, 10, 11, 226, \r
+    179, 10, 11, 222, 200, 10, 11, 222, 199, 10, 11, 222, 198, 10, 11, 222, \r
+    197, 10, 11, 222, 196, 10, 11, 222, 195, 10, 11, 222, 194, 10, 11, 222, \r
+    193, 10, 11, 222, 192, 10, 11, 222, 191, 10, 11, 222, 190, 10, 11, 222, \r
+    189, 10, 11, 222, 188, 10, 11, 222, 187, 10, 11, 222, 186, 10, 11, 222, \r
+    185, 10, 11, 222, 184, 10, 11, 222, 183, 10, 11, 222, 182, 10, 11, 222, \r
+    181, 10, 11, 222, 180, 10, 11, 222, 179, 10, 11, 222, 178, 10, 11, 222, \r
+    177, 10, 11, 222, 176, 10, 11, 222, 175, 10, 11, 222, 174, 10, 11, 222, \r
+    173, 10, 11, 222, 172, 10, 11, 222, 171, 10, 11, 222, 170, 10, 11, 222, \r
+    169, 10, 11, 222, 168, 10, 11, 222, 167, 10, 11, 222, 166, 10, 11, 222, \r
+    165, 10, 11, 222, 164, 10, 11, 222, 163, 10, 11, 222, 162, 10, 11, 222, \r
+    161, 10, 11, 222, 160, 10, 11, 222, 159, 10, 11, 222, 158, 10, 11, 222, \r
+    157, 10, 11, 220, 172, 10, 11, 220, 171, 10, 11, 220, 170, 10, 11, 220, \r
+    169, 10, 11, 220, 168, 10, 11, 220, 167, 10, 11, 220, 166, 10, 11, 220, \r
+    165, 10, 11, 220, 164, 10, 11, 220, 163, 10, 11, 220, 162, 10, 11, 220, \r
+    161, 10, 11, 220, 160, 10, 11, 220, 159, 10, 11, 220, 158, 10, 11, 220, \r
+    157, 10, 11, 220, 156, 10, 11, 220, 155, 10, 11, 220, 154, 10, 11, 220, \r
+    153, 10, 11, 220, 152, 10, 11, 220, 151, 10, 11, 220, 150, 10, 11, 220, \r
+    149, 10, 11, 220, 148, 10, 11, 220, 147, 10, 11, 220, 146, 10, 11, 220, \r
+    145, 10, 11, 220, 144, 10, 11, 220, 143, 10, 11, 220, 142, 10, 11, 220, \r
+    141, 10, 11, 220, 140, 10, 11, 220, 139, 10, 11, 220, 138, 10, 11, 220, \r
+    137, 10, 11, 220, 136, 10, 11, 220, 135, 10, 11, 220, 134, 10, 11, 220, \r
+    133, 10, 11, 220, 132, 10, 11, 220, 131, 10, 11, 220, 130, 10, 11, 220, \r
+    129, 10, 11, 220, 128, 10, 11, 220, 127, 10, 11, 220, 126, 10, 11, 220, \r
+    10, 10, 11, 220, 9, 10, 11, 220, 8, 10, 11, 220, 7, 10, 11, 220, 6, 10, \r
+    11, 220, 5, 10, 11, 220, 4, 10, 11, 220, 3, 10, 11, 220, 2, 10, 11, 220, \r
+    1, 10, 11, 220, 0, 10, 11, 219, 255, 10, 11, 219, 254, 10, 11, 219, 253, \r
+    10, 11, 219, 252, 10, 11, 219, 251, 10, 11, 219, 250, 10, 11, 219, 249, \r
+    10, 11, 219, 248, 10, 11, 219, 247, 10, 11, 219, 246, 10, 11, 219, 245, \r
+    10, 11, 219, 244, 10, 11, 219, 243, 10, 11, 219, 242, 10, 11, 219, 241, \r
+    10, 11, 219, 240, 10, 11, 219, 239, 10, 11, 219, 238, 10, 11, 219, 237, \r
+    10, 11, 219, 236, 10, 11, 219, 235, 10, 11, 219, 234, 10, 11, 219, 233, \r
+    10, 11, 219, 232, 10, 11, 219, 231, 10, 11, 219, 230, 10, 11, 219, 229, \r
+    10, 11, 219, 228, 10, 11, 219, 227, 10, 11, 219, 226, 10, 11, 219, 225, \r
+    10, 11, 219, 224, 10, 11, 219, 223, 10, 11, 219, 222, 10, 11, 219, 221, \r
+    10, 11, 219, 220, 10, 11, 219, 219, 10, 11, 219, 218, 10, 11, 219, 217, \r
+    10, 11, 219, 216, 10, 11, 219, 215, 10, 11, 219, 214, 10, 11, 219, 213, \r
+    10, 11, 219, 212, 10, 11, 219, 211, 10, 11, 219, 210, 10, 11, 219, 209, \r
+    10, 11, 219, 208, 10, 11, 219, 207, 10, 11, 219, 206, 10, 11, 219, 205, \r
+    10, 11, 219, 204, 10, 11, 219, 203, 10, 11, 219, 202, 10, 11, 219, 201, \r
+    10, 11, 219, 200, 10, 11, 219, 199, 10, 11, 219, 198, 10, 11, 219, 197, \r
+    10, 11, 219, 196, 10, 11, 219, 195, 10, 11, 219, 194, 10, 11, 219, 193, \r
+    10, 11, 219, 192, 10, 11, 219, 191, 10, 11, 219, 190, 10, 11, 219, 39, \r
+    10, 11, 219, 38, 10, 11, 219, 37, 10, 11, 219, 36, 10, 11, 219, 35, 10, \r
+    11, 219, 34, 10, 11, 219, 33, 10, 11, 219, 32, 10, 11, 219, 31, 10, 11, \r
+    219, 30, 10, 11, 219, 29, 10, 11, 219, 28, 10, 11, 219, 27, 10, 11, 219, \r
+    26, 10, 11, 219, 25, 10, 11, 219, 24, 10, 11, 219, 23, 10, 11, 219, 22, \r
+    10, 11, 219, 21, 10, 11, 219, 20, 10, 11, 219, 19, 10, 11, 219, 18, 10, \r
+    11, 219, 17, 10, 11, 219, 16, 10, 11, 219, 15, 10, 11, 219, 14, 10, 11, \r
+    219, 13, 10, 11, 219, 12, 10, 11, 219, 11, 10, 11, 219, 10, 10, 11, 219, \r
+    9, 10, 11, 219, 8, 10, 11, 218, 150, 10, 11, 218, 149, 10, 11, 218, 148, \r
+    10, 11, 218, 147, 10, 11, 218, 146, 10, 11, 218, 145, 10, 11, 218, 144, \r
+    10, 11, 218, 143, 10, 11, 218, 142, 10, 11, 218, 141, 10, 11, 218, 140, \r
+    10, 11, 218, 139, 10, 11, 218, 88, 10, 11, 218, 87, 10, 11, 218, 86, 10, \r
+    11, 218, 85, 10, 11, 218, 84, 10, 11, 218, 83, 10, 11, 218, 82, 10, 11, \r
+    218, 81, 10, 11, 218, 80, 10, 11, 217, 156, 10, 11, 217, 155, 10, 11, \r
+    217, 154, 10, 11, 217, 153, 10, 11, 217, 152, 10, 11, 217, 151, 10, 11, \r
+    217, 150, 10, 11, 217, 149, 10, 11, 217, 148, 10, 11, 217, 147, 10, 11, \r
+    217, 146, 10, 11, 217, 145, 10, 11, 217, 144, 10, 11, 217, 143, 10, 11, \r
+    217, 142, 10, 11, 217, 141, 10, 11, 217, 140, 10, 11, 217, 139, 10, 11, \r
+    217, 138, 10, 11, 217, 137, 10, 11, 217, 136, 10, 11, 217, 135, 10, 11, \r
+    217, 134, 10, 11, 217, 133, 10, 11, 217, 132, 10, 11, 217, 131, 10, 11, \r
+    217, 130, 10, 11, 217, 129, 10, 11, 217, 128, 10, 11, 217, 127, 10, 11, \r
+    217, 126, 10, 11, 217, 125, 10, 11, 217, 124, 10, 11, 217, 123, 10, 11, \r
+    217, 122, 10, 11, 217, 121, 10, 11, 217, 120, 10, 11, 217, 119, 10, 11, \r
+    217, 118, 10, 11, 217, 117, 10, 11, 217, 116, 10, 11, 255, 57, 10, 11, \r
+    255, 56, 10, 11, 255, 55, 10, 11, 255, 54, 10, 11, 255, 53, 10, 11, 255, \r
+    52, 10, 11, 255, 51, 10, 11, 255, 50, 10, 11, 255, 49, 10, 11, 255, 48, \r
+    10, 11, 255, 47, 10, 11, 255, 46, 10, 11, 255, 45, 10, 11, 255, 44, 10, \r
+    11, 255, 43, 10, 11, 255, 42, 10, 11, 255, 41, 10, 11, 255, 40, 10, 11, \r
+    255, 39, 10, 11, 255, 38, 10, 11, 255, 37, 10, 11, 255, 36, 10, 11, 255, \r
+    35, 10, 11, 255, 34, 10, 11, 255, 33, 10, 11, 255, 32, 10, 11, 255, 31, \r
+    10, 11, 255, 30, 10, 11, 255, 29, 10, 11, 255, 28, 10, 11, 255, 27, 10, \r
+    11, 255, 26, 10, 11, 255, 25, 10, 11, 255, 24, 46, 26, 16, 228, 206, 46, \r
+    26, 16, 249, 148, 46, 26, 16, 229, 163, 46, 26, 16, 230, 67, 246, 221, \r
+    46, 26, 16, 230, 67, 248, 214, 46, 26, 16, 219, 181, 246, 221, 46, 26, \r
+    16, 219, 181, 248, 214, 46, 26, 16, 236, 198, 46, 26, 16, 222, 217, 46, \r
+    26, 16, 229, 235, 46, 26, 16, 217, 205, 46, 26, 16, 217, 206, 248, 214, \r
+    46, 26, 16, 236, 12, 46, 26, 16, 254, 89, 246, 221, 46, 26, 16, 246, 90, \r
+    246, 221, 46, 26, 16, 222, 73, 46, 26, 16, 236, 164, 46, 26, 16, 254, 80, \r
+    46, 26, 16, 254, 81, 248, 214, 46, 26, 16, 222, 222, 46, 26, 16, 221, \r
+    242, 46, 26, 16, 230, 148, 254, 47, 46, 26, 16, 244, 56, 254, 47, 46, 26, \r
+    16, 228, 205, 46, 26, 16, 251, 62, 46, 26, 16, 219, 171, 46, 26, 16, 237, \r
+    144, 254, 47, 46, 26, 16, 236, 166, 254, 47, 46, 26, 16, 236, 165, 254, \r
+    47, 46, 26, 16, 226, 119, 46, 26, 16, 229, 226, 46, 26, 16, 223, 151, \r
+    254, 83, 46, 26, 16, 230, 66, 254, 47, 46, 26, 16, 219, 180, 254, 47, 46, \r
+    26, 16, 254, 84, 254, 47, 46, 26, 16, 254, 78, 46, 26, 16, 236, 65, 46, \r
+    26, 16, 227, 157, 46, 26, 16, 229, 106, 254, 47, 46, 26, 16, 221, 175, \r
+    46, 26, 16, 254, 129, 46, 26, 16, 226, 75, 46, 26, 16, 222, 225, 254, 47, \r
+    46, 26, 16, 222, 225, 233, 239, 223, 149, 46, 26, 16, 230, 61, 254, 47, \r
+    46, 26, 16, 222, 17, 46, 26, 16, 235, 97, 46, 26, 16, 247, 77, 46, 26, \r
+    16, 221, 92, 46, 26, 16, 222, 52, 46, 26, 16, 236, 15, 46, 26, 16, 254, \r
+    89, 246, 90, 232, 131, 46, 26, 16, 245, 93, 254, 47, 46, 26, 16, 237, \r
+    234, 46, 26, 16, 221, 68, 254, 47, 46, 26, 16, 236, 201, 221, 67, 46, 26, \r
+    16, 229, 182, 46, 26, 16, 228, 209, 46, 26, 16, 236, 42, 46, 26, 16, 251, \r
+    6, 254, 47, 46, 26, 16, 227, 232, 46, 26, 16, 229, 238, 254, 47, 46, 26, \r
+    16, 229, 236, 254, 47, 46, 26, 16, 242, 63, 46, 26, 16, 232, 217, 46, 26, \r
+    16, 229, 148, 46, 26, 16, 236, 43, 254, 152, 46, 26, 16, 221, 68, 254, \r
+    152, 46, 26, 16, 223, 132, 46, 26, 16, 244, 25, 46, 26, 16, 237, 144, \r
+    232, 131, 46, 26, 16, 230, 148, 232, 131, 46, 26, 16, 230, 67, 232, 131, \r
+    46, 26, 16, 229, 147, 46, 26, 16, 236, 29, 46, 26, 16, 229, 146, 46, 26, \r
+    16, 236, 14, 46, 26, 16, 229, 183, 232, 131, 46, 26, 16, 236, 165, 232, \r
+    132, 254, 109, 46, 26, 16, 236, 166, 232, 132, 254, 109, 46, 26, 16, 217, \r
+    203, 46, 26, 16, 254, 81, 232, 131, 46, 26, 16, 254, 82, 222, 223, 232, \r
+    131, 46, 26, 16, 217, 204, 46, 26, 16, 236, 13, 46, 26, 16, 246, 216, 46, \r
+    26, 16, 251, 63, 46, 26, 16, 233, 168, 237, 143, 46, 26, 16, 219, 181, \r
+    232, 131, 46, 26, 16, 229, 106, 232, 131, 46, 26, 16, 228, 210, 232, 131, \r
+    46, 26, 16, 230, 145, 46, 26, 16, 254, 100, 46, 26, 16, 234, 195, 46, 26, \r
+    16, 229, 236, 232, 131, 46, 26, 16, 229, 238, 232, 131, 46, 26, 16, 246, \r
+    119, 229, 237, 46, 26, 16, 235, 206, 46, 26, 16, 254, 101, 46, 26, 16, \r
+    221, 68, 232, 131, 46, 26, 16, 246, 219, 46, 26, 16, 222, 225, 232, 131, \r
+    46, 26, 16, 222, 218, 46, 26, 16, 251, 6, 232, 131, 46, 26, 16, 246, 161, \r
+    46, 26, 16, 226, 76, 232, 131, 46, 26, 16, 218, 124, 236, 65, 46, 26, 16, \r
+    221, 65, 46, 26, 16, 228, 211, 46, 26, 16, 221, 69, 46, 26, 16, 221, 66, \r
+    46, 26, 16, 228, 208, 46, 26, 16, 221, 64, 46, 26, 16, 228, 207, 46, 26, \r
+    16, 244, 55, 46, 26, 16, 254, 41, 46, 26, 16, 246, 119, 254, 41, 46, 26, \r
+    16, 230, 61, 232, 131, 46, 26, 16, 222, 16, 246, 127, 46, 26, 16, 222, \r
+    16, 246, 89, 46, 26, 16, 222, 18, 254, 85, 46, 26, 16, 222, 11, 236, 244, \r
+    254, 77, 46, 26, 16, 236, 200, 46, 26, 16, 246, 186, 46, 26, 16, 217, \r
+    253, 236, 197, 46, 26, 16, 217, 253, 254, 109, 46, 26, 16, 223, 150, 46, \r
+    26, 16, 236, 66, 254, 109, 46, 26, 16, 248, 215, 254, 47, 46, 26, 16, \r
+    236, 16, 254, 47, 46, 26, 16, 236, 16, 254, 152, 46, 26, 16, 236, 16, \r
+    232, 131, 46, 26, 16, 254, 84, 232, 131, 46, 26, 16, 254, 86, 46, 26, 16, \r
+    248, 214, 46, 26, 16, 221, 77, 46, 26, 16, 222, 44, 46, 26, 16, 236, 33, \r
+    46, 26, 16, 235, 102, 246, 182, 250, 255, 46, 26, 16, 235, 102, 247, 78, \r
+    251, 0, 46, 26, 16, 235, 102, 221, 79, 251, 0, 46, 26, 16, 235, 102, 222, \r
+    54, 251, 0, 46, 26, 16, 235, 102, 237, 229, 250, 255, 46, 26, 16, 244, \r
+    56, 232, 132, 254, 109, 46, 26, 16, 244, 56, 229, 227, 254, 37, 46, 26, \r
+    16, 244, 56, 229, 227, 249, 40, 46, 26, 16, 248, 238, 46, 26, 16, 248, \r
+    239, 229, 227, 254, 38, 236, 197, 46, 26, 16, 248, 239, 229, 227, 254, \r
+    38, 254, 109, 46, 26, 16, 248, 239, 229, 227, 249, 40, 46, 26, 16, 221, \r
+    83, 46, 26, 16, 254, 42, 46, 26, 16, 237, 236, 46, 26, 16, 249, 3, 46, \r
+    26, 16, 254, 204, 229, 23, 254, 43, 46, 26, 16, 254, 204, 254, 40, 46, \r
+    26, 16, 254, 204, 254, 43, 46, 26, 16, 254, 204, 233, 234, 46, 26, 16, \r
+    254, 204, 233, 242, 46, 26, 16, 254, 204, 244, 57, 46, 26, 16, 254, 204, \r
+    244, 54, 46, 26, 16, 254, 204, 229, 23, 244, 57, 46, 26, 16, 234, 60, \r
+    228, 216, 242, 61, 46, 26, 16, 234, 60, 254, 154, 228, 216, 242, 61, 46, \r
+    26, 16, 234, 60, 249, 39, 242, 61, 46, 26, 16, 234, 60, 254, 154, 249, \r
+    39, 242, 61, 46, 26, 16, 234, 60, 221, 72, 242, 61, 46, 26, 16, 234, 60, \r
+    221, 84, 46, 26, 16, 234, 60, 222, 48, 242, 61, 46, 26, 16, 234, 60, 222, \r
+    48, 235, 105, 242, 61, 46, 26, 16, 234, 60, 235, 105, 242, 61, 46, 26, \r
+    16, 234, 60, 229, 55, 242, 61, 46, 26, 16, 237, 149, 222, 69, 242, 62, \r
+    46, 26, 16, 254, 82, 222, 69, 242, 62, 46, 26, 16, 245, 244, 222, 45, 46, \r
+    26, 16, 245, 244, 233, 126, 46, 26, 16, 245, 244, 248, 243, 46, 26, 16, \r
+    234, 60, 219, 175, 242, 61, 46, 26, 16, 234, 60, 228, 215, 242, 61, 46, \r
+    26, 16, 234, 60, 229, 55, 222, 48, 242, 61, 46, 26, 16, 244, 52, 233, 34, \r
+    254, 85, 46, 26, 16, 244, 52, 233, 34, 248, 213, 46, 26, 16, 246, 195, \r
+    236, 244, 245, 93, 219, 61, 46, 26, 16, 237, 235, 46, 26, 16, 237, 233, \r
+    46, 26, 16, 245, 93, 254, 48, 249, 38, 242, 60, 46, 26, 16, 245, 93, 249, \r
+    1, 187, 46, 26, 16, 245, 93, 249, 1, 232, 217, 46, 26, 16, 245, 93, 232, \r
+    213, 242, 61, 46, 26, 16, 245, 93, 249, 1, 249, 15, 46, 26, 16, 245, 93, \r
+    224, 61, 249, 0, 249, 15, 46, 26, 16, 245, 93, 249, 1, 236, 184, 46, 26, \r
+    16, 245, 93, 249, 1, 217, 21, 46, 26, 16, 245, 93, 249, 1, 232, 63, 236, \r
+    197, 46, 26, 16, 245, 93, 249, 1, 232, 63, 254, 109, 46, 26, 16, 245, 93, \r
+    234, 91, 251, 1, 248, 243, 46, 26, 16, 245, 93, 234, 91, 251, 1, 233, \r
+    126, 46, 26, 16, 245, 204, 224, 61, 251, 1, 219, 174, 46, 26, 16, 245, \r
+    93, 224, 61, 251, 1, 222, 226, 46, 26, 16, 245, 93, 232, 133, 46, 26, 16, \r
+    251, 2, 216, 253, 46, 26, 16, 251, 2, 236, 64, 46, 26, 16, 251, 2, 223, \r
+    250, 46, 26, 16, 245, 93, 242, 107, 217, 252, 222, 49, 46, 26, 16, 245, \r
+    93, 246, 196, 254, 102, 46, 26, 16, 217, 252, 221, 73, 46, 26, 16, 248, \r
+    251, 221, 73, 46, 26, 16, 248, 251, 222, 49, 46, 26, 16, 248, 251, 254, \r
+    87, 247, 78, 248, 161, 46, 26, 16, 248, 251, 233, 124, 222, 53, 248, 161, \r
+    46, 26, 16, 248, 251, 248, 235, 246, 99, 248, 161, 46, 26, 16, 248, 251, \r
+    221, 81, 230, 152, 248, 161, 46, 26, 16, 217, 252, 254, 87, 247, 78, 248, \r
+    161, 46, 26, 16, 217, 252, 233, 124, 222, 53, 248, 161, 46, 26, 16, 217, \r
+    252, 248, 235, 246, 99, 248, 161, 46, 26, 16, 217, 252, 221, 81, 230, \r
+    152, 248, 161, 46, 26, 16, 244, 179, 248, 250, 46, 26, 16, 244, 179, 217, \r
+    251, 46, 26, 16, 249, 2, 254, 87, 233, 169, 46, 26, 16, 249, 2, 254, 87, \r
+    234, 8, 46, 26, 16, 249, 2, 248, 214, 46, 26, 16, 249, 2, 222, 9, 46, 26, \r
+    16, 224, 117, 222, 9, 46, 26, 16, 224, 117, 222, 10, 248, 201, 46, 26, \r
+    16, 224, 117, 222, 10, 221, 74, 46, 26, 16, 224, 117, 222, 10, 222, 42, \r
+    46, 26, 16, 224, 117, 254, 17, 46, 26, 16, 224, 117, 254, 18, 248, 201, \r
+    46, 26, 16, 224, 117, 254, 18, 221, 74, 46, 26, 16, 224, 117, 254, 18, \r
+    222, 42, 46, 26, 16, 248, 236, 244, 161, 46, 26, 16, 248, 242, 230, 86, \r
+    46, 26, 16, 223, 144, 46, 26, 16, 254, 34, 187, 46, 26, 16, 254, 34, 219, \r
+    61, 46, 26, 16, 254, 34, 245, 0, 46, 26, 16, 254, 34, 249, 15, 46, 26, \r
+    16, 254, 34, 236, 184, 46, 26, 16, 254, 34, 217, 21, 46, 26, 16, 254, 34, \r
+    232, 62, 46, 26, 16, 236, 165, 232, 132, 233, 241, 46, 26, 16, 236, 166, \r
+    232, 132, 233, 241, 46, 26, 16, 236, 165, 232, 132, 236, 197, 46, 26, 16, \r
+    236, 166, 232, 132, 236, 197, 46, 26, 16, 236, 66, 236, 197, 46, 26, 16, \r
+    244, 56, 232, 132, 236, 197, 26, 16, 224, 109, 252, 197, 26, 16, 51, 252, \r
+    197, 26, 16, 39, 252, 197, 26, 16, 227, 160, 39, 252, 197, 26, 16, 249, \r
+    145, 252, 197, 26, 16, 224, 192, 252, 197, 26, 16, 42, 227, 182, 55, 26, \r
+    16, 45, 227, 182, 55, 26, 16, 227, 182, 248, 143, 26, 16, 249, 184, 226, \r
+    79, 26, 16, 249, 208, 251, 141, 26, 16, 226, 79, 26, 16, 250, 180, 26, \r
+    16, 227, 180, 245, 193, 26, 16, 227, 180, 245, 192, 26, 16, 227, 180, \r
+    245, 191, 26, 16, 245, 210, 26, 16, 245, 211, 56, 26, 16, 252, 10, 78, \r
+    26, 16, 251, 163, 26, 16, 252, 19, 26, 16, 115, 26, 16, 230, 136, 223, \r
+    163, 26, 16, 220, 205, 223, 163, 26, 16, 221, 227, 223, 163, 26, 16, 245, \r
+    115, 223, 163, 26, 16, 245, 169, 223, 163, 26, 16, 224, 81, 223, 163, 26, \r
+    16, 224, 79, 245, 101, 26, 16, 245, 113, 245, 101, 26, 16, 245, 68, 250, \r
+    207, 26, 16, 245, 68, 250, 208, 230, 88, 254, 145, 26, 16, 245, 68, 250, \r
+    208, 230, 88, 252, 185, 26, 16, 251, 203, 250, 207, 26, 16, 246, 75, 250, \r
+    207, 26, 16, 246, 75, 250, 208, 230, 88, 254, 145, 26, 16, 246, 75, 250, \r
+    208, 230, 88, 252, 185, 26, 16, 247, 116, 250, 206, 26, 16, 247, 116, \r
+    250, 205, 26, 16, 233, 85, 234, 24, 227, 168, 26, 16, 51, 225, 0, 26, 16, \r
+    51, 245, 156, 26, 16, 245, 157, 220, 63, 26, 16, 245, 157, 247, 132, 26, \r
+    16, 232, 205, 220, 63, 26, 16, 232, 205, 247, 132, 26, 16, 225, 1, 220, \r
+    63, 26, 16, 225, 1, 247, 132, 26, 16, 228, 90, 145, 225, 0, 26, 16, 228, \r
+    90, 145, 245, 156, 26, 16, 250, 166, 221, 177, 26, 16, 250, 69, 221, 177, \r
+    26, 16, 230, 88, 254, 145, 26, 16, 230, 88, 252, 185, 26, 16, 228, 74, \r
+    254, 145, 26, 16, 228, 74, 252, 185, 26, 16, 233, 88, 227, 168, 26, 16, \r
+    218, 205, 227, 168, 26, 16, 144, 227, 168, 26, 16, 228, 90, 227, 168, 26, \r
+    16, 246, 232, 227, 168, 26, 16, 224, 76, 227, 168, 26, 16, 221, 243, 227, \r
+    168, 26, 16, 224, 68, 227, 168, 26, 16, 131, 242, 162, 220, 217, 227, \r
+    168, 26, 16, 218, 152, 231, 178, 26, 16, 88, 231, 178, 26, 16, 250, 222, \r
+    218, 152, 231, 178, 26, 16, 40, 231, 179, 218, 207, 26, 16, 40, 231, 179, \r
+    252, 53, 26, 16, 221, 91, 231, 179, 108, 218, 207, 26, 16, 221, 91, 231, \r
+    179, 108, 252, 53, 26, 16, 221, 91, 231, 179, 42, 218, 207, 26, 16, 221, \r
+    91, 231, 179, 42, 252, 53, 26, 16, 221, 91, 231, 179, 45, 218, 207, 26, \r
+    16, 221, 91, 231, 179, 45, 252, 53, 26, 16, 221, 91, 231, 179, 113, 218, \r
+    207, 26, 16, 221, 91, 231, 179, 113, 252, 53, 26, 16, 221, 91, 231, 179, \r
+    108, 45, 218, 207, 26, 16, 221, 91, 231, 179, 108, 45, 252, 53, 26, 16, \r
+    233, 118, 231, 179, 218, 207, 26, 16, 233, 118, 231, 179, 252, 53, 26, \r
+    16, 221, 88, 231, 179, 113, 218, 207, 26, 16, 221, 88, 231, 179, 113, \r
+    252, 53, 26, 16, 229, 230, 231, 178, 26, 16, 219, 67, 231, 178, 26, 16, \r
+    231, 179, 252, 53, 26, 16, 231, 111, 231, 178, 26, 16, 250, 185, 231, \r
+    179, 218, 207, 26, 16, 250, 185, 231, 179, 252, 53, 26, 16, 252, 8, 26, \r
+    16, 218, 205, 231, 180, 26, 16, 144, 231, 180, 26, 16, 228, 90, 231, 180, \r
+    26, 16, 246, 232, 231, 180, 26, 16, 224, 76, 231, 180, 26, 16, 221, 243, \r
+    231, 180, 26, 16, 224, 68, 231, 180, 26, 16, 131, 242, 162, 220, 217, \r
+    231, 180, 26, 16, 36, 223, 146, 26, 16, 36, 223, 233, 223, 146, 26, 16, \r
+    36, 221, 97, 26, 16, 36, 221, 96, 26, 16, 36, 221, 95, 26, 16, 245, 183, \r
+    221, 97, 26, 16, 245, 183, 221, 96, 26, 16, 245, 183, 221, 95, 26, 16, \r
+    36, 253, 230, 248, 145, 26, 16, 36, 245, 162, 26, 16, 36, 245, 161, 26, \r
+    16, 36, 245, 160, 26, 16, 36, 245, 159, 26, 16, 36, 245, 158, 26, 16, \r
+    252, 131, 252, 143, 26, 16, 246, 190, 252, 143, 26, 16, 252, 131, 221, \r
+    200, 26, 16, 246, 190, 221, 200, 26, 16, 252, 131, 224, 44, 26, 16, 246, \r
+    190, 224, 44, 26, 16, 252, 131, 229, 115, 26, 16, 246, 190, 229, 115, 26, \r
+    16, 36, 255, 0, 26, 16, 36, 223, 165, 26, 16, 36, 222, 58, 26, 16, 36, \r
+    223, 166, 26, 16, 36, 234, 71, 26, 16, 36, 234, 70, 26, 16, 36, 254, 255, \r
+    26, 16, 36, 234, 240, 26, 16, 254, 25, 220, 63, 26, 16, 254, 25, 247, \r
+    132, 26, 16, 36, 248, 158, 26, 16, 36, 227, 91, 26, 16, 36, 245, 150, 26, \r
+    16, 36, 224, 40, 26, 16, 36, 252, 113, 26, 16, 36, 51, 221, 124, 26, 16, \r
+    36, 221, 78, 221, 124, 26, 16, 227, 95, 26, 16, 223, 99, 26, 16, 217, \r
+    157, 26, 16, 229, 107, 26, 16, 233, 231, 26, 16, 245, 121, 26, 16, 250, \r
+    106, 26, 16, 249, 83, 26, 16, 244, 47, 231, 181, 224, 55, 26, 16, 244, \r
+    47, 231, 181, 231, 205, 224, 55, 26, 16, 221, 109, 26, 16, 220, 237, 26, \r
+    16, 237, 170, 220, 237, 26, 16, 220, 238, 224, 55, 26, 16, 220, 238, 220, \r
+    63, 26, 16, 230, 99, 223, 119, 26, 16, 230, 99, 223, 116, 26, 16, 230, \r
+    99, 223, 115, 26, 16, 230, 99, 223, 114, 26, 16, 230, 99, 223, 113, 26, \r
+    16, 230, 99, 223, 112, 26, 16, 230, 99, 223, 111, 26, 16, 230, 99, 223, \r
+    110, 26, 16, 230, 99, 223, 109, 26, 16, 230, 99, 223, 118, 26, 16, 230, \r
+    99, 223, 117, 26, 16, 243, 169, 26, 16, 232, 140, 26, 16, 246, 190, 117, \r
+    223, 140, 26, 16, 249, 77, 224, 55, 26, 16, 36, 113, 252, 24, 26, 16, 36, \r
+    108, 252, 24, 26, 16, 36, 243, 178, 26, 16, 36, 224, 34, 229, 59, 26, 16, \r
+    229, 195, 78, 26, 16, 229, 195, 108, 78, 26, 16, 144, 229, 195, 78, 26, \r
+    16, 244, 74, 220, 63, 26, 16, 244, 74, 247, 132, 26, 16, 2, 245, 182, 26, \r
+    16, 249, 168, 26, 16, 249, 169, 254, 157, 26, 16, 234, 46, 26, 16, 234, \r
+    250, 26, 16, 252, 5, 26, 16, 225, 71, 218, 207, 26, 16, 225, 71, 252, 53, \r
+    26, 16, 233, 157, 26, 16, 233, 158, 252, 53, 26, 16, 225, 65, 218, 207, \r
+    26, 16, 225, 65, 252, 53, 26, 16, 245, 82, 218, 207, 26, 16, 245, 82, \r
+    252, 53, 26, 16, 234, 251, 229, 167, 227, 168, 26, 16, 234, 251, 237, \r
+    228, 227, 168, 26, 16, 252, 6, 227, 168, 26, 16, 225, 71, 227, 168, 26, \r
+    16, 233, 158, 227, 168, 26, 16, 225, 65, 227, 168, 26, 16, 222, 67, 229, \r
+    165, 250, 87, 228, 224, 229, 166, 26, 16, 222, 67, 229, 165, 250, 87, \r
+    228, 224, 237, 227, 26, 16, 222, 67, 229, 165, 250, 87, 228, 224, 229, \r
+    167, 248, 224, 26, 16, 222, 67, 237, 226, 250, 87, 228, 224, 229, 166, \r
+    26, 16, 222, 67, 237, 226, 250, 87, 228, 224, 237, 227, 26, 16, 222, 67, \r
+    237, 226, 250, 87, 228, 224, 237, 228, 248, 224, 26, 16, 222, 67, 237, \r
+    226, 250, 87, 228, 224, 237, 228, 248, 223, 26, 16, 222, 67, 237, 226, \r
+    250, 87, 228, 224, 237, 228, 248, 222, 26, 16, 250, 103, 26, 16, 244, 26, \r
+    251, 203, 250, 207, 26, 16, 244, 26, 246, 75, 250, 207, 26, 16, 40, 253, \r
+    204, 26, 16, 219, 81, 26, 16, 229, 35, 26, 16, 250, 200, 26, 16, 226, \r
+    110, 26, 16, 250, 202, 26, 16, 221, 115, 26, 16, 229, 17, 26, 16, 229, \r
+    18, 245, 152, 26, 16, 226, 111, 245, 152, 26, 16, 221, 116, 227, 166, 26, \r
+    16, 229, 154, 223, 95, 23, 219, 71, 165, 223, 18, 23, 219, 71, 165, 223, \r
+    7, 23, 219, 71, 165, 222, 253, 23, 219, 71, 165, 222, 246, 23, 219, 71, \r
+    165, 222, 238, 23, 219, 71, 165, 222, 232, 23, 219, 71, 165, 222, 231, \r
+    23, 219, 71, 165, 222, 230, 23, 219, 71, 165, 222, 229, 23, 219, 71, 165, \r
+    223, 17, 23, 219, 71, 165, 223, 16, 23, 219, 71, 165, 223, 15, 23, 219, \r
+    71, 165, 223, 14, 23, 219, 71, 165, 223, 13, 23, 219, 71, 165, 223, 12, \r
+    23, 219, 71, 165, 223, 11, 23, 219, 71, 165, 223, 10, 23, 219, 71, 165, \r
+    223, 9, 23, 219, 71, 165, 223, 8, 23, 219, 71, 165, 223, 6, 23, 219, 71, \r
+    165, 223, 5, 23, 219, 71, 165, 223, 4, 23, 219, 71, 165, 223, 3, 23, 219, \r
+    71, 165, 223, 2, 23, 219, 71, 165, 222, 237, 23, 219, 71, 165, 222, 236, \r
+    23, 219, 71, 165, 222, 235, 23, 219, 71, 165, 222, 234, 23, 219, 71, 165, \r
+    222, 233, 23, 237, 189, 165, 223, 18, 23, 237, 189, 165, 223, 7, 23, 237, \r
+    189, 165, 222, 246, 23, 237, 189, 165, 222, 238, 23, 237, 189, 165, 222, \r
+    231, 23, 237, 189, 165, 222, 230, 23, 237, 189, 165, 223, 16, 23, 237, \r
+    189, 165, 223, 15, 23, 237, 189, 165, 223, 14, 23, 237, 189, 165, 223, \r
+    13, 23, 237, 189, 165, 223, 10, 23, 237, 189, 165, 223, 9, 23, 237, 189, \r
+    165, 223, 8, 23, 237, 189, 165, 223, 3, 23, 237, 189, 165, 223, 2, 23, \r
+    237, 189, 165, 223, 1, 23, 237, 189, 165, 223, 0, 23, 237, 189, 165, 222, \r
+    255, 23, 237, 189, 165, 222, 254, 23, 237, 189, 165, 222, 252, 23, 237, \r
+    189, 165, 222, 251, 23, 237, 189, 165, 222, 250, 23, 237, 189, 165, 222, \r
+    249, 23, 237, 189, 165, 222, 248, 23, 237, 189, 165, 222, 247, 23, 237, \r
+    189, 165, 222, 245, 23, 237, 189, 165, 222, 244, 23, 237, 189, 165, 222, \r
+    243, 23, 237, 189, 165, 222, 242, 23, 237, 189, 165, 222, 241, 23, 237, \r
+    189, 165, 222, 240, 23, 237, 189, 165, 222, 239, 23, 237, 189, 165, 222, \r
+    237, 23, 237, 189, 165, 222, 236, 23, 237, 189, 165, 222, 235, 23, 237, \r
+    189, 165, 222, 234, 23, 237, 189, 165, 222, 233, 36, 23, 26, 221, 75, 36, \r
+    23, 26, 222, 43, 36, 23, 26, 229, 174, 23, 26, 235, 101, 233, 125, 35, \r
+    247, 8, 248, 237, 35, 243, 150, 247, 8, 248, 237, 35, 242, 165, 247, 8, \r
+    248, 237, 35, 247, 7, 243, 151, 248, 237, 35, 247, 7, 242, 164, 248, 237, \r
+    35, 247, 8, 159, 35, 251, 84, 159, 35, 245, 90, 250, 221, 159, 35, 233, \r
+    150, 159, 35, 252, 192, 159, 35, 236, 181, 224, 43, 159, 35, 250, 133, \r
+    159, 35, 254, 9, 159, 35, 230, 109, 159, 35, 252, 13, 230, 83, 159, 35, \r
+    249, 79, 156, 248, 198, 159, 35, 248, 195, 159, 35, 217, 210, 159, 35, \r
+    237, 217, 159, 35, 229, 180, 159, 35, 227, 215, 159, 35, 250, 143, 159, \r
+    35, 242, 253, 252, 233, 159, 35, 219, 1, 159, 35, 245, 138, 159, 35, 254, \r
+    236, 159, 35, 227, 190, 159, 35, 227, 172, 159, 35, 247, 6, 159, 35, 237, \r
+    45, 159, 35, 250, 138, 159, 35, 246, 189, 159, 35, 247, 87, 159, 35, 251, \r
+    58, 159, 35, 249, 85, 159, 35, 21, 227, 171, 159, 35, 230, 38, 159, 35, \r
+    235, 104, 159, 35, 250, 195, 159, 35, 236, 101, 159, 35, 244, 211, 159, \r
+    35, 223, 126, 159, 35, 228, 189, 159, 35, 245, 89, 159, 35, 227, 173, \r
+    159, 35, 235, 134, 156, 233, 134, 159, 35, 227, 169, 159, 35, 244, 64, \r
+    199, 234, 12, 159, 35, 246, 191, 159, 35, 223, 133, 159, 35, 244, 28, \r
+    159, 35, 246, 184, 159, 35, 229, 210, 159, 35, 227, 85, 159, 35, 245, \r
+    151, 159, 35, 219, 173, 156, 218, 244, 159, 35, 250, 146, 159, 35, 234, \r
+    23, 159, 35, 246, 120, 159, 35, 220, 71, 159, 35, 248, 225, 159, 35, 250, \r
+    197, 233, 105, 159, 35, 244, 13, 159, 35, 244, 212, 237, 223, 159, 35, \r
+    234, 53, 159, 35, 254, 253, 159, 35, 246, 203, 159, 35, 247, 134, 159, \r
+    35, 218, 242, 159, 35, 224, 106, 159, 35, 237, 196, 159, 35, 249, 51, \r
+    159, 35, 249, 150, 159, 35, 248, 221, 159, 35, 246, 93, 159, 35, 225, 37, \r
+    159, 35, 223, 135, 159, 35, 243, 180, 159, 35, 250, 162, 159, 35, 250, \r
+    193, 159, 35, 245, 248, 159, 35, 254, 205, 159, 35, 250, 161, 159, 35, \r
+    230, 139, 222, 23, 219, 155, 159, 35, 248, 245, 159, 35, 235, 180, 159, \r
+    35, 245, 118, 250, 112, 227, 69, 220, 73, 20, 107, 250, 112, 227, 69, \r
+    220, 73, 20, 103, 250, 112, 227, 69, 220, 73, 20, 160, 250, 112, 227, 69, \r
+    220, 73, 20, 154, 250, 112, 227, 69, 220, 73, 20, 174, 250, 112, 227, 69, \r
+    220, 73, 20, 182, 250, 112, 227, 69, 220, 73, 20, 191, 250, 112, 227, 69, \r
+    220, 73, 20, 185, 250, 112, 227, 69, 220, 73, 20, 190, 250, 112, 227, 69, \r
+    222, 63, 20, 107, 250, 112, 227, 69, 222, 63, 20, 103, 250, 112, 227, 69, \r
+    222, 63, 20, 160, 250, 112, 227, 69, 222, 63, 20, 154, 250, 112, 227, 69, \r
+    222, 63, 20, 174, 250, 112, 227, 69, 222, 63, 20, 182, 250, 112, 227, 69, \r
+    222, 63, 20, 191, 250, 112, 227, 69, 222, 63, 20, 185, 250, 112, 227, 69, \r
+    222, 63, 20, 190, 14, 21, 6, 60, 14, 21, 6, 253, 204, 14, 21, 6, 251, \r
+    202, 14, 21, 6, 250, 46, 14, 21, 6, 73, 14, 21, 6, 246, 74, 14, 21, 6, \r
+    245, 67, 14, 21, 6, 243, 225, 14, 21, 6, 72, 14, 21, 6, 237, 126, 14, 21, \r
+    6, 237, 17, 14, 21, 6, 153, 14, 21, 6, 189, 14, 21, 6, 207, 14, 21, 6, \r
+    74, 14, 21, 6, 230, 59, 14, 21, 6, 228, 163, 14, 21, 6, 152, 14, 21, 6, \r
+    198, 14, 21, 6, 222, 201, 14, 21, 6, 68, 14, 21, 6, 216, 216, 14, 21, 6, \r
+    219, 40, 14, 21, 6, 218, 151, 14, 21, 6, 218, 90, 14, 21, 6, 217, 157, \r
+    14, 21, 3, 60, 14, 21, 3, 253, 204, 14, 21, 3, 251, 202, 14, 21, 3, 250, \r
+    46, 14, 21, 3, 73, 14, 21, 3, 246, 74, 14, 21, 3, 245, 67, 14, 21, 3, \r
+    243, 225, 14, 21, 3, 72, 14, 21, 3, 237, 126, 14, 21, 3, 237, 17, 14, 21, \r
+    3, 153, 14, 21, 3, 189, 14, 21, 3, 207, 14, 21, 3, 74, 14, 21, 3, 230, \r
+    59, 14, 21, 3, 228, 163, 14, 21, 3, 152, 14, 21, 3, 198, 14, 21, 3, 222, \r
+    201, 14, 21, 3, 68, 14, 21, 3, 216, 216, 14, 21, 3, 219, 40, 14, 21, 3, \r
+    218, 151, 14, 21, 3, 218, 90, 14, 21, 3, 217, 157, 14, 30, 6, 60, 14, 30, \r
+    6, 253, 204, 14, 30, 6, 251, 202, 14, 30, 6, 250, 46, 14, 30, 6, 73, 14, \r
+    30, 6, 246, 74, 14, 30, 6, 245, 67, 14, 30, 6, 243, 225, 14, 30, 6, 72, \r
+    14, 30, 6, 237, 126, 14, 30, 6, 237, 17, 14, 30, 6, 153, 14, 30, 6, 189, \r
+    14, 30, 6, 207, 14, 30, 6, 74, 14, 30, 6, 230, 59, 14, 30, 6, 228, 163, \r
+    14, 30, 6, 152, 14, 30, 6, 198, 14, 30, 6, 222, 201, 14, 30, 6, 68, 14, \r
+    30, 6, 216, 216, 14, 30, 6, 219, 40, 14, 30, 6, 218, 151, 14, 30, 6, 218, \r
+    90, 14, 30, 6, 217, 157, 14, 30, 3, 60, 14, 30, 3, 253, 204, 14, 30, 3, \r
+    251, 202, 14, 30, 3, 250, 46, 14, 30, 3, 73, 14, 30, 3, 246, 74, 14, 30, \r
+    3, 245, 67, 14, 30, 3, 72, 14, 30, 3, 237, 126, 14, 30, 3, 237, 17, 14, \r
+    30, 3, 153, 14, 30, 3, 189, 14, 30, 3, 207, 14, 30, 3, 74, 14, 30, 3, \r
+    230, 59, 14, 30, 3, 228, 163, 14, 30, 3, 152, 14, 30, 3, 198, 14, 30, 3, \r
+    222, 201, 14, 30, 3, 68, 14, 30, 3, 216, 216, 14, 30, 3, 219, 40, 14, 30, \r
+    3, 218, 151, 14, 30, 3, 218, 90, 14, 30, 3, 217, 157, 14, 21, 30, 6, 60, \r
+    14, 21, 30, 6, 253, 204, 14, 21, 30, 6, 251, 202, 14, 21, 30, 6, 250, 46, \r
+    14, 21, 30, 6, 73, 14, 21, 30, 6, 246, 74, 14, 21, 30, 6, 245, 67, 14, \r
+    21, 30, 6, 243, 225, 14, 21, 30, 6, 72, 14, 21, 30, 6, 237, 126, 14, 21, \r
+    30, 6, 237, 17, 14, 21, 30, 6, 153, 14, 21, 30, 6, 189, 14, 21, 30, 6, \r
+    207, 14, 21, 30, 6, 74, 14, 21, 30, 6, 230, 59, 14, 21, 30, 6, 228, 163, \r
+    14, 21, 30, 6, 152, 14, 21, 30, 6, 198, 14, 21, 30, 6, 222, 201, 14, 21, \r
+    30, 6, 68, 14, 21, 30, 6, 216, 216, 14, 21, 30, 6, 219, 40, 14, 21, 30, \r
+    6, 218, 151, 14, 21, 30, 6, 218, 90, 14, 21, 30, 6, 217, 157, 14, 21, 30, \r
+    3, 60, 14, 21, 30, 3, 253, 204, 14, 21, 30, 3, 251, 202, 14, 21, 30, 3, \r
+    250, 46, 14, 21, 30, 3, 73, 14, 21, 30, 3, 246, 74, 14, 21, 30, 3, 245, \r
+    67, 14, 21, 30, 3, 243, 225, 14, 21, 30, 3, 72, 14, 21, 30, 3, 237, 126, \r
+    14, 21, 30, 3, 237, 17, 14, 21, 30, 3, 153, 14, 21, 30, 3, 189, 14, 21, \r
+    30, 3, 207, 14, 21, 30, 3, 74, 14, 21, 30, 3, 230, 59, 14, 21, 30, 3, \r
+    228, 163, 14, 21, 30, 3, 152, 14, 21, 30, 3, 198, 14, 21, 30, 3, 222, \r
+    201, 14, 21, 30, 3, 68, 14, 21, 30, 3, 216, 216, 14, 21, 30, 3, 219, 40, \r
+    14, 21, 30, 3, 218, 151, 14, 21, 30, 3, 218, 90, 14, 21, 30, 3, 217, 157, \r
+    14, 102, 6, 60, 14, 102, 6, 251, 202, 14, 102, 6, 250, 46, 14, 102, 6, \r
+    245, 67, 14, 102, 6, 237, 126, 14, 102, 6, 237, 17, 14, 102, 6, 207, 14, \r
+    102, 6, 74, 14, 102, 6, 230, 59, 14, 102, 6, 228, 163, 14, 102, 6, 198, \r
+    14, 102, 6, 222, 201, 14, 102, 6, 68, 14, 102, 6, 216, 216, 14, 102, 6, \r
+    219, 40, 14, 102, 6, 218, 151, 14, 102, 6, 218, 90, 14, 102, 6, 217, 157, \r
+    14, 102, 3, 60, 14, 102, 3, 253, 204, 14, 102, 3, 251, 202, 14, 102, 3, \r
+    250, 46, 14, 102, 3, 246, 74, 14, 102, 3, 243, 225, 14, 102, 3, 72, 14, \r
+    102, 3, 237, 126, 14, 102, 3, 237, 17, 14, 102, 3, 153, 14, 102, 3, 189, \r
+    14, 102, 3, 207, 14, 102, 3, 230, 59, 14, 102, 3, 228, 163, 14, 102, 3, \r
+    152, 14, 102, 3, 198, 14, 102, 3, 222, 201, 14, 102, 3, 68, 14, 102, 3, \r
+    216, 216, 14, 102, 3, 219, 40, 14, 102, 3, 218, 151, 14, 102, 3, 218, 90, \r
+    14, 102, 3, 217, 157, 14, 21, 102, 6, 60, 14, 21, 102, 6, 253, 204, 14, \r
+    21, 102, 6, 251, 202, 14, 21, 102, 6, 250, 46, 14, 21, 102, 6, 73, 14, \r
+    21, 102, 6, 246, 74, 14, 21, 102, 6, 245, 67, 14, 21, 102, 6, 243, 225, \r
+    14, 21, 102, 6, 72, 14, 21, 102, 6, 237, 126, 14, 21, 102, 6, 237, 17, \r
+    14, 21, 102, 6, 153, 14, 21, 102, 6, 189, 14, 21, 102, 6, 207, 14, 21, \r
+    102, 6, 74, 14, 21, 102, 6, 230, 59, 14, 21, 102, 6, 228, 163, 14, 21, \r
+    102, 6, 152, 14, 21, 102, 6, 198, 14, 21, 102, 6, 222, 201, 14, 21, 102, \r
+    6, 68, 14, 21, 102, 6, 216, 216, 14, 21, 102, 6, 219, 40, 14, 21, 102, 6, \r
+    218, 151, 14, 21, 102, 6, 218, 90, 14, 21, 102, 6, 217, 157, 14, 21, 102, \r
+    3, 60, 14, 21, 102, 3, 253, 204, 14, 21, 102, 3, 251, 202, 14, 21, 102, \r
+    3, 250, 46, 14, 21, 102, 3, 73, 14, 21, 102, 3, 246, 74, 14, 21, 102, 3, \r
+    245, 67, 14, 21, 102, 3, 243, 225, 14, 21, 102, 3, 72, 14, 21, 102, 3, \r
+    237, 126, 14, 21, 102, 3, 237, 17, 14, 21, 102, 3, 153, 14, 21, 102, 3, \r
+    189, 14, 21, 102, 3, 207, 14, 21, 102, 3, 74, 14, 21, 102, 3, 230, 59, \r
+    14, 21, 102, 3, 228, 163, 14, 21, 102, 3, 152, 14, 21, 102, 3, 198, 14, \r
+    21, 102, 3, 222, 201, 14, 21, 102, 3, 68, 14, 21, 102, 3, 216, 216, 14, \r
+    21, 102, 3, 219, 40, 14, 21, 102, 3, 218, 151, 14, 21, 102, 3, 218, 90, \r
+    14, 21, 102, 3, 217, 157, 14, 121, 6, 60, 14, 121, 6, 253, 204, 14, 121, \r
+    6, 250, 46, 14, 121, 6, 73, 14, 121, 6, 246, 74, 14, 121, 6, 245, 67, 14, \r
+    121, 6, 237, 126, 14, 121, 6, 237, 17, 14, 121, 6, 153, 14, 121, 6, 189, \r
+    14, 121, 6, 207, 14, 121, 6, 74, 14, 121, 6, 230, 59, 14, 121, 6, 228, \r
+    163, 14, 121, 6, 198, 14, 121, 6, 222, 201, 14, 121, 6, 68, 14, 121, 6, \r
+    216, 216, 14, 121, 6, 219, 40, 14, 121, 6, 218, 151, 14, 121, 6, 218, 90, \r
+    14, 121, 3, 60, 14, 121, 3, 253, 204, 14, 121, 3, 251, 202, 14, 121, 3, \r
+    250, 46, 14, 121, 3, 73, 14, 121, 3, 246, 74, 14, 121, 3, 245, 67, 14, \r
+    121, 3, 243, 225, 14, 121, 3, 72, 14, 121, 3, 237, 126, 14, 121, 3, 237, \r
+    17, 14, 121, 3, 153, 14, 121, 3, 189, 14, 121, 3, 207, 14, 121, 3, 74, \r
+    14, 121, 3, 230, 59, 14, 121, 3, 228, 163, 14, 121, 3, 152, 14, 121, 3, \r
+    198, 14, 121, 3, 222, 201, 14, 121, 3, 68, 14, 121, 3, 216, 216, 14, 121, \r
+    3, 219, 40, 14, 121, 3, 218, 151, 14, 121, 3, 218, 90, 14, 121, 3, 217, \r
+    157, 14, 173, 6, 60, 14, 173, 6, 253, 204, 14, 173, 6, 250, 46, 14, 173, \r
+    6, 73, 14, 173, 6, 246, 74, 14, 173, 6, 245, 67, 14, 173, 6, 72, 14, 173, \r
+    6, 237, 126, 14, 173, 6, 237, 17, 14, 173, 6, 153, 14, 173, 6, 189, 14, \r
+    173, 6, 74, 14, 173, 6, 198, 14, 173, 6, 222, 201, 14, 173, 6, 68, 14, \r
+    173, 6, 216, 216, 14, 173, 6, 219, 40, 14, 173, 6, 218, 151, 14, 173, 6, \r
+    218, 90, 14, 173, 3, 60, 14, 173, 3, 253, 204, 14, 173, 3, 251, 202, 14, \r
+    173, 3, 250, 46, 14, 173, 3, 73, 14, 173, 3, 246, 74, 14, 173, 3, 245, \r
+    67, 14, 173, 3, 243, 225, 14, 173, 3, 72, 14, 173, 3, 237, 126, 14, 173, \r
+    3, 237, 17, 14, 173, 3, 153, 14, 173, 3, 189, 14, 173, 3, 207, 14, 173, \r
+    3, 74, 14, 173, 3, 230, 59, 14, 173, 3, 228, 163, 14, 173, 3, 152, 14, \r
+    173, 3, 198, 14, 173, 3, 222, 201, 14, 173, 3, 68, 14, 173, 3, 216, 216, \r
+    14, 173, 3, 219, 40, 14, 173, 3, 218, 151, 14, 173, 3, 218, 90, 14, 173, \r
+    3, 217, 157, 14, 21, 121, 6, 60, 14, 21, 121, 6, 253, 204, 14, 21, 121, \r
+    6, 251, 202, 14, 21, 121, 6, 250, 46, 14, 21, 121, 6, 73, 14, 21, 121, 6, \r
+    246, 74, 14, 21, 121, 6, 245, 67, 14, 21, 121, 6, 243, 225, 14, 21, 121, \r
+    6, 72, 14, 21, 121, 6, 237, 126, 14, 21, 121, 6, 237, 17, 14, 21, 121, 6, \r
+    153, 14, 21, 121, 6, 189, 14, 21, 121, 6, 207, 14, 21, 121, 6, 74, 14, \r
+    21, 121, 6, 230, 59, 14, 21, 121, 6, 228, 163, 14, 21, 121, 6, 152, 14, \r
+    21, 121, 6, 198, 14, 21, 121, 6, 222, 201, 14, 21, 121, 6, 68, 14, 21, \r
+    121, 6, 216, 216, 14, 21, 121, 6, 219, 40, 14, 21, 121, 6, 218, 151, 14, \r
+    21, 121, 6, 218, 90, 14, 21, 121, 6, 217, 157, 14, 21, 121, 3, 60, 14, \r
+    21, 121, 3, 253, 204, 14, 21, 121, 3, 251, 202, 14, 21, 121, 3, 250, 46, \r
+    14, 21, 121, 3, 73, 14, 21, 121, 3, 246, 74, 14, 21, 121, 3, 245, 67, 14, \r
+    21, 121, 3, 243, 225, 14, 21, 121, 3, 72, 14, 21, 121, 3, 237, 126, 14, \r
+    21, 121, 3, 237, 17, 14, 21, 121, 3, 153, 14, 21, 121, 3, 189, 14, 21, \r
+    121, 3, 207, 14, 21, 121, 3, 74, 14, 21, 121, 3, 230, 59, 14, 21, 121, 3, \r
+    228, 163, 14, 21, 121, 3, 152, 14, 21, 121, 3, 198, 14, 21, 121, 3, 222, \r
+    201, 14, 21, 121, 3, 68, 14, 21, 121, 3, 216, 216, 14, 21, 121, 3, 219, \r
+    40, 14, 21, 121, 3, 218, 151, 14, 21, 121, 3, 218, 90, 14, 21, 121, 3, \r
+    217, 157, 14, 33, 6, 60, 14, 33, 6, 253, 204, 14, 33, 6, 251, 202, 14, \r
+    33, 6, 250, 46, 14, 33, 6, 73, 14, 33, 6, 246, 74, 14, 33, 6, 245, 67, \r
+    14, 33, 6, 243, 225, 14, 33, 6, 72, 14, 33, 6, 237, 126, 14, 33, 6, 237, \r
+    17, 14, 33, 6, 153, 14, 33, 6, 189, 14, 33, 6, 207, 14, 33, 6, 74, 14, \r
+    33, 6, 230, 59, 14, 33, 6, 228, 163, 14, 33, 6, 152, 14, 33, 6, 198, 14, \r
+    33, 6, 222, 201, 14, 33, 6, 68, 14, 33, 6, 216, 216, 14, 33, 6, 219, 40, \r
+    14, 33, 6, 218, 151, 14, 33, 6, 218, 90, 14, 33, 6, 217, 157, 14, 33, 3, \r
+    60, 14, 33, 3, 253, 204, 14, 33, 3, 251, 202, 14, 33, 3, 250, 46, 14, 33, \r
+    3, 73, 14, 33, 3, 246, 74, 14, 33, 3, 245, 67, 14, 33, 3, 243, 225, 14, \r
+    33, 3, 72, 14, 33, 3, 237, 126, 14, 33, 3, 237, 17, 14, 33, 3, 153, 14, \r
+    33, 3, 189, 14, 33, 3, 207, 14, 33, 3, 74, 14, 33, 3, 230, 59, 14, 33, 3, \r
+    228, 163, 14, 33, 3, 152, 14, 33, 3, 198, 14, 33, 3, 222, 201, 14, 33, 3, \r
+    68, 14, 33, 3, 216, 216, 14, 33, 3, 219, 40, 14, 33, 3, 218, 151, 14, 33, \r
+    3, 218, 90, 14, 33, 3, 217, 157, 14, 33, 21, 6, 60, 14, 33, 21, 6, 253, \r
+    204, 14, 33, 21, 6, 251, 202, 14, 33, 21, 6, 250, 46, 14, 33, 21, 6, 73, \r
+    14, 33, 21, 6, 246, 74, 14, 33, 21, 6, 245, 67, 14, 33, 21, 6, 243, 225, \r
+    14, 33, 21, 6, 72, 14, 33, 21, 6, 237, 126, 14, 33, 21, 6, 237, 17, 14, \r
+    33, 21, 6, 153, 14, 33, 21, 6, 189, 14, 33, 21, 6, 207, 14, 33, 21, 6, \r
+    74, 14, 33, 21, 6, 230, 59, 14, 33, 21, 6, 228, 163, 14, 33, 21, 6, 152, \r
+    14, 33, 21, 6, 198, 14, 33, 21, 6, 222, 201, 14, 33, 21, 6, 68, 14, 33, \r
+    21, 6, 216, 216, 14, 33, 21, 6, 219, 40, 14, 33, 21, 6, 218, 151, 14, 33, \r
+    21, 6, 218, 90, 14, 33, 21, 6, 217, 157, 14, 33, 21, 3, 60, 14, 33, 21, \r
+    3, 253, 204, 14, 33, 21, 3, 251, 202, 14, 33, 21, 3, 250, 46, 14, 33, 21, \r
+    3, 73, 14, 33, 21, 3, 246, 74, 14, 33, 21, 3, 245, 67, 14, 33, 21, 3, \r
+    243, 225, 14, 33, 21, 3, 72, 14, 33, 21, 3, 237, 126, 14, 33, 21, 3, 237, \r
+    17, 14, 33, 21, 3, 153, 14, 33, 21, 3, 189, 14, 33, 21, 3, 207, 14, 33, \r
+    21, 3, 74, 14, 33, 21, 3, 230, 59, 14, 33, 21, 3, 228, 163, 14, 33, 21, \r
+    3, 152, 14, 33, 21, 3, 198, 14, 33, 21, 3, 222, 201, 14, 33, 21, 3, 68, \r
+    14, 33, 21, 3, 216, 216, 14, 33, 21, 3, 219, 40, 14, 33, 21, 3, 218, 151, \r
+    14, 33, 21, 3, 218, 90, 14, 33, 21, 3, 217, 157, 14, 33, 30, 6, 60, 14, \r
+    33, 30, 6, 253, 204, 14, 33, 30, 6, 251, 202, 14, 33, 30, 6, 250, 46, 14, \r
+    33, 30, 6, 73, 14, 33, 30, 6, 246, 74, 14, 33, 30, 6, 245, 67, 14, 33, \r
+    30, 6, 243, 225, 14, 33, 30, 6, 72, 14, 33, 30, 6, 237, 126, 14, 33, 30, \r
+    6, 237, 17, 14, 33, 30, 6, 153, 14, 33, 30, 6, 189, 14, 33, 30, 6, 207, \r
+    14, 33, 30, 6, 74, 14, 33, 30, 6, 230, 59, 14, 33, 30, 6, 228, 163, 14, \r
+    33, 30, 6, 152, 14, 33, 30, 6, 198, 14, 33, 30, 6, 222, 201, 14, 33, 30, \r
+    6, 68, 14, 33, 30, 6, 216, 216, 14, 33, 30, 6, 219, 40, 14, 33, 30, 6, \r
+    218, 151, 14, 33, 30, 6, 218, 90, 14, 33, 30, 6, 217, 157, 14, 33, 30, 3, \r
+    60, 14, 33, 30, 3, 253, 204, 14, 33, 30, 3, 251, 202, 14, 33, 30, 3, 250, \r
+    46, 14, 33, 30, 3, 73, 14, 33, 30, 3, 246, 74, 14, 33, 30, 3, 245, 67, \r
+    14, 33, 30, 3, 243, 225, 14, 33, 30, 3, 72, 14, 33, 30, 3, 237, 126, 14, \r
+    33, 30, 3, 237, 17, 14, 33, 30, 3, 153, 14, 33, 30, 3, 189, 14, 33, 30, \r
+    3, 207, 14, 33, 30, 3, 74, 14, 33, 30, 3, 230, 59, 14, 33, 30, 3, 228, \r
+    163, 14, 33, 30, 3, 152, 14, 33, 30, 3, 198, 14, 33, 30, 3, 222, 201, 14, \r
+    33, 30, 3, 68, 14, 33, 30, 3, 216, 216, 14, 33, 30, 3, 219, 40, 14, 33, \r
+    30, 3, 218, 151, 14, 33, 30, 3, 218, 90, 14, 33, 30, 3, 217, 157, 14, 33, \r
+    21, 30, 6, 60, 14, 33, 21, 30, 6, 253, 204, 14, 33, 21, 30, 6, 251, 202, \r
+    14, 33, 21, 30, 6, 250, 46, 14, 33, 21, 30, 6, 73, 14, 33, 21, 30, 6, \r
+    246, 74, 14, 33, 21, 30, 6, 245, 67, 14, 33, 21, 30, 6, 243, 225, 14, 33, \r
+    21, 30, 6, 72, 14, 33, 21, 30, 6, 237, 126, 14, 33, 21, 30, 6, 237, 17, \r
+    14, 33, 21, 30, 6, 153, 14, 33, 21, 30, 6, 189, 14, 33, 21, 30, 6, 207, \r
+    14, 33, 21, 30, 6, 74, 14, 33, 21, 30, 6, 230, 59, 14, 33, 21, 30, 6, \r
+    228, 163, 14, 33, 21, 30, 6, 152, 14, 33, 21, 30, 6, 198, 14, 33, 21, 30, \r
+    6, 222, 201, 14, 33, 21, 30, 6, 68, 14, 33, 21, 30, 6, 216, 216, 14, 33, \r
+    21, 30, 6, 219, 40, 14, 33, 21, 30, 6, 218, 151, 14, 33, 21, 30, 6, 218, \r
+    90, 14, 33, 21, 30, 6, 217, 157, 14, 33, 21, 30, 3, 60, 14, 33, 21, 30, \r
+    3, 253, 204, 14, 33, 21, 30, 3, 251, 202, 14, 33, 21, 30, 3, 250, 46, 14, \r
+    33, 21, 30, 3, 73, 14, 33, 21, 30, 3, 246, 74, 14, 33, 21, 30, 3, 245, \r
+    67, 14, 33, 21, 30, 3, 243, 225, 14, 33, 21, 30, 3, 72, 14, 33, 21, 30, \r
+    3, 237, 126, 14, 33, 21, 30, 3, 237, 17, 14, 33, 21, 30, 3, 153, 14, 33, \r
+    21, 30, 3, 189, 14, 33, 21, 30, 3, 207, 14, 33, 21, 30, 3, 74, 14, 33, \r
+    21, 30, 3, 230, 59, 14, 33, 21, 30, 3, 228, 163, 14, 33, 21, 30, 3, 152, \r
+    14, 33, 21, 30, 3, 198, 14, 33, 21, 30, 3, 222, 201, 14, 33, 21, 30, 3, \r
+    68, 14, 33, 21, 30, 3, 216, 216, 14, 33, 21, 30, 3, 219, 40, 14, 33, 21, \r
+    30, 3, 218, 151, 14, 33, 21, 30, 3, 218, 90, 14, 33, 21, 30, 3, 217, 157, \r
+    14, 211, 6, 60, 14, 211, 6, 253, 204, 14, 211, 6, 251, 202, 14, 211, 6, \r
+    250, 46, 14, 211, 6, 73, 14, 211, 6, 246, 74, 14, 211, 6, 245, 67, 14, \r
+    211, 6, 243, 225, 14, 211, 6, 72, 14, 211, 6, 237, 126, 14, 211, 6, 237, \r
+    17, 14, 211, 6, 153, 14, 211, 6, 189, 14, 211, 6, 207, 14, 211, 6, 74, \r
+    14, 211, 6, 230, 59, 14, 211, 6, 228, 163, 14, 211, 6, 152, 14, 211, 6, \r
+    198, 14, 211, 6, 222, 201, 14, 211, 6, 68, 14, 211, 6, 216, 216, 14, 211, \r
+    6, 219, 40, 14, 211, 6, 218, 151, 14, 211, 6, 218, 90, 14, 211, 6, 217, \r
+    157, 14, 211, 3, 60, 14, 211, 3, 253, 204, 14, 211, 3, 251, 202, 14, 211, \r
+    3, 250, 46, 14, 211, 3, 73, 14, 211, 3, 246, 74, 14, 211, 3, 245, 67, 14, \r
+    211, 3, 243, 225, 14, 211, 3, 72, 14, 211, 3, 237, 126, 14, 211, 3, 237, \r
+    17, 14, 211, 3, 153, 14, 211, 3, 189, 14, 211, 3, 207, 14, 211, 3, 74, \r
+    14, 211, 3, 230, 59, 14, 211, 3, 228, 163, 14, 211, 3, 152, 14, 211, 3, \r
+    198, 14, 211, 3, 222, 201, 14, 211, 3, 68, 14, 211, 3, 216, 216, 14, 211, \r
+    3, 219, 40, 14, 211, 3, 218, 151, 14, 211, 3, 218, 90, 14, 211, 3, 217, \r
+    157, 14, 30, 3, 248, 144, 72, 14, 30, 3, 248, 144, 237, 126, 14, 21, 6, \r
+    254, 146, 14, 21, 6, 252, 102, 14, 21, 6, 244, 231, 14, 21, 6, 249, 62, \r
+    14, 21, 6, 246, 156, 14, 21, 6, 217, 83, 14, 21, 6, 246, 121, 14, 21, 6, \r
+    222, 6, 14, 21, 6, 237, 162, 14, 21, 6, 236, 221, 14, 21, 6, 235, 156, \r
+    14, 21, 6, 233, 99, 14, 21, 6, 231, 144, 14, 21, 6, 218, 130, 14, 21, 6, \r
+    230, 141, 14, 21, 6, 229, 108, 14, 21, 6, 227, 149, 14, 21, 6, 222, 7, \r
+    100, 14, 21, 6, 224, 127, 14, 21, 6, 222, 105, 14, 21, 6, 220, 57, 14, \r
+    21, 6, 229, 129, 14, 21, 6, 251, 31, 14, 21, 6, 228, 212, 14, 21, 6, 230, \r
+    143, 14, 21, 232, 231, 14, 21, 3, 254, 146, 14, 21, 3, 252, 102, 14, 21, \r
+    3, 244, 231, 14, 21, 3, 249, 62, 14, 21, 3, 246, 156, 14, 21, 3, 217, 83, \r
+    14, 21, 3, 246, 121, 14, 21, 3, 222, 6, 14, 21, 3, 237, 162, 14, 21, 3, \r
+    236, 221, 14, 21, 3, 235, 156, 14, 21, 3, 233, 99, 14, 21, 3, 231, 144, \r
+    14, 21, 3, 218, 130, 14, 21, 3, 230, 141, 14, 21, 3, 229, 108, 14, 21, 3, \r
+    227, 149, 14, 21, 3, 39, 224, 127, 14, 21, 3, 224, 127, 14, 21, 3, 222, \r
+    105, 14, 21, 3, 220, 57, 14, 21, 3, 229, 129, 14, 21, 3, 251, 31, 14, 21, \r
+    3, 228, 212, 14, 21, 3, 230, 143, 14, 21, 229, 223, 248, 246, 14, 21, \r
+    246, 157, 100, 14, 21, 222, 7, 100, 14, 21, 236, 222, 100, 14, 21, 229, \r
+    130, 100, 14, 21, 227, 150, 100, 14, 21, 229, 109, 100, 14, 30, 6, 254, \r
+    146, 14, 30, 6, 252, 102, 14, 30, 6, 244, 231, 14, 30, 6, 249, 62, 14, \r
+    30, 6, 246, 156, 14, 30, 6, 217, 83, 14, 30, 6, 246, 121, 14, 30, 6, 222, \r
+    6, 14, 30, 6, 237, 162, 14, 30, 6, 236, 221, 14, 30, 6, 235, 156, 14, 30, \r
+    6, 233, 99, 14, 30, 6, 231, 144, 14, 30, 6, 218, 130, 14, 30, 6, 230, \r
+    141, 14, 30, 6, 229, 108, 14, 30, 6, 227, 149, 14, 30, 6, 222, 7, 100, \r
+    14, 30, 6, 224, 127, 14, 30, 6, 222, 105, 14, 30, 6, 220, 57, 14, 30, 6, \r
+    229, 129, 14, 30, 6, 251, 31, 14, 30, 6, 228, 212, 14, 30, 6, 230, 143, \r
+    14, 30, 232, 231, 14, 30, 3, 254, 146, 14, 30, 3, 252, 102, 14, 30, 3, \r
+    244, 231, 14, 30, 3, 249, 62, 14, 30, 3, 246, 156, 14, 30, 3, 217, 83, \r
+    14, 30, 3, 246, 121, 14, 30, 3, 222, 6, 14, 30, 3, 237, 162, 14, 30, 3, \r
+    236, 221, 14, 30, 3, 235, 156, 14, 30, 3, 233, 99, 14, 30, 3, 231, 144, \r
+    14, 30, 3, 218, 130, 14, 30, 3, 230, 141, 14, 30, 3, 229, 108, 14, 30, 3, \r
+    227, 149, 14, 30, 3, 39, 224, 127, 14, 30, 3, 224, 127, 14, 30, 3, 222, \r
+    105, 14, 30, 3, 220, 57, 14, 30, 3, 229, 129, 14, 30, 3, 251, 31, 14, 30, \r
+    3, 228, 212, 14, 30, 3, 230, 143, 14, 30, 229, 223, 248, 246, 14, 30, \r
+    246, 157, 100, 14, 30, 222, 7, 100, 14, 30, 236, 222, 100, 14, 30, 229, \r
+    130, 100, 14, 30, 227, 150, 100, 14, 30, 229, 109, 100, 14, 21, 30, 6, \r
+    254, 146, 14, 21, 30, 6, 252, 102, 14, 21, 30, 6, 244, 231, 14, 21, 30, \r
+    6, 249, 62, 14, 21, 30, 6, 246, 156, 14, 21, 30, 6, 217, 83, 14, 21, 30, \r
+    6, 246, 121, 14, 21, 30, 6, 222, 6, 14, 21, 30, 6, 237, 162, 14, 21, 30, \r
+    6, 236, 221, 14, 21, 30, 6, 235, 156, 14, 21, 30, 6, 233, 99, 14, 21, 30, \r
+    6, 231, 144, 14, 21, 30, 6, 218, 130, 14, 21, 30, 6, 230, 141, 14, 21, \r
+    30, 6, 229, 108, 14, 21, 30, 6, 227, 149, 14, 21, 30, 6, 222, 7, 100, 14, \r
+    21, 30, 6, 224, 127, 14, 21, 30, 6, 222, 105, 14, 21, 30, 6, 220, 57, 14, \r
+    21, 30, 6, 229, 129, 14, 21, 30, 6, 251, 31, 14, 21, 30, 6, 228, 212, 14, \r
+    21, 30, 6, 230, 143, 14, 21, 30, 232, 231, 14, 21, 30, 3, 254, 146, 14, \r
+    21, 30, 3, 252, 102, 14, 21, 30, 3, 244, 231, 14, 21, 30, 3, 249, 62, 14, \r
+    21, 30, 3, 246, 156, 14, 21, 30, 3, 217, 83, 14, 21, 30, 3, 246, 121, 14, \r
+    21, 30, 3, 222, 6, 14, 21, 30, 3, 237, 162, 14, 21, 30, 3, 236, 221, 14, \r
+    21, 30, 3, 235, 156, 14, 21, 30, 3, 233, 99, 14, 21, 30, 3, 231, 144, 14, \r
+    21, 30, 3, 218, 130, 14, 21, 30, 3, 230, 141, 14, 21, 30, 3, 229, 108, \r
+    14, 21, 30, 3, 227, 149, 14, 21, 30, 3, 39, 224, 127, 14, 21, 30, 3, 224, \r
+    127, 14, 21, 30, 3, 222, 105, 14, 21, 30, 3, 220, 57, 14, 21, 30, 3, 229, \r
+    129, 14, 21, 30, 3, 251, 31, 14, 21, 30, 3, 228, 212, 14, 21, 30, 3, 230, \r
+    143, 14, 21, 30, 229, 223, 248, 246, 14, 21, 30, 246, 157, 100, 14, 21, \r
+    30, 222, 7, 100, 14, 21, 30, 236, 222, 100, 14, 21, 30, 229, 130, 100, \r
+    14, 21, 30, 227, 150, 100, 14, 21, 30, 229, 109, 100, 14, 33, 21, 6, 254, \r
+    146, 14, 33, 21, 6, 252, 102, 14, 33, 21, 6, 244, 231, 14, 33, 21, 6, \r
+    249, 62, 14, 33, 21, 6, 246, 156, 14, 33, 21, 6, 217, 83, 14, 33, 21, 6, \r
+    246, 121, 14, 33, 21, 6, 222, 6, 14, 33, 21, 6, 237, 162, 14, 33, 21, 6, \r
+    236, 221, 14, 33, 21, 6, 235, 156, 14, 33, 21, 6, 233, 99, 14, 33, 21, 6, \r
+    231, 144, 14, 33, 21, 6, 218, 130, 14, 33, 21, 6, 230, 141, 14, 33, 21, \r
+    6, 229, 108, 14, 33, 21, 6, 227, 149, 14, 33, 21, 6, 222, 7, 100, 14, 33, \r
+    21, 6, 224, 127, 14, 33, 21, 6, 222, 105, 14, 33, 21, 6, 220, 57, 14, 33, \r
+    21, 6, 229, 129, 14, 33, 21, 6, 251, 31, 14, 33, 21, 6, 228, 212, 14, 33, \r
+    21, 6, 230, 143, 14, 33, 21, 232, 231, 14, 33, 21, 3, 254, 146, 14, 33, \r
+    21, 3, 252, 102, 14, 33, 21, 3, 244, 231, 14, 33, 21, 3, 249, 62, 14, 33, \r
+    21, 3, 246, 156, 14, 33, 21, 3, 217, 83, 14, 33, 21, 3, 246, 121, 14, 33, \r
+    21, 3, 222, 6, 14, 33, 21, 3, 237, 162, 14, 33, 21, 3, 236, 221, 14, 33, \r
+    21, 3, 235, 156, 14, 33, 21, 3, 233, 99, 14, 33, 21, 3, 231, 144, 14, 33, \r
+    21, 3, 218, 130, 14, 33, 21, 3, 230, 141, 14, 33, 21, 3, 229, 108, 14, \r
+    33, 21, 3, 227, 149, 14, 33, 21, 3, 39, 224, 127, 14, 33, 21, 3, 224, \r
+    127, 14, 33, 21, 3, 222, 105, 14, 33, 21, 3, 220, 57, 14, 33, 21, 3, 229, \r
+    129, 14, 33, 21, 3, 251, 31, 14, 33, 21, 3, 228, 212, 14, 33, 21, 3, 230, \r
+    143, 14, 33, 21, 229, 223, 248, 246, 14, 33, 21, 246, 157, 100, 14, 33, \r
+    21, 222, 7, 100, 14, 33, 21, 236, 222, 100, 14, 33, 21, 229, 130, 100, \r
+    14, 33, 21, 227, 150, 100, 14, 33, 21, 229, 109, 100, 14, 33, 21, 30, 6, \r
+    254, 146, 14, 33, 21, 30, 6, 252, 102, 14, 33, 21, 30, 6, 244, 231, 14, \r
+    33, 21, 30, 6, 249, 62, 14, 33, 21, 30, 6, 246, 156, 14, 33, 21, 30, 6, \r
+    217, 83, 14, 33, 21, 30, 6, 246, 121, 14, 33, 21, 30, 6, 222, 6, 14, 33, \r
+    21, 30, 6, 237, 162, 14, 33, 21, 30, 6, 236, 221, 14, 33, 21, 30, 6, 235, \r
+    156, 14, 33, 21, 30, 6, 233, 99, 14, 33, 21, 30, 6, 231, 144, 14, 33, 21, \r
+    30, 6, 218, 130, 14, 33, 21, 30, 6, 230, 141, 14, 33, 21, 30, 6, 229, \r
+    108, 14, 33, 21, 30, 6, 227, 149, 14, 33, 21, 30, 6, 222, 7, 100, 14, 33, \r
+    21, 30, 6, 224, 127, 14, 33, 21, 30, 6, 222, 105, 14, 33, 21, 30, 6, 220, \r
+    57, 14, 33, 21, 30, 6, 229, 129, 14, 33, 21, 30, 6, 251, 31, 14, 33, 21, \r
+    30, 6, 228, 212, 14, 33, 21, 30, 6, 230, 143, 14, 33, 21, 30, 232, 231, \r
+    14, 33, 21, 30, 3, 254, 146, 14, 33, 21, 30, 3, 252, 102, 14, 33, 21, 30, \r
+    3, 244, 231, 14, 33, 21, 30, 3, 249, 62, 14, 33, 21, 30, 3, 246, 156, 14, \r
+    33, 21, 30, 3, 217, 83, 14, 33, 21, 30, 3, 246, 121, 14, 33, 21, 30, 3, \r
+    222, 6, 14, 33, 21, 30, 3, 237, 162, 14, 33, 21, 30, 3, 236, 221, 14, 33, \r
+    21, 30, 3, 235, 156, 14, 33, 21, 30, 3, 233, 99, 14, 33, 21, 30, 3, 231, \r
+    144, 14, 33, 21, 30, 3, 218, 130, 14, 33, 21, 30, 3, 230, 141, 14, 33, \r
+    21, 30, 3, 229, 108, 14, 33, 21, 30, 3, 227, 149, 14, 33, 21, 30, 3, 39, \r
+    224, 127, 14, 33, 21, 30, 3, 224, 127, 14, 33, 21, 30, 3, 222, 105, 14, \r
+    33, 21, 30, 3, 220, 57, 14, 33, 21, 30, 3, 229, 129, 14, 33, 21, 30, 3, \r
+    251, 31, 14, 33, 21, 30, 3, 228, 212, 14, 33, 21, 30, 3, 230, 143, 14, \r
+    33, 21, 30, 229, 223, 248, 246, 14, 33, 21, 30, 246, 157, 100, 14, 33, \r
+    21, 30, 222, 7, 100, 14, 33, 21, 30, 236, 222, 100, 14, 33, 21, 30, 229, \r
+    130, 100, 14, 33, 21, 30, 227, 150, 100, 14, 33, 21, 30, 229, 109, 100, \r
+    14, 21, 6, 248, 240, 14, 21, 3, 248, 240, 14, 21, 20, 217, 84, 14, 21, \r
+    20, 107, 14, 21, 20, 103, 14, 21, 20, 160, 14, 21, 20, 154, 14, 21, 20, \r
+    174, 14, 21, 20, 182, 14, 21, 20, 191, 14, 21, 20, 185, 14, 21, 20, 190, \r
+    14, 173, 20, 217, 84, 14, 173, 20, 107, 14, 173, 20, 103, 14, 173, 20, \r
+    160, 14, 173, 20, 154, 14, 173, 20, 174, 14, 173, 20, 182, 14, 173, 20, \r
+    191, 14, 173, 20, 185, 14, 173, 20, 190, 14, 33, 20, 217, 84, 14, 33, 20, \r
+    107, 14, 33, 20, 103, 14, 33, 20, 160, 14, 33, 20, 154, 14, 33, 20, 174, \r
+    14, 33, 20, 182, 14, 33, 20, 191, 14, 33, 20, 185, 14, 33, 20, 190, 14, \r
+    33, 21, 20, 217, 84, 14, 33, 21, 20, 107, 14, 33, 21, 20, 103, 14, 33, \r
+    21, 20, 160, 14, 33, 21, 20, 154, 14, 33, 21, 20, 174, 14, 33, 21, 20, \r
+    182, 14, 33, 21, 20, 191, 14, 33, 21, 20, 185, 14, 33, 21, 20, 190, 14, \r
+    211, 20, 217, 84, 14, 211, 20, 107, 14, 211, 20, 103, 14, 211, 20, 160, \r
+    14, 211, 20, 154, 14, 211, 20, 174, 14, 211, 20, 182, 14, 211, 20, 191, \r
+    14, 211, 20, 185, 14, 211, 20, 190, 234, 101, 81, 247, 5, 218, 194, 234, \r
+    101, 81, 224, 6, 218, 194, 234, 101, 81, 218, 217, 218, 194, 234, 101, \r
+    81, 231, 187, 218, 194, 234, 101, 81, 227, 203, 247, 123, 234, 101, 81, \r
+    244, 27, 247, 123, 234, 101, 81, 67, 247, 123, 234, 101, 81, 131, 117, \r
+    251, 54, 234, 101, 81, 124, 117, 251, 54, 234, 101, 81, 148, 117, 251, \r
+    54, 234, 101, 81, 245, 116, 117, 251, 54, 234, 101, 81, 245, 170, 117, \r
+    251, 54, 234, 101, 81, 224, 82, 117, 251, 54, 234, 101, 81, 225, 43, 117, \r
+    251, 54, 234, 101, 81, 246, 235, 117, 251, 54, 234, 101, 81, 232, 31, \r
+    117, 251, 54, 234, 101, 81, 131, 117, 252, 210, 234, 101, 81, 124, 117, \r
+    252, 210, 234, 101, 81, 148, 117, 252, 210, 234, 101, 81, 245, 116, 117, \r
+    252, 210, 234, 101, 81, 245, 170, 117, 252, 210, 234, 101, 81, 224, 82, \r
+    117, 252, 210, 234, 101, 81, 225, 43, 117, 252, 210, 234, 101, 81, 246, \r
+    235, 117, 252, 210, 234, 101, 81, 232, 31, 117, 252, 210, 234, 101, 81, \r
+    131, 117, 250, 220, 234, 101, 81, 124, 117, 250, 220, 234, 101, 81, 148, \r
+    117, 250, 220, 234, 101, 81, 245, 116, 117, 250, 220, 234, 101, 81, 245, \r
+    170, 117, 250, 220, 234, 101, 81, 224, 82, 117, 250, 220, 234, 101, 81, \r
+    225, 43, 117, 250, 220, 234, 101, 81, 246, 235, 117, 250, 220, 234, 101, \r
+    81, 232, 31, 117, 250, 220, 234, 101, 81, 229, 45, 234, 101, 81, 230, \r
+    104, 234, 101, 81, 252, 211, 234, 101, 81, 250, 254, 234, 101, 81, 223, \r
+    232, 234, 101, 81, 223, 70, 234, 101, 81, 253, 223, 234, 101, 81, 218, \r
+    190, 234, 101, 81, 237, 53, 234, 101, 81, 252, 233, 119, 81, 186, 252, \r
+    233, 119, 81, 242, 240, 119, 81, 242, 239, 119, 81, 242, 238, 119, 81, \r
+    242, 237, 119, 81, 242, 236, 119, 81, 242, 235, 119, 81, 242, 234, 119, \r
+    81, 242, 233, 119, 81, 242, 232, 119, 81, 242, 231, 119, 81, 242, 230, \r
+    119, 81, 242, 229, 119, 81, 242, 228, 119, 81, 242, 227, 119, 81, 242, \r
+    226, 119, 81, 242, 225, 119, 81, 242, 224, 119, 81, 242, 223, 119, 81, \r
+    242, 222, 119, 81, 242, 221, 119, 81, 242, 220, 119, 81, 242, 219, 119, \r
+    81, 242, 218, 119, 81, 242, 217, 119, 81, 242, 216, 119, 81, 242, 215, \r
+    119, 81, 242, 214, 119, 81, 242, 213, 119, 81, 242, 212, 119, 81, 242, \r
+    211, 119, 81, 242, 210, 119, 81, 242, 209, 119, 81, 242, 208, 119, 81, \r
+    242, 207, 119, 81, 242, 206, 119, 81, 242, 205, 119, 81, 242, 204, 119, \r
+    81, 242, 203, 119, 81, 242, 202, 119, 81, 242, 201, 119, 81, 242, 200, \r
+    119, 81, 242, 199, 119, 81, 242, 198, 119, 81, 242, 197, 119, 81, 242, \r
+    196, 119, 81, 242, 195, 119, 81, 242, 194, 119, 81, 242, 193, 119, 81, \r
+    242, 192, 119, 81, 69, 252, 233, 119, 81, 219, 151, 119, 81, 219, 150, \r
+    119, 81, 219, 149, 119, 81, 219, 148, 119, 81, 219, 147, 119, 81, 219, \r
+    146, 119, 81, 219, 145, 119, 81, 219, 144, 119, 81, 219, 143, 119, 81, \r
+    219, 142, 119, 81, 219, 141, 119, 81, 219, 140, 119, 81, 219, 139, 119, \r
+    81, 219, 138, 119, 81, 219, 137, 119, 81, 219, 136, 119, 81, 219, 135, \r
+    119, 81, 219, 134, 119, 81, 219, 133, 119, 81, 219, 132, 119, 81, 219, \r
+    131, 119, 81, 219, 130, 119, 81, 219, 129, 119, 81, 219, 128, 119, 81, \r
+    219, 127, 119, 81, 219, 126, 119, 81, 219, 125, 119, 81, 219, 124, 119, \r
+    81, 219, 123, 119, 81, 219, 122, 119, 81, 219, 121, 119, 81, 219, 120, \r
+    119, 81, 219, 119, 119, 81, 219, 118, 119, 81, 219, 117, 119, 81, 219, \r
+    116, 119, 81, 219, 115, 119, 81, 219, 114, 119, 81, 219, 113, 119, 81, \r
+    219, 112, 119, 81, 219, 111, 119, 81, 219, 110, 119, 81, 219, 109, 119, \r
+    81, 219, 108, 119, 81, 219, 107, 119, 81, 219, 106, 119, 81, 219, 105, \r
+    119, 81, 219, 104, 119, 81, 219, 103, 20, 217, 85, 245, 90, 223, 136, 20, \r
+    217, 85, 250, 168, 20, 131, 250, 168, 20, 124, 250, 168, 20, 148, 250, \r
+    168, 20, 245, 116, 250, 168, 20, 245, 170, 250, 168, 20, 224, 82, 250, \r
+    168, 20, 225, 43, 250, 168, 20, 246, 235, 250, 168, 20, 232, 31, 250, \r
+    168, 82, 7, 6, 1, 60, 82, 7, 6, 1, 253, 204, 82, 7, 6, 1, 251, 202, 82, \r
+    7, 6, 1, 250, 46, 82, 7, 6, 1, 73, 82, 7, 6, 1, 246, 74, 82, 7, 6, 1, \r
+    245, 67, 82, 7, 6, 1, 243, 225, 82, 7, 6, 1, 72, 82, 7, 6, 1, 237, 126, \r
+    82, 7, 6, 1, 237, 17, 82, 7, 6, 1, 153, 82, 7, 6, 1, 189, 82, 7, 6, 1, \r
+    207, 82, 7, 6, 1, 74, 82, 7, 6, 1, 230, 59, 82, 7, 6, 1, 228, 163, 82, 7, \r
+    6, 1, 152, 82, 7, 6, 1, 198, 82, 7, 6, 1, 222, 201, 82, 7, 6, 1, 68, 82, \r
+    7, 6, 1, 216, 216, 82, 7, 6, 1, 219, 40, 82, 7, 6, 1, 218, 151, 82, 7, 6, \r
+    1, 218, 90, 82, 7, 6, 1, 217, 157, 221, 114, 224, 236, 252, 17, 7, 6, 1, \r
+    198, 34, 30, 7, 6, 1, 251, 202, 34, 30, 7, 6, 1, 152, 34, 251, 100, 34, \r
+    218, 153, 204, 7, 6, 1, 253, 204, 204, 7, 6, 1, 207, 204, 7, 6, 1, 230, \r
+    59, 204, 7, 6, 1, 198, 204, 7, 6, 1, 219, 40, 204, 242, 154, 204, 233, \r
+    52, 204, 226, 96, 204, 223, 219, 204, 229, 4, 232, 136, 34, 7, 6, 1, 243, \r
+    225, 232, 136, 34, 7, 6, 1, 230, 59, 232, 136, 204, 7, 6, 1, 237, 126, \r
+    232, 136, 204, 7, 6, 1, 153, 232, 136, 204, 7, 6, 1, 189, 232, 136, 204, \r
+    7, 6, 1, 230, 59, 250, 98, 232, 136, 204, 7, 6, 1, 230, 59, 232, 136, \r
+    204, 242, 67, 232, 136, 204, 187, 232, 136, 204, 226, 177, 40, 248, 184, \r
+    40, 136, 243, 0, 204, 9, 220, 76, 240, 8, 204, 9, 220, 76, 240, 12, 204, \r
+    9, 220, 76, 240, 18, 204, 52, 249, 92, 204, 9, 220, 76, 240, 24, 204, 9, \r
+    220, 76, 240, 14, 204, 9, 220, 76, 239, 248, 204, 9, 220, 76, 240, 13, \r
+    204, 9, 220, 76, 240, 23, 204, 9, 220, 76, 240, 0, 204, 9, 220, 76, 239, \r
+    252, 204, 9, 220, 76, 240, 2, 204, 9, 220, 76, 240, 20, 204, 9, 220, 76, \r
+    240, 9, 204, 9, 220, 76, 240, 22, 204, 9, 220, 76, 240, 1, 204, 9, 220, \r
+    76, 240, 21, 204, 9, 220, 76, 239, 249, 204, 9, 220, 76, 239, 251, 204, \r
+    9, 220, 76, 239, 247, 204, 9, 220, 76, 240, 15, 204, 9, 220, 76, 240, 16, \r
+    204, 9, 220, 76, 239, 254, 204, 9, 220, 76, 240, 6, 204, 9, 220, 76, 240, \r
+    4, 204, 9, 220, 76, 240, 27, 204, 9, 220, 76, 240, 26, 204, 9, 220, 76, \r
+    239, 245, 204, 9, 220, 76, 240, 10, 204, 9, 220, 76, 240, 25, 204, 9, \r
+    220, 76, 240, 17, 204, 9, 220, 76, 240, 5, 204, 9, 220, 76, 239, 246, \r
+    204, 9, 220, 76, 240, 7, 221, 114, 224, 236, 252, 17, 9, 220, 76, 239, \r
+    255, 221, 114, 224, 236, 252, 17, 9, 220, 76, 240, 26, 221, 114, 224, \r
+    236, 252, 17, 9, 220, 76, 240, 24, 221, 114, 224, 236, 252, 17, 9, 220, \r
+    76, 240, 11, 221, 114, 224, 236, 252, 17, 9, 220, 76, 239, 253, 221, 114, \r
+    224, 236, 252, 17, 9, 220, 76, 240, 7, 221, 114, 224, 236, 252, 17, 9, \r
+    220, 76, 239, 250, 221, 114, 224, 236, 252, 17, 9, 220, 76, 240, 19, 221, \r
+    114, 224, 236, 252, 17, 9, 220, 76, 240, 3, 9, 13, 242, 57, 9, 13, 242, \r
+    56, 9, 13, 242, 55, 9, 13, 242, 54, 9, 13, 242, 53, 9, 13, 242, 52, 9, \r
+    13, 242, 51, 9, 13, 242, 50, 9, 13, 242, 49, 9, 13, 242, 48, 9, 13, 242, \r
+    47, 9, 13, 242, 46, 9, 13, 242, 45, 9, 13, 242, 44, 9, 13, 242, 43, 9, \r
+    13, 242, 42, 9, 13, 242, 41, 9, 13, 242, 40, 9, 13, 242, 39, 9, 13, 242, \r
+    38, 9, 13, 242, 37, 9, 13, 242, 36, 9, 13, 242, 35, 9, 13, 242, 34, 9, \r
+    13, 242, 33, 9, 13, 242, 32, 9, 13, 242, 31, 9, 13, 242, 30, 9, 13, 242, \r
+    29, 9, 13, 242, 28, 9, 13, 242, 27, 9, 13, 242, 26, 9, 13, 242, 25, 9, \r
+    13, 242, 24, 9, 13, 242, 23, 9, 13, 242, 22, 9, 13, 242, 21, 9, 13, 242, \r
+    20, 9, 13, 242, 19, 9, 13, 242, 18, 9, 13, 242, 17, 9, 13, 242, 16, 9, \r
+    13, 242, 15, 9, 13, 242, 14, 9, 13, 242, 13, 9, 13, 242, 12, 9, 13, 242, \r
+    11, 9, 13, 242, 10, 9, 13, 242, 9, 9, 13, 242, 8, 9, 13, 242, 7, 9, 13, \r
+    242, 6, 9, 13, 242, 5, 9, 13, 242, 4, 9, 13, 242, 3, 9, 13, 242, 2, 9, \r
+    13, 242, 1, 9, 13, 242, 0, 9, 13, 241, 255, 9, 13, 241, 254, 9, 13, 241, \r
+    253, 9, 13, 241, 252, 9, 13, 241, 251, 9, 13, 241, 250, 9, 13, 241, 249, \r
+    9, 13, 241, 248, 9, 13, 241, 247, 9, 13, 241, 246, 9, 13, 241, 245, 9, \r
+    13, 241, 244, 9, 13, 241, 243, 9, 13, 241, 242, 9, 13, 241, 241, 9, 13, \r
+    241, 240, 9, 13, 241, 239, 9, 13, 241, 238, 9, 13, 241, 237, 9, 13, 241, \r
+    236, 9, 13, 241, 235, 9, 13, 241, 234, 9, 13, 241, 233, 9, 13, 241, 232, \r
+    9, 13, 241, 231, 9, 13, 241, 230, 9, 13, 241, 229, 9, 13, 241, 228, 9, \r
+    13, 241, 227, 9, 13, 241, 226, 9, 13, 241, 225, 9, 13, 241, 224, 9, 13, \r
+    241, 223, 9, 13, 241, 222, 9, 13, 241, 221, 9, 13, 241, 220, 9, 13, 241, \r
+    219, 9, 13, 241, 218, 9, 13, 241, 217, 9, 13, 241, 216, 9, 13, 241, 215, \r
+    9, 13, 241, 214, 9, 13, 241, 213, 9, 13, 241, 212, 9, 13, 241, 211, 9, \r
+    13, 241, 210, 9, 13, 241, 209, 9, 13, 241, 208, 9, 13, 241, 207, 9, 13, \r
+    241, 206, 9, 13, 241, 205, 9, 13, 241, 204, 9, 13, 241, 203, 9, 13, 241, \r
+    202, 9, 13, 241, 201, 9, 13, 241, 200, 9, 13, 241, 199, 9, 13, 241, 198, \r
+    9, 13, 241, 197, 9, 13, 241, 196, 9, 13, 241, 195, 9, 13, 241, 194, 9, \r
+    13, 241, 193, 9, 13, 241, 192, 9, 13, 241, 191, 9, 13, 241, 190, 9, 13, \r
+    241, 189, 9, 13, 241, 188, 9, 13, 241, 187, 9, 13, 241, 186, 9, 13, 241, \r
+    185, 9, 13, 241, 184, 9, 13, 241, 183, 9, 13, 241, 182, 9, 13, 241, 181, \r
+    9, 13, 241, 180, 9, 13, 241, 179, 9, 13, 241, 178, 9, 13, 241, 177, 9, \r
+    13, 241, 176, 9, 13, 241, 175, 9, 13, 241, 174, 9, 13, 241, 173, 9, 13, \r
+    241, 172, 9, 13, 241, 171, 9, 13, 241, 170, 9, 13, 241, 169, 9, 13, 241, \r
+    168, 9, 13, 241, 167, 9, 13, 241, 166, 9, 13, 241, 165, 9, 13, 241, 164, \r
+    9, 13, 241, 163, 9, 13, 241, 162, 9, 13, 241, 161, 9, 13, 241, 160, 9, \r
+    13, 241, 159, 9, 13, 241, 158, 9, 13, 241, 157, 9, 13, 241, 156, 9, 13, \r
+    241, 155, 9, 13, 241, 154, 9, 13, 241, 153, 9, 13, 241, 152, 9, 13, 241, \r
+    151, 9, 13, 241, 150, 9, 13, 241, 149, 9, 13, 241, 148, 9, 13, 241, 147, \r
+    9, 13, 241, 146, 9, 13, 241, 145, 9, 13, 241, 144, 9, 13, 241, 143, 9, \r
+    13, 241, 142, 9, 13, 241, 141, 9, 13, 241, 140, 9, 13, 241, 139, 9, 13, \r
+    241, 138, 9, 13, 241, 137, 9, 13, 241, 136, 9, 13, 241, 135, 9, 13, 241, \r
+    134, 9, 13, 241, 133, 9, 13, 241, 132, 9, 13, 241, 131, 9, 13, 241, 130, \r
+    9, 13, 241, 129, 9, 13, 241, 128, 9, 13, 241, 127, 9, 13, 241, 126, 9, \r
+    13, 241, 125, 9, 13, 241, 124, 9, 13, 241, 123, 9, 13, 241, 122, 9, 13, \r
+    241, 121, 9, 13, 241, 120, 9, 13, 241, 119, 9, 13, 241, 118, 9, 13, 241, \r
+    117, 9, 13, 241, 116, 9, 13, 241, 115, 9, 13, 241, 114, 9, 13, 241, 113, \r
+    9, 13, 241, 112, 9, 13, 241, 111, 9, 13, 241, 110, 9, 13, 241, 109, 9, \r
+    13, 241, 108, 9, 13, 241, 107, 9, 13, 241, 106, 9, 13, 241, 105, 9, 13, \r
+    241, 104, 9, 13, 241, 103, 9, 13, 241, 102, 9, 13, 241, 101, 9, 13, 241, \r
+    100, 9, 13, 241, 99, 9, 13, 241, 98, 9, 13, 241, 97, 9, 13, 241, 96, 9, \r
+    13, 241, 95, 9, 13, 241, 94, 9, 13, 241, 93, 9, 13, 241, 92, 9, 13, 241, \r
+    91, 9, 13, 241, 90, 9, 13, 241, 89, 9, 13, 241, 88, 9, 13, 241, 87, 9, \r
+    13, 241, 86, 9, 13, 241, 85, 9, 13, 241, 84, 9, 13, 241, 83, 9, 13, 241, \r
+    82, 9, 13, 241, 81, 9, 13, 241, 80, 9, 13, 241, 79, 9, 13, 241, 78, 9, \r
+    13, 241, 77, 9, 13, 241, 76, 9, 13, 241, 75, 9, 13, 241, 74, 9, 13, 241, \r
+    73, 9, 13, 241, 72, 9, 13, 241, 71, 9, 13, 241, 70, 9, 13, 241, 69, 9, \r
+    13, 241, 68, 9, 13, 241, 67, 9, 13, 241, 66, 9, 13, 241, 65, 9, 13, 241, \r
+    64, 9, 13, 241, 63, 9, 13, 241, 62, 9, 13, 241, 61, 9, 13, 241, 60, 9, \r
+    13, 241, 59, 9, 13, 241, 58, 9, 13, 241, 57, 9, 13, 241, 56, 9, 13, 241, \r
+    55, 9, 13, 241, 54, 9, 13, 241, 53, 9, 13, 241, 52, 9, 13, 241, 51, 9, \r
+    13, 241, 50, 9, 13, 241, 49, 9, 13, 241, 48, 9, 13, 241, 47, 9, 13, 241, \r
+    46, 9, 13, 241, 45, 9, 13, 241, 44, 9, 13, 241, 43, 9, 13, 241, 42, 9, \r
+    13, 241, 41, 9, 13, 241, 40, 9, 13, 241, 39, 9, 13, 241, 38, 9, 13, 241, \r
+    37, 9, 13, 241, 36, 9, 13, 241, 35, 9, 13, 241, 34, 9, 13, 241, 33, 9, \r
+    13, 241, 32, 9, 13, 241, 31, 9, 13, 241, 30, 9, 13, 241, 29, 9, 13, 241, \r
+    28, 9, 13, 241, 27, 9, 13, 241, 26, 9, 13, 241, 25, 9, 13, 241, 24, 9, \r
+    13, 241, 23, 9, 13, 241, 22, 9, 13, 241, 21, 9, 13, 241, 20, 9, 13, 241, \r
+    19, 9, 13, 241, 18, 9, 13, 241, 17, 9, 13, 241, 16, 9, 13, 241, 15, 9, \r
+    13, 241, 14, 9, 13, 241, 13, 9, 13, 241, 12, 9, 13, 241, 11, 9, 13, 241, \r
+    10, 9, 13, 241, 9, 9, 13, 241, 8, 9, 13, 241, 7, 9, 13, 241, 6, 9, 13, \r
+    241, 5, 9, 13, 241, 4, 9, 13, 241, 3, 9, 13, 241, 2, 9, 13, 241, 1, 9, \r
+    13, 241, 0, 9, 13, 240, 255, 9, 13, 240, 254, 9, 13, 240, 253, 9, 13, \r
+    240, 252, 9, 13, 240, 251, 9, 13, 240, 250, 9, 13, 240, 249, 9, 13, 240, \r
+    248, 9, 13, 240, 247, 9, 13, 240, 246, 9, 13, 240, 245, 9, 13, 240, 244, \r
+    9, 13, 240, 243, 9, 13, 240, 242, 9, 13, 240, 241, 9, 13, 240, 240, 9, \r
+    13, 240, 239, 9, 13, 240, 238, 9, 13, 240, 237, 9, 13, 240, 236, 9, 13, \r
+    240, 235, 9, 13, 240, 234, 9, 13, 240, 233, 9, 13, 240, 232, 9, 13, 240, \r
+    231, 9, 13, 240, 230, 9, 13, 240, 229, 9, 13, 240, 228, 9, 13, 240, 227, \r
+    9, 13, 240, 226, 9, 13, 240, 225, 9, 13, 240, 224, 9, 13, 240, 223, 9, \r
+    13, 240, 222, 9, 13, 240, 221, 9, 13, 240, 220, 9, 13, 240, 219, 9, 13, \r
+    240, 218, 9, 13, 240, 217, 9, 13, 240, 216, 9, 13, 240, 215, 9, 13, 240, \r
+    214, 9, 13, 240, 213, 9, 13, 240, 212, 9, 13, 240, 211, 9, 13, 240, 210, \r
+    9, 13, 240, 209, 9, 13, 240, 208, 9, 13, 240, 207, 9, 13, 240, 206, 9, \r
+    13, 240, 205, 9, 13, 240, 204, 9, 13, 240, 203, 9, 13, 240, 202, 9, 13, \r
+    240, 201, 9, 13, 240, 200, 9, 13, 240, 199, 9, 13, 240, 198, 9, 13, 240, \r
+    197, 9, 13, 240, 196, 9, 13, 240, 195, 9, 13, 240, 194, 9, 13, 240, 193, \r
+    9, 13, 240, 192, 9, 13, 240, 191, 9, 13, 240, 190, 9, 13, 240, 189, 9, \r
+    13, 240, 188, 9, 13, 240, 187, 9, 13, 240, 186, 9, 13, 240, 185, 9, 13, \r
+    240, 184, 9, 13, 240, 183, 9, 13, 240, 182, 9, 13, 240, 181, 9, 13, 240, \r
+    180, 9, 13, 240, 179, 9, 13, 240, 178, 9, 13, 240, 177, 9, 13, 240, 176, \r
+    9, 13, 240, 175, 9, 13, 240, 174, 9, 13, 240, 173, 9, 13, 240, 172, 9, \r
+    13, 240, 171, 9, 13, 240, 170, 9, 13, 240, 169, 9, 13, 240, 168, 9, 13, \r
+    240, 167, 9, 13, 240, 166, 9, 13, 240, 165, 9, 13, 240, 164, 9, 13, 240, \r
+    163, 9, 13, 240, 162, 9, 13, 240, 161, 9, 13, 240, 160, 9, 13, 240, 159, \r
+    9, 13, 240, 158, 9, 13, 240, 157, 9, 13, 240, 156, 9, 13, 240, 155, 9, \r
+    13, 240, 154, 9, 13, 240, 153, 9, 13, 240, 152, 9, 13, 240, 151, 9, 13, \r
+    240, 150, 9, 13, 240, 149, 9, 13, 240, 148, 9, 13, 240, 147, 9, 13, 240, \r
+    146, 9, 13, 240, 145, 9, 13, 240, 144, 9, 13, 240, 143, 9, 13, 240, 142, \r
+    9, 13, 240, 141, 9, 13, 240, 140, 9, 13, 240, 139, 9, 13, 240, 138, 9, \r
+    13, 240, 137, 9, 13, 240, 136, 9, 13, 240, 135, 9, 13, 240, 134, 9, 13, \r
+    240, 133, 9, 13, 240, 132, 9, 13, 240, 131, 9, 13, 240, 130, 9, 13, 240, \r
+    129, 9, 13, 240, 128, 9, 13, 240, 127, 9, 13, 240, 126, 9, 13, 240, 125, \r
+    9, 13, 240, 124, 9, 13, 240, 123, 9, 13, 240, 122, 9, 13, 240, 121, 9, \r
+    13, 240, 120, 9, 13, 240, 119, 9, 13, 240, 118, 9, 13, 240, 117, 9, 13, \r
+    240, 116, 9, 13, 240, 115, 9, 13, 240, 114, 9, 13, 240, 113, 9, 13, 240, \r
+    112, 9, 13, 240, 111, 9, 13, 240, 110, 9, 13, 240, 109, 9, 13, 240, 108, \r
+    9, 13, 240, 107, 9, 13, 240, 106, 9, 13, 240, 105, 9, 13, 240, 104, 9, \r
+    13, 240, 103, 9, 13, 240, 102, 9, 13, 240, 101, 9, 13, 240, 100, 9, 13, \r
+    240, 99, 9, 13, 240, 98, 9, 13, 240, 97, 9, 13, 240, 96, 9, 13, 240, 95, \r
+    9, 13, 240, 94, 9, 13, 240, 93, 9, 13, 240, 92, 9, 13, 240, 91, 9, 13, \r
+    240, 90, 9, 13, 240, 89, 9, 13, 240, 88, 9, 13, 240, 87, 9, 13, 240, 86, \r
+    9, 13, 240, 85, 9, 13, 240, 84, 9, 13, 240, 83, 9, 13, 240, 82, 9, 13, \r
+    240, 81, 9, 13, 240, 80, 9, 13, 240, 79, 9, 13, 240, 78, 9, 13, 240, 77, \r
+    9, 13, 240, 76, 9, 13, 240, 75, 9, 13, 240, 74, 9, 13, 240, 73, 9, 13, \r
+    240, 72, 9, 13, 240, 71, 9, 13, 240, 70, 9, 13, 240, 69, 9, 13, 240, 68, \r
+    9, 13, 240, 67, 9, 13, 240, 66, 9, 13, 240, 65, 9, 13, 240, 64, 9, 13, \r
+    240, 63, 9, 13, 240, 62, 9, 13, 240, 61, 9, 13, 240, 60, 9, 13, 240, 59, \r
+    9, 13, 240, 58, 9, 13, 240, 57, 9, 13, 240, 56, 9, 13, 240, 55, 9, 13, \r
+    240, 54, 9, 13, 240, 53, 9, 13, 240, 52, 9, 13, 240, 51, 9, 13, 240, 50, \r
+    9, 13, 240, 49, 9, 13, 240, 48, 9, 13, 240, 47, 9, 13, 240, 46, 9, 13, \r
+    240, 45, 9, 13, 240, 44, 9, 13, 240, 43, 9, 13, 240, 42, 9, 13, 240, 41, \r
+    9, 13, 240, 40, 9, 13, 240, 39, 9, 13, 240, 38, 9, 13, 240, 37, 9, 13, \r
+    240, 36, 9, 13, 240, 35, 9, 13, 240, 34, 9, 13, 240, 33, 9, 13, 240, 32, \r
+    9, 13, 240, 31, 9, 13, 240, 30, 9, 13, 240, 29, 9, 13, 240, 28, 235, 148, \r
+    222, 141, 118, 223, 254, 118, 246, 95, 78, 118, 228, 69, 78, 118, 54, 55, \r
+    118, 248, 155, 55, 118, 229, 169, 55, 118, 254, 134, 118, 254, 79, 118, \r
+    42, 229, 229, 118, 45, 229, 229, 118, 253, 251, 118, 88, 55, 118, 250, \r
+    168, 118, 242, 120, 118, 245, 90, 223, 136, 118, 224, 17, 118, 20, 217, \r
+    84, 118, 20, 107, 118, 20, 103, 118, 20, 160, 118, 20, 154, 118, 20, 174, \r
+    118, 20, 182, 118, 20, 191, 118, 20, 185, 118, 20, 190, 118, 250, 175, \r
+    118, 225, 67, 118, 235, 87, 55, 118, 246, 154, 55, 118, 244, 30, 55, 118, \r
+    228, 82, 78, 118, 250, 167, 253, 244, 118, 7, 6, 1, 60, 118, 7, 6, 1, \r
+    253, 204, 118, 7, 6, 1, 251, 202, 118, 7, 6, 1, 250, 46, 118, 7, 6, 1, \r
+    73, 118, 7, 6, 1, 246, 74, 118, 7, 6, 1, 245, 67, 118, 7, 6, 1, 243, 225, \r
+    118, 7, 6, 1, 72, 118, 7, 6, 1, 237, 126, 118, 7, 6, 1, 237, 17, 118, 7, \r
+    6, 1, 153, 118, 7, 6, 1, 189, 118, 7, 6, 1, 207, 118, 7, 6, 1, 74, 118, \r
+    7, 6, 1, 230, 59, 118, 7, 6, 1, 228, 163, 118, 7, 6, 1, 152, 118, 7, 6, \r
+    1, 198, 118, 7, 6, 1, 222, 201, 118, 7, 6, 1, 68, 118, 7, 6, 1, 216, 216, \r
+    118, 7, 6, 1, 219, 40, 118, 7, 6, 1, 218, 151, 118, 7, 6, 1, 218, 90, \r
+    118, 7, 6, 1, 217, 157, 118, 42, 40, 115, 118, 227, 160, 224, 17, 118, \r
+    45, 40, 115, 118, 250, 217, 255, 0, 118, 109, 235, 43, 118, 244, 37, 255, \r
+    0, 118, 7, 3, 1, 60, 118, 7, 3, 1, 253, 204, 118, 7, 3, 1, 251, 202, 118, \r
+    7, 3, 1, 250, 46, 118, 7, 3, 1, 73, 118, 7, 3, 1, 246, 74, 118, 7, 3, 1, \r
+    245, 67, 118, 7, 3, 1, 243, 225, 118, 7, 3, 1, 72, 118, 7, 3, 1, 237, \r
+    126, 118, 7, 3, 1, 237, 17, 118, 7, 3, 1, 153, 118, 7, 3, 1, 189, 118, 7, \r
+    3, 1, 207, 118, 7, 3, 1, 74, 118, 7, 3, 1, 230, 59, 118, 7, 3, 1, 228, \r
+    163, 118, 7, 3, 1, 152, 118, 7, 3, 1, 198, 118, 7, 3, 1, 222, 201, 118, \r
+    7, 3, 1, 68, 118, 7, 3, 1, 216, 216, 118, 7, 3, 1, 219, 40, 118, 7, 3, 1, \r
+    218, 151, 118, 7, 3, 1, 218, 90, 118, 7, 3, 1, 217, 157, 118, 42, 250, \r
+    79, 115, 118, 69, 235, 43, 118, 45, 250, 79, 115, 118, 221, 179, 251, \r
+    153, 222, 141, 41, 225, 251, 41, 225, 240, 41, 225, 229, 41, 225, 217, \r
+    41, 225, 206, 41, 225, 195, 41, 225, 184, 41, 225, 173, 41, 225, 162, 41, \r
+    225, 154, 41, 225, 153, 41, 225, 152, 41, 225, 151, 41, 225, 149, 41, \r
+    225, 148, 41, 225, 147, 41, 225, 146, 41, 225, 145, 41, 225, 144, 41, \r
+    225, 143, 41, 225, 142, 41, 225, 141, 41, 225, 140, 41, 225, 138, 41, \r
+    225, 137, 41, 225, 136, 41, 225, 135, 41, 225, 134, 41, 225, 133, 41, \r
+    225, 132, 41, 225, 131, 41, 225, 130, 41, 225, 129, 41, 225, 127, 41, \r
+    225, 126, 41, 225, 125, 41, 225, 124, 41, 225, 123, 41, 225, 122, 41, \r
+    225, 121, 41, 225, 120, 41, 225, 119, 41, 225, 118, 41, 225, 116, 41, \r
+    225, 115, 41, 225, 114, 41, 225, 113, 41, 225, 112, 41, 225, 111, 41, \r
+    225, 110, 41, 225, 109, 41, 225, 108, 41, 225, 107, 41, 225, 105, 41, \r
+    225, 104, 41, 225, 103, 41, 225, 102, 41, 225, 101, 41, 225, 100, 41, \r
+    225, 99, 41, 225, 98, 41, 225, 97, 41, 225, 96, 41, 225, 94, 41, 225, 93, \r
+    41, 225, 92, 41, 225, 91, 41, 225, 90, 41, 225, 89, 41, 225, 88, 41, 225, \r
+    87, 41, 225, 86, 41, 225, 85, 41, 225, 83, 41, 225, 82, 41, 225, 81, 41, \r
+    225, 80, 41, 225, 79, 41, 225, 78, 41, 225, 77, 41, 225, 76, 41, 225, 75, \r
+    41, 225, 74, 41, 226, 71, 41, 226, 70, 41, 226, 69, 41, 226, 68, 41, 226, \r
+    67, 41, 226, 66, 41, 226, 65, 41, 226, 64, 41, 226, 63, 41, 226, 62, 41, \r
+    226, 60, 41, 226, 59, 41, 226, 58, 41, 226, 57, 41, 226, 56, 41, 226, 55, \r
+    41, 226, 54, 41, 226, 53, 41, 226, 52, 41, 226, 51, 41, 226, 49, 41, 226, \r
+    48, 41, 226, 47, 41, 226, 46, 41, 226, 45, 41, 226, 44, 41, 226, 43, 41, \r
+    226, 42, 41, 226, 41, 41, 226, 40, 41, 226, 38, 41, 226, 37, 41, 226, 36, \r
+    41, 226, 35, 41, 226, 34, 41, 226, 33, 41, 226, 32, 41, 226, 31, 41, 226, \r
+    30, 41, 226, 29, 41, 226, 27, 41, 226, 26, 41, 226, 25, 41, 226, 24, 41, \r
+    226, 23, 41, 226, 22, 41, 226, 21, 41, 226, 20, 41, 226, 19, 41, 226, 18, \r
+    41, 226, 16, 41, 226, 15, 41, 226, 14, 41, 226, 13, 41, 226, 12, 41, 226, \r
+    11, 41, 226, 10, 41, 226, 9, 41, 226, 8, 41, 226, 7, 41, 226, 5, 41, 226, \r
+    4, 41, 226, 3, 41, 226, 2, 41, 226, 1, 41, 226, 0, 41, 225, 255, 41, 225, \r
+    254, 41, 225, 253, 41, 225, 252, 41, 225, 250, 41, 225, 249, 41, 225, \r
+    248, 41, 225, 247, 41, 225, 246, 41, 225, 245, 41, 225, 244, 41, 225, \r
+    243, 41, 225, 242, 41, 225, 241, 41, 225, 239, 41, 225, 238, 41, 225, \r
+    237, 41, 225, 236, 41, 225, 235, 41, 225, 234, 41, 225, 233, 41, 225, \r
+    232, 41, 225, 231, 41, 225, 230, 41, 225, 228, 41, 225, 227, 41, 225, \r
+    226, 41, 225, 225, 41, 225, 224, 41, 225, 223, 41, 225, 222, 41, 225, \r
+    221, 41, 225, 220, 41, 225, 219, 41, 225, 216, 41, 225, 215, 41, 225, \r
+    214, 41, 225, 213, 41, 225, 212, 41, 225, 211, 41, 225, 210, 41, 225, \r
+    209, 41, 225, 208, 41, 225, 207, 41, 225, 205, 41, 225, 204, 41, 225, \r
+    203, 41, 225, 202, 41, 225, 201, 41, 225, 200, 41, 225, 199, 41, 225, \r
+    198, 41, 225, 197, 41, 225, 196, 41, 225, 194, 41, 225, 193, 41, 225, \r
+    192, 41, 225, 191, 41, 225, 190, 41, 225, 189, 41, 225, 188, 41, 225, \r
+    187, 41, 225, 186, 41, 225, 185, 41, 225, 183, 41, 225, 182, 41, 225, \r
+    181, 41, 225, 180, 41, 225, 179, 41, 225, 178, 41, 225, 177, 41, 225, \r
+    176, 41, 225, 175, 41, 225, 174, 41, 225, 172, 41, 225, 171, 41, 225, \r
+    170, 41, 225, 169, 41, 225, 168, 41, 225, 167, 41, 225, 166, 41, 225, \r
+    165, 41, 225, 164, 41, 225, 163, 41, 225, 161, 41, 225, 160, 41, 225, \r
+    159, 41, 225, 158, 41, 225, 157, 41, 225, 156, 41, 225, 155, \r
+};\r
+\r
+static unsigned char phrasebook_offset1[] = {\r
+    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, \r
+    21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, \r
+    39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, \r
+    57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, \r
+    75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 17, 87, 88, 89, 90, 91, \r
+    92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 103, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 104, 105, 106, 107, 108, \r
+    109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, \r
+    123, 124, 125, 17, 126, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 127, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 128, 129, \r
+    130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, \r
+    144, 145, 17, 146, 147, 148, 149, 150, 17, 17, 17, 17, 17, 17, 151, 17, \r
+    152, 17, 153, 17, 154, 17, 155, 17, 17, 17, 156, 17, 17, 17, 17, 157, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 158, 159, 160, 161, 162, 163, \r
+    164, 17, 165, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 166, 167, 168, 169, 170, 171, 172, 173, \r
+    174, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 175, 176, 177, 178, 179, 17, 180, 17, 181, 182, \r
+    183, 184, 185, 186, 187, 188, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 189, 190, 191, 192, 193, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 194, 195, 196, 197, 198, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 199, 17, 200, 201, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+    17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, \r
+};\r
+\r
+static unsigned int phrasebook_offset2[] = {\r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 6, 9, 11, 14, 17, 19, 21, 24, 27, 29, 31, \r
+    33, 35, 39, 41, 44, 46, 48, 50, 52, 54, 56, 58, 60, 62, 64, 66, 69, 72, \r
+    75, 78, 82, 86, 91, 96, 101, 105, 110, 115, 120, 124, 129, 134, 138, 142, \r
+    146, 150, 155, 160, 164, 168, 173, 177, 182, 187, 192, 197, 202, 205, \r
+    209, 212, 216, 219, 223, 227, 232, 237, 242, 246, 251, 256, 261, 265, \r
+    270, 275, 279, 283, 287, 291, 296, 301, 305, 309, 314, 318, 323, 328, \r
+    333, 338, 343, 347, 350, 354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 356, 360, 365, \r
+    368, 371, 374, 377, 380, 383, 385, 388, 394, 402, 404, 408, 411, 413, \r
+    416, 419, 422, 425, 429, 432, 435, 439, 441, 444, 450, 458, 465, 472, \r
+    479, 484, 491, 497, 504, 511, 518, 526, 531, 539, 546, 552, 559, 566, \r
+    574, 581, 589, 597, 602, 610, 617, 623, 630, 637, 644, 647, 653, 660, \r
+    666, 673, 680, 687, 692, 698, 705, 711, 718, 725, 732, 740, 745, 753, \r
+    760, 766, 773, 780, 788, 795, 803, 811, 816, 824, 831, 837, 844, 851, \r
+    858, 861, 867, 874, 880, 887, 894, 901, 906, 914, 921, 928, 935, 942, \r
+    949, 956, 963, 970, 978, 986, 994, 1002, 1010, 1018, 1026, 1034, 1041, \r
+    1048, 1055, 1062, 1069, 1076, 1083, 1090, 1097, 1104, 1111, 1118, 1126, \r
+    1134, 1142, 1150, 1158, 1166, 1174, 1182, 1190, 1198, 1205, 1212, 1220, \r
+    1228, 1236, 1244, 1252, 1260, 1268, 1276, 1284, 1290, 1295, 1300, 1308, \r
+    1316, 1324, 1332, 1337, 1344, 1351, 1359, 1367, 1375, 1383, 1393, 1403, \r
+    1410, 1417, 1424, 1431, 1439, 1447, 1455, 1463, 1474, 1479, 1484, 1491, \r
+    1498, 1505, 1512, 1519, 1526, 1531, 1536, 1543, 1550, 1558, 1566, 1574, \r
+    1582, 1589, 1596, 1604, 1612, 1620, 1628, 1636, 1644, 1652, 1660, 1668, \r
+    1676, 1683, 1690, 1697, 1704, 1711, 1718, 1725, 1732, 1740, 1748, 1755, \r
+    1762, 1769, 1776, 1784, 1792, 1800, 1808, 1816, 1823, 1830, 1838, 1846, \r
+    1854, 1862, 1867, 1873, 1879, 1886, 1893, 1898, 1903, 1909, 1916, 1923, \r
+    1930, 1937, 1945, 1953, 1959, 1964, 1969, 1975, 1982, 1989, 1996, 2001, \r
+    2006, 2011, 2018, 2025, 2032, 2039, 2046, 2051, 2059, 2069, 2078, 2085, \r
+    2092, 2097, 2102, 2109, 2116, 2120, 2125, 2130, 2135, 2142, 2151, 2158, \r
+    2165, 2174, 2181, 2188, 2193, 2200, 2207, 2214, 2221, 2228, 2233, 2240, \r
+    2247, 2255, 2260, 2265, 2270, 2280, 2284, 2290, 2296, 2302, 2308, 2316, \r
+    2329, 2337, 2342, 2352, 2357, 2362, 2372, 2377, 2384, 2391, 2399, 2407, \r
+    2414, 2421, 2428, 2435, 2445, 2455, 2464, 2473, 2483, 2493, 2503, 2513, \r
+    2518, 2528, 2538, 2548, 2558, 2566, 2574, 2581, 2588, 2596, 2604, 2612, \r
+    2620, 2627, 2634, 2644, 2654, 2662, 2670, 2678, 2683, 2693, 2698, 2705, \r
+    2712, 2717, 2722, 2730, 2738, 2748, 2758, 2765, 2772, 2780, 2788, 2796, \r
+    2804, 2813, 2822, 2830, 2838, 2847, 2856, 2865, 2874, 2884, 2894, 2902, \r
+    2910, 2919, 2928, 2937, 2946, 2956, 2966, 2974, 2982, 2991, 3000, 3009, \r
+    3018, 3027, 3036, 3041, 3046, 3054, 3062, 3072, 3080, 3085, 3090, 3097, \r
+    3104, 3111, 3118, 3125, 3132, 3142, 3152, 3162, 3172, 3179, 3186, 3196, \r
+    3206, 3214, 3222, 3230, 3238, 3246, 3253, 3260, 3267, 3273, 3280, 3287, \r
+    3294, 3303, 3313, 3323, 3330, 3337, 3343, 3348, 3354, 3360, 3366, 3373, \r
+    3380, 3391, 3401, 3408, 3415, 3422, 3429, 3434, 3439, 3445, 3451, 3457, \r
+    3465, 3473, 3480, 3485, 3490, 3497, 3503, 3510, 3519, 3528, 3537, 3544, \r
+    3550, 3556, 3561, 3568, 3574, 3581, 3588, 3595, 3600, 3605, 3615, 3623, \r
+    3632, 3637, 3642, 3652, 3659, 3667, 3676, 3681, 3687, 3693, 3700, 3705, \r
+    3710, 3720, 3728, 3737, 3745, 3753, 3762, 3767, 3774, 3781, 3786, 3797, \r
+    3805, 3813, 3819, 3828, 3833, 3838, 3845, 3851, 3857, 3863, 3869, 3878, \r
+    3886, 3891, 3899, 3905, 3913, 3921, 3927, 3933, 3939, 3947, 3955, 3961, \r
+    3969, 3975, 3980, 3987, 3995, 4004, 4011, 4018, 4028, 4035, 4042, 4052, \r
+    4059, 4066, 4073, 4079, 4085, 4094, 4106, 4111, 4118, 4123, 4127, 4132, \r
+    4140, 4147, 4152, 4157, 4161, 4166, 4171, 4175, 4180, 4186, 4192, 4198, \r
+    4205, 4210, 4215, 4220, 4225, 4231, 4233, 4238, 4242, 4248, 4254, 4260, \r
+    4265, 4272, 4279, 4285, 4292, 4300, 4308, 4313, 4318, 4322, 4327, 4329, \r
+    4331, 4334, 4336, 4339, 4344, 4349, 4355, 4360, 4364, 4368, 4373, 4381, \r
+    4387, 4392, 4398, 4403, 4409, 4417, 4425, 4429, 4433, 4438, 4444, 4450, \r
+    4456, 4462, 4467, 4475, 4484, 4493, 4498, 4504, 4511, 4518, 4525, 4532, \r
+    4536, 4542, 4547, 4552, 4557, 4562, 4565, 4568, 4571, 4574, 4577, 4580, \r
+    4584, 4588, 4594, 4597, 4602, 4608, 4614, 4617, 4622, 4627, 4631, 4636, \r
+    4642, 4648, 4654, 4659, 4664, 4669, 4672, 4678, 4683, 4688, 4692, 4697, \r
+    4703, 4709, 4712, 4716, 4720, 4724, 4727, 4730, 4735, 4739, 4746, 4750, \r
+    4756, 4760, 4766, 4770, 4774, 4778, 4783, 4788, 4794, 4799, 4806, 4812, \r
+    4818, 4824, 4827, 4831, 4835, 4839, 4843, 4848, 4853, 4857, 4861, 4867, \r
+    4871, 4875, 4880, 4886, 4891, 4896, 4900, 4906, 4911, 4916, 4921, 4926, \r
+    4932, 4935, 4939, 4944, 4949, 4958, 4964, 4969, 4973, 4978, 4982, 4987, \r
+    4991, 4995, 5000, 5004, 5010, 5015, 5020, 5025, 5030, 5035, 5040, 5046, \r
+    5052, 5058, 5063, 5068, 5074, 5080, 5086, 5091, 5096, 5103, 5110, 5114, \r
+    5120, 5127, 0, 0, 5134, 5137, 5145, 5154, 5164, 0, 0, 0, 0, 0, 5168, \r
+    5171, 5176, 5184, 5189, 5197, 5205, 0, 5213, 0, 5221, 5229, 5237, 5248, \r
+    5253, 5258, 5263, 5268, 5273, 5278, 5283, 5288, 5293, 5298, 5303, 5308, \r
+    5313, 5318, 5323, 5328, 0, 5333, 5338, 5343, 5348, 5353, 5358, 5363, \r
+    5368, 5376, 5384, 5392, 5400, 5408, 5416, 5427, 5432, 5437, 5442, 5447, \r
+    5452, 5457, 5462, 5467, 5472, 5477, 5482, 5487, 5492, 5497, 5502, 5507, \r
+    5512, 5518, 5523, 5528, 5533, 5538, 5543, 5548, 5553, 5561, 5569, 5577, \r
+    5585, 5593, 5598, 5602, 5606, 5613, 5623, 5633, 5637, 5641, 5645, 5651, \r
+    5658, 5662, 5667, 5671, 5676, 5680, 5685, 5689, 5694, 5699, 5704, 5709, \r
+    5714, 5719, 5724, 5729, 5734, 5739, 5744, 5749, 5754, 5759, 5764, 5768, \r
+    5772, 5778, 5782, 5787, 5793, 5800, 5805, 5810, 5817, 5822, 5827, 5833, \r
+    5841, 5850, 5860, 5868, 5873, 5878, 5883, 5890, 5895, 5901, 5906, 5911, \r
+    5916, 5921, 5926, 5931, 5939, 5945, 5950, 5954, 5959, 5964, 5969, 5974, \r
+    5979, 5984, 5989, 5993, 5999, 6003, 6008, 6013, 6018, 6022, 6027, 6032, \r
+    6037, 6042, 6046, 6051, 6055, 6060, 6065, 6070, 6075, 6081, 6086, 6092, \r
+    6096, 6101, 6105, 6109, 6114, 6119, 6124, 6129, 6134, 6139, 6144, 6148, \r
+    6154, 6158, 6163, 6168, 6173, 6177, 6182, 6187, 6192, 6197, 6201, 6206, \r
+    6210, 6215, 6220, 6225, 6230, 6236, 6241, 6247, 6251, 6256, 6260, 6268, \r
+    6273, 6278, 6283, 6290, 6295, 6301, 6306, 6311, 6316, 6321, 6326, 6331, \r
+    6339, 6345, 6350, 6355, 6360, 6365, 6370, 6376, 6382, 6389, 6396, 6405, \r
+    6414, 6421, 6428, 6437, 6446, 6451, 6456, 6461, 6466, 6471, 6476, 6481, \r
+    6486, 6497, 6508, 6513, 6518, 6525, 6532, 6540, 6548, 6553, 6558, 6563, \r
+    6568, 6572, 6576, 6580, 6585, 6590, 6594, 6601, 6606, 6616, 6626, 6632, \r
+    6638, 6646, 6654, 6662, 6670, 6677, 6684, 6693, 6702, 6710, 6718, 6726, \r
+    6734, 6741, 6748, 6755, 6762, 6768, 6774, 6780, 6786, 6794, 6802, 6809, \r
+    6816, 6825, 6834, 6840, 6846, 6854, 6862, 6870, 6878, 6884, 6890, 6898, \r
+    6906, 6914, 6922, 6929, 6936, 6944, 6952, 6960, 6968, 6973, 6978, 6985, \r
+    6992, 7002, 7012, 7016, 7024, 7032, 7038, 7044, 7052, 7060, 7067, 7074, \r
+    7082, 7090, 7097, 7104, 7112, 7120, 7125, 7132, 7139, 7146, 7153, 7159, \r
+    7165, 7173, 7181, 7186, 7191, 7199, 7207, 7215, 7223, 7231, 7239, 7246, \r
+    7253, 7261, 7269, 7277, 7285, 7292, 7299, 7305, 7311, 7320, 7329, 7336, \r
+    7343, 7350, 7357, 7364, 7371, 7378, 7385, 7393, 7401, 7409, 7417, 7425, \r
+    7433, 7442, 7451, 7458, 7465, 7472, 7479, 7486, 7493, 7500, 7507, 7514, \r
+    7521, 7528, 7535, 7542, 7549, 7556, 7563, 7570, 7577, 7584, 7591, 7597, \r
+    7603, 7610, 7617, 7622, 7627, 7632, 7637, 7642, 7647, 7652, 7657, 7662, \r
+    7667, 7673, 7679, 7688, 7697, 7706, 7715, 7723, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 7731, 7736, 7741, 7746, 7751, 7756, 7761, 7766, 7771, 7775, \r
+    7780, 7785, 7790, 7795, 7800, 7805, 7810, 7815, 7820, 7825, 7830, 7835, \r
+    7840, 7845, 7850, 7855, 7860, 7865, 7869, 7874, 7879, 7884, 7889, 7894, \r
+    7899, 7904, 7909, 7914, 0, 0, 7919, 7926, 7929, 7933, 7937, 7940, 7944, \r
+    0, 7948, 7953, 7958, 7963, 7968, 7973, 7978, 7983, 7988, 7992, 7997, \r
+    8002, 8007, 8012, 8017, 8022, 8027, 8032, 8037, 8042, 8047, 8052, 8057, \r
+    8062, 8067, 8072, 8077, 8082, 8086, 8091, 8096, 8101, 8106, 8111, 8116, \r
+    8121, 8126, 8131, 8136, 0, 8143, 8148, 0, 0, 0, 0, 0, 0, 8151, 8156, \r
+    8161, 8166, 8173, 8180, 8185, 8190, 8195, 8200, 8205, 8210, 8215, 8222, \r
+    8227, 8234, 8241, 8246, 8253, 8258, 8263, 8268, 8275, 8280, 8285, 8292, \r
+    8301, 8306, 8311, 8316, 8321, 8327, 8332, 8339, 8346, 8353, 8358, 8363, \r
+    8368, 8373, 8378, 8383, 8393, 8398, 8406, 8411, 8416, 8421, 8426, 8433, \r
+    8440, 8447, 8453, 8459, 8466, 0, 0, 0, 0, 0, 0, 0, 0, 8473, 8477, 8481, \r
+    8485, 8489, 8493, 8497, 8501, 8505, 8509, 8513, 8518, 8522, 8526, 8531, \r
+    8535, 8540, 8544, 8548, 8552, 8557, 8561, 8566, 8570, 8574, 8578, 8582, \r
+    0, 0, 0, 0, 0, 8586, 8593, 8601, 8608, 8613, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 8618, 8621, 8625, 8630, 0, 0, 8634, 8640, 8646, 8649, 8656, 8665, \r
+    8668, 8671, 8676, 8682, 8686, 8694, 8700, 8706, 8714, 8718, 8723, 8734, \r
+    8739, 8743, 8747, 8751, 0, 0, 8754, 8761, 0, 8765, 8769, 8776, 8782, \r
+    8789, 8795, 8801, 8805, 8809, 8815, 8819, 8823, 8827, 8831, 8835, 8839, \r
+    8843, 8847, 8851, 8855, 8859, 8863, 8867, 8871, 8875, 8879, 8883, 8891, \r
+    8899, 8909, 8918, 8927, 8930, 8934, 8938, 8942, 8946, 8950, 8954, 8958, \r
+    8962, 8967, 8971, 8974, 8977, 8980, 8983, 8986, 8989, 8992, 8995, 8999, \r
+    9002, 9005, 9010, 9015, 9021, 9024, 9031, 9040, 9045, 9049, 0, 9056, \r
+    9061, 9065, 9069, 9073, 9077, 9081, 9085, 9089, 9093, 9097, 9101, 9106, \r
+    9111, 9118, 9124, 9130, 9136, 9141, 9149, 9157, 9162, 9168, 9174, 9180, \r
+    9186, 9190, 9194, 9198, 9205, 9215, 9219, 9223, 9227, 9233, 9241, 9245, \r
+    9249, 9256, 9260, 9264, 9268, 9275, 9282, 9294, 9298, 9302, 9306, 9316, \r
+    9325, 9329, 9337, 9344, 9351, 9360, 9371, 9379, 9383, 9392, 9403, 9411, \r
+    9424, 9432, 9440, 9448, 9456, 9462, 9471, 9478, 9482, 9490, 9494, 9501, \r
+    9509, 9513, 9519, 9526, 9533, 9537, 9545, 9549, 9556, 9560, 9568, 9572, \r
+    9580, 9588, 9595, 9603, 9611, 9618, 9624, 9628, 9635, 9643, 9649, 9656, \r
+    9663, 9669, 9678, 9686, 9693, 9699, 9703, 9706, 9710, 9716, 9724, 9728, \r
+    9734, 9740, 9747, 9754, 9757, 9764, 9769, 9777, 9782, 9786, 9799, 9812, \r
+    9818, 9825, 9830, 9836, 9841, 9847, 9857, 9864, 9873, 9883, 9889, 9894, \r
+    9899, 9903, 9907, 9912, 9917, 9923, 9931, 9939, 9950, 9955, 9964, 9973, \r
+    9980, 9986, 9992, 9998, 10004, 10010, 10016, 10022, 10028, 10034, 10041, \r
+    10048, 10055, 10061, 10069, 10078, 10084, 10091, 10098, 10103, 10108, \r
+    10112, 10119, 10126, 10135, 10144, 10147, 10152, 10157, 0, 10162, 10166, \r
+    10170, 10176, 10180, 10184, 10190, 10194, 10202, 10206, 10210, 10214, \r
+    10218, 10222, 10228, 10232, 10238, 10242, 10246, 10250, 10254, 10258, \r
+    10263, 10266, 10270, 10275, 10279, 10283, 10287, 10291, 10295, 10301, \r
+    10307, 10313, 10317, 10321, 10326, 10330, 10334, 10339, 10343, 10347, \r
+    10354, 10361, 10365, 10369, 10374, 10378, 10382, 10385, 10390, 10393, \r
+    10396, 10401, 10406, 10410, 10414, 10420, 10426, 10429, 0, 0, 10432, \r
+    10438, 10444, 10450, 10460, 10472, 10484, 10501, 10513, 10524, 10532, \r
+    10539, 10550, 10565, 10576, 10582, 10591, 10599, 10611, 10621, 10629, \r
+    10641, 10648, 10656, 10668, 10674, 10680, 10688, 10696, 10704, 10710, \r
+    10720, 10727, 10737, 10747, 10760, 10774, 10788, 10798, 10809, 10820, \r
+    10833, 10846, 10860, 10872, 10884, 10897, 10910, 10922, 10935, 10944, \r
+    10952, 10957, 10962, 10967, 10972, 10977, 10982, 10987, 10992, 10997, \r
+    11002, 11007, 11012, 11017, 11022, 11027, 11032, 11037, 11042, 11047, \r
+    11052, 11057, 11062, 11067, 11072, 11077, 11082, 11087, 11092, 11097, \r
+    11102, 11107, 11112, 11116, 11121, 11126, 11131, 11136, 11141, 11145, \r
+    11149, 11153, 11157, 11161, 11165, 11169, 11173, 11177, 11181, 11185, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11190, 11195, 11199, 11203, 11207, \r
+    11211, 11215, 11219, 11223, 11227, 11231, 11235, 11240, 11244, 11248, \r
+    11252, 11257, 11261, 11266, 11270, 11275, 11279, 11284, 11289, 11294, \r
+    11299, 11303, 11308, 11313, 11318, 11323, 11327, 11332, 11339, 11343, \r
+    11348, 11352, 11356, 11361, 11365, 11372, 11379, 11386, 11392, 11400, \r
+    11408, 11417, 11425, 11432, 11439, 11447, 11453, 11459, 11465, 11471, \r
+    11478, 11483, 11487, 11492, 0, 0, 0, 0, 0, 11496, 11500, 11504, 11508, \r
+    11512, 11516, 11520, 11524, 11528, 11532, 11536, 11540, 11544, 11548, \r
+    11552, 11556, 11560, 11564, 11568, 11572, 11576, 11580, 11584, 11588, \r
+    11592, 11596, 11600, 11607, 11613, 11618, 11622, 11629, 11635, 11640, \r
+    11646, 11651, 11655, 11661, 11667, 11672, 11676, 11680, 11685, 11689, \r
+    11693, 11698, 0, 0, 11702, 11707, 11712, 11717, 11722, 11727, 11732, \r
+    11736, 11743, 11748, 11753, 11758, 11763, 11768, 11775, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11780, 11786, \r
+    11790, 11794, 11798, 11803, 11806, 11810, 11813, 11817, 11820, 11824, \r
+    11828, 11832, 11837, 11842, 11845, 11849, 11854, 11859, 11862, 11866, \r
+    11869, 11873, 11877, 11881, 11885, 11889, 11893, 11897, 11901, 11905, \r
+    11909, 11913, 11917, 11921, 11925, 11929, 11933, 11937, 11941, 11944, \r
+    11948, 11951, 11955, 11959, 11963, 11966, 11969, 11972, 11976, 11980, \r
+    11984, 11988, 11992, 11996, 12000, 12004, 0, 0, 12007, 12011, 12015, \r
+    12020, 12024, 12029, 12033, 12038, 12043, 12049, 12055, 12061, 12065, \r
+    12070, 12076, 12082, 12086, 12091, 12095, 0, 12101, 12104, 12110, 12116, \r
+    12121, 12126, 0, 0, 12133, 12137, 12141, 12145, 12149, 12153, 12157, \r
+    12161, 12165, 12170, 12175, 12180, 12186, 12189, 12193, 12197, 12200, \r
+    12203, 12206, 12209, 12212, 12215, 12218, 12221, 12224, 12228, 12235, 0, \r
+    0, 0, 0, 0, 0, 12240, 12244, 12248, 12252, 12256, 12262, 12266, 0, 12270, \r
+    12274, 12278, 0, 12282, 12285, 12289, 12292, 12296, 12299, 12303, 12307, \r
+    0, 0, 12311, 12314, 0, 0, 12318, 12321, 12325, 12328, 12332, 12336, \r
+    12340, 12344, 12348, 12352, 12356, 12360, 12364, 12368, 12372, 12376, \r
+    12380, 12384, 12388, 12392, 12396, 12400, 0, 12403, 12406, 12410, 12414, \r
+    12418, 12421, 12424, 0, 12427, 0, 0, 0, 12431, 12435, 12439, 12443, 0, 0, \r
+    12446, 12450, 12454, 12459, 12463, 12468, 12472, 12477, 12482, 0, 0, \r
+    12488, 12492, 0, 0, 12497, 12501, 12506, 12510, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    12516, 0, 0, 0, 0, 12522, 12526, 0, 12530, 12534, 12539, 12544, 12549, 0, \r
+    0, 12555, 12559, 12562, 12565, 12568, 12571, 12574, 12577, 12580, 12583, \r
+    12586, 12595, 12604, 12608, 12612, 12618, 12624, 12630, 12636, 12650, \r
+    12657, 12660, 0, 0, 0, 0, 0, 12664, 12670, 12674, 0, 12678, 12681, 12685, \r
+    12688, 12692, 12695, 0, 0, 0, 0, 12699, 12703, 0, 0, 12707, 12711, 12715, \r
+    12718, 12722, 12726, 12730, 12734, 12738, 12742, 12746, 12750, 12754, \r
+    12758, 12762, 12766, 12770, 12774, 12778, 12782, 12786, 12790, 0, 12793, \r
+    12796, 12800, 12804, 12808, 12811, 12814, 0, 12817, 12821, 0, 12825, \r
+    12829, 0, 12833, 12837, 0, 0, 12840, 0, 12844, 12849, 12853, 12858, \r
+    12862, 0, 0, 0, 0, 12867, 12872, 0, 0, 12877, 12882, 12887, 0, 0, 0, \r
+    12891, 0, 0, 0, 0, 0, 0, 0, 12895, 12899, 12903, 12907, 0, 12911, 0, 0, \r
+    0, 0, 0, 0, 0, 12915, 12919, 12922, 12925, 12928, 12931, 12934, 12937, \r
+    12940, 12943, 12946, 12949, 12952, 12955, 12958, 12963, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 12967, 12971, 12975, 0, 12979, 12982, 12986, 12989, 12993, \r
+    12996, 13000, 13004, 13008, 0, 13013, 13016, 13020, 0, 13025, 13028, \r
+    13032, 13035, 13039, 13043, 13047, 13051, 13055, 13059, 13063, 13067, \r
+    13071, 13075, 13079, 13083, 13087, 13091, 13095, 13099, 13103, 13107, 0, \r
+    13110, 13113, 13117, 13121, 13125, 13128, 13131, 0, 13134, 13138, 0, \r
+    13142, 13146, 13150, 13154, 13158, 0, 0, 13161, 13165, 13169, 13174, \r
+    13178, 13183, 13187, 13192, 13197, 13203, 0, 13209, 13213, 13218, 0, \r
+    13224, 13228, 13233, 0, 0, 13237, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 13240, 13245, 13250, 13255, 0, 0, 13261, 13265, 13268, 13271, \r
+    13274, 13277, 13280, 13283, 13286, 13289, 0, 13292, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 13296, 13300, 13304, 0, 13308, 13311, 13315, \r
+    13318, 13322, 13325, 13329, 13333, 0, 0, 13337, 13340, 0, 0, 13344, \r
+    13347, 13351, 13354, 13358, 13362, 13366, 13370, 13374, 13378, 13382, \r
+    13386, 13390, 13394, 13398, 13402, 13406, 13410, 13414, 13418, 13422, \r
+    13426, 0, 13429, 13432, 13436, 13440, 13444, 13447, 13450, 0, 13453, \r
+    13457, 0, 13461, 13465, 13469, 13473, 13477, 0, 0, 13480, 13484, 13488, \r
+    13493, 13497, 13502, 13506, 13511, 13516, 0, 0, 13522, 13526, 0, 0, \r
+    13531, 13535, 13540, 0, 0, 0, 0, 0, 0, 0, 0, 13544, 13550, 0, 0, 0, 0, \r
+    13556, 13560, 0, 13564, 13568, 13573, 13578, 13583, 0, 0, 13589, 13593, \r
+    13596, 13599, 13602, 13605, 13608, 13611, 13614, 13617, 13620, 13623, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13627, 13631, 0, 13635, \r
+    13638, 13642, 13645, 13649, 13652, 0, 0, 0, 13656, 13659, 13663, 0, \r
+    13667, 13670, 13674, 13678, 0, 0, 0, 13681, 13685, 0, 13689, 0, 13693, \r
+    13697, 0, 0, 0, 13701, 13705, 0, 0, 0, 13709, 13712, 13716, 0, 0, 0, \r
+    13719, 13722, 13725, 13728, 13732, 13736, 13740, 13744, 13748, 13752, \r
+    13756, 13760, 0, 0, 0, 0, 13763, 13768, 13772, 13777, 13781, 0, 0, 0, \r
+    13786, 13790, 13795, 0, 13800, 13804, 13809, 13814, 0, 0, 13818, 0, 0, 0, \r
+    0, 0, 0, 13821, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13827, 13831, \r
+    13834, 13837, 13840, 13843, 13846, 13849, 13852, 13855, 13858, 13862, \r
+    13867, 13872, 13876, 13880, 13884, 13888, 13892, 13897, 13901, 0, 0, 0, \r
+    0, 0, 0, 13904, 13908, 13912, 0, 13916, 13919, 13923, 13926, 13930, \r
+    13933, 13937, 13941, 0, 13945, 13948, 13952, 0, 13956, 13959, 13963, \r
+    13967, 13970, 13974, 13978, 13982, 13986, 13990, 13994, 13998, 14002, \r
+    14006, 14010, 14014, 14018, 14022, 14026, 14030, 14034, 14038, 14042, 0, \r
+    14045, 14048, 14052, 14056, 14060, 14063, 14066, 14069, 14073, 14077, 0, \r
+    14081, 14085, 14089, 14093, 14097, 0, 0, 0, 14100, 14104, 14109, 14113, \r
+    14118, 14122, 14127, 14132, 0, 14138, 14142, 14147, 0, 14152, 14156, \r
+    14161, 14166, 0, 0, 0, 0, 0, 0, 0, 14170, 14174, 0, 14180, 14184, 0, 0, \r
+    0, 0, 0, 0, 14188, 14193, 14198, 14203, 0, 0, 14209, 14213, 14216, 14219, \r
+    14222, 14225, 14228, 14231, 14234, 14237, 0, 0, 0, 0, 0, 0, 0, 0, 14240, \r
+    14253, 14265, 14277, 14289, 14301, 14313, 14325, 0, 0, 14329, 14333, 0, \r
+    14337, 14340, 14344, 14347, 14351, 14354, 14358, 14362, 0, 14366, 14369, \r
+    14373, 0, 14377, 14380, 14384, 14388, 14391, 14395, 14399, 14403, 14407, \r
+    14411, 14415, 14419, 14423, 14427, 14431, 14435, 14439, 14443, 14447, \r
+    14451, 14455, 14459, 14463, 0, 14466, 14469, 14473, 14477, 14481, 14484, \r
+    14487, 14490, 14494, 14498, 0, 14502, 14506, 14510, 14514, 14518, 0, 0, \r
+    14521, 14525, 14529, 14534, 14538, 14543, 14547, 14552, 14557, 0, 14563, \r
+    14567, 14572, 0, 14577, 14581, 14586, 14591, 0, 0, 0, 0, 0, 0, 0, 14595, \r
+    14599, 0, 0, 0, 0, 0, 0, 0, 14605, 0, 14609, 14614, 14619, 14624, 0, 0, \r
+    14630, 14634, 14637, 14640, 14643, 14646, 14649, 14652, 14655, 14658, 0, \r
+    14661, 14665, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14669, 14673, \r
+    0, 14677, 14680, 14684, 14687, 14691, 14694, 14698, 14702, 0, 14706, \r
+    14709, 14713, 0, 14717, 14720, 14724, 14728, 14731, 14735, 14739, 14743, \r
+    14747, 14751, 14755, 14759, 14763, 14767, 14771, 14775, 14779, 14783, \r
+    14787, 14791, 14795, 14799, 14803, 0, 14806, 14809, 14813, 14817, 14821, \r
+    14824, 14827, 14830, 14834, 14838, 14842, 14846, 14850, 14854, 14858, \r
+    14862, 0, 0, 0, 14865, 14869, 14874, 14878, 14883, 14887, 14892, 14897, \r
+    0, 14903, 14907, 14912, 0, 14917, 14921, 14926, 14931, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 14935, 0, 0, 0, 0, 0, 0, 0, 0, 14941, 14946, 14951, 14956, 0, 0, \r
+    14962, 14966, 14969, 14972, 14975, 14978, 14981, 14984, 14987, 14990, \r
+    14993, 14997, 15002, 15007, 15013, 15019, 0, 0, 0, 15025, 15029, 15035, \r
+    15040, 15046, 15051, 15057, 0, 0, 15063, 15067, 0, 15071, 15075, 15079, \r
+    15083, 15087, 15091, 15095, 15099, 15103, 15107, 15111, 15115, 15119, \r
+    15123, 15127, 15131, 15135, 15139, 0, 0, 0, 15143, 15149, 15155, 15161, \r
+    15167, 15173, 15179, 15185, 15191, 15197, 15203, 15209, 15217, 15223, \r
+    15229, 15235, 15241, 15247, 15253, 15259, 15265, 15271, 15277, 15283, 0, \r
+    15289, 15295, 15301, 15307, 15313, 15319, 15323, 15329, 15333, 0, 15337, \r
+    0, 0, 15343, 15347, 15353, 15359, 15365, 15369, 15375, 0, 0, 0, 15379, 0, \r
+    0, 0, 0, 15383, 15388, 15395, 15402, 15409, 15416, 0, 15423, 0, 15430, \r
+    15435, 15440, 15447, 15454, 15463, 15474, 15483, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15488, 15495, 15502, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 15507, 15513, 15519, 15525, 15531, 15537, 15543, 15549, \r
+    15555, 15561, 15567, 15573, 15579, 15585, 15591, 15596, 15602, 15608, \r
+    15614, 15620, 15626, 15631, 15637, 15643, 15649, 15655, 15661, 15667, \r
+    15673, 15679, 15685, 15691, 15697, 15702, 15708, 15714, 15718, 15724, \r
+    15728, 15734, 15740, 15746, 15752, 15758, 15764, 15769, 15775, 15779, \r
+    15784, 15790, 15796, 15802, 15807, 15813, 15819, 15825, 15830, 15836, 0, \r
+    0, 0, 0, 15840, 15846, 15851, 15857, 15862, 15870, 15878, 15882, 15886, \r
+    15890, 15896, 15902, 15908, 15914, 15918, 15922, 15926, 15930, 15934, \r
+    15937, 15940, 15943, 15946, 15949, 15952, 15955, 15958, 15961, 15965, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15969, 15973, 0, 15979, 0, 0, 15985, \r
+    15989, 0, 15993, 0, 0, 15999, 0, 0, 0, 0, 0, 0, 16003, 16007, 16010, \r
+    16016, 0, 16022, 16026, 16030, 16034, 16040, 16046, 16052, 0, 16058, \r
+    16062, 16066, 0, 16072, 0, 16078, 0, 0, 16082, 16088, 0, 16094, 16097, \r
+    16103, 16106, 16110, 16117, 16122, 16127, 16131, 16136, 16141, 16146, \r
+    16150, 0, 16155, 16162, 16168, 0, 0, 16174, 16178, 16183, 16187, 16192, \r
+    0, 16197, 0, 16202, 16208, 16214, 16220, 16226, 16230, 0, 0, 16233, \r
+    16237, 16240, 16243, 16246, 16249, 16252, 16255, 16258, 16261, 0, 0, \r
+    16264, 16269, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16274, 16278, 16289, 16304, \r
+    16319, 16329, 16340, 16353, 16364, 16370, 16378, 16388, 16394, 16402, \r
+    16406, 16412, 16418, 16426, 16436, 16444, 16457, 16463, 16471, 16479, \r
+    16491, 16498, 16506, 16514, 16522, 16530, 16538, 16546, 16556, 16560, \r
+    16563, 16566, 16569, 16572, 16575, 16578, 16581, 16584, 16587, 16591, \r
+    16595, 16599, 16603, 16607, 16611, 16615, 16619, 16623, 16628, 16634, \r
+    16644, 16658, 16668, 16674, 16680, 16688, 16696, 16704, 16712, 16718, \r
+    16724, 16727, 16731, 16735, 16739, 16743, 16747, 16751, 0, 16755, 16759, \r
+    16763, 16767, 16771, 16775, 16779, 16783, 16787, 16791, 16795, 16798, \r
+    16801, 16805, 16809, 16813, 16816, 16820, 16824, 16828, 16832, 16836, \r
+    16840, 16844, 16848, 16851, 16854, 16858, 16862, 16866, 16870, 16873, \r
+    16876, 16880, 16885, 16889, 0, 0, 0, 0, 16893, 16898, 16902, 16907, \r
+    16911, 16916, 16921, 16927, 16932, 16938, 16942, 16947, 16951, 16956, \r
+    16966, 16972, 16977, 16983, 16993, 16999, 17003, 17007, 17013, 17019, \r
+    17027, 17033, 17041, 0, 0, 0, 0, 17049, 17054, 17060, 17066, 17072, \r
+    17078, 17084, 17090, 0, 17096, 17102, 17108, 17114, 17120, 17126, 17132, \r
+    17138, 17144, 17150, 17156, 17161, 17166, 17172, 17178, 17184, 17189, \r
+    17195, 17201, 17207, 17213, 17219, 17225, 17231, 17237, 17242, 17247, \r
+    17253, 17259, 17265, 17271, 17276, 17281, 17287, 17295, 17302, 0, 17309, \r
+    17316, 17329, 17336, 17343, 17351, 17359, 17365, 17371, 17377, 17387, \r
+    17392, 17398, 17408, 17418, 0, 17428, 17438, 17446, 17458, 17470, 17476, \r
+    17490, 17505, 17510, 17515, 17523, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 17531, 17534, 17538, 17542, 17546, 17550, 17554, 17558, 17562, \r
+    17566, 17570, 17574, 17578, 17582, 17586, 17590, 17594, 17598, 17602, \r
+    17606, 17610, 17613, 17616, 17620, 17624, 17628, 17631, 17634, 17637, \r
+    17641, 17645, 17649, 17652, 17656, 17659, 17664, 17667, 17671, 17674, \r
+    17678, 17681, 17686, 17689, 17693, 17700, 17705, 17709, 17714, 17718, \r
+    17723, 17727, 17732, 17739, 17745, 17750, 17754, 17758, 17762, 17766, \r
+    17770, 17776, 17782, 17789, 17795, 17801, 17805, 17808, 17811, 17814, \r
+    17817, 17820, 17823, 17826, 17829, 17832, 17838, 17842, 17846, 17850, \r
+    17854, 17858, 17862, 17866, 17870, 17875, 17879, 17884, 17889, 17895, \r
+    17900, 17906, 17912, 17918, 17924, 17930, 17938, 17946, 17955, 17963, \r
+    17972, 17981, 17992, 18002, 18012, 18023, 18034, 18044, 18054, 18064, \r
+    18074, 18084, 18094, 18104, 18114, 18122, 18129, 18135, 18142, 18147, \r
+    18153, 18159, 18165, 18171, 18177, 18183, 18188, 18194, 18200, 18206, \r
+    18212, 18217, 18226, 18233, 18239, 18246, 18254, 18260, 18266, 18272, \r
+    18278, 18286, 18294, 18304, 18312, 18320, 18326, 18331, 18336, 18341, \r
+    18346, 18351, 18356, 18361, 18366, 18371, 18377, 18383, 18389, 18396, \r
+    18401, 18407, 18412, 18417, 18422, 18427, 18432, 18437, 18442, 18447, \r
+    18452, 18457, 18462, 18467, 18472, 18477, 18482, 18487, 18492, 18497, \r
+    18502, 18507, 18512, 18517, 18522, 18527, 18532, 18537, 18542, 18547, \r
+    18552, 18557, 18562, 18567, 18572, 18577, 18582, 18587, 18592, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 18597, 18601, 18605, 18609, 18613, 18617, 18621, \r
+    18625, 18629, 18633, 18637, 18641, 18645, 18649, 18653, 18657, 18661, \r
+    18665, 18669, 18673, 18677, 18681, 18685, 18689, 18693, 18697, 18701, \r
+    18705, 18709, 18713, 18717, 18721, 18725, 18729, 18733, 18737, 18741, \r
+    18745, 18749, 18753, 18757, 18761, 18766, 18770, 18775, 0, 0, 0, 18780, \r
+    18784, 18788, 18792, 18796, 18800, 18804, 18808, 18812, 18816, 18820, \r
+    18824, 18828, 18832, 18836, 18840, 18844, 18848, 18852, 18856, 18860, \r
+    18864, 18868, 18872, 18876, 18880, 18884, 18888, 18892, 18896, 18900, \r
+    18904, 18908, 18912, 18916, 18920, 18924, 18928, 18932, 18936, 18940, \r
+    18944, 18948, 18952, 18956, 18960, 18964, 18968, 18972, 18976, 18980, \r
+    18984, 18988, 18992, 18996, 19000, 19004, 19008, 19012, 19016, 19020, \r
+    19024, 19028, 19032, 19036, 19040, 19044, 19048, 19052, 19056, 19060, \r
+    19064, 19068, 19072, 19076, 19080, 19084, 19088, 19092, 19096, 19100, \r
+    19104, 19108, 19112, 19116, 19120, 19124, 19128, 19132, 19136, 19140, \r
+    19144, 19148, 19152, 19156, 19160, 19164, 19168, 19171, 19175, 19178, \r
+    19182, 19186, 19189, 19193, 19197, 19200, 19204, 19208, 19212, 19216, \r
+    19219, 19223, 19227, 19231, 19235, 19239, 19243, 19246, 19250, 19254, \r
+    19258, 19262, 19266, 19270, 19274, 19278, 19282, 19286, 19290, 19294, \r
+    19298, 19302, 19306, 19310, 19314, 19318, 19322, 19326, 19330, 19334, \r
+    19338, 19342, 19346, 19350, 19354, 19358, 19362, 19366, 19370, 19374, \r
+    19378, 19382, 19386, 19390, 19394, 19398, 19402, 19406, 19410, 19414, \r
+    19418, 19422, 19426, 19430, 19434, 19438, 19442, 19446, 19450, 19454, \r
+    19458, 19462, 19466, 19470, 19474, 19478, 19482, 19486, 19490, 19494, \r
+    19498, 19502, 19506, 19510, 19514, 19518, 19522, 19526, 19530, 19534, \r
+    19538, 19542, 19546, 19550, 19554, 19558, 19562, 19566, 19570, 19574, \r
+    19578, 19582, 19586, 19590, 19594, 19598, 19602, 19606, 19610, 19614, \r
+    19618, 19622, 19626, 19630, 19634, 19638, 19642, 19646, 19650, 19654, \r
+    19658, 19662, 19666, 19670, 19674, 19678, 19682, 19686, 19690, 19694, \r
+    19698, 19702, 19706, 19710, 19714, 19718, 19722, 19726, 19730, 19734, \r
+    19738, 19742, 19746, 19750, 19754, 19758, 19762, 19766, 19770, 19774, \r
+    19778, 19782, 19786, 19790, 19794, 19798, 19801, 19805, 19809, 19813, \r
+    19817, 19821, 19825, 19829, 19833, 19837, 19841, 19845, 19849, 19853, \r
+    19857, 19861, 19865, 19869, 19873, 19877, 19881, 19885, 19889, 19893, \r
+    19896, 19900, 19904, 19908, 19912, 19916, 19920, 19924, 19928, 19932, \r
+    19936, 19940, 19944, 19948, 19952, 19956, 19959, 19963, 19967, 19971, \r
+    19975, 19979, 19983, 19987, 19991, 19995, 19999, 20003, 20007, 20011, \r
+    20015, 20019, 20023, 20027, 20031, 20035, 20039, 20043, 20047, 20051, \r
+    20055, 20059, 20063, 20067, 20071, 20075, 20079, 20083, 0, 20087, 20091, \r
+    20095, 20099, 0, 0, 20103, 20107, 20111, 20115, 20119, 20123, 20127, 0, \r
+    20131, 0, 20135, 20139, 20143, 20147, 0, 0, 20151, 20155, 20159, 20163, \r
+    20167, 20171, 20175, 20179, 20183, 20187, 20191, 20195, 20199, 20203, \r
+    20207, 20211, 20215, 20219, 20223, 20227, 20231, 20235, 20239, 20242, \r
+    20246, 20250, 20254, 20258, 20262, 20266, 20270, 20274, 20278, 20282, \r
+    20286, 20290, 20294, 20298, 20302, 20306, 20310, 0, 20314, 20318, 20322, \r
+    20326, 0, 0, 20330, 20333, 20337, 20341, 20345, 20349, 20353, 20357, \r
+    20361, 20365, 20369, 20373, 20377, 20381, 20385, 20389, 20393, 20398, \r
+    20403, 20408, 20414, 20420, 20425, 20430, 20436, 20439, 20443, 20447, \r
+    20451, 20455, 20459, 20463, 20467, 0, 20471, 20475, 20479, 20483, 0, 0, \r
+    20487, 20491, 20495, 20499, 20503, 20507, 20511, 0, 20515, 0, 20519, \r
+    20523, 20527, 20531, 0, 0, 20535, 20539, 20543, 20547, 20551, 20555, \r
+    20559, 20563, 20567, 20572, 20577, 20582, 20588, 20594, 20599, 0, 20604, \r
+    20608, 20612, 20616, 20620, 20624, 20628, 20632, 20636, 20640, 20644, \r
+    20648, 20652, 20656, 20660, 20664, 20668, 20671, 20675, 20679, 20683, \r
+    20687, 20691, 20695, 20699, 20703, 20707, 20711, 20715, 20719, 20723, \r
+    20727, 20731, 20735, 20739, 20743, 20747, 20751, 20755, 20759, 20763, \r
+    20767, 20771, 20775, 20779, 20783, 20787, 20791, 20795, 20799, 20803, \r
+    20807, 20811, 20815, 20819, 20823, 20827, 0, 20831, 20835, 20839, 20843, \r
+    0, 0, 20847, 20851, 20855, 20859, 20863, 20867, 20871, 20875, 20879, \r
+    20883, 20887, 20891, 20895, 20899, 20903, 20907, 20911, 20915, 20919, \r
+    20923, 20927, 20931, 20935, 20939, 20943, 20947, 20951, 20955, 20959, \r
+    20963, 20967, 20971, 20975, 20979, 20983, 20987, 20991, 20995, 20999, \r
+    21003, 21007, 21011, 21015, 21019, 21023, 21027, 21031, 21035, 21039, \r
+    21043, 21047, 21051, 21055, 21059, 21063, 21067, 21071, 21074, 21078, \r
+    21082, 21086, 21090, 21094, 21098, 21102, 21106, 21110, 0, 0, 0, 0, \r
+    21114, 21119, 21123, 21126, 21131, 21134, 21137, 21140, 21145, 21149, \r
+    21154, 21157, 21160, 21163, 21166, 21169, 21172, 21175, 21178, 21181, \r
+    21185, 21189, 21193, 21197, 21201, 21205, 21209, 21213, 21217, 21221, 0, \r
+    0, 0, 21227, 21233, 21237, 21241, 21245, 21251, 21255, 21259, 21263, \r
+    21269, 21273, 21277, 21281, 21287, 21291, 21295, 21299, 21305, 21311, \r
+    21317, 21325, 21331, 21337, 21343, 21349, 21355, 0, 0, 0, 0, 0, 0, 21361, \r
+    21364, 21367, 21370, 21373, 21376, 21380, 21384, 21387, 21391, 21395, \r
+    21399, 21403, 21407, 21410, 21414, 21418, 21422, 21426, 21430, 21434, \r
+    21438, 21442, 21446, 21450, 21454, 21457, 21461, 21465, 21469, 21473, \r
+    21476, 21480, 21484, 21488, 21492, 21496, 21500, 21504, 21508, 21512, \r
+    21516, 21520, 21524, 21528, 21532, 21535, 21539, 21543, 21547, 21551, \r
+    21555, 21559, 21563, 21567, 21571, 21575, 21579, 21583, 21587, 21591, \r
+    21595, 21599, 21603, 21607, 21611, 21615, 21619, 21623, 21627, 21631, \r
+    21635, 21639, 21643, 21647, 21651, 21655, 21659, 21663, 21667, 21670, \r
+    21674, 21678, 21682, 21686, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21690, \r
+    21694, 21697, 21701, 21704, 21708, 21711, 21715, 21721, 21726, 21730, \r
+    21733, 21737, 21741, 21746, 21750, 21755, 21759, 21764, 21768, 21773, \r
+    21777, 21782, 21788, 21792, 21797, 21801, 21806, 21812, 21816, 21822, \r
+    21828, 21832, 21837, 21845, 21853, 21860, 21865, 21870, 21879, 21886, \r
+    21893, 21898, 21904, 21908, 21912, 21916, 21920, 21924, 21928, 21932, \r
+    21936, 21940, 21944, 21950, 21955, 21960, 21963, 21967, 21971, 21976, \r
+    21980, 21985, 21989, 21994, 21998, 22003, 22007, 22012, 22016, 22021, \r
+    22025, 22030, 22036, 22040, 22045, 22050, 22054, 22058, 22062, 22066, \r
+    22069, 22073, 22079, 22084, 22089, 22093, 22097, 22101, 22106, 22110, \r
+    22115, 22119, 22124, 22127, 22131, 22135, 22140, 22144, 22149, 22153, \r
+    22158, 22164, 22168, 22172, 22176, 22180, 22184, 22188, 22192, 22196, \r
+    22200, 22204, 22208, 22214, 22217, 22221, 22225, 22230, 22234, 22239, \r
+    22243, 22248, 22252, 22257, 22261, 22266, 22270, 22275, 22279, 22284, \r
+    22290, 22294, 22298, 22304, 22310, 22316, 22322, 22326, 22330, 22334, \r
+    22338, 22342, 22346, 22352, 22356, 22360, 22364, 22369, 22373, 22378, \r
+    22382, 22387, 22391, 22396, 22400, 22405, 22409, 22414, 22418, 22423, \r
+    22429, 22433, 22439, 22443, 22447, 22451, 22455, 22459, 22463, 22469, \r
+    22472, 22476, 22480, 22485, 22489, 22494, 22498, 22503, 22507, 22512, \r
+    22516, 22521, 22525, 22530, 22534, 22539, 22545, 22548, 22552, 22556, \r
+    22561, 22566, 22570, 22574, 22578, 22582, 22586, 22590, 22596, 22599, \r
+    22603, 22607, 22612, 22616, 22621, 22625, 22630, 22636, 22639, 22644, \r
+    22648, 22652, 22656, 22660, 22664, 22668, 22672, 22678, 22682, 22686, \r
+    22690, 22695, 22699, 22704, 22708, 22713, 22717, 22722, 22726, 22731, \r
+    22735, 22740, 22744, 22749, 22752, 22756, 22760, 22764, 22768, 22772, \r
+    22776, 22780, 22784, 22790, 22794, 22798, 22802, 22807, 22811, 22816, \r
+    22820, 22825, 22829, 22834, 22838, 22843, 22847, 22852, 22856, 22861, \r
+    22867, 22870, 22875, 22879, 22884, 22890, 22896, 22902, 22908, 22914, \r
+    22920, 22926, 22930, 22934, 22938, 22942, 22946, 22950, 22954, 22958, \r
+    22963, 22967, 22972, 22976, 22981, 22985, 22990, 22994, 22999, 23003, \r
+    23008, 23012, 23017, 23021, 23025, 23029, 23033, 23037, 23041, 23045, \r
+    23051, 23054, 23058, 23062, 23067, 23071, 23076, 23080, 23085, 23089, \r
+    23094, 23098, 23103, 23107, 23112, 23116, 23121, 23127, 23131, 23137, \r
+    23142, 23148, 23152, 23158, 23163, 23167, 23171, 23175, 23179, 23183, \r
+    23188, 23191, 23195, 23200, 23204, 23209, 23212, 23216, 23220, 23224, \r
+    23228, 23232, 23236, 23240, 23244, 23248, 23252, 23256, 23261, 23265, \r
+    23269, 23275, 23279, 23285, 23289, 23295, 23299, 23303, 23307, 23311, \r
+    23315, 23320, 23324, 23328, 23332, 23336, 23340, 23344, 23348, 23352, \r
+    23356, 23360, 23366, 23372, 23378, 23384, 23390, 23395, 23401, 23407, \r
+    23413, 23417, 23421, 23425, 23429, 23433, 23437, 23441, 23445, 23449, \r
+    23453, 23457, 23461, 23465, 23470, 23475, 23480, 23484, 23488, 23492, \r
+    23496, 23500, 23504, 23508, 23512, 23516, 23520, 23526, 23532, 23538, \r
+    23544, 23550, 23556, 23562, 23568, 23574, 23578, 23582, 23586, 23590, \r
+    23594, 23598, 23602, 23608, 23614, 23620, 23626, 23632, 23638, 23644, \r
+    23650, 23656, 23661, 23666, 23671, 23676, 23682, 23688, 23694, 23700, \r
+    23706, 23712, 23718, 23723, 23729, 23735, 23741, 23746, 23752, 23758, \r
+    23764, 23769, 23774, 23779, 23784, 23789, 23794, 23799, 23804, 23809, \r
+    23814, 23819, 23824, 23828, 23833, 23838, 23843, 23848, 23853, 23858, \r
+    23863, 23868, 23873, 23878, 23883, 23888, 23893, 23898, 23903, 23908, \r
+    23913, 23918, 23923, 23928, 23933, 23938, 23943, 23948, 23953, 23958, \r
+    23963, 23968, 23973, 23977, 23982, 23987, 23992, 23997, 24002, 24007, \r
+    24012, 24017, 24022, 24027, 24032, 24037, 24042, 24047, 24052, 24057, \r
+    24062, 24067, 24072, 24077, 24082, 24087, 24092, 24097, 24102, 24106, \r
+    24111, 24116, 24121, 24126, 24131, 24135, 24140, 24145, 24150, 24155, \r
+    24160, 24164, 24169, 24175, 24180, 24185, 24190, 24195, 24201, 24206, \r
+    24211, 24216, 24221, 24226, 24231, 24236, 24241, 24246, 24251, 24256, \r
+    24261, 24266, 24271, 24276, 24281, 24286, 24291, 24296, 24301, 24306, \r
+    24311, 24316, 24321, 24326, 24331, 24336, 24341, 24346, 24351, 24356, \r
+    24361, 24366, 24371, 24376, 24381, 24386, 24391, 24396, 24401, 24406, \r
+    24411, 24416, 24421, 24427, 24432, 24437, 24442, 24447, 24452, 24457, \r
+    24462, 24467, 24472, 24477, 24482, 24487, 24492, 24497, 24502, 24507, \r
+    24512, 24517, 24522, 24527, 24532, 24537, 24542, 24547, 24552, 24557, \r
+    24562, 24567, 24572, 24577, 24582, 24587, 24592, 24597, 24602, 24607, \r
+    24612, 24617, 24623, 24627, 24631, 24635, 24639, 24643, 24647, 24651, \r
+    24655, 24661, 24667, 24673, 24679, 24685, 24691, 24697, 24704, 24710, \r
+    24715, 24720, 24725, 24730, 24735, 24740, 24745, 24750, 24755, 24760, \r
+    24765, 24770, 24775, 24780, 24785, 24790, 24795, 24800, 24805, 24810, \r
+    24815, 24820, 24825, 24830, 24835, 24840, 24845, 24850, 0, 0, 0, 24856, \r
+    24866, 24870, 24877, 24881, 24885, 24889, 24897, 24901, 24906, 24911, \r
+    24916, 24920, 24925, 24930, 24933, 24937, 24941, 24950, 24954, 24958, \r
+    24964, 24968, 24972, 24980, 24984, 24992, 24998, 25004, 25010, 25016, \r
+    25025, 25030, 25034, 25043, 25046, 25052, 25056, 25062, 25067, 25073, \r
+    25081, 25087, 25092, 25099, 25104, 25108, 25112, 25122, 25128, 25132, \r
+    25142, 25148, 25152, 25156, 25163, 25170, 25175, 25180, 25189, 25193, \r
+    25197, 25201, 25209, 25216, 25220, 25224, 25228, 25232, 25236, 25240, \r
+    25244, 25248, 25252, 25256, 25260, 25265, 25270, 25275, 25279, 25283, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25287, 25291, 25295, 25299, \r
+    25303, 25308, 25313, 25318, 25323, 25327, 25331, 25336, 25340, 0, 25344, \r
+    25349, 25354, 25359, 25363, 25368, 25373, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 25378, 25382, 25386, 25390, 25394, 25399, 25404, 25409, 25414, 25418, \r
+    25422, 25427, 25431, 25435, 25439, 25444, 25449, 25454, 25458, 25463, \r
+    25468, 25473, 25479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25484, 25488, 25492, \r
+    25496, 25500, 25505, 25510, 25515, 25520, 25524, 25528, 25533, 25537, \r
+    25541, 25545, 25550, 25555, 25560, 25564, 25569, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 25574, 25578, 25582, 25586, 25590, 25595, 25600, 25605, \r
+    25610, 25614, 25618, 25623, 25627, 0, 25631, 25636, 25641, 0, 25646, \r
+    25651, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25656, 25659, 25663, 25667, \r
+    25671, 25675, 25679, 25683, 25687, 25691, 25695, 25699, 25703, 25707, \r
+    25711, 25715, 25719, 25723, 25726, 25730, 25734, 25738, 25742, 25746, \r
+    25750, 25754, 25758, 25762, 25766, 25770, 25774, 25778, 25782, 25785, \r
+    25789, 25793, 25799, 25805, 25811, 25817, 25823, 25829, 25835, 25841, \r
+    25847, 25853, 25859, 25865, 25871, 25877, 25886, 25895, 25901, 25907, \r
+    25913, 25918, 25922, 25927, 25932, 25937, 25941, 25946, 25951, 25956, \r
+    25960, 25965, 25969, 25974, 25979, 25984, 25989, 25993, 25997, 26001, \r
+    26005, 26009, 26013, 26017, 26021, 26025, 26029, 26035, 26039, 26043, \r
+    26047, 26051, 26055, 26063, 26069, 26073, 26079, 26083, 26089, 26093, 0, \r
+    0, 26097, 26101, 26104, 26107, 26110, 26113, 26116, 26119, 26122, 26125, \r
+    0, 0, 0, 0, 0, 0, 26128, 26136, 26144, 26152, 26160, 26168, 26176, 26184, \r
+    26192, 26200, 0, 0, 0, 0, 0, 0, 26208, 26211, 26214, 26217, 26222, 26225, \r
+    26230, 26237, 26245, 26250, 26257, 26260, 26267, 26274, 26281, 0, 26285, \r
+    26289, 26292, 26295, 26298, 26301, 26304, 26307, 26310, 26313, 0, 0, 0, \r
+    0, 0, 0, 26316, 26319, 26322, 26325, 26328, 26331, 26335, 26339, 26343, \r
+    26346, 26350, 26354, 26357, 26361, 26365, 26368, 26372, 26376, 26380, \r
+    26384, 26388, 26392, 26396, 26399, 26402, 26406, 26410, 26413, 26417, \r
+    26421, 26425, 26429, 26433, 26437, 26441, 26445, 26452, 26457, 26462, \r
+    26467, 26472, 26478, 26484, 26490, 26496, 26501, 26507, 26513, 26518, \r
+    26524, 26530, 26536, 26542, 26548, 26553, 26559, 26564, 26570, 26576, \r
+    26582, 26588, 26594, 26599, 26604, 26610, 26616, 26621, 26627, 26632, \r
+    26638, 26643, 26648, 26654, 26660, 26666, 26672, 26678, 26684, 26690, \r
+    26696, 26702, 26708, 26714, 26720, 26725, 26730, 26735, 26741, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 26747, 26756, 26765, 26773, 26781, 26791, 26799, 26808, \r
+    26815, 26822, 26829, 26837, 26845, 26853, 26861, 26869, 26877, 26885, \r
+    26893, 26900, 26908, 26916, 26924, 26932, 26940, 26950, 26960, 26970, \r
+    26980, 26990, 27000, 27010, 27020, 27030, 27040, 27050, 27060, 27070, \r
+    27080, 27088, 27096, 27106, 27114, 0, 0, 0, 0, 0, 27124, 27128, 27132, \r
+    27136, 27140, 27144, 27148, 27152, 27156, 27160, 27164, 27168, 27172, \r
+    27176, 27180, 27184, 27188, 27192, 27196, 27200, 27204, 27208, 27212, \r
+    27216, 27222, 27226, 27232, 27236, 27242, 27246, 27252, 27256, 27260, \r
+    27264, 27268, 27272, 27276, 27282, 27288, 27294, 27300, 27305, 27310, \r
+    27315, 27321, 27327, 27333, 27339, 27346, 27352, 27357, 27362, 27366, \r
+    27370, 27374, 27378, 27382, 27386, 27390, 27396, 27402, 27408, 27413, \r
+    27420, 27425, 27430, 27436, 27441, 27448, 27455, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 27461, 27466, 27469, 27473, 27477, 27481, 27485, 27489, 27493, \r
+    27497, 27501, 27505, 27509, 27513, 27517, 27521, 27524, 27527, 27531, \r
+    27535, 27539, 27542, 27545, 27548, 27552, 27556, 27560, 27564, 27568, 0, \r
+    0, 0, 27571, 27575, 27579, 27583, 27588, 27593, 27598, 27603, 27607, \r
+    27611, 27616, 27621, 0, 0, 0, 0, 27627, 27631, 27636, 27641, 27646, \r
+    27650, 27654, 27658, 27662, 27667, 27671, 27675, 0, 0, 0, 0, 27679, 0, 0, \r
+    0, 27683, 27687, 27691, 27695, 27698, 27701, 27704, 27707, 27710, 27713, \r
+    27716, 27719, 27722, 27727, 27733, 27739, 27745, 27751, 27756, 27762, \r
+    27768, 27774, 27779, 27785, 27790, 27796, 27802, 27807, 27813, 27819, \r
+    27825, 27830, 27835, 27840, 27846, 27852, 27857, 27863, 27868, 27874, \r
+    27879, 27885, 0, 0, 27891, 27897, 27903, 27909, 27915, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 27921, 27928, 27935, 27941, 27948, 27955, 27961, 27968, \r
+    27975, 27982, 27989, 27995, 28002, 28009, 28015, 28022, 28029, 28035, \r
+    28042, 28049, 28055, 28061, 28068, 28074, 28080, 28087, 28093, 28100, \r
+    28107, 28114, 28121, 28128, 28135, 28141, 28148, 28155, 28161, 28168, \r
+    28175, 28182, 28189, 28196, 28203, 28210, 0, 0, 0, 0, 28217, 28225, \r
+    28232, 28239, 28245, 28252, 28258, 28265, 28271, 28278, 28285, 28292, \r
+    28299, 28306, 28313, 28320, 28327, 28334, 28341, 28348, 28354, 28360, \r
+    28367, 28374, 28381, 28387, 0, 0, 0, 0, 0, 0, 28393, 28399, 28404, 28409, \r
+    28414, 28419, 28424, 28429, 28434, 28439, 28444, 0, 0, 0, 28450, 28456, \r
+    28462, 28466, 28472, 28478, 28484, 28490, 28496, 28502, 28508, 28514, \r
+    28520, 28526, 28532, 28538, 28544, 28550, 28556, 28560, 28566, 28572, \r
+    28578, 28584, 28590, 28596, 28602, 28608, 28614, 28620, 28626, 28632, \r
+    28638, 28644, 28650, 28654, 28659, 28664, 28669, 28673, 28678, 28682, \r
+    28687, 28692, 28697, 28701, 28706, 28711, 28716, 28721, 28726, 28730, \r
+    28734, 28739, 28744, 28749, 28753, 28757, 28762, 28767, 28772, 28777, 0, \r
+    0, 28783, 28787, 28794, 28799, 28805, 28811, 28816, 28822, 28828, 28833, \r
+    28839, 28845, 28851, 28857, 28863, 28868, 28873, 28879, 28884, 28890, \r
+    28895, 28901, 28907, 28913, 28919, 28923, 28928, 28933, 28939, 28945, \r
+    28950, 28956, 28962, 28966, 28971, 28976, 28980, 28985, 28990, 28995, \r
+    29000, 29006, 29012, 29018, 29023, 29028, 29032, 29037, 29041, 29046, \r
+    29050, 29055, 29060, 29065, 29070, 29077, 29084, 29092, 29103, 29112, \r
+    29120, 29127, 29138, 29144, 29151, 0, 29158, 29163, 29168, 29176, 29182, \r
+    29190, 29195, 29201, 29207, 29213, 29218, 29224, 29229, 29236, 29242, \r
+    29247, 29253, 29259, 29265, 29272, 29279, 29286, 29291, 29296, 29303, \r
+    29310, 29317, 29324, 29331, 0, 0, 29338, 29345, 29352, 29358, 29364, \r
+    29370, 29376, 29382, 29388, 29394, 29400, 0, 0, 0, 0, 0, 0, 29406, 29412, \r
+    29417, 29422, 29427, 29432, 29437, 29442, 29447, 29452, 0, 0, 0, 0, 0, 0, \r
+    29457, 29462, 29467, 29472, 29477, 29482, 29487, 29495, 29502, 29507, \r
+    29512, 29517, 29522, 29527, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29532, 29538, \r
+    29544, 29548, 29552, 29556, 29560, 29566, 29570, 29576, 29580, 29586, \r
+    29592, 29600, 29606, 29614, 29618, 29622, 29626, 29632, 29635, 29640, \r
+    29644, 29650, 29654, 29658, 29664, 29668, 29674, 29678, 29684, 29692, \r
+    29700, 29708, 29714, 29718, 29724, 29728, 29734, 29737, 29740, 29746, \r
+    29750, 29756, 29759, 29762, 29765, 29769, 29773, 29779, 29785, 29789, \r
+    29792, 29796, 29801, 29806, 29813, 29818, 29825, 29832, 29841, 29848, \r
+    29857, 29862, 29869, 29876, 29885, 29890, 29897, 29902, 29908, 29914, \r
+    29920, 29926, 29932, 29938, 0, 0, 0, 0, 29944, 29948, 29951, 29954, \r
+    29957, 29960, 29963, 29966, 29969, 29972, 29975, 29978, 29981, 29984, \r
+    29989, 29994, 29999, 30002, 30007, 30012, 30017, 30022, 30029, 30034, \r
+    30039, 30044, 30049, 30056, 30062, 30068, 30074, 30080, 30086, 30095, \r
+    30104, 30110, 30116, 30125, 30134, 30143, 30152, 30161, 30170, 30179, \r
+    30188, 0, 0, 0, 30197, 30202, 30207, 30212, 30216, 30220, 30224, 30229, \r
+    30233, 30237, 30242, 30246, 30251, 30256, 30261, 30266, 30271, 30276, \r
+    30281, 30286, 30291, 30295, 30299, 30304, 30309, 30314, 30318, 30322, \r
+    30326, 30331, 30336, 30341, 30346, 30350, 30357, 30364, 30371, 30377, \r
+    30383, 30389, 30395, 30401, 30407, 0, 0, 0, 30412, 30417, 30422, 30427, \r
+    30431, 30435, 30439, 30443, 30447, 30451, 30455, 30459, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30463, 30466, 30470, \r
+    30474, 30478, 30482, 30486, 30490, 30494, 30498, 30502, 30506, 30510, \r
+    30514, 30517, 30520, 30524, 30528, 30532, 30536, 30540, 30544, 30547, \r
+    30551, 30555, 30559, 30563, 30566, 30569, 30573, 30576, 30580, 30584, \r
+    30588, 30592, 30596, 30599, 30604, 30609, 30614, 30618, 30622, 30627, \r
+    30631, 30636, 30640, 30646, 30651, 30656, 30661, 30667, 30672, 30678, \r
+    30684, 30690, 30694, 0, 0, 0, 30698, 30703, 30712, 30717, 30724, 30729, \r
+    30733, 30736, 30739, 30742, 30745, 30748, 30751, 30754, 30757, 0, 0, 0, \r
+    30760, 30764, 30768, 30772, 30779, 30785, 30791, 30797, 30803, 30809, \r
+    30815, 30821, 30827, 30833, 30840, 30847, 30854, 30861, 30868, 30875, \r
+    30882, 30889, 30896, 30903, 30910, 30917, 30924, 30931, 30938, 30945, \r
+    30952, 30959, 30966, 30973, 30980, 30987, 30994, 31001, 31008, 31015, \r
+    31022, 31029, 31036, 31043, 31051, 31059, 31067, 31073, 31079, 31085, \r
+    31093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31102, 31107, 31112, 31117, 31122, 31131, \r
+    31142, 31151, 31162, 31168, 31181, 31187, 31194, 31201, 31206, 31212, \r
+    31218, 31229, 31238, 31245, 31252, 31260, 31267, 31275, 31285, 31295, \r
+    31302, 31309, 31316, 31326, 31331, 31339, 31345, 31353, 31362, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31367, 31372, 31378, 31384, 31392, 31398, \r
+    31404, 31410, 31415, 31422, 31427, 31433, 31439, 31447, 31452, 31458, \r
+    31463, 31470, 31476, 31484, 31492, 31498, 31504, 31511, 31518, 31524, \r
+    31530, 31536, 31542, 31547, 31553, 31561, 31568, 31574, 31580, 31586, \r
+    31592, 31600, 31604, 31610, 31616, 31622, 31628, 31634, 31640, 31644, \r
+    31649, 31654, 31661, 31666, 31670, 31675, 31680, 31685, 31689, 31694, \r
+    31699, 31703, 31707, 31711, 31716, 31720, 31725, 31730, 31734, 31739, \r
+    31743, 31748, 31752, 31757, 31762, 31768, 31773, 31778, 31782, 31787, \r
+    31793, 31800, 31805, 31810, 31815, 31819, 31824, 31828, 31834, 31841, \r
+    31848, 31853, 31858, 31862, 31868, 31873, 31878, 31883, 31888, 31894, \r
+    31899, 31905, 31910, 31916, 31922, 31928, 31935, 31942, 31949, 31956, \r
+    31963, 31970, 31975, 31984, 31994, 32004, 32014, 32024, 32034, 32044, \r
+    32057, 32067, 32077, 32087, 32093, 32098, 32105, 32113, 32121, 32128, \r
+    32135, 32142, 32149, 32157, 32166, 32175, 32184, 32193, 32202, 32211, \r
+    32220, 32229, 32238, 32247, 32256, 32265, 32274, 32283, 32291, 32300, \r
+    32311, 32319, 32329, 32340, 32349, 32358, 32368, 32377, 32385, 32394, \r
+    32400, 32405, 32413, 32418, 32425, 32430, 32439, 32445, 32451, 32458, \r
+    32463, 32468, 32476, 32484, 32493, 32502, 32507, 32514, 32524, 32532, \r
+    32541, 32546, 32552, 32557, 32564, 32569, 32578, 32583, 32588, 32593, \r
+    32600, 32606, 32611, 32620, 32628, 32633, 32638, 32645, 32652, 32656, \r
+    32660, 32663, 32666, 32669, 32672, 32675, 32678, 32685, 32688, 32691, \r
+    32696, 32700, 32704, 32708, 32712, 32716, 32726, 32732, 32738, 32744, \r
+    32752, 32760, 32766, 32772, 32779, 32785, 32790, 32796, 32802, 32807, \r
+    32813, 32819, 32827, 32832, 32838, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 32844, 32850, 32855, 32864, 32872, 32880, \r
+    32887, 32894, 32901, 32908, 32916, 32924, 32934, 32944, 32952, 32960, \r
+    32968, 32976, 32985, 32994, 33002, 33010, 33019, 33028, 33038, 33048, \r
+    33057, 33066, 33074, 33082, 33090, 33098, 33108, 33118, 33126, 33134, \r
+    33142, 33150, 33158, 33166, 33174, 33182, 33190, 33198, 33206, 33214, \r
+    33223, 33232, 33241, 33250, 33260, 33270, 33277, 33284, 33292, 33300, \r
+    33309, 33318, 33326, 33334, 33346, 33358, 33367, 33376, 33385, 33394, \r
+    33401, 33408, 33416, 33424, 33432, 33440, 33448, 33456, 33464, 33472, \r
+    33481, 33490, 33499, 33508, 33517, 33526, 33536, 33546, 33556, 33566, \r
+    33575, 33584, 33591, 33598, 33606, 33614, 33622, 33630, 33638, 33646, \r
+    33658, 33670, 33679, 33688, 33696, 33704, 33712, 33720, 33731, 33742, \r
+    33753, 33764, 33776, 33788, 33796, 33804, 33812, 33820, 33829, 33838, \r
+    33847, 33856, 33864, 33872, 33880, 33888, 33896, 33904, 33913, 33922, \r
+    33932, 33942, 33950, 33958, 33966, 33974, 33982, 33990, 33997, 34004, \r
+    34012, 34020, 34028, 34036, 34044, 34052, 34060, 34068, 34076, 34084, \r
+    34092, 34100, 34108, 34116, 34124, 34132, 34141, 34150, 34159, 34167, \r
+    34176, 34185, 34194, 34203, 34213, 34222, 34228, 34233, 34240, 34247, \r
+    34255, 34263, 34272, 34281, 34291, 34301, 34312, 34323, 34333, 34343, \r
+    34353, 34363, 34372, 34381, 34391, 34401, 34412, 34423, 34433, 34443, \r
+    34453, 34463, 34470, 34477, 34485, 34493, 34500, 34507, 34516, 34525, \r
+    34535, 34545, 34556, 34567, 34577, 34587, 34597, 34607, 34616, 34625, \r
+    34633, 34641, 34648, 34655, 34663, 34671, 34680, 34689, 34699, 34709, \r
+    34720, 34731, 34741, 34751, 34761, 34771, 34780, 34789, 34799, 34809, \r
+    34820, 34831, 34841, 34851, 34861, 34871, 34878, 34885, 34893, 34901, \r
+    34910, 34919, 34929, 34939, 34950, 34961, 34971, 34981, 34991, 35001, \r
+    35009, 35017, 35025, 35033, 35042, 35051, 35059, 35067, 35074, 35081, \r
+    35088, 35095, 35103, 35111, 35119, 35127, 35137, 35147, 35157, 35167, \r
+    35177, 35187, 35195, 35203, 35213, 35223, 35233, 35243, 35253, 35263, \r
+    35271, 35279, 35289, 35299, 35309, 0, 0, 35319, 35327, 35335, 35345, \r
+    35355, 35365, 0, 0, 35375, 35383, 35391, 35401, 35411, 35421, 35431, \r
+    35441, 35451, 35459, 35467, 35477, 35487, 35497, 35507, 35517, 35527, \r
+    35535, 35543, 35553, 35563, 35573, 35583, 35593, 35603, 35611, 35619, \r
+    35629, 35639, 35649, 35659, 35669, 35679, 35687, 35695, 35705, 35715, \r
+    35725, 0, 0, 35735, 35743, 35751, 35761, 35771, 35781, 0, 0, 35791, \r
+    35799, 35807, 35817, 35827, 35837, 35847, 35857, 0, 35867, 0, 35875, 0, \r
+    35885, 0, 35895, 35905, 35913, 35921, 35931, 35941, 35951, 35961, 35971, \r
+    35981, 35989, 35997, 36007, 36017, 36027, 36037, 36047, 36057, 36065, \r
+    36073, 36081, 36089, 36097, 36105, 36113, 36121, 36129, 36137, 36145, \r
+    36153, 36161, 0, 0, 36169, 36179, 36189, 36202, 36215, 36228, 36241, \r
+    36254, 36267, 36277, 36287, 36300, 36313, 36326, 36339, 36352, 36365, \r
+    36375, 36385, 36398, 36411, 36424, 36437, 36450, 36463, 36473, 36483, \r
+    36496, 36509, 36522, 36535, 36548, 36561, 36571, 36581, 36594, 36607, \r
+    36620, 36633, 36646, 36659, 36669, 36679, 36692, 36705, 36718, 36731, \r
+    36744, 36757, 36765, 36773, 36784, 36792, 0, 36803, 36811, 36822, 36830, \r
+    36838, 36846, 36854, 36862, 36865, 36868, 36871, 36874, 36880, 36891, \r
+    36899, 0, 36910, 36918, 36929, 36937, 36945, 36953, 36961, 36969, 36974, \r
+    36979, 36984, 36992, 37000, 37011, 0, 0, 37022, 37030, 37041, 37049, \r
+    37057, 37065, 0, 37073, 37078, 37083, 37088, 37096, 37104, 37115, 37126, \r
+    37134, 37142, 37150, 37161, 37169, 37177, 37185, 37193, 37201, 37207, \r
+    37213, 0, 0, 37216, 37227, 37235, 0, 37246, 37254, 37265, 37273, 37281, \r
+    37289, 37297, 37305, 37308, 0, 37311, 37315, 37319, 37323, 37327, 37331, \r
+    37335, 37339, 37343, 37347, 37351, 37355, 37361, 37367, 37373, 37376, \r
+    37379, 37381, 37385, 37389, 37393, 37397, 37399, 37403, 37407, 37413, \r
+    37419, 37426, 37433, 37438, 37443, 37449, 37455, 37457, 37460, 37462, \r
+    37466, 37470, 37474, 37477, 37481, 37485, 37489, 37493, 37497, 37503, \r
+    37507, 37511, 37517, 37522, 37529, 37531, 37534, 37538, 37541, 37545, \r
+    37550, 37552, 37561, 37570, 37573, 37577, 37579, 37581, 37583, 37586, \r
+    37592, 37594, 37598, 37602, 37609, 37616, 37620, 37625, 37630, 37635, \r
+    37639, 37643, 37647, 37650, 37653, 37657, 37664, 37669, 37673, 37677, \r
+    37682, 37686, 37690, 37695, 37700, 37704, 37708, 37712, 37714, 37719, \r
+    37724, 37728, 37732, 37736, 37740, 0, 0, 0, 0, 0, 37744, 37750, 37756, \r
+    37763, 37770, 37775, 37780, 37784, 0, 0, 37790, 37793, 37796, 37799, \r
+    37802, 37805, 37808, 37812, 37816, 37821, 37826, 37831, 37837, 37841, \r
+    37844, 37847, 37850, 37853, 37856, 37859, 37862, 37865, 37868, 37872, \r
+    37876, 37881, 37886, 0, 37891, 37897, 37903, 37909, 37916, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 37923, 37926, 37929, 37932, 37937, 37940, 37943, 37946, \r
+    37949, 37952, 37955, 37959, 37962, 37965, 37968, 37971, 37974, 37979, \r
+    37982, 37985, 37988, 37991, 37994, 37999, 38002, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38005, 38010, 38015, 38022, \r
+    38030, 38035, 38040, 38044, 38048, 38053, 38060, 38067, 38071, 38076, \r
+    38081, 38086, 38091, 38098, 38103, 38108, 38113, 38122, 38129, 38135, \r
+    38139, 38144, 38150, 38155, 38162, 38170, 38178, 38182, 38186, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38190, 38194, 38201, 38205, 38209, \r
+    38214, 38218, 38222, 38226, 38228, 38232, 38236, 38240, 38245, 38249, \r
+    38253, 38261, 38264, 38268, 38271, 38274, 38280, 38283, 38286, 38292, \r
+    38296, 38300, 38304, 38307, 38311, 38314, 38318, 38320, 38323, 38326, \r
+    38330, 38332, 38336, 38339, 38342, 38347, 38352, 38358, 38361, 38364, \r
+    38368, 38373, 38376, 38379, 38382, 38386, 38390, 38393, 38396, 38398, \r
+    38401, 38404, 38407, 38411, 38416, 38419, 38423, 38427, 38431, 38435, \r
+    38440, 38445, 38449, 38453, 38458, 38463, 38468, 38472, 38476, 38481, \r
+    38485, 38488, 38491, 38493, 38497, 38502, 38509, 38516, 38523, 38530, \r
+    38537, 38544, 38551, 38558, 38566, 38573, 38581, 38588, 38595, 38603, \r
+    38611, 38616, 38621, 38626, 38631, 38636, 38641, 38646, 38651, 38656, \r
+    38661, 38667, 38673, 38679, 38685, 38692, 38700, 38707, 38713, 38719, \r
+    38725, 38731, 38737, 38743, 38749, 38755, 38761, 38768, 38775, 38782, \r
+    38789, 38797, 38806, 38814, 38825, 38833, 38841, 38849, 38855, 38864, \r
+    38873, 38881, 38890, 0, 0, 0, 0, 0, 0, 38898, 38900, 38903, 38905, 38908, \r
+    38911, 38914, 38919, 38924, 38929, 38934, 38938, 38942, 38946, 38950, \r
+    38955, 38961, 38966, 38972, 38977, 38982, 38987, 38993, 38998, 39004, \r
+    39010, 39014, 39018, 39023, 39028, 39033, 39038, 39043, 39051, 39059, \r
+    39067, 39075, 39082, 39090, 39097, 39104, 39112, 39122, 39129, 39136, \r
+    39143, 39150, 39158, 39166, 39173, 39180, 39188, 39196, 39201, 39209, \r
+    39214, 39219, 39225, 39230, 39236, 39243, 39250, 39255, 39261, 39266, \r
+    39269, 39273, 39276, 39280, 39284, 39288, 39294, 39300, 39306, 39312, \r
+    39316, 39320, 39324, 39328, 39334, 39340, 39344, 39349, 39353, 39358, \r
+    39362, 39366, 39369, 39373, 39376, 39380, 39387, 39395, 39406, 39417, \r
+    39422, 39431, 39438, 39446, 39454, 39458, 39464, 39472, 39476, 39481, \r
+    39486, 39492, 39498, 39504, 39511, 39515, 39519, 39524, 39527, 39529, \r
+    39533, 39537, 39544, 39548, 39550, 39552, 39556, 39563, 39568, 39574, \r
+    39583, 39590, 39595, 39599, 39603, 39607, 39610, 39613, 39616, 39620, \r
+    39624, 39628, 39632, 39636, 39639, 39643, 39647, 39650, 39652, 39655, \r
+    39657, 39661, 39665, 39667, 39672, 39675, 39679, 39683, 39687, 39689, \r
+    39691, 39693, 39696, 39700, 39704, 39708, 39712, 39716, 39722, 39728, \r
+    39730, 39732, 39734, 39736, 39739, 39741, 39745, 39747, 39751, 39754, \r
+    39759, 39763, 39767, 39770, 39774, 39778, 39783, 39787, 39796, 39806, \r
+    39810, 39815, 39821, 39825, 39829, 39832, 39837, 39841, 39847, 39851, \r
+    39862, 39870, 39874, 39878, 39884, 39888, 39891, 39893, 39896, 39900, \r
+    39904, 39910, 39914, 39918, 39921, 39924, 39928, 39933, 39938, 39943, \r
+    39948, 39953, 39960, 39967, 39971, 39975, 39977, 39981, 39984, 39987, \r
+    39995, 40003, 40009, 40015, 40024, 40033, 40038, 40043, 40051, 40059, \r
+    40061, 40063, 40068, 40073, 40079, 40085, 40090, 40095, 40099, 40103, \r
+    40109, 40115, 40121, 40127, 40137, 40147, 40154, 40161, 40163, 40167, \r
+    40171, 40176, 40181, 40188, 40195, 40198, 40201, 40204, 40207, 40210, \r
+    40215, 40219, 40224, 40229, 40232, 40235, 40238, 40241, 40244, 40248, \r
+    40251, 40254, 40257, 40260, 40262, 40264, 40266, 40268, 40276, 40284, \r
+    40289, 40292, 40297, 40307, 40313, 40319, 40325, 40333, 40341, 40352, \r
+    40356, 40360, 40362, 40368, 40370, 40372, 40374, 40376, 40382, 40385, \r
+    40391, 40397, 40401, 40405, 40409, 40412, 40416, 40420, 40422, 40431, \r
+    40440, 40445, 40450, 40455, 40461, 40467, 40470, 40473, 40476, 40479, \r
+    40481, 40486, 40491, 40496, 40502, 40508, 40515, 40522, 40527, 40532, \r
+    40537, 40542, 40550, 40558, 40566, 40574, 40582, 40590, 40598, 40606, \r
+    40614, 40622, 40629, 40640, 40649, 40663, 40666, 40671, 40677, 40683, \r
+    40690, 40704, 40719, 40725, 40731, 40738, 40744, 40752, 40758, 40771, \r
+    40785, 40790, 40796, 40803, 40806, 40809, 40811, 40814, 40817, 40819, \r
+    40821, 40825, 40828, 40831, 40834, 40837, 40842, 40847, 40852, 40857, \r
+    40860, 40863, 40865, 40867, 40869, 40873, 40877, 40881, 40887, 40890, \r
+    40892, 40894, 40899, 40904, 40909, 40914, 40919, 40924, 40926, 40928, \r
+    40937, 40941, 40948, 40957, 40959, 40964, 40969, 40976, 40980, 40982, \r
+    40986, 40988, 40992, 40996, 41000, 41002, 41004, 41006, 41011, 41018, \r
+    41025, 41032, 41039, 41046, 41053, 41060, 41067, 41073, 41079, 41086, \r
+    41093, 41100, 41107, 41113, 41119, 41126, 41133, 41140, 41148, 41155, \r
+    41163, 41170, 41178, 41185, 41193, 41201, 41208, 41216, 41223, 41231, \r
+    41238, 41246, 41253, 41260, 41267, 41274, 41281, 41289, 41296, 41303, \r
+    41310, 41318, 41325, 41332, 41339, 41346, 41354, 41362, 41369, 41376, \r
+    41382, 41389, 41394, 41401, 41408, 41416, 41423, 41431, 41439, 41444, \r
+    41449, 41454, 41461, 41468, 41475, 41482, 41487, 41491, 41500, 41506, \r
+    41509, 41517, 41520, 41525, 41530, 41533, 41536, 41544, 41547, 41552, \r
+    41555, 41562, 41567, 41575, 41578, 41581, 41584, 41589, 41594, 41597, \r
+    41600, 41608, 41611, 41616, 41623, 41627, 41631, 41636, 41641, 41647, \r
+    41652, 41658, 41664, 41669, 41675, 41683, 41689, 41697, 41705, 41711, \r
+    41719, 41727, 41736, 41744, 41750, 41758, 41767, 41775, 41779, 41784, \r
+    41797, 41810, 41814, 41818, 41822, 41826, 41836, 41840, 41845, 41850, \r
+    41855, 41860, 41865, 41870, 41880, 41890, 41898, 41908, 41918, 41926, \r
+    41936, 41946, 41954, 41964, 41974, 41982, 41990, 42000, 42010, 42013, \r
+    42016, 42019, 42024, 42028, 42034, 42041, 42048, 42056, 42063, 42067, \r
+    42071, 42075, 42079, 42081, 42085, 42089, 42094, 42099, 42106, 42113, \r
+    42116, 42123, 42125, 42127, 42131, 42135, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42140, 42144, 42151, 42158, 42165, \r
+    42172, 42176, 42180, 42184, 42188, 42193, 42199, 42204, 42210, 42216, \r
+    42222, 42228, 42236, 42243, 42250, 42257, 42264, 42270, 42276, 42285, \r
+    42289, 42296, 42300, 42304, 42310, 42316, 42322, 42328, 42332, 42336, \r
+    42339, 42343, 42347, 42354, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42361, 42364, 42368, 42372, 42378, 42384, \r
+    42390, 42398, 42405, 42409, 42417, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 42422, 42425, 42428, 42431, 42434, 42437, 42440, \r
+    42443, 42446, 42449, 42453, 42457, 42461, 42465, 42469, 42473, 42477, \r
+    42481, 42485, 42489, 42493, 42496, 42499, 42502, 42505, 42508, 42511, \r
+    42514, 42517, 42520, 42524, 42528, 42532, 42536, 42540, 42544, 42548, \r
+    42552, 42556, 42560, 42564, 42570, 42576, 42582, 42589, 42596, 42603, \r
+    42610, 42617, 42624, 42631, 42638, 42645, 42652, 42659, 42666, 42673, \r
+    42680, 42687, 42694, 42701, 42706, 42712, 42718, 42724, 42729, 42735, \r
+    42741, 42747, 42752, 42758, 42764, 42769, 42774, 42779, 42784, 42790, \r
+    42796, 42801, 42806, 42812, 42817, 42823, 42829, 42835, 42841, 42847, \r
+    42852, 42858, 42864, 42870, 42875, 42881, 42887, 42893, 42898, 42904, \r
+    42910, 42915, 42920, 42925, 42930, 42936, 42942, 42947, 42952, 42958, \r
+    42963, 42969, 42975, 42981, 42987, 42993, 42998, 43004, 43010, 43016, \r
+    43021, 43027, 43033, 43039, 43044, 43050, 43056, 43061, 43066, 43071, \r
+    43076, 43082, 43088, 43093, 43098, 43104, 43109, 43115, 43121, 43127, \r
+    43133, 43139, 43143, 43149, 43155, 43161, 43167, 43173, 43179, 43185, \r
+    43191, 43197, 43203, 43207, 43211, 43215, 43219, 43223, 43227, 43231, \r
+    43235, 43239, 43244, 43250, 43255, 43260, 43265, 43270, 43279, 43288, \r
+    43297, 43306, 43315, 43324, 43333, 43342, 43349, 43357, 43365, 43372, \r
+    43379, 43387, 43395, 43402, 43409, 43417, 43425, 43432, 43439, 43447, \r
+    43455, 43462, 43469, 43477, 43486, 43495, 43503, 43512, 43521, 43528, \r
+    43535, 43543, 43552, 43561, 43569, 43578, 43587, 43594, 43601, 43610, \r
+    43619, 43627, 43635, 43644, 43653, 43660, 43667, 43676, 43685, 43693, \r
+    43701, 43710, 43719, 43726, 43733, 43742, 43751, 43759, 43768, 43777, \r
+    43785, 43795, 43805, 43815, 43825, 43834, 43843, 43852, 43861, 43868, \r
+    43876, 43884, 43892, 43900, 43905, 43910, 43919, 43927, 43934, 43943, \r
+    43951, 43958, 43967, 43975, 43982, 43991, 43999, 44006, 44015, 44023, \r
+    44030, 44039, 44047, 44054, 44063, 44071, 44078, 44087, 44095, 44102, \r
+    44111, 44119, 44126, 44135, 44144, 44153, 44162, 44175, 44188, 44195, \r
+    44200, 44205, 44210, 44215, 44220, 44225, 44230, 44235, 44243, 44251, \r
+    44259, 44267, 44272, 44279, 44286, 44293, 44298, 44306, 44313, 44321, \r
+    44325, 44332, 44338, 44345, 44349, 44355, 44361, 44367, 44371, 44374, \r
+    44378, 44382, 44389, 44395, 44401, 44407, 44413, 44427, 44437, 44451, \r
+    44465, 44471, 44481, 44495, 44498, 44501, 44508, 44516, 44521, 44526, \r
+    44534, 44545, 44556, 44564, 44568, 44572, 44575, 44578, 44582, 44586, \r
+    44589, 44592, 44597, 44602, 44608, 44614, 44619, 44624, 44630, 44636, \r
+    44641, 44646, 44651, 44656, 44662, 44668, 44673, 44678, 44684, 44690, \r
+    44695, 44700, 44703, 44706, 44715, 44717, 44719, 44722, 44726, 44732, \r
+    44734, 44737, 44744, 44751, 44759, 44767, 44777, 44791, 44796, 44801, \r
+    44805, 44810, 44818, 44826, 44835, 44844, 44853, 44862, 44867, 44872, \r
+    44878, 44884, 44890, 44896, 44899, 44905, 44911, 44921, 44931, 44939, \r
+    44947, 44956, 44965, 44969, 44977, 44985, 44993, 45001, 45010, 45019, \r
+    45028, 45037, 45042, 45047, 45052, 45057, 45062, 45068, 45074, 45079, \r
+    45085, 45087, 45089, 45091, 45093, 45096, 45099, 45101, 45103, 45105, \r
+    45109, 45113, 45115, 45117, 45120, 45123, 45127, 45133, 45139, 45141, \r
+    45148, 45152, 45157, 45162, 45164, 45173, 45179, 45185, 45191, 45197, \r
+    45203, 45209, 45214, 45217, 45220, 45223, 45225, 45227, 45231, 45235, \r
+    45240, 45245, 45250, 45253, 45257, 45262, 45265, 45269, 45274, 45279, \r
+    45284, 45289, 45294, 45299, 45304, 45309, 45314, 45319, 45324, 45329, \r
+    45335, 45341, 45347, 45349, 45352, 45354, 45357, 45359, 45361, 45363, \r
+    45365, 45367, 45369, 45371, 45373, 45375, 45377, 45379, 45381, 45383, \r
+    45385, 45387, 45389, 45391, 45396, 45401, 45406, 45411, 45416, 45421, \r
+    45426, 45431, 45436, 45441, 45446, 45451, 45456, 45461, 45466, 45471, \r
+    45476, 45481, 45486, 45491, 45495, 45499, 45503, 45509, 45515, 45520, \r
+    45525, 45530, 45535, 45540, 45545, 45553, 45561, 45569, 45577, 45585, \r
+    45593, 45601, 45609, 45615, 45620, 45625, 45630, 45633, 45637, 45641, \r
+    45645, 45649, 45653, 45657, 45664, 45671, 45679, 45687, 45692, 45697, \r
+    45704, 45711, 45718, 45725, 45728, 45731, 45736, 45738, 45742, 45747, \r
+    45749, 45751, 45753, 45755, 45760, 45763, 45765, 45770, 45777, 45784, \r
+    45787, 45791, 45796, 45801, 45809, 45815, 45820, 45831, 45837, 45843, \r
+    45848, 45853, 45859, 45862, 45865, 45870, 45872, 45876, 45878, 45880, \r
+    45882, 45884, 45886, 45888, 45893, 45895, 45897, 45899, 45901, 45905, \r
+    45907, 45910, 45915, 45920, 45925, 45930, 45936, 45942, 45944, 45947, \r
+    45954, 45960, 45966, 45973, 45977, 0, 45981, 45983, 45987, 45993, 45998, \r
+    46000, 46004, 46013, 46021, 46029, 46035, 46041, 46046, 46052, 46057, \r
+    46060, 46074, 46077, 46082, 0, 46087, 0, 0, 0, 0, 46096, 46103, 46107, \r
+    46109, 46111, 46115, 46121, 46126, 46132, 46134, 46140, 46142, 46148, \r
+    46150, 46152, 46157, 46159, 46163, 46168, 46170, 46175, 46180, 46184, \r
+    46191, 0, 46201, 46207, 46210, 46216, 0, 46219, 46224, 46228, 46230, 0, \r
+    0, 46232, 46236, 46240, 46245, 46247, 46252, 46255, 46258, 46261, 46265, \r
+    46269, 46274, 46278, 46283, 46288, 46292, 46298, 46305, 46308, 46314, \r
+    46319, 46323, 46328, 46334, 46340, 46347, 46353, 46360, 0, 46367, 46374, \r
+    46378, 46385, 46391, 46396, 46402, 46406, 46411, 46414, 46420, 46426, \r
+    46433, 46441, 46448, 46457, 46467, 46474, 46480, 46484, 46492, 46497, \r
+    46506, 46509, 46512, 46521, 46532, 46539, 46541, 46547, 46552, 46554, \r
+    46557, 46561, 46569, 0, 46578, 0, 46583, 46591, 46599, 46607, 0, 0, 0, \r
+    46615, 46623, 46628, 46631, 46635, 46638, 46649, 46659, 46669, 0, 0, \r
+    46678, 46687, 46693, 46701, 46705, 46713, 46717, 46725, 46732, 46739, \r
+    46748, 46757, 46767, 46777, 46787, 46797, 46806, 46815, 46825, 46835, \r
+    46844, 46853, 46860, 46867, 46874, 46881, 46888, 46895, 46902, 46909, \r
+    46916, 46924, 46930, 46936, 46942, 46948, 46954, 46960, 46966, 46972, \r
+    46978, 46985, 46993, 47001, 47009, 47017, 47025, 47033, 47041, 47049, \r
+    47057, 47066, 0, 0, 0, 47071, 47077, 47080, 47086, 47092, 47097, 47101, \r
+    47106, 47112, 47119, 47122, 47129, 47136, 47140, 47149, 47158, 47163, \r
+    47169, 47174, 47179, 47186, 47193, 47201, 47209, 0, 47218, 47227, 47232, \r
+    47236, 47243, 47247, 47254, 47262, 47267, 47275, 47279, 47284, 47288, \r
+    47293, 0, 47297, 47302, 47311, 47313, 47317, 47321, 47328, 47335, 47340, \r
+    47348, 47354, 0, 47360, 0, 0, 0, 47363, 47371, 47375, 47382, 47390, \r
+    47398, 47403, 47408, 47414, 47419, 47424, 47430, 47435, 47438, 47442, \r
+    47446, 47453, 47462, 47467, 47476, 47485, 47491, 47497, 47502, 47507, \r
+    47512, 47517, 47523, 47529, 47537, 47545, 47551, 47557, 47562, 47567, \r
+    47574, 47581, 47587, 47590, 47593, 47597, 47601, 47605, 47610, 47616, \r
+    47622, 47629, 47636, 47641, 47645, 47649, 47653, 47657, 47661, 47665, \r
+    47669, 47673, 47677, 47681, 47685, 47689, 47693, 47697, 47701, 47705, \r
+    47709, 47713, 47717, 47721, 47725, 47729, 47733, 47737, 47741, 47745, \r
+    47749, 47753, 47757, 47761, 47765, 47769, 47773, 47777, 47781, 47785, \r
+    47789, 47793, 47797, 47801, 47805, 47809, 47813, 47817, 47821, 47825, \r
+    47829, 47833, 47837, 47841, 47845, 47849, 47853, 47857, 47861, 47865, \r
+    47869, 47873, 47877, 47881, 47885, 47889, 47893, 47897, 47901, 47905, \r
+    47909, 47913, 47917, 47921, 47925, 47929, 47933, 47937, 47941, 47945, \r
+    47949, 47953, 47957, 47961, 47965, 47969, 47973, 47977, 47981, 47985, \r
+    47989, 47993, 47997, 48001, 48005, 48009, 48013, 48017, 48021, 48025, \r
+    48029, 48033, 48037, 48041, 48045, 48049, 48053, 48057, 48061, 48065, \r
+    48069, 48073, 48077, 48081, 48085, 48089, 48093, 48097, 48101, 48105, \r
+    48109, 48113, 48117, 48121, 48125, 48129, 48133, 48137, 48141, 48145, \r
+    48149, 48153, 48157, 48161, 48165, 48169, 48173, 48177, 48181, 48185, \r
+    48189, 48193, 48197, 48201, 48205, 48209, 48213, 48217, 48221, 48225, \r
+    48229, 48233, 48237, 48241, 48245, 48249, 48253, 48257, 48261, 48265, \r
+    48269, 48273, 48277, 48281, 48285, 48289, 48293, 48297, 48301, 48305, \r
+    48309, 48313, 48317, 48321, 48325, 48329, 48333, 48337, 48341, 48345, \r
+    48349, 48353, 48357, 48361, 48365, 48369, 48373, 48377, 48381, 48385, \r
+    48389, 48393, 48397, 48401, 48405, 48409, 48413, 48417, 48421, 48425, \r
+    48429, 48433, 48437, 48441, 48445, 48449, 48453, 48457, 48461, 48465, \r
+    48469, 48473, 48477, 48481, 48485, 48489, 48493, 48497, 48501, 48505, \r
+    48509, 48513, 48517, 48521, 48525, 48529, 48533, 48537, 48541, 48545, \r
+    48549, 48553, 48557, 48561, 48565, 48569, 48573, 48577, 48581, 48585, \r
+    48589, 48593, 48597, 48601, 48605, 48609, 48613, 48617, 48621, 48625, \r
+    48629, 48633, 48637, 48641, 48645, 48649, 48653, 48657, 48661, 48665, \r
+    48672, 48680, 48686, 48692, 48699, 48706, 48712, 48718, 48724, 48730, \r
+    48735, 48740, 48745, 48750, 48756, 48762, 48770, 48777, 48782, 48787, \r
+    48795, 48804, 48811, 48821, 48832, 48835, 48838, 48842, 48846, 48852, \r
+    48858, 48868, 48878, 48888, 48898, 48905, 48912, 48919, 48926, 48937, \r
+    48948, 48959, 48970, 48980, 48990, 49002, 49014, 49025, 49036, 49048, \r
+    49060, 49069, 49079, 49089, 49100, 49111, 49118, 49125, 49132, 49139, \r
+    49149, 49159, 49167, 49175, 49182, 49189, 49196, 49203, 49210, 49215, \r
+    49220, 49226, 49234, 49244, 49252, 49260, 49268, 49276, 49284, 49292, \r
+    49300, 49308, 49316, 49324, 49333, 49342, 49350, 49358, 49367, 49376, \r
+    49385, 49394, 49404, 49414, 49423, 49432, 49442, 49452, 49466, 49483, \r
+    49497, 49514, 49528, 49542, 49556, 49570, 49580, 49591, 49601, 49612, \r
+    49629, 49646, 49654, 49660, 49667, 49674, 49681, 49688, 49693, 49699, \r
+    49704, 49709, 49715, 49720, 49725, 49730, 49735, 49740, 49747, 49752, \r
+    49759, 49764, 49769, 49773, 49777, 49784, 49791, 49798, 49805, 49812, \r
+    49819, 49832, 49845, 49858, 49871, 49879, 49887, 49893, 49899, 49906, \r
+    49913, 49920, 49927, 49931, 49936, 49944, 49952, 49960, 49967, 49971, \r
+    49979, 49987, 49990, 49993, 49998, 50004, 50012, 50020, 50040, 50060, \r
+    50080, 50100, 50120, 50140, 50160, 50180, 50185, 50192, 50201, 50209, \r
+    50217, 50222, 50225, 50228, 50233, 50236, 50255, 50262, 50268, 50274, \r
+    50278, 50281, 50284, 50287, 50298, 50310, 50317, 50324, 50327, 50331, \r
+    50334, 50339, 50344, 50349, 50355, 50364, 50371, 50378, 50386, 50393, \r
+    50400, 50403, 50409, 50415, 50418, 50421, 50426, 50431, 50437, 50443, \r
+    50447, 50452, 50459, 50463, 50469, 50473, 50477, 50485, 50497, 50505, \r
+    50509, 50511, 50520, 50529, 50535, 50538, 50544, 50550, 50555, 50560, \r
+    50565, 50570, 50575, 50580, 50582, 50588, 50593, 50600, 50604, 50610, \r
+    50613, 50617, 50624, 50631, 50633, 50635, 50641, 50647, 50653, 50662, \r
+    50671, 50678, 50685, 50691, 50697, 50702, 50707, 50712, 50718, 50724, \r
+    50729, 50736, 50740, 50744, 50757, 50770, 50781, 50790, 50796, 50803, \r
+    50808, 50813, 50818, 50823, 50828, 50830, 50837, 50844, 50851, 50858, \r
+    50865, 50873, 50879, 50884, 50890, 50896, 50902, 50909, 50915, 50923, \r
+    50931, 50939, 50947, 50954, 50960, 50966, 50975, 50979, 50988, 50997, \r
+    51006, 51014, 51018, 51024, 51031, 51038, 51042, 51048, 51055, 51060, \r
+    51065, 51071, 51076, 51081, 51088, 51095, 51100, 51105, 51113, 51121, \r
+    51131, 51141, 51148, 51155, 51159, 51163, 51175, 51181, 51187, 51192, \r
+    51197, 51204, 51211, 51217, 51223, 51232, 51240, 51248, 51255, 51262, \r
+    51269, 51275, 51282, 51288, 51295, 51302, 51309, 51316, 51322, 51327, \r
+    51336, 51346, 51353, 51362, 51368, 51373, 51378, 51387, 51393, 51399, \r
+    51405, 51413, 51418, 51425, 51432, 51443, 51450, 51457, 51464, 51471, \r
+    51478, 51485, 51492, 51503, 51514, 51524, 51534, 51546, 51558, 51563, \r
+    51568, 51576, 51584, 51590, 51596, 51605, 51614, 51622, 51630, 51638, \r
+    51646, 51656, 51666, 51680, 51694, 51701, 51708, 51719, 51730, 51737, \r
+    51744, 51753, 51762, 51767, 51772, 51781, 51790, 51795, 51800, 51808, \r
+    51814, 51820, 51828, 51836, 51849, 51862, 51866, 51870, 51877, 51884, \r
+    51891, 51899, 51907, 51915, 51923, 51929, 51935, 51941, 51947, 51954, \r
+    51961, 51969, 51977, 51980, 51983, 51988, 51993, 51999, 52005, 52012, \r
+    52019, 52028, 52037, 52044, 52051, 52059, 52067, 52075, 52083, 52090, \r
+    52097, 52104, 52111, 52115, 52119, 52126, 52133, 52138, 52143, 52148, \r
+    52153, 52159, 52173, 52180, 52187, 52191, 52193, 52195, 52200, 52205, \r
+    52210, 52214, 52222, 52229, 52236, 52244, 52256, 52264, 52272, 52283, \r
+    52287, 52291, 52295, 52300, 52311, 52318, 52325, 52332, 52337, 52344, \r
+    52353, 52361, 52367, 52373, 52379, 52388, 52397, 52405, 52414, 52419, \r
+    52422, 52427, 52433, 52439, 52445, 52451, 52455, 52458, 52462, 52466, \r
+    52472, 52478, 52484, 52490, 52494, 52498, 52505, 52512, 52519, 52526, \r
+    52533, 52540, 52550, 52560, 52567, 52574, 52582, 52590, 52594, 52599, \r
+    52604, 52610, 52616, 52619, 52622, 52625, 52628, 52632, 52637, 52642, \r
+    52647, 52652, 52657, 52661, 52665, 52669, 52673, 52677, 52681, 52685, \r
+    52691, 52695, 52701, 52706, 52713, 52721, 52728, 52736, 52743, 52751, \r
+    52760, 52767, 52777, 52788, 52794, 52803, 52809, 52818, 52827, 52833, \r
+    52839, 52843, 52847, 52856, 52865, 52872, 52879, 52888, 0, 0, 0, 52897, \r
+    52902, 52906, 52910, 52915, 52920, 52925, 52933, 52941, 52944, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 52948, 52953, 52958, 52963, 52968, \r
+    52973, 52978, 52983, 52988, 52993, 52998, 53004, 53008, 53013, 53018, \r
+    53023, 53028, 53033, 53038, 53043, 53048, 53053, 53058, 53063, 53068, \r
+    53073, 53078, 53083, 53088, 53093, 53098, 53103, 53108, 53113, 53118, \r
+    53124, 53129, 53135, 53144, 53149, 53157, 53164, 53173, 53178, 53183, \r
+    53188, 53194, 0, 53201, 53206, 53211, 53216, 53221, 53226, 53231, 53236, \r
+    53241, 53246, 53251, 53257, 53261, 53266, 53271, 53276, 53281, 53286, \r
+    53291, 53296, 53301, 53306, 53311, 53316, 53321, 53326, 53331, 53336, \r
+    53341, 53346, 53351, 53356, 53361, 53366, 53371, 53377, 53382, 53388, \r
+    53397, 53402, 53410, 53417, 53426, 53431, 53436, 53441, 53447, 0, 53454, \r
+    53462, 53470, 53480, 53487, 53495, 53501, 53510, 53518, 53526, 53534, \r
+    53542, 53550, 53558, 53563, 53570, 53575, 53581, 53589, 53596, 53603, \r
+    53611, 53617, 53623, 53630, 53637, 53646, 53656, 53662, 53669, 53674, \r
+    53684, 53694, 53699, 53704, 53709, 53714, 53719, 53724, 53729, 53734, \r
+    53739, 53744, 53749, 53754, 53759, 53764, 53769, 53774, 53779, 53784, \r
+    53789, 53794, 53799, 53804, 53809, 53814, 53819, 53824, 53829, 53834, \r
+    53839, 53844, 53848, 53852, 53857, 53862, 53867, 53872, 53877, 53882, \r
+    53887, 53892, 53897, 53902, 53907, 53912, 53917, 53922, 53927, 53932, \r
+    53937, 53942, 53949, 53956, 53963, 53970, 53977, 53984, 53991, 53998, \r
+    54005, 54012, 54019, 54026, 54033, 54040, 54045, 54050, 54057, 54064, \r
+    54071, 54078, 54085, 54092, 54099, 54106, 54113, 54120, 54127, 54134, \r
+    54140, 54146, 54152, 54158, 54165, 54172, 54179, 54186, 54193, 54200, \r
+    54207, 54214, 54221, 54228, 54236, 54244, 54252, 54260, 54268, 54276, \r
+    54284, 54292, 54296, 54302, 54308, 54312, 54318, 54324, 54330, 54337, \r
+    54344, 54351, 54358, 54363, 54369, 0, 0, 0, 0, 0, 0, 0, 54375, 54383, \r
+    54392, 54401, 54409, 54415, 54420, 54425, 54430, 54435, 54440, 54445, \r
+    54450, 54455, 54460, 54465, 54470, 54475, 54480, 54485, 54490, 54495, \r
+    54500, 54505, 54510, 54515, 54520, 54525, 54530, 54535, 54540, 54545, \r
+    54550, 54555, 54560, 54565, 54570, 54575, 54580, 54585, 54590, 54595, \r
+    54600, 54605, 54610, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54615, 54619, 54624, \r
+    54629, 54634, 54639, 54648, 54653, 54658, 54663, 54668, 54673, 54678, \r
+    54683, 54688, 54695, 54700, 54705, 54714, 54721, 54726, 54731, 54736, \r
+    54743, 54748, 54755, 54760, 54765, 54772, 54779, 54784, 54789, 54794, \r
+    54801, 54808, 54813, 54818, 54823, 54828, 54833, 54840, 54847, 54852, \r
+    54857, 54862, 54867, 54872, 54877, 54882, 54887, 54892, 54897, 54902, \r
+    54909, 0, 0, 0, 0, 0, 0, 0, 0, 0, 54914, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 54921, 54925, 54929, 54933, 54937, 54941, 54945, 54949, \r
+    54953, 54957, 54961, 54967, 54971, 54975, 54979, 54983, 54987, 54991, \r
+    54995, 54999, 55003, 55007, 55011, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55015, \r
+    55019, 55023, 55027, 55031, 55035, 55039, 0, 55043, 55047, 55051, 55055, \r
+    55059, 55063, 55067, 0, 55071, 55075, 55079, 55083, 55087, 55091, 55095, \r
+    0, 55099, 55103, 55107, 55111, 55115, 55119, 55123, 0, 55127, 55131, \r
+    55135, 55139, 55143, 55147, 55151, 0, 55155, 55159, 55163, 55167, 55171, \r
+    55175, 55179, 0, 55183, 55187, 55191, 55195, 55199, 55203, 55207, 0, \r
+    55211, 55215, 55219, 55223, 55227, 55231, 55235, 0, 55239, 55244, 55249, \r
+    55254, 55259, 55264, 55269, 55273, 55278, 55283, 55288, 55292, 55297, \r
+    55302, 55307, 55312, 55316, 55321, 55326, 55331, 55336, 55341, 55346, \r
+    55350, 55355, 55360, 55367, 55372, 55377, 55383, 55390, 55397, 55406, \r
+    55413, 55422, 55426, 55430, 55436, 55442, 55448, 55456, 55462, 55466, \r
+    55470, 55474, 55480, 55486, 55490, 55492, 55496, 55501, 55503, 55507, \r
+    55511, 55515, 55521, 55526, 55530, 55534, 55539, 55545, 55550, 55555, \r
+    55560, 55565, 55572, 55579, 55584, 55589, 55594, 55599, 55604, 55609, \r
+    55613, 55617, 55624, 55631, 55637, 55641, 55645, 55648, 55652, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 55660, 55664, 55668, 55673, 55678, 55683, 55687, 55691, 55695, \r
+    55700, 55705, 55709, 55713, 55717, 55721, 55726, 55731, 55736, 55741, \r
+    55745, 55749, 55754, 55759, 55764, 55769, 55773, 0, 55777, 55781, 55785, \r
+    55789, 55793, 55797, 55801, 55806, 55811, 55815, 55820, 55825, 55834, \r
+    55838, 55842, 55846, 55853, 55857, 55862, 55867, 55871, 55875, 55881, \r
+    55886, 55891, 55896, 55901, 55905, 55909, 55913, 55917, 55921, 55926, \r
+    55931, 55935, 55939, 55944, 55949, 55954, 55958, 55962, 55967, 55972, \r
+    55978, 55984, 55988, 55994, 56000, 56004, 56010, 56016, 56021, 56026, \r
+    56030, 56036, 56040, 56044, 56050, 56056, 56061, 56066, 56070, 56074, \r
+    56082, 56088, 56094, 56100, 56105, 56110, 56115, 56121, 56125, 56131, \r
+    56135, 56139, 56145, 56151, 56157, 56163, 56169, 56175, 56181, 56187, \r
+    56193, 56199, 56205, 56211, 56215, 56221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 56227, 56230, 56234, 56238, 56242, 56246, 56249, 56252, 56256, \r
+    56260, 56264, 56268, 56271, 56276, 56280, 56284, 56288, 56294, 56298, \r
+    56302, 56306, 56310, 56317, 56323, 56327, 56331, 56335, 56339, 56343, \r
+    56347, 56351, 56355, 56359, 56363, 56367, 56373, 56377, 56381, 56385, \r
+    56389, 56393, 56397, 56401, 56405, 56409, 56413, 56417, 56421, 56425, \r
+    56429, 56433, 56437, 56443, 56449, 56454, 56459, 56463, 56467, 56471, \r
+    56475, 56479, 56483, 56487, 56491, 56495, 56499, 56503, 56507, 56511, \r
+    56515, 56519, 56523, 56527, 56531, 56535, 56539, 56543, 56547, 56551, \r
+    56555, 56561, 56565, 56569, 56573, 56577, 56581, 56585, 56589, 56593, \r
+    56598, 56605, 56609, 56613, 56617, 56621, 56625, 56629, 56633, 56637, \r
+    56641, 56645, 56649, 56653, 56660, 56664, 56670, 56674, 56678, 56682, \r
+    56686, 56690, 56693, 56697, 56701, 56705, 56709, 56713, 56717, 56721, \r
+    56725, 56729, 56733, 56737, 56741, 56745, 56749, 56753, 56757, 56761, \r
+    56765, 56769, 56773, 56777, 56781, 56785, 56789, 56793, 56797, 56801, \r
+    56805, 56809, 56813, 56817, 56821, 56827, 56831, 56835, 56839, 56843, \r
+    56847, 56851, 56855, 56859, 56863, 56867, 56871, 56875, 56879, 56883, \r
+    56887, 56891, 56895, 56899, 56903, 56907, 56911, 56915, 56919, 56923, \r
+    56927, 56931, 56935, 56943, 56947, 56951, 56955, 56959, 56963, 56969, \r
+    56973, 56977, 56981, 56985, 56989, 56993, 56997, 57001, 57005, 57009, \r
+    57013, 57017, 57021, 57027, 57031, 57035, 57039, 57043, 57047, 57051, \r
+    57055, 57059, 57063, 57067, 57071, 57075, 57079, 57083, 57087, 57091, \r
+    57095, 57099, 57103, 57107, 57111, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57115, 57123, 57130, 57141, 57151, \r
+    57159, 57168, 57177, 57187, 57199, 57211, 57223, 0, 0, 0, 0, 57229, \r
+    57232, 57235, 57240, 57243, 57250, 57254, 57258, 57262, 57266, 57270, \r
+    57275, 57280, 57284, 57288, 57293, 57298, 57303, 57308, 57311, 57314, \r
+    57320, 57326, 57331, 57336, 57343, 57350, 57354, 57358, 57362, 57369, \r
+    57375, 57382, 57387, 57392, 57397, 57402, 57407, 57412, 57417, 57422, \r
+    57427, 57432, 57437, 57442, 57447, 57452, 57458, 57463, 57467, 57473, \r
+    57484, 57494, 57509, 57519, 57523, 57532, 57538, 57544, 57550, 57555, \r
+    57558, 57563, 57567, 0, 57573, 57577, 57580, 57584, 57587, 57591, 57594, \r
+    57598, 57601, 57605, 57608, 57611, 57615, 57619, 57623, 57627, 57631, \r
+    57635, 57639, 57643, 57647, 57651, 57655, 57659, 57663, 57667, 57671, \r
+    57675, 57679, 57683, 57687, 57691, 57695, 57699, 57703, 57708, 57712, \r
+    57716, 57720, 57724, 57727, 57731, 57734, 57738, 57742, 57746, 57750, \r
+    57753, 57757, 57760, 57764, 57768, 57772, 57776, 57780, 57784, 57788, \r
+    57792, 57796, 57800, 57804, 57808, 57811, 57815, 57819, 57823, 57827, \r
+    57831, 57834, 57839, 57843, 57848, 57852, 57855, 57859, 57863, 57867, \r
+    57871, 57876, 57880, 57884, 57888, 57892, 57895, 57899, 57903, 0, 0, \r
+    57908, 57916, 57924, 57931, 57938, 57942, 57948, 57953, 57958, 57962, \r
+    57965, 57969, 57972, 57976, 57979, 57983, 57986, 57990, 57993, 57996, \r
+    58000, 58004, 58008, 58012, 58016, 58020, 58024, 58028, 58032, 58036, \r
+    58040, 58044, 58048, 58052, 58056, 58060, 58064, 58068, 58072, 58076, \r
+    58080, 58084, 58088, 58093, 58097, 58101, 58105, 58109, 58112, 58116, \r
+    58119, 58123, 58127, 58131, 58135, 58138, 58142, 58145, 58149, 58153, \r
+    58157, 58161, 58165, 58169, 58173, 58177, 58181, 58185, 58189, 58193, \r
+    58196, 58200, 58204, 58208, 58212, 58216, 58219, 58224, 58228, 58233, \r
+    58237, 58240, 58244, 58248, 58252, 58256, 58261, 58265, 58269, 58273, \r
+    58277, 58280, 58284, 58288, 58293, 58297, 58301, 58305, 58309, 58314, \r
+    58321, 58325, 58331, 0, 0, 0, 0, 0, 58336, 58340, 58344, 58347, 58351, \r
+    58355, 58359, 58362, 58365, 58369, 58373, 58377, 58381, 58385, 58389, \r
+    58393, 58397, 58401, 58404, 58408, 58412, 58415, 58418, 58421, 58424, \r
+    58428, 58432, 58436, 58440, 58444, 58448, 58452, 58456, 58460, 58464, \r
+    58467, 58470, 58474, 58478, 58482, 58486, 0, 0, 0, 58490, 58494, 58498, \r
+    58502, 58506, 58510, 58514, 58518, 58522, 58526, 58530, 58534, 58538, \r
+    58542, 58546, 58550, 58554, 58558, 58562, 58566, 58570, 58574, 58578, \r
+    58582, 58586, 58590, 58594, 58598, 58602, 58606, 58610, 58613, 58617, \r
+    58620, 58624, 58628, 58631, 58635, 58639, 58642, 58646, 58650, 58654, \r
+    58658, 58661, 58665, 58669, 58673, 58677, 58681, 58685, 58688, 58691, \r
+    58695, 58699, 58703, 58707, 58711, 58715, 58719, 58723, 58727, 58731, \r
+    58735, 58739, 58743, 58747, 58751, 58755, 58759, 58763, 58767, 58771, \r
+    58775, 58779, 58783, 58787, 58791, 58795, 58799, 58803, 58807, 58811, \r
+    58815, 58819, 58823, 58827, 58831, 58835, 58839, 58843, 58847, 58851, \r
+    58855, 0, 58859, 58865, 58871, 58876, 58881, 58886, 58892, 58898, 58904, \r
+    58910, 58916, 58922, 58928, 58934, 58940, 58946, 58952, 58956, 58960, \r
+    58964, 58968, 58972, 58976, 58980, 58984, 58988, 58992, 58996, 59000, \r
+    59004, 59008, 59012, 59016, 59020, 59024, 59028, 59032, 59037, 59042, \r
+    59047, 0, 0, 0, 0, 0, 0, 0, 0, 59052, 59056, 59060, 59064, 59068, 59072, \r
+    59076, 59080, 59084, 59088, 59092, 59096, 59100, 59104, 59108, 59112, \r
+    59115, 59119, 59122, 59126, 59130, 59134, 59138, 59142, 59146, 59150, \r
+    59154, 59158, 59162, 59166, 59170, 59174, 59178, 59182, 59186, 59190, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59194, 59199, 59204, 59209, 59213, \r
+    59218, 59222, 59227, 59232, 59237, 59242, 59247, 59251, 59256, 59261, \r
+    59266, 59271, 59275, 59279, 59283, 59287, 59291, 59295, 59299, 59303, \r
+    59307, 59311, 59315, 59319, 59323, 59327, 59332, 59337, 59342, 59347, \r
+    59352, 59357, 59362, 59367, 59372, 59377, 59382, 59387, 59392, 59397, \r
+    59402, 59408, 0, 59415, 59418, 59421, 59424, 59427, 59430, 59433, 59436, \r
+    59439, 59442, 59446, 59450, 59454, 59458, 59462, 59466, 59470, 59474, \r
+    59478, 59482, 59486, 59490, 59494, 59498, 59502, 59506, 59510, 59514, \r
+    59518, 59522, 59526, 59530, 59534, 59538, 59542, 59546, 59550, 59554, \r
+    59558, 59562, 59566, 59575, 59584, 59593, 59602, 59611, 59620, 59629, \r
+    59638, 59641, 59646, 59651, 59656, 59661, 59666, 59671, 59676, 59681, \r
+    59686, 59690, 59695, 59700, 59705, 59710, 59715, 59719, 59723, 59727, \r
+    59731, 59735, 59739, 59743, 59747, 59751, 59755, 59759, 59763, 59767, \r
+    59771, 59776, 59781, 59786, 59791, 59796, 59801, 59806, 59811, 59816, \r
+    59821, 59826, 59831, 59836, 59841, 59847, 59853, 59858, 59863, 59866, \r
+    59869, 59872, 59875, 59878, 59881, 59884, 59887, 59890, 59894, 59898, \r
+    59902, 59906, 59910, 59914, 59918, 59922, 59926, 59930, 59934, 59938, \r
+    59942, 59946, 59950, 59954, 59958, 59962, 59966, 59970, 59974, 59978, \r
+    59982, 59986, 59990, 59994, 59998, 60002, 60006, 60010, 60014, 60018, \r
+    60022, 60026, 60030, 60034, 60038, 60042, 60046, 60050, 60055, 60060, \r
+    60065, 60070, 60074, 60079, 60084, 60089, 60094, 60099, 60104, 60109, \r
+    60114, 60119, 60123, 60129, 60135, 60141, 60147, 60153, 60159, 60165, \r
+    60171, 60177, 60183, 60189, 60195, 60198, 60201, 60204, 60209, 60212, \r
+    60215, 60218, 60221, 60224, 60227, 60231, 60235, 60239, 60243, 60247, \r
+    60251, 60255, 60259, 60263, 60267, 60271, 60275, 60279, 60282, 60285, \r
+    60289, 60293, 60297, 60301, 60304, 60308, 60312, 60316, 60320, 60323, \r
+    60327, 60331, 60335, 60339, 60342, 60346, 60350, 60353, 60357, 60361, \r
+    60365, 60369, 60373, 60377, 60381, 0, 60385, 60388, 60391, 60394, 60397, \r
+    60400, 60403, 60406, 60409, 60412, 60415, 60418, 60421, 60424, 60427, \r
+    60430, 60433, 60436, 60439, 60442, 60445, 60448, 60451, 60454, 60457, \r
+    60460, 60463, 60466, 60469, 60472, 60475, 60478, 60481, 60484, 60487, \r
+    60490, 60493, 60496, 60499, 60502, 60505, 60508, 60511, 60514, 60517, \r
+    60520, 60523, 60526, 60529, 60532, 60535, 60538, 60541, 60544, 60547, \r
+    60550, 60553, 60556, 60559, 60562, 60565, 60568, 60571, 60574, 60577, \r
+    60580, 60583, 60586, 60589, 60592, 60595, 60598, 60601, 60604, 60607, \r
+    60610, 60613, 60616, 60619, 60622, 60625, 60628, 60631, 60634, 60637, \r
+    60640, 60643, 60646, 60649, 60657, 60664, 60671, 60678, 60685, 60692, \r
+    60699, 60706, 60713, 60720, 60728, 60736, 60744, 60752, 60760, 60768, \r
+    60776, 60784, 60792, 60800, 60808, 60816, 60824, 60832, 60840, 60843, \r
+    60846, 60849, 60851, 60854, 60857, 60860, 60865, 60870, 60873, 60880, \r
+    60887, 60894, 60901, 60904, 60909, 60911, 60915, 60917, 60919, 60922, \r
+    60925, 60928, 60931, 60934, 60937, 60940, 60945, 60950, 60953, 60956, \r
+    60959, 60962, 60965, 60968, 60971, 60975, 60978, 60981, 60984, 60987, \r
+    60990, 60994, 60997, 61000, 61003, 61008, 61013, 61018, 61023, 61028, \r
+    61033, 61038, 61043, 61048, 61056, 61058, 61061, 61064, 61067, 61070, \r
+    61075, 61083, 61086, 61089, 61093, 61096, 61099, 61102, 61107, 61110, \r
+    61113, 61118, 61121, 61124, 61129, 61132, 61135, 61140, 61145, 61150, \r
+    61153, 61156, 61159, 61162, 61168, 61171, 61174, 61177, 61179, 61182, \r
+    61185, 61188, 61193, 61196, 61199, 61202, 61205, 61208, 61213, 61216, \r
+    61219, 61222, 61225, 61228, 61231, 61234, 61237, 61240, 61245, 61249, \r
+    61256, 61263, 61270, 61277, 61284, 61291, 61298, 61305, 61312, 61320, \r
+    61328, 61336, 61344, 61352, 61360, 61368, 61376, 61384, 61392, 61400, \r
+    61408, 61416, 61424, 61432, 61440, 61448, 61456, 61464, 61472, 61480, \r
+    61488, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61491, 61499, \r
+    61507, 61517, 61523, 61527, 61531, 61537, 61543, 61548, 61552, 61556, \r
+    61560, 61564, 61570, 61574, 61578, 61582, 61592, 61596, 61600, 61606, \r
+    61610, 61616, 61620, 61624, 61630, 61636, 61642, 61650, 61658, 61662, \r
+    61666, 61670, 61676, 61680, 61689, 61695, 61699, 61703, 61707, 61711, \r
+    61715, 61719, 61726, 61732, 61738, 61742, 61748, 61752, 61758, 61766, \r
+    61776, 61780, 61788, 61792, 61798, 61806, 61814, 61818, 61822, 61828, \r
+    61833, 61839, 61845, 61849, 61853, 61856, 61860, 61864, 61868, 61872, \r
+    61876, 61880, 61884, 61887, 61891, 61895, 61899, 61903, 61907, 61911, \r
+    61914, 61918, 61922, 61925, 61929, 61933, 61937, 61941, 61945, 61949, \r
+    61953, 61957, 61961, 61965, 61969, 61973, 61977, 61981, 61985, 61989, \r
+    61993, 61997, 62001, 62005, 62009, 62013, 62017, 62021, 62025, 62029, \r
+    62033, 62037, 62041, 62045, 62049, 62053, 62057, 62061, 62065, 62069, \r
+    62073, 62077, 62081, 62085, 62089, 62093, 62097, 62101, 62104, 62108, \r
+    62112, 62116, 62120, 62124, 62128, 62132, 62136, 62140, 62144, 62148, \r
+    62152, 62156, 62160, 62164, 62168, 62172, 62176, 62180, 62184, 62188, \r
+    62192, 62196, 62200, 62204, 62208, 62212, 62216, 62220, 62224, 62228, \r
+    62232, 62236, 62240, 62244, 62248, 62252, 62256, 62260, 62264, 62268, \r
+    62272, 62276, 62280, 62284, 62288, 62292, 62296, 62300, 62304, 62308, \r
+    62312, 62316, 62320, 62324, 62328, 62332, 62336, 62340, 62344, 62348, \r
+    62352, 62356, 62360, 62364, 62368, 62372, 62376, 62380, 62384, 62388, \r
+    62392, 62396, 62400, 62404, 62408, 62412, 62416, 62420, 62424, 62428, \r
+    62432, 62436, 62440, 62444, 62448, 62452, 62456, 62460, 62464, 62468, \r
+    62472, 62476, 62480, 62484, 62488, 62492, 62496, 62500, 62504, 62508, \r
+    62512, 62516, 62520, 62524, 62528, 62532, 62536, 62540, 62544, 62548, \r
+    62552, 62556, 62560, 62564, 62568, 62572, 62575, 62579, 62583, 62587, \r
+    62591, 62595, 62599, 62603, 62607, 62611, 62615, 62619, 62623, 62627, \r
+    62631, 62635, 62639, 62643, 62647, 62651, 62655, 62659, 62663, 62667, \r
+    62671, 62675, 62679, 62683, 62687, 62691, 62695, 62699, 62703, 62707, \r
+    62711, 62715, 62719, 62723, 62727, 62731, 62735, 62739, 62743, 62747, \r
+    62751, 62755, 62759, 62763, 62767, 62771, 62775, 62779, 62783, 62787, \r
+    62791, 62795, 62799, 62803, 62807, 62811, 62815, 62819, 62823, 62827, \r
+    62831, 62835, 62839, 62843, 62847, 62851, 62855, 62859, 62863, 62867, \r
+    62871, 62875, 62879, 62883, 62887, 62891, 62895, 62899, 62903, 62907, \r
+    62911, 62915, 62919, 62923, 62927, 62931, 62935, 62939, 62943, 62947, \r
+    62951, 62955, 62959, 62963, 62967, 62971, 62975, 62979, 62983, 62987, \r
+    62991, 62995, 62999, 63003, 63007, 63011, 63015, 63019, 63023, 63027, \r
+    63031, 63035, 63038, 63042, 63046, 63050, 63054, 63058, 63062, 63066, \r
+    63070, 63074, 63078, 63082, 63086, 63090, 63094, 63098, 63102, 63106, \r
+    63110, 63114, 63118, 63122, 63126, 63130, 63134, 63138, 63142, 63146, \r
+    63150, 63154, 63158, 63162, 63166, 63170, 63174, 63178, 63182, 63186, \r
+    63190, 63194, 63198, 63202, 63206, 63210, 63214, 63218, 63222, 63226, \r
+    63230, 63234, 63238, 63242, 63246, 63250, 63254, 63258, 63262, 63266, \r
+    63270, 63274, 63278, 63282, 63286, 63290, 63294, 63298, 63302, 63306, \r
+    63310, 63314, 63318, 63322, 63326, 63330, 63334, 63338, 63342, 63346, \r
+    63350, 63354, 63358, 63362, 63366, 63370, 63374, 63378, 63382, 63386, \r
+    63390, 63394, 63397, 63401, 63405, 63409, 63413, 63417, 63421, 63425, \r
+    63429, 63433, 63437, 63441, 63445, 63449, 63453, 63457, 63461, 63465, \r
+    63469, 63473, 63477, 63481, 63485, 63489, 63493, 63497, 63501, 63505, \r
+    63509, 63513, 63517, 63521, 63525, 63529, 63533, 63537, 63541, 63545, \r
+    63549, 63553, 63557, 63561, 63565, 63569, 63573, 63577, 63581, 63585, \r
+    63589, 63593, 63597, 63601, 63605, 63609, 63613, 63617, 63621, 63625, \r
+    63629, 63633, 63637, 63641, 63645, 63649, 63653, 63657, 63661, 63665, \r
+    63669, 63673, 63677, 63681, 63685, 63689, 63693, 63697, 63701, 63705, \r
+    63709, 63713, 63717, 63721, 63725, 63729, 63733, 63737, 63741, 63745, \r
+    63749, 63753, 63757, 63761, 63765, 63769, 63773, 63777, 63781, 63785, \r
+    63789, 63793, 63797, 63801, 63805, 63809, 63813, 63817, 63821, 63825, \r
+    63829, 63833, 63837, 63841, 63845, 63849, 63853, 63857, 63861, 63865, \r
+    63869, 63873, 63877, 63881, 63885, 63889, 63892, 63896, 63900, 63904, \r
+    63908, 63912, 63916, 63920, 63924, 63928, 63932, 63936, 63940, 63944, \r
+    63948, 63952, 63956, 63960, 63964, 63968, 63972, 63976, 63980, 63984, \r
+    63988, 63992, 63996, 64000, 64004, 64008, 64012, 64016, 64020, 64024, \r
+    64028, 64032, 64036, 64040, 64044, 64048, 64052, 64056, 64060, 64064, \r
+    64068, 64072, 64076, 64080, 64084, 64088, 64092, 64096, 64100, 64104, \r
+    64108, 64112, 64116, 64120, 64124, 64128, 64132, 64136, 64140, 64144, \r
+    64148, 64152, 64156, 64160, 64164, 64168, 64172, 64176, 64180, 64184, \r
+    64188, 64192, 64196, 64200, 64204, 64208, 64212, 64216, 64220, 64224, \r
+    64228, 64232, 64236, 64240, 64244, 64248, 64252, 64256, 64260, 64264, \r
+    64268, 64272, 64276, 64280, 64284, 64288, 64292, 64296, 64300, 64304, \r
+    64308, 64312, 64316, 64320, 64324, 64328, 64332, 64336, 64340, 64344, \r
+    64347, 64351, 64355, 64359, 64363, 64367, 64371, 64375, 64379, 64383, \r
+    64387, 64391, 64395, 64399, 64403, 64407, 64411, 64415, 64419, 64423, \r
+    64427, 64431, 64435, 64439, 64443, 64447, 64451, 64455, 64459, 64463, \r
+    64467, 64471, 64475, 64479, 64483, 64487, 64491, 64495, 64499, 64503, \r
+    64507, 64511, 64515, 64519, 64523, 64527, 64531, 64535, 64539, 64543, \r
+    64547, 64551, 64555, 64559, 64563, 64567, 64571, 64575, 64579, 64583, \r
+    64587, 64591, 64595, 64599, 64603, 64607, 64611, 64615, 64619, 64623, \r
+    64627, 64631, 64635, 64639, 64643, 64647, 64651, 64655, 64659, 64663, \r
+    64667, 64671, 64675, 64679, 64683, 64687, 64691, 64695, 64699, 64703, \r
+    64707, 64711, 64715, 64719, 64723, 64727, 64731, 64735, 64739, 64743, \r
+    64747, 64751, 64755, 64759, 64763, 64767, 64771, 64775, 64779, 64783, \r
+    64787, 64791, 64795, 64799, 64803, 64807, 64811, 64815, 64819, 64823, \r
+    64827, 64831, 64835, 64839, 64843, 64847, 64851, 64855, 64859, 64863, \r
+    64867, 64871, 64875, 64879, 64883, 64887, 64891, 64895, 64899, 64903, \r
+    64907, 64911, 64915, 64919, 64923, 64927, 64931, 64935, 64939, 64943, \r
+    64947, 64950, 64954, 64958, 64962, 64966, 64970, 64974, 64978, 64982, \r
+    64986, 64990, 64994, 64998, 65002, 65006, 65010, 65014, 65018, 65022, \r
+    65026, 65030, 65034, 65038, 65042, 65046, 65050, 65054, 65058, 65062, \r
+    65066, 65070, 65074, 65078, 65082, 65086, 65090, 65094, 65098, 65102, \r
+    65106, 65110, 65114, 65118, 65122, 65126, 65130, 65134, 65138, 65142, \r
+    65146, 65150, 65154, 65158, 65162, 65166, 65170, 65174, 65178, 65182, \r
+    65186, 65190, 65194, 65198, 65202, 65206, 65210, 65214, 65218, 65222, \r
+    65226, 65230, 65234, 65238, 65242, 65246, 65250, 65254, 65258, 65262, \r
+    65266, 65270, 65274, 65278, 65282, 65286, 65290, 65294, 65298, 65302, \r
+    65306, 65310, 65314, 65318, 65322, 65326, 65330, 65334, 65338, 65342, \r
+    65346, 65350, 65354, 65358, 65362, 65366, 65370, 65374, 65378, 65382, \r
+    65386, 65390, 65394, 65398, 65402, 65406, 65410, 65414, 65418, 65422, \r
+    65426, 65430, 65434, 65438, 65442, 65446, 65450, 65454, 65458, 65462, \r
+    65466, 65470, 65474, 65478, 65482, 65486, 65490, 65494, 65498, 65502, \r
+    65506, 65510, 65514, 65518, 65522, 65526, 65530, 65534, 65538, 65542, \r
+    65546, 65550, 65554, 65558, 65562, 65566, 65570, 65574, 65578, 65582, \r
+    65586, 65590, 65594, 65598, 65602, 65606, 65610, 65614, 65618, 65622, \r
+    65626, 65630, 65634, 65638, 65642, 65646, 65650, 65654, 65658, 65662, \r
+    65666, 65670, 65674, 65678, 65682, 65686, 65690, 65694, 65698, 65702, \r
+    65706, 65709, 65713, 65717, 65721, 65725, 65729, 65733, 65737, 65741, \r
+    65745, 65749, 65753, 65757, 65761, 65765, 65769, 65773, 65777, 65781, \r
+    65785, 65789, 65793, 65797, 65801, 65805, 65809, 65813, 65817, 65821, \r
+    65825, 65829, 65833, 65837, 65841, 65845, 65849, 65853, 65857, 65861, \r
+    65865, 65869, 65873, 65877, 65881, 65885, 65889, 65893, 65897, 65901, \r
+    65905, 65909, 65913, 65917, 65921, 65925, 65929, 65933, 65937, 65941, \r
+    65945, 65949, 65953, 65957, 65961, 65965, 65969, 65973, 65977, 65981, \r
+    65985, 65989, 65993, 65997, 66001, 66005, 66009, 66013, 66017, 66021, \r
+    66025, 66029, 66033, 66037, 66041, 66045, 66049, 66053, 66057, 66061, \r
+    66065, 66069, 66073, 66077, 66081, 66085, 66089, 66093, 66097, 66101, \r
+    66105, 66109, 66113, 66117, 66121, 66125, 66129, 66133, 66137, 66141, \r
+    66145, 66149, 66153, 66157, 66161, 66165, 66169, 66173, 66177, 66181, \r
+    66185, 66189, 66193, 66197, 66201, 66205, 66209, 66213, 66217, 66221, \r
+    66225, 66229, 66233, 66237, 66241, 66245, 66249, 66253, 66257, 66261, \r
+    66265, 66269, 66273, 66277, 66281, 66285, 66289, 66293, 66297, 66301, \r
+    66305, 66309, 66313, 66317, 66321, 66325, 66329, 66333, 66337, 66341, \r
+    66345, 66349, 66353, 66357, 66361, 66365, 66369, 66373, 66377, 66381, \r
+    66385, 66389, 66393, 66397, 66401, 66405, 66409, 66413, 66417, 66421, \r
+    66425, 66429, 66433, 66437, 66441, 66445, 66449, 66453, 66457, 66461, \r
+    66465, 66469, 66473, 66477, 66481, 66485, 66489, 0, 0, 0, 66493, 66497, \r
+    66501, 66505, 66509, 66513, 66517, 66521, 66525, 66529, 66533, 66537, \r
+    66541, 66545, 66549, 66553, 66557, 66561, 66565, 66569, 66573, 66577, \r
+    66581, 66585, 66589, 66593, 66597, 66601, 66605, 66609, 66613, 66617, \r
+    66621, 66625, 66629, 66633, 66637, 66641, 66645, 66649, 66653, 66657, \r
+    66661, 66665, 66669, 66673, 66677, 66681, 66685, 66689, 66693, 66697, \r
+    66701, 66705, 66709, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66713, 66718, 66722, \r
+    66727, 66732, 66737, 66742, 66747, 66751, 66756, 66761, 66766, 66771, \r
+    66776, 66781, 66786, 66790, 66794, 66799, 66804, 66809, 66814, 66819, \r
+    66823, 66828, 66833, 66838, 66843, 66848, 66852, 66857, 66861, 66866, \r
+    66870, 66875, 66879, 66883, 66887, 66892, 66897, 66902, 66910, 66918, \r
+    66926, 66934, 66941, 66949, 66955, 66963, 66967, 66971, 66975, 66979, \r
+    66983, 66987, 66991, 66995, 66999, 67003, 67007, 67011, 67015, 67019, \r
+    67023, 67027, 67031, 67035, 67039, 67043, 67047, 67051, 67055, 67059, \r
+    67063, 67067, 67071, 67075, 67079, 67083, 67087, 67091, 67095, 67099, \r
+    67103, 67107, 67110, 67114, 67118, 67122, 67126, 67130, 67134, 67138, \r
+    67142, 67146, 67150, 67154, 67158, 67162, 67166, 67170, 67174, 67178, \r
+    67182, 67186, 67190, 67194, 67198, 67202, 67206, 67210, 67214, 67218, \r
+    67222, 67226, 67230, 67234, 67238, 67242, 67246, 67250, 67254, 67257, \r
+    67261, 67265, 67268, 67272, 67276, 67280, 67283, 67287, 67291, 67295, \r
+    67299, 67303, 67307, 67311, 67315, 67319, 67323, 67327, 67331, 67335, \r
+    67339, 67342, 67346, 67350, 67354, 67358, 67362, 67366, 67370, 67374, \r
+    67378, 67381, 67384, 67388, 67392, 67396, 67399, 67402, 67406, 67410, \r
+    67414, 67418, 67422, 67426, 67430, 67434, 67438, 67442, 67446, 67450, \r
+    67454, 67458, 67462, 67466, 67470, 67474, 67478, 67482, 67486, 67490, \r
+    67494, 67498, 67502, 67506, 67510, 67514, 67518, 67522, 67526, 67530, \r
+    67534, 67538, 67542, 67546, 67550, 67553, 67557, 67561, 67565, 67569, \r
+    67573, 67577, 67581, 67585, 67589, 67593, 67597, 67601, 67605, 67609, \r
+    67613, 67617, 67621, 67625, 67629, 67633, 67637, 67641, 67645, 67649, \r
+    67653, 67657, 67661, 67665, 67669, 67673, 67677, 67681, 67685, 67689, \r
+    67693, 67697, 67700, 67704, 67708, 67712, 67716, 67720, 67724, 67728, \r
+    67732, 67736, 67740, 67744, 67748, 67752, 67756, 67760, 67764, 67767, \r
+    67771, 67775, 67779, 67783, 67787, 67791, 67795, 67799, 67803, 67807, \r
+    67811, 67815, 67819, 67823, 67827, 67831, 67835, 67839, 67843, 67847, \r
+    67851, 67854, 67858, 67862, 67866, 67870, 67874, 67878, 67882, 67886, \r
+    67890, 67894, 67898, 67902, 67906, 67910, 67914, 67918, 67922, 67926, \r
+    67930, 67934, 67938, 67942, 67946, 67950, 67954, 67958, 67962, 67966, \r
+    67970, 67974, 67978, 67982, 67986, 67990, 67994, 67998, 68002, 68006, \r
+    68010, 68014, 68018, 68022, 68026, 68029, 68034, 68038, 68044, 68049, \r
+    68055, 68059, 68063, 68067, 68071, 68075, 68079, 68083, 68087, 68091, \r
+    68095, 68099, 68103, 68107, 68111, 68114, 68117, 68120, 68123, 68126, \r
+    68129, 68132, 68135, 68138, 68143, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 68149, 68154, 68159, 68164, 68169, 68175, 68181, \r
+    68186, 68191, 68196, 68201, 68208, 68215, 68222, 68229, 68236, 68243, \r
+    68253, 68263, 68270, 68277, 68283, 68289, 68295, 68301, 68310, 68319, \r
+    68326, 68333, 68344, 68355, 68360, 0, 0, 68365, 68372, 68379, 68386, \r
+    68393, 68400, 68407, 68413, 68419, 68425, 68431, 68438, 68445, 68450, \r
+    68454, 68461, 68468, 68475, 0, 0, 0, 0, 0, 0, 0, 0, 68479, 68483, 68487, \r
+    68490, 68493, 68498, 68503, 68508, 68513, 68518, 68523, 68528, 68533, \r
+    68538, 68543, 68552, 68561, 68566, 68571, 68576, 68581, 68586, 68591, \r
+    68596, 68601, 68606, 68611, 68616, 0, 0, 0, 0, 0, 0, 0, 0, 68621, 68624, \r
+    68627, 68630, 68634, 68638, 68642, 68646, 68649, 68653, 68656, 68660, \r
+    68663, 68667, 68671, 68675, 68679, 68683, 68687, 68691, 68694, 68698, \r
+    68702, 68706, 68710, 68714, 68718, 68722, 68726, 68730, 68734, 68738, \r
+    68742, 68746, 68750, 68753, 68757, 68761, 68765, 68769, 68773, 68777, \r
+    68781, 68785, 68789, 68793, 68797, 68801, 68805, 68809, 68813, 68817, \r
+    68821, 68825, 68829, 68833, 68837, 68841, 68845, 68849, 68852, 68856, \r
+    68860, 68864, 68868, 68872, 68876, 68880, 68883, 68887, 68891, 68895, \r
+    68899, 68903, 68907, 68911, 68915, 68919, 68923, 68927, 68931, 68936, \r
+    68941, 68944, 68949, 68952, 68955, 68958, 0, 0, 0, 0, 0, 0, 0, 0, 68962, \r
+    68971, 68980, 68989, 68998, 69007, 69016, 69025, 69034, 69042, 69049, \r
+    69057, 69064, 69072, 69082, 69091, 69101, 69110, 69120, 69128, 69135, \r
+    69143, 69150, 69158, 69163, 69168, 69173, 69182, 69188, 69194, 69201, \r
+    69210, 69218, 69226, 69234, 69241, 69248, 69255, 69262, 69267, 69272, \r
+    69277, 69282, 69287, 69292, 69297, 69302, 69310, 69318, 69324, 69329, \r
+    69334, 69339, 69344, 69349, 69354, 69359, 69364, 69369, 69377, 69385, \r
+    69390, 69395, 69404, 69413, 69420, 69427, 69436, 69445, 69456, 69467, \r
+    69473, 69479, 69487, 69495, 69504, 69513, 69520, 69527, 69532, 69537, \r
+    69548, 69559, 69567, 69575, 69585, 69595, 69606, 69617, 69626, 69635, \r
+    69642, 69649, 69656, 69663, 69672, 69681, 69686, 69691, 69698, 69705, \r
+    69712, 69719, 69730, 69741, 69746, 69751, 69756, 69761, 69766, 69771, \r
+    69776, 69781, 69785, 69790, 69795, 69800, 69805, 69810, 69816, 69821, \r
+    69826, 69833, 69840, 69847, 69854, 69861, 69869, 69877, 69882, 69887, \r
+    69893, 69899, 69905, 69911, 69918, 69925, 69932, 69936, 69943, 69948, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 69953, 69960, 69967, 69974, 69982, \r
+    69989, 69995, 70001, 70008, 70014, 70020, 70026, 70033, 70040, 70047, \r
+    70054, 70061, 70068, 70075, 70082, 70089, 70096, 70103, 70110, 70117, \r
+    70124, 70130, 70137, 70144, 70151, 70158, 70165, 70172, 70179, 70186, \r
+    70193, 70200, 70207, 70214, 70221, 70228, 70235, 70242, 70249, 70256, \r
+    70264, 70272, 70280, 70288, 0, 0, 0, 0, 70296, 70305, 70314, 70323, \r
+    70332, 70341, 70350, 70357, 70364, 70371, 0, 0, 0, 0, 0, 0, 70378, 70382, \r
+    70387, 70392, 70397, 70402, 70407, 70412, 70417, 70422, 70427, 70432, \r
+    70436, 70440, 70445, 70450, 70454, 70459, 70464, 70469, 70474, 70479, \r
+    70484, 70489, 70493, 70497, 70502, 70507, 70512, 70516, 70520, 70524, \r
+    70528, 70532, 70536, 70541, 70546, 70551, 70556, 70561, 70568, 70574, \r
+    70579, 70584, 70589, 70594, 70600, 70607, 70613, 70620, 70626, 70632, \r
+    70637, 70644, 70650, 70655, 0, 0, 0, 0, 0, 0, 0, 0, 70661, 70665, 70669, \r
+    70672, 70676, 70679, 70683, 70686, 70690, 70694, 70699, 70703, 70708, \r
+    70711, 70715, 70719, 70722, 70726, 70730, 70733, 70737, 70741, 70745, \r
+    70749, 70753, 70757, 70761, 70765, 70769, 70773, 70777, 70781, 70785, \r
+    70789, 70793, 70797, 70801, 70805, 70808, 70811, 70815, 70819, 70823, \r
+    70826, 70829, 70832, 70836, 70840, 70844, 70848, 70852, 70855, 70859, \r
+    70865, 70870, 70874, 70879, 70883, 70888, 70893, 70899, 70904, 70910, \r
+    70914, 70919, 70924, 70928, 70933, 70938, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    70942, 70945, 70949, 70953, 70956, 70959, 70962, 70965, 70968, 70971, \r
+    70974, 70977, 0, 0, 0, 0, 0, 0, 70980, 70985, 70989, 70993, 70997, 71001, \r
+    71005, 71009, 71013, 71017, 71021, 71025, 71029, 71033, 71037, 71041, \r
+    71045, 71050, 71055, 71061, 71067, 71074, 71079, 71084, 71090, 71094, \r
+    71099, 71102, 0, 0, 0, 0, 71105, 71112, 71118, 71124, 71130, 71136, \r
+    71142, 71148, 71154, 71160, 71166, 71172, 71179, 71186, 71193, 71200, \r
+    71207, 71214, 71221, 71228, 71235, 71241, 71247, 71254, 71260, 71267, \r
+    71274, 71280, 71286, 71293, 71300, 71307, 71313, 71320, 71327, 71333, \r
+    71340, 71346, 71353, 71360, 71366, 71372, 71379, 71385, 71392, 71399, \r
+    71408, 71415, 71422, 71426, 71431, 71436, 71441, 71446, 71450, 71454, \r
+    71459, 71463, 71468, 71473, 71478, 71483, 71487, 71492, 71496, 71501, \r
+    71505, 71510, 71515, 71520, 71525, 71529, 71534, 71539, 71544, 71550, \r
+    71555, 71561, 71567, 71573, 71580, 71586, 71592, 71599, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 71603, 71608, 71612, 71616, 71620, 71624, 71628, 71632, \r
+    71636, 71640, 71644, 71648, 71652, 71656, 71660, 71664, 71668, 71672, \r
+    71676, 71680, 71684, 71688, 71692, 71696, 71700, 71704, 71708, 71712, \r
+    71716, 71720, 0, 0, 0, 71724, 71728, 71732, 71736, 71740, 71743, 71749, \r
+    71752, 71756, 71759, 71765, 71771, 71779, 71782, 71786, 71789, 71792, \r
+    71797, 71802, 71806, 71812, 71816, 71820, 71826, 71830, 71836, 71842, \r
+    71846, 71850, 71856, 71860, 71866, 71872, 71876, 71882, 71886, 71892, \r
+    71895, 71898, 71904, 71908, 71914, 71917, 71920, 71923, 71929, 71933, \r
+    71937, 71943, 71949, 71953, 71956, 71962, 71967, 71972, 71977, 71984, \r
+    71989, 71996, 72001, 72008, 72013, 72019, 72025, 72031, 72034, 72038, \r
+    72042, 72047, 72052, 72057, 72062, 72067, 72072, 72077, 72082, 72089, \r
+    72094, 0, 72100, 72103, 72107, 72110, 72113, 72116, 72119, 72122, 72125, \r
+    72128, 72131, 0, 0, 0, 0, 72134, 72141, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72146, \r
+    72149, 72152, 72155, 72158, 72162, 72165, 72168, 72172, 72176, 72180, \r
+    72184, 72188, 72192, 72196, 72200, 72204, 72208, 72212, 72216, 72220, \r
+    72224, 72228, 72232, 72236, 72239, 72243, 72246, 72250, 72254, 72258, \r
+    72262, 72266, 72269, 72273, 72276, 72279, 72283, 72287, 72291, 72295, \r
+    72298, 72303, 72307, 72312, 72317, 72321, 72326, 72330, 72335, 72340, \r
+    72345, 72350, 72355, 72361, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72367, 72372, \r
+    72377, 72382, 72389, 72394, 72399, 72403, 72408, 72413, 72417, 72421, \r
+    72426, 72432, 0, 0, 72439, 72443, 72446, 72449, 72452, 72455, 72458, \r
+    72461, 72464, 72467, 0, 0, 72470, 72475, 72480, 72486, 72493, 72499, \r
+    72505, 72511, 72517, 72523, 72529, 72535, 72541, 72547, 72553, 72559, \r
+    72564, 72570, 72575, 72581, 72587, 72594, 72600, 72606, 72611, 72618, \r
+    72625, 72632, 72638, 72643, 72648, 72653, 0, 0, 0, 0, 72661, 72667, \r
+    72673, 72679, 72685, 72691, 72697, 72703, 72709, 72715, 72721, 72727, \r
+    72733, 72739, 72745, 72751, 72757, 72763, 72769, 72775, 72781, 72786, \r
+    72791, 72797, 72803, 72809, 72815, 72821, 72827, 72833, 72839, 72845, \r
+    72851, 72857, 72863, 72869, 72875, 72881, 72887, 72893, 72899, 72905, \r
+    72911, 72917, 72923, 72929, 72935, 72940, 72945, 72951, 72956, 72960, \r
+    72965, 72969, 72973, 72977, 72983, 72988, 72993, 72998, 73003, 73008, \r
+    73013, 73018, 73025, 73032, 73039, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73046, 73051, 73056, 73061, 73068, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73075, \r
+    73082, 73089, 73096, 73103, 73109, 73115, 73122, 73129, 73136, 73143, \r
+    73150, 73157, 73164, 73171, 73178, 73184, 73191, 73198, 73205, 73212, \r
+    73219, 73226, 73233, 73240, 73247, 73254, 73261, 73270, 73279, 73288, \r
+    73297, 73306, 73315, 73324, 73333, 73341, 73349, 73357, 73365, 73373, \r
+    73381, 73389, 73397, 73403, 73411, 0, 0, 73419, 73426, 73432, 73438, \r
+    73444, 73450, 73456, 73462, 73468, 73474, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73480, 73484, \r
+    73488, 73492, 73496, 73500, 73504, 73508, 73512, 73516, 73520, 73524, \r
+    73528, 73532, 73536, 73540, 73544, 73548, 73552, 73556, 73560, 73564, \r
+    73568, 0, 0, 0, 0, 73572, 73576, 73580, 73584, 73588, 73592, 73596, \r
+    73600, 73604, 73608, 73612, 73616, 73620, 73624, 73628, 73632, 73636, \r
+    73640, 73644, 73648, 73652, 73656, 73660, 73664, 73668, 73672, 73676, \r
+    73680, 73684, 73688, 73692, 73696, 73700, 73704, 73708, 73712, 73716, \r
+    73720, 73724, 73728, 73732, 73736, 73740, 73744, 73748, 73752, 73756, \r
+    73760, 73764, 0, 0, 0, 0, 73768, 73772, 73776, 73780, 73784, 73788, \r
+    73792, 73796, 73800, 73804, 73808, 73812, 73816, 73820, 73824, 73828, \r
+    73832, 73836, 73840, 73844, 73848, 73852, 73856, 73860, 73864, 73868, \r
+    73872, 73876, 73880, 73884, 73888, 73892, 73896, 73900, 73904, 73908, \r
+    73912, 73916, 73920, 73924, 73928, 73932, 73936, 73940, 73944, 73948, \r
+    73952, 73956, 73960, 73964, 73968, 73972, 73976, 73980, 73984, 73988, \r
+    73992, 73996, 74000, 74004, 74008, 74012, 74016, 74020, 74024, 74028, \r
+    74032, 74036, 74040, 74044, 74048, 74052, 74056, 74060, 74064, 74068, \r
+    74072, 74076, 74080, 74084, 74088, 74092, 74096, 74100, 74104, 74108, \r
+    74112, 74116, 74120, 74124, 74128, 74132, 74136, 74140, 74144, 74148, \r
+    74152, 74156, 74160, 74164, 74168, 74172, 74176, 74180, 74184, 74188, \r
+    74192, 74196, 74200, 74204, 74208, 74212, 74216, 74220, 74224, 74228, \r
+    74232, 74236, 74240, 74244, 74248, 74252, 74256, 74260, 74264, 74268, \r
+    74272, 74276, 74280, 74284, 74288, 74292, 74296, 74300, 74304, 74308, \r
+    74312, 74316, 74320, 74324, 74328, 74332, 74336, 74340, 74344, 74348, \r
+    74352, 74356, 74360, 74364, 74368, 74372, 74376, 74380, 74384, 74388, \r
+    74392, 74396, 74400, 74404, 74408, 74412, 74416, 74420, 74424, 74428, \r
+    74432, 74436, 74440, 74444, 74448, 74452, 74456, 74460, 74464, 74468, \r
+    74472, 74476, 74480, 74484, 74488, 74492, 74496, 74500, 74504, 74508, \r
+    74512, 74516, 74520, 74524, 74528, 74532, 74536, 74540, 74544, 74548, \r
+    74552, 74556, 74560, 74564, 74568, 74572, 74576, 74580, 74584, 74588, \r
+    74592, 74596, 74600, 74604, 74608, 74612, 74616, 74620, 74624, 74628, \r
+    74632, 74636, 74640, 74644, 74648, 74652, 74656, 74660, 74664, 74668, \r
+    74672, 74676, 74680, 74684, 74688, 74692, 74696, 74700, 74704, 74708, \r
+    74712, 74716, 74720, 74724, 74728, 74732, 74736, 74740, 74744, 74748, \r
+    74752, 74756, 74760, 74764, 74768, 74772, 74776, 74780, 74784, 74788, \r
+    74792, 74796, 74800, 74804, 74808, 74812, 74816, 74820, 74824, 74828, \r
+    74832, 74836, 74840, 74844, 74848, 74852, 74856, 74860, 74864, 74868, \r
+    74872, 74876, 74880, 74884, 74888, 74892, 74896, 74900, 74904, 74908, \r
+    74912, 74916, 74920, 74924, 74928, 74932, 74936, 74940, 74944, 74948, \r
+    74952, 74956, 74960, 74964, 74968, 74972, 0, 0, 74976, 74980, 74984, \r
+    74988, 74992, 74996, 75000, 75004, 75008, 75012, 75016, 75020, 75024, \r
+    75028, 75032, 75036, 75040, 75044, 75048, 75052, 75056, 75060, 75064, \r
+    75068, 75072, 75076, 75080, 75084, 75088, 75092, 75096, 75100, 75104, \r
+    75108, 75112, 75116, 75120, 75124, 75128, 75132, 75136, 75140, 75144, \r
+    75148, 75152, 75156, 75160, 75164, 75168, 75172, 75176, 75180, 75184, \r
+    75188, 75192, 75196, 75200, 75204, 75208, 75212, 75216, 75220, 0, 0, \r
+    75224, 75228, 75232, 75236, 75240, 75244, 75248, 75252, 75256, 75260, \r
+    75264, 75268, 75272, 75276, 75280, 75284, 75288, 75292, 75296, 75300, \r
+    75304, 75308, 75312, 75316, 75320, 75324, 75328, 75332, 75336, 75340, \r
+    75344, 75348, 75352, 75356, 75360, 75364, 75368, 75372, 75376, 75380, \r
+    75384, 75388, 75392, 75396, 75400, 75404, 75408, 75412, 75416, 75420, \r
+    75424, 75428, 75432, 75436, 75440, 75444, 75448, 75452, 75456, 75460, \r
+    75464, 75468, 75472, 75476, 75480, 75484, 75488, 75492, 75496, 75500, \r
+    75504, 75508, 75512, 75516, 75520, 75524, 75528, 75532, 75536, 75540, \r
+    75544, 75548, 75552, 75556, 75560, 75564, 75568, 75572, 75576, 75580, \r
+    75584, 75588, 75592, 75596, 75600, 75604, 75608, 75612, 75616, 75620, \r
+    75624, 75628, 75632, 75636, 75640, 75644, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 75648, 75653, 75658, 75663, 75668, 75673, 75681, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 75686, 75693, 75700, 75707, 75714, 0, 0, 0, 0, 0, \r
+    75721, 75728, 75735, 75745, 75751, 75757, 75763, 75769, 75775, 75781, \r
+    75788, 75794, 75800, 75806, 75815, 75824, 75836, 75848, 75854, 75860, \r
+    75866, 75873, 75880, 75887, 75894, 75901, 0, 75908, 75915, 75922, 75930, \r
+    75937, 0, 75944, 0, 75951, 75958, 0, 75965, 75973, 0, 75980, 75987, \r
+    75994, 76001, 76008, 76015, 76022, 76029, 76036, 76043, 76048, 76055, \r
+    76062, 76068, 76074, 76080, 76086, 76092, 76098, 76104, 76110, 76116, \r
+    76122, 76128, 76134, 76140, 76146, 76152, 76158, 76164, 76170, 76176, \r
+    76182, 76188, 76194, 76200, 76206, 76212, 76218, 76224, 76230, 76236, \r
+    76242, 76248, 76254, 76260, 76266, 76272, 76278, 76284, 76290, 76296, \r
+    76302, 76308, 76314, 76320, 76326, 76332, 76338, 76344, 76350, 76356, \r
+    76362, 76368, 76374, 76380, 76386, 76392, 76398, 76404, 76410, 76416, \r
+    76422, 76428, 76434, 76440, 76446, 76452, 76458, 76464, 76470, 76476, \r
+    76482, 76488, 76494, 76500, 76506, 76512, 76518, 76526, 76534, 76540, \r
+    76546, 76552, 76558, 76567, 76576, 76584, 76592, 76600, 76608, 76616, \r
+    76624, 76632, 76640, 76647, 76654, 76664, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    76674, 76680, 76686, 76692, 76698, 76703, 76708, 76714, 76720, 76726, \r
+    76732, 76740, 76746, 76752, 76760, 76768, 76776, 76784, 76789, 76794, \r
+    76799, 76804, 76816, 76828, 76838, 76848, 76859, 76870, 76881, 76892, \r
+    76902, 76912, 76923, 76934, 76945, 76956, 76966, 76976, 76986, 77001, \r
+    77016, 77031, 77038, 77045, 77052, 77059, 77069, 77079, 77089, 77100, \r
+    77110, 77118, 77126, 77135, 77143, 77152, 77160, 77168, 77176, 77185, \r
+    77193, 77202, 77210, 77218, 77226, 77235, 77243, 77250, 77257, 77264, \r
+    77271, 77279, 77287, 77295, 77303, 77311, 77320, 77328, 77336, 77344, \r
+    77352, 77360, 77369, 77377, 77385, 77393, 77401, 77409, 77417, 77425, \r
+    77433, 77441, 77449, 77458, 77466, 77475, 77483, 77491, 77499, 77508, \r
+    77516, 77524, 77532, 77540, 77549, 77558, 77566, 77575, 77583, 77591, \r
+    77599, 77608, 77616, 77625, 77633, 77640, 77647, 77655, 77662, 77670, \r
+    77677, 77685, 77693, 77702, 77710, 77719, 77727, 77735, 77743, 77752, \r
+    77760, 77767, 77774, 77782, 77789, 77797, 77804, 77814, 77824, 77834, \r
+    77843, 77852, 77861, 77870, 77879, 77889, 77900, 77911, 77921, 77932, \r
+    77943, 77953, 77962, 77971, 77979, 77988, 77997, 78005, 78014, 78023, \r
+    78031, 78040, 78049, 78057, 78066, 78075, 78083, 78092, 78101, 78109, \r
+    78118, 78126, 78135, 78143, 78151, 78160, 78168, 78177, 78185, 78193, \r
+    78202, 78210, 78217, 78224, 78233, 78242, 78250, 78259, 78268, 78276, \r
+    78286, 78294, 78302, 78309, 78317, 78325, 78332, 78342, 78352, 78363, \r
+    78373, 78384, 78392, 78400, 78409, 78417, 78426, 78434, 78442, 78451, \r
+    78459, 78468, 78476, 78483, 78490, 78497, 78504, 78512, 78520, 78528, \r
+    78536, 78545, 78553, 78561, 78570, 78578, 78586, 78594, 78603, 78611, \r
+    78619, 78627, 78635, 78643, 78651, 78659, 78667, 78675, 78684, 78692, \r
+    78700, 78708, 78716, 78724, 78733, 78742, 78750, 78758, 78766, 78775, \r
+    78783, 78792, 78799, 78806, 78814, 78821, 78829, 78837, 78846, 78854, \r
+    78863, 78871, 78879, 78889, 78896, 78903, 78911, 78918, 78926, 78936, \r
+    78947, 78955, 78964, 78972, 78981, 78989, 78998, 79006, 79015, 79023, \r
+    79032, 79041, 79049, 79057, 79065, 79074, 79081, 79089, 79098, 79107, \r
+    79116, 79125, 79133, 79142, 79150, 79159, 79167, 79176, 79184, 79193, \r
+    79201, 79209, 79216, 79224, 79231, 79240, 79248, 79257, 79265, 79274, \r
+    79282, 79290, 79298, 79307, 79315, 79324, 79333, 79342, 79351, 79360, \r
+    79368, 79377, 79385, 79394, 79402, 79411, 79419, 79428, 79436, 79444, \r
+    79451, 79459, 79466, 79475, 79483, 79492, 79500, 79509, 79517, 79525, \r
+    79533, 79542, 79550, 79559, 79568, 79577, 79586, 79594, 79602, 79611, \r
+    79619, 79628, 79637, 79645, 79653, 79661, 79670, 79678, 79686, 79695, \r
+    79703, 79711, 79719, 79727, 79732, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 79737, 79747, 79757, 79767, 79777, 79788, 79798, 79808, 79819, \r
+    79828, 79837, 79846, 79856, 79866, 79876, 79887, 79897, 79907, 79917, \r
+    79927, 79937, 79947, 79957, 79967, 79977, 79987, 79997, 80008, 80019, \r
+    80029, 80039, 80050, 80061, 80072, 80082, 80092, 80102, 80112, 80122, \r
+    80132, 80142, 80153, 80163, 80173, 80184, 80195, 80206, 80216, 80226, \r
+    80236, 80246, 80257, 80267, 80277, 80288, 80299, 80309, 80319, 80328, \r
+    80337, 80346, 80355, 80364, 80374, 0, 0, 80384, 80394, 80404, 80414, \r
+    80424, 80435, 80445, 80455, 80466, 80476, 80487, 80496, 80505, 80516, \r
+    80526, 80537, 80548, 80560, 80570, 80581, 80590, 80600, 80610, 80622, \r
+    80632, 80642, 80652, 80662, 80672, 80681, 80690, 80699, 80708, 80718, \r
+    80728, 80738, 80748, 80758, 80768, 80778, 80788, 80798, 80808, 80818, \r
+    80828, 80837, 80846, 80855, 80865, 80875, 80885, 80895, 80905, 80916, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 80926, 80941, 80956, 80962, \r
+    80968, 80974, 80980, 80986, 80992, 80998, 81004, 81012, 81016, 81019, 0, \r
+    0, 81027, 81030, 81033, 81036, 81039, 81042, 81045, 81048, 81051, 81054, \r
+    81057, 81060, 81063, 81066, 81069, 81072, 81075, 81083, 81092, 81103, \r
+    81111, 81119, 81128, 81137, 81148, 81160, 0, 0, 0, 0, 0, 0, 81169, 81174, \r
+    81179, 81186, 81193, 81199, 81205, 0, 0, 0, 0, 0, 0, 0, 0, 0, 81210, \r
+    81220, 81230, 81240, 81249, 81260, 81269, 81278, 81288, 81298, 81310, \r
+    81322, 81333, 81344, 81355, 81366, 81376, 81386, 81396, 81406, 81417, \r
+    81428, 81432, 81437, 81446, 81455, 81459, 81463, 81467, 81472, 81477, \r
+    81482, 81487, 81490, 81494, 0, 81499, 81502, 81505, 81509, 81513, 81518, \r
+    81522, 81526, 81531, 81536, 81543, 81550, 81553, 81556, 81559, 81562, \r
+    81565, 81569, 81573, 0, 81577, 81582, 81586, 81590, 0, 0, 0, 0, 81595, \r
+    81600, 81607, 81612, 81617, 0, 81622, 81627, 81632, 81637, 81642, 81647, \r
+    81652, 81657, 81662, 81667, 81672, 81677, 81686, 81695, 81703, 81711, \r
+    81720, 81729, 81738, 81747, 81755, 81763, 81771, 81779, 81784, 81789, \r
+    81795, 81801, 81807, 81813, 81821, 81829, 81835, 81841, 81847, 81853, \r
+    81859, 81865, 81871, 81877, 81882, 81887, 81892, 81897, 81902, 81907, \r
+    81912, 81917, 81923, 81929, 81935, 81941, 81947, 81953, 81959, 81965, \r
+    81971, 81977, 81983, 81989, 81995, 82001, 82007, 82013, 82019, 82025, \r
+    82031, 82037, 82043, 82049, 82055, 82061, 82067, 82073, 82079, 82085, \r
+    82091, 82097, 82103, 82109, 82115, 82121, 82127, 82133, 82139, 82145, \r
+    82151, 82157, 82163, 82169, 82175, 82181, 82187, 82193, 82199, 82205, \r
+    82211, 82217, 82223, 82229, 82235, 82241, 82247, 82253, 82259, 82265, \r
+    82271, 82277, 82282, 82287, 82292, 82297, 82303, 82309, 82315, 82321, \r
+    82327, 82333, 82339, 82345, 82351, 82357, 82363, 82369, 82374, 82379, \r
+    82384, 82389, 82401, 82413, 82424, 82435, 82447, 82459, 82467, 0, 0, \r
+    82475, 0, 82483, 82487, 82491, 82494, 82498, 82502, 82505, 82508, 82512, \r
+    82516, 82519, 82522, 82525, 82528, 82533, 82536, 82540, 82543, 82546, \r
+    82549, 82552, 82555, 82558, 82561, 82564, 82567, 82570, 82573, 82577, \r
+    82581, 82585, 82589, 82594, 82599, 82605, 82611, 82617, 82622, 82628, \r
+    82634, 82640, 82645, 82651, 82657, 82662, 82667, 82672, 82677, 82683, \r
+    82689, 82694, 82699, 82705, 82710, 82716, 82722, 82728, 82734, 82740, \r
+    82744, 82749, 82753, 82758, 82762, 82767, 82772, 82778, 82784, 82790, \r
+    82795, 82801, 82807, 82813, 82818, 82824, 82830, 82835, 82840, 82845, \r
+    82850, 82856, 82862, 82867, 82872, 82878, 82883, 82889, 82895, 82901, \r
+    82907, 82913, 82918, 82922, 82927, 82930, 82935, 82940, 82946, 82951, \r
+    82956, 82960, 82966, 82971, 82976, 82981, 82986, 82991, 82996, 83001, \r
+    83007, 83013, 83019, 83027, 83031, 83035, 83039, 83043, 83047, 83051, \r
+    83056, 83061, 83066, 83071, 83076, 83081, 83086, 83091, 83096, 83101, \r
+    83106, 83111, 83116, 83120, 83124, 83129, 83134, 83139, 83144, 83148, \r
+    83153, 83158, 83163, 83168, 83172, 83177, 83182, 83187, 83192, 83196, \r
+    83201, 83206, 83210, 83215, 83220, 83225, 83230, 83235, 83239, 83246, \r
+    83253, 83257, 83262, 83267, 83272, 83277, 83282, 83287, 83292, 83297, \r
+    83302, 83307, 83312, 83317, 83322, 83327, 83332, 83337, 83342, 83347, \r
+    83352, 83357, 83362, 83367, 83372, 83377, 83382, 83387, 83392, 83397, \r
+    83402, 0, 0, 0, 83407, 83411, 83416, 83420, 83425, 83430, 0, 0, 83434, \r
+    83439, 83444, 83448, 83453, 83458, 0, 0, 83463, 83468, 83472, 83477, \r
+    83482, 83487, 0, 0, 83492, 83497, 83502, 0, 0, 0, 83506, 83510, 83514, \r
+    83517, 83520, 83524, 83528, 0, 83532, 83538, 83541, 83545, 83548, 83552, \r
+    83556, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83560, 83566, 83572, 83578, 83584, \r
+    0, 0, 83588, 83594, 83600, 83606, 83612, 83618, 83625, 83632, 83639, \r
+    83646, 83653, 83660, 0, 83667, 83674, 83681, 83687, 83694, 83701, 83708, \r
+    83715, 83721, 83728, 83735, 83742, 83749, 83755, 83762, 83769, 83776, \r
+    83783, 83789, 83796, 83803, 83810, 83817, 83824, 83831, 83838, 0, 83845, \r
+    83851, 83858, 83865, 83872, 83879, 83886, 83893, 83900, 83907, 83914, \r
+    83921, 83928, 83935, 83941, 83948, 83955, 83962, 83969, 0, 83976, 83983, \r
+    0, 83990, 83997, 84004, 84011, 84018, 84025, 84032, 84039, 84046, 84053, \r
+    84060, 84067, 84074, 84081, 84088, 0, 0, 84094, 84099, 84104, 84109, \r
+    84114, 84119, 84124, 84129, 84134, 84139, 84144, 84149, 84154, 84159, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 84164, 84171, 84178, 84185, 84192, 84199, \r
+    84206, 84213, 84220, 84227, 84234, 84241, 84248, 84255, 84262, 84269, \r
+    84276, 84283, 84290, 84297, 84305, 84313, 84320, 84327, 84332, 84340, \r
+    84348, 84355, 84362, 84367, 84374, 84379, 84384, 84391, 84396, 84401, \r
+    84406, 84414, 84419, 84424, 84431, 84436, 84441, 84448, 84455, 84460, \r
+    84465, 84470, 84475, 84480, 84485, 84490, 84495, 84500, 84507, 84512, \r
+    84519, 84524, 84529, 84534, 84539, 84544, 84549, 84554, 84559, 84564, \r
+    84569, 84574, 84581, 84588, 84595, 84602, 84608, 84613, 84620, 84625, \r
+    84630, 84639, 84646, 84655, 84662, 84667, 84672, 84680, 84685, 84690, \r
+    84695, 84700, 84705, 84712, 84717, 84722, 84727, 84732, 84737, 84744, \r
+    84751, 84758, 84765, 84772, 84779, 84786, 84793, 84800, 84807, 84814, \r
+    84821, 84828, 84835, 84842, 84849, 84856, 84863, 84870, 84877, 84884, \r
+    84891, 84898, 84905, 84912, 84919, 84926, 84933, 0, 0, 0, 0, 0, 84940, \r
+    84948, 84956, 0, 0, 0, 0, 84961, 84965, 84969, 84973, 84977, 84981, \r
+    84985, 84989, 84993, 84997, 85002, 85007, 85012, 85017, 85022, 85027, \r
+    85032, 85037, 85042, 85048, 85054, 85060, 85067, 85074, 85081, 85088, \r
+    85095, 85102, 85108, 85114, 85120, 85127, 85134, 85141, 85148, 85155, \r
+    85162, 85169, 85176, 85183, 85190, 85197, 85204, 85211, 85218, 0, 0, 0, \r
+    85225, 85233, 85241, 85249, 85257, 85265, 85275, 85285, 85293, 85301, \r
+    85309, 85317, 85325, 85331, 85338, 85347, 85356, 85365, 85374, 85383, \r
+    85392, 85402, 85413, 85423, 85434, 85443, 85452, 85461, 85471, 85482, \r
+    85492, 85503, 85514, 85523, 85531, 85537, 85543, 85549, 85555, 85563, \r
+    85571, 85577, 85584, 85594, 85601, 85608, 85615, 85622, 85629, 85639, \r
+    85646, 85653, 85661, 85669, 85678, 85687, 85696, 85705, 85714, 85722, \r
+    85731, 85740, 85749, 85753, 85760, 85765, 85770, 85774, 85778, 85782, \r
+    85786, 85791, 85796, 85802, 85808, 85812, 85818, 85822, 85826, 85830, \r
+    85834, 85838, 85842, 85848, 0, 0, 0, 0, 0, 85852, 85857, 85862, 85867, \r
+    85872, 85879, 85884, 85889, 85894, 85899, 85904, 85909, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 85914, \r
+    85921, 85930, 85939, 85946, 85953, 85960, 85967, 85974, 85981, 85987, \r
+    85994, 86001, 86008, 86015, 86022, 86029, 86036, 86043, 86052, 86059, \r
+    86066, 86073, 86080, 86087, 86094, 86101, 86108, 86117, 86124, 86131, \r
+    86138, 86145, 86152, 86159, 86168, 86175, 86182, 86189, 86196, 86205, \r
+    86212, 86219, 86226, 86234, 86243, 0, 0, 86252, 86256, 86260, 86265, \r
+    86270, 86275, 86280, 86284, 86289, 86294, 86299, 86304, 86309, 86314, \r
+    86318, 86322, 86326, 86331, 86336, 86340, 86345, 86350, 86354, 86358, \r
+    86363, 86368, 86373, 86378, 86383, 0, 0, 0, 86388, 86392, 86397, 86402, \r
+    86406, 86411, 86415, 86420, 86425, 86430, 86435, 86439, 86443, 86448, \r
+    86453, 86458, 86463, 86467, 86472, 86476, 86481, 86486, 86490, 86495, \r
+    86500, 86505, 86509, 86513, 86518, 86523, 86528, 86533, 86538, 86543, \r
+    86548, 86553, 86558, 86563, 86568, 86573, 86578, 86583, 86588, 86593, \r
+    86598, 86603, 86608, 86613, 86618, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86623, 86627, 86632, 86637, 86642, 86646, \r
+    86651, 86656, 86661, 86666, 86670, 86674, 86679, 86684, 86689, 86694, \r
+    86698, 86703, 86708, 86713, 86718, 86723, 86728, 86732, 86737, 86742, \r
+    86747, 86752, 86757, 86762, 86767, 0, 86772, 86777, 86782, 86788, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86794, 86799, 86804, 86809, 86814, 86819, \r
+    86824, 86829, 86834, 86839, 86844, 86849, 86854, 86859, 86864, 86869, \r
+    86874, 86879, 86884, 86889, 86894, 86899, 86904, 86909, 86914, 86919, \r
+    86924, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 86931, 86936, 86941, 86946, 86951, 86956, 86961, \r
+    86966, 86971, 86976, 86981, 86986, 86991, 86996, 87001, 87006, 87011, \r
+    87016, 87021, 87026, 87031, 87036, 87041, 87046, 87051, 87056, 87061, \r
+    87065, 87069, 87073, 0, 87078, 87084, 87089, 87094, 87099, 87104, 87110, \r
+    87116, 87122, 87128, 87134, 87140, 87146, 87152, 87158, 87164, 87170, \r
+    87176, 87182, 87187, 87193, 87199, 87204, 87210, 87215, 87221, 87227, \r
+    87232, 87238, 87244, 87249, 87255, 87261, 87267, 87273, 87279, 87285, 0, \r
+    0, 0, 0, 87290, 87296, 87302, 87308, 87314, 87320, 87326, 87332, 87338, \r
+    87345, 87350, 87355, 87361, 87367, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 87373, 87378, 87383, 87388, 87394, 87399, 87405, 87411, \r
+    87417, 87423, 87430, 87436, 87443, 87448, 87453, 87458, 87463, 87468, \r
+    87473, 87478, 87483, 87488, 87493, 87498, 87503, 87508, 87513, 87518, \r
+    87523, 87528, 87533, 87538, 87543, 87548, 87553, 87558, 87563, 87568, \r
+    87573, 87578, 87583, 87588, 87593, 87598, 87604, 87609, 87615, 87621, \r
+    87627, 87633, 87640, 87646, 87653, 87658, 87663, 87668, 87673, 87678, \r
+    87683, 87688, 87693, 87698, 87703, 87708, 87713, 87718, 87723, 87728, \r
+    87733, 87738, 87743, 87748, 87753, 87758, 87763, 87768, 87773, 87778, \r
+    87783, 87788, 87793, 87798, 87803, 87808, 87813, 87818, 87823, 87828, \r
+    87833, 87838, 87843, 87848, 87853, 87858, 87863, 87868, 87873, 87878, \r
+    87883, 87888, 87893, 87898, 87903, 87908, 87913, 87918, 87923, 87928, \r
+    87933, 87938, 87943, 87948, 87953, 87958, 87963, 87968, 87973, 87978, \r
+    87983, 87988, 87993, 87998, 88003, 88008, 88013, 88018, 88023, 88028, \r
+    88033, 88038, 88043, 88048, 88053, 88058, 88063, 88068, 88072, 88077, \r
+    88082, 88087, 88092, 88097, 88102, 88107, 88112, 88117, 88122, 88127, \r
+    88132, 88136, 88140, 88144, 88148, 88152, 88156, 88160, 88165, 88170, 0, \r
+    0, 88175, 88180, 88184, 88188, 88192, 88196, 88200, 88204, 88208, 88212, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88216, 88220, 88224, 88228, \r
+    88232, 88236, 0, 0, 88241, 0, 88246, 88250, 88255, 88260, 88265, 88270, \r
+    88275, 88280, 88285, 88290, 88295, 88299, 88304, 88309, 88314, 88319, \r
+    88323, 88328, 88333, 88338, 88343, 88347, 88352, 88357, 88362, 88367, \r
+    88371, 88376, 88381, 88386, 88391, 88396, 88401, 88406, 88411, 88416, \r
+    88421, 88426, 88431, 88435, 88440, 88445, 88450, 88455, 0, 88460, 88465, \r
+    0, 0, 0, 88470, 0, 0, 88475, 88480, 88487, 88494, 88501, 88508, 88515, \r
+    88522, 88529, 88536, 88543, 88550, 88557, 88564, 88571, 88578, 88585, \r
+    88592, 88599, 88606, 88613, 88620, 88627, 0, 88634, 88641, 88647, 88653, \r
+    88659, 88666, 88673, 88681, 88689, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88698, 88703, \r
+    88708, 88713, 88718, 88723, 88728, 88733, 88738, 88743, 88748, 88753, \r
+    88758, 88763, 88768, 88773, 88778, 88783, 88788, 88793, 88798, 88803, \r
+    88808, 88812, 88817, 88822, 88828, 88832, 0, 0, 0, 88836, 88842, 88846, \r
+    88851, 88856, 88861, 88865, 88870, 88874, 88879, 88884, 88888, 88892, \r
+    88896, 88900, 88904, 88909, 88914, 88918, 88923, 88928, 88932, 88937, \r
+    88942, 88947, 88952, 88957, 0, 0, 0, 0, 0, 88962, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 88967, 88970, 88974, 88978, 0, 88983, 88987, 0, \r
+    0, 0, 0, 0, 88991, 88996, 89002, 89006, 89010, 89013, 89017, 89021, 0, \r
+    89025, 89029, 89033, 0, 89037, 89041, 89045, 89049, 89053, 89057, 89061, \r
+    89065, 89069, 89073, 89077, 89080, 89083, 89087, 89091, 89095, 89098, \r
+    89101, 89104, 89108, 89112, 89116, 89120, 89124, 89128, 89131, 89135, 0, \r
+    0, 0, 0, 89139, 89144, 89148, 0, 0, 0, 0, 89152, 89155, 89158, 89161, \r
+    89164, 89167, 89171, 89175, 89180, 0, 0, 0, 0, 0, 0, 0, 0, 89185, 89190, \r
+    89196, 89201, 89207, 89212, 89217, 89222, 89228, 0, 0, 0, 0, 0, 0, 0, \r
+    89233, 89241, 89249, 89257, 89265, 89273, 89281, 89289, 89297, 89305, \r
+    89313, 89321, 89329, 89337, 89345, 89353, 89361, 89369, 89377, 89385, \r
+    89393, 89401, 89409, 89417, 89425, 89433, 89441, 89449, 89457, 89465, \r
+    89472, 89480, 89488, 89492, 89497, 89502, 89507, 89512, 89517, 89522, \r
+    89527, 89531, 89536, 89540, 89545, 89549, 89554, 89558, 89563, 89568, \r
+    89573, 89578, 89583, 89588, 89593, 89598, 89603, 89608, 89613, 89618, \r
+    89623, 89628, 89633, 89638, 89643, 89648, 89653, 89658, 89663, 89668, \r
+    89673, 89678, 89683, 89688, 89693, 89698, 89703, 89708, 89713, 89718, \r
+    89723, 89728, 89733, 89738, 89743, 89748, 0, 0, 0, 89753, 89758, 89767, \r
+    89775, 89784, 89793, 89804, 89815, 89822, 89829, 89836, 89843, 89850, \r
+    89857, 89864, 89871, 89878, 89885, 89892, 89899, 89906, 89913, 89920, \r
+    89927, 89934, 89941, 89948, 89955, 89962, 0, 0, 89969, 89975, 89981, \r
+    89987, 89993, 90000, 90007, 90015, 90023, 90030, 90037, 90044, 90051, \r
+    90058, 90065, 90072, 90079, 90086, 90093, 90100, 90107, 90114, 90121, \r
+    90128, 90135, 90142, 90149, 0, 0, 0, 0, 0, 90156, 90162, 90168, 90174, \r
+    90180, 90187, 90194, 90202, 90210, 90216, 90222, 90229, 90235, 90241, \r
+    90247, 90253, 90260, 90267, 90274, 90281, 90288, 90295, 90302, 90309, \r
+    90316, 90323, 90330, 90337, 90344, 90351, 90358, 90365, 90372, 90379, \r
+    90386, 90393, 90400, 90407, 90414, 90421, 90428, 90435, 90442, 90449, \r
+    90456, 90463, 90470, 90477, 90484, 90491, 90498, 90505, 90512, 90519, \r
+    90526, 90533, 90540, 90547, 90554, 90561, 90568, 90575, 90582, 90589, \r
+    90596, 90603, 90610, 90617, 90624, 90631, 90638, 90645, 90652, 90659, \r
+    90666, 90673, 90680, 90687, 90694, 90701, 90708, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    90715, 90719, 90723, 90727, 90731, 90735, 90739, 90743, 90747, 90751, \r
+    90756, 90761, 90766, 90771, 90776, 90781, 90786, 90791, 90796, 90802, \r
+    90808, 90814, 90821, 90828, 90835, 90842, 90849, 90856, 90863, 90870, \r
+    90877, 0, 90884, 90888, 90892, 90896, 90899, 90903, 90906, 90910, 90913, \r
+    90917, 90920, 90924, 90927, 90931, 90934, 90938, 90942, 90946, 90950, \r
+    90954, 90958, 90962, 90966, 90970, 90974, 90978, 90982, 90986, 90990, \r
+    90994, 90998, 91002, 91006, 91010, 91014, 91017, 91020, 91024, 91028, \r
+    91032, 91035, 91038, 91041, 91045, 91049, 91053, 91057, 91061, 91064, \r
+    91069, 91073, 91078, 91082, 91087, 91091, 91096, 91100, 91105, 91109, \r
+    91113, 91117, 91121, 91124, 91128, 91133, 91136, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 91140, 91143, 91148, 91154, 91162, 91167, 91173, 91181, \r
+    91187, 91193, 91197, 91201, 91208, 91217, 91224, 91233, 91239, 91248, \r
+    91255, 91262, 91269, 91279, 91285, 91289, 91296, 91305, 91315, 91322, \r
+    91329, 91333, 91337, 91344, 91354, 91358, 91365, 91372, 91379, 91385, \r
+    91392, 91399, 91406, 91413, 91417, 91421, 91425, 91432, 91436, 91443, \r
+    91450, 91464, 91473, 91477, 91481, 91485, 91492, 91496, 91500, 91504, \r
+    91512, 91520, 91539, 91549, 91569, 91573, 91577, 91581, 91585, 91589, \r
+    91593, 91597, 91604, 91608, 91611, 91615, 91619, 91625, 91632, 91641, \r
+    91645, 91654, 91663, 91671, 91675, 91682, 91686, 91690, 91694, 91698, \r
+    91709, 91718, 91727, 91736, 91745, 91757, 91766, 91775, 91784, 91792, \r
+    91801, 91813, 91822, 91831, 91840, 91852, 91861, 91870, 91882, 91891, \r
+    91900, 91912, 91921, 91925, 91929, 91933, 91937, 91941, 91945, 91949, \r
+    91956, 91960, 91964, 91975, 91979, 91983, 91990, 91996, 92002, 92006, \r
+    92013, 92017, 92021, 92025, 92029, 92033, 92037, 92043, 92051, 92055, \r
+    92059, 92062, 92068, 92078, 92082, 92094, 92101, 92108, 92115, 92122, \r
+    92128, 92132, 92136, 92140, 92144, 92151, 92160, 92167, 92175, 92183, \r
+    92189, 92193, 92197, 92201, 92205, 92211, 92220, 92232, 92239, 92246, \r
+    92255, 92266, 92272, 92281, 92290, 92297, 92306, 92313, 92320, 92330, \r
+    92337, 92344, 92351, 92358, 92362, 92368, 92372, 92383, 92391, 92400, \r
+    92412, 92419, 92426, 92436, 92443, 92452, 92459, 92468, 92475, 92482, \r
+    92492, 92499, 92506, 92516, 92523, 92535, 92544, 92551, 92558, 92565, \r
+    92574, 92584, 92597, 92604, 92614, 92624, 92631, 92640, 92653, 92660, \r
+    92667, 92674, 92684, 92694, 92701, 92711, 92718, 92725, 92735, 92741, \r
+    92748, 92755, 92762, 92772, 92779, 92786, 92793, 92799, 92806, 92816, \r
+    92823, 92827, 92835, 92839, 92851, 92855, 92869, 92873, 92877, 92881, \r
+    92885, 92891, 92898, 92906, 92910, 92914, 92918, 92922, 92929, 92933, \r
+    92939, 92945, 92953, 92957, 92964, 92972, 92976, 92980, 92986, 92990, \r
+    92999, 93008, 93015, 93025, 93031, 93035, 93039, 93047, 93054, 93061, \r
+    93067, 93071, 93079, 93083, 93090, 93102, 93109, 93119, 93125, 93129, \r
+    93138, 93145, 93154, 93158, 93162, 93169, 93173, 93177, 93181, 93185, \r
+    93188, 93194, 93200, 93204, 93208, 93215, 93222, 93229, 93236, 93243, \r
+    93250, 93257, 93264, 93270, 93274, 93278, 93285, 93292, 93299, 93306, \r
+    93313, 93317, 93320, 93325, 93329, 93333, 93342, 93351, 93355, 93359, \r
+    93365, 93371, 93388, 93394, 93398, 93407, 93411, 93415, 93422, 93430, \r
+    93438, 93444, 93448, 93452, 93456, 93460, 93463, 93468, 93474, 93483, \r
+    93489, 93495, 93501, 93506, 93512, 93518, 93524, 93530, 93536, 93544, \r
+    93550, 93561, 93567, 93573, 93582, 93592, 93598, 93604, 93610, 93616, \r
+    93622, 93628, 93634, 93640, 93646, 93652, 93661, 93670, 93679, 93685, \r
+    93694, 93700, 93706, 93712, 93718, 93724, 93730, 93736, 93742, 93748, \r
+    93754, 93760, 93766, 93772, 93777, 93783, 93789, 93797, 93803, 93809, \r
+    93813, 93821, 93825, 93829, 93833, 93837, 93841, 93848, 93852, 93861, \r
+    93865, 93872, 93880, 93884, 93888, 93892, 93905, 93921, 93925, 93929, \r
+    93936, 93942, 93949, 93953, 93957, 93961, 93965, 93969, 93976, 93980, \r
+    93998, 94002, 94006, 94013, 94017, 94021, 94027, 94031, 94035, 94043, \r
+    94047, 94051, 94055, 94059, 94065, 94076, 94085, 94094, 94101, 94108, \r
+    94119, 94126, 94133, 94140, 94147, 94154, 94161, 94168, 94178, 94184, \r
+    94191, 94201, 94210, 94217, 94226, 94236, 94243, 94250, 94257, 94264, \r
+    94276, 94283, 94290, 94297, 94304, 94311, 94321, 94328, 94335, 94345, \r
+    94358, 94370, 94377, 94387, 94394, 94401, 94408, 94422, 94428, 94436, \r
+    94446, 94456, 94463, 94470, 94476, 94480, 94487, 94497, 94503, 94516, \r
+    94520, 94524, 94531, 94535, 94542, 94552, 94556, 94560, 94564, 94568, \r
+    94572, 94579, 94583, 94590, 94597, 94604, 94613, 94622, 94632, 94639, \r
+    94646, 94653, 94663, 94670, 94680, 94687, 94697, 94704, 94711, 94721, \r
+    94731, 94738, 94744, 94752, 94760, 94766, 94772, 94776, 94780, 94787, \r
+    94795, 94801, 94805, 94809, 94813, 94820, 94832, 94835, 94842, 94848, \r
+    94852, 94856, 94860, 94864, 94868, 94872, 94876, 94880, 94884, 94888, \r
+    94895, 94899, 94905, 94909, 94913, 94917, 94923, 94930, 94937, 94944, \r
+    94955, 94963, 94967, 94973, 94982, 94989, 94995, 94998, 95002, 95006, \r
+    95012, 95021, 95029, 95033, 95039, 95043, 95047, 95051, 95057, 95064, \r
+    95070, 95074, 95080, 95084, 95088, 95097, 95109, 95113, 95120, 95127, \r
+    95137, 95144, 95156, 95163, 95170, 95177, 95188, 95198, 95211, 95221, \r
+    95228, 95232, 95236, 95240, 95244, 95253, 95262, 95271, 95288, 95297, \r
+    95303, 95310, 95318, 95331, 95335, 95344, 95353, 95362, 95371, 95382, \r
+    95391, 95400, 95409, 95418, 95427, 95436, 95446, 95449, 95453, 95457, \r
+    95461, 95465, 95469, 95475, 95482, 95489, 95496, 95502, 95508, 95515, \r
+    95521, 95528, 95536, 95540, 95547, 95554, 95561, 95569, 95572, 95576, \r
+    95580, 95584, 95588, 95594, 95598, 95604, 95611, 95618, 95624, 95631, \r
+    95638, 95645, 95652, 95659, 95666, 95673, 95680, 95687, 95694, 95701, \r
+    95708, 95715, 95722, 95728, 95732, 95741, 95745, 95749, 95753, 95757, \r
+    95763, 95770, 95777, 95784, 95791, 95798, 95804, 95812, 95816, 95820, \r
+    95824, 95828, 95834, 95851, 95868, 95872, 95876, 95880, 95884, 95888, \r
+    95892, 95898, 95905, 95909, 95915, 95922, 95929, 95936, 95943, 95950, \r
+    95959, 95966, 95973, 95980, 95987, 95991, 95995, 96001, 96013, 96017, \r
+    96021, 96030, 96034, 96038, 96042, 96048, 96052, 96056, 96065, 96069, \r
+    96073, 96077, 96084, 96088, 96092, 96096, 96100, 96104, 96108, 96112, \r
+    96116, 96122, 96129, 96136, 96142, 96146, 96163, 96169, 96173, 96179, \r
+    96185, 96191, 96197, 96203, 96209, 96213, 96217, 96221, 96227, 96231, \r
+    96237, 96241, 96245, 96252, 96259, 96276, 96280, 96284, 96288, 96292, \r
+    96296, 96308, 96311, 96316, 96321, 96336, 96346, 96357, 96361, 96365, \r
+    96369, 96375, 96382, 96389, 96399, 96411, 96417, 96423, 96432, 96436, \r
+    96440, 96447, 96457, 96464, 96470, 96474, 96478, 96485, 96491, 96495, \r
+    96501, 96505, 96513, 96519, 96523, 96531, 96539, 96546, 96552, 96559, \r
+    96566, 96576, 96586, 96590, 96594, 96598, 96602, 96608, 96615, 96621, \r
+    96628, 96635, 96642, 96651, 96658, 96665, 96671, 96678, 96685, 96692, \r
+    96699, 96706, 96713, 96719, 96726, 96733, 96740, 96749, 96756, 96763, \r
+    96767, 96773, 96777, 96783, 96790, 96797, 96804, 96808, 96812, 96816, \r
+    96820, 96824, 96831, 96835, 96839, 96845, 96853, 96857, 96861, 96865, \r
+    96869, 96876, 96880, 96884, 96892, 96896, 96900, 96904, 96908, 96914, \r
+    96918, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96922, 96928, \r
+    96934, 96941, 96948, 96955, 96962, 96969, 96976, 96982, 96989, 96996, \r
+    97003, 97010, 97017, 97024, 97030, 97036, 97042, 97048, 97054, 97060, \r
+    97066, 97072, 97078, 97085, 97092, 97099, 97106, 97113, 97120, 97126, \r
+    97132, 97138, 97145, 97152, 97158, 97164, 97173, 97180, 97187, 97194, \r
+    97201, 97208, 97215, 97221, 97227, 97233, 97242, 97249, 97256, 97267, \r
+    97278, 97284, 97290, 97296, 97305, 97312, 97319, 97329, 97339, 97350, \r
+    97361, 97373, 97386, 97397, 97408, 97420, 97433, 97444, 97455, 97466, \r
+    97477, 97488, 97500, 97508, 97516, 97525, 97534, 97543, 97549, 97555, \r
+    97561, 97568, 97578, 97585, 97595, 97600, 97605, 97611, 97617, 97625, \r
+    97633, 97642, 97653, 97664, 97672, 97680, 97689, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 97698, 97709, 97716, 97724, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 97732, 97736, 97740, 97744, 97748, 97752, 97756, 97760, 97764, \r
+    97768, 97772, 97776, 97780, 97784, 97788, 97792, 97796, 97800, 97804, \r
+    97808, 97812, 97816, 97820, 97824, 97828, 97832, 97836, 97840, 97844, \r
+    97848, 97852, 97856, 97860, 97864, 97868, 97872, 97876, 97880, 97884, \r
+    97888, 97892, 97896, 97900, 97904, 97908, 97912, 97916, 97920, 97924, \r
+    97928, 97932, 97936, 97940, 97944, 97948, 97952, 97956, 97960, 97964, \r
+    97968, 97972, 97976, 97980, 97984, 97988, 97992, 97996, 98000, 98004, \r
+    98008, 98012, 98016, 98020, 98024, 98028, 98032, 98036, 98040, 98044, \r
+    98048, 98052, 98056, 98060, 98064, 98068, 98072, 98076, 98080, 98084, \r
+    98088, 98092, 98096, 98100, 98104, 98108, 98112, 98116, 98120, 98124, \r
+    98128, 98132, 98136, 98140, 98144, 98148, 98152, 98156, 98160, 98164, \r
+    98168, 98172, 98176, 98180, 98184, 98188, 98192, 98196, 98200, 98204, \r
+    98208, 98212, 98216, 98220, 98224, 98228, 98232, 98236, 98240, 98244, \r
+    98248, 98252, 98256, 98260, 98264, 98268, 98272, 98276, 98280, 98284, \r
+    98288, 98292, 98296, 98300, 98304, 98308, 98312, 98316, 98320, 98324, \r
+    98328, 98332, 98336, 98340, 98344, 98348, 98352, 98356, 98360, 98364, \r
+    98368, 98372, 98376, 98380, 98384, 98388, 98392, 98396, 98400, 98404, \r
+    98408, 98412, 98416, 98420, 98424, 98428, 98432, 98436, 98440, 98444, \r
+    98448, 98452, 98456, 98460, 98464, 98468, 98472, 98476, 98480, 98484, \r
+    98488, 98492, 98496, 98500, 98504, 98508, 98512, 98516, 98520, 98524, \r
+    98528, 98532, 98536, 98540, 98544, 98548, 98552, 98556, 98560, 98564, \r
+    98568, 98572, 98576, 98580, 98584, 98588, 98592, 98596, 98600, 98604, \r
+    98608, 98612, 98616, 98620, 98624, 98628, 98632, 98636, 98640, 98644, \r
+    98648, 98652, 98656, 98660, 98664, 98668, 98672, 98676, 98680, 98684, \r
+    98688, 98692, 98696, 98700, 98704, 98708, 98712, 98716, 98720, 98724, \r
+    98728, 98732, 98736, 98740, 98744, 98748, 98752, 98756, 98760, 98764, \r
+    98768, 98772, 98776, 98780, 98784, 98788, 98792, 98796, 98800, 98804, \r
+    98808, 98812, 98816, 98820, 98824, 98828, 98832, 98836, 98840, 98844, \r
+    98848, 98852, 98856, 98860, 98864, 98868, 98872, 98876, 98880, 98884, \r
+    98888, 98892, 98896, 98900, 98904, 98908, 98912, 98916, 98920, 98924, \r
+    98928, 98932, 98936, 98940, 98944, 98948, 98952, 98956, 98960, 98964, \r
+    98968, 98972, 98976, 98980, 98984, 98988, 98992, 98996, 99000, 99004, \r
+    99008, 99012, 99016, 99020, 99024, 99028, 99032, 99036, 99040, 99044, \r
+    99048, 99052, 99056, 99060, 99064, 99068, 99072, 99076, 99080, 99084, \r
+    99088, 99092, 99096, 99100, 99104, 99108, 99112, 99116, 99120, 99124, \r
+    99128, 99132, 99136, 99140, 99144, 99148, 99152, 99156, 99160, 99164, \r
+    99168, 99172, 99176, 99180, 99184, 99188, 99192, 99196, 99200, 99204, \r
+    99208, 99212, 99216, 99220, 99224, 99228, 99232, 99236, 99240, 99244, \r
+    99248, 99252, 99256, 99260, 99264, 99268, 99272, 99276, 99280, 99284, \r
+    99288, 99292, 99296, 99300, 99304, 99308, 99312, 99316, 99320, 99324, \r
+    99328, 99332, 99336, 99340, 99344, 99348, 99352, 99356, 99360, 99364, \r
+    99368, 99372, 99376, 99380, 99384, 99388, 99392, 99396, 99400, 99404, \r
+    99408, 99412, 99416, 99420, 99424, 99428, 99432, 99436, 99440, 99444, \r
+    99448, 99452, 99456, 99460, 99464, 99468, 99472, 99476, 99480, 99484, \r
+    99488, 99492, 99496, 99500, 99504, 99508, 99512, 99516, 99520, 99524, \r
+    99528, 99532, 99536, 99540, 99544, 99548, 99552, 99556, 99560, 99564, \r
+    99568, 99572, 99576, 99580, 99584, 99588, 99592, 99596, 99600, 99604, \r
+    99608, 99612, 99616, 99620, 99624, 99628, 99632, 99636, 99640, 99644, \r
+    99648, 99652, 99656, 99660, 99664, 99668, 99672, 99676, 99680, 99684, \r
+    99688, 99692, 99696, 99700, 99704, 99708, 99712, 99716, 99720, 99724, \r
+    99728, 99732, 99736, 99740, 99744, 99748, 99752, 99756, 99760, 99764, \r
+    99768, 99772, 99776, 99780, 99784, 99788, 99792, 99796, 99800, 99804, \r
+    99808, 99812, 99816, 99820, 99824, 99828, 99832, 99836, 99840, 99844, \r
+    99848, 99852, 99856, 99860, 99864, 99868, 99872, 99876, 99880, 99884, \r
+    99888, 99892, 99896, 99900, 99904, 99908, 99912, 99916, 99920, 99924, \r
+    99928, 99932, 99936, 99940, 99944, 99948, 99952, 99956, 99960, 99964, \r
+    99968, 99972, 99976, 99980, 99984, 99988, 99992, 99996, 100000, 100004, \r
+    100008, 100012, 100016, 100020, 100024, 100028, 100032, 100036, 100040, \r
+    100044, 100048, 100052, 100056, 100060, 100064, 100068, 100072, 100076, \r
+    100080, 100084, 100088, 100092, 100096, 100100, 100104, 100108, 100112, \r
+    100116, 100120, 100124, 100128, 100132, 100136, 100140, 100144, 100148, \r
+    100152, 100156, 100160, 100164, 100168, 100172, 100176, 100180, 100184, \r
+    100188, 100192, 100196, 100200, 100204, 100208, 100212, 100216, 100220, \r
+    100224, 100228, 100232, 100236, 100240, 100244, 100248, 100252, 100256, \r
+    100260, 100264, 100268, 100272, 100276, 100280, 100284, 100288, 100292, \r
+    100296, 100300, 100304, 100308, 100312, 100316, 100320, 100324, 100328, \r
+    100332, 100336, 100340, 100344, 100348, 100352, 100356, 100360, 100364, \r
+    100368, 100372, 100376, 100380, 100384, 100388, 100392, 100396, 100400, \r
+    100404, 100408, 100412, 100416, 100420, 100424, 100428, 100432, 100436, \r
+    100440, 100444, 100448, 100452, 100456, 100460, 100464, 100468, 100472, \r
+    100476, 100480, 100484, 100488, 100492, 100496, 100500, 100504, 100508, \r
+    100512, 100516, 100520, 100524, 100528, 100532, 100536, 100540, 100544, \r
+    100548, 100552, 100556, 100560, 100564, 100568, 100572, 100576, 100580, \r
+    100584, 100588, 100592, 100596, 100600, 100604, 100608, 100612, 100616, \r
+    100620, 100624, 100628, 100632, 100636, 100640, 100644, 100648, 100652, \r
+    100656, 100660, 100664, 100668, 100672, 100676, 100680, 100684, 100688, \r
+    100692, 100696, 100700, 100704, 100708, 100712, 100716, 100720, 100724, \r
+    100728, 100732, 100736, 100740, 100744, 100748, 100752, 100756, 100760, \r
+    100764, 100768, 100772, 100776, 100780, 100784, 100788, 100792, 100796, \r
+    100800, 100804, 100808, 100812, 100816, 100820, 100824, 100828, 100832, \r
+    100836, 100840, 100844, 100848, 100852, 100856, 100860, 100864, 100868, \r
+    100872, 100876, 100880, 100884, 100888, 100892, 100896, 100900, 100904, \r
+    100908, 100912, 100916, 100920, 100924, 100928, 100932, 100936, 100940, \r
+    100944, 100948, 100952, 100956, 100960, 100964, 100968, 100972, 100976, \r
+    100980, 100984, 100988, 100992, 100996, 101000, 101004, 101008, 101012, \r
+    101016, 101020, 101024, 101028, 101032, 101036, 101040, 101044, 101048, \r
+    101052, 101056, 101060, 101064, 101068, 101072, 101076, 101080, 101084, \r
+    101088, 101092, 101096, 101100, 101104, 101108, 101112, 101116, 101120, \r
+    101124, 101128, 101132, 101136, 101140, 101144, 101148, 101152, 101156, \r
+    101160, 101164, 101168, 101172, 101176, 101180, 101184, 101188, 101192, \r
+    101196, 101200, 101204, 101208, 101212, 101216, 101220, 101224, 101228, \r
+    101232, 101236, 101240, 101244, 101248, 101252, 101256, 101260, 101264, \r
+    101268, 101272, 101276, 101280, 101284, 101288, 101292, 101296, 101300, \r
+    101304, 101308, 101312, 101316, 101320, 101324, 101328, 101332, 101336, \r
+    101340, 101344, 101348, 101352, 101356, 101360, 101364, 101368, 101372, \r
+    101376, 101380, 101384, 101388, 101392, 101396, 101400, 101404, 101408, \r
+    101412, 101416, 101420, 101424, 101428, 101432, 101436, 101440, 101444, \r
+    101448, 101452, 101456, 101460, 101464, 101468, 101472, 101476, 101480, \r
+    101484, 101488, 101492, 101496, 101500, 101504, 101508, 101512, 101516, \r
+    101520, 101524, 101528, 101532, 101536, 101540, 101544, 101548, 101552, \r
+    101556, 101560, 101564, 101568, 101572, 101576, 101580, 101584, 101588, \r
+    101592, 101596, 101600, 101604, 101608, 101612, 101616, 101620, 101624, \r
+    101628, 101632, 101636, 101640, 101644, 101648, 101652, 101656, 101660, \r
+    101664, 101668, 101672, 101676, 101680, 101684, 101688, 101692, 101696, \r
+    101700, 101704, 101708, 101712, 101716, 101720, 101724, 101728, 101732, \r
+    101736, 101740, 101744, 101748, 101752, 101756, 101760, 101764, 101768, \r
+    101772, 101776, 101780, 101784, 101788, 101792, 101796, 101800, 101804, \r
+    101808, 101812, 101816, 101820, 101824, 101828, 101832, 101836, 101840, \r
+    101844, 101848, 101852, 101856, 101860, 101864, 101868, 101872, 101876, \r
+    101880, 101884, 101888, 101892, 101896, 101900, 101904, 101908, 101912, \r
+    101916, 101920, 101924, 101928, 101932, 101936, 101940, 101944, 101948, \r
+    101952, 101956, 101960, 101964, 101968, 101972, 101976, 101980, 101984, \r
+    101988, 101992, 101996, 102000, 102004, 102008, 102012, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 102016, 102021, 102026, 102031, 102038, 102045, 102052, 102059, \r
+    102064, 102069, 102074, 102079, 102086, 102091, 102098, 102105, 102110, \r
+    102115, 102120, 102127, 102132, 102137, 102144, 102151, 102156, 102161, \r
+    102166, 102173, 102180, 102187, 102192, 102197, 102204, 102211, 102218, \r
+    102225, 102230, 102235, 102240, 102247, 102252, 102257, 102262, 102269, \r
+    102278, 102285, 102290, 102295, 102300, 102305, 102310, 102315, 102324, \r
+    102331, 102336, 102343, 102350, 102355, 102360, 102365, 102372, 102377, \r
+    102384, 102391, 102396, 102401, 102406, 102413, 102420, 102425, 102430, \r
+    102437, 102444, 102451, 102456, 102461, 102466, 102471, 102478, 102487, \r
+    102496, 102501, 102508, 102517, 102522, 102527, 102532, 102537, 102544, \r
+    102551, 102558, 102565, 102570, 102575, 102580, 102587, 102594, 102601, \r
+    102606, 102611, 102618, 102623, 102630, 102635, 102642, 102647, 102654, \r
+    102661, 102666, 102671, 102676, 102681, 102686, 102691, 102696, 102701, \r
+    102706, 102713, 102720, 102727, 102734, 102741, 102750, 102755, 102760, \r
+    102767, 102774, 102779, 102786, 102793, 102800, 102807, 102814, 102821, \r
+    102826, 102831, 102836, 102841, 102846, 102855, 102864, 102873, 102882, \r
+    102891, 102900, 102909, 102918, 102923, 102934, 102945, 102954, 102959, \r
+    102964, 102969, 102974, 102983, 102990, 102997, 103004, 103011, 103018, \r
+    103025, 103034, 103043, 103054, 103063, 103074, 103083, 103090, 103099, \r
+    103110, 103119, 103128, 103137, 103146, 103153, 103160, 103167, 103176, \r
+    103185, 103196, 103205, 103214, 103225, 103230, 103235, 103246, 103254, \r
+    103263, 103272, 103281, 103292, 103301, 103310, 103321, 103332, 103343, \r
+    103354, 103365, 103376, 103383, 103390, 103397, 103404, 103415, 103424, \r
+    103431, 103438, 103445, 103456, 103467, 103478, 103489, 103500, 103511, \r
+    103522, 103533, 103540, 103547, 103556, 103565, 103572, 103579, 103586, \r
+    103595, 103604, 103613, 103620, 103629, 103638, 103647, 103654, 103661, \r
+    103666, 103672, 103679, 103686, 103693, 103700, 103707, 103714, 103723, \r
+    103732, 103741, 103750, 103757, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103766, \r
+    103772, 103777, 103782, 103789, 103795, 103801, 103807, 103813, 103819, \r
+    103825, 103831, 103835, 103839, 103845, 103851, 103857, 103861, 103866, \r
+    103871, 103875, 103879, 103882, 103888, 103894, 103900, 103906, 103912, \r
+    103918, 103924, 103930, 103936, 103946, 103956, 103962, 103968, 103978, \r
+    103988, 103994, 0, 0, 104000, 104008, 104013, 104018, 104024, 104030, \r
+    104036, 104042, 104048, 104054, 104061, 104068, 104074, 104080, 104086, \r
+    104092, 104098, 104104, 104110, 104116, 104121, 104127, 104133, 104139, \r
+    104145, 104151, 104160, 104166, 104171, 104179, 104186, 104193, 104202, \r
+    104211, 104220, 104229, 104238, 104247, 104256, 104265, 104275, 104285, \r
+    104293, 104301, 104310, 104319, 104325, 104331, 104337, 104343, 104351, \r
+    104359, 104363, 104369, 104374, 104380, 104386, 104392, 104398, 104404, \r
+    104413, 104418, 104425, 104430, 104435, 104440, 104446, 104452, 104458, \r
+    104465, 104470, 104475, 104480, 104485, 104490, 104496, 104502, 104508, \r
+    104514, 104520, 104526, 104532, 104538, 104543, 104548, 104553, 104558, \r
+    104563, 104568, 104573, 104578, 104584, 104590, 104595, 104600, 104605, \r
+    104610, 104615, 104621, 104628, 104632, 104636, 104640, 104644, 104648, \r
+    104652, 104656, 104660, 104668, 104678, 104682, 104686, 104692, 104698, \r
+    104704, 104710, 104716, 104722, 104728, 104734, 104740, 104746, 104752, \r
+    104758, 104764, 104770, 104774, 104778, 104785, 104791, 104797, 104803, \r
+    104808, 104815, 104820, 104826, 104832, 104838, 104844, 104849, 104853, \r
+    104859, 104863, 104867, 104871, 104877, 104883, 104887, 104893, 104899, \r
+    104905, 104911, 104917, 104925, 104933, 104939, 104945, 104951, 104957, \r
+    104969, 104981, 104995, 105007, 105019, 105033, 105047, 105061, 105065, \r
+    105073, 105081, 105086, 105090, 105094, 105098, 105102, 105106, 105110, \r
+    105114, 105120, 105126, 105132, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 105138, \r
+    105144, 105150, 105156, 105162, 105168, 105174, 105180, 105186, 105192, \r
+    105198, 105204, 105210, 105216, 105222, 105228, 105234, 105240, 105246, \r
+    105252, 105258, 105264, 105270, 105276, 105282, 105288, 105294, 105300, \r
+    105306, 105312, 105318, 105324, 105330, 105336, 105342, 105348, 105354, \r
+    105360, 105366, 105372, 105378, 105384, 105390, 105396, 105402, 105408, \r
+    105414, 105420, 105426, 105432, 105438, 105444, 105450, 105456, 105462, \r
+    105468, 105474, 105480, 105486, 105492, 105498, 105504, 105510, 105516, \r
+    105522, 105528, 105534, 105539, 105544, 105549, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 105553, 105558, 105565, 105572, 105579, 105586, 105591, 105595, \r
+    105601, 105605, 105609, 105615, 105619, 105623, 105627, 105633, 105640, \r
+    105644, 105648, 105652, 105656, 105660, 105664, 105670, 105674, 105678, \r
+    105682, 105686, 105690, 105694, 105698, 105702, 105706, 105710, 105714, \r
+    105718, 105723, 105727, 105731, 105735, 105739, 105743, 105747, 105751, \r
+    105755, 105759, 105766, 105770, 105777, 105781, 105785, 105789, 105793, \r
+    105797, 105801, 105805, 105812, 105816, 105820, 105824, 105828, 105832, \r
+    105838, 105842, 105848, 105852, 105856, 105860, 105864, 105868, 105872, \r
+    105876, 105880, 105884, 105888, 105892, 105896, 105900, 105904, 105908, \r
+    105912, 105916, 105920, 105924, 105932, 105936, 105940, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 105944, 105952, 105960, 105968, 105976, 105984, 105992, 106000, \r
+    106008, 106016, 106024, 106032, 106040, 106048, 106056, 106064, 106072, \r
+    106080, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 106088, 106092, 106097, \r
+    106102, 106107, 106111, 106116, 106121, 106126, 106130, 106135, 106140, \r
+    106144, 106148, 106152, 106156, 106161, 106166, 106170, 106174, 106179, \r
+    106183, 106188, 106193, 106198, 106203, 106208, 106212, 106217, 106222, \r
+    106227, 106231, 106236, 106241, 106246, 106250, 106255, 106260, 106264, \r
+    106268, 106272, 106276, 106281, 106286, 106290, 106294, 106299, 106303, \r
+    106308, 106313, 106318, 106323, 106328, 106332, 106337, 106342, 106347, \r
+    106351, 106356, 106361, 106366, 106370, 106375, 106380, 106384, 106388, \r
+    106392, 106396, 106401, 106406, 106410, 106414, 106419, 106423, 106428, \r
+    106433, 106438, 106443, 106448, 106452, 106457, 106462, 106467, 106471, \r
+    106476, 0, 106481, 106485, 106490, 106495, 106499, 106503, 106507, \r
+    106511, 106516, 106521, 106525, 106529, 106534, 106538, 106543, 106548, \r
+    106553, 106558, 106563, 106568, 106574, 106580, 106586, 106591, 106597, \r
+    106603, 106609, 106614, 106620, 106626, 106631, 106636, 106641, 106646, \r
+    106652, 106658, 106663, 106668, 106674, 106679, 106685, 106691, 106697, \r
+    106703, 106709, 106714, 106720, 106726, 106732, 106737, 106743, 106749, \r
+    106755, 106760, 106766, 106772, 106777, 106782, 106787, 106792, 106798, \r
+    106804, 106809, 106814, 106820, 106825, 106831, 106837, 106843, 106849, \r
+    106855, 0, 106859, 106864, 0, 0, 106869, 0, 0, 106874, 106879, 0, 0, \r
+    106884, 106888, 106892, 106897, 0, 106902, 106906, 106911, 106915, \r
+    106920, 106925, 106930, 106935, 106940, 106944, 106949, 106954, 0, \r
+    106959, 0, 106964, 106969, 106973, 106978, 106983, 106987, 106991, 0, \r
+    106995, 107000, 107005, 107009, 107013, 107018, 107022, 107027, 107032, \r
+    107037, 107042, 107047, 107052, 107058, 107064, 107070, 107075, 107081, \r
+    107087, 107093, 107098, 107104, 107110, 107115, 107120, 107125, 107130, \r
+    107136, 107142, 107147, 107152, 107158, 107163, 107169, 107175, 107181, \r
+    107187, 107193, 107198, 107204, 107210, 107216, 107221, 107227, 107233, \r
+    107239, 107244, 107250, 107256, 107261, 107266, 107271, 107276, 107282, \r
+    107288, 107293, 107298, 107304, 107309, 107315, 107321, 107327, 107333, \r
+    107339, 107343, 0, 107348, 107353, 107357, 107362, 0, 0, 107367, 107372, \r
+    107377, 107381, 107385, 107389, 107393, 107398, 0, 107403, 107407, \r
+    107412, 107416, 107421, 107426, 107431, 0, 107436, 107440, 107445, \r
+    107450, 107455, 107459, 107464, 107469, 107474, 107478, 107483, 107488, \r
+    107492, 107496, 107500, 107504, 107509, 107514, 107518, 107522, 107527, \r
+    107531, 107536, 107541, 107546, 107551, 107556, 107560, 0, 107565, \r
+    107570, 107574, 107579, 0, 107584, 107588, 107593, 107598, 107602, 0, \r
+    107606, 0, 0, 0, 107610, 107614, 107619, 107623, 107628, 107633, 107638, \r
+    0, 107643, 107647, 107652, 107657, 107662, 107666, 107671, 107676, \r
+    107681, 107685, 107690, 107695, 107699, 107703, 107707, 107711, 107716, \r
+    107721, 107725, 107729, 107734, 107738, 107743, 107748, 107753, 107758, \r
+    107763, 107768, 107774, 107780, 107786, 107791, 107797, 107803, 107809, \r
+    107814, 107820, 107826, 107831, 107836, 107841, 107846, 107852, 107858, \r
+    107863, 107868, 107874, 107879, 107885, 107891, 107897, 107903, 107909, \r
+    107914, 107920, 107926, 107932, 107937, 107943, 107949, 107955, 107960, \r
+    107966, 107972, 107977, 107982, 107987, 107992, 107998, 108004, 108009, \r
+    108014, 108020, 108025, 108031, 108037, 108043, 108049, 108055, 108059, \r
+    108064, 108069, 108074, 108078, 108083, 108088, 108093, 108097, 108102, \r
+    108107, 108111, 108115, 108119, 108123, 108128, 108133, 108137, 108141, \r
+    108146, 108150, 108155, 108160, 108165, 108170, 108175, 108179, 108184, \r
+    108189, 108194, 108198, 108203, 108208, 108213, 108217, 108222, 108227, \r
+    108231, 108235, 108239, 108243, 108248, 108253, 108257, 108261, 108266, \r
+    108270, 108275, 108280, 108285, 108290, 108295, 108300, 108306, 108312, \r
+    108318, 108323, 108329, 108335, 108341, 108346, 108352, 108358, 108363, \r
+    108368, 108373, 108378, 108384, 108390, 108395, 108400, 108406, 108411, \r
+    108417, 108423, 108429, 108435, 108441, 108446, 108452, 108458, 108464, \r
+    108469, 108475, 108481, 108487, 108492, 108498, 108504, 108509, 108514, \r
+    108519, 108524, 108530, 108536, 108541, 108546, 108552, 108557, 108563, \r
+    108569, 108575, 108581, 108587, 108592, 108598, 108604, 108610, 108615, \r
+    108621, 108627, 108633, 108638, 108644, 108650, 108655, 108660, 108665, \r
+    108670, 108676, 108682, 108687, 108692, 108698, 108703, 108709, 108715, \r
+    108721, 108727, 108733, 108738, 108744, 108750, 108756, 108761, 108767, \r
+    108773, 108779, 108784, 108790, 108796, 108801, 108806, 108811, 108816, \r
+    108822, 108828, 108833, 108838, 108844, 108849, 108855, 108861, 108867, \r
+    108873, 108879, 108885, 108892, 108899, 108906, 108912, 108919, 108926, \r
+    108933, 108939, 108946, 108953, 108959, 108965, 108971, 108977, 108984, \r
+    108991, 108997, 109003, 109010, 109016, 109023, 109030, 109037, 109044, \r
+    109051, 109057, 109064, 109071, 109078, 109084, 109091, 109098, 109105, \r
+    109111, 109118, 109125, 109131, 109137, 109143, 109149, 109156, 109163, \r
+    109169, 109175, 109182, 109188, 109195, 109202, 109209, 109216, 109223, \r
+    109227, 109232, 109237, 109242, 109246, 109251, 109256, 109261, 109265, \r
+    109270, 109275, 109279, 109283, 109287, 109291, 109296, 109301, 109305, \r
+    109309, 109314, 109318, 109323, 109328, 109333, 109338, 109343, 109347, \r
+    109352, 109357, 109362, 109366, 109371, 109376, 109381, 109385, 109390, \r
+    109395, 109399, 109403, 109407, 109411, 109416, 109421, 109425, 109429, \r
+    109434, 109438, 109443, 109448, 109453, 109458, 109463, 109469, 0, 0, \r
+    109476, 109481, 109486, 109491, 109496, 109501, 109506, 109511, 109516, \r
+    109521, 109526, 109531, 109536, 109541, 109546, 109551, 109556, 109561, \r
+    109567, 109572, 109577, 109582, 109587, 109592, 109597, 109602, 109606, \r
+    109611, 109616, 109621, 109626, 109631, 109636, 109641, 109646, 109651, \r
+    109656, 109661, 109666, 109671, 109676, 109681, 109686, 109691, 109697, \r
+    109702, 109707, 109712, 109717, 109722, 109727, 109732, 109738, 109743, \r
+    109748, 109753, 109758, 109763, 109768, 109773, 109778, 109783, 109788, \r
+    109793, 109798, 109803, 109808, 109813, 109818, 109823, 109828, 109833, \r
+    109838, 109843, 109848, 109853, 109859, 109864, 109869, 109874, 109879, \r
+    109884, 109889, 109894, 109898, 109903, 109908, 109913, 109918, 109923, \r
+    109928, 109933, 109938, 109943, 109948, 109953, 109958, 109963, 109968, \r
+    109973, 109978, 109983, 109989, 109994, 109999, 110004, 110009, 110014, \r
+    110019, 110024, 110030, 110035, 110040, 110045, 110050, 110055, 110060, \r
+    110066, 110072, 110078, 110084, 110090, 110096, 110102, 110108, 110114, \r
+    110120, 110126, 110132, 110138, 110144, 110150, 110156, 110162, 110169, \r
+    110175, 110181, 110187, 110193, 110199, 110205, 110211, 110216, 110222, \r
+    110228, 110234, 110240, 110246, 110252, 110258, 110264, 110270, 110276, \r
+    110282, 110288, 110294, 110300, 110306, 110312, 110318, 110325, 110331, \r
+    110337, 110343, 110349, 110355, 110361, 110367, 110374, 110380, 110386, \r
+    110392, 110398, 110404, 110410, 110416, 110422, 110428, 110434, 110440, \r
+    110446, 110452, 110458, 110464, 110470, 110476, 110482, 110488, 110494, \r
+    110500, 110506, 110512, 110519, 110525, 110531, 110537, 110543, 110549, \r
+    110555, 110561, 110566, 110572, 110578, 110584, 110590, 110596, 110602, \r
+    110608, 110614, 110620, 110626, 110632, 110638, 110644, 110650, 110656, \r
+    110662, 110668, 110675, 110681, 110687, 110693, 110699, 110705, 110711, \r
+    110717, 110724, 110730, 110736, 110742, 110748, 110754, 110760, 110767, \r
+    110774, 110781, 110788, 110795, 110802, 110809, 110816, 110823, 110830, \r
+    110837, 110844, 110851, 110858, 110865, 110872, 110879, 110887, 110894, \r
+    110901, 110908, 110915, 110922, 110929, 110936, 110942, 110949, 110956, \r
+    110963, 110970, 110977, 110984, 110991, 110998, 111005, 111012, 111019, \r
+    111026, 111033, 111040, 111047, 111054, 111061, 111069, 111076, 111083, \r
+    111090, 111097, 111104, 111111, 111118, 111126, 111133, 111140, 111147, \r
+    111154, 111161, 111168, 111173, 0, 0, 111178, 111183, 111187, 111191, \r
+    111195, 111199, 111203, 111207, 111211, 111215, 111219, 111224, 111228, \r
+    111232, 111236, 111240, 111244, 111248, 111252, 111256, 111260, 111265, \r
+    111269, 111273, 111277, 111281, 111285, 111289, 111293, 111297, 111301, \r
+    111307, 111312, 111317, 111322, 111327, 111332, 111337, 111342, 111347, \r
+    111352, 111357, 111361, 111365, 111369, 111373, 111377, 111381, 111385, \r
+    111389, 111393, 111400, 111407, 111414, 111421, 111428, 111435, 111441, \r
+    111448, 111455, 111462, 111470, 111478, 111486, 111494, 111502, 111510, \r
+    111517, 111524, 111531, 111539, 111547, 111555, 111563, 111571, 111579, \r
+    111586, 111593, 111600, 111608, 111616, 111624, 111632, 111640, 111648, \r
+    111653, 111658, 111663, 111668, 111673, 111678, 111683, 111688, 111693, \r
+    0, 0, 0, 0, 111698, 111703, 111707, 111711, 111715, 111719, 111723, \r
+    111727, 111731, 111735, 111739, 111743, 111747, 111751, 111755, 111759, \r
+    111763, 111767, 111771, 111775, 111779, 111783, 111787, 111791, 111795, \r
+    111799, 111803, 111807, 111811, 111815, 111819, 111823, 111827, 111831, \r
+    111835, 111839, 111843, 111847, 111851, 111855, 111859, 111863, 111867, \r
+    111871, 111875, 111879, 111883, 111887, 111891, 111895, 111899, 111904, \r
+    111908, 111912, 111916, 111920, 111924, 111928, 111932, 111936, 111940, \r
+    111944, 111948, 111952, 111956, 111960, 111964, 111968, 111972, 111976, \r
+    111980, 111984, 111988, 111992, 111996, 112000, 112004, 112008, 112012, \r
+    112016, 112020, 112024, 112028, 112032, 112036, 112040, 112044, 112048, \r
+    112052, 112056, 112060, 112064, 112068, 112072, 112076, 112080, 112084, \r
+    112088, 112092, 112096, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112100, \r
+    112107, 112112, 112116, 112120, 112124, 112129, 112134, 112139, 112144, \r
+    112149, 0, 0, 0, 0, 0, 112154, 112159, 112165, 112171, 112177, 112182, \r
+    112188, 112194, 112200, 112205, 112211, 112217, 112222, 112227, 112232, \r
+    112237, 112243, 112249, 112254, 112259, 112265, 112270, 112276, 112282, \r
+    112288, 112294, 112300, 112310, 112317, 112323, 112326, 0, 0, 112329, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112335, 0, 112340, 0, 0, 112346, 0, 0, 0, \r
+    112351, 0, 0, 0, 112357, 112360, 112363, 112366, 112369, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 112372, 0, 0, 0, 0, 0, 0, 0, 112380, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112388, 0, 112396, \r
+    112403, 0, 0, 112410, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112418, 112428, \r
+    112433, 112437, 0, 0, 112442, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 112445, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112449, 112455, \r
+    112461, 112467, 112471, 112477, 112483, 112489, 112495, 112501, 112507, \r
+    112513, 112519, 112525, 112531, 112537, 112543, 112549, 112555, 112561, \r
+    112567, 112573, 112579, 112585, 112591, 112597, 112603, 112609, 112615, \r
+    112621, 112627, 112633, 112639, 112645, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 112651, 112662, 112673, 112684, 112695, 112706, 112717, 112728, \r
+    112739, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 112750, 112754, 112758, 112762, 112766, \r
+    112770, 112774, 112778, 112782, 112786, 112790, 112794, 112798, 112802, \r
+    112806, 112810, 112814, 112818, 112822, 112826, 112830, 112834, 112838, \r
+    112842, 112846, 112850, 112854, 112858, 112862, 112866, 112870, 112874, \r
+    112878, 112882, 112886, 112890, 112894, 112898, 112902, 112906, 112910, \r
+    112914, 112918, 112922, 112926, 112930, 112934, 112938, 112942, 112946, \r
+    112950, 112954, 112958, 112962, 112966, 112970, 112974, 112978, 112982, \r
+    112986, 112990, 112994, 112998, 113002, 113006, 113010, 113014, 113018, \r
+    113022, 113026, 113030, 113034, 113038, 113042, 113046, 113050, 113054, \r
+    113058, 113062, 113066, 113070, 113074, 113078, 113082, 113086, 113090, \r
+    113094, 113098, 113102, 113106, 113110, 113114, 113118, 113122, 113126, \r
+    113130, 113134, 113138, 113142, 113146, 113150, 113154, 113158, 113162, \r
+    113166, 113170, 113174, 113178, 113182, 113186, 113190, 113194, 113198, \r
+    113202, 113206, 113210, 113214, 113218, 113222, 113226, 113230, 113234, \r
+    113238, 113242, 113246, 113250, 113254, 113258, 113262, 113266, 113270, \r
+    113274, 113278, 113282, 113286, 113290, 113294, 113298, 113302, 113306, \r
+    113310, 113314, 113318, 113322, 113326, 113330, 113334, 113338, 113342, \r
+    113346, 113350, 113354, 113358, 113362, 113366, 113370, 113374, 113378, \r
+    113382, 113386, 113390, 113394, 113398, 113402, 113406, 113410, 113414, \r
+    113418, 113422, 113426, 113430, 113434, 113438, 113442, 113446, 113450, \r
+    113454, 113458, 113462, 113466, 113470, 113474, 113478, 113482, 113486, \r
+    113490, 113494, 113498, 113502, 113506, 113510, 113514, 113518, 113522, \r
+    113526, 113530, 113534, 113538, 113542, 113546, 113550, 113554, 113558, \r
+    113562, 113566, 113570, 113574, 113578, 113582, 113586, 113590, 113594, \r
+    113598, 113602, 113606, 113610, 113614, 113618, 113622, 113626, 113630, \r
+    113634, 113638, 113642, 113646, 113650, 113654, 113658, 113662, 113666, \r
+    113670, 113674, 113678, 113682, 113686, 113690, 113694, 113698, 113702, \r
+    113706, 113710, 113714, 113718, 113722, 113726, 113730, 113734, 113738, \r
+    113742, 113746, 113750, 113754, 113758, 113762, 113766, 113770, 113774, \r
+    113778, 113782, 113786, 113790, 113794, 113798, 113802, 113806, 113810, \r
+    113814, 113818, 113822, 113826, 113830, 113834, 113838, 113842, 113846, \r
+    113850, 113854, 113858, 113862, 113866, 113870, 113874, 113878, 113882, \r
+    113886, 113890, 113894, 113898, 113902, 113906, 113910, 113914, 113918, \r
+    113922, 113926, 113930, 113934, 113938, 113942, 113946, 113950, 113954, \r
+    113958, 113962, 113966, 113970, 113974, 113978, 113982, 113986, 113990, \r
+    113994, 113998, 114002, 114006, 114010, 114014, 114018, 114022, 114026, \r
+    114030, 114034, 114038, 114042, 114046, 114050, 114054, 114058, 114062, \r
+    114066, 114070, 114074, 114078, 114082, 114086, 114090, 114094, 114098, \r
+    114102, 114106, 114110, 114114, 114118, 114122, 114126, 114130, 114134, \r
+    114138, 114142, 114146, 114150, 114154, 114158, 114162, 114166, 114170, \r
+    114174, 114178, 114182, 114186, 114190, 114194, 114198, 114202, 114206, \r
+    114210, 114214, 114218, 114222, 114226, 114230, 114234, 114238, 114242, \r
+    114246, 114250, 114254, 114258, 114262, 114266, 114270, 114274, 114278, \r
+    114282, 114286, 114290, 114294, 114298, 114302, 114306, 114310, 114314, \r
+    114318, 114322, 114326, 114330, 114334, 114338, 114342, 114346, 114350, \r
+    114354, 114358, 114362, 114366, 114370, 114374, 114378, 114382, 114386, \r
+    114390, 114394, 114398, 114402, 114406, 114410, 114414, 114418, 114422, \r
+    114426, 114430, 114434, 114438, 114442, 114446, 114450, 114454, 114458, \r
+    114462, 114466, 114470, 114474, 114478, 114482, 114486, 114490, 114494, \r
+    114498, 114502, 114506, 114510, 114514, 114518, 114522, 114526, 114530, \r
+    114534, 114538, 114542, 114546, 114550, 114554, 114558, 114562, 114566, \r
+    114570, 114574, 114578, 114582, 114586, 114590, 114594, 114598, 114602, \r
+    114606, 114610, 114614, 114618, 114622, 114626, 114630, 114634, 114638, \r
+    114642, 114646, 114650, 114654, 114658, 114662, 114666, 114670, 114674, \r
+    114678, 114682, 114686, 114690, 114694, 114698, 114702, 114706, 114710, \r
+    114714, 114718, 114722, 114726, 114730, 114734, 114738, 114742, 114746, \r
+    114750, 114754, 114758, 114762, 114766, 114770, 114774, 114778, 114782, \r
+    114786, 114790, 114794, 114798, 114802, 114806, 114810, 114814, 114818, \r
+    114822, 114826, 114830, 114834, 114838, 114842, 114846, 114850, 114854, \r
+    114858, 114862, 114866, 114870, 114874, 114878, 114882, 114886, 114890, \r
+    114894, 114898, 114902, 114906, 114910, 114914, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114918, 0, 0, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 114922, 114925, 114929, 114933, 114936, 114940, 114944, 114947, \r
+    114950, 114954, 114958, 114961, 114964, 114967, 114970, 114975, 114978, \r
+    114982, 114985, 114988, 114991, 114994, 114997, 115000, 115003, 115006, \r
+    115009, 115012, 115015, 115019, 115023, 115027, 115031, 115036, 115041, \r
+    115047, 115053, 115059, 115064, 115070, 115076, 115082, 115087, 115093, \r
+    115099, 115104, 115109, 115114, 115119, 115125, 115131, 115136, 115141, \r
+    115147, 115152, 115158, 115164, 115170, 115176, 115182, 115186, 115191, \r
+    115195, 115200, 115204, 115209, 115214, 115220, 115226, 115232, 115237, \r
+    115243, 115249, 115255, 115260, 115266, 115272, 115277, 115282, 115287, \r
+    115292, 115298, 115304, 115309, 115314, 115320, 115325, 115331, 115337, \r
+    115343, 115349, 115355, 115360, 115364, 115369, 115372, 115376, 115379, \r
+    115382, 115385, 115388, 115391, 115394, 115397, 115400, 115403, 115406, \r
+    115409, 115412, 115415, 115418, 115421, 115424, 115427, 115430, 115433, \r
+    115436, 115439, 115442, 115445, 115448, 115451, 115454, 115457, 115460, \r
+    115463, 115466, 115469, 115472, 115475, 115478, 115481, 115484, 115487, \r
+    115490, 115493, 115496, 115499, 115502, 115505, 115508, 115511, 115514, \r
+    115517, 115520, 115523, 115526, 115529, 115532, 115535, 115538, 115541, \r
+    115544, 115547, 115550, 115553, 115556, 115559, 115562, 115565, 115568, \r
+    115571, 115574, 115577, 115580, 115583, 115586, 115589, 115592, 115595, \r
+    115598, 115601, 115604, 115607, 115610, 115613, 115616, 115619, 115622, \r
+    115625, 115628, 115631, 115634, 115637, 115640, 115643, 115646, 115649, \r
+    115652, 115655, 115658, 115661, 115664, 115667, 115670, 115673, 115676, \r
+    115679, 115682, 115685, 115688, 115691, 115694, 115697, 115700, 115703, \r
+    115706, 115709, 115712, 115715, 115718, 115721, 115724, 115727, 115730, \r
+    115733, 115736, 115739, 115742, 115745, 115748, 115751, 115754, 115757, \r
+    115760, 115763, 115766, 115769, 115772, 115775, 115778, 115781, 115784, \r
+    115787, 115790, 115793, 115796, 115799, 115802, 115805, 115808, 115811, \r
+    115814, 115817, 115820, 115823, 115826, 115829, 115832, 115835, 115838, \r
+    115841, 115844, 115847, 115850, 115853, 115856, 115859, 115862, 115865, \r
+    115868, 115871, 115874, 115877, 115880, 115883, 115886, 115889, 115892, \r
+    115895, 115898, 115901, 115904, 115907, 115910, 115913, 115916, 115919, \r
+    115922, 115925, 115928, 115931, 115934, 115937, 115940, 115943, 115946, \r
+    115949, 115952, 115955, 115958, 115961, 115964, 115967, 115970, 115973, \r
+    115976, 115979, 115982, 115985, 115988, 115991, 115994, 115997, 116000, \r
+    116003, 116006, 116009, 116012, 116015, 116018, 116021, 116024, 116027, \r
+    116030, 116033, 116036, 116039, 116042, 116045, 116048, 116051, 116054, \r
+    116057, 116060, 116063, 116066, 116069, 116072, 116075, 116078, 116081, \r
+    116084, 116087, 116090, 116093, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    0, 0, \r
+};\r
+\r
+/* name->code dictionary */\r
+static unsigned int code_hash[] = {\r
+    74224, 4851, 0, 78156, 78499, 0, 7929, 0, 194682, 0, 78500, 66480, 0, \r
+    42833, 74529, 12064, 0, 596, 0, 0, 13192, 8651, 0, 0, 120218, 12995, \r
+    64865, 1373, 0, 0, 5816, 119067, 64810, 4231, 6825, 0, 4233, 4234, 4232, \r
+    917836, 74415, 120210, 6384, 917840, 78108, 8851, 0, 0, 0, 41601, 8874, \r
+    0, 7748, 0, 0, 0, 0, 41603, 9784, 0, 9188, 41600, 0, 120618, 0, 1457, \r
+    3535, 0, 0, 0, 0, 65240, 11951, 0, 3404, 0, 0, 0, 1759, 0, 41076, 68383, \r
+    120572, 119205, 66577, 0, 0, 65859, 0, 7404, 0, 0, 0, 0, 65908, 9834, \r
+    3055, 9852, 0, 65288, 0, 11398, 0, 0, 119255, 0, 0, 603, 74398, 43548, 0, \r
+    0, 917824, 3350, 120817, 64318, 917828, 127089, 3390, 74483, 43265, \r
+    120599, 917830, 78573, 0, 1919, 3400, 0, 917813, 0, 917540, 66446, 64141, \r
+    8562, 64139, 64138, 4043, 8712, 64134, 64133, 11297, 0, 0, 11966, 64128, \r
+    0, 0, 0, 64132, 10867, 64130, 64129, 0, 43374, 9779, 2764, 66002, 10167, \r
+    9471, 0, 66021, 0, 0, 5457, 5440, 8857, 0, 65282, 2843, 5355, 0, 0, 0, \r
+    5194, 11657, 43984, 0, 0, 0, 0, 0, 127027, 10717, 64570, 5630, 74350, \r
+    64143, 10682, 0, 10602, 800, 42499, 66186, 0, 0, 64930, 11631, 64146, \r
+    64145, 64144, 762, 13172, 118859, 194661, 64468, 10906, 1353, 6960, 0, 0, \r
+    5828, 8724, 917806, 8933, 1601, 42244, 858, 7080, 64109, 64108, 8090, 0, \r
+    74401, 917811, 587, 0, 0, 0, 0, 0, 78214, 2750, 0, 556, 64158, 64157, 0, \r
+    12213, 194678, 2760, 0, 0, 0, 0, 64156, 64155, 42496, 0, 64151, 64150, \r
+    12679, 10053, 10421, 11093, 64153, 64152, 0, 0, 4839, 0, 0, 1874, 119016, \r
+    0, 6577, 64125, 64124, 64123, 0, 0, 0, 7007, 7590, 65443, 9036, 0, 64122, \r
+    74422, 66609, 0, 64117, 64116, 6287, 64114, 2725, 64120, 64119, 43981, \r
+    42128, 0, 1177, 65601, 12322, 64106, 0, 127306, 64102, 7859, 1945, 64099, \r
+    0, 10453, 64104, 7188, 7997, 0, 7389, 0, 8705, 64097, 64096, 9571, 528, \r
+    917989, 44017, 11429, 0, 0, 0, 917990, 73841, 0, 0, 9056, 0, 6188, \r
+    120019, 6155, 64068, 1823, 64066, 64065, 64072, 64071, 63, 7233, 120698, \r
+    0, 41904, 6639, 64064, 0, 0, 0, 1176, 118959, 0, 8162, 0, 0, 0, 120519, \r
+    66376, 66242, 11415, 4333, 9855, 64112, 64642, 0, 5388, 0, 0, 0, 7714, \r
+    66222, 0, 7768, 0, 4199, 64708, 0, 0, 0, 8708, 9560, 64077, 64076, 8996, \r
+    4992, 4471, 42622, 64079, 64078, 0, 0, 0, 0, 64615, 0, 0, 12075, 0, 0, \r
+    5174, 0, 0, 127557, 3123, 0, 12685, 0, 8408, 64704, 0, 0, 9223, 0, 41616, \r
+    0, 73797, 0, 1116, 0, 43049, 0, 43050, 8548, 120485, 0, 119061, 917999, \r
+    0, 13115, 43675, 64091, 9322, 0, 120595, 64095, 64094, 8111, 66247, \r
+    42332, 64089, 64088, 6199, 0, 0, 11434, 64083, 64082, 11329, 7737, 64087, \r
+    64086, 64085, 64084, 0, 9927, 41335, 4118, 1797, 0, 41334, 0, 46, 43448, \r
+    0, 298, 0, 0, 0, 42627, 0, 32, 6187, 119052, 11495, 11459, 3665, 0, \r
+    42871, 0, 19923, 74335, 0, 0, 66239, 0, 64403, 4412, 7240, 0, 0, 0, \r
+    65758, 12750, 4181, 8544, 0, 120199, 917897, 120198, 120203, 6181, 65014, \r
+    0, 0, 0, 3639, 119588, 0, 0, 0, 10073, 120206, 0, 0, 68409, 42844, 7498, \r
+    1098, 0, 0, 0, 0, 10207, 8789, 0, 0, 0, 0, 9234, 0, 6182, 0, 65058, 0, 0, \r
+    0, 0, 5471, 9461, 5573, 118936, 5473, 44, 0, 66244, 118907, 0, 66238, \r
+    12844, 0, 1622, 7767, 1900, 41339, 11458, 0, 0, 6581, 5576, 0, 64405, \r
+    41337, 0, 41631, 8947, 68390, 0, 41694, 0, 0, 7908, 0, 10408, 6579, 0, \r
+    64618, 0, 120147, 0, 6583, 7761, 127010, 120504, 194828, 0, 5058, 41010, \r
+    9992, 0, 5057, 0, 0, 74538, 5054, 118951, 194971, 78606, 0, 1437, 41617, \r
+    658, 3497, 0, 7486, 5061, 5060, 4235, 0, 0, 0, 12113, 4236, 4727, 0, 0, \r
+    7693, 10749, 0, 7488, 5773, 978, 0, 0, 41619, 10239, 68611, 0, 66209, 0, \r
+    0, 9748, 0, 127524, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9341, 119596, \r
+    2379, 11325, 0, 64668, 67854, 8125, 120545, 6743, 119175, 917940, 2369, \r
+    0, 0, 0, 119235, 74092, 73936, 7008, 43660, 0, 0, 0, 2367, 0, 0, 264, \r
+    2375, 8060, 6194, 119858, 1844, 119084, 0, 12858, 0, 0, 6961, 0, 118839, \r
+    0, 8800, 0, 42862, 4463, 65581, 6192, 194676, 42771, 0, 0, 725, 65042, \r
+    118797, 120800, 0, 12892, 0, 0, 0, 0, 0, 0, 0, 120707, 0, 0, 5074, 5073, \r
+    0, 8983, 0, 74493, 0, 5072, 0, 6198, 11614, 0, 196, 0, 0, 0, 4929, \r
+    120342, 0, 0, 0, 0, 42847, 0, 0, 0, 4934, 0, 41323, 9758, 0, 120341, 0, \r
+    42584, 0, 4329, 41321, 4979, 3048, 7752, 41320, 0, 74418, 12819, 0, 5071, \r
+    0, 3642, 0, 5070, 10042, 118835, 3987, 5068, 0, 8909, 78650, 78649, 0, \r
+    10636, 73981, 11806, 43167, 4531, 1245, 9105, 66463, 4921, 120219, 4926, \r
+    65544, 73884, 194619, 0, 0, 64709, 0, 194620, 78880, 4922, 325, 992, \r
+    119568, 4925, 0, 0, 9526, 4920, 0, 948, 0, 120208, 4930, 0, 0, 120275, \r
+    4933, 0, 0, 118985, 4928, 0, 0, 74770, 120194, 0, 722, 0, 19908, 12637, \r
+    0, 119855, 8753, 1509, 0, 5468, 9511, 0, 0, 1672, 6205, 10864, 74586, 0, \r
+    0, 0, 0, 0, 73863, 0, 0, 41607, 120115, 1679, 120116, 120180, 120113, 0, \r
+    7005, 41609, 9580, 0, 401, 0, 120109, 6968, 5761, 342, 8553, 0, 8143, \r
+    127115, 11983, 127113, 624, 74508, 0, 119630, 5078, 74258, 12478, 0, \r
+    5076, 0, 194609, 0, 120097, 685, 9025, 1524, 12618, 0, 5539, 0, 120095, \r
+    120102, 120094, 120552, 0, 194611, 78752, 0, 12520, 8058, 9732, 0, 5080, \r
+    64775, 5036, 5035, 120590, 42604, 0, 0, 8074, 275, 13291, 1907, 78838, \r
+    4432, 127271, 5033, 127273, 127272, 4836, 3888, 73792, 10729, 64546, \r
+    127262, 43704, 127264, 127251, 67588, 119000, 127252, 127255, 8858, 6409, \r
+    127256, 120252, 0, 0, 0, 66321, 0, 12814, 127248, 3432, 10218, 0, 6094, \r
+    7641, 42445, 0, 0, 42406, 1676, 74320, 194607, 0, 5030, 0, 0, 0, 0, 9622, \r
+    0, 0, 6787, 0, 0, 0, 0, 10544, 12919, 0, 0, 0, 0, 0, 120789, 0, 947, \r
+    119835, 194586, 194585, 10969, 119935, 7613, 119937, 119936, 4795, \r
+    119930, 7018, 7376, 120181, 120192, 120268, 0, 43567, 74056, 917910, \r
+    118963, 119919, 7216, 65232, 7217, 251, 7218, 7895, 4395, 43538, 119926, \r
+    119929, 119928, 7213, 119922, 7214, 7215, 0, 74141, 8880, 7685, 66459, \r
+    120173, 65540, 119618, 625, 8187, 42861, 1113, 7236, 7915, 3630, 120176, \r
+    8179, 74264, 67886, 9316, 10980, 2489, 65624, 8150, 1359, 67652, 0, 0, \r
+    73756, 5042, 5041, 42769, 12084, 0, 0, 0, 127319, 0, 917906, 0, 0, 12283, \r
+    1616, 3795, 0, 8795, 66245, 0, 0, 0, 1138, 73905, 12677, 0, 0, 3239, 0, \r
+    0, 0, 8431, 0, 42164, 0, 11778, 12620, 6826, 73773, 119073, 5040, 0, 0, \r
+    0, 78420, 0, 5039, 0, 78418, 0, 5038, 0, 0, 13184, 74293, 0, 64648, 0, \r
+    9359, 78416, 0, 0, 65157, 6662, 0, 0, 3863, 73909, 4835, 55266, 43432, 0, \r
+    4309, 0, 194569, 0, 194568, 1301, 0, 42589, 569, 0, 73813, 711, 119085, \r
+    0, 0, 73880, 11610, 11368, 0, 194571, 41331, 1006, 74240, 0, 1550, 8201, \r
+    73737, 7627, 5499, 5031, 77908, 42738, 65784, 77907, 65267, 3758, 0, \r
+    65781, 64734, 0, 2440, 65780, 77913, 8449, 0, 5008, 0, 8822, 0, 12121, \r
+    8255, 5512, 73875, 119560, 0, 64313, 2641, 5906, 1119, 127068, 13038, 0, \r
+    2455, 0, 118809, 0, 0, 0, 0, 8714, 0, 4211, 0, 0, 0, 0, 43713, 5052, \r
+    66220, 5821, 6186, 65778, 65775, 5051, 65773, 1429, 42647, 5050, 302, \r
+    388, 41115, 735, 6637, 5907, 120670, 0, 12726, 74594, 9117, 0, 195010, \r
+    5513, 6666, 5053, 74230, 5510, 78451, 0, 78447, 2470, 78437, 0, 1925, 0, \r
+    0, 74807, 0, 5048, 5047, 0, 0, 0, 194863, 0, 74497, 0, 8089, 6929, 639, \r
+    0, 68179, 0, 0, 0, 4599, 41402, 6674, 43397, 43294, 1476, 648, 0, 65819, \r
+    3233, 0, 41782, 6951, 0, 0, 3530, 9750, 0, 0, 6656, 194858, 0, 5046, \r
+    8512, 65856, 74261, 8967, 0, 5045, 0, 1916, 7986, 5044, 120556, 9006, \r
+    13128, 5043, 0, 7853, 74068, 74004, 9669, 12341, 12703, 8402, 0, 119070, \r
+    0, 41750, 3586, 64508, 43148, 0, 0, 119606, 0, 13296, 517, 0, 0, 0, \r
+    41528, 123, 65454, 0, 0, 74478, 10531, 7784, 41526, 10829, 73991, 8057, \r
+    1126, 73895, 0, 194591, 0, 3925, 4251, 8069, 10517, 120439, 489, 0, 4250, \r
+    120441, 120452, 43151, 0, 0, 66200, 0, 0, 0, 78423, 0, 0, 8711, 6183, 0, \r
+    0, 0, 120448, 7623, 118925, 194853, 9235, 12760, 74176, 0, 66445, 43540, \r
+    120437, 3743, 11514, 11078, 0, 12136, 0, 0, 120435, 0, 7726, 0, 19922, \r
+    267, 3393, 42198, 1371, 194849, 69233, 2458, 0, 6201, 0, 41074, 4266, \r
+    10652, 41612, 41077, 3402, 9050, 3398, 0, 0, 0, 3391, 41075, 2476, 0, \r
+    917550, 0, 10625, 0, 12767, 13017, 78743, 64261, 64934, 127537, 13014, \r
+    13013, 0, 6673, 0, 0, 0, 12438, 0, 0, 0, 0, 0, 9053, 13015, 74523, 0, \r
+    704, 66215, 6195, 0, 6660, 78758, 917760, 917793, 42212, 12629, 11435, 0, \r
+    55256, 65538, 0, 0, 0, 74547, 0, 65448, 78100, 12948, 119001, 195002, \r
+    119238, 195004, 78099, 127085, 0, 0, 4287, 8276, 4902, 1131, 0, 78458, \r
+    66728, 1816, 0, 42533, 168, 42845, 4898, 64298, 0, 0, 4901, 1821, 0, 578, \r
+    3653, 0, 791, 9162, 6977, 0, 119298, 74561, 0, 73731, 8354, 43590, 0, 0, \r
+    7557, 0, 119301, 8234, 7241, 0, 194994, 119167, 194996, 12811, 65925, \r
+    3946, 78078, 10998, 78080, 673, 194867, 64397, 0, 74599, 78449, 8890, \r
+    194977, 194976, 2448, 78085, 10267, 8424, 2452, 78083, 194864, 8729, \r
+    78456, 0, 7845, 0, 78692, 4408, 4122, 6772, 11039, 8723, 194990, 194989, \r
+    119302, 731, 119304, 119303, 2438, 64855, 119300, 119299, 1175, 0, 42135, \r
+    373, 119172, 5396, 11457, 11521, 7723, 0, 0, 0, 41952, 0, 5273, 8248, \r
+    5269, 6337, 5202, 2404, 5267, 42823, 11291, 19915, 5277, 12963, 0, 6189, \r
+    4125, 1314, 12133, 0, 118873, 1271, 0, 0, 66024, 41482, 3864, 74539, 0, \r
+    3879, 0, 12978, 4166, 4574, 0, 7567, 7459, 0, 41390, 5384, 41882, 67647, \r
+    0, 5759, 0, 0, 41388, 0, 41392, 64288, 41387, 0, 8706, 5552, 0, 700, 0, \r
+    5553, 0, 7088, 5356, 7499, 78110, 66596, 0, 0, 10263, 5554, 0, 12344, \r
+    10311, 78113, 6665, 0, 0, 7618, 8517, 11455, 78440, 64632, 66017, 5555, \r
+    78088, 78093, 78091, 0, 42803, 65033, 9143, 6668, 195067, 195066, 195069, \r
+    656, 195071, 65037, 4577, 64624, 0, 0, 0, 0, 4269, 73885, 917775, 42846, \r
+    917774, 950, 0, 0, 66580, 118895, 66683, 10554, 917778, 119121, 0, 5098, \r
+    917770, 0, 119099, 5097, 4935, 9848, 10381, 0, 917560, 0, 3651, 0, 0, \r
+    127556, 5102, 5101, 10269, 12983, 8138, 4517, 1932, 5100, 1439, 12093, \r
+    1247, 10034, 195064, 5099, 78373, 1441, 42087, 3063, 650, 0, 7838, 0, \r
+    195041, 195040, 119142, 9031, 120790, 195044, 9078, 8545, 66356, 195048, \r
+    0, 9154, 9118, 0, 0, 2676, 7750, 0, 73812, 6190, 8599, 195053, 0, 10795, \r
+    9857, 7014, 9856, 195033, 0, 12129, 0, 8481, 0, 6202, 195035, 10920, \r
+    195037, 5203, 195039, 195038, 5108, 5107, 65818, 66019, 9762, 0, 5541, \r
+    74772, 0, 12613, 5284, 6657, 207, 0, 4275, 74819, 854, 68147, 74381, 0, \r
+    0, 5103, 0, 64348, 41368, 43974, 488, 69811, 0, 0, 10157, 0, 43034, \r
+    11438, 0, 0, 0, 68431, 41771, 5106, 6669, 8504, 65154, 69813, 41367, \r
+    5105, 195030, 69809, 6476, 5104, 0, 304, 3176, 0, 0, 932, 0, 6567, 238, \r
+    74522, 195011, 194595, 19905, 120577, 195015, 120187, 41044, 67640, \r
+    194902, 42055, 9912, 65939, 10670, 74093, 13273, 0, 12552, 195019, 8803, \r
+    309, 6622, 8151, 10858, 194596, 67636, 0, 12568, 0, 12553, 0, 43275, \r
+    6950, 9712, 68680, 43970, 0, 65165, 0, 0, 66466, 0, 0, 0, 66725, 6191, \r
+    11351, 10437, 11316, 67634, 0, 0, 41754, 67635, 9370, 2720, 194975, \r
+    68462, 8232, 118817, 0, 3222, 0, 0, 0, 66663, 0, 0, 10834, 0, 0, 65732, \r
+    0, 917547, 119579, 67679, 195020, 0, 7781, 41383, 64568, 0, 120738, \r
+    12077, 0, 64586, 917620, 42396, 55255, 3475, 0, 2479, 0, 3632, 120728, \r
+    10698, 8376, 3648, 194960, 74844, 67639, 3636, 67894, 3650, 8837, 65229, \r
+    1843, 42283, 43250, 41562, 9100, 74548, 0, 3640, 0, 42321, 7284, 194974, \r
+    194973, 194950, 194949, 194952, 194951, 0, 194953, 42080, 2529, 0, 0, 0, \r
+    42083, 120678, 68398, 194957, 67619, 66367, 194958, 9634, 0, 9988, 0, \r
+    41068, 0, 0, 65264, 0, 0, 917923, 0, 785, 8236, 194942, 9027, 68160, \r
+    67623, 64383, 0, 925, 0, 0, 41985, 41071, 9586, 0, 41984, 9217, 0, 0, 0, \r
+    9186, 2067, 4016, 0, 0, 381, 0, 0, 42077, 0, 194946, 5184, 42078, 194947, \r
+    10810, 0, 4585, 19943, 5860, 67633, 0, 0, 812, 3615, 0, 5178, 44000, \r
+    120548, 78807, 5188, 74287, 67629, 3605, 10692, 1166, 64429, 42639, 924, \r
+    0, 67631, 0, 0, 2442, 10703, 78789, 67632, 917924, 12771, 12736, 12753, \r
+    0, 73933, 67626, 42401, 0, 0, 127373, 42288, 12751, 0, 8542, 13145, 0, \r
+    2468, 66706, 41294, 3626, 3883, 64388, 42479, 0, 41117, 0, 0, 0, 0, \r
+    67624, 0, 1290, 0, 65585, 2715, 806, 65208, 41884, 917883, 7027, 64731, \r
+    0, 0, 0, 66325, 3465, 2405, 9240, 0, 12756, 65259, 0, 0, 12752, 5833, \r
+    1432, 0, 41883, 73912, 9799, 0, 41886, 2480, 0, 2062, 127293, 6494, 5537, \r
+    78656, 0, 194587, 0, 1211, 0, 0, 0, 118832, 12318, 0, 0, 0, 10622, 0, 0, \r
+    0, 6566, 78659, 0, 73780, 0, 64864, 0, 78660, 0, 8284, 0, 0, 3589, 0, \r
+    4035, 6492, 118981, 4265, 6642, 3977, 74186, 41778, 836, 119216, 2488, 0, \r
+    4582, 0, 0, 41777, 12926, 0, 7528, 10550, 0, 0, 0, 0, 0, 1374, 64878, \r
+    119014, 0, 42389, 41374, 0, 0, 78492, 41377, 0, 0, 400, 12597, 120586, 0, \r
+    0, 6661, 0, 64827, 0, 73817, 390, 0, 74755, 0, 3473, 7718, 0, 0, 0, \r
+    55285, 0, 0, 0, 11969, 0, 0, 6365, 1887, 6763, 0, 8080, 7006, 0, 0, 6757, \r
+    0, 1544, 0, 6766, 64677, 120716, 0, 6146, 0, 771, 0, 0, 12812, 13168, \r
+    42272, 12200, 917927, 7904, 0, 953, 12917, 0, 12300, 0, 11491, 9724, \r
+    10341, 0, 9524, 7490, 11389, 7489, 3379, 0, 7487, 0, 471, 7484, 7482, \r
+    6753, 7480, 7479, 7478, 7477, 6501, 7475, 6918, 7473, 7472, 2474, 7470, \r
+    7468, 10232, 10615, 10213, 0, 120222, 10049, 78884, 3544, 0, 6017, 65311, \r
+    0, 120216, 13306, 10533, 7870, 73949, 7625, 0, 120544, 0, 0, 0, 0, 0, 0, \r
+    19961, 2472, 42665, 120699, 0, 6019, 4256, 120776, 74380, 0, 42675, \r
+    42658, 12845, 0, 0, 65138, 119355, 67862, 0, 65671, 120000, 120008, 8066, \r
+    7678, 74865, 0, 0, 0, 0, 7186, 0, 120555, 0, 445, 120566, 0, 0, 0, 8330, \r
+    0, 0, 42797, 0, 120215, 0, 3902, 0, 1770, 0, 0, 1560, 120209, 194972, \r
+    4584, 73843, 0, 11712, 10866, 118928, 1118, 0, 0, 0, 1081, 7436, 68420, \r
+    7252, 0, 5996, 0, 4903, 0, 41386, 5162, 119189, 1330, 0, 42848, 0, 12047, \r
+    41384, 0, 0, 1848, 4334, 6324, 41975, 64777, 10674, 12308, 12186, 0, 0, \r
+    0, 12715, 0, 0, 0, 2018, 66672, 41979, 66685, 119157, 0, 0, 0, 126984, 0, \r
+    9334, 0, 127310, 0, 7975, 0, 77957, 0, 66621, 4884, 66597, 0, 0, 0, 6313, \r
+    65513, 0, 0, 0, 0, 2345, 43697, 463, 0, 0, 119607, 3117, 5460, 0, 0, 0, \r
+    0, 42279, 194577, 0, 78415, 0, 0, 0, 13248, 0, 0, 0, 0, 0, 0, 5663, 0, 0, \r
+    0, 0, 2482, 1471, 0, 0, 42247, 12378, 73925, 127233, 0, 12374, 0, 0, 0, \r
+    0, 2460, 0, 11944, 12376, 0, 64679, 0, 12380, 10557, 64473, 5870, 0, \r
+    2024, 0, 0, 0, 539, 0, 0, 0, 3853, 65180, 0, 120796, 120245, 0, 0, 8659, \r
+    0, 12474, 0, 9503, 194969, 2478, 0, 4162, 0, 4260, 12953, 0, 120089, \r
+    12470, 0, 74189, 2742, 12476, 11798, 10946, 0, 5000, 0, 0, 0, 0, 8213, \r
+    74017, 7771, 6161, 0, 6709, 0, 78885, 0, 194892, 120582, 78547, 0, 10301, \r
+    10333, 10397, 0, 0, 73791, 0, 0, 0, 0, 0, 4014, 12842, 73952, 12015, 0, \r
+    8275, 3893, 0, 0, 127555, 7221, 42147, 0, 74550, 74465, 64747, 118841, 0, \r
+    12516, 4444, 0, 119017, 74537, 10892, 8231, 0, 6473, 41968, 78388, 41973, \r
+    3591, 41969, 0, 2453, 0, 0, 64705, 0, 0, 10349, 10413, 43591, 41962, \r
+    3202, 74353, 0, 8316, 0, 0, 0, 687, 0, 0, 0, 1840, 0, 68671, 119809, \r
+    4883, 285, 4723, 77927, 0, 4459, 74577, 0, 41720, 11089, 240, 19906, 0, \r
+    42323, 0, 9743, 120232, 13134, 0, 0, 0, 0, 0, 42634, 0, 43437, 3081, \r
+    11463, 120230, 0, 0, 10445, 0, 0, 66717, 2614, 9125, 119023, 1729, 0, \r
+    120236, 65221, 63883, 43334, 64852, 0, 120235, 66201, 0, 66578, 5001, \r
+    41879, 74427, 4121, 5003, 884, 66700, 63879, 4943, 5150, 73889, 74182, 0, \r
+    643, 3086, 0, 42448, 42299, 58, 0, 0, 120083, 63873, 8491, 0, 0, 0, 4530, \r
+    42409, 0, 194575, 2721, 120074, 119096, 19929, 0, 194574, 0, 4242, 4264, \r
+    120077, 0, 66179, 42412, 65941, 13114, 64522, 10740, 3094, 0, 9754, \r
+    119102, 4437, 73948, 0, 0, 55280, 42174, 194925, 42430, 0, 0, 42355, \r
+    66026, 4306, 41380, 68432, 0, 0, 66667, 127309, 0, 0, 42200, 42566, 0, 0, \r
+    5088, 6948, 0, 8524, 0, 0, 12385, 0, 0, 0, 1386, 64580, 11480, 6116, \r
+    65039, 65038, 12392, 65036, 8064, 0, 12101, 5822, 119004, 2080, 710, \r
+    77999, 11663, 1666, 42091, 119657, 12383, 43671, 42092, 68418, 4289, 0, \r
+    63896, 12061, 42096, 43621, 3362, 12377, 0, 0, 68449, 7461, 73901, 1244, \r
+    331, 73786, 12683, 10662, 0, 8112, 0, 65852, 0, 12379, 194877, 120818, \r
+    41964, 42208, 63843, 2084, 41965, 0, 65866, 4327, 0, 63840, 78549, 41220, \r
+    13032, 0, 584, 12933, 43177, 12373, 0, 13000, 1351, 0, 8698, 12665, 0, \r
+    1930, 0, 78229, 12427, 66514, 0, 13031, 0, 63901, 0, 3657, 0, 65202, \r
+    6000, 119206, 12426, 0, 0, 41740, 12428, 41283, 41916, 119210, 0, 0, \r
+    12429, 6727, 0, 7562, 0, 5170, 0, 41755, 676, 0, 66704, 66664, 9978, \r
+    66491, 3536, 0, 9752, 0, 6162, 0, 69228, 10113, 41829, 65886, 5159, \r
+    12422, 41832, 439, 43077, 0, 42207, 74549, 11796, 40970, 41830, 0, \r
+    917799, 8308, 917797, 917796, 0, 67864, 917801, 917800, 12336, 4135, \r
+    69805, 341, 2727, 4129, 3539, 0, 63861, 0, 7913, 0, 63859, 4131, 63868, \r
+    0, 63867, 4133, 11371, 210, 4600, 0, 74560, 4137, 8082, 78506, 119062, \r
+    78504, 6704, 4591, 0, 0, 0, 9680, 0, 120623, 561, 12159, 195, 78508, \r
+    41501, 0, 42031, 5719, 7172, 42687, 8368, 0, 41499, 0, 0, 42242, 41498, \r
+    917794, 42025, 78567, 65805, 42463, 0, 2924, 0, 120510, 0, 0, 119213, \r
+    73941, 0, 42330, 917784, 3969, 0, 0, 7169, 1992, 9652, 73977, 7246, \r
+    42086, 917790, 917789, 0, 0, 0, 0, 0, 327, 0, 9042, 917777, 917776, \r
+    65148, 12433, 917781, 127276, 917779, 12431, 8668, 12434, 0, 917782, \r
+    5999, 0, 7712, 12432, 0, 43653, 1726, 1015, 0, 8212, 0, 0, 42423, 119066, \r
+    0, 0, 66709, 0, 8811, 927, 0, 0, 12436, 0, 42021, 0, 0, 1299, 12240, \r
+    42350, 65143, 0, 195016, 0, 78197, 11348, 0, 78037, 0, 0, 0, 19914, \r
+    12179, 0, 9648, 194923, 63836, 63832, 917773, 10967, 63816, 2594, 3444, \r
+    63817, 64651, 0, 41503, 0, 11265, 0, 0, 194922, 0, 5664, 3972, 0, 0, 0, \r
+    917766, 12416, 917764, 119608, 10816, 917769, 917768, 12418, 74111, 3882, \r
+    8532, 917771, 1573, 0, 119847, 4596, 66339, 12417, 66001, 65343, 194782, \r
+    12414, 8287, 68219, 195017, 68108, 1143, 119169, 0, 12415, 6626, 42763, \r
+    0, 118884, 9021, 120783, 0, 11724, 0, 0, 127104, 194794, 0, 0, 8027, \r
+    10997, 9171, 12741, 11400, 74197, 194799, 0, 194798, 0, 0, 0, 127523, \r
+    120190, 194773, 67608, 194772, 42368, 0, 7715, 3881, 41487, 12118, 42514, \r
+    68651, 0, 0, 3009, 41476, 41489, 69825, 3007, 1448, 3018, 194809, 3889, \r
+    8521, 5083, 5082, 119859, 120184, 8519, 0, 3014, 5081, 65853, 0, 0, \r
+    120183, 78219, 5079, 64802, 42210, 4597, 65532, 78444, 120185, 12371, 0, \r
+    8407, 0, 10805, 8518, 10779, 120188, 0, 0, 12367, 42170, 0, 0, 629, 1924, \r
+    0, 12037, 74366, 5987, 8462, 8005, 12365, 63933, 127370, 120815, 12369, \r
+    10649, 0, 5077, 127108, 10880, 63927, 5075, 0, 0, 65075, 0, 11007, 0, \r
+    66659, 0, 0, 66684, 0, 3434, 4954, 1904, 0, 5266, 126980, 5272, 10499, \r
+    4507, 9578, 63923, 120177, 7979, 0, 9831, 0, 194926, 461, 9803, 0, 4504, \r
+    1505, 0, 6325, 5276, 43021, 0, 0, 55236, 0, 66461, 5177, 41324, 12055, \r
+    8722, 0, 41327, 0, 66695, 4114, 409, 4383, 8900, 8948, 41325, 0, 721, \r
+    10182, 9108, 0, 0, 119185, 42229, 194912, 0, 5998, 0, 42353, 74825, 0, \r
+    12587, 0, 78571, 0, 0, 0, 41576, 42215, 78570, 119207, 0, 8578, 5995, \r
+    7573, 41575, 74789, 74752, 63944, 63949, 64767, 2670, 4167, 0, 11723, 0, \r
+    74120, 0, 65076, 938, 43414, 73854, 11737, 9721, 0, 0, 0, 11742, 0, 0, \r
+    11493, 12334, 0, 4153, 12302, 10793, 5250, 12407, 11978, 4404, 9189, \r
+    12401, 42007, 5775, 6759, 65806, 43997, 0, 42002, 12404, 0, 0, 4940, \r
+    12410, 7683, 1167, 73729, 4983, 0, 861, 0, 0, 0, 0, 65577, 43370, 0, 0, \r
+    11956, 0, 0, 0, 9616, 6631, 0, 12816, 74583, 42218, 12710, 68674, 12721, \r
+    4101, 66185, 0, 5992, 7616, 0, 0, 12577, 0, 0, 853, 42693, 0, 0, 0, 5016, \r
+    43535, 63893, 42835, 9491, 917913, 0, 917914, 0, 12712, 917919, 0, 65060, \r
+    120797, 9900, 0, 0, 194919, 0, 0, 0, 64778, 12585, 10565, 0, 12177, 0, 0, \r
+    0, 77824, 0, 4900, 0, 12878, 0, 8984, 4119, 74768, 8971, 78593, 43113, \r
+    9702, 78594, 11025, 9245, 13048, 4927, 4138, 74185, 194921, 0, 12397, \r
+    77827, 0, 13054, 12394, 0, 0, 0, 13053, 0, 3948, 10781, 1546, 0, 5010, \r
+    1680, 10507, 78590, 78583, 0, 0, 0, 194915, 7267, 0, 74833, 0, 5993, \r
+    2819, 0, 12706, 77840, 1893, 7266, 63915, 7264, 7265, 0, 1363, 0, 63997, \r
+    63910, 63996, 3077, 0, 0, 1512, 0, 12589, 41479, 0, 0, 43339, 0, 9836, \r
+    120727, 0, 41481, 43335, 7832, 42343, 3090, 43337, 817, 1664, 1850, 0, \r
+    3079, 11340, 42408, 42447, 194704, 120020, 42307, 12386, 42304, 0, 0, \r
+    12389, 0, 194694, 41996, 11526, 63985, 5864, 1147, 63992, 42887, 1987, 0, \r
+    5480, 7858, 11653, 4116, 12391, 66193, 0, 4939, 12384, 0, 0, 41686, \r
+    63905, 119601, 194688, 0, 0, 12649, 0, 0, 8247, 507, 91, 2042, 120775, \r
+    43643, 194689, 66028, 10036, 41844, 119813, 774, 119831, 0, 119815, 5994, \r
+    12539, 0, 78375, 120597, 119833, 0, 119600, 0, 0, 7719, 6026, 2486, 0, \r
+    119808, 162, 0, 65219, 41073, 9687, 41681, 6304, 119812, 66196, 0, 5262, \r
+    0, 55233, 12681, 42379, 0, 7534, 12219, 0, 127528, 42810, 10492, 0, 0, 0, \r
+    43119, 0, 120753, 12403, 2500, 195013, 0, 4899, 0, 0, 0, 74113, 2343, \r
+    4103, 19946, 74112, 77851, 13112, 0, 0, 12859, 0, 120148, 66369, 5861, 0, \r
+    11999, 12400, 0, 0, 12645, 5146, 11320, 68410, 6748, 65040, 0, 64184, \r
+    12974, 64183, 67613, 120645, 5147, 0, 0, 74524, 0, 1928, 0, 67649, 5991, \r
+    3445, 67609, 4976, 64176, 0, 67610, 8241, 0, 77868, 4206, 0, 0, 0, 0, 0, \r
+    10138, 0, 0, 8897, 0, 0, 8357, 4124, 77862, 65836, 120641, 0, 77859, 0, \r
+    0, 1123, 963, 41553, 10120, 12405, 120150, 0, 398, 13278, 9723, 6366, \r
+    120311, 7945, 0, 4402, 9970, 12402, 0, 42392, 1305, 12408, 0, 44007, 0, \r
+    0, 41464, 12411, 12969, 120824, 41465, 0, 8528, 1575, 0, 63955, 165, \r
+    3024, 41467, 119163, 0, 9093, 0, 9147, 0, 63958, 0, 9148, 9692, 4096, 53, \r
+    73776, 6750, 195018, 0, 9594, 0, 0, 43527, 0, 727, 0, 0, 5805, 0, 6726, \r
+    0, 42176, 12370, 11655, 119095, 10591, 12364, 0, 12372, 120642, 120307, \r
+    0, 0, 0, 12366, 10963, 6066, 1329, 0, 3052, 9220, 0, 64478, 0, 10803, \r
+    4132, 120306, 68474, 0, 0, 0, 74837, 0, 1499, 0, 8055, 42740, 63965, 0, \r
+    63962, 74042, 8924, 43123, 5988, 3660, 63969, 11781, 42718, 8788, 1357, \r
+    64851, 65743, 0, 8774, 0, 127086, 9941, 120172, 0, 1933, 120154, 9564, 0, \r
+    0, 73866, 0, 0, 2487, 67614, 3121, 1804, 3311, 67615, 0, 78302, 12220, \r
+    67616, 120598, 0, 0, 68200, 6675, 0, 0, 67592, 120685, 0, 64771, 1198, \r
+    9132, 0, 64619, 510, 64663, 0, 0, 4561, 2101, 1398, 0, 0, 74034, 41569, \r
+    0, 11406, 8167, 12127, 0, 840, 0, 0, 0, 6967, 0, 0, 9796, 0, 333, 0, 0, \r
+    8144, 0, 0, 0, 12406, 0, 19931, 119089, 6678, 7769, 0, 12621, 0, 0, \r
+    10227, 4764, 43101, 9981, 0, 40986, 4127, 66487, 0, 42202, 12754, 195022, \r
+    0, 0, 0, 67594, 2048, 12944, 4050, 67595, 917967, 43102, 10581, 12985, \r
+    4533, 195021, 74003, 6490, 0, 12038, 0, 0, 120704, 65461, 9798, 0, 0, \r
+    1948, 119007, 0, 952, 0, 0, 0, 120802, 6449, 9494, 120313, 0, 43098, \r
+    4843, 8142, 64160, 4098, 64170, 0, 0, 3436, 0, 0, 12817, 67597, 6676, \r
+    3930, 66708, 0, 0, 67598, 0, 0, 0, 65591, 41581, 65916, 1453, 0, 0, 0, \r
+    8500, 42222, 120142, 73743, 120400, 4317, 11543, 67676, 64676, 0, 0, \r
+    67606, 119083, 0, 42217, 13102, 0, 66003, 6672, 0, 0, 0, 0, 63841, 9613, \r
+    9001, 4526, 11274, 67601, 64520, 64210, 6664, 78704, 42056, 10228, 64957, \r
+    11281, 0, 64213, 1469, 66640, 65381, 42197, 4988, 42372, 0, 9598, 904, \r
+    352, 42225, 1451, 8061, 8453, 4134, 0, 74847, 66576, 0, 0, 10520, 8575, \r
+    9960, 1201, 0, 12846, 0, 0, 11919, 64962, 0, 43739, 127281, 8511, 9460, \r
+    823, 11587, 12305, 0, 64695, 0, 12387, 1253, 13183, 65766, 500, 42783, \r
+    65765, 64208, 64369, 65760, 65761, 119585, 11606, 64784, 11702, 66498, \r
+    9821, 0, 0, 5152, 11048, 7533, 68366, 64410, 0, 0, 4323, 120062, 0, 0, \r
+    127052, 42587, 42214, 41394, 0, 4763, 4112, 118935, 0, 5260, 43143, 0, \r
+    326, 120131, 68423, 0, 10771, 2876, 74074, 194835, 194924, 41398, 7382, \r
+    9802, 127077, 127076, 453, 41396, 120524, 42720, 12140, 9572, 0, 7003, \r
+    194883, 42334, 7704, 0, 0, 43144, 4123, 8494, 43146, 9977, 0, 0, 65759, \r
+    10765, 64061, 4465, 9808, 64056, 65582, 4126, 0, 9521, 9589, 64755, 0, \r
+    64020, 0, 10464, 0, 0, 194869, 64514, 11528, 64024, 0, 679, 64013, 0, \r
+    5850, 758, 7536, 0, 0, 41441, 10693, 64006, 0, 64005, 10541, 119019, 0, \r
+    64660, 0, 119050, 0, 0, 1139, 43298, 64027, 64029, 8970, 0, 64000, 0, \r
+    10774, 0, 42201, 12421, 194876, 0, 1852, 3057, 0, 73744, 64034, 64039, 0, \r
+    0, 0, 0, 0, 7645, 12854, 74338, 3496, 0, 0, 0, 9102, 627, 0, 6158, 8327, \r
+    74553, 66632, 12419, 13309, 11570, 0, 19960, 11696, 0, 1018, 118970, \r
+    194909, 0, 1682, 194896, 194911, 42756, 6765, 194906, 0, 0, 73814, 11412, \r
+    6768, 10728, 194830, 119010, 118863, 43311, 64966, 11577, 0, 43040, 1833, \r
+    11576, 0, 74779, 0, 185, 65085, 74533, 64754, 194848, 7535, 8085, 42525, \r
+    120387, 9749, 41701, 6131, 1949, 4117, 7847, 120489, 194711, 64483, \r
+    65693, 0, 0, 0, 0, 42240, 0, 0, 42864, 0, 64667, 41868, 1184, 0, 815, \r
+    11484, 127535, 67840, 0, 0, 0, 0, 10986, 64683, 0, 0, 0, 0, 0, 9879, 0, \r
+    0, 4158, 0, 68166, 0, 0, 0, 0, 0, 332, 118808, 0, 5142, 2407, 0, 42199, \r
+    0, 0, 74373, 0, 55217, 0, 63870, 43163, 0, 0, 119081, 42867, 1834, 0, 0, \r
+    69817, 10940, 65249, 119040, 8662, 0, 0, 2652, 120527, 11539, 10784, \r
+    195093, 67674, 0, 0, 0, 0, 74562, 917505, 1828, 74474, 120327, 78620, \r
+    8531, 12499, 6280, 12324, 118854, 65238, 68374, 4832, 65573, 0, 6279, \r
+    12508, 12904, 12502, 9161, 0, 1620, 0, 3601, 195094, 0, 0, 609, 11555, 0, \r
+    12496, 0, 74181, 4343, 12505, 0, 0, 0, 11377, 239, 0, 637, 0, 0, 42671, \r
+    0, 0, 0, 43565, 127082, 0, 12696, 0, 0, 0, 12929, 0, 712, 0, 4197, 0, \r
+    42818, 0, 0, 120490, 0, 0, 1506, 43562, 0, 0, 0, 12651, 0, 64628, 74517, \r
+    12058, 74084, 917838, 7494, 0, 4924, 65592, 118844, 0, 127088, 355, 9719, \r
+    127087, 13066, 64796, 0, 0, 12033, 42178, 0, 69760, 42571, 917837, 0, 0, \r
+    0, 0, 0, 0, 3178, 0, 0, 0, 0, 9080, 127000, 120352, 0, 68209, 0, 11082, \r
+    0, 5699, 195100, 66000, 9488, 65166, 119112, 0, 0, 0, 0, 0, 0, 5265, \r
+    69235, 0, 11487, 67858, 12464, 0, 43045, 0, 0, 43345, 0, 10770, 118994, \r
+    6807, 465, 9829, 0, 74348, 0, 43346, 8116, 795, 0, 0, 12462, 10930, \r
+    10831, 0, 118952, 64362, 74334, 0, 120811, 0, 12468, 8607, 1008, 0, \r
+    10092, 0, 917842, 67855, 55257, 73771, 1766, 11282, 11996, 1820, 4547, 0, \r
+    0, 0, 0, 13223, 0, 64595, 0, 0, 0, 4345, 12616, 0, 0, 0, 74467, 0, 0, 0, \r
+    5382, 0, 0, 0, 119060, 64953, 5406, 19920, 0, 66510, 3590, 0, 1130, 0, 0, \r
+    42016, 11823, 43023, 0, 118896, 7742, 0, 13280, 0, 9326, 73826, 5310, \r
+    74812, 0, 119962, 8959, 43589, 6747, 66723, 0, 8568, 0, 120496, 73816, \r
+    120803, 0, 42670, 0, 11621, 12460, 0, 120631, 0, 43063, 74519, 0, 0, 0, \r
+    0, 0, 11689, 5410, 5783, 10468, 8403, 5400, 11594, 0, 0, 118990, 10491, \r
+    0, 64412, 0, 0, 5587, 42865, 64404, 8268, 4923, 65086, 8981, 12382, \r
+    42133, 120755, 9706, 0, 0, 66610, 10461, 12103, 0, 8642, 0, 42766, 0, \r
+    66566, 9983, 0, 119105, 0, 0, 0, 7398, 41515, 0, 11802, 8041, 1461, 910, \r
+    119133, 0, 6749, 3658, 0, 120525, 0, 7617, 0, 12888, 0, 67668, 13143, 0, \r
+    41514, 11097, 5703, 0, 41517, 41504, 41519, 10016, 64305, 0, 65864, 623, \r
+    781, 670, 10660, 5769, 613, 7543, 120279, 477, 41083, 0, 0, 592, 1578, \r
+    12459, 43449, 0, 0, 8225, 0, 654, 11345, 653, 652, 0, 647, 0, 633, \r
+    120744, 0, 0, 12480, 43243, 0, 39, 12487, 0, 120529, 74199, 12482, 0, \r
+    12489, 0, 3195, 5550, 0, 7897, 0, 1203, 74396, 1813, 64544, 41311, 12090, \r
+    0, 2877, 0, 0, 1675, 0, 0, 0, 0, 10070, 10595, 0, 119077, 0, 0, 0, 0, 0, \r
+    43244, 0, 0, 0, 119561, 0, 0, 0, 0, 0, 0, 0, 77860, 0, 0, 270, 0, 10714, \r
+    0, 0, 0, 0, 0, 65372, 0, 74038, 119558, 6273, 66679, 364, 9595, 194908, \r
+    0, 0, 707, 0, 0, 9282, 66489, 224, 0, 68670, 9332, 4966, 68677, 0, 68644, \r
+    0, 3841, 68634, 0, 10732, 68640, 850, 4972, 0, 64699, 2909, 68619, 44008, \r
+    68627, 0, 11544, 10203, 9608, 0, 0, 11962, 0, 12507, 1196, 0, 0, 777, 0, \r
+    4375, 65271, 67678, 0, 12198, 0, 64824, 0, 0, 9454, 63778, 8658, 42528, \r
+    0, 2705, 917975, 41520, 0, 0, 11986, 7765, 42502, 8280, 0, 2701, 0, 0, \r
+    5767, 0, 0, 9809, 8353, 63747, 66701, 63772, 0, 63745, 1748, 63770, 0, 0, \r
+    0, 65542, 63766, 55244, 3061, 0, 63764, 63787, 9067, 6096, 0, 7694, 0, \r
+    7257, 63768, 3485, 12987, 0, 127522, 120628, 63807, 1591, 0, 6386, 63783, \r
+    0, 0, 0, 0, 0, 0, 74575, 0, 65719, 13083, 64574, 65012, 0, 1640, 12495, \r
+    66691, 7624, 3138, 10996, 0, 1922, 0, 12498, 10987, 0, 0, 3894, 65543, 0, \r
+    194842, 0, 493, 0, 43197, 1717, 4228, 479, 10303, 74020, 0, 917935, \r
+    10335, 3520, 917932, 12490, 64315, 0, 127039, 12493, 6233, 42681, 1002, \r
+    12491, 0, 64911, 127040, 2096, 65120, 0, 0, 0, 11611, 66228, 127041, \r
+    66213, 63864, 66221, 66226, 66229, 13218, 66231, 66216, 8507, 66236, \r
+    66211, 66218, 0, 66240, 78041, 66233, 8928, 0, 7909, 66234, 11605, 63759, \r
+    0, 66208, 73999, 63799, 63803, 244, 11542, 12898, 12494, 73761, 12492, \r
+    12669, 0, 0, 74153, 0, 0, 120680, 4882, 13040, 0, 8612, 4885, 74053, 0, \r
+    13042, 4880, 64662, 2429, 1360, 248, 0, 63797, 0, 42358, 0, 7292, 0, \r
+    63756, 42786, 66693, 0, 1870, 78040, 470, 78038, 78035, 78036, 0, 78034, \r
+    4579, 0, 0, 12511, 74453, 12514, 0, 74579, 7239, 7001, 8623, 0, 0, 0, \r
+    7378, 12512, 11615, 6104, 0, 0, 659, 6098, 0, 12234, 127307, 127067, \r
+    8311, 12510, 41803, 13039, 127072, 12513, 10202, 12471, 0, 8747, 0, 0, 0, \r
+    2323, 0, 2319, 77917, 12477, 77916, 2311, 0, 4415, 237, 6281, 0, 0, 0, \r
+    2309, 1312, 8173, 0, 12469, 0, 78505, 64335, 10609, 0, 0, 9397, 11524, \r
+    9395, 9396, 9393, 9394, 9391, 9392, 9389, 6209, 9387, 9388, 4932, 9386, \r
+    9383, 9384, 6740, 0, 65451, 8185, 0, 917832, 43024, 43336, 67659, 2313, \r
+    0, 7948, 9236, 0, 0, 0, 10570, 43473, 6289, 10484, 0, 0, 11998, 12082, \r
+    10924, 3147, 0, 120684, 12524, 0, 2310, 11818, 9381, 9382, 9379, 9380, \r
+    9377, 9378, 9375, 9376, 1683, 9374, 0, 9372, 12444, 0, 0, 13016, 8210, 0, \r
+    42029, 11079, 12331, 43451, 42032, 8744, 726, 0, 0, 4155, 0, 0, 42030, \r
+    5007, 12522, 43088, 0, 4951, 0, 127240, 0, 9922, 43309, 0, 12525, 0, \r
+    12016, 65770, 9548, 67665, 403, 78230, 12503, 0, 0, 11030, 0, 0, 65691, \r
+    63998, 1819, 10496, 0, 0, 119920, 0, 0, 0, 12506, 0, 12231, 0, 12500, \r
+    44023, 12509, 64393, 78830, 3389, 10589, 6608, 41047, 120321, 78395, \r
+    78394, 74069, 77995, 78391, 3608, 8281, 120320, 1107, 0, 9076, 8862, 0, \r
+    41052, 13084, 64766, 43217, 7803, 13222, 74165, 74782, 0, 8546, 11553, \r
+    63995, 13177, 9043, 6303, 0, 498, 64471, 120324, 0, 12529, 8042, 0, 2344, \r
+    12528, 8031, 2414, 0, 0, 3231, 0, 6422, 66512, 0, 12530, 2537, 78405, \r
+    41429, 12658, 13036, 65772, 0, 78738, 41433, 4719, 469, 0, 4363, 3313, \r
+    41428, 78407, 2023, 1772, 78224, 78225, 65706, 10051, 64812, 78220, 0, \r
+    9920, 12215, 0, 4931, 1951, 12497, 119363, 9607, 0, 9663, 0, 119634, \r
+    6503, 41110, 0, 1491, 0, 0, 0, 41061, 0, 0, 0, 65026, 41993, 41509, \r
+    11045, 65028, 78602, 66476, 41108, 9738, 41995, 1075, 1958, 12535, 41992, \r
+    41506, 0, 41687, 0, 120717, 0, 9940, 0, 7692, 0, 8008, 41131, 330, 8566, \r
+    65083, 41133, 9816, 0, 12532, 78550, 78546, 3508, 127058, 43235, 0, \r
+    127298, 69783, 78231, 6411, 12910, 78554, 66644, 13028, 6737, 12537, 0, \r
+    0, 64136, 12536, 2350, 13029, 78233, 0, 0, 13030, 6702, 4527, 0, 12538, \r
+    0, 0, 65599, 65717, 9966, 0, 4948, 12484, 4032, 0, 12623, 0, 6207, 0, \r
+    6117, 65930, 8412, 0, 7438, 1296, 2325, 41511, 0, 10149, 74118, 0, 0, \r
+    12481, 0, 12488, 0, 0, 41556, 64414, 118802, 2354, 0, 73766, 0, 6295, \r
+    901, 41510, 7953, 0, 65032, 41513, 0, 11927, 66584, 78559, 78560, 78557, \r
+    78558, 0, 78556, 848, 9868, 0, 6424, 78568, 119338, 78565, 74031, 78563, \r
+    78564, 2352, 78572, 893, 64576, 11289, 1407, 0, 0, 13026, 6762, 78579, \r
+    78580, 13023, 8903, 9777, 66715, 1871, 8099, 0, 0, 1343, 0, 0, 9325, \r
+    6818, 6283, 11738, 0, 0, 0, 11741, 0, 0, 9216, 8263, 11279, 194752, 0, \r
+    194754, 13021, 64494, 3136, 194758, 194757, 194760, 13022, 42737, 64588, \r
+    0, 0, 74552, 10014, 0, 41260, 119340, 13020, 118993, 194764, 194767, \r
+    74340, 0, 0, 64945, 8029, 0, 0, 0, 3335, 0, 0, 9776, 120526, 194748, \r
+    5215, 42644, 3333, 1632, 194751, 64849, 3342, 78582, 5363, 12957, 78581, \r
+    4156, 0, 0, 6421, 78591, 1611, 78589, 13018, 74257, 78588, 78584, 3337, \r
+    4537, 67895, 11736, 0, 68608, 6482, 4214, 73790, 11945, 0, 13046, 8838, \r
+    425, 4025, 10709, 78595, 2108, 2392, 13047, 0, 0, 6819, 13049, 6499, \r
+    194739, 12424, 68614, 73944, 13050, 9924, 194745, 6507, 0, 0, 0, 3277, \r
+    8929, 4947, 41055, 0, 194722, 194721, 194724, 13045, 64626, 66034, 7751, \r
+    194727, 8371, 194729, 3997, 12806, 8768, 13044, 0, 12420, 4024, 194730, \r
+    41054, 1078, 9757, 194734, 41057, 0, 0, 0, 0, 0, 0, 127109, 0, 41496, 0, \r
+    9165, 1572, 11911, 0, 118842, 2346, 13270, 8958, 0, 9646, 3773, 43183, \r
+    6401, 5831, 0, 0, 13043, 8056, 0, 65681, 208, 0, 0, 0, 0, 0, 10699, 6408, \r
+    0, 7825, 5661, 0, 120630, 3603, 41109, 2398, 3548, 0, 0, 119933, 0, 3115, \r
+    9918, 0, 11321, 0, 0, 0, 194726, 4876, 74286, 0, 0, 43468, 0, 41558, \r
+    41471, 73950, 8158, 9944, 41472, 0, 13051, 78689, 3143, 194674, 6701, \r
+    41559, 1896, 66256, 13052, 194680, 5665, 0, 119071, 7025, 63974, 0, \r
+    74352, 74161, 4154, 9863, 43550, 12310, 5662, 42382, 194686, 73924, 1121, \r
+    194665, 63959, 0, 9942, 13231, 0, 64752, 4732, 194666, 11596, 119931, \r
+    65187, 1626, 63983, 10110, 64772, 42024, 6420, 42028, 0, 10509, 2795, \r
+    4910, 194728, 69231, 64753, 6275, 917808, 118830, 63978, 11044, 3229, \r
+    6423, 42774, 0, 0, 0, 12823, 2331, 917810, 42026, 6137, 0, 7524, 0, \r
+    917809, 119343, 0, 8338, 0, 65043, 0, 822, 0, 9903, 64721, 42722, 194656, \r
+    194659, 78655, 78661, 194660, 78662, 41265, 5311, 1795, 965, 118791, \r
+    10587, 78055, 11278, 78632, 194640, 0, 12946, 194641, 120705, 194643, \r
+    6294, 3144, 194648, 194647, 65019, 194649, 73990, 0, 0, 748, 41067, 2330, \r
+    535, 3148, 12375, 194652, 194629, 10556, 2475, 12388, 4889, 8968, 67863, \r
+    3593, 0, 0, 2342, 0, 194634, 65206, 4894, 194635, 4890, 194637, 917804, \r
+    581, 4893, 0, 6571, 65545, 4888, 4157, 78048, 78049, 78046, 78047, 0, \r
+    10119, 6415, 0, 0, 0, 0, 0, 11375, 64746, 2332, 78063, 412, 78061, 64932, \r
+    42880, 43587, 0, 0, 0, 0, 65197, 78066, 12203, 78064, 78065, 8913, 65854, \r
+    4875, 65811, 120381, 120389, 118888, 9344, 8826, 120386, 120395, 13104, \r
+    74781, 11997, 120393, 78075, 0, 3134, 0, 65696, 0, 0, 66217, 0, 8334, \r
+    119344, 0, 3449, 0, 0, 78414, 78413, 118950, 74011, 0, 0, 0, 0, 1908, \r
+    120167, 4328, 10734, 127014, 0, 0, 7804, 78272, 10811, 6250, 11339, 4914, \r
+    11367, 0, 78054, 4917, 74516, 74208, 64285, 4912, 5464, 0, 118893, 2361, \r
+    7971, 78072, 78073, 55243, 78071, 0, 8086, 74317, 6707, 8319, 2312, \r
+    40977, 10960, 40962, 8305, 12573, 0, 40980, 0, 13202, 0, 12582, 78282, 0, \r
+    0, 42438, 55221, 6288, 78280, 0, 5653, 42400, 10891, 7698, 5658, 74045, \r
+    0, 0, 0, 4913, 0, 0, 0, 42326, 0, 0, 0, 42478, 2327, 0, 12563, 42287, \r
+    12705, 0, 0, 12588, 8821, 6153, 2867, 194708, 66312, 698, 194709, 194606, \r
+    10356, 74075, 194713, 651, 12641, 0, 0, 0, 0, 41552, 65115, 78465, 78467, \r
+    78463, 78464, 194695, 78461, 194697, 74356, 0, 4716, 43277, 0, 78474, \r
+    12340, 120568, 0, 194700, 55264, 41211, 120676, 8703, 5462, 917629, 0, \r
+    10101, 0, 0, 8479, 4151, 41933, 0, 0, 66254, 120821, 0, 0, 0, 0, 119194, \r
+    74050, 0, 0, 0, 0, 0, 0, 12278, 0, 0, 0, 2700, 12576, 7842, 12899, 0, 0, \r
+    2699, 0, 73845, 2985, 119222, 0, 917845, 12192, 119314, 0, 119312, 9827, \r
+    119310, 119311, 119308, 119309, 119306, 11481, 41210, 119305, 0, 35, \r
+    78481, 78482, 66694, 68479, 78477, 78478, 43596, 6090, 64257, 7812, \r
+    10534, 0, 78485, 73848, 78483, 4272, 0, 40967, 40964, 917825, 12704, \r
+    78487, 43306, 0, 64497, 12138, 7930, 0, 43303, 68216, 0, 917826, 5244, \r
+    4189, 127098, 67596, 0, 4188, 1879, 0, 968, 0, 43743, 0, 8873, 0, 0, \r
+    917827, 65555, 12574, 0, 0, 0, 74490, 127099, 43657, 0, 0, 0, 42682, \r
+    12578, 12720, 0, 41227, 0, 12346, 127101, 64848, 0, 0, 7251, 0, 0, \r
+    118850, 119141, 0, 66015, 0, 959, 8885, 12564, 66457, 78808, 9469, 9632, \r
+    0, 74761, 64323, 0, 0, 0, 0, 310, 0, 41281, 10976, 0, 194768, 0, 74266, \r
+    10054, 6497, 8574, 0, 9012, 19958, 74420, 65089, 13215, 65047, 65163, \r
+    74044, 374, 43195, 816, 0, 0, 0, 41934, 7465, 0, 0, 0, 4715, 6101, 0, \r
+    41936, 0, 4879, 0, 65446, 0, 307, 0, 9585, 5374, 0, 0, 0, 0, 0, 0, 0, \r
+    65567, 120614, 1929, 0, 12142, 0, 12236, 41419, 194618, 194621, 12982, \r
+    194623, 5378, 78791, 0, 41421, 0, 4462, 0, 0, 0, 821, 0, 2498, 5800, \r
+    120157, 0, 1760, 0, 4469, 2324, 828, 3611, 78400, 757, 1185, 0, 78770, \r
+    43597, 10628, 74808, 194572, 7999, 43971, 0, 0, 10634, 10942, 7713, 2348, \r
+    0, 64374, 4380, 194608, 119044, 9982, 64324, 41240, 862, 65626, 78462, \r
+    1810, 3673, 5137, 194617, 0, 7277, 65622, 0, 7566, 64688, 194593, 194592, \r
+    78092, 74357, 194597, 4748, 194599, 194598, 194601, 42260, 5871, 119075, \r
+    0, 74576, 44019, 0, 194602, 3967, 194604, 13137, 8775, 194605, 0, 2963, \r
+    0, 8410, 4454, 723, 917600, 966, 4449, 0, 127060, 0, 7819, 2320, 194589, \r
+    339, 4968, 194590, 120399, 8075, 55276, 0, 8047, 0, 78827, 12634, 41542, \r
+    78780, 7466, 6705, 12174, 42610, 0, 74452, 0, 1584, 66645, 6045, 6729, \r
+    120640, 65218, 78777, 0, 78062, 7537, 0, 11370, 0, 10330, 0, 10394, 0, \r
+    194783, 0, 0, 9780, 0, 13092, 194576, 119605, 194578, 7074, 120396, \r
+    194579, 194582, 11414, 194584, 2531, 13034, 0, 0, 0, 1259, 7517, 0, 0, \r
+    194561, 40996, 13037, 7092, 641, 5219, 194567, 194566, 11064, 41129, 0, \r
+    42850, 13035, 9075, 0, 5466, 194570, 0, 64098, 65793, 4535, 194573, 4271, \r
+    78417, 0, 6769, 41410, 0, 64262, 6767, 41407, 0, 0, 6755, 118864, 9046, \r
+    0, 0, 0, 0, 0, 0, 67675, 0, 0, 0, 64338, 2563, 13033, 247, 118915, 0, \r
+    12338, 4651, 0, 11270, 0, 0, 11933, 0, 0, 41903, 43447, 11001, 0, 42255, \r
+    0, 0, 0, 41905, 0, 0, 10775, 9793, 5009, 0, 42269, 64587, 0, 42535, \r
+    69812, 64529, 41408, 42853, 3877, 120795, 42674, 8147, 43566, 119021, 0, \r
+    10236, 65918, 0, 0, 0, 64506, 0, 118921, 4747, 0, 0, 43200, 5832, 0, 0, \r
+    5141, 42600, 0, 43203, 0, 0, 43286, 0, 0, 0, 0, 41305, 78776, 74137, \r
+    11303, 65547, 0, 7031, 859, 0, 0, 0, 6059, 126985, 55235, 0, 8535, 0, \r
+    65196, 194787, 66032, 11488, 0, 120786, 42233, 127488, 9946, 63885, 0, \r
+    11822, 0, 43189, 0, 0, 1788, 1579, 120482, 917817, 0, 0, 0, 9028, 119571, \r
+    69234, 0, 0, 1285, 64882, 41242, 0, 0, 12640, 0, 7401, 0, 12625, 68198, \r
+    0, 0, 3940, 41597, 55260, 3396, 12642, 8665, 0, 0, 12630, 1653, 917815, \r
+    10153, 0, 6166, 120516, 120523, 0, 8815, 66673, 65046, 9285, 913, 42259, \r
+    119317, 119318, 119315, 68454, 42485, 118837, 7878, 8211, 42293, 64377, \r
+    0, 0, 0, 194673, 12032, 0, 9725, 0, 78431, 5263, 12818, 78430, 41939, \r
+    10022, 65387, 78419, 42777, 10139, 980, 43698, 65386, 0, 0, 43701, 43198, \r
+    7184, 120673, 194797, 917819, 10085, 119992, 0, 119993, 6634, 0, 0, \r
+    119323, 8072, 119321, 43700, 0, 8872, 7783, 917992, 12398, 8237, 0, 0, \r
+    12395, 0, 126977, 120565, 9914, 127011, 917854, 73975, 6367, 6351, 66688, \r
+    0, 78107, 0, 64735, 41243, 0, 7808, 1829, 0, 41937, 4358, 43272, 6353, 0, \r
+    0, 120422, 0, 1710, 0, 0, 65607, 0, 49, 6627, 0, 6258, 10683, 78672, \r
+    9741, 78443, 5649, 78441, 43443, 64418, 1643, 65213, 8405, 3470, 0, \r
+    13213, 42452, 78331, 0, 78445, 0, 1072, 78457, 78452, 78454, 6576, 41988, \r
+    41132, 65675, 1080, 120002, 9886, 55225, 1101, 68404, 12309, 55227, 0, \r
+    12632, 1086, 1869, 78685, 7680, 0, 65458, 120714, 12639, 3380, 8123, \r
+    1091, 12638, 7977, 4501, 0, 0, 66309, 0, 0, 1494, 0, 0, 0, 11693, 0, \r
+    10494, 119230, 65872, 12363, 11386, 0, 0, 0, 0, 64582, 0, 73794, 0, 8022, \r
+    0, 0, 74106, 12413, 194829, 917994, 0, 917995, 5570, 1881, 7210, 0, 1012, \r
+    66630, 0, 120709, 7208, 66442, 5569, 0, 42339, 0, 6063, 0, 0, 119594, \r
+    6053, 65602, 0, 0, 64727, 9160, 194827, 0, 0, 0, 10503, 118810, 6055, \r
+    3870, 4279, 8490, 120114, 4319, 64786, 8602, 120110, 11326, 0, 0, 0, \r
+    120119, 78333, 120117, 120118, 120099, 120100, 65087, 5571, 3674, 9740, \r
+    9121, 5568, 120107, 120108, 42085, 10107, 42159, 42870, 120101, 589, \r
+    7050, 0, 43281, 10233, 41263, 66251, 65729, 66253, 0, 74099, 42645, 0, \r
+    194815, 8583, 0, 5847, 6928, 0, 0, 0, 0, 0, 66592, 12204, 0, 19966, \r
+    77856, 42561, 120626, 0, 0, 8120, 120701, 0, 0, 0, 41063, 0, 10664, 0, \r
+    8369, 0, 4551, 0, 74759, 0, 0, 9673, 66334, 65580, 10478, 118960, 12517, \r
+    557, 9457, 12034, 0, 6355, 12519, 41004, 0, 0, 74094, 0, 0, 77970, 0, 0, \r
+    0, 12111, 3927, 0, 12515, 1474, 67893, 5492, 6923, 0, 10441, 73836, 0, \r
+    43990, 5493, 0, 74319, 0, 66635, 12019, 0, 1618, 0, 120474, 9645, 10430, \r
+    917959, 5853, 13063, 10363, 0, 12956, 0, 120729, 11314, 0, 12060, 0, \r
+    78392, 12826, 6329, 0, 10514, 65517, 74395, 2707, 8309, 0, 127054, 78398, \r
+    43570, 2697, 43420, 78396, 127057, 2695, 42171, 0, 0, 0, 67617, 118971, \r
+    0, 2693, 12125, 12766, 0, 1164, 0, 0, 41918, 0, 0, 8687, 66009, 12178, \r
+    7053, 0, 7469, 0, 5248, 12218, 120538, 6427, 42884, 41123, 0, 0, 42873, \r
+    41126, 9991, 41128, 74371, 127031, 0, 9873, 0, 42877, 7994, 64762, 2053, \r
+    42843, 6591, 9340, 0, 1589, 0, 296, 74438, 78852, 0, 67841, 74370, 0, \r
+    8922, 0, 74600, 12700, 74836, 0, 12579, 0, 12575, 6416, 5656, 2891, \r
+    13262, 65590, 5299, 0, 11473, 5449, 1252, 0, 78404, 41431, 74369, 65373, \r
+    5295, 0, 74114, 1223, 1642, 174, 78399, 883, 4161, 12691, 42603, 41413, \r
+    3212, 41459, 3211, 74810, 41425, 127029, 78412, 74450, 9728, 3846, 8070, \r
+    6150, 6636, 4370, 0, 0, 74178, 74587, 74117, 0, 0, 0, 4986, 12189, 0, \r
+    67648, 120499, 917553, 4257, 12104, 77942, 6220, 9004, 65561, 0, 77949, \r
+    0, 68135, 917576, 77946, 0, 0, 0, 9890, 78561, 12971, 78453, 0, 73898, \r
+    11979, 0, 118900, 917894, 0, 9635, 12600, 8871, 0, 0, 0, 6469, 74227, 0, \r
+    65304, 4679, 10230, 64300, 64867, 3427, 4240, 0, 0, 0, 0, 917952, 0, 0, \r
+    0, 7282, 78728, 65733, 4445, 0, 0, 3494, 74606, 6555, 0, 77976, 0, 0, \r
+    78566, 0, 0, 65898, 0, 65312, 5447, 0, 12895, 65593, 4010, 0, 41106, 0, \r
+    65804, 0, 41105, 0, 65820, 6232, 0, 0, 0, 43608, 119091, 0, 6538, 4335, \r
+    78364, 3941, 41122, 11061, 78363, 64892, 9113, 1954, 12155, 0, 42878, \r
+    11500, 0, 0, 74578, 0, 65832, 0, 0, 0, 77975, 0, 4586, 0, 350, 10951, 0, \r
+    509, 0, 0, 0, 0, 0, 5133, 0, 0, 9500, 0, 12162, 64741, 0, 9354, 0, 0, 0, \r
+    2496, 11516, 944, 118851, 3890, 12168, 1438, 0, 0, 0, 41947, 1220, \r
+    120828, 0, 0, 0, 1571, 42630, 41949, 42805, 8270, 943, 564, 0, 312, \r
+    41980, 0, 0, 78120, 8877, 269, 4429, 6272, 9617, 1460, 6954, 78657, \r
+    41120, 65121, 10862, 6060, 41119, 41416, 74355, 4173, 0, 0, 0, 1906, \r
+    917986, 11532, 74073, 0, 0, 1985, 6296, 9582, 917895, 64287, 0, 78115, \r
+    11428, 1730, 2457, 0, 19918, 10469, 0, 0, 7703, 8840, 8035, 0, 0, 0, 0, \r
+    6129, 0, 0, 0, 0, 7874, 8681, 0, 0, 13136, 0, 0, 74278, 63886, 118881, \r
+    9605, 73892, 13220, 0, 120274, 5514, 0, 9228, 0, 0, 0, 5240, 9811, 10012, \r
+    3096, 0, 0, 0, 66676, 65873, 0, 0, 0, 9501, 0, 1272, 64536, 65465, 64654, \r
+    7467, 0, 1467, 10158, 10040, 0, 9519, 0, 917812, 0, 118899, 12193, 0, 0, \r
+    0, 0, 0, 19935, 0, 0, 0, 0, 0, 0, 5275, 0, 0, 8637, 0, 0, 3789, 63880, \r
+    11471, 43554, 65862, 11474, 66332, 66603, 0, 2426, 12042, 0, 0, 9537, \r
+    3961, 12115, 0, 2605, 4500, 64561, 55224, 4981, 0, 0, 63876, 11667, \r
+    42686, 77973, 42362, 64686, 4499, 41649, 7589, 0, 0, 3237, 0, 68215, 0, \r
+    8541, 78298, 0, 41866, 0, 0, 0, 0, 0, 43555, 2823, 9559, 0, 41940, 8299, \r
+    41945, 0, 41941, 3308, 7190, 64880, 8614, 65220, 41493, 0, 41699, 10762, \r
+    0, 12999, 0, 0, 8106, 4128, 0, 0, 4494, 0, 4012, 10395, 0, 119567, 65447, \r
+    0, 0, 11004, 695, 739, 696, 7611, 0, 42755, 74802, 9227, 7506, 7510, 0, \r
+    691, 738, 7511, 7512, 7515, 3868, 688, 41847, 690, 2548, 737, 974, 8003, \r
+    7406, 0, 0, 0, 3985, 0, 65860, 63921, 7051, 69777, 4682, 917805, 12809, \r
+    6406, 4685, 0, 10879, 10347, 4680, 6341, 0, 3851, 8132, 74325, 0, 917907, \r
+    0, 41958, 119176, 917908, 0, 0, 42657, 0, 7643, 42373, 11714, 67587, \r
+    43568, 0, 11717, 7650, 10594, 64951, 7647, 7649, 0, 7646, 0, 78082, 9651, \r
+    0, 3891, 0, 0, 2337, 1735, 74324, 67860, 5452, 0, 0, 43561, 0, 0, 74146, \r
+    1860, 7495, 7580, 5812, 7497, 7584, 0, 0, 0, 120347, 7727, 0, 8498, \r
+    69818, 8949, 3065, 42719, 0, 1569, 0, 12534, 12124, 7690, 0, 12533, 0, \r
+    6418, 4543, 78086, 6969, 0, 74800, 0, 0, 11980, 0, 0, 63894, 120760, \r
+    12282, 66192, 0, 74592, 8850, 74275, 9238, 10617, 917545, 0, 0, 0, 12791, \r
+    0, 0, 0, 4447, 73732, 12793, 12900, 0, 10950, 0, 78087, 12790, 41400, \r
+    119128, 0, 12792, 42232, 0, 1744, 12789, 10366, 12317, 41310, 0, 41399, \r
+    0, 0, 55258, 0, 12690, 0, 0, 43672, 0, 41652, 2974, 9010, 11315, 0, 278, \r
+    0, 41405, 119254, 0, 10077, 63853, 74557, 42586, 0, 0, 6002, 0, 43553, 0, \r
+    67903, 0, 12787, 41308, 7934, 65306, 0, 0, 0, 8646, 0, 77829, 0, 0, 6413, \r
+    6550, 0, 1940, 0, 43637, 220, 65193, 43551, 10678, 10044, 0, 0, 0, 68659, \r
+    6403, 5707, 10393, 127532, 0, 66614, 0, 0, 0, 10297, 0, 3742, 0, 3959, 0, \r
+    0, 0, 2467, 0, 6003, 63844, 6663, 8040, 0, 63845, 4182, 78171, 4676, \r
+    120501, 0, 0, 2510, 0, 10208, 78168, 0, 11540, 43546, 6692, 0, 41060, 0, \r
+    0, 9083, 0, 0, 78144, 1559, 63831, 9677, 120260, 0, 65256, 0, 74070, 0, \r
+    0, 365, 12056, 43027, 120423, 41716, 0, 0, 120472, 5516, 2845, 7717, \r
+    8036, 41717, 73827, 544, 12045, 6278, 0, 5515, 0, 0, 0, 65339, 43221, \r
+    65194, 0, 5517, 0, 0, 74841, 67884, 0, 67890, 67885, 67880, 67881, 67882, \r
+    67883, 0, 0, 67879, 0, 1902, 67887, 9638, 12976, 0, 12483, 12368, 41769, \r
+    42726, 41765, 0, 6667, 67874, 7556, 67878, 74351, 11264, 989, 42677, \r
+    67889, 0, 1311, 0, 4326, 11000, 63824, 13068, 10932, 0, 6917, 78155, 0, \r
+    949, 78162, 0, 6148, 8605, 42253, 78177, 0, 0, 42715, 0, 0, 0, 63871, 0, \r
+    41796, 1269, 6530, 0, 65057, 0, 5144, 12221, 42716, 0, 4431, 4331, 0, 0, \r
+    41834, 5279, 0, 10336, 8312, 0, 42701, 0, 0, 78165, 66036, 0, 0, 6428, \r
+    42270, 0, 0, 43059, 42666, 5256, 1067, 255, 12131, 0, 9493, 0, 41014, \r
+    11793, 0, 0, 74394, 43460, 10653, 42723, 0, 119632, 0, 6560, 7016, 74274, \r
+    0, 43556, 3929, 0, 6614, 2768, 0, 9746, 5135, 11811, 12796, 11953, 0, \r
+    69761, 5139, 346, 74303, 6305, 12795, 4675, 5168, 78552, 0, 74315, 74361, \r
+    8253, 8817, 1136, 0, 43563, 0, 0, 194750, 7392, 8230, 9365, 0, 0, 0, 0, \r
+    0, 4041, 0, 2357, 43240, 12786, 229, 119885, 119884, 44004, 43552, \r
+    119881, 12350, 65554, 119882, 119877, 119876, 12785, 63863, 119873, 7770, \r
+    10712, 64853, 12686, 118916, 42375, 0, 127238, 66352, 10470, 0, 11059, \r
+    10791, 917944, 450, 0, 0, 10432, 12097, 5450, 64691, 1233, 0, 44009, \r
+    78284, 66338, 0, 0, 1839, 118799, 0, 10927, 1701, 0, 2388, 41749, 41761, \r
+    5453, 8361, 119865, 41758, 5444, 41763, 64889, 119860, 119863, 78677, 0, \r
+    0, 78174, 66432, 8801, 3053, 4340, 0, 0, 65812, 917831, 0, 41824, 0, \r
+    194801, 194800, 194803, 42700, 194805, 194804, 194807, 78676, 120413, \r
+    194808, 0, 0, 4493, 4336, 0, 2314, 43602, 78826, 119325, 194811, 42439, \r
+    64638, 42327, 43528, 4489, 194791, 0, 194793, 1912, 42385, 10306, 10370, \r
+    0, 0, 8867, 10250, 10258, 2712, 1635, 78821, 1410, 0, 0, 118878, 0, 0, \r
+    9919, 0, 559, 0, 41825, 0, 78188, 4892, 74016, 194781, 6542, 41957, 0, \r
+    5777, 0, 759, 65749, 2079, 65248, 12788, 64487, 64552, 0, 10223, 42062, \r
+    0, 0, 0, 3668, 65754, 43560, 12226, 0, 65149, 2340, 41959, 194786, \r
+    194785, 194788, 43618, 65747, 10937, 2962, 0, 2321, 3587, 65745, 0, 8921, \r
+    9952, 0, 0, 42714, 9951, 43409, 194770, 2949, 66012, 194775, 194774, \r
+    2958, 68359, 41820, 43038, 2395, 0, 9976, 120043, 194778, 120058, 68220, \r
+    194779, 42809, 42807, 0, 120046, 10198, 4150, 64371, 8318, 41790, 0, \r
+    41898, 2360, 41794, 917942, 0, 0, 0, 0, 2418, 0, 2411, 11336, 799, 63823, \r
+    10276, 10308, 10372, 917541, 41772, 42813, 2317, 10260, 118980, 55284, 0, \r
+    0, 10384, 0, 0, 0, 7753, 2351, 6655, 64489, 0, 0, 77872, 4443, 42779, \r
+    230, 0, 0, 43549, 4855, 42150, 65739, 5441, 41896, 10288, 10320, 0, 855, \r
+    7046, 6109, 65045, 63839, 78198, 2049, 10098, 0, 74145, 0, 10264, 10280, \r
+    9184, 10376, 7013, 4467, 0, 0, 0, 41887, 0, 4862, 9735, 6537, 120591, 0, \r
+    3914, 119604, 0, 9065, 12961, 0, 0, 0, 0, 289, 0, 4694, 11420, 4690, 0, \r
+    120514, 917978, 4693, 0, 42724, 0, 4688, 120454, 0, 0, 119629, 8238, \r
+    3110, 120162, 0, 120163, 6528, 127553, 43035, 120161, 218, 0, 1520, 0, \r
+    4786, 0, 43225, 4602, 0, 78167, 10088, 6548, 0, 120156, 43978, 8988, \r
+    8888, 0, 0, 0, 0, 10666, 0, 73902, 0, 0, 0, 9975, 0, 119902, 4689, 8932, \r
+    0, 65560, 119209, 74441, 78810, 0, 0, 0, 0, 0, 0, 0, 0, 10065, 8207, 0, \r
+    120539, 0, 0, 662, 0, 9244, 0, 0, 119261, 0, 0, 0, 0, 41929, 0, 0, 66674, \r
+    41926, 120408, 120443, 10513, 64637, 194862, 0, 52, 13118, 6475, 0, 0, \r
+    12095, 10225, 4812, 0, 0, 0, 74085, 0, 3978, 0, 917945, 0, 11582, 120761, \r
+    12281, 0, 6544, 13241, 0, 69782, 0, 194860, 11765, 65258, 10369, 0, 1585, \r
+    7192, 10249, 422, 1500, 2036, 986, 194859, 64394, 5781, 5599, 64294, \r
+    2494, 120450, 4861, 74021, 64334, 78203, 0, 0, 0, 65102, 8961, 65842, \r
+    10243, 10245, 0, 120410, 0, 120453, 64821, 9478, 2508, 0, 0, 202, 0, \r
+    74131, 1242, 65514, 0, 63940, 0, 64533, 120129, 0, 67842, 11990, 0, \r
+    63939, 43375, 65440, 2504, 0, 78671, 64829, 0, 6943, 917934, 5859, 0, \r
+    2858, 0, 74294, 0, 69239, 0, 119027, 12992, 2753, 1936, 74491, 0, 2751, \r
+    12662, 2763, 8953, 64701, 10731, 12922, 7052, 917839, 0, 0, 0, 63920, \r
+    74128, 2856, 119910, 47, 119911, 126986, 65858, 0, 0, 0, 7899, 0, 8417, \r
+    65903, 7072, 0, 0, 4033, 0, 43992, 0, 0, 212, 64600, 1903, 12320, 0, 0, \r
+    0, 0, 8915, 2759, 945, 6689, 0, 0, 0, 0, 1291, 74828, 0, 0, 9531, 13155, \r
+    8505, 68379, 12062, 0, 0, 65487, 0, 41837, 120611, 120432, 0, 0, 0, \r
+    120433, 0, 63935, 73962, 120806, 64787, 43524, 0, 64426, 0, 0, 0, 0, \r
+    65664, 6693, 9843, 0, 8674, 0, 0, 0, 0, 12624, 0, 1673, 4811, 0, 5986, \r
+    9338, 3046, 74480, 5985, 917928, 119598, 9820, 0, 12187, 0, 0, 5984, 0, \r
+    43308, 4393, 0, 0, 0, 0, 0, 74826, 64733, 0, 0, 3491, 0, 0, 0, 3514, \r
+    65485, 0, 7492, 0, 74605, 119134, 7514, 0, 0, 194731, 7502, 7587, 68353, \r
+    0, 0, 63925, 0, 7610, 219, 0, 0, 692, 43588, 74433, 41635, 43241, 9688, \r
+    0, 9535, 0, 0, 0, 64530, 0, 64610, 11804, 0, 0, 7453, 0, 8013, 0, 0, 0, \r
+    8895, 5253, 0, 5458, 0, 2866, 0, 0, 65111, 68433, 6700, 120484, 0, 0, 0, \r
+    8962, 77960, 9641, 43694, 7059, 0, 0, 9604, 78700, 7441, 63826, 0, \r
+    118941, 64392, 0, 0, 2844, 0, 41974, 0, 12139, 0, 0, 0, 3358, 65295, 0, \r
+    3104, 0, 0, 194765, 0, 5308, 0, 290, 0, 0, 2862, 2792, 195088, 0, 0, \r
+    3268, 66591, 0, 6552, 42367, 7035, 120558, 0, 0, 1814, 0, 10240, 0, \r
+    74305, 0, 74528, 0, 0, 42646, 7606, 2591, 2837, 4341, 77956, 64482, 0, \r
+    8163, 65270, 0, 0, 0, 9112, 74431, 863, 9490, 119898, 0, 43323, 120513, \r
+    119897, 9071, 0, 0, 3654, 7789, 9637, 0, 2535, 65504, 7653, 40993, \r
+    119899, 66587, 195098, 0, 0, 0, 11006, 12927, 7807, 8073, 0, 10629, 0, \r
+    74088, 3056, 10823, 0, 127327, 8762, 10508, 74506, 73770, 43969, 43193, \r
+    10737, 3463, 0, 0, 66633, 8695, 4815, 11322, 5811, 12345, 7049, 0, 5195, \r
+    0, 0, 66639, 0, 0, 0, 0, 0, 120561, 1262, 0, 6561, 19939, 0, 0, 0, 0, 0, \r
+    0, 0, 0, 0, 119907, 64612, 11991, 0, 0, 0, 1502, 0, 0, 9107, 0, 5702, \r
+    3655, 67661, 8430, 0, 74132, 120758, 0, 74057, 9603, 0, 5254, 120742, \r
+    7724, 74388, 68375, 10796, 5129, 0, 0, 590, 7579, 5614, 5893, 194744, \r
+    11720, 0, 11721, 0, 4798, 0, 119316, 66038, 4793, 67851, 11726, 0, 74204, \r
+    68610, 0, 68626, 894, 300, 0, 12306, 66235, 8004, 0, 0, 2562, 0, 0, \r
+    42503, 0, 11652, 0, 0, 119241, 0, 0, 5096, 5095, 2863, 3424, 0, 10454, \r
+    42530, 5094, 119638, 0, 13156, 0, 10832, 5093, 0, 0, 0, 5092, 10708, \r
+    11327, 0, 5091, 176, 0, 9153, 4104, 78599, 78601, 1215, 42712, 5744, \r
+    12272, 9832, 11777, 0, 127371, 42881, 0, 8980, 118988, 67861, 8844, 7209, \r
+    0, 0, 4278, 0, 0, 0, 0, 9074, 4348, 0, 65558, 65946, 8113, 7087, 5255, \r
+    1786, 661, 0, 0, 0, 74423, 0, 586, 74414, 64359, 1267, 0, 65468, 0, \r
+    65731, 0, 0, 3621, 120473, 66666, 64211, 0, 6562, 12928, 0, 1228, 65490, \r
+    11383, 0, 0, 0, 1714, 74406, 0, 0, 0, 0, 66225, 0, 0, 42660, 11436, 2070, \r
+    64, 120694, 0, 10291, 10323, 2826, 0, 0, 0, 42008, 9708, 42710, 0, 42011, \r
+    41999, 0, 12206, 5839, 1702, 1240, 74065, 6286, 0, 0, 65833, 77848, 0, \r
+    1765, 0, 0, 65588, 0, 0, 0, 8401, 0, 42014, 0, 7030, 0, 10479, 64959, \r
+    2852, 0, 0, 0, 0, 195061, 917951, 6963, 0, 12667, 64540, 74786, 10147, \r
+    12935, 0, 0, 0, 0, 0, 78757, 0, 0, 0, 0, 64947, 12467, 2864, 64719, 1148, \r
+    10435, 11462, 41675, 0, 2765, 0, 0, 0, 120719, 0, 0, 66662, 0, 78133, \r
+    9364, 194685, 74416, 0, 0, 77988, 263, 10449, 41288, 0, 41839, 78387, 0, \r
+    77986, 0, 6931, 0, 64355, 7177, 120530, 0, 0, 0, 4262, 10285, 10722, \r
+    42020, 0, 6806, 6992, 42019, 0, 41290, 0, 750, 0, 0, 10163, 63913, 74066, \r
+    7032, 5954, 64931, 4314, 0, 198, 68453, 730, 0, 63907, 77993, 78891, \r
+    13165, 10814, 74171, 42804, 678, 8240, 78015, 0, 41378, 11008, 6938, 0, \r
+    0, 2097, 66246, 120560, 0, 0, 0, 3892, 68632, 0, 6712, 66045, 41470, \r
+    64805, 0, 0, 0, 64801, 0, 497, 12100, 5953, 0, 7796, 0, 43254, 73831, 0, \r
+    10293, 5952, 1281, 0, 0, 0, 10677, 604, 41097, 9182, 1859, 0, 0, 3425, 0, \r
+    0, 2836, 0, 0, 9707, 0, 43202, 0, 0, 65199, 1738, 917818, 0, 2832, 0, \r
+    9670, 12937, 0, 66374, 0, 0, 2822, 0, 4436, 0, 0, 73752, 0, 64872, 0, \r
+    1331, 0, 0, 0, 12708, 0, 5090, 5089, 0, 0, 119109, 0, 0, 319, 118931, \r
+    43479, 9477, 0, 0, 5087, 0, 7640, 96, 5086, 0, 0, 0, 5085, 64286, 0, 0, \r
+    41422, 0, 119901, 42356, 3772, 0, 0, 5011, 0, 0, 0, 0, 0, 127241, 6677, \r
+    7601, 0, 591, 64419, 118953, 0, 0, 118923, 73734, 0, 10939, 6106, 6933, \r
+    41271, 6760, 119903, 4534, 41270, 917962, 0, 65574, 0, 9224, 0, 3671, \r
+    8976, 0, 0, 41275, 6372, 0, 55261, 7963, 6371, 0, 568, 0, 41273, 0, 0, \r
+    6728, 0, 9715, 0, 8258, 11753, 74820, 0, 9602, 118919, 42, 0, 43688, 0, \r
+    0, 7458, 0, 0, 65385, 119900, 0, 11958, 0, 917822, 0, 6254, 42721, 66336, \r
+    8045, 11550, 0, 0, 0, 42858, 11789, 65868, 5557, 917946, 9737, 13109, 0, \r
+    9467, 5558, 8878, 0, 195036, 7451, 6706, 10146, 0, 9086, 64566, 0, 64584, \r
+    7437, 7454, 12594, 0, 68362, 4546, 7731, 0, 119909, 74243, 0, 3805, 0, \r
+    194565, 44001, 41008, 0, 6307, 19949, 0, 7544, 0, 43469, 0, 0, 10152, \r
+    64422, 65091, 119113, 7602, 64729, 0, 43521, 0, 42302, 43711, 43523, \r
+    41447, 5559, 0, 8704, 2397, 5556, 0, 0, 0, 9011, 9630, 0, 0, 0, 5506, 0, \r
+    1911, 66652, 0, 9961, 8845, 66698, 0, 10792, 8889, 0, 2098, 0, 64751, 0, \r
+    66622, 0, 0, 74364, 0, 0, 0, 74365, 7552, 0, 0, 65384, 7223, 4559, 0, \r
+    1956, 43138, 7024, 65728, 64501, 1210, 195077, 65175, 10184, 43140, \r
+    43654, 0, 0, 0, 38, 8533, 66669, 119124, 0, 0, 0, 4357, 0, 0, 0, 74233, \r
+    9967, 119852, 42860, 119838, 10941, 65721, 6962, 0, 0, 119324, 0, 11014, \r
+    0, 8942, 12000, 69224, 0, 0, 11974, 0, 42772, 127518, 11650, 5013, 0, 0, \r
+    66210, 118914, 6613, 0, 0, 0, 0, 0, 64714, 0, 0, 0, 12120, 43476, 0, \r
+    11024, 74811, 0, 10563, 0, 0, 43522, 2462, 0, 1837, 0, 63972, 6957, 0, \r
+    120559, 4952, 65718, 65827, 5504, 65720, 65714, 65715, 65716, 0, 127005, \r
+    127119, 3109, 63975, 74028, 0, 8107, 119234, 1127, 455, 0, 63968, 0, \r
+    3483, 119593, 1989, 0, 0, 9104, 3503, 65375, 0, 6694, 42633, 1864, 0, \r
+    74306, 41446, 2540, 7736, 0, 74064, 0, 10521, 0, 42173, 9705, 74124, \r
+    8604, 6955, 10916, 43684, 6149, 3887, 19956, 1411, 2824, 0, 10106, 0, \r
+    1403, 0, 1347, 9631, 74444, 0, 0, 0, 0, 8640, 0, 258, 1654, 0, 0, 0, \r
+    43314, 0, 0, 4042, 11478, 2873, 63977, 11522, 41668, 8549, 10861, 0, \r
+    63976, 0, 68623, 0, 74585, 41391, 0, 917903, 376, 6987, 9221, 0, 0, 8823, \r
+    0, 12943, 65185, 41869, 12619, 0, 10154, 0, 74439, 2039, 0, 7446, 1684, \r
+    63979, 10974, 458, 120620, 0, 69791, 0, 11916, 65016, 0, 78067, 42115, 0, \r
+    12288, 78057, 0, 1493, 42111, 7553, 4097, 0, 13080, 0, 65808, 6610, 6030, \r
+    8059, 7508, 13131, 0, 0, 0, 8794, 41278, 41629, 12154, 0, 41277, 64658, \r
+    0, 64380, 6625, 74354, 19904, 0, 0, 0, 65371, 7078, 0, 833, 0, 6369, 0, \r
+    10979, 41953, 0, 41434, 6062, 0, 0, 19916, 6913, 933, 1341, 9842, 6720, \r
+    65744, 0, 0, 195076, 0, 7405, 10105, 65810, 0, 41632, 7493, 0, 0, 41622, \r
+    0, 0, 119556, 74584, 7632, 9716, 19954, 9805, 5990, 900, 0, 63957, 0, 0, \r
+    3612, 0, 64376, 0, 5389, 0, 0, 65938, 2839, 9621, 582, 0, 74368, 3749, \r
+    6949, 7569, 74061, 0, 0, 6956, 4403, 19962, 65559, 3299, 0, 0, 119127, \r
+    9002, 0, 74372, 74236, 8478, 7598, 546, 42469, 65569, 1918, 9542, 472, \r
+    7716, 10319, 10383, 6996, 0, 63952, 8425, 3602, 8328, 11764, 118894, 0, \r
+    69796, 41183, 12907, 10271, 10287, 684, 43525, 0, 2854, 119586, 4592, \r
+    65755, 0, 0, 11963, 43620, 0, 78889, 0, 0, 0, 9881, 43115, 65757, 3415, \r
+    0, 0, 8648, 0, 6741, 43047, 0, 13180, 0, 418, 0, 0, 10295, 10327, 10391, \r
+    41752, 74339, 8641, 41449, 0, 74100, 0, 10911, 6942, 0, 1024, 42849, \r
+    41751, 69776, 8941, 0, 4554, 0, 9023, 11685, 0, 9928, 78617, 0, 11437, \r
+    43741, 0, 120700, 63967, 0, 41206, 120724, 9049, 41185, 43166, 0, 11680, \r
+    0, 11686, 0, 65224, 4565, 4655, 119553, 0, 0, 64523, 10343, 10407, 0, \r
+    66671, 11466, 0, 0, 42890, 0, 12050, 68201, 2860, 0, 0, 0, 42792, 5743, \r
+    10424, 12065, 42872, 0, 0, 0, 8875, 0, 0, 917991, 7531, 12847, 2413, 0, \r
+    78635, 962, 0, 12855, 41196, 42564, 0, 1582, 0, 5508, 0, 0, 0, 10801, 0, \r
+    118798, 0, 7173, 496, 10439, 4313, 64607, 119557, 7860, 0, 906, 42793, \r
+    2842, 6405, 64722, 13132, 798, 64694, 12801, 8406, 1153, 0, 64788, 0, \r
+    8054, 9174, 194749, 917976, 9964, 0, 41611, 4642, 66574, 11556, 0, 0, \r
+    78857, 42089, 78855, 9008, 0, 0, 195096, 42079, 917981, 77924, 42513, 0, \r
+    42842, 73985, 65285, 118974, 127003, 0, 0, 0, 0, 11335, 64069, 42093, \r
+    3920, 0, 0, 0, 0, 4580, 41967, 0, 64384, 0, 119158, 3021, 42004, 0, 0, \r
+    42317, 41998, 0, 6946, 0, 0, 0, 0, 65204, 0, 68113, 42690, 9880, 42010, \r
+    74824, 64589, 10111, 64875, 0, 68399, 43998, 11360, 0, 0, 0, 0, 42149, 0, \r
+    0, 0, 64941, 77919, 0, 0, 0, 55247, 4110, 66005, 6959, 10929, 119110, 0, \r
+    66703, 77921, 8617, 41982, 6025, 69242, 0, 0, 0, 0, 9597, 42099, 43172, \r
+    0, 10117, 0, 0, 41636, 0, 0, 120681, 8301, 0, 0, 187, 0, 65669, 0, 4963, \r
+    0, 127517, 0, 8964, 65676, 65785, 0, 41948, 0, 0, 0, 41942, 65449, 3160, \r
+    10081, 13226, 42121, 42475, 42663, 0, 41766, 0, 65882, 78849, 41760, \r
+    1189, 905, 480, 10985, 41733, 67859, 9629, 6742, 1745, 43625, 73835, \r
+    7888, 0, 0, 0, 42656, 41507, 8806, 7023, 0, 74279, 9447, 78651, 7867, \r
+    69218, 6236, 0, 0, 10505, 0, 12851, 118948, 348, 5474, 0, 3103, 0, 41753, \r
+    0, 0, 0, 78844, 78845, 41739, 78843, 42515, 10931, 41756, 43347, 42560, \r
+    5391, 41746, 119147, 0, 41259, 5561, 74360, 2691, 0, 65553, 7933, 5562, \r
+    69800, 917851, 41262, 0, 64421, 74846, 41251, 0, 0, 3979, 0, 0, 74813, 0, \r
+    0, 0, 0, 118847, 41266, 0, 0, 917630, 10585, 65741, 41737, 9574, 2666, 0, \r
+    41738, 831, 419, 13126, 10716, 0, 42822, 0, 6434, 0, 6939, 7766, 6432, 0, \r
+    0, 916, 769, 41742, 11968, 74805, 6433, 5563, 547, 1943, 6439, 5560, \r
+    4994, 487, 0, 4497, 3754, 127056, 120424, 9039, 0, 41776, 0, 8716, 1595, \r
+    41615, 0, 0, 74260, 0, 43267, 43219, 0, 0, 12185, 0, 0, 68355, 68357, 0, \r
+    42856, 8634, 0, 0, 4209, 120702, 0, 65879, 41538, 65612, 0, 669, 5679, 0, \r
+    69786, 118961, 0, 0, 5678, 11821, 0, 6711, 460, 0, 0, 0, 0, 120747, 0, 0, \r
+    78050, 119022, 0, 0, 0, 7782, 9044, 4974, 11760, 78494, 7577, 65711, \r
+    41912, 1216, 0, 0, 5792, 0, 0, 78501, 0, 42264, 12244, 0, 5683, 0, 0, \r
+    78119, 1549, 0, 0, 120398, 5682, 6206, 8670, 10256, 5680, 917568, 10001, \r
+    0, 69768, 1449, 10241, 78290, 0, 0, 10552, 64342, 41922, 0, 8584, 0, \r
+    5567, 2717, 0, 0, 5564, 42886, 41908, 42882, 5565, 0, 0, 0, 65708, 65709, \r
+    5566, 69803, 65704, 65705, 11904, 42875, 43373, 42539, 5942, 8468, 0, \r
+    10361, 10425, 65697, 65698, 65699, 0, 66598, 0, 64664, 10647, 78702, \r
+    78703, 78690, 457, 78502, 65701, 1934, 43006, 0, 8802, 78710, 65130, \r
+    78706, 78709, 6087, 78705, 78716, 41757, 78711, 8043, 8950, 65694, 64485, \r
+    43534, 10457, 0, 11961, 78725, 78722, 78723, 78720, 78721, 0, 65515, \r
+    9499, 10035, 13069, 0, 0, 9889, 68184, 42806, 0, 7256, 0, 0, 1667, 42161, \r
+    0, 42428, 0, 6934, 0, 10802, 64861, 6556, 78390, 0, 8101, 3610, 0, 41748, \r
+    4995, 955, 65907, 119208, 5350, 64339, 78306, 64549, 10875, 917956, 5477, \r
+    65692, 0, 0, 120397, 12896, 10456, 917954, 0, 3874, 0, 0, 0, 0, 0, 0, \r
+    65603, 0, 65687, 0, 41038, 74009, 119570, 42239, 8536, 78740, 0, 78726, \r
+    74432, 724, 0, 1455, 78749, 7183, 64583, 78747, 68443, 4175, 78741, \r
+    43614, 69801, 939, 0, 43520, 68613, 74569, 917958, 0, 78763, 78764, \r
+    78760, 10788, 6088, 78759, 78755, 190, 0, 12593, 0, 8188, 64408, 0, 4417, \r
+    0, 0, 6370, 0, 7827, 68441, 6965, 0, 0, 13201, 0, 0, 0, 74382, 73781, \r
+    7918, 73988, 0, 0, 917884, 1728, 0, 120710, 178, 12972, 0, 0, 0, 120671, \r
+    0, 0, 78327, 120405, 65690, 0, 0, 119054, 0, 9252, 917889, 4652, 68371, \r
+    0, 0, 0, 13065, 9923, 10806, 0, 11763, 0, 120688, 6723, 78187, 0, 6993, \r
+    0, 0, 8333, 0, 0, 11390, 0, 74464, 0, 0, 74080, 0, 0, 11910, 0, 8278, \r
+    8963, 4034, 0, 0, 65344, 120517, 41747, 0, 0, 8677, 0, 12707, 9350, \r
+    66037, 0, 8836, 12315, 12747, 8300, 0, 0, 7491, 8856, 0, 0, 43150, 0, \r
+    120404, 65389, 120402, 120403, 10813, 2592, 12853, 43269, 7263, 120244, \r
+    6536, 120238, 120239, 65516, 12321, 120391, 120388, 55287, 10007, 120246, \r
+    9588, 120248, 1596, 120383, 41994, 65801, 0, 0, 66572, 0, 0, 10613, 6697, \r
+    12805, 41928, 40981, 78403, 78409, 5006, 64328, 0, 9931, 0, 8825, 74555, \r
+    65940, 43259, 0, 6107, 0, 119177, 0, 78401, 0, 11783, 335, 120227, 64689, \r
+    438, 4510, 5765, 8721, 120233, 119227, 6092, 12840, 43112, 8876, 120231, \r
+    8096, 10284, 0, 0, 0, 10380, 8733, 0, 0, 41602, 0, 0, 74831, 917901, 0, \r
+    73747, 65399, 0, 64591, 42405, 0, 120820, 843, 11541, 0, 917898, 2065, \r
+    41935, 74496, 41902, 0, 0, 215, 41258, 77875, 43159, 1953, 9579, 41938, \r
+    1256, 3910, 9407, 6242, 0, 0, 41257, 41900, 8675, 10700, 8805, 1742, 0, \r
+    9333, 8202, 0, 0, 0, 0, 0, 73882, 499, 0, 43467, 0, 55290, 0, 1712, 5932, \r
+    77845, 41762, 0, 0, 11967, 1775, 0, 0, 0, 0, 0, 9458, 0, 6470, 9180, \r
+    120380, 43176, 0, 0, 42782, 0, 0, 0, 917912, 74777, 120669, 9414, 120382, \r
+    73782, 73969, 565, 42484, 5794, 201, 2662, 42292, 0, 8254, 0, 10975, 0, \r
+    120625, 74763, 1022, 4108, 3880, 74247, 0, 0, 194964, 917980, 7507, 0, \r
+    43149, 0, 65031, 7961, 1636, 0, 65029, 65024, 0, 12473, 6534, 0, 99, 98, \r
+    97, 120571, 67584, 4049, 74163, 127065, 7090, 0, 7892, 917969, 10777, 0, \r
+    65310, 65562, 66599, 66722, 0, 8039, 3363, 66594, 43434, 0, 0, 12596, \r
+    66595, 42258, 42570, 5593, 119148, 120711, 0, 10100, 6061, 64854, 119, \r
+    118, 117, 116, 12998, 122, 121, 120, 111, 110, 109, 108, 115, 114, 113, \r
+    112, 103, 102, 101, 100, 107, 106, 105, 104, 6436, 73974, 534, 41212, \r
+    77931, 1536, 64093, 73970, 77930, 0, 0, 6020, 12716, 127112, 12744, 475, \r
+    120394, 13266, 0, 127111, 0, 73926, 0, 10645, 1212, 6543, 0, 8134, 0, \r
+    2913, 73870, 0, 1866, 0, 195095, 0, 8923, 1645, 12059, 66585, 78786, \r
+    3196, 0, 0, 5935, 1250, 127066, 8174, 9787, 6733, 9859, 7916, 9861, 9860, \r
+    5258, 1882, 1892, 6731, 10882, 405, 11454, 73911, 0, 0, 41169, 8939, \r
+    41245, 0, 41170, 1454, 11369, 6477, 12157, 0, 0, 0, 41172, 7855, 0, 0, \r
+    10480, 0, 0, 77936, 8264, 12610, 0, 645, 0, 7609, 40973, 0, 73833, 78249, \r
+    5824, 984, 77918, 10688, 5851, 0, 7729, 73982, 120518, 0, 195086, 43369, \r
+    0, 0, 68415, 0, 4538, 120406, 43141, 0, 0, 74214, 73886, 0, 0, 118902, \r
+    43005, 78448, 9552, 0, 0, 0, 12997, 0, 0, 0, 0, 2381, 12883, 10994, \r
+    10529, 41906, 0, 0, 0, 12425, 10661, 10856, 9614, 2428, 41478, 8582, \r
+    10064, 73930, 0, 0, 0, 64896, 119162, 1952, 0, 8455, 10082, 11575, 0, \r
+    119566, 0, 12808, 12183, 6145, 0, 64929, 0, 0, 0, 43186, 42509, 0, 3922, \r
+    9187, 0, 0, 0, 119057, 11752, 3353, 9358, 0, 917957, 66680, 120090, \r
+    11747, 7931, 8558, 9795, 68380, 0, 0, 120082, 120081, 120084, 41027, \r
+    120086, 0, 120088, 120087, 7019, 120073, 0, 11751, 120078, 78294, 64657, \r
+    8657, 120048, 8594, 120068, 0, 0, 120069, 120072, 120071, 0, 0, 43154, \r
+    41029, 0, 11332, 65380, 7728, 0, 11294, 0, 66665, 7851, 0, 8375, 8699, 0, \r
+    42524, 0, 9085, 0, 7504, 9327, 6160, 0, 0, 0, 8088, 0, 74012, 0, 0, 4439, \r
+    6926, 0, 12924, 0, 42369, 0, 65491, 65145, 9041, 43559, 64577, 10826, 0, \r
+    11296, 0, 0, 0, 65825, 9577, 68199, 0, 64670, 0, 78056, 6793, 11295, 0, \r
+    78053, 73872, 0, 0, 10902, 0, 0, 78070, 78068, 10472, 2995, 0, 0, 64682, \r
+    2371, 78069, 120808, 259, 1009, 0, 2402, 2333, 6440, 0, 0, 65125, 41244, \r
+    0, 13271, 9103, 41180, 0, 0, 0, 0, 10219, 0, 0, 0, 0, 43178, 127070, \r
+    41261, 119362, 43640, 8613, 0, 118989, 6736, 195092, 41492, 12005, \r
+    917982, 0, 1890, 120056, 0, 0, 0, 7293, 7991, 0, 10578, 0, 78076, 0, \r
+    78077, 0, 0, 78800, 0, 120054, 42668, 6635, 0, 6164, 65170, 0, 0, 0, \r
+    11664, 0, 0, 0, 0, 118812, 0, 0, 0, 9175, 11925, 78045, 9088, 0, 64545, \r
+    1396, 0, 7546, 3847, 0, 0, 4985, 13288, 672, 8098, 43196, 194746, 0, 0, \r
+    0, 74043, 65072, 1577, 11772, 13041, 5928, 4525, 10658, 65911, 1266, \r
+    10180, 0, 0, 12622, 0, 0, 0, 194714, 0, 13310, 773, 19933, 1539, 0, \r
+    126983, 42731, 0, 0, 0, 0, 3051, 5862, 7823, 0, 0, 120411, 3250, 43991, \r
+    0, 66649, 9510, 66237, 0, 0, 41066, 64673, 917963, 917964, 0, 3505, 8707, \r
+    917968, 6725, 917966, 917971, 917972, 3471, 917970, 5479, 882, 6686, \r
+    119584, 11613, 120772, 42754, 0, 0, 0, 0, 0, 0, 0, 3225, 917996, 4433, \r
+    41156, 43973, 43173, 1443, 4381, 0, 0, 10926, 11756, 11757, 64879, \r
+    917949, 917950, 917947, 13227, 0, 10021, 5160, 1387, 0, 917953, 41418, 0, \r
+    65914, 6721, 217, 917955, 917960, 917961, 10443, 10789, 41158, 119257, \r
+    4274, 0, 41483, 0, 41250, 0, 42179, 0, 5931, 11744, 69232, 0, 41252, \r
+    66682, 0, 119637, 41249, 1366, 64635, 0, 12466, 0, 0, 4397, 0, 0, 41296, \r
+    9545, 41291, 0, 0, 41485, 3511, 41282, 5923, 10400, 0, 0, 760, 0, 12088, \r
+    5786, 0, 42256, 119869, 119861, 417, 41474, 119562, 41565, 0, 5934, \r
+    119867, 66583, 119231, 64877, 0, 64481, 78614, 66013, 41956, 43455, \r
+    126995, 0, 0, 0, 42273, 5819, 0, 917556, 0, 0, 0, 65910, 0, 10246, \r
+    120816, 0, 1237, 10274, 4552, 0, 0, 0, 1375, 66705, 43573, 65260, 42063, \r
+    0, 42811, 10312, 74192, 120794, 7840, 0, 43630, 10252, 0, 0, 43185, 0, \r
+    4396, 0, 119880, 10769, 9676, 119041, 0, 9753, 0, 8944, 0, 0, 10473, 0, \r
+    0, 6072, 43025, 10299, 0, 0, 120608, 66326, 0, 0, 0, 0, 9330, 0, 7222, \r
+    10283, 10315, 10379, 4996, 0, 13281, 66517, 7865, 10087, 78343, 0, 78347, \r
+    0, 0, 7565, 66363, 12952, 64806, 43180, 77928, 68096, 77929, 43982, \r
+    74288, 622, 74023, 885, 43405, 1602, 0, 0, 852, 0, 12160, 0, 10212, \r
+    65435, 0, 12071, 9609, 12156, 917983, 917984, 43586, 11035, 10411, \r
+    917988, 10255, 6710, 10279, 4194, 10375, 917993, 0, 4315, 12644, 127516, \r
+    77937, 43639, 43343, 0, 917998, 11501, 41177, 0, 0, 917792, 0, 0, 8715, \r
+    0, 41179, 0, 43313, 0, 41176, 0, 994, 0, 8452, 127103, 73966, 0, 0, 5921, \r
+    0, 2597, 0, 5922, 118903, 77943, 4186, 127107, 127106, 127105, 6718, 0, \r
+    4406, 74601, 8480, 9192, 9747, 0, 4413, 0, 42268, 3198, 5924, 5920, 0, \r
+    6921, 78081, 74007, 42869, 8418, 11681, 43169, 10176, 0, 742, 0, 2893, \r
+    10772, 65276, 5937, 1914, 2553, 11682, 6756, 0, 0, 8363, 0, 2993, 7772, \r
+    3916, 0, 120494, 1141, 42407, 8159, 718, 7572, 973, 0, 120718, 3235, \r
+    2415, 43164, 0, 8018, 42333, 74756, 10675, 6937, 42486, 43381, 65390, 0, \r
+    0, 1202, 0, 0, 127037, 0, 0, 0, 78182, 64542, 3260, 73829, 65388, 9945, \r
+    8419, 78042, 6738, 0, 43681, 74193, 2059, 0, 0, 55237, 1431, 0, 66565, \r
+    10821, 0, 12804, 0, 8229, 1235, 3307, 11472, 78089, 78184, 4544, 0, 0, 0, \r
+    1740, 78097, 8758, 985, 12872, 64511, 78094, 12068, 78102, 0, 10141, 0, \r
+    63761, 8785, 4476, 78109, 63763, 12655, 8907, 78105, 78106, 78103, 78104, \r
+    0, 119572, 10665, 64616, 41572, 0, 0, 0, 41573, 0, 3931, 120295, 74143, \r
+    0, 0, 0, 0, 11982, 0, 0, 0, 0, 64484, 0, 41167, 0, 41735, 0, 717, 10754, \r
+    0, 0, 0, 0, 63767, 0, 1780, 6936, 0, 0, 819, 10611, 9694, 126978, 0, 0, \r
+    0, 0, 0, 0, 12820, 0, 6578, 7009, 7523, 6922, 74218, 67848, 7525, 3346, \r
+    8339, 0, 0, 575, 268, 78111, 8563, 5754, 120343, 41541, 65565, 8336, \r
+    5936, 7290, 78117, 8337, 13081, 308, 11388, 7522, 120721, 78123, 65466, \r
+    11090, 6953, 0, 120346, 0, 78132, 5926, 78128, 78130, 78126, 78127, \r
+    78124, 78125, 9038, 7887, 43456, 7830, 11651, 13093, 64002, 0, 65742, \r
+    12874, 119597, 11590, 0, 74048, 0, 8595, 0, 0, 43703, 13097, 0, 64643, \r
+    13283, 12697, 0, 12381, 3488, 5933, 10033, 73738, 66241, 65570, 0, 12297, \r
+    119153, 1955, 0, 5349, 42538, 0, 0, 65308, 9462, 0, 0, 0, 0, 42736, 0, \r
+    5756, 0, 7638, 41642, 42764, 0, 43109, 7637, 5752, 120600, 0, 73832, 0, \r
+    120635, 0, 78334, 0, 7636, 65171, 9124, 0, 78892, 0, 291, 0, 0, 2027, \r
+    66230, 78142, 78136, 10403, 0, 4640, 64713, 10224, 120429, 42512, 120431, \r
+    120430, 0, 0, 0, 0, 0, 0, 0, 119094, 74213, 7824, 0, 0, 41274, 5778, \r
+    6302, 0, 0, 12680, 119130, 1417, 77889, 194914, 9452, 0, 74393, 11552, 0, \r
+    0, 0, 65391, 0, 10172, 65453, 63789, 41264, 78658, 6426, 4641, 9179, \r
+    64819, 55278, 41255, 42036, 41469, 41269, 120412, 41267, 4646, 120425, \r
+    865, 42034, 78274, 78273, 4645, 42033, 78270, 0, 0, 64728, 0, 78673, \r
+    78674, 1659, 919, 42784, 1671, 195089, 6069, 9219, 195090, 1661, 13120, \r
+    63784, 69819, 10140, 9713, 119143, 0, 0, 0, 2306, 10485, 118943, 6068, \r
+    10612, 195099, 0, 195101, 195078, 41462, 195080, 195079, 5422, 195081, 0, \r
+    0, 0, 10229, 10635, 826, 195083, 195082, 195085, 195084, 195087, 6483, 0, \r
+    1808, 7848, 0, 8100, 78227, 78669, 78670, 13301, 78667, 9667, 78665, \r
+    78872, 0, 11003, 9904, 0, 0, 120690, 9144, 10921, 0, 78680, 9840, 65131, \r
+    78678, 77841, 10313, 0, 0, 64320, 10265, 78686, 10962, 78684, 43008, \r
+    8945, 78683, 0, 41, 195072, 1792, 120515, 195073, 8655, 195075, 0, 77951, \r
+    12066, 0, 385, 4152, 2585, 0, 119068, 3126, 0, 74136, 10957, 0, 43258, 0, \r
+    0, 13157, 0, 0, 3570, 0, 7443, 0, 44006, 6997, 0, 0, 7879, 8739, 11075, \r
+    0, 65216, 0, 69795, 2593, 8463, 7810, 917862, 7839, 119913, 78806, \r
+    119912, 9691, 4411, 78802, 0, 0, 43442, 78799, 65254, 10066, 0, 0, 0, 0, \r
+    13061, 8016, 78687, 19932, 64831, 0, 0, 12390, 119171, 1634, 68115, 0, \r
+    11056, 0, 119925, 0, 41165, 11328, 12450, 0, 41166, 0, 12456, 119914, \r
+    171, 5941, 12452, 917544, 12458, 12531, 78779, 43013, 63800, 74162, 0, \r
+    120483, 9969, 0, 12454, 63806, 42132, 12063, 78425, 78424, 3230, 0, 0, 0, \r
+    5209, 297, 5810, 8522, 8415, 0, 78429, 78428, 7077, 2497, 0, 960, 74156, \r
+    6981, 0, 12938, 4292, 0, 74815, 10512, 0, 74814, 78875, 127505, 78876, \r
+    2503, 73778, 1762, 69794, 2495, 78873, 5844, 78874, 118838, 0, 12654, \r
+    4663, 1899, 78877, 2507, 64121, 8726, 65594, 0, 0, 0, 8892, 0, 0, 0, 0, \r
+    5782, 420, 0, 0, 120462, 10797, 63794, 0, 0, 64814, 63796, 77965, 0, \r
+    66581, 119204, 41608, 0, 0, 63792, 4659, 120788, 0, 43676, 0, 0, 0, 0, 0, \r
+    329, 77968, 0, 917548, 7399, 0, 41188, 13244, 120466, 42167, 7435, 78193, \r
+    5380, 119086, 69225, 1155, 11365, 43126, 77972, 0, 65684, 0, 5601, 65192, \r
+    42765, 63752, 0, 7987, 0, 1172, 69799, 6786, 43601, 120476, 74126, 5603, \r
+    0, 4473, 0, 194823, 0, 65347, 65346, 65345, 0, 0, 5347, 69802, 0, 73868, \r
+    118944, 10588, 0, 0, 63755, 0, 5343, 78422, 0, 4555, 5341, 0, 0, 0, 5351, \r
+    0, 43104, 65244, 917892, 64541, 42519, 74472, 0, 0, 74765, 917888, 0, \r
+    6638, 0, 65113, 271, 74180, 65370, 8835, 65368, 12653, 65366, 42172, \r
+    41086, 65363, 65362, 65361, 11912, 43410, 11323, 65357, 11800, 65355, \r
+    5345, 65353, 65352, 65351, 761, 65349, 19959, 0, 63856, 0, 0, 77958, \r
+    64647, 77959, 11957, 4699, 0, 0, 0, 0, 64605, 0, 0, 0, 4916, 0, 380, \r
+    10958, 66563, 77955, 69773, 9773, 13167, 12918, 41096, 73980, 69245, \r
+    78254, 917893, 10684, 0, 917896, 0, 7946, 12541, 8182, 0, 69780, 0, 0, 0, \r
+    0, 9005, 1225, 6630, 0, 0, 0, 0, 8847, 0, 65876, 5535, 8329, 74590, 0, 0, \r
+    0, 0, 3127, 2595, 65713, 42013, 0, 5607, 41089, 0, 0, 74256, 2665, 11304, \r
+    0, 74200, 4970, 8764, 120459, 8934, 0, 41566, 4492, 0, 65011, 41090, 0, \r
+    0, 1188, 7254, 1100, 0, 0, 41081, 2912, 11749, 69792, 0, 0, 3572, 10023, \r
+    4959, 13079, 0, 0, 9729, 0, 0, 0, 43361, 0, 0, 11803, 7996, 9907, 41450, \r
+    13304, 0, 127260, 41451, 0, 11095, 8273, 127533, 3451, 0, 972, 41453, 0, \r
+    0, 73883, 0, 73945, 0, 3455, 19955, 9538, 0, 69807, 0, 0, 0, 0, 11396, 0, \r
+    11019, 0, 0, 0, 120507, 41078, 0, 261, 5927, 7791, 0, 0, 0, 10696, 0, \r
+    6073, 9838, 118920, 0, 6075, 0, 282, 0, 6437, 74078, 0, 65861, 0, 0, 0, \r
+    0, 3474, 118787, 0, 120655, 6081, 0, 0, 74076, 78879, 0, 0, 0, 0, 0, \r
+    8751, 11499, 120273, 7816, 12636, 4665, 12628, 4670, 120271, 120272, 0, \r
+    9642, 10912, 958, 0, 11387, 78878, 4666, 0, 4915, 0, 4669, 0, 68099, \r
+    13287, 4664, 10836, 120550, 0, 69775, 0, 43595, 7450, 0, 917875, 8664, \r
+    9697, 3606, 917873, 0, 0, 64815, 1063, 120250, 120251, 9772, 7255, 8886, \r
+    1389, 0, 120257, 120258, 120259, 12941, 42661, 120254, 120255, 120256, \r
+    12301, 120266, 69820, 41102, 66604, 120262, 120263, 120264, 1017, 66600, \r
+    523, 505, 1447, 74436, 0, 0, 0, 8608, 42789, 0, 0, 0, 119196, 11307, \r
+    66707, 917871, 0, 11745, 7919, 0, 1641, 0, 0, 8966, 0, 0, 5908, 0, 0, \r
+    6744, 0, 1699, 74191, 74843, 0, 0, 6306, 10169, 0, 119251, 118939, 3766, \r
+    2389, 120456, 120455, 6611, 257, 43170, 13153, 0, 42386, 0, 9436, 2599, \r
+    0, 6496, 9449, 5930, 11476, 11033, 11447, 0, 5622, 120436, 8477, 3760, \r
+    1718, 9442, 66433, 3776, 0, 41435, 4352, 0, 2435, 120809, 5621, 0, 4201, \r
+    3778, 4203, 4202, 4205, 4204, 120447, 3768, 68142, 765, 41440, 3764, \r
+    8473, 6373, 8469, 120438, 12947, 4564, 0, 0, 74271, 73753, 8374, 0, 0, \r
+    6829, 5225, 0, 0, 0, 0, 119615, 0, 74793, 5626, 73807, 11771, 0, 0, 0, 0, \r
+    5353, 5625, 74179, 0, 0, 1010, 64572, 41780, 42623, 64277, 0, 6952, 0, \r
+    120752, 78762, 2590, 5629, 65552, 7551, 10325, 5632, 10471, 120038, \r
+    120027, 120028, 120025, 5628, 120031, 970, 120029, 4772, 2400, 5627, \r
+    120017, 120018, 120023, 64275, 120021, 10961, 0, 203, 0, 0, 0, 0, 78350, \r
+    0, 64378, 42054, 0, 0, 554, 119649, 11358, 0, 12182, 42048, 11065, 0, \r
+    73891, 0, 0, 5694, 7689, 69798, 9323, 4325, 3047, 10317, 175, 0, 0, \r
+    69764, 0, 0, 1243, 42154, 5431, 6652, 0, 69770, 43651, 0, 68118, 0, 1129, \r
+    0, 0, 65900, 1986, 7846, 78804, 8661, 0, 65255, 0, 3845, 4490, 118969, \r
+    6649, 74400, 1456, 7530, 11977, 7249, 8366, 0, 7756, 12342, 0, 51, 41516, \r
+    0, 8570, 9568, 917863, 456, 7026, 8145, 1168, 9251, 9082, 0, 64055, \r
+    42781, 3866, 12323, 41512, 73805, 68121, 0, 41494, 0, 4660, 0, 10405, 0, \r
+    78803, 0, 0, 42040, 73918, 119627, 7944, 41454, 12605, 0, 42205, 41455, \r
+    236, 64051, 78867, 8214, 0, 0, 0, 41457, 0, 119589, 1969, 2384, 8097, \r
+    917864, 0, 0, 78029, 8766, 0, 78079, 5854, 0, 10583, 0, 119989, 0, 10416, \r
+    917869, 3872, 917868, 0, 8429, 0, 0, 2838, 917867, 0, 0, 0, 0, 0, 0, 0, \r
+    11096, 120813, 10553, 1662, 8483, 0, 43605, 5892, 43418, 0, 73742, 66, \r
+    65, 68, 67, 70, 69, 72, 71, 74, 73, 76, 75, 78, 77, 80, 79, 82, 81, 84, \r
+    83, 86, 85, 88, 87, 90, 89, 119862, 10357, 7385, 8170, 1704, 8556, 0, \r
+    9659, 0, 0, 0, 9556, 0, 4503, 11353, 9647, 0, 78185, 0, 0, 0, 78886, 0, \r
+    0, 74229, 66593, 6438, 0, 9109, 78882, 1289, 64599, 0, 0, 0, 65507, 2447, \r
+    0, 0, 0, 0, 0, 0, 6334, 0, 0, 19937, 0, 0, 0, 5675, 254, 0, 0, 0, 42425, \r
+    8918, 64003, 5716, 42312, 0, 0, 6972, 42826, 0, 42464, 120567, 0, 0, \r
+    74796, 64400, 64693, 0, 77861, 65429, 9515, 4435, 0, 42522, 0, 0, 11785, \r
+    0, 64671, 41978, 1412, 4594, 1391, 10536, 8067, 9901, 7775, 0, 0, 74588, \r
+    120748, 3140, 0, 7960, 43271, 0, 12518, 10909, 127508, 1428, 12472, 0, 0, \r
+    7699, 12393, 0, 0, 0, 74518, 8223, 0, 4261, 0, 0, 0, 0, 0, 0, 0, 0, \r
+    43419, 0, 64554, 10574, 3878, 0, 42352, 1752, 73785, 0, 42506, 0, 10199, \r
+    0, 0, 0, 65919, 0, 6695, 720, 324, 0, 0, 43406, 0, 1464, 40985, 0, 7974, \r
+    0, 43474, 0, 64488, 0, 0, 64041, 74787, 0, 78865, 0, 65597, 0, 78863, 0, \r
+    1302, 0, 78861, 0, 0, 0, 5204, 74774, 43404, 43396, 0, 3995, 68360, \r
+    65608, 3714, 0, 0, 0, 10999, 11750, 0, 43251, 68660, 43301, 0, 120557, \r
+    8130, 8672, 10845, 11964, 0, 0, 0, 0, 68455, 42863, 73839, 0, 0, 0, 0, 0, \r
+    0, 468, 612, 0, 64401, 66448, 68376, 0, 1674, 0, 5823, 0, 12280, 0, 540, \r
+    74564, 0, 0, 8432, 0, 11073, 0, 64316, 0, 0, 820, 41741, 0, 120667, 0, \r
+    64684, 126992, 3359, 7800, 0, 65177, 6226, 353, 12396, 0, 119612, 64742, \r
+    0, 120282, 0, 0, 12412, 19941, 0, 120277, 78847, 1884, 9481, 42418, 0, \r
+    41157, 0, 1195, 64898, 7924, 0, 41151, 2010, 0, 41328, 42344, 0, 12409, \r
+    0, 4360, 127009, 9739, 0, 74392, 73921, 0, 42521, 8539, 0, 0, 0, 0, 4788, \r
+    0, 0, 65734, 0, 64353, 0, 13075, 74429, 0, 64569, 43532, 10837, 2492, 0, \r
+    118901, 68637, 41136, 64351, 11813, 9649, 41154, 119617, 5128, 4038, \r
+    41143, 65604, 64859, 41592, 6771, 1648, 5435, 0, 6734, 41343, 119848, \r
+    65439, 12709, 6986, 119846, 0, 0, 41349, 0, 12581, 10374, 5175, 0, 73806, \r
+    10254, 0, 10278, 10262, 77950, 41346, 0, 607, 0, 0, 0, 12923, 10314, \r
+    10282, 65477, 10378, 120297, 40976, 8265, 0, 119834, 40975, 5840, 42838, \r
+    0, 40978, 0, 119840, 0, 0, 0, 66444, 10538, 0, 2550, 119836, 6779, 0, 0, \r
+    3525, 6824, 118886, 0, 0, 5619, 65822, 0, 194882, 7455, 0, 5616, 11486, \r
+    9656, 0, 0, 10727, 5615, 0, 120551, 42380, 64895, 43693, 66451, 808, \r
+    5455, 11347, 0, 1026, 5620, 194887, 0, 11350, 5617, 0, 9225, 64639, \r
+    127073, 9145, 0, 1338, 120581, 0, 12739, 4603, 3084, 0, 0, 9858, 6037, 0, \r
+    3974, 78213, 10290, 0, 3083, 10322, 0, 0, 0, 41036, 0, 0, 43321, 65606, \r
+    0, 41032, 42388, 0, 64700, 10011, 1445, 40961, 0, 194893, 0, 40960, 0, \r
+    194891, 0, 40963, 64952, 10402, 0, 0, 0, 10603, 0, 0, 0, 0, 6714, 10083, \r
+    127069, 194895, 78367, 0, 0, 0, 9073, 42585, 64302, 10704, 65030, 4787, \r
+    0, 74829, 0, 65423, 0, 0, 9570, 0, 9525, 2689, 917626, 65426, 0, 917624, \r
+    43740, 0, 40966, 917623, 13286, 3998, 42598, 42596, 503, 0, 8735, 2690, \r
+    66488, 42836, 194913, 41954, 917617, 1652, 772, 6688, 8310, 65428, 3487, \r
+    43416, 3585, 10194, 43320, 119159, 0, 194874, 6468, 41976, 9720, 917606, \r
+    11767, 41970, 0, 5836, 12358, 0, 4355, 9048, 12180, 65027, 64680, 65025, \r
+    43699, 0, 41488, 0, 8527, 194917, 12362, 12435, 12360, 41053, 3266, 0, \r
+    12356, 8616, 41466, 0, 0, 11450, 0, 3638, 12354, 0, 3216, 0, 2358, \r
+    119069, 8633, 0, 0, 119182, 69244, 0, 0, 11759, 0, 6368, 74823, 0, 41423, \r
+    8078, 10504, 0, 41698, 42237, 0, 7002, 0, 41430, 42267, 41051, 41484, 0, \r
+    0, 41050, 41473, 10466, 13099, 0, 0, 0, 6435, 0, 11362, 0, 0, 65382, 0, \r
+    41420, 0, 3625, 78157, 41409, 0, 0, 2041, 9178, 9672, 41427, 43541, \r
+    43317, 0, 0, 0, 41424, 917598, 120546, 0, 0, 0, 41417, 1261, 0, 0, 12102, \r
+    119662, 41401, 0, 0, 0, 0, 0, 42290, 3275, 0, 42329, 0, 0, 0, 0, 0, \r
+    120725, 10989, 74234, 0, 10598, 7410, 2669, 903, 0, 2920, 0, 127232, \r
+    74603, 64504, 19928, 0, 0, 3917, 0, 11732, 0, 0, 41448, 41461, 0, 0, \r
+    917558, 0, 8819, 12663, 0, 41184, 74014, 232, 74835, 120646, 9168, 65786, \r
+    0, 0, 0, 9094, 0, 11758, 68425, 0, 1064, 42467, 0, 10115, 19924, 0, 0, \r
+    7862, 64551, 13224, 8516, 41862, 66650, 7561, 78618, 69793, 1878, 0, 0, \r
+    2911, 0, 41178, 5427, 64823, 0, 0, 12617, 41174, 0, 41458, 0, 41463, \r
+    42413, 11292, 2406, 775, 0, 65584, 0, 6074, 9618, 194903, 0, 43440, 0, \r
+    194901, 41436, 3656, 0, 194899, 41456, 0, 1599, 11333, 0, 6703, 8513, 0, \r
+    1613, 0, 68456, 12598, 0, 0, 78745, 74500, 41460, 10145, 10542, 9937, \r
+    78746, 0, 9905, 0, 65730, 0, 120374, 8427, 120375, 55246, 120376, 0, \r
+    11497, 64687, 74008, 120371, 3871, 0, 0, 9111, 5741, 0, 194846, 120366, \r
+    119111, 120745, 0, 120368, 0, 11648, 0, 0, 120364, 41587, 120365, 0, \r
+    74322, 42113, 0, 0, 12172, 0, 74530, 65298, 65723, 194840, 73871, 65724, \r
+    7928, 120354, 0, 41595, 73730, 0, 42118, 73830, 66042, 10355, 0, 7875, 0, \r
+    41598, 3993, 0, 1545, 40971, 536, 0, 43029, 0, 0, 65173, 65286, 0, 0, 0, \r
+    0, 0, 0, 41375, 5402, 0, 0, 1687, 120503, 0, 0, 78194, 64326, 40969, \r
+    10526, 78753, 8323, 40968, 1339, 11731, 78756, 0, 65460, 12242, 0, 8020, \r
+    10843, 11554, 0, 0, 8266, 41006, 65722, 0, 10710, 0, 118942, 67667, \r
+    64567, 119155, 195091, 0, 119636, 67857, 120687, 0, 0, 11755, 66305, 0, \r
+    0, 10917, 120767, 0, 11272, 2040, 41247, 41326, 195060, 1741, 42370, \r
+    1227, 0, 0, 11413, 0, 0, 5283, 1586, 4978, 0, 1984, 0, 0, 120651, 40984, \r
+    0, 9373, 0, 12916, 6284, 0, 41663, 0, 0, 0, 9237, 9385, 41648, 0, 0, 0, \r
+    41666, 1830, 73783, 2056, 41287, 0, 0, 0, 42219, 0, 0, 41987, 41676, 0, \r
+    120823, 0, 41670, 0, 0, 2796, 55291, 11683, 9902, 74521, 0, 11451, 0, 0, \r
+    42631, 2359, 0, 67844, 74164, 41238, 548, 11405, 13133, 64368, 0, 0, 0, \r
+    397, 43622, 42139, 9547, 9590, 0, 1614, 43661, 64356, 66307, 6651, 1358, \r
+    0, 428, 9620, 1466, 78112, 10982, 118831, 1333, 0, 407, 6425, 0, 74253, \r
+    0, 0, 0, 5804, 11976, 8554, 0, 0, 0, 9057, 42294, 41218, 0, 0, 78137, \r
+    1883, 10952, 8048, 0, 41225, 0, 118955, 0, 0, 0, 4407, 0, 65809, 119074, \r
+    194821, 8448, 68122, 74183, 0, 12675, 12659, 0, 42363, 120624, 194824, \r
+    55273, 10766, 12012, 2386, 64732, 9170, 917821, 9123, 64585, 120500, 0, \r
+    43367, 42051, 0, 4164, 9081, 0, 120569, 42049, 42042, 8709, 0, 0, 120637, \r
+    42419, 0, 42047, 0, 0, 8470, 11807, 65897, 577, 0, 0, 74300, 0, 127308, \r
+    74840, 0, 0, 0, 0, 8736, 1414, 42643, 9683, 43486, 74344, 0, 2536, 0, \r
+    66330, 0, 0, 0, 0, 0, 0, 0, 66317, 917612, 66315, 2106, 0, 11273, 0, \r
+    43004, 7541, 0, 0, 961, 64307, 66324, 64906, 0, 3106, 65917, 41284, 1696, \r
+    0, 891, 12105, 0, 42624, 12802, 3264, 8824, 13268, 43003, 10936, 0, 0, 0, \r
+    0, 0, 0, 2322, 0, 0, 11449, 0, 42868, 41285, 3547, 0, 0, 0, 0, 43216, \r
+    6089, 78682, 0, 120578, 4170, 1029, 0, 127036, 119224, 42374, 0, 744, 0, \r
+    0, 0, 65823, 0, 0, 3551, 0, 0, 4623, 55268, 0, 4598, 0, 65136, 0, 0, 0, \r
+    10851, 0, 6179, 0, 6180, 0, 11952, 120778, 78648, 11972, 78646, 78647, \r
+    78644, 78645, 177, 78643, 6176, 120580, 0, 0, 6177, 9020, 78652, 78653, \r
+    6178, 120249, 120242, 0, 67673, 7518, 8754, 0, 120237, 74551, 43081, 0, \r
+    0, 9136, 120240, 4401, 41280, 0, 8974, 2308, 0, 74149, 0, 2318, 0, 66361, \r
+    8198, 0, 64360, 12601, 42536, 65266, 120827, 74307, 0, 6970, 5404, 43332, \r
+    3667, 7936, 12925, 126989, 6385, 0, 0, 118949, 10874, 65505, 0, 0, 42053, \r
+    2075, 42057, 11083, 42052, 0, 0, 67651, 0, 9665, 0, 0, 13181, 0, 0, 0, 0, \r
+    74148, 0, 0, 120225, 120229, 120224, 74172, 41145, 0, 0, 0, 41148, 8683, \r
+    7594, 127519, 0, 119090, 10869, 43458, 41146, 0, 11441, 0, 3512, 119633, \r
+    0, 8103, 0, 0, 65184, 11780, 41563, 42796, 0, 119106, 41544, 65146, 0, 0, \r
+    0, 0, 19942, 0, 118908, 7988, 10436, 74273, 3271, 73804, 64711, 0, 0, 0, \r
+    0, 3804, 13070, 11557, 42044, 0, 1095, 0, 3599, 0, 0, 0, 8514, 0, 0, 0, \r
+    74346, 66697, 0, 11684, 0, 0, 0, 0, 42043, 43232, 66677, 0, 42046, 78241, \r
+    4036, 0, 0, 0, 194861, 0, 11954, 0, 1450, 12986, 1340, 0, 65441, 0, 0, 0, \r
+    0, 0, 917542, 0, 0, 6539, 0, 0, 0, 194856, 0, 120492, 41190, 3973, \r
+    119365, 4575, 41193, 7982, 429, 0, 0, 0, 194854, 65792, 0, 118968, 6417, \r
+    118918, 78178, 0, 194850, 0, 0, 4919, 10590, 0, 7755, 0, 0, 64548, \r
+    120506, 1621, 10214, 65126, 0, 127004, 0, 12188, 0, 1617, 8050, 0, 5015, \r
+    0, 119174, 42590, 194871, 1756, 78181, 0, 65768, 6352, 41892, 0, 7555, \r
+    13103, 5408, 2817, 1214, 0, 0, 0, 0, 0, 0, 0, 7957, 8689, 64723, 1056, 0, \r
+    74147, 0, 0, 55286, 7073, 65850, 12327, 0, 119028, 0, 0, 0, 2341, 8450, \r
+    8484, 8474, 0, 0, 0, 8461, 0, 12153, 12799, 0, 43709, 43708, 9451, 7571, \r
+    13073, 0, 0, 681, 0, 703, 0, 3272, 8781, 12894, 0, 11709, 0, 74446, 0, 0, \r
+    0, 11338, 120768, 3276, 0, 0, 65928, 0, 0, 65021, 64795, 74574, 0, 10047, \r
+    78814, 3262, 78811, 42711, 0, 0, 68478, 163, 576, 9895, 1655, 78817, \r
+    74591, 78815, 78816, 0, 0, 0, 0, 10039, 0, 0, 5623, 5717, 5776, 0, 0, 0, \r
+    41591, 11036, 65252, 120488, 0, 0, 0, 0, 0, 0, 0, 8887, 0, 7295, 11031, \r
+    0, 43157, 0, 8946, 10348, 10412, 8755, 0, 0, 5718, 13221, 0, 0, 78135, 0, \r
+    0, 8810, 74499, 686, 0, 0, 4619, 118954, 6654, 73769, 74426, 0, 12040, \r
+    65689, 10128, 65118, 0, 119151, 118891, 0, 0, 2401, 68144, 8792, 0, 0, \r
+    65455, 0, 0, 0, 119129, 0, 12886, 0, 66624, 0, 43557, 10300, 10161, \r
+    10396, 74135, 0, 118945, 78118, 73851, 3010, 6441, 78122, 1458, 41475, 0, \r
+    0, 0, 11479, 0, 0, 6350, 12864, 0, 78114, 1061, 64780, 2001, 43111, \r
+    55230, 0, 4052, 0, 7626, 0, 0, 1045, 0, 5631, 41113, 0, 0, 43707, 74127, \r
+    0, 0, 8486, 0, 73758, 2335, 4362, 0, 0, 69221, 1025, 0, 42625, 0, 78084, \r
+    41443, 0, 0, 0, 1774, 1523, 0, 0, 41445, 78236, 0, 8567, 41442, 3988, 0, \r
+    78237, 118910, 0, 65274, 8564, 0, 78238, 127515, 0, 0, 43446, 0, 66513, \r
+    6256, 0, 579, 55218, 10206, 0, 6375, 2673, 0, 11814, 0, 4488, 0, 0, \r
+    68451, 10444, 118846, 0, 11799, 74407, 68466, 4487, 0, 42832, 1032, \r
+    120267, 43450, 78257, 7203, 0, 614, 78191, 0, 120615, 0, 78262, 0, 0, 0, \r
+    43121, 0, 0, 0, 1050, 7549, 0, 0, 9314, 0, 0, 120616, 0, 10057, 0, 0, 0, \r
+    66504, 0, 0, 2307, 0, 64333, 0, 0, 73873, 0, 0, 0, 0, 0, 0, 10360, 6746, \r
+    0, 0, 440, 0, 13085, 9233, 74216, 0, 0, 68612, 0, 66447, 8046, 64963, \r
+    65777, 10125, 74212, 42819, 10910, 0, 1521, 9896, 0, 10487, 0, 12527, 0, \r
+    7970, 0, 0, 0, 65769, 5243, 9849, 5239, 65771, 0, 0, 5237, 0, 0, 10103, \r
+    5247, 4769, 0, 118977, 12873, 5764, 0, 0, 3008, 4896, 0, 12087, 0, 55231, \r
+    41103, 0, 64565, 4773, 0, 0, 0, 4770, 0, 917567, 8731, 65378, 0, 120619, \r
+    9122, 0, 0, 4774, 3019, 9997, 12834, 0, 9456, 10215, 120547, 0, 0, 0, 0, \r
+    74776, 4281, 4768, 0, 41535, 4099, 9017, 0, 0, 78095, 0, 78096, 0, 0, 0, \r
+    78098, 0, 42814, 880, 0, 0, 0, 0, 0, 10116, 9877, 0, 0, 0, 7095, 0, 0, \r
+    6778, 0, 78090, 8243, 2427, 0, 7093, 0, 11585, 195003, 9962, 0, 12223, 0, \r
+    0, 1434, 0, 5637, 11573, 0, 0, 0, 19951, 0, 78121, 0, 0, 55283, 0, 0, \r
+    74437, 1156, 8740, 0, 3782, 64331, 0, 41370, 1014, 8261, 0, 0, 10835, 0, \r
+    65536, 0, 120463, 0, 7702, 118824, 0, 43010, 65779, 65783, 1150, 10547, \r
+    5700, 0, 120603, 65383, 2339, 42594, 5697, 118788, 0, 0, 0, 42257, 5696, \r
+    120470, 120465, 3862, 9643, 0, 0, 7634, 65167, 9845, 0, 0, 5701, 9722, \r
+    41490, 0, 1426, 68217, 0, 68447, 42204, 55270, 8571, 194991, 0, 0, 78818, \r
+    0, 43182, 12184, 0, 42022, 0, 10281, 0, 5650, 43194, 64712, 10744, 0, \r
+    990, 5647, 0, 7387, 78734, 41114, 11477, 5646, 12879, 11018, 0, 3945, 0, \r
+    0, 0, 0, 0, 78212, 0, 1020, 73763, 0, 78731, 5648, 64748, 194910, 0, \r
+    10205, 3545, 0, 6984, 0, 74051, 0, 43242, 120458, 2667, 0, 0, 0, 9911, 0, \r
+    65020, 10097, 119166, 0, 0, 118836, 0, 78427, 1140, 78426, 0, 10159, 0, \r
+    0, 8128, 0, 0, 917965, 1815, 19910, 890, 0, 3267, 0, 0, 10123, 0, 4410, \r
+    1041, 10576, 6354, 0, 580, 74232, 0, 0, 0, 0, 0, 19938, 65906, 0, 0, 0, \r
+    3298, 5375, 10142, 0, 8215, 0, 6134, 41246, 64402, 0, 0, 0, 0, 0, 41382, \r
+    0, 0, 5173, 65348, 527, 0, 0, 0, 0, 78797, 11915, 0, 0, 10072, 0, 42695, \r
+    2329, 42250, 0, 0, 0, 12245, 9939, 0, 0, 0, 0, 0, 74328, 119576, 74769, \r
+    0, 119087, 9069, 6144, 0, 0, 73822, 0, 0, 64917, 41521, 118934, 494, \r
+    13250, 0, 65098, 6364, 956, 0, 12830, 10462, 73740, 0, 0, 0, 0, 66449, \r
+    13263, 74281, 69217, 13171, 0, 0, 0, 0, 0, 1044, 41276, 0, 0, 0, 42068, \r
+    11795, 0, 0, 0, 0, 42450, 3907, 0, 64526, 0, 68197, 12295, 0, 11475, 0, \r
+    3020, 11537, 0, 66441, 0, 0, 0, 0, 1057, 566, 42696, 0, 3016, 42274, \r
+    43464, 66490, 12921, 66571, 78472, 0, 3006, 4620, 127237, 0, 0, 0, 64659, \r
+    0, 0, 55253, 6357, 6362, 8626, 0, 0, 9090, 65377, 41596, 0, 0, 1698, 0, \r
+    64477, 0, 0, 1053, 0, 78269, 0, 0, 1052, 1051, 459, 1060, 74349, 66479, \r
+    0, 0, 0, 0, 42490, 689, 6508, 4163, 42298, 8639, 66641, 4246, 0, 0, \r
+    12130, 0, 42337, 64596, 64375, 66481, 0, 0, 0, 6359, 0, 43471, 0, 0, 0, \r
+    127274, 0, 6358, 6361, 1926, 6356, 0, 7898, 8110, 10935, 0, 43633, 5830, \r
+    0, 43685, 0, 0, 0, 0, 8693, 78611, 119565, 0, 0, 0, 127257, 0, 0, 0, 0, \r
+    0, 0, 0, 119187, 11439, 78868, 0, 0, 78869, 42313, 5579, 0, 0, 0, 0, 0, \r
+    5578, 41774, 0, 42023, 6234, 5669, 0, 0, 0, 0, 127506, 68202, 5583, 0, 0, \r
+    42426, 5580, 42276, 2923, 892, 5582, 42465, 41330, 194987, 5795, 65512, \r
+    119006, 65702, 0, 120801, 65251, 0, 65710, 0, 0, 67672, 0, 5370, 0, \r
+    194986, 1638, 10966, 10188, 65878, 118848, 0, 0, 0, 0, 8172, 42017, 0, \r
+    10844, 0, 0, 0, 6374, 0, 0, 286, 78023, 1062, 0, 119999, 0, 7395, 0, \r
+    1070, 64900, 0, 6095, 41865, 0, 3015, 0, 917763, 5211, 0, 6400, 0, \r
+    194983, 0, 8189, 11276, 0, 0, 372, 0, 0, 118874, 42102, 41585, 0, 0, \r
+    42101, 276, 78402, 0, 33, 74226, 0, 9007, 118796, 41588, 66033, 427, \r
+    10763, 118819, 0, 0, 0, 1031, 6257, 0, 42104, 0, 0, 2328, 0, 1071, 0, 0, \r
+    74848, 0, 0, 0, 1047, 0, 0, 64790, 0, 0, 10651, 0, 0, 0, 0, 0, 119181, \r
+    5711, 41633, 12098, 65571, 9166, 0, 5710, 0, 6790, 65168, 13216, 0, 0, 0, \r
+    0, 64611, 41623, 195001, 5715, 0, 0, 0, 5712, 2761, 41620, 68124, 3074, \r
+    5722, 0, 8643, 73768, 0, 118906, 2757, 11067, 9718, 74498, 8910, 10689, \r
+    6479, 0, 0, 0, 78607, 0, 0, 0, 0, 0, 0, 118911, 0, 0, 0, 0, 0, 120010, 0, \r
+    8701, 68130, 119616, 120522, 0, 42477, 0, 12123, 4495, 43569, 0, 0, 0, \r
+    64946, 10992, 0, 120009, 0, 0, 9318, 120661, 13249, 65679, 73808, 0, \r
+    65457, 42249, 7639, 43995, 67845, 42641, 5454, 0, 0, 194997, 120005, 0, \r
+    0, 5084, 0, 0, 118861, 0, 733, 917876, 78014, 78436, 78435, 41677, 0, \r
+    9218, 1731, 0, 0, 0, 0, 0, 0, 0, 120001, 127018, 0, 5155, 0, 5358, 0, 0, \r
+    917767, 64424, 0, 3840, 64314, 41432, 0, 0, 68430, 119116, 43253, 65943, \r
+    0, 3371, 10988, 0, 8771, 1479, 0, 0, 1109, 11580, 0, 64601, 12205, 0, 0, \r
+    64507, 8868, 399, 0, 74842, 0, 0, 12149, 13088, 551, 0, 10156, 12119, 0, \r
+    0, 2544, 65074, 0, 0, 0, 78011, 351, 119149, 0, 0, 55229, 0, 74268, 0, 0, \r
+    0, 42377, 0, 0, 0, 0, 0, 9013, 4054, 0, 0, 0, 0, 73960, 5585, 65881, \r
+    2549, 74469, 0, 0, 5584, 8358, 0, 74411, 0, 10919, 0, 7980, 0, 0, 0, \r
+    41800, 5589, 0, 2664, 41613, 5586, 118890, 0, 11356, 0, 0, 43452, 78609, \r
+    0, 42573, 67856, 0, 78129, 0, 0, 0, 8135, 6450, 10055, 77996, 0, 0, 0, \r
+    5657, 0, 9626, 0, 77994, 10179, 5654, 12939, 0, 120799, 0, 0, 5652, \r
+    10945, 0, 66486, 0, 3661, 7863, 0, 0, 0, 74509, 0, 5659, 0, 0, 66729, \r
+    5655, 0, 42168, 0, 1055, 917628, 0, 66310, 74030, 0, 12146, 73955, 73956, \r
+    11618, 0, 126990, 0, 10272, 10304, 10368, 42518, 594, 10244, 10248, 7407, \r
+    0, 64870, 0, 3467, 0, 0, 3331, 946, 10231, 1495, 8131, 74330, 0, 9562, \r
+    69222, 65927, 0, 0, 120155, 69769, 64656, 0, 0, 194837, 0, 5666, 65227, \r
+    5318, 63994, 0, 9091, 10798, 0, 917979, 10186, 0, 7732, 0, 64556, 0, 0, \r
+    5668, 74445, 0, 0, 5670, 0, 0, 11820, 2992, 7826, 5667, 19952, 120807, 0, \r
+    12749, 0, 0, 0, 66496, 4361, 119260, 1306, 9286, 1497, 0, 0, 0, 0, 3571, \r
+    13247, 0, 7973, 66353, 68435, 78278, 67896, 43192, 0, 78265, 553, 120653, \r
+    0, 0, 5829, 0, 4587, 78285, 65912, 0, 12746, 0, 0, 119924, 5633, 119927, \r
+    0, 0, 0, 64905, 0, 9512, 0, 12742, 6443, 0, 0, 9135, 0, 41564, 0, 55219, \r
+    0, 0, 0, 12148, 0, 78297, 0, 64256, 0, 11669, 0, 5634, 4524, 0, 127270, \r
+    0, 118880, 2425, 65182, 0, 43636, 5221, 78410, 328, 0, 0, 69815, 5636, 0, \r
+    5329, 0, 5638, 119918, 7940, 64938, 43223, 0, 5635, 3373, 2986, 78292, \r
+    74223, 3437, 78291, 6203, 4247, 0, 11920, 8274, 0, 0, 1657, 41561, 78299, \r
+    78295, 5639, 2954, 5660, 5640, 78303, 0, 78300, 42227, 0, 0, 41637, \r
+    67872, 0, 78310, 41625, 43362, 78309, 120713, 11705, 5642, 0, 5486, 0, \r
+    4356, 11710, 0, 12051, 0, 0, 5641, 8259, 0, 1058, 0, 67630, 0, 0, 1144, \r
+    78750, 0, 42228, 0, 73890, 118972, 0, 65322, 0, 5645, 64964, 8652, 2547, \r
+    66484, 43634, 0, 5608, 65890, 0, 0, 67621, 119934, 9000, 0, 0, 0, 1865, \r
+    0, 5613, 74267, 0, 0, 5610, 0, 0, 65826, 2069, 0, 10787, 43999, 2997, 0, \r
+    5609, 78316, 65319, 78313, 12316, 65376, 2412, 0, 8186, 9807, 74269, 0, \r
+    13130, 65874, 0, 5807, 0, 10030, 5306, 12936, 0, 0, 11704, 0, 0, 10211, \r
+    0, 0, 0, 0, 11706, 9710, 0, 0, 0, 413, 65623, 74237, 0, 9133, 74262, 0, \r
+    1042, 0, 64779, 12171, 119240, 6185, 64776, 4984, 0, 708, 11391, 0, \r
+    12241, 0, 0, 1308, 0, 2534, 810, 0, 0, 0, 0, 0, 1917, 3000, 0, 0, 120739, \r
+    2364, 0, 74470, 66618, 65680, 0, 10027, 0, 0, 12337, 120722, 0, 0, 2980, \r
+    755, 69774, 931, 13124, 68182, 6363, 2748, 0, 0, 65041, 0, 44011, 8730, \r
+    0, 0, 78312, 7274, 119250, 0, 7275, 78304, 935, 0, 65840, 377, 42325, \r
+    11649, 0, 65253, 64301, 0, 78308, 42341, 65284, 2417, 0, 12884, 19912, \r
+    7907, 10768, 0, 194998, 0, 10673, 119217, 7248, 0, 0, 1781, 5496, 3627, \r
+    62, 1649, 0, 964, 0, 0, 78226, 0, 127512, 0, 0, 0, 0, 43689, 0, 13142, \r
+    78812, 42415, 66575, 4542, 74037, 43547, 0, 0, 7677, 2991, 4946, 42454, \r
+    0, 7949, 0, 0, 11341, 42494, 3073, 65625, 9714, 11692, 4657, 0, 0, 6478, \r
+    9898, 43673, 65237, 6241, 0, 4877, 0, 6238, 0, 10548, 127049, 4409, 0, 0, \r
+    64798, 0, 5346, 0, 120528, 6237, 4874, 0, 9176, 0, 0, 65231, 65884, \r
+    12678, 78748, 118912, 11378, 44018, 42785, 2408, 3251, 0, 0, 5685, 0, \r
+    2461, 11052, 7091, 5342, 8317, 0, 68163, 5340, 0, 0, 43635, 73928, \r
+    127529, 0, 0, 0, 0, 65482, 0, 9142, 0, 0, 0, 10938, 0, 118790, 1182, \r
+    2542, 4826, 0, 0, 0, 529, 8580, 0, 0, 10586, 10790, 10839, 66023, 41593, \r
+    41207, 0, 0, 41594, 225, 42828, 0, 0, 0, 11376, 74379, 10721, 67664, \r
+    3438, 42097, 127267, 11084, 3194, 41870, 266, 78305, 0, 41873, 120575, \r
+    11324, 0, 0, 8420, 64918, 0, 41871, 41338, 3734, 7734, 43683, 8750, \r
+    66605, 66011, 0, 40965, 0, 0, 5161, 10572, 0, 0, 0, 64349, 7287, 42162, \r
+    127552, 0, 0, 11948, 69220, 12359, 43429, 41369, 1697, 12191, 0, 68633, \r
+    7286, 0, 68635, 10031, 0, 9870, 68645, 8620, 65824, 0, 11938, 0, 7285, 0, \r
+    119577, 42678, 0, 43677, 41583, 0, 65799, 0, 0, 0, 0, 78169, 66199, 0, \r
+    3609, 68624, 0, 832, 120693, 120770, 78473, 66007, 78471, 65703, 0, 0, \r
+    42732, 5180, 0, 41395, 41530, 11691, 64773, 0, 74002, 0, 0, 0, 6348, 243, \r
+    13200, 0, 6024, 0, 9979, 10037, 41529, 10648, 8538, 43687, 0, 0, 4285, \r
+    66195, 0, 4230, 0, 13307, 43256, 0, 7563, 42376, 0, 68442, 120512, 0, 0, \r
+    214, 0, 0, 78466, 65893, 12208, 9973, 0, 66311, 65589, 0, 2603, 0, 0, 0, \r
+    0, 0, 6022, 0, 2884, 0, 11620, 0, 43, 0, 66453, 1016, 41107, 0, 41121, \r
+    3885, 92, 65456, 64608, 0, 74801, 0, 2074, 0, 78283, 0, 12453, 0, 0, \r
+    74241, 0, 6791, 12457, 78268, 0, 0, 0, 78279, 0, 0, 0, 66637, 7995, 8759, \r
+    43421, 78277, 12449, 0, 0, 0, 8752, 3197, 4720, 10165, 0, 119249, 0, \r
+    11595, 64893, 0, 43435, 0, 0, 4993, 0, 6168, 10934, 1946, 741, 0, 5494, \r
+    4639, 0, 1990, 66589, 4498, 78664, 119183, 0, 0, 0, 2960, 73779, 0, 8969, \r
+    0, 43424, 127059, 0, 2950, 0, 6210, 65753, 370, 0, 0, 0, 4953, 0, 0, 0, \r
+    0, 69230, 0, 0, 65688, 0, 5063, 3517, 2964, 43663, 917762, 6344, 74791, \r
+    10566, 10144, 66333, 8252, 729, 66016, 78253, 0, 0, 64923, 0, 43669, \r
+    9032, 78263, 78264, 0, 41215, 0, 65883, 0, 0, 120602, 3761, 0, 0, 0, 0, \r
+    12912, 119012, 3850, 0, 0, 0, 0, 0, 908, 0, 8611, 0, 0, 0, 43691, 41197, \r
+    0, 8978, 120540, 119135, 41586, 10527, 0, 917848, 3848, 78739, 194937, \r
+    127536, 65241, 5336, 0, 0, 663, 0, 10780, 0, 0, 78767, 0, 0, 68193, 347, \r
+    0, 0, 78775, 64675, 41582, 78774, 78744, 65579, 12980, 78769, 12143, \r
+    73733, 78512, 0, 43441, 41804, 78523, 0, 78525, 0, 0, 41584, 10681, 0, 0, \r
+    73938, 0, 0, 4800, 66661, 0, 66306, 64715, 78534, 9518, 6609, 10434, 0, \r
+    11319, 1097, 0, 917850, 41730, 0, 0, 73847, 78761, 65172, 41728, 41721, \r
+    0, 0, 0, 41203, 0, 13110, 41726, 0, 0, 1000, 0, 0, 41140, 1209, 73978, 0, \r
+    73750, 1073, 6321, 77878, 41138, 0, 68213, 0, 12167, 1115, 41605, 9794, \r
+    127062, 67671, 55248, 12237, 78787, 66314, 6587, 9290, 78782, 78783, \r
+    9231, 78781, 2959, 7926, 0, 0, 0, 64398, 0, 119970, 12311, 0, 78796, \r
+    78798, 78794, 78795, 68434, 78793, 66670, 0, 0, 12290, 0, 0, 0, 42142, \r
+    9968, 8205, 0, 5131, 0, 9627, 78536, 78542, 78535, 0, 1944, 1248, 10148, \r
+    0, 119990, 119991, 12701, 78376, 11308, 119995, 0, 119997, 119998, 65305, \r
+    74263, 4031, 42794, 120003, 7075, 8154, 120006, 120007, 41817, 73934, \r
+    42275, 120011, 120012, 78526, 120014, 120015, 6041, 0, 41899, 0, 8002, 0, \r
+    4364, 0, 0, 64332, 0, 7813, 9064, 119986, 10124, 7526, 8601, 7281, 78455, \r
+    7279, 12041, 1418, 10885, 12673, 0, 0, 9660, 0, 13012, 4571, 0, 0, 0, \r
+    12078, 2970, 0, 10933, 0, 77870, 0, 0, 0, 41599, 0, 0, 0, 12950, 0, 3486, \r
+    0, 0, 4239, 0, 0, 66511, 0, 2637, 64629, 8460, 127053, 8476, 0, 0, 0, 0, \r
+    65673, 1019, 78495, 4148, 0, 12289, 0, 4316, 0, 13119, 0, 5412, 66243, \r
+    9935, 0, 73864, 0, 41734, 8206, 74081, 9163, 3286, 9072, 5867, 13302, \r
+    7622, 0, 41736, 0, 41731, 0, 7400, 5416, 68663, 118924, 10817, 0, 41539, \r
+    0, 0, 73963, 41855, 41867, 65564, 11277, 65892, 11536, 10620, 0, 12210, \r
+    66030, 73932, 5498, 73942, 41536, 0, 68204, 0, 3459, 8997, 0, 0, 0, 0, 0, \r
+    0, 66377, 69781, 0, 0, 78511, 3161, 295, 120207, 0, 0, 0, 78742, 9016, \r
+    43454, 63903, 63902, 43641, 0, 3971, 0, 73972, 2952, 78765, 11038, 10901, \r
+    63900, 63899, 63898, 0, 667, 12332, 63887, 6086, 41722, 0, 5172, 0, 0, \r
+    4159, 0, 0, 9815, 63884, 19934, 63882, 41198, 8555, 63878, 63877, 42460, \r
+    6050, 42708, 63881, 63872, 0, 42421, 0, 41723, 63875, 63874, 11460, 7432, \r
+    1913, 41913, 63852, 0, 0, 42348, 0, 6752, 446, 41911, 0, 63851, 63850, \r
+    41910, 0, 63846, 2972, 12932, 7262, 0, 63849, 63848, 63847, 0, 6570, \r
+    8302, 7259, 63842, 4178, 10746, 7250, 13214, 10041, 8105, 63892, 0, \r
+    118983, 1105, 4180, 0, 12094, 9497, 0, 63891, 63890, 63889, 63888, 5538, \r
+    9987, 0, 118932, 1678, 13274, 552, 120654, 44010, 10785, 0, 119170, 4557, \r
+    74459, 9159, 10171, 13125, 63860, 5540, 63858, 63865, 281, 13242, 63862, \r
+    74154, 0, 5536, 65568, 63857, 1388, 74169, 0, 1077, 0, 65099, 11531, \r
+    5834, 0, 0, 0, 0, 42773, 0, 0, 0, 119220, 0, 3663, 0, 1112, 119122, 8686, \r
+    0, 5334, 65081, 43249, 74778, 0, 11077, 0, 6509, 0, 5327, 0, 19907, \r
+    63869, 3478, 7583, 7679, 2903, 0, 3001, 1158, 8745, 0, 73748, 63866, 0, \r
+    1915, 4846, 0, 66371, 118984, 42105, 2990, 120128, 805, 69238, 120125, \r
+    12070, 8760, 1117, 118987, 12212, 120123, 65174, 42357, 63835, 63834, 0, \r
+    78240, 12225, 63838, 63837, 0, 0, 63833, 6042, 66360, 8083, 0, 0, 63821, \r
+    63820, 63819, 63818, 0, 5227, 9047, 63822, 0, 6091, 0, 10691, 560, 5643, \r
+    8226, 119578, 63812, 63811, 63810, 63809, 5542, 63815, 63814, 63813, \r
+    6047, 1597, 120143, 780, 206, 77925, 4936, 65147, 8168, 63930, 2076, \r
+    1093, 9882, 63934, 2082, 63932, 917554, 63929, 3546, 1605, 77934, 9806, \r
+    43472, 77933, 8400, 11343, 2086, 0, 63926, 2984, 5968, 9287, 0, 4618, \r
+    42209, 43431, 13169, 5290, 2089, 1695, 10743, 1088, 63825, 7268, 1084, \r
+    1085, 63829, 1083, 10131, 7283, 0, 63970, 0, 1092, 4754, 7273, 5252, \r
+    44016, 43627, 0, 0, 7408, 11809, 0, 0, 0, 2965, 7258, 8808, 0, 1089, \r
+    4187, 63937, 42119, 42120, 0, 940, 5787, 10099, 63938, 0, 74494, 12463, \r
+    2994, 0, 118827, 0, 9664, 77939, 77940, 67892, 77938, 74343, 0, 0, 660, \r
+    10127, 666, 9022, 5532, 43667, 5533, 77941, 78507, 6118, 222, 979, 3884, \r
+    0, 74151, 120445, 6502, 0, 127118, 0, 63951, 12465, 0, 0, 0, 63946, 1707, \r
+    63924, 12461, 63950, 63897, 63948, 63947, 63945, 6038, 63943, 63942, \r
+    64685, 63895, 65838, 0, 7776, 0, 0, 0, 120444, 78172, 801, 43165, 1690, \r
+    63919, 63918, 63917, 13277, 43659, 12951, 120638, 9906, 2054, 2334, \r
+    78515, 63916, 5483, 63914, 120610, 63911, 5484, 63909, 63908, 2539, 0, \r
+    43980, 5485, 0, 42697, 9061, 5534, 10672, 4502, 0, 253, 0, 68208, 0, \r
+    42854, 78393, 0, 11530, 0, 68668, 0, 0, 0, 10474, 43426, 13257, 42354, 0, \r
+    0, 0, 195065, 0, 8413, 0, 0, 5693, 7272, 0, 13209, 64470, 65831, 78460, \r
+    195063, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66608, 3111, 41863, 8804, 66607, 0, \r
+    7270, 0, 66606, 6628, 1076, 7433, 1436, 73844, 55226, 0, 63982, 7393, \r
+    12807, 43413, 63906, 1598, 63904, 0, 0, 41729, 4423, 1307, 0, 10515, \r
+    41589, 0, 0, 6218, 0, 1430, 0, 0, 120606, 78754, 5413, 7619, 3255, 3493, \r
+    74032, 11549, 10735, 41743, 73937, 6801, 0, 4518, 10990, 65073, 5167, \r
+    4481, 3771, 0, 2710, 0, 69243, 41724, 0, 43073, 41690, 12479, 0, 0, 0, 0, \r
+    119659, 1628, 0, 0, 0, 65262, 6333, 10783, 42315, 0, 63855, 120683, 0, 0, \r
+    5339, 74323, 0, 13004, 0, 4457, 0, 0, 0, 0, 5684, 8678, 10914, 0, 5689, \r
+    65807, 0, 68464, 12633, 12870, 78521, 65183, 5688, 11926, 6033, 6310, \r
+    5686, 0, 74251, 0, 120647, 0, 50, 10558, 9871, 0, 43655, 0, 0, 0, 66468, \r
+    0, 13259, 4448, 0, 0, 0, 0, 67853, 0, 10640, 0, 1151, 0, 917607, 0, \r
+    127079, 195050, 0, 0, 0, 0, 12501, 64604, 0, 11527, 118870, 8812, 0, \r
+    11538, 8673, 12650, 11020, 0, 66467, 2105, 8087, 78163, 0, 9894, 0, 0, 0, \r
+    4636, 55262, 78513, 4515, 2382, 0, 127055, 0, 120495, 0, 0, 12277, \r
+    194627, 11995, 194626, 0, 12158, 0, 8741, 10197, 0, 0, 0, 6531, 0, 0, \r
+    473, 43415, 0, 0, 1873, 1087, 0, 0, 0, 78527, 66439, 43218, 0, 194716, \r
+    7237, 12504, 74282, 0, 0, 0, 9489, 0, 0, 4384, 74220, 195055, 2058, \r
+    917561, 13295, 43191, 0, 0, 1154, 3857, 1205, 0, 0, 13100, 12958, 120706, \r
+    74168, 0, 0, 4421, 10592, 0, 495, 0, 41712, 7983, 0, 120779, 0, 6347, 0, \r
+    7654, 41710, 4196, 0, 437, 41709, 73772, 0, 0, 9465, 13290, 119180, 4997, \r
+    64306, 0, 0, 4999, 194642, 0, 0, 4711, 120769, 0, 2739, 0, 8044, 74834, \r
+    0, 41789, 0, 10809, 0, 0, 0, 1779, 6600, 6601, 41543, 5325, 642, 64187, \r
+    13058, 120449, 12875, 0, 0, 13229, 0, 10575, 43399, 0, 0, 41791, 1104, 0, \r
+    0, 10655, 0, 0, 0, 0, 1082, 195049, 8428, 6569, 0, 0, 0, 0, 6783, 0, \r
+    12993, 8049, 41548, 44021, 6458, 0, 0, 4761, 63828, 4766, 64623, 1273, \r
+    43407, 0, 118876, 195045, 6912, 1313, 6322, 10483, 0, 41545, 0, 0, 0, 0, \r
+    0, 0, 78624, 3484, 74337, 0, 0, 8503, 5122, 41527, 0, 66320, 0, 0, 0, 0, \r
+    41537, 0, 8303, 8282, 11817, 73857, 10003, 73859, 65904, 194663, 1686, 0, \r
+    78406, 11467, 3664, 65921, 64299, 194664, 0, 0, 4324, 126, 42246, 119152, \r
+    0, 74378, 65926, 7744, 194636, 74277, 74302, 78052, 0, 6966, 0, 8136, 0, \r
+    65600, 1633, 0, 0, 4762, 1103, 0, 0, 4765, 0, 13078, 0, 4760, 63827, \r
+    2050, 10871, 43199, 1102, 0, 42236, 0, 194667, 11546, 74794, 337, 0, \r
+    42591, 8627, 12279, 1111, 0, 0, 4707, 68206, 10143, 7883, 127081, 7880, \r
+    4522, 8645, 5704, 13010, 0, 8304, 0, 0, 119575, 0, 0, 66654, 0, 0, 0, \r
+    13008, 0, 4385, 0, 13011, 0, 0, 119161, 13009, 160, 2677, 0, 0, 41793, \r
+    65763, 74221, 120141, 41792, 42770, 0, 65762, 118829, 64573, 5709, 0, \r
+    194638, 0, 0, 0, 1079, 3867, 5708, 0, 0, 0, 5706, 64768, 5705, 8791, \r
+    4005, 0, 10237, 10991, 0, 43459, 9173, 917581, 917580, 13170, 65942, \r
+    917577, 42605, 120765, 917570, 68647, 917572, 10058, 0, 74867, 194654, \r
+    127078, 3339, 11448, 1106, 917591, 917590, 917593, 3340, 917587, 917586, \r
+    917589, 917588, 120541, 10605, 1309, 63966, 120743, 1754, 127075, 13246, \r
+    864, 0, 118926, 8972, 0, 7849, 120092, 0, 13240, 195068, 5192, 4338, 0, \r
+    10948, 917601, 13199, 120169, 1236, 13208, 13261, 13189, 13188, 120164, \r
+    0, 7440, 0, 120153, 9553, 1590, 63777, 63776, 13178, 63782, 63781, 63780, \r
+    63779, 1583, 0, 13260, 4550, 0, 64205, 0, 0, 41522, 0, 0, 0, 0, 11354, 0, \r
+    0, 42795, 0, 119195, 11394, 194646, 13236, 13272, 13194, 1334, 0, 4479, \r
+    1178, 65586, 120663, 66681, 119193, 4601, 0, 0, 0, 0, 0, 194658, 0, 6809, \r
+    63786, 6031, 0, 63791, 63790, 1145, 63788, 7910, 63785, 43153, 754, \r
+    10192, 13105, 8183, 120741, 2037, 0, 0, 10747, 125, 0, 64890, 0, 0, 0, \r
+    41719, 63758, 3523, 1074, 13258, 9536, 74077, 0, 4427, 74242, 63757, \r
+    43145, 12217, 63754, 41532, 1349, 63750, 63749, 0, 0, 0, 63753, 63802, \r
+    41084, 120622, 68133, 41930, 63805, 63804, 43632, 63801, 41082, 8140, \r
+    63798, 6260, 0, 0, 119225, 63793, 11988, 3898, 0, 10201, 12238, 63795, \r
+    42194, 10367, 12521, 10431, 42114, 41932, 1068, 0, 12523, 12945, 0, \r
+    42203, 7950, 10804, 63771, 42787, 4386, 12224, 6973, 2793, 12475, 0, 0, \r
+    63769, 9530, 0, 12232, 13135, 8596, 5681, 63762, 4595, 63760, 792, 0, \r
+    64803, 0, 8742, 0, 11053, 0, 63744, 0, 0, 7588, 63748, 1693, 63746, \r
+    43204, 5055, 68426, 917853, 1090, 120679, 0, 11665, 74133, 4558, 65685, \r
+    9523, 0, 0, 78681, 11513, 0, 6157, 63775, 63774, 63773, 13191, 12170, \r
+    3500, 3139, 0, 3170, 12485, 0, 10872, 78271, 13006, 64433, 0, 0, 941, 0, \r
+    0, 0, 65541, 11063, 0, 8228, 0, 42065, 0, 0, 0, 0, 0, 7386, 0, 68358, 0, \r
+    0, 43603, 0, 65397, 288, 0, 0, 0, 10025, 917916, 2918, 0, 65300, 119871, \r
+    9883, 64726, 2790, 65395, 3793, 0, 0, 65393, 0, 74138, 0, 0, 0, 74139, \r
+    120613, 65394, 11548, 5270, 0, 65396, 0, 65813, 13256, 1282, 120771, 0, \r
+    0, 10888, 0, 65242, 0, 3330, 0, 0, 0, 0, 0, 74259, 3304, 42753, 0, 0, 0, \r
+    1627, 0, 0, 0, 5371, 13116, 0, 1826, 118794, 0, 43094, 0, 43650, 0, 0, \r
+    9035, 0, 0, 0, 0, 0, 68125, 0, 164, 0, 0, 0, 6958, 0, 43116, 0, 0, 13245, \r
+    0, 0, 127376, 0, 73893, 0, 12666, 13175, 13207, 120414, 66014, 120428, \r
+    7447, 5929, 0, 65509, 0, 7449, 11306, 0, 73920, 3180, 0, 63808, 9054, \r
+    971, 13062, 0, 0, 65195, 10164, 0, 74428, 0, 78146, 0, 0, 0, 0, 10045, \r
+    12882, 13275, 0, 11057, 0, 13276, 0, 41525, 78150, 7271, 11444, 0, 0, 0, \r
+    12229, 41523, 0, 43411, 73751, 0, 64813, 0, 0, 10476, 3858, 0, 3932, \r
+    64958, 0, 0, 73989, 68192, 0, 0, 369, 0, 41784, 0, 64163, 0, 0, 0, 65474, \r
+    4796, 12292, 0, 65479, 0, 41781, 10486, 41480, 120511, 9899, 0, 0, 404, \r
+    12821, 3741, 0, 5788, 8092, 68212, 41222, 1831, 66020, 0, 0, 4388, 0, \r
+    746, 120784, 0, 0, 12018, 65294, 0, 0, 0, 0, 4422, 4708, 3799, 74292, \r
+    119357, 0, 74430, 0, 11700, 4374, 0, 0, 1364, 0, 8038, 0, 917597, 12868, \r
+    69814, 0, 6735, 73979, 13174, 73968, 13225, 0, 69808, 65835, 0, 2365, \r
+    7841, 0, 42855, 118856, 42866, 0, 0, 0, 66438, 41785, 41171, 64172, \r
+    13173, 4372, 119354, 0, 0, 0, 0, 0, 0, 12965, 384, 64512, 10404, 10340, \r
+    119352, 1556, 5274, 13210, 0, 10017, 9733, 41787, 0, 126994, 41373, \r
+    78039, 12303, 0, 13232, 13233, 349, 4863, 41371, 11656, 0, 120703, \r
+    119883, 12861, 4398, 8543, 65618, 0, 1096, 0, 0, 42688, 12441, 12355, \r
+    119348, 119347, 4318, 10452, 0, 8032, 13243, 13237, 12719, 0, 119101, 0, \r
+    64884, 119872, 119345, 8597, 0, 0, 9864, 0, 120785, 119874, 0, 13195, \r
+    41452, 64961, 7722, 0, 10459, 119878, 0, 119879, 66590, 0, 41533, 66337, \r
+    0, 0, 0, 4965, 0, 917536, 73849, 0, 43638, 78537, 0, 6261, 119342, 43147, \r
+    66570, 1957, 10420, 982, 2756, 13292, 13206, 0, 0, 2925, 73809, 13056, \r
+    127559, 13212, 43238, 0, 13190, 13187, 0, 13198, 118793, 0, 5242, 119179, \r
+    64476, 1694, 8216, 0, 6770, 43331, 0, 65620, 0, 43544, 0, 0, 41444, \r
+    65621, 120325, 64799, 5246, 120326, 13185, 9709, 120323, 120322, 12314, \r
+    65616, 5238, 119333, 0, 119337, 5236, 40979, 0, 74201, 8286, 0, 3936, \r
+    119331, 11699, 41347, 127249, 13235, 8842, 41248, 0, 4379, 13239, 12692, \r
+    7969, 127266, 7219, 127250, 0, 120509, 0, 66224, 734, 2979, 120303, \r
+    65619, 9872, 957, 64921, 1846, 66631, 41477, 119256, 120310, 74511, \r
+    41770, 1670, 6442, 120317, 42446, 5379, 120318, 41163, 74832, 120315, \r
+    120314, 0, 0, 42841, 13267, 0, 0, 41775, 0, 0, 41773, 0, 10663, 0, 0, 0, \r
+    6151, 12110, 42673, 65572, 119602, 65250, 13265, 13264, 64518, 0, 6100, \r
+    0, 0, 5808, 65922, 0, 12967, 66041, 5612, 4583, 0, 0, 68097, 64575, 0, \r
+    11965, 0, 119211, 0, 69789, 0, 0, 68102, 9698, 7814, 74476, 119651, 0, 0, \r
+    41921, 118858, 9756, 6985, 119258, 0, 74219, 0, 0, 118997, 8012, 5674, \r
+    12353, 0, 12361, 5677, 5588, 0, 41925, 0, 41920, 5673, 120534, 5676, \r
+    41923, 12694, 118978, 5672, 1294, 0, 78059, 0, 42511, 1727, 0, 42436, 0, \r
+    0, 0, 74222, 8718, 3550, 736, 10268, 4505, 10316, 74090, 5826, 55232, \r
+    5813, 0, 120712, 5841, 5837, 55234, 0, 3105, 12829, 5838, 5796, 0, \r
+    119592, 5793, 0, 5866, 5797, 41011, 5865, 120091, 7956, 598, 0, 64649, \r
+    5806, 42398, 0, 9037, 5671, 120041, 0, 0, 0, 0, 0, 847, 0, 9529, 0, \r
+    66657, 6980, 0, 120035, 78484, 0, 0, 120033, 78486, 0, 0, 120039, 42683, \r
+    0, 0, 9624, 0, 0, 43190, 65463, 1554, 0, 42611, 42563, 0, 5651, 2929, \r
+    6792, 43201, 0, 19963, 5698, 0, 0, 0, 0, 5644, 10292, 65546, 69821, \r
+    68141, 8372, 0, 65116, 0, 120022, 0, 10388, 42799, 0, 41013, 10568, 0, 0, \r
+    2869, 0, 41015, 194692, 2785, 4366, 0, 10954, 41802, 0, 42608, 78469, \r
+    9884, 4759, 0, 0, 10266, 41359, 1170, 43365, 69810, 73908, 1609, 902, 0, \r
+    63936, 0, 11661, 8122, 5818, 0, 0, 3861, 9540, 11028, 2554, 5158, 5714, \r
+    127015, 0, 0, 807, 43079, 0, 78475, 976, 5511, 64553, 0, 42155, 0, 41356, \r
+    74110, 118801, 0, 0, 8676, 0, 0, 11066, 451, 63941, 5798, 9349, 42018, 0, \r
+    0, 0, 43609, 194703, 120553, 1440, 0, 194701, 120016, 74283, 11005, 0, \r
+    66656, 66044, 0, 194698, 0, 0, 43393, 10094, 0, 11529, 10857, 120643, \r
+    66436, 6546, 93, 8102, 0, 68405, 0, 0, 8171, 0, 119097, 127064, 917543, \r
+    383, 10377, 41656, 0, 0, 0, 5187, 0, 127277, 11286, 68620, 64217, 0, \r
+    5232, 0, 41009, 0, 41005, 0, 0, 0, 8292, 195074, 4980, 8860, 73947, \r
+    10028, 66478, 7076, 13182, 194705, 0, 0, 10631, 66031, 7972, 0, 78785, 0, \r
+    7900, 0, 11309, 78319, 4198, 42725, 0, 67656, 78819, 0, 0, 0, 12931, 0, \r
+    42684, 74285, 2088, 0, 64366, 65156, 8814, 42238, 74771, 0, 0, 12836, 0, \r
+    0, 74342, 8593, 0, 0, 68445, 13255, 0, 0, 7464, 0, 65865, 0, 194650, 0, \r
+    0, 9342, 120464, 0, 64516, 0, 78792, 10129, 41007, 74375, 0, 40995, \r
+    12209, 41012, 119136, 0, 0, 120633, 40992, 0, 0, 68653, 43558, 5522, 0, \r
+    61, 0, 74105, 3633, 0, 65162, 41234, 12089, 78281, 9771, 0, 13251, 0, 0, \r
+    6262, 2784, 42743, 0, 8126, 66483, 0, 0, 441, 42621, 0, 0, 41002, 40999, \r
+    119623, 43266, 0, 0, 10890, 74481, 65834, 8324, 119103, 64417, 74817, 0, \r
+    64737, 0, 0, 8930, 66678, 74249, 1193, 10056, 1800, 13253, 13252, 7829, \r
+    0, 0, 7743, 0, 0, 77904, 0, 77905, 9034, 6039, 0, 10075, 0, 41018, 65683, \r
+    10338, 66469, 0, 0, 0, 42815, 0, 41966, 0, 0, 0, 11792, 43064, 41025, \r
+    911, 7539, 0, 0, 120339, 65159, 64390, 0, 0, 5520, 11662, 0, 65330, \r
+    42812, 0, 0, 12326, 0, 0, 42808, 0, 9348, 64901, 0, 0, 0, 0, 0, 0, \r
+    917584, 43702, 0, 5857, 65342, 0, 119120, 120079, 8644, 0, 0, 0, 74296, \r
+    41909, 0, 120332, 2791, 0, 1891, 69824, 0, 41907, 66647, 0, 8761, 12942, \r
+    5748, 0, 10773, 0, 0, 8796, 78149, 6412, 2061, 8520, 13146, 0, 63931, 0, \r
+    65902, 2882, 0, 0, 12843, 4520, 120345, 0, 0, 0, 0, 73860, 0, 0, 64345, \r
+    0, 0, 0, 194940, 0, 0, 43679, 917585, 65117, 194939, 0, 10427, 0, 3844, \r
+    0, 9755, 1110, 6612, 12222, 0, 194934, 0, 0, 783, 194935, 0, 0, 0, \r
+    194720, 65056, 3620, 0, 68378, 4556, 0, 0, 194933, 74250, 0, 67657, \r
+    10510, 4382, 66482, 0, 0, 0, 9177, 8902, 0, 9839, 0, 12891, 0, 0, 63999, \r
+    2016, 41917, 9788, 63928, 0, 1862, 65800, 9155, 66623, 9786, 65082, \r
+    41919, 8579, 41914, 7981, 0, 0, 4508, 64883, 0, 0, 0, 0, 64592, 74276, \r
+    120080, 6784, 78788, 68181, 0, 0, 0, 127534, 12147, 9024, 66378, 66472, \r
+    0, 64289, 65289, 78151, 66658, 194929, 64509, 78152, 0, 0, 11051, 0, 0, \r
+    11355, 65885, 0, 0, 41214, 0, 12299, 0, 7500, 4506, 7773, 0, 0, 9963, \r
+    68649, 0, 4040, 0, 6167, 0, 63922, 6594, 0, 0, 0, 3624, 43036, 0, 6387, \r
+    63990, 19947, 63988, 41955, 0, 63993, 10440, 9611, 0, 6803, 0, 7738, \r
+    63986, 11446, 63984, 120331, 3435, 78164, 0, 119108, 7029, 64258, 41292, \r
+    118898, 12748, 42742, 9517, 11518, 0, 78790, 0, 194777, 63956, 42458, \r
+    63954, 63953, 63960, 9591, 4516, 10217, 68370, 11469, 0, 42306, 2723, \r
+    118947, 0, 0, 0, 0, 0, 11397, 2880, 0, 0, 2872, 0, 0, 3498, 4378, 917539, \r
+    4270, 0, 65551, 68205, 6633, 43387, 0, 5230, 0, 0, 0, 0, 0, 8161, 393, \r
+    12013, 0, 0, 0, 415, 63964, 63963, 42345, 0, 5183, 1877, 42498, 0, 2927, \r
+    0, 63961, 4472, 0, 0, 78159, 0, 917936, 42340, 4756, 0, 7081, 10730, \r
+    7691, 10331, 63830, 119625, 194945, 42103, 8628, 9813, 0, 42453, 1604, \r
+    9565, 10539, 0, 65764, 41415, 65767, 0, 8457, 42301, 11372, 64873, 11992, \r
+    0, 0, 63980, 11801, 3622, 0, 64336, 12017, 10463, 63981, 4967, 64189, \r
+    1966, 43628, 0, 0, 0, 0, 63971, 4347, 4416, 42098, 11009, 10694, 63973, \r
+    402, 0, 13147, 0, 42100, 64646, 13228, 0, 41875, 3515, 74252, 11805, 0, \r
+    11302, 6259, 43395, 0, 0, 194670, 0, 0, 0, 74425, 11299, 1561, 0, 0, \r
+    64942, 0, 194733, 0, 194732, 0, 74301, 0, 11280, 0, 69784, 74060, 0, 0, \r
+    119664, 5145, 12486, 65018, 66516, 5409, 0, 194669, 7402, 5399, 9685, \r
+    74089, 7952, 5401, 0, 66616, 68421, 0, 0, 5405, 917555, 64866, 0, 0, 0, \r
+    78784, 74248, 11330, 194723, 64690, 3254, 0, 0, 0, 42390, 43678, 194725, \r
+    0, 65077, 0, 6388, 3355, 9508, 9867, 5723, 11520, 5611, 0, 3377, 0, 0, 0, \r
+    0, 78228, 0, 0, 42691, 917886, 0, 74767, 0, 0, 1379, 246, 0, 0, 3788, 0, \r
+    11041, 0, 66304, 0, 0, 8917, 42403, 301, 0, 0, 0, 0, 0, 0, 10656, 0, \r
+    65214, 119242, 42567, 0, 13163, 0, 120831, 74597, 3182, 0, 0, 0, 65034, \r
+    65889, 42169, 4755, 74244, 0, 11443, 0, 66319, 74598, 608, 600, 0, 1219, \r
+    3934, 64206, 11483, 74510, 0, 74485, 42442, 65470, 0, 64202, 13160, 7759, \r
+    42482, 485, 0, 0, 9828, 0, 0, 42280, 0, 9351, 7778, 64379, 7496, 42431, \r
+    6916, 1208, 0, 119631, 11002, 42470, 0, 118946, 0, 0, 74041, 0, 0, 43539, \r
+    5411, 42196, 0, 0, 0, 9150, 0, 42393, 13086, 1310, 194687, 9337, 12052, \r
+    10643, 55271, 0, 194684, 2546, 194683, 213, 118852, 65611, 0, 0, 194756, \r
+    74310, 6554, 0, 11914, 0, 0, 0, 0, 0, 0, 194681, 118826, 2713, 0, 9650, \r
+    43330, 0, 194675, 1406, 0, 0, 0, 0, 68223, 4143, 194677, 0, 65748, 4141, \r
+    9682, 65287, 1508, 194963, 8779, 10569, 8725, 13299, 66638, 65750, 42263, \r
+    4145, 6380, 65751, 66613, 43994, 65738, 55250, 9185, 9550, 0, 43403, 0, \r
+    0, 0, 65736, 41951, 64816, 65756, 0, 12955, 10596, 2888, 0, 0, 0, 9657, \r
+    9019, 194766, 0, 2878, 5390, 0, 194961, 0, 68679, 0, 7501, 6328, 0, \r
+    10429, 10365, 0, 0, 41946, 7503, 5235, 803, 68381, 0, 0, 8986, 0, 10632, \r
+    11934, 11452, 1332, 0, 0, 0, 0, 118887, 1791, 5191, 9288, 64822, 2892, 0, \r
+    43394, 555, 0, 0, 66646, 0, 119002, 13151, 74512, 7289, 74055, 0, 8854, \r
+    64162, 5858, 41927, 10582, 0, 1784, 1361, 195047, 0, 7905, 0, 64868, 0, \r
+    13158, 0, 7211, 0, 9371, 73973, 0, 6828, 1625, 0, 0, 1342, 68440, 64171, \r
+    0, 10903, 0, 0, 0, 0, 0, 4482, 41606, 0, 0, 0, 0, 64381, 0, 0, 0, 42245, \r
+    0, 41972, 0, 444, 0, 9127, 66687, 66619, 0, 78025, 0, 11349, 40991, 0, 0, \r
+    119599, 120830, 0, 1197, 0, 1149, 194970, 0, 0, 40990, 0, 0, 3492, 0, 0, \r
+    0, 0, 0, 12838, 0, 19948, 0, 3099, 0, 0, 41087, 0, 0, 0, 119059, 12036, \r
+    0, 0, 0, 8152, 0, 64428, 12227, 0, 0, 12828, 127511, 0, 0, 120708, 0, 0, \r
+    10386, 119574, 0, 0, 0, 0, 68154, 0, 1743, 0, 0, 0, 65186, 0, 0, 9606, 0, \r
+    0, 0, 0, 0, 0, 0, 0, 194967, 0, 0, 3395, 9362, 10878, 0, 0, 78362, 64830, \r
+    0, 0, 41091, 3426, 1344, 8870, 0, 0, 4735, 0, 6119, 12822, 42699, 0, 0, \r
+    74818, 0, 0, 42637, 41080, 0, 12039, 10559, 0, 118892, 0, 9472, 0, 11929, \r
+    0, 7170, 9596, 6130, 0, 43629, 11579, 194741, 0, 194740, 0, 0, 66699, 0, \r
+    1004, 0, 194737, 43234, 66008, 12627, 0, 68414, 0, 43619, 43382, 11300, \r
+    43304, 9686, 5890, 11776, 7558, 0, 65627, 0, 10718, 13154, 3461, 9139, 0, \r
+    0, 0, 0, 65365, 73877, 65628, 78019, 0, 0, 41708, 12860, 41703, 12069, \r
+    10838, 5403, 10352, 73917, 10061, 43237, 0, 5140, 209, 0, 41704, 41056, \r
+    43078, 0, 0, 0, 10899, 65469, 0, 0, 0, 2410, 993, 0, 120589, 120689, \r
+    78693, 0, 0, 7232, 0, 119253, 0, 0, 74462, 2066, 10489, 42166, 43463, \r
+    10659, 3600, 0, 4224, 1336, 41518, 0, 0, 0, 0, 41139, 64820, 0, 12966, \r
+    41134, 0, 0, 0, 0, 272, 4263, 8793, 0, 0, 41502, 0, 983, 12549, 0, 0, \r
+    1190, 4109, 1335, 841, 5888, 41358, 64863, 9544, 43481, 0, 0, 0, 2099, \r
+    5120, 2409, 7799, 0, 74424, 0, 0, 4731, 0, 66629, 0, 0, 1255, 4149, 9247, \r
+    0, 9913, 0, 0, 64914, 917787, 65101, 0, 11694, 0, 11690, 5835, 0, 66625, \r
+    10842, 41354, 42123, 43097, 11688, 66634, 1094, 194, 64692, 0, 8180, 0, \r
+    0, 9972, 73865, 4519, 6114, 10898, 43072, 0, 0, 0, 0, 0, 10695, 0, 7540, \r
+    0, 881, 7857, 6067, 65164, 0, 0, 0, 13311, 68403, 41857, 64321, 8359, 0, \r
+    12689, 0, 194594, 0, 0, 0, 68183, 0, 0, 1287, 5436, 0, 0, 74142, 127013, \r
+    74152, 119078, 6051, 10497, 0, 8985, 12109, 0, 0, 0, 0, 0, 3652, 10537, \r
+    0, 1276, 120440, 6549, 279, 73745, 0, 0, 0, 1489, 0, 0, 0, 3899, 1007, \r
+    42124, 0, 42122, 0, 0, 0, 11985, 1345, 78600, 0, 0, 8956, 43083, 119830, \r
+    42138, 78610, 0, 12151, 78608, 78604, 78605, 6285, 78603, 78612, 78613, \r
+    74194, 492, 8685, 0, 0, 0, 78622, 43712, 2582, 11470, 64538, 7444, 78615, \r
+    78616, 41550, 0, 73837, 119823, 2527, 119824, 197, 2799, 0, 41944, \r
+    120276, 9933, 0, 66515, 767, 5524, 7028, 0, 0, 119827, 119817, 119828, \r
+    78633, 10896, 0, 1799, 120497, 6971, 74336, 0, 0, 65340, 118979, 41551, \r
+    2434, 0, 0, 120579, 0, 4631, 0, 0, 6407, 0, 6338, 43214, 0, 7570, 0, \r
+    3192, 0, 8414, 0, 0, 0, 0, 0, 9164, 66612, 0, 3171, 6623, 4961, 68396, \r
+    886, 55216, 8654, 78832, 9993, 74390, 64603, 0, 69241, 9599, 78629, \r
+    43084, 78627, 78628, 78625, 2399, 0, 8994, 10944, 41208, 0, 41168, 8178, \r
+    0, 3367, 195008, 42510, 78641, 78636, 6804, 78634, 1947, 0, 0, 0, 42759, \r
+    11068, 1705, 9331, 0, 74798, 9181, 65359, 0, 8017, 0, 65096, 66720, 0, \r
+    43475, 0, 4909, 12126, 0, 120696, 4904, 0, 195012, 1365, 9253, 42757, \r
+    43436, 7462, 0, 0, 0, 0, 119587, 64415, 0, 0, 5398, 0, 195014, 0, 0, 0, \r
+    119015, 0, 0, 9476, 0, 0, 12763, 0, 3629, 0, 13005, 0, 3628, 0, 0, 0, \r
+    3469, 42107, 42116, 917578, 64809, 2928, 4905, 9853, 851, 9040, 0, 64665, \r
+    43086, 9114, 0, 42583, 9315, 4822, 4906, 3852, 2847, 119821, 3236, 11317, \r
+    1251, 7777, 41852, 11410, 10964, 0, 43222, 12646, 120269, 10259, 9865, \r
+    65821, 0, 6018, 119814, 0, 12276, 0, 68372, 0, 0, 119244, 0, 0, 10467, 0, \r
+    2443, 10918, 78217, 119825, 1001, 9241, 1927, 0, 0, 73987, 0, 0, 0, \r
+    118828, 127504, 65678, 12867, 0, 8260, 77945, 7519, 11505, 12274, 8904, \r
+    518, 65857, 0, 0, 13204, 4387, 857, 0, 65369, 0, 119583, 43125, 120592, \r
+    0, 0, 0, 0, 5136, 1968, 0, 195023, 1337, 64967, 1629, 0, 796, 66506, 0, \r
+    74123, 12877, 0, 42314, 43388, 0, 74403, 6120, 478, 65151, 68128, 0, \r
+    43082, 6016, 0, 42284, 0, 4276, 1206, 3619, 41638, 0, 3843, 12011, 8853, \r
+    3361, 0, 490, 10715, 7578, 68384, 0, 65350, 10530, 12348, 8653, 74314, \r
+    42435, 6154, 9551, 65354, 78522, 784, 42397, 334, 0, 42416, 65356, 65273, \r
+    77987, 127265, 4442, 10364, 0, 778, 41626, 42455, 7989, 74063, 3227, 0, \r
+    127275, 73983, 2915, 11502, 41022, 41702, 10309, 127035, 78320, 0, 6975, \r
+    0, 5415, 12176, 0, 0, 3462, 65215, 42629, 78691, 73784, 0, 0, 9759, 0, \r
+    78324, 127254, 8114, 78698, 78697, 78696, 78695, 8710, 42495, 118956, 0, \r
+    4051, 10460, 43364, 118917, 1356, 12161, 42713, 0, 127268, 1619, 9703, \r
+    43152, 42489, 42112, 0, 1875, 10808, 42109, 120284, 41860, 64862, 13305, \r
+    64907, 5289, 13144, 0, 0, 5575, 9675, 0, 5940, 226, 2649, 6336, 0, 0, \r
+    43236, 3382, 42449, 6498, 1658, 11936, 78232, 0, 11269, 10151, 73759, \r
+    43100, 74449, 65508, 0, 0, 0, 8935, 917985, 0, 0, 0, 616, 74753, 65178, \r
+    4684, 78701, 119653, 0, 0, 0, 6048, 74460, 42110, 73965, 10870, 8557, \r
+    11054, 68664, 119049, 9681, 4475, 0, 41142, 2100, 0, 120731, 6035, 0, \r
+    7651, 10296, 0, 0, 0, 917987, 0, 118966, 74144, 40997, 0, 10392, 10328, \r
+    40998, 43462, 74488, 0, 9800, 8979, 0, 119131, 41000, 0, 119239, 6487, \r
+    10977, 0, 10344, 0, 65299, 5394, 43246, 78243, 10220, 66505, 41200, 0, \r
+    4425, 0, 0, 0, 43074, 73799, 0, 78147, 0, 12173, 78545, 0, 0, 65338, 0, \r
+    0, 119582, 4474, 0, 43093, 0, 1587, 0, 127372, 64475, 0, 1369, 0, 78251, \r
+    7927, 0, 4560, 0, 0, 0, 0, 64948, 4430, 74347, 42601, 4514, 66434, 0, \r
+    8194, 65462, 10626, 10965, 0, 8893, 0, 12542, 0, 65341, 0, 65829, 7925, \r
+    119822, 10475, 0, 0, 1352, 11069, 7707, 127560, 0, 65279, 127102, 68207, \r
+    127100, 65605, 6040, 127097, 10071, 0, 9336, 0, 0, 8899, 7798, 64474, \r
+    64259, 0, 65188, 7820, 43018, 0, 0, 7746, 1492, 78551, 10884, 77982, 0, \r
+    5127, 11285, 42501, 5495, 4273, 43095, 41426, 10849, 5730, 2999, 6342, \r
+    68636, 74304, 371, 64373, 6023, 169, 5497, 11708, 0, 0, 6323, 0, 8224, 0, \r
+    8938, 6043, 12738, 0, 0, 5321, 0, 0, 0, 2589, 74332, 1689, 7802, 4683, \r
+    74318, 42704, 120296, 11905, 0, 0, 0, 0, 74513, 6049, 0, 4027, 834, \r
+    118962, 1803, 0, 1503, 0, 0, 0, 5731, 1381, 2387, 0, 0, 8289, 64525, \r
+    65817, 2881, 43142, 0, 9601, 2879, 9668, 9766, 0, 5729, 917833, 74410, \r
+    6036, 64881, 4026, 9361, 127091, 2887, 0, 3526, 6298, 0, 77897, 0, 78519, \r
+    0, 8572, 6021, 77896, 0, 77895, 43155, 0, 0, 3146, 10959, 9483, 0, 77893, \r
+    10981, 166, 917841, 8635, 0, 10623, 408, 119058, 127507, 13298, 0, 7426, \r
+    41641, 12717, 0, 7607, 10639, 66713, 0, 0, 41643, 74134, 0, 8713, 41640, \r
+    10221, 41645, 66712, 6645, 646, 66726, 66711, 42129, 0, 77901, 3472, \r
+    8697, 0, 0, 0, 0, 0, 0, 5809, 1950, 119356, 0, 74572, 0, 42136, 0, 0, 0, \r
+    0, 3247, 119854, 65017, 0, 68428, 66668, 0, 0, 10983, 0, 0, 0, 41567, 0, \r
+    0, 0, 194624, 0, 0, 0, 8285, 0, 4509, 0, 66471, 12216, 0, 40988, 0, 0, \r
+    41727, 0, 0, 2396, 0, 0, 74018, 917538, 64940, 0, 3886, 0, 42457, 119008, \r
+    0, 996, 68123, 917571, 4249, 0, 917594, 11707, 8222, 0, 7939, 0, 917574, \r
+    917582, 917592, 917569, 8534, 0, 40983, 0, 0, 0, 7201, 12561, 0, 42371, \r
+    12558, 0, 0, 10052, 40982, 0, 0, 1488, 0, 0, 0, 917559, 0, 0, 1563, 0, \r
+    9619, 0, 0, 0, 0, 0, 5803, 7797, 6070, 10006, 0, 2922, 6082, 0, 65009, 0, \r
+    12567, 0, 0, 41412, 0, 0, 3607, 65863, 10046, 9612, 42153, 8218, 9485, 0, \r
+    2032, 78354, 0, 0, 0, 0, 0, 43085, 6057, 508, 0, 0, 120265, 0, 0, 0, 0, \r
+    638, 6083, 119072, 0, 0, 2305, 78348, 0, 0, 6056, 6659, 0, 0, 6085, 0, 0, \r
+    3915, 41634, 0, 41639, 63912, 11941, 0, 4028, 1787, 42180, 43096, 0, \r
+    3249, 1768, 0, 12328, 501, 127074, 10601, 0, 583, 0, 41977, 0, 66004, \r
+    119350, 6505, 74010, 0, 13064, 55267, 120810, 6500, 5526, 65049, 0, \r
+    73764, 0, 0, 12745, 9678, 0, 120587, 9869, 0, 1771, 0, 8936, 0, 0, 4208, \r
+    78341, 119115, 78342, 0, 0, 74101, 0, 11762, 0, 0, 77997, 0, 66475, 0, \r
+    5027, 0, 0, 0, 5069, 73862, 5028, 9897, 0, 73739, 5026, 0, 68639, 6331, \r
+    0, 8931, 0, 1415, 8866, 41901, 74790, 78138, 119361, 0, 43106, 5029, \r
+    65309, 1580, 3598, 68424, 41070, 77903, 0, 3440, 78215, 1562, 0, 127236, \r
+    119358, 1716, 0, 10600, 0, 620, 41001, 6028, 0, 42892, 0, 74822, 5024, \r
+    120829, 41003, 0, 5025, 0, 0, 0, 119328, 0, 65557, 0, 74541, 0, 11599, 0, \r
+    11602, 6243, 11574, 11581, 11597, 11598, 6253, 6105, 11584, 74195, 11569, \r
+    65275, 8906, 127096, 5755, 2636, 0, 10815, 11619, 78717, 41540, 7815, \r
+    11616, 6979, 12080, 7721, 11604, 7869, 1592, 0, 42152, 78498, 41048, 0, \r
+    829, 0, 0, 19950, 0, 0, 6616, 0, 118875, 10953, 391, 0, 69785, 482, \r
+    42296, 11588, 0, 43606, 0, 68397, 66370, 0, 42335, 0, 0, 0, 7538, 5315, \r
+    0, 42491, 0, 42061, 0, 4576, 0, 68417, 120241, 4277, 0, 4039, 64472, \r
+    42338, 368, 42058, 3960, 11043, 11337, 78209, 917820, 63989, 3958, 12132, \r
+    1849, 0, 9921, 42451, 4253, 41147, 42064, 11959, 42404, 41160, 0, 3618, \r
+    78338, 0, 43300, 5156, 0, 0, 929, 6827, 42035, 42437, 1555, 0, 8691, \r
+    66435, 0, 41662, 0, 0, 0, 0, 0, 4578, 64513, 41664, 0, 42578, 0, 41661, \r
+    78715, 43305, 9356, 0, 0, 0, 1286, 10166, 0, 0, 64707, 0, 42476, 7730, 0, \r
+    0, 42483, 0, 0, 42324, 42291, 10020, 43359, 0, 6641, 525, 41627, 0, 8763, \r
+    0, 41628, 533, 11931, 65225, 8321, 42504, 42581, 0, 6915, 42310, 4377, \r
+    8559, 0, 120234, 0, 13193, 64350, 11666, 8679, 41924, 1576, 7735, 0, 0, \r
+    73840, 0, 11374, 78043, 10889, 43461, 7757, 42462, 120226, 10029, 66493, \r
+    2718, 4168, 73842, 13308, 120112, 0, 1179, 4440, 0, 77948, 363, 11015, \r
+    77947, 77944, 64296, 127090, 66692, 120826, 0, 66492, 6593, 64625, 41963, \r
+    0, 119329, 0, 10013, 0, 0, 127095, 9492, 11782, 64382, 12833, 118986, 0, \r
+    1297, 41630, 630, 127094, 0, 120774, 120570, 1043, 43652, 66223, 10090, \r
+    0, 0, 313, 917563, 41881, 0, 42311, 7445, 0, 5750, 10759, 9419, 55222, \r
+    9405, 11268, 0, 9398, 8526, 9399, 9422, 0, 66495, 0, 0, 127239, 41718, \r
+    10707, 1603, 0, 119003, 0, 631, 77952, 77953, 13161, 65272, 0, 10546, \r
+    74210, 78101, 11600, 77961, 2797, 73821, 42427, 306, 714, 3058, 42381, \r
+    77962, 127080, 12351, 42395, 0, 11607, 0, 42282, 77971, 77967, 9157, \r
+    73765, 66364, 42433, 77964, 7603, 12803, 180, 42141, 0, 120612, 66494, \r
+    12674, 8244, 362, 0, 0, 8037, 917803, 11535, 0, 74845, 5185, 66696, 5521, \r
+    10334, 2093, 77983, 10302, 0, 10104, 1027, 5181, 0, 0, 10523, 1446, \r
+    42320, 41646, 991, 5189, 42472, 41647, 120105, 1722, 5581, 77979, 3405, \r
+    0, 194644, 5523, 0, 42620, 0, 0, 9549, 0, 10549, 55282, 9661, 43682, 0, \r
+    77910, 120026, 78708, 0, 77911, 0, 41991, 0, 0, 7630, 9846, 7684, 10350, \r
+    0, 1174, 77981, 42733, 77978, 77980, 66485, 77977, 42277, 77974, 42456, \r
+    65667, 0, 12330, 0, 0, 42417, 42383, 0, 41344, 6293, 0, 66252, 77984, \r
+    74443, 0, 10209, 8313, 4195, 74435, 1316, 66690, 120032, 6332, 64894, 0, \r
+    65871, 78060, 1736, 0, 3901, 12228, 120151, 65200, 3383, 10446, 78841, \r
+    693, 9130, 314, 64149, 42420, 11949, 0, 120152, 11026, 0, 5332, 6940, \r
+    64154, 12635, 127007, 42706, 1751, 273, 8165, 13166, 120763, 78840, 0, \r
+    12824, 0, 4528, 5320, 6301, 43662, 6133, 9339, 9463, 42346, 10922, 64560, \r
+    3757, 0, 0, 0, 65869, 73760, 2569, 0, 2326, 65740, 2565, 42459, 7596, \r
+    7921, 0, 74095, 0, 41848, 2567, 66006, 0, 4044, 0, 0, 12233, 0, 1023, \r
+    474, 0, 119818, 0, 0, 42487, 65556, 0, 0, 42295, 0, 0, 0, 0, 9835, 66499, \r
+    0, 5417, 12275, 10895, 0, 274, 0, 1858, 0, 0, 55251, 10118, 3133, 0, \r
+    73795, 0, 9610, 8068, 8197, 0, 699, 0, 41665, 5868, 0, 0, 42182, 7581, \r
+    19940, 43668, 41667, 0, 0, 1923, 65583, 65802, 0, 64597, 43444, 119184, \r
+    0, 0, 6464, 7036, 2996, 1937, 0, 0, 41835, 4047, 41842, 0, 64107, 0, 0, \r
+    11017, 0, 0, 293, 77966, 0, 64791, 41827, 42466, 43422, 10579, 8560, 0, \r
+    65413, 77963, 4803, 12964, 1739, 1941, 3900, 0, 1713, 77969, 0, 73957, \r
+    11407, 42441, 41971, 6297, 120098, 64105, 0, 42481, 11716, 66473, 7179, \r
+    42289, 0, 64103, 969, 0, 9352, 0, 6165, 64100, 0, 6632, 73861, 42402, \r
+    74327, 7806, 0, 8914, 0, 0, 3183, 1435, 64876, 2969, 6046, 0, 6208, \r
+    67849, 5746, 73749, 0, 64416, 42422, 0, 0, 7082, 73775, 338, 5059, \r
+    194719, 0, 42328, 10767, 0, 8115, 0, 0, 0, 8227, 2073, 1218, 0, 0, 65848, \r
+    0, 0, 0, 0, 126987, 4486, 0, 0, 0, 10925, 0, 0, 0, 0, 42309, 10257, 0, \r
+    10273, 0, 10305, 42461, 0, 42349, 8832, 78051, 64127, 10644, 42662, \r
+    78828, 42278, 74451, 126988, 917857, 7794, 0, 42429, 6377, 42316, 119026, \r
+    3669, 3968, 42468, 0, 78544, 0, 65402, 119581, 0, 0, 64933, 0, 41960, \r
+    6699, 0, 0, 0, 6823, 42391, 1588, 65400, 8409, 78223, 19967, 65398, 787, \r
+    0, 917939, 0, 6115, 2078, 41654, 42480, 0, 0, 41655, 65401, 43975, 0, 0, \r
+    0, 644, 65500, 41657, 10778, 3659, 9533, 184, 1553, 13107, 65484, 0, \r
+    10502, 74457, 0, 0, 41554, 0, 8220, 917943, 41557, 0, 0, 11070, 119221, \r
+    5157, 4020, 73858, 41555, 9514, 64818, 65103, 64641, 64303, 78131, 7520, \r
+    0, 74377, 11029, 66651, 0, 0, 118930, 64527, 0, 7877, 73803, 0, 0, \r
+    120096, 74602, 9955, 0, 4055, 42817, 0, 65212, 11715, 12190, 12319, \r
+    78630, 0, 78631, 9502, 65427, 0, 65424, 12607, 0, 9734, 65425, 0, 0, 0, \r
+    78835, 0, 10112, 10827, 0, 9866, 74527, 66675, 0, 8625, 64346, 11290, \r
+    10477, 0, 8636, 0, 8315, 65444, 0, 0, 74595, 6152, 0, 0, 6629, 0, 120171, \r
+    0, 74589, 43993, 0, 69790, 0, 0, 43690, 11046, 11490, 42730, 4485, 0, 0, \r
+    64926, 0, 0, 0, 5869, 12437, 42728, 0, 7040, 3588, 0, 12825, 0, 0, 12725, \r
+    0, 0, 78642, 223, 0, 69806, 120166, 42444, 0, 64499, 65245, 0, 1171, 0, \r
+    120165, 0, 1805, 8772, 0, 0, 9930, 65247, 78619, 120111, 2338, 0, 118853, \r
+    0, 42676, 0, 64800, 65236, 67644, 68126, 1213, 0, 64075, 797, 64074, \r
+    8734, 4212, 0, 64387, 4115, 0, 5005, 64070, 64073, 10679, 0, 77954, 0, \r
+    64276, 426, 0, 0, 8251, 10136, 65436, 0, 65088, 43302, 1224, 0, 65576, \r
+    120158, 10701, 1764, 3101, 0, 65291, 120159, 0, 11373, 6378, 0, 120103, \r
+    8663, 9312, 41644, 4539, 3787, 0, 9222, 0, 0, 4259, 9092, 74567, 41961, \r
+    0, 12724, 66357, 42331, 64935, 0, 0, 1293, 7947, 12003, 0, 74593, 120308, \r
+    2454, 42717, 3613, 0, 0, 0, 65888, 8816, 10978, 10840, 0, 10668, 0, \r
+    43087, 12595, 120304, 0, 118806, 0, 1157, 64903, 8638, 0, 0, 0, 0, \r
+    120319, 8235, 120316, 4405, 10086, 120247, 0, 69216, 0, 65430, 74013, \r
+    6079, 6817, 10764, 0, 64291, 0, 998, 120312, 11062, 1317, 64327, 1558, 0, \r
+    1991, 7882, 42254, 0, 41700, 530, 0, 10428, 119335, 12002, 119336, 5742, \r
+    43076, 4692, 64630, 41823, 4007, 5004, 119334, 7896, 751, 6595, 6596, 0, \r
+    66373, 0, 0, 64908, 0, 6311, 0, 12004, 119192, 12049, 43108, 0, 0, 41705, \r
+    0, 6598, 0, 6599, 0, 0, 42148, 118825, 66027, 0, 6597, 9412, 8340, 11824, \r
+    64745, 0, 0, 0, 1988, 5407, 67865, 2430, 41678, 0, 120243, 2336, 0, 0, \r
+    78871, 120442, 0, 1921, 10947, 19927, 0, 65406, 0, 19913, 4284, 13217, 0, \r
+    0, 12841, 9229, 10956, 42285, 41674, 19964, 41679, 65084, 3521, 0, 5774, \r
+    8325, 0, 65403, 0, 1854, 10794, 0, 67660, 0, 0, 78359, 5280, 0, 4344, \r
+    12905, 65433, 6076, 64793, 41610, 768, 12074, 442, 0, 68162, 64081, \r
+    12934, 41682, 65432, 41693, 0, 6071, 65434, 0, 4804, 4053, 0, 0, 194653, \r
+    41696, 467, 69823, 0, 69797, 0, 0, 8421, 0, 0, 43705, 502, 0, 65431, \r
+    119056, 0, 12043, 1303, 316, 0, 2029, 65191, 119246, 11533, 64365, 43480, \r
+    0, 4860, 194645, 0, 42488, 0, 9583, 0, 5546, 8019, 73856, 0, 0, 0, 5544, \r
+    2355, 12150, 65725, 5543, 77989, 63751, 12137, 5548, 77985, 0, 65727, \r
+    68388, 65726, 6077, 0, 65452, 0, 11301, 78013, 78008, 78010, 9874, 78007, \r
+    0, 0, 3050, 65410, 0, 0, 78016, 78017, 42830, 43996, 66716, 0, 4691, 0, \r
+    9345, 621, 0, 0, 0, 65411, 0, 41182, 73881, 65408, 73899, 78024, 9474, \r
+    10545, 119118, 10887, 3786, 65409, 8894, 43179, 119611, 7923, 3716, \r
+    119341, 9996, 8508, 0, 7012, 8195, 0, 9566, 0, 3722, 0, 41707, 8493, 545, \r
+    9575, 41379, 10050, 12718, 0, 8859, 6820, 74345, 65110, 120740, 0, 0, \r
+    9119, 2787, 7920, 118823, 4021, 2012, 7985, 0, 119663, 0, 0, 78021, \r
+    78022, 410, 78020, 1802, 78018, 74107, 0, 41659, 41671, 1827, 0, 64396, \r
+    10126, 12116, 41673, 120370, 11422, 78141, 120373, 3860, 120367, 68412, \r
+    41345, 120362, 120363, 11748, 42158, 7941, 11076, 8749, 120361, 2104, \r
+    64858, 361, 120357, 845, 0, 41560, 11970, 4562, 917920, 2926, 0, 4569, \r
+    74130, 0, 43487, 194630, 611, 74129, 64871, 120379, 65629, 0, 0, 0, 0, 0, \r
+    120543, 0, 0, 6291, 0, 78639, 41669, 7094, 917921, 0, 0, 74054, 0, \r
+    195029, 0, 839, 0, 7695, 8769, 65246, 4829, 0, 4859, 64467, 0, 0, 118998, \r
+    7206, 0, 6647, 43986, 0, 69766, 0, 64764, 4210, 0, 0, 804, 0, 0, 12298, \r
+    0, 66653, 0, 64924, 10091, 73931, 9468, 74245, 0, 0, 74246, 0, 12839, \r
+    64669, 0, 0, 1279, 1425, 6224, 119229, 11049, 0, 917549, 43239, 8482, 0, \r
+    0, 5032, 77830, 11940, 67888, 664, 0, 5034, 0, 0, 127525, 42702, 73888, \r
+    0, 13294, 67873, 64869, 6032, 0, 9115, 7430, 120377, 0, 120819, 68387, \r
+    120168, 73913, 120170, 41161, 5518, 4174, 10993, 41162, 120160, 64528, \r
+    1169, 434, 41437, 1905, 6034, 41164, 64744, 9528, 118867, 194668, 524, 0, \r
+    74029, 788, 74027, 0, 0, 0, 1663, 10419, 74025, 42636, 0, 0, 0, 120656, \r
+    0, 67876, 0, 0, 0, 67897, 74039, 0, 0, 11395, 0, 119107, 43612, 64344, 0, \r
+    0, 10855, 5445, 9355, 0, 65198, 7391, 8989, 221, 65686, 0, 0, 8010, 7191, \r
+    4962, 69772, 8855, 0, 0, 64469, 120426, 10555, 0, 43333, 0, 0, 120427, \r
+    10451, 0, 67653, 7245, 12443, 74405, 9947, 120149, 78317, 3873, 8367, 0, \r
+    120146, 43433, 43649, 11987, 0, 0, 11010, 12723, 74059, 74062, 6217, \r
+    5896, 0, 7682, 74049, 1462, 10235, 0, 0, 0, 0, 0, 0, 42595, 0, 74402, \r
+    118860, 0, 120419, 0, 74052, 0, 0, 120549, 119082, 64295, 120418, 0, \r
+    64765, 73923, 120417, 120662, 120730, 0, 6216, 0, 10755, 9455, 0, 8124, \r
+    127042, 9470, 6944, 0, 0, 0, 2828, 0, 531, 42638, 0, 0, 0, 43428, 8204, \r
+    3614, 2827, 9696, 0, 0, 8728, 4354, 10904, 78562, 19936, 7833, 120691, 0, \r
+    42599, 42597, 42709, 120409, 127044, 0, 8537, 0, 0, 0, 0, 0, 41199, \r
+    10121, 2028, 0, 0, 0, 0, 3062, 0, 74447, 12608, 0, 66440, 7545, 9700, \r
+    12580, 0, 120777, 120502, 41155, 0, 74071, 0, 0, 12713, 0, 0, 0, 78772, \r
+    0, 1734, 0, 0, 0, 64594, 2456, 231, 0, 74167, 542, 0, 118786, 0, 0, 1230, \r
+    0, 0, 3597, 4446, 10584, 74235, 0, 4037, 0, 8352, 0, 5687, 0, 64515, 0, \r
+    0, 55265, 67846, 78434, 9704, 0, 0, 74284, 0, 0, 8660, 0, 0, 0, 78773, \r
+    74482, 4483, 1709, 120617, 9909, 6080, 0, 0, 1746, 1315, 8667, 0, 0, \r
+    13140, 65899, 10604, 0, 4480, 11266, 0, 1226, 6930, 0, 0, 6360, 10897, \r
+    41230, 605, 0, 74785, 120356, 0, 0, 41500, 0, 311, 11453, 6221, 10608, \r
+    64943, 74280, 10877, 118868, 64885, 74272, 0, 0, 0, 120736, 74312, 345, \r
+    0, 74456, 64606, 9917, 0, 0, 5037, 0, 1776, 8422, 0, 118814, 41508, \r
+    41201, 323, 43328, 0, 42698, 1295, 0, 4625, 0, 4630, 13117, 0, 0, 65123, \r
+    11293, 2668, 11288, 0, 42640, 65666, 2519, 0, 65420, 0, 0, 4252, 5049, \r
+    42659, 119011, 706, 7754, 10854, 8738, 0, 65419, 0, 0, 649, 65421, 0, \r
+    66702, 0, 12670, 1013, 0, 64919, 705, 0, 65422, 0, 1183, 0, 7017, 42852, \r
+    0, 8157, 9736, 64503, 65418, 0, 0, 74035, 0, 11913, 73874, 6696, 0, 8920, \r
+    0, 0, 7962, 12211, 9837, 2051, 66227, 0, 4184, 0, 0, 10177, 73777, 1857, \r
+    0, 4626, 8464, 8472, 0, 4629, 8499, 78321, 78322, 4624, 7818, 119173, 0, \r
+    0, 7805, 0, 0, 6935, 0, 78325, 78326, 78323, 43327, 43989, 119046, 8492, \r
+    8250, 8459, 0, 8497, 8496, 0, 0, 78336, 78339, 9543, 78335, 78332, 77832, \r
+    65849, 77831, 0, 0, 12451, 0, 8684, 0, 6102, 0, 5298, 0, 5294, 0, 0, 0, \r
+    195062, 9949, 119826, 43617, 119215, 0, 12073, 0, 0, 77863, 13108, 0, \r
+    74397, 41468, 0, 0, 5292, 55272, 0, 1939, 5302, 3970, 0, 12455, 1793, 0, \r
+    0, 0, 6643, 0, 65263, 0, 78330, 41293, 78328, 78329, 0, 13219, 9569, 0, \r
+    74383, 0, 0, 0, 5500, 8813, 0, 0, 74566, 5322, 0, 78340, 43631, 5324, \r
+    66443, 3784, 41614, 65269, 6230, 78349, 78345, 43324, 3360, 78344, 11523, \r
+    0, 0, 9926, 7197, 0, 68429, 0, 41821, 1249, 78360, 78361, 78356, 78358, \r
+    78353, 64899, 64763, 41149, 41807, 43162, 41815, 41150, 0, 10571, 10096, \r
+    0, 0, 78074, 6947, 41152, 887, 9249, 6565, 78510, 41990, 78509, 41811, \r
+    74466, 0, 6670, 77882, 0, 0, 43092, 43325, 0, 10168, 0, 9781, 194610, \r
+    9190, 0, 9666, 8269, 65944, 74005, 13019, 11670, 0, 315, 12813, 0, 78432, \r
+    78256, 78351, 78352, 0, 0, 0, 0, 1378, 9509, 0, 0, 74475, 3066, 0, 67847, \r
+    0, 0, 0, 78365, 8787, 0, 194616, 41618, 194615, 78261, 194614, 0, 64652, \r
+    0, 194612, 0, 78366, 42088, 0, 0, 7176, 0, 10137, 6121, 10995, 78259, \r
+    74534, 8119, 64874, 917816, 0, 0, 0, 74525, 0, 0, 12930, 1394, 74514, 0, \r
+    74515, 0, 118804, 2998, 9527, 120659, 65190, 12977, 42090, 119165, 0, \r
+    119100, 41236, 0, 42005, 42003, 41237, 5848, 0, 0, 3670, 0, 194600, 0, 0, \r
+    7890, 0, 11298, 43315, 0, 6229, 1593, 0, 0, 619, 4635, 65080, 0, 0, 4120, \r
+    65337, 65336, 0, 11808, 119214, 74115, 9366, 42790, 42006, 0, 65327, \r
+    65326, 65325, 10757, 1507, 42216, 65321, 65320, 65335, 65334, 65333, \r
+    65332, 65331, 42059, 65329, 42689, 0, 9128, 118885, 42073, 6785, 64590, \r
+    0, 4371, 7196, 65318, 2035, 65316, 4106, 65314, 65313, 42074, 0, 41228, \r
+    0, 65609, 41241, 7903, 41239, 43533, 78459, 7189, 0, 0, 0, 12357, 42802, \r
+    78450, 8487, 9131, 0, 4615, 12695, 0, 0, 12175, 0, 64535, 0, 7809, 0, 0, \r
+    562, 12169, 6590, 69762, 66455, 64738, 3219, 68654, 0, 0, 1037, 0, 2025, \r
+    0, 13098, 78442, 10637, 4568, 549, 1570, 0, 2835, 0, 10624, 43623, 11072, \r
+    0, 0, 0, 12606, 78433, 2825, 0, 10825, 8079, 2821, 41046, 0, 0, 0, \r
+    120593, 13071, 0, 452, 41049, 42840, 6346, 2831, 5461, 74596, 11465, \r
+    5212, 0, 64703, 119191, 42308, 7181, 0, 41332, 0, 12333, 0, 1668, 0, 0, \r
+    0, 1187, 0, 42628, 78575, 0, 0, 0, 3240, 0, 12194, 0, 11591, 41065, 5323, \r
+    8166, 0, 0, 0, 74535, 1623, 65297, 0, 571, 0, 4918, 0, 5288, 127295, \r
+    8916, 65048, 1909, 8864, 0, 0, 10736, 0, 11571, 7615, 0, 0, 4237, 0, \r
+    1035, 65815, 0, 7881, 701, 65936, 3489, 0, 0, 120751, 11403, 0, 0, 0, \r
+    3796, 6800, 0, 3994, 11421, 0, 0, 0, 0, 0, 0, 64857, 0, 2855, 0, 66308, \r
+    41621, 68214, 0, 0, 10654, 0, 119226, 12164, 3246, 7906, 43972, 65847, \r
+    7182, 0, 13024, 194822, 74270, 0, 0, 0, 0, 1496, 747, 0, 942, 2378, \r
+    43136, 0, 8466, 0, 9320, 8001, 1232, 8139, 11617, 0, 0, 11409, 68373, \r
+    6382, 0, 64634, 0, 0, 11612, 0, 67600, 2374, 0, 8475, 11609, 66313, 0, 0, \r
+    5286, 119297, 0, 0, 64925, 0, 0, 118982, 194583, 7705, 11942, 11305, \r
+    194581, 3309, 0, 0, 0, 0, 6802, 0, 41653, 1280, 1241, 7168, 12096, 0, \r
+    66615, 42565, 41651, 0, 0, 0, 41650, 66507, 66470, 0, 12914, 41491, \r
+    66010, 119552, 6078, 65100, 0, 1475, 0, 9938, 6084, 917546, 41064, 41062, \r
+    0, 0, 3256, 0, 42076, 43252, 78823, 0, 8727, 0, 65875, 0, 0, 0, 10562, \r
+    74215, 43065, 0, 0, 3248, 74297, 3261, 9015, 0, 0, 3635, 64337, 0, 0, 0, \r
+    7195, 0, 2007, 64431, 0, 0, 0, 0, 635, 0, 0, 65613, 77909, 0, 73997, 0, \r
+    0, 119218, 7984, 8600, 74434, 0, 4176, 0, 2034, 0, 120805, 65891, 127038, \r
+    0, 318, 2038, 0, 78596, 0, 3649, 13149, 42145, 42798, 3634, 120291, \r
+    118927, 67677, 120124, 7866, 0, 11402, 42146, 120134, 74238, 42664, 2849, \r
+    127034, 0, 7938, 12960, 1761, 11812, 65379, 68386, 0, 1159, 0, 0, 0, 0, \r
+    7178, 194632, 0, 41680, 0, 0, 11534, 1514, 11668, 67891, 9313, 7015, 0, \r
+    67877, 0, 12989, 66474, 9368, 12848, 1624, 43270, 0, 194563, 10818, \r
+    194562, 9953, 0, 78421, 1194, 3242, 9761, 9555, 8598, 120299, 6169, \r
+    12871, 1551, 2798, 65176, 120298, 42752, 119025, 0, 67875, 120301, 3495, \r
+    66648, 0, 0, 68364, 0, 4891, 0, 10641, 0, 73746, 0, 68352, 0, 73787, 0, \r
+    194633, 7199, 64955, 0, 0, 0, 0, 0, 42685, 42679, 193, 0, 0, 0, 42667, 0, \r
+    5271, 0, 119661, 118882, 1362, 13297, 0, 0, 0, 0, 73789, 0, 6658, 4426, \r
+    0, 0, 0, 119123, 7276, 42163, 5220, 0, 0, 0, 2416, 3310, 42703, 0, 379, \r
+    0, 0, 0, 0, 3223, 65492, 1284, 194771, 4549, 0, 0, 0, 0, 10807, 9558, \r
+    194613, 0, 8515, 8688, 12866, 0, 3294, 0, 8529, 0, 43385, 7564, 0, 43329, \r
+    0, 0, 73757, 66456, 42359, 0, 2031, 0, 7202, 0, 12676, 42729, 0, 3215, 0, \r
+    7710, 1610, 73801, 0, 0, 65682, 0, 120537, 65924, 9974, 228, 66354, 1501, \r
+    0, 64395, 5179, 7200, 6225, 0, 65794, 1725, 65533, 8196, 7476, 74399, 0, \r
+    0, 0, 8502, 5762, 1967, 7483, 0, 0, 8104, 0, 7474, 0, 0, 0, 10414, 13001, \r
+    8141, 0, 42537, 1557, 43594, 0, 6330, 6805, 8631, 2545, 120672, 0, 0, \r
+    74190, 0, 0, 0, 42762, 0, 127017, 1650, 262, 1637, 0, 7901, 3238, 0, \r
+    41861, 0, 0, 65158, 10860, 0, 43658, 7527, 0, 43319, 6419, 0, 45, 0, 0, \r
+    0, 0, 119810, 7194, 5291, 0, 43666, 13129, 0, 9084, 0, 8737, 0, 12881, 0, \r
+    12906, 9639, 7912, 2620, 0, 0, 0, 0, 179, 65896, 0, 64756, 2853, 0, \r
+    118813, 0, 118996, 119009, 2850, 8084, 0, 73850, 2801, 119837, 42069, \r
+    119839, 74754, 119841, 42072, 119843, 119842, 10398, 0, 0, 0, 0, 8245, \r
+    68401, 3158, 119853, 4389, 43656, 923, 119857, 119856, 292, 13002, \r
+    119845, 119844, 3221, 1763, 119849, 4612, 119851, 119850, 7253, 127110, \r
+    68391, 0, 10782, 3637, 12996, 43542, 0, 64578, 0, 3228, 73869, 8783, 0, \r
+    119614, 2731, 0, 0, 78585, 4102, 7696, 73878, 0, 0, 78586, 43316, 4177, \r
+    11283, 9089, 0, 73996, 0, 64500, 43674, 0, 0, 1856, 0, 0, 6379, 0, 0, 0, \r
+    3208, 12975, 0, 0, 0, 0, 74072, 55269, 0, 0, 0, 2033, 78577, 78576, \r
+    195026, 55254, 7740, 0, 0, 0, 73964, 0, 0, 67612, 65674, 0, 0, 41689, 0, \r
+    74006, 64909, 6646, 11790, 74019, 0, 0, 0, 8561, 4573, 0, 5326, 0, \r
+    120605, 7230, 8257, 0, 8778, 41688, 0, 65776, 2071, 8314, 6459, 0, 7628, \r
+    65092, 73903, 66721, 11342, 0, 0, 0, 0, 127001, 0, 11810, 13164, 10723, \r
+    967, 0, 0, 11946, 0, 3257, 0, 12307, 1845, 0, 43526, 0, 0, 1886, 42342, \r
+    10089, 870, 7648, 3499, 8609, 7652, 876, 871, 877, 0, 878, 42015, 879, \r
+    43692, 4563, 0, 0, 7591, 65887, 867, 9520, 872, 0, 868, 873, 7642, 0, \r
+    869, 874, 7644, 0, 875, 790, 0, 0, 0, 0, 66182, 0, 5429, 0, 66180, 0, \r
+    66181, 68452, 0, 0, 42067, 0, 5433, 10657, 7911, 194622, 1547, 66176, \r
+    42012, 120576, 5425, 4977, 9999, 5317, 5423, 4611, 0, 67637, 0, 9679, \r
+    74122, 0, 0, 0, 0, 4418, 66184, 4628, 4245, 119648, 0, 0, 1851, 0, 0, \r
+    11908, 0, 9360, 118897, 0, 42776, 66187, 12837, 8829, 7711, 0, 0, 119973, \r
+    43318, 0, 8809, 119974, 0, 0, 120604, 0, 0, 0, 0, 0, 0, 7427, 0, 4588, \r
+    43680, 0, 74484, 0, 2433, 0, 119622, 3352, 74363, 0, 0, 793, 74404, 0, \r
+    305, 567, 67662, 842, 0, 8208, 0, 41695, 1647, 118877, 0, 7837, 917625, \r
+    818, 5337, 917622, 917621, 41376, 119978, 917618, 120594, 74086, 917615, \r
+    917614, 917613, 10973, 66359, 1372, 917609, 917608, 4969, 1254, 917605, \r
+    917604, 917603, 917602, 65228, 78221, 0, 0, 2840, 0, 119982, 0, 0, 3245, \r
+    9068, 68194, 64725, 0, 0, 12991, 0, 2651, 0, 0, 917611, 127026, 0, 0, 0, \r
+    43648, 120812, 0, 43322, 0, 0, 0, 64372, 0, 3226, 655, 752, 7457, 7456, \r
+    7452, 3285, 0, 0, 119988, 65610, 0, 0, 0, 671, 250, 7434, 618, 668, 610, \r
+    42800, 7431, 1152, 42801, 640, 120666, 7448, 7439, 628, 3905, 73810, 0, \r
+    0, 64749, 67850, 2107, 0, 0, 4605, 194873, 0, 43372, 65945, 0, 0, 119590, \r
+    0, 0, 0, 987, 6927, 11572, 42261, 11464, 3365, 9971, 0, 0, 0, 0, 0, 0, 0, \r
+    11334, 43326, 12609, 11519, 11503, 5530, 5210, 0, 4627, 0, 5208, 0, 0, \r
+    10332, 5218, 7976, 9156, 0, 3244, 5529, 0, 73894, 0, 5432, 64965, 5527, \r
+    74033, 10516, 7790, 5528, 0, 42140, 120281, 0, 0, 43545, 9887, 0, 4000, \r
+    7429, 7428, 665, 7424, 3206, 120278, 7884, 0, 0, 0, 0, 211, 2509, 0, \r
+    120573, 68672, 3220, 42235, 0, 10690, 8951, 5214, 42474, 8118, 0, 7048, \r
+    4590, 127258, 5852, 0, 0, 127259, 1708, 0, 0, 2623, 11943, 0, 69226, 0, \r
+    4698, 66509, 1066, 119921, 4701, 0, 120285, 74225, 119114, 8267, 0, 0, 0, \r
+    7516, 0, 2625, 0, 8034, 74309, 0, 3631, 10955, 7850, 120293, 8416, 0, 0, \r
+    0, 43384, 12660, 0, 0, 0, 74850, 41069, 0, 0, 12099, 4310, 10032, 6252, \r
+    713, 7990, 0, 3990, 0, 0, 66368, 5017, 64956, 7071, 0, 119144, 1030, \r
+    118800, 0, 9513, 41059, 9357, 0, 1773, 0, 120350, 0, 6339, 7745, 9844, 0, \r
+    64650, 94, 1880, 74766, 0, 8908, 0, 0, 65913, 78470, 10752, 13003, 0, 0, \r
+    41307, 8732, 120338, 0, 1757, 6964, 4696, 0, 0, 64785, 7394, 3641, 5419, \r
+    0, 0, 0, 0, 120344, 43988, 0, 8610, 43062, 7592, 856, 74299, 936, 13289, \r
+    127521, 43171, 1459, 0, 65243, 78638, 19953, 0, 1504, 0, 0, 12913, 74206, \r
+    7529, 0, 0, 0, 120782, 4113, 0, 2372, 336, 0, 7509, 12152, 0, 682, 66458, \r
+    41505, 0, 64743, 10593, 1703, 0, 0, 8033, 0, 0, 9810, 127269, 0, 12970, \r
+    0, 42351, 10109, 0, 0, 194693, 0, 119247, 0, 0, 74291, 1965, 7069, 43312, \r
+    0, 73887, 0, 2087, 64370, 6314, 41714, 8501, 0, 0, 74239, 41317, 0, 2091, \r
+    0, 2090, 0, 9353, 77887, 2077, 77886, 0, 10498, 2083, 77888, 0, 0, \r
+    119236, 634, 0, 0, 0, 69779, 4165, 8746, 0, 9654, 12856, 6924, 0, 7066, \r
+    0, 0, 0, 41037, 42692, 7786, 12959, 41039, 0, 0, 680, 6274, 0, 1181, \r
+    7056, 3174, 0, 0, 0, 65665, 0, 0, 6920, 0, 0, 0, 118965, 0, 64644, \r
+    126981, 0, 0, 41028, 0, 6231, 2613, 65302, 40989, 0, 194696, 0, 42760, 0, \r
+    0, 0, 40987, 4667, 0, 0, 8828, 0, 0, 1246, 4746, 0, 0, 11021, 4749, 0, 0, \r
+    921, 4744, 0, 12702, 242, 0, 1566, 8217, 0, 64653, 78386, 0, 74036, \r
+    74505, 43274, 5313, 951, 0, 0, 0, 7604, 0, 4009, 0, 0, 120562, 0, 0, \r
+    64860, 119138, 119887, 0, 194702, 4048, 0, 0, 120596, 1646, 77890, 64534, \r
+    73995, 0, 0, 119890, 2579, 119905, 3177, 11357, 9099, 4107, 3441, 119894, \r
+    2975, 74442, 9822, 0, 55220, 10084, 73943, 118840, 0, 917562, 0, 3399, \r
+    9851, 0, 11909, 9059, 0, 7687, 0, 6789, 0, 0, 0, 0, 0, 0, 1777, 9151, \r
+    1137, 69767, 749, 42366, 0, 5385, 0, 0, 0, 0, 5989, 0, 0, 0, 0, 41685, \r
+    69223, 0, 9769, 41684, 0, 519, 0, 11740, 5766, 0, 0, 2600, 8848, 120138, \r
+    41297, 0, 3666, 74473, 41300, 74468, 65160, 0, 74542, 69771, 74479, 0, \r
+    6558, 0, 0, 69765, 120750, 252, 0, 41302, 0, 0, 0, 69763, 0, 11729, 8719, \r
+    9060, 0, 120139, 10761, 0, 0, 0, 118792, 11734, 0, 11730, 0, 9593, 5757, \r
+    2403, 64808, 55275, 0, 11728, 65894, 0, 0, 7764, 0, 11094, 120825, 0, 0, \r
+    4282, 8298, 0, 0, 0, 0, 0, 0, 0, 127509, 63854, 8456, 0, 74783, 65670, 0, \r
+    78250, 0, 7774, 10607, 9792, 0, 0, 0, 0, 120764, 0, 10019, 74762, 0, \r
+    3458, 4365, 0, 0, 3647, 0, 2602, 0, 0, 194707, 41135, 0, 0, 0, 64631, \r
+    172, 4971, 41219, 41137, 1889, 7238, 6545, 0, 0, 7597, 10528, 0, 0, 3732, \r
+    73910, 194588, 5344, 0, 43366, 43363, 9062, 119252, 0, 0, 0, 64479, 9232, \r
+    0, 0, 0, 194712, 10900, 41531, 1263, 3720, 12048, 0, 64292, 41524, 7227, \r
+    119635, 6099, 41534, 0, 0, 0, 299, 0, 8525, 0, 3524, 917565, 8831, 0, 0, \r
+    3075, 67867, 0, 0, 66362, 0, 74758, 0, 0, 5845, 0, 0, 0, 2581, 8200, \r
+    65114, 68460, 0, 43283, 5551, 0, 120735, 0, 6340, 118855, 0, 78134, 8680, \r
+    7204, 0, 2588, 2914, 7011, 55281, 0, 2471, 0, 2883, 2749, 119563, 73774, \r
+    10913, 0, 0, 8666, 675, 42493, 0, 43571, 0, 6219, 0, 9980, 41232, 10928, \r
+    0, 41153, 41229, 118967, 0, 3738, 0, 0, 12711, 3181, 66212, 74289, 68472, \r
+    42857, 8262, 0, 0, 0, 0, 42347, 12092, 9615, 7234, 74047, 0, 0, 64674, 0, \r
+    0, 73846, 0, 12722, 0, 922, 43983, 74507, 0, 74461, 3218, 120471, 74290, \r
+    120469, 64562, 120475, 8569, 11404, 11932, 73728, 3214, 120461, 120468, \r
+    12128, 3207, 65486, 78729, 1901, 78727, 0, 120460, 7425, 3205, 0, 78737, \r
+    78736, 78735, 43383, 78733, 65459, 2606, 78730, 73897, 0, 11496, 1173, 0, \r
+    41272, 0, 0, 0, 0, 120737, 0, 0, 0, 378, 2610, 0, 65079, 0, 65695, 0, 37, \r
+    7068, 0, 120480, 120479, 3209, 120477, 0, 10638, 9768, 120481, 0, 0, 0, \r
+    0, 0, 0, 65510, 0, 0, 5233, 0, 64792, 0, 0, 0, 0, 7060, 9847, 120144, \r
+    1685, 595, 0, 73971, 1292, 8940, 7380, 11088, 0, 10004, 126997, 0, 6541, \r
+    0, 0, 0, 3243, 9014, 5606, 0, 538, 64620, 5602, 8467, 74391, 6547, 0, \r
+    8203, 78488, 0, 8458, 65211, 8495, 119904, 0, 917552, 779, 78314, 64367, \r
+    2465, 0, 8193, 55279, 9730, 9280, 0, 7065, 74155, 4346, 0, 73798, 504, 0, \r
+    120715, 8982, 0, 0, 0, 782, 0, 10883, 0, 194852, 732, 3737, 127253, 1548, \r
+    68650, 0, 1832, 5604, 5735, 41141, 119020, 4376, 0, 11787, 3745, 0, 0, \r
+    42888, 65712, 0, 3869, 11937, 5725, 0, 1783, 68648, 5728, 0, 0, 0, 11918, \r
+    66567, 5724, 0, 5727, 0, 0, 0, 764, 0, 0, 43531, 0, 9033, 0, 42532, 6223, \r
+    11042, 120749, 11423, 0, 0, 0, 43465, 0, 0, 6559, 64557, 0, 0, 120648, \r
+    43019, 43477, 10238, 0, 0, 43377, 120675, 0, 1478, 9783, 11825, 2607, \r
+    64740, 0, 7739, 74543, 0, 0, 0, 6132, 0, 63765, 0, 0, 41144, 0, 0, 43537, \r
+    6761, 10093, 4369, 917791, 0, 0, 8820, 3947, 0, 0, 11515, 526, 0, 41295, \r
+    194603, 917785, 194932, 0, 7688, 917786, 7686, 8288, 11815, 0, 0, 0, \r
+    1543, 3713, 41221, 12423, 42281, 917788, 74024, 12293, 0, 64357, 11794, \r
+    42082, 0, 1737, 8987, 42081, 0, 7205, 0, 9335, 12850, 119870, 6553, 7055, \r
+    0, 8277, 0, 0, 5475, 74795, 6780, 0, 0, 12990, 1160, 42084, 119650, \r
+    41217, 119660, 10018, 360, 0, 0, 68176, 5863, 3137, 0, 4147, 0, 41216, \r
+    7844, 2616, 119190, 68461, 65234, 0, 13076, 3135, 0, 78143, 119139, 3142, \r
+    194948, 0, 10819, 119580, 10183, 0, 2608, 1470, 73967, 0, 6227, 0, 0, \r
+    74775, 0, 6163, 0, 0, 0, 0, 0, 8603, 0, 119866, 3306, 10876, 43392, \r
+    119573, 0, 5751, 0, 6222, 0, 0, 12086, 7403, 1600, 64309, 64939, 0, \r
+    64783, 0, 11310, 0, 8882, 0, 0, 2570, 7021, 0, 0, 43110, 0, 1234, 6540, \r
+    6974, 0, 0, 0, 5002, 0, 41286, 0, 127019, 0, 43585, 0, 6551, 0, 0, 0, \r
+    41289, 0, 0, 0, 8977, 602, 120814, 0, 0, 0, 0, 0, 41279, 0, 0, 0, 11081, \r
+    43615, 0, 0, 0, 0, 12727, 0, 0, 78397, 9475, 0, 65105, 0, 9633, 10886, \r
+    43592, 7831, 0, 0, 0, 73915, 8076, 43048, 8290, 8291, 43051, 0, 0, 2596, \r
+    43584, 0, 13113, 0, 0, 2393, 7058, 9087, 74067, 68673, 41574, 78337, 0, \r
+    74058, 6376, 0, 0, 0, 0, 9854, 0, 64696, 0, 0, 0, 6994, 0, 1720, 0, 0, 0, \r
+    6529, 7063, 0, 3751, 9120, 0, 0, 1798, 709, 0, 1354, 1876, 13152, 6557, \r
+    12430, 8137, 0, 0, 0, 0, 245, 0, 11456, 41233, 7070, 0, 0, 6136, 0, \r
+    65677, 8682, 41235, 0, 42045, 9804, 0, 432, 3595, 0, 65437, 0, 74455, \r
+    42399, 0, 0, 0, 0, 119658, 0, 0, 0, 77894, 8797, 0, 9052, 64888, 0, 2356, \r
+    95, 74784, 10580, 0, 42286, 0, 64640, 0, 119104, 0, 0, 0, 10063, 12652, \r
+    12199, 127030, 0, 2566, 11971, 0, 0, 1065, 0, 0, 43400, 2576, 0, 0, 0, \r
+    43604, 0, 0, 74082, 514, 74502, 0, 2921, 43215, 64493, 5772, 12968, 0, \r
+    194944, 74580, 43398, 2580, 0, 41341, 41223, 6564, 1463, 41342, 0, 5293, \r
+    0, 0, 3733, 11346, 0, 12054, 0, 74098, 42827, 0, 13091, 0, 0, 0, 917915, \r
+    0, 127025, 0, 74821, 0, 0, 119042, 0, 0, 13090, 66643, 0, 1270, 1132, \r
+    42360, 0, 74096, 66655, 42569, 0, 0, 64761, 0, 41021, 8510, 42432, 0, 0, \r
+    0, 0, 64496, 74109, 0, 9915, 0, 0, 7061, 41336, 3854, 0, 13141, 68413, \r
+    43401, 42319, 13082, 0, 7067, 68221, 0, 0, 0, 0, 0, 0, 9029, 43543, 0, \r
+    2353, 6308, 0, 74792, 2611, 119186, 0, 0, 0, 43664, 0, 66627, 0, 4484, \r
+    8509, 118976, 78116, 65233, 0, 41224, 41017, 0, 3747, 10522, 0, 0, 1691, \r
+    41226, 0, 12107, 44002, 10905, 65010, 0, 697, 66018, 9284, 4244, 0, 0, 0, \r
+    13121, 120036, 0, 12010, 0, 0, 0, 0, 0, 0, 65816, 68111, 0, 0, 65668, 0, \r
+    6618, 118784, 66365, 0, 42234, 12648, 0, 0, 0, 5785, 41309, 9764, 41316, \r
+    65877, 7383, 13230, 41299, 0, 0, 68365, 0, 0, 0, 0, 13122, 0, 191, 74119, \r
+    8585, 8000, 64411, 120652, 42889, 64850, 41072, 41578, 0, 41577, 0, \r
+    10002, 0, 6533, 73802, 41570, 0, 683, 396, 41580, 68146, 0, 12901, 43058, \r
+    0, 343, 0, 42680, 41360, 78154, 0, 4743, 0, 0, 74040, 74108, 8743, 1724, \r
+    1433, 119322, 0, 3739, 6263, 0, 0, 3964, 6592, 0, 0, 66040, 0, 42568, 0, \r
+    0, 1778, 3956, 0, 42070, 6563, 43075, 9018, 0, 0, 12067, 41312, 0, 5547, \r
+    74531, 0, 0, 8175, 0, 284, 8108, 934, 0, 74001, 173, 66460, 7174, 917917, \r
+    118822, 1750, 0, 4394, 68368, 1807, 0, 0, 0, 5889, 0, 7180, 0, 119145, 0, \r
+    0, 42471, 6982, 1721, 44022, 7891, 42243, 42160, 2583, 4512, 119360, \r
+    65230, 0, 0, 0, 3855, 0, 0, 0, 0, 74295, 0, 0, 119140, 3975, 0, 74087, 0, \r
+    12672, 3798, 2703, 0, 0, 2109, 9774, 1275, 0, 0, 41095, 3962, 0, 7873, \r
+    41101, 3954, 6457, 4513, 0, 0, 73994, 73992, 1468, 0, 0, 41851, 0, 41846, \r
+    0, 55238, 7633, 41849, 68385, 4320, 3224, 0, 0, 0, 42531, 0, 1510, 0, \r
+    8256, 0, 11393, 0, 8879, 0, 0, 8770, 0, 0, 78377, 1910, 8671, 78374, \r
+    4283, 0, 127117, 68361, 78318, 2654, 7893, 195007, 0, 0, 0, 65106, 42761, \r
+    12857, 4581, 8411, 78372, 78371, 78370, 78369, 78368, 0, 0, 0, 1733, \r
+    4392, 2568, 10786, 0, 0, 8184, 41486, 0, 7396, 0, 0, 69788, 0, 7185, \r
+    7965, 0, 0, 0, 0, 41350, 9129, 0, 0, 0, 0, 0, 0, 10481, 0, 0, 7171, 0, \r
+    340, 0, 0, 0, 0, 0, 0, 0, 6764, 0, 0, 0, 0, 0, 65203, 11392, 119098, \r
+    119359, 0, 3210, 0, 0, 0, 0, 0, 0, 917619, 0, 0, 10043, 0, 1186, 41571, \r
+    6999, 617, 9464, 0, 3675, 5207, 65062, 5213, 194769, 2617, 41348, 41568, \r
+    0, 3253, 120535, 0, 8630, 0, 0, 5596, 5545, 7288, 2586, 64887, 0, 5217, \r
+    0, 0, 0, 0, 64293, 68098, 2635, 0, 0, 0, 0, 0, 7835, 0, 0, 194988, 0, \r
+    64558, 127122, 0, 127121, 0, 0, 0, 5784, 0, 0, 0, 0, 4011, 917616, 68101, \r
+    0, 7864, 4254, 65095, 0, 5600, 3903, 127083, 10447, 5598, 1207, 120521, \r
+    66689, 3501, 42582, 43600, 194780, 0, 1124, 5597, 0, 0, 9321, 0, 0, 0, 0, \r
+    1719, 68356, 68354, 9671, 1125, 4399, 0, 917610, 0, 7631, 5488, 65223, \r
+    120532, 0, 5491, 0, 8937, 43044, 2604, 74187, 5490, 43046, 5489, 7212, \r
+    11768, 43043, 6300, 0, 194789, 0, 4390, 454, 41397, 0, 9875, 7593, \r
+    194792, 0, 118913, 7207, 0, 65901, 2394, 2575, 0, 3746, 11016, 65752, \r
+    120037, 0, 43423, 0, 11989, 0, 0, 0, 0, 0, 8249, 0, 0, 78531, 6640, \r
+    74806, 2598, 513, 0, 6586, 8656, 0, 127002, 65008, 0, 194784, 0, 194795, \r
+    0, 0, 68475, 0, 0, 0, 78637, 12647, 0, 194796, 0, 1036, 0, 0, 1723, 0, 0, \r
+    0, 41579, 2444, 0, 10705, 73876, 0, 74486, 0, 740, 194985, 194978, \r
+    194984, 0, 4238, 11071, 9459, 68437, 78140, 78139, 0, 8121, 10438, 74487, \r
+    42574, 13285, 55263, 11907, 195000, 5690, 194999, 0, 0, 43181, 13095, 0, \r
+    0, 64498, 0, 9506, 6978, 194993, 77992, 0, 0, 194992, 0, 0, 1122, 317, 0, \r
+    0, 0, 0, 1920, 0, 10173, 827, 0, 0, 78378, 120126, 5223, 1304, 0, 119564, \r
+    5226, 12602, 0, 0, 9329, 7758, 9239, 41173, 5224, 5487, 1222, 5692, \r
+    41725, 69229, 9674, 5695, 41711, 64627, 19909, 0, 74604, 5691, 287, 866, \r
+    233, 0, 0, 42816, 0, 65140, 74797, 0, 8830, 6568, 42300, 10524, 41175, 0, \r
+    0, 0, 5296, 0, 42492, 43402, 0, 3302, 0, 0, 6516, 6515, 6514, 6513, 6512, \r
+    0, 7856, 8690, 0, 0, 12122, 119628, 43976, 0, 1785, 0, 68622, 65153, \r
+    194810, 5138, 0, 0, 0, 0, 4540, 41181, 0, 6200, 0, 5134, 0, 322, 4643, \r
+    5132, 0, 6389, 0, 5143, 0, 8790, 0, 0, 194802, 0, 8869, 120601, 0, 42060, \r
+    0, 0, 0, 0, 10270, 10286, 10318, 10382, 43529, 66477, 0, 0, 74170, 0, \r
+    3234, 0, 0, 74376, 43139, 118815, 127084, 120627, 8767, 0, 74489, 9695, \r
+    120746, 5201, 0, 6215, 12714, 6214, 13101, 0, 0, 65268, 0, 0, 0, 11027, \r
+    0, 10059, 10511, 42075, 9767, 789, 1749, 78890, 127071, 0, 320, 0, 8647, \r
+    0, 3049, 0, 6471, 42071, 43156, 9925, 127356, 127355, 0, 4960, 5549, \r
+    127359, 0, 8485, 4671, 5418, 0, 3351, 127006, 0, 10610, 5414, 3064, 6212, \r
+    4286, 5421, 0, 9554, 0, 0, 0, 6653, 0, 0, 64510, 6213, 12885, 0, 119045, \r
+    64720, 0, 120759, 73741, 12603, 78654, 11430, 4566, 7843, 9317, 3801, \r
+    10342, 10406, 0, 119259, 42576, 0, 5200, 0, 917948, 0, 9183, 0, 74458, \r
+    73825, 395, 5482, 5198, 8786, 10390, 74202, 5196, 43224, 6113, 42009, \r
+    5205, 0, 43307, 0, 118973, 0, 12134, 0, 0, 118843, 9126, 435, 0, 12014, \r
+    12893, 8093, 9079, 3203, 192, 65109, 3385, 0, 64430, 5383, 10294, 10326, \r
+    0, 5738, 0, 3336, 78355, 5361, 3623, 41159, 0, 68112, 7872, 8581, 0, \r
+    1260, 3149, 5359, 0, 0, 7914, 5357, 0, 0, 2624, 5364, 0, 11431, 120030, \r
+    9101, 11058, 78288, 0, 78293, 42271, 78289, 65737, 120793, 0, 65566, \r
+    6717, 10619, 43360, 78385, 78384, 78383, 78382, 78381, 78380, 78379, \r
+    9319, 7097, 119055, 77906, 3232, 73824, 74581, 120632, 0, 0, 41889, 0, 0, \r
+    1161, 41895, 74103, 9701, 8622, 0, 0, 73819, 120588, 5012, 77912, 41362, \r
+    0, 78296, 11921, 0, 11769, 0, 68609, 41364, 0, 74228, 41352, 41361, 0, \r
+    41366, 0, 3356, 0, 917, 68422, 119915, 119923, 8199, 78389, 119917, 677, \r
+    119916, 0, 119932, 0, 0, 0, 0, 3349, 74125, 7022, 8927, 4739, 0, 5802, 0, \r
+    8615, 0, 0, 491, 0, 0, 0, 65837, 0, 8426, 11092, 9891, 0, 42497, 0, 7586, \r
+    42305, 10852, 0, 0, 4606, 68448, 9095, 7741, 12684, 41885, 1046, 0, 0, 0, \r
+    5815, 5171, 65539, 0, 6932, 78315, 42394, 41878, 74849, 120621, 0, 5169, \r
+    11935, 0, 0, 3175, 120822, 1537, 120804, 5176, 8905, 4136, 4871, 78287, \r
+    0, 9833, 0, 0, 1128, 65920, 0, 9711, 7057, 9408, 9409, 9410, 9411, 3662, \r
+    9413, 3378, 9415, 9416, 9417, 9418, 6320, 9420, 9421, 5897, 9423, 5165, \r
+    5126, 41385, 0, 41389, 917938, 8955, 3374, 9400, 9401, 9402, 9403, 9404, \r
+    3507, 9406, 7629, 0, 19925, 42669, 68463, 183, 43985, 2631, 0, 10627, \r
+    41130, 78260, 3996, 0, 78771, 0, 119313, 119307, 78768, 6580, 4332, \r
+    64825, 66329, 10726, 66686, 41125, 5899, 41365, 917918, 12085, 0, 574, \r
+    917922, 77825, 73828, 5448, 41058, 5446, 73900, 41322, 42211, 5442, 4190, \r
+    77834, 77835, 5451, 77833, 3616, 77828, 77837, 77838, 7708, 77836, 10859, \r
+    65867, 10345, 10409, 4191, 0, 77844, 73800, 42181, 77843, 77839, 2060, 0, \r
+    78311, 11788, 65587, 68129, 10415, 74102, 0, 205, 0, 10351, 119076, 0, \r
+    9862, 6588, 43257, 64697, 73998, 41355, 5505, 119154, 5503, 8021, 0, \r
+    119150, 9819, 41357, 8011, 42885, 5507, 12044, 0, 0, 10026, 5472, 65108, \r
+    1191, 13106, 5470, 10329, 5476, 8991, 66322, 69778, 78267, 42874, 8550, \r
+    42876, 5592, 2919, 0, 2675, 5595, 78411, 0, 4367, 0, 0, 5478, 5904, 5594, \r
+    0, 74150, 7291, 5590, 77849, 13067, 118909, 120372, 0, 9731, 0, 64633, \r
+    77857, 77854, 77855, 77852, 77853, 77850, 10750, 43714, 77858, 74545, 0, \r
+    0, 12887, 10551, 194564, 77866, 77867, 77864, 77865, 9929, 5199, 9936, \r
+    1120, 42387, 0, 1444, 9486, 7554, 65839, 55252, 0, 1442, 0, 5894, 0, 0, \r
+    0, 0, 74313, 0, 13162, 0, 3334, 0, 118803, 77881, 66022, 0, 0, 1651, 0, \r
+    8861, 0, 0, 1142, 0, 8271, 0, 0, 0, 12903, 0, 4002, 43626, 10442, 10676, \r
+    3344, 0, 0, 12920, 194560, 0, 0, 66642, 1277, 0, 7871, 0, 0, 78853, 0, \r
+    78854, 120360, 0, 11784, 0, 78012, 4700, 66366, 78858, 120359, 11012, 0, \r
+    78856, 120358, 77879, 4973, 8784, 77877, 74804, 77874, 77869, 77871, \r
+    42440, 0, 43118, 0, 42364, 6774, 6773, 0, 120369, 10346, 10410, 78859, \r
+    9243, 2464, 0, 6108, 3372, 0, 6247, 43117, 74526, 0, 74166, 0, 120355, 0, \r
+    0, 0, 0, 0, 0, 0, 74217, 3354, 0, 4192, 9289, 118999, 41191, 3876, 0, 0, \r
+    120660, 43696, 43380, 0, 0, 0, 0, 11603, 0, 0, 6589, 0, 194679, 0, 0, 0, \r
+    0, 0, 42572, 0, 10630, 74827, 1963, 118889, 0, 11654, 0, 7550, 10686, \r
+    5903, 0, 78009, 41329, 9662, 917937, 64698, 3366, 10399, 0, 0, 11013, 0, \r
+    917933, 0, 78621, 194672, 6925, 0, 0, 917929, 0, 11568, 0, 917931, 64579, \r
+    917930, 7852, 0, 0, 6754, 6312, 0, 64672, 65296, 0, 118957, 0, 416, \r
+    12296, 68457, 73834, 68177, 11050, 10984, 0, 0, 0, 0, 0, 0, 9532, 66355, \r
+    0, 0, 917925, 64343, 195032, 0, 195031, 0, 0, 195057, 11445, 0, 195028, \r
+    195056, 195027, 10185, 1021, 0, 9507, 10210, 74544, 8023, 1200, 12243, \r
+    78001, 5282, 78003, 12540, 11545, 0, 120493, 3343, 4424, 11047, 1885, \r
+    43268, 3896, 78626, 66497, 2947, 392, 7894, 4391, 68139, 0, 13059, 74816, \r
+    77998, 3381, 7942, 0, 69219, 0, 64757, 0, 3913, 0, 0, 78235, 7044, 1265, \r
+    0, 6309, 7045, 7175, 7047, 78239, 11791, 0, 0, 8221, 78307, 41864, 0, 0, \r
+    0, 0, 167, 0, 78301, 0, 74211, 41897, 68477, 0, 917583, 0, 0, 2493, 0, \r
+    118811, 0, 0, 64354, 0, 8777, 0, 406, 8884, 2385, 0, 0, 0, 917573, 43030, \r
+    42027, 12114, 0, 917579, 64936, 0, 0, 120629, 10561, 0, 8365, 0, 0, \r
+    65841, 120787, 11601, 0, 74121, 0, 917575, 7834, 74159, 0, 0, 10298, \r
+    6624, 4908, 917596, 1639, 0, 0, 74157, 6327, 6724, 0, 0, 0, 0, 4817, \r
+    78446, 194759, 0, 7043, 9600, 11022, 0, 0, 0, 0, 0, 0, 7548, 64794, \r
+    42050, 12291, 55289, 194761, 12343, 657, 195054, 42705, 4461, 1134, 1838, \r
+    78438, 2057, 0, 4468, 0, 0, 0, 4456, 5206, 10720, 0, 42523, 127520, 0, 0, \r
+    917595, 65550, 260, 4816, 67658, 10687, 0, 4821, 4466, 0, 195043, 4818, \r
+    0, 41403, 119977, 0, 0, 41406, 43273, 74160, 119983, 73939, 119985, \r
+    119984, 119979, 41404, 1165, 119980, 4451, 13087, 0, 11284, 119987, \r
+    73855, 65155, 43014, 5439, 9363, 127558, 3375, 0, 5900, 0, 7889, 2722, \r
+    42262, 0, 0, 0, 0, 0, 0, 0, 11401, 0, 0, 68459, 0, 0, 0, 0, 65438, 0, \r
+    7280, 0, 0, 0, 4868, 119967, 119966, 0, 0, 0, 43161, 0, 119964, 0, 5182, \r
+    0, 120542, 0, 0, 4226, 120798, 12135, 5732, 4464, 0, 0, 977, 4458, 0, 0, \r
+    64770, 74838, 0, 344, 0, 194790, 1395, 64279, 0, 0, 0, 786, 0, 43174, \r
+    64340, 0, 0, 0, 43026, 7612, 10132, 64413, 0, 0, 0, 0, 0, 0, 68444, 0, \r
+    120734, 0, 119160, 10204, 0, 0, 0, 0, 1399, 0, 65217, 0, 8852, 0, 241, 0, \r
+    4907, 0, 0, 7932, 9727, 0, 74255, 8748, 0, 0, 0, 0, 42780, 0, 0, 0, 4217, \r
+    0, 8650, 0, 0, 0, 0, 118872, 43099, 3965, 119119, 6719, 0, 13300, 78439, \r
+    0, 43057, 66588, 118991, 0, 0, 73815, 4420, 0, 6410, 7760, 0, 0, 0, 0, 0, \r
+    7294, 0, 0, 0, 9066, 0, 11993, 43188, 2626, 7762, 0, 0, 0, 0, 42825, \r
+    41854, 5304, 0, 78516, 6919, 8619, 119655, 10038, 66454, 9592, 42851, \r
+    126993, 1542, 0, 0, 0, 0, 0, 74311, 78497, 0, 10181, 0, 43624, 0, 7779, \r
+    0, 10195, 9479, 6029, 0, 0, 9689, 0, 0, 8993, 66358, 0, 42378, 3368, 606, \r
+    0, 7697, 69237, 69787, 2030, 0, 6027, 8370, 4322, 0, 65207, 0, 0, 0, 0, \r
+    0, 2735, 42831, 77935, 127120, 74866, 8881, 119047, 0, 0, 73946, 0, 0, 0, \r
+    68140, 0, 9576, 0, 3347, 4160, 5154, 55288, 3794, 66564, 8530, 127063, \r
+    7709, 41112, 0, 66560, 42041, 4572, 12876, 66561, 0, 6758, 0, 1615, 5855, \r
+    809, 0, 0, 0, 0, 5799, 0, 0, 0, 7260, 0, 43031, 64425, 65128, 127061, \r
+    64386, 65257, 0, 68616, 120607, 9347, 0, 6532, 0, 0, 0, 0, 65828, 0, 283, \r
+    68665, 78813, 532, 78663, 0, 0, 120609, 0, 3370, 0, 11361, 5443, 78778, \r
+    8153, 73767, 0, 10741, 0, 0, 0, 0, 65495, 64706, 0, 43344, 0, 78870, \r
+    9466, 78866, 9824, 0, 0, 0, 0, 915, 43425, 0, 0, 0, 0, 0, 43264, 0, 0, 0, \r
+    0, 78864, 6730, 78862, 68161, 64550, 5186, 12890, 0, 0, 12108, 0, 65124, \r
+    43127, 66043, 0, 6326, 43107, 77826, 0, 42562, 0, 0, 0, 0, 11485, 6103, \r
+    127123, 0, 11718, 0, 12889, 0, 0, 0, 0, 0, 55245, 0, 1630, 0, 65483, 0, \r
+    12565, 0, 65476, 120013, 0, 119554, 9283, 7700, 917537, 9690, 65499, 0, \r
+    64593, 512, 3376, 68210, 0, 0, 77892, 632, 12940, 77891, 42529, 78587, 0, \r
+    5957, 0, 8926, 0, 0, 0, 10745, 10174, 7379, 64581, 5386, 120686, 11713, \r
+    10633, 120531, 5056, 0, 0, 0, 120773, 0, 9812, 0, 4460, 0, 0, 0, 0, 0, 0, \r
+    0, 64278, 0, 43466, 0, 0, 64389, 2953, 73879, 1801, 12835, 119029, 0, \r
+    73823, 0, 66375, 2085, 702, 42579, 77884, 77885, 13074, 77883, 0, 0, 0, \r
+    12106, 0, 74207, 1755, 10482, 12863, 77898, 1163, 2951, 9522, 74079, \r
+    78266, 120674, 0, 3384, 69227, 10702, 830, 77902, 77899, 77900, 8451, 0, \r
+    0, 0, 120762, 0, 0, 0, 0, 2908, 0, 43386, 64902, 4243, 0, 12239, 0, 0, \r
+    4441, 0, 0, 73940, 64352, 127513, 0, 411, 0, 0, 0, 4056, 118992, 41890, \r
+    0, 2730, 41604, 0, 5428, 194743, 3364, 42265, 0, 0, 118816, 194742, 9684, \r
+    216, 0, 1401, 0, 44012, 0, 0, 0, 9158, 77842, 120664, 5768, 0, 0, 0, 484, \r
+    0, 0, 0, 65895, 0, 0, 3338, 73935, 572, 7041, 2736, 67605, 0, 0, 2794, \r
+    8807, 64491, 77847, 5438, 5222, 5381, 43114, 0, 5193, 5125, 5456, 5509, \r
+    77846, 194747, 9534, 0, 0, 0, 3430, 0, 0, 0, 0, 981, 0, 4330, 73929, \r
+    120536, 1824, 10908, 0, 7034, 41683, 64617, 0, 73754, 3957, 64358, 64547, \r
+    0, 674, 63991, 0, 2946, 5354, 5251, 5328, 5307, 3759, 11411, 8364, 5123, \r
+    0, 5281, 5469, 5121, 119245, 0, 0, 5130, 0, 0, 77990, 0, 120726, 1221, \r
+    2733, 11746, 77991, 5216, 0, 0, 0, 0, 3468, 7033, 9230, 5939, 0, 0, 0, \r
+    120677, 68400, 7278, 10321, 10289, 64613, 10385, 41706, 0, 0, 0, 0, \r
+    11739, 0, 41981, 0, 5938, 0, 0, 12448, 7576, 10401, 10337, 73852, 0, \r
+    13057, 0, 126976, 0, 10009, 0, 64304, 0, 12165, 0, 0, 9885, 0, 8077, 0, \r
+    0, 0, 0, 0, 0, 0, 4220, 10725, 10433, 0, 68395, 4987, 64519, 0, 0, 0, 0, \r
+    0, 10970, 11733, 0, 120792, 0, 19944, 0, 9009, 8551, 0, 11468, 64636, \r
+    7575, 0, 2724, 0, 0, 12313, 119949, 515, 119947, 42791, 63987, 78286, \r
+    119943, 119940, 119941, 119938, 9775, 4046, 4589, 4521, 68629, 9141, 0, \r
+    78850, 2741, 64399, 6197, 1370, 0, 0, 0, 0, 0, 0, 6184, 8606, 3303, \r
+    41372, 11786, 9473, 66203, 66177, 0, 11593, 43007, 4478, 66178, 0, 0, \r
+    2744, 0, 4477, 118964, 814, 42066, 66183, 66204, 66194, 119961, 66198, \r
+    41880, 66188, 66197, 78148, 11955, 66190, 66191, 41111, 66189, 73788, \r
+    7788, 4847, 0, 0, 0, 0, 0, 1581, 6535, 78161, 12954, 430, 78160, 55259, \r
+    78158, 194938, 5278, 4945, 42883, 4950, 0, 68625, 0, 7269, 0, 5964, \r
+    12908, 0, 0, 74764, 74477, 119146, 194936, 4949, 0, 443, 0, 4944, 5467, \r
+    119603, 0, 65137, 6044, 65392, 0, 4213, 0, 41303, 0, 194931, 0, 41306, \r
+    73984, 2698, 127531, 0, 12072, 3193, 0, 41304, 824, 0, 12091, 78893, \r
+    78894, 119816, 4673, 64804, 4678, 119820, 119819, 65059, 0, 6739, 0, \r
+    5481, 3490, 1199, 119811, 8356, 119829, 119832, 4677, 12688, 3102, 0, \r
+    4672, 78173, 78175, 5531, 68367, 42575, 78170, 78166, 4674, 4548, 44005, \r
+    0, 68658, 119946, 8025, 68630, 127024, 1855, 0, 68669, 0, 119942, 127554, \r
+    0, 0, 119652, 2745, 11797, 0, 0, 68643, 4654, 0, 0, 68638, 73993, 10525, \r
+    4649, 65209, 0, 0, 4648, 43080, 0, 0, 0, 6246, 64950, 7828, 4650, 6777, \r
+    6776, 6775, 4653, 7822, 78005, 0, 43187, 8669, 0, 6821, 65093, 0, 78881, \r
+    2716, 0, 0, 0, 0, 68369, 0, 11060, 8547, 2711, 42165, 78027, 78026, 7992, \r
+    0, 0, 4662, 78033, 78032, 9149, 9146, 599, 2081, 78031, 78030, 194962, \r
+    4656, 10130, 68450, 7811, 40994, 194965, 6414, 5967, 4658, 3725, 5713, \r
+    5814, 4661, 42434, 0, 0, 0, 64904, 9026, 10833, 74864, 7547, 4867, 0, \r
+    10008, 10222, 3054, 194956, 9744, 78860, 7605, 4622, 119656, 0, 0, 0, 0, \r
+    0, 9045, 78888, 4225, 19926, 78887, 12880, 65307, 4617, 78883, 0, 41732, \r
+    4616, 10518, 10423, 10359, 0, 5958, 0, 0, 4215, 9789, 917941, 4321, 4621, \r
+    0, 41313, 522, 5368, 0, 65803, 0, 5366, 12201, 5372, 0, 0, 0, 7720, 7390, \r
+    2696, 0, 0, 4638, 0, 1790, 78242, 5965, 64363, 66569, 68646, 194968, \r
+    5376, 1835, 5335, 194966, 0, 4633, 0, 68119, 1180, 4632, 0, 5387, 5333, \r
+    0, 0, 42094, 5331, 4634, 11928, 0, 5338, 4637, 0, 5971, 42414, 0, 1268, \r
+    65097, 42361, 0, 0, 73853, 1427, 0, 0, 5970, 3431, 0, 10358, 10422, 4758, \r
+    0, 1608, 2738, 0, 10455, 4753, 74026, 11344, 4222, 6240, 5231, 74384, 0, \r
+    68377, 6248, 0, 0, 0, 42318, 0, 5229, 4757, 0, 0, 2728, 4752, 64563, \r
+    65235, 5234, 0, 0, 0, 10713, 0, 0, 2622, 7460, 0, 0, 0, 8954, 74760, \r
+    65189, 2632, 0, 10108, 1011, 5574, 1853, 2709, 65139, 5577, 0, 0, 118871, \r
+    68641, 8965, 7635, 42177, 5316, 0, 5314, 6451, 5572, 0, 5312, 0, 5525, \r
+    5330, 5319, 0, 0, 194907, 44003, 0, 0, 0, 120498, 0, 195009, 0, 74022, 0, \r
+    64609, 0, 120634, 0, 5721, 0, 5519, 8632, 66465, 11267, 73961, 0, 5720, \r
+    0, 1692, 4219, 4610, 8696, 4305, 0, 4609, 43478, 4614, 541, 0, 5287, \r
+    5309, 5285, 68389, 5961, 4647, 56, 4216, 10577, 41381, 601, 4613, 0, 0, \r
+    0, 4608, 64260, 41124, 5190, 67628, 0, 68145, 7086, 0, 119243, 67620, 0, \r
+    2734, 11074, 0, 67627, 43593, 0, 67625, 5960, 0, 8992, 65293, 0, 1782, \r
+    67622, 68114, 119939, 0, 68180, 5501, 119952, 42508, 7442, 43665, 359, \r
+    41253, 68392, 6239, 119956, 41256, 0, 68134, 0, 74209, 0, 9346, 118904, \r
+    41254, 0, 43291, 3767, 5737, 0, 4865, 0, 5740, 917997, 5736, 4368, 0, \r
+    7193, 68137, 0, 5739, 41024, 4866, 0, 73904, 0, 4869, 120563, 0, 4223, 0, \r
+    6650, 0, 0, 0, 0, 4870, 0, 68661, 6716, 78176, 68667, 68382, 68676, 0, \r
+    10122, 4864, 66568, 4144, 7937, 0, 6245, 68652, 2732, 42734, 745, 0, \r
+    195097, 0, 4777, 7821, 0, 68631, 42775, 0, 194954, 0, 3097, 0, 5966, 0, \r
+    4778, 0, 10863, 0, 4781, 0, 64407, 0, 0, 8577, 0, 68196, 43285, 10216, \r
+    4782, 0, 0, 120757, 68618, 12325, 43056, 8717, 0, 0, 4776, 0, 11492, \r
+    8700, 0, 13176, 68363, 10426, 0, 917599, 10362, 0, 1715, 4849, 8242, \r
+    9561, 73922, 43278, 42635, 0, 0, 5963, 917926, 0, 0, 4850, 0, 1607, 466, \r
+    4853, 118995, 4854, 0, 5164, 0, 1350, 5124, 64420, 1993, 5362, 8471, \r
+    2708, 0, 12445, 3785, 234, 3199, 0, 41268, 4848, 2530, 917909, 2068, \r
+    1964, 0, 73762, 10458, 0, 8576, 78543, 0, 2704, 4794, 0, 68211, 8322, \r
+    4797, 5753, 0, 2694, 4792, 0, 2439, 65104, 69804, 0, 303, 0, 0, 0, 2437, \r
+    0, 4221, 4844, 118869, 0, 0, 0, 0, 0, 43292, 0, 2441, 10739, 65090, 0, \r
+    119327, 0, 2451, 2714, 119326, 0, 43379, 4937, 43376, 753, 5849, 10597, \r
+    43089, 11722, 9248, 0, 42879, 11725, 0, 0, 2726, 3107, 73958, 4941, \r
+    64937, 119233, 9140, 1408, 5261, 4607, 0, 181, 0, 4942, 9539, 4938, 0, \r
+    65201, 5259, 9369, 64185, 4142, 5257, 0, 0, 4964, 5264, 64178, 64177, \r
+    12979, 41411, 64182, 64181, 64180, 64179, 9482, 4873, 41231, 1822, 42526, \r
+    0, 12758, 3865, 0, 0, 10500, 0, 0, 78028, 0, 9830, 43642, 389, 10893, \r
+    7521, 0, 4872, 5463, 0, 3125, 9567, 0, 4878, 5459, 4604, 0, 9557, 5465, \r
+    68617, 0, 11494, 0, 9563, 10865, 74570, 43279, 64186, 0, 78714, 64191, \r
+    64190, 8898, 64188, 0, 41030, 78836, 0, 917835, 78820, 917834, 0, 78805, \r
+    41031, 78801, 11960, 6745, 3082, 0, 78539, 73919, 10573, 41744, 7079, \r
+    5856, 127043, 5163, 78809, 0, 1817, 66724, 78538, 0, 10564, 7763, 13077, \r
+    41813, 4400, 41745, 64207, 10275, 8925, 10371, 10307, 41814, 4248, 0, 0, \r
+    4541, 6299, 64204, 64203, 64201, 64200, 64199, 64198, 0, 42156, 78688, 0, \r
+    64193, 64192, 78000, 9943, 64197, 64196, 64195, 64194, 13282, 64175, \r
+    64174, 64173, 78189, 846, 78186, 9965, 0, 0, 0, 0, 2543, 12163, 3108, \r
+    9745, 64167, 64166, 64165, 64164, 2110, 0, 64169, 64168, 64949, 10972, \r
+    10251, 10247, 42768, 715, 64161, 43299, 9453, 5348, 10943, 120378, 0, \r
+    11352, 550, 9910, 0, 0, 66579, 11551, 0, 0, 9504, 7187, 0, 10373, 0, \r
+    120791, 10261, 10253, 6404, 10277, 78183, 11984, 1552, 65222, 6998, \r
+    78180, 0, 3128, 4789, 5067, 5066, 118849, 4784, 0, 8827, 1146, 5065, \r
+    78196, 78192, 68136, 78190, 43412, 5064, 2431, 0, 9450, 1809, 0, 78200, \r
+    78201, 5062, 1264, 64817, 13254, 11697, 0, 9785, 64716, 0, 3933, 74559, \r
+    4740, 7954, 0, 0, 42609, 0, 74175, 0, 127016, 0, 0, 42130, 0, 5151, \r
+    917829, 917823, 0, 0, 0, 7620, 3800, 65122, 0, 0, 8355, 7854, 0, 954, \r
+    64927, 4185, 41045, 0, 41438, 41439, 68666, 10711, 4593, 0, 120584, 0, \r
+    64774, 8053, 10532, 66727, 0, 0, 0, 64759, 6381, 5166, 9888, 0, 5148, \r
+    42834, 0, 78205, 78206, 64140, 78204, 64131, 3119, 917814, 0, 3060, \r
+    64135, 9986, 0, 77876, 636, 11698, 0, 0, 9916, 11701, 7836, 42741, 64137, \r
+    8320, 78640, 8863, 0, 119960, 1477, 43289, 0, 74358, 8618, 0, 9908, 0, 0, \r
+    0, 3937, 12312, 0, 0, 0, 64781, 912, 6349, 4536, 119963, 74532, 0, 6244, \r
+    0, 194580, 3935, 120665, 0, 0, 11950, 5392, 42248, 65129, 68656, 5397, 0, \r
+    12046, 12599, 0, 0, 5395, 0, 5393, 354, 68615, 119948, 78503, 0, 0, \r
+    42039, 0, 0, 64142, 626, 0, 5895, 0, 0, 5780, 0, 0, 0, 0, 0, 43297, 0, \r
+    4311, 4644, 8818, 0, 0, 0, 73818, 3918, 66452, 3797, 1644, 119944, 9658, \r
+    4140, 11385, 65947, 6455, 9030, 813, 119945, 68131, 4146, 119957, 5360, \r
+    2466, 0, 67669, 0, 6249, 42117, 0, 0, 0, 0, 74046, 120583, 4911, 988, \r
+    917807, 0, 0, 43061, 7054, 64147, 0, 64920, 68195, 6698, 118933, 120349, \r
+    0, 0, 11981, 12202, 0, 11032, 67654, 6093, 11608, 975, 68662, 65843, 170, \r
+    0, 0, 4169, 0, 41859, 6058, 120401, 13203, 120657, 0, 0, 68657, 9818, \r
+    10178, 10324, 42106, 5898, 74540, 4738, 41856, 7062, 917865, 4737, 11779, \r
+    4742, 120564, 917866, 73736, 0, 9825, 6448, 6715, 127008, 4831, 0, 0, 0, \r
+    5300, 4741, 42108, 0, 64159, 4736, 64148, 0, 849, 0, 78491, 43288, 0, \r
+    66620, 0, 194920, 65549, 9496, 64598, 118866, 0, 7876, 68132, 917872, \r
+    3928, 917870, 43378, 10706, 7198, 0, 4842, 12053, 0, 0, 4841, 0, 4171, \r
+    12008, 6251, 3923, 1490, 0, 119591, 0, 40972, 5245, 0, 10114, 42001, \r
+    41888, 4845, 8332, 40974, 64347, 4840, 9077, 78346, 1747, 917849, 4825, \r
+    69240, 917852, 68655, 0, 0, 0, 0, 68628, 0, 9850, 118937, 367, 1472, \r
+    917859, 6687, 1274, 0, 5905, 12339, 8919, 73953, 10907, 65261, 11023, \r
+    119559, 4830, 9134, 78666, 64126, 43011, 0, 0, 64101, 0, 0, 4824, 10614, \r
+    120390, 0, 1888, 1960, 7861, 917856, 78524, 41836, 43012, 6052, 6064, 54, \r
+    43009, 12214, 0, 6211, 0, 358, 41997, 41833, 11442, 10758, 65774, 0, \r
+    120384, 64115, 120385, 0, 0, 0, 119053, 0, 12765, 64118, 126998, 12962, \r
+    0, 0, 4017, 12827, 5241, 120392, 0, 41118, 3924, 0, 11366, 917843, 0, 0, \r
+    917846, 41116, 917844, 917564, 0, 11363, 12057, 11917, 1567, 74000, 4721, \r
+    0, 66202, 8957, 4139, 0, 0, 0, 0, 0, 12740, 0, 4722, 6816, 0, 12759, \r
+    4725, 0, 4726, 0, 0, 0, 917904, 917905, 0, 12755, 12762, 4015, 0, 8052, \r
+    476, 0, 0, 0, 64212, 41020, 1382, 64209, 64216, 64215, 64214, 1656, \r
+    41831, 0, 0, 41843, 8720, 3908, 1452, 13111, 0, 64067, 0, 8552, 64113, \r
+    41845, 3849, 78732, 66232, 9778, 120066, 5891, 7064, 55, 9948, 917911, 0, \r
+    0, 7935, 67586, 0, 1114, 0, 67585, 78675, 120053, 120050, 120051, 3938, \r
+    120057, 65417, 64717, 120060, 120061, 65415, 120059, 6292, 65303, 7955, \r
+    6452, 4713, 917887, 66249, 917885, 917890, 917891, 65152, 719, 120044, \r
+    78623, 120042, 6713, 4532, 65412, 69822, 10868, 4717, 2349, 5902, 66450, \r
+    4712, 917902, 917899, 917900, 65416, 8155, 4718, 3942, 4714, 9625, 0, \r
+    6383, 0, 12006, 0, 0, 0, 0, 0, 65414, 6454, 1229, 0, 66437, 66025, 78699, \r
+    0, 42500, 120508, 4809, 9623, 917874, 78694, 917880, 917877, 917878, \r
+    65405, 68159, 917881, 917882, 5365, 4545, 8901, 917566, 119555, 4813, 0, \r
+    0, 5925, 4808, 64330, 0, 65475, 118940, 0, 4814, 0, 4810, 0, 0, 64928, \r
+    10543, 0, 3522, 0, 414, 65404, 0, 0, 6456, 73820, 0, 6691, 42193, 0, 0, \r
+    0, 74495, 0, 0, 0, 118820, 9751, 65407, 0, 11770, 3919, 0, 0, 65061, 0, \r
+    0, 0, 12235, 0, 0, 195025, 64092, 0, 64080, 0, 64090, 0, 0, 10162, 10310, \r
+    0, 8454, 0, 42038, 387, 41363, 12737, 0, 4780, 43368, 0, 64310, 64621, \r
+    6732, 0, 0, 0, 0, 0, 8896, 0, 375, 6976, 66582, 119005, 0, 0, 0, 119202, \r
+    119203, 12526, 43120, 2315, 0, 1938, 119197, 0, 4529, 119200, 119201, \r
+    119198, 119199, 0, 0, 0, 13150, 64492, 0, 0, 0, 12902, 0, 42891, 66327, \r
+    74298, 0, 10799, 0, 2587, 66372, 0, 4193, 120334, 4241, 0, 7998, 0, 0, 0, \r
+    0, 2316, 118821, 0, 0, 0, 64297, 74799, 0, 74140, 0, 5373, 0, 0, 3762, \r
+    10015, 0, 119232, 0, 41590, 0, 0, 3780, 7485, 5779, 0, 42037, 0, 3906, \r
+    12349, 0, 8326, 0, 65498, 3763, 6983, 5618, 0, 3779, 0, 43613, 0, 0, 0, \r
+    0, 0, 0, 280, 74558, 0, 68138, 13072, 1894, 0, 0, 65478, 43310, 7231, 0, \r
+    11773, 0, 0, 0, 0, 2551, 0, 6453, 10200, 6235, 0, 119237, 0, 0, 4470, \r
+    119613, 0, 7780, 5369, 118958, 5249, 0, 5367, 8756, 0, 0, 5377, 120585, \r
+    68143, 1688, 78245, 0, 0, 0, 0, 0, 44020, 6808, 41319, 1300, 10650, \r
+    41692, 64505, 4668, 0, 119624, 1465, 10850, 3943, 0, 41205, 41315, 0, 0, \r
+    0, 5352, 0, 0, 8839, 41314, 7384, 7785, 41204, 0, 41209, 0, 0, 43607, 0, \r
+    0, 5420, 3897, 0, 0, 74417, 4018, 0, 68127, 0, 0, 0, 0, 127526, 2561, \r
+    68621, 3542, 41915, 12076, 7951, 68152, 118857, 5303, 6276, 1706, 0, \r
+    78751, 74116, 0, 65150, 41819, 0, 73951, 10847, 41822, 9985, 860, 0, \r
+    10506, 0, 0, 10753, 10830, 0, 615, 64490, 7574, 0, 77922, 0, 12909, \r
+    43016, 64559, 127028, 0, 0, 0, 2020, 0, 4022, 0, 0, 77923, 0, 41691, 0, \r
+    0, 74329, 0, 64622, 9070, 0, 68411, 3911, 42829, 43122, 1033, 74440, 0, \r
+    7000, 3904, 0, 0, 0, 0, 127012, 13123, 10846, 3450, 0, 7397, 118807, 0, \r
+    42778, 10000, 41088, 449, 0, 3777, 68458, 0, 9636, 0, 10738, 0, 9367, \r
+    593, 41085, 3999, 65226, 41713, 12764, 0, 64409, 3596, 0, 0, 9763, \r
+    120280, 120283, 12347, 124, 12981, 41127, 2092, 0, 0, 0, 0, 10820, 43987, \r
+    0, 0, 1769, 41715, 2463, 78489, 0, 12770, 0, 1538, 0, 43124, 0, 195058, \r
+    7795, 120300, 0, 4828, 1258, 0, 2006, 0, 0, 9498, 127032, 127033, 120289, \r
+    120288, 3939, 120290, 8846, 8943, 120287, 120286, 2650, 4491, 1961, \r
+    42602, 11525, 120292, 1959, 120294, 55228, 11774, 41016, 0, 68675, 0, \r
+    1511, 9324, 78211, 10519, 66331, 3454, 19930, 0, 41019, 0, 0, 65292, \r
+    6822, 12862, 0, 0, 42143, 41828, 78207, 65531, 78208, 118879, 55223, 0, \r
+    0, 41826, 8865, 6402, 0, 13279, 7917, 120340, 0, 7733, 0, 4998, 0, 0, \r
+    41950, 0, 4268, 0, 0, 0, 4013, 0, 10881, 0, 0, 0, 74788, 2014, 0, 0, \r
+    9765, 0, 0, 0, 195059, 78357, 65281, 0, 10949, 0, 0, 0, 2015, 0, 0, 0, \r
+    66318, 43233, 0, 42517, 0, 0, 0, 12698, 8094, 43445, 65909, 6474, 794, 0, \r
+    12656, 0, 119353, 0, 1665, 0, 4833, 0, 119351, 0, 0, 189, 12611, 0, 0, \r
+    2859, 4838, 0, 4834, 65078, 0, 0, 4837, 0, 770, 0, 811, 0, 41042, 917551, \r
+    41318, 64427, 0, 0, 78848, 3895, 0, 74341, 3976, 0, 42859, 10193, 3116, \r
+    7747, 0, 0, 0, 0, 0, 43686, 78846, 41877, 0, 2871, 64614, 0, 999, 0, \r
+    6345, 41876, 2663, 2017, 0, 0, 11040, 10150, 0, 64308, 1522, 597, 4775, \r
+    12555, 12571, 12550, 12583, 12560, 2019, 12556, 12584, 3092, 0, 12562, \r
+    4783, 12566, 12569, 12554, 0, 10812, 78851, 0, 0, 3078, 1402, 0, 0, 0, 0, \r
+    119248, 394, 3088, 0, 0, 0, 3991, 64391, 0, 0, 424, 66328, 1999, 0, \r
+    73914, 0, 0, 0, 0, 42231, 8246, 0, 0, 0, 41840, 0, 2377, 1298, 64011, \r
+    12572, 11318, 12557, 12559, 12570, 8488, 1003, 2373, 9446, 7481, 9448, \r
+    48, 0, 9480, 481, 0, 9438, 9439, 9440, 9441, 8465, 9443, 9444, 9445, \r
+    9430, 9431, 9432, 9433, 9434, 9435, 3984, 9437, 0, 0, 9424, 9425, 9426, \r
+    9427, 9428, 9429, 64758, 0, 9655, 0, 2004, 9096, 9782, 0, 9172, 0, 19965, \r
+    0, 5955, 67666, 1108, 0, 74773, 0, 0, 64782, 3926, 0, 65210, 8798, 0, 0, \r
+    1392, 0, 0, 917557, 10606, 8065, 118805, 10353, 10417, 0, 0, 64524, 0, \r
+    4019, 0, 0, 43280, 8219, 68402, 1812, 0, 0, 0, 0, 42410, 74448, 119132, \r
+    6054, 10697, 3169, 42297, 42322, 10642, 3909, 9950, 0, 0, 0, 68678, 0, 0, \r
+    1049, 0, 65707, 2304, 41806, 0, 42336, 3921, 0, 11775, 64760, 11766, \r
+    1038, 42303, 9823, 127278, 69236, 4008, 64004, 8773, 10733, 36, 0, 5153, \r
+    41805, 0, 73735, 763, 41808, 64910, 0, 2009, 0, 0, 0, 9640, 119951, 0, \r
+    120695, 8621, 0, 12852, 3031, 0, 64361, 0, 182, 194718, 0, 0, 119950, 0, \r
+    9058, 366, 0, 9892, 5969, 11754, 10848, 4570, 65301, 44013, 4255, 0, \r
+    10102, 41189, 4003, 41026, 68109, 13293, 41192, 0, 0, 42251, 0, 42534, \r
+    65179, 11287, 6128, 0, 11034, 10923, 64423, 0, 65506, 0, 0, 74083, 0, \r
+    9932, 0, 0, 119955, 0, 9817, 0, 120140, 0, 12117, 66586, 4183, 10540, \r
+    66250, 9063, 127045, 0, 119954, 0, 12897, 3792, 2011, 0, 6065, 43160, 0, \r
+    194715, 8692, 41186, 41816, 41023, 41818, 41187, 11659, 7922, 12614, \r
+    2005, 8523, 78002, 0, 7513, 1863, 4710, 0, 5956, 7621, 78006, 127116, \r
+    4705, 716, 78004, 0, 4704, 120040, 120270, 42241, 161, 43977, 74546, \r
+    66214, 4706, 0, 0, 42672, 4709, 10680, 0, 43293, 0, 0, 119164, 120328, 0, \r
+    0, 1700, 119223, 0, 0, 0, 4004, 0, 10968, 43296, 0, 8506, 0, 0, 126996, \r
+    1005, 937, 78216, 4734, 2870, 0, 78218, 0, 7463, 4729, 0, 235, 1384, \r
+    4728, 0, 120420, 120644, 120421, 8109, 43105, 0, 4730, 447, 13186, 1513, \r
+    4733, 120415, 0, 0, 42527, 12911, 43427, 1383, 8565, 2469, 120024, 6690, \r
+    6156, 68117, 43439, 7993, 4288, 120416, 2674, 13238, 11922, 0, 120330, \r
+    3510, 13234, 0, 120407, 5605, 42095, 11364, 0, 1380, 65617, 120253, \r
+    120261, 13196, 13197, 120309, 120682, 9495, 119346, 0, 5959, 0, 73976, \r
+    120305, 43371, 6941, 119349, 13205, 13211, 5801, 12769, 65905, 41697, \r
+    1283, 120302, 4779, 0, 3719, 4006, 0, 19957, 0, 2021, 119332, 0, 0, \r
+    43028, 65493, 41838, 3875, 5962, 64341, 119339, 9814, 43457, 5827, 3314, \r
+    7787, 78234, 65494, 68153, 0, 0, 120636, 64531, 120692, 0, 0, 0, 66316, \r
+    65467, 5771, 41298, 0, 9742, 521, 0, 10800, 0, 8404, 194625, 483, 7096, \r
+    7089, 66323, 928, 0, 0, 119018, 10599, 11586, 3989, 10971, 0, 65782, \r
+    9841, 8843, 12145, 0, 10074, 78548, 0, 3769, 0, 0, 0, 0, 9573, 0, 65290, \r
+    8849, 0, 65855, 65112, 1796, 120505, 0, 78555, 8164, 41301, 3502, 0, \r
+    7388, 10621, 73838, 78553, 5825, 13007, 68165, 0, 120457, 12661, 7608, \r
+    10354, 10418, 42411, 2022, 0, 1409, 12195, 4001, 3112, 10824, 120639, \r
+    1390, 0, 0, 421, 43536, 5846, 120120, 4130, 0, 7595, 42588, 7600, 120121, \r
+    66035, 0, 0, 65851, 42607, 0, 0, 3168, 0, 42134, 0, 2370, 2846, 0, 0, 0, \r
+    120132, 0, 1836, 0, 0, 119137, 3740, 0, 6290, 65374, 120451, 65923, 3944, \r
+    66628, 120434, 0, 6135, 3118, 74265, 119093, 120446, 0, 0, 8127, 8975, \r
+    64739, 7943, 0, 0, 10618, 2584, 0, 0, 0, 9998, 0, 0, 0, 0, 0, 6204, 0, 0, \r
+    8279, 8776, 64954, 4975, 74809, 120130, 4267, 0, 42206, 0, 0, 195046, \r
+    65700, 66562, 0, 64645, 0, 0, 0, 12586, 0, 9242, 0, 0, 4523, 5842, 10495, \r
+    3122, 0, 7793, 78275, 9328, 0, 0, 12604, 0, 6615, 67650, 0, 3986, 44025, \r
+    0, 8912, 64555, 7409, 0, 0, 9541, 78276, 0, 11275, 8540, 11498, 0, 0, \r
+    41040, 2459, 0, 13060, 41041, 74413, 0, 0, 0, 68427, 10450, 12551, 41043, \r
+    7020, 120353, 3765, 0, 0, 1606, 120348, 120351, 3093, 68436, 0, 0, \r
+    120649, 0, 0, 4312, 74091, 120337, 120336, 11923, 4023, 120333, 5763, \r
+    120335, 4827, 10894, 12810, 64406, 118785, 4455, 74321, 433, 119620, \r
+    66660, 2499, 0, 0, 0, 11973, 13089, 4293, 120329, 42224, 42758, 12196, \r
+    42837, 42226, 119319, 0, 119126, 5817, 0, 55277, 3120, 9797, 0, 0, 0, \r
+    10389, 0, 0, 4895, 65358, 0, 4359, 585, 0, 3509, 0, 486, 4290, 5758, 0, \r
+    0, 0, 7004, 0, 65880, 0, 119048, 2380, 11380, 0, 0, 2376, 0, 917847, 0, \r
+    5197, 127046, 127047, 127048, 2366, 127050, 127051, 120554, 120045, 0, 0, \r
+    0, 0, 0, 0, 0, 74188, 0, 0, 0, 120047, 0, 0, 0, 120049, 0, 1847, 0, \r
+    10339, 0, 42384, 0, 4227, 74158, 0, 0, 43032, 0, 42365, 0, 12671, 11384, \r
+    0, 0, 0, 64797, 0, 5820, 0, 120052, 120065, 0, 120064, 120650, 42137, \r
+    9893, 2754, 12664, 120063, 0, 7377, 0, 41799, 65530, 1711, 12984, 43039, \r
+    3114, 6255, 0, 118938, 0, 10853, 926, 0, 74184, 0, 120055, 0, 43175, 0, \r
+    43037, 41798, 41035, 11583, 0, 41801, 119088, 0, 520, 4200, 12699, 8331, \r
+    0, 3091, 41034, 127353, 0, 8360, 0, 78044, 321, 4229, 64543, 0, 65563, 0, \r
+    917974, 2861, 0, 10095, 0, 0, 0, 1861, 0, 0, 0, 0, 43041, 0, 0, 0, 3859, \r
+    12181, 41660, 8209, 0, 73867, 12973, 0, 74757, 127514, 41658, 0, 0, 5760, \r
+    0, 743, 4414, 120766, 0, 42632, 917973, 65161, 73896, 0, 0, 1405, 119063, \r
+    43220, 43341, 0, 19919, 0, 64532, 65367, 43710, 0, 0, 3513, 0, 118883, \r
+    43342, 119064, 65529, 65364, 0, 0, 6485, 1397, 0, 41986, 0, 0, 0, 74097, \r
+    0, 7471, 12079, 0, 12682, 43287, 0, 0, 0, 0, 0, 0, 1099, 10490, 0, 10501, \r
+    65181, 74463, 0, 464, 41624, 65283, 67663, 78222, 1346, 0, 917631, 64724, \r
+    64897, 423, 1818, 65144, 0, 8272, 0, 19911, 4218, 3087, 64960, 127234, \r
+    43564, 0, 0, 9584, 10465, 0, 74359, 12626, 9106, 0, 42642, 0, 64750, \r
+    9390, 0, 41797, 0, 0, 265, 41795, 64666, 0, 43530, 2752, 0, 0, 0, 59, 0, \r
+    0, 0, 0, 77873, 41810, 0, 7010, 0, 41809, 41495, 119364, 0, 42252, 42213, \r
+    8009, 3305, 43033, 511, 119320, 66255, 13127, 120067, 0, 0, 0, 917977, \r
+    65915, 1400, 41812, 10685, 194870, 2103, 10387, 4453, 43276, 917783, \r
+    13159, 0, 6481, 41213, 0, 0, 0, 0, 41983, 74198, 6617, 9116, 119654, 0, \r
+    462, 68110, 10493, 0, 8129, 0, 0, 74471, 6644, 11658, 0, 0, 3452, 11906, \r
+    9581, 1385, 3098, 0, 119013, 43340, 0, 41033, 6493, 42626, 0, 0, 11426, \r
+    0, 1681, 118789, 1204, 3755, 64661, 7235, 10170, 3966, 8911, 0, 41841, \r
+    43338, 0, 0, 5726, 64915, 42175, 0, 0, 41497, 65044, 0, 2851, 43017, 0, \r
+    0, 4373, 78058, 0, 9587, 1789, 6671, 0, 3100, 0, 65360, 0, 127510, 0, \r
+    64922, 0, 8190, 12083, 0, 0, 6506, 64312, 74374, 2368, 0, 4419, 0, \r
+    119125, 3439, 1825, 1192, 120106, 8891, 3080, 120228, 2347, 5430, 0, \r
+    8990, 2848, 0, 0, 0, 249, 0, 0, 0, 120658, 0, 0, 8883, 917802, 728, \r
+    68178, 995, 0, 0, 64826, 0, 917798, 0, 0, 19945, 8091, 558, 0, 12273, \r
+    194814, 0, 12112, 0, 0, 0, 74419, 12335, 120104, 917795, 3443, 3129, 0, \r
+    2102, 65445, 78258, 64891, 0, 7725, 0, 78255, 0, 8624, 69246, 12446, \r
+    43295, 0, 41894, 0, 6277, 41672, 41893, 10010, 0, 3540, 0, 835, 0, 69816, \r
+    119868, 74408, 0, 73959, 5426, 4258, 0, 0, 5424, 0, 8283, 0, 5434, 0, 0, \r
+    19917, 11408, 0, 11947, 0, 1404, 3095, 11432, 194813, 3464, 6486, 4819, \r
+    0, 0, 570, 8095, 3672, 119864, 1498, 67866, 0, 0, 431, 0, 0, 0, 0, 68167, \r
+    0, 13096, 0, 0, 43408, 9516, 0, 5268, 42230, 42220, 0, 4450, 120723, \r
+    11547, 43417, 0, 356, 3477, 227, 10488, 68203, 382, 11418, 0, 0, 0, 0, 0, \r
+    0, 6484, 2541, 66039, 0, 78718, 0, 3549, 0, 9110, 119665, 2743, 0, 43290, \r
+    194812, 9097, 0, 43015, 8782, 0, 776, 2524, 42707, 8573, 0, 0, 0, 0, \r
+    42694, 64944, 8952, 3856, 118818, 0, 5872, 6495, 0, 0, 0, 0, 0, 120733, \r
+    12849, 3953, 1897, 0, 65094, 11994, 4339, 74556, 0, 67843, 0, 0, 0, \r
+    68473, 74104, 5228, 0, 7868, 43184, 0, 0, 73986, 43438, 0, 43022, 0, \r
+    1162, 0, 2671, 0, 0, 0, 0, 118865, 4553, 73811, 0, 195005, 0, 0, 19921, \r
+    74331, 11424, 195006, 4567, 41891, 0, 0, 55249, 4820, 65239, 194662, 0, \r
+    0, 43042, 119212, 1377, 12869, 4897, 42821, 9250, 0, 4438, 64385, 0, \r
+    1753, 11331, 6147, 194941, 43282, 8833, 0, 0, 6504, 78408, 126979, 10719, \r
+    0, 1898, 1413, 42443, 0, 802, 12141, 0, 194671, 6648, 10671, 2528, 0, \r
+    64789, 9169, 838, 127092, 120697, 844, 5014, 0, 256, 0, 9990, 0, 42739, \r
+    0, 7542, 65464, 9726, 0, 6489, 10048, 74326, 78719, 66573, 0, 78724, \r
+    78712, 11761, 194655, 0, 41094, 0, 0, 0, 0, 0, 6196, 6945, 194628, \r
+    194890, 194631, 120491, 11816, 194943, 5733, 0, 0, 0, 41098, 0, 41093, 0, \r
+    66626, 588, 9760, 0, 194717, 1238, 200, 0, 1660, 73916, 0, 118905, 74362, \r
+    0, 0, 194651, 0, 0, 3394, 194894, 120668, 0, 0, 0, 66219, 0, 43284, \r
+    194657, 7817, 1841, 11055, 120533, 194979, 194982, 1669, 10776, 194981, \r
+    7701, 194980, 0, 194995, 1732, 4030, 0, 3963, 66611, 127530, 41768, 6491, \r
+    0, 65324, 914, 65323, 8071, 3538, 0, 78713, 65328, 0, 74367, 7614, 0, \r
+    11819, 0, 12009, 12399, 0, 67852, 65537, 0, 10841, 43430, 5301, 0, 0, \r
+    5734, 8960, 0, 127527, 65317, 77880, 0, 0, 0, 12304, 0, 0, 65315, 0, 0, \r
+    0, 0, 0, 119621, 0, 74536, 12447, 64486, 0, 0, 0, 0, 0, 0, 42767, 10915, \r
+    0, 12007, 43695, 120520, 11975, 194878, 0, 0, 2555, 8629, 0, 43168, \r
+    41872, 43706, 4496, 194879, 0, 0, 0, 0, 0, 0, 64730, 0, 66714, 68222, 0, \r
+    0, 65596, 0, 11416, 4280, 67655, 8765, 12784, 7792, 1393, 127242, 67871, \r
+    74386, 0, 8233, 43572, 0, 6683, 0, 3442, 12144, 2841, 12543, 0, 1473, \r
+    42820, 64329, 917772, 0, 68642, 6488, 357, 1048, 41100, 0, 41104, 0, \r
+    41099, 1054, 119065, 1040, 65450, 0, 4434, 1069, 0, 118862, 74231, \r
+    917765, 0, 0, 0, 9693, 41943, 0, 41931, 41759, 12757, 4353, 0, 1059, \r
+    9790, 8995, 0, 0, 65937, 0, 41764, 10646, 0, 118833, 0, 0, 74830, 78569, \r
+    12743, 0, 6480, 917761, 41779, 42580, 66601, 12207, 119619, 6335, 66602, \r
+    11312, 64807, 0, 0, 41767, 0, 0, 43020, 0, 3955, 74254, 0, 0, 917861, 0, \r
+    77926, 9770, 9246, 12230, 0, 0, 0, 10448, 41783, 41786, 127093, 12797, \r
+    2755, 64571, 78578, 194927, 4857, 0, 4428, 12794, 73755, 0, 78574, 0, 0, \r
+    0, 5747, 78825, 0, 7978, 41092, 74571, 0, 11924, 74205, 42144, 65015, 0, \r
+    563, 0, 0, 12798, 11271, 57, 0, 0, 917860, 119043, 0, 0, 43137, 694, 0, \r
+    9876, 0, 119168, 0, 78822, 64537, 0, 277, 74385, 7229, 12761, 0, 0, \r
+    13025, 64811, 8757, 78824, 0, 1574, 7381, 0, 2525, 4852, 5749, 68465, \r
+    13027, 42824, 120574, 1039, 9801, 10155, 5745, 188, 41858, 11592, 0, \r
+    74015, 9055, 41853, 4858, 917780, 0, 436, 4771, 0, 2786, 0, 4856, 8051, \r
+    0, 119609, 0, 9644, 0, 0, 0, 194916, 120732, 66710, 118834, 0, 73906, 0, \r
+    127114, 0, 10234, 5843, 11939, 0, 42157, 0, 3157, 194918, 68393, 0, 3504, \r
+    119178, 0, 10822, 5149, 66029, 10226, 65142, 0, 3594, 42424, 194959, 40, \r
+    12657, 0, 0, 386, 0, 8834, 0, 12815, 43574, 0, 73907, 0, 74196, 7220, \r
+    74504, 0, 74316, 0, 77932, 4304, 74503, 8160, 78707, 194753, 0, 0, 0, \r
+    1348, 0, 78597, 0, 13303, 0, 0, 194755, 7599, 1278, 43616, 13269, 0, 0, \r
+    74387, 78179, 78598, 74492, 6097, 7568, 8780, 4982, 0, 74501, 194763, \r
+    78592, 194762, 2672, 3735, 194735, 13138, 42266, 9484, 10724, 41202, \r
+    119024, 0, 43742, 0, 9487, 119959, 119117, 3842, 195034, 78668, 12442, \r
+    6193, 9791, 0, 0, 42516, 7228, 7559, 74803, 78468, 194851, 11399, 119219, \r
+    194691, 194855, 194690, 194857, 3604, 0, 119188, 0, 78540, 78541, 42507, \r
+    1962, 78490, 78476, 42505, 11660, 0, 2072, 0, 6995, 74173, 5437, 74174, \r
+    10669, 8702, 7964, 194706, 0, 199, 194843, 4105, 194845, 194699, 194847, \r
+    194710, 119875, 13148, 7560, 78479, 9226, 78480, 195070, 6472, 65814, \r
+    73954, 0, 4724, 0, 0, 9191, 0, 64432, 0, 0, 195024, 10196, 7886, 0, 6585, \r
+    0, 6680, 195042, 0, 195051, 6679, 74412, 0, 194866, 74421, 11382, 0, 0, \r
+    0, 0, 194833, 194832, 6681, 194834, 12693, 194836, 42727, 194838, 194841, \r
+    78195, 65442, 119610, 78199, 12166, 43248, 66248, 194816, 0, 194818, \r
+    194817, 194820, 194819, 5297, 7042, 13284, 6112, 7968, 194825, 73927, \r
+    194738, 194736, 65746, 0, 74409, 74389, 194826, 4342, 42839, 194831, \r
+    1677, 0, 0, 194806, 917855, 11091, 11011, 2719, 0, 0, 119595, 64495, 0, \r
+    0, 7585, 65169, 2052, 4308, 917858, 74177, 7505, 543, 64916, 64736, 0, 0, \r
+    64655, 0, 118922, 2064, 0, 43158, 7902, 0, 65265, 194639, 0, 0, 0, 0, 0, \r
+    0, 12994, 0, 10828, 0, 6228, 4307, 3482, 0, 0, 0, 0, 506, 74573, 41194, \r
+    65735, 2055, 43255, 41195, 0, 8169, 0, 8841, 0, 516, 0, 2063, 119051, 34, \r
+    0, 120186, 11504, 1612, 74333, 120182, 74520, 74308, 12001, 120178, \r
+    10242, 64564, 120179, 120174, 6584, 7749, 11037, 0, 1758, 0, 10667, \r
+    10560, 120197, 120756, 1935, 11517, 120193, 120196, 120195, 1931, 120189, \r
+    74839, 120191, 1217, 64702, 12643, 825, 0, 194905, 12294, 127261, 78834, \r
+    9138, 78831, 78833, 12631, 78829, 11080, 74554, 0, 5591, 1239, 0, 11313, \r
+    0, 3403, 0, 0, 64364, 0, 0, 74582, 8998, 12988, 0, 9152, 0, 0, 194898, \r
+    67589, 41850, 64290, 3433, 0, 12615, 1594, 42192, 6914, 67603, 0, 119569, \r
+    74565, 41353, 67602, 67611, 4337, 0, 194897, 918, 65035, 41351, 7681, \r
+    194900, 42577, 41393, 12668, 194904, 2477, 0, 0, 127302, 0, 67604, \r
+    194880, 127235, 573, 194881, 194884, 11417, 194886, 194885, 194888, \r
+    67599, 0, 194889, 67607, 11482, 0, 0, 3357, 0, 42223, 4207, 1288, 78842, \r
+    78839, 68419, 78837, 11589, 42195, 194872, 917627, 127263, 64602, 67618, \r
+    0, 0, 42788, 68416, 64480, 194875, 8423, 3348, 448, 68476, 9717, 0, 0, \r
+    997, 0, 0, 0, 0, 11440, 11379, 42000, 13139, 42221, 65013, 126999, 0, \r
+    73796, 0, 119228, 12035, 0, 2818, 0, 0, 73793, 0, 4172, 0, 0, 8373, \r
+    10873, 12197, 0, 0, 0, 0, 0, 78210, 0, 0, 194865, 126982, 74563, 64828, \r
+    11419, 194868, 766, 1257, 0, 118845, 11381, 3265, 66617, 3274, 0, 0, 0, \r
+    0, 119092, 41989, 0, 0, 0, 3263, 0, 65672, 0, 3270, 64539, 11489, 0, 0, \r
+    0, 0, 9505, 65518, 194776, 756, 195052, 0, 0, 0, 7261, 0, 186, 0, 119156, \r
+    5770, 13179, 65830, 12612, 12949, 64856, 12800, 0, 74203, 64718, 0, 0, 0, \r
+    118929, 0, 11578, 0, 119296, 0, 0, 0, 0, 74568, 9254, 0, 1794, 120217, \r
+    64521, 5624, 120220, 120221, 119958, 120223, 3617, 66636, 64886, 120211, \r
+    120212, 120213, 120214, 1872, 66508, 120467, 41079, 10748, 5502, 119330, \r
+    4452, 0, 0, 917879, 4511, 0, 0, 64678, 11425, 0, 43245, 1231, 0, 0, 0, \r
+    9003, 8192, 0, 5305, 9653, 10616, 8694, 9546, 0, 0, 120478, 120200, \r
+    65205, 120202, 64063, 9878, 74780, 119626, 78202, 64058, 8799, 42131, 0, \r
+    64062, 1028, 64060, 64059, 837, 10567, 0, 43103, 0, 120754, 11427, 2902, \r
+    64043, 64042, 66464, 10756, 0, 42606, 64045, 64044, 43979, 10076, 64040, \r
+    43060, 0, 1034, 3392, 0, 43091, 64033, 64032, 42735, 64038, 64037, 64036, \r
+    64035, 4291, 194928, 64015, 64014, 64681, 194930, 0, 78145, 0, 43090, 0, \r
+    3476, 8973, 64012, 42473, 64010, 64008, 64007, 2003, 7706, 64517, 78153, \r
+    2538, 64009, 204, 0, 4802, 4111, 8239, 9098, 4805, 64001, 64057, 7885, \r
+    7247, 64054, 0, 0, 4767, 9343, 64049, 64048, 120034, 1133, 64053, 64052, \r
+    43453, 64050, 41340, 118975, 0, 10005, 12329, 41333, 0, 8489, 1942, 0, 0, \r
+    42520, 0, 0, 0, 10760, 64023, 64022, 64021, 6582, 43670, 0, 64025, 9167, \r
+    42151, 78244, 0, 2026, 64019, 64018, 64017, 64016, 12768, 0, 7582, 78252, \r
+    78248, 77914, 78246, 78247, 0, 77915, 78766, 6788, 13094, 77920, 7532, \r
+    41414, 78520, 3179, 78518, 64769, 78514, 78517, 11461, 74454, 10751, \r
+    9051, 120720, 6708, 10535, 0, 68218, 55274, 2008, 64031, 64030, 294, \r
+    41874, 0, 126991, 65929, 0, 0, 0, 0, 64028, 8146, 64026, 41788, 194844, \r
+    0, 118795, 6343, 43247, 119888, 0, 119886, 119891, 119892, 119889, 11433, \r
+    119895, 119896, 0, 7801, 65578, 194839, 12915, 43968, 3297, 9699, 194955, \r
+    1135, 0, 0, 0, 1995, 6722, 0, 0, 2552, 41546, 60, 68394, 8649, 41549, \r
+    78496, 0, 0, 6682, 0, 78679, 64710, 41547, 0, 2013, 0, 78530, 78532, \r
+    78528, 78529, 12832, 78493, 8081, 8362, 3537, 119908, 9137, 119906, 8999, \r
+    0, 78533, 3466, 0, 0, 1996, 0, 3453, 6282, 0, 2002, 2000, 120175, 537, 0, \r
+    4179, 65119, 1998, 0, 1842, 0, 0, 9628, 68446, 12081, 9826, 64502, 1767, \r
+    0, 0, 0, 120201, 0, 0, 0, 3059, 44024, 120204, 119953, 120205, 0, 0, 0, \r
+    4100, 920, 1811, 1355, 0, 0, 3592, 10078, 0, 0, 0, 8592, 65870, 68164, 0, \r
+    10742, 0, 0, 1994, 9281, 3296, 12865, 1997, 1895, \r
+};\r
+\r
+#define code_magic 47\r
+#define code_size 32768\r
+#define code_poly 32771\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/xxsubtype.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/xxsubtype.c
new file mode 100644 (file)
index 0000000..a227bd2
--- /dev/null
@@ -0,0 +1,297 @@
+#include "Python.h"\r
+#include "structmember.h"\r
+\r
+PyDoc_STRVAR(xxsubtype__doc__,\r
+"xxsubtype is an example module showing how to subtype builtin types from C.\n"\r
+"test_descr.py in the standard test suite requires it in order to complete.\n"\r
+"If you don't care about the examples, and don't intend to run the Python\n"\r
+"test suite, you can recompile Python without Modules/xxsubtype.c.");\r
+\r
+/* We link this module statically for convenience.  If compiled as a shared\r
+   library instead, some compilers don't allow addresses of Python objects\r
+   defined in other libraries to be used in static initializers here.  The\r
+   DEFERRED_ADDRESS macro is used to tag the slots where such addresses\r
+   appear; the module init function must fill in the tagged slots at runtime.\r
+   The argument is for documentation -- the macro ignores it.\r
+*/\r
+#define DEFERRED_ADDRESS(ADDR) 0\r
+\r
+/* spamlist -- a list subtype */\r
+\r
+typedef struct {\r
+    PyListObject list;\r
+    int state;\r
+} spamlistobject;\r
+\r
+static PyObject *\r
+spamlist_getstate(spamlistobject *self, PyObject *args)\r
+{\r
+    if (!PyArg_ParseTuple(args, ":getstate"))\r
+        return NULL;\r
+    return PyInt_FromLong(self->state);\r
+}\r
+\r
+static PyObject *\r
+spamlist_setstate(spamlistobject *self, PyObject *args)\r
+{\r
+    int state;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:setstate", &state))\r
+        return NULL;\r
+    self->state = state;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyObject *\r
+spamlist_specialmeth(PyObject *self, PyObject *args, PyObject *kw)\r
+{\r
+    PyObject *result = PyTuple_New(3);\r
+\r
+    if (result != NULL) {\r
+        if (self == NULL)\r
+            self = Py_None;\r
+        if (kw == NULL)\r
+            kw = Py_None;\r
+        Py_INCREF(self);\r
+        PyTuple_SET_ITEM(result, 0, self);\r
+        Py_INCREF(args);\r
+        PyTuple_SET_ITEM(result, 1, args);\r
+        Py_INCREF(kw);\r
+        PyTuple_SET_ITEM(result, 2, kw);\r
+    }\r
+    return result;\r
+}\r
+\r
+static PyMethodDef spamlist_methods[] = {\r
+    {"getstate", (PyCFunction)spamlist_getstate, METH_VARARGS,\r
+        PyDoc_STR("getstate() -> state")},\r
+    {"setstate", (PyCFunction)spamlist_setstate, METH_VARARGS,\r
+        PyDoc_STR("setstate(state)")},\r
+    /* These entries differ only in the flags; they are used by the tests\r
+       in test.test_descr. */\r
+    {"classmeth", (PyCFunction)spamlist_specialmeth,\r
+        METH_VARARGS | METH_KEYWORDS | METH_CLASS,\r
+        PyDoc_STR("classmeth(*args, **kw)")},\r
+    {"staticmeth", (PyCFunction)spamlist_specialmeth,\r
+        METH_VARARGS | METH_KEYWORDS | METH_STATIC,\r
+        PyDoc_STR("staticmeth(*args, **kw)")},\r
+    {NULL,      NULL},\r
+};\r
+\r
+static int\r
+spamlist_init(spamlistobject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    if (PyList_Type.tp_init((PyObject *)self, args, kwds) < 0)\r
+        return -1;\r
+    self->state = 0;\r
+    return 0;\r
+}\r
+\r
+static PyObject *\r
+spamlist_state_get(spamlistobject *self)\r
+{\r
+    return PyInt_FromLong(self->state);\r
+}\r
+\r
+static PyGetSetDef spamlist_getsets[] = {\r
+    {"state", (getter)spamlist_state_get, NULL,\r
+     PyDoc_STR("an int variable for demonstration purposes")},\r
+    {0}\r
+};\r
+\r
+static PyTypeObject spamlist_type = {\r
+    PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)\r
+    "xxsubtype.spamlist",\r
+    sizeof(spamlistobject),\r
+    0,\r
+    0,                                          /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    0,                                          /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */\r
+    0,                                          /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    spamlist_methods,                           /* tp_methods */\r
+    0,                                          /* tp_members */\r
+    spamlist_getsets,                           /* tp_getset */\r
+    DEFERRED_ADDRESS(&PyList_Type),             /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    (initproc)spamlist_init,                    /* tp_init */\r
+    0,                                          /* tp_alloc */\r
+    0,                                          /* tp_new */\r
+};\r
+\r
+/* spamdict -- a dict subtype */\r
+\r
+typedef struct {\r
+    PyDictObject dict;\r
+    int state;\r
+} spamdictobject;\r
+\r
+static PyObject *\r
+spamdict_getstate(spamdictobject *self, PyObject *args)\r
+{\r
+    if (!PyArg_ParseTuple(args, ":getstate"))\r
+        return NULL;\r
+    return PyInt_FromLong(self->state);\r
+}\r
+\r
+static PyObject *\r
+spamdict_setstate(spamdictobject *self, PyObject *args)\r
+{\r
+    int state;\r
+\r
+    if (!PyArg_ParseTuple(args, "i:setstate", &state))\r
+        return NULL;\r
+    self->state = state;\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+static PyMethodDef spamdict_methods[] = {\r
+    {"getstate", (PyCFunction)spamdict_getstate, METH_VARARGS,\r
+        PyDoc_STR("getstate() -> state")},\r
+    {"setstate", (PyCFunction)spamdict_setstate, METH_VARARGS,\r
+        PyDoc_STR("setstate(state)")},\r
+    {NULL,      NULL},\r
+};\r
+\r
+static int\r
+spamdict_init(spamdictobject *self, PyObject *args, PyObject *kwds)\r
+{\r
+    if (PyDict_Type.tp_init((PyObject *)self, args, kwds) < 0)\r
+        return -1;\r
+    self->state = 0;\r
+    return 0;\r
+}\r
+\r
+static PyMemberDef spamdict_members[] = {\r
+    {"state", T_INT, offsetof(spamdictobject, state), READONLY,\r
+     PyDoc_STR("an int variable for demonstration purposes")},\r
+    {0}\r
+};\r
+\r
+static PyTypeObject spamdict_type = {\r
+    PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)\r
+    "xxsubtype.spamdict",\r
+    sizeof(spamdictobject),\r
+    0,\r
+    0,                                          /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    0,                                          /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    0,                                          /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */\r
+    0,                                          /* tp_doc */\r
+    0,                                          /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    spamdict_methods,                           /* tp_methods */\r
+    spamdict_members,                           /* tp_members */\r
+    0,                                          /* tp_getset */\r
+    DEFERRED_ADDRESS(&PyDict_Type),             /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    (initproc)spamdict_init,                    /* tp_init */\r
+    0,                                          /* tp_alloc */\r
+    0,                                          /* tp_new */\r
+};\r
+\r
+static PyObject *\r
+spam_bench(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *obj, *name, *res;\r
+    int n = 1000;\r
+    time_t t0, t1;\r
+\r
+    if (!PyArg_ParseTuple(args, "OS|i", &obj, &name, &n))\r
+        return NULL;\r
+    t0 = clock();\r
+    while (--n >= 0) {\r
+        res = PyObject_GetAttr(obj, name);\r
+        if (res == NULL)\r
+            return NULL;\r
+        Py_DECREF(res);\r
+    }\r
+    t1 = clock();\r
+    return PyFloat_FromDouble((double)(t1-t0) / CLOCKS_PER_SEC);\r
+}\r
+\r
+static PyMethodDef xxsubtype_functions[] = {\r
+    {"bench",           spam_bench,     METH_VARARGS},\r
+    {NULL,              NULL}           /* sentinel */\r
+};\r
+\r
+PyMODINIT_FUNC\r
+initxxsubtype(void)\r
+{\r
+    PyObject *m;\r
+\r
+    /* Fill in deferred data addresses.  This must be done before\r
+       PyType_Ready() is called.  Note that PyType_Ready() automatically\r
+       initializes the ob.ob_type field to &PyType_Type if it's NULL,\r
+       so it's not necessary to fill in ob_type first. */\r
+    spamdict_type.tp_base = &PyDict_Type;\r
+    if (PyType_Ready(&spamdict_type) < 0)\r
+        return;\r
+\r
+    spamlist_type.tp_base = &PyList_Type;\r
+    if (PyType_Ready(&spamlist_type) < 0)\r
+        return;\r
+\r
+    m = Py_InitModule3("xxsubtype",\r
+                       xxsubtype_functions,\r
+                       xxsubtype__doc__);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    if (PyType_Ready(&spamlist_type) < 0)\r
+        return;\r
+    if (PyType_Ready(&spamdict_type) < 0)\r
+        return;\r
+\r
+    Py_INCREF(&spamlist_type);\r
+    if (PyModule_AddObject(m, "spamlist",\r
+                           (PyObject *) &spamlist_type) < 0)\r
+        return;\r
+\r
+    Py_INCREF(&spamdict_type);\r
+    if (PyModule_AddObject(m, "spamdict",\r
+                           (PyObject *) &spamdict_type) < 0)\r
+        return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zipimport.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zipimport.c
new file mode 100644 (file)
index 0000000..6f65c17
--- /dev/null
@@ -0,0 +1,1257 @@
+#include "Python.h"\r
+#include "structmember.h"\r
+#include "osdefs.h"\r
+#include "marshal.h"\r
+#include <time.h>\r
+\r
+\r
+#define IS_SOURCE   0x0\r
+#define IS_BYTECODE 0x1\r
+#define IS_PACKAGE  0x2\r
+\r
+struct st_zip_searchorder {\r
+    char suffix[14];\r
+    int type;\r
+};\r
+\r
+/* zip_searchorder defines how we search for a module in the Zip\r
+   archive: we first search for a package __init__, then for\r
+   non-package .pyc, .pyo and .py entries. The .pyc and .pyo entries\r
+   are swapped by initzipimport() if we run in optimized mode. Also,\r
+   '/' is replaced by SEP there. */\r
+static struct st_zip_searchorder zip_searchorder[] = {\r
+    {"/__init__.pyc", IS_PACKAGE | IS_BYTECODE},\r
+    {"/__init__.pyo", IS_PACKAGE | IS_BYTECODE},\r
+    {"/__init__.py", IS_PACKAGE | IS_SOURCE},\r
+    {".pyc", IS_BYTECODE},\r
+    {".pyo", IS_BYTECODE},\r
+    {".py", IS_SOURCE},\r
+    {"", 0}\r
+};\r
+\r
+/* zipimporter object definition and support */\r
+\r
+typedef struct _zipimporter ZipImporter;\r
+\r
+struct _zipimporter {\r
+    PyObject_HEAD\r
+    PyObject *archive;  /* pathname of the Zip archive */\r
+    PyObject *prefix;   /* file prefix: "a/sub/directory/" */\r
+    PyObject *files;    /* dict with file info {path: toc_entry} */\r
+};\r
+\r
+static PyObject *ZipImportError;\r
+static PyObject *zip_directory_cache = NULL;\r
+\r
+/* forward decls */\r
+static PyObject *read_directory(char *archive);\r
+static PyObject *get_data(char *archive, PyObject *toc_entry);\r
+static PyObject *get_module_code(ZipImporter *self, char *fullname,\r
+                                 int *p_ispackage, char **p_modpath);\r
+\r
+\r
+#define ZipImporter_Check(op) PyObject_TypeCheck(op, &ZipImporter_Type)\r
+\r
+\r
+/* zipimporter.__init__\r
+   Split the "subdirectory" from the Zip archive path, lookup a matching\r
+   entry in sys.path_importer_cache, fetch the file directory from there\r
+   if found, or else read it from the archive. */\r
+static int\r
+zipimporter_init(ZipImporter *self, PyObject *args, PyObject *kwds)\r
+{\r
+    char *path, *p, *prefix, buf[MAXPATHLEN+2];\r
+    size_t len;\r
+\r
+    if (!_PyArg_NoKeywords("zipimporter()", kwds))\r
+        return -1;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter",\r
+                          &path))\r
+        return -1;\r
+\r
+    len = strlen(path);\r
+    if (len == 0) {\r
+        PyErr_SetString(ZipImportError, "archive path is empty");\r
+        return -1;\r
+    }\r
+    if (len >= MAXPATHLEN) {\r
+        PyErr_SetString(ZipImportError,\r
+                        "archive path too long");\r
+        return -1;\r
+    }\r
+    strcpy(buf, path);\r
+\r
+#ifdef ALTSEP\r
+    for (p = buf; *p; p++) {\r
+        if (*p == ALTSEP)\r
+            *p = SEP;\r
+    }\r
+#endif\r
+\r
+    path = NULL;\r
+    prefix = NULL;\r
+    for (;;) {\r
+#ifndef RISCOS\r
+        struct stat statbuf;\r
+        int rv;\r
+\r
+        rv = stat(buf, &statbuf);\r
+        if (rv == 0) {\r
+            /* it exists */\r
+            if (S_ISREG(statbuf.st_mode))\r
+                /* it's a file */\r
+                path = buf;\r
+            break;\r
+        }\r
+#else\r
+        if (object_exists(buf)) {\r
+            /* it exists */\r
+            if (isfile(buf))\r
+                /* it's a file */\r
+                path = buf;\r
+            break;\r
+        }\r
+#endif\r
+        /* back up one path element */\r
+        p = strrchr(buf, SEP);\r
+        if (prefix != NULL)\r
+            *prefix = SEP;\r
+        if (p == NULL)\r
+            break;\r
+        *p = '\0';\r
+        prefix = p;\r
+    }\r
+    if (path != NULL) {\r
+        PyObject *files;\r
+        files = PyDict_GetItemString(zip_directory_cache, path);\r
+        if (files == NULL) {\r
+            files = read_directory(buf);\r
+            if (files == NULL)\r
+                return -1;\r
+            if (PyDict_SetItemString(zip_directory_cache, path,\r
+                                     files) != 0)\r
+                return -1;\r
+        }\r
+        else\r
+            Py_INCREF(files);\r
+        self->files = files;\r
+    }\r
+    else {\r
+        PyErr_SetString(ZipImportError, "not a Zip file");\r
+        return -1;\r
+    }\r
+\r
+    if (prefix == NULL)\r
+        prefix = "";\r
+    else {\r
+        prefix++;\r
+        len = strlen(prefix);\r
+        if (prefix[len-1] != SEP) {\r
+            /* add trailing SEP */\r
+            prefix[len] = SEP;\r
+            prefix[len + 1] = '\0';\r
+        }\r
+    }\r
+\r
+    self->archive = PyString_FromString(buf);\r
+    if (self->archive == NULL)\r
+        return -1;\r
+\r
+    self->prefix = PyString_FromString(prefix);\r
+    if (self->prefix == NULL)\r
+        return -1;\r
+\r
+    return 0;\r
+}\r
+\r
+/* GC support. */\r
+static int\r
+zipimporter_traverse(PyObject *obj, visitproc visit, void *arg)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    Py_VISIT(self->files);\r
+    return 0;\r
+}\r
+\r
+static void\r
+zipimporter_dealloc(ZipImporter *self)\r
+{\r
+    PyObject_GC_UnTrack(self);\r
+    Py_XDECREF(self->archive);\r
+    Py_XDECREF(self->prefix);\r
+    Py_XDECREF(self->files);\r
+    Py_TYPE(self)->tp_free((PyObject *)self);\r
+}\r
+\r
+static PyObject *\r
+zipimporter_repr(ZipImporter *self)\r
+{\r
+    char buf[500];\r
+    char *archive = "???";\r
+    char *prefix = "";\r
+\r
+    if (self->archive != NULL && PyString_Check(self->archive))\r
+        archive = PyString_AsString(self->archive);\r
+    if (self->prefix != NULL && PyString_Check(self->prefix))\r
+        prefix = PyString_AsString(self->prefix);\r
+    if (prefix != NULL && *prefix)\r
+        PyOS_snprintf(buf, sizeof(buf),\r
+                      "<zipimporter object \"%.300s%c%.150s\">",\r
+                      archive, SEP, prefix);\r
+    else\r
+        PyOS_snprintf(buf, sizeof(buf),\r
+                      "<zipimporter object \"%.300s\">",\r
+                      archive);\r
+    return PyString_FromString(buf);\r
+}\r
+\r
+/* return fullname.split(".")[-1] */\r
+static char *\r
+get_subname(char *fullname)\r
+{\r
+    char *subname = strrchr(fullname, '.');\r
+    if (subname == NULL)\r
+        subname = fullname;\r
+    else\r
+        subname++;\r
+    return subname;\r
+}\r
+\r
+/* Given a (sub)modulename, write the potential file path in the\r
+   archive (without extension) to the path buffer. Return the\r
+   length of the resulting string. */\r
+static int\r
+make_filename(char *prefix, char *name, char *path)\r
+{\r
+    size_t len;\r
+    char *p;\r
+\r
+    len = strlen(prefix);\r
+\r
+    /* self.prefix + name [+ SEP + "__init__"] + ".py[co]" */\r
+    if (len + strlen(name) + 13 >= MAXPATHLEN) {\r
+        PyErr_SetString(ZipImportError, "path too long");\r
+        return -1;\r
+    }\r
+\r
+    strcpy(path, prefix);\r
+    strcpy(path + len, name);\r
+    for (p = path + len; *p; p++) {\r
+        if (*p == '.')\r
+            *p = SEP;\r
+    }\r
+    len += strlen(name);\r
+    assert(len < INT_MAX);\r
+    return (int)len;\r
+}\r
+\r
+enum zi_module_info {\r
+    MI_ERROR,\r
+    MI_NOT_FOUND,\r
+    MI_MODULE,\r
+    MI_PACKAGE\r
+};\r
+\r
+/* Return some information about a module. */\r
+static enum zi_module_info\r
+get_module_info(ZipImporter *self, char *fullname)\r
+{\r
+    char *subname, path[MAXPATHLEN + 1];\r
+    int len;\r
+    struct st_zip_searchorder *zso;\r
+\r
+    subname = get_subname(fullname);\r
+\r
+    len = make_filename(PyString_AsString(self->prefix), subname, path);\r
+    if (len < 0)\r
+        return MI_ERROR;\r
+\r
+    for (zso = zip_searchorder; *zso->suffix; zso++) {\r
+        strcpy(path + len, zso->suffix);\r
+        if (PyDict_GetItemString(self->files, path) != NULL) {\r
+            if (zso->type & IS_PACKAGE)\r
+                return MI_PACKAGE;\r
+            else\r
+                return MI_MODULE;\r
+        }\r
+    }\r
+    return MI_NOT_FOUND;\r
+}\r
+\r
+/* Check whether we can satisfy the import of the module named by\r
+   'fullname'. Return self if we can, None if we can't. */\r
+static PyObject *\r
+zipimporter_find_module(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    PyObject *path = NULL;\r
+    char *fullname;\r
+    enum zi_module_info mi;\r
+\r
+    if (!PyArg_ParseTuple(args, "s|O:zipimporter.find_module",\r
+                          &fullname, &path))\r
+        return NULL;\r
+\r
+    mi = get_module_info(self, fullname);\r
+    if (mi == MI_ERROR)\r
+        return NULL;\r
+    if (mi == MI_NOT_FOUND) {\r
+        Py_INCREF(Py_None);\r
+        return Py_None;\r
+    }\r
+    Py_INCREF(self);\r
+    return (PyObject *)self;\r
+}\r
+\r
+/* Load and return the module named by 'fullname'. */\r
+static PyObject *\r
+zipimporter_load_module(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    PyObject *code, *mod, *dict;\r
+    char *fullname, *modpath;\r
+    int ispackage;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.load_module",\r
+                          &fullname))\r
+        return NULL;\r
+\r
+    code = get_module_code(self, fullname, &ispackage, &modpath);\r
+    if (code == NULL)\r
+        return NULL;\r
+\r
+    mod = PyImport_AddModule(fullname);\r
+    if (mod == NULL) {\r
+        Py_DECREF(code);\r
+        return NULL;\r
+    }\r
+    dict = PyModule_GetDict(mod);\r
+\r
+    /* mod.__loader__ = self */\r
+    if (PyDict_SetItemString(dict, "__loader__", (PyObject *)self) != 0)\r
+        goto error;\r
+\r
+    if (ispackage) {\r
+        /* add __path__ to the module *before* the code gets\r
+           executed */\r
+        PyObject *pkgpath, *fullpath;\r
+        char *prefix = PyString_AsString(self->prefix);\r
+        char *subname = get_subname(fullname);\r
+        int err;\r
+\r
+        fullpath = PyString_FromFormat("%s%c%s%s",\r
+                                PyString_AsString(self->archive),\r
+                                SEP,\r
+                                *prefix ? prefix : "",\r
+                                subname);\r
+        if (fullpath == NULL)\r
+            goto error;\r
+\r
+        pkgpath = Py_BuildValue("[O]", fullpath);\r
+        Py_DECREF(fullpath);\r
+        if (pkgpath == NULL)\r
+            goto error;\r
+        err = PyDict_SetItemString(dict, "__path__", pkgpath);\r
+        Py_DECREF(pkgpath);\r
+        if (err != 0)\r
+            goto error;\r
+    }\r
+    mod = PyImport_ExecCodeModuleEx(fullname, code, modpath);\r
+    Py_DECREF(code);\r
+    if (Py_VerboseFlag)\r
+        PySys_WriteStderr("import %s # loaded from Zip %s\n",\r
+                          fullname, modpath);\r
+    return mod;\r
+error:\r
+    Py_DECREF(code);\r
+    Py_DECREF(mod);\r
+    return NULL;\r
+}\r
+\r
+/* Return a string matching __file__ for the named module */\r
+static PyObject *\r
+zipimporter_get_filename(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    PyObject *code;\r
+    char *fullname, *modpath;\r
+    int ispackage;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.get_filename",\r
+                         &fullname))\r
+    return NULL;\r
+\r
+    /* Deciding the filename requires working out where the code\r
+       would come from if the module was actually loaded */\r
+    code = get_module_code(self, fullname, &ispackage, &modpath);\r
+    if (code == NULL)\r
+    return NULL;\r
+    Py_DECREF(code); /* Only need the path info */\r
+\r
+    return PyString_FromString(modpath);\r
+}\r
+\r
+/* Return a bool signifying whether the module is a package or not. */\r
+static PyObject *\r
+zipimporter_is_package(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    char *fullname;\r
+    enum zi_module_info mi;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.is_package",\r
+                          &fullname))\r
+        return NULL;\r
+\r
+    mi = get_module_info(self, fullname);\r
+    if (mi == MI_ERROR)\r
+        return NULL;\r
+    if (mi == MI_NOT_FOUND) {\r
+        PyErr_Format(ZipImportError, "can't find module '%.200s'",\r
+                     fullname);\r
+        return NULL;\r
+    }\r
+    return PyBool_FromLong(mi == MI_PACKAGE);\r
+}\r
+\r
+static PyObject *\r
+zipimporter_get_data(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    char *path;\r
+#ifdef ALTSEP\r
+    char *p, buf[MAXPATHLEN + 1];\r
+#endif\r
+    PyObject *toc_entry;\r
+    Py_ssize_t len;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.get_data", &path))\r
+        return NULL;\r
+\r
+#ifdef ALTSEP\r
+    if (strlen(path) >= MAXPATHLEN) {\r
+        PyErr_SetString(ZipImportError, "path too long");\r
+        return NULL;\r
+    }\r
+    strcpy(buf, path);\r
+    for (p = buf; *p; p++) {\r
+        if (*p == ALTSEP)\r
+            *p = SEP;\r
+    }\r
+    path = buf;\r
+#endif\r
+    len = PyString_Size(self->archive);\r
+    if ((size_t)len < strlen(path) &&\r
+        strncmp(path, PyString_AsString(self->archive), len) == 0 &&\r
+        path[len] == SEP) {\r
+        path = path + len + 1;\r
+    }\r
+\r
+    toc_entry = PyDict_GetItemString(self->files, path);\r
+    if (toc_entry == NULL) {\r
+        PyErr_SetFromErrnoWithFilename(PyExc_IOError, path);\r
+        return NULL;\r
+    }\r
+    return get_data(PyString_AsString(self->archive), toc_entry);\r
+}\r
+\r
+static PyObject *\r
+zipimporter_get_code(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    char *fullname;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.get_code", &fullname))\r
+        return NULL;\r
+\r
+    return get_module_code(self, fullname, NULL, NULL);\r
+}\r
+\r
+static PyObject *\r
+zipimporter_get_source(PyObject *obj, PyObject *args)\r
+{\r
+    ZipImporter *self = (ZipImporter *)obj;\r
+    PyObject *toc_entry;\r
+    char *fullname, *subname, path[MAXPATHLEN+1];\r
+    int len;\r
+    enum zi_module_info mi;\r
+\r
+    if (!PyArg_ParseTuple(args, "s:zipimporter.get_source", &fullname))\r
+        return NULL;\r
+\r
+    mi = get_module_info(self, fullname);\r
+    if (mi == MI_ERROR)\r
+        return NULL;\r
+    if (mi == MI_NOT_FOUND) {\r
+        PyErr_Format(ZipImportError, "can't find module '%.200s'",\r
+                     fullname);\r
+        return NULL;\r
+    }\r
+    subname = get_subname(fullname);\r
+\r
+    len = make_filename(PyString_AsString(self->prefix), subname, path);\r
+    if (len < 0)\r
+        return NULL;\r
+\r
+    if (mi == MI_PACKAGE) {\r
+        path[len] = SEP;\r
+        strcpy(path + len + 1, "__init__.py");\r
+    }\r
+    else\r
+        strcpy(path + len, ".py");\r
+\r
+    toc_entry = PyDict_GetItemString(self->files, path);\r
+    if (toc_entry != NULL)\r
+        return get_data(PyString_AsString(self->archive), toc_entry);\r
+\r
+    /* we have the module, but no source */\r
+    Py_INCREF(Py_None);\r
+    return Py_None;\r
+}\r
+\r
+PyDoc_STRVAR(doc_find_module,\r
+"find_module(fullname, path=None) -> self or None.\n\\r
+\n\\r
+Search for a module specified by 'fullname'. 'fullname' must be the\n\\r
+fully qualified (dotted) module name. It returns the zipimporter\n\\r
+instance itself if the module was found, or None if it wasn't.\n\\r
+The optional 'path' argument is ignored -- it's there for compatibility\n\\r
+with the importer protocol.");\r
+\r
+PyDoc_STRVAR(doc_load_module,\r
+"load_module(fullname) -> module.\n\\r
+\n\\r
+Load the module specified by 'fullname'. 'fullname' must be the\n\\r
+fully qualified (dotted) module name. It returns the imported\n\\r
+module, or raises ZipImportError if it wasn't found.");\r
+\r
+PyDoc_STRVAR(doc_get_data,\r
+"get_data(pathname) -> string with file data.\n\\r
+\n\\r
+Return the data associated with 'pathname'. Raise IOError if\n\\r
+the file wasn't found.");\r
+\r
+PyDoc_STRVAR(doc_is_package,\r
+"is_package(fullname) -> bool.\n\\r
+\n\\r
+Return True if the module specified by fullname is a package.\n\\r
+Raise ZipImportError if the module couldn't be found.");\r
+\r
+PyDoc_STRVAR(doc_get_code,\r
+"get_code(fullname) -> code object.\n\\r
+\n\\r
+Return the code object for the specified module. Raise ZipImportError\n\\r
+if the module couldn't be found.");\r
+\r
+PyDoc_STRVAR(doc_get_source,\r
+"get_source(fullname) -> source string.\n\\r
+\n\\r
+Return the source code for the specified module. Raise ZipImportError\n\\r
+if the module couldn't be found, return None if the archive does\n\\r
+contain the module, but has no source for it.");\r
+\r
+\r
+PyDoc_STRVAR(doc_get_filename,\r
+"get_filename(fullname) -> filename string.\n\\r
+\n\\r
+Return the filename for the specified module.");\r
+\r
+static PyMethodDef zipimporter_methods[] = {\r
+    {"find_module", zipimporter_find_module, METH_VARARGS,\r
+     doc_find_module},\r
+    {"load_module", zipimporter_load_module, METH_VARARGS,\r
+     doc_load_module},\r
+    {"get_data", zipimporter_get_data, METH_VARARGS,\r
+     doc_get_data},\r
+    {"get_code", zipimporter_get_code, METH_VARARGS,\r
+     doc_get_code},\r
+    {"get_source", zipimporter_get_source, METH_VARARGS,\r
+     doc_get_source},\r
+    {"get_filename", zipimporter_get_filename, METH_VARARGS,\r
+     doc_get_filename},\r
+    {"is_package", zipimporter_is_package, METH_VARARGS,\r
+     doc_is_package},\r
+    {NULL,              NULL}   /* sentinel */\r
+};\r
+\r
+static PyMemberDef zipimporter_members[] = {\r
+    {"archive",  T_OBJECT, offsetof(ZipImporter, archive),  READONLY},\r
+    {"prefix",   T_OBJECT, offsetof(ZipImporter, prefix),   READONLY},\r
+    {"_files",   T_OBJECT, offsetof(ZipImporter, files),    READONLY},\r
+    {NULL}\r
+};\r
+\r
+PyDoc_STRVAR(zipimporter_doc,\r
+"zipimporter(archivepath) -> zipimporter object\n\\r
+\n\\r
+Create a new zipimporter instance. 'archivepath' must be a path to\n\\r
+a zipfile, or to a specific path inside a zipfile. For example, it can be\n\\r
+'/tmp/myimport.zip', or '/tmp/myimport.zip/mydirectory', if mydirectory is a\n\\r
+valid directory inside the archive.\n\\r
+\n\\r
+'ZipImportError is raised if 'archivepath' doesn't point to a valid Zip\n\\r
+archive.\n\\r
+\n\\r
+The 'archive' attribute of zipimporter objects contains the name of the\n\\r
+zipfile targeted.");\r
+\r
+#define DEFERRED_ADDRESS(ADDR) 0\r
+\r
+static PyTypeObject ZipImporter_Type = {\r
+    PyVarObject_HEAD_INIT(DEFERRED_ADDRESS(&PyType_Type), 0)\r
+    "zipimport.zipimporter",\r
+    sizeof(ZipImporter),\r
+    0,                                          /* tp_itemsize */\r
+    (destructor)zipimporter_dealloc,            /* tp_dealloc */\r
+    0,                                          /* tp_print */\r
+    0,                                          /* tp_getattr */\r
+    0,                                          /* tp_setattr */\r
+    0,                                          /* tp_compare */\r
+    (reprfunc)zipimporter_repr,                 /* tp_repr */\r
+    0,                                          /* tp_as_number */\r
+    0,                                          /* tp_as_sequence */\r
+    0,                                          /* tp_as_mapping */\r
+    0,                                          /* tp_hash */\r
+    0,                                          /* tp_call */\r
+    0,                                          /* tp_str */\r
+    PyObject_GenericGetAttr,                    /* tp_getattro */\r
+    0,                                          /* tp_setattro */\r
+    0,                                          /* tp_as_buffer */\r
+    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE |\r
+        Py_TPFLAGS_HAVE_GC,                     /* tp_flags */\r
+    zipimporter_doc,                            /* tp_doc */\r
+    zipimporter_traverse,                       /* tp_traverse */\r
+    0,                                          /* tp_clear */\r
+    0,                                          /* tp_richcompare */\r
+    0,                                          /* tp_weaklistoffset */\r
+    0,                                          /* tp_iter */\r
+    0,                                          /* tp_iternext */\r
+    zipimporter_methods,                        /* tp_methods */\r
+    zipimporter_members,                        /* tp_members */\r
+    0,                                          /* tp_getset */\r
+    0,                                          /* tp_base */\r
+    0,                                          /* tp_dict */\r
+    0,                                          /* tp_descr_get */\r
+    0,                                          /* tp_descr_set */\r
+    0,                                          /* tp_dictoffset */\r
+    (initproc)zipimporter_init,                 /* tp_init */\r
+    PyType_GenericAlloc,                        /* tp_alloc */\r
+    PyType_GenericNew,                          /* tp_new */\r
+    PyObject_GC_Del,                            /* tp_free */\r
+};\r
+\r
+\r
+/* implementation */\r
+\r
+/* Given a buffer, return the long that is represented by the first\r
+   4 bytes, encoded as little endian. This partially reimplements\r
+   marshal.c:r_long() */\r
+static long\r
+get_long(unsigned char *buf) {\r
+    long x;\r
+    x =  buf[0];\r
+    x |= (long)buf[1] <<  8;\r
+    x |= (long)buf[2] << 16;\r
+    x |= (long)buf[3] << 24;\r
+#if SIZEOF_LONG > 4\r
+    /* Sign extension for 64-bit machines */\r
+    x |= -(x & 0x80000000L);\r
+#endif\r
+    return x;\r
+}\r
+\r
+/*\r
+   read_directory(archive) -> files dict (new reference)\r
+\r
+   Given a path to a Zip archive, build a dict, mapping file names\r
+   (local to the archive, using SEP as a separator) to toc entries.\r
+\r
+   A toc_entry is a tuple:\r
+\r
+       (__file__,      # value to use for __file__, available for all files\r
+    compress,      # compression kind; 0 for uncompressed\r
+    data_size,     # size of compressed data on disk\r
+    file_size,     # size of decompressed data\r
+    file_offset,   # offset of file header from start of archive\r
+    time,          # mod time of file (in dos format)\r
+    date,          # mod data of file (in dos format)\r
+    crc,           # crc checksum of the data\r
+       )\r
+\r
+   Directories can be recognized by the trailing SEP in the name,\r
+   data_size and file_offset are 0.\r
+*/\r
+static PyObject *\r
+read_directory(char *archive)\r
+{\r
+    PyObject *files = NULL;\r
+    FILE *fp;\r
+    long compress, crc, data_size, file_size, file_offset, date, time;\r
+    long header_offset, name_size, header_size, header_position;\r
+    long i, l, count;\r
+    size_t length;\r
+    char path[MAXPATHLEN + 5];\r
+    char name[MAXPATHLEN + 5];\r
+    char *p, endof_central_dir[22];\r
+    long arc_offset; /* offset from beginning of file to start of zip-archive */\r
+\r
+    if (strlen(archive) > MAXPATHLEN) {\r
+        PyErr_SetString(PyExc_OverflowError,\r
+                        "Zip path name is too long");\r
+        return NULL;\r
+    }\r
+    strcpy(path, archive);\r
+\r
+    fp = fopen(archive, "rb");\r
+    if (fp == NULL) {\r
+        PyErr_Format(ZipImportError, "can't open Zip file: "\r
+                     "'%.200s'", archive);\r
+        return NULL;\r
+    }\r
+\r
+    if (fseek(fp, -22, SEEK_END) == -1) {\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "can't read Zip file: %s", archive);\r
+        return NULL;\r
+    }\r
+    header_position = ftell(fp);\r
+    if (fread(endof_central_dir, 1, 22, fp) != 22) {\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "can't read Zip file: "\r
+                     "'%.200s'", archive);\r
+        return NULL;\r
+    }\r
+    if (get_long((unsigned char *)endof_central_dir) != 0x06054B50) {\r
+        /* Bad: End of Central Dir signature */\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "not a Zip file: "\r
+                     "'%.200s'", archive);\r
+        return NULL;\r
+    }\r
+\r
+    header_size = get_long((unsigned char *)endof_central_dir + 12);\r
+    header_offset = get_long((unsigned char *)endof_central_dir + 16);\r
+    arc_offset = header_position - header_offset - header_size;\r
+    header_offset += arc_offset;\r
+\r
+    files = PyDict_New();\r
+    if (files == NULL)\r
+        goto error;\r
+\r
+    length = (long)strlen(path);\r
+    path[length] = SEP;\r
+\r
+    /* Start of Central Directory */\r
+    count = 0;\r
+    for (;;) {\r
+        PyObject *t;\r
+        int err;\r
+\r
+        if (fseek(fp, header_offset, 0) == -1)  /* Start of file header */\r
+            goto fseek_error;\r
+        l = PyMarshal_ReadLongFromFile(fp);\r
+        if (l != 0x02014B50)\r
+            break;              /* Bad: Central Dir File Header */\r
+        if (fseek(fp, header_offset + 10, 0) == -1)\r
+            goto fseek_error;\r
+        compress = PyMarshal_ReadShortFromFile(fp);\r
+        time = PyMarshal_ReadShortFromFile(fp);\r
+        date = PyMarshal_ReadShortFromFile(fp);\r
+        crc = PyMarshal_ReadLongFromFile(fp);\r
+        data_size = PyMarshal_ReadLongFromFile(fp);\r
+        file_size = PyMarshal_ReadLongFromFile(fp);\r
+        name_size = PyMarshal_ReadShortFromFile(fp);\r
+        header_size = 46 + name_size +\r
+           PyMarshal_ReadShortFromFile(fp) +\r
+           PyMarshal_ReadShortFromFile(fp);\r
+        if (fseek(fp, header_offset + 42, 0) == -1)\r
+            goto fseek_error;\r
+        file_offset = PyMarshal_ReadLongFromFile(fp) + arc_offset;\r
+        if (name_size > MAXPATHLEN)\r
+            name_size = MAXPATHLEN;\r
+\r
+        p = name;\r
+        for (i = 0; i < name_size; i++) {\r
+            *p = (char)getc(fp);\r
+            if (*p == '/')\r
+                *p = SEP;\r
+            p++;\r
+        }\r
+        *p = 0;         /* Add terminating null byte */\r
+        header_offset += header_size;\r
+\r
+        strncpy(path + length + 1, name, MAXPATHLEN - length - 1);\r
+\r
+        t = Py_BuildValue("siiiiiii", path, compress, data_size,\r
+                          file_size, file_offset, time, date, crc);\r
+        if (t == NULL)\r
+            goto error;\r
+        err = PyDict_SetItemString(files, name, t);\r
+        Py_DECREF(t);\r
+        if (err != 0)\r
+            goto error;\r
+        count++;\r
+    }\r
+    fclose(fp);\r
+    if (Py_VerboseFlag)\r
+        PySys_WriteStderr("# zipimport: found %ld names in %s\n",\r
+            count, archive);\r
+    return files;\r
+fseek_error:\r
+    fclose(fp);\r
+    Py_XDECREF(files);\r
+    PyErr_Format(ZipImportError, "can't read Zip file: %s", archive);\r
+    return NULL;\r
+error:\r
+    fclose(fp);\r
+    Py_XDECREF(files);\r
+    return NULL;\r
+}\r
+\r
+/* Return the zlib.decompress function object, or NULL if zlib couldn't\r
+   be imported. The function is cached when found, so subsequent calls\r
+   don't import zlib again. */\r
+static PyObject *\r
+get_decompress_func(void)\r
+{\r
+    static int importing_zlib = 0;\r
+    PyObject *zlib;\r
+    PyObject *decompress;\r
+\r
+    if (importing_zlib != 0)\r
+        /* Someone has a zlib.py[co] in their Zip file;\r
+           let's avoid a stack overflow. */\r
+        return NULL;\r
+    importing_zlib = 1;\r
+    zlib = PyImport_ImportModuleNoBlock("zlib");\r
+    importing_zlib = 0;\r
+    if (zlib != NULL) {\r
+        decompress = PyObject_GetAttrString(zlib,\r
+                                            "decompress");\r
+        Py_DECREF(zlib);\r
+    }\r
+    else {\r
+        PyErr_Clear();\r
+        decompress = NULL;\r
+    }\r
+    if (Py_VerboseFlag)\r
+        PySys_WriteStderr("# zipimport: zlib %s\n",\r
+            zlib != NULL ? "available": "UNAVAILABLE");\r
+    return decompress;\r
+}\r
+\r
+/* Given a path to a Zip file and a toc_entry, return the (uncompressed)\r
+   data as a new reference. */\r
+static PyObject *\r
+get_data(char *archive, PyObject *toc_entry)\r
+{\r
+    PyObject *raw_data, *data = NULL, *decompress;\r
+    char *buf;\r
+    FILE *fp;\r
+    int err;\r
+    Py_ssize_t bytes_read = 0;\r
+    long l;\r
+    char *datapath;\r
+    long compress, data_size, file_size, file_offset;\r
+    long time, date, crc;\r
+\r
+    if (!PyArg_ParseTuple(toc_entry, "slllllll", &datapath, &compress,\r
+                          &data_size, &file_size, &file_offset, &time,\r
+                          &date, &crc)) {\r
+        return NULL;\r
+    }\r
+\r
+    fp = fopen(archive, "rb");\r
+    if (!fp) {\r
+        PyErr_Format(PyExc_IOError,\r
+           "zipimport: can not open file %s", archive);\r
+        return NULL;\r
+    }\r
+\r
+    /* Check to make sure the local file header is correct */\r
+    if (fseek(fp, file_offset, 0) == -1) {\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "can't read Zip file: %s", archive);\r
+        return NULL;\r
+    }\r
+\r
+    l = PyMarshal_ReadLongFromFile(fp);\r
+    if (l != 0x04034B50) {\r
+        /* Bad: Local File Header */\r
+        PyErr_Format(ZipImportError,\r
+                     "bad local file header in %s",\r
+                     archive);\r
+        fclose(fp);\r
+        return NULL;\r
+    }\r
+    if (fseek(fp, file_offset + 26, 0) == -1) {\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "can't read Zip file: %s", archive);\r
+        return NULL;\r
+    }\r
+\r
+    l = 30 + PyMarshal_ReadShortFromFile(fp) +\r
+        PyMarshal_ReadShortFromFile(fp);        /* local header size */\r
+    file_offset += l;           /* Start of file data */\r
+\r
+    raw_data = PyString_FromStringAndSize((char *)NULL, compress == 0 ?\r
+                                          data_size : data_size + 1);\r
+    if (raw_data == NULL) {\r
+        fclose(fp);\r
+        return NULL;\r
+    }\r
+    buf = PyString_AsString(raw_data);\r
+\r
+    err = fseek(fp, file_offset, 0);\r
+    if (err == 0) {\r
+        bytes_read = fread(buf, 1, data_size, fp);\r
+    } else {\r
+        fclose(fp);\r
+        PyErr_Format(ZipImportError, "can't read Zip file: %s", archive);\r
+        return NULL;\r
+    }\r
+    fclose(fp);\r
+    if (err || bytes_read != data_size) {\r
+        PyErr_SetString(PyExc_IOError,\r
+                        "zipimport: can't read data");\r
+        Py_DECREF(raw_data);\r
+        return NULL;\r
+    }\r
+\r
+    if (compress != 0) {\r
+        buf[data_size] = 'Z';  /* saw this in zipfile.py */\r
+        data_size++;\r
+    }\r
+    buf[data_size] = '\0';\r
+\r
+    if (compress == 0)  /* data is not compressed */\r
+        return raw_data;\r
+\r
+    /* Decompress with zlib */\r
+    decompress = get_decompress_func();\r
+    if (decompress == NULL) {\r
+        PyErr_SetString(ZipImportError,\r
+                        "can't decompress data; "\r
+                        "zlib not available");\r
+        goto error;\r
+    }\r
+    data = PyObject_CallFunction(decompress, "Oi", raw_data, -15);\r
+    Py_DECREF(decompress);\r
+error:\r
+    Py_DECREF(raw_data);\r
+    return data;\r
+}\r
+\r
+/* Lenient date/time comparison function. The precision of the mtime\r
+   in the archive is lower than the mtime stored in a .pyc: we\r
+   must allow a difference of at most one second. */\r
+static int\r
+eq_mtime(time_t t1, time_t t2)\r
+{\r
+    time_t d = t1 - t2;\r
+    if (d < 0)\r
+        d = -d;\r
+    /* dostime only stores even seconds, so be lenient */\r
+    return d <= 1;\r
+}\r
+\r
+/* Given the contents of a .py[co] file in a buffer, unmarshal the data\r
+   and return the code object. Return None if it the magic word doesn't\r
+   match (we do this instead of raising an exception as we fall back\r
+   to .py if available and we don't want to mask other errors).\r
+   Returns a new reference. */\r
+static PyObject *\r
+unmarshal_code(char *pathname, PyObject *data, time_t mtime)\r
+{\r
+    PyObject *code;\r
+    char *buf = PyString_AsString(data);\r
+    Py_ssize_t size = PyString_Size(data);\r
+\r
+    if (size <= 9) {\r
+        PyErr_SetString(ZipImportError,\r
+                        "bad pyc data");\r
+        return NULL;\r
+    }\r
+\r
+    if (get_long((unsigned char *)buf) != PyImport_GetMagicNumber()) {\r
+        if (Py_VerboseFlag)\r
+            PySys_WriteStderr("# %s has bad magic\n",\r
+                              pathname);\r
+        Py_INCREF(Py_None);\r
+        return Py_None;  /* signal caller to try alternative */\r
+    }\r
+\r
+    if (mtime != 0 && !eq_mtime(get_long((unsigned char *)buf + 4),\r
+                                mtime)) {\r
+        if (Py_VerboseFlag)\r
+            PySys_WriteStderr("# %s has bad mtime\n",\r
+                              pathname);\r
+        Py_INCREF(Py_None);\r
+        return Py_None;  /* signal caller to try alternative */\r
+    }\r
+\r
+    code = PyMarshal_ReadObjectFromString(buf + 8, size - 8);\r
+    if (code == NULL)\r
+        return NULL;\r
+    if (!PyCode_Check(code)) {\r
+        Py_DECREF(code);\r
+        PyErr_Format(PyExc_TypeError,\r
+             "compiled module %.200s is not a code object",\r
+             pathname);\r
+        return NULL;\r
+    }\r
+    return code;\r
+}\r
+\r
+/* Replace any occurances of "\r\n?" in the input string with "\n".\r
+   This converts DOS and Mac line endings to Unix line endings.\r
+   Also append a trailing "\n" to be compatible with\r
+   PyParser_SimpleParseFile(). Returns a new reference. */\r
+static PyObject *\r
+normalize_line_endings(PyObject *source)\r
+{\r
+    char *buf, *q, *p = PyString_AsString(source);\r
+    PyObject *fixed_source;\r
+\r
+    if (!p)\r
+        return NULL;\r
+\r
+    /* one char extra for trailing \n and one for terminating \0 */\r
+    buf = (char *)PyMem_Malloc(PyString_Size(source) + 2);\r
+    if (buf == NULL) {\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "zipimport: no memory to allocate "\r
+                        "source buffer");\r
+        return NULL;\r
+    }\r
+    /* replace "\r\n?" by "\n" */\r
+    for (q = buf; *p != '\0'; p++) {\r
+        if (*p == '\r') {\r
+            *q++ = '\n';\r
+            if (*(p + 1) == '\n')\r
+                p++;\r
+        }\r
+        else\r
+            *q++ = *p;\r
+    }\r
+    *q++ = '\n';  /* add trailing \n */\r
+    *q = '\0';\r
+    fixed_source = PyString_FromString(buf);\r
+    PyMem_Free(buf);\r
+    return fixed_source;\r
+}\r
+\r
+/* Given a string buffer containing Python source code, compile it\r
+   return and return a code object as a new reference. */\r
+static PyObject *\r
+compile_source(char *pathname, PyObject *source)\r
+{\r
+    PyObject *code, *fixed_source;\r
+\r
+    fixed_source = normalize_line_endings(source);\r
+    if (fixed_source == NULL)\r
+        return NULL;\r
+\r
+    code = Py_CompileString(PyString_AsString(fixed_source), pathname,\r
+                            Py_file_input);\r
+    Py_DECREF(fixed_source);\r
+    return code;\r
+}\r
+\r
+/* Convert the date/time values found in the Zip archive to a value\r
+   that's compatible with the time stamp stored in .pyc files. */\r
+static time_t\r
+parse_dostime(int dostime, int dosdate)\r
+{\r
+    struct tm stm;\r
+\r
+    memset((void *) &stm, '\0', sizeof(stm));\r
+\r
+    stm.tm_sec   =  (dostime        & 0x1f) * 2;\r
+    stm.tm_min   =  (dostime >> 5)  & 0x3f;\r
+    stm.tm_hour  =  (dostime >> 11) & 0x1f;\r
+    stm.tm_mday  =   dosdate        & 0x1f;\r
+    stm.tm_mon   = ((dosdate >> 5)  & 0x0f) - 1;\r
+    stm.tm_year  = ((dosdate >> 9)  & 0x7f) + 80;\r
+    stm.tm_isdst =   -1; /* wday/yday is ignored */\r
+\r
+    return mktime(&stm);\r
+}\r
+\r
+/* Given a path to a .pyc or .pyo file in the archive, return the\r
+   modification time of the matching .py file, or 0 if no source\r
+   is available. */\r
+static time_t\r
+get_mtime_of_source(ZipImporter *self, char *path)\r
+{\r
+    PyObject *toc_entry;\r
+    time_t mtime = 0;\r
+    Py_ssize_t lastchar = strlen(path) - 1;\r
+    char savechar = path[lastchar];\r
+    path[lastchar] = '\0';  /* strip 'c' or 'o' from *.py[co] */\r
+    toc_entry = PyDict_GetItemString(self->files, path);\r
+    if (toc_entry != NULL && PyTuple_Check(toc_entry) &&\r
+        PyTuple_Size(toc_entry) == 8) {\r
+        /* fetch the time stamp of the .py file for comparison\r
+           with an embedded pyc time stamp */\r
+        int time, date;\r
+        time = PyInt_AsLong(PyTuple_GetItem(toc_entry, 5));\r
+        date = PyInt_AsLong(PyTuple_GetItem(toc_entry, 6));\r
+        mtime = parse_dostime(time, date);\r
+    }\r
+    path[lastchar] = savechar;\r
+    return mtime;\r
+}\r
+\r
+/* Return the code object for the module named by 'fullname' from the\r
+   Zip archive as a new reference. */\r
+static PyObject *\r
+get_code_from_data(ZipImporter *self, int ispackage, int isbytecode,\r
+                   time_t mtime, PyObject *toc_entry)\r
+{\r
+    PyObject *data, *code;\r
+    char *modpath;\r
+    char *archive = PyString_AsString(self->archive);\r
+\r
+    if (archive == NULL)\r
+        return NULL;\r
+\r
+    data = get_data(archive, toc_entry);\r
+    if (data == NULL)\r
+        return NULL;\r
+\r
+    modpath = PyString_AsString(PyTuple_GetItem(toc_entry, 0));\r
+\r
+    if (isbytecode) {\r
+        code = unmarshal_code(modpath, data, mtime);\r
+    }\r
+    else {\r
+        code = compile_source(modpath, data);\r
+    }\r
+    Py_DECREF(data);\r
+    return code;\r
+}\r
+\r
+/* Get the code object associated with the module specified by\r
+   'fullname'. */\r
+static PyObject *\r
+get_module_code(ZipImporter *self, char *fullname,\r
+                int *p_ispackage, char **p_modpath)\r
+{\r
+    PyObject *toc_entry;\r
+    char *subname, path[MAXPATHLEN + 1];\r
+    int len;\r
+    struct st_zip_searchorder *zso;\r
+\r
+    subname = get_subname(fullname);\r
+\r
+    len = make_filename(PyString_AsString(self->prefix), subname, path);\r
+    if (len < 0)\r
+        return NULL;\r
+\r
+    for (zso = zip_searchorder; *zso->suffix; zso++) {\r
+        PyObject *code = NULL;\r
+\r
+        strcpy(path + len, zso->suffix);\r
+        if (Py_VerboseFlag > 1)\r
+            PySys_WriteStderr("# trying %s%c%s\n",\r
+                              PyString_AsString(self->archive),\r
+                              SEP, path);\r
+        toc_entry = PyDict_GetItemString(self->files, path);\r
+        if (toc_entry != NULL) {\r
+            time_t mtime = 0;\r
+            int ispackage = zso->type & IS_PACKAGE;\r
+            int isbytecode = zso->type & IS_BYTECODE;\r
+\r
+            if (isbytecode)\r
+                mtime = get_mtime_of_source(self, path);\r
+            if (p_ispackage != NULL)\r
+                *p_ispackage = ispackage;\r
+            code = get_code_from_data(self, ispackage,\r
+                                      isbytecode, mtime,\r
+                                      toc_entry);\r
+            if (code == Py_None) {\r
+                /* bad magic number or non-matching mtime\r
+                   in byte code, try next */\r
+                Py_DECREF(code);\r
+                continue;\r
+            }\r
+            if (code != NULL && p_modpath != NULL)\r
+                *p_modpath = PyString_AsString(\r
+                    PyTuple_GetItem(toc_entry, 0));\r
+            return code;\r
+        }\r
+    }\r
+    PyErr_Format(ZipImportError, "can't find module '%.200s'", fullname);\r
+    return NULL;\r
+}\r
+\r
+\r
+/* Module init */\r
+\r
+PyDoc_STRVAR(zipimport_doc,\r
+"zipimport provides support for importing Python modules from Zip archives.\n\\r
+\n\\r
+This module exports three objects:\n\\r
+- zipimporter: a class; its constructor takes a path to a Zip archive.\n\\r
+- ZipImportError: exception raised by zipimporter objects. It's a\n\\r
+  subclass of ImportError, so it can be caught as ImportError, too.\n\\r
+- _zip_directory_cache: a dict, mapping archive paths to zip directory\n\\r
+  info dicts, as used in zipimporter._files.\n\\r
+\n\\r
+It is usually not needed to use the zipimport module explicitly; it is\n\\r
+used by the builtin import mechanism for sys.path items that are paths\n\\r
+to Zip archives.");\r
+\r
+PyMODINIT_FUNC\r
+initzipimport(void)\r
+{\r
+    PyObject *mod;\r
+\r
+    if (PyType_Ready(&ZipImporter_Type) < 0)\r
+        return;\r
+\r
+    /* Correct directory separator */\r
+    zip_searchorder[0].suffix[0] = SEP;\r
+    zip_searchorder[1].suffix[0] = SEP;\r
+    zip_searchorder[2].suffix[0] = SEP;\r
+    if (Py_OptimizeFlag) {\r
+        /* Reverse *.pyc and *.pyo */\r
+        struct st_zip_searchorder tmp;\r
+        tmp = zip_searchorder[0];\r
+        zip_searchorder[0] = zip_searchorder[1];\r
+        zip_searchorder[1] = tmp;\r
+        tmp = zip_searchorder[3];\r
+        zip_searchorder[3] = zip_searchorder[4];\r
+        zip_searchorder[4] = tmp;\r
+    }\r
+\r
+    mod = Py_InitModule4("zipimport", NULL, zipimport_doc,\r
+                         NULL, PYTHON_API_VERSION);\r
+    if (mod == NULL)\r
+        return;\r
+\r
+    ZipImportError = PyErr_NewException("zipimport.ZipImportError",\r
+                                        PyExc_ImportError, NULL);\r
+    if (ZipImportError == NULL)\r
+        return;\r
+\r
+    Py_INCREF(ZipImportError);\r
+    if (PyModule_AddObject(mod, "ZipImportError",\r
+                           ZipImportError) < 0)\r
+        return;\r
+\r
+    Py_INCREF(&ZipImporter_Type);\r
+    if (PyModule_AddObject(mod, "zipimporter",\r
+                           (PyObject *)&ZipImporter_Type) < 0)\r
+        return;\r
+\r
+    zip_directory_cache = PyDict_New();\r
+    if (zip_directory_cache == NULL)\r
+        return;\r
+    Py_INCREF(zip_directory_cache);\r
+    if (PyModule_AddObject(mod, "_zip_directory_cache",\r
+                           zip_directory_cache) < 0)\r
+        return;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/ChangeLog b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/ChangeLog
new file mode 100644 (file)
index 0000000..ec8ecc9
--- /dev/null
@@ -0,0 +1,1472 @@
+\r
+                ChangeLog file for zlib\r
+\r
+Changes in 1.2.8 (28 Apr 2013)\r
+- Update contrib/minizip/iowin32.c for Windows RT [Vollant]\r
+- Do not force Z_CONST for C++\r
+- Clean up contrib/vstudio [Ro§]\r
+- Correct spelling error in zlib.h\r
+- Fix mixed line endings in contrib/vstudio\r
+\r
+Changes in 1.2.7.3 (13 Apr 2013)\r
+- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc\r
+\r
+Changes in 1.2.7.2 (13 Apr 2013)\r
+- Change check for a four-byte type back to hexadecimal\r
+- Fix typo in win32/Makefile.msc\r
+- Add casts in gzwrite.c for pointer differences\r
+\r
+Changes in 1.2.7.1 (24 Mar 2013)\r
+- Replace use of unsafe string functions with snprintf if available\r
+- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink]\r
+- Fix gzgetc undefine when Z_PREFIX set [Turk]\r
+- Eliminate use of mktemp in Makefile (not always available)\r
+- Fix bug in 'F' mode for gzopen()\r
+- Add inflateGetDictionary() function\r
+- Correct comment in deflate.h\r
+- Use _snprintf for snprintf in Microsoft C\r
+- On Darwin, only use /usr/bin/libtool if libtool is not Apple\r
+- Delete "--version" file if created by "ar --version" [Richard G.]\r
+- Fix configure check for veracity of compiler error return codes\r
+- Fix CMake compilation of static lib for MSVC2010 x64\r
+- Remove unused variable in infback9.c\r
+- Fix argument checks in gzlog_compress() and gzlog_write()\r
+- Clean up the usage of z_const and respect const usage within zlib\r
+- Clean up examples/gzlog.[ch] comparisons of different types\r
+- Avoid shift equal to bits in type (caused endless loop)\r
+- Fix unintialized value bug in gzputc() introduced by const patches\r
+- Fix memory allocation error in examples/zran.c [Nor]\r
+- Fix bug where gzopen(), gzclose() would write an empty file\r
+- Fix bug in gzclose() when gzwrite() runs out of memory\r
+- Check for input buffer malloc failure in examples/gzappend.c\r
+- Add note to contrib/blast to use binary mode in stdio\r
+- Fix comparisons of differently signed integers in contrib/blast\r
+- Check for invalid code length codes in contrib/puff\r
+- Fix serious but very rare decompression bug in inftrees.c\r
+- Update inflateBack() comments, since inflate() can be faster\r
+- Use underscored I/O function names for WINAPI_FAMILY\r
+- Add _tr_flush_bits to the external symbols prefixed by --zprefix\r
+- Add contrib/vstudio/vc10 pre-build step for static only\r
+- Quote --version-script argument in CMakeLists.txt\r
+- Don't specify --version-script on Apple platforms in CMakeLists.txt\r
+- Fix casting error in contrib/testzlib/testzlib.c\r
+- Fix types in contrib/minizip to match result of get_crc_table()\r
+- Simplify contrib/vstudio/vc10 with 'd' suffix\r
+- Add TOP support to win32/Makefile.msc\r
+- Suport i686 and amd64 assembler builds in CMakeLists.txt\r
+- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h\r
+- Add vc11 and vc12 build files to contrib/vstudio\r
+- Add gzvprintf() as an undocumented function in zlib\r
+- Fix configure for Sun shell\r
+- Remove runtime check in configure for four-byte integer type\r
+- Add casts and consts to ease user conversion to C++\r
+- Add man pages for minizip and miniunzip\r
+- In Makefile uninstall, don't rm if preceding cd fails\r
+- Do not return Z_BUF_ERROR if deflateParam() has nothing to write\r
+\r
+Changes in 1.2.7 (2 May 2012)\r
+- Replace use of memmove() with a simple copy for portability\r
+- Test for existence of strerror\r
+- Restore gzgetc_ for backward compatibility with 1.2.6\r
+- Fix build with non-GNU make on Solaris\r
+- Require gcc 4.0 or later on Mac OS X to use the hidden attribute\r
+- Include unistd.h for Watcom C\r
+- Use __WATCOMC__ instead of __WATCOM__\r
+- Do not use the visibility attribute if NO_VIZ defined\r
+- Improve the detection of no hidden visibility attribute\r
+- Avoid using __int64 for gcc or solo compilation\r
+- Cast to char * in gzprintf to avoid warnings [Zinser]\r
+- Fix make_vms.com for VAX [Zinser]\r
+- Don't use library or built-in byte swaps\r
+- Simplify test and use of gcc hidden attribute\r
+- Fix bug in gzclose_w() when gzwrite() fails to allocate memory\r
+- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen()\r
+- Fix bug in test/minigzip.c for configure --solo\r
+- Fix contrib/vstudio project link errors [Mohanathas]\r
+- Add ability to choose the builder in make_vms.com [Schweda]\r
+- Add DESTDIR support to mingw32 win32/Makefile.gcc\r
+- Fix comments in win32/Makefile.gcc for proper usage\r
+- Allow overriding the default install locations for cmake\r
+- Generate and install the pkg-config file with cmake\r
+- Build both a static and a shared version of zlib with cmake\r
+- Include version symbols for cmake builds\r
+- If using cmake with MSVC, add the source directory to the includes\r
+- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta]\r
+- Move obsolete emx makefile to old [Truta]\r
+- Allow the use of -Wundef when compiling or using zlib\r
+- Avoid the use of the -u option with mktemp\r
+- Improve inflate() documentation on the use of Z_FINISH\r
+- Recognize clang as gcc\r
+- Add gzopen_w() in Windows for wide character path names\r
+- Rename zconf.h in CMakeLists.txt to move it out of the way\r
+- Add source directory in CMakeLists.txt for building examples\r
+- Look in build directory for zlib.pc in CMakeLists.txt\r
+- Remove gzflags from zlibvc.def in vc9 and vc10\r
+- Fix contrib/minizip compilation in the MinGW environment\r
+- Update ./configure for Solaris, support --64 [Mooney]\r
+- Remove -R. from Solaris shared build (possible security issue)\r
+- Avoid race condition for parallel make (-j) running example\r
+- Fix type mismatch between get_crc_table() and crc_table\r
+- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler]\r
+- Fix the path to zlib.map in CMakeLists.txt\r
+- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe]\r
+- Add instructions to win32/Makefile.gcc for shared install [Torri]\r
+\r
+Changes in 1.2.6.1 (12 Feb 2012)\r
+- Avoid the use of the Objective-C reserved name "id"\r
+- Include io.h in gzguts.h for Microsoft compilers\r
+- Fix problem with ./configure --prefix and gzgetc macro\r
+- Include gz_header definition when compiling zlib solo\r
+- Put gzflags() functionality back in zutil.c\r
+- Avoid library header include in crc32.c for Z_SOLO\r
+- Use name in GCC_CLASSIC as C compiler for coverage testing, if set\r
+- Minor cleanup in contrib/minizip/zip.c [Vollant]\r
+- Update make_vms.com [Zinser]\r
+- Remove unnecessary gzgetc_ function\r
+- Use optimized byte swap operations for Microsoft and GNU [Snyder]\r
+- Fix minor typo in zlib.h comments [Rzesniowiecki]\r
+\r
+Changes in 1.2.6 (29 Jan 2012)\r
+- Update the Pascal interface in contrib/pascal\r
+- Fix function numbers for gzgetc_ in zlibvc.def files\r
+- Fix configure.ac for contrib/minizip [Schiffer]\r
+- Fix large-entry detection in minizip on 64-bit systems [Schiffer]\r
+- Have ./configure use the compiler return code for error indication\r
+- Fix CMakeLists.txt for cross compilation [McClure]\r
+- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes]\r
+- Fix compilation of contrib/minizip on FreeBSD [Marquez]\r
+- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath]\r
+- Include io.h for Turbo C / Borland C on all platforms [Truta]\r
+- Make version explicit in contrib/minizip/configure.ac [Bosmans]\r
+- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant]\r
+- Minor cleanup up contrib/minizip/unzip.c [Vollant]\r
+- Fix bug when compiling minizip with C++ [Vollant]\r
+- Protect for long name and extra fields in contrib/minizip [Vollant]\r
+- Avoid some warnings in contrib/minizip [Vollant]\r
+- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip\r
+- Add missing libs to minizip linker command\r
+- Add support for VPATH builds in contrib/minizip\r
+- Add an --enable-demos option to contrib/minizip/configure\r
+- Add the generation of configure.log by ./configure\r
+- Exit when required parameters not provided to win32/Makefile.gcc\r
+- Have gzputc return the character written instead of the argument\r
+- Use the -m option on ldconfig for BSD systems [Tobias]\r
+- Correct in zlib.map when deflateResetKeep was added\r
+\r
+Changes in 1.2.5.3 (15 Jan 2012)\r
+- Restore gzgetc function for binary compatibility\r
+- Do not use _lseeki64 under Borland C++ [Truta]\r
+- Update win32/Makefile.msc to build test/*.c [Truta]\r
+- Remove old/visualc6 given CMakefile and other alternatives\r
+- Update AS400 build files and documentation [Monnerat]\r
+- Update win32/Makefile.gcc to build test/*.c [Truta]\r
+- Permit stronger flushes after Z_BLOCK flushes\r
+- Avoid extraneous empty blocks when doing empty flushes\r
+- Permit Z_NULL arguments to deflatePending\r
+- Allow deflatePrime() to insert bits in the middle of a stream\r
+- Remove second empty static block for Z_PARTIAL_FLUSH\r
+- Write out all of the available bits when using Z_BLOCK\r
+- Insert the first two strings in the hash table after a flush\r
+\r
+Changes in 1.2.5.2 (17 Dec 2011)\r
+- fix ld error: unable to find version dependency 'ZLIB_1.2.5'\r
+- use relative symlinks for shared libs\r
+- Avoid searching past window for Z_RLE strategy\r
+- Assure that high-water mark initialization is always applied in deflate\r
+- Add assertions to fill_window() in deflate.c to match comments\r
+- Update python link in README\r
+- Correct spelling error in gzread.c\r
+- Fix bug in gzgets() for a concatenated empty gzip stream\r
+- Correct error in comment for gz_make()\r
+- Change gzread() and related to ignore junk after gzip streams\r
+- Allow gzread() and related to continue after gzclearerr()\r
+- Allow gzrewind() and gzseek() after a premature end-of-file\r
+- Simplify gzseek() now that raw after gzip is ignored\r
+- Change gzgetc() to a macro for speed (~40% speedup in testing)\r
+- Fix gzclose() to return the actual error last encountered\r
+- Always add large file support for windows\r
+- Include zconf.h for windows large file support\r
+- Include zconf.h.cmakein for windows large file support\r
+- Update zconf.h.cmakein on make distclean\r
+- Merge vestigial vsnprintf determination from zutil.h to gzguts.h\r
+- Clarify how gzopen() appends in zlib.h comments\r
+- Correct documentation of gzdirect() since junk at end now ignored\r
+- Add a transparent write mode to gzopen() when 'T' is in the mode\r
+- Update python link in zlib man page\r
+- Get inffixed.h and MAKEFIXED result to match\r
+- Add a ./config --solo option to make zlib subset with no libary use\r
+- Add undocumented inflateResetKeep() function for CAB file decoding\r
+- Add --cover option to ./configure for gcc coverage testing\r
+- Add #define ZLIB_CONST option to use const in the z_stream interface\r
+- Add comment to gzdopen() in zlib.h to use dup() when using fileno()\r
+- Note behavior of uncompress() to provide as much data as it can\r
+- Add files in contrib/minizip to aid in building libminizip\r
+- Split off AR options in Makefile.in and configure\r
+- Change ON macro to Z_ARG to avoid application conflicts\r
+- Facilitate compilation with Borland C++ for pragmas and vsnprintf\r
+- Include io.h for Turbo C / Borland C++\r
+- Move example.c and minigzip.c to test/\r
+- Simplify incomplete code table filling in inflate_table()\r
+- Remove code from inflate.c and infback.c that is impossible to execute\r
+- Test the inflate code with full coverage\r
+- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw)\r
+- Add deflateResetKeep and fix inflateResetKeep to retain dictionary\r
+- Fix gzwrite.c to accommodate reduced memory zlib compilation\r
+- Have inflate() with Z_FINISH avoid the allocation of a window\r
+- Do not set strm->adler when doing raw inflate\r
+- Fix gzeof() to behave just like feof() when read is not past end of file\r
+- Fix bug in gzread.c when end-of-file is reached\r
+- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF\r
+- Document gzread() capability to read concurrently written files\r
+- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo]\r
+\r
+Changes in 1.2.5.1 (10 Sep 2011)\r
+- Update FAQ entry on shared builds (#13)\r
+- Avoid symbolic argument to chmod in Makefile.in\r
+- Fix bug and add consts in contrib/puff [Oberhumer]\r
+- Update contrib/puff/zeros.raw test file to have all block types\r
+- Add full coverage test for puff in contrib/puff/Makefile\r
+- Fix static-only-build install in Makefile.in\r
+- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno]\r
+- Add libz.a dependency to shared in Makefile.in for parallel builds\r
+- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out\r
+- Replace $(...) with `...` in configure for non-bash sh [Bowler]\r
+- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen]\r
+- Add solaris* to Linux* in configure to allow gcc use [Groffen]\r
+- Add *bsd* to Linux* case in configure [Bar-Lev]\r
+- Add inffast.obj to dependencies in win32/Makefile.msc\r
+- Correct spelling error in deflate.h [Kohler]\r
+- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc\r
+- Add test to configure for GNU C looking for gcc in output of $cc -v\r
+- Add zlib.pc generation to win32/Makefile.gcc [Weigelt]\r
+- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not\r
+- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense\r
+- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser)\r
+- Make stronger test in zconf.h to include unistd.h for LFS\r
+- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack]\r
+- Fix zlib.h LFS support when Z_PREFIX used\r
+- Add updated as400 support (removed from old) [Monnerat]\r
+- Avoid deflate sensitivity to volatile input data\r
+- Avoid division in adler32_combine for NO_DIVIDE\r
+- Clarify the use of Z_FINISH with deflateBound() amount of space\r
+- Set binary for output file in puff.c\r
+- Use u4 type for crc_table to avoid conversion warnings\r
+- Apply casts in zlib.h to avoid conversion warnings\r
+- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller]\r
+- Improve inflateSync() documentation to note indeterminancy\r
+- Add deflatePending() function to return the amount of pending output\r
+- Correct the spelling of "specification" in FAQ [Randers-Pehrson]\r
+- Add a check in configure for stdarg.h, use for gzprintf()\r
+- Check that pointers fit in ints when gzprint() compiled old style\r
+- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler]\r
+- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt]\r
+- Add debug records in assmebler code [Londer]\r
+- Update RFC references to use http://tools.ietf.org/html/... [Li]\r
+- Add --archs option, use of libtool to configure for Mac OS X [Borstel]\r
+\r
+Changes in 1.2.5 (19 Apr 2010)\r
+- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev]\r
+- Default to libdir as sharedlibdir in configure [Nieder]\r
+- Update copyright dates on modified source files\r
+- Update trees.c to be able to generate modified trees.h\r
+- Exit configure for MinGW, suggesting win32/Makefile.gcc\r
+- Check for NULL path in gz_open [Homurlu]\r
+\r
+Changes in 1.2.4.5 (18 Apr 2010)\r
+- Set sharedlibdir in configure [Torok]\r
+- Set LDFLAGS in Makefile.in [Bar-Lev]\r
+- Avoid mkdir objs race condition in Makefile.in [Bowler]\r
+- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays\r
+- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C\r
+- Don't use hidden attribute when it is a warning generator (e.g. Solaris)\r
+\r
+Changes in 1.2.4.4 (18 Apr 2010)\r
+- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok]\r
+- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty\r
+- Try to use bash or ksh regardless of functionality of /bin/sh\r
+- Fix configure incompatibility with NetBSD sh\r
+- Remove attempt to run under bash or ksh since have better NetBSD fix\r
+- Fix win32/Makefile.gcc for MinGW [Bar-Lev]\r
+- Add diagnostic messages when using CROSS_PREFIX in configure\r
+- Added --sharedlibdir option to configure [Weigelt]\r
+- Use hidden visibility attribute when available [Frysinger]\r
+\r
+Changes in 1.2.4.3 (10 Apr 2010)\r
+- Only use CROSS_PREFIX in configure for ar and ranlib if they exist\r
+- Use CROSS_PREFIX for nm [Bar-Lev]\r
+- Assume _LARGEFILE64_SOURCE defined is equivalent to true\r
+- Avoid use of undefined symbols in #if with && and ||\r
+- Make *64 prototypes in gzguts.h consistent with functions\r
+- Add -shared load option for MinGW in configure [Bowler]\r
+- Move z_off64_t to public interface, use instead of off64_t\r
+- Remove ! from shell test in configure (not portable to Solaris)\r
+- Change +0 macro tests to -0 for possibly increased portability\r
+\r
+Changes in 1.2.4.2 (9 Apr 2010)\r
+- Add consistent carriage returns to readme.txt's in masmx86 and masmx64\r
+- Really provide prototypes for *64 functions when building without LFS\r
+- Only define unlink() in minigzip.c if unistd.h not included\r
+- Update README to point to contrib/vstudio project files\r
+- Move projects/vc6 to old/ and remove projects/\r
+- Include stdlib.h in minigzip.c for setmode() definition under WinCE\r
+- Clean up assembler builds in win32/Makefile.msc [Rowe]\r
+- Include sys/types.h for Microsoft for off_t definition\r
+- Fix memory leak on error in gz_open()\r
+- Symbolize nm as $NM in configure [Weigelt]\r
+- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt]\r
+- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined\r
+- Fix bug in gzeof() to take into account unused input data\r
+- Avoid initialization of structures with variables in puff.c\r
+- Updated win32/README-WIN32.txt [Rowe]\r
+\r
+Changes in 1.2.4.1 (28 Mar 2010)\r
+- Remove the use of [a-z] constructs for sed in configure [gentoo 310225]\r
+- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech]\r
+- Restore "for debugging" comment on sprintf() in gzlib.c\r
+- Remove fdopen for MVS from gzguts.h\r
+- Put new README-WIN32.txt in win32 [Rowe]\r
+- Add check for shell to configure and invoke another shell if needed\r
+- Fix big fat stinking bug in gzseek() on uncompressed files\r
+- Remove vestigial F_OPEN64 define in zutil.h\r
+- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE\r
+- Avoid errors on non-LFS systems when applications define LFS macros\r
+- Set EXE to ".exe" in configure for MINGW [Kahle]\r
+- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill]\r
+- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev]\r
+- Add DLL install in win32/makefile.gcc [Bar-Lev]\r
+- Allow Linux* or linux* from uname in configure [Bar-Lev]\r
+- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev]\r
+- Add cross-compilation prefixes to configure [Bar-Lev]\r
+- Match type exactly in gz_load() invocation in gzread.c\r
+- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func\r
+- Provide prototypes for *64 functions when building zlib without LFS\r
+- Don't use -lc when linking shared library on MinGW\r
+- Remove errno.h check in configure and vestigial errno code in zutil.h\r
+\r
+Changes in 1.2.4 (14 Mar 2010)\r
+- Fix VER3 extraction in configure for no fourth subversion\r
+- Update zlib.3, add docs to Makefile.in to make .pdf out of it\r
+- Add zlib.3.pdf to distribution\r
+- Don't set error code in gzerror() if passed pointer is NULL\r
+- Apply destination directory fixes to CMakeLists.txt [Lowman]\r
+- Move #cmakedefine's to a new zconf.in.cmakein\r
+- Restore zconf.h for builds that don't use configure or cmake\r
+- Add distclean to dummy Makefile for convenience\r
+- Update and improve INDEX, README, and FAQ\r
+- Update CMakeLists.txt for the return of zconf.h [Lowman]\r
+- Update contrib/vstudio/vc9 and vc10 [Vollant]\r
+- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc\r
+- Apply license and readme changes to contrib/asm686 [Raiter]\r
+- Check file name lengths and add -c option in minigzip.c [Li]\r
+- Update contrib/amd64 and contrib/masmx86/ [Vollant]\r
+- Avoid use of "eof" parameter in trees.c to not shadow library variable\r
+- Update make_vms.com for removal of zlibdefs.h [Zinser]\r
+- Update assembler code and vstudio projects in contrib [Vollant]\r
+- Remove outdated assembler code contrib/masm686 and contrib/asm586\r
+- Remove old vc7 and vc8 from contrib/vstudio\r
+- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe]\r
+- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open()\r
+- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant]\r
+- Remove *64 functions from win32/zlib.def (they're not 64-bit yet)\r
+- Fix bug in void-returning vsprintf() case in gzwrite.c\r
+- Fix name change from inflate.h in contrib/inflate86/inffas86.c\r
+- Check if temporary file exists before removing in make_vms.com [Zinser]\r
+- Fix make install and uninstall for --static option\r
+- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta]\r
+- Update readme.txt in contrib/masmx64 and masmx86 to assemble\r
+\r
+Changes in 1.2.3.9 (21 Feb 2010)\r
+- Expunge gzio.c\r
+- Move as400 build information to old\r
+- Fix updates in contrib/minizip and contrib/vstudio\r
+- Add const to vsnprintf test in configure to avoid warnings [Weigelt]\r
+- Delete zconf.h (made by configure) [Weigelt]\r
+- Change zconf.in.h to zconf.h.in per convention [Weigelt]\r
+- Check for NULL buf in gzgets()\r
+- Return empty string for gzgets() with len == 1 (like fgets())\r
+- Fix description of gzgets() in zlib.h for end-of-file, NULL return\r
+- Update minizip to 1.1 [Vollant]\r
+- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c\r
+- Note in zlib.h that gzerror() should be used to distinguish from EOF\r
+- Remove use of snprintf() from gzlib.c\r
+- Fix bug in gzseek()\r
+- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant]\r
+- Fix zconf.h generation in CMakeLists.txt [Lowman]\r
+- Improve comments in zconf.h where modified by configure\r
+\r
+Changes in 1.2.3.8 (13 Feb 2010)\r
+- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer]\r
+- Use z_off64_t in gz_zero() and gz_skip() to match state->skip\r
+- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t)\r
+- Revert to Makefile.in from 1.2.3.6 (live with the clutter)\r
+- Fix missing error return in gzflush(), add zlib.h note\r
+- Add *64 functions to zlib.map [Levin]\r
+- Fix signed/unsigned comparison in gz_comp()\r
+- Use SFLAGS when testing shared linking in configure\r
+- Add --64 option to ./configure to use -m64 with gcc\r
+- Fix ./configure --help to correctly name options\r
+- Have make fail if a test fails [Levin]\r
+- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson]\r
+- Remove assembler object files from contrib\r
+\r
+Changes in 1.2.3.7 (24 Jan 2010)\r
+- Always gzopen() with O_LARGEFILE if available\r
+- Fix gzdirect() to work immediately after gzopen() or gzdopen()\r
+- Make gzdirect() more precise when the state changes while reading\r
+- Improve zlib.h documentation in many places\r
+- Catch memory allocation failure in gz_open()\r
+- Complete close operation if seek forward in gzclose_w() fails\r
+- Return Z_ERRNO from gzclose_r() if close() fails\r
+- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL\r
+- Return zero for gzwrite() errors to match zlib.h description\r
+- Return -1 on gzputs() error to match zlib.h description\r
+- Add zconf.in.h to allow recovery from configure modification [Weigelt]\r
+- Fix static library permissions in Makefile.in [Weigelt]\r
+- Avoid warnings in configure tests that hide functionality [Weigelt]\r
+- Add *BSD and DragonFly to Linux case in configure [gentoo 123571]\r
+- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212]\r
+- Avoid access of uninitialized data for first inflateReset2 call [Gomes]\r
+- Keep object files in subdirectories to reduce the clutter somewhat\r
+- Remove default Makefile and zlibdefs.h, add dummy Makefile\r
+- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_\r
+- Remove zlibdefs.h completely -- modify zconf.h instead\r
+\r
+Changes in 1.2.3.6 (17 Jan 2010)\r
+- Avoid void * arithmetic in gzread.c and gzwrite.c\r
+- Make compilers happier with const char * for gz_error message\r
+- Avoid unused parameter warning in inflate.c\r
+- Avoid signed-unsigned comparison warning in inflate.c\r
+- Indent #pragma's for traditional C\r
+- Fix usage of strwinerror() in glib.c, change to gz_strwinerror()\r
+- Correct email address in configure for system options\r
+- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser]\r
+- Update zlib.map [Brown]\r
+- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok]\r
+- Apply various fixes to CMakeLists.txt [Lowman]\r
+- Add checks on len in gzread() and gzwrite()\r
+- Add error message for no more room for gzungetc()\r
+- Remove zlib version check in gzwrite()\r
+- Defer compression of gzprintf() result until need to\r
+- Use snprintf() in gzdopen() if available\r
+- Remove USE_MMAP configuration determination (only used by minigzip)\r
+- Remove examples/pigz.c (available separately)\r
+- Update examples/gun.c to 1.6\r
+\r
+Changes in 1.2.3.5 (8 Jan 2010)\r
+- Add space after #if in zutil.h for some compilers\r
+- Fix relatively harmless bug in deflate_fast() [Exarevsky]\r
+- Fix same problem in deflate_slow()\r
+- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown]\r
+- Add deflate_rle() for faster Z_RLE strategy run-length encoding\r
+- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding\r
+- Change name of "write" variable in inffast.c to avoid library collisions\r
+- Fix premature EOF from gzread() in gzio.c [Brown]\r
+- Use zlib header window size if windowBits is 0 in inflateInit2()\r
+- Remove compressBound() call in deflate.c to avoid linking compress.o\r
+- Replace use of errno in gz* with functions, support WinCE [Alves]\r
+- Provide alternative to perror() in minigzip.c for WinCE [Alves]\r
+- Don't use _vsnprintf on later versions of MSVC [Lowman]\r
+- Add CMake build script and input file [Lowman]\r
+- Update contrib/minizip to 1.1 [Svensson, Vollant]\r
+- Moved nintendods directory from contrib to .\r
+- Replace gzio.c with a new set of routines with the same functionality\r
+- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above\r
+- Update contrib/minizip to 1.1b\r
+- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h\r
+\r
+Changes in 1.2.3.4 (21 Dec 2009)\r
+- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility\r
+- Update comments in configure and Makefile.in for default --shared\r
+- Fix test -z's in configure [Marquess]\r
+- Build examplesh and minigzipsh when not testing\r
+- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h\r
+- Import LDFLAGS from the environment in configure\r
+- Fix configure to populate SFLAGS with discovered CFLAGS options\r
+- Adapt make_vms.com to the new Makefile.in [Zinser]\r
+- Add zlib2ansi script for C++ compilation [Marquess]\r
+- Add _FILE_OFFSET_BITS=64 test to make test (when applicable)\r
+- Add AMD64 assembler code for longest match to contrib [Teterin]\r
+- Include options from $SFLAGS when doing $LDSHARED\r
+- Simplify 64-bit file support by introducing z_off64_t type\r
+- Make shared object files in objs directory to work around old Sun cc\r
+- Use only three-part version number for Darwin shared compiles\r
+- Add rc option to ar in Makefile.in for when ./configure not run\r
+- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4*\r
+- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile\r
+- Protect against _FILE_OFFSET_BITS being defined when compiling zlib\r
+- Rename Makefile.in targets allstatic to static and allshared to shared\r
+- Fix static and shared Makefile.in targets to be independent\r
+- Correct error return bug in gz_open() by setting state [Brown]\r
+- Put spaces before ;;'s in configure for better sh compatibility\r
+- Add pigz.c (parallel implementation of gzip) to examples/\r
+- Correct constant in crc32.c to UL [Leventhal]\r
+- Reject negative lengths in crc32_combine()\r
+- Add inflateReset2() function to work like inflateEnd()/inflateInit2()\r
+- Include sys/types.h for _LARGEFILE64_SOURCE [Brown]\r
+- Correct typo in doc/algorithm.txt [Janik]\r
+- Fix bug in adler32_combine() [Zhu]\r
+- Catch missing-end-of-block-code error in all inflates and in puff\r
+    Assures that random input to inflate eventually results in an error\r
+- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/\r
+- Update ENOUGH and its usage to reflect discovered bounds\r
+- Fix gzerror() error report on empty input file [Brown]\r
+- Add ush casts in trees.c to avoid pedantic runtime errors\r
+- Fix typo in zlib.h uncompress() description [Reiss]\r
+- Correct inflate() comments with regard to automatic header detection\r
+- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays)\r
+- Put new version of gzlog (2.0) in examples with interruption recovery\r
+- Add puff compile option to permit invalid distance-too-far streams\r
+- Add puff TEST command options, ability to read piped input\r
+- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but\r
+  _LARGEFILE64_SOURCE not defined\r
+- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart\r
+- Fix deflateSetDictionary() to use all 32K for output consistency\r
+- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h)\r
+- Clear bytes after deflate lookahead to avoid use of uninitialized data\r
+- Change a limit in inftrees.c to be more transparent to Coverity Prevent\r
+- Update win32/zlib.def with exported symbols from zlib.h\r
+- Correct spelling errors in zlib.h [Willem, Sobrado]\r
+- Allow Z_BLOCK for deflate() to force a new block\r
+- Allow negative bits in inflatePrime() to delete existing bit buffer\r
+- Add Z_TREES flush option to inflate() to return at end of trees\r
+- Add inflateMark() to return current state information for random access\r
+- Add Makefile for NintendoDS to contrib [Costa]\r
+- Add -w in configure compile tests to avoid spurious warnings [Beucler]\r
+- Fix typos in zlib.h comments for deflateSetDictionary()\r
+- Fix EOF detection in transparent gzread() [Maier]\r
+\r
+Changes in 1.2.3.3 (2 October 2006)\r
+- Make --shared the default for configure, add a --static option\r
+- Add compile option to permit invalid distance-too-far streams\r
+- Add inflateUndermine() function which is required to enable above\r
+- Remove use of "this" variable name for C++ compatibility [Marquess]\r
+- Add testing of shared library in make test, if shared library built\r
+- Use ftello() and fseeko() if available instead of ftell() and fseek()\r
+- Provide two versions of all functions that use the z_off_t type for\r
+  binary compatibility -- a normal version and a 64-bit offset version,\r
+  per the Large File Support Extension when _LARGEFILE64_SOURCE is\r
+  defined; use the 64-bit versions by default when _FILE_OFFSET_BITS\r
+  is defined to be 64\r
+- Add a --uname= option to configure to perhaps help with cross-compiling\r
+\r
+Changes in 1.2.3.2 (3 September 2006)\r
+- Turn off silly Borland warnings [Hay]\r
+- Use off64_t and define _LARGEFILE64_SOURCE when present\r
+- Fix missing dependency on inffixed.h in Makefile.in\r
+- Rig configure --shared to build both shared and static [Teredesai, Truta]\r
+- Remove zconf.in.h and instead create a new zlibdefs.h file\r
+- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant]\r
+- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt]\r
+\r
+Changes in 1.2.3.1 (16 August 2006)\r
+- Add watcom directory with OpenWatcom make files [Daniel]\r
+- Remove #undef of FAR in zconf.in.h for MVS [Fedtke]\r
+- Update make_vms.com [Zinser]\r
+- Use -fPIC for shared build in configure [Teredesai, Nicholson]\r
+- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen]\r
+- Use fdopen() (not _fdopen()) for Interix in zutil.h [B\8ack]\r
+- Add some FAQ entries about the contrib directory\r
+- Update the MVS question in the FAQ\r
+- Avoid extraneous reads after EOF in gzio.c [Brown]\r
+- Correct spelling of "successfully" in gzio.c [Randers-Pehrson]\r
+- Add comments to zlib.h about gzerror() usage [Brown]\r
+- Set extra flags in gzip header in gzopen() like deflate() does\r
+- Make configure options more compatible with double-dash conventions\r
+  [Weigelt]\r
+- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen]\r
+- Fix uninstall target in Makefile.in [Truta]\r
+- Add pkgconfig support [Weigelt]\r
+- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt]\r
+- Replace set_data_type() with a more accurate detect_data_type() in\r
+  trees.c, according to the txtvsbin.txt document [Truta]\r
+- Swap the order of #include <stdio.h> and #include "zlib.h" in\r
+  gzio.c, example.c and minigzip.c [Truta]\r
+- Shut up annoying VS2005 warnings about standard C deprecation [Rowe,\r
+  Truta] (where?)\r
+- Fix target "clean" from win32/Makefile.bor [Truta]\r
+- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe]\r
+- Update zlib www home address in win32/DLL_FAQ.txt [Truta]\r
+- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove]\r
+- Enable browse info in the "Debug" and "ASM Debug" configurations in\r
+  the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta]\r
+- Add pkgconfig support [Weigelt]\r
+- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h,\r
+  for use in win32/zlib1.rc [Polushin, Rowe, Truta]\r
+- Add a document that explains the new text detection scheme to\r
+  doc/txtvsbin.txt [Truta]\r
+- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta]\r
+- Move algorithm.txt into doc/ [Truta]\r
+- Synchronize FAQ with website\r
+- Fix compressBound(), was low for some pathological cases [Fearnley]\r
+- Take into account wrapper variations in deflateBound()\r
+- Set examples/zpipe.c input and output to binary mode for Windows\r
+- Update examples/zlib_how.html with new zpipe.c (also web site)\r
+- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems\r
+  that gcc became pickier in 4.0)\r
+- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain\r
+  un-versioned, the patch adds versioning only for symbols introduced in\r
+  zlib-1.2.0 or later.  It also declares as local those symbols which are\r
+  not designed to be exported." [Levin]\r
+- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure\r
+- Do not initialize global static by default in trees.c, add a response\r
+  NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess]\r
+- Don't use strerror() in gzio.c under WinCE [Yakimov]\r
+- Don't use errno.h in zutil.h under WinCE [Yakimov]\r
+- Move arguments for AR to its usage to allow replacing ar [Marot]\r
+- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson]\r
+- Improve inflateInit() and inflateInit2() documentation\r
+- Fix structure size comment in inflate.h\r
+- Change configure help option from --h* to --help [Santos]\r
+\r
+Changes in 1.2.3 (18 July 2005)\r
+- Apply security vulnerability fixes to contrib/infback9 as well\r
+- Clean up some text files (carriage returns, trailing space)\r
+- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant]\r
+\r
+Changes in 1.2.2.4 (11 July 2005)\r
+- Add inflatePrime() function for starting inflation at bit boundary\r
+- Avoid some Visual C warnings in deflate.c\r
+- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit\r
+  compile\r
+- Fix some spelling errors in comments [Betts]\r
+- Correct inflateInit2() error return documentation in zlib.h\r
+- Add zran.c example of compressed data random access to examples\r
+  directory, shows use of inflatePrime()\r
+- Fix cast for assignments to strm->state in inflate.c and infback.c\r
+- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer]\r
+- Move declarations of gf2 functions to right place in crc32.c [Oberhumer]\r
+- Add cast in trees.c t avoid a warning [Oberhumer]\r
+- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer]\r
+- Update make_vms.com [Zinser]\r
+- Initialize state->write in inflateReset() since copied in inflate_fast()\r
+- Be more strict on incomplete code sets in inflate_table() and increase\r
+  ENOUGH and MAXD -- this repairs a possible security vulnerability for\r
+  invalid inflate input.  Thanks to Tavis Ormandy and Markus Oberhumer for\r
+  discovering the vulnerability and providing test cases.\r
+- Add ia64 support to configure for HP-UX [Smith]\r
+- Add error return to gzread() for format or i/o error [Levin]\r
+- Use malloc.h for OS/2 [Necasek]\r
+\r
+Changes in 1.2.2.3 (27 May 2005)\r
+- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile\r
+- Typecast fread() return values in gzio.c [Vollant]\r
+- Remove trailing space in minigzip.c outmode (VC++ can't deal with it)\r
+- Fix crc check bug in gzread() after gzungetc() [Heiner]\r
+- Add the deflateTune() function to adjust internal compression parameters\r
+- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack)\r
+- Remove an incorrect assertion in examples/zpipe.c\r
+- Add C++ wrapper in infback9.h [Donais]\r
+- Fix bug in inflateCopy() when decoding fixed codes\r
+- Note in zlib.h how much deflateSetDictionary() actually uses\r
+- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used)\r
+- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer]\r
+- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer]\r
+- Add gzdirect() function to indicate transparent reads\r
+- Update contrib/minizip [Vollant]\r
+- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer]\r
+- Add casts in crc32.c to avoid warnings [Oberhumer]\r
+- Add contrib/masmx64 [Vollant]\r
+- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant]\r
+\r
+Changes in 1.2.2.2 (30 December 2004)\r
+- Replace structure assignments in deflate.c and inflate.c with zmemcpy to\r
+  avoid implicit memcpy calls (portability for no-library compilation)\r
+- Increase sprintf() buffer size in gzdopen() to allow for large numbers\r
+- Add INFLATE_STRICT to check distances against zlib header\r
+- Improve WinCE errno handling and comments [Chang]\r
+- Remove comment about no gzip header processing in FAQ\r
+- Add Z_FIXED strategy option to deflateInit2() to force fixed trees\r
+- Add updated make_vms.com [Coghlan], update README\r
+- Create a new "examples" directory, move gzappend.c there, add zpipe.c,\r
+  fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.\r
+- Add FAQ entry and comments in deflate.c on uninitialized memory access\r
+- Add Solaris 9 make options in configure [Gilbert]\r
+- Allow strerror() usage in gzio.c for STDC\r
+- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer]\r
+- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant]\r
+- Use z_off_t for adler32_combine() and crc32_combine() lengths\r
+- Make adler32() much faster for small len\r
+- Use OS_CODE in deflate() default gzip header\r
+\r
+Changes in 1.2.2.1 (31 October 2004)\r
+- Allow inflateSetDictionary() call for raw inflate\r
+- Fix inflate header crc check bug for file names and comments\r
+- Add deflateSetHeader() and gz_header structure for custom gzip headers\r
+- Add inflateGetheader() to retrieve gzip headers\r
+- Add crc32_combine() and adler32_combine() functions\r
+- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list\r
+- Use zstreamp consistently in zlib.h (inflate_back functions)\r
+- Remove GUNZIP condition from definition of inflate_mode in inflate.h\r
+  and in contrib/inflate86/inffast.S [Truta, Anderson]\r
+- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson]\r
+- Update projects/README.projects and projects/visualc6 [Truta]\r
+- Update win32/DLL_FAQ.txt [Truta]\r
+- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta]\r
+- Deprecate Z_ASCII; use Z_TEXT instead [Truta]\r
+- Use a new algorithm for setting strm->data_type in trees.c [Truta]\r
+- Do not define an exit() prototype in zutil.c unless DEBUG defined\r
+- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta]\r
+- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate()\r
+- Fix Darwin build version identification [Peterson]\r
+\r
+Changes in 1.2.2 (3 October 2004)\r
+- Update zlib.h comments on gzip in-memory processing\r
+- Set adler to 1 in inflateReset() to support Java test suite [Walles]\r
+- Add contrib/dotzlib [Ravn]\r
+- Update win32/DLL_FAQ.txt [Truta]\r
+- Update contrib/minizip [Vollant]\r
+- Move contrib/visual-basic.txt to old/ [Truta]\r
+- Fix assembler builds in projects/visualc6/ [Truta]\r
+\r
+Changes in 1.2.1.2 (9 September 2004)\r
+- Update INDEX file\r
+- Fix trees.c to update strm->data_type (no one ever noticed!)\r
+- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown]\r
+- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE)\r
+- Add limited multitasking protection to DYNAMIC_CRC_TABLE\r
+- Add NO_vsnprintf for VMS in zutil.h [Mozilla]\r
+- Don't declare strerror() under VMS [Mozilla]\r
+- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize\r
+- Update contrib/ada [Anisimkov]\r
+- Update contrib/minizip [Vollant]\r
+- Fix configure to not hardcode directories for Darwin [Peterson]\r
+- Fix gzio.c to not return error on empty files [Brown]\r
+- Fix indentation; update version in contrib/delphi/ZLib.pas and\r
+  contrib/pascal/zlibpas.pas [Truta]\r
+- Update mkasm.bat in contrib/masmx86 [Truta]\r
+- Update contrib/untgz [Truta]\r
+- Add projects/README.projects [Truta]\r
+- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta]\r
+- Update win32/DLL_FAQ.txt [Truta]\r
+- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta]\r
+- Remove an unnecessary assignment to curr in inftrees.c [Truta]\r
+- Add OS/2 to exe builds in configure [Poltorak]\r
+- Remove err dummy parameter in zlib.h [Kientzle]\r
+\r
+Changes in 1.2.1.1 (9 January 2004)\r
+- Update email address in README\r
+- Several FAQ updates\r
+- Fix a big fat bug in inftrees.c that prevented decoding valid\r
+  dynamic blocks with only literals and no distance codes --\r
+  Thanks to "Hot Emu" for the bug report and sample file\r
+- Add a note to puff.c on no distance codes case.\r
+\r
+Changes in 1.2.1 (17 November 2003)\r
+- Remove a tab in contrib/gzappend/gzappend.c\r
+- Update some interfaces in contrib for new zlib functions\r
+- Update zlib version number in some contrib entries\r
+- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta]\r
+- Support shared libraries on Hurd and KFreeBSD [Brown]\r
+- Fix error in NO_DIVIDE option of adler32.c\r
+\r
+Changes in 1.2.0.8 (4 November 2003)\r
+- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas\r
+- Add experimental NO_DIVIDE #define in adler32.c\r
+    - Possibly faster on some processors (let me know if it is)\r
+- Correct Z_BLOCK to not return on first inflate call if no wrap\r
+- Fix strm->data_type on inflate() return to correctly indicate EOB\r
+- Add deflatePrime() function for appending in the middle of a byte\r
+- Add contrib/gzappend for an example of appending to a stream\r
+- Update win32/DLL_FAQ.txt [Truta]\r
+- Delete Turbo C comment in README [Truta]\r
+- Improve some indentation in zconf.h [Truta]\r
+- Fix infinite loop on bad input in configure script [Church]\r
+- Fix gzeof() for concatenated gzip files [Johnson]\r
+- Add example to contrib/visual-basic.txt [Michael B.]\r
+- Add -p to mkdir's in Makefile.in [vda]\r
+- Fix configure to properly detect presence or lack of printf functions\r
+- Add AS400 support [Monnerat]\r
+- Add a little Cygwin support [Wilson]\r
+\r
+Changes in 1.2.0.7 (21 September 2003)\r
+- Correct some debug formats in contrib/infback9\r
+- Cast a type in a debug statement in trees.c\r
+- Change search and replace delimiter in configure from % to # [Beebe]\r
+- Update contrib/untgz to 0.2 with various fixes [Truta]\r
+- Add build support for Amiga [Nikl]\r
+- Remove some directories in old that have been updated to 1.2\r
+- Add dylib building for Mac OS X in configure and Makefile.in\r
+- Remove old distribution stuff from Makefile\r
+- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X\r
+- Update links in README\r
+\r
+Changes in 1.2.0.6 (13 September 2003)\r
+- Minor FAQ updates\r
+- Update contrib/minizip to 1.00 [Vollant]\r
+- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta]\r
+- Update POSTINC comment for 68060 [Nikl]\r
+- Add contrib/infback9 with deflate64 decoding (unsupported)\r
+- For MVS define NO_vsnprintf and undefine FAR [van Burik]\r
+- Add pragma for fdopen on MVS [van Burik]\r
+\r
+Changes in 1.2.0.5 (8 September 2003)\r
+- Add OF to inflateBackEnd() declaration in zlib.h\r
+- Remember start when using gzdopen in the middle of a file\r
+- Use internal off_t counters in gz* functions to properly handle seeks\r
+- Perform more rigorous check for distance-too-far in inffast.c\r
+- Add Z_BLOCK flush option to return from inflate at block boundary\r
+- Set strm->data_type on return from inflate\r
+    - Indicate bits unused, if at block boundary, and if in last block\r
+- Replace size_t with ptrdiff_t in crc32.c, and check for correct size\r
+- Add condition so old NO_DEFLATE define still works for compatibility\r
+- FAQ update regarding the Windows DLL [Truta]\r
+- INDEX update: add qnx entry, remove aix entry [Truta]\r
+- Install zlib.3 into mandir [Wilson]\r
+- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta]\r
+- Adapt the zlib interface to the new DLL convention guidelines [Truta]\r
+- Introduce ZLIB_WINAPI macro to allow the export of functions using\r
+  the WINAPI calling convention, for Visual Basic [Vollant, Truta]\r
+- Update msdos and win32 scripts and makefiles [Truta]\r
+- Export symbols by name, not by ordinal, in win32/zlib.def [Truta]\r
+- Add contrib/ada [Anisimkov]\r
+- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta]\r
+- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant]\r
+- Add contrib/masm686 [Truta]\r
+- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm\r
+  [Truta, Vollant]\r
+- Update contrib/delphi; rename to contrib/pascal; add example [Truta]\r
+- Remove contrib/delphi2; add a new contrib/delphi [Truta]\r
+- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream,\r
+  and fix some method prototypes [Truta]\r
+- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip\r
+  [Truta]\r
+- Avoid the use of backslash (\) in contrib/minizip [Vollant]\r
+- Fix file time handling in contrib/untgz; update makefiles [Truta]\r
+- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines\r
+  [Vollant]\r
+- Remove contrib/vstudio/vc15_16 [Vollant]\r
+- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta]\r
+- Update README.contrib [Truta]\r
+- Invert the assignment order of match_head and s->prev[...] in\r
+  INSERT_STRING [Truta]\r
+- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings\r
+  [Truta]\r
+- Compare function pointers with 0, not with NULL or Z_NULL [Truta]\r
+- Fix prototype of syncsearch in inflate.c [Truta]\r
+- Introduce ASMINF macro to be enabled when using an ASM implementation\r
+  of inflate_fast [Truta]\r
+- Change NO_DEFLATE to NO_GZCOMPRESS [Truta]\r
+- Modify test_gzio in example.c to take a single file name as a\r
+  parameter [Truta]\r
+- Exit the example.c program if gzopen fails [Truta]\r
+- Add type casts around strlen in example.c [Truta]\r
+- Remove casting to sizeof in minigzip.c; give a proper type\r
+  to the variable compared with SUFFIX_LEN [Truta]\r
+- Update definitions of STDC and STDC99 in zconf.h [Truta]\r
+- Synchronize zconf.h with the new Windows DLL interface [Truta]\r
+- Use SYS16BIT instead of __32BIT__ to distinguish between\r
+  16- and 32-bit platforms [Truta]\r
+- Use far memory allocators in small 16-bit memory models for\r
+  Turbo C [Truta]\r
+- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in\r
+  zlibCompileFlags [Truta]\r
+- Cygwin has vsnprintf [Wilson]\r
+- In Windows16, OS_CODE is 0, as in MSDOS [Truta]\r
+- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson]\r
+\r
+Changes in 1.2.0.4 (10 August 2003)\r
+- Minor FAQ updates\r
+- Be more strict when checking inflateInit2's windowBits parameter\r
+- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well\r
+- Add gzip wrapper option to deflateInit2 using windowBits\r
+- Add updated QNX rule in configure and qnx directory [Bonnefoy]\r
+- Make inflate distance-too-far checks more rigorous\r
+- Clean up FAR usage in inflate\r
+- Add casting to sizeof() in gzio.c and minigzip.c\r
+\r
+Changes in 1.2.0.3 (19 July 2003)\r
+- Fix silly error in gzungetc() implementation [Vollant]\r
+- Update contrib/minizip and contrib/vstudio [Vollant]\r
+- Fix printf format in example.c\r
+- Correct cdecl support in zconf.in.h [Anisimkov]\r
+- Minor FAQ updates\r
+\r
+Changes in 1.2.0.2 (13 July 2003)\r
+- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons\r
+- Attempt to avoid warnings in crc32.c for pointer-int conversion\r
+- Add AIX to configure, remove aix directory [Bakker]\r
+- Add some casts to minigzip.c\r
+- Improve checking after insecure sprintf() or vsprintf() calls\r
+- Remove #elif's from crc32.c\r
+- Change leave label to inf_leave in inflate.c and infback.c to avoid\r
+  library conflicts\r
+- Remove inflate gzip decoding by default--only enable gzip decoding by\r
+  special request for stricter backward compatibility\r
+- Add zlibCompileFlags() function to return compilation information\r
+- More typecasting in deflate.c to avoid warnings\r
+- Remove leading underscore from _Capital #defines [Truta]\r
+- Fix configure to link shared library when testing\r
+- Add some Windows CE target adjustments [Mai]\r
+- Remove #define ZLIB_DLL in zconf.h [Vollant]\r
+- Add zlib.3 [Rodgers]\r
+- Update RFC URL in deflate.c and algorithm.txt [Mai]\r
+- Add zlib_dll_FAQ.txt to contrib [Truta]\r
+- Add UL to some constants [Truta]\r
+- Update minizip and vstudio [Vollant]\r
+- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h\r
+- Expand use of NO_DUMMY_DECL to avoid all dummy structures\r
+- Added iostream3 to contrib [Schwardt]\r
+- Replace rewind() with fseek() for WinCE [Truta]\r
+- Improve setting of zlib format compression level flags\r
+    - Report 0 for huffman and rle strategies and for level == 0 or 1\r
+    - Report 2 only for level == 6\r
+- Only deal with 64K limit when necessary at compile time [Truta]\r
+- Allow TOO_FAR check to be turned off at compile time [Truta]\r
+- Add gzclearerr() function [Souza]\r
+- Add gzungetc() function\r
+\r
+Changes in 1.2.0.1 (17 March 2003)\r
+- Add Z_RLE strategy for run-length encoding [Truta]\r
+    - When Z_RLE requested, restrict matches to distance one\r
+    - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE\r
+- Correct FASTEST compilation to allow level == 0\r
+- Clean up what gets compiled for FASTEST\r
+- Incorporate changes to zconf.in.h [Vollant]\r
+    - Refine detection of Turbo C need for dummy returns\r
+    - Refine ZLIB_DLL compilation\r
+    - Include additional header file on VMS for off_t typedef\r
+- Try to use _vsnprintf where it supplants vsprintf [Vollant]\r
+- Add some casts in inffast.c\r
+- Enchance comments in zlib.h on what happens if gzprintf() tries to\r
+  write more than 4095 bytes before compression\r
+- Remove unused state from inflateBackEnd()\r
+- Remove exit(0) from minigzip.c, example.c\r
+- Get rid of all those darn tabs\r
+- Add "check" target to Makefile.in that does the same thing as "test"\r
+- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in\r
+- Update contrib/inflate86 [Anderson]\r
+- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant]\r
+- Add msdos and win32 directories with makefiles [Truta]\r
+- More additions and improvements to the FAQ\r
+\r
+Changes in 1.2.0 (9 March 2003)\r
+- New and improved inflate code\r
+    - About 20% faster\r
+    - Does not allocate 32K window unless and until needed\r
+    - Automatically detects and decompresses gzip streams\r
+    - Raw inflate no longer needs an extra dummy byte at end\r
+    - Added inflateBack functions using a callback interface--even faster\r
+      than inflate, useful for file utilities (gzip, zip)\r
+    - Added inflateCopy() function to record state for random access on\r
+      externally generated deflate streams (e.g. in gzip files)\r
+    - More readable code (I hope)\r
+- New and improved crc32()\r
+    - About 50% faster, thanks to suggestions from Rodney Brown\r
+- Add deflateBound() and compressBound() functions\r
+- Fix memory leak in deflateInit2()\r
+- Permit setting dictionary for raw deflate (for parallel deflate)\r
+- Fix const declaration for gzwrite()\r
+- Check for some malloc() failures in gzio.c\r
+- Fix bug in gzopen() on single-byte file 0x1f\r
+- Fix bug in gzread() on concatenated file with 0x1f at end of buffer\r
+  and next buffer doesn't start with 0x8b\r
+- Fix uncompress() to return Z_DATA_ERROR on truncated input\r
+- Free memory at end of example.c\r
+- Remove MAX #define in trees.c (conflicted with some libraries)\r
+- Fix static const's in deflate.c, gzio.c, and zutil.[ch]\r
+- Declare malloc() and free() in gzio.c if STDC not defined\r
+- Use malloc() instead of calloc() in zutil.c if int big enough\r
+- Define STDC for AIX\r
+- Add aix/ with approach for compiling shared library on AIX\r
+- Add HP-UX support for shared libraries in configure\r
+- Add OpenUNIX support for shared libraries in configure\r
+- Use $cc instead of gcc to build shared library\r
+- Make prefix directory if needed when installing\r
+- Correct Macintosh avoidance of typedef Byte in zconf.h\r
+- Correct Turbo C memory allocation when under Linux\r
+- Use libz.a instead of -lz in Makefile (assure use of compiled library)\r
+- Update configure to check for snprintf or vsnprintf functions and their\r
+  return value, warn during make if using an insecure function\r
+- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that\r
+  is lost when library is used--resolution is to build new zconf.h\r
+- Documentation improvements (in zlib.h):\r
+    - Document raw deflate and inflate\r
+    - Update RFCs URL\r
+    - Point out that zlib and gzip formats are different\r
+    - Note that Z_BUF_ERROR is not fatal\r
+    - Document string limit for gzprintf() and possible buffer overflow\r
+    - Note requirement on avail_out when flushing\r
+    - Note permitted values of flush parameter of inflate()\r
+- Add some FAQs (and even answers) to the FAQ\r
+- Add contrib/inflate86/ for x86 faster inflate\r
+- Add contrib/blast/ for PKWare Data Compression Library decompression\r
+- Add contrib/puff/ simple inflate for deflate format description\r
+\r
+Changes in 1.1.4 (11 March 2002)\r
+- ZFREE was repeated on same allocation on some error conditions.\r
+  This creates a security problem described in\r
+  http://www.zlib.org/advisory-2002-03-11.txt\r
+- Returned incorrect error (Z_MEM_ERROR) on some invalid data\r
+- Avoid accesses before window for invalid distances with inflate window\r
+  less than 32K.\r
+- force windowBits > 8 to avoid a bug in the encoder for a window size\r
+  of 256 bytes. (A complete fix will be available in 1.1.5).\r
+\r
+Changes in 1.1.3 (9 July 1998)\r
+- fix "an inflate input buffer bug that shows up on rare but persistent\r
+  occasions" (Mark)\r
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)\r
+- fix gzseek(..., SEEK_SET) in write mode\r
+- fix crc check after a gzeek (Frank Faubert)\r
+- fix miniunzip when the last entry in a zip file is itself a zip file\r
+  (J Lillge)\r
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)\r
+  See http://www.muppetlabs.com/~breadbox/software/assembly.html\r
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)\r
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)\r
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)\r
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)\r
+- added a FAQ file\r
+\r
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)\r
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)\r
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)\r
+- avoid some warnings with Borland C (Tom Tanner)\r
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)\r
+- emulate utime() for WIN32 in contrib/untgz  (Gilles Vollant)\r
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)\r
+- use libdir and includedir in Makefile.in (Tim Mooney)\r
+- support shared libraries on OSF1 V4 (Tim Mooney)\r
+- remove so_locations in "make clean"  (Tim Mooney)\r
+- fix maketree.c compilation error (Glenn, Mark)\r
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)\r
+- new Makefile.riscos (Rich Walker)\r
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)\r
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)\r
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)\r
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)\r
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)\r
+- fix parameter check in deflateCopy (Gunther Nikl)\r
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)\r
+- Many portability patches by Christian Spieler:\r
+  . zutil.c, zutil.h: added "const" for zmem*\r
+  . Make_vms.com: fixed some typos\r
+  . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists\r
+  . msdos/Makefile.msc: remove "default rtl link library" info from obj files\r
+  . msdos/Makefile.*: use model-dependent name for the built zlib library\r
+  . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:\r
+     new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)\r
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)\r
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)\r
+- fix test for errno.h in configure (Tim Newsham)\r
+\r
+Changes in 1.1.2 (19 March 98)\r
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)\r
+  See http://www.winimage.com/zLibDll/unzip.html\r
+- preinitialize the inflate tables for fixed codes, to make the code\r
+  completely thread safe (Mark)\r
+- some simplifications and slight speed-up to the inflate code (Mark)\r
+- fix gzeof on non-compressed files (Allan Schrum)\r
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)\r
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)\r
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)\r
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)\r
+- do not wrap extern "C" around system includes (Tom Lane)\r
+- mention zlib binding for TCL in README (Andreas Kupries)\r
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)\r
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)\r
+- allow "configure --prefix $HOME" (Tim Mooney)\r
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)\r
+- move Makefile.sas to amiga/Makefile.sas\r
+\r
+Changes in 1.1.1 (27 Feb 98)\r
+- fix macros _tr_tally_* in deflate.h for debug mode  (Glenn Randers-Pehrson)\r
+- remove block truncation heuristic which had very marginal effect for zlib\r
+  (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the\r
+  compression ratio on some files. This also allows inlining _tr_tally for\r
+  matches in deflate_slow.\r
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)\r
+\r
+Changes in 1.1.0 (24 Feb 98)\r
+- do not return STREAM_END prematurely in inflate (John Bowler)\r
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)\r
+- compile with -DFASTEST to get compression code optimized for speed only\r
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)\r
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain\r
+  on Sun but significant on HP)\r
+\r
+- add a pointer to experimental unzip library in README (Gilles Vollant)\r
+- initialize variable gcc in configure (Chris Herborth)\r
+\r
+Changes in 1.0.9 (17 Feb 1998)\r
+- added gzputs and gzgets functions\r
+- do not clear eof flag in gzseek (Mark Diekhans)\r
+- fix gzseek for files in transparent mode (Mark Diekhans)\r
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)\r
+- replace EXPORT with ZEXPORT to avoid conflict with other programs\r
+- added compress2 in zconf.h, zlib.def, zlib.dnt\r
+- new asm code from Gilles Vollant in contrib/asm386\r
+- simplify the inflate code (Mark):\r
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()\r
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack\r
+ . ZALLOC the value area for huft_build() instead of using stack\r
+ . Simplify Z_FINISH check in inflate()\r
+\r
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8\r
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)\r
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with\r
+  the declaration of FAR (Gilles VOllant)\r
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)\r
+- read_buf buf parameter of type Bytef* instead of charf*\r
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)\r
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)\r
+- fix check for presence of directories in "make install" (Ian Willis)\r
+\r
+Changes in 1.0.8 (27 Jan 1998)\r
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)\r
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)\r
+- added compress2() to allow setting the compression level\r
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)\r
+- use constant arrays for the static trees in trees.c instead of computing\r
+  them at run time (thanks to Ken Raeburn for this suggestion). To create\r
+  trees.h, compile with GEN_TREES_H and run "make test".\r
+- check return code of example in "make test" and display result\r
+- pass minigzip command line options to file_compress\r
+- simplifying code of inflateSync to avoid gcc 2.8 bug\r
+\r
+- support CC="gcc -Wall" in configure -s (QingLong)\r
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)\r
+- fix test for shared library support to avoid compiler warnings\r
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)\r
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)\r
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))\r
+- add checks for gzputc and gzputc in example.c\r
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)\r
+- use const for the CRC table (Ken Raeburn)\r
+- fixed "make uninstall" for shared libraries\r
+- use Tracev instead of Trace in infblock.c\r
+- in example.c use correct compressed length for test_sync\r
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)\r
+\r
+Changes in 1.0.7 (20 Jan 1998)\r
+- fix gzseek which was broken in write mode\r
+- return error for gzseek to negative absolute position\r
+- fix configure for Linux (Chun-Chung Chen)\r
+- increase stack space for MSC (Tim Wegner)\r
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)\r
+- define EXPORTVA for gzprintf (Gilles Vollant)\r
+- added man page zlib.3 (Rick Rodgers)\r
+- for contrib/untgz, fix makedir() and improve Makefile\r
+\r
+- check gzseek in write mode in example.c\r
+- allocate extra buffer for seeks only if gzseek is actually called\r
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)\r
+- add inflateSyncPoint in zconf.h\r
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def\r
+\r
+Changes in 1.0.6 (19 Jan 1998)\r
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and\r
+  gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)\r
+- Fix a deflate bug occurring only with compression level 0 (thanks to\r
+  Andy Buckler for finding this one).\r
+- In minigzip, pass transparently also the first byte for .Z files.\r
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()\r
+- check Z_FINISH in inflate (thanks to Marc Schluper)\r
+- Implement deflateCopy (thanks to Adam Costello)\r
+- make static libraries by default in configure, add --shared option.\r
+- move MSDOS or Windows specific files to directory msdos\r
+- suppress the notion of partial flush to simplify the interface\r
+  (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)\r
+- suppress history buffer provided by application to simplify the interface\r
+  (this feature was not implemented anyway in 1.0.4)\r
+- next_in and avail_in must be initialized before calling inflateInit or\r
+  inflateInit2\r
+- add EXPORT in all exported functions (for Windows DLL)\r
+- added Makefile.nt (thanks to Stephen Williams)\r
+- added the unsupported "contrib" directory:\r
+   contrib/asm386/ by Gilles Vollant <info@winimage.com>\r
+        386 asm code replacing longest_match().\r
+   contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>\r
+        A C++ I/O streams interface to the zlib gz* functions\r
+   contrib/iostream2/  by Tyge Løvset <Tyge.Lovset@cmr.no>\r
+        Another C++ I/O streams interface\r
+   contrib/untgz/  by "Pedro A. Aranda Guti\irrez" <paag@tid.es>\r
+        A very simple tar.gz file extractor using zlib\r
+   contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>\r
+        How to use compress(), uncompress() and the gz* functions from VB.\r
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression\r
+  level) in minigzip (thanks to Tom Lane)\r
+\r
+- use const for rommable constants in deflate\r
+- added test for gzseek and gztell in example.c\r
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)\r
+- add undocumented function zError to convert error code to string\r
+  (for Tim Smithers)\r
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.\r
+- Use default memcpy for Symantec MSDOS compiler.\r
+- Add EXPORT keyword for check_func (needed for Windows DLL)\r
+- add current directory to LD_LIBRARY_PATH for "make test"\r
+- create also a link for libz.so.1\r
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)\r
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)\r
+- added -soname for Linux in configure (Chun-Chung Chen,\r
+- assign numbers to the exported functions in zlib.def (for Windows DLL)\r
+- add advice in zlib.h for best usage of deflateSetDictionary\r
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)\r
+- allow compilation with ANSI keywords only enabled for TurboC in large model\r
+- avoid "versionString"[0] (Borland bug)\r
+- add NEED_DUMMY_RETURN for Borland\r
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).\r
+- allow compilation with CC\r
+- defined STDC for OS/2 (David Charlap)\r
+- limit external names to 8 chars for MVS (Thomas Lund)\r
+- in minigzip.c, use static buffers only for 16-bit systems\r
+- fix suffix check for "minigzip -d foo.gz"\r
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)\r
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)\r
+- added makelcc.bat for lcc-win32 (Tom St Denis)\r
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)\r
+- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.\r
+- check for unistd.h in configure (for off_t)\r
+- remove useless check parameter in inflate_blocks_free\r
+- avoid useless assignment of s->check to itself in inflate_blocks_new\r
+- do not flush twice in gzclose (thanks to Ken Raeburn)\r
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h\r
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h\r
+- work around buggy fclose on pipes for HP/UX\r
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)\r
+- fix configure if CC is already equal to gcc\r
+\r
+Changes in 1.0.5 (3 Jan 98)\r
+- Fix inflate to terminate gracefully when fed corrupted or invalid data\r
+- Use const for rommable constants in inflate\r
+- Eliminate memory leaks on error conditions in inflate\r
+- Removed some vestigial code in inflate\r
+- Update web address in README\r
+\r
+Changes in 1.0.4 (24 Jul 96)\r
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF\r
+  bit, so the decompressor could decompress all the correct data but went\r
+  on to attempt decompressing extra garbage data. This affected minigzip too.\r
+- zlibVersion and gzerror return const char* (needed for DLL)\r
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)\r
+- use z_error only for DEBUG (avoid problem with DLLs)\r
+\r
+Changes in 1.0.3 (2 Jul 96)\r
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS\r
+  small and medium models; this makes the library incompatible with previous\r
+  versions for these models. (No effect in large model or on other systems.)\r
+- return OK instead of BUF_ERROR if previous deflate call returned with\r
+  avail_out as zero but there is nothing to do\r
+- added memcmp for non STDC compilers\r
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)\r
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)\r
+- better check for 16-bit mode MSC (avoids problem with Symantec)\r
+\r
+Changes in 1.0.2 (23 May 96)\r
+- added Windows DLL support\r
+- added a function zlibVersion (for the DLL support)\r
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)\r
+- Bytef is define's instead of typedef'd only for Borland C\r
+- avoid reading uninitialized memory in example.c\r
+- mention in README that the zlib format is now RFC1950\r
+- updated Makefile.dj2\r
+- added algorithm.doc\r
+\r
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]\r
+- fix array overlay in deflate.c which sometimes caused bad compressed data\r
+- fix inflate bug with empty stored block\r
+- fix MSDOS medium model which was broken in 0.99\r
+- fix deflateParams() which could generated bad compressed data.\r
+- Bytef is define'd instead of typedef'ed (work around Borland bug)\r
+- added an INDEX file\r
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),\r
+  Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)\r
+- speed up adler32 for modern machines without auto-increment\r
+- added -ansi for IRIX in configure\r
+- static_init_done in trees.c is an int\r
+- define unlink as delete for VMS\r
+- fix configure for QNX\r
+- add configure branch for SCO and HPUX\r
+- avoid many warnings (unused variables, dead assignments, etc...)\r
+- no fdopen for BeOS\r
+- fix the Watcom fix for 32 bit mode (define FAR as empty)\r
+- removed redefinition of Byte for MKWERKS\r
+- work around an MWKERKS bug (incorrect merge of all .h files)\r
+\r
+Changes in 0.99 (27 Jan 96)\r
+- allow preset dictionary shared between compressor and decompressor\r
+- allow compression level 0 (no compression)\r
+- add deflateParams in zlib.h: allow dynamic change of compression level\r
+  and compression strategy.\r
+- test large buffers and deflateParams in example.c\r
+- add optional "configure" to build zlib as a shared library\r
+- suppress Makefile.qnx, use configure instead\r
+- fixed deflate for 64-bit systems (detected on Cray)\r
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)\r
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)\r
+- always return Z_BUF_ERROR when deflate() has nothing to do\r
+- deflateInit and inflateInit are now macros to allow version checking\r
+- prefix all global functions and types with z_ with -DZ_PREFIX\r
+- make falloc completely reentrant (inftrees.c)\r
+- fixed very unlikely race condition in ct_static_init\r
+- free in reverse order of allocation to help memory manager\r
+- use zlib-1.0/* instead of zlib/* inside the tar.gz\r
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith\r
+  -Wconversion -Wstrict-prototypes -Wmissing-prototypes"\r
+- allow gzread on concatenated .gz files\r
+- deflateEnd now returns Z_DATA_ERROR if it was premature\r
+- deflate is finally (?) fully deterministic (no matches beyond end of input)\r
+- Document Z_SYNC_FLUSH\r
+- add uninstall in Makefile\r
+- Check for __cpluplus in zlib.h\r
+- Better test in ct_align for partial flush\r
+- avoid harmless warnings for Borland C++\r
+- initialize hash_head in deflate.c\r
+- avoid warning on fdopen (gzio.c) for HP cc -Aa\r
+- include stdlib.h for STDC compilers\r
+- include errno.h for Cray\r
+- ignore error if ranlib doesn't exist\r
+- call ranlib twice for NeXTSTEP\r
+- use exec_prefix instead of prefix for libz.a\r
+- renamed ct_* as _tr_* to avoid conflict with applications\r
+- clear z->msg in inflateInit2 before any error return\r
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c\r
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)\r
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)\r
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)\r
+- in fcalloc, normalize pointer if size > 65520 bytes\r
+- don't use special fcalloc for 32 bit Borland C++\r
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...\r
+- use Z_BINARY instead of BINARY\r
+- document that gzclose after gzdopen will close the file\r
+- allow "a" as mode in gzopen.\r
+- fix error checking in gzread\r
+- allow skipping .gz extra-field on pipes\r
+- added reference to Perl interface in README\r
+- put the crc table in FAR data (I dislike more and more the medium model :)\r
+- added get_crc_table\r
+- added a dimension to all arrays (Borland C can't count).\r
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast\r
+- guard against multiple inclusion of *.h (for precompiled header on Mac)\r
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.\r
+- don't use unsized arrays to avoid silly warnings by Visual C++:\r
+     warning C4746: 'inflate_mask' : unsized array treated as  '__far'\r
+     (what's wrong with far data in far model?).\r
+- define enum out of inflate_blocks_state to allow compilation with C++\r
+\r
+Changes in 0.95 (16 Aug 95)\r
+- fix MSDOS small and medium model (now easier to adapt to any compiler)\r
+- inlined send_bits\r
+- fix the final (:-) bug for deflate with flush (output was correct but\r
+  not completely flushed in rare occasions).\r
+- default window size is same for compression and decompression\r
+  (it's now sufficient to set MAX_WBITS in zconf.h).\r
+- voidp -> voidpf and voidnp -> voidp (for consistency with other\r
+  typedefs and because voidnp was not near in large model).\r
+\r
+Changes in 0.94 (13 Aug 95)\r
+- support MSDOS medium model\r
+- fix deflate with flush (could sometimes generate bad output)\r
+- fix deflateReset (zlib header was incorrectly suppressed)\r
+- added support for VMS\r
+- allow a compression level in gzopen()\r
+- gzflush now calls fflush\r
+- For deflate with flush, flush even if no more input is provided.\r
+- rename libgz.a as libz.a\r
+- avoid complex expression in infcodes.c triggering Turbo C bug\r
+- work around a problem with gcc on Alpha (in INSERT_STRING)\r
+- don't use inline functions (problem with some gcc versions)\r
+- allow renaming of Byte, uInt, etc... with #define.\r
+- avoid warning about (unused) pointer before start of array in deflate.c\r
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c\r
+- avoid reserved word 'new' in trees.c\r
+\r
+Changes in 0.93 (25 June 95)\r
+- temporarily disable inline functions\r
+- make deflate deterministic\r
+- give enough lookahead for PARTIAL_FLUSH\r
+- Set binary mode for stdin/stdout in minigzip.c for OS/2\r
+- don't even use signed char in inflate (not portable enough)\r
+- fix inflate memory leak for segmented architectures\r
+\r
+Changes in 0.92 (3 May 95)\r
+- don't assume that char is signed (problem on SGI)\r
+- Clear bit buffer when starting a stored block\r
+- no memcpy on Pyramid\r
+- suppressed inftest.c\r
+- optimized fill_window, put longest_match inline for gcc\r
+- optimized inflate on stored blocks.\r
+- untabify all sources to simplify patches\r
+\r
+Changes in 0.91 (2 May 95)\r
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h\r
+- Document the memory requirements in zconf.h\r
+- added "make install"\r
+- fix sync search logic in inflateSync\r
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short\r
+- after inflateSync, don't scare people with just "lo world"\r
+- added support for DJGPP\r
+\r
+Changes in 0.9 (1 May 95)\r
+- don't assume that zalloc clears the allocated memory (the TurboC bug\r
+  was Mark's bug after all :)\r
+- let again gzread copy uncompressed data unchanged (was working in 0.71)\r
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented\r
+- added a test of inflateSync in example.c\r
+- moved MAX_WBITS to zconf.h because users might want to change that.\r
+- document explicitly that zalloc(64K) on MSDOS must return a normalized\r
+  pointer (zero offset)\r
+- added Makefiles for Microsoft C, Turbo C, Borland C++\r
+- faster crc32()\r
+\r
+Changes in 0.8 (29 April 95)\r
+- added fast inflate (inffast.c)\r
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this\r
+  is incompatible with previous versions of zlib which returned Z_OK.\r
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)\r
+  (actually that was not a compiler bug, see 0.81 above)\r
+- gzread no longer reads one extra byte in certain cases\r
+- In gzio destroy(), don't reference a freed structure\r
+- avoid many warnings for MSDOS\r
+- avoid the ERROR symbol which is used by MS Windows\r
+\r
+Changes in 0.71 (14 April 95)\r
+- Fixed more MSDOS compilation problems :( There is still a bug with\r
+  TurboC large model.\r
+\r
+Changes in 0.7 (14 April 95)\r
+- Added full inflate support.\r
+- Simplified the crc32() interface. The pre- and post-conditioning\r
+  (one's complement) is now done inside crc32(). WARNING: this is\r
+  incompatible with previous versions; see zlib.h for the new usage.\r
+\r
+Changes in 0.61 (12 April 95)\r
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.\r
+\r
+Changes in 0.6 (11 April 95)\r
+- added minigzip.c\r
+- added gzdopen to reopen a file descriptor as gzFile\r
+- added transparent reading of non-gziped files in gzread.\r
+- fixed bug in gzread (don't read crc as data)\r
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).\r
+- don't allocate big arrays in the stack (for MSDOS)\r
+- fix some MSDOS compilation problems\r
+\r
+Changes in 0.5:\r
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but\r
+  not yet Z_FULL_FLUSH.\r
+- support decompression but only in a single step (forced Z_FINISH)\r
+- added opaque object for zalloc and zfree.\r
+- added deflateReset and inflateReset\r
+- added a variable zlib_version for consistency checking.\r
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.\r
+  Added Z_FILTERED and Z_HUFFMAN_ONLY constants.\r
+\r
+Changes in 0.4:\r
+- avoid "zip" everywhere, use zlib instead of ziplib.\r
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush\r
+  if compression method == 8.\r
+- added adler32 and crc32\r
+- renamed deflateOptions as deflateInit2, call one or the other but not both\r
+- added the method parameter for deflateInit2.\r
+- added inflateInit2\r
+- simplied considerably deflateInit and inflateInit by not supporting\r
+  user-provided history buffer. This is supported only in deflateInit2\r
+  and inflateInit2.\r
+\r
+Changes in 0.3:\r
+- prefix all macro names with Z_\r
+- use Z_FINISH instead of deflateEnd to finish compression.\r
+- added Z_HUFFMAN_ONLY\r
+- added gzerror()\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/FAQ b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/FAQ
new file mode 100644 (file)
index 0000000..32f9e95
--- /dev/null
@@ -0,0 +1,368 @@
+\r
+                Frequently Asked Questions about zlib\r
+\r
+\r
+If your question is not there, please check the zlib home page\r
+http://zlib.net/ which may have more recent information.\r
+The lastest zlib FAQ is at http://zlib.net/zlib_faq.html\r
+\r
+\r
+ 1. Is zlib Y2K-compliant?\r
+\r
+    Yes. zlib doesn't handle dates.\r
+\r
+ 2. Where can I get a Windows DLL version?\r
+\r
+    The zlib sources can be compiled without change to produce a DLL.  See the\r
+    file win32/DLL_FAQ.txt in the zlib distribution.  Pointers to the\r
+    precompiled DLL are found in the zlib web site at http://zlib.net/ .\r
+\r
+ 3. Where can I get a Visual Basic interface to zlib?\r
+\r
+    See\r
+        * http://marknelson.us/1997/01/01/zlib-engine/\r
+        * win32/DLL_FAQ.txt in the zlib distribution\r
+\r
+ 4. compress() returns Z_BUF_ERROR.\r
+\r
+    Make sure that before the call of compress(), the length of the compressed\r
+    buffer is equal to the available size of the compressed buffer and not\r
+    zero.  For Visual Basic, check that this parameter is passed by reference\r
+    ("as any"), not by value ("as long").\r
+\r
+ 5. deflate() or inflate() returns Z_BUF_ERROR.\r
+\r
+    Before making the call, make sure that avail_in and avail_out are not zero.\r
+    When setting the parameter flush equal to Z_FINISH, also make sure that\r
+    avail_out is big enough to allow processing all pending input.  Note that a\r
+    Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be\r
+    made with more input or output space.  A Z_BUF_ERROR may in fact be\r
+    unavoidable depending on how the functions are used, since it is not\r
+    possible to tell whether or not there is more output pending when\r
+    strm.avail_out returns with zero.  See http://zlib.net/zlib_how.html for a\r
+    heavily annotated example.\r
+\r
+ 6. Where's the zlib documentation (man pages, etc.)?\r
+\r
+    It's in zlib.h .  Examples of zlib usage are in the files test/example.c\r
+    and test/minigzip.c, with more in examples/ .\r
+\r
+ 7. Why don't you use GNU autoconf or libtool or ...?\r
+\r
+    Because we would like to keep zlib as a very small and simple package.\r
+    zlib is rather portable and doesn't need much configuration.\r
+\r
+ 8. I found a bug in zlib.\r
+\r
+    Most of the time, such problems are due to an incorrect usage of zlib.\r
+    Please try to reproduce the problem with a small program and send the\r
+    corresponding source to us at zlib@gzip.org .  Do not send multi-megabyte\r
+    data files without prior agreement.\r
+\r
+ 9. Why do I get "undefined reference to gzputc"?\r
+\r
+    If "make test" produces something like\r
+\r
+       example.o(.text+0x154): undefined reference to `gzputc'\r
+\r
+    check that you don't have old files libz.* in /usr/lib, /usr/local/lib or\r
+    /usr/X11R6/lib. Remove any old versions, then do "make install".\r
+\r
+10. I need a Delphi interface to zlib.\r
+\r
+    See the contrib/delphi directory in the zlib distribution.\r
+\r
+11. Can zlib handle .zip archives?\r
+\r
+    Not by itself, no.  See the directory contrib/minizip in the zlib\r
+    distribution.\r
+\r
+12. Can zlib handle .Z files?\r
+\r
+    No, sorry.  You have to spawn an uncompress or gunzip subprocess, or adapt\r
+    the code of uncompress on your own.\r
+\r
+13. How can I make a Unix shared library?\r
+\r
+    By default a shared (and a static) library is built for Unix.  So:\r
+\r
+    make distclean\r
+    ./configure\r
+    make\r
+\r
+14. How do I install a shared zlib library on Unix?\r
+\r
+    After the above, then:\r
+\r
+    make install\r
+\r
+    However, many flavors of Unix come with a shared zlib already installed.\r
+    Before going to the trouble of compiling a shared version of zlib and\r
+    trying to install it, you may want to check if it's already there!  If you\r
+    can #include <zlib.h>, it's there.  The -lz option will probably link to\r
+    it.  You can check the version at the top of zlib.h or with the\r
+    ZLIB_VERSION symbol defined in zlib.h .\r
+\r
+15. I have a question about OttoPDF.\r
+\r
+    We are not the authors of OttoPDF. The real author is on the OttoPDF web\r
+    site: Joel Hainley, jhainley@myndkryme.com.\r
+\r
+16. Can zlib decode Flate data in an Adobe PDF file?\r
+\r
+    Yes. See http://www.pdflib.com/ . To modify PDF forms, see\r
+    http://sourceforge.net/projects/acroformtool/ .\r
+\r
+17. Why am I getting this "register_frame_info not found" error on Solaris?\r
+\r
+    After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib\r
+    generates an error such as:\r
+\r
+        ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:\r
+        symbol __register_frame_info: referenced symbol not found\r
+\r
+    The symbol __register_frame_info is not part of zlib, it is generated by\r
+    the C compiler (cc or gcc).  You must recompile applications using zlib\r
+    which have this problem.  This problem is specific to Solaris.  See\r
+    http://www.sunfreeware.com for Solaris versions of zlib and applications\r
+    using zlib.\r
+\r
+18. Why does gzip give an error on a file I make with compress/deflate?\r
+\r
+    The compress and deflate functions produce data in the zlib format, which\r
+    is different and incompatible with the gzip format.  The gz* functions in\r
+    zlib on the other hand use the gzip format.  Both the zlib and gzip formats\r
+    use the same compressed data format internally, but have different headers\r
+    and trailers around the compressed data.\r
+\r
+19. Ok, so why are there two different formats?\r
+\r
+    The gzip format was designed to retain the directory information about a\r
+    single file, such as the name and last modification date.  The zlib format\r
+    on the other hand was designed for in-memory and communication channel\r
+    applications, and has a much more compact header and trailer and uses a\r
+    faster integrity check than gzip.\r
+\r
+20. Well that's nice, but how do I make a gzip file in memory?\r
+\r
+    You can request that deflate write the gzip format instead of the zlib\r
+    format using deflateInit2().  You can also request that inflate decode the\r
+    gzip format using inflateInit2().  Read zlib.h for more details.\r
+\r
+21. Is zlib thread-safe?\r
+\r
+    Yes.  However any library routines that zlib uses and any application-\r
+    provided memory allocation routines must also be thread-safe.  zlib's gz*\r
+    functions use stdio library routines, and most of zlib's functions use the\r
+    library memory allocation routines by default.  zlib's *Init* functions\r
+    allow for the application to provide custom memory allocation routines.\r
+\r
+    Of course, you should only operate on any given zlib or gzip stream from a\r
+    single thread at a time.\r
+\r
+22. Can I use zlib in my commercial application?\r
+\r
+    Yes.  Please read the license in zlib.h.\r
+\r
+23. Is zlib under the GNU license?\r
+\r
+    No.  Please read the license in zlib.h.\r
+\r
+24. The license says that altered source versions must be "plainly marked". So\r
+    what exactly do I need to do to meet that requirement?\r
+\r
+    You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h.  In\r
+    particular, the final version number needs to be changed to "f", and an\r
+    identification string should be appended to ZLIB_VERSION.  Version numbers\r
+    x.x.x.f are reserved for modifications to zlib by others than the zlib\r
+    maintainers.  For example, if the version of the base zlib you are altering\r
+    is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and\r
+    ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3".  You can also\r
+    update the version strings in deflate.c and inftrees.c.\r
+\r
+    For altered source distributions, you should also note the origin and\r
+    nature of the changes in zlib.h, as well as in ChangeLog and README, along\r
+    with the dates of the alterations.  The origin should include at least your\r
+    name (or your company's name), and an email address to contact for help or\r
+    issues with the library.\r
+\r
+    Note that distributing a compiled zlib library along with zlib.h and\r
+    zconf.h is also a source distribution, and so you should change\r
+    ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes\r
+    in zlib.h as you would for a full source distribution.\r
+\r
+25. Will zlib work on a big-endian or little-endian architecture, and can I\r
+    exchange compressed data between them?\r
+\r
+    Yes and yes.\r
+\r
+26. Will zlib work on a 64-bit machine?\r
+\r
+    Yes.  It has been tested on 64-bit machines, and has no dependence on any\r
+    data types being limited to 32-bits in length.  If you have any\r
+    difficulties, please provide a complete problem report to zlib@gzip.org\r
+\r
+27. Will zlib decompress data from the PKWare Data Compression Library?\r
+\r
+    No.  The PKWare DCL uses a completely different compressed data format than\r
+    does PKZIP and zlib.  However, you can look in zlib's contrib/blast\r
+    directory for a possible solution to your problem.\r
+\r
+28. Can I access data randomly in a compressed stream?\r
+\r
+    No, not without some preparation.  If when compressing you periodically use\r
+    Z_FULL_FLUSH, carefully write all the pending data at those points, and\r
+    keep an index of those locations, then you can start decompression at those\r
+    points.  You have to be careful to not use Z_FULL_FLUSH too often, since it\r
+    can significantly degrade compression.  Alternatively, you can scan a\r
+    deflate stream once to generate an index, and then use that index for\r
+    random access.  See examples/zran.c .\r
+\r
+29. Does zlib work on MVS, OS/390, CICS, etc.?\r
+\r
+    It has in the past, but we have not heard of any recent evidence.  There\r
+    were working ports of zlib 1.1.4 to MVS, but those links no longer work.\r
+    If you know of recent, successful applications of zlib on these operating\r
+    systems, please let us know.  Thanks.\r
+\r
+30. Is there some simpler, easier to read version of inflate I can look at to\r
+    understand the deflate format?\r
+\r
+    First off, you should read RFC 1951.  Second, yes.  Look in zlib's\r
+    contrib/puff directory.\r
+\r
+31. Does zlib infringe on any patents?\r
+\r
+    As far as we know, no.  In fact, that was originally the whole point behind\r
+    zlib.  Look here for some more information:\r
+\r
+    http://www.gzip.org/#faq11\r
+\r
+32. Can zlib work with greater than 4 GB of data?\r
+\r
+    Yes.  inflate() and deflate() will process any amount of data correctly.\r
+    Each call of inflate() or deflate() is limited to input and output chunks\r
+    of the maximum value that can be stored in the compiler's "unsigned int"\r
+    type, but there is no limit to the number of chunks.  Note however that the\r
+    strm.total_in and strm_total_out counters may be limited to 4 GB.  These\r
+    counters are provided as a convenience and are not used internally by\r
+    inflate() or deflate().  The application can easily set up its own counters\r
+    updated after each call of inflate() or deflate() to count beyond 4 GB.\r
+    compress() and uncompress() may be limited to 4 GB, since they operate in a\r
+    single call.  gzseek() and gztell() may be limited to 4 GB depending on how\r
+    zlib is compiled.  See the zlibCompileFlags() function in zlib.h.\r
+\r
+    The word "may" appears several times above since there is a 4 GB limit only\r
+    if the compiler's "long" type is 32 bits.  If the compiler's "long" type is\r
+    64 bits, then the limit is 16 exabytes.\r
+\r
+33. Does zlib have any security vulnerabilities?\r
+\r
+    The only one that we are aware of is potentially in gzprintf().  If zlib is\r
+    compiled to use sprintf() or vsprintf(), then there is no protection\r
+    against a buffer overflow of an 8K string space (or other value as set by\r
+    gzbuffer()), other than the caller of gzprintf() assuring that the output\r
+    will not exceed 8K.  On the other hand, if zlib is compiled to use\r
+    snprintf() or vsnprintf(), which should normally be the case, then there is\r
+    no vulnerability.  The ./configure script will display warnings if an\r
+    insecure variation of sprintf() will be used by gzprintf().  Also the\r
+    zlibCompileFlags() function will return information on what variant of\r
+    sprintf() is used by gzprintf().\r
+\r
+    If you don't have snprintf() or vsnprintf() and would like one, you can\r
+    find a portable implementation here:\r
+\r
+        http://www.ijs.si/software/snprintf/\r
+\r
+    Note that you should be using the most recent version of zlib.  Versions\r
+    1.1.3 and before were subject to a double-free vulnerability, and versions\r
+    1.2.1 and 1.2.2 were subject to an access exception when decompressing\r
+    invalid compressed data.\r
+\r
+34. Is there a Java version of zlib?\r
+\r
+    Probably what you want is to use zlib in Java. zlib is already included\r
+    as part of the Java SDK in the java.util.zip package. If you really want\r
+    a version of zlib written in the Java language, look on the zlib home\r
+    page for links: http://zlib.net/ .\r
+\r
+35. I get this or that compiler or source-code scanner warning when I crank it\r
+    up to maximally-pedantic. Can't you guys write proper code?\r
+\r
+    Many years ago, we gave up attempting to avoid warnings on every compiler\r
+    in the universe.  It just got to be a waste of time, and some compilers\r
+    were downright silly as well as contradicted each other.  So now, we simply\r
+    make sure that the code always works.\r
+\r
+36. Valgrind (or some similar memory access checker) says that deflate is\r
+    performing a conditional jump that depends on an uninitialized value.\r
+    Isn't that a bug?\r
+\r
+    No.  That is intentional for performance reasons, and the output of deflate\r
+    is not affected.  This only started showing up recently since zlib 1.2.x\r
+    uses malloc() by default for allocations, whereas earlier versions used\r
+    calloc(), which zeros out the allocated memory.  Even though the code was\r
+    correct, versions 1.2.4 and later was changed to not stimulate these\r
+    checkers.\r
+\r
+37. Will zlib read the (insert any ancient or arcane format here) compressed\r
+    data format?\r
+\r
+    Probably not. Look in the comp.compression FAQ for pointers to various\r
+    formats and associated software.\r
+\r
+38. How can I encrypt/decrypt zip files with zlib?\r
+\r
+    zlib doesn't support encryption.  The original PKZIP encryption is very\r
+    weak and can be broken with freely available programs.  To get strong\r
+    encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib\r
+    compression.  For PKZIP compatible "encryption", look at\r
+    http://www.info-zip.org/\r
+\r
+39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?\r
+\r
+    "gzip" is the gzip format, and "deflate" is the zlib format.  They should\r
+    probably have called the second one "zlib" instead to avoid confusion with\r
+    the raw deflate compressed data format.  While the HTTP 1.1 RFC 2616\r
+    correctly points to the zlib specification in RFC 1950 for the "deflate"\r
+    transfer encoding, there have been reports of servers and browsers that\r
+    incorrectly produce or expect raw deflate data per the deflate\r
+    specification in RFC 1951, most notably Microsoft.  So even though the\r
+    "deflate" transfer encoding using the zlib format would be the more\r
+    efficient approach (and in fact exactly what the zlib format was designed\r
+    for), using the "gzip" transfer encoding is probably more reliable due to\r
+    an unfortunate choice of name on the part of the HTTP 1.1 authors.\r
+\r
+    Bottom line: use the gzip format for HTTP 1.1 encoding.\r
+\r
+40. Does zlib support the new "Deflate64" format introduced by PKWare?\r
+\r
+    No.  PKWare has apparently decided to keep that format proprietary, since\r
+    they have not documented it as they have previous compression formats.  In\r
+    any case, the compression improvements are so modest compared to other more\r
+    modern approaches, that it's not worth the effort to implement.\r
+\r
+41. I'm having a problem with the zip functions in zlib, can you help?\r
+\r
+    There are no zip functions in zlib.  You are probably using minizip by\r
+    Giles Vollant, which is found in the contrib directory of zlib.  It is not\r
+    part of zlib.  In fact none of the stuff in contrib is part of zlib.  The\r
+    files in there are not supported by the zlib authors.  You need to contact\r
+    the authors of the respective contribution for help.\r
+\r
+42. The match.asm code in contrib is under the GNU General Public License.\r
+    Since it's part of zlib, doesn't that mean that all of zlib falls under the\r
+    GNU GPL?\r
+\r
+    No.  The files in contrib are not part of zlib.  They were contributed by\r
+    other authors and are provided as a convenience to the user within the zlib\r
+    distribution.  Each item in contrib has its own license.\r
+\r
+43. Is zlib subject to export controls?  What is its ECCN?\r
+\r
+    zlib is not subject to export controls, and so is classified as EAR99.\r
+\r
+44. Can you please sign these lengthy legal documents and fax them back to us\r
+    so that we can use your software in our product?\r
+\r
+    No. Go away. Shoo.\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/INDEX b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/INDEX
new file mode 100644 (file)
index 0000000..f64a14f
--- /dev/null
@@ -0,0 +1,68 @@
+CMakeLists.txt  cmake build file\r
+ChangeLog       history of changes\r
+FAQ             Frequently Asked Questions about zlib\r
+INDEX           this file\r
+Makefile        dummy Makefile that tells you to ./configure\r
+Makefile.in     template for Unix Makefile\r
+README          guess what\r
+configure       configure script for Unix\r
+make_vms.com    makefile for VMS\r
+test/example.c  zlib usages examples for build testing\r
+test/minigzip.c minimal gzip-like functionality for build testing\r
+test/infcover.c inf*.c code coverage for build coverage testing\r
+treebuild.xml   XML description of source file dependencies\r
+zconf.h.cmakein zconf.h template for cmake\r
+zconf.h.in      zconf.h template for configure\r
+zlib.3          Man page for zlib\r
+zlib.3.pdf      Man page in PDF format\r
+zlib.map        Linux symbol information\r
+zlib.pc.in      Template for pkg-config descriptor\r
+zlib.pc.cmakein zlib.pc template for cmake\r
+zlib2ansi       perl script to convert source files for C++ compilation\r
+\r
+amiga/          makefiles for Amiga SAS C\r
+as400/          makefiles for AS/400\r
+doc/            documentation for formats and algorithms\r
+msdos/          makefiles for MSDOS\r
+nintendods/     makefile for Nintendo DS\r
+old/            makefiles for various architectures and zlib documentation\r
+                files that have not yet been updated for zlib 1.2.x\r
+qnx/            makefiles for QNX\r
+watcom/         makefiles for OpenWatcom\r
+win32/          makefiles for Windows\r
+\r
+                zlib public header files (required for library use):\r
+zconf.h\r
+zlib.h\r
+\r
+                private source files used to build the zlib library:\r
+adler32.c\r
+compress.c\r
+crc32.c\r
+crc32.h\r
+deflate.c\r
+deflate.h\r
+gzclose.c\r
+gzguts.h\r
+gzlib.c\r
+gzread.c\r
+gzwrite.c\r
+infback.c\r
+inffast.c\r
+inffast.h\r
+inffixed.h\r
+inflate.c\r
+inflate.h\r
+inftrees.c\r
+inftrees.h\r
+trees.c\r
+trees.h\r
+uncompr.c\r
+zutil.c\r
+zutil.h\r
+\r
+                source files for sample programs\r
+See examples/README.examples\r
+\r
+                unsupported contributions by third parties\r
+See contrib/README.contrib\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/README b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/README
new file mode 100644 (file)
index 0000000..35231cb
--- /dev/null
@@ -0,0 +1,115 @@
+ZLIB DATA COMPRESSION LIBRARY\r
+\r
+zlib 1.2.8 is a general purpose data compression library.  All the code is\r
+thread safe.  The data format used by the zlib library is described by RFCs\r
+(Request for Comments) 1950 to 1952 in the files\r
+http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and\r
+rfc1952 (gzip format).\r
+\r
+All functions of the compression library are documented in the file zlib.h\r
+(volunteer to write man pages welcome, contact zlib@gzip.org).  A usage example\r
+of the library is given in the file test/example.c which also tests that\r
+the library is working correctly.  Another example is given in the file\r
+test/minigzip.c.  The compression library itself is composed of all source\r
+files in the root directory.\r
+\r
+To compile all files and run the test program, follow the instructions given at\r
+the top of Makefile.in.  In short "./configure; make test", and if that goes\r
+well, "make install" should work for most flavors of Unix.  For Windows, use\r
+one of the special makefiles in win32/ or contrib/vstudio/ .  For VMS, use\r
+make_vms.com.\r
+\r
+Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant\r
+<info@winimage.com> for the Windows DLL version.  The zlib home page is\r
+http://zlib.net/ .  Before reporting a problem, please check this site to\r
+verify that you have the latest version of zlib; otherwise get the latest\r
+version and check whether the problem still exists or not.\r
+\r
+PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.\r
+\r
+Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan.  1997\r
+issue of Dr.  Dobb's Journal; a copy of the article is available at\r
+http://marknelson.us/1997/01/01/zlib-engine/ .\r
+\r
+The changes made in version 1.2.8 are documented in the file ChangeLog.\r
+\r
+Unsupported third party contributions are provided in directory contrib/ .\r
+\r
+zlib is available in Java using the java.util.zip package, documented at\r
+http://java.sun.com/developer/technicalArticles/Programming/compression/ .\r
+\r
+A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available\r
+at CPAN (Comprehensive Perl Archive Network) sites, including\r
+http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .\r
+\r
+A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is\r
+available in Python 1.5 and later versions, see\r
+http://docs.python.org/library/zlib.html .\r
+\r
+zlib is built into tcl: http://wiki.tcl.tk/4610 .\r
+\r
+An experimental package to read and write files in .zip format, written on top\r
+of zlib by Gilles Vollant <info@winimage.com>, is available in the\r
+contrib/minizip directory of zlib.\r
+\r
+\r
+Notes for some targets:\r
+\r
+- For Windows DLL versions, please see win32/DLL_FAQ.txt\r
+\r
+- For 64-bit Irix, deflate.c must be compiled without any optimization. With\r
+  -O, one libpng test fails. The test works in 32 bit mode (with the -n32\r
+  compiler flag). The compiler bug has been reported to SGI.\r
+\r
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works\r
+  when compiled with cc.\r
+\r
+- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is\r
+  necessary to get gzprintf working correctly. This is done by configure.\r
+\r
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with\r
+  other compilers. Use "make test" to check your compiler.\r
+\r
+- gzdopen is not supported on RISCOS or BEOS.\r
+\r
+- For PalmOs, see http://palmzlib.sourceforge.net/\r
+\r
+\r
+Acknowledgments:\r
+\r
+  The deflate format used by zlib was defined by Phil Katz.  The deflate and\r
+  zlib specifications were written by L.  Peter Deutsch.  Thanks to all the\r
+  people who reported problems and suggested various improvements in zlib; they\r
+  are too numerous to cite here.\r
+\r
+Copyright notice:\r
+\r
+ (C) 1995-2013 Jean-loup Gailly and Mark Adler\r
+\r
+  This software is provided 'as-is', without any express or implied\r
+  warranty.  In no event will the authors be held liable for any damages\r
+  arising from the use of this software.\r
+\r
+  Permission is granted to anyone to use this software for any purpose,\r
+  including commercial applications, and to alter it and redistribute it\r
+  freely, subject to the following restrictions:\r
+\r
+  1. The origin of this software must not be misrepresented; you must not\r
+     claim that you wrote the original software. If you use this software\r
+     in a product, an acknowledgment in the product documentation would be\r
+     appreciated but is not required.\r
+  2. Altered source versions must be plainly marked as such, and must not be\r
+     misrepresented as being the original software.\r
+  3. This notice may not be removed or altered from any source distribution.\r
+\r
+  Jean-loup Gailly        Mark Adler\r
+  jloup@gzip.org          madler@alumni.caltech.edu\r
+\r
+If you use the zlib library in a product, we would appreciate *not* receiving\r
+lengthy legal documents to sign.  The sources are provided for free but without\r
+warranty of any kind.  The library has been entirely written by Jean-loup\r
+Gailly and Mark Adler; it does not include third-party code.\r
+\r
+If you redistribute modified sources, we would appreciate that you include in\r
+the file ChangeLog history information documenting your changes.  Please read\r
+the FAQ for more information on the distribution of modified source versions.\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/adler32.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/adler32.c
new file mode 100644 (file)
index 0000000..003d373
--- /dev/null
@@ -0,0 +1,179 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream\r
+ * Copyright (C) 1995-2011 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#include "zutil.h"\r
+\r
+#define local static\r
+\r
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));\r
+\r
+#define BASE 65521      /* largest prime smaller than 65536 */\r
+#define NMAX 5552\r
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */\r
+\r
+#define DO1(buf,i)  {adler += (buf)[i]; sum2 += adler;}\r
+#define DO2(buf,i)  DO1(buf,i); DO1(buf,i+1);\r
+#define DO4(buf,i)  DO2(buf,i); DO2(buf,i+2);\r
+#define DO8(buf,i)  DO4(buf,i); DO4(buf,i+4);\r
+#define DO16(buf)   DO8(buf,0); DO8(buf,8);\r
+\r
+/* use NO_DIVIDE if your processor does not do division in hardware --\r
+   try it both ways to see which is faster */\r
+#ifdef NO_DIVIDE\r
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15\r
+   (thank you to John Reiser for pointing this out) */\r
+#  define CHOP(a) \\r
+    do { \\r
+        unsigned long tmp = a >> 16; \\r
+        a &= 0xffffUL; \\r
+        a += (tmp << 4) - tmp; \\r
+    } while (0)\r
+#  define MOD28(a) \\r
+    do { \\r
+        CHOP(a); \\r
+        if (a >= BASE) a -= BASE; \\r
+    } while (0)\r
+#  define MOD(a) \\r
+    do { \\r
+        CHOP(a); \\r
+        MOD28(a); \\r
+    } while (0)\r
+#  define MOD63(a) \\r
+    do { /* this assumes a is not negative */ \\r
+        z_off64_t tmp = a >> 32; \\r
+        a &= 0xffffffffL; \\r
+        a += (tmp << 8) - (tmp << 5) + tmp; \\r
+        tmp = a >> 16; \\r
+        a &= 0xffffL; \\r
+        a += (tmp << 4) - tmp; \\r
+        tmp = a >> 16; \\r
+        a &= 0xffffL; \\r
+        a += (tmp << 4) - tmp; \\r
+        if (a >= BASE) a -= BASE; \\r
+    } while (0)\r
+#else\r
+#  define MOD(a) a %= BASE\r
+#  define MOD28(a) a %= BASE\r
+#  define MOD63(a) a %= BASE\r
+#endif\r
+\r
+/* ========================================================================= */\r
+uLong ZEXPORT adler32(adler, buf, len)\r
+    uLong adler;\r
+    const Bytef *buf;\r
+    uInt len;\r
+{\r
+    unsigned long sum2;\r
+    unsigned n;\r
+\r
+    /* split Adler-32 into component sums */\r
+    sum2 = (adler >> 16) & 0xffff;\r
+    adler &= 0xffff;\r
+\r
+    /* in case user likes doing a byte at a time, keep it fast */\r
+    if (len == 1) {\r
+        adler += buf[0];\r
+        if (adler >= BASE)\r
+            adler -= BASE;\r
+        sum2 += adler;\r
+        if (sum2 >= BASE)\r
+            sum2 -= BASE;\r
+        return adler | (sum2 << 16);\r
+    }\r
+\r
+    /* initial Adler-32 value (deferred check for len == 1 speed) */\r
+    if (buf == Z_NULL)\r
+        return 1L;\r
+\r
+    /* in case short lengths are provided, keep it somewhat fast */\r
+    if (len < 16) {\r
+        while (len--) {\r
+            adler += *buf++;\r
+            sum2 += adler;\r
+        }\r
+        if (adler >= BASE)\r
+            adler -= BASE;\r
+        MOD28(sum2);            /* only added so many BASE's */\r
+        return adler | (sum2 << 16);\r
+    }\r
+\r
+    /* do length NMAX blocks -- requires just one modulo operation */\r
+    while (len >= NMAX) {\r
+        len -= NMAX;\r
+        n = NMAX / 16;          /* NMAX is divisible by 16 */\r
+        do {\r
+            DO16(buf);          /* 16 sums unrolled */\r
+            buf += 16;\r
+        } while (--n);\r
+        MOD(adler);\r
+        MOD(sum2);\r
+    }\r
+\r
+    /* do remaining bytes (less than NMAX, still just one modulo) */\r
+    if (len) {                  /* avoid modulos if none remaining */\r
+        while (len >= 16) {\r
+            len -= 16;\r
+            DO16(buf);\r
+            buf += 16;\r
+        }\r
+        while (len--) {\r
+            adler += *buf++;\r
+            sum2 += adler;\r
+        }\r
+        MOD(adler);\r
+        MOD(sum2);\r
+    }\r
+\r
+    /* return recombined sums */\r
+    return adler | (sum2 << 16);\r
+}\r
+\r
+/* ========================================================================= */\r
+local uLong adler32_combine_(adler1, adler2, len2)\r
+    uLong adler1;\r
+    uLong adler2;\r
+    z_off64_t len2;\r
+{\r
+    unsigned long sum1;\r
+    unsigned long sum2;\r
+    unsigned rem;\r
+\r
+    /* for negative len, return invalid adler32 as a clue for debugging */\r
+    if (len2 < 0)\r
+        return 0xffffffffUL;\r
+\r
+    /* the derivation of this formula is left as an exercise for the reader */\r
+    MOD63(len2);                /* assumes len2 >= 0 */\r
+    rem = (unsigned)len2;\r
+    sum1 = adler1 & 0xffff;\r
+    sum2 = rem * sum1;\r
+    MOD(sum2);\r
+    sum1 += (adler2 & 0xffff) + BASE - 1;\r
+    sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;\r
+    if (sum1 >= BASE) sum1 -= BASE;\r
+    if (sum1 >= BASE) sum1 -= BASE;\r
+    if (sum2 >= (BASE << 1)) sum2 -= (BASE << 1);\r
+    if (sum2 >= BASE) sum2 -= BASE;\r
+    return sum1 | (sum2 << 16);\r
+}\r
+\r
+/* ========================================================================= */\r
+uLong ZEXPORT adler32_combine(adler1, adler2, len2)\r
+    uLong adler1;\r
+    uLong adler2;\r
+    z_off_t len2;\r
+{\r
+    return adler32_combine_(adler1, adler2, len2);\r
+}\r
+\r
+uLong ZEXPORT adler32_combine64(adler1, adler2, len2)\r
+    uLong adler1;\r
+    uLong adler2;\r
+    z_off64_t len2;\r
+{\r
+    return adler32_combine_(adler1, adler2, len2);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/algorithm.txt b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/algorithm.txt
new file mode 100644 (file)
index 0000000..2ee706a
--- /dev/null
@@ -0,0 +1,209 @@
+1. Compression algorithm (deflate)\r
+\r
+The deflation algorithm used by gzip (also zip and zlib) is a variation of\r
+LZ77 (Lempel-Ziv 1977, see reference below). It finds duplicated strings in\r
+the input data.  The second occurrence of a string is replaced by a\r
+pointer to the previous string, in the form of a pair (distance,\r
+length).  Distances are limited to 32K bytes, and lengths are limited\r
+to 258 bytes. When a string does not occur anywhere in the previous\r
+32K bytes, it is emitted as a sequence of literal bytes.  (In this\r
+description, `string' must be taken as an arbitrary sequence of bytes,\r
+and is not restricted to printable characters.)\r
+\r
+Literals or match lengths are compressed with one Huffman tree, and\r
+match distances are compressed with another tree. The trees are stored\r
+in a compact form at the start of each block. The blocks can have any\r
+size (except that the compressed data for one block must fit in\r
+available memory). A block is terminated when deflate() determines that\r
+it would be useful to start another block with fresh trees. (This is\r
+somewhat similar to the behavior of LZW-based _compress_.)\r
+\r
+Duplicated strings are found using a hash table. All input strings of\r
+length 3 are inserted in the hash table. A hash index is computed for\r
+the next 3 bytes. If the hash chain for this index is not empty, all\r
+strings in the chain are compared with the current input string, and\r
+the longest match is selected.\r
+\r
+The hash chains are searched starting with the most recent strings, to\r
+favor small distances and thus take advantage of the Huffman encoding.\r
+The hash chains are singly linked. There are no deletions from the\r
+hash chains, the algorithm simply discards matches that are too old.\r
+\r
+To avoid a worst-case situation, very long hash chains are arbitrarily\r
+truncated at a certain length, determined by a runtime option (level\r
+parameter of deflateInit). So deflate() does not always find the longest\r
+possible match but generally finds a match which is long enough.\r
+\r
+deflate() also defers the selection of matches with a lazy evaluation\r
+mechanism. After a match of length N has been found, deflate() searches for\r
+a longer match at the next input byte. If a longer match is found, the\r
+previous match is truncated to a length of one (thus producing a single\r
+literal byte) and the process of lazy evaluation begins again. Otherwise,\r
+the original match is kept, and the next match search is attempted only N\r
+steps later.\r
+\r
+The lazy match evaluation is also subject to a runtime parameter. If\r
+the current match is long enough, deflate() reduces the search for a longer\r
+match, thus speeding up the whole process. If compression ratio is more\r
+important than speed, deflate() attempts a complete second search even if\r
+the first match is already long enough.\r
+\r
+The lazy match evaluation is not performed for the fastest compression\r
+modes (level parameter 1 to 3). For these fast modes, new strings\r
+are inserted in the hash table only when no match was found, or\r
+when the match is not too long. This degrades the compression ratio\r
+but saves time since there are both fewer insertions and fewer searches.\r
+\r
+\r
+2. Decompression algorithm (inflate)\r
+\r
+2.1 Introduction\r
+\r
+The key question is how to represent a Huffman code (or any prefix code) so\r
+that you can decode fast.  The most important characteristic is that shorter\r
+codes are much more common than longer codes, so pay attention to decoding the\r
+short codes fast, and let the long codes take longer to decode.\r
+\r
+inflate() sets up a first level table that covers some number of bits of\r
+input less than the length of longest code.  It gets that many bits from the\r
+stream, and looks it up in the table.  The table will tell if the next\r
+code is that many bits or less and how many, and if it is, it will tell\r
+the value, else it will point to the next level table for which inflate()\r
+grabs more bits and tries to decode a longer code.\r
+\r
+How many bits to make the first lookup is a tradeoff between the time it\r
+takes to decode and the time it takes to build the table.  If building the\r
+table took no time (and if you had infinite memory), then there would only\r
+be a first level table to cover all the way to the longest code.  However,\r
+building the table ends up taking a lot longer for more bits since short\r
+codes are replicated many times in such a table.  What inflate() does is\r
+simply to make the number of bits in the first table a variable, and  then\r
+to set that variable for the maximum speed.\r
+\r
+For inflate, which has 286 possible codes for the literal/length tree, the size\r
+of the first table is nine bits.  Also the distance trees have 30 possible\r
+values, and the size of the first table is six bits.  Note that for each of\r
+those cases, the table ended up one bit longer than the ``average'' code\r
+length, i.e. the code length of an approximately flat code which would be a\r
+little more than eight bits for 286 symbols and a little less than five bits\r
+for 30 symbols.\r
+\r
+\r
+2.2 More details on the inflate table lookup\r
+\r
+Ok, you want to know what this cleverly obfuscated inflate tree actually\r
+looks like.  You are correct that it's not a Huffman tree.  It is simply a\r
+lookup table for the first, let's say, nine bits of a Huffman symbol.  The\r
+symbol could be as short as one bit or as long as 15 bits.  If a particular\r
+symbol is shorter than nine bits, then that symbol's translation is duplicated\r
+in all those entries that start with that symbol's bits.  For example, if the\r
+symbol is four bits, then it's duplicated 32 times in a nine-bit table.  If a\r
+symbol is nine bits long, it appears in the table once.\r
+\r
+If the symbol is longer than nine bits, then that entry in the table points\r
+to another similar table for the remaining bits.  Again, there are duplicated\r
+entries as needed.  The idea is that most of the time the symbol will be short\r
+and there will only be one table look up.  (That's whole idea behind data\r
+compression in the first place.)  For the less frequent long symbols, there\r
+will be two lookups.  If you had a compression method with really long\r
+symbols, you could have as many levels of lookups as is efficient.  For\r
+inflate, two is enough.\r
+\r
+So a table entry either points to another table (in which case nine bits in\r
+the above example are gobbled), or it contains the translation for the symbol\r
+and the number of bits to gobble.  Then you start again with the next\r
+ungobbled bit.\r
+\r
+You may wonder: why not just have one lookup table for how ever many bits the\r
+longest symbol is?  The reason is that if you do that, you end up spending\r
+more time filling in duplicate symbol entries than you do actually decoding.\r
+At least for deflate's output that generates new trees every several 10's of\r
+kbytes.  You can imagine that filling in a 2^15 entry table for a 15-bit code\r
+would take too long if you're only decoding several thousand symbols.  At the\r
+other extreme, you could make a new table for every bit in the code.  In fact,\r
+that's essentially a Huffman tree.  But then you spend too much time\r
+traversing the tree while decoding, even for short symbols.\r
+\r
+So the number of bits for the first lookup table is a trade of the time to\r
+fill out the table vs. the time spent looking at the second level and above of\r
+the table.\r
+\r
+Here is an example, scaled down:\r
+\r
+The code being decoded, with 10 symbols, from 1 to 6 bits long:\r
+\r
+A: 0\r
+B: 10\r
+C: 1100\r
+D: 11010\r
+E: 11011\r
+F: 11100\r
+G: 11101\r
+H: 11110\r
+I: 111110\r
+J: 111111\r
+\r
+Let's make the first table three bits long (eight entries):\r
+\r
+000: A,1\r
+001: A,1\r
+010: A,1\r
+011: A,1\r
+100: B,2\r
+101: B,2\r
+110: -> table X (gobble 3 bits)\r
+111: -> table Y (gobble 3 bits)\r
+\r
+Each entry is what the bits decode as and how many bits that is, i.e. how\r
+many bits to gobble.  Or the entry points to another table, with the number of\r
+bits to gobble implicit in the size of the table.\r
+\r
+Table X is two bits long since the longest code starting with 110 is five bits\r
+long:\r
+\r
+00: C,1\r
+01: C,1\r
+10: D,2\r
+11: E,2\r
+\r
+Table Y is three bits long since the longest code starting with 111 is six\r
+bits long:\r
+\r
+000: F,2\r
+001: F,2\r
+010: G,2\r
+011: G,2\r
+100: H,2\r
+101: H,2\r
+110: I,3\r
+111: J,3\r
+\r
+So what we have here are three tables with a total of 20 entries that had to\r
+be constructed.  That's compared to 64 entries for a single table.  Or\r
+compared to 16 entries for a Huffman tree (six two entry tables and one four\r
+entry table).  Assuming that the code ideally represents the probability of\r
+the symbols, it takes on the average 1.25 lookups per symbol.  That's compared\r
+to one lookup for the single table, or 1.66 lookups per symbol for the\r
+Huffman tree.\r
+\r
+There, I think that gives you a picture of what's going on.  For inflate, the\r
+meaning of a particular symbol is often more than just a letter.  It can be a\r
+byte (a "literal"), or it can be either a length or a distance which\r
+indicates a base value and a number of bits to fetch after the code that is\r
+added to the base value.  Or it might be the special end-of-block code.  The\r
+data structures created in inftrees.c try to encode all that information\r
+compactly in the tables.\r
+\r
+\r
+Jean-loup Gailly        Mark Adler\r
+jloup@gzip.org          madler@alumni.caltech.edu\r
+\r
+\r
+References:\r
+\r
+[LZ77] Ziv J., Lempel A., ``A Universal Algorithm for Sequential Data\r
+Compression,'' IEEE Transactions on Information Theory, Vol. 23, No. 3,\r
+pp. 337-343.\r
+\r
+``DEFLATE Compressed Data Format Specification'' available in\r
+http://tools.ietf.org/html/rfc1951\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/compress.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/compress.c
new file mode 100644 (file)
index 0000000..832a548
--- /dev/null
@@ -0,0 +1,80 @@
+/* compress.c -- compress a memory buffer\r
+ * Copyright (C) 1995-2005 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#define ZLIB_INTERNAL\r
+#include "zlib.h"\r
+\r
+/* ===========================================================================\r
+     Compresses the source buffer into the destination buffer. The level\r
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte\r
+   length of the source buffer. Upon entry, destLen is the total size of the\r
+   destination buffer, which must be at least 0.1% larger than sourceLen plus\r
+   12 bytes. Upon exit, destLen is the actual size of the compressed buffer.\r
+\r
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\r
+   Z_STREAM_ERROR if the level parameter is invalid.\r
+*/\r
+int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)\r
+    Bytef *dest;\r
+    uLongf *destLen;\r
+    const Bytef *source;\r
+    uLong sourceLen;\r
+    int level;\r
+{\r
+    z_stream stream;\r
+    int err;\r
+\r
+    stream.next_in = (z_const Bytef *)source;\r
+    stream.avail_in = (uInt)sourceLen;\r
+#ifdef MAXSEG_64K\r
+    /* Check for source > 64K on 16-bit machine: */\r
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\r
+#endif\r
+    stream.next_out = dest;\r
+    stream.avail_out = (uInt)*destLen;\r
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\r
+\r
+    stream.zalloc = (alloc_func)0;\r
+    stream.zfree = (free_func)0;\r
+    stream.opaque = (voidpf)0;\r
+\r
+    err = deflateInit(&stream, level);\r
+    if (err != Z_OK) return err;\r
+\r
+    err = deflate(&stream, Z_FINISH);\r
+    if (err != Z_STREAM_END) {\r
+        deflateEnd(&stream);\r
+        return err == Z_OK ? Z_BUF_ERROR : err;\r
+    }\r
+    *destLen = stream.total_out;\r
+\r
+    err = deflateEnd(&stream);\r
+    return err;\r
+}\r
+\r
+/* ===========================================================================\r
+ */\r
+int ZEXPORT compress (dest, destLen, source, sourceLen)\r
+    Bytef *dest;\r
+    uLongf *destLen;\r
+    const Bytef *source;\r
+    uLong sourceLen;\r
+{\r
+    return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);\r
+}\r
+\r
+/* ===========================================================================\r
+     If the default memLevel or windowBits for deflateInit() is changed, then\r
+   this function needs to be updated.\r
+ */\r
+uLong ZEXPORT compressBound (sourceLen)\r
+    uLong sourceLen;\r
+{\r
+    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +\r
+           (sourceLen >> 25) + 13;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/configure b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/configure
new file mode 100644 (file)
index 0000000..f5436b9
--- /dev/null
@@ -0,0 +1,831 @@
+#!/bin/sh\r
+# configure script for zlib.\r
+#\r
+# Normally configure builds both a static and a shared library.\r
+# If you want to build just a static library, use: ./configure --static\r
+#\r
+# To impose specific compiler or flags or install directory, use for example:\r
+#    prefix=$HOME CC=cc CFLAGS="-O4" ./configure\r
+# or for csh/tcsh users:\r
+#    (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)\r
+\r
+# Incorrect settings of CC or CFLAGS may prevent creating a shared library.\r
+# If you have problems, try without defining CC and CFLAGS before reporting\r
+# an error.\r
+\r
+# start off configure.log\r
+echo -------------------- >> configure.log\r
+echo $0 $* >> configure.log\r
+date >> configure.log\r
+\r
+# set command prefix for cross-compilation\r
+if [ -n "${CHOST}" ]; then\r
+    uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`"\r
+    CROSS_PREFIX="${CHOST}-"\r
+fi\r
+\r
+# destination name for static library\r
+STATICLIB=libz.a\r
+\r
+# extract zlib version numbers from zlib.h\r
+VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`\r
+VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < zlib.h`\r
+VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < zlib.h`\r
+VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < zlib.h`\r
+\r
+# establish commands for library building\r
+if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then\r
+    AR=${AR-"${CROSS_PREFIX}ar"}\r
+    test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log\r
+else\r
+    AR=${AR-"ar"}\r
+    test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log\r
+fi\r
+ARFLAGS=${ARFLAGS-"rc"}\r
+if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then\r
+    RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"}\r
+    test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log\r
+else\r
+    RANLIB=${RANLIB-"ranlib"}\r
+fi\r
+if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then\r
+    NM=${NM-"${CROSS_PREFIX}nm"}\r
+    test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log\r
+else\r
+    NM=${NM-"nm"}\r
+fi\r
+\r
+# set defaults before processing command line options\r
+LDCONFIG=${LDCONFIG-"ldconfig"}\r
+LDSHAREDLIBC="${LDSHAREDLIBC--lc}"\r
+ARCHS=\r
+prefix=${prefix-/usr/local}\r
+exec_prefix=${exec_prefix-'${prefix}'}\r
+libdir=${libdir-'${exec_prefix}/lib'}\r
+sharedlibdir=${sharedlibdir-'${libdir}'}\r
+includedir=${includedir-'${prefix}/include'}\r
+mandir=${mandir-'${prefix}/share/man'}\r
+shared_ext='.so'\r
+shared=1\r
+solo=0\r
+cover=0\r
+zprefix=0\r
+zconst=0\r
+build64=0\r
+gcc=0\r
+old_cc="$CC"\r
+old_cflags="$CFLAGS"\r
+OBJC='$(OBJZ) $(OBJG)'\r
+PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)'\r
+\r
+# leave this script, optionally in a bad way\r
+leave()\r
+{\r
+  if test "$*" != "0"; then\r
+    echo "** $0 aborting." | tee -a configure.log\r
+  fi\r
+  rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version\r
+  echo -------------------- >> configure.log\r
+  echo >> configure.log\r
+  echo >> configure.log\r
+  exit $1\r
+}\r
+\r
+# process command line options\r
+while test $# -ge 1\r
+do\r
+case "$1" in\r
+    -h* | --help)\r
+      echo 'usage:' | tee -a configure.log\r
+      echo '  configure [--const] [--zprefix] [--prefix=PREFIX]  [--eprefix=EXPREFIX]' | tee -a configure.log\r
+      echo '    [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log\r
+      echo '    [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log\r
+        exit 0 ;;\r
+    -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;;\r
+    -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;;\r
+    -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;;\r
+    --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;;\r
+    -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;;\r
+    -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;;\r
+    -p* | --prefix) prefix="$2"; shift; shift ;;\r
+    -e* | --eprefix) exec_prefix="$2"; shift; shift ;;\r
+    -l* | --libdir) libdir="$2"; shift; shift ;;\r
+    -i* | --includedir) includedir="$2"; shift; shift ;;\r
+    -s* | --shared | --enable-shared) shared=1; shift ;;\r
+    -t | --static) shared=0; shift ;;\r
+    --solo) solo=1; shift ;;\r
+    --cover) cover=1; shift ;;\r
+    -z* | --zprefix) zprefix=1; shift ;;\r
+    -6* | --64) build64=1; shift ;;\r
+    -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;;\r
+    --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;;\r
+    --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;;\r
+    -c* | --const) zconst=1; shift ;;\r
+    *)\r
+      echo "unknown option: $1" | tee -a configure.log\r
+      echo "$0 --help for help" | tee -a configure.log\r
+      leave 1;;\r
+    esac\r
+done\r
+\r
+# temporary file name\r
+test=ztest$$\r
+\r
+# put arguments in log, also put test file in log if used in arguments\r
+show()\r
+{\r
+  case "$*" in\r
+    *$test.c*)\r
+      echo === $test.c === >> configure.log\r
+      cat $test.c >> configure.log\r
+      echo === >> configure.log;;\r
+  esac\r
+  echo $* >> configure.log\r
+}\r
+\r
+# check for gcc vs. cc and set compile and link flags based on the system identified by uname\r
+cat > $test.c <<EOF\r
+extern int getchar();\r
+int hello() {return getchar();}\r
+EOF\r
+\r
+test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log\r
+cc=${CC-${CROSS_PREFIX}gcc}\r
+cflags=${CFLAGS-"-O3"}\r
+# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure\r
+case "$cc" in\r
+  *gcc*) gcc=1 ;;\r
+  *clang*) gcc=1 ;;\r
+esac\r
+case `$cc -v 2>&1` in\r
+  *gcc*) gcc=1 ;;\r
+esac\r
+\r
+show $cc -c $test.c\r
+if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then\r
+  echo ... using gcc >> configure.log\r
+  CC="$cc"\r
+  CFLAGS="${CFLAGS--O3} ${ARCHS}"\r
+  SFLAGS="${CFLAGS--O3} -fPIC"\r
+  LDFLAGS="${LDFLAGS} ${ARCHS}"\r
+  if test $build64 -eq 1; then\r
+    CFLAGS="${CFLAGS} -m64"\r
+    SFLAGS="${SFLAGS} -m64"\r
+  fi\r
+  if test "${ZLIBGCCWARN}" = "YES"; then\r
+    if test "$zconst" -eq 1; then\r
+      CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST"\r
+    else\r
+      CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"\r
+    fi\r
+  fi\r
+  if test -z "$uname"; then\r
+    uname=`(uname -s || echo unknown) 2>/dev/null`\r
+  fi\r
+  case "$uname" in\r
+  Linux* | linux* | GNU | GNU/* | solaris*)\r
+        LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"} ;;\r
+  *BSD | *bsd* | DragonFly)\r
+        LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map"}\r
+        LDCONFIG="ldconfig -m" ;;\r
+  CYGWIN* | Cygwin* | cygwin* | OS/2*)\r
+        EXE='.exe' ;;\r
+  MINGW* | mingw*)\r
+# temporary bypass\r
+        rm -f $test.[co] $test $test$shared_ext\r
+        echo "Please use win32/Makefile.gcc instead." | tee -a configure.log\r
+        leave 1\r
+        LDSHARED=${LDSHARED-"$cc -shared"}\r
+        LDSHAREDLIBC=""\r
+        EXE='.exe' ;;\r
+  QNX*)  # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4\r
+         # (alain.bonnefoy@icbt.com)\r
+                 LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;;\r
+  HP-UX*)\r
+         LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}\r
+         case `(uname -m || echo unknown) 2>/dev/null` in\r
+         ia64)\r
+                 shared_ext='.so'\r
+                 SHAREDLIB='libz.so' ;;\r
+         *)\r
+                 shared_ext='.sl'\r
+                 SHAREDLIB='libz.sl' ;;\r
+         esac ;;\r
+  Darwin* | darwin*)\r
+             shared_ext='.dylib'\r
+             SHAREDLIB=libz$shared_ext\r
+             SHAREDLIBV=libz.$VER$shared_ext\r
+             SHAREDLIBM=libz.$VER1$shared_ext\r
+             LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"}\r
+             if libtool -V 2>&1 | grep Apple > /dev/null; then\r
+                 AR="libtool"\r
+             else\r
+                 AR="/usr/bin/libtool"\r
+             fi\r
+             ARFLAGS="-o" ;;\r
+  *)             LDSHARED=${LDSHARED-"$cc -shared"} ;;\r
+  esac\r
+else\r
+  # find system name and corresponding cc options\r
+  CC=${CC-cc}\r
+  gcc=0\r
+  echo ... using $CC >> configure.log\r
+  if test -z "$uname"; then\r
+    uname=`(uname -sr || echo unknown) 2>/dev/null`\r
+  fi\r
+  case "$uname" in\r
+  HP-UX*)    SFLAGS=${CFLAGS-"-O +z"}\r
+             CFLAGS=${CFLAGS-"-O"}\r
+#            LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}\r
+             LDSHARED=${LDSHARED-"ld -b"}\r
+         case `(uname -m || echo unknown) 2>/dev/null` in\r
+         ia64)\r
+             shared_ext='.so'\r
+             SHAREDLIB='libz.so' ;;\r
+         *)\r
+             shared_ext='.sl'\r
+             SHAREDLIB='libz.sl' ;;\r
+         esac ;;\r
+  IRIX*)     SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}\r
+             CFLAGS=${CFLAGS-"-ansi -O2"}\r
+             LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;\r
+  OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}\r
+             CFLAGS=${CFLAGS-"-O -std1"}\r
+             LDFLAGS="${LDFLAGS} -Wl,-rpath,."\r
+             LDSHARED=${LDSHARED-"cc -shared  -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;;\r
+  OSF1*)     SFLAGS=${CFLAGS-"-O -std1"}\r
+             CFLAGS=${CFLAGS-"-O -std1"}\r
+             LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;\r
+  QNX*)      SFLAGS=${CFLAGS-"-4 -O"}\r
+             CFLAGS=${CFLAGS-"-4 -O"}\r
+             LDSHARED=${LDSHARED-"cc"}\r
+             RANLIB=${RANLIB-"true"}\r
+             AR="cc"\r
+             ARFLAGS="-A" ;;\r
+  SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}\r
+             CFLAGS=${CFLAGS-"-O3"}\r
+             LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;;\r
+  SunOS\ 5* | solaris*)\r
+         LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"}\r
+         SFLAGS=${CFLAGS-"-fast -KPIC"}\r
+         CFLAGS=${CFLAGS-"-fast"}\r
+         if test $build64 -eq 1; then\r
+             # old versions of SunPRO/Workshop/Studio don't support -m64,\r
+             # but newer ones do.  Check for it.\r
+             flag64=`$CC -flags | egrep -- '^-m64'`\r
+             if test x"$flag64" != x"" ; then\r
+                 CFLAGS="${CFLAGS} -m64"\r
+                 SFLAGS="${SFLAGS} -m64"\r
+             else\r
+                 case `(uname -m || echo unknown) 2>/dev/null` in\r
+                   i86*)\r
+                     SFLAGS="$SFLAGS -xarch=amd64"\r
+                     CFLAGS="$CFLAGS -xarch=amd64" ;;\r
+                   *)\r
+                     SFLAGS="$SFLAGS -xarch=v9"\r
+                     CFLAGS="$CFLAGS -xarch=v9" ;;\r
+                 esac\r
+             fi\r
+         fi\r
+         ;;\r
+  SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}\r
+             CFLAGS=${CFLAGS-"-O2"}\r
+             LDSHARED=${LDSHARED-"ld"} ;;\r
+  SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"}\r
+             CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"}\r
+             LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;;\r
+  UNIX_System_V\ 4.2.0)\r
+             SFLAGS=${CFLAGS-"-KPIC -O"}\r
+             CFLAGS=${CFLAGS-"-O"}\r
+             LDSHARED=${LDSHARED-"cc -G"} ;;\r
+  UNIX_SV\ 4.2MP)\r
+             SFLAGS=${CFLAGS-"-Kconform_pic -O"}\r
+             CFLAGS=${CFLAGS-"-O"}\r
+             LDSHARED=${LDSHARED-"cc -G"} ;;\r
+  OpenUNIX\ 5)\r
+             SFLAGS=${CFLAGS-"-KPIC -O"}\r
+             CFLAGS=${CFLAGS-"-O"}\r
+             LDSHARED=${LDSHARED-"cc -G"} ;;\r
+  AIX*)  # Courtesy of dbakker@arrayasolutions.com\r
+             SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}\r
+             CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}\r
+             LDSHARED=${LDSHARED-"xlc -G"} ;;\r
+  # send working options for other systems to zlib@gzip.org\r
+  *)         SFLAGS=${CFLAGS-"-O"}\r
+             CFLAGS=${CFLAGS-"-O"}\r
+             LDSHARED=${LDSHARED-"cc -shared"} ;;\r
+  esac\r
+fi\r
+\r
+# destination names for shared library if not defined above\r
+SHAREDLIB=${SHAREDLIB-"libz$shared_ext"}\r
+SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"}\r
+SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"}\r
+\r
+echo >> configure.log\r
+\r
+# define functions for testing compiler and library characteristics and logging the results\r
+\r
+cat > $test.c <<EOF\r
+#error error\r
+EOF\r
+if ($CC -c $CFLAGS $test.c) 2>/dev/null; then\r
+  try()\r
+  {\r
+    show $*\r
+    test "`( $* ) 2>&1 | tee -a configure.log`" = ""\r
+  }\r
+  echo - using any output from compiler to indicate an error >> configure.log\r
+else\r
+try()\r
+{\r
+  show $*\r
+  ( $* ) >> configure.log 2>&1\r
+  ret=$?\r
+  if test $ret -ne 0; then\r
+    echo "(exit code "$ret")" >> configure.log\r
+  fi\r
+  return $ret\r
+}\r
+fi\r
+\r
+tryboth()\r
+{\r
+  show $*\r
+  got=`( $* ) 2>&1`\r
+  ret=$?\r
+  printf %s "$got" >> configure.log\r
+  if test $ret -ne 0; then\r
+    return $ret\r
+  fi\r
+  test "$got" = ""\r
+}\r
+\r
+cat > $test.c << EOF\r
+int foo() { return 0; }\r
+EOF\r
+echo "Checking for obsessive-compulsive compiler options..." >> configure.log\r
+if try $CC -c $CFLAGS $test.c; then\r
+  :\r
+else\r
+  echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log\r
+  leave 1\r
+fi\r
+\r
+echo >> configure.log\r
+\r
+# see if shared library build supported\r
+cat > $test.c <<EOF\r
+extern int getchar();\r
+int hello() {return getchar();}\r
+EOF\r
+if test $shared -eq 1; then\r
+  echo Checking for shared library support... | tee -a configure.log\r
+  # we must test in two steps (cc then ld), required at least on SunOS 4.x\r
+  if try $CC -w -c $SFLAGS $test.c &&\r
+     try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then\r
+    echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log\r
+  elif test -z "$old_cc" -a -z "$old_cflags"; then\r
+    echo No shared library support. | tee -a configure.log\r
+    shared=0;\r
+  else\r
+    echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log\r
+    shared=0;\r
+  fi\r
+fi\r
+if test $shared -eq 0; then\r
+  LDSHARED="$CC"\r
+  ALL="static"\r
+  TEST="all teststatic"\r
+  SHAREDLIB=""\r
+  SHAREDLIBV=""\r
+  SHAREDLIBM=""\r
+  echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log\r
+else\r
+  ALL="static shared"\r
+  TEST="all teststatic testshared"\r
+fi\r
+\r
+# check for underscores in external names for use by assembler code\r
+CPP=${CPP-"$CC -E"}\r
+case $CFLAGS in\r
+  *ASMV*)\r
+    echo >> configure.log\r
+    show "$NM $test.o | grep _hello"\r
+    if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then\r
+      CPP="$CPP -DNO_UNDERLINE"\r
+      echo Checking for underline in external names... No. | tee -a configure.log\r
+    else\r
+      echo Checking for underline in external names... Yes. | tee -a configure.log\r
+    fi ;;\r
+esac\r
+\r
+echo >> configure.log\r
+\r
+# check for large file support, and if none, check for fseeko()\r
+cat > $test.c <<EOF\r
+#include <sys/types.h>\r
+off64_t dummy = 0;\r
+EOF\r
+if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then\r
+  CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"\r
+  SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"\r
+  ALL="${ALL} all64"\r
+  TEST="${TEST} test64"\r
+  echo "Checking for off64_t... Yes." | tee -a configure.log\r
+  echo "Checking for fseeko... Yes." | tee -a configure.log\r
+else\r
+  echo "Checking for off64_t... No." | tee -a configure.log\r
+  echo >> configure.log\r
+  cat > $test.c <<EOF\r
+#include <stdio.h>\r
+int main(void) {\r
+  fseeko(NULL, 0, 0);\r
+  return 0;\r
+}\r
+EOF\r
+  if try $CC $CFLAGS -o $test $test.c; then\r
+    echo "Checking for fseeko... Yes." | tee -a configure.log\r
+  else\r
+    CFLAGS="${CFLAGS} -DNO_FSEEKO"\r
+    SFLAGS="${SFLAGS} -DNO_FSEEKO"\r
+    echo "Checking for fseeko... No." | tee -a configure.log\r
+  fi\r
+fi\r
+\r
+echo >> configure.log\r
+\r
+# check for strerror() for use by gz* functions\r
+cat > $test.c <<EOF\r
+#include <string.h>\r
+#include <errno.h>\r
+int main() { return strlen(strerror(errno)); }\r
+EOF\r
+if try $CC $CFLAGS -o $test $test.c; then\r
+  echo "Checking for strerror... Yes." | tee -a configure.log\r
+else\r
+  CFLAGS="${CFLAGS} -DNO_STRERROR"\r
+  SFLAGS="${SFLAGS} -DNO_STRERROR"\r
+  echo "Checking for strerror... No." | tee -a configure.log\r
+fi\r
+\r
+# copy clean zconf.h for subsequent edits\r
+cp -p zconf.h.in zconf.h\r
+\r
+echo >> configure.log\r
+\r
+# check for unistd.h and save result in zconf.h\r
+cat > $test.c <<EOF\r
+#include <unistd.h>\r
+int main() { return 0; }\r
+EOF\r
+if try $CC -c $CFLAGS $test.c; then\r
+  sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h\r
+  mv zconf.temp.h zconf.h\r
+  echo "Checking for unistd.h... Yes." | tee -a configure.log\r
+else\r
+  echo "Checking for unistd.h... No." | tee -a configure.log\r
+fi\r
+\r
+echo >> configure.log\r
+\r
+# check for stdarg.h and save result in zconf.h\r
+cat > $test.c <<EOF\r
+#include <stdarg.h>\r
+int main() { return 0; }\r
+EOF\r
+if try $CC -c $CFLAGS $test.c; then\r
+  sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h\r
+  mv zconf.temp.h zconf.h\r
+  echo "Checking for stdarg.h... Yes." | tee -a configure.log\r
+else\r
+  echo "Checking for stdarg.h... No." | tee -a configure.log\r
+fi\r
+\r
+# if the z_ prefix was requested, save that in zconf.h\r
+if test $zprefix -eq 1; then\r
+  sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h\r
+  mv zconf.temp.h zconf.h\r
+  echo >> configure.log\r
+  echo "Using z_ prefix on all symbols." | tee -a configure.log\r
+fi\r
+\r
+# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists\r
+if test $solo -eq 1; then\r
+  sed '/#define ZCONF_H/a\\r
+#define Z_SOLO\r
+\r
+' < zconf.h > zconf.temp.h\r
+  mv zconf.temp.h zconf.h\r
+OBJC='$(OBJZ)'\r
+PIC_OBJC='$(PIC_OBJZ)'\r
+fi\r
+\r
+# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X\r
+if test $cover -eq 1; then\r
+  CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"\r
+  if test -n "$GCC_CLASSIC"; then\r
+    CC=$GCC_CLASSIC\r
+  fi\r
+fi\r
+\r
+echo >> configure.log\r
+\r
+# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions\r
+# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a\r
+# return value.  The most secure result is vsnprintf() with a return value.  snprintf() with a\r
+# return value is secure as well, but then gzprintf() will be limited to 20 arguments.\r
+cat > $test.c <<EOF\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+#include "zconf.h"\r
+int main()\r
+{\r
+#ifndef STDC\r
+  choke me\r
+#endif\r
+  return 0;\r
+}\r
+EOF\r
+if try $CC -c $CFLAGS $test.c; then\r
+  echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log\r
+\r
+  echo >> configure.log\r
+  cat > $test.c <<EOF\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+int mytest(const char *fmt, ...)\r
+{\r
+  char buf[20];\r
+  va_list ap;\r
+  va_start(ap, fmt);\r
+  vsnprintf(buf, sizeof(buf), fmt, ap);\r
+  va_end(ap);\r
+  return 0;\r
+}\r
+int main()\r
+{\r
+  return (mytest("Hello%d\n", 1));\r
+}\r
+EOF\r
+  if try $CC $CFLAGS -o $test $test.c; then\r
+    echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log\r
+\r
+    echo >> configure.log\r
+    cat >$test.c <<EOF\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+int mytest(const char *fmt, ...)\r
+{\r
+  int n;\r
+  char buf[20];\r
+  va_list ap;\r
+  va_start(ap, fmt);\r
+  n = vsnprintf(buf, sizeof(buf), fmt, ap);\r
+  va_end(ap);\r
+  return n;\r
+}\r
+int main()\r
+{\r
+  return (mytest("Hello%d\n", 1));\r
+}\r
+EOF\r
+\r
+    if try $CC -c $CFLAGS $test.c; then\r
+      echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log\r
+    else\r
+      CFLAGS="$CFLAGS -DHAS_vsnprintf_void"\r
+      SFLAGS="$SFLAGS -DHAS_vsnprintf_void"\r
+      echo "Checking for return value of vsnprintf()... No." | tee -a configure.log\r
+      echo "  WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log\r
+      echo "  can build but will be open to possible string-format security" | tee -a configure.log\r
+      echo "  vulnerabilities." | tee -a configure.log\r
+    fi\r
+  else\r
+    CFLAGS="$CFLAGS -DNO_vsnprintf"\r
+    SFLAGS="$SFLAGS -DNO_vsnprintf"\r
+    echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log\r
+    echo "  WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log\r
+    echo "  can build but will be open to possible buffer-overflow security" | tee -a configure.log\r
+    echo "  vulnerabilities." | tee -a configure.log\r
+\r
+    echo >> configure.log\r
+    cat >$test.c <<EOF\r
+#include <stdio.h>\r
+#include <stdarg.h>\r
+int mytest(const char *fmt, ...)\r
+{\r
+  int n;\r
+  char buf[20];\r
+  va_list ap;\r
+  va_start(ap, fmt);\r
+  n = vsprintf(buf, fmt, ap);\r
+  va_end(ap);\r
+  return n;\r
+}\r
+int main()\r
+{\r
+  return (mytest("Hello%d\n", 1));\r
+}\r
+EOF\r
+\r
+    if try $CC -c $CFLAGS $test.c; then\r
+      echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log\r
+    else\r
+      CFLAGS="$CFLAGS -DHAS_vsprintf_void"\r
+      SFLAGS="$SFLAGS -DHAS_vsprintf_void"\r
+      echo "Checking for return value of vsprintf()... No." | tee -a configure.log\r
+      echo "  WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log\r
+      echo "  can build but will be open to possible string-format security" | tee -a configure.log\r
+      echo "  vulnerabilities." | tee -a configure.log\r
+    fi\r
+  fi\r
+else\r
+  echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log\r
+\r
+  echo >> configure.log\r
+  cat >$test.c <<EOF\r
+#include <stdio.h>\r
+int mytest()\r
+{\r
+  char buf[20];\r
+  snprintf(buf, sizeof(buf), "%s", "foo");\r
+  return 0;\r
+}\r
+int main()\r
+{\r
+  return (mytest());\r
+}\r
+EOF\r
+\r
+  if try $CC $CFLAGS -o $test $test.c; then\r
+    echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log\r
+\r
+    echo >> configure.log\r
+    cat >$test.c <<EOF\r
+#include <stdio.h>\r
+int mytest()\r
+{\r
+  char buf[20];\r
+  return snprintf(buf, sizeof(buf), "%s", "foo");\r
+}\r
+int main()\r
+{\r
+  return (mytest());\r
+}\r
+EOF\r
+\r
+    if try $CC -c $CFLAGS $test.c; then\r
+      echo "Checking for return value of snprintf()... Yes." | tee -a configure.log\r
+    else\r
+      CFLAGS="$CFLAGS -DHAS_snprintf_void"\r
+      SFLAGS="$SFLAGS -DHAS_snprintf_void"\r
+      echo "Checking for return value of snprintf()... No." | tee -a configure.log\r
+      echo "  WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log\r
+      echo "  can build but will be open to possible string-format security" | tee -a configure.log\r
+      echo "  vulnerabilities." | tee -a configure.log\r
+    fi\r
+  else\r
+    CFLAGS="$CFLAGS -DNO_snprintf"\r
+    SFLAGS="$SFLAGS -DNO_snprintf"\r
+    echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log\r
+    echo "  WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log\r
+    echo "  can build but will be open to possible buffer-overflow security" | tee -a configure.log\r
+    echo "  vulnerabilities." | tee -a configure.log\r
+\r
+    echo >> configure.log\r
+    cat >$test.c <<EOF\r
+#include <stdio.h>\r
+int mytest()\r
+{\r
+  char buf[20];\r
+  return sprintf(buf, "%s", "foo");\r
+}\r
+int main()\r
+{\r
+  return (mytest());\r
+}\r
+EOF\r
+\r
+    if try $CC -c $CFLAGS $test.c; then\r
+      echo "Checking for return value of sprintf()... Yes." | tee -a configure.log\r
+    else\r
+      CFLAGS="$CFLAGS -DHAS_sprintf_void"\r
+      SFLAGS="$SFLAGS -DHAS_sprintf_void"\r
+      echo "Checking for return value of sprintf()... No." | tee -a configure.log\r
+      echo "  WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log\r
+      echo "  can build but will be open to possible string-format security" | tee -a configure.log\r
+      echo "  vulnerabilities." | tee -a configure.log\r
+    fi\r
+  fi\r
+fi\r
+\r
+# see if we can hide zlib internal symbols that are linked between separate source files\r
+if test "$gcc" -eq 1; then\r
+  echo >> configure.log\r
+  cat > $test.c <<EOF\r
+#define ZLIB_INTERNAL __attribute__((visibility ("hidden")))\r
+int ZLIB_INTERNAL foo;\r
+int main()\r
+{\r
+  return 0;\r
+}\r
+EOF\r
+  if tryboth $CC -c $CFLAGS $test.c; then\r
+    CFLAGS="$CFLAGS -DHAVE_HIDDEN"\r
+    SFLAGS="$SFLAGS -DHAVE_HIDDEN"\r
+    echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log\r
+  else\r
+    echo "Checking for attribute(visibility) support... No." | tee -a configure.log\r
+  fi\r
+fi\r
+\r
+# show the results in the log\r
+echo >> configure.log\r
+echo ALL = $ALL >> configure.log\r
+echo AR = $AR >> configure.log\r
+echo ARFLAGS = $ARFLAGS >> configure.log\r
+echo CC = $CC >> configure.log\r
+echo CFLAGS = $CFLAGS >> configure.log\r
+echo CPP = $CPP >> configure.log\r
+echo EXE = $EXE >> configure.log\r
+echo LDCONFIG = $LDCONFIG >> configure.log\r
+echo LDFLAGS = $LDFLAGS >> configure.log\r
+echo LDSHARED = $LDSHARED >> configure.log\r
+echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log\r
+echo OBJC = $OBJC >> configure.log\r
+echo PIC_OBJC = $PIC_OBJC >> configure.log\r
+echo RANLIB = $RANLIB >> configure.log\r
+echo SFLAGS = $SFLAGS >> configure.log\r
+echo SHAREDLIB = $SHAREDLIB >> configure.log\r
+echo SHAREDLIBM = $SHAREDLIBM >> configure.log\r
+echo SHAREDLIBV = $SHAREDLIBV >> configure.log\r
+echo STATICLIB = $STATICLIB >> configure.log\r
+echo TEST = $TEST >> configure.log\r
+echo VER = $VER >> configure.log\r
+echo Z_U4 = $Z_U4 >> configure.log\r
+echo exec_prefix = $exec_prefix >> configure.log\r
+echo includedir = $includedir >> configure.log\r
+echo libdir = $libdir >> configure.log\r
+echo mandir = $mandir >> configure.log\r
+echo prefix = $prefix >> configure.log\r
+echo sharedlibdir = $sharedlibdir >> configure.log\r
+echo uname = $uname >> configure.log\r
+\r
+# udpate Makefile with the configure results\r
+sed < Makefile.in "\r
+/^CC *=/s#=.*#=$CC#\r
+/^CFLAGS *=/s#=.*#=$CFLAGS#\r
+/^SFLAGS *=/s#=.*#=$SFLAGS#\r
+/^LDFLAGS *=/s#=.*#=$LDFLAGS#\r
+/^LDSHARED *=/s#=.*#=$LDSHARED#\r
+/^CPP *=/s#=.*#=$CPP#\r
+/^STATICLIB *=/s#=.*#=$STATICLIB#\r
+/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#\r
+/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#\r
+/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#\r
+/^AR *=/s#=.*#=$AR#\r
+/^ARFLAGS *=/s#=.*#=$ARFLAGS#\r
+/^RANLIB *=/s#=.*#=$RANLIB#\r
+/^LDCONFIG *=/s#=.*#=$LDCONFIG#\r
+/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC#\r
+/^EXE *=/s#=.*#=$EXE#\r
+/^prefix *=/s#=.*#=$prefix#\r
+/^exec_prefix *=/s#=.*#=$exec_prefix#\r
+/^libdir *=/s#=.*#=$libdir#\r
+/^sharedlibdir *=/s#=.*#=$sharedlibdir#\r
+/^includedir *=/s#=.*#=$includedir#\r
+/^mandir *=/s#=.*#=$mandir#\r
+/^OBJC *=/s#=.*#= $OBJC#\r
+/^PIC_OBJC *=/s#=.*#= $PIC_OBJC#\r
+/^all: */s#:.*#: $ALL#\r
+/^test: */s#:.*#: $TEST#\r
+" > Makefile\r
+\r
+# create zlib.pc with the configure results\r
+sed < zlib.pc.in "\r
+/^CC *=/s#=.*#=$CC#\r
+/^CFLAGS *=/s#=.*#=$CFLAGS#\r
+/^CPP *=/s#=.*#=$CPP#\r
+/^LDSHARED *=/s#=.*#=$LDSHARED#\r
+/^STATICLIB *=/s#=.*#=$STATICLIB#\r
+/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#\r
+/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#\r
+/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#\r
+/^AR *=/s#=.*#=$AR#\r
+/^ARFLAGS *=/s#=.*#=$ARFLAGS#\r
+/^RANLIB *=/s#=.*#=$RANLIB#\r
+/^EXE *=/s#=.*#=$EXE#\r
+/^prefix *=/s#=.*#=$prefix#\r
+/^exec_prefix *=/s#=.*#=$exec_prefix#\r
+/^libdir *=/s#=.*#=$libdir#\r
+/^sharedlibdir *=/s#=.*#=$sharedlibdir#\r
+/^includedir *=/s#=.*#=$includedir#\r
+/^mandir *=/s#=.*#=$mandir#\r
+/^LDFLAGS *=/s#=.*#=$LDFLAGS#\r
+" | sed -e "\r
+s/\@VERSION\@/$VER/g;\r
+" > zlib.pc\r
+\r
+# done\r
+leave 0\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.c
new file mode 100644 (file)
index 0000000..95a30f1
--- /dev/null
@@ -0,0 +1,425 @@
+/* crc32.c -- compute the CRC-32 of a data stream\r
+ * Copyright (C) 1995-2006, 2010, 2011, 2012 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ *\r
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster\r
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing\r
+ * tables for updating the shift register in one step with three exclusive-ors\r
+ * instead of four steps with four exclusive-ors.  This results in about a\r
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+/*\r
+  Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore\r
+  protection on the static variables used to control the first-use generation\r
+  of the crc tables.  Therefore, if you #define DYNAMIC_CRC_TABLE, you should\r
+  first call get_crc_table() to initialize the tables before allowing more than\r
+  one thread to use crc32().\r
+\r
+  DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.\r
+ */\r
+\r
+#ifdef MAKECRCH\r
+#  include <stdio.h>\r
+#  ifndef DYNAMIC_CRC_TABLE\r
+#    define DYNAMIC_CRC_TABLE\r
+#  endif /* !DYNAMIC_CRC_TABLE */\r
+#endif /* MAKECRCH */\r
+\r
+#include "zutil.h"      /* for STDC and FAR definitions */\r
+\r
+#define local static\r
+\r
+/* Definitions for doing the crc four data bytes at a time. */\r
+#if !defined(NOBYFOUR) && defined(Z_U4)\r
+#  define BYFOUR\r
+#endif\r
+#ifdef BYFOUR\r
+   local unsigned long crc32_little OF((unsigned long,\r
+                        const unsigned char FAR *, unsigned));\r
+   local unsigned long crc32_big OF((unsigned long,\r
+                        const unsigned char FAR *, unsigned));\r
+#  define TBLS 8\r
+#else\r
+#  define TBLS 1\r
+#endif /* BYFOUR */\r
+\r
+/* Local functions for crc concatenation */\r
+local unsigned long gf2_matrix_times OF((unsigned long *mat,\r
+                                         unsigned long vec));\r
+local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));\r
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));\r
+\r
+\r
+#ifdef DYNAMIC_CRC_TABLE\r
+\r
+local volatile int crc_table_empty = 1;\r
+local z_crc_t FAR crc_table[TBLS][256];\r
+local void make_crc_table OF((void));\r
+#ifdef MAKECRCH\r
+   local void write_table OF((FILE *, const z_crc_t FAR *));\r
+#endif /* MAKECRCH */\r
+/*\r
+  Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:\r
+  x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.\r
+\r
+  Polynomials over GF(2) are represented in binary, one bit per coefficient,\r
+  with the lowest powers in the most significant bit.  Then adding polynomials\r
+  is just exclusive-or, and multiplying a polynomial by x is a right shift by\r
+  one.  If we call the above polynomial p, and represent a byte as the\r
+  polynomial q, also with the lowest power in the most significant bit (so the\r
+  byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,\r
+  where a mod b means the remainder after dividing a by b.\r
+\r
+  This calculation is done using the shift-register method of multiplying and\r
+  taking the remainder.  The register is initialized to zero, and for each\r
+  incoming bit, x^32 is added mod p to the register if the bit is a one (where\r
+  x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by\r
+  x (which is shifting right by one and adding x^32 mod p if the bit shifted\r
+  out is a one).  We start with the highest power (least significant bit) of\r
+  q and repeat for all eight bits of q.\r
+\r
+  The first table is simply the CRC of all possible eight bit values.  This is\r
+  all the information needed to generate CRCs on data a byte at a time for all\r
+  combinations of CRC register values and incoming bytes.  The remaining tables\r
+  allow for word-at-a-time CRC calculation for both big-endian and little-\r
+  endian machines, where a word is four bytes.\r
+*/\r
+local void make_crc_table()\r
+{\r
+    z_crc_t c;\r
+    int n, k;\r
+    z_crc_t poly;                       /* polynomial exclusive-or pattern */\r
+    /* terms of polynomial defining this crc (except x^32): */\r
+    static volatile int first = 1;      /* flag to limit concurrent making */\r
+    static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};\r
+\r
+    /* See if another task is already doing this (not thread-safe, but better\r
+       than nothing -- significantly reduces duration of vulnerability in\r
+       case the advice about DYNAMIC_CRC_TABLE is ignored) */\r
+    if (first) {\r
+        first = 0;\r
+\r
+        /* make exclusive-or pattern from polynomial (0xedb88320UL) */\r
+        poly = 0;\r
+        for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)\r
+            poly |= (z_crc_t)1 << (31 - p[n]);\r
+\r
+        /* generate a crc for every 8-bit value */\r
+        for (n = 0; n < 256; n++) {\r
+            c = (z_crc_t)n;\r
+            for (k = 0; k < 8; k++)\r
+                c = c & 1 ? poly ^ (c >> 1) : c >> 1;\r
+            crc_table[0][n] = c;\r
+        }\r
+\r
+#ifdef BYFOUR\r
+        /* generate crc for each value followed by one, two, and three zeros,\r
+           and then the byte reversal of those as well as the first table */\r
+        for (n = 0; n < 256; n++) {\r
+            c = crc_table[0][n];\r
+            crc_table[4][n] = ZSWAP32(c);\r
+            for (k = 1; k < 4; k++) {\r
+                c = crc_table[0][c & 0xff] ^ (c >> 8);\r
+                crc_table[k][n] = c;\r
+                crc_table[k + 4][n] = ZSWAP32(c);\r
+            }\r
+        }\r
+#endif /* BYFOUR */\r
+\r
+        crc_table_empty = 0;\r
+    }\r
+    else {      /* not first */\r
+        /* wait for the other guy to finish (not efficient, but rare) */\r
+        while (crc_table_empty)\r
+            ;\r
+    }\r
+\r
+#ifdef MAKECRCH\r
+    /* write out CRC tables to crc32.h */\r
+    {\r
+        FILE *out;\r
+\r
+        out = fopen("crc32.h", "w");\r
+        if (out == NULL) return;\r
+        fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");\r
+        fprintf(out, " * Generated automatically by crc32.c\n */\n\n");\r
+        fprintf(out, "local const z_crc_t FAR ");\r
+        fprintf(out, "crc_table[TBLS][256] =\n{\n  {\n");\r
+        write_table(out, crc_table[0]);\r
+#  ifdef BYFOUR\r
+        fprintf(out, "#ifdef BYFOUR\n");\r
+        for (k = 1; k < 8; k++) {\r
+            fprintf(out, "  },\n  {\n");\r
+            write_table(out, crc_table[k]);\r
+        }\r
+        fprintf(out, "#endif\n");\r
+#  endif /* BYFOUR */\r
+        fprintf(out, "  }\n};\n");\r
+        fclose(out);\r
+    }\r
+#endif /* MAKECRCH */\r
+}\r
+\r
+#ifdef MAKECRCH\r
+local void write_table(out, table)\r
+    FILE *out;\r
+    const z_crc_t FAR *table;\r
+{\r
+    int n;\r
+\r
+    for (n = 0; n < 256; n++)\r
+        fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : "    ",\r
+                (unsigned long)(table[n]),\r
+                n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));\r
+}\r
+#endif /* MAKECRCH */\r
+\r
+#else /* !DYNAMIC_CRC_TABLE */\r
+/* ========================================================================\r
+ * Tables of CRC-32s of all single-byte values, made by make_crc_table().\r
+ */\r
+#include "crc32.h"\r
+#endif /* DYNAMIC_CRC_TABLE */\r
+\r
+/* =========================================================================\r
+ * This function can be used by asm versions of crc32()\r
+ */\r
+const z_crc_t FAR * ZEXPORT get_crc_table()\r
+{\r
+#ifdef DYNAMIC_CRC_TABLE\r
+    if (crc_table_empty)\r
+        make_crc_table();\r
+#endif /* DYNAMIC_CRC_TABLE */\r
+    return (const z_crc_t FAR *)crc_table;\r
+}\r
+\r
+/* ========================================================================= */\r
+#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)\r
+#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1\r
+\r
+/* ========================================================================= */\r
+unsigned long ZEXPORT crc32(crc, buf, len)\r
+    unsigned long crc;\r
+    const unsigned char FAR *buf;\r
+    uInt len;\r
+{\r
+    if (buf == Z_NULL) return 0UL;\r
+\r
+#ifdef DYNAMIC_CRC_TABLE\r
+    if (crc_table_empty)\r
+        make_crc_table();\r
+#endif /* DYNAMIC_CRC_TABLE */\r
+\r
+#ifdef BYFOUR\r
+    if (sizeof(void *) == sizeof(ptrdiff_t)) {\r
+        z_crc_t endian;\r
+\r
+        endian = 1;\r
+        if (*((unsigned char *)(&endian)))\r
+            return crc32_little(crc, buf, len);\r
+        else\r
+            return crc32_big(crc, buf, len);\r
+    }\r
+#endif /* BYFOUR */\r
+    crc = crc ^ 0xffffffffUL;\r
+    while (len >= 8) {\r
+        DO8;\r
+        len -= 8;\r
+    }\r
+    if (len) do {\r
+        DO1;\r
+    } while (--len);\r
+    return crc ^ 0xffffffffUL;\r
+}\r
+\r
+#ifdef BYFOUR\r
+\r
+/* ========================================================================= */\r
+#define DOLIT4 c ^= *buf4++; \\r
+        c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \\r
+            crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]\r
+#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4\r
+\r
+/* ========================================================================= */\r
+local unsigned long crc32_little(crc, buf, len)\r
+    unsigned long crc;\r
+    const unsigned char FAR *buf;\r
+    unsigned len;\r
+{\r
+    register z_crc_t c;\r
+    register const z_crc_t FAR *buf4;\r
+\r
+    c = (z_crc_t)crc;\r
+    c = ~c;\r
+    while (len && ((ptrdiff_t)buf & 3)) {\r
+        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\r
+        len--;\r
+    }\r
+\r
+    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;\r
+    while (len >= 32) {\r
+        DOLIT32;\r
+        len -= 32;\r
+    }\r
+    while (len >= 4) {\r
+        DOLIT4;\r
+        len -= 4;\r
+    }\r
+    buf = (const unsigned char FAR *)buf4;\r
+\r
+    if (len) do {\r
+        c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);\r
+    } while (--len);\r
+    c = ~c;\r
+    return (unsigned long)c;\r
+}\r
+\r
+/* ========================================================================= */\r
+#define DOBIG4 c ^= *++buf4; \\r
+        c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \\r
+            crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]\r
+#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4\r
+\r
+/* ========================================================================= */\r
+local unsigned long crc32_big(crc, buf, len)\r
+    unsigned long crc;\r
+    const unsigned char FAR *buf;\r
+    unsigned len;\r
+{\r
+    register z_crc_t c;\r
+    register const z_crc_t FAR *buf4;\r
+\r
+    c = ZSWAP32((z_crc_t)crc);\r
+    c = ~c;\r
+    while (len && ((ptrdiff_t)buf & 3)) {\r
+        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\r
+        len--;\r
+    }\r
+\r
+    buf4 = (const z_crc_t FAR *)(const void FAR *)buf;\r
+    buf4--;\r
+    while (len >= 32) {\r
+        DOBIG32;\r
+        len -= 32;\r
+    }\r
+    while (len >= 4) {\r
+        DOBIG4;\r
+        len -= 4;\r
+    }\r
+    buf4++;\r
+    buf = (const unsigned char FAR *)buf4;\r
+\r
+    if (len) do {\r
+        c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);\r
+    } while (--len);\r
+    c = ~c;\r
+    return (unsigned long)(ZSWAP32(c));\r
+}\r
+\r
+#endif /* BYFOUR */\r
+\r
+#define GF2_DIM 32      /* dimension of GF(2) vectors (length of CRC) */\r
+\r
+/* ========================================================================= */\r
+local unsigned long gf2_matrix_times(mat, vec)\r
+    unsigned long *mat;\r
+    unsigned long vec;\r
+{\r
+    unsigned long sum;\r
+\r
+    sum = 0;\r
+    while (vec) {\r
+        if (vec & 1)\r
+            sum ^= *mat;\r
+        vec >>= 1;\r
+        mat++;\r
+    }\r
+    return sum;\r
+}\r
+\r
+/* ========================================================================= */\r
+local void gf2_matrix_square(square, mat)\r
+    unsigned long *square;\r
+    unsigned long *mat;\r
+{\r
+    int n;\r
+\r
+    for (n = 0; n < GF2_DIM; n++)\r
+        square[n] = gf2_matrix_times(mat, mat[n]);\r
+}\r
+\r
+/* ========================================================================= */\r
+local uLong crc32_combine_(crc1, crc2, len2)\r
+    uLong crc1;\r
+    uLong crc2;\r
+    z_off64_t len2;\r
+{\r
+    int n;\r
+    unsigned long row;\r
+    unsigned long even[GF2_DIM];    /* even-power-of-two zeros operator */\r
+    unsigned long odd[GF2_DIM];     /* odd-power-of-two zeros operator */\r
+\r
+    /* degenerate case (also disallow negative lengths) */\r
+    if (len2 <= 0)\r
+        return crc1;\r
+\r
+    /* put operator for one zero bit in odd */\r
+    odd[0] = 0xedb88320UL;          /* CRC-32 polynomial */\r
+    row = 1;\r
+    for (n = 1; n < GF2_DIM; n++) {\r
+        odd[n] = row;\r
+        row <<= 1;\r
+    }\r
+\r
+    /* put operator for two zero bits in even */\r
+    gf2_matrix_square(even, odd);\r
+\r
+    /* put operator for four zero bits in odd */\r
+    gf2_matrix_square(odd, even);\r
+\r
+    /* apply len2 zeros to crc1 (first square will put the operator for one\r
+       zero byte, eight zero bits, in even) */\r
+    do {\r
+        /* apply zeros operator for this bit of len2 */\r
+        gf2_matrix_square(even, odd);\r
+        if (len2 & 1)\r
+            crc1 = gf2_matrix_times(even, crc1);\r
+        len2 >>= 1;\r
+\r
+        /* if no more bits set, then done */\r
+        if (len2 == 0)\r
+            break;\r
+\r
+        /* another iteration of the loop with odd and even swapped */\r
+        gf2_matrix_square(odd, even);\r
+        if (len2 & 1)\r
+            crc1 = gf2_matrix_times(odd, crc1);\r
+        len2 >>= 1;\r
+\r
+        /* if no more bits set, then done */\r
+    } while (len2 != 0);\r
+\r
+    /* return combined crc */\r
+    crc1 ^= crc2;\r
+    return crc1;\r
+}\r
+\r
+/* ========================================================================= */\r
+uLong ZEXPORT crc32_combine(crc1, crc2, len2)\r
+    uLong crc1;\r
+    uLong crc2;\r
+    z_off_t len2;\r
+{\r
+    return crc32_combine_(crc1, crc2, len2);\r
+}\r
+\r
+uLong ZEXPORT crc32_combine64(crc1, crc2, len2)\r
+    uLong crc1;\r
+    uLong crc2;\r
+    z_off64_t len2;\r
+{\r
+    return crc32_combine_(crc1, crc2, len2);\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/crc32.h
new file mode 100644 (file)
index 0000000..b7e25cf
--- /dev/null
@@ -0,0 +1,441 @@
+/* crc32.h -- tables for rapid CRC calculation\r
+ * Generated automatically by crc32.c\r
+ */\r
+\r
+local const z_crc_t FAR crc_table[TBLS][256] =\r
+{\r
+  {\r
+    0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,\r
+    0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,\r
+    0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,\r
+    0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,\r
+    0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,\r
+    0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,\r
+    0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,\r
+    0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,\r
+    0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,\r
+    0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,\r
+    0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,\r
+    0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,\r
+    0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,\r
+    0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,\r
+    0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,\r
+    0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,\r
+    0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,\r
+    0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,\r
+    0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,\r
+    0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,\r
+    0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,\r
+    0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,\r
+    0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,\r
+    0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,\r
+    0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,\r
+    0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,\r
+    0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,\r
+    0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,\r
+    0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,\r
+    0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,\r
+    0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,\r
+    0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,\r
+    0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,\r
+    0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,\r
+    0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,\r
+    0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,\r
+    0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,\r
+    0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,\r
+    0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,\r
+    0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,\r
+    0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,\r
+    0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,\r
+    0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,\r
+    0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,\r
+    0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,\r
+    0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,\r
+    0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,\r
+    0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,\r
+    0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,\r
+    0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,\r
+    0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,\r
+    0x2d02ef8dUL\r
+#ifdef BYFOUR\r
+  },\r
+  {\r
+    0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,\r
+    0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,\r
+    0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,\r
+    0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,\r
+    0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,\r
+    0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,\r
+    0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,\r
+    0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,\r
+    0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,\r
+    0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,\r
+    0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,\r
+    0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,\r
+    0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,\r
+    0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,\r
+    0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,\r
+    0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,\r
+    0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,\r
+    0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,\r
+    0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,\r
+    0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,\r
+    0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,\r
+    0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,\r
+    0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,\r
+    0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,\r
+    0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,\r
+    0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,\r
+    0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,\r
+    0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,\r
+    0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,\r
+    0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,\r
+    0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,\r
+    0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,\r
+    0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,\r
+    0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,\r
+    0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,\r
+    0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,\r
+    0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,\r
+    0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,\r
+    0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,\r
+    0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,\r
+    0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,\r
+    0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,\r
+    0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,\r
+    0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,\r
+    0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,\r
+    0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,\r
+    0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,\r
+    0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,\r
+    0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,\r
+    0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,\r
+    0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,\r
+    0x9324fd72UL\r
+  },\r
+  {\r
+    0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,\r
+    0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,\r
+    0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,\r
+    0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,\r
+    0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,\r
+    0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,\r
+    0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,\r
+    0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,\r
+    0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,\r
+    0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,\r
+    0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,\r
+    0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,\r
+    0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,\r
+    0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,\r
+    0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,\r
+    0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,\r
+    0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,\r
+    0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,\r
+    0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,\r
+    0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,\r
+    0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,\r
+    0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,\r
+    0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,\r
+    0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,\r
+    0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,\r
+    0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,\r
+    0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,\r
+    0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,\r
+    0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,\r
+    0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,\r
+    0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,\r
+    0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,\r
+    0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,\r
+    0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,\r
+    0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,\r
+    0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,\r
+    0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,\r
+    0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,\r
+    0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,\r
+    0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,\r
+    0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,\r
+    0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,\r
+    0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,\r
+    0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,\r
+    0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,\r
+    0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,\r
+    0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,\r
+    0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,\r
+    0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,\r
+    0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,\r
+    0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,\r
+    0xbe9834edUL\r
+  },\r
+  {\r
+    0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,\r
+    0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,\r
+    0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,\r
+    0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,\r
+    0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,\r
+    0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,\r
+    0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,\r
+    0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,\r
+    0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,\r
+    0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,\r
+    0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,\r
+    0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,\r
+    0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,\r
+    0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,\r
+    0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,\r
+    0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,\r
+    0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,\r
+    0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,\r
+    0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,\r
+    0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,\r
+    0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,\r
+    0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,\r
+    0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,\r
+    0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,\r
+    0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,\r
+    0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,\r
+    0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,\r
+    0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,\r
+    0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,\r
+    0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,\r
+    0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,\r
+    0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,\r
+    0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,\r
+    0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,\r
+    0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,\r
+    0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,\r
+    0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,\r
+    0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,\r
+    0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,\r
+    0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,\r
+    0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,\r
+    0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,\r
+    0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,\r
+    0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,\r
+    0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,\r
+    0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,\r
+    0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,\r
+    0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,\r
+    0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,\r
+    0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,\r
+    0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,\r
+    0xde0506f1UL\r
+  },\r
+  {\r
+    0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,\r
+    0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,\r
+    0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,\r
+    0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,\r
+    0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,\r
+    0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,\r
+    0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,\r
+    0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,\r
+    0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,\r
+    0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,\r
+    0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,\r
+    0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,\r
+    0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,\r
+    0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,\r
+    0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,\r
+    0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,\r
+    0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,\r
+    0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,\r
+    0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,\r
+    0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,\r
+    0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,\r
+    0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,\r
+    0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,\r
+    0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,\r
+    0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,\r
+    0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,\r
+    0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,\r
+    0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,\r
+    0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,\r
+    0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,\r
+    0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,\r
+    0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,\r
+    0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,\r
+    0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,\r
+    0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,\r
+    0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,\r
+    0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,\r
+    0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,\r
+    0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,\r
+    0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,\r
+    0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,\r
+    0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,\r
+    0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,\r
+    0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,\r
+    0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,\r
+    0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,\r
+    0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,\r
+    0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,\r
+    0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,\r
+    0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,\r
+    0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,\r
+    0x8def022dUL\r
+  },\r
+  {\r
+    0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,\r
+    0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,\r
+    0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,\r
+    0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,\r
+    0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,\r
+    0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,\r
+    0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,\r
+    0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,\r
+    0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,\r
+    0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,\r
+    0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,\r
+    0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,\r
+    0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,\r
+    0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,\r
+    0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,\r
+    0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,\r
+    0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,\r
+    0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,\r
+    0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,\r
+    0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,\r
+    0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,\r
+    0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,\r
+    0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,\r
+    0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,\r
+    0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,\r
+    0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,\r
+    0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,\r
+    0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,\r
+    0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,\r
+    0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,\r
+    0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,\r
+    0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,\r
+    0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,\r
+    0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,\r
+    0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,\r
+    0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,\r
+    0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,\r
+    0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,\r
+    0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,\r
+    0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,\r
+    0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,\r
+    0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,\r
+    0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,\r
+    0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,\r
+    0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,\r
+    0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,\r
+    0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,\r
+    0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,\r
+    0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,\r
+    0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,\r
+    0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,\r
+    0x72fd2493UL\r
+  },\r
+  {\r
+    0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,\r
+    0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,\r
+    0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,\r
+    0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,\r
+    0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,\r
+    0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,\r
+    0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,\r
+    0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,\r
+    0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,\r
+    0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,\r
+    0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,\r
+    0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,\r
+    0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,\r
+    0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,\r
+    0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,\r
+    0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,\r
+    0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,\r
+    0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,\r
+    0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,\r
+    0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,\r
+    0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,\r
+    0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,\r
+    0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,\r
+    0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,\r
+    0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,\r
+    0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,\r
+    0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,\r
+    0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,\r
+    0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,\r
+    0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,\r
+    0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,\r
+    0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,\r
+    0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,\r
+    0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,\r
+    0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,\r
+    0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,\r
+    0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,\r
+    0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,\r
+    0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,\r
+    0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,\r
+    0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,\r
+    0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,\r
+    0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,\r
+    0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,\r
+    0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,\r
+    0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,\r
+    0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,\r
+    0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,\r
+    0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,\r
+    0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,\r
+    0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,\r
+    0xed3498beUL\r
+  },\r
+  {\r
+    0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,\r
+    0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,\r
+    0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,\r
+    0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,\r
+    0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,\r
+    0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,\r
+    0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,\r
+    0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,\r
+    0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,\r
+    0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,\r
+    0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,\r
+    0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,\r
+    0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,\r
+    0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,\r
+    0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,\r
+    0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,\r
+    0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,\r
+    0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,\r
+    0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,\r
+    0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,\r
+    0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,\r
+    0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,\r
+    0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,\r
+    0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,\r
+    0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,\r
+    0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,\r
+    0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,\r
+    0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,\r
+    0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,\r
+    0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,\r
+    0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,\r
+    0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,\r
+    0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,\r
+    0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,\r
+    0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,\r
+    0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,\r
+    0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,\r
+    0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,\r
+    0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,\r
+    0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,\r
+    0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,\r
+    0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,\r
+    0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,\r
+    0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,\r
+    0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,\r
+    0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,\r
+    0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,\r
+    0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,\r
+    0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,\r
+    0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,\r
+    0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,\r
+    0xf10605deUL\r
+#endif\r
+  }\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.c
new file mode 100644 (file)
index 0000000..89b47f1
--- /dev/null
@@ -0,0 +1,1967 @@
+/* deflate.c -- compress data using the deflation algorithm\r
+ * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/*\r
+ *  ALGORITHM\r
+ *\r
+ *      The "deflation" process depends on being able to identify portions\r
+ *      of the input text which are identical to earlier input (within a\r
+ *      sliding window trailing behind the input currently being processed).\r
+ *\r
+ *      The most straightforward technique turns out to be the fastest for\r
+ *      most input files: try all possible matches and select the longest.\r
+ *      The key feature of this algorithm is that insertions into the string\r
+ *      dictionary are very simple and thus fast, and deletions are avoided\r
+ *      completely. Insertions are performed at each input character, whereas\r
+ *      string matches are performed only when the previous match ends. So it\r
+ *      is preferable to spend more time in matches to allow very fast string\r
+ *      insertions and avoid deletions. The matching algorithm for small\r
+ *      strings is inspired from that of Rabin & Karp. A brute force approach\r
+ *      is used to find longer strings when a small match has been found.\r
+ *      A similar algorithm is used in comic (by Jan-Mark Wams) and freeze\r
+ *      (by Leonid Broukhis).\r
+ *         A previous version of this file used a more sophisticated algorithm\r
+ *      (by Fiala and Greene) which is guaranteed to run in linear amortized\r
+ *      time, but has a larger average cost, uses more memory and is patented.\r
+ *      However the F&G algorithm may be faster for some highly redundant\r
+ *      files if the parameter max_chain_length (described below) is too large.\r
+ *\r
+ *  ACKNOWLEDGEMENTS\r
+ *\r
+ *      The idea of lazy evaluation of matches is due to Jan-Mark Wams, and\r
+ *      I found it in 'freeze' written by Leonid Broukhis.\r
+ *      Thanks to many people for bug reports and testing.\r
+ *\r
+ *  REFERENCES\r
+ *\r
+ *      Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".\r
+ *      Available in http://tools.ietf.org/html/rfc1951\r
+ *\r
+ *      A description of the Rabin and Karp algorithm is given in the book\r
+ *         "Algorithms" by R. Sedgewick, Addison-Wesley, p252.\r
+ *\r
+ *      Fiala,E.R., and Greene,D.H.\r
+ *         Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595\r
+ *\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#include "deflate.h"\r
+\r
+const char deflate_copyright[] =\r
+   " deflate 1.2.8 Copyright 1995-2013 Jean-loup Gailly and Mark Adler ";\r
+/*\r
+  If you use the zlib library in a product, an acknowledgment is welcome\r
+  in the documentation of your product. If for some reason you cannot\r
+  include such an acknowledgment, I would appreciate that you keep this\r
+  copyright string in the executable of your product.\r
+ */\r
+\r
+/* ===========================================================================\r
+ *  Function prototypes.\r
+ */\r
+typedef enum {\r
+    need_more,      /* block not completed, need more input or more output */\r
+    block_done,     /* block flush performed */\r
+    finish_started, /* finish started, need only more output at next deflate */\r
+    finish_done     /* finish done, accept no more input or output */\r
+} block_state;\r
+\r
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));\r
+/* Compression function. Returns the block state after the call. */\r
+\r
+local void fill_window    OF((deflate_state *s));\r
+local block_state deflate_stored OF((deflate_state *s, int flush));\r
+local block_state deflate_fast   OF((deflate_state *s, int flush));\r
+#ifndef FASTEST\r
+local block_state deflate_slow   OF((deflate_state *s, int flush));\r
+#endif\r
+local block_state deflate_rle    OF((deflate_state *s, int flush));\r
+local block_state deflate_huff   OF((deflate_state *s, int flush));\r
+local void lm_init        OF((deflate_state *s));\r
+local void putShortMSB    OF((deflate_state *s, uInt b));\r
+local void flush_pending  OF((z_streamp strm));\r
+local int read_buf        OF((z_streamp strm, Bytef *buf, unsigned size));\r
+#ifdef ASMV\r
+      void match_init OF((void)); /* asm code initialization */\r
+      uInt longest_match  OF((deflate_state *s, IPos cur_match));\r
+#else\r
+local uInt longest_match  OF((deflate_state *s, IPos cur_match));\r
+#endif\r
+\r
+#ifdef DEBUG\r
+local  void check_match OF((deflate_state *s, IPos start, IPos match,\r
+                            int length));\r
+#endif\r
+\r
+/* ===========================================================================\r
+ * Local data\r
+ */\r
+\r
+#define NIL 0\r
+/* Tail of hash chains */\r
+\r
+#ifndef TOO_FAR\r
+#  define TOO_FAR 4096\r
+#endif\r
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */\r
+\r
+/* Values for max_lazy_match, good_match and max_chain_length, depending on\r
+ * the desired pack level (0..9). The values given below have been tuned to\r
+ * exclude worst case performance for pathological files. Better values may be\r
+ * found for specific files.\r
+ */\r
+typedef struct config_s {\r
+   ush good_length; /* reduce lazy search above this match length */\r
+   ush max_lazy;    /* do not perform lazy search above this match length */\r
+   ush nice_length; /* quit search above this match length */\r
+   ush max_chain;\r
+   compress_func func;\r
+} config;\r
+\r
+#ifdef FASTEST\r
+local const config configuration_table[2] = {\r
+/*      good lazy nice chain */\r
+/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\r
+/* 1 */ {4,    4,  8,    4, deflate_fast}}; /* max speed, no lazy matches */\r
+#else\r
+local const config configuration_table[10] = {\r
+/*      good lazy nice chain */\r
+/* 0 */ {0,    0,  0,    0, deflate_stored},  /* store only */\r
+/* 1 */ {4,    4,  8,    4, deflate_fast}, /* max speed, no lazy matches */\r
+/* 2 */ {4,    5, 16,    8, deflate_fast},\r
+/* 3 */ {4,    6, 32,   32, deflate_fast},\r
+\r
+/* 4 */ {4,    4, 16,   16, deflate_slow},  /* lazy matches */\r
+/* 5 */ {8,   16, 32,   32, deflate_slow},\r
+/* 6 */ {8,   16, 128, 128, deflate_slow},\r
+/* 7 */ {8,   32, 128, 256, deflate_slow},\r
+/* 8 */ {32, 128, 258, 1024, deflate_slow},\r
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */\r
+#endif\r
+\r
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4\r
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different\r
+ * meaning.\r
+ */\r
+\r
+#define EQUAL 0\r
+/* result of memcmp for equal strings */\r
+\r
+#ifndef NO_DUMMY_DECL\r
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */\r
+#endif\r
+\r
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */\r
+#define RANK(f) (((f) << 1) - ((f) > 4 ? 9 : 0))\r
+\r
+/* ===========================================================================\r
+ * Update a hash value with the given input byte\r
+ * IN  assertion: all calls to to UPDATE_HASH are made with consecutive\r
+ *    input characters, so that a running hash key can be computed from the\r
+ *    previous key instead of complete recalculation each time.\r
+ */\r
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)\r
+\r
+\r
+/* ===========================================================================\r
+ * Insert string str in the dictionary and set match_head to the previous head\r
+ * of the hash chain (the most recent string with same hash key). Return\r
+ * the previous length of the hash chain.\r
+ * If this file is compiled with -DFASTEST, the compression level is forced\r
+ * to 1, and no hash chains are maintained.\r
+ * IN  assertion: all calls to to INSERT_STRING are made with consecutive\r
+ *    input characters and the first MIN_MATCH bytes of str are valid\r
+ *    (except for the last MIN_MATCH-1 bytes of the input file).\r
+ */\r
+#ifdef FASTEST\r
+#define INSERT_STRING(s, str, match_head) \\r
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\r
+    match_head = s->head[s->ins_h], \\r
+    s->head[s->ins_h] = (Pos)(str))\r
+#else\r
+#define INSERT_STRING(s, str, match_head) \\r
+   (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \\r
+    match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \\r
+    s->head[s->ins_h] = (Pos)(str))\r
+#endif\r
+\r
+/* ===========================================================================\r
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).\r
+ * prev[] will be initialized on the fly.\r
+ */\r
+#define CLEAR_HASH(s) \\r
+    s->head[s->hash_size-1] = NIL; \\r
+    zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateInit_(strm, level, version, stream_size)\r
+    z_streamp strm;\r
+    int level;\r
+    const char *version;\r
+    int stream_size;\r
+{\r
+    return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,\r
+                         Z_DEFAULT_STRATEGY, version, stream_size);\r
+    /* To do: ignore strm->next_in if we use it as window */\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,\r
+                  version, stream_size)\r
+    z_streamp strm;\r
+    int  level;\r
+    int  method;\r
+    int  windowBits;\r
+    int  memLevel;\r
+    int  strategy;\r
+    const char *version;\r
+    int stream_size;\r
+{\r
+    deflate_state *s;\r
+    int wrap = 1;\r
+    static const char my_version[] = ZLIB_VERSION;\r
+\r
+    ushf *overlay;\r
+    /* We overlay pending_buf and d_buf+l_buf. This works since the average\r
+     * output size for (length,distance) codes is <= 24 bits.\r
+     */\r
+\r
+    if (version == Z_NULL || version[0] != my_version[0] ||\r
+        stream_size != sizeof(z_stream)) {\r
+        return Z_VERSION_ERROR;\r
+    }\r
+    if (strm == Z_NULL) return Z_STREAM_ERROR;\r
+\r
+    strm->msg = Z_NULL;\r
+    if (strm->zalloc == (alloc_func)0) {\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+        strm->zalloc = zcalloc;\r
+        strm->opaque = (voidpf)0;\r
+#endif\r
+    }\r
+    if (strm->zfree == (free_func)0)\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+        strm->zfree = zcfree;\r
+#endif\r
+\r
+#ifdef FASTEST\r
+    if (level != 0) level = 1;\r
+#else\r
+    if (level == Z_DEFAULT_COMPRESSION) level = 6;\r
+#endif\r
+\r
+    if (windowBits < 0) { /* suppress zlib wrapper */\r
+        wrap = 0;\r
+        windowBits = -windowBits;\r
+    }\r
+#ifdef GZIP\r
+    else if (windowBits > 15) {\r
+        wrap = 2;       /* write gzip wrapper instead */\r
+        windowBits -= 16;\r
+    }\r
+#endif\r
+    if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||\r
+        windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||\r
+        strategy < 0 || strategy > Z_FIXED) {\r
+        return Z_STREAM_ERROR;\r
+    }\r
+    if (windowBits == 8) windowBits = 9;  /* until 256-byte window bug fixed */\r
+    s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));\r
+    if (s == Z_NULL) return Z_MEM_ERROR;\r
+    strm->state = (struct internal_state FAR *)s;\r
+    s->strm = strm;\r
+\r
+    s->wrap = wrap;\r
+    s->gzhead = Z_NULL;\r
+    s->w_bits = windowBits;\r
+    s->w_size = 1 << s->w_bits;\r
+    s->w_mask = s->w_size - 1;\r
+\r
+    s->hash_bits = memLevel + 7;\r
+    s->hash_size = 1 << s->hash_bits;\r
+    s->hash_mask = s->hash_size - 1;\r
+    s->hash_shift =  ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);\r
+\r
+    s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));\r
+    s->prev   = (Posf *)  ZALLOC(strm, s->w_size, sizeof(Pos));\r
+    s->head   = (Posf *)  ZALLOC(strm, s->hash_size, sizeof(Pos));\r
+\r
+    s->high_water = 0;      /* nothing written to s->window yet */\r
+\r
+    s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */\r
+\r
+    overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);\r
+    s->pending_buf = (uchf *) overlay;\r
+    s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);\r
+\r
+    if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||\r
+        s->pending_buf == Z_NULL) {\r
+        s->status = FINISH_STATE;\r
+        strm->msg = ERR_MSG(Z_MEM_ERROR);\r
+        deflateEnd (strm);\r
+        return Z_MEM_ERROR;\r
+    }\r
+    s->d_buf = overlay + s->lit_bufsize/sizeof(ush);\r
+    s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;\r
+\r
+    s->level = level;\r
+    s->strategy = strategy;\r
+    s->method = (Byte)method;\r
+\r
+    return deflateReset(strm);\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)\r
+    z_streamp strm;\r
+    const Bytef *dictionary;\r
+    uInt  dictLength;\r
+{\r
+    deflate_state *s;\r
+    uInt str, n;\r
+    int wrap;\r
+    unsigned avail;\r
+    z_const unsigned char *next;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL)\r
+        return Z_STREAM_ERROR;\r
+    s = strm->state;\r
+    wrap = s->wrap;\r
+    if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* when using zlib wrappers, compute Adler-32 for provided dictionary */\r
+    if (wrap == 1)\r
+        strm->adler = adler32(strm->adler, dictionary, dictLength);\r
+    s->wrap = 0;                    /* avoid computing Adler-32 in read_buf */\r
+\r
+    /* if dictionary would fill window, just replace the history */\r
+    if (dictLength >= s->w_size) {\r
+        if (wrap == 0) {            /* already empty otherwise */\r
+            CLEAR_HASH(s);\r
+            s->strstart = 0;\r
+            s->block_start = 0L;\r
+            s->insert = 0;\r
+        }\r
+        dictionary += dictLength - s->w_size;  /* use the tail */\r
+        dictLength = s->w_size;\r
+    }\r
+\r
+    /* insert dictionary into window and hash */\r
+    avail = strm->avail_in;\r
+    next = strm->next_in;\r
+    strm->avail_in = dictLength;\r
+    strm->next_in = (z_const Bytef *)dictionary;\r
+    fill_window(s);\r
+    while (s->lookahead >= MIN_MATCH) {\r
+        str = s->strstart;\r
+        n = s->lookahead - (MIN_MATCH-1);\r
+        do {\r
+            UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);\r
+#ifndef FASTEST\r
+            s->prev[str & s->w_mask] = s->head[s->ins_h];\r
+#endif\r
+            s->head[s->ins_h] = (Pos)str;\r
+            str++;\r
+        } while (--n);\r
+        s->strstart = str;\r
+        s->lookahead = MIN_MATCH-1;\r
+        fill_window(s);\r
+    }\r
+    s->strstart += s->lookahead;\r
+    s->block_start = (long)s->strstart;\r
+    s->insert = s->lookahead;\r
+    s->lookahead = 0;\r
+    s->match_length = s->prev_length = MIN_MATCH-1;\r
+    s->match_available = 0;\r
+    strm->next_in = next;\r
+    strm->avail_in = avail;\r
+    s->wrap = wrap;\r
+    return Z_OK;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateResetKeep (strm)\r
+    z_streamp strm;\r
+{\r
+    deflate_state *s;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL ||\r
+        strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {\r
+        return Z_STREAM_ERROR;\r
+    }\r
+\r
+    strm->total_in = strm->total_out = 0;\r
+    strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */\r
+    strm->data_type = Z_UNKNOWN;\r
+\r
+    s = (deflate_state *)strm->state;\r
+    s->pending = 0;\r
+    s->pending_out = s->pending_buf;\r
+\r
+    if (s->wrap < 0) {\r
+        s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */\r
+    }\r
+    s->status = s->wrap ? INIT_STATE : BUSY_STATE;\r
+    strm->adler =\r
+#ifdef GZIP\r
+        s->wrap == 2 ? crc32(0L, Z_NULL, 0) :\r
+#endif\r
+        adler32(0L, Z_NULL, 0);\r
+    s->last_flush = Z_NO_FLUSH;\r
+\r
+    _tr_init(s);\r
+\r
+    return Z_OK;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateReset (strm)\r
+    z_streamp strm;\r
+{\r
+    int ret;\r
+\r
+    ret = deflateResetKeep(strm);\r
+    if (ret == Z_OK)\r
+        lm_init(strm->state);\r
+    return ret;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateSetHeader (strm, head)\r
+    z_streamp strm;\r
+    gz_headerp head;\r
+{\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    if (strm->state->wrap != 2) return Z_STREAM_ERROR;\r
+    strm->state->gzhead = head;\r
+    return Z_OK;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflatePending (strm, pending, bits)\r
+    unsigned *pending;\r
+    int *bits;\r
+    z_streamp strm;\r
+{\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    if (pending != Z_NULL)\r
+        *pending = strm->state->pending;\r
+    if (bits != Z_NULL)\r
+        *bits = strm->state->bi_valid;\r
+    return Z_OK;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflatePrime (strm, bits, value)\r
+    z_streamp strm;\r
+    int bits;\r
+    int value;\r
+{\r
+    deflate_state *s;\r
+    int put;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    s = strm->state;\r
+    if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))\r
+        return Z_BUF_ERROR;\r
+    do {\r
+        put = Buf_size - s->bi_valid;\r
+        if (put > bits)\r
+            put = bits;\r
+        s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);\r
+        s->bi_valid += put;\r
+        _tr_flush_bits(s);\r
+        value >>= put;\r
+        bits -= put;\r
+    } while (bits);\r
+    return Z_OK;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateParams(strm, level, strategy)\r
+    z_streamp strm;\r
+    int level;\r
+    int strategy;\r
+{\r
+    deflate_state *s;\r
+    compress_func func;\r
+    int err = Z_OK;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    s = strm->state;\r
+\r
+#ifdef FASTEST\r
+    if (level != 0) level = 1;\r
+#else\r
+    if (level == Z_DEFAULT_COMPRESSION) level = 6;\r
+#endif\r
+    if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {\r
+        return Z_STREAM_ERROR;\r
+    }\r
+    func = configuration_table[s->level].func;\r
+\r
+    if ((strategy != s->strategy || func != configuration_table[level].func) &&\r
+        strm->total_in != 0) {\r
+        /* Flush the last buffer: */\r
+        err = deflate(strm, Z_BLOCK);\r
+        if (err == Z_BUF_ERROR && s->pending == 0)\r
+            err = Z_OK;\r
+    }\r
+    if (s->level != level) {\r
+        s->level = level;\r
+        s->max_lazy_match   = configuration_table[level].max_lazy;\r
+        s->good_match       = configuration_table[level].good_length;\r
+        s->nice_match       = configuration_table[level].nice_length;\r
+        s->max_chain_length = configuration_table[level].max_chain;\r
+    }\r
+    s->strategy = strategy;\r
+    return err;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)\r
+    z_streamp strm;\r
+    int good_length;\r
+    int max_lazy;\r
+    int nice_length;\r
+    int max_chain;\r
+{\r
+    deflate_state *s;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    s = strm->state;\r
+    s->good_match = good_length;\r
+    s->max_lazy_match = max_lazy;\r
+    s->nice_match = nice_length;\r
+    s->max_chain_length = max_chain;\r
+    return Z_OK;\r
+}\r
+\r
+/* =========================================================================\r
+ * For the default windowBits of 15 and memLevel of 8, this function returns\r
+ * a close to exact, as well as small, upper bound on the compressed size.\r
+ * They are coded as constants here for a reason--if the #define's are\r
+ * changed, then this function needs to be changed as well.  The return\r
+ * value for 15 and 8 only works for those exact settings.\r
+ *\r
+ * For any setting other than those defaults for windowBits and memLevel,\r
+ * the value returned is a conservative worst case for the maximum expansion\r
+ * resulting from using fixed blocks instead of stored blocks, which deflate\r
+ * can emit on compressed data for some combinations of the parameters.\r
+ *\r
+ * This function could be more sophisticated to provide closer upper bounds for\r
+ * every combination of windowBits and memLevel.  But even the conservative\r
+ * upper bound of about 14% expansion does not seem onerous for output buffer\r
+ * allocation.\r
+ */\r
+uLong ZEXPORT deflateBound(strm, sourceLen)\r
+    z_streamp strm;\r
+    uLong sourceLen;\r
+{\r
+    deflate_state *s;\r
+    uLong complen, wraplen;\r
+    Bytef *str;\r
+\r
+    /* conservative upper bound for compressed data */\r
+    complen = sourceLen +\r
+              ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;\r
+\r
+    /* if can't get parameters, return conservative bound plus zlib wrapper */\r
+    if (strm == Z_NULL || strm->state == Z_NULL)\r
+        return complen + 6;\r
+\r
+    /* compute wrapper length */\r
+    s = strm->state;\r
+    switch (s->wrap) {\r
+    case 0:                                 /* raw deflate */\r
+        wraplen = 0;\r
+        break;\r
+    case 1:                                 /* zlib wrapper */\r
+        wraplen = 6 + (s->strstart ? 4 : 0);\r
+        break;\r
+    case 2:                                 /* gzip wrapper */\r
+        wraplen = 18;\r
+        if (s->gzhead != Z_NULL) {          /* user-supplied gzip header */\r
+            if (s->gzhead->extra != Z_NULL)\r
+                wraplen += 2 + s->gzhead->extra_len;\r
+            str = s->gzhead->name;\r
+            if (str != Z_NULL)\r
+                do {\r
+                    wraplen++;\r
+                } while (*str++);\r
+            str = s->gzhead->comment;\r
+            if (str != Z_NULL)\r
+                do {\r
+                    wraplen++;\r
+                } while (*str++);\r
+            if (s->gzhead->hcrc)\r
+                wraplen += 2;\r
+        }\r
+        break;\r
+    default:                                /* for compiler happiness */\r
+        wraplen = 6;\r
+    }\r
+\r
+    /* if not default parameters, return conservative bound */\r
+    if (s->w_bits != 15 || s->hash_bits != 8 + 7)\r
+        return complen + wraplen;\r
+\r
+    /* default settings: return tight bound for that case */\r
+    return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +\r
+           (sourceLen >> 25) + 13 - 6 + wraplen;\r
+}\r
+\r
+/* =========================================================================\r
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.\r
+ * IN assertion: the stream state is correct and there is enough room in\r
+ * pending_buf.\r
+ */\r
+local void putShortMSB (s, b)\r
+    deflate_state *s;\r
+    uInt b;\r
+{\r
+    put_byte(s, (Byte)(b >> 8));\r
+    put_byte(s, (Byte)(b & 0xff));\r
+}\r
+\r
+/* =========================================================================\r
+ * Flush as much pending output as possible. All deflate() output goes\r
+ * through this function so some applications may wish to modify it\r
+ * to avoid allocating a large strm->next_out buffer and copying into it.\r
+ * (See also read_buf()).\r
+ */\r
+local void flush_pending(strm)\r
+    z_streamp strm;\r
+{\r
+    unsigned len;\r
+    deflate_state *s = strm->state;\r
+\r
+    _tr_flush_bits(s);\r
+    len = s->pending;\r
+    if (len > strm->avail_out) len = strm->avail_out;\r
+    if (len == 0) return;\r
+\r
+    zmemcpy(strm->next_out, s->pending_out, len);\r
+    strm->next_out  += len;\r
+    s->pending_out  += len;\r
+    strm->total_out += len;\r
+    strm->avail_out  -= len;\r
+    s->pending -= len;\r
+    if (s->pending == 0) {\r
+        s->pending_out = s->pending_buf;\r
+    }\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflate (strm, flush)\r
+    z_streamp strm;\r
+    int flush;\r
+{\r
+    int old_flush; /* value of flush param for previous deflate call */\r
+    deflate_state *s;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL ||\r
+        flush > Z_BLOCK || flush < 0) {\r
+        return Z_STREAM_ERROR;\r
+    }\r
+    s = strm->state;\r
+\r
+    if (strm->next_out == Z_NULL ||\r
+        (strm->next_in == Z_NULL && strm->avail_in != 0) ||\r
+        (s->status == FINISH_STATE && flush != Z_FINISH)) {\r
+        ERR_RETURN(strm, Z_STREAM_ERROR);\r
+    }\r
+    if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);\r
+\r
+    s->strm = strm; /* just in case */\r
+    old_flush = s->last_flush;\r
+    s->last_flush = flush;\r
+\r
+    /* Write the header */\r
+    if (s->status == INIT_STATE) {\r
+#ifdef GZIP\r
+        if (s->wrap == 2) {\r
+            strm->adler = crc32(0L, Z_NULL, 0);\r
+            put_byte(s, 31);\r
+            put_byte(s, 139);\r
+            put_byte(s, 8);\r
+            if (s->gzhead == Z_NULL) {\r
+                put_byte(s, 0);\r
+                put_byte(s, 0);\r
+                put_byte(s, 0);\r
+                put_byte(s, 0);\r
+                put_byte(s, 0);\r
+                put_byte(s, s->level == 9 ? 2 :\r
+                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\r
+                             4 : 0));\r
+                put_byte(s, OS_CODE);\r
+                s->status = BUSY_STATE;\r
+            }\r
+            else {\r
+                put_byte(s, (s->gzhead->text ? 1 : 0) +\r
+                            (s->gzhead->hcrc ? 2 : 0) +\r
+                            (s->gzhead->extra == Z_NULL ? 0 : 4) +\r
+                            (s->gzhead->name == Z_NULL ? 0 : 8) +\r
+                            (s->gzhead->comment == Z_NULL ? 0 : 16)\r
+                        );\r
+                put_byte(s, (Byte)(s->gzhead->time & 0xff));\r
+                put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));\r
+                put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));\r
+                put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));\r
+                put_byte(s, s->level == 9 ? 2 :\r
+                            (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?\r
+                             4 : 0));\r
+                put_byte(s, s->gzhead->os & 0xff);\r
+                if (s->gzhead->extra != Z_NULL) {\r
+                    put_byte(s, s->gzhead->extra_len & 0xff);\r
+                    put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);\r
+                }\r
+                if (s->gzhead->hcrc)\r
+                    strm->adler = crc32(strm->adler, s->pending_buf,\r
+                                        s->pending);\r
+                s->gzindex = 0;\r
+                s->status = EXTRA_STATE;\r
+            }\r
+        }\r
+        else\r
+#endif\r
+        {\r
+            uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;\r
+            uInt level_flags;\r
+\r
+            if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)\r
+                level_flags = 0;\r
+            else if (s->level < 6)\r
+                level_flags = 1;\r
+            else if (s->level == 6)\r
+                level_flags = 2;\r
+            else\r
+                level_flags = 3;\r
+            header |= (level_flags << 6);\r
+            if (s->strstart != 0) header |= PRESET_DICT;\r
+            header += 31 - (header % 31);\r
+\r
+            s->status = BUSY_STATE;\r
+            putShortMSB(s, header);\r
+\r
+            /* Save the adler32 of the preset dictionary: */\r
+            if (s->strstart != 0) {\r
+                putShortMSB(s, (uInt)(strm->adler >> 16));\r
+                putShortMSB(s, (uInt)(strm->adler & 0xffff));\r
+            }\r
+            strm->adler = adler32(0L, Z_NULL, 0);\r
+        }\r
+    }\r
+#ifdef GZIP\r
+    if (s->status == EXTRA_STATE) {\r
+        if (s->gzhead->extra != Z_NULL) {\r
+            uInt beg = s->pending;  /* start of bytes to update crc */\r
+\r
+            while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {\r
+                if (s->pending == s->pending_buf_size) {\r
+                    if (s->gzhead->hcrc && s->pending > beg)\r
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                            s->pending - beg);\r
+                    flush_pending(strm);\r
+                    beg = s->pending;\r
+                    if (s->pending == s->pending_buf_size)\r
+                        break;\r
+                }\r
+                put_byte(s, s->gzhead->extra[s->gzindex]);\r
+                s->gzindex++;\r
+            }\r
+            if (s->gzhead->hcrc && s->pending > beg)\r
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                    s->pending - beg);\r
+            if (s->gzindex == s->gzhead->extra_len) {\r
+                s->gzindex = 0;\r
+                s->status = NAME_STATE;\r
+            }\r
+        }\r
+        else\r
+            s->status = NAME_STATE;\r
+    }\r
+    if (s->status == NAME_STATE) {\r
+        if (s->gzhead->name != Z_NULL) {\r
+            uInt beg = s->pending;  /* start of bytes to update crc */\r
+            int val;\r
+\r
+            do {\r
+                if (s->pending == s->pending_buf_size) {\r
+                    if (s->gzhead->hcrc && s->pending > beg)\r
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                            s->pending - beg);\r
+                    flush_pending(strm);\r
+                    beg = s->pending;\r
+                    if (s->pending == s->pending_buf_size) {\r
+                        val = 1;\r
+                        break;\r
+                    }\r
+                }\r
+                val = s->gzhead->name[s->gzindex++];\r
+                put_byte(s, val);\r
+            } while (val != 0);\r
+            if (s->gzhead->hcrc && s->pending > beg)\r
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                    s->pending - beg);\r
+            if (val == 0) {\r
+                s->gzindex = 0;\r
+                s->status = COMMENT_STATE;\r
+            }\r
+        }\r
+        else\r
+            s->status = COMMENT_STATE;\r
+    }\r
+    if (s->status == COMMENT_STATE) {\r
+        if (s->gzhead->comment != Z_NULL) {\r
+            uInt beg = s->pending;  /* start of bytes to update crc */\r
+            int val;\r
+\r
+            do {\r
+                if (s->pending == s->pending_buf_size) {\r
+                    if (s->gzhead->hcrc && s->pending > beg)\r
+                        strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                            s->pending - beg);\r
+                    flush_pending(strm);\r
+                    beg = s->pending;\r
+                    if (s->pending == s->pending_buf_size) {\r
+                        val = 1;\r
+                        break;\r
+                    }\r
+                }\r
+                val = s->gzhead->comment[s->gzindex++];\r
+                put_byte(s, val);\r
+            } while (val != 0);\r
+            if (s->gzhead->hcrc && s->pending > beg)\r
+                strm->adler = crc32(strm->adler, s->pending_buf + beg,\r
+                                    s->pending - beg);\r
+            if (val == 0)\r
+                s->status = HCRC_STATE;\r
+        }\r
+        else\r
+            s->status = HCRC_STATE;\r
+    }\r
+    if (s->status == HCRC_STATE) {\r
+        if (s->gzhead->hcrc) {\r
+            if (s->pending + 2 > s->pending_buf_size)\r
+                flush_pending(strm);\r
+            if (s->pending + 2 <= s->pending_buf_size) {\r
+                put_byte(s, (Byte)(strm->adler & 0xff));\r
+                put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\r
+                strm->adler = crc32(0L, Z_NULL, 0);\r
+                s->status = BUSY_STATE;\r
+            }\r
+        }\r
+        else\r
+            s->status = BUSY_STATE;\r
+    }\r
+#endif\r
+\r
+    /* Flush as much pending output as possible */\r
+    if (s->pending != 0) {\r
+        flush_pending(strm);\r
+        if (strm->avail_out == 0) {\r
+            /* Since avail_out is 0, deflate will be called again with\r
+             * more output space, but possibly with both pending and\r
+             * avail_in equal to zero. There won't be anything to do,\r
+             * but this is not an error situation so make sure we\r
+             * return OK instead of BUF_ERROR at next call of deflate:\r
+             */\r
+            s->last_flush = -1;\r
+            return Z_OK;\r
+        }\r
+\r
+    /* Make sure there is something to do and avoid duplicate consecutive\r
+     * flushes. For repeated and useless calls with Z_FINISH, we keep\r
+     * returning Z_STREAM_END instead of Z_BUF_ERROR.\r
+     */\r
+    } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&\r
+               flush != Z_FINISH) {\r
+        ERR_RETURN(strm, Z_BUF_ERROR);\r
+    }\r
+\r
+    /* User must not provide more input after the first FINISH: */\r
+    if (s->status == FINISH_STATE && strm->avail_in != 0) {\r
+        ERR_RETURN(strm, Z_BUF_ERROR);\r
+    }\r
+\r
+    /* Start a new block or continue the current one.\r
+     */\r
+    if (strm->avail_in != 0 || s->lookahead != 0 ||\r
+        (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {\r
+        block_state bstate;\r
+\r
+        bstate = s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :\r
+                    (s->strategy == Z_RLE ? deflate_rle(s, flush) :\r
+                        (*(configuration_table[s->level].func))(s, flush));\r
+\r
+        if (bstate == finish_started || bstate == finish_done) {\r
+            s->status = FINISH_STATE;\r
+        }\r
+        if (bstate == need_more || bstate == finish_started) {\r
+            if (strm->avail_out == 0) {\r
+                s->last_flush = -1; /* avoid BUF_ERROR next call, see above */\r
+            }\r
+            return Z_OK;\r
+            /* If flush != Z_NO_FLUSH && avail_out == 0, the next call\r
+             * of deflate should use the same flush parameter to make sure\r
+             * that the flush is complete. So we don't have to output an\r
+             * empty block here, this will be done at next call. This also\r
+             * ensures that for a very small output buffer, we emit at most\r
+             * one empty block.\r
+             */\r
+        }\r
+        if (bstate == block_done) {\r
+            if (flush == Z_PARTIAL_FLUSH) {\r
+                _tr_align(s);\r
+            } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */\r
+                _tr_stored_block(s, (char*)0, 0L, 0);\r
+                /* For a full flush, this empty block will be recognized\r
+                 * as a special marker by inflate_sync().\r
+                 */\r
+                if (flush == Z_FULL_FLUSH) {\r
+                    CLEAR_HASH(s);             /* forget history */\r
+                    if (s->lookahead == 0) {\r
+                        s->strstart = 0;\r
+                        s->block_start = 0L;\r
+                        s->insert = 0;\r
+                    }\r
+                }\r
+            }\r
+            flush_pending(strm);\r
+            if (strm->avail_out == 0) {\r
+              s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */\r
+              return Z_OK;\r
+            }\r
+        }\r
+    }\r
+    Assert(strm->avail_out > 0, "bug2");\r
+\r
+    if (flush != Z_FINISH) return Z_OK;\r
+    if (s->wrap <= 0) return Z_STREAM_END;\r
+\r
+    /* Write the trailer */\r
+#ifdef GZIP\r
+    if (s->wrap == 2) {\r
+        put_byte(s, (Byte)(strm->adler & 0xff));\r
+        put_byte(s, (Byte)((strm->adler >> 8) & 0xff));\r
+        put_byte(s, (Byte)((strm->adler >> 16) & 0xff));\r
+        put_byte(s, (Byte)((strm->adler >> 24) & 0xff));\r
+        put_byte(s, (Byte)(strm->total_in & 0xff));\r
+        put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));\r
+        put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));\r
+        put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));\r
+    }\r
+    else\r
+#endif\r
+    {\r
+        putShortMSB(s, (uInt)(strm->adler >> 16));\r
+        putShortMSB(s, (uInt)(strm->adler & 0xffff));\r
+    }\r
+    flush_pending(strm);\r
+    /* If avail_out is zero, the application will call deflate again\r
+     * to flush the rest.\r
+     */\r
+    if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */\r
+    return s->pending != 0 ? Z_OK : Z_STREAM_END;\r
+}\r
+\r
+/* ========================================================================= */\r
+int ZEXPORT deflateEnd (strm)\r
+    z_streamp strm;\r
+{\r
+    int status;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+\r
+    status = strm->state->status;\r
+    if (status != INIT_STATE &&\r
+        status != EXTRA_STATE &&\r
+        status != NAME_STATE &&\r
+        status != COMMENT_STATE &&\r
+        status != HCRC_STATE &&\r
+        status != BUSY_STATE &&\r
+        status != FINISH_STATE) {\r
+      return Z_STREAM_ERROR;\r
+    }\r
+\r
+    /* Deallocate in reverse order of allocations: */\r
+    TRY_FREE(strm, strm->state->pending_buf);\r
+    TRY_FREE(strm, strm->state->head);\r
+    TRY_FREE(strm, strm->state->prev);\r
+    TRY_FREE(strm, strm->state->window);\r
+\r
+    ZFREE(strm, strm->state);\r
+    strm->state = Z_NULL;\r
+\r
+    return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;\r
+}\r
+\r
+/* =========================================================================\r
+ * Copy the source state to the destination state.\r
+ * To simplify the source, this is not supported for 16-bit MSDOS (which\r
+ * doesn't have enough memory anyway to duplicate compression states).\r
+ */\r
+int ZEXPORT deflateCopy (dest, source)\r
+    z_streamp dest;\r
+    z_streamp source;\r
+{\r
+#ifdef MAXSEG_64K\r
+    return Z_STREAM_ERROR;\r
+#else\r
+    deflate_state *ds;\r
+    deflate_state *ss;\r
+    ushf *overlay;\r
+\r
+\r
+    if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {\r
+        return Z_STREAM_ERROR;\r
+    }\r
+\r
+    ss = source->state;\r
+\r
+    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));\r
+\r
+    ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));\r
+    if (ds == Z_NULL) return Z_MEM_ERROR;\r
+    dest->state = (struct internal_state FAR *) ds;\r
+    zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));\r
+    ds->strm = dest;\r
+\r
+    ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));\r
+    ds->prev   = (Posf *)  ZALLOC(dest, ds->w_size, sizeof(Pos));\r
+    ds->head   = (Posf *)  ZALLOC(dest, ds->hash_size, sizeof(Pos));\r
+    overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);\r
+    ds->pending_buf = (uchf *) overlay;\r
+\r
+    if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||\r
+        ds->pending_buf == Z_NULL) {\r
+        deflateEnd (dest);\r
+        return Z_MEM_ERROR;\r
+    }\r
+    /* following zmemcpy do not work for 16-bit MSDOS */\r
+    zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));\r
+    zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));\r
+    zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));\r
+    zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);\r
+\r
+    ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);\r
+    ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);\r
+    ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;\r
+\r
+    ds->l_desc.dyn_tree = ds->dyn_ltree;\r
+    ds->d_desc.dyn_tree = ds->dyn_dtree;\r
+    ds->bl_desc.dyn_tree = ds->bl_tree;\r
+\r
+    return Z_OK;\r
+#endif /* MAXSEG_64K */\r
+}\r
+\r
+/* ===========================================================================\r
+ * Read a new buffer from the current input stream, update the adler32\r
+ * and total number of bytes read.  All deflate() input goes through\r
+ * this function so some applications may wish to modify it to avoid\r
+ * allocating a large strm->next_in buffer and copying from it.\r
+ * (See also flush_pending()).\r
+ */\r
+local int read_buf(strm, buf, size)\r
+    z_streamp strm;\r
+    Bytef *buf;\r
+    unsigned size;\r
+{\r
+    unsigned len = strm->avail_in;\r
+\r
+    if (len > size) len = size;\r
+    if (len == 0) return 0;\r
+\r
+    strm->avail_in  -= len;\r
+\r
+    zmemcpy(buf, strm->next_in, len);\r
+    if (strm->state->wrap == 1) {\r
+        strm->adler = adler32(strm->adler, buf, len);\r
+    }\r
+#ifdef GZIP\r
+    else if (strm->state->wrap == 2) {\r
+        strm->adler = crc32(strm->adler, buf, len);\r
+    }\r
+#endif\r
+    strm->next_in  += len;\r
+    strm->total_in += len;\r
+\r
+    return (int)len;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Initialize the "longest match" routines for a new zlib stream\r
+ */\r
+local void lm_init (s)\r
+    deflate_state *s;\r
+{\r
+    s->window_size = (ulg)2L*s->w_size;\r
+\r
+    CLEAR_HASH(s);\r
+\r
+    /* Set the default configuration parameters:\r
+     */\r
+    s->max_lazy_match   = configuration_table[s->level].max_lazy;\r
+    s->good_match       = configuration_table[s->level].good_length;\r
+    s->nice_match       = configuration_table[s->level].nice_length;\r
+    s->max_chain_length = configuration_table[s->level].max_chain;\r
+\r
+    s->strstart = 0;\r
+    s->block_start = 0L;\r
+    s->lookahead = 0;\r
+    s->insert = 0;\r
+    s->match_length = s->prev_length = MIN_MATCH-1;\r
+    s->match_available = 0;\r
+    s->ins_h = 0;\r
+#ifndef FASTEST\r
+#ifdef ASMV\r
+    match_init(); /* initialize the asm code */\r
+#endif\r
+#endif\r
+}\r
+\r
+#ifndef FASTEST\r
+/* ===========================================================================\r
+ * Set match_start to the longest match starting at the given string and\r
+ * return its length. Matches shorter or equal to prev_length are discarded,\r
+ * in which case the result is equal to prev_length and match_start is\r
+ * garbage.\r
+ * IN assertions: cur_match is the head of the hash chain for the current\r
+ *   string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1\r
+ * OUT assertion: the match length is not greater than s->lookahead.\r
+ */\r
+#ifndef ASMV\r
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or\r
+ * match.S. The code will be functionally equivalent.\r
+ */\r
+local uInt longest_match(s, cur_match)\r
+    deflate_state *s;\r
+    IPos cur_match;                             /* current match */\r
+{\r
+    unsigned chain_length = s->max_chain_length;/* max hash chain length */\r
+    register Bytef *scan = s->window + s->strstart; /* current string */\r
+    register Bytef *match;                       /* matched string */\r
+    register int len;                           /* length of current match */\r
+    int best_len = s->prev_length;              /* best match length so far */\r
+    int nice_match = s->nice_match;             /* stop if match long enough */\r
+    IPos limit = s->strstart > (IPos)MAX_DIST(s) ?\r
+        s->strstart - (IPos)MAX_DIST(s) : NIL;\r
+    /* Stop when cur_match becomes <= limit. To simplify the code,\r
+     * we prevent matches with the string of window index 0.\r
+     */\r
+    Posf *prev = s->prev;\r
+    uInt wmask = s->w_mask;\r
+\r
+#ifdef UNALIGNED_OK\r
+    /* Compare two bytes at a time. Note: this is not always beneficial.\r
+     * Try with and without -DUNALIGNED_OK to check.\r
+     */\r
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;\r
+    register ush scan_start = *(ushf*)scan;\r
+    register ush scan_end   = *(ushf*)(scan+best_len-1);\r
+#else\r
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\r
+    register Byte scan_end1  = scan[best_len-1];\r
+    register Byte scan_end   = scan[best_len];\r
+#endif\r
+\r
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\r
+     * It is easy to get rid of this optimization if necessary.\r
+     */\r
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");\r
+\r
+    /* Do not waste too much time if we already have a good match: */\r
+    if (s->prev_length >= s->good_match) {\r
+        chain_length >>= 2;\r
+    }\r
+    /* Do not look for matches beyond the end of the input. This is necessary\r
+     * to make deflate deterministic.\r
+     */\r
+    if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;\r
+\r
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");\r
+\r
+    do {\r
+        Assert(cur_match < s->strstart, "no future");\r
+        match = s->window + cur_match;\r
+\r
+        /* Skip to next match if the match length cannot increase\r
+         * or if the match length is less than 2.  Note that the checks below\r
+         * for insufficient lookahead only occur occasionally for performance\r
+         * reasons.  Therefore uninitialized memory will be accessed, and\r
+         * conditional jumps will be made that depend on those values.\r
+         * However the length of the match is limited to the lookahead, so\r
+         * the output of deflate is not affected by the uninitialized values.\r
+         */\r
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)\r
+        /* This code assumes sizeof(unsigned short) == 2. Do not use\r
+         * UNALIGNED_OK if your compiler uses a different size.\r
+         */\r
+        if (*(ushf*)(match+best_len-1) != scan_end ||\r
+            *(ushf*)match != scan_start) continue;\r
+\r
+        /* It is not necessary to compare scan[2] and match[2] since they are\r
+         * always equal when the other bytes match, given that the hash keys\r
+         * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at\r
+         * strstart+3, +5, ... up to strstart+257. We check for insufficient\r
+         * lookahead only every 4th comparison; the 128th check will be made\r
+         * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is\r
+         * necessary to put more guard bytes at the end of the window, or\r
+         * to check more often for insufficient lookahead.\r
+         */\r
+        Assert(scan[2] == match[2], "scan[2]?");\r
+        scan++, match++;\r
+        do {\r
+        } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\r
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\r
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\r
+                 *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&\r
+                 scan < strend);\r
+        /* The funny "do {}" generates better code on most compilers */\r
+\r
+        /* Here, scan <= window+strstart+257 */\r
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");\r
+        if (*scan == *match) scan++;\r
+\r
+        len = (MAX_MATCH - 1) - (int)(strend-scan);\r
+        scan = strend - (MAX_MATCH-1);\r
+\r
+#else /* UNALIGNED_OK */\r
+\r
+        if (match[best_len]   != scan_end  ||\r
+            match[best_len-1] != scan_end1 ||\r
+            *match            != *scan     ||\r
+            *++match          != scan[1])      continue;\r
+\r
+        /* The check at best_len-1 can be removed because it will be made\r
+         * again later. (This heuristic is not always a win.)\r
+         * It is not necessary to compare scan[2] and match[2] since they\r
+         * are always equal when the other bytes match, given that\r
+         * the hash keys are equal and that HASH_BITS >= 8.\r
+         */\r
+        scan += 2, match++;\r
+        Assert(*scan == *match, "match[2]?");\r
+\r
+        /* We check for insufficient lookahead only every 8th comparison;\r
+         * the 256th check will be made at strstart+258.\r
+         */\r
+        do {\r
+        } while (*++scan == *++match && *++scan == *++match &&\r
+                 *++scan == *++match && *++scan == *++match &&\r
+                 *++scan == *++match && *++scan == *++match &&\r
+                 *++scan == *++match && *++scan == *++match &&\r
+                 scan < strend);\r
+\r
+        Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");\r
+\r
+        len = MAX_MATCH - (int)(strend - scan);\r
+        scan = strend - MAX_MATCH;\r
+\r
+#endif /* UNALIGNED_OK */\r
+\r
+        if (len > best_len) {\r
+            s->match_start = cur_match;\r
+            best_len = len;\r
+            if (len >= nice_match) break;\r
+#ifdef UNALIGNED_OK\r
+            scan_end = *(ushf*)(scan+best_len-1);\r
+#else\r
+            scan_end1  = scan[best_len-1];\r
+            scan_end   = scan[best_len];\r
+#endif\r
+        }\r
+    } while ((cur_match = prev[cur_match & wmask]) > limit\r
+             && --chain_length != 0);\r
+\r
+    if ((uInt)best_len <= s->lookahead) return (uInt)best_len;\r
+    return s->lookahead;\r
+}\r
+#endif /* ASMV */\r
+\r
+#else /* FASTEST */\r
+\r
+/* ---------------------------------------------------------------------------\r
+ * Optimized version for FASTEST only\r
+ */\r
+local uInt longest_match(s, cur_match)\r
+    deflate_state *s;\r
+    IPos cur_match;                             /* current match */\r
+{\r
+    register Bytef *scan = s->window + s->strstart; /* current string */\r
+    register Bytef *match;                       /* matched string */\r
+    register int len;                           /* length of current match */\r
+    register Bytef *strend = s->window + s->strstart + MAX_MATCH;\r
+\r
+    /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.\r
+     * It is easy to get rid of this optimization if necessary.\r
+     */\r
+    Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");\r
+\r
+    Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");\r
+\r
+    Assert(cur_match < s->strstart, "no future");\r
+\r
+    match = s->window + cur_match;\r
+\r
+    /* Return failure if the match length is less than 2:\r
+     */\r
+    if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;\r
+\r
+    /* The check at best_len-1 can be removed because it will be made\r
+     * again later. (This heuristic is not always a win.)\r
+     * It is not necessary to compare scan[2] and match[2] since they\r
+     * are always equal when the other bytes match, given that\r
+     * the hash keys are equal and that HASH_BITS >= 8.\r
+     */\r
+    scan += 2, match += 2;\r
+    Assert(*scan == *match, "match[2]?");\r
+\r
+    /* We check for insufficient lookahead only every 8th comparison;\r
+     * the 256th check will be made at strstart+258.\r
+     */\r
+    do {\r
+    } while (*++scan == *++match && *++scan == *++match &&\r
+             *++scan == *++match && *++scan == *++match &&\r
+             *++scan == *++match && *++scan == *++match &&\r
+             *++scan == *++match && *++scan == *++match &&\r
+             scan < strend);\r
+\r
+    Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");\r
+\r
+    len = MAX_MATCH - (int)(strend - scan);\r
+\r
+    if (len < MIN_MATCH) return MIN_MATCH - 1;\r
+\r
+    s->match_start = cur_match;\r
+    return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;\r
+}\r
+\r
+#endif /* FASTEST */\r
+\r
+#ifdef DEBUG\r
+/* ===========================================================================\r
+ * Check that the match at match_start is indeed a match.\r
+ */\r
+local void check_match(s, start, match, length)\r
+    deflate_state *s;\r
+    IPos start, match;\r
+    int length;\r
+{\r
+    /* check that the match is indeed a match */\r
+    if (zmemcmp(s->window + match,\r
+                s->window + start, length) != EQUAL) {\r
+        fprintf(stderr, " start %u, match %u, length %d\n",\r
+                start, match, length);\r
+        do {\r
+            fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);\r
+        } while (--length != 0);\r
+        z_error("invalid match");\r
+    }\r
+    if (z_verbose > 1) {\r
+        fprintf(stderr,"\\[%d,%d]", start-match, length);\r
+        do { putc(s->window[start++], stderr); } while (--length != 0);\r
+    }\r
+}\r
+#else\r
+#  define check_match(s, start, match, length)\r
+#endif /* DEBUG */\r
+\r
+/* ===========================================================================\r
+ * Fill the window when the lookahead becomes insufficient.\r
+ * Updates strstart and lookahead.\r
+ *\r
+ * IN assertion: lookahead < MIN_LOOKAHEAD\r
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD\r
+ *    At least one byte has been read, or avail_in == 0; reads are\r
+ *    performed for at least two bytes (required for the zip translate_eol\r
+ *    option -- not supported here).\r
+ */\r
+local void fill_window(s)\r
+    deflate_state *s;\r
+{\r
+    register unsigned n, m;\r
+    register Posf *p;\r
+    unsigned more;    /* Amount of free space at the end of the window. */\r
+    uInt wsize = s->w_size;\r
+\r
+    Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");\r
+\r
+    do {\r
+        more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);\r
+\r
+        /* Deal with !@#$% 64K limit: */\r
+        if (sizeof(int) <= 2) {\r
+            if (more == 0 && s->strstart == 0 && s->lookahead == 0) {\r
+                more = wsize;\r
+\r
+            } else if (more == (unsigned)(-1)) {\r
+                /* Very unlikely, but possible on 16 bit machine if\r
+                 * strstart == 0 && lookahead == 1 (input done a byte at time)\r
+                 */\r
+                more--;\r
+            }\r
+        }\r
+\r
+        /* If the window is almost full and there is insufficient lookahead,\r
+         * move the upper half to the lower one to make room in the upper half.\r
+         */\r
+        if (s->strstart >= wsize+MAX_DIST(s)) {\r
+\r
+            zmemcpy(s->window, s->window+wsize, (unsigned)wsize);\r
+            s->match_start -= wsize;\r
+            s->strstart    -= wsize; /* we now have strstart >= MAX_DIST */\r
+            s->block_start -= (long) wsize;\r
+\r
+            /* Slide the hash table (could be avoided with 32 bit values\r
+               at the expense of memory usage). We slide even when level == 0\r
+               to keep the hash table consistent if we switch back to level > 0\r
+               later. (Using level 0 permanently is not an optimal usage of\r
+               zlib, so we don't care about this pathological case.)\r
+             */\r
+            n = s->hash_size;\r
+            p = &s->head[n];\r
+            do {\r
+                m = *--p;\r
+                *p = (Pos)(m >= wsize ? m-wsize : NIL);\r
+            } while (--n);\r
+\r
+            n = wsize;\r
+#ifndef FASTEST\r
+            p = &s->prev[n];\r
+            do {\r
+                m = *--p;\r
+                *p = (Pos)(m >= wsize ? m-wsize : NIL);\r
+                /* If n is not on any hash chain, prev[n] is garbage but\r
+                 * its value will never be used.\r
+                 */\r
+            } while (--n);\r
+#endif\r
+            more += wsize;\r
+        }\r
+        if (s->strm->avail_in == 0) break;\r
+\r
+        /* If there was no sliding:\r
+         *    strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&\r
+         *    more == window_size - lookahead - strstart\r
+         * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)\r
+         * => more >= window_size - 2*WSIZE + 2\r
+         * In the BIG_MEM or MMAP case (not yet supported),\r
+         *   window_size == input_size + MIN_LOOKAHEAD  &&\r
+         *   strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.\r
+         * Otherwise, window_size == 2*WSIZE so more >= 2.\r
+         * If there was sliding, more >= WSIZE. So in all cases, more >= 2.\r
+         */\r
+        Assert(more >= 2, "more < 2");\r
+\r
+        n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);\r
+        s->lookahead += n;\r
+\r
+        /* Initialize the hash value now that we have some input: */\r
+        if (s->lookahead + s->insert >= MIN_MATCH) {\r
+            uInt str = s->strstart - s->insert;\r
+            s->ins_h = s->window[str];\r
+            UPDATE_HASH(s, s->ins_h, s->window[str + 1]);\r
+#if MIN_MATCH != 3\r
+            Call UPDATE_HASH() MIN_MATCH-3 more times\r
+#endif\r
+            while (s->insert) {\r
+                UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);\r
+#ifndef FASTEST\r
+                s->prev[str & s->w_mask] = s->head[s->ins_h];\r
+#endif\r
+                s->head[s->ins_h] = (Pos)str;\r
+                str++;\r
+                s->insert--;\r
+                if (s->lookahead + s->insert < MIN_MATCH)\r
+                    break;\r
+            }\r
+        }\r
+        /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,\r
+         * but this is not important since only literal bytes will be emitted.\r
+         */\r
+\r
+    } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);\r
+\r
+    /* If the WIN_INIT bytes after the end of the current data have never been\r
+     * written, then zero those bytes in order to avoid memory check reports of\r
+     * the use of uninitialized (or uninitialised as Julian writes) bytes by\r
+     * the longest match routines.  Update the high water mark for the next\r
+     * time through here.  WIN_INIT is set to MAX_MATCH since the longest match\r
+     * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.\r
+     */\r
+    if (s->high_water < s->window_size) {\r
+        ulg curr = s->strstart + (ulg)(s->lookahead);\r
+        ulg init;\r
+\r
+        if (s->high_water < curr) {\r
+            /* Previous high water mark below current data -- zero WIN_INIT\r
+             * bytes or up to end of window, whichever is less.\r
+             */\r
+            init = s->window_size - curr;\r
+            if (init > WIN_INIT)\r
+                init = WIN_INIT;\r
+            zmemzero(s->window + curr, (unsigned)init);\r
+            s->high_water = curr + init;\r
+        }\r
+        else if (s->high_water < (ulg)curr + WIN_INIT) {\r
+            /* High water mark at or above current data, but below current data\r
+             * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up\r
+             * to end of window, whichever is less.\r
+             */\r
+            init = (ulg)curr + WIN_INIT - s->high_water;\r
+            if (init > s->window_size - s->high_water)\r
+                init = s->window_size - s->high_water;\r
+            zmemzero(s->window + s->high_water, (unsigned)init);\r
+            s->high_water += init;\r
+        }\r
+    }\r
+\r
+    Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,\r
+           "not enough room for search");\r
+}\r
+\r
+/* ===========================================================================\r
+ * Flush the current block, with given end-of-file flag.\r
+ * IN assertion: strstart is set to the end of the current match.\r
+ */\r
+#define FLUSH_BLOCK_ONLY(s, last) { \\r
+   _tr_flush_block(s, (s->block_start >= 0L ? \\r
+                   (charf *)&s->window[(unsigned)s->block_start] : \\r
+                   (charf *)Z_NULL), \\r
+                (ulg)((long)s->strstart - s->block_start), \\r
+                (last)); \\r
+   s->block_start = s->strstart; \\r
+   flush_pending(s->strm); \\r
+   Tracev((stderr,"[FLUSH]")); \\r
+}\r
+\r
+/* Same but force premature exit if necessary. */\r
+#define FLUSH_BLOCK(s, last) { \\r
+   FLUSH_BLOCK_ONLY(s, last); \\r
+   if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \\r
+}\r
+\r
+/* ===========================================================================\r
+ * Copy without compression as much as possible from the input stream, return\r
+ * the current block state.\r
+ * This function does not insert new strings in the dictionary since\r
+ * uncompressible data is probably not useful. This function is used\r
+ * only for the level=0 compression option.\r
+ * NOTE: this function should be optimized to avoid extra copying from\r
+ * window to pending_buf.\r
+ */\r
+local block_state deflate_stored(s, flush)\r
+    deflate_state *s;\r
+    int flush;\r
+{\r
+    /* Stored blocks are limited to 0xffff bytes, pending_buf is limited\r
+     * to pending_buf_size, and each stored block has a 5 byte header:\r
+     */\r
+    ulg max_block_size = 0xffff;\r
+    ulg max_start;\r
+\r
+    if (max_block_size > s->pending_buf_size - 5) {\r
+        max_block_size = s->pending_buf_size - 5;\r
+    }\r
+\r
+    /* Copy as much as possible from input to output: */\r
+    for (;;) {\r
+        /* Fill the window as much as possible: */\r
+        if (s->lookahead <= 1) {\r
+\r
+            Assert(s->strstart < s->w_size+MAX_DIST(s) ||\r
+                   s->block_start >= (long)s->w_size, "slide too late");\r
+\r
+            fill_window(s);\r
+            if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;\r
+\r
+            if (s->lookahead == 0) break; /* flush the current block */\r
+        }\r
+        Assert(s->block_start >= 0L, "block gone");\r
+\r
+        s->strstart += s->lookahead;\r
+        s->lookahead = 0;\r
+\r
+        /* Emit a stored block if pending_buf will be full: */\r
+        max_start = s->block_start + max_block_size;\r
+        if (s->strstart == 0 || (ulg)s->strstart >= max_start) {\r
+            /* strstart == 0 is possible when wraparound on 16-bit machine */\r
+            s->lookahead = (uInt)(s->strstart - max_start);\r
+            s->strstart = (uInt)max_start;\r
+            FLUSH_BLOCK(s, 0);\r
+        }\r
+        /* Flush if we may have to slide, otherwise block_start may become\r
+         * negative and the data will be gone:\r
+         */\r
+        if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {\r
+            FLUSH_BLOCK(s, 0);\r
+        }\r
+    }\r
+    s->insert = 0;\r
+    if (flush == Z_FINISH) {\r
+        FLUSH_BLOCK(s, 1);\r
+        return finish_done;\r
+    }\r
+    if ((long)s->strstart > s->block_start)\r
+        FLUSH_BLOCK(s, 0);\r
+    return block_done;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Compress as much as possible from the input stream, return the current\r
+ * block state.\r
+ * This function does not perform lazy evaluation of matches and inserts\r
+ * new strings in the dictionary only for unmatched strings or for short\r
+ * matches. It is used only for the fast compression options.\r
+ */\r
+local block_state deflate_fast(s, flush)\r
+    deflate_state *s;\r
+    int flush;\r
+{\r
+    IPos hash_head;       /* head of the hash chain */\r
+    int bflush;           /* set if current block must be flushed */\r
+\r
+    for (;;) {\r
+        /* Make sure that we always have enough lookahead, except\r
+         * at the end of the input file. We need MAX_MATCH bytes\r
+         * for the next match, plus MIN_MATCH bytes to insert the\r
+         * string following the next match.\r
+         */\r
+        if (s->lookahead < MIN_LOOKAHEAD) {\r
+            fill_window(s);\r
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\r
+                return need_more;\r
+            }\r
+            if (s->lookahead == 0) break; /* flush the current block */\r
+        }\r
+\r
+        /* Insert the string window[strstart .. strstart+2] in the\r
+         * dictionary, and set hash_head to the head of the hash chain:\r
+         */\r
+        hash_head = NIL;\r
+        if (s->lookahead >= MIN_MATCH) {\r
+            INSERT_STRING(s, s->strstart, hash_head);\r
+        }\r
+\r
+        /* Find the longest match, discarding those <= prev_length.\r
+         * At this point we have always match_length < MIN_MATCH\r
+         */\r
+        if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {\r
+            /* To simplify the code, we prevent matches with the string\r
+             * of window index 0 (in particular we have to avoid a match\r
+             * of the string with itself at the start of the input file).\r
+             */\r
+            s->match_length = longest_match (s, hash_head);\r
+            /* longest_match() sets match_start */\r
+        }\r
+        if (s->match_length >= MIN_MATCH) {\r
+            check_match(s, s->strstart, s->match_start, s->match_length);\r
+\r
+            _tr_tally_dist(s, s->strstart - s->match_start,\r
+                           s->match_length - MIN_MATCH, bflush);\r
+\r
+            s->lookahead -= s->match_length;\r
+\r
+            /* Insert new strings in the hash table only if the match length\r
+             * is not too large. This saves time but degrades compression.\r
+             */\r
+#ifndef FASTEST\r
+            if (s->match_length <= s->max_insert_length &&\r
+                s->lookahead >= MIN_MATCH) {\r
+                s->match_length--; /* string at strstart already in table */\r
+                do {\r
+                    s->strstart++;\r
+                    INSERT_STRING(s, s->strstart, hash_head);\r
+                    /* strstart never exceeds WSIZE-MAX_MATCH, so there are\r
+                     * always MIN_MATCH bytes ahead.\r
+                     */\r
+                } while (--s->match_length != 0);\r
+                s->strstart++;\r
+            } else\r
+#endif\r
+            {\r
+                s->strstart += s->match_length;\r
+                s->match_length = 0;\r
+                s->ins_h = s->window[s->strstart];\r
+                UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);\r
+#if MIN_MATCH != 3\r
+                Call UPDATE_HASH() MIN_MATCH-3 more times\r
+#endif\r
+                /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not\r
+                 * matter since it will be recomputed at next deflate call.\r
+                 */\r
+            }\r
+        } else {\r
+            /* No match, output a literal byte */\r
+            Tracevv((stderr,"%c", s->window[s->strstart]));\r
+            _tr_tally_lit (s, s->window[s->strstart], bflush);\r
+            s->lookahead--;\r
+            s->strstart++;\r
+        }\r
+        if (bflush) FLUSH_BLOCK(s, 0);\r
+    }\r
+    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;\r
+    if (flush == Z_FINISH) {\r
+        FLUSH_BLOCK(s, 1);\r
+        return finish_done;\r
+    }\r
+    if (s->last_lit)\r
+        FLUSH_BLOCK(s, 0);\r
+    return block_done;\r
+}\r
+\r
+#ifndef FASTEST\r
+/* ===========================================================================\r
+ * Same as above, but achieves better compression. We use a lazy\r
+ * evaluation for matches: a match is finally adopted only if there is\r
+ * no better match at the next window position.\r
+ */\r
+local block_state deflate_slow(s, flush)\r
+    deflate_state *s;\r
+    int flush;\r
+{\r
+    IPos hash_head;          /* head of hash chain */\r
+    int bflush;              /* set if current block must be flushed */\r
+\r
+    /* Process the input block. */\r
+    for (;;) {\r
+        /* Make sure that we always have enough lookahead, except\r
+         * at the end of the input file. We need MAX_MATCH bytes\r
+         * for the next match, plus MIN_MATCH bytes to insert the\r
+         * string following the next match.\r
+         */\r
+        if (s->lookahead < MIN_LOOKAHEAD) {\r
+            fill_window(s);\r
+            if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {\r
+                return need_more;\r
+            }\r
+            if (s->lookahead == 0) break; /* flush the current block */\r
+        }\r
+\r
+        /* Insert the string window[strstart .. strstart+2] in the\r
+         * dictionary, and set hash_head to the head of the hash chain:\r
+         */\r
+        hash_head = NIL;\r
+        if (s->lookahead >= MIN_MATCH) {\r
+            INSERT_STRING(s, s->strstart, hash_head);\r
+        }\r
+\r
+        /* Find the longest match, discarding those <= prev_length.\r
+         */\r
+        s->prev_length = s->match_length, s->prev_match = s->match_start;\r
+        s->match_length = MIN_MATCH-1;\r
+\r
+        if (hash_head != NIL && s->prev_length < s->max_lazy_match &&\r
+            s->strstart - hash_head <= MAX_DIST(s)) {\r
+            /* To simplify the code, we prevent matches with the string\r
+             * of window index 0 (in particular we have to avoid a match\r
+             * of the string with itself at the start of the input file).\r
+             */\r
+            s->match_length = longest_match (s, hash_head);\r
+            /* longest_match() sets match_start */\r
+\r
+            if (s->match_length <= 5 && (s->strategy == Z_FILTERED\r
+#if TOO_FAR <= 32767\r
+                || (s->match_length == MIN_MATCH &&\r
+                    s->strstart - s->match_start > TOO_FAR)\r
+#endif\r
+                )) {\r
+\r
+                /* If prev_match is also MIN_MATCH, match_start is garbage\r
+                 * but we will ignore the current match anyway.\r
+                 */\r
+                s->match_length = MIN_MATCH-1;\r
+            }\r
+        }\r
+        /* If there was a match at the previous step and the current\r
+         * match is not better, output the previous match:\r
+         */\r
+        if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {\r
+            uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;\r
+            /* Do not insert strings in hash table beyond this. */\r
+\r
+            check_match(s, s->strstart-1, s->prev_match, s->prev_length);\r
+\r
+            _tr_tally_dist(s, s->strstart -1 - s->prev_match,\r
+                           s->prev_length - MIN_MATCH, bflush);\r
+\r
+            /* Insert in hash table all strings up to the end of the match.\r
+             * strstart-1 and strstart are already inserted. If there is not\r
+             * enough lookahead, the last two strings are not inserted in\r
+             * the hash table.\r
+             */\r
+            s->lookahead -= s->prev_length-1;\r
+            s->prev_length -= 2;\r
+            do {\r
+                if (++s->strstart <= max_insert) {\r
+                    INSERT_STRING(s, s->strstart, hash_head);\r
+                }\r
+            } while (--s->prev_length != 0);\r
+            s->match_available = 0;\r
+            s->match_length = MIN_MATCH-1;\r
+            s->strstart++;\r
+\r
+            if (bflush) FLUSH_BLOCK(s, 0);\r
+\r
+        } else if (s->match_available) {\r
+            /* If there was no match at the previous position, output a\r
+             * single literal. If there was a match but the current match\r
+             * is longer, truncate the previous match to a single literal.\r
+             */\r
+            Tracevv((stderr,"%c", s->window[s->strstart-1]));\r
+            _tr_tally_lit(s, s->window[s->strstart-1], bflush);\r
+            if (bflush) {\r
+                FLUSH_BLOCK_ONLY(s, 0);\r
+            }\r
+            s->strstart++;\r
+            s->lookahead--;\r
+            if (s->strm->avail_out == 0) return need_more;\r
+        } else {\r
+            /* There is no previous match to compare with, wait for\r
+             * the next step to decide.\r
+             */\r
+            s->match_available = 1;\r
+            s->strstart++;\r
+            s->lookahead--;\r
+        }\r
+    }\r
+    Assert (flush != Z_NO_FLUSH, "no flush?");\r
+    if (s->match_available) {\r
+        Tracevv((stderr,"%c", s->window[s->strstart-1]));\r
+        _tr_tally_lit(s, s->window[s->strstart-1], bflush);\r
+        s->match_available = 0;\r
+    }\r
+    s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;\r
+    if (flush == Z_FINISH) {\r
+        FLUSH_BLOCK(s, 1);\r
+        return finish_done;\r
+    }\r
+    if (s->last_lit)\r
+        FLUSH_BLOCK(s, 0);\r
+    return block_done;\r
+}\r
+#endif /* FASTEST */\r
+\r
+/* ===========================================================================\r
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance\r
+ * one.  Do not maintain a hash table.  (It will be regenerated if this run of\r
+ * deflate switches away from Z_RLE.)\r
+ */\r
+local block_state deflate_rle(s, flush)\r
+    deflate_state *s;\r
+    int flush;\r
+{\r
+    int bflush;             /* set if current block must be flushed */\r
+    uInt prev;              /* byte at distance one to match */\r
+    Bytef *scan, *strend;   /* scan goes up to strend for length of run */\r
+\r
+    for (;;) {\r
+        /* Make sure that we always have enough lookahead, except\r
+         * at the end of the input file. We need MAX_MATCH bytes\r
+         * for the longest run, plus one for the unrolled loop.\r
+         */\r
+        if (s->lookahead <= MAX_MATCH) {\r
+            fill_window(s);\r
+            if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {\r
+                return need_more;\r
+            }\r
+            if (s->lookahead == 0) break; /* flush the current block */\r
+        }\r
+\r
+        /* See how many times the previous byte repeats */\r
+        s->match_length = 0;\r
+        if (s->lookahead >= MIN_MATCH && s->strstart > 0) {\r
+            scan = s->window + s->strstart - 1;\r
+            prev = *scan;\r
+            if (prev == *++scan && prev == *++scan && prev == *++scan) {\r
+                strend = s->window + s->strstart + MAX_MATCH;\r
+                do {\r
+                } while (prev == *++scan && prev == *++scan &&\r
+                         prev == *++scan && prev == *++scan &&\r
+                         prev == *++scan && prev == *++scan &&\r
+                         prev == *++scan && prev == *++scan &&\r
+                         scan < strend);\r
+                s->match_length = MAX_MATCH - (int)(strend - scan);\r
+                if (s->match_length > s->lookahead)\r
+                    s->match_length = s->lookahead;\r
+            }\r
+            Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");\r
+        }\r
+\r
+        /* Emit match if have run of MIN_MATCH or longer, else emit literal */\r
+        if (s->match_length >= MIN_MATCH) {\r
+            check_match(s, s->strstart, s->strstart - 1, s->match_length);\r
+\r
+            _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);\r
+\r
+            s->lookahead -= s->match_length;\r
+            s->strstart += s->match_length;\r
+            s->match_length = 0;\r
+        } else {\r
+            /* No match, output a literal byte */\r
+            Tracevv((stderr,"%c", s->window[s->strstart]));\r
+            _tr_tally_lit (s, s->window[s->strstart], bflush);\r
+            s->lookahead--;\r
+            s->strstart++;\r
+        }\r
+        if (bflush) FLUSH_BLOCK(s, 0);\r
+    }\r
+    s->insert = 0;\r
+    if (flush == Z_FINISH) {\r
+        FLUSH_BLOCK(s, 1);\r
+        return finish_done;\r
+    }\r
+    if (s->last_lit)\r
+        FLUSH_BLOCK(s, 0);\r
+    return block_done;\r
+}\r
+\r
+/* ===========================================================================\r
+ * For Z_HUFFMAN_ONLY, do not look for matches.  Do not maintain a hash table.\r
+ * (It will be regenerated if this run of deflate switches away from Huffman.)\r
+ */\r
+local block_state deflate_huff(s, flush)\r
+    deflate_state *s;\r
+    int flush;\r
+{\r
+    int bflush;             /* set if current block must be flushed */\r
+\r
+    for (;;) {\r
+        /* Make sure that we have a literal to write. */\r
+        if (s->lookahead == 0) {\r
+            fill_window(s);\r
+            if (s->lookahead == 0) {\r
+                if (flush == Z_NO_FLUSH)\r
+                    return need_more;\r
+                break;      /* flush the current block */\r
+            }\r
+        }\r
+\r
+        /* Output a literal byte */\r
+        s->match_length = 0;\r
+        Tracevv((stderr,"%c", s->window[s->strstart]));\r
+        _tr_tally_lit (s, s->window[s->strstart], bflush);\r
+        s->lookahead--;\r
+        s->strstart++;\r
+        if (bflush) FLUSH_BLOCK(s, 0);\r
+    }\r
+    s->insert = 0;\r
+    if (flush == Z_FINISH) {\r
+        FLUSH_BLOCK(s, 1);\r
+        return finish_done;\r
+    }\r
+    if (s->last_lit)\r
+        FLUSH_BLOCK(s, 0);\r
+    return block_done;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/deflate.h
new file mode 100644 (file)
index 0000000..bb64c57
--- /dev/null
@@ -0,0 +1,346 @@
+/* deflate.h -- internal compression state\r
+ * Copyright (C) 1995-2012 Jean-loup Gailly\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* WARNING: this file should *not* be used by applications. It is\r
+   part of the implementation of the compression library and is\r
+   subject to change. Applications should only use zlib.h.\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#ifndef DEFLATE_H\r
+#define DEFLATE_H\r
+\r
+#include "zutil.h"\r
+\r
+/* define NO_GZIP when compiling if you want to disable gzip header and\r
+   trailer creation by deflate().  NO_GZIP would be used to avoid linking in\r
+   the crc code when it is not needed.  For shared libraries, gzip encoding\r
+   should be left enabled. */\r
+#ifndef NO_GZIP\r
+#  define GZIP\r
+#endif\r
+\r
+/* ===========================================================================\r
+ * Internal compression state.\r
+ */\r
+\r
+#define LENGTH_CODES 29\r
+/* number of length codes, not counting the special END_BLOCK code */\r
+\r
+#define LITERALS  256\r
+/* number of literal bytes 0..255 */\r
+\r
+#define L_CODES (LITERALS+1+LENGTH_CODES)\r
+/* number of Literal or Length codes, including the END_BLOCK code */\r
+\r
+#define D_CODES   30\r
+/* number of distance codes */\r
+\r
+#define BL_CODES  19\r
+/* number of codes used to transfer the bit lengths */\r
+\r
+#define HEAP_SIZE (2*L_CODES+1)\r
+/* maximum heap size */\r
+\r
+#define MAX_BITS 15\r
+/* All codes must not exceed MAX_BITS bits */\r
+\r
+#define Buf_size 16\r
+/* size of bit buffer in bi_buf */\r
+\r
+#define INIT_STATE    42\r
+#define EXTRA_STATE   69\r
+#define NAME_STATE    73\r
+#define COMMENT_STATE 91\r
+#define HCRC_STATE   103\r
+#define BUSY_STATE   113\r
+#define FINISH_STATE 666\r
+/* Stream status */\r
+\r
+\r
+/* Data structure describing a single value and its code string. */\r
+typedef struct ct_data_s {\r
+    union {\r
+        ush  freq;       /* frequency count */\r
+        ush  code;       /* bit string */\r
+    } fc;\r
+    union {\r
+        ush  dad;        /* father node in Huffman tree */\r
+        ush  len;        /* length of bit string */\r
+    } dl;\r
+} FAR ct_data;\r
+\r
+#define Freq fc.freq\r
+#define Code fc.code\r
+#define Dad  dl.dad\r
+#define Len  dl.len\r
+\r
+typedef struct static_tree_desc_s  static_tree_desc;\r
+\r
+typedef struct tree_desc_s {\r
+    ct_data *dyn_tree;           /* the dynamic tree */\r
+    int     max_code;            /* largest code with non zero frequency */\r
+    static_tree_desc *stat_desc; /* the corresponding static tree */\r
+} FAR tree_desc;\r
+\r
+typedef ush Pos;\r
+typedef Pos FAR Posf;\r
+typedef unsigned IPos;\r
+\r
+/* A Pos is an index in the character window. We use short instead of int to\r
+ * save space in the various tables. IPos is used only for parameter passing.\r
+ */\r
+\r
+typedef struct internal_state {\r
+    z_streamp strm;      /* pointer back to this zlib stream */\r
+    int   status;        /* as the name implies */\r
+    Bytef *pending_buf;  /* output still pending */\r
+    ulg   pending_buf_size; /* size of pending_buf */\r
+    Bytef *pending_out;  /* next pending byte to output to the stream */\r
+    uInt   pending;      /* nb of bytes in the pending buffer */\r
+    int   wrap;          /* bit 0 true for zlib, bit 1 true for gzip */\r
+    gz_headerp  gzhead;  /* gzip header information to write */\r
+    uInt   gzindex;      /* where in extra, name, or comment */\r
+    Byte  method;        /* can only be DEFLATED */\r
+    int   last_flush;    /* value of flush param for previous deflate call */\r
+\r
+                /* used by deflate.c: */\r
+\r
+    uInt  w_size;        /* LZ77 window size (32K by default) */\r
+    uInt  w_bits;        /* log2(w_size)  (8..16) */\r
+    uInt  w_mask;        /* w_size - 1 */\r
+\r
+    Bytef *window;\r
+    /* Sliding window. Input bytes are read into the second half of the window,\r
+     * and move to the first half later to keep a dictionary of at least wSize\r
+     * bytes. With this organization, matches are limited to a distance of\r
+     * wSize-MAX_MATCH bytes, but this ensures that IO is always\r
+     * performed with a length multiple of the block size. Also, it limits\r
+     * the window size to 64K, which is quite useful on MSDOS.\r
+     * To do: use the user input buffer as sliding window.\r
+     */\r
+\r
+    ulg window_size;\r
+    /* Actual size of window: 2*wSize, except when the user input buffer\r
+     * is directly used as sliding window.\r
+     */\r
+\r
+    Posf *prev;\r
+    /* Link to older string with same hash index. To limit the size of this\r
+     * array to 64K, this link is maintained only for the last 32K strings.\r
+     * An index in this array is thus a window index modulo 32K.\r
+     */\r
+\r
+    Posf *head; /* Heads of the hash chains or NIL. */\r
+\r
+    uInt  ins_h;          /* hash index of string to be inserted */\r
+    uInt  hash_size;      /* number of elements in hash table */\r
+    uInt  hash_bits;      /* log2(hash_size) */\r
+    uInt  hash_mask;      /* hash_size-1 */\r
+\r
+    uInt  hash_shift;\r
+    /* Number of bits by which ins_h must be shifted at each input\r
+     * step. It must be such that after MIN_MATCH steps, the oldest\r
+     * byte no longer takes part in the hash key, that is:\r
+     *   hash_shift * MIN_MATCH >= hash_bits\r
+     */\r
+\r
+    long block_start;\r
+    /* Window position at the beginning of the current output block. Gets\r
+     * negative when the window is moved backwards.\r
+     */\r
+\r
+    uInt match_length;           /* length of best match */\r
+    IPos prev_match;             /* previous match */\r
+    int match_available;         /* set if previous match exists */\r
+    uInt strstart;               /* start of string to insert */\r
+    uInt match_start;            /* start of matching string */\r
+    uInt lookahead;              /* number of valid bytes ahead in window */\r
+\r
+    uInt prev_length;\r
+    /* Length of the best match at previous step. Matches not greater than this\r
+     * are discarded. This is used in the lazy match evaluation.\r
+     */\r
+\r
+    uInt max_chain_length;\r
+    /* To speed up deflation, hash chains are never searched beyond this\r
+     * length.  A higher limit improves compression ratio but degrades the\r
+     * speed.\r
+     */\r
+\r
+    uInt max_lazy_match;\r
+    /* Attempt to find a better match only when the current match is strictly\r
+     * smaller than this value. This mechanism is used only for compression\r
+     * levels >= 4.\r
+     */\r
+#   define max_insert_length  max_lazy_match\r
+    /* Insert new strings in the hash table only if the match length is not\r
+     * greater than this length. This saves time but degrades compression.\r
+     * max_insert_length is used only for compression levels <= 3.\r
+     */\r
+\r
+    int level;    /* compression level (1..9) */\r
+    int strategy; /* favor or force Huffman coding*/\r
+\r
+    uInt good_match;\r
+    /* Use a faster search when the previous match is longer than this */\r
+\r
+    int nice_match; /* Stop searching when current match exceeds this */\r
+\r
+                /* used by trees.c: */\r
+    /* Didn't use ct_data typedef below to suppress compiler warning */\r
+    struct ct_data_s dyn_ltree[HEAP_SIZE];   /* literal and length tree */\r
+    struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */\r
+    struct ct_data_s bl_tree[2*BL_CODES+1];  /* Huffman tree for bit lengths */\r
+\r
+    struct tree_desc_s l_desc;               /* desc. for literal tree */\r
+    struct tree_desc_s d_desc;               /* desc. for distance tree */\r
+    struct tree_desc_s bl_desc;              /* desc. for bit length tree */\r
+\r
+    ush bl_count[MAX_BITS+1];\r
+    /* number of codes at each bit length for an optimal tree */\r
+\r
+    int heap[2*L_CODES+1];      /* heap used to build the Huffman trees */\r
+    int heap_len;               /* number of elements in the heap */\r
+    int heap_max;               /* element of largest frequency */\r
+    /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.\r
+     * The same heap array is used to build all trees.\r
+     */\r
+\r
+    uch depth[2*L_CODES+1];\r
+    /* Depth of each subtree used as tie breaker for trees of equal frequency\r
+     */\r
+\r
+    uchf *l_buf;          /* buffer for literals or lengths */\r
+\r
+    uInt  lit_bufsize;\r
+    /* Size of match buffer for literals/lengths.  There are 4 reasons for\r
+     * limiting lit_bufsize to 64K:\r
+     *   - frequencies can be kept in 16 bit counters\r
+     *   - if compression is not successful for the first block, all input\r
+     *     data is still in the window so we can still emit a stored block even\r
+     *     when input comes from standard input.  (This can also be done for\r
+     *     all blocks if lit_bufsize is not greater than 32K.)\r
+     *   - if compression is not successful for a file smaller than 64K, we can\r
+     *     even emit a stored file instead of a stored block (saving 5 bytes).\r
+     *     This is applicable only for zip (not gzip or zlib).\r
+     *   - creating new Huffman trees less frequently may not provide fast\r
+     *     adaptation to changes in the input data statistics. (Take for\r
+     *     example a binary file with poorly compressible code followed by\r
+     *     a highly compressible string table.) Smaller buffer sizes give\r
+     *     fast adaptation but have of course the overhead of transmitting\r
+     *     trees more frequently.\r
+     *   - I can't count above 4\r
+     */\r
+\r
+    uInt last_lit;      /* running index in l_buf */\r
+\r
+    ushf *d_buf;\r
+    /* Buffer for distances. To simplify the code, d_buf and l_buf have\r
+     * the same number of elements. To use different lengths, an extra flag\r
+     * array would be necessary.\r
+     */\r
+\r
+    ulg opt_len;        /* bit length of current block with optimal trees */\r
+    ulg static_len;     /* bit length of current block with static trees */\r
+    uInt matches;       /* number of string matches in current block */\r
+    uInt insert;        /* bytes at end of window left to insert */\r
+\r
+#ifdef DEBUG\r
+    ulg compressed_len; /* total bit length of compressed file mod 2^32 */\r
+    ulg bits_sent;      /* bit length of compressed data sent mod 2^32 */\r
+#endif\r
+\r
+    ush bi_buf;\r
+    /* Output buffer. bits are inserted starting at the bottom (least\r
+     * significant bits).\r
+     */\r
+    int bi_valid;\r
+    /* Number of valid bits in bi_buf.  All bits above the last valid bit\r
+     * are always zero.\r
+     */\r
+\r
+    ulg high_water;\r
+    /* High water mark offset in window for initialized bytes -- bytes above\r
+     * this are set to zero in order to avoid memory check warnings when\r
+     * longest match routines access bytes past the input.  This is then\r
+     * updated to the new high water mark.\r
+     */\r
+\r
+} FAR deflate_state;\r
+\r
+/* Output a byte on the stream.\r
+ * IN assertion: there is enough room in pending_buf.\r
+ */\r
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}\r
+\r
+\r
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)\r
+/* Minimum amount of lookahead, except at the end of the input file.\r
+ * See deflate.c for comments about the MIN_MATCH+1.\r
+ */\r
+\r
+#define MAX_DIST(s)  ((s)->w_size-MIN_LOOKAHEAD)\r
+/* In order to simplify the code, particularly on 16 bit machines, match\r
+ * distances are limited to MAX_DIST instead of WSIZE.\r
+ */\r
+\r
+#define WIN_INIT MAX_MATCH\r
+/* Number of bytes after end of data in window to initialize in order to avoid\r
+   memory checker errors from longest match routines */\r
+\r
+        /* in trees.c */\r
+void ZLIB_INTERNAL _tr_init OF((deflate_state *s));\r
+int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));\r
+void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,\r
+                        ulg stored_len, int last));\r
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));\r
+void ZLIB_INTERNAL _tr_align OF((deflate_state *s));\r
+void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,\r
+                        ulg stored_len, int last));\r
+\r
+#define d_code(dist) \\r
+   ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])\r
+/* Mapping from a distance to a distance code. dist is the distance - 1 and\r
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never\r
+ * used.\r
+ */\r
+\r
+#ifndef DEBUG\r
+/* Inline versions of _tr_tally for speed: */\r
+\r
+#if defined(GEN_TREES_H) || !defined(STDC)\r
+  extern uch ZLIB_INTERNAL _length_code[];\r
+  extern uch ZLIB_INTERNAL _dist_code[];\r
+#else\r
+  extern const uch ZLIB_INTERNAL _length_code[];\r
+  extern const uch ZLIB_INTERNAL _dist_code[];\r
+#endif\r
+\r
+# define _tr_tally_lit(s, c, flush) \\r
+  { uch cc = (c); \\r
+    s->d_buf[s->last_lit] = 0; \\r
+    s->l_buf[s->last_lit++] = cc; \\r
+    s->dyn_ltree[cc].Freq++; \\r
+    flush = (s->last_lit == s->lit_bufsize-1); \\r
+   }\r
+# define _tr_tally_dist(s, distance, length, flush) \\r
+  { uch len = (length); \\r
+    ush dist = (distance); \\r
+    s->d_buf[s->last_lit] = dist; \\r
+    s->l_buf[s->last_lit++] = len; \\r
+    dist--; \\r
+    s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \\r
+    s->dyn_dtree[d_code(dist)].Freq++; \\r
+    flush = (s->last_lit == s->lit_bufsize-1); \\r
+  }\r
+#else\r
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)\r
+# define _tr_tally_dist(s, distance, length, flush) \\r
+              flush = _tr_tally(s, distance, length)\r
+#endif\r
+\r
+#endif /* DEFLATE_H */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/example.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/example.c
new file mode 100644 (file)
index 0000000..68e3cf1
--- /dev/null
@@ -0,0 +1,601 @@
+/* example.c -- usage example of the zlib compression library\r
+ * Copyright (C) 1995-2006, 2011 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#include "zlib.h"\r
+#include <stdio.h>\r
+\r
+#ifdef STDC\r
+#  include <string.h>\r
+#  include <stdlib.h>\r
+#endif\r
+\r
+#if defined(VMS) || defined(RISCOS)\r
+#  define TESTFILE "foo-gz"\r
+#else\r
+#  define TESTFILE "foo.gz"\r
+#endif\r
+\r
+#define CHECK_ERR(err, msg) { \\r
+    if (err != Z_OK) { \\r
+        fprintf(stderr, "%s error: %d\n", msg, err); \\r
+        exit(1); \\r
+    } \\r
+}\r
+\r
+z_const char hello[] = "hello, hello!";\r
+/* "hello world" would be more standard, but the repeated "hello"\r
+ * stresses the compression code better, sorry...\r
+ */\r
+\r
+const char dictionary[] = "hello";\r
+uLong dictId; /* Adler32 value of the dictionary */\r
+\r
+void test_deflate       OF((Byte *compr, uLong comprLen));\r
+void test_inflate       OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+void test_large_deflate OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+void test_large_inflate OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+void test_flush         OF((Byte *compr, uLong *comprLen));\r
+void test_sync          OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+void test_dict_deflate  OF((Byte *compr, uLong comprLen));\r
+void test_dict_inflate  OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+int  main               OF((int argc, char *argv[]));\r
+\r
+\r
+#ifdef Z_SOLO\r
+\r
+void *myalloc OF((void *, unsigned, unsigned));\r
+void myfree OF((void *, void *));\r
+\r
+void *myalloc(q, n, m)\r
+    void *q;\r
+    unsigned n, m;\r
+{\r
+    q = Z_NULL;\r
+    return calloc(n, m);\r
+}\r
+\r
+void myfree(void *q, void *p)\r
+{\r
+    q = Z_NULL;\r
+    free(p);\r
+}\r
+\r
+static alloc_func zalloc = myalloc;\r
+static free_func zfree = myfree;\r
+\r
+#else /* !Z_SOLO */\r
+\r
+static alloc_func zalloc = (alloc_func)0;\r
+static free_func zfree = (free_func)0;\r
+\r
+void test_compress      OF((Byte *compr, uLong comprLen,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+void test_gzio          OF((const char *fname,\r
+                            Byte *uncompr, uLong uncomprLen));\r
+\r
+/* ===========================================================================\r
+ * Test compress() and uncompress()\r
+ */\r
+void test_compress(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    int err;\r
+    uLong len = (uLong)strlen(hello)+1;\r
+\r
+    err = compress(compr, &comprLen, (const Bytef*)hello, len);\r
+    CHECK_ERR(err, "compress");\r
+\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    err = uncompress(uncompr, &uncomprLen, compr, comprLen);\r
+    CHECK_ERR(err, "uncompress");\r
+\r
+    if (strcmp((char*)uncompr, hello)) {\r
+        fprintf(stderr, "bad uncompress\n");\r
+        exit(1);\r
+    } else {\r
+        printf("uncompress(): %s\n", (char *)uncompr);\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test read/write of .gz files\r
+ */\r
+void test_gzio(fname, uncompr, uncomprLen)\r
+    const char *fname; /* compressed file name */\r
+    Byte *uncompr;\r
+    uLong uncomprLen;\r
+{\r
+#ifdef NO_GZCOMPRESS\r
+    fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");\r
+#else\r
+    int err;\r
+    int len = (int)strlen(hello)+1;\r
+    gzFile file;\r
+    z_off_t pos;\r
+\r
+    file = gzopen(fname, "wb");\r
+    if (file == NULL) {\r
+        fprintf(stderr, "gzopen error\n");\r
+        exit(1);\r
+    }\r
+    gzputc(file, 'h');\r
+    if (gzputs(file, "ello") != 4) {\r
+        fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));\r
+        exit(1);\r
+    }\r
+    if (gzprintf(file, ", %s!", "hello") != 8) {\r
+        fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));\r
+        exit(1);\r
+    }\r
+    gzseek(file, 1L, SEEK_CUR); /* add one zero byte */\r
+    gzclose(file);\r
+\r
+    file = gzopen(fname, "rb");\r
+    if (file == NULL) {\r
+        fprintf(stderr, "gzopen error\n");\r
+        exit(1);\r
+    }\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {\r
+        fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));\r
+        exit(1);\r
+    }\r
+    if (strcmp((char*)uncompr, hello)) {\r
+        fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);\r
+        exit(1);\r
+    } else {\r
+        printf("gzread(): %s\n", (char*)uncompr);\r
+    }\r
+\r
+    pos = gzseek(file, -8L, SEEK_CUR);\r
+    if (pos != 6 || gztell(file) != pos) {\r
+        fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",\r
+                (long)pos, (long)gztell(file));\r
+        exit(1);\r
+    }\r
+\r
+    if (gzgetc(file) != ' ') {\r
+        fprintf(stderr, "gzgetc error\n");\r
+        exit(1);\r
+    }\r
+\r
+    if (gzungetc(' ', file) != ' ') {\r
+        fprintf(stderr, "gzungetc error\n");\r
+        exit(1);\r
+    }\r
+\r
+    gzgets(file, (char*)uncompr, (int)uncomprLen);\r
+    if (strlen((char*)uncompr) != 7) { /* " hello!" */\r
+        fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));\r
+        exit(1);\r
+    }\r
+    if (strcmp((char*)uncompr, hello + 6)) {\r
+        fprintf(stderr, "bad gzgets after gzseek\n");\r
+        exit(1);\r
+    } else {\r
+        printf("gzgets() after gzseek: %s\n", (char*)uncompr);\r
+    }\r
+\r
+    gzclose(file);\r
+#endif\r
+}\r
+\r
+#endif /* Z_SOLO */\r
+\r
+/* ===========================================================================\r
+ * Test deflate() with small buffers\r
+ */\r
+void test_deflate(compr, comprLen)\r
+    Byte *compr;\r
+    uLong comprLen;\r
+{\r
+    z_stream c_stream; /* compression stream */\r
+    int err;\r
+    uLong len = (uLong)strlen(hello)+1;\r
+\r
+    c_stream.zalloc = zalloc;\r
+    c_stream.zfree = zfree;\r
+    c_stream.opaque = (voidpf)0;\r
+\r
+    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);\r
+    CHECK_ERR(err, "deflateInit");\r
+\r
+    c_stream.next_in  = (z_const unsigned char *)hello;\r
+    c_stream.next_out = compr;\r
+\r
+    while (c_stream.total_in != len && c_stream.total_out < comprLen) {\r
+        c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */\r
+        err = deflate(&c_stream, Z_NO_FLUSH);\r
+        CHECK_ERR(err, "deflate");\r
+    }\r
+    /* Finish the stream, still forcing small buffers: */\r
+    for (;;) {\r
+        c_stream.avail_out = 1;\r
+        err = deflate(&c_stream, Z_FINISH);\r
+        if (err == Z_STREAM_END) break;\r
+        CHECK_ERR(err, "deflate");\r
+    }\r
+\r
+    err = deflateEnd(&c_stream);\r
+    CHECK_ERR(err, "deflateEnd");\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test inflate() with small buffers\r
+ */\r
+void test_inflate(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    int err;\r
+    z_stream d_stream; /* decompression stream */\r
+\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    d_stream.zalloc = zalloc;\r
+    d_stream.zfree = zfree;\r
+    d_stream.opaque = (voidpf)0;\r
+\r
+    d_stream.next_in  = compr;\r
+    d_stream.avail_in = 0;\r
+    d_stream.next_out = uncompr;\r
+\r
+    err = inflateInit(&d_stream);\r
+    CHECK_ERR(err, "inflateInit");\r
+\r
+    while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {\r
+        d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */\r
+        err = inflate(&d_stream, Z_NO_FLUSH);\r
+        if (err == Z_STREAM_END) break;\r
+        CHECK_ERR(err, "inflate");\r
+    }\r
+\r
+    err = inflateEnd(&d_stream);\r
+    CHECK_ERR(err, "inflateEnd");\r
+\r
+    if (strcmp((char*)uncompr, hello)) {\r
+        fprintf(stderr, "bad inflate\n");\r
+        exit(1);\r
+    } else {\r
+        printf("inflate(): %s\n", (char *)uncompr);\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test deflate() with large buffers and dynamic change of compression level\r
+ */\r
+void test_large_deflate(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    z_stream c_stream; /* compression stream */\r
+    int err;\r
+\r
+    c_stream.zalloc = zalloc;\r
+    c_stream.zfree = zfree;\r
+    c_stream.opaque = (voidpf)0;\r
+\r
+    err = deflateInit(&c_stream, Z_BEST_SPEED);\r
+    CHECK_ERR(err, "deflateInit");\r
+\r
+    c_stream.next_out = compr;\r
+    c_stream.avail_out = (uInt)comprLen;\r
+\r
+    /* At this point, uncompr is still mostly zeroes, so it should compress\r
+     * very well:\r
+     */\r
+    c_stream.next_in = uncompr;\r
+    c_stream.avail_in = (uInt)uncomprLen;\r
+    err = deflate(&c_stream, Z_NO_FLUSH);\r
+    CHECK_ERR(err, "deflate");\r
+    if (c_stream.avail_in != 0) {\r
+        fprintf(stderr, "deflate not greedy\n");\r
+        exit(1);\r
+    }\r
+\r
+    /* Feed in already compressed data and switch to no compression: */\r
+    deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);\r
+    c_stream.next_in = compr;\r
+    c_stream.avail_in = (uInt)comprLen/2;\r
+    err = deflate(&c_stream, Z_NO_FLUSH);\r
+    CHECK_ERR(err, "deflate");\r
+\r
+    /* Switch back to compressing mode: */\r
+    deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);\r
+    c_stream.next_in = uncompr;\r
+    c_stream.avail_in = (uInt)uncomprLen;\r
+    err = deflate(&c_stream, Z_NO_FLUSH);\r
+    CHECK_ERR(err, "deflate");\r
+\r
+    err = deflate(&c_stream, Z_FINISH);\r
+    if (err != Z_STREAM_END) {\r
+        fprintf(stderr, "deflate should report Z_STREAM_END\n");\r
+        exit(1);\r
+    }\r
+    err = deflateEnd(&c_stream);\r
+    CHECK_ERR(err, "deflateEnd");\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test inflate() with large buffers\r
+ */\r
+void test_large_inflate(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    int err;\r
+    z_stream d_stream; /* decompression stream */\r
+\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    d_stream.zalloc = zalloc;\r
+    d_stream.zfree = zfree;\r
+    d_stream.opaque = (voidpf)0;\r
+\r
+    d_stream.next_in  = compr;\r
+    d_stream.avail_in = (uInt)comprLen;\r
+\r
+    err = inflateInit(&d_stream);\r
+    CHECK_ERR(err, "inflateInit");\r
+\r
+    for (;;) {\r
+        d_stream.next_out = uncompr;            /* discard the output */\r
+        d_stream.avail_out = (uInt)uncomprLen;\r
+        err = inflate(&d_stream, Z_NO_FLUSH);\r
+        if (err == Z_STREAM_END) break;\r
+        CHECK_ERR(err, "large inflate");\r
+    }\r
+\r
+    err = inflateEnd(&d_stream);\r
+    CHECK_ERR(err, "inflateEnd");\r
+\r
+    if (d_stream.total_out != 2*uncomprLen + comprLen/2) {\r
+        fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);\r
+        exit(1);\r
+    } else {\r
+        printf("large_inflate(): OK\n");\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test deflate() with full flush\r
+ */\r
+void test_flush(compr, comprLen)\r
+    Byte *compr;\r
+    uLong *comprLen;\r
+{\r
+    z_stream c_stream; /* compression stream */\r
+    int err;\r
+    uInt len = (uInt)strlen(hello)+1;\r
+\r
+    c_stream.zalloc = zalloc;\r
+    c_stream.zfree = zfree;\r
+    c_stream.opaque = (voidpf)0;\r
+\r
+    err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);\r
+    CHECK_ERR(err, "deflateInit");\r
+\r
+    c_stream.next_in  = (z_const unsigned char *)hello;\r
+    c_stream.next_out = compr;\r
+    c_stream.avail_in = 3;\r
+    c_stream.avail_out = (uInt)*comprLen;\r
+    err = deflate(&c_stream, Z_FULL_FLUSH);\r
+    CHECK_ERR(err, "deflate");\r
+\r
+    compr[3]++; /* force an error in first compressed block */\r
+    c_stream.avail_in = len - 3;\r
+\r
+    err = deflate(&c_stream, Z_FINISH);\r
+    if (err != Z_STREAM_END) {\r
+        CHECK_ERR(err, "deflate");\r
+    }\r
+    err = deflateEnd(&c_stream);\r
+    CHECK_ERR(err, "deflateEnd");\r
+\r
+    *comprLen = c_stream.total_out;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test inflateSync()\r
+ */\r
+void test_sync(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    int err;\r
+    z_stream d_stream; /* decompression stream */\r
+\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    d_stream.zalloc = zalloc;\r
+    d_stream.zfree = zfree;\r
+    d_stream.opaque = (voidpf)0;\r
+\r
+    d_stream.next_in  = compr;\r
+    d_stream.avail_in = 2; /* just read the zlib header */\r
+\r
+    err = inflateInit(&d_stream);\r
+    CHECK_ERR(err, "inflateInit");\r
+\r
+    d_stream.next_out = uncompr;\r
+    d_stream.avail_out = (uInt)uncomprLen;\r
+\r
+    inflate(&d_stream, Z_NO_FLUSH);\r
+    CHECK_ERR(err, "inflate");\r
+\r
+    d_stream.avail_in = (uInt)comprLen-2;   /* read all compressed data */\r
+    err = inflateSync(&d_stream);           /* but skip the damaged part */\r
+    CHECK_ERR(err, "inflateSync");\r
+\r
+    err = inflate(&d_stream, Z_FINISH);\r
+    if (err != Z_DATA_ERROR) {\r
+        fprintf(stderr, "inflate should report DATA_ERROR\n");\r
+        /* Because of incorrect adler32 */\r
+        exit(1);\r
+    }\r
+    err = inflateEnd(&d_stream);\r
+    CHECK_ERR(err, "inflateEnd");\r
+\r
+    printf("after inflateSync(): hel%s\n", (char *)uncompr);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test deflate() with preset dictionary\r
+ */\r
+void test_dict_deflate(compr, comprLen)\r
+    Byte *compr;\r
+    uLong comprLen;\r
+{\r
+    z_stream c_stream; /* compression stream */\r
+    int err;\r
+\r
+    c_stream.zalloc = zalloc;\r
+    c_stream.zfree = zfree;\r
+    c_stream.opaque = (voidpf)0;\r
+\r
+    err = deflateInit(&c_stream, Z_BEST_COMPRESSION);\r
+    CHECK_ERR(err, "deflateInit");\r
+\r
+    err = deflateSetDictionary(&c_stream,\r
+                (const Bytef*)dictionary, (int)sizeof(dictionary));\r
+    CHECK_ERR(err, "deflateSetDictionary");\r
+\r
+    dictId = c_stream.adler;\r
+    c_stream.next_out = compr;\r
+    c_stream.avail_out = (uInt)comprLen;\r
+\r
+    c_stream.next_in = (z_const unsigned char *)hello;\r
+    c_stream.avail_in = (uInt)strlen(hello)+1;\r
+\r
+    err = deflate(&c_stream, Z_FINISH);\r
+    if (err != Z_STREAM_END) {\r
+        fprintf(stderr, "deflate should report Z_STREAM_END\n");\r
+        exit(1);\r
+    }\r
+    err = deflateEnd(&c_stream);\r
+    CHECK_ERR(err, "deflateEnd");\r
+}\r
+\r
+/* ===========================================================================\r
+ * Test inflate() with a preset dictionary\r
+ */\r
+void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen, uncomprLen;\r
+{\r
+    int err;\r
+    z_stream d_stream; /* decompression stream */\r
+\r
+    strcpy((char*)uncompr, "garbage");\r
+\r
+    d_stream.zalloc = zalloc;\r
+    d_stream.zfree = zfree;\r
+    d_stream.opaque = (voidpf)0;\r
+\r
+    d_stream.next_in  = compr;\r
+    d_stream.avail_in = (uInt)comprLen;\r
+\r
+    err = inflateInit(&d_stream);\r
+    CHECK_ERR(err, "inflateInit");\r
+\r
+    d_stream.next_out = uncompr;\r
+    d_stream.avail_out = (uInt)uncomprLen;\r
+\r
+    for (;;) {\r
+        err = inflate(&d_stream, Z_NO_FLUSH);\r
+        if (err == Z_STREAM_END) break;\r
+        if (err == Z_NEED_DICT) {\r
+            if (d_stream.adler != dictId) {\r
+                fprintf(stderr, "unexpected dictionary");\r
+                exit(1);\r
+            }\r
+            err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,\r
+                                       (int)sizeof(dictionary));\r
+        }\r
+        CHECK_ERR(err, "inflate with dict");\r
+    }\r
+\r
+    err = inflateEnd(&d_stream);\r
+    CHECK_ERR(err, "inflateEnd");\r
+\r
+    if (strcmp((char*)uncompr, hello)) {\r
+        fprintf(stderr, "bad inflate with dict\n");\r
+        exit(1);\r
+    } else {\r
+        printf("inflate with dictionary: %s\n", (char *)uncompr);\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Usage:  example [output.gz  [input.gz]]\r
+ */\r
+\r
+int main(argc, argv)\r
+    int argc;\r
+    char *argv[];\r
+{\r
+    Byte *compr, *uncompr;\r
+    uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */\r
+    uLong uncomprLen = comprLen;\r
+    static const char* myVersion = ZLIB_VERSION;\r
+\r
+    if (zlibVersion()[0] != myVersion[0]) {\r
+        fprintf(stderr, "incompatible zlib version\n");\r
+        exit(1);\r
+\r
+    } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {\r
+        fprintf(stderr, "warning: different zlib version\n");\r
+    }\r
+\r
+    printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",\r
+            ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());\r
+\r
+    compr    = (Byte*)calloc((uInt)comprLen, 1);\r
+    uncompr  = (Byte*)calloc((uInt)uncomprLen, 1);\r
+    /* compr and uncompr are cleared to avoid reading uninitialized\r
+     * data and to ensure that uncompr compresses well.\r
+     */\r
+    if (compr == Z_NULL || uncompr == Z_NULL) {\r
+        printf("out of memory\n");\r
+        exit(1);\r
+    }\r
+\r
+#ifdef Z_SOLO\r
+    argc = strlen(argv[0]);\r
+#else\r
+    test_compress(compr, comprLen, uncompr, uncomprLen);\r
+\r
+    test_gzio((argc > 1 ? argv[1] : TESTFILE),\r
+              uncompr, uncomprLen);\r
+#endif\r
+\r
+    test_deflate(compr, comprLen);\r
+    test_inflate(compr, comprLen, uncompr, uncomprLen);\r
+\r
+    test_large_deflate(compr, comprLen, uncompr, uncomprLen);\r
+    test_large_inflate(compr, comprLen, uncompr, uncomprLen);\r
+\r
+    test_flush(compr, &comprLen);\r
+    test_sync(compr, comprLen, uncompr, uncomprLen);\r
+    comprLen = uncomprLen;\r
+\r
+    test_dict_deflate(compr, comprLen);\r
+    test_dict_inflate(compr, comprLen, uncompr, uncomprLen);\r
+\r
+    free(compr);\r
+    free(uncompr);\r
+\r
+    return 0;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzclose.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzclose.c
new file mode 100644 (file)
index 0000000..cbf0db6
--- /dev/null
@@ -0,0 +1,25 @@
+/* gzclose.c -- zlib gzclose() function\r
+ * Copyright (C) 2004, 2010 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "gzguts.h"\r
+\r
+/* gzclose() is in a separate file so that it is linked in only if it is used.\r
+   That way the other gzclose functions can be used instead to avoid linking in\r
+   unneeded compression or decompression routines. */\r
+int ZEXPORT gzclose(file)\r
+    gzFile file;\r
+{\r
+#ifndef NO_GZCOMPRESS\r
+    gz_statep state;\r
+\r
+    if (file == NULL)\r
+        return Z_STREAM_ERROR;\r
+    state = (gz_statep)file;\r
+\r
+    return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);\r
+#else\r
+    return gzclose_r(file);\r
+#endif\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzguts.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzguts.h
new file mode 100644 (file)
index 0000000..bef9749
--- /dev/null
@@ -0,0 +1,209 @@
+/* gzguts.h -- zlib internal header definitions for gz* operations\r
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#ifdef _LARGEFILE64_SOURCE\r
+#  ifndef _LARGEFILE_SOURCE\r
+#    define _LARGEFILE_SOURCE 1\r
+#  endif\r
+#  ifdef _FILE_OFFSET_BITS\r
+#    undef _FILE_OFFSET_BITS\r
+#  endif\r
+#endif\r
+\r
+#ifdef HAVE_HIDDEN\r
+#  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))\r
+#else\r
+#  define ZLIB_INTERNAL\r
+#endif\r
+\r
+#include <stdio.h>\r
+#include "zlib.h"\r
+#ifdef STDC\r
+#  include <string.h>\r
+#  include <stdlib.h>\r
+#  include <limits.h>\r
+#endif\r
+#include <fcntl.h>\r
+\r
+#ifdef _WIN32\r
+#  include <stddef.h>\r
+#endif\r
+\r
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)\r
+#  include <io.h>\r
+#endif\r
+\r
+#ifdef WINAPI_FAMILY\r
+#  define open _open\r
+#  define read _read\r
+#  define write _write\r
+#  define close _close\r
+#endif\r
+\r
+#ifdef NO_DEFLATE       /* for compatibility with old definition */\r
+#  define NO_GZCOMPRESS\r
+#endif\r
+\r
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)\r
+#  ifndef HAVE_VSNPRINTF\r
+#    define HAVE_VSNPRINTF\r
+#  endif\r
+#endif\r
+\r
+#if defined(__CYGWIN__)\r
+#  ifndef HAVE_VSNPRINTF\r
+#    define HAVE_VSNPRINTF\r
+#  endif\r
+#endif\r
+\r
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)\r
+#  ifndef HAVE_VSNPRINTF\r
+#    define HAVE_VSNPRINTF\r
+#  endif\r
+#endif\r
+\r
+#ifndef HAVE_VSNPRINTF\r
+#  ifdef MSDOS\r
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),\r
+   but for now we just assume it doesn't. */\r
+#    define NO_vsnprintf\r
+#  endif\r
+#  ifdef __TURBOC__\r
+#    define NO_vsnprintf\r
+#  endif\r
+#  ifdef WIN32\r
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */\r
+#    if !defined(vsnprintf) && !defined(NO_vsnprintf)\r
+#      if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )\r
+#         define vsnprintf _vsnprintf\r
+#      endif\r
+#    endif\r
+#  endif\r
+#  ifdef __SASC\r
+#    define NO_vsnprintf\r
+#  endif\r
+#  ifdef VMS\r
+#    define NO_vsnprintf\r
+#  endif\r
+#  ifdef __OS400__\r
+#    define NO_vsnprintf\r
+#  endif\r
+#  ifdef __MVS__\r
+#    define NO_vsnprintf\r
+#  endif\r
+#endif\r
+\r
+/* unlike snprintf (which is required in C99, yet still not supported by\r
+   Microsoft more than a decade later!), _snprintf does not guarantee null\r
+   termination of the result -- however this is only used in gzlib.c where\r
+   the result is assured to fit in the space provided */\r
+#ifdef _MSC_VER\r
+#  define snprintf _snprintf\r
+#endif\r
+\r
+#ifndef local\r
+#  define local static\r
+#endif\r
+/* compile with -Dlocal if your debugger can't find static symbols */\r
+\r
+/* gz* functions always use library allocation functions */\r
+#ifndef STDC\r
+  extern voidp  malloc OF((uInt size));\r
+  extern void   free   OF((voidpf ptr));\r
+#endif\r
+\r
+/* get errno and strerror definition */\r
+#if defined UNDER_CE\r
+#  include <windows.h>\r
+#  define zstrerror() gz_strwinerror((DWORD)GetLastError())\r
+#else\r
+#  ifndef NO_STRERROR\r
+#    include <errno.h>\r
+#    define zstrerror() strerror(errno)\r
+#  else\r
+#    define zstrerror() "stdio error (consult errno)"\r
+#  endif\r
+#endif\r
+\r
+/* provide prototypes for these when building zlib without LFS */\r
+#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0\r
+    ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\r
+    ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));\r
+    ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));\r
+    ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\r
+#endif\r
+\r
+/* default memLevel */\r
+#if MAX_MEM_LEVEL >= 8\r
+#  define DEF_MEM_LEVEL 8\r
+#else\r
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\r
+#endif\r
+\r
+/* default i/o buffer size -- double this for output when reading (this and\r
+   twice this must be able to fit in an unsigned type) */\r
+#define GZBUFSIZE 8192\r
+\r
+/* gzip modes, also provide a little integrity check on the passed structure */\r
+#define GZ_NONE 0\r
+#define GZ_READ 7247\r
+#define GZ_WRITE 31153\r
+#define GZ_APPEND 1     /* mode set to GZ_WRITE after the file is opened */\r
+\r
+/* values for gz_state how */\r
+#define LOOK 0      /* look for a gzip header */\r
+#define COPY 1      /* copy input directly */\r
+#define GZIP 2      /* decompress a gzip stream */\r
+\r
+/* internal gzip file state data structure */\r
+typedef struct {\r
+        /* exposed contents for gzgetc() macro */\r
+    struct gzFile_s x;      /* "x" for exposed */\r
+                            /* x.have: number of bytes available at x.next */\r
+                            /* x.next: next output data to deliver or write */\r
+                            /* x.pos: current position in uncompressed data */\r
+        /* used for both reading and writing */\r
+    int mode;               /* see gzip modes above */\r
+    int fd;                 /* file descriptor */\r
+    char *path;             /* path or fd for error messages */\r
+    unsigned size;          /* buffer size, zero if not allocated yet */\r
+    unsigned want;          /* requested buffer size, default is GZBUFSIZE */\r
+    unsigned char *in;      /* input buffer */\r
+    unsigned char *out;     /* output buffer (double-sized when reading) */\r
+    int direct;             /* 0 if processing gzip, 1 if transparent */\r
+        /* just for reading */\r
+    int how;                /* 0: get header, 1: copy, 2: decompress */\r
+    z_off64_t start;        /* where the gzip data started, for rewinding */\r
+    int eof;                /* true if end of input file reached */\r
+    int past;               /* true if read requested past end */\r
+        /* just for writing */\r
+    int level;              /* compression level */\r
+    int strategy;           /* compression strategy */\r
+        /* seek request */\r
+    z_off64_t skip;         /* amount to skip (already rewound if backwards) */\r
+    int seek;               /* true if seek request pending */\r
+        /* error information */\r
+    int err;                /* error code */\r
+    char *msg;              /* error message */\r
+        /* zlib inflate or deflate stream */\r
+    z_stream strm;          /* stream structure in-place (not a pointer) */\r
+} gz_state;\r
+typedef gz_state FAR *gz_statep;\r
+\r
+/* shared functions */\r
+void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));\r
+#if defined UNDER_CE\r
+char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));\r
+#endif\r
+\r
+/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t\r
+   value -- needed when comparing unsigned to z_off64_t, which is signed\r
+   (possible z_off64_t types off_t, off64_t, and long are all signed) */\r
+#ifdef INT_MAX\r
+#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)\r
+#else\r
+unsigned ZLIB_INTERNAL gz_intmax OF((void));\r
+#  define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzlib.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzlib.c
new file mode 100644 (file)
index 0000000..de0ff4f
--- /dev/null
@@ -0,0 +1,634 @@
+/* gzlib.c -- zlib functions common to reading and writing gzip files\r
+ * Copyright (C) 2004, 2010, 2011, 2012, 2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "gzguts.h"\r
+\r
+#if defined(_WIN32) && !defined(__BORLANDC__)\r
+#  define LSEEK _lseeki64\r
+#else\r
+#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0\r
+#  define LSEEK lseek64\r
+#else\r
+#  define LSEEK lseek\r
+#endif\r
+#endif\r
+\r
+/* Local functions */\r
+local void gz_reset OF((gz_statep));\r
+local gzFile gz_open OF((const void *, int, const char *));\r
+\r
+#if defined UNDER_CE\r
+\r
+/* Map the Windows error number in ERROR to a locale-dependent error message\r
+   string and return a pointer to it.  Typically, the values for ERROR come\r
+   from GetLastError.\r
+\r
+   The string pointed to shall not be modified by the application, but may be\r
+   overwritten by a subsequent call to gz_strwinerror\r
+\r
+   The gz_strwinerror function does not change the current setting of\r
+   GetLastError. */\r
+char ZLIB_INTERNAL *gz_strwinerror (error)\r
+     DWORD error;\r
+{\r
+    static char buf[1024];\r
+\r
+    wchar_t *msgbuf;\r
+    DWORD lasterr = GetLastError();\r
+    DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM\r
+        | FORMAT_MESSAGE_ALLOCATE_BUFFER,\r
+        NULL,\r
+        error,\r
+        0, /* Default language */\r
+        (LPVOID)&msgbuf,\r
+        0,\r
+        NULL);\r
+    if (chars != 0) {\r
+        /* If there is an \r\n appended, zap it.  */\r
+        if (chars >= 2\r
+            && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {\r
+            chars -= 2;\r
+            msgbuf[chars] = 0;\r
+        }\r
+\r
+        if (chars > sizeof (buf) - 1) {\r
+            chars = sizeof (buf) - 1;\r
+            msgbuf[chars] = 0;\r
+        }\r
+\r
+        wcstombs(buf, msgbuf, chars + 1);\r
+        LocalFree(msgbuf);\r
+    }\r
+    else {\r
+        sprintf(buf, "unknown win32 error (%ld)", error);\r
+    }\r
+\r
+    SetLastError(lasterr);\r
+    return buf;\r
+}\r
+\r
+#endif /* UNDER_CE */\r
+\r
+/* Reset gzip file state */\r
+local void gz_reset(state)\r
+    gz_statep state;\r
+{\r
+    state->x.have = 0;              /* no output data available */\r
+    if (state->mode == GZ_READ) {   /* for reading ... */\r
+        state->eof = 0;             /* not at end of file */\r
+        state->past = 0;            /* have not read past end yet */\r
+        state->how = LOOK;          /* look for gzip header */\r
+    }\r
+    state->seek = 0;                /* no seek request pending */\r
+    gz_error(state, Z_OK, NULL);    /* clear error */\r
+    state->x.pos = 0;               /* no uncompressed data yet */\r
+    state->strm.avail_in = 0;       /* no input data yet */\r
+}\r
+\r
+/* Open a gzip file either by name or file descriptor. */\r
+local gzFile gz_open(path, fd, mode)\r
+    const void *path;\r
+    int fd;\r
+    const char *mode;\r
+{\r
+    gz_statep state;\r
+    size_t len;\r
+    int oflag;\r
+#ifdef O_CLOEXEC\r
+    int cloexec = 0;\r
+#endif\r
+#ifdef O_EXCL\r
+    int exclusive = 0;\r
+#endif\r
+\r
+    /* check input */\r
+    if (path == NULL)\r
+        return NULL;\r
+\r
+    /* allocate gzFile structure to return */\r
+    state = (gz_statep)malloc(sizeof(gz_state));\r
+    if (state == NULL)\r
+        return NULL;\r
+    state->size = 0;            /* no buffers allocated yet */\r
+    state->want = GZBUFSIZE;    /* requested buffer size */\r
+    state->msg = NULL;          /* no error message yet */\r
+\r
+    /* interpret mode */\r
+    state->mode = GZ_NONE;\r
+    state->level = Z_DEFAULT_COMPRESSION;\r
+    state->strategy = Z_DEFAULT_STRATEGY;\r
+    state->direct = 0;\r
+    while (*mode) {\r
+        if (*mode >= '0' && *mode <= '9')\r
+            state->level = *mode - '0';\r
+        else\r
+            switch (*mode) {\r
+            case 'r':\r
+                state->mode = GZ_READ;\r
+                break;\r
+#ifndef NO_GZCOMPRESS\r
+            case 'w':\r
+                state->mode = GZ_WRITE;\r
+                break;\r
+            case 'a':\r
+                state->mode = GZ_APPEND;\r
+                break;\r
+#endif\r
+            case '+':       /* can't read and write at the same time */\r
+                free(state);\r
+                return NULL;\r
+            case 'b':       /* ignore -- will request binary anyway */\r
+                break;\r
+#ifdef O_CLOEXEC\r
+            case 'e':\r
+                cloexec = 1;\r
+                break;\r
+#endif\r
+#ifdef O_EXCL\r
+            case 'x':\r
+                exclusive = 1;\r
+                break;\r
+#endif\r
+            case 'f':\r
+                state->strategy = Z_FILTERED;\r
+                break;\r
+            case 'h':\r
+                state->strategy = Z_HUFFMAN_ONLY;\r
+                break;\r
+            case 'R':\r
+                state->strategy = Z_RLE;\r
+                break;\r
+            case 'F':\r
+                state->strategy = Z_FIXED;\r
+                break;\r
+            case 'T':\r
+                state->direct = 1;\r
+                break;\r
+            default:        /* could consider as an error, but just ignore */\r
+                ;\r
+            }\r
+        mode++;\r
+    }\r
+\r
+    /* must provide an "r", "w", or "a" */\r
+    if (state->mode == GZ_NONE) {\r
+        free(state);\r
+        return NULL;\r
+    }\r
+\r
+    /* can't force transparent read */\r
+    if (state->mode == GZ_READ) {\r
+        if (state->direct) {\r
+            free(state);\r
+            return NULL;\r
+        }\r
+        state->direct = 1;      /* for empty file */\r
+    }\r
+\r
+    /* save the path name for error messages */\r
+#ifdef _WIN32\r
+    if (fd == -2) {\r
+        len = wcstombs(NULL, path, 0);\r
+        if (len == (size_t)-1)\r
+            len = 0;\r
+    }\r
+    else\r
+#endif\r
+        len = strlen((const char *)path);\r
+    state->path = (char *)malloc(len + 1);\r
+    if (state->path == NULL) {\r
+        free(state);\r
+        return NULL;\r
+    }\r
+#ifdef _WIN32\r
+    if (fd == -2)\r
+        if (len)\r
+            wcstombs(state->path, path, len + 1);\r
+        else\r
+            *(state->path) = 0;\r
+    else\r
+#endif\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+        snprintf(state->path, len + 1, "%s", (const char *)path);\r
+#else\r
+        strcpy(state->path, path);\r
+#endif\r
+\r
+    /* compute the flags for open() */\r
+    oflag =\r
+#ifdef O_LARGEFILE\r
+        O_LARGEFILE |\r
+#endif\r
+#ifdef O_BINARY\r
+        O_BINARY |\r
+#endif\r
+#ifdef O_CLOEXEC\r
+        (cloexec ? O_CLOEXEC : 0) |\r
+#endif\r
+        (state->mode == GZ_READ ?\r
+         O_RDONLY :\r
+         (O_WRONLY | O_CREAT |\r
+#ifdef O_EXCL\r
+          (exclusive ? O_EXCL : 0) |\r
+#endif\r
+          (state->mode == GZ_WRITE ?\r
+           O_TRUNC :\r
+           O_APPEND)));\r
+\r
+    /* open the file with the appropriate flags (or just use fd) */\r
+    state->fd = fd > -1 ? fd : (\r
+#ifdef _WIN32\r
+        fd == -2 ? _wopen(path, oflag, 0666) :\r
+#endif\r
+        open((const char *)path, oflag, 0666));\r
+    if (state->fd == -1) {\r
+        free(state->path);\r
+        free(state);\r
+        return NULL;\r
+    }\r
+    if (state->mode == GZ_APPEND)\r
+        state->mode = GZ_WRITE;         /* simplify later checks */\r
+\r
+    /* save the current position for rewinding (only if reading) */\r
+    if (state->mode == GZ_READ) {\r
+        state->start = LSEEK(state->fd, 0, SEEK_CUR);\r
+        if (state->start == -1) state->start = 0;\r
+    }\r
+\r
+    /* initialize stream */\r
+    gz_reset(state);\r
+\r
+    /* return stream */\r
+    return (gzFile)state;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+gzFile ZEXPORT gzopen(path, mode)\r
+    const char *path;\r
+    const char *mode;\r
+{\r
+    return gz_open(path, -1, mode);\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+gzFile ZEXPORT gzopen64(path, mode)\r
+    const char *path;\r
+    const char *mode;\r
+{\r
+    return gz_open(path, -1, mode);\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+gzFile ZEXPORT gzdopen(fd, mode)\r
+    int fd;\r
+    const char *mode;\r
+{\r
+    char *path;         /* identifier for error messages */\r
+    gzFile gz;\r
+\r
+    if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)\r
+        return NULL;\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+    snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd); /* for debugging */\r
+#else\r
+    sprintf(path, "<fd:%d>", fd);   /* for debugging */\r
+#endif\r
+    gz = gz_open(path, fd, mode);\r
+    free(path);\r
+    return gz;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+#ifdef _WIN32\r
+gzFile ZEXPORT gzopen_w(path, mode)\r
+    const wchar_t *path;\r
+    const char *mode;\r
+{\r
+    return gz_open(path, -2, mode);\r
+}\r
+#endif\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzbuffer(file, size)\r
+    gzFile file;\r
+    unsigned size;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return -1;\r
+\r
+    /* make sure we haven't already allocated memory */\r
+    if (state->size != 0)\r
+        return -1;\r
+\r
+    /* check and set requested size */\r
+    if (size < 2)\r
+        size = 2;               /* need two bytes to check magic header */\r
+    state->want = size;\r
+    return 0;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzrewind(file)\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're reading and that there's no error */\r
+    if (state->mode != GZ_READ ||\r
+            (state->err != Z_OK && state->err != Z_BUF_ERROR))\r
+        return -1;\r
+\r
+    /* back up and start over */\r
+    if (LSEEK(state->fd, state->start, SEEK_SET) == -1)\r
+        return -1;\r
+    gz_reset(state);\r
+    return 0;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off64_t ZEXPORT gzseek64(file, offset, whence)\r
+    gzFile file;\r
+    z_off64_t offset;\r
+    int whence;\r
+{\r
+    unsigned n;\r
+    z_off64_t ret;\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return -1;\r
+\r
+    /* check that there's no error */\r
+    if (state->err != Z_OK && state->err != Z_BUF_ERROR)\r
+        return -1;\r
+\r
+    /* can only seek from start or relative to current position */\r
+    if (whence != SEEK_SET && whence != SEEK_CUR)\r
+        return -1;\r
+\r
+    /* normalize offset to a SEEK_CUR specification */\r
+    if (whence == SEEK_SET)\r
+        offset -= state->x.pos;\r
+    else if (state->seek)\r
+        offset += state->skip;\r
+    state->seek = 0;\r
+\r
+    /* if within raw area while reading, just go there */\r
+    if (state->mode == GZ_READ && state->how == COPY &&\r
+            state->x.pos + offset >= 0) {\r
+        ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);\r
+        if (ret == -1)\r
+            return -1;\r
+        state->x.have = 0;\r
+        state->eof = 0;\r
+        state->past = 0;\r
+        state->seek = 0;\r
+        gz_error(state, Z_OK, NULL);\r
+        state->strm.avail_in = 0;\r
+        state->x.pos += offset;\r
+        return state->x.pos;\r
+    }\r
+\r
+    /* calculate skip amount, rewinding if needed for back seek when reading */\r
+    if (offset < 0) {\r
+        if (state->mode != GZ_READ)         /* writing -- can't go backwards */\r
+            return -1;\r
+        offset += state->x.pos;\r
+        if (offset < 0)                     /* before start of file! */\r
+            return -1;\r
+        if (gzrewind(file) == -1)           /* rewind, then skip to offset */\r
+            return -1;\r
+    }\r
+\r
+    /* if reading, skip what's in output buffer (one less gzgetc() check) */\r
+    if (state->mode == GZ_READ) {\r
+        n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?\r
+            (unsigned)offset : state->x.have;\r
+        state->x.have -= n;\r
+        state->x.next += n;\r
+        state->x.pos += n;\r
+        offset -= n;\r
+    }\r
+\r
+    /* request skip (if not zero) */\r
+    if (offset) {\r
+        state->seek = 1;\r
+        state->skip = offset;\r
+    }\r
+    return state->x.pos + offset;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off_t ZEXPORT gzseek(file, offset, whence)\r
+    gzFile file;\r
+    z_off_t offset;\r
+    int whence;\r
+{\r
+    z_off64_t ret;\r
+\r
+    ret = gzseek64(file, (z_off64_t)offset, whence);\r
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off64_t ZEXPORT gztell64(file)\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return -1;\r
+\r
+    /* return position */\r
+    return state->x.pos + (state->seek ? state->skip : 0);\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off_t ZEXPORT gztell(file)\r
+    gzFile file;\r
+{\r
+    z_off64_t ret;\r
+\r
+    ret = gztell64(file);\r
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off64_t ZEXPORT gzoffset64(file)\r
+    gzFile file;\r
+{\r
+    z_off64_t offset;\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return -1;\r
+\r
+    /* compute and return effective offset in file */\r
+    offset = LSEEK(state->fd, 0, SEEK_CUR);\r
+    if (offset == -1)\r
+        return -1;\r
+    if (state->mode == GZ_READ)             /* reading */\r
+        offset -= state->strm.avail_in;     /* don't count buffered input */\r
+    return offset;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+z_off_t ZEXPORT gzoffset(file)\r
+    gzFile file;\r
+{\r
+    z_off64_t ret;\r
+\r
+    ret = gzoffset64(file);\r
+    return ret == (z_off_t)ret ? (z_off_t)ret : -1;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzeof(file)\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return 0;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return 0;\r
+\r
+    /* return end-of-file state */\r
+    return state->mode == GZ_READ ? state->past : 0;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+const char * ZEXPORT gzerror(file, errnum)\r
+    gzFile file;\r
+    int *errnum;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return NULL;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return NULL;\r
+\r
+    /* return error information */\r
+    if (errnum != NULL)\r
+        *errnum = state->err;\r
+    return state->err == Z_MEM_ERROR ? "out of memory" :\r
+                                       (state->msg == NULL ? "" : state->msg);\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+void ZEXPORT gzclearerr(file)\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure and check integrity */\r
+    if (file == NULL)\r
+        return;\r
+    state = (gz_statep)file;\r
+    if (state->mode != GZ_READ && state->mode != GZ_WRITE)\r
+        return;\r
+\r
+    /* clear error and end-of-file */\r
+    if (state->mode == GZ_READ) {\r
+        state->eof = 0;\r
+        state->past = 0;\r
+    }\r
+    gz_error(state, Z_OK, NULL);\r
+}\r
+\r
+/* Create an error message in allocated memory and set state->err and\r
+   state->msg accordingly.  Free any previous error message already there.  Do\r
+   not try to free or allocate space if the error is Z_MEM_ERROR (out of\r
+   memory).  Simply save the error message as a static string.  If there is an\r
+   allocation failure constructing the error message, then convert the error to\r
+   out of memory. */\r
+void ZLIB_INTERNAL gz_error(state, err, msg)\r
+    gz_statep state;\r
+    int err;\r
+    const char *msg;\r
+{\r
+    /* free previously allocated message and clear */\r
+    if (state->msg != NULL) {\r
+        if (state->err != Z_MEM_ERROR)\r
+            free(state->msg);\r
+        state->msg = NULL;\r
+    }\r
+\r
+    /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */\r
+    if (err != Z_OK && err != Z_BUF_ERROR)\r
+        state->x.have = 0;\r
+\r
+    /* set error code, and if no message, then done */\r
+    state->err = err;\r
+    if (msg == NULL)\r
+        return;\r
+\r
+    /* for an out of memory error, return literal string when requested */\r
+    if (err == Z_MEM_ERROR)\r
+        return;\r
+\r
+    /* construct error message with path */\r
+    if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==\r
+            NULL) {\r
+        state->err = Z_MEM_ERROR;\r
+        return;\r
+    }\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+    snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,\r
+             "%s%s%s", state->path, ": ", msg);\r
+#else\r
+    strcpy(state->msg, state->path);\r
+    strcat(state->msg, ": ");\r
+    strcat(state->msg, msg);\r
+#endif\r
+    return;\r
+}\r
+\r
+#ifndef INT_MAX\r
+/* portably return maximum value for an int (when limits.h presumed not\r
+   available) -- we need to do this to cover cases where 2's complement not\r
+   used, since C standard permits 1's complement and sign-bit representations,\r
+   otherwise we could just use ((unsigned)-1) >> 1 */\r
+unsigned ZLIB_INTERNAL gz_intmax()\r
+{\r
+    unsigned p, q;\r
+\r
+    p = 1;\r
+    do {\r
+        q = p;\r
+        p <<= 1;\r
+        p++;\r
+    } while (p > q);\r
+    return q >> 1;\r
+}\r
+#endif\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzread.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzread.c
new file mode 100644 (file)
index 0000000..d867e23
--- /dev/null
@@ -0,0 +1,594 @@
+/* gzread.c -- zlib functions for reading gzip files\r
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "gzguts.h"\r
+\r
+/* Local functions */\r
+local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));\r
+local int gz_avail OF((gz_statep));\r
+local int gz_look OF((gz_statep));\r
+local int gz_decomp OF((gz_statep));\r
+local int gz_fetch OF((gz_statep));\r
+local int gz_skip OF((gz_statep, z_off64_t));\r
+\r
+/* Use read() to load a buffer -- return -1 on error, otherwise 0.  Read from\r
+   state->fd, and update state->eof, state->err, and state->msg as appropriate.\r
+   This function needs to loop on read(), since read() is not guaranteed to\r
+   read the number of bytes requested, depending on the type of descriptor. */\r
+local int gz_load(state, buf, len, have)\r
+    gz_statep state;\r
+    unsigned char *buf;\r
+    unsigned len;\r
+    unsigned *have;\r
+{\r
+    int ret;\r
+\r
+    *have = 0;\r
+    do {\r
+        ret = read(state->fd, buf + *have, len - *have);\r
+        if (ret <= 0)\r
+            break;\r
+        *have += ret;\r
+    } while (*have < len);\r
+    if (ret < 0) {\r
+        gz_error(state, Z_ERRNO, zstrerror());\r
+        return -1;\r
+    }\r
+    if (ret == 0)\r
+        state->eof = 1;\r
+    return 0;\r
+}\r
+\r
+/* Load up input buffer and set eof flag if last data loaded -- return -1 on\r
+   error, 0 otherwise.  Note that the eof flag is set when the end of the input\r
+   file is reached, even though there may be unused data in the buffer.  Once\r
+   that data has been used, no more attempts will be made to read the file.\r
+   If strm->avail_in != 0, then the current data is moved to the beginning of\r
+   the input buffer, and then the remainder of the buffer is loaded with the\r
+   available data from the input file. */\r
+local int gz_avail(state)\r
+    gz_statep state;\r
+{\r
+    unsigned got;\r
+    z_streamp strm = &(state->strm);\r
+\r
+    if (state->err != Z_OK && state->err != Z_BUF_ERROR)\r
+        return -1;\r
+    if (state->eof == 0) {\r
+        if (strm->avail_in) {       /* copy what's there to the start */\r
+            unsigned char *p = state->in;\r
+            unsigned const char *q = strm->next_in;\r
+            unsigned n = strm->avail_in;\r
+            do {\r
+                *p++ = *q++;\r
+            } while (--n);\r
+        }\r
+        if (gz_load(state, state->in + strm->avail_in,\r
+                    state->size - strm->avail_in, &got) == -1)\r
+            return -1;\r
+        strm->avail_in += got;\r
+        strm->next_in = state->in;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Look for gzip header, set up for inflate or copy.  state->x.have must be 0.\r
+   If this is the first time in, allocate required memory.  state->how will be\r
+   left unchanged if there is no more input data available, will be set to COPY\r
+   if there is no gzip header and direct copying will be performed, or it will\r
+   be set to GZIP for decompression.  If direct copying, then leftover input\r
+   data from the input buffer will be copied to the output buffer.  In that\r
+   case, all further file reads will be directly to either the output buffer or\r
+   a user buffer.  If decompressing, the inflate state will be initialized.\r
+   gz_look() will return 0 on success or -1 on failure. */\r
+local int gz_look(state)\r
+    gz_statep state;\r
+{\r
+    z_streamp strm = &(state->strm);\r
+\r
+    /* allocate read buffers and inflate memory */\r
+    if (state->size == 0) {\r
+        /* allocate buffers */\r
+        state->in = (unsigned char *)malloc(state->want);\r
+        state->out = (unsigned char *)malloc(state->want << 1);\r
+        if (state->in == NULL || state->out == NULL) {\r
+            if (state->out != NULL)\r
+                free(state->out);\r
+            if (state->in != NULL)\r
+                free(state->in);\r
+            gz_error(state, Z_MEM_ERROR, "out of memory");\r
+            return -1;\r
+        }\r
+        state->size = state->want;\r
+\r
+        /* allocate inflate memory */\r
+        state->strm.zalloc = Z_NULL;\r
+        state->strm.zfree = Z_NULL;\r
+        state->strm.opaque = Z_NULL;\r
+        state->strm.avail_in = 0;\r
+        state->strm.next_in = Z_NULL;\r
+        if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) {    /* gunzip */\r
+            free(state->out);\r
+            free(state->in);\r
+            state->size = 0;\r
+            gz_error(state, Z_MEM_ERROR, "out of memory");\r
+            return -1;\r
+        }\r
+    }\r
+\r
+    /* get at least the magic bytes in the input buffer */\r
+    if (strm->avail_in < 2) {\r
+        if (gz_avail(state) == -1)\r
+            return -1;\r
+        if (strm->avail_in == 0)\r
+            return 0;\r
+    }\r
+\r
+    /* look for gzip magic bytes -- if there, do gzip decoding (note: there is\r
+       a logical dilemma here when considering the case of a partially written\r
+       gzip file, to wit, if a single 31 byte is written, then we cannot tell\r
+       whether this is a single-byte file, or just a partially written gzip\r
+       file -- for here we assume that if a gzip file is being written, then\r
+       the header will be written in a single operation, so that reading a\r
+       single byte is sufficient indication that it is not a gzip file) */\r
+    if (strm->avail_in > 1 &&\r
+            strm->next_in[0] == 31 && strm->next_in[1] == 139) {\r
+        inflateReset(strm);\r
+        state->how = GZIP;\r
+        state->direct = 0;\r
+        return 0;\r
+    }\r
+\r
+    /* no gzip header -- if we were decoding gzip before, then this is trailing\r
+       garbage.  Ignore the trailing garbage and finish. */\r
+    if (state->direct == 0) {\r
+        strm->avail_in = 0;\r
+        state->eof = 1;\r
+        state->x.have = 0;\r
+        return 0;\r
+    }\r
+\r
+    /* doing raw i/o, copy any leftover input to output -- this assumes that\r
+       the output buffer is larger than the input buffer, which also assures\r
+       space for gzungetc() */\r
+    state->x.next = state->out;\r
+    if (strm->avail_in) {\r
+        memcpy(state->x.next, strm->next_in, strm->avail_in);\r
+        state->x.have = strm->avail_in;\r
+        strm->avail_in = 0;\r
+    }\r
+    state->how = COPY;\r
+    state->direct = 1;\r
+    return 0;\r
+}\r
+\r
+/* Decompress from input to the provided next_out and avail_out in the state.\r
+   On return, state->x.have and state->x.next point to the just decompressed\r
+   data.  If the gzip stream completes, state->how is reset to LOOK to look for\r
+   the next gzip stream or raw data, once state->x.have is depleted.  Returns 0\r
+   on success, -1 on failure. */\r
+local int gz_decomp(state)\r
+    gz_statep state;\r
+{\r
+    int ret = Z_OK;\r
+    unsigned had;\r
+    z_streamp strm = &(state->strm);\r
+\r
+    /* fill output buffer up to end of deflate stream */\r
+    had = strm->avail_out;\r
+    do {\r
+        /* get more input for inflate() */\r
+        if (strm->avail_in == 0 && gz_avail(state) == -1)\r
+            return -1;\r
+        if (strm->avail_in == 0) {\r
+            gz_error(state, Z_BUF_ERROR, "unexpected end of file");\r
+            break;\r
+        }\r
+\r
+        /* decompress and handle errors */\r
+        ret = inflate(strm, Z_NO_FLUSH);\r
+        if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {\r
+            gz_error(state, Z_STREAM_ERROR,\r
+                     "internal error: inflate stream corrupt");\r
+            return -1;\r
+        }\r
+        if (ret == Z_MEM_ERROR) {\r
+            gz_error(state, Z_MEM_ERROR, "out of memory");\r
+            return -1;\r
+        }\r
+        if (ret == Z_DATA_ERROR) {              /* deflate stream invalid */\r
+            gz_error(state, Z_DATA_ERROR,\r
+                     strm->msg == NULL ? "compressed data error" : strm->msg);\r
+            return -1;\r
+        }\r
+    } while (strm->avail_out && ret != Z_STREAM_END);\r
+\r
+    /* update available output */\r
+    state->x.have = had - strm->avail_out;\r
+    state->x.next = strm->next_out - state->x.have;\r
+\r
+    /* if the gzip stream completed successfully, look for another */\r
+    if (ret == Z_STREAM_END)\r
+        state->how = LOOK;\r
+\r
+    /* good decompression */\r
+    return 0;\r
+}\r
+\r
+/* Fetch data and put it in the output buffer.  Assumes state->x.have is 0.\r
+   Data is either copied from the input file or decompressed from the input\r
+   file depending on state->how.  If state->how is LOOK, then a gzip header is\r
+   looked for to determine whether to copy or decompress.  Returns -1 on error,\r
+   otherwise 0.  gz_fetch() will leave state->how as COPY or GZIP unless the\r
+   end of the input file has been reached and all data has been processed.  */\r
+local int gz_fetch(state)\r
+    gz_statep state;\r
+{\r
+    z_streamp strm = &(state->strm);\r
+\r
+    do {\r
+        switch(state->how) {\r
+        case LOOK:      /* -> LOOK, COPY (only if never GZIP), or GZIP */\r
+            if (gz_look(state) == -1)\r
+                return -1;\r
+            if (state->how == LOOK)\r
+                return 0;\r
+            break;\r
+        case COPY:      /* -> COPY */\r
+            if (gz_load(state, state->out, state->size << 1, &(state->x.have))\r
+                    == -1)\r
+                return -1;\r
+            state->x.next = state->out;\r
+            return 0;\r
+        case GZIP:      /* -> GZIP or LOOK (if end of gzip stream) */\r
+            strm->avail_out = state->size << 1;\r
+            strm->next_out = state->out;\r
+            if (gz_decomp(state) == -1)\r
+                return -1;\r
+        }\r
+    } while (state->x.have == 0 && (!state->eof || strm->avail_in));\r
+    return 0;\r
+}\r
+\r
+/* Skip len uncompressed bytes of output.  Return -1 on error, 0 on success. */\r
+local int gz_skip(state, len)\r
+    gz_statep state;\r
+    z_off64_t len;\r
+{\r
+    unsigned n;\r
+\r
+    /* skip over len bytes or reach end-of-file, whichever comes first */\r
+    while (len)\r
+        /* skip over whatever is in output buffer */\r
+        if (state->x.have) {\r
+            n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?\r
+                (unsigned)len : state->x.have;\r
+            state->x.have -= n;\r
+            state->x.next += n;\r
+            state->x.pos += n;\r
+            len -= n;\r
+        }\r
+\r
+        /* output buffer empty -- return if we're at the end of the input */\r
+        else if (state->eof && state->strm.avail_in == 0)\r
+            break;\r
+\r
+        /* need more data to skip -- load up output buffer */\r
+        else {\r
+            /* get more output, looking for header if required */\r
+            if (gz_fetch(state) == -1)\r
+                return -1;\r
+        }\r
+    return 0;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzread(file, buf, len)\r
+    gzFile file;\r
+    voidp buf;\r
+    unsigned len;\r
+{\r
+    unsigned got, n;\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that we're reading and that there's no (serious) error */\r
+    if (state->mode != GZ_READ ||\r
+            (state->err != Z_OK && state->err != Z_BUF_ERROR))\r
+        return -1;\r
+\r
+    /* since an int is returned, make sure len fits in one, otherwise return\r
+       with an error (this avoids the flaw in the interface) */\r
+    if ((int)len < 0) {\r
+        gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");\r
+        return -1;\r
+    }\r
+\r
+    /* if len is zero, avoid unnecessary operations */\r
+    if (len == 0)\r
+        return 0;\r
+\r
+    /* process a skip request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_skip(state, state->skip) == -1)\r
+            return -1;\r
+    }\r
+\r
+    /* get len bytes to buf, or less than len if at the end */\r
+    got = 0;\r
+    do {\r
+        /* first just try copying data from the output buffer */\r
+        if (state->x.have) {\r
+            n = state->x.have > len ? len : state->x.have;\r
+            memcpy(buf, state->x.next, n);\r
+            state->x.next += n;\r
+            state->x.have -= n;\r
+        }\r
+\r
+        /* output buffer empty -- return if we're at the end of the input */\r
+        else if (state->eof && strm->avail_in == 0) {\r
+            state->past = 1;        /* tried to read past end */\r
+            break;\r
+        }\r
+\r
+        /* need output data -- for small len or new stream load up our output\r
+           buffer */\r
+        else if (state->how == LOOK || len < (state->size << 1)) {\r
+            /* get more output, looking for header if required */\r
+            if (gz_fetch(state) == -1)\r
+                return -1;\r
+            continue;       /* no progress yet -- go back to copy above */\r
+            /* the copy above assures that we will leave with space in the\r
+               output buffer, allowing at least one gzungetc() to succeed */\r
+        }\r
+\r
+        /* large len -- read directly into user buffer */\r
+        else if (state->how == COPY) {      /* read directly */\r
+            if (gz_load(state, (unsigned char *)buf, len, &n) == -1)\r
+                return -1;\r
+        }\r
+\r
+        /* large len -- decompress directly into user buffer */\r
+        else {  /* state->how == GZIP */\r
+            strm->avail_out = len;\r
+            strm->next_out = (unsigned char *)buf;\r
+            if (gz_decomp(state) == -1)\r
+                return -1;\r
+            n = state->x.have;\r
+            state->x.have = 0;\r
+        }\r
+\r
+        /* update progress */\r
+        len -= n;\r
+        buf = (char *)buf + n;\r
+        got += n;\r
+        state->x.pos += n;\r
+    } while (len);\r
+\r
+    /* return number of bytes read into user buffer (will fit in int) */\r
+    return (int)got;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+#ifdef Z_PREFIX_SET\r
+#  undef z_gzgetc\r
+#else\r
+#  undef gzgetc\r
+#endif\r
+int ZEXPORT gzgetc(file)\r
+    gzFile file;\r
+{\r
+    int ret;\r
+    unsigned char buf[1];\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're reading and that there's no (serious) error */\r
+    if (state->mode != GZ_READ ||\r
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))\r
+        return -1;\r
+\r
+    /* try output buffer (no need to check for skip request) */\r
+    if (state->x.have) {\r
+        state->x.have--;\r
+        state->x.pos++;\r
+        return *(state->x.next)++;\r
+    }\r
+\r
+    /* nothing there -- try gzread() */\r
+    ret = gzread(file, buf, 1);\r
+    return ret < 1 ? -1 : buf[0];\r
+}\r
+\r
+int ZEXPORT gzgetc_(file)\r
+gzFile file;\r
+{\r
+    return gzgetc(file);\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzungetc(c, file)\r
+    int c;\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're reading and that there's no (serious) error */\r
+    if (state->mode != GZ_READ ||\r
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))\r
+        return -1;\r
+\r
+    /* process a skip request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_skip(state, state->skip) == -1)\r
+            return -1;\r
+    }\r
+\r
+    /* can't push EOF */\r
+    if (c < 0)\r
+        return -1;\r
+\r
+    /* if output buffer empty, put byte at end (allows more pushing) */\r
+    if (state->x.have == 0) {\r
+        state->x.have = 1;\r
+        state->x.next = state->out + (state->size << 1) - 1;\r
+        state->x.next[0] = c;\r
+        state->x.pos--;\r
+        state->past = 0;\r
+        return c;\r
+    }\r
+\r
+    /* if no room, give up (must have already done a gzungetc()) */\r
+    if (state->x.have == (state->size << 1)) {\r
+        gz_error(state, Z_DATA_ERROR, "out of room to push characters");\r
+        return -1;\r
+    }\r
+\r
+    /* slide output data if needed and insert byte before existing data */\r
+    if (state->x.next == state->out) {\r
+        unsigned char *src = state->out + state->x.have;\r
+        unsigned char *dest = state->out + (state->size << 1);\r
+        while (src > state->out)\r
+            *--dest = *--src;\r
+        state->x.next = dest;\r
+    }\r
+    state->x.have++;\r
+    state->x.next--;\r
+    state->x.next[0] = c;\r
+    state->x.pos--;\r
+    state->past = 0;\r
+    return c;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+char * ZEXPORT gzgets(file, buf, len)\r
+    gzFile file;\r
+    char *buf;\r
+    int len;\r
+{\r
+    unsigned left, n;\r
+    char *str;\r
+    unsigned char *eol;\r
+    gz_statep state;\r
+\r
+    /* check parameters and get internal structure */\r
+    if (file == NULL || buf == NULL || len < 1)\r
+        return NULL;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're reading and that there's no (serious) error */\r
+    if (state->mode != GZ_READ ||\r
+        (state->err != Z_OK && state->err != Z_BUF_ERROR))\r
+        return NULL;\r
+\r
+    /* process a skip request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_skip(state, state->skip) == -1)\r
+            return NULL;\r
+    }\r
+\r
+    /* copy output bytes up to new line or len - 1, whichever comes first --\r
+       append a terminating zero to the string (we don't check for a zero in\r
+       the contents, let the user worry about that) */\r
+    str = buf;\r
+    left = (unsigned)len - 1;\r
+    if (left) do {\r
+        /* assure that something is in the output buffer */\r
+        if (state->x.have == 0 && gz_fetch(state) == -1)\r
+            return NULL;                /* error */\r
+        if (state->x.have == 0) {       /* end of file */\r
+            state->past = 1;            /* read past end */\r
+            break;                      /* return what we have */\r
+        }\r
+\r
+        /* look for end-of-line in current output buffer */\r
+        n = state->x.have > left ? left : state->x.have;\r
+        eol = (unsigned char *)memchr(state->x.next, '\n', n);\r
+        if (eol != NULL)\r
+            n = (unsigned)(eol - state->x.next) + 1;\r
+\r
+        /* copy through end-of-line, or remainder if not found */\r
+        memcpy(buf, state->x.next, n);\r
+        state->x.have -= n;\r
+        state->x.next += n;\r
+        state->x.pos += n;\r
+        left -= n;\r
+        buf += n;\r
+    } while (left && eol == NULL);\r
+\r
+    /* return terminated string, or if nothing, end of file */\r
+    if (buf == str)\r
+        return NULL;\r
+    buf[0] = 0;\r
+    return str;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzdirect(file)\r
+    gzFile file;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return 0;\r
+    state = (gz_statep)file;\r
+\r
+    /* if the state is not known, but we can find out, then do so (this is\r
+       mainly for right after a gzopen() or gzdopen()) */\r
+    if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)\r
+        (void)gz_look(state);\r
+\r
+    /* return 1 if transparent, 0 if processing a gzip stream */\r
+    return state->direct;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzclose_r(file)\r
+    gzFile file;\r
+{\r
+    int ret, err;\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return Z_STREAM_ERROR;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're reading */\r
+    if (state->mode != GZ_READ)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* free memory and close file */\r
+    if (state->size) {\r
+        inflateEnd(&(state->strm));\r
+        free(state->out);\r
+        free(state->in);\r
+    }\r
+    err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;\r
+    gz_error(state, Z_OK, NULL);\r
+    free(state->path);\r
+    ret = close(state->fd);\r
+    free(state);\r
+    return ret ? Z_ERRNO : err;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzwrite.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/gzwrite.c
new file mode 100644 (file)
index 0000000..d87a83a
--- /dev/null
@@ -0,0 +1,577 @@
+/* gzwrite.c -- zlib functions for writing gzip files\r
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "gzguts.h"\r
+\r
+/* Local functions */\r
+local int gz_init OF((gz_statep));\r
+local int gz_comp OF((gz_statep, int));\r
+local int gz_zero OF((gz_statep, z_off64_t));\r
+\r
+/* Initialize state for writing a gzip file.  Mark initialization by setting\r
+   state->size to non-zero.  Return -1 on failure or 0 on success. */\r
+local int gz_init(state)\r
+    gz_statep state;\r
+{\r
+    int ret;\r
+    z_streamp strm = &(state->strm);\r
+\r
+    /* allocate input buffer */\r
+    state->in = (unsigned char *)malloc(state->want);\r
+    if (state->in == NULL) {\r
+        gz_error(state, Z_MEM_ERROR, "out of memory");\r
+        return -1;\r
+    }\r
+\r
+    /* only need output buffer and deflate state if compressing */\r
+    if (!state->direct) {\r
+        /* allocate output buffer */\r
+        state->out = (unsigned char *)malloc(state->want);\r
+        if (state->out == NULL) {\r
+            free(state->in);\r
+            gz_error(state, Z_MEM_ERROR, "out of memory");\r
+            return -1;\r
+        }\r
+\r
+        /* allocate deflate memory, set up for gzip compression */\r
+        strm->zalloc = Z_NULL;\r
+        strm->zfree = Z_NULL;\r
+        strm->opaque = Z_NULL;\r
+        ret = deflateInit2(strm, state->level, Z_DEFLATED,\r
+                           MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);\r
+        if (ret != Z_OK) {\r
+            free(state->out);\r
+            free(state->in);\r
+            gz_error(state, Z_MEM_ERROR, "out of memory");\r
+            return -1;\r
+        }\r
+    }\r
+\r
+    /* mark state as initialized */\r
+    state->size = state->want;\r
+\r
+    /* initialize write buffer if compressing */\r
+    if (!state->direct) {\r
+        strm->avail_out = state->size;\r
+        strm->next_out = state->out;\r
+        state->x.next = strm->next_out;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Compress whatever is at avail_in and next_in and write to the output file.\r
+   Return -1 if there is an error writing to the output file, otherwise 0.\r
+   flush is assumed to be a valid deflate() flush value.  If flush is Z_FINISH,\r
+   then the deflate() state is reset to start a new gzip stream.  If gz->direct\r
+   is true, then simply write to the output file without compressing, and\r
+   ignore flush. */\r
+local int gz_comp(state, flush)\r
+    gz_statep state;\r
+    int flush;\r
+{\r
+    int ret, got;\r
+    unsigned have;\r
+    z_streamp strm = &(state->strm);\r
+\r
+    /* allocate memory if this is the first time through */\r
+    if (state->size == 0 && gz_init(state) == -1)\r
+        return -1;\r
+\r
+    /* write directly if requested */\r
+    if (state->direct) {\r
+        got = write(state->fd, strm->next_in, strm->avail_in);\r
+        if (got < 0 || (unsigned)got != strm->avail_in) {\r
+            gz_error(state, Z_ERRNO, zstrerror());\r
+            return -1;\r
+        }\r
+        strm->avail_in = 0;\r
+        return 0;\r
+    }\r
+\r
+    /* run deflate() on provided input until it produces no more output */\r
+    ret = Z_OK;\r
+    do {\r
+        /* write out current buffer contents if full, or if flushing, but if\r
+           doing Z_FINISH then don't write until we get to Z_STREAM_END */\r
+        if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&\r
+            (flush != Z_FINISH || ret == Z_STREAM_END))) {\r
+            have = (unsigned)(strm->next_out - state->x.next);\r
+            if (have && ((got = write(state->fd, state->x.next, have)) < 0 ||\r
+                         (unsigned)got != have)) {\r
+                gz_error(state, Z_ERRNO, zstrerror());\r
+                return -1;\r
+            }\r
+            if (strm->avail_out == 0) {\r
+                strm->avail_out = state->size;\r
+                strm->next_out = state->out;\r
+            }\r
+            state->x.next = strm->next_out;\r
+        }\r
+\r
+        /* compress */\r
+        have = strm->avail_out;\r
+        ret = deflate(strm, flush);\r
+        if (ret == Z_STREAM_ERROR) {\r
+            gz_error(state, Z_STREAM_ERROR,\r
+                      "internal error: deflate stream corrupt");\r
+            return -1;\r
+        }\r
+        have -= strm->avail_out;\r
+    } while (have);\r
+\r
+    /* if that completed a deflate stream, allow another to start */\r
+    if (flush == Z_FINISH)\r
+        deflateReset(strm);\r
+\r
+    /* all done, no errors */\r
+    return 0;\r
+}\r
+\r
+/* Compress len zeros to output.  Return -1 on error, 0 on success. */\r
+local int gz_zero(state, len)\r
+    gz_statep state;\r
+    z_off64_t len;\r
+{\r
+    int first;\r
+    unsigned n;\r
+    z_streamp strm = &(state->strm);\r
+\r
+    /* consume whatever's left in the input buffer */\r
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\r
+        return -1;\r
+\r
+    /* compress len zeros (len guaranteed > 0) */\r
+    first = 1;\r
+    while (len) {\r
+        n = GT_OFF(state->size) || (z_off64_t)state->size > len ?\r
+            (unsigned)len : state->size;\r
+        if (first) {\r
+            memset(state->in, 0, n);\r
+            first = 0;\r
+        }\r
+        strm->avail_in = n;\r
+        strm->next_in = state->in;\r
+        state->x.pos += n;\r
+        if (gz_comp(state, Z_NO_FLUSH) == -1)\r
+            return -1;\r
+        len -= n;\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzwrite(file, buf, len)\r
+    gzFile file;\r
+    voidpc buf;\r
+    unsigned len;\r
+{\r
+    unsigned put = len;\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return 0;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return 0;\r
+\r
+    /* since an int is returned, make sure len fits in one, otherwise return\r
+       with an error (this avoids the flaw in the interface) */\r
+    if ((int)len < 0) {\r
+        gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");\r
+        return 0;\r
+    }\r
+\r
+    /* if len is zero, avoid unnecessary operations */\r
+    if (len == 0)\r
+        return 0;\r
+\r
+    /* allocate memory if this is the first time through */\r
+    if (state->size == 0 && gz_init(state) == -1)\r
+        return 0;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return 0;\r
+    }\r
+\r
+    /* for small len, copy to input buffer, otherwise compress directly */\r
+    if (len < state->size) {\r
+        /* copy to input buffer, compress when full */\r
+        do {\r
+            unsigned have, copy;\r
+\r
+            if (strm->avail_in == 0)\r
+                strm->next_in = state->in;\r
+            have = (unsigned)((strm->next_in + strm->avail_in) - state->in);\r
+            copy = state->size - have;\r
+            if (copy > len)\r
+                copy = len;\r
+            memcpy(state->in + have, buf, copy);\r
+            strm->avail_in += copy;\r
+            state->x.pos += copy;\r
+            buf = (const char *)buf + copy;\r
+            len -= copy;\r
+            if (len && gz_comp(state, Z_NO_FLUSH) == -1)\r
+                return 0;\r
+        } while (len);\r
+    }\r
+    else {\r
+        /* consume whatever's left in the input buffer */\r
+        if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\r
+            return 0;\r
+\r
+        /* directly compress user buffer to file */\r
+        strm->avail_in = len;\r
+        strm->next_in = (z_const Bytef *)buf;\r
+        state->x.pos += len;\r
+        if (gz_comp(state, Z_NO_FLUSH) == -1)\r
+            return 0;\r
+    }\r
+\r
+    /* input was all buffered or compressed (put will fit in int) */\r
+    return (int)put;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzputc(file, c)\r
+    gzFile file;\r
+    int c;\r
+{\r
+    unsigned have;\r
+    unsigned char buf[1];\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return -1;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return -1;\r
+    }\r
+\r
+    /* try writing to input buffer for speed (state->size == 0 if buffer not\r
+       initialized) */\r
+    if (state->size) {\r
+        if (strm->avail_in == 0)\r
+            strm->next_in = state->in;\r
+        have = (unsigned)((strm->next_in + strm->avail_in) - state->in);\r
+        if (have < state->size) {\r
+            state->in[have] = c;\r
+            strm->avail_in++;\r
+            state->x.pos++;\r
+            return c & 0xff;\r
+        }\r
+    }\r
+\r
+    /* no room in buffer or not initialized, use gz_write() */\r
+    buf[0] = c;\r
+    if (gzwrite(file, buf, 1) != 1)\r
+        return -1;\r
+    return c & 0xff;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzputs(file, str)\r
+    gzFile file;\r
+    const char *str;\r
+{\r
+    int ret;\r
+    unsigned len;\r
+\r
+    /* write string */\r
+    len = (unsigned)strlen(str);\r
+    ret = gzwrite(file, str, len);\r
+    return ret == 0 && len != 0 ? -1 : ret;\r
+}\r
+\r
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)\r
+#include <stdarg.h>\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)\r
+{\r
+    int size, len;\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return 0;\r
+\r
+    /* make sure we have some buffer space */\r
+    if (state->size == 0 && gz_init(state) == -1)\r
+        return 0;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return 0;\r
+    }\r
+\r
+    /* consume whatever's left in the input buffer */\r
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\r
+        return 0;\r
+\r
+    /* do the printf() into the input buffer, put length in len */\r
+    size = (int)(state->size);\r
+    state->in[size - 1] = 0;\r
+#ifdef NO_vsnprintf\r
+#  ifdef HAS_vsprintf_void\r
+    (void)vsprintf((char *)(state->in), format, va);\r
+    for (len = 0; len < size; len++)\r
+        if (state->in[len] == 0) break;\r
+#  else\r
+    len = vsprintf((char *)(state->in), format, va);\r
+#  endif\r
+#else\r
+#  ifdef HAS_vsnprintf_void\r
+    (void)vsnprintf((char *)(state->in), size, format, va);\r
+    len = strlen((char *)(state->in));\r
+#  else\r
+    len = vsnprintf((char *)(state->in), size, format, va);\r
+#  endif\r
+#endif\r
+\r
+    /* check that printf() results fit in buffer */\r
+    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)\r
+        return 0;\r
+\r
+    /* update buffer and position, defer compression until needed */\r
+    strm->avail_in = (unsigned)len;\r
+    strm->next_in = state->in;\r
+    state->x.pos += len;\r
+    return len;\r
+}\r
+\r
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)\r
+{\r
+    va_list va;\r
+    int ret;\r
+\r
+    va_start(va, format);\r
+    ret = gzvprintf(file, format, va);\r
+    va_end(va);\r
+    return ret;\r
+}\r
+\r
+#else /* !STDC && !Z_HAVE_STDARG_H */\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,\r
+                       a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)\r
+    gzFile file;\r
+    const char *format;\r
+    int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,\r
+        a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;\r
+{\r
+    int size, len;\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that can really pass pointer in ints */\r
+    if (sizeof(int) != sizeof(void *))\r
+        return 0;\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return 0;\r
+\r
+    /* make sure we have some buffer space */\r
+    if (state->size == 0 && gz_init(state) == -1)\r
+        return 0;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return 0;\r
+    }\r
+\r
+    /* consume whatever's left in the input buffer */\r
+    if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)\r
+        return 0;\r
+\r
+    /* do the printf() into the input buffer, put length in len */\r
+    size = (int)(state->size);\r
+    state->in[size - 1] = 0;\r
+#ifdef NO_snprintf\r
+#  ifdef HAS_sprintf_void\r
+    sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,\r
+            a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\r
+    for (len = 0; len < size; len++)\r
+        if (state->in[len] == 0) break;\r
+#  else\r
+    len = sprintf((char *)(state->in), format, a1, a2, a3, a4, a5, a6, a7, a8,\r
+                  a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\r
+#  endif\r
+#else\r
+#  ifdef HAS_snprintf_void\r
+    snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6, a7, a8,\r
+             a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);\r
+    len = strlen((char *)(state->in));\r
+#  else\r
+    len = snprintf((char *)(state->in), size, format, a1, a2, a3, a4, a5, a6,\r
+                   a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18,\r
+                   a19, a20);\r
+#  endif\r
+#endif\r
+\r
+    /* check that printf() results fit in buffer */\r
+    if (len <= 0 || len >= (int)size || state->in[size - 1] != 0)\r
+        return 0;\r
+\r
+    /* update buffer and position, defer compression until needed */\r
+    strm->avail_in = (unsigned)len;\r
+    strm->next_in = state->in;\r
+    state->x.pos += len;\r
+    return len;\r
+}\r
+\r
+#endif\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzflush(file, flush)\r
+    gzFile file;\r
+    int flush;\r
+{\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return -1;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* check flush parameter */\r
+    if (flush < 0 || flush > Z_FINISH)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return -1;\r
+    }\r
+\r
+    /* compress remaining data with requested flush */\r
+    gz_comp(state, flush);\r
+    return state->err;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzsetparams(file, level, strategy)\r
+    gzFile file;\r
+    int level;\r
+    int strategy;\r
+{\r
+    gz_statep state;\r
+    z_streamp strm;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return Z_STREAM_ERROR;\r
+    state = (gz_statep)file;\r
+    strm = &(state->strm);\r
+\r
+    /* check that we're writing and that there's no error */\r
+    if (state->mode != GZ_WRITE || state->err != Z_OK)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* if no change is requested, then do nothing */\r
+    if (level == state->level && strategy == state->strategy)\r
+        return Z_OK;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            return -1;\r
+    }\r
+\r
+    /* change compression parameters for subsequent input */\r
+    if (state->size) {\r
+        /* flush previous input with previous parameters before changing */\r
+        if (strm->avail_in && gz_comp(state, Z_PARTIAL_FLUSH) == -1)\r
+            return state->err;\r
+        deflateParams(strm, level, strategy);\r
+    }\r
+    state->level = level;\r
+    state->strategy = strategy;\r
+    return Z_OK;\r
+}\r
+\r
+/* -- see zlib.h -- */\r
+int ZEXPORT gzclose_w(file)\r
+    gzFile file;\r
+{\r
+    int ret = Z_OK;\r
+    gz_statep state;\r
+\r
+    /* get internal structure */\r
+    if (file == NULL)\r
+        return Z_STREAM_ERROR;\r
+    state = (gz_statep)file;\r
+\r
+    /* check that we're writing */\r
+    if (state->mode != GZ_WRITE)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* check for seek request */\r
+    if (state->seek) {\r
+        state->seek = 0;\r
+        if (gz_zero(state, state->skip) == -1)\r
+            ret = state->err;\r
+    }\r
+\r
+    /* flush, free memory, and close file */\r
+    if (gz_comp(state, Z_FINISH) == -1)\r
+        ret = state->err;\r
+    if (state->size) {\r
+        if (!state->direct) {\r
+            (void)deflateEnd(&(state->strm));\r
+            free(state->out);\r
+        }\r
+        free(state->in);\r
+    }\r
+    gz_error(state, Z_OK, NULL);\r
+    free(state->path);\r
+    if (close(state->fd) == -1)\r
+        ret = Z_ERRNO;\r
+    free(state);\r
+    return ret;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/infback.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/infback.c
new file mode 100644 (file)
index 0000000..aa42a00
--- /dev/null
@@ -0,0 +1,640 @@
+/* infback.c -- inflate using a call-back interface\r
+ * Copyright (C) 1995-2011 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/*\r
+   This code is largely copied from inflate.c.  Normally either infback.o or\r
+   inflate.o would be linked into an application--not both.  The interface\r
+   with inffast.c is retained so that optimized assembler-coded versions of\r
+   inflate_fast() can be used with either inflate.c or infback.c.\r
+ */\r
+\r
+#include "zutil.h"\r
+#include "inftrees.h"\r
+#include "inflate.h"\r
+#include "inffast.h"\r
+\r
+/* function prototypes */\r
+local void fixedtables OF((struct inflate_state FAR *state));\r
+\r
+/*\r
+   strm provides memory allocation functions in zalloc and zfree, or\r
+   Z_NULL to use the library memory allocation functions.\r
+\r
+   windowBits is in the range 8..15, and window is a user-supplied\r
+   window and output buffer that is 2**windowBits bytes.\r
+ */\r
+int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)\r
+z_streamp strm;\r
+int windowBits;\r
+unsigned char FAR *window;\r
+const char *version;\r
+int stream_size;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\r
+        stream_size != (int)(sizeof(z_stream)))\r
+        return Z_VERSION_ERROR;\r
+    if (strm == Z_NULL || window == Z_NULL ||\r
+        windowBits < 8 || windowBits > 15)\r
+        return Z_STREAM_ERROR;\r
+    strm->msg = Z_NULL;                 /* in case we return an error */\r
+    if (strm->zalloc == (alloc_func)0) {\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+        strm->zalloc = zcalloc;\r
+        strm->opaque = (voidpf)0;\r
+#endif\r
+    }\r
+    if (strm->zfree == (free_func)0)\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+    strm->zfree = zcfree;\r
+#endif\r
+    state = (struct inflate_state FAR *)ZALLOC(strm, 1,\r
+                                               sizeof(struct inflate_state));\r
+    if (state == Z_NULL) return Z_MEM_ERROR;\r
+    Tracev((stderr, "inflate: allocated\n"));\r
+    strm->state = (struct internal_state FAR *)state;\r
+    state->dmax = 32768U;\r
+    state->wbits = windowBits;\r
+    state->wsize = 1U << windowBits;\r
+    state->window = window;\r
+    state->wnext = 0;\r
+    state->whave = 0;\r
+    return Z_OK;\r
+}\r
+\r
+/*\r
+   Return state with length and distance decoding tables and index sizes set to\r
+   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\r
+   If BUILDFIXED is defined, then instead this routine builds the tables the\r
+   first time it's called, and returns those tables the first time and\r
+   thereafter.  This reduces the size of the code by about 2K bytes, in\r
+   exchange for a little execution time.  However, BUILDFIXED should not be\r
+   used for threaded applications, since the rewriting of the tables and virgin\r
+   may not be thread-safe.\r
+ */\r
+local void fixedtables(state)\r
+struct inflate_state FAR *state;\r
+{\r
+#ifdef BUILDFIXED\r
+    static int virgin = 1;\r
+    static code *lenfix, *distfix;\r
+    static code fixed[544];\r
+\r
+    /* build fixed huffman tables if first call (may not be thread safe) */\r
+    if (virgin) {\r
+        unsigned sym, bits;\r
+        static code *next;\r
+\r
+        /* literal/length table */\r
+        sym = 0;\r
+        while (sym < 144) state->lens[sym++] = 8;\r
+        while (sym < 256) state->lens[sym++] = 9;\r
+        while (sym < 280) state->lens[sym++] = 7;\r
+        while (sym < 288) state->lens[sym++] = 8;\r
+        next = fixed;\r
+        lenfix = next;\r
+        bits = 9;\r
+        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\r
+\r
+        /* distance table */\r
+        sym = 0;\r
+        while (sym < 32) state->lens[sym++] = 5;\r
+        distfix = next;\r
+        bits = 5;\r
+        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\r
+\r
+        /* do this just once */\r
+        virgin = 0;\r
+    }\r
+#else /* !BUILDFIXED */\r
+#   include "inffixed.h"\r
+#endif /* BUILDFIXED */\r
+    state->lencode = lenfix;\r
+    state->lenbits = 9;\r
+    state->distcode = distfix;\r
+    state->distbits = 5;\r
+}\r
+\r
+/* Macros for inflateBack(): */\r
+\r
+/* Load returned state from inflate_fast() */\r
+#define LOAD() \\r
+    do { \\r
+        put = strm->next_out; \\r
+        left = strm->avail_out; \\r
+        next = strm->next_in; \\r
+        have = strm->avail_in; \\r
+        hold = state->hold; \\r
+        bits = state->bits; \\r
+    } while (0)\r
+\r
+/* Set state from registers for inflate_fast() */\r
+#define RESTORE() \\r
+    do { \\r
+        strm->next_out = put; \\r
+        strm->avail_out = left; \\r
+        strm->next_in = next; \\r
+        strm->avail_in = have; \\r
+        state->hold = hold; \\r
+        state->bits = bits; \\r
+    } while (0)\r
+\r
+/* Clear the input bit accumulator */\r
+#define INITBITS() \\r
+    do { \\r
+        hold = 0; \\r
+        bits = 0; \\r
+    } while (0)\r
+\r
+/* Assure that some input is available.  If input is requested, but denied,\r
+   then return a Z_BUF_ERROR from inflateBack(). */\r
+#define PULL() \\r
+    do { \\r
+        if (have == 0) { \\r
+            have = in(in_desc, &next); \\r
+            if (have == 0) { \\r
+                next = Z_NULL; \\r
+                ret = Z_BUF_ERROR; \\r
+                goto inf_leave; \\r
+            } \\r
+        } \\r
+    } while (0)\r
+\r
+/* Get a byte of input into the bit accumulator, or return from inflateBack()\r
+   with an error if there is no input available. */\r
+#define PULLBYTE() \\r
+    do { \\r
+        PULL(); \\r
+        have--; \\r
+        hold += (unsigned long)(*next++) << bits; \\r
+        bits += 8; \\r
+    } while (0)\r
+\r
+/* Assure that there are at least n bits in the bit accumulator.  If there is\r
+   not enough available input to do that, then return from inflateBack() with\r
+   an error. */\r
+#define NEEDBITS(n) \\r
+    do { \\r
+        while (bits < (unsigned)(n)) \\r
+            PULLBYTE(); \\r
+    } while (0)\r
+\r
+/* Return the low n bits of the bit accumulator (n < 16) */\r
+#define BITS(n) \\r
+    ((unsigned)hold & ((1U << (n)) - 1))\r
+\r
+/* Remove n bits from the bit accumulator */\r
+#define DROPBITS(n) \\r
+    do { \\r
+        hold >>= (n); \\r
+        bits -= (unsigned)(n); \\r
+    } while (0)\r
+\r
+/* Remove zero to seven bits as needed to go to a byte boundary */\r
+#define BYTEBITS() \\r
+    do { \\r
+        hold >>= bits & 7; \\r
+        bits -= bits & 7; \\r
+    } while (0)\r
+\r
+/* Assure that some output space is available, by writing out the window\r
+   if it's full.  If the write fails, return from inflateBack() with a\r
+   Z_BUF_ERROR. */\r
+#define ROOM() \\r
+    do { \\r
+        if (left == 0) { \\r
+            put = state->window; \\r
+            left = state->wsize; \\r
+            state->whave = left; \\r
+            if (out(out_desc, put, left)) { \\r
+                ret = Z_BUF_ERROR; \\r
+                goto inf_leave; \\r
+            } \\r
+        } \\r
+    } while (0)\r
+\r
+/*\r
+   strm provides the memory allocation functions and window buffer on input,\r
+   and provides information on the unused input on return.  For Z_DATA_ERROR\r
+   returns, strm will also provide an error message.\r
+\r
+   in() and out() are the call-back input and output functions.  When\r
+   inflateBack() needs more input, it calls in().  When inflateBack() has\r
+   filled the window with output, or when it completes with data in the\r
+   window, it calls out() to write out the data.  The application must not\r
+   change the provided input until in() is called again or inflateBack()\r
+   returns.  The application must not change the window/output buffer until\r
+   inflateBack() returns.\r
+\r
+   in() and out() are called with a descriptor parameter provided in the\r
+   inflateBack() call.  This parameter can be a structure that provides the\r
+   information required to do the read or write, as well as accumulated\r
+   information on the input and output such as totals and check values.\r
+\r
+   in() should return zero on failure.  out() should return non-zero on\r
+   failure.  If either in() or out() fails, than inflateBack() returns a\r
+   Z_BUF_ERROR.  strm->next_in can be checked for Z_NULL to see whether it\r
+   was in() or out() that caused in the error.  Otherwise,  inflateBack()\r
+   returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format\r
+   error, or Z_MEM_ERROR if it could not allocate memory for the state.\r
+   inflateBack() can also return Z_STREAM_ERROR if the input parameters\r
+   are not correct, i.e. strm is Z_NULL or the state was not initialized.\r
+ */\r
+int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)\r
+z_streamp strm;\r
+in_func in;\r
+void FAR *in_desc;\r
+out_func out;\r
+void FAR *out_desc;\r
+{\r
+    struct inflate_state FAR *state;\r
+    z_const unsigned char FAR *next;    /* next input */\r
+    unsigned char FAR *put;     /* next output */\r
+    unsigned have, left;        /* available input and output */\r
+    unsigned long hold;         /* bit buffer */\r
+    unsigned bits;              /* bits in bit buffer */\r
+    unsigned copy;              /* number of stored or match bytes to copy */\r
+    unsigned char FAR *from;    /* where to copy match bytes from */\r
+    code here;                  /* current decoding table entry */\r
+    code last;                  /* parent table entry */\r
+    unsigned len;               /* length to copy for repeats, bits to drop */\r
+    int ret;                    /* return code */\r
+    static const unsigned short order[19] = /* permutation of code lengths */\r
+        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\r
+\r
+    /* Check that the strm exists and that the state was initialized */\r
+    if (strm == Z_NULL || strm->state == Z_NULL)\r
+        return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+\r
+    /* Reset the state */\r
+    strm->msg = Z_NULL;\r
+    state->mode = TYPE;\r
+    state->last = 0;\r
+    state->whave = 0;\r
+    next = strm->next_in;\r
+    have = next != Z_NULL ? strm->avail_in : 0;\r
+    hold = 0;\r
+    bits = 0;\r
+    put = state->window;\r
+    left = state->wsize;\r
+\r
+    /* Inflate until end of block marked as last */\r
+    for (;;)\r
+        switch (state->mode) {\r
+        case TYPE:\r
+            /* determine and dispatch block type */\r
+            if (state->last) {\r
+                BYTEBITS();\r
+                state->mode = DONE;\r
+                break;\r
+            }\r
+            NEEDBITS(3);\r
+            state->last = BITS(1);\r
+            DROPBITS(1);\r
+            switch (BITS(2)) {\r
+            case 0:                             /* stored block */\r
+                Tracev((stderr, "inflate:     stored block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = STORED;\r
+                break;\r
+            case 1:                             /* fixed block */\r
+                fixedtables(state);\r
+                Tracev((stderr, "inflate:     fixed codes block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = LEN;              /* decode codes */\r
+                break;\r
+            case 2:                             /* dynamic block */\r
+                Tracev((stderr, "inflate:     dynamic codes block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = TABLE;\r
+                break;\r
+            case 3:\r
+                strm->msg = (char *)"invalid block type";\r
+                state->mode = BAD;\r
+            }\r
+            DROPBITS(2);\r
+            break;\r
+\r
+        case STORED:\r
+            /* get and verify stored block length */\r
+            BYTEBITS();                         /* go to byte boundary */\r
+            NEEDBITS(32);\r
+            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\r
+                strm->msg = (char *)"invalid stored block lengths";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->length = (unsigned)hold & 0xffff;\r
+            Tracev((stderr, "inflate:       stored length %u\n",\r
+                    state->length));\r
+            INITBITS();\r
+\r
+            /* copy stored block from input to output */\r
+            while (state->length != 0) {\r
+                copy = state->length;\r
+                PULL();\r
+                ROOM();\r
+                if (copy > have) copy = have;\r
+                if (copy > left) copy = left;\r
+                zmemcpy(put, next, copy);\r
+                have -= copy;\r
+                next += copy;\r
+                left -= copy;\r
+                put += copy;\r
+                state->length -= copy;\r
+            }\r
+            Tracev((stderr, "inflate:       stored end\n"));\r
+            state->mode = TYPE;\r
+            break;\r
+\r
+        case TABLE:\r
+            /* get dynamic table entries descriptor */\r
+            NEEDBITS(14);\r
+            state->nlen = BITS(5) + 257;\r
+            DROPBITS(5);\r
+            state->ndist = BITS(5) + 1;\r
+            DROPBITS(5);\r
+            state->ncode = BITS(4) + 4;\r
+            DROPBITS(4);\r
+#ifndef PKZIP_BUG_WORKAROUND\r
+            if (state->nlen > 286 || state->ndist > 30) {\r
+                strm->msg = (char *)"too many length or distance symbols";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+#endif\r
+            Tracev((stderr, "inflate:       table sizes ok\n"));\r
+\r
+            /* get code length code lengths (not a typo) */\r
+            state->have = 0;\r
+            while (state->have < state->ncode) {\r
+                NEEDBITS(3);\r
+                state->lens[order[state->have++]] = (unsigned short)BITS(3);\r
+                DROPBITS(3);\r
+            }\r
+            while (state->have < 19)\r
+                state->lens[order[state->have++]] = 0;\r
+            state->next = state->codes;\r
+            state->lencode = (code const FAR *)(state->next);\r
+            state->lenbits = 7;\r
+            ret = inflate_table(CODES, state->lens, 19, &(state->next),\r
+                                &(state->lenbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid code lengths set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            Tracev((stderr, "inflate:       code lengths ok\n"));\r
+\r
+            /* get length and distance code code lengths */\r
+            state->have = 0;\r
+            while (state->have < state->nlen + state->ndist) {\r
+                for (;;) {\r
+                    here = state->lencode[BITS(state->lenbits)];\r
+                    if ((unsigned)(here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                if (here.val < 16) {\r
+                    DROPBITS(here.bits);\r
+                    state->lens[state->have++] = here.val;\r
+                }\r
+                else {\r
+                    if (here.val == 16) {\r
+                        NEEDBITS(here.bits + 2);\r
+                        DROPBITS(here.bits);\r
+                        if (state->have == 0) {\r
+                            strm->msg = (char *)"invalid bit length repeat";\r
+                            state->mode = BAD;\r
+                            break;\r
+                        }\r
+                        len = (unsigned)(state->lens[state->have - 1]);\r
+                        copy = 3 + BITS(2);\r
+                        DROPBITS(2);\r
+                    }\r
+                    else if (here.val == 17) {\r
+                        NEEDBITS(here.bits + 3);\r
+                        DROPBITS(here.bits);\r
+                        len = 0;\r
+                        copy = 3 + BITS(3);\r
+                        DROPBITS(3);\r
+                    }\r
+                    else {\r
+                        NEEDBITS(here.bits + 7);\r
+                        DROPBITS(here.bits);\r
+                        len = 0;\r
+                        copy = 11 + BITS(7);\r
+                        DROPBITS(7);\r
+                    }\r
+                    if (state->have + copy > state->nlen + state->ndist) {\r
+                        strm->msg = (char *)"invalid bit length repeat";\r
+                        state->mode = BAD;\r
+                        break;\r
+                    }\r
+                    while (copy--)\r
+                        state->lens[state->have++] = (unsigned short)len;\r
+                }\r
+            }\r
+\r
+            /* handle error breaks in while */\r
+            if (state->mode == BAD) break;\r
+\r
+            /* check for end-of-block code (better have one) */\r
+            if (state->lens[256] == 0) {\r
+                strm->msg = (char *)"invalid code -- missing end-of-block";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+\r
+            /* build code tables -- note: do not change the lenbits or distbits\r
+               values here (9 and 6) without reading the comments in inftrees.h\r
+               concerning the ENOUGH constants, which depend on those values */\r
+            state->next = state->codes;\r
+            state->lencode = (code const FAR *)(state->next);\r
+            state->lenbits = 9;\r
+            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\r
+                                &(state->lenbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid literal/lengths set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->distcode = (code const FAR *)(state->next);\r
+            state->distbits = 6;\r
+            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\r
+                            &(state->next), &(state->distbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid distances set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            Tracev((stderr, "inflate:       codes ok\n"));\r
+            state->mode = LEN;\r
+\r
+        case LEN:\r
+            /* use inflate_fast() if we have enough input and output */\r
+            if (have >= 6 && left >= 258) {\r
+                RESTORE();\r
+                if (state->whave < state->wsize)\r
+                    state->whave = state->wsize - left;\r
+                inflate_fast(strm, state->wsize);\r
+                LOAD();\r
+                break;\r
+            }\r
+\r
+            /* get a literal, length, or end-of-block code */\r
+            for (;;) {\r
+                here = state->lencode[BITS(state->lenbits)];\r
+                if ((unsigned)(here.bits) <= bits) break;\r
+                PULLBYTE();\r
+            }\r
+            if (here.op && (here.op & 0xf0) == 0) {\r
+                last = here;\r
+                for (;;) {\r
+                    here = state->lencode[last.val +\r
+                            (BITS(last.bits + last.op) >> last.bits)];\r
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                DROPBITS(last.bits);\r
+            }\r
+            DROPBITS(here.bits);\r
+            state->length = (unsigned)here.val;\r
+\r
+            /* process literal */\r
+            if (here.op == 0) {\r
+                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\r
+                        "inflate:         literal '%c'\n" :\r
+                        "inflate:         literal 0x%02x\n", here.val));\r
+                ROOM();\r
+                *put++ = (unsigned char)(state->length);\r
+                left--;\r
+                state->mode = LEN;\r
+                break;\r
+            }\r
+\r
+            /* process end of block */\r
+            if (here.op & 32) {\r
+                Tracevv((stderr, "inflate:         end of block\n"));\r
+                state->mode = TYPE;\r
+                break;\r
+            }\r
+\r
+            /* invalid code */\r
+            if (here.op & 64) {\r
+                strm->msg = (char *)"invalid literal/length code";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+\r
+            /* length code -- get extra bits, if any */\r
+            state->extra = (unsigned)(here.op) & 15;\r
+            if (state->extra != 0) {\r
+                NEEDBITS(state->extra);\r
+                state->length += BITS(state->extra);\r
+                DROPBITS(state->extra);\r
+            }\r
+            Tracevv((stderr, "inflate:         length %u\n", state->length));\r
+\r
+            /* get distance code */\r
+            for (;;) {\r
+                here = state->distcode[BITS(state->distbits)];\r
+                if ((unsigned)(here.bits) <= bits) break;\r
+                PULLBYTE();\r
+            }\r
+            if ((here.op & 0xf0) == 0) {\r
+                last = here;\r
+                for (;;) {\r
+                    here = state->distcode[last.val +\r
+                            (BITS(last.bits + last.op) >> last.bits)];\r
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                DROPBITS(last.bits);\r
+            }\r
+            DROPBITS(here.bits);\r
+            if (here.op & 64) {\r
+                strm->msg = (char *)"invalid distance code";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->offset = (unsigned)here.val;\r
+\r
+            /* get distance extra bits, if any */\r
+            state->extra = (unsigned)(here.op) & 15;\r
+            if (state->extra != 0) {\r
+                NEEDBITS(state->extra);\r
+                state->offset += BITS(state->extra);\r
+                DROPBITS(state->extra);\r
+            }\r
+            if (state->offset > state->wsize - (state->whave < state->wsize ?\r
+                                                left : 0)) {\r
+                strm->msg = (char *)"invalid distance too far back";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            Tracevv((stderr, "inflate:         distance %u\n", state->offset));\r
+\r
+            /* copy match from window to output */\r
+            do {\r
+                ROOM();\r
+                copy = state->wsize - state->offset;\r
+                if (copy < left) {\r
+                    from = put + copy;\r
+                    copy = left - copy;\r
+                }\r
+                else {\r
+                    from = put - state->offset;\r
+                    copy = left;\r
+                }\r
+                if (copy > state->length) copy = state->length;\r
+                state->length -= copy;\r
+                left -= copy;\r
+                do {\r
+                    *put++ = *from++;\r
+                } while (--copy);\r
+            } while (state->length != 0);\r
+            break;\r
+\r
+        case DONE:\r
+            /* inflate stream terminated properly -- write leftover output */\r
+            ret = Z_STREAM_END;\r
+            if (left < state->wsize) {\r
+                if (out(out_desc, state->window, state->wsize - left))\r
+                    ret = Z_BUF_ERROR;\r
+            }\r
+            goto inf_leave;\r
+\r
+        case BAD:\r
+            ret = Z_DATA_ERROR;\r
+            goto inf_leave;\r
+\r
+        default:                /* can't happen, but makes compilers happy */\r
+            ret = Z_STREAM_ERROR;\r
+            goto inf_leave;\r
+        }\r
+\r
+    /* Return unused input */\r
+  inf_leave:\r
+    strm->next_in = next;\r
+    strm->avail_in = have;\r
+    return ret;\r
+}\r
+\r
+int ZEXPORT inflateBackEnd(strm)\r
+z_streamp strm;\r
+{\r
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\r
+        return Z_STREAM_ERROR;\r
+    ZFREE(strm, strm->state);\r
+    strm->state = Z_NULL;\r
+    Tracev((stderr, "inflate: end\n"));\r
+    return Z_OK;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.c
new file mode 100644 (file)
index 0000000..38446d8
--- /dev/null
@@ -0,0 +1,340 @@
+/* inffast.c -- fast decoding\r
+ * Copyright (C) 1995-2008, 2010, 2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "zutil.h"\r
+#include "inftrees.h"\r
+#include "inflate.h"\r
+#include "inffast.h"\r
+\r
+#ifndef ASMINF\r
+\r
+/* Allow machine dependent optimization for post-increment or pre-increment.\r
+   Based on testing to date,\r
+   Pre-increment preferred for:\r
+   - PowerPC G3 (Adler)\r
+   - MIPS R5000 (Randers-Pehrson)\r
+   Post-increment preferred for:\r
+   - none\r
+   No measurable difference:\r
+   - Pentium III (Anderson)\r
+   - M68060 (Nikl)\r
+ */\r
+#ifdef POSTINC\r
+#  define OFF 0\r
+#  define PUP(a) *(a)++\r
+#else\r
+#  define OFF 1\r
+#  define PUP(a) *++(a)\r
+#endif\r
+\r
+/*\r
+   Decode literal, length, and distance codes and write out the resulting\r
+   literal and match bytes until either not enough input or output is\r
+   available, an end-of-block is encountered, or a data error is encountered.\r
+   When large enough input and output buffers are supplied to inflate(), for\r
+   example, a 16K input buffer and a 64K output buffer, more than 95% of the\r
+   inflate execution time is spent in this routine.\r
+\r
+   Entry assumptions:\r
+\r
+        state->mode == LEN\r
+        strm->avail_in >= 6\r
+        strm->avail_out >= 258\r
+        start >= strm->avail_out\r
+        state->bits < 8\r
+\r
+   On return, state->mode is one of:\r
+\r
+        LEN -- ran out of enough output space or enough available input\r
+        TYPE -- reached end of block code, inflate() to interpret next block\r
+        BAD -- error in block data\r
+\r
+   Notes:\r
+\r
+    - The maximum input bits used by a length/distance pair is 15 bits for the\r
+      length code, 5 bits for the length extra, 15 bits for the distance code,\r
+      and 13 bits for the distance extra.  This totals 48 bits, or six bytes.\r
+      Therefore if strm->avail_in >= 6, then there is enough input to avoid\r
+      checking for available input while decoding.\r
+\r
+    - The maximum bytes that a single length/distance pair can output is 258\r
+      bytes, which is the maximum length that can be coded.  inflate_fast()\r
+      requires strm->avail_out >= 258 for each loop to avoid checking for\r
+      output space.\r
+ */\r
+void ZLIB_INTERNAL inflate_fast(strm, start)\r
+z_streamp strm;\r
+unsigned start;         /* inflate()'s starting value for strm->avail_out */\r
+{\r
+    struct inflate_state FAR *state;\r
+    z_const unsigned char FAR *in;      /* local strm->next_in */\r
+    z_const unsigned char FAR *last;    /* have enough input while in < last */\r
+    unsigned char FAR *out;     /* local strm->next_out */\r
+    unsigned char FAR *beg;     /* inflate()'s initial strm->next_out */\r
+    unsigned char FAR *end;     /* while out < end, enough space available */\r
+#ifdef INFLATE_STRICT\r
+    unsigned dmax;              /* maximum distance from zlib header */\r
+#endif\r
+    unsigned wsize;             /* window size or zero if not using window */\r
+    unsigned whave;             /* valid bytes in the window */\r
+    unsigned wnext;             /* window write index */\r
+    unsigned char FAR *window;  /* allocated sliding window, if wsize != 0 */\r
+    unsigned long hold;         /* local strm->hold */\r
+    unsigned bits;              /* local strm->bits */\r
+    code const FAR *lcode;      /* local strm->lencode */\r
+    code const FAR *dcode;      /* local strm->distcode */\r
+    unsigned lmask;             /* mask for first level of length codes */\r
+    unsigned dmask;             /* mask for first level of distance codes */\r
+    code here;                  /* retrieved table entry */\r
+    unsigned op;                /* code bits, operation, extra bits, or */\r
+                                /*  window position, window bytes to copy */\r
+    unsigned len;               /* match length, unused bytes */\r
+    unsigned dist;              /* match distance */\r
+    unsigned char FAR *from;    /* where to copy match from */\r
+\r
+    /* copy state to local variables */\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    in = strm->next_in - OFF;\r
+    last = in + (strm->avail_in - 5);\r
+    out = strm->next_out - OFF;\r
+    beg = out - (start - strm->avail_out);\r
+    end = out + (strm->avail_out - 257);\r
+#ifdef INFLATE_STRICT\r
+    dmax = state->dmax;\r
+#endif\r
+    wsize = state->wsize;\r
+    whave = state->whave;\r
+    wnext = state->wnext;\r
+    window = state->window;\r
+    hold = state->hold;\r
+    bits = state->bits;\r
+    lcode = state->lencode;\r
+    dcode = state->distcode;\r
+    lmask = (1U << state->lenbits) - 1;\r
+    dmask = (1U << state->distbits) - 1;\r
+\r
+    /* decode literals and length/distances until end-of-block or not enough\r
+       input data or output space */\r
+    do {\r
+        if (bits < 15) {\r
+            hold += (unsigned long)(PUP(in)) << bits;\r
+            bits += 8;\r
+            hold += (unsigned long)(PUP(in)) << bits;\r
+            bits += 8;\r
+        }\r
+        here = lcode[hold & lmask];\r
+      dolen:\r
+        op = (unsigned)(here.bits);\r
+        hold >>= op;\r
+        bits -= op;\r
+        op = (unsigned)(here.op);\r
+        if (op == 0) {                          /* literal */\r
+            Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\r
+                    "inflate:         literal '%c'\n" :\r
+                    "inflate:         literal 0x%02x\n", here.val));\r
+            PUP(out) = (unsigned char)(here.val);\r
+        }\r
+        else if (op & 16) {                     /* length base */\r
+            len = (unsigned)(here.val);\r
+            op &= 15;                           /* number of extra bits */\r
+            if (op) {\r
+                if (bits < op) {\r
+                    hold += (unsigned long)(PUP(in)) << bits;\r
+                    bits += 8;\r
+                }\r
+                len += (unsigned)hold & ((1U << op) - 1);\r
+                hold >>= op;\r
+                bits -= op;\r
+            }\r
+            Tracevv((stderr, "inflate:         length %u\n", len));\r
+            if (bits < 15) {\r
+                hold += (unsigned long)(PUP(in)) << bits;\r
+                bits += 8;\r
+                hold += (unsigned long)(PUP(in)) << bits;\r
+                bits += 8;\r
+            }\r
+            here = dcode[hold & dmask];\r
+          dodist:\r
+            op = (unsigned)(here.bits);\r
+            hold >>= op;\r
+            bits -= op;\r
+            op = (unsigned)(here.op);\r
+            if (op & 16) {                      /* distance base */\r
+                dist = (unsigned)(here.val);\r
+                op &= 15;                       /* number of extra bits */\r
+                if (bits < op) {\r
+                    hold += (unsigned long)(PUP(in)) << bits;\r
+                    bits += 8;\r
+                    if (bits < op) {\r
+                        hold += (unsigned long)(PUP(in)) << bits;\r
+                        bits += 8;\r
+                    }\r
+                }\r
+                dist += (unsigned)hold & ((1U << op) - 1);\r
+#ifdef INFLATE_STRICT\r
+                if (dist > dmax) {\r
+                    strm->msg = (char *)"invalid distance too far back";\r
+                    state->mode = BAD;\r
+                    break;\r
+                }\r
+#endif\r
+                hold >>= op;\r
+                bits -= op;\r
+                Tracevv((stderr, "inflate:         distance %u\n", dist));\r
+                op = (unsigned)(out - beg);     /* max distance in output */\r
+                if (dist > op) {                /* see if copy from window */\r
+                    op = dist - op;             /* distance back in window */\r
+                    if (op > whave) {\r
+                        if (state->sane) {\r
+                            strm->msg =\r
+                                (char *)"invalid distance too far back";\r
+                            state->mode = BAD;\r
+                            break;\r
+                        }\r
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\r
+                        if (len <= op - whave) {\r
+                            do {\r
+                                PUP(out) = 0;\r
+                            } while (--len);\r
+                            continue;\r
+                        }\r
+                        len -= op - whave;\r
+                        do {\r
+                            PUP(out) = 0;\r
+                        } while (--op > whave);\r
+                        if (op == 0) {\r
+                            from = out - dist;\r
+                            do {\r
+                                PUP(out) = PUP(from);\r
+                            } while (--len);\r
+                            continue;\r
+                        }\r
+#endif\r
+                    }\r
+                    from = window - OFF;\r
+                    if (wnext == 0) {           /* very common case */\r
+                        from += wsize - op;\r
+                        if (op < len) {         /* some from window */\r
+                            len -= op;\r
+                            do {\r
+                                PUP(out) = PUP(from);\r
+                            } while (--op);\r
+                            from = out - dist;  /* rest from output */\r
+                        }\r
+                    }\r
+                    else if (wnext < op) {      /* wrap around window */\r
+                        from += wsize + wnext - op;\r
+                        op -= wnext;\r
+                        if (op < len) {         /* some from end of window */\r
+                            len -= op;\r
+                            do {\r
+                                PUP(out) = PUP(from);\r
+                            } while (--op);\r
+                            from = window - OFF;\r
+                            if (wnext < len) {  /* some from start of window */\r
+                                op = wnext;\r
+                                len -= op;\r
+                                do {\r
+                                    PUP(out) = PUP(from);\r
+                                } while (--op);\r
+                                from = out - dist;      /* rest from output */\r
+                            }\r
+                        }\r
+                    }\r
+                    else {                      /* contiguous in window */\r
+                        from += wnext - op;\r
+                        if (op < len) {         /* some from window */\r
+                            len -= op;\r
+                            do {\r
+                                PUP(out) = PUP(from);\r
+                            } while (--op);\r
+                            from = out - dist;  /* rest from output */\r
+                        }\r
+                    }\r
+                    while (len > 2) {\r
+                        PUP(out) = PUP(from);\r
+                        PUP(out) = PUP(from);\r
+                        PUP(out) = PUP(from);\r
+                        len -= 3;\r
+                    }\r
+                    if (len) {\r
+                        PUP(out) = PUP(from);\r
+                        if (len > 1)\r
+                            PUP(out) = PUP(from);\r
+                    }\r
+                }\r
+                else {\r
+                    from = out - dist;          /* copy direct from output */\r
+                    do {                        /* minimum length is three */\r
+                        PUP(out) = PUP(from);\r
+                        PUP(out) = PUP(from);\r
+                        PUP(out) = PUP(from);\r
+                        len -= 3;\r
+                    } while (len > 2);\r
+                    if (len) {\r
+                        PUP(out) = PUP(from);\r
+                        if (len > 1)\r
+                            PUP(out) = PUP(from);\r
+                    }\r
+                }\r
+            }\r
+            else if ((op & 64) == 0) {          /* 2nd level distance code */\r
+                here = dcode[here.val + (hold & ((1U << op) - 1))];\r
+                goto dodist;\r
+            }\r
+            else {\r
+                strm->msg = (char *)"invalid distance code";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+        }\r
+        else if ((op & 64) == 0) {              /* 2nd level length code */\r
+            here = lcode[here.val + (hold & ((1U << op) - 1))];\r
+            goto dolen;\r
+        }\r
+        else if (op & 32) {                     /* end-of-block */\r
+            Tracevv((stderr, "inflate:         end of block\n"));\r
+            state->mode = TYPE;\r
+            break;\r
+        }\r
+        else {\r
+            strm->msg = (char *)"invalid literal/length code";\r
+            state->mode = BAD;\r
+            break;\r
+        }\r
+    } while (in < last && out < end);\r
+\r
+    /* return unused bytes (on entry, bits < 8, so in won't go too far back) */\r
+    len = bits >> 3;\r
+    in -= len;\r
+    bits -= len << 3;\r
+    hold &= (1U << bits) - 1;\r
+\r
+    /* update state and return */\r
+    strm->next_in = in + OFF;\r
+    strm->next_out = out + OFF;\r
+    strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));\r
+    strm->avail_out = (unsigned)(out < end ?\r
+                                 257 + (end - out) : 257 - (out - end));\r
+    state->hold = hold;\r
+    state->bits = bits;\r
+    return;\r
+}\r
+\r
+/*\r
+   inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):\r
+   - Using bit fields for code structure\r
+   - Different op definition to avoid & for extra bits (do & for table bits)\r
+   - Three separate decoding do-loops for direct, window, and wnext == 0\r
+   - Special case for distance > 1 copies to do overlapped load and store copy\r
+   - Explicit branch predictions (based on measured branch probabilities)\r
+   - Deferring match copy and interspersed it with decoding subsequent codes\r
+   - Swapping literal/length else\r
+   - Swapping window/direct else\r
+   - Larger unrolled copy loops (three is about right)\r
+   - Moving len -= 3 statement into middle of loop\r
+ */\r
+\r
+#endif /* !ASMINF */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffast.h
new file mode 100644 (file)
index 0000000..e1e6db4
--- /dev/null
@@ -0,0 +1,11 @@
+/* inffast.h -- header to use inffast.c\r
+ * Copyright (C) 1995-2003, 2010 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* WARNING: this file should *not* be used by applications. It is\r
+   part of the implementation of the compression library and is\r
+   subject to change. Applications should only use zlib.h.\r
+ */\r
+\r
+void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffixed.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inffixed.h
new file mode 100644 (file)
index 0000000..0b29a5a
--- /dev/null
@@ -0,0 +1,94 @@
+    /* inffixed.h -- table for decoding fixed codes\r
+     * Generated automatically by makefixed().\r
+     */\r
+\r
+    /* WARNING: this file should *not* be used by applications.\r
+       It is part of the implementation of this library and is\r
+       subject to change. Applications should only use zlib.h.\r
+     */\r
+\r
+    static const code lenfix[512] = {\r
+        {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},\r
+        {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},\r
+        {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},\r
+        {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},\r
+        {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},\r
+        {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},\r
+        {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},\r
+        {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},\r
+        {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},\r
+        {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},\r
+        {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},\r
+        {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},\r
+        {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},\r
+        {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},\r
+        {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},\r
+        {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},\r
+        {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},\r
+        {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},\r
+        {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},\r
+        {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},\r
+        {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},\r
+        {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},\r
+        {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},\r
+        {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},\r
+        {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},\r
+        {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},\r
+        {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},\r
+        {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},\r
+        {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},\r
+        {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},\r
+        {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},\r
+        {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},\r
+        {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},\r
+        {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},\r
+        {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},\r
+        {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},\r
+        {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},\r
+        {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},\r
+        {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},\r
+        {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},\r
+        {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},\r
+        {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},\r
+        {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},\r
+        {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},\r
+        {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},\r
+        {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},\r
+        {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},\r
+        {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},\r
+        {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},\r
+        {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},\r
+        {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},\r
+        {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},\r
+        {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},\r
+        {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},\r
+        {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},\r
+        {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},\r
+        {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},\r
+        {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},\r
+        {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},\r
+        {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},\r
+        {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},\r
+        {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},\r
+        {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},\r
+        {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},\r
+        {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},\r
+        {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},\r
+        {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},\r
+        {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},\r
+        {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},\r
+        {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},\r
+        {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},\r
+        {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},\r
+        {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},\r
+        {0,9,255}\r
+    };\r
+\r
+    static const code distfix[32] = {\r
+        {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},\r
+        {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},\r
+        {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},\r
+        {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},\r
+        {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},\r
+        {22,5,193},{64,5,0}\r
+    };\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.c
new file mode 100644 (file)
index 0000000..e43d999
--- /dev/null
@@ -0,0 +1,1512 @@
+/* inflate.c -- zlib decompression\r
+ * Copyright (C) 1995-2012 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/*\r
+ * Change history:\r
+ *\r
+ * 1.2.beta0    24 Nov 2002\r
+ * - First version -- complete rewrite of inflate to simplify code, avoid\r
+ *   creation of window when not needed, minimize use of window when it is\r
+ *   needed, make inffast.c even faster, implement gzip decoding, and to\r
+ *   improve code readability and style over the previous zlib inflate code\r
+ *\r
+ * 1.2.beta1    25 Nov 2002\r
+ * - Use pointers for available input and output checking in inffast.c\r
+ * - Remove input and output counters in inffast.c\r
+ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6\r
+ * - Remove unnecessary second byte pull from length extra in inffast.c\r
+ * - Unroll direct copy to three copies per loop in inffast.c\r
+ *\r
+ * 1.2.beta2    4 Dec 2002\r
+ * - Change external routine names to reduce potential conflicts\r
+ * - Correct filename to inffixed.h for fixed tables in inflate.c\r
+ * - Make hbuf[] unsigned char to match parameter type in inflate.c\r
+ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)\r
+ *   to avoid negation problem on Alphas (64 bit) in inflate.c\r
+ *\r
+ * 1.2.beta3    22 Dec 2002\r
+ * - Add comments on state->bits assertion in inffast.c\r
+ * - Add comments on op field in inftrees.h\r
+ * - Fix bug in reuse of allocated window after inflateReset()\r
+ * - Remove bit fields--back to byte structure for speed\r
+ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths\r
+ * - Change post-increments to pre-increments in inflate_fast(), PPC biased?\r
+ * - Add compile time option, POSTINC, to use post-increments instead (Intel?)\r
+ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used\r
+ * - Use local copies of stream next and avail values, as well as local bit\r
+ *   buffer and bit count in inflate()--for speed when inflate_fast() not used\r
+ *\r
+ * 1.2.beta4    1 Jan 2003\r
+ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings\r
+ * - Move a comment on output buffer sizes from inffast.c to inflate.c\r
+ * - Add comments in inffast.c to introduce the inflate_fast() routine\r
+ * - Rearrange window copies in inflate_fast() for speed and simplification\r
+ * - Unroll last copy for window match in inflate_fast()\r
+ * - Use local copies of window variables in inflate_fast() for speed\r
+ * - Pull out common wnext == 0 case for speed in inflate_fast()\r
+ * - Make op and len in inflate_fast() unsigned for consistency\r
+ * - Add FAR to lcode and dcode declarations in inflate_fast()\r
+ * - Simplified bad distance check in inflate_fast()\r
+ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new\r
+ *   source file infback.c to provide a call-back interface to inflate for\r
+ *   programs like gzip and unzip -- uses window as output buffer to avoid\r
+ *   window copying\r
+ *\r
+ * 1.2.beta5    1 Jan 2003\r
+ * - Improved inflateBack() interface to allow the caller to provide initial\r
+ *   input in strm.\r
+ * - Fixed stored blocks bug in inflateBack()\r
+ *\r
+ * 1.2.beta6    4 Jan 2003\r
+ * - Added comments in inffast.c on effectiveness of POSTINC\r
+ * - Typecasting all around to reduce compiler warnings\r
+ * - Changed loops from while (1) or do {} while (1) to for (;;), again to\r
+ *   make compilers happy\r
+ * - Changed type of window in inflateBackInit() to unsigned char *\r
+ *\r
+ * 1.2.beta7    27 Jan 2003\r
+ * - Changed many types to unsigned or unsigned short to avoid warnings\r
+ * - Added inflateCopy() function\r
+ *\r
+ * 1.2.0        9 Mar 2003\r
+ * - Changed inflateBack() interface to provide separate opaque descriptors\r
+ *   for the in() and out() functions\r
+ * - Changed inflateBack() argument and in_func typedef to swap the length\r
+ *   and buffer address return values for the input function\r
+ * - Check next_in and next_out for Z_NULL on entry to inflate()\r
+ *\r
+ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.\r
+ */\r
+\r
+#include "zutil.h"\r
+#include "inftrees.h"\r
+#include "inflate.h"\r
+#include "inffast.h"\r
+\r
+#ifdef MAKEFIXED\r
+#  ifndef BUILDFIXED\r
+#    define BUILDFIXED\r
+#  endif\r
+#endif\r
+\r
+/* function prototypes */\r
+local void fixedtables OF((struct inflate_state FAR *state));\r
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,\r
+                           unsigned copy));\r
+#ifdef BUILDFIXED\r
+   void makefixed OF((void));\r
+#endif\r
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,\r
+                              unsigned len));\r
+\r
+int ZEXPORT inflateResetKeep(strm)\r
+z_streamp strm;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    strm->total_in = strm->total_out = state->total = 0;\r
+    strm->msg = Z_NULL;\r
+    if (state->wrap)        /* to support ill-conceived Java test suite */\r
+        strm->adler = state->wrap & 1;\r
+    state->mode = HEAD;\r
+    state->last = 0;\r
+    state->havedict = 0;\r
+    state->dmax = 32768U;\r
+    state->head = Z_NULL;\r
+    state->hold = 0;\r
+    state->bits = 0;\r
+    state->lencode = state->distcode = state->next = state->codes;\r
+    state->sane = 1;\r
+    state->back = -1;\r
+    Tracev((stderr, "inflate: reset\n"));\r
+    return Z_OK;\r
+}\r
+\r
+int ZEXPORT inflateReset(strm)\r
+z_streamp strm;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    state->wsize = 0;\r
+    state->whave = 0;\r
+    state->wnext = 0;\r
+    return inflateResetKeep(strm);\r
+}\r
+\r
+int ZEXPORT inflateReset2(strm, windowBits)\r
+z_streamp strm;\r
+int windowBits;\r
+{\r
+    int wrap;\r
+    struct inflate_state FAR *state;\r
+\r
+    /* get the state */\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+\r
+    /* extract wrap request from windowBits parameter */\r
+    if (windowBits < 0) {\r
+        wrap = 0;\r
+        windowBits = -windowBits;\r
+    }\r
+    else {\r
+        wrap = (windowBits >> 4) + 1;\r
+#ifdef GUNZIP\r
+        if (windowBits < 48)\r
+            windowBits &= 15;\r
+#endif\r
+    }\r
+\r
+    /* set number of window bits, free window if different */\r
+    if (windowBits && (windowBits < 8 || windowBits > 15))\r
+        return Z_STREAM_ERROR;\r
+    if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {\r
+        ZFREE(strm, state->window);\r
+        state->window = Z_NULL;\r
+    }\r
+\r
+    /* update state and reset the rest of it */\r
+    state->wrap = wrap;\r
+    state->wbits = (unsigned)windowBits;\r
+    return inflateReset(strm);\r
+}\r
+\r
+int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)\r
+z_streamp strm;\r
+int windowBits;\r
+const char *version;\r
+int stream_size;\r
+{\r
+    int ret;\r
+    struct inflate_state FAR *state;\r
+\r
+    if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||\r
+        stream_size != (int)(sizeof(z_stream)))\r
+        return Z_VERSION_ERROR;\r
+    if (strm == Z_NULL) return Z_STREAM_ERROR;\r
+    strm->msg = Z_NULL;                 /* in case we return an error */\r
+    if (strm->zalloc == (alloc_func)0) {\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+        strm->zalloc = zcalloc;\r
+        strm->opaque = (voidpf)0;\r
+#endif\r
+    }\r
+    if (strm->zfree == (free_func)0)\r
+#ifdef Z_SOLO\r
+        return Z_STREAM_ERROR;\r
+#else\r
+        strm->zfree = zcfree;\r
+#endif\r
+    state = (struct inflate_state FAR *)\r
+            ZALLOC(strm, 1, sizeof(struct inflate_state));\r
+    if (state == Z_NULL) return Z_MEM_ERROR;\r
+    Tracev((stderr, "inflate: allocated\n"));\r
+    strm->state = (struct internal_state FAR *)state;\r
+    state->window = Z_NULL;\r
+    ret = inflateReset2(strm, windowBits);\r
+    if (ret != Z_OK) {\r
+        ZFREE(strm, state);\r
+        strm->state = Z_NULL;\r
+    }\r
+    return ret;\r
+}\r
+\r
+int ZEXPORT inflateInit_(strm, version, stream_size)\r
+z_streamp strm;\r
+const char *version;\r
+int stream_size;\r
+{\r
+    return inflateInit2_(strm, DEF_WBITS, version, stream_size);\r
+}\r
+\r
+int ZEXPORT inflatePrime(strm, bits, value)\r
+z_streamp strm;\r
+int bits;\r
+int value;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if (bits < 0) {\r
+        state->hold = 0;\r
+        state->bits = 0;\r
+        return Z_OK;\r
+    }\r
+    if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;\r
+    value &= (1L << bits) - 1;\r
+    state->hold += value << state->bits;\r
+    state->bits += bits;\r
+    return Z_OK;\r
+}\r
+\r
+/*\r
+   Return state with length and distance decoding tables and index sizes set to\r
+   fixed code decoding.  Normally this returns fixed tables from inffixed.h.\r
+   If BUILDFIXED is defined, then instead this routine builds the tables the\r
+   first time it's called, and returns those tables the first time and\r
+   thereafter.  This reduces the size of the code by about 2K bytes, in\r
+   exchange for a little execution time.  However, BUILDFIXED should not be\r
+   used for threaded applications, since the rewriting of the tables and virgin\r
+   may not be thread-safe.\r
+ */\r
+local void fixedtables(state)\r
+struct inflate_state FAR *state;\r
+{\r
+#ifdef BUILDFIXED\r
+    static int virgin = 1;\r
+    static code *lenfix, *distfix;\r
+    static code fixed[544];\r
+\r
+    /* build fixed huffman tables if first call (may not be thread safe) */\r
+    if (virgin) {\r
+        unsigned sym, bits;\r
+        static code *next;\r
+\r
+        /* literal/length table */\r
+        sym = 0;\r
+        while (sym < 144) state->lens[sym++] = 8;\r
+        while (sym < 256) state->lens[sym++] = 9;\r
+        while (sym < 280) state->lens[sym++] = 7;\r
+        while (sym < 288) state->lens[sym++] = 8;\r
+        next = fixed;\r
+        lenfix = next;\r
+        bits = 9;\r
+        inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);\r
+\r
+        /* distance table */\r
+        sym = 0;\r
+        while (sym < 32) state->lens[sym++] = 5;\r
+        distfix = next;\r
+        bits = 5;\r
+        inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);\r
+\r
+        /* do this just once */\r
+        virgin = 0;\r
+    }\r
+#else /* !BUILDFIXED */\r
+#   include "inffixed.h"\r
+#endif /* BUILDFIXED */\r
+    state->lencode = lenfix;\r
+    state->lenbits = 9;\r
+    state->distcode = distfix;\r
+    state->distbits = 5;\r
+}\r
+\r
+#ifdef MAKEFIXED\r
+#include <stdio.h>\r
+\r
+/*\r
+   Write out the inffixed.h that is #include'd above.  Defining MAKEFIXED also\r
+   defines BUILDFIXED, so the tables are built on the fly.  makefixed() writes\r
+   those tables to stdout, which would be piped to inffixed.h.  A small program\r
+   can simply call makefixed to do this:\r
+\r
+    void makefixed(void);\r
+\r
+    int main(void)\r
+    {\r
+        makefixed();\r
+        return 0;\r
+    }\r
+\r
+   Then that can be linked with zlib built with MAKEFIXED defined and run:\r
+\r
+    a.out > inffixed.h\r
+ */\r
+void makefixed()\r
+{\r
+    unsigned low, size;\r
+    struct inflate_state state;\r
+\r
+    fixedtables(&state);\r
+    puts("    /* inffixed.h -- table for decoding fixed codes");\r
+    puts("     * Generated automatically by makefixed().");\r
+    puts("     */");\r
+    puts("");\r
+    puts("    /* WARNING: this file should *not* be used by applications.");\r
+    puts("       It is part of the implementation of this library and is");\r
+    puts("       subject to change. Applications should only use zlib.h.");\r
+    puts("     */");\r
+    puts("");\r
+    size = 1U << 9;\r
+    printf("    static const code lenfix[%u] = {", size);\r
+    low = 0;\r
+    for (;;) {\r
+        if ((low % 7) == 0) printf("\n        ");\r
+        printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,\r
+               state.lencode[low].bits, state.lencode[low].val);\r
+        if (++low == size) break;\r
+        putchar(',');\r
+    }\r
+    puts("\n    };");\r
+    size = 1U << 5;\r
+    printf("\n    static const code distfix[%u] = {", size);\r
+    low = 0;\r
+    for (;;) {\r
+        if ((low % 6) == 0) printf("\n        ");\r
+        printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,\r
+               state.distcode[low].val);\r
+        if (++low == size) break;\r
+        putchar(',');\r
+    }\r
+    puts("\n    };");\r
+}\r
+#endif /* MAKEFIXED */\r
+\r
+/*\r
+   Update the window with the last wsize (normally 32K) bytes written before\r
+   returning.  If window does not exist yet, create it.  This is only called\r
+   when a window is already in use, or when output has been written during this\r
+   inflate call, but the end of the deflate stream has not been reached yet.\r
+   It is also called to create a window for dictionary data when a dictionary\r
+   is loaded.\r
+\r
+   Providing output buffers larger than 32K to inflate() should provide a speed\r
+   advantage, since only the last 32K of output is copied to the sliding window\r
+   upon return from inflate(), and since all distances after the first 32K of\r
+   output will fall in the output data, making match copies simpler and faster.\r
+   The advantage may be dependent on the size of the processor's data caches.\r
+ */\r
+local int updatewindow(strm, end, copy)\r
+z_streamp strm;\r
+const Bytef *end;\r
+unsigned copy;\r
+{\r
+    struct inflate_state FAR *state;\r
+    unsigned dist;\r
+\r
+    state = (struct inflate_state FAR *)strm->state;\r
+\r
+    /* if it hasn't been done already, allocate space for the window */\r
+    if (state->window == Z_NULL) {\r
+        state->window = (unsigned char FAR *)\r
+                        ZALLOC(strm, 1U << state->wbits,\r
+                               sizeof(unsigned char));\r
+        if (state->window == Z_NULL) return 1;\r
+    }\r
+\r
+    /* if window not in use yet, initialize */\r
+    if (state->wsize == 0) {\r
+        state->wsize = 1U << state->wbits;\r
+        state->wnext = 0;\r
+        state->whave = 0;\r
+    }\r
+\r
+    /* copy state->wsize or less output bytes into the circular window */\r
+    if (copy >= state->wsize) {\r
+        zmemcpy(state->window, end - state->wsize, state->wsize);\r
+        state->wnext = 0;\r
+        state->whave = state->wsize;\r
+    }\r
+    else {\r
+        dist = state->wsize - state->wnext;\r
+        if (dist > copy) dist = copy;\r
+        zmemcpy(state->window + state->wnext, end - copy, dist);\r
+        copy -= dist;\r
+        if (copy) {\r
+            zmemcpy(state->window, end - copy, copy);\r
+            state->wnext = copy;\r
+            state->whave = state->wsize;\r
+        }\r
+        else {\r
+            state->wnext += dist;\r
+            if (state->wnext == state->wsize) state->wnext = 0;\r
+            if (state->whave < state->wsize) state->whave += dist;\r
+        }\r
+    }\r
+    return 0;\r
+}\r
+\r
+/* Macros for inflate(): */\r
+\r
+/* check function to use adler32() for zlib or crc32() for gzip */\r
+#ifdef GUNZIP\r
+#  define UPDATE(check, buf, len) \\r
+    (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))\r
+#else\r
+#  define UPDATE(check, buf, len) adler32(check, buf, len)\r
+#endif\r
+\r
+/* check macros for header crc */\r
+#ifdef GUNZIP\r
+#  define CRC2(check, word) \\r
+    do { \\r
+        hbuf[0] = (unsigned char)(word); \\r
+        hbuf[1] = (unsigned char)((word) >> 8); \\r
+        check = crc32(check, hbuf, 2); \\r
+    } while (0)\r
+\r
+#  define CRC4(check, word) \\r
+    do { \\r
+        hbuf[0] = (unsigned char)(word); \\r
+        hbuf[1] = (unsigned char)((word) >> 8); \\r
+        hbuf[2] = (unsigned char)((word) >> 16); \\r
+        hbuf[3] = (unsigned char)((word) >> 24); \\r
+        check = crc32(check, hbuf, 4); \\r
+    } while (0)\r
+#endif\r
+\r
+/* Load registers with state in inflate() for speed */\r
+#define LOAD() \\r
+    do { \\r
+        put = strm->next_out; \\r
+        left = strm->avail_out; \\r
+        next = strm->next_in; \\r
+        have = strm->avail_in; \\r
+        hold = state->hold; \\r
+        bits = state->bits; \\r
+    } while (0)\r
+\r
+/* Restore state from registers in inflate() */\r
+#define RESTORE() \\r
+    do { \\r
+        strm->next_out = put; \\r
+        strm->avail_out = left; \\r
+        strm->next_in = next; \\r
+        strm->avail_in = have; \\r
+        state->hold = hold; \\r
+        state->bits = bits; \\r
+    } while (0)\r
+\r
+/* Clear the input bit accumulator */\r
+#define INITBITS() \\r
+    do { \\r
+        hold = 0; \\r
+        bits = 0; \\r
+    } while (0)\r
+\r
+/* Get a byte of input into the bit accumulator, or return from inflate()\r
+   if there is no input available. */\r
+#define PULLBYTE() \\r
+    do { \\r
+        if (have == 0) goto inf_leave; \\r
+        have--; \\r
+        hold += (unsigned long)(*next++) << bits; \\r
+        bits += 8; \\r
+    } while (0)\r
+\r
+/* Assure that there are at least n bits in the bit accumulator.  If there is\r
+   not enough available input to do that, then return from inflate(). */\r
+#define NEEDBITS(n) \\r
+    do { \\r
+        while (bits < (unsigned)(n)) \\r
+            PULLBYTE(); \\r
+    } while (0)\r
+\r
+/* Return the low n bits of the bit accumulator (n < 16) */\r
+#define BITS(n) \\r
+    ((unsigned)hold & ((1U << (n)) - 1))\r
+\r
+/* Remove n bits from the bit accumulator */\r
+#define DROPBITS(n) \\r
+    do { \\r
+        hold >>= (n); \\r
+        bits -= (unsigned)(n); \\r
+    } while (0)\r
+\r
+/* Remove zero to seven bits as needed to go to a byte boundary */\r
+#define BYTEBITS() \\r
+    do { \\r
+        hold >>= bits & 7; \\r
+        bits -= bits & 7; \\r
+    } while (0)\r
+\r
+/*\r
+   inflate() uses a state machine to process as much input data and generate as\r
+   much output data as possible before returning.  The state machine is\r
+   structured roughly as follows:\r
+\r
+    for (;;) switch (state) {\r
+    ...\r
+    case STATEn:\r
+        if (not enough input data or output space to make progress)\r
+            return;\r
+        ... make progress ...\r
+        state = STATEm;\r
+        break;\r
+    ...\r
+    }\r
+\r
+   so when inflate() is called again, the same case is attempted again, and\r
+   if the appropriate resources are provided, the machine proceeds to the\r
+   next state.  The NEEDBITS() macro is usually the way the state evaluates\r
+   whether it can proceed or should return.  NEEDBITS() does the return if\r
+   the requested bits are not available.  The typical use of the BITS macros\r
+   is:\r
+\r
+        NEEDBITS(n);\r
+        ... do something with BITS(n) ...\r
+        DROPBITS(n);\r
+\r
+   where NEEDBITS(n) either returns from inflate() if there isn't enough\r
+   input left to load n bits into the accumulator, or it continues.  BITS(n)\r
+   gives the low n bits in the accumulator.  When done, DROPBITS(n) drops\r
+   the low n bits off the accumulator.  INITBITS() clears the accumulator\r
+   and sets the number of available bits to zero.  BYTEBITS() discards just\r
+   enough bits to put the accumulator on a byte boundary.  After BYTEBITS()\r
+   and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.\r
+\r
+   NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return\r
+   if there is no input available.  The decoding of variable length codes uses\r
+   PULLBYTE() directly in order to pull just enough bytes to decode the next\r
+   code, and no more.\r
+\r
+   Some states loop until they get enough input, making sure that enough\r
+   state information is maintained to continue the loop where it left off\r
+   if NEEDBITS() returns in the loop.  For example, want, need, and keep\r
+   would all have to actually be part of the saved state in case NEEDBITS()\r
+   returns:\r
+\r
+    case STATEw:\r
+        while (want < need) {\r
+            NEEDBITS(n);\r
+            keep[want++] = BITS(n);\r
+            DROPBITS(n);\r
+        }\r
+        state = STATEx;\r
+    case STATEx:\r
+\r
+   As shown above, if the next state is also the next case, then the break\r
+   is omitted.\r
+\r
+   A state may also return if there is not enough output space available to\r
+   complete that state.  Those states are copying stored data, writing a\r
+   literal byte, and copying a matching string.\r
+\r
+   When returning, a "goto inf_leave" is used to update the total counters,\r
+   update the check value, and determine whether any progress has been made\r
+   during that inflate() call in order to return the proper return code.\r
+   Progress is defined as a change in either strm->avail_in or strm->avail_out.\r
+   When there is a window, goto inf_leave will update the window with the last\r
+   output written.  If a goto inf_leave occurs in the middle of decompression\r
+   and there is no window currently, goto inf_leave will create one and copy\r
+   output to the window for the next call of inflate().\r
+\r
+   In this implementation, the flush parameter of inflate() only affects the\r
+   return code (per zlib.h).  inflate() always writes as much as possible to\r
+   strm->next_out, given the space available and the provided input--the effect\r
+   documented in zlib.h of Z_SYNC_FLUSH.  Furthermore, inflate() always defers\r
+   the allocation of and copying into a sliding window until necessary, which\r
+   provides the effect documented in zlib.h for Z_FINISH when the entire input\r
+   stream available.  So the only thing the flush parameter actually does is:\r
+   when flush is set to Z_FINISH, inflate() cannot return Z_OK.  Instead it\r
+   will return Z_BUF_ERROR if it has not reached the end of the stream.\r
+ */\r
+\r
+int ZEXPORT inflate(strm, flush)\r
+z_streamp strm;\r
+int flush;\r
+{\r
+    struct inflate_state FAR *state;\r
+    z_const unsigned char FAR *next;    /* next input */\r
+    unsigned char FAR *put;     /* next output */\r
+    unsigned have, left;        /* available input and output */\r
+    unsigned long hold;         /* bit buffer */\r
+    unsigned bits;              /* bits in bit buffer */\r
+    unsigned in, out;           /* save starting available input and output */\r
+    unsigned copy;              /* number of stored or match bytes to copy */\r
+    unsigned char FAR *from;    /* where to copy match bytes from */\r
+    code here;                  /* current decoding table entry */\r
+    code last;                  /* parent table entry */\r
+    unsigned len;               /* length to copy for repeats, bits to drop */\r
+    int ret;                    /* return code */\r
+#ifdef GUNZIP\r
+    unsigned char hbuf[4];      /* buffer for gzip header crc calculation */\r
+#endif\r
+    static const unsigned short order[19] = /* permutation of code lengths */\r
+        {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||\r
+        (strm->next_in == Z_NULL && strm->avail_in != 0))\r
+        return Z_STREAM_ERROR;\r
+\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if (state->mode == TYPE) state->mode = TYPEDO;      /* skip check */\r
+    LOAD();\r
+    in = have;\r
+    out = left;\r
+    ret = Z_OK;\r
+    for (;;)\r
+        switch (state->mode) {\r
+        case HEAD:\r
+            if (state->wrap == 0) {\r
+                state->mode = TYPEDO;\r
+                break;\r
+            }\r
+            NEEDBITS(16);\r
+#ifdef GUNZIP\r
+            if ((state->wrap & 2) && hold == 0x8b1f) {  /* gzip header */\r
+                state->check = crc32(0L, Z_NULL, 0);\r
+                CRC2(state->check, hold);\r
+                INITBITS();\r
+                state->mode = FLAGS;\r
+                break;\r
+            }\r
+            state->flags = 0;           /* expect zlib header */\r
+            if (state->head != Z_NULL)\r
+                state->head->done = -1;\r
+            if (!(state->wrap & 1) ||   /* check if zlib header allowed */\r
+#else\r
+            if (\r
+#endif\r
+                ((BITS(8) << 8) + (hold >> 8)) % 31) {\r
+                strm->msg = (char *)"incorrect header check";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            if (BITS(4) != Z_DEFLATED) {\r
+                strm->msg = (char *)"unknown compression method";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            DROPBITS(4);\r
+            len = BITS(4) + 8;\r
+            if (state->wbits == 0)\r
+                state->wbits = len;\r
+            else if (len > state->wbits) {\r
+                strm->msg = (char *)"invalid window size";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->dmax = 1U << len;\r
+            Tracev((stderr, "inflate:   zlib header ok\n"));\r
+            strm->adler = state->check = adler32(0L, Z_NULL, 0);\r
+            state->mode = hold & 0x200 ? DICTID : TYPE;\r
+            INITBITS();\r
+            break;\r
+#ifdef GUNZIP\r
+        case FLAGS:\r
+            NEEDBITS(16);\r
+            state->flags = (int)(hold);\r
+            if ((state->flags & 0xff) != Z_DEFLATED) {\r
+                strm->msg = (char *)"unknown compression method";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            if (state->flags & 0xe000) {\r
+                strm->msg = (char *)"unknown header flags set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            if (state->head != Z_NULL)\r
+                state->head->text = (int)((hold >> 8) & 1);\r
+            if (state->flags & 0x0200) CRC2(state->check, hold);\r
+            INITBITS();\r
+            state->mode = TIME;\r
+        case TIME:\r
+            NEEDBITS(32);\r
+            if (state->head != Z_NULL)\r
+                state->head->time = hold;\r
+            if (state->flags & 0x0200) CRC4(state->check, hold);\r
+            INITBITS();\r
+            state->mode = OS;\r
+        case OS:\r
+            NEEDBITS(16);\r
+            if (state->head != Z_NULL) {\r
+                state->head->xflags = (int)(hold & 0xff);\r
+                state->head->os = (int)(hold >> 8);\r
+            }\r
+            if (state->flags & 0x0200) CRC2(state->check, hold);\r
+            INITBITS();\r
+            state->mode = EXLEN;\r
+        case EXLEN:\r
+            if (state->flags & 0x0400) {\r
+                NEEDBITS(16);\r
+                state->length = (unsigned)(hold);\r
+                if (state->head != Z_NULL)\r
+                    state->head->extra_len = (unsigned)hold;\r
+                if (state->flags & 0x0200) CRC2(state->check, hold);\r
+                INITBITS();\r
+            }\r
+            else if (state->head != Z_NULL)\r
+                state->head->extra = Z_NULL;\r
+            state->mode = EXTRA;\r
+        case EXTRA:\r
+            if (state->flags & 0x0400) {\r
+                copy = state->length;\r
+                if (copy > have) copy = have;\r
+                if (copy) {\r
+                    if (state->head != Z_NULL &&\r
+                        state->head->extra != Z_NULL) {\r
+                        len = state->head->extra_len - state->length;\r
+                        zmemcpy(state->head->extra + len, next,\r
+                                len + copy > state->head->extra_max ?\r
+                                state->head->extra_max - len : copy);\r
+                    }\r
+                    if (state->flags & 0x0200)\r
+                        state->check = crc32(state->check, next, copy);\r
+                    have -= copy;\r
+                    next += copy;\r
+                    state->length -= copy;\r
+                }\r
+                if (state->length) goto inf_leave;\r
+            }\r
+            state->length = 0;\r
+            state->mode = NAME;\r
+        case NAME:\r
+            if (state->flags & 0x0800) {\r
+                if (have == 0) goto inf_leave;\r
+                copy = 0;\r
+                do {\r
+                    len = (unsigned)(next[copy++]);\r
+                    if (state->head != Z_NULL &&\r
+                            state->head->name != Z_NULL &&\r
+                            state->length < state->head->name_max)\r
+                        state->head->name[state->length++] = len;\r
+                } while (len && copy < have);\r
+                if (state->flags & 0x0200)\r
+                    state->check = crc32(state->check, next, copy);\r
+                have -= copy;\r
+                next += copy;\r
+                if (len) goto inf_leave;\r
+            }\r
+            else if (state->head != Z_NULL)\r
+                state->head->name = Z_NULL;\r
+            state->length = 0;\r
+            state->mode = COMMENT;\r
+        case COMMENT:\r
+            if (state->flags & 0x1000) {\r
+                if (have == 0) goto inf_leave;\r
+                copy = 0;\r
+                do {\r
+                    len = (unsigned)(next[copy++]);\r
+                    if (state->head != Z_NULL &&\r
+                            state->head->comment != Z_NULL &&\r
+                            state->length < state->head->comm_max)\r
+                        state->head->comment[state->length++] = len;\r
+                } while (len && copy < have);\r
+                if (state->flags & 0x0200)\r
+                    state->check = crc32(state->check, next, copy);\r
+                have -= copy;\r
+                next += copy;\r
+                if (len) goto inf_leave;\r
+            }\r
+            else if (state->head != Z_NULL)\r
+                state->head->comment = Z_NULL;\r
+            state->mode = HCRC;\r
+        case HCRC:\r
+            if (state->flags & 0x0200) {\r
+                NEEDBITS(16);\r
+                if (hold != (state->check & 0xffff)) {\r
+                    strm->msg = (char *)"header crc mismatch";\r
+                    state->mode = BAD;\r
+                    break;\r
+                }\r
+                INITBITS();\r
+            }\r
+            if (state->head != Z_NULL) {\r
+                state->head->hcrc = (int)((state->flags >> 9) & 1);\r
+                state->head->done = 1;\r
+            }\r
+            strm->adler = state->check = crc32(0L, Z_NULL, 0);\r
+            state->mode = TYPE;\r
+            break;\r
+#endif\r
+        case DICTID:\r
+            NEEDBITS(32);\r
+            strm->adler = state->check = ZSWAP32(hold);\r
+            INITBITS();\r
+            state->mode = DICT;\r
+        case DICT:\r
+            if (state->havedict == 0) {\r
+                RESTORE();\r
+                return Z_NEED_DICT;\r
+            }\r
+            strm->adler = state->check = adler32(0L, Z_NULL, 0);\r
+            state->mode = TYPE;\r
+        case TYPE:\r
+            if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;\r
+        case TYPEDO:\r
+            if (state->last) {\r
+                BYTEBITS();\r
+                state->mode = CHECK;\r
+                break;\r
+            }\r
+            NEEDBITS(3);\r
+            state->last = BITS(1);\r
+            DROPBITS(1);\r
+            switch (BITS(2)) {\r
+            case 0:                             /* stored block */\r
+                Tracev((stderr, "inflate:     stored block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = STORED;\r
+                break;\r
+            case 1:                             /* fixed block */\r
+                fixedtables(state);\r
+                Tracev((stderr, "inflate:     fixed codes block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = LEN_;             /* decode codes */\r
+                if (flush == Z_TREES) {\r
+                    DROPBITS(2);\r
+                    goto inf_leave;\r
+                }\r
+                break;\r
+            case 2:                             /* dynamic block */\r
+                Tracev((stderr, "inflate:     dynamic codes block%s\n",\r
+                        state->last ? " (last)" : ""));\r
+                state->mode = TABLE;\r
+                break;\r
+            case 3:\r
+                strm->msg = (char *)"invalid block type";\r
+                state->mode = BAD;\r
+            }\r
+            DROPBITS(2);\r
+            break;\r
+        case STORED:\r
+            BYTEBITS();                         /* go to byte boundary */\r
+            NEEDBITS(32);\r
+            if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {\r
+                strm->msg = (char *)"invalid stored block lengths";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->length = (unsigned)hold & 0xffff;\r
+            Tracev((stderr, "inflate:       stored length %u\n",\r
+                    state->length));\r
+            INITBITS();\r
+            state->mode = COPY_;\r
+            if (flush == Z_TREES) goto inf_leave;\r
+        case COPY_:\r
+            state->mode = COPY;\r
+        case COPY:\r
+            copy = state->length;\r
+            if (copy) {\r
+                if (copy > have) copy = have;\r
+                if (copy > left) copy = left;\r
+                if (copy == 0) goto inf_leave;\r
+                zmemcpy(put, next, copy);\r
+                have -= copy;\r
+                next += copy;\r
+                left -= copy;\r
+                put += copy;\r
+                state->length -= copy;\r
+                break;\r
+            }\r
+            Tracev((stderr, "inflate:       stored end\n"));\r
+            state->mode = TYPE;\r
+            break;\r
+        case TABLE:\r
+            NEEDBITS(14);\r
+            state->nlen = BITS(5) + 257;\r
+            DROPBITS(5);\r
+            state->ndist = BITS(5) + 1;\r
+            DROPBITS(5);\r
+            state->ncode = BITS(4) + 4;\r
+            DROPBITS(4);\r
+#ifndef PKZIP_BUG_WORKAROUND\r
+            if (state->nlen > 286 || state->ndist > 30) {\r
+                strm->msg = (char *)"too many length or distance symbols";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+#endif\r
+            Tracev((stderr, "inflate:       table sizes ok\n"));\r
+            state->have = 0;\r
+            state->mode = LENLENS;\r
+        case LENLENS:\r
+            while (state->have < state->ncode) {\r
+                NEEDBITS(3);\r
+                state->lens[order[state->have++]] = (unsigned short)BITS(3);\r
+                DROPBITS(3);\r
+            }\r
+            while (state->have < 19)\r
+                state->lens[order[state->have++]] = 0;\r
+            state->next = state->codes;\r
+            state->lencode = (const code FAR *)(state->next);\r
+            state->lenbits = 7;\r
+            ret = inflate_table(CODES, state->lens, 19, &(state->next),\r
+                                &(state->lenbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid code lengths set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            Tracev((stderr, "inflate:       code lengths ok\n"));\r
+            state->have = 0;\r
+            state->mode = CODELENS;\r
+        case CODELENS:\r
+            while (state->have < state->nlen + state->ndist) {\r
+                for (;;) {\r
+                    here = state->lencode[BITS(state->lenbits)];\r
+                    if ((unsigned)(here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                if (here.val < 16) {\r
+                    DROPBITS(here.bits);\r
+                    state->lens[state->have++] = here.val;\r
+                }\r
+                else {\r
+                    if (here.val == 16) {\r
+                        NEEDBITS(here.bits + 2);\r
+                        DROPBITS(here.bits);\r
+                        if (state->have == 0) {\r
+                            strm->msg = (char *)"invalid bit length repeat";\r
+                            state->mode = BAD;\r
+                            break;\r
+                        }\r
+                        len = state->lens[state->have - 1];\r
+                        copy = 3 + BITS(2);\r
+                        DROPBITS(2);\r
+                    }\r
+                    else if (here.val == 17) {\r
+                        NEEDBITS(here.bits + 3);\r
+                        DROPBITS(here.bits);\r
+                        len = 0;\r
+                        copy = 3 + BITS(3);\r
+                        DROPBITS(3);\r
+                    }\r
+                    else {\r
+                        NEEDBITS(here.bits + 7);\r
+                        DROPBITS(here.bits);\r
+                        len = 0;\r
+                        copy = 11 + BITS(7);\r
+                        DROPBITS(7);\r
+                    }\r
+                    if (state->have + copy > state->nlen + state->ndist) {\r
+                        strm->msg = (char *)"invalid bit length repeat";\r
+                        state->mode = BAD;\r
+                        break;\r
+                    }\r
+                    while (copy--)\r
+                        state->lens[state->have++] = (unsigned short)len;\r
+                }\r
+            }\r
+\r
+            /* handle error breaks in while */\r
+            if (state->mode == BAD) break;\r
+\r
+            /* check for end-of-block code (better have one) */\r
+            if (state->lens[256] == 0) {\r
+                strm->msg = (char *)"invalid code -- missing end-of-block";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+\r
+            /* build code tables -- note: do not change the lenbits or distbits\r
+               values here (9 and 6) without reading the comments in inftrees.h\r
+               concerning the ENOUGH constants, which depend on those values */\r
+            state->next = state->codes;\r
+            state->lencode = (const code FAR *)(state->next);\r
+            state->lenbits = 9;\r
+            ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),\r
+                                &(state->lenbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid literal/lengths set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->distcode = (const code FAR *)(state->next);\r
+            state->distbits = 6;\r
+            ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,\r
+                            &(state->next), &(state->distbits), state->work);\r
+            if (ret) {\r
+                strm->msg = (char *)"invalid distances set";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            Tracev((stderr, "inflate:       codes ok\n"));\r
+            state->mode = LEN_;\r
+            if (flush == Z_TREES) goto inf_leave;\r
+        case LEN_:\r
+            state->mode = LEN;\r
+        case LEN:\r
+            if (have >= 6 && left >= 258) {\r
+                RESTORE();\r
+                inflate_fast(strm, out);\r
+                LOAD();\r
+                if (state->mode == TYPE)\r
+                    state->back = -1;\r
+                break;\r
+            }\r
+            state->back = 0;\r
+            for (;;) {\r
+                here = state->lencode[BITS(state->lenbits)];\r
+                if ((unsigned)(here.bits) <= bits) break;\r
+                PULLBYTE();\r
+            }\r
+            if (here.op && (here.op & 0xf0) == 0) {\r
+                last = here;\r
+                for (;;) {\r
+                    here = state->lencode[last.val +\r
+                            (BITS(last.bits + last.op) >> last.bits)];\r
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                DROPBITS(last.bits);\r
+                state->back += last.bits;\r
+            }\r
+            DROPBITS(here.bits);\r
+            state->back += here.bits;\r
+            state->length = (unsigned)here.val;\r
+            if ((int)(here.op) == 0) {\r
+                Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?\r
+                        "inflate:         literal '%c'\n" :\r
+                        "inflate:         literal 0x%02x\n", here.val));\r
+                state->mode = LIT;\r
+                break;\r
+            }\r
+            if (here.op & 32) {\r
+                Tracevv((stderr, "inflate:         end of block\n"));\r
+                state->back = -1;\r
+                state->mode = TYPE;\r
+                break;\r
+            }\r
+            if (here.op & 64) {\r
+                strm->msg = (char *)"invalid literal/length code";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->extra = (unsigned)(here.op) & 15;\r
+            state->mode = LENEXT;\r
+        case LENEXT:\r
+            if (state->extra) {\r
+                NEEDBITS(state->extra);\r
+                state->length += BITS(state->extra);\r
+                DROPBITS(state->extra);\r
+                state->back += state->extra;\r
+            }\r
+            Tracevv((stderr, "inflate:         length %u\n", state->length));\r
+            state->was = state->length;\r
+            state->mode = DIST;\r
+        case DIST:\r
+            for (;;) {\r
+                here = state->distcode[BITS(state->distbits)];\r
+                if ((unsigned)(here.bits) <= bits) break;\r
+                PULLBYTE();\r
+            }\r
+            if ((here.op & 0xf0) == 0) {\r
+                last = here;\r
+                for (;;) {\r
+                    here = state->distcode[last.val +\r
+                            (BITS(last.bits + last.op) >> last.bits)];\r
+                    if ((unsigned)(last.bits + here.bits) <= bits) break;\r
+                    PULLBYTE();\r
+                }\r
+                DROPBITS(last.bits);\r
+                state->back += last.bits;\r
+            }\r
+            DROPBITS(here.bits);\r
+            state->back += here.bits;\r
+            if (here.op & 64) {\r
+                strm->msg = (char *)"invalid distance code";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+            state->offset = (unsigned)here.val;\r
+            state->extra = (unsigned)(here.op) & 15;\r
+            state->mode = DISTEXT;\r
+        case DISTEXT:\r
+            if (state->extra) {\r
+                NEEDBITS(state->extra);\r
+                state->offset += BITS(state->extra);\r
+                DROPBITS(state->extra);\r
+                state->back += state->extra;\r
+            }\r
+#ifdef INFLATE_STRICT\r
+            if (state->offset > state->dmax) {\r
+                strm->msg = (char *)"invalid distance too far back";\r
+                state->mode = BAD;\r
+                break;\r
+            }\r
+#endif\r
+            Tracevv((stderr, "inflate:         distance %u\n", state->offset));\r
+            state->mode = MATCH;\r
+        case MATCH:\r
+            if (left == 0) goto inf_leave;\r
+            copy = out - left;\r
+            if (state->offset > copy) {         /* copy from window */\r
+                copy = state->offset - copy;\r
+                if (copy > state->whave) {\r
+                    if (state->sane) {\r
+                        strm->msg = (char *)"invalid distance too far back";\r
+                        state->mode = BAD;\r
+                        break;\r
+                    }\r
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\r
+                    Trace((stderr, "inflate.c too far\n"));\r
+                    copy -= state->whave;\r
+                    if (copy > state->length) copy = state->length;\r
+                    if (copy > left) copy = left;\r
+                    left -= copy;\r
+                    state->length -= copy;\r
+                    do {\r
+                        *put++ = 0;\r
+                    } while (--copy);\r
+                    if (state->length == 0) state->mode = LEN;\r
+                    break;\r
+#endif\r
+                }\r
+                if (copy > state->wnext) {\r
+                    copy -= state->wnext;\r
+                    from = state->window + (state->wsize - copy);\r
+                }\r
+                else\r
+                    from = state->window + (state->wnext - copy);\r
+                if (copy > state->length) copy = state->length;\r
+            }\r
+            else {                              /* copy from output */\r
+                from = put - state->offset;\r
+                copy = state->length;\r
+            }\r
+            if (copy > left) copy = left;\r
+            left -= copy;\r
+            state->length -= copy;\r
+            do {\r
+                *put++ = *from++;\r
+            } while (--copy);\r
+            if (state->length == 0) state->mode = LEN;\r
+            break;\r
+        case LIT:\r
+            if (left == 0) goto inf_leave;\r
+            *put++ = (unsigned char)(state->length);\r
+            left--;\r
+            state->mode = LEN;\r
+            break;\r
+        case CHECK:\r
+            if (state->wrap) {\r
+                NEEDBITS(32);\r
+                out -= left;\r
+                strm->total_out += out;\r
+                state->total += out;\r
+                if (out)\r
+                    strm->adler = state->check =\r
+                        UPDATE(state->check, put - out, out);\r
+                out = left;\r
+                if ((\r
+#ifdef GUNZIP\r
+                     state->flags ? hold :\r
+#endif\r
+                     ZSWAP32(hold)) != state->check) {\r
+                    strm->msg = (char *)"incorrect data check";\r
+                    state->mode = BAD;\r
+                    break;\r
+                }\r
+                INITBITS();\r
+                Tracev((stderr, "inflate:   check matches trailer\n"));\r
+            }\r
+#ifdef GUNZIP\r
+            state->mode = LENGTH;\r
+        case LENGTH:\r
+            if (state->wrap && state->flags) {\r
+                NEEDBITS(32);\r
+                if (hold != (state->total & 0xffffffffUL)) {\r
+                    strm->msg = (char *)"incorrect length check";\r
+                    state->mode = BAD;\r
+                    break;\r
+                }\r
+                INITBITS();\r
+                Tracev((stderr, "inflate:   length matches trailer\n"));\r
+            }\r
+#endif\r
+            state->mode = DONE;\r
+        case DONE:\r
+            ret = Z_STREAM_END;\r
+            goto inf_leave;\r
+        case BAD:\r
+            ret = Z_DATA_ERROR;\r
+            goto inf_leave;\r
+        case MEM:\r
+            return Z_MEM_ERROR;\r
+        case SYNC:\r
+        default:\r
+            return Z_STREAM_ERROR;\r
+        }\r
+\r
+    /*\r
+       Return from inflate(), updating the total counts and the check value.\r
+       If there was no progress during the inflate() call, return a buffer\r
+       error.  Call updatewindow() to create and/or update the window state.\r
+       Note: a memory error from inflate() is non-recoverable.\r
+     */\r
+  inf_leave:\r
+    RESTORE();\r
+    if (state->wsize || (out != strm->avail_out && state->mode < BAD &&\r
+            (state->mode < CHECK || flush != Z_FINISH)))\r
+        if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {\r
+            state->mode = MEM;\r
+            return Z_MEM_ERROR;\r
+        }\r
+    in -= strm->avail_in;\r
+    out -= strm->avail_out;\r
+    strm->total_in += in;\r
+    strm->total_out += out;\r
+    state->total += out;\r
+    if (state->wrap && out)\r
+        strm->adler = state->check =\r
+            UPDATE(state->check, strm->next_out - out, out);\r
+    strm->data_type = state->bits + (state->last ? 64 : 0) +\r
+                      (state->mode == TYPE ? 128 : 0) +\r
+                      (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);\r
+    if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)\r
+        ret = Z_BUF_ERROR;\r
+    return ret;\r
+}\r
+\r
+int ZEXPORT inflateEnd(strm)\r
+z_streamp strm;\r
+{\r
+    struct inflate_state FAR *state;\r
+    if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)\r
+        return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if (state->window != Z_NULL) ZFREE(strm, state->window);\r
+    ZFREE(strm, strm->state);\r
+    strm->state = Z_NULL;\r
+    Tracev((stderr, "inflate: end\n"));\r
+    return Z_OK;\r
+}\r
+\r
+int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)\r
+z_streamp strm;\r
+Bytef *dictionary;\r
+uInt *dictLength;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    /* check state */\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+\r
+    /* copy dictionary */\r
+    if (state->whave && dictionary != Z_NULL) {\r
+        zmemcpy(dictionary, state->window + state->wnext,\r
+                state->whave - state->wnext);\r
+        zmemcpy(dictionary + state->whave - state->wnext,\r
+                state->window, state->wnext);\r
+    }\r
+    if (dictLength != Z_NULL)\r
+        *dictLength = state->whave;\r
+    return Z_OK;\r
+}\r
+\r
+int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)\r
+z_streamp strm;\r
+const Bytef *dictionary;\r
+uInt dictLength;\r
+{\r
+    struct inflate_state FAR *state;\r
+    unsigned long dictid;\r
+    int ret;\r
+\r
+    /* check state */\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if (state->wrap != 0 && state->mode != DICT)\r
+        return Z_STREAM_ERROR;\r
+\r
+    /* check for correct dictionary identifier */\r
+    if (state->mode == DICT) {\r
+        dictid = adler32(0L, Z_NULL, 0);\r
+        dictid = adler32(dictid, dictionary, dictLength);\r
+        if (dictid != state->check)\r
+            return Z_DATA_ERROR;\r
+    }\r
+\r
+    /* copy dictionary to window using updatewindow(), which will amend the\r
+       existing dictionary if appropriate */\r
+    ret = updatewindow(strm, dictionary + dictLength, dictLength);\r
+    if (ret) {\r
+        state->mode = MEM;\r
+        return Z_MEM_ERROR;\r
+    }\r
+    state->havedict = 1;\r
+    Tracev((stderr, "inflate:   dictionary set\n"));\r
+    return Z_OK;\r
+}\r
+\r
+int ZEXPORT inflateGetHeader(strm, head)\r
+z_streamp strm;\r
+gz_headerp head;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    /* check state */\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;\r
+\r
+    /* save header structure */\r
+    state->head = head;\r
+    head->done = 0;\r
+    return Z_OK;\r
+}\r
+\r
+/*\r
+   Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff.  Return when found\r
+   or when out of input.  When called, *have is the number of pattern bytes\r
+   found in order so far, in 0..3.  On return *have is updated to the new\r
+   state.  If on return *have equals four, then the pattern was found and the\r
+   return value is how many bytes were read including the last byte of the\r
+   pattern.  If *have is less than four, then the pattern has not been found\r
+   yet and the return value is len.  In the latter case, syncsearch() can be\r
+   called again with more data and the *have state.  *have is initialized to\r
+   zero for the first call.\r
+ */\r
+local unsigned syncsearch(have, buf, len)\r
+unsigned FAR *have;\r
+const unsigned char FAR *buf;\r
+unsigned len;\r
+{\r
+    unsigned got;\r
+    unsigned next;\r
+\r
+    got = *have;\r
+    next = 0;\r
+    while (next < len && got < 4) {\r
+        if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))\r
+            got++;\r
+        else if (buf[next])\r
+            got = 0;\r
+        else\r
+            got = 4 - got;\r
+        next++;\r
+    }\r
+    *have = got;\r
+    return next;\r
+}\r
+\r
+int ZEXPORT inflateSync(strm)\r
+z_streamp strm;\r
+{\r
+    unsigned len;               /* number of bytes to look at or looked at */\r
+    unsigned long in, out;      /* temporary to save total_in and total_out */\r
+    unsigned char buf[4];       /* to restore bit buffer to byte string */\r
+    struct inflate_state FAR *state;\r
+\r
+    /* check parameters */\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;\r
+\r
+    /* if first time, start search in bit buffer */\r
+    if (state->mode != SYNC) {\r
+        state->mode = SYNC;\r
+        state->hold <<= state->bits & 7;\r
+        state->bits -= state->bits & 7;\r
+        len = 0;\r
+        while (state->bits >= 8) {\r
+            buf[len++] = (unsigned char)(state->hold);\r
+            state->hold >>= 8;\r
+            state->bits -= 8;\r
+        }\r
+        state->have = 0;\r
+        syncsearch(&(state->have), buf, len);\r
+    }\r
+\r
+    /* search available input */\r
+    len = syncsearch(&(state->have), strm->next_in, strm->avail_in);\r
+    strm->avail_in -= len;\r
+    strm->next_in += len;\r
+    strm->total_in += len;\r
+\r
+    /* return no joy or set up to restart inflate() on a new block */\r
+    if (state->have != 4) return Z_DATA_ERROR;\r
+    in = strm->total_in;  out = strm->total_out;\r
+    inflateReset(strm);\r
+    strm->total_in = in;  strm->total_out = out;\r
+    state->mode = TYPE;\r
+    return Z_OK;\r
+}\r
+\r
+/*\r
+   Returns true if inflate is currently at the end of a block generated by\r
+   Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP\r
+   implementation to provide an additional safety check. PPP uses\r
+   Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored\r
+   block. When decompressing, PPP checks that at the end of input packet,\r
+   inflate is waiting for these length bytes.\r
+ */\r
+int ZEXPORT inflateSyncPoint(strm)\r
+z_streamp strm;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    return state->mode == STORED && state->bits == 0;\r
+}\r
+\r
+int ZEXPORT inflateCopy(dest, source)\r
+z_streamp dest;\r
+z_streamp source;\r
+{\r
+    struct inflate_state FAR *state;\r
+    struct inflate_state FAR *copy;\r
+    unsigned char FAR *window;\r
+    unsigned wsize;\r
+\r
+    /* check input */\r
+    if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||\r
+        source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)\r
+        return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)source->state;\r
+\r
+    /* allocate space */\r
+    copy = (struct inflate_state FAR *)\r
+           ZALLOC(source, 1, sizeof(struct inflate_state));\r
+    if (copy == Z_NULL) return Z_MEM_ERROR;\r
+    window = Z_NULL;\r
+    if (state->window != Z_NULL) {\r
+        window = (unsigned char FAR *)\r
+                 ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));\r
+        if (window == Z_NULL) {\r
+            ZFREE(source, copy);\r
+            return Z_MEM_ERROR;\r
+        }\r
+    }\r
+\r
+    /* copy state */\r
+    zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));\r
+    zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));\r
+    if (state->lencode >= state->codes &&\r
+        state->lencode <= state->codes + ENOUGH - 1) {\r
+        copy->lencode = copy->codes + (state->lencode - state->codes);\r
+        copy->distcode = copy->codes + (state->distcode - state->codes);\r
+    }\r
+    copy->next = copy->codes + (state->next - state->codes);\r
+    if (window != Z_NULL) {\r
+        wsize = 1U << state->wbits;\r
+        zmemcpy(window, state->window, wsize);\r
+    }\r
+    copy->window = window;\r
+    dest->state = (struct internal_state FAR *)copy;\r
+    return Z_OK;\r
+}\r
+\r
+int ZEXPORT inflateUndermine(strm, subvert)\r
+z_streamp strm;\r
+int subvert;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    state->sane = !subvert;\r
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR\r
+    return Z_OK;\r
+#else\r
+    state->sane = 1;\r
+    return Z_DATA_ERROR;\r
+#endif\r
+}\r
+\r
+long ZEXPORT inflateMark(strm)\r
+z_streamp strm;\r
+{\r
+    struct inflate_state FAR *state;\r
+\r
+    if (strm == Z_NULL || strm->state == Z_NULL) return -1L << 16;\r
+    state = (struct inflate_state FAR *)strm->state;\r
+    return ((long)(state->back) << 16) +\r
+        (state->mode == COPY ? state->length :\r
+            (state->mode == MATCH ? state->was - state->length : 0));\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inflate.h
new file mode 100644 (file)
index 0000000..a8ef428
--- /dev/null
@@ -0,0 +1,122 @@
+/* inflate.h -- internal inflate state definition\r
+ * Copyright (C) 1995-2009 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* WARNING: this file should *not* be used by applications. It is\r
+   part of the implementation of the compression library and is\r
+   subject to change. Applications should only use zlib.h.\r
+ */\r
+\r
+/* define NO_GZIP when compiling if you want to disable gzip header and\r
+   trailer decoding by inflate().  NO_GZIP would be used to avoid linking in\r
+   the crc code when it is not needed.  For shared libraries, gzip decoding\r
+   should be left enabled. */\r
+#ifndef NO_GZIP\r
+#  define GUNZIP\r
+#endif\r
+\r
+/* Possible inflate modes between inflate() calls */\r
+typedef enum {\r
+    HEAD,       /* i: waiting for magic header */\r
+    FLAGS,      /* i: waiting for method and flags (gzip) */\r
+    TIME,       /* i: waiting for modification time (gzip) */\r
+    OS,         /* i: waiting for extra flags and operating system (gzip) */\r
+    EXLEN,      /* i: waiting for extra length (gzip) */\r
+    EXTRA,      /* i: waiting for extra bytes (gzip) */\r
+    NAME,       /* i: waiting for end of file name (gzip) */\r
+    COMMENT,    /* i: waiting for end of comment (gzip) */\r
+    HCRC,       /* i: waiting for header crc (gzip) */\r
+    DICTID,     /* i: waiting for dictionary check value */\r
+    DICT,       /* waiting for inflateSetDictionary() call */\r
+        TYPE,       /* i: waiting for type bits, including last-flag bit */\r
+        TYPEDO,     /* i: same, but skip check to exit inflate on new block */\r
+        STORED,     /* i: waiting for stored size (length and complement) */\r
+        COPY_,      /* i/o: same as COPY below, but only first time in */\r
+        COPY,       /* i/o: waiting for input or output to copy stored block */\r
+        TABLE,      /* i: waiting for dynamic block table lengths */\r
+        LENLENS,    /* i: waiting for code length code lengths */\r
+        CODELENS,   /* i: waiting for length/lit and distance code lengths */\r
+            LEN_,       /* i: same as LEN below, but only first time in */\r
+            LEN,        /* i: waiting for length/lit/eob code */\r
+            LENEXT,     /* i: waiting for length extra bits */\r
+            DIST,       /* i: waiting for distance code */\r
+            DISTEXT,    /* i: waiting for distance extra bits */\r
+            MATCH,      /* o: waiting for output space to copy string */\r
+            LIT,        /* o: waiting for output space to write literal */\r
+    CHECK,      /* i: waiting for 32-bit check value */\r
+    LENGTH,     /* i: waiting for 32-bit length (gzip) */\r
+    DONE,       /* finished check, done -- remain here until reset */\r
+    BAD,        /* got a data error -- remain here until reset */\r
+    MEM,        /* got an inflate() memory error -- remain here until reset */\r
+    SYNC        /* looking for synchronization bytes to restart inflate() */\r
+} inflate_mode;\r
+\r
+/*\r
+    State transitions between above modes -\r
+\r
+    (most modes can go to BAD or MEM on error -- not shown for clarity)\r
+\r
+    Process header:\r
+        HEAD -> (gzip) or (zlib) or (raw)\r
+        (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->\r
+                  HCRC -> TYPE\r
+        (zlib) -> DICTID or TYPE\r
+        DICTID -> DICT -> TYPE\r
+        (raw) -> TYPEDO\r
+    Read deflate blocks:\r
+            TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK\r
+            STORED -> COPY_ -> COPY -> TYPE\r
+            TABLE -> LENLENS -> CODELENS -> LEN_\r
+            LEN_ -> LEN\r
+    Read deflate codes in fixed or dynamic block:\r
+                LEN -> LENEXT or LIT or TYPE\r
+                LENEXT -> DIST -> DISTEXT -> MATCH -> LEN\r
+                LIT -> LEN\r
+    Process trailer:\r
+        CHECK -> LENGTH -> DONE\r
+ */\r
+\r
+/* state maintained between inflate() calls.  Approximately 10K bytes. */\r
+struct inflate_state {\r
+    inflate_mode mode;          /* current inflate mode */\r
+    int last;                   /* true if processing last block */\r
+    int wrap;                   /* bit 0 true for zlib, bit 1 true for gzip */\r
+    int havedict;               /* true if dictionary provided */\r
+    int flags;                  /* gzip header method and flags (0 if zlib) */\r
+    unsigned dmax;              /* zlib header max distance (INFLATE_STRICT) */\r
+    unsigned long check;        /* protected copy of check value */\r
+    unsigned long total;        /* protected copy of output count */\r
+    gz_headerp head;            /* where to save gzip header information */\r
+        /* sliding window */\r
+    unsigned wbits;             /* log base 2 of requested window size */\r
+    unsigned wsize;             /* window size or zero if not using window */\r
+    unsigned whave;             /* valid bytes in the window */\r
+    unsigned wnext;             /* window write index */\r
+    unsigned char FAR *window;  /* allocated sliding window, if needed */\r
+        /* bit accumulator */\r
+    unsigned long hold;         /* input bit accumulator */\r
+    unsigned bits;              /* number of bits in "in" */\r
+        /* for string and stored block copying */\r
+    unsigned length;            /* literal or length of data to copy */\r
+    unsigned offset;            /* distance back to copy string from */\r
+        /* for table and code decoding */\r
+    unsigned extra;             /* extra bits needed */\r
+        /* fixed and dynamic code tables */\r
+    code const FAR *lencode;    /* starting table for length/literal codes */\r
+    code const FAR *distcode;   /* starting table for distance codes */\r
+    unsigned lenbits;           /* index bits for lencode */\r
+    unsigned distbits;          /* index bits for distcode */\r
+        /* dynamic table building */\r
+    unsigned ncode;             /* number of code length code lengths */\r
+    unsigned nlen;              /* number of length code lengths */\r
+    unsigned ndist;             /* number of distance code lengths */\r
+    unsigned have;              /* number of code lengths in lens[] */\r
+    code FAR *next;             /* next available space in codes[] */\r
+    unsigned short lens[320];   /* temporary storage for code lengths */\r
+    unsigned short work[288];   /* work area for code table building */\r
+    code codes[ENOUGH];         /* space for code tables */\r
+    int sane;                   /* if false, allow invalid distance too far */\r
+    int back;                   /* bits back of last unprocessed length/lit */\r
+    unsigned was;               /* initial length of match */\r
+};\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.c
new file mode 100644 (file)
index 0000000..9bd1218
--- /dev/null
@@ -0,0 +1,306 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding\r
+ * Copyright (C) 1995-2013 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+#include "zutil.h"\r
+#include "inftrees.h"\r
+\r
+#define MAXBITS 15\r
+\r
+const char inflate_copyright[] =\r
+   " inflate 1.2.8 Copyright 1995-2013 Mark Adler ";\r
+/*\r
+  If you use the zlib library in a product, an acknowledgment is welcome\r
+  in the documentation of your product. If for some reason you cannot\r
+  include such an acknowledgment, I would appreciate that you keep this\r
+  copyright string in the executable of your product.\r
+ */\r
+\r
+/*\r
+   Build a set of tables to decode the provided canonical Huffman code.\r
+   The code lengths are lens[0..codes-1].  The result starts at *table,\r
+   whose indices are 0..2^bits-1.  work is a writable array of at least\r
+   lens shorts, which is used as a work area.  type is the type of code\r
+   to be generated, CODES, LENS, or DISTS.  On return, zero is success,\r
+   -1 is an invalid code, and +1 means that ENOUGH isn't enough.  table\r
+   on return points to the next available entry's address.  bits is the\r
+   requested root table index bits, and on return it is the actual root\r
+   table index bits.  It will differ if the request is greater than the\r
+   longest code or if it is less than the shortest code.\r
+ */\r
+int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)\r
+codetype type;\r
+unsigned short FAR *lens;\r
+unsigned codes;\r
+code FAR * FAR *table;\r
+unsigned FAR *bits;\r
+unsigned short FAR *work;\r
+{\r
+    unsigned len;               /* a code's length in bits */\r
+    unsigned sym;               /* index of code symbols */\r
+    unsigned min, max;          /* minimum and maximum code lengths */\r
+    unsigned root;              /* number of index bits for root table */\r
+    unsigned curr;              /* number of index bits for current table */\r
+    unsigned drop;              /* code bits to drop for sub-table */\r
+    int left;                   /* number of prefix codes available */\r
+    unsigned used;              /* code entries in table used */\r
+    unsigned huff;              /* Huffman code */\r
+    unsigned incr;              /* for incrementing code, index */\r
+    unsigned fill;              /* index for replicating entries */\r
+    unsigned low;               /* low bits for current root entry */\r
+    unsigned mask;              /* mask for low root bits */\r
+    code here;                  /* table entry for duplication */\r
+    code FAR *next;             /* next available space in table */\r
+    const unsigned short FAR *base;     /* base value table to use */\r
+    const unsigned short FAR *extra;    /* extra bits table to use */\r
+    int end;                    /* use base and extra for symbol > end */\r
+    unsigned short count[MAXBITS+1];    /* number of codes of each length */\r
+    unsigned short offs[MAXBITS+1];     /* offsets in table for each length */\r
+    static const unsigned short lbase[31] = { /* Length codes 257..285 base */\r
+        3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,\r
+        35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};\r
+    static const unsigned short lext[31] = { /* Length codes 257..285 extra */\r
+        16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,\r
+        19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78};\r
+    static const unsigned short dbase[32] = { /* Distance codes 0..29 base */\r
+        1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,\r
+        257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,\r
+        8193, 12289, 16385, 24577, 0, 0};\r
+    static const unsigned short dext[32] = { /* Distance codes 0..29 extra */\r
+        16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,\r
+        23, 23, 24, 24, 25, 25, 26, 26, 27, 27,\r
+        28, 28, 29, 29, 64, 64};\r
+\r
+    /*\r
+       Process a set of code lengths to create a canonical Huffman code.  The\r
+       code lengths are lens[0..codes-1].  Each length corresponds to the\r
+       symbols 0..codes-1.  The Huffman code is generated by first sorting the\r
+       symbols by length from short to long, and retaining the symbol order\r
+       for codes with equal lengths.  Then the code starts with all zero bits\r
+       for the first code of the shortest length, and the codes are integer\r
+       increments for the same length, and zeros are appended as the length\r
+       increases.  For the deflate format, these bits are stored backwards\r
+       from their more natural integer increment ordering, and so when the\r
+       decoding tables are built in the large loop below, the integer codes\r
+       are incremented backwards.\r
+\r
+       This routine assumes, but does not check, that all of the entries in\r
+       lens[] are in the range 0..MAXBITS.  The caller must assure this.\r
+       1..MAXBITS is interpreted as that code length.  zero means that that\r
+       symbol does not occur in this code.\r
+\r
+       The codes are sorted by computing a count of codes for each length,\r
+       creating from that a table of starting indices for each length in the\r
+       sorted table, and then entering the symbols in order in the sorted\r
+       table.  The sorted table is work[], with that space being provided by\r
+       the caller.\r
+\r
+       The length counts are used for other purposes as well, i.e. finding\r
+       the minimum and maximum length codes, determining if there are any\r
+       codes at all, checking for a valid set of lengths, and looking ahead\r
+       at length counts to determine sub-table sizes when building the\r
+       decoding tables.\r
+     */\r
+\r
+    /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */\r
+    for (len = 0; len <= MAXBITS; len++)\r
+        count[len] = 0;\r
+    for (sym = 0; sym < codes; sym++)\r
+        count[lens[sym]]++;\r
+\r
+    /* bound code lengths, force root to be within code lengths */\r
+    root = *bits;\r
+    for (max = MAXBITS; max >= 1; max--)\r
+        if (count[max] != 0) break;\r
+    if (root > max) root = max;\r
+    if (max == 0) {                     /* no symbols to code at all */\r
+        here.op = (unsigned char)64;    /* invalid code marker */\r
+        here.bits = (unsigned char)1;\r
+        here.val = (unsigned short)0;\r
+        *(*table)++ = here;             /* make a table to force an error */\r
+        *(*table)++ = here;\r
+        *bits = 1;\r
+        return 0;     /* no symbols, but wait for decoding to report error */\r
+    }\r
+    for (min = 1; min < max; min++)\r
+        if (count[min] != 0) break;\r
+    if (root < min) root = min;\r
+\r
+    /* check for an over-subscribed or incomplete set of lengths */\r
+    left = 1;\r
+    for (len = 1; len <= MAXBITS; len++) {\r
+        left <<= 1;\r
+        left -= count[len];\r
+        if (left < 0) return -1;        /* over-subscribed */\r
+    }\r
+    if (left > 0 && (type == CODES || max != 1))\r
+        return -1;                      /* incomplete set */\r
+\r
+    /* generate offsets into symbol table for each length for sorting */\r
+    offs[1] = 0;\r
+    for (len = 1; len < MAXBITS; len++)\r
+        offs[len + 1] = offs[len] + count[len];\r
+\r
+    /* sort symbols by length, by symbol order within each length */\r
+    for (sym = 0; sym < codes; sym++)\r
+        if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;\r
+\r
+    /*\r
+       Create and fill in decoding tables.  In this loop, the table being\r
+       filled is at next and has curr index bits.  The code being used is huff\r
+       with length len.  That code is converted to an index by dropping drop\r
+       bits off of the bottom.  For codes where len is less than drop + curr,\r
+       those top drop + curr - len bits are incremented through all values to\r
+       fill the table with replicated entries.\r
+\r
+       root is the number of index bits for the root table.  When len exceeds\r
+       root, sub-tables are created pointed to by the root entry with an index\r
+       of the low root bits of huff.  This is saved in low to check for when a\r
+       new sub-table should be started.  drop is zero when the root table is\r
+       being filled, and drop is root when sub-tables are being filled.\r
+\r
+       When a new sub-table is needed, it is necessary to look ahead in the\r
+       code lengths to determine what size sub-table is needed.  The length\r
+       counts are used for this, and so count[] is decremented as codes are\r
+       entered in the tables.\r
+\r
+       used keeps track of how many table entries have been allocated from the\r
+       provided *table space.  It is checked for LENS and DIST tables against\r
+       the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in\r
+       the initial root table size constants.  See the comments in inftrees.h\r
+       for more information.\r
+\r
+       sym increments through all symbols, and the loop terminates when\r
+       all codes of length max, i.e. all codes, have been processed.  This\r
+       routine permits incomplete codes, so another loop after this one fills\r
+       in the rest of the decoding tables with invalid code markers.\r
+     */\r
+\r
+    /* set up for code type */\r
+    switch (type) {\r
+    case CODES:\r
+        base = extra = work;    /* dummy value--not used */\r
+        end = 19;\r
+        break;\r
+    case LENS:\r
+        base = lbase;\r
+        base -= 257;\r
+        extra = lext;\r
+        extra -= 257;\r
+        end = 256;\r
+        break;\r
+    default:            /* DISTS */\r
+        base = dbase;\r
+        extra = dext;\r
+        end = -1;\r
+    }\r
+\r
+    /* initialize state for loop */\r
+    huff = 0;                   /* starting code */\r
+    sym = 0;                    /* starting code symbol */\r
+    len = min;                  /* starting code length */\r
+    next = *table;              /* current table to fill in */\r
+    curr = root;                /* current table index bits */\r
+    drop = 0;                   /* current bits to drop from code for index */\r
+    low = (unsigned)(-1);       /* trigger new sub-table when len > root */\r
+    used = 1U << root;          /* use root table entries */\r
+    mask = used - 1;            /* mask for comparing low */\r
+\r
+    /* check available table space */\r
+    if ((type == LENS && used > ENOUGH_LENS) ||\r
+        (type == DISTS && used > ENOUGH_DISTS))\r
+        return 1;\r
+\r
+    /* process all codes and make table entries */\r
+    for (;;) {\r
+        /* create table entry */\r
+        here.bits = (unsigned char)(len - drop);\r
+        if ((int)(work[sym]) < end) {\r
+            here.op = (unsigned char)0;\r
+            here.val = work[sym];\r
+        }\r
+        else if ((int)(work[sym]) > end) {\r
+            here.op = (unsigned char)(extra[work[sym]]);\r
+            here.val = base[work[sym]];\r
+        }\r
+        else {\r
+            here.op = (unsigned char)(32 + 64);         /* end of block */\r
+            here.val = 0;\r
+        }\r
+\r
+        /* replicate for those indices with low len bits equal to huff */\r
+        incr = 1U << (len - drop);\r
+        fill = 1U << curr;\r
+        min = fill;                 /* save offset to next table */\r
+        do {\r
+            fill -= incr;\r
+            next[(huff >> drop) + fill] = here;\r
+        } while (fill != 0);\r
+\r
+        /* backwards increment the len-bit code huff */\r
+        incr = 1U << (len - 1);\r
+        while (huff & incr)\r
+            incr >>= 1;\r
+        if (incr != 0) {\r
+            huff &= incr - 1;\r
+            huff += incr;\r
+        }\r
+        else\r
+            huff = 0;\r
+\r
+        /* go to next symbol, update count, len */\r
+        sym++;\r
+        if (--(count[len]) == 0) {\r
+            if (len == max) break;\r
+            len = lens[work[sym]];\r
+        }\r
+\r
+        /* create new sub-table if needed */\r
+        if (len > root && (huff & mask) != low) {\r
+            /* if first time, transition to sub-tables */\r
+            if (drop == 0)\r
+                drop = root;\r
+\r
+            /* increment past last table */\r
+            next += min;            /* here min is 1 << curr */\r
+\r
+            /* determine length of next table */\r
+            curr = len - drop;\r
+            left = (int)(1 << curr);\r
+            while (curr + drop < max) {\r
+                left -= count[curr + drop];\r
+                if (left <= 0) break;\r
+                curr++;\r
+                left <<= 1;\r
+            }\r
+\r
+            /* check for enough space */\r
+            used += 1U << curr;\r
+            if ((type == LENS && used > ENOUGH_LENS) ||\r
+                (type == DISTS && used > ENOUGH_DISTS))\r
+                return 1;\r
+\r
+            /* point entry in root table to sub-table */\r
+            low = huff & mask;\r
+            (*table)[low].op = (unsigned char)curr;\r
+            (*table)[low].bits = (unsigned char)root;\r
+            (*table)[low].val = (unsigned short)(next - *table);\r
+        }\r
+    }\r
+\r
+    /* fill in remaining table entry if code is incomplete (guaranteed to have\r
+       at most one remaining entry, since if the code is incomplete, the\r
+       maximum code length that was allowed to get this far is one bit) */\r
+    if (huff != 0) {\r
+        here.op = (unsigned char)64;            /* invalid code marker */\r
+        here.bits = (unsigned char)(len - drop);\r
+        here.val = (unsigned short)0;\r
+        next[huff] = here;\r
+    }\r
+\r
+    /* set return parameters */\r
+    *table += used;\r
+    *bits = root;\r
+    return 0;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/inftrees.h
new file mode 100644 (file)
index 0000000..a685d8c
--- /dev/null
@@ -0,0 +1,62 @@
+/* inftrees.h -- header to use inftrees.c\r
+ * Copyright (C) 1995-2005, 2010 Mark Adler\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* WARNING: this file should *not* be used by applications. It is\r
+   part of the implementation of the compression library and is\r
+   subject to change. Applications should only use zlib.h.\r
+ */\r
+\r
+/* Structure for decoding tables.  Each entry provides either the\r
+   information needed to do the operation requested by the code that\r
+   indexed that table entry, or it provides a pointer to another\r
+   table that indexes more bits of the code.  op indicates whether\r
+   the entry is a pointer to another table, a literal, a length or\r
+   distance, an end-of-block, or an invalid code.  For a table\r
+   pointer, the low four bits of op is the number of index bits of\r
+   that table.  For a length or distance, the low four bits of op\r
+   is the number of extra bits to get after the code.  bits is\r
+   the number of bits in this code or part of the code to drop off\r
+   of the bit buffer.  val is the actual byte to output in the case\r
+   of a literal, the base length or distance, or the offset from\r
+   the current table to the next table.  Each entry is four bytes. */\r
+typedef struct {\r
+    unsigned char op;           /* operation, extra bits, table bits */\r
+    unsigned char bits;         /* bits in this part of the code */\r
+    unsigned short val;         /* offset in table or code value */\r
+} code;\r
+\r
+/* op values as set by inflate_table():\r
+    00000000 - literal\r
+    0000tttt - table link, tttt != 0 is the number of table index bits\r
+    0001eeee - length or distance, eeee is the number of extra bits\r
+    01100000 - end of block\r
+    01000000 - invalid code\r
+ */\r
+\r
+/* Maximum size of the dynamic table.  The maximum number of code structures is\r
+   1444, which is the sum of 852 for literal/length codes and 592 for distance\r
+   codes.  These values were found by exhaustive searches using the program\r
+   examples/enough.c found in the zlib distribtution.  The arguments to that\r
+   program are the number of symbols, the initial root table size, and the\r
+   maximum bit length of a code.  "enough 286 9 15" for literal/length codes\r
+   returns returns 852, and "enough 30 6 15" for distance codes returns 592.\r
+   The initial root table size (9 or 6) is found in the fifth argument of the\r
+   inflate_table() calls in inflate.c and infback.c.  If the root table size is\r
+   changed, then these maximum sizes would be need to be recalculated and\r
+   updated. */\r
+#define ENOUGH_LENS 852\r
+#define ENOUGH_DISTS 592\r
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)\r
+\r
+/* Type of code to build for inflate_table() */\r
+typedef enum {\r
+    CODES,\r
+    LENS,\r
+    DISTS\r
+} codetype;\r
+\r
+int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,\r
+                             unsigned codes, code FAR * FAR *table,\r
+                             unsigned FAR *bits, unsigned short FAR *work));\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/minigzip.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/minigzip.c
new file mode 100644 (file)
index 0000000..8e9c09f
--- /dev/null
@@ -0,0 +1,651 @@
+/* minigzip.c -- simulate gzip using the zlib compression library\r
+ * Copyright (C) 1995-2006, 2010, 2011 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/*\r
+ * minigzip is a minimal implementation of the gzip utility. This is\r
+ * only an example of using zlib and isn't meant to replace the\r
+ * full-featured gzip. No attempt is made to deal with file systems\r
+ * limiting names to 14 or 8+3 characters, etc... Error checking is\r
+ * very limited. So use minigzip only for testing; use gzip for the\r
+ * real thing. On MSDOS, use only on file names without extension\r
+ * or in pipe mode.\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#include "zlib.h"\r
+#include <stdio.h>\r
+\r
+#ifdef STDC\r
+#  include <string.h>\r
+#  include <stdlib.h>\r
+#endif\r
+\r
+#ifdef USE_MMAP\r
+#  include <sys/types.h>\r
+#  include <sys/mman.h>\r
+#  include <sys/stat.h>\r
+#endif\r
+\r
+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)\r
+#  include <fcntl.h>\r
+#  include <io.h>\r
+#  ifdef UNDER_CE\r
+#    include <stdlib.h>\r
+#  endif\r
+#  define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)\r
+#else\r
+#  define SET_BINARY_MODE(file)\r
+#endif\r
+\r
+#ifdef _MSC_VER\r
+#  define snprintf _snprintf\r
+#endif\r
+\r
+#ifdef VMS\r
+#  define unlink delete\r
+#  define GZ_SUFFIX "-gz"\r
+#endif\r
+#ifdef RISCOS\r
+#  define unlink remove\r
+#  define GZ_SUFFIX "-gz"\r
+#  define fileno(file) file->__file\r
+#endif\r
+#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os\r
+#  include <unix.h> /* for fileno */\r
+#endif\r
+\r
+#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE)\r
+#ifndef WIN32 /* unlink already in stdio.h for WIN32 */\r
+  extern int unlink OF((const char *));\r
+#endif\r
+#endif\r
+\r
+#if defined(UNDER_CE)\r
+#  include <windows.h>\r
+#  define perror(s) pwinerror(s)\r
+\r
+/* Map the Windows error number in ERROR to a locale-dependent error\r
+   message string and return a pointer to it.  Typically, the values\r
+   for ERROR come from GetLastError.\r
+\r
+   The string pointed to shall not be modified by the application,\r
+   but may be overwritten by a subsequent call to strwinerror\r
+\r
+   The strwinerror function does not change the current setting\r
+   of GetLastError.  */\r
+\r
+static char *strwinerror (error)\r
+     DWORD error;\r
+{\r
+    static char buf[1024];\r
+\r
+    wchar_t *msgbuf;\r
+    DWORD lasterr = GetLastError();\r
+    DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM\r
+        | FORMAT_MESSAGE_ALLOCATE_BUFFER,\r
+        NULL,\r
+        error,\r
+        0, /* Default language */\r
+        (LPVOID)&msgbuf,\r
+        0,\r
+        NULL);\r
+    if (chars != 0) {\r
+        /* If there is an \r\n appended, zap it.  */\r
+        if (chars >= 2\r
+            && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {\r
+            chars -= 2;\r
+            msgbuf[chars] = 0;\r
+        }\r
+\r
+        if (chars > sizeof (buf) - 1) {\r
+            chars = sizeof (buf) - 1;\r
+            msgbuf[chars] = 0;\r
+        }\r
+\r
+        wcstombs(buf, msgbuf, chars + 1);\r
+        LocalFree(msgbuf);\r
+    }\r
+    else {\r
+        sprintf(buf, "unknown win32 error (%ld)", error);\r
+    }\r
+\r
+    SetLastError(lasterr);\r
+    return buf;\r
+}\r
+\r
+static void pwinerror (s)\r
+    const char *s;\r
+{\r
+    if (s && *s)\r
+        fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ()));\r
+    else\r
+        fprintf(stderr, "%s\n", strwinerror(GetLastError ()));\r
+}\r
+\r
+#endif /* UNDER_CE */\r
+\r
+#ifndef GZ_SUFFIX\r
+#  define GZ_SUFFIX ".gz"\r
+#endif\r
+#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)\r
+\r
+#define BUFLEN      16384\r
+#define MAX_NAME_LEN 1024\r
+\r
+#ifdef MAXSEG_64K\r
+#  define local static\r
+   /* Needed for systems with limitation on stack size. */\r
+#else\r
+#  define local\r
+#endif\r
+\r
+#ifdef Z_SOLO\r
+/* for Z_SOLO, create simplified gz* functions using deflate and inflate */\r
+\r
+#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE)\r
+#  include <unistd.h>       /* for unlink() */\r
+#endif\r
+\r
+void *myalloc OF((void *, unsigned, unsigned));\r
+void myfree OF((void *, void *));\r
+\r
+void *myalloc(q, n, m)\r
+    void *q;\r
+    unsigned n, m;\r
+{\r
+    q = Z_NULL;\r
+    return calloc(n, m);\r
+}\r
+\r
+void myfree(q, p)\r
+    void *q, *p;\r
+{\r
+    q = Z_NULL;\r
+    free(p);\r
+}\r
+\r
+typedef struct gzFile_s {\r
+    FILE *file;\r
+    int write;\r
+    int err;\r
+    char *msg;\r
+    z_stream strm;\r
+} *gzFile;\r
+\r
+gzFile gzopen OF((const char *, const char *));\r
+gzFile gzdopen OF((int, const char *));\r
+gzFile gz_open OF((const char *, int, const char *));\r
+\r
+gzFile gzopen(path, mode)\r
+const char *path;\r
+const char *mode;\r
+{\r
+    return gz_open(path, -1, mode);\r
+}\r
+\r
+gzFile gzdopen(fd, mode)\r
+int fd;\r
+const char *mode;\r
+{\r
+    return gz_open(NULL, fd, mode);\r
+}\r
+\r
+gzFile gz_open(path, fd, mode)\r
+    const char *path;\r
+    int fd;\r
+    const char *mode;\r
+{\r
+    gzFile gz;\r
+    int ret;\r
+\r
+    gz = malloc(sizeof(struct gzFile_s));\r
+    if (gz == NULL)\r
+        return NULL;\r
+    gz->write = strchr(mode, 'w') != NULL;\r
+    gz->strm.zalloc = myalloc;\r
+    gz->strm.zfree = myfree;\r
+    gz->strm.opaque = Z_NULL;\r
+    if (gz->write)\r
+        ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0);\r
+    else {\r
+        gz->strm.next_in = 0;\r
+        gz->strm.avail_in = Z_NULL;\r
+        ret = inflateInit2(&(gz->strm), 15 + 16);\r
+    }\r
+    if (ret != Z_OK) {\r
+        free(gz);\r
+        return NULL;\r
+    }\r
+    gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") :\r
+                              fopen(path, gz->write ? "wb" : "rb");\r
+    if (gz->file == NULL) {\r
+        gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm));\r
+        free(gz);\r
+        return NULL;\r
+    }\r
+    gz->err = 0;\r
+    gz->msg = "";\r
+    return gz;\r
+}\r
+\r
+int gzwrite OF((gzFile, const void *, unsigned));\r
+\r
+int gzwrite(gz, buf, len)\r
+    gzFile gz;\r
+    const void *buf;\r
+    unsigned len;\r
+{\r
+    z_stream *strm;\r
+    unsigned char out[BUFLEN];\r
+\r
+    if (gz == NULL || !gz->write)\r
+        return 0;\r
+    strm = &(gz->strm);\r
+    strm->next_in = (void *)buf;\r
+    strm->avail_in = len;\r
+    do {\r
+        strm->next_out = out;\r
+        strm->avail_out = BUFLEN;\r
+        (void)deflate(strm, Z_NO_FLUSH);\r
+        fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);\r
+    } while (strm->avail_out == 0);\r
+    return len;\r
+}\r
+\r
+int gzread OF((gzFile, void *, unsigned));\r
+\r
+int gzread(gz, buf, len)\r
+    gzFile gz;\r
+    void *buf;\r
+    unsigned len;\r
+{\r
+    int ret;\r
+    unsigned got;\r
+    unsigned char in[1];\r
+    z_stream *strm;\r
+\r
+    if (gz == NULL || gz->write)\r
+        return 0;\r
+    if (gz->err)\r
+        return 0;\r
+    strm = &(gz->strm);\r
+    strm->next_out = (void *)buf;\r
+    strm->avail_out = len;\r
+    do {\r
+        got = fread(in, 1, 1, gz->file);\r
+        if (got == 0)\r
+            break;\r
+        strm->next_in = in;\r
+        strm->avail_in = 1;\r
+        ret = inflate(strm, Z_NO_FLUSH);\r
+        if (ret == Z_DATA_ERROR) {\r
+            gz->err = Z_DATA_ERROR;\r
+            gz->msg = strm->msg;\r
+            return 0;\r
+        }\r
+        if (ret == Z_STREAM_END)\r
+            inflateReset(strm);\r
+    } while (strm->avail_out);\r
+    return len - strm->avail_out;\r
+}\r
+\r
+int gzclose OF((gzFile));\r
+\r
+int gzclose(gz)\r
+    gzFile gz;\r
+{\r
+    z_stream *strm;\r
+    unsigned char out[BUFLEN];\r
+\r
+    if (gz == NULL)\r
+        return Z_STREAM_ERROR;\r
+    strm = &(gz->strm);\r
+    if (gz->write) {\r
+        strm->next_in = Z_NULL;\r
+        strm->avail_in = 0;\r
+        do {\r
+            strm->next_out = out;\r
+            strm->avail_out = BUFLEN;\r
+            (void)deflate(strm, Z_FINISH);\r
+            fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);\r
+        } while (strm->avail_out == 0);\r
+        deflateEnd(strm);\r
+    }\r
+    else\r
+        inflateEnd(strm);\r
+    fclose(gz->file);\r
+    free(gz);\r
+    return Z_OK;\r
+}\r
+\r
+const char *gzerror OF((gzFile, int *));\r
+\r
+const char *gzerror(gz, err)\r
+    gzFile gz;\r
+    int *err;\r
+{\r
+    *err = gz->err;\r
+    return gz->msg;\r
+}\r
+\r
+#endif\r
+\r
+char *prog;\r
+\r
+void error            OF((const char *msg));\r
+void gz_compress      OF((FILE   *in, gzFile out));\r
+#ifdef USE_MMAP\r
+int  gz_compress_mmap OF((FILE   *in, gzFile out));\r
+#endif\r
+void gz_uncompress    OF((gzFile in, FILE   *out));\r
+void file_compress    OF((char  *file, char *mode));\r
+void file_uncompress  OF((char  *file));\r
+int  main             OF((int argc, char *argv[]));\r
+\r
+/* ===========================================================================\r
+ * Display error message and exit\r
+ */\r
+void error(msg)\r
+    const char *msg;\r
+{\r
+    fprintf(stderr, "%s: %s\n", prog, msg);\r
+    exit(1);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Compress input to output then close both files.\r
+ */\r
+\r
+void gz_compress(in, out)\r
+    FILE   *in;\r
+    gzFile out;\r
+{\r
+    local char buf[BUFLEN];\r
+    int len;\r
+    int err;\r
+\r
+#ifdef USE_MMAP\r
+    /* Try first compressing with mmap. If mmap fails (minigzip used in a\r
+     * pipe), use the normal fread loop.\r
+     */\r
+    if (gz_compress_mmap(in, out) == Z_OK) return;\r
+#endif\r
+    for (;;) {\r
+        len = (int)fread(buf, 1, sizeof(buf), in);\r
+        if (ferror(in)) {\r
+            perror("fread");\r
+            exit(1);\r
+        }\r
+        if (len == 0) break;\r
+\r
+        if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));\r
+    }\r
+    fclose(in);\r
+    if (gzclose(out) != Z_OK) error("failed gzclose");\r
+}\r
+\r
+#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */\r
+\r
+/* Try compressing the input file at once using mmap. Return Z_OK if\r
+ * if success, Z_ERRNO otherwise.\r
+ */\r
+int gz_compress_mmap(in, out)\r
+    FILE   *in;\r
+    gzFile out;\r
+{\r
+    int len;\r
+    int err;\r
+    int ifd = fileno(in);\r
+    caddr_t buf;    /* mmap'ed buffer for the entire input file */\r
+    off_t buf_len;  /* length of the input file */\r
+    struct stat sb;\r
+\r
+    /* Determine the size of the file, needed for mmap: */\r
+    if (fstat(ifd, &sb) < 0) return Z_ERRNO;\r
+    buf_len = sb.st_size;\r
+    if (buf_len <= 0) return Z_ERRNO;\r
+\r
+    /* Now do the actual mmap: */\r
+    buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);\r
+    if (buf == (caddr_t)(-1)) return Z_ERRNO;\r
+\r
+    /* Compress the whole file at once: */\r
+    len = gzwrite(out, (char *)buf, (unsigned)buf_len);\r
+\r
+    if (len != (int)buf_len) error(gzerror(out, &err));\r
+\r
+    munmap(buf, buf_len);\r
+    fclose(in);\r
+    if (gzclose(out) != Z_OK) error("failed gzclose");\r
+    return Z_OK;\r
+}\r
+#endif /* USE_MMAP */\r
+\r
+/* ===========================================================================\r
+ * Uncompress input to output then close both files.\r
+ */\r
+void gz_uncompress(in, out)\r
+    gzFile in;\r
+    FILE   *out;\r
+{\r
+    local char buf[BUFLEN];\r
+    int len;\r
+    int err;\r
+\r
+    for (;;) {\r
+        len = gzread(in, buf, sizeof(buf));\r
+        if (len < 0) error (gzerror(in, &err));\r
+        if (len == 0) break;\r
+\r
+        if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {\r
+            error("failed fwrite");\r
+        }\r
+    }\r
+    if (fclose(out)) error("failed fclose");\r
+\r
+    if (gzclose(in) != Z_OK) error("failed gzclose");\r
+}\r
+\r
+\r
+/* ===========================================================================\r
+ * Compress the given file: create a corresponding .gz file and remove the\r
+ * original.\r
+ */\r
+void file_compress(file, mode)\r
+    char  *file;\r
+    char  *mode;\r
+{\r
+    local char outfile[MAX_NAME_LEN];\r
+    FILE  *in;\r
+    gzFile out;\r
+\r
+    if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) {\r
+        fprintf(stderr, "%s: filename too long\n", prog);\r
+        exit(1);\r
+    }\r
+\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+    snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX);\r
+#else\r
+    strcpy(outfile, file);\r
+    strcat(outfile, GZ_SUFFIX);\r
+#endif\r
+\r
+    in = fopen(file, "rb");\r
+    if (in == NULL) {\r
+        perror(file);\r
+        exit(1);\r
+    }\r
+    out = gzopen(outfile, mode);\r
+    if (out == NULL) {\r
+        fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);\r
+        exit(1);\r
+    }\r
+    gz_compress(in, out);\r
+\r
+    unlink(file);\r
+}\r
+\r
+\r
+/* ===========================================================================\r
+ * Uncompress the given file and remove the original.\r
+ */\r
+void file_uncompress(file)\r
+    char  *file;\r
+{\r
+    local char buf[MAX_NAME_LEN];\r
+    char *infile, *outfile;\r
+    FILE  *out;\r
+    gzFile in;\r
+    size_t len = strlen(file);\r
+\r
+    if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) {\r
+        fprintf(stderr, "%s: filename too long\n", prog);\r
+        exit(1);\r
+    }\r
+\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+    snprintf(buf, sizeof(buf), "%s", file);\r
+#else\r
+    strcpy(buf, file);\r
+#endif\r
+\r
+    if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {\r
+        infile = file;\r
+        outfile = buf;\r
+        outfile[len-3] = '\0';\r
+    } else {\r
+        outfile = file;\r
+        infile = buf;\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+        snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX);\r
+#else\r
+        strcat(infile, GZ_SUFFIX);\r
+#endif\r
+    }\r
+    in = gzopen(infile, "rb");\r
+    if (in == NULL) {\r
+        fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);\r
+        exit(1);\r
+    }\r
+    out = fopen(outfile, "wb");\r
+    if (out == NULL) {\r
+        perror(file);\r
+        exit(1);\r
+    }\r
+\r
+    gz_uncompress(in, out);\r
+\r
+    unlink(infile);\r
+}\r
+\r
+\r
+/* ===========================================================================\r
+ * Usage:  minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]\r
+ *   -c : write to standard output\r
+ *   -d : decompress\r
+ *   -f : compress with Z_FILTERED\r
+ *   -h : compress with Z_HUFFMAN_ONLY\r
+ *   -r : compress with Z_RLE\r
+ *   -1 to -9 : compression level\r
+ */\r
+\r
+int main(argc, argv)\r
+    int argc;\r
+    char *argv[];\r
+{\r
+    int copyout = 0;\r
+    int uncompr = 0;\r
+    gzFile file;\r
+    char *bname, outmode[20];\r
+\r
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)\r
+    snprintf(outmode, sizeof(outmode), "%s", "wb6 ");\r
+#else\r
+    strcpy(outmode, "wb6 ");\r
+#endif\r
+\r
+    prog = argv[0];\r
+    bname = strrchr(argv[0], '/');\r
+    if (bname)\r
+      bname++;\r
+    else\r
+      bname = argv[0];\r
+    argc--, argv++;\r
+\r
+    if (!strcmp(bname, "gunzip"))\r
+      uncompr = 1;\r
+    else if (!strcmp(bname, "zcat"))\r
+      copyout = uncompr = 1;\r
+\r
+    while (argc > 0) {\r
+      if (strcmp(*argv, "-c") == 0)\r
+        copyout = 1;\r
+      else if (strcmp(*argv, "-d") == 0)\r
+        uncompr = 1;\r
+      else if (strcmp(*argv, "-f") == 0)\r
+        outmode[3] = 'f';\r
+      else if (strcmp(*argv, "-h") == 0)\r
+        outmode[3] = 'h';\r
+      else if (strcmp(*argv, "-r") == 0)\r
+        outmode[3] = 'R';\r
+      else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&\r
+               (*argv)[2] == 0)\r
+        outmode[2] = (*argv)[1];\r
+      else\r
+        break;\r
+      argc--, argv++;\r
+    }\r
+    if (outmode[3] == ' ')\r
+        outmode[3] = 0;\r
+    if (argc == 0) {\r
+        SET_BINARY_MODE(stdin);\r
+        SET_BINARY_MODE(stdout);\r
+        if (uncompr) {\r
+            file = gzdopen(fileno(stdin), "rb");\r
+            if (file == NULL) error("can't gzdopen stdin");\r
+            gz_uncompress(file, stdout);\r
+        } else {\r
+            file = gzdopen(fileno(stdout), outmode);\r
+            if (file == NULL) error("can't gzdopen stdout");\r
+            gz_compress(stdin, file);\r
+        }\r
+    } else {\r
+        if (copyout) {\r
+            SET_BINARY_MODE(stdout);\r
+        }\r
+        do {\r
+            if (uncompr) {\r
+                if (copyout) {\r
+                    file = gzopen(*argv, "rb");\r
+                    if (file == NULL)\r
+                        fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);\r
+                    else\r
+                        gz_uncompress(file, stdout);\r
+                } else {\r
+                    file_uncompress(*argv);\r
+                }\r
+            } else {\r
+                if (copyout) {\r
+                    FILE * in = fopen(*argv, "rb");\r
+\r
+                    if (in == NULL) {\r
+                        perror(*argv);\r
+                    } else {\r
+                        file = gzdopen(fileno(stdout), outmode);\r
+                        if (file == NULL) error("can't gzdopen stdout");\r
+\r
+                        gz_compress(in, file);\r
+                    }\r
+\r
+                } else {\r
+                    file_compress(*argv, outmode);\r
+                }\r
+            }\r
+        } while (argv++, --argc);\r
+    }\r
+    return 0;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.c
new file mode 100644 (file)
index 0000000..d5b32d1
--- /dev/null
@@ -0,0 +1,1226 @@
+/* trees.c -- output deflated data using Huffman coding\r
+ * Copyright (C) 1995-2012 Jean-loup Gailly\r
+ * detect_data_type() function provided freely by Cosmin Truta, 2006\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/*\r
+ *  ALGORITHM\r
+ *\r
+ *      The "deflation" process uses several Huffman trees. The more\r
+ *      common source values are represented by shorter bit sequences.\r
+ *\r
+ *      Each code tree is stored in a compressed form which is itself\r
+ * a Huffman encoding of the lengths of all the code strings (in\r
+ * ascending order by source values).  The actual code strings are\r
+ * reconstructed from the lengths in the inflate process, as described\r
+ * in the deflate specification.\r
+ *\r
+ *  REFERENCES\r
+ *\r
+ *      Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".\r
+ *      Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc\r
+ *\r
+ *      Storer, James A.\r
+ *          Data Compression:  Methods and Theory, pp. 49-50.\r
+ *          Computer Science Press, 1988.  ISBN 0-7167-8156-5.\r
+ *\r
+ *      Sedgewick, R.\r
+ *          Algorithms, p290.\r
+ *          Addison-Wesley, 1983. ISBN 0-201-06672-6.\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+/* #define GEN_TREES_H */\r
+\r
+#include "deflate.h"\r
+\r
+#ifdef DEBUG\r
+#  include <ctype.h>\r
+#endif\r
+\r
+/* ===========================================================================\r
+ * Constants\r
+ */\r
+\r
+#define MAX_BL_BITS 7\r
+/* Bit length codes must not exceed MAX_BL_BITS bits */\r
+\r
+#define END_BLOCK 256\r
+/* end of block literal code */\r
+\r
+#define REP_3_6      16\r
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */\r
+\r
+#define REPZ_3_10    17\r
+/* repeat a zero length 3-10 times  (3 bits of repeat count) */\r
+\r
+#define REPZ_11_138  18\r
+/* repeat a zero length 11-138 times  (7 bits of repeat count) */\r
+\r
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */\r
+   = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};\r
+\r
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */\r
+   = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};\r
+\r
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */\r
+   = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};\r
+\r
+local const uch bl_order[BL_CODES]\r
+   = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};\r
+/* The lengths of the bit length codes are sent in order of decreasing\r
+ * probability, to avoid transmitting the lengths for unused bit length codes.\r
+ */\r
+\r
+/* ===========================================================================\r
+ * Local data. These are initialized only once.\r
+ */\r
+\r
+#define DIST_CODE_LEN  512 /* see definition of array dist_code below */\r
+\r
+#if defined(GEN_TREES_H) || !defined(STDC)\r
+/* non ANSI compilers may not accept trees.h */\r
+\r
+local ct_data static_ltree[L_CODES+2];\r
+/* The static literal tree. Since the bit lengths are imposed, there is no\r
+ * need for the L_CODES extra codes used during heap construction. However\r
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init\r
+ * below).\r
+ */\r
+\r
+local ct_data static_dtree[D_CODES];\r
+/* The static distance tree. (Actually a trivial tree since all codes use\r
+ * 5 bits.)\r
+ */\r
+\r
+uch _dist_code[DIST_CODE_LEN];\r
+/* Distance codes. The first 256 values correspond to the distances\r
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of\r
+ * the 15 bit distances.\r
+ */\r
+\r
+uch _length_code[MAX_MATCH-MIN_MATCH+1];\r
+/* length code for each normalized match length (0 == MIN_MATCH) */\r
+\r
+local int base_length[LENGTH_CODES];\r
+/* First normalized length for each code (0 = MIN_MATCH) */\r
+\r
+local int base_dist[D_CODES];\r
+/* First normalized distance for each code (0 = distance of 1) */\r
+\r
+#else\r
+#  include "trees.h"\r
+#endif /* GEN_TREES_H */\r
+\r
+struct static_tree_desc_s {\r
+    const ct_data *static_tree;  /* static tree or NULL */\r
+    const intf *extra_bits;      /* extra bits for each code or NULL */\r
+    int     extra_base;          /* base index for extra_bits */\r
+    int     elems;               /* max number of elements in the tree */\r
+    int     max_length;          /* max bit length for the codes */\r
+};\r
+\r
+local static_tree_desc  static_l_desc =\r
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};\r
+\r
+local static_tree_desc  static_d_desc =\r
+{static_dtree, extra_dbits, 0,          D_CODES, MAX_BITS};\r
+\r
+local static_tree_desc  static_bl_desc =\r
+{(const ct_data *)0, extra_blbits, 0,   BL_CODES, MAX_BL_BITS};\r
+\r
+/* ===========================================================================\r
+ * Local (static) routines in this file.\r
+ */\r
+\r
+local void tr_static_init OF((void));\r
+local void init_block     OF((deflate_state *s));\r
+local void pqdownheap     OF((deflate_state *s, ct_data *tree, int k));\r
+local void gen_bitlen     OF((deflate_state *s, tree_desc *desc));\r
+local void gen_codes      OF((ct_data *tree, int max_code, ushf *bl_count));\r
+local void build_tree     OF((deflate_state *s, tree_desc *desc));\r
+local void scan_tree      OF((deflate_state *s, ct_data *tree, int max_code));\r
+local void send_tree      OF((deflate_state *s, ct_data *tree, int max_code));\r
+local int  build_bl_tree  OF((deflate_state *s));\r
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,\r
+                              int blcodes));\r
+local void compress_block OF((deflate_state *s, const ct_data *ltree,\r
+                              const ct_data *dtree));\r
+local int  detect_data_type OF((deflate_state *s));\r
+local unsigned bi_reverse OF((unsigned value, int length));\r
+local void bi_windup      OF((deflate_state *s));\r
+local void bi_flush       OF((deflate_state *s));\r
+local void copy_block     OF((deflate_state *s, charf *buf, unsigned len,\r
+                              int header));\r
+\r
+#ifdef GEN_TREES_H\r
+local void gen_trees_header OF((void));\r
+#endif\r
+\r
+#ifndef DEBUG\r
+#  define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)\r
+   /* Send a code of the given tree. c and tree must not have side effects */\r
+\r
+#else /* DEBUG */\r
+#  define send_code(s, c, tree) \\r
+     { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \\r
+       send_bits(s, tree[c].Code, tree[c].Len); }\r
+#endif\r
+\r
+/* ===========================================================================\r
+ * Output a short LSB first on the stream.\r
+ * IN assertion: there is enough room in pendingBuf.\r
+ */\r
+#define put_short(s, w) { \\r
+    put_byte(s, (uch)((w) & 0xff)); \\r
+    put_byte(s, (uch)((ush)(w) >> 8)); \\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send a value on a given number of bits.\r
+ * IN assertion: length <= 16 and value fits in length bits.\r
+ */\r
+#ifdef DEBUG\r
+local void send_bits      OF((deflate_state *s, int value, int length));\r
+\r
+local void send_bits(s, value, length)\r
+    deflate_state *s;\r
+    int value;  /* value to send */\r
+    int length; /* number of bits */\r
+{\r
+    Tracevv((stderr," l %2d v %4x ", length, value));\r
+    Assert(length > 0 && length <= 15, "invalid length");\r
+    s->bits_sent += (ulg)length;\r
+\r
+    /* If not enough room in bi_buf, use (valid) bits from bi_buf and\r
+     * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))\r
+     * unused bits in value.\r
+     */\r
+    if (s->bi_valid > (int)Buf_size - length) {\r
+        s->bi_buf |= (ush)value << s->bi_valid;\r
+        put_short(s, s->bi_buf);\r
+        s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);\r
+        s->bi_valid += length - Buf_size;\r
+    } else {\r
+        s->bi_buf |= (ush)value << s->bi_valid;\r
+        s->bi_valid += length;\r
+    }\r
+}\r
+#else /* !DEBUG */\r
+\r
+#define send_bits(s, value, length) \\r
+{ int len = length;\\r
+  if (s->bi_valid > (int)Buf_size - len) {\\r
+    int val = value;\\r
+    s->bi_buf |= (ush)val << s->bi_valid;\\r
+    put_short(s, s->bi_buf);\\r
+    s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\\r
+    s->bi_valid += len - Buf_size;\\r
+  } else {\\r
+    s->bi_buf |= (ush)(value) << s->bi_valid;\\r
+    s->bi_valid += len;\\r
+  }\\r
+}\r
+#endif /* DEBUG */\r
+\r
+\r
+/* the arguments must not have side effects */\r
+\r
+/* ===========================================================================\r
+ * Initialize the various 'constant' tables.\r
+ */\r
+local void tr_static_init()\r
+{\r
+#if defined(GEN_TREES_H) || !defined(STDC)\r
+    static int static_init_done = 0;\r
+    int n;        /* iterates over tree elements */\r
+    int bits;     /* bit counter */\r
+    int length;   /* length value */\r
+    int code;     /* code value */\r
+    int dist;     /* distance index */\r
+    ush bl_count[MAX_BITS+1];\r
+    /* number of codes at each bit length for an optimal tree */\r
+\r
+    if (static_init_done) return;\r
+\r
+    /* For some embedded targets, global variables are not initialized: */\r
+#ifdef NO_INIT_GLOBAL_POINTERS\r
+    static_l_desc.static_tree = static_ltree;\r
+    static_l_desc.extra_bits = extra_lbits;\r
+    static_d_desc.static_tree = static_dtree;\r
+    static_d_desc.extra_bits = extra_dbits;\r
+    static_bl_desc.extra_bits = extra_blbits;\r
+#endif\r
+\r
+    /* Initialize the mapping length (0..255) -> length code (0..28) */\r
+    length = 0;\r
+    for (code = 0; code < LENGTH_CODES-1; code++) {\r
+        base_length[code] = length;\r
+        for (n = 0; n < (1<<extra_lbits[code]); n++) {\r
+            _length_code[length++] = (uch)code;\r
+        }\r
+    }\r
+    Assert (length == 256, "tr_static_init: length != 256");\r
+    /* Note that the length 255 (match length 258) can be represented\r
+     * in two different ways: code 284 + 5 bits or code 285, so we\r
+     * overwrite length_code[255] to use the best encoding:\r
+     */\r
+    _length_code[length-1] = (uch)code;\r
+\r
+    /* Initialize the mapping dist (0..32K) -> dist code (0..29) */\r
+    dist = 0;\r
+    for (code = 0 ; code < 16; code++) {\r
+        base_dist[code] = dist;\r
+        for (n = 0; n < (1<<extra_dbits[code]); n++) {\r
+            _dist_code[dist++] = (uch)code;\r
+        }\r
+    }\r
+    Assert (dist == 256, "tr_static_init: dist != 256");\r
+    dist >>= 7; /* from now on, all distances are divided by 128 */\r
+    for ( ; code < D_CODES; code++) {\r
+        base_dist[code] = dist << 7;\r
+        for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {\r
+            _dist_code[256 + dist++] = (uch)code;\r
+        }\r
+    }\r
+    Assert (dist == 256, "tr_static_init: 256+dist != 512");\r
+\r
+    /* Construct the codes of the static literal tree */\r
+    for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;\r
+    n = 0;\r
+    while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;\r
+    while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;\r
+    while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;\r
+    while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;\r
+    /* Codes 286 and 287 do not exist, but we must include them in the\r
+     * tree construction to get a canonical Huffman tree (longest code\r
+     * all ones)\r
+     */\r
+    gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);\r
+\r
+    /* The static distance tree is trivial: */\r
+    for (n = 0; n < D_CODES; n++) {\r
+        static_dtree[n].Len = 5;\r
+        static_dtree[n].Code = bi_reverse((unsigned)n, 5);\r
+    }\r
+    static_init_done = 1;\r
+\r
+#  ifdef GEN_TREES_H\r
+    gen_trees_header();\r
+#  endif\r
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */\r
+}\r
+\r
+/* ===========================================================================\r
+ * Genererate the file trees.h describing the static trees.\r
+ */\r
+#ifdef GEN_TREES_H\r
+#  ifndef DEBUG\r
+#    include <stdio.h>\r
+#  endif\r
+\r
+#  define SEPARATOR(i, last, width) \\r
+      ((i) == (last)? "\n};\n\n" :    \\r
+       ((i) % (width) == (width)-1 ? ",\n" : ", "))\r
+\r
+void gen_trees_header()\r
+{\r
+    FILE *header = fopen("trees.h", "w");\r
+    int i;\r
+\r
+    Assert (header != NULL, "Can't open trees.h");\r
+    fprintf(header,\r
+            "/* header created automatically with -DGEN_TREES_H */\n\n");\r
+\r
+    fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");\r
+    for (i = 0; i < L_CODES+2; i++) {\r
+        fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,\r
+                static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));\r
+    }\r
+\r
+    fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");\r
+    for (i = 0; i < D_CODES; i++) {\r
+        fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,\r
+                static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));\r
+    }\r
+\r
+    fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");\r
+    for (i = 0; i < DIST_CODE_LEN; i++) {\r
+        fprintf(header, "%2u%s", _dist_code[i],\r
+                SEPARATOR(i, DIST_CODE_LEN-1, 20));\r
+    }\r
+\r
+    fprintf(header,\r
+        "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");\r
+    for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {\r
+        fprintf(header, "%2u%s", _length_code[i],\r
+                SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));\r
+    }\r
+\r
+    fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");\r
+    for (i = 0; i < LENGTH_CODES; i++) {\r
+        fprintf(header, "%1u%s", base_length[i],\r
+                SEPARATOR(i, LENGTH_CODES-1, 20));\r
+    }\r
+\r
+    fprintf(header, "local const int base_dist[D_CODES] = {\n");\r
+    for (i = 0; i < D_CODES; i++) {\r
+        fprintf(header, "%5u%s", base_dist[i],\r
+                SEPARATOR(i, D_CODES-1, 10));\r
+    }\r
+\r
+    fclose(header);\r
+}\r
+#endif /* GEN_TREES_H */\r
+\r
+/* ===========================================================================\r
+ * Initialize the tree data structures for a new zlib stream.\r
+ */\r
+void ZLIB_INTERNAL _tr_init(s)\r
+    deflate_state *s;\r
+{\r
+    tr_static_init();\r
+\r
+    s->l_desc.dyn_tree = s->dyn_ltree;\r
+    s->l_desc.stat_desc = &static_l_desc;\r
+\r
+    s->d_desc.dyn_tree = s->dyn_dtree;\r
+    s->d_desc.stat_desc = &static_d_desc;\r
+\r
+    s->bl_desc.dyn_tree = s->bl_tree;\r
+    s->bl_desc.stat_desc = &static_bl_desc;\r
+\r
+    s->bi_buf = 0;\r
+    s->bi_valid = 0;\r
+#ifdef DEBUG\r
+    s->compressed_len = 0L;\r
+    s->bits_sent = 0L;\r
+#endif\r
+\r
+    /* Initialize the first block of the first file: */\r
+    init_block(s);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Initialize a new block.\r
+ */\r
+local void init_block(s)\r
+    deflate_state *s;\r
+{\r
+    int n; /* iterates over tree elements */\r
+\r
+    /* Initialize the trees. */\r
+    for (n = 0; n < L_CODES;  n++) s->dyn_ltree[n].Freq = 0;\r
+    for (n = 0; n < D_CODES;  n++) s->dyn_dtree[n].Freq = 0;\r
+    for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;\r
+\r
+    s->dyn_ltree[END_BLOCK].Freq = 1;\r
+    s->opt_len = s->static_len = 0L;\r
+    s->last_lit = s->matches = 0;\r
+}\r
+\r
+#define SMALLEST 1\r
+/* Index within the heap array of least frequent node in the Huffman tree */\r
+\r
+\r
+/* ===========================================================================\r
+ * Remove the smallest element from the heap and recreate the heap with\r
+ * one less element. Updates heap and heap_len.\r
+ */\r
+#define pqremove(s, tree, top) \\r
+{\\r
+    top = s->heap[SMALLEST]; \\r
+    s->heap[SMALLEST] = s->heap[s->heap_len--]; \\r
+    pqdownheap(s, tree, SMALLEST); \\r
+}\r
+\r
+/* ===========================================================================\r
+ * Compares to subtrees, using the tree depth as tie breaker when\r
+ * the subtrees have equal frequency. This minimizes the worst case length.\r
+ */\r
+#define smaller(tree, n, m, depth) \\r
+   (tree[n].Freq < tree[m].Freq || \\r
+   (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))\r
+\r
+/* ===========================================================================\r
+ * Restore the heap property by moving down the tree starting at node k,\r
+ * exchanging a node with the smallest of its two sons if necessary, stopping\r
+ * when the heap property is re-established (each father smaller than its\r
+ * two sons).\r
+ */\r
+local void pqdownheap(s, tree, k)\r
+    deflate_state *s;\r
+    ct_data *tree;  /* the tree to restore */\r
+    int k;               /* node to move down */\r
+{\r
+    int v = s->heap[k];\r
+    int j = k << 1;  /* left son of k */\r
+    while (j <= s->heap_len) {\r
+        /* Set j to the smallest of the two sons: */\r
+        if (j < s->heap_len &&\r
+            smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {\r
+            j++;\r
+        }\r
+        /* Exit if v is smaller than both sons */\r
+        if (smaller(tree, v, s->heap[j], s->depth)) break;\r
+\r
+        /* Exchange v with the smallest son */\r
+        s->heap[k] = s->heap[j];  k = j;\r
+\r
+        /* And continue down the tree, setting j to the left son of k */\r
+        j <<= 1;\r
+    }\r
+    s->heap[k] = v;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Compute the optimal bit lengths for a tree and update the total bit length\r
+ * for the current block.\r
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and\r
+ *    above are the tree nodes sorted by increasing frequency.\r
+ * OUT assertions: the field len is set to the optimal bit length, the\r
+ *     array bl_count contains the frequencies for each bit length.\r
+ *     The length opt_len is updated; static_len is also updated if stree is\r
+ *     not null.\r
+ */\r
+local void gen_bitlen(s, desc)\r
+    deflate_state *s;\r
+    tree_desc *desc;    /* the tree descriptor */\r
+{\r
+    ct_data *tree        = desc->dyn_tree;\r
+    int max_code         = desc->max_code;\r
+    const ct_data *stree = desc->stat_desc->static_tree;\r
+    const intf *extra    = desc->stat_desc->extra_bits;\r
+    int base             = desc->stat_desc->extra_base;\r
+    int max_length       = desc->stat_desc->max_length;\r
+    int h;              /* heap index */\r
+    int n, m;           /* iterate over the tree elements */\r
+    int bits;           /* bit length */\r
+    int xbits;          /* extra bits */\r
+    ush f;              /* frequency */\r
+    int overflow = 0;   /* number of elements with bit length too large */\r
+\r
+    for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;\r
+\r
+    /* In a first pass, compute the optimal bit lengths (which may\r
+     * overflow in the case of the bit length tree).\r
+     */\r
+    tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */\r
+\r
+    for (h = s->heap_max+1; h < HEAP_SIZE; h++) {\r
+        n = s->heap[h];\r
+        bits = tree[tree[n].Dad].Len + 1;\r
+        if (bits > max_length) bits = max_length, overflow++;\r
+        tree[n].Len = (ush)bits;\r
+        /* We overwrite tree[n].Dad which is no longer needed */\r
+\r
+        if (n > max_code) continue; /* not a leaf node */\r
+\r
+        s->bl_count[bits]++;\r
+        xbits = 0;\r
+        if (n >= base) xbits = extra[n-base];\r
+        f = tree[n].Freq;\r
+        s->opt_len += (ulg)f * (bits + xbits);\r
+        if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);\r
+    }\r
+    if (overflow == 0) return;\r
+\r
+    Trace((stderr,"\nbit length overflow\n"));\r
+    /* This happens for example on obj2 and pic of the Calgary corpus */\r
+\r
+    /* Find the first bit length which could increase: */\r
+    do {\r
+        bits = max_length-1;\r
+        while (s->bl_count[bits] == 0) bits--;\r
+        s->bl_count[bits]--;      /* move one leaf down the tree */\r
+        s->bl_count[bits+1] += 2; /* move one overflow item as its brother */\r
+        s->bl_count[max_length]--;\r
+        /* The brother of the overflow item also moves one step up,\r
+         * but this does not affect bl_count[max_length]\r
+         */\r
+        overflow -= 2;\r
+    } while (overflow > 0);\r
+\r
+    /* Now recompute all bit lengths, scanning in increasing frequency.\r
+     * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all\r
+     * lengths instead of fixing only the wrong ones. This idea is taken\r
+     * from 'ar' written by Haruhiko Okumura.)\r
+     */\r
+    for (bits = max_length; bits != 0; bits--) {\r
+        n = s->bl_count[bits];\r
+        while (n != 0) {\r
+            m = s->heap[--h];\r
+            if (m > max_code) continue;\r
+            if ((unsigned) tree[m].Len != (unsigned) bits) {\r
+                Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));\r
+                s->opt_len += ((long)bits - (long)tree[m].Len)\r
+                              *(long)tree[m].Freq;\r
+                tree[m].Len = (ush)bits;\r
+            }\r
+            n--;\r
+        }\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Generate the codes for a given tree and bit counts (which need not be\r
+ * optimal).\r
+ * IN assertion: the array bl_count contains the bit length statistics for\r
+ * the given tree and the field len is set for all tree elements.\r
+ * OUT assertion: the field code is set for all tree elements of non\r
+ *     zero code length.\r
+ */\r
+local void gen_codes (tree, max_code, bl_count)\r
+    ct_data *tree;             /* the tree to decorate */\r
+    int max_code;              /* largest code with non zero frequency */\r
+    ushf *bl_count;            /* number of codes at each bit length */\r
+{\r
+    ush next_code[MAX_BITS+1]; /* next code value for each bit length */\r
+    ush code = 0;              /* running code value */\r
+    int bits;                  /* bit index */\r
+    int n;                     /* code index */\r
+\r
+    /* The distribution counts are first used to generate the code values\r
+     * without bit reversal.\r
+     */\r
+    for (bits = 1; bits <= MAX_BITS; bits++) {\r
+        next_code[bits] = code = (code + bl_count[bits-1]) << 1;\r
+    }\r
+    /* Check that the bit counts in bl_count are consistent. The last code\r
+     * must be all ones.\r
+     */\r
+    Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,\r
+            "inconsistent bit counts");\r
+    Tracev((stderr,"\ngen_codes: max_code %d ", max_code));\r
+\r
+    for (n = 0;  n <= max_code; n++) {\r
+        int len = tree[n].Len;\r
+        if (len == 0) continue;\r
+        /* Now reverse the bits */\r
+        tree[n].Code = bi_reverse(next_code[len]++, len);\r
+\r
+        Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",\r
+             n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Construct one Huffman tree and assigns the code bit strings and lengths.\r
+ * Update the total bit length for the current block.\r
+ * IN assertion: the field freq is set for all tree elements.\r
+ * OUT assertions: the fields len and code are set to the optimal bit length\r
+ *     and corresponding code. The length opt_len is updated; static_len is\r
+ *     also updated if stree is not null. The field max_code is set.\r
+ */\r
+local void build_tree(s, desc)\r
+    deflate_state *s;\r
+    tree_desc *desc; /* the tree descriptor */\r
+{\r
+    ct_data *tree         = desc->dyn_tree;\r
+    const ct_data *stree  = desc->stat_desc->static_tree;\r
+    int elems             = desc->stat_desc->elems;\r
+    int n, m;          /* iterate over heap elements */\r
+    int max_code = -1; /* largest code with non zero frequency */\r
+    int node;          /* new node being created */\r
+\r
+    /* Construct the initial heap, with least frequent element in\r
+     * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].\r
+     * heap[0] is not used.\r
+     */\r
+    s->heap_len = 0, s->heap_max = HEAP_SIZE;\r
+\r
+    for (n = 0; n < elems; n++) {\r
+        if (tree[n].Freq != 0) {\r
+            s->heap[++(s->heap_len)] = max_code = n;\r
+            s->depth[n] = 0;\r
+        } else {\r
+            tree[n].Len = 0;\r
+        }\r
+    }\r
+\r
+    /* The pkzip format requires that at least one distance code exists,\r
+     * and that at least one bit should be sent even if there is only one\r
+     * possible code. So to avoid special checks later on we force at least\r
+     * two codes of non zero frequency.\r
+     */\r
+    while (s->heap_len < 2) {\r
+        node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);\r
+        tree[node].Freq = 1;\r
+        s->depth[node] = 0;\r
+        s->opt_len--; if (stree) s->static_len -= stree[node].Len;\r
+        /* node is 0 or 1 so it does not have extra bits */\r
+    }\r
+    desc->max_code = max_code;\r
+\r
+    /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,\r
+     * establish sub-heaps of increasing lengths:\r
+     */\r
+    for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);\r
+\r
+    /* Construct the Huffman tree by repeatedly combining the least two\r
+     * frequent nodes.\r
+     */\r
+    node = elems;              /* next internal node of the tree */\r
+    do {\r
+        pqremove(s, tree, n);  /* n = node of least frequency */\r
+        m = s->heap[SMALLEST]; /* m = node of next least frequency */\r
+\r
+        s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */\r
+        s->heap[--(s->heap_max)] = m;\r
+\r
+        /* Create a new node father of n and m */\r
+        tree[node].Freq = tree[n].Freq + tree[m].Freq;\r
+        s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?\r
+                                s->depth[n] : s->depth[m]) + 1);\r
+        tree[n].Dad = tree[m].Dad = (ush)node;\r
+#ifdef DUMP_BL_TREE\r
+        if (tree == s->bl_tree) {\r
+            fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",\r
+                    node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);\r
+        }\r
+#endif\r
+        /* and insert the new node in the heap */\r
+        s->heap[SMALLEST] = node++;\r
+        pqdownheap(s, tree, SMALLEST);\r
+\r
+    } while (s->heap_len >= 2);\r
+\r
+    s->heap[--(s->heap_max)] = s->heap[SMALLEST];\r
+\r
+    /* At this point, the fields freq and dad are set. We can now\r
+     * generate the bit lengths.\r
+     */\r
+    gen_bitlen(s, (tree_desc *)desc);\r
+\r
+    /* The field len is now set, we can generate the bit codes */\r
+    gen_codes ((ct_data *)tree, max_code, s->bl_count);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Scan a literal or distance tree to determine the frequencies of the codes\r
+ * in the bit length tree.\r
+ */\r
+local void scan_tree (s, tree, max_code)\r
+    deflate_state *s;\r
+    ct_data *tree;   /* the tree to be scanned */\r
+    int max_code;    /* and its largest code of non zero frequency */\r
+{\r
+    int n;                     /* iterates over all tree elements */\r
+    int prevlen = -1;          /* last emitted length */\r
+    int curlen;                /* length of current code */\r
+    int nextlen = tree[0].Len; /* length of next code */\r
+    int count = 0;             /* repeat count of the current code */\r
+    int max_count = 7;         /* max repeat count */\r
+    int min_count = 4;         /* min repeat count */\r
+\r
+    if (nextlen == 0) max_count = 138, min_count = 3;\r
+    tree[max_code+1].Len = (ush)0xffff; /* guard */\r
+\r
+    for (n = 0; n <= max_code; n++) {\r
+        curlen = nextlen; nextlen = tree[n+1].Len;\r
+        if (++count < max_count && curlen == nextlen) {\r
+            continue;\r
+        } else if (count < min_count) {\r
+            s->bl_tree[curlen].Freq += count;\r
+        } else if (curlen != 0) {\r
+            if (curlen != prevlen) s->bl_tree[curlen].Freq++;\r
+            s->bl_tree[REP_3_6].Freq++;\r
+        } else if (count <= 10) {\r
+            s->bl_tree[REPZ_3_10].Freq++;\r
+        } else {\r
+            s->bl_tree[REPZ_11_138].Freq++;\r
+        }\r
+        count = 0; prevlen = curlen;\r
+        if (nextlen == 0) {\r
+            max_count = 138, min_count = 3;\r
+        } else if (curlen == nextlen) {\r
+            max_count = 6, min_count = 3;\r
+        } else {\r
+            max_count = 7, min_count = 4;\r
+        }\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send a literal or distance tree in compressed form, using the codes in\r
+ * bl_tree.\r
+ */\r
+local void send_tree (s, tree, max_code)\r
+    deflate_state *s;\r
+    ct_data *tree; /* the tree to be scanned */\r
+    int max_code;       /* and its largest code of non zero frequency */\r
+{\r
+    int n;                     /* iterates over all tree elements */\r
+    int prevlen = -1;          /* last emitted length */\r
+    int curlen;                /* length of current code */\r
+    int nextlen = tree[0].Len; /* length of next code */\r
+    int count = 0;             /* repeat count of the current code */\r
+    int max_count = 7;         /* max repeat count */\r
+    int min_count = 4;         /* min repeat count */\r
+\r
+    /* tree[max_code+1].Len = -1; */  /* guard already set */\r
+    if (nextlen == 0) max_count = 138, min_count = 3;\r
+\r
+    for (n = 0; n <= max_code; n++) {\r
+        curlen = nextlen; nextlen = tree[n+1].Len;\r
+        if (++count < max_count && curlen == nextlen) {\r
+            continue;\r
+        } else if (count < min_count) {\r
+            do { send_code(s, curlen, s->bl_tree); } while (--count != 0);\r
+\r
+        } else if (curlen != 0) {\r
+            if (curlen != prevlen) {\r
+                send_code(s, curlen, s->bl_tree); count--;\r
+            }\r
+            Assert(count >= 3 && count <= 6, " 3_6?");\r
+            send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);\r
+\r
+        } else if (count <= 10) {\r
+            send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);\r
+\r
+        } else {\r
+            send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);\r
+        }\r
+        count = 0; prevlen = curlen;\r
+        if (nextlen == 0) {\r
+            max_count = 138, min_count = 3;\r
+        } else if (curlen == nextlen) {\r
+            max_count = 6, min_count = 3;\r
+        } else {\r
+            max_count = 7, min_count = 4;\r
+        }\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Construct the Huffman tree for the bit lengths and return the index in\r
+ * bl_order of the last bit length code to send.\r
+ */\r
+local int build_bl_tree(s)\r
+    deflate_state *s;\r
+{\r
+    int max_blindex;  /* index of last bit length code of non zero freq */\r
+\r
+    /* Determine the bit length frequencies for literal and distance trees */\r
+    scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);\r
+    scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);\r
+\r
+    /* Build the bit length tree: */\r
+    build_tree(s, (tree_desc *)(&(s->bl_desc)));\r
+    /* opt_len now includes the length of the tree representations, except\r
+     * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.\r
+     */\r
+\r
+    /* Determine the number of bit length codes to send. The pkzip format\r
+     * requires that at least 4 bit length codes be sent. (appnote.txt says\r
+     * 3 but the actual value used is 4.)\r
+     */\r
+    for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {\r
+        if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;\r
+    }\r
+    /* Update opt_len to include the bit length tree and counts */\r
+    s->opt_len += 3*(max_blindex+1) + 5+5+4;\r
+    Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",\r
+            s->opt_len, s->static_len));\r
+\r
+    return max_blindex;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send the header for a block using dynamic Huffman trees: the counts, the\r
+ * lengths of the bit length codes, the literal tree and the distance tree.\r
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.\r
+ */\r
+local void send_all_trees(s, lcodes, dcodes, blcodes)\r
+    deflate_state *s;\r
+    int lcodes, dcodes, blcodes; /* number of codes for each tree */\r
+{\r
+    int rank;                    /* index in bl_order */\r
+\r
+    Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");\r
+    Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,\r
+            "too many codes");\r
+    Tracev((stderr, "\nbl counts: "));\r
+    send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */\r
+    send_bits(s, dcodes-1,   5);\r
+    send_bits(s, blcodes-4,  4); /* not -3 as stated in appnote.txt */\r
+    for (rank = 0; rank < blcodes; rank++) {\r
+        Tracev((stderr, "\nbl code %2d ", bl_order[rank]));\r
+        send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);\r
+    }\r
+    Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));\r
+\r
+    send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */\r
+    Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));\r
+\r
+    send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */\r
+    Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send a stored block\r
+ */\r
+void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)\r
+    deflate_state *s;\r
+    charf *buf;       /* input block */\r
+    ulg stored_len;   /* length of input block */\r
+    int last;         /* one if this is the last block for a file */\r
+{\r
+    send_bits(s, (STORED_BLOCK<<1)+last, 3);    /* send block type */\r
+#ifdef DEBUG\r
+    s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;\r
+    s->compressed_len += (stored_len + 4) << 3;\r
+#endif\r
+    copy_block(s, buf, (unsigned)stored_len, 1); /* with header */\r
+}\r
+\r
+/* ===========================================================================\r
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)\r
+ */\r
+void ZLIB_INTERNAL _tr_flush_bits(s)\r
+    deflate_state *s;\r
+{\r
+    bi_flush(s);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send one empty static block to give enough lookahead for inflate.\r
+ * This takes 10 bits, of which 7 may remain in the bit buffer.\r
+ */\r
+void ZLIB_INTERNAL _tr_align(s)\r
+    deflate_state *s;\r
+{\r
+    send_bits(s, STATIC_TREES<<1, 3);\r
+    send_code(s, END_BLOCK, static_ltree);\r
+#ifdef DEBUG\r
+    s->compressed_len += 10L; /* 3 for block type, 7 for EOB */\r
+#endif\r
+    bi_flush(s);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Determine the best encoding for the current block: dynamic trees, static\r
+ * trees or store, and output the encoded block to the zip file.\r
+ */\r
+void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)\r
+    deflate_state *s;\r
+    charf *buf;       /* input block, or NULL if too old */\r
+    ulg stored_len;   /* length of input block */\r
+    int last;         /* one if this is the last block for a file */\r
+{\r
+    ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */\r
+    int max_blindex = 0;  /* index of last bit length code of non zero freq */\r
+\r
+    /* Build the Huffman trees unless a stored block is forced */\r
+    if (s->level > 0) {\r
+\r
+        /* Check if the file is binary or text */\r
+        if (s->strm->data_type == Z_UNKNOWN)\r
+            s->strm->data_type = detect_data_type(s);\r
+\r
+        /* Construct the literal and distance trees */\r
+        build_tree(s, (tree_desc *)(&(s->l_desc)));\r
+        Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,\r
+                s->static_len));\r
+\r
+        build_tree(s, (tree_desc *)(&(s->d_desc)));\r
+        Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,\r
+                s->static_len));\r
+        /* At this point, opt_len and static_len are the total bit lengths of\r
+         * the compressed block data, excluding the tree representations.\r
+         */\r
+\r
+        /* Build the bit length tree for the above two trees, and get the index\r
+         * in bl_order of the last bit length code to send.\r
+         */\r
+        max_blindex = build_bl_tree(s);\r
+\r
+        /* Determine the best encoding. Compute the block lengths in bytes. */\r
+        opt_lenb = (s->opt_len+3+7)>>3;\r
+        static_lenb = (s->static_len+3+7)>>3;\r
+\r
+        Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",\r
+                opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,\r
+                s->last_lit));\r
+\r
+        if (static_lenb <= opt_lenb) opt_lenb = static_lenb;\r
+\r
+    } else {\r
+        Assert(buf != (char*)0, "lost buf");\r
+        opt_lenb = static_lenb = stored_len + 5; /* force a stored block */\r
+    }\r
+\r
+#ifdef FORCE_STORED\r
+    if (buf != (char*)0) { /* force stored block */\r
+#else\r
+    if (stored_len+4 <= opt_lenb && buf != (char*)0) {\r
+                       /* 4: two words for the lengths */\r
+#endif\r
+        /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.\r
+         * Otherwise we can't have processed more than WSIZE input bytes since\r
+         * the last block flush, because compression would have been\r
+         * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to\r
+         * transform a block into a stored block.\r
+         */\r
+        _tr_stored_block(s, buf, stored_len, last);\r
+\r
+#ifdef FORCE_STATIC\r
+    } else if (static_lenb >= 0) { /* force static trees */\r
+#else\r
+    } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {\r
+#endif\r
+        send_bits(s, (STATIC_TREES<<1)+last, 3);\r
+        compress_block(s, (const ct_data *)static_ltree,\r
+                       (const ct_data *)static_dtree);\r
+#ifdef DEBUG\r
+        s->compressed_len += 3 + s->static_len;\r
+#endif\r
+    } else {\r
+        send_bits(s, (DYN_TREES<<1)+last, 3);\r
+        send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,\r
+                       max_blindex+1);\r
+        compress_block(s, (const ct_data *)s->dyn_ltree,\r
+                       (const ct_data *)s->dyn_dtree);\r
+#ifdef DEBUG\r
+        s->compressed_len += 3 + s->opt_len;\r
+#endif\r
+    }\r
+    Assert (s->compressed_len == s->bits_sent, "bad compressed size");\r
+    /* The above check is made mod 2^32, for files larger than 512 MB\r
+     * and uLong implemented on 32 bits.\r
+     */\r
+    init_block(s);\r
+\r
+    if (last) {\r
+        bi_windup(s);\r
+#ifdef DEBUG\r
+        s->compressed_len += 7;  /* align on byte boundary */\r
+#endif\r
+    }\r
+    Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,\r
+           s->compressed_len-7*last));\r
+}\r
+\r
+/* ===========================================================================\r
+ * Save the match info and tally the frequency counts. Return true if\r
+ * the current block must be flushed.\r
+ */\r
+int ZLIB_INTERNAL _tr_tally (s, dist, lc)\r
+    deflate_state *s;\r
+    unsigned dist;  /* distance of matched string */\r
+    unsigned lc;    /* match length-MIN_MATCH or unmatched char (if dist==0) */\r
+{\r
+    s->d_buf[s->last_lit] = (ush)dist;\r
+    s->l_buf[s->last_lit++] = (uch)lc;\r
+    if (dist == 0) {\r
+        /* lc is the unmatched char */\r
+        s->dyn_ltree[lc].Freq++;\r
+    } else {\r
+        s->matches++;\r
+        /* Here, lc is the match length - MIN_MATCH */\r
+        dist--;             /* dist = match distance - 1 */\r
+        Assert((ush)dist < (ush)MAX_DIST(s) &&\r
+               (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&\r
+               (ush)d_code(dist) < (ush)D_CODES,  "_tr_tally: bad match");\r
+\r
+        s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;\r
+        s->dyn_dtree[d_code(dist)].Freq++;\r
+    }\r
+\r
+#ifdef TRUNCATE_BLOCK\r
+    /* Try to guess if it is profitable to stop the current block here */\r
+    if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {\r
+        /* Compute an upper bound for the compressed length */\r
+        ulg out_length = (ulg)s->last_lit*8L;\r
+        ulg in_length = (ulg)((long)s->strstart - s->block_start);\r
+        int dcode;\r
+        for (dcode = 0; dcode < D_CODES; dcode++) {\r
+            out_length += (ulg)s->dyn_dtree[dcode].Freq *\r
+                (5L+extra_dbits[dcode]);\r
+        }\r
+        out_length >>= 3;\r
+        Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",\r
+               s->last_lit, in_length, out_length,\r
+               100L - out_length*100L/in_length));\r
+        if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;\r
+    }\r
+#endif\r
+    return (s->last_lit == s->lit_bufsize-1);\r
+    /* We avoid equality with lit_bufsize because of wraparound at 64K\r
+     * on 16 bit machines and because stored blocks are restricted to\r
+     * 64K-1 bytes.\r
+     */\r
+}\r
+\r
+/* ===========================================================================\r
+ * Send the block data compressed using the given Huffman trees\r
+ */\r
+local void compress_block(s, ltree, dtree)\r
+    deflate_state *s;\r
+    const ct_data *ltree; /* literal tree */\r
+    const ct_data *dtree; /* distance tree */\r
+{\r
+    unsigned dist;      /* distance of matched string */\r
+    int lc;             /* match length or unmatched char (if dist == 0) */\r
+    unsigned lx = 0;    /* running index in l_buf */\r
+    unsigned code;      /* the code to send */\r
+    int extra;          /* number of extra bits to send */\r
+\r
+    if (s->last_lit != 0) do {\r
+        dist = s->d_buf[lx];\r
+        lc = s->l_buf[lx++];\r
+        if (dist == 0) {\r
+            send_code(s, lc, ltree); /* send a literal byte */\r
+            Tracecv(isgraph(lc), (stderr," '%c' ", lc));\r
+        } else {\r
+            /* Here, lc is the match length - MIN_MATCH */\r
+            code = _length_code[lc];\r
+            send_code(s, code+LITERALS+1, ltree); /* send the length code */\r
+            extra = extra_lbits[code];\r
+            if (extra != 0) {\r
+                lc -= base_length[code];\r
+                send_bits(s, lc, extra);       /* send the extra length bits */\r
+            }\r
+            dist--; /* dist is now the match distance - 1 */\r
+            code = d_code(dist);\r
+            Assert (code < D_CODES, "bad d_code");\r
+\r
+            send_code(s, code, dtree);       /* send the distance code */\r
+            extra = extra_dbits[code];\r
+            if (extra != 0) {\r
+                dist -= base_dist[code];\r
+                send_bits(s, dist, extra);   /* send the extra distance bits */\r
+            }\r
+        } /* literal or match pair ? */\r
+\r
+        /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */\r
+        Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,\r
+               "pendingBuf overflow");\r
+\r
+    } while (lx < s->last_lit);\r
+\r
+    send_code(s, END_BLOCK, ltree);\r
+}\r
+\r
+/* ===========================================================================\r
+ * Check if the data type is TEXT or BINARY, using the following algorithm:\r
+ * - TEXT if the two conditions below are satisfied:\r
+ *    a) There are no non-portable control characters belonging to the\r
+ *       "black list" (0..6, 14..25, 28..31).\r
+ *    b) There is at least one printable character belonging to the\r
+ *       "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).\r
+ * - BINARY otherwise.\r
+ * - The following partially-portable control characters form a\r
+ *   "gray list" that is ignored in this detection algorithm:\r
+ *   (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).\r
+ * IN assertion: the fields Freq of dyn_ltree are set.\r
+ */\r
+local int detect_data_type(s)\r
+    deflate_state *s;\r
+{\r
+    /* black_mask is the bit mask of black-listed bytes\r
+     * set bits 0..6, 14..25, and 28..31\r
+     * 0xf3ffc07f = binary 11110011111111111100000001111111\r
+     */\r
+    unsigned long black_mask = 0xf3ffc07fUL;\r
+    int n;\r
+\r
+    /* Check for non-textual ("black-listed") bytes. */\r
+    for (n = 0; n <= 31; n++, black_mask >>= 1)\r
+        if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))\r
+            return Z_BINARY;\r
+\r
+    /* Check for textual ("white-listed") bytes. */\r
+    if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0\r
+            || s->dyn_ltree[13].Freq != 0)\r
+        return Z_TEXT;\r
+    for (n = 32; n < LITERALS; n++)\r
+        if (s->dyn_ltree[n].Freq != 0)\r
+            return Z_TEXT;\r
+\r
+    /* There are no "black-listed" or "white-listed" bytes:\r
+     * this stream either is empty or has tolerated ("gray-listed") bytes only.\r
+     */\r
+    return Z_BINARY;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Reverse the first len bits of a code, using straightforward code (a faster\r
+ * method would use a table)\r
+ * IN assertion: 1 <= len <= 15\r
+ */\r
+local unsigned bi_reverse(code, len)\r
+    unsigned code; /* the value to invert */\r
+    int len;       /* its bit length */\r
+{\r
+    register unsigned res = 0;\r
+    do {\r
+        res |= code & 1;\r
+        code >>= 1, res <<= 1;\r
+    } while (--len > 0);\r
+    return res >> 1;\r
+}\r
+\r
+/* ===========================================================================\r
+ * Flush the bit buffer, keeping at most 7 bits in it.\r
+ */\r
+local void bi_flush(s)\r
+    deflate_state *s;\r
+{\r
+    if (s->bi_valid == 16) {\r
+        put_short(s, s->bi_buf);\r
+        s->bi_buf = 0;\r
+        s->bi_valid = 0;\r
+    } else if (s->bi_valid >= 8) {\r
+        put_byte(s, (Byte)s->bi_buf);\r
+        s->bi_buf >>= 8;\r
+        s->bi_valid -= 8;\r
+    }\r
+}\r
+\r
+/* ===========================================================================\r
+ * Flush the bit buffer and align the output on a byte boundary\r
+ */\r
+local void bi_windup(s)\r
+    deflate_state *s;\r
+{\r
+    if (s->bi_valid > 8) {\r
+        put_short(s, s->bi_buf);\r
+    } else if (s->bi_valid > 0) {\r
+        put_byte(s, (Byte)s->bi_buf);\r
+    }\r
+    s->bi_buf = 0;\r
+    s->bi_valid = 0;\r
+#ifdef DEBUG\r
+    s->bits_sent = (s->bits_sent+7) & ~7;\r
+#endif\r
+}\r
+\r
+/* ===========================================================================\r
+ * Copy a stored block, storing first the length and its\r
+ * one's complement if requested.\r
+ */\r
+local void copy_block(s, buf, len, header)\r
+    deflate_state *s;\r
+    charf    *buf;    /* the input data */\r
+    unsigned len;     /* its length */\r
+    int      header;  /* true if block header must be written */\r
+{\r
+    bi_windup(s);        /* align on byte boundary */\r
+\r
+    if (header) {\r
+        put_short(s, (ush)len);\r
+        put_short(s, (ush)~len);\r
+#ifdef DEBUG\r
+        s->bits_sent += 2*16;\r
+#endif\r
+    }\r
+#ifdef DEBUG\r
+    s->bits_sent += (ulg)len<<3;\r
+#endif\r
+    while (len--) {\r
+        put_byte(s, *buf++);\r
+    }\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/trees.h
new file mode 100644 (file)
index 0000000..ce8f620
--- /dev/null
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */\r
+\r
+local const ct_data static_ltree[L_CODES+2] = {\r
+{{ 12},{  8}}, {{140},{  8}}, {{ 76},{  8}}, {{204},{  8}}, {{ 44},{  8}},\r
+{{172},{  8}}, {{108},{  8}}, {{236},{  8}}, {{ 28},{  8}}, {{156},{  8}},\r
+{{ 92},{  8}}, {{220},{  8}}, {{ 60},{  8}}, {{188},{  8}}, {{124},{  8}},\r
+{{252},{  8}}, {{  2},{  8}}, {{130},{  8}}, {{ 66},{  8}}, {{194},{  8}},\r
+{{ 34},{  8}}, {{162},{  8}}, {{ 98},{  8}}, {{226},{  8}}, {{ 18},{  8}},\r
+{{146},{  8}}, {{ 82},{  8}}, {{210},{  8}}, {{ 50},{  8}}, {{178},{  8}},\r
+{{114},{  8}}, {{242},{  8}}, {{ 10},{  8}}, {{138},{  8}}, {{ 74},{  8}},\r
+{{202},{  8}}, {{ 42},{  8}}, {{170},{  8}}, {{106},{  8}}, {{234},{  8}},\r
+{{ 26},{  8}}, {{154},{  8}}, {{ 90},{  8}}, {{218},{  8}}, {{ 58},{  8}},\r
+{{186},{  8}}, {{122},{  8}}, {{250},{  8}}, {{  6},{  8}}, {{134},{  8}},\r
+{{ 70},{  8}}, {{198},{  8}}, {{ 38},{  8}}, {{166},{  8}}, {{102},{  8}},\r
+{{230},{  8}}, {{ 22},{  8}}, {{150},{  8}}, {{ 86},{  8}}, {{214},{  8}},\r
+{{ 54},{  8}}, {{182},{  8}}, {{118},{  8}}, {{246},{  8}}, {{ 14},{  8}},\r
+{{142},{  8}}, {{ 78},{  8}}, {{206},{  8}}, {{ 46},{  8}}, {{174},{  8}},\r
+{{110},{  8}}, {{238},{  8}}, {{ 30},{  8}}, {{158},{  8}}, {{ 94},{  8}},\r
+{{222},{  8}}, {{ 62},{  8}}, {{190},{  8}}, {{126},{  8}}, {{254},{  8}},\r
+{{  1},{  8}}, {{129},{  8}}, {{ 65},{  8}}, {{193},{  8}}, {{ 33},{  8}},\r
+{{161},{  8}}, {{ 97},{  8}}, {{225},{  8}}, {{ 17},{  8}}, {{145},{  8}},\r
+{{ 81},{  8}}, {{209},{  8}}, {{ 49},{  8}}, {{177},{  8}}, {{113},{  8}},\r
+{{241},{  8}}, {{  9},{  8}}, {{137},{  8}}, {{ 73},{  8}}, {{201},{  8}},\r
+{{ 41},{  8}}, {{169},{  8}}, {{105},{  8}}, {{233},{  8}}, {{ 25},{  8}},\r
+{{153},{  8}}, {{ 89},{  8}}, {{217},{  8}}, {{ 57},{  8}}, {{185},{  8}},\r
+{{121},{  8}}, {{249},{  8}}, {{  5},{  8}}, {{133},{  8}}, {{ 69},{  8}},\r
+{{197},{  8}}, {{ 37},{  8}}, {{165},{  8}}, {{101},{  8}}, {{229},{  8}},\r
+{{ 21},{  8}}, {{149},{  8}}, {{ 85},{  8}}, {{213},{  8}}, {{ 53},{  8}},\r
+{{181},{  8}}, {{117},{  8}}, {{245},{  8}}, {{ 13},{  8}}, {{141},{  8}},\r
+{{ 77},{  8}}, {{205},{  8}}, {{ 45},{  8}}, {{173},{  8}}, {{109},{  8}},\r
+{{237},{  8}}, {{ 29},{  8}}, {{157},{  8}}, {{ 93},{  8}}, {{221},{  8}},\r
+{{ 61},{  8}}, {{189},{  8}}, {{125},{  8}}, {{253},{  8}}, {{ 19},{  9}},\r
+{{275},{  9}}, {{147},{  9}}, {{403},{  9}}, {{ 83},{  9}}, {{339},{  9}},\r
+{{211},{  9}}, {{467},{  9}}, {{ 51},{  9}}, {{307},{  9}}, {{179},{  9}},\r
+{{435},{  9}}, {{115},{  9}}, {{371},{  9}}, {{243},{  9}}, {{499},{  9}},\r
+{{ 11},{  9}}, {{267},{  9}}, {{139},{  9}}, {{395},{  9}}, {{ 75},{  9}},\r
+{{331},{  9}}, {{203},{  9}}, {{459},{  9}}, {{ 43},{  9}}, {{299},{  9}},\r
+{{171},{  9}}, {{427},{  9}}, {{107},{  9}}, {{363},{  9}}, {{235},{  9}},\r
+{{491},{  9}}, {{ 27},{  9}}, {{283},{  9}}, {{155},{  9}}, {{411},{  9}},\r
+{{ 91},{  9}}, {{347},{  9}}, {{219},{  9}}, {{475},{  9}}, {{ 59},{  9}},\r
+{{315},{  9}}, {{187},{  9}}, {{443},{  9}}, {{123},{  9}}, {{379},{  9}},\r
+{{251},{  9}}, {{507},{  9}}, {{  7},{  9}}, {{263},{  9}}, {{135},{  9}},\r
+{{391},{  9}}, {{ 71},{  9}}, {{327},{  9}}, {{199},{  9}}, {{455},{  9}},\r
+{{ 39},{  9}}, {{295},{  9}}, {{167},{  9}}, {{423},{  9}}, {{103},{  9}},\r
+{{359},{  9}}, {{231},{  9}}, {{487},{  9}}, {{ 23},{  9}}, {{279},{  9}},\r
+{{151},{  9}}, {{407},{  9}}, {{ 87},{  9}}, {{343},{  9}}, {{215},{  9}},\r
+{{471},{  9}}, {{ 55},{  9}}, {{311},{  9}}, {{183},{  9}}, {{439},{  9}},\r
+{{119},{  9}}, {{375},{  9}}, {{247},{  9}}, {{503},{  9}}, {{ 15},{  9}},\r
+{{271},{  9}}, {{143},{  9}}, {{399},{  9}}, {{ 79},{  9}}, {{335},{  9}},\r
+{{207},{  9}}, {{463},{  9}}, {{ 47},{  9}}, {{303},{  9}}, {{175},{  9}},\r
+{{431},{  9}}, {{111},{  9}}, {{367},{  9}}, {{239},{  9}}, {{495},{  9}},\r
+{{ 31},{  9}}, {{287},{  9}}, {{159},{  9}}, {{415},{  9}}, {{ 95},{  9}},\r
+{{351},{  9}}, {{223},{  9}}, {{479},{  9}}, {{ 63},{  9}}, {{319},{  9}},\r
+{{191},{  9}}, {{447},{  9}}, {{127},{  9}}, {{383},{  9}}, {{255},{  9}},\r
+{{511},{  9}}, {{  0},{  7}}, {{ 64},{  7}}, {{ 32},{  7}}, {{ 96},{  7}},\r
+{{ 16},{  7}}, {{ 80},{  7}}, {{ 48},{  7}}, {{112},{  7}}, {{  8},{  7}},\r
+{{ 72},{  7}}, {{ 40},{  7}}, {{104},{  7}}, {{ 24},{  7}}, {{ 88},{  7}},\r
+{{ 56},{  7}}, {{120},{  7}}, {{  4},{  7}}, {{ 68},{  7}}, {{ 36},{  7}},\r
+{{100},{  7}}, {{ 20},{  7}}, {{ 84},{  7}}, {{ 52},{  7}}, {{116},{  7}},\r
+{{  3},{  8}}, {{131},{  8}}, {{ 67},{  8}}, {{195},{  8}}, {{ 35},{  8}},\r
+{{163},{  8}}, {{ 99},{  8}}, {{227},{  8}}\r
+};\r
+\r
+local const ct_data static_dtree[D_CODES] = {\r
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},\r
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},\r
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},\r
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},\r
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},\r
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}\r
+};\r
+\r
+const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\r
+ 0,  1,  2,  3,  4,  4,  5,  5,  6,  6,  6,  6,  7,  7,  7,  7,  8,  8,  8,  8,\r
+ 8,  8,  8,  8,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10, 10, 10,\r
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,\r
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,\r
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,\r
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,\r
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\r
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\r
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,\r
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,\r
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\r
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,\r
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,  0,  0, 16, 17,\r
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,\r
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\r
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\r
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,\r
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\r
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\r
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\r
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,\r
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\r
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\r
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,\r
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29\r
+};\r
+\r
+const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\r
+ 0,  1,  2,  3,  4,  5,  6,  7,  8,  8,  9,  9, 10, 10, 11, 11, 12, 12, 12, 12,\r
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,\r
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,\r
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,\r
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,\r
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,\r
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,\r
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,\r
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,\r
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,\r
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,\r
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28\r
+};\r
+\r
+local const int base_length[LENGTH_CODES] = {\r
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,\r
+64, 80, 96, 112, 128, 160, 192, 224, 0\r
+};\r
+\r
+local const int base_dist[D_CODES] = {\r
+    0,     1,     2,     3,     4,     6,     8,    12,    16,    24,\r
+   32,    48,    64,    96,   128,   192,   256,   384,   512,   768,\r
+ 1024,  1536,  2048,  3072,  4096,  6144,  8192, 12288, 16384, 24576\r
+};\r
+\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/uncompr.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/uncompr.c
new file mode 100644 (file)
index 0000000..6cfc6dd
--- /dev/null
@@ -0,0 +1,59 @@
+/* uncompr.c -- decompress a memory buffer\r
+ * Copyright (C) 1995-2003, 2010 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#define ZLIB_INTERNAL\r
+#include "zlib.h"\r
+\r
+/* ===========================================================================\r
+     Decompresses the source buffer into the destination buffer.  sourceLen is\r
+   the byte length of the source buffer. Upon entry, destLen is the total\r
+   size of the destination buffer, which must be large enough to hold the\r
+   entire uncompressed data. (The size of the uncompressed data must have\r
+   been saved previously by the compressor and transmitted to the decompressor\r
+   by some mechanism outside the scope of this compression library.)\r
+   Upon exit, destLen is the actual size of the compressed buffer.\r
+\r
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\r
+   enough memory, Z_BUF_ERROR if there was not enough room in the output\r
+   buffer, or Z_DATA_ERROR if the input data was corrupted.\r
+*/\r
+int ZEXPORT uncompress (dest, destLen, source, sourceLen)\r
+    Bytef *dest;\r
+    uLongf *destLen;\r
+    const Bytef *source;\r
+    uLong sourceLen;\r
+{\r
+    z_stream stream;\r
+    int err;\r
+\r
+    stream.next_in = (z_const Bytef *)source;\r
+    stream.avail_in = (uInt)sourceLen;\r
+    /* Check for source > 64K on 16-bit machine: */\r
+    if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;\r
+\r
+    stream.next_out = dest;\r
+    stream.avail_out = (uInt)*destLen;\r
+    if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;\r
+\r
+    stream.zalloc = (alloc_func)0;\r
+    stream.zfree = (free_func)0;\r
+\r
+    err = inflateInit(&stream);\r
+    if (err != Z_OK) return err;\r
+\r
+    err = inflate(&stream, Z_FINISH);\r
+    if (err != Z_STREAM_END) {\r
+        inflateEnd(&stream);\r
+        if (err == Z_NEED_DICT || (err == Z_BUF_ERROR && stream.avail_in == 0))\r
+            return Z_DATA_ERROR;\r
+        return err;\r
+    }\r
+    *destLen = stream.total_out;\r
+\r
+    err = inflateEnd(&stream);\r
+    return err;\r
+}\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zconf.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zconf.h
new file mode 100644 (file)
index 0000000..add1675
--- /dev/null
@@ -0,0 +1,511 @@
+/* zconf.h -- configuration of the zlib compression library\r
+ * Copyright (C) 1995-2013 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#ifndef ZCONF_H\r
+#define ZCONF_H\r
+\r
+/*\r
+ * If you *really* need a unique prefix for all types and library functions,\r
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.\r
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set\r
+ * this permanently in zconf.h using "./configure --zprefix".\r
+ */\r
+#ifdef Z_PREFIX     /* may be set to #if 1 by ./configure */\r
+#  define Z_PREFIX_SET\r
+\r
+/* all linked symbols */\r
+#  define _dist_code            z__dist_code\r
+#  define _length_code          z__length_code\r
+#  define _tr_align             z__tr_align\r
+#  define _tr_flush_bits        z__tr_flush_bits\r
+#  define _tr_flush_block       z__tr_flush_block\r
+#  define _tr_init              z__tr_init\r
+#  define _tr_stored_block      z__tr_stored_block\r
+#  define _tr_tally             z__tr_tally\r
+#  define adler32               z_adler32\r
+#  define adler32_combine       z_adler32_combine\r
+#  define adler32_combine64     z_adler32_combine64\r
+#  ifndef Z_SOLO\r
+#    define compress              z_compress\r
+#    define compress2             z_compress2\r
+#    define compressBound         z_compressBound\r
+#  endif\r
+#  define crc32                 z_crc32\r
+#  define crc32_combine         z_crc32_combine\r
+#  define crc32_combine64       z_crc32_combine64\r
+#  define deflate               z_deflate\r
+#  define deflateBound          z_deflateBound\r
+#  define deflateCopy           z_deflateCopy\r
+#  define deflateEnd            z_deflateEnd\r
+#  define deflateInit2_         z_deflateInit2_\r
+#  define deflateInit_          z_deflateInit_\r
+#  define deflateParams         z_deflateParams\r
+#  define deflatePending        z_deflatePending\r
+#  define deflatePrime          z_deflatePrime\r
+#  define deflateReset          z_deflateReset\r
+#  define deflateResetKeep      z_deflateResetKeep\r
+#  define deflateSetDictionary  z_deflateSetDictionary\r
+#  define deflateSetHeader      z_deflateSetHeader\r
+#  define deflateTune           z_deflateTune\r
+#  define deflate_copyright     z_deflate_copyright\r
+#  define get_crc_table         z_get_crc_table\r
+#  ifndef Z_SOLO\r
+#    define gz_error              z_gz_error\r
+#    define gz_intmax             z_gz_intmax\r
+#    define gz_strwinerror        z_gz_strwinerror\r
+#    define gzbuffer              z_gzbuffer\r
+#    define gzclearerr            z_gzclearerr\r
+#    define gzclose               z_gzclose\r
+#    define gzclose_r             z_gzclose_r\r
+#    define gzclose_w             z_gzclose_w\r
+#    define gzdirect              z_gzdirect\r
+#    define gzdopen               z_gzdopen\r
+#    define gzeof                 z_gzeof\r
+#    define gzerror               z_gzerror\r
+#    define gzflush               z_gzflush\r
+#    define gzgetc                z_gzgetc\r
+#    define gzgetc_               z_gzgetc_\r
+#    define gzgets                z_gzgets\r
+#    define gzoffset              z_gzoffset\r
+#    define gzoffset64            z_gzoffset64\r
+#    define gzopen                z_gzopen\r
+#    define gzopen64              z_gzopen64\r
+#    ifdef _WIN32\r
+#      define gzopen_w              z_gzopen_w\r
+#    endif\r
+#    define gzprintf              z_gzprintf\r
+#    define gzvprintf             z_gzvprintf\r
+#    define gzputc                z_gzputc\r
+#    define gzputs                z_gzputs\r
+#    define gzread                z_gzread\r
+#    define gzrewind              z_gzrewind\r
+#    define gzseek                z_gzseek\r
+#    define gzseek64              z_gzseek64\r
+#    define gzsetparams           z_gzsetparams\r
+#    define gztell                z_gztell\r
+#    define gztell64              z_gztell64\r
+#    define gzungetc              z_gzungetc\r
+#    define gzwrite               z_gzwrite\r
+#  endif\r
+#  define inflate               z_inflate\r
+#  define inflateBack           z_inflateBack\r
+#  define inflateBackEnd        z_inflateBackEnd\r
+#  define inflateBackInit_      z_inflateBackInit_\r
+#  define inflateCopy           z_inflateCopy\r
+#  define inflateEnd            z_inflateEnd\r
+#  define inflateGetHeader      z_inflateGetHeader\r
+#  define inflateInit2_         z_inflateInit2_\r
+#  define inflateInit_          z_inflateInit_\r
+#  define inflateMark           z_inflateMark\r
+#  define inflatePrime          z_inflatePrime\r
+#  define inflateReset          z_inflateReset\r
+#  define inflateReset2         z_inflateReset2\r
+#  define inflateSetDictionary  z_inflateSetDictionary\r
+#  define inflateGetDictionary  z_inflateGetDictionary\r
+#  define inflateSync           z_inflateSync\r
+#  define inflateSyncPoint      z_inflateSyncPoint\r
+#  define inflateUndermine      z_inflateUndermine\r
+#  define inflateResetKeep      z_inflateResetKeep\r
+#  define inflate_copyright     z_inflate_copyright\r
+#  define inflate_fast          z_inflate_fast\r
+#  define inflate_table         z_inflate_table\r
+#  ifndef Z_SOLO\r
+#    define uncompress            z_uncompress\r
+#  endif\r
+#  define zError                z_zError\r
+#  ifndef Z_SOLO\r
+#    define zcalloc               z_zcalloc\r
+#    define zcfree                z_zcfree\r
+#  endif\r
+#  define zlibCompileFlags      z_zlibCompileFlags\r
+#  define zlibVersion           z_zlibVersion\r
+\r
+/* all zlib typedefs in zlib.h and zconf.h */\r
+#  define Byte                  z_Byte\r
+#  define Bytef                 z_Bytef\r
+#  define alloc_func            z_alloc_func\r
+#  define charf                 z_charf\r
+#  define free_func             z_free_func\r
+#  ifndef Z_SOLO\r
+#    define gzFile                z_gzFile\r
+#  endif\r
+#  define gz_header             z_gz_header\r
+#  define gz_headerp            z_gz_headerp\r
+#  define in_func               z_in_func\r
+#  define intf                  z_intf\r
+#  define out_func              z_out_func\r
+#  define uInt                  z_uInt\r
+#  define uIntf                 z_uIntf\r
+#  define uLong                 z_uLong\r
+#  define uLongf                z_uLongf\r
+#  define voidp                 z_voidp\r
+#  define voidpc                z_voidpc\r
+#  define voidpf                z_voidpf\r
+\r
+/* all zlib structs in zlib.h and zconf.h */\r
+#  define gz_header_s           z_gz_header_s\r
+#  define internal_state        z_internal_state\r
+\r
+#endif\r
+\r
+#if defined(__MSDOS__) && !defined(MSDOS)\r
+#  define MSDOS\r
+#endif\r
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)\r
+#  define OS2\r
+#endif\r
+#if defined(_WINDOWS) && !defined(WINDOWS)\r
+#  define WINDOWS\r
+#endif\r
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)\r
+#  ifndef WIN32\r
+#    define WIN32\r
+#  endif\r
+#endif\r
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)\r
+#  if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)\r
+#    ifndef SYS16BIT\r
+#      define SYS16BIT\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+/*\r
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more\r
+ * than 64k bytes at a time (needed on systems with 16-bit int).\r
+ */\r
+#ifdef SYS16BIT\r
+#  define MAXSEG_64K\r
+#endif\r
+#ifdef MSDOS\r
+#  define UNALIGNED_OK\r
+#endif\r
+\r
+#ifdef __STDC_VERSION__\r
+#  ifndef STDC\r
+#    define STDC\r
+#  endif\r
+#  if __STDC_VERSION__ >= 199901L\r
+#    ifndef STDC99\r
+#      define STDC99\r
+#    endif\r
+#  endif\r
+#endif\r
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))\r
+#  define STDC\r
+#endif\r
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))\r
+#  define STDC\r
+#endif\r
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))\r
+#  define STDC\r
+#endif\r
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))\r
+#  define STDC\r
+#endif\r
+\r
+#if defined(__OS400__) && !defined(STDC)    /* iSeries (formerly AS/400). */\r
+#  define STDC\r
+#endif\r
+\r
+#ifndef STDC\r
+#  ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */\r
+#    define const       /* note: need a more gentle solution here */\r
+#  endif\r
+#endif\r
+\r
+#if defined(ZLIB_CONST) && !defined(z_const)\r
+#  define z_const const\r
+#else\r
+#  define z_const\r
+#endif\r
+\r
+/* Some Mac compilers merge all .h files incorrectly: */\r
+#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__)\r
+#  define NO_DUMMY_DECL\r
+#endif\r
+\r
+/* Maximum value for memLevel in deflateInit2 */\r
+#ifndef MAX_MEM_LEVEL\r
+#  ifdef MAXSEG_64K\r
+#    define MAX_MEM_LEVEL 8\r
+#  else\r
+#    define MAX_MEM_LEVEL 9\r
+#  endif\r
+#endif\r
+\r
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.\r
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files\r
+ * created by gzip. (Files created by minigzip can still be extracted by\r
+ * gzip.)\r
+ */\r
+#ifndef MAX_WBITS\r
+#  define MAX_WBITS   15 /* 32K LZ77 window */\r
+#endif\r
+\r
+/* The memory requirements for deflate are (in bytes):\r
+            (1 << (windowBits+2)) +  (1 << (memLevel+9))\r
+ that is: 128K for windowBits=15  +  128K for memLevel = 8  (default values)\r
+ plus a few kilobytes for small objects. For example, if you want to reduce\r
+ the default memory requirements from 256K to 128K, compile with\r
+     make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"\r
+ Of course this will generally degrade compression (there's no free lunch).\r
+\r
+   The memory requirements for inflate are (in bytes) 1 << windowBits\r
+ that is, 32K for windowBits=15 (default value) plus a few kilobytes\r
+ for small objects.\r
+*/\r
+\r
+                        /* Type declarations */\r
+\r
+#ifndef OF /* function prototypes */\r
+#  ifdef STDC\r
+#    define OF(args)  args\r
+#  else\r
+#    define OF(args)  ()\r
+#  endif\r
+#endif\r
+\r
+#ifndef Z_ARG /* function prototypes for stdarg */\r
+#  if defined(STDC) || defined(Z_HAVE_STDARG_H)\r
+#    define Z_ARG(args)  args\r
+#  else\r
+#    define Z_ARG(args)  ()\r
+#  endif\r
+#endif\r
+\r
+/* The following definitions for FAR are needed only for MSDOS mixed\r
+ * model programming (small or medium model with some far allocations).\r
+ * This was tested only with MSC; for other MSDOS compilers you may have\r
+ * to define NO_MEMCPY in zutil.h.  If you don't need the mixed model,\r
+ * just define FAR to be empty.\r
+ */\r
+#ifdef SYS16BIT\r
+#  if defined(M_I86SM) || defined(M_I86MM)\r
+     /* MSC small or medium model */\r
+#    define SMALL_MEDIUM\r
+#    ifdef _MSC_VER\r
+#      define FAR _far\r
+#    else\r
+#      define FAR far\r
+#    endif\r
+#  endif\r
+#  if (defined(__SMALL__) || defined(__MEDIUM__))\r
+     /* Turbo C small or medium model */\r
+#    define SMALL_MEDIUM\r
+#    ifdef __BORLANDC__\r
+#      define FAR _far\r
+#    else\r
+#      define FAR far\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#if defined(WINDOWS) || defined(WIN32)\r
+   /* If building or using zlib as a DLL, define ZLIB_DLL.\r
+    * This is not mandatory, but it offers a little performance increase.\r
+    */\r
+#  ifdef ZLIB_DLL\r
+#    if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))\r
+#      ifdef ZLIB_INTERNAL\r
+#        define ZEXTERN extern __declspec(dllexport)\r
+#      else\r
+#        define ZEXTERN extern __declspec(dllimport)\r
+#      endif\r
+#    endif\r
+#  endif  /* ZLIB_DLL */\r
+   /* If building or using zlib with the WINAPI/WINAPIV calling convention,\r
+    * define ZLIB_WINAPI.\r
+    * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.\r
+    */\r
+#  ifdef ZLIB_WINAPI\r
+#    ifdef FAR\r
+#      undef FAR\r
+#    endif\r
+#    include <windows.h>\r
+     /* No need for _export, use ZLIB.DEF instead. */\r
+     /* For complete Windows compatibility, use WINAPI, not __stdcall. */\r
+#    define ZEXPORT WINAPI\r
+#    ifdef WIN32\r
+#      define ZEXPORTVA WINAPIV\r
+#    else\r
+#      define ZEXPORTVA FAR CDECL\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#if defined (__BEOS__)\r
+#  ifdef ZLIB_DLL\r
+#    ifdef ZLIB_INTERNAL\r
+#      define ZEXPORT   __declspec(dllexport)\r
+#      define ZEXPORTVA __declspec(dllexport)\r
+#    else\r
+#      define ZEXPORT   __declspec(dllimport)\r
+#      define ZEXPORTVA __declspec(dllimport)\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#ifndef ZEXTERN\r
+#  define ZEXTERN extern\r
+#endif\r
+#ifndef ZEXPORT\r
+#  define ZEXPORT\r
+#endif\r
+#ifndef ZEXPORTVA\r
+#  define ZEXPORTVA\r
+#endif\r
+\r
+#ifndef FAR\r
+#  define FAR\r
+#endif\r
+\r
+#if !defined(__MACTYPES__)\r
+typedef unsigned char  Byte;  /* 8 bits */\r
+#endif\r
+typedef unsigned int   uInt;  /* 16 bits or more */\r
+typedef unsigned long  uLong; /* 32 bits or more */\r
+\r
+#ifdef SMALL_MEDIUM\r
+   /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */\r
+#  define Bytef Byte FAR\r
+#else\r
+   typedef Byte  FAR Bytef;\r
+#endif\r
+typedef char  FAR charf;\r
+typedef int   FAR intf;\r
+typedef uInt  FAR uIntf;\r
+typedef uLong FAR uLongf;\r
+\r
+#ifdef STDC\r
+   typedef void const *voidpc;\r
+   typedef void FAR   *voidpf;\r
+   typedef void       *voidp;\r
+#else\r
+   typedef Byte const *voidpc;\r
+   typedef Byte FAR   *voidpf;\r
+   typedef Byte       *voidp;\r
+#endif\r
+\r
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)\r
+#  include <limits.h>\r
+#  if (UINT_MAX == 0xffffffffUL)\r
+#    define Z_U4 unsigned\r
+#  elif (ULONG_MAX == 0xffffffffUL)\r
+#    define Z_U4 unsigned long\r
+#  elif (USHRT_MAX == 0xffffffffUL)\r
+#    define Z_U4 unsigned short\r
+#  endif\r
+#endif\r
+\r
+#ifdef Z_U4\r
+   typedef Z_U4 z_crc_t;\r
+#else\r
+   typedef unsigned long z_crc_t;\r
+#endif\r
+\r
+#ifdef HAVE_UNISTD_H    /* may be set to #if 1 by ./configure */\r
+#  define Z_HAVE_UNISTD_H\r
+#endif\r
+\r
+#ifdef HAVE_STDARG_H    /* may be set to #if 1 by ./configure */\r
+#  define Z_HAVE_STDARG_H\r
+#endif\r
+\r
+#ifdef STDC\r
+#  ifndef Z_SOLO\r
+#    include <sys/types.h>      /* for off_t */\r
+#  endif\r
+#endif\r
+\r
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)\r
+#  ifndef Z_SOLO\r
+#    include <stdarg.h>         /* for va_list */\r
+#  endif\r
+#endif\r
+\r
+#ifdef _WIN32\r
+#  ifndef Z_SOLO\r
+#    include <stddef.h>         /* for wchar_t */\r
+#  endif\r
+#endif\r
+\r
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and\r
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even\r
+ * though the former does not conform to the LFS document), but considering\r
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as\r
+ * equivalently requesting no 64-bit operations\r
+ */\r
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1\r
+#  undef _LARGEFILE64_SOURCE\r
+#endif\r
+\r
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)\r
+#  define Z_HAVE_UNISTD_H\r
+#endif\r
+#ifndef Z_SOLO\r
+#  if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)\r
+#    include <unistd.h>         /* for SEEK_*, off_t, and _LFS64_LARGEFILE */\r
+#    ifdef VMS\r
+#      include <unixio.h>       /* for off_t */\r
+#    endif\r
+#    ifndef z_off_t\r
+#      define z_off_t off_t\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0\r
+#  define Z_LFS64\r
+#endif\r
+\r
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)\r
+#  define Z_LARGE64\r
+#endif\r
+\r
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)\r
+#  define Z_WANT64\r
+#endif\r
+\r
+#if !defined(SEEK_SET) && !defined(Z_SOLO)\r
+#  define SEEK_SET        0       /* Seek from beginning of file.  */\r
+#  define SEEK_CUR        1       /* Seek from current position.  */\r
+#  define SEEK_END        2       /* Set file pointer to EOF plus "offset" */\r
+#endif\r
+\r
+#ifndef z_off_t\r
+#  define z_off_t long\r
+#endif\r
+\r
+#if !defined(_WIN32) && defined(Z_LARGE64)\r
+#  define z_off64_t off64_t\r
+#else\r
+#  if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)\r
+#    define z_off64_t __int64\r
+#  else\r
+#    define z_off64_t z_off_t\r
+#  endif\r
+#endif\r
+\r
+/* MVS linker does not support external names larger than 8 bytes */\r
+#if defined(__MVS__)\r
+  #pragma map(deflateInit_,"DEIN")\r
+  #pragma map(deflateInit2_,"DEIN2")\r
+  #pragma map(deflateEnd,"DEEND")\r
+  #pragma map(deflateBound,"DEBND")\r
+  #pragma map(inflateInit_,"ININ")\r
+  #pragma map(inflateInit2_,"ININ2")\r
+  #pragma map(inflateEnd,"INEND")\r
+  #pragma map(inflateSync,"INSY")\r
+  #pragma map(inflateSetDictionary,"INSEDI")\r
+  #pragma map(compressBound,"CMBND")\r
+  #pragma map(inflate_table,"INTABL")\r
+  #pragma map(inflate_fast,"INFA")\r
+  #pragma map(inflate_copyright,"INCOPY")\r
+#endif\r
+\r
+#endif /* ZCONF_H */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.3 b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.3
new file mode 100644 (file)
index 0000000..86dfbe2
--- /dev/null
@@ -0,0 +1,151 @@
+.TH ZLIB 3 "28 Apr 2013"\r
+.SH NAME\r
+zlib \- compression/decompression library\r
+.SH SYNOPSIS\r
+[see\r
+.I zlib.h\r
+for full description]\r
+.SH DESCRIPTION\r
+The\r
+.I zlib\r
+library is a general purpose data compression library.\r
+The code is thread safe, assuming that the standard library functions\r
+used are thread safe, such as memory allocation routines.\r
+It provides in-memory compression and decompression functions,\r
+including integrity checks of the uncompressed data.\r
+This version of the library supports only one compression method (deflation)\r
+but other algorithms may be added later\r
+with the same stream interface.\r
+.LP\r
+Compression can be done in a single step if the buffers are large enough\r
+or can be done by repeated calls of the compression function.\r
+In the latter case,\r
+the application must provide more input and/or consume the output\r
+(providing more output space) before each call.\r
+.LP\r
+The library also supports reading and writing files in\r
+.IR gzip (1)\r
+(.gz) format\r
+with an interface similar to that of stdio.\r
+.LP\r
+The library does not install any signal handler.\r
+The decoder checks the consistency of the compressed data,\r
+so the library should never crash even in the case of corrupted input.\r
+.LP\r
+All functions of the compression library are documented in the file\r
+.IR zlib.h .\r
+The distribution source includes examples of use of the library\r
+in the files\r
+.I test/example.c\r
+and\r
+.IR test/minigzip.c,\r
+as well as other examples in the\r
+.IR examples/\r
+directory.\r
+.LP\r
+Changes to this version are documented in the file\r
+.I ChangeLog\r
+that accompanies the source.\r
+.LP\r
+.I zlib\r
+is available in Java using the java.util.zip package:\r
+.IP\r
+http://java.sun.com/developer/technicalArticles/Programming/compression/\r
+.LP\r
+A Perl interface to\r
+.IR zlib ,\r
+written by Paul Marquess (pmqs@cpan.org),\r
+is available at CPAN (Comprehensive Perl Archive Network) sites,\r
+including:\r
+.IP\r
+http://search.cpan.org/~pmqs/IO-Compress-Zlib/\r
+.LP\r
+A Python interface to\r
+.IR zlib ,\r
+written by A.M. Kuchling (amk@magnet.com),\r
+is available in Python 1.5 and later versions:\r
+.IP\r
+http://docs.python.org/library/zlib.html\r
+.LP\r
+.I zlib\r
+is built into\r
+.IR tcl:\r
+.IP\r
+http://wiki.tcl.tk/4610\r
+.LP\r
+An experimental package to read and write files in .zip format,\r
+written on top of\r
+.I zlib\r
+by Gilles Vollant (info@winimage.com),\r
+is available at:\r
+.IP\r
+http://www.winimage.com/zLibDll/minizip.html\r
+and also in the\r
+.I contrib/minizip\r
+directory of the main\r
+.I zlib\r
+source distribution.\r
+.SH "SEE ALSO"\r
+The\r
+.I zlib\r
+web site can be found at:\r
+.IP\r
+http://zlib.net/\r
+.LP\r
+The data format used by the zlib library is described by RFC\r
+(Request for Comments) 1950 to 1952 in the files:\r
+.IP\r
+http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format)\r
+.br\r
+http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format)\r
+.br\r
+http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format)\r
+.LP\r
+Mark Nelson wrote an article about\r
+.I zlib\r
+for the Jan. 1997 issue of  Dr. Dobb's Journal;\r
+a copy of the article is available at:\r
+.IP\r
+http://marknelson.us/1997/01/01/zlib-engine/\r
+.SH "REPORTING PROBLEMS"\r
+Before reporting a problem,\r
+please check the\r
+.I zlib\r
+web site to verify that you have the latest version of\r
+.IR zlib ;\r
+otherwise,\r
+obtain the latest version and see if the problem still exists.\r
+Please read the\r
+.I zlib\r
+FAQ at:\r
+.IP\r
+http://zlib.net/zlib_faq.html\r
+.LP\r
+before asking for help.\r
+Send questions and/or comments to zlib@gzip.org,\r
+or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).\r
+.SH AUTHORS\r
+Version 1.2.8\r
+Copyright (C) 1995-2013 Jean-loup Gailly (jloup@gzip.org)\r
+and Mark Adler (madler@alumni.caltech.edu).\r
+.LP\r
+This software is provided "as-is,"\r
+without any express or implied warranty.\r
+In no event will the authors be held liable for any damages\r
+arising from the use of this software.\r
+See the distribution directory with respect to requirements\r
+governing redistribution.\r
+The deflate format used by\r
+.I zlib\r
+was defined by Phil Katz.\r
+The deflate and\r
+.I zlib\r
+specifications were written by L. Peter Deutsch.\r
+Thanks to all the people who reported problems and suggested various\r
+improvements in\r
+.IR zlib ;\r
+who are too numerous to cite here.\r
+.LP\r
+UNIX manual page by R. P. C. Rodgers,\r
+U.S. National Library of Medicine (rodgers@nlm.nih.gov).\r
+.\" end of man page\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zlib.h
new file mode 100644 (file)
index 0000000..1d98298
--- /dev/null
@@ -0,0 +1,1768 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library\r
+  version 1.2.8, April 28th, 2013\r
+\r
+  Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler\r
+\r
+  This software is provided 'as-is', without any express or implied\r
+  warranty.  In no event will the authors be held liable for any damages\r
+  arising from the use of this software.\r
+\r
+  Permission is granted to anyone to use this software for any purpose,\r
+  including commercial applications, and to alter it and redistribute it\r
+  freely, subject to the following restrictions:\r
+\r
+  1. The origin of this software must not be misrepresented; you must not\r
+     claim that you wrote the original software. If you use this software\r
+     in a product, an acknowledgment in the product documentation would be\r
+     appreciated but is not required.\r
+  2. Altered source versions must be plainly marked as such, and must not be\r
+     misrepresented as being the original software.\r
+  3. This notice may not be removed or altered from any source distribution.\r
+\r
+  Jean-loup Gailly        Mark Adler\r
+  jloup@gzip.org          madler@alumni.caltech.edu\r
+\r
+\r
+  The data format used by the zlib library is described by RFCs (Request for\r
+  Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950\r
+  (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).\r
+*/\r
+\r
+#ifndef ZLIB_H\r
+#define ZLIB_H\r
+\r
+#include "zconf.h"\r
+\r
+#ifdef __cplusplus\r
+extern "C" {\r
+#endif\r
+\r
+#define ZLIB_VERSION "1.2.8"\r
+#define ZLIB_VERNUM 0x1280\r
+#define ZLIB_VER_MAJOR 1\r
+#define ZLIB_VER_MINOR 2\r
+#define ZLIB_VER_REVISION 8\r
+#define ZLIB_VER_SUBREVISION 0\r
+\r
+/*\r
+    The 'zlib' compression library provides in-memory compression and\r
+  decompression functions, including integrity checks of the uncompressed data.\r
+  This version of the library supports only one compression method (deflation)\r
+  but other algorithms will be added later and will have the same stream\r
+  interface.\r
+\r
+    Compression can be done in a single step if the buffers are large enough,\r
+  or can be done by repeated calls of the compression function.  In the latter\r
+  case, the application must provide more input and/or consume the output\r
+  (providing more output space) before each call.\r
+\r
+    The compressed data format used by default by the in-memory functions is\r
+  the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped\r
+  around a deflate stream, which is itself documented in RFC 1951.\r
+\r
+    The library also supports reading and writing files in gzip (.gz) format\r
+  with an interface similar to that of stdio using the functions that start\r
+  with "gz".  The gzip format is different from the zlib format.  gzip is a\r
+  gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.\r
+\r
+    This library can optionally read and write gzip streams in memory as well.\r
+\r
+    The zlib format was designed to be compact and fast for use in memory\r
+  and on communications channels.  The gzip format was designed for single-\r
+  file compression on file systems, has a larger header than zlib to maintain\r
+  directory information, and uses a different, slower check method than zlib.\r
+\r
+    The library does not install any signal handler.  The decoder checks\r
+  the consistency of the compressed data, so the library should never crash\r
+  even in case of corrupted input.\r
+*/\r
+\r
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));\r
+typedef void   (*free_func)  OF((voidpf opaque, voidpf address));\r
+\r
+struct internal_state;\r
+\r
+typedef struct z_stream_s {\r
+    z_const Bytef *next_in;     /* next input byte */\r
+    uInt     avail_in;  /* number of bytes available at next_in */\r
+    uLong    total_in;  /* total number of input bytes read so far */\r
+\r
+    Bytef    *next_out; /* next output byte should be put there */\r
+    uInt     avail_out; /* remaining free space at next_out */\r
+    uLong    total_out; /* total number of bytes output so far */\r
+\r
+    z_const char *msg;  /* last error message, NULL if no error */\r
+    struct internal_state FAR *state; /* not visible by applications */\r
+\r
+    alloc_func zalloc;  /* used to allocate the internal state */\r
+    free_func  zfree;   /* used to free the internal state */\r
+    voidpf     opaque;  /* private data object passed to zalloc and zfree */\r
+\r
+    int     data_type;  /* best guess about the data type: binary or text */\r
+    uLong   adler;      /* adler32 value of the uncompressed data */\r
+    uLong   reserved;   /* reserved for future use */\r
+} z_stream;\r
+\r
+typedef z_stream FAR *z_streamp;\r
+\r
+/*\r
+     gzip header information passed to and from zlib routines.  See RFC 1952\r
+  for more details on the meanings of these fields.\r
+*/\r
+typedef struct gz_header_s {\r
+    int     text;       /* true if compressed data believed to be text */\r
+    uLong   time;       /* modification time */\r
+    int     xflags;     /* extra flags (not used when writing a gzip file) */\r
+    int     os;         /* operating system */\r
+    Bytef   *extra;     /* pointer to extra field or Z_NULL if none */\r
+    uInt    extra_len;  /* extra field length (valid if extra != Z_NULL) */\r
+    uInt    extra_max;  /* space at extra (only when reading header) */\r
+    Bytef   *name;      /* pointer to zero-terminated file name or Z_NULL */\r
+    uInt    name_max;   /* space at name (only when reading header) */\r
+    Bytef   *comment;   /* pointer to zero-terminated comment or Z_NULL */\r
+    uInt    comm_max;   /* space at comment (only when reading header) */\r
+    int     hcrc;       /* true if there was or will be a header crc */\r
+    int     done;       /* true when done reading gzip header (not used\r
+                           when writing a gzip file) */\r
+} gz_header;\r
+\r
+typedef gz_header FAR *gz_headerp;\r
+\r
+/*\r
+     The application must update next_in and avail_in when avail_in has dropped\r
+   to zero.  It must update next_out and avail_out when avail_out has dropped\r
+   to zero.  The application must initialize zalloc, zfree and opaque before\r
+   calling the init function.  All other fields are set by the compression\r
+   library and must not be updated by the application.\r
+\r
+     The opaque value provided by the application will be passed as the first\r
+   parameter for calls of zalloc and zfree.  This can be useful for custom\r
+   memory management.  The compression library attaches no meaning to the\r
+   opaque value.\r
+\r
+     zalloc must return Z_NULL if there is not enough memory for the object.\r
+   If zlib is used in a multi-threaded application, zalloc and zfree must be\r
+   thread safe.\r
+\r
+     On 16-bit systems, the functions zalloc and zfree must be able to allocate\r
+   exactly 65536 bytes, but will not be required to allocate more than this if\r
+   the symbol MAXSEG_64K is defined (see zconf.h).  WARNING: On MSDOS, pointers\r
+   returned by zalloc for objects of exactly 65536 bytes *must* have their\r
+   offset normalized to zero.  The default allocation function provided by this\r
+   library ensures this (see zutil.c).  To reduce memory requirements and avoid\r
+   any allocation of 64K objects, at the expense of compression ratio, compile\r
+   the library with -DMAX_WBITS=14 (see zconf.h).\r
+\r
+     The fields total_in and total_out can be used for statistics or progress\r
+   reports.  After compression, total_in holds the total size of the\r
+   uncompressed data and may be saved for use in the decompressor (particularly\r
+   if the decompressor wants to decompress everything in a single step).\r
+*/\r
+\r
+                        /* constants */\r
+\r
+#define Z_NO_FLUSH      0\r
+#define Z_PARTIAL_FLUSH 1\r
+#define Z_SYNC_FLUSH    2\r
+#define Z_FULL_FLUSH    3\r
+#define Z_FINISH        4\r
+#define Z_BLOCK         5\r
+#define Z_TREES         6\r
+/* Allowed flush values; see deflate() and inflate() below for details */\r
+\r
+#define Z_OK            0\r
+#define Z_STREAM_END    1\r
+#define Z_NEED_DICT     2\r
+#define Z_ERRNO        (-1)\r
+#define Z_STREAM_ERROR (-2)\r
+#define Z_DATA_ERROR   (-3)\r
+#define Z_MEM_ERROR    (-4)\r
+#define Z_BUF_ERROR    (-5)\r
+#define Z_VERSION_ERROR (-6)\r
+/* Return codes for the compression/decompression functions. Negative values\r
+ * are errors, positive values are used for special but normal events.\r
+ */\r
+\r
+#define Z_NO_COMPRESSION         0\r
+#define Z_BEST_SPEED             1\r
+#define Z_BEST_COMPRESSION       9\r
+#define Z_DEFAULT_COMPRESSION  (-1)\r
+/* compression levels */\r
+\r
+#define Z_FILTERED            1\r
+#define Z_HUFFMAN_ONLY        2\r
+#define Z_RLE                 3\r
+#define Z_FIXED               4\r
+#define Z_DEFAULT_STRATEGY    0\r
+/* compression strategy; see deflateInit2() below for details */\r
+\r
+#define Z_BINARY   0\r
+#define Z_TEXT     1\r
+#define Z_ASCII    Z_TEXT   /* for compatibility with 1.2.2 and earlier */\r
+#define Z_UNKNOWN  2\r
+/* Possible values of the data_type field (though see inflate()) */\r
+\r
+#define Z_DEFLATED   8\r
+/* The deflate compression method (the only one supported in this version) */\r
+\r
+#define Z_NULL  0  /* for initializing zalloc, zfree, opaque */\r
+\r
+#define zlib_version zlibVersion()\r
+/* for compatibility with versions < 1.0.2 */\r
+\r
+\r
+                        /* basic functions */\r
+\r
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));\r
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.\r
+   If the first character differs, the library code actually used is not\r
+   compatible with the zlib.h header file used by the application.  This check\r
+   is automatically made by deflateInit and inflateInit.\r
+ */\r
+\r
+/*\r
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));\r
+\r
+     Initializes the internal stream state for compression.  The fields\r
+   zalloc, zfree and opaque must be initialized before by the caller.  If\r
+   zalloc and zfree are set to Z_NULL, deflateInit updates them to use default\r
+   allocation functions.\r
+\r
+     The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:\r
+   1 gives best speed, 9 gives best compression, 0 gives no compression at all\r
+   (the input data is simply copied a block at a time).  Z_DEFAULT_COMPRESSION\r
+   requests a default compromise between speed and compression (currently\r
+   equivalent to level 6).\r
+\r
+     deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_STREAM_ERROR if level is not a valid compression level, or\r
+   Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible\r
+   with the version assumed by the caller (ZLIB_VERSION).  msg is set to null\r
+   if there is no error message.  deflateInit does not perform any compression:\r
+   this will be done by deflate().\r
+*/\r
+\r
+\r
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));\r
+/*\r
+    deflate compresses as much data as possible, and stops when the input\r
+  buffer becomes empty or the output buffer becomes full.  It may introduce\r
+  some output latency (reading input without producing any output) except when\r
+  forced to flush.\r
+\r
+    The detailed semantics are as follows.  deflate performs one or both of the\r
+  following actions:\r
+\r
+  - Compress more input starting at next_in and update next_in and avail_in\r
+    accordingly.  If not all input can be processed (because there is not\r
+    enough room in the output buffer), next_in and avail_in are updated and\r
+    processing will resume at this point for the next call of deflate().\r
+\r
+  - Provide more output starting at next_out and update next_out and avail_out\r
+    accordingly.  This action is forced if the parameter flush is non zero.\r
+    Forcing flush frequently degrades the compression ratio, so this parameter\r
+    should be set only when necessary (in interactive applications).  Some\r
+    output may be provided even if flush is not set.\r
+\r
+    Before the call of deflate(), the application should ensure that at least\r
+  one of the actions is possible, by providing more input and/or consuming more\r
+  output, and updating avail_in or avail_out accordingly; avail_out should\r
+  never be zero before the call.  The application can consume the compressed\r
+  output when it wants, for example when the output buffer is full (avail_out\r
+  == 0), or after each call of deflate().  If deflate returns Z_OK and with\r
+  zero avail_out, it must be called again after making room in the output\r
+  buffer because there might be more output pending.\r
+\r
+    Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to\r
+  decide how much data to accumulate before producing output, in order to\r
+  maximize compression.\r
+\r
+    If the parameter flush is set to Z_SYNC_FLUSH, all pending output is\r
+  flushed to the output buffer and the output is aligned on a byte boundary, so\r
+  that the decompressor can get all input data available so far.  (In\r
+  particular avail_in is zero after the call if enough output space has been\r
+  provided before the call.) Flushing may degrade compression for some\r
+  compression algorithms and so it should be used only when necessary.  This\r
+  completes the current deflate block and follows it with an empty stored block\r
+  that is three bits plus filler bits to the next byte, followed by four bytes\r
+  (00 00 ff ff).\r
+\r
+    If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the\r
+  output buffer, but the output is not aligned to a byte boundary.  All of the\r
+  input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.\r
+  This completes the current deflate block and follows it with an empty fixed\r
+  codes block that is 10 bits long.  This assures that enough bytes are output\r
+  in order for the decompressor to finish the block before the empty fixed code\r
+  block.\r
+\r
+    If flush is set to Z_BLOCK, a deflate block is completed and emitted, as\r
+  for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to\r
+  seven bits of the current block are held to be written as the next byte after\r
+  the next deflate block is completed.  In this case, the decompressor may not\r
+  be provided enough bits at this point in order to complete decompression of\r
+  the data provided so far to the compressor.  It may need to wait for the next\r
+  block to be emitted.  This is for advanced applications that need to control\r
+  the emission of deflate blocks.\r
+\r
+    If flush is set to Z_FULL_FLUSH, all output is flushed as with\r
+  Z_SYNC_FLUSH, and the compression state is reset so that decompression can\r
+  restart from this point if previous compressed data has been damaged or if\r
+  random access is desired.  Using Z_FULL_FLUSH too often can seriously degrade\r
+  compression.\r
+\r
+    If deflate returns with avail_out == 0, this function must be called again\r
+  with the same value of the flush parameter and more output space (updated\r
+  avail_out), until the flush is complete (deflate returns with non-zero\r
+  avail_out).  In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that\r
+  avail_out is greater than six to avoid repeated flush markers due to\r
+  avail_out == 0 on return.\r
+\r
+    If the parameter flush is set to Z_FINISH, pending input is processed,\r
+  pending output is flushed and deflate returns with Z_STREAM_END if there was\r
+  enough output space; if deflate returns with Z_OK, this function must be\r
+  called again with Z_FINISH and more output space (updated avail_out) but no\r
+  more input data, until it returns with Z_STREAM_END or an error.  After\r
+  deflate has returned Z_STREAM_END, the only possible operations on the stream\r
+  are deflateReset or deflateEnd.\r
+\r
+    Z_FINISH can be used immediately after deflateInit if all the compression\r
+  is to be done in a single step.  In this case, avail_out must be at least the\r
+  value returned by deflateBound (see below).  Then deflate is guaranteed to\r
+  return Z_STREAM_END.  If not enough output space is provided, deflate will\r
+  not return Z_STREAM_END, and it must be called again as described above.\r
+\r
+    deflate() sets strm->adler to the adler32 checksum of all input read\r
+  so far (that is, total_in bytes).\r
+\r
+    deflate() may update strm->data_type if it can make a good guess about\r
+  the input data type (Z_BINARY or Z_TEXT).  In doubt, the data is considered\r
+  binary.  This field is only for information purposes and does not affect the\r
+  compression algorithm in any manner.\r
+\r
+    deflate() returns Z_OK if some progress has been made (more input\r
+  processed or more output produced), Z_STREAM_END if all input has been\r
+  consumed and all output has been produced (only when flush is set to\r
+  Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example\r
+  if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible\r
+  (for example avail_in or avail_out was zero).  Note that Z_BUF_ERROR is not\r
+  fatal, and deflate() can be called again with more input and more output\r
+  space to continue compressing.\r
+*/\r
+\r
+\r
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));\r
+/*\r
+     All dynamically allocated data structures for this stream are freed.\r
+   This function discards any unprocessed input and does not flush any pending\r
+   output.\r
+\r
+     deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the\r
+   stream state was inconsistent, Z_DATA_ERROR if the stream was freed\r
+   prematurely (some input or output was discarded).  In the error case, msg\r
+   may be set but then points to a static string (which must not be\r
+   deallocated).\r
+*/\r
+\r
+\r
+/*\r
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));\r
+\r
+     Initializes the internal stream state for decompression.  The fields\r
+   next_in, avail_in, zalloc, zfree and opaque must be initialized before by\r
+   the caller.  If next_in is not Z_NULL and avail_in is large enough (the\r
+   exact value depends on the compression method), inflateInit determines the\r
+   compression method from the zlib header and allocates all data structures\r
+   accordingly; otherwise the allocation will be deferred to the first call of\r
+   inflate.  If zalloc and zfree are set to Z_NULL, inflateInit updates them to\r
+   use default allocation functions.\r
+\r
+     inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\r
+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\r
+   invalid, such as a null pointer to the structure.  msg is set to null if\r
+   there is no error message.  inflateInit does not perform any decompression\r
+   apart from possibly reading the zlib header if present: actual decompression\r
+   will be done by inflate().  (So next_in and avail_in may be modified, but\r
+   next_out and avail_out are unused and unchanged.) The current implementation\r
+   of inflateInit() does not process any header information -- that is deferred\r
+   until inflate() is called.\r
+*/\r
+\r
+\r
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));\r
+/*\r
+    inflate decompresses as much data as possible, and stops when the input\r
+  buffer becomes empty or the output buffer becomes full.  It may introduce\r
+  some output latency (reading input without producing any output) except when\r
+  forced to flush.\r
+\r
+  The detailed semantics are as follows.  inflate performs one or both of the\r
+  following actions:\r
+\r
+  - Decompress more input starting at next_in and update next_in and avail_in\r
+    accordingly.  If not all input can be processed (because there is not\r
+    enough room in the output buffer), next_in is updated and processing will\r
+    resume at this point for the next call of inflate().\r
+\r
+  - Provide more output starting at next_out and update next_out and avail_out\r
+    accordingly.  inflate() provides as much output as possible, until there is\r
+    no more input data or no more space in the output buffer (see below about\r
+    the flush parameter).\r
+\r
+    Before the call of inflate(), the application should ensure that at least\r
+  one of the actions is possible, by providing more input and/or consuming more\r
+  output, and updating the next_* and avail_* values accordingly.  The\r
+  application can consume the uncompressed output when it wants, for example\r
+  when the output buffer is full (avail_out == 0), or after each call of\r
+  inflate().  If inflate returns Z_OK and with zero avail_out, it must be\r
+  called again after making room in the output buffer because there might be\r
+  more output pending.\r
+\r
+    The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,\r
+  Z_BLOCK, or Z_TREES.  Z_SYNC_FLUSH requests that inflate() flush as much\r
+  output as possible to the output buffer.  Z_BLOCK requests that inflate()\r
+  stop if and when it gets to the next deflate block boundary.  When decoding\r
+  the zlib or gzip format, this will cause inflate() to return immediately\r
+  after the header and before the first block.  When doing a raw inflate,\r
+  inflate() will go ahead and process the first block, and will return when it\r
+  gets to the end of that block, or when it runs out of data.\r
+\r
+    The Z_BLOCK option assists in appending to or combining deflate streams.\r
+  Also to assist in this, on return inflate() will set strm->data_type to the\r
+  number of unused bits in the last byte taken from strm->next_in, plus 64 if\r
+  inflate() is currently decoding the last block in the deflate stream, plus\r
+  128 if inflate() returned immediately after decoding an end-of-block code or\r
+  decoding the complete header up to just before the first byte of the deflate\r
+  stream.  The end-of-block will not be indicated until all of the uncompressed\r
+  data from that block has been written to strm->next_out.  The number of\r
+  unused bits may in general be greater than seven, except when bit 7 of\r
+  data_type is set, in which case the number of unused bits will be less than\r
+  eight.  data_type is set as noted here every time inflate() returns for all\r
+  flush options, and so can be used to determine the amount of currently\r
+  consumed input in bits.\r
+\r
+    The Z_TREES option behaves as Z_BLOCK does, but it also returns when the\r
+  end of each deflate block header is reached, before any actual data in that\r
+  block is decoded.  This allows the caller to determine the length of the\r
+  deflate block header for later use in random access within a deflate block.\r
+  256 is added to the value of strm->data_type when inflate() returns\r
+  immediately after reaching the end of the deflate block header.\r
+\r
+    inflate() should normally be called until it returns Z_STREAM_END or an\r
+  error.  However if all decompression is to be performed in a single step (a\r
+  single call of inflate), the parameter flush should be set to Z_FINISH.  In\r
+  this case all pending input is processed and all pending output is flushed;\r
+  avail_out must be large enough to hold all of the uncompressed data for the\r
+  operation to complete.  (The size of the uncompressed data may have been\r
+  saved by the compressor for this purpose.) The use of Z_FINISH is not\r
+  required to perform an inflation in one step.  However it may be used to\r
+  inform inflate that a faster approach can be used for the single inflate()\r
+  call.  Z_FINISH also informs inflate to not maintain a sliding window if the\r
+  stream completes, which reduces inflate's memory footprint.  If the stream\r
+  does not complete, either because not all of the stream is provided or not\r
+  enough output space is provided, then a sliding window will be allocated and\r
+  inflate() can be called again to continue the operation as if Z_NO_FLUSH had\r
+  been used.\r
+\r
+     In this implementation, inflate() always flushes as much output as\r
+  possible to the output buffer, and always uses the faster approach on the\r
+  first call.  So the effects of the flush parameter in this implementation are\r
+  on the return value of inflate() as noted below, when inflate() returns early\r
+  when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of\r
+  memory for a sliding window when Z_FINISH is used.\r
+\r
+     If a preset dictionary is needed after this call (see inflateSetDictionary\r
+  below), inflate sets strm->adler to the Adler-32 checksum of the dictionary\r
+  chosen by the compressor and returns Z_NEED_DICT; otherwise it sets\r
+  strm->adler to the Adler-32 checksum of all output produced so far (that is,\r
+  total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described\r
+  below.  At the end of the stream, inflate() checks that its computed adler32\r
+  checksum is equal to that saved by the compressor and returns Z_STREAM_END\r
+  only if the checksum is correct.\r
+\r
+    inflate() can decompress and check either zlib-wrapped or gzip-wrapped\r
+  deflate data.  The header type is detected automatically, if requested when\r
+  initializing with inflateInit2().  Any information contained in the gzip\r
+  header is not retained, so applications that need that information should\r
+  instead use raw inflate, see inflateInit2() below, or inflateBack() and\r
+  perform their own processing of the gzip header and trailer.  When processing\r
+  gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output\r
+  producted so far.  The CRC-32 is checked against the gzip trailer.\r
+\r
+    inflate() returns Z_OK if some progress has been made (more input processed\r
+  or more output produced), Z_STREAM_END if the end of the compressed data has\r
+  been reached and all uncompressed output has been produced, Z_NEED_DICT if a\r
+  preset dictionary is needed at this point, Z_DATA_ERROR if the input data was\r
+  corrupted (input stream not conforming to the zlib format or incorrect check\r
+  value), Z_STREAM_ERROR if the stream structure was inconsistent (for example\r
+  next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory,\r
+  Z_BUF_ERROR if no progress is possible or if there was not enough room in the\r
+  output buffer when Z_FINISH is used.  Note that Z_BUF_ERROR is not fatal, and\r
+  inflate() can be called again with more input and more output space to\r
+  continue decompressing.  If Z_DATA_ERROR is returned, the application may\r
+  then call inflateSync() to look for a good compression block if a partial\r
+  recovery of the data is desired.\r
+*/\r
+\r
+\r
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));\r
+/*\r
+     All dynamically allocated data structures for this stream are freed.\r
+   This function discards any unprocessed input and does not flush any pending\r
+   output.\r
+\r
+     inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state\r
+   was inconsistent.  In the error case, msg may be set but then points to a\r
+   static string (which must not be deallocated).\r
+*/\r
+\r
+\r
+                        /* Advanced functions */\r
+\r
+/*\r
+    The following functions are needed only in some special applications.\r
+*/\r
+\r
+/*\r
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,\r
+                                     int  level,\r
+                                     int  method,\r
+                                     int  windowBits,\r
+                                     int  memLevel,\r
+                                     int  strategy));\r
+\r
+     This is another version of deflateInit with more compression options.  The\r
+   fields next_in, zalloc, zfree and opaque must be initialized before by the\r
+   caller.\r
+\r
+     The method parameter is the compression method.  It must be Z_DEFLATED in\r
+   this version of the library.\r
+\r
+     The windowBits parameter is the base two logarithm of the window size\r
+   (the size of the history buffer).  It should be in the range 8..15 for this\r
+   version of the library.  Larger values of this parameter result in better\r
+   compression at the expense of memory usage.  The default value is 15 if\r
+   deflateInit is used instead.\r
+\r
+     windowBits can also be -8..-15 for raw deflate.  In this case, -windowBits\r
+   determines the window size.  deflate() will then generate raw deflate data\r
+   with no zlib header or trailer, and will not compute an adler32 check value.\r
+\r
+     windowBits can also be greater than 15 for optional gzip encoding.  Add\r
+   16 to windowBits to write a simple gzip header and trailer around the\r
+   compressed data instead of a zlib wrapper.  The gzip header will have no\r
+   file name, no extra data, no comment, no modification time (set to zero), no\r
+   header crc, and the operating system will be set to 255 (unknown).  If a\r
+   gzip stream is being written, strm->adler is a crc32 instead of an adler32.\r
+\r
+     The memLevel parameter specifies how much memory should be allocated\r
+   for the internal compression state.  memLevel=1 uses minimum memory but is\r
+   slow and reduces compression ratio; memLevel=9 uses maximum memory for\r
+   optimal speed.  The default value is 8.  See zconf.h for total memory usage\r
+   as a function of windowBits and memLevel.\r
+\r
+     The strategy parameter is used to tune the compression algorithm.  Use the\r
+   value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a\r
+   filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no\r
+   string match), or Z_RLE to limit match distances to one (run-length\r
+   encoding).  Filtered data consists mostly of small values with a somewhat\r
+   random distribution.  In this case, the compression algorithm is tuned to\r
+   compress them better.  The effect of Z_FILTERED is to force more Huffman\r
+   coding and less string matching; it is somewhat intermediate between\r
+   Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY.  Z_RLE is designed to be almost as\r
+   fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data.  The\r
+   strategy parameter only affects the compression ratio but not the\r
+   correctness of the compressed output even if it is not set appropriately.\r
+   Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler\r
+   decoder for special applications.\r
+\r
+     deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid\r
+   method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is\r
+   incompatible with the version assumed by the caller (ZLIB_VERSION).  msg is\r
+   set to null if there is no error message.  deflateInit2 does not perform any\r
+   compression: this will be done by deflate().\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,\r
+                                             const Bytef *dictionary,\r
+                                             uInt  dictLength));\r
+/*\r
+     Initializes the compression dictionary from the given byte sequence\r
+   without producing any compressed output.  When using the zlib format, this\r
+   function must be called immediately after deflateInit, deflateInit2 or\r
+   deflateReset, and before any call of deflate.  When doing raw deflate, this\r
+   function must be called either before any call of deflate, or immediately\r
+   after the completion of a deflate block, i.e. after all input has been\r
+   consumed and all output has been delivered when using any of the flush\r
+   options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH.  The\r
+   compressor and decompressor must use exactly the same dictionary (see\r
+   inflateSetDictionary).\r
+\r
+     The dictionary should consist of strings (byte sequences) that are likely\r
+   to be encountered later in the data to be compressed, with the most commonly\r
+   used strings preferably put towards the end of the dictionary.  Using a\r
+   dictionary is most useful when the data to be compressed is short and can be\r
+   predicted with good accuracy; the data can then be compressed better than\r
+   with the default empty dictionary.\r
+\r
+     Depending on the size of the compression data structures selected by\r
+   deflateInit or deflateInit2, a part of the dictionary may in effect be\r
+   discarded, for example if the dictionary is larger than the window size\r
+   provided in deflateInit or deflateInit2.  Thus the strings most likely to be\r
+   useful should be put at the end of the dictionary, not at the front.  In\r
+   addition, the current implementation of deflate will use at most the window\r
+   size minus 262 bytes of the provided dictionary.\r
+\r
+     Upon return of this function, strm->adler is set to the adler32 value\r
+   of the dictionary; the decompressor may later use this value to determine\r
+   which dictionary has been used by the compressor.  (The adler32 value\r
+   applies to the whole dictionary even if only a subset of the dictionary is\r
+   actually used by the compressor.) If a raw deflate was requested, then the\r
+   adler32 value is not computed and strm->adler is not set.\r
+\r
+     deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a\r
+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\r
+   inconsistent (for example if deflate has already been called for this stream\r
+   or if not at a block boundary for raw deflate).  deflateSetDictionary does\r
+   not perform any compression: this will be done by deflate().\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,\r
+                                    z_streamp source));\r
+/*\r
+     Sets the destination stream as a complete copy of the source stream.\r
+\r
+     This function can be useful when several compression strategies will be\r
+   tried, for example when there are several ways of pre-processing the input\r
+   data with a filter.  The streams that will be discarded should then be freed\r
+   by calling deflateEnd.  Note that deflateCopy duplicates the internal\r
+   compression state which can be quite large, so this strategy is slow and can\r
+   consume lots of memory.\r
+\r
+     deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\r
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\r
+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\r
+   destination.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));\r
+/*\r
+     This function is equivalent to deflateEnd followed by deflateInit,\r
+   but does not free and reallocate all the internal compression state.  The\r
+   stream will keep the same compression level and any other attributes that\r
+   may have been set by deflateInit2.\r
+\r
+     deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent (such as zalloc or state being Z_NULL).\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,\r
+                                      int level,\r
+                                      int strategy));\r
+/*\r
+     Dynamically update the compression level and compression strategy.  The\r
+   interpretation of level and strategy is as in deflateInit2.  This can be\r
+   used to switch between compression and straight copy of the input data, or\r
+   to switch to a different kind of input data requiring a different strategy.\r
+   If the compression level is changed, the input available so far is\r
+   compressed with the old level (and may be flushed); the new level will take\r
+   effect only at the next call of deflate().\r
+\r
+     Before the call of deflateParams, the stream state must be set as for\r
+   a call of deflate(), since the currently available input may have to be\r
+   compressed and flushed.  In particular, strm->avail_out must be non-zero.\r
+\r
+     deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source\r
+   stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if\r
+   strm->avail_out was zero.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,\r
+                                    int good_length,\r
+                                    int max_lazy,\r
+                                    int nice_length,\r
+                                    int max_chain));\r
+/*\r
+     Fine tune deflate's internal compression parameters.  This should only be\r
+   used by someone who understands the algorithm used by zlib's deflate for\r
+   searching for the best matching string, and even then only by the most\r
+   fanatic optimizer trying to squeeze out the last compressed bit for their\r
+   specific input data.  Read the deflate.c source code for the meaning of the\r
+   max_lazy, good_length, nice_length, and max_chain parameters.\r
+\r
+     deflateTune() can be called after deflateInit() or deflateInit2(), and\r
+   returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.\r
+ */\r
+\r
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,\r
+                                       uLong sourceLen));\r
+/*\r
+     deflateBound() returns an upper bound on the compressed size after\r
+   deflation of sourceLen bytes.  It must be called after deflateInit() or\r
+   deflateInit2(), and after deflateSetHeader(), if used.  This would be used\r
+   to allocate an output buffer for deflation in a single pass, and so would be\r
+   called before deflate().  If that first deflate() call is provided the\r
+   sourceLen input bytes, an output buffer allocated to the size returned by\r
+   deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed\r
+   to return Z_STREAM_END.  Note that it is possible for the compressed size to\r
+   be larger than the value returned by deflateBound() if flush options other\r
+   than Z_FINISH or Z_NO_FLUSH are used.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,\r
+                                       unsigned *pending,\r
+                                       int *bits));\r
+/*\r
+     deflatePending() returns the number of bytes and bits of output that have\r
+   been generated, but not yet provided in the available output.  The bytes not\r
+   provided would be due to the available output space having being consumed.\r
+   The number of bits of output not provided are between 0 and 7, where they\r
+   await more bits to join them in order to fill out a full byte.  If pending\r
+   or bits are Z_NULL, then those values are not set.\r
+\r
+     deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent.\r
+ */\r
+\r
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,\r
+                                     int bits,\r
+                                     int value));\r
+/*\r
+     deflatePrime() inserts bits in the deflate output stream.  The intent\r
+   is that this function is used to start off the deflate output with the bits\r
+   leftover from a previous deflate stream when appending to it.  As such, this\r
+   function can only be used for raw deflate, and must be used before the first\r
+   deflate() call after a deflateInit2() or deflateReset().  bits must be less\r
+   than or equal to 16, and that many of the least significant bits of value\r
+   will be inserted in the output.\r
+\r
+     deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough\r
+   room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the\r
+   source stream state was inconsistent.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,\r
+                                         gz_headerp head));\r
+/*\r
+     deflateSetHeader() provides gzip header information for when a gzip\r
+   stream is requested by deflateInit2().  deflateSetHeader() may be called\r
+   after deflateInit2() or deflateReset() and before the first call of\r
+   deflate().  The text, time, os, extra field, name, and comment information\r
+   in the provided gz_header structure are written to the gzip header (xflag is\r
+   ignored -- the extra flags are set according to the compression level).  The\r
+   caller must assure that, if not Z_NULL, name and comment are terminated with\r
+   a zero byte, and that if extra is not Z_NULL, that extra_len bytes are\r
+   available there.  If hcrc is true, a gzip header crc is included.  Note that\r
+   the current versions of the command-line version of gzip (up through version\r
+   1.3.x) do not support header crc's, and will report that it is a "multi-part\r
+   gzip file" and give up.\r
+\r
+     If deflateSetHeader is not used, the default gzip header has text false,\r
+   the time set to zero, and os set to 255, with no extra, name, or comment\r
+   fields.  The gzip header is returned to the default state by deflateReset().\r
+\r
+     deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent.\r
+*/\r
+\r
+/*\r
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,\r
+                                     int  windowBits));\r
+\r
+     This is another version of inflateInit with an extra parameter.  The\r
+   fields next_in, avail_in, zalloc, zfree and opaque must be initialized\r
+   before by the caller.\r
+\r
+     The windowBits parameter is the base two logarithm of the maximum window\r
+   size (the size of the history buffer).  It should be in the range 8..15 for\r
+   this version of the library.  The default value is 15 if inflateInit is used\r
+   instead.  windowBits must be greater than or equal to the windowBits value\r
+   provided to deflateInit2() while compressing, or it must be equal to 15 if\r
+   deflateInit2() was not used.  If a compressed stream with a larger window\r
+   size is given as input, inflate() will return with the error code\r
+   Z_DATA_ERROR instead of trying to allocate a larger window.\r
+\r
+     windowBits can also be zero to request that inflate use the window size in\r
+   the zlib header of the compressed stream.\r
+\r
+     windowBits can also be -8..-15 for raw inflate.  In this case, -windowBits\r
+   determines the window size.  inflate() will then process raw deflate data,\r
+   not looking for a zlib or gzip header, not generating a check value, and not\r
+   looking for any check values for comparison at the end of the stream.  This\r
+   is for use with other formats that use the deflate compressed data format\r
+   such as zip.  Those formats provide their own check values.  If a custom\r
+   format is developed using the raw deflate format for compressed data, it is\r
+   recommended that a check value such as an adler32 or a crc32 be applied to\r
+   the uncompressed data as is done in the zlib, gzip, and zip formats.  For\r
+   most applications, the zlib format should be used as is.  Note that comments\r
+   above on the use in deflateInit2() applies to the magnitude of windowBits.\r
+\r
+     windowBits can also be greater than 15 for optional gzip decoding.  Add\r
+   32 to windowBits to enable zlib and gzip decoding with automatic header\r
+   detection, or add 16 to decode only the gzip format (the zlib format will\r
+   return a Z_DATA_ERROR).  If a gzip stream is being decoded, strm->adler is a\r
+   crc32 instead of an adler32.\r
+\r
+     inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_VERSION_ERROR if the zlib library version is incompatible with the\r
+   version assumed by the caller, or Z_STREAM_ERROR if the parameters are\r
+   invalid, such as a null pointer to the structure.  msg is set to null if\r
+   there is no error message.  inflateInit2 does not perform any decompression\r
+   apart from possibly reading the zlib header if present: actual decompression\r
+   will be done by inflate().  (So next_in and avail_in may be modified, but\r
+   next_out and avail_out are unused and unchanged.) The current implementation\r
+   of inflateInit2() does not process any header information -- that is\r
+   deferred until inflate() is called.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,\r
+                                             const Bytef *dictionary,\r
+                                             uInt  dictLength));\r
+/*\r
+     Initializes the decompression dictionary from the given uncompressed byte\r
+   sequence.  This function must be called immediately after a call of inflate,\r
+   if that call returned Z_NEED_DICT.  The dictionary chosen by the compressor\r
+   can be determined from the adler32 value returned by that call of inflate.\r
+   The compressor and decompressor must use exactly the same dictionary (see\r
+   deflateSetDictionary).  For raw inflate, this function can be called at any\r
+   time to set the dictionary.  If the provided dictionary is smaller than the\r
+   window and there is already data in the window, then the provided dictionary\r
+   will amend what's there.  The application must insure that the dictionary\r
+   that was used for compression is provided.\r
+\r
+     inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a\r
+   parameter is invalid (e.g.  dictionary being Z_NULL) or the stream state is\r
+   inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the\r
+   expected one (incorrect adler32 value).  inflateSetDictionary does not\r
+   perform any decompression: this will be done by subsequent calls of\r
+   inflate().\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,\r
+                                             Bytef *dictionary,\r
+                                             uInt  *dictLength));\r
+/*\r
+     Returns the sliding dictionary being maintained by inflate.  dictLength is\r
+   set to the number of bytes in the dictionary, and that many bytes are copied\r
+   to dictionary.  dictionary must have enough space, where 32768 bytes is\r
+   always enough.  If inflateGetDictionary() is called with dictionary equal to\r
+   Z_NULL, then only the dictionary length is returned, and nothing is copied.\r
+   Similary, if dictLength is Z_NULL, then it is not set.\r
+\r
+     inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the\r
+   stream state is inconsistent.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));\r
+/*\r
+     Skips invalid compressed data until a possible full flush point (see above\r
+   for the description of deflate with Z_FULL_FLUSH) can be found, or until all\r
+   available input is skipped.  No output is provided.\r
+\r
+     inflateSync searches for a 00 00 FF FF pattern in the compressed data.\r
+   All full flush points have this pattern, but not all occurrences of this\r
+   pattern are full flush points.\r
+\r
+     inflateSync returns Z_OK if a possible full flush point has been found,\r
+   Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point\r
+   has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.\r
+   In the success case, the application may save the current current value of\r
+   total_in which indicates where valid compressed data was found.  In the\r
+   error case, the application may repeatedly call inflateSync, providing more\r
+   input each time, until success or end of the input data.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,\r
+                                    z_streamp source));\r
+/*\r
+     Sets the destination stream as a complete copy of the source stream.\r
+\r
+     This function can be useful when randomly accessing a large stream.  The\r
+   first pass through the stream can periodically record the inflate state,\r
+   allowing restarting inflate at those points when randomly accessing the\r
+   stream.\r
+\r
+     inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not\r
+   enough memory, Z_STREAM_ERROR if the source stream state was inconsistent\r
+   (such as zalloc being Z_NULL).  msg is left unchanged in both source and\r
+   destination.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));\r
+/*\r
+     This function is equivalent to inflateEnd followed by inflateInit,\r
+   but does not free and reallocate all the internal decompression state.  The\r
+   stream will keep attributes that may have been set by inflateInit2.\r
+\r
+     inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent (such as zalloc or state being Z_NULL).\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,\r
+                                      int windowBits));\r
+/*\r
+     This function is the same as inflateReset, but it also permits changing\r
+   the wrap and window size requests.  The windowBits parameter is interpreted\r
+   the same as it is for inflateInit2.\r
+\r
+     inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent (such as zalloc or state being Z_NULL), or if\r
+   the windowBits parameter is invalid.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,\r
+                                     int bits,\r
+                                     int value));\r
+/*\r
+     This function inserts bits in the inflate input stream.  The intent is\r
+   that this function is used to start inflating at a bit position in the\r
+   middle of a byte.  The provided bits will be used before any bytes are used\r
+   from next_in.  This function should only be used with raw inflate, and\r
+   should be used before the first inflate() call after inflateInit2() or\r
+   inflateReset().  bits must be less than or equal to 16, and that many of the\r
+   least significant bits of value will be inserted in the input.\r
+\r
+     If bits is negative, then the input stream bit buffer is emptied.  Then\r
+   inflatePrime() can be called again to put bits in the buffer.  This is used\r
+   to clear out bits leftover after feeding inflate a block description prior\r
+   to feeding inflate codes.\r
+\r
+     inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent.\r
+*/\r
+\r
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));\r
+/*\r
+     This function returns two values, one in the lower 16 bits of the return\r
+   value, and the other in the remaining upper bits, obtained by shifting the\r
+   return value down 16 bits.  If the upper value is -1 and the lower value is\r
+   zero, then inflate() is currently decoding information outside of a block.\r
+   If the upper value is -1 and the lower value is non-zero, then inflate is in\r
+   the middle of a stored block, with the lower value equaling the number of\r
+   bytes from the input remaining to copy.  If the upper value is not -1, then\r
+   it is the number of bits back from the current bit position in the input of\r
+   the code (literal or length/distance pair) currently being processed.  In\r
+   that case the lower value is the number of bytes already emitted for that\r
+   code.\r
+\r
+     A code is being processed if inflate is waiting for more input to complete\r
+   decoding of the code, or if it has completed decoding but is waiting for\r
+   more output space to write the literal or match data.\r
+\r
+     inflateMark() is used to mark locations in the input data for random\r
+   access, which may be at bit positions, and to note those cases where the\r
+   output of a code may span boundaries of random access blocks.  The current\r
+   location in the input stream can be determined from avail_in and data_type\r
+   as noted in the description for the Z_BLOCK flush parameter for inflate.\r
+\r
+     inflateMark returns the value noted above or -1 << 16 if the provided\r
+   source stream state was inconsistent.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,\r
+                                         gz_headerp head));\r
+/*\r
+     inflateGetHeader() requests that gzip header information be stored in the\r
+   provided gz_header structure.  inflateGetHeader() may be called after\r
+   inflateInit2() or inflateReset(), and before the first call of inflate().\r
+   As inflate() processes the gzip stream, head->done is zero until the header\r
+   is completed, at which time head->done is set to one.  If a zlib stream is\r
+   being decoded, then head->done is set to -1 to indicate that there will be\r
+   no gzip header information forthcoming.  Note that Z_BLOCK or Z_TREES can be\r
+   used to force inflate() to return immediately after header processing is\r
+   complete and before any actual data is decompressed.\r
+\r
+     The text, time, xflags, and os fields are filled in with the gzip header\r
+   contents.  hcrc is set to true if there is a header CRC.  (The header CRC\r
+   was valid if done is set to one.) If extra is not Z_NULL, then extra_max\r
+   contains the maximum number of bytes to write to extra.  Once done is true,\r
+   extra_len contains the actual extra field length, and extra contains the\r
+   extra field, or that field truncated if extra_max is less than extra_len.\r
+   If name is not Z_NULL, then up to name_max characters are written there,\r
+   terminated with a zero unless the length is greater than name_max.  If\r
+   comment is not Z_NULL, then up to comm_max characters are written there,\r
+   terminated with a zero unless the length is greater than comm_max.  When any\r
+   of extra, name, or comment are not Z_NULL and the respective field is not\r
+   present in the header, then that field is set to Z_NULL to signal its\r
+   absence.  This allows the use of deflateSetHeader() with the returned\r
+   structure to duplicate the header.  However if those fields are set to\r
+   allocated memory, then the application will need to save those pointers\r
+   elsewhere so that they can be eventually freed.\r
+\r
+     If inflateGetHeader is not used, then the header information is simply\r
+   discarded.  The header is always checked for validity, including the header\r
+   CRC if present.  inflateReset() will reset the process to discard the header\r
+   information.  The application would need to call inflateGetHeader() again to\r
+   retrieve the header from the next gzip stream.\r
+\r
+     inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source\r
+   stream state was inconsistent.\r
+*/\r
+\r
+/*\r
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,\r
+                                        unsigned char FAR *window));\r
+\r
+     Initialize the internal stream state for decompression using inflateBack()\r
+   calls.  The fields zalloc, zfree and opaque in strm must be initialized\r
+   before the call.  If zalloc and zfree are Z_NULL, then the default library-\r
+   derived memory allocation routines are used.  windowBits is the base two\r
+   logarithm of the window size, in the range 8..15.  window is a caller\r
+   supplied buffer of that size.  Except for special applications where it is\r
+   assured that deflate was used with small window sizes, windowBits must be 15\r
+   and a 32K byte window must be supplied to be able to decompress general\r
+   deflate streams.\r
+\r
+     See inflateBack() for the usage of these routines.\r
+\r
+     inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of\r
+   the parameters are invalid, Z_MEM_ERROR if the internal state could not be\r
+   allocated, or Z_VERSION_ERROR if the version of the library does not match\r
+   the version of the header file.\r
+*/\r
+\r
+typedef unsigned (*in_func) OF((void FAR *,\r
+                                z_const unsigned char FAR * FAR *));\r
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));\r
+\r
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,\r
+                                    in_func in, void FAR *in_desc,\r
+                                    out_func out, void FAR *out_desc));\r
+/*\r
+     inflateBack() does a raw inflate with a single call using a call-back\r
+   interface for input and output.  This is potentially more efficient than\r
+   inflate() for file i/o applications, in that it avoids copying between the\r
+   output and the sliding window by simply making the window itself the output\r
+   buffer.  inflate() can be faster on modern CPUs when used with large\r
+   buffers.  inflateBack() trusts the application to not change the output\r
+   buffer passed by the output function, at least until inflateBack() returns.\r
+\r
+     inflateBackInit() must be called first to allocate the internal state\r
+   and to initialize the state with the user-provided window buffer.\r
+   inflateBack() may then be used multiple times to inflate a complete, raw\r
+   deflate stream with each call.  inflateBackEnd() is then called to free the\r
+   allocated state.\r
+\r
+     A raw deflate stream is one with no zlib or gzip header or trailer.\r
+   This routine would normally be used in a utility that reads zip or gzip\r
+   files and writes out uncompressed files.  The utility would decode the\r
+   header and process the trailer on its own, hence this routine expects only\r
+   the raw deflate stream to decompress.  This is different from the normal\r
+   behavior of inflate(), which expects either a zlib or gzip header and\r
+   trailer around the deflate stream.\r
+\r
+     inflateBack() uses two subroutines supplied by the caller that are then\r
+   called by inflateBack() for input and output.  inflateBack() calls those\r
+   routines until it reads a complete deflate stream and writes out all of the\r
+   uncompressed data, or until it encounters an error.  The function's\r
+   parameters and return types are defined above in the in_func and out_func\r
+   typedefs.  inflateBack() will call in(in_desc, &buf) which should return the\r
+   number of bytes of provided input, and a pointer to that input in buf.  If\r
+   there is no input available, in() must return zero--buf is ignored in that\r
+   case--and inflateBack() will return a buffer error.  inflateBack() will call\r
+   out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].  out()\r
+   should return zero on success, or non-zero on failure.  If out() returns\r
+   non-zero, inflateBack() will return with an error.  Neither in() nor out()\r
+   are permitted to change the contents of the window provided to\r
+   inflateBackInit(), which is also the buffer that out() uses to write from.\r
+   The length written by out() will be at most the window size.  Any non-zero\r
+   amount of input may be provided by in().\r
+\r
+     For convenience, inflateBack() can be provided input on the first call by\r
+   setting strm->next_in and strm->avail_in.  If that input is exhausted, then\r
+   in() will be called.  Therefore strm->next_in must be initialized before\r
+   calling inflateBack().  If strm->next_in is Z_NULL, then in() will be called\r
+   immediately for input.  If strm->next_in is not Z_NULL, then strm->avail_in\r
+   must also be initialized, and then if strm->avail_in is not zero, input will\r
+   initially be taken from strm->next_in[0 ..  strm->avail_in - 1].\r
+\r
+     The in_desc and out_desc parameters of inflateBack() is passed as the\r
+   first parameter of in() and out() respectively when they are called.  These\r
+   descriptors can be optionally used to pass any information that the caller-\r
+   supplied in() and out() functions need to do their job.\r
+\r
+     On return, inflateBack() will set strm->next_in and strm->avail_in to\r
+   pass back any unused input that was provided by the last in() call.  The\r
+   return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR\r
+   if in() or out() returned an error, Z_DATA_ERROR if there was a format error\r
+   in the deflate stream (in which case strm->msg is set to indicate the nature\r
+   of the error), or Z_STREAM_ERROR if the stream was not properly initialized.\r
+   In the case of Z_BUF_ERROR, an input or output error can be distinguished\r
+   using strm->next_in which will be Z_NULL only if in() returned an error.  If\r
+   strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning\r
+   non-zero.  (in() will always be called before out(), so strm->next_in is\r
+   assured to be defined if out() returns non-zero.) Note that inflateBack()\r
+   cannot return Z_OK.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));\r
+/*\r
+     All memory allocated by inflateBackInit() is freed.\r
+\r
+     inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream\r
+   state was inconsistent.\r
+*/\r
+\r
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));\r
+/* Return flags indicating compile-time options.\r
+\r
+    Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:\r
+     1.0: size of uInt\r
+     3.2: size of uLong\r
+     5.4: size of voidpf (pointer)\r
+     7.6: size of z_off_t\r
+\r
+    Compiler, assembler, and debug options:\r
+     8: DEBUG\r
+     9: ASMV or ASMINF -- use ASM code\r
+     10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention\r
+     11: 0 (reserved)\r
+\r
+    One-time table building (smaller code, but not thread-safe if true):\r
+     12: BUILDFIXED -- build static block decoding tables when needed\r
+     13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed\r
+     14,15: 0 (reserved)\r
+\r
+    Library content (indicates missing functionality):\r
+     16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking\r
+                          deflate code when not needed)\r
+     17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect\r
+                    and decode gzip streams (to avoid linking crc code)\r
+     18-19: 0 (reserved)\r
+\r
+    Operation variations (changes in library functionality):\r
+     20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate\r
+     21: FASTEST -- deflate algorithm with only one, lowest compression level\r
+     22,23: 0 (reserved)\r
+\r
+    The sprintf variant used by gzprintf (zero is best):\r
+     24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format\r
+     25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!\r
+     26: 0 = returns value, 1 = void -- 1 means inferred string length returned\r
+\r
+    Remainder:\r
+     27-31: 0 (reserved)\r
+ */\r
+\r
+#ifndef Z_SOLO\r
+\r
+                        /* utility functions */\r
+\r
+/*\r
+     The following utility functions are implemented on top of the basic\r
+   stream-oriented functions.  To simplify the interface, some default options\r
+   are assumed (compression level and memory usage, standard memory allocation\r
+   functions).  The source code of these utility functions can be modified if\r
+   you need special options.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT compress OF((Bytef *dest,   uLongf *destLen,\r
+                                 const Bytef *source, uLong sourceLen));\r
+/*\r
+     Compresses the source buffer into the destination buffer.  sourceLen is\r
+   the byte length of the source buffer.  Upon entry, destLen is the total size\r
+   of the destination buffer, which must be at least the value returned by\r
+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\r
+   compressed buffer.\r
+\r
+     compress returns Z_OK if success, Z_MEM_ERROR if there was not\r
+   enough memory, Z_BUF_ERROR if there was not enough room in the output\r
+   buffer.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest,   uLongf *destLen,\r
+                                  const Bytef *source, uLong sourceLen,\r
+                                  int level));\r
+/*\r
+     Compresses the source buffer into the destination buffer.  The level\r
+   parameter has the same meaning as in deflateInit.  sourceLen is the byte\r
+   length of the source buffer.  Upon entry, destLen is the total size of the\r
+   destination buffer, which must be at least the value returned by\r
+   compressBound(sourceLen).  Upon exit, destLen is the actual size of the\r
+   compressed buffer.\r
+\r
+     compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough\r
+   memory, Z_BUF_ERROR if there was not enough room in the output buffer,\r
+   Z_STREAM_ERROR if the level parameter is invalid.\r
+*/\r
+\r
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));\r
+/*\r
+     compressBound() returns an upper bound on the compressed size after\r
+   compress() or compress2() on sourceLen bytes.  It would be used before a\r
+   compress() or compress2() call to allocate the destination buffer.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest,   uLongf *destLen,\r
+                                   const Bytef *source, uLong sourceLen));\r
+/*\r
+     Decompresses the source buffer into the destination buffer.  sourceLen is\r
+   the byte length of the source buffer.  Upon entry, destLen is the total size\r
+   of the destination buffer, which must be large enough to hold the entire\r
+   uncompressed data.  (The size of the uncompressed data must have been saved\r
+   previously by the compressor and transmitted to the decompressor by some\r
+   mechanism outside the scope of this compression library.) Upon exit, destLen\r
+   is the actual size of the uncompressed buffer.\r
+\r
+     uncompress returns Z_OK if success, Z_MEM_ERROR if there was not\r
+   enough memory, Z_BUF_ERROR if there was not enough room in the output\r
+   buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.  In\r
+   the case where there is not enough room, uncompress() will fill the output\r
+   buffer with the uncompressed data up to that point.\r
+*/\r
+\r
+                        /* gzip file access functions */\r
+\r
+/*\r
+     This library supports reading and writing files in gzip (.gz) format with\r
+   an interface similar to that of stdio, using the functions that start with\r
+   "gz".  The gzip format is different from the zlib format.  gzip is a gzip\r
+   wrapper, documented in RFC 1952, wrapped around a deflate stream.\r
+*/\r
+\r
+typedef struct gzFile_s *gzFile;    /* semi-opaque gzip file descriptor */\r
+\r
+/*\r
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));\r
+\r
+     Opens a gzip (.gz) file for reading or writing.  The mode parameter is as\r
+   in fopen ("rb" or "wb") but can also include a compression level ("wb9") or\r
+   a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only\r
+   compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'\r
+   for fixed code compression as in "wb9F".  (See the description of\r
+   deflateInit2 for more information about the strategy parameter.)  'T' will\r
+   request transparent writing or appending with no compression and not using\r
+   the gzip format.\r
+\r
+     "a" can be used instead of "w" to request that the gzip stream that will\r
+   be written be appended to the file.  "+" will result in an error, since\r
+   reading and writing to the same gzip file is not supported.  The addition of\r
+   "x" when writing will create the file exclusively, which fails if the file\r
+   already exists.  On systems that support it, the addition of "e" when\r
+   reading or writing will set the flag to close the file on an execve() call.\r
+\r
+     These functions, as well as gzip, will read and decode a sequence of gzip\r
+   streams in a file.  The append function of gzopen() can be used to create\r
+   such a file.  (Also see gzflush() for another way to do this.)  When\r
+   appending, gzopen does not test whether the file begins with a gzip stream,\r
+   nor does it look for the end of the gzip streams to begin appending.  gzopen\r
+   will simply append a gzip stream to the existing file.\r
+\r
+     gzopen can be used to read a file which is not in gzip format; in this\r
+   case gzread will directly read from the file without decompression.  When\r
+   reading, this will be detected automatically by looking for the magic two-\r
+   byte gzip header.\r
+\r
+     gzopen returns NULL if the file could not be opened, if there was\r
+   insufficient memory to allocate the gzFile state, or if an invalid mode was\r
+   specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).\r
+   errno can be checked to determine if the reason gzopen failed was that the\r
+   file could not be opened.\r
+*/\r
+\r
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));\r
+/*\r
+     gzdopen associates a gzFile with the file descriptor fd.  File descriptors\r
+   are obtained from calls like open, dup, creat, pipe or fileno (if the file\r
+   has been previously opened with fopen).  The mode parameter is as in gzopen.\r
+\r
+     The next call of gzclose on the returned gzFile will also close the file\r
+   descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor\r
+   fd.  If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,\r
+   mode);.  The duplicated descriptor should be saved to avoid a leak, since\r
+   gzdopen does not close fd if it fails.  If you are using fileno() to get the\r
+   file descriptor from a FILE *, then you will have to use dup() to avoid\r
+   double-close()ing the file descriptor.  Both gzclose() and fclose() will\r
+   close the associated file descriptor, so they need to have different file\r
+   descriptors.\r
+\r
+     gzdopen returns NULL if there was insufficient memory to allocate the\r
+   gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not\r
+   provided, or '+' was provided), or if fd is -1.  The file descriptor is not\r
+   used until the next gz* read, write, seek, or close operation, so gzdopen\r
+   will not detect if fd is invalid (unless fd is -1).\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));\r
+/*\r
+     Set the internal buffer size used by this library's functions.  The\r
+   default buffer size is 8192 bytes.  This function must be called after\r
+   gzopen() or gzdopen(), and before any other calls that read or write the\r
+   file.  The buffer memory allocation is always deferred to the first read or\r
+   write.  Two buffers are allocated, either both of the specified size when\r
+   writing, or one of the specified size and the other twice that size when\r
+   reading.  A larger buffer size of, for example, 64K or 128K bytes will\r
+   noticeably increase the speed of decompression (reading).\r
+\r
+     The new buffer size also affects the maximum length for gzprintf().\r
+\r
+     gzbuffer() returns 0 on success, or -1 on failure, such as being called\r
+   too late.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));\r
+/*\r
+     Dynamically update the compression level or strategy.  See the description\r
+   of deflateInit2 for the meaning of these parameters.\r
+\r
+     gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not\r
+   opened for writing.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));\r
+/*\r
+     Reads the given number of uncompressed bytes from the compressed file.  If\r
+   the input file is not in gzip format, gzread copies the given number of\r
+   bytes into the buffer directly from the file.\r
+\r
+     After reaching the end of a gzip stream in the input, gzread will continue\r
+   to read, looking for another gzip stream.  Any number of gzip streams may be\r
+   concatenated in the input file, and will all be decompressed by gzread().\r
+   If something other than a gzip stream is encountered after a gzip stream,\r
+   that remaining trailing garbage is ignored (and no error is returned).\r
+\r
+     gzread can be used to read a gzip file that is being concurrently written.\r
+   Upon reaching the end of the input, gzread will return with the available\r
+   data.  If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then\r
+   gzclearerr can be used to clear the end of file indicator in order to permit\r
+   gzread to be tried again.  Z_OK indicates that a gzip stream was completed\r
+   on the last gzread.  Z_BUF_ERROR indicates that the input file ended in the\r
+   middle of a gzip stream.  Note that gzread does not return -1 in the event\r
+   of an incomplete gzip stream.  This error is deferred until gzclose(), which\r
+   will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip\r
+   stream.  Alternatively, gzerror can be used before gzclose to detect this\r
+   case.\r
+\r
+     gzread returns the number of uncompressed bytes actually read, less than\r
+   len for end of file, or -1 for error.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,\r
+                                voidpc buf, unsigned len));\r
+/*\r
+     Writes the given number of uncompressed bytes into the compressed file.\r
+   gzwrite returns the number of uncompressed bytes written or 0 in case of\r
+   error.\r
+*/\r
+\r
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));\r
+/*\r
+     Converts, formats, and writes the arguments to the compressed file under\r
+   control of the format string, as in fprintf.  gzprintf returns the number of\r
+   uncompressed bytes actually written, or 0 in case of error.  The number of\r
+   uncompressed bytes written is limited to 8191, or one less than the buffer\r
+   size given to gzbuffer().  The caller should assure that this limit is not\r
+   exceeded.  If it is exceeded, then gzprintf() will return an error (0) with\r
+   nothing written.  In this case, there may also be a buffer overflow with\r
+   unpredictable consequences, which is possible only if zlib was compiled with\r
+   the insecure functions sprintf() or vsprintf() because the secure snprintf()\r
+   or vsnprintf() functions were not available.  This can be determined using\r
+   zlibCompileFlags().\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));\r
+/*\r
+     Writes the given null-terminated string to the compressed file, excluding\r
+   the terminating null character.\r
+\r
+     gzputs returns the number of characters written, or -1 in case of error.\r
+*/\r
+\r
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));\r
+/*\r
+     Reads bytes from the compressed file until len-1 characters are read, or a\r
+   newline character is read and transferred to buf, or an end-of-file\r
+   condition is encountered.  If any characters are read or if len == 1, the\r
+   string is terminated with a null character.  If no characters are read due\r
+   to an end-of-file or len < 1, then the buffer is left untouched.\r
+\r
+     gzgets returns buf which is a null-terminated string, or it returns NULL\r
+   for end-of-file or in case of error.  If there was an error, the contents at\r
+   buf are indeterminate.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));\r
+/*\r
+     Writes c, converted to an unsigned char, into the compressed file.  gzputc\r
+   returns the value that was written, or -1 in case of error.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));\r
+/*\r
+     Reads one byte from the compressed file.  gzgetc returns this byte or -1\r
+   in case of end of file or error.  This is implemented as a macro for speed.\r
+   As such, it does not do all of the checking the other functions do.  I.e.\r
+   it does not check to see if file is NULL, nor whether the structure file\r
+   points to has been clobbered or not.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));\r
+/*\r
+     Push one character back onto the stream to be read as the first character\r
+   on the next read.  At least one character of push-back is allowed.\r
+   gzungetc() returns the character pushed, or -1 on failure.  gzungetc() will\r
+   fail if c is -1, and may fail if a character has been pushed but not read\r
+   yet.  If gzungetc is used immediately after gzopen or gzdopen, at least the\r
+   output buffer size of pushed characters is allowed.  (See gzbuffer above.)\r
+   The pushed character will be discarded if the stream is repositioned with\r
+   gzseek() or gzrewind().\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));\r
+/*\r
+     Flushes all pending output into the compressed file.  The parameter flush\r
+   is as in the deflate() function.  The return value is the zlib error number\r
+   (see function gzerror below).  gzflush is only permitted when writing.\r
+\r
+     If the flush parameter is Z_FINISH, the remaining data is written and the\r
+   gzip stream is completed in the output.  If gzwrite() is called again, a new\r
+   gzip stream will be started in the output.  gzread() is able to read such\r
+   concatented gzip streams.\r
+\r
+     gzflush should be called only when strictly necessary because it will\r
+   degrade compression if called too often.\r
+*/\r
+\r
+/*\r
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,\r
+                                   z_off_t offset, int whence));\r
+\r
+     Sets the starting position for the next gzread or gzwrite on the given\r
+   compressed file.  The offset represents a number of bytes in the\r
+   uncompressed data stream.  The whence parameter is defined as in lseek(2);\r
+   the value SEEK_END is not supported.\r
+\r
+     If the file is opened for reading, this function is emulated but can be\r
+   extremely slow.  If the file is opened for writing, only forward seeks are\r
+   supported; gzseek then compresses a sequence of zeroes up to the new\r
+   starting position.\r
+\r
+     gzseek returns the resulting offset location as measured in bytes from\r
+   the beginning of the uncompressed stream, or -1 in case of error, in\r
+   particular if the file is opened for writing and the new starting position\r
+   would be before the current position.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT    gzrewind OF((gzFile file));\r
+/*\r
+     Rewinds the given file. This function is supported only for reading.\r
+\r
+     gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)\r
+*/\r
+\r
+/*\r
+ZEXTERN z_off_t ZEXPORT    gztell OF((gzFile file));\r
+\r
+     Returns the starting position for the next gzread or gzwrite on the given\r
+   compressed file.  This position represents a number of bytes in the\r
+   uncompressed data stream, and is zero when starting, even if appending or\r
+   reading a gzip stream from the middle of a file using gzdopen().\r
+\r
+     gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)\r
+*/\r
+\r
+/*\r
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));\r
+\r
+     Returns the current offset in the file being read or written.  This offset\r
+   includes the count of bytes that precede the gzip stream, for example when\r
+   appending or when using gzdopen() for reading.  When reading, the offset\r
+   does not include as yet unused buffered input.  This information can be used\r
+   for a progress indicator.  On error, gzoffset() returns -1.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));\r
+/*\r
+     Returns true (1) if the end-of-file indicator has been set while reading,\r
+   false (0) otherwise.  Note that the end-of-file indicator is set only if the\r
+   read tried to go past the end of the input, but came up short.  Therefore,\r
+   just like feof(), gzeof() may return false even if there is no more data to\r
+   read, in the event that the last read request was for the exact number of\r
+   bytes remaining in the input file.  This will happen if the input file size\r
+   is an exact multiple of the buffer size.\r
+\r
+     If gzeof() returns true, then the read functions will return no more data,\r
+   unless the end-of-file indicator is reset by gzclearerr() and the input file\r
+   has grown since the previous end of file was detected.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));\r
+/*\r
+     Returns true (1) if file is being copied directly while reading, or false\r
+   (0) if file is a gzip stream being decompressed.\r
+\r
+     If the input file is empty, gzdirect() will return true, since the input\r
+   does not contain a gzip stream.\r
+\r
+     If gzdirect() is used immediately after gzopen() or gzdopen() it will\r
+   cause buffers to be allocated to allow reading the file to determine if it\r
+   is a gzip file.  Therefore if gzbuffer() is used, it should be called before\r
+   gzdirect().\r
+\r
+     When writing, gzdirect() returns true (1) if transparent writing was\r
+   requested ("wT" for the gzopen() mode), or false (0) otherwise.  (Note:\r
+   gzdirect() is not needed when writing.  Transparent writing must be\r
+   explicitly requested, so the application already knows the answer.  When\r
+   linking statically, using gzdirect() will include all of the zlib code for\r
+   gzip file reading and decompression, which may not be desired.)\r
+*/\r
+\r
+ZEXTERN int ZEXPORT    gzclose OF((gzFile file));\r
+/*\r
+     Flushes all pending output if necessary, closes the compressed file and\r
+   deallocates the (de)compression state.  Note that once file is closed, you\r
+   cannot call gzerror with file, since its structures have been deallocated.\r
+   gzclose must not be called more than once on the same file, just as free\r
+   must not be called more than once on the same allocation.\r
+\r
+     gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a\r
+   file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the\r
+   last read ended in the middle of a gzip stream, or Z_OK on success.\r
+*/\r
+\r
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));\r
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));\r
+/*\r
+     Same as gzclose(), but gzclose_r() is only for use when reading, and\r
+   gzclose_w() is only for use when writing or appending.  The advantage to\r
+   using these instead of gzclose() is that they avoid linking in zlib\r
+   compression or decompression code that is not used when only reading or only\r
+   writing respectively.  If gzclose() is used, then both compression and\r
+   decompression code will be included the application when linking to a static\r
+   zlib library.\r
+*/\r
+\r
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));\r
+/*\r
+     Returns the error message for the last error which occurred on the given\r
+   compressed file.  errnum is set to zlib error number.  If an error occurred\r
+   in the file system and not in the compression library, errnum is set to\r
+   Z_ERRNO and the application may consult errno to get the exact error code.\r
+\r
+     The application must not modify the returned string.  Future calls to\r
+   this function may invalidate the previously returned string.  If file is\r
+   closed, then the string previously returned by gzerror will no longer be\r
+   available.\r
+\r
+     gzerror() should be used to distinguish errors from end-of-file for those\r
+   functions above that do not distinguish those cases in their return values.\r
+*/\r
+\r
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));\r
+/*\r
+     Clears the error and end-of-file flags for file.  This is analogous to the\r
+   clearerr() function in stdio.  This is useful for continuing to read a gzip\r
+   file that is being written concurrently.\r
+*/\r
+\r
+#endif /* !Z_SOLO */\r
+\r
+                        /* checksum functions */\r
+\r
+/*\r
+     These functions are not related to compression but are exported\r
+   anyway because they might be useful in applications using the compression\r
+   library.\r
+*/\r
+\r
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));\r
+/*\r
+     Update a running Adler-32 checksum with the bytes buf[0..len-1] and\r
+   return the updated checksum.  If buf is Z_NULL, this function returns the\r
+   required initial value for the checksum.\r
+\r
+     An Adler-32 checksum is almost as reliable as a CRC32 but can be computed\r
+   much faster.\r
+\r
+   Usage example:\r
+\r
+     uLong adler = adler32(0L, Z_NULL, 0);\r
+\r
+     while (read_buffer(buffer, length) != EOF) {\r
+       adler = adler32(adler, buffer, length);\r
+     }\r
+     if (adler != original_adler) error();\r
+*/\r
+\r
+/*\r
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,\r
+                                          z_off_t len2));\r
+\r
+     Combine two Adler-32 checksums into one.  For two sequences of bytes, seq1\r
+   and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for\r
+   each, adler1 and adler2.  adler32_combine() returns the Adler-32 checksum of\r
+   seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.  Note\r
+   that the z_off_t type (like off_t) is a signed integer.  If len2 is\r
+   negative, the result has no meaning or utility.\r
+*/\r
+\r
+ZEXTERN uLong ZEXPORT crc32   OF((uLong crc, const Bytef *buf, uInt len));\r
+/*\r
+     Update a running CRC-32 with the bytes buf[0..len-1] and return the\r
+   updated CRC-32.  If buf is Z_NULL, this function returns the required\r
+   initial value for the crc.  Pre- and post-conditioning (one's complement) is\r
+   performed within this function so it shouldn't be done by the application.\r
+\r
+   Usage example:\r
+\r
+     uLong crc = crc32(0L, Z_NULL, 0);\r
+\r
+     while (read_buffer(buffer, length) != EOF) {\r
+       crc = crc32(crc, buffer, length);\r
+     }\r
+     if (crc != original_crc) error();\r
+*/\r
+\r
+/*\r
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));\r
+\r
+     Combine two CRC-32 check values into one.  For two sequences of bytes,\r
+   seq1 and seq2 with lengths len1 and len2, CRC-32 check values were\r
+   calculated for each, crc1 and crc2.  crc32_combine() returns the CRC-32\r
+   check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and\r
+   len2.\r
+*/\r
+\r
+\r
+                        /* various hacks, don't look :) */\r
+\r
+/* deflateInit and inflateInit are macros to allow checking the zlib version\r
+ * and the compiler's view of z_stream:\r
+ */\r
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,\r
+                                     const char *version, int stream_size));\r
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,\r
+                                     const char *version, int stream_size));\r
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int  level, int  method,\r
+                                      int windowBits, int memLevel,\r
+                                      int strategy, const char *version,\r
+                                      int stream_size));\r
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int  windowBits,\r
+                                      const char *version, int stream_size));\r
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,\r
+                                         unsigned char FAR *window,\r
+                                         const char *version,\r
+                                         int stream_size));\r
+#define deflateInit(strm, level) \\r
+        deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))\r
+#define inflateInit(strm) \\r
+        inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))\r
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \\r
+        deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\\r
+                      (strategy), ZLIB_VERSION, (int)sizeof(z_stream))\r
+#define inflateInit2(strm, windowBits) \\r
+        inflateInit2_((strm), (windowBits), ZLIB_VERSION, \\r
+                      (int)sizeof(z_stream))\r
+#define inflateBackInit(strm, windowBits, window) \\r
+        inflateBackInit_((strm), (windowBits), (window), \\r
+                      ZLIB_VERSION, (int)sizeof(z_stream))\r
+\r
+#ifndef Z_SOLO\r
+\r
+/* gzgetc() macro and its supporting function and exposed data structure.  Note\r
+ * that the real internal state is much larger than the exposed structure.\r
+ * This abbreviated structure exposes just enough for the gzgetc() macro.  The\r
+ * user should not mess with these exposed elements, since their names or\r
+ * behavior could change in the future, perhaps even capriciously.  They can\r
+ * only be used by the gzgetc() macro.  You have been warned.\r
+ */\r
+struct gzFile_s {\r
+    unsigned have;\r
+    unsigned char *next;\r
+    z_off64_t pos;\r
+};\r
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file));  /* backward compatibility */\r
+#ifdef Z_PREFIX_SET\r
+#  undef z_gzgetc\r
+#  define z_gzgetc(g) \\r
+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\r
+#else\r
+#  define gzgetc(g) \\r
+          ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g))\r
+#endif\r
+\r
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or\r
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if\r
+ * both are true, the application gets the *64 functions, and the regular\r
+ * functions are changed to 64 bits) -- in case these are set on systems\r
+ * without large file support, _LFS64_LARGEFILE must also be true\r
+ */\r
+#ifdef Z_LARGE64\r
+   ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\r
+   ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));\r
+   ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));\r
+   ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));\r
+   ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));\r
+   ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));\r
+#endif\r
+\r
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)\r
+#  ifdef Z_PREFIX_SET\r
+#    define z_gzopen z_gzopen64\r
+#    define z_gzseek z_gzseek64\r
+#    define z_gztell z_gztell64\r
+#    define z_gzoffset z_gzoffset64\r
+#    define z_adler32_combine z_adler32_combine64\r
+#    define z_crc32_combine z_crc32_combine64\r
+#  else\r
+#    define gzopen gzopen64\r
+#    define gzseek gzseek64\r
+#    define gztell gztell64\r
+#    define gzoffset gzoffset64\r
+#    define adler32_combine adler32_combine64\r
+#    define crc32_combine crc32_combine64\r
+#  endif\r
+#  ifndef Z_LARGE64\r
+     ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));\r
+     ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));\r
+     ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));\r
+     ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));\r
+     ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));\r
+     ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));\r
+#  endif\r
+#else\r
+   ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));\r
+   ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));\r
+   ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));\r
+   ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));\r
+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\r
+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\r
+#endif\r
+\r
+#else /* Z_SOLO */\r
+\r
+   ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));\r
+   ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));\r
+\r
+#endif /* !Z_SOLO */\r
+\r
+/* hack for buggy compilers */\r
+#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL)\r
+    struct internal_state {int dummy;};\r
+#endif\r
+\r
+/* undocumented functions */\r
+ZEXTERN const char   * ZEXPORT zError           OF((int));\r
+ZEXTERN int            ZEXPORT inflateSyncPoint OF((z_streamp));\r
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table    OF((void));\r
+ZEXTERN int            ZEXPORT inflateUndermine OF((z_streamp, int));\r
+ZEXTERN int            ZEXPORT inflateResetKeep OF((z_streamp));\r
+ZEXTERN int            ZEXPORT deflateResetKeep OF((z_streamp));\r
+#if defined(_WIN32) && !defined(Z_SOLO)\r
+ZEXTERN gzFile         ZEXPORT gzopen_w OF((const wchar_t *path,\r
+                                            const char *mode));\r
+#endif\r
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)\r
+#  ifndef Z_SOLO\r
+ZEXTERN int            ZEXPORTVA gzvprintf Z_ARG((gzFile file,\r
+                                                  const char *format,\r
+                                                  va_list va));\r
+#  endif\r
+#endif\r
+\r
+#ifdef __cplusplus\r
+}\r
+#endif\r
+\r
+#endif /* ZLIB_H */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.c
new file mode 100644 (file)
index 0000000..0bf0426
--- /dev/null
@@ -0,0 +1,324 @@
+/* zutil.c -- target dependent utility functions for the compression library\r
+ * Copyright (C) 1995-2005, 2010, 2011, 2012 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#include "zutil.h"\r
+#ifndef Z_SOLO\r
+#  include "gzguts.h"\r
+#endif\r
+\r
+#ifndef NO_DUMMY_DECL\r
+struct internal_state      {int dummy;}; /* for buggy compilers */\r
+#endif\r
+\r
+z_const char * const z_errmsg[10] = {\r
+"need dictionary",     /* Z_NEED_DICT       2  */\r
+"stream end",          /* Z_STREAM_END      1  */\r
+"",                    /* Z_OK              0  */\r
+"file error",          /* Z_ERRNO         (-1) */\r
+"stream error",        /* Z_STREAM_ERROR  (-2) */\r
+"data error",          /* Z_DATA_ERROR    (-3) */\r
+"insufficient memory", /* Z_MEM_ERROR     (-4) */\r
+"buffer error",        /* Z_BUF_ERROR     (-5) */\r
+"incompatible version",/* Z_VERSION_ERROR (-6) */\r
+""};\r
+\r
+\r
+const char * ZEXPORT zlibVersion()\r
+{\r
+    return ZLIB_VERSION;\r
+}\r
+\r
+uLong ZEXPORT zlibCompileFlags()\r
+{\r
+    uLong flags;\r
+\r
+    flags = 0;\r
+    switch ((int)(sizeof(uInt))) {\r
+    case 2:     break;\r
+    case 4:     flags += 1;     break;\r
+    case 8:     flags += 2;     break;\r
+    default:    flags += 3;\r
+    }\r
+    switch ((int)(sizeof(uLong))) {\r
+    case 2:     break;\r
+    case 4:     flags += 1 << 2;        break;\r
+    case 8:     flags += 2 << 2;        break;\r
+    default:    flags += 3 << 2;\r
+    }\r
+    switch ((int)(sizeof(voidpf))) {\r
+    case 2:     break;\r
+    case 4:     flags += 1 << 4;        break;\r
+    case 8:     flags += 2 << 4;        break;\r
+    default:    flags += 3 << 4;\r
+    }\r
+    switch ((int)(sizeof(z_off_t))) {\r
+    case 2:     break;\r
+    case 4:     flags += 1 << 6;        break;\r
+    case 8:     flags += 2 << 6;        break;\r
+    default:    flags += 3 << 6;\r
+    }\r
+#ifdef DEBUG\r
+    flags += 1 << 8;\r
+#endif\r
+#if defined(ASMV) || defined(ASMINF)\r
+    flags += 1 << 9;\r
+#endif\r
+#ifdef ZLIB_WINAPI\r
+    flags += 1 << 10;\r
+#endif\r
+#ifdef BUILDFIXED\r
+    flags += 1 << 12;\r
+#endif\r
+#ifdef DYNAMIC_CRC_TABLE\r
+    flags += 1 << 13;\r
+#endif\r
+#ifdef NO_GZCOMPRESS\r
+    flags += 1L << 16;\r
+#endif\r
+#ifdef NO_GZIP\r
+    flags += 1L << 17;\r
+#endif\r
+#ifdef PKZIP_BUG_WORKAROUND\r
+    flags += 1L << 20;\r
+#endif\r
+#ifdef FASTEST\r
+    flags += 1L << 21;\r
+#endif\r
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)\r
+#  ifdef NO_vsnprintf\r
+    flags += 1L << 25;\r
+#    ifdef HAS_vsprintf_void\r
+    flags += 1L << 26;\r
+#    endif\r
+#  else\r
+#    ifdef HAS_vsnprintf_void\r
+    flags += 1L << 26;\r
+#    endif\r
+#  endif\r
+#else\r
+    flags += 1L << 24;\r
+#  ifdef NO_snprintf\r
+    flags += 1L << 25;\r
+#    ifdef HAS_sprintf_void\r
+    flags += 1L << 26;\r
+#    endif\r
+#  else\r
+#    ifdef HAS_snprintf_void\r
+    flags += 1L << 26;\r
+#    endif\r
+#  endif\r
+#endif\r
+    return flags;\r
+}\r
+\r
+#ifdef DEBUG\r
+\r
+#  ifndef verbose\r
+#    define verbose 0\r
+#  endif\r
+int ZLIB_INTERNAL z_verbose = verbose;\r
+\r
+void ZLIB_INTERNAL z_error (m)\r
+    char *m;\r
+{\r
+    fprintf(stderr, "%s\n", m);\r
+    exit(1);\r
+}\r
+#endif\r
+\r
+/* exported to allow conversion of error code to string for compress() and\r
+ * uncompress()\r
+ */\r
+const char * ZEXPORT zError(err)\r
+    int err;\r
+{\r
+    return ERR_MSG(err);\r
+}\r
+\r
+#if defined(_WIN32_WCE)\r
+    /* The Microsoft C Run-Time Library for Windows CE doesn't have\r
+     * errno.  We define it as a global variable to simplify porting.\r
+     * Its value is always 0 and should not be used.\r
+     */\r
+    int errno = 0;\r
+#endif\r
+\r
+#ifndef HAVE_MEMCPY\r
+\r
+void ZLIB_INTERNAL zmemcpy(dest, source, len)\r
+    Bytef* dest;\r
+    const Bytef* source;\r
+    uInt  len;\r
+{\r
+    if (len == 0) return;\r
+    do {\r
+        *dest++ = *source++; /* ??? to be unrolled */\r
+    } while (--len != 0);\r
+}\r
+\r
+int ZLIB_INTERNAL zmemcmp(s1, s2, len)\r
+    const Bytef* s1;\r
+    const Bytef* s2;\r
+    uInt  len;\r
+{\r
+    uInt j;\r
+\r
+    for (j = 0; j < len; j++) {\r
+        if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;\r
+    }\r
+    return 0;\r
+}\r
+\r
+void ZLIB_INTERNAL zmemzero(dest, len)\r
+    Bytef* dest;\r
+    uInt  len;\r
+{\r
+    if (len == 0) return;\r
+    do {\r
+        *dest++ = 0;  /* ??? to be unrolled */\r
+    } while (--len != 0);\r
+}\r
+#endif\r
+\r
+#ifndef Z_SOLO\r
+\r
+#ifdef SYS16BIT\r
+\r
+#ifdef __TURBOC__\r
+/* Turbo C in 16-bit mode */\r
+\r
+#  define MY_ZCALLOC\r
+\r
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes\r
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we\r
+ * must fix the pointer. Warning: the pointer must be put back to its\r
+ * original form in order to free it, use zcfree().\r
+ */\r
+\r
+#define MAX_PTR 10\r
+/* 10*64K = 640K */\r
+\r
+local int next_ptr = 0;\r
+\r
+typedef struct ptr_table_s {\r
+    voidpf org_ptr;\r
+    voidpf new_ptr;\r
+} ptr_table;\r
+\r
+local ptr_table table[MAX_PTR];\r
+/* This table is used to remember the original form of pointers\r
+ * to large buffers (64K). Such pointers are normalized with a zero offset.\r
+ * Since MSDOS is not a preemptive multitasking OS, this table is not\r
+ * protected from concurrent access. This hack doesn't work anyway on\r
+ * a protected system like OS/2. Use Microsoft C instead.\r
+ */\r
+\r
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)\r
+{\r
+    voidpf buf = opaque; /* just to make some compilers happy */\r
+    ulg bsize = (ulg)items*size;\r
+\r
+    /* If we allocate less than 65520 bytes, we assume that farmalloc\r
+     * will return a usable pointer which doesn't have to be normalized.\r
+     */\r
+    if (bsize < 65520L) {\r
+        buf = farmalloc(bsize);\r
+        if (*(ush*)&buf != 0) return buf;\r
+    } else {\r
+        buf = farmalloc(bsize + 16L);\r
+    }\r
+    if (buf == NULL || next_ptr >= MAX_PTR) return NULL;\r
+    table[next_ptr].org_ptr = buf;\r
+\r
+    /* Normalize the pointer to seg:0 */\r
+    *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;\r
+    *(ush*)&buf = 0;\r
+    table[next_ptr++].new_ptr = buf;\r
+    return buf;\r
+}\r
+\r
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)\r
+{\r
+    int n;\r
+    if (*(ush*)&ptr != 0) { /* object < 64K */\r
+        farfree(ptr);\r
+        return;\r
+    }\r
+    /* Find the original pointer */\r
+    for (n = 0; n < next_ptr; n++) {\r
+        if (ptr != table[n].new_ptr) continue;\r
+\r
+        farfree(table[n].org_ptr);\r
+        while (++n < next_ptr) {\r
+            table[n-1] = table[n];\r
+        }\r
+        next_ptr--;\r
+        return;\r
+    }\r
+    ptr = opaque; /* just to make some compilers happy */\r
+    Assert(0, "zcfree: ptr not found");\r
+}\r
+\r
+#endif /* __TURBOC__ */\r
+\r
+\r
+#ifdef M_I86\r
+/* Microsoft C in 16-bit mode */\r
+\r
+#  define MY_ZCALLOC\r
+\r
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))\r
+#  define _halloc  halloc\r
+#  define _hfree   hfree\r
+#endif\r
+\r
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)\r
+{\r
+    if (opaque) opaque = 0; /* to make compiler happy */\r
+    return _halloc((long)items, size);\r
+}\r
+\r
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)\r
+{\r
+    if (opaque) opaque = 0; /* to make compiler happy */\r
+    _hfree(ptr);\r
+}\r
+\r
+#endif /* M_I86 */\r
+\r
+#endif /* SYS16BIT */\r
+\r
+\r
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */\r
+\r
+#ifndef STDC\r
+extern voidp  malloc OF((uInt size));\r
+extern voidp  calloc OF((uInt items, uInt size));\r
+extern void   free   OF((voidpf ptr));\r
+#endif\r
+\r
+voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)\r
+    voidpf opaque;\r
+    unsigned items;\r
+    unsigned size;\r
+{\r
+    if (opaque) items += size - size; /* make compiler happy */\r
+    return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :\r
+                              (voidpf)calloc(items, size);\r
+}\r
+\r
+void ZLIB_INTERNAL zcfree (opaque, ptr)\r
+    voidpf opaque;\r
+    voidpf ptr;\r
+{\r
+    free(ptr);\r
+    if (opaque) return; /* make compiler happy */\r
+}\r
+\r
+#endif /* MY_ZCALLOC */\r
+\r
+#endif /* !Z_SOLO */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.h b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlib/zutil.h
new file mode 100644 (file)
index 0000000..f4e4d05
--- /dev/null
@@ -0,0 +1,253 @@
+/* zutil.h -- internal interface and configuration of the compression library\r
+ * Copyright (C) 1995-2013 Jean-loup Gailly.\r
+ * For conditions of distribution and use, see copyright notice in zlib.h\r
+ */\r
+\r
+/* WARNING: this file should *not* be used by applications. It is\r
+   part of the implementation of the compression library and is\r
+   subject to change. Applications should only use zlib.h.\r
+ */\r
+\r
+/* @(#) $Id$ */\r
+\r
+#ifndef ZUTIL_H\r
+#define ZUTIL_H\r
+\r
+#ifdef HAVE_HIDDEN\r
+#  define ZLIB_INTERNAL __attribute__((visibility ("hidden")))\r
+#else\r
+#  define ZLIB_INTERNAL\r
+#endif\r
+\r
+#include "zlib.h"\r
+\r
+#if defined(STDC) && !defined(Z_SOLO)\r
+#  if !(defined(_WIN32_WCE) && defined(_MSC_VER))\r
+#    include <stddef.h>\r
+#  endif\r
+#  include <string.h>\r
+#  include <stdlib.h>\r
+#endif\r
+\r
+#ifdef Z_SOLO\r
+   typedef long ptrdiff_t;  /* guess -- will be caught if guess is wrong */\r
+#endif\r
+\r
+#ifndef local\r
+#  define local static\r
+#endif\r
+/* compile with -Dlocal if your debugger can't find static symbols */\r
+\r
+typedef unsigned char  uch;\r
+typedef uch FAR uchf;\r
+typedef unsigned short ush;\r
+typedef ush FAR ushf;\r
+typedef unsigned long  ulg;\r
+\r
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */\r
+/* (size given to avoid silly warnings with Visual C++) */\r
+\r
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]\r
+\r
+#define ERR_RETURN(strm,err) \\r
+  return (strm->msg = ERR_MSG(err), (err))\r
+/* To be used only when the state is known to be valid */\r
+\r
+        /* common constants */\r
+\r
+#ifndef DEF_WBITS\r
+#  define DEF_WBITS MAX_WBITS\r
+#endif\r
+/* default windowBits for decompression. MAX_WBITS is for compression only */\r
+\r
+#if MAX_MEM_LEVEL >= 8\r
+#  define DEF_MEM_LEVEL 8\r
+#else\r
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\r
+#endif\r
+/* default memLevel */\r
+\r
+#define STORED_BLOCK 0\r
+#define STATIC_TREES 1\r
+#define DYN_TREES    2\r
+/* The three kinds of block type */\r
+\r
+#define MIN_MATCH  3\r
+#define MAX_MATCH  258\r
+/* The minimum and maximum match lengths */\r
+\r
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */\r
+\r
+        /* target dependencies */\r
+\r
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))\r
+#  define OS_CODE  0x00\r
+#  ifndef Z_SOLO\r
+#    if defined(__TURBOC__) || defined(__BORLANDC__)\r
+#      if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))\r
+         /* Allow compilation with ANSI keywords only enabled */\r
+         void _Cdecl farfree( void *block );\r
+         void *_Cdecl farmalloc( unsigned long nbytes );\r
+#      else\r
+#        include <alloc.h>\r
+#      endif\r
+#    else /* MSC or DJGPP */\r
+#      include <malloc.h>\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#ifdef AMIGA\r
+#  define OS_CODE  0x01\r
+#endif\r
+\r
+#if defined(VAXC) || defined(VMS)\r
+#  define OS_CODE  0x02\r
+#  define F_OPEN(name, mode) \\r
+     fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")\r
+#endif\r
+\r
+#if defined(ATARI) || defined(atarist)\r
+#  define OS_CODE  0x05\r
+#endif\r
+\r
+#ifdef OS2\r
+#  define OS_CODE  0x06\r
+#  if defined(M_I86) && !defined(Z_SOLO)\r
+#    include <malloc.h>\r
+#  endif\r
+#endif\r
+\r
+#if defined(MACOS) || defined(TARGET_OS_MAC)\r
+#  define OS_CODE  0x07\r
+#  ifndef Z_SOLO\r
+#    if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os\r
+#      include <unix.h> /* for fdopen */\r
+#    else\r
+#      ifndef fdopen\r
+#        define fdopen(fd,mode) NULL /* No fdopen() */\r
+#      endif\r
+#    endif\r
+#  endif\r
+#endif\r
+\r
+#ifdef TOPS20\r
+#  define OS_CODE  0x0a\r
+#endif\r
+\r
+#ifdef WIN32\r
+#  ifndef __CYGWIN__  /* Cygwin is Unix, not Win32 */\r
+#    define OS_CODE  0x0b\r
+#  endif\r
+#endif\r
+\r
+#ifdef __50SERIES /* Prime/PRIMOS */\r
+#  define OS_CODE  0x0f\r
+#endif\r
+\r
+#if defined(_BEOS_) || defined(RISCOS)\r
+#  define fdopen(fd,mode) NULL /* No fdopen() */\r
+#endif\r
+\r
+#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX\r
+#  if defined(_WIN32_WCE)\r
+#    define fdopen(fd,mode) NULL /* No fdopen() */\r
+#    ifndef _PTRDIFF_T_DEFINED\r
+       typedef int ptrdiff_t;\r
+#      define _PTRDIFF_T_DEFINED\r
+#    endif\r
+#  else\r
+#    define fdopen(fd,type)  _fdopen(fd,type)\r
+#  endif\r
+#endif\r
+\r
+#if defined(__BORLANDC__) && !defined(MSDOS)\r
+  #pragma warn -8004\r
+  #pragma warn -8008\r
+  #pragma warn -8066\r
+#endif\r
+\r
+/* provide prototypes for these when building zlib without LFS */\r
+#if !defined(_WIN32) && \\r
+    (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)\r
+    ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));\r
+    ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));\r
+#endif\r
+\r
+        /* common defaults */\r
+\r
+#ifndef OS_CODE\r
+#  define OS_CODE  0x03  /* assume Unix */\r
+#endif\r
+\r
+#ifndef F_OPEN\r
+#  define F_OPEN(name, mode) fopen((name), (mode))\r
+#endif\r
+\r
+         /* functions */\r
+\r
+#if defined(pyr) || defined(Z_SOLO)\r
+#  define NO_MEMCPY\r
+#endif\r
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)\r
+ /* Use our own functions for small and medium model with MSC <= 5.0.\r
+  * You may have to use the same strategy for Borland C (untested).\r
+  * The __SC__ check is for Symantec.\r
+  */\r
+#  define NO_MEMCPY\r
+#endif\r
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)\r
+#  define HAVE_MEMCPY\r
+#endif\r
+#ifdef HAVE_MEMCPY\r
+#  ifdef SMALL_MEDIUM /* MSDOS small or medium model */\r
+#    define zmemcpy _fmemcpy\r
+#    define zmemcmp _fmemcmp\r
+#    define zmemzero(dest, len) _fmemset(dest, 0, len)\r
+#  else\r
+#    define zmemcpy memcpy\r
+#    define zmemcmp memcmp\r
+#    define zmemzero(dest, len) memset(dest, 0, len)\r
+#  endif\r
+#else\r
+   void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));\r
+   int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));\r
+   void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));\r
+#endif\r
+\r
+/* Diagnostic functions */\r
+#ifdef DEBUG\r
+#  include <stdio.h>\r
+   extern int ZLIB_INTERNAL z_verbose;\r
+   extern void ZLIB_INTERNAL z_error OF((char *m));\r
+#  define Assert(cond,msg) {if(!(cond)) z_error(msg);}\r
+#  define Trace(x) {if (z_verbose>=0) fprintf x ;}\r
+#  define Tracev(x) {if (z_verbose>0) fprintf x ;}\r
+#  define Tracevv(x) {if (z_verbose>1) fprintf x ;}\r
+#  define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}\r
+#  define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}\r
+#else\r
+#  define Assert(cond,msg)\r
+#  define Trace(x)\r
+#  define Tracev(x)\r
+#  define Tracevv(x)\r
+#  define Tracec(c,x)\r
+#  define Tracecv(c,x)\r
+#endif\r
+\r
+#ifndef Z_SOLO\r
+   voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,\r
+                                    unsigned size));\r
+   void ZLIB_INTERNAL zcfree  OF((voidpf opaque, voidpf ptr));\r
+#endif\r
+\r
+#define ZALLOC(strm, items, size) \\r
+           (*((strm)->zalloc))((strm)->opaque, (items), (size))\r
+#define ZFREE(strm, addr)  (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))\r
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}\r
+\r
+/* Reverse the bytes in a 32-bit value */\r
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \\r
+                    (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))\r
+\r
+#endif /* ZUTIL_H */\r
diff --git a/AppPkg/Applications/Python/Python-2.7.10/Modules/zlibmodule.c b/AppPkg/Applications/Python/Python-2.7.10/Modules/zlibmodule.c
new file mode 100644 (file)
index 0000000..e9639ce
--- /dev/null
@@ -0,0 +1,1093 @@
+/* zlibmodule.c -- gzip-compatible data compression */\r
+/* See http://www.gzip.org/zlib/ */\r
+\r
+/* Windows users:  read Python's PCbuild\readme.txt */\r
+\r
+\r
+#include "Python.h"\r
+#include "zlib.h"\r
+\r
+#ifdef WITH_THREAD\r
+#include "pythread.h"\r
+\r
+/* #defs ripped off from _tkinter.c, even though the situation here is much\r
+   simpler, because we don't have to worry about waiting for Tcl\r
+   events!  And, since zlib itself is threadsafe, we don't need to worry\r
+   about re-entering zlib functions.\r
+\r
+   N.B.\r
+\r
+   Since ENTER_ZLIB and LEAVE_ZLIB only need to be called on functions\r
+   that modify the components of preexisting de/compress objects, it\r
+   could prove to be a performance gain on multiprocessor machines if\r
+   there was an de/compress object-specific lock.  However, for the\r
+   moment the ENTER_ZLIB and LEAVE_ZLIB calls are global for ALL\r
+   de/compress objects.\r
+ */\r
+\r
+static PyThread_type_lock zlib_lock = NULL; /* initialized on module load */\r
+\r
+#define ENTER_ZLIB \\r
+        Py_BEGIN_ALLOW_THREADS \\r
+        PyThread_acquire_lock(zlib_lock, 1); \\r
+        Py_END_ALLOW_THREADS\r
+\r
+#define LEAVE_ZLIB \\r
+        PyThread_release_lock(zlib_lock);\r
+\r
+#else\r
+\r
+#define ENTER_ZLIB\r
+#define LEAVE_ZLIB\r
+\r
+#endif\r
+\r
+/* The following parameters are copied from zutil.h, version 0.95 */\r
+#define DEFLATED   8\r
+#if MAX_MEM_LEVEL >= 8\r
+#  define DEF_MEM_LEVEL 8\r
+#else\r
+#  define DEF_MEM_LEVEL  MAX_MEM_LEVEL\r
+#endif\r
+#define DEF_WBITS MAX_WBITS\r
+\r
+/* The output buffer will be increased in chunks of DEFAULTALLOC bytes. */\r
+#define DEFAULTALLOC (16*1024)\r
+#define PyInit_zlib initzlib\r
+\r
+static PyTypeObject Comptype;\r
+static PyTypeObject Decomptype;\r
+\r
+static PyObject *ZlibError;\r
+\r
+typedef struct\r
+{\r
+    PyObject_HEAD\r
+    z_stream zst;\r
+    PyObject *unused_data;\r
+    PyObject *unconsumed_tail;\r
+    int is_initialised;\r
+} compobject;\r
+\r
+static void\r
+zlib_error(z_stream zst, int err, char *msg)\r
+{\r
+    const char *zmsg = Z_NULL;\r
+    /* In case of a version mismatch, zst.msg won't be initialized.\r
+       Check for this case first, before looking at zst.msg. */\r
+    if (err == Z_VERSION_ERROR)\r
+        zmsg = "library version mismatch";\r
+    if (zmsg == Z_NULL)\r
+        zmsg = zst.msg;\r
+    if (zmsg == Z_NULL) {\r
+        switch (err) {\r
+        case Z_BUF_ERROR:\r
+            zmsg = "incomplete or truncated stream";\r
+            break;\r
+        case Z_STREAM_ERROR:\r
+            zmsg = "inconsistent stream state";\r
+            break;\r
+        case Z_DATA_ERROR:\r
+            zmsg = "invalid input data";\r
+            break;\r
+        }\r
+    }\r
+    if (zmsg == Z_NULL)\r
+        PyErr_Format(ZlibError, "Error %d %s", err, msg);\r
+    else\r
+        PyErr_Format(ZlibError, "Error %d %s: %.200s", err, msg, zmsg);\r
+}\r
+\r
+PyDoc_STRVAR(compressobj__doc__,\r
+"compressobj([level]) -- Return a compressor object.\n"\r
+"\n"\r
+"Optional arg level is the compression level, in 0-9.");\r
+\r
+PyDoc_STRVAR(decompressobj__doc__,\r
+"decompressobj([wbits]) -- Return a decompressor object.\n"\r
+"\n"\r
+"Optional arg wbits is the window buffer size.");\r
+\r
+static compobject *\r
+newcompobject(PyTypeObject *type)\r
+{\r
+    compobject *self;\r
+    self = PyObject_New(compobject, type);\r
+    if (self == NULL)\r
+        return NULL;\r
+    self->is_initialised = 0;\r
+    self->unused_data = PyString_FromString("");\r
+    if (self->unused_data == NULL) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    self->unconsumed_tail = PyString_FromString("");\r
+    if (self->unconsumed_tail == NULL) {\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+    return self;\r
+}\r
+\r
+PyDoc_STRVAR(compress__doc__,\r
+"compress(string[, level]) -- Returned compressed string.\n"\r
+"\n"\r
+"Optional arg level is the compression level, in 0-9.");\r
+\r
+static PyObject *\r
+PyZlib_compress(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *ReturnVal = NULL;\r
+    Byte *input, *output;\r
+    int length, level=Z_DEFAULT_COMPRESSION, err;\r
+    z_stream zst;\r
+\r
+    /* require Python string object, optional 'level' arg */\r
+    if (!PyArg_ParseTuple(args, "s#|i:compress", &input, &length, &level))\r
+        return NULL;\r
+\r
+    zst.avail_out = length + length/1000 + 12 + 1;\r
+\r
+    output = (Byte*)malloc(zst.avail_out);\r
+    if (output == NULL) {\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Can't allocate memory to compress data");\r
+        return NULL;\r
+    }\r
+\r
+    /* Past the point of no return.  From here on out, we need to make sure\r
+       we clean up mallocs & INCREFs. */\r
+\r
+    zst.zalloc = (alloc_func)NULL;\r
+    zst.zfree = (free_func)Z_NULL;\r
+    zst.next_out = (Byte *)output;\r
+    zst.next_in = (Byte *)input;\r
+    zst.avail_in = length;\r
+    err = deflateInit(&zst, level);\r
+\r
+    switch(err) {\r
+    case(Z_OK):\r
+        break;\r
+    case(Z_MEM_ERROR):\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Out of memory while compressing data");\r
+        goto error;\r
+    case(Z_STREAM_ERROR):\r
+        PyErr_SetString(ZlibError,\r
+                        "Bad compression level");\r
+        goto error;\r
+    default:\r
+        deflateEnd(&zst);\r
+        zlib_error(zst, err, "while compressing data");\r
+        goto error;\r
+    }\r
+\r
+    Py_BEGIN_ALLOW_THREADS;\r
+    err = deflate(&zst, Z_FINISH);\r
+    Py_END_ALLOW_THREADS;\r
+\r
+    if (err != Z_STREAM_END) {\r
+        zlib_error(zst, err, "while compressing data");\r
+        deflateEnd(&zst);\r
+        goto error;\r
+    }\r
+\r
+    err=deflateEnd(&zst);\r
+    if (err == Z_OK)\r
+        ReturnVal = PyString_FromStringAndSize((char *)output,\r
+                                               zst.total_out);\r
+    else\r
+        zlib_error(zst, err, "while finishing compression");\r
+\r
+ error:\r
+    free(output);\r
+\r
+    return ReturnVal;\r
+}\r
+\r
+PyDoc_STRVAR(decompress__doc__,\r
+"decompress(string[, wbits[, bufsize]]) -- Return decompressed string.\n"\r
+"\n"\r
+"Optional arg wbits is the window buffer size.  Optional arg bufsize is\n"\r
+"the initial output buffer size.");\r
+\r
+static PyObject *\r
+PyZlib_decompress(PyObject *self, PyObject *args)\r
+{\r
+    PyObject *result_str;\r
+    Byte *input;\r
+    int length, err;\r
+    int wsize=DEF_WBITS;\r
+    Py_ssize_t r_strlen=DEFAULTALLOC;\r
+    z_stream zst;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|in:decompress",\r
+                          &input, &length, &wsize, &r_strlen))\r
+        return NULL;\r
+\r
+    if (r_strlen <= 0)\r
+        r_strlen = 1;\r
+\r
+    zst.avail_in = length;\r
+    zst.avail_out = r_strlen;\r
+\r
+    if (!(result_str = PyString_FromStringAndSize(NULL, r_strlen)))\r
+        return NULL;\r
+\r
+    zst.zalloc = (alloc_func)NULL;\r
+    zst.zfree = (free_func)Z_NULL;\r
+    zst.next_out = (Byte *)PyString_AS_STRING(result_str);\r
+    zst.next_in = (Byte *)input;\r
+    err = inflateInit2(&zst, wsize);\r
+\r
+    switch(err) {\r
+    case(Z_OK):\r
+        break;\r
+    case(Z_MEM_ERROR):\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Out of memory while decompressing data");\r
+        goto error;\r
+    default:\r
+        inflateEnd(&zst);\r
+        zlib_error(zst, err, "while preparing to decompress data");\r
+        goto error;\r
+    }\r
+\r
+    do {\r
+        Py_BEGIN_ALLOW_THREADS\r
+        err=inflate(&zst, Z_FINISH);\r
+        Py_END_ALLOW_THREADS\r
+\r
+        switch(err) {\r
+        case(Z_STREAM_END):\r
+            break;\r
+        case(Z_BUF_ERROR):\r
+            /*\r
+             * If there is at least 1 byte of room according to zst.avail_out\r
+             * and we get this error, assume that it means zlib cannot\r
+             * process the inflate call() due to an error in the data.\r
+             */\r
+            if (zst.avail_out > 0) {\r
+                zlib_error(zst, err, "while decompressing data");\r
+                inflateEnd(&zst);\r
+                goto error;\r
+            }\r
+            /* fall through */\r
+        case(Z_OK):\r
+            /* need more memory */\r
+            if (_PyString_Resize(&result_str, r_strlen << 1) < 0) {\r
+                inflateEnd(&zst);\r
+                goto error;\r
+            }\r
+            zst.next_out = (unsigned char *)PyString_AS_STRING(result_str) \\r
+                + r_strlen;\r
+            zst.avail_out = r_strlen;\r
+            r_strlen = r_strlen << 1;\r
+            break;\r
+        default:\r
+            inflateEnd(&zst);\r
+            zlib_error(zst, err, "while decompressing data");\r
+            goto error;\r
+        }\r
+    } while (err != Z_STREAM_END);\r
+\r
+    err = inflateEnd(&zst);\r
+    if (err != Z_OK) {\r
+        zlib_error(zst, err, "while finishing data decompression");\r
+        goto error;\r
+    }\r
+\r
+    _PyString_Resize(&result_str, zst.total_out);\r
+    return result_str;\r
+\r
+ error:\r
+    Py_XDECREF(result_str);\r
+    return NULL;\r
+}\r
+\r
+static PyObject *\r
+PyZlib_compressobj(PyObject *selfptr, PyObject *args)\r
+{\r
+    compobject *self;\r
+    int level=Z_DEFAULT_COMPRESSION, method=DEFLATED;\r
+    int wbits=MAX_WBITS, memLevel=DEF_MEM_LEVEL, strategy=0, err;\r
+\r
+    if (!PyArg_ParseTuple(args, "|iiiii:compressobj", &level, &method, &wbits,\r
+                          &memLevel, &strategy))\r
+        return NULL;\r
+\r
+    self = newcompobject(&Comptype);\r
+    if (self==NULL)\r
+        return(NULL);\r
+    self->zst.zalloc = (alloc_func)NULL;\r
+    self->zst.zfree = (free_func)Z_NULL;\r
+    self->zst.next_in = NULL;\r
+    self->zst.avail_in = 0;\r
+    err = deflateInit2(&self->zst, level, method, wbits, memLevel, strategy);\r
+    switch(err) {\r
+    case (Z_OK):\r
+        self->is_initialised = 1;\r
+        return (PyObject*)self;\r
+    case (Z_MEM_ERROR):\r
+        Py_DECREF(self);\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Can't allocate memory for compression object");\r
+        return NULL;\r
+    case(Z_STREAM_ERROR):\r
+        Py_DECREF(self);\r
+        PyErr_SetString(PyExc_ValueError, "Invalid initialization option");\r
+        return NULL;\r
+    default:\r
+        zlib_error(self->zst, err, "while creating compression object");\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+}\r
+\r
+static PyObject *\r
+PyZlib_decompressobj(PyObject *selfptr, PyObject *args)\r
+{\r
+    int wbits=DEF_WBITS, err;\r
+    compobject *self;\r
+    if (!PyArg_ParseTuple(args, "|i:decompressobj", &wbits))\r
+        return NULL;\r
+\r
+    self = newcompobject(&Decomptype);\r
+    if (self == NULL)\r
+        return(NULL);\r
+    self->zst.zalloc = (alloc_func)NULL;\r
+    self->zst.zfree = (free_func)Z_NULL;\r
+    self->zst.next_in = NULL;\r
+    self->zst.avail_in = 0;\r
+    err = inflateInit2(&self->zst, wbits);\r
+    switch(err) {\r
+    case (Z_OK):\r
+        self->is_initialised = 1;\r
+        return (PyObject*)self;\r
+    case(Z_STREAM_ERROR):\r
+        Py_DECREF(self);\r
+        PyErr_SetString(PyExc_ValueError, "Invalid initialization option");\r
+        return NULL;\r
+    case (Z_MEM_ERROR):\r
+        Py_DECREF(self);\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Can't allocate memory for decompression object");\r
+        return NULL;\r
+    default:\r
+        zlib_error(self->zst, err, "while creating decompression object");\r
+        Py_DECREF(self);\r
+        return NULL;\r
+    }\r
+}\r
+\r
+static void\r
+Comp_dealloc(compobject *self)\r
+{\r
+    if (self->is_initialised)\r
+        deflateEnd(&self->zst);\r
+    Py_XDECREF(self->unused_data);\r
+    Py_XDECREF(self->unconsumed_tail);\r
+    PyObject_Del(self);\r
+}\r
+\r
+static void\r
+Decomp_dealloc(compobject *self)\r
+{\r
+    if (self->is_initialised)\r
+        inflateEnd(&self->zst);\r
+    Py_XDECREF(self->unused_data);\r
+    Py_XDECREF(self->unconsumed_tail);\r
+    PyObject_Del(self);\r
+}\r
+\r
+PyDoc_STRVAR(comp_compress__doc__,\r
+"compress(data) -- Return a string containing data compressed.\n"\r
+"\n"\r
+"After calling this function, some of the input data may still\n"\r
+"be stored in internal buffers for later processing.\n"\r
+"Call the flush() method to clear these buffers.");\r
+\r
+\r
+static PyObject *\r
+PyZlib_objcompress(compobject *self, PyObject *args)\r
+{\r
+    int err, inplen;\r
+    Py_ssize_t length = DEFAULTALLOC;\r
+    PyObject *RetVal;\r
+    Byte *input;\r
+    unsigned long start_total_out;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#:compress", &input, &inplen))\r
+        return NULL;\r
+\r
+    if (!(RetVal = PyString_FromStringAndSize(NULL, length)))\r
+        return NULL;\r
+\r
+    ENTER_ZLIB\r
+\r
+    start_total_out = self->zst.total_out;\r
+    self->zst.avail_in = inplen;\r
+    self->zst.next_in = input;\r
+    self->zst.avail_out = length;\r
+    self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    err = deflate(&(self->zst), Z_NO_FLUSH);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* while Z_OK and the output buffer is full, there might be more output,\r
+       so extend the output buffer and try again */\r
+    while (err == Z_OK && self->zst.avail_out == 0) {\r
+        if (_PyString_Resize(&RetVal, length << 1) < 0)\r
+            goto error;\r
+        self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \\r
+            + length;\r
+        self->zst.avail_out = length;\r
+        length = length << 1;\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        err = deflate(&(self->zst), Z_NO_FLUSH);\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+    /* We will only get Z_BUF_ERROR if the output buffer was full but\r
+       there wasn't more output when we tried again, so it is not an error\r
+       condition.\r
+    */\r
+\r
+    if (err != Z_OK && err != Z_BUF_ERROR) {\r
+        zlib_error(self->zst, err, "while compressing");\r
+        Py_DECREF(RetVal);\r
+        RetVal = NULL;\r
+        goto error;\r
+    }\r
+    _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);\r
+\r
+ error:\r
+    LEAVE_ZLIB\r
+    return RetVal;\r
+}\r
+\r
+/* Helper for objdecompress() and unflush(). Saves any unconsumed input data in\r
+   self->unused_data or self->unconsumed_tail, as appropriate. */\r
+static int\r
+save_unconsumed_input(compobject *self, int err)\r
+{\r
+    if (err == Z_STREAM_END) {\r
+        /* The end of the compressed data has been reached. Store the leftover\r
+           input data in self->unused_data. */\r
+        if (self->zst.avail_in > 0) {\r
+            Py_ssize_t old_size = PyString_GET_SIZE(self->unused_data);\r
+            Py_ssize_t new_size;\r
+            PyObject *new_data;\r
+            if (self->zst.avail_in > PY_SSIZE_T_MAX - old_size) {\r
+                PyErr_NoMemory();\r
+                return -1;\r
+            }\r
+            new_size = old_size + self->zst.avail_in;\r
+            new_data = PyString_FromStringAndSize(NULL, new_size);\r
+            if (new_data == NULL)\r
+                return -1;\r
+            Py_MEMCPY(PyString_AS_STRING(new_data),\r
+                      PyString_AS_STRING(self->unused_data), old_size);\r
+            Py_MEMCPY(PyString_AS_STRING(new_data) + old_size,\r
+                      self->zst.next_in, self->zst.avail_in);\r
+            Py_DECREF(self->unused_data);\r
+            self->unused_data = new_data;\r
+            self->zst.avail_in = 0;\r
+        }\r
+    }\r
+    if (self->zst.avail_in > 0 || PyString_GET_SIZE(self->unconsumed_tail)) {\r
+        /* This code handles two distinct cases:\r
+           1. Output limit was reached. Save leftover input in unconsumed_tail.\r
+           2. All input data was consumed. Clear unconsumed_tail. */\r
+        PyObject *new_data = PyString_FromStringAndSize(\r
+                (char *)self->zst.next_in, self->zst.avail_in);\r
+        if (new_data == NULL)\r
+            return -1;\r
+        Py_DECREF(self->unconsumed_tail);\r
+        self->unconsumed_tail = new_data;\r
+    }\r
+    return 0;\r
+}\r
+\r
+PyDoc_STRVAR(decomp_decompress__doc__,\r
+"decompress(data, max_length) -- Return a string containing the decompressed\n"\r
+"version of the data.\n"\r
+"\n"\r
+"After calling this function, some of the input data may still be stored in\n"\r
+"internal buffers for later processing.\n"\r
+"Call the flush() method to clear these buffers.\n"\r
+"If the max_length parameter is specified then the return value will be\n"\r
+"no longer than max_length.  Unconsumed input data will be stored in\n"\r
+"the unconsumed_tail attribute.");\r
+\r
+static PyObject *\r
+PyZlib_objdecompress(compobject *self, PyObject *args)\r
+{\r
+    int err, inplen, max_length = 0;\r
+    Py_ssize_t old_length, length = DEFAULTALLOC;\r
+    PyObject *RetVal;\r
+    Byte *input;\r
+    unsigned long start_total_out;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|i:decompress", &input,\r
+                          &inplen, &max_length))\r
+        return NULL;\r
+    if (max_length < 0) {\r
+        PyErr_SetString(PyExc_ValueError,\r
+                        "max_length must be greater than zero");\r
+        return NULL;\r
+    }\r
+\r
+    /* limit amount of data allocated to max_length */\r
+    if (max_length && length > max_length)\r
+        length = max_length;\r
+    if (!(RetVal = PyString_FromStringAndSize(NULL, length)))\r
+        return NULL;\r
+\r
+    ENTER_ZLIB\r
+\r
+    start_total_out = self->zst.total_out;\r
+    self->zst.avail_in = inplen;\r
+    self->zst.next_in = input;\r
+    self->zst.avail_out = length;\r
+    self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    err = inflate(&(self->zst), Z_SYNC_FLUSH);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* While Z_OK and the output buffer is full, there might be more output.\r
+       So extend the output buffer and try again.\r
+    */\r
+    while (err == Z_OK && self->zst.avail_out == 0) {\r
+        /* If max_length set, don't continue decompressing if we've already\r
+           reached the limit.\r
+        */\r
+        if (max_length && length >= max_length)\r
+            break;\r
+\r
+        /* otherwise, ... */\r
+        old_length = length;\r
+        length = length << 1;\r
+        if (max_length && length > max_length)\r
+            length = max_length;\r
+\r
+        if (_PyString_Resize(&RetVal, length) < 0)\r
+            goto error;\r
+        self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \\r
+            + old_length;\r
+        self->zst.avail_out = length - old_length;\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        err = inflate(&(self->zst), Z_SYNC_FLUSH);\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+\r
+    if (save_unconsumed_input(self, err) < 0) {\r
+        Py_DECREF(RetVal);\r
+        RetVal = NULL;\r
+        goto error;\r
+    }\r
+\r
+    /* This is the logical place to call inflateEnd, but the old behaviour of\r
+       only calling it on flush() is preserved. */\r
+\r
+    if (err != Z_STREAM_END && err != Z_OK && err != Z_BUF_ERROR) {\r
+        /* We will only get Z_BUF_ERROR if the output buffer was full\r
+           but there wasn't more output when we tried again, so it is\r
+           not an error condition.\r
+        */\r
+        zlib_error(self->zst, err, "while decompressing");\r
+        Py_DECREF(RetVal);\r
+        RetVal = NULL;\r
+        goto error;\r
+    }\r
+\r
+    _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);\r
+\r
+ error:\r
+    LEAVE_ZLIB\r
+\r
+    return RetVal;\r
+}\r
+\r
+PyDoc_STRVAR(comp_flush__doc__,\r
+"flush( [mode] ) -- Return a string containing any remaining compressed data.\n"\r
+"\n"\r
+"mode can be one of the constants Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH; the\n"\r
+"default value used when mode is not specified is Z_FINISH.\n"\r
+"If mode == Z_FINISH, the compressor object can no longer be used after\n"\r
+"calling the flush() method.  Otherwise, more data can still be compressed.");\r
+\r
+static PyObject *\r
+PyZlib_flush(compobject *self, PyObject *args)\r
+{\r
+    int err, length = DEFAULTALLOC;\r
+    PyObject *RetVal;\r
+    int flushmode = Z_FINISH;\r
+    unsigned long start_total_out;\r
+\r
+    if (!PyArg_ParseTuple(args, "|i:flush", &flushmode))\r
+        return NULL;\r
+\r
+    /* Flushing with Z_NO_FLUSH is a no-op, so there's no point in\r
+       doing any work at all; just return an empty string. */\r
+    if (flushmode == Z_NO_FLUSH) {\r
+        return PyString_FromStringAndSize(NULL, 0);\r
+    }\r
+\r
+    if (!(RetVal = PyString_FromStringAndSize(NULL, length)))\r
+        return NULL;\r
+\r
+    ENTER_ZLIB\r
+\r
+    start_total_out = self->zst.total_out;\r
+    self->zst.avail_in = 0;\r
+    self->zst.avail_out = length;\r
+    self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal);\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    err = deflate(&(self->zst), flushmode);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* while Z_OK and the output buffer is full, there might be more output,\r
+       so extend the output buffer and try again */\r
+    while (err == Z_OK && self->zst.avail_out == 0) {\r
+        if (_PyString_Resize(&RetVal, length << 1) < 0)\r
+            goto error;\r
+        self->zst.next_out = (unsigned char *)PyString_AS_STRING(RetVal) \\r
+            + length;\r
+        self->zst.avail_out = length;\r
+        length = length << 1;\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        err = deflate(&(self->zst), flushmode);\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+\r
+    /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free\r
+       various data structures. Note we should only get Z_STREAM_END when\r
+       flushmode is Z_FINISH, but checking both for safety*/\r
+    if (err == Z_STREAM_END && flushmode == Z_FINISH) {\r
+        err = deflateEnd(&(self->zst));\r
+        if (err != Z_OK) {\r
+            zlib_error(self->zst, err, "from deflateEnd()");\r
+            Py_DECREF(RetVal);\r
+            RetVal = NULL;\r
+            goto error;\r
+        }\r
+        else\r
+            self->is_initialised = 0;\r
+\r
+        /* We will only get Z_BUF_ERROR if the output buffer was full\r
+           but there wasn't more output when we tried again, so it is\r
+           not an error condition.\r
+        */\r
+    } else if (err!=Z_OK && err!=Z_BUF_ERROR) {\r
+        zlib_error(self->zst, err, "while flushing");\r
+        Py_DECREF(RetVal);\r
+        RetVal = NULL;\r
+        goto error;\r
+    }\r
+\r
+    _PyString_Resize(&RetVal, self->zst.total_out - start_total_out);\r
+\r
+ error:\r
+    LEAVE_ZLIB\r
+\r
+    return RetVal;\r
+}\r
+\r
+#ifdef HAVE_ZLIB_COPY\r
+PyDoc_STRVAR(comp_copy__doc__,\r
+"copy() -- Return a copy of the compression object.");\r
+\r
+static PyObject *\r
+PyZlib_copy(compobject *self)\r
+{\r
+    compobject *retval = NULL;\r
+    int err;\r
+\r
+    retval = newcompobject(&Comptype);\r
+    if (!retval) return NULL;\r
+\r
+    /* Copy the zstream state\r
+     * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe\r
+     */\r
+    ENTER_ZLIB\r
+    err = deflateCopy(&retval->zst, &self->zst);\r
+    switch(err) {\r
+    case(Z_OK):\r
+        break;\r
+    case(Z_STREAM_ERROR):\r
+        PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");\r
+        goto error;\r
+    case(Z_MEM_ERROR):\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Can't allocate memory for compression object");\r
+        goto error;\r
+    default:\r
+        zlib_error(self->zst, err, "while copying compression object");\r
+        goto error;\r
+    }\r
+\r
+    Py_INCREF(self->unused_data);\r
+    Py_INCREF(self->unconsumed_tail);\r
+    Py_XDECREF(retval->unused_data);\r
+    Py_XDECREF(retval->unconsumed_tail);\r
+    retval->unused_data = self->unused_data;\r
+    retval->unconsumed_tail = self->unconsumed_tail;\r
+\r
+    /* Mark it as being initialized */\r
+    retval->is_initialised = 1;\r
+\r
+    LEAVE_ZLIB\r
+    return (PyObject *)retval;\r
+\r
+error:\r
+    LEAVE_ZLIB\r
+    Py_XDECREF(retval);\r
+    return NULL;\r
+}\r
+\r
+PyDoc_STRVAR(decomp_copy__doc__,\r
+"copy() -- Return a copy of the decompression object.");\r
+\r
+static PyObject *\r
+PyZlib_uncopy(compobject *self)\r
+{\r
+    compobject *retval = NULL;\r
+    int err;\r
+\r
+    retval = newcompobject(&Decomptype);\r
+    if (!retval) return NULL;\r
+\r
+    /* Copy the zstream state\r
+     * We use ENTER_ZLIB / LEAVE_ZLIB to make this thread-safe\r
+     */\r
+    ENTER_ZLIB\r
+    err = inflateCopy(&retval->zst, &self->zst);\r
+    switch(err) {\r
+    case(Z_OK):\r
+        break;\r
+    case(Z_STREAM_ERROR):\r
+        PyErr_SetString(PyExc_ValueError, "Inconsistent stream state");\r
+        goto error;\r
+    case(Z_MEM_ERROR):\r
+        PyErr_SetString(PyExc_MemoryError,\r
+                        "Can't allocate memory for decompression object");\r
+        goto error;\r
+    default:\r
+        zlib_error(self->zst, err, "while copying decompression object");\r
+        goto error;\r
+    }\r
+\r
+    Py_INCREF(self->unused_data);\r
+    Py_INCREF(self->unconsumed_tail);\r
+    Py_XDECREF(retval->unused_data);\r
+    Py_XDECREF(retval->unconsumed_tail);\r
+    retval->unused_data = self->unused_data;\r
+    retval->unconsumed_tail = self->unconsumed_tail;\r
+\r
+    /* Mark it as being initialized */\r
+    retval->is_initialised = 1;\r
+\r
+    LEAVE_ZLIB\r
+    return (PyObject *)retval;\r
+\r
+error:\r
+    LEAVE_ZLIB\r
+    Py_XDECREF(retval);\r
+    return NULL;\r
+}\r
+#endif\r
+\r
+PyDoc_STRVAR(decomp_flush__doc__,\r
+"flush( [length] ) -- Return a string containing any remaining\n"\r
+"decompressed data. length, if given, is the initial size of the\n"\r
+"output buffer.\n"\r
+"\n"\r
+"The decompressor object can no longer be used after this call.");\r
+\r
+static PyObject *\r
+PyZlib_unflush(compobject *self, PyObject *args)\r
+{\r
+    int err, length = DEFAULTALLOC;\r
+    PyObject * retval = NULL;\r
+    unsigned long start_total_out;\r
+\r
+    if (!PyArg_ParseTuple(args, "|i:flush", &length))\r
+        return NULL;\r
+    if (length <= 0) {\r
+        PyErr_SetString(PyExc_ValueError, "length must be greater than zero");\r
+        return NULL;\r
+    }\r
+    if (!(retval = PyString_FromStringAndSize(NULL, length)))\r
+        return NULL;\r
+\r
+\r
+    ENTER_ZLIB\r
+\r
+    start_total_out = self->zst.total_out;\r
+    self->zst.avail_in = PyString_GET_SIZE(self->unconsumed_tail);\r
+    self->zst.next_in = (Byte *)PyString_AS_STRING(self->unconsumed_tail);\r
+    self->zst.avail_out = length;\r
+    self->zst.next_out = (Byte *)PyString_AS_STRING(retval);\r
+\r
+    Py_BEGIN_ALLOW_THREADS\r
+    err = inflate(&(self->zst), Z_FINISH);\r
+    Py_END_ALLOW_THREADS\r
+\r
+    /* while Z_OK and the output buffer is full, there might be more output,\r
+       so extend the output buffer and try again */\r
+    while ((err == Z_OK || err == Z_BUF_ERROR) && self->zst.avail_out == 0) {\r
+        if (_PyString_Resize(&retval, length << 1) < 0)\r
+            goto error;\r
+        self->zst.next_out = (Byte *)PyString_AS_STRING(retval) + length;\r
+        self->zst.avail_out = length;\r
+        length = length << 1;\r
+\r
+        Py_BEGIN_ALLOW_THREADS\r
+        err = inflate(&(self->zst), Z_FINISH);\r
+        Py_END_ALLOW_THREADS\r
+    }\r
+\r
+    if (save_unconsumed_input(self, err) < 0) {\r
+        Py_DECREF(retval);\r
+        retval = NULL;\r
+        goto error;\r
+    }\r
+\r
+    /* If flushmode is Z_FINISH, we also have to call deflateEnd() to free\r
+       various data structures. Note we should only get Z_STREAM_END when\r
+       flushmode is Z_FINISH */\r
+    if (err == Z_STREAM_END) {\r
+        err = inflateEnd(&(self->zst));\r
+        self->is_initialised = 0;\r
+        if (err != Z_OK) {\r
+            zlib_error(self->zst, err, "from inflateEnd()");\r
+            Py_DECREF(retval);\r
+            retval = NULL;\r
+            goto error;\r
+        }\r
+    }\r
+\r
+    _PyString_Resize(&retval, self->zst.total_out - start_total_out);\r
+\r
+error:\r
+\r
+    LEAVE_ZLIB\r
+\r
+    return retval;\r
+}\r
+\r
+static PyMethodDef comp_methods[] =\r
+{\r
+    {"compress", (binaryfunc)PyZlib_objcompress, METH_VARARGS,\r
+                 comp_compress__doc__},\r
+    {"flush", (binaryfunc)PyZlib_flush, METH_VARARGS,\r
+              comp_flush__doc__},\r
+#ifdef HAVE_ZLIB_COPY\r
+    {"copy",  (PyCFunction)PyZlib_copy, METH_NOARGS,\r
+              comp_copy__doc__},\r
+#endif\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyMethodDef Decomp_methods[] =\r
+{\r
+    {"decompress", (binaryfunc)PyZlib_objdecompress, METH_VARARGS,\r
+                   decomp_decompress__doc__},\r
+    {"flush", (binaryfunc)PyZlib_unflush, METH_VARARGS,\r
+              decomp_flush__doc__},\r
+#ifdef HAVE_ZLIB_COPY\r
+    {"copy",  (PyCFunction)PyZlib_uncopy, METH_NOARGS,\r
+              decomp_copy__doc__},\r
+#endif\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyObject *\r
+Comp_getattr(compobject *self, char *name)\r
+{\r
+  /* No ENTER/LEAVE_ZLIB is necessary because this fn doesn't touch\r
+     internal data. */\r
+\r
+  return Py_FindMethod(comp_methods, (PyObject *)self, name);\r
+}\r
+\r
+static PyObject *\r
+Decomp_getattr(compobject *self, char *name)\r
+{\r
+    PyObject * retval;\r
+\r
+    ENTER_ZLIB\r
+\r
+    if (strcmp(name, "unused_data") == 0) {\r
+        Py_INCREF(self->unused_data);\r
+        retval = self->unused_data;\r
+    } else if (strcmp(name, "unconsumed_tail") == 0) {\r
+        Py_INCREF(self->unconsumed_tail);\r
+        retval = self->unconsumed_tail;\r
+    } else\r
+        retval = Py_FindMethod(Decomp_methods, (PyObject *)self, name);\r
+\r
+    LEAVE_ZLIB\r
+\r
+    return retval;\r
+}\r
+\r
+PyDoc_STRVAR(adler32__doc__,\r
+"adler32(string[, start]) -- Compute an Adler-32 checksum of string.\n"\r
+"\n"\r
+"An optional starting value can be specified.  The returned checksum is\n"\r
+"a signed integer.");\r
+\r
+static PyObject *\r
+PyZlib_adler32(PyObject *self, PyObject *args)\r
+{\r
+    unsigned int adler32val = 1;  /* adler32(0L, Z_NULL, 0) */\r
+    Byte *buf;\r
+    int len, signed_val;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|I:adler32", &buf, &len, &adler32val))\r
+        return NULL;\r
+    /* In Python 2.x we return a signed integer regardless of native platform\r
+     * long size (the 32bit unsigned long is treated as 32-bit signed and sign\r
+     * extended into a 64-bit long inside the integer object).  3.0 does the\r
+     * right thing and returns unsigned. http://bugs.python.org/issue1202 */\r
+    signed_val = adler32(adler32val, buf, len);\r
+    return PyInt_FromLong(signed_val);\r
+}\r
+\r
+PyDoc_STRVAR(crc32__doc__,\r
+"crc32(string[, start]) -- Compute a CRC-32 checksum of string.\n"\r
+"\n"\r
+"An optional starting value can be specified.  The returned checksum is\n"\r
+"a signed integer.");\r
+\r
+static PyObject *\r
+PyZlib_crc32(PyObject *self, PyObject *args)\r
+{\r
+    unsigned int crc32val = 0;  /* crc32(0L, Z_NULL, 0) */\r
+    Byte *buf;\r
+    int len, signed_val;\r
+\r
+    if (!PyArg_ParseTuple(args, "s#|I:crc32", &buf, &len, &crc32val))\r
+        return NULL;\r
+    /* In Python 2.x we return a signed integer regardless of native platform\r
+     * long size (the 32bit unsigned long is treated as 32-bit signed and sign\r
+     * extended into a 64-bit long inside the integer object).  3.0 does the\r
+     * right thing and returns unsigned. http://bugs.python.org/issue1202 */\r
+    signed_val = crc32(crc32val, buf, len);\r
+    return PyInt_FromLong(signed_val);\r
+}\r
+\r
+\r
+static PyMethodDef zlib_methods[] =\r
+{\r
+    {"adler32", (PyCFunction)PyZlib_adler32, METH_VARARGS,\r
+                adler32__doc__},\r
+    {"compress", (PyCFunction)PyZlib_compress,  METH_VARARGS,\r
+                 compress__doc__},\r
+    {"compressobj", (PyCFunction)PyZlib_compressobj, METH_VARARGS,\r
+                    compressobj__doc__},\r
+    {"crc32", (PyCFunction)PyZlib_crc32, METH_VARARGS,\r
+              crc32__doc__},\r
+    {"decompress", (PyCFunction)PyZlib_decompress, METH_VARARGS,\r
+                   decompress__doc__},\r
+    {"decompressobj", (PyCFunction)PyZlib_decompressobj, METH_VARARGS,\r
+                   decompressobj__doc__},\r
+    {NULL, NULL}\r
+};\r
+\r
+static PyTypeObject Comptype = {\r
+    PyVarObject_HEAD_INIT(0, 0)\r
+    "zlib.Compress",\r
+    sizeof(compobject),\r
+    0,\r
+    (destructor)Comp_dealloc,       /*tp_dealloc*/\r
+    0,                              /*tp_print*/\r
+    (getattrfunc)Comp_getattr,      /*tp_getattr*/\r
+    0,                              /*tp_setattr*/\r
+    0,                              /*tp_compare*/\r
+    0,                              /*tp_repr*/\r
+    0,                              /*tp_as_number*/\r
+    0,                              /*tp_as_sequence*/\r
+    0,                              /*tp_as_mapping*/\r
+};\r
+\r
+static PyTypeObject Decomptype = {\r
+    PyVarObject_HEAD_INIT(0, 0)\r
+    "zlib.Decompress",\r
+    sizeof(compobject),\r
+    0,\r
+    (destructor)Decomp_dealloc,     /*tp_dealloc*/\r
+    0,                              /*tp_print*/\r
+    (getattrfunc)Decomp_getattr,    /*tp_getattr*/\r
+    0,                              /*tp_setattr*/\r
+    0,                              /*tp_compare*/\r
+    0,                              /*tp_repr*/\r
+    0,                              /*tp_as_number*/\r
+    0,                              /*tp_as_sequence*/\r
+    0,                              /*tp_as_mapping*/\r
+};\r
+\r
+PyDoc_STRVAR(zlib_module_documentation,\r
+"The functions in this module allow compression and decompression using the\n"\r
+"zlib library, which is based on GNU zip.\n"\r
+"\n"\r
+"adler32(string[, start]) -- Compute an Adler-32 checksum.\n"\r
+"compress(string[, level]) -- Compress string, with compression level in 0-9.\n"\r
+"compressobj([level]) -- Return a compressor object.\n"\r
+"crc32(string[, start]) -- Compute a CRC-32 checksum.\n"\r
+"decompress(string,[wbits],[bufsize]) -- Decompresses a compressed string.\n"\r
+"decompressobj([wbits]) -- Return a decompressor object.\n"\r
+"\n"\r
+"'wbits' is window buffer size.\n"\r
+"Compressor objects support compress() and flush() methods; decompressor\n"\r
+"objects support decompress() and flush().");\r
+\r
+PyMODINIT_FUNC\r
+PyInit_zlib(void)\r
+{\r
+    PyObject *m, *ver;\r
+    Py_TYPE(&Comptype) = &PyType_Type;\r
+    Py_TYPE(&Decomptype) = &PyType_Type;\r
+    m = Py_InitModule4("zlib", zlib_methods,\r
+                       zlib_module_documentation,\r
+                       (PyObject*)NULL,PYTHON_API_VERSION);\r
+    if (m == NULL)\r
+        return;\r
+\r
+    ZlibError = PyErr_NewException("zlib.error", NULL, NULL);\r
+    if (ZlibError != NULL) {\r
+        Py_INCREF(ZlibError);\r
+        PyModule_AddObject(m, "error", ZlibError);\r
+    }\r
+    PyModule_AddIntConstant(m, "MAX_WBITS", MAX_WBITS);\r
+    PyModule_AddIntConstant(m, "DEFLATED", DEFLATED);\r
+    PyModule_AddIntConstant(m, "DEF_MEM_LEVEL", DEF_MEM_LEVEL);\r
+    PyModule_AddIntConstant(m, "Z_BEST_SPEED", Z_BEST_SPEED);\r
+    PyModule_AddIntConstant(m, "Z_BEST_COMPRESSION", Z_BEST_COMPRESSION);\r
+    PyModule_AddIntConstant(m, "Z_DEFAULT_COMPRESSION", Z_DEFAULT_COMPRESSION);\r
+    PyModule_AddIntConstant(m, "Z_FILTERED", Z_FILTERED);\r
+    PyModule_AddIntConstant(m, "Z_HUFFMAN_ONLY", Z_HUFFMAN_ONLY);\r
+    PyModule_AddIntConstant(m, "Z_DEFAULT_STRATEGY", Z_DEFAULT_STRATEGY);\r
+\r
+    PyModule_AddIntConstant(m, "Z_FINISH", Z_FINISH);\r
+    PyModule_AddIntConstant(m, "Z_NO_FLUSH", Z_NO_FLUSH);\r
+    PyModule_AddIntConstant(m, "Z_SYNC_FLUSH", Z_SYNC_FLUSH);\r
+    PyModule_AddIntConstant(m, "Z_FULL_FLUSH", Z_FULL_FLUSH);\r
+\r
+    ver = PyString_FromString(ZLIB_VERSION);\r
+    if (ver != NULL)\r
+        PyModule_AddObject(m, "ZLIB_VERSION", ver);\r
+\r
+    PyModule_AddStringConstant(m, "__version__", "1.0");\r
+\r
+#ifdef WITH_THREAD\r
+    zlib_lock = PyThread_allocate_lock();\r
+#endif /* WITH_THREAD */\r
+}\r