| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285 | // Copyright (c) 2013 Pieroxy <pieroxy@pieroxy.net>// 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///// This lib is part of the lz-string project.// For more information, the home page:// http://pieroxy.net/blog/pages/lz-string/index.html//// Base64 compression / decompression for already compressed content (gif, png, jpg, mp3, ...) // version 1.4.1var Base64String = {    compressToUTF16 : function (input) {    var output = [],        i,c,        current,        status = 0;        input = this.compress(input);        for (i=0 ; i<input.length ; i++) {      c = input.charCodeAt(i);      switch (status++) {        case 0:          output.push(String.fromCharCode((c >> 1)+32));          current = (c & 1) << 14;          break;        case 1:          output.push(String.fromCharCode((current + (c >> 2))+32));          current = (c & 3) << 13;          break;        case 2:          output.push(String.fromCharCode((current + (c >> 3))+32));          current = (c & 7) << 12;          break;        case 3:          output.push(String.fromCharCode((current + (c >> 4))+32));          current = (c & 15) << 11;          break;        case 4:          output.push(String.fromCharCode((current + (c >> 5))+32));          current = (c & 31) << 10;          break;        case 5:          output.push(String.fromCharCode((current + (c >> 6))+32));          current = (c & 63) << 9;          break;        case 6:          output.push(String.fromCharCode((current + (c >> 7))+32));          current = (c & 127) << 8;          break;        case 7:          output.push(String.fromCharCode((current + (c >> 8))+32));          current = (c & 255) << 7;          break;        case 8:          output.push(String.fromCharCode((current + (c >> 9))+32));          current = (c & 511) << 6;          break;        case 9:          output.push(String.fromCharCode((current + (c >> 10))+32));          current = (c & 1023) << 5;          break;        case 10:          output.push(String.fromCharCode((current + (c >> 11))+32));          current = (c & 2047) << 4;          break;        case 11:          output.push(String.fromCharCode((current + (c >> 12))+32));          current = (c & 4095) << 3;          break;        case 12:          output.push(String.fromCharCode((current + (c >> 13))+32));          current = (c & 8191) << 2;          break;        case 13:          output.push(String.fromCharCode((current + (c >> 14))+32));          current = (c & 16383) << 1;          break;        case 14:          output.push(String.fromCharCode((current + (c >> 15))+32, (c & 32767)+32));          status = 0;          break;      }    }    output.push(String.fromCharCode(current + 32));    return output.join('');  },    decompressFromUTF16 : function (input) {    var output = [],        current,c,        status=0,        i = 0;        while (i < input.length) {      c = input.charCodeAt(i) - 32;            switch (status++) {        case 0:          current = c << 1;          break;        case 1:          output.push(String.fromCharCode(current | (c >> 14)));          current = (c&16383) << 2;          break;        case 2:          output.push(String.fromCharCode(current | (c >> 13)));          current = (c&8191) << 3;          break;        case 3:          output.push(String.fromCharCode(current | (c >> 12)));          current = (c&4095) << 4;          break;        case 4:          output.push(String.fromCharCode(current | (c >> 11)));          current = (c&2047) << 5;          break;        case 5:          output.push(String.fromCharCode(current | (c >> 10)));          current = (c&1023) << 6;          break;        case 6:          output.push(String.fromCharCode(current | (c >> 9)));          current = (c&511) << 7;          break;        case 7:          output.push(String.fromCharCode(current | (c >> 8)));          current = (c&255) << 8;          break;        case 8:          output.push(String.fromCharCode(current | (c >> 7)));          current = (c&127) << 9;          break;        case 9:          output.push(String.fromCharCode(current | (c >> 6)));          current = (c&63) << 10;          break;        case 10:          output.push(String.fromCharCode(current | (c >> 5)));          current = (c&31) << 11;          break;        case 11:          output.push(String.fromCharCode(current | (c >> 4)));          current = (c&15) << 12;          break;        case 12:          output.push(String.fromCharCode(current | (c >> 3)));          current = (c&7) << 13;          break;        case 13:          output.push(String.fromCharCode(current | (c >> 2)));          current = (c&3) << 14;          break;        case 14:          output.push(String.fromCharCode(current | (c >> 1)));          current = (c&1) << 15;          break;        case 15:          output.push(String.fromCharCode(current | c));          status=0;          break;      }                  i++;    }        return this.decompress(output.join(''));    //return output;      },  // private property  _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",    decompress : function (input) {    var output = [];    var chr1, chr2, chr3, enc1, enc2, enc3, enc4;    var i = 1;    var odd = input.charCodeAt(0) >> 8;        while (i < input.length*2 && (i < input.length*2-1 || odd==0)) {            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) || (i==input.length*2+1 && odd)) {        enc3 = enc4 = 64;      } else if (isNaN(chr3) || (i==input.length*2 && odd)) {        enc4 = 64;      }            output.push(this._keyStr.charAt(enc1));      output.push(this._keyStr.charAt(enc2));      output.push(this._keyStr.charAt(enc3));      output.push(this._keyStr.charAt(enc4));    }        return output.join('');  },    compress : function (input) {    var output = [],        ol = 1,         output_,        chr1, chr2, chr3,        enc1, enc2, enc3, enc4,        i = 0, flush=false;        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");        while (i < input.length) {            enc1 = this._keyStr.indexOf(input.charAt(i++));      enc2 = this._keyStr.indexOf(input.charAt(i++));      enc3 = this._keyStr.indexOf(input.charAt(i++));      enc4 = this._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;        flush = true;                if (enc3 != 64) {          output.push(String.fromCharCode(output_ | chr2));          flush = false;        }        if (enc4 != 64) {          output_ = chr3 << 8;          flush = true;        }      } else {        output.push(String.fromCharCode(output_ | chr1));        flush = false;                if (enc3 != 64) {          output_ = chr2 << 8;          flush = true;        }        if (enc4 != 64) {          output.push(String.fromCharCode(output_ | chr3));          flush = false;        }      }      ol+=3;    }        if (flush) {      output.push(String.fromCharCode(output_));      output = output.join('');      output = String.fromCharCode(output.charCodeAt(0)|256) + output.substring(1);    } else {      output = output.join('');    }        return output;      }}
 |