function base64encode(str){
var out,i,len,base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var c1,c2,c3;
len=;
i=0;
out="";
while(i<len){
c1=(i++)&0xff;
if(i==len){
out+=(c1>>2);
out+=((c1&0x3)<<4);
out+="==";
break;
}
c2=(i++);
if(i==len){
out+=(c1>>2);
out+=(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=((c2&0xF)<<2);
out+="=";
break;
}
c3=(i++);
out+=(c1>>2);
out+=(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=(((c2&0xF)<<2)|((c3&0xC0)>>6));
out+=(c3&0x3F);
}
return out;
}
function base64decode(str){
var c1,c2,c3,c4,base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1);
var i,len,out;
len=;
i=0;
out="";
while(i<len){
/* c1 */
do{
c1=base64DecodeChars[(i++)&0xff];
}while(i<len&&c1==-1);
if(c1==-1) break;
/* c2 */
do{
c2=base64DecodeChars[(i++)&0xff];
}while(i<len&&c2==-1);
if(c2==-1) break;
out+=((c1<<2)|((c2&0x30)>>4));
/* c3 */
do{
c3=(i++)&0xff;
if(c3==61) return out;
c3=base64DecodeChars[c3];
}while(i<len&&c3==-1);
if(c3==-1) break;
out+=(((c2&0XF)<<4)|((c3&0x3C)>>2));
/* c4 */
do{
c4=(i++)&0xff;
if(c4==61) return out;
c4=base64DecodeChars[c4];
}while(i<len&&c4==-1);
if(c4==-1) break;
out+=(((c3&0x03)<<6)|c4);
}
return out;
}
function utf16to8(str){
var out,i,len,c;
out="";
len=;
for (i=0;i<len;i++){
c=(i);
if((c>=0x0001)&&(c<=0x007F)){
out+=(i);
} else if(c>0x07FF){
out+=(0xE0|((c>>12)&0x0F));
out+=(0x80|((c>>6)&0x3F));
out+=(0x80|((c>>0)&0x3F));
} else {
out+=(0xC0|((c>>6)&0x1F));
out+=(0x80|((c>>0)&0x3F));
}
}
return out;
}
function utf8to16(str){
var out,i,len,c;
var char2,char3;
out="";
len=;
i=0;
while(i<len){
c=(i++);
switch (c>>4){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out+=(i-1);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2=(i++);
out+=(((c&0x1F)<<6)|(char2&0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2=(i++);
char3=(i++);
out+=(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));
break;
}
}
return out;
}
var out,i,len,base64EncodeChars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var c1,c2,c3;
len=;
i=0;
out="";
while(i<len){
c1=(i++)&0xff;
if(i==len){
out+=(c1>>2);
out+=((c1&0x3)<<4);
out+="==";
break;
}
c2=(i++);
if(i==len){
out+=(c1>>2);
out+=(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=((c2&0xF)<<2);
out+="=";
break;
}
c3=(i++);
out+=(c1>>2);
out+=(((c1&0x3)<<4)|((c2&0xF0)>>4));
out+=(((c2&0xF)<<2)|((c3&0xC0)>>6));
out+=(c3&0x3F);
}
return out;
}
function base64decode(str){
var c1,c2,c3,c4,base64DecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1,-1,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,-1,-1,-1,-1,-1);
var i,len,out;
len=;
i=0;
out="";
while(i<len){
/* c1 */
do{
c1=base64DecodeChars[(i++)&0xff];
}while(i<len&&c1==-1);
if(c1==-1) break;
/* c2 */
do{
c2=base64DecodeChars[(i++)&0xff];
}while(i<len&&c2==-1);
if(c2==-1) break;
out+=((c1<<2)|((c2&0x30)>>4));
/* c3 */
do{
c3=(i++)&0xff;
if(c3==61) return out;
c3=base64DecodeChars[c3];
}while(i<len&&c3==-1);
if(c3==-1) break;
out+=(((c2&0XF)<<4)|((c3&0x3C)>>2));
/* c4 */
do{
c4=(i++)&0xff;
if(c4==61) return out;
c4=base64DecodeChars[c4];
}while(i<len&&c4==-1);
if(c4==-1) break;
out+=(((c3&0x03)<<6)|c4);
}
return out;
}
function utf16to8(str){
var out,i,len,c;
out="";
len=;
for (i=0;i<len;i++){
c=(i);
if((c>=0x0001)&&(c<=0x007F)){
out+=(i);
} else if(c>0x07FF){
out+=(0xE0|((c>>12)&0x0F));
out+=(0x80|((c>>6)&0x3F));
out+=(0x80|((c>>0)&0x3F));
} else {
out+=(0xC0|((c>>6)&0x1F));
out+=(0x80|((c>>0)&0x3F));
}
}
return out;
}
function utf8to16(str){
var out,i,len,c;
var char2,char3;
out="";
len=;
i=0;
while(i<len){
c=(i++);
switch (c>>4){
case 0:
case 1:
case 2:
case 3:
case 4:
case 5:
case 6:
case 7:
// 0xxxxxxx
out+=(i-1);
break;
case 12:
case 13:
// 110x xxxx 10xx xxxx
char2=(i++);
out+=(((c&0x1F)<<6)|(char2&0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2=(i++);
char3=(i++);
out+=(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));
break;
}
}
return out;
}