Skip to content

Instantly share code, notes, and snippets.

@tzkmx
Created August 5, 2016 19:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tzkmx/1ef332a911fcf78f5494d50abfc26f4a to your computer and use it in GitHub Desktop.
Save tzkmx/1ef332a911fcf78f5494d50abfc26f4a to your computer and use it in GitHub Desktop.
Demo of tail call optimization in javascript with metaret.js
function fact(i) {
return i === 1 ? 1 : i * fact(i-1);
}
console.time('fact recursive naive');
for(var i = 0; i<1000000 ; i++) {
var g=fact(170);
}
console.log(g);
console.timeEnd('fact recursive naive');
metaparse("metafun fact_m(self, i, acc) { " +
" acc || (acc = 1 ) ; " +
" if(i > 1) { metaret self, i - 1, acc * i; }"+
" else { return acc; }}"); //need$('js/fact_m.jsm');
console.time('fact recursive meta');
for(var i = 0; i<1000000 ; i++) {
var g=fact_m(170);
}
console.log(g);
console.timeEnd('fact recursive meta');
// semibeautified from https://github.com/glathoud/js.metaret/blob/master/metaret_standalone.js
{
var global, exports;
(function(m) {
m.need$ = A;
var E = {},
u = {};
var vB = typeof read === 'function';
need$.read = vB ? read : h; {
var m, F;
if (typeof codeparse === 'undefined') {
var m, F;
if (typeof acorn === 'undefined') {
(function(vz, vA) {
if (typeof F == "object" && typeof module == "object") return vA(F);
if (typeof define == "function" && define.amd) return define(["exports"], vA);
vA(vz.acorn || (vz.acorn = {}));
})(this, function(s1) {
"use strict";
s1.version = "0.5.1";
var pL, pG, tu, s0;
s1.parse = function(vy, vx) {
pG = String(vy);
tu = pG.length;
vl(vx);
uQ();
return sN(pL.program);
};
var vv = s1.defaultOptions = {
ecmaVersion: 5,
strictSemicolons: false,
allowTrailingCommas: true,
forbidReserved: false,
allowReturnOutsideFunction: false,
locations: false,
onComment: null,
ranges: false,
program: null,
sourceFile: null,
directSourceFile: null,
jsm: false
};
function vl(vw) {
pL = vw || {};
for (var vu in vv)
if (!Object.prototype.hasOwnProperty.call(pL, vu)) pL[vu] = vv[vu];
s0 = pL.sourceFile || null;
}
var vb = s1.getLineInfo = function(vt, vq) {
for (var vr = 1, vp = 0;;) {
uN.lastIndex = vp;
var vs = uN.exec(vt);
if (vs && vs.index < vq) {
++vr;
vp = vs.index + vs[0].length;
} else break;
}
return {
line: vr,
column: vq - vp
};
};
s1.canBeSafeIdentifierName = vo;
function vo(vn) {
return !(pK(vn) || pJ(vn) || pH(vn) || p6(vn) || ta(vn) || t_(vn));
}
s1.tokenize = function(vm, vk) {
pG = String(vm);
tu = pG.length;
vl(vk);
uQ();
var vi = {};
function ve(vj) {
sc = pF;
sC(vj);
vi.start = pD;
vi.end = pF;
vi.startLoc = qP;
vi.endLoc = qN;
vi.type = pB;
vi.value = pC;
return vi;
}
ve.jumpTo = function(vh, vf) {
sM = vh;
if (pL.locations) {
s3 = 1;
s4 = uN.lastIndex = 0;
var vg;
while ((vg = uN.exec(pG)) && vg.index < vh) {
++s3;
s4 = vg.index + vg[0].length;
}
}
pz = vf;
s2();
};
return ve;
};
var sM;
var pD, pF;
var qP, qN;
var pB, pC;
var pz;
var s3, s4;
var sh, sc, sL;
var qb, q$, pI;
var p9;
function pE(v$, va) {
var v_ = vb(pG, v$);
va += " (" + v_.line + ":" + v_.column + ")";
var u9 = new SyntaxError(va);
u9.pos = v$;
u9.loc = v_;
u9.raisedAt = sM;
throw u9;
}
var qC = [];
var qn = {
type: "num"
},
qT = {
type: "regexp"
},
qm = {
type: "string"
};
var pM = {
type: "name"
},
sI = {
type: "eof"
};
var sz = {
keyword: "break"
},
sj = {
keyword: "case",
beforeExpr: true
},
sa = {
keyword: "catch"
};
var sB = {
keyword: "continue"
},
sw = {
keyword: "debugger"
},
sk = {
keyword: "default"
};
var sv = {
keyword: "do",
isLoop: true
},
sq = {
keyword: "else",
beforeExpr: true
};
var s_ = {
keyword: "finally"
},
su = {
keyword: "for",
isLoop: true
},
qH = {
keyword: "function"
};
var sr = {
keyword: "if"
},
sm = {
keyword: "return",
beforeExpr: true
},
r4 = {
keyword: "switch"
};
var se = {
keyword: "throw",
beforeExpr: true
},
sb = {
keyword: "try"
},
rH = {
keyword: "var"
};
var r9 = {
keyword: "while",
isLoop: true
},
r7 = {
keyword: "with"
},
qF = {
keyword: "new",
beforeExpr: true
};
var qU = {
keyword: "this"
};
var so = {
keyword: "metafun"
},
sn = {
keyword: "metaret",
beforeExpr: true
},
sp = {
keyword: "inline"
};
var qS = {
keyword: "null",
atomValue: null
},
qR = {
keyword: "true",
atomValue: true
};
var qQ = {
keyword: "false",
atomValue: false
};
var re = {
keyword: "in",
binop: 7,
beforeExpr: true
};
var t$ = {
"break": sz,
"case": sj,
"catch": sa,
"continue": sB,
"debugger": sw,
"default": sk,
"do": sv,
"else": sq,
"finally": s_,
"for": su,
"function": qH,
"if": sr,
"return": sm,
"switch": r4,
"throw": se,
"try": sb,
"var": rH,
"while": r9,
"with": r7,
"null": qS,
"true": qR,
"false": qQ,
"new": qF,
"in": re,
"instanceof": {
keyword: "instanceof",
binop: 7,
beforeExpr: true
},
"this": qU,
"typeof": {
keyword: "typeof",
prefix: true,
beforeExpr: true
},
"void": {
keyword: "void",
prefix: true,
beforeExpr: true
},
"delete": {
keyword: "delete",
prefix: true,
beforeExpr: true
}
};
var s9 = {
"metafun": so,
"metaret": sn,
"inline": sp
};
var qK = {
type: "[",
beforeExpr: true
},
qJ = {
type: "]"
},
qI = {
type: "{",
beforeExpr: true
};
var qz = {
type: "}"
},
qf = {
type: "(",
beforeExpr: true
},
qe = {
type: ")"
};
var pT = {
type: ",",
beforeExpr: true
},
rN = {
type: ";",
beforeExpr: true
};
var qx = {
type: ":",
beforeExpr: true
},
pw = {
type: "."
},
rk = {
type: "?",
beforeExpr: true
};
var sE = {
binop: 10,
beforeExpr: true
},
ry = {
isAssign: true,
beforeExpr: true
};
var sD = {
isAssign: true,
beforeExpr: true
};
var uq = {
postfix: true,
prefix: true,
isUpdate: true
},
t6 = {
prefix: true,
beforeExpr: true
};
var rb = {
binop: 1,
beforeExpr: true
};
var r$ = {
binop: 2,
beforeExpr: true
};
var uv = {
binop: 3,
beforeExpr: true
};
var us = {
binop: 4,
beforeExpr: true
};
var uu = {
binop: 5,
beforeExpr: true
};
var ug = {
binop: 6,
beforeExpr: true
};
var uj = {
binop: 7,
beforeExpr: true
};
var un = {
binop: 8,
beforeExpr: true
};
var uo = {
binop: 9,
prefix: true,
beforeExpr: true
};
var uy = {
binop: 10,
beforeExpr: true
};
s1.tokTypes = {
bracketL: qK,
bracketR: qJ,
braceL: qI,
braceR: qz,
parenL: qf,
parenR: qe,
comma: pT,
semi: rN,
colon: qx,
dot: pw,
question: rk,
slash: sE,
eq: ry,
name: pM,
eof: sI,
num: qn,
regexp: qT,
string: qm
};
for (var u8 in t$) s1.tokTypes["_" + u8] = t$[u8];
function uW(uY) {
uY = uY.split(" ");
var uX = "",
u2 = [];
out: for (var u1 = 0; u1 < uY.length; ++u1) {
for (var u7 = 0; u7 < u2.length; ++u7)
if (u2[u7][0].length == uY[u1].length) {
u2[u7].push(uY[u1]);
continue out;
}
u2.push([uY[u1]]);
}
function uZ(u6) {
if (u6.length == 1) return uX += "return str === " + JSON.stringify(u6[0]) + ";";
uX += "switch(str){";
for (var u5 = 0; u5 < u6.length; ++u5) uX += "case " + JSON.stringify(u6[u5]) + ":";
uX += "return true}return false;";
}
if (u2.length > 3) {
u2.sort(function(u3, u4) {
return u4.length - u3.length;
});
uX += "switch(str.length){";
for (var u1 = 0; u1 < u2.length; ++u1) {
var u0 = u2[u1];
uX += "case " + u0[0].length + ":";
uZ(u0);
}
uX += "}";
} else {
uZ(uY);
}
return new Function("str", uX);
}
var pK = uW("abstract boolean byte char class double enum export extends final float goto implements import int interface long native package private protected public short static super synchronized throws transient volatile");
var pJ = uW("class enum extends super const export import");
var pH = uW("implements interface let package private protected public static yield");
var p6 = uW("eval arguments");
var ta = uW("break case catch continue debugger default do else finally for function if return switch throw try var while with null true false instanceof typeof void delete new in this");
var t_ = uW("metafun metaret inline");
var uD = /[\u1680\u180e\u2000-\u200a\u202f\u205f\u3000\ufeff]/;
var uV = "\xaa\xb5\xba\xc0-\xd6\xd8-\xf6\xf8-\u02c1\u02c6-\u02d1\u02e0-\u02e4\u02ec\u02ee\u0370-\u0374\u0376\u0377\u037a-\u037d\u0386\u0388-\u038a\u038c\u038e-\u03a1\u03a3-\u03f5\u03f7-\u0481\u048a-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05d0-\u05ea\u05f0-\u05f2\u0620-\u064a\u066e\u066f\u0671-\u06d3\u06d5\u06e5\u06e6\u06ee\u06ef\u06fa-\u06fc\u06ff\u0710\u0712-\u072f\u074d-\u07a5\u07b1\u07ca-\u07ea\u07f4\u07f5\u07fa\u0800-\u0815\u081a\u0824\u0828\u0840-\u0858\u08a0\u08a2-\u08ac\u0904-\u0939\u093d\u0950\u0958-\u0961\u0971-\u0977\u0979-\u097f\u0985-\u098c\u098f\u0990\u0993-\u09a8\u09aa-\u09b0\u09b2\u09b6-\u09b9\u09bd\u09ce\u09dc\u09dd\u09df-\u09e1\u09f0\u09f1\u0a05-\u0a0a\u0a0f\u0a10\u0a13-\u0a28\u0a2a-\u0a30\u0a32\u0a33\u0a35\u0a36\u0a38\u0a39\u0a59-\u0a5c\u0a5e\u0a72-\u0a74\u0a85-\u0a8d\u0a8f-\u0a91\u0a93-\u0aa8\u0aaa-\u0ab0\u0ab2\u0ab3\u0ab5-\u0ab9\u0abd\u0ad0\u0ae0\u0ae1\u0b05-\u0b0c\u0b0f\u0b10\u0b13-\u0b28\u0b2a-\u0b30\u0b32\u0b33\u0b35-\u0b39\u0b3d\u0b5c\u0b5d\u0b5f-\u0b61\u0b71\u0b83\u0b85-\u0b8a\u0b8e-\u0b90\u0b92-\u0b95\u0b99\u0b9a\u0b9c\u0b9e\u0b9f\u0ba3\u0ba4\u0ba8-\u0baa\u0bae-\u0bb9\u0bd0\u0c05-\u0c0c\u0c0e-\u0c10\u0c12-\u0c28\u0c2a-\u0c33\u0c35-\u0c39\u0c3d\u0c58\u0c59\u0c60\u0c61\u0c85-\u0c8c\u0c8e-\u0c90\u0c92-\u0ca8\u0caa-\u0cb3\u0cb5-\u0cb9\u0cbd\u0cde\u0ce0\u0ce1\u0cf1\u0cf2\u0d05-\u0d0c\u0d0e-\u0d10\u0d12-\u0d3a\u0d3d\u0d4e\u0d60\u0d61\u0d7a-\u0d7f\u0d85-\u0d96\u0d9a-\u0db1\u0db3-\u0dbb\u0dbd\u0dc0-\u0dc6\u0e01-\u0e30\u0e32\u0e33\u0e40-\u0e46\u0e81\u0e82\u0e84\u0e87\u0e88\u0e8a\u0e8d\u0e94-\u0e97\u0e99-\u0e9f\u0ea1-\u0ea3\u0ea5\u0ea7\u0eaa\u0eab\u0ead-\u0eb0\u0eb2\u0eb3\u0ebd\u0ec0-\u0ec4\u0ec6\u0edc-\u0edf\u0f00\u0f40-\u0f47\u0f49-\u0f6c\u0f88-\u0f8c\u1000-\u102a\u103f\u1050-\u1055\u105a-\u105d\u1061\u1065\u1066\u106e-\u1070\u1075-\u1081\u108e\u10a0-\u10c5\u10c7\u10cd\u10d0-\u10fa\u10fc-\u1248\u124a-\u124d\u1250-\u1256\u1258\u125a-\u125d\u1260-\u1288\u128a-\u128d\u1290-\u12b0\u12b2-\u12b5\u12b8-\u12be\u12c0\u12c2-\u12c5\u12c8-\u12d6\u12d8-\u1310\u1312-\u1315\u1318-\u135a\u1380-\u138f\u13a0-\u13f4\u1401-\u166c\u166f-\u167f\u1681-\u169a\u16a0-\u16ea\u16ee-\u16f0\u1700-\u170c\u170e-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176c\u176e-\u1770\u1780-\u17b3\u17d7\u17dc\u1820-\u1877\u1880-\u18a8\u18aa\u18b0-\u18f5\u1900-\u191c\u1950-\u196d\u1970-\u1974\u1980-\u19ab\u19c1-\u19c7\u1a00-\u1a16\u1a20-\u1a54\u1aa7\u1b05-\u1b33\u1b45-\u1b4b\u1b83-\u1ba0\u1bae\u1baf\u1bba-\u1be5\u1c00-\u1c23\u1c4d-\u1c4f\u1c5a-\u1c7d\u1ce9-\u1cec\u1cee-\u1cf1\u1cf5\u1cf6\u1d00-\u1dbf\u1e00-\u1f15\u1f18-\u1f1d\u1f20-\u1f45\u1f48-\u1f4d\u1f50-\u1f57\u1f59\u1f5b\u1f5d\u1f5f-\u1f7d\u1f80-\u1fb4\u1fb6-\u1fbc\u1fbe\u1fc2-\u1fc4\u1fc6-\u1fcc\u1fd0-\u1fd3\u1fd6-\u1fdb\u1fe0-\u1fec\u1ff2-\u1ff4\u1ff6-\u1ffc\u2071\u207f\u2090-\u209c\u2102\u2107\u210a-\u2113\u2115\u2119-\u211d\u2124\u2126\u2128\u212a-\u212d\u212f-\u2139\u213c-\u213f\u2145-\u2149\u214e\u2160-\u2188\u2c00-\u2c2e\u2c30-\u2c5e\u2c60-\u2ce4\u2ceb-\u2cee\u2cf2\u2cf3\u2d00-\u2d25\u2d27\u2d2d\u2d30-\u2d67\u2d6f\u2d80-\u2d96\u2da0-\u2da6\u2da8-\u2dae\u2db0-\u2db6\u2db8-\u2dbe\u2dc0-\u2dc6\u2dc8-\u2dce\u2dd0-\u2dd6\u2dd8-\u2dde\u2e2f\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303c\u3041-\u3096\u309d-\u309f\u30a1-\u30fa\u30fc-\u30ff\u3105-\u312d\u3131-\u318e\u31a0-\u31ba\u31f0-\u31ff\u3400-\u4db5\u4e00-\u9fcc\ua000-\ua48c\ua4d0-\ua4fd\ua500-\ua60c\ua610-\ua61f\ua62a\ua62b\ua640-\ua66e\ua67f-\ua697\ua6a0-\ua6ef\ua717-\ua71f\ua722-\ua788\ua78b-\ua78e\ua790-\ua793\ua7a0-\ua7aa\ua7f8-\ua801\ua803-\ua805\ua807-\ua80a\ua80c-\ua822\ua840-\ua873\ua882-\ua8b3\ua8f2-\ua8f7\ua8fb\ua90a-\ua925\ua930-\ua946\ua960-\ua97c\ua984-\ua9b2\ua9cf\uaa00-\uaa28\uaa40-\uaa42\uaa44-\uaa4b\uaa60-\uaa76\uaa7a\uaa80-\uaaaf\uaab1\uaab5\uaab6\uaab9-\uaabd\uaac0\uaac2\uaadb-\uaadd\uaae0-\uaaea\uaaf2-\uaaf4\uab01-\uab06\uab09-\uab0e\uab11-\uab16\uab20-\uab26\uab28-\uab2e\uabc0-\uabe2\uac00-\ud7a3\ud7b0-\ud7c6\ud7cb-\ud7fb\uf900-\ufa6d\ufa70-\ufad9\ufb00-\ufb06\ufb13-\ufb17\ufb1d\ufb1f-\ufb28\ufb2a-\ufb36\ufb38-\ufb3c\ufb3e\ufb40\ufb41\ufb43\ufb44\ufb46-\ufbb1\ufbd3-\ufd3d\ufd50-\ufd8f\ufd92-\ufdc7\ufdf0-\ufdfb\ufe70-\ufe74\ufe76-\ufefc\uff21-\uff3a\uff41-\uff5a\uff66-\uffbe\uffc2-\uffc7\uffca-\uffcf\uffd2-\uffd7\uffda-\uffdc";
var uU = "\u0300-\u036f\u0483-\u0487\u0591-\u05bd\u05bf\u05c1\u05c2\u05c4\u05c5\u05c7\u0610-\u061a\u0620-\u0649\u0672-\u06d3\u06e7-\u06e8\u06fb-\u06fc\u0730-\u074a\u0800-\u0814\u081b-\u0823\u0825-\u0827\u0829-\u082d\u0840-\u0857\u08e4-\u08fe\u0900-\u0903\u093a-\u093c\u093e-\u094f\u0951-\u0957\u0962-\u0963\u0966-\u096f\u0981-\u0983\u09bc\u09be-\u09c4\u09c7\u09c8\u09d7\u09df-\u09e0\u0a01-\u0a03\u0a3c\u0a3e-\u0a42\u0a47\u0a48\u0a4b-\u0a4d\u0a51\u0a66-\u0a71\u0a75\u0a81-\u0a83\u0abc\u0abe-\u0ac5\u0ac7-\u0ac9\u0acb-\u0acd\u0ae2-\u0ae3\u0ae6-\u0aef\u0b01-\u0b03\u0b3c\u0b3e-\u0b44\u0b47\u0b48\u0b4b-\u0b4d\u0b56\u0b57\u0b5f-\u0b60\u0b66-\u0b6f\u0b82\u0bbe-\u0bc2\u0bc6-\u0bc8\u0bca-\u0bcd\u0bd7\u0be6-\u0bef\u0c01-\u0c03\u0c46-\u0c48\u0c4a-\u0c4d\u0c55\u0c56\u0c62-\u0c63\u0c66-\u0c6f\u0c82\u0c83\u0cbc\u0cbe-\u0cc4\u0cc6-\u0cc8\u0cca-\u0ccd\u0cd5\u0cd6\u0ce2-\u0ce3\u0ce6-\u0cef\u0d02\u0d03\u0d46-\u0d48\u0d57\u0d62-\u0d63\u0d66-\u0d6f\u0d82\u0d83\u0dca\u0dcf-\u0dd4\u0dd6\u0dd8-\u0ddf\u0df2\u0df3\u0e34-\u0e3a\u0e40-\u0e45\u0e50-\u0e59\u0eb4-\u0eb9\u0ec8-\u0ecd\u0ed0-\u0ed9\u0f18\u0f19\u0f20-\u0f29\u0f35\u0f37\u0f39\u0f41-\u0f47\u0f71-\u0f84\u0f86-\u0f87\u0f8d-\u0f97\u0f99-\u0fbc\u0fc6\u1000-\u1029\u1040-\u1049\u1067-\u106d\u1071-\u1074\u1082-\u108d\u108f-\u109d\u135d-\u135f\u170e-\u1710\u1720-\u1730\u1740-\u1750\u1772\u1773\u1780-\u17b2\u17dd\u17e0-\u17e9\u180b-\u180d\u1810-\u1819\u1920-\u192b\u1930-\u193b\u1951-\u196d\u19b0-\u19c0\u19c8-\u19c9\u19d0-\u19d9\u1a00-\u1a15\u1a20-\u1a53\u1a60-\u1a7c\u1a7f-\u1a89\u1a90-\u1a99\u1b46-\u1b4b\u1b50-\u1b59\u1b6b-\u1b73\u1bb0-\u1bb9\u1be6-\u1bf3\u1c00-\u1c22\u1c40-\u1c49\u1c5b-\u1c7d\u1cd0-\u1cd2\u1d00-\u1dbe\u1e01-\u1f15\u200c\u200d\u203f\u2040\u2054\u20d0-\u20dc\u20e1\u20e5-\u20f0\u2d81-\u2d96\u2de0-\u2dff\u3021-\u3028\u3099\u309a\ua640-\ua66d\ua674-\ua67d\ua69f\ua6f0-\ua6f1\ua7f8-\ua800\ua806\ua80b\ua823-\ua827\ua880-\ua881\ua8b4-\ua8c4\ua8d0-\ua8d9\ua8f3-\ua8f7\ua900-\ua909\ua926-\ua92d\ua930-\ua945\ua980-\ua983\ua9b3-\ua9c0\uaa00-\uaa27\uaa40-\uaa41\uaa4c-\uaa4d\uaa50-\uaa59\uaa7b\uaae0-\uaae9\uaaf2-\uaaf3\uabc0-\uabe1\uabec\uabed\uabf0-\uabf9\ufb20-\ufb28\ufe00-\ufe0f\ufe20-\ufe26\ufe33\ufe34\ufe4d-\ufe4f\uff10-\uff19\uff3f";
var t2 = new RegExp("[" + uV + "]");
var uS = new RegExp("[" + uV + uU + "]");
var sd = /[\n\r\u2028\u2029]/;
var uN = /\r\n|[\n\r\u2028\u2029]/g;
var tk = s1.isIdentifierStart = function(uT) {
if (uT < 65) return uT === 36;
if (uT < 91) return true;
if (uT < 97) return uT === 95;
if (uT < 123) return true;
return uT >= 0xaa && t2.test(String.fromCharCode(uT));
};
var tj = s1.isIdentifierChar = function(uR) {
if (uR < 48) return uR === 36;
if (uR < 58) return true;
if (uR < 65) return false;
if (uR < 91) return true;
if (uR < 97) return uR === 95;
if (uR < 123) return true;
return uR >= 0xaa && uS.test(String.fromCharCode(uR));
};
function sK() {
this.line = s3;
this.column = sM - s4;
}
function uQ() {
s3 = 1;
sM = s4 = 0;
pz = true;
s2();
}
function s8(uO, uP) {
pF = sM;
if (pL.locations) qN = new sK();
pB = uO;
s2();
pC = uP;
pz = uO.beforeExpr;
}
function uF() {
var uJ = pL.onComment && pL.locations && new sK();
var uK = sM,
uL = pG.indexOf("*/", sM += 2);
if (uL === -1) pE(sM - 2, "Unterminated comment");
sM = uL + 2;
if (pL.locations) {
uN.lastIndex = uK;
var uM;
while ((uM = uN.exec(pG)) && uM.index < sM) {
++s3;
s4 = uM.index + uM[0].length;
}
}
if (pL.onComment) pL.onComment(true, pG.slice(uK + 2, uL), uK, sM, uJ, pL.locations && new sK());
}
function ul() {
var uH = sM;
var uG = pL.onComment && pL.locations && new sK();
var uI = pG.charCodeAt(sM += 2);
while (sM < tu && uI !== 10 && uI !== 13 && uI !== 8232 && uI !== 8233) {
++sM;
uI = pG.charCodeAt(sM);
}
if (pL.onComment) pL.onComment(false, pG.slice(uH + 2, sM), uH, sM, uG, pL.locations && new sK());
}
function s2() {
while (sM < tu) {
var uC = pG.charCodeAt(sM);
if (uC === 32) {
++sM;
} else if (uC === 13) {
++sM;
var uE = pG.charCodeAt(sM);
if (uE === 10) {
++sM;
}
if (pL.locations) {
++s3;
s4 = sM;
}
} else if (uC === 10 || uC === 8232 || uC === 8233) {
++sM;
if (pL.locations) {
++s3;
s4 = sM;
}
} else if (uC > 8 && uC < 14) {
++sM;
} else if (uC === 47) {
var uE = pG.charCodeAt(sM + 1);
if (uE === 42) {
uF();
} else if (uE === 47) {
ul();
} else break;
} else if (uC === 160) {
++sM;
} else if (uC >= 5760 && uD.test(String.fromCharCode(uC))) {
++sM;
} else {
break;
}
}
}
function ue() {
var uB = pG.charCodeAt(sM + 1);
if (uB >= 48 && uB <= 57) return tD(true);
++sM;
return s8(pw);
}
function uc() {
var uA = pG.charCodeAt(sM + 1);
if (pz) {
++sM;
return tV();
}
if (uA === 61) return tZ(sD, 2);
return tZ(sE, 1);
}
function ub() {
var uz = pG.charCodeAt(sM + 1);
if (uz === 61) return tZ(sD, 2);
return tZ(uy, 1);
}
function ua(uw) {
var ux = pG.charCodeAt(sM + 1);
if (ux === uw) return tZ(uw === 124 ? rb : r$, 2);
if (ux === 61) return tZ(sD, 2);
return tZ(uw === 124 ? uv : uu, 1);
}
function u$() {
var ut = pG.charCodeAt(sM + 1);
if (ut === 61) return tZ(sD, 2);
return tZ(us, 1);
}
function u_(ur) {
var up = pG.charCodeAt(sM + 1);
if (up === ur) {
if (up == 45 && pG.charCodeAt(sM + 2) == 62 && sd.test(pG.slice(sc, sM))) {
sM += 3;
ul();
s2();
return sC();
}
return tZ(uq, 2);
}
if (up === 61) return tZ(sD, 2);
return tZ(uo, 1);
}
function t9(um) {
var uk = pG.charCodeAt(sM + 1);
var ui = 1;
if (uk === um) {
ui = um === 62 && pG.charCodeAt(sM + 2) === 62 ? 3 : 2;
if (pG.charCodeAt(sM + ui) === 61) return tZ(sD, ui + 1);
return tZ(un, ui);
}
if (uk == 33 && um == 60 && pG.charCodeAt(sM + 2) == 45 && pG.charCodeAt(sM + 3) == 45) {
sM += 4;
ul();
s2();
return sC();
}
if (uk === 61) ui = pG.charCodeAt(sM + 2) === 61 ? 3 : 2;
return tZ(uj, ui);
}
function t8(uf) {
var uh = pG.charCodeAt(sM + 1);
if (uh === 61) return tZ(ug, pG.charCodeAt(sM + 2) === 61 ? 3 : 2);
return tZ(uf === 61 ? ry : t6, 1);
}
function t4(t7) {
switch (t7) {
case 46:
return ue();
case 40:
++sM;
return s8(qf);
case 41:
++sM;
return s8(qe);
case 59:
++sM;
return s8(rN);
case 44:
++sM;
return s8(pT);
case 91:
++sM;
return s8(qK);
case 93:
++sM;
return s8(qJ);
case 123:
++sM;
return s8(qI);
case 125:
++sM;
return s8(qz);
case 58:
++sM;
return s8(qx);
case 63:
++sM;
return s8(rk);
case 48:
var ud = pG.charCodeAt(sM + 1);
if (ud === 120 || ud === 88) return tF();
case 49:
case 50:
case 51:
case 52:
case 53:
case 54:
case 55:
case 56:
case 57:
return tD(false);
case 34:
case 39:
return tv(t7);
case 47:
return uc(t7);
case 37:
case 42:
return ub();
case 124:
case 38:
return ua(t7);
case 94:
return u$();
case 43:
case 45:
return u_(t7);
case 60:
case 62:
return t9(t7);
case 61:
case 33:
return t8(t7);
case 126:
return tZ(t6, 1);
}
return false;
}
function sC(t5) {
if (!t5) pD = sM;
else sM = pD + 1;
if (pL.locations) qP = new sK();
if (t5) return tV();
if (sM >= tu) return s8(sI);
var t3 = pG.charCodeAt(sM);
if (tk(t3) || t3 === 92) return td();
var t0 = t4(t3);
if (t0 === false) {
var t1 = String.fromCharCode(t3);
if (t1 === "\\" || t2.test(t1)) return td();
pE(sM, "Unexpected character '" + t1 + "'");
}
return t0;
}
function tZ(tX, tY) {
var tW = pG.slice(sM, sM + tY);
sM += tY;
s8(tX, tW);
}
function tV() {
var tR = "",
tS, tU, tP = sM;
for (;;) {
if (sM >= tu) pE(tP, "Unterminated regular expression");
var tT = pG.charAt(sM);
if (sd.test(tT)) pE(tP, "Unterminated regular expression");
if (!tS) {
if (tT === "[") tU = true;
else if (tT === "]" && tU) tU = false;
else if (tT === "/" && !tU) break;
tS = tT === "\\";
} else tS = false;
++sM;
}
var tR = pG.slice(tP, sM);
++sM;
var tQ = tc();
if (tQ && !/^[gmsiy]*$/.test(tQ)) pE(tP, "Invalid regular expression flag");
try {
var tO = new RegExp(tR, tQ);
} catch (e) {
if (e instanceof SyntaxError) pE(tP, "Error parsing regular expression: " + e.message);
pE(e);
}
return s8(qT, tO);
}
function tp(tK, tH) {
var tI = sM,
tG = 0;
for (var tM = 0, tN = tH == null ? Infinity : tH; tM < tN; ++tM) {
var tL = pG.charCodeAt(sM),
tJ;
if (tL >= 97) tJ = tL - 97 + 10;
else if (tL >= 65) tJ = tL - 65 + 10;
else if (tL >= 48 && tL <= 57) tJ = tL - 48;
else tJ = Infinity;
if (tJ >= tK) break;
++sM;
tG = tG * tK + tJ;
}
if (sM === tI || tH != null && sM - tI !== tH) return null;
return tG;
}
function tF() {
sM += 2;
var tE = tp(16);
if (tE == null) pE(pD + 2, "Expected hexadecimal number");
if (tk(pG.charCodeAt(sM))) pE(sM, "Identifier directly after number");
return s8(qn, tE);
}
function tD(tC) {
var ty = sM,
tA = false,
tz = pG.charCodeAt(sM) === 48;
if (!tC && tp(10) === null) pE(ty, "Invalid number");
if (pG.charCodeAt(sM) === 46) {
++sM;
tp(10);
tA = true;
}
var tB = pG.charCodeAt(sM);
if (tB === 69 || tB === 101) {
tB = pG.charCodeAt(++sM);
if (tB === 43 || tB === 45) ++sM;
if (tp(10) === null) pE(ty, "Invalid number");
tA = true;
}
if (tk(pG.charCodeAt(sM))) pE(sM, "Identifier directly after number");
var tx = pG.slice(ty, sM),
tw;
if (tA) tw = parseFloat(tx);
else if (!tz || tx.length === 1) tw = parseInt(tx, 10);
else if (/[89]/.test(tx) || pI) pE(ty, "Invalid number");
else tw = parseInt(tx, 8);
return s8(qn, tw);
}
function tv(tt) {
sM++;
var tr = "";
for (;;) {
if (sM >= tu) pE(pD, "Unterminated string constant");
var tq = pG.charCodeAt(sM);
if (tq === tt) {
++sM;
return s8(qm, tr);
}
if (tq === 92) {
tq = pG.charCodeAt(++sM);
var ts = /^[0-7]+/.exec(pG.slice(sM, sM + 3));
if (ts) ts = ts[0];
while (ts && parseInt(ts, 8) > 255) ts = ts.slice(0, -1);
if (ts === "0") ts = null;
++sM;
if (ts) {
if (pI) pE(sM - 2, "Octal literal in strict mode");
tr += String.fromCharCode(parseInt(ts, 8));
sM += ts.length - 1;
} else {
switch (tq) {
case 110:
tr += "\n";
break;
case 114:
tr += "\r";
break;
case 120:
tr += String.fromCharCode(tl(2));
break;
case 117:
tr += String.fromCharCode(tl(4));
break;
case 85:
tr += String.fromCharCode(tl(8));
break;
case 116:
tr += "\t";
break;
case 98:
tr += "\b";
break;
case 118:
tr += "\u000b";
break;
case 102:
tr += "\f";
break;
case 48:
tr += "\0";
break;
case 13:
if (pG.charCodeAt(sM) === 10) ++sM;
case 10:
if (pL.locations) {
s4 = sM;
++s3;
}
break;
default:
tr += String.fromCharCode(tq);
break;
}
}
} else {
if (tq === 13 || tq === 10 || tq === 8232 || tq === 8233) pE(pD, "Unterminated string constant");
tr += String.fromCharCode(tq);
++sM;
}
}
}
function tl(to) {
var tn = tp(16, to);
if (tn === null) pE(pD, "Bad character escape sequence");
return tn;
}
var tb;
function tc() {
tb = false;
var tf, tg = true,
te = sM;
for (;;) {
var tm = pG.charCodeAt(sM);
if (tj(tm)) {
if (tb) tf += pG.charAt(sM);
++sM;
} else if (tm === 92) {
if (!tb) tf = pG.slice(te, sM);
tb = true;
if (pG.charCodeAt(++sM) != 117) pE(sM, "Expecting Unicode escape sequence \\uXXXX");
++sM;
var ti = tl(4);
var th = String.fromCharCode(ti);
if (!th) pE(sM - 1, "Invalid Unicode escape");
if (!(tg ? tk(ti) : tj(ti))) pE(sM - 4, "Invalid Unicode escape");
tf += th;
} else {
break;
}
tg = false;
}
return tb ? tf : pG.slice(te, sM);
}
function td() {
var s6 = tc();
var s7 = pM;
if (!tb) {
if (ta(s6)) s7 = t$[s6];
else if (pL.jsm && t_(s6)) s7 = s9[s6];
}
return s8(s7, s6);
}
function py() {
sh = pD;
sc = pF;
sL = qN;
sC();
}
function rR(s5) {
pI = s5;
sM = pD;
if (pL.locations) {
while (sM < s4) {
s4 = pG.lastIndexOf("\n", s4 - 2) + 1;
--s3;
}
}
s2();
sC();
}
function sY() {
this.type = null;
this.start = pD;
this.end = null;
}
s1.Node = sY;
function sX() {
this.start = qP;
this.end = null;
if (s0 !== null) this.source = s0;
}
function pO() {
var sZ = new sY();
if (pL.locations) sZ.loc = new sX();
if (pL.directSourceFile) sZ.sourceFile = pL.directSourceFile;
if (pL.ranges) sZ.range = [pD, 0];
return sZ;
}
function qY(sW) {
var sV = new sY();
sV.start = sW.start;
if (pL.locations) {
sV.loc = new sX();
sV.loc.start = sW.loc.start;
}
if (pL.ranges) sV.range = [sW.range[0], 0];
return sV;
}
function pq(sT, sU) {
sT.type = sU;
sT.end = sc;
if (pL.locations) sT.loc.end = sL;
if (pL.ranges) sT.range[1] = sc;
return sT;
}
function p7(sR) {
return pL.ecmaVersion >= 5 && sR.type === "ExpressionStatement" && sR.expression.type === "Literal" && sR.expression.value === "use strict";
}
function px(sQ) {
if (pB === sQ) {
py();
return true;
}
}
function q3() {
return !pL.strictSemicolons && (pB === sI || pB === qz || sd.test(pG.slice(sc, pD)));
}
function r0() {
if (!px(rN) && !q3()) pA();
}
function pY(sP) {
if (pB === sP) py();
else pA();
}
function pA() {
pE(pD, "Unexpected token");
}
function q2(sO) {
if (sO.type !== "Identifier" && sO.type !== "MemberExpression") pE(sO.start, "Assigning to rvalue");
if (pI && sO.type === "Identifier" && p6(sO.name)) pE(sO.start, "Assigning to " + sO.name + " in strict mode");
}
function sN(sJ) {
sh = sc = sM;
if (pL.locations) sL = new sK();
qb = pI = null;
q$ = [];
sC();
var sF = sJ || pO(),
sG = true;
if (!sJ) sF.body = [];
while (pB !== sI) {
var sH = rE();
sF.body.push(sH);
if (sG && p7(sH)) rR(true);
sG = false;
}
return pq(sF, "Program");
}
var r8 = {
kind: "loop"
},
sl = {
kind: "switch"
};
function rE() {
if (pB === sE || pB === sD && pC == "/=") sC(true);
var r6 = pB,
rZ = pO();
switch (r6) {
case sz:
case sB:
py();
var sx = r6 === sz;
if (px(rN) || q3()) rZ.label = null;
else if (pB !== pM) pA();
else {
rZ.label = pv();
r0();
}
for (var r5 = 0; r5 < q$.length; ++r5) {
var sy = q$[r5];
if (rZ.label == null || sy.name === rZ.label.name) {
if (sy.kind != null && (sx || sy.kind === "loop")) break;
if (rZ.label && sx) break;
}
}
if (r5 === q$.length) pE(rZ.start, "Unsyntactic " + r6.keyword);
return pq(rZ, sx ? "BreakStatement" : "ContinueStatement");
case sw:
py();
r0();
return pq(rZ, "DebuggerStatement");
case sv:
py();
q$.push(r8);
rZ.body = rE();
q$.pop();
pY(r9);
rZ.test = rY();
r0();
return pq(rZ, "DoWhileStatement");
case su:
py();
q$.push(r8);
pY(qf);
if (pB === rN) return rP(rZ, null);
if (pB === rH) {
var ss = pO();
py();
rz(ss, true);
pq(ss, "VariableDeclaration");
if (ss.declarations.length === 1 && px(re)) return rL(rZ, ss);
return rP(rZ, ss);
}
var ss = pS(false, true);
if (px(re)) {
q2(ss);
return rL(rZ, ss);
}
return rP(rZ, ss);
case qH:
py();
return qg(rZ, true);
case sr:
py();
rZ.test = rY();
rZ.consequent = rE();
rZ.alternate = px(sq) ? rE() : null;
return pq(rZ, "IfStatement");
case sp:
py();
return rI(rZ);
case so:
py();
return qk(rZ, true);
case sn:
if (!p9 && !pL.jsmAllowMetaretOutsideFunction) pE(pD, "'metaret' outside of metafun");
py();
if (px(rN) || q3()) rZ.argument = null;
else {
rZ.argument = pS();
r0();
}
return pq(rZ, "JsmMetaretStatement");
case sm:
if (!qb && !pL.allowReturnOutsideFunction) pE(pD, "'return' outside of function");
py();
if (px(rN) || q3()) rZ.argument = null;
else {
rZ.argument = pS();
r0();
}
return pq(rZ, "ReturnStatement");
case r4:
py();
rZ.discriminant = rY();
rZ.cases = [];
pY(qI);
q$.push(sl);
for (var sf, sg; pB != qz;) {
if (pB === sj || pB === sk) {
var si = pB === sj;
if (sf) pq(sf, "SwitchCase");
rZ.cases.push(sf = pO());
sf.consequent = [];
py();
if (si) sf.test = pS();
else {
if (sg) pE(sh, "Multiple default clauses");
sg = true;
sf.test = null;
}
pY(qx);
} else {
if (!sf) pA();
sf.consequent.push(rE());
}
}
if (sf) pq(sf, "SwitchCase");
py();
q$.pop();
return pq(rZ, "SwitchStatement");
case se:
py();
if (sd.test(pG.slice(sc, pD))) pE(sc, "Illegal newline after throw");
rZ.argument = pS();
r0();
return pq(rZ, "ThrowStatement");
case sb:
py();
rZ.block = qc();
rZ.handler = null;
if (pB === sa) {
var s$ = pO();
py();
pY(qf);
s$.param = pv();
if (pI && p6(s$.param.name)) pE(s$.param.start, "Binding " + s$.param.name + " in strict mode");
pY(qe);
s$.guard = null;
s$.body = qc();
rZ.handler = pq(s$, "CatchClause");
}
rZ.guardedHandlers = qC;
rZ.finalizer = px(s_) ? qc() : null;
if (!rZ.handler && !rZ.finalizer) pE(rZ.start, "Missing catch or finally clause");
return pq(rZ, "TryStatement");
case rH:
py();
rz(rZ);
r0();
return pq(rZ, "VariableDeclaration");
case r9:
py();
rZ.test = rY();
q$.push(r8);
rZ.body = rE();
q$.pop();
return pq(rZ, "WhileStatement");
case r7:
if (pI) pE(pD, "'with' in strict mode");
py();
rZ.object = rY();
rZ.body = rE();
return pq(rZ, "WithStatement");
case qI:
return qc();
case rN:
py();
return pq(rZ, "EmptyStatement");
default:
var r3 = pC,
r1 = pS();
if (r6 === pM && r1.type === "Identifier" && px(qx)) {
for (var r5 = 0; r5 < q$.length; ++r5)
if (q$[r5].name === r3) pE(r1.start, "Label '" + r3 + "' is already declared");
var r2 = pB.isLoop ? "loop" : pB === r4 ? "switch" : null;
q$.push({
name: r3,
kind: r2
});
rZ.body = rE();
q$.pop();
rZ.label = r1;
return pq(rZ, "LabeledStatement");
} else {
rZ.expression = r1;
r0();
return pq(rZ, "ExpressionStatement");
}
}
}
function rY() {
pY(qf);
var rX = pS();
pY(qe);
return rX;
}
function qc(rW) {
var rQ = pO(),
rU = true,
rT = false,
rS;
rQ.body = [];
pY(qI);
while (!px(qz)) {
var rV = rE();
rQ.body.push(rV);
if (rU && rW && p7(rV)) {
rS = rT;
rR(rT = true);
}
rU = false;
}
if (rT && !rS) rR(false);
return pq(rQ, "BlockStatement");
}
function rP(rM, rO) {
rM.init = rO;
pY(rN);
rM.test = pB === rN ? null : pS();
pY(rN);
rM.update = pB === qe ? null : pS();
pY(qe);
rM.body = rE();
q$.pop();
return pq(rM, "ForStatement");
}
function rL(rJ, rK) {
rJ.left = rK;
rJ.right = pS();
pY(qe);
rJ.body = rE();
q$.pop();
return pq(rJ, "ForInStatement");
}
function rI(rA) {
if (pB === rH) {
var rG = rE();
if (rG.type !== "VariableDeclaration") throw new Error("parseJsmInline: incorrect variable declaration.");
if (rG.declarations.length !== 1) throw new Error("parseJsmInline: VariableDeclaration: only a single variable declaration!");
var rF = rG.declarations[0];
rA.jsmVarDeclId = rF.id;
rA.jsmVarDeclInit = rF.init;
if (rA.jsmVarDeclInit.type !== "CallExpression") throw new Error("parseJsmInline: VariableDeclaration: only the form 'inline var x = f(); is permitted.");
} else {
var rD = rE();
if (rD.type !== "ExpressionStatement") throw new Error("parseJsmInline: ExpressionStatement: either var or expression stmt.");
var rB = rD.expression,
rC = rB.type;
if (rC !== "AssignmentExpression" && rC !== "CallExpression") throw new Error("parseJsmInline: ExpressionStatement: either AssignmentExpression or CallExpression!");
if (rC === "AssignmentExpression") {
if (rB.left.type !== "Identifier" || rB.right.type !== "CallExpression") throw new Error("parseJsmInline: ExpressionStatement: only the form 'inline x = f(); is permitted.");
rA.jsmAssignLeft = rB.left;
rA.jsmAssignRight = rB.right;
} else {
rA.jsmCall = rB;
}
}
return pq(rA, "JsmInlineStatement");
}
function rz(ru, rw) {
ru.declarations = [];
ru.kind = "var";
for (;;) {
var rv = pO();
rv.id = pv();
if (pI && p6(rv.id.name)) pE(rv.id.start, "Binding " + rv.id.name + " in strict mode");
rv.init = px(ry) ? pS(true, rw) : null;
ru.declarations.push(pq(rv, "VariableDeclarator"));
if (!px(pT)) break;
}
return ru;
}
function pS(rt, rs) {
var rq = rp(rs);
if (!rt && pB === pT) {
var rr = qY(rq);
rr.expressions = [rq];
while (px(pT)) rr.expressions.push(rp(rs));
return pq(rr, "SequenceExpression");
}
return rq;
}
function rp(ro) {
var rm = rl(ro);
if (pB.isAssign) {
var rn = qY(rm);
rn.operator = pC;
rn.left = rm;
py();
rn.right = rp(ro);
q2(rm);
return pq(rn, "AssignmentExpression");
}
return rm;
}
function rl(rj) {
var rh = rg(rj);
if (px(rk)) {
var ri = qY(rh);
ri.test = rh;
ri.consequent = pS(true);
pY(qx);
ri.alternate = pS(true, rj);
return pq(ri, "ConditionalExpression");
}
return rh;
}
function rg(rf) {
return r_(q5(), -1, rf);
}
function r_(q6, q8, q7) {
var rd = pB.binop;
if (rd != null && (!q7 || pB !== re)) {
if (rd > q8) {
var rc = qY(q6);
rc.left = q6;
rc.operator = pC;
var ra = pB;
py();
rc.right = r_(q5(), rd, q7);
var q9 = pq(rc, ra === rb || ra === r$ ? "LogicalExpression" : "BinaryExpression");
return r_(q9, q8, q7);
}
}
return q6;
}
function q5() {
if (pB.prefix) {
var q1 = pO(),
q4 = pB.isUpdate;
q1.operator = pC;
q1.prefix = true;
pz = true;
py();
q1.argument = q5();
if (q4) q2(q1.argument);
else if (pI && q1.operator === "delete" && q1.argument.type === "Identifier") pE(q1.start, "Deleting local variable in strict mode");
return pq(q1, q4 ? "UpdateExpression" : "UnaryExpression");
}
var q0 = qZ();
while (pB.postfix && !q3()) {
var q1 = qY(q0);
q1.operator = pC;
q1.prefix = false;
q1.argument = q0;
q2(q0);
py();
q0 = pq(q1, "UpdateExpression");
}
return q0;
}
function qZ() {
return qD(ql());
}
function qD(qV, qW) {
if (px(pw)) {
var qX = qY(qV);
qX.object = qV;
qX.property = pv(true);
qX.computed = false;
return qD(pq(qX, "MemberExpression"), qW);
} else if (px(qK)) {
var qX = qY(qV);
qX.object = qV;
qX.property = pS();
qX.computed = true;
pY(qJ);
return qD(pq(qX, "MemberExpression"), qW);
} else if (!qW && px(qf)) {
var qX = qY(qV);
qX.callee = qV;
qX.arguments = pZ(qe, false);
return qD(pq(qX, "CallExpression"), qW);
} else return qV;
}
function ql() {
switch (pB) {
case qU:
var qG = pO();
py();
return pq(qG, "ThisExpression");
case pM:
return pv();
case qn:
case qm:
case qT:
var qG = pO();
qG.value = pC;
qG.raw = pG.slice(pD, pF);
py();
return pq(qG, "Literal");
case qS:
case qR:
case qQ:
var qG = pO();
qG.value = pB.atomValue;
qG.raw = pB.keyword;
py();
return pq(qG, "Literal");
case qf:
var qO = qP,
qM = pD;
py();
var qL = pS();
qL.start = qM;
qL.end = pF;
if (pL.locations) {
qL.loc.start = qO;
qL.loc.end = qN;
}
if (pL.ranges) qL.range = [qM, pF];
pY(qe);
return qL;
case qK:
var qG = pO();
py();
qG.elements = pZ(qJ, true, true);
return pq(qG, "ArrayExpression");
case qI:
return qA();
case qH:
var qG = pO();
py();
return qg(qG, false);
case qF:
return qE();
default:
pA();
}
}
function qE() {
var qB = pO();
py();
qB.callee = qD(ql(), true);
if (px(qf)) qB.arguments = pZ(qe, false);
else qB.arguments = qC;
return pq(qB, "NewExpression");
}
function qA() {
var qp = pO(),
qy = true,
qw = false;
qp.properties = [];
py();
while (!px(qz)) {
if (!qy) {
pY(pT);
if (pL.allowTrailingCommas && px(qz)) break;
} else qy = false;
var qq = {
key: qo()
},
qu = false,
qt;
if (px(qx)) {
qq.value = pS(true);
qt = qq.kind = "init";
} else if (pL.ecmaVersion >= 5 && qq.key.type === "Identifier" && (qq.key.name === "get" || qq.key.name === "set")) {
qu = qw = true;
qt = qq.kind = qq.key.name;
qq.key = qo();
if (pB !== qf) pA();
qq.value = qg(pO(), false);
} else pA();
if (qq.key.type === "Identifier" && (pI || qw)) {
for (var qv = 0; qv < qp.properties.length; ++qv) {
var qs = qp.properties[qv];
if (qs.key.name === qq.key.name) {
var qr = qt == qs.kind || qu && qs.kind === "init" || qt === "init" && (qs.kind === "get" || qs.kind === "set");
if (qr && !pI && qt === "init" && qs.kind === "init") qr = false;
if (qr) pE(qq.key.start, "Redefinition of property");
}
}
}
qp.properties.push(qq);
}
return pq(qp, "ObjectExpression");
}
function qo() {
if (pB === qn || pB === qm) return ql();
return pv(true);
}
function qk(qj, qi) {
if (!qi) throw new Error('metafunction can only be declarations, not expressions.');
var qh = true;
return qg(qj, qi, qh);
}
function qg(p2, p0, p1) {
if (!p1) {
if (pB === pM) p2.id = pv();
else if (p0) pA();
else p2.id = null;
} else {
if (pB !== pM) pA();
p2.id = pQ();
}
p2.params = [];
var qd = true;
pY(qf);
while (!px(qe)) {
if (!qd) pY(pT);
else qd = false;
p2.params.push(pv());
}
var qa = qb,
q_ = q$,
p8 = p9;
qb = true;
q$ = [];
p9 = p1;
p2.body = qc(true);
qb = qa;
q$ = q_;
p9 = p8;
if (pI || p2.body.body.length && p7(p2.body.body[0])) {
for (var p5 = p2.id ? -1 : 0; p5 < p2.params.length; ++p5) {
var p3 = p5 < 0 ? p2.id : p2.params[p5];
if (pH(p3.name) || p6(p3.name)) pE(p3.start, "Defining '" + p3.name + "' in strict mode");
if (p5 >= 0)
for (var p4 = 0; p4 < p5; ++p4)
if (p3.name === p2.params[p4].name) pE(p3.start, "Argument name clash in strict mode");
}
}
return pq(p2, (p1 ? 'JsmMetafun' : 'Function') + (p0 ? "Declaration" : "Expression"));
}
function pZ(pW, pX, pU) {
var pR = [],
pV = true;
while (!px(pW)) {
if (!pV) {
pY(pT);
if (pX && pL.allowTrailingCommas && px(pW)) break;
} else pV = false;
if (pU && pB === pT) pR.push(null);
else pR.push(pS(true));
}
return pR;
}
function pQ(pP) {
return pv(pP, true);
}
function pv(pu, pt) {
var pp = pO();
if (pu && pL.forbidReserved == "everywhere") pu = false;
if (pB === pM) {
if (!pu && (pL.forbidReserved && (pL.ecmaVersion === 3 ? pK : pJ)(pC) || pI && pH(pC)) && pG.slice(pD, pF).indexOf("\\") == -1) pE(pD, "The keyword '" + pC + "' is reserved");
pp.name = pC;
} else if (pu && pB.keyword) {
pp.name = pB.keyword;
} else {
pA();
}
pz = false;
py();
if (pt && px(pw)) {
var pr = [pp.name];
var ps = pv(pu, pt);
pr.push.apply(pr, ps.jsmNameArr || [ps.name]);
pp.jsmNameArr = pr;
pp.name = pr.join('.');
return pq(pp, "JsmDottedIdentifier");
}
return pq(pp, "Identifier");
}
});
}
if (typeof acorn.walk === 'undefined') {
(function(po) {
if (typeof F == "object" && typeof module == "object") return po(F);
if (typeof define == "function" && define.amd) return define(["exports"], po);
po((this.acorn || (this.acorn = {})).walk = {});
})(function(mi) {
"use strict";
mi.simple = function(pe, pm, pl, pd) {
if (!pl) pl = mi.base;
function pf(ph, pg, pn) {
var pk = pn || ph.type,
pj = pm[pk];
pl[pk](ph, pg, pf);
if (pj) pj(ph, pg);
}
pf(pe, pd);
};
mi.ancestor = function(o6, pb, pa, o5) {
if (!pa) pa = mi.base;
if (!o5) o5 = [];
function o7(o9, o8, pc) {
var p$ = pc || o9.type,
p_ = pb[p$];
if (o9 != o8[o8.length - 1]) {
o8 = o8.slice();
o8.push(o9);
}
pa[p$](o9, o8, o7);
if (p_) p_(o9, o8);
}
o7(o6, o5);
};
mi.recursive = function(oW, oV, o4, o3) {
var o1 = o4 ? mi.make(o4, o3) : o3;
function oX(oZ, oY, o0) {
o1[o0 || oZ.type](oZ, oY, oX);
}
oX(oW, oV);
};
function oj(oT) {
if (typeof oT == "string") return function(oU) {
return oU == oT;
};
else if (!oT) return function() {
return true;
};
else return oT;
}
function of(oS, oR) {
this.node = oS;
this.state = oR;
}
mi.findNodeAt = function(oH, oM, oL, oO, oP, oG) {
oO = oj(oO);
try {
if (!oP) oP = mi.base;
var oI = function(oK, oJ, oQ) {
var oN = oQ || oK.type;
if ((oM == null || oK.start <= oM) && (oL == null || oK.end >= oL)) oP[oN](oK, oJ, oI);
if (oO(oN, oK) && (oM == null || oK.start == oM) && (oL == null || oK.end == oL)) throw new of(oK, oJ);
};
oI(oH, oG);
} catch (e) {
if (e instanceof of) return e;
throw e;
}
};
mi.findNodeAround = function(ox, oE, oC, oD, ow) {
oC = oj(oC);
try {
if (!oD) oD = mi.base;
var oy = function(oA, oz, oF) {
var oB = oF || oA.type;
if (oA.start > oE || oA.end < oE) return;
oD[oB](oA, oz, oy);
if (oC(oB, oA)) throw new of(oA, oz);
};
oy(ox, ow);
} catch (e) {
if (e instanceof of) return e;
throw e;
}
};
mi.findNodeAfter = function(om, ou, ot, os, ol) {
ot = oj(ot);
try {
if (!os) os = mi.base;
var on = function(oq, oo, ov) {
if (oq.end < ou) return;
var or = ov || oq.type;
if (oq.start >= ou && ot(or, oq)) throw new of(oq, oo);
os[or](oq, oo, on);
};
on(om, ol);
} catch (e) {
if (e instanceof of) return e;
throw e;
}
};
mi.findNodeBefore = function(o$, oh, og, oe, o_) {
og = oj(og);
if (!oe) oe = mi.base;
var n9;
var oa = function(oc, ob, oi) {
if (oc.start > oh) return;
var od = oi || oc.type;
if (oc.end <= oh && (!n9 || n9.node.end < oc.end) && og(od, oc)) n9 = new of(oc, ob);
oe[od](oc, ob, oa);
};
oa(o$, o_);
return n9;
};
mi.make = function(n7, n8) {
if (!n8) n8 = mi.base;
var n5 = {};
for (var n6 in n8) n5[n6] = n8[n6];
for (var n6 in n7) n5[n6] = n7[n6];
return n5;
};
function m4(n3, n2, n4) {
n4(n3, n2);
}
function mA(n1, n0, nZ) {}
var mq = mi.base = {};
mq.Program = mq.BlockStatement = function(nX, nV, nY) {
for (var nW = 0; nW < nX.body.length; ++nW) nY(nX.body[nW], nV, "Statement");
};
mq.Statement = m4;
mq.EmptyStatement = mA;
mq.ExpressionStatement = function(nT, nS, nU) {
nU(nT.expression, nS, "Expression");
};
mq.IfStatement = function(nQ, nP, nR) {
nR(nQ.test, nP, "Expression");
nR(nQ.consequent, nP, "Statement");
if (nQ.alternate) nR(nQ.alternate, nP, "Statement");
};
mq.LabeledStatement = function(nN, nM, nO) {
nO(nN.body, nM, "Statement");
};
mq.BreakStatement = mq.ContinueStatement = mA;
mq.WithStatement = function(nK, nJ, nL) {
nL(nK.object, nJ, "Expression");
nL(nK.body, nJ, "Statement");
};
mq.SwitchStatement = function(nI, nD, nG) {
nG(nI.discriminant, nD, "Expression");
for (var nH = 0; nH < nI.cases.length; ++nH) {
var nF = nI.cases[nH];
if (nF.test) nG(nF.test, nD, "Expression");
for (var nE = 0; nE < nF.consequent.length; ++nE) nG(nF.consequent[nE], nD, "Statement");
}
};
mq.ReturnStatement = function(nB, nA, nC) {
if (nB.argument) nC(nB.argument, nA, "Expression");
};
mq.ThrowStatement = function(ny, nx, nz) {
nz(ny.argument, nx, "Expression");
};
mq.TryStatement = function(nv, nu, nw) {
nw(nv.block, nu, "Statement");
if (nv.handler) nw(nv.handler.body, nu, "ScopeBody");
if (nv.finalizer) nw(nv.finalizer, nu, "Statement");
};
mq.WhileStatement = function(ns, nr, nt) {
nt(ns.test, nr, "Expression");
nt(ns.body, nr, "Statement");
};
mq.DoWhileStatement = mq.WhileStatement;
mq.ForStatement = function(np, no, nq) {
if (np.init) nq(np.init, no, "ForInit");
if (np.test) nq(np.test, no, "Expression");
if (np.update) nq(np.update, no, "Expression");
nq(np.body, no, "Statement");
};
mq.ForInStatement = function(nm, nl, nn) {
nn(nm.left, nl, "ForInit");
nn(nm.right, nl, "Expression");
nn(nm.body, nl, "Statement");
};
mq.ForInit = function(ni, nh, nk) {
if (ni.type == "VariableDeclaration") nk(ni, nh);
else nk(ni, nh, "Expression");
};
mq.DebuggerStatement = mA;
mq.FunctionDeclaration = function(nf, ne, ng) {
ng(nf, ne, "Function");
};
mq.VariableDeclaration = function(nd, n$, nb) {
for (var nc = 0; nc < nd.declarations.length; ++nc) {
var na = nd.declarations[nc];
if (na.init) nb(na.init, n$, "Expression");
}
};
mq.Function = function(m9, m8, n_) {
n_(m9.body, m8, "ScopeBody");
};
mq.ScopeBody = function(m6, m5, m7) {
m7(m6, m5, "Statement");
};
mq.Expression = m4;
mq.ThisExpression = mA;
mq.ArrayExpression = function(m3, mZ, m1) {
for (var m2 = 0; m2 < m3.elements.length; ++m2) {
var m0 = m3.elements[m2];
if (m0) m1(m0, mZ, "Expression");
}
};
mq.ObjectExpression = function(mX, mV, mY) {
for (var mW = 0; mW < mX.properties.length; ++mW) mY(mX.properties[mW].value, mV, "Expression");
};
mq.FunctionExpression = mq.FunctionDeclaration;
mq.SequenceExpression = function(mT, mR, mU) {
for (var mS = 0; mS < mT.expressions.length; ++mS) mU(mT.expressions[mS], mR, "Expression");
};
mq.UnaryExpression = mq.UpdateExpression = function(mP, mO, mQ) {
mQ(mP.argument, mO, "Expression");
};
mq.BinaryExpression = mq.AssignmentExpression = mq.LogicalExpression = function(mM, mL, mN) {
mN(mM.left, mL, "Expression");
mN(mM.right, mL, "Expression");
};
mq.ConditionalExpression = function(mJ, mI, mK) {
mK(mJ.test, mI, "Expression");
mK(mJ.consequent, mI, "Expression");
mK(mJ.alternate, mI, "Expression");
};
mq.NewExpression = mq.CallExpression = function(mG, mE, mH) {
mH(mG.callee, mE, "Expression");
if (mG.arguments)
for (var mF = 0; mF < mG.arguments.length; ++mF) mH(mG.arguments[mF], mE, "Expression");
};
mq.MemberExpression = function(mC, mB, mD) {
mD(mC.object, mB, "Expression");
if (mC.computed) mD(mC.property, mB, "Expression");
};
mq.Identifier = mq.Literal = mA;
mq.JsmMetafunDeclaration = function(my, mx, mz) {
mz(my, mx, "Function");
};
mq.JsmFunctionDeclaration = function(mv, mu, mw) {
mw(mv, mu, "Function");
};
mq.JsmMetaretStatement = function(ms, mr, mt) {
mt(ms.argument, mr, "Expression");
};
mq.JsmInlineStatement = function(mn, mm, mp) {
if (mn.jsmVarDeclId) {
mp(mn.jsmVarDeclId, mm);
mp(mn.jsmVarDeclInit, mm);
} else if (mn.jsmAssignLeft) {
mp(mn.jsmAssignLeft, mm);
mp(mn.jsmAssignRight, mm);
} else {
mp(mn.jsmCall, mm);
}
};
function mb(ml, mk) {
return {
vars: Object.create(null),
prev: ml,
isCatch: mk
};
}
function l8(mj) {
while (mj.isCatch) mj = mj.prev;
return mj;
}
mi.scopeVisitor = mi.make({
Function: function(md, mg, me) {
var mc = mb(mg);
for (var mh = 0; mh < md.params.length; ++mh) mc.vars[md.params[mh].name] = {
type: "argument",
node: md.params[mh]
};
if (md.id) {
var mf = md.type == "FunctionDeclaration";
(mf ? l8(mg) : mc).vars[md.id.name] = {
type: mf ? "function" : "function name",
node: md.id
};
}
me(md.body, mc, "ScopeBody");
},
TryStatement: function(m_, l9, m$) {
m$(m_.block, l9, "Statement");
if (m_.handler) {
var ma = mb(l9, true);
ma.vars[m_.handler.param.name] = {
type: "catch clause",
node: m_.handler.param
};
m$(m_.handler.body, ma, "ScopeBody");
}
if (m_.finalizer) m$(m_.finalizer, l9, "Statement");
},
VariableDeclaration: function(l7, l2, l4) {
var l5 = l8(l2);
for (var l6 = 0; l6 < l7.declarations.length; ++l6) {
var l3 = l7.declarations[l6];
l5.vars[l3.id.name] = {
type: "var",
node: l3.id
};
if (l3.init) l4(l3.init, l2, "Expression");
}
}
});
});
}(function(iL) {
var l1 = 'return',
js = 'var',
lY = ["break", "case", "catch", "continue", "debugger", "default", "delete", "do", "else", "finally", "for", "function", "if", "in", "instanceof", "new", l1, "switch", "this", "throw", "try", "typeof", js, "void", "while", "with", "class", "const", "enum", "export", "extends", "import", "super", "implements", "interface", "let", "package", "private", "protected", "public", "static", "yield"],
lX = [{
open: l1,
close: ';',
typebracket: l1,
ignore_unbalanced: true
}, {
open: js,
close: [';', 'in'],
typebracket: js,
ignore_unbalanced: true
}],
ko = {};
iL.codeparse = lZ;
lZ.getDefaultReservedArr = l0;
function l0() {
return [].concat(lY);
}
function lZ(kG, lW) {
var kF = (lW && lW.reservedArr || lY).concat(lW && lW.extraReservedArr || []),
kM = lX.concat(lW && lW.extraBracketArr || []),
k_ = {
strArr: [],
commentArr: [],
regexpArr: [],
callArr: [],
dotArr: [],
dotcallArr: [],
identifierArr: [],
identifierArrReverse: [],
identifierObj: {},
identifierObjReverse: {},
callObj: {},
bracketcurlyArr: [],
bracketroundArr: [],
bracketsquareArr: [],
bracketextraArr: [],
bracketArr: [],
bracketTree: [],
functionDeclarationArr: [],
functionExpressionArr: [],
jsmMetafunArr: [],
jsmMetaretArr: [],
jsmInlineArr: [],
rawAP: null
},
k4 = kG;
var kp = k_.commentArr,
lQ = k_.rawAP = acorn.parse(kG, {
jsm: true,
onComment: lV,
jsmAllowMetaretOutsideFunction: lW && lW.jsmAllowMetaretOutsideFunction,
allowReturnOutsideFunction: lW && lW.allowReturnOutsideFunction
});
function lV(lU, lT, lS, lR) {
kp.push({
begin: lS,
str: kG.substring(lS, lR)
});
k4 = k4.substring(0, lS) + ic(' ', lR - lS) + k4.substring(lR);
}
var kx, lz = k_.callArr,
k3 = k_.dotArr,
lM = k_.dotcallArr,
ks = k_.identifierArr,
l$ = k_.regexpArr,
lb = k_.strArr,
lw = k_.functionDeclarationArr,
lp = k_.functionExpressionArr,
lh = k_.jsmMetafunArr,
kE = k_.jsmMetaretArr,
lk = k_.jsmInlineArr,
kH = k4;
acorn.walk.simple(lQ, {
CallExpression: lD,
FunctionDeclaration: lB,
FunctionExpression: lt,
Identifier: kR,
JsmInlineStatement: ll,
JsmMetafunDeclaration: li,
JsmMetafunExpression: le,
Literal: kY,
MemberExpression: k6,
NewExpression: lE,
ObjectExpression: k0,
ThisExpression: kV,
VariableDeclaration: kT
});
lz.sort(j9);
k3.sort(j9);
lM.sort(j9);
ks.sort(j9);
l$.sort(j9);
lb.sort(j9);
function lD(lI) {
var lF = lI.callee;
if (lF.type === "Identifier") {
var lP = lF.start,
lK = k4.indexOf("(", lF.end);
if (lK < 0) throw new Error('meet_CallExpression bug');
var lO = kG.substring(lP, lK + 1);
lz.push({
begin: lP,
str: lO,
name: lF.name,
acornNode: lI
});
for (var lH = ks.length; lH--;) {
if (lF === ks[lH].acornNode) {
ks.splice(lH, 1);
break;
} else if (ks[lH].begin < lF.start) {
break;
}
}
} else if (lF.type === "MemberExpression") {
var lG = lF.property,
lJ = lG.name,
lL = k4.lastIndexOf(lF.computed ? "[" : ".", lG.start),
lN = lF.computed ? k4.indexOf("]", lG.end) : lG.end,
lK = k4.indexOf("(", lN);
if (lL < 0 || lN < 0 || lN < lL || lK < 0) throw new Error('meet_CallExpression bug');
lM.push({
begin: lL,
str: kG.substring(lL, lK + 1),
name: lJ,
acornNode: lI
});
for (var lH = k3.length; lH--;) {
if (lG === k3[lH].acornNode) {
k3.splice(lH, 1);
break;
} else if (k3[lH].begin < lG.start) {
break;
}
}
} else if (/Expression$/.test(lF.type)) {} else throw new Error("bug");
}
function lE(lC) {
if (lC.arguments.length) lD(lC);
}
function lB(lu) {
var lv = lu.id.name;
(lv || 0).substring.call.a;
var ly = lu.id.start;
ly.toPrecision.call.a;
var lA = k4.indexOf("(", lu.id.end),
lx = k4.substring(ly, lA + 1);
lz.push({
begin: ly,
str: lx,
name: lv,
acornNode: lu
});
lu.params.forEach(kR);
lw.push({
begin: lu.start,
str: k4.substring(lu.start, lu.end),
type: lu.type,
name: lv,
acornNode: lu
});
}
function lt(lm) {
lm.params.forEach(kR);
var lo = lm.start,
lq = lm.end,
ln;
while (!/^function/.test(ln = k4.substring(lo, lq))) {
var ls = /^\s*\(\s*/.exec(ln),
lr = /\s*\)\s*$/.exec(ln);
lo += ls[0].length;
lq -= lr[0].length;
if (lo > lq) throw new Error('bug');
}
lp.push({
begin: lo,
str: ln,
type: lm.type,
name: lm.id ? lm.id.name : '',
acornNode: lm
});
}
function ll(lj) {
lk.push({
begin: lj.start,
end: lj.end,
str: k4.substring(lj.start, lj.end),
type: lj.type,
name: 'inline',
acornNode: lj
});
}
function li(lf) {
var lg = lf.id.name;
(lg || 0).substring.call.a;
lh.push({
begin: lf.start,
str: k4.substring(lf.start, lf.end),
type: lf.type,
name: lg,
acornNode: lf
});
}
function le(ld) {}
function kR(lc) {
ks.push({
begin: lc.start,
str: lc.name,
name: lc.name,
acornNode: lc
});
}
function kY(k7) {
var la = k7.value,
l_ = null,
k9, k8;
if (k9 = 'string' === typeof la) l_ = lb;
else if (k8 = la instanceof RegExp) l_ = l$;
if (l_) l_.push({
begin: k7.start,
str: k7.raw,
acornNode: k7
});
if (k9 || k8) {
kH = kH.substring(0, k7.start) + ic(' ', k7.end - k7.start) + kH.substring(k7.end);
}
}
function k6(k5) {
var k1 = k5.property;
if (!k5.computed && k1.type === "Identifier") {
var k2 = k4.lastIndexOf('.', k1.start);
if (k2 < 0) throw new Error('meet_MemberExpression bug');
k3.push({
begin: k2,
str: kG.substring(k2, k1.start + k1.name.length),
name: k1.name,
acornNode: k1
});
}
}
function k0(kW) {
kW.properties.forEach(function(kZ) {
var kX = kZ.key;
if (kX.type === "Identifier") kR(kX);
else if (kX.type === "Literal") kY(kX);
else throw new Error("Whatever " + kW.start);
});
}
function kV(kU) {
ks.push({
begin: kU.start,
str: 'this',
name: 'this',
acornNode: kU
});
}
function kT(kS) {
kS.declarations.forEach(function(kQ) {
kR(kQ.id);
});
}
var kP = k_.bracketcurlyArr,
kO = k_.bracketroundArr,
kN = k_.bracketsquareArr,
kK = k_.bracketextraArr,
kC = k_.bracketArr,
kI = [{
out_arr: kP,
open: '{',
close: '}',
typebracket: 'curly'
}, {
out_arr: kO,
open: '(',
close: ')',
typebracket: 'round'
}, {
out_arr: kN,
open: '[',
close: ']',
typebracket: 'square'
}].concat(kM.map(function(kL) {
var kJ = Object.create(kL);
kJ.out_arr = kK;
return kJ;
}));
ja(kI, kH, kG, kC);
j3(kC, k_.bracketTree);
jV(kC, kH, kG, kF);
jv(kC, kp);
kE.push.apply(kE, kC.filter(function(kD) {
return kD.typebracket === 'metaret';
}));
var kx = kC.filter(function(kB) {
return kB.typebracket === js;
}).reduce(function(kA, kz) {
return kA.concat(kz.sepSplit);
}, []);
for (var ku = 0, kq = kx.length, ky = ks.length, ka = 0; ka < kq && ku < ky; ka++) {
var km = kx[ka],
kv;
while ((kv = ks[ku]).begin < km.begin) {
kv.isVardecl = false;
ku++;
}
kv.isVardecl = true;
ku++;
}
var ks = k_.identifierArr,
kt = k_.identifierArrReverse = iJ(ks),
kr = k_.vardeclArr = [],
kk = k_.identifierObj = {};
for (var kq = ks.length, ka = 0; ka < kq; ka++) {
var km = ks[ka];
(kk[km.str] !== ko[km.str] ? kk[km.str] : (kk[km.str] = [])).push(km.begin);
if (km.isVardecl) kr.push(km);
}
var kp = k_.callArr,
kn = k_.callObj = {};
for (var kq = kp.length, ka = 0; ka < kq; ka++) {
var km = kp[ka];
(kn[km.name] !== ko[km.name] ? kn[km.name] : (kn[km.name] = [])).push(km.begin);
}
var kl = k_.identifierObjReverse = {};
for (var kj in kk) {
if (!(kj in kl)) {
kl[kj] = iJ(kk[kj]);
}
}
var kd = k_.all = [];
for (var ki in k_) {
var kh = ki.match(/^(.+)Arr$/);
if (kh) {
var kf = k_[ki],
kg = kh[1];
for (var ka = kf.length; ka--;) kf[ka].type = kg;
kd.push.apply(kd, kf);
}
}
for (var ka = kd.length; ka--;) {
var kb = kd[ka];
if (!('end' in kb)) kb.end = kb.begin + kb.str.length;
}
kd.sort(j6);
for (var ka = kd.length; --ka;) {
var kb = kd[ka],
ke = kd[ka - 1];
if (kb.begin === ke.begin && kb.end === ke.end) {
if (kb.type !== ke.type) throw new Error("Internal bug.");
kd.splice(ka, 1);
}
}
k_.allReverse = iJ(kd);
var k$ = [].concat(kd);
for (var ka = k$.length - 1; ka--;) {
var kb = k$[ka],
kc;
while (kc = k$[ka + 1], kc && kb.begin <= kc.begin && kc.end <= kb.end) {
(kb.children || (kb.children = [])).push(k$.splice(ka + 1, 1)[0]);
}
}
k_.allTree = k$;
return k_;
}
reservedSet = {};
function j9(j8, j7) {
return j8.begin < j7.begin ? -1 : +1;
}
function j6(j5, j4) {
return j5.begin < j4.begin ? -1 : j5.begin > j4.begin ? +1 : j5.end > j4.end ? -1 : +1;
}
function j3(j1, jY) {
var jX = [];
for (var j2 = j1.length, j0 = 0; j0 < j2; j0++) {
var jW = j1[j0];
jW.bracketchildren = [];
var jZ;
while ((jZ = jX[jX.length - 1]) && jZ.end < jW.begin) jX.pop();
jW.bracketparent = jZ ? jZ : null;
jW.bracketdepth = jX.length;
if (jZ && jW.begin < jZ.end) jZ.bracketchildren.push(jW);
else jY.push(jW);
jX.push(jW);
}
}
function jV(jT, jC, jD, jU) {
for (var jS = jT.length; jS--;) {
var jJ = jT[jS],
jR = jJ.bracketchildren,
jK = jC.substring(jJ.begin, jJ.end),
jL = jJ.begin,
jP = [{
begin: 0,
end: jJ.open.length
}];
for (var jO = jR.length, jG = 0; jG < jO; jG++) {
var jQ = jR[jG];
jP.push({
begin: jQ.begin - jL,
end: jQ.end - jL
});
}
jP.push({
begin: jK.length - jJ.close.length,
end: jK.length
});
jK = ik(jK, jP);
var jM = jJ.sepArr = [];
for (var jO = jK.length, jG = 0; jG < jO; jG++) {
var jN = jK.charAt(jG);
if (jN === ',' || jN === ';') jM.push({
index: jL + jG,
type: jN
});
}
var jF = '<first>',
jE = '<last>',
jH = [{
index: jL + jJ.open.length,
type: jF
}].concat(jM).concat([{
index: jL + jK.length - jJ.close.length,
type: jE
}]),
jB = jJ.sepSplit = [];
for (var jI = -1 + jH.length, jG = 0; jG < jI; jG++) {
var jx = jH[jG],
jw = jH[jG + 1],
jA = jx.index + (jx.type !== jF && jx.type !== jE ? jx.type.length : 0),
jz = jw.index,
jy = jD.substring(jA, jz);
if (!jy || /^\s*$/.test(jC.substring(jA, jz))) continue;
jB.push({
begin: jA,
end: jz,
str: jy,
sep_begin: jx,
sep_end: jw
});
}
}
}
function jv(ju, jh) {
for (var jt = ju.length, jf = jh.length; jt--;) {
var jr = ju[jt];
if (jr.typebracket !== js) continue;
var jm = jr.vdArr = [];
var jp = jr.sepSplit;
for (var jq = jp.length, jo = 0; jo < jq; jo++) {
var jn = jp[jo],
jk = jn.hasOwnProperty('str_noComments') ? jn.str_noComments : (jn.str_noComments = iB(/\/\*|\*\//.test(jn.str) ? jj(jn) : jn.str)),
jl = jk.match(/^([^=]*)\s*=\s*([\s\S]+)$/);
jm.push(jl ? {
leftstr: jl[1],
rightstr: jl[2]
} : {
leftstr: jk,
rightstr: null
});
}
}
function jj(ji) {
var jb = ji.str,
jd = ji.begin,
jg = ji.end,
jc = [];
if (0 < jf) {
for (; jf--;) {
var je = jh[jf];
if (je.end > jg) continue;
if (je.end < jd) {
jf++;
break;
}
jc.unshift(je.end - jd);
}
jc.unshift(je.begin - jd);
return jc.join('');
}
return jb;
}
}
function ja(iZ, i3, iP, iU) {
var i5 = new RegExp(iZ.map(function(j$) {
var j_ = i6(j$.open),
i9 = i6(j$.close);
return '(' + j_ + ')' + '|' + '(' + i9 + ')';
function i6(i7) {
return 'string' === typeof i7 ? i7.replace(/(\W)/g, '\\$1').replace(/^(\w)/, '\\b$1').replace(/(\w)$/, '$1\\b') : i7.map(i6).join('|');
}
}).join('|'), 'g'),
iS = [],
iW, i0;
while (iW = i5.exec(i3)) {
var i2 = -1;
for (var iT = iW.length; iT--;) {
if (iW[iT]) {
i2 = iT - 1;
break;
}
}
if (!(-1 < i2)) i0.bug;
var iX = 1 & i2,
iY = i2 >> 1;
var i1 = iZ[iY][iX ? 'close' : 'open'];
if (!('string' === typeof i1 ? iW[0] === i1 : -1 < i1.indexOf(iW[0]))) i0.bug;
var iQ = {
begin: iW.index,
end: iW.index + iW[0].length,
cfg: iZ[iY]
};
iQ[iX ? 'close' : 'open'] = iW[0];
iS.push(iQ);
}
var iM = [];
for (var iV = iS.length, iT = 0; iT < iV; iT++) {
var iQ = iS[iT];
if (iQ.open) {
var iN = {
begin: iQ.begin,
typebracket: iQ.cfg.typebracket,
open: iQ.cfg.open,
close: iQ.cfg.close
};
iQ.cfg.out_arr.push(iN);
iU.push(iN);
iM.push({
i: iT,
x: iN
});
} else {
var iK = iM[iM.length - 1];
if (!iK) {
if (!iQ.cfg.ignore_unbalanced) throw new Error('Unbalanced brackets: missing an opening "' + iQ.cfg.open + '".');
} else if ('string' === typeof iK.x.close ? iK.x.close !== iQ.close : 0 > iK.x.close.indexOf(iQ.close)) {
if (!(iS[iK.i].cfg.ignore_unbalanced || iQ.cfg.ignore_unbalanced)) {
throw new Error('Unbalanced brackets: opening typebracket "' + iK.x.typebracket + '" (' + iK.x.begin + ')' + ' does not match closing typebracket "' + iQ.cfg.typebracket + '" (' + iQ.begin + ').');
}
} else {
var iN = iM.pop().x;
iN.close = iQ.close;
iN.end = iQ.end;
iN.str = iP.substring(iN.begin, iN.end);
}
}
}
if (iM.length !== 0) {
var iK = iM[iM.length - 1];
iL.console && iL.console.error("last:", iK);
throw new Error('Unbalanced brackets: missing a closing "' + iK.x.close + '" for {open:"' + iK.x.open + '", begin:<char:' + iK.x.begin + '>}. Did you forget a semicolon, maybe?');
}
}
function iJ(iI) {
var iH = [].concat(iI);
iH.reverse();
return iH;
}
function ic(iG, iF) {
var iD;
if (iF < 1000) {
iD = iG + '#' + iF;
if (iD in ic) return ic[iD];
}
var iE = [];
while (iF) {
if (iF & 1) iE.push(iG);
iG += iG;
iF >>= 1;
}
var iC = iE.join('');
if (iD != null) ic[iD] = iC;
return iC;
}
function iB(iy) {
var iz = iy.length;
if (!iz) return iy;
for (var ix = 0; ix < iz; ix++) {
if (iy.charAt(ix) !== ' ') break;
}
for (var iw = iz - 1; iw >= ix; iw--) {
if (iy.charAt(iw) !== ' ') break;
}
return iy.substring(ix, iw + 1);
}
function ik(i$, ih) {
if (!ih.length) return i$;
var ij = ih[ih.length - 1],
h9 = [],
i_ = 0;
for (var ii = ih.length, ig = 0; ig < ii; ig++) {
var ie = ih[ig],
ia = ie.end,
ib = ie.begin;
if (i_ < ib) h9.push(i$.substring(i_, ib));
h9.push(ic(' ', ia - ib));
i_ = ia;
}
if (i_ < i$.length) h9.push(i$.substring(i_));
return h9.join('');
}
})(m || F || this);
}
if (typeof cp2fmtree === 'undefined') {
var m, F;
(function(h2) {
var hW = 'jsmMetafun',
h8 = 'jsmMetaret',
hY = 'functionExpression',
hX = 'functionDeclaration',
h7 = 'reserved',
h6 = 'call',
h5 = 'dotcall',
h4 = 'bracket',
h3 = 'curly',
gr = {};
h2.cp2fmtree = hu;
function hu(hp, hs, hr, hG) {
var hq = arguments.length < 2;
hs || (hs = []);
hr || (hr = {
iAnonymous: 0,
lastname2fmarr: {}
});
var h0 = hp instanceof Array ? hp : hp.allTree,
hn = [];
if (hq) hn.lastname2fmarr = hr.lastname2fmarr;
for (var h1 = h0.length, hZ = 0; hZ < h1; hZ++) {
var ht = h0[hZ];
var hO = ht.type === hY || ht.type === hX,
hN = ht.type === hW,
hx = hO && !ht.name;
if (hx || hO || hN) {
var hQ = ht.begin,
hP, hM = [],
hL = [],
hV;
if (hx) {
hM = ['anonymous#' + hr.iAnonymous++];
} else {
hM = ht.name.split('.');
}
var hR = ht.children.filter(function(hU) {
return hU.type !== 'comment';
}),
hT = hR[0];
if (hT.type === 'call') {
if (hT.name !== ht.name) throw new Error('Inconsistency! Probably a bug here.');
hR.shift();
}
if (hR.length !== 2) throw new Error('Unexpected metafun declaration or function declaration');
var hK = hR[0],
hI = hK.sepSplit.map(hm),
hH = {};
for (var hS = hI.length; hS--;) hH[hI[hS]] = 1;
var hD = hR[1],
hP = hD.end,
hy = hD.str,
hF = hs.concat(hM),
hJ = hF.join('.'),
hw = hF[hF.length - 1],
hv = {
begin: hQ,
end: hP,
fullname_arr: hF,
lastname: hw,
isFunction: hO,
isMetafunction: hN,
isAnonymousFunction: hx,
dot_arr: hM,
dotnode_arr: hL,
param_node: hK,
body_node: hD,
fm_node: ht,
fullname: hJ,
param_arr: hI,
param_str: hI.join(','),
param_set: hH,
parent: hG || null,
children: null,
body: null
};
var hz = hD.children ? hu(hD.children, hF, hr, hv) : [];
for (var hE = hz.length; hE--;) {
var hC = hz[hE],
hB = hC.begin - hD.begin,
hA = hC.end - hD.begin;
if (!hC.isAnonymousFunction) hy = hy.substring(0, hB) + hy.substring(hB, hA).replace(/[\s\S]/g, ' ') + hy.substring(hA);
}
hv.children = hz;
hv.body = hy;
hn.push(hv);
if (!hx) {
(hr.lastname2fmarr[hw] || (hr.lastname2fmarr[hw] = [])).push(hv);
}
} else if (ht.children) {
hn.push.apply(hn, hu(ht.children, hs, hr));
}
}
if (hq) {
hk(hn, [].concat(hp.vardeclArr), 'vardecl');
hk(hn, hp.identifierArr.filter(function(ho) {
return !ho.isVardecl;
}), 'varuse');
gP(hn);
}
return hn;
}
function hm(hl) {
return hl.str.replace(/\/\*[\s\S]*?\*\//g, '').replace(/(^\s+|\s+$)/g, '');
}
function hk(hh, h_, hc) {
var hi = hh.length;
for (var hg = 0; hg < hi; hg++) {
var hd = hh[hg],
hj = hd.children;
if (hj && hj.length) hk(hj, h_, hc);
}
for (var hg = 0; hg < hi; hg++) {
var hd = hh[hg],
hf = hd.begin,
h$ = hd.end,
he = hd.param_node.begin,
hb = hd.param_node.end,
g8 = hd[hc + 'Arr'] = [],
g7 = hd[hc + 'Obj'] = {};
for (var g9 = h_.length; g9--;) {
var ha = h_[g9];
if (ha.end < hb) break;
if (ha.begin < h$) {
var g6 = h_.splice(g9, 1)[0];
g8.unshift(g6);
(g7[g6.name] || (g7[g6.name] = [])).push(g6);
}
}
}
}
function gP(g4, gN) {
if (g4 instanceof Array) {
for (var gU = g4.length, g5 = 0; g5 < gU; g5++) gP(g4[g5], gN);
return;
}
var gO = g4;
gN = gN ? gu(gN) : {};
var g3 = gO.idname2decluse = gN,
gR = [gN];
for (var gT = gO.param_arr.length; gT--;) {
var gS = gO.param_arr[gT],
g2 = gO.param_node.sepSplit[gT];
gG(gR, gS, {
isParam: true,
fmDecl: gO,
use: [],
name: gS,
declArr: [{
begin: g2.begin,
end: g2.end
}]
});
}
for (var gS in gO.vardeclObj) {
if (!(gS in gr)) {
var g0 = gO.vardeclObj[gS],
g1 = g0.length,
gX = new Array(g1);
for (var gZ = 0; gZ < g1; gZ++) {
var gY = g0[gZ];
gX[gZ] = {
begin: gY.begin,
end: gY.end
};
}
gG(gR, gS, {
isVardecl: true,
fmDecl: gO,
use: [],
name: gS,
declArr: gX
});
}
}
for (var gT = gO.children.length; gT--;) {
var gW = gO.children[gT],
gS = gW.lastname,
gV = [];
if (gW.dotnode_arr.length) {
gV.push({
begin: gW.dotnode_arr[0].begin,
end: gW.dotnode_arr.slice(-1)[0].end
});
}
gG(gR, gS, {
isFunction: true,
fmDecl: gO,
use: [],
name: gS,
declArr: gV
});
}
for (var gU = gO.varuseArr.length, gT = 0; gT < gU; gT++) {
var gQ = gO.varuseArr[gT],
gS = gQ.name;
if (!gN[gS]) {
gG(gR, gS, {
isGlobal: true,
fmDecl: null,
use: []
});
}
gz(gR, gO, gQ);
}
gP(gO.children, gN);
}
function gG(gD, gC, gA) {
var gH;
(gC || 0).substring.call.a;
(gA || gH).hasOwnProperty.call.a;
if (gD instanceof Array) {
gD.forEach(function(gF) {
gG(gF, gC, gA);
});
return;
}
if (!gD[gC] || gD[gC].fmDecl !== gA.fmDecl) {
var gE = gu(gA);
gE.use = [].concat(gE.use);
gD[gC] = gE;
} else {
var gB = gD[gC].use;
gB.push.apply(gB, gA.use);
}
}
function gz(gx, gv, gw) {
if (gx instanceof Array) {
gx.forEach(function(gy) {
gz(gy, gv, gw);
});
return;
}
gx[gw.name].use.push(gs(gu(gw), {
fmUse: gv
}));
}
function gu(gt) {
return gs({}, gt);
}
function gs(go, gq) {
for (var gp in gq) {
if (!(gp in gr)) {
go[gp] = gq[gp];
}
}
return go;
}
})(m || F || this);
}
if (typeof metaparse === 'undefined') {
var m, F;
if (typeof codeparse === 'undefined') {}
if (typeof cp2fmtree === 'undefined') {};
(function(fw) {
var dd = 0,
gk = 'metafun',
dG = 'metaret',
gn = [gk, dG],
gm = [{
open: dG,
close: ';',
typebracket: dG,
ignore_unbalanced: true
}],
g$ = {
extraReservedArr: gn,
extraBracketArr: gm
},
fB = {
jsmAllowMetaretOutsideFunction: true,
allowReturnOutsideFunction: true
},
dM = bN({}, g$, fB);
fw.MetaDecl = fX;
fw.MetaFunction = e7;
fw.metaparse = gh;
gh.get_CODEPARSE_OPT = gj;
gh.get_CONST = gl;
function gj() {
return JSON.parse(JSON.stringify(g$));
}
function gl() {
return {
'METAFUN': gk,
'METARET': dG,
'CODEPARSE_OPT': gj()
};
}
var gi = /\s*(metafun|function)\s*(\S+)\s*\(\s*([^\)]+?)\s*\)((?![\r\n]\s*(metafun|function))[\s\S])*/g,
fF = /^\s*(metafun|function)\s*(\S+)\s*\(\s*([^\)]+?)\s*\)\s*\{\s*(((?![\r\n]\s*(metafun|function))[\s\S])*)\s*\}\s*$/,
fG = /^\s*(metafun|function)\s/,
fJ = /^\s*function\s/;
function gh(gg, f8, f7) {
f8 || (f8 = fx);
var ge = gg ? [gg] : document.getElementsByTagName('script'),
f6 = [];
for (var gf = ge.length, gd = 0; gd < gf; gd++) {
var gb = ge[gd],
gc = 'string' === typeof gb;
if (!gc && 'text/js-metaret-decl' !== gb.getAttribute('type')) continue;
var ga = gc ? gb : gb.textContent || gb.innerText,
g_ = codeparse(ga, g$),
f9 = cp2fmtree(g_);
f3(f9, true, f8, f6, f7);
}
return f6;
}
function f3(fZ, f1, f0, fY, f2) {
fY || (fY = []);
if (fZ instanceof Array) {
for (var f5 = fZ.length, f4 = 0; f4 < f5; f4++) f3(fZ[f4], f1, f0, fY, f2);
} else {
if (fZ.children) f3(fZ.children, false, f0, fY, f2);
f0[fZ.fullname] = {
fm: fZ,
_work_in_progress: true
};
fC(fZ.fullname, fZ.param_str, fZ.body, fZ.children, fZ.isFunction, f0, f2);
delete f0[fZ.fullname]._work_in_progress;
if (f1) fY.push({
fullname: fZ.fullname,
fmtree: fZ,
info: f0[fZ.fullname]
});
}
return fY;
}
var fx = {};
function fX(fW, fV, fU, fT, fS, fR) {
fC(fW, fV, fU, fT, false, fS || fx, fR);
}
function fC(fy, fq, fo, fl, fs, fn, fk) {
fl || (fl = []);
fs != null || (fs = fJ.test(fy));
fn || (fn = fx);
var fH = fq == null,
fI = fo == null;
if (fH ^ fI) throw new Error('Decl: invalid usage. Give either both `param` and `body`, or none of them.');
if (fH) {
var fE = fG.test(fy) ? fy : (fs ? 'function' : 'metafun') + ' ' + fy,
fD = fF.exec(fE),
fr = fD[2];
fq = fD[3];
fo = fD[4];
fC(fr, fq, fo, fl, fs, fn, fk);
return;
}
if (!fs) {
var fA = codeparse(fo, fB),
fz = fA.identifierObj['arguments'] || [];
if (fz.length) throw new Error('metafun error: it is forbidden to use `arguments` in the body of the metafun (because the body of the metafun may end up being inlined within a `while` loop).');
}
var fr = fy;
var ft = fr.split('.'),
fu = fn === fx ? fw : {};
while (ft.length > 1) {
var fv = ft.shift();
fu = fu[fv] || (fu[fv] = {});
}
var fp = fs ? '' : ('\nmetafun ' + fr + '\n( ' + fq + ')').replace(/([\r\n])/g, '$1// --- ') + '\n\n';
fu[ft[0]] = (fs ? fj : e7)(fr, fq, fp + fo, fn, fl, fk);
}
function fj(ff, e9, e8, fe, fg, fd) {
d3(fe, ff);
if (fg && fg.length) {
var fh = /\}\s*/,
fi = fh.test(e8);
e8 = fi && e8.replace(fh, '\n\n' + e$(fe, fg) + '\n\n}');
}
var f_ = fe[ff] = fe[ff] || {};
f_.name = ff;
f_.lastname = ff.replace(/^.*\./, '');
f_.origParam = e9;
f_.origBody = e8;
f_.name2info = fe;
f_.impl = null;
f_.paramArr = e9.split(',');
f_.body = e8;
var fc = fd && fd.doNotCompile ? fb : f$();
fc.getInfo = fa;
fc.getImpl = f$;
return fc;
function fb() {
return (f_.impl || (f_.impl = f$())).apply(this, arguments);
}
function fa() {
return Object.create(f_);
}
function f$() {
return f_.impl || (f_.impl = new Function(e9, e8));
}
}
function e7(e2, e6, e4, eZ, e1, eY) {
d3(eZ, e2);
var eT = eZ[e2] = eZ[e2] || {};
eT.name = e2;
eT.lastname = e2.replace(/^.*\./, '');
eT.origParam = e6;
eT.origBody = e4;
eT.name2info = eZ;
eT.solved = false;
eT.newParam = null;
eT.newBody = null;
eT.impl = null;
var e3 = eT.paramArr = dZ(e6),
e5 = eT.varArr = dV(e4),
e0 = eT.metaretArr = dN(e4, e3.self, e2);
eR(eT, e1);
var eX = eW;
if (e0.hasAll(eZ)) {
eT.solve();
if (!(eY && eY.doNotCompile)) eX = eT.compile();
}
eX.getInfo = eV;
eX.getImpl = eU;
return eX;
function eW() {
if (!eT.impl) eT.compile();
return eT.impl.apply(this, arguments);
}
function eV() {
return Object.create(eT);
}
function eU() {
if (!eT.impl) eT.compile();
return eT.impl;
}
}
var d2 = /^(([a-zA-Z_]\w*|anonymous#\d+)\.)*([a-zA-Z_]\w*|anonymous#\d+)$/,
eS = /^(([a-zA-Z_]\w*|anonymous#\d+)\.)*(anonymous#\d+)$/,
dY = /^((?:^\s*|\s*,\s*)[a-zA-Z_]\w*(?:\s*))+$/,
dE = /^[a-zA-Z_]\w*?(\.[a-zA-Z_]\w*?)*$/,
c2 = Array.prototype.slice;
function eR(ep, el) {
var eJ = ep.name,
ez = ep.metaretArr,
er = ep.paramArr,
eQ = ep.varArr,
eF = ep.origBody,
eg = ep.name2info,
eP = eJ.split('.');
ep.solve = eN;
ep.compile = eO;
function eN() {
if (ep.solved) return;
if (!ez.hasAll(eg)) throw new Error('MetaFunction : _createSolver : solve() could not resolve all dependencies yet for metafunction "' + eJ + '".');
if (!ez.length) eM();
else if (!ez.hasOther()) eK();
else eA();
ep.solved = true;
}
function eO() {
if (!ep.solved) eN();
return ep.impl || (ep.impl = new Function(ep.newParam.join(','), ep.newBody));
}
function eM() {
var eL = 'MetaFunction : _createSolver:solveNoMetaret() no #metaret in body of metafunction "' + eJ + '".';
if ('undefined' !== typeof console && console.warn) console.warn(eL);
ep.newParam = er;
ep.newBody = eF.replace(/^\s+$/mg, '');
}
function eK() {
var eI = [er, eF],
eE = dc('L_' + eJ, eI),
eD = dc('undef', eI),
eC = ep.newParam = er,
eG = cg(4),
eH = cg(8),
eB = ep.newBody = eG('var ' + eD + ';\n' + eE + ': while (true) {\n' + eG(cv(c3(eg, ez, eF, eE, er), ep.varArr, eD) + '\n') + ' return;\n' + '}\n' + (el && el.length ? '\n\n' + e$(eg, el) + '\n' : '')).replace(/^\s+$/mg, '');
ep.paramArr = eC;
ep.body = eB;
}
function eA() {
var ey = ez.hasAll(),
em = [ep].concat(ey.infoArr.filter(function(ex) {
return ex !== ep;
})),
ef = em.map(function(ew) {
return ew.name;
}),
ee = em.map(function(ev) {
return ev.paramArr.concat(ev.origBody);
}),
en = ef.switch_ind_name = dc('switch_ind', ee),
eo = ef.switchLabel = dc('L_switch', ee),
ec = dc('undef', ee);
b0(em.map(function(eu) {
return eu.fm;
}));
var eh = cg(4),
ea = cg(8),
et = cg(12),
es = ep.newParam = er,
eq = ep.newBody = eh(['var ' + ec + ';', 'var ' + en + ' = 0;', eo + ': while (true) {', eh('switch (' + en + ') {')].concat(em.map(ej)).concat([eh('}'), eh('return;'), '}', ''].concat(el && el.length ? ['', '', e$(eg, el.filter(function(ek) {
(ek.fullname || 0).substring.call.a;
return 0 > ef.lastIndexOf(ek.fullname);
}))] : []))).join('\n').replace(/^\s+$/mg, '');
function ej(ed, ei) {
var eb = ['', 'case ' + ei + ':'];
eb.push(eh(cv(c3(eg, ed.metaretArr, ed.origBody, ef, ee), ed.varArr, ec)));
eb.push('break;');
eb.push('');
return eb.map(ea).join('\n');
}
}
}
function e$(d7, d9) {
var d4 = [];
for (var e_ = d9.length, d8 = 0; d8 < e_; d8++) {
var d6 = d9[d8],
d5 = d7[d6.fullname];
if (d6.isAnonymousFunction) continue;
d4.push('\n');
d4.push('function ' + d5.lastname + '(' + d5.paramArr.join(',') + ')\n' + (/^\s*\{[\s\S]*?\}\s*$/.test(d5.body) ? d5.body : '{\n' + d5.body + '\n}\n'));
}
return d4.join('\n');
}
function d3(d1, d0) {
if (!d2.test(d0)) throw new Error('MetaFunction : _checkNameNotUsedYet : Invalid function name "' + d0 + '". The function name must match [a-zA-Z_][a-zA-Z_0-9]*');
if (c_(d1, d0, [])) throw new Error('MetaFunction : _checkNameNotUsedYet : Duplicate function name "' + d0 + '". The function name must be unique: ' + 'MetaFunction can be called one time only with a given name.');
}
function dZ(dX) {
dX = dX.replace(/\/\*.*?\*\//g, '');
if (!dY.test(dX)) throw new Error('MetaFunction : _checkExtractParam : Invalid parameters string, the string must be like "self,x,y,z".');
var dW = dX.replace(/\s+/g, '').split(',');
dW.self = dW.splice(dd, 1)[0];
return dW;
}
function dV(dU) {
var dT = codeparse(dU, dM),
dR = dT.identifierArr,
dO = [];
for (var dS = dR.length, dQ = 0; dQ < dS; dQ++) {
var dP = dR[dQ];
dO.push({
text: dP.str,
end: dP.begin + dP.str.length,
start: dP.begin,
isVardecl: dP.isVardecl
});
}
return dO;
}
function dN(dK, dD, dx) {
var dL = codeparse(dK, dM),
dI = dL.bracketextraArr,
dw = [];
dw.body = dK;
dw.self = dD;
dw.selfName = dx;
for (var dJ = dI.length, dH = 0; dH < dJ; dH++) {
var dy = dI[dH];
if (dy.typebracket !== dG) continue;
var dC = dy.sepSplit.map(function(dF) {
return dF.str.replace(/^\s+/, '').replace(/\s+$/, '');
}),
dz = dC.length > dd && dC.splice(dd, 1)[0];
if (!dz) throw new Error('MetaFunction : _checkExtractMetaret() : A `metaret` needs at least an action.');
if (dz !== dD && !dE.test(dz)) {
throw new Error('MetaFunction : _checkExtractMetaret : Invalid action "' + dz + '". action must be self ("' + dD + '") or a named action (like "myOtherAction" or "my.other.action" or "my_other_action").');
}
var dB = dz === dD || dz === dx;
dw.push({
exprArr: dC,
isSelf: dB,
action: dB ? dx : dz,
end: dy.end,
start: dy.begin,
namespace: dx,
namespace_arr: dx.split('.')
});
}
dw.hasOther = dv;
dw.hasAll = dr;
return dw;
}
function dv() {
var dt = 'hasOtherResult';
if (dt in this) return this[dt];
var ds = [];
for (var du = this.length; du--;) {
if (!this[du].isSelf) ds.push(this[du].action);
}
return this[dt] = ds.length && ds;
}
function dr(dl, dk, dh, dg) {
var dj = arguments.length < 2;
if (dj) {
var di = 'hasAllResult';
if (di in this) return this[di];
dh = {};
dg = [];
}
for (var dq = this.length; dq--;) {
var dp = this[dq];
if (dp.isSelf) continue;
var dn = dp.action;
if (!dn) throw new Error('MetaFunction : hasAll : Found a bug: empty metaret action (not permitted).');
if (dn in dh) continue;
var dm = b4(dl, dn, dp.namespace_arr);
if (!dm) return false;
if (dm.name in dh) continue;
dh[dn] = dh[dm.name] = dm;
dg.push(dm);
if (!dm.metaretArr.hasAll(dl, dk, dh, dg)) return false;
}
if (dj) return this[di] = {
vObj: dh,
infoArr: dg
};
else return true;
}
function dc(db, da) {
var d$ = cM(db, da);
da.push(d$);
return d$;
}
function cM(d_) {
var c8 = c2.call(arguments, 1);
for (var c9 = null; true; c9 = (c9 >>> 0) + 1) {
var c7 = '_' + d_.replace(/#/g, '').replace(/\W/g, '_') + (c9 || '') + '_';
if (!c6(c8)) return c7;
}
function c6(c5) {
if (typeof c5 === 'string') return -1 < c5.indexOf(c7);
for (var c4 = c5.length; c4--;) {
if (c6(c5[c4])) return true;
}
return false;
}
}
function c3(cQ, cD, c1, cE) {
var cL = c2.call(arguments, 1),
cF = typeof cE === 'string',
cS = c1;
for (var cZ = cD.length; cZ--;) {
var cX = cD[cZ],
cV = cS.slice(0, cX.start),
cT = cS.slice(cX.end);
var cW = '',
cY = cT.match(/^\s*(?:\/\/[^\r\n]*[\r\n]+|\/\*((?!\*\/)[\s\S]*)\*\/)/);
if (cY) {
cW = cY[0];
cT = cT.substring(cW.length);
}
var cU = cR(cX, cW);
cS = cV + cU + cT;
}
return cS;
function cR(cz, cx) {
var cw = [],
cC = b4(cQ, cz.action, cz.namespace_arr),
cN = cC.paramArr,
cJ = cz.exprArr;
if (cN.length !== cJ.length) {
throw new Error('MetaFunction : _replaceMetaretWithContinue : prepareCode : Invalid number of metaret arguments, action "' + cz.action + '" expects ' + cN.length + ' arguments, but ' + cJ.length + ' were given.');
}
if (cN.length === 1) {
cw.push(cN[0] + ' = ' + cJ[0] + ';');
} else {
for (var cK = 0, cI = 0, cP = cN.length; cI < cP; cI++) {
var cH = cN[cI];
if (cH === cJ[cI]) continue;
var cG = cM(cH, cL);
cL.push(cG);
cw.splice(cK++, 0, 'var ' + cG + ' = ' + cJ[cI] + ';');
cw.push(cH + ' = ' + cG + ';');
}
}
if (cF) {
cw.push('continue ' + cE + ';');
} else {
var cy = cE;
if (cz.action === cD.selfName) {
cw.push('continue ' + cy.switchLabel + '; // --- stay in: ' + cz.action);
} else {
var cB = cy.indexOf(cC.name);
if (0 > cB) {
throw new Error('MetaFunction : _replaceMetaretWithContinue : prepareCode : Found a bug! Could not find the switch index of action "' + cz.action + '"');
}
cw.push(cy.switch_ind_name + ' = ' + cB + '; // --- go to: ' + cz.action);
cw.push('continue ' + cy.switchLabel + ';');
}
}
if (cx) cw.unshift(cx);
cw.unshift('{');
cw.push('}');
return cw.join('\n') + '\n';
}
}
function cv(ci, ct, ck) {
var cj = [],
cq = {};
for (var cr = 0, cu = ct.length; cr < cu; cr++) {
var cn = ct[cr],
cm = cn.text;
if (cm in cq) continue;
cq[cm] = 1;
var co = ci.search(new RegExp(cm + '\\s*[,;]'));
if (cn.isVardecl && -1 < co && co < cn.end) {
cj.push(cm);
}
}
if (!cj.length) return ci;
return 'var ' + cj.map(function(cl) {
return cl + ' = ' + ck;
}).join('\n, ') + (cj.length > 1 ? '\n' : '') + ';\n' + ci;
}
function cg(cf) {
var ce = ' ',
cd = [];
while (cf) {
if (cf & 1) cd.push(ce);
cf >>= 1;
ce += ce;
}
var cb = cd.join('');
return c$;
function c$(ca) {
if (typeof ca === 'string') {
var cc = /\n/;
if (cc.test(ca)) return ca.split(cc).map(c$).join('\n');
return cb + ca;
}
return ca.map(c$);
}
}
function c_(b9, b8, b7) {
var b6 = b4(b9, b8, b7);
return !!(b6 && !b6._work_in_progress);
}
function b4(b3, b2, b1) {
var b5 = b1.concat(b2).join('.');
if (b5 in b3) return b3[b5];
if (b1.length) return b4(b3, b2, b1.slice(0, -1));
return false;
}
function b0(bZ) {
var bS = {};
bZ.forEach(bY);
function bY(bU) {
if (!bU) return;
var bX = bU.varuseObj,
bW = bU.vardeclObj,
bV = bU.param_set;
for (var bR in bX) {
if (!(bR in bW) && !(bR in bV)) {
var bT = bQ(bR, bU);
if (!bS[bR]) bS[bR] = {
scope: bT
};
else if (bT !== bS[bR].scope) throw new Error('metafun error: when using mutual recursion, the various metafunctions must share their bound variables (if any).');
}
}
}
}
function bQ(bP, bO) {
return bO ? bO.vardeclObj[bP] ? bO : bQ(bP, bO.parent) : null;
}
function bN() {
var bI = arguments[0];
for (var bL = 1, bM = arguments.length; bL < bM; bL++) {
var bK = arguments[bL];
for (var bJ in bK) {
if (bK.hasOwnProperty(bJ)) {
bI[bJ] = bK[bJ];
}
}
}
return bI;
}
})(m || F || this);
}(function(bH) {
bH.jsm2js = bG;
function bG(bF) {
var br = {},
bE = metaparse(bF, br, {
doNotCompile: true
}),
bw = bF;
bt(bE);
bp(bw);
return bw;
function bt(bD) {
for (var bC = bD.length; bC--;) {
var bB = bD[bC],
bu = bB.fmtree,
bx = bB.info,
by = bu.begin,
bv = bu.end,
bz = bx.lastname;
by.toPrecision.call.a;
(bv || null).toPrecision.call.a;
if (bu.isMetafunction) {
bw = bw.substring(0, by) + '\nfunction ' + bx.lastname + '(' + bx.paramArr.join(',') + ')\n{\n' + (bx.newBody || bx.solve(), bx.newBody) + '\n}\n' + bw.substring(bv);
} else if (bu.isFunction) {
var bs = bu.children;
if (bs) bt(bs.map(function(bq) {
return {
fmtree: bq,
info: br[bq.fullname]
};
}));
}
}
}
}
var bo;
function bp(be) {
bo || (bo = metaparse.get_CONST());
var bn = codeparse(be, bo.CODEPARSE_OPT),
bi = cp2fmtree(bn),
bl = bn.jsmMetaretArr || [],
bm = bn.jsmMetafunArr || [];
if (bm.length || bl.length) {
if ('undefined' !== typeof console) {
console.error('mfunArr:', bm);
console.error('mretArr:', bl);
}
throw new Error('jsm2js:check_leftover: found remaining `metafun` and/or `metaret` within function(s): ' + ' - Please check for basic errors. For example a `metaret` can only be used from within a `metafun`.' + ' See also github issue #9: https://github.com/glathoud/js.metaret/issues/9');
}
}
})(m || F || this);
} {
var m, F;
if (typeof codeparse === 'undefined') {}
if (typeof cp2fmtree === 'undefined') {}(function(bb) {
var ah = 'inline',
ba = {
extraReservedArr: [ah]
},
$5 = {
extraReservedArr: [ah],
jsmAllowMetaretOutsideFunction: true,
allowReturnOutsideFunction: true
},
$x = 'varassign',
$y = 'assign',
$z = 'call',
au = 'bracket',
as = 'round',
aC = 'identifier',
bc = 'reserved',
$0 = 'return',
$M = 'var',
aw = 'vardecl';
bb.inlineCode = aN;
function aN(aR, aH, aW, aJ) {
aH || (aH = {});
aJ || (aJ = []);
var aM = codeparse(aR, ba),
aL = cp2fmtree(aM),
a9 = aM.all,
aQ = a9.map(function(b$, b_) {
var a8 = aE(b$, b_, a9, aR);
if (a8) {
a8.begin = a8.o.begin;
a8.end = a8.args.end;
a8.str = aR.substring(a8.begin, a8.end);
}
return a8;
}).filter(function(a7) {
return a7;
});
var a5 = aL.lastname2fmarr;
var aG = aW ? JSON.stringify(aW) : aR;
aJ.push({
key: aG,
code: aR,
workspace: aH,
opt_code_info: aW
});
if (aG in aH) {
var aF = aH[aG].newcode;
if ('string' !== typeof aF) {
if ('undefined' !== typeof console && console && console.error) {
console.error('error_inline_stack (summary):\n ' + aJ.map(function(a6) {
return '\n' + a6.key.substring(0, 96) + (a6.key.length < 96 ? '' : '...');
}).join('\n\n###\n'));
console.error('error_inline_stack (full):');
console.error(aJ);
}
throw new Error('inline error: Most likely you have an infinite `inline` recursion. Consider using `metafun` and `metaret` instead.');
}
return aF;
}
aH[aG] = {
code_info: aW,
inlineArr: aQ,
lastname2fmarr: a5,
cp: aM,
fm: aL
};
if (!aQ.length) return aH[aG].newcode = aR;
for (var aP = aQ.length; aP--;) {
var aK = aQ[aP];
aK.fmScopePath = $e(aL, aK);
var a4 = $a(aL, aK, aK.fmScopePath);
if (a4) {
aK.hasLocalMatch = true;
aK.fmCallMatch = a4;
aK.matchKey = aG;
} else {
var a3 = [],
aY = aK.call.name;
(aY || 0).substring.call.a;
for (var aX in aH) {
if (aH.hasOwnProperty(aG)) {
if (aG === aX) continue;
var a2 = aH[aX],
a1 = a2.lastname2fmarr,
a0 = a1[aY],
aZ = a0 && a0.length;
if (aZ === 1) {
if (aK.fmCallMatch) {
throw new Error('Ambiguous match for inline call "' + aY + '" found between the 2 pieces: ' + aK.matchKey + '\n --- and --- \n' + aX);
}
aK.hasLocalMatch = false;
aK.fmCallMatch = a0[0];
aK.matchKey = aX;
_0(aK.fmCallMatch);
} else if (aZ === 2) {
throw new Error('Ambiguous match for inline call "' + aY + '" found within piece "' + aX);
}
}
}
}
if (!aK.fmCallMatch) throw new Error('inline error: when inlining within a file, the source body must be visible to the target inline location. one.call.name: "' + aK.call.name + '", opt_code_info: ' + JSON.stringify(aW));
var aU = aK.fmCallMatch.begin,
aS = aK.fmCallMatch.end,
aV = aM.identifierObj['arguments'] || [];
if (aV.some(function(aT) {
return aU <= aT && aT < aS;
})) throw new Error('inline error: it is forbidden to use `arguments` in the body of the function to be inlined.');
}
var aF = aR;
for (var aP = aQ.length; aP--;) {
var aK = aQ[aP],
aO = aK.begin,
aI = aK.end;
aF = aF.substring(0, aO) + aN(ak(aM.identifierObj, aL, aK), aH, null, aJ) + aF.substring(aI);
}
return aH[aG].newcode = aF;
}
function aE(aq, ao, aD, ar) {
if (aq.name !== ah) return;
var ax, an, am, al, az = aq.children.length,
ay = aq.children[0],
aB = aq.children[1],
aA = aq.children[2];
if (az === 2 && (am = ay).type === $z && (al = aB).type === au && al.typebracket === as) {
return {
o: aq,
ind: ao,
inlinetype: $z,
call: am,
args: al
};
}
if (az === 3 && (an = ay).type === aC && (am = aB).type === $z && (al = aA).type === au && al.typebracket === as && /=/.test(ar.substring(an.end, am.begin))) {
return {
o: aq,
ind: ao,
inlinetype: $y,
identifier: an,
call: am,
args: al
};
}
var av;
if (az === 1 && (ax = ay).type === au && ax.typebracket === $M && (av = ax.children).length === 3 && (an = av[0]).type === aw && (am = av[1]).type === $z && (al = av[2]).type === au && al.typebracket === as && /=/.test(ar.substring(an.end, am.begin))) {
return {
o: aq,
ind: ao,
inlinetype: $x,
identifier: an,
call: am,
args: al
};
}
throw new Error('Unrecognized inline syntax.');
}
function ak(ag, aj, $u) {
var $v;
var ai = $u.fmScopePath,
$9 = $u.fmCallMatch;
if (-1 < ai.indexOf($9)) {
if ('undefined' !== typeof console) console.error('Could not inline: self-recursion found for "' + $9.fullname + '".');
else if ('undefined' !== typeof print) print('[ERROR] Could not inline: self-recursion found for "' + $9.fullname + '".');
return $u.str.substring(ah.length);
}
var aa = Object.create(ag);
var $D = $n('undef', aa),
$w = $n('ret', aa),
ae = $9.param_arr,
$T = ae.map(function(af) {
return $n(af, aa);
}),
$3 = $s(ae, $T),
ad = $9.vardeclArr,
a$ = ad.map(function(ac) {
return ac.name;
}),
a_ = a$.map(function(ab) {
return $n(ab, aa);
}),
$H = $s(a$, a_),
$W = $9.body,
$6 = $9.body_node.begin,
$7 = $9.body_node.end,
$8 = $7 - $6,
$V = [],
$O = codeparse($W, $5);
for (var $N = $O.identifierArr.length; $N--;) {
var $4 = $O.identifierArr[$N],
$1 = $3[$4.name] || $H[$4.name];
if ($1) $V.push({
o: $4,
newstr: $1
});
}
for (var $N = $O.callArr.length; $N--;) {
var $2 = $O.callArr[$N],
$1 = $3[$2.name] || $H[$2.name];
if ($1) $V.push({
o: $2,
newstr: $2.str.replace($2.name, $1)
});
}
for (var $N = $O.bracketextraArr.length; $N--;) {
var $L = $O.bracketextraArr[$N];
if ($L.typebracket !== $0) continue;
$V.push({
o: {
begin: $L.begin,
end: $L.begin + $0.length
},
newstr: $w + ' = '
});
$V.push({
o: {
begin: $L.end,
end: $L.end
},
newstr: ' break;'
});
}
$V.sort(function($Z, $Y) {
var $X;
return $Z.o.begin < $Y.o.begin ? -1 : $Z.o.end > $Y.o.end ? +1 : $X.bug;
});
var $A = $W;
for (var $N = $V.length; $N--;) {
var $U = $V[$N];
$A = $A.substring(0, $U.o.begin) + $U.newstr + $A.substring($U.o.end);
}
var $R = $u.args.sepSplit,
$C = $T.map(function($S, $Q) {
return 'var ' + $S + ' = ' + ($Q < $R.length ? $R[$Q].str : $D) + ';';
});
var $B = [],
$G = {};
for (var $P = $O.bracketextraArr.length, $N = 0; $N < $P; $N++) {
var $L = $O.bracketextraArr[$N];
if ($L.typebracket !== $M) continue;
var $J = $L.vdArr;
for (var $K = $J.length, $I = 0; $I < $K; $I++) {
var $F = $J[$I];
if (!$F.rightstr && !($F.leftstr in $G)) {
$B.push($H[$F.leftstr] + ' = ' + $D);
$G[$F.leftstr] = 1;
}
}
}
var $E = /^\s*\{[\s\S]*?\}\s*$/.test($A);
var $t = ['{', '//#INLINE_BEGIN: ' + $u.str.replace(/\r\n/g, ' ')].concat(['var ' + $D + ', ' + $w + ';']).concat(['//#INLINE_SET_INPUT_ARGS:']).concat($C).concat($B.length ? ['var ' + $B.join(', ') + ';'] : []).concat(['//#INLINE_IMPLEMENT:']).concat(['do {']).concat($A).concat(['} while (false);']).concat($u.inlinetype === $z ? [] : $u.inlinetype === $y ? [$u.identifier.name + ' = ' + $w + ';'] : $u.inlinetype === $x ? ['var ' + $u.identifier.name + ' = ' + $w + ';'] : $v.bug).concat(['//#INLINE_END: ' + $u.str.replace(/\r\n/g, ' ')]).concat(['}']).join('\n');
return $t;
}
function $s($r, $q) {
var $o = {};
for (var $p = $r.length; $p--;) $o[$r[$p]] = $q[$p];
return $o;
}
function $n($m, $j) {
var $l = '_' + $m + '_',
$k = '',
$i;
while (($i = $l + $k) in $j) $k = +$k + 1;
$j[$i] = 1;
return $i;
}
function $e($g, $c, $b) {
$b || ($b = []);
for (var $h = $g.length, $f = 0; $f < $h; $f++) {
var $d = $g[$f];
if ($d.begin <= $c.begin && $c.end <= $d.end) {
$b.push($d);
$e($d.children || [], $c, $b);
break;
}
}
return $b;
}
function $a($_, $$, _2) {
var _4 = $$.call.name,
_9 = $_.concat(_2),
_1;
top_loop: for (var _8 = _9.length; _8--;) {
var _3 = _9[_8];
var _7 = _3.children || [];
for (var _6 = _7.length; _6--;) {
var _5 = _7[_6];
if (_5.lastname === _4) {
_1 = _5;
break top_loop;
}
}
if (_3.lastname === _4) {
_1 = _3;
break top_loop;
}
}
if (_1) U(_1, _2.slice(-1)[0]);
return _1;
}
function _0(X) {
var Z = X.varuseObj,
Y = X.vardeclObj;
for (var W in Z) {
if (!(W in Y)) {
var V = X;
while (V = V.parent) {
if (W in V.vardeclObj) {
throw new Error('inline error: when inlining across files, the body to inline MUST NOT use locally bound variables (closures). (It may use globals, though.)');
}
}
}
}
}
function U(N, L) {
var P = [],
T = N.varuseObj,
S = N.vardeclObj,
R = N.param_set;
for (var Q in T) {
if (!(Q in S) && !(Q in R)) {
P.push(Q);
}
}
P.forEach(O);
function O(M) {
var K = I(M, N),
J = I(M, L);
if (K !== J) throw new Error('inline error: when inlining within a file, the source body and the target inline location must share their bound variables (if the source body has any).');
}
function I(H, G) {
return G ? G.vardeclObj[H] ? G : I(H, G.parent) : null;
}
}
})(m || F || this);
}
var w = true;
function A(q) {
if (E[q]) return;
E[q] = 1;
var y;
if (/\.js$/.test(q)) y = false;
else if (/\.jsm$/.test(q)) y = true;
else throw new Error("need$: unknown type, only .js and .jsm are supported. Path: '" + q + "'");
var l = need$.read(q);
var B = "/need\\$\\s*\\(\\s*([\"\\'])([^\"\\']+)\\1/",
D = new RegExp(B, "g"),
C = new RegExp(B),
z = l.match(/need\$\s*\(\s*(["\'])([^"\']+)\1/g);
while (z && z.length) A(z.shift().match(/need\$\s*\(\s*(["\'])([^"\']+)\1/)[2]);
if (y) {
l = jsm2js(l);
if (w) l = inlineCode(l, u, {
path: q
});
}
eval.call(m, l);
}
function h(_) {
var $ = new XMLHttpRequest();
$.open("GET", _, false);
$.send();
if ($.status !== 0 && $.status !== 200) throw new Error("need$:xhrGetSync: Could not load path '" + _ + "'");
return $.responseText + "\r\n//@ sourceURL=" + _;
}
})(global || exports || this);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment