1(function () { 2 var _storage = {}; 3 var SETTINGS = { 4 keys: { }, 5 useFileStorage: false 6 }; 7 var LZString = { _keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", _f: String.fromCharCode, compressToBase64: function (e) { if (e == null) return ""; var t = ""; var n, r, i, s, o, u, a; var f = 0; e = LZString.compress(e); while (f < e.length * 2) { if (f % 2 == 0) { n = e.charCodeAt(f / 2) >> 8; r = e.charCodeAt(f / 2) & 255; if (f / 2 + 1 < e.length) i = e.charCodeAt(f / 2 + 1) >> 8; else i = NaN } else { n = e.charCodeAt((f - 1) / 2) & 255; if ((f + 1) / 2 < e.length) { r = e.charCodeAt((f + 1) / 2) >> 8; i = e.charCodeAt((f + 1) / 2) & 255 } else r = i = NaN } f += 3; s = n >> 2; o = (n & 3) << 4 | r >> 4; u = (r & 15) << 2 | i >> 6; a = i & 63; if (isNaN(r)) { u = a = 64 } else if (isNaN(i)) { a = 64 } t = t + LZString._keyStr.charAt(s) + LZString._keyStr.charAt(o) + LZString._keyStr.charAt(u) + LZString._keyStr.charAt(a) } return t }, decompressFromBase64: function (e) { if (e == null) return ""; var t = "", n = 0, r, i, s, o, u, a, f, l, c = 0, h = LZString._f; e = e.replace(/[^A-Za-z0-9\+\/\=]/g, ""); while (c < e.length) { u = LZString._keyStr.indexOf(e.charAt(c++)); a = LZString._keyStr.indexOf(e.charAt(c++)); f = LZString._keyStr.indexOf(e.charAt(c++)); l = LZString._keyStr.indexOf(e.charAt(c++)); i = u << 2 | a >> 4; s = (a & 15) << 4 | f >> 2; o = (f & 3) << 6 | l; if (n % 2 == 0) { r = i << 8; if (f != 64) { t += h(r | s) } if (l != 64) { r = o << 8 } } else { t = t + h(r | i); if (f != 64) { r = s << 8 } if (l != 64) { t += h(r | o) } } n += 3 } return LZString.decompress(t) }, compressToUTF16: function (e) { if (e == null) return ""; var t = "", n, r, i, s = 0, o = LZString._f; e = LZString.compress(e); for (n = 0; n < e.length; n++) { r = e.charCodeAt(n); switch (s++) { case 0: t += o((r >> 1) + 32); i = (r & 1) << 14; break; case 1: t += o(i + (r >> 2) + 32); i = (r & 3) << 13; break; case 2: t += o(i + (r >> 3) + 32); i = (r & 7) << 12; break; case 3: t += o(i + (r >> 4) + 32); i = (r & 15) << 11; break; case 4: t += o(i + (r >> 5) + 32); i = (r & 31) << 10; break; case 5: t += o(i + (r >> 6) + 32); i = (r & 63) << 9; break; case 6: t += o(i + (r >> 7) + 32); i = (r & 127) << 8; break; case 7: t += o(i + (r >> 8) + 32); i = (r & 255) << 7; break; case 8: t += o(i + (r >> 9) + 32); i = (r & 511) << 6; break; case 9: t += o(i + (r >> 10) + 32); i = (r & 1023) << 5; break; case 10: t += o(i + (r >> 11) + 32); i = (r & 2047) << 4; break; case 11: t += o(i + (r >> 12) + 32); i = (r & 4095) << 3; break; case 12: t += o(i + (r >> 13) + 32); i = (r & 8191) << 2; break; case 13: t += o(i + (r >> 14) + 32); i = (r & 16383) << 1; break; case 14: t += o(i + (r >> 15) + 32, (r & 32767) + 32); s = 0; break } } return t + o(i + 32) }, decompressFromUTF16: function (e) { if (e == null) return ""; var t = "", n, r, i = 0, s = 0, o = LZString._f; while (s < e.length) { r = e.charCodeAt(s) - 32; switch (i++) { case 0: n = r << 1; break; case 1: t += o(n | r >> 14); n = (r & 16383) << 2; break; case 2: t += o(n | r >> 13); n = (r & 8191) << 3; break; case 3: t += o(n | r >> 12); n = (r & 4095) << 4; break; case 4: t += o(n | r >> 11); n = (r & 2047) << 5; break; case 5: t += o(n | r >> 10); n = (r & 1023) << 6; break; case 6: t += o(n | r >> 9); n = (r & 511) << 7; break; case 7: t += o(n | r >> 8); n = (r & 255) << 8; break; case 8: t += o(n | r >> 7); n = (r & 127) << 9; break; case 9: t += o(n | r >> 6); n = (r & 63) << 10; break; case 10: t += o(n | r >> 5); n = (r & 31) << 11; break; case 11: t += o(n | r >> 4); n = (r & 15) << 12; break; case 12: t += o(n | r >> 3); n = (r & 7) << 13; break; case 13: t += o(n | r >> 2); n = (r & 3) << 14; break; case 14: t += o(n | r >> 1); n = (r & 1) << 15; break; case 15: t += o(n | r); i = 0; break } s++ } return LZString.decompress(t) }, compress: function (e) { if (e == null) return ""; var t, n, r = {}, i = {}, s = "", o = "", u = "", a = 2, f = 3, l = 2, c = "", h = 0, p = 0, d, v = LZString._f; for (d = 0; d < e.length; d += 1) { s = e.charAt(d); if (!Object.prototype.hasOwnProperty.call(r, s)) { r[s] = f++; i[s] = true }
7 o = u + s; if (Object.prototype.hasOwnProperty.call(r, o)) { u = o } else { if (Object.prototype.hasOwnProperty.call(i, u)) { if (u.charCodeAt(0) < 256) { for (t = 0; t < l; t++) { h = h << 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } } n = u.charCodeAt(0); for (t = 0; t < 8; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } else { n = 1; for (t = 0; t < l; t++) { h = h << 1 | n; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = 0 } n = u.charCodeAt(0); for (t = 0; t < 16; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } delete i[u] } else { n = r[u]; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } r[o] = f++; u = String(s) } } if (u !== "") { if (Object.prototype.hasOwnProperty.call(i, u)) { if (u.charCodeAt(0) < 256) { for (t = 0; t < l; t++) { h = h << 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } } n = u.charCodeAt(0); for (t = 0; t < 8; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } else { n = 1; for (t = 0; t < l; t++) { h = h << 1 | n; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = 0 } n = u.charCodeAt(0); for (t = 0; t < 16; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } delete i[u] } else { n = r[u]; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } } a--; if (a == 0) { a = Math.pow(2, l); l++ } } n = 2; for (t = 0; t < l; t++) { h = h << 1 | n & 1; if (p == 15) { p = 0; c += v(h); h = 0 } else { p++ } n = n >> 1 } while (true) { h = h << 1; if (p == 15) { c += v(h); break } else p++ } return c }, decompress: function (e) { if (e == null) return ""; if (e == "") return null; var t = [], n, r = 4, i = 4, s = 3, o = "", u = "", a, f, l, c, h, p, d, v = LZString._f, m = { string: e, val: e.charCodeAt(0), position: 32768, index: 1 }; for (a = 0; a < 3; a += 1) { t[a] = a } l = 0; h = Math.pow(2, 2); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } switch (n = l) { case 0: l = 0; h = Math.pow(2, 8); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } d = v(l); break; case 1: l = 0; h = Math.pow(2, 16); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } d = v(l); break; case 2: return "" } t[3] = d; f = u = d; while (true) { if (m.index > m.string.length) { return "" } l = 0; h = Math.pow(2, s); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } switch (d = l) { case 0: l = 0; h = Math.pow(2, 8); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } t[i++] = v(l); d = i - 1; r--; break; case 1: l = 0; h = Math.pow(2, 16); p = 1; while (p != h) { c = m.val & m.position; m.position >>= 1; if (m.position == 0) { m.position = 32768; m.val = m.string.charCodeAt(m.index++) } l |= (c > 0 ? 1 : 0) * p; p <<= 1 } t[i++] = v(l); d = i - 1; r--; break; case 2: return u } if (r == 0) { r = Math.pow(2, s); s++ } if (t[d]) { o = t[d] } else { if (d === i) { o = f + f.charAt(0) } else { return null } } u += o; t[i++] = f + o.charAt(0); r--; f = o; if (r == 0) { r = Math.pow(2, s); s++ } } } }; if (typeof module !== "undefined" && module != null) { module.exports = LZString } 8 var useFileStorage = null; 9 var fileSystem = null; 10 var data = {}; 11 var writesInProgress = {}; 12 var fileSuffix = ".json"; 13 var exclude = { 14 "ga": true 15 };
16 var _hasInitialised = false; 17 18 //PRIVATE FUNCTIONS 19 function init(o, successFn) { 20 if (o) { 21 SETTINGS.keys = o.keys || SETTINGS.keys; 22 SETTINGS.useFileStorage = o.useFileStorage || SETTINGS.useFileStorage; 23 } 24 25 _storage.keys = SETTINGS.keys; 26 successFn = successFn ? successFn : function () { }; 27 28 if (SETTINGS.useFileStorage) { 29 window.requestFileSystem(LocalFileSystem.PERSISTENT, 0, function (fs) { 30 _hasInitialised = true; 31 onRequestFileSystemSuccess(fs, successFn); 32 }, onRequestFileSystemFail); 33 } else { 34 _hasInitialised = true; 35 successFn(); 36 } 37 } 38 function clear() { 39 data = {}; 40 } 41 function retrieve(key, decompress) { 42 if (!key) { 43 return false; 44 } 45 46 if (!_hasInitialised) { 47 return false; 48 } 49 50 if (SETTINGS.useFileStorage) { 51 value = data[key]; 52 } else { 53 value = localStorage[key]; 54 value = value && decompress ? _data.decompress(value) : value; 55 } 56 57 if (value) { 58 try { 59 return JSON.parse(value); 60 } catch (e) { 61 return value; 62 } 63 } 64 65 return null; 66 } 67 function store(key, value, isJson, compress) { 68 if (!key || value === undefined || value === null) { 69 return false; 70 } 71 72 if (!_hasInitialised) { 73 return false; 74 } 75 76 if (isJson) { 77 value = JSON.stringify(value); 78 } 79 80 if (SETTINGS.useFileStorage) { 81 data[key] = value.toString(); 82 83 if (writesInProgress[key]) { 84 writesInProgress[key].anotherWriteRequired = true; 85 } else if (!exclude[key]) { //IF THE KEY IS NOT IN THE EXCLUDE LIST IT WILL WRITE TO DISK 86 writeToDisk(key); 87 } 88 } else { 89 if (compress) { 90 value = _data.compress(value); 91 } 92 93 localStorage[key] = value; 94 } 95 96 return true; 97 } 98 function remove(key) { 99 if (!key) { return false; } 100 101 if (SETTINGS.useFileStorage) { 102 if (!fileSystem) { return false; } 103 104 delete data[key]; 105 106 var success = function (fileEntry) { 107 fileEntry.remove(function () { }, function () { }); //TODO: BUILD CODE TO MAKE REMOVE REIABLE AND RETRY REMOVING IF THERE IS AN ERROR; 108 }; 109 110 fileSystem.root.getFile(key + fileSuffix, { "create": true, "exclusive": false }, success, function (err) { onGetFileError(err, key); }); 111 } else { 112 localStorage.removeItem(key); 113 } 114 } 115 116 //PRIVATE FILE STORAGE ONLY FUNCTIONS 117 function writeToDisk(key) { 118 if (!fileSystem) { return false; } 119 120 var success = function (fileEntry) { 121 fileEntry.createWriter(write, function (err) { onCreateWriterFail(err, key); }); 122 }; 123 var write = function (writer) { 124 writer.onwriteend = function (e) { 125 var anotherWriteRequired = (writesInProgress[key] && writesInProgress[key].anotherWriteRequired); 126 127 delete writesInProgress[key]; 128 129 if (anotherWriteRequired) { 130 writeToDisk(key); 131 } 132 }; 133 writer.write(data[key]); 134 }; 135 136 writesInProgress[key] = {}; 137 fileSystem.root.getFile(key + fileSuffix, { "create": true, "exclusive": false }, success, function (err) { onGetFileError(err, key); }); 138 }; 139 function onGetFileError(err, key) { 140 handleWriteFailure(key); 141 }; 142 function onCreateWriterFail(err, key) { 143 handleWriteFailure(key); 144 }; 145 function onRequestFileSystemSuccess(fs, onDataLoaded) { 146 fileSystem = fs; 147 loadDataToMemory(onDataLoaded); 148 }; 149 function onRequestFileSystemFail(err) { 150 fileSystem = null; 151 }; 152 function loadDataToMemory(onDataLoaded) { 153 if (!fileSystem) { return false; } 154 155 var dataKeys = SETTINGS.keys; 156 var dataKeysLength = Object.keys(dataKeys) ? Object.keys(dataKeys).length : 0; 157 var loadedCount = 0; 158 var loadedData = function () { 159 if (++loadedCount == dataKeysLength) { 160 onDataLoaded(); 161 } 162 }; 163 164 for (var key in dataKeys) { 165 (function (fileName) { 166 var success = function (fileEntry) { 167 fileEntry.file(read, onRetrieveFileError); 168 }; 169 var read = function (file) { 170 var reader = new FileReader(); 171 172 reader.onloadend = function (e) { 173 data[fileName] = e.target.result; 174 loadedData(); 175 }; 176 reader.readAsText(file); 177 }; 178 179 fileSystem.root.getFile(fileName + fileSuffix, { "create": true, "exclusive": false }, success, function (err) { onGetFileError(err, fileName); }); 180 })(SETTINGS.keys[key]); 181 } 182 }; 183 function onRetrieveFileError(err) { 184 }; 185 function handleWriteFailure(key) {
186 var fileObj = writesInProgress[key]; 187 188 fileObj.failures = fileObj.failures ? fileObj.failures++ : 1; 189 fileObj.anotherWriteRequired = false; 190 191 if (fileObj.failures > 5) { 192 delete writesInProgress[key]; 193 } 194 }; 195 196 //PRIVATE LOCAL STORAGE ONLY FUNCTIONS 197 function compress(value) { 198 return LZString.compressToUTF16(value); 199 }; 200 function decompress(value) { 201 return LZString.decompressFromUTF16(value); 202 }; 203 function checkStorageConsumption() { 204 return (JSON.stringify(localStorage).length / 2048).toFixed(2) + " KBs"; 205 }; 206 function checkSizeOf(key, decompress) { 207 var value = localStorage[key]; 208 209 if (!value) { 210 return "0 KBs"; 211 } 212 213 value = decompress ? _data.decompress(value) : value; 214 return (value.length / 2048).toFixed(2) + " KBs"; 215 }; 216 217 //PUBLIC FUNCTIONS 218 _storage.init = init; 219 _storage.retrieve = retrieve; 220 _storage.store = store; 221 _storage.remove = remove; 222 _storage.clear = clear; 223 224 // CODE 225 window.SAL = window.SAL || {}; 226 window.SAL.Storage = _storage; 227})();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.