var base64list = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';

function base64encode(s)
{
  var t = '', p = -6, a = 0, i = 0, v = 0, c;

  while ( (i < s.length) || (p > -6) ) {
    if ( p < 0 ) {
      if ( i < s.length ) {
        c = s.charCodeAt(i++);
        v += 8;
      } else {
        c = 0;
      }
      a = ((a&255)<<8)|(c&255);
      p += 8;
    }
    if ( v > 0 )
      t += base64list.charAt((a>>p)&63);
    else
      t += base64list.charAt(64);
    p -= 6;
    v -= 6;
  }
  return t;
}

function base64decode(s)
{
  var t = '', p = -8, a = 0, q = 0, c, m, n;

  for( var i = 0; i < s.length; i++ ) {
    c = base64list.indexOf(s.charAt(i));
    if ( c < 0 )
      continue;
    a = (a<<6)|(c&63);
    p += 6;
    if ( p >= 0 ) {
      c = (a>>p)&255;
      if ( c > 0 )
        t += String.fromCharCode(c);
      a &= 63;
      p -= 8;
    }
  }
  return t;
}
