tinyliquid
Version:
A liquid template engine
2 lines • 64.2 kB
JavaScript
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.TinyLiquid=f()}})(function(){var define,module,exports;return function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s}({1:[function(require,module,exports){var utils=require("./utils");var parser=require("./parser");var filters=require("./filters");var vm=require("./vm");var OPCODE=require("./opcode");var debug=utils.debug("Context");var merge=utils.merge;var Context=module.exports=exports=function(options){options=options||{};this._locals={};this._syncLocals={};this._asyncLocals={};this._asyncLocals2=[];this._filters=merge(filters,options.filters);this._asyncFilters={};this._cycles={};this._buffer="";this._forloops=[];this._isInForloop=false;this._tablerowloops=[];this._isInTablerowloop=false;this._includeFileHandler=null;this._position={line:0,column:0};this._astCache={};this._filenameStack=[];this._filterCache={};this._blocks={};this._isLayout=!!options.isLayout;options=merge({timeout:12e4},options);this.options=options;this._parent=options.parent||null;var me=this;var set=function(name){if(options[name]&&typeof options[name]==="object"){Object.keys(options[name]).forEach(function(i){me["_"+name][i]=options[name][i]})}};set("locals");set("syncLocals");set("asyncLocals");set("asyncLocals2");set("filters");set("blocks");if(options.asyncFilters&&typeof options.asyncFilters==="object"){Object.keys(options.asyncFilters).forEach(function(i){me.setAsyncFilter(i,options.asyncFilters[i])})}};Context.prototype.from=function(from){var me=this;var set=function(name){if(from[name]&&typeof from[name]==="object"){for(var i in from[name]){if(i in me[name])continue;me[name][i]=from[name][i]}}else if(typeof(from[name]==="function")){if(!me[name]){me[name]=from[name]}}};set("_locals");set("_syncLocals");set("_asyncLocals");set("_asyncLocals2");set("_filters");set("_asyncFilters");set("options");set("_onErrorHandler");set("_includeFileHandler");set("_filterCache");set("_blocks");if(Array.isArray(from._filenameStack)){me._filenameStack=from._filenameStack.slice()}for(var i in from){if(i in me)continue;me[i]=from[i]}me._isInForloop=from._isInForloop;me._forloops=from._forloops.slice();me._isInTablerowloop=from._isInTablerowloop;me._tablerowloops=from._tablerowloops;me._isLayout=from._isLayout;return this};Context.prototype.STATIC_LOCALS=0;Context.prototype.SYNC_LOCALS=1;Context.prototype.ASYNC_LOCALS=2;Context.prototype.SYNC_FILTER=0;Context.prototype.ASYNC_FILTER=1;Context.prototype.setTimeout=function(ms){ms=parseInt(ms,10);if(ms>0)this.options.timeout=ms};Context.prototype.run=function(astList,callback){return vm.run(astList,this,callback)};Context.prototype.setLocals=function(name,val){this._locals[name]=val;if(this._parent){this._parent.setLocals(name,val)}};Context.prototype.setSyncLocals=function(name,fn){this._syncLocals[name]=fn};Context.prototype.setAsyncLocals=function(name,fn){if(name instanceof RegExp){var name2=name.toString();for(var i=0,len=this._asyncLocals2;i<len;i++){var item=this._asyncLocals2[i];if(item[0].toString()===name2){this._asyncLocals2.splice(i,1);break}}this._asyncLocals2.push([name,fn])}else{this._asyncLocals[name]=fn}};Context.prototype.setFilter=function(name,fn){this._filters[name.trim()]=fn};Context.prototype.setAsyncFilter=function(name,fn){if(fn.enableCache)fn=utils.wrapFilterCache(name,fn);this._asyncFilters[name.trim()]=fn};Context.prototype.setLayout=function(filename){this._layout=filename};Context.prototype.setBlock=function(name,buf){this._blocks[name]=buf;if(this._parent){this._parent.setBlock(name,buf)}};Context.prototype.setBlockIfEmpty=function(name,buf){if(!(name in this._blocks)){this._blocks[name]=buf}};Context.prototype.getBlock=function(name){return this._blocks[name]||null};Context.prototype.getLocals=function(name){if(name in this._locals)return[this.STATIC_LOCALS,this._locals[name]];if(name in this._syncLocals)return[this.SYNC_LOCALS,this._syncLocals[name],true];if(name in this._asyncLocals)return[this.ASYNC_LOCALS,this._asyncLocals[name],true];for(var i=0,len=this._asyncLocals2.length;i<len;i++){var item=this._asyncLocals2[i];if(item[0].test(name)){return[this.ASYNC_LOCALS,item[1],true]}}return null};Context.prototype.fetchSingleLocals=function(name,callback){var me=this;var info=me.getLocals(name);if(!info)return callback(null,info);switch(info[0]){case me.STATIC_LOCALS:callback(null,info[1]);break;case me.SYNC_LOCALS:var v=info[1](name,me);if(info[2])me.setLocals(name,v);callback(null,v);break;case me.ASYNC_LOCALS:info[1](name,function(err,v){if(err)return callback(err);if(info[2])me.setLocals(name,v);callback(null,v)},me);break;default:callback(me.throwLocalsUndefinedError(name))}};Context.prototype.fetchLocals=function(list,callback){var me=this;if(Array.isArray(list)){var values=[];utils.asyncEach(list,function(name,i,done){me.fetchSingleLocals(name,function(err,val){if(err){values[i]=err}else{values[i]=val}done()})},callback,null,values)}else{me.fetchSingleLocals(list,callback)}};Context.prototype.getFilter=function(name){name=name.trim();if(name in this._filters)return[this.SYNC_FILTER,this._filters[name]];if(name in this._asyncFilters)return[this.ASYNC_FILTER,this._asyncFilters[name]];return null};Context.prototype.callFilter=function(method,args,callback){if(arguments.length<3){callback=args;args=[]}var info=this.getFilter(method);if(!info)return callback(this.throwFilterUndefinedError(method));if(info[0]===this.ASYNC_FILTER){args.push(callback);args.push(this);info[1].apply(null,args)}else{args.push(this);callback(null,info[1].apply(null,args))}};Context.prototype.print=function(str){this._buffer+=str===null||typeof str==="undefined"?"":str};Context.prototype.setBuffer=function(buf){this._buffer=buf};Context.prototype.getBuffer=function(){return this._buffer};Context.prototype.clearBuffer=function(){var buf=this.getBuffer();this.setBuffer("");return buf};Context.prototype.setCycle=function(name,list){this._cycles[name]={index:0,length:list.length,list:list}};Context.prototype.getCycleIndex=function(name){var cycle=this._cycles[name];if(cycle){cycle.index++;if(cycle.index>=cycle.length)cycle.index=0;return cycle.index}else{return null}};Context.prototype.forloopEnter=function(length,itemName){this._forloops.push({length:length,itemName:itemName});this._isInForloop=true};Context.prototype.forloopItem=function(item,index){var loop=this._forloops[this._forloops.length-1];loop.item=item;loop.index=index};Context.prototype.forloopInfo=function(){return this._forloops[this._forloops.length-1]};Context.prototype.forloopEnd=function(){this._forloops.pop();if(this._forloops.length<1){this._isInForloop=false}};Context.prototype.tablerowloopEnter=function(length,itemName,columns){this._tablerowloops.push({length:length,itemName:itemName,columns:columns});this._isInTablerowloop=true};Context.prototype.tablerowloopItem=function(item,index,colIndex){var loop=this._tablerowloops[this._tablerowloops.length-1];loop.item=item;loop.index=index;loop.colIndex=colIndex};Context.prototype.tablerowloopInfo=function(){return this._tablerowloops[this._tablerowloops.length-1]};Context.prototype.tablerowloopEnd=function(){this._tablerowloops.pop();if(this._tablerowloops.length<1){this._isInTablerowloop=false}};Context.prototype.include=function(name,localsAst,headerAst,callback){if(typeof headerAst==="function"){callback=headerAst;headerAst=null}var me=this;if(typeof this._includeFileHandler==="function"){this._includeFileHandler(name,function(err,astList){if(err)return callback(err);var c=new Context({parent:me});c.from(me);function start(){c.run(astList,function(err){me.print(c.clearBuffer());callback(err)})}if(headerAst&&headerAst.length>0){astList=[me._position.line,me._position.column,OPCODE.LIST,headerAst,astList]}if(localsAst){me.run(localsAst,function(err,locals){if(err)locals={};Object.keys(locals).forEach(function(n){c._locals[n]=locals[n]});start()})}else{start()}})}else{return callback(new Error("please set an include file handler"))}};Context.prototype.extends=function(name,callback){if(typeof this._includeFileHandler==="function"){this._includeFileHandler(name,callback)}else{return callback(new Error("please set an include file handler"))}};Context.prototype.onInclude=function(fn){this._includeFileHandler=fn};Context.prototype.throwLocalsUndefinedError=function(name){debug("Locals "+name+" is undefined");return null};Context.prototype.throwLoopItemUndefinedError=function(name){debug("Loop item "+name+" is undefined");return null};Context.prototype.throwLoopLocalsUndefinedError=function(name){debug("Loop locals "+name+" is undefined");return null};Context.prototype.throwFilterUndefinedError=function(name){var err=new Error("Filter "+name+" is undefined "+this.getCurrentPosition(true));err.code="UNDEFINED_FILTER";err=this.wrapCurrentPosition(err);return err};Context.prototype.throwUnknownOpcodeError=function(code){var err=new Error("Unknown opcode "+code+" "+this.getCurrentPosition(true));err.code="UNKNOWN_OPCODE";err=this.wrapCurrentPosition(err);return err};Context.prototype.throwUnknownTagError=function(name,body){var err=new Error('Unknown tag "'+(name+" "+body).trim()+'" '+this.getCurrentPosition(true));err.code="UNKNOWN_TAG";err=this.wrapCurrentPosition(err);return err};Context.prototype.setCurrentPosition=function(line,column){this._position.line=line;this._position.column=column};Context.prototype.getCurrentPosition=function(getString){if(getString){return"at line "+this._position.line+", column "+this._position.column}else{return this._position}};Context.prototype.wrapCurrentPosition=function(err){err=err||{};err.line=this._position.line;err.column=this._position.column;return err};Context.prototype.pushFilename=function(filename){this._filenameStack.push(filename);return filename};Context.prototype.popFilename=function(){return this._filenameStack.pop()};Context.prototype.getFilename=function(){return this._filenameStack[this._filenameStack.length-1]}},{"./filters":2,"./opcode":5,"./parser":6,"./utils":7,"./vm":8}],2:[function(require,module,exports){"use strict";var toString=function(text){return text===null||typeof text==="undefined"?"":String(text)};exports.img_tag=function(url,alt){return'<img src="'+exports.escape(url)+'" alt="'+exports.escape(alt||"")+'">'};exports.script_tag=function(url){return'<script src="'+exports.escape(url)+'"></sc'+"ript>"};exports.stylesheet_tag=function(url,media){return'<link href="'+exports.escape(url)+'" rel="stylesheet" type="text/css" media="'+exports.escape(media||"all")+'" />'};exports.link_to=function(link,url,title){return'<a href="'+exports.escape(url||"")+'" title="'+exports.escape(title||"")+'">'+exports.escape(link)+"</a>"};exports.plus=function(input,operand){input=Number(input)||0;operand=Number(operand)||0;return input+operand};exports.minus=function(input,operand){input=Number(input)||0;operand=Number(operand)||0;return input-operand};exports.times=function(input,operand){input=Number(input)||0;operand=Number(operand)||0;return input*operand};exports.divided_by=function(input,operand){input=Number(input)||0;operand=Number(operand)||0;return input/operand};exports.round=function(input,point){point=parseInt(point,10)||0;if(point<1)return Math.round(input);var n=Math.pow(10,point);return Math.round(input*n)/n};exports.integer=function(input){return parseInt(input,10)||0};exports.random=function(m,n){m=parseInt(m);n=parseInt(n);if(!isFinite(m))return Math.random();if(!isFinite(n)){n=m;m=0}return Math.random()*(n-m)+m};exports.pluralize=function(input,singular,plural){return Number(input)>1?plural:singular};exports.timestamp=function(input){input=parseInt(input,10)||0;return(new Date).getTime()+input};exports.date=function(input,format){if(toString(input).toLowerCase()=="now"){var time=new Date}else{var timestamp=parseInt(input,10);if(timestamp==input){var time=new Date(timestamp)}else{var time=new Date(input)}}if(!time||!isFinite(time.valueOf()))return"Invalid Date";if(!format)format="%Y-%m-%j %H:%M:%S";var dates=time.toDateString().split(/\s/);var dateS=time.toLocaleDateString().split(/\s/);var times=time.toTimeString().split(/[\s:\+]/);var n2=function(n){return n<10?"0"+n:n};var replace={a:dates[0],A:dateS[0],b:dates[1],B:dateS[1],c:time.toLocaleString(),d:dates[2],H:times[0],I:times[0]%12,j:dates[2],m:n2(time.getMonth()+1),M:times[1],p:Number(times[0])<12?"AM":"PM",S:times[2],U:weekNo(time),W:weekNo(time,true),w:time.getDay(),x:time.toDateString(),X:time.toTimeString(),y:dates[3].substr(-2),Y:dates[3],Z:times[4]};var ret=toString(format);for(var i in replace){ret=ret.replace(new RegExp("%"+i,"g"),replace[i])}return ret};function weekNo(now,mondayFirst){var totalDays=0;var years=now.getFullYear();var days=[31,28,31,30,31,30,31,31,30,31,30,31];if(years%100===0){if(years%400===0)days[1]=29}else if(years%4===0){days[1]=29}if(now.getMonth()===0){totalDays=totalDays+now.getDate()}else{var curMonth=now.getMonth();for(var count=1;count<=curMonth;count++){totalDays=totalDays+days[count-1]}totalDays=totalDays+now.getDate()}var week=Math.round(totalDays/7);if(mondayFirst&&new Date(toString(years)).getDay()===0)week+=1;return week}exports.append=function(input,characters){if(!characters)return toString(input);return toString(input)+toString(characters)};exports.prepend=function(input,characters){if(!characters)return toString(input);return toString(characters)+toString(input)};exports.camelize=function(input){input=toString(input);return input.replace(/[^a-zA-Z0-9]+(\w)/g,function(_,ch){return ch.toUpperCase()})};exports.capitalize=function(input){input=toString(input);if(input.length<1)return input;return input[0].toUpperCase()+input.substr(1)};exports.downcase=function(input){return toString(input).toLowerCase()};exports.upcase=function(input){return toString(input).toUpperCase()};exports.escape=function(input){return toString(input).replace(/&(?!\w+;)/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")};exports.unescape=function(input){return toString(input).replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/&/g,"&")};exports.handleize=function(input){return toString(input).replace(/[^0-9a-zA-Z ]/g,"").replace(/[ ]+/g,"-").toLowerCase()};exports.replace_first=function(input,substring,replacement){return toString(input).replace(substring,replacement)};exports.replace=function(input,substring,replacement){input=toString(input);while(input.indexOf(substring)>-1){input=input.replace(substring,replacement)}return input};exports.remove=function(input,substring){return exports.replace(input,substring,"")};exports.remove_first=function(input,substring){return exports.replace_first(input,substring,"")};exports.newline_to_br=function(input){return toString(input).replace(/\n/gim,"<br>")};exports.split=function(input,delimiter){if(!delimiter)delimiter="";return toString(input).split(delimiter)};exports.size=function(input){if(!input)return 0;var len=input.length;return len>0?len:0};exports.strip_html=function(text){return toString(text).replace(/<[^>]*>/gim,"")};exports.strip_newlines=function(input){return toString(input).replace(/[\r\n]+/g,"")};exports.truncate=function(input,n){n=parseInt(n,10);if(!isFinite(n)||n<0)n=100;return toString(input).substr(0,n)};exports.truncatewords=function(input,n){n=parseInt(n,10);if(!isFinite(n)||n<0)n=15;return toString(input).trim().split(/ +/).slice(0,n).join(" ")};exports.reverse=function(arr){return Array.isArray(arr)?arr.reverse():toString(arr).split("").reverse().join("")};exports.substr=function(input,start,length){return toString(input).substr(start,length)};exports.indexOf=function(arr,searchvalue,fromindex){if(!Array.isArray(arr))arr=toString(arr);return arr.indexOf(searchvalue,fromindex)};exports.default=function(input,value){return input&&input.length>0?toString(input):toString(value)};function objectGetKeys(obj){return obj&&typeof obj==="object"?Object.keys(obj):[]}function getFirstKey(obj){if(Array.isArray(obj)){return 0}else{var keys=objectGetKeys(obj);return keys[0]||""}}function getLastKey(obj){if(Array.isArray(obj)){return obj.length-1}else{var keys=objectGetKeys(obj);return keys.pop()||""}}exports.keys=function(input){try{return objectGetKeys(input)}catch(err){return[]}};exports.first=function(array){return array&&array[getFirstKey(array)]};exports.last=function(array){return array&&array[getLastKey(array)]};exports.join=function(input,segmenter){if(!segmenter)segmenter=" ";if(Array.isArray(input)){return input.join(segmenter)}else{return""}};exports.json=function(input){try{var ret=JSON.stringify(input)}catch(err){return"{}"}return typeof ret!=="string"?"{}":ret};exports.get=function(obj,prop){if(!obj)obj={};return obj[prop]};exports.map=function(arr,prop){if(!Array.isArray(arr))return[];return arr.map(function(obj){return obj&&obj[prop]})};exports.sort=function(arr,order){if(!Array.isArray(arr))return[];order=toString(order).trim().toLowerCase();var ret1=order==="desc"?-1:1;var ret2=0-ret1;return arr.sort(function(a,b){if(a>b)return ret1;if(a<b)return ret2;return 0})};exports.sort_by=function(obj,prop,order){if(!Array.isArray(obj))return[];order=toString(order).trim().toLowerCase();var ret1=order==="desc"?-1:1;var ret2=0-ret1;return Object.create(obj).sort(function(a,b){a=a[prop];b=b[prop];if(a>b)return ret1;if(a<b)return ret2;return 0})};exports.pagination=function(count,size,page){if(count%size===0){var maxPage=parseInt(count/size,10)}else{var maxPage=parseInt(count/size,10)+1}if(isNaN(page)||page<1){page=1}page=parseInt(page);var list=[page-2,page-1,page,page+1,page+2];for(var i=0;i<list.length;){if(list[i]<1||list[i]>maxPage){list.splice(i,1)}else{i++}}if(list[0]!==1){list.unshift("...");list.unshift(1)}if(list[list.length-1]<maxPage){list.push("...");list.push(maxPage)}var ret={current:page,next:page+1,previous:page-1,list:list};if(ret.next>maxPage)ret.next=maxPage;if(ret.previous<1)ret.previous=1;return ret}},{}],3:[function(require,module,exports){var packageInfo=require("../package.json");var parser=require("./parser");var vm=require("./vm");var Context=require("./context");var filters=require("./filters");var utils=require("./utils");var OPCODE=require("./opcode");exports.version=packageInfo.version;exports.parser=parser;exports.parse=function(tpl,options){return parser.apply(null,arguments)};exports.run=function(astList,context,callback){if(arguments.length<3){var callback=arguments[arguments.length-1];var err=new Error("Not enough arguments.");if(typeof callback==="function"){return callback(err)}else{throw err}}if(!Array.isArray(astList)){try{astList=exports.parse(astList)}catch(err){return callback(err)}}var originCallback=callback;var hasCallback=false;var callback=function(err){if(hasCallback){if(err)throw err;return}hasCallback=true;clearTimeout(tid);originCallback.apply(null,arguments)};if(context.options&&context.options.timeout>0){var tid=setTimeout(function(){callback(new Error("Timeout."))},context.options.timeout)}try{vm.run(astList,context,function(err,ret){if(err)return callback(err);if(!context._layout){return callback(err,ret)}var c=exports.newContext();c.from(context);c._isLayout=true;c.extends(c._layout,function(err,astList){if(err)return callback(err);delete c._layout;vm.run(astList,c,function(err){context.setBuffer(c.getBuffer());callback(err)})})})}catch(err){return callback(err)}};exports.compile=function(tpl,options){var ast=exports.parse(tpl,options);return function(context,callback){exports.run(ast,context,function(err){callback(err,context.getBuffer())})}};exports.Context=Context;exports.newContext=function(options){return new Context(options)};exports.utils=utils;exports.filters=filters;exports.OPCODE=OPCODE;exports.insertFilename=function(astList,filename){astList.unshift([0,0,OPCODE.TEMPLATE_FILENAME_PUSH,filename]);astList.push([0,0,OPCODE.TEMPLATE_FILENAME_POP]);return astList}},{"../package.json":10,"./context":1,"./filters":2,"./opcode":5,"./parser":6,"./utils":7,"./vm":8}],4:[function(require,module,exports){var hexcase=0;function hex_md5(a){return rstr2hex(rstr_md5(str2rstr_utf8(a)))}function hex_hmac_md5(a,b){return rstr2hex(rstr_hmac_md5(str2rstr_utf8(a),str2rstr_utf8(b)))}function md5_vm_test(){return hex_md5("abc").toLowerCase()=="900150983cd24fb0d6963f7d28e17f72"}function rstr_md5(a){return binl2rstr(binl_md5(rstr2binl(a),a.length*8))}function rstr_hmac_md5(c,f){var e=rstr2binl(c);if(e.length>16){e=binl_md5(e,c.length*8)}var a=Array(16),d=Array(16);for(var b=0;b<16;b++){a[b]=e[b]^909522486;d[b]=e[b]^1549556828}var g=binl_md5(a.concat(rstr2binl(f)),512+f.length*8);return binl2rstr(binl_md5(d.concat(g),512+128))}function rstr2hex(c){try{hexcase}catch(g){hexcase=0}var f=hexcase?"0123456789ABCDEF":"0123456789abcdef";var b="";var a;for(var d=0;d<c.length;d++){a=c.charCodeAt(d);b+=f.charAt(a>>>4&15)+f.charAt(a&15)}return b}function str2rstr_utf8(c){var b="";var d=-1;var a,e;while(++d<c.length){a=c.charCodeAt(d);e=d+1<c.length?c.charCodeAt(d+1):0;if(55296<=a&&a<=56319&&56320<=e&&e<=57343){a=65536+((a&1023)<<10)+(e&1023);d++}if(a<=127){b+=String.fromCharCode(a)}else{if(a<=2047){b+=String.fromCharCode(192|a>>>6&31,128|a&63)}else{if(a<=65535){b+=String.fromCharCode(224|a>>>12&15,128|a>>>6&63,128|a&63)}else{if(a<=2097151){b+=String.fromCharCode(240|a>>>18&7,128|a>>>12&63,128|a>>>6&63,128|a&63)}}}}}return b}function rstr2binl(b){var a=Array(b.length>>2);for(var c=0;c<a.length;c++){a[c]=0}for(var c=0;c<b.length*8;c+=8){a[c>>5]|=(b.charCodeAt(c/8)&255)<<c%32}return a}function binl2rstr(b){var a="";for(var c=0;c<b.length*32;c+=8){a+=String.fromCharCode(b[c>>5]>>>c%32&255)}return a}function binl_md5(p,k){p[k>>5]|=128<<k%32;p[(k+64>>>9<<4)+14]=k;var o=1732584193;var n=-271733879;var m=-1732584194;var l=271733878;for(var g=0;g<p.length;g+=16){var j=o;var h=n;var f=m;var e=l;o=md5_ff(o,n,m,l,p[g+0],7,-680876936);l=md5_ff(l,o,n,m,p[g+1],12,-389564586);m=md5_ff(m,l,o,n,p[g+2],17,606105819);n=md5_ff(n,m,l,o,p[g+3],22,-1044525330);o=md5_ff(o,n,m,l,p[g+4],7,-176418897);l=md5_ff(l,o,n,m,p[g+5],12,1200080426);m=md5_ff(m,l,o,n,p[g+6],17,-1473231341);n=md5_ff(n,m,l,o,p[g+7],22,-45705983);o=md5_ff(o,n,m,l,p[g+8],7,1770035416);l=md5_ff(l,o,n,m,p[g+9],12,-1958414417);m=md5_ff(m,l,o,n,p[g+10],17,-42063);n=md5_ff(n,m,l,o,p[g+11],22,-1990404162);o=md5_ff(o,n,m,l,p[g+12],7,1804603682);l=md5_ff(l,o,n,m,p[g+13],12,-40341101);m=md5_ff(m,l,o,n,p[g+14],17,-1502002290);n=md5_ff(n,m,l,o,p[g+15],22,1236535329);o=md5_gg(o,n,m,l,p[g+1],5,-165796510);l=md5_gg(l,o,n,m,p[g+6],9,-1069501632);m=md5_gg(m,l,o,n,p[g+11],14,643717713);n=md5_gg(n,m,l,o,p[g+0],20,-373897302);o=md5_gg(o,n,m,l,p[g+5],5,-701558691);l=md5_gg(l,o,n,m,p[g+10],9,38016083);m=md5_gg(m,l,o,n,p[g+15],14,-660478335);n=md5_gg(n,m,l,o,p[g+4],20,-405537848);o=md5_gg(o,n,m,l,p[g+9],5,568446438);l=md5_gg(l,o,n,m,p[g+14],9,-1019803690);m=md5_gg(m,l,o,n,p[g+3],14,-187363961);n=md5_gg(n,m,l,o,p[g+8],20,1163531501);o=md5_gg(o,n,m,l,p[g+13],5,-1444681467);l=md5_gg(l,o,n,m,p[g+2],9,-51403784);m=md5_gg(m,l,o,n,p[g+7],14,1735328473);n=md5_gg(n,m,l,o,p[g+12],20,-1926607734);o=md5_hh(o,n,m,l,p[g+5],4,-378558);l=md5_hh(l,o,n,m,p[g+8],11,-2022574463);m=md5_hh(m,l,o,n,p[g+11],16,1839030562);n=md5_hh(n,m,l,o,p[g+14],23,-35309556);o=md5_hh(o,n,m,l,p[g+1],4,-1530992060);l=md5_hh(l,o,n,m,p[g+4],11,1272893353);m=md5_hh(m,l,o,n,p[g+7],16,-155497632);n=md5_hh(n,m,l,o,p[g+10],23,-1094730640);o=md5_hh(o,n,m,l,p[g+13],4,681279174);l=md5_hh(l,o,n,m,p[g+0],11,-358537222);m=md5_hh(m,l,o,n,p[g+3],16,-722521979);n=md5_hh(n,m,l,o,p[g+6],23,76029189);o=md5_hh(o,n,m,l,p[g+9],4,-640364487);l=md5_hh(l,o,n,m,p[g+12],11,-421815835);m=md5_hh(m,l,o,n,p[g+15],16,530742520);n=md5_hh(n,m,l,o,p[g+2],23,-995338651);o=md5_ii(o,n,m,l,p[g+0],6,-198630844);l=md5_ii(l,o,n,m,p[g+7],10,1126891415);m=md5_ii(m,l,o,n,p[g+14],15,-1416354905);n=md5_ii(n,m,l,o,p[g+5],21,-57434055);o=md5_ii(o,n,m,l,p[g+12],6,1700485571);l=md5_ii(l,o,n,m,p[g+3],10,-1894986606);m=md5_ii(m,l,o,n,p[g+10],15,-1051523);n=md5_ii(n,m,l,o,p[g+1],21,-2054922799);o=md5_ii(o,n,m,l,p[g+8],6,1873313359);l=md5_ii(l,o,n,m,p[g+15],10,-30611744);m=md5_ii(m,l,o,n,p[g+6],15,-1560198380);n=md5_ii(n,m,l,o,p[g+13],21,1309151649);o=md5_ii(o,n,m,l,p[g+4],6,-145523070);l=md5_ii(l,o,n,m,p[g+11],10,-1120210379);m=md5_ii(m,l,o,n,p[g+2],15,718787259);n=md5_ii(n,m,l,o,p[g+9],21,-343485551);o=safe_add(o,j);n=safe_add(n,h);m=safe_add(m,f);l=safe_add(l,e)}return Array(o,n,m,l)}function md5_cmn(h,e,d,c,g,f){return safe_add(bit_rol(safe_add(safe_add(e,h),safe_add(c,f)),g),d)}function md5_ff(g,f,k,j,e,i,h){return md5_cmn(f&k|~f&j,g,f,e,i,h)}function md5_gg(g,f,k,j,e,i,h){return md5_cmn(f&j|k&~j,g,f,e,i,h)}function md5_hh(g,f,k,j,e,i,h){return md5_cmn(f^k^j,g,f,e,i,h)}function md5_ii(g,f,k,j,e,i,h){return md5_cmn(k^(f|~j),g,f,e,i,h)}function safe_add(a,d){var c=(a&65535)+(d&65535);var b=(a>>16)+(d>>16)+(c>>16);return b<<16|c&65535}function bit_rol(a,b){return a<<b|a>>>32-b}module.exports=hex_md5},{}],5:[function(require,module,exports){var OPCODE={UNKNOWN:0,AND:1,ASSIGN:2,CAPTURE:3,CASE:4,COMMENT:5,COMPILER_VERSION:6,CONTAINS:7,CYCLE:8,DEBUG:9,ED:10,EQ:11,EXISTS:12,FILTER:13,FOR:14,FORLOOPITEM:15,FORLOOPLOCALS:16,GE:17,GT:18,HASKEY:19,HASVALUE:20,IF:21,INCLUDE:22,LE:23,LIST:24,LOCALS:25,LT:26,NE:27,NOT:28,OBJECT:29,OR:30,RANGE:31,PRINT:32,PRINTLOCALS:33,PRINTSTRING:34,TABLEROW:35,TABLEROWITEM:36,TABLEROWLOOPLOCALS:37,UNKNOWN_TAG:38,WHEN:39,LOOPLOCALS_LENGTH:50,LOOPLOCALS_NAME:51,LOOPLOCALS_INDEX0:52,LOOPLOCALS_INDEX:53,LOOPLOCALS_RINDEX0:54,LOOPLOCALS_RINDEX:55,LOOPLOCALS_FIRST:56,LOOPLOCALS_LAST:57,LOOPLOCALS_COL0:58,LOOPLOCALS_COL:59,LOOPLOCALS_COL_FIRST:60,LOOPLOCALS_COL_LAST:61,LOOPLOCALS_UNKNOWN:62,TEMPLATE_FILENAME_PUSH:80,TEMPLATE_FILENAME_POP:81,WEAK_ASSIGN:82,EXTENDS:83,BLOCK:84};module.exports=exports=OPCODE},{}],6:[function(require,module,exports){var utils=require("./utils");var OPCODE=require("./opcode");var merge=utils.merge;var ASTStack=utils.ASTStack;var localsAstNode=utils.localsAstNode;var isQuoteWrapString=utils.isQuoteWrapString;var textIndexOf=utils.textIndexOf;var splitText=utils.splitText;var stripQuoteWrap=utils.stripQuoteWrap;var jsonStringify=utils.jsonStringify;var md5=utils.md5;var arrayRemoveEmptyString=utils.arrayRemoveEmptyString;var genRandomName=utils.genRandomName;var Context=function(options){this.astStack=new ASTStack;this.tags=options.customTags;this.raw="";this.disableParseTag=false;this.line=1;this.lineStart=0;this.position=0;this.parseTagStack=[];this.forItems=[];this.tablerowItems=[];this.forItems.test=this.tablerowItems.test=function(name){var name=name.split(".")[0];return this.indexOf(name)===-1?false:true}};Context.prototype.enableParseTag=function(){var parseTagStack=this.parseTagStack;if(parseTagStack.length<1){return true}else{return parseTagStack[parseTagStack.length-1].apply(null,arguments)}};Context.prototype.getPosition=function(){return{line:this.line,column:this.position-this.lineStart+2}};Context.prototype.astNode=function(){var pos=this.getPosition();var ast=[pos.line,pos.column];for(var i=0,len=arguments.length;i<len;i++){ast.push(arguments[i])}return ast};var parser=exports=module.exports=function(tpl,options){options=options||{};var customTags=options.customTags=merge(baseTags,options.customTags);var context=new Context(options);context.astStack.push(context.astNode(OPCODE.COMPILER_VERSION,1));var mainAst=context.astNode(OPCODE.LIST);var strTmp="";function flush(){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,strTmp));strTmp=""}for(var i=0,len=tpl.length;i<len;i++){context.position=i;var c=tpl[i];if(c==="\n"){context.line++;context.lineStart=i}var text=tpl.substr(i,2);if(context.disableParseTag){if(text==="{%"){var e=textIndexOf(tpl,"%}",i);var body=tpl.slice(i+2,e).trim();context.raw=strTmp;if(e>i&&context.enableParseTag(context,body,body)){context.disableParseTag=false;strTmp="";context.raw="";i=e+1}else{strTmp+=c}}else{strTmp+=c}}else{if(text==="{{"){var e=textIndexOf(tpl,"}}",i);if(e>i){flush();context.astStack.push(parseOutput(tpl.slice(i+2,e).trim(),context));i=e+1}}else if(text==="{%"){var e=textIndexOf(tpl,"%}",i);if(e>i){var e2=strTmp.lastIndexOf("\n");if(e2!==-1){if(strTmp.slice(e2+1).trim()===""){strTmp=strTmp.slice(0,e2+1)}}flush();parseTag(context,tpl.slice(i+2,e).trim());i=e+1;var e3=tpl.indexOf("\n",i+1);if(e3!==-1){if(tpl.slice(i+1,e3+1).trim()===""){i=e3;context.line++;context.lineStart=i}}}}else{strTmp+=c}}}flush();return mainAst.concat(context.astStack.result())};var baseTags={if:function(context,name,body){var ast=parseCondition(body,context);context.astStack.newChild(context.astNode(OPCODE.IF,ast)).newChild(context.astNode(OPCODE.LIST))},unless:function(context,name,body){var ast=parseCondition(body,context);context.astStack.newChild(context.astNode(OPCODE.IF,context.astNode(OPCODE.NOT,ast))).newChild(context.astNode(OPCODE.LIST))},else:function(context,name,body){context.astStack.close().newChild(context.astNode(OPCODE.LIST))},endif:function(context,name,body){context.astStack.close();var ast=context.astStack.last();context.astStack.close();var reset=function(ast){if(ast.length>6){var a=ast.slice(0,5);a[5]=reset(context.astNode(OPCODE.IF).concat(ast.slice(5)));return a}else{return ast}};var list=context.astStack.last();if(list){list.pop();list.push(reset(ast))}else{context.astStack.list.push(context.astNode(OPCODE.PRINTSTRING,"{% endif %}"))}},endunless:function(context,name,body){context.astStack.close().close()},elseif:function(context,name,body){context.astStack.close();var ast=parseCondition(body,context);context.astStack.push(ast).newChild(context.astNode(OPCODE.LIST))},elsif:function(context,name,body){context.astStack.close();var ast=parseCondition(body,context);context.astStack.push(ast).newChild(context.astNode(OPCODE.LIST))},case:function(context,name,body){var ast=parseVariables(body,context);context.astStack.newChild(context.astNode(OPCODE.CASE)).newChild(ast)},when:function(context,name,body){context.astStack.close();var ast=parseWhen(body,context);context.astStack.push(context.astNode(OPCODE.WHEN,ast)).newChild(context.astNode(OPCODE.LIST))},endcase:function(context,name,body){context.astStack.close().close()},for:function(context,name,body){var arr=parseFor(body);var attrs=arr[2];context.astStack.newChild(context.astNode(OPCODE.FOR,localsAstNode(arr[0],context),arr[1],attrs.offset,attrs.limit)).newChild(context.astNode(OPCODE.LIST));context.forItems.push(arr[1])},endfor:function(context,name,body){context.astStack.close().close();context.forItems.pop()},tablerow:function(context,name,body){var arr=parseFor(body);var attrs=arr[2];attrs.cols=parseInt(attrs.cols);if(!(attrs.cols>1))attrs.cols=1;context.astStack.newChild(context.astNode(OPCODE.TABLEROW,localsAstNode(arr[0],context),arr[1],attrs.offset,attrs.limit,attrs.cols)).newChild(context.astNode(OPCODE.LIST));context.tablerowItems.push(arr[1])},endtablerow:function(context,name,body){context.astStack.close().close();context.tablerowItems.pop()},assign:function(context,name,body){var i=body.indexOf("=");if(i!==-1){var left=body.substr(0,i).trim();var right=body.substr(i+1).trim();var ast=parseVariables(right,context);context.astStack.push(context.astNode(OPCODE.ASSIGN,left,ast))}},capture:function(context,name,body){var blocks=arrayRemoveEmptyString(splitText(body,[" "]));var name=blocks[0]||genRandomName();if(!blocks[0]){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,"warning: missing name in {% capture %}"));
}context.astStack.newChild(context.astNode(OPCODE.CAPTURE,name))},endcapture:function(context,name,body){context.astStack.close()},block:function(context,name,body){var blocks=arrayRemoveEmptyString(splitText(body,[" "]));var name=blocks[0]||genRandomName();if(!blocks[0]){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,"warning: missing name in {% block %}"))}context.astStack.newChild(context.astNode(OPCODE.BLOCK,name))},endblock:function(context,name,body){context.astStack.close()},cycle:function(context,name,body){var blocks=arrayRemoveEmptyString(splitText(body,[" ",","]));blocks=blocks.filter(function(item){return item===","?false:true});if(blocks.length>0){var i=blocks[0].indexOf(":");if(i!==-1){var key=blocks[0].substr(0,i);blocks[0]=blocks[0].substr(i+1);if(blocks[0].length<1){blocks.shift()}}else{var key=md5(blocks.join(":")).substr(0,8)}blocks=blocks.map(function(item){return localsAstNode(item,context)});context.astStack.push(context.astNode(OPCODE.CYCLE,key).concat(blocks))}},extends:function(context,name,body){var blocks=arrayRemoveEmptyString(splitText(body,[" "]));if(blocks.length===0){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,"{% extends "+body+" %}"));return}var bf=blocks[0];if(bf.substr(0,2)==="{{"){for(var i=1;i<blocks.length;i++){var b=blocks[i];bf+=b;if(b.substr(-2)==="}}"){break}}filename=parseVariables(bf.slice(2,-2),context);blocks=blocks.slice(i+1)}else{filename=stripQuoteWrap(bf);blocks=blocks.slice(1)}context.astStack.push(context.astNode(OPCODE.EXTENDS,filename))},include:function(context,name,body){var blocks=arrayRemoveEmptyString(splitText(body,[" "]));var filename,withLocals,parameters;if(blocks.length===0){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,"{% include "+body+" %}"));return}else if(blocks.length===1&&!(blocks[0].substr(0,2)==="{{"&&blocks[0].substr(-2)==="}}")){filename=stripQuoteWrap(blocks[0]).trim()}else{if(blocks.length>=3&&blocks[blocks.length-2].toLowerCase()==="with"){withLocals=localsAstNode(stripQuoteWrap(blocks[blocks.length-1]),context);blocks=blocks.slice(0,-2)}var bf=blocks[0];if(bf.substr(0,2)==="{{"){for(var i=1;i<blocks.length;i++){var b=blocks[i];bf+=b;if(b.substr(-2)==="}}"){break}}filename=parseVariables(bf.slice(2,-2),context);blocks=blocks.slice(i+1)}else{filename=stripQuoteWrap(bf).trim();blocks=blocks.slice(1)}if(blocks.length>0){blocks=arrayRemoveEmptyString(splitText(blocks.join(" "),[" ","="]));var parts=[];var pi=0;function addPart(i){if(i<0)return;parts.push(blocks.slice(pi,i+1).join(""));pi=i+1}for(var i=0;i<blocks.length;i++){var b=blocks[i];if(b==="="){addPart(i-2)}}addPart(i);parameters=context.astNode(OPCODE.LIST);parts.forEach(function(part){var i=part.indexOf("=");if(i!==-1){var left=part.substr(0,i).trim();var right=part.substr(i+1).trim();var ast=parseVariables(right,context);parameters.push(context.astNode(OPCODE.WEAK_ASSIGN,left,ast))}})}}context.astStack.push(context.astNode(OPCODE.INCLUDE,filename,withLocals,parameters))},raw:function(context,name,body){context.disableParseTag=true;context.parseTagStack.push(context.tags.endraw)},endraw:function(context,name,body){if(name.toLowerCase()==="endraw"){context.astStack.push(context.astNode(OPCODE.PRINTSTRING,context.raw));return true}else{return false}},comment:function(context,name,body){context.disableParseTag=true;context.parseTagStack.push(context.tags.endcomment)},endcomment:function(context,name,body){if(name.toLowerCase()==="endcomment"){context.astStack.push(context.astNode(OPCODE.COMMENT,context.raw));return true}else{return false}}};var parseFilter=parser.parseFilter=function(text,firstArg,link,context){text=text.trim();var i=text.indexOf(":");if(i===-1){var name=text;var args=[]}else{var name=text.slice(0,i);var args=splitText(text.slice(i+1).trim(),[","]).filter(function(item){return item!==","})}args=args.map(function(item){return localsAstNode(item.trim(),context)});args.unshift(firstArg);var ast=context.astNode(OPCODE.FILTER,name).concat(args);if(link.length>0){return parseFilter(link.shift(),ast,link,context)}else{return ast}};var parseCondition=parser.parseCondition=function(body,context){var cond=body.trim();var blocks=arrayRemoveEmptyString(splitText(cond,[" ","===","&&","||",">=","<=","==","!=","<>","=",">","<","!"]));var trans={"&&":"and","||":"or",">":"gt","<":"lt","=":"eq","==":"eq","===":"ed","<>":"ne","!=":"ne",">=":"ge","<=":"le","!":"not"};blocks=blocks.map(function(item){return trans[item]||item});var _blocks=blocks;blocks=[];var tmp=[];var flush=function(){if(tmp.length>0){blocks.push(tmp);tmp=[]}};_blocks.forEach(function(item){if(item.toLowerCase()==="and"||item.toLowerCase()==="or"){flush();blocks.push(item.toLowerCase())}else{tmp.push(item)}});flush();var condAst=[];blocks.forEach(function(item){if(Array.isArray(item)){if(item.length===1){var ast=context.astNode(OPCODE.EXISTS,localsAstNode(item[0],context))}else if(item.length===2){var code=OPCODE[item[0].toUpperCase()]||OPCODE.DEBUG;var ast=context.astNode(code,localsAstNode(item[1],context))}else{var code=OPCODE[item[1].toUpperCase()]||OPCODE.DEBUG;var ast=context.astNode(code,localsAstNode(item[0],context),localsAstNode(item[2],context))}condAst.push(ast)}else{condAst.push(item)}});var mergeCond=function(op){var ret=false;if(blocks.length<3)return ret;var _condAst=condAst;condAst=[];for(var i=0,len=_condAst.length;i<len;i++){var mid=_condAst[i+1];if(typeof mid==="string"&&mid.toLowerCase()===op&&i+2<len){var code=OPCODE[op.toUpperCase()]||OPCODE.DEBUG;condAst.push(context.astNode(code,_condAst[i],_condAst[i+2]));i+=2;ret=true}else{condAst.push(_condAst[i])}}return ret};while(mergeCond("and")){}while(mergeCond("or")){}return condAst[0]};var parseWhen=parser.parseWhen=function(body,context){var blocks=arrayRemoveEmptyString(splitText(body,[" ","or"]));blocks=blocks.filter(function(item){return item==="or"?false:true}).map(function(item){var ast=localsAstNode(item,context);if(!Array.isArray(ast))ast=context.astNode(OPCODE.OBJECT,ast);return ast});return blocks};var parseVariables=parser.parseVariables=function(text,context){var i=0;var filters=[];while(true){var e=textIndexOf(text,"|",i);if(e===-1){break}else{filters.push(text.slice(i,e).trim());i=e+1}}if(filters.length>0){filters.push(text.slice(i).trim())}if(filters.length>1){var name=filters.shift();var astList=parseFilter(filters.shift(),localsAstNode(name,context),filters,context)}else{var astList=localsAstNode(text,context)}return astList};var parseFor=parser.parseFor=function(body){var blocks=arrayRemoveEmptyString(splitText(body,[" "]));var parseAttrs=function(blocks){if(blocks.length<1)return{};var attrString=blocks.reduce(function(sum,item){if(item===":")return sum;if(sum.substr(-1)===":")return sum+item;return sum+" "+item});var attrs={};arrayRemoveEmptyString(splitText(attrString,[" "])).forEach(function(item){var i=item.indexOf(":");if(i===-1){attrs[item.toLowerCase()]=true}else{attrs[item.substr(0,i).toLowerCase()]=item.substr(i+1)}});return attrs};if(blocks.length>=3&&blocks[1].toLowerCase()==="in"){var itemName=blocks[0];var arrayName=blocks[2];var attrs=parseAttrs(blocks.slice(3))}else if(blocks.length===1||blocks.length>1&&blocks[1].toLowerCase()!=="in"&&blocks[1].indexOf(":")===-1){var itemName="item";var arrayName=blocks[0];var attrs=parseAttrs(blocks.slice(1))}if(!(attrs.offset>0))attrs.offset=0;if(!(attrs.limit>0))attrs.limit=0;return[arrayName,itemName,attrs]};var parseOutput=function(text,context){var astList=parseVariables(text,context);if(Array.isArray(astList)){if(astList[2]===OPCODE.LOCALS){return context.astNode(OPCODE.PRINTLOCALS).concat(astList.slice(3))}else{return context.astNode(OPCODE.PRINT,astList)}}else{return context.astNode(OPCODE.PRINTSTRING,astList)}};var parseTag=function(context,text){var i=text.indexOf(" ");if(i===-1){var name=text;var body=""}else{var name=text.slice(0,i);var body=text.slice(i+1).trim()}name=name.toLowerCase();if(typeof context.tags[name]==="function"){context.tags[name](context,name,body)}else{context.astStack.push(context.astNode(OPCODE.UNKNOWN_TAG,name,body))}}},{"./opcode":5,"./utils":7}],7:[function(require,module,exports){(function(process){var md5=require("./md5");var utils=exports=module.exports={};var OPCODE=require("./opcode");utils.noop=function(){};utils.debug=function(name){if(/tinyliquid/gim.test(process.env.DEBUG)){return function(msg){console.log("[debug] TinyLiquid:%s: %s",name,msg)}}else{return utils.noop}};utils.md5=md5;utils.isQuoteWrapString=function(text){if(text[0]==='"'&&text[text.length-1]==='"'||text[0]==="'"&&text[text.length-1]==="'"){return true}else{return false}};utils.stripQuoteWrap=function(text){if(utils.isQuoteWrapString(text)){return text.substr(1,text.length-2)}else{return text}};utils.textIndexOf=function(text,subject,start){if(start<0){start=text.length+start}else if(isNaN(start)){start=0}var subjectLength=subject.length;var quote=false;for(var i=start,len=text.length;i<len;i++){var c=text[i];if(quote){if(c===quote&&text[i-1]!=="\\"){quote=false}}else{if((c==="'"||c==='"')&&text[i-1]!=="\\"){quote=c}else{if(text.substr(i,subjectLength)===subject){return i}}}}return-1};utils.splitText=function(text,separators){if(!Array.isArray(separators)){separators=[separators||" "]}var list=[];var tmp="";var flush=function(){if(tmp.length>0){list.push(tmp);tmp=""}};var quote=false;for(var i=0,len=text.length;i<len;i++){var c=text[i];if(quote){tmp+=c;if(c===quote&&text[i-1]!=="\\"){flush();quote=false}}else{if((c==="'"||c==='"')&&text[i-1]!=="\\"){flush();tmp+=c;quote=c}else{tmp+=c}}}flush();var _list=list;list=[];tmp="";var isSeparator=function(text){for(var i=0,len=separators.length;i<len;i++){var sep=separators[i];if(text.substr(0,sep.length)===sep){return sep}}return false};_list.forEach(function(text){if(utils.isQuoteWrapString(text)){list.push(text)}else{for(var i=0,len=text.length;i<len;i++){var c=text[i];var sep=isSeparator(text.slice(i));if(sep===false){tmp+=c}else{flush();list.push(sep);i+=sep.length-1}}flush()}});list=list.filter(function(item){return item.trim()});return list};utils.jsonStringify=function(data,space){var seen=[];return JSON.stringify(data,function(key,val){if(!val||typeof val!=="object"){return val}if(seen.indexOf(val)!==-1){return"[Circular]"}seen.push(val);return val},space)};utils.merge=function(){var ret={};for(var i in arguments){var obj=arguments[i];for(var j in obj){ret[j]=obj[j]}}return ret};utils.localsAstNode=function(text,context){if(text.length>0){if(utils.isQuoteWrapString(text)){return text.slice(1,text.length-1)}else if(text==="false"){return false}else if(text==="true"){return true}else if(text==="null"||text==="empty"||text==="nil"||text==="undefined"){return null}else if(isFinite(text)){return Number(text)}else if(/^\(\d+\.\.\d+\)$/.test(text)){var b=text.match(/^\((\d+)\.\.(\d+)\)$/);return context.astNode(OPCODE.RANGE,b[1],b[2])}else if(text[0]==="("&&text[text.length-1]===")"&&text.split("..").length===2){var b=text.slice(1,-1).split("..");return context.astNode(OPCODE.RANGE,utils.localsAstNode(b[0],context),utils.localsAstNode(b[1],context))}else{var loopLocals=function(name){var n=OPCODE["LOOPLOCALS_"+name.toUpperCase()];if(typeof n==="undefined"){return[OPCODE.LOOPLOCALS_UNKNOWN,name]}else{return[n]}};if(text.substr(0,8)==="forloop."){return context.astNode(OPCODE.FORLOOPLOCALS).concat(loopLocals(text.substr(8)))}else if(text.substr(0,13)==="tablerowloop."){return context.astNode(OPCODE.TABLEROWLOOPLOCALS).concat(loopLocals(text.substr(13)))}else{var localsAst=function(op){var childs=text.split(".");return context.astNode(op,text,childs[0],childs.length>1?childs.slice(1):null)};if(context&&context.forItems.test(text)){return localsAst(OPCODE.FORLOOPITEM)}else if(context&&context.tablerowItems.test(text)){return localsAst(OPCODE.TABLEROWITEM)}else{return localsAst(OPCODE.LOCALS)}}}}else{return null}};var ASTStack=utils.ASTStack=function(){this.list=[];this._parent=[this.list];this.newChild()};ASTStack.prototype.last=function(){return this._parent[this._parent.length-1]};ASTStack.prototype.newChild=function(astList){if(typeof astList==="undefined"){astList=[]}else{astList=Array.isArray(astList)?astList:[OPCODE.OBJECT,astList]}this.last().push(astList);this._parent.push(astList);return this};ASTStack.prototype.push=function(ast){this.last().push(ast);return this};ASTStack.prototype.close=function(){var list=this.last();if(list[2]===OPCODE.LIST&&list.length<5){var ast=list[3];list.length=0;for(var i=0,len=ast.length;i<len;i++){list[i]=ast[i]}}this._parent.pop();return this};ASTStack.prototype.result=function(){if(this.list.length===1){return this.list[0]}else{return this.list}};utils.arrayRemoveEmptyString=function(arr){return arr.filter(function(item){return item.trim().length>0?true:false})};utils.range=function(s,e){s=parseInt(s);e=parseInt(e);var r=[];if(isNaN(s)||isNaN(e))return r;for(;s<=e;s++){r.push(s)}return r};utils.toArray=function(data){if(Array.isArray(data))return data;var ret=[];for(var i in data){if(i!=="size"){ret.push(data[i])}}return ret};utils.arraySlice=function(array,offset,limit){if(!Array.isArray(array))return array;offset=parseInt(offset);limit=parseInt(limit);if(offset>0){if(limit>0){return array.slice(offset,offset+limit)}else{return array.slice(offset)}}else if(limit>0){return array.slice(0,limit)}else{return array}};utils.getChildValue=function(value,childs){if(value===null||value===undefined){return[false,null]}if(childs&&childs.length>0){for(var i=0,len=childs.length;i<len;i++){if(value===null)return[false,null];var c=value[childs[i]];if(value&&typeof c!=="undefined"){value=c}else{return[false,null]}}}return[true,value]};utils.asyncEach=function(list,fn,callback,a1,a2,a3,b1,b2,b3){var i=-1;var j=0;var len=list.length;var next=function(err){if(err)return callback(err,null,a2,a3);j++;if(j>10){j=0;setImmediate(next)}else{i++;if(i<len){fn(list[i],i,next,b1,b2,b3)}else{callback(a1||null,a2,a3)}}};next()};if(typeof setImmediate!=="function"){throw new Error("Sorry, you JavaScript runtime environment does not support `setImmediate()` [TinyLiquid]")}utils.asyncFor=function(test,fn,callback,a1,a2,a3){var next=function(){if(test()){fn(next)}else{callback(a1||null,a2,a3)}};next()};utils.genRandomName=function(){var chars="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";var max=chars.length;var ret="";for(var i=0;i<10;i++){ret+=chars.charAt(Math.floor(Math.random()*max))}return ret};utils.wrapFilterCache=function(name,fn,maxAge){return function(){var me=this;var args=getFilterArguments(arguments);var callback=getFilterArgumentCallback(arguments);var context=getFilterArgumentContext(arguments);var ret=findFilterCache(context,name,args);if(ret){callback(null,ret.value)}else{fn.apply(me,newFilterArguments(args,function(err,value){if(err)return callback(err);setFilterCache(context,name,args,value);callback(null,value)},context))}}};function getFilterArguments(args){return Array.prototype.slice.call(args,0,args.length-2)}function getFilterArgumentCallback(args){return args[args.length-2]}function getFilterArgumentContext(args){return args[args.length-1]}function newFilterArguments(args,callback,context){return[].concat(args).concat([callback,context])}function getArgumentsKey(args){return md5(JSON.stringify(args)).slice(0,10)}function findFilterCache(context,name,args){var map=context._filterCache[name];if(!map)return false;var key=getArgumentsKey(args);if(key in map){return{args:args,value:map[key]}}else{return false}}function setFilterCache(context,name,args,value){var key=getArgumentsKey(args);if(!context._filterCache[name])context._filterCache[name]={};context._filterCache[name][key]=value}}).call(this,require("_process"))},{"./md5":4,"./opcode":5,_process:9}],8:[function(require,module,exports){var utils=require("./utils");var parser=require("./parser");var filters=require("./filters");var Context=require("./context");var OPCODE=require("./opcode");var debug=utils.debug("VM");var merge=utils.merge;var DataStack=utils.DataStack;var range=utils.range;var toArray=utils.toArray;var arraySlice=utils.arraySlice;var getChildValue=utils.getChildValue;var asyncEach=utils.asyncEach;var asyncFor=utils.asyncFor;var isOpcode=function(ast){return ast instanceof Array&&!(ast[0]instanceof Array)};var isAST=function(ast){return ast instanceof Array};var run=exports.run=function(astList,context,callback){if(isAST(astList)){if(isOpcode(astList)){var op=execOpcode[astList[2]];if(!op)op=execOpcode[OPCODE.UNKNOWN];context.setCurrentPosition(astList[0],astList[1]);op(context,callback,astList.slice(2))}else{var retval=new Array(astList.length);asyncEach(astList,runEachItem,callback,null,retval,null,context,retval)}}else{callback(null,astList)}};var runEachItem=function(item,index,callback,context,retval){run(item,context,function(err,vals){if(err){callback(err);return}retval[index]=vals;callback(null)})};var getOpArgs=function(astList,context,callback){var retval=new Array(astList.length);asyncEach(astList,function(ast,i,done){run(ast,context,function(err,val){if(err){callback(err)}else{retval[i]=val;done()}})},callback,null,retval)};var getOpArgs2=function(astList,context,callback){var retval=new Array(2);var i=0;var getOpArgs2_callback=function(err,val){if(err){callback(err)}else{retval[i]=val;i++;if(i>=2)callback(null,retval)}};run(astList[1],context,getOpArgs2_callback);run(astList[2],context,getOpArgs2_callback)};var execOpcode=[];execOpcode[OPCODE.UNKNOWN]=function(context,callback,ast){callback(context.throwUnknownOpcodeError(ast[0]))};execOpcode[OPCODE.LIST]=function(context,callback,ast){run(ast.slice(1),context,callback)};execOpcode[OPCODE.PRINT]=function(context,callback,ast){if(isAST(ast[1])){run(ast[1],context,function(err,val){if(err){callback(err)}else{context.print(val);callback(null)}})}else{context.print(ast[1]);callback(null)}};execOpcode[OPCODE.PRINTLOCALS]=function(context,callback,ast){getLocals(ast[1],ast[2],ast[3],context,printLocalsAndCallback,context,callback)};var printLocalsAndCallback=function