!this.Cola&&(this.Cola={});Cola.getSource=function(url){varxhr=newXMLHttpRequest;xhr.open("GET",url,false);xhr.send();returnxhr.responseText};Cola.dirname=function(dir){returndir.replace(/\/[^\/]*$/,"")};Cola.notRoot=function(path){returnpath[0]!="/"&&!/^http/.test(path)};Cola.translate=function(source,opts){varstream=newCola.OutputStream({beautify:true}),ast;try{ast=Cola.parse(source).toJavaScript(opts);ast.print(stream);returnstream.toString()}catch(e){throwe}};Cola.eval=function(source,opts){returneval.call(this,Cola.translate(source,opts))};Cola.bootstraped=false;Cola.bootstrap=function(){if(Cola.bootstraped)return;Cola.bootstraped=true;Array.prototype.forEach.call(document.querySelectorAll('script[type="text/colascript"][src]'),function(script){if(/\.js$/.test(script.src))eval.call(window,Cola.getSource(script.src));elseCola.eval.call(window,Cola.getSource(script.src),{path:Cola.dirname(script.src)})});varevent=document.createEvent("HTMLEvents");event.initEvent("DOMContentLoaded",true,true);event.eventName="DOMContentLoaded";window.dispatchEvent(event);event=document.createEvent("HTMLEvents");event.initEvent("load",true,true);event.eventName="load";window.dispatchEvent(event)};"use strict";Cola.array_to_hash=function(a){varret=Object.create(null);for(vari=0;i<a.length;++i)ret[a[i]]=true;returnret};Cola.slice=function(a,start){returnArray.prototype.slice.call(a,start||0)};Cola.characters=function(str){returnstr.split("")};Cola.member=function(name,array){for(vari=array.length;--i>=0;)if(array[i]==name)returntrue;returnfalse};Cola.find_if=function(func,array){for(vari=0,n=array.length;i<n;++i){if(func(array[i]))returnarray[i]}};Cola.repeat_string=function(str,i){if(i<=0)return"";if(i==1)returnstr;vard=Cola.repeat_string(str,i>>1);d+=d;if(i&1)d+=str;returnd};Cola.DefaultsError=function(msg,defs){Error.call(this,msg);this.msg=msg;this.defs=defs};Cola.DefaultsError.prototype=Object.create(Error.prototype);Cola.DefaultsError.prototype.constructor=Cola.DefaultsError;Cola.DefaultsError.croak=function(msg,defs){thrownewCola.DefaultsError(msg,defs)};Cola.defaults=function(args,defs,croak){if(args===true)args={};varret=args||{};if(croak)for(variinret)if(ret.hasOwnProperty(i)&&!defs.hasOwnProperty(i))Cola.DefaultsError.croak("`"+i+"` is not a supported option",defs);for(variindefs)if(defs.hasOwnProperty(i)){ret[i]=args&&args.hasOwnProperty(i)?args[i]:defs[i]}returnret};Cola.merge=function(obj,ext){for(variinext)if(ext.hasOwnProperty(i)){obj[i]=ext[i]}returnobj};Cola.noop=function(){};Cola.MAP=function(){functionMAP(a,f,backwards){varret=[],top=[],i;functiondoit(){varval=f(a[i],i);varis_last=valinstanceofLast;if(is_last)val=val.v;if(valinstanceofContinue)returnfalse;if(valinstanceofAtTop){val=val.v;if(valinstanceofSplice){top.push.apply(top,backwards?val.v.slice().reverse():val.v)}else{top.push(val)}}elseif(val!==skip){if(valinstanceofSplice){ret.push.apply(ret,backwards?val.v.slice().reverse():val.v)}else{ret.push(val)}}returnis_last}if(ainstanceofArray){if(backwards){for(i=a.length;--i>=0;)if(doit())break;ret.reverse();top.reverse()}else{for(i=0;i<a.length;++i)if(doit())break}}else{for(iina)if(a.hasOwnProperty(i))if(doit())break}returntop.concat(ret)}MAP.at_top=function(val){returnnewAtTop(val)};MAP.splice=function(val){returnnewSplice(val)};MAP.last=function(val){returnnewLast(val)};MAP.continue=function(){returnnewContinue};varskip=MAP.skip={};functionAtTop(val){this.v=val}functionSplice(val){this.v=val}functionLast(val){this.v=val}functionContinue(){}returnMAP}();Cola.push_uniq=function(array,el){if(array.indexOf(el)<0)array.push(el)};Cola.string_template=function(text,props){returntext.replace(/\{(.+?)\}/g,function(str,p){returnprops[p]})};Cola.remove=function(array,el){for(vari=array.length;--i>=0;){if(array[i]===el)array.splice(i,1)}};Cola.mergeSort=function(array,cmp){if(array.length<2)returnarray.slice();functionmerge(a,b){varr=[],ai=0,bi=0,i=0;while(ai<a.length&&bi<b.length){cmp(a[ai],b[bi])<=0?r[i++]=a[ai++]:r[i++]=b[bi++]}if(ai<a.leng
Cola.AST_Boolean=Cola.DEFNODE("Boolean",null,{$documentation:"Base class for booleans"},Cola.AST_Atom);Cola.AST_False=Cola.DEFNODE("False",null,{$documentation:"The `false` atom",value:false},Cola.AST_Boolean);Cola.AST_True=Cola.DEFNODE("True",null,{$documentation:"The `true` atom",value:true},Cola.AST_Boolean);Cola.TreeWalker=function(callback){this.visit=callback;this.stack=[]};Cola.TreeWalker.prototype={_visit:function(node,descend){this.stack.push(node);varret=this.visit(node,descend?function(){descend.call(node)}:Cola.noop);if(!ret&&descend){descend.call(node)}this.stack.pop();returnret},parent:function(n){returnthis.stack[this.stack.length-2-(n||0)]},push:function(node){this.stack.push(node)},pop:function(){returnthis.stack.pop()},self:function(){returnthis.stack[this.stack.length-1]},find_parent:function(type){varstack=this.stack;for(vari=stack.length;--i>=0;){varx=stack[i];if(xinstanceoftype)returnx}},has_directive:function(type){returnthis.find_parent(Cola.AST_Scope).has_directive(type)},in_boolean_context:function(){varstack=this.stack;vari=stack.length,self=stack[--i];while(i>0){varp=stack[--i];if(pinstanceofCola.AST_If&&p.condition===self||pinstanceofCola.AST_Conditional&&p.condition===self||pinstanceofCola.AST_DWLoop&&p.condition===self||pinstanceofCola.AST_For&&p.condition===self||pinstanceofCola.AST_UnaryPrefix&&p.operator=="!"&&p.expression===self){returntrue}if(!(pinstanceofCola.AST_Binary&&(p.operator=="&&"||p.operator=="||")))returnfalse;self=p}},loopcontrol_target:function(label){varstack=this.stack;if(label)for(vari=stack.length;--i>=0;){varx=stack[i];if(xinstanceofCola.AST_LabeledStatement&&x.label.name==label.name){returnx.body}}elsefor(vari=stack.length;--i>=0;){varx=stack[i];if(xinstanceofCola.AST_Switch||xinstanceofCola.AST_IterationStatement)returnx}}};"use strict";!this.Cola&&(this.Cola={});Cola.KEYWORDS="break case catch const continue debugger default delete do else finally for function if in instanceof new return switch throw try typeof var void while with";Cola.cKEYWORDS=Cola.KEYWORDS.replace(" void","")+" when clone isset is isnt class singleton injector";Cola.KEYWORDS_ATOM="false null true";Cola.cKEYWORDS_ATOM=Cola.KEYWORDS_ATOM+" on yes off no";Cola.RESERVED_WORDS="abstract boolean byte char double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized this throws transient volatile yield";Cola.cRESERVED_WORDS=Cola.RESERVED_WORDS.replace(" class","")+" "+Cola.cKEYWORDS_ATOM+" "+Cola.cKEYWORDS;Cola.RESERVED_WORDS+=" "+Cola.KEYWORDS_ATOM+" "+Cola.KEYWORDS;Cola.KEYWORDS_BEFORE_EXPRESSION="return new delete throw else case";Cola.cKEYWORDS_BEFORE_EXPRESSION=Cola.KEYWORDS_BEFORE_EXPRESSION+=" when";Cola.KEYWORDS=Cola.makePredicate(Cola.KEYWORDS);Cola.cKEYWORDS=Cola.makePredicate(Cola.cKEYWORDS);Cola.RESERVED_WORDS=Cola.makePredicate(Cola.RESERVED_WORDS);Cola.cRESERVED_WORDS=Cola.makePredicate(Cola.cRESERVED_WORDS);Cola.KEYWORDS_ATOM=Cola.makePredicate(Cola.KEYWORDS_ATOM);Cola.cKEYWORDS_ATOM=Cola.makePredicate(Cola.cKEYWORDS_ATOM);Cola.KEYWORDS_BEFORE_EXPRESSION=Cola.makePredicate(Cola.KEYWORDS_BEFORE_EXPRESSION);Cola.cKEYWORDS_BEFORE_EXPRESSION=Cola.makePredicate(Cola.cKEYWORDS_BEFORE_EXPRESSION);Cola.OPERATOR_CHARS=Cola.makePredicate(Cola.characters("+-*&%=<>!?|~^"));Cola.RE_HEX_NUMBER=/^0x[0-9a-f]+$/i;Cola.RE_OCT_NUMBER=/^0[0-7]+$/;Cola.RE_DEC_NUMBER=/^\d*\.?\d*(?:e[+-]?\d*(?:\d\.?|\.?\d)\d*)?$/i;Cola.OPERATORS=["in","instanceof","typeof","new","delete","++","--","+","-","!","~","&","|","^","*","/","%",">>","<<",">>>","<",">","<=",">=","==","===","!=","!==","?","=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","|=","^=","&=","&&","||","clone","isset","is","isnt","**","%%","?="];Cola.cOPERATORS=Cola.makePredicate(Cola.OPERATORS);Cola.OPERATORS=Cola.OPERATORS.slice(0,Cola.OPERATORS.length-7);Cola.OPERATORS.push("void");Cola.OPERATORS=Cola.makePredicate(Cola.OPERATORS);Cola.COMPARISON=Cola.makePredicate("< > <= >= == === != !==");Cola.WHITESPACE_CHARS=Cola.makePr
};Cola.Parser.prototype.parenthesised=function(){this.expect("(");varexp=this.expression(true);this.expect(")");returnexp};Cola.Parser.embed_tokens=function(parser){returnfunction(){varstart=this.S.token;varexpr=parser.apply(this,arguments);varend=this.prev();expr.start=start;expr.end=end;returnexpr}};Cola.Parser.prototype.handle_regexp=function(){if(this.is("operator","/")||this.is("operator","/=")){this.S.peeked=null;this.S.token=this.S.input(this.S.token.value.substr(1))}};Cola.Parser.prototype.statement=Cola.Parser.embed_tokens(function(){vartmp,type,_this=this;this.handle_regexp();switch(this.S.token.type){case"string":vardir=this.S.in_directives,stat=this.simple_statement();if(dir&&stat.bodyinstanceofCola.AST_String&&!this.is("punc",","))returnnewCola.AST_Directive({value:stat.body.value});returnstat;case"num":case"regexp":case"operator":case"atom":returnthis.simple_statement();case"name":if(!this.is_js&&this.next_is("name")){type=this.S.token.value,this.next();if(this.next_is("punc","("))returnthis.function_(Cola.AST_Defun,type);returntmp=this.var_(false,type),this.semicolon(),tmp}if(!this.is_js){var_this=this,balance=1,isfun=false;this.dumpS();this.next();if(this.is("punc","(")){this.next();this.next_until(function(){if(_this.is("punc","("))balance++;elseif(_this.is("punc",")"))balance--;returnbalance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"))}this.restoreS();if(isfun)returnthis.function_(Cola.AST_Defun)}returnthis.next_is("punc",":")?this.labeled_statement():this.simple_statement();case"punc":switch(this.S.token.value){case"@":if(!this.is_js&&this.next_is("name"))returnnewCola.AST_Command({name:this.next().value,args:function(name){varargs=[];if(name=="require"||name=="include"){while(!this.peek().nlb&&!this.next_is("eof")){this.next();if(!this.is("string"))this.unexpected();args.push(this.S.token.value)}this.next()}elseif(name=="use"){this.next();if(!this.is("name"))this.unexpected();args.push(this.S.token.value);if(this.S.token.value=="closure"){this.next();args.push(this.is("punc","{"),newCola.AST_BlockStatement({start:this.S.token,body:this.block_(!this.is("punc","{")),end:this.prev()}))}elseif(this.S.token.value!="asm"&&this.S.token.value!="strict")this.unexpected()}elsethis.unexpected();returnargs}.call(this,this.S.token.value)});case"{":if(this.is_js)returnnewCola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});this.dumpS();varbalance=0,is_object=false;this.next_until(function(){if(_this.is("punc","{"))balance++;elseif(_this.is("punc","}"))balance--;returnbalance==0||_this.is("eof")});is_object=this.next_is("operator");this.restoreS();if(is_object)returnthis.simple_statement();returnnewCola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});case"[":case"(":returnthis.simple_statement();case";":this.next();returnnewCola.AST_EmptyStatement;default:this.unexpected()}case"keyword":switch(tmp=this.S.token.value,this.next(),tmp){case"break":returnthis.break_cont(Cola.AST_Break);case"continue":returnthis.break_cont(Cola.AST_Continue);case"debugger":this.semicolon();returnnewCola.AST_Debugger;case"do":returnnewCola.AST_Do({body:this.in_loop(function(){returnthis.statement()}),condition:(this.expect_token("keyword","while"),tmp=this.parenthesised(),this.semicolon(),tmp)});case"while":returnnewCola.AST_While({condition:this.parenthesised(),body:this.in_loop(function(){returnthis.statement()})});case"for":returnthis.for_();case"function":returnthis.function_(Cola.AST_Defun);case"if":returnthis.if_();case"return":if(this.S.in_function==0)this.croak("'return' outside of function");returnnewCola.AST_Return({value:this.is("punc",";")?(this.next(),null):this.can_insert_semicolon()?null:(tmp=this.expression(true),this.semicolon(),tmp)});case"switch":returnnewCola.AST_Switch({expression:this.is("punc","{")&&!this.is_js?newCola.AST_Noop:this.parenthesised(),body:this.in_loop(this.switch_body_)});case"throw":if(this.S.token.nlb)this.croak("Illegal newline after 'throw'");re