/*! LZ-UTF8 v0.5.5 Copyright (c) 2018, Rotem Dan Released under the MIT license. Build date: 2018-07-30 Please report any issue at https://github.com/rotemdan/lzutf8.js/issues */ var LZUTF8; (function (LZUTF8) { LZUTF8.runningInNodeJS = function () { return ((typeof process === "object") && (typeof process.versions === "object") && (typeof process.versions.node === "string")); }; LZUTF8.runningInMainNodeJSModule = function () { return LZUTF8.runningInNodeJS() && require.main === module; }; LZUTF8.commonJSAvailable = function () { return typeof module === "object" && typeof module.exports === "object"; }; LZUTF8.runningInWebWorker = function () { return typeof window === "undefined" && typeof self === "object" && typeof self.addEventListener === "function" && typeof self.close === "function"; }; LZUTF8.runningInNodeChildProcess = function () { return LZUTF8.runningInNodeJS() && typeof process.send === "function"; }; LZUTF8.runningInNullOrigin = function () { if (typeof window !== "object" || typeof window.location !== "object") return false; return document.location.protocol !== 'http:' && document.location.protocol !== 'https:'; }; LZUTF8.webWorkersAvailable = function () { if (typeof Worker !== "function" || LZUTF8.runningInNullOrigin()) return false; if (LZUTF8.runningInNodeJS()) return false; if (navigator && navigator.userAgent && navigator.userAgent.indexOf("Android 4.3") >= 0) return false; return true; }; LZUTF8.log = function (message, appendToDocument) { if (appendToDocument === void 0) { appendToDocument = false; } if (typeof console !== "object") return; console.log(message); if (appendToDocument && typeof document == "object") document.body.innerHTML += message + "
"; }; LZUTF8.createErrorMessage = function (exception, title) { if (title === void 0) { title = "Unhandled exception"; } if (exception == null) return title; title += ": "; if (typeof exception.content === "object") { if (LZUTF8.runningInNodeJS()) { return title + exception.content.stack; } else { var exceptionJSON = JSON.stringify(exception.content); if (exceptionJSON !== "{}") return title + exceptionJSON; else return title + exception.content; } } else if (typeof exception.content === "string") { return title + exception.content; } else { return title + exception; } }; LZUTF8.printExceptionAndStackTraceToConsole = function (exception, title) { if (title === void 0) { title = "Unhandled exception"; } LZUTF8.log(LZUTF8.createErrorMessage(exception, title)); }; LZUTF8.getGlobalObject = function () { if (typeof global === "object") return global; else if (typeof window === "object") return window; else if (typeof self === "object") return self; else return {}; }; LZUTF8.toString = Object.prototype.toString; if (LZUTF8.commonJSAvailable()) module.exports = LZUTF8; })(LZUTF8 || (LZUTF8 = {})); if (typeof Uint8Array === "function" && new Uint8Array(1).subarray(1).byteLength !== 0) { var subarray = function (start, end) { var clamp = function (v, min, max) { return v < min ? min : v > max ? max : v; }; start = start | 0; end = end | 0; if (arguments.length < 1) start = 0; if (arguments.length < 2) end = this.length; if (start < 0) start = this.length + start; if (end < 0) end = this.length + end; start = clamp(start, 0, this.length); end = clamp(end, 0, this.length); var len = end - start; if (len < 0) len = 0; return new this.constructor(this.buffer, this.byteOffset + start * this.BYTES_PER_ELEMENT, len); }; var types = ['Int8Array', 'Uint8Array', 'Uint8ClampedArray', 'Int16Array', 'Uint16Array', 'Int32Array', 'Uint32Array', 'Float32Array', 'Float64Array']; var globalObject = void 0; if (typeof window === "object") globalObject = window; else if (typeof self === "object") globalObject = self; if (globalObject !== undefined) { for (var i = 0; i < types.length; i++) { if (globalObject[types[i]]) globalObject[types[i]].prototype.subarray = subarray; } } } var LZUTF8; (function (LZUTF8) { var AsyncCompressor = (function () { function AsyncCompressor() { } AsyncCompressor.compressAsync = function (input, options, callback) { var timer = new LZUTF8.Timer(); var compressor = new LZUTF8.Compressor(); if (!callback) throw new TypeError("compressAsync: No callback argument given"); if (typeof input === "string") { input = LZUTF8.encodeUTF8(input); } else if (input == null || !(input instanceof Uint8Array)) { callback(undefined, new TypeError("compressAsync: Invalid input argument, only 'string' and 'Uint8Array' are supported")); return; } var sourceBlocks = LZUTF8.ArrayTools.splitByteArray(input, options.blockSize); var compressedBlocks = []; var compressBlocksStartingAt = function (index) { if (index < sourceBlocks.length) { var compressedBlock = void 0; try { compressedBlock = compressor.compressBlock(sourceBlocks[index]); } catch (e) { callback(undefined, e); return; } compressedBlocks.push(compressedBlock); if (timer.getElapsedTime() <= 20) { compressBlocksStartingAt(index + 1); } else { LZUTF8.enqueueImmediate(function () { return compressBlocksStartingAt(index + 1); }); timer.restart(); } } else { var joinedCompressedBlocks_1 = LZUTF8.ArrayTools.concatUint8Arrays(compressedBlocks); LZUTF8.enqueueImmediate(function () { var result; try { result = LZUTF8.CompressionCommon.encodeCompressedBytes(joinedCompressedBlocks_1, options.outputEncoding); } catch (e) { callback(undefined, e); return; } LZUTF8.enqueueImmediate(function () { return callback(result); }); }); } }; LZUTF8.enqueueImmediate(function () { return compressBlocksStartingAt(0); }); }; AsyncCompressor.createCompressionStream = function () { var compressor = new LZUTF8.Compressor(); var NodeStream = require("stream"); var compressionStream = new NodeStream.Transform({ decodeStrings: true, highWaterMark: 65536 }); compressionStream._transform = function (data, encoding, done) { var buffer; try { buffer = LZUTF8.BufferTools.uint8ArrayToBuffer(compressor.compressBlock(LZUTF8.BufferTools.bufferToUint8Array(data))); } catch (e) { compressionStream.emit("error", e); return; } compressionStream.push(buffer); done(); }; return compressionStream; }; return AsyncCompressor; }()); LZUTF8.AsyncCompressor = AsyncCompressor; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var AsyncDecompressor = (function () { function AsyncDecompressor() { } AsyncDecompressor.decompressAsync = function (input, options, callback) { if (!callback) throw new TypeError("decompressAsync: No callback argument given"); var timer = new LZUTF8.Timer(); try { input = LZUTF8.CompressionCommon.decodeCompressedBytes(input, options.inputEncoding); } catch (e) { callback(undefined, e); return; } var decompressor = new LZUTF8.Decompressor(); var sourceBlocks = LZUTF8.ArrayTools.splitByteArray(input, options.blockSize); var decompressedBlocks = []; var decompressBlocksStartingAt = function (index) { if (index < sourceBlocks.length) { var decompressedBlock = void 0; try { decompressedBlock = decompressor.decompressBlock(sourceBlocks[index]); } catch (e) { callback(undefined, e); return; } decompressedBlocks.push(decompressedBlock); if (timer.getElapsedTime() <= 20) { decompressBlocksStartingAt(index + 1); } else { LZUTF8.enqueueImmediate(function () { return decompressBlocksStartingAt(index + 1); }); timer.restart(); } } else { var joinedDecompressedBlocks_1 = LZUTF8.ArrayTools.concatUint8Arrays(decompressedBlocks); LZUTF8.enqueueImmediate(function () { var result; try { result = LZUTF8.CompressionCommon.encodeDecompressedBytes(joinedDecompressedBlocks_1, options.outputEncoding); } catch (e) { callback(undefined, e); return; } LZUTF8.enqueueImmediate(function () { return callback(result); }); }); } }; LZUTF8.enqueueImmediate(function () { return decompressBlocksStartingAt(0); }); }; AsyncDecompressor.createDecompressionStream = function () { var decompressor = new LZUTF8.Decompressor(); var NodeStream = require("stream"); var decompressionStream = new NodeStream.Transform({ decodeStrings: true, highWaterMark: 65536 }); decompressionStream._transform = function (data, encoding, done) { var buffer; try { buffer = LZUTF8.BufferTools.uint8ArrayToBuffer(decompressor.decompressBlock(LZUTF8.BufferTools.bufferToUint8Array(data))); } catch (e) { decompressionStream.emit("error", e); return; } decompressionStream.push(buffer); done(); }; return decompressionStream; }; return AsyncDecompressor; }()); LZUTF8.AsyncDecompressor = AsyncDecompressor; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var WebWorker; (function (WebWorker) { WebWorker.compressAsync = function (input, options, callback) { if (options.inputEncoding == "ByteArray") { if (!(input instanceof Uint8Array)) { callback(undefined, new TypeError("compressAsync: input is not a Uint8Array")); return; } } var request = { token: Math.random().toString(), type: "compress", data: input, inputEncoding: options.inputEncoding, outputEncoding: options.outputEncoding }; var responseListener = function (e) { var response = e.data; if (!response || response.token != request.token) return; WebWorker.globalWorker.removeEventListener("message", responseListener); if (response.type == "error") callback(undefined, new Error(response.error)); else callback(response.data); }; WebWorker.globalWorker.addEventListener("message", responseListener); WebWorker.globalWorker.postMessage(request, []); }; WebWorker.decompressAsync = function (input, options, callback) { var request = { token: Math.random().toString(), type: "decompress", data: input, inputEncoding: options.inputEncoding, outputEncoding: options.outputEncoding }; var responseListener = function (e) { var response = e.data; if (!response || response.token != request.token) return; WebWorker.globalWorker.removeEventListener("message", responseListener); if (response.type == "error") callback(undefined, new Error(response.error)); else callback(response.data); }; WebWorker.globalWorker.addEventListener("message", responseListener); WebWorker.globalWorker.postMessage(request, []); }; WebWorker.installWebWorkerIfNeeded = function () { if (typeof self == "object" && self.document === undefined && self.addEventListener != undefined) { self.addEventListener("message", function (e) { var request = e.data; if (request.type == "compress") { var compressedData = void 0; try { compressedData = LZUTF8.compress(request.data, { outputEncoding: request.outputEncoding }); } catch (e) { self.postMessage({ token: request.token, type: "error", error: LZUTF8.createErrorMessage(e) }, []); return; } var response = { token: request.token, type: "compressionResult", data: compressedData, encoding: request.outputEncoding, }; if (response.data instanceof Uint8Array && navigator.appVersion.indexOf("MSIE 10") === -1) self.postMessage(response, [response.data.buffer]); else self.postMessage(response, []); } else if (request.type == "decompress") { var decompressedData = void 0; try { decompressedData = LZUTF8.decompress(request.data, { inputEncoding: request.inputEncoding, outputEncoding: request.outputEncoding }); } catch (e) { self.postMessage({ token: request.token, type: "error", error: LZUTF8.createErrorMessage(e) }, []); return; } var response = { token: request.token, type: "decompressionResult", data: decompressedData, encoding: request.outputEncoding, }; if (response.data instanceof Uint8Array && navigator.appVersion.indexOf("MSIE 10") === -1) self.postMessage(response, [response.data.buffer]); else self.postMessage(response, []); } }); self.addEventListener("error", function (e) { LZUTF8.log(LZUTF8.createErrorMessage(e.error, "Unexpected LZUTF8 WebWorker exception")); }); } }; WebWorker.createGlobalWorkerIfNeeded = function () { if (WebWorker.globalWorker) return true; if (!LZUTF8.webWorkersAvailable()) return false; if (!WebWorker.scriptURI && typeof document === "object") { var scriptElement = document.getElementById("lzutf8"); if (scriptElement != null) WebWorker.scriptURI = scriptElement.getAttribute("src") || undefined; } if (WebWorker.scriptURI) { WebWorker.globalWorker = new Worker(WebWorker.scriptURI); return true; } else { return false; } }; WebWorker.terminate = function () { if (WebWorker.globalWorker) { WebWorker.globalWorker.terminate(); WebWorker.globalWorker = undefined; } }; })(WebWorker = LZUTF8.WebWorker || (LZUTF8.WebWorker = {})); WebWorker.installWebWorkerIfNeeded(); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var ArraySegment = (function () { function ArraySegment(container, startPosition, length) { this.container = container; this.startPosition = startPosition; this.length = length; } ArraySegment.prototype.get = function (index) { return this.container[this.startPosition + index]; }; ArraySegment.prototype.getInReversedOrder = function (reverseIndex) { return this.container[this.startPosition + this.length - 1 - reverseIndex]; }; ArraySegment.prototype.set = function (index, value) { this.container[this.startPosition + index] = value; }; return ArraySegment; }()); LZUTF8.ArraySegment = ArraySegment; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var ArrayTools; (function (ArrayTools) { ArrayTools.copyElements = function (source, sourceIndex, destination, destinationIndex, count) { while (count--) destination[destinationIndex++] = source[sourceIndex++]; }; ArrayTools.zeroElements = function (collection, index, count) { while (count--) collection[index++] = 0; }; ArrayTools.countNonzeroValuesInArray = function (array) { var result = 0; for (var i = 0; i < array.length; i++) if (array[i]) result++; return result; }; ArrayTools.truncateStartingElements = function (array, truncatedLength) { if (array.length <= truncatedLength) throw new RangeError("truncateStartingElements: Requested length should be smaller than array length"); var sourcePosition = array.length - truncatedLength; for (var i = 0; i < truncatedLength; i++) array[i] = array[sourcePosition + i]; array.length = truncatedLength; }; ArrayTools.doubleByteArrayCapacity = function (array) { var newArray = new Uint8Array(array.length * 2); newArray.set(array); return newArray; }; ArrayTools.concatUint8Arrays = function (arrays) { var totalLength = 0; for (var _i = 0, arrays_1 = arrays; _i < arrays_1.length; _i++) { var array = arrays_1[_i]; totalLength += array.length; } var result = new Uint8Array(totalLength); var offset = 0; for (var _a = 0, arrays_2 = arrays; _a < arrays_2.length; _a++) { var array = arrays_2[_a]; result.set(array, offset); offset += array.length; } return result; }; ArrayTools.splitByteArray = function (byteArray, maxPartLength) { var result = []; for (var offset = 0; offset < byteArray.length;) { var blockLength = Math.min(maxPartLength, byteArray.length - offset); result.push(byteArray.subarray(offset, offset + blockLength)); offset += blockLength; } return result; }; })(ArrayTools = LZUTF8.ArrayTools || (LZUTF8.ArrayTools = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var BufferTools; (function (BufferTools) { BufferTools.convertToUint8ArrayIfNeeded = function (input) { if (typeof Buffer === "function" && Buffer.isBuffer(input)) return BufferTools.bufferToUint8Array(input); else return input; }; BufferTools.uint8ArrayToBuffer = function (arr) { if (Buffer.prototype instanceof Uint8Array) { var arrClone = new Uint8Array(arr.buffer, arr.byteOffset, arr.byteLength); Object["setPrototypeOf"](arrClone, Buffer.prototype); return arrClone; } else { var len = arr.length; var buf = new Buffer(len); for (var i = 0; i < len; i++) buf[i] = arr[i]; return buf; } }; BufferTools.bufferToUint8Array = function (buf) { if (Buffer.prototype instanceof Uint8Array) { return new Uint8Array(buf["buffer"], buf["byteOffset"], buf["byteLength"]); } else { var len = buf.length; var arr = new Uint8Array(len); for (var i = 0; i < len; i++) arr[i] = buf[i]; return arr; } }; })(BufferTools = LZUTF8.BufferTools || (LZUTF8.BufferTools = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var CompressionCommon; (function (CompressionCommon) { CompressionCommon.getCroppedBuffer = function (buffer, cropStartOffset, cropLength, additionalCapacity) { if (additionalCapacity === void 0) { additionalCapacity = 0; } var croppedBuffer = new Uint8Array(cropLength + additionalCapacity); croppedBuffer.set(buffer.subarray(cropStartOffset, cropStartOffset + cropLength)); return croppedBuffer; }; CompressionCommon.getCroppedAndAppendedByteArray = function (bytes, cropStartOffset, cropLength, byteArrayToAppend) { return LZUTF8.ArrayTools.concatUint8Arrays([bytes.subarray(cropStartOffset, cropStartOffset + cropLength), byteArrayToAppend]); }; CompressionCommon.detectCompressionSourceEncoding = function (input) { if (input == null) throw new TypeError("detectCompressionSourceEncoding: input is null or undefined"); if (typeof input === "string") return "String"; else if (input instanceof Uint8Array || (typeof Buffer === "function" && Buffer.isBuffer(input))) return "ByteArray"; else throw new TypeError("detectCompressionSourceEncoding: input must be of type 'string', 'Uint8Array' or 'Buffer'"); }; CompressionCommon.encodeCompressedBytes = function (compressedBytes, outputEncoding) { switch (outputEncoding) { case "ByteArray": return compressedBytes; case "Buffer": return LZUTF8.BufferTools.uint8ArrayToBuffer(compressedBytes); case "Base64": return LZUTF8.encodeBase64(compressedBytes); case "BinaryString": return LZUTF8.encodeBinaryString(compressedBytes); case "StorageBinaryString": return LZUTF8.encodeStorageBinaryString(compressedBytes); default: throw new TypeError("encodeCompressedBytes: invalid output encoding requested"); } }; CompressionCommon.decodeCompressedBytes = function (compressedData, inputEncoding) { if (inputEncoding == null) throw new TypeError("decodeCompressedData: Input is null or undefined"); switch (inputEncoding) { case "ByteArray": case "Buffer": var normalizedBytes = LZUTF8.BufferTools.convertToUint8ArrayIfNeeded(compressedData); if (!(normalizedBytes instanceof Uint8Array)) throw new TypeError("decodeCompressedData: 'ByteArray' or 'Buffer' input type was specified but input is not a Uint8Array or Buffer"); return normalizedBytes; case "Base64": if (typeof compressedData !== "string") throw new TypeError("decodeCompressedData: 'Base64' input type was specified but input is not a string"); return LZUTF8.decodeBase64(compressedData); case "BinaryString": if (typeof compressedData !== "string") throw new TypeError("decodeCompressedData: 'BinaryString' input type was specified but input is not a string"); return LZUTF8.decodeBinaryString(compressedData); case "StorageBinaryString": if (typeof compressedData !== "string") throw new TypeError("decodeCompressedData: 'StorageBinaryString' input type was specified but input is not a string"); return LZUTF8.decodeStorageBinaryString(compressedData); default: throw new TypeError("decodeCompressedData: invalid input encoding requested: '" + inputEncoding + "'"); } }; CompressionCommon.encodeDecompressedBytes = function (decompressedBytes, outputEncoding) { switch (outputEncoding) { case "String": return LZUTF8.decodeUTF8(decompressedBytes); case "ByteArray": return decompressedBytes; case "Buffer": if (typeof Buffer !== "function") throw new TypeError("encodeDecompressedBytes: a 'Buffer' type was specified but is not supported at the current envirnment"); return LZUTF8.BufferTools.uint8ArrayToBuffer(decompressedBytes); default: throw new TypeError("encodeDecompressedBytes: invalid output encoding requested"); } }; })(CompressionCommon = LZUTF8.CompressionCommon || (LZUTF8.CompressionCommon = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var EventLoop; (function (EventLoop) { var queuedFunctions = []; var asyncFlushFunc; EventLoop.enqueueImmediate = function (func) { queuedFunctions.push(func); if (queuedFunctions.length === 1) asyncFlushFunc(); }; EventLoop.initializeScheduler = function () { var flush = function () { for (var _i = 0, queuedFunctions_1 = queuedFunctions; _i < queuedFunctions_1.length; _i++) { var func = queuedFunctions_1[_i]; try { func.call(undefined); } catch (exception) { LZUTF8.printExceptionAndStackTraceToConsole(exception, "enqueueImmediate exception"); } } queuedFunctions.length = 0; }; if (LZUTF8.runningInNodeJS()) { asyncFlushFunc = function () { return setImmediate(function () { return flush(); }); }; } if (typeof window === "object" && typeof window.addEventListener === "function" && typeof window.postMessage === "function") { var token_1 = "enqueueImmediate-" + Math.random().toString(); window.addEventListener("message", function (event) { if (event.data === token_1) flush(); }); var targetOrigin_1; if (LZUTF8.runningInNullOrigin()) targetOrigin_1 = '*'; else targetOrigin_1 = window.location.href; asyncFlushFunc = function () { return window.postMessage(token_1, targetOrigin_1); }; } else if (typeof MessageChannel === "function" && typeof MessagePort === "function") { var channel_1 = new MessageChannel(); channel_1.port1.onmessage = function () { return flush(); }; asyncFlushFunc = function () { return channel_1.port2.postMessage(0); }; } else { asyncFlushFunc = function () { return setTimeout(function () { return flush(); }, 0); }; } }; EventLoop.initializeScheduler(); })(EventLoop = LZUTF8.EventLoop || (LZUTF8.EventLoop = {})); LZUTF8.enqueueImmediate = function (func) { return EventLoop.enqueueImmediate(func); }; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var ObjectTools; (function (ObjectTools) { ObjectTools.override = function (obj, newPropertyValues) { return ObjectTools.extend(obj, newPropertyValues); }; ObjectTools.extend = function (obj, newProperties) { if (obj == null) throw new TypeError("obj is null or undefined"); if (typeof obj !== "object") throw new TypeError("obj is not an object"); if (newProperties == null) newProperties = {}; if (typeof newProperties !== "object") throw new TypeError("newProperties is not an object"); if (newProperties != null) { for (var property in newProperties) obj[property] = newProperties[property]; } return obj; }; })(ObjectTools = LZUTF8.ObjectTools || (LZUTF8.ObjectTools = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { LZUTF8.getRandomIntegerInRange = function (low, high) { return low + Math.floor(Math.random() * (high - low)); }; LZUTF8.getRandomUTF16StringOfLength = function (length) { var randomString = ""; for (var i = 0; i < length; i++) { var randomCodePoint = void 0; do { randomCodePoint = LZUTF8.getRandomIntegerInRange(0, 0x10FFFF + 1); } while (randomCodePoint >= 0xD800 && randomCodePoint <= 0xDFFF); randomString += LZUTF8.Encoding.CodePoint.decodeToString(randomCodePoint); } return randomString; }; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var StringBuilder = (function () { function StringBuilder(outputBufferCapacity) { if (outputBufferCapacity === void 0) { outputBufferCapacity = 1024; } this.outputBufferCapacity = outputBufferCapacity; this.outputPosition = 0; this.outputString = ""; this.outputBuffer = new Uint16Array(this.outputBufferCapacity); } StringBuilder.prototype.appendCharCode = function (charCode) { this.outputBuffer[this.outputPosition++] = charCode; if (this.outputPosition === this.outputBufferCapacity) this.flushBufferToOutputString(); }; StringBuilder.prototype.appendCharCodes = function (charCodes) { for (var i = 0, length_1 = charCodes.length; i < length_1; i++) this.appendCharCode(charCodes[i]); }; StringBuilder.prototype.appendString = function (str) { for (var i = 0, length_2 = str.length; i < length_2; i++) this.appendCharCode(str.charCodeAt(i)); }; StringBuilder.prototype.appendCodePoint = function (codePoint) { if (codePoint <= 0xFFFF) { this.appendCharCode(codePoint); } else if (codePoint <= 0x10FFFF) { this.appendCharCode(0xD800 + ((codePoint - 0x10000) >>> 10)); this.appendCharCode(0xDC00 + ((codePoint - 0x10000) & 1023)); } else throw new Error("appendCodePoint: A code point of " + codePoint + " cannot be encoded in UTF-16"); }; StringBuilder.prototype.getOutputString = function () { this.flushBufferToOutputString(); return this.outputString; }; StringBuilder.prototype.flushBufferToOutputString = function () { if (this.outputPosition === this.outputBufferCapacity) this.outputString += String.fromCharCode.apply(null, this.outputBuffer); else this.outputString += String.fromCharCode.apply(null, this.outputBuffer.subarray(0, this.outputPosition)); this.outputPosition = 0; }; return StringBuilder; }()); LZUTF8.StringBuilder = StringBuilder; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Timer = (function () { function Timer() { this.restart(); } Timer.prototype.restart = function () { this.startTime = Timer.getTimestamp(); }; Timer.prototype.getElapsedTime = function () { return Timer.getTimestamp() - this.startTime; }; Timer.prototype.getElapsedTimeAndRestart = function () { var elapsedTime = this.getElapsedTime(); this.restart(); return elapsedTime; }; Timer.prototype.logAndRestart = function (title, logToDocument) { if (logToDocument === void 0) { logToDocument = true; } var elapsedTime = this.getElapsedTime(); var message = title + ": " + elapsedTime.toFixed(3) + "ms"; LZUTF8.log(message, logToDocument); this.restart(); return elapsedTime; }; Timer.getTimestamp = function () { if (!this.timestampFunc) this.createGlobalTimestampFunction(); return this.timestampFunc(); }; Timer.getMicrosecondTimestamp = function () { return Math.floor(Timer.getTimestamp() * 1000); }; Timer.createGlobalTimestampFunction = function () { if (typeof process === "object" && typeof process.hrtime === "function") { var baseTimestamp_1 = 0; this.timestampFunc = function () { var nodeTimeStamp = process.hrtime(); var millisecondTime = (nodeTimeStamp[0] * 1000) + (nodeTimeStamp[1] / 1000000); return baseTimestamp_1 + millisecondTime; }; baseTimestamp_1 = Date.now() - this.timestampFunc(); } else if (typeof chrome === "object" && chrome.Interval) { var baseTimestamp_2 = Date.now(); var chromeIntervalObject_1 = new chrome.Interval(); chromeIntervalObject_1.start(); this.timestampFunc = function () { return baseTimestamp_2 + chromeIntervalObject_1.microseconds() / 1000; }; } else if (typeof performance === "object" && performance.now) { var baseTimestamp_3 = Date.now() - performance.now(); this.timestampFunc = function () { return baseTimestamp_3 + performance.now(); }; } else if (Date.now) { this.timestampFunc = function () { return Date.now(); }; } else { this.timestampFunc = function () { return (new Date()).getTime(); }; } }; return Timer; }()); LZUTF8.Timer = Timer; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Compressor = (function () { function Compressor(useCustomHashTable) { if (useCustomHashTable === void 0) { useCustomHashTable = true; } this.MinimumSequenceLength = 4; this.MaximumSequenceLength = 31; this.MaximumMatchDistance = 32767; this.PrefixHashTableSize = 65537; this.inputBufferStreamOffset = 1; if (useCustomHashTable && typeof Uint32Array == "function") this.prefixHashTable = new LZUTF8.CompressorCustomHashTable(this.PrefixHashTableSize); else this.prefixHashTable = new LZUTF8.CompressorSimpleHashTable(this.PrefixHashTableSize); } Compressor.prototype.compressBlock = function (input) { if (input === undefined || input === null) throw new TypeError("compressBlock: undefined or null input received"); if (typeof input == "string") input = LZUTF8.encodeUTF8(input); input = LZUTF8.BufferTools.convertToUint8ArrayIfNeeded(input); return this.compressUtf8Block(input); }; Compressor.prototype.compressUtf8Block = function (utf8Bytes) { if (!utf8Bytes || utf8Bytes.length == 0) return new Uint8Array(0); var bufferStartingReadOffset = this.cropAndAddNewBytesToInputBuffer(utf8Bytes); var inputBuffer = this.inputBuffer; var inputBufferLength = this.inputBuffer.length; this.outputBuffer = new Uint8Array(utf8Bytes.length); this.outputBufferPosition = 0; var latestMatchEndPosition = 0; for (var readPosition = bufferStartingReadOffset; readPosition < inputBufferLength; readPosition++) { var inputValue = inputBuffer[readPosition]; var withinAMatchedRange = readPosition < latestMatchEndPosition; if (readPosition > inputBufferLength - this.MinimumSequenceLength) { if (!withinAMatchedRange) this.outputRawByte(inputValue); continue; } var targetBucketIndex = this.getBucketIndexForPrefix(readPosition); if (!withinAMatchedRange) { var matchLocator = this.findLongestMatch(readPosition, targetBucketIndex); if (matchLocator != null) { this.outputPointerBytes(matchLocator.length, matchLocator.distance); latestMatchEndPosition = readPosition + matchLocator.length; withinAMatchedRange = true; } } if (!withinAMatchedRange) this.outputRawByte(inputValue); var inputStreamPosition = this.inputBufferStreamOffset + readPosition; this.prefixHashTable.addValueToBucket(targetBucketIndex, inputStreamPosition); } return this.outputBuffer.subarray(0, this.outputBufferPosition); }; Compressor.prototype.findLongestMatch = function (matchedSequencePosition, bucketIndex) { var bucket = this.prefixHashTable.getArraySegmentForBucketIndex(bucketIndex, this.reusableArraySegmentObject); if (bucket == null) return null; var input = this.inputBuffer; var longestMatchDistance; var longestMatchLength = 0; for (var i = 0; i < bucket.length; i++) { var testedSequencePosition = bucket.getInReversedOrder(i) - this.inputBufferStreamOffset; var testedSequenceDistance = matchedSequencePosition - testedSequencePosition; var lengthToSurpass = void 0; if (longestMatchDistance === undefined) lengthToSurpass = this.MinimumSequenceLength - 1; else if (longestMatchDistance < 128 && testedSequenceDistance >= 128) lengthToSurpass = longestMatchLength + (longestMatchLength >>> 1); else lengthToSurpass = longestMatchLength; if (testedSequenceDistance > this.MaximumMatchDistance || lengthToSurpass >= this.MaximumSequenceLength || matchedSequencePosition + lengthToSurpass >= input.length) break; if (input[testedSequencePosition + lengthToSurpass] !== input[matchedSequencePosition + lengthToSurpass]) continue; for (var offset = 0;; offset++) { if (matchedSequencePosition + offset === input.length || input[testedSequencePosition + offset] !== input[matchedSequencePosition + offset]) { if (offset > lengthToSurpass) { longestMatchDistance = testedSequenceDistance; longestMatchLength = offset; } break; } else if (offset === this.MaximumSequenceLength) return { distance: testedSequenceDistance, length: this.MaximumSequenceLength }; } } if (longestMatchDistance !== undefined) return { distance: longestMatchDistance, length: longestMatchLength }; else return null; }; Compressor.prototype.getBucketIndexForPrefix = function (startPosition) { return (this.inputBuffer[startPosition] * 7880599 + this.inputBuffer[startPosition + 1] * 39601 + this.inputBuffer[startPosition + 2] * 199 + this.inputBuffer[startPosition + 3]) % this.PrefixHashTableSize; }; Compressor.prototype.outputPointerBytes = function (length, distance) { if (distance < 128) { this.outputRawByte(192 | length); this.outputRawByte(distance); } else { this.outputRawByte(224 | length); this.outputRawByte(distance >>> 8); this.outputRawByte(distance & 255); } }; Compressor.prototype.outputRawByte = function (value) { this.outputBuffer[this.outputBufferPosition++] = value; }; Compressor.prototype.cropAndAddNewBytesToInputBuffer = function (newInput) { if (this.inputBuffer === undefined) { this.inputBuffer = newInput; return 0; } else { var cropLength = Math.min(this.inputBuffer.length, this.MaximumMatchDistance); var cropStartOffset = this.inputBuffer.length - cropLength; this.inputBuffer = LZUTF8.CompressionCommon.getCroppedAndAppendedByteArray(this.inputBuffer, cropStartOffset, cropLength, newInput); this.inputBufferStreamOffset += cropStartOffset; return cropLength; } }; return Compressor; }()); LZUTF8.Compressor = Compressor; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var CompressorCustomHashTable = (function () { function CompressorCustomHashTable(bucketCount) { this.minimumBucketCapacity = 4; this.maximumBucketCapacity = 64; this.bucketLocators = new Uint32Array(bucketCount * 2); this.storage = new Uint32Array(bucketCount * 2); this.storageIndex = 1; } CompressorCustomHashTable.prototype.addValueToBucket = function (bucketIndex, valueToAdd) { bucketIndex <<= 1; if (this.storageIndex >= (this.storage.length >>> 1)) this.compact(); var startPosition = this.bucketLocators[bucketIndex]; var length; if (startPosition === 0) { startPosition = this.storageIndex; length = 1; this.storage[this.storageIndex] = valueToAdd; this.storageIndex += this.minimumBucketCapacity; } else { length = this.bucketLocators[bucketIndex + 1]; if (length === this.maximumBucketCapacity - 1) length = this.truncateBucketToNewerElements(startPosition, length, this.maximumBucketCapacity / 2); var endPosition = startPosition + length; if (this.storage[endPosition] === 0) { this.storage[endPosition] = valueToAdd; if (endPosition === this.storageIndex) this.storageIndex += length; } else { LZUTF8.ArrayTools.copyElements(this.storage, startPosition, this.storage, this.storageIndex, length); startPosition = this.storageIndex; this.storageIndex += length; this.storage[this.storageIndex++] = valueToAdd; this.storageIndex += length; } length++; } this.bucketLocators[bucketIndex] = startPosition; this.bucketLocators[bucketIndex + 1] = length; }; CompressorCustomHashTable.prototype.truncateBucketToNewerElements = function (startPosition, bucketLength, truncatedBucketLength) { var sourcePosition = startPosition + bucketLength - truncatedBucketLength; LZUTF8.ArrayTools.copyElements(this.storage, sourcePosition, this.storage, startPosition, truncatedBucketLength); LZUTF8.ArrayTools.zeroElements(this.storage, startPosition + truncatedBucketLength, bucketLength - truncatedBucketLength); return truncatedBucketLength; }; CompressorCustomHashTable.prototype.compact = function () { var oldBucketLocators = this.bucketLocators; var oldStorage = this.storage; this.bucketLocators = new Uint32Array(this.bucketLocators.length); this.storageIndex = 1; for (var bucketIndex = 0; bucketIndex < oldBucketLocators.length; bucketIndex += 2) { var length_3 = oldBucketLocators[bucketIndex + 1]; if (length_3 === 0) continue; this.bucketLocators[bucketIndex] = this.storageIndex; this.bucketLocators[bucketIndex + 1] = length_3; this.storageIndex += Math.max(Math.min(length_3 * 2, this.maximumBucketCapacity), this.minimumBucketCapacity); } this.storage = new Uint32Array(this.storageIndex * 8); for (var bucketIndex = 0; bucketIndex < oldBucketLocators.length; bucketIndex += 2) { var sourcePosition = oldBucketLocators[bucketIndex]; if (sourcePosition === 0) continue; var destPosition = this.bucketLocators[bucketIndex]; var length_4 = this.bucketLocators[bucketIndex + 1]; LZUTF8.ArrayTools.copyElements(oldStorage, sourcePosition, this.storage, destPosition, length_4); } }; CompressorCustomHashTable.prototype.getArraySegmentForBucketIndex = function (bucketIndex, outputObject) { bucketIndex <<= 1; var startPosition = this.bucketLocators[bucketIndex]; if (startPosition === 0) return null; if (outputObject === undefined) outputObject = new LZUTF8.ArraySegment(this.storage, startPosition, this.bucketLocators[bucketIndex + 1]); return outputObject; }; CompressorCustomHashTable.prototype.getUsedBucketCount = function () { return Math.floor(LZUTF8.ArrayTools.countNonzeroValuesInArray(this.bucketLocators) / 2); }; CompressorCustomHashTable.prototype.getTotalElementCount = function () { var result = 0; for (var i = 0; i < this.bucketLocators.length; i += 2) result += this.bucketLocators[i + 1]; return result; }; return CompressorCustomHashTable; }()); LZUTF8.CompressorCustomHashTable = CompressorCustomHashTable; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var CompressorSimpleHashTable = (function () { function CompressorSimpleHashTable(size) { this.maximumBucketCapacity = 64; this.buckets = new Array(size); } CompressorSimpleHashTable.prototype.addValueToBucket = function (bucketIndex, valueToAdd) { var bucket = this.buckets[bucketIndex]; if (bucket === undefined) { this.buckets[bucketIndex] = [valueToAdd]; } else { if (bucket.length === this.maximumBucketCapacity - 1) LZUTF8.ArrayTools.truncateStartingElements(bucket, this.maximumBucketCapacity / 2); bucket.push(valueToAdd); } }; CompressorSimpleHashTable.prototype.getArraySegmentForBucketIndex = function (bucketIndex, outputObject) { var bucket = this.buckets[bucketIndex]; if (bucket === undefined) return null; if (outputObject === undefined) outputObject = new LZUTF8.ArraySegment(bucket, 0, bucket.length); return outputObject; }; CompressorSimpleHashTable.prototype.getUsedBucketCount = function () { return LZUTF8.ArrayTools.countNonzeroValuesInArray(this.buckets); }; CompressorSimpleHashTable.prototype.getTotalElementCount = function () { var currentSum = 0; for (var i = 0; i < this.buckets.length; i++) { if (this.buckets[i] !== undefined) currentSum += this.buckets[i].length; } return currentSum; }; return CompressorSimpleHashTable; }()); LZUTF8.CompressorSimpleHashTable = CompressorSimpleHashTable; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Decompressor = (function () { function Decompressor() { this.MaximumMatchDistance = 32767; this.outputPosition = 0; } Decompressor.prototype.decompressBlockToString = function (input) { input = LZUTF8.BufferTools.convertToUint8ArrayIfNeeded(input); return LZUTF8.decodeUTF8(this.decompressBlock(input)); }; Decompressor.prototype.decompressBlock = function (input) { if (this.inputBufferRemainder) { input = LZUTF8.ArrayTools.concatUint8Arrays([this.inputBufferRemainder, input]); this.inputBufferRemainder = undefined; } var outputStartPosition = this.cropOutputBufferToWindowAndInitialize(Math.max(input.length * 4, 1024)); for (var readPosition = 0, inputLength = input.length; readPosition < inputLength; readPosition++) { var inputValue = input[readPosition]; if (inputValue >>> 6 != 3) { this.outputByte(inputValue); continue; } var sequenceLengthIdentifier = inputValue >>> 5; if (readPosition == inputLength - 1 || (readPosition == inputLength - 2 && sequenceLengthIdentifier == 7)) { this.inputBufferRemainder = input.subarray(readPosition); break; } if (input[readPosition + 1] >>> 7 === 1) { this.outputByte(inputValue); } else { var matchLength = inputValue & 31; var matchDistance = void 0; if (sequenceLengthIdentifier == 6) { matchDistance = input[readPosition + 1]; readPosition += 1; } else { matchDistance = (input[readPosition + 1] << 8) | (input[readPosition + 2]); readPosition += 2; } var matchPosition = this.outputPosition - matchDistance; for (var offset = 0; offset < matchLength; offset++) this.outputByte(this.outputBuffer[matchPosition + offset]); } } this.rollBackIfOutputBufferEndsWithATruncatedMultibyteSequence(); return LZUTF8.CompressionCommon.getCroppedBuffer(this.outputBuffer, outputStartPosition, this.outputPosition - outputStartPosition); }; Decompressor.prototype.outputByte = function (value) { if (this.outputPosition === this.outputBuffer.length) this.outputBuffer = LZUTF8.ArrayTools.doubleByteArrayCapacity(this.outputBuffer); this.outputBuffer[this.outputPosition++] = value; }; Decompressor.prototype.cropOutputBufferToWindowAndInitialize = function (initialCapacity) { if (!this.outputBuffer) { this.outputBuffer = new Uint8Array(initialCapacity); return 0; } var cropLength = Math.min(this.outputPosition, this.MaximumMatchDistance); this.outputBuffer = LZUTF8.CompressionCommon.getCroppedBuffer(this.outputBuffer, this.outputPosition - cropLength, cropLength, initialCapacity); this.outputPosition = cropLength; if (this.outputBufferRemainder) { for (var i = 0; i < this.outputBufferRemainder.length; i++) this.outputByte(this.outputBufferRemainder[i]); this.outputBufferRemainder = undefined; } return cropLength; }; Decompressor.prototype.rollBackIfOutputBufferEndsWithATruncatedMultibyteSequence = function () { for (var offset = 1; offset <= 4 && this.outputPosition - offset >= 0; offset++) { var value = this.outputBuffer[this.outputPosition - offset]; if ((offset < 4 && (value >>> 3) === 30) || (offset < 3 && (value >>> 4) === 14) || (offset < 2 && (value >>> 5) === 6)) { this.outputBufferRemainder = this.outputBuffer.subarray(this.outputPosition - offset, this.outputPosition); this.outputPosition -= offset; return; } } }; return Decompressor; }()); LZUTF8.Decompressor = Decompressor; })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var Base64; (function (Base64) { var charCodeMap = new Uint8Array([65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47]); var reverseCharCodeMap = new Uint8Array([255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 62, 255, 255, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255, 255, 255, 0, 255, 255, 255, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 255, 255, 255, 255, 255, 255, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 255, 255, 255, 255]); var paddingCharacter = "="; var paddingCharCode = 61; Base64.encode = function (inputBytes) { if (!inputBytes || inputBytes.length == 0) return ""; if (LZUTF8.runningInNodeJS()) { return (LZUTF8.BufferTools.uint8ArrayToBuffer(inputBytes)).toString("base64"); } else { return Base64.encodeWithJS(inputBytes); } }; Base64.decode = function (base64String) { if (!base64String) return new Uint8Array(0); if (LZUTF8.runningInNodeJS()) { return LZUTF8.BufferTools.bufferToUint8Array(new Buffer(base64String, "base64")); } else { return Base64.decodeWithJS(base64String); } }; Base64.encodeWithJS = function (inputBytes, addPadding) { if (addPadding === void 0) { addPadding = true; } if (!inputBytes || inputBytes.length == 0) return ""; var map = charCodeMap; var output = new LZUTF8.StringBuilder(); var uint24; for (var readPosition = 0, length_5 = inputBytes.length; readPosition < length_5; readPosition += 3) { if (readPosition <= length_5 - 3) { uint24 = inputBytes[readPosition] << 16 | inputBytes[readPosition + 1] << 8 | inputBytes[readPosition + 2]; output.appendCharCode(map[(uint24 >>> 18) & 63]); output.appendCharCode(map[(uint24 >>> 12) & 63]); output.appendCharCode(map[(uint24 >>> 6) & 63]); output.appendCharCode(map[(uint24) & 63]); uint24 = 0; } else if (readPosition === length_5 - 2) { uint24 = inputBytes[readPosition] << 16 | inputBytes[readPosition + 1] << 8; output.appendCharCode(map[(uint24 >>> 18) & 63]); output.appendCharCode(map[(uint24 >>> 12) & 63]); output.appendCharCode(map[(uint24 >>> 6) & 63]); if (addPadding) output.appendCharCode(paddingCharCode); } else if (readPosition === length_5 - 1) { uint24 = inputBytes[readPosition] << 16; output.appendCharCode(map[(uint24 >>> 18) & 63]); output.appendCharCode(map[(uint24 >>> 12) & 63]); if (addPadding) { output.appendCharCode(paddingCharCode); output.appendCharCode(paddingCharCode); } } } return output.getOutputString(); }; Base64.decodeWithJS = function (base64String, outputBuffer) { if (!base64String || base64String.length == 0) return new Uint8Array(0); var lengthModulo4 = base64String.length % 4; if (lengthModulo4 === 1) throw new Error("Invalid Base64 string: length % 4 == 1"); else if (lengthModulo4 === 2) base64String += paddingCharacter + paddingCharacter; else if (lengthModulo4 === 3) base64String += paddingCharacter; if (!outputBuffer) outputBuffer = new Uint8Array(base64String.length); var outputPosition = 0; var length = base64String.length; for (var i = 0; i < length; i += 4) { var uint24 = (reverseCharCodeMap[base64String.charCodeAt(i)] << 18) | (reverseCharCodeMap[base64String.charCodeAt(i + 1)] << 12) | (reverseCharCodeMap[base64String.charCodeAt(i + 2)] << 6) | (reverseCharCodeMap[base64String.charCodeAt(i + 3)]); outputBuffer[outputPosition++] = (uint24 >>> 16) & 255; outputBuffer[outputPosition++] = (uint24 >>> 8) & 255; outputBuffer[outputPosition++] = (uint24) & 255; } if (base64String.charCodeAt(length - 1) == paddingCharCode) outputPosition--; if (base64String.charCodeAt(length - 2) == paddingCharCode) outputPosition--; return outputBuffer.subarray(0, outputPosition); }; })(Base64 = Encoding.Base64 || (Encoding.Base64 = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var BinaryString; (function (BinaryString) { BinaryString.encode = function (input) { if (input == null) throw new TypeError("BinaryString.encode: undefined or null input received"); if (input.length === 0) return ""; var inputLength = input.length; var outputStringBuilder = new LZUTF8.StringBuilder(); var remainder = 0; var state = 1; for (var i = 0; i < inputLength; i += 2) { var value = void 0; if (i == inputLength - 1) value = (input[i] << 8); else value = (input[i] << 8) | input[i + 1]; outputStringBuilder.appendCharCode((remainder << (16 - state)) | value >>> state); remainder = value & ((1 << state) - 1); if (state === 15) { outputStringBuilder.appendCharCode(remainder); remainder = 0; state = 1; } else { state += 1; } if (i >= inputLength - 2) outputStringBuilder.appendCharCode(remainder << (16 - state)); } outputStringBuilder.appendCharCode(32768 | (inputLength % 2)); return outputStringBuilder.getOutputString(); }; BinaryString.decode = function (input) { if (typeof input !== "string") throw new TypeError("BinaryString.decode: invalid input type"); if (input == "") return new Uint8Array(0); var output = new Uint8Array(input.length * 3); var outputPosition = 0; var appendToOutput = function (value) { output[outputPosition++] = value >>> 8; output[outputPosition++] = value & 255; }; var remainder = 0; var state = 0; for (var i = 0; i < input.length; i++) { var value = input.charCodeAt(i); if (value >= 32768) { if (value == (32768 | 1)) outputPosition--; state = 0; continue; } if (state == 0) { remainder = value; } else { appendToOutput((remainder << state) | (value >>> (15 - state))); remainder = value & ((1 << (15 - state)) - 1); } if (state == 15) state = 0; else state += 1; } return output.subarray(0, outputPosition); }; })(BinaryString = Encoding.BinaryString || (Encoding.BinaryString = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var CodePoint; (function (CodePoint) { CodePoint.encodeFromString = function (str, position) { var charCode = str.charCodeAt(position); if (charCode < 0xD800 || charCode > 0xDBFF) return charCode; else { var nextCharCode = str.charCodeAt(position + 1); if (nextCharCode >= 0xDC00 && nextCharCode <= 0xDFFF) return 0x10000 + (((charCode - 0xD800) << 10) + (nextCharCode - 0xDC00)); else throw new Error("getUnicodeCodePoint: Received a lead surrogate character, char code " + charCode + ", followed by " + nextCharCode + ", which is not a trailing surrogate character code."); } }; CodePoint.decodeToString = function (codePoint) { if (codePoint <= 0xFFFF) return String.fromCharCode(codePoint); else if (codePoint <= 0x10FFFF) return String.fromCharCode(0xD800 + ((codePoint - 0x10000) >>> 10), 0xDC00 + ((codePoint - 0x10000) & 1023)); else throw new Error("getStringFromUnicodeCodePoint: A code point of " + codePoint + " cannot be encoded in UTF-16"); }; })(CodePoint = Encoding.CodePoint || (Encoding.CodePoint = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var DecimalString; (function (DecimalString) { var lookupTable = ["000", "001", "002", "003", "004", "005", "006", "007", "008", "009", "010", "011", "012", "013", "014", "015", "016", "017", "018", "019", "020", "021", "022", "023", "024", "025", "026", "027", "028", "029", "030", "031", "032", "033", "034", "035", "036", "037", "038", "039", "040", "041", "042", "043", "044", "045", "046", "047", "048", "049", "050", "051", "052", "053", "054", "055", "056", "057", "058", "059", "060", "061", "062", "063", "064", "065", "066", "067", "068", "069", "070", "071", "072", "073", "074", "075", "076", "077", "078", "079", "080", "081", "082", "083", "084", "085", "086", "087", "088", "089", "090", "091", "092", "093", "094", "095", "096", "097", "098", "099", "100", "101", "102", "103", "104", "105", "106", "107", "108", "109", "110", "111", "112", "113", "114", "115", "116", "117", "118", "119", "120", "121", "122", "123", "124", "125", "126", "127", "128", "129", "130", "131", "132", "133", "134", "135", "136", "137", "138", "139", "140", "141", "142", "143", "144", "145", "146", "147", "148", "149", "150", "151", "152", "153", "154", "155", "156", "157", "158", "159", "160", "161", "162", "163", "164", "165", "166", "167", "168", "169", "170", "171", "172", "173", "174", "175", "176", "177", "178", "179", "180", "181", "182", "183", "184", "185", "186", "187", "188", "189", "190", "191", "192", "193", "194", "195", "196", "197", "198", "199", "200", "201", "202", "203", "204", "205", "206", "207", "208", "209", "210", "211", "212", "213", "214", "215", "216", "217", "218", "219", "220", "221", "222", "223", "224", "225", "226", "227", "228", "229", "230", "231", "232", "233", "234", "235", "236", "237", "238", "239", "240", "241", "242", "243", "244", "245", "246", "247", "248", "249", "250", "251", "252", "253", "254", "255"]; DecimalString.encode = function (binaryBytes) { var resultArray = []; for (var i = 0; i < binaryBytes.length; i++) resultArray.push(lookupTable[binaryBytes[i]]); return resultArray.join(" "); }; })(DecimalString = Encoding.DecimalString || (Encoding.DecimalString = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var StorageBinaryString; (function (StorageBinaryString) { StorageBinaryString.encode = function (input) { return Encoding.BinaryString.encode(input).replace(/\0/g, '\u8002'); }; StorageBinaryString.decode = function (input) { return Encoding.BinaryString.decode(input.replace(/\u8002/g, '\0')); }; })(StorageBinaryString = Encoding.StorageBinaryString || (Encoding.StorageBinaryString = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { var Encoding; (function (Encoding) { var UTF8; (function (UTF8) { var nativeTextEncoder; var nativeTextDecoder; UTF8.encode = function (str) { if (!str || str.length == 0) return new Uint8Array(0); if (LZUTF8.runningInNodeJS()) { return LZUTF8.BufferTools.bufferToUint8Array(new Buffer(str, "utf8")); } else if (UTF8.createNativeTextEncoderAndDecoderIfAvailable()) { return nativeTextEncoder.encode(str); } else { return UTF8.encodeWithJS(str); } }; UTF8.decode = function (utf8Bytes) { if (!utf8Bytes || utf8Bytes.length == 0) return ""; if (LZUTF8.runningInNodeJS()) { return LZUTF8.BufferTools.uint8ArrayToBuffer(utf8Bytes).toString("utf8"); } else if (UTF8.createNativeTextEncoderAndDecoderIfAvailable()) { return nativeTextDecoder.decode(utf8Bytes); } else { return UTF8.decodeWithJS(utf8Bytes); } }; UTF8.encodeWithJS = function (str, outputArray) { if (!str || str.length == 0) return new Uint8Array(0); if (!outputArray) outputArray = new Uint8Array(str.length * 4); var writeIndex = 0; for (var readIndex = 0; readIndex < str.length; readIndex++) { var charCode = Encoding.CodePoint.encodeFromString(str, readIndex); if (charCode <= 0x7F) { outputArray[writeIndex++] = charCode; } else if (charCode <= 0x7FF) { outputArray[writeIndex++] = 0xC0 | (charCode >>> 6); outputArray[writeIndex++] = 0x80 | (charCode & 63); } else if (charCode <= 0xFFFF) { outputArray[writeIndex++] = 0xE0 | (charCode >>> 12); outputArray[writeIndex++] = 0x80 | ((charCode >>> 6) & 63); outputArray[writeIndex++] = 0x80 | (charCode & 63); } else if (charCode <= 0x10FFFF) { outputArray[writeIndex++] = 0xF0 | (charCode >>> 18); outputArray[writeIndex++] = 0x80 | ((charCode >>> 12) & 63); outputArray[writeIndex++] = 0x80 | ((charCode >>> 6) & 63); outputArray[writeIndex++] = 0x80 | (charCode & 63); readIndex++; } else throw new Error("Invalid UTF-16 string: Encountered a character unsupported by UTF-8/16 (RFC 3629)"); } return outputArray.subarray(0, writeIndex); }; UTF8.decodeWithJS = function (utf8Bytes, startOffset, endOffset) { if (startOffset === void 0) { startOffset = 0; } if (!utf8Bytes || utf8Bytes.length == 0) return ""; if (endOffset === undefined) endOffset = utf8Bytes.length; var output = new LZUTF8.StringBuilder(); var outputCodePoint; var leadByte; for (var readIndex = startOffset, length_6 = endOffset; readIndex < length_6;) { leadByte = utf8Bytes[readIndex]; if ((leadByte >>> 7) === 0) { outputCodePoint = leadByte; readIndex += 1; } else if ((leadByte >>> 5) === 6) { if (readIndex + 1 >= endOffset) throw new Error("Invalid UTF-8 stream: Truncated codepoint sequence encountered at position " + readIndex); outputCodePoint = ((leadByte & 31) << 6) | (utf8Bytes[readIndex + 1] & 63); readIndex += 2; } else if ((leadByte >>> 4) === 14) { if (readIndex + 2 >= endOffset) throw new Error("Invalid UTF-8 stream: Truncated codepoint sequence encountered at position " + readIndex); outputCodePoint = ((leadByte & 15) << 12) | ((utf8Bytes[readIndex + 1] & 63) << 6) | (utf8Bytes[readIndex + 2] & 63); readIndex += 3; } else if ((leadByte >>> 3) === 30) { if (readIndex + 3 >= endOffset) throw new Error("Invalid UTF-8 stream: Truncated codepoint sequence encountered at position " + readIndex); outputCodePoint = ((leadByte & 7) << 18) | ((utf8Bytes[readIndex + 1] & 63) << 12) | ((utf8Bytes[readIndex + 2] & 63) << 6) | (utf8Bytes[readIndex + 3] & 63); readIndex += 4; } else throw new Error("Invalid UTF-8 stream: An invalid lead byte value encountered at position " + readIndex); output.appendCodePoint(outputCodePoint); } return output.getOutputString(); }; UTF8.createNativeTextEncoderAndDecoderIfAvailable = function () { if (nativeTextEncoder) return true; if (typeof TextEncoder == "function") { nativeTextEncoder = new TextEncoder("utf-8"); nativeTextDecoder = new TextDecoder("utf-8"); return true; } else return false; }; })(UTF8 = Encoding.UTF8 || (Encoding.UTF8 = {})); })(Encoding = LZUTF8.Encoding || (LZUTF8.Encoding = {})); })(LZUTF8 || (LZUTF8 = {})); var LZUTF8; (function (LZUTF8) { function compress(input, options) { if (options === void 0) { options = {}; } if (input == null) throw new TypeError("compress: undefined or null input received"); var inputEncoding = LZUTF8.CompressionCommon.detectCompressionSourceEncoding(input); options = LZUTF8.ObjectTools.override({ inputEncoding: inputEncoding, outputEncoding: "ByteArray" }, options); var compressor = new LZUTF8.Compressor(); var compressedBytes = compressor.compressBlock(input); return LZUTF8.CompressionCommon.encodeCompressedBytes(compressedBytes, options.outputEncoding); } LZUTF8.compress = compress; function decompress(input, options) { if (options === void 0) { options = {}; } if (input == null) throw new TypeError("decompress: undefined or null input received"); options = LZUTF8.ObjectTools.override({ inputEncoding: "ByteArray", outputEncoding: "String" }, options); var inputBytes = LZUTF8.CompressionCommon.decodeCompressedBytes(input, options.inputEncoding); var decompressor = new LZUTF8.Decompressor(); var decompressedBytes = decompressor.decompressBlock(inputBytes); return LZUTF8.CompressionCommon.encodeDecompressedBytes(decompressedBytes, options.outputEncoding); } LZUTF8.decompress = decompress; function compressAsync(input, options, callback) { if (callback == null) callback = function () { }; var inputEncoding; try { inputEncoding = LZUTF8.CompressionCommon.detectCompressionSourceEncoding(input); } catch (e) { callback(undefined, e); return; } options = LZUTF8.ObjectTools.override({ inputEncoding: inputEncoding, outputEncoding: "ByteArray", useWebWorker: true, blockSize: 65536 }, options); LZUTF8.enqueueImmediate(function () { if (options.useWebWorker && LZUTF8.WebWorker.createGlobalWorkerIfNeeded()) { LZUTF8.WebWorker.compressAsync(input, options, callback); } else { LZUTF8.AsyncCompressor.compressAsync(input, options, callback); } }); } LZUTF8.compressAsync = compressAsync; function decompressAsync(input, options, callback) { if (callback == null) callback = function () { }; if (input == null) { callback(undefined, new TypeError("decompressAsync: undefined or null input received")); return; } options = LZUTF8.ObjectTools.override({ inputEncoding: "ByteArray", outputEncoding: "String", useWebWorker: true, blockSize: 65536 }, options); var normalizedInput = LZUTF8.BufferTools.convertToUint8ArrayIfNeeded(input); LZUTF8.EventLoop.enqueueImmediate(function () { if (options.useWebWorker && LZUTF8.WebWorker.createGlobalWorkerIfNeeded()) { LZUTF8.WebWorker.decompressAsync(normalizedInput, options, callback); } else { LZUTF8.AsyncDecompressor.decompressAsync(input, options, callback); } }); } LZUTF8.decompressAsync = decompressAsync; function createCompressionStream() { return LZUTF8.AsyncCompressor.createCompressionStream(); } LZUTF8.createCompressionStream = createCompressionStream; function createDecompressionStream() { return LZUTF8.AsyncDecompressor.createDecompressionStream(); } LZUTF8.createDecompressionStream = createDecompressionStream; function encodeUTF8(str) { return LZUTF8.Encoding.UTF8.encode(str); } LZUTF8.encodeUTF8 = encodeUTF8; function decodeUTF8(input) { return LZUTF8.Encoding.UTF8.decode(input); } LZUTF8.decodeUTF8 = decodeUTF8; function encodeBase64(input) { return LZUTF8.Encoding.Base64.encode(input); } LZUTF8.encodeBase64 = encodeBase64; function decodeBase64(str) { return LZUTF8.Encoding.Base64.decode(str); } LZUTF8.decodeBase64 = decodeBase64; function encodeBinaryString(input) { return LZUTF8.Encoding.BinaryString.encode(input); } LZUTF8.encodeBinaryString = encodeBinaryString; function decodeBinaryString(str) { return LZUTF8.Encoding.BinaryString.decode(str); } LZUTF8.decodeBinaryString = decodeBinaryString; function encodeStorageBinaryString(input) { return LZUTF8.Encoding.StorageBinaryString.encode(input); } LZUTF8.encodeStorageBinaryString = encodeStorageBinaryString; function decodeStorageBinaryString(str) { return LZUTF8.Encoding.StorageBinaryString.decode(str); } LZUTF8.decodeStorageBinaryString = decodeStorageBinaryString; })(LZUTF8 || (LZUTF8 = {}));