
function div(a,b){return(a-(a%b))/b;}
BigDecimal.prototype.div=div;function arraycopy(src,srcindex,dest,destindex,length){var i;if(destindex>srcindex){for(i=length-1;i>=0;--i){dest[i+destindex]=src[i+srcindex];}}else{for(i=0;i<length;++i){dest[i+destindex]=src[i+srcindex];}}}
BigDecimal.prototype.arraycopy=arraycopy;function createArrayWithZeros(length){var retVal=new Array(length);var i;for(i=0;i<length;++i){retVal[i]=0;}
return retVal;}
BigDecimal.prototype.createArrayWithZeros=createArrayWithZeros;BigDecimal.prototype.abs=abs;BigDecimal.prototype.add=add;BigDecimal.prototype.compareTo=compareTo;BigDecimal.prototype.divide=divide;BigDecimal.prototype.divideInteger=divideInteger;BigDecimal.prototype.max=max;BigDecimal.prototype.min=min;BigDecimal.prototype.multiply=multiply;BigDecimal.prototype.negate=negate;BigDecimal.prototype.plus=plus;BigDecimal.prototype.pow=pow;BigDecimal.prototype.remainder=remainder;BigDecimal.prototype.subtract=subtract;BigDecimal.prototype.equals=equals;BigDecimal.prototype.format=format;BigDecimal.prototype.intValueExact=intValueExact;BigDecimal.prototype.movePointLeft=movePointLeft;BigDecimal.prototype.movePointRight=movePointRight;BigDecimal.prototype.scale=scale;BigDecimal.prototype.setScale=setScale;BigDecimal.prototype.signum=signum;BigDecimal.prototype.toString=toString;BigDecimal.prototype.layout=layout;BigDecimal.prototype.intcheck=intcheck;BigDecimal.prototype.dodivide=dodivide;BigDecimal.prototype.bad=bad;BigDecimal.prototype.badarg=badarg;BigDecimal.prototype.extend=extend;BigDecimal.prototype.byteaddsub=byteaddsub;BigDecimal.prototype.diginit=diginit;BigDecimal.prototype.clone=clone;BigDecimal.prototype.checkdigits=checkdigits;BigDecimal.prototype.round=round;BigDecimal.prototype.allzero=allzero;BigDecimal.prototype.finish=finish;BigDecimal.prototype.ROUND_CEILING=MathContext.prototype.ROUND_CEILING;BigDecimal.prototype.ROUND_DOWN=MathContext.prototype.ROUND_DOWN;BigDecimal.prototype.ROUND_FLOOR=MathContext.prototype.ROUND_FLOOR;BigDecimal.prototype.ROUND_HALF_DOWN=MathContext.prototype.ROUND_HALF_DOWN;BigDecimal.prototype.ROUND_HALF_EVEN=MathContext.prototype.ROUND_HALF_EVEN;BigDecimal.prototype.ROUND_HALF_UP=MathContext.prototype.ROUND_HALF_UP;BigDecimal.prototype.ROUND_UNNECESSARY=MathContext.prototype.ROUND_UNNECESSARY;BigDecimal.prototype.ROUND_UP=MathContext.prototype.ROUND_UP;BigDecimal.prototype.ispos=1;BigDecimal.prototype.iszero=0;BigDecimal.prototype.isneg=-1;BigDecimal.prototype.MinExp=-999999999;BigDecimal.prototype.MaxExp=999999999;BigDecimal.prototype.MinArg=-999999999;BigDecimal.prototype.MaxArg=999999999;BigDecimal.prototype.plainMC=new MathContext(0,MathContext.prototype.PLAIN);BigDecimal.prototype.bytecar=new Array((90+99)+1);BigDecimal.prototype.bytedig=diginit();BigDecimal.prototype.ZERO=new BigDecimal("0");BigDecimal.prototype.ONE=new BigDecimal("1");BigDecimal.prototype.TEN=new BigDecimal("10");function BigDecimal(){this.ind=0;this.form=MathContext.prototype.PLAIN;this.mant=null;this.exp=0;if(BigDecimal.arguments.length==0)
return;var inchars;var offset;var length;if(BigDecimal.arguments.length==1)
{inchars=BigDecimal.arguments[0];offset=0;length=inchars.length;}
else
{inchars=BigDecimal.arguments[0];offset=BigDecimal.arguments[1];length=BigDecimal.arguments[2];}
if(typeof inchars=="string")
{inchars=inchars.split("");}
var exotic;var hadexp;var d;var dotoff;var last;var i=0;var si=0;var eneg=false;var k=0;var elen=0;var j=0;var sj=0;var dvalue=0;var mag=0;if(length<=0)
this.bad("BigDecimal(): ",inchars);this.ind=this.ispos;if(inchars[0]==('-'))
{length--;if(length==0)
this.bad("BigDecimal(): ",inchars);this.ind=this.isneg;offset++;}
else
if(inchars[0]==('+'))
{length--;if(length==0)
this.bad("BigDecimal(): ",inchars);offset++;}
exotic=false;hadexp=false;d=0;dotoff=-1;last=-1;{var $1=length;i=offset;i:for(;$1>0;$1--,i++){si=inchars[i];if(si>='0')
if(si<='9')
{last=i;d++;continue i;}
if(si=='.')
{if(dotoff>=0)
this.bad("BigDecimal(): ",inchars);dotoff=i-offset;continue i;}
if(si!='e')
if(si!='E')
{if(si<'0'||si>'9')
this.bad("BigDecimal(): ",inchars);exotic=true;last=i;d++;continue i;}
if((i-offset)>(length-2))
this.bad("BigDecimal(): ",inchars);eneg=false;if((inchars[i+1])==('-'))
{eneg=true;k=i+2;}
else
if((inchars[i+1])==('+'))
k=i+2;else
k=i+1;elen=length-((k-offset));if((elen==0)||(elen>9))
this.bad("BigDecimal(): ",inchars);{var $2=elen;j=k;j:for(;$2>0;$2--,j++){sj=inchars[j];if(sj<'0')
this.bad("BigDecimal(): ",inchars);if(sj>'9')
{this.bad("BigDecimal(): ",inchars);}
else
dvalue=sj-'0';this.exp=(this.exp*10)+dvalue;}}
if(eneg)
this.exp=-this.exp;hadexp=true;break i;}}
if(d==0)
this.bad("BigDecimal(): ",inchars);if(dotoff>=0)
this.exp=(this.exp+dotoff)-d;{var $3=last-1;i=offset;i:for(;i<=$3;i++){si=inchars[i];if(si=='0')
{offset++;dotoff--;d--;}
else
if(si=='.')
{offset++;dotoff--;}
else
if(si<='9')
break i;else
{break i;}}}
this.mant=new Array(d);j=offset;if(exotic)
{exotica:do{{var $4=d;i=0;i:for(;$4>0;$4--,i++){if(i==dotoff)
j++;sj=inchars[j];if(sj<='9')
this.mant[i]=sj-'0';else
{this.bad("BigDecimal(): ",inchars);}
j++;}}}while(false);}
else
{simple:do{{var $5=d;i=0;i:for(;$5>0;$5--,i++){if(i==dotoff)
j++;this.mant[i]=inchars[j]-'0';j++;}}}while(false);}
if(this.mant[0]==0)
{this.ind=this.iszero;if(this.exp>0)
this.exp=0;if(hadexp)
{this.mant=this.ZERO.mant;this.exp=0;}}
else
{if(hadexp)
{this.form=MathContext.prototype.SCIENTIFIC;mag=(this.exp+this.mant.length)-1;if((mag<this.MinExp)||(mag>this.MaxExp))
this.bad("BigDecimal(): ",inchars);}}
return;}
function abs(){var set;if(abs.arguments.length==1)
{set=abs.arguments[0];}
else if(abs.arguments.length==0)
{set=this.plainMC;}
else
{throw"abs(): "+abs.arguments.length+" arguments given; expected 0 or 1"}
if(this.ind==this.isneg)
return this.negate(set);return this.plus(set);}
function add(){var set;if(add.arguments.length==2)
{set=add.arguments[1];}
else if(add.arguments.length==1)
{set=this.plainMC;}
else
{throw"add(): "+add.arguments.length+" arguments given; expected 1 or 2"}
var rhs=add.arguments[0];var lhs;var reqdig;var res;var usel;var usellen;var user;var userlen;var newlen=0;var tlen=0;var mult=0;var t=null;var ia=0;var ib=0;var ea=0;var eb=0;var ca=0;var cb=0;if(set.lostDigits)
this.checkdigits(rhs,set.digits);lhs=this;if(lhs.ind==0)
if(set.form!=MathContext.prototype.PLAIN)
return rhs.plus(set);if(rhs.ind==0)
if(set.form!=MathContext.prototype.PLAIN)
return lhs.plus(set);reqdig=set.digits;if(reqdig>0)
{if(lhs.mant.length>reqdig)
lhs=this.clone(lhs).round(set);if(rhs.mant.length>reqdig)
rhs=this.clone(rhs).round(set);}
res=new BigDecimal();usel=lhs.mant;usellen=lhs.mant.length;user=rhs.mant;userlen=rhs.mant.length;{padder:do{if(lhs.exp==rhs.exp)
{res.exp=lhs.exp;}
else if(lhs.exp>rhs.exp)
{newlen=(usellen+lhs.exp)-rhs.exp;if(newlen>=((userlen+reqdig)+1))
if(reqdig>0)
{res.mant=usel;res.exp=lhs.exp;res.ind=lhs.ind;if(usellen<reqdig)
{res.mant=this.extend(lhs.mant,reqdig);res.exp=res.exp-((reqdig-usellen));}
return res.finish(set,false);}
res.exp=rhs.exp;if(newlen>(reqdig+1))
if(reqdig>0)
{tlen=(newlen-reqdig)-1;userlen=userlen-tlen;res.exp=res.exp+tlen;newlen=reqdig+1;}
if(newlen>usellen)
usellen=newlen;}
else{newlen=(userlen+rhs.exp)-lhs.exp;if(newlen>=((usellen+reqdig)+1))
if(reqdig>0)
{res.mant=user;res.exp=rhs.exp;res.ind=rhs.ind;if(userlen<reqdig)
{res.mant=this.extend(rhs.mant,reqdig);res.exp=res.exp-((reqdig-userlen));}
return res.finish(set,false);}
res.exp=lhs.exp;if(newlen>(reqdig+1))
if(reqdig>0)
{tlen=(newlen-reqdig)-1;usellen=usellen-tlen;res.exp=res.exp+tlen;newlen=reqdig+1;}
if(newlen>userlen)
userlen=newlen;}}while(false);}
if(lhs.ind==this.iszero)
res.ind=this.ispos;else
res.ind=lhs.ind;if(((lhs.ind==this.isneg)?1:0)==((rhs.ind==this.isneg)?1:0))
mult=1;else
{signdiff:do{mult=-1;{swaptest:do{if(rhs.ind==this.iszero);else if((usellen<userlen)||(lhs.ind==this.iszero))
{t=usel;usel=user;user=t;tlen=usellen;usellen=userlen;userlen=tlen;res.ind=-res.ind;}
else if(usellen>userlen);else{{ia=0;ib=0;ea=usel.length-1;eb=user.length-1;{compare:for(;;){if(ia<=ea)
ca=usel[ia];else
{if(ib>eb)
{if(set.form!=MathContext.prototype.PLAIN)
return this.ZERO;break compare;}
ca=0;}
if(ib<=eb)
cb=user[ib];else
cb=0;if(ca!=cb)
{if(ca<cb)
{t=usel;usel=user;user=t;tlen=usellen;usellen=userlen;userlen=tlen;res.ind=-res.ind;}
break compare;}
ia++;ib++;}}}}}while(false);}}while(false);}
res.mant=this.byteaddsub(usel,usellen,user,userlen,mult,false);return res.finish(set,false);}
function compareTo(){var set;if(compareTo.arguments.length==2)
{set=compareTo.arguments[1];}
else if(compareTo.arguments.length==1)
{set=this.plainMC;}
else
{throw"compareTo(): "+compareTo.arguments.length+" arguments given; expected 1 or 2"}
var rhs=compareTo.arguments[0];var thislength=0;var i=0;var newrhs;if(set.lostDigits)
this.checkdigits(rhs,set.digits);if((this.ind==rhs.ind)&&(this.exp==rhs.exp))
{thislength=this.mant.length;if(thislength<rhs.mant.length)
return-this.ind;if(thislength>rhs.mant.length)
return this.ind;if((thislength<=set.digits)||(set.digits==0))
{{var $6=thislength;i=0;i:for(;$6>0;$6--,i++){if(this.mant[i]<rhs.mant[i])
return-this.ind;if(this.mant[i]>rhs.mant[i])
return this.ind;}}
return 0;}}
else
{if(this.ind<rhs.ind)
return-1;if(this.ind>rhs.ind)
return 1;}
newrhs=this.clone(rhs);newrhs.ind=-newrhs.ind;return this.add(newrhs,set).ind;}
function divide(){var set;var scale=-1;if(divide.arguments.length==2)
{if(typeof divide.arguments[1]=='number')
{set=new MathContext(0,MathContext.prototype.PLAIN,false,divide.arguments[1]);}
else
{set=divide.arguments[1];}}
else if(divide.arguments.length==3)
{scale=divide.arguments[1];if(scale<0)
throw"divide(): Negative scale: "+scale;set=new MathContext(0,MathContext.prototype.PLAIN,false,divide.arguments[2]);}
else if(divide.arguments.length==1)
{set=this.plainMC;}
else
{throw"divide(): "+divide.arguments.length+" arguments given; expected between 1 and 3"}
var rhs=divide.arguments[0];return this.dodivide('D',rhs,set,scale);}
function divideInteger(){var set;if(divideInteger.arguments.length==2)
{set=divideInteger.arguments[1];}
else if(divideInteger.arguments.length==1)
{set=this.plainMC;}
else
{throw"divideInteger(): "+divideInteger.arguments.length+" arguments given; expected 1 or 2"}
var rhs=divideInteger.arguments[0];return this.dodivide('I',rhs,set,0);}
function max(){var set;if(max.arguments.length==2)
{set=max.arguments[1];}
else if(max.arguments.length==1)
{set=this.plainMC;}
else
{throw"max(): "+max.arguments.length+" arguments given; expected 1 or 2"}
var rhs=max.arguments[0];if((this.compareTo(rhs,set))>=0)
return this.plus(set);else
return rhs.plus(set);}
function min(){var set;if(min.arguments.length==2)
{set=min.arguments[1];}
else if(min.arguments.length==1)
{set=this.plainMC;}
else
{throw"min(): "+min.arguments.length+" arguments given; expected 1 or 2"}
var rhs=min.arguments[0];if((this.compareTo(rhs,set))<=0)
return this.plus(set);else
return rhs.plus(set);}
function multiply(){var set;if(multiply.arguments.length==2)
{set=multiply.arguments[1];}
else if(multiply.arguments.length==1)
{set=this.plainMC;}
else
{throw"multiply(): "+multiply.arguments.length+" arguments given; expected 1 or 2"}
var rhs=multiply.arguments[0];var lhs;var padding;var reqdig;var multer=null;var multand=null;var multandlen;var acclen=0;var res;var acc;var n=0;var mult=0;if(set.lostDigits)
this.checkdigits(rhs,set.digits);lhs=this;padding=0;reqdig=set.digits;if(reqdig>0)
{if(lhs.mant.length>reqdig)
lhs=this.clone(lhs).round(set);if(rhs.mant.length>reqdig)
rhs=this.clone(rhs).round(set);}
else
{if(lhs.exp>0)
padding=padding+lhs.exp;if(rhs.exp>0)
padding=padding+rhs.exp;}
if(lhs.mant.length<rhs.mant.length)
{multer=lhs.mant;multand=rhs.mant;}
else
{multer=rhs.mant;multand=lhs.mant;}
multandlen=(multer.length+multand.length)-1;if((multer[0]*multand[0])>9)
acclen=multandlen+1;else
acclen=multandlen;res=new BigDecimal();acc=this.createArrayWithZeros(acclen);{var $7=multer.length;n=0;n:for(;$7>0;$7--,n++){mult=multer[n];if(mult!=0)
{acc=this.byteaddsub(acc,acc.length,multand,multandlen,mult,true);}
multandlen--;}}
res.ind=lhs.ind*rhs.ind;res.exp=(lhs.exp+rhs.exp)-padding;if(padding==0)
res.mant=acc;else
res.mant=this.extend(acc,acc.length+padding);return res.finish(set,false);}
function negate(){var set;if(negate.arguments.length==1)
{set=negate.arguments[0];}
else if(negate.arguments.length==0)
{set=this.plainMC;}
else
{throw"negate(): "+negate.arguments.length+" arguments given; expected 0 or 1"}
var res;if(set.lostDigits)
this.checkdigits(null,set.digits);res=this.clone(this);res.ind=-res.ind;return res.finish(set,false);}
function plus(){var set;if(plus.arguments.length==1)
{set=plus.arguments[0];}
else if(plus.arguments.length==0)
{set=this.plainMC;}
else
{throw"plus(): "+plus.arguments.length+" arguments given; expected 0 or 1"}
if(set.lostDigits)
this.checkdigits(null,set.digits);if(set.form==MathContext.prototype.PLAIN)
if(this.form==MathContext.prototype.PLAIN)
{if(this.mant.length<=set.digits)
return this;if(set.digits==0)
return this;}
return this.clone(this).finish(set,false);}
function pow(){var set;if(pow.arguments.length==2)
{set=pow.arguments[1];}
else if(pow.arguments.length==1)
{set=this.plainMC;}
else
{throw"pow(): "+pow.arguments.length+" arguments given; expected 1 or 2"}
var rhs=pow.arguments[0];var n;var lhs;var reqdig;var workdigits=0;var L=0;var workset;var res;var seenbit;var i=0;if(set.lostDigits)
this.checkdigits(rhs,set.digits);n=rhs.intcheck(this.MinArg,this.MaxArg);lhs=this;reqdig=set.digits;if(reqdig==0)
{if(rhs.ind==this.isneg)
throw"pow(): Negative power: "+rhs.toString()
workdigits=0;}
else
{if((rhs.mant.length+rhs.exp)>reqdig)
throw"pow(): Too many digits: "+rhs.toString()
if(lhs.mant.length>reqdig)
lhs=this.clone(lhs).round(set);L=rhs.mant.length+rhs.exp;workdigits=(reqdig+L)+1;}
workset=new MathContext(workdigits,set.form,false,set.roundingMode);res=this.ONE;if(n==0)
return res;if(n<0)
n=-n;seenbit=false;{i=1;i:for(;;i++){n=n+n;if(n<0)
{seenbit=true;res=res.multiply(lhs,workset);}
if(i==31)
break i;if((!seenbit))
continue i;res=res.multiply(res,workset);}}
if(rhs.ind<0)
res=this.ONE.divide(res,workset);return res.finish(set,true);}
function remainder(){var set;if(remainder.arguments.length==2)
{set=remainder.arguments[1];}
else if(remainder.arguments.length==1)
{set=this.plainMC;}
else
{throw"remainder(): "+remainder.arguments.length+" arguments given; expected 1 or 2"}
var rhs=remainder.arguments[0];return this.dodivide('R',rhs,set,-1);}
function subtract(){var set;if(subtract.arguments.length==2)
{set=subtract.arguments[1];}
else if(subtract.arguments.length==1)
{set=this.plainMC;}
else
{throw"subtract(): "+subtract.arguments.length+" arguments given; expected 1 or 2"}
var rhs=subtract.arguments[0];var newrhs;if(set.lostDigits)
this.checkdigits(rhs,set.digits);newrhs=this.clone(rhs);newrhs.ind=-newrhs.ind;return this.add(newrhs,set);}
function equals(obj){var rhs;var i=0;var lca=null;var rca=null;if(obj==null)
return false;if((!(((obj instanceof BigDecimal)))))
return false;rhs=obj;if(this.ind!=rhs.ind)
return false;if(((this.mant.length==rhs.mant.length)&&(this.exp==rhs.exp))&&(this.form==rhs.form))
{{var $8=this.mant.length;i=0;i:for(;$8>0;$8--,i++){if(this.mant[i]!=rhs.mant[i])
return false;}}}
else
{lca=this.layout();rca=rhs.layout();if(lca.length!=rca.length)
return false;{var $9=lca.length;i=0;i:for(;$9>0;$9--,i++){if(lca[i]!=rca[i])
return false;}}}
return true;}
function format(){var explaces;var exdigits;var exformint;var exround;if(format.arguments.length==6)
{explaces=format.arguments[2];exdigits=format.arguments[3];exformint=format.arguments[4];exround=format.arguments[5];}
else if(format.arguments.length==2)
{explaces=-1;exdigits=-1;exformint=MathContext.prototype.SCIENTIFIC;exround=this.ROUND_HALF_UP;}
else
{throw"format(): "+format.arguments.length+" arguments given; expected 2 or 6"}
var before=format.arguments[0];var after=format.arguments[1];var num;var mag=0;var thisafter=0;var lead=0;var newmant=null;var chop=0;var need=0;var oldexp=0;var a;var p=0;var newa=null;var i=0;var places=0;if((before<(-1))||(before==0))
this.badarg("format",1,before);if(after<(-1))
this.badarg("format",2,after);if((explaces<(-1))||(explaces==0))
this.badarg("format",3,explaces);if(exdigits<(-1))
this.badarg("format",4,exdigits);{if(exformint==MathContext.prototype.SCIENTIFIC);else if(exformint==MathContext.prototype.ENGINEERING);else if(exformint==(-1))
exformint=MathContext.prototype.SCIENTIFIC;else{this.badarg("format",5,exformint);}}
if(exround!=this.ROUND_HALF_UP)
{try{if(exround==(-1))
exround=this.ROUND_HALF_UP;else
new MathContext(9,MathContext.prototype.SCIENTIFIC,false,exround);}
catch($10){this.badarg("format",6,exround);}}
num=this.clone(this);{setform:do{if(exdigits==(-1))
num.form=MathContext.prototype.PLAIN;else if(num.ind==this.iszero)
num.form=MathContext.prototype.PLAIN;else{mag=num.exp+num.mant.length;if(mag>exdigits)
num.form=exformint;else
if(mag<(-5))
num.form=exformint;else
num.form=MathContext.prototype.PLAIN;}}while(false);}
if(after>=0)
{setafter:for(;;){{if(num.form==MathContext.prototype.PLAIN)
thisafter=-num.exp;else if(num.form==MathContext.prototype.SCIENTIFIC)
thisafter=num.mant.length-1;else{lead=(((num.exp+num.mant.length)-1))%3;if(lead<0)
lead=3+lead;lead++;if(lead>=num.mant.length)
thisafter=0;else
thisafter=num.mant.length-lead;}}
if(thisafter==after)
break setafter;if(thisafter<after)
{newmant=this.extend(num.mant,(num.mant.length+after)-thisafter);num.mant=newmant;num.exp=num.exp-((after-thisafter));if(num.exp<this.MinExp)
throw"format(): Exponent Overflow: "+num.exp;break setafter;}
chop=thisafter-after;if(chop>num.mant.length)
{num.mant=this.ZERO.mant;num.ind=this.iszero;num.exp=0;continue setafter;}
need=num.mant.length-chop;oldexp=num.exp;num.round(need,exround);if((num.exp-oldexp)==chop)
break setafter;}}
a=num.layout();if(before>0)
{{var $11=a.length;p=0;p:for(;$11>0;$11--,p++){if(a[p]=='.')
break p;if(a[p]=='E')
break p;}}
if(p>before)
this.badarg("format",1,before);if(p<before)
{newa=new Array((a.length+before)-p);{var $12=before-p;i=0;i:for(;$12>0;$12--,i++){newa[i]=' ';}}
this.arraycopy(a,0,newa,i,a.length);a=newa;}}
if(explaces>0)
{{var $13=a.length-1;p=a.length-1;p:for(;$13>0;$13--,p--){if(a[p]=='E')
break p;}}
if(p==0)
{newa=new Array((a.length+explaces)+2);this.arraycopy(a,0,newa,0,a.length);{var $14=explaces+2;i=a.length;i:for(;$14>0;$14--,i++){newa[i]=' ';}}
a=newa;}
else
{places=(a.length-p)-2;if(places>explaces)
this.badarg("format",3,explaces);if(places<explaces)
{newa=new Array((a.length+explaces)-places);this.arraycopy(a,0,newa,0,p+2);{var $15=explaces-places;i=p+2;i:for(;$15>0;$15--,i++){newa[i]='0';}}
this.arraycopy(a,p+2,newa,i,places);a=newa;}}}
return a.join("");}
function intValueExact(){var lodigit;var useexp=0;var result;var i=0;var topdig=0;if(this.ind==this.iszero)
return 0;lodigit=this.mant.length-1;if(this.exp<0)
{lodigit=lodigit+this.exp;if((!(this.allzero(this.mant,lodigit+1))))
throw"intValueExact(): Decimal part non-zero: "+this.toString();if(lodigit<0)
return 0;useexp=0;}
else
{if((this.exp+lodigit)>9)
throw"intValueExact(): Conversion overflow: "+this.toString();useexp=this.exp;}
result=0;{var $16=lodigit+useexp;i=0;i:for(;i<=$16;i++){result=result*10;if(i<=lodigit)
result=result+this.mant[i];}}
if((lodigit+useexp)==9)
{topdig=div(result,1000000000);if(topdig!=this.mant[0])
{if(result==-2147483648)
if(this.ind==this.isneg)
if(this.mant[0]==2)
return result;throw"intValueExact(): Conversion overflow: "+this.toString();}}
if(this.ind==this.ispos)
return result;return-result;}
function movePointLeft(n){var res;res=this.clone(this);res.exp=res.exp-n;return res.finish(this.plainMC,false);}
function movePointRight(n){var res;res=this.clone(this);res.exp=res.exp+n;return res.finish(this.plainMC,false);}
function scale(){if(this.exp>=0)
return 0;return-this.exp;}
function setScale(){var round;if(setScale.arguments.length==2)
{round=setScale.arguments[1];}
else if(setScale.arguments.length==1)
{round=this.ROUND_UNNECESSARY;}
else
{throw"setScale(): "+setScale.arguments.length+" given; expected 1 or 2"}
var scale=setScale.arguments[0];var ourscale;var res;var padding=0;var newlen=0;ourscale=this.scale();if(ourscale==scale)
if(this.form==MathContext.prototype.PLAIN)
return this;res=this.clone(this);if(ourscale<=scale)
{if(ourscale==0)
padding=res.exp+scale;else
padding=scale-ourscale;res.mant=this.extend(res.mant,res.mant.length+padding);res.exp=-scale;}
else
{if(scale<0)
throw"setScale(): Negative scale: "+scale;newlen=res.mant.length-((ourscale-scale));res=res.round(newlen,round);if(res.exp!=(-scale))
{res.mant=this.extend(res.mant,res.mant.length+1);res.exp=res.exp-1;}}
res.form=MathContext.prototype.PLAIN;return res;}
function signum(){return this.ind;}
function toString(){return this.layout().join("");}
function layout(){var cmant;var i=0;var sb=null;var euse=0;var sig=0;var csign=0;var rec=null;var needsign;var mag;var len=0;cmant=new Array(this.mant.length);{var $18=this.mant.length;i=0;i:for(;$18>0;$18--,i++){cmant[i]=this.mant[i]+'';}}
if(this.form!=MathContext.prototype.PLAIN)
{sb="";if(this.ind==this.isneg)
sb+='-';euse=(this.exp+cmant.length)-1;if(this.form==MathContext.prototype.SCIENTIFIC)
{sb+=cmant[0];if(cmant.length>1)
sb+='.';sb+=cmant.slice(1).join("");}
else
{engineering:do{sig=euse%3;if(sig<0)
sig=3+sig;euse=euse-sig;sig++;if(sig>=cmant.length)
{sb+=cmant.join("");{var $19=sig-cmant.length;for(;$19>0;$19--){sb+='0';}}}
else
{sb+=cmant.slice(0,sig).join("");sb+='.';sb+=cmant.slice(sig).join("");}}while(false);}
if(euse!=0)
{if(euse<0)
{csign='-';euse=-euse;}
else
csign='+';sb+='E';sb+=csign;sb+=euse;}
return sb.split("");}
if(this.exp==0)
{if(this.ind>=0)
return cmant;rec=new Array(cmant.length+1);rec[0]='-';this.arraycopy(cmant,0,rec,1,cmant.length);return rec;}
needsign=((this.ind==this.isneg)?1:0);mag=this.exp+cmant.length;if(mag<1)
{len=(needsign+2)-this.exp;rec=new Array(len);if(needsign!=0)
rec[0]='-';rec[needsign]='0';rec[needsign+1]='.';{var $20=-mag;i=needsign+2;i:for(;$20>0;$20--,i++){rec[i]='0';}}
this.arraycopy(cmant,0,rec,(needsign+2)-mag,cmant.length);return rec;}
if(mag>cmant.length)
{len=needsign+mag;rec=new Array(len);if(needsign!=0)
rec[0]='-';this.arraycopy(cmant,0,rec,needsign,cmant.length);{var $21=mag-cmant.length;i=needsign+cmant.length;i:for(;$21>0;$21--,i++){rec[i]='0';}}
return rec;}
len=(needsign+1)+cmant.length;rec=new Array(len);if(needsign!=0)
rec[0]='-';this.arraycopy(cmant,0,rec,needsign,mag);rec[needsign+mag]='.';this.arraycopy(cmant,mag,rec,(needsign+mag)+1,cmant.length-mag);return rec;}
function intcheck(min,max){var i;i=this.intValueExact();if((i<min)||(i>max))
throw"intcheck(): Conversion overflow: "+i;return i;}
function dodivide(code,rhs,set,scale){var lhs;var reqdig;var newexp;var res;var newlen;var var1;var var1len;var var2;var var2len;var b2b;var have;var thisdigit=0;var i=0;var v2=0;var ba=0;var mult=0;var start=0;var padding=0;var d=0;var newvar1=null;var lasthave=0;var actdig=0;var newmant=null;if(set.lostDigits)
this.checkdigits(rhs,set.digits);lhs=this;if(rhs.ind==0)
throw"dodivide(): Divide by 0";if(lhs.ind==0)
{if(set.form!=MathContext.prototype.PLAIN)
return this.ZERO;if(scale==(-1))
return lhs;return lhs.setScale(scale);}
reqdig=set.digits;if(reqdig>0)
{if(lhs.mant.length>reqdig)
lhs=this.clone(lhs).round(set);if(rhs.mant.length>reqdig)
rhs=this.clone(rhs).round(set);}
else
{if(scale==(-1))
scale=lhs.scale();reqdig=lhs.mant.length;if(scale!=(-lhs.exp))
reqdig=(reqdig+scale)+lhs.exp;reqdig=(reqdig-((rhs.mant.length-1)))-rhs.exp;if(reqdig<lhs.mant.length)
reqdig=lhs.mant.length;if(reqdig<rhs.mant.length)
reqdig=rhs.mant.length;}
newexp=((lhs.exp-rhs.exp)+lhs.mant.length)-rhs.mant.length;if(newexp<0)
if(code!='D')
{if(code=='I')
return this.ZERO;return this.clone(lhs).finish(set,false);}
res=new BigDecimal();res.ind=(lhs.ind*rhs.ind);res.exp=newexp;res.mant=this.createArrayWithZeros(reqdig+1);newlen=(reqdig+reqdig)+1;var1=this.extend(lhs.mant,newlen);var1len=newlen;var2=rhs.mant;var2len=newlen;b2b=(var2[0]*10)+1;if(var2.length>1)
b2b=b2b+var2[1];have=0;{outer:for(;;){thisdigit=0;{inner:for(;;){if(var1len<var2len)
break inner;if(var1len==var2len)
{{compare:do{{var $22=var1len;i=0;i:for(;$22>0;$22--,i++){if(i<var2.length)
v2=var2[i];else
v2=0;if(var1[i]<v2)
break inner;if(var1[i]>v2)
break compare;}}
thisdigit++;res.mant[have]=thisdigit;have++;var1[0]=0;break outer;}while(false);}
ba=var1[0];}
else
{ba=var1[0]*10;if(var1len>1)
ba=ba+var1[1];}
mult=div((ba*10),b2b);if(mult==0)
mult=1;thisdigit=thisdigit+mult;var1=this.byteaddsub(var1,var1len,var2,var2len,-mult,true);if(var1[0]!=0)
continue inner;{var $23=var1len-2;start=0;start:for(;start<=$23;start++){if(var1[start]!=0)
break start;var1len--;}}
if(start==0)
continue inner;this.arraycopy(var1,start,var1,0,var1len);}}
if((have!=0)||(thisdigit!=0))
{res.mant[have]=thisdigit;have++;if(have==(reqdig+1))
break outer;if(var1[0]==0)
break outer;}
if(scale>=0)
if((-res.exp)>scale)
break outer;if(code!='D')
if(res.exp<=0)
break outer;res.exp=res.exp-1;var2len--;}}
if(have==0)
have=1;if((code=='I')||(code=='R'))
{if((have+res.exp)>reqdig)
throw"dodivide(): Integer overflow";if(code=='R')
{remainder:do{if(res.mant[0]==0)
return this.clone(lhs).finish(set,false);if(var1[0]==0)
return this.ZERO;res.ind=lhs.ind;padding=((reqdig+reqdig)+1)-lhs.mant.length;res.exp=(res.exp-padding)+lhs.exp;d=var1len;{i=d-1;i:for(;i>=1;i--){if(!((res.exp<lhs.exp)&&(res.exp<rhs.exp)))break;if(var1[i]!=0)
break i;d--;res.exp=res.exp+1;}}
if(d<var1.length)
{newvar1=new Array(d);this.arraycopy(var1,0,newvar1,0,d);var1=newvar1;}
res.mant=var1;return res.finish(set,false);}while(false);}}
else
{if(var1[0]!=0)
{lasthave=res.mant[have-1];if(((lasthave%5))==0)
res.mant[have-1]=(lasthave+1);}}
if(scale>=0)
{scaled:do{if(have!=res.mant.length)
res.exp=res.exp-((res.mant.length-have));actdig=res.mant.length-(((-res.exp)-scale));res.round(actdig,set.roundingMode);if(res.exp!=(-scale))
{res.mant=this.extend(res.mant,res.mant.length+1);res.exp=res.exp-1;}
return res.finish(set,true);}while(false);}
if(have==res.mant.length)
{res.round(set);have=reqdig;}
else
{if(res.mant[0]==0)
return this.ZERO;newmant=new Array(have);this.arraycopy(res.mant,0,newmant,0,have);res.mant=newmant;}
return res.finish(set,true);}
function bad(prefix,s){throw prefix+"Not a number: "+s;}
function badarg(name,pos,value){throw"Bad argument "+pos+" to "+name+": "+value;}
function extend(inarr,newlen){var newarr;if(inarr.length==newlen)
return inarr;newarr=createArrayWithZeros(newlen);this.arraycopy(inarr,0,newarr,0,inarr.length);return newarr;}
function byteaddsub(a,avlen,b,bvlen,m,reuse){var alength;var blength;var ap;var bp;var maxarr;var reb;var quickm;var digit;var op=0;var dp90=0;var newarr;var i=0;alength=a.length;blength=b.length;ap=avlen-1;bp=bvlen-1;maxarr=bp;if(maxarr<ap)
maxarr=ap;reb=null;if(reuse)
if((maxarr+1)==alength)
reb=a;if(reb==null){reb=this.createArrayWithZeros(maxarr+1);}
quickm=false;if(m==1)
quickm=true;else
if(m==(-1))
quickm=true;digit=0;{op=maxarr;op:for(;op>=0;op--){if(ap>=0)
{if(ap<alength)
digit=digit+a[ap];ap--;}
if(bp>=0)
{if(bp<blength)
{if(quickm)
{if(m>0)
digit=digit+b[bp];else
digit=digit-b[bp];}
else
digit=digit+(b[bp]*m);}
bp--;}
if(digit<10)
if(digit>=0)
{quick:do{reb[op]=digit;digit=0;continue op;}while(false);}
dp90=digit+90;reb[op]=this.bytedig[dp90];digit=this.bytecar[dp90];}}
if(digit==0)
return reb;newarr=null;if(reuse)
if((maxarr+2)==a.length)
newarr=a;if(newarr==null)
newarr=new Array(maxarr+2);newarr[0]=digit;{var $24=maxarr+1;i=0;i:for(;$24>0;$24--,i++){newarr[i+1]=reb[i];}}
return newarr;}
function diginit(){var work;var op=0;var digit=0;work=new Array((90+99)+1);{op=0;op:for(;op<=(90+99);op++){digit=op-90;if(digit>=0)
{work[op]=(digit%10);BigDecimal.prototype.bytecar[op]=(div(digit,10));continue op;}
digit=digit+100;work[op]=(digit%10);BigDecimal.prototype.bytecar[op]=((div(digit,10))-10);}}
return work;}
function clone(dec){var copy;copy=new BigDecimal();copy.ind=dec.ind;copy.exp=dec.exp;copy.form=dec.form;copy.mant=dec.mant;return copy;}
function checkdigits(rhs,dig){if(dig==0)
return;if(this.mant.length>dig)
if((!(this.allzero(this.mant,dig))))
throw"Too many digits: "+this.toString();if(rhs==null)
return;if(rhs.mant.length>dig)
if((!(this.allzero(rhs.mant,dig))))
throw"Too many digits: "+rhs.toString();return;}
function round(){var len;var mode;if(round.arguments.length==2)
{len=round.arguments[0];mode=round.arguments[1];}
else if(round.arguments.length==1)
{var set=round.arguments[0];len=set.digits;mode=set.roundingMode;}
else
{throw"round(): "+round.arguments.length+" arguments given; expected 1 or 2";}
var adjust;var sign;var oldmant;var reuse=false;var first=0;var increment;var newmant=null;adjust=this.mant.length-len;if(adjust<=0)
return this;this.exp=this.exp+adjust;sign=this.ind;oldmant=this.mant;if(len>0)
{this.mant=new Array(len);this.arraycopy(oldmant,0,this.mant,0,len);reuse=true;first=oldmant[len];}
else
{this.mant=this.ZERO.mant;this.ind=this.iszero;reuse=false;if(len==0)
first=oldmant[0];else
first=0;}
increment=0;{modes:do{if(mode==this.ROUND_HALF_UP)
{if(first>=5)
increment=sign;}
else if(mode==this.ROUND_UNNECESSARY)
{if((!(this.allzero(oldmant,len))))
throw"round(): Rounding necessary";}
else if(mode==this.ROUND_HALF_DOWN)
{if(first>5)
increment=sign;else
if(first==5)
if((!(this.allzero(oldmant,len+1))))
increment=sign;}
else if(mode==this.ROUND_HALF_EVEN)
{if(first>5)
increment=sign;else
if(first==5)
{if((!(this.allzero(oldmant,len+1))))
increment=sign;else
if((((this.mant[this.mant.length-1])%2))==1)
increment=sign;}}
else if(mode==this.ROUND_DOWN);else if(mode==this.ROUND_UP)
{if((!(this.allzero(oldmant,len))))
increment=sign;}
else if(mode==this.ROUND_CEILING)
{if(sign>0)
if((!(this.allzero(oldmant,len))))
increment=sign;}
else if(mode==this.ROUND_FLOOR)
{if(sign<0)
if((!(this.allzero(oldmant,len))))
increment=sign;}
else{throw"round(): Bad round value: "+mode;}}while(false);}
if(increment!=0)
{bump:do{if(this.ind==this.iszero)
{this.mant=this.ONE.mant;this.ind=increment;}
else
{if(this.ind==this.isneg)
increment=-increment;newmant=this.byteaddsub(this.mant,this.mant.length,this.ONE.mant,1,increment,reuse);if(newmant.length>this.mant.length)
{this.exp++;this.arraycopy(newmant,0,this.mant,0,this.mant.length);}
else
this.mant=newmant;}}while(false);}
if(this.exp>this.MaxExp)
throw"round(): Exponent Overflow: "+this.exp;return this;}
function allzero(array,start){var i=0;if(start<0)
start=0;{var $25=array.length-1;i=start;i:for(;i<=$25;i++){if(array[i]!=0)
return false;}}
return true;}
function finish(set,strip){var d=0;var i=0;var newmant=null;var mag=0;var sig=0;if(set.digits!=0)
if(this.mant.length>set.digits)
this.round(set);if(strip)
if(set.form!=MathContext.prototype.PLAIN)
{d=this.mant.length;{i=d-1;i:for(;i>=1;i--){if(this.mant[i]!=0)
break i;d--;this.exp++;}}
if(d<this.mant.length)
{newmant=new Array(d);this.arraycopy(this.mant,0,newmant,0,d);this.mant=newmant;}}
this.form=MathContext.prototype.PLAIN;{var $26=this.mant.length;i=0;i:for(;$26>0;$26--,i++){if(this.mant[i]!=0)
{if(i>0)
{delead:do{newmant=new Array(this.mant.length-i);this.arraycopy(this.mant,i,newmant,0,this.mant.length-i);this.mant=newmant;}while(false);}
mag=this.exp+this.mant.length;if(mag>0)
{if(mag>set.digits)
if(set.digits!=0)
this.form=set.form;if((mag-1)<=this.MaxExp)
return this;}
else
if(mag<(-5))
this.form=set.form;mag--;if((mag<this.MinExp)||(mag>this.MaxExp))
{overflow:do{if(this.form==MathContext.prototype.ENGINEERING)
{sig=mag%3;if(sig<0)
sig=3+sig;mag=mag-sig;if(mag>=this.MinExp)
if(mag<=this.MaxExp)
break overflow;}
throw"finish(): Exponent Overflow: "+mag;}while(false);}
return this;}}}
this.ind=this.iszero;{if(set.form!=MathContext.prototype.PLAIN)
this.exp=0;else if(this.exp>0)
this.exp=0;else{if(this.exp<this.MinExp)
throw"finish(): Exponent Overflow: "+this.exp;}}
this.mant=this.ZERO.mant;return this;}