{"version":3,"file":"chevrotain.cjs","sources":["../../src/libs/chevrotain.js"],"sourcesContent":["const { CstParser, Lexer, createToken } = /* @__PURE__ */ (() => {\n  /** Detect free variable `global` from Node.js. */\n  var freeGlobal = typeof global == 'object' && global && global.Object === Object && global\n\n  const freeGlobal$1 = freeGlobal\n\n  /** Detect free variable `self`. */\n  var freeSelf = typeof self == 'object' && self && self.Object === Object && self\n\n  /** Used as a reference to the global object. */\n  var root = freeGlobal$1 || freeSelf || Function('return this')()\n\n  const root$1 = root\n\n  /** Built-in value references. */\n  var Symbol$1 = root$1.Symbol\n\n  const Symbol$2 = Symbol$1\n\n  /** Used for built-in method references. */\n  var objectProto$j = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$g = objectProto$j.hasOwnProperty\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var nativeObjectToString$1 = objectProto$j.toString\n\n  /** Built-in value references. */\n  var symToStringTag$1 = Symbol$2 ? Symbol$2.toStringTag : undefined\n\n  /**\n   * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the raw `toStringTag`.\n   */\n  function getRawTag(value) {\n    var isOwn = hasOwnProperty$g.call(value, symToStringTag$1),\n      tag = value[symToStringTag$1]\n\n    try {\n      value[symToStringTag$1] = undefined\n      var unmasked = true\n    } catch (e) {}\n\n    var result = nativeObjectToString$1.call(value)\n    if (unmasked) {\n      if (isOwn) {\n        value[symToStringTag$1] = tag\n      } else {\n        delete value[symToStringTag$1]\n      }\n    }\n    return result\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$i = Object.prototype\n\n  /**\n   * Used to resolve the\n   * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n   * of values.\n   */\n  var nativeObjectToString = objectProto$i.toString\n\n  /**\n   * Converts `value` to a string using `Object.prototype.toString`.\n   *\n   * @private\n   * @param {*} value The value to convert.\n   * @returns {string} Returns the converted string.\n   */\n  function objectToString(value) {\n    return nativeObjectToString.call(value)\n  }\n\n  /** `Object#toString` result references. */\n  var nullTag = '[object Null]',\n    undefinedTag = '[object Undefined]'\n\n  /** Built-in value references. */\n  var symToStringTag = Symbol$2 ? Symbol$2.toStringTag : undefined\n\n  /**\n   * The base implementation of `getTag` without fallbacks for buggy environments.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  function baseGetTag(value) {\n    if (value == null) {\n      return value === undefined ? undefinedTag : nullTag\n    }\n    return symToStringTag && symToStringTag in Object(value) ? getRawTag(value) : objectToString(value)\n  }\n\n  /**\n   * Checks if `value` is object-like. A value is object-like if it's not `null`\n   * and has a `typeof` result of \"object\".\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n   * @example\n   *\n   * _.isObjectLike({});\n   * // => true\n   *\n   * _.isObjectLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isObjectLike(_.noop);\n   * // => false\n   *\n   * _.isObjectLike(null);\n   * // => false\n   */\n  function isObjectLike(value) {\n    return value != null && typeof value == 'object'\n  }\n\n  /** `Object#toString` result references. */\n  var symbolTag$3 = '[object Symbol]'\n\n  /**\n   * Checks if `value` is classified as a `Symbol` primitive or object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n   * @example\n   *\n   * _.isSymbol(Symbol.iterator);\n   * // => true\n   *\n   * _.isSymbol('abc');\n   * // => false\n   */\n  function isSymbol(value) {\n    return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag$3)\n  }\n\n  /**\n   * A specialized version of `_.map` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function arrayMap(array, iteratee) {\n    var index = -1,\n      length = array == null ? 0 : array.length,\n      result = Array(length)\n\n    while (++index < length) {\n      result[index] = iteratee(array[index], index, array)\n    }\n    return result\n  }\n\n  /**\n   * Checks if `value` is classified as an `Array` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array, else `false`.\n   * @example\n   *\n   * _.isArray([1, 2, 3]);\n   * // => true\n   *\n   * _.isArray(document.body.children);\n   * // => false\n   *\n   * _.isArray('abc');\n   * // => false\n   *\n   * _.isArray(_.noop);\n   * // => false\n   */\n  var isArray = Array.isArray\n\n  const isArray$1 = isArray\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY$3 = 1 / 0\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto$2 = Symbol$2 ? Symbol$2.prototype : undefined,\n    symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined\n\n  /**\n   * The base implementation of `_.toString` which doesn't convert nullish\n   * values to empty strings.\n   *\n   * @private\n   * @param {*} value The value to process.\n   * @returns {string} Returns the string.\n   */\n  function baseToString(value) {\n    // Exit early for strings to avoid a performance hit in some environments.\n    if (typeof value == 'string') {\n      return value\n    }\n    if (isArray$1(value)) {\n      // Recursively convert values (susceptible to call stack limits).\n      return arrayMap(value, baseToString) + ''\n    }\n    if (isSymbol(value)) {\n      return symbolToString ? symbolToString.call(value) : ''\n    }\n    var result = value + ''\n    return result == '0' && 1 / value == -INFINITY$3 ? '-0' : result\n  }\n\n  /** Used to match a single whitespace character. */\n  var reWhitespace = /\\s/\n\n  /**\n   * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n   * character of `string`.\n   *\n   * @private\n   * @param {string} string The string to inspect.\n   * @returns {number} Returns the index of the last non-whitespace character.\n   */\n  function trimmedEndIndex(string) {\n    var index = string.length\n\n    while (index-- && reWhitespace.test(string.charAt(index))) {}\n    return index\n  }\n\n  /** Used to match leading whitespace. */\n  var reTrimStart = /^\\s+/\n\n  /**\n   * The base implementation of `_.trim`.\n   *\n   * @private\n   * @param {string} string The string to trim.\n   * @returns {string} Returns the trimmed string.\n   */\n  function baseTrim(string) {\n    return string ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '') : string\n  }\n\n  /**\n   * Checks if `value` is the\n   * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n   * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n   * @example\n   *\n   * _.isObject({});\n   * // => true\n   *\n   * _.isObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isObject(_.noop);\n   * // => true\n   *\n   * _.isObject(null);\n   * // => false\n   */\n  function isObject(value) {\n    var type = typeof value\n    return value != null && (type == 'object' || type == 'function')\n  }\n\n  /** Used as references for various `Number` constants. */\n  var NAN = 0 / 0\n\n  /** Used to detect bad signed hexadecimal string values. */\n  var reIsBadHex = /^[-+]0x[0-9a-f]+$/i\n\n  /** Used to detect binary string values. */\n  var reIsBinary = /^0b[01]+$/i\n\n  /** Used to detect octal string values. */\n  var reIsOctal = /^0o[0-7]+$/i\n\n  /** Built-in method references without a dependency on `root`. */\n  var freeParseInt = parseInt\n\n  /**\n   * Converts `value` to a number.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to process.\n   * @returns {number} Returns the number.\n   * @example\n   *\n   * _.toNumber(3.2);\n   * // => 3.2\n   *\n   * _.toNumber(Number.MIN_VALUE);\n   * // => 5e-324\n   *\n   * _.toNumber(Infinity);\n   * // => Infinity\n   *\n   * _.toNumber('3.2');\n   * // => 3.2\n   */\n  function toNumber(value) {\n    if (typeof value == 'number') {\n      return value\n    }\n    if (isSymbol(value)) {\n      return NAN\n    }\n    if (isObject(value)) {\n      var other = typeof value.valueOf == 'function' ? value.valueOf() : value\n      value = isObject(other) ? other + '' : other\n    }\n    if (typeof value != 'string') {\n      return value === 0 ? value : +value\n    }\n    value = baseTrim(value)\n    var isBinary = reIsBinary.test(value)\n    return isBinary || reIsOctal.test(value)\n      ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n      : reIsBadHex.test(value)\n      ? NAN\n      : +value\n  }\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY$2 = 1 / 0,\n    MAX_INTEGER = 1.7976931348623157e308\n\n  /**\n   * Converts `value` to a finite number.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.12.0\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {number} Returns the converted number.\n   * @example\n   *\n   * _.toFinite(3.2);\n   * // => 3.2\n   *\n   * _.toFinite(Number.MIN_VALUE);\n   * // => 5e-324\n   *\n   * _.toFinite(Infinity);\n   * // => 1.7976931348623157e+308\n   *\n   * _.toFinite('3.2');\n   * // => 3.2\n   */\n  function toFinite(value) {\n    if (!value) {\n      return value === 0 ? value : 0\n    }\n    value = toNumber(value)\n    if (value === INFINITY$2 || value === -INFINITY$2) {\n      var sign = value < 0 ? -1 : 1\n      return sign * MAX_INTEGER\n    }\n    return value === value ? value : 0\n  }\n\n  /**\n   * Converts `value` to an integer.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {number} Returns the converted integer.\n   * @example\n   *\n   * _.toInteger(3.2);\n   * // => 3\n   *\n   * _.toInteger(Number.MIN_VALUE);\n   * // => 0\n   *\n   * _.toInteger(Infinity);\n   * // => 1.7976931348623157e+308\n   *\n   * _.toInteger('3.2');\n   * // => 3\n   */\n  function toInteger(value) {\n    var result = toFinite(value),\n      remainder = result % 1\n\n    return result === result ? (remainder ? result - remainder : result) : 0\n  }\n\n  /**\n   * This method returns the first argument it receives.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Util\n   * @param {*} value Any value.\n   * @returns {*} Returns `value`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   *\n   * console.log(_.identity(object) === object);\n   * // => true\n   */\n  function identity(value) {\n    return value\n  }\n\n  /** `Object#toString` result references. */\n  var asyncTag = '[object AsyncFunction]',\n    funcTag$2 = '[object Function]',\n    genTag$1 = '[object GeneratorFunction]',\n    proxyTag = '[object Proxy]'\n\n  /**\n   * Checks if `value` is classified as a `Function` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a function, else `false`.\n   * @example\n   *\n   * _.isFunction(_);\n   * // => true\n   *\n   * _.isFunction(/abc/);\n   * // => false\n   */\n  function isFunction(value) {\n    if (!isObject(value)) {\n      return false\n    }\n    // The use of `Object#toString` avoids issues with the `typeof` operator\n    // in Safari 9 which returns 'object' for typed arrays and other constructors.\n    var tag = baseGetTag(value)\n    return tag == funcTag$2 || tag == genTag$1 || tag == asyncTag || tag == proxyTag\n  }\n\n  /** Used to detect overreaching core-js shims. */\n  var coreJsData = root$1['__core-js_shared__']\n\n  const coreJsData$1 = coreJsData\n\n  /** Used to detect methods masquerading as native. */\n  var maskSrcKey = (function () {\n    var uid = /[^.]+$/.exec((coreJsData$1 && coreJsData$1.keys && coreJsData$1.keys.IE_PROTO) || '')\n    return uid ? 'Symbol(src)_1.' + uid : ''\n  })()\n\n  /**\n   * Checks if `func` has its source masked.\n   *\n   * @private\n   * @param {Function} func The function to check.\n   * @returns {boolean} Returns `true` if `func` is masked, else `false`.\n   */\n  function isMasked(func) {\n    return !!maskSrcKey && maskSrcKey in func\n  }\n\n  /** Used for built-in method references. */\n  var funcProto$1 = Function.prototype\n\n  /** Used to resolve the decompiled source of functions. */\n  var funcToString$1 = funcProto$1.toString\n\n  /**\n   * Converts `func` to its source code.\n   *\n   * @private\n   * @param {Function} func The function to convert.\n   * @returns {string} Returns the source code.\n   */\n  function toSource(func) {\n    if (func != null) {\n      try {\n        return funcToString$1.call(func)\n      } catch (e) {}\n      try {\n        return func + ''\n      } catch (e) {}\n    }\n    return ''\n  }\n\n  /**\n   * Used to match `RegExp`\n   * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns).\n   */\n  var reRegExpChar = /[\\\\^$.*+?()[\\]{}|]/g\n\n  /** Used to detect host constructors (Safari). */\n  var reIsHostCtor = /^\\[object .+?Constructor\\]$/\n\n  /** Used for built-in method references. */\n  var funcProto = Function.prototype,\n    objectProto$h = Object.prototype\n\n  /** Used to resolve the decompiled source of functions. */\n  var funcToString = funcProto.toString\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$f = objectProto$h.hasOwnProperty\n\n  /** Used to detect if a method is native. */\n  var reIsNative = RegExp(\n    '^' +\n      funcToString\n        .call(hasOwnProperty$f)\n        .replace(reRegExpChar, '\\\\$&')\n        .replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g, '$1.*?') +\n      '$',\n  )\n\n  /**\n   * The base implementation of `_.isNative` without bad shim checks.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a native function,\n   *  else `false`.\n   */\n  function baseIsNative(value) {\n    if (!isObject(value) || isMasked(value)) {\n      return false\n    }\n    var pattern = isFunction(value) ? reIsNative : reIsHostCtor\n    return pattern.test(toSource(value))\n  }\n\n  /**\n   * Gets the value at `key` of `object`.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {string} key The key of the property to get.\n   * @returns {*} Returns the property value.\n   */\n  function getValue(object, key) {\n    return object == null ? undefined : object[key]\n  }\n\n  /**\n   * Gets the native function at `key` of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {string} key The key of the method to get.\n   * @returns {*} Returns the function if it's native, else `undefined`.\n   */\n  function getNative(object, key) {\n    var value = getValue(object, key)\n    return baseIsNative(value) ? value : undefined\n  }\n\n  /* Built-in method references that are verified to be native. */\n  var WeakMap = getNative(root$1, 'WeakMap')\n\n  const WeakMap$1 = WeakMap\n\n  /** Built-in value references. */\n  var objectCreate = Object.create\n\n  /**\n   * The base implementation of `_.create` without support for assigning\n   * properties to the created object.\n   *\n   * @private\n   * @param {Object} proto The object to inherit from.\n   * @returns {Object} Returns the new object.\n   */\n  var baseCreate = (function () {\n    function object() {}\n    return function (proto) {\n      if (!isObject(proto)) {\n        return {}\n      }\n      if (objectCreate) {\n        return objectCreate(proto)\n      }\n      object.prototype = proto\n      var result = new object()\n      object.prototype = undefined\n      return result\n    }\n  })()\n\n  const baseCreate$1 = baseCreate\n\n  /**\n   * A faster alternative to `Function#apply`, this function invokes `func`\n   * with the `this` binding of `thisArg` and the arguments of `args`.\n   *\n   * @private\n   * @param {Function} func The function to invoke.\n   * @param {*} thisArg The `this` binding of `func`.\n   * @param {Array} args The arguments to invoke `func` with.\n   * @returns {*} Returns the result of `func`.\n   */\n  function apply(func, thisArg, args) {\n    switch (args.length) {\n      case 0:\n        return func.call(thisArg)\n      case 1:\n        return func.call(thisArg, args[0])\n      case 2:\n        return func.call(thisArg, args[0], args[1])\n      case 3:\n        return func.call(thisArg, args[0], args[1], args[2])\n    }\n    return func.apply(thisArg, args)\n  }\n\n  /**\n   * This method returns `undefined`.\n   *\n   * @static\n   * @memberOf _\n   * @since 2.3.0\n   * @category Util\n   * @example\n   *\n   * _.times(2, _.noop);\n   * // => [undefined, undefined]\n   */\n  function noop() {\n    // No operation performed.\n  }\n\n  /**\n   * Copies the values of `source` to `array`.\n   *\n   * @private\n   * @param {Array} source The array to copy values from.\n   * @param {Array} [array=[]] The array to copy values to.\n   * @returns {Array} Returns `array`.\n   */\n  function copyArray(source, array) {\n    var index = -1,\n      length = source.length\n\n    array || (array = Array(length))\n    while (++index < length) {\n      array[index] = source[index]\n    }\n    return array\n  }\n\n  /** Used to detect hot functions by number of calls within a span of milliseconds. */\n  var HOT_COUNT = 800,\n    HOT_SPAN = 16\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeNow = Date.now\n\n  /**\n   * Creates a function that'll short out and invoke `identity` instead\n   * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`\n   * milliseconds.\n   *\n   * @private\n   * @param {Function} func The function to restrict.\n   * @returns {Function} Returns the new shortable function.\n   */\n  function shortOut(func) {\n    var count = 0,\n      lastCalled = 0\n\n    return function () {\n      var stamp = nativeNow(),\n        remaining = HOT_SPAN - (stamp - lastCalled)\n\n      lastCalled = stamp\n      if (remaining > 0) {\n        if (++count >= HOT_COUNT) {\n          return arguments[0]\n        }\n      } else {\n        count = 0\n      }\n      return func.apply(undefined, arguments)\n    }\n  }\n\n  /**\n   * Creates a function that returns `value`.\n   *\n   * @static\n   * @memberOf _\n   * @since 2.4.0\n   * @category Util\n   * @param {*} value The value to return from the new function.\n   * @returns {Function} Returns the new constant function.\n   * @example\n   *\n   * var objects = _.times(2, _.constant({ 'a': 1 }));\n   *\n   * console.log(objects);\n   * // => [{ 'a': 1 }, { 'a': 1 }]\n   *\n   * console.log(objects[0] === objects[1]);\n   * // => true\n   */\n  function constant(value) {\n    return function () {\n      return value\n    }\n  }\n\n  var defineProperty = (function () {\n    try {\n      var func = getNative(Object, 'defineProperty')\n      func({}, '', {})\n      return func\n    } catch (e) {}\n  })()\n\n  const defineProperty$1 = defineProperty\n\n  /**\n   * The base implementation of `setToString` without support for hot loop shorting.\n   *\n   * @private\n   * @param {Function} func The function to modify.\n   * @param {Function} string The `toString` result.\n   * @returns {Function} Returns `func`.\n   */\n  var baseSetToString = !defineProperty$1\n    ? identity\n    : function (func, string) {\n        return defineProperty$1(func, 'toString', {\n          configurable: true,\n          enumerable: false,\n          value: constant(string),\n          writable: true,\n        })\n      }\n\n  const baseSetToString$1 = baseSetToString\n\n  /**\n   * Sets the `toString` method of `func` to return `string`.\n   *\n   * @private\n   * @param {Function} func The function to modify.\n   * @param {Function} string The `toString` result.\n   * @returns {Function} Returns `func`.\n   */\n  var setToString = shortOut(baseSetToString$1)\n\n  const setToString$1 = setToString\n\n  /**\n   * A specialized version of `_.forEach` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayEach(array, iteratee) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    while (++index < length) {\n      if (iteratee(array[index], index, array) === false) {\n        break\n      }\n    }\n    return array\n  }\n\n  /**\n   * The base implementation of `_.findIndex` and `_.findLastIndex` without\n   * support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} predicate The function invoked per iteration.\n   * @param {number} fromIndex The index to search from.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseFindIndex(array, predicate, fromIndex, fromRight) {\n    var length = array.length,\n      index = fromIndex + (fromRight ? 1 : -1)\n\n    while (fromRight ? index-- : ++index < length) {\n      if (predicate(array[index], index, array)) {\n        return index\n      }\n    }\n    return -1\n  }\n\n  /**\n   * The base implementation of `_.isNaN` without support for number objects.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.\n   */\n  function baseIsNaN(value) {\n    return value !== value\n  }\n\n  /**\n   * A specialized version of `_.indexOf` which performs strict equality\n   * comparisons of values, i.e. `===`.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function strictIndexOf(array, value, fromIndex) {\n    var index = fromIndex - 1,\n      length = array.length\n\n    while (++index < length) {\n      if (array[index] === value) {\n        return index\n      }\n    }\n    return -1\n  }\n\n  /**\n   * The base implementation of `_.indexOf` without `fromIndex` bounds checks.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} fromIndex The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function baseIndexOf(array, value, fromIndex) {\n    return value === value ? strictIndexOf(array, value, fromIndex) : baseFindIndex(array, baseIsNaN, fromIndex)\n  }\n\n  /**\n   * A specialized version of `_.includes` for arrays without support for\n   * specifying an index to search from.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludes(array, value) {\n    var length = array == null ? 0 : array.length\n    return !!length && baseIndexOf(array, value, 0) > -1\n  }\n\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER$1 = 9007199254740991\n\n  /** Used to detect unsigned integer values. */\n  var reIsUint = /^(?:0|[1-9]\\d*)$/\n\n  /**\n   * Checks if `value` is a valid array-like index.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.\n   * @returns {boolean} Returns `true` if `value` is a valid index, else `false`.\n   */\n  function isIndex(value, length) {\n    var type = typeof value\n    length = length == null ? MAX_SAFE_INTEGER$1 : length\n\n    return (\n      !!length &&\n      (type == 'number' || (type != 'symbol' && reIsUint.test(value))) &&\n      value > -1 &&\n      value % 1 == 0 &&\n      value < length\n    )\n  }\n\n  /**\n   * The base implementation of `assignValue` and `assignMergeValue` without\n   * value checks.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {string} key The key of the property to assign.\n   * @param {*} value The value to assign.\n   */\n  function baseAssignValue(object, key, value) {\n    if (key == '__proto__' && defineProperty$1) {\n      defineProperty$1(object, key, {\n        configurable: true,\n        enumerable: true,\n        value: value,\n        writable: true,\n      })\n    } else {\n      object[key] = value\n    }\n  }\n\n  /**\n   * Performs a\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * comparison between two values to determine if they are equivalent.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   * @example\n   *\n   * var object = { 'a': 1 };\n   * var other = { 'a': 1 };\n   *\n   * _.eq(object, object);\n   * // => true\n   *\n   * _.eq(object, other);\n   * // => false\n   *\n   * _.eq('a', 'a');\n   * // => true\n   *\n   * _.eq('a', Object('a'));\n   * // => false\n   *\n   * _.eq(NaN, NaN);\n   * // => true\n   */\n  function eq(value, other) {\n    return value === other || (value !== value && other !== other)\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$g = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$e = objectProto$g.hasOwnProperty\n\n  /**\n   * Assigns `value` to `key` of `object` if the existing value is not equivalent\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {string} key The key of the property to assign.\n   * @param {*} value The value to assign.\n   */\n  function assignValue(object, key, value) {\n    var objValue = object[key]\n    if (!(hasOwnProperty$e.call(object, key) && eq(objValue, value)) || (value === undefined && !(key in object))) {\n      baseAssignValue(object, key, value)\n    }\n  }\n\n  /**\n   * Copies properties of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy properties from.\n   * @param {Array} props The property identifiers to copy.\n   * @param {Object} [object={}] The object to copy properties to.\n   * @param {Function} [customizer] The function to customize copied values.\n   * @returns {Object} Returns `object`.\n   */\n  function copyObject(source, props, object, customizer) {\n    var isNew = !object\n    object || (object = {})\n\n    var index = -1,\n      length = props.length\n\n    while (++index < length) {\n      var key = props[index]\n\n      var newValue = customizer ? customizer(object[key], source[key], key, object, source) : undefined\n\n      if (newValue === undefined) {\n        newValue = source[key]\n      }\n      if (isNew) {\n        baseAssignValue(object, key, newValue)\n      } else {\n        assignValue(object, key, newValue)\n      }\n    }\n    return object\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax$3 = Math.max\n\n  /**\n   * A specialized version of `baseRest` which transforms the rest array.\n   *\n   * @private\n   * @param {Function} func The function to apply a rest parameter to.\n   * @param {number} [start=func.length-1] The start position of the rest parameter.\n   * @param {Function} transform The rest array transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overRest(func, start, transform) {\n    start = nativeMax$3(start === undefined ? func.length - 1 : start, 0)\n    return function () {\n      var args = arguments,\n        index = -1,\n        length = nativeMax$3(args.length - start, 0),\n        array = Array(length)\n\n      while (++index < length) {\n        array[index] = args[start + index]\n      }\n      index = -1\n      var otherArgs = Array(start + 1)\n      while (++index < start) {\n        otherArgs[index] = args[index]\n      }\n      otherArgs[start] = transform(array)\n      return apply(func, this, otherArgs)\n    }\n  }\n\n  /**\n   * The base implementation of `_.rest` which doesn't validate or coerce arguments.\n   *\n   * @private\n   * @param {Function} func The function to apply a rest parameter to.\n   * @param {number} [start=func.length-1] The start position of the rest parameter.\n   * @returns {Function} Returns the new function.\n   */\n  function baseRest(func, start) {\n    return setToString$1(overRest(func, start, identity), func + '')\n  }\n\n  /** Used as references for various `Number` constants. */\n  var MAX_SAFE_INTEGER = 9007199254740991\n\n  /**\n   * Checks if `value` is a valid array-like length.\n   *\n   * **Note:** This method is loosely based on\n   * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a valid length, else `false`.\n   * @example\n   *\n   * _.isLength(3);\n   * // => true\n   *\n   * _.isLength(Number.MIN_VALUE);\n   * // => false\n   *\n   * _.isLength(Infinity);\n   * // => false\n   *\n   * _.isLength('3');\n   * // => false\n   */\n  function isLength(value) {\n    return typeof value == 'number' && value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER\n  }\n\n  /**\n   * Checks if `value` is array-like. A value is considered array-like if it's\n   * not a function and has a `value.length` that's an integer greater than or\n   * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is array-like, else `false`.\n   * @example\n   *\n   * _.isArrayLike([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLike(document.body.children);\n   * // => true\n   *\n   * _.isArrayLike('abc');\n   * // => true\n   *\n   * _.isArrayLike(_.noop);\n   * // => false\n   */\n  function isArrayLike(value) {\n    return value != null && isLength(value.length) && !isFunction(value)\n  }\n\n  /**\n   * Checks if the given arguments are from an iteratee call.\n   *\n   * @private\n   * @param {*} value The potential iteratee value argument.\n   * @param {*} index The potential iteratee index or key argument.\n   * @param {*} object The potential iteratee object argument.\n   * @returns {boolean} Returns `true` if the arguments are from an iteratee call,\n   *  else `false`.\n   */\n  function isIterateeCall(value, index, object) {\n    if (!isObject(object)) {\n      return false\n    }\n    var type = typeof index\n    if (type == 'number' ? isArrayLike(object) && isIndex(index, object.length) : type == 'string' && index in object) {\n      return eq(object[index], value)\n    }\n    return false\n  }\n\n  /**\n   * Creates a function like `_.assign`.\n   *\n   * @private\n   * @param {Function} assigner The function to assign values.\n   * @returns {Function} Returns the new assigner function.\n   */\n  function createAssigner(assigner) {\n    return baseRest(function (object, sources) {\n      var index = -1,\n        length = sources.length,\n        customizer = length > 1 ? sources[length - 1] : undefined,\n        guard = length > 2 ? sources[2] : undefined\n\n      customizer = assigner.length > 3 && typeof customizer == 'function' ? (length--, customizer) : undefined\n\n      if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n        customizer = length < 3 ? undefined : customizer\n        length = 1\n      }\n      object = Object(object)\n      while (++index < length) {\n        var source = sources[index]\n        if (source) {\n          assigner(object, source, index, customizer)\n        }\n      }\n      return object\n    })\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$f = Object.prototype\n\n  /**\n   * Checks if `value` is likely a prototype object.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.\n   */\n  function isPrototype(value) {\n    var Ctor = value && value.constructor,\n      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$f\n\n    return value === proto\n  }\n\n  /**\n   * The base implementation of `_.times` without support for iteratee shorthands\n   * or max array length checks.\n   *\n   * @private\n   * @param {number} n The number of times to invoke `iteratee`.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the array of results.\n   */\n  function baseTimes(n, iteratee) {\n    var index = -1,\n      result = Array(n)\n\n    while (++index < n) {\n      result[index] = iteratee(index)\n    }\n    return result\n  }\n\n  /** `Object#toString` result references. */\n  var argsTag$3 = '[object Arguments]'\n\n  /**\n   * The base implementation of `_.isArguments`.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   */\n  function baseIsArguments(value) {\n    return isObjectLike(value) && baseGetTag(value) == argsTag$3\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$e = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$d = objectProto$e.hasOwnProperty\n\n  /** Built-in value references. */\n  var propertyIsEnumerable$1 = objectProto$e.propertyIsEnumerable\n\n  /**\n   * Checks if `value` is likely an `arguments` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an `arguments` object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArguments(function() { return arguments; }());\n   * // => true\n   *\n   * _.isArguments([1, 2, 3]);\n   * // => false\n   */\n  var isArguments = baseIsArguments(\n    (function () {\n      return arguments\n    })(),\n  )\n    ? baseIsArguments\n    : function (value) {\n        return (\n          isObjectLike(value) && hasOwnProperty$d.call(value, 'callee') && !propertyIsEnumerable$1.call(value, 'callee')\n        )\n      }\n\n  const isArguments$1 = isArguments\n\n  /**\n   * This method returns `false`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {boolean} Returns `false`.\n   * @example\n   *\n   * _.times(2, _.stubFalse);\n   * // => [false, false]\n   */\n  function stubFalse() {\n    return false\n  }\n\n  /** Detect free variable `exports`. */\n  var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports\n\n  /** Detect free variable `module`. */\n  var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2\n\n  /** Built-in value references. */\n  var Buffer$1 = moduleExports$2 ? root$1.Buffer : undefined\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeIsBuffer = Buffer$1 ? Buffer$1.isBuffer : undefined\n\n  /**\n   * Checks if `value` is a buffer.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.3.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a buffer, else `false`.\n   * @example\n   *\n   * _.isBuffer(new Buffer(2));\n   * // => true\n   *\n   * _.isBuffer(new Uint8Array(2));\n   * // => false\n   */\n  var isBuffer = nativeIsBuffer || stubFalse\n\n  const isBuffer$1 = isBuffer\n\n  /** `Object#toString` result references. */\n  var argsTag$2 = '[object Arguments]',\n    arrayTag$2 = '[object Array]',\n    boolTag$3 = '[object Boolean]',\n    dateTag$3 = '[object Date]',\n    errorTag$2 = '[object Error]',\n    funcTag$1 = '[object Function]',\n    mapTag$6 = '[object Map]',\n    numberTag$3 = '[object Number]',\n    objectTag$3 = '[object Object]',\n    regexpTag$4 = '[object RegExp]',\n    setTag$6 = '[object Set]',\n    stringTag$4 = '[object String]',\n    weakMapTag$2 = '[object WeakMap]'\n\n  var arrayBufferTag$3 = '[object ArrayBuffer]',\n    dataViewTag$4 = '[object DataView]',\n    float32Tag$2 = '[object Float32Array]',\n    float64Tag$2 = '[object Float64Array]',\n    int8Tag$2 = '[object Int8Array]',\n    int16Tag$2 = '[object Int16Array]',\n    int32Tag$2 = '[object Int32Array]',\n    uint8Tag$2 = '[object Uint8Array]',\n    uint8ClampedTag$2 = '[object Uint8ClampedArray]',\n    uint16Tag$2 = '[object Uint16Array]',\n    uint32Tag$2 = '[object Uint32Array]'\n\n  /** Used to identify `toStringTag` values of typed arrays. */\n  var typedArrayTags = {}\n  typedArrayTags[float32Tag$2] = typedArrayTags[float64Tag$2] = typedArrayTags[int8Tag$2] = typedArrayTags[\n    int16Tag$2\n  ] = typedArrayTags[int32Tag$2] = typedArrayTags[uint8Tag$2] = typedArrayTags[uint8ClampedTag$2] = typedArrayTags[\n    uint16Tag$2\n  ] = typedArrayTags[uint32Tag$2] = true\n  typedArrayTags[argsTag$2] = typedArrayTags[arrayTag$2] = typedArrayTags[arrayBufferTag$3] = typedArrayTags[\n    boolTag$3\n  ] = typedArrayTags[dataViewTag$4] = typedArrayTags[dateTag$3] = typedArrayTags[errorTag$2] = typedArrayTags[\n    funcTag$1\n  ] = typedArrayTags[mapTag$6] = typedArrayTags[numberTag$3] = typedArrayTags[objectTag$3] = typedArrayTags[\n    regexpTag$4\n  ] = typedArrayTags[setTag$6] = typedArrayTags[stringTag$4] = typedArrayTags[weakMapTag$2] = false\n\n  /**\n   * The base implementation of `_.isTypedArray` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n   */\n  function baseIsTypedArray(value) {\n    return isObjectLike(value) && isLength(value.length) && !!typedArrayTags[baseGetTag(value)]\n  }\n\n  /**\n   * The base implementation of `_.unary` without support for storing metadata.\n   *\n   * @private\n   * @param {Function} func The function to cap arguments for.\n   * @returns {Function} Returns the new capped function.\n   */\n  function baseUnary(func) {\n    return function (value) {\n      return func(value)\n    }\n  }\n\n  /** Detect free variable `exports`. */\n  var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports\n\n  /** Detect free variable `module`. */\n  var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1\n\n  /** Detect free variable `process` from Node.js. */\n  var freeProcess = moduleExports$1 && freeGlobal$1.process\n\n  /** Used to access faster Node.js helpers. */\n  var nodeUtil = (function () {\n    try {\n      // Use `util.types` for Node.js 10+.\n      var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types\n\n      if (types) {\n        return types\n      }\n\n      // Legacy `process.binding('util')` for Node.js < 10.\n      return freeProcess && freeProcess.binding && freeProcess.binding('util')\n    } catch (e) {}\n  })()\n\n  const nodeUtil$1 = nodeUtil\n\n  /* Node.js helper references. */\n  var nodeIsTypedArray = nodeUtil$1 && nodeUtil$1.isTypedArray\n\n  /**\n   * Checks if `value` is classified as a typed array.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.\n   * @example\n   *\n   * _.isTypedArray(new Uint8Array);\n   * // => true\n   *\n   * _.isTypedArray([]);\n   * // => false\n   */\n  var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray\n\n  const isTypedArray$1 = isTypedArray\n\n  /** Used for built-in method references. */\n  var objectProto$d = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$c = objectProto$d.hasOwnProperty\n\n  /**\n   * Creates an array of the enumerable property names of the array-like `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @param {boolean} inherited Specify returning inherited property names.\n   * @returns {Array} Returns the array of property names.\n   */\n  function arrayLikeKeys(value, inherited) {\n    var isArr = isArray$1(value),\n      isArg = !isArr && isArguments$1(value),\n      isBuff = !isArr && !isArg && isBuffer$1(value),\n      isType = !isArr && !isArg && !isBuff && isTypedArray$1(value),\n      skipIndexes = isArr || isArg || isBuff || isType,\n      result = skipIndexes ? baseTimes(value.length, String) : [],\n      length = result.length\n\n    for (var key in value) {\n      if (\n        (inherited || hasOwnProperty$c.call(value, key)) &&\n        !(\n          skipIndexes &&\n          // Safari 9 has enumerable `arguments.length` in strict mode.\n          (key == 'length' ||\n            // Node.js 0.10 has enumerable non-index properties on buffers.\n            (isBuff && (key == 'offset' || key == 'parent')) ||\n            // PhantomJS 2 has enumerable non-index properties on typed arrays.\n            (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||\n            // Skip index properties.\n            isIndex(key, length))\n        )\n      ) {\n        result.push(key)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates a unary function that invokes `func` with its argument transformed.\n   *\n   * @private\n   * @param {Function} func The function to wrap.\n   * @param {Function} transform The argument transform.\n   * @returns {Function} Returns the new function.\n   */\n  function overArg(func, transform) {\n    return function (arg) {\n      return func(transform(arg))\n    }\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeKeys = overArg(Object.keys, Object)\n\n  const nativeKeys$1 = nativeKeys\n\n  /** Used for built-in method references. */\n  var objectProto$c = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$b = objectProto$c.hasOwnProperty\n\n  /**\n   * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeys(object) {\n    if (!isPrototype(object)) {\n      return nativeKeys$1(object)\n    }\n    var result = []\n    for (var key in Object(object)) {\n      if (hasOwnProperty$b.call(object, key) && key != 'constructor') {\n        result.push(key)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates an array of the own enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects. See the\n   * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * for more details.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keys(new Foo);\n   * // => ['a', 'b'] (iteration order is not guaranteed)\n   *\n   * _.keys('hi');\n   * // => ['0', '1']\n   */\n  function keys(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object)\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$b = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$a = objectProto$b.hasOwnProperty\n\n  /**\n   * Assigns own enumerable string keyed properties of source objects to the\n   * destination object. Source objects are applied from left to right.\n   * Subsequent sources overwrite property assignments of previous sources.\n   *\n   * **Note:** This method mutates `object` and is loosely based on\n   * [`Object.assign`](https://mdn.io/Object/assign).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.10.0\n   * @category Object\n   * @param {Object} object The destination object.\n   * @param {...Object} [sources] The source objects.\n   * @returns {Object} Returns `object`.\n   * @see _.assignIn\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   * }\n   *\n   * function Bar() {\n   *   this.c = 3;\n   * }\n   *\n   * Foo.prototype.b = 2;\n   * Bar.prototype.d = 4;\n   *\n   * _.assign({ 'a': 0 }, new Foo, new Bar);\n   * // => { 'a': 1, 'c': 3 }\n   */\n  var assign = createAssigner(function (object, source) {\n    if (isPrototype(source) || isArrayLike(source)) {\n      copyObject(source, keys(source), object)\n      return\n    }\n    for (var key in source) {\n      if (hasOwnProperty$a.call(source, key)) {\n        assignValue(object, key, source[key])\n      }\n    }\n  })\n\n  const assign$1 = assign\n\n  /**\n   * This function is like\n   * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)\n   * except that it includes inherited enumerable properties.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function nativeKeysIn(object) {\n    var result = []\n    if (object != null) {\n      for (var key in Object(object)) {\n        result.push(key)\n      }\n    }\n    return result\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$a = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$9 = objectProto$a.hasOwnProperty\n\n  /**\n   * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   */\n  function baseKeysIn(object) {\n    if (!isObject(object)) {\n      return nativeKeysIn(object)\n    }\n    var isProto = isPrototype(object),\n      result = []\n\n    for (var key in object) {\n      if (!(key == 'constructor' && (isProto || !hasOwnProperty$9.call(object, key)))) {\n        result.push(key)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates an array of the own and inherited enumerable property names of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.keysIn(new Foo);\n   * // => ['a', 'b', 'c'] (iteration order is not guaranteed)\n   */\n  function keysIn(object) {\n    return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object)\n  }\n\n  /** Used to match property names within property paths. */\n  var reIsDeepProp = /\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,\n    reIsPlainProp = /^\\w*$/\n\n  /**\n   * Checks if `value` is a property name and not a property path.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @param {Object} [object] The object to query keys on.\n   * @returns {boolean} Returns `true` if `value` is a property name, else `false`.\n   */\n  function isKey(value, object) {\n    if (isArray$1(value)) {\n      return false\n    }\n    var type = typeof value\n    if (type == 'number' || type == 'symbol' || type == 'boolean' || value == null || isSymbol(value)) {\n      return true\n    }\n    return reIsPlainProp.test(value) || !reIsDeepProp.test(value) || (object != null && value in Object(object))\n  }\n\n  /* Built-in method references that are verified to be native. */\n  var nativeCreate = getNative(Object, 'create')\n\n  const nativeCreate$1 = nativeCreate\n\n  /**\n   * Removes all key-value entries from the hash.\n   *\n   * @private\n   * @name clear\n   * @memberOf Hash\n   */\n  function hashClear() {\n    this.__data__ = nativeCreate$1 ? nativeCreate$1(null) : {}\n    this.size = 0\n  }\n\n  /**\n   * Removes `key` and its value from the hash.\n   *\n   * @private\n   * @name delete\n   * @memberOf Hash\n   * @param {Object} hash The hash to modify.\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function hashDelete(key) {\n    var result = this.has(key) && delete this.__data__[key]\n    this.size -= result ? 1 : 0\n    return result\n  }\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED$2 = '__lodash_hash_undefined__'\n\n  /** Used for built-in method references. */\n  var objectProto$9 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$8 = objectProto$9.hasOwnProperty\n\n  /**\n   * Gets the hash value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Hash\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function hashGet(key) {\n    var data = this.__data__\n    if (nativeCreate$1) {\n      var result = data[key]\n      return result === HASH_UNDEFINED$2 ? undefined : result\n    }\n    return hasOwnProperty$8.call(data, key) ? data[key] : undefined\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$8 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$7 = objectProto$8.hasOwnProperty\n\n  /**\n   * Checks if a hash value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Hash\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function hashHas(key) {\n    var data = this.__data__\n    return nativeCreate$1 ? data[key] !== undefined : hasOwnProperty$7.call(data, key)\n  }\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED$1 = '__lodash_hash_undefined__'\n\n  /**\n   * Sets the hash `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Hash\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the hash instance.\n   */\n  function hashSet(key, value) {\n    var data = this.__data__\n    this.size += this.has(key) ? 0 : 1\n    data[key] = nativeCreate$1 && value === undefined ? HASH_UNDEFINED$1 : value\n    return this\n  }\n\n  /**\n   * Creates a hash object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Hash(entries) {\n    var index = -1,\n      length = entries == null ? 0 : entries.length\n\n    this.clear()\n    while (++index < length) {\n      var entry = entries[index]\n      this.set(entry[0], entry[1])\n    }\n  }\n\n  // Add methods to `Hash`.\n  Hash.prototype.clear = hashClear\n  Hash.prototype['delete'] = hashDelete\n  Hash.prototype.get = hashGet\n  Hash.prototype.has = hashHas\n  Hash.prototype.set = hashSet\n\n  /**\n   * Removes all key-value entries from the list cache.\n   *\n   * @private\n   * @name clear\n   * @memberOf ListCache\n   */\n  function listCacheClear() {\n    this.__data__ = []\n    this.size = 0\n  }\n\n  /**\n   * Gets the index at which the `key` is found in `array` of key-value pairs.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {*} key The key to search for.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   */\n  function assocIndexOf(array, key) {\n    var length = array.length\n    while (length--) {\n      if (eq(array[length][0], key)) {\n        return length\n      }\n    }\n    return -1\n  }\n\n  /** Used for built-in method references. */\n  var arrayProto = Array.prototype\n\n  /** Built-in value references. */\n  var splice = arrayProto.splice\n\n  /**\n   * Removes `key` and its value from the list cache.\n   *\n   * @private\n   * @name delete\n   * @memberOf ListCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function listCacheDelete(key) {\n    var data = this.__data__,\n      index = assocIndexOf(data, key)\n\n    if (index < 0) {\n      return false\n    }\n    var lastIndex = data.length - 1\n    if (index == lastIndex) {\n      data.pop()\n    } else {\n      splice.call(data, index, 1)\n    }\n    --this.size\n    return true\n  }\n\n  /**\n   * Gets the list cache value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf ListCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function listCacheGet(key) {\n    var data = this.__data__,\n      index = assocIndexOf(data, key)\n\n    return index < 0 ? undefined : data[index][1]\n  }\n\n  /**\n   * Checks if a list cache value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf ListCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function listCacheHas(key) {\n    return assocIndexOf(this.__data__, key) > -1\n  }\n\n  /**\n   * Sets the list cache `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf ListCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the list cache instance.\n   */\n  function listCacheSet(key, value) {\n    var data = this.__data__,\n      index = assocIndexOf(data, key)\n\n    if (index < 0) {\n      ++this.size\n      data.push([key, value])\n    } else {\n      data[index][1] = value\n    }\n    return this\n  }\n\n  /**\n   * Creates an list cache object.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function ListCache(entries) {\n    var index = -1,\n      length = entries == null ? 0 : entries.length\n\n    this.clear()\n    while (++index < length) {\n      var entry = entries[index]\n      this.set(entry[0], entry[1])\n    }\n  }\n\n  // Add methods to `ListCache`.\n  ListCache.prototype.clear = listCacheClear\n  ListCache.prototype['delete'] = listCacheDelete\n  ListCache.prototype.get = listCacheGet\n  ListCache.prototype.has = listCacheHas\n  ListCache.prototype.set = listCacheSet\n\n  /* Built-in method references that are verified to be native. */\n  var Map$1 = getNative(root$1, 'Map')\n\n  const Map$2 = Map$1\n\n  /**\n   * Removes all key-value entries from the map.\n   *\n   * @private\n   * @name clear\n   * @memberOf MapCache\n   */\n  function mapCacheClear() {\n    this.size = 0\n    this.__data__ = {\n      hash: new Hash(),\n      map: new (Map$2 || ListCache)(),\n      string: new Hash(),\n    }\n  }\n\n  /**\n   * Checks if `value` is suitable for use as unique object key.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is suitable, else `false`.\n   */\n  function isKeyable(value) {\n    var type = typeof value\n    return type == 'string' || type == 'number' || type == 'symbol' || type == 'boolean'\n      ? value !== '__proto__'\n      : value === null\n  }\n\n  /**\n   * Gets the data for `map`.\n   *\n   * @private\n   * @param {Object} map The map to query.\n   * @param {string} key The reference key.\n   * @returns {*} Returns the map data.\n   */\n  function getMapData(map, key) {\n    var data = map.__data__\n    return isKeyable(key) ? data[typeof key == 'string' ? 'string' : 'hash'] : data.map\n  }\n\n  /**\n   * Removes `key` and its value from the map.\n   *\n   * @private\n   * @name delete\n   * @memberOf MapCache\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function mapCacheDelete(key) {\n    var result = getMapData(this, key)['delete'](key)\n    this.size -= result ? 1 : 0\n    return result\n  }\n\n  /**\n   * Gets the map value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf MapCache\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function mapCacheGet(key) {\n    return getMapData(this, key).get(key)\n  }\n\n  /**\n   * Checks if a map value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf MapCache\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function mapCacheHas(key) {\n    return getMapData(this, key).has(key)\n  }\n\n  /**\n   * Sets the map `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf MapCache\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the map cache instance.\n   */\n  function mapCacheSet(key, value) {\n    var data = getMapData(this, key),\n      size = data.size\n\n    data.set(key, value)\n    this.size += data.size == size ? 0 : 1\n    return this\n  }\n\n  /**\n   * Creates a map cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function MapCache(entries) {\n    var index = -1,\n      length = entries == null ? 0 : entries.length\n\n    this.clear()\n    while (++index < length) {\n      var entry = entries[index]\n      this.set(entry[0], entry[1])\n    }\n  }\n\n  // Add methods to `MapCache`.\n  MapCache.prototype.clear = mapCacheClear\n  MapCache.prototype['delete'] = mapCacheDelete\n  MapCache.prototype.get = mapCacheGet\n  MapCache.prototype.has = mapCacheHas\n  MapCache.prototype.set = mapCacheSet\n\n  /** Error message constants. */\n  var FUNC_ERROR_TEXT$1 = 'Expected a function'\n\n  /**\n   * Creates a function that memoizes the result of `func`. If `resolver` is\n   * provided, it determines the cache key for storing the result based on the\n   * arguments provided to the memoized function. By default, the first argument\n   * provided to the memoized function is used as the map cache key. The `func`\n   * is invoked with the `this` binding of the memoized function.\n   *\n   * **Note:** The cache is exposed as the `cache` property on the memoized\n   * function. Its creation may be customized by replacing the `_.memoize.Cache`\n   * constructor with one whose instances implement the\n   * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)\n   * method interface of `clear`, `delete`, `get`, `has`, and `set`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Function\n   * @param {Function} func The function to have its output memoized.\n   * @param {Function} [resolver] The function to resolve the cache key.\n   * @returns {Function} Returns the new memoized function.\n   * @example\n   *\n   * var object = { 'a': 1, 'b': 2 };\n   * var other = { 'c': 3, 'd': 4 };\n   *\n   * var values = _.memoize(_.values);\n   * values(object);\n   * // => [1, 2]\n   *\n   * values(other);\n   * // => [3, 4]\n   *\n   * object.a = 2;\n   * values(object);\n   * // => [1, 2]\n   *\n   * // Modify the result cache.\n   * values.cache.set(object, ['a', 'b']);\n   * values(object);\n   * // => ['a', 'b']\n   *\n   * // Replace `_.memoize.Cache`.\n   * _.memoize.Cache = WeakMap;\n   */\n  function memoize(func, resolver) {\n    if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {\n      throw new TypeError(FUNC_ERROR_TEXT$1)\n    }\n    var memoized = function () {\n      var args = arguments,\n        key = resolver ? resolver.apply(this, args) : args[0],\n        cache = memoized.cache\n\n      if (cache.has(key)) {\n        return cache.get(key)\n      }\n      var result = func.apply(this, args)\n      memoized.cache = cache.set(key, result) || cache\n      return result\n    }\n    memoized.cache = new (memoize.Cache || MapCache)()\n    return memoized\n  }\n\n  // Expose `MapCache`.\n  memoize.Cache = MapCache\n\n  /** Used as the maximum memoize cache size. */\n  var MAX_MEMOIZE_SIZE = 500\n\n  /**\n   * A specialized version of `_.memoize` which clears the memoized function's\n   * cache when it exceeds `MAX_MEMOIZE_SIZE`.\n   *\n   * @private\n   * @param {Function} func The function to have its output memoized.\n   * @returns {Function} Returns the new memoized function.\n   */\n  function memoizeCapped(func) {\n    var result = memoize(func, function (key) {\n      if (cache.size === MAX_MEMOIZE_SIZE) {\n        cache.clear()\n      }\n      return key\n    })\n\n    var cache = result.cache\n    return result\n  }\n\n  /** Used to match property names within property paths. */\n  var rePropName = /[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g\n\n  /** Used to match backslashes in property paths. */\n  var reEscapeChar = /\\\\(\\\\)?/g\n\n  /**\n   * Converts `string` to a property path array.\n   *\n   * @private\n   * @param {string} string The string to convert.\n   * @returns {Array} Returns the property path array.\n   */\n  var stringToPath = memoizeCapped(function (string) {\n    var result = []\n    if (string.charCodeAt(0) === 46 /* . */) {\n      result.push('')\n    }\n    string.replace(rePropName, function (match, number, quote, subString) {\n      result.push(quote ? subString.replace(reEscapeChar, '$1') : number || match)\n    })\n    return result\n  })\n\n  const stringToPath$1 = stringToPath\n\n  /**\n   * Converts `value` to a string. An empty string is returned for `null`\n   * and `undefined` values. The sign of `-0` is preserved.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to convert.\n   * @returns {string} Returns the converted string.\n   * @example\n   *\n   * _.toString(null);\n   * // => ''\n   *\n   * _.toString(-0);\n   * // => '-0'\n   *\n   * _.toString([1, 2, 3]);\n   * // => '1,2,3'\n   */\n  function toString(value) {\n    return value == null ? '' : baseToString(value)\n  }\n\n  /**\n   * Casts `value` to a path array if it's not one.\n   *\n   * @private\n   * @param {*} value The value to inspect.\n   * @param {Object} [object] The object to query keys on.\n   * @returns {Array} Returns the cast property path array.\n   */\n  function castPath(value, object) {\n    if (isArray$1(value)) {\n      return value\n    }\n    return isKey(value, object) ? [value] : stringToPath$1(toString(value))\n  }\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY$1 = 1 / 0\n\n  /**\n   * Converts `value` to a string key if it's not a string or symbol.\n   *\n   * @private\n   * @param {*} value The value to inspect.\n   * @returns {string|symbol} Returns the key.\n   */\n  function toKey(value) {\n    if (typeof value == 'string' || isSymbol(value)) {\n      return value\n    }\n    var result = value + ''\n    return result == '0' && 1 / value == -INFINITY$1 ? '-0' : result\n  }\n\n  /**\n   * The base implementation of `_.get` without support for default values.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path of the property to get.\n   * @returns {*} Returns the resolved value.\n   */\n  function baseGet(object, path) {\n    path = castPath(path, object)\n\n    var index = 0,\n      length = path.length\n\n    while (object != null && index < length) {\n      object = object[toKey(path[index++])]\n    }\n    return index && index == length ? object : undefined\n  }\n\n  /**\n   * Gets the value at `path` of `object`. If the resolved value is\n   * `undefined`, the `defaultValue` is returned in its place.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.7.0\n   * @category Object\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path of the property to get.\n   * @param {*} [defaultValue] The value returned for `undefined` resolved values.\n   * @returns {*} Returns the resolved value.\n   * @example\n   *\n   * var object = { 'a': [{ 'b': { 'c': 3 } }] };\n   *\n   * _.get(object, 'a[0].b.c');\n   * // => 3\n   *\n   * _.get(object, ['a', '0', 'b', 'c']);\n   * // => 3\n   *\n   * _.get(object, 'a.b.c', 'default');\n   * // => 'default'\n   */\n  function get(object, path, defaultValue) {\n    var result = object == null ? undefined : baseGet(object, path)\n    return result === undefined ? defaultValue : result\n  }\n\n  /**\n   * Appends the elements of `values` to `array`.\n   *\n   * @private\n   * @param {Array} array The array to modify.\n   * @param {Array} values The values to append.\n   * @returns {Array} Returns `array`.\n   */\n  function arrayPush(array, values) {\n    var index = -1,\n      length = values.length,\n      offset = array.length\n\n    while (++index < length) {\n      array[offset + index] = values[index]\n    }\n    return array\n  }\n\n  /** Built-in value references. */\n  var spreadableSymbol = Symbol$2 ? Symbol$2.isConcatSpreadable : undefined\n\n  /**\n   * Checks if `value` is a flattenable `arguments` object or array.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.\n   */\n  function isFlattenable(value) {\n    return isArray$1(value) || isArguments$1(value) || !!(spreadableSymbol && value && value[spreadableSymbol])\n  }\n\n  /**\n   * The base implementation of `_.flatten` with support for restricting flattening.\n   *\n   * @private\n   * @param {Array} array The array to flatten.\n   * @param {number} depth The maximum recursion depth.\n   * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.\n   * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.\n   * @param {Array} [result=[]] The initial result value.\n   * @returns {Array} Returns the new flattened array.\n   */\n  function baseFlatten(array, depth, predicate, isStrict, result) {\n    var index = -1,\n      length = array.length\n\n    predicate || (predicate = isFlattenable)\n    result || (result = [])\n\n    while (++index < length) {\n      var value = array[index]\n      if (depth > 0 && predicate(value)) {\n        if (depth > 1) {\n          // Recursively flatten arrays (susceptible to call stack limits).\n          baseFlatten(value, depth - 1, predicate, isStrict, result)\n        } else {\n          arrayPush(result, value)\n        }\n      } else if (!isStrict) {\n        result[result.length] = value\n      }\n    }\n    return result\n  }\n\n  /**\n   * Flattens `array` a single level deep.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to flatten.\n   * @returns {Array} Returns the new flattened array.\n   * @example\n   *\n   * _.flatten([1, [2, [3, [4]], 5]]);\n   * // => [1, 2, [3, [4]], 5]\n   */\n  function flatten(array) {\n    var length = array == null ? 0 : array.length\n    return length ? baseFlatten(array, 1) : []\n  }\n\n  /** Built-in value references. */\n  var getPrototype = overArg(Object.getPrototypeOf, Object)\n\n  const getPrototype$1 = getPrototype\n\n  /**\n   * The base implementation of `_.slice` without an iteratee call guard.\n   *\n   * @private\n   * @param {Array} array The array to slice.\n   * @param {number} [start=0] The start position.\n   * @param {number} [end=array.length] The end position.\n   * @returns {Array} Returns the slice of `array`.\n   */\n  function baseSlice(array, start, end) {\n    var index = -1,\n      length = array.length\n\n    if (start < 0) {\n      start = -start > length ? 0 : length + start\n    }\n    end = end > length ? length : end\n    if (end < 0) {\n      end += length\n    }\n    length = start > end ? 0 : (end - start) >>> 0\n    start >>>= 0\n\n    var result = Array(length)\n    while (++index < length) {\n      result[index] = array[index + start]\n    }\n    return result\n  }\n\n  /**\n   * A specialized version of `_.reduce` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @param {boolean} [initAccum] Specify using the first element of `array` as\n   *  the initial value.\n   * @returns {*} Returns the accumulated value.\n   */\n  function arrayReduce(array, iteratee, accumulator, initAccum) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    if (initAccum && length) {\n      accumulator = array[++index]\n    }\n    while (++index < length) {\n      accumulator = iteratee(accumulator, array[index], index, array)\n    }\n    return accumulator\n  }\n\n  /**\n   * Removes all key-value entries from the stack.\n   *\n   * @private\n   * @name clear\n   * @memberOf Stack\n   */\n  function stackClear() {\n    this.__data__ = new ListCache()\n    this.size = 0\n  }\n\n  /**\n   * Removes `key` and its value from the stack.\n   *\n   * @private\n   * @name delete\n   * @memberOf Stack\n   * @param {string} key The key of the value to remove.\n   * @returns {boolean} Returns `true` if the entry was removed, else `false`.\n   */\n  function stackDelete(key) {\n    var data = this.__data__,\n      result = data['delete'](key)\n\n    this.size = data.size\n    return result\n  }\n\n  /**\n   * Gets the stack value for `key`.\n   *\n   * @private\n   * @name get\n   * @memberOf Stack\n   * @param {string} key The key of the value to get.\n   * @returns {*} Returns the entry value.\n   */\n  function stackGet(key) {\n    return this.__data__.get(key)\n  }\n\n  /**\n   * Checks if a stack value for `key` exists.\n   *\n   * @private\n   * @name has\n   * @memberOf Stack\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function stackHas(key) {\n    return this.__data__.has(key)\n  }\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE$2 = 200\n\n  /**\n   * Sets the stack `key` to `value`.\n   *\n   * @private\n   * @name set\n   * @memberOf Stack\n   * @param {string} key The key of the value to set.\n   * @param {*} value The value to set.\n   * @returns {Object} Returns the stack cache instance.\n   */\n  function stackSet(key, value) {\n    var data = this.__data__\n    if (data instanceof ListCache) {\n      var pairs = data.__data__\n      if (!Map$2 || pairs.length < LARGE_ARRAY_SIZE$2 - 1) {\n        pairs.push([key, value])\n        this.size = ++data.size\n        return this\n      }\n      data = this.__data__ = new MapCache(pairs)\n    }\n    data.set(key, value)\n    this.size = data.size\n    return this\n  }\n\n  /**\n   * Creates a stack cache object to store key-value pairs.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [entries] The key-value pairs to cache.\n   */\n  function Stack(entries) {\n    var data = (this.__data__ = new ListCache(entries))\n    this.size = data.size\n  }\n\n  // Add methods to `Stack`.\n  Stack.prototype.clear = stackClear\n  Stack.prototype['delete'] = stackDelete\n  Stack.prototype.get = stackGet\n  Stack.prototype.has = stackHas\n  Stack.prototype.set = stackSet\n\n  /**\n   * The base implementation of `_.assign` without support for multiple sources\n   * or `customizer` functions.\n   *\n   * @private\n   * @param {Object} object The destination object.\n   * @param {Object} source The source object.\n   * @returns {Object} Returns `object`.\n   */\n  function baseAssign(object, source) {\n    return object && copyObject(source, keys(source), object)\n  }\n\n  /**\n   * The base implementation of `_.assignIn` without support for multiple sources\n   * or `customizer` functions.\n   *\n   * @private\n   * @param {Object} object The destination object.\n   * @param {Object} source The source object.\n   * @returns {Object} Returns `object`.\n   */\n  function baseAssignIn(object, source) {\n    return object && copyObject(source, keysIn(source), object)\n  }\n\n  /** Detect free variable `exports`. */\n  var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports\n\n  /** Detect free variable `module`. */\n  var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module\n\n  /** Detect the popular CommonJS extension `module.exports`. */\n  var moduleExports = freeModule && freeModule.exports === freeExports\n\n  /** Built-in value references. */\n  var Buffer = moduleExports ? root$1.Buffer : undefined,\n    allocUnsafe = Buffer ? Buffer.allocUnsafe : undefined\n\n  /**\n   * Creates a clone of  `buffer`.\n   *\n   * @private\n   * @param {Buffer} buffer The buffer to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Buffer} Returns the cloned buffer.\n   */\n  function cloneBuffer(buffer, isDeep) {\n    if (isDeep) {\n      return buffer.slice()\n    }\n    var length = buffer.length,\n      result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length)\n\n    buffer.copy(result)\n    return result\n  }\n\n  /**\n   * A specialized version of `_.filter` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function arrayFilter(array, predicate) {\n    var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = []\n\n    while (++index < length) {\n      var value = array[index]\n      if (predicate(value, index, array)) {\n        result[resIndex++] = value\n      }\n    }\n    return result\n  }\n\n  /**\n   * This method returns a new empty array.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.13.0\n   * @category Util\n   * @returns {Array} Returns the new empty array.\n   * @example\n   *\n   * var arrays = _.times(2, _.stubArray);\n   *\n   * console.log(arrays);\n   * // => [[], []]\n   *\n   * console.log(arrays[0] === arrays[1]);\n   * // => false\n   */\n  function stubArray() {\n    return []\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$7 = Object.prototype\n\n  /** Built-in value references. */\n  var propertyIsEnumerable = objectProto$7.propertyIsEnumerable\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeGetSymbols$1 = Object.getOwnPropertySymbols\n\n  /**\n   * Creates an array of the own enumerable symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of symbols.\n   */\n  var getSymbols = !nativeGetSymbols$1\n    ? stubArray\n    : function (object) {\n        if (object == null) {\n          return []\n        }\n        object = Object(object)\n        return arrayFilter(nativeGetSymbols$1(object), function (symbol) {\n          return propertyIsEnumerable.call(object, symbol)\n        })\n      }\n\n  const getSymbols$1 = getSymbols\n\n  /**\n   * Copies own symbols of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy symbols from.\n   * @param {Object} [object={}] The object to copy symbols to.\n   * @returns {Object} Returns `object`.\n   */\n  function copySymbols(source, object) {\n    return copyObject(source, getSymbols$1(source), object)\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeGetSymbols = Object.getOwnPropertySymbols\n\n  /**\n   * Creates an array of the own and inherited enumerable symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of symbols.\n   */\n  var getSymbolsIn = !nativeGetSymbols\n    ? stubArray\n    : function (object) {\n        var result = []\n        while (object) {\n          arrayPush(result, getSymbols$1(object))\n          object = getPrototype$1(object)\n        }\n        return result\n      }\n\n  const getSymbolsIn$1 = getSymbolsIn\n\n  /**\n   * Copies own and inherited symbols of `source` to `object`.\n   *\n   * @private\n   * @param {Object} source The object to copy symbols from.\n   * @param {Object} [object={}] The object to copy symbols to.\n   * @returns {Object} Returns `object`.\n   */\n  function copySymbolsIn(source, object) {\n    return copyObject(source, getSymbolsIn$1(source), object)\n  }\n\n  /**\n   * The base implementation of `getAllKeys` and `getAllKeysIn` which uses\n   * `keysFunc` and `symbolsFunc` to get the enumerable property names and\n   * symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @param {Function} symbolsFunc The function to get the symbols of `object`.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function baseGetAllKeys(object, keysFunc, symbolsFunc) {\n    var result = keysFunc(object)\n    return isArray$1(object) ? result : arrayPush(result, symbolsFunc(object))\n  }\n\n  /**\n   * Creates an array of own enumerable property names and symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function getAllKeys(object) {\n    return baseGetAllKeys(object, keys, getSymbols$1)\n  }\n\n  /**\n   * Creates an array of own and inherited enumerable property names and\n   * symbols of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property names and symbols.\n   */\n  function getAllKeysIn(object) {\n    return baseGetAllKeys(object, keysIn, getSymbolsIn$1)\n  }\n\n  /* Built-in method references that are verified to be native. */\n  var DataView = getNative(root$1, 'DataView')\n\n  const DataView$1 = DataView\n\n  /* Built-in method references that are verified to be native. */\n  var Promise$1 = getNative(root$1, 'Promise')\n\n  const Promise$2 = Promise$1\n\n  /* Built-in method references that are verified to be native. */\n  var Set = getNative(root$1, 'Set')\n\n  const Set$1 = Set\n\n  /** `Object#toString` result references. */\n  var mapTag$5 = '[object Map]',\n    objectTag$2 = '[object Object]',\n    promiseTag = '[object Promise]',\n    setTag$5 = '[object Set]',\n    weakMapTag$1 = '[object WeakMap]'\n\n  var dataViewTag$3 = '[object DataView]'\n\n  /** Used to detect maps, sets, and weakmaps. */\n  var dataViewCtorString = toSource(DataView$1),\n    mapCtorString = toSource(Map$2),\n    promiseCtorString = toSource(Promise$2),\n    setCtorString = toSource(Set$1),\n    weakMapCtorString = toSource(WeakMap$1)\n\n  /**\n   * Gets the `toStringTag` of `value`.\n   *\n   * @private\n   * @param {*} value The value to query.\n   * @returns {string} Returns the `toStringTag`.\n   */\n  var getTag = baseGetTag\n\n  // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.\n  if (\n    (DataView$1 && getTag(new DataView$1(new ArrayBuffer(1))) != dataViewTag$3) ||\n    (Map$2 && getTag(new Map$2()) != mapTag$5) ||\n    (Promise$2 && getTag(Promise$2.resolve()) != promiseTag) ||\n    (Set$1 && getTag(new Set$1()) != setTag$5) ||\n    (WeakMap$1 && getTag(new WeakMap$1()) != weakMapTag$1)\n  ) {\n    getTag = function (value) {\n      var result = baseGetTag(value),\n        Ctor = result == objectTag$2 ? value.constructor : undefined,\n        ctorString = Ctor ? toSource(Ctor) : ''\n\n      if (ctorString) {\n        switch (ctorString) {\n          case dataViewCtorString:\n            return dataViewTag$3\n          case mapCtorString:\n            return mapTag$5\n          case promiseCtorString:\n            return promiseTag\n          case setCtorString:\n            return setTag$5\n          case weakMapCtorString:\n            return weakMapTag$1\n        }\n      }\n      return result\n    }\n  }\n\n  const getTag$1 = getTag\n\n  /** Used for built-in method references. */\n  var objectProto$6 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$6 = objectProto$6.hasOwnProperty\n\n  /**\n   * Initializes an array clone.\n   *\n   * @private\n   * @param {Array} array The array to clone.\n   * @returns {Array} Returns the initialized clone.\n   */\n  function initCloneArray(array) {\n    var length = array.length,\n      result = new array.constructor(length)\n\n    // Add properties assigned by `RegExp#exec`.\n    if (length && typeof array[0] == 'string' && hasOwnProperty$6.call(array, 'index')) {\n      result.index = array.index\n      result.input = array.input\n    }\n    return result\n  }\n\n  /** Built-in value references. */\n  var Uint8Array = root$1.Uint8Array\n\n  const Uint8Array$1 = Uint8Array\n\n  /**\n   * Creates a clone of `arrayBuffer`.\n   *\n   * @private\n   * @param {ArrayBuffer} arrayBuffer The array buffer to clone.\n   * @returns {ArrayBuffer} Returns the cloned array buffer.\n   */\n  function cloneArrayBuffer(arrayBuffer) {\n    var result = new arrayBuffer.constructor(arrayBuffer.byteLength)\n    new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer))\n    return result\n  }\n\n  /**\n   * Creates a clone of `dataView`.\n   *\n   * @private\n   * @param {Object} dataView The data view to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned data view.\n   */\n  function cloneDataView(dataView, isDeep) {\n    var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer\n    return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength)\n  }\n\n  /** Used to match `RegExp` flags from their coerced string values. */\n  var reFlags = /\\w*$/\n\n  /**\n   * Creates a clone of `regexp`.\n   *\n   * @private\n   * @param {Object} regexp The regexp to clone.\n   * @returns {Object} Returns the cloned regexp.\n   */\n  function cloneRegExp(regexp) {\n    var result = new regexp.constructor(regexp.source, reFlags.exec(regexp))\n    result.lastIndex = regexp.lastIndex\n    return result\n  }\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto$1 = Symbol$2 ? Symbol$2.prototype : undefined,\n    symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined\n\n  /**\n   * Creates a clone of the `symbol` object.\n   *\n   * @private\n   * @param {Object} symbol The symbol object to clone.\n   * @returns {Object} Returns the cloned symbol object.\n   */\n  function cloneSymbol(symbol) {\n    return symbolValueOf$1 ? Object(symbolValueOf$1.call(symbol)) : {}\n  }\n\n  /**\n   * Creates a clone of `typedArray`.\n   *\n   * @private\n   * @param {Object} typedArray The typed array to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the cloned typed array.\n   */\n  function cloneTypedArray(typedArray, isDeep) {\n    var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer\n    return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length)\n  }\n\n  /** `Object#toString` result references. */\n  var boolTag$2 = '[object Boolean]',\n    dateTag$2 = '[object Date]',\n    mapTag$4 = '[object Map]',\n    numberTag$2 = '[object Number]',\n    regexpTag$3 = '[object RegExp]',\n    setTag$4 = '[object Set]',\n    stringTag$3 = '[object String]',\n    symbolTag$2 = '[object Symbol]'\n\n  var arrayBufferTag$2 = '[object ArrayBuffer]',\n    dataViewTag$2 = '[object DataView]',\n    float32Tag$1 = '[object Float32Array]',\n    float64Tag$1 = '[object Float64Array]',\n    int8Tag$1 = '[object Int8Array]',\n    int16Tag$1 = '[object Int16Array]',\n    int32Tag$1 = '[object Int32Array]',\n    uint8Tag$1 = '[object Uint8Array]',\n    uint8ClampedTag$1 = '[object Uint8ClampedArray]',\n    uint16Tag$1 = '[object Uint16Array]',\n    uint32Tag$1 = '[object Uint32Array]'\n\n  /**\n   * Initializes an object clone based on its `toStringTag`.\n   *\n   * **Note:** This function only supports cloning values with tags of\n   * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.\n   *\n   * @private\n   * @param {Object} object The object to clone.\n   * @param {string} tag The `toStringTag` of the object to clone.\n   * @param {boolean} [isDeep] Specify a deep clone.\n   * @returns {Object} Returns the initialized clone.\n   */\n  function initCloneByTag(object, tag, isDeep) {\n    var Ctor = object.constructor\n    switch (tag) {\n      case arrayBufferTag$2:\n        return cloneArrayBuffer(object)\n\n      case boolTag$2:\n      case dateTag$2:\n        return new Ctor(+object)\n\n      case dataViewTag$2:\n        return cloneDataView(object, isDeep)\n\n      case float32Tag$1:\n      case float64Tag$1:\n      case int8Tag$1:\n      case int16Tag$1:\n      case int32Tag$1:\n      case uint8Tag$1:\n      case uint8ClampedTag$1:\n      case uint16Tag$1:\n      case uint32Tag$1:\n        return cloneTypedArray(object, isDeep)\n\n      case mapTag$4:\n        return new Ctor()\n\n      case numberTag$2:\n      case stringTag$3:\n        return new Ctor(object)\n\n      case regexpTag$3:\n        return cloneRegExp(object)\n\n      case setTag$4:\n        return new Ctor()\n\n      case symbolTag$2:\n        return cloneSymbol(object)\n    }\n  }\n\n  /**\n   * Initializes an object clone.\n   *\n   * @private\n   * @param {Object} object The object to clone.\n   * @returns {Object} Returns the initialized clone.\n   */\n  function initCloneObject(object) {\n    return typeof object.constructor == 'function' && !isPrototype(object) ? baseCreate$1(getPrototype$1(object)) : {}\n  }\n\n  /** `Object#toString` result references. */\n  var mapTag$3 = '[object Map]'\n\n  /**\n   * The base implementation of `_.isMap` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n   */\n  function baseIsMap(value) {\n    return isObjectLike(value) && getTag$1(value) == mapTag$3\n  }\n\n  /* Node.js helper references. */\n  var nodeIsMap = nodeUtil$1 && nodeUtil$1.isMap\n\n  /**\n   * Checks if `value` is classified as a `Map` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.3.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a map, else `false`.\n   * @example\n   *\n   * _.isMap(new Map);\n   * // => true\n   *\n   * _.isMap(new WeakMap);\n   * // => false\n   */\n  var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap\n\n  const isMap$1 = isMap\n\n  /** `Object#toString` result references. */\n  var setTag$3 = '[object Set]'\n\n  /**\n   * The base implementation of `_.isSet` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n   */\n  function baseIsSet(value) {\n    return isObjectLike(value) && getTag$1(value) == setTag$3\n  }\n\n  /* Node.js helper references. */\n  var nodeIsSet = nodeUtil$1 && nodeUtil$1.isSet\n\n  /**\n   * Checks if `value` is classified as a `Set` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.3.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a set, else `false`.\n   * @example\n   *\n   * _.isSet(new Set);\n   * // => true\n   *\n   * _.isSet(new WeakSet);\n   * // => false\n   */\n  var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet\n\n  const isSet$1 = isSet\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_DEEP_FLAG = 1,\n    CLONE_FLAT_FLAG = 2,\n    CLONE_SYMBOLS_FLAG$1 = 4\n\n  /** `Object#toString` result references. */\n  var argsTag$1 = '[object Arguments]',\n    arrayTag$1 = '[object Array]',\n    boolTag$1 = '[object Boolean]',\n    dateTag$1 = '[object Date]',\n    errorTag$1 = '[object Error]',\n    funcTag = '[object Function]',\n    genTag = '[object GeneratorFunction]',\n    mapTag$2 = '[object Map]',\n    numberTag$1 = '[object Number]',\n    objectTag$1 = '[object Object]',\n    regexpTag$2 = '[object RegExp]',\n    setTag$2 = '[object Set]',\n    stringTag$2 = '[object String]',\n    symbolTag$1 = '[object Symbol]',\n    weakMapTag = '[object WeakMap]'\n\n  var arrayBufferTag$1 = '[object ArrayBuffer]',\n    dataViewTag$1 = '[object DataView]',\n    float32Tag = '[object Float32Array]',\n    float64Tag = '[object Float64Array]',\n    int8Tag = '[object Int8Array]',\n    int16Tag = '[object Int16Array]',\n    int32Tag = '[object Int32Array]',\n    uint8Tag = '[object Uint8Array]',\n    uint8ClampedTag = '[object Uint8ClampedArray]',\n    uint16Tag = '[object Uint16Array]',\n    uint32Tag = '[object Uint32Array]'\n\n  /** Used to identify `toStringTag` values supported by `_.clone`. */\n  var cloneableTags = {}\n  cloneableTags[argsTag$1] = cloneableTags[arrayTag$1] = cloneableTags[arrayBufferTag$1] = cloneableTags[\n    dataViewTag$1\n  ] = cloneableTags[boolTag$1] = cloneableTags[dateTag$1] = cloneableTags[float32Tag] = cloneableTags[\n    float64Tag\n  ] = cloneableTags[int8Tag] = cloneableTags[int16Tag] = cloneableTags[int32Tag] = cloneableTags[\n    mapTag$2\n  ] = cloneableTags[numberTag$1] = cloneableTags[objectTag$1] = cloneableTags[regexpTag$2] = cloneableTags[\n    setTag$2\n  ] = cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] = cloneableTags[uint8Tag] = cloneableTags[\n    uint8ClampedTag\n  ] = cloneableTags[uint16Tag] = cloneableTags[uint32Tag] = true\n  cloneableTags[errorTag$1] = cloneableTags[funcTag] = cloneableTags[weakMapTag] = false\n\n  /**\n   * The base implementation of `_.clone` and `_.cloneDeep` which tracks\n   * traversed objects.\n   *\n   * @private\n   * @param {*} value The value to clone.\n   * @param {boolean} bitmask The bitmask flags.\n   *  1 - Deep clone\n   *  2 - Flatten inherited properties\n   *  4 - Clone symbols\n   * @param {Function} [customizer] The function to customize cloning.\n   * @param {string} [key] The key of `value`.\n   * @param {Object} [object] The parent object of `value`.\n   * @param {Object} [stack] Tracks traversed objects and their clone counterparts.\n   * @returns {*} Returns the cloned value.\n   */\n  function baseClone(value, bitmask, customizer, key, object, stack) {\n    var result,\n      isDeep = bitmask & CLONE_DEEP_FLAG,\n      isFlat = bitmask & CLONE_FLAT_FLAG,\n      isFull = bitmask & CLONE_SYMBOLS_FLAG$1\n\n    if (customizer) {\n      result = object ? customizer(value, key, object, stack) : customizer(value)\n    }\n    if (result !== undefined) {\n      return result\n    }\n    if (!isObject(value)) {\n      return value\n    }\n    var isArr = isArray$1(value)\n    if (isArr) {\n      result = initCloneArray(value)\n      if (!isDeep) {\n        return copyArray(value, result)\n      }\n    } else {\n      var tag = getTag$1(value),\n        isFunc = tag == funcTag || tag == genTag\n\n      if (isBuffer$1(value)) {\n        return cloneBuffer(value, isDeep)\n      }\n      if (tag == objectTag$1 || tag == argsTag$1 || (isFunc && !object)) {\n        result = isFlat || isFunc ? {} : initCloneObject(value)\n        if (!isDeep) {\n          return isFlat\n            ? copySymbolsIn(value, baseAssignIn(result, value))\n            : copySymbols(value, baseAssign(result, value))\n        }\n      } else {\n        if (!cloneableTags[tag]) {\n          return object ? value : {}\n        }\n        result = initCloneByTag(value, tag, isDeep)\n      }\n    }\n    // Check for circular references and return its corresponding clone.\n    stack || (stack = new Stack())\n    var stacked = stack.get(value)\n    if (stacked) {\n      return stacked\n    }\n    stack.set(value, result)\n\n    if (isSet$1(value)) {\n      value.forEach(function (subValue) {\n        result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack))\n      })\n    } else if (isMap$1(value)) {\n      value.forEach(function (subValue, key) {\n        result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack))\n      })\n    }\n\n    var keysFunc = isFull ? (isFlat ? getAllKeysIn : getAllKeys) : isFlat ? keysIn : keys\n\n    var props = isArr ? undefined : keysFunc(value)\n    arrayEach(props || value, function (subValue, key) {\n      if (props) {\n        key = subValue\n        subValue = value[key]\n      }\n      // Recursively populate clone (susceptible to call stack limits).\n      assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack))\n    })\n    return result\n  }\n\n  /** Used to compose bitmasks for cloning. */\n  var CLONE_SYMBOLS_FLAG = 4\n\n  /**\n   * Creates a shallow clone of `value`.\n   *\n   * **Note:** This method is loosely based on the\n   * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n   * and supports cloning arrays, array buffers, booleans, date objects, maps,\n   * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n   * arrays. The own enumerable properties of `arguments` objects are cloned\n   * as plain objects. An empty object is returned for uncloneable values such\n   * as error objects, functions, DOM nodes, and WeakMaps.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to clone.\n   * @returns {*} Returns the cloned value.\n   * @see _.cloneDeep\n   * @example\n   *\n   * var objects = [{ 'a': 1 }, { 'b': 2 }];\n   *\n   * var shallow = _.clone(objects);\n   * console.log(shallow[0] === objects[0]);\n   * // => true\n   */\n  function clone(value) {\n    return baseClone(value, CLONE_SYMBOLS_FLAG)\n  }\n\n  /**\n   * Creates an array with all falsey values removed. The values `false`, `null`,\n   * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to compact.\n   * @returns {Array} Returns the new array of filtered values.\n   * @example\n   *\n   * _.compact([0, 1, false, 2, '', 3]);\n   * // => [1, 2, 3]\n   */\n  function compact(array) {\n    var index = -1,\n      length = array == null ? 0 : array.length,\n      resIndex = 0,\n      result = []\n\n    while (++index < length) {\n      var value = array[index]\n      if (value) {\n        result[resIndex++] = value\n      }\n    }\n    return result\n  }\n\n  /** Used to stand-in for `undefined` hash values. */\n  var HASH_UNDEFINED = '__lodash_hash_undefined__'\n\n  /**\n   * Adds `value` to the array cache.\n   *\n   * @private\n   * @name add\n   * @memberOf SetCache\n   * @alias push\n   * @param {*} value The value to cache.\n   * @returns {Object} Returns the cache instance.\n   */\n  function setCacheAdd(value) {\n    this.__data__.set(value, HASH_UNDEFINED)\n    return this\n  }\n\n  /**\n   * Checks if `value` is in the array cache.\n   *\n   * @private\n   * @name has\n   * @memberOf SetCache\n   * @param {*} value The value to search for.\n   * @returns {number} Returns `true` if `value` is found, else `false`.\n   */\n  function setCacheHas(value) {\n    return this.__data__.has(value)\n  }\n\n  /**\n   *\n   * Creates an array cache object to store unique values.\n   *\n   * @private\n   * @constructor\n   * @param {Array} [values] The values to cache.\n   */\n  function SetCache(values) {\n    var index = -1,\n      length = values == null ? 0 : values.length\n\n    this.__data__ = new MapCache()\n    while (++index < length) {\n      this.add(values[index])\n    }\n  }\n\n  // Add methods to `SetCache`.\n  SetCache.prototype.add = SetCache.prototype.push = setCacheAdd\n  SetCache.prototype.has = setCacheHas\n\n  /**\n   * A specialized version of `_.some` for arrays without support for iteratee\n   * shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function arraySome(array, predicate) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    while (++index < length) {\n      if (predicate(array[index], index, array)) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /**\n   * Checks if a `cache` value for `key` exists.\n   *\n   * @private\n   * @param {Object} cache The cache to query.\n   * @param {string} key The key of the entry to check.\n   * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.\n   */\n  function cacheHas(cache, key) {\n    return cache.has(key)\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG$5 = 1,\n    COMPARE_UNORDERED_FLAG$3 = 2\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for arrays with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Array} array The array to compare.\n   * @param {Array} other The other array to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `array` and `other` objects.\n   * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.\n   */\n  function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG$5,\n      arrLength = array.length,\n      othLength = other.length\n\n    if (arrLength != othLength && !(isPartial && othLength > arrLength)) {\n      return false\n    }\n    // Check that cyclic values are equal.\n    var arrStacked = stack.get(array)\n    var othStacked = stack.get(other)\n    if (arrStacked && othStacked) {\n      return arrStacked == other && othStacked == array\n    }\n    var index = -1,\n      result = true,\n      seen = bitmask & COMPARE_UNORDERED_FLAG$3 ? new SetCache() : undefined\n\n    stack.set(array, other)\n    stack.set(other, array)\n\n    // Ignore non-index properties.\n    while (++index < arrLength) {\n      var arrValue = array[index],\n        othValue = other[index]\n\n      if (customizer) {\n        var compared = isPartial\n          ? customizer(othValue, arrValue, index, other, array, stack)\n          : customizer(arrValue, othValue, index, array, other, stack)\n      }\n      if (compared !== undefined) {\n        if (compared) {\n          continue\n        }\n        result = false\n        break\n      }\n      // Recursively compare arrays (susceptible to call stack limits).\n      if (seen) {\n        if (\n          !arraySome(other, function (othValue, othIndex) {\n            if (\n              !cacheHas(seen, othIndex) &&\n              (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))\n            ) {\n              return seen.push(othIndex)\n            }\n          })\n        ) {\n          result = false\n          break\n        }\n      } else if (!(arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {\n        result = false\n        break\n      }\n    }\n    stack['delete'](array)\n    stack['delete'](other)\n    return result\n  }\n\n  /**\n   * Converts `map` to its key-value pairs.\n   *\n   * @private\n   * @param {Object} map The map to convert.\n   * @returns {Array} Returns the key-value pairs.\n   */\n  function mapToArray(map) {\n    var index = -1,\n      result = Array(map.size)\n\n    map.forEach(function (value, key) {\n      result[++index] = [key, value]\n    })\n    return result\n  }\n\n  /**\n   * Converts `set` to an array of its values.\n   *\n   * @private\n   * @param {Object} set The set to convert.\n   * @returns {Array} Returns the values.\n   */\n  function setToArray(set) {\n    var index = -1,\n      result = Array(set.size)\n\n    set.forEach(function (value) {\n      result[++index] = value\n    })\n    return result\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG$4 = 1,\n    COMPARE_UNORDERED_FLAG$2 = 2\n\n  /** `Object#toString` result references. */\n  var boolTag = '[object Boolean]',\n    dateTag = '[object Date]',\n    errorTag = '[object Error]',\n    mapTag$1 = '[object Map]',\n    numberTag = '[object Number]',\n    regexpTag$1 = '[object RegExp]',\n    setTag$1 = '[object Set]',\n    stringTag$1 = '[object String]',\n    symbolTag = '[object Symbol]'\n\n  var arrayBufferTag = '[object ArrayBuffer]',\n    dataViewTag = '[object DataView]'\n\n  /** Used to convert symbols to primitives and strings. */\n  var symbolProto = Symbol$2 ? Symbol$2.prototype : undefined,\n    symbolValueOf = symbolProto ? symbolProto.valueOf : undefined\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for comparing objects of\n   * the same `toStringTag`.\n   *\n   * **Note:** This function only supports comparing values with tags of\n   * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {string} tag The `toStringTag` of the objects to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {\n    switch (tag) {\n      case dataViewTag:\n        if (object.byteLength != other.byteLength || object.byteOffset != other.byteOffset) {\n          return false\n        }\n        object = object.buffer\n        other = other.buffer\n\n      case arrayBufferTag:\n        if (object.byteLength != other.byteLength || !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {\n          return false\n        }\n        return true\n\n      case boolTag:\n      case dateTag:\n      case numberTag:\n        // Coerce booleans to `1` or `0` and dates to milliseconds.\n        // Invalid dates are coerced to `NaN`.\n        return eq(+object, +other)\n\n      case errorTag:\n        return object.name == other.name && object.message == other.message\n\n      case regexpTag$1:\n      case stringTag$1:\n        // Coerce regexes to strings and treat strings, primitives and objects,\n        // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring\n        // for more details.\n        return object == other + ''\n\n      case mapTag$1:\n        var convert = mapToArray\n\n      case setTag$1:\n        var isPartial = bitmask & COMPARE_PARTIAL_FLAG$4\n        convert || (convert = setToArray)\n\n        if (object.size != other.size && !isPartial) {\n          return false\n        }\n        // Assume cyclic values are equal.\n        var stacked = stack.get(object)\n        if (stacked) {\n          return stacked == other\n        }\n        bitmask |= COMPARE_UNORDERED_FLAG$2\n\n        // Recursively compare objects (susceptible to call stack limits).\n        stack.set(object, other)\n        var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack)\n        stack['delete'](object)\n        return result\n\n      case symbolTag:\n        if (symbolValueOf) {\n          return symbolValueOf.call(object) == symbolValueOf.call(other)\n        }\n    }\n    return false\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG$3 = 1\n\n  /** Used for built-in method references. */\n  var objectProto$5 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$5 = objectProto$5.hasOwnProperty\n\n  /**\n   * A specialized version of `baseIsEqualDeep` for objects with support for\n   * partial deep comparisons.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} stack Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {\n    var isPartial = bitmask & COMPARE_PARTIAL_FLAG$3,\n      objProps = getAllKeys(object),\n      objLength = objProps.length,\n      othProps = getAllKeys(other),\n      othLength = othProps.length\n\n    if (objLength != othLength && !isPartial) {\n      return false\n    }\n    var index = objLength\n    while (index--) {\n      var key = objProps[index]\n      if (!(isPartial ? key in other : hasOwnProperty$5.call(other, key))) {\n        return false\n      }\n    }\n    // Check that cyclic values are equal.\n    var objStacked = stack.get(object)\n    var othStacked = stack.get(other)\n    if (objStacked && othStacked) {\n      return objStacked == other && othStacked == object\n    }\n    var result = true\n    stack.set(object, other)\n    stack.set(other, object)\n\n    var skipCtor = isPartial\n    while (++index < objLength) {\n      key = objProps[index]\n      var objValue = object[key],\n        othValue = other[key]\n\n      if (customizer) {\n        var compared = isPartial\n          ? customizer(othValue, objValue, key, other, object, stack)\n          : customizer(objValue, othValue, key, object, other, stack)\n      }\n      // Recursively compare objects (susceptible to call stack limits).\n      if (\n        !(compared === undefined\n          ? objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack)\n          : compared)\n      ) {\n        result = false\n        break\n      }\n      skipCtor || (skipCtor = key == 'constructor')\n    }\n    if (result && !skipCtor) {\n      var objCtor = object.constructor,\n        othCtor = other.constructor\n\n      // Non `Object` object instances with different constructors are not equal.\n      if (\n        objCtor != othCtor &&\n        'constructor' in object &&\n        'constructor' in other &&\n        !(\n          typeof objCtor == 'function' &&\n          objCtor instanceof objCtor &&\n          typeof othCtor == 'function' &&\n          othCtor instanceof othCtor\n        )\n      ) {\n        result = false\n      }\n    }\n    stack['delete'](object)\n    stack['delete'](other)\n    return result\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG$2 = 1\n\n  /** `Object#toString` result references. */\n  var argsTag = '[object Arguments]',\n    arrayTag = '[object Array]',\n    objectTag = '[object Object]'\n\n  /** Used for built-in method references. */\n  var objectProto$4 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$4 = objectProto$4.hasOwnProperty\n\n  /**\n   * A specialized version of `baseIsEqual` for arrays and objects which performs\n   * deep comparisons and tracks traversed objects enabling objects with circular\n   * references to be compared.\n   *\n   * @private\n   * @param {Object} object The object to compare.\n   * @param {Object} other The other object to compare.\n   * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.\n   * @param {Function} customizer The function to customize comparisons.\n   * @param {Function} equalFunc The function to determine equivalents of values.\n   * @param {Object} [stack] Tracks traversed `object` and `other` objects.\n   * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.\n   */\n  function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {\n    var objIsArr = isArray$1(object),\n      othIsArr = isArray$1(other),\n      objTag = objIsArr ? arrayTag : getTag$1(object),\n      othTag = othIsArr ? arrayTag : getTag$1(other)\n\n    objTag = objTag == argsTag ? objectTag : objTag\n    othTag = othTag == argsTag ? objectTag : othTag\n\n    var objIsObj = objTag == objectTag,\n      othIsObj = othTag == objectTag,\n      isSameTag = objTag == othTag\n\n    if (isSameTag && isBuffer$1(object)) {\n      if (!isBuffer$1(other)) {\n        return false\n      }\n      objIsArr = true\n      objIsObj = false\n    }\n    if (isSameTag && !objIsObj) {\n      stack || (stack = new Stack())\n      return objIsArr || isTypedArray$1(object)\n        ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)\n        : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack)\n    }\n    if (!(bitmask & COMPARE_PARTIAL_FLAG$2)) {\n      var objIsWrapped = objIsObj && hasOwnProperty$4.call(object, '__wrapped__'),\n        othIsWrapped = othIsObj && hasOwnProperty$4.call(other, '__wrapped__')\n\n      if (objIsWrapped || othIsWrapped) {\n        var objUnwrapped = objIsWrapped ? object.value() : object,\n          othUnwrapped = othIsWrapped ? other.value() : other\n\n        stack || (stack = new Stack())\n        return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack)\n      }\n    }\n    if (!isSameTag) {\n      return false\n    }\n    stack || (stack = new Stack())\n    return equalObjects(object, other, bitmask, customizer, equalFunc, stack)\n  }\n\n  /**\n   * The base implementation of `_.isEqual` which supports partial comparisons\n   * and tracks traversed objects.\n   *\n   * @private\n   * @param {*} value The value to compare.\n   * @param {*} other The other value to compare.\n   * @param {boolean} bitmask The bitmask flags.\n   *  1 - Unordered comparison\n   *  2 - Partial comparison\n   * @param {Function} [customizer] The function to customize comparisons.\n   * @param {Object} [stack] Tracks traversed `value` and `other` objects.\n   * @returns {boolean} Returns `true` if the values are equivalent, else `false`.\n   */\n  function baseIsEqual(value, other, bitmask, customizer, stack) {\n    if (value === other) {\n      return true\n    }\n    if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {\n      return value !== value && other !== other\n    }\n    return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack)\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG$1 = 1,\n    COMPARE_UNORDERED_FLAG$1 = 2\n\n  /**\n   * The base implementation of `_.isMatch` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Object} object The object to inspect.\n   * @param {Object} source The object of property values to match.\n   * @param {Array} matchData The property names, values, and compare flags to match.\n   * @param {Function} [customizer] The function to customize comparisons.\n   * @returns {boolean} Returns `true` if `object` is a match, else `false`.\n   */\n  function baseIsMatch(object, source, matchData, customizer) {\n    var index = matchData.length,\n      length = index,\n      noCustomizer = !customizer\n\n    if (object == null) {\n      return !length\n    }\n    object = Object(object)\n    while (index--) {\n      var data = matchData[index]\n      if (noCustomizer && data[2] ? data[1] !== object[data[0]] : !(data[0] in object)) {\n        return false\n      }\n    }\n    while (++index < length) {\n      data = matchData[index]\n      var key = data[0],\n        objValue = object[key],\n        srcValue = data[1]\n\n      if (noCustomizer && data[2]) {\n        if (objValue === undefined && !(key in object)) {\n          return false\n        }\n      } else {\n        var stack = new Stack()\n        if (customizer) {\n          var result = customizer(objValue, srcValue, key, object, source, stack)\n        }\n        if (\n          !(result === undefined\n            ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$1 | COMPARE_UNORDERED_FLAG$1, customizer, stack)\n            : result)\n        ) {\n          return false\n        }\n      }\n    }\n    return true\n  }\n\n  /**\n   * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` if suitable for strict\n   *  equality comparisons, else `false`.\n   */\n  function isStrictComparable(value) {\n    return value === value && !isObject(value)\n  }\n\n  /**\n   * Gets the property names, values, and compare flags of `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the match data of `object`.\n   */\n  function getMatchData(object) {\n    var result = keys(object),\n      length = result.length\n\n    while (length--) {\n      var key = result[length],\n        value = object[key]\n\n      result[length] = [key, value, isStrictComparable(value)]\n    }\n    return result\n  }\n\n  /**\n   * A specialized version of `matchesProperty` for source values suitable\n   * for strict equality comparisons, i.e. `===`.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @param {*} srcValue The value to match.\n   * @returns {Function} Returns the new spec function.\n   */\n  function matchesStrictComparable(key, srcValue) {\n    return function (object) {\n      if (object == null) {\n        return false\n      }\n      return object[key] === srcValue && (srcValue !== undefined || key in Object(object))\n    }\n  }\n\n  /**\n   * The base implementation of `_.matches` which doesn't clone `source`.\n   *\n   * @private\n   * @param {Object} source The object of property values to match.\n   * @returns {Function} Returns the new spec function.\n   */\n  function baseMatches(source) {\n    var matchData = getMatchData(source)\n    if (matchData.length == 1 && matchData[0][2]) {\n      return matchesStrictComparable(matchData[0][0], matchData[0][1])\n    }\n    return function (object) {\n      return object === source || baseIsMatch(object, source, matchData)\n    }\n  }\n\n  /**\n   * The base implementation of `_.hasIn` without support for deep paths.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {Array|string} key The key to check.\n   * @returns {boolean} Returns `true` if `key` exists, else `false`.\n   */\n  function baseHasIn(object, key) {\n    return object != null && key in Object(object)\n  }\n\n  /**\n   * Checks if `path` exists on `object`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path to check.\n   * @param {Function} hasFunc The function to check properties.\n   * @returns {boolean} Returns `true` if `path` exists, else `false`.\n   */\n  function hasPath(object, path, hasFunc) {\n    path = castPath(path, object)\n\n    var index = -1,\n      length = path.length,\n      result = false\n\n    while (++index < length) {\n      var key = toKey(path[index])\n      if (!(result = object != null && hasFunc(object, key))) {\n        break\n      }\n      object = object[key]\n    }\n    if (result || ++index != length) {\n      return result\n    }\n    length = object == null ? 0 : object.length\n    return !!length && isLength(length) && isIndex(key, length) && (isArray$1(object) || isArguments$1(object))\n  }\n\n  /**\n   * Checks if `path` is a direct or inherited property of `object`.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Object\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path to check.\n   * @returns {boolean} Returns `true` if `path` exists, else `false`.\n   * @example\n   *\n   * var object = _.create({ 'a': _.create({ 'b': 2 }) });\n   *\n   * _.hasIn(object, 'a');\n   * // => true\n   *\n   * _.hasIn(object, 'a.b');\n   * // => true\n   *\n   * _.hasIn(object, ['a', 'b']);\n   * // => true\n   *\n   * _.hasIn(object, 'b');\n   * // => false\n   */\n  function hasIn(object, path) {\n    return object != null && hasPath(object, path, baseHasIn)\n  }\n\n  /** Used to compose bitmasks for value comparisons. */\n  var COMPARE_PARTIAL_FLAG = 1,\n    COMPARE_UNORDERED_FLAG = 2\n\n  /**\n   * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.\n   *\n   * @private\n   * @param {string} path The path of the property to get.\n   * @param {*} srcValue The value to match.\n   * @returns {Function} Returns the new spec function.\n   */\n  function baseMatchesProperty(path, srcValue) {\n    if (isKey(path) && isStrictComparable(srcValue)) {\n      return matchesStrictComparable(toKey(path), srcValue)\n    }\n    return function (object) {\n      var objValue = get(object, path)\n      return objValue === undefined && objValue === srcValue\n        ? hasIn(object, path)\n        : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG | COMPARE_UNORDERED_FLAG)\n    }\n  }\n\n  /**\n   * The base implementation of `_.property` without support for deep paths.\n   *\n   * @private\n   * @param {string} key The key of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function baseProperty(key) {\n    return function (object) {\n      return object == null ? undefined : object[key]\n    }\n  }\n\n  /**\n   * A specialized version of `baseProperty` which supports deep paths.\n   *\n   * @private\n   * @param {Array|string} path The path of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   */\n  function basePropertyDeep(path) {\n    return function (object) {\n      return baseGet(object, path)\n    }\n  }\n\n  /**\n   * Creates a function that returns the value at `path` of a given object.\n   *\n   * @static\n   * @memberOf _\n   * @since 2.4.0\n   * @category Util\n   * @param {Array|string} path The path of the property to get.\n   * @returns {Function} Returns the new accessor function.\n   * @example\n   *\n   * var objects = [\n   *   { 'a': { 'b': 2 } },\n   *   { 'a': { 'b': 1 } }\n   * ];\n   *\n   * _.map(objects, _.property('a.b'));\n   * // => [2, 1]\n   *\n   * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');\n   * // => [1, 2]\n   */\n  function property(path) {\n    return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path)\n  }\n\n  /**\n   * The base implementation of `_.iteratee`.\n   *\n   * @private\n   * @param {*} [value=_.identity] The value to convert to an iteratee.\n   * @returns {Function} Returns the iteratee.\n   */\n  function baseIteratee(value) {\n    // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.\n    // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.\n    if (typeof value == 'function') {\n      return value\n    }\n    if (value == null) {\n      return identity\n    }\n    if (typeof value == 'object') {\n      return isArray$1(value) ? baseMatchesProperty(value[0], value[1]) : baseMatches(value)\n    }\n    return property(value)\n  }\n\n  /**\n   * A specialized version of `baseAggregator` for arrays.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function arrayAggregator(array, setter, iteratee, accumulator) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    while (++index < length) {\n      var value = array[index]\n      setter(accumulator, value, iteratee(value), array)\n    }\n    return accumulator\n  }\n\n  /**\n   * Creates a base function for methods like `_.forIn` and `_.forOwn`.\n   *\n   * @private\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseFor(fromRight) {\n    return function (object, iteratee, keysFunc) {\n      var index = -1,\n        iterable = Object(object),\n        props = keysFunc(object),\n        length = props.length\n\n      while (length--) {\n        var key = props[fromRight ? length : ++index]\n        if (iteratee(iterable[key], key, iterable) === false) {\n          break\n        }\n      }\n      return object\n    }\n  }\n\n  /**\n   * The base implementation of `baseForOwn` which iterates over `object`\n   * properties returned by `keysFunc` and invokes `iteratee` for each property.\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {Function} keysFunc The function to get the keys of `object`.\n   * @returns {Object} Returns `object`.\n   */\n  var baseFor = createBaseFor()\n\n  const baseFor$1 = baseFor\n\n  /**\n   * The base implementation of `_.forOwn` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Object} object The object to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Object} Returns `object`.\n   */\n  function baseForOwn(object, iteratee) {\n    return object && baseFor$1(object, iteratee, keys)\n  }\n\n  /**\n   * Creates a `baseEach` or `baseEachRight` function.\n   *\n   * @private\n   * @param {Function} eachFunc The function to iterate over a collection.\n   * @param {boolean} [fromRight] Specify iterating from right to left.\n   * @returns {Function} Returns the new base function.\n   */\n  function createBaseEach(eachFunc, fromRight) {\n    return function (collection, iteratee) {\n      if (collection == null) {\n        return collection\n      }\n      if (!isArrayLike(collection)) {\n        return eachFunc(collection, iteratee)\n      }\n      var length = collection.length,\n        index = fromRight ? length : -1,\n        iterable = Object(collection)\n\n      while (fromRight ? index-- : ++index < length) {\n        if (iteratee(iterable[index], index, iterable) === false) {\n          break\n        }\n      }\n      return collection\n    }\n  }\n\n  /**\n   * The base implementation of `_.forEach` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   */\n  var baseEach = createBaseEach(baseForOwn)\n\n  const baseEach$1 = baseEach\n\n  /**\n   * Aggregates elements of `collection` on `accumulator` with keys transformed\n   * by `iteratee` and values set by `setter`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} setter The function to set `accumulator` values.\n   * @param {Function} iteratee The iteratee to transform keys.\n   * @param {Object} accumulator The initial aggregated object.\n   * @returns {Function} Returns `accumulator`.\n   */\n  function baseAggregator(collection, setter, iteratee, accumulator) {\n    baseEach$1(collection, function (value, key, collection) {\n      setter(accumulator, value, iteratee(value), collection)\n    })\n    return accumulator\n  }\n\n  /**\n   * Creates a function like `_.groupBy`.\n   *\n   * @private\n   * @param {Function} setter The function to set accumulator values.\n   * @param {Function} [initializer] The accumulator object initializer.\n   * @returns {Function} Returns the new aggregator function.\n   */\n  function createAggregator(setter, initializer) {\n    return function (collection, iteratee) {\n      var func = isArray$1(collection) ? arrayAggregator : baseAggregator,\n        accumulator = initializer ? initializer() : {}\n\n      return func(collection, setter, baseIteratee(iteratee), accumulator)\n    }\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$3 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$3 = objectProto$3.hasOwnProperty\n\n  /**\n   * Assigns own and inherited enumerable string keyed properties of source\n   * objects to the destination object for all destination properties that\n   * resolve to `undefined`. Source objects are applied from left to right.\n   * Once a property is set, additional values of the same property are ignored.\n   *\n   * **Note:** This method mutates `object`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The destination object.\n   * @param {...Object} [sources] The source objects.\n   * @returns {Object} Returns `object`.\n   * @see _.defaultsDeep\n   * @example\n   *\n   * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n   * // => { 'a': 1, 'b': 2 }\n   */\n  var defaults = baseRest(function (object, sources) {\n    object = Object(object)\n\n    var index = -1\n    var length = sources.length\n    var guard = length > 2 ? sources[2] : undefined\n\n    if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n      length = 1\n    }\n\n    while (++index < length) {\n      var source = sources[index]\n      var props = keysIn(source)\n      var propsIndex = -1\n      var propsLength = props.length\n\n      while (++propsIndex < propsLength) {\n        var key = props[propsIndex]\n        var value = object[key]\n\n        if (value === undefined || (eq(value, objectProto$3[key]) && !hasOwnProperty$3.call(object, key))) {\n          object[key] = source[key]\n        }\n      }\n    }\n\n    return object\n  })\n\n  const defaults$1 = defaults\n\n  /**\n   * This method is like `_.isArrayLike` except that it also checks if `value`\n   * is an object.\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is an array-like object,\n   *  else `false`.\n   * @example\n   *\n   * _.isArrayLikeObject([1, 2, 3]);\n   * // => true\n   *\n   * _.isArrayLikeObject(document.body.children);\n   * // => true\n   *\n   * _.isArrayLikeObject('abc');\n   * // => false\n   *\n   * _.isArrayLikeObject(_.noop);\n   * // => false\n   */\n  function isArrayLikeObject(value) {\n    return isObjectLike(value) && isArrayLike(value)\n  }\n\n  /**\n   * This function is like `arrayIncludes` except that it accepts a comparator.\n   *\n   * @private\n   * @param {Array} [array] The array to inspect.\n   * @param {*} target The value to search for.\n   * @param {Function} comparator The comparator invoked per element.\n   * @returns {boolean} Returns `true` if `target` is found, else `false`.\n   */\n  function arrayIncludesWith(array, value, comparator) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    while (++index < length) {\n      if (comparator(value, array[index])) {\n        return true\n      }\n    }\n    return false\n  }\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE$1 = 200\n\n  /**\n   * The base implementation of methods like `_.difference` without support\n   * for excluding multiple arrays or iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Array} values The values to exclude.\n   * @param {Function} [iteratee] The iteratee invoked per element.\n   * @param {Function} [comparator] The comparator invoked per element.\n   * @returns {Array} Returns the new array of filtered values.\n   */\n  function baseDifference(array, values, iteratee, comparator) {\n    var index = -1,\n      includes = arrayIncludes,\n      isCommon = true,\n      length = array.length,\n      result = [],\n      valuesLength = values.length\n\n    if (!length) {\n      return result\n    }\n    if (iteratee) {\n      values = arrayMap(values, baseUnary(iteratee))\n    }\n    if (comparator) {\n      includes = arrayIncludesWith\n      isCommon = false\n    } else if (values.length >= LARGE_ARRAY_SIZE$1) {\n      includes = cacheHas\n      isCommon = false\n      values = new SetCache(values)\n    }\n    outer: while (++index < length) {\n      var value = array[index],\n        computed = iteratee == null ? value : iteratee(value)\n\n      value = comparator || value !== 0 ? value : 0\n      if (isCommon && computed === computed) {\n        var valuesIndex = valuesLength\n        while (valuesIndex--) {\n          if (values[valuesIndex] === computed) {\n            continue outer\n          }\n        }\n        result.push(value)\n      } else if (!includes(values, computed, comparator)) {\n        result.push(value)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates an array of `array` values not included in the other given arrays\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons. The order and references of result values are\n   * determined by the first array.\n   *\n   * **Note:** Unlike `_.pullAll`, this method returns a new array.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @param {...Array} [values] The values to exclude.\n   * @returns {Array} Returns the new array of filtered values.\n   * @see _.without, _.xor\n   * @example\n   *\n   * _.difference([2, 1], [2, 3]);\n   * // => [1]\n   */\n  var difference = baseRest(function (array, values) {\n    return isArrayLikeObject(array) ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true)) : []\n  })\n\n  const difference$1 = difference\n\n  /**\n   * Gets the last element of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to query.\n   * @returns {*} Returns the last element of `array`.\n   * @example\n   *\n   * _.last([1, 2, 3]);\n   * // => 3\n   */\n  function last(array) {\n    var length = array == null ? 0 : array.length\n    return length ? array[length - 1] : undefined\n  }\n\n  /**\n   * Creates a slice of `array` with `n` elements dropped from the beginning.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.5.0\n   * @category Array\n   * @param {Array} array The array to query.\n   * @param {number} [n=1] The number of elements to drop.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {Array} Returns the slice of `array`.\n   * @example\n   *\n   * _.drop([1, 2, 3]);\n   * // => [2, 3]\n   *\n   * _.drop([1, 2, 3], 2);\n   * // => [3]\n   *\n   * _.drop([1, 2, 3], 5);\n   * // => []\n   *\n   * _.drop([1, 2, 3], 0);\n   * // => [1, 2, 3]\n   */\n  function drop(array, n, guard) {\n    var length = array == null ? 0 : array.length\n    if (!length) {\n      return []\n    }\n    n = guard || n === undefined ? 1 : toInteger(n)\n    return baseSlice(array, n < 0 ? 0 : n, length)\n  }\n\n  /**\n   * Creates a slice of `array` with `n` elements dropped from the end.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Array\n   * @param {Array} array The array to query.\n   * @param {number} [n=1] The number of elements to drop.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {Array} Returns the slice of `array`.\n   * @example\n   *\n   * _.dropRight([1, 2, 3]);\n   * // => [1, 2]\n   *\n   * _.dropRight([1, 2, 3], 2);\n   * // => [1]\n   *\n   * _.dropRight([1, 2, 3], 5);\n   * // => []\n   *\n   * _.dropRight([1, 2, 3], 0);\n   * // => [1, 2, 3]\n   */\n  function dropRight(array, n, guard) {\n    var length = array == null ? 0 : array.length\n    if (!length) {\n      return []\n    }\n    n = guard || n === undefined ? 1 : toInteger(n)\n    n = length - n\n    return baseSlice(array, 0, n < 0 ? 0 : n)\n  }\n\n  /**\n   * Casts `value` to `identity` if it's not a function.\n   *\n   * @private\n   * @param {*} value The value to inspect.\n   * @returns {Function} Returns cast function.\n   */\n  function castFunction(value) {\n    return typeof value == 'function' ? value : identity\n  }\n\n  /**\n   * Iterates over elements of `collection` and invokes `iteratee` for each element.\n   * The iteratee is invoked with three arguments: (value, index|key, collection).\n   * Iteratee functions may exit iteration early by explicitly returning `false`.\n   *\n   * **Note:** As with other \"Collections\" methods, objects with a \"length\"\n   * property are iterated like arrays. To avoid this behavior use `_.forIn`\n   * or `_.forOwn` for object iteration.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @alias each\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array|Object} Returns `collection`.\n   * @see _.forEachRight\n   * @example\n   *\n   * _.forEach([1, 2], function(value) {\n   *   console.log(value);\n   * });\n   * // => Logs `1` then `2`.\n   *\n   * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {\n   *   console.log(key);\n   * });\n   * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n   */\n  function forEach(collection, iteratee) {\n    var func = isArray$1(collection) ? arrayEach : baseEach$1\n    return func(collection, castFunction(iteratee))\n  }\n\n  /**\n   * A specialized version of `_.every` for arrays without support for\n   * iteratee shorthands.\n   *\n   * @private\n   * @param {Array} [array] The array to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   */\n  function arrayEvery(array, predicate) {\n    var index = -1,\n      length = array == null ? 0 : array.length\n\n    while (++index < length) {\n      if (!predicate(array[index], index, array)) {\n        return false\n      }\n    }\n    return true\n  }\n\n  /**\n   * The base implementation of `_.every` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`\n   */\n  function baseEvery(collection, predicate) {\n    var result = true\n    baseEach$1(collection, function (value, index, collection) {\n      result = !!predicate(value, index, collection)\n      return result\n    })\n    return result\n  }\n\n  /**\n   * Checks if `predicate` returns truthy for **all** elements of `collection`.\n   * Iteration is stopped once `predicate` returns falsey. The predicate is\n   * invoked with three arguments: (value, index|key, collection).\n   *\n   * **Note:** This method returns `true` for\n   * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n   * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n   * elements of empty collections.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {boolean} Returns `true` if all elements pass the predicate check,\n   *  else `false`.\n   * @example\n   *\n   * _.every([true, 1, null, 'yes'], Boolean);\n   * // => false\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': false },\n   *   { 'user': 'fred',   'age': 40, 'active': false }\n   * ];\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.every(users, { 'user': 'barney', 'active': false });\n   * // => false\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.every(users, ['active', false]);\n   * // => true\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.every(users, 'active');\n   * // => false\n   */\n  function every(collection, predicate, guard) {\n    var func = isArray$1(collection) ? arrayEvery : baseEvery\n    if (guard && isIterateeCall(collection, predicate, guard)) {\n      predicate = undefined\n    }\n    return func(collection, baseIteratee(predicate))\n  }\n\n  /**\n   * The base implementation of `_.filter` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   */\n  function baseFilter(collection, predicate) {\n    var result = []\n    baseEach$1(collection, function (value, index, collection) {\n      if (predicate(value, index, collection)) {\n        result.push(value)\n      }\n    })\n    return result\n  }\n\n  /**\n   * Iterates over elements of `collection`, returning an array of all elements\n   * `predicate` returns truthy for. The predicate is invoked with three\n   * arguments: (value, index|key, collection).\n   *\n   * **Note:** Unlike `_.remove`, this method returns a new array.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   * @see _.reject\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': true },\n   *   { 'user': 'fred',   'age': 40, 'active': false }\n   * ];\n   *\n   * _.filter(users, function(o) { return !o.active; });\n   * // => objects for ['fred']\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.filter(users, { 'age': 36, 'active': true });\n   * // => objects for ['barney']\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.filter(users, ['active', false]);\n   * // => objects for ['fred']\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.filter(users, 'active');\n   * // => objects for ['barney']\n   *\n   * // Combining several predicates using `_.overEvery` or `_.overSome`.\n   * _.filter(users, _.overSome([{ 'age': 36 }, ['age', 40]]));\n   * // => objects for ['fred', 'barney']\n   */\n  function filter(collection, predicate) {\n    var func = isArray$1(collection) ? arrayFilter : baseFilter\n    return func(collection, baseIteratee(predicate))\n  }\n\n  /**\n   * Creates a `_.find` or `_.findLast` function.\n   *\n   * @private\n   * @param {Function} findIndexFunc The function to find the collection index.\n   * @returns {Function} Returns the new find function.\n   */\n  function createFind(findIndexFunc) {\n    return function (collection, predicate, fromIndex) {\n      var iterable = Object(collection)\n      if (!isArrayLike(collection)) {\n        var iteratee = baseIteratee(predicate)\n        collection = keys(collection)\n        predicate = function (key) {\n          return iteratee(iterable[key], key, iterable)\n        }\n      }\n      var index = findIndexFunc(collection, predicate, fromIndex)\n      return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined\n    }\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax$2 = Math.max\n\n  /**\n   * This method is like `_.find` except that it returns the index of the first\n   * element `predicate` returns truthy for instead of the element itself.\n   *\n   * @static\n   * @memberOf _\n   * @since 1.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the found element, else `-1`.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney',  'active': false },\n   *   { 'user': 'fred',    'active': false },\n   *   { 'user': 'pebbles', 'active': true }\n   * ];\n   *\n   * _.findIndex(users, function(o) { return o.user == 'barney'; });\n   * // => 0\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.findIndex(users, { 'user': 'fred', 'active': false });\n   * // => 1\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.findIndex(users, ['active', false]);\n   * // => 0\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.findIndex(users, 'active');\n   * // => 2\n   */\n  function findIndex(array, predicate, fromIndex) {\n    var length = array == null ? 0 : array.length\n    if (!length) {\n      return -1\n    }\n    var index = fromIndex == null ? 0 : toInteger(fromIndex)\n    if (index < 0) {\n      index = nativeMax$2(length + index, 0)\n    }\n    return baseFindIndex(array, baseIteratee(predicate), index)\n  }\n\n  /**\n   * Iterates over elements of `collection`, returning the first element\n   * `predicate` returns truthy for. The predicate is invoked with three\n   * arguments: (value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to inspect.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {*} Returns the matched element, else `undefined`.\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney',  'age': 36, 'active': true },\n   *   { 'user': 'fred',    'age': 40, 'active': false },\n   *   { 'user': 'pebbles', 'age': 1,  'active': true }\n   * ];\n   *\n   * _.find(users, function(o) { return o.age < 40; });\n   * // => object for 'barney'\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.find(users, { 'age': 1, 'active': true });\n   * // => object for 'pebbles'\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.find(users, ['active', false]);\n   * // => object for 'fred'\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.find(users, 'active');\n   * // => object for 'barney'\n   */\n  var find = createFind(findIndex)\n\n  const find$1 = find\n\n  /**\n   * Gets the first element of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @alias first\n   * @category Array\n   * @param {Array} array The array to query.\n   * @returns {*} Returns the first element of `array`.\n   * @example\n   *\n   * _.head([1, 2, 3]);\n   * // => 1\n   *\n   * _.head([]);\n   * // => undefined\n   */\n  function head(array) {\n    return array && array.length ? array[0] : undefined\n  }\n\n  /**\n   * The base implementation of `_.map` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   */\n  function baseMap(collection, iteratee) {\n    var index = -1,\n      result = isArrayLike(collection) ? Array(collection.length) : []\n\n    baseEach$1(collection, function (value, key, collection) {\n      result[++index] = iteratee(value, key, collection)\n    })\n    return result\n  }\n\n  /**\n   * Creates an array of values by running each element in `collection` thru\n   * `iteratee`. The iteratee is invoked with three arguments:\n   * (value, index|key, collection).\n   *\n   * Many lodash methods are guarded to work as iteratees for methods like\n   * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n   *\n   * The guarded methods are:\n   * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n   * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n   * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n   * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new mapped array.\n   * @example\n   *\n   * function square(n) {\n   *   return n * n;\n   * }\n   *\n   * _.map([4, 8], square);\n   * // => [16, 64]\n   *\n   * _.map({ 'a': 4, 'b': 8 }, square);\n   * // => [16, 64] (iteration order is not guaranteed)\n   *\n   * var users = [\n   *   { 'user': 'barney' },\n   *   { 'user': 'fred' }\n   * ];\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.map(users, 'user');\n   * // => ['barney', 'fred']\n   */\n  function map(collection, iteratee) {\n    var func = isArray$1(collection) ? arrayMap : baseMap\n    return func(collection, baseIteratee(iteratee))\n  }\n\n  /**\n   * Creates a flattened array of values by running each element in `collection`\n   * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n   * with three arguments: (value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new flattened array.\n   * @example\n   *\n   * function duplicate(n) {\n   *   return [n, n];\n   * }\n   *\n   * _.flatMap([1, 2], duplicate);\n   * // => [1, 1, 2, 2]\n   */\n  function flatMap(collection, iteratee) {\n    return baseFlatten(map(collection, iteratee), 1)\n  }\n\n  /** Used for built-in method references. */\n  var objectProto$2 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$2 = objectProto$2.hasOwnProperty\n\n  /**\n   * Creates an object composed of keys generated from the results of running\n   * each element of `collection` thru `iteratee`. The order of grouped values\n   * is determined by the order they occur in `collection`. The corresponding\n   * value of each key is an array of elements responsible for generating the\n   * key. The iteratee is invoked with one argument: (value).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n   * @returns {Object} Returns the composed aggregate object.\n   * @example\n   *\n   * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n   * // => { '4': [4.2], '6': [6.1, 6.3] }\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.groupBy(['one', 'two', 'three'], 'length');\n   * // => { '3': ['one', 'two'], '5': ['three'] }\n   */\n  var groupBy = createAggregator(function (result, value, key) {\n    if (hasOwnProperty$2.call(result, key)) {\n      result[key].push(value)\n    } else {\n      baseAssignValue(result, key, [value])\n    }\n  })\n\n  const groupBy$1 = groupBy\n\n  /** Used for built-in method references. */\n  var objectProto$1 = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty$1 = objectProto$1.hasOwnProperty\n\n  /**\n   * The base implementation of `_.has` without support for deep paths.\n   *\n   * @private\n   * @param {Object} [object] The object to query.\n   * @param {Array|string} key The key to check.\n   * @returns {boolean} Returns `true` if `key` exists, else `false`.\n   */\n  function baseHas(object, key) {\n    return object != null && hasOwnProperty$1.call(object, key)\n  }\n\n  /**\n   * Checks if `path` is a direct property of `object`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @param {Array|string} path The path to check.\n   * @returns {boolean} Returns `true` if `path` exists, else `false`.\n   * @example\n   *\n   * var object = { 'a': { 'b': 2 } };\n   * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n   *\n   * _.has(object, 'a');\n   * // => true\n   *\n   * _.has(object, 'a.b');\n   * // => true\n   *\n   * _.has(object, ['a', 'b']);\n   * // => true\n   *\n   * _.has(other, 'a');\n   * // => false\n   */\n  function has(object, path) {\n    return object != null && hasPath(object, path, baseHas)\n  }\n\n  /** `Object#toString` result references. */\n  var stringTag = '[object String]'\n\n  /**\n   * Checks if `value` is classified as a `String` primitive or object.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n   * @example\n   *\n   * _.isString('abc');\n   * // => true\n   *\n   * _.isString(1);\n   * // => false\n   */\n  function isString(value) {\n    return typeof value == 'string' || (!isArray$1(value) && isObjectLike(value) && baseGetTag(value) == stringTag)\n  }\n\n  /**\n   * The base implementation of `_.values` and `_.valuesIn` which creates an\n   * array of `object` property values corresponding to the property names\n   * of `props`.\n   *\n   * @private\n   * @param {Object} object The object to query.\n   * @param {Array} props The property names to get values for.\n   * @returns {Object} Returns the array of property values.\n   */\n  function baseValues(object, props) {\n    return arrayMap(props, function (key) {\n      return object[key]\n    })\n  }\n\n  /**\n   * Creates an array of the own enumerable string keyed property values of `object`.\n   *\n   * **Note:** Non-object values are coerced to objects.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Object\n   * @param {Object} object The object to query.\n   * @returns {Array} Returns the array of property values.\n   * @example\n   *\n   * function Foo() {\n   *   this.a = 1;\n   *   this.b = 2;\n   * }\n   *\n   * Foo.prototype.c = 3;\n   *\n   * _.values(new Foo);\n   * // => [1, 2] (iteration order is not guaranteed)\n   *\n   * _.values('hi');\n   * // => ['h', 'i']\n   */\n  function values(object) {\n    return object == null ? [] : baseValues(object, keys(object))\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax$1 = Math.max\n\n  /**\n   * Checks if `value` is in `collection`. If `collection` is a string, it's\n   * checked for a substring of `value`, otherwise\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * is used for equality comparisons. If `fromIndex` is negative, it's used as\n   * the offset from the end of `collection`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object|string} collection The collection to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n   * @returns {boolean} Returns `true` if `value` is found, else `false`.\n   * @example\n   *\n   * _.includes([1, 2, 3], 1);\n   * // => true\n   *\n   * _.includes([1, 2, 3], 1, 2);\n   * // => false\n   *\n   * _.includes({ 'a': 1, 'b': 2 }, 1);\n   * // => true\n   *\n   * _.includes('abcd', 'bc');\n   * // => true\n   */\n  function includes(collection, value, fromIndex, guard) {\n    collection = isArrayLike(collection) ? collection : values(collection)\n    fromIndex = fromIndex && !guard ? toInteger(fromIndex) : 0\n\n    var length = collection.length\n    if (fromIndex < 0) {\n      fromIndex = nativeMax$1(length + fromIndex, 0)\n    }\n    return isString(collection)\n      ? fromIndex <= length && collection.indexOf(value, fromIndex) > -1\n      : !!length && baseIndexOf(collection, value, fromIndex) > -1\n  }\n\n  /* Built-in method references for those with the same name as other `lodash` methods. */\n  var nativeMax = Math.max\n\n  /**\n   * Gets the index at which the first occurrence of `value` is found in `array`\n   * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons. If `fromIndex` is negative, it's used as the\n   * offset from the end of `array`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @param {*} value The value to search for.\n   * @param {number} [fromIndex=0] The index to search from.\n   * @returns {number} Returns the index of the matched value, else `-1`.\n   * @example\n   *\n   * _.indexOf([1, 2, 1, 2], 2);\n   * // => 1\n   *\n   * // Search from the `fromIndex`.\n   * _.indexOf([1, 2, 1, 2], 2, 2);\n   * // => 3\n   */\n  function indexOf(array, value, fromIndex) {\n    var length = array == null ? 0 : array.length\n    if (!length) {\n      return -1\n    }\n    var index = fromIndex == null ? 0 : toInteger(fromIndex)\n    if (index < 0) {\n      index = nativeMax(length + index, 0)\n    }\n    return baseIndexOf(array, value, index)\n  }\n\n  /** `Object#toString` result references. */\n  var mapTag = '[object Map]',\n    setTag = '[object Set]'\n\n  /** Used for built-in method references. */\n  var objectProto = Object.prototype\n\n  /** Used to check objects for own properties. */\n  var hasOwnProperty = objectProto.hasOwnProperty\n\n  /**\n   * Checks if `value` is an empty object, collection, map, or set.\n   *\n   * Objects are considered empty if they have no own enumerable string keyed\n   * properties.\n   *\n   * Array-like values such as `arguments` objects, arrays, buffers, strings, or\n   * jQuery-like collections are considered empty if they have a `length` of `0`.\n   * Similarly, maps and sets are considered empty if they have a `size` of `0`.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is empty, else `false`.\n   * @example\n   *\n   * _.isEmpty(null);\n   * // => true\n   *\n   * _.isEmpty(true);\n   * // => true\n   *\n   * _.isEmpty(1);\n   * // => true\n   *\n   * _.isEmpty([1, 2, 3]);\n   * // => false\n   *\n   * _.isEmpty({ 'a': 1 });\n   * // => false\n   */\n  function isEmpty(value) {\n    if (value == null) {\n      return true\n    }\n    if (\n      isArrayLike(value) &&\n      (isArray$1(value) ||\n        typeof value == 'string' ||\n        typeof value.splice == 'function' ||\n        isBuffer$1(value) ||\n        isTypedArray$1(value) ||\n        isArguments$1(value))\n    ) {\n      return !value.length\n    }\n    var tag = getTag$1(value)\n    if (tag == mapTag || tag == setTag) {\n      return !value.size\n    }\n    if (isPrototype(value)) {\n      return !baseKeys(value).length\n    }\n    for (var key in value) {\n      if (hasOwnProperty.call(value, key)) {\n        return false\n      }\n    }\n    return true\n  }\n\n  /** `Object#toString` result references. */\n  var regexpTag = '[object RegExp]'\n\n  /**\n   * The base implementation of `_.isRegExp` without Node.js optimizations.\n   *\n   * @private\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n   */\n  function baseIsRegExp(value) {\n    return isObjectLike(value) && baseGetTag(value) == regexpTag\n  }\n\n  /* Node.js helper references. */\n  var nodeIsRegExp = nodeUtil$1 && nodeUtil$1.isRegExp\n\n  /**\n   * Checks if `value` is classified as a `RegExp` object.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n   * @example\n   *\n   * _.isRegExp(/abc/);\n   * // => true\n   *\n   * _.isRegExp('/abc/');\n   * // => false\n   */\n  var isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp\n\n  const isRegExp$1 = isRegExp\n\n  /**\n   * Checks if `value` is `undefined`.\n   *\n   * @static\n   * @since 0.1.0\n   * @memberOf _\n   * @category Lang\n   * @param {*} value The value to check.\n   * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n   * @example\n   *\n   * _.isUndefined(void 0);\n   * // => true\n   *\n   * _.isUndefined(null);\n   * // => false\n   */\n  function isUndefined(value) {\n    return value === undefined\n  }\n\n  /** Error message constants. */\n  var FUNC_ERROR_TEXT = 'Expected a function'\n\n  /**\n   * Creates a function that negates the result of the predicate `func`. The\n   * `func` predicate is invoked with the `this` binding and arguments of the\n   * created function.\n   *\n   * @static\n   * @memberOf _\n   * @since 3.0.0\n   * @category Function\n   * @param {Function} predicate The predicate to negate.\n   * @returns {Function} Returns the new negated function.\n   * @example\n   *\n   * function isEven(n) {\n   *   return n % 2 == 0;\n   * }\n   *\n   * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n   * // => [1, 3, 5]\n   */\n  function negate(predicate) {\n    if (typeof predicate != 'function') {\n      throw new TypeError(FUNC_ERROR_TEXT)\n    }\n    return function () {\n      var args = arguments\n      switch (args.length) {\n        case 0:\n          return !predicate.call(this)\n        case 1:\n          return !predicate.call(this, args[0])\n        case 2:\n          return !predicate.call(this, args[0], args[1])\n        case 3:\n          return !predicate.call(this, args[0], args[1], args[2])\n      }\n      return !predicate.apply(this, args)\n    }\n  }\n\n  /**\n   * The base implementation of `_.set`.\n   *\n   * @private\n   * @param {Object} object The object to modify.\n   * @param {Array|string} path The path of the property to set.\n   * @param {*} value The value to set.\n   * @param {Function} [customizer] The function to customize path creation.\n   * @returns {Object} Returns `object`.\n   */\n  function baseSet(object, path, value, customizer) {\n    if (!isObject(object)) {\n      return object\n    }\n    path = castPath(path, object)\n\n    var index = -1,\n      length = path.length,\n      lastIndex = length - 1,\n      nested = object\n\n    while (nested != null && ++index < length) {\n      var key = toKey(path[index]),\n        newValue = value\n\n      if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n        return object\n      }\n\n      if (index != lastIndex) {\n        var objValue = nested[key]\n        newValue = customizer ? customizer(objValue, key, nested) : undefined\n        if (newValue === undefined) {\n          newValue = isObject(objValue) ? objValue : isIndex(path[index + 1]) ? [] : {}\n        }\n      }\n      assignValue(nested, key, newValue)\n      nested = nested[key]\n    }\n    return object\n  }\n\n  /**\n   * The base implementation of  `_.pickBy` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Object} object The source object.\n   * @param {string[]} paths The property paths to pick.\n   * @param {Function} predicate The function invoked per property.\n   * @returns {Object} Returns the new object.\n   */\n  function basePickBy(object, paths, predicate) {\n    var index = -1,\n      length = paths.length,\n      result = {}\n\n    while (++index < length) {\n      var path = paths[index],\n        value = baseGet(object, path)\n\n      if (predicate(value, path)) {\n        baseSet(result, castPath(path, object), value)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates an object composed of the `object` properties `predicate` returns\n   * truthy for. The predicate is invoked with two arguments: (value, key).\n   *\n   * @static\n   * @memberOf _\n   * @since 4.0.0\n   * @category Object\n   * @param {Object} object The source object.\n   * @param {Function} [predicate=_.identity] The function invoked per property.\n   * @returns {Object} Returns the new object.\n   * @example\n   *\n   * var object = { 'a': 1, 'b': '2', 'c': 3 };\n   *\n   * _.pickBy(object, _.isNumber);\n   * // => { 'a': 1, 'c': 3 }\n   */\n  function pickBy(object, predicate) {\n    if (object == null) {\n      return {}\n    }\n    var props = arrayMap(getAllKeysIn(object), function (prop) {\n      return [prop]\n    })\n    predicate = baseIteratee(predicate)\n    return basePickBy(object, props, function (value, path) {\n      return predicate(value, path[0])\n    })\n  }\n\n  /**\n   * The base implementation of `_.reduce` and `_.reduceRight`, without support\n   * for iteratee shorthands, which iterates over `collection` using `eachFunc`.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} iteratee The function invoked per iteration.\n   * @param {*} accumulator The initial value.\n   * @param {boolean} initAccum Specify using the first or last element of\n   *  `collection` as the initial value.\n   * @param {Function} eachFunc The function to iterate over `collection`.\n   * @returns {*} Returns the accumulated value.\n   */\n  function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {\n    eachFunc(collection, function (value, index, collection) {\n      accumulator = initAccum ? ((initAccum = false), value) : iteratee(accumulator, value, index, collection)\n    })\n    return accumulator\n  }\n\n  /**\n   * Reduces `collection` to a value which is the accumulated result of running\n   * each element in `collection` thru `iteratee`, where each successive\n   * invocation is supplied the return value of the previous. If `accumulator`\n   * is not given, the first element of `collection` is used as the initial\n   * value. The iteratee is invoked with four arguments:\n   * (accumulator, value, index|key, collection).\n   *\n   * Many lodash methods are guarded to work as iteratees for methods like\n   * `_.reduce`, `_.reduceRight`, and `_.transform`.\n   *\n   * The guarded methods are:\n   * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,\n   * and `sortBy`\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n   * @param {*} [accumulator] The initial value.\n   * @returns {*} Returns the accumulated value.\n   * @see _.reduceRight\n   * @example\n   *\n   * _.reduce([1, 2], function(sum, n) {\n   *   return sum + n;\n   * }, 0);\n   * // => 3\n   *\n   * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {\n   *   (result[value] || (result[value] = [])).push(key);\n   *   return result;\n   * }, {});\n   * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)\n   */\n  function reduce(collection, iteratee, accumulator) {\n    var func = isArray$1(collection) ? arrayReduce : baseReduce,\n      initAccum = arguments.length < 3\n\n    return func(collection, baseIteratee(iteratee), accumulator, initAccum, baseEach$1)\n  }\n\n  /**\n   * The opposite of `_.filter`; this method returns the elements of `collection`\n   * that `predicate` does **not** return truthy for.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @returns {Array} Returns the new filtered array.\n   * @see _.filter\n   * @example\n   *\n   * var users = [\n   *   { 'user': 'barney', 'age': 36, 'active': false },\n   *   { 'user': 'fred',   'age': 40, 'active': true }\n   * ];\n   *\n   * _.reject(users, function(o) { return !o.active; });\n   * // => objects for ['fred']\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.reject(users, { 'age': 40, 'active': true });\n   * // => objects for ['barney']\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.reject(users, ['active', false]);\n   * // => objects for ['fred']\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.reject(users, 'active');\n   * // => objects for ['barney']\n   */\n  function reject(collection, predicate) {\n    var func = isArray$1(collection) ? arrayFilter : baseFilter\n    return func(collection, negate(baseIteratee(predicate)))\n  }\n\n  /**\n   * The base implementation of `_.some` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} predicate The function invoked per iteration.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   */\n  function baseSome(collection, predicate) {\n    var result\n\n    baseEach$1(collection, function (value, index, collection) {\n      result = predicate(value, index, collection)\n      return !result\n    })\n    return !!result\n  }\n\n  /**\n   * Checks if `predicate` returns truthy for **any** element of `collection`.\n   * Iteration is stopped once `predicate` returns truthy. The predicate is\n   * invoked with three arguments: (value, index|key, collection).\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Collection\n   * @param {Array|Object} collection The collection to iterate over.\n   * @param {Function} [predicate=_.identity] The function invoked per iteration.\n   * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n   * @returns {boolean} Returns `true` if any element passes the predicate check,\n   *  else `false`.\n   * @example\n   *\n   * _.some([null, 0, 'yes', false], Boolean);\n   * // => true\n   *\n   * var users = [\n   *   { 'user': 'barney', 'active': true },\n   *   { 'user': 'fred',   'active': false }\n   * ];\n   *\n   * // The `_.matches` iteratee shorthand.\n   * _.some(users, { 'user': 'barney', 'active': false });\n   * // => false\n   *\n   * // The `_.matchesProperty` iteratee shorthand.\n   * _.some(users, ['active', false]);\n   * // => true\n   *\n   * // The `_.property` iteratee shorthand.\n   * _.some(users, 'active');\n   * // => true\n   */\n  function some(collection, predicate, guard) {\n    var func = isArray$1(collection) ? arraySome : baseSome\n    if (guard && isIterateeCall(collection, predicate, guard)) {\n      predicate = undefined\n    }\n    return func(collection, baseIteratee(predicate))\n  }\n\n  /** Used as references for various `Number` constants. */\n  var INFINITY = 1 / 0\n\n  /**\n   * Creates a set object of `values`.\n   *\n   * @private\n   * @param {Array} values The values to add to the set.\n   * @returns {Object} Returns the new set.\n   */\n  var createSet = !(Set$1 && 1 / setToArray(new Set$1([, -0]))[1] == INFINITY)\n    ? noop\n    : function (values) {\n        return new Set$1(values)\n      }\n\n  const createSet$1 = createSet\n\n  /** Used as the size to enable large array optimizations. */\n  var LARGE_ARRAY_SIZE = 200\n\n  /**\n   * The base implementation of `_.uniqBy` without support for iteratee shorthands.\n   *\n   * @private\n   * @param {Array} array The array to inspect.\n   * @param {Function} [iteratee] The iteratee invoked per element.\n   * @param {Function} [comparator] The comparator invoked per element.\n   * @returns {Array} Returns the new duplicate free array.\n   */\n  function baseUniq(array, iteratee, comparator) {\n    var index = -1,\n      includes = arrayIncludes,\n      length = array.length,\n      isCommon = true,\n      result = [],\n      seen = result\n\n    if (comparator) {\n      isCommon = false\n      includes = arrayIncludesWith\n    } else if (length >= LARGE_ARRAY_SIZE) {\n      var set = iteratee ? null : createSet$1(array)\n      if (set) {\n        return setToArray(set)\n      }\n      isCommon = false\n      includes = cacheHas\n      seen = new SetCache()\n    } else {\n      seen = iteratee ? [] : result\n    }\n    outer: while (++index < length) {\n      var value = array[index],\n        computed = iteratee ? iteratee(value) : value\n\n      value = comparator || value !== 0 ? value : 0\n      if (isCommon && computed === computed) {\n        var seenIndex = seen.length\n        while (seenIndex--) {\n          if (seen[seenIndex] === computed) {\n            continue outer\n          }\n        }\n        if (iteratee) {\n          seen.push(computed)\n        }\n        result.push(value)\n      } else if (!includes(seen, computed, comparator)) {\n        if (seen !== result) {\n          seen.push(computed)\n        }\n        result.push(value)\n      }\n    }\n    return result\n  }\n\n  /**\n   * Creates a duplicate-free version of an array, using\n   * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n   * for equality comparisons, in which only the first occurrence of each element\n   * is kept. The order of result values is determined by the order they occur\n   * in the array.\n   *\n   * @static\n   * @memberOf _\n   * @since 0.1.0\n   * @category Array\n   * @param {Array} array The array to inspect.\n   * @returns {Array} Returns the new duplicate free array.\n   * @example\n   *\n   * _.uniq([2, 1, 2]);\n   * // => [2, 1]\n   */\n  function uniq(array) {\n    return array && array.length ? baseUniq(array) : []\n  }\n\n  function PRINT_ERROR(msg) {\n    /* istanbul ignore else - can't override global.console in node.js */\n    if (console && console.error) {\n      console.error(`Error: ${msg}`)\n    }\n  }\n  function PRINT_WARNING(msg) {\n    /* istanbul ignore else - can't override global.console in node.js*/\n    if (console && console.warn) {\n      // TODO: modify docs accordingly\n      console.warn(`Warning: ${msg}`)\n    }\n  }\n\n  function timer(func) {\n    const start = new Date().getTime()\n    const val = func()\n    const end = new Date().getTime()\n    const total = end - start\n    return { time: total, value: val }\n  }\n\n  // based on: https://github.com/petkaantonov/bluebird/blob/b97c0d2d487e8c5076e8bd897e0dcd4622d31846/src/util.js#L201-L216\n  function toFastProperties(toBecomeFast) {\n    function FakeConstructor() {}\n    // If our object is used as a constructor, it would receive\n    FakeConstructor.prototype = toBecomeFast\n    const fakeInstance = new FakeConstructor()\n    function fakeAccess() {\n      return typeof fakeInstance.bar\n    }\n    // help V8 understand this is a \"real\" prototype by actually using\n    // the fake instance.\n    fakeAccess()\n    fakeAccess()\n    // Always true condition to suppress the Firefox warning of unreachable\n    // code after a return statement.\n    return toBecomeFast\n  }\n\n  // TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\n  function tokenLabel$1(tokType) {\n    if (hasTokenLabel$1(tokType)) {\n      return tokType.LABEL\n    } else {\n      return tokType.name\n    }\n  }\n  // TODO: duplicated code to avoid extracting another sub-package -- how to avoid?\n  function hasTokenLabel$1(obj) {\n    return isString(obj.LABEL) && obj.LABEL !== ''\n  }\n  class AbstractProduction {\n    get definition() {\n      return this._definition\n    }\n    set definition(value) {\n      this._definition = value\n    }\n    constructor(_definition) {\n      this._definition = _definition\n    }\n    accept(visitor) {\n      visitor.visit(this)\n      forEach(this.definition, (prod) => {\n        prod.accept(visitor)\n      })\n    }\n  }\n  class NonTerminal extends AbstractProduction {\n    constructor(options) {\n      super([])\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n    set definition(definition) {\n      // immutable\n    }\n    get definition() {\n      if (this.referencedRule !== undefined) {\n        return this.referencedRule.definition\n      }\n      return []\n    }\n    accept(visitor) {\n      visitor.visit(this)\n      // don't visit children of a reference, we will get cyclic infinite loops if we do so\n    }\n  }\n  class Rule extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.orgText = ''\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class Alternative extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.ignoreAmbiguities = false\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class Option extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class RepetitionMandatory extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class RepetitionMandatoryWithSeparator extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class Repetition extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class RepetitionWithSeparator extends AbstractProduction {\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class Alternation extends AbstractProduction {\n    get definition() {\n      return this._definition\n    }\n    set definition(value) {\n      this._definition = value\n    }\n    constructor(options) {\n      super(options.definition)\n      this.idx = 1\n      this.ignoreAmbiguities = false\n      this.hasPredicates = false\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n  }\n  class Terminal {\n    constructor(options) {\n      this.idx = 1\n      assign$1(\n        this,\n        pickBy(options, (v) => v !== undefined),\n      )\n    }\n    accept(visitor) {\n      visitor.visit(this)\n    }\n  }\n  function serializeGrammar(topRules) {\n    return map(topRules, serializeProduction)\n  }\n  function serializeProduction(node) {\n    function convertDefinition(definition) {\n      return map(definition, serializeProduction)\n    }\n    /* istanbul ignore else */\n    if (node instanceof NonTerminal) {\n      const serializedNonTerminal = {\n        type: 'NonTerminal',\n        name: node.nonTerminalName,\n        idx: node.idx,\n      }\n      if (isString(node.label)) {\n        serializedNonTerminal.label = node.label\n      }\n      return serializedNonTerminal\n    } else if (node instanceof Alternative) {\n      return {\n        type: 'Alternative',\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof Option) {\n      return {\n        type: 'Option',\n        idx: node.idx,\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof RepetitionMandatory) {\n      return {\n        type: 'RepetitionMandatory',\n        idx: node.idx,\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof RepetitionMandatoryWithSeparator) {\n      return {\n        type: 'RepetitionMandatoryWithSeparator',\n        idx: node.idx,\n        separator: serializeProduction(new Terminal({ terminalType: node.separator })),\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof RepetitionWithSeparator) {\n      return {\n        type: 'RepetitionWithSeparator',\n        idx: node.idx,\n        separator: serializeProduction(new Terminal({ terminalType: node.separator })),\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof Repetition) {\n      return {\n        type: 'Repetition',\n        idx: node.idx,\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof Alternation) {\n      return {\n        type: 'Alternation',\n        idx: node.idx,\n        definition: convertDefinition(node.definition),\n      }\n    } else if (node instanceof Terminal) {\n      const serializedTerminal = {\n        type: 'Terminal',\n        name: node.terminalType.name,\n        label: tokenLabel$1(node.terminalType),\n        idx: node.idx,\n      }\n      if (isString(node.label)) {\n        serializedTerminal.terminalLabel = node.label\n      }\n      const pattern = node.terminalType.PATTERN\n      if (node.terminalType.PATTERN) {\n        serializedTerminal.pattern = isRegExp$1(pattern) ? pattern.source : pattern\n      }\n      return serializedTerminal\n    } else if (node instanceof Rule) {\n      return {\n        type: 'Rule',\n        name: node.name,\n        orgText: node.orgText,\n        definition: convertDefinition(node.definition),\n      }\n      /* c8 ignore next 3 */\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n\n  class GAstVisitor {\n    visit(node) {\n      const nodeAny = node\n      switch (nodeAny.constructor) {\n        case NonTerminal:\n          return this.visitNonTerminal(nodeAny)\n        case Alternative:\n          return this.visitAlternative(nodeAny)\n        case Option:\n          return this.visitOption(nodeAny)\n        case RepetitionMandatory:\n          return this.visitRepetitionMandatory(nodeAny)\n        case RepetitionMandatoryWithSeparator:\n          return this.visitRepetitionMandatoryWithSeparator(nodeAny)\n        case RepetitionWithSeparator:\n          return this.visitRepetitionWithSeparator(nodeAny)\n        case Repetition:\n          return this.visitRepetition(nodeAny)\n        case Alternation:\n          return this.visitAlternation(nodeAny)\n        case Terminal:\n          return this.visitTerminal(nodeAny)\n        case Rule:\n          return this.visitRule(nodeAny)\n        /* c8 ignore next 2 */\n        default:\n          throw Error('non exhaustive match')\n      }\n    }\n    /* c8 ignore next */\n    visitNonTerminal(node) {}\n    /* c8 ignore next */\n    visitAlternative(node) {}\n    /* c8 ignore next */\n    visitOption(node) {}\n    /* c8 ignore next */\n    visitRepetition(node) {}\n    /* c8 ignore next */\n    visitRepetitionMandatory(node) {}\n    /* c8 ignore next 3 */\n    visitRepetitionMandatoryWithSeparator(node) {}\n    /* c8 ignore next */\n    visitRepetitionWithSeparator(node) {}\n    /* c8 ignore next */\n    visitAlternation(node) {}\n    /* c8 ignore next */\n    visitTerminal(node) {}\n    /* c8 ignore next */\n    visitRule(node) {}\n  }\n\n  function isSequenceProd(prod) {\n    return (\n      prod instanceof Alternative ||\n      prod instanceof Option ||\n      prod instanceof Repetition ||\n      prod instanceof RepetitionMandatory ||\n      prod instanceof RepetitionMandatoryWithSeparator ||\n      prod instanceof RepetitionWithSeparator ||\n      prod instanceof Terminal ||\n      prod instanceof Rule\n    )\n  }\n  function isOptionalProd(prod, alreadyVisited = []) {\n    const isDirectlyOptional =\n      prod instanceof Option || prod instanceof Repetition || prod instanceof RepetitionWithSeparator\n    if (isDirectlyOptional) {\n      return true\n    }\n    // note that this can cause infinite loop if one optional empty TOP production has a cyclic dependency with another\n    // empty optional top rule\n    // may be indirectly optional ((A?B?C?) | (D?E?F?))\n    if (prod instanceof Alternation) {\n      // for OR its enough for just one of the alternatives to be optional\n      return some(prod.definition, (subProd) => {\n        return isOptionalProd(subProd, alreadyVisited)\n      })\n    } else if (prod instanceof NonTerminal && includes(alreadyVisited, prod)) {\n      // avoiding stack overflow due to infinite recursion\n      return false\n    } else if (prod instanceof AbstractProduction) {\n      if (prod instanceof NonTerminal) {\n        alreadyVisited.push(prod)\n      }\n      return every(prod.definition, (subProd) => {\n        return isOptionalProd(subProd, alreadyVisited)\n      })\n    } else {\n      return false\n    }\n  }\n  function isBranchingProd(prod) {\n    return prod instanceof Alternation\n  }\n  function getProductionDslName(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof NonTerminal) {\n      return 'SUBRULE'\n    } else if (prod instanceof Option) {\n      return 'OPTION'\n    } else if (prod instanceof Alternation) {\n      return 'OR'\n    } else if (prod instanceof RepetitionMandatory) {\n      return 'AT_LEAST_ONE'\n    } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n      return 'AT_LEAST_ONE_SEP'\n    } else if (prod instanceof RepetitionWithSeparator) {\n      return 'MANY_SEP'\n    } else if (prod instanceof Repetition) {\n      return 'MANY'\n    } else if (prod instanceof Terminal) {\n      return 'CONSUME'\n      /* c8 ignore next 3 */\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n\n  /**\n   *  A Grammar Walker that computes the \"remaining\" grammar \"after\" a productions in the grammar.\n   */\n  class RestWalker {\n    walk(prod, prevRest = []) {\n      forEach(prod.definition, (subProd, index) => {\n        const currRest = drop(prod.definition, index + 1)\n        /* istanbul ignore else */\n        if (subProd instanceof NonTerminal) {\n          this.walkProdRef(subProd, currRest, prevRest)\n        } else if (subProd instanceof Terminal) {\n          this.walkTerminal(subProd, currRest, prevRest)\n        } else if (subProd instanceof Alternative) {\n          this.walkFlat(subProd, currRest, prevRest)\n        } else if (subProd instanceof Option) {\n          this.walkOption(subProd, currRest, prevRest)\n        } else if (subProd instanceof RepetitionMandatory) {\n          this.walkAtLeastOne(subProd, currRest, prevRest)\n        } else if (subProd instanceof RepetitionMandatoryWithSeparator) {\n          this.walkAtLeastOneSep(subProd, currRest, prevRest)\n        } else if (subProd instanceof RepetitionWithSeparator) {\n          this.walkManySep(subProd, currRest, prevRest)\n        } else if (subProd instanceof Repetition) {\n          this.walkMany(subProd, currRest, prevRest)\n        } else if (subProd instanceof Alternation) {\n          this.walkOr(subProd, currRest, prevRest)\n        } else {\n          throw Error('non exhaustive match')\n        }\n      })\n    }\n    walkTerminal(terminal, currRest, prevRest) {}\n    walkProdRef(refProd, currRest, prevRest) {}\n    walkFlat(flatProd, currRest, prevRest) {\n      // ABCDEF => after the D the rest is EF\n      const fullOrRest = currRest.concat(prevRest)\n      this.walk(flatProd, fullOrRest)\n    }\n    walkOption(optionProd, currRest, prevRest) {\n      // ABC(DE)?F => after the (DE)? the rest is F\n      const fullOrRest = currRest.concat(prevRest)\n      this.walk(optionProd, fullOrRest)\n    }\n    walkAtLeastOne(atLeastOneProd, currRest, prevRest) {\n      // ABC(DE)+F => after the (DE)+ the rest is (DE)?F\n      const fullAtLeastOneRest = [new Option({ definition: atLeastOneProd.definition })].concat(currRest, prevRest)\n      this.walk(atLeastOneProd, fullAtLeastOneRest)\n    }\n    walkAtLeastOneSep(atLeastOneSepProd, currRest, prevRest) {\n      // ABC DE(,DE)* F => after the (,DE)+ the rest is (,DE)?F\n      const fullAtLeastOneSepRest = restForRepetitionWithSeparator(atLeastOneSepProd, currRest, prevRest)\n      this.walk(atLeastOneSepProd, fullAtLeastOneSepRest)\n    }\n    walkMany(manyProd, currRest, prevRest) {\n      // ABC(DE)*F => after the (DE)* the rest is (DE)?F\n      const fullManyRest = [new Option({ definition: manyProd.definition })].concat(currRest, prevRest)\n      this.walk(manyProd, fullManyRest)\n    }\n    walkManySep(manySepProd, currRest, prevRest) {\n      // ABC (DE(,DE)*)? F => after the (,DE)* the rest is (,DE)?F\n      const fullManySepRest = restForRepetitionWithSeparator(manySepProd, currRest, prevRest)\n      this.walk(manySepProd, fullManySepRest)\n    }\n    walkOr(orProd, currRest, prevRest) {\n      // ABC(D|E|F)G => when finding the (D|E|F) the rest is G\n      const fullOrRest = currRest.concat(prevRest)\n      // walk all different alternatives\n      forEach(orProd.definition, (alt) => {\n        // wrapping each alternative in a single definition wrapper\n        // to avoid errors in computing the rest of that alternative in the invocation to computeInProdFollows\n        // (otherwise for OR([alt1,alt2]) alt2 will be considered in 'rest' of alt1\n        const prodWrapper = new Alternative({ definition: [alt] })\n        this.walk(prodWrapper, fullOrRest)\n      })\n    }\n  }\n  function restForRepetitionWithSeparator(repSepProd, currRest, prevRest) {\n    const repSepRest = [\n      new Option({\n        definition: [new Terminal({ terminalType: repSepProd.separator })].concat(repSepProd.definition),\n      }),\n    ]\n    const fullRepSepRest = repSepRest.concat(currRest, prevRest)\n    return fullRepSepRest\n  }\n\n  function first(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof NonTerminal) {\n      // this could in theory cause infinite loops if\n      // (1) prod A refs prod B.\n      // (2) prod B refs prod A\n      // (3) AB can match the empty set\n      // in other words a cycle where everything is optional so the first will keep\n      // looking ahead for the next optional part and will never exit\n      // currently there is no safeguard for this unique edge case because\n      // (1) not sure a grammar in which this can happen is useful for anything (productive)\n      return first(prod.referencedRule)\n    } else if (prod instanceof Terminal) {\n      return firstForTerminal(prod)\n    } else if (isSequenceProd(prod)) {\n      return firstForSequence(prod)\n    } else if (isBranchingProd(prod)) {\n      return firstForBranching(prod)\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n  function firstForSequence(prod) {\n    let firstSet = []\n    const seq = prod.definition\n    let nextSubProdIdx = 0\n    let hasInnerProdsRemaining = seq.length > nextSubProdIdx\n    let currSubProd\n    // so we enter the loop at least once (if the definition is not empty\n    let isLastInnerProdOptional = true\n    // scan a sequence until it's end or until we have found a NONE optional production in it\n    while (hasInnerProdsRemaining && isLastInnerProdOptional) {\n      currSubProd = seq[nextSubProdIdx]\n      isLastInnerProdOptional = isOptionalProd(currSubProd)\n      firstSet = firstSet.concat(first(currSubProd))\n      nextSubProdIdx = nextSubProdIdx + 1\n      hasInnerProdsRemaining = seq.length > nextSubProdIdx\n    }\n    return uniq(firstSet)\n  }\n  function firstForBranching(prod) {\n    const allAlternativesFirsts = map(prod.definition, (innerProd) => {\n      return first(innerProd)\n    })\n    return uniq(flatten(allAlternativesFirsts))\n  }\n  function firstForTerminal(terminal) {\n    return [terminal.terminalType]\n  }\n\n  // TODO: can this be removed? where is it used?\n  const IN = '_~IN~_'\n\n  // This ResyncFollowsWalker computes all of the follows required for RESYNC\n  // (skipping reference production).\n  class ResyncFollowsWalker extends RestWalker {\n    constructor(topProd) {\n      super()\n      this.topProd = topProd\n      this.follows = {}\n    }\n    startWalking() {\n      this.walk(this.topProd)\n      return this.follows\n    }\n    walkTerminal(terminal, currRest, prevRest) {\n      // do nothing! just like in the public sector after 13:00\n    }\n    walkProdRef(refProd, currRest, prevRest) {\n      const followName = buildBetweenProdsFollowPrefix(refProd.referencedRule, refProd.idx) + this.topProd.name\n      const fullRest = currRest.concat(prevRest)\n      const restProd = new Alternative({ definition: fullRest })\n      const t_in_topProd_follows = first(restProd)\n      this.follows[followName] = t_in_topProd_follows\n    }\n  }\n  function computeAllProdsFollows(topProductions) {\n    const reSyncFollows = {}\n    forEach(topProductions, (topProd) => {\n      const currRefsFollow = new ResyncFollowsWalker(topProd).startWalking()\n      assign$1(reSyncFollows, currRefsFollow)\n    })\n    return reSyncFollows\n  }\n  function buildBetweenProdsFollowPrefix(inner, occurenceInParent) {\n    return inner.name + occurenceInParent + IN\n  }\n\n  function cc(char) {\n    return char.charCodeAt(0)\n  }\n  function insertToSet(item, set) {\n    if (Array.isArray(item)) {\n      item.forEach(function (subItem) {\n        set.push(subItem)\n      })\n    } else {\n      set.push(item)\n    }\n  }\n  function addFlag(flagObj, flagKey) {\n    if (flagObj[flagKey] === true) {\n      throw 'duplicate flag ' + flagKey\n    }\n    flagObj[flagKey]\n    flagObj[flagKey] = true\n  }\n  function ASSERT_EXISTS(obj) {\n    // istanbul ignore next\n    if (obj === undefined) {\n      throw Error('Internal Error - Should never get here!')\n    }\n    return true\n  }\n  // istanbul ignore next\n  function ASSERT_NEVER_REACH_HERE() {\n    throw Error('Internal Error - Should never get here!')\n  }\n  function isCharacter(obj) {\n    return obj['type'] === 'Character'\n  }\n\n  const digitsCharCodes = []\n  for (let i = cc('0'); i <= cc('9'); i++) {\n    digitsCharCodes.push(i)\n  }\n  const wordCharCodes = [cc('_')].concat(digitsCharCodes)\n  for (let i = cc('a'); i <= cc('z'); i++) {\n    wordCharCodes.push(i)\n  }\n  for (let i = cc('A'); i <= cc('Z'); i++) {\n    wordCharCodes.push(i)\n  }\n  // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#character-classes\n  const whitespaceCodes = [\n    cc(' '),\n    cc('\\f'),\n    cc('\\n'),\n    cc('\\r'),\n    cc('\\t'),\n    cc('\\v'),\n    cc('\\t'),\n    cc('\\u00a0'),\n    cc('\\u1680'),\n    cc('\\u2000'),\n    cc('\\u2001'),\n    cc('\\u2002'),\n    cc('\\u2003'),\n    cc('\\u2004'),\n    cc('\\u2005'),\n    cc('\\u2006'),\n    cc('\\u2007'),\n    cc('\\u2008'),\n    cc('\\u2009'),\n    cc('\\u200a'),\n    cc('\\u2028'),\n    cc('\\u2029'),\n    cc('\\u202f'),\n    cc('\\u205f'),\n    cc('\\u3000'),\n    cc('\\ufeff'),\n  ]\n\n  // consts and utilities\n  const hexDigitPattern = /[0-9a-fA-F]/\n  const decimalPattern = /[0-9]/\n  const decimalPatternNoZero = /[1-9]/\n  // https://hackernoon.com/the-madness-of-parsing-real-world-javascript-regexps-d9ee336df983\n  // https://www.ecma-international.org/ecma-262/8.0/index.html#prod-Pattern\n  class RegExpParser {\n    constructor() {\n      this.idx = 0\n      this.input = ''\n      this.groupIdx = 0\n    }\n    saveState() {\n      return {\n        idx: this.idx,\n        input: this.input,\n        groupIdx: this.groupIdx,\n      }\n    }\n    restoreState(newState) {\n      this.idx = newState.idx\n      this.input = newState.input\n      this.groupIdx = newState.groupIdx\n    }\n    pattern(input) {\n      // parser state\n      this.idx = 0\n      this.input = input\n      this.groupIdx = 0\n      this.consumeChar('/')\n      const value = this.disjunction()\n      this.consumeChar('/')\n      const flags = {\n        type: 'Flags',\n        loc: { begin: this.idx, end: input.length },\n        global: false,\n        ignoreCase: false,\n        multiLine: false,\n        unicode: false,\n        sticky: false,\n      }\n      while (this.isRegExpFlag()) {\n        switch (this.popChar()) {\n          case 'g':\n            addFlag(flags, 'global')\n            break\n          case 'i':\n            addFlag(flags, 'ignoreCase')\n            break\n          case 'm':\n            addFlag(flags, 'multiLine')\n            break\n          case 'u':\n            addFlag(flags, 'unicode')\n            break\n          case 'y':\n            addFlag(flags, 'sticky')\n            break\n        }\n      }\n      if (this.idx !== this.input.length) {\n        throw Error('Redundant input: ' + this.input.substring(this.idx))\n      }\n      return {\n        type: 'Pattern',\n        flags: flags,\n        value: value,\n        loc: this.loc(0),\n      }\n    }\n    disjunction() {\n      const alts = []\n      const begin = this.idx\n      alts.push(this.alternative())\n      while (this.peekChar() === '|') {\n        this.consumeChar('|')\n        alts.push(this.alternative())\n      }\n      return { type: 'Disjunction', value: alts, loc: this.loc(begin) }\n    }\n    alternative() {\n      const terms = []\n      const begin = this.idx\n      while (this.isTerm()) {\n        terms.push(this.term())\n      }\n      return { type: 'Alternative', value: terms, loc: this.loc(begin) }\n    }\n    term() {\n      if (this.isAssertion()) {\n        return this.assertion()\n      } else {\n        return this.atom()\n      }\n    }\n    assertion() {\n      const begin = this.idx\n      switch (this.popChar()) {\n        case '^':\n          return {\n            type: 'StartAnchor',\n            loc: this.loc(begin),\n          }\n        case '$':\n          return { type: 'EndAnchor', loc: this.loc(begin) }\n        // '\\b' or '\\B'\n        case '\\\\':\n          switch (this.popChar()) {\n            case 'b':\n              return {\n                type: 'WordBoundary',\n                loc: this.loc(begin),\n              }\n            case 'B':\n              return {\n                type: 'NonWordBoundary',\n                loc: this.loc(begin),\n              }\n          }\n          // istanbul ignore next\n          throw Error('Invalid Assertion Escape')\n        // '(?=' or '(?!'\n        case '(':\n          this.consumeChar('?')\n          let type\n          switch (this.popChar()) {\n            case '=':\n              type = 'Lookahead'\n              break\n            case '!':\n              type = 'NegativeLookahead'\n              break\n          }\n          ASSERT_EXISTS(type)\n          const disjunction = this.disjunction()\n          this.consumeChar(')')\n          return {\n            type: type,\n            value: disjunction,\n            loc: this.loc(begin),\n          }\n      }\n      // istanbul ignore next\n      return ASSERT_NEVER_REACH_HERE()\n    }\n    quantifier(isBacktracking = false) {\n      let range = undefined\n      const begin = this.idx\n      switch (this.popChar()) {\n        case '*':\n          range = {\n            atLeast: 0,\n            atMost: Infinity,\n          }\n          break\n        case '+':\n          range = {\n            atLeast: 1,\n            atMost: Infinity,\n          }\n          break\n        case '?':\n          range = {\n            atLeast: 0,\n            atMost: 1,\n          }\n          break\n        case '{':\n          const atLeast = this.integerIncludingZero()\n          switch (this.popChar()) {\n            case '}':\n              range = {\n                atLeast: atLeast,\n                atMost: atLeast,\n              }\n              break\n            case ',':\n              let atMost\n              if (this.isDigit()) {\n                atMost = this.integerIncludingZero()\n                range = {\n                  atLeast: atLeast,\n                  atMost: atMost,\n                }\n              } else {\n                range = {\n                  atLeast: atLeast,\n                  atMost: Infinity,\n                }\n              }\n              this.consumeChar('}')\n              break\n          }\n          // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n          // causes severe performance degradations\n          if (isBacktracking === true && range === undefined) {\n            return undefined\n          }\n          ASSERT_EXISTS(range)\n          break\n      }\n      // throwing exceptions from \"ASSERT_EXISTS\" during backtracking\n      // causes severe performance degradations\n      if (isBacktracking === true && range === undefined) {\n        return undefined\n      }\n      // istanbul ignore else\n      if (ASSERT_EXISTS(range)) {\n        if (this.peekChar(0) === '?') {\n          this.consumeChar('?')\n          range.greedy = false\n        } else {\n          range.greedy = true\n        }\n        range.type = 'Quantifier'\n        range.loc = this.loc(begin)\n        return range\n      }\n    }\n    atom() {\n      let atom\n      const begin = this.idx\n      switch (this.peekChar()) {\n        case '.':\n          atom = this.dotAll()\n          break\n        case '\\\\':\n          atom = this.atomEscape()\n          break\n        case '[':\n          atom = this.characterClass()\n          break\n        case '(':\n          atom = this.group()\n          break\n      }\n      if (atom === undefined && this.isPatternCharacter()) {\n        atom = this.patternCharacter()\n      }\n      // istanbul ignore else\n      if (ASSERT_EXISTS(atom)) {\n        atom.loc = this.loc(begin)\n        if (this.isQuantifier()) {\n          atom.quantifier = this.quantifier()\n        }\n        return atom\n      }\n    }\n    dotAll() {\n      this.consumeChar('.')\n      return {\n        type: 'Set',\n        complement: true,\n        value: [cc('\\n'), cc('\\r'), cc('\\u2028'), cc('\\u2029')],\n      }\n    }\n    atomEscape() {\n      this.consumeChar('\\\\')\n      switch (this.peekChar()) {\n        case '1':\n        case '2':\n        case '3':\n        case '4':\n        case '5':\n        case '6':\n        case '7':\n        case '8':\n        case '9':\n          return this.decimalEscapeAtom()\n        case 'd':\n        case 'D':\n        case 's':\n        case 'S':\n        case 'w':\n        case 'W':\n          return this.characterClassEscape()\n        case 'f':\n        case 'n':\n        case 'r':\n        case 't':\n        case 'v':\n          return this.controlEscapeAtom()\n        case 'c':\n          return this.controlLetterEscapeAtom()\n        case '0':\n          return this.nulCharacterAtom()\n        case 'x':\n          return this.hexEscapeSequenceAtom()\n        case 'u':\n          return this.regExpUnicodeEscapeSequenceAtom()\n        default:\n          return this.identityEscapeAtom()\n      }\n    }\n    decimalEscapeAtom() {\n      const value = this.positiveInteger()\n      return { type: 'GroupBackReference', value: value }\n    }\n    characterClassEscape() {\n      let set\n      let complement = false\n      switch (this.popChar()) {\n        case 'd':\n          set = digitsCharCodes\n          break\n        case 'D':\n          set = digitsCharCodes\n          complement = true\n          break\n        case 's':\n          set = whitespaceCodes\n          break\n        case 'S':\n          set = whitespaceCodes\n          complement = true\n          break\n        case 'w':\n          set = wordCharCodes\n          break\n        case 'W':\n          set = wordCharCodes\n          complement = true\n          break\n      }\n      // istanbul ignore else\n      if (ASSERT_EXISTS(set)) {\n        return { type: 'Set', value: set, complement: complement }\n      }\n    }\n    controlEscapeAtom() {\n      let escapeCode\n      switch (this.popChar()) {\n        case 'f':\n          escapeCode = cc('\\f')\n          break\n        case 'n':\n          escapeCode = cc('\\n')\n          break\n        case 'r':\n          escapeCode = cc('\\r')\n          break\n        case 't':\n          escapeCode = cc('\\t')\n          break\n        case 'v':\n          escapeCode = cc('\\v')\n          break\n      }\n      // istanbul ignore else\n      if (ASSERT_EXISTS(escapeCode)) {\n        return { type: 'Character', value: escapeCode }\n      }\n    }\n    controlLetterEscapeAtom() {\n      this.consumeChar('c')\n      const letter = this.popChar()\n      if (/[a-zA-Z]/.test(letter) === false) {\n        throw Error('Invalid ')\n      }\n      const letterCode = letter.toUpperCase().charCodeAt(0) - 64\n      return { type: 'Character', value: letterCode }\n    }\n    nulCharacterAtom() {\n      // TODO implement '[lookahead ∉ DecimalDigit]'\n      // TODO: for the deprecated octal escape sequence\n      this.consumeChar('0')\n      return { type: 'Character', value: cc('\\0') }\n    }\n    hexEscapeSequenceAtom() {\n      this.consumeChar('x')\n      return this.parseHexDigits(2)\n    }\n    regExpUnicodeEscapeSequenceAtom() {\n      this.consumeChar('u')\n      return this.parseHexDigits(4)\n    }\n    identityEscapeAtom() {\n      // TODO: implement \"SourceCharacter but not UnicodeIDContinue\"\n      // // http://unicode.org/reports/tr31/#Specific_Character_Adjustments\n      const escapedChar = this.popChar()\n      return { type: 'Character', value: cc(escapedChar) }\n    }\n    classPatternCharacterAtom() {\n      switch (this.peekChar()) {\n        // istanbul ignore next\n        case '\\n':\n        // istanbul ignore next\n        case '\\r':\n        // istanbul ignore next\n        case '\\u2028':\n        // istanbul ignore next\n        case '\\u2029':\n        // istanbul ignore next\n        case '\\\\':\n        // istanbul ignore next\n        case ']':\n          throw Error('TBD')\n        default:\n          const nextChar = this.popChar()\n          return { type: 'Character', value: cc(nextChar) }\n      }\n    }\n    characterClass() {\n      const set = []\n      let complement = false\n      this.consumeChar('[')\n      if (this.peekChar(0) === '^') {\n        this.consumeChar('^')\n        complement = true\n      }\n      while (this.isClassAtom()) {\n        const from = this.classAtom()\n        from.type === 'Character'\n        if (isCharacter(from) && this.isRangeDash()) {\n          this.consumeChar('-')\n          const to = this.classAtom()\n          to.type === 'Character'\n          // a range can only be used when both sides are single characters\n          if (isCharacter(to)) {\n            if (to.value < from.value) {\n              throw Error('Range out of order in character class')\n            }\n            set.push({ from: from.value, to: to.value })\n          } else {\n            // literal dash\n            insertToSet(from.value, set)\n            set.push(cc('-'))\n            insertToSet(to.value, set)\n          }\n        } else {\n          insertToSet(from.value, set)\n        }\n      }\n      this.consumeChar(']')\n      return { type: 'Set', complement: complement, value: set }\n    }\n    classAtom() {\n      switch (this.peekChar()) {\n        // istanbul ignore next\n        case ']':\n        // istanbul ignore next\n        case '\\n':\n        // istanbul ignore next\n        case '\\r':\n        // istanbul ignore next\n        case '\\u2028':\n        // istanbul ignore next\n        case '\\u2029':\n          throw Error('TBD')\n        case '\\\\':\n          return this.classEscape()\n        default:\n          return this.classPatternCharacterAtom()\n      }\n    }\n    classEscape() {\n      this.consumeChar('\\\\')\n      switch (this.peekChar()) {\n        // Matches a backspace.\n        // (Not to be confused with \\b word boundary outside characterClass)\n        case 'b':\n          this.consumeChar('b')\n          return { type: 'Character', value: cc('\\u0008') }\n        case 'd':\n        case 'D':\n        case 's':\n        case 'S':\n        case 'w':\n        case 'W':\n          return this.characterClassEscape()\n        case 'f':\n        case 'n':\n        case 'r':\n        case 't':\n        case 'v':\n          return this.controlEscapeAtom()\n        case 'c':\n          return this.controlLetterEscapeAtom()\n        case '0':\n          return this.nulCharacterAtom()\n        case 'x':\n          return this.hexEscapeSequenceAtom()\n        case 'u':\n          return this.regExpUnicodeEscapeSequenceAtom()\n        default:\n          return this.identityEscapeAtom()\n      }\n    }\n    group() {\n      let capturing = true\n      this.consumeChar('(')\n      switch (this.peekChar(0)) {\n        case '?':\n          this.consumeChar('?')\n          this.consumeChar(':')\n          capturing = false\n          break\n        default:\n          this.groupIdx++\n          break\n      }\n      const value = this.disjunction()\n      this.consumeChar(')')\n      const groupAst = {\n        type: 'Group',\n        capturing: capturing,\n        value: value,\n      }\n      if (capturing) {\n        groupAst['idx'] = this.groupIdx\n      }\n      return groupAst\n    }\n    positiveInteger() {\n      let number = this.popChar()\n      // istanbul ignore next - can't ever get here due to previous lookahead checks\n      // still implementing this error checking in case this ever changes.\n      if (decimalPatternNoZero.test(number) === false) {\n        throw Error('Expecting a positive integer')\n      }\n      while (decimalPattern.test(this.peekChar(0))) {\n        number += this.popChar()\n      }\n      return parseInt(number, 10)\n    }\n    integerIncludingZero() {\n      let number = this.popChar()\n      if (decimalPattern.test(number) === false) {\n        throw Error('Expecting an integer')\n      }\n      while (decimalPattern.test(this.peekChar(0))) {\n        number += this.popChar()\n      }\n      return parseInt(number, 10)\n    }\n    patternCharacter() {\n      const nextChar = this.popChar()\n      switch (nextChar) {\n        // istanbul ignore next\n        case '\\n':\n        // istanbul ignore next\n        case '\\r':\n        // istanbul ignore next\n        case '\\u2028':\n        // istanbul ignore next\n        case '\\u2029':\n        // istanbul ignore next\n        case '^':\n        // istanbul ignore next\n        case '$':\n        // istanbul ignore next\n        case '\\\\':\n        // istanbul ignore next\n        case '.':\n        // istanbul ignore next\n        case '*':\n        // istanbul ignore next\n        case '+':\n        // istanbul ignore next\n        case '?':\n        // istanbul ignore next\n        case '(':\n        // istanbul ignore next\n        case ')':\n        // istanbul ignore next\n        case '[':\n        // istanbul ignore next\n        case '|':\n          // istanbul ignore next\n          throw Error('TBD')\n        default:\n          return { type: 'Character', value: cc(nextChar) }\n      }\n    }\n    isRegExpFlag() {\n      switch (this.peekChar(0)) {\n        case 'g':\n        case 'i':\n        case 'm':\n        case 'u':\n        case 'y':\n          return true\n        default:\n          return false\n      }\n    }\n    isRangeDash() {\n      return this.peekChar() === '-' && this.isClassAtom(1)\n    }\n    isDigit() {\n      return decimalPattern.test(this.peekChar(0))\n    }\n    isClassAtom(howMuch = 0) {\n      switch (this.peekChar(howMuch)) {\n        case ']':\n        case '\\n':\n        case '\\r':\n        case '\\u2028':\n        case '\\u2029':\n          return false\n        default:\n          return true\n      }\n    }\n    isTerm() {\n      return this.isAtom() || this.isAssertion()\n    }\n    isAtom() {\n      if (this.isPatternCharacter()) {\n        return true\n      }\n      switch (this.peekChar(0)) {\n        case '.':\n        case '\\\\': // atomEscape\n        case '[': // characterClass\n        // TODO: isAtom must be called before isAssertion - disambiguate\n        case '(': // group\n          return true\n        default:\n          return false\n      }\n    }\n    isAssertion() {\n      switch (this.peekChar(0)) {\n        case '^':\n        case '$':\n          return true\n        // '\\b' or '\\B'\n        case '\\\\':\n          switch (this.peekChar(1)) {\n            case 'b':\n            case 'B':\n              return true\n            default:\n              return false\n          }\n        // '(?=' or '(?!'\n        case '(':\n          return this.peekChar(1) === '?' && (this.peekChar(2) === '=' || this.peekChar(2) === '!')\n        default:\n          return false\n      }\n    }\n    isQuantifier() {\n      const prevState = this.saveState()\n      try {\n        return this.quantifier(true) !== undefined\n      } catch (e) {\n        return false\n      } finally {\n        this.restoreState(prevState)\n      }\n    }\n    isPatternCharacter() {\n      switch (this.peekChar()) {\n        case '^':\n        case '$':\n        case '\\\\':\n        case '.':\n        case '*':\n        case '+':\n        case '?':\n        case '(':\n        case ')':\n        case '[':\n        case '|':\n        case '/':\n        case '\\n':\n        case '\\r':\n        case '\\u2028':\n        case '\\u2029':\n          return false\n        default:\n          return true\n      }\n    }\n    parseHexDigits(howMany) {\n      let hexString = ''\n      for (let i = 0; i < howMany; i++) {\n        const hexChar = this.popChar()\n        if (hexDigitPattern.test(hexChar) === false) {\n          throw Error('Expecting a HexDecimal digits')\n        }\n        hexString += hexChar\n      }\n      const charCode = parseInt(hexString, 16)\n      return { type: 'Character', value: charCode }\n    }\n    peekChar(howMuch = 0) {\n      return this.input[this.idx + howMuch]\n    }\n    popChar() {\n      const nextChar = this.peekChar(0)\n      this.consumeChar(undefined)\n      return nextChar\n    }\n    consumeChar(char) {\n      if (char !== undefined && this.input[this.idx] !== char) {\n        throw Error(\"Expected: '\" + char + \"' but found: '\" + this.input[this.idx] + \"' at offset: \" + this.idx)\n      }\n      if (this.idx >= this.input.length) {\n        throw Error('Unexpected end of input')\n      }\n      this.idx++\n    }\n    loc(begin) {\n      return { begin: begin, end: this.idx }\n    }\n  }\n\n  class BaseRegExpVisitor {\n    visitChildren(node) {\n      for (const key in node) {\n        const child = node[key]\n        /* istanbul ignore else */\n        if (node.hasOwnProperty(key)) {\n          if (child.type !== undefined) {\n            this.visit(child)\n          } else if (Array.isArray(child)) {\n            child.forEach((subChild) => {\n              this.visit(subChild)\n            }, this)\n          }\n        }\n      }\n    }\n    visit(node) {\n      switch (node.type) {\n        case 'Pattern':\n          this.visitPattern(node)\n          break\n        case 'Flags':\n          this.visitFlags(node)\n          break\n        case 'Disjunction':\n          this.visitDisjunction(node)\n          break\n        case 'Alternative':\n          this.visitAlternative(node)\n          break\n        case 'StartAnchor':\n          this.visitStartAnchor(node)\n          break\n        case 'EndAnchor':\n          this.visitEndAnchor(node)\n          break\n        case 'WordBoundary':\n          this.visitWordBoundary(node)\n          break\n        case 'NonWordBoundary':\n          this.visitNonWordBoundary(node)\n          break\n        case 'Lookahead':\n          this.visitLookahead(node)\n          break\n        case 'NegativeLookahead':\n          this.visitNegativeLookahead(node)\n          break\n        case 'Character':\n          this.visitCharacter(node)\n          break\n        case 'Set':\n          this.visitSet(node)\n          break\n        case 'Group':\n          this.visitGroup(node)\n          break\n        case 'GroupBackReference':\n          this.visitGroupBackReference(node)\n          break\n        case 'Quantifier':\n          this.visitQuantifier(node)\n          break\n      }\n      this.visitChildren(node)\n    }\n    visitPattern(node) {}\n    visitFlags(node) {}\n    visitDisjunction(node) {}\n    visitAlternative(node) {}\n    // Assertion\n    visitStartAnchor(node) {}\n    visitEndAnchor(node) {}\n    visitWordBoundary(node) {}\n    visitNonWordBoundary(node) {}\n    visitLookahead(node) {}\n    visitNegativeLookahead(node) {}\n    // atoms\n    visitCharacter(node) {}\n    visitSet(node) {}\n    visitGroup(node) {}\n    visitGroupBackReference(node) {}\n    visitQuantifier(node) {}\n  }\n\n  let regExpAstCache = {}\n  const regExpParser = new RegExpParser()\n  function getRegExpAst(regExp) {\n    const regExpStr = regExp.toString()\n    if (regExpAstCache.hasOwnProperty(regExpStr)) {\n      return regExpAstCache[regExpStr]\n    } else {\n      const regExpAst = regExpParser.pattern(regExpStr)\n      regExpAstCache[regExpStr] = regExpAst\n      return regExpAst\n    }\n  }\n  function clearRegExpParserCache() {\n    regExpAstCache = {}\n  }\n\n  const complementErrorMessage = 'Complement Sets are not supported for first char optimization'\n  const failedOptimizationPrefixMsg = 'Unable to use \"first char\" lexer optimizations:\\n'\n  function getOptimizedStartCodesIndices(regExp, ensureOptimizations = false) {\n    try {\n      const ast = getRegExpAst(regExp)\n      const firstChars = firstCharOptimizedIndices(ast.value, {}, ast.flags.ignoreCase)\n      return firstChars\n    } catch (e) {\n      /* istanbul ignore next */\n      // Testing this relies on the regexp-to-ast library having a bug... */\n      // TODO: only the else branch needs to be ignored, try to fix with newer prettier / tsc\n      if (e.message === complementErrorMessage) {\n        if (ensureOptimizations) {\n          PRINT_WARNING(\n            `${failedOptimizationPrefixMsg}` +\n              `\\tUnable to optimize: < ${regExp.toString()} >\\n` +\n              '\\tComplement Sets cannot be automatically optimized.\\n' +\n              \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n              '\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.',\n          )\n        }\n      } else {\n        let msgSuffix = ''\n        if (ensureOptimizations) {\n          msgSuffix =\n            \"\\n\\tThis will disable the lexer's first char optimizations.\\n\" +\n            '\\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.'\n        }\n        PRINT_ERROR(\n          `${failedOptimizationPrefixMsg}\\n` +\n            `\\tFailed parsing: < ${regExp.toString()} >\\n` +\n            `\\tUsing the @chevrotain/regexp-to-ast library\\n` +\n            '\\tPlease open an issue at: https://github.com/chevrotain/chevrotain/issues' +\n            msgSuffix,\n        )\n      }\n    }\n    return []\n  }\n  function firstCharOptimizedIndices(ast, result, ignoreCase) {\n    switch (ast.type) {\n      case 'Disjunction':\n        for (let i = 0; i < ast.value.length; i++) {\n          firstCharOptimizedIndices(ast.value[i], result, ignoreCase)\n        }\n        break\n      case 'Alternative':\n        const terms = ast.value\n        for (let i = 0; i < terms.length; i++) {\n          const term = terms[i]\n          // skip terms that cannot effect the first char results\n          switch (term.type) {\n            case 'EndAnchor':\n            // A group back reference cannot affect potential starting char.\n            // because if a back reference is the first production than automatically\n            // the group being referenced has had to come BEFORE so its codes have already been added\n            case 'GroupBackReference':\n            // assertions do not affect potential starting codes\n            case 'Lookahead':\n            case 'NegativeLookahead':\n            case 'StartAnchor':\n            case 'WordBoundary':\n            case 'NonWordBoundary':\n              continue\n          }\n          const atom = term\n          switch (atom.type) {\n            case 'Character':\n              addOptimizedIdxToResult(atom.value, result, ignoreCase)\n              break\n            case 'Set':\n              if (atom.complement === true) {\n                throw Error(complementErrorMessage)\n              }\n              forEach(atom.value, (code) => {\n                if (typeof code === 'number') {\n                  addOptimizedIdxToResult(code, result, ignoreCase)\n                } else {\n                  // range\n                  const range = code\n                  // cannot optimize when ignoreCase is\n                  if (ignoreCase === true) {\n                    for (let rangeCode = range.from; rangeCode <= range.to; rangeCode++) {\n                      addOptimizedIdxToResult(rangeCode, result, ignoreCase)\n                    }\n                  }\n                  // Optimization (2 orders of magnitude less work for very large ranges)\n                  else {\n                    // handle unoptimized values\n                    for (\n                      let rangeCode = range.from;\n                      rangeCode <= range.to && rangeCode < minOptimizationVal;\n                      rangeCode++\n                    ) {\n                      addOptimizedIdxToResult(rangeCode, result, ignoreCase)\n                    }\n                    // Less common charCode where we optimize for faster init time, by using larger \"buckets\"\n                    if (range.to >= minOptimizationVal) {\n                      const minUnOptVal = range.from >= minOptimizationVal ? range.from : minOptimizationVal\n                      const maxUnOptVal = range.to\n                      const minOptIdx = charCodeToOptimizedIndex(minUnOptVal)\n                      const maxOptIdx = charCodeToOptimizedIndex(maxUnOptVal)\n                      for (let currOptIdx = minOptIdx; currOptIdx <= maxOptIdx; currOptIdx++) {\n                        result[currOptIdx] = currOptIdx\n                      }\n                    }\n                  }\n                }\n              })\n              break\n            case 'Group':\n              firstCharOptimizedIndices(atom.value, result, ignoreCase)\n              break\n            /* istanbul ignore next */\n            default:\n              throw Error('Non Exhaustive Match')\n          }\n          // reached a mandatory production, no more **start** codes can be found on this alternative\n          const isOptionalQuantifier = atom.quantifier !== undefined && atom.quantifier.atLeast === 0\n          if (\n            // A group may be optional due to empty contents /(?:)/\n            // or if everything inside it is optional /((a)?)/\n            (atom.type === 'Group' && isWholeOptional(atom) === false) ||\n            // If this term is not a group it may only be optional if it has an optional quantifier\n            (atom.type !== 'Group' && isOptionalQuantifier === false)\n          ) {\n            break\n          }\n        }\n        break\n      /* istanbul ignore next */\n      default:\n        throw Error('non exhaustive match!')\n    }\n    // console.log(Object.keys(result).length)\n    return values(result)\n  }\n  function addOptimizedIdxToResult(code, result, ignoreCase) {\n    const optimizedCharIdx = charCodeToOptimizedIndex(code)\n    result[optimizedCharIdx] = optimizedCharIdx\n    if (ignoreCase === true) {\n      handleIgnoreCase(code, result)\n    }\n  }\n  function handleIgnoreCase(code, result) {\n    const char = String.fromCharCode(code)\n    const upperChar = char.toUpperCase()\n    /* istanbul ignore else */\n    if (upperChar !== char) {\n      const optimizedCharIdx = charCodeToOptimizedIndex(upperChar.charCodeAt(0))\n      result[optimizedCharIdx] = optimizedCharIdx\n    } else {\n      const lowerChar = char.toLowerCase()\n      if (lowerChar !== char) {\n        const optimizedCharIdx = charCodeToOptimizedIndex(lowerChar.charCodeAt(0))\n        result[optimizedCharIdx] = optimizedCharIdx\n      }\n    }\n  }\n  function findCode(setNode, targetCharCodes) {\n    return find$1(setNode.value, (codeOrRange) => {\n      if (typeof codeOrRange === 'number') {\n        return includes(targetCharCodes, codeOrRange)\n      } else {\n        // range\n        const range = codeOrRange\n        return find$1(targetCharCodes, (targetCode) => range.from <= targetCode && targetCode <= range.to) !== undefined\n      }\n    })\n  }\n  function isWholeOptional(ast) {\n    const quantifier = ast.quantifier\n    if (quantifier && quantifier.atLeast === 0) {\n      return true\n    }\n    if (!ast.value) {\n      return false\n    }\n    return isArray$1(ast.value) ? every(ast.value, isWholeOptional) : isWholeOptional(ast.value)\n  }\n  class CharCodeFinder extends BaseRegExpVisitor {\n    constructor(targetCharCodes) {\n      super()\n      this.targetCharCodes = targetCharCodes\n      this.found = false\n    }\n    visitChildren(node) {\n      // No need to keep looking...\n      if (this.found === true) {\n        return\n      }\n      // switch lookaheads as they do not actually consume any characters thus\n      // finding a charCode at lookahead context does not mean that regexp can actually contain it in a match.\n      switch (node.type) {\n        case 'Lookahead':\n          this.visitLookahead(node)\n          return\n        case 'NegativeLookahead':\n          this.visitNegativeLookahead(node)\n          return\n      }\n      super.visitChildren(node)\n    }\n    visitCharacter(node) {\n      if (includes(this.targetCharCodes, node.value)) {\n        this.found = true\n      }\n    }\n    visitSet(node) {\n      if (node.complement) {\n        if (findCode(node, this.targetCharCodes) === undefined) {\n          this.found = true\n        }\n      } else {\n        if (findCode(node, this.targetCharCodes) !== undefined) {\n          this.found = true\n        }\n      }\n    }\n  }\n  function canMatchCharCode(charCodes, pattern) {\n    if (pattern instanceof RegExp) {\n      const ast = getRegExpAst(pattern)\n      const charCodeFinder = new CharCodeFinder(charCodes)\n      charCodeFinder.visit(ast)\n      return charCodeFinder.found\n    } else {\n      return (\n        find$1(pattern, (char) => {\n          return includes(charCodes, char.charCodeAt(0))\n        }) !== undefined\n      )\n    }\n  }\n\n  const PATTERN = 'PATTERN'\n  const DEFAULT_MODE = 'defaultMode'\n  const MODES = 'modes'\n  let SUPPORT_STICKY = typeof new RegExp('(?:)').sticky === 'boolean'\n  function analyzeTokenTypes(tokenTypes, options) {\n    options = defaults$1(options, {\n      useSticky: SUPPORT_STICKY,\n      debug: false,\n      safeMode: false,\n      positionTracking: 'full',\n      lineTerminatorCharacters: ['\\r', '\\n'],\n      tracer: (msg, action) => action(),\n    })\n    const tracer = options.tracer\n    tracer('initCharCodeToOptimizedIndexMap', () => {\n      initCharCodeToOptimizedIndexMap()\n    })\n    let onlyRelevantTypes\n    tracer('Reject Lexer.NA', () => {\n      onlyRelevantTypes = reject(tokenTypes, (currType) => {\n        return currType[PATTERN] === Lexer.NA\n      })\n    })\n    let hasCustom = false\n    let allTransformedPatterns\n    tracer('Transform Patterns', () => {\n      hasCustom = false\n      allTransformedPatterns = map(onlyRelevantTypes, (currType) => {\n        const currPattern = currType[PATTERN]\n        /* istanbul ignore else */\n        if (isRegExp$1(currPattern)) {\n          const regExpSource = currPattern.source\n          if (\n            regExpSource.length === 1 &&\n            // only these regExp meta characters which can appear in a length one regExp\n            regExpSource !== '^' &&\n            regExpSource !== '$' &&\n            regExpSource !== '.' &&\n            !currPattern.ignoreCase\n          ) {\n            return regExpSource\n          } else if (\n            regExpSource.length === 2 &&\n            regExpSource[0] === '\\\\' &&\n            // not a meta character\n            !includes(['d', 'D', 's', 'S', 't', 'r', 'n', 't', '0', 'c', 'b', 'B', 'f', 'v', 'w', 'W'], regExpSource[1])\n          ) {\n            // escaped meta Characters: /\\+/ /\\[/\n            // or redundant escaping: /\\a/\n            // without the escaping \"\\\"\n            return regExpSource[1]\n          } else {\n            return options.useSticky ? addStickyFlag(currPattern) : addStartOfInput(currPattern)\n          }\n        } else if (isFunction(currPattern)) {\n          hasCustom = true\n          // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n          return { exec: currPattern }\n        } else if (typeof currPattern === 'object') {\n          hasCustom = true\n          // ICustomPattern\n          return currPattern\n        } else if (typeof currPattern === 'string') {\n          if (currPattern.length === 1) {\n            return currPattern\n          } else {\n            const escapedRegExpString = currPattern.replace(/[\\\\^$.*+?()[\\]{}|]/g, '\\\\$&')\n            const wrappedRegExp = new RegExp(escapedRegExpString)\n            return options.useSticky ? addStickyFlag(wrappedRegExp) : addStartOfInput(wrappedRegExp)\n          }\n        } else {\n          throw Error('non exhaustive match')\n        }\n      })\n    })\n    let patternIdxToType\n    let patternIdxToGroup\n    let patternIdxToLongerAltIdxArr\n    let patternIdxToPushMode\n    let patternIdxToPopMode\n    tracer('misc mapping', () => {\n      patternIdxToType = map(onlyRelevantTypes, (currType) => currType.tokenTypeIdx)\n      patternIdxToGroup = map(onlyRelevantTypes, (clazz) => {\n        const groupName = clazz.GROUP\n        /* istanbul ignore next */\n        if (groupName === Lexer.SKIPPED) {\n          return undefined\n        } else if (isString(groupName)) {\n          return groupName\n        } else if (isUndefined(groupName)) {\n          return false\n        } else {\n          throw Error('non exhaustive match')\n        }\n      })\n      patternIdxToLongerAltIdxArr = map(onlyRelevantTypes, (clazz) => {\n        const longerAltType = clazz.LONGER_ALT\n        if (longerAltType) {\n          const longerAltIdxArr = isArray$1(longerAltType)\n            ? map(longerAltType, (type) => indexOf(onlyRelevantTypes, type))\n            : [indexOf(onlyRelevantTypes, longerAltType)]\n          return longerAltIdxArr\n        }\n      })\n      patternIdxToPushMode = map(onlyRelevantTypes, (clazz) => clazz.PUSH_MODE)\n      patternIdxToPopMode = map(onlyRelevantTypes, (clazz) => has(clazz, 'POP_MODE'))\n    })\n    let patternIdxToCanLineTerminator\n    tracer('Line Terminator Handling', () => {\n      const lineTerminatorCharCodes = getCharCodes(options.lineTerminatorCharacters)\n      patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => false)\n      if (options.positionTracking !== 'onlyOffset') {\n        patternIdxToCanLineTerminator = map(onlyRelevantTypes, (tokType) => {\n          if (has(tokType, 'LINE_BREAKS')) {\n            return !!tokType.LINE_BREAKS\n          } else {\n            return (\n              checkLineBreaksIssues(tokType, lineTerminatorCharCodes) === false &&\n              canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN)\n            )\n          }\n        })\n      }\n    })\n    let patternIdxToIsCustom\n    let patternIdxToShort\n    let emptyGroups\n    let patternIdxToConfig\n    tracer('Misc Mapping #2', () => {\n      patternIdxToIsCustom = map(onlyRelevantTypes, isCustomPattern)\n      patternIdxToShort = map(allTransformedPatterns, isShortPattern)\n      emptyGroups = reduce(\n        onlyRelevantTypes,\n        (acc, clazz) => {\n          const groupName = clazz.GROUP\n          if (isString(groupName) && !(groupName === Lexer.SKIPPED)) {\n            acc[groupName] = []\n          }\n          return acc\n        },\n        {},\n      )\n      patternIdxToConfig = map(allTransformedPatterns, (x, idx) => {\n        return {\n          pattern: allTransformedPatterns[idx],\n          longerAlt: patternIdxToLongerAltIdxArr[idx],\n          canLineTerminator: patternIdxToCanLineTerminator[idx],\n          isCustom: patternIdxToIsCustom[idx],\n          short: patternIdxToShort[idx],\n          group: patternIdxToGroup[idx],\n          push: patternIdxToPushMode[idx],\n          pop: patternIdxToPopMode[idx],\n          tokenTypeIdx: patternIdxToType[idx],\n          tokenType: onlyRelevantTypes[idx],\n        }\n      })\n    })\n    let canBeOptimized = true\n    let charCodeToPatternIdxToConfig = []\n    if (!options.safeMode) {\n      tracer('First Char Optimization', () => {\n        charCodeToPatternIdxToConfig = reduce(\n          onlyRelevantTypes,\n          (result, currTokType, idx) => {\n            if (typeof currTokType.PATTERN === 'string') {\n              const charCode = currTokType.PATTERN.charCodeAt(0)\n              const optimizedIdx = charCodeToOptimizedIndex(charCode)\n              addToMapOfArrays(result, optimizedIdx, patternIdxToConfig[idx])\n            } else if (isArray$1(currTokType.START_CHARS_HINT)) {\n              let lastOptimizedIdx\n              forEach(currTokType.START_CHARS_HINT, (charOrInt) => {\n                const charCode = typeof charOrInt === 'string' ? charOrInt.charCodeAt(0) : charOrInt\n                const currOptimizedIdx = charCodeToOptimizedIndex(charCode)\n                // Avoid adding the config multiple times\n                /* istanbul ignore else */\n                // - Difficult to check this scenario effects as it is only a performance\n                //   optimization that does not change correctness\n                if (lastOptimizedIdx !== currOptimizedIdx) {\n                  lastOptimizedIdx = currOptimizedIdx\n                  addToMapOfArrays(result, currOptimizedIdx, patternIdxToConfig[idx])\n                }\n              })\n            } else if (isRegExp$1(currTokType.PATTERN)) {\n              if (currTokType.PATTERN.unicode) {\n                canBeOptimized = false\n                if (options.ensureOptimizations) {\n                  PRINT_ERROR(\n                    `${failedOptimizationPrefixMsg}` +\n                      `\\tUnable to analyze < ${currTokType.PATTERN.toString()} > pattern.\\n` +\n                      '\\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\\n' +\n                      \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                      '\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE',\n                  )\n                }\n              } else {\n                const optimizedCodes = getOptimizedStartCodesIndices(currTokType.PATTERN, options.ensureOptimizations)\n                /* istanbul ignore if */\n                // start code will only be empty given an empty regExp or failure of regexp-to-ast library\n                // the first should be a different validation and the second cannot be tested.\n                if (isEmpty(optimizedCodes)) {\n                  // we cannot understand what codes may start possible matches\n                  // The optimization correctness requires knowing start codes for ALL patterns.\n                  // Not actually sure this is an error, no debug message\n                  canBeOptimized = false\n                }\n                forEach(optimizedCodes, (code) => {\n                  addToMapOfArrays(result, code, patternIdxToConfig[idx])\n                })\n              }\n            } else {\n              if (options.ensureOptimizations) {\n                PRINT_ERROR(\n                  `${failedOptimizationPrefixMsg}` +\n                    `\\tTokenType: <${currTokType.name}> is using a custom token pattern without providing <start_chars_hint> parameter.\\n` +\n                    \"\\tThis will disable the lexer's first char optimizations.\\n\" +\n                    '\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE',\n                )\n              }\n              canBeOptimized = false\n            }\n            return result\n          },\n          [],\n        )\n      })\n    }\n    return {\n      emptyGroups: emptyGroups,\n      patternIdxToConfig: patternIdxToConfig,\n      charCodeToPatternIdxToConfig: charCodeToPatternIdxToConfig,\n      hasCustom: hasCustom,\n      canBeOptimized: canBeOptimized,\n    }\n  }\n  function validatePatterns(tokenTypes, validModesNames) {\n    let errors = []\n    const missingResult = findMissingPatterns(tokenTypes)\n    errors = errors.concat(missingResult.errors)\n    const invalidResult = findInvalidPatterns(missingResult.valid)\n    const validTokenTypes = invalidResult.valid\n    errors = errors.concat(invalidResult.errors)\n    errors = errors.concat(validateRegExpPattern(validTokenTypes))\n    errors = errors.concat(findInvalidGroupType(validTokenTypes))\n    errors = errors.concat(findModesThatDoNotExist(validTokenTypes, validModesNames))\n    errors = errors.concat(findUnreachablePatterns(validTokenTypes))\n    return errors\n  }\n  function validateRegExpPattern(tokenTypes) {\n    let errors = []\n    const withRegExpPatterns = filter(tokenTypes, (currTokType) => isRegExp$1(currTokType[PATTERN]))\n    errors = errors.concat(findEndOfInputAnchor(withRegExpPatterns))\n    errors = errors.concat(findStartOfInputAnchor(withRegExpPatterns))\n    errors = errors.concat(findUnsupportedFlags(withRegExpPatterns))\n    errors = errors.concat(findDuplicatePatterns(withRegExpPatterns))\n    errors = errors.concat(findEmptyMatchRegExps(withRegExpPatterns))\n    return errors\n  }\n  function findMissingPatterns(tokenTypes) {\n    const tokenTypesWithMissingPattern = filter(tokenTypes, (currType) => {\n      return !has(currType, PATTERN)\n    })\n    const errors = map(tokenTypesWithMissingPattern, (currType) => {\n      return {\n        message: 'Token Type: ->' + currType.name + \"<- missing static 'PATTERN' property\",\n        type: LexerDefinitionErrorType.MISSING_PATTERN,\n        tokenTypes: [currType],\n      }\n    })\n    const valid = difference$1(tokenTypes, tokenTypesWithMissingPattern)\n    return { errors, valid }\n  }\n  function findInvalidPatterns(tokenTypes) {\n    const tokenTypesWithInvalidPattern = filter(tokenTypes, (currType) => {\n      const pattern = currType[PATTERN]\n      return !isRegExp$1(pattern) && !isFunction(pattern) && !has(pattern, 'exec') && !isString(pattern)\n    })\n    const errors = map(tokenTypesWithInvalidPattern, (currType) => {\n      return {\n        message:\n          'Token Type: ->' +\n          currType.name +\n          \"<- static 'PATTERN' can only be a RegExp, a\" +\n          ' Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.',\n        type: LexerDefinitionErrorType.INVALID_PATTERN,\n        tokenTypes: [currType],\n      }\n    })\n    const valid = difference$1(tokenTypes, tokenTypesWithInvalidPattern)\n    return { errors, valid }\n  }\n  const end_of_input = /[^\\\\][$]/\n  function findEndOfInputAnchor(tokenTypes) {\n    class EndAnchorFinder extends BaseRegExpVisitor {\n      constructor() {\n        super(...arguments)\n        this.found = false\n      }\n      visitEndAnchor(node) {\n        this.found = true\n      }\n    }\n    const invalidRegex = filter(tokenTypes, (currType) => {\n      const pattern = currType.PATTERN\n      try {\n        const regexpAst = getRegExpAst(pattern)\n        const endAnchorVisitor = new EndAnchorFinder()\n        endAnchorVisitor.visit(regexpAst)\n        return endAnchorVisitor.found\n      } catch (e) {\n        // old behavior in case of runtime exceptions with regexp-to-ast.\n        /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n        return end_of_input.test(pattern.source)\n      }\n    })\n    const errors = map(invalidRegex, (currType) => {\n      return {\n        message:\n          'Unexpected RegExp Anchor Error:\\n' +\n          '\\tToken Type: ->' +\n          currType.name +\n          \"<- static 'PATTERN' cannot contain end of input anchor '$'\\n\" +\n          '\\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS' +\n          '\\tfor details.',\n        type: LexerDefinitionErrorType.EOI_ANCHOR_FOUND,\n        tokenTypes: [currType],\n      }\n    })\n    return errors\n  }\n  function findEmptyMatchRegExps(tokenTypes) {\n    const matchesEmptyString = filter(tokenTypes, (currType) => {\n      const pattern = currType.PATTERN\n      return pattern.test('')\n    })\n    const errors = map(matchesEmptyString, (currType) => {\n      return {\n        message: 'Token Type: ->' + currType.name + \"<- static 'PATTERN' must not match an empty string\",\n        type: LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,\n        tokenTypes: [currType],\n      }\n    })\n    return errors\n  }\n  const start_of_input = /[^\\\\[][\\^]|^\\^/\n  function findStartOfInputAnchor(tokenTypes) {\n    class StartAnchorFinder extends BaseRegExpVisitor {\n      constructor() {\n        super(...arguments)\n        this.found = false\n      }\n      visitStartAnchor(node) {\n        this.found = true\n      }\n    }\n    const invalidRegex = filter(tokenTypes, (currType) => {\n      const pattern = currType.PATTERN\n      try {\n        const regexpAst = getRegExpAst(pattern)\n        const startAnchorVisitor = new StartAnchorFinder()\n        startAnchorVisitor.visit(regexpAst)\n        return startAnchorVisitor.found\n      } catch (e) {\n        // old behavior in case of runtime exceptions with regexp-to-ast.\n        /* istanbul ignore next - cannot ensure an error in regexp-to-ast*/\n        return start_of_input.test(pattern.source)\n      }\n    })\n    const errors = map(invalidRegex, (currType) => {\n      return {\n        message:\n          'Unexpected RegExp Anchor Error:\\n' +\n          '\\tToken Type: ->' +\n          currType.name +\n          \"<- static 'PATTERN' cannot contain start of input anchor '^'\\n\" +\n          '\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS' +\n          '\\tfor details.',\n        type: LexerDefinitionErrorType.SOI_ANCHOR_FOUND,\n        tokenTypes: [currType],\n      }\n    })\n    return errors\n  }\n  function findUnsupportedFlags(tokenTypes) {\n    const invalidFlags = filter(tokenTypes, (currType) => {\n      const pattern = currType[PATTERN]\n      return pattern instanceof RegExp && (pattern.multiline || pattern.global)\n    })\n    const errors = map(invalidFlags, (currType) => {\n      return {\n        message: 'Token Type: ->' + currType.name + \"<- static 'PATTERN' may NOT contain global('g') or multiline('m')\",\n        type: LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,\n        tokenTypes: [currType],\n      }\n    })\n    return errors\n  }\n  // This can only test for identical duplicate RegExps, not semantically equivalent ones.\n  function findDuplicatePatterns(tokenTypes) {\n    const found = []\n    let identicalPatterns = map(tokenTypes, (outerType) => {\n      return reduce(\n        tokenTypes,\n        (result, innerType) => {\n          if (\n            outerType.PATTERN.source === innerType.PATTERN.source &&\n            !includes(found, innerType) &&\n            innerType.PATTERN !== Lexer.NA\n          ) {\n            // this avoids duplicates in the result, each Token Type may only appear in one \"set\"\n            // in essence we are creating Equivalence classes on equality relation.\n            found.push(innerType)\n            result.push(innerType)\n            return result\n          }\n          return result\n        },\n        [],\n      )\n    })\n    identicalPatterns = compact(identicalPatterns)\n    const duplicatePatterns = filter(identicalPatterns, (currIdenticalSet) => {\n      return currIdenticalSet.length > 1\n    })\n    const errors = map(duplicatePatterns, (setOfIdentical) => {\n      const tokenTypeNames = map(setOfIdentical, (currType) => {\n        return currType.name\n      })\n      const dupPatternSrc = head(setOfIdentical).PATTERN\n      return {\n        message:\n          `The same RegExp pattern ->${dupPatternSrc}<-` +\n          `has been used in all of the following Token Types: ${tokenTypeNames.join(', ')} <-`,\n        type: LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,\n        tokenTypes: setOfIdentical,\n      }\n    })\n    return errors\n  }\n  function findInvalidGroupType(tokenTypes) {\n    const invalidTypes = filter(tokenTypes, (clazz) => {\n      if (!has(clazz, 'GROUP')) {\n        return false\n      }\n      const group = clazz.GROUP\n      return group !== Lexer.SKIPPED && group !== Lexer.NA && !isString(group)\n    })\n    const errors = map(invalidTypes, (currType) => {\n      return {\n        message: 'Token Type: ->' + currType.name + \"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String\",\n        type: LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,\n        tokenTypes: [currType],\n      }\n    })\n    return errors\n  }\n  function findModesThatDoNotExist(tokenTypes, validModes) {\n    const invalidModes = filter(tokenTypes, (clazz) => {\n      return clazz.PUSH_MODE !== undefined && !includes(validModes, clazz.PUSH_MODE)\n    })\n    const errors = map(invalidModes, (tokType) => {\n      const msg =\n        `Token Type: ->${tokType.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${tokType.PUSH_MODE}<-` +\n        `which does not exist`\n      return {\n        message: msg,\n        type: LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,\n        tokenTypes: [tokType],\n      }\n    })\n    return errors\n  }\n  function findUnreachablePatterns(tokenTypes) {\n    const errors = []\n    const canBeTested = reduce(\n      tokenTypes,\n      (result, tokType, idx) => {\n        const pattern = tokType.PATTERN\n        if (pattern === Lexer.NA) {\n          return result\n        }\n        // a more comprehensive validation for all forms of regExps would require\n        // deeper regExp analysis capabilities\n        if (isString(pattern)) {\n          result.push({ str: pattern, idx, tokenType: tokType })\n        } else if (isRegExp$1(pattern) && noMetaChar(pattern)) {\n          result.push({ str: pattern.source, idx, tokenType: tokType })\n        }\n        return result\n      },\n      [],\n    )\n    forEach(tokenTypes, (tokType, testIdx) => {\n      forEach(canBeTested, ({ str, idx, tokenType }) => {\n        if (testIdx < idx && testTokenType(str, tokType.PATTERN)) {\n          const msg =\n            `Token: ->${tokenType.name}<- can never be matched.\\n` +\n            `Because it appears AFTER the Token Type ->${tokType.name}<-` +\n            `in the lexer's definition.\\n` +\n            `See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`\n          errors.push({\n            message: msg,\n            type: LexerDefinitionErrorType.UNREACHABLE_PATTERN,\n            tokenTypes: [tokType, tokenType],\n          })\n        }\n      })\n    })\n    return errors\n  }\n  function testTokenType(str, pattern) {\n    /* istanbul ignore else */\n    if (isRegExp$1(pattern)) {\n      const regExpArray = pattern.exec(str)\n      return regExpArray !== null && regExpArray.index === 0\n    } else if (isFunction(pattern)) {\n      // maintain the API of custom patterns\n      return pattern(str, 0, [], {})\n    } else if (has(pattern, 'exec')) {\n      // maintain the API of custom patterns\n      return pattern.exec(str, 0, [], {})\n    } else if (typeof pattern === 'string') {\n      return pattern === str\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n  function noMetaChar(regExp) {\n    //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp\n    const metaChars = ['.', '\\\\', '[', ']', '|', '^', '$', '(', ')', '?', '*', '+', '{']\n    return find$1(metaChars, (char) => regExp.source.indexOf(char) !== -1) === undefined\n  }\n  function addStartOfInput(pattern) {\n    const flags = pattern.ignoreCase ? 'i' : ''\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(`^(?:${pattern.source})`, flags)\n  }\n  function addStickyFlag(pattern) {\n    const flags = pattern.ignoreCase ? 'iy' : 'y'\n    // always wrapping in a none capturing group preceded by '^' to make sure matching can only work on start of input.\n    // duplicate/redundant start of input markers have no meaning (/^^^^A/ === /^A/)\n    return new RegExp(`${pattern.source}`, flags)\n  }\n  function performRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    const errors = []\n    // some run time checks to help the end users.\n    if (!has(lexerDefinition, DEFAULT_MODE)) {\n      errors.push({\n        message:\n          'A MultiMode Lexer cannot be initialized without a <' + DEFAULT_MODE + '> property in its definition\\n',\n        type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE,\n      })\n    }\n    if (!has(lexerDefinition, MODES)) {\n      errors.push({\n        message: 'A MultiMode Lexer cannot be initialized without a <' + MODES + '> property in its definition\\n',\n        type: LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY,\n      })\n    }\n    if (\n      has(lexerDefinition, MODES) &&\n      has(lexerDefinition, DEFAULT_MODE) &&\n      !has(lexerDefinition.modes, lexerDefinition.defaultMode)\n    ) {\n      errors.push({\n        message:\n          `A MultiMode Lexer cannot be initialized with a ${DEFAULT_MODE}: <${lexerDefinition.defaultMode}>` +\n          `which does not exist\\n`,\n        type: LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST,\n      })\n    }\n    if (has(lexerDefinition, MODES)) {\n      forEach(lexerDefinition.modes, (currModeValue, currModeName) => {\n        forEach(currModeValue, (currTokType, currIdx) => {\n          if (isUndefined(currTokType)) {\n            errors.push({\n              message:\n                `A Lexer cannot be initialized using an undefined Token Type. Mode:` +\n                `<${currModeName}> at index: <${currIdx}>\\n`,\n              type: LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED,\n            })\n          } else if (has(currTokType, 'LONGER_ALT')) {\n            const longerAlt = isArray$1(currTokType.LONGER_ALT) ? currTokType.LONGER_ALT : [currTokType.LONGER_ALT]\n            forEach(longerAlt, (currLongerAlt) => {\n              if (!isUndefined(currLongerAlt) && !includes(currModeValue, currLongerAlt)) {\n                errors.push({\n                  message: `A MultiMode Lexer cannot be initialized with a longer_alt <${currLongerAlt.name}> on token <${currTokType.name}> outside of mode <${currModeName}>\\n`,\n                  type: LexerDefinitionErrorType.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE,\n                })\n              }\n            })\n          }\n        })\n      })\n    }\n    return errors\n  }\n  function performWarningRuntimeChecks(lexerDefinition, trackLines, lineTerminatorCharacters) {\n    const warnings = []\n    let hasAnyLineBreak = false\n    const allTokenTypes = compact(flatten(values(lexerDefinition.modes)))\n    const concreteTokenTypes = reject(allTokenTypes, (currType) => currType[PATTERN] === Lexer.NA)\n    const terminatorCharCodes = getCharCodes(lineTerminatorCharacters)\n    if (trackLines) {\n      forEach(concreteTokenTypes, (tokType) => {\n        const currIssue = checkLineBreaksIssues(tokType, terminatorCharCodes)\n        if (currIssue !== false) {\n          const message = buildLineBreakIssueMessage(tokType, currIssue)\n          const warningDescriptor = {\n            message,\n            type: currIssue.issue,\n            tokenType: tokType,\n          }\n          warnings.push(warningDescriptor)\n        } else {\n          // we don't want to attempt to scan if the user explicitly specified the line_breaks option.\n          if (has(tokType, 'LINE_BREAKS')) {\n            if (tokType.LINE_BREAKS === true) {\n              hasAnyLineBreak = true\n            }\n          } else {\n            if (canMatchCharCode(terminatorCharCodes, tokType.PATTERN)) {\n              hasAnyLineBreak = true\n            }\n          }\n        }\n      })\n    }\n    if (trackLines && !hasAnyLineBreak) {\n      warnings.push({\n        message:\n          'Warning: No LINE_BREAKS Found.\\n' +\n          '\\tThis Lexer has been defined to track line and column information,\\n' +\n          '\\tBut none of the Token Types can be identified as matching a line terminator.\\n' +\n          '\\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \\n' +\n          '\\tfor details.',\n        type: LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS,\n      })\n    }\n    return warnings\n  }\n  function cloneEmptyGroups(emptyGroups) {\n    const clonedResult = {}\n    const groupKeys = keys(emptyGroups)\n    forEach(groupKeys, (currKey) => {\n      const currGroupValue = emptyGroups[currKey]\n      /* istanbul ignore else */\n      if (isArray$1(currGroupValue)) {\n        clonedResult[currKey] = []\n      } else {\n        throw Error('non exhaustive match')\n      }\n    })\n    return clonedResult\n  }\n  // TODO: refactor to avoid duplication\n  function isCustomPattern(tokenType) {\n    const pattern = tokenType.PATTERN\n    /* istanbul ignore else */\n    if (isRegExp$1(pattern)) {\n      return false\n    } else if (isFunction(pattern)) {\n      // CustomPatternMatcherFunc - custom patterns do not require any transformations, only wrapping in a RegExp Like object\n      return true\n    } else if (has(pattern, 'exec')) {\n      // ICustomPattern\n      return true\n    } else if (isString(pattern)) {\n      return false\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n  function isShortPattern(pattern) {\n    if (isString(pattern) && pattern.length === 1) {\n      return pattern.charCodeAt(0)\n    } else {\n      return false\n    }\n  }\n  /**\n   * Faster than using a RegExp for default newline detection during lexing.\n   */\n  const LineTerminatorOptimizedTester = {\n    // implements /\\n|\\r\\n?/g.test\n    test: function (text) {\n      const len = text.length\n      for (let i = this.lastIndex; i < len; i++) {\n        const c = text.charCodeAt(i)\n        if (c === 10) {\n          this.lastIndex = i + 1\n          return true\n        } else if (c === 13) {\n          if (text.charCodeAt(i + 1) === 10) {\n            this.lastIndex = i + 2\n          } else {\n            this.lastIndex = i + 1\n          }\n          return true\n        }\n      }\n      return false\n    },\n    lastIndex: 0,\n  }\n  function checkLineBreaksIssues(tokType, lineTerminatorCharCodes) {\n    if (has(tokType, 'LINE_BREAKS')) {\n      // if the user explicitly declared the line_breaks option we will respect their choice\n      // and assume it is correct.\n      return false\n    } else {\n      /* istanbul ignore else */\n      if (isRegExp$1(tokType.PATTERN)) {\n        try {\n          // TODO: why is the casting suddenly needed?\n          canMatchCharCode(lineTerminatorCharCodes, tokType.PATTERN)\n        } catch (e) {\n          /* istanbul ignore next - to test this we would have to mock <canMatchCharCode> to throw an error */\n          return {\n            issue: LexerDefinitionErrorType.IDENTIFY_TERMINATOR,\n            errMsg: e.message,\n          }\n        }\n        return false\n      } else if (isString(tokType.PATTERN)) {\n        // string literal patterns can always be analyzed to detect line terminator usage\n        return false\n      } else if (isCustomPattern(tokType)) {\n        // custom token types\n        return { issue: LexerDefinitionErrorType.CUSTOM_LINE_BREAK }\n      } else {\n        throw Error('non exhaustive match')\n      }\n    }\n  }\n  function buildLineBreakIssueMessage(tokType, details) {\n    /* istanbul ignore else */\n    if (details.issue === LexerDefinitionErrorType.IDENTIFY_TERMINATOR) {\n      return (\n        'Warning: unable to identify line terminator usage in pattern.\\n' +\n        `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n        `\\t Root cause: ${details.errMsg}.\\n` +\n        '\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR'\n      )\n    } else if (details.issue === LexerDefinitionErrorType.CUSTOM_LINE_BREAK) {\n      return (\n        'Warning: A Custom Token Pattern should specify the <line_breaks> option.\\n' +\n        `\\tThe problem is in the <${tokType.name}> Token Type\\n` +\n        '\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK'\n      )\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n  function getCharCodes(charsOrCodes) {\n    const charCodes = map(charsOrCodes, (numOrString) => {\n      if (isString(numOrString)) {\n        return numOrString.charCodeAt(0)\n      } else {\n        return numOrString\n      }\n    })\n    return charCodes\n  }\n  function addToMapOfArrays(map, key, value) {\n    if (map[key] === undefined) {\n      map[key] = [value]\n    } else {\n      map[key].push(value)\n    }\n  }\n  const minOptimizationVal = 256\n  /**\n   * We are mapping charCode above ASCI (256) into buckets each in the size of 256.\n   * This is because ASCI are the most common start chars so each one of those will get its own\n   * possible token configs vector.\n   *\n   * Tokens starting with charCodes \"above\" ASCI are uncommon, so we can \"afford\"\n   * to place these into buckets of possible token configs, What we gain from\n   * this is avoiding the case of creating an optimization 'charCodeToPatternIdxToConfig'\n   * which would contain 10,000+ arrays of small size (e.g unicode Identifiers scenario).\n   * Our 'charCodeToPatternIdxToConfig' max size will now be:\n   * 256 + (2^16 / 2^8) - 1 === 511\n   *\n   * note the hack for fast division integer part extraction\n   * See: https://stackoverflow.com/a/4228528\n   */\n  let charCodeToOptimizedIdxMap = []\n  function charCodeToOptimizedIndex(charCode) {\n    return charCode < minOptimizationVal ? charCode : charCodeToOptimizedIdxMap[charCode]\n  }\n  /**\n   * This is a compromise between cold start / hot running performance\n   * Creating this array takes ~3ms on a modern machine,\n   * But if we perform the computation at runtime as needed the CSS Lexer benchmark\n   * performance degrades by ~10%\n   *\n   * TODO: Perhaps it should be lazy initialized only if a charCode > 255 is used.\n   */\n  function initCharCodeToOptimizedIndexMap() {\n    if (isEmpty(charCodeToOptimizedIdxMap)) {\n      charCodeToOptimizedIdxMap = new Array(65536)\n      for (let i = 0; i < 65536; i++) {\n        charCodeToOptimizedIdxMap[i] = i > 255 ? 255 + ~~(i / 255) : i\n      }\n    }\n  }\n\n  function tokenStructuredMatcher(tokInstance, tokConstructor) {\n    const instanceType = tokInstance.tokenTypeIdx\n    if (instanceType === tokConstructor.tokenTypeIdx) {\n      return true\n    } else {\n      return tokConstructor.isParent === true && tokConstructor.categoryMatchesMap[instanceType] === true\n    }\n  }\n  // Optimized tokenMatcher in case our grammar does not use token categories\n  // Being so tiny it is much more likely to be in-lined and this avoid the function call overhead\n  function tokenStructuredMatcherNoCategories(token, tokType) {\n    return token.tokenTypeIdx === tokType.tokenTypeIdx\n  }\n  let tokenShortNameIdx = 1\n  const tokenIdxToClass = {}\n  function augmentTokenTypes(tokenTypes) {\n    // collect the parent Token Types as well.\n    const tokenTypesAndParents = expandCategories(tokenTypes)\n    // add required tokenType and categoryMatches properties\n    assignTokenDefaultProps(tokenTypesAndParents)\n    // fill up the categoryMatches\n    assignCategoriesMapProp(tokenTypesAndParents)\n    assignCategoriesTokensProp(tokenTypesAndParents)\n    forEach(tokenTypesAndParents, (tokType) => {\n      tokType.isParent = tokType.categoryMatches.length > 0\n    })\n  }\n  function expandCategories(tokenTypes) {\n    let result = clone(tokenTypes)\n    let categories = tokenTypes\n    let searching = true\n    while (searching) {\n      categories = compact(flatten(map(categories, (currTokType) => currTokType.CATEGORIES)))\n      const newCategories = difference$1(categories, result)\n      result = result.concat(newCategories)\n      if (isEmpty(newCategories)) {\n        searching = false\n      } else {\n        categories = newCategories\n      }\n    }\n    return result\n  }\n  function assignTokenDefaultProps(tokenTypes) {\n    forEach(tokenTypes, (currTokType) => {\n      if (!hasShortKeyProperty(currTokType)) {\n        tokenIdxToClass[tokenShortNameIdx] = currTokType\n        currTokType.tokenTypeIdx = tokenShortNameIdx++\n      }\n      // CATEGORIES? : TokenType | TokenType[]\n      if (\n        hasCategoriesProperty(currTokType) &&\n        !isArray$1(currTokType.CATEGORIES)\n        // &&\n        // !isUndefined(currTokType.CATEGORIES.PATTERN)\n      ) {\n        currTokType.CATEGORIES = [currTokType.CATEGORIES]\n      }\n      if (!hasCategoriesProperty(currTokType)) {\n        currTokType.CATEGORIES = []\n      }\n      if (!hasExtendingTokensTypesProperty(currTokType)) {\n        currTokType.categoryMatches = []\n      }\n      if (!hasExtendingTokensTypesMapProperty(currTokType)) {\n        currTokType.categoryMatchesMap = {}\n      }\n    })\n  }\n  function assignCategoriesTokensProp(tokenTypes) {\n    forEach(tokenTypes, (currTokType) => {\n      // avoid duplications\n      currTokType.categoryMatches = []\n      forEach(currTokType.categoryMatchesMap, (val, key) => {\n        currTokType.categoryMatches.push(tokenIdxToClass[key].tokenTypeIdx)\n      })\n    })\n  }\n  function assignCategoriesMapProp(tokenTypes) {\n    forEach(tokenTypes, (currTokType) => {\n      singleAssignCategoriesToksMap([], currTokType)\n    })\n  }\n  function singleAssignCategoriesToksMap(path, nextNode) {\n    forEach(path, (pathNode) => {\n      nextNode.categoryMatchesMap[pathNode.tokenTypeIdx] = true\n    })\n    forEach(nextNode.CATEGORIES, (nextCategory) => {\n      const newPath = path.concat(nextNode)\n      // avoids infinite loops due to cyclic categories.\n      if (!includes(newPath, nextCategory)) {\n        singleAssignCategoriesToksMap(newPath, nextCategory)\n      }\n    })\n  }\n  function hasShortKeyProperty(tokType) {\n    return has(tokType, 'tokenTypeIdx')\n  }\n  function hasCategoriesProperty(tokType) {\n    return has(tokType, 'CATEGORIES')\n  }\n  function hasExtendingTokensTypesProperty(tokType) {\n    return has(tokType, 'categoryMatches')\n  }\n  function hasExtendingTokensTypesMapProperty(tokType) {\n    return has(tokType, 'categoryMatchesMap')\n  }\n  function isTokenType(tokType) {\n    return has(tokType, 'tokenTypeIdx')\n  }\n\n  const defaultLexerErrorProvider = {\n    buildUnableToPopLexerModeMessage(token) {\n      return `Unable to pop Lexer Mode after encountering Token ->${token.image}<- The Mode Stack is empty`\n    },\n    buildUnexpectedCharactersMessage(fullText, startOffset, length, line, column) {\n      return (\n        `unexpected character: ->${fullText.charAt(startOffset)}<- at offset: ${startOffset},` +\n        ` skipped ${length} characters.`\n      )\n    },\n  }\n\n  var LexerDefinitionErrorType\n  ;(function (LexerDefinitionErrorType) {\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['MISSING_PATTERN'] = 0)] = 'MISSING_PATTERN'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['INVALID_PATTERN'] = 1)] = 'INVALID_PATTERN'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['EOI_ANCHOR_FOUND'] = 2)] = 'EOI_ANCHOR_FOUND'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['UNSUPPORTED_FLAGS_FOUND'] = 3)] = 'UNSUPPORTED_FLAGS_FOUND'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['DUPLICATE_PATTERNS_FOUND'] = 4)] = 'DUPLICATE_PATTERNS_FOUND'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['INVALID_GROUP_TYPE_FOUND'] = 5)] = 'INVALID_GROUP_TYPE_FOUND'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['PUSH_MODE_DOES_NOT_EXIST'] = 6)] = 'PUSH_MODE_DOES_NOT_EXIST'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE'] = 7)] =\n      'MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY'] = 8)] =\n      'MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST'] = 9)] =\n      'MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED'] = 10)] =\n      'LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['SOI_ANCHOR_FOUND'] = 11)] = 'SOI_ANCHOR_FOUND'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['EMPTY_MATCH_PATTERN'] = 12)] = 'EMPTY_MATCH_PATTERN'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['NO_LINE_BREAKS_FLAGS'] = 13)] = 'NO_LINE_BREAKS_FLAGS'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['UNREACHABLE_PATTERN'] = 14)] = 'UNREACHABLE_PATTERN'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['IDENTIFY_TERMINATOR'] = 15)] = 'IDENTIFY_TERMINATOR'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['CUSTOM_LINE_BREAK'] = 16)] = 'CUSTOM_LINE_BREAK'\n    LexerDefinitionErrorType[(LexerDefinitionErrorType['MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE'] = 17)] =\n      'MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE'\n  })(LexerDefinitionErrorType || (LexerDefinitionErrorType = {}))\n  const DEFAULT_LEXER_CONFIG = {\n    deferDefinitionErrorsHandling: false,\n    positionTracking: 'full',\n    lineTerminatorsPattern: /\\n|\\r\\n?/g,\n    lineTerminatorCharacters: ['\\n', '\\r'],\n    ensureOptimizations: false,\n    safeMode: false,\n    errorMessageProvider: defaultLexerErrorProvider,\n    traceInitPerf: false,\n    skipValidations: false,\n    recoveryEnabled: true,\n  }\n  Object.freeze(DEFAULT_LEXER_CONFIG)\n  class Lexer {\n    constructor(lexerDefinition, config = DEFAULT_LEXER_CONFIG) {\n      this.lexerDefinition = lexerDefinition\n      this.lexerDefinitionErrors = []\n      this.lexerDefinitionWarning = []\n      this.patternIdxToConfig = {}\n      this.charCodeToPatternIdxToConfig = {}\n      this.modes = []\n      this.emptyGroups = {}\n      this.trackStartLines = true\n      this.trackEndLines = true\n      this.hasCustom = false\n      this.canModeBeOptimized = {}\n      // Duplicated from the parser's perf trace trait to allow future extraction\n      // of the lexer to a separate package.\n      this.TRACE_INIT = (phaseDesc, phaseImpl) => {\n        // No need to optimize this using NOOP pattern because\n        // It is not called in a hot spot...\n        if (this.traceInitPerf === true) {\n          this.traceInitIndent++\n          const indent = new Array(this.traceInitIndent + 1).join('\\t')\n          if (this.traceInitIndent < this.traceInitMaxIdent) {\n            console.log(`${indent}--> <${phaseDesc}>`)\n          }\n          const { time, value } = timer(phaseImpl)\n          /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n          const traceMethod = time > 10 ? console.warn : console.log\n          if (this.traceInitIndent < this.traceInitMaxIdent) {\n            traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`)\n          }\n          this.traceInitIndent--\n          return value\n        } else {\n          return phaseImpl()\n        }\n      }\n      if (typeof config === 'boolean') {\n        throw Error(\n          'The second argument to the Lexer constructor is now an ILexerConfig Object.\\n' +\n            'a boolean 2nd argument is no longer supported',\n        )\n      }\n      // todo: defaults func?\n      this.config = assign$1({}, DEFAULT_LEXER_CONFIG, config)\n      const traceInitVal = this.config.traceInitPerf\n      if (traceInitVal === true) {\n        this.traceInitMaxIdent = Infinity\n        this.traceInitPerf = true\n      } else if (typeof traceInitVal === 'number') {\n        this.traceInitMaxIdent = traceInitVal\n        this.traceInitPerf = true\n      }\n      this.traceInitIndent = -1\n      this.TRACE_INIT('Lexer Constructor', () => {\n        let actualDefinition\n        let hasOnlySingleMode = true\n        this.TRACE_INIT('Lexer Config handling', () => {\n          if (this.config.lineTerminatorsPattern === DEFAULT_LEXER_CONFIG.lineTerminatorsPattern) {\n            // optimized built-in implementation for the defaults definition of lineTerminators\n            this.config.lineTerminatorsPattern = LineTerminatorOptimizedTester\n          } else {\n            if (this.config.lineTerminatorCharacters === DEFAULT_LEXER_CONFIG.lineTerminatorCharacters) {\n              throw Error(\n                'Error: Missing <lineTerminatorCharacters> property on the Lexer config.\\n' +\n                  '\\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS',\n              )\n            }\n          }\n          if (config.safeMode && config.ensureOptimizations) {\n            throw Error('\"safeMode\" and \"ensureOptimizations\" flags are mutually exclusive.')\n          }\n          this.trackStartLines = /full|onlyStart/i.test(this.config.positionTracking)\n          this.trackEndLines = /full/i.test(this.config.positionTracking)\n          // Convert SingleModeLexerDefinition into a IMultiModeLexerDefinition.\n          if (isArray$1(lexerDefinition)) {\n            actualDefinition = {\n              modes: { defaultMode: clone(lexerDefinition) },\n              defaultMode: DEFAULT_MODE,\n            }\n          } else {\n            // no conversion needed, input should already be a IMultiModeLexerDefinition\n            hasOnlySingleMode = false\n            actualDefinition = clone(lexerDefinition)\n          }\n        })\n        if (this.config.skipValidations === false) {\n          this.TRACE_INIT('performRuntimeChecks', () => {\n            this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n              performRuntimeChecks(actualDefinition, this.trackStartLines, this.config.lineTerminatorCharacters),\n            )\n          })\n          this.TRACE_INIT('performWarningRuntimeChecks', () => {\n            this.lexerDefinitionWarning = this.lexerDefinitionWarning.concat(\n              performWarningRuntimeChecks(actualDefinition, this.trackStartLines, this.config.lineTerminatorCharacters),\n            )\n          })\n        }\n        // for extra robustness to avoid throwing an none informative error message\n        actualDefinition.modes = actualDefinition.modes ? actualDefinition.modes : {}\n        // an error of undefined TokenTypes will be detected in \"performRuntimeChecks\" above.\n        // this transformation is to increase robustness in the case of partially invalid lexer definition.\n        forEach(actualDefinition.modes, (currModeValue, currModeName) => {\n          actualDefinition.modes[currModeName] = reject(currModeValue, (currTokType) => isUndefined(currTokType))\n        })\n        const allModeNames = keys(actualDefinition.modes)\n        forEach(actualDefinition.modes, (currModDef, currModName) => {\n          this.TRACE_INIT(`Mode: <${currModName}> processing`, () => {\n            this.modes.push(currModName)\n            if (this.config.skipValidations === false) {\n              this.TRACE_INIT(`validatePatterns`, () => {\n                this.lexerDefinitionErrors = this.lexerDefinitionErrors.concat(\n                  validatePatterns(currModDef, allModeNames),\n                )\n              })\n            }\n            // If definition errors were encountered, the analysis phase may fail unexpectedly/\n            // Considering a lexer with definition errors may never be used, there is no point\n            // to performing the analysis anyhow...\n            if (isEmpty(this.lexerDefinitionErrors)) {\n              augmentTokenTypes(currModDef)\n              let currAnalyzeResult\n              this.TRACE_INIT(`analyzeTokenTypes`, () => {\n                currAnalyzeResult = analyzeTokenTypes(currModDef, {\n                  lineTerminatorCharacters: this.config.lineTerminatorCharacters,\n                  positionTracking: config.positionTracking,\n                  ensureOptimizations: config.ensureOptimizations,\n                  safeMode: config.safeMode,\n                  tracer: this.TRACE_INIT,\n                })\n              })\n              this.patternIdxToConfig[currModName] = currAnalyzeResult.patternIdxToConfig\n              this.charCodeToPatternIdxToConfig[currModName] = currAnalyzeResult.charCodeToPatternIdxToConfig\n              this.emptyGroups = assign$1({}, this.emptyGroups, currAnalyzeResult.emptyGroups)\n              this.hasCustom = currAnalyzeResult.hasCustom || this.hasCustom\n              this.canModeBeOptimized[currModName] = currAnalyzeResult.canBeOptimized\n            }\n          })\n        })\n        this.defaultMode = actualDefinition.defaultMode\n        if (!isEmpty(this.lexerDefinitionErrors) && !this.config.deferDefinitionErrorsHandling) {\n          const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n            return error.message\n          })\n          const allErrMessagesString = allErrMessages.join('-----------------------\\n')\n          throw new Error('Errors detected in definition of Lexer:\\n' + allErrMessagesString)\n        }\n        // Only print warning if there are no errors, This will avoid pl\n        forEach(this.lexerDefinitionWarning, (warningDescriptor) => {\n          PRINT_WARNING(warningDescriptor.message)\n        })\n        this.TRACE_INIT('Choosing sub-methods implementations', () => {\n          // Choose the relevant internal implementations for this specific parser.\n          // These implementations should be in-lined by the JavaScript engine\n          // to provide optimal performance in each scenario.\n          if (SUPPORT_STICKY) {\n            this.chopInput = identity\n            this.match = this.matchWithTest\n          } else {\n            this.updateLastIndex = noop\n            this.match = this.matchWithExec\n          }\n          if (hasOnlySingleMode) {\n            this.handleModes = noop\n          }\n          if (this.trackStartLines === false) {\n            this.computeNewColumn = identity\n          }\n          if (this.trackEndLines === false) {\n            this.updateTokenEndLineColumnLocation = noop\n          }\n          if (/full/i.test(this.config.positionTracking)) {\n            this.createTokenInstance = this.createFullToken\n          } else if (/onlyStart/i.test(this.config.positionTracking)) {\n            this.createTokenInstance = this.createStartOnlyToken\n          } else if (/onlyOffset/i.test(this.config.positionTracking)) {\n            this.createTokenInstance = this.createOffsetOnlyToken\n          } else {\n            throw Error(`Invalid <positionTracking> config option: \"${this.config.positionTracking}\"`)\n          }\n          if (this.hasCustom) {\n            this.addToken = this.addTokenUsingPush\n            this.handlePayload = this.handlePayloadWithCustom\n          } else {\n            this.addToken = this.addTokenUsingMemberAccess\n            this.handlePayload = this.handlePayloadNoCustom\n          }\n        })\n        this.TRACE_INIT('Failed Optimization Warnings', () => {\n          const unOptimizedModes = reduce(\n            this.canModeBeOptimized,\n            (cannotBeOptimized, canBeOptimized, modeName) => {\n              if (canBeOptimized === false) {\n                cannotBeOptimized.push(modeName)\n              }\n              return cannotBeOptimized\n            },\n            [],\n          )\n          if (config.ensureOptimizations && !isEmpty(unOptimizedModes)) {\n            throw Error(\n              `Lexer Modes: < ${unOptimizedModes.join(', ')} > cannot be optimized.\\n` +\n                '\\t Disable the \"ensureOptimizations\" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\\n' +\n                '\\t Or inspect the console log for details on how to resolve these issues.',\n            )\n          }\n        })\n        this.TRACE_INIT('clearRegExpParserCache', () => {\n          clearRegExpParserCache()\n        })\n        this.TRACE_INIT('toFastProperties', () => {\n          toFastProperties(this)\n        })\n      })\n    }\n    tokenize(text, initialMode = this.defaultMode) {\n      if (!isEmpty(this.lexerDefinitionErrors)) {\n        const allErrMessages = map(this.lexerDefinitionErrors, (error) => {\n          return error.message\n        })\n        const allErrMessagesString = allErrMessages.join('-----------------------\\n')\n        throw new Error('Unable to Tokenize because Errors detected in definition of Lexer:\\n' + allErrMessagesString)\n      }\n      return this.tokenizeInternal(text, initialMode)\n    }\n    // There is quite a bit of duplication between this and \"tokenizeInternalLazy\"\n    // This is intentional due to performance considerations.\n    // this method also used quite a bit of `!` none null assertions because it is too optimized\n    // for `tsc` to always understand it is \"safe\"\n    tokenizeInternal(text, initialMode) {\n      let i,\n        j,\n        k,\n        matchAltImage,\n        longerAlt,\n        matchedImage,\n        payload,\n        altPayload,\n        imageLength,\n        group,\n        tokType,\n        newToken,\n        errLength,\n        msg,\n        match\n      const orgText = text\n      const orgLength = orgText.length\n      let offset = 0\n      let matchedTokensIndex = 0\n      // initializing the tokensArray to the \"guessed\" size.\n      // guessing too little will still reduce the number of array re-sizes on pushes.\n      // guessing too large (Tested by guessing x4 too large) may cost a bit more of memory\n      // but would still have a faster runtime by avoiding (All but one) array resizing.\n      const guessedNumberOfTokens = this.hasCustom\n        ? 0 // will break custom token pattern APIs the matchedTokens array will contain undefined elements.\n        : Math.floor(text.length / 10)\n      const matchedTokens = new Array(guessedNumberOfTokens)\n      const errors = []\n      let line = this.trackStartLines ? 1 : undefined\n      let column = this.trackStartLines ? 1 : undefined\n      const groups = cloneEmptyGroups(this.emptyGroups)\n      const trackLines = this.trackStartLines\n      const lineTerminatorPattern = this.config.lineTerminatorsPattern\n      let currModePatternsLength = 0\n      let patternIdxToConfig = []\n      let currCharCodeToPatternIdxToConfig = []\n      const modeStack = []\n      const emptyArray = []\n      Object.freeze(emptyArray)\n      let getPossiblePatterns\n      function getPossiblePatternsSlow() {\n        return patternIdxToConfig\n      }\n      function getPossiblePatternsOptimized(charCode) {\n        const optimizedCharIdx = charCodeToOptimizedIndex(charCode)\n        const possiblePatterns = currCharCodeToPatternIdxToConfig[optimizedCharIdx]\n        if (possiblePatterns === undefined) {\n          return emptyArray\n        } else {\n          return possiblePatterns\n        }\n      }\n      const pop_mode = (popToken) => {\n        // TODO: perhaps avoid this error in the edge case there is no more input?\n        if (\n          modeStack.length === 1 &&\n          // if we have both a POP_MODE and a PUSH_MODE this is in-fact a \"transition\"\n          // So no error should occur.\n          popToken.tokenType.PUSH_MODE === undefined\n        ) {\n          // if we try to pop the last mode there lexer will no longer have ANY mode.\n          // thus the pop is ignored, an error will be created and the lexer will continue parsing in the previous mode.\n          const msg = this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(popToken)\n          errors.push({\n            offset: popToken.startOffset,\n            line: popToken.startLine,\n            column: popToken.startColumn,\n            length: popToken.image.length,\n            message: msg,\n          })\n        } else {\n          modeStack.pop()\n          const newMode = last(modeStack)\n          patternIdxToConfig = this.patternIdxToConfig[newMode]\n          currCharCodeToPatternIdxToConfig = this.charCodeToPatternIdxToConfig[newMode]\n          currModePatternsLength = patternIdxToConfig.length\n          const modeCanBeOptimized = this.canModeBeOptimized[newMode] && this.config.safeMode === false\n          if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n            getPossiblePatterns = getPossiblePatternsOptimized\n          } else {\n            getPossiblePatterns = getPossiblePatternsSlow\n          }\n        }\n      }\n      function push_mode(newMode) {\n        modeStack.push(newMode)\n        currCharCodeToPatternIdxToConfig = this.charCodeToPatternIdxToConfig[newMode]\n        patternIdxToConfig = this.patternIdxToConfig[newMode]\n        currModePatternsLength = patternIdxToConfig.length\n        currModePatternsLength = patternIdxToConfig.length\n        const modeCanBeOptimized = this.canModeBeOptimized[newMode] && this.config.safeMode === false\n        if (currCharCodeToPatternIdxToConfig && modeCanBeOptimized) {\n          getPossiblePatterns = getPossiblePatternsOptimized\n        } else {\n          getPossiblePatterns = getPossiblePatternsSlow\n        }\n      }\n      // this pattern seems to avoid a V8 de-optimization, although that de-optimization does not\n      // seem to matter performance wise.\n      push_mode.call(this, initialMode)\n      let currConfig\n      const recoveryEnabled = this.config.recoveryEnabled\n      while (offset < orgLength) {\n        matchedImage = null\n        const nextCharCode = orgText.charCodeAt(offset)\n        const chosenPatternIdxToConfig = getPossiblePatterns(nextCharCode)\n        const chosenPatternsLength = chosenPatternIdxToConfig.length\n        for (i = 0; i < chosenPatternsLength; i++) {\n          currConfig = chosenPatternIdxToConfig[i]\n          const currPattern = currConfig.pattern\n          payload = null\n          // manually in-lined because > 600 chars won't be in-lined in V8\n          const singleCharCode = currConfig.short\n          if (singleCharCode !== false) {\n            if (nextCharCode === singleCharCode) {\n              // single character string\n              matchedImage = currPattern\n            }\n          } else if (currConfig.isCustom === true) {\n            match = currPattern.exec(orgText, offset, matchedTokens, groups)\n            if (match !== null) {\n              matchedImage = match[0]\n              if (match.payload !== undefined) {\n                payload = match.payload\n              }\n            } else {\n              matchedImage = null\n            }\n          } else {\n            this.updateLastIndex(currPattern, offset)\n            matchedImage = this.match(currPattern, text, offset)\n          }\n          if (matchedImage !== null) {\n            // even though this pattern matched we must try a another longer alternative.\n            // this can be used to prioritize keywords over identifiers\n            longerAlt = currConfig.longerAlt\n            if (longerAlt !== undefined) {\n              // TODO: micro optimize, avoid extra prop access\n              // by saving/linking longerAlt on the original config?\n              const longerAltLength = longerAlt.length\n              for (k = 0; k < longerAltLength; k++) {\n                const longerAltConfig = patternIdxToConfig[longerAlt[k]]\n                const longerAltPattern = longerAltConfig.pattern\n                altPayload = null\n                // single Char can never be a longer alt so no need to test it.\n                // manually in-lined because > 600 chars won't be in-lined in V8\n                if (longerAltConfig.isCustom === true) {\n                  match = longerAltPattern.exec(orgText, offset, matchedTokens, groups)\n                  if (match !== null) {\n                    matchAltImage = match[0]\n                    if (match.payload !== undefined) {\n                      altPayload = match.payload\n                    }\n                  } else {\n                    matchAltImage = null\n                  }\n                } else {\n                  this.updateLastIndex(longerAltPattern, offset)\n                  matchAltImage = this.match(longerAltPattern, text, offset)\n                }\n                if (matchAltImage && matchAltImage.length > matchedImage.length) {\n                  matchedImage = matchAltImage\n                  payload = altPayload\n                  currConfig = longerAltConfig\n                  // Exit the loop early after matching one of the longer alternatives\n                  // The first matched alternative takes precedence\n                  break\n                }\n              }\n            }\n            break\n          }\n        }\n        // successful match\n        if (matchedImage !== null) {\n          imageLength = matchedImage.length\n          group = currConfig.group\n          if (group !== undefined) {\n            tokType = currConfig.tokenTypeIdx\n            // TODO: \"offset + imageLength\" and the new column may be computed twice in case of \"full\" location information inside\n            // createFullToken method\n            newToken = this.createTokenInstance(\n              matchedImage,\n              offset,\n              tokType,\n              currConfig.tokenType,\n              line,\n              column,\n              imageLength,\n            )\n            this.handlePayload(newToken, payload)\n            // TODO: optimize NOOP in case there are no special groups?\n            if (group === false) {\n              matchedTokensIndex = this.addToken(matchedTokens, matchedTokensIndex, newToken)\n            } else {\n              groups[group].push(newToken)\n            }\n          }\n          text = this.chopInput(text, imageLength)\n          offset = offset + imageLength\n          // TODO: with newlines the column may be assigned twice\n          column = this.computeNewColumn(column, imageLength)\n          if (trackLines === true && currConfig.canLineTerminator === true) {\n            let numOfLTsInMatch = 0\n            let foundTerminator\n            let lastLTEndOffset\n            lineTerminatorPattern.lastIndex = 0\n            do {\n              foundTerminator = lineTerminatorPattern.test(matchedImage)\n              if (foundTerminator === true) {\n                lastLTEndOffset = lineTerminatorPattern.lastIndex - 1\n                numOfLTsInMatch++\n              }\n            } while (foundTerminator === true)\n            if (numOfLTsInMatch !== 0) {\n              line = line + numOfLTsInMatch\n              column = imageLength - lastLTEndOffset\n              this.updateTokenEndLineColumnLocation(\n                newToken,\n                group,\n                lastLTEndOffset,\n                numOfLTsInMatch,\n                line,\n                column,\n                imageLength,\n              )\n            }\n          }\n          // will be NOOP if no modes present\n          this.handleModes(currConfig, pop_mode, push_mode, newToken)\n        } else {\n          // error recovery, drop characters until we identify a valid token's start point\n          const errorStartOffset = offset\n          const errorLine = line\n          const errorColumn = column\n          let foundResyncPoint = recoveryEnabled === false\n          while (foundResyncPoint === false && offset < orgLength) {\n            // Identity Func (when sticky flag is enabled)\n            text = this.chopInput(text, 1)\n            offset++\n            for (j = 0; j < currModePatternsLength; j++) {\n              const currConfig = patternIdxToConfig[j]\n              const currPattern = currConfig.pattern\n              // manually in-lined because > 600 chars won't be in-lined in V8\n              const singleCharCode = currConfig.short\n              if (singleCharCode !== false) {\n                if (orgText.charCodeAt(offset) === singleCharCode) {\n                  // single character string\n                  foundResyncPoint = true\n                }\n              } else if (currConfig.isCustom === true) {\n                foundResyncPoint = currPattern.exec(orgText, offset, matchedTokens, groups) !== null\n              } else {\n                this.updateLastIndex(currPattern, offset)\n                foundResyncPoint = currPattern.exec(text) !== null\n              }\n              if (foundResyncPoint === true) {\n                break\n              }\n            }\n          }\n          errLength = offset - errorStartOffset\n          column = this.computeNewColumn(column, errLength)\n          // at this point we either re-synced or reached the end of the input text\n          msg = this.config.errorMessageProvider.buildUnexpectedCharactersMessage(\n            orgText,\n            errorStartOffset,\n            errLength,\n            errorLine,\n            errorColumn,\n          )\n          errors.push({\n            offset: errorStartOffset,\n            line: errorLine,\n            column: errorColumn,\n            length: errLength,\n            message: msg,\n          })\n          if (recoveryEnabled === false) {\n            break\n          }\n        }\n      }\n      // if we do have custom patterns which push directly into the\n      // TODO: custom tokens should not push directly??\n      if (!this.hasCustom) {\n        // if we guessed a too large size for the tokens array this will shrink it to the right size.\n        matchedTokens.length = matchedTokensIndex\n      }\n      return {\n        tokens: matchedTokens,\n        groups: groups,\n        errors: errors,\n      }\n    }\n    handleModes(config, pop_mode, push_mode, newToken) {\n      if (config.pop === true) {\n        // need to save the PUSH_MODE property as if the mode is popped\n        // patternIdxToPopMode is updated to reflect the new mode after popping the stack\n        const pushMode = config.push\n        pop_mode(newToken)\n        if (pushMode !== undefined) {\n          push_mode.call(this, pushMode)\n        }\n      } else if (config.push !== undefined) {\n        push_mode.call(this, config.push)\n      }\n    }\n    chopInput(text, length) {\n      return text.substring(length)\n    }\n    updateLastIndex(regExp, newLastIndex) {\n      regExp.lastIndex = newLastIndex\n    }\n    // TODO: decrease this under 600 characters? inspect stripping comments option in TSC compiler\n    updateTokenEndLineColumnLocation(newToken, group, lastLTIdx, numOfLTsInMatch, line, column, imageLength) {\n      let lastCharIsLT, fixForEndingInLT\n      if (group !== undefined) {\n        // a none skipped multi line Token, need to update endLine/endColumn\n        lastCharIsLT = lastLTIdx === imageLength - 1\n        fixForEndingInLT = lastCharIsLT ? -1 : 0\n        if (!(numOfLTsInMatch === 1 && lastCharIsLT === true)) {\n          // if a token ends in a LT that last LT only affects the line numbering of following Tokens\n          newToken.endLine = line + fixForEndingInLT\n          // the last LT in a token does not affect the endColumn either as the [columnStart ... columnEnd)\n          // inclusive to exclusive range.\n          newToken.endColumn = column - 1 + -fixForEndingInLT\n        }\n        // else single LT in the last character of a token, no need to modify the endLine/EndColumn\n      }\n    }\n    computeNewColumn(oldColumn, imageLength) {\n      return oldColumn + imageLength\n    }\n    createOffsetOnlyToken(image, startOffset, tokenTypeIdx, tokenType) {\n      return {\n        image,\n        startOffset,\n        tokenTypeIdx,\n        tokenType,\n      }\n    }\n    createStartOnlyToken(image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn) {\n      return {\n        image,\n        startOffset,\n        startLine,\n        startColumn,\n        tokenTypeIdx,\n        tokenType,\n      }\n    }\n    createFullToken(image, startOffset, tokenTypeIdx, tokenType, startLine, startColumn, imageLength) {\n      return {\n        image,\n        startOffset,\n        endOffset: startOffset + imageLength - 1,\n        startLine,\n        endLine: startLine,\n        startColumn,\n        endColumn: startColumn + imageLength - 1,\n        tokenTypeIdx,\n        tokenType,\n      }\n    }\n    addTokenUsingPush(tokenVector, index, tokenToAdd) {\n      tokenVector.push(tokenToAdd)\n      return index\n    }\n    addTokenUsingMemberAccess(tokenVector, index, tokenToAdd) {\n      tokenVector[index] = tokenToAdd\n      index++\n      return index\n    }\n    handlePayloadNoCustom(token, payload) {}\n    handlePayloadWithCustom(token, payload) {\n      if (payload !== null) {\n        token.payload = payload\n      }\n    }\n    matchWithTest(pattern, text, offset) {\n      const found = pattern.test(text)\n      if (found === true) {\n        return text.substring(offset, pattern.lastIndex)\n      }\n      return null\n    }\n    matchWithExec(pattern, text) {\n      const regExpArray = pattern.exec(text)\n      return regExpArray !== null ? regExpArray[0] : null\n    }\n  }\n  Lexer.SKIPPED =\n    'This marks a skipped Token pattern, this means each token identified by it will' +\n    'be consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.'\n  Lexer.NA = /NOT_APPLICABLE/\n\n  function tokenLabel(tokType) {\n    if (hasTokenLabel(tokType)) {\n      return tokType.LABEL\n    } else {\n      return tokType.name\n    }\n  }\n  function hasTokenLabel(obj) {\n    return isString(obj.LABEL) && obj.LABEL !== ''\n  }\n  const PARENT = 'parent'\n  const CATEGORIES = 'categories'\n  const LABEL = 'label'\n  const GROUP = 'group'\n  const PUSH_MODE = 'push_mode'\n  const POP_MODE = 'pop_mode'\n  const LONGER_ALT = 'longer_alt'\n  const LINE_BREAKS = 'line_breaks'\n  const START_CHARS_HINT = 'start_chars_hint'\n  function createToken(config) {\n    return createTokenInternal(config)\n  }\n  function createTokenInternal(config) {\n    const pattern = config.pattern\n    const tokenType = {}\n    tokenType.name = config.name\n    if (!isUndefined(pattern)) {\n      tokenType.PATTERN = pattern\n    }\n    if (has(config, PARENT)) {\n      throw (\n        'The parent property is no longer supported.\\n' +\n        'See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.'\n      )\n    }\n    if (has(config, CATEGORIES)) {\n      // casting to ANY as this will be fixed inside `augmentTokenTypes``\n      tokenType.CATEGORIES = config[CATEGORIES]\n    }\n    augmentTokenTypes([tokenType])\n    if (has(config, LABEL)) {\n      tokenType.LABEL = config[LABEL]\n    }\n    if (has(config, GROUP)) {\n      tokenType.GROUP = config[GROUP]\n    }\n    if (has(config, POP_MODE)) {\n      tokenType.POP_MODE = config[POP_MODE]\n    }\n    if (has(config, PUSH_MODE)) {\n      tokenType.PUSH_MODE = config[PUSH_MODE]\n    }\n    if (has(config, LONGER_ALT)) {\n      tokenType.LONGER_ALT = config[LONGER_ALT]\n    }\n    if (has(config, LINE_BREAKS)) {\n      tokenType.LINE_BREAKS = config[LINE_BREAKS]\n    }\n    if (has(config, START_CHARS_HINT)) {\n      tokenType.START_CHARS_HINT = config[START_CHARS_HINT]\n    }\n    return tokenType\n  }\n  const EOF = createToken({ name: 'EOF', pattern: Lexer.NA })\n  augmentTokenTypes([EOF])\n  function createTokenInstance(tokType, image, startOffset, endOffset, startLine, endLine, startColumn, endColumn) {\n    return {\n      image,\n      startOffset,\n      endOffset,\n      startLine,\n      endLine,\n      startColumn,\n      endColumn,\n      tokenTypeIdx: tokType.tokenTypeIdx,\n      tokenType: tokType,\n    }\n  }\n  function tokenMatcher(token, tokType) {\n    return tokenStructuredMatcher(token, tokType)\n  }\n\n  const defaultParserErrorProvider = {\n    buildMismatchTokenMessage({ expected, actual, previous, ruleName }) {\n      const hasLabel = hasTokenLabel(expected)\n      const expectedMsg = hasLabel ? `--> ${tokenLabel(expected)} <--` : `token of type --> ${expected.name} <--`\n      const msg = `Expecting ${expectedMsg} but found --> '${actual.image}' <--`\n      return msg\n    },\n    buildNotAllInputParsedMessage({ firstRedundant, ruleName }) {\n      return 'Redundant input, expecting EOF but found: ' + firstRedundant.image\n    },\n    buildNoViableAltMessage({ expectedPathsPerAlt, actual, previous, customUserDescription, ruleName }) {\n      const errPrefix = 'Expecting: '\n      // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n      const actualText = head(actual).image\n      const errSuffix = \"\\nbut found: '\" + actualText + \"'\"\n      if (customUserDescription) {\n        return errPrefix + customUserDescription + errSuffix\n      } else {\n        const allLookAheadPaths = reduce(expectedPathsPerAlt, (result, currAltPaths) => result.concat(currAltPaths), [])\n        const nextValidTokenSequences = map(\n          allLookAheadPaths,\n          (currPath) => `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(', ')}]`,\n        )\n        const nextValidSequenceItems = map(nextValidTokenSequences, (itemMsg, idx) => `  ${idx + 1}. ${itemMsg}`)\n        const calculatedDescription = `one of these possible Token sequences:\\n${nextValidSequenceItems.join('\\n')}`\n        return errPrefix + calculatedDescription + errSuffix\n      }\n    },\n    buildEarlyExitMessage({ expectedIterationPaths, actual, customUserDescription, ruleName }) {\n      const errPrefix = 'Expecting: '\n      // TODO: issue: No Viable Alternative Error may have incomplete details. #502\n      const actualText = head(actual).image\n      const errSuffix = \"\\nbut found: '\" + actualText + \"'\"\n      if (customUserDescription) {\n        return errPrefix + customUserDescription + errSuffix\n      } else {\n        const nextValidTokenSequences = map(\n          expectedIterationPaths,\n          (currPath) => `[${map(currPath, (currTokenType) => tokenLabel(currTokenType)).join(',')}]`,\n        )\n        const calculatedDescription =\n          `expecting at least one iteration which starts with one of these possible Token sequences::\\n  ` +\n          `<${nextValidTokenSequences.join(' ,')}>`\n        return errPrefix + calculatedDescription + errSuffix\n      }\n    },\n  }\n  Object.freeze(defaultParserErrorProvider)\n  const defaultGrammarResolverErrorProvider = {\n    buildRuleNotFoundError(topLevelRule, undefinedRule) {\n      const msg =\n        'Invalid grammar, reference to a rule which is not defined: ->' +\n        undefinedRule.nonTerminalName +\n        '<-\\n' +\n        'inside top level rule: ->' +\n        topLevelRule.name +\n        '<-'\n      return msg\n    },\n  }\n  const defaultGrammarValidatorErrorProvider = {\n    buildDuplicateFoundError(topLevelRule, duplicateProds) {\n      function getExtraProductionArgument(prod) {\n        if (prod instanceof Terminal) {\n          return prod.terminalType.name\n        } else if (prod instanceof NonTerminal) {\n          return prod.nonTerminalName\n        } else {\n          return ''\n        }\n      }\n      const topLevelName = topLevelRule.name\n      const duplicateProd = head(duplicateProds)\n      const index = duplicateProd.idx\n      const dslName = getProductionDslName(duplicateProd)\n      const extraArgument = getExtraProductionArgument(duplicateProd)\n      const hasExplicitIndex = index > 0\n      let msg = `->${dslName}${hasExplicitIndex ? index : ''}<- ${\n        extraArgument ? `with argument: ->${extraArgument}<-` : ''\n      }\n                  appears more than once (${\n                    duplicateProds.length\n                  } times) in the top level rule: ->${topLevelName}<-.                  \n                  For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n                  `\n      // white space trimming time! better to trim afterwards as it allows to use WELL formatted multi line template strings...\n      msg = msg.replace(/[ \\t]+/g, ' ')\n      msg = msg.replace(/\\s\\s+/g, '\\n')\n      return msg\n    },\n    buildNamespaceConflictError(rule) {\n      const errMsg =\n        `Namespace conflict found in grammar.\\n` +\n        `The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${rule.name}>.\\n` +\n        `To resolve this make sure each Terminal and Non-Terminal names are unique\\n` +\n        `This is easy to accomplish by using the convention that Terminal names start with an uppercase letter\\n` +\n        `and Non-Terminal names start with a lower case letter.`\n      return errMsg\n    },\n    buildAlternationPrefixAmbiguityError(options) {\n      const pathMsg = map(options.prefixPath, (currTok) => tokenLabel(currTok)).join(', ')\n      const occurrence = options.alternation.idx === 0 ? '' : options.alternation.idx\n      const errMsg =\n        `Ambiguous alternatives: <${options.ambiguityIndices.join(' ,')}> due to common lookahead prefix\\n` +\n        `in <OR${occurrence}> inside <${options.topLevelRule.name}> Rule,\\n` +\n        `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n` +\n        `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\\n` +\n        `For Further details.`\n      return errMsg\n    },\n    buildAlternationAmbiguityError(options) {\n      const pathMsg = map(options.prefixPath, (currtok) => tokenLabel(currtok)).join(', ')\n      const occurrence = options.alternation.idx === 0 ? '' : options.alternation.idx\n      let currMessage =\n        `Ambiguous Alternatives Detected: <${options.ambiguityIndices.join(' ,')}> in <OR${occurrence}>` +\n        ` inside <${options.topLevelRule.name}> Rule,\\n` +\n        `<${pathMsg}> may appears as a prefix path in all these alternatives.\\n`\n      currMessage =\n        currMessage +\n        `See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\\n` +\n        `For Further details.`\n      return currMessage\n    },\n    buildEmptyRepetitionError(options) {\n      let dslName = getProductionDslName(options.repetition)\n      if (options.repetition.idx !== 0) {\n        dslName += options.repetition.idx\n      }\n      const errMsg =\n        `The repetition <${dslName}> within Rule <${options.topLevelRule.name}> can never consume any tokens.\\n` +\n        `This could lead to an infinite loop.`\n      return errMsg\n    },\n    // TODO: remove - `errors_public` from nyc.config.js exclude\n    //       once this method is fully removed from this file\n    buildTokenNameError(options) {\n      /* istanbul ignore next */\n      return 'deprecated'\n    },\n    buildEmptyAlternationError(options) {\n      const errMsg =\n        `Ambiguous empty alternative: <${options.emptyChoiceIdx + 1}>` +\n        ` in <OR${options.alternation.idx}> inside <${options.topLevelRule.name}> Rule.\\n` +\n        `Only the last alternative may be an empty alternative.`\n      return errMsg\n    },\n    buildTooManyAlternativesError(options) {\n      const errMsg =\n        `An Alternation cannot have more than 256 alternatives:\\n` +\n        `<OR${options.alternation.idx}> inside <${options.topLevelRule.name}> Rule.\\n has ${\n          options.alternation.definition.length + 1\n        } alternatives.`\n      return errMsg\n    },\n    buildLeftRecursionError(options) {\n      const ruleName = options.topLevelRule.name\n      const pathNames = map(options.leftRecursionPath, (currRule) => currRule.name)\n      const leftRecursivePath = `${ruleName} --> ${pathNames.concat([ruleName]).join(' --> ')}`\n      const errMsg =\n        `Left Recursion found in grammar.\\n` +\n        `rule: <${ruleName}> can be invoked from itself (directly or indirectly)\\n` +\n        `without consuming any Tokens. The grammar path that causes this is: \\n ${leftRecursivePath}\\n` +\n        ` To fix this refactor your grammar to remove the left recursion.\\n` +\n        `see: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`\n      return errMsg\n    },\n    // TODO: remove - `errors_public` from nyc.config.js exclude\n    //       once this method is fully removed from this file\n    buildInvalidRuleNameError(options) {\n      /* istanbul ignore next */\n      return 'deprecated'\n    },\n    buildDuplicateRuleNameError(options) {\n      let ruleName\n      if (options.topLevelRule instanceof Rule) {\n        ruleName = options.topLevelRule.name\n      } else {\n        ruleName = options.topLevelRule\n      }\n      const errMsg = `Duplicate definition, rule: ->${ruleName}<- is already defined in the grammar: ->${options.grammarName}<-`\n      return errMsg\n    },\n  }\n\n  function resolveGrammar$1(topLevels, errMsgProvider) {\n    const refResolver = new GastRefResolverVisitor(topLevels, errMsgProvider)\n    refResolver.resolveRefs()\n    return refResolver.errors\n  }\n  class GastRefResolverVisitor extends GAstVisitor {\n    constructor(nameToTopRule, errMsgProvider) {\n      super()\n      this.nameToTopRule = nameToTopRule\n      this.errMsgProvider = errMsgProvider\n      this.errors = []\n    }\n    resolveRefs() {\n      forEach(values(this.nameToTopRule), (prod) => {\n        this.currTopLevel = prod\n        prod.accept(this)\n      })\n    }\n    visitNonTerminal(node) {\n      const ref = this.nameToTopRule[node.nonTerminalName]\n      if (!ref) {\n        const msg = this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel, node)\n        this.errors.push({\n          message: msg,\n          type: ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,\n          ruleName: this.currTopLevel.name,\n          unresolvedRefName: node.nonTerminalName,\n        })\n      } else {\n        node.referencedRule = ref\n      }\n    }\n  }\n\n  class AbstractNextPossibleTokensWalker extends RestWalker {\n    constructor(topProd, path) {\n      super()\n      this.topProd = topProd\n      this.path = path\n      this.possibleTokTypes = []\n      this.nextProductionName = ''\n      this.nextProductionOccurrence = 0\n      this.found = false\n      this.isAtEndOfPath = false\n    }\n    startWalking() {\n      this.found = false\n      if (this.path.ruleStack[0] !== this.topProd.name) {\n        throw Error(\"The path does not start with the walker's top Rule!\")\n      }\n      // immutable for the win\n      this.ruleStack = clone(this.path.ruleStack).reverse() // intelij bug requires assertion\n      this.occurrenceStack = clone(this.path.occurrenceStack).reverse() // intelij bug requires assertion\n      // already verified that the first production is valid, we now seek the 2nd production\n      this.ruleStack.pop()\n      this.occurrenceStack.pop()\n      this.updateExpectedNext()\n      this.walk(this.topProd)\n      return this.possibleTokTypes\n    }\n    walk(prod, prevRest = []) {\n      // stop scanning once we found the path\n      if (!this.found) {\n        super.walk(prod, prevRest)\n      }\n    }\n    walkProdRef(refProd, currRest, prevRest) {\n      // found the next production, need to keep walking in it\n      if (refProd.referencedRule.name === this.nextProductionName && refProd.idx === this.nextProductionOccurrence) {\n        const fullRest = currRest.concat(prevRest)\n        this.updateExpectedNext()\n        this.walk(refProd.referencedRule, fullRest)\n      }\n    }\n    updateExpectedNext() {\n      // need to consume the Terminal\n      if (isEmpty(this.ruleStack)) {\n        // must reset nextProductionXXX to avoid walking down another Top Level production while what we are\n        // really seeking is the last Terminal...\n        this.nextProductionName = ''\n        this.nextProductionOccurrence = 0\n        this.isAtEndOfPath = true\n      } else {\n        this.nextProductionName = this.ruleStack.pop()\n        this.nextProductionOccurrence = this.occurrenceStack.pop()\n      }\n    }\n  }\n  class NextAfterTokenWalker extends AbstractNextPossibleTokensWalker {\n    constructor(topProd, path) {\n      super(topProd, path)\n      this.path = path\n      this.nextTerminalName = ''\n      this.nextTerminalOccurrence = 0\n      this.nextTerminalName = this.path.lastTok.name\n      this.nextTerminalOccurrence = this.path.lastTokOccurrence\n    }\n    walkTerminal(terminal, currRest, prevRest) {\n      if (\n        this.isAtEndOfPath &&\n        terminal.terminalType.name === this.nextTerminalName &&\n        terminal.idx === this.nextTerminalOccurrence &&\n        !this.found\n      ) {\n        const fullRest = currRest.concat(prevRest)\n        const restProd = new Alternative({ definition: fullRest })\n        this.possibleTokTypes = first(restProd)\n        this.found = true\n      }\n    }\n  }\n  /**\n   * This walker only \"walks\" a single \"TOP\" level in the Grammar Ast, this means\n   * it never \"follows\" production refs\n   */\n  class AbstractNextTerminalAfterProductionWalker extends RestWalker {\n    constructor(topRule, occurrence) {\n      super()\n      this.topRule = topRule\n      this.occurrence = occurrence\n      this.result = {\n        token: undefined,\n        occurrence: undefined,\n        isEndOfRule: undefined,\n      }\n    }\n    startWalking() {\n      this.walk(this.topRule)\n      return this.result\n    }\n  }\n  class NextTerminalAfterManyWalker extends AbstractNextTerminalAfterProductionWalker {\n    walkMany(manyProd, currRest, prevRest) {\n      if (manyProd.idx === this.occurrence) {\n        const firstAfterMany = head(currRest.concat(prevRest))\n        this.result.isEndOfRule = firstAfterMany === undefined\n        if (firstAfterMany instanceof Terminal) {\n          this.result.token = firstAfterMany.terminalType\n          this.result.occurrence = firstAfterMany.idx\n        }\n      } else {\n        super.walkMany(manyProd, currRest, prevRest)\n      }\n    }\n  }\n  class NextTerminalAfterManySepWalker extends AbstractNextTerminalAfterProductionWalker {\n    walkManySep(manySepProd, currRest, prevRest) {\n      if (manySepProd.idx === this.occurrence) {\n        const firstAfterManySep = head(currRest.concat(prevRest))\n        this.result.isEndOfRule = firstAfterManySep === undefined\n        if (firstAfterManySep instanceof Terminal) {\n          this.result.token = firstAfterManySep.terminalType\n          this.result.occurrence = firstAfterManySep.idx\n        }\n      } else {\n        super.walkManySep(manySepProd, currRest, prevRest)\n      }\n    }\n  }\n  class NextTerminalAfterAtLeastOneWalker extends AbstractNextTerminalAfterProductionWalker {\n    walkAtLeastOne(atLeastOneProd, currRest, prevRest) {\n      if (atLeastOneProd.idx === this.occurrence) {\n        const firstAfterAtLeastOne = head(currRest.concat(prevRest))\n        this.result.isEndOfRule = firstAfterAtLeastOne === undefined\n        if (firstAfterAtLeastOne instanceof Terminal) {\n          this.result.token = firstAfterAtLeastOne.terminalType\n          this.result.occurrence = firstAfterAtLeastOne.idx\n        }\n      } else {\n        super.walkAtLeastOne(atLeastOneProd, currRest, prevRest)\n      }\n    }\n  }\n  // TODO: reduce code duplication in the AfterWalkers\n  class NextTerminalAfterAtLeastOneSepWalker extends AbstractNextTerminalAfterProductionWalker {\n    walkAtLeastOneSep(atleastOneSepProd, currRest, prevRest) {\n      if (atleastOneSepProd.idx === this.occurrence) {\n        const firstAfterfirstAfterAtLeastOneSep = head(currRest.concat(prevRest))\n        this.result.isEndOfRule = firstAfterfirstAfterAtLeastOneSep === undefined\n        if (firstAfterfirstAfterAtLeastOneSep instanceof Terminal) {\n          this.result.token = firstAfterfirstAfterAtLeastOneSep.terminalType\n          this.result.occurrence = firstAfterfirstAfterAtLeastOneSep.idx\n        }\n      } else {\n        super.walkAtLeastOneSep(atleastOneSepProd, currRest, prevRest)\n      }\n    }\n  }\n  function possiblePathsFrom(targetDef, maxLength, currPath = []) {\n    // avoid side effects\n    currPath = clone(currPath)\n    let result = []\n    let i = 0\n    // TODO: avoid inner funcs\n    function remainingPathWith(nextDef) {\n      return nextDef.concat(drop(targetDef, i + 1))\n    }\n    // TODO: avoid inner funcs\n    function getAlternativesForProd(definition) {\n      const alternatives = possiblePathsFrom(remainingPathWith(definition), maxLength, currPath)\n      return result.concat(alternatives)\n    }\n    /**\n     * Mandatory productions will halt the loop as the paths computed from their recursive calls will already contain the\n     * following (rest) of the targetDef.\n     *\n     * For optional productions (Option/Repetition/...) the loop will continue to represent the paths that do not include the\n     * the optional production.\n     */\n    while (currPath.length < maxLength && i < targetDef.length) {\n      const prod = targetDef[i]\n      /* istanbul ignore else */\n      if (prod instanceof Alternative) {\n        return getAlternativesForProd(prod.definition)\n      } else if (prod instanceof NonTerminal) {\n        return getAlternativesForProd(prod.definition)\n      } else if (prod instanceof Option) {\n        result = getAlternativesForProd(prod.definition)\n      } else if (prod instanceof RepetitionMandatory) {\n        const newDef = prod.definition.concat([\n          new Repetition({\n            definition: prod.definition,\n          }),\n        ])\n        return getAlternativesForProd(newDef)\n      } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n        const newDef = [\n          new Alternative({ definition: prod.definition }),\n          new Repetition({\n            definition: [new Terminal({ terminalType: prod.separator })].concat(prod.definition),\n          }),\n        ]\n        return getAlternativesForProd(newDef)\n      } else if (prod instanceof RepetitionWithSeparator) {\n        const newDef = prod.definition.concat([\n          new Repetition({\n            definition: [new Terminal({ terminalType: prod.separator })].concat(prod.definition),\n          }),\n        ])\n        result = getAlternativesForProd(newDef)\n      } else if (prod instanceof Repetition) {\n        const newDef = prod.definition.concat([\n          new Repetition({\n            definition: prod.definition,\n          }),\n        ])\n        result = getAlternativesForProd(newDef)\n      } else if (prod instanceof Alternation) {\n        forEach(prod.definition, (currAlt) => {\n          // TODO: this is a limited check for empty alternatives\n          //   It would prevent a common case of infinite loops during parser initialization.\n          //   However **in-directly** empty alternatives may still cause issues.\n          if (isEmpty(currAlt.definition) === false) {\n            result = getAlternativesForProd(currAlt.definition)\n          }\n        })\n        return result\n      } else if (prod instanceof Terminal) {\n        currPath.push(prod.terminalType)\n      } else {\n        throw Error('non exhaustive match')\n      }\n      i++\n    }\n    result.push({\n      partialPath: currPath,\n      suffixDef: drop(targetDef, i),\n    })\n    return result\n  }\n  function nextPossibleTokensAfter(initialDef, tokenVector, tokMatcher, maxLookAhead) {\n    const EXIT_NON_TERMINAL = 'EXIT_NONE_TERMINAL'\n    // to avoid creating a new Array each time.\n    const EXIT_NON_TERMINAL_ARR = [EXIT_NON_TERMINAL]\n    const EXIT_ALTERNATIVE = 'EXIT_ALTERNATIVE'\n    let foundCompletePath = false\n    const tokenVectorLength = tokenVector.length\n    const minimalAlternativesIndex = tokenVectorLength - maxLookAhead - 1\n    const result = []\n    const possiblePaths = []\n    possiblePaths.push({\n      idx: -1,\n      def: initialDef,\n      ruleStack: [],\n      occurrenceStack: [],\n    })\n    while (!isEmpty(possiblePaths)) {\n      const currPath = possiblePaths.pop()\n      // skip alternatives if no more results can be found (assuming deterministic grammar with fixed lookahead)\n      if (currPath === EXIT_ALTERNATIVE) {\n        if (foundCompletePath && last(possiblePaths).idx <= minimalAlternativesIndex) {\n          // remove irrelevant alternative\n          possiblePaths.pop()\n        }\n        continue\n      }\n      const currDef = currPath.def\n      const currIdx = currPath.idx\n      const currRuleStack = currPath.ruleStack\n      const currOccurrenceStack = currPath.occurrenceStack\n      // For Example: an empty path could exist in a valid grammar in the case of an EMPTY_ALT\n      if (isEmpty(currDef)) {\n        continue\n      }\n      const prod = currDef[0]\n      /* istanbul ignore else */\n      if (prod === EXIT_NON_TERMINAL) {\n        const nextPath = {\n          idx: currIdx,\n          def: drop(currDef),\n          ruleStack: dropRight(currRuleStack),\n          occurrenceStack: dropRight(currOccurrenceStack),\n        }\n        possiblePaths.push(nextPath)\n      } else if (prod instanceof Terminal) {\n        /* istanbul ignore else */\n        if (currIdx < tokenVectorLength - 1) {\n          const nextIdx = currIdx + 1\n          const actualToken = tokenVector[nextIdx]\n          if (tokMatcher(actualToken, prod.terminalType)) {\n            const nextPath = {\n              idx: nextIdx,\n              def: drop(currDef),\n              ruleStack: currRuleStack,\n              occurrenceStack: currOccurrenceStack,\n            }\n            possiblePaths.push(nextPath)\n          }\n          // end of the line\n        } else if (currIdx === tokenVectorLength - 1) {\n          // IGNORE ABOVE ELSE\n          result.push({\n            nextTokenType: prod.terminalType,\n            nextTokenOccurrence: prod.idx,\n            ruleStack: currRuleStack,\n            occurrenceStack: currOccurrenceStack,\n          })\n          foundCompletePath = true\n        } else {\n          throw Error('non exhaustive match')\n        }\n      } else if (prod instanceof NonTerminal) {\n        const newRuleStack = clone(currRuleStack)\n        newRuleStack.push(prod.nonTerminalName)\n        const newOccurrenceStack = clone(currOccurrenceStack)\n        newOccurrenceStack.push(prod.idx)\n        const nextPath = {\n          idx: currIdx,\n          def: prod.definition.concat(EXIT_NON_TERMINAL_ARR, drop(currDef)),\n          ruleStack: newRuleStack,\n          occurrenceStack: newOccurrenceStack,\n        }\n        possiblePaths.push(nextPath)\n      } else if (prod instanceof Option) {\n        // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n        const nextPathWithout = {\n          idx: currIdx,\n          def: drop(currDef),\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWithout)\n        // required marker to avoid backtracking paths whose higher priority alternatives already matched\n        possiblePaths.push(EXIT_ALTERNATIVE)\n        const nextPathWith = {\n          idx: currIdx,\n          def: prod.definition.concat(drop(currDef)),\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWith)\n      } else if (prod instanceof RepetitionMandatory) {\n        // TODO:(THE NEW operators here take a while...) (convert once?)\n        const secondIteration = new Repetition({\n          definition: prod.definition,\n          idx: prod.idx,\n        })\n        const nextDef = prod.definition.concat([secondIteration], drop(currDef))\n        const nextPath = {\n          idx: currIdx,\n          def: nextDef,\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPath)\n      } else if (prod instanceof RepetitionMandatoryWithSeparator) {\n        // TODO:(THE NEW operators here take a while...) (convert once?)\n        const separatorGast = new Terminal({\n          terminalType: prod.separator,\n        })\n        const secondIteration = new Repetition({\n          definition: [separatorGast].concat(prod.definition),\n          idx: prod.idx,\n        })\n        const nextDef = prod.definition.concat([secondIteration], drop(currDef))\n        const nextPath = {\n          idx: currIdx,\n          def: nextDef,\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPath)\n      } else if (prod instanceof RepetitionWithSeparator) {\n        // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n        const nextPathWithout = {\n          idx: currIdx,\n          def: drop(currDef),\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWithout)\n        // required marker to avoid backtracking paths whose higher priority alternatives already matched\n        possiblePaths.push(EXIT_ALTERNATIVE)\n        const separatorGast = new Terminal({\n          terminalType: prod.separator,\n        })\n        const nthRepetition = new Repetition({\n          definition: [separatorGast].concat(prod.definition),\n          idx: prod.idx,\n        })\n        const nextDef = prod.definition.concat([nthRepetition], drop(currDef))\n        const nextPathWith = {\n          idx: currIdx,\n          def: nextDef,\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWith)\n      } else if (prod instanceof Repetition) {\n        // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n        const nextPathWithout = {\n          idx: currIdx,\n          def: drop(currDef),\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWithout)\n        // required marker to avoid backtracking paths whose higher priority alternatives already matched\n        possiblePaths.push(EXIT_ALTERNATIVE)\n        // TODO: an empty repetition will cause infinite loops here, will the parser detect this in selfAnalysis?\n        const nthRepetition = new Repetition({\n          definition: prod.definition,\n          idx: prod.idx,\n        })\n        const nextDef = prod.definition.concat([nthRepetition], drop(currDef))\n        const nextPathWith = {\n          idx: currIdx,\n          def: nextDef,\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        }\n        possiblePaths.push(nextPathWith)\n      } else if (prod instanceof Alternation) {\n        // the order of alternatives is meaningful, FILO (Last path will be traversed first).\n        for (let i = prod.definition.length - 1; i >= 0; i--) {\n          const currAlt = prod.definition[i]\n          const currAltPath = {\n            idx: currIdx,\n            def: currAlt.definition.concat(drop(currDef)),\n            ruleStack: currRuleStack,\n            occurrenceStack: currOccurrenceStack,\n          }\n          possiblePaths.push(currAltPath)\n          possiblePaths.push(EXIT_ALTERNATIVE)\n        }\n      } else if (prod instanceof Alternative) {\n        possiblePaths.push({\n          idx: currIdx,\n          def: prod.definition.concat(drop(currDef)),\n          ruleStack: currRuleStack,\n          occurrenceStack: currOccurrenceStack,\n        })\n      } else if (prod instanceof Rule) {\n        // last because we should only encounter at most a single one of these per invocation.\n        possiblePaths.push(expandTopLevelRule(prod, currIdx, currRuleStack, currOccurrenceStack))\n      } else {\n        throw Error('non exhaustive match')\n      }\n    }\n    return result\n  }\n  function expandTopLevelRule(topRule, currIdx, currRuleStack, currOccurrenceStack) {\n    const newRuleStack = clone(currRuleStack)\n    newRuleStack.push(topRule.name)\n    const newCurrOccurrenceStack = clone(currOccurrenceStack)\n    // top rule is always assumed to have been called with occurrence index 1\n    newCurrOccurrenceStack.push(1)\n    return {\n      idx: currIdx,\n      def: topRule.definition,\n      ruleStack: newRuleStack,\n      occurrenceStack: newCurrOccurrenceStack,\n    }\n  }\n\n  var PROD_TYPE\n  ;(function (PROD_TYPE) {\n    PROD_TYPE[(PROD_TYPE['OPTION'] = 0)] = 'OPTION'\n    PROD_TYPE[(PROD_TYPE['REPETITION'] = 1)] = 'REPETITION'\n    PROD_TYPE[(PROD_TYPE['REPETITION_MANDATORY'] = 2)] = 'REPETITION_MANDATORY'\n    PROD_TYPE[(PROD_TYPE['REPETITION_MANDATORY_WITH_SEPARATOR'] = 3)] = 'REPETITION_MANDATORY_WITH_SEPARATOR'\n    PROD_TYPE[(PROD_TYPE['REPETITION_WITH_SEPARATOR'] = 4)] = 'REPETITION_WITH_SEPARATOR'\n    PROD_TYPE[(PROD_TYPE['ALTERNATION'] = 5)] = 'ALTERNATION'\n  })(PROD_TYPE || (PROD_TYPE = {}))\n  function getProdType(prod) {\n    /* istanbul ignore else */\n    if (prod instanceof Option || prod === 'Option') {\n      return PROD_TYPE.OPTION\n    } else if (prod instanceof Repetition || prod === 'Repetition') {\n      return PROD_TYPE.REPETITION\n    } else if (prod instanceof RepetitionMandatory || prod === 'RepetitionMandatory') {\n      return PROD_TYPE.REPETITION_MANDATORY\n    } else if (prod instanceof RepetitionMandatoryWithSeparator || prod === 'RepetitionMandatoryWithSeparator') {\n      return PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR\n    } else if (prod instanceof RepetitionWithSeparator || prod === 'RepetitionWithSeparator') {\n      return PROD_TYPE.REPETITION_WITH_SEPARATOR\n    } else if (prod instanceof Alternation || prod === 'Alternation') {\n      return PROD_TYPE.ALTERNATION\n    } else {\n      throw Error('non exhaustive match')\n    }\n  }\n  function buildLookaheadFuncForOr(\n    occurrence,\n    ruleGrammar,\n    maxLookahead,\n    hasPredicates,\n    dynamicTokensEnabled,\n    laFuncBuilder,\n  ) {\n    const lookAheadPaths = getLookaheadPathsForOr(occurrence, ruleGrammar, maxLookahead)\n    const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n      ? tokenStructuredMatcherNoCategories\n      : tokenStructuredMatcher\n    return laFuncBuilder(lookAheadPaths, hasPredicates, tokenMatcher, dynamicTokensEnabled)\n  }\n  /**\n   *  When dealing with an Optional production (OPTION/MANY/2nd iteration of AT_LEAST_ONE/...) we need to compare\n   *  the lookahead \"inside\" the production and the lookahead immediately \"after\" it in the same top level rule (context free).\n   *\n   *  Example: given a production:\n   *  ABC(DE)?DF\n   *\n   *  The optional '(DE)?' should only be entered if we see 'DE'. a single Token 'D' is not sufficient to distinguish between the two\n   *  alternatives.\n   *\n   *  @returns A Lookahead function which will return true IFF the parser should parse the Optional production.\n   */\n  function buildLookaheadFuncForOptionalProd(\n    occurrence,\n    ruleGrammar,\n    k,\n    dynamicTokensEnabled,\n    prodType,\n    lookaheadBuilder,\n  ) {\n    const lookAheadPaths = getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k)\n    const tokenMatcher = areTokenCategoriesNotUsed(lookAheadPaths)\n      ? tokenStructuredMatcherNoCategories\n      : tokenStructuredMatcher\n    return lookaheadBuilder(lookAheadPaths[0], tokenMatcher, dynamicTokensEnabled)\n  }\n  function buildAlternativesLookAheadFunc(alts, hasPredicates, tokenMatcher, dynamicTokensEnabled) {\n    const numOfAlts = alts.length\n    const areAllOneTokenLookahead = every(alts, (currAlt) => {\n      return every(currAlt, (currPath) => {\n        return currPath.length === 1\n      })\n    })\n    // This version takes into account the predicates as well.\n    if (hasPredicates) {\n      /**\n       * @returns {number} - The chosen alternative index\n       */\n      return function (orAlts) {\n        // unfortunately the predicates must be extracted every single time\n        // as they cannot be cached due to references to parameters(vars) which are no longer valid.\n        // note that in the common case of no predicates, no cpu time will be wasted on this (see else block)\n        const predicates = map(orAlts, (currAlt) => currAlt.GATE)\n        for (let t = 0; t < numOfAlts; t++) {\n          const currAlt = alts[t]\n          const currNumOfPaths = currAlt.length\n          const currPredicate = predicates[t]\n          if (currPredicate !== undefined && currPredicate.call(this) === false) {\n            // if the predicate does not match there is no point in checking the paths\n            continue\n          }\n          nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n            const currPath = currAlt[j]\n            const currPathLength = currPath.length\n            for (let i = 0; i < currPathLength; i++) {\n              const nextToken = this.LA(i + 1)\n              if (tokenMatcher(nextToken, currPath[i]) === false) {\n                // mismatch in current path\n                // try the next pth\n                continue nextPath\n              }\n            }\n            // found a full path that matches.\n            // this will also work for an empty ALT as the loop will be skipped\n            return t\n          }\n          // none of the paths for the current alternative matched\n          // try the next alternative\n        }\n        // none of the alternatives could be matched\n        return undefined\n      }\n    } else if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n      // optimized (common) case of all the lookaheads paths requiring only\n      // a single token lookahead. These Optimizations cannot work if dynamically defined Tokens are used.\n      const singleTokenAlts = map(alts, (currAlt) => {\n        return flatten(currAlt)\n      })\n      const choiceToAlt = reduce(\n        singleTokenAlts,\n        (result, currAlt, idx) => {\n          forEach(currAlt, (currTokType) => {\n            if (!has(result, currTokType.tokenTypeIdx)) {\n              result[currTokType.tokenTypeIdx] = idx\n            }\n            forEach(currTokType.categoryMatches, (currExtendingType) => {\n              if (!has(result, currExtendingType)) {\n                result[currExtendingType] = idx\n              }\n            })\n          })\n          return result\n        },\n        {},\n      )\n      /**\n       * @returns {number} - The chosen alternative index\n       */\n      return function () {\n        const nextToken = this.LA(1)\n        return choiceToAlt[nextToken.tokenTypeIdx]\n      }\n    } else {\n      // optimized lookahead without needing to check the predicates at all.\n      // this causes code duplication which is intentional to improve performance.\n      /**\n       * @returns {number} - The chosen alternative index\n       */\n      return function () {\n        for (let t = 0; t < numOfAlts; t++) {\n          const currAlt = alts[t]\n          const currNumOfPaths = currAlt.length\n          nextPath: for (let j = 0; j < currNumOfPaths; j++) {\n            const currPath = currAlt[j]\n            const currPathLength = currPath.length\n            for (let i = 0; i < currPathLength; i++) {\n              const nextToken = this.LA(i + 1)\n              if (tokenMatcher(nextToken, currPath[i]) === false) {\n                // mismatch in current path\n                // try the next pth\n                continue nextPath\n              }\n            }\n            // found a full path that matches.\n            // this will also work for an empty ALT as the loop will be skipped\n            return t\n          }\n          // none of the paths for the current alternative matched\n          // try the next alternative\n        }\n        // none of the alternatives could be matched\n        return undefined\n      }\n    }\n  }\n  function buildSingleAlternativeLookaheadFunction(alt, tokenMatcher, dynamicTokensEnabled) {\n    const areAllOneTokenLookahead = every(alt, (currPath) => {\n      return currPath.length === 1\n    })\n    const numOfPaths = alt.length\n    // optimized (common) case of all the lookaheads paths requiring only\n    // a single token lookahead.\n    if (areAllOneTokenLookahead && !dynamicTokensEnabled) {\n      const singleTokensTypes = flatten(alt)\n      if (singleTokensTypes.length === 1 && isEmpty(singleTokensTypes[0].categoryMatches)) {\n        const expectedTokenType = singleTokensTypes[0]\n        const expectedTokenUniqueKey = expectedTokenType.tokenTypeIdx\n        return function () {\n          return this.LA(1).tokenTypeIdx === expectedTokenUniqueKey\n        }\n      } else {\n        const choiceToAlt = reduce(\n          singleTokensTypes,\n          (result, currTokType, idx) => {\n            result[currTokType.tokenTypeIdx] = true\n            forEach(currTokType.categoryMatches, (currExtendingType) => {\n              result[currExtendingType] = true\n            })\n            return result\n          },\n          [],\n        )\n        return function () {\n          const nextToken = this.LA(1)\n          return choiceToAlt[nextToken.tokenTypeIdx] === true\n        }\n      }\n    } else {\n      return function () {\n        nextPath: for (let j = 0; j < numOfPaths; j++) {\n          const currPath = alt[j]\n          const currPathLength = currPath.length\n          for (let i = 0; i < currPathLength; i++) {\n            const nextToken = this.LA(i + 1)\n            if (tokenMatcher(nextToken, currPath[i]) === false) {\n              // mismatch in current path\n              // try the next pth\n              continue nextPath\n            }\n          }\n          // found a full path that matches.\n          return true\n        }\n        // none of the paths matched\n        return false\n      }\n    }\n  }\n  class RestDefinitionFinderWalker extends RestWalker {\n    constructor(topProd, targetOccurrence, targetProdType) {\n      super()\n      this.topProd = topProd\n      this.targetOccurrence = targetOccurrence\n      this.targetProdType = targetProdType\n    }\n    startWalking() {\n      this.walk(this.topProd)\n      return this.restDef\n    }\n    checkIsTarget(node, expectedProdType, currRest, prevRest) {\n      if (node.idx === this.targetOccurrence && this.targetProdType === expectedProdType) {\n        this.restDef = currRest.concat(prevRest)\n        return true\n      }\n      // performance optimization, do not iterate over the entire Grammar ast after we have found the target\n      return false\n    }\n    walkOption(optionProd, currRest, prevRest) {\n      if (!this.checkIsTarget(optionProd, PROD_TYPE.OPTION, currRest, prevRest)) {\n        super.walkOption(optionProd, currRest, prevRest)\n      }\n    }\n    walkAtLeastOne(atLeastOneProd, currRest, prevRest) {\n      if (!this.checkIsTarget(atLeastOneProd, PROD_TYPE.REPETITION_MANDATORY, currRest, prevRest)) {\n        super.walkOption(atLeastOneProd, currRest, prevRest)\n      }\n    }\n    walkAtLeastOneSep(atLeastOneSepProd, currRest, prevRest) {\n      if (!this.checkIsTarget(atLeastOneSepProd, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR, currRest, prevRest)) {\n        super.walkOption(atLeastOneSepProd, currRest, prevRest)\n      }\n    }\n    walkMany(manyProd, currRest, prevRest) {\n      if (!this.checkIsTarget(manyProd, PROD_TYPE.REPETITION, currRest, prevRest)) {\n        super.walkOption(manyProd, currRest, prevRest)\n      }\n    }\n    walkManySep(manySepProd, currRest, prevRest) {\n      if (!this.checkIsTarget(manySepProd, PROD_TYPE.REPETITION_WITH_SEPARATOR, currRest, prevRest)) {\n        super.walkOption(manySepProd, currRest, prevRest)\n      }\n    }\n  }\n  /**\n   * Returns the definition of a target production in a top level level rule.\n   */\n  class InsideDefinitionFinderVisitor extends GAstVisitor {\n    constructor(targetOccurrence, targetProdType, targetRef) {\n      super()\n      this.targetOccurrence = targetOccurrence\n      this.targetProdType = targetProdType\n      this.targetRef = targetRef\n      this.result = []\n    }\n    checkIsTarget(node, expectedProdName) {\n      if (\n        node.idx === this.targetOccurrence &&\n        this.targetProdType === expectedProdName &&\n        (this.targetRef === undefined || node === this.targetRef)\n      ) {\n        this.result = node.definition\n      }\n    }\n    visitOption(node) {\n      this.checkIsTarget(node, PROD_TYPE.OPTION)\n    }\n    visitRepetition(node) {\n      this.checkIsTarget(node, PROD_TYPE.REPETITION)\n    }\n    visitRepetitionMandatory(node) {\n      this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY)\n    }\n    visitRepetitionMandatoryWithSeparator(node) {\n      this.checkIsTarget(node, PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR)\n    }\n    visitRepetitionWithSeparator(node) {\n      this.checkIsTarget(node, PROD_TYPE.REPETITION_WITH_SEPARATOR)\n    }\n    visitAlternation(node) {\n      this.checkIsTarget(node, PROD_TYPE.ALTERNATION)\n    }\n  }\n  function initializeArrayOfArrays(size) {\n    const result = new Array(size)\n    for (let i = 0; i < size; i++) {\n      result[i] = []\n    }\n    return result\n  }\n  /**\n   * A sort of hash function between a Path in the grammar and a string.\n   * Note that this returns multiple \"hashes\" to support the scenario of token categories.\n   * -  A single path with categories may match multiple **actual** paths.\n   */\n  function pathToHashKeys(path) {\n    let keys = ['']\n    for (let i = 0; i < path.length; i++) {\n      const tokType = path[i]\n      const longerKeys = []\n      for (let j = 0; j < keys.length; j++) {\n        const currShorterKey = keys[j]\n        longerKeys.push(currShorterKey + '_' + tokType.tokenTypeIdx)\n        for (let t = 0; t < tokType.categoryMatches.length; t++) {\n          const categoriesKeySuffix = '_' + tokType.categoryMatches[t]\n          longerKeys.push(currShorterKey + categoriesKeySuffix)\n        }\n      }\n      keys = longerKeys\n    }\n    return keys\n  }\n  /**\n   * Imperative style due to being called from a hot spot\n   */\n  function isUniquePrefixHash(altKnownPathsKeys, searchPathKeys, idx) {\n    for (let currAltIdx = 0; currAltIdx < altKnownPathsKeys.length; currAltIdx++) {\n      // We only want to test vs the other alternatives\n      if (currAltIdx === idx) {\n        continue\n      }\n      const otherAltKnownPathsKeys = altKnownPathsKeys[currAltIdx]\n      for (let searchIdx = 0; searchIdx < searchPathKeys.length; searchIdx++) {\n        const searchKey = searchPathKeys[searchIdx]\n        if (otherAltKnownPathsKeys[searchKey] === true) {\n          return false\n        }\n      }\n    }\n    // None of the SearchPathKeys were found in any of the other alternatives\n    return true\n  }\n  function lookAheadSequenceFromAlternatives(altsDefs, k) {\n    const partialAlts = map(altsDefs, (currAlt) => possiblePathsFrom([currAlt], 1))\n    const finalResult = initializeArrayOfArrays(partialAlts.length)\n    const altsHashes = map(partialAlts, (currAltPaths) => {\n      const dict = {}\n      forEach(currAltPaths, (item) => {\n        const keys = pathToHashKeys(item.partialPath)\n        forEach(keys, (currKey) => {\n          dict[currKey] = true\n        })\n      })\n      return dict\n    })\n    let newData = partialAlts\n    // maxLookahead loop\n    for (let pathLength = 1; pathLength <= k; pathLength++) {\n      const currDataset = newData\n      newData = initializeArrayOfArrays(currDataset.length)\n      // alternatives loop\n      for (let altIdx = 0; altIdx < currDataset.length; altIdx++) {\n        const currAltPathsAndSuffixes = currDataset[altIdx]\n        // paths in current alternative loop\n        for (let currPathIdx = 0; currPathIdx < currAltPathsAndSuffixes.length; currPathIdx++) {\n          const currPathPrefix = currAltPathsAndSuffixes[currPathIdx].partialPath\n          const suffixDef = currAltPathsAndSuffixes[currPathIdx].suffixDef\n          const prefixKeys = pathToHashKeys(currPathPrefix)\n          const isUnique = isUniquePrefixHash(altsHashes, prefixKeys, altIdx)\n          // End of the line for this path.\n          if (isUnique || isEmpty(suffixDef) || currPathPrefix.length === k) {\n            const currAltResult = finalResult[altIdx]\n            // TODO: Can we implement a containsPath using Maps/Dictionaries?\n            if (containsPath(currAltResult, currPathPrefix) === false) {\n              currAltResult.push(currPathPrefix)\n              // Update all new  keys for the current path.\n              for (let j = 0; j < prefixKeys.length; j++) {\n                const currKey = prefixKeys[j]\n                altsHashes[altIdx][currKey] = true\n              }\n            }\n          }\n          // Expand longer paths\n          else {\n            const newPartialPathsAndSuffixes = possiblePathsFrom(suffixDef, pathLength + 1, currPathPrefix)\n            newData[altIdx] = newData[altIdx].concat(newPartialPathsAndSuffixes)\n            // Update keys for new known paths\n            forEach(newPartialPathsAndSuffixes, (item) => {\n              const prefixKeys = pathToHashKeys(item.partialPath)\n              forEach(prefixKeys, (key) => {\n                altsHashes[altIdx][key] = true\n              })\n            })\n          }\n        }\n      }\n    }\n    return finalResult\n  }\n  function getLookaheadPathsForOr(occurrence, ruleGrammar, k, orProd) {\n    const visitor = new InsideDefinitionFinderVisitor(occurrence, PROD_TYPE.ALTERNATION, orProd)\n    ruleGrammar.accept(visitor)\n    return lookAheadSequenceFromAlternatives(visitor.result, k)\n  }\n  function getLookaheadPathsForOptionalProd(occurrence, ruleGrammar, prodType, k) {\n    const insideDefVisitor = new InsideDefinitionFinderVisitor(occurrence, prodType)\n    ruleGrammar.accept(insideDefVisitor)\n    const insideDef = insideDefVisitor.result\n    const afterDefWalker = new RestDefinitionFinderWalker(ruleGrammar, occurrence, prodType)\n    const afterDef = afterDefWalker.startWalking()\n    const insideFlat = new Alternative({ definition: insideDef })\n    const afterFlat = new Alternative({ definition: afterDef })\n    return lookAheadSequenceFromAlternatives([insideFlat, afterFlat], k)\n  }\n  function containsPath(alternative, searchPath) {\n    compareOtherPath: for (let i = 0; i < alternative.length; i++) {\n      const otherPath = alternative[i]\n      if (otherPath.length !== searchPath.length) {\n        continue\n      }\n      for (let j = 0; j < otherPath.length; j++) {\n        const searchTok = searchPath[j]\n        const otherTok = otherPath[j]\n        const matchingTokens =\n          searchTok === otherTok || otherTok.categoryMatchesMap[searchTok.tokenTypeIdx] !== undefined\n        if (matchingTokens === false) {\n          continue compareOtherPath\n        }\n      }\n      return true\n    }\n    return false\n  }\n  function isStrictPrefixOfPath(prefix, other) {\n    return (\n      prefix.length < other.length &&\n      every(prefix, (tokType, idx) => {\n        const otherTokType = other[idx]\n        return tokType === otherTokType || otherTokType.categoryMatchesMap[tokType.tokenTypeIdx]\n      })\n    )\n  }\n  function areTokenCategoriesNotUsed(lookAheadPaths) {\n    return every(lookAheadPaths, (singleAltPaths) =>\n      every(singleAltPaths, (singlePath) => every(singlePath, (token) => isEmpty(token.categoryMatches))),\n    )\n  }\n\n  function validateLookahead(options) {\n    const lookaheadValidationErrorMessages = options.lookaheadStrategy.validate({\n      rules: options.rules,\n      tokenTypes: options.tokenTypes,\n      grammarName: options.grammarName,\n    })\n    return map(lookaheadValidationErrorMessages, (errorMessage) =>\n      Object.assign({ type: ParserDefinitionErrorType.CUSTOM_LOOKAHEAD_VALIDATION }, errorMessage),\n    )\n  }\n  function validateGrammar$1(topLevels, tokenTypes, errMsgProvider, grammarName) {\n    const duplicateErrors = flatMap(topLevels, (currTopLevel) =>\n      validateDuplicateProductions(currTopLevel, errMsgProvider),\n    )\n    const termsNamespaceConflictErrors = checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider)\n    const tooManyAltsErrors = flatMap(topLevels, (curRule) => validateTooManyAlts(curRule, errMsgProvider))\n    const duplicateRulesError = flatMap(topLevels, (curRule) =>\n      validateRuleDoesNotAlreadyExist(curRule, topLevels, grammarName, errMsgProvider),\n    )\n    return duplicateErrors.concat(termsNamespaceConflictErrors, tooManyAltsErrors, duplicateRulesError)\n  }\n  function validateDuplicateProductions(topLevelRule, errMsgProvider) {\n    const collectorVisitor = new OccurrenceValidationCollector()\n    topLevelRule.accept(collectorVisitor)\n    const allRuleProductions = collectorVisitor.allProductions\n    const productionGroups = groupBy$1(allRuleProductions, identifyProductionForDuplicates)\n    const duplicates = pickBy(productionGroups, (currGroup) => {\n      return currGroup.length > 1\n    })\n    const errors = map(values(duplicates), (currDuplicates) => {\n      const firstProd = head(currDuplicates)\n      const msg = errMsgProvider.buildDuplicateFoundError(topLevelRule, currDuplicates)\n      const dslName = getProductionDslName(firstProd)\n      const defError = {\n        message: msg,\n        type: ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,\n        ruleName: topLevelRule.name,\n        dslName: dslName,\n        occurrence: firstProd.idx,\n      }\n      const param = getExtraProductionArgument(firstProd)\n      if (param) {\n        defError.parameter = param\n      }\n      return defError\n    })\n    return errors\n  }\n  function identifyProductionForDuplicates(prod) {\n    return `${getProductionDslName(prod)}_#_${prod.idx}_#_${getExtraProductionArgument(prod)}`\n  }\n  function getExtraProductionArgument(prod) {\n    if (prod instanceof Terminal) {\n      return prod.terminalType.name\n    } else if (prod instanceof NonTerminal) {\n      return prod.nonTerminalName\n    } else {\n      return ''\n    }\n  }\n  class OccurrenceValidationCollector extends GAstVisitor {\n    constructor() {\n      super(...arguments)\n      this.allProductions = []\n    }\n    visitNonTerminal(subrule) {\n      this.allProductions.push(subrule)\n    }\n    visitOption(option) {\n      this.allProductions.push(option)\n    }\n    visitRepetitionWithSeparator(manySep) {\n      this.allProductions.push(manySep)\n    }\n    visitRepetitionMandatory(atLeastOne) {\n      this.allProductions.push(atLeastOne)\n    }\n    visitRepetitionMandatoryWithSeparator(atLeastOneSep) {\n      this.allProductions.push(atLeastOneSep)\n    }\n    visitRepetition(many) {\n      this.allProductions.push(many)\n    }\n    visitAlternation(or) {\n      this.allProductions.push(or)\n    }\n    visitTerminal(terminal) {\n      this.allProductions.push(terminal)\n    }\n  }\n  function validateRuleDoesNotAlreadyExist(rule, allRules, className, errMsgProvider) {\n    const errors = []\n    const occurrences = reduce(\n      allRules,\n      (result, curRule) => {\n        if (curRule.name === rule.name) {\n          return result + 1\n        }\n        return result\n      },\n      0,\n    )\n    if (occurrences > 1) {\n      const errMsg = errMsgProvider.buildDuplicateRuleNameError({\n        topLevelRule: rule,\n        grammarName: className,\n      })\n      errors.push({\n        message: errMsg,\n        type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n        ruleName: rule.name,\n      })\n    }\n    return errors\n  }\n  // TODO: is there anyway to get only the rule names of rules inherited from the super grammars?\n  // This is not part of the IGrammarErrorProvider because the validation cannot be performed on\n  // The grammar structure, only at runtime.\n  function validateRuleIsOverridden(ruleName, definedRulesNames, className) {\n    const errors = []\n    let errMsg\n    if (!includes(definedRulesNames, ruleName)) {\n      errMsg =\n        `Invalid rule override, rule: ->${ruleName}<- cannot be overridden in the grammar: ->${className}<-` +\n        `as it is not defined in any of the super grammars `\n      errors.push({\n        message: errMsg,\n        type: ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,\n        ruleName: ruleName,\n      })\n    }\n    return errors\n  }\n  function validateNoLeftRecursion(topRule, currRule, errMsgProvider, path = []) {\n    const errors = []\n    const nextNonTerminals = getFirstNoneTerminal(currRule.definition)\n    if (isEmpty(nextNonTerminals)) {\n      return []\n    } else {\n      const ruleName = topRule.name\n      const foundLeftRecursion = includes(nextNonTerminals, topRule)\n      if (foundLeftRecursion) {\n        errors.push({\n          message: errMsgProvider.buildLeftRecursionError({\n            topLevelRule: topRule,\n            leftRecursionPath: path,\n          }),\n          type: ParserDefinitionErrorType.LEFT_RECURSION,\n          ruleName: ruleName,\n        })\n      }\n      // we are only looking for cyclic paths leading back to the specific topRule\n      // other cyclic paths are ignored, we still need this difference to avoid infinite loops...\n      const validNextSteps = difference$1(nextNonTerminals, path.concat([topRule]))\n      const errorsFromNextSteps = flatMap(validNextSteps, (currRefRule) => {\n        const newPath = clone(path)\n        newPath.push(currRefRule)\n        return validateNoLeftRecursion(topRule, currRefRule, errMsgProvider, newPath)\n      })\n      return errors.concat(errorsFromNextSteps)\n    }\n  }\n  function getFirstNoneTerminal(definition) {\n    let result = []\n    if (isEmpty(definition)) {\n      return result\n    }\n    const firstProd = head(definition)\n    /* istanbul ignore else */\n    if (firstProd instanceof NonTerminal) {\n      result.push(firstProd.referencedRule)\n    } else if (\n      firstProd instanceof Alternative ||\n      firstProd instanceof Option ||\n      firstProd instanceof RepetitionMandatory ||\n      firstProd instanceof RepetitionMandatoryWithSeparator ||\n      firstProd instanceof RepetitionWithSeparator ||\n      firstProd instanceof Repetition\n    ) {\n      result = result.concat(getFirstNoneTerminal(firstProd.definition))\n    } else if (firstProd instanceof Alternation) {\n      // each sub definition in alternation is a FLAT\n      result = flatten(map(firstProd.definition, (currSubDef) => getFirstNoneTerminal(currSubDef.definition)))\n    } else if (firstProd instanceof Terminal);\n    else {\n      throw Error('non exhaustive match')\n    }\n    const isFirstOptional = isOptionalProd(firstProd)\n    const hasMore = definition.length > 1\n    if (isFirstOptional && hasMore) {\n      const rest = drop(definition)\n      return result.concat(getFirstNoneTerminal(rest))\n    } else {\n      return result\n    }\n  }\n  class OrCollector extends GAstVisitor {\n    constructor() {\n      super(...arguments)\n      this.alternations = []\n    }\n    visitAlternation(node) {\n      this.alternations.push(node)\n    }\n  }\n  function validateEmptyOrAlternative(topLevelRule, errMsgProvider) {\n    const orCollector = new OrCollector()\n    topLevelRule.accept(orCollector)\n    const ors = orCollector.alternations\n    const errors = flatMap(ors, (currOr) => {\n      const exceptLast = dropRight(currOr.definition)\n      return flatMap(exceptLast, (currAlternative, currAltIdx) => {\n        const possibleFirstInAlt = nextPossibleTokensAfter([currAlternative], [], tokenStructuredMatcher, 1)\n        if (isEmpty(possibleFirstInAlt)) {\n          return [\n            {\n              message: errMsgProvider.buildEmptyAlternationError({\n                topLevelRule: topLevelRule,\n                alternation: currOr,\n                emptyChoiceIdx: currAltIdx,\n              }),\n              type: ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,\n              ruleName: topLevelRule.name,\n              occurrence: currOr.idx,\n              alternative: currAltIdx + 1,\n            },\n          ]\n        } else {\n          return []\n        }\n      })\n    })\n    return errors\n  }\n  function validateAmbiguousAlternationAlternatives(topLevelRule, globalMaxLookahead, errMsgProvider) {\n    const orCollector = new OrCollector()\n    topLevelRule.accept(orCollector)\n    let ors = orCollector.alternations\n    // New Handling of ignoring ambiguities\n    // - https://github.com/chevrotain/chevrotain/issues/869\n    ors = reject(ors, (currOr) => currOr.ignoreAmbiguities === true)\n    const errors = flatMap(ors, (currOr) => {\n      const currOccurrence = currOr.idx\n      const actualMaxLookahead = currOr.maxLookahead || globalMaxLookahead\n      const alternatives = getLookaheadPathsForOr(currOccurrence, topLevelRule, actualMaxLookahead, currOr)\n      const altsAmbiguityErrors = checkAlternativesAmbiguities(alternatives, currOr, topLevelRule, errMsgProvider)\n      const altsPrefixAmbiguityErrors = checkPrefixAlternativesAmbiguities(\n        alternatives,\n        currOr,\n        topLevelRule,\n        errMsgProvider,\n      )\n      return altsAmbiguityErrors.concat(altsPrefixAmbiguityErrors)\n    })\n    return errors\n  }\n  class RepetitionCollector extends GAstVisitor {\n    constructor() {\n      super(...arguments)\n      this.allProductions = []\n    }\n    visitRepetitionWithSeparator(manySep) {\n      this.allProductions.push(manySep)\n    }\n    visitRepetitionMandatory(atLeastOne) {\n      this.allProductions.push(atLeastOne)\n    }\n    visitRepetitionMandatoryWithSeparator(atLeastOneSep) {\n      this.allProductions.push(atLeastOneSep)\n    }\n    visitRepetition(many) {\n      this.allProductions.push(many)\n    }\n  }\n  function validateTooManyAlts(topLevelRule, errMsgProvider) {\n    const orCollector = new OrCollector()\n    topLevelRule.accept(orCollector)\n    const ors = orCollector.alternations\n    const errors = flatMap(ors, (currOr) => {\n      if (currOr.definition.length > 255) {\n        return [\n          {\n            message: errMsgProvider.buildTooManyAlternativesError({\n              topLevelRule: topLevelRule,\n              alternation: currOr,\n            }),\n            type: ParserDefinitionErrorType.TOO_MANY_ALTS,\n            ruleName: topLevelRule.name,\n            occurrence: currOr.idx,\n          },\n        ]\n      } else {\n        return []\n      }\n    })\n    return errors\n  }\n  function validateSomeNonEmptyLookaheadPath(topLevelRules, maxLookahead, errMsgProvider) {\n    const errors = []\n    forEach(topLevelRules, (currTopRule) => {\n      const collectorVisitor = new RepetitionCollector()\n      currTopRule.accept(collectorVisitor)\n      const allRuleProductions = collectorVisitor.allProductions\n      forEach(allRuleProductions, (currProd) => {\n        const prodType = getProdType(currProd)\n        const actualMaxLookahead = currProd.maxLookahead || maxLookahead\n        const currOccurrence = currProd.idx\n        const paths = getLookaheadPathsForOptionalProd(currOccurrence, currTopRule, prodType, actualMaxLookahead)\n        const pathsInsideProduction = paths[0]\n        if (isEmpty(flatten(pathsInsideProduction))) {\n          const errMsg = errMsgProvider.buildEmptyRepetitionError({\n            topLevelRule: currTopRule,\n            repetition: currProd,\n          })\n          errors.push({\n            message: errMsg,\n            type: ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,\n            ruleName: currTopRule.name,\n          })\n        }\n      })\n    })\n    return errors\n  }\n  function checkAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    const foundAmbiguousPaths = []\n    const identicalAmbiguities = reduce(\n      alternatives,\n      (result, currAlt, currAltIdx) => {\n        // ignore (skip) ambiguities with this alternative\n        if (alternation.definition[currAltIdx].ignoreAmbiguities === true) {\n          return result\n        }\n        forEach(currAlt, (currPath) => {\n          const altsCurrPathAppearsIn = [currAltIdx]\n          forEach(alternatives, (currOtherAlt, currOtherAltIdx) => {\n            if (\n              currAltIdx !== currOtherAltIdx &&\n              containsPath(currOtherAlt, currPath) &&\n              // ignore (skip) ambiguities with this \"other\" alternative\n              alternation.definition[currOtherAltIdx].ignoreAmbiguities !== true\n            ) {\n              altsCurrPathAppearsIn.push(currOtherAltIdx)\n            }\n          })\n          if (altsCurrPathAppearsIn.length > 1 && !containsPath(foundAmbiguousPaths, currPath)) {\n            foundAmbiguousPaths.push(currPath)\n            result.push({\n              alts: altsCurrPathAppearsIn,\n              path: currPath,\n            })\n          }\n        })\n        return result\n      },\n      [],\n    )\n    const currErrors = map(identicalAmbiguities, (currAmbDescriptor) => {\n      const ambgIndices = map(currAmbDescriptor.alts, (currAltIdx) => currAltIdx + 1)\n      const currMessage = errMsgProvider.buildAlternationAmbiguityError({\n        topLevelRule: rule,\n        alternation: alternation,\n        ambiguityIndices: ambgIndices,\n        prefixPath: currAmbDescriptor.path,\n      })\n      return {\n        message: currMessage,\n        type: ParserDefinitionErrorType.AMBIGUOUS_ALTS,\n        ruleName: rule.name,\n        occurrence: alternation.idx,\n        alternatives: currAmbDescriptor.alts,\n      }\n    })\n    return currErrors\n  }\n  function checkPrefixAlternativesAmbiguities(alternatives, alternation, rule, errMsgProvider) {\n    // flatten\n    const pathsAndIndices = reduce(\n      alternatives,\n      (result, currAlt, idx) => {\n        const currPathsAndIdx = map(currAlt, (currPath) => {\n          return { idx: idx, path: currPath }\n        })\n        return result.concat(currPathsAndIdx)\n      },\n      [],\n    )\n    const errors = compact(\n      flatMap(pathsAndIndices, (currPathAndIdx) => {\n        const alternativeGast = alternation.definition[currPathAndIdx.idx]\n        // ignore (skip) ambiguities with this alternative\n        if (alternativeGast.ignoreAmbiguities === true) {\n          return []\n        }\n        const targetIdx = currPathAndIdx.idx\n        const targetPath = currPathAndIdx.path\n        const prefixAmbiguitiesPathsAndIndices = filter(pathsAndIndices, (searchPathAndIdx) => {\n          // prefix ambiguity can only be created from lower idx (higher priority) path\n          return (\n            // ignore (skip) ambiguities with this \"other\" alternative\n            alternation.definition[searchPathAndIdx.idx].ignoreAmbiguities !== true &&\n            searchPathAndIdx.idx < targetIdx &&\n            // checking for strict prefix because identical lookaheads\n            // will be be detected using a different validation.\n            isStrictPrefixOfPath(searchPathAndIdx.path, targetPath)\n          )\n        })\n        const currPathPrefixErrors = map(prefixAmbiguitiesPathsAndIndices, (currAmbPathAndIdx) => {\n          const ambgIndices = [currAmbPathAndIdx.idx + 1, targetIdx + 1]\n          const occurrence = alternation.idx === 0 ? '' : alternation.idx\n          const message = errMsgProvider.buildAlternationPrefixAmbiguityError({\n            topLevelRule: rule,\n            alternation: alternation,\n            ambiguityIndices: ambgIndices,\n            prefixPath: currAmbPathAndIdx.path,\n          })\n          return {\n            message: message,\n            type: ParserDefinitionErrorType.AMBIGUOUS_PREFIX_ALTS,\n            ruleName: rule.name,\n            occurrence: occurrence,\n            alternatives: ambgIndices,\n          }\n        })\n        return currPathPrefixErrors\n      }),\n    )\n    return errors\n  }\n  function checkTerminalAndNoneTerminalsNameSpace(topLevels, tokenTypes, errMsgProvider) {\n    const errors = []\n    const tokenNames = map(tokenTypes, (currToken) => currToken.name)\n    forEach(topLevels, (currRule) => {\n      const currRuleName = currRule.name\n      if (includes(tokenNames, currRuleName)) {\n        const errMsg = errMsgProvider.buildNamespaceConflictError(currRule)\n        errors.push({\n          message: errMsg,\n          type: ParserDefinitionErrorType.CONFLICT_TOKENS_RULES_NAMESPACE,\n          ruleName: currRuleName,\n        })\n      }\n    })\n    return errors\n  }\n\n  function resolveGrammar(options) {\n    const actualOptions = defaults$1(options, {\n      errMsgProvider: defaultGrammarResolverErrorProvider,\n    })\n    const topRulesTable = {}\n    forEach(options.rules, (rule) => {\n      topRulesTable[rule.name] = rule\n    })\n    return resolveGrammar$1(topRulesTable, actualOptions.errMsgProvider)\n  }\n  function validateGrammar(options) {\n    options = defaults$1(options, {\n      errMsgProvider: defaultGrammarValidatorErrorProvider,\n    })\n    return validateGrammar$1(options.rules, options.tokenTypes, options.errMsgProvider, options.grammarName)\n  }\n\n  const MISMATCHED_TOKEN_EXCEPTION = 'MismatchedTokenException'\n  const NO_VIABLE_ALT_EXCEPTION = 'NoViableAltException'\n  const EARLY_EXIT_EXCEPTION = 'EarlyExitException'\n  const NOT_ALL_INPUT_PARSED_EXCEPTION = 'NotAllInputParsedException'\n  const RECOGNITION_EXCEPTION_NAMES = [\n    MISMATCHED_TOKEN_EXCEPTION,\n    NO_VIABLE_ALT_EXCEPTION,\n    EARLY_EXIT_EXCEPTION,\n    NOT_ALL_INPUT_PARSED_EXCEPTION,\n  ]\n  Object.freeze(RECOGNITION_EXCEPTION_NAMES)\n  // hacks to bypass no support for custom Errors in javascript/typescript\n  function isRecognitionException(error) {\n    // can't do instanceof on hacked custom js exceptions\n    return includes(RECOGNITION_EXCEPTION_NAMES, error.name)\n  }\n  class RecognitionException extends Error {\n    constructor(message, token) {\n      super(message)\n      this.token = token\n      this.resyncedTokens = []\n      // fix prototype chain when typescript target is ES5\n      Object.setPrototypeOf(this, new.target.prototype)\n      /* istanbul ignore next - V8 workaround to remove constructor from stacktrace when typescript target is ES5 */\n      if (Error.captureStackTrace) {\n        Error.captureStackTrace(this, this.constructor)\n      }\n    }\n  }\n  class MismatchedTokenException extends RecognitionException {\n    constructor(message, token, previousToken) {\n      super(message, token)\n      this.previousToken = previousToken\n      this.name = MISMATCHED_TOKEN_EXCEPTION\n    }\n  }\n  class NoViableAltException extends RecognitionException {\n    constructor(message, token, previousToken) {\n      super(message, token)\n      this.previousToken = previousToken\n      this.name = NO_VIABLE_ALT_EXCEPTION\n    }\n  }\n  class NotAllInputParsedException extends RecognitionException {\n    constructor(message, token) {\n      super(message, token)\n      this.name = NOT_ALL_INPUT_PARSED_EXCEPTION\n    }\n  }\n  class EarlyExitException extends RecognitionException {\n    constructor(message, token, previousToken) {\n      super(message, token)\n      this.previousToken = previousToken\n      this.name = EARLY_EXIT_EXCEPTION\n    }\n  }\n\n  const EOF_FOLLOW_KEY = {}\n  const IN_RULE_RECOVERY_EXCEPTION = 'InRuleRecoveryException'\n  class InRuleRecoveryException extends Error {\n    constructor(message) {\n      super(message)\n      this.name = IN_RULE_RECOVERY_EXCEPTION\n    }\n  }\n  /**\n   * This trait is responsible for the error recovery and fault tolerant logic\n   */\n  class Recoverable {\n    initRecoverable(config) {\n      this.firstAfterRepMap = {}\n      this.resyncFollows = {}\n      this.recoveryEnabled = has(config, 'recoveryEnabled')\n        ? config.recoveryEnabled // assumes end user provides the correct config value/type\n        : DEFAULT_PARSER_CONFIG.recoveryEnabled\n      // performance optimization, NOOP will be inlined which\n      // effectively means that this optional feature does not exist\n      // when not used.\n      if (this.recoveryEnabled) {\n        this.attemptInRepetitionRecovery = attemptInRepetitionRecovery\n      }\n    }\n    getTokenToInsert(tokType) {\n      const tokToInsert = createTokenInstance(tokType, '', NaN, NaN, NaN, NaN, NaN, NaN)\n      tokToInsert.isInsertedInRecovery = true\n      return tokToInsert\n    }\n    canTokenTypeBeInsertedInRecovery(tokType) {\n      return true\n    }\n    canTokenTypeBeDeletedInRecovery(tokType) {\n      return true\n    }\n    tryInRepetitionRecovery(grammarRule, grammarRuleArgs, lookAheadFunc, expectedTokType) {\n      // TODO: can the resyncTokenType be cached?\n      const reSyncTokType = this.findReSyncTokenType()\n      const savedLexerState = this.exportLexerState()\n      const resyncedTokens = []\n      let passedResyncPoint = false\n      const nextTokenWithoutResync = this.LA(1)\n      let currToken = this.LA(1)\n      const generateErrorMessage = () => {\n        const previousToken = this.LA(0)\n        // we are preemptively re-syncing before an error has been detected, therefor we must reproduce\n        // the error that would have been thrown\n        const msg = this.errorMessageProvider.buildMismatchTokenMessage({\n          expected: expectedTokType,\n          actual: nextTokenWithoutResync,\n          previous: previousToken,\n          ruleName: this.getCurrRuleFullName(),\n        })\n        const error = new MismatchedTokenException(msg, nextTokenWithoutResync, this.LA(0))\n        // the first token here will be the original cause of the error, this is not part of the resyncedTokens property.\n        error.resyncedTokens = dropRight(resyncedTokens)\n        this.SAVE_ERROR(error)\n      }\n      while (!passedResyncPoint) {\n        // re-synced to a point where we can safely exit the repetition/\n        if (this.tokenMatcher(currToken, expectedTokType)) {\n          generateErrorMessage()\n          return // must return here to avoid reverting the inputIdx\n        } else if (lookAheadFunc.call(this)) {\n          // we skipped enough tokens so we can resync right back into another iteration of the repetition grammar rule\n          generateErrorMessage()\n          // recursive invocation in other to support multiple re-syncs in the same top level repetition grammar rule\n          grammarRule.apply(this, grammarRuleArgs)\n          return // must return here to avoid reverting the inputIdx\n        } else if (this.tokenMatcher(currToken, reSyncTokType)) {\n          passedResyncPoint = true\n        } else {\n          currToken = this.SKIP_TOKEN()\n          this.addToResyncTokens(currToken, resyncedTokens)\n        }\n      }\n      // we were unable to find a CLOSER point to resync inside the Repetition, reset the state.\n      // The parsing exception we were trying to prevent will happen in the NEXT parsing step. it may be handled by\n      // \"between rules\" resync recovery later in the flow.\n      this.importLexerState(savedLexerState)\n    }\n    shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck) {\n      // Edge case of arriving from a MANY repetition which is stuck\n      // Attempting recovery in this case could cause an infinite loop\n      if (notStuck === false) {\n        return false\n      }\n      // no need to recover, next token is what we expect...\n      if (this.tokenMatcher(this.LA(1), expectTokAfterLastMatch)) {\n        return false\n      }\n      // error recovery is disabled during backtracking as it can make the parser ignore a valid grammar path\n      // and prefer some backtracking path that includes recovered errors.\n      if (this.isBackTracking()) {\n        return false\n      }\n      // if we can perform inRule recovery (single token insertion or deletion) we always prefer that recovery algorithm\n      // because if it works, it makes the least amount of changes to the input stream (greedy algorithm)\n      //noinspection RedundantIfStatementJS\n      if (\n        this.canPerformInRuleRecovery(\n          expectTokAfterLastMatch,\n          this.getFollowsForInRuleRecovery(expectTokAfterLastMatch, nextTokIdx),\n        )\n      ) {\n        return false\n      }\n      return true\n    }\n    // Error Recovery functionality\n    getFollowsForInRuleRecovery(tokType, tokIdxInRule) {\n      const grammarPath = this.getCurrentGrammarPath(tokType, tokIdxInRule)\n      const follows = this.getNextPossibleTokenTypes(grammarPath)\n      return follows\n    }\n    tryInRuleRecovery(expectedTokType, follows) {\n      if (this.canRecoverWithSingleTokenInsertion(expectedTokType, follows)) {\n        const tokToInsert = this.getTokenToInsert(expectedTokType)\n        return tokToInsert\n      }\n      if (this.canRecoverWithSingleTokenDeletion(expectedTokType)) {\n        const nextTok = this.SKIP_TOKEN()\n        this.consumeToken()\n        return nextTok\n      }\n      throw new InRuleRecoveryException('sad sad panda')\n    }\n    canPerformInRuleRecovery(expectedToken, follows) {\n      return (\n        this.canRecoverWithSingleTokenInsertion(expectedToken, follows) ||\n        this.canRecoverWithSingleTokenDeletion(expectedToken)\n      )\n    }\n    canRecoverWithSingleTokenInsertion(expectedTokType, follows) {\n      if (!this.canTokenTypeBeInsertedInRecovery(expectedTokType)) {\n        return false\n      }\n      // must know the possible following tokens to perform single token insertion\n      if (isEmpty(follows)) {\n        return false\n      }\n      const mismatchedTok = this.LA(1)\n      const isMisMatchedTokInFollows =\n        find$1(follows, (possibleFollowsTokType) => {\n          return this.tokenMatcher(mismatchedTok, possibleFollowsTokType)\n        }) !== undefined\n      return isMisMatchedTokInFollows\n    }\n    canRecoverWithSingleTokenDeletion(expectedTokType) {\n      if (!this.canTokenTypeBeDeletedInRecovery(expectedTokType)) {\n        return false\n      }\n      const isNextTokenWhatIsExpected = this.tokenMatcher(this.LA(2), expectedTokType)\n      return isNextTokenWhatIsExpected\n    }\n    isInCurrentRuleReSyncSet(tokenTypeIdx) {\n      const followKey = this.getCurrFollowKey()\n      const currentRuleReSyncSet = this.getFollowSetFromFollowKey(followKey)\n      return includes(currentRuleReSyncSet, tokenTypeIdx)\n    }\n    findReSyncTokenType() {\n      const allPossibleReSyncTokTypes = this.flattenFollowSet()\n      // this loop will always terminate as EOF is always in the follow stack and also always (virtually) in the input\n      let nextToken = this.LA(1)\n      let k = 2\n      while (true) {\n        const foundMatch = find$1(allPossibleReSyncTokTypes, (resyncTokType) => {\n          const canMatch = tokenMatcher(nextToken, resyncTokType)\n          return canMatch\n        })\n        if (foundMatch !== undefined) {\n          return foundMatch\n        }\n        nextToken = this.LA(k)\n        k++\n      }\n    }\n    getCurrFollowKey() {\n      // the length is at least one as we always add the ruleName to the stack before invoking the rule.\n      if (this.RULE_STACK.length === 1) {\n        return EOF_FOLLOW_KEY\n      }\n      const currRuleShortName = this.getLastExplicitRuleShortName()\n      const currRuleIdx = this.getLastExplicitRuleOccurrenceIndex()\n      const prevRuleShortName = this.getPreviousExplicitRuleShortName()\n      return {\n        ruleName: this.shortRuleNameToFullName(currRuleShortName),\n        idxInCallingRule: currRuleIdx,\n        inRule: this.shortRuleNameToFullName(prevRuleShortName),\n      }\n    }\n    buildFullFollowKeyStack() {\n      const explicitRuleStack = this.RULE_STACK\n      const explicitOccurrenceStack = this.RULE_OCCURRENCE_STACK\n      return map(explicitRuleStack, (ruleName, idx) => {\n        if (idx === 0) {\n          return EOF_FOLLOW_KEY\n        }\n        return {\n          ruleName: this.shortRuleNameToFullName(ruleName),\n          idxInCallingRule: explicitOccurrenceStack[idx],\n          inRule: this.shortRuleNameToFullName(explicitRuleStack[idx - 1]),\n        }\n      })\n    }\n    flattenFollowSet() {\n      const followStack = map(this.buildFullFollowKeyStack(), (currKey) => {\n        return this.getFollowSetFromFollowKey(currKey)\n      })\n      return flatten(followStack)\n    }\n    getFollowSetFromFollowKey(followKey) {\n      if (followKey === EOF_FOLLOW_KEY) {\n        return [EOF]\n      }\n      const followName = followKey.ruleName + followKey.idxInCallingRule + IN + followKey.inRule\n      return this.resyncFollows[followName]\n    }\n    // It does not make any sense to include a virtual EOF token in the list of resynced tokens\n    // as EOF does not really exist and thus does not contain any useful information (line/column numbers)\n    addToResyncTokens(token, resyncTokens) {\n      if (!this.tokenMatcher(token, EOF)) {\n        resyncTokens.push(token)\n      }\n      return resyncTokens\n    }\n    reSyncTo(tokType) {\n      const resyncedTokens = []\n      let nextTok = this.LA(1)\n      while (this.tokenMatcher(nextTok, tokType) === false) {\n        nextTok = this.SKIP_TOKEN()\n        this.addToResyncTokens(nextTok, resyncedTokens)\n      }\n      // the last token is not part of the error.\n      return dropRight(resyncedTokens)\n    }\n    attemptInRepetitionRecovery(prodFunc, args, lookaheadFunc, dslMethodIdx, prodOccurrence, nextToksWalker, notStuck) {\n      // by default this is a NO-OP\n      // The actual implementation is with the function(not method) below\n    }\n    getCurrentGrammarPath(tokType, tokIdxInRule) {\n      const pathRuleStack = this.getHumanReadableRuleStack()\n      const pathOccurrenceStack = clone(this.RULE_OCCURRENCE_STACK)\n      const grammarPath = {\n        ruleStack: pathRuleStack,\n        occurrenceStack: pathOccurrenceStack,\n        lastTok: tokType,\n        lastTokOccurrence: tokIdxInRule,\n      }\n      return grammarPath\n    }\n    getHumanReadableRuleStack() {\n      return map(this.RULE_STACK, (currShortName) => this.shortRuleNameToFullName(currShortName))\n    }\n  }\n  function attemptInRepetitionRecovery(\n    prodFunc,\n    args,\n    lookaheadFunc,\n    dslMethodIdx,\n    prodOccurrence,\n    nextToksWalker,\n    notStuck,\n  ) {\n    const key = this.getKeyForAutomaticLookahead(dslMethodIdx, prodOccurrence)\n    let firstAfterRepInfo = this.firstAfterRepMap[key]\n    if (firstAfterRepInfo === undefined) {\n      const currRuleName = this.getCurrRuleFullName()\n      const ruleGrammar = this.getGAstProductions()[currRuleName]\n      const walker = new nextToksWalker(ruleGrammar, prodOccurrence)\n      firstAfterRepInfo = walker.startWalking()\n      this.firstAfterRepMap[key] = firstAfterRepInfo\n    }\n    let expectTokAfterLastMatch = firstAfterRepInfo.token\n    let nextTokIdx = firstAfterRepInfo.occurrence\n    const isEndOfRule = firstAfterRepInfo.isEndOfRule\n    // special edge case of a TOP most repetition after which the input should END.\n    // this will force an attempt for inRule recovery in that scenario.\n    if (this.RULE_STACK.length === 1 && isEndOfRule && expectTokAfterLastMatch === undefined) {\n      expectTokAfterLastMatch = EOF\n      nextTokIdx = 1\n    }\n    // We don't have anything to re-sync to...\n    // this condition was extracted from `shouldInRepetitionRecoveryBeTried` to act as a type-guard\n    if (expectTokAfterLastMatch === undefined || nextTokIdx === undefined) {\n      return\n    }\n    if (this.shouldInRepetitionRecoveryBeTried(expectTokAfterLastMatch, nextTokIdx, notStuck)) {\n      // TODO: performance optimization: instead of passing the original args here, we modify\n      // the args param (or create a new one) and make sure the lookahead func is explicitly provided\n      // to avoid searching the cache for it once more.\n      this.tryInRepetitionRecovery(prodFunc, args, lookaheadFunc, expectTokAfterLastMatch)\n    }\n  }\n\n  // Lookahead keys are 32Bit integers in the form\n  // TTTTTTTT-ZZZZZZZZZZZZ-YYYY-XXXXXXXX\n  // XXXX -> Occurrence Index bitmap.\n  // YYYY -> DSL Method Type bitmap.\n  // ZZZZZZZZZZZZZZZ -> Rule short Index bitmap.\n  // TTTTTTTTT -> alternation alternative index bitmap\n  const BITS_FOR_METHOD_TYPE = 4\n  const BITS_FOR_OCCURRENCE_IDX = 8\n  // short string used as part of mapping keys.\n  // being short improves the performance when composing KEYS for maps out of these\n  // The 5 - 8 bits (16 possible values, are reserved for the DSL method indices)\n  const OR_IDX = 1 << BITS_FOR_OCCURRENCE_IDX\n  const OPTION_IDX = 2 << BITS_FOR_OCCURRENCE_IDX\n  const MANY_IDX = 3 << BITS_FOR_OCCURRENCE_IDX\n  const AT_LEAST_ONE_IDX = 4 << BITS_FOR_OCCURRENCE_IDX\n  const MANY_SEP_IDX = 5 << BITS_FOR_OCCURRENCE_IDX\n  const AT_LEAST_ONE_SEP_IDX = 6 << BITS_FOR_OCCURRENCE_IDX\n  // this actually returns a number, but it is always used as a string (object prop key)\n  function getKeyForAutomaticLookahead(ruleIdx, dslMethodIdx, occurrence) {\n    return occurrence | dslMethodIdx | ruleIdx\n  }\n\n  class LLkLookaheadStrategy {\n    constructor(options) {\n      var _a\n      this.maxLookahead =\n        (_a = options === null || options === void 0 ? void 0 : options.maxLookahead) !== null && _a !== void 0\n          ? _a\n          : DEFAULT_PARSER_CONFIG.maxLookahead\n    }\n    validate(options) {\n      const leftRecursionErrors = this.validateNoLeftRecursion(options.rules)\n      if (isEmpty(leftRecursionErrors)) {\n        const emptyAltErrors = this.validateEmptyOrAlternatives(options.rules)\n        const ambiguousAltsErrors = this.validateAmbiguousAlternationAlternatives(options.rules, this.maxLookahead)\n        const emptyRepetitionErrors = this.validateSomeNonEmptyLookaheadPath(options.rules, this.maxLookahead)\n        const allErrors = [...leftRecursionErrors, ...emptyAltErrors, ...ambiguousAltsErrors, ...emptyRepetitionErrors]\n        return allErrors\n      }\n      return leftRecursionErrors\n    }\n    validateNoLeftRecursion(rules) {\n      return flatMap(rules, (currTopRule) =>\n        validateNoLeftRecursion(currTopRule, currTopRule, defaultGrammarValidatorErrorProvider),\n      )\n    }\n    validateEmptyOrAlternatives(rules) {\n      return flatMap(rules, (currTopRule) =>\n        validateEmptyOrAlternative(currTopRule, defaultGrammarValidatorErrorProvider),\n      )\n    }\n    validateAmbiguousAlternationAlternatives(rules, maxLookahead) {\n      return flatMap(rules, (currTopRule) =>\n        validateAmbiguousAlternationAlternatives(currTopRule, maxLookahead, defaultGrammarValidatorErrorProvider),\n      )\n    }\n    validateSomeNonEmptyLookaheadPath(rules, maxLookahead) {\n      return validateSomeNonEmptyLookaheadPath(rules, maxLookahead, defaultGrammarValidatorErrorProvider)\n    }\n    buildLookaheadForAlternation(options) {\n      return buildLookaheadFuncForOr(\n        options.prodOccurrence,\n        options.rule,\n        options.maxLookahead,\n        options.hasPredicates,\n        options.dynamicTokensEnabled,\n        buildAlternativesLookAheadFunc,\n      )\n    }\n    buildLookaheadForOptional(options) {\n      return buildLookaheadFuncForOptionalProd(\n        options.prodOccurrence,\n        options.rule,\n        options.maxLookahead,\n        options.dynamicTokensEnabled,\n        getProdType(options.prodType),\n        buildSingleAlternativeLookaheadFunction,\n      )\n    }\n  }\n\n  /**\n   * Trait responsible for the lookahead related utilities and optimizations.\n   */\n  class LooksAhead {\n    initLooksAhead(config) {\n      this.dynamicTokensEnabled = has(config, 'dynamicTokensEnabled')\n        ? config.dynamicTokensEnabled // assumes end user provides the correct config value/type\n        : DEFAULT_PARSER_CONFIG.dynamicTokensEnabled\n      this.maxLookahead = has(config, 'maxLookahead')\n        ? config.maxLookahead // assumes end user provides the correct config value/type\n        : DEFAULT_PARSER_CONFIG.maxLookahead\n      this.lookaheadStrategy = has(config, 'lookaheadStrategy')\n        ? config.lookaheadStrategy // assumes end user provides the correct config value/type\n        : new LLkLookaheadStrategy({ maxLookahead: this.maxLookahead })\n      this.lookAheadFuncsCache = new Map()\n    }\n    preComputeLookaheadFunctions(rules) {\n      forEach(rules, (currRule) => {\n        this.TRACE_INIT(`${currRule.name} Rule Lookahead`, () => {\n          const {\n            alternation,\n            repetition,\n            option,\n            repetitionMandatory,\n            repetitionMandatoryWithSeparator,\n            repetitionWithSeparator,\n          } = collectMethods(currRule)\n          forEach(alternation, (currProd) => {\n            const prodIdx = currProd.idx === 0 ? '' : currProd.idx\n            this.TRACE_INIT(`${getProductionDslName(currProd)}${prodIdx}`, () => {\n              const laFunc = this.lookaheadStrategy.buildLookaheadForAlternation({\n                prodOccurrence: currProd.idx,\n                rule: currRule,\n                maxLookahead: currProd.maxLookahead || this.maxLookahead,\n                hasPredicates: currProd.hasPredicates,\n                dynamicTokensEnabled: this.dynamicTokensEnabled,\n              })\n              const key = getKeyForAutomaticLookahead(this.fullRuleNameToShort[currRule.name], OR_IDX, currProd.idx)\n              this.setLaFuncCache(key, laFunc)\n            })\n          })\n          forEach(repetition, (currProd) => {\n            this.computeLookaheadFunc(\n              currRule,\n              currProd.idx,\n              MANY_IDX,\n              'Repetition',\n              currProd.maxLookahead,\n              getProductionDslName(currProd),\n            )\n          })\n          forEach(option, (currProd) => {\n            this.computeLookaheadFunc(\n              currRule,\n              currProd.idx,\n              OPTION_IDX,\n              'Option',\n              currProd.maxLookahead,\n              getProductionDslName(currProd),\n            )\n          })\n          forEach(repetitionMandatory, (currProd) => {\n            this.computeLookaheadFunc(\n              currRule,\n              currProd.idx,\n              AT_LEAST_ONE_IDX,\n              'RepetitionMandatory',\n              currProd.maxLookahead,\n              getProductionDslName(currProd),\n            )\n          })\n          forEach(repetitionMandatoryWithSeparator, (currProd) => {\n            this.computeLookaheadFunc(\n              currRule,\n              currProd.idx,\n              AT_LEAST_ONE_SEP_IDX,\n              'RepetitionMandatoryWithSeparator',\n              currProd.maxLookahead,\n              getProductionDslName(currProd),\n            )\n          })\n          forEach(repetitionWithSeparator, (currProd) => {\n            this.computeLookaheadFunc(\n              currRule,\n              currProd.idx,\n              MANY_SEP_IDX,\n              'RepetitionWithSeparator',\n              currProd.maxLookahead,\n              getProductionDslName(currProd),\n            )\n          })\n        })\n      })\n    }\n    computeLookaheadFunc(rule, prodOccurrence, prodKey, prodType, prodMaxLookahead, dslMethodName) {\n      this.TRACE_INIT(`${dslMethodName}${prodOccurrence === 0 ? '' : prodOccurrence}`, () => {\n        const laFunc = this.lookaheadStrategy.buildLookaheadForOptional({\n          prodOccurrence,\n          rule,\n          maxLookahead: prodMaxLookahead || this.maxLookahead,\n          dynamicTokensEnabled: this.dynamicTokensEnabled,\n          prodType,\n        })\n        const key = getKeyForAutomaticLookahead(this.fullRuleNameToShort[rule.name], prodKey, prodOccurrence)\n        this.setLaFuncCache(key, laFunc)\n      })\n    }\n    // this actually returns a number, but it is always used as a string (object prop key)\n    getKeyForAutomaticLookahead(dslMethodIdx, occurrence) {\n      const currRuleShortName = this.getLastExplicitRuleShortName()\n      return getKeyForAutomaticLookahead(currRuleShortName, dslMethodIdx, occurrence)\n    }\n    getLaFuncFromCache(key) {\n      return this.lookAheadFuncsCache.get(key)\n    }\n    /* istanbul ignore next */\n    setLaFuncCache(key, value) {\n      this.lookAheadFuncsCache.set(key, value)\n    }\n  }\n  class DslMethodsCollectorVisitor extends GAstVisitor {\n    constructor() {\n      super(...arguments)\n      this.dslMethods = {\n        option: [],\n        alternation: [],\n        repetition: [],\n        repetitionWithSeparator: [],\n        repetitionMandatory: [],\n        repetitionMandatoryWithSeparator: [],\n      }\n    }\n    reset() {\n      this.dslMethods = {\n        option: [],\n        alternation: [],\n        repetition: [],\n        repetitionWithSeparator: [],\n        repetitionMandatory: [],\n        repetitionMandatoryWithSeparator: [],\n      }\n    }\n    visitOption(option) {\n      this.dslMethods.option.push(option)\n    }\n    visitRepetitionWithSeparator(manySep) {\n      this.dslMethods.repetitionWithSeparator.push(manySep)\n    }\n    visitRepetitionMandatory(atLeastOne) {\n      this.dslMethods.repetitionMandatory.push(atLeastOne)\n    }\n    visitRepetitionMandatoryWithSeparator(atLeastOneSep) {\n      this.dslMethods.repetitionMandatoryWithSeparator.push(atLeastOneSep)\n    }\n    visitRepetition(many) {\n      this.dslMethods.repetition.push(many)\n    }\n    visitAlternation(or) {\n      this.dslMethods.alternation.push(or)\n    }\n  }\n  const collectorVisitor = new DslMethodsCollectorVisitor()\n  function collectMethods(rule) {\n    collectorVisitor.reset()\n    rule.accept(collectorVisitor)\n    const dslMethods = collectorVisitor.dslMethods\n    // avoid uncleaned references\n    collectorVisitor.reset()\n    return dslMethods\n  }\n\n  /**\n   * This nodeLocation tracking is not efficient and should only be used\n   * when error recovery is enabled or the Token Vector contains virtual Tokens\n   * (e.g, Python Indent/Outdent)\n   * As it executes the calculation for every single terminal/nonTerminal\n   * and does not rely on the fact the token vector is **sorted**\n   */\n  function setNodeLocationOnlyOffset(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n      // assumption1: Token location information is either NaN or a valid number\n      // assumption2: Token location information is fully valid if it exist\n      // (both start/end offsets exist and are numbers).\n      currNodeLocation.startOffset = newLocationInfo.startOffset\n      currNodeLocation.endOffset = newLocationInfo.endOffset\n    }\n    // Once the startOffset has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n      currNodeLocation.endOffset = newLocationInfo.endOffset\n    }\n  }\n  /**\n   * This nodeLocation tracking is not efficient and should only be used\n   * when error recovery is enabled or the Token Vector contains virtual Tokens\n   * (e.g, Python Indent/Outdent)\n   * As it executes the calculation for every single terminal/nonTerminal\n   * and does not rely on the fact the token vector is **sorted**\n   */\n  function setNodeLocationFull(currNodeLocation, newLocationInfo) {\n    // First (valid) update for this cst node\n    if (isNaN(currNodeLocation.startOffset) === true) {\n      // assumption1: Token location information is either NaN or a valid number\n      // assumption2: Token location information is fully valid if it exist\n      // (all start/end props exist and are numbers).\n      currNodeLocation.startOffset = newLocationInfo.startOffset\n      currNodeLocation.startColumn = newLocationInfo.startColumn\n      currNodeLocation.startLine = newLocationInfo.startLine\n      currNodeLocation.endOffset = newLocationInfo.endOffset\n      currNodeLocation.endColumn = newLocationInfo.endColumn\n      currNodeLocation.endLine = newLocationInfo.endLine\n    }\n    // Once the start props has been updated with a valid number it should never receive\n    // any farther updates as the Token vector is sorted.\n    // We still have to check this this condition for every new possible location info\n    // because with error recovery enabled we may encounter invalid tokens (NaN location props)\n    else if (currNodeLocation.endOffset < newLocationInfo.endOffset === true) {\n      currNodeLocation.endOffset = newLocationInfo.endOffset\n      currNodeLocation.endColumn = newLocationInfo.endColumn\n      currNodeLocation.endLine = newLocationInfo.endLine\n    }\n  }\n  function addTerminalToCst(node, token, tokenTypeName) {\n    if (node.children[tokenTypeName] === undefined) {\n      node.children[tokenTypeName] = [token]\n    } else {\n      node.children[tokenTypeName].push(token)\n    }\n  }\n  function addNoneTerminalToCst(node, ruleName, ruleResult) {\n    if (node.children[ruleName] === undefined) {\n      node.children[ruleName] = [ruleResult]\n    } else {\n      node.children[ruleName].push(ruleResult)\n    }\n  }\n\n  const NAME = 'name'\n  function defineNameProp(obj, nameValue) {\n    Object.defineProperty(obj, NAME, {\n      enumerable: false,\n      configurable: true,\n      writable: false,\n      value: nameValue,\n    })\n  }\n\n  function defaultVisit(ctx, param) {\n    const childrenNames = keys(ctx)\n    const childrenNamesLength = childrenNames.length\n    for (let i = 0; i < childrenNamesLength; i++) {\n      const currChildName = childrenNames[i]\n      const currChildArray = ctx[currChildName]\n      const currChildArrayLength = currChildArray.length\n      for (let j = 0; j < currChildArrayLength; j++) {\n        const currChild = currChildArray[j]\n        // distinction between Tokens Children and CstNode children\n        if (currChild.tokenTypeIdx === undefined) {\n          this[currChild.name](currChild.children, param)\n        }\n      }\n    }\n    // defaultVisit does not support generic out param\n  }\n  function createBaseSemanticVisitorConstructor(grammarName, ruleNames) {\n    const derivedConstructor = function () {}\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    defineNameProp(derivedConstructor, grammarName + 'BaseSemantics')\n    const semanticProto = {\n      visit: function (cstNode, param) {\n        // enables writing more concise visitor methods when CstNode has only a single child\n        if (isArray$1(cstNode)) {\n          // A CST Node's children dictionary can never have empty arrays as values\n          // If a key is defined there will be at least one element in the corresponding value array.\n          cstNode = cstNode[0]\n        }\n        // enables passing optional CstNodes concisely.\n        if (isUndefined(cstNode)) {\n          return undefined\n        }\n        return this[cstNode.name](cstNode.children, param)\n      },\n      validateVisitor: function () {\n        const semanticDefinitionErrors = validateVisitor(this, ruleNames)\n        if (!isEmpty(semanticDefinitionErrors)) {\n          const errorMessages = map(semanticDefinitionErrors, (currDefError) => currDefError.msg)\n          throw Error(\n            `Errors Detected in CST Visitor <${this.constructor.name}>:\\n\\t` +\n              `${errorMessages.join('\\n\\n').replace(/\\n/g, '\\n\\t')}`,\n          )\n        }\n      },\n    }\n    derivedConstructor.prototype = semanticProto\n    derivedConstructor.prototype.constructor = derivedConstructor\n    derivedConstructor._RULE_NAMES = ruleNames\n    return derivedConstructor\n  }\n  function createBaseVisitorConstructorWithDefaults(grammarName, ruleNames, baseConstructor) {\n    const derivedConstructor = function () {}\n    // can be overwritten according to:\n    // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/\n    // name?redirectlocale=en-US&redirectslug=JavaScript%2FReference%2FGlobal_Objects%2FFunction%2Fname\n    defineNameProp(derivedConstructor, grammarName + 'BaseSemanticsWithDefaults')\n    const withDefaultsProto = Object.create(baseConstructor.prototype)\n    forEach(ruleNames, (ruleName) => {\n      withDefaultsProto[ruleName] = defaultVisit\n    })\n    derivedConstructor.prototype = withDefaultsProto\n    derivedConstructor.prototype.constructor = derivedConstructor\n    return derivedConstructor\n  }\n  var CstVisitorDefinitionError\n  ;(function (CstVisitorDefinitionError) {\n    CstVisitorDefinitionError[(CstVisitorDefinitionError['REDUNDANT_METHOD'] = 0)] = 'REDUNDANT_METHOD'\n    CstVisitorDefinitionError[(CstVisitorDefinitionError['MISSING_METHOD'] = 1)] = 'MISSING_METHOD'\n  })(CstVisitorDefinitionError || (CstVisitorDefinitionError = {}))\n  function validateVisitor(visitorInstance, ruleNames) {\n    const missingErrors = validateMissingCstMethods(visitorInstance, ruleNames)\n    return missingErrors\n  }\n  function validateMissingCstMethods(visitorInstance, ruleNames) {\n    const missingRuleNames = filter(ruleNames, (currRuleName) => {\n      return isFunction(visitorInstance[currRuleName]) === false\n    })\n    const errors = map(missingRuleNames, (currRuleName) => {\n      return {\n        msg: `Missing visitor method: <${currRuleName}> on ${visitorInstance.constructor.name} CST Visitor.`,\n        type: CstVisitorDefinitionError.MISSING_METHOD,\n        methodName: currRuleName,\n      }\n    })\n    return compact(errors)\n  }\n\n  /**\n   * This trait is responsible for the CST building logic.\n   */\n  class TreeBuilder {\n    initTreeBuilder(config) {\n      this.CST_STACK = []\n      // outputCst is no longer exposed/defined in the pubic API\n      this.outputCst = config.outputCst\n      this.nodeLocationTracking = has(config, 'nodeLocationTracking')\n        ? config.nodeLocationTracking // assumes end user provides the correct config value/type\n        : DEFAULT_PARSER_CONFIG.nodeLocationTracking\n      if (!this.outputCst) {\n        this.cstInvocationStateUpdate = noop\n        this.cstFinallyStateUpdate = noop\n        this.cstPostTerminal = noop\n        this.cstPostNonTerminal = noop\n        this.cstPostRule = noop\n      } else {\n        if (/full/i.test(this.nodeLocationTracking)) {\n          if (this.recoveryEnabled) {\n            this.setNodeLocationFromToken = setNodeLocationFull\n            this.setNodeLocationFromNode = setNodeLocationFull\n            this.cstPostRule = noop\n            this.setInitialNodeLocation = this.setInitialNodeLocationFullRecovery\n          } else {\n            this.setNodeLocationFromToken = noop\n            this.setNodeLocationFromNode = noop\n            this.cstPostRule = this.cstPostRuleFull\n            this.setInitialNodeLocation = this.setInitialNodeLocationFullRegular\n          }\n        } else if (/onlyOffset/i.test(this.nodeLocationTracking)) {\n          if (this.recoveryEnabled) {\n            this.setNodeLocationFromToken = setNodeLocationOnlyOffset\n            this.setNodeLocationFromNode = setNodeLocationOnlyOffset\n            this.cstPostRule = noop\n            this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRecovery\n          } else {\n            this.setNodeLocationFromToken = noop\n            this.setNodeLocationFromNode = noop\n            this.cstPostRule = this.cstPostRuleOnlyOffset\n            this.setInitialNodeLocation = this.setInitialNodeLocationOnlyOffsetRegular\n          }\n        } else if (/none/i.test(this.nodeLocationTracking)) {\n          this.setNodeLocationFromToken = noop\n          this.setNodeLocationFromNode = noop\n          this.cstPostRule = noop\n          this.setInitialNodeLocation = noop\n        } else {\n          throw Error(`Invalid <nodeLocationTracking> config option: \"${config.nodeLocationTracking}\"`)\n        }\n      }\n    }\n    setInitialNodeLocationOnlyOffsetRecovery(cstNode) {\n      cstNode.location = {\n        startOffset: NaN,\n        endOffset: NaN,\n      }\n    }\n    setInitialNodeLocationOnlyOffsetRegular(cstNode) {\n      cstNode.location = {\n        // without error recovery the starting Location of a new CstNode is guaranteed\n        // To be the next Token's startOffset (for valid inputs).\n        // For invalid inputs there won't be any CSTOutput so this potential\n        // inaccuracy does not matter\n        startOffset: this.LA(1).startOffset,\n        endOffset: NaN,\n      }\n    }\n    setInitialNodeLocationFullRecovery(cstNode) {\n      cstNode.location = {\n        startOffset: NaN,\n        startLine: NaN,\n        startColumn: NaN,\n        endOffset: NaN,\n        endLine: NaN,\n        endColumn: NaN,\n      }\n    }\n    /**\n       *  @see setInitialNodeLocationOnlyOffsetRegular for explanation why this work\n  \n       * @param cstNode\n       */\n    setInitialNodeLocationFullRegular(cstNode) {\n      const nextToken = this.LA(1)\n      cstNode.location = {\n        startOffset: nextToken.startOffset,\n        startLine: nextToken.startLine,\n        startColumn: nextToken.startColumn,\n        endOffset: NaN,\n        endLine: NaN,\n        endColumn: NaN,\n      }\n    }\n    cstInvocationStateUpdate(fullRuleName) {\n      const cstNode = {\n        name: fullRuleName,\n        children: Object.create(null),\n      }\n      this.setInitialNodeLocation(cstNode)\n      this.CST_STACK.push(cstNode)\n    }\n    cstFinallyStateUpdate() {\n      this.CST_STACK.pop()\n    }\n    cstPostRuleFull(ruleCstNode) {\n      // casts to `required<CstNodeLocation>` are safe because `cstPostRuleFull` should only be invoked when full location is enabled\n      const prevToken = this.LA(0)\n      const loc = ruleCstNode.location\n      // If this condition is true it means we consumed at least one Token\n      // In this CstNode.\n      if (loc.startOffset <= prevToken.startOffset === true) {\n        loc.endOffset = prevToken.endOffset\n        loc.endLine = prevToken.endLine\n        loc.endColumn = prevToken.endColumn\n      }\n      // \"empty\" CstNode edge case\n      else {\n        loc.startOffset = NaN\n        loc.startLine = NaN\n        loc.startColumn = NaN\n      }\n    }\n    cstPostRuleOnlyOffset(ruleCstNode) {\n      const prevToken = this.LA(0)\n      // `location' is not null because `cstPostRuleOnlyOffset` will only be invoked when location tracking is enabled.\n      const loc = ruleCstNode.location\n      // If this condition is true it means we consumed at least one Token\n      // In this CstNode.\n      if (loc.startOffset <= prevToken.startOffset === true) {\n        loc.endOffset = prevToken.endOffset\n      }\n      // \"empty\" CstNode edge case\n      else {\n        loc.startOffset = NaN\n      }\n    }\n    cstPostTerminal(key, consumedToken) {\n      const rootCst = this.CST_STACK[this.CST_STACK.length - 1]\n      addTerminalToCst(rootCst, consumedToken, key)\n      // This is only used when **both** error recovery and CST Output are enabled.\n      this.setNodeLocationFromToken(rootCst.location, consumedToken)\n    }\n    cstPostNonTerminal(ruleCstResult, ruleName) {\n      const preCstNode = this.CST_STACK[this.CST_STACK.length - 1]\n      addNoneTerminalToCst(preCstNode, ruleName, ruleCstResult)\n      // This is only used when **both** error recovery and CST Output are enabled.\n      this.setNodeLocationFromNode(preCstNode.location, ruleCstResult.location)\n    }\n    getBaseCstVisitorConstructor() {\n      if (isUndefined(this.baseCstVisitorConstructor)) {\n        const newBaseCstVisitorConstructor = createBaseSemanticVisitorConstructor(\n          this.className,\n          keys(this.gastProductionsCache),\n        )\n        this.baseCstVisitorConstructor = newBaseCstVisitorConstructor\n        return newBaseCstVisitorConstructor\n      }\n      return this.baseCstVisitorConstructor\n    }\n    getBaseCstVisitorConstructorWithDefaults() {\n      if (isUndefined(this.baseCstVisitorWithDefaultsConstructor)) {\n        const newConstructor = createBaseVisitorConstructorWithDefaults(\n          this.className,\n          keys(this.gastProductionsCache),\n          this.getBaseCstVisitorConstructor(),\n        )\n        this.baseCstVisitorWithDefaultsConstructor = newConstructor\n        return newConstructor\n      }\n      return this.baseCstVisitorWithDefaultsConstructor\n    }\n    getLastExplicitRuleShortName() {\n      const ruleStack = this.RULE_STACK\n      return ruleStack[ruleStack.length - 1]\n    }\n    getPreviousExplicitRuleShortName() {\n      const ruleStack = this.RULE_STACK\n      return ruleStack[ruleStack.length - 2]\n    }\n    getLastExplicitRuleOccurrenceIndex() {\n      const occurrenceStack = this.RULE_OCCURRENCE_STACK\n      return occurrenceStack[occurrenceStack.length - 1]\n    }\n  }\n\n  /**\n   * Trait responsible abstracting over the interaction with Lexer output (Token vector).\n   *\n   * This could be generalized to support other kinds of lexers, e.g.\n   * - Just in Time Lexing / Lexer-Less parsing.\n   * - Streaming Lexer.\n   */\n  class LexerAdapter {\n    initLexerAdapter() {\n      this.tokVector = []\n      this.tokVectorLength = 0\n      this.currIdx = -1\n    }\n    set input(newInput) {\n      // @ts-ignore - `this parameter` not supported in setters/getters\n      //   - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n      if (this.selfAnalysisDone !== true) {\n        throw Error(`Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.`)\n      }\n      // @ts-ignore - `this parameter` not supported in setters/getters\n      //   - https://www.typescriptlang.org/docs/handbook/functions.html#this-parameters\n      this.reset()\n      this.tokVector = newInput\n      this.tokVectorLength = newInput.length\n    }\n    get input() {\n      return this.tokVector\n    }\n    // skips a token and returns the next token\n    SKIP_TOKEN() {\n      if (this.currIdx <= this.tokVector.length - 2) {\n        this.consumeToken()\n        return this.LA(1)\n      } else {\n        return END_OF_FILE\n      }\n    }\n    // Lexer (accessing Token vector) related methods which can be overridden to implement lazy lexers\n    // or lexers dependent on parser context.\n    LA(howMuch) {\n      const soughtIdx = this.currIdx + howMuch\n      if (soughtIdx < 0 || this.tokVectorLength <= soughtIdx) {\n        return END_OF_FILE\n      } else {\n        return this.tokVector[soughtIdx]\n      }\n    }\n    consumeToken() {\n      this.currIdx++\n    }\n    exportLexerState() {\n      return this.currIdx\n    }\n    importLexerState(newState) {\n      this.currIdx = newState\n    }\n    resetLexerState() {\n      this.currIdx = -1\n    }\n    moveToTerminatedState() {\n      this.currIdx = this.tokVector.length - 1\n    }\n    getLexerPosition() {\n      return this.exportLexerState()\n    }\n  }\n\n  /**\n   * This trait is responsible for implementing the public API\n   * for defining Chevrotain parsers, i.e:\n   * - CONSUME\n   * - RULE\n   * - OPTION\n   * - ...\n   */\n  class RecognizerApi {\n    ACTION(impl) {\n      return impl.call(this)\n    }\n    consume(idx, tokType, options) {\n      return this.consumeInternal(tokType, idx, options)\n    }\n    subrule(idx, ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, idx, options)\n    }\n    option(idx, actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, idx)\n    }\n    or(idx, altsOrOpts) {\n      return this.orInternal(altsOrOpts, idx)\n    }\n    many(idx, actionORMethodDef) {\n      return this.manyInternal(idx, actionORMethodDef)\n    }\n    atLeastOne(idx, actionORMethodDef) {\n      return this.atLeastOneInternal(idx, actionORMethodDef)\n    }\n    CONSUME(tokType, options) {\n      return this.consumeInternal(tokType, 0, options)\n    }\n    CONSUME1(tokType, options) {\n      return this.consumeInternal(tokType, 1, options)\n    }\n    CONSUME2(tokType, options) {\n      return this.consumeInternal(tokType, 2, options)\n    }\n    CONSUME3(tokType, options) {\n      return this.consumeInternal(tokType, 3, options)\n    }\n    CONSUME4(tokType, options) {\n      return this.consumeInternal(tokType, 4, options)\n    }\n    CONSUME5(tokType, options) {\n      return this.consumeInternal(tokType, 5, options)\n    }\n    CONSUME6(tokType, options) {\n      return this.consumeInternal(tokType, 6, options)\n    }\n    CONSUME7(tokType, options) {\n      return this.consumeInternal(tokType, 7, options)\n    }\n    CONSUME8(tokType, options) {\n      return this.consumeInternal(tokType, 8, options)\n    }\n    CONSUME9(tokType, options) {\n      return this.consumeInternal(tokType, 9, options)\n    }\n    SUBRULE(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 0, options)\n    }\n    SUBRULE1(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 1, options)\n    }\n    SUBRULE2(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 2, options)\n    }\n    SUBRULE3(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 3, options)\n    }\n    SUBRULE4(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 4, options)\n    }\n    SUBRULE5(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 5, options)\n    }\n    SUBRULE6(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 6, options)\n    }\n    SUBRULE7(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 7, options)\n    }\n    SUBRULE8(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 8, options)\n    }\n    SUBRULE9(ruleToCall, options) {\n      return this.subruleInternal(ruleToCall, 9, options)\n    }\n    OPTION(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 0)\n    }\n    OPTION1(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 1)\n    }\n    OPTION2(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 2)\n    }\n    OPTION3(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 3)\n    }\n    OPTION4(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 4)\n    }\n    OPTION5(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 5)\n    }\n    OPTION6(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 6)\n    }\n    OPTION7(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 7)\n    }\n    OPTION8(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 8)\n    }\n    OPTION9(actionORMethodDef) {\n      return this.optionInternal(actionORMethodDef, 9)\n    }\n    OR(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 0)\n    }\n    OR1(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 1)\n    }\n    OR2(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 2)\n    }\n    OR3(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 3)\n    }\n    OR4(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 4)\n    }\n    OR5(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 5)\n    }\n    OR6(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 6)\n    }\n    OR7(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 7)\n    }\n    OR8(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 8)\n    }\n    OR9(altsOrOpts) {\n      return this.orInternal(altsOrOpts, 9)\n    }\n    MANY(actionORMethodDef) {\n      this.manyInternal(0, actionORMethodDef)\n    }\n    MANY1(actionORMethodDef) {\n      this.manyInternal(1, actionORMethodDef)\n    }\n    MANY2(actionORMethodDef) {\n      this.manyInternal(2, actionORMethodDef)\n    }\n    MANY3(actionORMethodDef) {\n      this.manyInternal(3, actionORMethodDef)\n    }\n    MANY4(actionORMethodDef) {\n      this.manyInternal(4, actionORMethodDef)\n    }\n    MANY5(actionORMethodDef) {\n      this.manyInternal(5, actionORMethodDef)\n    }\n    MANY6(actionORMethodDef) {\n      this.manyInternal(6, actionORMethodDef)\n    }\n    MANY7(actionORMethodDef) {\n      this.manyInternal(7, actionORMethodDef)\n    }\n    MANY8(actionORMethodDef) {\n      this.manyInternal(8, actionORMethodDef)\n    }\n    MANY9(actionORMethodDef) {\n      this.manyInternal(9, actionORMethodDef)\n    }\n    MANY_SEP(options) {\n      this.manySepFirstInternal(0, options)\n    }\n    MANY_SEP1(options) {\n      this.manySepFirstInternal(1, options)\n    }\n    MANY_SEP2(options) {\n      this.manySepFirstInternal(2, options)\n    }\n    MANY_SEP3(options) {\n      this.manySepFirstInternal(3, options)\n    }\n    MANY_SEP4(options) {\n      this.manySepFirstInternal(4, options)\n    }\n    MANY_SEP5(options) {\n      this.manySepFirstInternal(5, options)\n    }\n    MANY_SEP6(options) {\n      this.manySepFirstInternal(6, options)\n    }\n    MANY_SEP7(options) {\n      this.manySepFirstInternal(7, options)\n    }\n    MANY_SEP8(options) {\n      this.manySepFirstInternal(8, options)\n    }\n    MANY_SEP9(options) {\n      this.manySepFirstInternal(9, options)\n    }\n    AT_LEAST_ONE(actionORMethodDef) {\n      this.atLeastOneInternal(0, actionORMethodDef)\n    }\n    AT_LEAST_ONE1(actionORMethodDef) {\n      return this.atLeastOneInternal(1, actionORMethodDef)\n    }\n    AT_LEAST_ONE2(actionORMethodDef) {\n      this.atLeastOneInternal(2, actionORMethodDef)\n    }\n    AT_LEAST_ONE3(actionORMethodDef) {\n      this.atLeastOneInternal(3, actionORMethodDef)\n    }\n    AT_LEAST_ONE4(actionORMethodDef) {\n      this.atLeastOneInternal(4, actionORMethodDef)\n    }\n    AT_LEAST_ONE5(actionORMethodDef) {\n      this.atLeastOneInternal(5, actionORMethodDef)\n    }\n    AT_LEAST_ONE6(actionORMethodDef) {\n      this.atLeastOneInternal(6, actionORMethodDef)\n    }\n    AT_LEAST_ONE7(actionORMethodDef) {\n      this.atLeastOneInternal(7, actionORMethodDef)\n    }\n    AT_LEAST_ONE8(actionORMethodDef) {\n      this.atLeastOneInternal(8, actionORMethodDef)\n    }\n    AT_LEAST_ONE9(actionORMethodDef) {\n      this.atLeastOneInternal(9, actionORMethodDef)\n    }\n    AT_LEAST_ONE_SEP(options) {\n      this.atLeastOneSepFirstInternal(0, options)\n    }\n    AT_LEAST_ONE_SEP1(options) {\n      this.atLeastOneSepFirstInternal(1, options)\n    }\n    AT_LEAST_ONE_SEP2(options) {\n      this.atLeastOneSepFirstInternal(2, options)\n    }\n    AT_LEAST_ONE_SEP3(options) {\n      this.atLeastOneSepFirstInternal(3, options)\n    }\n    AT_LEAST_ONE_SEP4(options) {\n      this.atLeastOneSepFirstInternal(4, options)\n    }\n    AT_LEAST_ONE_SEP5(options) {\n      this.atLeastOneSepFirstInternal(5, options)\n    }\n    AT_LEAST_ONE_SEP6(options) {\n      this.atLeastOneSepFirstInternal(6, options)\n    }\n    AT_LEAST_ONE_SEP7(options) {\n      this.atLeastOneSepFirstInternal(7, options)\n    }\n    AT_LEAST_ONE_SEP8(options) {\n      this.atLeastOneSepFirstInternal(8, options)\n    }\n    AT_LEAST_ONE_SEP9(options) {\n      this.atLeastOneSepFirstInternal(9, options)\n    }\n    RULE(name, implementation, config = DEFAULT_RULE_CONFIG) {\n      if (includes(this.definedRulesNames, name)) {\n        const errMsg = defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({\n          topLevelRule: name,\n          grammarName: this.className,\n        })\n        const error = {\n          message: errMsg,\n          type: ParserDefinitionErrorType.DUPLICATE_RULE_NAME,\n          ruleName: name,\n        }\n        this.definitionErrors.push(error)\n      }\n      this.definedRulesNames.push(name)\n      const ruleImplementation = this.defineRule(name, implementation, config)\n      this[name] = ruleImplementation\n      return ruleImplementation\n    }\n    OVERRIDE_RULE(name, impl, config = DEFAULT_RULE_CONFIG) {\n      const ruleErrors = validateRuleIsOverridden(name, this.definedRulesNames, this.className)\n      this.definitionErrors = this.definitionErrors.concat(ruleErrors)\n      const ruleImplementation = this.defineRule(name, impl, config)\n      this[name] = ruleImplementation\n      return ruleImplementation\n    }\n    BACKTRACK(grammarRule, args) {\n      return function () {\n        // save org state\n        this.isBackTrackingStack.push(1)\n        const orgState = this.saveRecogState()\n        try {\n          grammarRule.apply(this, args)\n          // if no exception was thrown we have succeed parsing the rule.\n          return true\n        } catch (e) {\n          if (isRecognitionException(e)) {\n            return false\n          } else {\n            throw e\n          }\n        } finally {\n          this.reloadRecogState(orgState)\n          this.isBackTrackingStack.pop()\n        }\n      }\n    }\n    // GAST export APIs\n    getGAstProductions() {\n      return this.gastProductionsCache\n    }\n    getSerializedGastProductions() {\n      return serializeGrammar(values(this.gastProductionsCache))\n    }\n  }\n\n  /**\n   * This trait is responsible for the runtime parsing engine\n   * Used by the official API (recognizer_api.ts)\n   */\n  class RecognizerEngine {\n    initRecognizerEngine(tokenVocabulary, config) {\n      this.className = this.constructor.name\n      // TODO: would using an ES6 Map or plain object be faster (CST building scenario)\n      this.shortRuleNameToFull = {}\n      this.fullRuleNameToShort = {}\n      this.ruleShortNameIdx = 256\n      this.tokenMatcher = tokenStructuredMatcherNoCategories\n      this.subruleIdx = 0\n      this.definedRulesNames = []\n      this.tokensMap = {}\n      this.isBackTrackingStack = []\n      this.RULE_STACK = []\n      this.RULE_OCCURRENCE_STACK = []\n      this.gastProductionsCache = {}\n      if (has(config, 'serializedGrammar')) {\n        throw Error(\n          \"The Parser's configuration can no longer contain a <serializedGrammar> property.\\n\" +\n            '\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\\n' +\n            '\\tFor Further details.',\n        )\n      }\n      if (isArray$1(tokenVocabulary)) {\n        // This only checks for Token vocabularies provided as arrays.\n        // That is good enough because the main objective is to detect users of pre-V4.0 APIs\n        // rather than all edge cases of empty Token vocabularies.\n        if (isEmpty(tokenVocabulary)) {\n          throw Error(\n            'A Token Vocabulary cannot be empty.\\n' +\n              '\\tNote that the first argument for the parser constructor\\n' +\n              '\\tis no longer a Token vector (since v4.0).',\n          )\n        }\n        if (typeof tokenVocabulary[0].startOffset === 'number') {\n          throw Error(\n            'The Parser constructor no longer accepts a token vector as the first argument.\\n' +\n              '\\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\\n' +\n              '\\tFor Further details.',\n          )\n        }\n      }\n      if (isArray$1(tokenVocabulary)) {\n        this.tokensMap = reduce(\n          tokenVocabulary,\n          (acc, tokType) => {\n            acc[tokType.name] = tokType\n            return acc\n          },\n          {},\n        )\n      } else if (has(tokenVocabulary, 'modes') && every(flatten(values(tokenVocabulary.modes)), isTokenType)) {\n        const allTokenTypes = flatten(values(tokenVocabulary.modes))\n        const uniqueTokens = uniq(allTokenTypes)\n        this.tokensMap = reduce(\n          uniqueTokens,\n          (acc, tokType) => {\n            acc[tokType.name] = tokType\n            return acc\n          },\n          {},\n        )\n      } else if (isObject(tokenVocabulary)) {\n        this.tokensMap = clone(tokenVocabulary)\n      } else {\n        throw new Error(\n          '<tokensDictionary> argument must be An Array of Token constructors,' +\n            ' A dictionary of Token constructors or an IMultiModeLexerDefinition',\n        )\n      }\n      // always add EOF to the tokenNames -> constructors map. it is useful to assure all the input has been\n      // parsed with a clear error message (\"expecting EOF but found ...\")\n      this.tokensMap['EOF'] = EOF\n      const allTokenTypes = has(tokenVocabulary, 'modes')\n        ? flatten(values(tokenVocabulary.modes))\n        : values(tokenVocabulary)\n      const noTokenCategoriesUsed = every(allTokenTypes, (tokenConstructor) =>\n        isEmpty(tokenConstructor.categoryMatches),\n      )\n      this.tokenMatcher = noTokenCategoriesUsed ? tokenStructuredMatcherNoCategories : tokenStructuredMatcher\n      // Because ES2015+ syntax should be supported for creating Token classes\n      // We cannot assume that the Token classes were created using the \"extendToken\" utilities\n      // Therefore we must augment the Token classes both on Lexer initialization and on Parser initialization\n      augmentTokenTypes(values(this.tokensMap))\n    }\n    defineRule(ruleName, impl, config) {\n      if (this.selfAnalysisDone) {\n        throw Error(\n          `Grammar rule <${ruleName}> may not be defined after the 'performSelfAnalysis' method has been called'\\n` +\n            `Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`,\n        )\n      }\n      const resyncEnabled = has(config, 'resyncEnabled')\n        ? config.resyncEnabled // assumes end user provides the correct config value/type\n        : DEFAULT_RULE_CONFIG.resyncEnabled\n      const recoveryValueFunc = has(config, 'recoveryValueFunc')\n        ? config.recoveryValueFunc // assumes end user provides the correct config value/type\n        : DEFAULT_RULE_CONFIG.recoveryValueFunc\n      // performance optimization: Use small integers as keys for the longer human readable \"full\" rule names.\n      // this greatly improves Map access time (as much as 8% for some performance benchmarks).\n      const shortName = this.ruleShortNameIdx << (BITS_FOR_METHOD_TYPE + BITS_FOR_OCCURRENCE_IDX)\n      this.ruleShortNameIdx++\n      this.shortRuleNameToFull[shortName] = ruleName\n      this.fullRuleNameToShort[ruleName] = shortName\n      let invokeRuleWithTry\n      // Micro optimization, only check the condition **once** on rule definition\n      // instead of **every single** rule invocation.\n      if (this.outputCst === true) {\n        invokeRuleWithTry = function invokeRuleWithTry(...args) {\n          try {\n            this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx)\n            impl.apply(this, args)\n            const cst = this.CST_STACK[this.CST_STACK.length - 1]\n            this.cstPostRule(cst)\n            return cst\n          } catch (e) {\n            return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc)\n          } finally {\n            this.ruleFinallyStateUpdate()\n          }\n        }\n      } else {\n        invokeRuleWithTry = function invokeRuleWithTryCst(...args) {\n          try {\n            this.ruleInvocationStateUpdate(shortName, ruleName, this.subruleIdx)\n            return impl.apply(this, args)\n          } catch (e) {\n            return this.invokeRuleCatch(e, resyncEnabled, recoveryValueFunc)\n          } finally {\n            this.ruleFinallyStateUpdate()\n          }\n        }\n      }\n      const wrappedGrammarRule = Object.assign(invokeRuleWithTry, { ruleName, originalGrammarAction: impl })\n      return wrappedGrammarRule\n    }\n    invokeRuleCatch(e, resyncEnabledConfig, recoveryValueFunc) {\n      const isFirstInvokedRule = this.RULE_STACK.length === 1\n      // note the reSync is always enabled for the first rule invocation, because we must always be able to\n      // reSync with EOF and just output some INVALID ParseTree\n      // during backtracking reSync recovery is disabled, otherwise we can't be certain the backtracking\n      // path is really the most valid one\n      const reSyncEnabled = resyncEnabledConfig && !this.isBackTracking() && this.recoveryEnabled\n      if (isRecognitionException(e)) {\n        const recogError = e\n        if (reSyncEnabled) {\n          const reSyncTokType = this.findReSyncTokenType()\n          if (this.isInCurrentRuleReSyncSet(reSyncTokType)) {\n            recogError.resyncedTokens = this.reSyncTo(reSyncTokType)\n            if (this.outputCst) {\n              const partialCstResult = this.CST_STACK[this.CST_STACK.length - 1]\n              partialCstResult.recoveredNode = true\n              return partialCstResult\n            } else {\n              return recoveryValueFunc(e)\n            }\n          } else {\n            if (this.outputCst) {\n              const partialCstResult = this.CST_STACK[this.CST_STACK.length - 1]\n              partialCstResult.recoveredNode = true\n              recogError.partialCstResult = partialCstResult\n            }\n            // to be handled Further up the call stack\n            throw recogError\n          }\n        } else if (isFirstInvokedRule) {\n          // otherwise a Redundant input error will be created as well and we cannot guarantee that this is indeed the case\n          this.moveToTerminatedState()\n          // the parser should never throw one of its own errors outside its flow.\n          // even if error recovery is disabled\n          return recoveryValueFunc(e)\n        } else {\n          // to be recovered Further up the call stack\n          throw recogError\n        }\n      } else {\n        // some other Error type which we don't know how to handle (for example a built in JavaScript Error)\n        throw e\n      }\n    }\n    // Implementation of parsing DSL\n    optionInternal(actionORMethodDef, occurrence) {\n      const key = this.getKeyForAutomaticLookahead(OPTION_IDX, occurrence)\n      return this.optionInternalLogic(actionORMethodDef, occurrence, key)\n    }\n    optionInternalLogic(actionORMethodDef, occurrence, key) {\n      let lookAheadFunc = this.getLaFuncFromCache(key)\n      let action\n      if (typeof actionORMethodDef !== 'function') {\n        action = actionORMethodDef.DEF\n        const predicate = actionORMethodDef.GATE\n        // predicate present\n        if (predicate !== undefined) {\n          const orgLookaheadFunction = lookAheadFunc\n          lookAheadFunc = () => {\n            return predicate.call(this) && orgLookaheadFunction.call(this)\n          }\n        }\n      } else {\n        action = actionORMethodDef\n      }\n      if (lookAheadFunc.call(this) === true) {\n        return action.call(this)\n      }\n      return undefined\n    }\n    atLeastOneInternal(prodOccurrence, actionORMethodDef) {\n      const laKey = this.getKeyForAutomaticLookahead(AT_LEAST_ONE_IDX, prodOccurrence)\n      return this.atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, laKey)\n    }\n    atLeastOneInternalLogic(prodOccurrence, actionORMethodDef, key) {\n      let lookAheadFunc = this.getLaFuncFromCache(key)\n      let action\n      if (typeof actionORMethodDef !== 'function') {\n        action = actionORMethodDef.DEF\n        const predicate = actionORMethodDef.GATE\n        // predicate present\n        if (predicate !== undefined) {\n          const orgLookaheadFunction = lookAheadFunc\n          lookAheadFunc = () => {\n            return predicate.call(this) && orgLookaheadFunction.call(this)\n          }\n        }\n      } else {\n        action = actionORMethodDef\n      }\n      if (lookAheadFunc.call(this) === true) {\n        let notStuck = this.doSingleRepetition(action)\n        while (lookAheadFunc.call(this) === true && notStuck === true) {\n          notStuck = this.doSingleRepetition(action)\n        }\n      } else {\n        throw this.raiseEarlyExitException(prodOccurrence, PROD_TYPE.REPETITION_MANDATORY, actionORMethodDef.ERR_MSG)\n      }\n      // note that while it may seem that this can cause an error because by using a recursive call to\n      // AT_LEAST_ONE we change the grammar to AT_LEAST_TWO, AT_LEAST_THREE ... , the possible recursive call\n      // from the tryInRepetitionRecovery(...) will only happen IFF there really are TWO/THREE/.... items.\n      // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n      this.attemptInRepetitionRecovery(\n        this.atLeastOneInternal,\n        [prodOccurrence, actionORMethodDef],\n        lookAheadFunc,\n        AT_LEAST_ONE_IDX,\n        prodOccurrence,\n        NextTerminalAfterAtLeastOneWalker,\n      )\n    }\n    atLeastOneSepFirstInternal(prodOccurrence, options) {\n      const laKey = this.getKeyForAutomaticLookahead(AT_LEAST_ONE_SEP_IDX, prodOccurrence)\n      this.atLeastOneSepFirstInternalLogic(prodOccurrence, options, laKey)\n    }\n    atLeastOneSepFirstInternalLogic(prodOccurrence, options, key) {\n      const action = options.DEF\n      const separator = options.SEP\n      const firstIterationLookaheadFunc = this.getLaFuncFromCache(key)\n      // 1st iteration\n      if (firstIterationLookaheadFunc.call(this) === true) {\n        action.call(this)\n        //  TODO: Optimization can move this function construction into \"attemptInRepetitionRecovery\"\n        //  because it is only needed in error recovery scenarios.\n        const separatorLookAheadFunc = () => {\n          return this.tokenMatcher(this.LA(1), separator)\n        }\n        // 2nd..nth iterations\n        while (this.tokenMatcher(this.LA(1), separator) === true) {\n          // note that this CONSUME will never enter recovery because\n          // the separatorLookAheadFunc checks that the separator really does exist.\n          this.CONSUME(separator)\n          // No need for checking infinite loop here due to consuming the separator.\n          action.call(this)\n        }\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(\n          this.repetitionSepSecondInternal,\n          [prodOccurrence, separator, separatorLookAheadFunc, action, NextTerminalAfterAtLeastOneSepWalker],\n          separatorLookAheadFunc,\n          AT_LEAST_ONE_SEP_IDX,\n          prodOccurrence,\n          NextTerminalAfterAtLeastOneSepWalker,\n        )\n      } else {\n        throw this.raiseEarlyExitException(\n          prodOccurrence,\n          PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,\n          options.ERR_MSG,\n        )\n      }\n    }\n    manyInternal(prodOccurrence, actionORMethodDef) {\n      const laKey = this.getKeyForAutomaticLookahead(MANY_IDX, prodOccurrence)\n      return this.manyInternalLogic(prodOccurrence, actionORMethodDef, laKey)\n    }\n    manyInternalLogic(prodOccurrence, actionORMethodDef, key) {\n      let lookaheadFunction = this.getLaFuncFromCache(key)\n      let action\n      if (typeof actionORMethodDef !== 'function') {\n        action = actionORMethodDef.DEF\n        const predicate = actionORMethodDef.GATE\n        // predicate present\n        if (predicate !== undefined) {\n          const orgLookaheadFunction = lookaheadFunction\n          lookaheadFunction = () => {\n            return predicate.call(this) && orgLookaheadFunction.call(this)\n          }\n        }\n      } else {\n        action = actionORMethodDef\n      }\n      let notStuck = true\n      while (lookaheadFunction.call(this) === true && notStuck === true) {\n        notStuck = this.doSingleRepetition(action)\n      }\n      // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n      this.attemptInRepetitionRecovery(\n        this.manyInternal,\n        [prodOccurrence, actionORMethodDef],\n        lookaheadFunction,\n        MANY_IDX,\n        prodOccurrence,\n        NextTerminalAfterManyWalker,\n        // The notStuck parameter is only relevant when \"attemptInRepetitionRecovery\"\n        // is invoked from manyInternal, in the MANY_SEP case and AT_LEAST_ONE[_SEP]\n        // An infinite loop cannot occur as:\n        // - Either the lookahead is guaranteed to consume something (Single Token Separator)\n        // - AT_LEAST_ONE by definition is guaranteed to consume something (or error out).\n        notStuck,\n      )\n    }\n    manySepFirstInternal(prodOccurrence, options) {\n      const laKey = this.getKeyForAutomaticLookahead(MANY_SEP_IDX, prodOccurrence)\n      this.manySepFirstInternalLogic(prodOccurrence, options, laKey)\n    }\n    manySepFirstInternalLogic(prodOccurrence, options, key) {\n      const action = options.DEF\n      const separator = options.SEP\n      const firstIterationLaFunc = this.getLaFuncFromCache(key)\n      // 1st iteration\n      if (firstIterationLaFunc.call(this) === true) {\n        action.call(this)\n        const separatorLookAheadFunc = () => {\n          return this.tokenMatcher(this.LA(1), separator)\n        }\n        // 2nd..nth iterations\n        while (this.tokenMatcher(this.LA(1), separator) === true) {\n          // note that this CONSUME will never enter recovery because\n          // the separatorLookAheadFunc checks that the separator really does exist.\n          this.CONSUME(separator)\n          // No need for checking infinite loop here due to consuming the separator.\n          action.call(this)\n        }\n        // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n        this.attemptInRepetitionRecovery(\n          this.repetitionSepSecondInternal,\n          [prodOccurrence, separator, separatorLookAheadFunc, action, NextTerminalAfterManySepWalker],\n          separatorLookAheadFunc,\n          MANY_SEP_IDX,\n          prodOccurrence,\n          NextTerminalAfterManySepWalker,\n        )\n      }\n    }\n    repetitionSepSecondInternal(prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker) {\n      while (separatorLookAheadFunc()) {\n        // note that this CONSUME will never enter recovery because\n        // the separatorLookAheadFunc checks that the separator really does exist.\n        this.CONSUME(separator)\n        action.call(this)\n      }\n      // we can only arrive to this function after an error\n      // has occurred (hence the name 'second') so the following\n      // IF will always be entered, its possible to remove it...\n      // however it is kept to avoid confusion and be consistent.\n      // Performance optimization: \"attemptInRepetitionRecovery\" will be defined as NOOP unless recovery is enabled\n      /* istanbul ignore else */\n      this.attemptInRepetitionRecovery(\n        this.repetitionSepSecondInternal,\n        [prodOccurrence, separator, separatorLookAheadFunc, action, nextTerminalAfterWalker],\n        separatorLookAheadFunc,\n        AT_LEAST_ONE_SEP_IDX,\n        prodOccurrence,\n        nextTerminalAfterWalker,\n      )\n    }\n    doSingleRepetition(action) {\n      const beforeIteration = this.getLexerPosition()\n      action.call(this)\n      const afterIteration = this.getLexerPosition()\n      // This boolean will indicate if this repetition progressed\n      // or if we are \"stuck\" (potential infinite loop in the repetition).\n      return afterIteration > beforeIteration\n    }\n    orInternal(altsOrOpts, occurrence) {\n      const laKey = this.getKeyForAutomaticLookahead(OR_IDX, occurrence)\n      const alts = isArray$1(altsOrOpts) ? altsOrOpts : altsOrOpts.DEF\n      const laFunc = this.getLaFuncFromCache(laKey)\n      const altIdxToTake = laFunc.call(this, alts)\n      if (altIdxToTake !== undefined) {\n        const chosenAlternative = alts[altIdxToTake]\n        return chosenAlternative.ALT.call(this)\n      }\n      this.raiseNoAltException(occurrence, altsOrOpts.ERR_MSG)\n    }\n    ruleFinallyStateUpdate() {\n      this.RULE_STACK.pop()\n      this.RULE_OCCURRENCE_STACK.pop()\n      // NOOP when cst is disabled\n      this.cstFinallyStateUpdate()\n      if (this.RULE_STACK.length === 0 && this.isAtEndOfInput() === false) {\n        const firstRedundantTok = this.LA(1)\n        const errMsg = this.errorMessageProvider.buildNotAllInputParsedMessage({\n          firstRedundant: firstRedundantTok,\n          ruleName: this.getCurrRuleFullName(),\n        })\n        this.SAVE_ERROR(new NotAllInputParsedException(errMsg, firstRedundantTok))\n      }\n    }\n    subruleInternal(ruleToCall, idx, options) {\n      let ruleResult\n      try {\n        const args = options !== undefined ? options.ARGS : undefined\n        this.subruleIdx = idx\n        ruleResult = ruleToCall.apply(this, args)\n        this.cstPostNonTerminal(\n          ruleResult,\n          options !== undefined && options.LABEL !== undefined ? options.LABEL : ruleToCall.ruleName,\n        )\n        return ruleResult\n      } catch (e) {\n        throw this.subruleInternalError(e, options, ruleToCall.ruleName)\n      }\n    }\n    subruleInternalError(e, options, ruleName) {\n      if (isRecognitionException(e) && e.partialCstResult !== undefined) {\n        this.cstPostNonTerminal(\n          e.partialCstResult,\n          options !== undefined && options.LABEL !== undefined ? options.LABEL : ruleName,\n        )\n        delete e.partialCstResult\n      }\n      throw e\n    }\n    consumeInternal(tokType, idx, options) {\n      let consumedToken\n      try {\n        const nextToken = this.LA(1)\n        if (this.tokenMatcher(nextToken, tokType) === true) {\n          this.consumeToken()\n          consumedToken = nextToken\n        } else {\n          this.consumeInternalError(tokType, nextToken, options)\n        }\n      } catch (eFromConsumption) {\n        consumedToken = this.consumeInternalRecovery(tokType, idx, eFromConsumption)\n      }\n      this.cstPostTerminal(\n        options !== undefined && options.LABEL !== undefined ? options.LABEL : tokType.name,\n        consumedToken,\n      )\n      return consumedToken\n    }\n    consumeInternalError(tokType, nextToken, options) {\n      let msg\n      const previousToken = this.LA(0)\n      if (options !== undefined && options.ERR_MSG) {\n        msg = options.ERR_MSG\n      } else {\n        msg = this.errorMessageProvider.buildMismatchTokenMessage({\n          expected: tokType,\n          actual: nextToken,\n          previous: previousToken,\n          ruleName: this.getCurrRuleFullName(),\n        })\n      }\n      throw this.SAVE_ERROR(new MismatchedTokenException(msg, nextToken, previousToken))\n    }\n    consumeInternalRecovery(tokType, idx, eFromConsumption) {\n      // no recovery allowed during backtracking, otherwise backtracking may recover invalid syntax and accept it\n      // but the original syntax could have been parsed successfully without any backtracking + recovery\n      if (\n        this.recoveryEnabled &&\n        // TODO: more robust checking of the exception type. Perhaps Typescript extending expressions?\n        eFromConsumption.name === 'MismatchedTokenException' &&\n        !this.isBackTracking()\n      ) {\n        const follows = this.getFollowsForInRuleRecovery(tokType, idx)\n        try {\n          return this.tryInRuleRecovery(tokType, follows)\n        } catch (eFromInRuleRecovery) {\n          if (eFromInRuleRecovery.name === IN_RULE_RECOVERY_EXCEPTION) {\n            // failed in RuleRecovery.\n            // throw the original error in order to trigger reSync error recovery\n            throw eFromConsumption\n          } else {\n            throw eFromInRuleRecovery\n          }\n        }\n      } else {\n        throw eFromConsumption\n      }\n    }\n    saveRecogState() {\n      // errors is a getter which will clone the errors array\n      const savedErrors = this.errors\n      const savedRuleStack = clone(this.RULE_STACK)\n      return {\n        errors: savedErrors,\n        lexerState: this.exportLexerState(),\n        RULE_STACK: savedRuleStack,\n        CST_STACK: this.CST_STACK,\n      }\n    }\n    reloadRecogState(newState) {\n      this.errors = newState.errors\n      this.importLexerState(newState.lexerState)\n      this.RULE_STACK = newState.RULE_STACK\n    }\n    ruleInvocationStateUpdate(shortName, fullName, idxInCallingRule) {\n      this.RULE_OCCURRENCE_STACK.push(idxInCallingRule)\n      this.RULE_STACK.push(shortName)\n      // NOOP when cst is disabled\n      this.cstInvocationStateUpdate(fullName)\n    }\n    isBackTracking() {\n      return this.isBackTrackingStack.length !== 0\n    }\n    getCurrRuleFullName() {\n      const shortName = this.getLastExplicitRuleShortName()\n      return this.shortRuleNameToFull[shortName]\n    }\n    shortRuleNameToFullName(shortName) {\n      return this.shortRuleNameToFull[shortName]\n    }\n    isAtEndOfInput() {\n      return this.tokenMatcher(this.LA(1), EOF)\n    }\n    reset() {\n      this.resetLexerState()\n      this.subruleIdx = 0\n      this.isBackTrackingStack = []\n      this.errors = []\n      this.RULE_STACK = []\n      // TODO: extract a specific reset for TreeBuilder trait\n      this.CST_STACK = []\n      this.RULE_OCCURRENCE_STACK = []\n    }\n  }\n\n  /**\n   * Trait responsible for runtime parsing errors.\n   */\n  class ErrorHandler {\n    initErrorHandler(config) {\n      this._errors = []\n      this.errorMessageProvider = has(config, 'errorMessageProvider')\n        ? config.errorMessageProvider // assumes end user provides the correct config value/type\n        : DEFAULT_PARSER_CONFIG.errorMessageProvider\n    }\n    SAVE_ERROR(error) {\n      if (isRecognitionException(error)) {\n        error.context = {\n          ruleStack: this.getHumanReadableRuleStack(),\n          ruleOccurrenceStack: clone(this.RULE_OCCURRENCE_STACK),\n        }\n        this._errors.push(error)\n        return error\n      } else {\n        throw Error('Trying to save an Error which is not a RecognitionException')\n      }\n    }\n    get errors() {\n      return clone(this._errors)\n    }\n    set errors(newErrors) {\n      this._errors = newErrors\n    }\n    // TODO: consider caching the error message computed information\n    raiseEarlyExitException(occurrence, prodType, userDefinedErrMsg) {\n      const ruleName = this.getCurrRuleFullName()\n      const ruleGrammar = this.getGAstProductions()[ruleName]\n      const lookAheadPathsPerAlternative = getLookaheadPathsForOptionalProd(\n        occurrence,\n        ruleGrammar,\n        prodType,\n        this.maxLookahead,\n      )\n      const insideProdPaths = lookAheadPathsPerAlternative[0]\n      const actualTokens = []\n      for (let i = 1; i <= this.maxLookahead; i++) {\n        actualTokens.push(this.LA(i))\n      }\n      const msg = this.errorMessageProvider.buildEarlyExitMessage({\n        expectedIterationPaths: insideProdPaths,\n        actual: actualTokens,\n        previous: this.LA(0),\n        customUserDescription: userDefinedErrMsg,\n        ruleName: ruleName,\n      })\n      throw this.SAVE_ERROR(new EarlyExitException(msg, this.LA(1), this.LA(0)))\n    }\n    // TODO: consider caching the error message computed information\n    raiseNoAltException(occurrence, errMsgTypes) {\n      const ruleName = this.getCurrRuleFullName()\n      const ruleGrammar = this.getGAstProductions()[ruleName]\n      // TODO: getLookaheadPathsForOr can be slow for large enough maxLookahead and certain grammars, consider caching ?\n      const lookAheadPathsPerAlternative = getLookaheadPathsForOr(occurrence, ruleGrammar, this.maxLookahead)\n      const actualTokens = []\n      for (let i = 1; i <= this.maxLookahead; i++) {\n        actualTokens.push(this.LA(i))\n      }\n      const previousToken = this.LA(0)\n      const errMsg = this.errorMessageProvider.buildNoViableAltMessage({\n        expectedPathsPerAlt: lookAheadPathsPerAlternative,\n        actual: actualTokens,\n        previous: previousToken,\n        customUserDescription: errMsgTypes,\n        ruleName: this.getCurrRuleFullName(),\n      })\n      throw this.SAVE_ERROR(new NoViableAltException(errMsg, this.LA(1), previousToken))\n    }\n  }\n\n  class ContentAssist {\n    initContentAssist() {}\n    computeContentAssist(startRuleName, precedingInput) {\n      const startRuleGast = this.gastProductionsCache[startRuleName]\n      if (isUndefined(startRuleGast)) {\n        throw Error(`Rule ->${startRuleName}<- does not exist in this grammar.`)\n      }\n      return nextPossibleTokensAfter([startRuleGast], precedingInput, this.tokenMatcher, this.maxLookahead)\n    }\n    // TODO: should this be a member method or a utility? it does not have any state or usage of 'this'...\n    // TODO: should this be more explicitly part of the public API?\n    getNextPossibleTokenTypes(grammarPath) {\n      const topRuleName = head(grammarPath.ruleStack)\n      const gastProductions = this.getGAstProductions()\n      const topProduction = gastProductions[topRuleName]\n      const nextPossibleTokenTypes = new NextAfterTokenWalker(topProduction, grammarPath).startWalking()\n      return nextPossibleTokenTypes\n    }\n  }\n\n  const RECORDING_NULL_OBJECT = {\n    description: 'This Object indicates the Parser is during Recording Phase',\n  }\n  Object.freeze(RECORDING_NULL_OBJECT)\n  const HANDLE_SEPARATOR = true\n  const MAX_METHOD_IDX = Math.pow(2, BITS_FOR_OCCURRENCE_IDX) - 1\n  const RFT = createToken({ name: 'RECORDING_PHASE_TOKEN', pattern: Lexer.NA })\n  augmentTokenTypes([RFT])\n  const RECORDING_PHASE_TOKEN = createTokenInstance(\n    RFT,\n    'This IToken indicates the Parser is in Recording Phase\\n\\t' +\n      '' +\n      'See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details',\n    // Using \"-1\" instead of NaN (as in EOF) because an actual number is less likely to\n    // cause errors if the output of LA or CONSUME would be (incorrectly) used during the recording phase.\n    -1,\n    -1,\n    -1,\n    -1,\n    -1,\n    -1,\n  )\n  Object.freeze(RECORDING_PHASE_TOKEN)\n  const RECORDING_PHASE_CSTNODE = {\n    name:\n      'This CSTNode indicates the Parser is in Recording Phase\\n\\t' +\n      'See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details',\n    children: {},\n  }\n  /**\n   * This trait handles the creation of the GAST structure for Chevrotain Grammars\n   */\n  class GastRecorder {\n    initGastRecorder(config) {\n      this.recordingProdStack = []\n      this.RECORDING_PHASE = false\n    }\n    enableRecording() {\n      this.RECORDING_PHASE = true\n      this.TRACE_INIT('Enable Recording', () => {\n        /**\n         * Warning Dark Voodoo Magic upcoming!\n         * We are \"replacing\" the public parsing DSL methods API\n         * With **new** alternative implementations on the Parser **instance**\n         *\n         * So far this is the only way I've found to avoid performance regressions during parsing time.\n         * - Approx 30% performance regression was measured on Chrome 75 Canary when attempting to replace the \"internal\"\n         *   implementations directly instead.\n         */\n        for (let i = 0; i < 10; i++) {\n          const idx = i > 0 ? i : ''\n          this[`CONSUME${idx}`] = function (arg1, arg2) {\n            return this.consumeInternalRecord(arg1, i, arg2)\n          }\n          this[`SUBRULE${idx}`] = function (arg1, arg2) {\n            return this.subruleInternalRecord(arg1, i, arg2)\n          }\n          this[`OPTION${idx}`] = function (arg1) {\n            return this.optionInternalRecord(arg1, i)\n          }\n          this[`OR${idx}`] = function (arg1) {\n            return this.orInternalRecord(arg1, i)\n          }\n          this[`MANY${idx}`] = function (arg1) {\n            this.manyInternalRecord(i, arg1)\n          }\n          this[`MANY_SEP${idx}`] = function (arg1) {\n            this.manySepFirstInternalRecord(i, arg1)\n          }\n          this[`AT_LEAST_ONE${idx}`] = function (arg1) {\n            this.atLeastOneInternalRecord(i, arg1)\n          }\n          this[`AT_LEAST_ONE_SEP${idx}`] = function (arg1) {\n            this.atLeastOneSepFirstInternalRecord(i, arg1)\n          }\n        }\n        // DSL methods with the idx(suffix) as an argument\n        this[`consume`] = function (idx, arg1, arg2) {\n          return this.consumeInternalRecord(arg1, idx, arg2)\n        }\n        this[`subrule`] = function (idx, arg1, arg2) {\n          return this.subruleInternalRecord(arg1, idx, arg2)\n        }\n        this[`option`] = function (idx, arg1) {\n          return this.optionInternalRecord(arg1, idx)\n        }\n        this[`or`] = function (idx, arg1) {\n          return this.orInternalRecord(arg1, idx)\n        }\n        this[`many`] = function (idx, arg1) {\n          this.manyInternalRecord(idx, arg1)\n        }\n        this[`atLeastOne`] = function (idx, arg1) {\n          this.atLeastOneInternalRecord(idx, arg1)\n        }\n        this.ACTION = this.ACTION_RECORD\n        this.BACKTRACK = this.BACKTRACK_RECORD\n        this.LA = this.LA_RECORD\n      })\n    }\n    disableRecording() {\n      this.RECORDING_PHASE = false\n      // By deleting these **instance** properties, any future invocation\n      // will be deferred to the original methods on the **prototype** object\n      // This seems to get rid of any incorrect optimizations that V8 may\n      // do during the recording phase.\n      this.TRACE_INIT('Deleting Recording methods', () => {\n        const that = this\n        for (let i = 0; i < 10; i++) {\n          const idx = i > 0 ? i : ''\n          delete that[`CONSUME${idx}`]\n          delete that[`SUBRULE${idx}`]\n          delete that[`OPTION${idx}`]\n          delete that[`OR${idx}`]\n          delete that[`MANY${idx}`]\n          delete that[`MANY_SEP${idx}`]\n          delete that[`AT_LEAST_ONE${idx}`]\n          delete that[`AT_LEAST_ONE_SEP${idx}`]\n        }\n        delete that[`consume`]\n        delete that[`subrule`]\n        delete that[`option`]\n        delete that[`or`]\n        delete that[`many`]\n        delete that[`atLeastOne`]\n        delete that.ACTION\n        delete that.BACKTRACK\n        delete that.LA\n      })\n    }\n    //   Parser methods are called inside an ACTION?\n    //   Maybe try/catch/finally on ACTIONS while disabling the recorders state changes?\n    // @ts-expect-error -- noop place holder\n    ACTION_RECORD(impl) {\n      // NO-OP during recording\n    }\n    // Executing backtracking logic will break our recording logic assumptions\n    BACKTRACK_RECORD(grammarRule, args) {\n      return () => true\n    }\n    // LA is part of the official API and may be used for custom lookahead logic\n    // by end users who may forget to wrap it in ACTION or inside a GATE\n    LA_RECORD(howMuch) {\n      // We cannot use the RECORD_PHASE_TOKEN here because someone may depend\n      // On LA return EOF at the end of the input so an infinite loop may occur.\n      return END_OF_FILE\n    }\n    topLevelRuleRecord(name, def) {\n      try {\n        const newTopLevelRule = new Rule({ definition: [], name: name })\n        newTopLevelRule.name = name\n        this.recordingProdStack.push(newTopLevelRule)\n        def.call(this)\n        this.recordingProdStack.pop()\n        return newTopLevelRule\n      } catch (originalError) {\n        if (originalError.KNOWN_RECORDER_ERROR !== true) {\n          try {\n            originalError.message =\n              originalError.message +\n              '\\n\\t This error was thrown during the \"grammar recording phase\" For more info see:\\n\\t' +\n              'https://chevrotain.io/docs/guide/internals.html#grammar-recording'\n          } catch (mutabilityError) {\n            // We may not be able to modify the original error object\n            throw originalError\n          }\n        }\n        throw originalError\n      }\n    }\n    // Implementation of parsing DSL\n    optionInternalRecord(actionORMethodDef, occurrence) {\n      return recordProd.call(this, Option, actionORMethodDef, occurrence)\n    }\n    atLeastOneInternalRecord(occurrence, actionORMethodDef) {\n      recordProd.call(this, RepetitionMandatory, actionORMethodDef, occurrence)\n    }\n    atLeastOneSepFirstInternalRecord(occurrence, options) {\n      recordProd.call(this, RepetitionMandatoryWithSeparator, options, occurrence, HANDLE_SEPARATOR)\n    }\n    manyInternalRecord(occurrence, actionORMethodDef) {\n      recordProd.call(this, Repetition, actionORMethodDef, occurrence)\n    }\n    manySepFirstInternalRecord(occurrence, options) {\n      recordProd.call(this, RepetitionWithSeparator, options, occurrence, HANDLE_SEPARATOR)\n    }\n    orInternalRecord(altsOrOpts, occurrence) {\n      return recordOrProd.call(this, altsOrOpts, occurrence)\n    }\n    subruleInternalRecord(ruleToCall, occurrence, options) {\n      assertMethodIdxIsValid(occurrence)\n      if (!ruleToCall || has(ruleToCall, 'ruleName') === false) {\n        const error = new Error(\n          `<SUBRULE${getIdxSuffix(occurrence)}> argument is invalid` +\n            ` expecting a Parser method reference but got: <${JSON.stringify(ruleToCall)}>` +\n            `\\n inside top level rule: <${this.recordingProdStack[0].name}>`,\n        )\n        error.KNOWN_RECORDER_ERROR = true\n        throw error\n      }\n      const prevProd = last(this.recordingProdStack)\n      const ruleName = ruleToCall.ruleName\n      const newNoneTerminal = new NonTerminal({\n        idx: occurrence,\n        nonTerminalName: ruleName,\n        label: options === null || options === void 0 ? void 0 : options.LABEL,\n        // The resolving of the `referencedRule` property will be done once all the Rule's GASTs have been created\n        referencedRule: undefined,\n      })\n      prevProd.definition.push(newNoneTerminal)\n      return this.outputCst ? RECORDING_PHASE_CSTNODE : RECORDING_NULL_OBJECT\n    }\n    consumeInternalRecord(tokType, occurrence, options) {\n      assertMethodIdxIsValid(occurrence)\n      if (!hasShortKeyProperty(tokType)) {\n        const error = new Error(\n          `<CONSUME${getIdxSuffix(occurrence)}> argument is invalid` +\n            ` expecting a TokenType reference but got: <${JSON.stringify(tokType)}>` +\n            `\\n inside top level rule: <${this.recordingProdStack[0].name}>`,\n        )\n        error.KNOWN_RECORDER_ERROR = true\n        throw error\n      }\n      const prevProd = last(this.recordingProdStack)\n      const newNoneTerminal = new Terminal({\n        idx: occurrence,\n        terminalType: tokType,\n        label: options === null || options === void 0 ? void 0 : options.LABEL,\n      })\n      prevProd.definition.push(newNoneTerminal)\n      return RECORDING_PHASE_TOKEN\n    }\n  }\n  function recordProd(prodConstructor, mainProdArg, occurrence, handleSep = false) {\n    assertMethodIdxIsValid(occurrence)\n    const prevProd = last(this.recordingProdStack)\n    const grammarAction = isFunction(mainProdArg) ? mainProdArg : mainProdArg.DEF\n    const newProd = new prodConstructor({ definition: [], idx: occurrence })\n    if (handleSep) {\n      newProd.separator = mainProdArg.SEP\n    }\n    if (has(mainProdArg, 'MAX_LOOKAHEAD')) {\n      newProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD\n    }\n    this.recordingProdStack.push(newProd)\n    grammarAction.call(this)\n    prevProd.definition.push(newProd)\n    this.recordingProdStack.pop()\n    return RECORDING_NULL_OBJECT\n  }\n  function recordOrProd(mainProdArg, occurrence) {\n    assertMethodIdxIsValid(occurrence)\n    const prevProd = last(this.recordingProdStack)\n    // Only an array of alternatives\n    const hasOptions = isArray$1(mainProdArg) === false\n    const alts = hasOptions === false ? mainProdArg : mainProdArg.DEF\n    const newOrProd = new Alternation({\n      definition: [],\n      idx: occurrence,\n      ignoreAmbiguities: hasOptions && mainProdArg.IGNORE_AMBIGUITIES === true,\n    })\n    if (has(mainProdArg, 'MAX_LOOKAHEAD')) {\n      newOrProd.maxLookahead = mainProdArg.MAX_LOOKAHEAD\n    }\n    const hasPredicates = some(alts, (currAlt) => isFunction(currAlt.GATE))\n    newOrProd.hasPredicates = hasPredicates\n    prevProd.definition.push(newOrProd)\n    forEach(alts, (currAlt) => {\n      const currAltFlat = new Alternative({ definition: [] })\n      newOrProd.definition.push(currAltFlat)\n      if (has(currAlt, 'IGNORE_AMBIGUITIES')) {\n        currAltFlat.ignoreAmbiguities = currAlt.IGNORE_AMBIGUITIES // assumes end user provides the correct config value/type\n      }\n      // **implicit** ignoreAmbiguities due to usage of gate\n      else if (has(currAlt, 'GATE')) {\n        currAltFlat.ignoreAmbiguities = true\n      }\n      this.recordingProdStack.push(currAltFlat)\n      currAlt.ALT.call(this)\n      this.recordingProdStack.pop()\n    })\n    return RECORDING_NULL_OBJECT\n  }\n  function getIdxSuffix(idx) {\n    return idx === 0 ? '' : `${idx}`\n  }\n  function assertMethodIdxIsValid(idx) {\n    if (idx < 0 || idx > MAX_METHOD_IDX) {\n      const error = new Error(\n        // The stack trace will contain all the needed details\n        `Invalid DSL Method idx value: <${idx}>\\n\\t` +\n          `Idx value must be a none negative value smaller than ${MAX_METHOD_IDX + 1}`,\n      )\n      error.KNOWN_RECORDER_ERROR = true\n      throw error\n    }\n  }\n\n  /**\n   * Trait responsible for runtime parsing errors.\n   */\n  class PerformanceTracer {\n    initPerformanceTracer(config) {\n      if (has(config, 'traceInitPerf')) {\n        const userTraceInitPerf = config.traceInitPerf\n        const traceIsNumber = typeof userTraceInitPerf === 'number'\n        this.traceInitMaxIdent = traceIsNumber ? userTraceInitPerf : Infinity\n        this.traceInitPerf = traceIsNumber ? userTraceInitPerf > 0 : userTraceInitPerf // assumes end user provides the correct config value/type\n      } else {\n        this.traceInitMaxIdent = 0\n        this.traceInitPerf = DEFAULT_PARSER_CONFIG.traceInitPerf\n      }\n      this.traceInitIndent = -1\n    }\n    TRACE_INIT(phaseDesc, phaseImpl) {\n      // No need to optimize this using NOOP pattern because\n      // It is not called in a hot spot...\n      if (this.traceInitPerf === true) {\n        this.traceInitIndent++\n        const indent = new Array(this.traceInitIndent + 1).join('\\t')\n        if (this.traceInitIndent < this.traceInitMaxIdent) {\n          console.log(`${indent}--> <${phaseDesc}>`)\n        }\n        const { time, value } = timer(phaseImpl)\n        /* istanbul ignore next - Difficult to reproduce specific performance behavior (>10ms) in tests */\n        const traceMethod = time > 10 ? console.warn : console.log\n        if (this.traceInitIndent < this.traceInitMaxIdent) {\n          traceMethod(`${indent}<-- <${phaseDesc}> time: ${time}ms`)\n        }\n        this.traceInitIndent--\n        return value\n      } else {\n        return phaseImpl()\n      }\n    }\n  }\n\n  function applyMixins(derivedCtor, baseCtors) {\n    baseCtors.forEach((baseCtor) => {\n      const baseProto = baseCtor.prototype\n      Object.getOwnPropertyNames(baseProto).forEach((propName) => {\n        if (propName === 'constructor') {\n          return\n        }\n        const basePropDescriptor = Object.getOwnPropertyDescriptor(baseProto, propName)\n        // Handle Accessors\n        if (basePropDescriptor && (basePropDescriptor.get || basePropDescriptor.set)) {\n          Object.defineProperty(derivedCtor.prototype, propName, basePropDescriptor)\n        } else {\n          derivedCtor.prototype[propName] = baseCtor.prototype[propName]\n        }\n      })\n    })\n  }\n\n  const END_OF_FILE = createTokenInstance(EOF, '', NaN, NaN, NaN, NaN, NaN, NaN)\n  Object.freeze(END_OF_FILE)\n  const DEFAULT_PARSER_CONFIG = Object.freeze({\n    recoveryEnabled: false,\n    maxLookahead: 3,\n    dynamicTokensEnabled: false,\n    outputCst: true,\n    errorMessageProvider: defaultParserErrorProvider,\n    nodeLocationTracking: 'none',\n    traceInitPerf: false,\n    skipValidations: false,\n  })\n  const DEFAULT_RULE_CONFIG = Object.freeze({\n    recoveryValueFunc: () => undefined,\n    resyncEnabled: true,\n  })\n  var ParserDefinitionErrorType\n  ;(function (ParserDefinitionErrorType) {\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['INVALID_RULE_NAME'] = 0)] = 'INVALID_RULE_NAME'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['DUPLICATE_RULE_NAME'] = 1)] = 'DUPLICATE_RULE_NAME'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['INVALID_RULE_OVERRIDE'] = 2)] = 'INVALID_RULE_OVERRIDE'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['DUPLICATE_PRODUCTIONS'] = 3)] = 'DUPLICATE_PRODUCTIONS'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['UNRESOLVED_SUBRULE_REF'] = 4)] = 'UNRESOLVED_SUBRULE_REF'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['LEFT_RECURSION'] = 5)] = 'LEFT_RECURSION'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['NONE_LAST_EMPTY_ALT'] = 6)] = 'NONE_LAST_EMPTY_ALT'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['AMBIGUOUS_ALTS'] = 7)] = 'AMBIGUOUS_ALTS'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['CONFLICT_TOKENS_RULES_NAMESPACE'] = 8)] =\n      'CONFLICT_TOKENS_RULES_NAMESPACE'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['INVALID_TOKEN_NAME'] = 9)] = 'INVALID_TOKEN_NAME'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['NO_NON_EMPTY_LOOKAHEAD'] = 10)] = 'NO_NON_EMPTY_LOOKAHEAD'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['AMBIGUOUS_PREFIX_ALTS'] = 11)] = 'AMBIGUOUS_PREFIX_ALTS'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['TOO_MANY_ALTS'] = 12)] = 'TOO_MANY_ALTS'\n    ParserDefinitionErrorType[(ParserDefinitionErrorType['CUSTOM_LOOKAHEAD_VALIDATION'] = 13)] =\n      'CUSTOM_LOOKAHEAD_VALIDATION'\n  })(ParserDefinitionErrorType || (ParserDefinitionErrorType = {}))\n  class Parser {\n    /**\n     *  @deprecated use the **instance** method with the same name instead\n     */\n    static performSelfAnalysis(parserInstance) {\n      throw Error(\n        'The **static** `performSelfAnalysis` method has been deprecated.' +\n          '\\t\\nUse the **instance** method with the same name instead.',\n      )\n    }\n    performSelfAnalysis() {\n      this.TRACE_INIT('performSelfAnalysis', () => {\n        let defErrorsMsgs\n        this.selfAnalysisDone = true\n        const className = this.className\n        this.TRACE_INIT('toFastProps', () => {\n          // Without this voodoo magic the parser would be x3-x4 slower\n          // It seems it is better to invoke `toFastProperties` **before**\n          // Any manipulations of the `this` object done during the recording phase.\n          toFastProperties(this)\n        })\n        this.TRACE_INIT('Grammar Recording', () => {\n          try {\n            this.enableRecording()\n            // Building the GAST\n            forEach(this.definedRulesNames, (currRuleName) => {\n              const wrappedRule = this[currRuleName]\n              const originalGrammarAction = wrappedRule['originalGrammarAction']\n              let recordedRuleGast\n              this.TRACE_INIT(`${currRuleName} Rule`, () => {\n                recordedRuleGast = this.topLevelRuleRecord(currRuleName, originalGrammarAction)\n              })\n              this.gastProductionsCache[currRuleName] = recordedRuleGast\n            })\n          } finally {\n            this.disableRecording()\n          }\n        })\n        let resolverErrors = []\n        this.TRACE_INIT('Grammar Resolving', () => {\n          resolverErrors = resolveGrammar({\n            rules: values(this.gastProductionsCache),\n          })\n          this.definitionErrors = this.definitionErrors.concat(resolverErrors)\n        })\n        this.TRACE_INIT('Grammar Validations', () => {\n          // only perform additional grammar validations IFF no resolving errors have occurred.\n          // as unresolved grammar may lead to unhandled runtime exceptions in the follow up validations.\n          if (isEmpty(resolverErrors) && this.skipValidations === false) {\n            const validationErrors = validateGrammar({\n              rules: values(this.gastProductionsCache),\n              tokenTypes: values(this.tokensMap),\n              errMsgProvider: defaultGrammarValidatorErrorProvider,\n              grammarName: className,\n            })\n            const lookaheadValidationErrors = validateLookahead({\n              lookaheadStrategy: this.lookaheadStrategy,\n              rules: values(this.gastProductionsCache),\n              tokenTypes: values(this.tokensMap),\n              grammarName: className,\n            })\n            this.definitionErrors = this.definitionErrors.concat(validationErrors, lookaheadValidationErrors)\n          }\n        })\n        // this analysis may fail if the grammar is not perfectly valid\n        if (isEmpty(this.definitionErrors)) {\n          // The results of these computations are not needed unless error recovery is enabled.\n          if (this.recoveryEnabled) {\n            this.TRACE_INIT('computeAllProdsFollows', () => {\n              const allFollows = computeAllProdsFollows(values(this.gastProductionsCache))\n              this.resyncFollows = allFollows\n            })\n          }\n          this.TRACE_INIT('ComputeLookaheadFunctions', () => {\n            var _a, _b\n            ;(_b = (_a = this.lookaheadStrategy).initialize) === null || _b === void 0\n              ? void 0\n              : _b.call(_a, {\n                  rules: values(this.gastProductionsCache),\n                })\n            this.preComputeLookaheadFunctions(values(this.gastProductionsCache))\n          })\n        }\n        if (!Parser.DEFER_DEFINITION_ERRORS_HANDLING && !isEmpty(this.definitionErrors)) {\n          defErrorsMsgs = map(this.definitionErrors, (defError) => defError.message)\n          throw new Error(\n            `Parser Definition Errors detected:\\n ${defErrorsMsgs.join('\\n-------------------------------\\n')}`,\n          )\n        }\n      })\n    }\n    constructor(tokenVocabulary, config) {\n      this.definitionErrors = []\n      this.selfAnalysisDone = false\n      const that = this\n      that.initErrorHandler(config)\n      that.initLexerAdapter()\n      that.initLooksAhead(config)\n      that.initRecognizerEngine(tokenVocabulary, config)\n      that.initRecoverable(config)\n      that.initTreeBuilder(config)\n      that.initContentAssist()\n      that.initGastRecorder(config)\n      that.initPerformanceTracer(config)\n      if (has(config, 'ignoredIssues')) {\n        throw new Error(\n          'The <ignoredIssues> IParserConfig property has been deprecated.\\n\\t' +\n            'Please use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\\n\\t' +\n            'See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\\n\\t' +\n            'For further details.',\n        )\n      }\n      this.skipValidations = has(config, 'skipValidations')\n        ? config.skipValidations // casting assumes the end user passing the correct type\n        : DEFAULT_PARSER_CONFIG.skipValidations\n    }\n  }\n  // Set this flag to true if you don't want the Parser to throw error when problems in it's definition are detected.\n  // (normally during the parser's constructor).\n  // This is a design time flag, it will not affect the runtime error handling of the parser, just design time errors,\n  // for example: duplicate rule names, referencing an unresolved subrule, ect...\n  // This flag should not be enabled during normal usage, it is used in special situations, for example when\n  // needing to display the parser definition errors in some GUI(online playground).\n  Parser.DEFER_DEFINITION_ERRORS_HANDLING = false\n  applyMixins(Parser, [\n    Recoverable,\n    LooksAhead,\n    TreeBuilder,\n    LexerAdapter,\n    RecognizerEngine,\n    RecognizerApi,\n    ErrorHandler,\n    ContentAssist,\n    GastRecorder,\n    PerformanceTracer,\n  ])\n  class CstParser extends Parser {\n    constructor(tokenVocabulary, config = DEFAULT_PARSER_CONFIG) {\n      const configClone = clone(config)\n      configClone.outputCst = true\n      super(tokenVocabulary, configClone)\n    }\n  }\n\n  return { CstParser, Lexer, createToken }\n})()\n\nexport { CstParser, Lexer, createToken }\n"],"names":["map","values","key","othValue","collection","includes","Lexer","LexerDefinitionErrorType","msg","currConfig","createToken","getExtraProductionArgument","PROD_TYPE","tokenMatcher","keys","prefixKeys","collectorVisitor","CstVisitorDefinitionError","allTokenTypes","invokeRuleWithTry","ParserDefinitionErrorType","CstParser"],"mappings":"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"}