--- /dev/null
+"use strict";\r
+\r
+/**\r
+ * A minimal UTF8 implementation for number arrays.\r
+ * @memberof util\r
+ * @namespace\r
+ */\r
+var utf8 = exports;\r
+\r
+/**\r
+ * Calculates the UTF8 byte length of a string.\r
+ * @param {string} string String\r
+ * @returns {number} Byte length\r
+ */\r
+utf8.length = function utf8_length(string) {\r
+ var len = 0,\r
+ c = 0;\r
+ for (var i = 0; i < string.length; ++i) {\r
+ c = string.charCodeAt(i);\r
+ if (c < 128)\r
+ len += 1;\r
+ else if (c < 2048)\r
+ len += 2;\r
+ else if ((c & 0xFC00) === 0xD800 && (string.charCodeAt(i + 1) & 0xFC00) === 0xDC00) {\r
+ ++i;\r
+ len += 4;\r
+ } else\r
+ len += 3;\r
+ }\r
+ return len;\r
+};\r
+\r
+/**\r
+ * Reads UTF8 bytes as a string.\r
+ * @param {Uint8Array} buffer Source buffer\r
+ * @param {number} start Source start\r
+ * @param {number} end Source end\r
+ * @returns {string} String read\r
+ */\r
+utf8.read = function utf8_read(buffer, start, end) {\r
+ var len = end - start;\r
+ if (len < 1)\r
+ return "";\r
+ var parts = null,\r
+ chunk = [],\r
+ i = 0, // char offset\r
+ t; // temporary\r
+ while (start < end) {\r
+ t = buffer[start++];\r
+ if (t < 128)\r
+ chunk[i++] = t;\r
+ else if (t > 191 && t < 224)\r
+ chunk[i++] = (t & 31) << 6 | buffer[start++] & 63;\r
+ else if (t > 239 && t < 365) {\r
+ t = ((t & 7) << 18 | (buffer[start++] & 63) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63) - 0x10000;\r
+ chunk[i++] = 0xD800 + (t >> 10);\r
+ chunk[i++] = 0xDC00 + (t & 1023);\r
+ } else\r
+ chunk[i++] = (t & 15) << 12 | (buffer[start++] & 63) << 6 | buffer[start++] & 63;\r
+ if (i > 8191) {\r
+ (parts || (parts = [])).push(String.fromCharCode.apply(String, chunk));\r
+ i = 0;\r
+ }\r
+ }\r
+ if (parts) {\r
+ if (i)\r
+ parts.push(String.fromCharCode.apply(String, chunk.slice(0, i)));\r
+ return parts.join("");\r
+ }\r
+ return String.fromCharCode.apply(String, chunk.slice(0, i));\r
+};\r
+\r
+/**\r
+ * Writes a string as UTF8 bytes.\r
+ * @param {string} string Source string\r
+ * @param {Uint8Array} buffer Destination buffer\r
+ * @param {number} offset Destination offset\r
+ * @returns {number} Bytes written\r
+ */\r
+utf8.write = function utf8_write(string, buffer, offset) {\r
+ var start = offset,\r
+ c1, // character 1\r
+ c2; // character 2\r
+ for (var i = 0; i < string.length; ++i) {\r
+ c1 = string.charCodeAt(i);\r
+ if (c1 < 128) {\r
+ buffer[offset++] = c1;\r
+ } else if (c1 < 2048) {\r
+ buffer[offset++] = c1 >> 6 | 192;\r
+ buffer[offset++] = c1 & 63 | 128;\r
+ } else if ((c1 & 0xFC00) === 0xD800 && ((c2 = string.charCodeAt(i + 1)) & 0xFC00) === 0xDC00) {\r
+ c1 = 0x10000 + ((c1 & 0x03FF) << 10) + (c2 & 0x03FF);\r
+ ++i;\r
+ buffer[offset++] = c1 >> 18 | 240;\r
+ buffer[offset++] = c1 >> 12 & 63 | 128;\r
+ buffer[offset++] = c1 >> 6 & 63 | 128;\r
+ buffer[offset++] = c1 & 63 | 128;\r
+ } else {\r
+ buffer[offset++] = c1 >> 12 | 224;\r
+ buffer[offset++] = c1 >> 6 & 63 | 128;\r
+ buffer[offset++] = c1 & 63 | 128;\r
+ }\r
+ }\r
+ return offset - start;\r
+};\r