{"version":3,"sources":["ngDoTA.js"],"names":["J","w","module","exports","document","window","this","M","l","a","f","indexOf","text","substring","c","closeTag","comment","d","e","g","m","k","b","p","h","v","slice","length","replace","toLowerCase","openTag","voidTag","console","Q","X","toUpperCase","N","getElementById","substr","setAttribute","String","prototype","trim","Object","watch","unwatch","x","createElement","G","diff","H","firstChild","nodeType","nodeValue","diff2","lastIndexOf","charAt","innerHTML","parentNode","replaceChild","insertBefore","createTextNode","appendChild","diff3","u","I","C","removeChild","getId","U","initCH","compile","match","fa","aa","L","push","da","T","ga","ea","loose","true","false","null","undefined","new","doTA","$index","S","F","$attr","K","Math","Date","Array","location","_","E","A","r","D","render","n","watchDiff","diffLevel","O","model","bind","ka","event","P","key","Z","params","la","ba","strip","encode","V",">","<","q","y","B","skip","z","t","refresh","split","elif","W","exec","style","value","R","id","ha","expand","join","optimize","ca","debug","Function","scroll","change","input","click","dblclick","mousedown","mouseup","mouseover","mouseout","mousemove","mouseenter","mouseleave","keydown","keyup","keypress","submit","focus","blur","copy","cut","paste","forEach","call","reduce","pop","assign","apply","arguments","clearTimeout","setTimeout","hidden","nextSibling","target","srcElement","$eval","$event","$applyAsync","returnValue","cancelBubble","preventDefault","stopPropagation","$evalAsync","querySelectorAll","getElementsByClassName","de","attributes","name","ded","getAttribute","dm","type","addEventListener","checked","restrict","priority","terminal","controller","angular","noop","link","$on","na","db","ngModel","removeAttr","contentDocument","childNodes","oa","ja","attr","element","$destroy","$new","replaceWith","cacheDom","scope","ngController","hasOwnProperty","compileAll","onload","ngLoad","loaded","ia","inline","Y","cloneNode","$scope","controllerAs","data","children","ma","hasChildNodes","get","cache","success","documentMode","0","1","createDocumentFragment","debounce","throttle","addEvents","addNgModels","config","factory","directive","dotaInclude","html","contents","$watch","dotaTemplate","$inject"],"mappings":"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","file":"ngDoTA.min.js","sourcesContent":["(function(global, factory) {\n\n\tif (typeof module === \"object\" && typeof module.exports === \"object\") {\n\t\tmodule.exports = factory(global, global.document);\n\t} else {\n\t\tfactory(global, global.document);\n\t}\n\n}(typeof window !== 'undefined' ? window : this, function(window, document) {\n\n\t/* for ie8 */\n\tif (!String.prototype.trim) {\n\t\tString.prototype.trim = function() {\n\t\t\treturn this.replace(/^\\s+|\\s+$/g,'');\n\t\t};\n\t}\n\n\t/* no, thanks! firefox */\n\tif (Object.prototype.watch) {\n\t\tdelete Object.prototype.watch;\n\t\tdelete Object.prototype.unwatch;\n\t}\n\n\t//less memory usage with this, javascript is single threaded anyway\n\tvar newNode = document && document.createElement('div');\n\n\tvar doTA = {\n\t\tdiff: diff1,\n\t\tdiff2: diff2,\n\t\tdiff3: diff3,\n\t\tgetId: getUniqueId,\n\t\tinitCH: initCompileHash,\n\t\tcompile: compileHTML,\n\t\t// PS: parseStyle,\n\t\tC: {}, //Cached compiled functions\n\t\tD: {}, //Cached DOM to be used by ngDoTA, needed here to prevent unneccessary rendering\n\t\tH: {}, //HashMap for TextDiff\n\t\tW: {}, //Watched Functions\n\t\tU: {},\n\t\tN: newNode,\n\t\tX: 0\n\t};\n\n\t// pretty indent for debugging\n\tfunction indent(n, x) {\n\t\tvar ret = new Array(n + 2).join(' '); //4 spaces\n\t\treturn x ? ret.slice(0, -2 * x) : ret; //-2 spaces\n\t}\n\n\t// decode html entities\n\tfunction decodeEntities(text) {\n\t\treturn text.indexOf('&') < 0 ? text : text\n\t\t\t.replace(/>/g, '>').replace(/</g, '<')\n\t\t\t.replace(/&/g, '&').replace(/"/g, '\"');\n\t}\n\n\t// parse attributes from html open tag and make dict object\n\tfunction parseAttr(chunk, func) {\n\t\tvar attr = {}, tagName;\n\t\tvar pos = chunk.indexOf(' ');\n\t\tvar spPos;\n\t\tvar len, attrName, attrVal;\n\t\tvar valStart, valEndPos;\n\n\t\tif (pos !== -1) {\n\t\t\ttagName = chunk.slice(0, pos);\n\t\t\tlen = chunk.length;\n\n\t\t\t//console.log(222, [pos, chunk]);\n\t\t\twhile (++pos < len) {\n\t\t\t\tvar eqPos = chunk.indexOf('=', pos);\n\t\t\t\t// console.log('chunk', [chunk, pos, eqPos, chunk.slice(pos)]);\n\n\t\t\t\t// ** attribute without value (last attribute) **\n\t\t\t\tif (eqPos === -1) {\n\t\t\t\t\tdo {\n\t\t\t\t\t\tspPos = chunk.indexOf(' ', pos);\n\t\t\t\t\t\tif (spPos > 0) {\n\t\t\t\t\t\t\tattrName = chunk.slice(pos, spPos);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tattrName = chunk.slice(pos);\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// console.log('eqPos === -1', [attrName, pos, chunk])\n\t\t\t\t\t\tif (attrName !== '/') {\n\t\t\t\t\t\t\tattr[attrName] = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpos = spPos + 1;\n\n\t\t\t\t\t} while (spPos > 0);\n\t\t\t\t\t//attr required will be required=\"\", while is valid syntax\n\t\t\t\t\t//http://www.w3.org/TR/html-markup/syntax.html#syntax-attr-empty\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\n\t\t\t\tspPos = chunk.indexOf(' ', pos);\n\t\t\t\t// console.log('chunk', [chunk, eqPos, pos, spPos, chunk.slice(pos, spPos)]);\n\n\t\t\t\tif (spPos > 0 && spPos < eqPos) {\n\t\t\t\t\tattr[chunk.slice(pos, spPos)] = \"\";\n\t\t\t\t\tpos = spPos;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t//console.log(33, [eqPos]);\n\t\t\t\tattrName = chunk.slice(pos, eqPos);\n\t\t\t\t//console.log(331, [attrName]);\n\n\t\t\t\tvalStart = chunk[eqPos + 1];\n\t\t\t\t//console.log(332, [valStart]);\n\n\t\t\t\t//if attribute value is start with quote\n\t\t\t\tif (valStart === '\"' || valStart === \"'\") {\n\t\t\t\t\tvalEndPos = chunk.indexOf(valStart, eqPos + 2);\n\t\t\t\t\tif (valEndPos < 0) { throw 'ERR:Invalid HTML: [' + chunk + ']'; }\n\n\t\t\t\t\tattrVal = chunk.slice(eqPos + 2, valEndPos);\n\t\t\t\t\tattr[attrName] =0>attrVal.indexOf(\"&\")?attrVal:attrVal.replace(/>/g,\">\").replace(/</g,\"<\").replace(/&/g,\"&\").replace(/"/g,'\"'); //INLINE;\n\t\t\t\t\tpos = valEndPos + 1;\n\t\t\t\t\t//console.log(311, [valEndPos, attrName, attrVal]);\n\t\t\t\t} else {\n\n\t\t\t\t\tvalEndPos = chunk.indexOf(' ', eqPos + 2);\n\n\t\t\t\t\t//when no more attributes\n\t\t\t\t\tif (valEndPos < 0) {\n\t\t\t\t\t\tattrVal = chunk.slice(eqPos + 1);\n\t\t\t\t\t\tattr[attrName] =0>attrVal.indexOf(\"&\")?attrVal:attrVal.replace(/>/g,\">\").replace(/</g,\"<\").replace(/&/g,\"&\").replace(/"/g,'\"'); //INLINE;\n\t\t\t\t\t\t//console.log(442, [attrVal]);\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tattrVal = chunk.slice(eqPos + 1, valEndPos);\n\t\t\t\t\t\tattr[attrName] =0>attrVal.indexOf(\"&\")?attrVal:attrVal.replace(/>/g,\">\").replace(/</g,\"<\").replace(/&/g,\"&\").replace(/"/g,'\"'); //INLINE;\n\t\t\t\t\t\t//console.log(313, [eqPos, valEndPos, attrVal]);\n\t\t\t\t\t\tpos = valEndPos;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar tagNameL = tagName.toLowerCase();\n\t\t\tif (tagNameL === 'input' || tagNameL === 'img' || tagNameL === 'hr') {\n\t\t\t\t//http://www.w3.org/TR/html-markup/syntax.html\n\t\t\t\t//area, base, br, col, command, embed, hr, img, input, keygen, link, meta, param, source, track, wbr\n\t\t\t\tfunc.openTag(tagName, attr, 1);\n\t\t\t\tfunc.voidTag();\n\t\t\t} else if (attrName === '/') {\n\t\t\t\tfunc.openTag(tagName, attr);\n\t\t\t\tfunc.closeTag(tagName);\n\t\t\t} else {\n\t\t\t\tfunc.openTag(tagName, attr);\n\t\t\t}\n\n\t\t// no attributes\n\t\t} else {\n\n\t\t\t// self closing, explicit\n\t\t\tif (chunk[chunk.length - 1] === '/') {\n\t\t\t\ttagName = chunk.slice(0, -1).toLowerCase();\n\n\t\t\t\tif (tagName === 'br' || tagName === 'hr') {\n\t\t\t\t\tfunc.openTag(tagName, attr, 1);\n\t\t\t\t\tfunc.voidTag();\n\t\t\t\t} else {\n\t\t\t\t\tfunc.openTag(tagName, attr);\n\t\t\t\t\tfunc.closeTag(tagName);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\ttagName = chunk.toLowerCase();\n\n\t\t\t\t// self closing, implicit\n\t\t\t\tif (tagName === 'br' || tagName === 'hr') {\n\t\t\t\t\tfunc.openTag(tagName, attr, 1);\n\t\t\t\t\tfunc.voidTag();\n\t\t\t\t} else {\n\t\t\t\t\tfunc.openTag(tagName, attr);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t//http://jsperf.com/object-key-vs-array-indexof-lookup/6\n\t//var events = ' scroll change click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste '\n\tvar EVENTS = {\n\t\tscroll: 1, change: 1, input: 1, click: 1, dblclick: 1,\n\t\tmousedown: 1, mouseup: 1, mouseover: 1, mouseout: 1, mousemove: 1, mouseenter: 1, mouseleave: 1,\n\t\tkeydown: 1, keyup: 1, keypress: 1,\n\t\tsubmit: 1, focus: 1, blur: 1,\n\t\tcopy: 1, cut: 1, paste: 1\n\t};\n\n\t//no unicode supportedgit\n\t// var valid_chr = '_$abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\t// var VALID_CHARS = {\"_\":1,\"$\":1,\"a\":1,\"b\":1,\"c\":1,\"d\":1,\"e\":1,\"f\":1,\"g\":1,\"h\":1,\"i\":1,\"j\":1,\"k\":1,\"l\":1,\"m\":1,\"n\":1,\"o\":1,\"p\":1,\"q\":1,\"r\":1,\"s\":1,\"t\":1,\"u\":1,\"v\":1,\"w\":1,\"x\":1,\"y\":1,\"z\":1,\"A\":1,\"B\":1,\"C\":1,\"D\":1,\"E\":1,\"F\":1,\"G\":1,\"H\":1,\"I\":1,\"J\":1,\"K\":1,\"L\":1,\"M\":1,\"N\":1,\"O\":1,\"P\":1,\"Q\":1,\"R\":1,\"S\":1,\"T\":1,\"U\":1,\"V\":1,\"W\":1,\"X\":1,\"Y\":1,\"Z\":1};\n\n\t// minimal stripped down html parser\n\tfunction parseHTML(html, func) {\n\t\tif (!html) { return; }\n\t\tvar prevPos = 0;\n\t\tif (html[1] === '?' && html[0] === '<') {\n\t\t\tprevPos = html.indexOf('?', 2);\n\t\t\tif (prevPos >= 1) {\n\t\t\t\tprevPos += 2;\n\t\t\t\tfunc.text(html.substring(0, prevPos));\n\t\t\t} else {\n\t\t\t\tprevPos = 0;\n\t\t\t}\n\t\t}\n\t\tvar pos = html.indexOf('<', prevPos);\n\t\tdo {\n\t\t\tif (html[pos] === '<') {\n\t\t\t\tpos++;\n\t\t\t\tif (html[pos] === '/') {\n\t\t\t\t\tprevPos = ++pos;\n\t\t\t\t\tpos = html.indexOf('>', prevPos);\n\t\t\t\t\t//close tag must be like , but not
\n\t\t\t\t\t// console.log(['closetag', prevPos, pos, html.substring(prevPos, pos)])\n\t\t\t\t\tfunc.closeTag(html.substring(prevPos, pos));\n\t\t\t\t} else if (html[pos] === '!') {\n\t\t\t\t\tprevPos = pos;\n\t\t\t\t\tpos = html.indexOf('-->', prevPos);\n\t\t\t\t\t//console.log(['comment', prevPos, pos, html.substring(prevPos, pos + 2)]);\n\t\t\t\t\tfunc.comment(html.substring(prevPos, pos + 2));\n\t\t\t\t\tpos += 2;\n\t\t\t\t} else {\n\t\t\t\t\tprevPos = pos;\n\t\t\t\t\tpos = html.indexOf('>', prevPos);\n\t\t\t\t\t// console.log(['opentag', prevPos, pos, html.substring(prevPos, pos), parseAttr(html.substring(prevPos, pos))])\n\t\t\t\t\tparseAttr(html.substring(prevPos, pos), func);\n\t\t\t\t}\n\t\t\t} else if (html[pos] === '>') { //&& html[pos + 1] !== '<'\n\t\t\t\tprevPos = ++pos;\n\t\t\t\tpos = html.indexOf('<', prevPos);\n\t\t\t\tif (pos > prevPos) {\n\t\t\t\t\t// console.log(['text', prevPos, pos, html.substring(prevPos, pos)])\n\t\t\t\t\tfunc.text(html.substring(prevPos, pos));\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tif (prevPos === 0 && pos < 0 && html) {\n\t\t\t\t\tfunc.text(html);\n\t\t\t\t} else {\n\t\t\t\t\t/** */console.error('Parse ERR?', [prevPos, pos, html, html.substring(prevPos, pos), html.slice(pos)]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t} while (pos > 0);\n\t}\n\n\t//diff and patch dom with exact same structure\n\tfunction diff1(prevKey, html2) {\n\t\tvar html1 = doTA.H[prevKey];\n\t\tvar prevPos1 = 0, pos1 = html1.indexOf('<');\n\t\tvar prevPos2 = 0, pos2 = html2.indexOf('<');\n\t\tvar tagId = '', elem, part1, part2;\n\t\tvar posx, endPosx;\n\n\t\tdo {\n\t\t\tif (html1[pos1] === \"<\") {\n\t\t\t\tpos1++;\n\t\t\t\tpos2++;\n\t\t\t\tif (html1[pos1] === \"/\" || html1[pos1] === \"!\") {\n\t\t\t\t\t//don't patch comment node and close tag.\n\t\t\t\t\tpos1 = html1.indexOf('>', pos1);\n\t\t\t\t\tpos2 = html2.indexOf('>', pos2);\n\t\t\t\t} else {\n\t\t\t\t\tprevPos1 = pos1;\n\t\t\t\t\tprevPos2 = pos2;\n\t\t\t\t\tpos1 = html1.indexOf('>', prevPos1);\n\t\t\t\t\tpos2 = html2.indexOf('>', prevPos2);\n\t\t\t\t\tpart1 = html1.substring(prevPos1, pos1);\n\t\t\t\t\tpart2 = html2.substring(prevPos2, pos2);\n\t\t\t\t\t//attributes\n\t\t\t\t\tif (part1 !== part2) {\n\t\t\t\t\t\t// console.log('openTag', [part1, part2])\n\t\t\t\t\t\ttagId = parsePatchAttr(part1, part2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\t//record id\n\t\t\t\t\t\t//tagId = getTagId(part1);\n\t\t\t\t\t\tposx = part1.indexOf(' id=\"');\n\t\t\t\t\t\t0 <= posx && (posx += 5, endPosx = part1.indexOf('\"', posx), tagId = part1.substring(posx, endPosx)); //jshint ignore: line\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t//text node\n\t\t\t} else if (html1[pos1] === '>') {\n\t\t\t\tprevPos1 = ++pos1;\n\t\t\t\tprevPos2 = ++pos2;\n\n\t\t\t\tpos1 = html1.indexOf('<', prevPos1);\n\t\t\t\tpos2 = html2.indexOf('<', prevPos2);\n\t\t\t\t//textNode, only support firstChild here\n\t\t\t\tif (pos2 > prevPos2) {\n\t\t\t\t\tvar text1 = html1.substring(prevPos1, pos1);\n\t\t\t\t\tvar text2 = html2.substring(prevPos2, pos2);\n\t\t\t\t\tif (text1 !== text2) {\n\t\t\t\t\t\telem = document.getElementById(tagId);\n\t\t\t\t\t\tif (elem) {\n\t\t\t\t\t\t\tif (elem.firstChild && elem.firstChild.nodeType === 3) {\n\t\t\t\t\t\t\t\t// console.log('textApplied', [text1, text2]);\n\t\t\t\t\t\t\t\telem.firstChild.nodeValue = text2;\n\t\t\t\t\t\t\t} //else to log something?\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.log('tag not found', [tagId]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t} while(pos1 > 0);\n\t}\n\n\t// find position of outerHTML end\n\t// this function will be inline during building\n\tfunction getOuterHTMLEnd(HTML, START_POS) {\n\t\tvar LVL = 1, POS = START_POS;\n\t\tfor(;;) {\n\t\t\tPOS = HTML.indexOf('>', POS);\n\t\t\tif (HTML[POS - 1] === '/') { //self closing\n\t\t\t\tLVL--;\n\t\t\t\tif (LVL <= 0) break;\n\t\t\t}\n\t\t\tPOS = HTML.indexOf('<', POS);\n\t\t\tif (HTML[POS + 1] === '/') {\n\t\t\t\tLVL--;\n\t\t\t\tif (LVL <= 0) {\n\t\t\t\t\tPOS = HTML.indexOf('>', POS + 2);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else if (HTML[POS + 1] !== '!') {\n\t\t\t\tLVL++;\n\t\t\t}\n\t\t\t// console.log('LVL', LVL);\n\t\t}\n\n\t\t// console.log('getOutHTML', tagName, [tagName, pos2, pos2, ])\n\t\treturn ++POS;\n\t}\n\n\t// FlatDOM: diff html as text and patch dom nodes\n\tfunction diff2(prevKey, html2) {\n\t\tvar html1 = doTA.H[prevKey];\n\t\tvar prevPos1 = 0, pos1 = html1.indexOf('<');\n\t\tvar prevPos2 = 0, pos2 = html2.indexOf('<');\n\t\tvar tagId1, tagId2, elem1, part1, part2;\n\t\t// var tagNo1 = 0, tagNo2 = 0;\n\t\tvar tagStartPos1, tagStartPos2;\n\t\tvar LVL; //this is needed for fnInline\n\t\t// console.log(html1);\n\t\t// console.log(html2);\n\n\t\tfor (;;) {\n\t\t\t// console.log('before', [dirty1, dirty2], [tagId1, tagId2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\tif (pos1 >= 0) {\n\t\t\t\tpos1 = html1.indexOf(' id=\"', pos1);\n\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\tprevPos1 = pos1 + 5;\n\t\t\t\t\tpos1 = html1.indexOf('\"', prevPos1);\n\t\t\t\t\ttagId1 = html1.substring(prevPos1, pos1);\n\t\t\t\t\t// tagNo1 = tagId1^0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log('middle', [tagId1, tagId2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\tif (pos2 >= 0) {\n\t\t\t\tpos2 = html2.indexOf(' id=\"', pos2);\n\t\t\t\tif (pos2 > 0) {\n\t\t\t\t\tprevPos2 = pos2 + 5;\n\t\t\t\t\tpos2 = html2.indexOf('\"', prevPos2);\n\t\t\t\t\ttagId2 = html2.substring(prevPos2, pos2);\n\t\t\t\t\t// tagNo2 = tagId2^0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log('after', [dirty1, dirty2], [tagId1, tagId2],\n\t\t\t//\t [pos1, pos2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\t//exist inifite loop\n\t\t\tif (pos1 < 0 || pos2 < 0) break;\n\n\t\t\t//same node\n\t\t\tif (tagId1 === tagId2) {\n\t\t\t\ttagStartPos1 = ++pos1;\n\t\t\t\tpos1 = html1.indexOf('>', pos1);\n\t\t\t\tpart1 = html1.substring(tagStartPos1, pos1);\n\n\t\t\t\ttagStartPos2 = ++pos2;\n\t\t\t\tpos2 = html2.indexOf('>', pos2);\n\t\t\t\tpart2 = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t// console.log('same node', [part1, part2]);\n\n\t\t\t\t//attr really different\n\t\t\t\tif (part1 !== part2) {\n\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\tif (elem1) {\n\t\t\t\t\t\t//nodes to be inserted or deleted\n\t\t\t\t\t\tif ((part1.substr(1, 6) === 'hidden') !== (part2.substr(1, 6) === 'hidden')) {\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\t// tagStartPos1 = html1.lastIndexOf('<', pos1 - 6);\n\t\t\t\t\t\t\t// console.warn('replaceChild', [tagId2, tagId1], [\n\t\t\t\t\t\t\t//\t html2.substring(tagStartPos2, getOuterHTMLEnd(html2, tagStartPos2)),\n\t\t\t\t\t\t\t//\t html1.substring(tagStartPos1, getOuterHTMLEnd(html1, pos1))]);\n\n\t\t\t\t\t\t\telem1.parentNode.replaceChild(newNode.firstChild, elem1);\n\n\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\n\t\t\t\t\t\t//only attribute changes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsePatchAttr(part1, part2, elem1);\n\t\t\t\t\t\t\t// console.warn('patch node', [tagId1, tagId2], [pos1, pos2], [tagStartPos1, tagStartPos2], [part1, part2])\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error('elem not found', [tagId1, tagId2], [part1, part2]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t//clear node for textNode\n\t\t\t\t\telem1 = void 0;\n\t\t\t\t}\n\n\t\t\t\t//if blank text node, skip early\n\t\t\t\tif (html1[pos1 + 1] === '<' && html2[pos2 + 1] === '<') {\n\t\t\t\t\tpos1++;\n\t\t\t\t\tpos2++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tprevPos1 = pos1;\n\t\t\t\tpos1 = html1.indexOf('<', prevPos1);\n\t\t\t\tpart1 = html1.substring(prevPos1 + 1, pos1);\n\t\t\t\tprevPos2 = pos2;\n\t\t\t\tpos2 = html2.indexOf('<', prevPos2);\n\t\t\t\tpart2 = html2.substring(prevPos2 + 1, pos2);\n\n\t\t\t\t//for text node really diff\n\t\t\t\tif (part1 !== part2) {\n\t\t\t\t\t// console.log('text diff', [tagId1, tagId2], [part1, part2]);\n\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\tconsole.error('node not found', [tagId1, tagId2], [part1, part2], [html1.substr(pos1, 15), html2.substr(pos2, 15)], [html1, html2]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// console.log('part1,2', [part1, part2]);\n\t\t\t\t\tif (elem1.firstChild) {\n\t\t\t\t\t\t//overwrite textNode value\n\t\t\t\t\t\tif (elem1.firstChild.nodeType === 3) {\n\t\t\t\t\t\t\telem1.firstChild.nodeValue = part2;\n\t\t\t\t\t\t\t// console.warn('textNode overwritten', elem1, elem1.firstChild)\n\n\t\t\t\t\t\t//not textNode, so, insertBefore\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem1.insertBefore(document.createTextNode(part2), elem1.firstChild);\n\t\t\t\t\t\t\t// console.warn('textNode inserted', elem1, elem1.firstChild)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t//no childNodes, so append one\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem1.appendChild(document.createTextNode(part2));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tconsole.error(\"different Id - not supported for now!\", [tagId1, tagId2]);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t} //infinite loop\n\n\t}\n\n\t// diff3: no place holder nodes\n\tfunction diff3(prevKey, html2) {\n\t\tvar html1 = doTA.H[prevKey];\n\t\tvar part1, part2, elem1;\n\t\tvar prevPos1, lastPos1, pos1 = html1.indexOf('<');\n\t\tvar prevPos2, lastPos2, pos2 = html2.indexOf('<');\n\t\tvar tagId1, tagId2, prevTagId1, prevTagId2;\n\t\tvar tagNo1, tagNo2, subNo1, subNo2, dotPos1, dotPos2;\n\t\tvar tagStartPos1, tagStartPos2;\n\t\tvar LVL; // jshint ignore:line\n\t\t// console.log(html1);\n\t\t// console.log(html2);\n\t\t// var logger = [];\n\n\t\tfor (;;) {\n\t\t\t// console.log('before', [dirty1, dirty2], [tagId1, tagId2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\tif (pos1 >= 0) {\n\t\t\t\tlastPos1 = pos1;\n\t\t\t\tpos1 = html1.indexOf(' id=\"', pos1);\n\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\tprevPos1 = pos1 + 5;\n\t\t\t\t\tpos1 = html1.indexOf('\"', prevPos1);\n\t\t\t\t\tprevTagId1 = tagId1;\n\t\t\t\t\ttagId1 = html1.substring(prevPos1, pos1);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log('middle', [tagId1, tagId2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\tif (pos2 >= 0) {\n\t\t\t\tlastPos2 = pos2;\n\t\t\t\tpos2 = html2.indexOf(' id=\"', pos2);\n\t\t\t\tif (pos2 > 0) {\n\t\t\t\t\tprevPos2 = pos2 + 5;\n\t\t\t\t\tpos2 = html2.indexOf('\"', prevPos2);\n\t\t\t\t\tprevTagId2 = tagId2;\n\t\t\t\t\ttagId2 = html2.substring(prevPos2, pos2);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// console.log('after', [dirty1, dirty2], [tagId1, tagId2],\n\t\t\t//\t [pos1, pos2], [html1.substr(pos1, 20), html2.substr(pos2, 20)]);\n\n\t\t\t//exist infinite loop\n\t\t\tif (pos1 < 0 && pos2 < 0) break;\n\n\t\t\t//same node\n\t\t\tif (tagId1 === tagId2) {\n\t\t\t\ttagStartPos1 = ++pos1;\n\t\t\t\tpos1 = html1.indexOf('>', pos1);\n\t\t\t\tpart1 = html1.substring(tagStartPos1, pos1);\n\n\t\t\t\ttagStartPos2 = ++pos2;\n\t\t\t\tpos2 = html2.indexOf('>', pos2);\n\t\t\t\tpart2 = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t// console.log('same node', [part1, part2]);\n\n\t\t\t\t//attr really different\n\t\t\t\tif (part1 !== part2) {\n\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\tif (elem1) {\n\t\t\t\t\t\t//nodes to be inserted or deleted\n\t\t\t\t\t\tif ((part1.substr(1, 6) === 'hidden') !== (part2.substr(1, 6) === 'hidden')) {\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\t// tagStartPos1 = html1.lastIndexOf('<', pos1 - 6);\n\t\t\t\t\t\t\t// console.warn('replaceChild', [tagId2, tagId1], [\n\t\t\t\t\t\t\t//\t html2.substring(tagStartPos2, getOuterHTMLEnd(html2, tagStartPos2)),\n\t\t\t\t\t\t\t//\t html1.substring(tagStartPos1, getOuterHTMLEnd(html1, pos1))]);\n\n\t\t\t\t\t\t\telem1.parentNode.replaceChild(newNode.firstChild, elem1);\n\n\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\n\t\t\t\t\t\t//only attribute changes\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsePatchAttr(part1, part2, elem1);\n\t\t\t\t\t\t\t// console.warn('patch node', [tagId1, tagId2], [pos1, pos2], [tagStartPos1, tagStartPos2], [part1, part2])\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.error('elem not found', [tagId1, tagId2], [part1, part2]);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t//clear node for textNode\n\t\t\t\t\telem1 = void 0;\n\t\t\t\t}\n\n\t\t\t\t//if blank text node, skip early\n\t\t\t\tif (html1[pos1 + 1] === '<' && html2[pos2 + 1] === '<') {\n\t\t\t\t\tpos1++;\n\t\t\t\t\tpos2++;\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tprevPos1 = pos1;\n\t\t\t\tpos1 = html1.indexOf('<', prevPos1);\n\t\t\t\tpart1 = html1.substring(prevPos1 + 1, pos1);\n\t\t\t\tprevPos2 = pos2;\n\t\t\t\tpos2 = html2.indexOf('<', prevPos2);\n\t\t\t\tpart2 = html2.substring(prevPos2 + 1, pos2);\n\n\t\t\t\t//for text node really diff\n\t\t\t\tif (part1 !== part2) {\n\t\t\t\t\t// console.log('text diff', [tagId1, tagId2], [part1, part2]);\n\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\tconsole.error('node not found', [tagId1, tagId2], [part1, part2], [html1.substr(pos1, 15), html2.substr(pos2, 15)], [html1, html2]);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// console.log('part1,2', [part1, part2]);\n\t\t\t\t\tif (elem1.firstChild) {\n\t\t\t\t\t\t//overwrite textNode value\n\t\t\t\t\t\tif (elem1.firstChild.nodeType === 3) {\n\t\t\t\t\t\t\telem1.firstChild.nodeValue = part2;\n\t\t\t\t\t\t\t// console.warn('textNode overwritten', elem1, elem1.firstChild)\n\n\t\t\t\t\t\t//not textNode, so, insertBefore\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telem1.insertBefore(document.createTextNode(part2), elem1.firstChild);\n\t\t\t\t\t\t\t// console.warn('textNode inserted', elem1, elem1.firstChild)\n\t\t\t\t\t\t}\n\n\t\t\t\t\t//no childNodes, so append one\n\t\t\t\t\t} else {\n\t\t\t\t\t\telem1.appendChild(document.createTextNode(part2));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t//when id is different\n\t\t\t} else {\n\n\t\t\t\tdotPos1 = tagId1.indexOf('.');\n\t\t\t\ttagNo1 = tagId1.slice(0, dotPos1) ^ 0;\n\t\t\t\tdotPos2 = tagId1.indexOf('.', ++dotPos1);\n\t\t\t\tsubNo1 = dotPos2 > 0 && tagId1.slice(dotPos1, dotPos2) ^ 0;\n\n\t\t\t\tdotPos2 = tagId2.indexOf('.');\n\t\t\t\ttagNo2 = tagId2.slice(0, dotPos2) ^ 0;\n\t\t\t\tdotPos1 = tagId2.indexOf('.', ++dotPos2);\n\t\t\t\tsubNo2 = dotPos1 > 0 && tagId2.slice(dotPos2, dotPos1) ^ 0;\n\n\t\t\t\tif (prevTagId1 === prevTagId2 && pos1 > 0 && pos2 > 0) {\n\n\t\t\t\t\t//[\"6.1\", \"5.7.1\"] [\"5.6.1\", \"5.6.1\"]\n\t\t\t\t\t//horizontal scroll left to right, appending nodes\n\t\t\t\t\tif (tagNo1 > tagNo2) {\n\n\t\t\t\t\t\t//removeChild bottom down 111.1 [\"111.1\", \"16.1\"] [\"15.6.1\", \"15.6.1\"] [10070, 2106]\n\t\t\t\t\t\tif (subNo2) {\n\t\t\t\t\t\t\t//[\"146.1\", \"145.12681.1\"] [\"145.1\", \"145.1\"] [\"
0.7734284962061793
\"]\n\t\t\t\t\t\t\t//[\"116.1\", \"115.12.1\"] [\"115.11.1\", \"115.11.1\"] [\"
\"]\n\t\t\t\t\t\t\telem1 = document.getElementById(tagNo2 + '.' + prevKey);\n\t\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\t\t//resize bottom down - bigger\n\t\t\t\t\t\t\t\t//[111, 15] [false, false] [\"111.1\", \"15.1\"] [\"14.6.1\", \"14.6.1\"] [1896, 1871]\n\t\t\t\t\t\t\t\tconsole.error(\"no existing node 5\", [tagId1, tagId2], [prevTagId1, prevTagId2], [subNo1, subNo2], [pos1, pos2]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\t\telem1.appendChild(newNode.firstChild);\n\t\t\t\t\t\t\t\t// console.info(\"prevTagId2.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\t\tpos1 = lastPos1;\n\t\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//not impl [\"111.1\", \"15.1\"] [\"14.6.1\", \"14.6.1\"] [1896, 1871]\n\t\t\t\t\t\t// [\"36.1\", \"111.1\"] [\"35.6.1\", \"35.6.1\"] [6872, 6897]\n\t\t\t\t\t\t} else if (!subNo1) { //&& !subNo2\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\telem1 = document.getElementById(prevTagId2.slice(0, prevTagId2.indexOf('.') + 1) + prevKey);\n\t\t\t\t\t\t\telem1.parentNode.appendChild(newNode.firstChild);\n\t\t\t\t\t\t\t// console.info(\"prevTagId2.parentNode.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [subNo1, subNo2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\tpos1 = lastPos1;\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn(\"not impl\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t// [5, 6] [24, false] [\"5.24.1\", \"6.1\"] [\"5.23.1\", \"5.23.1\"] [673, 770]\n\t\t\t\t\t} else if (tagNo1 < tagNo2) {\n\n\t\t\t\t\t\t// [5, 6] [24, false] [\"5.24.1\", \"6.1\"] [\"5.23.1\", \"5.23.1\"] [673, 770]\n\t\t\t\t\t\t//\t[\"35.1\", \"111.1\"] [\"34.6.1\", \"34.6.1\"] [6961, 6986]\n\t\t\t\t\t\tif (!subNo2) {\n\t\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\t\tconsole.warn(\"no existing node 4\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telem1.parentNode.removeChild(elem1);\n\t\t\t\t\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// console.warn(\"removeChild bottom down\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t\t\t// logger.push([\"removeChild[first]\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [html2.substring(tagStartPos2, pos2)]]);\n\t\t\t\t\t\t\t\tpos2 = lastPos2;\n\t\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn(\"not impl\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t//same level\n\t\t\t\t\t} else if (tagNo1 === tagNo2) {\n\n\t\t\t\t\t\t// [5, 5] [1, 2] [\"5.1.1\", \"5.2.1\"] [\"5.1\", \"5.1\"] [229, 227]\n\t\t\t\t\t\tif ( subNo1 < subNo2 ) {\n\t\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\t\tconsole.warn([\"no existing node 4\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telem1.parentNode.removeChild(elem1);\n\t\t\t\t\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// console.warn(\"removeChild bottom down\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t\t\t// logger.push([\"removeChild[backward.last]\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [html2.substring(tagStartPos2, pos2)]]);\n\t\t\t\t\t\t\t\tpos2 = lastPos2;\n\t\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//[5, 5] [19, 18] [\"5.19.1\", \"5.18.1\"] [\"5.1\", \"5.1\"] [229, 231]\n\t\t\t\t\t\t} else if ( subNo1 > subNo2 ) {\n\t\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\telem1.parentNode.insertBefore(newNode.firstChild, elem1);\n\t\t\t\t\t\t\t// logger.push([\"this.insertBefore[elem1]\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]]);\n\n\t\t\t\t\t\t\tpos1 = lastPos1;\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2; //check later\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('not impl', [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t} //same parent\n\t\t\t\t\telse {\n\t\t\t\t\t\tconsole.warn('not impl', [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t}\n\n\t\t\t\t} //prevTagId1 === prevTagId2\n\n\n\n\t\t\t\t//end of previous html\n\t\t\t\telse if (pos1 < 0) {\n\n\t\t\t\t\t// ######## [\"28.9.1\", \"28.10.1\"] [\"28.8.1\", \"28.9.1\"] [-1, 16911]\n\t\t\t\t\tif ( tagNo1 === tagNo2) {\n\n\t\t\t\t\t\t// [\"28.9.1\", \"28.10.1\"] [\"28.8.1\", \"28.9.1\"] [-1, 16911]\n\t\t\t\t\t\tif (subNo1 < subNo2 ) {\n\t\t\t\t\t\t\telem1 = document.getElementById(tagNo2 + '.' + prevKey);\n\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\telem1.appendChild(newNode.firstChild);\n\t\t\t\t\t\t\t// console.info(\"this.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('not impl', [tagNo1, tagNo2], [subNo1, subNo2], [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else if (tagNo1 < tagNo2) {\n\n\t\t\t\t\t\t//prevTagId2 is a children\n\t\t\t\t\t\t// [126, 127] [66, false] [\"126.66.1\", \"127.1\"] [\"126.61.1\", \"126.66.1\"] [-1, 13065]\n\t\t\t\t\t\tif (prevTagId2.indexOf('.') !== prevTagId2.lastIndexOf('.')) {\n\t\t\t\t\t\t\t//not impl1 pos1 < 0 [14, 15] [6, false] [\"14.6.1\", \"15.1\"] [\"14.6.1\", \"14.6.1\"] [-1, 1950]\n\t\t\t\t\t\t\telem1 = document.getElementById(prevTagId2.slice(0, prevTagId2.indexOf('.') + 1) + prevKey);\n\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\t\t\t\t\t\t\t// console.info(\"prevTagId2.parent.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\telem1.parentNode.appendChild(newNode.firstChild);\n\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t//this is children but prevTagId2 is parent\n\t\t\t\t\t\t//not impl [143, 144] [false, 499946] [\"143.1\", \"144.499946.1\"] [\"143.1\", \"144.1\"] [-1, 37542]\n\t\t\t\t\t\t} else if (subNo2) {\n\t\t\t\t\t\t\telem1 = document.getElementById(prevTagId2);\n\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\t\t\t\t\t\t\t// console.info(\"prevTagId2.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\telem1.appendChild(newNode.firstChild);\n\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t//this and prevTagId2 is not children\n\t\t\t\t\t\t//not impl [125, 126] [false, false] [\"125.1\", \"126.1\"] [\"125.1\", \"125.1\"] [-1, 3444] [\" class=\"row odd blue\" row=\"5\">
\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\t\t\t\t\t\t\t// console.info(\"prevTagId2.parent.appendChild\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\n\t\t\t\t\t\t\telem1.parentNode.appendChild(newNode.firstChild);\n\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t// console.warn('not impl', [tagNo1, tagNo2], [subNo1, subNo2], [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('not impl', [tagNo1, tagNo2], [subNo1, subNo2], [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\n\t\t\t\t//end of new html\n\t\t\t\telse if (pos2 < 0) {\n\n\t\t\t\t\t//same base id\n\t\t\t\t\tif (tagNo1 === tagNo2) {\n\n\t\t\t\t\t\t// [28, 28] [undefined, 13] [\"28.1\", \"28.13.1\"] [\"28.1\", \"28.1\"] [-1, 12127]\n\t\t\t\t\t\tif (subNo1 < subNo2) {\n\t\t\t\t\t\t\telem1 = document.getElementById(prevTagId2);\n\n\t\t\t\t\t\t\ttagStartPos2 = html2.lastIndexOf('<', pos2 - 6);\n\t\t\t\t\t\t\tLVL=1,pos2=tagStartPos2;for(;;){pos2=html2.indexOf(\">\",pos2);if(\"/\"===html2.charAt(pos2-1)&&(LVL--,0>=LVL))break;pos2=html2.indexOf(\"<\",pos2);if(\"/\"===html2.charAt(pos2+1)){if(LVL--,0>=LVL){pos2=html2.indexOf(\">\",pos2+2);break}}else\"!\"!==html2.charAt(pos2+1)&&LVL++}pos2++; //INLINE\n\t\t\t\t\t\t\tnewNode.innerHTML = html2.substring(tagStartPos2, pos2);\n\n\t\t\t\t\t\t\telem1.appendChild(newNode.firstChild);\n\t\t\t\t\t\t\t// logger.push([\"appendChild[parent.last]2<0\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]]);\n\n\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t//[28, 28] [27, 26] [\"28.27.1\", \"28.26.1\"] [\"28.26.1\", \"28.25.1\"] [12548, -1]\n\t\t\t\t\t\t} else if (subNo1 > subNo2) {\n\n\t\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\t\tif (!elem1) {\n\t\t\t\t\t\t\t\tconsole.warn([\"no existing node 4\", [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\telem1.parentNode.removeChild(elem1);\n\t\t\t\t\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t// console.warn(\"removeChild bottom down\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\n\t\t\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconsole.warn('not impl3 pos2 < 0', [tagNo1, tagNo2], [subNo1, subNo2], [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2], [html2.substring(tagStartPos2, pos2)]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t//not impl [\"146.1\", \"145.66.1\"] [\"145.66.1\", \"145.61.1\"] [39591, -1]\n\t\t\t\t\t//not impl [\"145.1\", \"144.66.1\"] [\"144.66.1\", \"144.61.1\"] [38200, -1]\n\t\t\t\t\t//not impl [\"144.1\", \"143.66.1\"] [\"143.66.1\", \"143.61.1\"] [36747, -1]\n\t\t\t\t\t//resize bottom up - make smaller\n\t\t\t\t\t} else if (tagNo1 > tagNo2) {\n\t\t\t\t\t\telem1 = document.getElementById(tagId1);\n\t\t\t\t\t\telem1.parentNode.removeChild(elem1);\n\t\t\t\t\t\tif (pos1 > 0) {\n\t\t\t\t\t\t\tLVL=1,pos1=pos1;for(;;){pos1=html1.indexOf(\">\",pos1);if(\"/\"===html1.charAt(pos1-1)&&(LVL--,0>=LVL))break;pos1=html1.indexOf(\"<\",pos1);if(\"/\"===html1.charAt(pos1+1)){if(LVL--,0>=LVL){pos1=html1.indexOf(\">\",pos1+2);break}}else\"!\"!==html1.charAt(pos1+1)&&LVL++}pos1++; //INLINE\n\t\t\t\t\t\t}\n\t\t\t\t\t\t// console.warn(\"removeChild bottom down\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t\t// logger.push([\"removeChild[backward.last]\", tagId1, [tagId1, tagId2], [prevTagId1, prevTagId2], [html2.substring(tagStartPos2, pos2)]]);\n\n\t\t\t\t\t\ttagId1 = prevTagId1;\n\t\t\t\t\t\ttagId2 = prevTagId2;\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t} else {\n\t\t\t\t\t\tconsole.warn('not impl', [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t////////////// THIS SHOULD NEVER REACH ///////////////\n\n\t\t\t\t// console.log('====')\n\t\t\t\t// logger.slice(-10).forEach(function(item){\n\t\t\t\t//\t console.info.apply(console, item)\n\t\t\t\t// })\n\t\t\t\tconsole.error(\"different Id - not supported for now!\", [tagNo1, tagNo2], [subNo1, subNo2], [tagId1, tagId2], [prevTagId1, prevTagId2], [pos1, pos2]);\n\t\t\t\tconsole.log([html1.substr(pos1 - 100, 100), html1.substr(pos1, 20)]);\n\t\t\t\tconsole.log([html2.substr(pos2 - 100, 100), html2.substr(pos2, 20)]);\n\t\t\t\t// console.log(html1);\n\t\t\t\t// console.log(html2)\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t} //infinite loop\n\n\t}\n\n\tvar camelCaseRE = /-(.)/g;\n\tfunction camelCase(str) {\n\t\treturn str.replace(camelCaseRE, function($0, $1){ return $1.toUpperCase(); });\n\t}\n\n\t// parse attributes from html open tag and patch DOM when different\n\tfunction parsePatchAttr(chunkA, chunkB, elem) {\n\t\tvar tagId;\n\t\tvar posA1, posA2, posB1, posB2;\n\t\tvar posDiff = 0;\n\t\tvar attrName, attrVal1, attrVal2;\n\t\t// var len1 = chunk1.length;\n\t\t// console.log('chunks', [chunkA, chunkB]);\n\n\t\t//extract id to tag, if no elem specified\n\t\tif (!elem) {\n\t\t\tposA1 = chunkA.indexOf(' id=\"', posA1);\n\t\t\tif (posA1 >= 0) {\n\t\t\t\tposA1 += 5;\n\t\t\t\tposA2 = chunkA.indexOf('\"', posA1);\n\t\t\t\ttagId = chunkA.slice(posA1, posA2);\n\t\t\t\telem = document.getElementById(tagId);\n\t\t\t\tif (!elem) {\n\t\t\t\t\tthrow console.error('tag not found', [posA1, posA2, tagId, elem, chunkA, chunkB]);\n\t\t\t\t}\n\t\t\t\tposA2 += 2;\n\t\t\t} else {\n\t\t\t\tthrow console.error('id not found', [posA1, posA1, chunkA, chunkB]);\n\t\t\t}\n\t\t} else {\n\t\t\t//first char is always space\n\t\t\tposA2 = 1;\n\t\t}\n\n\t\tfor(;;) {\n\t\t\t//attr name\n\t\t\tposA1 = chunkA.indexOf('=\"', posA2);\n\t\t\tif (posA1 < 0) break;\n\t\t\tattrName = chunkA.slice(posA2, posA1);\n\n\t\t\t//attr values\n\t\t\tposA2 = chunkA.indexOf('\"', posA1 + 2);\n\t\t\tattrVal1 = chunkA.slice(posA1 + 2, posA2);\n\n\t\t\tposB1 = posA1 + posDiff;\n\t\t\tposB2 = chunkB.indexOf('\"', posB1 + 2);\n\t\t\tattrVal2 = chunkB.slice(posB1 + 2, posB2);\n\n\t\t\tif (attrVal1 !== attrVal2) {\n\t\t\t\t// value as property\n\t\t\t\tif (attrName === 'value') {\n\t\t\t\t\telem[attrName] = attrVal2;\n\n\t\t\t\t// prefix with - as property, like -scrollLeft\n\t\t\t\t} else if (attrName[0] === '-') {\n\t\t\t\t\t//only if old value is same is element property to prevent loop (firefox)\n\t\t\t\t\tif (elem[attrName.substr(1)] == attrVal1) {\n\t\t\t\t\t\telem[attrName.substr(1)] = attrVal2;\n\t\t\t\t\t}\n\t\t\t\t\t//console.log('prop-', attrName.substr(1), attrVal1, attrVal2, elem[attrName.substr(1)]);\n\n\t\t\t\t} else {\n\t\t\t\t\t\telem.setAttribute(attrName, attrVal2);\n\t\t\t\t}\n\t\t\t\tposDiff = posB2 - posA2;\n\n\t\t\t}\n\n\t\t\tposA2 += 2;\n\t\t}\n\n\t\treturn tagId;\n\t}\n\n\t// extract value of id from part of html open tag\n\t// only id=\"xxx\" supported, this is internal use, so it's always double-quotes\n\t// inline this function during building\n\tfunction getTagId(partial, start) {\n\t\tvar pos = partial.indexOf(' id=\"', start), endPos;\n\t\tif (pos >= 0) {\n\t\t\tpos += 5;\n\t\t\tendPos = partial.indexOf('\"', pos);\n\t\t\treturn partial.substring(pos, endPos);\n\t\t}\n\t}\n\n\t// split filters into array, take care of | and || as different\n\tfunction splitFilters(input, pos) {\n\t\tvar prevPos = 0;\n\t\tvar ret = [];\n\t\twhile (pos !== -1) {\n\t\t\tif (input[pos + 1] === '|') {\n\t\t\t\tpos += 2;\n\t\t\t} else {\n\t\t\t\tret.push(input.substring(prevPos, pos));\n\t\t\t\tprevPos = ++pos;\n\t\t\t}\n\t\t\tpos = input.indexOf('|', pos);\n\t\t}\n\t\tif (prevPos < input.length) {\n\t\t\tret.push(input.substr(prevPos));\n\t\t}\n\t\treturn ret;\n\t}\n\n\t// function parseStyle(styleObj) {\n\t// \tvar ret = '';\n\t// \tfor (var x in styleObj) {\n\t// \t\tret += x + ':' + styleObj[x] + ';';\n\t// \t}\n\t// \treturn ret;\n\t// }\n\n\t// ToDo: check compile performance with regex\n\tvar ngClassRegex = /('[^']+'|\"[^\"]+\"|[\\w$]+)\\s*:\\s*((?:[$.\\w]+|\\([^)]+\\)|[^},])+)/g;\n\tvar varOrStringRegex = /'[^']*'|\"[^\"]*\"|[\\w$]+|[^\\w$'\"]+/g;\n\tvar quotedStringRegex = /\"[^\"]*\"|'[^']*'/g;\n\tvar whiteSpaceRegex = /\\s{2,}|\\n/g;\n\tvar removeUnneededQuotesRegex = /\\b([\\w_-]+=)\"([^\"'=\\s<>]+)\"(?=[\\s>])/g;\n\t// var lazyNgAttrRegex = /^(?:src|alt|title|href)/;\n\tvar $indexRegex = /\\$index/g;\n\tvar $parent$indexRegex = /(?:\\$parent\\.)+\\$index/g;\n\n\t// no-val attributes, for more exhaustive list - https://github.com/kangax/html-minifier/issues/63\n\t//var noValAttrRegex = /^(?:checked|selected|disabled|readonly|multiple|required|hidden)/;\n\n\t// export as doTA.compile\n\tfunction compileHTML(template, options) {\n\t\toptions = options || {};\n\t\tvar val_mod = options.loose ? \"||''\" : '';\n\t\tvar VarMap = {\n\t\t\ttrue: 1, false: 1, null: 1, undefined: 1, this: 1, new: 1,\n\t\t\tdoTA: 1, $index: 1, S: 1, F: 1, $attr: 1, X: 1, K: 1, M: 1, N: 1,\n\t\t\tMath: 1, Date: 1, String: 1, Object: 1, Array: 1,\n\t\t\tlocation: 1, window: 1, _: 1\n\t\t\t// Infinity: 1, NaN: 1,\n\t\t\t// alert: 1, confirm: 1, prompt: 1,\n\t\t\t//var: 1, in: 1\n\t\t\t//void: 1,\n\t\t};\n\t\tvar level = 0, ngRepeatLevel;\n\t\tvar ngIfLevel, skipLevel, ngIfCounterTmp, ngIfLevels = [], ngIfLevelMap = {};\n\t\tvar LevelMap = {}, LevelVarMap = {};\n\t\tvar KeyMap = [], keyLevel = 0;\n\t\tvar WatchMap = {}, Watched;\n\t\tvar doTAPass, doTAContinue;\n\t\tvar compiledFn;\n\t\tvar uniqueId = doTA.getId(options.render);\n\t\tvar idHash = {};\n\t\tvar FnText = '';\n\t\t//options that need to repeatedly calling\n\t\tvar optWatchDiff = options.watchDiff;\n\t\tvar optDiffLevel = +options.diffLevel;\n\t\tvar optModel = options.model;\n\t\tvar optBind = options.bind;\n\t\tvar optEvent = options.event;\n\t\tvar optKey = options.key;\n\t\tvar optParams = options.params;\n\t\tvar optComment = +options.comment;\n\t\tvar optStrip = +options.strip;\n\n\t\tif (optKey) {\n\t\t\tFnText += indent(level) + \"var R='';\\n\";\n\t\t} else {\n\t\t\tFnText += indent(level) + \"var \" +\n\t\t\t(optWatchDiff ? 'M,N=1,' : '') +\n\t\t\t\"R='';\\n\"; //ToDO: check performance on var declaration\n\t\t}\n\n\t\t//clean up extra white spaces and line break\n\t\ttemplate = template.replace(whiteSpaceRegex, ' ');\n\n\t\tif (optStrip) {\n\t\t\tif (optStrip === 2) {\n\t\t\t\ttemplate = template.replace(/>\\s+/g, '>').replace(/\\s+\\s+<');\n\t\t\t}\n\t\t}\n\n\t\t// when encode is set, find strings and encode < and >, or parser will throw error.\n\t\tif (options.encode) {\n\t\t\ttemplate = template.replace(quotedStringRegex, function($0) {\n\t\t\t\treturn $0.replace(/[<>]/g, function($00) {\n\t\t\t\t\treturn {'>': '>', '<': '<'}[$00];\n\t\t\t\t});\n\t\t\t});\n\t\t}\n\n\t\t// attach plain variables to scope variables\n\t\tfunction attachScope(v) {\n\t\t\t//console.log(VarMap, [v]);\n\t\t\tif (v) {\n\t\t\t\t//var DEBUG = /error/.test(v);\n\t\t\t\t//DEBUG && console.log(11, [v]);\n\n\t\t\t\t//ToDo: still buggy, this need to improve\n\t\t\t\tvar vv = '';\n\t\t\t\tvar matches = v.match(varOrStringRegex);\n\t\t\t\tvar match, match0;\n\t\t\t\t//DEBUG && console.log(12, matches);\n\t\t\t\tfor(var i = 0; i < matches.length; i++) {\n\t\t\t\t\tmatch = matches[i];\n\t\t\t\t\tmatch0 = match[0];\n\t\t\t\t\tif (\n\t\t\t\t\t\t(match0 === '$' || match0 === '_' || (match0 >= 'a' && match0 <= 'z') || (match0 >= 'A' && match0 <= 'Z')) &&\n\t\t\t\t\t\t!VarMap[match] &&\n\t\t\t\t\t\t(!i || matches[i-1][matches[i-1].length-1] !== '.')\n\t\t\t\t\t\t) {\n\t\t\t\t\t\tvv += 'S.' + match;\n\t\t\t\t\t} else if (match.indexOf('$index') >= 0) {\n\t\t\t\t\t\t//only support last level for now\n\t\t\t\t\t\tvv += match.replace($indexRegex, LevelVarMap[ngRepeatLevel]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvv += match;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t//DEBUG && console.log(55, vv);\n\t\t\t\treturn vv;\n\t\t\t}\n\t\t\treturn v;\n\t\t}\n\n\t\t// escape single quotes with backslash\n\t\tfunction escapeSingleQuote(str) {\n\t\t\tvar quotePos = str.indexOf(\"'\");\n\t\t\tif (quotePos >= 0) {\n\t\t\t\tvar ret = '';\n\t\t\t\tvar prevQuotePos = 0;\n\t\t\t\tdo {\n\t\t\t\t\tret += str.substring(prevQuotePos, quotePos);\n\t\t\t\t\t//escaped quote\n\t\t\t\t\tif (str[quotePos - 1] !== '\\\\') {\n\t\t\t\t\t\tret += '\\\\';\n\t\t\t\t\t}\n\t\t\t\t\tprevQuotePos = quotePos;\n\t\t\t\t\tquotePos = str.indexOf(\"'\", prevQuotePos + 1);\n\t\t\t\t} while (quotePos > 0);\n\t\t\t\tret += str.substr(prevQuotePos);\n\t\t\t\treturn ret;\n\t\t\t} else {\n\t\t\t\treturn str;\n\t\t\t}\n\t\t}\n\n\t\t// interpolation\n\t\tfunction interpolate(str) {\n\t\t\tvar pos = str.indexOf('{{');\n\t\t\tif (pos >= 0) {\n\t\t\t\tvar prevPos = 0;\n\t\t\t\tvar ret = '';\n\t\t\t\tvar outsideStr, insideStr;\n\t\t\t\tdo {\n\t\t\t\t\toutsideStr = str.substring(prevPos, pos);\n\t\t\t\t\tret += escapeSingleQuote(outsideStr);\n\n\t\t\t\t\t//skip {{\n\t\t\t\t\tprevPos = pos + 2;\n\t\t\t\t\tpos = str.indexOf('}}', prevPos);\n\n\t\t\t\t\tinsideStr = str.substring(prevPos, pos);\n\t\t\t\t\tret += \"'+(\" + attachFilter(insideStr) + val_mod + \")+'\";\n\n\t\t\t\t\t//skip }} for next\n\t\t\t\t\tprevPos = pos + 2;\n\t\t\t\t\tpos = str.indexOf('{{', prevPos);\n\t\t\t\t} while (pos > 0);\n\n\t\t\t\t//remaining text outside interpolation\n\t\t\t\tret += escapeSingleQuote(str.substr(prevPos));\n\t\t\t\treturn ret;\n\t\t\t} else {\n\t\t\t\treturn escapeSingleQuote(str);\n\t\t\t}\n\t\t}\n\n\t\t// attach $filters\n\t\tfunction attachFilter($1) {\n\t\t\t//console.log(333,$1);\n\t\t\tvar pos = $1.indexOf('|');\n\t\t\tif (pos === -1) {\n\t\t\t\treturn attachScope($1);\n\t\t\t} else {\n\t\t\t\t//ToDo: check this line later\n\t\t\t\tvar v = splitFilters($1, pos);\n\t\t\t\tvar val = attachScope(v[0]);\n\t\t\t\tvar prevColonPos, colonPos;\n\t\t\t\tvar filter;\n\n\t\t\t\t//parse each filters\n\t\t\t\tfor(var i = 1; i < v.length; i++) {\n\t\t\t\t\tfilter = v[i];\n\t\t\t\t\tprevColonPos = 0;\n\n\t\t\t\t\tcolonPos = filter.indexOf(':');\n\t\t\t\t\t//filter with params\n\t\t\t\t\tif (colonPos > 0) {\n\t\t\t\t\t\tval = \"F('\" + filter.slice(prevColonPos, colonPos).trim() + \"')(\" + val;\n\t\t\t\t\t\tprevColonPos = ++colonPos;\n\t\t\t\t\t\tcolonPos = filter.indexOf(':', prevColonPos);\n\t\t\t\t\t\twhile (colonPos > 0) {\n\t\t\t\t\t\t\tval += ',' + attachScope(filter.slice(prevColonPos, colonPos));\n\t\t\t\t\t\t\tprevColonPos = ++colonPos;\n\t\t\t\t\t\t\tcolonPos = filter.indexOf(':', prevColonPos);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tval += ',' + attachScope(filter.substr(prevColonPos)) + ')';\n\n\t\t\t\t\t//filter without params\n\t\t\t\t\t} else {\n\t\t\t\t\t\tval = \"F('\" + filter.trim() + \"')(\" + val + ')';\n\t\t\t\t\t}\n\n\t\t\t\t}\n\t\t\t\treturn val;\n\t\t\t}\n\t\t}\n\n\t\tfunction apply$index(val) {\n\t\t\tvar count, tmpRepeatLevel;\n\n\t\t\tif (val.indexOf('$parent.$index') >= 0) {\n\t\t\t\ttmpRepeatLevel = ngRepeatLevel;\n\t\t\t\tval = val.replace($parent$indexRegex, function($0) {\n\t\t\t\t\tcount = $0.match(/\\$parent/g).length; //may need to rewrite with indexOf\n\t\t\t\t\twhile (count>0) {\n\t\t\t\t\t\twhile (tmpRepeatLevel >= 0 && LevelVarMap[--tmpRepeatLevel] === void 0) {}\n\t\t\t\t\t\t--count;\n\t\t\t\t\t}\n\t\t\t\t\treturn \"'+\" + LevelVarMap[tmpRepeatLevel] + \"+'\";\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (val.indexOf('$index') >= 0) {\n\t\t\t\treturn val.replace($indexRegex, \"'+\" + LevelVarMap[ngRepeatLevel] + \"+'\");\n\t\t\t}\n\t\t\treturn val;\n\t\t}\n\n\t\t//parse the element\n\t\tparseHTML(template, {\n\t\t\t//open tag with attributes\n\t\t\topenTag: function(tagName, attr, selfClosing) {\n\t\t\t\t// debug && console.log('openTag', [tagName, attr]);\n\t\t\t\tvar parsedAttr = {}, customId, noValAttr = '', attrClass = '';\n\t\t\t\tvar doTAPassThis, x;\n\n\t\t\t\t//skip parsing if dota-pass is specified (interpolation will still be expanded)\n\t\t\t\t// https://jsperf.com/hasownproperty-vs-in-vs-undefined/12\n\t\t\t\tif (attr['dota-pass'] !== void 0) {\n\t\t\t\t\tif (attr['dota-pass'] === 'this') {\n\t\t\t\t\t\tdoTAPass = doTAPassThis = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdoTAPass = level; doTAContinue = 0;\n\t\t\t\t\t}\n\t\t\t\t//re-enable dota parsing\n\t\t\t\t} else if (attr['dota-continue'] !== void 0) {\n\t\t\t\t\tdoTAContinue = level;\n\t\t\t\t\tattr['dota-continue'] = void 0;\n\t\t\t\t}\n\n\t\t\t\t//unless dota-pass or with dota-continue\n\t\t\t\tif (doTAPass === void 0 || doTAContinue) {\n\n\t\t\t\t\tif (optDiffLevel && attr.skip) {\n\t\t\t\t\t\tskipLevel = level;\n\t\t\t\t\t\tvar attrSkip = attr.skip;\n\t\t\t\t\t\tattr.skip = void 0;\n\t\t\t\t\t\tFnText += indent(level, 1) + 'var O'+ level + '=N+' + attrSkip + '; \\n';\n\t\t\t\t\t}\n\n\t\t\t\t\t//ng-repeat to while/for loop\n\t\t\t\t\tif (attr['ng-repeat']) {\n\t\t\t\t\t\t//console.log(21,[x], [val]);\n\t\t\t\t\t\tLevelMap[level] = LevelMap[level] ? LevelMap[level] + 1 : 1;\n\t\t\t\t\t\tvar NG_REPEAT = attr['ng-repeat'];\n\t\t\t\t\t\tvar inPos = NG_REPEAT.indexOf(' in ');\n\t\t\t\t\t\tvar repeatVar = NG_REPEAT.substr(0, inPos), repeatSrc = NG_REPEAT.substr(inPos + 4);\n\t\t\t\t\t\tvar commaPos = repeatVar.indexOf(',');\n\t\t\t\t\t\tvar pipePos = repeatSrc.indexOf('|'), repeatSrcNew;\n\t\t\t\t\t\tvar colonPos;\n\n\t\t\t\t\t\t//store variable name to use for $index later\n\t\t\t\t\t\t//this is ng-repeat specific, LevelMap[level] is same for ng-if too\n\n\t\t\t\t\t\tngRepeatLevel = level;\n\n\t\t\t\t\t\tif (pipePos > 0) {\n\t\t\t\t\t\t\trepeatSrcNew = attachFilter(repeatSrc);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\trepeatSrcNew = attachScope(repeatSrc);\n\t\t\t\t\t\t\tcolonPos = repeatSrcNew.indexOf(':');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Range: \"i in 1:10\" ==> (for i = 1; i < 10; i++)\n\t\t\t\t\t\tif (colonPos >= 0) {\n\t\t\t\t\t\t\tvar start = repeatSrcNew.substr(0, colonPos) || 0, end, step;\n\t\t\t\t\t\t\tvar anotherColon = repeatSrcNew.indexOf(':', ++colonPos);\n\t\t\t\t\t\t\tif (anotherColon > 0) {\n\t\t\t\t\t\t\t\tend = repeatSrcNew.substring(colonPos, anotherColon);\n\t\t\t\t\t\t\t\tstep = repeatSrcNew.substr(anotherColon + 1);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tend = repeatSrcNew.substr(colonPos);\n\t\t\t\t\t\t\t\tstep = 1;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t// console.log([start, end, step, repeatSrcNew, colonPos]);\n\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'for(var ' +\n\t\t\t\t\t\t\t\trepeatVar + '=' + start + ';' +\n\t\t\t\t\t\t\t\trepeatVar + (step > 0 ? '<' : '>') + end + ';' + repeatVar + '+=' + step + '){\\n';\n\t\t\t\t\t\t\tLevelVarMap[level] = repeatVar;\n\t\t\t\t\t\t\tVarMap[repeatVar] = 1;\n\n\t\t\t\t\t\t// Object: \"k, v in {}\" ==> (for in {})\n\t\t\t\t\t\t} else if (commaPos > 0) {\n\t\t\t\t\t\t\tvar key = repeatVar.substr(0, commaPos);\n\t\t\t\t\t\t\tvar value = repeatVar.substr(commaPos + 1);\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'var ' +\n\t\t\t\t\t\t\t\tvalue + ',D' + level + '=' + repeatSrcNew + ';\\n';\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'for(var ' + key + ' in D' + level + '){\\n';\n\t\t\t\t\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\t\t\t space is needed for manual uglify\t->\tvvv\n\t\t\t\t\t\t\tFnText += indent(level) + value + ' = ' + 'D' + level + '[' + key + ']; \\n';\n\t\t\t\t\t\t\tLevelVarMap[level] = key;\n\t\t\t\t\t\t\tVarMap[key] = VarMap[value] = 1;\n\n\t\t\t\t\t\t// Array: \"k in []\" ==> while loop\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar idx = 'i' + level, l = 'l'+ level;\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'var ' +\n\t\t\t\t\t\t\t\trepeatVar + ',D' + level + '=' + repeatSrcNew + ',' +\n\t\t\t\t\t\t\t\tidx + '=-1,' + l + '=D' + level + '.length;\\n';\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'while(++' + idx + '<' + l + '){\\n';\n\t\t\t\t\t\t\t//\t\t\t\t\t\t\t\t\t\t\t\tspace is needed for manual uglify\t->\tvvv\n\t\t\t\t\t\t\tFnText += indent(level) + repeatVar + '=D' + level + '[' + idx + ']; \\n';\n\t\t\t\t\t\t\tLevelVarMap[level] = idx;\n\t\t\t\t\t\t\tVarMap[repeatVar] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t//remote attribute not to get forwarded to angular\n\t\t\t\t\t\tattr['ng-repeat'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (optDiffLevel === 3 && attr.key) {\n\t\t\t\t\t\tkeyLevel = level;\n\t\t\t\t\t\tKeyMap[level] = attr.key;\n\t\t\t\t\t\tFnText += indent(level, 1) + 'var ' + attr.key + '=N,M=1; \\n';\n\t\t\t\t\t\tattr.key = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t//re-render sub template\n\t\t\t\t\tif (attr.refresh) {\n\t\t\t\t\t\tcustomId = 1;\n\t\t\t\t\t\tvar oneTimeBinding = attr.refresh.indexOf('::');\n\t\t\t\t\t\tFnText += indent(level, 2) +\n\t\t\t\t\t\t\t(!Watched ? 'var ' + (optWatchDiff ? '': 'N=1,') + 'T=doTA.W[' + uniqueId + ']=[];' : '') +\n\t\t\t\t\t\t\t'var W={N:N,I:N+\"' + '.' + uniqueId + '\",W:\"' +\n\t\t\t\t\t\t\t(oneTimeBinding >=0 ? attr.refresh.substr(oneTimeBinding + 2) + '\",O:1': attr.refresh + '\"') +\n\t\t\t\t\t\t\t(attr.compile ? ',C:1' : '') +\n\t\t\t\t\t\t\t'};T.push(W);\\n';\n\t\t\t\t\t\tWatchMap[level] = Watched = 1;\n\t\t\t\t\t\tFnText += indent(level, 2) + 'W.F=function(S,F,$attr,X,N){var R=\"\";\\n';\n\t\t\t\t\t\t//attr.refresh = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-init']) {\n\t\t\t\t\t\tif (attr['ng-init'].slice(0, 4) === 'var ') {\n\t\t\t\t\t\t\tvar semiColonPos = attr['ng-init'].indexOf(';', 5);\n\t\t\t\t\t\t\tif (semiColonPos >= 0) {\n\t\t\t\t\t\t\t\tvar vars = attr['ng-init'].slice(4, semiColonPos);\n\t\t\t\t\t\t\t\t//var x,y,z;\n\t\t\t\t\t\t\t\tif (vars.indexOf(',') >= 0) {\n\t\t\t\t\t\t\t\t\tvar xvars = vars.split(',');\n\t\t\t\t\t\t\t\t\tfor (var i = 0, l = xvars.length; i < l; i++) {\n\t\t\t\t\t\t\t\t\t\tVarMap[xvars[i]] = 1;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t//var x;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tVarMap[vars] = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t//var x = 1;\n\t\t\t\t\t\t\t\tvar eqPos = attr['ng-init'].indexOf('=');\n\t\t\t\t\t\t\t\tif (eqPos >= 0) {\n\t\t\t\t\t\t\t\t\tvar vars = attr['ng-init'].slice(4, eqPos);\n\t\t\t\t\t\t\t\t\tVarMap[vars] = 1;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tFnText += indent(level) + attr['ng-init'].slice(0, semiColonPos) +\n\t\t\t\t\t\t\t\tattachScope(attr['ng-init'].slice(semiColonPos)) + '; \\n';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tFnText += indent(level) + attachScope(attr['ng-init']) + '; \\n';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattr['ng-init'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t//ng-if to javascript if\n\t\t\t\t\tif (attr['ng-if']) {\n\t\t\t\t\t\tif (optDiffLevel) {\n\t\t\t\t\t\t\tngIfLevel = level;\n\t\t\t\t\t\t\tngIfLevels.push(level);\n\t\t\t\t\t\t\tngIfLevelMap[level] = 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tLevelMap[level] = LevelMap[level] ? LevelMap[level] + 1 : 1;\n\t\t\t\t\t\tFnText += indent(level, 1) + 'if('+ attachScope(attr['ng-if']) +'){\\n';\n\t\t\t\t\t\t// console.log('ng-if starts here', level);\n\t\t\t\t\t\tattr['ng-if'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t//only if there nothing between tags\n\t\t\t\t\tif (optStrip) {\n\t\t\t\t\t\tif (attr.elif) {\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'else if('+ attachScope(attr.elif) +'){\\n';\n\t\t\t\t\t\t\tLevelMap[level] = LevelMap[level] ? LevelMap[level] + 1 : 1;\n\t\t\t\t\t\t\tattr.elif = void 0;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (attr['else'] !== void 0 && !optWatchDiff) {\n\t\t\t\t\t\t\tFnText += indent(level, 1) + 'else{\\n';\n\t\t\t\t\t\t\tLevelMap[level] = LevelMap[level] ? LevelMap[level] + 1 : 1;\n\t\t\t\t\t\t\tattr['else'] = void 0;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t//remove +''+ from class, for unnecessary string concat\n\t\t\t\t\tif (attr.class) {\n\t\t\t\t\t\tattrClass = interpolate(attr.class);\n\t\t\t\t\t\tattr.class = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-class']) {\n\t\t\t\t\t\tvar match;\n\t\t\t\t\t\tvar ngScopedClass = attachScope(attr['ng-class']);\n\t\t\t\t\t\twhile((match = ngClassRegex.exec(ngScopedClass)) !== null) {\n\t\t\t\t\t\t\tattrClass +=\n\t\t\t\t\t\t\t\t(\"'+(\" + match[2] + '?' +\n\t\t\t\t\t\t\t\t\t\"'\" + (attrClass ? ' ' : '') + match[1].replace(/['\"]/g, '') +\n\t\t\t\t\t\t\t\t\t\"':'')+'\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattr['ng-class'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-show']) {\n\t\t\t\t\t\tattrClass += \"'+(\" + attachScope(attr['ng-show']) +\n\t\t\t\t\t\t\t\"?'':'\" + (attrClass ? ' ' : '') + \"ng-hide')+'\";\n\t\t\t\t\t\tattr['ng-show'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-style']) {\n\t\t\t\t\t\tparsedAttr.style = (attr.style ? attr.style + ';' : '') + interpolate(attr['ng-style']);\n\t\t\t\t\t\tattr['ng-style'] = void 0;\n\t\t\t\t\t\tattr.style = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-hide']) {\n\t\t\t\t\t\tattrClass += \"'+(\" + attachScope(attr['ng-hide']) +\n\t\t\t\t\t\t\t\"?'\" + (attrClass ? ' ' : '') + \"ng-hide':'')+'\";\n\t\t\t\t\t\tattr['ng-hide'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (optModel && attr['ng-model']) {\n\t\t\t\t\t\tif (attr['ng-model'].indexOf('$index') >= 0) {\n\t\t\t\t\t\t\tparsedAttr['dota-model'] = apply$index(interpolate(attr['ng-model']));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsedAttr['dota-model'] = interpolate(attr['ng-model']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattrClass += (attrClass ? ' ' : '') + 'dm' + uniqueId;\n\t\t\t\t\t\tattr['ng-model'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (optBind && attr['ng-bind']) {\n\t\t\t\t\t\tif (attr['ng-bind'].indexOf('$index') >= 0) {\n\t\t\t\t\t\t\tparsedAttr['dota-bind'] = apply$index(interpolate(attr['ng-bind']));\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tparsedAttr['dota-bind'] = interpolate(attr['ng-bind']);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tattrClass += (attrClass ? ' ' : '') + 'db' + uniqueId;\n\t\t\t\t\t\tattr['ng-bind'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (attr['ng-value']) {\n\t\t\t\t\t\tparsedAttr.value = \"'+(\" + attachFilter(attr['ng-value']) + \")+'\";\n\t\t\t\t\t\tattr['ng-value'] = void 0;\n\t\t\t\t\t}\n\n\t\t\t\t\t//some cleanup\n\t\t\t\t\tif (attrClass) {\n\t\t\t\t\t\tattrClass = attrClass.replace(/\\+''\\+/g, '+');\n\t\t\t\t\t}\n\n\t\t\t\t\t// expand interpolations on attributes, and some more\n\t\t\t\t\tfor (x in attr) {\n\t\t\t\t\t\tvar attrVal = attr[x];\n\t\t\t\t\t\tif (attrVal === void 0) { continue; }\n\n\t\t\t\t\t\t// some ng- attributes\n\t\t\t\t\t\tif (x[0] === 'n' && x[1] === 'g' && x[2] === '-') {\n\t\t\t\t\t\t\t//some ng-attr are just don't need it here.\n\t\t\t\t\t\t\tvar attrName = x.substr(3);\n\t\t\t\t\t\t\t//something like ng-src, ng-href, etc.\n\t\t\t\t\t\t\tif (attrName === 'src' || attrName === 'alt' || attrName === 'title' || attrName === 'href') {\n\t\t\t\t\t\t\t\tx = attrName;\n\n\t\t\t\t\t\t\t//convert ng-events to dota-events, to be bind later with native events\n\t\t\t\t\t\t\t} else if (optEvent && EVENTS[attrName]) {\n\t\t\t\t\t\t\t\t//add class 'de' for one time querying\n\t\t\t\t\t\t\t\tif (attrClass) {\n\t\t\t\t\t\t\t\t\tif (attrClass[0] !== 'd' || attrClass[1] !== 'e') {\n\t\t\t\t\t\t\t\t\t\tattrClass = 'de' + uniqueId + ' ' + attrClass;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tattrClass = 'de' + uniqueId;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tx = 'de-' + attrName;\n\n\t\t\t\t\t\t\t} else if (attrName === 'required' || attrName === 'hidden' ||\n\t\t\t\t\t\t\tattrName === 'checked' || attrName === 'selected' ||\n\t\t\t\t\t\t\tattrName === 'disabled' || attrName === 'readonly' || attrName === 'multiple') {\n\t\t\t\t\t\t\t\tnoValAttr += \"'+(\" + attachScope(attrVal) + \"?' \" + attrName + \"=\\\"\\\"':'')+'\";\n\t\t\t\t\t\t\t\t//noValAttr will attach later\n\t\t\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} else if (x[0] === '-') {\n\t\t\t\t\t\t\tx = '-' + camelCase(x.substr(1));\n\t\t\t\t\t\t\tparsedAttr[x] = \"'+(\" + attachScope(attrVal) + \")+'\";\n\t\t\t\t\t\t\tcontinue;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//ng-repeat loop variables are not available!\n\t\t\t\t\t\t// only way to acccess is to use $index like \"data[$index]\"\n\t\t\t\t\t\t// instead of \"item\" as in \"item in data\"\n\t\t\t\t\t\tparsedAttr[x] = apply$index(interpolate(attrVal));\n\t\t\t\t\t}\n\n\t\t\t\t// pass all attributes to angular, except interpolation and $index\n\t\t\t\t} else {\n\t\t\t\t\tif (doTAPassThis) {\n\t\t\t\t\t\tdoTAPass = void 0;\n\t\t\t\t\t}\n\t\t\t\t\t//still expand interpolation even if dota-pass is set\n\t\t\t\t\tfor (x in attr) {\n\t\t\t\t\t\tparsedAttr[x] = apply$index(interpolate(attr[x]));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//write tag back as string\n\t\t\t\tFnText += indent(level) + \"R+='<\" + tagName;\n\n\t\t\t\t//make id attr come before anything\n\t\t\t\tif (customId || optWatchDiff) {\n\t\t\t\t\tvar tagId = idHash[uniqueId + '.' + level] = parsedAttr.id || ( (\n\t\t\t\t\t\tkeyLevel < level && KeyMap[keyLevel] || optKey ?\n\t\t\t\t\t\t\"'+\" + (optKey || KeyMap[keyLevel]) + \"+'.'+M+++'.\" :\n\t\t\t\t\t\t\"'+N+++'.\"\n\t\t\t\t\t) + uniqueId);\n\t\t\t\t\tFnText += ' id=\"' + tagId + '\"';\n\t\t\t\t\tif (parsedAttr.id) {\n\t\t\t\t\t\tparsedAttr.id = void 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//write back attributes\n\t\t\t\tfor(var k in parsedAttr) {\n\t\t\t\t\tif ((x=parsedAttr[k]) && x.indexOf('\"') !== -1) {\n\t\t\t\t\t\tFnText += \" \" + k + '=\"' + x.replace(/\"/g, \"\\\\'\") + '\"';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tFnText += \" \" + k + '=\"' + x + '\"';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (attrClass) {\n\t\t\t\t\tFnText += ' class=\"' + attrClass + '\"';\n\t\t\t\t}\n\n\t\t\t\t//attach boolean attributes at last\n\t\t\t\tFnText += noValAttr + (selfClosing ? ' /' : '') + \">';\\n\";\n\n\t\t\t\tif (optWatchDiff) {\n\t\t\t\t\t// FnText += indent(level) + \"N++; \\n\";\n\t\t\t\t\tif (ngIfLevelMap[ngIfLevel] >= 0) {\n\t\t\t\t\t\tngIfLevelMap[ngIfLevel]++;\n\t\t\t\t\t\t// console.log('isPath ngIfCounter', [tagName, ngIfCounter]);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//expand doTA templates with expand=1 option\n\t\t\t\tif (attr['render'] && attr.expand) {\n\t\t\t\t\tvar attrArray = [];\n\t\t\t\t\t//attach data-X attr, and scope-X attr\n\t\t\t\t\tfor(x in attr) {\n\t\t\t\t\t\tif (!x.indexOf('data-')) {\n\t\t\t\t\t\t\tattrArray.push('\"' + x.slice(5) + '\":\"' + attr[x] + '\"');\n\t\t\t\t\t\t} else if (!x.indexOf('scope-')) {\n\t\t\t\t\t\t\tattrArray.push('\"' + x.slice(6) + '\":S[\"' + attr[x] + '\"]');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tFnText += indent(level) + 'var P={' + attrArray.join(',') + '},U=\"' + attr['render'] + '\";\\n';\n\t\t\t\t\t//only expand if renderFn is ready in cache, but not in cache-dom (which unneeded)\n\t\t\t\t\tFnText += indent(level) + 'if(doTA.C[U]&&!doTA.D[U]){' +\n\t\t\t\t\t\t'R+=doTA.C[U](S,F,P)}; \\n';\n\t\t\t\t}\n\n\t\t\t\tlevel++;\n\t\t\t},\n\n\t\t\t//void tag no need to write closing tag\n\t\t\tvoidTag: function() {\n\t\t\t\tlevel--;\n\n\t\t\t\tif (optDiffLevel === 2 && level === ngIfLevel && ngIfLevelMap[ngIfLevel] >= 0) {\n\t\t\t\t\t// console.log('ngIfLevelMap1', ngIfLevel, ngIfLevels, ngIfLevelMap);\n\t\t\t\t\tif (ngIfLevelMap[ngIfLevel]) {\n\t\t\t\t\t\tFnText += indent(level, 1) + \"}else{\" +\n\t\t\t\t\t\t\t\"R+='\\';' +\n\t\t\t\t\t\t\t\"N+=\" + ngIfLevelMap[ngIfLevel] + \";}; \\n\";\n\t\t\t\t\t}\n\t\t\t\t\t//save counter\n\t\t\t\t\tngIfCounterTmp = ngIfLevelMap[ngIfLevel];\n\t\t\t\t\t//clear counter\n\t\t\t\t\tngIfLevelMap[ngIfLevel] = void 0;\n\t\t\t\t\t//remove last level\n\t\t\t\t\tngIfLevel = ngIfLevels[--ngIfLevels.length - 1];\n\t\t\t\t\t//add up to previous level\n\t\t\t\t\tif (ngIfLevel) {\n\t\t\t\t\t\tngIfLevelMap[ngIfLevel] += ngIfCounterTmp;\n\t\t\t\t\t}\n\t\t\t\t\t// console.log('ngIfLevelMap2', ngIfLevel, ngIfLevels, ngIfLevelMap);\n\t\t\t\t\tif (LevelMap[level] > 0) {\n\t\t\t\t\t\tLevelMap[level]--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//close \"if\", \"for\", \"while\" blocks\n\t\t\t\t//while is needed because loop and if can be in same tag\n\t\t\t\twhile (LevelMap[level] > 0) {\n\t\t\t\t\tFnText += indent(level, 1) + '}\\n';\n\t\t\t\t\tLevelMap[level]--;\n\t\t\t\t}\n\n\t\t\t\t//clear ng-repeat $index\n\t\t\t\tif (ngRepeatLevel === level) {\n\t\t\t\t\tLevelVarMap[level] = 0;\n\t\t\t\t\twhile (ngRepeatLevel >=0 && LevelVarMap[--ngRepeatLevel] === void 0) {}\n\t\t\t\t}\n\n\t\t\t\t//reset dota-pass when out of scope\n\t\t\t\tif (doTAPass >= level) {\n\t\t\t\t\tdoTAPass = void 0;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t//close tag\n\t\t\tcloseTag: function(tagName) {\n\t\t\t\tlevel--;\n\n\t\t\t\t//just write closing tag back\n\t\t\t\tFnText += indent(level) + \"R+='';\\n\";\n\n\t\t\t\t//ngIfCounter for most possible uniqueId generation; don't work with loop inside!\n\t\t\t\tif (optDiffLevel === 2 && level === ngIfLevel && ngIfLevelMap[ngIfLevel] >= 0) {\n\t\t\t\t\t// console.log('ngIfLevelMap1', ngIfLevel, ngIfLevels, ngIfLevelMap);\n\t\t\t\t\tif (ngIfLevelMap[ngIfLevel]) {\n\t\t\t\t\t\tFnText += indent(level, 1) + \"}else{\" +\n\t\t\t\t\t\t\t\"R+='<\" + tagName + \" id=\\\"'+N+'.\" + uniqueId + '\" hidden=\"\" ' +\n\t\t\t\t\t\t\t(tagName === 'img' || tagName === 'input' || tagName === 'br' || tagName === 'hr' ?\n\t\t\t\t\t\t\t'/>' : '>') + '\\';' +\n\t\t\t\t\t\t\t\"N+=\" + ngIfLevelMap[ngIfLevel] + \"} \\n\";\n\t\t\t\t\t}\n\t\t\t\t\t//save counter\n\t\t\t\t\tngIfCounterTmp = ngIfLevelMap[ngIfLevel];\n\t\t\t\t\t//clear counter\n\t\t\t\t\tngIfLevelMap[ngIfLevel] = void 0;\n\t\t\t\t\t//remove last level\n\t\t\t\t\tngIfLevel = ngIfLevels[--ngIfLevels.length - 1];\n\t\t\t\t\t//add up to previous level\n\t\t\t\t\tif (ngIfLevel) {\n\t\t\t\t\t\tngIfLevelMap[ngIfLevel] += ngIfCounterTmp;\n\t\t\t\t\t}\n\t\t\t\t\t// console.log('ngIfLevelMap2', ngIfLevel, ngIfLevels, ngIfLevelMap);\n\t\t\t\t\tif (LevelMap[level] > 0) {\n\t\t\t\t\t\tLevelMap[level]--;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// console.log('LevelMap1', LevelMap);\n\t\t\t\t//close \"if\", \"for\", \"while\" blocks\n\t\t\t\twhile (LevelMap[level] > 0) {\n\t\t\t\t\tFnText += indent(level, 1) + '}\\n';\n\t\t\t\t\tLevelMap[level]--;\n\t\t\t\t}\n\t\t\t\t// console.log('LevelMap2', LevelMap);\n\n\t\t\t\tif (optDiffLevel) {\n\t\t\t\t\tif (level === skipLevel) {\n\t\t\t\t\t\t// console.log('ngIfLevel', [level, skipLevel, ngRepeatLevel])\n\t\t\t\t\t\tFnText += indent(level, 1) + 'N=O' + level + '; \\n';\n\t\t\t\t\t}\n\t\t\t\t\tif (level === skipLevel) {\n\t\t\t\t\t\tskipLevel = void 0;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t//clear ng-repeat $index\n\t\t\t\tif (ngRepeatLevel === level) {\n\t\t\t\t\tLevelVarMap[level] = 0;\n\t\t\t\t\twhile (ngRepeatLevel >=0 && LevelVarMap[--ngRepeatLevel] === void 0) {}\n\t\t\t\t}\n\n\t\t\t\t//add blank node if $watch block return nothing, mostly occur with ng-if\n\t\t\t\tif (WatchMap[level]) {\n\t\t\t\t\tFnText += indent(level, 1) +\n\t\t\t\t\t\t\"R=R||('<\" + tagName + ' id=\"' + idHash[uniqueId + '.' + level] +\n\t\t\t\t\t\t'\" style=\"display:none\">\\');\\n';\n\t\t\t\t\tWatchMap[level] = 0;\n\t\t\t\t\tFnText += indent(level, 2) + 'return R;}; \\n';\n\t\t\t\t\tFnText += indent(level, 2) + 'R+=W.F(S,F,' + (optParams ? '$attr': '0') + ',0,N++); \\n';\n\t\t\t\t}\n\n\t\t\t\t//reset dota-pass when out of scope\n\t\t\t\tif (doTAPass >= level) {\n\t\t\t\t\tdoTAPass = void 0;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\t//text node\n\t\t\ttext: function(text) {\n\t\t\t\t//console.log([text]);\n\t\t\t\tFnText += indent(level) + ('R+=\\'' + interpolate(text) + '\\';\\n')\n\t\t\t\t\t.replace(/\\+''|''\\+/g,'');\n\t\t\t},\n\n\t\t\t//comment node\n\t\t\tcomment: function(data) {\n\t\t\t\tif (optComment !== 0) {\n\t\t\t\t\t//console.log(111,[data]);\n\t\t\t\t\tFnText += indent(level) + \"R+='<\" + escapeSingleQuote(data) + \">';\\n\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\tif (optWatchDiff && optDiffLevel !== 0) {\n\t\t\t//http://jsperf.com/hasownproperty-vs-in-vs-undefined/87\n\t\t\tFnText += indent(0) + 'if(X&&doTA.H[' + uniqueId + ']){doTA.diff' + (optDiffLevel || '') +\n\t\t\t\t'(' + uniqueId + ',R)}' +\n\t\t\t\t'doTA.H[' + uniqueId + ']=R;\\n';\n\t\t}\n\n\t\tFnText += indent(0) +'return R;\\n';\n\n\t\t//Default Optimization\n\t\t// - concat possible lines for performance\n\t\tFnText = FnText.replace(/;R\\+=/g,'+').replace(/'\\+'/g,'');\n\n\t\t//extra optimization, which might take some more CPU\n\t\tif (options.optimize && !optWatchDiff) {\n\t\t\tFnText = FnText.replace(removeUnneededQuotesRegex,'$1$2');\n\t\t}\n\n\t\t//print the whole function if debug\n\t\tif (options.debug) {\n\t\t\t/**/console.log(FnText);\n\t\t}\n\t\t// console.log(FnText);\n\n\t\t//try {\n\t\t\t/*jshint evil: true */\n\t\t\tif (optWatchDiff || optDiffLevel) {\n\t\t\t\t//$scope, $filter, $attr, isPatch, IdCounter, isKey, LoopIdCounter\n\t\t\t\tcompiledFn = new Function('S', 'F', '$attr', 'X', 'N', 'K', 'M', FnText);\n\t\t\t} else if (optParams) {\n\t\t\t\tcompiledFn = new Function('S', 'F', '$attr', FnText);\n\t\t\t} else {\n\t\t\t\tcompiledFn = new Function('S', 'F', FnText);\n\t\t\t}\n\t\t\t/*jshint evil: false */\n\n\t\t\tcompiledFn.id = uniqueId;\n\t\t\tif (Watched) {\n\t\t\t\tcompiledFn.W = 1;\n\t\t\t//\tcompiledFn = {W:[], F: compiledFn};\n\t\t\t}\n\t\t//} catch (err) {\n\t\t//\tif (typeof console !== \"undefined\") {\n\t\t//\t\t/**/console.log(\"doTA compile error:\\n\" + FnText);\n\t\t//\t}\n\t\t//\tthrow err;\n\t\t//}\n\n\t\t// just for less array usage on heap profiling\n\t\t// but this may trigger GC more\n\t\t// FnText = LevelMap = LevelVarMap = VarMap = ngIfLevels = ngIfLevelMap = WatchMap = idHash = void 0;\n\t\treturn compiledFn;\n\t}\n\n\tfunction initCompileHash(obj) {\n\t\tfor (var x in obj) {\n\t\t\tdoTA.U[x] = obj[x];\n\t\t\tif (obj[x] > doTA.X) {\n\t\t\t\tdoTA.X = obj[x];\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction getUniqueId(key) {\n\t\tif (key) {\n\t\t\tif (doTA.U[key]) {\n\t\t\t\treturn doTA.U[key];\n\t\t\t} else {\n\t\t\t\tdoTA.U[key] = doTA.X;\n\t\t\t\treturn doTA.X++;\n\t\t\t}\n\t\t} else {\n\t\t\treturn doTA.X++;\n\t\t}\n\t}\n\n\t//warm-up most used functions\n\t// doTA.compile('
x{{x}}
{{v|json:4}}
', {\n\t// \trender: 1});\n\t// doTA.compile('
x{{x}}
{{x}}
', {\n\t// \twatchDiff: 1, render: 1});\n\tdoTA.compile('
x{{x}}
', {\n\t\twatchDiff: 1, diffLevel: 2, render: 0});\n\t// doTA.compile('
x{{x}}
', {\n\t// \twatchDiff: 1, diffLevel: 3, render: 1});\n\twindow.doTA = doTA;\n\n\treturn doTA;\n}));\n\n/* global angular, doTA */\n(function(global, factory) {\n\n\tfactory(global, global.document, global.doTA);\n\n}(typeof window !== 'undefined' ? window : this, function(window, document, doTA) {\n\n\tvar msie = document.documentMode;\n\tvar ie8 = msie <= 8;\n\tvar textContent = ie8 ? 'innerText' : 'textContent';\n\tvar listenerName = ie8 ? 'attachEvent' : 'addEventListener';\n\tvar frag, newNode = doTA.N;\n\tvar BoolMap = {0: 0, 'false': 0, 1: 1, 'true': 1};\n\n\tsetTimeout(function() {\n\t\tfrag = document.createDocumentFragment();\n\t});\n\n\tfunction makeBool(attr, defaultValue){\n\t\treturn attr in BoolMap ? BoolMap[attr] : attr || defaultValue;\n\t}\n\n\tfunction forEachArray(src, iter, ctx) {\n\t\tif (!src) { return; }\n\t\tif (src.forEach) {\n\t\t\treturn src.forEach(iter);\n\t\t}\n\t\tfor (var key = 0, length = src.length; key < length; key++) {\n\t\t\titer.call(ctx, src[key], key);\n\t\t}\n\t}\n\n\t//retrieve nested value from object, support a.b or a[b]\n\tfunction resolveDot(path, obj) {\n\t\t//console.log(['resolveDot', path, obj]);\n\t\tif (path.indexOf('.') > 0) {\n\t\t\tvar chunks = path.split('.');\n\t\t\treturn chunks.reduce(function (prev, curr) {\n\t\t\t\treturn prev ? prev[curr] : undefined;\n\t\t\t}, obj);\n\t\t} else {\n\t\t\treturn obj[path];\n\t\t}\n\t}\n\n\tfunction resolveObject(path, obj) {\n\t\tif (path.indexOf('[') > 0) {\n\t\t\tvar result;\n\t\t\twhile (path.indexOf('[') > 0) {\n\t\t\t\t/*jshint loopfunc: true */\n\t\t\t\tpath = path.replace(/([$\\w.]+)\\[([^[\\]]+)\\](?:\\.([$\\w.]+))?/g, function($0, lpart, part, rpart) {\n\t\t\t\t\tvar lobj = resolveDot(lpart, obj);\n\t\t\t\t\t//console.log(['part', part, 'lpart', lpart, 'lobj', lobj]);\n\t\t\t\t\tvar robj = resolveDot(part, lobj);\n\t\t\t\t\t//console.log(['part', part, 'lobj', lobj, 'robj', robj]);\n\t\t\t\t\tif (typeof robj === 'object' && rpart) {\n\t\t\t\t\t\treturn (result = resolveDot(rpart, robj));\n\t\t\t\t\t}\n\t\t\t\t\treturn (result = robj);\n\t\t\t\t});\n\t\t\t\t/*jshint loopfunc: false */\n\t\t\t}\n\t\t\treturn result;\n\t\t} else {\n\t\t\treturn resolveDot(path, obj);\n\t\t}\n\t}\n\n\t// var obj2 = {\n\t// \tparams: { groups: {'test': 1234, abcd: 'efgh'}},\n\t// \tgroups: [{_id: 'test'},{_id: 'abcd'}]\n\t// };\n\t// console.log(resolveObject('params.groups[groups[0]._id]', obj2));\n\t// console.log(resolveObject('params.groups[groups[1]._id]', obj2));\n\t// console.log(resolveObject('groups.0._id', obj2));\n\t// console.log(resolveObject('groups.0', obj2));\n\n\tfunction parseDot(path, obj) {\n\t\t//console.log(['resolveDot', path, obj]);\n\t\tif (path.indexOf('.') > 0) {\n\t\t\tvar chunks = path.split('.');\n\t\t\tpath = chunks.pop();\n\t\t\tobj = chunks.reduce(function (prev, curr) {\n\t\t\t\t// console.log('parseObject', [prev, curr])\n\t\t\t\tif (!prev[curr]) {\n\t\t\t\t\tprev[curr] = {};\n\t\t\t\t}\n\t\t\t\treturn prev[curr];\n\t\t\t}, obj);\n\t\t}\n\t\treturn {\n\t\t\tassign: function(val) {\n\t\t\t\tobj[path] = val;\n\t\t\t}\n\t\t};\n\t}\n\n\t//get nested value as assignable fn like $parse.assign\n\tfunction parseObject(path, obj) {\n\t\tif (path.indexOf('[') > 0) {\n\t\t\tvar result;\n\t\t\twhile (path.indexOf('[') > 0) {\n\t\t\t\t/*jshint loopfunc: true */\n\t\t\t\tpath = path.replace(/([$\\w.]+)\\[([^[\\]]+)\\](?:\\.([$\\w.]+))?/g, function($0, lpart, part, rpart) {\n\t\t\t\t\tvar lobj = resolveDot(lpart, obj);\n\t\t\t\t\t//console.log(['part', part, 'lpart', lpart, 'lobj', lobj]);\n\t\t\t\t\tif (rpart) {\n\t\t\t\t\t\tvar robj = resolveDot(part, lobj);\n\t\t\t\t\t\tresult = parseDot(rpart, robj);\n\t\t\t\t\t\treturn resolveDot(rpart, robj);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult = parseDot(part, lobj);\n\t\t\t\t\t\treturn resolveDot(part, lobj);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t/*jshint loopfunc: false */\n\t\t\t}\n\t\t\treturn result;\n\t\t} else {\n\t\t\treturn parseDot(path, obj);\n\t\t}\n\t}\n\n\t// var obj = {};\n\t// var parsed = parseObject('name', obj);\n\t// parsed.assign('test');\n\t// console.log(obj);\n\t// parsed = parseObject('three.one', obj);\n\t// parsed.assign('haha');\n\t// console.log(obj);\n\n\t// var obj2 = {\n\t// \tparams: { groups: {'test': 1234, abcd: 'efgh'}},\n\t// \tgroups: [{_id: 'test'},{_id: 'abcd'}]\n\t// };\n\t// parsed = parseObject('groups.1._id', obj2);\n\t// console.log(obj2);\n\t// parsed.assign('zzzz');\n\t// console.log(JSON.stringify(obj2,0,4));\n\t// parsed = parseObject('params.groups[groups[0]._id]', obj2);\n\t// console.log(obj2);\n\t// parsed.assign(23923223);\n\t// console.log(JSON.stringify(obj2,0,4));\n\n\t//debounce for events like resize\n\tfunction debounce(fn, timeout) {\n\t\tif (timeout === undefined) {\n\t\t\ttimeout = 500;\n\t\t}\n\t\tvar timeoutId;\n\t\tvar args, thisArgs;\n\t\tfunction debounced() {\n\t\t\tfn.apply(thisArgs, args);\n\t\t}\n\t\treturn function() {\n\t\t\targs = arguments;\n\t\t\tthisArgs = this;\n\t\t\tif (timeoutId) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t}\n\t\t\t// console.log('debounce: new timer', [timer]);\n\t\t\ttimeoutId = setTimeout(debounced, timeout);\n\t\t};\n\t}\n\tdoTA.debounce = debounce;\n\n\t//throttle for events like input\n\tfunction throttle(fn, timeout) {\n\t\tif (timeout === undefined) {\n\t\t\ttimeout = 200;\n\t\t}\n\t\tvar timeoutId;\n\t\tvar start = +new Date(), now;\n\t\t// console.log('timeout', timeout)\n\t\tvar args, thisArgs;\n\t\tfunction throttled() {\n\t\t\tfn.apply(thisArgs, args);\n\t\t}\n\t\treturn function() {\n\t\t\targs = arguments;\n\t\t\tthisArgs = this;\n\t\t\tnow = +new Date();\n\t\t\tif (timeoutId) {\n\t\t\t\tclearTimeout(timeoutId);\n\t\t\t}\n\t\t\tif (now - start >= timeout) {\n\t\t\t\t// console.log(now - start)\n\t\t\t\tstart = now;\n\t\t\t\tthrottled();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t// console.log('throttled: new timer', [timer]);\n\t\t\ttimeoutId = setTimeout(throttled, timeout);\n\t\t};\n\t}\n\tdoTA.throttle = throttle; //export\n\n\t//hide and destroy children\n\tfunction destroyChildren(elem) {\n\t\tvar child = elem.firstChild, hiddenTags = [];\n\t\tif (child) {\n\t\t\tchild.hidden = 1;\n\t\t\thiddenTags.push(child);\n\t\t\twhile ((child = child.nextSibling)) {\n\t\t\t\tchild.hidden = 1;\n\t\t\t\thiddenTags.push(child);\n\t\t\t}\n\t\t}\n\t\t//destroying children block everything\n\t\t// so do it later, since deleting don't have to be synchronous\n\t\tsetTimeout(function(){\n\t\t\tconsole.time('removeChild');\n\t\t\tforEachArray(hiddenTags, function(child) {\n\t\t\t\tif (child && child.parentNode) {\n\t\t\t\t\tchild.parentNode.removeChild(child);\n\t\t\t\t}\n\t\t\t});\n\t\t\tconsole.timeEnd('removeChild');\n\t\t});\n\t}\n\n\tfunction evalExpr(expr) {\n\t\treturn new Function('S', 'return ' + expr.replace(/[$\\w.]+/g, function($0) {\n\t\t\t\treturn 'S.' + $0;\n\t\t\t}));\n\t}\n\n\tfunction eventHandlerFn(scope, expr) {\n\t\tvar propagate = expr && expr[0] === '^';\n\t\treturn function(evt){\n\t\t\tevt.target = evt.target || evt.srcElement || document;\n\t\t\tif (propagate) {\n\t\t\t\tscope.$eval(expr.substr(1), {$event: evt})\n\t\t\t\tscope.$applyAsync();\n\t\t\t} else {\n\t\t\t\tif (ie8) {\n\t\t\t\t\t//make $event.target always available\n\t\t\t\t\tevt.returnValue = false;\n\t\t\t\t\tevt.cancelBubble = true;\n\t\t\t\t} else {\n\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t}\n\t\t\t\tscope.$evalAsync(expr, {$event: evt});\n\t\t\t}\n\n\t\t};\n\t}\n\n\tfunction getElements(elem, selector) {\n\t\treturn ie8 ? elem.querySelectorAll('.' + selector) : elem.getElementsByClassName(selector);\n\t}\n\n\tfunction addEventUnknown(partial, scope) {\n\t\tif (partial.de) { return; } //only attach events once\n\t\tpartial.de = 1;\n\t\tvar attributes = partial.attributes, attrName, attrVal;\n\t\t// console.log('attributes', attributes);\n\t\tfor(var i = 0, l = attributes.length; i < l; i++) {\n\t\t\tif (!attributes[i] || !attributes[i].name || !attributes[i].value) { continue; }\n\t\t\tattrName = attributes[i].name;\n\t\t\tattrVal = attributes[i].value;\n\t\t\tif (attrName.substr(0, 3) === 'de-') {\n\t\t\t\t//remove attribute, so never bind again\n\t\t\t\tpartial[listenerName]((ie8 ? 'on' : '') + attrName.substr(3),\n\t\t\t\t\teventHandlerFn(scope, attrVal));\n\t\t\t\t// console.log('event added', attrName);\n\t\t\t}\n\t\t}\n\t}\n\n\t//specified events\n\tfunction addEventKnown(partial, scope, events) {\n\t\tif (partial.ded) { return; } //only attach events once\n\t\tpartial.ded = 1;\n\t\tvar attrName, attrVal;\n\n\t\t// console.log('attributes', attributes);\n\t\tfor(var i = 0, l = events.length; i < l; i++) {\n\t\t\tattrName = 'de-' + events[i];\n\t\t\tattrVal = partial.getAttribute(attrName);\n\t\t\t// console.log(i, [attrVal, events[i]])\n\t\t\tif (!attrVal) { continue; }\n\t\t\tpartial[listenerName]((ie8 ? 'on' : '') + events[i],\n\t\t\t\teventHandlerFn(scope, attrVal));\n\t\t}\n\t}\n\n\tfunction addEvents(elem, scope, event, uniqueId) {\n\t\t//getElementsByClassName is faster than querySelectorAll\n\t\t//http://jsperf.com/queryselectorall-vs-getelementsbytagname/20\n\t\t// console.time('find-nodes:');\n\t\tvar elements = getElements(elem, 'de' + uniqueId);\n\t\tvar i, l;\n\t\t// console.timeEnd('find-nodes:');\n\t\tif (typeof event === 'number') {\n\t\t\tfor (i = 0, l = elements.length; i < l; i++) {\n\t\t\t\taddEventUnknown(elements[i], scope);\n\t\t\t}\n\t\t} else {\n\t\t\tvar events = event.split(' ');\n\t\t\tfor (i = 0, l = elements.length; i < l; i++) {\n\t\t\t\taddEventKnown(elements[i], scope, events);\n\t\t\t}\n\t\t}\n\t}\n\tdoTA.addEvents = addEvents;\n\n\tfunction addNgModels(elem, scope, uniqueId) {\n\t\tvar elements = getElements(elem, 'dm' + uniqueId);\n\t\tforEachArray(elements, function(partial) {\n\t\t\tif (partial.dm) return;\n\t\t\tpartial.dm = 1;\n\t\t\tvar dotaPass = partial.getAttribute('dota-pass');\n\t\t\t// console.log('dotaPass', [dotaPass]);\n\t\t\tif (dotaPass != null) { // jshint ignore:line\n\t\t\t\treturn;\n\t\t\t} //null or undefined\n\n\t\t\tvar isCheckBox = partial.type === 'checkbox';\n\t\t\tvar isRadio = partial.type === 'radio';\n\n\t\t\tvar modelName = partial.getAttribute('dota-model');\n\t\t\tvar initValue = isCheckBox ?\n\t\t\t\tpartial.getAttribute('checked') != null : partial.getAttribute('value');\n\n\t\t\t//textbox default event is input unless IE8, all others are change event\n\t\t\tvar updateOn = partial.getAttribute('update-on') ||\n\t\t\t\t(partial.type !== 'text' || ie8 ? 'change' : 'input');\n\t\t\tvar throttleVal = +partial.getAttribute('throttle') || 100;\n\n\t\t\t//use checked property for checkbox and radio\n\t\t\tvar bindProp = partial.getAttribute('bind-prop') ||\n\t\t\t\t((isCheckBox || partial.type === 'radio') && 'checked');\n\t\t\tvar curValue = resolveObject(modelName, scope);\n\n\t\t\tconsole.log('partial1', [partial.tagName, partial.type, modelName, bindProp])\n\t\t\tconsole.log('partial2', [partial.type, initValue, curValue, partial.value, partial[bindProp]]);\n\t\t\tif (bindProp) {\n\t\t\t\t//set true or false on dom properties\n\t\t\t\t// if (initValue)\n\t\t\t\tif (isCheckBox)\n\t\t\t\t\tpartial[bindProp] = initValue || curValue;\n\t\t\t\telse if (isRadio)\n\t\t\t\t\tpartial[bindProp] = initValue == curValue;\n\n\t\t\t\t// else\n\t\t\t\t// \tpartial[bindProp] = curValue;\n\t\t\t} else {\n\t\t\t\tif (typeof curValue !== 'undefined') {\n\t\t\t\t\tpartial.value = curValue;\n\t\t\t\t//} else if (partial.tagName === 'SELECT') {\n\t\t\t\t//\tpartial.selectedIndex = 0;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t//bind each events\n\t\t\tvar events = updateOn.split(' ');\n\t\t\tfor (var i = 0; i < events.length; i++) {\n\t\t\t\tvar evtName = events[i].trim();\n\t\t\t\tpartial.addEventListener(evtName, throttle((function (partial, modelName, bindProp) {\n\t\t\t\t\tvar parsed;\n\t\t\t\t\treturn function (evt) {\n\t\t\t\t\t\tif (!parsed) {\n\t\t\t\t\t\t\tparsed = parseObject(modelName, scope);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (ie8) {\n\t\t\t\t\t\t\tevt.returnValue = false;\n\t\t\t\t\t\t\tevt.cancelBubble = true;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tevt.preventDefault();\n\t\t\t\t\t\t\tevt.stopPropagation();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// console.log('event', modelName, evtName, partial, bindProp, [partial[bindProp || 'value']]);\n\t\t\t\t\t\tscope.$applyAsync((function () {\n\t\t\t\t\t\t\t//console.log(\"value\", [partial.value, partial.getAttribute('value'), curValue, bindProp, initValue, partial[bindProp]]);\n\t\t\t\t\t\t\tif (bindProp) {\n\t\t\t\t\t\t\t\tif (initValue) {\n\t\t\t\t\t\t\t\t\t//partial.value\n\t\t\t\t\t\t\t\t\tparsed.assign(isCheckBox ? partial.checked :\n\t\t\t\t\t\t\t\t\tpartial[bindProp] ? partial.value : undefined);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tparsed.assign(partial[bindProp]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tparsed.assign(partial.value);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}));\n\t\t\t\t\t};\n\t\t\t\t})(partial, modelName, bindProp), throttleVal));\n\t\t\t}\n\t\t});\n\t}\n\tdoTA.addNgModels = addNgModels;\n\n\tangular.module('doTA', [])\n\t\t.config(['$provide',function(P) {\n\t\t\tP.factory('doTA', function(){\n\t\t\t\treturn doTA;\n\t\t\t});\n\t\t}])\n\n\t\t.directive('render', render)\n\t\t.directive('dotaInclude', ['$http', '$templateCache', '$compile', function($http, $templateCache, $compile) {\n\t\t\treturn {\n\t\t\t\trestrict: 'A',\n\t\t\t\tpriority: 10000,\n\t\t\t\tterminal: true,\n\t\t\t\tcompile: function() {\n\t\t\t\t\treturn function(scope, elem, attrs) {\n\t\t\t\t\t\tvar attrCompile = makeBool(attrs.compile, 1);\n\n\t\t\t\t\t\tconsole.log('dotaInclude', attrs.dotaInclude);\n\t\t\t\t\t\t$http.get(attrs.dotaInclude, {cache: $templateCache}).success(function (data) {\n\t\t\t\t\t\t\telem.html(data);\n\t\t\t\t\t\t\tif (attrCompile !== 0) {\n\t\t\t\t\t\t\t\t$compile(elem.contents())(scope);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}])\n\t\t.directive('dotaTemplate', ['$http', '$templateCache', '$compile', function($http, $templateCache, $compile) {\n\t\t\treturn {\n\t\t\t\trestrict: 'A',\n\t\t\t\tpriority: 10000,\n\t\t\t\tterminal: true,\n\t\t\t\tcompile: function() {\n\t\t\t\t\treturn function(scope, elem, attrs) {\n\t\t\t\t\t\tconsole.log('dotaTemplate - compile', [attrs.dotaTemplate]);\n\t\t\t\t\t\tvar attrCompile = makeBool(attrs.compile, 1);\n\n\t\t\t\t\t\tscope.$watch(evalExpr(attrs.dotaTemplate), function(newVal, oldVal) {\n\t\t\t\t\t\t\tif (newVal) {\n\t\t\t\t\t\t\t\tconsole.log('dotaTemplate', newVal);\n\t\t\t\t\t\t\t\t$http.get(newVal, {cache: $templateCache}).success(function (data) {\n\t\t\t\t\t\t\t\t\telem.html(data);\n\t\t\t\t\t\t\t\t\tif (attrCompile !== 0) {\n\t\t\t\t\t\t\t\t\t\tconsole.log('dotaTemplate $compile', newVal, data);\n\t\t\t\t\t\t\t\t\t\t$compile(elem.contents())(scope);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}])\n\t\t.factory('dotaHttp', ['$compile', '$http', '$templateCache', '$filter', 'doTA',\n\t\t\tfunction($compile, $http, $templateCache, $filter, doTA) {\n\t\t\treturn function (name, scope, callback, _opt){\n\t\t\t\tvar options = {render: name, loose: 1};\n\t\t\t\tif (_opt) {\n\t\t\t\t\tfor (var x in _opt) {\n\t\t\t\t\t\toptions[x] = _opt[x];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t// /**/console.log('options')\n\n\t\t\t\tif (doTA.C[name]) {\n\t\t\t\t\t// /**/console.log('dotaHttp doTA cache', name);\n\t\t\t\t\tcallback(doTA.C[name](scope, $filter));\n\t\t\t\t} else {\n\t\t\t\t\t// /**/console.log('dotaHttp $http', name);\n\t\t\t\t\t$http.get(name, {cache: $templateCache}).success(function(data) {\n\t\t\t\t\t\t// /**/console.log('dotaHttp response', data);\n\t\t\t\t\t\tdoTA.C[name] = doTA.compile(data, options);\n\t\t\t\t\t\tcallback(doTA.C[name](scope, $filter));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t};\n\t\t}]);\n\n\t\trender.$inject = ['doTA', '$http', '$filter', '$templateCache', '$compile', '$controller'];\n\t\tfunction render(doTA, $http, $filter, $templateCache, $compile, $controller) {\n\n\t\t\treturn {\n\t\t\t\trestrict: 'A',\n\t\t\t\tpriority: 10000,\n\t\t\t\tterminal: true,\n\t\t\t\tcontroller: angular.noop,\n\t\t\t\tlink: angular.noop,\n\t\t\t\tcompile: function() {\n\t\t\t\t\tvar Watchers = [], BindValues = {}, Scopes = {};\n\t\t\t\t\tconsole.info('render compileFn');\n\n\t\t\t\t\treturn function($scope, elem, attrs) {\n\t\t\t\t\t\tconsole.time('render');\n\t\t\t\t\t\t//ToDo: check Watchers scope\n\t\t\t\t\t\twhile (Watchers.length) {\n\t\t\t\t\t\t\tWatchers.pop()();\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//used attributes, good for minification with closure compiler;\n\t\t\t\t\t\tvar attrCacheDOM = attrs.cacheDom | 0;\n\t\t\t\t\t\tvar attrRender = attrs.render;\n\t\t\t\t\t\tvar attrScope = attrs.scope;\n\t\t\t\t\t\tvar attrNgController = attrs.ngController;\n\t\t\t\t\t\tvar attrLoose = attrs.loose;\n\t\t\t\t\t\tvar attrEvent = attrs.event;\n\t\t\t\t\t\tvar attrDebug = attrs.debug;\n\t\t\t\t\t\tvar attrWatch = attrs.hasOwnProperty('watch') && attrs.watch;\n\t\t\t\t\t\tvar attrWatchDiff = attrs.watchDiff;\n\t\t\t\t\t\tvar attrCompile = attrs.compile;\n\t\t\t\t\t\tvar attrBind = attrs.bind;\n\t\t\t\t\t\tvar attrCompileAll = attrs.compileAll;\n\t\t\t\t\t\tvar attrOnload = attrs.onload;\n\t\t\t\t\t\tvar attrNgLoad = attrs.ngLoad;\n\t\t\t\t\t\tvar attrLoaded = attrs.loaded;\n\t\t\t\t\t\tvar attrInline = attrs.inline;\n\t\t\t\t\t\tvar origAttrMap = attrs.$attr;\n\t\t\t\t\t\tvar params = {};\n\t\t\t\t\t\tvar NewScope;\n\t\t\t\t\t\tvar uniqueId;\n\n\t\t\t\t\t\tattrs.loose = makeBool(attrLoose, 1); //if set, falsy => ''\n\t\t\t\t\t\tattrs.optimize = makeBool(attrs.optimize, 0);\n\t\t\t\t\t\tattrs.comment = makeBool(attrs.comment, 1); //if 0, remove comments\n\t\t\t\t\t\tattrDebug = attrs.debug = makeBool(attrDebug, 0);\n\t\t\t\t\t\tattrEvent = attrs.event = makeBool(attrEvent, 1); //ng-click to native click\n\t\t\t\t\t\tif (attrs.diffLevel) {\n\t\t\t\t\t\t\tattrs.diffLevel = +attrs.diffLevel;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//to prevent angular binding this\n\t\t\t\t\t\tif (attrNgController) {\n\t\t\t\t\t\t\telem.removeAttr('ng-controller');\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (attrCacheDOM && doTA.D[attrRender]) {\n\t\t\t\t\t\t\t// alert( doTA.D[attrRender].innerHTML);\n\t\t\t\t\t\t\tconsole.log('cacheDOM: just moved cached DOM', doTA.D[attrRender]);\n\t\t\t\t\t\t\tvar cachedElem = msie ? doTA.D[attrRender].cloneNode(true) : doTA.D[attrRender];\n\t\t\t\t\t\t\telem[0].parentNode.replaceChild(cachedElem, elem[0]);\n\t\t\t\t\t\t\tif (attrCacheDOM === 2) {\n\t\t\t\t\t\t\t\tonLoad();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//attributes on render tags to be accessiable as $attr in templates\n\t\t\t\t\t\tfor (var x in origAttrMap) {\n\t\t\t\t\t\t\tvar z = origAttrMap[x];\n\t\t\t\t\t\t\t//map data-* attributes into origAttrMap (inline text)\n\t\t\t\t\t\t\tif (!z.indexOf('data-')) {\n\t\t\t\t\t\t\t\tparams[z.slice(5)] = attrs[x];\n\t\t\t\t\t\t\t\tattrs.params = 1;\n\t\t\t\t\t\t\t//map scope-* attributes into origAttrMap (first level var from scope)\n\t\t\t\t\t\t\t} else if (!z.indexOf('scope-')) {\n\t\t\t\t\t\t\t\tattrs.params = 1;\n\t\t\t\t\t\t\t\tif (attrs[x].indexOf('.') >= 0 || attrs[x].indexOf('[') >= 0) {\n\t\t\t\t\t\t\t\t\tif (attrs[x].indexOf('$index') > 0) {\n\t\t\t\t\t\t\t\t\t\tparams[z.slice(6)] = $scope.$eval(attrs[x]);\n\t\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t\tparams[z.slice(6)] = resolveObject(attrs[x], $scope);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tparams[z.slice(6)] = $scope[attrs[x]];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//create new scope if scope=1 or ng-controller is specified\n\t\t\t\t\t\tif (attrScope || attrNgController) {\n\t\t\t\t\t\t\tconsole.log('scope', attrScope, elem, elem.scope());\n\n\t\t\t\t\t\t\t//$destroy previously created scope or will leak.\n\t\t\t\t\t\t\tif (Scopes[attrRender]) {\n\t\t\t\t\t\t\t\tScopes[attrRender].$destroy();\n\t\t\t\t\t\t\t\t// /**/console.log('newScope $destroy', attrRender, NewScope);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tNewScope = Scopes[attrRender] = $scope.$new();\n\t\t\t\t\t\t\t// /**/console.log('newScope created', attrRender, NewScope);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tNewScope = $scope;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t//attach ng-controller, and remove attr to prevent angular running again\n\t\t\t\t\t\tif (attrNgController) {\n\t\t\t\t\t\t\tvar asPos = attrNgController.indexOf(' as ');\n\t\t\t\t\t\t\tif (asPos > 0) {\n\t\t\t\t\t\t\t\tattrNgController = attrNgController.substr(0, asPos).trim();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tconsole.log('new controller', attrNgController);\n\t\t\t\t\t\t\tvar l = {$scope: NewScope}, controller = $controller(attrNgController, l);\n\t\t\t\t\t\t\t//untested controller-as attr or as syntax\n\t\t\t\t\t\t\tif (attrs.controllerAs || asPos > 0) {\n\t\t\t\t\t\t\t\tNewScope[attrs.controllerAs || attrNgController.substr(asPos + 4).trim()] = controller;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telem.data('$ngControllerController', controller);\n\t\t\t\t\t\t\telem.children().data('$ngControllerController', controller);\n\t\t\t\t\t\t\tconsole.log('new controller created', attrRender);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// watch and re-render the whole template when change\n\t\t\t\t\t\tif(attrWatch) {\n\t\t\t\t\t\t\tconsole.log(attrRender, 'registering watch for', attrWatch);\n\t\t\t\t\t\t\tvar oneTimePos = attrWatch.indexOf('::');\n\t\t\t\t\t\t\tif (oneTimePos >= 0) {\n\t\t\t\t\t\t\t\tattrWatch = attrWatch.slice(oneTimePos + 2);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar oneTimeExp = NewScope['$watch' + (attrWatch[0] === '[' ? 'Collection': '')](evalExpr(attrWatch), function(newVal, oldVal){\n\t\t\t\t\t\t\t\tif(newVal !== undefined && newVal !== oldVal && doTA.C[attrRender]) {\n\t\t\t\t\t\t\t\t\tif (oneTimePos >= 0) oneTimeExp();\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'watch before render');\n\t\t\t\t\t\t\t\t\trenderTemplate(doTA.C[attrRender]);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'watch after render');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// watch and partially render by diffing. diff-level = 2 may be used to patch children\n\t\t\t\t\t\tif(attrWatchDiff) {\n\t\t\t\t\t\t\tconsole.log(attrRender, 'registering diff watch for', attrWatchDiff);\n\t\t\t\t\t\t\tNewScope['$watch' + (attrWatchDiff[0] === '[' ? 'Collection': '')](evalExpr(attrWatchDiff), function(newVal, oldVal){\n\t\t\t\t\t\t\t\tif(newVal !== oldVal && doTA.C[attrRender]) {\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'diff watch before render');\n\t\t\t\t\t\t\t\t\trenderTemplate(doTA.C[attrRender], true);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'diff watch after render');\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// run the loader\n\t\t\t\t\t\tloader();\n\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\t// cache-dom for static html, $scope will not be triggered\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\tfunction cacheDOM(){\n\t\t\t\t\t\t\t// console.log('cacheDOM()', attrs)\n\t\t\t\t\t\t\t$scope.$on(\"$destroy\", function(){\n\t\t\t\t\t\t\t\tconsole.log('$destroy', elem);\n\t\t\t\t\t\t\t\t// alert(['$destroy', elem[0], frag]);\n\t\t\t\t\t\t\t\tif (frag) {\n\t\t\t\t\t\t\t\t\tdoTA.D[attrRender] = elem[0];\n\t\t\t\t\t\t\t\t\tfrag.appendChild(elem[0]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\t// doTA.compile and return compiledFn\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\tfunction compile(template) {\n\t\t\t\t\t\t\tif(attrDebug) {\n\t\t\t\t\t\t\t\tconsole.log(attrRender + ':' + template);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tconsole.log(attrRender,'before compile');\n\t\t\t\t\t\t\tvar compiledFn;\n\t\t\t\t\t\t\t//compile the template html text to function like doT does\n\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\tconsole.time('compile:' + attrRender);\n\t\t\t\t\t\t\t\tcompiledFn = doTA.compile(template, attrs);\n\t\t\t\t\t\t\t\tconsole.timeEnd('compile:'\t+ attrRender);\n\t\t\t\t\t\t\t\tuniqueId = doTA.U[attrRender];\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'after compile(no-cache)');\n\t\t\t\t\t\t\t} catch (x) {\n\t\t\t\t\t\t\t\t/**/console.log('compile error', attrs, template);\n\t\t\t\t\t\t\t\tthrow x;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//compiled func into cache for later use\n\t\t\t\t\t\t\tif (attrRender) {\n\t\t\t\t\t\t\t\tdoTA.C[attrRender] = compiledFn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\treturn compiledFn;\n\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\t// attach ng-bind\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\tfunction addNgBind(rawElem, scope, uniqueId) {\n\t\t\t\t\t\t\tvar elements = getElements(rawElem, 'db' + uniqueId);\n\t\t\t\t\t\t\tforEachArray(elements, function(partial) {\n\t\t\t\t\t\t\t\tif (partial.db) return;\n\t\t\t\t\t\t\t\tpartial.db = 1;\n\t\t\t\t\t\t\t\t//override ng-bind\n\t\t\t\t\t\t\t\tvar bindExpr = partial.getAttribute('dota-bind');\n\t\t\t\t\t\t\t\tvar oneTimePos = bindExpr.indexOf('::');\n\t\t\t\t\t\t\t\tif (oneTimePos >= 0) {\n\t\t\t\t\t\t\t\t\tbindExpr = bindExpr.slice(oneTimePos + 2);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif (BindValues[bindExpr]) {\n\t\t\t\t\t\t\t\t\tpartial.innerHTML = BindValues[bindExpr];\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tconsole.log('binding', bindExpr);\n\t\t\t\t\t\t\t\tconsole.time('dota-bind');\n\t\t\t\t\t\t\t\tvar oneTimeExp = scope['$watch' + (bindExpr[0] === '[' ? 'Collection': '')](evalExpr(bindExpr), function(newVal, oldVal){\n\t\t\t\t\t\t\t\t\tif (newVal && oneTimePos >= 0) { oneTimeExp(); }\n\t\t\t\t\t\t\t\t\tconsole.log('watch fired before bindExpr', [newVal, oldVal]);\n\t\t\t\t\t\t\t\t\tpartial[textContent] = BindValues[bindExpr] = newVal || '';\n\t\t\t\t\t\t\t\t\tconsole.log('watch fired after render');\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tWatchers.push(oneTimeExp);\n\t\t\t\t\t\t\t\tconsole.timeEnd('dota-bind');\n\t\t\t\t\t\t\t\tconsole.log(partial);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\t// attach ng-model, events, ng-bind, and $compile\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\tfunction attachEventsAndCompile(rawElem, scope) {\n\t\t\t\t\t\t\tconsole.log('attachEventsAndCompile', attrRender, attrs.model, attrEvent, attrBind, attrCompile, attrCompileAll);\n\n\t\t\t\t\t\t\tif (attrs.model) {\n\t\t\t\t\t\t\t\tconsole.time('ngModel:' + attrRender);\n\t\t\t\t\t\t\t\taddNgModels(rawElem, scope, uniqueId);\n\t\t\t\t\t\t\t\tconsole.timeEnd('ngModel:' + attrRender);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//attach events before replacing\n\t\t\t\t\t\t\tif (attrEvent) {\n\t\t\t\t\t\t\t\tconsole.time('ng-events:' + attrRender);\n\t\t\t\t\t\t\t\taddEvents(rawElem, scope, attrEvent, uniqueId);\n\t\t\t\t\t\t\t\tconsole.timeEnd('ng-events:' + attrRender);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//ng-bind\n\t\t\t\t\t\t\tif (attrBind) {\n\t\t\t\t\t\t\t\tconsole.time('ngBind:' + attrRender);\n\t\t\t\t\t\t\t\taddNgBind(rawElem, scope, uniqueId);\n\t\t\t\t\t\t\t\tconsole.timeEnd('ngBind:' + attrRender);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (attrs.ngModel) {\n\t\t\t\t\t\t\t\telem.removeAttr('render');\n\t\t\t\t\t\t\t\tconsole.time('suicide:' + attrRender);\n\t\t\t\t\t\t\t\t$compile(elem[0])(scope);\n\t\t\t\t\t\t\t\tconsole.timeEnd('suicide:' + attrRender);\n\n\t\t\t\t\t\t\t//$compile html if you need ng-model or ng-something\n\t\t\t\t\t\t\t} else if (attrCompile){\n\t\t\t\t\t\t\t\t//partially compile each dota-pass and its childs,\n\t\t\t\t\t\t\t\t// not sure this is suitable if you have so many dota-passes\n\t\t\t\t\t\t\t\tconsole.time('$compile:' + attrRender);\n\t\t\t\t\t\t\t\tforEachArray(rawElem.querySelectorAll('[dota-pass]'), function(partial){\n\t\t\t\t\t\t\t\t\t// console.log('$compile:partial:' + attrRender, partial);\n\t\t\t\t\t\t\t\t\t$compile(partial)(scope);\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tconsole.timeEnd('$compile:' + attrRender);\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'after $compile partial');\n\n\t\t\t\t\t\t\t} else if (attrCompileAll){\n\t\t\t\t\t\t\t\t//compile child nodes\n\t\t\t\t\t\t\t\tconsole.time('compile-all:' + attrRender);\n\t\t\t\t\t\t\t\t$compile(rawElem.contentDocument || rawElem.childNodes)(scope);\n\t\t\t\t\t\t\t\tconsole.timeEnd('compile-all:' + attrRender);\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'after $compile all');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction onLoad() {\n\t\t\t\t\t\t\tif(attrOnload){\n\t\t\t\t\t\t\t\tsetTimeout(function(){\n\t\t\t\t\t\t\t\t\tvar onLoadFn = new Function(attrOnload);\n\t\t\t\t\t\t\t\t\tonLoadFn.apply(elem[0]);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender,'after eval');\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//execute scope functions\n\t\t\t\t\t\t\tif(attrNgLoad) {\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tNewScope.$evalAsync(attrNgLoad);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'after scope $evalAsync scheduled');\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\t// render the template, cache-dom, run onload scripts, add dynamic watches\n\t\t\t\t\t\t////////////////////////////////////////////////////////////////////////////\n\t\t\t\t\t\tfunction renderTemplate(func, patch) {\n\n\t\t\t\t\t\t\t//unless pre-render\n\t\t\t\t\t\t\tif (func) {\n\t\t\t\t\t\t\t\t//trigger destroying children\n\t\t\t\t\t\t\t\tif (!patch && elem[0].firstChild) {\n\t\t\t\t\t\t\t\t\tdestroyChildren(elem[0]);\n\t\t\t\t\t\t\t\t}\n\n\n\t\t\t\t\t\t\t\tconsole.log('uniqueId', attrRender, uniqueId);\n\n\t\t\t\t\t\t\t\tconsole.log(attrRender, 'before render', patch);\n\t\t\t\t\t\t\t\t//execute render function against scope, $filter, etc.\n\t\t\t\t\t\t\t\tvar renderedHTML;\n\t\t\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t\t\tconsole.time('render:' + attrRender);\n\t\t\t\t\t\t\t\t\trenderedHTML = func(NewScope, $filter, params, patch);\n\t\t\t\t\t\t\t\t\tconsole.timeEnd('render:' + attrRender);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender,'after render', patch);\n\t\t\t\t\t\t\t\t} catch (x) {\n\t\t\t\t\t\t\t\t\t/**/console.log('render error', func);\n\t\t\t\t\t\t\t\t\tthrow x;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tif(attrDebug) {\n\t\t\t\t\t\t\t\t\t/* */console.log(attrRender, renderedHTML);\n\t\t\t\t\t\t\t\t\t// console.log(attrRender, func.toString());\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t// console.log('patch?', [patch]);\n\t\t\t\t\t\t\t\tif (patch) {\n\t\t\t\t\t\t\t\t\tattachEventsAndCompile(elem[0], NewScope);\n\t\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t//if node has some child, use appendChild\n\t\t\t\t\t\t\t\tif (elem[0].firstChild) {\n\t\t\t\t\t\t\t\t\tconsole.time('appendChild:' + attrRender);\n\t\t\t\t\t\t\t\t\tvar firstChild;\n\t\t\t\t\t\t\t\t\tnewNode.innerHTML = renderedHTML;\n\n\t\t\t\t\t\t\t\t\t//if needed, attach events and $compile\n\t\t\t\t\t\t\t\t\tattachEventsAndCompile(newNode, NewScope);\n\n\t\t\t\t\t\t\t\t\t//move child from temp nodes\n\t\t\t\t\t\t\t\t\twhile ((firstChild = newNode.firstChild)) {\n\t\t\t\t\t\t\t\t\t\telem[0].appendChild(firstChild);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconsole.timeEnd('appendChild:' + attrRender);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'after appendChild');\n\n\t\t\t\t\t\t\t\t//if node is blank, use innerHTML\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tconsole.time('innerHTML:' + attrRender);\n\t\t\t\t\t\t\t\t\telem[0].innerHTML = renderedHTML;\n\t\t\t\t\t\t\t\t\tconsole.timeEnd('innerHTML:' + attrRender);\n\t\t\t\t\t\t\t\t\tconsole.log(attrRender, 'after innerHTML');\n\n\t\t\t\t\t\t\t\t\t//if needed, attach events and $compile\n\t\t\t\t\t\t\t\t\tattachEventsAndCompile(elem[0], NewScope);\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//attach client side to prerender context\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tattachEventsAndCompile(elem[0], NewScope);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//execute raw functions, like jQuery\n\t\t\t\t\t\t\tonLoad();\n\n\t\t\t\t\t\t\tif (attrCacheDOM) {\n\t\t\t\t\t\t\t\tcacheDOM();\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//you can now hide raw html before rendering done\n\t\t\t\t\t\t\t// with loaded=false attribute and following css\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\t[render][loaded]:not([loaded=true]) {\n\t\t\t\t\t\t\t\tdisplay: none;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tif (attrLoaded) {\n\t\t\t\t\t\t\t\telem.attr(\"loaded\",true);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t//this watch may be dynamically add or remove\n\t\t\t\t\t\t\tif (func && doTA.W[uniqueId]) {\n\t\t\t\t\t\t\t\tvar W = doTA.W[uniqueId];\n\t\t\t\t\t\t\t\tconsole.log('partial watch', attrRender, W);\n\t\t\t\t\t\t\t\tvar scopes = {}, watches = {};\n\t\t\t\t\t\t\t\tfor(var i = 0; i < W.length; i++) {\n\t\t\t\t\t\t\t\t\tvar w = W[i];\n\t\t\t\t\t\t\t\t\t// console.log('watch', w);\n\n\t\t\t\t\t\t\t\t\twatches[w.I] = NewScope['$watch' + (w.W[0] === '[' ? 'Collection': '')](evalExpr(w.W), function(newVal, oldVal){\n\t\t\t\t\t\t\t\t\t\tconsole.log('partial watch trigger', [newVal, oldVal]);\n\t\t\t\t\t\t\t\t\t\tif (newVal === oldVal && !newVal) { return; }\n\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch before render');\n\t\t\t\t\t\t\t\t\t\tvar oldTag = document.getElementById(w.I);\n\t\t\t\t\t\t\t\t\t\tif (!oldTag) { return console.log('tag not found'); }\n\n\t\t\t\t\t\t\t\t\t\t//we don't need new scope here\n\t\t\t\t\t\t\t\t\t\tvar content = w.F(NewScope, $filter, params, 0, w.N);\n\t\t\t\t\t\t\t\t\t\tif (!content) { return console.log('no contents'); }\n\t\t\t\t\t\t\t\t\t\tconsole.log('watch new content', content);\n\t\t\t\t\t\t\t\t\t\tvar newTag = angular.element(content);\n\n\t\t\t\t\t\t\t\t\t\t//compile only if specified\n\t\t\t\t\t\t\t\t\t\tif (w.C) {\n\t\t\t\t\t\t\t\t\t\t\t//scope management\n\t\t\t\t\t\t\t\t\t\t\tif (scopes[w.I]) {\n\t\t\t\t\t\t\t\t\t\t\t\tscopes[w.I].$destroy();\n\t\t\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch old $scope $destroy');\n\t\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\t\tscopes[w.I] = NewScope.$new();\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch new $scope');\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tangular.element(oldTag).replaceWith(newTag);\n\n\t\t\t\t\t\t\t\t\t\tattachEventsAndCompile(newTag[0], scopes[w.I] || NewScope);\n\n\t\t\t\t\t\t\t\t\t\tif (!attrCompile && !attrCompileAll && w.C) {\n\t\t\t\t\t\t\t\t\t\t\t$compile(newTag)(scopes[w.I] || NewScope);\n\t\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch content written', newTag[0]);\n\n\t\t\t\t\t\t\t\t\t\t//unregister watch if wait once\n\t\t\t\t\t\t\t\t\t\tif (w.O) {\n\t\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch unregistered');\n\t\t\t\t\t\t\t\t\t\t\twatches[w.I]();\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\tconsole.log(attrRender, w.W, 'partial watch after render');\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tfunction loader(){\n\t\t\t\t\t\t\tif(doTA.C[attrRender]){\n\t\t\t\t\t\t\t\tuniqueId = doTA.U[attrRender];\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'get compile function from cache');\n\t\t\t\t\t\t\t\t//watch need to redraw, also inline, because inline always hasChildNodes\n\t\t\t\t\t\t\t\tif (elem[0].hasChildNodes() && !attrInline) {\n\t\t\t\t\t\t\t\t\tconsole.log('hasChildNodes', attrRender);\n\t\t\t\t\t\t\t\t\trenderTemplate();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\trenderTemplate(doTA.C[attrRender]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (attrInline) {\n\t\t\t\t\t\t\t\t// render inline by loading inner html tags,\n\t\t\t\t\t\t\t\t// html entities encoding sometimes need for htmlparser here or you may use htmlparser2 (untested)\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'before get innerHTML');\n\t\t\t\t\t\t\t\tvar v = elem[0].innerHTML;\n\t\t\t\t\t\t\t\tconsole.log(attrRender,'after get innerHTML');\n\t\t\t\t\t\t\t\trenderTemplate(compile(v, attrs));\n\t\t\t\t\t\t\t} else if (attrRender) { //load real template\n\t\t\t\t\t\t\t\tconsole.log('before $http', attrRender);\n\t\t\t\t\t\t\t\t//server side rendering or miss to use inline attrs?\n\t\t\t\t\t\t\t\tif (elem[0].hasChildNodes()) {\n\t\t\t\t\t\t\t\t\tconsole.log('hasChildNodes', attrRender);\n\t\t\t\t\t\t\t\t\trenderTemplate();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\t$http.get(attrRender, {cache: $templateCache}).success(function (v) {\n\t\t\t\t\t\t\t\t\t\tconsole.log('after $http response', attrRender);\n\t\t\t\t\t\t\t\t\t\trenderTemplate(compile(v, attrs));\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tconsole.timeEnd('render');\n\t\t\t\t\t\t//////////////////////////////////////////////////\n\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t};\n\t\t}\n}));\n"],"sourceRoot":"/source/"}