{"version":3,"file":"gp-advanced-calculations.js","mappings":"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","sources":["webpack:///./node_modules/expr-eval/dist/index.mjs","webpack:///./js/src/frontend.ts"],"sourcesContent":["var INUMBER = 'INUMBER';\nvar IOP1 = 'IOP1';\nvar IOP2 = 'IOP2';\nvar IOP3 = 'IOP3';\nvar IVAR = 'IVAR';\nvar IVARNAME = 'IVARNAME';\nvar IFUNCALL = 'IFUNCALL';\nvar IFUNDEF = 'IFUNDEF';\nvar IEXPR = 'IEXPR';\nvar IEXPREVAL = 'IEXPREVAL';\nvar IMEMBER = 'IMEMBER';\nvar IENDSTATEMENT = 'IENDSTATEMENT';\nvar IARRAY = 'IARRAY';\n\nfunction Instruction(type, value) {\n this.type = type;\n this.value = (value !== undefined && value !== null) ? value : 0;\n}\n\nInstruction.prototype.toString = function () {\n switch (this.type) {\n case INUMBER:\n case IOP1:\n case IOP2:\n case IOP3:\n case IVAR:\n case IVARNAME:\n case IENDSTATEMENT:\n return this.value;\n case IFUNCALL:\n return 'CALL ' + this.value;\n case IFUNDEF:\n return 'DEF ' + this.value;\n case IARRAY:\n return 'ARRAY ' + this.value;\n case IMEMBER:\n return '.' + this.value;\n default:\n return 'Invalid Instruction';\n }\n};\n\nfunction unaryInstruction(value) {\n return new Instruction(IOP1, value);\n}\n\nfunction binaryInstruction(value) {\n return new Instruction(IOP2, value);\n}\n\nfunction ternaryInstruction(value) {\n return new Instruction(IOP3, value);\n}\n\nfunction simplify(tokens, unaryOps, binaryOps, ternaryOps, values) {\n var nstack = [];\n var newexpression = [];\n var n1, n2, n3;\n var f;\n for (var i = 0; i < tokens.length; i++) {\n var item = tokens[i];\n var type = item.type;\n if (type === INUMBER || type === IVARNAME) {\n if (Array.isArray(item.value)) {\n nstack.push.apply(nstack, simplify(item.value.map(function (x) {\n return new Instruction(INUMBER, x);\n }).concat(new Instruction(IARRAY, item.value.length)), unaryOps, binaryOps, ternaryOps, values));\n } else {\n nstack.push(item);\n }\n } else if (type === IVAR && values.hasOwnProperty(item.value)) {\n item = new Instruction(INUMBER, values[item.value]);\n nstack.push(item);\n } else if (type === IOP2 && nstack.length > 1) {\n n2 = nstack.pop();\n n1 = nstack.pop();\n f = binaryOps[item.value];\n item = new Instruction(INUMBER, f(n1.value, n2.value));\n nstack.push(item);\n } else if (type === IOP3 && nstack.length > 2) {\n n3 = nstack.pop();\n n2 = nstack.pop();\n n1 = nstack.pop();\n if (item.value === '?') {\n nstack.push(n1.value ? n2.value : n3.value);\n } else {\n f = ternaryOps[item.value];\n item = new Instruction(INUMBER, f(n1.value, n2.value, n3.value));\n nstack.push(item);\n }\n } else if (type === IOP1 && nstack.length > 0) {\n n1 = nstack.pop();\n f = unaryOps[item.value];\n item = new Instruction(INUMBER, f(n1.value));\n nstack.push(item);\n } else if (type === IEXPR) {\n while (nstack.length > 0) {\n newexpression.push(nstack.shift());\n }\n newexpression.push(new Instruction(IEXPR, simplify(item.value, unaryOps, binaryOps, ternaryOps, values)));\n } else if (type === IMEMBER && nstack.length > 0) {\n n1 = nstack.pop();\n nstack.push(new Instruction(INUMBER, n1.value[item.value]));\n } /* else if (type === IARRAY && nstack.length >= item.value) {\n var length = item.value;\n while (length-- > 0) {\n newexpression.push(nstack.pop());\n }\n newexpression.push(new Instruction(IARRAY, item.value));\n } */ else {\n while (nstack.length > 0) {\n newexpression.push(nstack.shift());\n }\n newexpression.push(item);\n }\n }\n while (nstack.length > 0) {\n newexpression.push(nstack.shift());\n }\n return newexpression;\n}\n\nfunction substitute(tokens, variable, expr) {\n var newexpression = [];\n for (var i = 0; i < tokens.length; i++) {\n var item = tokens[i];\n var type = item.type;\n if (type === IVAR && item.value === variable) {\n for (var j = 0; j < expr.tokens.length; j++) {\n var expritem = expr.tokens[j];\n var replitem;\n if (expritem.type === IOP1) {\n replitem = unaryInstruction(expritem.value);\n } else if (expritem.type === IOP2) {\n replitem = binaryInstruction(expritem.value);\n } else if (expritem.type === IOP3) {\n replitem = ternaryInstruction(expritem.value);\n } else {\n replitem = new Instruction(expritem.type, expritem.value);\n }\n newexpression.push(replitem);\n }\n } else if (type === IEXPR) {\n newexpression.push(new Instruction(IEXPR, substitute(item.value, variable, expr)));\n } else {\n newexpression.push(item);\n }\n }\n return newexpression;\n}\n\nfunction evaluate(tokens, expr, values) {\n var nstack = [];\n var n1, n2, n3;\n var f, args, argCount;\n\n if (isExpressionEvaluator(tokens)) {\n return resolveExpression(tokens, values);\n }\n\n var numTokens = tokens.length;\n\n for (var i = 0; i < numTokens; i++) {\n var item = tokens[i];\n var type = item.type;\n if (type === INUMBER || type === IVARNAME) {\n nstack.push(item.value);\n } else if (type === IOP2) {\n n2 = nstack.pop();\n n1 = nstack.pop();\n if (item.value === 'and') {\n nstack.push(n1 ? !!evaluate(n2, expr, values) : false);\n } else if (item.value === 'or') {\n nstack.push(n1 ? true : !!evaluate(n2, expr, values));\n } else if (item.value === '=') {\n f = expr.binaryOps[item.value];\n nstack.push(f(n1, evaluate(n2, expr, values), values));\n } else {\n f = expr.binaryOps[item.value];\n nstack.push(f(resolveExpression(n1, values), resolveExpression(n2, values)));\n }\n } else if (type === IOP3) {\n n3 = nstack.pop();\n n2 = nstack.pop();\n n1 = nstack.pop();\n if (item.value === '?') {\n nstack.push(evaluate(n1 ? n2 : n3, expr, values));\n } else {\n f = expr.ternaryOps[item.value];\n nstack.push(f(resolveExpression(n1, values), resolveExpression(n2, values), resolveExpression(n3, values)));\n }\n } else if (type === IVAR) {\n if (item.value in expr.functions) {\n nstack.push(expr.functions[item.value]);\n } else if (item.value in expr.unaryOps && expr.parser.isOperatorEnabled(item.value)) {\n nstack.push(expr.unaryOps[item.value]);\n } else {\n var v = values[item.value];\n if (v !== undefined) {\n nstack.push(v);\n } else {\n throw new Error('undefined variable: ' + item.value);\n }\n }\n } else if (type === IOP1) {\n n1 = nstack.pop();\n f = expr.unaryOps[item.value];\n nstack.push(f(resolveExpression(n1, values)));\n } else if (type === IFUNCALL) {\n argCount = item.value;\n args = [];\n while (argCount-- > 0) {\n args.unshift(resolveExpression(nstack.pop(), values));\n }\n f = nstack.pop();\n if (f.apply && f.call) {\n nstack.push(f.apply(undefined, args));\n } else {\n throw new Error(f + ' is not a function');\n }\n } else if (type === IFUNDEF) {\n // Create closure to keep references to arguments and expression\n nstack.push((function () {\n var n2 = nstack.pop();\n var args = [];\n var argCount = item.value;\n while (argCount-- > 0) {\n args.unshift(nstack.pop());\n }\n var n1 = nstack.pop();\n var f = function () {\n var scope = Object.assign({}, values);\n for (var i = 0, len = args.length; i < len; i++) {\n scope[args[i]] = arguments[i];\n }\n return evaluate(n2, expr, scope);\n };\n // f.name = n1\n Object.defineProperty(f, 'name', {\n value: n1,\n writable: false\n });\n values[n1] = f;\n return f;\n })());\n } else if (type === IEXPR) {\n nstack.push(createExpressionEvaluator(item, expr));\n } else if (type === IEXPREVAL) {\n nstack.push(item);\n } else if (type === IMEMBER) {\n n1 = nstack.pop();\n nstack.push(n1[item.value]);\n } else if (type === IENDSTATEMENT) {\n nstack.pop();\n } else if (type === IARRAY) {\n argCount = item.value;\n args = [];\n while (argCount-- > 0) {\n args.unshift(nstack.pop());\n }\n nstack.push(args);\n } else {\n throw new Error('invalid Expression');\n }\n }\n if (nstack.length > 1) {\n throw new Error('invalid Expression (parity)');\n }\n // Explicitly return zero to avoid test issues caused by -0\n return nstack[0] === 0 ? 0 : resolveExpression(nstack[0], values);\n}\n\nfunction createExpressionEvaluator(token, expr, values) {\n if (isExpressionEvaluator(token)) return token;\n return {\n type: IEXPREVAL,\n value: function (scope) {\n return evaluate(token.value, expr, scope);\n }\n };\n}\n\nfunction isExpressionEvaluator(n) {\n return n && n.type === IEXPREVAL;\n}\n\nfunction resolveExpression(n, values) {\n return isExpressionEvaluator(n) ? n.value(values) : n;\n}\n\nfunction expressionToString(tokens, toJS) {\n var nstack = [];\n var n1, n2, n3;\n var f, args, argCount;\n for (var i = 0; i < tokens.length; i++) {\n var item = tokens[i];\n var type = item.type;\n if (type === INUMBER) {\n if (typeof item.value === 'number' && item.value < 0) {\n nstack.push('(' + item.value + ')');\n } else if (Array.isArray(item.value)) {\n nstack.push('[' + item.value.map(escapeValue).join(', ') + ']');\n } else {\n nstack.push(escapeValue(item.value));\n }\n } else if (type === IOP2) {\n n2 = nstack.pop();\n n1 = nstack.pop();\n f = item.value;\n if (toJS) {\n if (f === '^') {\n nstack.push('Math.pow(' + n1 + ', ' + n2 + ')');\n } else if (f === 'and') {\n nstack.push('(!!' + n1 + ' && !!' + n2 + ')');\n } else if (f === 'or') {\n nstack.push('(!!' + n1 + ' || !!' + n2 + ')');\n } else if (f === '||') {\n nstack.push('(function(a,b){ return Array.isArray(a) && Array.isArray(b) ? a.concat(b) : String(a) + String(b); }((' + n1 + '),(' + n2 + ')))');\n } else if (f === '==') {\n nstack.push('(' + n1 + ' === ' + n2 + ')');\n } else if (f === '!=') {\n nstack.push('(' + n1 + ' !== ' + n2 + ')');\n } else if (f === '[') {\n nstack.push(n1 + '[(' + n2 + ') | 0]');\n } else {\n nstack.push('(' + n1 + ' ' + f + ' ' + n2 + ')');\n }\n } else {\n if (f === '[') {\n nstack.push(n1 + '[' + n2 + ']');\n } else {\n nstack.push('(' + n1 + ' ' + f + ' ' + n2 + ')');\n }\n }\n } else if (type === IOP3) {\n n3 = nstack.pop();\n n2 = nstack.pop();\n n1 = nstack.pop();\n f = item.value;\n if (f === '?') {\n nstack.push('(' + n1 + ' ? ' + n2 + ' : ' + n3 + ')');\n } else {\n throw new Error('invalid Expression');\n }\n } else if (type === IVAR || type === IVARNAME) {\n nstack.push(item.value);\n } else if (type === IOP1) {\n n1 = nstack.pop();\n f = item.value;\n if (f === '-' || f === '+') {\n nstack.push('(' + f + n1 + ')');\n } else if (toJS) {\n if (f === 'not') {\n nstack.push('(' + '!' + n1 + ')');\n } else if (f === '!') {\n nstack.push('fac(' + n1 + ')');\n } else {\n nstack.push(f + '(' + n1 + ')');\n }\n } else if (f === '!') {\n nstack.push('(' + n1 + '!)');\n } else {\n nstack.push('(' + f + ' ' + n1 + ')');\n }\n } else if (type === IFUNCALL) {\n argCount = item.value;\n args = [];\n while (argCount-- > 0) {\n args.unshift(nstack.pop());\n }\n f = nstack.pop();\n nstack.push(f + '(' + args.join(', ') + ')');\n } else if (type === IFUNDEF) {\n n2 = nstack.pop();\n argCount = item.value;\n args = [];\n while (argCount-- > 0) {\n args.unshift(nstack.pop());\n }\n n1 = nstack.pop();\n if (toJS) {\n nstack.push('(' + n1 + ' = function(' + args.join(', ') + ') { return ' + n2 + ' })');\n } else {\n nstack.push('(' + n1 + '(' + args.join(', ') + ') = ' + n2 + ')');\n }\n } else if (type === IMEMBER) {\n n1 = nstack.pop();\n nstack.push(n1 + '.' + item.value);\n } else if (type === IARRAY) {\n argCount = item.value;\n args = [];\n while (argCount-- > 0) {\n args.unshift(nstack.pop());\n }\n nstack.push('[' + args.join(', ') + ']');\n } else if (type === IEXPR) {\n nstack.push('(' + expressionToString(item.value, toJS) + ')');\n } else if (type === IENDSTATEMENT) ; else {\n throw new Error('invalid Expression');\n }\n }\n if (nstack.length > 1) {\n if (toJS) {\n nstack = [ nstack.join(',') ];\n } else {\n nstack = [ nstack.join(';') ];\n }\n }\n return String(nstack[0]);\n}\n\nfunction escapeValue(v) {\n if (typeof v === 'string') {\n return JSON.stringify(v).replace(/\\u2028/g, '\\\\u2028').replace(/\\u2029/g, '\\\\u2029');\n }\n return v;\n}\n\nfunction contains(array, obj) {\n for (var i = 0; i < array.length; i++) {\n if (array[i] === obj) {\n return true;\n }\n }\n return false;\n}\n\nfunction getSymbols(tokens, symbols, options) {\n options = options || {};\n var withMembers = !!options.withMembers;\n var prevVar = null;\n\n for (var i = 0; i < tokens.length; i++) {\n var item = tokens[i];\n if (item.type === IVAR || item.type === IVARNAME) {\n if (!withMembers && !contains(symbols, item.value)) {\n symbols.push(item.value);\n } else if (prevVar !== null) {\n if (!contains(symbols, prevVar)) {\n symbols.push(prevVar);\n }\n prevVar = item.value;\n } else {\n prevVar = item.value;\n }\n } else if (item.type === IMEMBER && withMembers && prevVar !== null) {\n prevVar += '.' + item.value;\n } else if (item.type === IEXPR) {\n getSymbols(item.value, symbols, options);\n } else if (prevVar !== null) {\n if (!contains(symbols, prevVar)) {\n symbols.push(prevVar);\n }\n prevVar = null;\n }\n }\n\n if (prevVar !== null && !contains(symbols, prevVar)) {\n symbols.push(prevVar);\n }\n}\n\nfunction Expression(tokens, parser) {\n this.tokens = tokens;\n this.parser = parser;\n this.unaryOps = parser.unaryOps;\n this.binaryOps = parser.binaryOps;\n this.ternaryOps = parser.ternaryOps;\n this.functions = parser.functions;\n}\n\nExpression.prototype.simplify = function (values) {\n values = values || {};\n return new Expression(simplify(this.tokens, this.unaryOps, this.binaryOps, this.ternaryOps, values), this.parser);\n};\n\nExpression.prototype.substitute = function (variable, expr) {\n if (!(expr instanceof Expression)) {\n expr = this.parser.parse(String(expr));\n }\n\n return new Expression(substitute(this.tokens, variable, expr), this.parser);\n};\n\nExpression.prototype.evaluate = function (values) {\n values = values || {};\n return evaluate(this.tokens, this, values);\n};\n\nExpression.prototype.toString = function () {\n return expressionToString(this.tokens, false);\n};\n\nExpression.prototype.symbols = function (options) {\n options = options || {};\n var vars = [];\n getSymbols(this.tokens, vars, options);\n return vars;\n};\n\nExpression.prototype.variables = function (options) {\n options = options || {};\n var vars = [];\n getSymbols(this.tokens, vars, options);\n var functions = this.functions;\n return vars.filter(function (name) {\n return !(name in functions);\n });\n};\n\nExpression.prototype.toJSFunction = function (param, variables) {\n var expr = this;\n var f = new Function(param, 'with(this.functions) with (this.ternaryOps) with (this.binaryOps) with (this.unaryOps) { return ' + expressionToString(this.simplify(variables).tokens, true) + '; }'); // eslint-disable-line no-new-func\n return function () {\n return f.apply(expr, arguments);\n };\n};\n\nvar TEOF = 'TEOF';\nvar TOP = 'TOP';\nvar TNUMBER = 'TNUMBER';\nvar TSTRING = 'TSTRING';\nvar TPAREN = 'TPAREN';\nvar TBRACKET = 'TBRACKET';\nvar TCOMMA = 'TCOMMA';\nvar TNAME = 'TNAME';\nvar TSEMICOLON = 'TSEMICOLON';\n\nfunction Token(type, value, index) {\n this.type = type;\n this.value = value;\n this.index = index;\n}\n\nToken.prototype.toString = function () {\n return this.type + ': ' + this.value;\n};\n\nfunction TokenStream(parser, expression) {\n this.pos = 0;\n this.current = null;\n this.unaryOps = parser.unaryOps;\n this.binaryOps = parser.binaryOps;\n this.ternaryOps = parser.ternaryOps;\n this.consts = parser.consts;\n this.expression = expression;\n this.savedPosition = 0;\n this.savedCurrent = null;\n this.options = parser.options;\n this.parser = parser;\n}\n\nTokenStream.prototype.newToken = function (type, value, pos) {\n return new Token(type, value, pos != null ? pos : this.pos);\n};\n\nTokenStream.prototype.save = function () {\n this.savedPosition = this.pos;\n this.savedCurrent = this.current;\n};\n\nTokenStream.prototype.restore = function () {\n this.pos = this.savedPosition;\n this.current = this.savedCurrent;\n};\n\nTokenStream.prototype.next = function () {\n if (this.pos >= this.expression.length) {\n return this.newToken(TEOF, 'EOF');\n }\n\n if (this.isWhitespace() || this.isComment()) {\n return this.next();\n } else if (this.isRadixInteger() ||\n this.isNumber() ||\n this.isOperator() ||\n this.isString() ||\n this.isParen() ||\n this.isBracket() ||\n this.isComma() ||\n this.isSemicolon() ||\n this.isNamedOp() ||\n this.isConst() ||\n this.isName()) {\n return this.current;\n } else {\n this.parseError('Unknown character \"' + this.expression.charAt(this.pos) + '\"');\n }\n};\n\nTokenStream.prototype.isString = function () {\n var r = false;\n var startPos = this.pos;\n var quote = this.expression.charAt(startPos);\n\n if (quote === '\\'' || quote === '\"') {\n var index = this.expression.indexOf(quote, startPos + 1);\n while (index >= 0 && this.pos < this.expression.length) {\n this.pos = index + 1;\n if (this.expression.charAt(index - 1) !== '\\\\') {\n var rawString = this.expression.substring(startPos + 1, index);\n this.current = this.newToken(TSTRING, this.unescape(rawString), startPos);\n r = true;\n break;\n }\n index = this.expression.indexOf(quote, index + 1);\n }\n }\n return r;\n};\n\nTokenStream.prototype.isParen = function () {\n var c = this.expression.charAt(this.pos);\n if (c === '(' || c === ')') {\n this.current = this.newToken(TPAREN, c);\n this.pos++;\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isBracket = function () {\n var c = this.expression.charAt(this.pos);\n if ((c === '[' || c === ']') && this.isOperatorEnabled('[')) {\n this.current = this.newToken(TBRACKET, c);\n this.pos++;\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isComma = function () {\n var c = this.expression.charAt(this.pos);\n if (c === ',') {\n this.current = this.newToken(TCOMMA, ',');\n this.pos++;\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isSemicolon = function () {\n var c = this.expression.charAt(this.pos);\n if (c === ';') {\n this.current = this.newToken(TSEMICOLON, ';');\n this.pos++;\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isConst = function () {\n var startPos = this.pos;\n var i = startPos;\n for (; i < this.expression.length; i++) {\n var c = this.expression.charAt(i);\n if (c.toUpperCase() === c.toLowerCase()) {\n if (i === this.pos || (c !== '_' && c !== '.' && (c < '0' || c > '9'))) {\n break;\n }\n }\n }\n if (i > startPos) {\n var str = this.expression.substring(startPos, i);\n if (str in this.consts) {\n this.current = this.newToken(TNUMBER, this.consts[str]);\n this.pos += str.length;\n return true;\n }\n }\n return false;\n};\n\nTokenStream.prototype.isNamedOp = function () {\n var startPos = this.pos;\n var i = startPos;\n for (; i < this.expression.length; i++) {\n var c = this.expression.charAt(i);\n if (c.toUpperCase() === c.toLowerCase()) {\n if (i === this.pos || (c !== '_' && (c < '0' || c > '9'))) {\n break;\n }\n }\n }\n if (i > startPos) {\n var str = this.expression.substring(startPos, i);\n if (this.isOperatorEnabled(str) && (str in this.binaryOps || str in this.unaryOps || str in this.ternaryOps)) {\n this.current = this.newToken(TOP, str);\n this.pos += str.length;\n return true;\n }\n }\n return false;\n};\n\nTokenStream.prototype.isName = function () {\n var startPos = this.pos;\n var i = startPos;\n var hasLetter = false;\n for (; i < this.expression.length; i++) {\n var c = this.expression.charAt(i);\n if (c.toUpperCase() === c.toLowerCase()) {\n if (i === this.pos && (c === '$' || c === '_')) {\n if (c === '_') {\n hasLetter = true;\n }\n continue;\n } else if (i === this.pos || !hasLetter || (c !== '_' && (c < '0' || c > '9'))) {\n break;\n }\n } else {\n hasLetter = true;\n }\n }\n if (hasLetter) {\n var str = this.expression.substring(startPos, i);\n this.current = this.newToken(TNAME, str);\n this.pos += str.length;\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isWhitespace = function () {\n var r = false;\n var c = this.expression.charAt(this.pos);\n while (c === ' ' || c === '\\t' || c === '\\n' || c === '\\r') {\n r = true;\n this.pos++;\n if (this.pos >= this.expression.length) {\n break;\n }\n c = this.expression.charAt(this.pos);\n }\n return r;\n};\n\nvar codePointPattern = /^[0-9a-f]{4}$/i;\n\nTokenStream.prototype.unescape = function (v) {\n var index = v.indexOf('\\\\');\n if (index < 0) {\n return v;\n }\n\n var buffer = v.substring(0, index);\n while (index >= 0) {\n var c = v.charAt(++index);\n switch (c) {\n case '\\'':\n buffer += '\\'';\n break;\n case '\"':\n buffer += '\"';\n break;\n case '\\\\':\n buffer += '\\\\';\n break;\n case '/':\n buffer += '/';\n break;\n case 'b':\n buffer += '\\b';\n break;\n case 'f':\n buffer += '\\f';\n break;\n case 'n':\n buffer += '\\n';\n break;\n case 'r':\n buffer += '\\r';\n break;\n case 't':\n buffer += '\\t';\n break;\n case 'u':\n // interpret the following 4 characters as the hex of the unicode code point\n var codePoint = v.substring(index + 1, index + 5);\n if (!codePointPattern.test(codePoint)) {\n this.parseError('Illegal escape sequence: \\\\u' + codePoint);\n }\n buffer += String.fromCharCode(parseInt(codePoint, 16));\n index += 4;\n break;\n default:\n throw this.parseError('Illegal escape sequence: \"\\\\' + c + '\"');\n }\n ++index;\n var backslash = v.indexOf('\\\\', index);\n buffer += v.substring(index, backslash < 0 ? v.length : backslash);\n index = backslash;\n }\n\n return buffer;\n};\n\nTokenStream.prototype.isComment = function () {\n var c = this.expression.charAt(this.pos);\n if (c === '/' && this.expression.charAt(this.pos + 1) === '*') {\n this.pos = this.expression.indexOf('*/', this.pos) + 2;\n if (this.pos === 1) {\n this.pos = this.expression.length;\n }\n return true;\n }\n return false;\n};\n\nTokenStream.prototype.isRadixInteger = function () {\n var pos = this.pos;\n\n if (pos >= this.expression.length - 2 || this.expression.charAt(pos) !== '0') {\n return false;\n }\n ++pos;\n\n var radix;\n var validDigit;\n if (this.expression.charAt(pos) === 'x') {\n radix = 16;\n validDigit = /^[0-9a-f]$/i;\n ++pos;\n } else if (this.expression.charAt(pos) === 'b') {\n radix = 2;\n validDigit = /^[01]$/i;\n ++pos;\n } else {\n return false;\n }\n\n var valid = false;\n var startPos = pos;\n\n while (pos < this.expression.length) {\n var c = this.expression.charAt(pos);\n if (validDigit.test(c)) {\n pos++;\n valid = true;\n } else {\n break;\n }\n }\n\n if (valid) {\n this.current = this.newToken(TNUMBER, parseInt(this.expression.substring(startPos, pos), radix));\n this.pos = pos;\n }\n return valid;\n};\n\nTokenStream.prototype.isNumber = function () {\n var valid = false;\n var pos = this.pos;\n var startPos = pos;\n var resetPos = pos;\n var foundDot = false;\n var foundDigits = false;\n var c;\n\n while (pos < this.expression.length) {\n c = this.expression.charAt(pos);\n if ((c >= '0' && c <= '9') || (!foundDot && c === '.')) {\n if (c === '.') {\n foundDot = true;\n } else {\n foundDigits = true;\n }\n pos++;\n valid = foundDigits;\n } else {\n break;\n }\n }\n\n if (valid) {\n resetPos = pos;\n }\n\n if (c === 'e' || c === 'E') {\n pos++;\n var acceptSign = true;\n var validExponent = false;\n while (pos < this.expression.length) {\n c = this.expression.charAt(pos);\n if (acceptSign && (c === '+' || c === '-')) {\n acceptSign = false;\n } else if (c >= '0' && c <= '9') {\n validExponent = true;\n acceptSign = false;\n } else {\n break;\n }\n pos++;\n }\n\n if (!validExponent) {\n pos = resetPos;\n }\n }\n\n if (valid) {\n this.current = this.newToken(TNUMBER, parseFloat(this.expression.substring(startPos, pos)));\n this.pos = pos;\n } else {\n this.pos = resetPos;\n }\n return valid;\n};\n\nTokenStream.prototype.isOperator = function () {\n var startPos = this.pos;\n var c = this.expression.charAt(this.pos);\n\n if (c === '+' || c === '-' || c === '*' || c === '/' || c === '%' || c === '^' || c === '?' || c === ':' || c === '.') {\n this.current = this.newToken(TOP, c);\n } else if (c === '∙' || c === '•') {\n this.current = this.newToken(TOP, '*');\n } else if (c === '>') {\n if (this.expression.charAt(this.pos + 1) === '=') {\n this.current = this.newToken(TOP, '>=');\n this.pos++;\n } else {\n this.current = this.newToken(TOP, '>');\n }\n } else if (c === '<') {\n if (this.expression.charAt(this.pos + 1) === '=') {\n this.current = this.newToken(TOP, '<=');\n this.pos++;\n } else {\n this.current = this.newToken(TOP, '<');\n }\n } else if (c === '|') {\n if (this.expression.charAt(this.pos + 1) === '|') {\n this.current = this.newToken(TOP, '||');\n this.pos++;\n } else {\n return false;\n }\n } else if (c === '=') {\n if (this.expression.charAt(this.pos + 1) === '=') {\n this.current = this.newToken(TOP, '==');\n this.pos++;\n } else {\n this.current = this.newToken(TOP, c);\n }\n } else if (c === '!') {\n if (this.expression.charAt(this.pos + 1) === '=') {\n this.current = this.newToken(TOP, '!=');\n this.pos++;\n } else {\n this.current = this.newToken(TOP, c);\n }\n } else {\n return false;\n }\n this.pos++;\n\n if (this.isOperatorEnabled(this.current.value)) {\n return true;\n } else {\n this.pos = startPos;\n return false;\n }\n};\n\nTokenStream.prototype.isOperatorEnabled = function (op) {\n return this.parser.isOperatorEnabled(op);\n};\n\nTokenStream.prototype.getCoordinates = function () {\n var line = 0;\n var column;\n var newline = -1;\n do {\n line++;\n column = this.pos - newline;\n newline = this.expression.indexOf('\\n', newline + 1);\n } while (newline >= 0 && newline < this.pos);\n\n return {\n line: line,\n column: column\n };\n};\n\nTokenStream.prototype.parseError = function (msg) {\n var coords = this.getCoordinates();\n throw new Error('parse error [' + coords.line + ':' + coords.column + ']: ' + msg);\n};\n\nfunction ParserState(parser, tokenStream, options) {\n this.parser = parser;\n this.tokens = tokenStream;\n this.current = null;\n this.nextToken = null;\n this.next();\n this.savedCurrent = null;\n this.savedNextToken = null;\n this.allowMemberAccess = options.allowMemberAccess !== false;\n}\n\nParserState.prototype.next = function () {\n this.current = this.nextToken;\n return (this.nextToken = this.tokens.next());\n};\n\nParserState.prototype.tokenMatches = function (token, value) {\n if (typeof value === 'undefined') {\n return true;\n } else if (Array.isArray(value)) {\n return contains(value, token.value);\n } else if (typeof value === 'function') {\n return value(token);\n } else {\n return token.value === value;\n }\n};\n\nParserState.prototype.save = function () {\n this.savedCurrent = this.current;\n this.savedNextToken = this.nextToken;\n this.tokens.save();\n};\n\nParserState.prototype.restore = function () {\n this.tokens.restore();\n this.current = this.savedCurrent;\n this.nextToken = this.savedNextToken;\n};\n\nParserState.prototype.accept = function (type, value) {\n if (this.nextToken.type === type && this.tokenMatches(this.nextToken, value)) {\n this.next();\n return true;\n }\n return false;\n};\n\nParserState.prototype.expect = function (type, value) {\n if (!this.accept(type, value)) {\n var coords = this.tokens.getCoordinates();\n throw new Error('parse error [' + coords.line + ':' + coords.column + ']: Expected ' + (value || type));\n }\n};\n\nParserState.prototype.parseAtom = function (instr) {\n var unaryOps = this.tokens.unaryOps;\n function isPrefixOperator(token) {\n return token.value in unaryOps;\n }\n\n if (this.accept(TNAME) || this.accept(TOP, isPrefixOperator)) {\n instr.push(new Instruction(IVAR, this.current.value));\n } else if (this.accept(TNUMBER)) {\n instr.push(new Instruction(INUMBER, this.current.value));\n } else if (this.accept(TSTRING)) {\n instr.push(new Instruction(INUMBER, this.current.value));\n } else if (this.accept(TPAREN, '(')) {\n this.parseExpression(instr);\n this.expect(TPAREN, ')');\n } else if (this.accept(TBRACKET, '[')) {\n if (this.accept(TBRACKET, ']')) {\n instr.push(new Instruction(IARRAY, 0));\n } else {\n var argCount = this.parseArrayList(instr);\n instr.push(new Instruction(IARRAY, argCount));\n }\n } else {\n throw new Error('unexpected ' + this.nextToken);\n }\n};\n\nParserState.prototype.parseExpression = function (instr) {\n var exprInstr = [];\n if (this.parseUntilEndStatement(instr, exprInstr)) {\n return;\n }\n this.parseVariableAssignmentExpression(exprInstr);\n if (this.parseUntilEndStatement(instr, exprInstr)) {\n return;\n }\n this.pushExpression(instr, exprInstr);\n};\n\nParserState.prototype.pushExpression = function (instr, exprInstr) {\n for (var i = 0, len = exprInstr.length; i < len; i++) {\n instr.push(exprInstr[i]);\n }\n};\n\nParserState.prototype.parseUntilEndStatement = function (instr, exprInstr) {\n if (!this.accept(TSEMICOLON)) return false;\n if (this.nextToken && this.nextToken.type !== TEOF && !(this.nextToken.type === TPAREN && this.nextToken.value === ')')) {\n exprInstr.push(new Instruction(IENDSTATEMENT));\n }\n if (this.nextToken.type !== TEOF) {\n this.parseExpression(exprInstr);\n }\n instr.push(new Instruction(IEXPR, exprInstr));\n return true;\n};\n\nParserState.prototype.parseArrayList = function (instr) {\n var argCount = 0;\n\n while (!this.accept(TBRACKET, ']')) {\n this.parseExpression(instr);\n ++argCount;\n while (this.accept(TCOMMA)) {\n this.parseExpression(instr);\n ++argCount;\n }\n }\n\n return argCount;\n};\n\nParserState.prototype.parseVariableAssignmentExpression = function (instr) {\n this.parseConditionalExpression(instr);\n while (this.accept(TOP, '=')) {\n var varName = instr.pop();\n var varValue = [];\n var lastInstrIndex = instr.length - 1;\n if (varName.type === IFUNCALL) {\n if (!this.tokens.isOperatorEnabled('()=')) {\n throw new Error('function definition is not permitted');\n }\n for (var i = 0, len = varName.value + 1; i < len; i++) {\n var index = lastInstrIndex - i;\n if (instr[index].type === IVAR) {\n instr[index] = new Instruction(IVARNAME, instr[index].value);\n }\n }\n this.parseVariableAssignmentExpression(varValue);\n instr.push(new Instruction(IEXPR, varValue));\n instr.push(new Instruction(IFUNDEF, varName.value));\n continue;\n }\n if (varName.type !== IVAR && varName.type !== IMEMBER) {\n throw new Error('expected variable for assignment');\n }\n this.parseVariableAssignmentExpression(varValue);\n instr.push(new Instruction(IVARNAME, varName.value));\n instr.push(new Instruction(IEXPR, varValue));\n instr.push(binaryInstruction('='));\n }\n};\n\nParserState.prototype.parseConditionalExpression = function (instr) {\n this.parseOrExpression(instr);\n while (this.accept(TOP, '?')) {\n var trueBranch = [];\n var falseBranch = [];\n this.parseConditionalExpression(trueBranch);\n this.expect(TOP, ':');\n this.parseConditionalExpression(falseBranch);\n instr.push(new Instruction(IEXPR, trueBranch));\n instr.push(new Instruction(IEXPR, falseBranch));\n instr.push(ternaryInstruction('?'));\n }\n};\n\nParserState.prototype.parseOrExpression = function (instr) {\n this.parseAndExpression(instr);\n while (this.accept(TOP, 'or')) {\n var falseBranch = [];\n this.parseAndExpression(falseBranch);\n instr.push(new Instruction(IEXPR, falseBranch));\n instr.push(binaryInstruction('or'));\n }\n};\n\nParserState.prototype.parseAndExpression = function (instr) {\n this.parseComparison(instr);\n while (this.accept(TOP, 'and')) {\n var trueBranch = [];\n this.parseComparison(trueBranch);\n instr.push(new Instruction(IEXPR, trueBranch));\n instr.push(binaryInstruction('and'));\n }\n};\n\nvar COMPARISON_OPERATORS = ['==', '!=', '<', '<=', '>=', '>', 'in'];\n\nParserState.prototype.parseComparison = function (instr) {\n this.parseAddSub(instr);\n while (this.accept(TOP, COMPARISON_OPERATORS)) {\n var op = this.current;\n this.parseAddSub(instr);\n instr.push(binaryInstruction(op.value));\n }\n};\n\nvar ADD_SUB_OPERATORS = ['+', '-', '||'];\n\nParserState.prototype.parseAddSub = function (instr) {\n this.parseTerm(instr);\n while (this.accept(TOP, ADD_SUB_OPERATORS)) {\n var op = this.current;\n this.parseTerm(instr);\n instr.push(binaryInstruction(op.value));\n }\n};\n\nvar TERM_OPERATORS = ['*', '/', '%'];\n\nParserState.prototype.parseTerm = function (instr) {\n this.parseFactor(instr);\n while (this.accept(TOP, TERM_OPERATORS)) {\n var op = this.current;\n this.parseFactor(instr);\n instr.push(binaryInstruction(op.value));\n }\n};\n\nParserState.prototype.parseFactor = function (instr) {\n var unaryOps = this.tokens.unaryOps;\n function isPrefixOperator(token) {\n return token.value in unaryOps;\n }\n\n this.save();\n if (this.accept(TOP, isPrefixOperator)) {\n if (this.current.value !== '-' && this.current.value !== '+') {\n if (this.nextToken.type === TPAREN && this.nextToken.value === '(') {\n this.restore();\n this.parseExponential(instr);\n return;\n } else if (this.nextToken.type === TSEMICOLON || this.nextToken.type === TCOMMA || this.nextToken.type === TEOF || (this.nextToken.type === TPAREN && this.nextToken.value === ')')) {\n this.restore();\n this.parseAtom(instr);\n return;\n }\n }\n\n var op = this.current;\n this.parseFactor(instr);\n instr.push(unaryInstruction(op.value));\n } else {\n this.parseExponential(instr);\n }\n};\n\nParserState.prototype.parseExponential = function (instr) {\n this.parsePostfixExpression(instr);\n while (this.accept(TOP, '^')) {\n this.parseFactor(instr);\n instr.push(binaryInstruction('^'));\n }\n};\n\nParserState.prototype.parsePostfixExpression = function (instr) {\n this.parseFunctionCall(instr);\n while (this.accept(TOP, '!')) {\n instr.push(unaryInstruction('!'));\n }\n};\n\nParserState.prototype.parseFunctionCall = function (instr) {\n var unaryOps = this.tokens.unaryOps;\n function isPrefixOperator(token) {\n return token.value in unaryOps;\n }\n\n if (this.accept(TOP, isPrefixOperator)) {\n var op = this.current;\n this.parseAtom(instr);\n instr.push(unaryInstruction(op.value));\n } else {\n this.parseMemberExpression(instr);\n while (this.accept(TPAREN, '(')) {\n if (this.accept(TPAREN, ')')) {\n instr.push(new Instruction(IFUNCALL, 0));\n } else {\n var argCount = this.parseArgumentList(instr);\n instr.push(new Instruction(IFUNCALL, argCount));\n }\n }\n }\n};\n\nParserState.prototype.parseArgumentList = function (instr) {\n var argCount = 0;\n\n while (!this.accept(TPAREN, ')')) {\n this.parseExpression(instr);\n ++argCount;\n while (this.accept(TCOMMA)) {\n this.parseExpression(instr);\n ++argCount;\n }\n }\n\n return argCount;\n};\n\nParserState.prototype.parseMemberExpression = function (instr) {\n this.parseAtom(instr);\n while (this.accept(TOP, '.') || this.accept(TBRACKET, '[')) {\n var op = this.current;\n\n if (op.value === '.') {\n if (!this.allowMemberAccess) {\n throw new Error('unexpected \".\", member access is not permitted');\n }\n\n this.expect(TNAME);\n instr.push(new Instruction(IMEMBER, this.current.value));\n } else if (op.value === '[') {\n if (!this.tokens.isOperatorEnabled('[')) {\n throw new Error('unexpected \"[]\", arrays are disabled');\n }\n\n this.parseExpression(instr);\n this.expect(TBRACKET, ']');\n instr.push(binaryInstruction('['));\n } else {\n throw new Error('unexpected symbol: ' + op.value);\n }\n }\n};\n\nfunction add(a, b) {\n return Number(a) + Number(b);\n}\n\nfunction sub(a, b) {\n return a - b;\n}\n\nfunction mul(a, b) {\n return a * b;\n}\n\nfunction div(a, b) {\n return a / b;\n}\n\nfunction mod(a, b) {\n return a % b;\n}\n\nfunction concat(a, b) {\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.concat(b);\n }\n return '' + a + b;\n}\n\nfunction equal(a, b) {\n return a === b;\n}\n\nfunction notEqual(a, b) {\n return a !== b;\n}\n\nfunction greaterThan(a, b) {\n return a > b;\n}\n\nfunction lessThan(a, b) {\n return a < b;\n}\n\nfunction greaterThanEqual(a, b) {\n return a >= b;\n}\n\nfunction lessThanEqual(a, b) {\n return a <= b;\n}\n\nfunction andOperator(a, b) {\n return Boolean(a && b);\n}\n\nfunction orOperator(a, b) {\n return Boolean(a || b);\n}\n\nfunction inOperator(a, b) {\n return contains(b, a);\n}\n\nfunction sinh(a) {\n return ((Math.exp(a) - Math.exp(-a)) / 2);\n}\n\nfunction cosh(a) {\n return ((Math.exp(a) + Math.exp(-a)) / 2);\n}\n\nfunction tanh(a) {\n if (a === Infinity) return 1;\n if (a === -Infinity) return -1;\n return (Math.exp(a) - Math.exp(-a)) / (Math.exp(a) + Math.exp(-a));\n}\n\nfunction asinh(a) {\n if (a === -Infinity) return a;\n return Math.log(a + Math.sqrt((a * a) + 1));\n}\n\nfunction acosh(a) {\n return Math.log(a + Math.sqrt((a * a) - 1));\n}\n\nfunction atanh(a) {\n return (Math.log((1 + a) / (1 - a)) / 2);\n}\n\nfunction log10(a) {\n return Math.log(a) * Math.LOG10E;\n}\n\nfunction neg(a) {\n return -a;\n}\n\nfunction not(a) {\n return !a;\n}\n\nfunction trunc(a) {\n return a < 0 ? Math.ceil(a) : Math.floor(a);\n}\n\nfunction random(a) {\n return Math.random() * (a || 1);\n}\n\nfunction factorial(a) { // a!\n return gamma(a + 1);\n}\n\nfunction isInteger(value) {\n return isFinite(value) && (value === Math.round(value));\n}\n\nvar GAMMA_G = 4.7421875;\nvar GAMMA_P = [\n 0.99999999999999709182,\n 57.156235665862923517, -59.597960355475491248,\n 14.136097974741747174, -0.49191381609762019978,\n 0.33994649984811888699e-4,\n 0.46523628927048575665e-4, -0.98374475304879564677e-4,\n 0.15808870322491248884e-3, -0.21026444172410488319e-3,\n 0.21743961811521264320e-3, -0.16431810653676389022e-3,\n 0.84418223983852743293e-4, -0.26190838401581408670e-4,\n 0.36899182659531622704e-5\n];\n\n// Gamma function from math.js\nfunction gamma(n) {\n var t, x;\n\n if (isInteger(n)) {\n if (n <= 0) {\n return isFinite(n) ? Infinity : NaN;\n }\n\n if (n > 171) {\n return Infinity; // Will overflow\n }\n\n var value = n - 2;\n var res = n - 1;\n while (value > 1) {\n res *= value;\n value--;\n }\n\n if (res === 0) {\n res = 1; // 0! is per definition 1\n }\n\n return res;\n }\n\n if (n < 0.5) {\n return Math.PI / (Math.sin(Math.PI * n) * gamma(1 - n));\n }\n\n if (n >= 171.35) {\n return Infinity; // will overflow\n }\n\n if (n > 85.0) { // Extended Stirling Approx\n var twoN = n * n;\n var threeN = twoN * n;\n var fourN = threeN * n;\n var fiveN = fourN * n;\n return Math.sqrt(2 * Math.PI / n) * Math.pow((n / Math.E), n) *\n (1 + (1 / (12 * n)) + (1 / (288 * twoN)) - (139 / (51840 * threeN)) -\n (571 / (2488320 * fourN)) + (163879 / (209018880 * fiveN)) +\n (5246819 / (75246796800 * fiveN * n)));\n }\n\n --n;\n x = GAMMA_P[0];\n for (var i = 1; i < GAMMA_P.length; ++i) {\n x += GAMMA_P[i] / (n + i);\n }\n\n t = n + GAMMA_G + 0.5;\n return Math.sqrt(2 * Math.PI) * Math.pow(t, n + 0.5) * Math.exp(-t) * x;\n}\n\nfunction stringOrArrayLength(s) {\n if (Array.isArray(s)) {\n return s.length;\n }\n return String(s).length;\n}\n\nfunction hypot() {\n var sum = 0;\n var larg = 0;\n for (var i = 0; i < arguments.length; i++) {\n var arg = Math.abs(arguments[i]);\n var div;\n if (larg < arg) {\n div = larg / arg;\n sum = (sum * div * div) + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else {\n sum += arg;\n }\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n}\n\nfunction condition(cond, yep, nope) {\n return cond ? yep : nope;\n}\n\n/**\n* Decimal adjustment of a number.\n* From @escopecz.\n*\n* @param {Number} value The number.\n* @param {Integer} exp The exponent (the 10 logarithm of the adjustment base).\n* @return {Number} The adjusted value.\n*/\nfunction roundTo(value, exp) {\n // If the exp is undefined or zero...\n if (typeof exp === 'undefined' || +exp === 0) {\n return Math.round(value);\n }\n value = +value;\n exp = -(+exp);\n // If the value is not a number or the exp is not an integer...\n if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) {\n return NaN;\n }\n // Shift\n value = value.toString().split('e');\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp)));\n // Shift back\n value = value.toString().split('e');\n return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp));\n}\n\nfunction setVar(name, value, variables) {\n if (variables) variables[name] = value;\n return value;\n}\n\nfunction arrayIndex(array, index) {\n return array[index | 0];\n}\n\nfunction max(array) {\n if (arguments.length === 1 && Array.isArray(array)) {\n return Math.max.apply(Math, array);\n } else {\n return Math.max.apply(Math, arguments);\n }\n}\n\nfunction min(array) {\n if (arguments.length === 1 && Array.isArray(array)) {\n return Math.min.apply(Math, array);\n } else {\n return Math.min.apply(Math, arguments);\n }\n}\n\nfunction arrayMap(f, a) {\n if (typeof f !== 'function') {\n throw new Error('First argument to map is not a function');\n }\n if (!Array.isArray(a)) {\n throw new Error('Second argument to map is not an array');\n }\n return a.map(function (x, i) {\n return f(x, i);\n });\n}\n\nfunction arrayFold(f, init, a) {\n if (typeof f !== 'function') {\n throw new Error('First argument to fold is not a function');\n }\n if (!Array.isArray(a)) {\n throw new Error('Second argument to fold is not an array');\n }\n return a.reduce(function (acc, x, i) {\n return f(acc, x, i);\n }, init);\n}\n\nfunction arrayFilter(f, a) {\n if (typeof f !== 'function') {\n throw new Error('First argument to filter is not a function');\n }\n if (!Array.isArray(a)) {\n throw new Error('Second argument to filter is not an array');\n }\n return a.filter(function (x, i) {\n return f(x, i);\n });\n}\n\nfunction stringOrArrayIndexOf(target, s) {\n if (!(Array.isArray(s) || typeof s === 'string')) {\n throw new Error('Second argument to indexOf is not a string or array');\n }\n\n return s.indexOf(target);\n}\n\nfunction arrayJoin(sep, a) {\n if (!Array.isArray(a)) {\n throw new Error('Second argument to join is not an array');\n }\n\n return a.join(sep);\n}\n\nfunction sign(x) {\n return ((x > 0) - (x < 0)) || +x;\n}\n\nvar ONE_THIRD = 1/3;\nfunction cbrt(x) {\n return x < 0 ? -Math.pow(-x, ONE_THIRD) : Math.pow(x, ONE_THIRD);\n}\n\nfunction expm1(x) {\n return Math.exp(x) - 1;\n}\n\nfunction log1p(x) {\n return Math.log(1 + x);\n}\n\nfunction log2(x) {\n return Math.log(x) / Math.LN2;\n}\n\nfunction Parser(options) {\n this.options = options || {};\n this.unaryOps = {\n sin: Math.sin,\n cos: Math.cos,\n tan: Math.tan,\n asin: Math.asin,\n acos: Math.acos,\n atan: Math.atan,\n sinh: Math.sinh || sinh,\n cosh: Math.cosh || cosh,\n tanh: Math.tanh || tanh,\n asinh: Math.asinh || asinh,\n acosh: Math.acosh || acosh,\n atanh: Math.atanh || atanh,\n sqrt: Math.sqrt,\n cbrt: Math.cbrt || cbrt,\n log: Math.log,\n log2: Math.log2 || log2,\n ln: Math.log,\n lg: Math.log10 || log10,\n log10: Math.log10 || log10,\n expm1: Math.expm1 || expm1,\n log1p: Math.log1p || log1p,\n abs: Math.abs,\n ceil: Math.ceil,\n floor: Math.floor,\n round: Math.round,\n trunc: Math.trunc || trunc,\n '-': neg,\n '+': Number,\n exp: Math.exp,\n not: not,\n length: stringOrArrayLength,\n '!': factorial,\n sign: Math.sign || sign\n };\n\n this.binaryOps = {\n '+': add,\n '-': sub,\n '*': mul,\n '/': div,\n '%': mod,\n '^': Math.pow,\n '||': concat,\n '==': equal,\n '!=': notEqual,\n '>': greaterThan,\n '<': lessThan,\n '>=': greaterThanEqual,\n '<=': lessThanEqual,\n and: andOperator,\n or: orOperator,\n 'in': inOperator,\n '=': setVar,\n '[': arrayIndex\n };\n\n this.ternaryOps = {\n '?': condition\n };\n\n this.functions = {\n random: random,\n fac: factorial,\n min: min,\n max: max,\n hypot: Math.hypot || hypot,\n pyt: Math.hypot || hypot, // backward compat\n pow: Math.pow,\n atan2: Math.atan2,\n 'if': condition,\n gamma: gamma,\n roundTo: roundTo,\n map: arrayMap,\n fold: arrayFold,\n filter: arrayFilter,\n indexOf: stringOrArrayIndexOf,\n join: arrayJoin\n };\n\n this.consts = {\n E: Math.E,\n PI: Math.PI,\n 'true': true,\n 'false': false\n };\n}\n\nParser.prototype.parse = function (expr) {\n var instr = [];\n var parserState = new ParserState(\n this,\n new TokenStream(this, expr),\n { allowMemberAccess: this.options.allowMemberAccess }\n );\n\n parserState.parseExpression(instr);\n parserState.expect(TEOF, 'EOF');\n\n return new Expression(instr, this);\n};\n\nParser.prototype.evaluate = function (expr, variables) {\n return this.parse(expr).evaluate(variables);\n};\n\nvar sharedParser = new Parser();\n\nParser.parse = function (expr) {\n return sharedParser.parse(expr);\n};\n\nParser.evaluate = function (expr, variables) {\n return sharedParser.parse(expr).evaluate(variables);\n};\n\nvar optionNameMap = {\n '+': 'add',\n '-': 'subtract',\n '*': 'multiply',\n '/': 'divide',\n '%': 'remainder',\n '^': 'power',\n '!': 'factorial',\n '<': 'comparison',\n '>': 'comparison',\n '<=': 'comparison',\n '>=': 'comparison',\n '==': 'comparison',\n '!=': 'comparison',\n '||': 'concatenate',\n 'and': 'logical',\n 'or': 'logical',\n 'not': 'logical',\n '?': 'conditional',\n ':': 'conditional',\n '=': 'assignment',\n '[': 'array',\n '()=': 'fndef'\n};\n\nfunction getOptionName(op) {\n return optionNameMap.hasOwnProperty(op) ? optionNameMap[op] : op;\n}\n\nParser.prototype.isOperatorEnabled = function (op) {\n var optionName = getOptionName(op);\n var operators = this.options.operators || {};\n\n return !(optionName in operators) || !!operators[optionName];\n};\n\n/*!\n Based on ndef.parser, by Raphael Graf(r@undefined.ch)\n http://www.undefined.ch/mparser/index.html\n\n Ported to JavaScript and modified by Matthew Crumley (email@matthewcrumley.com, http://silentmatt.com/)\n\n You are free to use and modify this code in anyway you find useful. Please leave this comment in the code\n to acknowledge its original source. If you feel like it, I enjoy hearing about projects that use my code,\n but don't feel like you have to let me know or ask permission.\n*/\n\n// Backwards compatibility\nvar index = {\n Parser: Parser,\n Expression: Expression\n};\n\nexport default index;\nexport { Expression, Parser };\n","/* eslint-disable vars-on-top, no-shadow, @typescript-eslint/no-shadow */\nconst shorthandVariableRegex = /F(\\d+(?:\\.\\d+)?)/gm;\n\nimport { Parser } from 'expr-eval';\n\ninterface GPAdvancedCalculationsConfig {\n\tformId: string;\n}\n\ninterface FormulaField {\n\tfield_id: number;\n\tformula: string;\n\trounding: string | number;\n}\n\ntype ParsedFormulaItem = (\n\t| ParsedFormulaOperatorItem\n\t| ParsedFormulaSepItem\n\t| ParsedFormulaFunctionItem\n\t| ParsedFormulaValueItem\n\t| ParsedFormulaComparisonOpItem\n\t| ParsedFormulaLogicalOpItem\n) & {\n\tdepth: number;\n\tprocessedAtDepth?: number;\n\tnonFunctionItem?: boolean;\n};\n\ninterface ParsedFormulaSepItem {\n\ttype: 'sep';\n\tvalue: ',';\n}\n\ntype Operator = '*' | '-' | '+' | '/' | '^' | '%';\n\ninterface ParsedFormulaOperatorItem {\n\ttype: 'operator';\n\tvalue: Operator;\n}\n\ninterface ParsedFormulaFunctionItem {\n\ttype: 'function';\n\tvalue: string;\n}\n\ninterface ParsedFormulaValueItem {\n\ttype: 'value';\n\tvalue: number | string; // String for merge tags\n}\n\ninterface ParsedFormulaComparisonOpItem {\n\ttype: 'comparisonOp';\n\tvalue: string;\n}\n\ninterface ParsedFormulaLogicalOpItem {\n\ttype: 'logicalOp';\n\tvalue: string;\n}\n\ntype ParsedFormula = ParsedFormulaItem[];\n\nclass GPAdvancedCalculations {\n\tpublic formId: number;\n\n\tprivate parser!: Parser;\n\n\t/* Used over Math.PI to keep precision consistent between PHP and JS. */\n\treadonly pi20DecimalPlaces = 3.14159265358979323846;\n\n\tconstructor({ formId }: GPAdvancedCalculationsConfig) {\n\t\tthis.formId = parseInt(formId);\n\n\t\tthis.init();\n\t}\n\n\tinit = () => {\n\t\tthis.setupParser();\n\n\t\twindow.gform.addFilter(\n\t\t\t'gform_calculation_formula',\n\t\t\t(\n\t\t\t\tformula: string,\n\t\t\t\tformulaField: FormulaField,\n\t\t\t\tformId: string,\n\t\t\t\tcalcObj: any\n\t\t\t) => {\n\t\t\t\tif (parseInt(formId) !== this.formId) {\n\t\t\t\t\treturn formula;\n\t\t\t\t}\n\n\t\t\t\t/**\n\t\t\t\t * Filter whether the advanced calculation formula should be processed or not.\n\t\t\t\t *\n\t\t\t\t * @since 1.1.8\n\t\t\t\t *\n\t\t\t\t * @param boolean shouldProcess Whether the calculation should be processed.\n\t\t\t\t * @param number formId The current form ID.\n\t\t\t\t * @param number fieldId The current field ID.\n\t\t\t\t * @param string formula The current formula.\n\t\t\t\t */\n\t\t\t\tconst shouldProcessCalculation = window.gform.applyFilters(\n\t\t\t\t\t'gpac_should_process_calculation',\n\t\t\t\t\ttrue,\n\t\t\t\t\tformId,\n\t\t\t\t\tformulaField.field_id,\n\t\t\t\t\tformula\n\t\t\t\t);\n\n\t\t\t\tif (!shouldProcessCalculation) {\n\t\t\t\t\treturn formula;\n\t\t\t\t}\n\n\t\t\t\tformula = this.replaceShorthandVariables(\n\t\t\t\t\tformula,\n\t\t\t\t\tformulaField,\n\t\t\t\t\tthis.formId\n\t\t\t\t);\n\t\t\t\tformula = this.processConditionals(\n\t\t\t\t\tformula,\n\t\t\t\t\tformulaField,\n\t\t\t\t\tthis.formId,\n\t\t\t\t\tcalcObj\n\t\t\t\t);\n\t\t\t\tformula = this.processExponents(\n\t\t\t\t\tformula,\n\t\t\t\t\tformulaField,\n\t\t\t\t\tthis.formId,\n\t\t\t\t\tcalcObj\n\t\t\t\t);\n\t\t\t\tformula = this.processFunctions(\n\t\t\t\t\tformula,\n\t\t\t\t\tformulaField,\n\t\t\t\t\tthis.formId,\n\t\t\t\t\tcalcObj\n\t\t\t\t);\n\n\t\t\t\treturn formula;\n\t\t\t},\n\t\t\t15\n\t\t);\n\n\t\tjQuery(document).trigger('gform_post_conditional_logic');\n\n\t\tthis.bindShorthandCalcEvents();\n\t\tthis.addGPPAListener();\n\t};\n\n\t/**\n\t * Sets up the expr-eval parser. It disables certain functionality.\n\t */\n\tsetupParser = () => {\n\t\tthis.parser = new Parser({\n\t\t\toperators: {\n\t\t\t\t// These default to true, but are included to be explicit\n\t\t\t\tadd: true,\n\t\t\t\tconcatenate: true,\n\t\t\t\tconditional: true,\n\t\t\t\tdivide: true,\n\t\t\t\tfactorial: true,\n\t\t\t\tmultiply: true,\n\t\t\t\tpower: true,\n\t\t\t\tremainder: true,\n\t\t\t\tsubtract: true,\n\n\t\t\t\tlogical: true,\n\t\t\t\tcomparison: true,\n\n\t\t\t\t// Disable 'in' and = operators\n\t\t\t\tin: false,\n\t\t\t\tassignment: false,\n\t\t\t},\n\t\t});\n\n\t\t// Remove all functions.\n\t\tthis.parser.functions = {};\n\n\t\t// Delete all unary operators outside '-', '+', and '!'\n\t\tfor (const operator in this.parser.unaryOps) {\n\t\t\tif (['-', '+', '!'].indexOf(operator) === -1) {\n\t\t\t\tdelete this.parser.unaryOps[operator];\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Used for binding the calculation events on fields referenced in formulas using shorthand variables.\n\t *\n\t * Loosely based on GFCalc.bindCalcEvents\n\t */\n\tbindShorthandCalcEvents = () => {\n\t\t// Empty or undefined calculation formula, return early.\n\t\tif (!window.gf_global.gfcalc) {\n\t\t\treturn;\n\t\t}\n\t\tconst calcObj = window.gf_global.gfcalc[this.formId];\n\t\tconst { formulaFields, formId } = calcObj;\n\n\t\tfor (let i = 0; i < formulaFields.length; i++) {\n\t\t\tconst formulaField: FormulaField = jQuery.extend(\n\t\t\t\t{},\n\t\t\t\tformulaFields[i]\n\t\t\t);\n\t\t\tconst formulaFieldId = formulaField.field_id;\n\n\t\t\tconst matches = formulaField.formula.match(shorthandVariableRegex);\n\n\t\t\tcalcObj.isCalculating[formulaFieldId] = false;\n\n\t\t\tfor (const i in matches) {\n\t\t\t\tif (!matches.hasOwnProperty(i)) continue;\n\n\t\t\t\t// @ts-ignore\n\t\t\t\tconst inputId = matches[i].replace(/^F/, '');\n\t\t\t\tconst fieldId = parseInt(inputId, 10);\n\n\t\t\t\tconst input = jQuery(`#field_${formId}_${fieldId}`).find(\n\t\t\t\t\t['input', 'select', 'textarea']\n\t\t\t\t\t\t.map((tag) => `${tag}[name=\"input_${inputId}\"]`)\n\t\t\t\t\t\t// Checkboxes\n\t\t\t\t\t\t.concat(`input[id^=\"choice_${formId}_${inputId}_\"]`)\n\t\t\t\t\t\t.join(', ')\n\t\t\t\t);\n\n\t\t\t\tconst eventNamespace = `gpacShorthand_${formulaFieldId}`;\n\n\t\t\t\t// Prevent double-binding\n\t\t\t\tjQuery(input).off(`.${eventNamespace}`);\n\n\t\t\t\tif (\n\t\t\t\t\tinput.prop('type') === 'checkbox' ||\n\t\t\t\t\tinput.prop('type') === 'radio'\n\t\t\t\t) {\n\t\t\t\t\tjQuery(input).on(`click.${eventNamespace}`, function() {\n\t\t\t\t\t\tcalcObj.bindCalcEvent(inputId, formulaField, formId, 0);\n\t\t\t\t\t});\n\t\t\t\t} else if (\n\t\t\t\t\tinput.is('select') ||\n\t\t\t\t\tinput.prop('type') === 'hidden'\n\t\t\t\t) {\n\t\t\t\t\tjQuery(input).on(`change.${eventNamespace}`, function() {\n\t\t\t\t\t\tcalcObj.bindCalcEvent(inputId, formulaField, formId, 0);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tjQuery(input).on(`change.${eventNamespace}`, function() {\n\t\t\t\t\t\tcalcObj.bindCalcEvent(inputId, formulaField, formId, 0);\n\t\t\t\t\t});\n\t\t\t\t\tjQuery(input).on(`keydown.${eventNamespace}`, function() {\n\t\t\t\t\t\tcalcObj.bindCalcEvent(inputId, formulaField, formId);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\t// allow users to add custom methods for triggering calculations\n\t\t\t\twindow.gform.doAction(\n\t\t\t\t\t'gform_post_calculation_events',\n\t\t\t\t\t// @ts-ignore\n\t\t\t\t\t[matches[i], inputId],\n\t\t\t\t\tformulaField,\n\t\t\t\t\tformId,\n\t\t\t\t\tcalcObj\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t};\n\n\t/**\n\t * Listen for field's being refreshed by GPPA and rebind as needed.\n\t */\n\taddGPPAListener = () => {\n\t\tjQuery(document).on('gppa_updated_batch_fields', (event, formId) => {\n\t\t\t// eslint-disable-next-line eqeqeq\n\t\t\tif (this.formId != formId) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.bindShorthandCalcEvents();\n\t\t});\n\t};\n\n\tprocessConditionals = (\n\t\tformula: string,\n\t\tformulaField: FormulaField,\n\t\tformId: number,\n\t\tcalcObj: any\n\t) => {\n\t\t// eslint-disable-line no-unused-vars\n\t\tlet match;\n\n\t\tconst regex = /^if\\s*\\(([\\s\\S]+?)\\)\\s*:[\\s]+(.+)[\\s]+((?:elseif\\s*\\(.+\\)\\s*:[\\s]+.+[\\s]+)*?)else\\s*:[\\s]+(.+)[\\s]+endif\\s*;/g,\n\t\t\telseIfRegex = /elseif\\s*\\(([\\s\\S]+?)\\)\\s*:[\\s]+(.+)/g;\n\n\t\tlet modified = formula;\n\n\t\twhile ((match = regex.exec(formula)) !== null) {\n\t\t\tlet elseIfMatch;\n\n\t\t\tconst fullMatch = match[0],\n\t\t\t\telseIfs = match[3],\n\t\t\t\tstatements = [];\n\n\t\t\tstatements.push({\n\t\t\t\ttag: 'if',\n\t\t\t\tcondition: this.replaceMergeTags(\n\t\t\t\t\tmatch[1],\n\t\t\t\t\tformulaField,\n\t\t\t\t\tformId\n\t\t\t\t),\n\t\t\t\tformula: match[2],\n\t\t\t});\n\n\t\t\tif (elseIfs) {\n\t\t\t\twhile ((elseIfMatch = elseIfRegex.exec(elseIfs)) !== null) {\n\t\t\t\t\tstatements.push({\n\t\t\t\t\t\ttag: 'elseif',\n\t\t\t\t\t\tcondition: this.replaceMergeTags(\n\t\t\t\t\t\t\telseIfMatch[1],\n\t\t\t\t\t\t\tformulaField,\n\t\t\t\t\t\t\tformId\n\t\t\t\t\t\t),\n\t\t\t\t\t\tformula: elseIfMatch[2],\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tstatements.push({\n\t\t\t\ttag: 'else',\n\t\t\t\tcondition: null,\n\t\t\t\tformula: match[4],\n\t\t\t});\n\n\t\t\t// @ts-ignore\n\t\t\tjQuery.each(statements, (i, statement) => {\n\t\t\t\tlet condition: string | null = statement.condition;\n\n\t\t\t\tif (condition) {\n\t\t\t\t\tcondition = this.processExponents(\n\t\t\t\t\t\tcondition,\n\t\t\t\t\t\tformulaField,\n\t\t\t\t\t\tthis.formId,\n\t\t\t\t\t\tcalcObj\n\t\t\t\t\t);\n\n\t\t\t\t\tcondition = this.processFunctions(\n\t\t\t\t\t\tcondition,\n\t\t\t\t\t\tformulaField,\n\t\t\t\t\t\tthis.formId,\n\t\t\t\t\t\tcalcObj\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tif (\n\t\t\t\t\t(statement.tag === 'else' &&\n\t\t\t\t\t\tstatement.condition === null) ||\n\t\t\t\t\t!!this.evalFormula(condition!, formulaField.field_id)\n\t\t\t\t) {\n\t\t\t\t\tmodified = modified.replace(fullMatch, statement.formula);\n\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn modified;\n\t};\n\n\treplaceShorthandVariables = (\n\t\tformula: string,\n\t\tformulaField: FormulaField,\n\t\tformId: number\n\t) => {\n\t\t// Shorthand Field Variables\n\t\tlet shorthandVariableMatch;\n\n\t\twhile (\n\t\t\t(shorthandVariableMatch = new RegExp(shorthandVariableRegex).exec(\n\t\t\t\tformula\n\t\t\t)) !== null\n\t\t) {\n\t\t\tconst [fullMatch, inputId] = shorthandVariableMatch;\n\n\t\t\tformula = formula.replace(\n\t\t\t\t/* Use negative lookahead to prevent partial matches. e.g. if replacing F4, don't replace F43. */\n\t\t\t\tnew RegExp(`${fullMatch}(?!\\d)`),\n\t\t\t\tthis.replaceMergeTag(inputId, undefined, formulaField, formId)\n\t\t\t);\n\t\t}\n\n\t\treturn formula;\n\t};\n\n\treplaceMergeTags = (\n\t\tformula: string,\n\t\tformulaField: FormulaField,\n\t\tformId: number\n\t) => {\n\t\t// Regular Field Variable Merge Tags\n\t\tconst matches = window.GFMergeTag.parseMergeTags(formula);\n\n\t\tfor (const i in matches) {\n\t\t\tif (!matches.hasOwnProperty(i)) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tformula = formula.replace(\n\t\t\t\tmatches[i][0],\n\t\t\t\tthis.replaceMergeTag(\n\t\t\t\t\tmatches[i][1],\n\t\t\t\t\tmatches[i][3],\n\t\t\t\t\tformulaField,\n\t\t\t\t\tformId\n\t\t\t\t)\n\t\t\t);\n\t\t}\n\n\t\treturn this.replaceShorthandVariables(formula, formulaField, formId);\n\t};\n\n\treplaceMergeTag = (\n\t\tinputId: string,\n\t\tmodifier: string | undefined,\n\t\tformulaField: FormulaField,\n\t\tformId: number\n\t) => {\n\t\tconst fieldId = parseInt(inputId, 10);\n\n\t\tif (typeof modifier === 'undefined') {\n\t\t\tconst isProductRadio = jQuery(\n\t\t\t\t'.gfield_price input[name=input_' + fieldId + ']'\n\t\t\t).is('input[type=radio]');\n\t\t\tconst isProductDropdown =\n\t\t\t\tjQuery('.gfield_price select[name=input_' + fieldId + ']')\n\t\t\t\t\t.length > 0;\n\t\t\tconst isOptionCheckbox = jQuery(\n\t\t\t\t'.gfield_price input[name=\"input_' + inputId + '\"]'\n\t\t\t).is('input[type=checkbox]');\n\n\t\t\tif (isProductDropdown || isProductRadio || isOptionCheckbox) {\n\t\t\t\tmodifier = 'price';\n\t\t\t} else {\n\t\t\t\tmodifier = 'value';\n\t\t\t}\n\t\t}\n\n\t\t// If the modifier is \"choice_label\" (custom to GPAC), remove it as we're preventing :value or :price from being added to the merge tag.\n\t\tif (modifier === ':choice_label') {\n\t\t\tmodifier = undefined;\n\t\t}\n\n\t\tconst isNumberField = jQuery(\n\t\t\t'.gfield input[name=\"input_' + inputId + '\"]'\n\t\t).closest('.ginput_container_number').length;\n\n\t\tconst isVisible = window.gf_check_field_rule\n\t\t\t? window.gf_check_field_rule(formId, fieldId, true, '') === 'show'\n\t\t\t: true;\n\n\t\tlet value = isVisible\n\t\t\t? window.GFMergeTag.getMergeTagValue(formId, inputId, modifier)\n\t\t\t: 0;\n\n\t\t// Determine isStringCondition based on the value of the merge tag.\n\t\t// We can detect if it's a number or string by checking if it's a number. Numbers include those with decimal comma\n\t\t// formatting and currency prefixes or suffixes.\n\t\t// The pattern for currencies can be a single currency symbol or a currency symbol followed by a space.\n\t\tconst currencyConfig = window.gf_global.gf_currency_config;\n\t\tlet currencySymbol =\n\t\t\tcurrencyConfig.symbol_left || currencyConfig.symbol_right;\n\t\tconst decimalSeparator = currencyConfig.decimal_separator;\n\t\tconst thousandSeparator = currencyConfig.thousand_separator;\n\n\t\t// Some symbols like Euro will be the HTML entity, so we need to decode it.\n\t\tcurrencySymbol = new DOMParser().parseFromString(\n\t\t\tcurrencySymbol,\n\t\t\t'text/html'\n\t\t).body.textContent;\n\n\t\t// Create a regex pattern for number with decimal and thousand separators\n\t\tconst numberPattern = new RegExp(\n\t\t\t`^[0-9\\\\${decimalSeparator}\\\\${thousandSeparator}%]+$`\n\t\t);\n\n\t\t// Create a regex pattern for currency symbol\n\t\tconst currencyPattern = new RegExp(\n\t\t\t`^\\\\${currencySymbol}|\\\\${currencySymbol}$`\n\t\t);\n\n\t\tlet isValueString;\n\n\t\tif (\n\t\t\tisNumberField ||\n\t\t\t(value !== '' &&\n\t\t\t\ttypeof value === 'string' &&\n\t\t\t\t(value.match(numberPattern) || value.match(currencyPattern)))\n\t\t) {\n\t\t\tisValueString = false;\n\t\t} else {\n\t\t\tisValueString = true;\n\t\t}\n\n\t\t/**\n\t\t * Filter whether a number from a merge tag replacement should be cleaned (e.g. commas and currency removed).\n\t\t *\n\t\t * @since 1.0.2\n\t\t *\n\t\t * @param boolean shouldClean \tWhether the number should be cleaned.\n\t\t * @param string value \t\t\tThe value from the merge tag replacement.\n\t\t * @param number formId \t\t\tThe current form ID.\n\t\t * @param number fieldId \t\tThe field that the value is being pulled from.\n\t\t * @param object formulaField \tThe current field having its formula evaluated. Contains properties such as `field_id`, `formula`, and `rounding`.\n\t\t */\n\t\tconst shouldCleanNumber = window.gform.applyFilters(\n\t\t\t'gpac_should_clean_merge_tag_value',\n\t\t\t!isValueString,\n\t\t\tvalue,\n\t\t\tformId,\n\t\t\tfieldId,\n\t\t\tformulaField\n\t\t);\n\n\t\tif (\n\t\t\tshouldCleanNumber &&\n\t\t\t/*\n\t\t\t * Make sure `gfcalc` is available as it sometimes isn't available if using the Beaver Builder\n\t\t\t * editor. See ticket #48623\n\t\t\t */\n\t\t\ttypeof window.gf_global.gfcalc[formId] !== 'undefined'\n\t\t) {\n\t\t\tvalue = window.gf_global.gfcalc[formId].cleanNumber(\n\t\t\t\tvalue,\n\t\t\t\tformId,\n\t\t\t\tfieldId,\n\t\t\t\tformulaField\n\t\t\t);\n\t\t}\n\n\t\t// If shouldCleanNumber is false and the value is not an actual integer or float, we need to wrap it in quotes.\n\t\tisValueString = isNaN(value) || isValueString;\n\n\t\t// If we're in a string condition, we need to safely wrap the value in quotes, escaping any existing quotes.\n\t\tif (isValueString) {\n\t\t\tvalue = JSON.stringify(value);\n\t\t}\n\n\t\treturn value;\n\t};\n\n\tprocessExponents = (\n\t\tformula: string,\n\t\tformulaField: FormulaField,\n\t\tformId: number,\n\t\tcalcObj: any\n\t) => {\n\t\tconst items = this.parseFormula(formula),\n\t\t\tprocessed: ParsedFormula = [];\n\n\t\twhile (items.length > 0) {\n\t\t\tconst rootItem = items.shift()!;\n\n\t\t\tif (rootItem.type !== 'operator' || rootItem.value !== '^') {\n\t\t\t\tprocessed.push(rootItem);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst targetDepth = rootItem.depth;\n\n\t\t\t// get the base: dip back into the processed items and find all items that are at the same or greater depth than our target\n\t\t\tconst base: ParsedFormula = [];\n\t\t\twhile (processed.length > 0) {\n\t\t\t\tconst item = processed.pop()!;\n\t\t\t\t// accepts a single item at the same depth and only if an item of a greater depth has not already been added\n\t\t\t\tif (item.depth === targetDepth) {\n\t\t\t\t\tif (base.length === 0) {\n\t\t\t\t\t\tbase.push(item);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprocessed.push(item);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t// accepts multiple items at a greater depth\n\t\t\t\t} else if (item.depth > targetDepth) {\n\t\t\t\t\tbase.push(item);\n\t\t\t\t} else {\n\t\t\t\t\tprocessed.push(item);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\tbase.reverse();\n\n\t\t\t// get the power: only the first item at target depth or all items below target depth\n\t\t\tconst pow: ParsedFormula = [];\n\t\t\twhile (items.length > 0) {\n\t\t\t\tconst item = items.shift()!; // eslint-disable-line no-redeclare\n\t\t\t\t// accepts a single item at the same depth and only if an item of a greater depth has not already been added\n\t\t\t\tif (item.depth === targetDepth) {\n\t\t\t\t\tif (pow.length === 0) {\n\t\t\t\t\t\tpow.push(item);\n\t\t\t\t\t} else {\n\t\t\t\t\t\titems.unshift(item);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t\t// accepts multiple items at a greater depth\n\t\t\t\t} else if (item.depth > targetDepth) {\n\t\t\t\t\tpow.push(item);\n\t\t\t\t\t// if item is at a lesser depth, we're done collecting the pow. Add the current item back to the queue\n\t\t\t\t\t// so the outer while loop and loop for any other exponents.\n\t\t\t\t} else {\n\t\t\t\t\titems.unshift(item);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst baseEvaled = this.evalFormula(\n\t\t\t\tthis.processFunctions(\n\t\t\t\t\tcalcObj.replaceFieldTags(\n\t\t\t\t\t\tformId,\n\t\t\t\t\t\tthis.buildFormula(base),\n\t\t\t\t\t\tformulaField\n\t\t\t\t\t),\n\t\t\t\t\tformulaField,\n\t\t\t\t\tformId,\n\t\t\t\t\tcalcObj\n\t\t\t\t),\n\t\t\t\tformulaField.field_id\n\t\t\t);\n\n\t\t\tconst powEvaled = this.evalFormula(\n\t\t\t\tthis.processFunctions(\n\t\t\t\t\tcalcObj.replaceFieldTags(\n\t\t\t\t\t\tformId,\n\t\t\t\t\t\tthis.buildFormula(pow),\n\t\t\t\t\t\tformulaField\n\t\t\t\t\t),\n\t\t\t\t\tformulaField,\n\t\t\t\t\tformId,\n\t\t\t\t\tcalcObj\n\t\t\t\t),\n\t\t\t\tformulaField.field_id\n\t\t\t);\n\n\t\t\tprocessed.push({\n\t\t\t\t...rootItem,\n\t\t\t\ttype: 'value',\n\t\t\t\tvalue: Math.pow(baseEvaled, powEvaled),\n\t\t\t});\n\t\t}\n\n\t\tformula = this.buildFormula(processed);\n\n\t\treturn formula;\n\t};\n\n\tevalFormula = (formula: string, fieldId?: number) => {\n\t\ttry {\n\t\t\tformula = formula.trim();\n\n\t\t\t// Replace && and || with \"and\" and \"or\" respectively.\n\t\t\tformula = formula.replace(/&&/g, 'and').replace(/\\|\\|/g, 'or');\n\n\t\t\tconst expr = this.parser.parse(formula);\n\t\t\treturn expr.evaluate();\n\t\t} catch (e) {\n\t\t\tconst warning = fieldId\n\t\t\t\t? `GP Advanced Calculations: Could not process formula in field ID ${fieldId}. Formula: ${formula}`\n\t\t\t\t: `GP Advanced Calculations: Could not process formula. Formula: ${formula}`;\n\n\t\t\t// eslint-disable-next-line no-console\n\t\t\tconsole.warn(warning, e);\n\t\t}\n\n\t\treturn 0;\n\t};\n\n\tprocessFunctions = (\n\t\tformula: string,\n\t\tformulaField: FormulaField,\n\t\tformId: number,\n\t\tcalcObj: any\n\t) => {\n\t\tlet items: ParsedFormula = this.parseFormula(formula);\n\n\t\t// Short-circuit if there are no functions.\n\t\tif (!items.some((item) => item.type === 'function')) {\n\t\t\treturn this.buildFormula(items);\n\t\t}\n\n\t\tlet functions: {\n\t\t\t[name: string]: (...args: any[]) => number;\n\t\t} = {\n\t\t\tabs: Math.abs,\n\t\t\taverage() {\n\t\t\t\treturn (\n\t\t\t\t\tArray.prototype.slice\n\t\t\t\t\t\t// eslint-disable-next-line prefer-rest-params\n\t\t\t\t\t\t.call(arguments)\n\t\t\t\t\t\t.reduce(function(a, b) {\n\t\t\t\t\t\t\treturn a + b;\n\t\t\t\t\t\t}, 0) / arguments.length\n\t\t\t\t);\n\t\t\t},\n\t\t\tceil: Math.ceil,\n\t\t\texp: Math.exp,\n\t\t\tfloor: Math.floor,\n\t\t\tfv(\n\t\t\t\trate: number,\n\t\t\t\tnumberOfPeriods: number,\n\t\t\t\tpaymentAmount: number,\n\t\t\t\tpresentValue: number,\n\t\t\t\tendOrBeginning: 0 | 1\n\t\t\t) {\n\t\t\t\tif (typeof endOrBeginning === 'undefined') {\n\t\t\t\t\tendOrBeginning = 0;\n\t\t\t\t}\n\n\t\t\t\t// Credit https://stackoverflow.com/a/17195572\n\t\t\t\tconst pow = Math.pow(1 + rate, numberOfPeriods);\n\t\t\t\tlet fv;\n\n\t\t\t\tif (rate) {\n\t\t\t\t\t// eslint-disable-next-line no-mixed-operators\n\t\t\t\t\tfv =\n\t\t\t\t\t\t(paymentAmount *\n\t\t\t\t\t\t\t(1 + rate * endOrBeginning) *\n\t\t\t\t\t\t\t(1 - pow)) /\n\t\t\t\t\t\t\trate -\n\t\t\t\t\t\tpresentValue * pow;\n\t\t\t\t} else {\n\t\t\t\t\t// eslint-disable-next-line no-mixed-operators\n\t\t\t\t\tfv = -1 * (presentValue + paymentAmount * numberOfPeriods);\n\t\t\t\t}\n\n\t\t\t\treturn fv;\n\t\t\t},\n\t\t\tln: Math.log,\n\t\t\tlog: Math.log10,\n\t\t\tmax: Math.max,\n\t\t\tmin: Math.min,\n\t\t\tpi: () => this.pi20DecimalPlaces,\n\t\t\tround: Math.round,\n\t\t\tsqrt: Math.sqrt,\n\t\t\tsin: Math.sin,\n\t\t\tcos: Math.cos,\n\t\t\ttan: Math.tan,\n\t\t\tasin: Math.asin,\n\t\t\tacos: Math.acos,\n\t\t\tatan: Math.atan,\n\t\t};\n\n\t\t/**\n\t\t * Filter the functions list used by GP Advanced Calculations on the frontend (when filling out the form). This\n\t\t * hook needs to be used in conjunction with the `gpac_functions` PHP hook on the backend.\n\t\t *\n\t\t * @since 1.0.21\n\t\t *\n\t\t * @param {Object} functions The functions list. The key is the function name and the value is a callable.\n\t\t */\n\t\tfunctions = window.gform.applyFilters('gpac_functions', functions);\n\n\t\t// Find the highest depth in the remaining items.\n\t\tlet targetDepth = Math.max(...items.map((item) => item.depth));\n\n\t\t/*\n\t\t * Work through the formula by highest depth and working our way down to the root.\n\t\t *\n\t\t * Find groups of items that are at the same depth and process them as a group and remove them from items.\n\t\t */\n\t\titemWhile: while (\n\t\t\t!items.every((item) => item.processedAtDepth !== undefined)\n\t\t) {\n\t\t\tif (targetDepth < 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t// Find items at the target depth and stop when we find an item not in the current group.\n\t\t\tconst groupItems: ParsedFormula = [];\n\t\t\tlet indexToInsertResultAt!: number;\n\n\t\t\tfor (let i = 0; i < items.length; i++) {\n\t\t\t\tconst item = items?.[i];\n\n\t\t\t\t// Skip items deleted while inside the loop\n\t\t\t\tif (typeof item === 'undefined' || item === null) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\t// Use GTE here in case there were a lot of parentheses and some items with inflated depths.\n\t\t\t\tif (\n\t\t\t\t\titem.depth >= targetDepth &&\n\t\t\t\t\t(!item.processedAtDepth ||\n\t\t\t\t\t\titem.processedAtDepth !== targetDepth)\n\t\t\t\t) {\n\t\t\t\t\tgroupItems.push(item);\n\t\t\t\t\t(items as any)[i] = null;\n\n\t\t\t\t\tif (!indexToInsertResultAt) {\n\t\t\t\t\t\tindexToInsertResultAt = i;\n\t\t\t\t\t}\n\t\t\t\t} else if (groupItems.length) {\n\t\t\t\t\t// Break out of the for loop if we find an item that is not in the current group.\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// No items found at this depth, reduce target depth and start at the top of the loop again.\n\t\t\tif (!groupItems.length) {\n\t\t\t\ttargetDepth--;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If there are is a function present, we need to split up the group into chunks and handle each.\n\t\t\t */\n\t\t\tif (groupItems.some((item) => item.type === 'function')) {\n\t\t\t\tconst subGroups: ParsedFormula[] = [[]];\n\n\t\t\t\tfor (const groupItem of groupItems) {\n\t\t\t\t\t/*\n\t\t\t\t\t * If the current item is a function and matches the current depth, create a new subgroup, so we can\n\t\t\t\t\t * add arguments to the function in the next iterations of this for loop.\n\t\t\t\t\t */\n\t\t\t\t\tif (\n\t\t\t\t\t\tgroupItem.type === 'function' &&\n\t\t\t\t\t\tgroupItem.depth === targetDepth\n\t\t\t\t\t) {\n\t\t\t\t\t\tsubGroups.push([]);\n\t\t\t\t\t\tsubGroups[subGroups.length - 1].push(groupItem);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Function arguments are at a depth of at least 1 greater than the function.\n\t\t\t\t\tif (groupItem.depth > targetDepth) {\n\t\t\t\t\t\tsubGroups[subGroups.length - 1].push({\n\t\t\t\t\t\t\t...groupItem,\n\t\t\t\t\t\t\tnonFunctionItem: false,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If the last subgroup contains one item, it is a function without params, and we need to\n\t\t\t\t\t\t * create a new subgroup.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (subGroups[subGroups.length - 1].length === 1) {\n\t\t\t\t\t\t\tsubGroups.push([]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * If the last subgroup item depth is greater than the current item depth, we need to create a\n\t\t\t\t\t\t * new subgroup as we've likely encountered an operator following a function.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tsubGroups[subGroups.length - 1].length &&\n\t\t\t\t\t\t\tsubGroups[subGroups.length - 1][\n\t\t\t\t\t\t\t\tsubGroups[subGroups.length - 1].length - 1\n\t\t\t\t\t\t\t].depth > groupItem.depth\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tsubGroups.push([]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t/*\n\t\t\t\t\t\t * Items that are not part of a function need to be added into their own subgroup but with a\n\t\t\t\t\t\t * flag to not touch them. We put them into a subgroup to re-add to items without losing their\n\t\t\t\t\t\t * order.\n\t\t\t\t\t\t */\n\t\t\t\t\t\tsubGroups[subGroups.length - 1].push({\n\t\t\t\t\t\t\t...groupItem,\n\t\t\t\t\t\t\tnonFunctionItem: true,\n\t\t\t\t\t\t\tprocessedAtDepth: targetDepth,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// Create a new array to hold the results of the subgroups. This will be spliced back into items.\n\t\t\t\tconst subGroupItems: ParsedFormula = [];\n\n\t\t\t\tfor (const subGroup of subGroups) {\n\t\t\t\t\tif (!subGroup.length) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\t/*\n\t\t\t\t\t * If the subgroup contains non function items, just queue the subgroup items to be added back\n\t\t\t\t\t * into items.\n\t\t\t\t\t */\n\t\t\t\t\tif (subGroup.some((item) => item.nonFunctionItem)) {\n\t\t\t\t\t\tsubGroupItems.push(...subGroup);\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst functionName = subGroup[0].value\n\t\t\t\t\t\t.toString()\n\t\t\t\t\t\t.toLowerCase();\n\n\t\t\t\t\tconst functionArgs = subGroup\n\t\t\t\t\t\t.slice(1)\n\t\t\t\t\t\t.map((item) =>\n\t\t\t\t\t\t\titem.type === 'value'\n\t\t\t\t\t\t\t\t? calcObj.replaceFieldTags(\n\t\t\t\t\t\t\t\t\t\tformId,\n\t\t\t\t\t\t\t\t\t\titem.value,\n\t\t\t\t\t\t\t\t\t\tformulaField\n\t\t\t\t\t\t\t\t )\n\t\t\t\t\t\t\t\t: null\n\t\t\t\t\t\t)\n\t\t\t\t\t\t.filter((item) => item !== null)\n\t\t\t\t\t\t.map(parseFloat);\n\n\t\t\t\t\tif (typeof functions[functionName] === 'function') {\n\t\t\t\t\t\tsubGroupItems.push({\n\t\t\t\t\t\t\tprocessedAtDepth: targetDepth,\n\t\t\t\t\t\t\tdepth: targetDepth,\n\t\t\t\t\t\t\ttype: 'value',\n\t\t\t\t\t\t\tvalue: functions[functionName](...functionArgs),\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\titems.splice(indexToInsertResultAt, 0, ...subGroupItems);\n\n\t\t\t\titems = items.filter((item) => item !== null);\n\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * If there aren't any operators in this group, there is nothing to do at this point in the loop as\n\t\t\t * functions will have already been processed and the only thing left are handling operators.\n\t\t\t *\n\t\t\t * Just mark the items as processed and re-add them to the items array, so they're handled at lower depths.\n\t\t\t */\n\t\t\tif (!groupItems.some((item) => item.type === 'operator')) {\n\t\t\t\t// Re-add the items that were removed and mark them as processed.\n\t\t\t\tgroupItems.forEach((item) => {\n\t\t\t\t\titem.processedAtDepth = targetDepth;\n\t\t\t\t});\n\n\t\t\t\titems.splice(indexToInsertResultAt, 0, ...groupItems);\n\n\t\t\t\titems = items.filter((item) => item !== null);\n\n\t\t\t\tcontinue itemWhile;\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * At this point, we should have a mixture of values and operators that need their merge tags replaced\n\t\t\t * and the results evaluated.\n\t\t\t *\n\t\t\t * We will create subgroups for each much like we do with functions. If there are no separators, then\n\t\t\t * we will only have one subgroup.\n\t\t\t */\n\t\t\tconst subGroupsSeps: ParsedFormula[] = [[]];\n\n\t\t\tfor (const groupItem of groupItems) {\n\t\t\t\tif (groupItem.type === 'sep') {\n\t\t\t\t\tsubGroupsSeps.push([]);\n\t\t\t\t} else {\n\t\t\t\t\tsubGroupsSeps[subGroupsSeps.length - 1].push(groupItem);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst subGroupSepsItems: ParsedFormula = [];\n\n\t\t\tfor (const subGroup of subGroupsSeps) {\n\t\t\t\tconst contained = calcObj\n\t\t\t\t\t.replaceFieldTags(\n\t\t\t\t\t\tformId,\n\t\t\t\t\t\tthis.buildFormula(\n\t\t\t\t\t\t\tJSON.parse(JSON.stringify(subGroup)), // Break reference to objects\n\t\t\t\t\t\t\ttargetDepth\n\t\t\t\t\t\t),\n\t\t\t\t\t\tformulaField\n\t\t\t\t\t)\n\t\t\t\t\t.trim();\n\n\t\t\t\tsubGroupSepsItems.push({\n\t\t\t\t\tdepth: targetDepth,\n\t\t\t\t\tprocessedAtDepth: targetDepth,\n\t\t\t\t\ttype: 'value',\n\t\t\t\t\tvalue: this.evalFormula(contained, formulaField.field_id),\n\t\t\t\t});\n\t\t\t}\n\n\t\t\titems.splice(indexToInsertResultAt, 0, ...subGroupSepsItems);\n\n\t\t\titems = items.filter((item) => item !== null);\n\t\t}\n\n\t\tformula = this.buildFormula(items);\n\n\t\treturn formula;\n\t};\n\n\t/**\n\t * Moves the pointer forward when parsing the formula until the end of a specified pattern.\n\t *\n\t * char is always returned even if there's no match.\n\t *\n\t * @param formula The formula being parsed.\n\t * @param char The current character being read. Can be thought of as the pointer.\n\t * @param pattern The RegExp to find the end of the match.\n\t */\n\tmatchUntil = (\n\t\tformula: string,\n\t\tchar: string,\n\t\tpattern: RegExp\n\t): { formula: string; value: string } => {\n\t\tlet lastLetter: any = formula.match(pattern);\n\t\tlet value: string;\n\n\t\tif (lastLetter) {\n\t\t\tlastLetter = lastLetter[0].length;\n\t\t\tvalue = char + formula.substr(0, lastLetter);\n\t\t\tformula = formula.substr(lastLetter);\n\t\t} else {\n\t\t\tvalue = char;\n\t\t}\n\n\t\treturn { formula, value };\n\t};\n\n\tparseFormula = (formula: string): ParsedFormula => {\n\t\tformula = formula.replace('/s+/g', ' ').trim();\n\n\t\tconst items: ParsedFormula = [];\n\t\tlet depth = 0;\n\n\t\twhile (formula.length > 0) {\n\t\t\tconst char = formula.substr(0, 1);\n\n\t\t\tlet item: ParsedFormulaItem,\n\t\t\t\tvalue = '';\n\n\t\t\tlet matchResult: { formula: string; value: string };\n\n\t\t\tformula = formula.substr(1);\n\n\t\t\tswitch (true) {\n\t\t\t\tcase char === '(':\n\t\t\t\t\tdepth++;\n\t\t\t\t\tbreak;\n\t\t\t\tcase char === ')':\n\t\t\t\t\tdepth--;\n\t\t\t\t\tbreak;\n\t\t\t\tcase jQuery.inArray(char, ['*', '-', '+', '/', '^', '%']) !==\n\t\t\t\t\t-1:\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'operator',\n\t\t\t\t\t\tvalue: char as Operator,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase char === '{':\n\t\t\t\t\tconst closingBrace = formula.indexOf('}');\n\t\t\t\t\tvalue = char + formula.substr(0, closingBrace + 1);\n\t\t\t\t\tformula = formula.substr(closingBrace + 1);\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'value',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase char === ',':\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'sep',\n\t\t\t\t\t\tvalue: ',',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase char === '.':\n\t\t\t\tcase jQuery.isNumeric(char):\n\t\t\t\t\tmatchResult = this.matchUntil(formula, char, /^[0-9.]+/); // Includes decimals; could be stricter.\n\n\t\t\t\t\tformula = matchResult.formula;\n\t\t\t\t\tvalue = matchResult.value;\n\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'value',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase char === '\"':\n\t\t\t\tcase char === \"'\":\n\t\t\t\t\tmatchResult =\n\t\t\t\t\t\tchar === '\"'\n\t\t\t\t\t\t\t? this.matchUntil(formula, char, /[^\\\\]*?\"/)\n\t\t\t\t\t\t\t: this.matchUntil(formula, char, /[^\\\\]*?'/);\n\n\t\t\t\t\tformula = matchResult.formula;\n\t\t\t\t\tvalue = matchResult.value;\n\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'value',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase char.match(/[a-zA-Z]/i) &&\n\t\t\t\t\tchar.match(/[a-zA-Z]/i)!.length > 0:\n\t\t\t\t\tmatchResult = this.matchUntil(formula, char, /^[a-zA-Z]+/i);\n\n\t\t\t\t\tformula = matchResult.formula;\n\t\t\t\t\tvalue = matchResult.value;\n\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'function',\n\t\t\t\t\t\tvalue,\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase (char.match(/[<>!=]/)?.length ?? 0) > 0:\n\t\t\t\t\tmatchResult = this.matchUntil(formula, char, /^=+/);\n\n\t\t\t\t\tformula = matchResult.formula;\n\t\t\t\t\tvalue = matchResult.value;\n\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'comparisonOp',\n\t\t\t\t\t\tvalue: ' ' + value + ' ',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t\tcase (char.match(/[&|]/)?.length ?? 0) > 0:\n\t\t\t\t\tmatchResult = this.matchUntil(formula, char, /^[&|]+/);\n\n\t\t\t\t\tformula = matchResult.formula;\n\t\t\t\t\tvalue = matchResult.value;\n\n\t\t\t\t\t/* char is always returned in matchUntil(). We can't do anything with a single & or | so we throw it out. */\n\t\t\t\t\tif (value.length === 1) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\n\t\t\t\t\titem = {\n\t\t\t\t\t\tdepth,\n\t\t\t\t\t\ttype: 'logicalOp',\n\t\t\t\t\t\tvalue: ' ' + value + ' ',\n\t\t\t\t\t};\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tif (item! && item?.value) {\n\t\t\t\titems.push(item);\n\t\t\t}\n\t\t}\n\n\t\treturn items;\n\t};\n\n\t/**\n\t * @param {ParsedFormula} parsedFormula\n\t * @param {number} startingDepth Specify the starting depth to avoid building a formula with extraneous parentheses\n\t */\n\tbuildFormula = (parsedFormula: ParsedFormula, startingDepth = 0) => {\n\t\tlet depth = 0,\n\t\t\tformula = '';\n\n\t\tfor (let i = 0; i < parsedFormula.length; i++) {\n\t\t\tconst item = parsedFormula[i];\n\n\t\t\t/*\n\t\t\t * Remove starting depth from the item. For instance, if we're taking only items from inside a\n\t\t\t * function call, we give it the starting depth of the function to avoid building a formula that is wrapped\n\t\t\t * in numerous parentheses.\n\t\t\t */\n\t\t\titem.depth -= startingDepth;\n\n\t\t\tif (depth < item.depth) {\n\t\t\t\tformula += '('.repeat(item.depth - depth);\n\t\t\t\tdepth = item.depth;\n\t\t\t} else if (depth > item.depth) {\n\t\t\t\tformula += ')'.repeat(depth - item.depth);\n\t\t\t\tdepth = item.depth;\n\t\t\t}\n\n\t\t\tformula += item.value;\n\t\t}\n\n\t\tif (depth > 0) {\n\t\t\tformula += ')'.repeat(depth);\n\t\t}\n\n\t\treturn formula;\n\t};\n}\n\nwindow.GPAdvancedCalculations = GPAdvancedCalculations;\n\nString.prototype.repeat = function(num) {\n\t// @ts-ignore\n\treturn new Array(num + 1).join(this);\n};\n"],"names":["INUMBER","IOP1","IOP2","IOP3","IVAR","IVARNAME","IFUNCALL","IFUNDEF","IEXPR","IEXPREVAL","IMEMBER","IENDSTATEMENT","IARRAY","Instruction","type","value","this","unaryInstruction","binaryInstruction","ternaryInstruction","simplify","tokens","unaryOps","binaryOps","ternaryOps","values","n1","n2","n3","f","nstack","newexpression","i","length","item","Array","isArray","push","apply","map","x","concat","hasOwnProperty","pop","shift","substitute","variable","expr","j","replitem","expritem","evaluate","args","argCount","isExpressionEvaluator","resolveExpression","numTokens","functions","parser","isOperatorEnabled","v","undefined","Error","unshift","call","scope","Object","assign","len","arguments","defineProperty","writable","createExpressionEvaluator","token","n","expressionToString","toJS","escapeValue","join","String","JSON","stringify","replace","contains","array","obj","getSymbols","symbols","options","withMembers","prevVar","Expression","prototype","toString","parse","vars","variables","filter","name","toJSFunction","param","Function","TEOF","TOP","TNUMBER","TSTRING","TPAREN","TBRACKET","TCOMMA","TNAME","TSEMICOLON","Token","index","TokenStream","expression","pos","current","consts","savedPosition","savedCurrent","newToken","save","restore","next","isWhitespace","isComment","isRadixInteger","isNumber","isOperator","isString","isParen","isBracket","isComma","isSemicolon","isNamedOp","isConst","isName","parseError","charAt","r","startPos","quote","indexOf","rawString","substring","unescape","c","toUpperCase","toLowerCase","str","hasLetter","codePointPattern","ParserState","tokenStream","nextToken","savedNextToken","allowMemberAccess","buffer","codePoint","test","fromCharCode","parseInt","backslash","radix","validDigit","valid","resetPos","foundDot","foundDigits","acceptSign","validExponent","parseFloat","op","getCoordinates","column","line","newline","msg","coords","tokenMatches","accept","expect","parseAtom","instr","parseExpression","parseArrayList","exprInstr","parseUntilEndStatement","parseVariableAssignmentExpression","pushExpression","parseConditionalExpression","varName","varValue","lastInstrIndex","parseOrExpression","trueBranch","falseBranch","parseAndExpression","parseComparison","COMPARISON_OPERATORS","parseAddSub","ADD_SUB_OPERATORS","parseTerm","TERM_OPERATORS","add","a","b","Number","sub","mul","div","mod","equal","notEqual","greaterThan","lessThan","greaterThanEqual","lessThanEqual","andOperator","Boolean","orOperator","inOperator","sinh","Math","exp","cosh","tanh","Infinity","asinh","log","sqrt","acosh","atanh","log10","LOG10E","neg","not","trunc","ceil","floor","random","factorial","gamma","parseFactor","parseExponential","parsePostfixExpression","parseFunctionCall","parseMemberExpression","parseArgumentList","GAMMA_G","GAMMA_P","t","isFinite","round","isInteger","NaN","res","PI","sin","twoN","threeN","fourN","fiveN","pow","E","stringOrArrayLength","s","hypot","sum","larg","arg","abs","condition","cond","yep","nope","roundTo","isNaN","split","setVar","arrayIndex","max","min","arrayMap","arrayFold","init","reduce","acc","arrayFilter","stringOrArrayIndexOf","target","arrayJoin","sep","sign","ONE_THIRD","cbrt","expm1","log1p","log2","LN2","Parser","cos","tan","asin","acos","atan","ln","lg","and","or","fac","pyt","atan2","fold","parserState","sharedParser","optionNameMap","optionName","getOptionName","operators","shorthandVariableRegex","window","GPAdvancedCalculations","constructor","formId","pi20DecimalPlaces","setupParser","gform","addFilter","formula","formulaField","calcObj","applyFilters","field_id","replaceShorthandVariables","processConditionals","processExponents","processFunctions","jQuery","document","trigger","bindShorthandCalcEvents","addGPPAListener","concatenate","conditional","divide","multiply","power","remainder","subtract","logical","comparison","in","assignment","operator","gf_global","gfcalc","formulaFields","extend","formulaFieldId","matches","match","isCalculating","inputId","fieldId","input","find","tag","eventNamespace","off","prop","on","bindCalcEvent","is","doAction","event","regex","elseIfRegex","modified","exec","elseIfMatch","fullMatch","elseIfs","statements","replaceMergeTags","each","statement","evalFormula","shorthandVariableMatch","RegExp","replaceMergeTag","GFMergeTag","parseMergeTags","modifier","isProductRadio","isProductDropdown","isOptionCheckbox","isNumberField","closest","gf_check_field_rule","getMergeTagValue","currencyConfig","gf_currency_config","currencySymbol","symbol_left","symbol_right","decimalSeparator","decimal_separator","thousandSeparator","thousand_separator","DOMParser","parseFromString","body","textContent","numberPattern","currencyPattern","isValueString","cleanNumber","items","parseFormula","processed","rootItem","targetDepth","depth","base","reverse","baseEvaled","replaceFieldTags","buildFormula","powEvaled","trim","e","warning","console","warn","some","average","slice","fv","rate","numberOfPeriods","paymentAmount","presentValue","endOrBeginning","pi","itemWhile","every","processedAtDepth","groupItems","indexToInsertResultAt","subGroups","groupItem","nonFunctionItem","subGroupItems","subGroup","functionName","functionArgs","splice","forEach","subGroupsSeps","subGroupSepsItems","contained","matchUntil","char","pattern","lastLetter","substr","matchResult","inArray","closingBrace","isNumeric","parsedFormula","startingDepth","repeat","num"],"sourceRoot":""}