// Copyright (c) 2013 Pieroxy // This work is free. You can redistribute it and/or modify it // under the terms of the WTFPL, Version 2 // For more information see LICENSE.txt or http://www.wtfpl.net/ // // For more information, the home page: // http://pieroxy.net/blog/pages/lz-string/testing.html // // LZ-based compression algorithm, version 1.3.3 var LZString = { // private property _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", _f : String.fromCharCode, compressToBase64 : function (input) { if (input == null) return ""; var output = ""; var chr1, chr2, chr3, enc1, enc2, enc3, enc4; var i = 0; input = LZString.compress(input); while (i < input.length*2) { if (i%2==0) { chr1 = input.charCodeAt(i/2) >> 8; chr2 = input.charCodeAt(i/2) & 255; if (i/2+1 < input.length) chr3 = input.charCodeAt(i/2+1) >> 8; else chr3 = NaN; } else { chr1 = input.charCodeAt((i-1)/2) & 255; if ((i+1)/2 < input.length) { chr2 = input.charCodeAt((i+1)/2) >> 8; chr3 = input.charCodeAt((i+1)/2) & 255; } else chr2=chr3=NaN; } i+=3; enc1 = chr1 >> 2; enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); enc4 = chr3 & 63; if (isNaN(chr2)) { enc3 = enc4 = 64; } else if (isNaN(chr3)) { enc4 = 64; } output = output + LZString._keyStr.charAt(enc1) + LZString._keyStr.charAt(enc2) + LZString._keyStr.charAt(enc3) + LZString._keyStr.charAt(enc4); } return output; }, decompressFromBase64 : function (input) { if (input == null) return ""; var output = "", ol = 0, output_, chr1, chr2, chr3, enc1, enc2, enc3, enc4, i = 0, f=LZString._f; input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (i < input.length) { enc1 = LZString._keyStr.indexOf(input.charAt(i++)); enc2 = LZString._keyStr.indexOf(input.charAt(i++)); enc3 = LZString._keyStr.indexOf(input.charAt(i++)); enc4 = LZString._keyStr.indexOf(input.charAt(i++)); chr1 = (enc1 << 2) | (enc2 >> 4); chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); chr3 = ((enc3 & 3) << 6) | enc4; if (ol%2==0) { output_ = chr1 << 8; if (enc3 != 64) { output += f(output_ | chr2); } if (enc4 != 64) { output_ = chr3 << 8; } } else { output = output + f(output_ | chr1); if (enc3 != 64) { output_ = chr2 << 8; } if (enc4 != 64) { output += f(output_ | chr3); } } ol+=3; } return LZString.decompress(output); }, compressToUTF16 : function (input) { if (input == null) return ""; var output = "", i,c, current, status = 0, f = LZString._f; input = LZString.compress(input); for (i=0 ; i> 1)+32); current = (c & 1) << 14; break; case 1: output += f((current + (c >> 2))+32); current = (c & 3) << 13; break; case 2: output += f((current + (c >> 3))+32); current = (c & 7) << 12; break; case 3: output += f((current + (c >> 4))+32); current = (c & 15) << 11; break; case 4: output += f((current + (c >> 5))+32); current = (c & 31) << 10; break; case 5: output += f((current + (c >> 6))+32); current = (c & 63) << 9; break; case 6: output += f((current + (c >> 7))+32); current = (c & 127) << 8; break; case 7: output += f((current + (c >> 8))+32); current = (c & 255) << 7; break; case 8: output += f((current + (c >> 9))+32); current = (c & 511) << 6; break; case 9: output += f((current + (c >> 10))+32); current = (c & 1023) << 5; break; case 10: output += f((current + (c >> 11))+32); current = (c & 2047) << 4; break; case 11: output += f((current + (c >> 12))+32); current = (c & 4095) << 3; break; case 12: output += f((current + (c >> 13))+32); current = (c & 8191) << 2; break; case 13: output += f((current + (c >> 14))+32); current = (c & 16383) << 1; break; case 14: output += f((current + (c >> 15))+32, (c & 32767)+32); status = 0; break; } } return output + f(current + 32); }, decompressFromUTF16 : function (input) { if (input == null) return ""; var output = "", current,c, status=0, i = 0, f = LZString._f; while (i < input.length) { c = input.charCodeAt(i) - 32; switch (status++) { case 0: current = c << 1; break; case 1: output += f(current | (c >> 14)); current = (c&16383) << 2; break; case 2: output += f(current | (c >> 13)); current = (c&8191) << 3; break; case 3: output += f(current | (c >> 12)); current = (c&4095) << 4; break; case 4: output += f(current | (c >> 11)); current = (c&2047) << 5; break; case 5: output += f(current | (c >> 10)); current = (c&1023) << 6; break; case 6: output += f(current | (c >> 9)); current = (c&511) << 7; break; case 7: output += f(current | (c >> 8)); current = (c&255) << 8; break; case 8: output += f(current | (c >> 7)); current = (c&127) << 9; break; case 9: output += f(current | (c >> 6)); current = (c&63) << 10; break; case 10: output += f(current | (c >> 5)); current = (c&31) << 11; break; case 11: output += f(current | (c >> 4)); current = (c&15) << 12; break; case 12: output += f(current | (c >> 3)); current = (c&7) << 13; break; case 13: output += f(current | (c >> 2)); current = (c&3) << 14; break; case 14: output += f(current | (c >> 1)); current = (c&1) << 15; break; case 15: output += f(current | c); status=0; break; } i++; } return LZString.decompress(output); //return output; }, compress: function (uncompressed) { if (uncompressed == null) return ""; var i, value, context_dictionary= {}, context_dictionaryToCreate= {}, context_c="", context_wc="", context_w="", context_enlargeIn= 2, // Compensate for the first entry which should not count context_dictSize= 3, context_numBits= 2, context_data_string="", context_data_val=0, context_data_position=0, ii, f=LZString._f; for (ii = 0; ii < uncompressed.length; ii += 1) { context_c = uncompressed.charAt(ii); if (!Object.prototype.hasOwnProperty.call(context_dictionary,context_c)) { context_dictionary[context_c] = context_dictSize++; context_dictionaryToCreate[context_c] = true; } context_wc = context_w + context_c; if (Object.prototype.hasOwnProperty.call(context_dictionary,context_wc)) { context_w = context_wc; } else { if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) { if (context_w.charCodeAt(0)<256) { for (i=0 ; i> 1; } } else { value = 1; for (i=0 ; i> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } delete context_dictionaryToCreate[context_w]; } else { value = context_dictionary[context_w]; for (i=0 ; i> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } // Add wc to the dictionary. context_dictionary[context_wc] = context_dictSize++; context_w = String(context_c); } } // Output the code for w. if (context_w !== "") { if (Object.prototype.hasOwnProperty.call(context_dictionaryToCreate,context_w)) { if (context_w.charCodeAt(0)<256) { for (i=0 ; i> 1; } } else { value = 1; for (i=0 ; i> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } delete context_dictionaryToCreate[context_w]; } else { value = context_dictionary[context_w]; for (i=0 ; i> 1; } } context_enlargeIn--; if (context_enlargeIn == 0) { context_enlargeIn = Math.pow(2, context_numBits); context_numBits++; } } // Mark the end of the stream value = 2; for (i=0 ; i> 1; } // Flush the last char while (true) { context_data_val = (context_data_val << 1); if (context_data_position == 15) { context_data_string += f(context_data_val); break; } else context_data_position++; } return context_data_string; }, decompress: function (compressed) { if (compressed == null) return ""; if (compressed == "") return null; var dictionary = [], next, enlargeIn = 4, dictSize = 4, numBits = 3, entry = "", result = "", i, w, bits, resb, maxpower, power, c, f = LZString._f, data = {string:compressed, val:compressed.charCodeAt(0), position:32768, index:1}; for (i = 0; i < 3; i += 1) { dictionary[i] = i; } bits = 0; maxpower = Math.pow(2,2); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } switch (next = bits) { case 0: bits = 0; maxpower = Math.pow(2,8); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } c = f(bits); break; case 1: bits = 0; maxpower = Math.pow(2,16); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } c = f(bits); break; case 2: return ""; } dictionary[3] = c; w = result = c; while (true) { if (data.index > data.string.length) { return ""; } bits = 0; maxpower = Math.pow(2,numBits); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } switch (c = bits) { case 0: bits = 0; maxpower = Math.pow(2,8); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits); c = dictSize-1; enlargeIn--; break; case 1: bits = 0; maxpower = Math.pow(2,16); power=1; while (power!=maxpower) { resb = data.val & data.position; data.position >>= 1; if (data.position == 0) { data.position = 32768; data.val = data.string.charCodeAt(data.index++); } bits |= (resb>0 ? 1 : 0) * power; power <<= 1; } dictionary[dictSize++] = f(bits); c = dictSize-1; enlargeIn--; break; case 2: return result; } if (enlargeIn == 0) { enlargeIn = Math.pow(2, numBits); numBits++; } if (dictionary[c]) { entry = dictionary[c]; } else { if (c === dictSize) { entry = w + w.charAt(0); } else { return null; } } result += entry; // Add w+entry[0] to the dictionary. dictionary[dictSize++] = w + entry.charAt(0); enlargeIn--; w = entry; if (enlargeIn == 0) { enlargeIn = Math.pow(2, numBits); numBits++; } } } }; if( typeof module !== 'undefined' && module != null ) { module.exports = LZString }