diff --git a/README.md b/README.md index bc319ee8..f406dd4d 100644 --- a/README.md +++ b/README.md @@ -360,10 +360,33 @@ As you see, you can use keyword `when`, it's like `case`, but if the condition i Future plans === - Use inline `isset` expression instead function. status: done -- Use inline `is`. -- `some is NaN` to `isNaN(some)` status: done -- operator `?` instead `isset`, fix the operator with function call +- Use inline `is`. status: done +- `some is NaN` to `isNaN(some)`. status: done +- operator `?` instead `isset`. status: done +- rename runtime prefix `$_cola` to `_ColaRuntime$$`. status: done +- dotal names of refs: done + + String String::replaceAll(a, b){ + String res = this; + while(res.indexOf(a) != -1) res = res.replace(a, b); + return res; + } + + // or + + Object data = someData; + int data.getFriendsCount() => this.friends.length; + - operator `?.` +- Negate array accessor ( getter ) + + arr[-1]; // last element + + only for static negate index, for other cases you can use `%` unary prefix: + + int index = -10; + arr[%index] = 34; // arr[index %% arr.length]; + - operator `?` to sign an argument as not-required int sqr(int x) => x ** 2; @@ -374,22 +397,16 @@ Future plans int sqrt(int x?) => x ** 2; sqr(); // NaN -- Negate array accessor ( getter ) - - arr[-1]; // last element - - only for static negate index, for other cases you can use `%` unary prefix: - - int index = -10; - arr[%index] = 34; // arr[index %% arr.length]; - - static typing -- rename runtime prefix `$_cola` to `_crt$$` -- `@use klosure` wrapped code will be execute on `DOMContentLoaded`, `main` functions will triggered firstly: +- `@use` expressions + + @use strict closure + +- `@use await closure` wrapped code will be execute on `DOMContentLoaded`, `main` functions will triggered firstly: // cola - @use klosure + @use await closure main(){ alert('loaded!'); @@ -406,36 +423,7 @@ Future plans document.addEventListener('DOMContentLoaded', function(){ document.title = "Page"; }, false); - -- inline using of `@use` - - @use meteor - @use strict - - @use closure - - // or you can... - - @use meteor strict closure - - -- dotal names of refs - - String String::replaceAll(a, b){ - String res = this; - while(res.indexOf(a) != -1) res = res.replace(a, b); - return res; - } - - // or - - Object data = someData; - int data.getFriendsCount() => this.friends.length; - - // or - - Cola.AST_Node node = new Cola.AST_Node; - + - interface interface UserProfile { @@ -448,10 +436,10 @@ Future plans class A { - private int a = 123; - protected var o = {}; - + int a = 123; readonly String about = "class"; + + $("button").click(() => console.log("Button Clicked!")); A(a){ about = "some else"; @@ -510,12 +498,6 @@ Future plans return res; } } - -- destructed function arguments - - test({String name, String login, String photoUrl}){ - console.log(name, login, photoUrl); - } - ES6 `for` @@ -530,24 +512,6 @@ Future plans @import dirname from 'path' String code = fs.readFileSync(dirname(filePath) + "/main.cola", "utf8"); - -- set parameters to calling function - - $(".btn").on("click", *(){ - this; // parent context - }); - -- namespaces, name of namespace must be cupitalized - - @use Cola { - - class AST_Node { - ... - } - - } - - Cola.AST_Node node = new Cola.AST_Node(); - write documentation of tokenizer/parser methods diff --git a/lib/ast.js b/lib/ast.js index 62e88485..78b52787 100644 --- a/lib/ast.js +++ b/lib/ast.js @@ -719,6 +719,16 @@ Cola.AST_Proto = Cola.DEFNODE("Proto", null, { } }, Cola.AST_PropAccess); +Cola.AST_CondAccess = Cola.DEFNODE("CondAccess", null, { + $iscola: true, + $documentation: "Conditional accessor", + _walk: function(visitor) { + return visitor._visit(this, function(){ + this.expression._walk(visitor); + }); + } +}, Cola.AST_PropAccess); + Cola.AST_Cascade = Cola.DEFNODE("Cascade", "expression subexpressions", { $iscola: true, $documentation: "Base class for properties access expressions, i.e. `a..foo..bar`", diff --git a/lib/browser-cola.js b/lib/browser-cola.js index 5c0fb968..9f2c45a7 100644 --- a/lib/browser-cola.js +++ b/lib/browser-cola.js @@ -1,7 +1,7 @@ !this.Cola&&(this.Cola={});Cola.getSource=function(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send();return xhr.responseText};Cola.dirname=function(dir){return dir.replace(/\/[^\/]*$/,"")};Cola.notRoot=function(path){return path[0]!="/"&&!/^http/.test(path)};Cola.translate=function(source,opts){var stream=new Cola.OutputStream({beautify:true}),ast;try{ast=Cola.parse(source).toJavaScript(opts);ast.print(stream);return stream.toString()}catch(e){throw e}};Cola.eval=function(source,opts){return eval.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));else Cola.eval.call(window,Cola.getSource(script.src),{path:Cola.dirname(script.src)})});var event=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){var ret=Object.create(null);for(var i=0;i=0;)if(array[i]==name)return true;return false};Cola.find_if=function(func,array){for(var i=0,n=array.length;i>1);d+=d;if(i&1)d+=str;return d};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){throw new Cola.DefaultsError(msg,defs)};Cola.defaults=function(args,defs,croak){if(args===true)args={};var ret=args||{};if(croak)for(var i in ret)if(ret.hasOwnProperty(i)&&!defs.hasOwnProperty(i))Cola.DefaultsError.croak("`"+i+"` is not a supported option",defs);for(var i in defs)if(defs.hasOwnProperty(i)){ret[i]=args&&args.hasOwnProperty(i)?args[i]:defs[i]}return ret};Cola.merge=function(obj,ext){for(var i in ext)if(ext.hasOwnProperty(i)){obj[i]=ext[i]}return obj};Cola.noop=function(){};Cola.MAP=function(){function MAP(a,f,backwards){var ret=[],top=[],i;function doit(){var val=f(a[i],i);var is_last=val instanceof Last;if(is_last)val=val.v;if(val instanceof Continue)return false;if(val instanceof AtTop){val=val.v;if(val instanceof Splice){top.push.apply(top,backwards?val.v.slice().reverse():val.v)}else{top.push(val)}}else if(val!==skip){if(val instanceof Splice){ret.push.apply(ret,backwards?val.v.slice().reverse():val.v)}else{ret.push(val)}}return is_last}if(a instanceof Array){if(backwards){for(i=a.length;--i>=0;)if(doit())break;ret.reverse();top.reverse()}else{for(i=0;i=0;){if(array[i]===el)array.splice(i,1)}};Cola.mergeSort=function(array,cmp){if(array.length<2)return array.slice();function merge(a,b){var r=[],ai=0,bi=0,i=0;while(ai=0})};Cola.makePredicate=function(words){if(!(words instanceof Array))words=words.split(" ");var f="",cats=[];out:for(var i=0;i3){cats.sort(function(a,b){return b.length-a.length});f+="switch(str.length){";for(var i=0;i=0;)if(!predicate(array[i]))return false;return true};Cola.Dictionary=function(){this._values=Object.create(null);this._size=0};Cola.Dictionary.prototype={set:function(key,val){if(!this.has(key))++this._size;this._values["$"+key]=val;return this},add:function(key,val){if(this.has(key)){this.get(key).push(val)}else{this.set(key,[val])}return this},get:function(key){return this._values["$"+key]},del:function(key){if(this.has(key)){--this._size;delete this._values["$"+key]}return this},has:function(key){return"$"+key in this._values},each:function(f){for(var i in this._values)f(this._values[i],i.substr(1))},size:function(){return this._size},map:function(f){var ret=[];for(var i in this._values)ret.push(f(this._values[i],i.substr(1)));return ret}};Cola.clone=function(item){if(item===undefined||item===null)return item;if(item.__clone__ instanceof Function)return item.__clone__();var result,types=[Number,String,Boolean];for(var i in types)if(types.hasOwnProperty(i)&&item instanceof types[i])return type(item);if(item.__proto__===Array.prototype){result=[];item.forEach(function(child,index,array){result[index]=Cola.clone(child)});return result}if(!(item instanceof Object))return item;if(item.nodeType&&item.cloneNode instanceof Function)return item.cloneNode(true);if(!item.prototype){if(item instanceof Date)return new Date(item);if(item instanceof Function)return item;result={};for(var i in item)result[i]=Cola.clone(item[i]);result.__proto__=item.__proto__;return result}return item};"use strict";!this.Cola&&(this.Cola={});Cola.DEFNODE=function(type,props,methods,base){if(arguments.length<4)base=Cola.AST_Node;if(!props)props=[];else props=props.split(/\s+/);var self_props=props;if(base&&base.PROPS)props=props.concat(base.PROPS);var code="return function AST_"+type+"(props){ if (props) { ";for(var i=props.length;--i>=0;){if(props[i]=="start"||props[i]=="end")code+="this."+props[i]+" = props."+props[i]+" || new Cola.AST_Token();";else code+="this."+props[i]+" = props."+props[i]+";"}var proto=base&&new base;if(proto&&proto.initialize||methods&&methods.initialize)code+="this.initialize();";code+=type=="Token"?"}}":"} else { this.end = new Cola.AST_Token(); this.start = new Cola.AST_Token(); } }";var ctor=new Function(code)();if(proto){ctor.prototype=proto;ctor.BASE=base}if(base)base.SUBCLASSES.push(ctor);ctor.prototype.CTOR=ctor;ctor.PROPS=props||null;ctor.SELF_PROPS=self_props;ctor.SUBCLASSES=[];if(type){ctor.prototype.TYPE=ctor.TYPE=type}if(methods)for(i in methods)if(methods.hasOwnProperty(i)){if(/^\$/.test(i)){ctor[i.substr(1)]=methods[i]}else{ctor.prototype[i]=methods[i]}}ctor.DEFMETHOD=function(name,method){this.prototype[name]=method};return ctor};Cola.AST_Token=Cola.DEFNODE("Token","type value line col pos endpos nlb comments_before file",{clone:function(){return new this.CTOR(this)}},null);Cola.AST_Node=Cola.DEFNODE("Node","start end",{clone:function(){return new this.CTOR(this)},$documentation:"Base class of all AST nodes",$propdoc:{start:"[AST_Token] The first token of this node",end:"[AST_Token] The last token of this node"},_walk:function(visitor){return visitor._visit(this)},walk:function(visitor){return this._walk(visitor)}},null);Cola.AST_Command=Cola.DEFNODE("Command","name args",{$iscola:true,$documentation:"Compiler-command statement",$propdoc:{name:"[string] Name of command",args:"[AST_Node*] List of arguments"},_walk:function(visitor){return visitor._visit(this,function(){this.args.forEach(function(arg){arg._walk(visitor)})})}},Cola.AST_Node);Cola.AST_Noop=Cola.DEFNODE("Noop",null,null,Cola.AST_Node);Cola.AST_Node.warn_function=null;Cola.AST_Node.warn=function(txt,props){if(Cola.AST_Node.warn_function)Cola.AST_Node.warn_function(Cola.string_template(txt,props))};Cola.AST_Statement=Cola.DEFNODE("Statement",null,{$documentation:"Base class of all statements"});Cola.AST_Debugger=Cola.DEFNODE("Debugger",null,{$documentation:"Represents a debugger statement"},Cola.AST_Statement);Cola.AST_Directive=Cola.DEFNODE("Directive","value scope",{$documentation:'Represents a directive, like "use strict";',$propdoc:{value:"[string] The value of this directive as a plain string (it's not an AST_String!)",scope:"[AST_Scope/S] The scope that this directive affects"}},Cola.AST_Statement);Cola.AST_SimpleStatement=Cola.DEFNODE("SimpleStatement","body",{$documentation:"A statement consisting of an expression, i.e. a = 1 + 2",$propdoc:{body:"[AST_Node] an expression node (should not be instanceof Cola.AST_Statement)"},_walk:function(visitor){return visitor._visit(this,function(){this.body._walk(visitor)})}},Cola.AST_Statement);Cola.walk_body=function(node,visitor){if(node.body instanceof Cola.AST_Statement){node.body._walk(visitor)}else node.body.forEach(function(stat){stat._walk(visitor)})};Cola.AST_Block=Cola.DEFNODE("Block","body",{$documentation:"A body of statements (usually bracketed)",$propdoc:{body:"[AST_Statement*] an array of statements"},_walk:function(visitor){return visitor._visit(this,function(){Cola.walk_body(this,visitor)})}},Cola.AST_Statement);Cola.AST_BlockStatement=Cola.DEFNODE("BlockStatement",null,{$documentation:"A block statement"},Cola.AST_Block);Cola.AST_EmptyStatement=Cola.DEFNODE("EmptyStatement",null,{$documentation:"The empty statement (empty block or simply a semicolon)",_walk:function(visitor){return visitor._visit(this)}},Cola.AST_Statement);Cola.AST_StatementWithBody=Cola.DEFNODE("StatementWithBody","body",{$documentation:"Base class for all statements that contain one nested body: `For`, `ForIn`, `Do`, `While`, `With`",$propdoc:{body:"[AST_Statement] the body; this should always be present, even if it's an AST_EmptyStatement"},_walk:function(visitor){return visitor._visit(this,function(){this.body._walk(visitor)})}},Cola.AST_Statement);Cola.AST_LabeledStatement=Cola.DEFNODE("LabeledStatement","label",{$documentation:"Statement with a label",$propdoc:{label:"[AST_Label] a label definition"},_walk:function(visitor){return visitor._visit(this,function(){this.label._walk(visitor);this.body._walk(visitor)})}},Cola.AST_StatementWithBody);Cola.AST_IterationStatement=Cola.DEFNODE("IterationStatement",null,{$documentation:"Internal class. All loops inherit from it."},Cola.AST_StatementWithBody);Cola.AST_DWLoop=Cola.DEFNODE("DWLoop","condition",{$documentation:"Base class for do/while statements",$propdoc:{condition:"[AST_Node] the loop condition. Should not be instanceof Cola.AST_Statement"},_walk:function(visitor){return visitor._visit(this,function(){this.condition._walk(visitor);this.body._walk(visitor)})}},Cola.AST_IterationStatement);Cola.AST_Do=Cola.DEFNODE("Do",null,{$documentation:"A `do` statement"},Cola.AST_DWLoop);Cola.AST_While=Cola.DEFNODE("While",null,{$documentation:"A `while` statement"},Cola.AST_DWLoop);Cola.AST_For=Cola.DEFNODE("For","init condition step",{$documentation:"A `for` statement",$propdoc:{init:"[AST_Node?] the `for` initialization code, or null if empty",condition:"[AST_Node?] the `for` termination clause, or null if empty",step:"[AST_Node?] the `for` update clause, or null if empty"},_walk:function(visitor){return visitor._visit(this,function(){if(this.init)this.init._walk(visitor);if(this.condition)this.condition._walk(visitor);if(this.step)this.step._walk(visitor);this.body._walk(visitor)})}},Cola.AST_IterationStatement);Cola.AST_ForIn=Cola.DEFNODE("ForIn","init name object",{$documentation:"A `for ... in` statement",$propdoc:{init:"[AST_Node] the `for/in` initialization code",name:"[AST_SymbolRef?] the loop variable, only if `init` is AST_Var",object:"[AST_Node] the object that we're looping through"},_walk:function(visitor){return visitor._visit(this,function(){this.init._walk(visitor);this.object._walk(visitor);this.body._walk(visitor)})}},Cola.AST_IterationStatement);Cola.AST_With=Cola.DEFNODE("With","expression",{$documentation:"A `with` statement",$propdoc:{expression:"[AST_Node] the `with` expression"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);this.body._walk(visitor)})}},Cola.AST_StatementWithBody);Cola.AST_Scope=Cola.DEFNODE("Scope","directives variables functions uses_with uses_eval parent_scope enclosed cname",{$documentation:"Base class for all statements introducing a lexical scope",$propdoc:{directives:"[string*/S] an array of directives declared in this scope",variables:"[Object/S] a map of name -> SymbolDef for all variables/functions defined in this scope",functions:"[Object/S] like `variables`, but only lists function declarations",uses_with:"[boolean/S] tells whether this scope uses the `with` statement",uses_eval:"[boolean/S] tells whether this scope contains a direct call to the global `eval`",parent_scope:"[AST_Scope?/S] link to the parent scope",enclosed:"[SymbolDef*/S] a list of all symbol definitions that are accessed from this scope or any subscopes",cname:"[integer/S] current index for mangling variables (used internally by the mangler)"}},Cola.AST_Block);Cola.AST_Toplevel=Cola.DEFNODE("Toplevel","globals language",{$documentation:"The toplevel scope",$propdoc:{globals:"[Object/S] a map of name -> SymbolDef for all undeclared names"},wrap_enclose:function(arg_parameter_pairs){var self=this;var args=[];var parameters=[];arg_parameter_pairs.forEach(function(pair){var split=pair.split(":");args.push(split[0]);parameters.push(split[1])});var wrapped_tl="(function("+parameters.join(",")+"){ '$ORIG'; })("+args.join(",")+")";wrapped_tl=Cola.parse(wrapped_tl);wrapped_tl=wrapped_tl.transform(new Cola.TreeTransformer(function before(node){if(node instanceof Cola.AST_Directive&&node.value=="$ORIG"){return Cola.MAP.splice(self.body)}}));return wrapped_tl},wrap_commonjs:function(name,export_all){var self=this;var to_export=[];if(export_all){self.figure_out_scope();self.walk(new TreeWalker(function(node){if(node instanceof Cola.AST_SymbolDeclaration&&node.definition().global){if(!Cola.find_if(function(n){return n.name==node.name},to_export))to_export.push(node)}}))}var wrapped_tl="(function(exports, global){ global['"+name+"'] = exports; '$ORIG'; '$EXPORTS'; }({}, (function(){return this}())))";wrapped_tl=Cola.parse(wrapped_tl);wrapped_tl=wrapped_tl.transform(new Cola.TreeTransformer(function before(node){if(node instanceof Cola.AST_SimpleStatement){node=node.body;if(node instanceof Cola.AST_String)switch(node.getValue()){case"$ORIG":return Cola.MAP.splice(self.body);case"$EXPORTS":var body=[];to_export.forEach(function(sym){body.push(new Cola.AST_SimpleStatement({body:new Cola.AST_Assign({left:new Cola.AST_Sub({expression:new Cola.AST_SymbolRef({name:"exports"}),property:new Cola.AST_String({value:sym.name})}),operator:"=",right:new Cola.AST_SymbolRef(sym)})}))});return Cola.MAP.splice(body)}}}));return wrapped_tl}},Cola.AST_Scope);Cola.AST_Lambda=Cola.DEFNODE("Lambda","name argnames uses_arguments",{$documentation:"Base class for functions",$propdoc:{name:"[AST_SymbolDeclaration?] the name of this function",argnames:"[AST_SymbolFunarg*] array of function arguments",uses_arguments:"[boolean/S] tells whether this function accesses the arguments array"},_walk:function(visitor){return visitor._visit(this,function(){if(this.name)this.name._walk(visitor);this.argnames.forEach(function(arg){arg._walk(visitor)});Cola.walk_body(this,visitor)})}},Cola.AST_Scope);Cola.AST_Accessor=Cola.DEFNODE("Accessor",null,{$documentation:"A setter/getter function. The `name` property is always null."},Cola.AST_Lambda);Cola.AST_Function=Cola.DEFNODE("Function","type",{$documentation:"A function expression"},Cola.AST_Lambda);Cola.AST_Defun=Cola.DEFNODE("Defun","type",{$documentation:"A function definition"},Cola.AST_Lambda);Cola.AST_Namedarg=Cola.DEFNODE("Namedarg","start end name value",{$iscola:true,$documentation:"Named argument",$propdoc:{value:"Value of named argument"},_walk:function(visitor){return visitor._visit(this,function(){this.value._walk(visitor)})}},Cola.AST_SymbolRef);Cola.AST_ArgDef=Cola.DEFNODE("ArgDef","start end name type argtype defval",{$iscola:true,$documentation:"A function argument expression",$propdoc:{type:"Data type",argtype:"positional/named/splated"},_walk:function(visitor){return visitor._visit(this,function(){this.name._walk(visitor)})}},Cola.AST_SymbolFunarg);Cola.AST_Jump=Cola.DEFNODE("Jump",null,{$documentation:"Base class for “jumps” (for now that's `return`, `throw`, `break` and `continue`)"},Cola.AST_Statement);Cola.AST_Exit=Cola.DEFNODE("Exit","value",{$documentation:"Base class for “exits” (`return` and `throw`)",$propdoc:{value:"[AST_Node?] the value returned or thrown by this statement; could be null for AST_Return"},_walk:function(visitor){return visitor._visit(this,this.value&&function(){this.value._walk(visitor)})}},Cola.AST_Jump);Cola.AST_Return=Cola.DEFNODE("Return",null,{$documentation:"A `return` statement"},Cola.AST_Exit);Cola.AST_Throw=Cola.DEFNODE("Throw",null,{$documentation:"A `throw` statement"},Cola.AST_Exit);Cola.AST_LoopControl=Cola.DEFNODE("LoopControl","label",{$documentation:"Base class for loop control statements (`break` and `continue`)",$propdoc:{label:"[AST_LabelRef?] the label, or null if none"},_walk:function(visitor){return visitor._visit(this,this.label&&function(){this.label._walk(visitor)})}},Cola.AST_Jump);Cola.AST_Break=Cola.DEFNODE("Break",null,{$documentation:"A `break` statement"},Cola.AST_LoopControl);Cola.AST_Continue=Cola.DEFNODE("Continue",null,{$documentation:"A `continue` statement"},Cola.AST_LoopControl);Cola.AST_If=Cola.DEFNODE("If","condition alternative inline",{$documentation:"A `if` statement",$propdoc:{condition:"[AST_Node] the `if` condition",alternative:"[AST_Statement?] the `else` part, or null if not present"},_walk:function(visitor){return visitor._visit(this,function(){this.condition._walk(visitor);this.body._walk(visitor);if(this.alternative)this.alternative._walk(visitor)})}},Cola.AST_StatementWithBody);Cola.AST_Switch=Cola.DEFNODE("Switch","expression",{$documentation:"A `switch` statement",$propdoc:{expression:"[AST_Node] the `switch` “discriminant”"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);Cola.walk_body(this,visitor)})}},Cola.AST_Block);Cola.AST_SwitchBranch=Cola.DEFNODE("SwitchBranch",null,{$documentation:"Base class for `switch` branches"},Cola.AST_Block);Cola.AST_Default=Cola.DEFNODE("Default",null,{$documentation:"A `default` switch branch"},Cola.AST_SwitchBranch);Cola.AST_Case=Cola.DEFNODE("Case","expression",{$documentation:"A `case` switch branch",$propdoc:{expression:"[AST_Node] the `case` expression"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);Cola.walk_body(this,visitor)})}},Cola.AST_SwitchBranch);Cola.AST_When=Cola.DEFNODE("When",null,{$iscola:true,$documentation:"A `when` switch branch"},Cola.AST_Case);Cola.AST_Try=Cola.DEFNODE("Try","bcatch bfinally",{$documentation:"A `try` statement",$propdoc:{bcatch:"[AST_Catch?] the catch block, or null if not present",bfinally:"[AST_Finally?] the finally block, or null if not present"},_walk:function(visitor){return visitor._visit(this,function(){Cola.walk_body(this,visitor);if(this.bcatch)this.bcatch._walk(visitor);if(this.bfinally)this.bfinally._walk(visitor)})}},Cola.AST_Block);Cola.AST_Catch=Cola.DEFNODE("Catch","argname",{$documentation:"A `catch` node; only makes sense as part of a `try` statement",$propdoc:{argname:"[AST_SymbolCatch] symbol for the exception"},_walk:function(visitor){return visitor._visit(this,function(){this.argname._walk(visitor);Cola.walk_body(this,visitor)})}},Cola.AST_Block);Cola.AST_Finally=Cola.DEFNODE("Finally",null,{$documentation:"A `finally` node; only makes sense as part of a `try` statement"},Cola.AST_Block);Cola.AST_Definitions=Cola.DEFNODE("Definitions","definitions",{$documentation:"Base class for `var` or `const` nodes (variable declarations/initializations)",$propdoc:{definitions:"[AST_VarDef*] array of variable definitions"},_walk:function(visitor){return visitor._visit(this,function(){this.definitions.forEach(function(def){def._walk(visitor)})})}},Cola.AST_Statement);Cola.AST_Var=Cola.DEFNODE("Var","type",{$documentation:"A `var` statement"},Cola.AST_Definitions);Cola.AST_Const=Cola.DEFNODE("Const",null,{$documentation:"A `const` statement"},Cola.AST_Definitions);Cola.AST_VarDef=Cola.DEFNODE("VarDef","name value type",{$documentation:"A variable declaration; only appears in a AST_Definitions node",$propdoc:{name:"[AST_SymbolVar|AST_SymbolConst] name of the variable",value:"[AST_Node?] initializer, or null of there's no initializer"},_walk:function(visitor){return visitor._visit(this,function(){this.name._walk(visitor);if(this.value)this.value._walk(visitor)})}});Cola.AST_Call=Cola.DEFNODE("Call","expression args",{$documentation:"A function call expression",$propdoc:{expression:"[AST_Node] expression to invoke as function",args:"[AST_Node*] array of arguments"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);this.args.forEach(function(arg){arg._walk(visitor)})})}});Cola.AST_New=Cola.DEFNODE("New",null,{$documentation:"An object instantiation. Derives from a function call since it has exactly the same properties"},Cola.AST_Call);Cola.AST_Seq=Cola.DEFNODE("Seq","car cdr",{$documentation:"A sequence expression (two comma-separated expressions)",$propdoc:{car:"[AST_Node] first element in sequence",cdr:"[AST_Node] second element in sequence"},$cons:function(x,y){var seq=new Cola.AST_Seq(x);seq.car=x;seq.cdr=y;return seq},$from_array:function(array){if(array.length==0)return null;if(array.length==1)return array[0].clone();var list=null;for(var i=array.length;--i>=0;){list=Cola.AST_Seq.cons(array[i],list)}var p=list;while(p){if(p.cdr&&!p.cdr.cdr){p.cdr=p.cdr.car;break}p=p.cdr}return list},to_array:function(){var p=this,a=[];while(p){a.push(p.car);if(p.cdr&&!(p.cdr instanceof Cola.AST_Seq)){a.push(p.cdr);break}p=p.cdr}return a},add:function(node){var p=this;while(p){if(!(p.cdr instanceof Cola.AST_Seq)){var cell=Cola.AST_Seq.cons(p.cdr,node);return p.cdr=cell}p=p.cdr}},_walk:function(visitor){return visitor._visit(this,function(){this.car._walk(visitor);if(this.cdr)this.cdr._walk(visitor)})}});Cola.AST_PropAccess=Cola.DEFNODE("PropAccess","expression property",{$documentation:'Base class for property access expressions, i.e. `a.foo` or `a["foo"]`',$propdoc:{expression:"[AST_Node] the “container” expression",property:"[AST_Node|string] the property to access. For AST_Dot this is always a plain string, while for AST_Sub it's an arbitrary AST_Node"}});Cola.AST_Dot=Cola.DEFNODE("Dot",null,{$documentation:"A dotted property access expression",_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor)})}},Cola.AST_PropAccess);Cola.AST_Proto=Cola.DEFNODE("Proto",null,{$iscola:true,$documentation:"Accessor to prototype",_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor)})}},Cola.AST_PropAccess);Cola.AST_Cascade=Cola.DEFNODE("Cascade","expression subexpressions",{$iscola:true,$documentation:"Base class for properties access expressions, i.e. `a..foo..bar`",$propdoc:{expression:"[AST_Node] the “container” expression",subexpressions:"[AST_Node*] actions with properties"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);this.subexpressions.forEach(function(subexpr){subexpr._walk(visitor)})})}},Cola.AST_PropAccess);Cola.AST_Sub=Cola.DEFNODE("Sub",null,{$documentation:'Index-style property access, i.e. `a["foo"]`',_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor);this.property._walk(visitor)})}},Cola.AST_PropAccess);Cola.AST_Unary=Cola.DEFNODE("Unary","operator expression",{$documentation:"Base class for unary expressions",$propdoc:{operator:"[string] the operator",expression:"[AST_Node] expression that this unary operator applies to"},_walk:function(visitor){return visitor._visit(this,function(){this.expression._walk(visitor)})}});Cola.AST_UnaryPrefix=Cola.DEFNODE("UnaryPrefix",null,{$documentation:"Unary prefix expression, i.e. `typeof i` or `++i`"},Cola.AST_Unary);Cola.AST_UnaryPostfix=Cola.DEFNODE("UnaryPostfix",null,{$documentation:"Unary postfix expression, i.e. `i++`"},Cola.AST_Unary);Cola.AST_Binary=Cola.DEFNODE("Binary","left operator right",{$documentation:"Binary expression, i.e. `a + b`",$propdoc:{left:"[AST_Node] left-hand side expression",operator:"[string] the operator",right:"[AST_Node] right-hand side expression"},_walk:function(visitor){return visitor._visit(this,function(){this.left._walk(visitor);this.right._walk(visitor)})}});Cola.AST_Conditional=Cola.DEFNODE("Conditional","condition consequent alternative",{$documentation:"Conditional expression using the ternary operator, i.e. `a ? b : c`",$propdoc:{condition:"[AST_Node]",consequent:"[AST_Node]",alternative:"[AST_Node]"},_walk:function(visitor){return visitor._visit(this,function(){this.condition._walk(visitor);this.consequent._walk(visitor);this.alternative._walk(visitor)})}});Cola.AST_Assign=Cola.DEFNODE("Assign",null,{$documentation:"An assignment expression — `a = b + 5`"},Cola.AST_Binary);Cola.AST_Array=Cola.DEFNODE("Array","elements template vardef",{$documentation:"An array literal",$propdoc:{elements:"[AST_Node*] array of elements"},_walk:function(visitor){return visitor._visit(this,function(){this.elements.forEach(function(el){el._walk(visitor)})})}});Cola.AST_ArrayTemplate=Cola.DEFNODE("ArrayTemplate",null,{$iscola:true,$documentation:"Array assignment template."},Cola.AST_Array);Cola.AST_ArrayRange=Cola.DEFNODE("ArrayRange","from to triple",{$iscola:true,$documentation:"An array range.",$propdoc:{from:"[AST_Node] range from",to:"[AST_Node] range to"},_walk:function(visitor){return visitor._visit(this,function(){this.from._walk(visitor);this.to._walk(visitor)})}});Cola.AST_Object=Cola.DEFNODE("Object","properties template vardef",{$documentation:"An object literal",$propdoc:{properties:"[AST_ObjectProperty*] array of properties"},_walk:function(visitor){return visitor._visit(this,function(){this.properties.forEach(function(prop){prop._walk(visitor)})})}});Cola.AST_ObjectTemplate=Cola.DEFNODE("ObjectTemplate",null,{$iscola:true,$documentation:"Object assignment template."},Cola.AST_Object);Cola.AST_ObjectProperty=Cola.DEFNODE("ObjectProperty","key value type",{$documentation:"Base class for literal object properties",$propdoc:{key:"[string] the property name converted to a string for ObjectKeyVal. For setters and getters this is an arbitrary AST_Node.",value:"[AST_Node] property value. For setters and getters this is an AST_Function."},_walk:function(visitor){return visitor._visit(this,function(){this.value._walk(visitor)})}});Cola.AST_ObjectKeyVal=Cola.DEFNODE("ObjectKeyVal",null,{$documentation:"A key: value object property"},Cola.AST_ObjectProperty);Cola.AST_ObjectSetter=Cola.DEFNODE("ObjectSetter",null,{$documentation:"An object setter property"},Cola.AST_ObjectProperty);Cola.AST_ObjectGetter=Cola.DEFNODE("ObjectGetter",null,{$documentation:"An object getter property"},Cola.AST_ObjectProperty);Cola.AST_Symbol=Cola.DEFNODE("Symbol","scope name thedef",{$propdoc:{name:"[string] name of this symbol",scope:"[AST_Scope/S] the current scope (not necessarily the definition scope)",thedef:"[SymbolDef/S] the definition of this symbol"},$documentation:"Base class for all symbols"});Cola.AST_SymbolAccessor=Cola.DEFNODE("SymbolAccessor",null,{$documentation:"The name of a property accessor (setter/getter function)"},Cola.AST_Symbol);Cola.AST_SymbolDeclaration=Cola.DEFNODE("SymbolDeclaration","init",{$documentation:"A declaration symbol (symbol in var/const, function name or argument, symbol in catch)",$propdoc:{init:"[AST_Node*/S] array of initializers for this declaration."}},Cola.AST_Symbol);Cola.AST_SymbolVar=Cola.DEFNODE("SymbolVar",null,{$documentation:"Symbol defining a variable"},Cola.AST_SymbolDeclaration);Cola.AST_SymbolConst=Cola.DEFNODE("SymbolConst",null,{$documentation:"A constant declaration"},Cola.AST_SymbolDeclaration);Cola.AST_SymbolFunarg=Cola.DEFNODE("SymbolFunarg","type",{$documentation:"Symbol naming a function argument"},Cola.AST_SymbolVar);Cola.AST_SymbolDefun=Cola.DEFNODE("SymbolDefun",null,{$documentation:"Symbol defining a function"},Cola.AST_SymbolDeclaration);Cola.AST_SymbolLambda=Cola.DEFNODE("SymbolLambda",null,{$documentation:"Symbol naming a function expression"},Cola.AST_SymbolDeclaration);Cola.AST_SymbolCatch=Cola.DEFNODE("SymbolCatch",null,{$documentation:"Symbol naming the exception in catch"},Cola.AST_SymbolDeclaration);Cola.AST_Label=Cola.DEFNODE("Label","references",{$documentation:"Symbol naming a label (declaration)",$propdoc:{references:"[AST_LoopControl*] a list of nodes referring to this label"},initialize:function(){this.references=[];this.thedef=this}},Cola.AST_Symbol);Cola.AST_SymbolRef=Cola.DEFNODE("SymbolRef",null,{$documentation:"Reference to some symbol (not definition/declaration)"},Cola.AST_Symbol);Cola.AST_LabelRef=Cola.DEFNODE("LabelRef",null,{$documentation:"Reference to a label symbol"},Cola.AST_Symbol);Cola.AST_This=Cola.DEFNODE("This",null,{$documentation:"The `this` symbol"},Cola.AST_Symbol);Cola.AST_Constant=Cola.DEFNODE("Constant",null,{$documentation:"Base class for all constants",getValue:function(){return this.value}});Cola.AST_String=Cola.DEFNODE("String","value",{$documentation:"A string literal",$propdoc:{value:"[string] the contents of this string"}},Cola.AST_Constant);Cola.AST_StringTemplate=Cola.DEFNODE("StringTemplate","body",{$iscola:true,$documentation:"A string template",$propdoc:{body:"[AST_Statement*] the contents of this string template"},_walk:function(visitor){return visitor._visit(this,function(){Cola.walk_body(this,visitor)})}},Cola.AST_Statement);Cola.AST_Number=Cola.DEFNODE("Number","value",{$documentation:"A number literal",$propdoc:{value:"[number] the numeric value"}},Cola.AST_Constant);Cola.AST_RegExp=Cola.DEFNODE("RegExp","value",{$documentation:"A regexp literal",$propdoc:{value:"[RegExp] the actual regexp"}},Cola.AST_Constant);Cola.AST_Atom=Cola.DEFNODE("Atom",null,{$documentation:"Base class for atoms"},Cola.AST_Constant);Cola.AST_Null=Cola.DEFNODE("Null",null,{$documentation:"The `null` atom",value:null},Cola.AST_Atom);Cola.AST_NaN=Cola.DEFNODE("NaN",null,{$documentation:"The impossible value",value:0/0},Cola.AST_Atom);Cola.AST_Undefined=Cola.DEFNODE("Undefined",null,{$documentation:"The `undefined` value",value:function(){}()},Cola.AST_Atom);Cola.AST_Hole=Cola.DEFNODE("Hole",null,{$documentation:"A hole in an array",value:function(){}()},Cola.AST_Atom);Cola.AST_Infinity=Cola.DEFNODE("Infinity",null,{$documentation:"The `Infinity` value",value:1/0},Cola.AST_Atom); 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);var ret=this.visit(node,descend?function(){descend.call(node)}:Cola.noop);if(!ret&&descend){descend.call(node)}this.stack.pop();return ret},parent:function(n){return this.stack[this.stack.length-2-(n||0)]},push:function(node){this.stack.push(node)},pop:function(){return this.stack.pop()},self:function(){return this.stack[this.stack.length-1]},find_parent:function(type){var stack=this.stack;for(var i=stack.length;--i>=0;){var x=stack[i];if(x instanceof type)return x}},has_directive:function(type){return this.find_parent(Cola.AST_Scope).has_directive(type)},in_boolean_context:function(){var stack=this.stack;var i=stack.length,self=stack[--i];while(i>0){var p=stack[--i];if(p instanceof Cola.AST_If&&p.condition===self||p instanceof Cola.AST_Conditional&&p.condition===self||p instanceof Cola.AST_DWLoop&&p.condition===self||p instanceof Cola.AST_For&&p.condition===self||p instanceof Cola.AST_UnaryPrefix&&p.operator=="!"&&p.expression===self){return true}if(!(p instanceof Cola.AST_Binary&&(p.operator=="&&"||p.operator=="||")))return false;self=p}},loopcontrol_target:function(label){var stack=this.stack;if(label)for(var i=stack.length;--i>=0;){var x=stack[i];if(x instanceof Cola.AST_LabeledStatement&&x.label.name==label.name){return x.body}}else for(var i=stack.length;--i>=0;){var x=stack[i];if(x instanceof Cola.AST_Switch||x instanceof Cola.AST_IterationStatement)return x}}};"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.makePredicate(Cola.characters("  \n\r \f ​᠎              "));Cola.cPUNC_BEFORE_EXPRESSION=Cola.makePredicate(Cola.characters("[{(,.;:").concat(["::"]));Cola.PUNC_BEFORE_EXPRESSION=Cola.makePredicate(Cola.characters("[{(,.;:"));Cola.PUNC_CHARS=Cola.makePredicate(Cola.characters("[]{}(),;:"));Cola.REGEXP_MODIFIERS=Cola.makePredicate(Cola.characters("gmsiy"));Cola.UNICODE={letter:new RegExp("[\\u0041-\\u005A\\u0061-\\u007A\\u00AA\\u00B5\\u00BA\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u0523\\u0531-\\u0556\\u0559\\u0561-\\u0587\\u05D0-\\u05EA\\u05F0-\\u05F2\\u0621-\\u064A\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07CA-\\u07EA\\u07F4\\u07F5\\u07FA\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0971\\u0972\\u097B-\\u097F\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09F0\\u09F1\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B71\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C33\\u0C35-\\u0C39\\u0C3D\\u0C58\\u0C59\\u0C60\\u0C61\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDE\\u0CE0\\u0CE1\\u0D05-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D28\\u0D2A-\\u0D39\\u0D3D\\u0D60\\u0D61\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E81\\u0E82\\u0E84\\u0E87\\u0E88\\u0E8A\\u0E8D\\u0E94-\\u0E97\\u0E99-\\u0E9F\\u0EA1-\\u0EA3\\u0EA5\\u0EA7\\u0EAA\\u0EAB\\u0EAD-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0EDC\\u0EDD\\u0F00\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8B\\u1000-\\u102A\\u103F\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u10A0-\\u10C5\\u10D0-\\u10FA\\u10FC\\u1100-\\u1159\\u115F-\\u11A2\\u11A8-\\u11F9\\u1200-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1380-\\u138F\\u13A0-\\u13F4\\u1401-\\u166C\\u166F-\\u1676\\u1681-\\u169A\\u16A0-\\u16EA\\u1700-\\u170C\\u170E-\\u1711\\u1720-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u1820-\\u1877\\u1880-\\u18A8\\u18AA\\u1900-\\u191C\\u1950-\\u196D\\u1970-\\u1974\\u1980-\\u19A9\\u19C1-\\u19C7\\u1A00-\\u1A16\\u1B05-\\u1B33\\u1B45-\\u1B4B\\u1B83-\\u1BA0\\u1BAE\\u1BAF\\u1C00-\\u1C23\\u1C4D-\\u1C4F\\u1C5A-\\u1C7D\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2071\\u207F\\u2090-\\u2094\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2183\\u2184\\u2C00-\\u2C2E\\u2C30-\\u2C5E\\u2C60-\\u2C6F\\u2C71-\\u2C7D\\u2C80-\\u2CE4\\u2D00-\\u2D25\\u2D30-\\u2D65\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005\\u3006\\u3031-\\u3035\\u303B\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u31A0-\\u31B7\\u31F0-\\u31FF\\u3400\\u4DB5\\u4E00\\u9FC3\\uA000-\\uA48C\\uA500-\\uA60C\\uA610-\\uA61F\\uA62A\\uA62B\\uA640-\\uA65F\\uA662-\\uA66E\\uA67F-\\uA697\\uA717-\\uA71F\\uA722-\\uA788\\uA78B\\uA78C\\uA7FB-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA840-\\uA873\\uA882-\\uA8B3\\uA90A-\\uA925\\uA930-\\uA946\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAC00\\uD7A3\\uF900-\\uFA2D\\uFA30-\\uFA6A\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]"),non_spacing_mark:new RegExp("[\\u0300-\\u036F\\u0483-\\u0487\\u0591-\\u05BD\\u05BF\\u05C1\\u05C2\\u05C4\\u05C5\\u05C7\\u0610-\\u061A\\u064B-\\u065E\\u0670\\u06D6-\\u06DC\\u06DF-\\u06E4\\u06E7\\u06E8\\u06EA-\\u06ED\\u0711\\u0730-\\u074A\\u07A6-\\u07B0\\u07EB-\\u07F3\\u0816-\\u0819\\u081B-\\u0823\\u0825-\\u0827\\u0829-\\u082D\\u0900-\\u0902\\u093C\\u0941-\\u0948\\u094D\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09BC\\u09C1-\\u09C4\\u09CD\\u09E2\\u09E3\\u0A01\\u0A02\\u0A3C\\u0A41\\u0A42\\u0A47\\u0A48\\u0A4B-\\u0A4D\\u0A51\\u0A70\\u0A71\\u0A75\\u0A81\\u0A82\\u0ABC\\u0AC1-\\u0AC5\\u0AC7\\u0AC8\\u0ACD\\u0AE2\\u0AE3\\u0B01\\u0B3C\\u0B3F\\u0B41-\\u0B44\\u0B4D\\u0B56\\u0B62\\u0B63\\u0B82\\u0BC0\\u0BCD\\u0C3E-\\u0C40\\u0C46-\\u0C48\\u0C4A-\\u0C4D\\u0C55\\u0C56\\u0C62\\u0C63\\u0CBC\\u0CBF\\u0CC6\\u0CCC\\u0CCD\\u0CE2\\u0CE3\\u0D41-\\u0D44\\u0D4D\\u0D62\\u0D63\\u0DCA\\u0DD2-\\u0DD4\\u0DD6\\u0E31\\u0E34-\\u0E3A\\u0E47-\\u0E4E\\u0EB1\\u0EB4-\\u0EB9\\u0EBB\\u0EBC\\u0EC8-\\u0ECD\\u0F18\\u0F19\\u0F35\\u0F37\\u0F39\\u0F71-\\u0F7E\\u0F80-\\u0F84\\u0F86\\u0F87\\u0F90-\\u0F97\\u0F99-\\u0FBC\\u0FC6\\u102D-\\u1030\\u1032-\\u1037\\u1039\\u103A\\u103D\\u103E\\u1058\\u1059\\u105E-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108D\\u109D\\u135F\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17B7-\\u17BD\\u17C6\\u17C9-\\u17D3\\u17DD\\u180B-\\u180D\\u18A9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193B\\u1A17\\u1A18\\u1A56\\u1A58-\\u1A5E\\u1A60\\u1A62\\u1A65-\\u1A6C\\u1A73-\\u1A7C\\u1A7F\\u1B00-\\u1B03\\u1B34\\u1B36-\\u1B3A\\u1B3C\\u1B42\\u1B6B-\\u1B73\\u1B80\\u1B81\\u1BA2-\\u1BA5\\u1BA8\\u1BA9\\u1C2C-\\u1C33\\u1C36\\u1C37\\u1CD0-\\u1CD2\\u1CD4-\\u1CE0\\u1CE2-\\u1CE8\\u1CED\\u1DC0-\\u1DE6\\u1DFD-\\u1DFF\\u20D0-\\u20DC\\u20E1\\u20E5-\\u20F0\\u2CEF-\\u2CF1\\u2DE0-\\u2DFF\\u302A-\\u302F\\u3099\\u309A\\uA66F\\uA67C\\uA67D\\uA6F0\\uA6F1\\uA802\\uA806\\uA80B\\uA825\\uA826\\uA8C4\\uA8E0-\\uA8F1\\uA926-\\uA92D\\uA947-\\uA951\\uA980-\\uA982\\uA9B3\\uA9B6-\\uA9B9\\uA9BC\\uAA29-\\uAA2E\\uAA31\\uAA32\\uAA35\\uAA36\\uAA43\\uAA4C\\uAAB0\\uAAB2-\\uAAB4\\uAAB7\\uAAB8\\uAABE\\uAABF\\uAAC1\\uABE5\\uABE8\\uABED\\uFB1E\\uFE00-\\uFE0F\\uFE20-\\uFE26]"),space_combining_mark:new RegExp("[\\u0903\\u093E-\\u0940\\u0949-\\u094C\\u094E\\u0982\\u0983\\u09BE-\\u09C0\\u09C7\\u09C8\\u09CB\\u09CC\\u09D7\\u0A03\\u0A3E-\\u0A40\\u0A83\\u0ABE-\\u0AC0\\u0AC9\\u0ACB\\u0ACC\\u0B02\\u0B03\\u0B3E\\u0B40\\u0B47\\u0B48\\u0B4B\\u0B4C\\u0B57\\u0BBE\\u0BBF\\u0BC1\\u0BC2\\u0BC6-\\u0BC8\\u0BCA-\\u0BCC\\u0BD7\\u0C01-\\u0C03\\u0C41-\\u0C44\\u0C82\\u0C83\\u0CBE\\u0CC0-\\u0CC4\\u0CC7\\u0CC8\\u0CCA\\u0CCB\\u0CD5\\u0CD6\\u0D02\\u0D03\\u0D3E-\\u0D40\\u0D46-\\u0D48\\u0D4A-\\u0D4C\\u0D57\\u0D82\\u0D83\\u0DCF-\\u0DD1\\u0DD8-\\u0DDF\\u0DF2\\u0DF3\\u0F3E\\u0F3F\\u0F7F\\u102B\\u102C\\u1031\\u1038\\u103B\\u103C\\u1056\\u1057\\u1062-\\u1064\\u1067-\\u106D\\u1083\\u1084\\u1087-\\u108C\\u108F\\u109A-\\u109C\\u17B6\\u17BE-\\u17C5\\u17C7\\u17C8\\u1923-\\u1926\\u1929-\\u192B\\u1930\\u1931\\u1933-\\u1938\\u19B0-\\u19C0\\u19C8\\u19C9\\u1A19-\\u1A1B\\u1A55\\u1A57\\u1A61\\u1A63\\u1A64\\u1A6D-\\u1A72\\u1B04\\u1B35\\u1B3B\\u1B3D-\\u1B41\\u1B43\\u1B44\\u1B82\\u1BA1\\u1BA6\\u1BA7\\u1BAA\\u1C24-\\u1C2B\\u1C34\\u1C35\\u1CE1\\u1CF2\\uA823\\uA824\\uA827\\uA880\\uA881\\uA8B4-\\uA8C3\\uA952\\uA953\\uA983\\uA9B4\\uA9B5\\uA9BA\\uA9BB\\uA9BD-\\uA9C0\\uAA2F\\uAA30\\uAA33\\uAA34\\uAA4D\\uAA7B\\uABE3\\uABE4\\uABE6\\uABE7\\uABE9\\uABEA\\uABEC]"),connector_punctuation:new RegExp("[\\u005F\\u203F\\u2040\\u2054\\uFE33\\uFE34\\uFE4D-\\uFE4F\\uFF3F]")};Cola.is_letter=function(code){return code>=97&&code<=122||code>=65&&code<=90||code>=170&&Cola.UNICODE.letter.test(String.fromCharCode(code))};Cola.is_digit=function(code){return code>=48&&code<=57};Cola.is_alphanumeric_char=function(code){return Cola.is_digit(code)||Cola.is_letter(code)};Cola.is_unicode_combining_mark=function(ch){return Cola.UNICODE.non_spacing_mark.test(ch)||Cola.UNICODE.space_combining_mark.test(ch)};Cola.is_unicode_connector_punctuation=function(ch){return Cola.UNICODE.connector_punctuation.test(ch)};Cola.is_identifier=function(name,is_js){return(is_js&&!Cola.RESERVED_WORDS(name)||!is_js&&!Cola.cRESERVED_WORDS(name))&&/^[a-z_$][a-z0-9_$]*$/i.test(name)};Cola.is_identifier_start=function(code){return code==36||code==95||Cola.is_letter(code)};Cola.is_identifier_char=function(ch){var code=ch.charCodeAt(0);return Cola.is_identifier_start(code)||Cola.is_digit(code)||code==8204||code==8205||Cola.is_unicode_combining_mark(ch)||Cola.is_unicode_connector_punctuation(ch)};Cola.is_identifier_string=function(str){var i=str.length;if(i==0)return false;if(!Cola.is_identifier_start(str.charCodeAt(0)))return false;while(--i>=0){if(!Cola.is_identifier_char(str.charAt(i)))return false}return true};Cola.parse_js_number=function(num){if(Cola.RE_HEX_NUMBER.test(num)){return parseInt(num.substr(2),16)}else if(Cola.RE_OCT_NUMBER.test(num)){return parseInt(num.substr(1),8)}else if(Cola.RE_DEC_NUMBER.test(num)){return parseFloat(num)}};Cola.JS_Parse_Error=function(message,line,col,pos){this.message=message;this.line=line;this.col=col;this.pos=pos;this.stack=(new Error).stack};Cola.JS_Parse_Error.prototype.toString=function(){return this.message+" (line: "+this.line+", col: "+this.col+", pos: "+this.pos+")"+"\n\n"+this.stack};Cola.js_error=function(message,filename,line,col,pos){throw new Cola.JS_Parse_Error(message,line,col,pos)};Cola.is_token=function(token,type,val){return token.type==type&&(val==null||token.value==val)};Cola.EX_EOF={};Cola.Tokenizer=function($TEXT,filename,is_js,html5_comments){this.S={text:$TEXT.replace(/\r\n?|[\n\u2028\u2029]/g,"\n").replace(/\uFEFF/g,""),filename:filename,pos:0,tokpos:0,line:1,tokline:0,col:0,tokcol:0,newline_before:false,regex_allowed:false,comments_before:[]};this.dumps=[];this.dumpi=-1;if(!is_js)this.S.string={at:[new Cola.Tokenizer.StringInfo],level:0};if(is_js){this.KEYWORDS=Cola.KEYWORDS;this.KEYWORDS_ATOM=Cola.KEYWORDS_ATOM;this.OPERATORS=Cola.OPERATORS;this.UNARY_POSTFIX=Cola.UNARY_POSTFIX;this.KEYWORDS_BEFORE_EXPRESSION=Cola.KEYWORDS_BEFORE_EXPRESSION;this.PUNC_BEFORE_EXPRESSION=Cola.PUNC_BEFORE_EXPRESSION}else{this.KEYWORDS=Cola.cKEYWORDS;this.KEYWORDS_ATOM=Cola.cKEYWORDS_ATOM;this.OPERATORS=Cola.cOPERATORS;this.UNARY_POSTFIX=Cola.cUNARY_POSTFIX;this.KEYWORDS_BEFORE_EXPRESSION=Cola.cKEYWORDS_BEFORE_EXPRESSION;this.PUNC_BEFORE_EXPRESSION=Cola.cPUNC_BEFORE_EXPRESSION}this.is_js=!!is_js;this.html5_comments=html5_comments;this.prev_was_dot=false};Cola.Tokenizer.StringInfo=function(){this.quote="";this.inside=false;this.after_at=false;this.inside_at=false;this.inside_braces=false;this.balance=0};Cola.Tokenizer.with_eof_error=function(eof_error,cont){return function(){try{return cont.apply(this,arguments)}catch(ex){if(ex===Cola.EX_EOF)this.parse_error(eof_error);else throw ex}}};Cola.Tokenizer.prototype.dumpS=function(){this.dumps[++this.dumpi]=Cola.clone(this.S)};Cola.Tokenizer.prototype.restoreS=function(){if(this.dumpi==-1)return;this.S=this.dumps[this.dumpi];delete this.dumps[this.dumpi--]};Cola.Tokenizer.prototype.peek=function(offset){return this.S.text.charAt(this.S.pos+(offset?offset:0))};Cola.Tokenizer.prototype.next=function(signal_eof,in_string){var ch=this.S.text.charAt(this.S.pos++);if(signal_eof&&!ch)throw Cola.EX_EOF;if(ch=="\n"){this.S.newline_before=this.S.newline_before||!in_string;++this.S.line;this.S.col=0}else{++this.S.col}return ch};Cola.Tokenizer.prototype.forward=function(i){while(i-->0)this.next()};Cola.Tokenizer.prototype.looking_at=function(str){return this.S.text.substr(this.S.pos,str.length)==str};Cola.Tokenizer.prototype.find=function(what,signal_eof){var pos=this.S.text.indexOf(what,this.S.pos);if(signal_eof&&pos==-1)throw Cola.EX_EOF;return pos};Cola.Tokenizer.prototype.start_token=function(){this.S.tokline=this.S.line;this.S.tokcol=this.S.col;this.S.tokpos=this.S.pos};Cola.Tokenizer.prototype.token=function(type,value,is_comment){this.S.regex_allowed=type=="operator"&&!this.UNARY_POSTFIX(value)||type=="keyword"&&this.KEYWORDS_BEFORE_EXPRESSION(value)||type=="punc"&&this.PUNC_BEFORE_EXPRESSION(value);this.prev_was_dot=type=="punc"&&value=="."||!this.is_js&&type=="punc"&&value=="::";var ret={type:type,value:value,line:this.S.tokline,col:this.S.tokcol,pos:this.S.tokpos,endpos:this.S.pos,nlb:this.S.newline_before,file:this.S.filename};if(!is_comment){ret.comments_before=this.S.comments_before;this.S.comments_before=[];for(var i=0,len=ret.comments_before.length;i0;--n){var digit=parseInt(this.next(true),16);if(isNaN(digit))this.parse_error("Invalid hex-character pattern in string");num=num<<4|digit}return num};Cola.Tokenizer.prototype.read_string=Cola.Tokenizer.with_eof_error("Unterminated string constant",function(raw,noq){var quote=this.next(),ret="";if(!this.is_js&&!raw){if(this.S.string.at[this.S.string.level].inside&&(this.S.string.at[this.S.string.level].inside_at||this.S.string.at[this.S.string.level].inside_braces)){this.S.string.level++;this.S.string.at[this.S.string.level]=new Cola.Tokenizer.StringInfo}this.S.string.at[this.S.string.level].inside=true;if(noq){ret=quote;quote=this.S.string.at[this.S.string.level].quote}else if(quote==this.S.string.at[this.S.string.level].quote){this.S.string.at[this.S.string.level].inside=false;this.S.string.at[this.S.string.level].quote="";if(this.S.string.level!=0){delete this.S.string.at[this.S.string.level];this.S.string.level--}return this.next_token()}else this.S.string.at[this.S.string.level].quote=quote;if(this.peek()=="@"||this.peek()=="{"&&this.peek(1)=="{")return this.token("string",ret)}for(;;){var ch=this.next(true);if((!raw||this.is_js)&&ch=="\\"){var octal_len=0,first=null;ch=this.read_while(function(ch){if(ch>="0"&&ch<="7"){if(!first){first=ch;return++octal_len}else if(first<="3"&&octal_len<=2)return++octal_len;else if(first>="4"&&octal_len<=1)return++octal_len}return false});if(octal_len>0)ch=String.fromCharCode(parseInt(ch,8));else ch=this.read_escaped_char(true)}else if(ch==quote){if(!this.is_js&&!raw){this.S.string.at[this.S.string.level].inside=false;this.S.string.at[this.S.string.level].quote="";if(this.S.string.level!=0){delete this.S.string.at[this.S.string.level];this.S.string.level--}}break}ret+=ch;if(!this.is_js&&!raw&&(this.peek()=="@"||this.peek()=="{"&&this.peek(1)=="{"))break}return this.token("string",ret)});Cola.Tokenizer.prototype.read_at=function(){var at=this.next();if(this.S.string.at[this.S.string.level].inside&&Cola.is_identifier_char(this.peek())){this.S.string.at[this.S.string.level].after_at=true;return this.token("punc","@")}else if(this.S.string.at[this.S.string.level].inside&&this.peek()=="{"){this.S.string.at[this.S.string.level].inside_at=true;this.S.string.at[this.S.string.level].balance=1;return this.token("punc","@"+this.next())}else return this.token("punc","@");this.parse_error('Unexpected character "@"')};Cola.Tokenizer.prototype.read_braces=function(){this.next(),this.next();this.S.string.at[this.S.string.level].inside_braces=true;this.S.string.at[this.S.string.level].balance=1;return this.token("punc","{{")};Cola.Tokenizer.prototype.skip_line_comment=function(type){var regex_allowed=this.S.regex_allowed;var i=this.find("\n"),ret;if(i==-1){ret=this.S.text.substr(this.S.pos);this.S.pos=this.S.text.length}else{ret=this.S.text.substring(this.S.pos,i);this.S.pos=i}this.S.comments_before.push(this.token(type,ret,true));this.S.regex_allowed=regex_allowed;return this.next_token()};Cola.Tokenizer.prototype.skip_multiline_comment=Cola.Tokenizer.with_eof_error("Unterminated multiline comment",function(){var regex_allowed=this.S.regex_allowed;var i=this.find("*/",true);var text=this.S.text.substring(this.S.pos,i);var a=text.split("\n"),n=a.length;this.S.pos=i+2;this.S.line+=n-1;if(n>1)this.S.col=a[n-1].length;else this.S.col+=a[n-1].length;this.S.col+=2;var nlb=this.S.newline_before=this.S.newline_before||text.indexOf("\n")>=0;this.S.comments_before.push(this.token("comment2",text,true));this.S.regex_allowed=regex_allowed;this.S.newline_before=nlb;return this.next_token()});Cola.Tokenizer.prototype.read_name=function(){var backslash=false,name="",ch,escaped=false,hex;while((ch=this.peek())!=null){if(!backslash){if(ch=="\\")escaped=backslash=true,this.next();else if(Cola.is_identifier_char(ch))name+=this.next();else break}else{if(ch!="u")this.parse_error("Expecting UnicodeEscapeSequence -- uXXXX");ch=this.read_escaped_char();if(!Cola.is_identifier_char(ch))this.parse_error("Unicode char: "+ch.charCodeAt(0)+" is not valid in identifier");name+=ch;backslash=false}}if(this.KEYWORDS(name)&&escaped){hex=name.charCodeAt(0).toString(16).toUpperCase();name="\\u"+"0000".substr(hex.length)+hex+name.slice(1)}if(!this.is_js&&this.S.string.at[this.S.string.level].inside&&this.S.string.at[this.S.string.level].after_at)this.S.string.at[this.S.string.level].after_at=false;return name};Cola.Tokenizer.prototype.read_regexp=Cola.Tokenizer.with_eof_error("Unterminated regular expression",function(regexp){var prev_backslash=false,ch,in_class=false;while(ch=this.next(true))if(prev_backslash){regexp+="\\"+ch;prev_backslash=false}else if(ch=="["){in_class=true;regexp+=ch}else if(ch=="]"&&in_class){in_class=false;regexp+=ch}else if(ch=="/"&&!in_class){break}else if(ch=="\\"){prev_backslash=true}else{regexp+=ch}var mods=this.read_name();return this.token("regexp",this.is_js?new RegExp(regexp,mods):"/"+regexp+"/"+mods)});Cola.Tokenizer.prototype.read_operator=function(prefix){var _this=this;function grow(op){if(!_this.peek())return op;var bigger=op+_this.peek();if(_this.OPERATORS(bigger)){_this.next();return grow(bigger)}else{return op}}return this.token("operator",grow(prefix||this.next()))};Cola.Tokenizer.prototype.handle_slash=function(){this.next();switch(this.peek()){case"/":this.next();return this.skip_line_comment("comment1");case"*":this.next();return this.skip_multiline_comment()}return this.S.regex_allowed?this.read_regexp(""):this.read_operator("/")};Cola.Tokenizer.prototype.handle_dot=function(){this.next();if(!this.is_js&&this.peek()=="."&&this.peek(1)!=".")return this.next(),this.token("punc","..");else if(!this.is_js&&this.peek()=="."&&this.peek(1)==".")return this.next(),this.next(),this.token("punc","...");return Cola.is_digit(this.peek().charCodeAt(0))?this.read_num("."):this.token("punc",".")};Cola.Tokenizer.prototype.read_word=function(){var word=this.read_name();if(this.prev_was_dot)return this.token("name",word);return this.KEYWORDS_ATOM(word)?this.token("atom",word):!this.KEYWORDS(word)?this.token("name",word):this.OPERATORS(word)?this.token("operator",word):this.token("keyword",word)};Cola.Tokenizer.prototype.next_token=function(force_regexp){if(force_regexp!=null)return this.read_regexp(force_regexp);var ch;if(!this.is_js&&this.S.string.at[this.S.string.level].inside&&!this.S.string.at[this.S.string.level].after_at&&!this.S.string.at[this.S.string.level].inside_at&&!this.S.string.at[this.S.string.level].inside_braces){ch=this.peek();if(ch=="@")return this.read_at();if(ch=="{"&&this.peek(1)=="{")return this.read_braces();return this.read_string(false,true)}this.skip_whitespace();this.start_token();if(this.html5_comments){if(this.looking_at("")&&this.S.newline_before){this.forward(3);return this.skip_line_comment("comment4")}}ch=this.peek();if(!ch)return this.token("eof");var code=ch.charCodeAt(0);if(!this.is_js&&code==96)return this.read_string();switch(code){case 34:case 39:return this.read_string();case 46:return this.handle_dot();case 47:return this.handle_slash()}if(Cola.is_digit(code))return this.read_num();if(Cola.PUNC_CHARS(ch)){if(!this.is_js&&ch==":"&&this.peek(1)==":")return this.next(),this.next(),this.token("punc","::");if(!this.is_js&&this.S.string.at[this.S.string.level].inside&&(this.S.string.at[this.S.string.level].inside_at||this.S.string.at[this.S.string.level].inside_braces)){if(ch=="{")this.S.string.at[this.S.string.level].balance++;else if(ch=="}")this.S.string.at[this.S.string.level].balance--;if(this.S.string.at[this.S.string.level].balance==0)if(this.S.string.at[this.S.string.level].inside_at)this.S.string.at[this.S.string.level].inside_at=false;else{this.S.string.at[this.S.string.level].inside_braces=false;return this.next(),this.next(),this.token("punc","}}")}}return this.token("punc",this.next())}if(!this.is_js){if(ch=="r"&&(this.peek(1)=='"'||this.peek(1)=="'"||this.peek(1)=="`"))return this.next(),this.read_string(true);if(ch+this.peek(1)=="=>")return this.next(),this.next(),this.token("punc","=>");if(ch=="@")return this.read_at()}if(Cola.OPERATOR_CHARS(ch))return this.read_operator();if(code==92||Cola.is_identifier_start(code))return this.read_word();this.parse_error("Unexpected character '"+ch+"'")};Cola.Tokenizer.prototype.context=function(nc){if(nc)this.S=nc;return this.S};Cola.UNARY_PREFIX=Cola.makePredicate(["typeof","void","delete","--","++","!","~","-","+"]);Cola.cUNARY_PREFIX=Cola.makePredicate(["clone","isset","typeof","delete","--","++","!","~","-","+"]);Cola.UNARY_POSTFIX=Cola.makePredicate(["--","++"]);Cola.cUNARY_POSTFIX=Cola.UNARY_POSTFIX;Cola.ASSIGNMENT=Cola.makePredicate(["=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","|=","^=","&="]);Cola.cASSIGNMENT=Cola.makePredicate(["=","+=","-=","/=","*=","%=",">>=","<<=",">>>=","|=","^=","&=","?="]);Cola.mergeTokens=function(a,ret){for(var i=0;i","<=",">=","in","instanceof"],[">>","<<",">>>"],["+","-"],["*","/","%"]],{});Cola.cPRECEDENCE=Cola.mergeTokens([["||"],["&&"],["|"],["^"],["&"],["==","===","!=","!=="],["<",">","<=",">=","in","instanceof","is","isnt"],[">>","<<",">>>"],["+","-"],["*","/","%","**","%%"]],{});Cola.STATEMENTS_WITH_LABELS=Cola.array_to_hash(["for","do","while","switch"]);Cola.ATOMIC_START_TOKEN=Cola.array_to_hash(["atom","num","string","regexp","name"]);Cola.parse=function($TEXT,options){return new Cola.Parser($TEXT,options).parse()};Cola.Parser=function($TEXT,options){var _this=this;this.options=Cola.defaults(options,{strict:false,filename:null,toplevel:null,expression:false,html5_comments:true,is_js:false});this.is_js=!!this.options.is_js;this.tokenizer=typeof $TEXT=="string"?new Cola.Tokenizer($TEXT,this.options.filename,this.is_js,this.options.html5_comments):$TEXT;this.S={input:function(){return _this.tokenizer.next_token()},token:null,prev:null,peeked:null,in_function:0,in_directives:true,in_loop:0,labels:[]};this.S.input.context=function(){return _this.tokenizer.context()};this.S.token=this.next();this.dumps=[];this.dumpi=-1;if(this.is_js){this.UNARY_PREFIX=Cola.UNARY_PREFIX;this.PRECEDENCE=Cola.PRECEDENCE;this.ASSIGNMENT=Cola.ASSIGNMENT;this.UNARY_POSTFIX=Cola.UNARY_POSTFIX}else{this.UNARY_PREFIX=Cola.cUNARY_PREFIX;this.PRECEDENCE=Cola.cPRECEDENCE;this.ASSIGNMENT=Cola.cASSIGNMENT;this.UNARY_POSTFIX=Cola.cUNARY_POSTFIX}};Cola.Parser.prototype.parse=function(){var _this=this;if(this.options.expression){return this.expression(true)}return function(){var start=_this.S.token;var body=[];while(!_this.is("eof"))body.push(_this.statement());var end=_this.prev();var toplevel=_this.options.toplevel;if(toplevel){toplevel.body=toplevel.body.concat(body);toplevel.end=end}else{toplevel=new Cola.AST_Toplevel({start:start,body:body,end:end})}toplevel.language=_this.is_js?"js":"cola";return toplevel}()};Cola.Parser.prototype.dumpS=function(){this.dumps[++this.dumpi]=Cola.clone(this.S);this.tokenizer.dumpS()};Cola.Parser.prototype.restoreS=function(){if(this.dumpi==-1)return;this.tokenizer.restoreS();this.S=this.dumps[this.dumpi];delete this.dumps[this.dumpi--]};Cola.Parser.prototype.next_until=function(until){while(true){if(until(this.S.token))break;this.next()}return this.S.token};Cola.Parser.prototype.is=function(type,value){return Cola.is_token(this.S.token,type,value)};Cola.Parser.prototype.peek=function(){return this.S.peeked||(this.S.peeked=this.S.input())};Cola.Parser.prototype.next_is=function(type,value){return Cola.is_token(this.peek(),type,value)};Cola.Parser.prototype.next=function(){this.S.prev=this.S.token;if(this.S.peeked){this.S.token=this.S.peeked;this.S.peeked=null}else{this.S.token=this.S.input()}this.S.in_directives=this.S.in_directives&&(this.S.token.type=="string"||this.is("punc",";"));return this.S.token};Cola.Parser.prototype.prev=function(){return this.S.prev};Cola.Parser.prototype.croak=function(msg,line,col,pos){var ctx=this.S?this.S.input.context():{};Cola.js_error(msg,ctx.filename,line!=null?line:ctx.tokline,col!=null?col:ctx.tokcol,pos!=null?pos:ctx.tokpos)};Cola.Parser.prototype.token_error=function(token,msg){this.croak(msg,token.line,token.col,token.pos)};Cola.Parser.prototype.unexpected=function(token){if(token==null)token=this.S.token;this.token_error(token,"Unexpected token: "+token.type+" `"+token.value+"`")};Cola.Parser.prototype.expect_token=function(type,val){if(this.is(type,val)){return this.next()}this.token_error(this.S.token,"Unexpected token "+this.S.token.type+" `"+this.S.token.value+"`"+", expected "+type+" `"+val+"`")};Cola.Parser.prototype.expect=function(punc){return this.expect_token("punc",punc)};Cola.Parser.prototype.can_insert_semicolon=function(){if(!this.is_js)return false;return!this.options.strict&&(this.S.token.nlb||this.is("eof")||this.is("punc","}"))};Cola.Parser.prototype.semicolon=function(){if(this.is("punc",";"))this.next();else if(!this.can_insert_semicolon())this.unexpected() -};Cola.Parser.prototype.parenthesised=function(){this.expect("(");var exp=this.expression(true);this.expect(")");return exp};Cola.Parser.embed_tokens=function(parser){return function(){var start=this.S.token;var expr=parser.apply(this,arguments);var end=this.prev();expr.start=start;expr.end=end;return expr}};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(){var tmp,type,_this=this;this.handle_regexp();switch(this.S.token.type){case"string":var dir=this.S.in_directives,stat=this.simple_statement();if(dir&&stat.body instanceof Cola.AST_String&&!this.is("punc",","))return new Cola.AST_Directive({value:stat.body.value});return stat;case"num":case"regexp":case"operator":case"atom":return this.simple_statement();case"name":if(!this.is_js&&this.next_is("name")){type=this.S.token.value,this.next();if(this.next_is("punc","("))return this.function_(Cola.AST_Defun,type);return tmp=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++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"))}this.restoreS();if(isfun)return this.function_(Cola.AST_Defun)}return this.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"))return new Cola.AST_Command({name:this.next().value,args:function(name){var args=[];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()}else if(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","{"),new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(!this.is("punc","{")),end:this.prev()}))}else if(this.S.token.value!="asm"&&this.S.token.value!="strict")this.unexpected()}else this.unexpected();return args}.call(this,this.S.token.value)});case"{":if(this.is_js)return new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});this.dumpS();var balance=0,is_object=false;this.next_until(function(){if(_this.is("punc","{"))balance++;else if(_this.is("punc","}"))balance--;return balance==0||_this.is("eof")});is_object=this.next_is("operator");this.restoreS();if(is_object)return this.simple_statement();return new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});case"[":case"(":return this.simple_statement();case";":this.next();return new Cola.AST_EmptyStatement;default:this.unexpected()}case"keyword":switch(tmp=this.S.token.value,this.next(),tmp){case"break":return this.break_cont(Cola.AST_Break);case"continue":return this.break_cont(Cola.AST_Continue);case"debugger":this.semicolon();return new Cola.AST_Debugger;case"do":return new Cola.AST_Do({body:this.in_loop(function(){return this.statement()}),condition:(this.expect_token("keyword","while"),tmp=this.parenthesised(),this.semicolon(),tmp)});case"while":return new Cola.AST_While({condition:this.parenthesised(),body:this.in_loop(function(){return this.statement()})});case"for":return this.for_();case"function":return this.function_(Cola.AST_Defun);case"if":return this.if_();case"return":if(this.S.in_function==0)this.croak("'return' outside of function");return new Cola.AST_Return({value:this.is("punc",";")?(this.next(),null):this.can_insert_semicolon()?null:(tmp=this.expression(true),this.semicolon(),tmp)});case"switch":return new Cola.AST_Switch({expression:this.is("punc","{")&&!this.is_js?new Cola.AST_Noop:this.parenthesised(),body:this.in_loop(this.switch_body_)});case"throw":if(this.S.token.nlb)this.croak("Illegal newline after 'throw'");return new Cola.AST_Throw({value:(tmp=this.expression(true),this.semicolon(),tmp)});case"try":return this.try_();case"var":return tmp=this.var_(),this.semicolon(),tmp;case"const":return tmp=this.const_(),this.semicolon(),tmp;case"with":return new Cola.AST_With({expression:this.parenthesised(),body:this.statement()});default:this.unexpected()}}});Cola.Parser.prototype.labeled_statement=function(){var label=this.as_symbol(Cola.AST_Label),_this=this;if(Cola.find_if(function(l){return l.name==label.name},this.S.labels)){this.croak("Label "+label.name+" defined twice")}this.expect(":");this.S.labels.push(label);var stat=this.statement();this.S.labels.pop();if(!(stat instanceof Cola.AST_IterationStatement)){label.references.forEach(function(ref){if(ref instanceof Cola.AST_Continue){ref=ref.label.start;_this.croak("Continue label `"+label.name+"` refers to non-IterationStatement.",ref.line,ref.col,ref.pos)}})}return new Cola.AST_LabeledStatement({body:stat,label:label})};Cola.Parser.prototype.simple_statement=function(tmp){return new Cola.AST_SimpleStatement({body:(tmp=this.expression(true),this.semicolon(),tmp)})};Cola.Parser.prototype.break_cont=function(type){var label=null,ldef;if(!this.can_insert_semicolon()){label=this.as_symbol(Cola.AST_LabelRef,true)}if(label!=null){ldef=Cola.find_if(function(l){return l.name==label.name},this.S.labels);if(!ldef)this.croak("Undefined label "+label.name);label.thedef=ldef}else if(this.S.in_loop==0)this.croak(type.TYPE+" not inside a loop or switch");this.semicolon();var stat=new type({label:label});if(ldef)ldef.references.push(stat);return stat};Cola.Parser.prototype.for_=function(){this.expect("(");var init=null;if(!this.is("punc",";")){init=this.is("keyword","var")||!this.is_js&&this.is("name")&&this.next_is("name")?(this.next(),this.var_(true,this.prev().value)):this.expression(true,true);if(this.is("operator","in")){if(init instanceof Cola.AST_Var&&init.definitions.length>1)this.croak("Only one variable declaration allowed in for..in loop");this.next();return this.for_in(init)}}return this.regular_for(init)};Cola.Parser.prototype.regular_for=function(init){this.expect(";");var test=this.is("punc",";")?null:this.expression(true);this.expect(";");var step=this.is("punc",")")?null:this.expression(true);this.expect(")");var _this=this;return new Cola.AST_For({init:init,condition:test,step:step,body:this.in_loop(function(){return this.statement()})})};Cola.Parser.prototype.for_in=function(init){var lhs=init instanceof Cola.AST_Var?init.definitions[0].name:null;var obj=this.expression(true);this.expect(")");var _this=this;return new Cola.AST_ForIn({init:init,name:lhs,object:obj,body:this.in_loop(function(){return this.statement()})})};Cola.Parser.prototype.as_funcarg=function(splatedexist){var name=this.as_symbol(Cola.AST_SymbolFunarg),type=name,argtype="positional",defval=new Cola.AST_Noop;if(this.is("name"))name=this.as_symbol(Cola.AST_SymbolFunarg);if(this.is("punc","...")){if(splatedexist)this.token_error(this.S,"Unexpected token: splated argument can be only one.");if(type!=name&&type.name!="Array")this.token_error(this.S,"Unexpected token: splated argument must have `Array` type.");this.next();argtype="splated"}else if(this.is("operator","=")){this.next();defval=this.expression(false)}else if(this.is("punc",":")){this.next();argtype="named";if(!this.is("punc",",")&&!this.is("punc",")")){defval=this.expression(false)}}return new Cola.AST_ArgDef({name:name,type:name.type=argtype=="splated"?"Array":type==name?"dynamic":type.name,argtype:argtype,defval:defval,start:type.start,end:this.prev()})};Cola.Parser.prototype.function_=function(ctor,type){!type&&(type="dynamic");var in_statement=ctor===Cola.AST_Defun,_this=this,splatedexist=false;var name=this.is("name")?this.as_symbol(in_statement?Cola.AST_SymbolDefun:Cola.AST_SymbolLambda):null;if(in_statement&&!name)this.unexpected();this.expect("(");return new ctor({type:type,name:name,argnames:function(first,a){while(!_this.is("punc",")")){if(first)first=false;else _this.expect(",");a.push(_this.is_js?_this.as_symbol(Cola.AST_SymbolFunarg):_this.as_funcarg(splatedexist));splatedexist=a[a.length-1].argtype=="splated"}_this.next();return a}(true,[]),body:function(loop,labels){++_this.S.in_function;_this.S.in_directives=true;_this.S.in_loop=0;_this.S.labels=[];var tmp,a=!_this.is_js&&_this.is("punc","=>")?(_this.next(),[new Cola.AST_Return({start:new Cola.AST_Token({nlb:false,type:"keyword",value:"return"}),value:function(){tmp=_this.expression(ctor===Cola.AST_Defun);if(ctor===Cola.AST_Defun){_this.semicolon()}return tmp}(),end:_this.prev()})]):_this.block_();--_this.S.in_function;_this.S.in_loop=loop;_this.S.labels=labels;return a}(this.S.in_loop,this.S.labels)})};Cola.Parser.prototype.if_=function(inline){var cond=this.parenthesised(),body=inline&&!this.is_js?this.expression(true):this.statement(),belse=null;if(this.is("keyword","else")){this.next();if(inline&&!this.is_js)belse=this.is("keyword","if")?(this.next(),this.if_(true)):this.expression(true);else belse=this.statement()}return new Cola.AST_If({condition:cond,body:body,alternative:belse,inline:inline})};Cola.Parser.prototype.block_=function(to_eof){if(this.is_js||!to_eof)this.expect("{");var a=[];if(this.is_js||!to_eof)while(!this.is("punc","}")){if(this.is("eof"))this.unexpected();a.push(this.statement())}else while(!this.is("eof"))a.push(this.statement());this.next();return a};Cola.Parser.prototype.switch_body_=function(){this.expect("{");var a=[],cur=null,branch=null,tmp;while(!this.is("punc","}")){if(this.is("eof"))this.unexpected();if(this.is("keyword","case")||!this.is_js&&this.is("keyword","when")){if(branch)branch.end=this.prev();cur=[];branch=new(!this.is_js&&this.is("keyword","when")?Cola.AST_When:Cola.AST_Case)({start:(tmp=this.S.token,this.next(),tmp),expression:this.expression(true),body:cur});a.push(branch);this.expect(":")}else if(this.is("keyword","default")){if(branch)branch.end=this.prev();cur=[];branch=new Cola.AST_Default({start:(tmp=this.S.token,this.next(),this.expect(":"),tmp),body:cur});a.push(branch)}else{if(!cur)this.unexpected();cur.push(this.statement())}}if(branch)branch.end=this.prev();this.next();return a};Cola.Parser.prototype.try_=function(){var body=this.block_(),bcatch=null,bfinally=null;if(this.is("keyword","catch")){var start=this.S.token;this.next();this.expect("(");var name=this.as_symbol(Cola.AST_SymbolCatch);this.expect(")");bcatch=new Cola.AST_Catch({start:start,argname:name,body:this.block_(),end:this.prev()})}if(this.is("keyword","finally")){var start=this.S.token;this.next();bfinally=new Cola.AST_Finally({start:start,body:this.block_(),end:this.prev()})}if(!bcatch&&!bfinally)this.croak("Missing catch/finally blocks");return new Cola.AST_Try({body:body,bcatch:bcatch,bfinally:bfinally})};Cola.Parser.prototype.vardefs=function(no_in,in_const,type){var a=[],was_template=false;for(;;){was_template=false;a.push(new Cola.AST_VarDef({start:this.S.token,type:type,name:function(_this){return _this.as_symbol(in_const?Cola.AST_SymbolConst:Cola.AST_SymbolVar)}(this),value:this.is("operator","=")?(this.next(),this.expression(false,no_in)):was_template?this.expect_token("operator","="):null,end:this.prev()}));if(!this.is("punc",","))break;this.next()}return a};Cola.Parser.prototype.var_=function(no_in,type){(!type||type=="var")&&(type="dynamic");return new Cola.AST_Var({start:this.prev(),definitions:this.vardefs(no_in,false,type),type:type,end:this.prev()})};Cola.Parser.prototype.const_=function(){return new Cola.AST_Const({start:this.prev(),definitions:this.vardefs(false,true),end:this.prev()})};Cola.Parser.prototype.new_=function(){var start=this.S.token;this.expect_token("operator","new");var newexp=this.expr_atom(false),args;if(this.is("punc","(")){this.next();args=this.expr_list(")",false,false,!this.is_js)}else{args=[]}return this.subscripts(new Cola.AST_New({start:start,expression:newexp,args:args,end:this.prev()}),true)};Cola.Parser.prototype.string_template_=function(start_token){var body=[new Cola.AST_String({start:start_token,end:start_token,value:start_token.value})];this.next();while(this.is("punc","@")||this.is("punc","@{")||this.is("punc","{{")||this.is("string",null))if(this.is("string",null)){body.push(new Cola.AST_String({start:this.S.token,end:this.S.token,value:this.S.token.value}));this.next()}else if(this.is("punc","@")){this.next();body.push(this._make_symbol(Cola.AST_SymbolRef));this.next()}else if(this.is("punc","@{")){this.next();body.push(this.expression(true));this.expect("}")}else if(this.is("punc","{{")){this.next();body.push(this.expression(true));this.expect("}}")}var last=body[body.length-1];body[0].value=body[0].value.replace(/^[ \t]*[\n\r]/,"");if(last instanceof Cola.AST_String){var offstr=last.value.match(/[\n\r][ \t]*$/);if(offstr){offstr=offstr[0];for(var i in body)if(body[i]instanceof Cola.AST_String){body[i].value=body[i].value.replace(new RegExp(offstr,"g"),"\n");body[i].value=body[i].value.replace(/\n/g,"\n")}last.value=last.value.replace(/[\n\r]$/,"")}}if(body.length==1)return body[0];return new Cola.AST_StringTemplate({start:start_token,end:this.prev(),body:body})};Cola.Parser.prototype.as_atom_node=function(){var tok=this.S.token,ret;switch(tok.type){case"name":case"keyword":ret=this._make_symbol(Cola.AST_SymbolRef);break;case"num":ret=new Cola.AST_Number({start:tok,end:tok,value:tok.value});break;case"string":if(this.is_js){ret=new Cola.AST_String({start:tok,end:tok,value:tok.value});break}else return this.string_template_(tok);case"regexp":ret=new Cola.AST_RegExp({start:tok,end:tok,value:tok.value});break;case"atom":if(!this.is_js)switch(tok.value){case"off":case"no":ret=new Cola.AST_False({start:tok,end:tok});break;case"on":case"yes":ret=new Cola.AST_True({start:tok,end:tok});break}switch(tok.value){case"false":ret=new Cola.AST_False({start:tok,end:tok});break;case"true":ret=new Cola.AST_True({start:tok,end:tok});break;case"null":ret=new Cola.AST_Null({start:tok,end:tok});break}break}this.next();return ret};Cola.Parser.prototype.expr_atom=function(allow_calls){if(this.is("operator","new")){return this.new_()}var type,start=this.S.token;if(this.is("punc")){switch(start.value){case"(":if(!this.is_js){var _this=this,balance=1,isfun=false;this.dumpS();this.next();this.next_until(function(){if(_this.is("punc","("))balance++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"));this.restoreS();if(isfun)return this.function_(Cola.AST_Function)}this.next();var ex=this.expression(true);ex.start=start;ex.end=this.S.token;this.expect(")");return this.subscripts(ex,allow_calls);case"[":return this.subscripts(this.array_(),allow_calls);case"{":return this.subscripts(this.object_(),allow_calls)}this.unexpected()}if(!this.is_js&&this.is("name")){if(this.next_is("name")){type=this.S.token.value,this.next();return this.function_(Cola.AST_Function,type)}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++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"))}this.restoreS();if(isfun)return this.function_(Cola.AST_Function)}if(this.is("keyword","function")){this.next();var func=this.function_(Cola.AST_Function);func.start=start;func.end=this.prev();return this.subscripts(func,allow_calls)}if(this.is("keyword","if")&&!this.is_js){this.next();var f=this.if_(true),s=f;return f}if(this.is("keyword","switch")&&!this.is_js){this.next();var swtch={start:start,expression:this.is("punc","{")?new Cola.AST_Noop:this.parenthesised(),body:this.in_loop(this.switch_body_),end:this.prev()},_this=this;swtch.body.forEach(function(branch){if(branch.body.length!=1||!(branch.body[0]instanceof Cola.AST_SimpleStatement))_this.unexpected(branch.start)});return new Cola.AST_Switch(swtch)}if(Cola.ATOMIC_START_TOKEN[this.S.token.type]){return this.subscripts(this.as_atom_node(),allow_calls)}this.unexpected()};Cola.Parser.prototype.expr_list=function(closing,allow_trailing_comma,allow_empty,allow_named_args){var first=true,a=[],name;while(!this.is("punc",closing)){if(first)first=false;else this.expect(",");if(allow_trailing_comma&&this.is("punc",closing))break;if(this.is("punc",",")&&allow_empty){a.push(new Cola.AST_Hole({start:this.S.token,end:this.S.token}))}else if(this.is("name")&&allow_named_args){name=Cola.$_cola_clone(this.S.token);this.dumpS();this.next();if(this.is("punc",":")){this.next();a.push(new Cola.AST_Namedarg({name:name.value,value:this.expression(false),start:name,end:this.prev()}))}else{this.restoreS();a.push(this.expression(false))}}else a.push(this.expression(false))}this.next();return a};Cola.Parser.prototype.array_=Cola.Parser.embed_tokens(function(is_template,is_var){this.expect("[");if(!this.is_js&&!this.is("punc","]")&&!this.is("punc",",")&&!(this.is("name")&&this.next_is("name"))){this.dumpS();var tmp,from=this.expression(false,false,true),triple;if((this.is("punc","..")||this.is("punc","..."))&&!this.next_is("punc",",")&&!this.next_is("punc","]")){triple=this.is("punc","...");this.next();return new Cola.AST_ArrayRange({from:from,to:(tmp=this.expression(true,false,true),this.expect("]"),tmp),triple:triple,start:from.start,end:this.prev()})}this.restoreS()}if(this.is_js)return new Cola.AST_Array({elements:this.expr_list("]",!this.options.strict,true)});var is_array=is_template?false:null,vardef=false,first=true,a=[],val,skiped=false;while(!this.is("punc","]")){if(first)first=false;else this.expect(",");if(this.is("punc",",")||this.is("punc","]")){a.push(new Cola.AST_Hole({start:this.S.token,end:this.S.token}));if(!this.options.strict&&this.is("punc","]"))break}else if(this.is("punc","...")&&is_array!==true){if(skiped)this.unexpected();this.next();skiped=true;is_array=false;a.push(new Cola.AST_Noop)}else if(!is_var&&this.is("name")&&this.next_is("name")&&(!Cola.cKEYWORDS(this.peek().value)||this.peek().value=="var")){if(is_array===true)this.unexpected();is_array=false;vardef=true;a.push(new Cola.AST_VarDef({start:this.S.token,type:this.S.token.value=="var"?"dynamic":this.S.token.value,name:function(_this){_this.next();val=_this.as_symbol(Cola.AST_SymbolVar);if(_this.is("punc","...")&&is_array!==true){if(skiped)_this.unexpected();_this.next();skiped=true;is_array=false;val.splated=true}return val}(this),value:null,end:this.prev()}))}else{if(is_array===false&&this.is("punc","["))val=this.array_(true,is_var);else if(is_array===false&&this.is("punc","{"))val=this.object_(true,is_var);else val=this.expression(false);if(val.vardef)vardef=true;if(this.is("punc","...")&&is_array!==true){if(skiped)this.unexpected();this.next();skiped=true;is_array=false;val.splated=true}if(val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate){if(is_array===true)this.unexpected();is_array=false}if(!(val instanceof Cola.AST_SymbolRef||val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate||!is_var&&(val instanceof Cola.AST_Dot||val instanceof Cola.AST_Sub)||val instanceof Cola.AST_Object&&val.template==true||val instanceof Cola.AST_Array&&val.template==true)){if(is_array===false)this.unexpected();is_array=true}a.push(val)}}this.next();return is_array===true||is_array===null?new Cola.AST_Array({elements:a,template:is_array===null,vardef:vardef}):new Cola.AST_ArrayTemplate({elements:a,vardef:vardef})});Cola.Parser.prototype.object_=Cola.Parser.embed_tokens(function(is_template,is_var){this.expect("{");var first=true,a=[],ptype,is_object=is_template?false:null,vardef=false,val;while(!this.is("punc","}")){if(first)first=false;else this.expect(",");if(!this.options.strict&&this.is("punc","}"))break;var start=this.S.token;var type=start.type;var name=this.as_property_name();if(!this.is_js&&!is_var&&this.is("name")&&!this.next_is("punc","(")&&(!Cola.cKEYWORDS(name)||name=="var")){vardef=true;ptype=name=="var"?"dynamic":name;name=this.as_name()}else ptype=false;if(type=="name"&&!this.is("punc",":")){if(name=="get"){if(!this.is_js&&is_object===false)this.unexpected();is_object=true;a.push(new Cola.AST_ObjectGetter({start:start,type:ptype,key:this.as_atom_node(),value:this.function_(Cola.AST_Accessor),end:this.prev()}));continue}if(name=="set"){if(!this.is_js&&is_object===false)this.unexpected();is_object=true;a.push(new Cola.AST_ObjectSetter({start:start,type:ptype,key:this.as_atom_node(),value:this.function_(Cola.AST_Accessor),end:this.prev()}));continue}}if(!this.is_js&&!this.is("punc",":")){val=new Cola.AST_SymbolRef({name:name})}else{this.expect(":");if(is_object===false&&this.is("punc","["))val=this.array_(true,is_var);else if(is_object===false&&this.is("punc","{"))val=this.object_(true,is_var);else val=this.expression(false);if(ptype&&!(val instanceof Cola.AST_SymbolRef))this.unexpected(val.start);if(val.vardef)vardef=true;if(val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate){if(is_object===true||ptype)this.unexpected();is_object=false}if(!(val instanceof Cola.AST_SymbolRef||val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate||!is_var&&(val instanceof Cola.AST_Dot||val instanceof Cola.AST_Sub)||val instanceof Cola.AST_Object&&val.template==true||val instanceof Cola.AST_Array&&val.template==true)){if(is_object===false)this.unexpected();is_object=true}}a.push(new Cola.AST_ObjectKeyVal({start:start,type:ptype,key:name,value:val,end:this.prev()}))}this.next();return is_object===true||is_object===null?new Cola.AST_Object({properties:a,template:is_object===null,vardef:vardef}):new Cola.AST_ObjectTemplate({properties:a,vardef:vardef})});Cola.Parser.prototype.as_property_name=function(){var tmp=this.S.token;this.next();switch(tmp.type){case"num":case"string":case"name":case"operator":case"keyword":case"atom":return tmp.value;default:this.unexpected()}};Cola.Parser.prototype.as_name=function(){var tmp=this.S.token;this.next();switch(tmp.type){case"name":case"operator":case"keyword":case"atom":return tmp.value;default:this.unexpected()}};Cola.Parser.prototype._make_symbol=function(type){var name=this.S.token.value;return new(name=="this"?Cola.AST_This:type)({name:String(name),start:this.S.token,end:this.S.token})};Cola.Parser.prototype.as_symbol=function(type,noerror){if(!this.is("name")){if(!noerror)this.croak("Name expected");return null}var sym=this._make_symbol(type);this.next();return sym};Cola.Parser.prototype.subscripts=function(expr,allow_calls){var start=expr.start;if(this.is("punc",".")){this.next();return this.subscripts(new Cola.AST_Dot({start:start,expression:expr,property:this.as_name(),end:this.prev()}),allow_calls)}if(this.is("punc","::")&&!this.is_js){this.next();return this.subscripts(new Cola.AST_Proto({start:start,expression:expr,property:this.as_name(),end:this.prev()}),allow_calls)}if(this.is("punc","[")){this.next();var prop,triple;if(this.is_js)prop=this.expression(true);else if(this.is("punc","]"))prop=new Cola.AST_Noop;else{if(this.is("punc","..")||this.is("punc","..."))prop=new Cola.AST_Number({value:0});else prop=this.expression(true,false,true);this.dumpS();if(this.is("punc","..")||this.is("punc","...")){triple=this.is("punc","...");this.next();prop=new Cola.AST_ArrayRange({from:prop,to:this.is("punc","]")?new Cola.AST_Noop:this.expression(true,false,true),triple:triple,start:prop.start,end:this.prev()})}else this.restoreS()}this.expect("]");return this.subscripts(new Cola.AST_Sub({start:start,expression:expr,property:prop,end:this.prev()}),allow_calls)}if(allow_calls&&this.is("punc","(")){this.next();return this.subscripts(new Cola.AST_Call({start:start,expression:expr,args:this.expr_list(")",false,false,!this.is_js),end:this.prev()}),true)}return expr};Cola.Parser.prototype.maybe_unary=function(allow_calls){var start=this.S.token;if(this.is("operator")&&this.UNARY_PREFIX(start.value)){this.next();this.handle_regexp();var ex=this.make_unary(Cola.AST_UnaryPrefix,start.value,this.maybe_unary(allow_calls));ex.start=start;ex.end=this.prev();return ex}var val=this.expr_atom(allow_calls);while(this.is("operator")&&this.UNARY_POSTFIX(this.S.token.value)&&!this.S.token.nlb){val=this.make_unary(Cola.AST_UnaryPostfix,this.S.token.value,val);val.start=start;val.end=this.S.token;this.next()}return val};Cola.Parser.prototype.make_unary=function(ctor,op,expr){if((op=="++"||op=="--")&&!this.is_assignable(expr))this.croak("Invalid use of "+op+" operator");return new ctor({operator:op,expression:expr})};Cola.Parser.prototype.expr_op=function(left,min_prec,no_in,is_comp,rightest){var op=this.is("operator")?this.S.token.value:null,cop=Cola.COMPARISON(op);if(op=="in"&&no_in)op=null;var prec=op!=null?this.PRECEDENCE[op]:null;if(!this.is_js&&is_comp&&cop){this.next();var right=this.maybe_unary(true);return this.expr_op(new Cola.AST_Binary({start:left.start,left:left,operator:"&&",right:new Cola.AST_Binary({start:rightest.start,left:rightest,operator:op,right:right,end:right.end}),end:right.end}),min_prec,no_in,true,right)}if(prec!=null&&prec>min_prec){this.next();var right=!this.is_js&&cop?this.maybe_unary(true):this.expr_op(this.maybe_unary(true),prec,no_in);return this.expr_op(new Cola.AST_Binary({start:left.start,left:left,operator:op,right:right,end:right.end}),min_prec,no_in,cop,right)}return left};Cola.Parser.prototype.expr_ops=function(no_in){return this.expr_op(this.maybe_unary(true),0,no_in)};Cola.Parser.prototype.maybe_conditional=function(no_in){var start=this.S.token;var expr=this.expr_ops(no_in);if(this.is("operator","?")){this.next();var yes=this.expression(false);return new Cola.AST_Conditional({start:start,condition:expr,consequent:yes,alternative:this.is_js||this.is("punc",":")?(this.expect(":"),this.expression(false,no_in)):new Cola.AST_Noop,end:this.prev()})}return expr};Cola.Parser.prototype.is_assignable=function(expr){if(!this.options.strict)return true;if(expr instanceof Cola.AST_This)return false;return expr instanceof Cola.AST_PropAccess||expr instanceof Cola.AST_Symbol};Cola.Parser.prototype.maybe_assign=function(no_in){var start=this.S.token;var left=this.maybe_conditional(no_in),val=this.S.token.value;if(this.is("operator")&&this.ASSIGNMENT(val)){if(this.is_assignable(left)){this.next();return new Cola.AST_Assign({start:start,left:left,operator:val,right:this.maybe_assign(no_in),end:this.prev()})}this.croak("Invalid assignment")}return left};Cola.Parser.prototype.cascade=function(expr,start){var last,props={start:start,expression:expr,subexpressions:[]};while(this.next()){if(this.is("name")||this.is("punc","[")){last=this.expression(false,false,true);if(this.is("punc",":")){last=this.cascade(last,last.start);this.next()}props.subexpressions.push(last);if(!(last instanceof Cola.AST_SymbolRef||last instanceof Cola.AST_Binary||last instanceof Cola.AST_Call||last instanceof Cola.AST_Sub||last instanceof Cola.AST_Dot||last instanceof Cola.AST_Array||last instanceof Cola.AST_Cascade))this.unexpected()}if(!this.is("punc",".."))break}props.end=this.S.token;return new Cola.AST_Cascade(props)};Cola.Parser.prototype.expression=function(commas,no_in,in_dd){var start=this.S.token;var expr=this.maybe_assign(no_in);if(!in_dd&&!this.is_js&&this.is("punc",".."))return this.cascade(expr,start);if(commas&&this.is("punc",",")){if(expr instanceof Cola.AST_Assign&&(expr.left instanceof Cola.AST_ArrayTemplate||expr.left instanceof Cola.AST_ObjectTemplate||(expr.left instanceof Cola.AST_Array||expr.left instanceof Cola.AST_Object)&&expr.left.template)&&expr.left.vardef)this.unexpected();this.next();return new Cola.AST_Seq({start:start,car:expr,cdr:this.expression(true,no_in),end:this.peek()})}return expr};Cola.Parser.prototype.in_loop=function(cont){++this.S.in_loop;var ret=cont.call(this);--this.S.in_loop;return ret};"use strict";!this.Cola&&(this.Cola={});Cola.TreeTransformer=function(before,after){Cola.TreeWalker.call(this);this.before=before;this.after=after};Cola.TreeTransformer.prototype.__proto__=new Cola.TreeWalker;(function(undefined){function _(node,descend){node.DEFMETHOD("_descend",descend);node.DEFMETHOD("transform",function(tw,in_list){var x,y;tw.push(this);if(tw.before)x=tw.before(this,descend,in_list);if(x===undefined){if(!tw.after){x=this;descend(x,tw)}else{tw.stack[tw.stack.length-1]=x=this.clone();descend(x,tw);y=tw.after(x,in_list);if(y!==undefined)x=y}}tw.pop();return x})}function do_list(list,tw){return Cola.MAP(list,function(node){var r=node.transform(tw,true);if(!r)r=Cola.MAP.continue();else if(r instanceof Array)r=Cola.MAP.splice(r);return r})}_(Cola.AST_Node,Cola.noop);_(Cola.AST_LabeledStatement,function(self,tw){self.label=self.label.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_SimpleStatement,function(self,tw){self.body=self.body.transform(tw)});_(Cola.AST_Block,function(self,tw){self.body=do_list(self.body,tw)});_(Cola.AST_DWLoop,function(self,tw){self.condition=self.condition.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_For,function(self,tw){if(self.init)self.init=self.init.transform(tw);if(self.condition)self.condition=self.condition.transform(tw);if(self.step)self.step=self.step.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_ForIn,function(self,tw){self.init=self.init.transform(tw);self.object=self.object.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_With,function(self,tw){self.expression=self.expression.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_Exit,function(self,tw){if(self.value)self.value=self.value.transform(tw)});_(Cola.AST_LoopControl,function(self,tw){if(self.label)self.label=self.label.transform(tw)});_(Cola.AST_If,function(self,tw){self.condition=self.condition.transform(tw);self.body=self.body.transform(tw);if(self.alternative)self.alternative=self.alternative.transform(tw)});_(Cola.AST_Switch,function(self,tw){self.expression=self.expression.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Case,function(self,tw){self.expression=self.expression.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Try,function(self,tw){self.body=do_list(self.body,tw);if(self.bcatch)self.bcatch=self.bcatch.transform(tw);if(self.bfinally)self.bfinally=self.bfinally.transform(tw)});_(Cola.AST_Catch,function(self,tw){self.argname=self.argname.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Definitions,function(self,tw){self.definitions=do_list(self.definitions,tw)});_(Cola.AST_VarDef,function(self,tw){self.name=self.name.transform(tw);if(self.value)self.value=self.value.transform(tw)});_(Cola.AST_Lambda,function(self,tw){if(self.name)self.name=self.name.transform(tw);self.argnames=do_list(self.argnames,tw);self.body=do_list(self.body,tw)});_(Cola.AST_Call,function(self,tw){self.expression=self.expression.transform(tw);self.args=do_list(self.args,tw)});_(Cola.AST_Seq,function(self,tw){self.car=self.car.transform(tw);self.cdr=self.cdr.transform(tw)});_(Cola.AST_Dot,function(self,tw){self.expression=self.expression.transform(tw)});_(Cola.AST_Sub,function(self,tw){self.expression=self.expression.transform(tw);self.property=self.property.transform(tw)});_(Cola.AST_Unary,function(self,tw){self.expression=self.expression.transform(tw)});_(Cola.AST_Binary,function(self,tw){self.left=self.left.transform(tw);self.right=self.right.transform(tw)});_(Cola.AST_Conditional,function(self,tw){self.condition=self.condition.transform(tw);self.consequent=self.consequent.transform(tw);self.alternative=self.alternative.transform(tw)});_(Cola.AST_Array,function(self,tw){self.elements=do_list(self.elements,tw)});_(Cola.AST_Object,function(self,tw){self.properties=do_list(self.properties,tw)});_(Cola.AST_ObjectProperty,function(self,tw){self.value=self.value.transform(tw)})})();"use strict";!this.Cola&&(this.Cola={});Cola.SymbolDef=function(scope,index,orig){this.name=orig.name;this.orig=[orig];this.scope=scope;this.references=[];this.global=false; +};Cola.Parser.prototype.parenthesised=function(){this.expect("(");var exp=this.expression(true);this.expect(")");return exp};Cola.Parser.embed_tokens=function(parser){return function(){var start=this.S.token;var expr=parser.apply(this,arguments);var end=this.prev();expr.start=start;expr.end=end;return expr}};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(){var tmp,type,_this=this;this.handle_regexp();switch(this.S.token.type){case"string":var dir=this.S.in_directives,stat=this.simple_statement();if(dir&&stat.body instanceof Cola.AST_String&&!this.is("punc",","))return new Cola.AST_Directive({value:stat.body.value});return stat;case"num":case"regexp":case"operator":case"atom":return this.simple_statement();case"name":if(!this.is_js&&this.next_is("name")){type=this.S.token.value,this.next();if(this.next_is("punc","("))return this.function_(Cola.AST_Defun,type);return tmp=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++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"))}this.restoreS();if(isfun)return this.function_(Cola.AST_Defun)}return this.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"))return new Cola.AST_Command({name:this.next().value,args:function(name){var args=[];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()}else if(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","{"),new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(!this.is("punc","{")),end:this.prev()}))}else if(this.S.token.value!="asm"&&this.S.token.value!="strict")this.unexpected()}else this.unexpected();return args}.call(this,this.S.token.value)});case"{":if(this.is_js)return new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});this.dumpS();var balance=0,is_object=false;this.next_until(function(){if(_this.is("punc","{"))balance++;else if(_this.is("punc","}"))balance--;return balance==0||_this.is("eof")});is_object=this.next_is("operator");this.restoreS();if(is_object)return this.simple_statement();return new Cola.AST_BlockStatement({start:this.S.token,body:this.block_(),end:this.prev()});case"[":case"(":return this.simple_statement();case";":this.next();return new Cola.AST_EmptyStatement;default:this.unexpected()}case"keyword":switch(tmp=this.S.token.value,this.next(),tmp){case"break":return this.break_cont(Cola.AST_Break);case"continue":return this.break_cont(Cola.AST_Continue);case"debugger":this.semicolon();return new Cola.AST_Debugger;case"do":return new Cola.AST_Do({body:this.in_loop(function(){return this.statement()}),condition:(this.expect_token("keyword","while"),tmp=this.parenthesised(),this.semicolon(),tmp)});case"while":return new Cola.AST_While({condition:this.parenthesised(),body:this.in_loop(function(){return this.statement()})});case"for":return this.for_();case"function":return this.function_(Cola.AST_Defun);case"if":return this.if_();case"return":if(this.S.in_function==0)this.croak("'return' outside of function");return new Cola.AST_Return({value:this.is("punc",";")?(this.next(),null):this.can_insert_semicolon()?null:(tmp=this.expression(true),this.semicolon(),tmp)});case"switch":return new Cola.AST_Switch({expression:this.is("punc","{")&&!this.is_js?new Cola.AST_Noop:this.parenthesised(),body:this.in_loop(this.switch_body_)});case"throw":if(this.S.token.nlb)this.croak("Illegal newline after 'throw'");return new Cola.AST_Throw({value:(tmp=this.expression(true),this.semicolon(),tmp)});case"try":return this.try_();case"var":return tmp=this.var_(),this.semicolon(),tmp;case"const":return tmp=this.const_(),this.semicolon(),tmp;case"with":return new Cola.AST_With({expression:this.parenthesised(),body:this.statement()});default:this.unexpected()}}});Cola.Parser.prototype.labeled_statement=function(){var label=this.as_symbol(Cola.AST_Label),_this=this;if(Cola.find_if(function(l){return l.name==label.name},this.S.labels)){this.croak("Label "+label.name+" defined twice")}this.expect(":");this.S.labels.push(label);var stat=this.statement();this.S.labels.pop();if(!(stat instanceof Cola.AST_IterationStatement)){label.references.forEach(function(ref){if(ref instanceof Cola.AST_Continue){ref=ref.label.start;_this.croak("Continue label `"+label.name+"` refers to non-IterationStatement.",ref.line,ref.col,ref.pos)}})}return new Cola.AST_LabeledStatement({body:stat,label:label})};Cola.Parser.prototype.simple_statement=function(tmp){return new Cola.AST_SimpleStatement({body:(tmp=this.expression(true),this.semicolon(),tmp)})};Cola.Parser.prototype.break_cont=function(type){var label=null,ldef;if(!this.can_insert_semicolon()){label=this.as_symbol(Cola.AST_LabelRef,true)}if(label!=null){ldef=Cola.find_if(function(l){return l.name==label.name},this.S.labels);if(!ldef)this.croak("Undefined label "+label.name);label.thedef=ldef}else if(this.S.in_loop==0)this.croak(type.TYPE+" not inside a loop or switch");this.semicolon();var stat=new type({label:label});if(ldef)ldef.references.push(stat);return stat};Cola.Parser.prototype.for_=function(){this.expect("(");var init=null;if(!this.is("punc",";")){init=this.is("keyword","var")||!this.is_js&&this.is("name")&&this.next_is("name")?(this.next(),this.var_(true,this.prev().value)):this.expression(true,true);if(this.is("operator","in")){if(init instanceof Cola.AST_Var&&init.definitions.length>1)this.croak("Only one variable declaration allowed in for..in loop");this.next();return this.for_in(init)}}return this.regular_for(init)};Cola.Parser.prototype.regular_for=function(init){this.expect(";");var test=this.is("punc",";")?null:this.expression(true);this.expect(";");var step=this.is("punc",")")?null:this.expression(true);this.expect(")");var _this=this;return new Cola.AST_For({init:init,condition:test,step:step,body:this.in_loop(function(){return this.statement()})})};Cola.Parser.prototype.for_in=function(init){var lhs=init instanceof Cola.AST_Var?init.definitions[0].name:null;var obj=this.expression(true);this.expect(")");var _this=this;return new Cola.AST_ForIn({init:init,name:lhs,object:obj,body:this.in_loop(function(){return this.statement()})})};Cola.Parser.prototype.as_funcarg=function(splatedexist){var name=this.as_symbol(Cola.AST_SymbolFunarg),type=name,argtype="positional",defval=new Cola.AST_Noop;if(this.is("name"))name=this.as_symbol(Cola.AST_SymbolFunarg);if(this.is("punc","...")){if(splatedexist)this.token_error(this.S,"Unexpected token: splated argument can be only one.");if(type!=name&&type.name!="Array")this.token_error(this.S,"Unexpected token: splated argument must have `Array` type.");this.next();argtype="splated"}else if(this.is("operator","=")){this.next();defval=this.expression(false)}else if(this.is("punc",":")){this.next();argtype="named";if(!this.is("punc",",")&&!this.is("punc",")")){defval=this.expression(false)}}return new Cola.AST_ArgDef({name:name,type:name.type=argtype=="splated"?"Array":type==name?"dynamic":type.name,argtype:argtype,defval:defval,start:type.start,end:this.prev()})};Cola.Parser.prototype.function_=function(ctor,type){!type&&(type="dynamic");var in_statement=ctor===Cola.AST_Defun,_this=this,splatedexist=false;var name=this.is("name")?this.as_symbol(in_statement?Cola.AST_SymbolDefun:Cola.AST_SymbolLambda):null;if(in_statement&&!name)this.unexpected();this.expect("(");return new ctor({type:type,name:name,argnames:function(first,a){while(!_this.is("punc",")")){if(first)first=false;else _this.expect(",");a.push(_this.is_js?_this.as_symbol(Cola.AST_SymbolFunarg):_this.as_funcarg(splatedexist));splatedexist=a[a.length-1].argtype=="splated"}_this.next();return a}(true,[]),body:function(loop,labels){++_this.S.in_function;_this.S.in_directives=true;_this.S.in_loop=0;_this.S.labels=[];var tmp,a=!_this.is_js&&_this.is("punc","=>")?(_this.next(),[new Cola.AST_Return({start:new Cola.AST_Token({nlb:false,type:"keyword",value:"return"}),value:function(){tmp=_this.expression(ctor===Cola.AST_Defun);if(ctor===Cola.AST_Defun){_this.semicolon()}return tmp}(),end:_this.prev()})]):_this.block_();--_this.S.in_function;_this.S.in_loop=loop;_this.S.labels=labels;return a}(this.S.in_loop,this.S.labels)})};Cola.Parser.prototype.if_=function(inline){var cond=this.parenthesised(),body=inline&&!this.is_js?this.expression(true):this.statement(),belse=null;if(this.is("keyword","else")){this.next();if(inline&&!this.is_js)belse=this.is("keyword","if")?(this.next(),this.if_(true)):this.expression(true);else belse=this.statement()}return new Cola.AST_If({condition:cond,body:body,alternative:belse,inline:inline})};Cola.Parser.prototype.block_=function(to_eof){if(this.is_js||!to_eof)this.expect("{");var a=[];if(this.is_js||!to_eof)while(!this.is("punc","}")){if(this.is("eof"))this.unexpected();a.push(this.statement())}else while(!this.is("eof"))a.push(this.statement());this.next();return a};Cola.Parser.prototype.switch_body_=function(){this.expect("{");var a=[],cur=null,branch=null,tmp;while(!this.is("punc","}")){if(this.is("eof"))this.unexpected();if(this.is("keyword","case")||!this.is_js&&this.is("keyword","when")){if(branch)branch.end=this.prev();cur=[];branch=new(!this.is_js&&this.is("keyword","when")?Cola.AST_When:Cola.AST_Case)({start:(tmp=this.S.token,this.next(),tmp),expression:this.expression(true),body:cur});a.push(branch);this.expect(":")}else if(this.is("keyword","default")){if(branch)branch.end=this.prev();cur=[];branch=new Cola.AST_Default({start:(tmp=this.S.token,this.next(),this.expect(":"),tmp),body:cur});a.push(branch)}else{if(!cur)this.unexpected();cur.push(this.statement())}}if(branch)branch.end=this.prev();this.next();return a};Cola.Parser.prototype.try_=function(){var body=this.block_(),bcatch=null,bfinally=null;if(this.is("keyword","catch")){var start=this.S.token;this.next();this.expect("(");var name=this.as_symbol(Cola.AST_SymbolCatch);this.expect(")");bcatch=new Cola.AST_Catch({start:start,argname:name,body:this.block_(),end:this.prev()})}if(this.is("keyword","finally")){var start=this.S.token;this.next();bfinally=new Cola.AST_Finally({start:start,body:this.block_(),end:this.prev()})}if(!bcatch&&!bfinally)this.croak("Missing catch/finally blocks");return new Cola.AST_Try({body:body,bcatch:bcatch,bfinally:bfinally})};Cola.Parser.prototype.vardefs=function(no_in,in_const,type){var a=[],was_template=false;for(;;){was_template=false;a.push(new Cola.AST_VarDef({start:this.S.token,type:type,name:function(_this){return _this.as_symbol(in_const?Cola.AST_SymbolConst:Cola.AST_SymbolVar)}(this),value:this.is("operator","=")?(this.next(),this.expression(false,no_in)):was_template?this.expect_token("operator","="):null,end:this.prev()}));if(!this.is("punc",","))break;this.next()}return a};Cola.Parser.prototype.var_=function(no_in,type){(!type||type=="var")&&(type="dynamic");return new Cola.AST_Var({start:this.prev(),definitions:this.vardefs(no_in,false,type),type:type,end:this.prev()})};Cola.Parser.prototype.const_=function(){return new Cola.AST_Const({start:this.prev(),definitions:this.vardefs(false,true),end:this.prev()})};Cola.Parser.prototype.new_=function(){var start=this.S.token;this.expect_token("operator","new");var newexp=this.expr_atom(false),args;if(this.is("punc","(")){this.next();args=this.expr_list(")",false,false,!this.is_js)}else{args=[]}return this.subscripts(new Cola.AST_New({start:start,expression:newexp,args:args,end:this.prev()}),true)};Cola.Parser.prototype.string_template_=function(start_token){var body=[new Cola.AST_String({start:start_token,end:start_token,value:start_token.value})];this.next();while(this.is("punc","@")||this.is("punc","@{")||this.is("punc","{{")||this.is("string",null))if(this.is("string",null)){body.push(new Cola.AST_String({start:this.S.token,end:this.S.token,value:this.S.token.value}));this.next()}else if(this.is("punc","@")){this.next();body.push(this._make_symbol(Cola.AST_SymbolRef));this.next()}else if(this.is("punc","@{")){this.next();body.push(this.expression(true));this.expect("}")}else if(this.is("punc","{{")){this.next();body.push(this.expression(true));this.expect("}}")}var last=body[body.length-1];body[0].value=body[0].value.replace(/^[ \t]*[\n\r]/,"");if(last instanceof Cola.AST_String){var offstr=last.value.match(/[\n\r][ \t]*$/);if(offstr){offstr=offstr[0];for(var i in body)if(body[i]instanceof Cola.AST_String){body[i].value=body[i].value.replace(new RegExp(offstr,"g"),"\n");body[i].value=body[i].value.replace(/\n/g,"\n")}last.value=last.value.replace(/[\n\r]$/,"")}}if(body.length==1)return body[0];return new Cola.AST_StringTemplate({start:start_token,end:this.prev(),body:body})};Cola.Parser.prototype.as_atom_node=function(){var tok=this.S.token,ret;switch(tok.type){case"name":case"keyword":ret=this._make_symbol(Cola.AST_SymbolRef);break;case"num":ret=new Cola.AST_Number({start:tok,end:tok,value:tok.value});break;case"string":if(this.is_js){ret=new Cola.AST_String({start:tok,end:tok,value:tok.value});break}else return this.string_template_(tok);case"regexp":ret=new Cola.AST_RegExp({start:tok,end:tok,value:tok.value});break;case"atom":if(!this.is_js)switch(tok.value){case"off":case"no":ret=new Cola.AST_False({start:tok,end:tok});break;case"on":case"yes":ret=new Cola.AST_True({start:tok,end:tok});break}switch(tok.value){case"false":ret=new Cola.AST_False({start:tok,end:tok});break;case"true":ret=new Cola.AST_True({start:tok,end:tok});break;case"null":ret=new Cola.AST_Null({start:tok,end:tok});break}break}this.next();return ret};Cola.Parser.prototype.expr_atom=function(allow_calls){if(this.is("operator","new")){return this.new_()}var type,start=this.S.token;if(this.is("punc")){switch(start.value){case"(":if(!this.is_js){var _this=this,balance=1,isfun=false;this.dumpS();this.next();this.next_until(function(){if(_this.is("punc","("))balance++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"));this.restoreS();if(isfun)return this.function_(Cola.AST_Function)}this.next();var ex=this.expression(true);ex.start=start;ex.end=this.S.token;this.expect(")");return this.subscripts(ex,allow_calls);case"[":return this.subscripts(this.array_(),allow_calls);case"{":return this.subscripts(this.object_(),allow_calls)}this.unexpected()}if(!this.is_js&&this.is("name")){if(this.next_is("name")){type=this.S.token.value,this.next();return this.function_(Cola.AST_Function,type)}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++;else if(_this.is("punc",")"))balance--;return balance==0||_this.is("eof")});isfun=(this.next(),this.is("punc","{")||this.is("punc","=>"))}this.restoreS();if(isfun)return this.function_(Cola.AST_Function)}if(this.is("keyword","function")){this.next();var func=this.function_(Cola.AST_Function);func.start=start;func.end=this.prev();return this.subscripts(func,allow_calls)}if(this.is("keyword","if")&&!this.is_js){this.next();var f=this.if_(true),s=f;return f}if(this.is("keyword","switch")&&!this.is_js){this.next();var swtch={start:start,expression:this.is("punc","{")?new Cola.AST_Noop:this.parenthesised(),body:this.in_loop(this.switch_body_),end:this.prev()},_this=this;swtch.body.forEach(function(branch){if(branch.body.length!=1||!(branch.body[0]instanceof Cola.AST_SimpleStatement))_this.unexpected(branch.start)});return new Cola.AST_Switch(swtch)}if(Cola.ATOMIC_START_TOKEN[this.S.token.type]){return this.subscripts(this.as_atom_node(),allow_calls)}this.unexpected()};Cola.Parser.prototype.expr_list=function(closing,allow_trailing_comma,allow_empty,allow_named_args){var first=true,a=[],name;while(!this.is("punc",closing)){if(first)first=false;else this.expect(",");if(allow_trailing_comma&&this.is("punc",closing))break;if(this.is("punc",",")&&allow_empty){a.push(new Cola.AST_Hole({start:this.S.token,end:this.S.token}))}else if(this.is("name")&&allow_named_args){name=Cola._ColaRuntime$clone(this.S.token);this.dumpS();this.next();if(this.is("punc",":")){this.next();a.push(new Cola.AST_Namedarg({name:name.value,value:this.expression(false),start:name,end:this.prev()}))}else{this.restoreS();a.push(this.expression(false))}}else a.push(this.expression(false))}this.next();return a};Cola.Parser.prototype.array_=Cola.Parser.embed_tokens(function(is_template,is_var){this.expect("[");if(!this.is_js&&!this.is("punc","]")&&!this.is("punc",",")&&!(this.is("name")&&this.next_is("name"))){this.dumpS();var tmp,from=this.expression(false,false,true),triple;if((this.is("punc","..")||this.is("punc","..."))&&!this.next_is("punc",",")&&!this.next_is("punc","]")){triple=this.is("punc","...");this.next();return new Cola.AST_ArrayRange({from:from,to:(tmp=this.expression(true,false,true),this.expect("]"),tmp),triple:triple,start:from.start,end:this.prev()})}this.restoreS()}if(this.is_js)return new Cola.AST_Array({elements:this.expr_list("]",!this.options.strict,true)});var is_array=is_template?false:null,vardef=false,first=true,a=[],val,skiped=false;while(!this.is("punc","]")){if(first)first=false;else this.expect(",");if(this.is("punc",",")||this.is("punc","]")){a.push(new Cola.AST_Hole({start:this.S.token,end:this.S.token}));if(!this.options.strict&&this.is("punc","]"))break}else if(this.is("punc","...")&&is_array!==true){if(skiped)this.unexpected();this.next();skiped=true;is_array=false;a.push(new Cola.AST_Noop)}else if(!is_var&&this.is("name")&&this.next_is("name")&&(!Cola.cKEYWORDS(this.peek().value)||this.peek().value=="var")){if(is_array===true)this.unexpected();is_array=false;vardef=true;a.push(new Cola.AST_VarDef({start:this.S.token,type:this.S.token.value=="var"?"dynamic":this.S.token.value,name:function(_this){_this.next();val=_this.as_symbol(Cola.AST_SymbolVar);if(_this.is("punc","...")&&is_array!==true){if(skiped)_this.unexpected();_this.next();skiped=true;is_array=false;val.splated=true}return val}(this),value:null,end:this.prev()}))}else{if(is_array===false&&this.is("punc","["))val=this.array_(true,is_var);else if(is_array===false&&this.is("punc","{"))val=this.object_(true,is_var);else val=this.expression(false);if(val.vardef)vardef=true;if(this.is("punc","...")&&is_array!==true){if(skiped)this.unexpected();this.next();skiped=true;is_array=false;val.splated=true}if(val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate){if(is_array===true)this.unexpected();is_array=false}if(!(val instanceof Cola.AST_SymbolRef||val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate||!is_var&&(val instanceof Cola.AST_Dot||val instanceof Cola.AST_Sub)||val instanceof Cola.AST_Object&&val.template==true||val instanceof Cola.AST_Array&&val.template==true)){if(is_array===false)this.unexpected();is_array=true}a.push(val)}}this.next();return is_array===true||is_array===null?new Cola.AST_Array({elements:a,template:is_array===null,vardef:vardef}):new Cola.AST_ArrayTemplate({elements:a,vardef:vardef})});Cola.Parser.prototype.object_=Cola.Parser.embed_tokens(function(is_template,is_var){this.expect("{");var first=true,a=[],ptype,is_object=is_template?false:null,vardef=false,val;while(!this.is("punc","}")){if(first)first=false;else this.expect(",");if(!this.options.strict&&this.is("punc","}"))break;var start=this.S.token;var type=start.type;var name=this.as_property_name();if(!this.is_js&&!is_var&&this.is("name")&&!this.next_is("punc","(")&&(!Cola.cKEYWORDS(name)||name=="var")){vardef=true;ptype=name=="var"?"dynamic":name;name=this.as_name()}else ptype=false;if(type=="name"&&!this.is("punc",":")){if(name=="get"){if(!this.is_js&&is_object===false)this.unexpected();is_object=true;a.push(new Cola.AST_ObjectGetter({start:start,type:ptype,key:this.as_atom_node(),value:this.function_(Cola.AST_Accessor),end:this.prev()}));continue}if(name=="set"){if(!this.is_js&&is_object===false)this.unexpected();is_object=true;a.push(new Cola.AST_ObjectSetter({start:start,type:ptype,key:this.as_atom_node(),value:this.function_(Cola.AST_Accessor),end:this.prev()}));continue}}if(!this.is_js&&!this.is("punc",":")){val=new Cola.AST_SymbolRef({name:name})}else{this.expect(":");if(is_object===false&&this.is("punc","["))val=this.array_(true,is_var);else if(is_object===false&&this.is("punc","{"))val=this.object_(true,is_var);else val=this.expression(false);if(ptype&&!(val instanceof Cola.AST_SymbolRef))this.unexpected(val.start);if(val.vardef)vardef=true;if(val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate){if(is_object===true||ptype)this.unexpected();is_object=false}if(!(val instanceof Cola.AST_SymbolRef||val instanceof Cola.AST_ObjectTemplate||val instanceof Cola.AST_ArrayTemplate||!is_var&&(val instanceof Cola.AST_Dot||val instanceof Cola.AST_Sub)||val instanceof Cola.AST_Object&&val.template==true||val instanceof Cola.AST_Array&&val.template==true)){if(is_object===false)this.unexpected();is_object=true}}a.push(new Cola.AST_ObjectKeyVal({start:start,type:ptype,key:name,value:val,end:this.prev()}))}this.next();return is_object===true||is_object===null?new Cola.AST_Object({properties:a,template:is_object===null,vardef:vardef}):new Cola.AST_ObjectTemplate({properties:a,vardef:vardef})});Cola.Parser.prototype.as_property_name=function(){var tmp=this.S.token;this.next();switch(tmp.type){case"num":case"string":case"name":case"operator":case"keyword":case"atom":return tmp.value;default:this.unexpected()}};Cola.Parser.prototype.as_name=function(){var tmp=this.S.token;this.next();switch(tmp.type){case"name":case"operator":case"keyword":case"atom":return tmp.value;default:this.unexpected()}};Cola.Parser.prototype._make_symbol=function(type){var name=this.S.token.value;return new(name=="this"?Cola.AST_This:type)({name:String(name),start:this.S.token,end:this.S.token})};Cola.Parser.prototype.as_symbol=function(type,noerror){if(!this.is("name")){if(!noerror)this.croak("Name expected");return null}var sym=this._make_symbol(type);this.next();return sym};Cola.Parser.prototype.subscripts=function(expr,allow_calls){var start=expr.start;if(this.is("punc",".")){this.next();return this.subscripts(new Cola.AST_Dot({start:start,expression:expr,property:this.as_name(),end:this.prev()}),allow_calls)}if(this.is("punc","::")&&!this.is_js){this.next();return this.subscripts(new Cola.AST_Proto({start:start,expression:expr,property:this.as_name(),end:this.prev()}),allow_calls)}if(this.is("punc","[")){this.next();var prop,triple;if(this.is_js)prop=this.expression(true);else if(this.is("punc","]"))prop=new Cola.AST_Noop;else{if(this.is("punc","..")||this.is("punc","..."))prop=new Cola.AST_Number({value:0});else prop=this.expression(true,false,true);this.dumpS();if(this.is("punc","..")||this.is("punc","...")){triple=this.is("punc","...");this.next();prop=new Cola.AST_ArrayRange({from:prop,to:this.is("punc","]")?new Cola.AST_Noop:this.expression(true,false,true),triple:triple,start:prop.start,end:this.prev()})}else this.restoreS()}this.expect("]");return this.subscripts(new Cola.AST_Sub({start:start,expression:expr,property:prop,end:this.prev()}),allow_calls)}if(allow_calls&&this.is("punc","(")){this.next();return this.subscripts(new Cola.AST_Call({start:start,expression:expr,args:this.expr_list(")",false,false,!this.is_js),end:this.prev()}),true)}return expr};Cola.Parser.prototype.maybe_unary=function(allow_calls){var start=this.S.token;if(this.is("operator")&&this.UNARY_PREFIX(start.value)){this.next();this.handle_regexp();var ex=this.make_unary(Cola.AST_UnaryPrefix,start.value,this.maybe_unary(allow_calls));ex.start=start;ex.end=this.prev();return ex}var val=this.expr_atom(allow_calls);while(this.is("operator")&&this.UNARY_POSTFIX(this.S.token.value)&&!this.S.token.nlb){val=this.make_unary(Cola.AST_UnaryPostfix,this.S.token.value,val);val.start=start;val.end=this.S.token;this.next()}return val};Cola.Parser.prototype.make_unary=function(ctor,op,expr){if((op=="++"||op=="--")&&!this.is_assignable(expr))this.croak("Invalid use of "+op+" operator");return new ctor({operator:op,expression:expr})};Cola.Parser.prototype.expr_op=function(left,min_prec,no_in,is_comp,rightest){var op=this.is("operator")?this.S.token.value:null,cop=Cola.COMPARISON(op);if(op=="in"&&no_in)op=null;var prec=op!=null?this.PRECEDENCE[op]:null;if(!this.is_js&&is_comp&&cop){this.next();var right=this.maybe_unary(true);return this.expr_op(new Cola.AST_Binary({start:left.start,left:left,operator:"&&",right:new Cola.AST_Binary({start:rightest.start,left:rightest,operator:op,right:right,end:right.end}),end:right.end}),min_prec,no_in,true,right)}if(prec!=null&&prec>min_prec){this.next();var right=!this.is_js&&cop?this.maybe_unary(true):this.expr_op(this.maybe_unary(true),prec,no_in);return this.expr_op(new Cola.AST_Binary({start:left.start,left:left,operator:op,right:right,end:right.end}),min_prec,no_in,cop,right)}return left};Cola.Parser.prototype.expr_ops=function(no_in){return this.expr_op(this.maybe_unary(true),0,no_in)};Cola.Parser.prototype.maybe_conditional=function(no_in){var start=this.S.token;var expr=this.expr_ops(no_in);if(this.is("operator","?")){this.next();var yes=this.expression(false);return new Cola.AST_Conditional({start:start,condition:expr,consequent:yes,alternative:this.is_js||this.is("punc",":")?(this.expect(":"),this.expression(false,no_in)):new Cola.AST_Noop,end:this.prev()})}return expr};Cola.Parser.prototype.is_assignable=function(expr){if(!this.options.strict)return true;if(expr instanceof Cola.AST_This)return false;return expr instanceof Cola.AST_PropAccess||expr instanceof Cola.AST_Symbol};Cola.Parser.prototype.maybe_assign=function(no_in){var start=this.S.token;var left=this.maybe_conditional(no_in),val=this.S.token.value;if(this.is("operator")&&this.ASSIGNMENT(val)){if(this.is_assignable(left)){this.next();return new Cola.AST_Assign({start:start,left:left,operator:val,right:this.maybe_assign(no_in),end:this.prev()})}this.croak("Invalid assignment")}return left};Cola.Parser.prototype.cascade=function(expr,start){var last,props={start:start,expression:expr,subexpressions:[]};while(this.next()){if(this.is("name")||this.is("punc","[")){last=this.expression(false,false,true);if(this.is("punc",":")){last=this.cascade(last,last.start);this.next()}props.subexpressions.push(last);if(!(last instanceof Cola.AST_SymbolRef||last instanceof Cola.AST_Binary||last instanceof Cola.AST_Call||last instanceof Cola.AST_Sub||last instanceof Cola.AST_Dot||last instanceof Cola.AST_Array||last instanceof Cola.AST_Cascade))this.unexpected()}if(!this.is("punc",".."))break}props.end=this.S.token;return new Cola.AST_Cascade(props)};Cola.Parser.prototype.expression=function(commas,no_in,in_dd){var start=this.S.token;var expr=this.maybe_assign(no_in);if(!in_dd&&!this.is_js&&this.is("punc",".."))return this.cascade(expr,start);if(commas&&this.is("punc",",")){if(expr instanceof Cola.AST_Assign&&(expr.left instanceof Cola.AST_ArrayTemplate||expr.left instanceof Cola.AST_ObjectTemplate||(expr.left instanceof Cola.AST_Array||expr.left instanceof Cola.AST_Object)&&expr.left.template)&&expr.left.vardef)this.unexpected();this.next();return new Cola.AST_Seq({start:start,car:expr,cdr:this.expression(true,no_in),end:this.peek()})}return expr};Cola.Parser.prototype.in_loop=function(cont){++this.S.in_loop;var ret=cont.call(this);--this.S.in_loop;return ret};"use strict";!this.Cola&&(this.Cola={});Cola.TreeTransformer=function(before,after){Cola.TreeWalker.call(this);this.before=before;this.after=after};Cola.TreeTransformer.prototype.__proto__=new Cola.TreeWalker;(function(undefined){function _(node,descend){node.DEFMETHOD("_descend",descend);node.DEFMETHOD("transform",function(tw,in_list){var x,y;tw.push(this);if(tw.before)x=tw.before(this,descend,in_list);if(x===undefined){if(!tw.after){x=this;descend(x,tw)}else{tw.stack[tw.stack.length-1]=x=this.clone();descend(x,tw);y=tw.after(x,in_list);if(y!==undefined)x=y}}tw.pop();return x})}function do_list(list,tw){return Cola.MAP(list,function(node){var r=node.transform(tw,true);if(!r)r=Cola.MAP.continue();else if(r instanceof Array)r=Cola.MAP.splice(r);return r})}_(Cola.AST_Node,Cola.noop);_(Cola.AST_LabeledStatement,function(self,tw){self.label=self.label.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_SimpleStatement,function(self,tw){self.body=self.body.transform(tw)});_(Cola.AST_Block,function(self,tw){self.body=do_list(self.body,tw)});_(Cola.AST_DWLoop,function(self,tw){self.condition=self.condition.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_For,function(self,tw){if(self.init)self.init=self.init.transform(tw);if(self.condition)self.condition=self.condition.transform(tw);if(self.step)self.step=self.step.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_ForIn,function(self,tw){self.init=self.init.transform(tw);self.object=self.object.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_With,function(self,tw){self.expression=self.expression.transform(tw);self.body=self.body.transform(tw)});_(Cola.AST_Exit,function(self,tw){if(self.value)self.value=self.value.transform(tw)});_(Cola.AST_LoopControl,function(self,tw){if(self.label)self.label=self.label.transform(tw)});_(Cola.AST_If,function(self,tw){self.condition=self.condition.transform(tw);self.body=self.body.transform(tw);if(self.alternative)self.alternative=self.alternative.transform(tw)});_(Cola.AST_Switch,function(self,tw){self.expression=self.expression.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Case,function(self,tw){self.expression=self.expression.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Try,function(self,tw){self.body=do_list(self.body,tw);if(self.bcatch)self.bcatch=self.bcatch.transform(tw);if(self.bfinally)self.bfinally=self.bfinally.transform(tw)});_(Cola.AST_Catch,function(self,tw){self.argname=self.argname.transform(tw);self.body=do_list(self.body,tw)});_(Cola.AST_Definitions,function(self,tw){self.definitions=do_list(self.definitions,tw)});_(Cola.AST_VarDef,function(self,tw){self.name=self.name.transform(tw);if(self.value)self.value=self.value.transform(tw)});_(Cola.AST_Lambda,function(self,tw){if(self.name)self.name=self.name.transform(tw);self.argnames=do_list(self.argnames,tw);self.body=do_list(self.body,tw)});_(Cola.AST_Call,function(self,tw){self.expression=self.expression.transform(tw);self.args=do_list(self.args,tw)});_(Cola.AST_Seq,function(self,tw){self.car=self.car.transform(tw);self.cdr=self.cdr.transform(tw)});_(Cola.AST_Dot,function(self,tw){self.expression=self.expression.transform(tw)});_(Cola.AST_Sub,function(self,tw){self.expression=self.expression.transform(tw);self.property=self.property.transform(tw)});_(Cola.AST_Unary,function(self,tw){self.expression=self.expression.transform(tw)});_(Cola.AST_Binary,function(self,tw){self.left=self.left.transform(tw);self.right=self.right.transform(tw)});_(Cola.AST_Conditional,function(self,tw){self.condition=self.condition.transform(tw);self.consequent=self.consequent.transform(tw);self.alternative=self.alternative.transform(tw)});_(Cola.AST_Array,function(self,tw){self.elements=do_list(self.elements,tw)});_(Cola.AST_Object,function(self,tw){self.properties=do_list(self.properties,tw)});_(Cola.AST_ObjectProperty,function(self,tw){self.value=self.value.transform(tw)})})();"use strict";!this.Cola&&(this.Cola={});Cola.SymbolDef=function(scope,index,orig){this.name=orig.name;this.orig=[orig];this.scope=scope;this.references=[];this.global=false; this.mangled_name=null;this.undeclared=false;this.constant=false;this.index=index};Cola.SymbolDef.prototype={unmangleable:function(options){return this.global&&!(options&&options.toplevel)||this.undeclared||!(options&&options.eval)&&(this.scope.uses_eval||this.scope.uses_with)},mangle:function(options){if(!this.mangled_name&&!this.unmangleable(options)){var s=this.scope;if(!options.screw_ie8&&this.orig[0]instanceof Cola.AST_SymbolLambda)s=s.parent_scope;this.mangled_name=s.next_mangled(options,this)}}};Cola.AST_Toplevel.DEFMETHOD("figure_out_scope",function(options){options=Cola.defaults(options,{screw_ie8:false});var self=this;var scope=self.parent_scope=null;var defun=null;var nesting=0;var tw=new Cola.TreeWalker(function(node,descend){if(options.screw_ie8&&node instanceof Cola.AST_Catch){var save_scope=scope;scope=new Cola.AST_Scope(node);scope.init_scope_vars(nesting);scope.parent_scope=save_scope;descend();scope=save_scope;return true}if(node instanceof Cola.AST_Scope){node.init_scope_vars(nesting);var save_scope=node.parent_scope=scope;var save_defun=defun;defun=scope=node;++nesting;descend();--nesting;scope=save_scope;defun=save_defun;return true}if(node instanceof Cola.AST_Directive){node.scope=scope;Cola.push_uniq(scope.directives,node.value);return true}if(node instanceof Cola.AST_With){for(var s=scope;s;s=s.parent_scope)s.uses_with=true;return}if(node instanceof Cola.AST_Symbol){node.scope=scope}if(node instanceof Cola.AST_SymbolLambda){defun.def_function(node)}else if(node instanceof Cola.AST_SymbolDefun){(node.scope=defun.parent_scope).def_function(node)}else if(node instanceof Cola.AST_SymbolVar||node instanceof Cola.AST_SymbolConst){var def=defun.def_variable(node);def.constant=node instanceof Cola.AST_SymbolConst;def.init=tw.parent().value}else if(node instanceof Cola.AST_SymbolCatch){(options.screw_ie8?scope:defun).def_variable(node)}});self.walk(tw);var func=null;var globals=self.globals=new Cola.Dictionary;var tw=new Cola.TreeWalker(function(node,descend){if(node instanceof Cola.AST_Lambda){var prev_func=func;func=node;descend();func=prev_func;return true}if(node instanceof Cola.AST_SymbolRef){var name=node.name;var sym=node.scope.find_variable(name);if(!sym){var g;if(globals.has(name)){g=globals.get(name)}else{g=new Cola.SymbolDef(self,globals.size(),node);g.undeclared=true;g.global=true;globals.set(name,g)}node.thedef=g;if(name=="eval"&&tw.parent()instanceof Cola.AST_Call){for(var s=node.scope;s&&!s.uses_eval;s=s.parent_scope)s.uses_eval=true}if(func&&name=="arguments"){func.uses_arguments=true}}else{node.thedef=sym}node.reference();return true}});self.walk(tw)});Cola.AST_Scope.DEFMETHOD("init_scope_vars",function(nesting){this.directives=[];this.variables=new Cola.Dictionary;this.functions=new Cola.Dictionary;this.uses_with=false;this.uses_eval=false;this.parent_scope=null;this.enclosed=[];this.cname=-1;this.nesting=nesting});Cola.AST_Scope.DEFMETHOD("strict",function(){return this.has_directive("use strict")});Cola.AST_Lambda.DEFMETHOD("init_scope_vars",function(){Cola.AST_Scope.prototype.init_scope_vars.apply(this,arguments);this.uses_arguments=false});Cola.AST_SymbolRef.DEFMETHOD("reference",function(){var def=this.definition();def.references.push(this);var s=this.scope;while(s){Cola.push_uniq(s.enclosed,def);if(s===def.scope)break;s=s.parent_scope}this.frame=this.scope.nesting-def.scope.nesting});Cola.AST_Scope.DEFMETHOD("find_variable",function(name){if(name instanceof Cola.AST_Symbol)name=name.name;return this.variables.get(name)||this.parent_scope&&this.parent_scope.find_variable(name)});Cola.AST_Scope.DEFMETHOD("has_directive",function(value){return this.parent_scope&&this.parent_scope.has_directive(value)||(this.directives.indexOf(value)>=0?this:null)});Cola.AST_Scope.DEFMETHOD("def_function",function(symbol){this.functions.set(symbol.name,this.def_variable(symbol))});Cola.AST_Scope.DEFMETHOD("def_variable",function(symbol){var def;if(!this.variables.has(symbol.name)){def=new Cola.SymbolDef(this,this.variables.size(),symbol);this.variables.set(symbol.name,def);def.global=!this.parent_scope}else{def=this.variables.get(symbol.name);def.orig.push(symbol)}return symbol.thedef=def});Cola.AST_Scope.DEFMETHOD("next_mangled",function(options){var ext=this.enclosed;out:while(true){var m=Cola.base54(++this.cname);if(!Cola.is_identifier(m,true))continue;if(options.except.indexOf(m)>=0)continue;for(var i=ext.length;--i>=0;){var sym=ext[i];var name=sym.mangled_name||sym.unmangleable(options)&&sym.name;if(m==name)continue out}return m}});Cola.AST_Function.DEFMETHOD("next_mangled",function(options,def){var tricky_def=def.orig[0]instanceof Cola.AST_SymbolFunarg&&this.name&&this.name.definition();while(true){var name=Cola.AST_Lambda.prototype.next_mangled.call(this,options,def);if(!(tricky_def&&tricky_def.mangled_name==name))return name}});Cola.AST_Scope.DEFMETHOD("references",function(sym){if(sym instanceof Cola.AST_Symbol)sym=sym.definition();return this.enclosed.indexOf(sym)<0?null:sym});Cola.AST_Symbol.DEFMETHOD("unmangleable",function(options){return this.definition().unmangleable(options)});Cola.AST_SymbolAccessor.DEFMETHOD("unmangleable",function(){return true});Cola.AST_Label.DEFMETHOD("unmangleable",function(){return false});Cola.AST_Symbol.DEFMETHOD("unreferenced",function(){return this.definition().references.length==0&&!(this.scope.uses_eval||this.scope.uses_with)});Cola.AST_Symbol.DEFMETHOD("undeclared",function(){return this.definition().undeclared});Cola.AST_LabelRef.DEFMETHOD("undeclared",function(){return false});Cola.AST_Label.DEFMETHOD("undeclared",function(){return false});Cola.AST_Symbol.DEFMETHOD("definition",function(){return this.thedef});Cola.AST_Symbol.DEFMETHOD("global",function(){return this.definition().global});Cola.AST_Toplevel.DEFMETHOD("_default_mangler_options",function(options){return Cola.defaults(options,{except:[],eval:false,sort:false,toplevel:false,screw_ie8:false})});Cola.AST_Toplevel.DEFMETHOD("mangle_names",function(options){options=this._default_mangler_options(options);var lname=-1;var to_mangle=[];var tw=new Cola.TreeWalker(function(node,descend){if(node instanceof Cola.AST_LabeledStatement){var save_nesting=lname;descend();lname=save_nesting;return true}if(node instanceof Cola.AST_Scope){var p=tw.parent(),a=[];node.variables.each(function(symbol){if(options.except.indexOf(symbol.name)<0){a.push(symbol)}});if(options.sort)a.sort(function(a,b){return b.references.length-a.references.length});to_mangle.push.apply(to_mangle,a);return}if(node instanceof Cola.AST_Label){var name;do name=Cola.base54(++lname);while(!Cola.is_identifier(name,true));node.mangled_name=name;return true}if(options.screw_ie8&&node instanceof Cola.AST_SymbolCatch){to_mangle.push(node.definition());return}});this.walk(tw);to_mangle.forEach(function(def){def.mangle(options)})});Cola.AST_Toplevel.DEFMETHOD("compute_char_frequency",function(options){options=this._default_mangler_options(options);var tw=new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Constant)Cola.base54.consider(node.print_to_string());else if(node instanceof Cola.AST_Return)Cola.base54.consider("return");else if(node instanceof Cola.AST_Throw)Cola.base54.consider("throw");else if(node instanceof Cola.AST_Continue)Cola.base54.consider("continue");else if(node instanceof Cola.AST_Break)Cola.base54.consider("break");else if(node instanceof Cola.AST_Debugger)Cola.base54.consider("debugger");else if(node instanceof Cola.AST_Directive)Cola.base54.consider(node.value);else if(node instanceof Cola.AST_While)Cola.base54.consider("while");else if(node instanceof Cola.AST_Do)Cola.base54.consider("do while");else if(node instanceof Cola.AST_If){Cola.base54.consider("if");if(node.alternative)Cola.base54.consider("else")}else if(node instanceof Cola.AST_Var)Cola.base54.consider("var");else if(node instanceof Cola.AST_Const)Cola.base54.consider("const");else if(node instanceof Cola.AST_Lambda)Cola.base54.consider("function");else if(node instanceof Cola.AST_For)Cola.base54.consider("for");else if(node instanceof Cola.AST_ForIn)Cola.base54.consider("for in");else if(node instanceof Cola.AST_Switch)Cola.base54.consider("switch");else if(node instanceof Cola.AST_Case)Cola.base54.consider("case");else if(node instanceof Cola.AST_Default)Cola.base54.consider("default");else if(node instanceof Cola.AST_With)Cola.base54.consider("with");else if(node instanceof Cola.AST_ObjectSetter)Cola.base54.consider("set"+node.key);else if(node instanceof Cola.AST_ObjectGetter)Cola.base54.consider("get"+node.key);else if(node instanceof Cola.AST_ObjectKeyVal)Cola.base54.consider(node.key);else if(node instanceof Cola.AST_New)Cola.base54.consider("new");else if(node instanceof Cola.AST_This)Cola.base54.consider("this");else if(node instanceof Cola.AST_Try)Cola.base54.consider("try");else if(node instanceof Cola.AST_Catch)Cola.base54.consider("catch");else if(node instanceof Cola.AST_Finally)Cola.base54.consider("finally");else if(node instanceof Cola.AST_Symbol&&node.unmangleable(options))Cola.base54.consider(node.name);else if(node instanceof Cola.AST_Unary||node instanceof Cola.AST_Binary)Cola.base54.consider(node.operator);else if(node instanceof Cola.AST_Dot)Cola.base54.consider(node.property)});this.walk(tw);Cola.base54.sort()});Cola.base54=function(){var string="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ$_0123456789";var chars,frequency;function reset(){frequency=Object.create(null);chars=string.split("").map(function(ch){return ch.charCodeAt(0)});chars.forEach(function(ch){frequency[ch]=0})}base54.consider=function(str){for(var i=str.length;--i>=0;){var code=str.charCodeAt(i);if(code in frequency)++frequency[code]}};base54.sort=function(){chars=Cola.mergeSort(chars,function(a,b){if(Cola.is_digit(a)&&!Cola.is_digit(b))return 1;if(Cola.is_digit(b)&&!Cola.is_digit(a))return-1;return frequency[b]-frequency[a]})};base54.reset=reset;reset();base54.get=function(){return chars};base54.freq=function(){return frequency};function base54(num){var ret="",base=54;do{ret+=String.fromCharCode(chars[num%base]);num=Math.floor(num/base);base=64}while(num>0);return ret}return base54}();Cola.AST_Toplevel.DEFMETHOD("scope_warnings",function(options){options=Cola.defaults(options,{undeclared:false,unreferenced:true,assign_to_global:true,func_arguments:true,nested_defuns:true,eval:true});var tw=new Cola.TreeWalker(function(node){if(options.undeclared&&node instanceof Cola.AST_SymbolRef&&node.undeclared()){Cola.AST_Node.warn("Undeclared symbol: {name} [{file}:{line},{col}]",{name:node.name,file:node.start.file,line:node.start.line,col:node.start.col})}if(options.assign_to_global){var sym=null;if(node instanceof Cola.AST_Assign&&node.left instanceof Cola.AST_SymbolRef)sym=node.left;else if(node instanceof Cola.AST_ForIn&&node.init instanceof Cola.AST_SymbolRef)sym=node.init;if(sym&&(sym.undeclared()||sym.global()&&sym.scope!==sym.definition().scope)){Cola.AST_Node.warn("{msg}: {name} [{file}:{line},{col}]",{msg:sym.undeclared()?"Accidental global?":"Assignment to global",name:sym.name,file:sym.start.file,line:sym.start.line,col:sym.start.col})}}if(options.eval&&node instanceof Cola.AST_SymbolRef&&node.undeclared()&&node.name=="eval"){Cola.AST_Node.warn("Eval is used [{file}:{line},{col}]",node.start)}if(options.unreferenced&&(node instanceof Cola.AST_SymbolDeclaration||node instanceof Cola.AST_Label)&&node.unreferenced()){Cola.AST_Node.warn("{type} {name} is declared but not referenced [{file}:{line},{col}]",{type:node instanceof Cola.AST_Label?"Label":"Symbol",name:node.name,file:node.start.file,line:node.start.line,col:node.start.col})}if(options.func_arguments&&node instanceof Cola.AST_Lambda&&node.uses_arguments){Cola.AST_Node.warn("arguments used in function {name} [{file}:{line},{col}]",{name:node.name?node.name.name:"anonymous",file:node.start.file,line:node.start.line,col:node.start.col})}if(options.nested_defuns&&node instanceof Cola.AST_Defun&&!(tw.parent()instanceof Cola.AST_Scope)){Cola.AST_Node.warn('Function {name} declared in nested statement "{type}" [{file}:{line},{col}]',{name:node.name.name,type:tw.parent().TYPE,file:node.start.file,line:node.start.line,col:node.start.col})}});this.walk(tw)});"use strict";!this.Cola&&(this.Cola={});Cola.OutputStream=function(options){this.options=Cola.defaults(options,{indent_start:0,indent_level:4,quote_keys:false,space_colon:true,ascii_only:false,unescape_regexps:false,inline_script:false,width:80,max_line_len:32e3,beautify:false,source_map:null,bracketize:false,semicolons:true,comments:false,preserve_line:false,screw_ie8:false,preamble:null},true);this.indentation=0;this.current_col=0;this.current_line=1;this.current_pos=0;this.OUTPUT="";this.might_need_space=false;this.might_need_semicolon=false;this.last=null;this.requireSemicolonChars=Cola.makePredicate("( [ + * / - , .");if(this.options.preamble){this.print(this.options.preamble.replace(/\r\n?|[\n\u2028\u2029]|\s*$/g,"\n"))}this.stack=[]};Cola.OutputStream.prototype.to_ascii=function(str,identifier){return str.replace(/[\u0080-\uffff]/g,function(ch){var code=ch.charCodeAt(0).toString(16);if(code.length<=2&&!identifier){while(code.length<2)code="0"+code;return"\\x"+code}else{while(code.length<4)code="0"+code;return"\\u"+code}})};Cola.OutputStream.prototype.make_string=function(str){var dq=0,sq=0;str=str.replace(/[\\\b\f\n\r\t\x22\x27\u2028\u2029\0]/g,function(s){switch(s){case"\\":return"\\\\";case"\b":return"\\b";case"\f":return"\\f";case"\n":return"\\n";case"\r":return"\\r";case"\u2028":return"\\u2028";case"\u2029":return"\\u2029";case'"':++dq;return'"';case"'":++sq;return"'";case"\x00":return"\\x00"}return s});if(this.options.ascii_only)str=this.to_ascii(str);if(dq>sq)return"'"+str.replace(/\x27/g,"\\'")+"'";else return'"'+str.replace(/\x22/g,'\\"')+'"'};Cola.OutputStream.prototype.encode_string=function(str){var ret=this.make_string(str);if(this.options.inline_script)ret=ret.replace(/<\x2fscript([>\/\t\n\f\r ])/gi,"<\\/script$1");return ret};Cola.OutputStream.prototype.make_name=function(name){name=name.toString();if(this.options.ascii_only)name=this.to_ascii(name,true);return name};Cola.OutputStream.prototype.make_indent=function(back){return Cola.repeat_string(" ",this.options.indent_start+this.indentation-back*this.options.indent_level)};Cola.OutputStream.prototype.last_char=function(){return this.last.charAt(this.last.length-1)};Cola.OutputStream.prototype.maybe_newline=function(){if(this.options.max_line_len&&this.current_col>this.options.max_line_len)this.print("\n")};Cola.OutputStream.prototype.print=function(str){str=String(str);var ch=str.charAt(0);if(this.might_need_semicolon){if((!ch||";}".indexOf(ch)<0)&&!/[;]$/.test(this.last)){if(this.options.semicolons||this.requireSemicolonChars(ch)){this.OUTPUT+=";";this.current_col++;this.current_pos++}else{this.OUTPUT+="\n";this.current_pos++;this.current_line++;this.current_col=0}if(!this.options.beautify)this.might_need_space=false}this.might_need_semicolon=false;this.maybe_newline()}if(!this.options.beautify&&this.options.preserve_line&&this.stack[stack.length-1]){var target_line=this.stack[stack.length-1].start.line;while(this.current_line=this.options.width};Cola.OutputStream.prototype.print_name=function(name){this.print(this.make_name(name))};Cola.OutputStream.prototype.print_string=function(str){this.print(this.encode_string(str))};Cola.OutputStream.prototype.option=function(opt){return this.options[opt]};Cola.OutputStream.prototype.push_node=function(node){this.stack.push(node)};Cola.OutputStream.prototype.pop_node=function(){return this.stack.pop()};Cola.OutputStream.prototype.parent=function(n){return this.stack[this.stack.length-2-(n||0)]};(function(){function DEFPRINT(nodetype,generator){nodetype.DEFMETHOD("_codegen",generator)}Cola.AST_Node.DEFMETHOD("print",function(stream,force_parens){var self=this,generator=self._codegen;function doit(){self.add_comments(stream);self.add_source_map(stream);generator(self,stream)}stream.push_node(self);if(force_parens||self.needs_parens(stream)){stream.with_parens(doit)}else{doit()}stream.pop_node()});Cola.AST_Node.DEFMETHOD("print_to_string",function(options){var s=new Cola.OutputStream(options);this.print(s);return s.get()});Cola.AST_Node.DEFMETHOD("add_comments",function(output){var c=output.option("comments"),self=this;if(c){var start=self.start;if(start&&!start._comments_dumped){start._comments_dumped=true;var comments=start.comments_before||[];if(self instanceof Cola.AST_Exit&&self.value){self.value.walk(new Cola.TreeWalker(function(node){if(node.start&&node.start.comments_before){comments=comments.concat(node.start.comments_before);node.start.comments_before=[]}if(node instanceof Cola.AST_Function||node instanceof Cola.AST_Array||node instanceof Cola.AST_Object){return true}}))}if(c.test){comments=comments.filter(function(comment){return c.test(comment.value)})}else if(typeof c=="function"){comments=comments.filter(function(comment){return c(self,comment)})}comments.forEach(function(c){if(/comment[134]/.test(c.type)){output.print("//"+c.value+"\n");output.indent()}else if(c.type=="comment2"){output.print("/*"+c.value+"*/");if(start.nlb){output.print("\n");output.indent()}else{output.space()}}})}}});function PARENS(nodetype,func){nodetype.DEFMETHOD("needs_parens",func)}PARENS(Cola.AST_Node,function(){return false});PARENS(Cola.AST_Function,function(output){return first_in_statement(output)});PARENS(Cola.AST_Object,function(output){return first_in_statement(output)});PARENS(Cola.AST_Unary,function(output){var p=output.parent();return p instanceof Cola.AST_PropAccess&&p.expression===this});PARENS(Cola.AST_Seq,function(output){var p=output.parent();return p instanceof Cola.AST_Call||p instanceof Cola.AST_Unary||p instanceof Cola.AST_Binary||p instanceof Cola.AST_VarDef||p instanceof Cola.AST_PropAccess||p instanceof Cola.AST_Array||p instanceof Cola.AST_ObjectProperty||p instanceof Cola.AST_Conditional});PARENS(Cola.AST_Binary,function(output){var p=output.parent();if(p instanceof Cola.AST_Call&&p.expression===this)return true;if(p instanceof Cola.AST_Unary)return true;if(p instanceof Cola.AST_PropAccess&&p.expression===this)return true;if(p instanceof Cola.AST_Binary){var po=p.operator,pp=Cola.PRECEDENCE[po];var so=this.operator,sp=Cola.PRECEDENCE[so];if(pp>sp||pp==sp&&this===p.right){return true}}});PARENS(Cola.AST_PropAccess,function(output){var p=output.parent();if(p instanceof Cola.AST_New&&p.expression===this){try{this.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Call)throw p}))}catch(ex){if(ex!==p)throw ex;return true}}});PARENS(Cola.AST_Call,function(output){var p=output.parent(),p1;if(p instanceof Cola.AST_New&&p.expression===this)return true;return this.expression instanceof Cola.AST_Function&&p instanceof Cola.AST_PropAccess&&p.expression===this&&(p1=output.parent(1))instanceof Cola.AST_Assign&&p1.left===p});PARENS(Cola.AST_New,function(output){var p=output.parent();if(no_constructor_parens(this,output)&&(p instanceof Cola.AST_PropAccess||p instanceof Cola.AST_Call&&p.expression===this))return true});PARENS(Cola.AST_Number,function(output){var p=output.parent();if(this.getValue()<0&&p instanceof Cola.AST_PropAccess&&p.expression===this)return true});PARENS(Cola.AST_NaN,function(output){var p=output.parent();if(p instanceof Cola.AST_PropAccess&&p.expression===this)return true});function assign_and_conditional_paren_rules(output){var p=output.parent();if(p instanceof Cola.AST_Unary)return true;if(p instanceof Cola.AST_Binary&&!(p instanceof Cola.AST_Assign))return true;if(p instanceof Cola.AST_Call&&p.expression===this)return true;if(p instanceof Cola.AST_Conditional&&p.condition===this)return true;if(p instanceof Cola.AST_PropAccess&&p.expression===this)return true}PARENS(Cola.AST_Assign,assign_and_conditional_paren_rules);PARENS(Cola.AST_Conditional,assign_and_conditional_paren_rules);DEFPRINT(Cola.AST_Directive,function(self,output){output.print_string(self.value);output.semicolon()});DEFPRINT(Cola.AST_Debugger,function(self,output){output.print("debugger");output.semicolon()});function display_body(body,is_toplevel,output){var last=body.length-1;body.forEach(function(stmt,i){if(!(stmt instanceof Cola.AST_EmptyStatement)){output.indent();stmt.print(output);if(!(i==last&&is_toplevel)){output.newline();if(is_toplevel)output.newline()}}})}Cola.AST_StatementWithBody.DEFMETHOD("_do_print_body",function(output){force_statement(this.body,output)});DEFPRINT(Cola.AST_Statement,function(self,output){self.body.print(output);output.semicolon()});DEFPRINT(Cola.AST_Toplevel,function(self,output){display_body(self.body,true,output);output.print("")});DEFPRINT(Cola.AST_LabeledStatement,function(self,output){self.label.print(output);output.colon();self.body.print(output)});DEFPRINT(Cola.AST_SimpleStatement,function(self,output){self.body.print(output);output.semicolon()});function print_bracketed(body,output){if(body.length>0)output.with_block(function(){display_body(body,false,output)});else output.print("{}")}DEFPRINT(Cola.AST_BlockStatement,function(self,output){print_bracketed(self.body,output)});DEFPRINT(Cola.AST_EmptyStatement,function(self,output){output.semicolon()});DEFPRINT(Cola.AST_Do,function(self,output){output.print("do");output.space();self._do_print_body(output);output.space();output.print("while");output.space();output.with_parens(function(){self.condition.print(output)});output.semicolon()});DEFPRINT(Cola.AST_While,function(self,output){output.print("while");output.space();output.with_parens(function(){self.condition.print(output)});output.space();self._do_print_body(output)});DEFPRINT(Cola.AST_For,function(self,output){output.print("for");output.space();output.with_parens(function(){if(self.init){if(self.init instanceof Cola.AST_Definitions){self.init.print(output)}else{parenthesize_for_noin(self.init,output,true)}output.print(";");output.space()}else{output.print(";")}if(self.condition){self.condition.print(output);output.print(";");output.space()}else{output.print(";")}if(self.step){self.step.print(output)}});output.space();self._do_print_body(output)});DEFPRINT(Cola.AST_ForIn,function(self,output){output.print("for");output.space();output.with_parens(function(){self.init.print(output);output.space();output.print("in");output.space();self.object.print(output)});output.space();self._do_print_body(output)});DEFPRINT(Cola.AST_With,function(self,output){output.print("with");output.space();output.with_parens(function(){self.expression.print(output)});output.space();self._do_print_body(output)});Cola.AST_Lambda.DEFMETHOD("_do_print",function(output,nokeyword){var self=this;if(!nokeyword){output.print("function")}if(self.name){output.space();self.name.print(output)}output.with_parens(function(){self.argnames.forEach(function(arg,i){if(i)output.comma();arg.print(output)})});output.space();print_bracketed(self.body,output)});DEFPRINT(Cola.AST_Lambda,function(self,output){self._do_print(output)});Cola.AST_Exit.DEFMETHOD("_do_print",function(output,kind){output.print(kind);if(this.value){output.space();this.value.print(output)}output.semicolon()});DEFPRINT(Cola.AST_Return,function(self,output){self._do_print(output,"return")});DEFPRINT(Cola.AST_Throw,function(self,output){self._do_print(output,"throw")});Cola.AST_LoopControl.DEFMETHOD("_do_print",function(output,kind){output.print(kind);if(this.label){output.space();this.label.print(output)}output.semicolon()});DEFPRINT(Cola.AST_Break,function(self,output){self._do_print(output,"break")});DEFPRINT(Cola.AST_Continue,function(self,output){self._do_print(output,"continue")});function make_then(self,output){if(output.option("bracketize")){make_block(self.body,output);return}if(!self.body)return output.force_semicolon();if(self.body instanceof Cola.AST_Do&&!output.option("screw_ie8")){make_block(self.body,output);return}var b=self.body;while(true){if(b instanceof Cola.AST_If){if(!b.alternative){make_block(self.body,output);return}b=b.alternative}else if(b instanceof Cola.AST_StatementWithBody){b=b.body}else break}force_statement(self.body,output)}DEFPRINT(Cola.AST_If,function(self,output){output.print("if");output.space();output.with_parens(function(){self.condition.print(output)});output.space();if(self.alternative){make_then(self,output);output.space();output.print("else");output.space();force_statement(self.alternative,output)}else{self._do_print_body(output)}});DEFPRINT(Cola.AST_Switch,function(self,output){output.print("switch");output.space();output.with_parens(function(){self.expression.print(output)});output.space();if(self.body.length>0)output.with_block(function(){self.body.forEach(function(stmt,i){if(i)output.newline();output.indent(true);stmt.print(output)})});else output.print("{}")});Cola.AST_SwitchBranch.DEFMETHOD("_do_print_body",function(output){if(this.body.length>0){output.newline();this.body.forEach(function(stmt){output.indent();stmt.print(output);output.newline()})}});DEFPRINT(Cola.AST_Default,function(self,output){output.print("default:");self._do_print_body(output)});DEFPRINT(Cola.AST_Case,function(self,output){output.print("case");output.space();self.expression.print(output);output.print(":");self._do_print_body(output)});DEFPRINT(Cola.AST_Try,function(self,output){output.print("try");output.space();print_bracketed(self.body,output);if(self.bcatch){output.space();self.bcatch.print(output)}if(self.bfinally){output.space();self.bfinally.print(output)}});DEFPRINT(Cola.AST_Catch,function(self,output){output.print("catch");output.space();output.with_parens(function(){self.argname.print(output)});output.space();print_bracketed(self.body,output)});DEFPRINT(Cola.AST_Finally,function(self,output){output.print("finally");output.space();print_bracketed(self.body,output)});Cola.AST_Definitions.DEFMETHOD("_do_print",function(output,kind){output.print(kind);output.space();this.definitions.forEach(function(def,i){if(i)output.comma();def.print(output)});var p=output.parent();var in_for=p instanceof Cola.AST_For||p instanceof Cola.AST_ForIn;var avoid_semicolon=in_for&&p.init===this;if(!avoid_semicolon)output.semicolon()});DEFPRINT(Cola.AST_Var,function(self,output){self._do_print(output,"var")});DEFPRINT(Cola.AST_Const,function(self,output){self._do_print(output,"const")});function parenthesize_for_noin(node,output,noin){if(!noin)node.print(output);else try{node.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Binary&&node.operator=="in")throw output}));node.print(output)}catch(ex){if(ex!==output)throw ex;node.print(output,true)}}DEFPRINT(Cola.AST_VarDef,function(self,output){self.name.print(output);if(self.value){output.space();output.print("=");output.space();var p=output.parent(1);var noin=p instanceof Cola.AST_For||p instanceof Cola.AST_ForIn;parenthesize_for_noin(self.value,output,noin)}});DEFPRINT(Cola.AST_Call,function(self,output){self.expression.print(output);if(self instanceof Cola.AST_New&&no_constructor_parens(self,output))return;output.with_parens(function(){self.args.forEach(function(expr,i){if(i)output.comma();expr.print(output)})})});DEFPRINT(Cola.AST_New,function(self,output){output.print("new");output.space();Cola.AST_Call.prototype._codegen(self,output)});Cola.AST_Seq.DEFMETHOD("_do_print",function(output){this.car.print(output);if(this.cdr){output.comma();if(output.should_break()){output.newline();output.indent()}this.cdr.print(output)}});DEFPRINT(Cola.AST_Seq,function(self,output){self._do_print(output)});DEFPRINT(Cola.AST_Dot,function(self,output){var expr=self.expression;expr.print(output);if(expr instanceof Cola.AST_Number&&expr.getValue()>=0){if(!/[xa-f.]/i.test(output.last())){output.print(".")}}output.print(".");output.add_mapping(self.end);output.print_name(self.property)});DEFPRINT(Cola.AST_Sub,function(self,output){self.expression.print(output);output.print("[");self.property.print(output);output.print("]")});DEFPRINT(Cola.AST_UnaryPrefix,function(self,output){var op=self.operator;output.print(op);if(/^[a-z]/i.test(op))output.space();self.expression.print(output)});DEFPRINT(Cola.AST_UnaryPostfix,function(self,output){self.expression.print(output);output.print(self.operator)});DEFPRINT(Cola.AST_Binary,function(self,output){self.left.print(output);output.space();output.print(self.operator);if(self.operator=="<"&&self.right instanceof Cola.AST_UnaryPrefix&&self.right.operator=="!"&&self.right.expression instanceof Cola.AST_UnaryPrefix&&self.right.expression.operator=="--"){output.print(" ")}else{output.space()}self.right.print(output)});DEFPRINT(Cola.AST_Conditional,function(self,output){self.condition.print(output);output.space();output.print("?");output.space();self.consequent.print(output);output.space();output.colon();self.alternative.print(output)});DEFPRINT(Cola.AST_Array,function(self,output){output.with_square(function(){var a=self.elements,len=a.length;if(len>0)output.space();a.forEach(function(exp,i){if(i)output.comma();exp.print(output);if(i===len-1&&exp instanceof Cola.AST_Hole)output.comma()});if(len>0)output.space()})});DEFPRINT(Cola.AST_Object,function(self,output){if(self.properties.length>0)output.with_block(function(){self.properties.forEach(function(prop,i){if(i){output.print(","); output.newline()}output.indent();prop.print(output)});output.newline()});else output.print("{}")});DEFPRINT(Cola.AST_ObjectKeyVal,function(self,output){var key=self.key;if(output.option("quote_keys")){output.print_string(key+"")}else if((typeof key=="number"||!output.option("beautify")&&+key+""==key)&&parseFloat(key)>=0){output.print(make_num(key))}else if(Cola.RESERVED_WORDS(key)?output.option("screw_ie8"):Cola.is_identifier_string(key)){output.print_name(key)}else{output.print_string(key)}output.colon();self.value.print(output)});DEFPRINT(Cola.AST_ObjectSetter,function(self,output){output.print("set");output.space();self.key.print(output);self.value._do_print(output,true)});DEFPRINT(Cola.AST_ObjectGetter,function(self,output){output.print("get");output.space();self.key.print(output);self.value._do_print(output,true)});DEFPRINT(Cola.AST_Symbol,function(self,output){var def=self.definition();output.print_name(def?def.mangled_name||def.name:self.name)});DEFPRINT(Cola.AST_Undefined,function(self,output){output.print("void 0")});DEFPRINT(Cola.AST_Hole,Cola.noop);DEFPRINT(Cola.AST_Infinity,function(self,output){output.print("1/0")});DEFPRINT(Cola.AST_NaN,function(self,output){output.print("0/0")});DEFPRINT(Cola.AST_This,function(self,output){output.print("this")});DEFPRINT(Cola.AST_Constant,function(self,output){output.print(self.getValue())});DEFPRINT(Cola.AST_String,function(self,output){output.print_string(self.getValue())});DEFPRINT(Cola.AST_Number,function(self,output){output.print(make_num(self.getValue()))});function regexp_safe_literal(code){return[92,47,46,43,42,63,40,41,91,93,123,125,36,94,58,124,33,10,13,0,65279,8232,8233].indexOf(code)<0}DEFPRINT(Cola.AST_RegExp,function(self,output){var str=self.getValue().toString();if(output.option("ascii_only")){str=output.to_ascii(str)}else if(output.option("unescape_regexps")){str=str.split("\\\\").map(function(str){return str.replace(/\\u[0-9a-fA-F]{4}|\\x[0-9a-fA-F]{2}/g,function(s){var code=parseInt(s.substr(2),16);return regexp_safe_literal(code)?String.fromCharCode(code):s})}).join("\\\\")}output.print(str);var p=output.parent();if(p instanceof Cola.AST_Binary&&/^in/.test(p.operator)&&p.left===self)output.print(" ")});function force_statement(stat,output){if(output.option("bracketize")){if(!stat||stat instanceof Cola.AST_EmptyStatement)output.print("{}");else if(stat instanceof Cola.AST_BlockStatement)stat.print(output);else output.with_block(function(){output.indent();stat.print(output);output.newline()})}else{if(!stat||stat instanceof Cola.AST_EmptyStatement)output.force_semicolon();else stat.print(output)}}function first_in_statement(output){var a=output.stack,i=a.length,node=a[--i],p=a[--i];while(i>0){if(p instanceof Cola.AST_Statement&&p.body===node)return true;if(p instanceof Cola.AST_Seq&&p.car===node||p instanceof Cola.AST_Call&&p.expression===node&&!(p instanceof Cola.AST_New)||p instanceof Cola.AST_Dot&&p.expression===node||p instanceof Cola.AST_Sub&&p.expression===node||p instanceof Cola.AST_Conditional&&p.condition===node||p instanceof Cola.AST_Binary&&p.left===node||p instanceof Cola.AST_UnaryPostfix&&p.expression===node){node=p;p=a[--i]}else{return false}}}function no_constructor_parens(self,output){return self.args.length==0&&!output.option("beautify")}function best_of(a){var best=a[0],len=best.length;for(var i=1;i=0){a.push("0x"+num.toString(16).toLowerCase(),"0"+num.toString(8))}else{a.push("-0x"+(-num).toString(16).toLowerCase(),"-0"+(-num).toString(8))}if(m=/^(.*?)(0+)$/.exec(num)){a.push(m[1]+"e"+m[2].length)}}else if(m=/^0?\.(0+)(.*)$/.exec(num)){a.push(m[2]+"e-"+(m[1].length+m[2].length),str.substr(str.indexOf(".")))}return best_of(a)}function make_block(stmt,output){if(stmt instanceof Cola.AST_BlockStatement){stmt.print(output);return}output.with_block(function(){output.indent();stmt.print(output);output.newline()})}function DEFMAP(nodetype,generator){nodetype.DEFMETHOD("add_source_map",function(stream){generator(this,stream)})}DEFMAP(Cola.AST_Node,Cola.noop);function basic_sourcemap_gen(self,output){output.add_mapping(self.start)}DEFMAP(Cola.AST_Directive,basic_sourcemap_gen);DEFMAP(Cola.AST_Debugger,basic_sourcemap_gen);DEFMAP(Cola.AST_Symbol,basic_sourcemap_gen);DEFMAP(Cola.AST_Jump,basic_sourcemap_gen);DEFMAP(Cola.AST_StatementWithBody,basic_sourcemap_gen);DEFMAP(Cola.AST_LabeledStatement,Cola.noop);DEFMAP(Cola.AST_Lambda,basic_sourcemap_gen);DEFMAP(Cola.AST_Switch,basic_sourcemap_gen);DEFMAP(Cola.AST_SwitchBranch,basic_sourcemap_gen);DEFMAP(Cola.AST_BlockStatement,basic_sourcemap_gen);DEFMAP(Cola.AST_Toplevel,Cola.noop);DEFMAP(Cola.AST_New,basic_sourcemap_gen);DEFMAP(Cola.AST_Try,basic_sourcemap_gen);DEFMAP(Cola.AST_Catch,basic_sourcemap_gen);DEFMAP(Cola.AST_Finally,basic_sourcemap_gen);DEFMAP(Cola.AST_Definitions,basic_sourcemap_gen);DEFMAP(Cola.AST_Constant,basic_sourcemap_gen);DEFMAP(Cola.AST_ObjectProperty,function(self,output){output.add_mapping(self.start,self.key)})})();"use strict";!this.Cola&&(this.Cola={});Cola.Compressor=function(options,false_by_default){if(!(this instanceof Cola.Compressor))return new Cola.Compressor(options,false_by_default);Cola.TreeTransformer.call(this,this.before,this.after);this.options=Cola.defaults(options,{sequences:!false_by_default,properties:!false_by_default,dead_code:!false_by_default,drop_debugger:!false_by_default,unsafe:false,unsafe_comps:false,conditionals:!false_by_default,comparisons:!false_by_default,evaluate:!false_by_default,booleans:!false_by_default,loops:!false_by_default,unused:!false_by_default,hoist_funs:!false_by_default,keep_fargs:false,hoist_vars:false,if_return:!false_by_default,join_vars:!false_by_default,cascade:!false_by_default,side_effects:!false_by_default,pure_getters:false,pure_funcs:null,negate_iife:!false_by_default,screw_ie8:false,drop_console:false,angular:false,warnings:true,global_defs:{},is_js:false},true)};Cola.Compressor.prototype=new Cola.TreeTransformer;Cola.merge(Cola.Compressor.prototype,{option:function(key){return this.options[key]},warn:function(){if(this.options.warnings)Cola.AST_Node.warn.apply(Cola.AST_Node,arguments)},before:function(node,descend,in_list){if(node._squeezed)return node;var was_scope=false;if(node instanceof Cola.AST_Scope){node=node.hoist_declarations(this);was_scope=true}descend(node,this);node=node.optimize(this);if(was_scope&&node instanceof Cola.AST_Scope){node.drop_unused(this);descend(node,this)}node._squeezed=true;return node}});Cola.Compressor.MathFuncs={abs:true,acos:true,asin:true,atan:true,atan2:true,ceil:true,cos:true,exp:true,floor:true,imul:true,log:true,max:true,min:true,pow:true,round:true,sin:true,sqrt:true,tan:true};(function(){function OPT(node,optimizer){node.DEFMETHOD("optimize",function(compressor){var self=this;if(self._optimized)return self;var opt=optimizer(self,compressor);opt._optimized=true;if(opt===self)return opt;return opt.transform(compressor)})}OPT(Cola.AST_Node,function(self,compressor){return self});Cola.AST_Node.DEFMETHOD("equivalent_to",function(node){return this.print_to_string()==node.print_to_string()});function make_node(ctor,orig,props){if(!props)props={};if(orig){if(!props.start)props.start=orig.start;if(!props.end)props.end=orig.end}return new ctor(props)}function make_node_from_constant(compressor,val,orig){if(val instanceof Cola.AST_Node)return val.transform(compressor);switch(typeof val){case"string":return make_node(Cola.AST_String,orig,{value:val}).optimize(compressor);case"number":return make_node(isNaN(val)?Cola.AST_NaN:Cola.AST_Number,orig,{value:val}).optimize(compressor);case"boolean":return make_node(val?Cola.AST_True:Cola.AST_False,orig).optimize(compressor);case"undefined":return make_node(Cola.AST_Undefined,orig).optimize(compressor);default:if(val===null){return make_node(Cola.AST_Null,orig).optimize(compressor)}if(val instanceof RegExp){return make_node(Cola.AST_RegExp,orig).optimize(compressor)}throw new Error(Cola.string_template("Can't handle constant of type: {type}",{type:typeof val}))}}function as_statement_array(thing){if(thing===null)return[];if(thing instanceof Cola.AST_BlockStatement)return thing.body;if(thing instanceof Cola.AST_EmptyStatement)return[];if(thing instanceof Cola.AST_Statement)return[thing];throw new Error("Can't convert thing to statement array")}function is_empty(thing){if(thing===null)return true;if(thing instanceof Cola.AST_EmptyStatement)return true;if(thing instanceof Cola.AST_BlockStatement)return thing.body.length==0;return false}function loop_body(x){if(x instanceof Cola.AST_Switch)return x;if(x instanceof Cola.AST_For||x instanceof Cola.AST_ForIn||x instanceof Cola.AST_DWLoop){return x.body instanceof Cola.AST_BlockStatement?x.body:x}return x}function tighten_body(statements,compressor){var CHANGED;do{CHANGED=false;if(compressor.option("angular")){statements=process_for_angular(statements)}statements=eliminate_spurious_blocks(statements);if(compressor.option("dead_code")){statements=eliminate_dead_code(statements,compressor)}if(compressor.option("if_return")){statements=handle_if_return(statements,compressor)}if(compressor.option("sequences")){statements=sequencesize(statements,compressor)}if(compressor.option("join_vars")){statements=join_consecutive_vars(statements,compressor)}}while(CHANGED);if(compressor.option("negate_iife")){negate_iifes(statements,compressor)}return statements;function process_for_angular(statements){function make_injector(func,name){return make_node(Cola.AST_SimpleStatement,func,{body:make_node(Cola.AST_Assign,func,{operator:"=",left:make_node(Cola.AST_Dot,name,{expression:make_node(Cola.AST_SymbolRef,name,name),property:"$inject"}),right:make_node(Cola.AST_Array,func,{elements:func.argnames.map(function(sym){return make_node(Cola.AST_String,sym,{value:sym.name})})})})})}return statements.reduce(function(a,stat){a.push(stat);var token=stat.start;var comments=token.comments_before;if(comments&&comments.length>0){var last=comments.pop();if(/@ngInject/.test(last.value)){if(stat instanceof Cola.AST_Defun){a.push(make_injector(stat,stat.name))}else if(stat instanceof Cola.AST_Definitions){stat.definitions.forEach(function(def){if(def.value&&def.value instanceof Cola.AST_Lambda){a.push(make_injector(def.value,def.name))}})}else{compressor.warn("Unknown statement marked with @ngInject [{file}:{line},{col}]",token)}}}return a},[])}function eliminate_spurious_blocks(statements){var seen_dirs=[];return statements.reduce(function(a,stat){if(stat instanceof Cola.AST_BlockStatement){CHANGED=true;a.push.apply(a,eliminate_spurious_blocks(stat.body))}else if(stat instanceof Cola.AST_EmptyStatement){CHANGED=true}else if(stat instanceof Cola.AST_Directive){if(seen_dirs.indexOf(stat.value)<0){a.push(stat);seen_dirs.push(stat.value)}else{CHANGED=true}}else{a.push(stat)}return a},[])}function handle_if_return(statements,compressor){var self=compressor.self();var in_lambda=self instanceof Cola.AST_Lambda;var ret=[];loop:for(var i=statements.length;--i>=0;){var stat=statements[i];switch(true){case in_lambda&&stat instanceof Cola.AST_Return&&!stat.value&&ret.length==0:CHANGED=true;continue loop;case stat instanceof Cola.AST_If:if(stat.body instanceof Cola.AST_Return){if((in_lambda&&ret.length==0||ret[0]instanceof Cola.AST_Return&&!ret[0].value)&&!stat.body.value&&!stat.alternative){CHANGED=true;var cond=make_node(Cola.AST_SimpleStatement,stat.condition,{body:stat.condition});ret.unshift(cond);continue loop}if(ret[0]instanceof Cola.AST_Return&&stat.body.value&&ret[0].value&&!stat.alternative){CHANGED=true;stat=stat.clone();stat.alternative=ret[0];ret[0]=stat.transform(compressor);continue loop}if((ret.length==0||ret[0]instanceof Cola.AST_Return)&&stat.body.value&&!stat.alternative&&in_lambda){CHANGED=true;stat=stat.clone();stat.alternative=ret[0]||make_node(Cola.AST_Return,stat,{value:make_node(Cola.AST_Undefined,stat)});ret[0]=stat.transform(compressor);continue loop}if(!stat.body.value&&in_lambda){CHANGED=true;stat=stat.clone();stat.condition=stat.condition.negate(compressor);stat.body=make_node(Cola.AST_BlockStatement,stat,{body:as_statement_array(stat.alternative).concat(ret)});stat.alternative=null;ret=[stat.transform(compressor)];continue loop}if(ret.length==1&&in_lambda&&ret[0]instanceof Cola.AST_SimpleStatement&&(!stat.alternative||stat.alternative instanceof Cola.AST_SimpleStatement)){CHANGED=true;ret.push(make_node(Cola.AST_Return,ret[0],{value:make_node(Cola.AST_Undefined,ret[0])}).transform(compressor));ret=as_statement_array(stat.alternative).concat(ret);ret.unshift(stat);continue loop}}var ab=aborts(stat.body);var lct=ab instanceof Cola.AST_LoopControl?compressor.loopcontrol_target(ab.label):null;if(ab&&(ab instanceof Cola.AST_Return&&!ab.value&&in_lambda||ab instanceof Cola.AST_Continue&&self===loop_body(lct)||ab instanceof Cola.AST_Break&&lct instanceof Cola.AST_BlockStatement&&self===lct)){if(ab.label){Cola.remove(ab.label.thedef.references,ab)}CHANGED=true;var body=as_statement_array(stat.body).slice(0,-1);stat=stat.clone();stat.condition=stat.condition.negate(compressor);stat.body=make_node(Cola.AST_BlockStatement,stat,{body:as_statement_array(stat.alternative).concat(ret)});stat.alternative=make_node(Cola.AST_BlockStatement,stat,{body:body});ret=[stat.transform(compressor)];continue loop}var ab=aborts(stat.alternative);var lct=ab instanceof Cola.AST_LoopControl?compressor.loopcontrol_target(ab.label):null;if(ab&&(ab instanceof Cola.AST_Return&&!ab.value&&in_lambda||ab instanceof Cola.AST_Continue&&self===loop_body(lct)||ab instanceof Cola.AST_Break&&lct instanceof Cola.AST_BlockStatement&&self===lct)){if(ab.label){Cola.remove(ab.label.thedef.references,ab)}CHANGED=true;stat=stat.clone();stat.body=make_node(Cola.AST_BlockStatement,stat.body,{body:as_statement_array(stat.body).concat(ret)});stat.alternative=make_node(Cola.AST_BlockStatement,stat.alternative,{body:as_statement_array(stat.alternative).slice(0,-1)});ret=[stat.transform(compressor)];continue loop}ret.unshift(stat);break;default:ret.unshift(stat);break}}return ret}function eliminate_dead_code(statements,compressor){var has_quit=false;var orig=statements.length;var self=compressor.self();statements=statements.reduce(function(a,stat){if(has_quit){extract_declarations_from_unreachable_code(compressor,stat,a)}else{if(stat instanceof Cola.AST_LoopControl){var lct=compressor.loopcontrol_target(stat.label);if(stat instanceof Cola.AST_Break&&lct instanceof Cola.AST_BlockStatement&&loop_body(lct)===self||stat instanceof Cola.AST_Continue&&loop_body(lct)===self){if(stat.label){Cola.remove(stat.label.thedef.references,stat)}}else{a.push(stat)}}else{a.push(stat)}if(aborts(stat))has_quit=true}return a},[]);CHANGED=statements.length!=orig;return statements}function sequencesize(statements,compressor){if(statements.length<2)return statements;var seq=[],ret=[];function push_seq(){seq=Cola.AST_Seq.from_array(seq);if(seq)ret.push(make_node(Cola.AST_SimpleStatement,seq,{body:seq}));seq=[]}statements.forEach(function(stat){if(stat instanceof Cola.AST_SimpleStatement)seq.push(stat.body);else push_seq(),ret.push(stat)});push_seq();ret=sequencesize_2(ret,compressor);CHANGED=ret.length!=statements.length;return ret}function sequencesize_2(statements,compressor){function cons_seq(right){ret.pop();var left=prev.body;if(left instanceof Cola.AST_Seq){left.add(right)}else{left=Cola.AST_Seq.cons(left,right)}return left.transform(compressor)}var ret=[],prev=null;statements.forEach(function(stat){if(prev){if(stat instanceof Cola.AST_For){var opera={};try{prev.body.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Binary&&node.operator=="in")throw opera}));if(stat.init&&!(stat.init instanceof Cola.AST_Definitions)){stat.init=cons_seq(stat.init)}else if(!stat.init){stat.init=prev.body;ret.pop()}}catch(ex){if(ex!==opera)throw ex}}else if(stat instanceof Cola.AST_If){stat.condition=cons_seq(stat.condition)}else if(stat instanceof Cola.AST_With){stat.expression=cons_seq(stat.expression)}else if(stat instanceof Cola.AST_Exit&&stat.value){stat.value=cons_seq(stat.value)}else if(stat instanceof Cola.AST_Exit){stat.value=cons_seq(make_node(Cola.AST_Undefined,stat))}else if(stat instanceof Cola.AST_Switch){stat.expression=cons_seq(stat.expression)}}ret.push(stat);prev=stat instanceof Cola.AST_SimpleStatement?stat:null});return ret}function join_consecutive_vars(statements,compressor){var prev=null;return statements.reduce(function(a,stat){if(stat instanceof Cola.AST_Definitions&&prev&&prev.TYPE==stat.TYPE){prev.definitions=prev.definitions.concat(stat.definitions);CHANGED=true}else if(stat instanceof Cola.AST_For&&prev instanceof Cola.AST_Definitions&&(!stat.init||stat.init.TYPE==prev.TYPE)){CHANGED=true;a.pop();if(stat.init){stat.init.definitions=prev.definitions.concat(stat.init.definitions)}else{stat.init=prev}a.push(stat);prev=stat}else{prev=stat;a.push(stat)}return a},[])}function negate_iifes(statements,compressor){statements.forEach(function(stat){if(stat instanceof Cola.AST_SimpleStatement){stat.body=function transform(thing){return thing.transform(new Cola.TreeTransformer(function(node){if(node instanceof Cola.AST_Call&&node.expression instanceof Cola.AST_Function){return make_node(Cola.AST_UnaryPrefix,node,{operator:"!",expression:node})}else if(node instanceof Cola.AST_Call){node.expression=transform(node.expression)}else if(node instanceof Cola.AST_Seq){node.car=transform(node.car)}else if(node instanceof Cola.AST_Conditional){var expr=transform(node.condition);if(expr!==node.condition){node.condition=expr;var tmp=node.consequent;node.consequent=node.alternative;node.alternative=tmp}}return node}))}(stat.body)}})}}function extract_declarations_from_unreachable_code(compressor,stat,target){compressor.warn("Dropping unreachable code [{file}:{line},{col}]",stat.start);stat.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Definitions){compressor.warn("Declarations in unreachable code! [{file}:{line},{col}]",node.start);node.remove_initializers();target.push(node);return true}if(node instanceof Cola.AST_Defun){target.push(node);return true}if(node instanceof Cola.AST_Scope){return true}}))}(function(def){var unary_bool=["!","delete"];var binary_bool=["in","instanceof","==","!=","===","!==","<","<=",">=",">"];def(Cola.AST_Node,function(){return false});def(Cola.AST_UnaryPrefix,function(){return Cola.member(this.operator,unary_bool)});def(Cola.AST_Binary,function(){return Cola.member(this.operator,binary_bool)||(this.operator=="&&"||this.operator=="||")&&this.left.is_boolean()&&this.right.is_boolean()});def(Cola.AST_Conditional,function(){return this.consequent.is_boolean()&&this.alternative.is_boolean()});def(Cola.AST_Assign,function(){return this.operator=="="&&this.right.is_boolean()});def(Cola.AST_Seq,function(){return this.cdr.is_boolean()});def(Cola.AST_True,function(){return true});def(Cola.AST_False,function(){return true})})(function(node,func){node.DEFMETHOD("is_boolean",func)});(function(def){def(Cola.AST_Node,function(){return false});def(Cola.AST_String,function(){return true});def(Cola.AST_UnaryPrefix,function(){return this.operator=="typeof"});def(Cola.AST_Binary,function(compressor){return this.operator=="+"&&(this.left.is_string(compressor)||this.right.is_string(compressor))});def(Cola.AST_Assign,function(compressor){return(this.operator=="="||this.operator=="+=")&&this.right.is_string(compressor)});def(Cola.AST_Seq,function(compressor){return this.cdr.is_string(compressor)});def(Cola.AST_Conditional,function(compressor){return this.consequent.is_string(compressor)&&this.alternative.is_string(compressor)});def(Cola.AST_Call,function(compressor){return compressor.option("unsafe")&&this.expression instanceof Cola.AST_SymbolRef&&this.expression.name=="String"&&this.expression.undeclared()})})(function(node,func){node.DEFMETHOD("is_string",func)});function best_of(ast1,ast2){return ast1.print_to_string().length>ast2.print_to_string().length?ast2:ast1}(function(def){Cola.AST_Node.DEFMETHOD("evaluate",function(compressor){if(!compressor.option("evaluate"))return[this];try{var val=this._eval(compressor);return[best_of(make_node_from_constant(compressor,val,this),this),val]}catch(ex){if(ex!==def)throw ex;return[this]}});def(Cola.AST_Statement,function(){throw new Error(Cola.string_template("Cannot evaluate a statement [{file}:{line},{col}]",this.start))});def(Cola.AST_Function,function(){throw def});function ev(node,compressor){if(!compressor)throw new Error("Compressor must be passed");return node._eval(compressor)}def(Cola.AST_Node,function(){throw def});def(Cola.AST_Constant,function(){return this.getValue()});def(Cola.AST_UnaryPrefix,function(compressor){var e=this.expression;switch(this.operator){case"!":return!ev(e,compressor);case"typeof":if(e instanceof Cola.AST_Function)return typeof function(){};e=ev(e,compressor);if(e instanceof RegExp)throw def;return typeof e;case"void":return void ev(e,compressor);case"~":return~ev(e,compressor);case"-":e=ev(e,compressor);if(e===0)throw def;return-e;case"+":return+ev(e,compressor)}throw def});def(Cola.AST_Binary,function(c){var left=this.left,right=this.right;switch(this.operator){case"&&":return ev(left,c)&&ev(right,c);case"||":return ev(left,c)||ev(right,c);case"|":return ev(left,c)|ev(right,c);case"&":return ev(left,c)&ev(right,c);case"^":return ev(left,c)^ev(right,c);case"+":return ev(left,c)+ev(right,c);case"*":return ev(left,c)*ev(right,c);case"/":return ev(left,c)/ev(right,c);case"%":return ev(left,c)%ev(right,c);case"-":return ev(left,c)-ev(right,c);case"<<":return ev(left,c)<>":return ev(left,c)>>ev(right,c);case">>>":return ev(left,c)>>>ev(right,c);case"==":return ev(left,c)==ev(right,c);case"===":return ev(left,c)===ev(right,c);case"!=":return ev(left,c)!=ev(right,c);case"!==":return ev(left,c)!==ev(right,c);case"<":return ev(left,c)":return ev(left,c)>ev(right,c);case">=":return ev(left,c)>=ev(right,c);case"in":return ev(left,c)in ev(right,c);case"instanceof":return ev(left,c)instanceof ev(right,c)}throw def});def(Cola.AST_Conditional,function(compressor){return ev(this.condition,compressor)?ev(this.consequent,compressor):ev(this.alternative,compressor)});def(Cola.AST_SymbolRef,function(compressor){var d=this.definition();if(d&&d.constant&&d.init)return ev(d.init,compressor);throw def})})(function(node,func){node.DEFMETHOD("_eval",func)});(function(def){function basic_negation(exp){return make_node(Cola.AST_UnaryPrefix,exp,{operator:"!",expression:exp})}def(Cola.AST_Node,function(){return basic_negation(this)});def(Cola.AST_Statement,function(){throw new Error("Cannot negate a statement")});def(Cola.AST_Function,function(){return basic_negation(this)});def(Cola.AST_UnaryPrefix,function(){if(this.operator=="!")return this.expression;return basic_negation(this)});def(Cola.AST_Seq,function(compressor){var self=this.clone();self.cdr=self.cdr.negate(compressor);return self});def(Cola.AST_Conditional,function(compressor){var self=this.clone();self.consequent=self.consequent.negate(compressor);self.alternative=self.alternative.negate(compressor);return best_of(basic_negation(this),self)});def(Cola.AST_Binary,function(compressor){var self=this.clone(),op=this.operator;if(compressor.option("unsafe_comps")){switch(op){case"<=":self.operator=">";return self;case"<":self.operator=">=";return self;case">=":self.operator="<";return self;case">":self.operator="<=";return self}}switch(op){case"==":self.operator="!=";return self;case"!=":self.operator="==";return self;case"===":self.operator="!==";return self;case"!==":self.operator="===";return self;case"&&":self.operator="||";self.left=self.left.negate(compressor);self.right=self.right.negate(compressor);return best_of(basic_negation(this),self);case"||":self.operator="&&";self.left=self.left.negate(compressor);self.right=self.right.negate(compressor);return best_of(basic_negation(this),self)}return basic_negation(this)})})(function(node,func){node.DEFMETHOD("negate",function(compressor){return func.call(this,compressor)})});(function(def){def(Cola.AST_Node,function(compressor){return true});def(Cola.AST_EmptyStatement,function(compressor){return false});def(Cola.AST_Constant,function(compressor){return false});def(Cola.AST_This,function(compressor){return false});def(Cola.AST_Call,function(compressor){var pure=compressor.option("pure_funcs");if(!pure)return true;return pure.indexOf(this.expression.print_to_string())<0});def(Cola.AST_Block,function(compressor){for(var i=this.body.length;--i>=0;){if(this.body[i].has_side_effects(compressor))return true}return false});def(Cola.AST_SimpleStatement,function(compressor){return this.body.has_side_effects(compressor)});def(Cola.AST_Defun,function(compressor){return true});def(Cola.AST_Function,function(compressor){return false});def(Cola.AST_Binary,function(compressor){return this.left.has_side_effects(compressor)||this.right.has_side_effects(compressor)});def(Cola.AST_Assign,function(compressor){return true});def(Cola.AST_Conditional,function(compressor){return this.condition.has_side_effects(compressor)||this.consequent.has_side_effects(compressor)||this.alternative.has_side_effects(compressor)});def(Cola.AST_Unary,function(compressor){return this.operator=="delete"||this.operator=="++"||this.operator=="--"||this.expression.has_side_effects(compressor)});def(Cola.AST_SymbolRef,function(compressor){return false});def(Cola.AST_Object,function(compressor){for(var i=this.properties.length;--i>=0;)if(this.properties[i].has_side_effects(compressor))return true;return false});def(Cola.AST_ObjectProperty,function(compressor){return this.value.has_side_effects(compressor)});def(Cola.AST_Array,function(compressor){for(var i=this.elements.length;--i>=0;)if(this.elements[i].has_side_effects(compressor))return true;return false});def(Cola.AST_Dot,function(compressor){if(!compressor.option("pure_getters"))return true;return this.expression.has_side_effects(compressor)});def(Cola.AST_Sub,function(compressor){if(!compressor.option("pure_getters"))return true;return this.expression.has_side_effects(compressor)||this.property.has_side_effects(compressor)});def(Cola.AST_PropAccess,function(compressor){return!compressor.option("pure_getters")});def(Cola.AST_Seq,function(compressor){return this.car.has_side_effects(compressor)||this.cdr.has_side_effects(compressor)})})(function(node,func){node.DEFMETHOD("has_side_effects",func)});function aborts(thing){return thing&&thing.aborts()}(function(def){def(Cola.AST_Statement,function(){return null});def(Cola.AST_Jump,function(){return this});function block_aborts(){var n=this.body.length;return n>0&&aborts(this.body[n-1])}def(Cola.AST_BlockStatement,block_aborts);def(Cola.AST_SwitchBranch,block_aborts);def(Cola.AST_If,function(){return this.alternative&&aborts(this.body)&&aborts(this.alternative)})})(function(node,func){node.DEFMETHOD("aborts",func)});OPT(Cola.AST_Directive,function(self,compressor){if(self.scope.has_directive(self.value)!==self.scope){return make_node(Cola.AST_EmptyStatement,self)}return self});OPT(Cola.AST_Debugger,function(self,compressor){if(compressor.option("drop_debugger"))return make_node(Cola.AST_EmptyStatement,self);return self});OPT(Cola.AST_LabeledStatement,function(self,compressor){if(self.body instanceof Cola.AST_Break&&compressor.loopcontrol_target(self.body.label)===self.body){return make_node(Cola.AST_EmptyStatement,self)}return self.label.references.length==0?self.body:self});OPT(Cola.AST_Block,function(self,compressor){self.body=tighten_body(self.body,compressor);return self});OPT(Cola.AST_BlockStatement,function(self,compressor){self.body=tighten_body(self.body,compressor);switch(self.body.length){case 1:return self.body[0];case 0:return make_node(Cola.AST_EmptyStatement,self)}return self});Cola.AST_Scope.DEFMETHOD("drop_unused",function(compressor){var self=this;if(compressor.option("unused")&&!(self instanceof Cola.AST_Toplevel)&&!self.uses_eval){var in_use=[];var initializations=new Cola.Dictionary;var scope=this;var tw=new Cola.TreeWalker(function(node,descend){if(node!==self){if(node instanceof Cola.AST_Defun){initializations.add(node.name.name,node);return true}if(node instanceof Cola.AST_Definitions&&scope===self){node.definitions.forEach(function(def){if(def.value){initializations.add(def.name.name,def.value);if(def.value.has_side_effects(compressor)){def.value.walk(tw)}}});return true}if(node instanceof Cola.AST_SymbolRef){Cola.push_uniq(in_use,node.definition());return true}if(node instanceof Cola.AST_Scope){var save_scope=scope;scope=node;descend();scope=save_scope;return true}}});self.walk(tw);for(var i=0;i=0;){var sym=a[i];if(sym.unreferenced()){a.pop();compressor.warn("Dropping unused function argument {name} [{file}:{line},{col}]",{name:sym.name,file:sym.start.file,line:sym.start.line,col:sym.start.col})}else break}}}if(node instanceof Cola.AST_Defun&&node!==self){if(!Cola.member(node.name.definition(),in_use)){compressor.warn("Dropping unused function {name} [{file}:{line},{col}]",{name:node.name.name,file:node.name.start.file,line:node.name.start.line,col:node.name.start.col});return make_node(Cola.AST_EmptyStatement,node)}return node}if(node instanceof Cola.AST_Definitions&&!(tt.parent()instanceof Cola.AST_ForIn)){var def=node.definitions.filter(function(def){if(Cola.member(def.name.definition(),in_use))return true;var w={name:def.name.name,file:def.name.start.file,line:def.name.start.line,col:def.name.start.col};if(def.value&&def.value.has_side_effects(compressor)){def._unused_side_effects=true;compressor.warn("Side effects in initialization of unused variable {name} [{file}:{line},{col}]",w);return true}compressor.warn("Dropping unused variable {name} [{file}:{line},{col}]",w);return false});def=Cola.mergeSort(def,function(a,b){if(!a.value&&b.value)return-1;if(!b.value&&a.value)return 1;return 0});var side_effects=[];for(var i=0;i0){side_effects.push(x.value);x.value=Cola.AST_Seq.from_array(side_effects);side_effects=[]}++i}}if(side_effects.length>0){side_effects=make_node(Cola.AST_BlockStatement,node,{body:[make_node(Cola.AST_SimpleStatement,node,{body:Cola.AST_Seq.from_array(side_effects)})]})}else{side_effects=null}if(def.length==0&&!side_effects){return make_node(Cola.AST_EmptyStatement,node)}if(def.length==0){return side_effects}node.definitions=def;if(side_effects){side_effects.body.unshift(node);node=side_effects}return node}if(node instanceof Cola.AST_For){descend(node,this);if(node.init instanceof Cola.AST_BlockStatement){var body=node.init.body.slice(0,-1);node.init=node.init.body.slice(-1)[0].body;body.push(node);return in_list?Cola.MAP.splice(body):make_node(Cola.AST_BlockStatement,node,{body:body})}}if(node instanceof Cola.AST_Scope&&node!==self)return node});self.transform(tt)}});Cola.AST_Scope.DEFMETHOD("hoist_declarations",function(compressor){var hoist_funs=compressor.option("hoist_funs");var hoist_vars=compressor.option("hoist_vars");var self=this;if(hoist_funs||hoist_vars){var dirs=[];var hoisted=[];var vars=new Cola.Dictionary,vars_found=0,var_decl=0;self.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Scope&&node!==self)return true;if(node instanceof Cola.AST_Var){++var_decl; -return true}}));hoist_vars=hoist_vars&&var_decl>1;var tt=new Cola.TreeTransformer(function before(node){if(node!==self){if(node instanceof Cola.AST_Directive){dirs.push(node);return make_node(Cola.AST_EmptyStatement,node)}if(node instanceof Cola.AST_Defun&&hoist_funs){hoisted.push(node);return make_node(Cola.AST_EmptyStatement,node)}if(node instanceof Cola.AST_Var&&hoist_vars){node.definitions.forEach(function(def){vars.set(def.name.name,def);++vars_found});var seq=node.to_assignments();var p=tt.parent();if(p instanceof Cola.AST_ForIn&&p.init===node){if(seq==null)return node.definitions[0].name;return seq}if(p instanceof Cola.AST_For&&p.init===node){return seq}if(!seq)return make_node(Cola.AST_EmptyStatement,node);return make_node(Cola.AST_SimpleStatement,node,{body:seq})}if(node instanceof Cola.AST_Scope)return node}});self=self.transform(tt);if(vars_found>0){var defs=[];vars.each(function(def,name){if(self instanceof Cola.AST_Lambda&&Cola.find_if(function(x){return x.name==def.name.name},self.argnames)){vars.del(name)}else{def=def.clone();def.value=null;defs.push(def);vars.set(name,def)}});if(defs.length>0){for(var i=0;i1){if(cond[1]){return make_node(Cola.AST_For,self,{body:self.body})}else if(self instanceof Cola.AST_While){if(compressor.option("dead_code")){var a=[];extract_declarations_from_unreachable_code(compressor,self.body,a);return make_node(Cola.AST_BlockStatement,self,{body:a})}}}return self});function if_break_in_loop(self,compressor){function drop_it(rest){rest=as_statement_array(rest);if(self.body instanceof Cola.AST_BlockStatement){self.body=self.body.clone();self.body.body=rest.concat(self.body.body.slice(1));self.body=self.body.transform(compressor)}else{self.body=make_node(Cola.AST_BlockStatement,self.body,{body:rest}).transform(compressor)}if_break_in_loop(self,compressor)}var first=self.body instanceof Cola.AST_BlockStatement?self.body.body[0]:self.body;if(first instanceof Cola.AST_If){if(first.body instanceof Cola.AST_Break&&compressor.loopcontrol_target(first.body.label)===self){if(self.condition){self.condition=make_node(Cola.AST_Binary,self.condition,{left:self.condition,operator:"&&",right:first.condition.negate(compressor)})}else{self.condition=first.condition.negate(compressor)}drop_it(first.alternative)}else if(first.alternative instanceof Cola.AST_Break&&compressor.loopcontrol_target(first.alternative.label)===self){if(self.condition){self.condition=make_node(Cola.AST_Binary,self.condition,{left:self.condition,operator:"&&",right:first.condition})}else{self.condition=first.condition}drop_it(first.body)}}}OPT(Cola.AST_While,function(self,compressor){if(!compressor.option("loops"))return self;self=Cola.AST_DWLoop.prototype.optimize.call(self,compressor);if(self instanceof Cola.AST_While){if_break_in_loop(self,compressor);self=make_node(Cola.AST_For,self,self).transform(compressor)}return self});OPT(Cola.AST_For,function(self,compressor){var cond=self.condition;if(cond){cond=cond.evaluate(compressor);self.condition=cond[0]}if(!compressor.option("loops"))return self;if(cond){if(cond.length>1&&!cond[1]){if(compressor.option("dead_code")){var a=[];if(self.init instanceof Cola.AST_Statement){a.push(self.init)}else if(self.init){a.push(make_node(Cola.AST_SimpleStatement,self.init,{body:self.init}))}extract_declarations_from_unreachable_code(compressor,self.body,a);return make_node(Cola.AST_BlockStatement,self,{body:a})}}}if_break_in_loop(self,compressor);return self});OPT(Cola.AST_If,function(self,compressor){if(!compressor.option("conditionals"))return self;var cond=self.condition.evaluate(compressor);self.condition=cond[0];if(cond.length>1){if(cond[1]){compressor.warn("Condition always true [{file}:{line},{col}]",self.condition.start);if(compressor.option("dead_code")){var a=[];if(self.alternative){extract_declarations_from_unreachable_code(compressor,self.alternative,a)}a.push(self.body);return make_node(Cola.AST_BlockStatement,self,{body:a}).transform(compressor)}}else{compressor.warn("Condition always false [{file}:{line},{col}]",self.condition.start);if(compressor.option("dead_code")){var a=[];extract_declarations_from_unreachable_code(compressor,self.body,a);if(self.alternative)a.push(self.alternative);return make_node(Cola.AST_BlockStatement,self,{body:a}).transform(compressor)}}}if(is_empty(self.alternative))self.alternative=null;var negated=self.condition.negate(compressor);var negated_is_best=best_of(self.condition,negated)===negated;if(self.alternative&&negated_is_best){negated_is_best=false;self.condition=negated;var tmp=self.body;self.body=self.alternative||make_node(Cola.AST_EmptyStatement);self.alternative=tmp}if(is_empty(self.body)&&is_empty(self.alternative)){return make_node(Cola.AST_SimpleStatement,self.condition,{body:self.condition}).transform(compressor)}if(self.body instanceof Cola.AST_SimpleStatement&&self.alternative instanceof Cola.AST_SimpleStatement){return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:self.body.body,alternative:self.alternative.body})}).transform(compressor)}if(is_empty(self.alternative)&&self.body instanceof Cola.AST_SimpleStatement){if(negated_is_best)return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"||",left:negated,right:self.body.body})}).transform(compressor);return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"&&",left:self.condition,right:self.body.body})}).transform(compressor)}if(self.body instanceof Cola.AST_EmptyStatement&&self.alternative&&self.alternative instanceof Cola.AST_SimpleStatement){return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"||",left:self.condition,right:self.alternative.body})}).transform(compressor)}if(self.body instanceof Cola.AST_Exit&&self.alternative instanceof Cola.AST_Exit&&self.body.TYPE==self.alternative.TYPE){return make_node(self.body.CTOR,self,{value:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:self.body.value||make_node(Cola.AST_Undefined,self.body).optimize(compressor),alternative:self.alternative.value||make_node(Cola.AST_Undefined,self.alternative).optimize(compressor)})}).transform(compressor)}if(self.body instanceof Cola.AST_If&&!self.body.alternative&&!self.alternative){self.condition=make_node(Cola.AST_Binary,self.condition,{operator:"&&",left:self.condition,right:self.body.condition}).transform(compressor);self.body=self.body.body}if(aborts(self.body)){if(self.alternative){var alt=self.alternative;self.alternative=null;return make_node(Cola.AST_BlockStatement,self,{body:[self,alt]}).transform(compressor)}}if(aborts(self.alternative)){var body=self.body;self.body=self.alternative;self.condition=negated_is_best?negated:self.condition.negate(compressor);self.alternative=null;return make_node(Cola.AST_BlockStatement,self,{body:[self,body]}).transform(compressor)}return self});OPT(Cola.AST_Switch,function(self,compressor){if(self.body.length==0&&compressor.option("conditionals")){return make_node(Cola.AST_SimpleStatement,self,{body:self.expression}).transform(compressor)}for(;;){var last_branch=self.body[self.body.length-1];if(last_branch){var stat=last_branch.body[last_branch.body.length-1];if(stat instanceof Cola.AST_Break&&loop_body(compressor.loopcontrol_target(stat.label))===self)last_branch.body.pop();if(last_branch instanceof Cola.AST_Default&&last_branch.body.length==0){self.body.pop();continue}}break}var exp=self.expression.evaluate(compressor);out:if(exp.length==2)try{self.expression=exp[0];if(!compressor.option("dead_code"))break out;var value=exp[1];var in_if=false;var in_block=false;var started=false;var stopped=false;var ruined=false;var tt=new Cola.TreeTransformer(function(node,descend,in_list){if(node instanceof Cola.AST_Lambda||node instanceof Cola.AST_SimpleStatement){return node}else if(node instanceof Cola.AST_Switch&&node===self){node=node.clone();descend(node,this);return ruined?node:make_node(Cola.AST_BlockStatement,node,{body:node.body.reduce(function(a,branch){return a.concat(branch.body)},[])}).transform(compressor)}else if(node instanceof Cola.AST_If||node instanceof Cola.AST_Try){var save=in_if;in_if=!in_block;descend(node,this);in_if=save;return node}else if(node instanceof Cola.AST_StatementWithBody||node instanceof Cola.AST_Switch){var save=in_block;in_block=true;descend(node,this);in_block=save;return node}else if(node instanceof Cola.AST_Break&&this.loopcontrol_target(node.label)===self){if(in_if){ruined=true;return node}if(in_block)return node;stopped=true;return in_list?Cola.MAP.skip:make_node(Cola.AST_EmptyStatement,node)}else if(node instanceof Cola.AST_SwitchBranch&&this.parent()===self){if(stopped)return Cola.MAP.skip;if(node instanceof Cola.AST_Case){var exp=node.expression.evaluate(compressor);if(exp.length<2){throw self}if(exp[1]===value||started){started=true;if(aborts(node))stopped=true;descend(node,this);return node}return Cola.MAP.skip}descend(node,this);return node}});tt.stack=compressor.stack.slice();self=self.transform(tt)}catch(ex){if(ex!==self)throw ex}return self});OPT(Cola.AST_Case,function(self,compressor){self.body=tighten_body(self.body,compressor);return self});OPT(Cola.AST_Try,function(self,compressor){self.body=tighten_body(self.body,compressor);return self});Cola.AST_Definitions.DEFMETHOD("remove_initializers",function(){this.definitions.forEach(function(def){def.value=null})});Cola.AST_Definitions.DEFMETHOD("to_assignments",function(){var assignments=this.definitions.reduce(function(a,def){if(def.value){var name=make_node(Cola.AST_SymbolRef,def.name,def.name);a.push(make_node(Cola.AST_Assign,def,{operator:"=",left:name,right:def.value}))}return a},[]);if(assignments.length==0)return null;return Cola.AST_Seq.from_array(assignments)});OPT(Cola.AST_Definitions,function(self,compressor){if(self.definitions.length==0)return make_node(Cola.AST_EmptyStatement,self);return self});OPT(Cola.AST_Function,function(self,compressor){self=Cola.AST_Lambda.prototype.optimize.call(self,compressor);if(compressor.option("unused")){if(self.name&&self.name.unreferenced()){self.name=null}}return self});OPT(Cola.AST_Call,function(self,compressor){if(compressor.option("evaluate")){if(self.expression instanceof Cola.AST_Dot&&Cola.Compressor.MathFuncs[self.expression.property]&&self.expression.expression instanceof Cola.AST_SymbolRef&&self.expression.expression.name=="Math"){var args=[],allstatic=true,val;self.args.some(function(arg){if(arg instanceof Cola.AST_Constant)args.push(arg.value);else return!(allstatic=false)});if(allstatic){val=Math[self.expression.property].apply({},args);if((""+val).length<=15)return make_node(Cola.AST_Number,self,{value:val}).transform(compressor)}}else if(!compressor.option("is_js")&&self.expression instanceof Cola.AST_SymbolRef&&Cola.Compressor.StdFuncs[self.expression.name]&&self.args[0]instanceof Cola.AST_Constant){if(self.expression.name=="$_cola_isset"||self.expression.name=="$_cola_isntset")return make_node(Cola.AST_Boolean,self,{value:Cola[self.expression.name](self.args[0].value)}).transform(compressor);if((self.expression.name=="$_cola_is"||self.expression.name=="$_cola_isnt")&&self.args[1]instanceof Cola.AST_SymbolRef&&(self.args[1].value=="Number"||self.args[1].value=="Boolean"||self.args[1].value=="String"))return make_node(Cola.AST_Boolean,self,{value:Cola[self.expression.name](self.args[0].value,eval(self.args[1].value))}).transform(compressor);if(self.expression.name=="$_cola_modulo"&&self.args[1]instanceof Cola.AST_Constant)return make_node(Cola.AST_Number,self,{value:Cola.$_cola_modulo(self.args[0].value,self.args[1].value)}).transform(compressor)}}if(compressor.option("unsafe")){var exp=self.expression;if(exp instanceof Cola.AST_SymbolRef&&exp.undeclared()){switch(exp.name){case"Array":if(self.args.length!=1){return make_node(Cola.AST_Array,self,{elements:self.args}).transform(compressor)}break;case"Object":if(self.args.length==0){return make_node(Cola.AST_Object,self,{properties:[]})}break;case"String":if(self.args.length==0)return make_node(Cola.AST_String,self,{value:""});if(self.args.length<=1)return make_node(Cola.AST_Binary,self,{left:self.args[0],operator:"+",right:make_node(Cola.AST_String,self,{value:""})}).transform(compressor);break;case"Number":if(self.args.length==0)return make_node(Cola.AST_Number,self,{value:0});if(self.args.length==1)return make_node(Cola.AST_UnaryPrefix,self,{expression:self.args[0],operator:"+"}).transform(compressor);case"Boolean":if(self.args.length==0)return make_node(Cola.AST_False,self);if(self.args.length==1)return make_node(Cola.AST_UnaryPrefix,self,{expression:make_node(Cola.AST_UnaryPrefix,null,{expression:self.args[0],operator:"!"}),operator:"!"}).transform(compressor);break;case"Function":if(Cola.all(self.args,function(x){return x instanceof Cola.AST_String})){try{var code="(function("+self.args.slice(0,-1).map(function(arg){return arg.value}).join(",")+"){"+self.args[self.args.length-1].value+"})()";var ast=Cola.parse(code);ast.figure_out_scope({screw_ie8:compressor.option("screw_ie8")});var comp=new Cola.Compressor(compressor.options);ast=ast.transform(comp);ast.figure_out_scope({screw_ie8:compressor.option("screw_ie8")});ast.mangle_names();var fun;try{ast.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Lambda){fun=node;throw ast}}))}catch(ex){if(ex!==ast)throw ex}var args=fun.argnames.map(function(arg,i){return make_node(Cola.AST_String,self.args[i],{value:arg.print_to_string()})});var code=new Cola.OutputStream;Cola.AST_BlockStatement.prototype._codegen.call(fun,fun,code);code=code.toString().replace(/^\{|\}$/g,"");args.push(make_node(Cola.AST_String,self.args[self.args.length-1],{value:code}));self.args=args;return self}catch(ex){if(ex instanceof Cola.JS_Parse_Error){compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]",self.args[self.args.length-1].start);compressor.warn(ex.toString())}else{console.log(ex);throw ex}}}break}}else if(exp instanceof Cola.AST_Dot&&exp.property=="toString"&&self.args.length==0){return make_node(Cola.AST_Binary,self,{left:make_node(Cola.AST_String,self,{value:""}),operator:"+",right:exp.expression}).transform(compressor)}else if(exp instanceof Cola.AST_Dot&&exp.expression instanceof Cola.AST_Array&&exp.property=="join")EXIT:{var separator=self.args.length==0?",":self.args[0].evaluate(compressor)[1];if(separator==null)break EXIT;var elements=exp.expression.elements.reduce(function(a,el){el=el.evaluate(compressor);if(a.length==0||el.length==1){a.push(el)}else{var last=a[a.length-1];if(last.length==2){var val=""+last[1]+separator+el[1];a[a.length-1]=[make_node_from_constant(compressor,val,last[0]),val]}else{a.push(el)}}return a},[]);if(elements.length==0)return make_node(Cola.AST_String,self,{value:""});if(elements.length==1)return elements[0][0];if(separator==""){var first;if(elements[0][0]instanceof Cola.AST_String||elements[1][0]instanceof Cola.AST_String){first=elements.shift()[0]}else{first=make_node(Cola.AST_String,self,{value:""})}return elements.reduce(function(prev,el){return make_node(Cola.AST_Binary,el[0],{operator:"+",left:prev,right:el[0]})},first).transform(compressor)}var node=self.clone();node.expression=node.expression.clone();node.expression.expression=node.expression.expression.clone();node.expression.expression.elements=elements.map(function(el){return el[0]});return best_of(self,node)}}if(compressor.option("side_effects")){if(self.expression instanceof Cola.AST_Function&&self.args.length==0&&!Cola.AST_Block.prototype.has_side_effects.call(self.expression,compressor)){return make_node(Cola.AST_Undefined,self).transform(compressor)}}if(compressor.option("drop_console")){if(self.expression instanceof Cola.AST_PropAccess&&self.expression.expression instanceof Cola.AST_SymbolRef&&self.expression.expression.name=="console"&&self.expression.expression.undeclared()){return make_node(Cola.AST_Undefined,self).transform(compressor)}}return self.evaluate(compressor)[0]});OPT(Cola.AST_New,function(self,compressor){if(compressor.option("unsafe")){var exp=self.expression;if(exp instanceof Cola.AST_SymbolRef&&exp.undeclared()){switch(exp.name){case"Object":case"RegExp":case"Function":case"Error":case"Array":return make_node(Cola.AST_Call,self,self).transform(compressor)}}}return self});OPT(Cola.AST_Seq,function(self,compressor){if(!compressor.option("side_effects"))return self;if(!self.car.has_side_effects(compressor)){var p;if(!(self.cdr instanceof Cola.AST_SymbolRef&&self.cdr.name=="eval"&&self.cdr.undeclared()&&(p=compressor.parent())instanceof Cola.AST_Call&&p.expression===self)){return self.cdr}}if(compressor.option("cascade")){if(self.car instanceof Cola.AST_Assign&&!self.car.left.has_side_effects(compressor)){if(self.car.left.equivalent_to(self.cdr)){return self.car}if(self.cdr instanceof Cola.AST_Call&&self.cdr.expression.equivalent_to(self.car.left)){self.cdr.expression=self.car;return self.cdr}}if(!self.car.has_side_effects(compressor)&&!self.cdr.has_side_effects(compressor)&&self.car.equivalent_to(self.cdr)){return self.car}}if(self.cdr instanceof Cola.AST_UnaryPrefix&&self.cdr.operator=="void"&&!self.cdr.expression.has_side_effects(compressor)){self.cdr.operator=self.car;return self.cdr}if(self.cdr instanceof Cola.AST_Undefined){return make_node(Cola.AST_UnaryPrefix,self,{operator:"void",expression:self.car})}return self});Cola.AST_Unary.DEFMETHOD("lift_sequences",function(compressor){if(compressor.option("sequences")){if(this.expression instanceof Cola.AST_Seq){var seq=this.expression;var x=seq.to_array();this.expression=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}}return this});OPT(Cola.AST_UnaryPostfix,function(self,compressor){return self.lift_sequences(compressor)});OPT(Cola.AST_UnaryPrefix,function(self,compressor){self=self.lift_sequences(compressor);var e=self.expression;if(compressor.option("booleans")&&compressor.in_boolean_context()){switch(self.operator){case"!":if(e instanceof Cola.AST_UnaryPrefix&&e.operator=="!"){return e.expression}break;case"typeof":compressor.warn("Boolean expression always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}if(e instanceof Cola.AST_Binary&&self.operator=="!"){self=best_of(self,e.negate(compressor))}}return self.evaluate(compressor)[0]});function has_side_effects_or_prop_access(node,compressor){var save_pure_getters=compressor.option("pure_getters");compressor.options.pure_getters=false;var ret=node.has_side_effects(compressor);compressor.options.pure_getters=save_pure_getters;return ret}Cola.AST_Binary.DEFMETHOD("lift_sequences",function(compressor){if(compressor.option("sequences")){if(this.left instanceof Cola.AST_Seq){var seq=this.left;var x=seq.to_array();this.left=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}if(this.right instanceof Cola.AST_Seq&&this instanceof Cola.AST_Assign&&!has_side_effects_or_prop_access(this.left,compressor)){var seq=this.right;var x=seq.to_array();this.right=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}}return this});var commutativeOperators=Cola.makePredicate("== === != !== * & | ^");OPT(Cola.AST_Binary,function(self,compressor){var reverse=compressor.has_directive("use asm")?Cola.noop:function(op,force){if(force||!(self.left.has_side_effects(compressor)||self.right.has_side_effects(compressor))){if(op)self.operator=op;var tmp=self.left;self.left=self.right;self.right=tmp}};if(commutativeOperators(self.operator)){if(self.right instanceof Cola.AST_Constant&&!(self.left instanceof Cola.AST_Constant)){if(!(self.left instanceof Cola.AST_Binary&&Cola.PRECEDENCE[self.left.operator]>=Cola.PRECEDENCE[self.operator])){reverse(null,true)}}if(/^[!=]==?$/.test(self.operator)){if(self.left instanceof Cola.AST_SymbolRef&&self.right instanceof Cola.AST_Conditional){if(self.right.consequent instanceof Cola.AST_SymbolRef&&self.right.consequent.definition()===self.left.definition()){if(/^==/.test(self.operator))return self.right.condition;if(/^!=/.test(self.operator))return self.right.condition.negate(compressor)}if(self.right.alternative instanceof Cola.AST_SymbolRef&&self.right.alternative.definition()===self.left.definition()){if(/^==/.test(self.operator))return self.right.condition.negate(compressor);if(/^!=/.test(self.operator))return self.right.condition}}if(self.right instanceof Cola.AST_SymbolRef&&self.left instanceof Cola.AST_Conditional){if(self.left.consequent instanceof Cola.AST_SymbolRef&&self.left.consequent.definition()===self.right.definition()){if(/^==/.test(self.operator))return self.left.condition;if(/^!=/.test(self.operator))return self.left.condition.negate(compressor)}if(self.left.alternative instanceof Cola.AST_SymbolRef&&self.left.alternative.definition()===self.right.definition()){if(/^==/.test(self.operator))return self.left.condition.negate(compressor);if(/^!=/.test(self.operator))return self.left.condition}}}}self=self.lift_sequences(compressor);if(compressor.option("comparisons"))switch(self.operator){case"===":case"!==":if(self.left.is_string(compressor)&&self.right.is_string(compressor)||self.left.is_boolean()&&self.right.is_boolean()){self.operator=self.operator.substr(0,2)}case"==":case"!=":if(self.left instanceof Cola.AST_String&&self.left.value=="undefined"&&self.right instanceof Cola.AST_UnaryPrefix&&self.right.operator=="typeof"&&compressor.option("unsafe")){if(!(self.right.expression instanceof Cola.AST_SymbolRef)||!self.right.expression.undeclared()){self.right=self.right.expression;self.left=make_node(Cola.AST_Undefined,self.left).optimize(compressor);if(self.operator.length==2)self.operator+="="}}break}if(compressor.option("booleans")&&compressor.in_boolean_context())switch(self.operator){case"&&":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&!ll[1]||rr.length>1&&!rr[1]){compressor.warn("Boolean && always false [{file}:{line},{col}]",self.start);return make_node(Cola.AST_False,self)}if(ll.length>1&&ll[1]){return rr[0]}if(rr.length>1&&rr[1]){return ll[0]}break;case"||":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&ll[1]||rr.length>1&&rr[1]){compressor.warn("Boolean || always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}if(ll.length>1&&!ll[1]){return rr[0]}if(rr.length>1&&!rr[1]){return ll[0]}break;case"+":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&ll[0]instanceof Cola.AST_String&&ll[1]||rr.length>1&&rr[0]instanceof Cola.AST_String&&rr[1]){compressor.warn("+ in boolean context always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}break}if(compressor.option("comparisons")){if(!(compressor.parent()instanceof Cola.AST_Binary)||compressor.parent()instanceof Cola.AST_Assign){var negated=make_node(Cola.AST_UnaryPrefix,self,{operator:"!",expression:self.negate(compressor)});self=best_of(self,negated)}switch(self.operator){case"<":reverse(">");break;case"<=":reverse(">=");break}}if(self.operator=="+"&&self.right instanceof Cola.AST_String&&self.right.getValue()===""&&self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.is_string(compressor)){return self.left}if(compressor.option("evaluate")){if(self.operator=="+"){if(self.left instanceof Cola.AST_Constant&&self.right instanceof Cola.AST_Binary&&self.right.operator=="+"&&self.right.left instanceof Cola.AST_Constant&&self.right.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:make_node(Cola.AST_String,null,{value:""+self.left.getValue()+self.right.left.getValue(),start:self.left.start,end:self.right.left.end}),right:self.right.right})}if(self.right instanceof Cola.AST_Constant&&self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.right instanceof Cola.AST_Constant&&self.left.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:self.left.left,right:make_node(Cola.AST_String,null,{value:""+self.left.right.getValue()+self.right.getValue(),start:self.left.right.start,end:self.right.end})})}if(self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.is_string(compressor)&&self.left.right instanceof Cola.AST_Constant&&self.right instanceof Cola.AST_Binary&&self.right.operator=="+"&&self.right.left instanceof Cola.AST_Constant&&self.right.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:make_node(Cola.AST_Binary,self.left,{operator:"+",left:self.left.left,right:make_node(Cola.AST_String,null,{value:""+self.left.right.getValue()+self.right.left.getValue(),start:self.left.right.start,end:self.right.left.end})}),right:self.right.right})}}}if(self.right instanceof Cola.AST_Binary&&self.right.operator==self.operator&&(self.operator=="*"||self.operator=="&&"||self.operator=="||")){self.left=make_node(Cola.AST_Binary,self.left,{operator:self.operator,left:self.left,right:self.right.left});self.right=self.right.right;return self.transform(compressor)}return self.evaluate(compressor)[0]});OPT(Cola.AST_SymbolRef,function(self,compressor){if(self.undeclared()){var defines=compressor.option("global_defs");if(defines&&defines.hasOwnProperty(self.name)){return make_node_from_constant(compressor,defines[self.name],self)}switch(self.name){case"undefined":return make_node(Cola.AST_Undefined,self);case"NaN":return make_node(Cola.AST_NaN,self);case"Infinity":return make_node(Cola.AST_Infinity,self)}}return self});OPT(Cola.AST_Undefined,function(self,compressor){if(compressor.option("unsafe")){var scope=compressor.find_parent(Cola.AST_Scope);var undef=scope.find_variable("undefined");if(undef){var ref=make_node(Cola.AST_SymbolRef,self,{name:"undefined",scope:scope,thedef:undef});ref.reference();return ref}}return self});var ASSIGN_OPS=["+","-","/","*","%",">>","<<",">>>","|","^","&"];OPT(Cola.AST_Assign,function(self,compressor){self=self.lift_sequences(compressor);if(self.operator=="="&&self.left instanceof Cola.AST_SymbolRef&&self.right instanceof Cola.AST_Binary&&self.right.left instanceof Cola.AST_SymbolRef&&self.right.left.name==self.left.name&&Cola.member(self.right.operator,ASSIGN_OPS)){self.operator=self.right.operator+"=";self.right=self.right.right}return self});OPT(Cola.AST_Conditional,function(self,compressor){if(!compressor.option("conditionals"))return self;if(self.condition instanceof Cola.AST_Seq){var car=self.condition.car;self.condition=self.condition.cdr;return Cola.AST_Seq.cons(car,self)}var cond=self.condition.evaluate(compressor);if(cond.length>1){if(cond[1]){compressor.warn("Condition always true [{file}:{line},{col}]",self.start);return self.consequent}else{compressor.warn("Condition always false [{file}:{line},{col}]",self.start);return self.alternative}}var negated=cond[0].negate(compressor);if(best_of(cond[0],negated)===negated){self=make_node(Cola.AST_Conditional,self,{condition:negated,consequent:self.alternative,alternative:self.consequent})}var consequent=self.consequent;var alternative=self.alternative;if(consequent instanceof Cola.AST_Assign&&alternative instanceof Cola.AST_Assign&&consequent.operator==alternative.operator&&consequent.left.equivalent_to(alternative.left)){return make_node(Cola.AST_Assign,self,{operator:consequent.operator,left:consequent.left,right:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:consequent.right,alternative:alternative.right})})}if(consequent instanceof Cola.AST_Call&&alternative.TYPE===consequent.TYPE&&consequent.args.length==alternative.args.length&&consequent.expression.equivalent_to(alternative.expression)){if(consequent.args.length==0){return make_node(Cola.AST_Seq,self,{car:self.condition,cdr:consequent})}if(consequent.args.length==1){consequent.args[0]=make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:consequent.args[0],alternative:alternative.args[0]});return consequent}}if(consequent instanceof Cola.AST_Conditional&&consequent.alternative.equivalent_to(alternative)){return make_node(Cola.AST_Conditional,self,{condition:make_node(Cola.AST_Binary,self,{left:self.condition,operator:"&&",right:consequent.condition}),consequent:consequent.consequent,alternative:alternative})}return self});OPT(Cola.AST_Boolean,function(self,compressor){if(compressor.option("booleans")){var p=compressor.parent();if(p instanceof Cola.AST_Binary&&(p.operator=="=="||p.operator=="!=")){compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]",{operator:p.operator,value:self.value,file:p.start.file,line:p.start.line,col:p.start.col});return make_node(Cola.AST_Number,self,{value:+self.value})}return make_node(Cola.AST_UnaryPrefix,self,{operator:"!",expression:make_node(Cola.AST_Number,self,{value:1-self.value})})}return self});OPT(Cola.AST_Sub,function(self,compressor){var prop=self.property;if(prop instanceof Cola.AST_String&&compressor.option("properties")){prop=prop.getValue();if(Cola.RESERVED_WORDS(prop)?compressor.option("screw_ie8"):Cola.is_identifier_string(prop)){return make_node(Cola.AST_Dot,self,{expression:self.expression,property:prop})}var v=parseFloat(prop);if(!isNaN(v)&&v.toString()==prop){self.property=make_node(Cola.AST_Number,self.property,{value:v})}}return self});function literals_in_boolean_context(self,compressor){if(compressor.option("booleans")&&compressor.in_boolean_context()){return make_node(Cola.AST_True,self)}return self}OPT(Cola.AST_Array,literals_in_boolean_context);OPT(Cola.AST_Object,literals_in_boolean_context);OPT(Cola.AST_RegExp,literals_in_boolean_context)})();"use strict";!this.Cola&&(this.Cola={});Cola.Constructions={};Cola.Constructions.setPos=function(node,ext){if(!ext)return node;if(ext.start)node.start=ext.start;if(ext.end)node.end=ext.end;return node};Cola.Constructions.IsSet=function(node,ext){return this.setPos(new Cola.AST_UnaryPrefix({expression:new Cola.AST_Binary({right:new Cola.AST_Binary({right:new Cola.AST_Null,operator:"===",left:node}),operator:"||",left:new Cola.AST_Binary({right:new Cola.AST_String({value:"undefined"}),operator:"===",left:new Cola.AST_UnaryPrefix({expression:node,operator:"typeof"})})}),operator:"!"}),ext)};Cola.Constructions.IsntSet=function(node,ext){return this.setPos(new Cola.AST_Binary({right:new Cola.AST_Binary({right:new Cola.AST_Null,operator:"===",left:node}),operator:"||",left:new Cola.AST_Binary({right:new Cola.AST_String({value:"undefined"}),operator:"===",left:new Cola.AST_UnaryPrefix({expression:node,operator:"typeof"})})}),ext) -};Cola.Constructions.SplatedConditional=function(name,uid,pos,after,length){if(Cola.$_cola_is(name,String))name=new Cola.AST_SymbolRef({name:name});return new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"<=",left:new Cola.AST_Number({value:length}),right:new Cola.AST_Dot({expression:name,property:"length"})}),consequent:new Cola.AST_Call({expression:new Cola.AST_Dot({property:"call",expression:new Cola.AST_Dot({property:"slice",expression:new Cola.AST_Array({elements:[]})})}),args:[name,new Cola.AST_Number({value:pos}),new Cola.AST_Assign({operator:"=",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:name}),right:new Cola.AST_Number({value:after})})})]}),alternative:new Cola.AST_Seq({car:new Cola.AST_Assign({operator:"=",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Number({value:pos})}),cdr:new Cola.AST_Array({elements:[]})})})};Cola.Constructions.ValueWithOffset=function(name,uid,cond,pos,after){if(Cola.$_cola_is(name,String))name=new Cola.AST_SymbolRef({name:name});return new Cola.AST_Sub({expression:name,property:cond?new Cola.AST_Number({value:pos}):new Cola.AST_Binary({operator:"+",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Number({value:after})})})};Cola.Constructions.ValueWithKey=function(cond,name,key){return cond?new Cola.AST_Dot({expression:name,property:key}):new Cola.AST_Sub({expression:name,property:new Cola.AST_String({value:key})})};Cola.Constructions.SplatedVarDef=function(name,pos,after,length){if(Cola.$_cola_is(name,String))name={name:name};return new Cola.AST_VarDef({type:"Array",name:new Cola.AST_SymbolVar(name),value:Cola.Constructions.SplatedConditional("arguments","_",pos,after,length)})};Cola.Constructions.PosedVarDef=function(name,type,pos,aftersplated){if(Cola.$_cola_is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated)})};Cola.Constructions.PosedWithDefsVarDef=function(name,type,defval,pos,aftersplated){if(Cola.$_cola_is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"!==",left:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated),right:new Cola.AST_SymbolRef({name:"undefined"})}),consequent:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated),alternative:defval})})};Cola.Constructions.NamedVarDef=function(name,type,defval,key){if(Cola.$_cola_is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"!==",left:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:key}),right:new Cola.AST_SymbolRef({name:"undefined"})}),consequent:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:key}),alternative:defval})})};Cola.AST_Toplevel.prototype.toJavaScript=function(options){if(this.language=="js")return this;this.language="js";options=Cola.defaults(options,{main_binding:true,main_event:"DOMContentLoaded",parser:{},std:true,path:""});var $_cola_ast=Cola.parse(Cola.$_cola,{is_js:true}),$_cola_hash={},_this,required=[],required_hash={},tt=new Cola.TreeTransformer(function(node,descend,in_list){var newNode,props={},parent=this.parent();node=node.clone();if(options.main_binding&&parent instanceof Cola.AST_Toplevel&&node instanceof Cola.AST_Defun&&node.name instanceof Cola.AST_SymbolDefun&&node.name.name=="main"){node.name=new Cola.AST_SymbolLambda(node.name);node=new Cola.AST_Function(node);props={args:[new Cola.AST_String({value:options.main_event}),node,new Cola.AST_False],expression:new Cola.AST_Dot({property:"addEventListener",expression:new Cola.AST_SymbolRef({name:"window"})})};node=new Cola.AST_SimpleStatement({start:node.start,end:node.left,body:new Cola.AST_Call(props)})}else if(node instanceof Cola.AST_Binary&&node.operator=="**"){props={start:node.start,end:node.left,args:[node.left,node.right],expression:new Cola.AST_Dot({property:"pow",expression:new Cola.AST_SymbolRef({name:"Math"})})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="%%"){$_cola_hash[Cola.$_cola_modulo.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"$_cola_modulo"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_SimpleStatement&&node.body instanceof Cola.AST_Assign&&node.body.operator=="?="){if(node.body.left instanceof Cola.AST_Sub&&node.body.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.body.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.body.left.property=new Cola.AST_Binary(props)}node.body.operator="=";node=new Cola.AST_If({start:node.start,end:node.end,body:node.clone(),condition:Cola.Constructions.IsntSet(node.body.left)})}else if(node instanceof Cola.AST_Assign&&node.operator=="?="){if(node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.left.property=new Cola.AST_Binary(props)}node.operator="=";node=new Cola.AST_Conditional({start:node.start,end:node.end,condition:Cola.Constructions.IsntSet(node.left),consequent:node.clone(),alternative:node.left})}else if(node instanceof Cola.AST_Conditional&&node.alternative instanceof Cola.AST_Noop){node.alternative=node.consequent;node.consequent=node.condition;node.condition=Cola.Constructions.IsSet(node.condition)}else if(node instanceof Cola.AST_Binary&&node.operator=="is"&&node.right instanceof Cola.AST_SymbolRef&&node.right.name=="NaN"){props={start:node.start,end:node.end,args:[node.left],expression:new Cola.AST_SymbolRef({name:"isNaN"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="isnt"&&node.right instanceof Cola.AST_SymbolRef&&node.right.name=="NaN"){props={args:[node.left],expression:new Cola.AST_SymbolRef({name:"isNaN"})};props={start:node.start,end:node.end,operator:"!",expression:new Cola.AST_Call(props)};node=new Cola.AST_UnaryPrefix(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="is"){$_cola_hash[Cola.$_cola_is.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"$_cola_is"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="isnt"){$_cola_hash[Cola.$_cola_isnt.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"$_cola_isnt"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_UnaryPrefix&&node.operator=="isset"){node=Cola.Constructions.IsSet(node.expression,node)}else if(node instanceof Cola.AST_UnaryPrefix&&node.operator=="clone"){$_cola_hash[Cola.$_cola_clone.i]=true;props={start:node.start,end:node.end,args:[node.expression],expression:new Cola.AST_SymbolRef({name:"$_cola_clone"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator=="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"push",expression:node.left.expression};props={start:node.start,end:node.end,args:[node.right],expression:new Cola.AST_Dot(props)};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator!="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.left.property=new Cola.AST_Binary(props)}else if(node instanceof Cola.AST_Sub&&node.property instanceof Cola.AST_Noop){$_cola_hash[Cola.$_cola_array_last.i]=true;props={start:node.start,end:node.end,args:[node.expression],expression:new Cola.AST_SymbolRef({name:"$_cola_array_last"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator=="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_ArrayRange){$_cola_hash[Cola.$_cola_array_asplice.i]=true;props={start:node.start,end:node.end,args:[node.left.expression,node.left.property.from,node.left.property.to,node.right],expression:new Cola.AST_SymbolRef({name:"$_cola_array_asplice"})};if(node.left.property.to instanceof Cola.AST_Noop)props.args[2]=new Cola.AST_Number({value:"9e9"});else if(node.left.property.triple)props.args[2]=new Cola.AST_Binary({operator:"-",left:node.left.property.to,right:new Cola.AST_Number({value:1})});node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Sub&&node.property instanceof Cola.AST_ArrayRange){props={property:"slice",expression:node.expression};props={start:node.start,end:node.end,args:[node.property.from],expression:new Cola.AST_Dot(props)};if(!node.property.triple&&!(node.property.to instanceof Cola.AST_Noop))props.args[1]=new Cola.AST_Binary({operator:"+",left:node.property.to,right:new Cola.AST_Number({value:1})});else if(!(node.property.to instanceof Cola.AST_Noop))props.args[1]=node.property.to;node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_ArrayRange){$_cola_hash[Cola.$_cola_array_range.i]=true;props={start:node.start,end:node.end,args:[node.from,node.to],expression:new Cola.AST_SymbolRef({name:"$_cola_array_range"})};if(node.triple)props.args[1]=new Cola.AST_Binary({operator:"-",left:node.to,right:new Cola.AST_Number({value:1})});node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Call){props={properties:[]};var delQueue=[];node.args.forEach(function(val,i){if(!(val instanceof Cola.AST_Namedarg))return;$_cola_hash[Cola.$_cola_func_named_args.i]=true;delQueue.push(i);props.properties.push(new Cola.AST_ObjectKeyVal({start:val.start,end:val.end,key:val.name,value:val.value}))});if(delQueue.length!=0){delQueue.reverse().forEach(function(val){node.args.splice(val,1)});props={start:node.start,end:node.end,args:[new Cola.AST_Object(props)],expression:new Cola.AST_SymbolRef({name:"$_cola_func_named_args"})};node.args.push(new Cola.AST_New(props))}}else if((node instanceof Cola.AST_Function||node instanceof Cola.AST_Defun)&&node.argnames.length!=0){var posed=[],named=[],onfront=true,delQueue=[],pos=0,splated,aftersplated=-1;node.argnames.forEach(function(val,i){if(val.argtype=="positional"){if(val.defval instanceof Cola.AST_Noop&&onfront)pos++,node.argnames[i]=val.name;else{onfront=false;delQueue.push(i);posed.push({pos:pos++,val:val})}splated&&splated.after++}else if(val.argtype=="named"){delQueue.push(i);named.push(val)}else if(val.argtype=="splated"){onfront=false;delQueue.push(i);posed.push(splated={pos:pos++,after:0,val:val})}});if(delQueue.length!=0)delQueue.reverse().forEach(function(val){node.argnames.splice(val,1)});props={type:"dynamic",definitions:[]};posed.forEach(function(val,i){var pos=val.pos;val=val.val;if(val.argtype=="splated"){aftersplated=0;props.definitions.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola_i"}),value:null}));props.definitions.push(Cola.Constructions.SplatedVarDef(splated.val.name,splated.pos,splated.after,splated.pos+splated.after+1))}else if(val.defval instanceof Cola.AST_Noop)props.definitions.push(Cola.Constructions.PosedVarDef(val.name,val.type,pos,aftersplated++));else props.definitions.push(Cola.Constructions.PosedWithDefsVarDef(val.name,val.type,val.defval,pos,aftersplated++))});named.forEach(function(val,i){if(val.defval instanceof Cola.AST_Noop)props.definitions.push(new Cola.AST_VarDef({type:val.type,name:new Cola.AST_SymbolVar(val.name),value:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:val.name.name})}));else props.definitions.push(Cola.Constructions.NamedVarDef(val.name,val.type,val.defval,val.name.name))});if(delQueue.length!=0||named.length!=0)node.body.unshift(new Cola.AST_Var(props));if(named.length!=0){$_cola_hash[Cola.$_cola_func_named_args.i]=true;$_cola_hash[Cola.$_cola_func_set_named_args.i]=true;node.body.unshift(new Cola.AST_SimpleStatement({body:new Cola.AST_Call({args:[new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_SymbolRef({name:"$_cola_func_set_named_args"})})}))}}else if(node instanceof Cola.AST_Cascade){$_cola_hash[Cola.$_cola_arguments_def.i]=true;props={type:"dynamic",body:[],argnames:[new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"$_cola_expr",start:node.expression.start,end:node.expression.end})}),new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"arguments",start:new Cola.AST_Token,end:new Cola.AST_Token})})]};var Expr,Parent=false;node.subexpressions.forEach(function(expr){Expr=expr,Parent=false;while(true)if(expr instanceof Cola.AST_Call||expr instanceof Cola.AST_Dot||expr instanceof Cola.AST_Sub||expr instanceof Cola.AST_Cascade){Parent=expr;expr=expr.expression}else if(expr instanceof Cola.AST_Binary){Parent=expr;expr=expr.left}else if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange||expr instanceof Cola.AST_SymbolRef)break;if(!Parent){if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange)Expr=new Cola.AST_Sub({start:Expr.start,end:Expr.end,expression:new Cola.AST_SymbolRef({name:"$_cola_expr"}),property:expr instanceof Cola.AST_ArrayRange?expr:expr.elements.length==0?new Cola.AST_Noop:expr.elements[0]});else if(expr instanceof Cola.AST_SymbolRef)Expr=new Cola.AST_Dot({start:Expr.start,end:Expr.end,expression:new Cola.AST_SymbolRef({name:"$_cola_expr"}),property:Expr.name})}else{if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange)expr=new Cola.AST_Sub({start:expr.start,end:expr.end,expression:new Cola.AST_SymbolRef({name:"$_cola_expr"}),property:expr instanceof Cola.AST_ArrayRange?expr:expr.elements.length==0?new Cola.AST_Noop:expr.elements[0]});else expr=new Cola.AST_Dot({start:expr.start,end:expr.end,expression:new Cola.AST_SymbolRef({name:"$_cola_expr"}),property:expr.name});if(Parent instanceof Cola.AST_Call||Parent instanceof Cola.AST_Dot||Parent instanceof Cola.AST_Sub||Parent instanceof Cola.AST_Cascade)Parent.expression=expr;else if(Parent instanceof Cola.AST_Binary)Parent.left=expr}props.body.push(new Cola.AST_SimpleStatement({start:Expr.start,end:Expr.end,body:Expr}))});props.body.push(new Cola.AST_Return({value:new Cola.AST_SymbolRef({name:"$_cola_expr"})}));props={expression:new Cola.AST_Function(props),property:"call"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),node.expression,new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node.body instanceof Cola.AST_Assign&&(node.body.left instanceof Cola.AST_ArrayTemplate||node.body.left instanceof Cola.AST_ObjectTemplate||(node.body.left instanceof Cola.AST_Array||node.body.left instanceof Cola.AST_Object)&&node.body.left.template)&&node instanceof Cola.AST_SimpleStatement){if(node.body.left.vardef&&node.body.operator!="=")Cola.Parser.prototype.unexpected.call(Cola.Parser.prototype,node.body.left.start);node=node.body;var defs=[];var Symbol=node.right instanceof Cola.AST_SymbolRef?node.right:new Cola.AST_SymbolRef({name:"$_cola_tmp"});if(!(node.right instanceof Cola.AST_SymbolRef))defs.push(new Cola.AST_VarDef({type:"dynamic",name:new Cola.AST_SymbolVar(Symbol),value:node.right}));(function _rec(def,symbol,uid){var skiped=false,k=0,is_arrayt=def instanceof Cola.AST_Array||def instanceof Cola.AST_ArrayTemplate,_=is_arrayt?def.elements:def.properties;_.forEach(is_arrayt?function(el,j){if(el instanceof Cola.AST_VarDef&&el.name.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.name.splated=undefined;el.value=Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length);defs.push(el)}else if((el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)&&el.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.splated=undefined;defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length)}))}else if(el instanceof Cola.AST_VarDef){el.value=Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++);defs.push(el)}else if(el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++)}));else if(el instanceof Cola.AST_Noop){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:symbol}),right:new Cola.AST_Number({value:_.length-1-j})})}))}else if(el instanceof Cola.AST_Hole||el instanceof Cola.AST_ArrayTemplate&&el.elements.length==0||el instanceof Cola.AST_ObjectTemplate&&el.properties.length==0)k++;else _rec(el,Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++),uid+"_")}:function(el,j){if(el.type&&(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Noop&&el.start.type=="name"))defs.push(new Cola.AST_VarDef({start:node.start,end:node.end,type:el.type,name:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolVar({name:el.key}):new Cola.AST_SymbolVar(el.value),value:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else if(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Sub||el.value instanceof Cola.AST_Dot||el.value instanceof Cola.AST_Noop&&el.start.type=="name")defs.push(new Cola.AST_Assign({operator:node.operator,left:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolRef({name:el.key}):el.value,right:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else _rec(el.value,Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key),uid+"_")})})(node.left,Symbol,"_");if(defs.length==0)return node;node=[];var sdef,sdefs=[],prev=defs[0].CTOR;defs.forEach(function _(def,i){sdef=false;if(def instanceof prev)sdefs.push(def);else{if(prev==Cola.AST_VarDef)sdef=new Cola.AST_Var({type:"dynamic",definitions:sdefs});else if(sdefs.length==1)sdef=sdefs[0];else{sdefs.reverse().forEach(function(def){if(!sdef)sdef=def;else sdef=new Cola.AST_Seq({car:def,cdr:sdef})})}node.push(!(sdef instanceof Cola.AST_Var)?new Cola.AST_SimpleStatement({body:sdef}):sdef);prev=def.CTOR;sdefs=[def]}if(i==defs.length-1)_(false)})}else if(node instanceof Cola.AST_Assign&&(node.left instanceof Cola.AST_ArrayTemplate||node.left instanceof Cola.AST_ObjectTemplate||(node.left instanceof Cola.AST_Array||node.left instanceof Cola.AST_Object)&&node.left.template)){if(node.left.vardef)Cola.Parser.prototype.unexpected.call(Cola.Parser.prototype,node.start);$_cola_hash[Cola.$_cola_arguments_def.i]=true;var defs=[];var Symbol=new Cola.AST_SymbolRef({name:"$_cola_expr"});(function _rec(def,symbol,uid){var skiped=false,k=0,is_arrayt=def instanceof Cola.AST_Array||def instanceof Cola.AST_ArrayTemplate,_=is_arrayt?def.elements:def.properties;_.forEach(is_arrayt?function(el,j){if((el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)&&el.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.splated=undefined;defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length)}))}else if(el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++)}));else if(el instanceof Cola.AST_Noop){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:symbol}),right:new Cola.AST_Number({value:_.length-1-j})})}))}else if(el instanceof Cola.AST_Hole||el instanceof Cola.AST_ArrayTemplate&&el.elements.length==0||el instanceof Cola.AST_ObjectTemplate&&el.properties.length==0)k++;else _rec(el,Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++),uid+"_")}:function(el,j){if(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Sub||el.value instanceof Cola.AST_Dot||el.value instanceof Cola.AST_Noop&&el.start.type=="name")defs.push(new Cola.AST_Assign({operator:node.operator,left:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolRef({name:el.key}):el.value,right:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else _rec(el.value,Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key),uid+"_")})})(node.left,Symbol,"_");if(defs.length==0)return node;props={type:"dynamic",body:[],argnames:[new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"$_cola_expr",start:node.right.start,end:node.right.end})}),new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"arguments"})})]};var sdef,sdefs=[],prev=defs[0].CTOR;defs.forEach(function _(def,i){sdef=false;if(def instanceof prev)sdefs.push(def);else{if(prev==Cola.AST_VarDef)sdef=new Cola.AST_Var({type:"dynamic",definitions:sdefs});else if(sdefs.length==1)sdef=sdefs[0];else{sdefs.reverse().forEach(function(def){if(!sdef)sdef=def;else sdef=new Cola.AST_Seq({car:def,cdr:sdef})})}props.body.push(!(sdef instanceof Cola.AST_Var)?new Cola.AST_SimpleStatement({body:sdef}):sdef);prev=def.CTOR;sdefs=[def]}if(i==defs.length-1)_(false)});props.body.push(new Cola.AST_Return({value:new Cola.AST_SymbolRef({name:"$_cola_expr"})}));props={expression:new Cola.AST_Function(props),property:"call"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),node.right,new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_If&&node.inline&&!(parent instanceof Cola.AST_If&&parent.inline)){$_cola_hash[Cola.$_cola_arguments_def.i]=true;var s=node;while(true){s.inline=false;s.body=new Cola.AST_Return({value:s.body});if(s.alternative instanceof Cola.AST_If)s=s.alternative;else if(s.alternative==null)break;else{s.alternative=new Cola.AST_Return({value:s.alternative});break}}props={expression:new Cola.AST_Function({type:"dynamic",body:[node],argnames:[]}),property:"apply"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_Switch&&!(parent instanceof Cola.AST_Block)){$_cola_hash[Cola.$_cola_arguments_def.i]=true;node.body.forEach(function(branch){if(!branch.body.length)return;branch.body[0]=new Cola.AST_Return({value:branch.body[0].body})});props={expression:new Cola.AST_Function({type:"dynamic",body:[node],argnames:[]}),property:"apply"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_Switch&&node.expression instanceof Cola.AST_Noop){node.expression=new Cola.AST_False;node.body.forEach(function(branch){if(branch instanceof Cola.AST_Default)return;if(branch.expression instanceof Cola.AST_Seq){var seq=branch.expression;while(true){seq.car=new Cola.AST_UnaryPrefix({operator:"!",expression:seq.car});if(seq.cdr instanceof Cola.AST_Seq)seq=seq.cdr;else{seq.cdr=new Cola.AST_UnaryPrefix({operator:"!",expression:seq.cdr});break}}return}branch.expression=new Cola.AST_UnaryPrefix({operator:"!",expression:branch.expression})})}else if(node instanceof Cola.AST_When){node=new Cola.AST_Case(node);node.body.push(new Cola.AST_Break)}else if(node instanceof Cola.AST_SwitchBranch&&!(node instanceof Cola.AST_Default)&&node.expression instanceof Cola.AST_Seq){var branches=[],seq=node.expression;while(true){branches.push(new node.CTOR({expression:seq.car,body:[]}));if(seq.cdr instanceof Cola.AST_Seq)seq=seq.cdr;else{node.expression=seq.cdr;branches.push(node);break}}node=branches}else if(node instanceof Cola.AST_Proto){props=new Cola.AST_Dot(node);props.expression=new Cola.AST_Dot(node);props.expression.property="prototype";node=props}else if(node instanceof Cola.AST_StringTemplate){newNode=new Cola.AST_Binary({operator:"+",left:node.body[0],right:node.body[1]});for(var i=2;i=_to;i--)range.push(i);return range};Cola.$_cola_array_range.i=7;Cola.$_cola_array_asplice=function $_cola_array_asplice(_array,_from,_to,_a){_to=_to-_from+1;return[].splice.apply(_array,[_from,_to].concat(_a)),_a};Cola.$_cola_array_asplice.i=8;Cola.$_cola_func_named_args=function $_cola_func_named_args(_args){this.$=_args};Cola.$_cola_func_named_args.i=9;Cola.$_cola_func_set_named_args=function $_cola_func_set_named_args(_args){if(_args[_args.length-1]instanceof $_cola_func_named_args){var nargs=_args[_args.length-1].$;for(var i in nargs)if(nargs.hasOwnProperty(i))_args[i]=nargs[i]}};Cola.$_cola_func_set_named_args.i=10;Cola.$_cola_arguments_def={i:11};Cola.$_cola=Cola.$_cola_is+Cola.$_cola_isnt+Cola.$_cola_modulo+Cola.$_cola_isset+Cola.$_cola_isntset+Cola.$_cola_clone+Cola.$_cola_array_last+Cola.$_cola_array_range+Cola.$_cola_array_asplice+Cola.$_cola_func_named_args+Cola.$_cola_func_set_named_args+"var arguments;";Cola.Compressor.StdFuncs={$_cola_is:true,$_cola_isnt:true,$_cola_modulo:true,$_cola_isset:true,$_cola_isntset:true};window.addEventListener("load",Cola.bootstrap,false); \ No newline at end of file +return true}}));hoist_vars=hoist_vars&&var_decl>1;var tt=new Cola.TreeTransformer(function before(node){if(node!==self){if(node instanceof Cola.AST_Directive){dirs.push(node);return make_node(Cola.AST_EmptyStatement,node)}if(node instanceof Cola.AST_Defun&&hoist_funs){hoisted.push(node);return make_node(Cola.AST_EmptyStatement,node)}if(node instanceof Cola.AST_Var&&hoist_vars){node.definitions.forEach(function(def){vars.set(def.name.name,def);++vars_found});var seq=node.to_assignments();var p=tt.parent();if(p instanceof Cola.AST_ForIn&&p.init===node){if(seq==null)return node.definitions[0].name;return seq}if(p instanceof Cola.AST_For&&p.init===node){return seq}if(!seq)return make_node(Cola.AST_EmptyStatement,node);return make_node(Cola.AST_SimpleStatement,node,{body:seq})}if(node instanceof Cola.AST_Scope)return node}});self=self.transform(tt);if(vars_found>0){var defs=[];vars.each(function(def,name){if(self instanceof Cola.AST_Lambda&&Cola.find_if(function(x){return x.name==def.name.name},self.argnames)){vars.del(name)}else{def=def.clone();def.value=null;defs.push(def);vars.set(name,def)}});if(defs.length>0){for(var i=0;i1){if(cond[1]){return make_node(Cola.AST_For,self,{body:self.body})}else if(self instanceof Cola.AST_While){if(compressor.option("dead_code")){var a=[];extract_declarations_from_unreachable_code(compressor,self.body,a);return make_node(Cola.AST_BlockStatement,self,{body:a})}}}return self});function if_break_in_loop(self,compressor){function drop_it(rest){rest=as_statement_array(rest);if(self.body instanceof Cola.AST_BlockStatement){self.body=self.body.clone();self.body.body=rest.concat(self.body.body.slice(1));self.body=self.body.transform(compressor)}else{self.body=make_node(Cola.AST_BlockStatement,self.body,{body:rest}).transform(compressor)}if_break_in_loop(self,compressor)}var first=self.body instanceof Cola.AST_BlockStatement?self.body.body[0]:self.body;if(first instanceof Cola.AST_If){if(first.body instanceof Cola.AST_Break&&compressor.loopcontrol_target(first.body.label)===self){if(self.condition){self.condition=make_node(Cola.AST_Binary,self.condition,{left:self.condition,operator:"&&",right:first.condition.negate(compressor)})}else{self.condition=first.condition.negate(compressor)}drop_it(first.alternative)}else if(first.alternative instanceof Cola.AST_Break&&compressor.loopcontrol_target(first.alternative.label)===self){if(self.condition){self.condition=make_node(Cola.AST_Binary,self.condition,{left:self.condition,operator:"&&",right:first.condition})}else{self.condition=first.condition}drop_it(first.body)}}}OPT(Cola.AST_While,function(self,compressor){if(!compressor.option("loops"))return self;self=Cola.AST_DWLoop.prototype.optimize.call(self,compressor);if(self instanceof Cola.AST_While){if_break_in_loop(self,compressor);self=make_node(Cola.AST_For,self,self).transform(compressor)}return self});OPT(Cola.AST_For,function(self,compressor){var cond=self.condition;if(cond){cond=cond.evaluate(compressor);self.condition=cond[0]}if(!compressor.option("loops"))return self;if(cond){if(cond.length>1&&!cond[1]){if(compressor.option("dead_code")){var a=[];if(self.init instanceof Cola.AST_Statement){a.push(self.init)}else if(self.init){a.push(make_node(Cola.AST_SimpleStatement,self.init,{body:self.init}))}extract_declarations_from_unreachable_code(compressor,self.body,a);return make_node(Cola.AST_BlockStatement,self,{body:a})}}}if_break_in_loop(self,compressor);return self});OPT(Cola.AST_If,function(self,compressor){if(!compressor.option("conditionals"))return self;var cond=self.condition.evaluate(compressor);self.condition=cond[0];if(cond.length>1){if(cond[1]){compressor.warn("Condition always true [{file}:{line},{col}]",self.condition.start);if(compressor.option("dead_code")){var a=[];if(self.alternative){extract_declarations_from_unreachable_code(compressor,self.alternative,a)}a.push(self.body);return make_node(Cola.AST_BlockStatement,self,{body:a}).transform(compressor)}}else{compressor.warn("Condition always false [{file}:{line},{col}]",self.condition.start);if(compressor.option("dead_code")){var a=[];extract_declarations_from_unreachable_code(compressor,self.body,a);if(self.alternative)a.push(self.alternative);return make_node(Cola.AST_BlockStatement,self,{body:a}).transform(compressor)}}}if(is_empty(self.alternative))self.alternative=null;var negated=self.condition.negate(compressor);var negated_is_best=best_of(self.condition,negated)===negated;if(self.alternative&&negated_is_best){negated_is_best=false;self.condition=negated;var tmp=self.body;self.body=self.alternative||make_node(Cola.AST_EmptyStatement);self.alternative=tmp}if(is_empty(self.body)&&is_empty(self.alternative)){return make_node(Cola.AST_SimpleStatement,self.condition,{body:self.condition}).transform(compressor)}if(self.body instanceof Cola.AST_SimpleStatement&&self.alternative instanceof Cola.AST_SimpleStatement){return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:self.body.body,alternative:self.alternative.body})}).transform(compressor)}if(is_empty(self.alternative)&&self.body instanceof Cola.AST_SimpleStatement){if(negated_is_best)return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"||",left:negated,right:self.body.body})}).transform(compressor);return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"&&",left:self.condition,right:self.body.body})}).transform(compressor)}if(self.body instanceof Cola.AST_EmptyStatement&&self.alternative&&self.alternative instanceof Cola.AST_SimpleStatement){return make_node(Cola.AST_SimpleStatement,self,{body:make_node(Cola.AST_Binary,self,{operator:"||",left:self.condition,right:self.alternative.body})}).transform(compressor)}if(self.body instanceof Cola.AST_Exit&&self.alternative instanceof Cola.AST_Exit&&self.body.TYPE==self.alternative.TYPE){return make_node(self.body.CTOR,self,{value:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:self.body.value||make_node(Cola.AST_Undefined,self.body).optimize(compressor),alternative:self.alternative.value||make_node(Cola.AST_Undefined,self.alternative).optimize(compressor)})}).transform(compressor)}if(self.body instanceof Cola.AST_If&&!self.body.alternative&&!self.alternative){self.condition=make_node(Cola.AST_Binary,self.condition,{operator:"&&",left:self.condition,right:self.body.condition}).transform(compressor);self.body=self.body.body}if(aborts(self.body)){if(self.alternative){var alt=self.alternative;self.alternative=null;return make_node(Cola.AST_BlockStatement,self,{body:[self,alt]}).transform(compressor)}}if(aborts(self.alternative)){var body=self.body;self.body=self.alternative;self.condition=negated_is_best?negated:self.condition.negate(compressor);self.alternative=null;return make_node(Cola.AST_BlockStatement,self,{body:[self,body]}).transform(compressor)}return self});OPT(Cola.AST_Switch,function(self,compressor){if(self.body.length==0&&compressor.option("conditionals")){return make_node(Cola.AST_SimpleStatement,self,{body:self.expression}).transform(compressor)}for(;;){var last_branch=self.body[self.body.length-1];if(last_branch){var stat=last_branch.body[last_branch.body.length-1];if(stat instanceof Cola.AST_Break&&loop_body(compressor.loopcontrol_target(stat.label))===self)last_branch.body.pop();if(last_branch instanceof Cola.AST_Default&&last_branch.body.length==0){self.body.pop();continue}}break}var exp=self.expression.evaluate(compressor);out:if(exp.length==2)try{self.expression=exp[0];if(!compressor.option("dead_code"))break out;var value=exp[1];var in_if=false;var in_block=false;var started=false;var stopped=false;var ruined=false;var tt=new Cola.TreeTransformer(function(node,descend,in_list){if(node instanceof Cola.AST_Lambda||node instanceof Cola.AST_SimpleStatement){return node}else if(node instanceof Cola.AST_Switch&&node===self){node=node.clone();descend(node,this);return ruined?node:make_node(Cola.AST_BlockStatement,node,{body:node.body.reduce(function(a,branch){return a.concat(branch.body)},[])}).transform(compressor)}else if(node instanceof Cola.AST_If||node instanceof Cola.AST_Try){var save=in_if;in_if=!in_block;descend(node,this);in_if=save;return node}else if(node instanceof Cola.AST_StatementWithBody||node instanceof Cola.AST_Switch){var save=in_block;in_block=true;descend(node,this);in_block=save;return node}else if(node instanceof Cola.AST_Break&&this.loopcontrol_target(node.label)===self){if(in_if){ruined=true;return node}if(in_block)return node;stopped=true;return in_list?Cola.MAP.skip:make_node(Cola.AST_EmptyStatement,node)}else if(node instanceof Cola.AST_SwitchBranch&&this.parent()===self){if(stopped)return Cola.MAP.skip;if(node instanceof Cola.AST_Case){var exp=node.expression.evaluate(compressor);if(exp.length<2){throw self}if(exp[1]===value||started){started=true;if(aborts(node))stopped=true;descend(node,this);return node}return Cola.MAP.skip}descend(node,this);return node}});tt.stack=compressor.stack.slice();self=self.transform(tt)}catch(ex){if(ex!==self)throw ex}return self});OPT(Cola.AST_Case,function(self,compressor){self.body=tighten_body(self.body,compressor);return self});OPT(Cola.AST_Try,function(self,compressor){self.body=tighten_body(self.body,compressor);return self});Cola.AST_Definitions.DEFMETHOD("remove_initializers",function(){this.definitions.forEach(function(def){def.value=null})});Cola.AST_Definitions.DEFMETHOD("to_assignments",function(){var assignments=this.definitions.reduce(function(a,def){if(def.value){var name=make_node(Cola.AST_SymbolRef,def.name,def.name);a.push(make_node(Cola.AST_Assign,def,{operator:"=",left:name,right:def.value}))}return a},[]);if(assignments.length==0)return null;return Cola.AST_Seq.from_array(assignments)});OPT(Cola.AST_Definitions,function(self,compressor){if(self.definitions.length==0)return make_node(Cola.AST_EmptyStatement,self);return self});OPT(Cola.AST_Function,function(self,compressor){self=Cola.AST_Lambda.prototype.optimize.call(self,compressor);if(compressor.option("unused")){if(self.name&&self.name.unreferenced()){self.name=null}}return self});OPT(Cola.AST_Call,function(self,compressor){if(compressor.option("evaluate")){if(self.expression instanceof Cola.AST_Dot&&Cola.Compressor.MathFuncs[self.expression.property]&&self.expression.expression instanceof Cola.AST_SymbolRef&&self.expression.expression.name=="Math"){var args=[],allstatic=true,val;self.args.some(function(arg){if(arg instanceof Cola.AST_Constant)args.push(arg.value);else return!(allstatic=false)});if(allstatic){val=Math[self.expression.property].apply({},args);if((""+val).length<=15)return make_node(Cola.AST_Number,self,{value:val}).transform(compressor)}}else if(!compressor.option("is_js")&&self.expression instanceof Cola.AST_SymbolRef&&Cola.Compressor.StdFuncs[self.expression.name]&&self.args[0]instanceof Cola.AST_Constant){if(self.expression.name=="_ColaRuntime$isset"||self.expression.name=="_ColaRuntime$isntset")return make_node(Cola.AST_Boolean,self,{value:Cola[self.expression.name](self.args[0].value)}).transform(compressor);if((self.expression.name=="_ColaRuntime$is"||self.expression.name=="_ColaRuntime$isnt")&&self.args[1]instanceof Cola.AST_SymbolRef&&(self.args[1].value=="Number"||self.args[1].value=="Boolean"||self.args[1].value=="String"))return make_node(Cola.AST_Boolean,self,{value:Cola[self.expression.name](self.args[0].value,eval(self.args[1].value))}).transform(compressor);if(self.expression.name=="_ColaRuntime$modulo"&&self.args[1]instanceof Cola.AST_Constant)return make_node(Cola.AST_Number,self,{value:Cola._ColaRuntime$modulo(self.args[0].value,self.args[1].value)}).transform(compressor)}}if(compressor.option("unsafe")){var exp=self.expression;if(exp instanceof Cola.AST_SymbolRef&&exp.undeclared()){switch(exp.name){case"Array":if(self.args.length!=1){return make_node(Cola.AST_Array,self,{elements:self.args}).transform(compressor)}break;case"Object":if(self.args.length==0){return make_node(Cola.AST_Object,self,{properties:[]})}break;case"String":if(self.args.length==0)return make_node(Cola.AST_String,self,{value:""});if(self.args.length<=1)return make_node(Cola.AST_Binary,self,{left:self.args[0],operator:"+",right:make_node(Cola.AST_String,self,{value:""})}).transform(compressor);break;case"Number":if(self.args.length==0)return make_node(Cola.AST_Number,self,{value:0});if(self.args.length==1)return make_node(Cola.AST_UnaryPrefix,self,{expression:self.args[0],operator:"+"}).transform(compressor);case"Boolean":if(self.args.length==0)return make_node(Cola.AST_False,self);if(self.args.length==1)return make_node(Cola.AST_UnaryPrefix,self,{expression:make_node(Cola.AST_UnaryPrefix,null,{expression:self.args[0],operator:"!"}),operator:"!"}).transform(compressor);break;case"Function":if(Cola.all(self.args,function(x){return x instanceof Cola.AST_String})){try{var code="(function("+self.args.slice(0,-1).map(function(arg){return arg.value}).join(",")+"){"+self.args[self.args.length-1].value+"})()";var ast=Cola.parse(code);ast.figure_out_scope({screw_ie8:compressor.option("screw_ie8")});var comp=new Cola.Compressor(compressor.options);ast=ast.transform(comp);ast.figure_out_scope({screw_ie8:compressor.option("screw_ie8")});ast.mangle_names();var fun;try{ast.walk(new Cola.TreeWalker(function(node){if(node instanceof Cola.AST_Lambda){fun=node;throw ast}}))}catch(ex){if(ex!==ast)throw ex}var args=fun.argnames.map(function(arg,i){return make_node(Cola.AST_String,self.args[i],{value:arg.print_to_string()})});var code=new Cola.OutputStream;Cola.AST_BlockStatement.prototype._codegen.call(fun,fun,code);code=code.toString().replace(/^\{|\}$/g,"");args.push(make_node(Cola.AST_String,self.args[self.args.length-1],{value:code}));self.args=args;return self}catch(ex){if(ex instanceof Cola.JS_Parse_Error){compressor.warn("Error parsing code passed to new Function [{file}:{line},{col}]",self.args[self.args.length-1].start);compressor.warn(ex.toString())}else{console.log(ex);throw ex}}}break}}else if(exp instanceof Cola.AST_Dot&&exp.property=="toString"&&self.args.length==0){return make_node(Cola.AST_Binary,self,{left:make_node(Cola.AST_String,self,{value:""}),operator:"+",right:exp.expression}).transform(compressor)}else if(exp instanceof Cola.AST_Dot&&exp.expression instanceof Cola.AST_Array&&exp.property=="join")EXIT:{var separator=self.args.length==0?",":self.args[0].evaluate(compressor)[1];if(separator==null)break EXIT;var elements=exp.expression.elements.reduce(function(a,el){el=el.evaluate(compressor);if(a.length==0||el.length==1){a.push(el)}else{var last=a[a.length-1];if(last.length==2){var val=""+last[1]+separator+el[1];a[a.length-1]=[make_node_from_constant(compressor,val,last[0]),val]}else{a.push(el)}}return a},[]);if(elements.length==0)return make_node(Cola.AST_String,self,{value:""});if(elements.length==1)return elements[0][0];if(separator==""){var first;if(elements[0][0]instanceof Cola.AST_String||elements[1][0]instanceof Cola.AST_String){first=elements.shift()[0]}else{first=make_node(Cola.AST_String,self,{value:""})}return elements.reduce(function(prev,el){return make_node(Cola.AST_Binary,el[0],{operator:"+",left:prev,right:el[0]})},first).transform(compressor)}var node=self.clone();node.expression=node.expression.clone();node.expression.expression=node.expression.expression.clone();node.expression.expression.elements=elements.map(function(el){return el[0]});return best_of(self,node)}}if(compressor.option("side_effects")){if(self.expression instanceof Cola.AST_Function&&self.args.length==0&&!Cola.AST_Block.prototype.has_side_effects.call(self.expression,compressor)){return make_node(Cola.AST_Undefined,self).transform(compressor)}}if(compressor.option("drop_console")){if(self.expression instanceof Cola.AST_PropAccess&&self.expression.expression instanceof Cola.AST_SymbolRef&&self.expression.expression.name=="console"&&self.expression.expression.undeclared()){return make_node(Cola.AST_Undefined,self).transform(compressor)}}return self.evaluate(compressor)[0]});OPT(Cola.AST_New,function(self,compressor){if(compressor.option("unsafe")){var exp=self.expression;if(exp instanceof Cola.AST_SymbolRef&&exp.undeclared()){switch(exp.name){case"Object":case"RegExp":case"Function":case"Error":case"Array":return make_node(Cola.AST_Call,self,self).transform(compressor)}}}return self});OPT(Cola.AST_Seq,function(self,compressor){if(!compressor.option("side_effects"))return self;if(!self.car.has_side_effects(compressor)){var p;if(!(self.cdr instanceof Cola.AST_SymbolRef&&self.cdr.name=="eval"&&self.cdr.undeclared()&&(p=compressor.parent())instanceof Cola.AST_Call&&p.expression===self)){return self.cdr}}if(compressor.option("cascade")){if(self.car instanceof Cola.AST_Assign&&!self.car.left.has_side_effects(compressor)){if(self.car.left.equivalent_to(self.cdr)){return self.car}if(self.cdr instanceof Cola.AST_Call&&self.cdr.expression.equivalent_to(self.car.left)){self.cdr.expression=self.car;return self.cdr}}if(!self.car.has_side_effects(compressor)&&!self.cdr.has_side_effects(compressor)&&self.car.equivalent_to(self.cdr)){return self.car}}if(self.cdr instanceof Cola.AST_UnaryPrefix&&self.cdr.operator=="void"&&!self.cdr.expression.has_side_effects(compressor)){self.cdr.operator=self.car;return self.cdr}if(self.cdr instanceof Cola.AST_Undefined){return make_node(Cola.AST_UnaryPrefix,self,{operator:"void",expression:self.car})}return self});Cola.AST_Unary.DEFMETHOD("lift_sequences",function(compressor){if(compressor.option("sequences")){if(this.expression instanceof Cola.AST_Seq){var seq=this.expression;var x=seq.to_array();this.expression=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}}return this});OPT(Cola.AST_UnaryPostfix,function(self,compressor){return self.lift_sequences(compressor)});OPT(Cola.AST_UnaryPrefix,function(self,compressor){self=self.lift_sequences(compressor);var e=self.expression;if(compressor.option("booleans")&&compressor.in_boolean_context()){switch(self.operator){case"!":if(e instanceof Cola.AST_UnaryPrefix&&e.operator=="!"){return e.expression}break;case"typeof":compressor.warn("Boolean expression always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}if(e instanceof Cola.AST_Binary&&self.operator=="!"){self=best_of(self,e.negate(compressor))}}return self.evaluate(compressor)[0]});function has_side_effects_or_prop_access(node,compressor){var save_pure_getters=compressor.option("pure_getters");compressor.options.pure_getters=false;var ret=node.has_side_effects(compressor);compressor.options.pure_getters=save_pure_getters;return ret}Cola.AST_Binary.DEFMETHOD("lift_sequences",function(compressor){if(compressor.option("sequences")){if(this.left instanceof Cola.AST_Seq){var seq=this.left;var x=seq.to_array();this.left=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}if(this.right instanceof Cola.AST_Seq&&this instanceof Cola.AST_Assign&&!has_side_effects_or_prop_access(this.left,compressor)){var seq=this.right;var x=seq.to_array();this.right=x.pop();x.push(this);seq=Cola.AST_Seq.from_array(x).transform(compressor);return seq}}return this});var commutativeOperators=Cola.makePredicate("== === != !== * & | ^");OPT(Cola.AST_Binary,function(self,compressor){var reverse=compressor.has_directive("use asm")?Cola.noop:function(op,force){if(force||!(self.left.has_side_effects(compressor)||self.right.has_side_effects(compressor))){if(op)self.operator=op;var tmp=self.left;self.left=self.right;self.right=tmp}};if(commutativeOperators(self.operator)){if(self.right instanceof Cola.AST_Constant&&!(self.left instanceof Cola.AST_Constant)){if(!(self.left instanceof Cola.AST_Binary&&Cola.PRECEDENCE[self.left.operator]>=Cola.PRECEDENCE[self.operator])){reverse(null,true)}}if(/^[!=]==?$/.test(self.operator)){if(self.left instanceof Cola.AST_SymbolRef&&self.right instanceof Cola.AST_Conditional){if(self.right.consequent instanceof Cola.AST_SymbolRef&&self.right.consequent.definition()===self.left.definition()){if(/^==/.test(self.operator))return self.right.condition;if(/^!=/.test(self.operator))return self.right.condition.negate(compressor)}if(self.right.alternative instanceof Cola.AST_SymbolRef&&self.right.alternative.definition()===self.left.definition()){if(/^==/.test(self.operator))return self.right.condition.negate(compressor);if(/^!=/.test(self.operator))return self.right.condition}}if(self.right instanceof Cola.AST_SymbolRef&&self.left instanceof Cola.AST_Conditional){if(self.left.consequent instanceof Cola.AST_SymbolRef&&self.left.consequent.definition()===self.right.definition()){if(/^==/.test(self.operator))return self.left.condition;if(/^!=/.test(self.operator))return self.left.condition.negate(compressor)}if(self.left.alternative instanceof Cola.AST_SymbolRef&&self.left.alternative.definition()===self.right.definition()){if(/^==/.test(self.operator))return self.left.condition.negate(compressor);if(/^!=/.test(self.operator))return self.left.condition}}}}self=self.lift_sequences(compressor);if(compressor.option("comparisons"))switch(self.operator){case"===":case"!==":if(self.left.is_string(compressor)&&self.right.is_string(compressor)||self.left.is_boolean()&&self.right.is_boolean()){self.operator=self.operator.substr(0,2)}case"==":case"!=":if(self.left instanceof Cola.AST_String&&self.left.value=="undefined"&&self.right instanceof Cola.AST_UnaryPrefix&&self.right.operator=="typeof"&&compressor.option("unsafe")){if(!(self.right.expression instanceof Cola.AST_SymbolRef)||!self.right.expression.undeclared()){self.right=self.right.expression;self.left=make_node(Cola.AST_Undefined,self.left).optimize(compressor);if(self.operator.length==2)self.operator+="="}}break}if(compressor.option("booleans")&&compressor.in_boolean_context())switch(self.operator){case"&&":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&!ll[1]||rr.length>1&&!rr[1]){compressor.warn("Boolean && always false [{file}:{line},{col}]",self.start);return make_node(Cola.AST_False,self)}if(ll.length>1&&ll[1]){return rr[0]}if(rr.length>1&&rr[1]){return ll[0]}break;case"||":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&ll[1]||rr.length>1&&rr[1]){compressor.warn("Boolean || always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}if(ll.length>1&&!ll[1]){return rr[0]}if(rr.length>1&&!rr[1]){return ll[0]}break;case"+":var ll=self.left.evaluate(compressor);var rr=self.right.evaluate(compressor);if(ll.length>1&&ll[0]instanceof Cola.AST_String&&ll[1]||rr.length>1&&rr[0]instanceof Cola.AST_String&&rr[1]){compressor.warn("+ in boolean context always true [{file}:{line},{col}]",self.start);return make_node(Cola.AST_True,self)}break}if(compressor.option("comparisons")){if(!(compressor.parent()instanceof Cola.AST_Binary)||compressor.parent()instanceof Cola.AST_Assign){var negated=make_node(Cola.AST_UnaryPrefix,self,{operator:"!",expression:self.negate(compressor)});self=best_of(self,negated)}switch(self.operator){case"<":reverse(">");break;case"<=":reverse(">=");break}}if(self.operator=="+"&&self.right instanceof Cola.AST_String&&self.right.getValue()===""&&self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.is_string(compressor)){return self.left}if(compressor.option("evaluate")){if(self.operator=="+"){if(self.left instanceof Cola.AST_Constant&&self.right instanceof Cola.AST_Binary&&self.right.operator=="+"&&self.right.left instanceof Cola.AST_Constant&&self.right.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:make_node(Cola.AST_String,null,{value:""+self.left.getValue()+self.right.left.getValue(),start:self.left.start,end:self.right.left.end}),right:self.right.right})}if(self.right instanceof Cola.AST_Constant&&self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.right instanceof Cola.AST_Constant&&self.left.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:self.left.left,right:make_node(Cola.AST_String,null,{value:""+self.left.right.getValue()+self.right.getValue(),start:self.left.right.start,end:self.right.end})})}if(self.left instanceof Cola.AST_Binary&&self.left.operator=="+"&&self.left.is_string(compressor)&&self.left.right instanceof Cola.AST_Constant&&self.right instanceof Cola.AST_Binary&&self.right.operator=="+"&&self.right.left instanceof Cola.AST_Constant&&self.right.is_string(compressor)){self=make_node(Cola.AST_Binary,self,{operator:"+",left:make_node(Cola.AST_Binary,self.left,{operator:"+",left:self.left.left,right:make_node(Cola.AST_String,null,{value:""+self.left.right.getValue()+self.right.left.getValue(),start:self.left.right.start,end:self.right.left.end})}),right:self.right.right})}}}if(self.right instanceof Cola.AST_Binary&&self.right.operator==self.operator&&(self.operator=="*"||self.operator=="&&"||self.operator=="||")){self.left=make_node(Cola.AST_Binary,self.left,{operator:self.operator,left:self.left,right:self.right.left});self.right=self.right.right;return self.transform(compressor)}return self.evaluate(compressor)[0]});OPT(Cola.AST_SymbolRef,function(self,compressor){if(self.undeclared()){var defines=compressor.option("global_defs");if(defines&&defines.hasOwnProperty(self.name)){return make_node_from_constant(compressor,defines[self.name],self)}switch(self.name){case"undefined":return make_node(Cola.AST_Undefined,self);case"NaN":return make_node(Cola.AST_NaN,self);case"Infinity":return make_node(Cola.AST_Infinity,self)}}return self});OPT(Cola.AST_Undefined,function(self,compressor){if(compressor.option("unsafe")){var scope=compressor.find_parent(Cola.AST_Scope);var undef=scope.find_variable("undefined");if(undef){var ref=make_node(Cola.AST_SymbolRef,self,{name:"undefined",scope:scope,thedef:undef});ref.reference();return ref}}return self});var ASSIGN_OPS=["+","-","/","*","%",">>","<<",">>>","|","^","&"];OPT(Cola.AST_Assign,function(self,compressor){self=self.lift_sequences(compressor);if(self.operator=="="&&self.left instanceof Cola.AST_SymbolRef&&self.right instanceof Cola.AST_Binary&&self.right.left instanceof Cola.AST_SymbolRef&&self.right.left.name==self.left.name&&Cola.member(self.right.operator,ASSIGN_OPS)){self.operator=self.right.operator+"=";self.right=self.right.right}return self});OPT(Cola.AST_Conditional,function(self,compressor){if(!compressor.option("conditionals"))return self;if(self.condition instanceof Cola.AST_Seq){var car=self.condition.car;self.condition=self.condition.cdr;return Cola.AST_Seq.cons(car,self)}var cond=self.condition.evaluate(compressor);if(cond.length>1){if(cond[1]){compressor.warn("Condition always true [{file}:{line},{col}]",self.start);return self.consequent}else{compressor.warn("Condition always false [{file}:{line},{col}]",self.start);return self.alternative}}var negated=cond[0].negate(compressor);if(best_of(cond[0],negated)===negated){self=make_node(Cola.AST_Conditional,self,{condition:negated,consequent:self.alternative,alternative:self.consequent})}var consequent=self.consequent;var alternative=self.alternative;if(consequent instanceof Cola.AST_Assign&&alternative instanceof Cola.AST_Assign&&consequent.operator==alternative.operator&&consequent.left.equivalent_to(alternative.left)){return make_node(Cola.AST_Assign,self,{operator:consequent.operator,left:consequent.left,right:make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:consequent.right,alternative:alternative.right})})}if(consequent instanceof Cola.AST_Call&&alternative.TYPE===consequent.TYPE&&consequent.args.length==alternative.args.length&&consequent.expression.equivalent_to(alternative.expression)){if(consequent.args.length==0){return make_node(Cola.AST_Seq,self,{car:self.condition,cdr:consequent})}if(consequent.args.length==1){consequent.args[0]=make_node(Cola.AST_Conditional,self,{condition:self.condition,consequent:consequent.args[0],alternative:alternative.args[0]});return consequent}}if(consequent instanceof Cola.AST_Conditional&&consequent.alternative.equivalent_to(alternative)){return make_node(Cola.AST_Conditional,self,{condition:make_node(Cola.AST_Binary,self,{left:self.condition,operator:"&&",right:consequent.condition}),consequent:consequent.consequent,alternative:alternative})}return self});OPT(Cola.AST_Boolean,function(self,compressor){if(compressor.option("booleans")){var p=compressor.parent();if(p instanceof Cola.AST_Binary&&(p.operator=="=="||p.operator=="!=")){compressor.warn("Non-strict equality against boolean: {operator} {value} [{file}:{line},{col}]",{operator:p.operator,value:self.value,file:p.start.file,line:p.start.line,col:p.start.col});return make_node(Cola.AST_Number,self,{value:+self.value})}return make_node(Cola.AST_UnaryPrefix,self,{operator:"!",expression:make_node(Cola.AST_Number,self,{value:1-self.value})})}return self});OPT(Cola.AST_Sub,function(self,compressor){var prop=self.property;if(prop instanceof Cola.AST_String&&compressor.option("properties")){prop=prop.getValue();if(Cola.RESERVED_WORDS(prop)?compressor.option("screw_ie8"):Cola.is_identifier_string(prop)){return make_node(Cola.AST_Dot,self,{expression:self.expression,property:prop})}var v=parseFloat(prop);if(!isNaN(v)&&v.toString()==prop){self.property=make_node(Cola.AST_Number,self.property,{value:v})}}return self});function literals_in_boolean_context(self,compressor){if(compressor.option("booleans")&&compressor.in_boolean_context()){return make_node(Cola.AST_True,self)}return self}OPT(Cola.AST_Array,literals_in_boolean_context);OPT(Cola.AST_Object,literals_in_boolean_context);OPT(Cola.AST_RegExp,literals_in_boolean_context)})();"use strict";!this.Cola&&(this.Cola={});Cola.Constructions={};Cola.Constructions.setPos=function(node,ext){if(!ext)return node;if(ext.start)node.start=ext.start;if(ext.end)node.end=ext.end;return node};Cola.Constructions.IsSet=function(node,ext){return this.setPos(new Cola.AST_UnaryPrefix({expression:new Cola.AST_Binary({right:new Cola.AST_Binary({right:new Cola.AST_Null,operator:"===",left:node}),operator:"||",left:new Cola.AST_Binary({right:new Cola.AST_String({value:"undefined"}),operator:"===",left:new Cola.AST_UnaryPrefix({expression:node,operator:"typeof"})})}),operator:"!"}),ext)};Cola.Constructions.IsntSet=function(node,ext){return this.setPos(new Cola.AST_Binary({right:new Cola.AST_Binary({right:new Cola.AST_Null,operator:"===",left:node}),operator:"||",left:new Cola.AST_Binary({right:new Cola.AST_String({value:"undefined"}),operator:"===",left:new Cola.AST_UnaryPrefix({expression:node,operator:"typeof"})})}),ext) +};Cola.Constructions.SplatedConditional=function(name,uid,pos,after,length){if(Cola._ColaRuntime$is(name,String))name=new Cola.AST_SymbolRef({name:name});return new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"<=",left:new Cola.AST_Number({value:length}),right:new Cola.AST_Dot({expression:name,property:"length"})}),consequent:new Cola.AST_Call({expression:new Cola.AST_Dot({property:"call",expression:new Cola.AST_Dot({property:"slice",expression:new Cola.AST_Array({elements:[]})})}),args:[name,new Cola.AST_Number({value:pos}),new Cola.AST_Assign({operator:"=",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:name}),right:new Cola.AST_Number({value:after})})})]}),alternative:new Cola.AST_Seq({car:new Cola.AST_Assign({operator:"=",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Number({value:pos})}),cdr:new Cola.AST_Array({elements:[]})})})};Cola.Constructions.ValueWithOffset=function(name,uid,cond,pos,after){if(Cola._ColaRuntime$is(name,String))name=new Cola.AST_SymbolRef({name:name});return new Cola.AST_Sub({expression:name,property:cond?new Cola.AST_Number({value:pos}):new Cola.AST_Binary({operator:"+",left:new Cola.AST_SymbolRef({name:"$_cola"+uid+"i"}),right:new Cola.AST_Number({value:after})})})};Cola.Constructions.ValueWithKey=function(cond,name,key){return cond?new Cola.AST_Dot({expression:name,property:key}):new Cola.AST_Sub({expression:name,property:new Cola.AST_String({value:key})})};Cola.Constructions.SplatedVarDef=function(name,pos,after,length){if(Cola._ColaRuntime$is(name,String))name={name:name};return new Cola.AST_VarDef({type:"Array",name:new Cola.AST_SymbolVar(name),value:Cola.Constructions.SplatedConditional("arguments","_",pos,after,length)})};Cola.Constructions.PosedVarDef=function(name,type,pos,aftersplated){if(Cola._ColaRuntime$is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated)})};Cola.Constructions.PosedWithDefsVarDef=function(name,type,defval,pos,aftersplated){if(Cola._ColaRuntime$is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"!==",left:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated),right:new Cola.AST_SymbolRef({name:"undefined"})}),consequent:Cola.Constructions.ValueWithOffset("arguments","_",aftersplated==-1,pos,aftersplated),alternative:defval})})};Cola.Constructions.NamedVarDef=function(name,type,defval,key){if(Cola._ColaRuntime$is(name,String))name={name:name};return new Cola.AST_VarDef({type:type,name:new Cola.AST_SymbolVar(name),value:new Cola.AST_Conditional({condition:new Cola.AST_Binary({operator:"!==",left:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:key}),right:new Cola.AST_SymbolRef({name:"undefined"})}),consequent:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:key}),alternative:defval})})};Cola.AST_Toplevel.prototype.toJavaScript=function(options){if(this.language=="js")return this;this.language="js";options=Cola.defaults(options,{main_binding:true,main_event:"DOMContentLoaded",parser:{},std:true,path:""});var _ColaRuntime$ast=Cola.parse(Cola.$_cola,{is_js:true}),_ColaRuntime$hash={},_this,required=[],required_hash={},tt=new Cola.TreeTransformer(function(node,descend,in_list){var newNode,props={},parent=this.parent();node=node.clone();if(options.main_binding&&parent instanceof Cola.AST_Toplevel&&node instanceof Cola.AST_Defun&&node.name instanceof Cola.AST_SymbolDefun&&node.name.name=="main"){node.name=new Cola.AST_SymbolLambda(node.name);node=new Cola.AST_Function(node);props={args:[new Cola.AST_String({value:options.main_event}),node,new Cola.AST_False],expression:new Cola.AST_Dot({property:"addEventListener",expression:new Cola.AST_SymbolRef({name:"window"})})};node=new Cola.AST_SimpleStatement({start:node.start,end:node.left,body:new Cola.AST_Call(props)})}else if(node instanceof Cola.AST_Binary&&node.operator=="**"){props={start:node.start,end:node.left,args:[node.left,node.right],expression:new Cola.AST_Dot({property:"pow",expression:new Cola.AST_SymbolRef({name:"Math"})})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="%%"){_ColaRuntime$hash[Cola._ColaRuntime$modulo.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$modulo"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_SimpleStatement&&node.body instanceof Cola.AST_Assign&&node.body.operator=="?="){if(node.body.left instanceof Cola.AST_Sub&&node.body.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.body.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.body.left.property=new Cola.AST_Binary(props)}node.body.operator="=";node=new Cola.AST_If({start:node.start,end:node.end,body:node.clone(),condition:Cola.Constructions.IsntSet(node.body.left)})}else if(node instanceof Cola.AST_Assign&&node.operator=="?="){if(node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.left.property=new Cola.AST_Binary(props)}node.operator="=";node=new Cola.AST_Conditional({start:node.start,end:node.end,condition:Cola.Constructions.IsntSet(node.left),consequent:node.clone(),alternative:node.left})}else if(node instanceof Cola.AST_Conditional&&node.alternative instanceof Cola.AST_Noop){node.alternative=node.consequent;node.consequent=node.condition;node.condition=Cola.Constructions.IsSet(node.condition)}else if(node instanceof Cola.AST_Binary&&node.operator=="is"&&node.right instanceof Cola.AST_SymbolRef&&node.right.name=="NaN"){props={start:node.start,end:node.end,args:[node.left],expression:new Cola.AST_SymbolRef({name:"isNaN"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="isnt"&&node.right instanceof Cola.AST_SymbolRef&&node.right.name=="NaN"){props={args:[node.left],expression:new Cola.AST_SymbolRef({name:"isNaN"})};props={start:node.start,end:node.end,operator:"!",expression:new Cola.AST_Call(props)};node=new Cola.AST_UnaryPrefix(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="is"){_ColaRuntime$hash[Cola._ColaRuntime$is.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$is"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Binary&&node.operator=="isnt"){_ColaRuntime$hash[Cola._ColaRuntime$isnt.i]=true;props={start:node.start,end:node.end,args:[node.left,node.right],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$isnt"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_UnaryPrefix&&node.operator=="isset"){node=Cola.Constructions.IsSet(node.expression,node)}else if(node instanceof Cola.AST_UnaryPrefix&&node.operator=="clone"){_ColaRuntime$hash[Cola._ColaRuntime$clone.i]=true;props={start:node.start,end:node.end,args:[node.expression],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$clone"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator=="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"push",expression:node.left.expression};props={start:node.start,end:node.end,args:[node.right],expression:new Cola.AST_Dot(props)};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator!="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_Noop){props={property:"length",expression:node.left.expression};props={operator:"-",left:new Cola.AST_Dot(props),right:new Cola.AST_Number({value:1})};node.left.property=new Cola.AST_Binary(props)}else if(node instanceof Cola.AST_Sub&&node.property instanceof Cola.AST_Noop){_ColaRuntime$hash[Cola._ColaRuntime$array_last.i]=true;props={start:node.start,end:node.end,args:[node.expression],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$array_last"})};node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Assign&&node.operator=="="&&node.left instanceof Cola.AST_Sub&&node.left.property instanceof Cola.AST_ArrayRange){_ColaRuntime$hash[Cola._ColaRuntime$array_asplice.i]=true;props={start:node.start,end:node.end,args:[node.left.expression,node.left.property.from,node.left.property.to,node.right],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$array_asplice"})};if(node.left.property.to instanceof Cola.AST_Noop)props.args[2]=new Cola.AST_Number({value:"9e9"});else if(node.left.property.triple)props.args[2]=new Cola.AST_Binary({operator:"-",left:node.left.property.to,right:new Cola.AST_Number({value:1})});node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Sub&&node.property instanceof Cola.AST_ArrayRange){props={property:"slice",expression:node.expression};props={start:node.start,end:node.end,args:[node.property.from],expression:new Cola.AST_Dot(props)};if(!node.property.triple&&!(node.property.to instanceof Cola.AST_Noop))props.args[1]=new Cola.AST_Binary({operator:"+",left:node.property.to,right:new Cola.AST_Number({value:1})});else if(!(node.property.to instanceof Cola.AST_Noop))props.args[1]=node.property.to;node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_ArrayRange){_ColaRuntime$hash[Cola._ColaRuntime$array_range.i]=true;props={start:node.start,end:node.end,args:[node.from,node.to],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$array_range"})};if(node.triple)props.args[1]=new Cola.AST_Binary({operator:"-",left:node.to,right:new Cola.AST_Number({value:1})});node=new Cola.AST_Call(props)}else if(node instanceof Cola.AST_Call){props={properties:[]};var delQueue=[];node.args.forEach(function(val,i){if(!(val instanceof Cola.AST_Namedarg))return;_ColaRuntime$hash[Cola._ColaRuntime$func_named_args.i]=true;delQueue.push(i);props.properties.push(new Cola.AST_ObjectKeyVal({start:val.start,end:val.end,key:val.name,value:val.value}))});if(delQueue.length!=0){delQueue.reverse().forEach(function(val){node.args.splice(val,1)});props={start:node.start,end:node.end,args:[new Cola.AST_Object(props)],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$func_named_args"})};node.args.push(new Cola.AST_New(props))}}else if((node instanceof Cola.AST_Function||node instanceof Cola.AST_Defun)&&node.argnames.length!=0){var posed=[],named=[],onfront=true,delQueue=[],pos=0,splated,aftersplated=-1;node.argnames.forEach(function(val,i){if(val.argtype=="positional"){if(val.defval instanceof Cola.AST_Noop&&onfront)pos++,node.argnames[i]=val.name;else{onfront=false;delQueue.push(i);posed.push({pos:pos++,val:val})}splated&&splated.after++}else if(val.argtype=="named"){delQueue.push(i);named.push(val)}else if(val.argtype=="splated"){onfront=false;delQueue.push(i);posed.push(splated={pos:pos++,after:0,val:val})}});if(delQueue.length!=0)delQueue.reverse().forEach(function(val){node.argnames.splice(val,1)});props={type:"dynamic",definitions:[]};posed.forEach(function(val,i){var pos=val.pos;val=val.val;if(val.argtype=="splated"){aftersplated=0;props.definitions.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"_ColaRuntime$i"}),value:null}));props.definitions.push(Cola.Constructions.SplatedVarDef(splated.val.name,splated.pos,splated.after,splated.pos+splated.after+1))}else if(val.defval instanceof Cola.AST_Noop)props.definitions.push(Cola.Constructions.PosedVarDef(val.name,val.type,pos,aftersplated++));else props.definitions.push(Cola.Constructions.PosedWithDefsVarDef(val.name,val.type,val.defval,pos,aftersplated++))});named.forEach(function(val,i){if(val.defval instanceof Cola.AST_Noop)props.definitions.push(new Cola.AST_VarDef({type:val.type,name:new Cola.AST_SymbolVar(val.name),value:new Cola.AST_Dot({expression:new Cola.AST_SymbolRef({name:"arguments"}),property:val.name.name})}));else props.definitions.push(Cola.Constructions.NamedVarDef(val.name,val.type,val.defval,val.name.name))});if(delQueue.length!=0||named.length!=0)node.body.unshift(new Cola.AST_Var(props));if(named.length!=0){_ColaRuntime$hash[Cola._ColaRuntime$func_named_args.i]=true;_ColaRuntime$hash[Cola._ColaRuntime$func_set_named_args.i]=true;node.body.unshift(new Cola.AST_SimpleStatement({body:new Cola.AST_Call({args:[new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$func_set_named_args"})})}))}}else if(node instanceof Cola.AST_Cascade){_ColaRuntime$hash[Cola._ColaRuntime$arguments_def.i]=true;props={type:"dynamic",body:[],argnames:[new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"_ColaRuntime$expr",start:node.expression.start,end:node.expression.end})}),new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"arguments",start:new Cola.AST_Token,end:new Cola.AST_Token})})]};var Expr,Parent=false;node.subexpressions.forEach(function(expr){Expr=expr,Parent=false;while(true)if(expr instanceof Cola.AST_Call||expr instanceof Cola.AST_Dot||expr instanceof Cola.AST_Sub||expr instanceof Cola.AST_Cascade){Parent=expr;expr=expr.expression}else if(expr instanceof Cola.AST_Binary){Parent=expr;expr=expr.left}else if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange||expr instanceof Cola.AST_SymbolRef)break;if(!Parent){if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange)Expr=new Cola.AST_Sub({start:Expr.start,end:Expr.end,expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"}),property:expr instanceof Cola.AST_ArrayRange?expr:expr.elements.length==0?new Cola.AST_Noop:expr.elements[0]});else if(expr instanceof Cola.AST_SymbolRef)Expr=new Cola.AST_Dot({start:Expr.start,end:Expr.end,expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"}),property:Expr.name})}else{if(expr instanceof Cola.AST_Array||expr instanceof Cola.AST_ArrayRange)expr=new Cola.AST_Sub({start:expr.start,end:expr.end,expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"}),property:expr instanceof Cola.AST_ArrayRange?expr:expr.elements.length==0?new Cola.AST_Noop:expr.elements[0]});else expr=new Cola.AST_Dot({start:expr.start,end:expr.end,expression:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"}),property:expr.name});if(Parent instanceof Cola.AST_Call||Parent instanceof Cola.AST_Dot||Parent instanceof Cola.AST_Sub||Parent instanceof Cola.AST_Cascade)Parent.expression=expr;else if(Parent instanceof Cola.AST_Binary)Parent.left=expr}props.body.push(new Cola.AST_SimpleStatement({start:Expr.start,end:Expr.end,body:Expr}))});props.body.push(new Cola.AST_Return({value:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"})}));props={expression:new Cola.AST_Function(props),property:"call"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),node.expression,new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node.body instanceof Cola.AST_Assign&&(node.body.left instanceof Cola.AST_ArrayTemplate||node.body.left instanceof Cola.AST_ObjectTemplate||(node.body.left instanceof Cola.AST_Array||node.body.left instanceof Cola.AST_Object)&&node.body.left.template)&&node instanceof Cola.AST_SimpleStatement){if(node.body.left.vardef&&node.body.operator!="=")Cola.Parser.prototype.unexpected.call(Cola.Parser.prototype,node.body.left.start);node=node.body;var defs=[];var Symbol=node.right instanceof Cola.AST_SymbolRef?node.right:new Cola.AST_SymbolRef({name:"_ColaRuntime$tmp"});if(!(node.right instanceof Cola.AST_SymbolRef))defs.push(new Cola.AST_VarDef({type:"dynamic",name:new Cola.AST_SymbolVar(Symbol),value:node.right}));(function _rec(def,symbol,uid){var skiped=false,k=0,is_arrayt=def instanceof Cola.AST_Array||def instanceof Cola.AST_ArrayTemplate,_=is_arrayt?def.elements:def.properties;_.forEach(is_arrayt?function(el,j){if(el instanceof Cola.AST_VarDef&&el.name.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.name.splated=undefined;el.value=Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length);defs.push(el)}else if((el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)&&el.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.splated=undefined;defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length)}))}else if(el instanceof Cola.AST_VarDef){el.value=Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++);defs.push(el)}else if(el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++)}));else if(el instanceof Cola.AST_Noop){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:symbol}),right:new Cola.AST_Number({value:_.length-1-j})})}))}else if(el instanceof Cola.AST_Hole||el instanceof Cola.AST_ArrayTemplate&&el.elements.length==0||el instanceof Cola.AST_ObjectTemplate&&el.properties.length==0)k++;else _rec(el,Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++),uid+"_")}:function(el,j){if(el.type&&(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Noop&&el.start.type=="name"))defs.push(new Cola.AST_VarDef({start:node.start,end:node.end,type:el.type,name:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolVar({name:el.key}):new Cola.AST_SymbolVar(el.value),value:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else if(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Sub||el.value instanceof Cola.AST_Dot||el.value instanceof Cola.AST_Noop&&el.start.type=="name")defs.push(new Cola.AST_Assign({operator:node.operator,left:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolRef({name:el.key}):el.value,right:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else _rec(el.value,Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key),uid+"_")})})(node.left,Symbol,"_");if(defs.length==0)return node;node=[];var sdef,sdefs=[],prev=defs[0].CTOR;defs.forEach(function _(def,i){sdef=false;if(def instanceof prev)sdefs.push(def);else{if(prev==Cola.AST_VarDef)sdef=new Cola.AST_Var({type:"dynamic",definitions:sdefs});else if(sdefs.length==1)sdef=sdefs[0];else{sdefs.reverse().forEach(function(def){if(!sdef)sdef=def;else sdef=new Cola.AST_Seq({car:def,cdr:sdef})})}node.push(!(sdef instanceof Cola.AST_Var)?new Cola.AST_SimpleStatement({body:sdef}):sdef);prev=def.CTOR;sdefs=[def]}if(i==defs.length-1)_(false)})}else if(node instanceof Cola.AST_Assign&&(node.left instanceof Cola.AST_ArrayTemplate||node.left instanceof Cola.AST_ObjectTemplate||(node.left instanceof Cola.AST_Array||node.left instanceof Cola.AST_Object)&&node.left.template)){if(node.left.vardef)Cola.Parser.prototype.unexpected.call(Cola.Parser.prototype,node.start);_ColaRuntime$hash[Cola._ColaRuntime$arguments_def.i]=true;var defs=[];var Symbol=new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"});(function _rec(def,symbol,uid){var skiped=false,k=0,is_arrayt=def instanceof Cola.AST_Array||def instanceof Cola.AST_ArrayTemplate,_=is_arrayt?def.elements:def.properties;_.forEach(is_arrayt?function(el,j){if((el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)&&el.splated){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:null}));el.splated=undefined;defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.SplatedConditional(symbol,uid,j,_.length-j-1,_.length)}))}else if(el instanceof Cola.AST_SymbolRef||el instanceof Cola.AST_Sub||el instanceof Cola.AST_Dot)defs.push(new Cola.AST_Assign({operator:node.operator,left:el,right:Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++)}));else if(el instanceof Cola.AST_Noop){skiped=true;defs.push(new Cola.AST_VarDef({type:"int",name:new Cola.AST_SymbolVar({name:"$_cola"+uid+"i"}),value:new Cola.AST_Binary({operator:"-",left:new Cola.AST_Dot({property:"length",expression:symbol}),right:new Cola.AST_Number({value:_.length-1-j})})}))}else if(el instanceof Cola.AST_Hole||el instanceof Cola.AST_ArrayTemplate&&el.elements.length==0||el instanceof Cola.AST_ObjectTemplate&&el.properties.length==0)k++;else _rec(el,Cola.Constructions.ValueWithOffset(symbol,uid,!skiped,j,k++),uid+"_")}:function(el,j){if(el.value instanceof Cola.AST_SymbolRef||el.value instanceof Cola.AST_Sub||el.value instanceof Cola.AST_Dot||el.value instanceof Cola.AST_Noop&&el.start.type=="name")defs.push(new Cola.AST_Assign({operator:node.operator,left:el.value instanceof Cola.AST_Noop?new Cola.AST_SymbolRef({name:el.key}):el.value,right:Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key)}));else _rec(el.value,Cola.Constructions.ValueWithKey(el.start.type=="name"||el.start.type=="keyword",symbol,el.key),uid+"_")})})(node.left,Symbol,"_");if(defs.length==0)return node;props={type:"dynamic",body:[],argnames:[new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"_ColaRuntime$expr",start:node.right.start,end:node.right.end})}),new Cola.AST_ArgDef({argtype:"positional",type:"dynamic",defval:new Cola.AST_Noop,name:new Cola.AST_SymbolFunarg({name:"arguments"})})]};var sdef,sdefs=[],prev=defs[0].CTOR;defs.forEach(function _(def,i){sdef=false;if(def instanceof prev)sdefs.push(def);else{if(prev==Cola.AST_VarDef)sdef=new Cola.AST_Var({type:"dynamic",definitions:sdefs});else if(sdefs.length==1)sdef=sdefs[0];else{sdefs.reverse().forEach(function(def){if(!sdef)sdef=def;else sdef=new Cola.AST_Seq({car:def,cdr:sdef})})}props.body.push(!(sdef instanceof Cola.AST_Var)?new Cola.AST_SimpleStatement({body:sdef}):sdef);prev=def.CTOR;sdefs=[def]}if(i==defs.length-1)_(false)});props.body.push(new Cola.AST_Return({value:new Cola.AST_SymbolRef({name:"_ColaRuntime$expr"})}));props={expression:new Cola.AST_Function(props),property:"call"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),node.right,new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_If&&node.inline&&!(parent instanceof Cola.AST_If&&parent.inline)){_ColaRuntime$hash[Cola._ColaRuntime$arguments_def.i]=true;var s=node;while(true){s.inline=false;s.body=new Cola.AST_Return({value:s.body});if(s.alternative instanceof Cola.AST_If)s=s.alternative;else if(s.alternative==null)break;else{s.alternative=new Cola.AST_Return({value:s.alternative});break}}props={expression:new Cola.AST_Function({type:"dynamic",body:[node],argnames:[]}),property:"apply"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_Switch&&!(parent instanceof Cola.AST_Block)){_ColaRuntime$hash[Cola._ColaRuntime$arguments_def.i]=true;node.body.forEach(function(branch){if(!branch.body.length)return;branch.body[0]=new Cola.AST_Return({value:branch.body[0].body})});props={expression:new Cola.AST_Function({type:"dynamic",body:[node],argnames:[]}),property:"apply"};node=new Cola.AST_Call({start:node.start,end:node.end,args:[new Cola.AST_SymbolRef({name:"this"}),new Cola.AST_SymbolRef({name:"arguments"})],expression:new Cola.AST_Dot(props)})}else if(node instanceof Cola.AST_Switch&&node.expression instanceof Cola.AST_Noop){node.expression=new Cola.AST_False;node.body.forEach(function(branch){if(branch instanceof Cola.AST_Default)return;if(branch.expression instanceof Cola.AST_Seq){var seq=branch.expression;while(true){seq.car=new Cola.AST_UnaryPrefix({operator:"!",expression:seq.car});if(seq.cdr instanceof Cola.AST_Seq)seq=seq.cdr;else{seq.cdr=new Cola.AST_UnaryPrefix({operator:"!",expression:seq.cdr});break}}return}branch.expression=new Cola.AST_UnaryPrefix({operator:"!",expression:branch.expression})})}else if(node instanceof Cola.AST_When){node=new Cola.AST_Case(node);node.body.push(new Cola.AST_Break)}else if(node instanceof Cola.AST_SwitchBranch&&!(node instanceof Cola.AST_Default)&&node.expression instanceof Cola.AST_Seq){var branches=[],seq=node.expression;while(true){branches.push(new node.CTOR({expression:seq.car,body:[]}));if(seq.cdr instanceof Cola.AST_Seq)seq=seq.cdr;else{node.expression=seq.cdr;branches.push(node);break}}node=branches}else if(node instanceof Cola.AST_Proto){props=new Cola.AST_Dot(node);props.expression=new Cola.AST_Dot(node);props.expression.property="prototype";node=props}else if(node instanceof Cola.AST_StringTemplate){newNode=new Cola.AST_Binary({operator:"+",left:node.body[0],right:node.body[1]});for(var i=2;i=_to;i--)range.push(i);return range};Cola._ColaRuntime$array_range.i=7;Cola._ColaRuntime$array_asplice=function _ColaRuntime$array_asplice(_array,_from,_to,_a){_to=_to-_from+1;return[].splice.apply(_array,[_from,_to].concat(_a)),_a};Cola._ColaRuntime$array_asplice.i=8;Cola._ColaRuntime$func_named_args=function _ColaRuntime$func_named_args(_args){this.$=_args};Cola._ColaRuntime$func_named_args.i=9;Cola._ColaRuntime$func_set_named_args=function _ColaRuntime$func_set_named_args(_args){if(_args[_args.length-1]instanceof _ColaRuntime$func_named_args){var nargs=_args[_args.length-1].$;for(var i in nargs)if(nargs.hasOwnProperty(i))_args[i]=nargs[i]}};Cola._ColaRuntime$func_set_named_args.i=10;Cola._ColaRuntime$arguments_def={i:11};Cola.$_cola=Cola._ColaRuntime$is+Cola._ColaRuntime$isnt+Cola._ColaRuntime$modulo+Cola._ColaRuntime$isset+Cola._ColaRuntime$isntset+Cola._ColaRuntime$clone+Cola._ColaRuntime$array_last+Cola._ColaRuntime$array_range+Cola._ColaRuntime$array_asplice+Cola._ColaRuntime$func_named_args+Cola._ColaRuntime$func_set_named_args+"var arguments;";Cola.Compressor.StdFuncs={_ColaRuntime$is:true,_ColaRuntime$isnt:true,_ColaRuntime$modulo:true,_ColaRuntime$isset:true,_ColaRuntime$isntset:true};window.addEventListener("load",Cola.bootstrap,false); \ No newline at end of file diff --git a/lib/compress.js b/lib/compress.js index 3efe7ae5..3dddd21f 100644 --- a/lib/compress.js +++ b/lib/compress.js @@ -1704,16 +1704,8 @@ Cola.Compressor.MathFuncs = { } else if (!compressor.option("is_js") && self.expression instanceof Cola.AST_SymbolRef && Cola.Compressor.StdFuncs[self.expression.name] && self.args[0] instanceof Cola.AST_Constant) { - if (self.expression.name == "$_cola_isset" || self.expression.name == "$_cola_isntset") - return make_node(Cola.AST_Boolean, self, { value : Cola[self.expression.name](self.args[0].value) }).transform(compressor); - - if ((self.expression.name == "$_cola_is" || self.expression.name == "$_cola_isnt") && - self.args[1] instanceof Cola.AST_SymbolRef && - (self.args[1].value == "Number" || self.args[1].value == "Boolean" || self.args[1].value == "String")) - return make_node(Cola.AST_Boolean, self, { value : Cola[self.expression.name](self.args[0].value, eval(self.args[1].value)) }).transform(compressor); - - if (self.expression.name == "$_cola_modulo" && self.args[1] instanceof Cola.AST_Constant) - return make_node(Cola.AST_Number, self, { value : Cola.$_cola_modulo(self.args[0].value, self.args[1].value) }).transform(compressor); + if (self.expression.name == "_ColaRuntime$$modulo" && self.args[1] instanceof Cola.AST_Constant) + return make_node(Cola.AST_Number, self, { value : Cola._ColaRuntime$$modulo(self.args[0].value, self.args[1].value) }).transform(compressor); } } if (compressor.option("unsafe")) { diff --git a/lib/index.html b/lib/index.html index c3ea700e..dd7a7f38 100644 --- a/lib/index.html +++ b/lib/index.html @@ -224,7 +224,7 @@ main(); mainbinding = document.getElementById("main_binding"), compressed = document.getElementById("compressed"), source; - + //localStorage.clear(); if(!localStorage.source) localStorage.source = source = sourceArea.value; else sourceArea.value = source = localStorage.source; isjs.checked = localStorage.isjs == "t"; @@ -315,7 +315,7 @@ main(); } } - compile(); changeClass(); + compile(); diff --git a/lib/parse.js b/lib/parse.js index e0a325a1..7b3a5a5f 100644 --- a/lib/parse.js +++ b/lib/parse.js @@ -49,7 +49,7 @@ !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.cKEYWORDS = Cola.KEYWORDS.replace(' void', '') + ' when clone is isnt class singleton injector'; Cola.KEYWORDS_ATOM = 'false null true'; Cola.cKEYWORDS_ATOM = Cola.KEYWORDS_ATOM + ' on yes off no'; @@ -126,7 +126,6 @@ Cola.OPERATORS = [ // d - different left and right types of vars, s - same "||", // binary - s // ColaScript "clone", - "isset", "is", "isnt", "**", @@ -136,7 +135,7 @@ Cola.OPERATORS = [ // d - different left and right types of vars, s - same ]; Cola.cOPERATORS = Cola.makePredicate(Cola.OPERATORS); -Cola.OPERATORS = Cola.OPERATORS.slice(0, Cola.OPERATORS.length - 7); +Cola.OPERATORS = Cola.OPERATORS.slice(0, Cola.OPERATORS.length - 6); Cola.OPERATORS.push('void'); Cola.OPERATORS = Cola.makePredicate(Cola.OPERATORS); @@ -145,10 +144,10 @@ Cola.COMPARISON = Cola.makePredicate("< > <= >= == === != !=="); Cola.WHITESPACE_CHARS = Cola.makePredicate(Cola.characters(" \u00a0\n\r\t\f\u000b\u200b\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000")); -Cola.cPUNC_BEFORE_EXPRESSION = Cola.makePredicate(Cola.characters("[{(,.;:").concat(["::"])); +Cola.cPUNC_BEFORE_EXPRESSION = Cola.makePredicate(Cola.characters("[{(,.;:").concat(["::", "?."])); Cola.PUNC_BEFORE_EXPRESSION = Cola.makePredicate(Cola.characters("[{(,.;:")); -Cola.PUNC_CHARS = Cola.makePredicate(Cola.characters("[]{}(),;:")); +Cola.PUNC_CHARS = Cola.makePredicate(Cola.characters("[]{}(),;:?")); Cola.REGEXP_MODIFIERS = Cola.makePredicate(Cola.characters("gmsiy")); @@ -313,8 +312,11 @@ Cola.Tokenizer.prototype.dumpS = function () { this.dumps[++this.dumpi] = Cola.clone(this.S); }; -Cola.Tokenizer.prototype.restoreS = function () { +Cola.Tokenizer.prototype.restoreS = function (onlyDown) { if(this.dumpi == -1) return; + + if(onlyDown) return this.dumpi--; + this.S = this.dumps[this.dumpi]; delete this.dumps[this.dumpi--]; }; @@ -359,7 +361,7 @@ Cola.Tokenizer.prototype.token = function (type, value, is_comment) { this.S.regex_allowed = ((type == "operator" && !this.UNARY_POSTFIX(value)) || (type == "keyword" && this.KEYWORDS_BEFORE_EXPRESSION(value)) || (type == "punc" && this.PUNC_BEFORE_EXPRESSION(value))); - this.prev_was_dot = (type == "punc" && value == ".") || (!this.is_js && type == "punc" && value == "::"); + this.prev_was_dot = (type == "punc" && value == ".") || (!this.is_js && type == "punc" && (value == "::" || value == "?.")); var ret = { type : type, value : value, @@ -708,6 +710,7 @@ Cola.Tokenizer.prototype.next_token = function (force_regexp) { if (Cola.PUNC_CHARS(ch)){ if (!this.is_js && ch == ":" && this.peek(1) == ":") return this.next(), this.next(), this.token("punc", "::"); + if (!this.is_js && ch == "?" && this.peek(1) == ".") return this.next(), this.next(), this.token("punc", "?."); if (!this.is_js && this.S.string.at[this.S.string.level].inside && (this.S.string.at[this.S.string.level].inside_at || this.S.string.at[this.S.string.level].inside_braces)) { if (ch == '{') this.S.string.at[this.S.string.level].balance++; @@ -755,7 +758,6 @@ Cola.UNARY_PREFIX = Cola.makePredicate([ ]); Cola.cUNARY_PREFIX = Cola.makePredicate([ "clone", - "isset", "typeof", "delete", "--", @@ -767,7 +769,7 @@ Cola.cUNARY_PREFIX = Cola.makePredicate([ ]); Cola.UNARY_POSTFIX = Cola.makePredicate([ "--", "++" ]); -Cola.cUNARY_POSTFIX = Cola.UNARY_POSTFIX; +Cola.cUNARY_POSTFIX = Cola.makePredicate([ "--", "++", "?" ]); Cola.ASSIGNMENT = Cola.makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=" ]); Cola.cASSIGNMENT = Cola.makePredicate([ "=", "+=", "-=", "/=", "*=", "%=", ">>=", "<<=", ">>>=", "|=", "^=", "&=", "?=" ]); @@ -891,13 +893,16 @@ Cola.Parser.prototype.parse = function () { }; Cola.Parser.prototype.dumpS = function () { - this.dumps[++this.dumpi] = Cola.clone(this.S); + this.dumps[++this.dumpi] = Cola.clone(this.S); this.tokenizer.dumpS(); }; -Cola.Parser.prototype.restoreS = function () { +Cola.Parser.prototype.restoreS = function (onlyDown) { if(this.dumpi == -1) return; - this.tokenizer.restoreS(); + + this.tokenizer.restoreS(onlyDown); + if(onlyDown) return this.dumpi--; + this.S = this.dumps[this.dumpi]; delete this.dumps[this.dumpi--]; }; @@ -1022,15 +1027,22 @@ Cola.Parser.prototype.statement = Cola.Parser.embed_tokens(function() { case "name": if(!this.is_js && this.next_is("name")){ type = this.S.token.value, this.next(); - if(this.next_is("punc", "(")) return this.function_(Cola.AST_Defun, type); + + var isfun = false; + this.dumpS(); + this.subscripts(this.as_symbol(Cola.AST_SymbolDefun), false); + isfun = this.is("punc", "("); + this.restoreS(); + + if(isfun) return this.function_(Cola.AST_Defun, type); return tmp = this.var_(false, type), this.semicolon(), tmp; } - if(!this.is_js){ + if(!this.is_js){ var _this = this, balance = 1, isfun = false; this.dumpS(); - - this.next(); + + this.subscripts(this.as_symbol(Cola.AST_SymbolDefun), false); if(this.is('punc', '(')){ this.next(); this.next_until(function(){ @@ -1331,6 +1343,7 @@ Cola.Parser.prototype.function_ = function(ctor, type) { var in_statement = ctor === Cola.AST_Defun, _this = this, splatedexist = false; var name = this.is("name") ? this.as_symbol(in_statement ? Cola.AST_SymbolDefun : Cola.AST_SymbolLambda) : null; + if (name != null) name = this.subscripts(name, false); if (in_statement && !name) this.unexpected(); this.expect("("); @@ -1482,6 +1495,10 @@ Cola.Parser.prototype.vardefs = function (no_in, in_const, type) { start : this.S.token, type : type, name : (function(_this){ + if(!_this.is_js) return _this.subscripts(_this.as_symbol(in_const ? Cola.AST_SymbolConst : Cola.AST_SymbolVar), false); + //_this.dumpS(); + //console.log(_this.subscripts(_this.as_symbol(in_const ? Cola.AST_SymbolConst : Cola.AST_SymbolVar), true)); + //_this.restoreS(); //was_template = !_this.is_js && ( _this.is("punc","[") || _this.is("punc","{") ); //if (!_this.is_js && _this.is("punc","[")) return _this.array_(true, true); //if (!_this.is_js && _this.is("punc","{")) return _this.object_(true, true); @@ -1745,10 +1762,11 @@ Cola.Parser.prototype.expr_list = function (closing, allow_trailing_comma, allow a.push(new Cola.AST_Hole({ start: this.S.token, end: this.S.token })); } else if(this.is("name") && allow_named_args){ - name = Cola.$_cola_clone(this.S.token); + name = this.S.token.clone(); this.dumpS(); this.next(); if(this.is("punc",":")){ + this.restoreS(true); this.next(); a.push(new Cola.AST_Namedarg({ name : name.value, @@ -1847,7 +1865,7 @@ Cola.Parser.prototype.array_ = Cola.Parser.embed_tokens(function(is_template, is } if (!(val instanceof Cola.AST_SymbolRef || val instanceof Cola.AST_ObjectTemplate || val instanceof Cola.AST_ArrayTemplate || - !is_var && ( val instanceof Cola.AST_Dot || val instanceof Cola.AST_Sub ) || + !is_var && ( val instanceof Cola.AST_PropAccess ) || val instanceof Cola.AST_Object && val.template == true || val instanceof Cola.AST_Array && val.template == true)) { @@ -1926,7 +1944,7 @@ Cola.Parser.prototype.object_ = Cola.Parser.embed_tokens(function(is_template, i } if (!(val instanceof Cola.AST_SymbolRef || val instanceof Cola.AST_ObjectTemplate || val instanceof Cola.AST_ArrayTemplate || - !is_var && ( val instanceof Cola.AST_Dot || val instanceof Cola.AST_Sub ) || + !is_var && ( val instanceof Cola.AST_PropAccess ) || val instanceof Cola.AST_Object && val.template == true || val instanceof Cola.AST_Array && val.template == true)) { @@ -2018,6 +2036,15 @@ Cola.Parser.prototype.subscripts = function(expr, allow_calls) { end : this.prev() }), allow_calls); } + if (this.is("punc", "?.") && !this.is_js) { + this.next(); + return this.subscripts(new Cola.AST_CondAccess({ + start : start, + expression : expr, + property : this.as_name(), + end : this.prev() + }), allow_calls); + } if (this.is("punc", "[")) { this.next(); @@ -2025,10 +2052,10 @@ Cola.Parser.prototype.subscripts = function(expr, allow_calls) { if(this.is_js) prop = this.expression(true); else if(this.is("punc","]")) prop = new Cola.AST_Noop(); else { - if(this.is("punc","..") || this.is("punc","...")) prop = new Cola.AST_Number({ value : 0 }); + if((this.is("punc","..") || this.is("punc","...")) && !this.is_js) prop = new Cola.AST_Number({ value : 0 }); else prop = this.expression(true, false, true); - this.dumpS(); - if(this.is("punc","..") || this.is("punc","...")){ + //this.dumpS(); + if((this.is("punc","..") || this.is("punc","...")) && !this.is_js){ triple = this.is("punc","..."); this.next(); prop = new Cola.AST_ArrayRange({ @@ -2038,7 +2065,7 @@ Cola.Parser.prototype.subscripts = function(expr, allow_calls) { start : prop.start, end : this.prev() }); - } else this.restoreS(); + } //else this.restoreS(); } this.expect("]"); @@ -2073,6 +2100,11 @@ Cola.Parser.prototype.maybe_unary = function(allow_calls) { } var val = this.expr_atom(allow_calls); while (this.is("operator") && this.UNARY_POSTFIX(this.S.token.value) && !this.S.token.nlb) { + if(!this.is_js && this.is("operator", "?") && + !(this.next_is("punc", ";") || this.next_is("punc", ",") || this.next_is("punc", ":") || + this.next_is("punc", ")") || this.next_is("punc", "]") || this.next_is("punc", "}") || + this.next_is("operator", "?") || this.next_is("operator") && this.PRECEDENCE[this.peek().value])) break; + val = this.make_unary(Cola.AST_UnaryPostfix, this.S.token.value, val); val.start = start; val.end = this.S.token; @@ -2139,6 +2171,15 @@ Cola.Parser.prototype.maybe_conditional = function(no_in) { var expr = this.expr_ops(no_in); if (this.is("operator", "?")) { this.next(); + + /*if(!this.is_js && (this.is("punc", ";") || this.is("punc", ",") || this.is("punc", ":") || + this.is("punc", ")") || this.is("punc", "]") || this.is("punc", "}") || + this.is("operator", "?") || this.PRECEDENCE[this.S.token.value])) + return new Cola.AST_UnaryPostfix({ + operator : "?", + expression : expr + });*/ + var yes = this.expression(false); return new Cola.AST_Conditional({ @@ -2186,6 +2227,7 @@ Cola.Parser.prototype.cascade = function(expr, start) { while (this.next()) { if (this.is("name") || this.is("punc","[")) { last = this.expression(false, false, true); + if (this.is("punc", ":")) { last = this.cascade(last, last.start); this.next(); @@ -2194,10 +2236,8 @@ Cola.Parser.prototype.cascade = function(expr, start) { if (!( last instanceof Cola.AST_SymbolRef || last instanceof Cola.AST_Binary || last instanceof Cola.AST_Call - || last instanceof Cola.AST_Sub - || last instanceof Cola.AST_Dot + || last instanceof Cola.AST_PropAccess || last instanceof Cola.AST_Array - || last instanceof Cola.AST_Cascade )) this.unexpected(); } if (!this.is("punc", "..")) break; diff --git a/lib/std.js b/lib/std.js index 245d81c8..c64622fc 100644 --- a/lib/std.js +++ b/lib/std.js @@ -36,48 +36,40 @@ !this.Cola && (this.Cola = {}); -Cola.$_cola_is = function $_cola_is(_object, _type){ +Cola._ColaRuntime$$is = function _ColaRuntime$$is(_object, _type){ return _object === _type || _type.prototype && (_object instanceof _type || _object.__proto__ === _type.prototype); } -Cola.$_cola_is.i = 0; +Cola._ColaRuntime$$is.i = 0; -Cola.$_cola_isnt = function $_cola_isnt(_object, _type){ +Cola._ColaRuntime$$isnt = function _ColaRuntime$$isnt(_object, _type){ return !(_object === _type || _type.prototype && (_object instanceof _type || _object.__proto__ === _type.prototype)); } -Cola.$_cola_isnt.i = 1; +Cola._ColaRuntime$$isnt.i = 1; -Cola.$_cola_modulo = function $_cola_modulo(_a, _b){ +Cola._ColaRuntime$$modulo = function _ColaRuntime$$modulo(_a, _b){ return (_a % _b + +_b) % _b; } -Cola.$_cola_modulo.i = 2; +Cola._ColaRuntime$$modulo.i = 2; -Cola.$_cola_isset = function $_cola_isset(_object){ +Cola._ColaRuntime$$isset = function _ColaRuntime$$isset(_object){ return !(typeof _object === "undefined" || _object === null); } -Cola.$_cola_isset.i = 3; +Cola._ColaRuntime$$isset.i = 3; -Cola.$_cola_isntset = function $_cola_isntset(_object){ +Cola._ColaRuntime$$isntset = function _ColaRuntime$$isntset(_object){ return (typeof _object === "undefined" || _object === null); } -Cola.$_cola_isntset.i = 4; +Cola._ColaRuntime$$isntset.i = 4; -Cola.$_cola_clone = function $_cola_clone(_item){ +Cola._ColaRuntime$$clone = function _ColaRuntime$$clone(_item){ if (_item === undefined || _item === null) return _item; if (_item.__clone__ instanceof Function) return _item.__clone__(); - var result, types = [ Number, String, Boolean ]; - for (var i in types) - if(types.hasOwnProperty(i) && _item instanceof types[i]) - return types[i]( _item ); + if(_item instanceof Number) return Number(_item); + if(_item instanceof String) return String(_item); + if(_item instanceof Boolean) return Boolean(_item); - if (_item.__proto__ === Array.prototype) { - result = []; - _item.forEach(function(child, index, array) { - result[index] = $_cola_clone( child ); - }); - - return result; - } + var result; if (!(_item instanceof Object)) return _item; @@ -87,61 +79,56 @@ Cola.$_cola_clone = function $_cola_clone(_item){ if (_item instanceof Date) return new Date(_item); if (_item instanceof Function) return _item; - result = {}; - for (var i in _item) result[i] = $_cola_clone( _item[i] ); - result.__proto__ = _item.__proto__; + result = new (Object.getPrototypeOf(_item).constructor); + for (var i in _item) result[i] = _ColaRuntime$$clone( _item[i] ); return result; } return _item; } -Cola.$_cola_clone.i = 5; +Cola._ColaRuntime$$clone.i = 5; -Cola.$_cola_array_last = function $_cola_array_last(_array){ +Cola._ColaRuntime$$array_last = function _ColaRuntime$$array_last(_array){ return _array[_array.length - 1]; } -Cola.$_cola_array_last.i = 6; +Cola._ColaRuntime$$array_last.i = 6; -Cola.$_cola_array_range = function $_cola_array_range(_from, _to){ +Cola._ColaRuntime$$array_range = function _ColaRuntime$$array_range(_from, _to){ var range = []; if(_from <= _to) for(var i = _from; i <= _to; i++) range.push(i); else for(var i = _from; i >= _to; i--) range.push(i); return range; } -Cola.$_cola_array_range.i = 7; +Cola._ColaRuntime$$array_range.i = 7; -Cola.$_cola_array_asplice = function $_cola_array_asplice(_array, _from, _to, _a){ +Cola._ColaRuntime$$array_asplice = function _ColaRuntime$$array_asplice(_array, _from, _to, _a){ _to = _to - _from + 1; return [].splice.apply(_array, [_from, _to].concat(_a)), _a; } -Cola.$_cola_array_asplice.i = 8; +Cola._ColaRuntime$$array_asplice.i = 8; -Cola.$_cola_func_named_args = function $_cola_func_named_args(_args){ +Cola._ColaRuntime$$func_named_args = function _ColaRuntime$$func_named_args(_args){ this.$ = _args; } -Cola.$_cola_func_named_args.i = 9; +Cola._ColaRuntime$$func_named_args.i = 9; -Cola.$_cola_func_set_named_args = function $_cola_func_set_named_args(_args){ - if(_args[_args.length - 1] instanceof $_cola_func_named_args){ +Cola._ColaRuntime$$func_set_named_args = function _ColaRuntime$$func_set_named_args(_args){ + if(_args[_args.length - 1] instanceof _ColaRuntime$$func_named_args){ var nargs = _args[_args.length - 1].$; for(var i in nargs) if(nargs.hasOwnProperty(i)) _args[i] = nargs[i]; } } -Cola.$_cola_func_set_named_args.i = 10; -Cola.$_cola_arguments_def = { i : 11 }; +Cola._ColaRuntime$$func_set_named_args.i = 10; +Cola._ColaRuntime$$arguments_def = { i : 11 }; Cola.$_cola = - Cola.$_cola_is + Cola.$_cola_isnt + Cola.$_cola_modulo + Cola.$_cola_isset + - Cola.$_cola_isntset + Cola.$_cola_clone + Cola.$_cola_array_last + Cola.$_cola_array_range + - Cola.$_cola_array_asplice + Cola.$_cola_func_named_args + Cola.$_cola_func_set_named_args + + Cola._ColaRuntime$$is + Cola._ColaRuntime$$isnt + Cola._ColaRuntime$$modulo + Cola._ColaRuntime$$isset + + Cola._ColaRuntime$$isntset + Cola._ColaRuntime$$clone + Cola._ColaRuntime$$array_last + Cola._ColaRuntime$$array_range + + Cola._ColaRuntime$$array_asplice + Cola._ColaRuntime$$func_named_args + Cola._ColaRuntime$$func_set_named_args + "var arguments;"; Cola.Compressor.StdFuncs = { - $_cola_is : true, - $_cola_isnt : true, - $_cola_modulo : true, - $_cola_isset : true, - $_cola_isntset : true + _ColaRuntime$$modulo : true }; diff --git a/lib/translate.js b/lib/translate.js index 37086fc6..33672867 100644 --- a/lib/translate.js +++ b/lib/translate.js @@ -46,6 +46,97 @@ Cola.Constructions.setPos = function(node, ext){ return node; }; +/* + ({{left}} === {{right}} || {{right}}.prototype && ({{left}} instanceof {{right}} || typeof {{left}} === typeof {{right}}())) + +*/ +Cola.Constructions.Is = function(left, right, ext){ + return this.setPos(new Cola.AST_Binary({ + left : new Cola.AST_Binary({ + left : left, + operator : "===", + right : right + }), + operator : "||", + right : new Cola.AST_Binary({ + left : new Cola.AST_Dot({ + expression : right, + property : "prototype" + }), + operator : "&&", + right : new Cola.AST_Binary({ + left : new Cola.AST_Binary({ + left : left, + operator : "instanceof", + right : right + }), + operator : "||", + right : new Cola.AST_Binary({ + left : new Cola.AST_UnaryPrefix({ + operator : "typeof", + expression : left + }), + operator : "===", + right : new Cola.AST_UnaryPrefix({ + operator : "typeof", + expression : new Cola.AST_Call({ + expression : right, + args : [] + }) + }) + }) + }) + }) + }), ext); +}; + +/* + !({{left}} === {{right}} || {{right}}.prototype && ({{left}} instanceof {{right}} || typeof {{left}} === typeof {{right}}())) + +*/ +Cola.Constructions.Isnt = function(left, right, ext){ + return this.setPos(new Cola.AST_UnaryPrefix({ + operator : "!", + expression : new Cola.AST_Binary({ + left : new Cola.AST_Binary({ + left : left, + operator : "===", + right : right + }), + operator : "||", + right : new Cola.AST_Binary({ + left : new Cola.AST_Dot({ + expression : right, + property : "prototype" + }), + operator : "&&", + right : new Cola.AST_Binary({ + left : new Cola.AST_Binary({ + left : left, + operator : "instanceof", + right : right + }), + operator : "||", + right : new Cola.AST_Binary({ + left : new Cola.AST_UnaryPrefix({ + operator : "typeof", + expression : left + }), + operator : "===", + right : new Cola.AST_UnaryPrefix({ + operator : "typeof", + expression : new Cola.AST_Call({ + expression : right, + args : [] + }) + }) + }) + }) + }) + }) + }), ext); +}; + /* !(typeof {{node}} === "undefined" || {{node}} === null) @@ -100,7 +191,7 @@ Cola.Constructions.IsntSet = function(node, ext){ */ Cola.Constructions.SplatedConditional = function(name, uid, pos, after, length){ - if(Cola.$_cola_is(name, String)) name = new Cola.AST_SymbolRef({ name : name }); + if(Cola._ColaRuntime$$is(name, String)) name = new Cola.AST_SymbolRef({ name : name }); return new Cola.AST_Conditional({ condition : new Cola.AST_Binary({ operator : "<=", @@ -155,7 +246,7 @@ Cola.Constructions.SplatedConditional = function(name, uid, pos, after, length){ */ Cola.Constructions.ValueWithOffset = function(name, uid, cond, pos, after){ - if(Cola.$_cola_is(name, String)) name = new Cola.AST_SymbolRef({ name : name }); + if(Cola._ColaRuntime$$is(name, String)) name = new Cola.AST_SymbolRef({ name : name }); return new Cola.AST_Sub({ expression : name, property : cond @@ -189,11 +280,11 @@ Cola.Constructions.ValueWithKey = function(cond, name, key){ }; /* - {{name}} = {{length}} <= arguments.length ? [].slice.call(arguments, {{pos}}, $_cola_i = arguments.length - {{after}}) : ($_cola_i = {{pos}}, []) + {{name}} = {{length}} <= arguments.length ? [].slice.call(arguments, {{pos}}, _ColaRuntime$$i = arguments.length - {{after}}) : (_ColaRuntime$$i = {{pos}}, []) */ Cola.Constructions.SplatedVarDef = function(name, pos, after, length){ - if(Cola.$_cola_is(name, String)) name = { name : name }; + if(Cola._ColaRuntime$$is(name, String)) name = { name : name }; return new Cola.AST_VarDef({ type : "Array", name : new Cola.AST_SymbolVar(name), // name @@ -206,11 +297,11 @@ Cola.Constructions.SplatedVarDef = function(name, pos, after, length){ or - {{name}} = arguments[$_cola_i + {{aftersplated}}] + {{name}} = arguments[_ColaRuntime$$i + {{aftersplated}}] */ Cola.Constructions.PosedVarDef = function(name, type, pos, aftersplated){ - if(Cola.$_cola_is(name, String)) name = { name : name }; + if(Cola._ColaRuntime$$is(name, String)) name = { name : name }; return new Cola.AST_VarDef({ type : type, name : new Cola.AST_SymbolVar(name), @@ -223,11 +314,11 @@ Cola.Constructions.PosedVarDef = function(name, type, pos, aftersplated){ or - {{name}} = arguments[$_cola_i + {{aftersplated}}] !== undefined ? arguments[$_cola_i + {{aftersplated}}] : {{defval}} + {{name}} = arguments[_ColaRuntime$$i + {{aftersplated}}] !== undefined ? arguments[_ColaRuntime$$i + {{aftersplated}}] : {{defval}} */ Cola.Constructions.PosedWithDefsVarDef = function(name, type, defval, pos, aftersplated){ - if(Cola.$_cola_is(name, String)) name = { name : name }; + if(Cola._ColaRuntime$$is(name, String)) name = { name : name }; return new Cola.AST_VarDef({ type : type, name : new Cola.AST_SymbolVar(name), @@ -248,7 +339,7 @@ Cola.Constructions.PosedWithDefsVarDef = function(name, type, defval, pos, after */ Cola.Constructions.NamedVarDef = function(name, type, defval, key){ - if(Cola.$_cola_is(name, String)) name = { name : name }; + if(Cola._ColaRuntime$$is(name, String)) name = { name : name }; return new Cola.AST_VarDef({ type : type, name : new Cola.AST_SymbolVar(name), @@ -270,6 +361,14 @@ Cola.Constructions.NamedVarDef = function(name, type, defval, key){ }); }; +Cola.CondAccessContains = function(node){ + if(!(node instanceof Cola.AST_Call || node instanceof Cola.AST_PropAccess)) return false; + var expr = node; + while(expr.expression instanceof Cola.AST_Call || expr.expression instanceof Cola.AST_PropAccess){ + expr = expr.expression; + } +}; + Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(this.language == 'js') return this; @@ -283,8 +382,8 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ path : "" }); - var $_cola_ast = Cola.parse(Cola.$_cola, { is_js : true }), - $_cola_hash = {}, + var _ColaRuntime$$ast = Cola.parse(Cola.$_cola, { is_js : true }), + _ColaRuntime$$hash = {}, _this, @@ -353,21 +452,33 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - $_cola_modulo(5, 2) + _ColaRuntime$$modulo(5, 2) */ if(node instanceof Cola.AST_Binary && node.operator == '%%'){ - $_cola_hash[Cola.$_cola_modulo.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$modulo.i] = true; props = { start : node.start, end : node.end, args : [node.left, node.right], - expression : new Cola.AST_SymbolRef({ name : '$_cola_modulo' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$modulo' }) }; node = new Cola.AST_Call(props); } else + /* + a.b?.c(); + + to + + typeof a.b === "undefined" && a.b === null ? undefined : a.b.c(); + + */ + if(node instanceof ){ + + } else + /* a ?= b; @@ -494,19 +605,11 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - $_cola_is(123, Number) + 123 === Number || Number.prototype && (123 instanceof Number || typeof 123 === typeof Number())) */ if(node instanceof Cola.AST_Binary && node.operator == 'is'){ - $_cola_hash[Cola.$_cola_is.i] = true; - props = { - start : node.start, - end : node.end, - args : [node.left, node.right], - expression : new Cola.AST_SymbolRef({ name : '$_cola_is' }) - }; - - node = new Cola.AST_Call(props); + node = Cola.Constructions.Is(node.left, node.right, node); } else /* @@ -514,30 +617,22 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - $_cola_isnt(true, String); + !(true === String || String.prototype && (true instanceof String || typeof true === typeof String()))) */ if(node instanceof Cola.AST_Binary && node.operator == 'isnt'){ - $_cola_hash[Cola.$_cola_isnt.i] = true; - props = { - start : node.start, - end : node.end, - args : [node.left, node.right], - expression : new Cola.AST_SymbolRef({ name : '$_cola_isnt' }) - }; - - node = new Cola.AST_Call(props); + node = Cola.Constructions.Isnt(node.left, node.right, node); } else /* - isset a + a? to - $_cola_isset(a) + _ColaRuntime$$isset(a) */ - if(node instanceof Cola.AST_UnaryPrefix && node.operator == 'isset'){ + if(node instanceof Cola.AST_UnaryPostfix && node.operator == '?'){ node = Cola.Constructions.IsSet(node.expression, node); } else @@ -546,16 +641,16 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - a = $_cola_clone(b) + a = _ColaRuntime$$clone(b) */ if(node instanceof Cola.AST_UnaryPrefix && node.operator == 'clone'){ - $_cola_hash[Cola.$_cola_clone.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$clone.i] = true; props = { start : node.start, end : node.end, args : [node.expression], - expression : new Cola.AST_SymbolRef({ name : '$_cola_clone' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$clone' }) }; node = new Cola.AST_Call(props); @@ -611,16 +706,16 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - func($_cola_array_last(arr)) + func(_ColaRuntime$$array_last(arr)) */ if(node instanceof Cola.AST_Sub && node.property instanceof Cola.AST_Noop){ - $_cola_hash[Cola.$_cola_array_last.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$array_last.i] = true; props = { start : node.start, end : node.end, args : [node.expression], - expression : new Cola.AST_SymbolRef({ name : '$_cola_array_last' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$array_last' }) }; node = new Cola.AST_Call(props); @@ -631,16 +726,16 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - $_cola_array_asplice(arr, 0, 1, 123) + _ColaRuntime$$array_asplice(arr, 0, 1, 123) */ if(node instanceof Cola.AST_Assign && node.operator == '=' && node.left instanceof Cola.AST_Sub && node.left.property instanceof Cola.AST_ArrayRange){ - $_cola_hash[Cola.$_cola_array_asplice.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$array_asplice.i] = true; props = { start : node.start, end : node.end, args : [node.left.expression, node.left.property.from, node.left.property.to, node.right], - expression : new Cola.AST_SymbolRef({ name : '$_cola_array_asplice' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$array_asplice' }) }; if(node.left.property.to instanceof Cola.AST_Noop) props.args[2] = new Cola.AST_Number({ value : '9e9' }); @@ -689,16 +784,16 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - $_cola_array_range(0, 3) + _ColaRuntime$$array_range(0, 3) */ if(node instanceof Cola.AST_ArrayRange){ - $_cola_hash[Cola.$_cola_array_range.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$array_range.i] = true; props = { start : node.start, end : node.end, args : [node.from, node.to], - expression : new Cola.AST_SymbolRef({ name : '$_cola_array_range' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$array_range' }) }; if(node.triple) props.args[1] = new Cola.AST_Binary({ @@ -710,12 +805,85 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ node = new Cola.AST_Call(props); } else + /* + int obj.num = 0 + + to + + obj.num = 0 + + */ + if(node instanceof Cola.AST_Var){ + var defCache = []; newNode = []; + node.definitions.forEach(function(def, i){ + if(!(def.name instanceof Cola.AST_SymbolVar)){ + + if(defCache.length != 0){ + newNode.push(node.clone()); + newNode[newNode.length - 1].definitions = defCache; + defCache = []; + } + + newNode.push(new Cola.AST_Assign({ + start : def.start, + end : def.end, + operator : '=', + left : def.name, + right : def.value + })); + + newNode[newNode.length - 1] = new Cola.AST_SimpleStatement({ + body : newNode[newNode.length - 1] + }); + + } else defCache.push(def); + }); + + if(defCache.length != 0){ + newNode.push(node.clone()); + newNode[newNode.length - 1].definitions = defCache; + defCache = []; + } + + node = newNode; + } else + + /* + int Math.rand(){} or Math.rand(){} + + to + + Math.rand = function(){} + */ + if(node instanceof Cola.AST_Defun && !(node.name instanceof Cola.AST_SymbolDefun)){ + var texpr = node.name; + while(!(texpr.expression instanceof Cola.AST_SymbolDefun)) texpr = texpr.expression; + texpr.expression = new Cola.AST_SymbolRef(texpr.expression); + node = new Cola.AST_Assign({ + start : node.start, + end : node.end, + operator : '=', + left : node.name, + right : (function(node){ + node.name = new Cola.AST_SymbolLambda({ + start : node.name.start, + end : node.name.end, + name : node.name.property + }); + return new Cola.AST_Function(node); + })(node) + }); + node = new Cola.AST_SimpleStatement({ + body : node + }); + } else + /* func(a, b, name : name, c) to - func(a, b, c, new $_cola_func_named_args({ name : name })) + func(a, b, c, new _ColaRuntime$$func_named_args({ name : name })) */ if(node instanceof Cola.AST_Call){ @@ -725,7 +893,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ node.args.forEach(function(val, i){ if(!(val instanceof Cola.AST_Namedarg)) return; - $_cola_hash[Cola.$_cola_func_named_args.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$func_named_args.i] = true; delQueue.push(i); props.properties.push(new Cola.AST_ObjectKeyVal({ @@ -745,7 +913,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ start : node.start, end : node.end, args : [new Cola.AST_Object(props)], - expression : new Cola.AST_SymbolRef({ name : '$_cola_func_named_args' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$func_named_args' }) }; node.args.push(new Cola.AST_New(props)); @@ -760,9 +928,9 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to function func(s){ - $_cola_func_set_named_args(arguments); - var $_cola_i, list = 3 <= arguments.length ? [].slice.call(arguments, 1, $_cola_i = arguments.length - 1) : ($_cola_i = 2, []), - b = arguments[$_cola_i+0] !== undefined ? arguments[$_cola_i+0] : false, + _ColaRuntime$$func_set_named_args(arguments); + var _ColaRuntime$$i, list = 3 <= arguments.length ? [].slice.call(arguments, 1, _ColaRuntime$$i = arguments.length - 1) : (_ColaRuntime$$i = 2, []), + b = arguments[_ColaRuntime$$i+0] !== undefined ? arguments[_ColaRuntime$$i+0] : false, n = arguments.n, h = arguments.h !== undefined ? arguments.h : 123; } @@ -807,7 +975,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ aftersplated = 0; props.definitions.push(new Cola.AST_VarDef({ type : "int", - name : new Cola.AST_SymbolVar({ name : '$_cola_i' }), + name : new Cola.AST_SymbolVar({ name : '_ColaRuntime$$i' }), value : null })); @@ -834,12 +1002,12 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(delQueue.length != 0 || named.length != 0) node.body.unshift(new Cola.AST_Var(props)); if(named.length != 0){ - $_cola_hash[Cola.$_cola_func_named_args.i] = true; - $_cola_hash[Cola.$_cola_func_set_named_args.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$func_named_args.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$func_set_named_args.i] = true; node.body.unshift(new Cola.AST_SimpleStatement({ body : new Cola.AST_Call({ args : [new Cola.AST_SymbolRef({ name : 'arguments' })], - expression : new Cola.AST_SymbolRef({ name : '$_cola_func_set_named_args' }) + expression : new Cola.AST_SymbolRef({ name : '_ColaRuntime$$func_set_named_args' }) }) })); } @@ -857,24 +1025,24 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - (function($_cola_expr, arguments){ - $_cola_expr[0] = yes; - $_cola_expr.foo = bar; - $_cola_expr.baz(); + (function(_ColaRuntime$$expr, arguments){ + _ColaRuntime$$expr[0] = yes; + _ColaRuntime$$expr.foo = bar; + _ColaRuntime$$expr.baz(); - (function($_cola_expr, arguments){ - $_cola_expr.subfoo = no; - $_cola_expr.subaz(); + (function(_ColaRuntime$$expr, arguments){ + _ColaRuntime$$expr.subfoo = no; + _ColaRuntime$$expr.subaz(); - return $_cola_expr; - }).call(this, $_cola_expr.sub, arguments); + return _ColaRuntime$$expr; + }).call(this, _ColaRuntime$$expr.sub, arguments); - return $_cola_expr; + return _ColaRuntime$$expr; }).call(this, obj, arguments); */ if(node instanceof Cola.AST_Cascade){ - $_cola_hash[Cola.$_cola_arguments_def.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$arguments_def.i] = true; props = { type : "dynamic", @@ -883,7 +1051,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ argtype : "positional", type : "dynamic", defval : new Cola.AST_Noop(), - name : new Cola.AST_SymbolFunarg({ name : "$_cola_expr", start : node.expression.start, end : node.expression.end }) + name : new Cola.AST_SymbolFunarg({ name : "_ColaRuntime$$expr", start : node.expression.start, end : node.expression.end }) }), new Cola.AST_ArgDef({ argtype : "positional", type : "dynamic", @@ -896,8 +1064,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ node.subexpressions.forEach(function(expr){ Expr = expr, Parent = false; while(true) - if( expr instanceof Cola.AST_Call || expr instanceof Cola.AST_Dot || - expr instanceof Cola.AST_Sub || expr instanceof Cola.AST_Cascade){ + if( expr instanceof Cola.AST_Call || expr instanceof Cola.AST_PropAccess){ Parent = expr; expr = expr.expression; } else @@ -911,13 +1078,13 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(expr instanceof Cola.AST_Array || expr instanceof Cola.AST_ArrayRange) Expr = new Cola.AST_Sub({ start : Expr.start, end : Expr.end, - expression : new Cola.AST_SymbolRef({ name : "$_cola_expr" }), + expression : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }), property : expr instanceof Cola.AST_ArrayRange ? expr : ( expr.elements.length == 0 ? new Cola.AST_Noop() : expr.elements[0] ) }); else if(expr instanceof Cola.AST_SymbolRef) Expr = new Cola.AST_Dot({ start : Expr.start, end : Expr.end, - expression : new Cola.AST_SymbolRef({ name : "$_cola_expr" }), + expression : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }), property : Expr.name }); } else { @@ -925,19 +1092,18 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ expr = new Cola.AST_Sub({ start : expr.start, end : expr.end, - expression : new Cola.AST_SymbolRef({ name : "$_cola_expr" }), + expression : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }), property : expr instanceof Cola.AST_ArrayRange ? expr : ( expr.elements.length == 0 ? new Cola.AST_Noop() : expr.elements[0] ) }); else expr = new Cola.AST_Dot({ start : expr.start, end : expr.end, - expression : new Cola.AST_SymbolRef({ name : "$_cola_expr" }), + expression : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }), property : expr.name }); - if( Parent instanceof Cola.AST_Call || Parent instanceof Cola.AST_Dot || - Parent instanceof Cola.AST_Sub || Parent instanceof Cola.AST_Cascade) Parent.expression = expr; + if( Parent instanceof Cola.AST_Call || Parent instanceof Cola.AST_PropAccess) Parent.expression = expr; else if(Parent instanceof Cola.AST_Binary) Parent.left = expr; } @@ -950,7 +1116,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ }); props.body.push(new Cola.AST_Return({ - value : new Cola.AST_SymbolRef({ name : "$_cola_expr" }) + value : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }) })); props = { @@ -972,8 +1138,8 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - var c = obj[0], b = obj[1][0], b2 = obj[1][1], $_cola_i = obj.length - 1, a = obj[$_cola_i++].key; - var $_cola_tmp = { key : "val" }, d = $_cola_tmp["key"]; + var c = obj[0], b = obj[1][0], b2 = obj[1][1], _ColaRuntime$$i = obj.length - 1, a = obj[_ColaRuntime$$i++].key; + var _ColaRuntime$$tmp = { key : "val" }, d = _ColaRuntime$$tmp["key"]; */ /*if(node instanceof Cola.AST_Var){ @@ -986,7 +1152,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ var Symbol = def.value instanceof Cola.AST_SymbolRef ? def.value - : new Cola.AST_SymbolRef({ name : "$_cola_tmp" }); + : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$tmp" }); if(!(def.value instanceof Cola.AST_SymbolRef)) defs.push(new Cola.AST_VarDef({ type : node.type, name : new Cola.AST_SymbolVar(Symbol), @@ -1148,7 +1314,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ var Symbol = node.right instanceof Cola.AST_SymbolRef ? node.right - : new Cola.AST_SymbolRef({ name : "$_cola_tmp" }); + : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$tmp" }); if(!(node.right instanceof Cola.AST_SymbolRef)) defs.push(new Cola.AST_VarDef({ type : "dynamic", name : new Cola.AST_SymbolVar(Symbol), @@ -1170,7 +1336,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ el.value = Cola.Constructions.SplatedConditional(symbol, uid, j, _.length - j - 1, _.length); defs.push(el); } else - if((el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_Sub || el instanceof Cola.AST_Dot) && el.splated){ + if((el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_PropAccess) && el.splated){ skiped = true; defs.push(new Cola.AST_VarDef({ type : "int", @@ -1188,7 +1354,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ el.value = Cola.Constructions.ValueWithOffset(symbol, uid, !skiped, j, k++); defs.push(el); } else - if(el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_Sub || el instanceof Cola.AST_Dot) defs.push(new Cola.AST_Assign({ + if(el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_PropAccess) defs.push(new Cola.AST_Assign({ operator : node.operator, left : el, right : Cola.Constructions.ValueWithOffset(symbol, uid, !skiped, j, k++) @@ -1221,7 +1387,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ name : el.value instanceof Cola.AST_Noop ? new Cola.AST_SymbolVar({ name : el.key }) : new Cola.AST_SymbolVar(el.value), value : Cola.Constructions.ValueWithKey(el.start.type == "name" || el.start.type == "keyword", symbol, el.key) })); else - if(el.value instanceof Cola.AST_SymbolRef || el.value instanceof Cola.AST_Sub || el.value instanceof Cola.AST_Dot || el.value instanceof Cola.AST_Noop && el.start.type == "name") defs.push(new Cola.AST_Assign({ + if(el.value instanceof Cola.AST_SymbolRef || el.value instanceof Cola.AST_PropAccess || el.value instanceof Cola.AST_Noop && el.start.type == "name") defs.push(new Cola.AST_Assign({ operator : node.operator, left : el.value instanceof Cola.AST_Noop ? new Cola.AST_SymbolRef({ name : el.key }) : el.value, right : Cola.Constructions.ValueWithKey(el.start.type == "name" || el.start.type == "keyword", symbol, el.key) @@ -1270,28 +1436,28 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ to - func((function($_cola_expr, arguments){ - aname = $_cola_expr.a; - bname = $_cola_expr.b; + func((function(_ColaRuntime$$expr, arguments){ + aname = _ColaRuntime$$expr.a; + bname = _ColaRuntime$$expr.b; - return $_cola_expr; + return _ColaRuntime$$expr; }).call(this, obj, arguments)) */ if(node instanceof Cola.AST_Assign && (node.left instanceof Cola.AST_ArrayTemplate || node.left instanceof Cola.AST_ObjectTemplate || (node.left instanceof Cola.AST_Array || node.left instanceof Cola.AST_Object) && node.left.template)){ if(node.left.vardef) Cola.Parser.prototype.unexpected.call(Cola.Parser.prototype, node.start); - $_cola_hash[Cola.$_cola_arguments_def.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$arguments_def.i] = true; var defs = []; - var Symbol = new Cola.AST_SymbolRef({ name : "$_cola_expr" }); + var Symbol = new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }); (function _rec(def, symbol, uid){ var skiped = false, k = 0, is_arrayt = def instanceof Cola.AST_Array || def instanceof Cola.AST_ArrayTemplate, _ = is_arrayt ? def.elements : def.properties; _.forEach( is_arrayt ? function(el, j){ - if((el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_Sub || el instanceof Cola.AST_Dot) && el.splated){ + if((el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_PropAccess && el.splated){ skiped = true; defs.push(new Cola.AST_VarDef({ type : "int", @@ -1305,7 +1471,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ right : Cola.Constructions.SplatedConditional(symbol, uid, j, _.length - j - 1, _.length) })); } else - if(el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_Sub || el instanceof Cola.AST_Dot) defs.push(new Cola.AST_Assign({ + if(el instanceof Cola.AST_SymbolRef || el instanceof Cola.AST_PropAccess) defs.push(new Cola.AST_Assign({ operator : node.operator, left : el, right : Cola.Constructions.ValueWithOffset(symbol, uid, !skiped, j, k++) @@ -1331,7 +1497,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ _rec(el, Cola.Constructions.ValueWithOffset(symbol, uid, !skiped, j, k++), uid + "_"); } : function(el, j){ - if(el.value instanceof Cola.AST_SymbolRef || el.value instanceof Cola.AST_Sub || el.value instanceof Cola.AST_Dot || el.value instanceof Cola.AST_Noop && el.start.type == "name") defs.push(new Cola.AST_Assign({ + if(el.value instanceof Cola.AST_SymbolRef || el.value instanceof Cola.AST_PropAccess || el.value instanceof Cola.AST_Noop && el.start.type == "name") defs.push(new Cola.AST_Assign({ operator : node.operator, left : el.value instanceof Cola.AST_Noop ? new Cola.AST_SymbolRef({ name : el.key }) : el.value, right : Cola.Constructions.ValueWithKey(el.start.type == "name" || el.start.type == "keyword", symbol, el.key) @@ -1348,7 +1514,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ argtype : "positional", type : "dynamic", defval : new Cola.AST_Noop(), - name : new Cola.AST_SymbolFunarg({ name : "$_cola_expr", start : node.right.start, end : node.right.end }) + name : new Cola.AST_SymbolFunarg({ name : "_ColaRuntime$$expr", start : node.right.start, end : node.right.end }) }), new Cola.AST_ArgDef({ argtype : "positional", type : "dynamic", @@ -1388,7 +1554,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ if(i == defs.length - 1) _(false); }); - props.body.push(new Cola.AST_Return({ value : new Cola.AST_SymbolRef({ name : "$_cola_expr" }) })); + props.body.push(new Cola.AST_Return({ value : new Cola.AST_SymbolRef({ name : "_ColaRuntime$$expr" }) })); props = { expression : new Cola.AST_Function(props), @@ -1414,7 +1580,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ */ if(node instanceof Cola.AST_If && node.inline && !(parent instanceof Cola.AST_If && parent.inline)){ - $_cola_hash[Cola.$_cola_arguments_def.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$arguments_def.i] = true; var s = node; @@ -1466,7 +1632,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ */ if(node instanceof Cola.AST_Switch && !(parent instanceof Cola.AST_Block)){ - $_cola_hash[Cola.$_cola_arguments_def.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$arguments_def.i] = true; node.body.forEach(function(branch){ if(!branch.body.length) return; @@ -1706,7 +1872,7 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ }); if (node.args[1]){ - $_cola_hash[Cola.$_cola_arguments_def.i] = true; + _ColaRuntime$$hash[Cola._ColaRuntime$$arguments_def.i] = true; props = new Cola.AST_Dot({ expression : props, @@ -1739,8 +1905,8 @@ Cola.AST_Toplevel.prototype.toJavaScript = function(options){ _this.body = required.concat(_this.body); if(options.std){ - for(var i in $_cola_hash) if($_cola_hash.hasOwnProperty(i)) - _this.body.unshift($_cola_ast.body[i]); + for(var i in _ColaRuntime$$hash) if(_ColaRuntime$$hash.hasOwnProperty(i)) + _this.body.unshift(_ColaRuntime$$ast.body[i]); } return _this; diff --git a/lib/utils.js b/lib/utils.js index 8da2d050..e4881f91 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -369,9 +369,10 @@ Cola.Dictionary.prototype = { } }; -Cola.clone = function (item) { +Cola.clone = function (item) { if (item === undefined || item === null) return item; if (item.__clone__ instanceof Function) return item.__clone__(); + if (item.clone instanceof Function) return item.clone(); var result, types = [ Number, String, Boolean ]; for (var i in types)